=============================================================================== a0014b6c <_CORE_message_queue_Broadcast>: { Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { a0014b6c: e590304c ldr r3, [r0, #76] ; 0x4c Objects_Id id __attribute__((unused)), CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)), #endif uint32_t *count ) { a0014b70: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr} Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { a0014b74: e1520003 cmp r2, r3 Objects_Id id __attribute__((unused)), CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)), #endif uint32_t *count ) { a0014b78: e1a06000 mov r6, r0 a0014b7c: e1a0a001 mov sl, r1 a0014b80: e1a07002 mov r7, r2 a0014b84: e59d8020 ldr r8, [sp, #32] Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { a0014b88: 8a000013 bhi a0014bdc <_CORE_message_queue_Broadcast+0x70> * NOTE: This check is critical because threads can block on * send and receive and this ensures that we are broadcasting * the message to threads waiting to receive -- not to send. */ if ( the_message_queue->number_of_pending_messages != 0 ) { a0014b8c: e5905048 ldr r5, [r0, #72] ; 0x48 a0014b90: e3550000 cmp r5, #0 a0014b94: 0a000009 beq a0014bc0 <_CORE_message_queue_Broadcast+0x54> *count = 0; a0014b98: e3a00000 mov r0, #0 a0014b9c: e5880000 str r0, [r8] return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; a0014ba0: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} const void *source, void *destination, size_t size ) { memcpy(destination, source, size); a0014ba4: e594002c ldr r0, [r4, #44] ; 0x2c a0014ba8: e1a0100a mov r1, sl a0014bac: e1a02007 mov r2, r7 a0014bb0: eb00224a bl a001d4e0 buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; a0014bb4: e5943028 ldr r3, [r4, #40] ; 0x28 */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { waitp = &the_thread->Wait; number_broadcasted += 1; a0014bb8: e2855001 add r5, r5, #1 buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; a0014bbc: e5837000 str r7, [r3] /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = a0014bc0: e1a00006 mov r0, r6 a0014bc4: eb000a9e bl a0017644 <_Thread_queue_Dequeue> a0014bc8: e2504000 subs r4, r0, #0 a0014bcc: 1afffff4 bne a0014ba4 <_CORE_message_queue_Broadcast+0x38> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_message_queue_mp_support) ( the_thread, id ); #endif } *count = number_broadcasted; a0014bd0: e5885000 str r5, [r8] return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; a0014bd4: e1a00004 mov r0, r4 a0014bd8: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE; a0014bdc: e3a00001 mov r0, #1 <== NOT EXECUTED #endif } *count = number_broadcasted; return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; } a0014be0: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED =============================================================================== a000dc38 <_CORE_message_queue_Initialize>: CORE_message_queue_Control *the_message_queue, CORE_message_queue_Attributes *the_message_queue_attributes, uint32_t maximum_pending_messages, size_t maximum_message_size ) { a000dc38: e92d40f0 push {r4, r5, r6, r7, lr} /* * Round size up to multiple of a pointer for chain init and * check for overflow on adding overhead to each message. */ allocated_message_size = maximum_message_size; if (allocated_message_size & (sizeof(uint32_t) - 1)) { a000dc3c: e3130003 tst r3, #3 CORE_message_queue_Control *the_message_queue, CORE_message_queue_Attributes *the_message_queue_attributes, uint32_t maximum_pending_messages, size_t maximum_message_size ) { a000dc40: e1a04000 mov r4, r0 size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; the_message_queue->number_of_pending_messages = 0; a000dc44: e3a00000 mov r0, #0 CORE_message_queue_Control *the_message_queue, CORE_message_queue_Attributes *the_message_queue_attributes, uint32_t maximum_pending_messages, size_t maximum_message_size ) { a000dc48: e1a06002 mov r6, r2 size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; a000dc4c: e5842044 str r2, [r4, #68] ; 0x44 CORE_message_queue_Control *the_message_queue, CORE_message_queue_Attributes *the_message_queue_attributes, uint32_t maximum_pending_messages, size_t maximum_message_size ) { a000dc50: e1a05001 mov r5, r1 size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; the_message_queue->number_of_pending_messages = 0; a000dc54: e5840048 str r0, [r4, #72] ; 0x48 the_message_queue->maximum_message_size = maximum_message_size; a000dc58: e584304c str r3, [r4, #76] ; 0x4c CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; a000dc5c: e5840060 str r0, [r4, #96] ; 0x60 the_message_queue->notify_argument = the_argument; a000dc60: e5840064 str r0, [r4, #100] ; 0x64 /* * Round size up to multiple of a pointer for chain init and * check for overflow on adding overhead to each message. */ allocated_message_size = maximum_message_size; if (allocated_message_size & (sizeof(uint32_t) - 1)) { a000dc64: 01a02003 moveq r2, r3 a000dc68: 0a000003 beq a000dc7c <_CORE_message_queue_Initialize+0x44> allocated_message_size += sizeof(uint32_t); a000dc6c: e2832004 add r2, r3, #4 allocated_message_size &= ~(sizeof(uint32_t) - 1); a000dc70: e3c22003 bic r2, r2, #3 } if (allocated_message_size < maximum_message_size) a000dc74: e1520003 cmp r2, r3 a000dc78: 3a00001e bcc a000dcf8 <_CORE_message_queue_Initialize+0xc0> /* * Calculate how much total memory is required for message buffering and * check for overflow on the multiplication. */ message_buffering_required = (size_t) maximum_pending_messages * (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); a000dc7c: e2827014 add r7, r2, #20 /* * Calculate how much total memory is required for message buffering and * check for overflow on the multiplication. */ message_buffering_required = (size_t) maximum_pending_messages * a000dc80: e0000796 mul r0, r6, r7 (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) a000dc84: e1500002 cmp r0, r2 a000dc88: 3a000018 bcc a000dcf0 <_CORE_message_queue_Initialize+0xb8> /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) _Workspace_Allocate( message_buffering_required ); a000dc8c: eb000b53 bl a00109e0 <_Workspace_Allocate> if (the_message_queue->message_buffers == 0) a000dc90: e3500000 cmp r0, #0 /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) _Workspace_Allocate( message_buffering_required ); a000dc94: e1a01000 mov r1, r0 return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) a000dc98: e584005c str r0, [r4, #92] ; 0x5c _Workspace_Allocate( message_buffering_required ); if (the_message_queue->message_buffers == 0) a000dc9c: 0a000015 beq a000dcf8 <_CORE_message_queue_Initialize+0xc0> /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( a000dca0: e2840068 add r0, r4, #104 ; 0x68 a000dca4: e1a02006 mov r2, r6 a000dca8: e1a03007 mov r3, r7 a000dcac: eb0014ce bl a0012fec <_Chain_Initialize> RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); a000dcb0: e2843054 add r3, r4, #84 ; 0x54 head->next = tail; a000dcb4: e5843050 str r3, [r4, #80] ; 0x50 head->previous = NULL; a000dcb8: e3a03000 mov r3, #0 a000dcbc: e5843054 str r3, [r4, #84] ; 0x54 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); a000dcc0: e2843050 add r3, r4, #80 ; 0x50 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; tail->previous = head; a000dcc4: e5843058 str r3, [r4, #88] ; 0x58 allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( a000dcc8: e5951000 ldr r1, [r5] a000dccc: e1a00004 mov r0, r4 a000dcd0: e3a02080 mov r2, #128 ; 0x80 a000dcd4: e3510001 cmp r1, #1 a000dcd8: 13a01000 movne r1, #0 a000dcdc: 03a01001 moveq r1, #1 a000dce0: e3a03006 mov r3, #6 a000dce4: eb0008c9 bl a0010010 <_Thread_queue_Initialize> THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; a000dce8: e3a00001 mov r0, #1 a000dcec: e8bd80f0 pop {r4, r5, r6, r7, pc} */ message_buffering_required = (size_t) maximum_pending_messages * (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) return false; a000dcf0: e3a00000 mov r0, #0 <== NOT EXECUTED a000dcf4: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; } a000dcf8: e8bd80f0 pop {r4, r5, r6, r7, pc} =============================================================================== a0006c90 <_Heap_Walk>: bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { a0006c90: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; a0006c94: e5903014 ldr r3, [r0, #20] bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { a0006c98: e24dd030 sub sp, sp, #48 ; 0x30 uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; a0006c9c: e59f44c8 ldr r4, [pc, #1224] ; a000716c <_Heap_Walk+0x4dc> int source, bool dump ) { uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; a0006ca0: e58d3024 str r3, [sp, #36] ; 0x24 Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; a0006ca4: e5903024 ldr r3, [r0, #36] ; 0x24 Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; a0006ca8: e31200ff tst r2, #255 ; 0xff bool dump ) { uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const first_block = heap->first_block; a0006cac: e590c020 ldr ip, [r0, #32] Heap_Block *const last_block = heap->last_block; a0006cb0: e58d3028 str r3, [sp, #40] ; 0x28 Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; a0006cb4: e59f34b4 ldr r3, [pc, #1204] ; a0007170 <_Heap_Walk+0x4e0> bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { a0006cb8: e1a06000 mov r6, r0 a0006cbc: e1a05001 mov r5, r1 uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; a0006cc0: 11a04003 movne r4, r3 if ( !_System_state_Is_up( _System_state_Get() ) ) { a0006cc4: e59f34a8 ldr r3, [pc, #1192] ; a0007174 <_Heap_Walk+0x4e4> Heap_Control *heap, int source, bool dump ) { uintptr_t const page_size = heap->page_size; a0006cc8: e5909010 ldr r9, [r0, #16] uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const first_block = heap->first_block; a0006ccc: e58dc020 str ip, [sp, #32] Heap_Block *const last_block = heap->last_block; Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; if ( !_System_state_Is_up( _System_state_Get() ) ) { a0006cd0: e5933000 ldr r3, [r3] a0006cd4: e3530003 cmp r3, #3 a0006cd8: 1a000118 bne a0007140 <_Heap_Walk+0x4b0> Heap_Block *const first_free_block = _Heap_Free_list_first( heap ); Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; (*printer)( a0006cdc: e59dc024 ldr ip, [sp, #36] ; 0x24 a0006ce0: e59d2020 ldr r2, [sp, #32] a0006ce4: e58dc000 str ip, [sp] a0006ce8: e5903018 ldr r3, [r0, #24] a0006cec: e58d3004 str r3, [sp, #4] a0006cf0: e590301c ldr r3, [r0, #28] a0006cf4: e58d200c str r2, [sp, #12] a0006cf8: e59f2478 ldr r2, [pc, #1144] ; a0007178 <_Heap_Walk+0x4e8> a0006cfc: e58d3008 str r3, [sp, #8] a0006d00: e59d3028 ldr r3, [sp, #40] ; 0x28 a0006d04: e58d3010 str r3, [sp, #16] a0006d08: e5903008 ldr r3, [r0, #8] a0006d0c: e58d3014 str r3, [sp, #20] a0006d10: e590300c ldr r3, [r0, #12] a0006d14: e1a00001 mov r0, r1 a0006d18: e3a01000 mov r1, #0 a0006d1c: e58d3018 str r3, [sp, #24] a0006d20: e1a03009 mov r3, r9 a0006d24: e12fff34 blx r4 heap->area_begin, heap->area_end, first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { a0006d28: e3590000 cmp r9, #0 a0006d2c: 1a000005 bne a0006d48 <_Heap_Walk+0xb8> (*printer)( source, true, "page size is zero\n" ); a0006d30: e1a00005 mov r0, r5 a0006d34: e3a01001 mov r1, #1 a0006d38: e59f243c ldr r2, [pc, #1084] ; a000717c <_Heap_Walk+0x4ec> a0006d3c: e12fff34 blx r4 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; a0006d40: e1a08009 mov r8, r9 a0006d44: ea0000fe b a0007144 <_Heap_Walk+0x4b4> (*printer)( source, true, "page size is zero\n" ); return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { a0006d48: e2198007 ands r8, r9, #7 (*printer)( a0006d4c: 11a00005 movne r0, r5 a0006d50: 13a01001 movne r1, #1 a0006d54: 159f2424 ldrne r2, [pc, #1060] ; a0007180 <_Heap_Walk+0x4f0> a0006d58: 11a03009 movne r3, r9 a0006d5c: 1a0000ff bne a0007160 <_Heap_Walk+0x4d0> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; a0006d60: e59d0024 ldr r0, [sp, #36] ; 0x24 a0006d64: e1a01009 mov r1, r9 a0006d68: ebffe741 bl a0000a74 <__umodsi3> ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { a0006d6c: e250b000 subs fp, r0, #0 a0006d70: 0a000005 beq a0006d8c <_Heap_Walk+0xfc> (*printer)( a0006d74: e1a00005 mov r0, r5 a0006d78: e3a01001 mov r1, #1 a0006d7c: e59f2400 ldr r2, [pc, #1024] ; a0007184 <_Heap_Walk+0x4f4> a0006d80: e59d3024 ldr r3, [sp, #36] ; 0x24 a0006d84: e12fff34 blx r4 a0006d88: ea0000ed b a0007144 <_Heap_Walk+0x4b4> a0006d8c: e59dc020 ldr ip, [sp, #32] a0006d90: e1a01009 mov r1, r9 a0006d94: e28c0008 add r0, ip, #8 a0006d98: ebffe735 bl a0000a74 <__umodsi3> ); return false; } if ( a0006d9c: e250a000 subs sl, r0, #0 !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( a0006da0: 11a00005 movne r0, r5 a0006da4: 13a01001 movne r1, #1 a0006da8: 159f23d8 ldrne r2, [pc, #984] ; a0007188 <_Heap_Walk+0x4f8> a0006dac: 159d3020 ldrne r3, [sp, #32] a0006db0: 1a0000c3 bne a00070c4 <_Heap_Walk+0x434> block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; a0006db4: e59d2020 ldr r2, [sp, #32] a0006db8: e5928004 ldr r8, [r2, #4] ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { a0006dbc: e2188001 ands r8, r8, #1 (*printer)( a0006dc0: 01a00005 moveq r0, r5 a0006dc4: 03a01001 moveq r1, #1 a0006dc8: 059f23bc ldreq r2, [pc, #956] ; a000718c <_Heap_Walk+0x4fc> a0006dcc: 0a000009 beq a0006df8 <_Heap_Walk+0x168> - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; a0006dd0: e59d3028 ldr r3, [sp, #40] ; 0x28 a0006dd4: e5937004 ldr r7, [r3, #4] a0006dd8: e3c77001 bic r7, r7, #1 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); a0006ddc: e0837007 add r7, r3, r7 block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; a0006de0: e5978004 ldr r8, [r7, #4] ); return false; } if ( _Heap_Is_free( last_block ) ) { a0006de4: e2188001 ands r8, r8, #1 a0006de8: 1a000004 bne a0006e00 <_Heap_Walk+0x170> (*printer)( a0006dec: e59f239c ldr r2, [pc, #924] ; a0007190 <_Heap_Walk+0x500> a0006df0: e1a00005 mov r0, r5 a0006df4: e3a01001 mov r1, #1 a0006df8: e12fff34 blx r4 a0006dfc: ea0000d0 b a0007144 <_Heap_Walk+0x4b4> ); return false; } if ( a0006e00: e59dc020 ldr ip, [sp, #32] a0006e04: e157000c cmp r7, ip a0006e08: 0a000005 beq a0006e24 <_Heap_Walk+0x194> _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block ) { (*printer)( a0006e0c: e1a00005 mov r0, r5 <== NOT EXECUTED a0006e10: e3a01001 mov r1, #1 <== NOT EXECUTED a0006e14: e59f2378 ldr r2, [pc, #888] ; a0007194 <_Heap_Walk+0x504> <== NOT EXECUTED a0006e18: e12fff34 blx r4 <== NOT EXECUTED if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; a0006e1c: e1a0800a mov r8, sl <== NOT EXECUTED a0006e20: ea0000c7 b a0007144 <_Heap_Walk+0x4b4> <== NOT EXECUTED int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; a0006e24: e596b010 ldr fp, [r6, #16] block = next_block; } while ( block != first_block ); return true; } a0006e28: e5968008 ldr r8, [r6, #8] Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); a0006e2c: e1a0a006 mov sl, r6 a0006e30: ea000032 b a0006f00 <_Heap_Walk+0x270> const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block && (uintptr_t) block <= (uintptr_t) heap->last_block; a0006e34: e5963020 ldr r3, [r6, #32] a0006e38: e1530008 cmp r3, r8 a0006e3c: 83a0c000 movhi ip, #0 a0006e40: 8a000003 bhi a0006e54 <_Heap_Walk+0x1c4> a0006e44: e596c024 ldr ip, [r6, #36] ; 0x24 a0006e48: e15c0008 cmp ip, r8 a0006e4c: 33a0c000 movcc ip, #0 a0006e50: 23a0c001 movcs ip, #1 const Heap_Block *const first_free_block = _Heap_Free_list_first( heap ); const Heap_Block *prev_block = free_list_tail; const Heap_Block *free_block = first_free_block; while ( free_block != free_list_tail ) { if ( !_Heap_Is_block_in_heap( heap, free_block ) ) { a0006e54: e21cc0ff ands ip, ip, #255 ; 0xff (*printer)( a0006e58: 01a00005 moveq r0, r5 a0006e5c: 03a01001 moveq r1, #1 a0006e60: 059f2330 ldreq r2, [pc, #816] ; a0007198 <_Heap_Walk+0x508> a0006e64: 0a000012 beq a0006eb4 <_Heap_Walk+0x224> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; a0006e68: e2880008 add r0, r8, #8 a0006e6c: e1a0100b mov r1, fp a0006e70: ebffe6ff bl a0000a74 <__umodsi3> ); return false; } if ( a0006e74: e250c000 subs ip, r0, #0 !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( a0006e78: 11a00005 movne r0, r5 a0006e7c: 13a01001 movne r1, #1 a0006e80: 159f2314 ldrne r2, [pc, #788] ; a000719c <_Heap_Walk+0x50c> a0006e84: 11a03008 movne r3, r8 a0006e88: 1a0000b4 bne a0007160 <_Heap_Walk+0x4d0> - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; a0006e8c: e5983004 ldr r3, [r8, #4] a0006e90: e3c33001 bic r3, r3, #1 block = next_block; } while ( block != first_block ); return true; } a0006e94: e0883003 add r3, r8, r3 block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; a0006e98: e5933004 ldr r3, [r3, #4] ); return false; } if ( _Heap_Is_used( free_block ) ) { a0006e9c: e2133001 ands r3, r3, #1 a0006ea0: e58d302c str r3, [sp, #44] ; 0x2c a0006ea4: 0a000008 beq a0006ecc <_Heap_Walk+0x23c> (*printer)( a0006ea8: e59f22f0 ldr r2, [pc, #752] ; a00071a0 <_Heap_Walk+0x510> a0006eac: e1a00005 mov r0, r5 a0006eb0: e3a01001 mov r1, #1 a0006eb4: e1a03008 mov r3, r8 a0006eb8: e58dc01c str ip, [sp, #28] a0006ebc: e12fff34 blx r4 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; a0006ec0: e59dc01c ldr ip, [sp, #28] a0006ec4: e1a0800c mov r8, ip a0006ec8: ea00009d b a0007144 <_Heap_Walk+0x4b4> ); return false; } if ( free_block->prev != prev_block ) { a0006ecc: e598300c ldr r3, [r8, #12] a0006ed0: e153000a cmp r3, sl a0006ed4: 0a000007 beq a0006ef8 <_Heap_Walk+0x268> (*printer)( a0006ed8: e58d3000 str r3, [sp] a0006edc: e1a00005 mov r0, r5 a0006ee0: e1a03008 mov r3, r8 a0006ee4: e3a01001 mov r1, #1 a0006ee8: e59f22b4 ldr r2, [pc, #692] ; a00071a4 <_Heap_Walk+0x514> a0006eec: e12fff34 blx r4 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; a0006ef0: e59d802c ldr r8, [sp, #44] ; 0x2c a0006ef4: ea000092 b a0007144 <_Heap_Walk+0x4b4> return false; } prev_block = free_block; free_block = free_block->next; a0006ef8: e1a0a008 mov sl, r8 a0006efc: e5988008 ldr r8, [r8, #8] const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); const Heap_Block *const first_free_block = _Heap_Free_list_first( heap ); const Heap_Block *prev_block = free_list_tail; const Heap_Block *free_block = first_free_block; while ( free_block != free_list_tail ) { a0006f00: e1580006 cmp r8, r6 a0006f04: 1affffca bne a0006e34 <_Heap_Walk+0x1a4> a0006f08: ea000000 b a0006f10 <_Heap_Walk+0x280> block->prev_size ); } block = next_block; } while ( block != first_block ); a0006f0c: e1a07008 mov r7, r8 return true; } a0006f10: e5973004 ldr r3, [r7, #4] const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block && (uintptr_t) block <= (uintptr_t) heap->last_block; a0006f14: e5962020 ldr r2, [r6, #32] - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; a0006f18: e3c3a001 bic sl, r3, #1 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); a0006f1c: e087800a add r8, r7, sl const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block && (uintptr_t) block <= (uintptr_t) heap->last_block; a0006f20: e1520008 cmp r2, r8 a0006f24: 83a0b000 movhi fp, #0 a0006f28: 8a000003 bhi a0006f3c <_Heap_Walk+0x2ac> a0006f2c: e596b024 ldr fp, [r6, #36] ; 0x24 a0006f30: e15b0008 cmp fp, r8 a0006f34: 33a0b000 movcc fp, #0 a0006f38: 23a0b001 movcs fp, #1 bool const prev_used = _Heap_Is_prev_used( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); uintptr_t const next_block_begin = (uintptr_t) next_block; bool const is_not_last_block = block != last_block; if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { a0006f3c: e21bb0ff ands fp, fp, #255 ; 0xff a0006f40: 1a000006 bne a0006f60 <_Heap_Walk+0x2d0> (*printer)( a0006f44: e58d8000 str r8, [sp] a0006f48: e1a00005 mov r0, r5 a0006f4c: e3a01001 mov r1, #1 a0006f50: e59f2250 ldr r2, [pc, #592] ; a00071a8 <_Heap_Walk+0x518> a0006f54: e1a03007 mov r3, r7 a0006f58: e12fff34 blx r4 a0006f5c: ea000059 b a00070c8 <_Heap_Walk+0x438> uintptr_t const block_begin = (uintptr_t) block; uintptr_t const block_size = _Heap_Block_size( block ); bool const prev_used = _Heap_Is_prev_used( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); uintptr_t const next_block_begin = (uintptr_t) next_block; bool const is_not_last_block = block != last_block; a0006f60: e59d2028 ldr r2, [sp, #40] ; 0x28 RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; a0006f64: e1a0000a mov r0, sl a0006f68: e1a01009 mov r1, r9 a0006f6c: e057b002 subs fp, r7, r2 a0006f70: 13a0b001 movne fp, #1 a0006f74: e58d301c str r3, [sp, #28] a0006f78: ebffe6bd bl a0000a74 <__umodsi3> ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { a0006f7c: e3500000 cmp r0, #0 a0006f80: e59d301c ldr r3, [sp, #28] a0006f84: 0a000005 beq a0006fa0 <_Heap_Walk+0x310> a0006f88: e35b0000 cmp fp, #0 (*printer)( a0006f8c: 158da000 strne sl, [sp] a0006f90: 11a00005 movne r0, r5 a0006f94: 13a01001 movne r1, #1 a0006f98: 159f220c ldrne r2, [pc, #524] ; a00071ac <_Heap_Walk+0x51c> a0006f9c: 1a000013 bne a0006ff0 <_Heap_Walk+0x360> ); return false; } if ( block_size < min_block_size && is_not_last_block ) { a0006fa0: e59dc024 ldr ip, [sp, #36] ; 0x24 a0006fa4: e15a000c cmp sl, ip a0006fa8: 2a000008 bcs a0006fd0 <_Heap_Walk+0x340> a0006fac: e35b0000 cmp fp, #0 a0006fb0: 0a000006 beq a0006fd0 <_Heap_Walk+0x340> (*printer)( a0006fb4: e88d1400 stm sp, {sl, ip} a0006fb8: e1a00005 mov r0, r5 a0006fbc: e3a01001 mov r1, #1 a0006fc0: e59f21e8 ldr r2, [pc, #488] ; a00071b0 <_Heap_Walk+0x520> a0006fc4: e1a03007 mov r3, r7 a0006fc8: e12fff34 blx r4 a0006fcc: ea000064 b a0007164 <_Heap_Walk+0x4d4> ); return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { a0006fd0: e1580007 cmp r8, r7 a0006fd4: 8a000008 bhi a0006ffc <_Heap_Walk+0x36c> a0006fd8: e35b0000 cmp fp, #0 a0006fdc: 0a000006 beq a0006ffc <_Heap_Walk+0x36c> (*printer)( a0006fe0: e59f21cc ldr r2, [pc, #460] ; a00071b4 <_Heap_Walk+0x524> a0006fe4: e58d8000 str r8, [sp] a0006fe8: e1a00005 mov r0, r5 a0006fec: e3a01001 mov r1, #1 a0006ff0: e1a03007 mov r3, r7 a0006ff4: e12fff34 blx r4 a0006ff8: ea000059 b a0007164 <_Heap_Walk+0x4d4> block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; a0006ffc: e203b001 and fp, r3, #1 a0007000: e5983004 ldr r3, [r8, #4] ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { a0007004: e3130001 tst r3, #1 a0007008: 1a000038 bne a00070f0 <_Heap_Walk+0x460> false, "block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n", block, block_size, block->prev, block->prev == first_free_block ? a000700c: e597200c ldr r2, [r7, #12] Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( a0007010: e5963008 ldr r3, [r6, #8] block = next_block; } while ( block != first_block ); return true; } a0007014: e596100c ldr r1, [r6, #12] Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( a0007018: e1520003 cmp r2, r3 a000701c: 059f0194 ldreq r0, [pc, #404] ; a00071b8 <_Heap_Walk+0x528> a0007020: 0a000003 beq a0007034 <_Heap_Walk+0x3a4> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), a0007024: e59f3190 ldr r3, [pc, #400] ; a00071bc <_Heap_Walk+0x52c> a0007028: e1520006 cmp r2, r6 a000702c: e59f018c ldr r0, [pc, #396] ; a00071c0 <_Heap_Walk+0x530> a0007030: 01a00003 moveq r0, r3 block->next, block->next == last_free_block ? a0007034: e5973008 ldr r3, [r7, #8] Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( a0007038: e1530001 cmp r3, r1 a000703c: 059f1180 ldreq r1, [pc, #384] ; a00071c4 <_Heap_Walk+0x534> a0007040: 0a000003 beq a0007054 <_Heap_Walk+0x3c4> " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") a0007044: e59fc17c ldr ip, [pc, #380] ; a00071c8 <_Heap_Walk+0x538> a0007048: e1530006 cmp r3, r6 a000704c: e59f116c ldr r1, [pc, #364] ; a00071c0 <_Heap_Walk+0x530> a0007050: 01a0100c moveq r1, ip Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( a0007054: e58d2004 str r2, [sp, #4] a0007058: e58d0008 str r0, [sp, #8] a000705c: e58d300c str r3, [sp, #12] a0007060: e58d1010 str r1, [sp, #16] a0007064: e1a03007 mov r3, r7 a0007068: e58da000 str sl, [sp] a000706c: e1a00005 mov r0, r5 a0007070: e3a01000 mov r1, #0 a0007074: e59f2150 ldr r2, [pc, #336] ; a00071cc <_Heap_Walk+0x53c> a0007078: e12fff34 blx r4 block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { a000707c: e5983000 ldr r3, [r8] a0007080: e15a0003 cmp sl, r3 a0007084: 0a000008 beq a00070ac <_Heap_Walk+0x41c> (*printer)( a0007088: e58d3004 str r3, [sp, #4] a000708c: e58da000 str sl, [sp] a0007090: e58d8008 str r8, [sp, #8] a0007094: e1a00005 mov r0, r5 a0007098: e3a01001 mov r1, #1 a000709c: e59f212c ldr r2, [pc, #300] ; a00071d0 <_Heap_Walk+0x540> a00070a0: e1a03007 mov r3, r7 a00070a4: e12fff34 blx r4 a00070a8: ea00002d b a0007164 <_Heap_Walk+0x4d4> ); return false; } if ( !prev_used ) { a00070ac: e35b0000 cmp fp, #0 a00070b0: 1a000006 bne a00070d0 <_Heap_Walk+0x440> (*printer)( a00070b4: e59f2118 ldr r2, [pc, #280] ; a00071d4 <_Heap_Walk+0x544> a00070b8: e1a00005 mov r0, r5 a00070bc: e3a01001 mov r1, #1 a00070c0: e1a03007 mov r3, r7 a00070c4: e12fff34 blx r4 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; a00070c8: e1a0800b mov r8, fp a00070cc: ea00001c b a0007144 <_Heap_Walk+0x4b4> block = next_block; } while ( block != first_block ); return true; } a00070d0: e5963008 ldr r3, [r6, #8] a00070d4: ea000002 b a00070e4 <_Heap_Walk+0x454> { const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); const Heap_Block *free_block = _Heap_Free_list_first( heap ); while ( free_block != free_list_tail ) { if ( free_block == block ) { a00070d8: e1530007 cmp r3, r7 a00070dc: 0a000014 beq a0007134 <_Heap_Walk+0x4a4> return true; } free_block = free_block->next; a00070e0: e5933008 ldr r3, [r3, #8] ) { const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); const Heap_Block *free_block = _Heap_Free_list_first( heap ); while ( free_block != free_list_tail ) { a00070e4: e1530006 cmp r3, r6 a00070e8: 1afffffa bne a00070d8 <_Heap_Walk+0x448> a00070ec: ea000017 b a0007150 <_Heap_Walk+0x4c0> if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { a00070f0: e35b0000 cmp fp, #0 a00070f4: 0a000006 beq a0007114 <_Heap_Walk+0x484> (*printer)( a00070f8: e58da000 str sl, [sp] a00070fc: e1a00005 mov r0, r5 a0007100: e3a01000 mov r1, #0 a0007104: e59f20cc ldr r2, [pc, #204] ; a00071d8 <_Heap_Walk+0x548> a0007108: e1a03007 mov r3, r7 a000710c: e12fff34 blx r4 a0007110: ea000007 b a0007134 <_Heap_Walk+0x4a4> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( a0007114: e58da000 str sl, [sp] a0007118: e5973000 ldr r3, [r7] a000711c: e1a00005 mov r0, r5 a0007120: e1a0100b mov r1, fp a0007124: e58d3004 str r3, [sp, #4] a0007128: e59f20ac ldr r2, [pc, #172] ; a00071dc <_Heap_Walk+0x54c> a000712c: e1a03007 mov r3, r7 a0007130: e12fff34 blx r4 block->prev_size ); } block = next_block; } while ( block != first_block ); a0007134: e59d2020 ldr r2, [sp, #32] a0007138: e1580002 cmp r8, r2 a000713c: 1affff72 bne a0006f0c <_Heap_Walk+0x27c> Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; a0007140: e3a08001 mov r8, #1 block = next_block; } while ( block != first_block ); return true; } a0007144: e1a00008 mov r0, r8 a0007148: e28dd030 add sp, sp, #48 ; 0x30 a000714c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( a0007150: e59f2088 ldr r2, [pc, #136] ; a00071e0 <_Heap_Walk+0x550> a0007154: e1a00005 mov r0, r5 a0007158: e3a01001 mov r1, #1 a000715c: e1a03007 mov r3, r7 a0007160: e12fff34 blx r4 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; a0007164: e3a08000 mov r8, #0 a0007168: eafffff5 b a0007144 <_Heap_Walk+0x4b4> =============================================================================== a0005e18 <_TOD_Validate>: { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); a0005e18: e59f30b4 ldr r3, [pc, #180] ; a0005ed4 <_TOD_Validate+0xbc> */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { a0005e1c: e92d4010 push {r4, lr} uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || a0005e20: e2504000 subs r4, r0, #0 { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); a0005e24: e593100c ldr r1, [r3, #12] if ((!the_tod) || a0005e28: 0a000021 beq a0005eb4 <_TOD_Validate+0x9c> ) { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / a0005e2c: e59f00a4 ldr r0, [pc, #164] ; a0005ed8 <_TOD_Validate+0xc0> a0005e30: eb004676 bl a0017810 <__aeabi_uidiv> rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || a0005e34: e5943018 ldr r3, [r4, #24] a0005e38: e1530000 cmp r3, r0 a0005e3c: 2a000020 bcs a0005ec4 <_TOD_Validate+0xac> (the_tod->ticks >= ticks_per_second) || a0005e40: e5943014 ldr r3, [r4, #20] a0005e44: e353003b cmp r3, #59 ; 0x3b a0005e48: 8a00001d bhi a0005ec4 <_TOD_Validate+0xac> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || a0005e4c: e5943010 ldr r3, [r4, #16] a0005e50: e353003b cmp r3, #59 ; 0x3b a0005e54: 8a00001a bhi a0005ec4 <_TOD_Validate+0xac> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || a0005e58: e594300c ldr r3, [r4, #12] a0005e5c: e3530017 cmp r3, #23 a0005e60: 8a000017 bhi a0005ec4 <_TOD_Validate+0xac> (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || a0005e64: e5943004 ldr r3, [r4, #4] rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || (the_tod->ticks >= ticks_per_second) || (the_tod->second >= TOD_SECONDS_PER_MINUTE) || (the_tod->minute >= TOD_MINUTES_PER_HOUR) || (the_tod->hour >= TOD_HOURS_PER_DAY) || a0005e68: e3530000 cmp r3, #0 a0005e6c: 0a000012 beq a0005ebc <_TOD_Validate+0xa4> (the_tod->month == 0) || a0005e70: e353000c cmp r3, #12 a0005e74: 8a000012 bhi a0005ec4 <_TOD_Validate+0xac> (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || a0005e78: e5942000 ldr r2, [r4] (the_tod->ticks >= ticks_per_second) || (the_tod->second >= TOD_SECONDS_PER_MINUTE) || (the_tod->minute >= TOD_MINUTES_PER_HOUR) || (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || (the_tod->month > TOD_MONTHS_PER_YEAR) || a0005e7c: e59f1058 ldr r1, [pc, #88] ; a0005edc <_TOD_Validate+0xc4> a0005e80: e1520001 cmp r2, r1 a0005e84: 9a000010 bls a0005ecc <_TOD_Validate+0xb4> (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) a0005e88: e5940008 ldr r0, [r4, #8] (the_tod->second >= TOD_SECONDS_PER_MINUTE) || (the_tod->minute >= TOD_MINUTES_PER_HOUR) || (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || a0005e8c: e3500000 cmp r0, #0 a0005e90: 0a00000e beq a0005ed0 <_TOD_Validate+0xb8> (the_tod->day == 0) ) return false; if ( (the_tod->year % 4) == 0 ) a0005e94: e3120003 tst r2, #3 a0005e98: e59f2040 ldr r2, [pc, #64] ; a0005ee0 <_TOD_Validate+0xc8> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; a0005e9c: 0283300d addeq r3, r3, #13 else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; a0005ea0: e7924103 ldr r4, [r2, r3, lsl #2] * false - if the the_tod is invalid * * NOTE: This routine only works for leap-years through 2099. */ bool _TOD_Validate( a0005ea4: e1500004 cmp r0, r4 a0005ea8: 83a00000 movhi r0, #0 a0005eac: 93a00001 movls r0, #1 a0005eb0: e8bd8010 pop {r4, pc} (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) return false; a0005eb4: e1a00004 mov r0, r4 <== NOT EXECUTED a0005eb8: e8bd8010 pop {r4, pc} <== NOT EXECUTED a0005ebc: e1a00003 mov r0, r3 <== NOT EXECUTED a0005ec0: e8bd8010 pop {r4, pc} <== NOT EXECUTED a0005ec4: e3a00000 mov r0, #0 a0005ec8: e8bd8010 pop {r4, pc} a0005ecc: e3a00000 mov r0, #0 if ( the_tod->day > days_in_month ) return false; return true; } a0005ed0: e8bd8010 pop {r4, pc} =============================================================================== a000574c : * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { a000574c: e92d40f0 push {r4, r5, r6, r7, lr} rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); a0005750: e59f419c ldr r4, [pc, #412] ; a00058f4 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { a0005754: e1a05001 mov r5, r1 a0005758: e1a07000 mov r7, r0 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); a000575c: e1a00004 mov r0, r4 a0005760: eb000413 bl a00067b4 if (aiocbp == NULL) a0005764: e3550000 cmp r5, #0 a0005768: 1a000035 bne a0005844 { if (fcntl (fildes, F_GETFL) < 0) { a000576c: e1a00007 mov r0, r7 a0005770: e3a01003 mov r1, #3 a0005774: eb001a1e bl a000bff4 a0005778: e3500000 cmp r0, #0 a000577c: aa000004 bge a0005794 pthread_mutex_unlock(&aio_request_queue.mutex); a0005780: e1a00004 mov r0, r4 a0005784: eb000429 bl a0006830 rtems_set_errno_and_return_minus_one (EBADF); a0005788: eb002745 bl a000f4a4 <__errno> a000578c: e3a03009 mov r3, #9 a0005790: ea000032 b a0005860 } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, a0005794: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED a0005798: e1a01007 mov r1, r7 <== NOT EXECUTED a000579c: e1a02005 mov r2, r5 <== NOT EXECUTED a00057a0: eb0000a6 bl a0005a40 <== NOT EXECUTED fildes, 0); if (r_chain == NULL) a00057a4: e2506000 subs r6, r0, #0 <== NOT EXECUTED a00057a8: 1a00001b bne a000581c <== NOT EXECUTED { if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) a00057ac: e5942054 ldr r2, [r4, #84] ; 0x54 <== NOT EXECUTED a00057b0: e2843058 add r3, r4, #88 ; 0x58 <== NOT EXECUTED a00057b4: e1520003 cmp r2, r3 <== NOT EXECUTED a00057b8: 0a000013 beq a000580c <== NOT EXECUTED { r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, a00057bc: e2840054 add r0, r4, #84 ; 0x54 <== NOT EXECUTED a00057c0: e1a01007 mov r1, r7 <== NOT EXECUTED a00057c4: e1a02006 mov r2, r6 <== NOT EXECUTED a00057c8: eb00009c bl a0005a40 <== NOT EXECUTED fildes, 0); if (r_chain == NULL) { a00057cc: e2505000 subs r5, r0, #0 <== NOT EXECUTED a00057d0: 0a00000d beq a000580c <== NOT EXECUTED return AIO_ALLDONE; } rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); pthread_mutex_destroy (&r_chain->mutex); a00057d4: e285701c add r7, r5, #28 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); a00057d8: eb000a12 bl a0008028 <_Chain_Extract> <== NOT EXECUTED pthread_mutex_unlock(&aio_request_queue.mutex); return AIO_ALLDONE; } rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); a00057dc: e1a00005 mov r0, r5 <== NOT EXECUTED a00057e0: eb00016f bl a0005da4 <== NOT EXECUTED pthread_mutex_destroy (&r_chain->mutex); a00057e4: e1a00007 mov r0, r7 <== NOT EXECUTED a00057e8: eb00034e bl a0006528 <== NOT EXECUTED pthread_cond_destroy (&r_chain->mutex); a00057ec: e1a00007 mov r0, r7 <== NOT EXECUTED a00057f0: eb00027d bl a00061ec <== NOT EXECUTED free (r_chain); a00057f4: e1a00005 mov r0, r5 <== NOT EXECUTED a00057f8: ebfff40f bl a000283c <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); a00057fc: e1a00004 mov r0, r4 <== NOT EXECUTED a0005800: eb00040a bl a0006830 <== NOT EXECUTED return AIO_CANCELED; a0005804: e1a05006 mov r5, r6 <== NOT EXECUTED a0005808: ea000037 b a00058ec <== NOT EXECUTED } pthread_mutex_unlock (&aio_request_queue.mutex); a000580c: e1a00004 mov r0, r4 <== NOT EXECUTED a0005810: eb000406 bl a0006830 <== NOT EXECUTED return AIO_ALLDONE; a0005814: e3a05002 mov r5, #2 <== NOT EXECUTED a0005818: ea000033 b a00058ec <== NOT EXECUTED } pthread_mutex_lock (&r_chain->mutex); a000581c: e286701c add r7, r6, #28 <== NOT EXECUTED a0005820: e1a00007 mov r0, r7 <== NOT EXECUTED a0005824: eb0003e2 bl a00067b4 <== NOT EXECUTED a0005828: e1a00006 mov r0, r6 <== NOT EXECUTED a000582c: eb0009fd bl a0008028 <_Chain_Extract> <== NOT EXECUTED rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); a0005830: e1a00006 mov r0, r6 <== NOT EXECUTED a0005834: eb00015a bl a0005da4 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); a0005838: e1a00007 mov r0, r7 <== NOT EXECUTED a000583c: eb0003fb bl a0006830 <== NOT EXECUTED a0005840: ea00001c b a00058b8 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); return AIO_CANCELED; } else { if (aiocbp->aio_fildes != fildes) { a0005844: e5956000 ldr r6, [r5] a0005848: e1560007 cmp r6, r7 a000584c: 0a000006 beq a000586c pthread_mutex_unlock (&aio_request_queue.mutex); a0005850: e1a00004 mov r0, r4 a0005854: eb0003f5 bl a0006830 rtems_set_errno_and_return_minus_one (EINVAL); a0005858: eb002711 bl a000f4a4 <__errno> a000585c: e3a03016 mov r3, #22 a0005860: e5803000 str r3, [r0] a0005864: e3e05000 mvn r5, #0 a0005868: ea00001f b a00058ec } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, a000586c: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED a0005870: e1a01006 mov r1, r6 <== NOT EXECUTED a0005874: e3a02000 mov r2, #0 <== NOT EXECUTED a0005878: eb000070 bl a0005a40 <== NOT EXECUTED fildes, 0); if (r_chain == NULL) a000587c: e2507000 subs r7, r0, #0 <== NOT EXECUTED a0005880: 1a00000e bne a00058c0 <== NOT EXECUTED if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) a0005884: e5942054 ldr r2, [r4, #84] ; 0x54 <== NOT EXECUTED a0005888: e2843058 add r3, r4, #88 ; 0x58 <== NOT EXECUTED a000588c: e1520003 cmp r2, r3 <== NOT EXECUTED a0005890: 0a00000a beq a00058c0 <== NOT EXECUTED { r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, a0005894: e2840054 add r0, r4, #84 ; 0x54 <== NOT EXECUTED a0005898: e1a01006 mov r1, r6 <== NOT EXECUTED a000589c: e1a02007 mov r2, r7 <== NOT EXECUTED a00058a0: eb000066 bl a0005a40 <== NOT EXECUTED fildes, 0); if (r_chain == NULL) a00058a4: e3500000 cmp r0, #0 <== NOT EXECUTED a00058a8: 0affffe8 beq a0005850 <== NOT EXECUTED { pthread_mutex_unlock (&aio_request_queue.mutex); rtems_set_errno_and_return_minus_one (EINVAL); } result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp); a00058ac: e1a01005 mov r1, r5 <== NOT EXECUTED a00058b0: eb00014b bl a0005de4 <== NOT EXECUTED a00058b4: e1a05000 mov r5, r0 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); a00058b8: e1a00004 mov r0, r4 <== NOT EXECUTED a00058bc: ea000009 b a00058e8 <== NOT EXECUTED return result; } pthread_mutex_lock (&r_chain->mutex); a00058c0: e287401c add r4, r7, #28 <== NOT EXECUTED a00058c4: e1a00004 mov r0, r4 <== NOT EXECUTED a00058c8: eb0003b9 bl a00067b4 <== NOT EXECUTED result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp); a00058cc: e1a01005 mov r1, r5 <== NOT EXECUTED a00058d0: e1a00007 mov r0, r7 <== NOT EXECUTED a00058d4: eb000142 bl a0005de4 <== NOT EXECUTED a00058d8: e1a05000 mov r5, r0 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); a00058dc: e1a00004 mov r0, r4 <== NOT EXECUTED a00058e0: eb0003d2 bl a0006830 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); a00058e4: e59f0008 ldr r0, [pc, #8] ; a00058f4 <== NOT EXECUTED a00058e8: eb0003d0 bl a0006830 <== NOT EXECUTED return result; } return AIO_ALLDONE; } a00058ec: e1a00005 mov r0, r5 a00058f0: e8bd80f0 pop {r4, r5, r6, r7, pc} =============================================================================== a0005900 : ) { rtems_aio_request *req; int mode; if (op != O_SYNC) a0005900: e3500a02 cmp r0, #8192 ; 0x2000 int aio_fsync( int op, struct aiocb *aiocbp ) { a0005904: e92d4030 push {r4, r5, lr} a0005908: e1a04001 mov r4, r1 rtems_aio_request *req; int mode; if (op != O_SYNC) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); a000590c: 13a05016 movne r5, #22 ) { rtems_aio_request *req; int mode; if (op != O_SYNC) a0005910: 1a00000c bne a0005948 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); mode = fcntl (aiocbp->aio_fildes, F_GETFL); a0005914: e5910000 ldr r0, [r1] a0005918: e3a01003 mov r1, #3 a000591c: eb0019b4 bl a000bff4 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) a0005920: e2000003 and r0, r0, #3 a0005924: e2400001 sub r0, r0, #1 a0005928: e3500001 cmp r0, #1 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); a000592c: 83a05009 movhi r5, #9 if (op != O_SYNC) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) a0005930: 8a000004 bhi a0005948 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); req = malloc (sizeof (rtems_aio_request)); a0005934: e3a00018 mov r0, #24 <== NOT EXECUTED a0005938: ebfff535 bl a0002e14 <== NOT EXECUTED if (req == NULL) a000593c: e2503000 subs r3, r0, #0 <== NOT EXECUTED a0005940: 1a000007 bne a0005964 <== NOT EXECUTED rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); a0005944: e3a0500b mov r5, #11 <== NOT EXECUTED a0005948: e3e03000 mvn r3, #0 a000594c: e5845030 str r5, [r4, #48] ; 0x30 a0005950: e5843034 str r3, [r4, #52] ; 0x34 a0005954: eb0026d2 bl a000f4a4 <__errno> a0005958: e5805000 str r5, [r0] req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_SYNC; return rtems_aio_enqueue (req); } a000595c: e3e00000 mvn r0, #0 a0005960: e8bd8030 pop {r4, r5, pc} req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; a0005964: e5834014 str r4, [r3, #20] <== NOT EXECUTED req->aiocbp->aio_lio_opcode = LIO_SYNC; a0005968: e3a03003 mov r3, #3 <== NOT EXECUTED a000596c: e584302c str r3, [r4, #44] ; 0x2c <== NOT EXECUTED return rtems_aio_enqueue (req); } a0005970: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_SYNC; return rtems_aio_enqueue (req); a0005974: ea000130 b a0005e3c <== NOT EXECUTED =============================================================================== a000604c : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { a000604c: e92d4030 push {r4, r5, lr} rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); a0006050: e3a01003 mov r1, #3 * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { a0006054: e1a04000 mov r4, r0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); a0006058: e5900000 ldr r0, [r0] a000605c: eb0017e4 bl a000bff4 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) a0006060: e2000003 and r0, r0, #3 a0006064: e3500002 cmp r0, #2 a0006068: 13500000 cmpne r0, #0 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); a000606c: 13a05009 movne r5, #9 { rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) a0006070: 1a00000d bne a00060ac rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) a0006074: e5943014 ldr r3, [r4, #20] a0006078: e3530000 cmp r3, #0 a000607c: 1a000007 bne a00060a0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) a0006080: e5943008 ldr r3, [r4, #8] a0006084: e3530000 cmp r3, #0 a0006088: ba000004 blt a00060a0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); a000608c: e3a00018 mov r0, #24 a0006090: ebfff35f bl a0002e14 if (req == NULL) a0006094: e2503000 subs r3, r0, #0 a0006098: 1a00000a bne a00060c8 a000609c: ea000001 b a00060a8 <== NOT EXECUTED if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); a00060a0: e3a05016 mov r5, #22 a00060a4: ea000000 b a00060ac req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); a00060a8: e3a0500b mov r5, #11 <== NOT EXECUTED a00060ac: e3e03000 mvn r3, #0 a00060b0: e5845030 str r5, [r4, #48] ; 0x30 a00060b4: e5843034 str r3, [r4, #52] ; 0x34 a00060b8: eb0024f9 bl a000f4a4 <__errno> a00060bc: e5805000 str r5, [r0] req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_READ; return rtems_aio_enqueue (req); } a00060c0: e3e00000 mvn r0, #0 a00060c4: e8bd8030 pop {r4, r5, pc} req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; a00060c8: e5834014 str r4, [r3, #20] req->aiocbp->aio_lio_opcode = LIO_READ; a00060cc: e3a03001 mov r3, #1 a00060d0: e584302c str r3, [r4, #44] ; 0x2c return rtems_aio_enqueue (req); } a00060d4: e8bd4030 pop {r4, r5, lr} rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_READ; return rtems_aio_enqueue (req); a00060d8: eaffff57 b a0005e3c =============================================================================== a00060e4 : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { a00060e4: e92d4030 push {r4, r5, lr} rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); a00060e8: e3a01003 mov r1, #3 * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { a00060ec: e1a04000 mov r4, r0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); a00060f0: e5900000 ldr r0, [r0] a00060f4: eb0017be bl a000bff4 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) a00060f8: e2000003 and r0, r0, #3 a00060fc: e2400001 sub r0, r0, #1 a0006100: e3500001 cmp r0, #1 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); a0006104: 83a05009 movhi r5, #9 { rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) a0006108: 8a00000d bhi a0006144 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) a000610c: e5943014 ldr r3, [r4, #20] a0006110: e3530000 cmp r3, #0 a0006114: 1a000007 bne a0006138 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) a0006118: e5943008 ldr r3, [r4, #8] a000611c: e3530000 cmp r3, #0 a0006120: ba000004 blt a0006138 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); a0006124: e3a00018 mov r0, #24 a0006128: ebfff339 bl a0002e14 if (req == NULL) a000612c: e2503000 subs r3, r0, #0 a0006130: 1a00000a bne a0006160 a0006134: ea000001 b a0006140 <== NOT EXECUTED if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); a0006138: e3a05016 mov r5, #22 a000613c: ea000000 b a0006144 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); a0006140: e3a0500b mov r5, #11 <== NOT EXECUTED a0006144: e3e03000 mvn r3, #0 a0006148: e5845030 str r5, [r4, #48] ; 0x30 a000614c: e5843034 str r3, [r4, #52] ; 0x34 a0006150: eb0024d3 bl a000f4a4 <__errno> a0006154: e5805000 str r5, [r0] req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_WRITE; return rtems_aio_enqueue (req); } a0006158: e3e00000 mvn r0, #0 a000615c: e8bd8030 pop {r4, r5, pc} req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; a0006160: e5834014 str r4, [r3, #20] req->aiocbp->aio_lio_opcode = LIO_WRITE; a0006164: e3a03002 mov r3, #2 a0006168: e584302c str r3, [r4, #44] ; 0x2c return rtems_aio_enqueue (req); } a000616c: e8bd4030 pop {r4, r5, lr} rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_WRITE; return rtems_aio_enqueue (req); a0006170: eaffff31 b a0005e3c =============================================================================== a000a1e0 : int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) a000a1e0: e3500000 cmp r0, #0 a000a1e4: 0a00000b beq a000a218 a000a1e8: e5903000 ldr r3, [r0] a000a1ec: e3530000 cmp r3, #0 a000a1f0: 0a000008 beq a000a218 return EINVAL; switch ( policy ) { a000a1f4: e3510004 cmp r1, #4 a000a1f8: 8a000008 bhi a000a220 a000a1fc: e3a03001 mov r3, #1 a000a200: e1a03113 lsl r3, r3, r1 a000a204: e3130017 tst r3, #23 case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; a000a208: 15801014 strne r1, [r0, #20] return 0; a000a20c: 13a00000 movne r0, #0 ) { if ( !attr || !attr->is_initialized ) return EINVAL; switch ( policy ) { a000a210: 112fff1e bxne lr a000a214: ea000001 b a000a220 <== NOT EXECUTED pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) return EINVAL; a000a218: e3a00016 mov r0, #22 a000a21c: e12fff1e bx lr case SCHED_SPORADIC: attr->schedpolicy = policy; return 0; default: return ENOTSUP; a000a220: e3a00086 mov r0, #134 ; 0x86 } } a000a224: e12fff1e bx lr =============================================================================== a0005d14 : int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { a0005d14: e92d40f0 push {r4, r5, r6, r7, lr} POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; else the_attr = &_POSIX_Condition_variables_Default_attributes; a0005d18: e59f50a8 ldr r5, [pc, #168] ; a0005dc8 a0005d1c: e3510000 cmp r1, #0 a0005d20: 11a05001 movne r5, r1 /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) a0005d24: e5953004 ldr r3, [r5, #4] int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { a0005d28: e1a07000 mov r7, r0 else the_attr = &_POSIX_Condition_variables_Default_attributes; /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) a0005d2c: e3530001 cmp r3, #1 a0005d30: 0a000020 beq a0005db8 return EINVAL; if ( !the_attr->is_initialized ) a0005d34: e5953000 ldr r3, [r5] a0005d38: e3530000 cmp r3, #0 a0005d3c: 0a00001f beq a0005dc0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; a0005d40: e59f3084 ldr r3, [pc, #132] ; a0005dcc a0005d44: e5932000 ldr r2, [r3] a0005d48: e2822001 add r2, r2, #1 a0005d4c: e5832000 str r2, [r3] RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Allocate( void ) { return (POSIX_Condition_variables_Control *) _Objects_Allocate( &_POSIX_Condition_variables_Information ); a0005d50: e59f6078 ldr r6, [pc, #120] ; a0005dd0 a0005d54: e1a00006 mov r0, r6 a0005d58: eb00092f bl a000821c <_Objects_Allocate> _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { a0005d5c: e2504000 subs r4, r0, #0 a0005d60: 1a000002 bne a0005d70 _Thread_Enable_dispatch(); a0005d64: eb000d05 bl a0009180 <_Thread_Enable_dispatch> return ENOMEM; a0005d68: e3a0000c mov r0, #12 a0005d6c: e8bd80f0 pop {r4, r5, r6, r7, pc} } the_cond->process_shared = the_attr->process_shared; a0005d70: e5953004 ldr r3, [r5, #4] the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; a0005d74: e3a05000 mov r5, #0 _Thread_queue_Initialize( a0005d78: e2840018 add r0, r4, #24 if ( !the_cond ) { _Thread_Enable_dispatch(); return ENOMEM; } the_cond->process_shared = the_attr->process_shared; a0005d7c: e5843010 str r3, [r4, #16] the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( a0005d80: e1a01005 mov r1, r5 a0005d84: e59f2048 ldr r2, [pc, #72] ; a0005dd4 a0005d88: e3a03074 mov r3, #116 ; 0x74 return ENOMEM; } the_cond->process_shared = the_attr->process_shared; the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; a0005d8c: e5845014 str r5, [r4, #20] _Thread_queue_Initialize( a0005d90: eb000ee6 bl a0009930 <_Thread_queue_Initialize> #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; a0005d94: e596201c ldr r2, [r6, #28] Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( a0005d98: e5943008 ldr r3, [r4, #8] a0005d9c: e1d410b8 ldrh r1, [r4, #8] #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; a0005da0: e7824101 str r4, [r2, r1, lsl #2] _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; a0005da4: e584500c str r5, [r4, #12] &_POSIX_Condition_variables_Information, &the_cond->Object, 0 ); *cond = the_cond->Object.id; a0005da8: e5873000 str r3, [r7] _Thread_Enable_dispatch(); a0005dac: eb000cf3 bl a0009180 <_Thread_Enable_dispatch> return 0; a0005db0: e1a00005 mov r0, r5 a0005db4: e8bd80f0 pop {r4, r5, r6, r7, pc} /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) return EINVAL; a0005db8: e3a00016 mov r0, #22 <== NOT EXECUTED a0005dbc: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED if ( !the_attr->is_initialized ) return EINVAL; a0005dc0: e3a00016 mov r0, #22 *cond = the_cond->Object.id; _Thread_Enable_dispatch(); return 0; } a0005dc4: e8bd80f0 pop {r4, r5, r6, r7, pc} =============================================================================== a000700c : int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) a000700c: e3500000 cmp r0, #0 a0007010: 0a000007 beq a0007034 a0007014: e5903000 ldr r3, [r0] a0007018: e3530000 cmp r3, #0 a000701c: 0a000004 beq a0007034 return EINVAL; switch ( pshared ) { a0007020: e3510001 cmp r1, #1 case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; a0007024: 95801004 strls r1, [r0, #4] return 0; a0007028: 93a00000 movls r0, #0 ) { if ( !attr || !attr->is_initialized ) return EINVAL; switch ( pshared ) { a000702c: 912fff1e bxls lr a0007030: ea000001 b a000703c <== NOT EXECUTED pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) return EINVAL; a0007034: e3a00016 mov r0, #22 a0007038: e12fff1e bx lr case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; return 0; default: return EINVAL; a000703c: e3a00016 mov r0, #22 <== NOT EXECUTED } } a0007040: e12fff1e bx lr <== NOT EXECUTED =============================================================================== a0006c78 : int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) a0006c78: e3500000 cmp r0, #0 a0006c7c: 0a000007 beq a0006ca0 return EINVAL; if ( !attr->is_initialized ) a0006c80: e5903000 ldr r3, [r0] a0006c84: e3530000 cmp r3, #0 a0006c88: 0a000004 beq a0006ca0 return EINVAL; switch ( pshared ) { a0006c8c: e3510001 cmp r1, #1 case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; a0006c90: 95801004 strls r1, [r0, #4] return 0; a0006c94: 93a00000 movls r0, #0 return EINVAL; if ( !attr->is_initialized ) return EINVAL; switch ( pshared ) { a0006c98: 912fff1e bxls lr a0006c9c: ea000001 b a0006ca8 { if ( !attr ) return EINVAL; if ( !attr->is_initialized ) return EINVAL; a0006ca0: e3a00016 mov r0, #22 a0006ca4: e12fff1e bx lr case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; return 0; default: return EINVAL; a0006ca8: e3a00016 mov r0, #22 } } a0006cac: e12fff1e bx lr <== NOT EXECUTED =============================================================================== a0005e3c : * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { a0005e3c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} struct sched_param param; /* The queue should be initialized */ AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED); result = pthread_mutex_lock (&aio_request_queue.mutex); a0005e40: e59f41f0 ldr r4, [pc, #496] ; a0006038 * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { a0005e44: e24dd024 sub sp, sp, #36 ; 0x24 a0005e48: e1a06000 mov r6, r0 struct sched_param param; /* The queue should be initialized */ AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED); result = pthread_mutex_lock (&aio_request_queue.mutex); a0005e4c: e1a00004 mov r0, r4 a0005e50: eb000257 bl a00067b4 if (result != 0) { a0005e54: e2505000 subs r5, r0, #0 a0005e58: 0a000002 beq a0005e68 free (req); a0005e5c: e1a00006 mov r0, r6 <== NOT EXECUTED a0005e60: ebfff275 bl a000283c <== NOT EXECUTED return result; a0005e64: ea000070 b a000602c <== NOT EXECUTED } /* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined, we can use aio_reqprio to lower the priority of the request */ pthread_getschedparam (pthread_self(), &policy, ¶m); a0005e68: eb000462 bl a0006ff8 a0005e6c: e28d101c add r1, sp, #28 a0005e70: e1a0200d mov r2, sp a0005e74: eb000364 bl a0006c0c req->caller_thread = pthread_self (); a0005e78: eb00045e bl a0006ff8 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; a0005e7c: e5963014 ldr r3, [r6, #20] a0005e80: e59d1000 ldr r1, [sp] /* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined, we can use aio_reqprio to lower the priority of the request */ pthread_getschedparam (pthread_self(), &policy, ¶m); req->caller_thread = pthread_self (); a0005e84: e5860010 str r0, [r6, #16] req->priority = param.sched_priority - req->aiocbp->aio_reqprio; a0005e88: e5932014 ldr r2, [r3, #20] a0005e8c: e0622001 rsb r2, r2, r1 a0005e90: e586200c str r2, [r6, #12] req->policy = policy; a0005e94: e59d201c ldr r2, [sp, #28] a0005e98: e5862008 str r2, [r6, #8] req->aiocbp->error_code = EINPROGRESS; a0005e9c: e3a02077 mov r2, #119 ; 0x77 a0005ea0: e5832030 str r2, [r3, #48] ; 0x30 req->aiocbp->return_value = 0; if ((aio_request_queue.idle_threads == 0) && a0005ea4: e5942068 ldr r2, [r4, #104] ; 0x68 req->caller_thread = pthread_self (); req->priority = param.sched_priority - req->aiocbp->aio_reqprio; req->policy = policy; req->aiocbp->error_code = EINPROGRESS; req->aiocbp->return_value = 0; a0005ea8: e5835034 str r5, [r3, #52] ; 0x34 if ((aio_request_queue.idle_threads == 0) && a0005eac: e3520000 cmp r2, #0 a0005eb0: 1a00002e bne a0005f70 a0005eb4: e5942064 ldr r2, [r4, #100] ; 0x64 a0005eb8: e3520004 cmp r2, #4 a0005ebc: ca00002b bgt a0005f70 aio_request_queue.active_threads < AIO_MAX_THREADS) /* we still have empty places on the active_threads chain */ { chain = &aio_request_queue.work_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); a0005ec0: e5931000 ldr r1, [r3] a0005ec4: e2840048 add r0, r4, #72 ; 0x48 a0005ec8: e3a02001 mov r2, #1 a0005ecc: ebfffedb bl a0005a40 if (r_chain->new_fd == 1) { a0005ed0: e5903018 ldr r3, [r0, #24] if ((aio_request_queue.idle_threads == 0) && aio_request_queue.active_threads < AIO_MAX_THREADS) /* we still have empty places on the active_threads chain */ { chain = &aio_request_queue.work_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); a0005ed4: e1a07000 mov r7, r0 a0005ed8: e2809008 add r9, r0, #8 if (r_chain->new_fd == 1) { a0005edc: e3530001 cmp r3, #1 a0005ee0: e280801c add r8, r0, #28 a0005ee4: e280a020 add sl, r0, #32 a0005ee8: 1a000017 bne a0005f4c RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); a0005eec: e1a01006 mov r1, r6 a0005ef0: e1a00009 mov r0, r9 a0005ef4: eb000860 bl a000807c <_Chain_Insert> rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); a0005ef8: e1a01005 mov r1, r5 chain = &aio_request_queue.work_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); if (r_chain->new_fd == 1) { rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; a0005efc: e5875018 str r5, [r7, #24] pthread_mutex_init (&r_chain->mutex, NULL); a0005f00: e1a00008 mov r0, r8 a0005f04: eb0001d7 bl a0006668 pthread_cond_init (&r_chain->cond, NULL); a0005f08: e1a01005 mov r1, r5 a0005f0c: e1a0000a mov r0, sl a0005f10: eb0000e7 bl a00062b4 AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, a0005f14: e1a03007 mov r3, r7 a0005f18: e28d0020 add r0, sp, #32 a0005f1c: e2841008 add r1, r4, #8 a0005f20: e59f2114 ldr r2, [pc, #276] ; a000603c a0005f24: eb0002a3 bl a00069b8 rtems_aio_handle, (void *) r_chain); if (result != 0) { a0005f28: e2506000 subs r6, r0, #0 pthread_mutex_unlock (&aio_request_queue.mutex); return result; } ++aio_request_queue.active_threads; a0005f2c: 05943064 ldreq r3, [r4, #100] ; 0x64 a0005f30: 02833001 addeq r3, r3, #1 a0005f34: 05843064 streq r3, [r4, #100] ; 0x64 pthread_cond_init (&r_chain->cond, NULL); AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, rtems_aio_handle, (void *) r_chain); if (result != 0) { a0005f38: 0a000039 beq a0006024 pthread_mutex_unlock (&aio_request_queue.mutex); a0005f3c: e1a00004 mov r0, r4 <== NOT EXECUTED a0005f40: eb00023a bl a0006830 <== NOT EXECUTED return result; a0005f44: e1a05006 mov r5, r6 <== NOT EXECUTED a0005f48: ea000037 b a000602c <== NOT EXECUTED } ++aio_request_queue.active_threads; } else { /* put request in the fd chain it belongs to */ pthread_mutex_lock (&r_chain->mutex); a0005f4c: e1a00008 mov r0, r8 a0005f50: eb000217 bl a00067b4 rtems_aio_insert_prio (&r_chain->perfd, req); a0005f54: e1a00009 mov r0, r9 a0005f58: e1a01006 mov r1, r6 a0005f5c: ebffff7c bl a0005d54 pthread_cond_signal (&r_chain->cond); a0005f60: e1a0000a mov r0, sl a0005f64: eb000103 bl a0006378 pthread_mutex_unlock (&r_chain->mutex); a0005f68: e1a00008 mov r0, r8 a0005f6c: ea00000e b a0005fac else { /* the maximum number of threads has been already created even though some of them might be idle. The request belongs to one of the active fd chain */ r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, a0005f70: e59f00c8 ldr r0, [pc, #200] ; a0006040 a0005f74: e5931000 ldr r1, [r3] a0005f78: e3a02000 mov r2, #0 a0005f7c: ebfffeaf bl a0005a40 req->aiocbp->aio_fildes, 0); if (r_chain != NULL) a0005f80: e2504000 subs r4, r0, #0 a0005f84: 0a00000a beq a0005fb4 { pthread_mutex_lock (&r_chain->mutex); a0005f88: e284701c add r7, r4, #28 <== NOT EXECUTED a0005f8c: e1a00007 mov r0, r7 <== NOT EXECUTED a0005f90: eb000207 bl a00067b4 <== NOT EXECUTED rtems_aio_insert_prio (&r_chain->perfd, req); a0005f94: e2840008 add r0, r4, #8 <== NOT EXECUTED a0005f98: e1a01006 mov r1, r6 <== NOT EXECUTED a0005f9c: ebffff6c bl a0005d54 <== NOT EXECUTED pthread_cond_signal (&r_chain->cond); a0005fa0: e2840020 add r0, r4, #32 <== NOT EXECUTED a0005fa4: eb0000f3 bl a0006378 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); a0005fa8: e1a00007 mov r0, r7 <== NOT EXECUTED a0005fac: eb00021f bl a0006830 a0005fb0: ea00001b b a0006024 } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); a0005fb4: e5963014 ldr r3, [r6, #20] a0005fb8: e59f0084 ldr r0, [pc, #132] ; a0006044 a0005fbc: e3a02001 mov r2, #1 a0005fc0: e5931000 ldr r1, [r3] a0005fc4: ebfffe9d bl a0005a40 if (r_chain->new_fd == 1) { a0005fc8: e5903018 ldr r3, [r0, #24] } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); a0005fcc: e1a07000 mov r7, r0 a0005fd0: e2800008 add r0, r0, #8 if (r_chain->new_fd == 1) { a0005fd4: e3530001 cmp r3, #1 a0005fd8: 1a00000f bne a000601c a0005fdc: e1a01006 mov r1, r6 a0005fe0: eb000825 bl a000807c <_Chain_Insert> /* If this is a new fd chain we signal the idle threads that might be waiting for requests */ AIO_printf (" New chain on waiting queue \n "); rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); a0005fe4: e1a01004 mov r1, r4 if (r_chain->new_fd == 1) { /* If this is a new fd chain we signal the idle threads that might be waiting for requests */ AIO_printf (" New chain on waiting queue \n "); rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; a0005fe8: e5874018 str r4, [r7, #24] pthread_mutex_init (&r_chain->mutex, NULL); a0005fec: e287001c add r0, r7, #28 a0005ff0: eb00019c bl a0006668 pthread_cond_init (&r_chain->cond, NULL); a0005ff4: e1a01004 mov r1, r4 a0005ff8: e2870020 add r0, r7, #32 a0005ffc: eb0000ac bl a00062b4 pthread_cond_signal (&aio_request_queue.new_req); a0006000: e59f0040 ldr r0, [pc, #64] ; a0006048 a0006004: eb0000db bl a0006378 ++aio_request_queue.idle_threads; a0006008: e59f3028 ldr r3, [pc, #40] ; a0006038 a000600c: e5932068 ldr r2, [r3, #104] ; 0x68 a0006010: e2822001 add r2, r2, #1 a0006014: e5832068 str r2, [r3, #104] ; 0x68 a0006018: ea000001 b a0006024 } else /* just insert the request in the existing fd chain */ rtems_aio_insert_prio (&r_chain->perfd, req); a000601c: e1a01006 mov r1, r6 a0006020: ebffff4b bl a0005d54 } } pthread_mutex_unlock (&aio_request_queue.mutex); a0006024: e59f000c ldr r0, [pc, #12] ; a0006038 a0006028: eb000200 bl a0006830 return 0; } a000602c: e1a00005 mov r0, r5 a0006030: e28dd024 add sp, sp, #36 ; 0x24 a0006034: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} =============================================================================== a0005ae8 : * NULL - if error */ static void * rtems_aio_handle (void *arg) { a0005ae8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED The fd chain is already unlocked */ struct timespec timeout; pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); a0005aec: e59f6254 ldr r6, [pc, #596] ; a0005d48 <== NOT EXECUTED * NULL - if error */ static void * rtems_aio_handle (void *arg) { a0005af0: e24dd02c sub sp, sp, #44 ; 0x2c <== NOT EXECUTED a0005af4: e1a04000 mov r4, r0 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); a0005af8: e28d7020 add r7, sp, #32 <== NOT EXECUTED pthread_cond_destroy (&r_chain->cond); free (r_chain); /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { a0005afc: e286b058 add fp, r6, #88 ; 0x58 <== NOT EXECUTED node = rtems_chain_first (chain); req = (rtems_aio_request *) node; /* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING discussion in rtems_aio_enqueue () */ pthread_getschedparam (pthread_self(), &policy, ¶m); a0005b00: e28d9004 add r9, sp, #4 <== NOT EXECUTED /* acquire the mutex of the current fd chain. we don't need to lock the queue mutex since we can add requests to idle fd chains or even active ones if the working request has been extracted from the chain */ result = pthread_mutex_lock (&r_chain->mutex); a0005b04: e284a01c add sl, r4, #28 <== NOT EXECUTED a0005b08: e1a0000a mov r0, sl <== NOT EXECUTED a0005b0c: eb000328 bl a00067b4 <== NOT EXECUTED if (result != 0) a0005b10: e2508000 subs r8, r0, #0 <== NOT EXECUTED a0005b14: 1a000088 bne a0005d3c <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } a0005b18: e5945008 ldr r5, [r4, #8] <== NOT EXECUTED RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); a0005b1c: e284300c add r3, r4, #12 <== NOT EXECUTED /* If the locked chain is not empty, take the first request extract it, unlock the chain and process the request, in this way the user can supply more requests to this fd chain */ if (!rtems_chain_is_empty (chain)) { a0005b20: e1550003 cmp r5, r3 <== NOT EXECUTED a0005b24: 0a000035 beq a0005c00 <== NOT EXECUTED node = rtems_chain_first (chain); req = (rtems_aio_request *) node; /* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING discussion in rtems_aio_enqueue () */ pthread_getschedparam (pthread_self(), &policy, ¶m); a0005b28: eb000532 bl a0006ff8 <== NOT EXECUTED a0005b2c: e28d1028 add r1, sp, #40 ; 0x28 <== NOT EXECUTED a0005b30: e1a02009 mov r2, r9 <== NOT EXECUTED a0005b34: eb000434 bl a0006c0c <== NOT EXECUTED param.sched_priority = req->priority; a0005b38: e595300c ldr r3, [r5, #12] <== NOT EXECUTED a0005b3c: e58d3004 str r3, [sp, #4] <== NOT EXECUTED pthread_setschedparam (pthread_self(), req->policy, ¶m); a0005b40: eb00052c bl a0006ff8 <== NOT EXECUTED a0005b44: e1a02009 mov r2, r9 <== NOT EXECUTED a0005b48: e5951008 ldr r1, [r5, #8] <== NOT EXECUTED a0005b4c: eb00052e bl a000700c <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); a0005b50: e1a00005 mov r0, r5 <== NOT EXECUTED a0005b54: eb000933 bl a0008028 <_Chain_Extract> <== NOT EXECUTED rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); a0005b58: e1a0000a mov r0, sl <== NOT EXECUTED a0005b5c: eb000333 bl a0006830 <== NOT EXECUTED switch (req->aiocbp->aio_lio_opcode) { a0005b60: e5952014 ldr r2, [r5, #20] <== NOT EXECUTED a0005b64: e592302c ldr r3, [r2, #44] ; 0x2c <== NOT EXECUTED a0005b68: e3530002 cmp r3, #2 <== NOT EXECUTED a0005b6c: 0a00000b beq a0005ba0 <== NOT EXECUTED a0005b70: e3530003 cmp r3, #3 <== NOT EXECUTED a0005b74: 0a000011 beq a0005bc0 <== NOT EXECUTED a0005b78: e3530001 cmp r3, #1 <== NOT EXECUTED a0005b7c: 1a000013 bne a0005bd0 <== NOT EXECUTED case LIO_READ: result = pread (req->aiocbp->aio_fildes, a0005b80: e5921008 ldr r1, [r2, #8] <== NOT EXECUTED a0005b84: e5923004 ldr r3, [r2, #4] <== NOT EXECUTED a0005b88: e58d1000 str r1, [sp] <== NOT EXECUTED a0005b8c: e592100c ldr r1, [r2, #12] <== NOT EXECUTED a0005b90: e5920000 ldr r0, [r2] <== NOT EXECUTED a0005b94: e5922010 ldr r2, [r2, #16] <== NOT EXECUTED a0005b98: eb002943 bl a00100ac <== NOT EXECUTED (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; a0005b9c: ea000009 b a0005bc8 <== NOT EXECUTED case LIO_WRITE: result = pwrite (req->aiocbp->aio_fildes, a0005ba0: e5921008 ldr r1, [r2, #8] <== NOT EXECUTED a0005ba4: e5923004 ldr r3, [r2, #4] <== NOT EXECUTED a0005ba8: e58d1000 str r1, [sp] <== NOT EXECUTED a0005bac: e592100c ldr r1, [r2, #12] <== NOT EXECUTED a0005bb0: e5920000 ldr r0, [r2] <== NOT EXECUTED a0005bb4: e5922010 ldr r2, [r2, #16] <== NOT EXECUTED a0005bb8: eb002983 bl a00101cc <== NOT EXECUTED (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; a0005bbc: ea000001 b a0005bc8 <== NOT EXECUTED case LIO_SYNC: result = fsync (req->aiocbp->aio_fildes); a0005bc0: e5920000 ldr r0, [r2] <== NOT EXECUTED a0005bc4: eb00197f bl a000c1c8 <== NOT EXECUTED break; default: result = -1; } if (result == -1) { a0005bc8: e3700001 cmn r0, #1 <== NOT EXECUTED a0005bcc: 1a000006 bne a0005bec <== NOT EXECUTED req->aiocbp->return_value = -1; a0005bd0: e5955014 ldr r5, [r5, #20] <== NOT EXECUTED a0005bd4: e3e02000 mvn r2, #0 <== NOT EXECUTED a0005bd8: e5852034 str r2, [r5, #52] ; 0x34 <== NOT EXECUTED req->aiocbp->error_code = errno; a0005bdc: eb002630 bl a000f4a4 <__errno> <== NOT EXECUTED a0005be0: e5903000 ldr r3, [r0] <== NOT EXECUTED a0005be4: e5853030 str r3, [r5, #48] ; 0x30 <== NOT EXECUTED a0005be8: eaffffc5 b a0005b04 <== NOT EXECUTED } else { req->aiocbp->return_value = result; a0005bec: e5953014 ldr r3, [r5, #20] <== NOT EXECUTED req->aiocbp->error_code = 0; a0005bf0: e3a02000 mov r2, #0 <== NOT EXECUTED } if (result == -1) { req->aiocbp->return_value = -1; req->aiocbp->error_code = errno; } else { req->aiocbp->return_value = result; a0005bf4: e5830034 str r0, [r3, #52] ; 0x34 <== NOT EXECUTED req->aiocbp->error_code = 0; a0005bf8: e5832030 str r2, [r3, #48] ; 0x30 <== NOT EXECUTED a0005bfc: eaffffc0 b a0005b04 <== NOT EXECUTED wait for a signal on chain, this will unlock the queue. The fd chain is already unlocked */ struct timespec timeout; pthread_mutex_unlock (&r_chain->mutex); a0005c00: e1a0000a mov r0, sl <== NOT EXECUTED a0005c04: eb000309 bl a0006830 <== NOT EXECUTED pthread_mutex_lock (&aio_request_queue.mutex); a0005c08: e59f0138 ldr r0, [pc, #312] ; a0005d48 <== NOT EXECUTED a0005c0c: eb0002e8 bl a00067b4 <== NOT EXECUTED if (rtems_chain_is_empty (chain)) a0005c10: e5943008 ldr r3, [r4, #8] <== NOT EXECUTED a0005c14: e1530005 cmp r3, r5 <== NOT EXECUTED a0005c18: 1affffb9 bne a0005b04 <== NOT EXECUTED { clock_gettime (CLOCK_REALTIME, &timeout); a0005c1c: e1a01007 mov r1, r7 <== NOT EXECUTED a0005c20: e3a00001 mov r0, #1 <== NOT EXECUTED a0005c24: eb000152 bl a0006174 <== NOT EXECUTED timeout.tv_sec += 3; a0005c28: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, a0005c2c: e2845020 add r5, r4, #32 <== NOT EXECUTED a0005c30: e1a00005 mov r0, r5 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; a0005c34: e2833003 add r3, r3, #3 <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, a0005c38: e59f1108 ldr r1, [pc, #264] ; a0005d48 <== NOT EXECUTED a0005c3c: e1a02007 mov r2, r7 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; a0005c40: e58d3020 str r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; a0005c44: e58d8024 str r8, [sp, #36] ; 0x24 <== NOT EXECUTED result = pthread_cond_timedwait (&r_chain->cond, a0005c48: eb0001e1 bl a00063d4 <== NOT EXECUTED &aio_request_queue.mutex, &timeout); /* If no requests were added to the chain we delete the fd chain from the queue and start working with idle fd chains */ if (result == ETIMEDOUT) { a0005c4c: e3500074 cmp r0, #116 ; 0x74 <== NOT EXECUTED a0005c50: 1affffab bne a0005b04 <== NOT EXECUTED a0005c54: e1a00004 mov r0, r4 <== NOT EXECUTED a0005c58: eb0008f2 bl a0008028 <_Chain_Extract> <== NOT EXECUTED rtems_chain_extract (&r_chain->next_fd); pthread_mutex_destroy (&r_chain->mutex); a0005c5c: e1a0000a mov r0, sl <== NOT EXECUTED a0005c60: eb000230 bl a0006528 <== NOT EXECUTED pthread_cond_destroy (&r_chain->cond); a0005c64: e1a00005 mov r0, r5 <== NOT EXECUTED a0005c68: eb00015f bl a00061ec <== NOT EXECUTED free (r_chain); a0005c6c: e1a00004 mov r0, r4 <== NOT EXECUTED a0005c70: ebfff2f1 bl a000283c <== NOT EXECUTED /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { a0005c74: e5963054 ldr r3, [r6, #84] ; 0x54 <== NOT EXECUTED a0005c78: e153000b cmp r3, fp <== NOT EXECUTED a0005c7c: 1a00002b bne a0005d30 <== NOT EXECUTED ++aio_request_queue.idle_threads; a0005c80: e5963068 ldr r3, [r6, #104] ; 0x68 <== NOT EXECUTED clock_gettime (CLOCK_REALTIME, &timeout); a0005c84: e1a01007 mov r1, r7 <== NOT EXECUTED a0005c88: e3a00001 mov r0, #1 <== NOT EXECUTED free (r_chain); /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { ++aio_request_queue.idle_threads; a0005c8c: e2833001 add r3, r3, #1 <== NOT EXECUTED a0005c90: e5863068 str r3, [r6, #104] ; 0x68 <== NOT EXECUTED clock_gettime (CLOCK_REALTIME, &timeout); a0005c94: eb000136 bl a0006174 <== NOT EXECUTED timeout.tv_sec += 3; a0005c98: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, a0005c9c: e59f00a8 ldr r0, [pc, #168] ; a0005d4c <== NOT EXECUTED a0005ca0: e59f10a0 ldr r1, [pc, #160] ; a0005d48 <== NOT EXECUTED /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { ++aio_request_queue.idle_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; a0005ca4: e2833003 add r3, r3, #3 <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, a0005ca8: e1a02007 mov r2, r7 <== NOT EXECUTED /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { ++aio_request_queue.idle_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; a0005cac: e58d3020 str r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; a0005cb0: e58d8024 str r8, [sp, #36] ; 0x24 <== NOT EXECUTED result = pthread_cond_timedwait (&aio_request_queue.new_req, a0005cb4: eb0001c6 bl a00063d4 <== NOT EXECUTED &aio_request_queue.mutex, &timeout); /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { a0005cb8: e3500074 cmp r0, #116 ; 0x74 <== NOT EXECUTED a0005cbc: 1a000002 bne a0005ccc <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); a0005cc0: e59f0080 ldr r0, [pc, #128] ; a0005d48 <== NOT EXECUTED a0005cc4: eb0002d9 bl a0006830 <== NOT EXECUTED return NULL; a0005cc8: ea00001b b a0005d3c <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } a0005ccc: e5965054 ldr r5, [r6, #84] ; 0x54 <== NOT EXECUTED return NULL; } /* Otherwise move this chain to the working chain and start the loop all over again */ --aio_request_queue.idle_threads; a0005cd0: e5963068 ldr r3, [r6, #104] ; 0x68 <== NOT EXECUTED a0005cd4: e1a00005 mov r0, r5 <== NOT EXECUTED a0005cd8: e2433001 sub r3, r3, #1 <== NOT EXECUTED a0005cdc: e5863068 str r3, [r6, #104] ; 0x68 <== NOT EXECUTED a0005ce0: eb0008d0 bl a0008028 <_Chain_Extract> <== NOT EXECUTED node = rtems_chain_first (&aio_request_queue.idle_req); rtems_chain_extract (node); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, a0005ce4: e3a02001 mov r2, #1 <== NOT EXECUTED a0005ce8: e5951014 ldr r1, [r5, #20] <== NOT EXECUTED a0005cec: e59f005c ldr r0, [pc, #92] ; a0005d50 <== NOT EXECUTED a0005cf0: ebffff52 bl a0005a40 <== NOT EXECUTED ((rtems_aio_request_chain *)node)->fildes, 1); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); a0005cf4: e1a01008 mov r1, r8 <== NOT EXECUTED /* Otherwise move this chain to the working chain and start the loop all over again */ --aio_request_queue.idle_threads; node = rtems_chain_first (&aio_request_queue.idle_req); rtems_chain_extract (node); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, a0005cf8: e1a04000 mov r4, r0 <== NOT EXECUTED ((rtems_aio_request_chain *)node)->fildes, 1); r_chain->new_fd = 0; a0005cfc: e5808018 str r8, [r0, #24] <== NOT EXECUTED pthread_mutex_init (&r_chain->mutex, NULL); a0005d00: e280001c add r0, r0, #28 <== NOT EXECUTED a0005d04: eb000257 bl a0006668 <== NOT EXECUTED pthread_cond_init (&r_chain->cond, NULL); a0005d08: e2840020 add r0, r4, #32 <== NOT EXECUTED a0005d0c: e1a01008 mov r1, r8 <== NOT EXECUTED a0005d10: eb000167 bl a00062b4 <== NOT EXECUTED r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd; a0005d14: e5953008 ldr r3, [r5, #8] <== NOT EXECUTED a0005d18: e5843008 str r3, [r4, #8] <== NOT EXECUTED a0005d1c: e595300c ldr r3, [r5, #12] <== NOT EXECUTED a0005d20: e584300c str r3, [r4, #12] <== NOT EXECUTED a0005d24: e5953010 ldr r3, [r5, #16] <== NOT EXECUTED a0005d28: e5843010 str r3, [r4, #16] <== NOT EXECUTED a0005d2c: eaffff74 b a0005b04 <== NOT EXECUTED } else /* If there was a request added in the initial fd chain then release the mutex and process it */ pthread_mutex_unlock (&aio_request_queue.mutex); a0005d30: e59f0010 ldr r0, [pc, #16] ; a0005d48 <== NOT EXECUTED a0005d34: eb0002bd bl a0006830 <== NOT EXECUTED a0005d38: eaffff71 b a0005b04 <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } a0005d3c: e3a00000 mov r0, #0 <== NOT EXECUTED a0005d40: e28dd02c add sp, sp, #44 ; 0x2c <== NOT EXECUTED a0005d44: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED =============================================================================== a0005978 : * 0 - if initialization succeeded */ int rtems_aio_init (void) { a0005978: e92d4010 push {r4, lr} int result = 0; result = pthread_attr_init (&aio_request_queue.attr); a000597c: e59f00ac ldr r0, [pc, #172] ; a0005a30 a0005980: eb0003ec bl a0006938 if (result != 0) a0005984: e2504000 subs r4, r0, #0 a0005988: 1a000026 bne a0005a28 return result; result = a000598c: e59f009c ldr r0, [pc, #156] ; a0005a30 a0005990: e1a01004 mov r1, r4 a0005994: eb0003f9 bl a0006980 pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) a0005998: e3500000 cmp r0, #0 a000599c: 0a000001 beq a00059a8 pthread_attr_destroy (&aio_request_queue.attr); a00059a0: e59f0088 ldr r0, [pc, #136] ; a0005a30 <== NOT EXECUTED a00059a4: eb0003da bl a0006914 <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); a00059a8: e59f0084 ldr r0, [pc, #132] ; a0005a34 a00059ac: e3a01000 mov r1, #0 a00059b0: eb00032c bl a0006668 if (result != 0) a00059b4: e3500000 cmp r0, #0 a00059b8: 0a000001 beq a00059c4 pthread_attr_destroy (&aio_request_queue.attr); a00059bc: e59f006c ldr r0, [pc, #108] ; a0005a30 <== NOT EXECUTED a00059c0: eb0003d3 bl a0006914 <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); a00059c4: e59f006c ldr r0, [pc, #108] ; a0005a38 a00059c8: e3a01000 mov r1, #0 a00059cc: eb000238 bl a00062b4 if (result != 0) { a00059d0: e2504000 subs r4, r0, #0 a00059d4: 0a000003 beq a00059e8 pthread_mutex_destroy (&aio_request_queue.mutex); a00059d8: e59f0054 ldr r0, [pc, #84] ; a0005a34 <== NOT EXECUTED a00059dc: eb0002d1 bl a0006528 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); a00059e0: e59f0048 ldr r0, [pc, #72] ; a0005a30 <== NOT EXECUTED a00059e4: eb0003ca bl a0006914 <== NOT EXECUTED ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; a00059e8: e59f3044 ldr r3, [pc, #68] ; a0005a34 a00059ec: e283204c add r2, r3, #76 ; 0x4c a00059f0: e5832048 str r2, [r3, #72] ; 0x48 head->previous = NULL; a00059f4: e3a02000 mov r2, #0 tail->previous = head; a00059f8: e2831048 add r1, r3, #72 ; 0x48 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; a00059fc: e583204c str r2, [r3, #76] ; 0x4c a0005a00: e5832058 str r2, [r3, #88] ; 0x58 } rtems_chain_initialize_empty (&aio_request_queue.work_req); rtems_chain_initialize_empty (&aio_request_queue.idle_req); aio_request_queue.active_threads = 0; a0005a04: e5832064 str r2, [r3, #100] ; 0x64 aio_request_queue.idle_threads = 0; a0005a08: e5832068 str r2, [r3, #104] ; 0x68 aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; a0005a0c: e59f2028 ldr r2, [pc, #40] ; a0005a3c tail->previous = head; a0005a10: e5831050 str r1, [r3, #80] ; 0x50 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; a0005a14: e2831058 add r1, r3, #88 ; 0x58 a0005a18: e5831054 str r1, [r3, #84] ; 0x54 head->previous = NULL; tail->previous = head; a0005a1c: e2831054 add r1, r3, #84 ; 0x54 a0005a20: e583105c str r1, [r3, #92] ; 0x5c a0005a24: e5832060 str r2, [r3, #96] ; 0x60 return result; } a0005a28: e1a00004 mov r0, r4 a0005a2c: e8bd8010 pop {r4, pc} =============================================================================== a0005d54 : a0005d54: e1a02000 mov r2, r0 a0005d58: e4923004 ldr r3, [r2], #4 * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { a0005d5c: e1a0c001 mov ip, r1 rtems_chain_node *node; AIO_printf ("FD exists \n"); node = rtems_chain_first (chain); if (rtems_chain_is_empty (chain)) { a0005d60: e1530002 cmp r3, r2 a0005d64: 0a00000d beq a0005da0 AIO_printf ("First in chain \n"); rtems_chain_prepend (chain, &req->next_prio); } else { AIO_printf ("Add by priority \n"); int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; a0005d68: e5931014 ldr r1, [r3, #20] while (req->aiocbp->aio_reqprio > prio && a0005d6c: e59c0014 ldr r0, [ip, #20] if (rtems_chain_is_empty (chain)) { AIO_printf ("First in chain \n"); rtems_chain_prepend (chain, &req->next_prio); } else { AIO_printf ("Add by priority \n"); int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; a0005d70: e5911014 ldr r1, [r1, #20] while (req->aiocbp->aio_reqprio > prio && a0005d74: e5900014 ldr r0, [r0, #20] a0005d78: ea000002 b a0005d88 } AIO_printf ("Thread finished\n"); return NULL; } a0005d7c: e5933000 ldr r3, [r3] <== NOT EXECUTED int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; while (req->aiocbp->aio_reqprio > prio && !rtems_chain_is_tail (chain, node)) { node = rtems_chain_next (node); prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; a0005d80: e5931014 ldr r1, [r3, #20] <== NOT EXECUTED a0005d84: e5911014 ldr r1, [r1, #20] <== NOT EXECUTED rtems_chain_prepend (chain, &req->next_prio); } else { AIO_printf ("Add by priority \n"); int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; while (req->aiocbp->aio_reqprio > prio && a0005d88: e1500001 cmp r0, r1 a0005d8c: da000001 ble a0005d98 a0005d90: e1530002 cmp r3, r2 a0005d94: 1afffff8 bne a0005d7c RTEMS_INLINE_ROUTINE void rtems_chain_insert( rtems_chain_node *after_node, rtems_chain_node *the_node ) { _Chain_Insert( after_node, the_node ); a0005d98: e5930004 ldr r0, [r3, #4] a0005d9c: e1a0100c mov r1, ip a0005da0: ea0008b5 b a000807c <_Chain_Insert> =============================================================================== a0005da4 : * Output parameters: * NONE */ void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain) { a0005da4: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); a0005da8: e280700c add r7, r0, #12 <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } a0005dac: e5904008 ldr r4, [r0, #8] <== NOT EXECUTED while (!rtems_chain_is_tail (chain, node)) { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; req->aiocbp->error_code = ECANCELED; a0005db0: e3a0608c mov r6, #140 ; 0x8c <== NOT EXECUTED req->aiocbp->return_value = -1; a0005db4: e3e05000 mvn r5, #0 <== NOT EXECUTED rtems_chain_node *node; chain = &r_chain->perfd; node = rtems_chain_first (chain); while (!rtems_chain_is_tail (chain, node)) a0005db8: ea000006 b a0005dd8 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); a0005dbc: e1a00004 mov r0, r4 <== NOT EXECUTED a0005dc0: eb000898 bl a0008028 <_Chain_Extract> <== NOT EXECUTED { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; req->aiocbp->error_code = ECANCELED; a0005dc4: e5943014 ldr r3, [r4, #20] <== NOT EXECUTED req->aiocbp->return_value = -1; free (req); a0005dc8: e1a00004 mov r0, r4 <== NOT EXECUTED while (!rtems_chain_is_tail (chain, node)) { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; req->aiocbp->error_code = ECANCELED; a0005dcc: e5836030 str r6, [r3, #48] ; 0x30 <== NOT EXECUTED req->aiocbp->return_value = -1; a0005dd0: e5835034 str r5, [r3, #52] ; 0x34 <== NOT EXECUTED free (req); a0005dd4: ebfff298 bl a000283c <== NOT EXECUTED rtems_chain_node *node; chain = &r_chain->perfd; node = rtems_chain_first (chain); while (!rtems_chain_is_tail (chain, node)) a0005dd8: e1540007 cmp r4, r7 <== NOT EXECUTED a0005ddc: 1afffff6 bne a0005dbc <== NOT EXECUTED rtems_aio_request *req = (rtems_aio_request *) node; req->aiocbp->error_code = ECANCELED; req->aiocbp->return_value = -1; free (req); } } a0005de0: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED =============================================================================== a0005de4 : * AIO_NOTCANCELED - if request was not canceled * AIO_CANCELED - if request was canceled */ int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp) { a0005de4: e92d4010 push {r4, lr} <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } a0005de8: e4904004 ldr r4, [r0], #4 <== NOT EXECUTED rtems_chain_node *node = rtems_chain_first (chain); rtems_aio_request *current; current = (rtems_aio_request *) node; while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { a0005dec: ea000000 b a0005df4 <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } a0005df0: e5944000 ldr r4, [r4] <== NOT EXECUTED rtems_chain_node *node = rtems_chain_first (chain); rtems_aio_request *current; current = (rtems_aio_request *) node; while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { a0005df4: e1540000 cmp r4, r0 <== NOT EXECUTED a0005df8: 0a00000d beq a0005e34 <== NOT EXECUTED a0005dfc: e5943014 ldr r3, [r4, #20] <== NOT EXECUTED a0005e00: e1530001 cmp r3, r1 <== NOT EXECUTED a0005e04: 1afffff9 bne a0005df0 <== NOT EXECUTED a0005e08: e1a00004 mov r0, r4 <== NOT EXECUTED a0005e0c: eb000885 bl a0008028 <_Chain_Extract> <== NOT EXECUTED if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; a0005e10: e5943014 ldr r3, [r4, #20] <== NOT EXECUTED a0005e14: e3a0208c mov r2, #140 ; 0x8c <== NOT EXECUTED current->aiocbp->return_value = -1; free (current); a0005e18: e1a00004 mov r0, r4 <== NOT EXECUTED if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; a0005e1c: e5832030 str r2, [r3, #48] ; 0x30 <== NOT EXECUTED current->aiocbp->return_value = -1; a0005e20: e3e02000 mvn r2, #0 <== NOT EXECUTED a0005e24: e5832034 str r2, [r3, #52] ; 0x34 <== NOT EXECUTED free (current); a0005e28: ebfff283 bl a000283c <== NOT EXECUTED } return AIO_CANCELED; a0005e2c: e3a00000 mov r0, #0 <== NOT EXECUTED a0005e30: e8bd8010 pop {r4, pc} <== NOT EXECUTED node = rtems_chain_next (node); current = (rtems_aio_request *) node; } if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; a0005e34: e3a00001 mov r0, #1 <== NOT EXECUTED current->aiocbp->return_value = -1; free (current); } return AIO_CANCELED; } a0005e38: e8bd8010 pop {r4, pc} <== NOT EXECUTED =============================================================================== a0005b10 : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { a0005b10: e92d4030 push {r4, r5, lr} a0005b14: e1a04002 mov r4, r2 a0005b18: e1a05003 mov r5, r3 RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check( rtems_chain_control *chain, rtems_chain_node *node ) { return _Chain_Append_with_empty_check( chain, node ); a0005b1c: eb00013a bl a000600c <_Chain_Append_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_append_with_empty_check( chain, node ); if ( was_empty ) { a0005b20: e3500000 cmp r0, #0 a0005b24: 0a000003 beq a0005b38 sc = rtems_event_send( task, events ); a0005b28: e1a00004 mov r0, r4 a0005b2c: e1a01005 mov r1, r5 } return sc; } a0005b30: e8bd4030 pop {r4, r5, lr} { rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_append_with_empty_check( chain, node ); if ( was_empty ) { sc = rtems_event_send( task, events ); a0005b34: eafffda5 b a00051d0 } return sc; } a0005b38: e8bd8030 pop {r4, r5, pc} =============================================================================== a0005bc0 : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { a0005bc0: e92d4030 push {r4, r5, lr} a0005bc4: e1a04002 mov r4, r2 a0005bc8: e1a05003 mov r5, r3 RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check( rtems_chain_control *chain, rtems_chain_node *node ) { return _Chain_Prepend_with_empty_check( chain, node ); a0005bcc: eb00015d bl a0006148 <_Chain_Prepend_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_prepend_with_empty_check( chain, node ); if (was_empty) { a0005bd0: e3500000 cmp r0, #0 a0005bd4: 0a000003 beq a0005be8 sc = rtems_event_send( task, events ); a0005bd8: e1a00004 mov r0, r4 a0005bdc: e1a01005 mov r1, r5 } return sc; } a0005be0: e8bd4030 pop {r4, r5, lr} { rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_prepend_with_empty_check( chain, node ); if (was_empty) { sc = rtems_event_send( task, events ); a0005be4: eafffd79 b a00051d0 } return sc; } a0005be8: e8bd8030 pop {r4, r5, pc} =============================================================================== a0005710 : struct sigaction *oact ) { ISR_Level level; if ( oact ) a0005710: e3520000 cmp r2, #0 int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { a0005714: e92d40f0 push {r4, r5, r6, r7, lr} a0005718: e1a04000 mov r4, r0 a000571c: e1a05001 mov r5, r1 ISR_Level level; if ( oact ) a0005720: 0a00000a beq a0005750 *oact = _POSIX_signals_Vectors[ sig ]; a0005724: e3a0300c mov r3, #12 a0005728: e0030394 mul r3, r4, r3 a000572c: e59f00dc ldr r0, [pc, #220] ; a0005810 a0005730: e0801003 add r1, r0, r3 a0005734: e7900003 ldr r0, [r0, r3] a0005738: e1a03002 mov r3, r2 a000573c: e4830004 str r0, [r3], #4 a0005740: e5910004 ldr r0, [r1, #4] a0005744: e5820004 str r0, [r2, #4] a0005748: e5912008 ldr r2, [r1, #8] a000574c: e5832004 str r2, [r3, #4] if ( !sig ) a0005750: e3540000 cmp r4, #0 a0005754: 0a000004 beq a000576c static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); a0005758: e2443001 sub r3, r4, #1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) a000575c: e353001f cmp r3, #31 a0005760: 8a000001 bhi a000576c * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) a0005764: e3540009 cmp r4, #9 a0005768: 1a000004 bne a0005780 rtems_set_errno_and_return_minus_one( EINVAL ); a000576c: eb00218a bl a000dd9c <__errno> a0005770: e3a03016 mov r3, #22 a0005774: e5803000 str r3, [r0] a0005778: e3e00000 mvn r0, #0 a000577c: e8bd80f0 pop {r4, r5, r6, r7, pc} /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { a0005780: e3550000 cmp r5, #0 a0005784: 0a00001f beq a0005808 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( a0005788: e10f7000 mrs r7, CPSR a000578c: e3873080 orr r3, r7, #128 ; 0x80 a0005790: e129f003 msr CPSR_fc, r3 * Unless the user is installing the default signal actions, then * we can just copy the provided sigaction structure into the vectors. */ _ISR_Disable( level ); if ( act->sa_handler == SIG_DFL ) { a0005794: e5953008 ldr r3, [r5, #8] a0005798: e59f6070 ldr r6, [pc, #112] ; a0005810 a000579c: e3530000 cmp r3, #0 a00057a0: 1a000009 bne a00057cc _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; a00057a4: e283300c add r3, r3, #12 a00057a8: e0040493 mul r4, r3, r4 a00057ac: e59f1060 ldr r1, [pc, #96] ; a0005814 a00057b0: e0863004 add r3, r6, r4 a00057b4: e0812004 add r2, r1, r4 a00057b8: e7911004 ldr r1, [r1, r4] a00057bc: e7861004 str r1, [r6, r4] a00057c0: e9920006 ldmib r2, {r1, r2} a00057c4: e9830006 stmib r3, {r1, r2} a00057c8: ea00000b b a00057fc } else { _POSIX_signals_Clear_process_signals( sig ); a00057cc: e1a00004 mov r0, r4 a00057d0: eb0015cd bl a000af0c <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; a00057d4: e3a0300c mov r3, #12 a00057d8: e0040493 mul r4, r3, r4 a00057dc: e1a03005 mov r3, r5 a00057e0: e4931004 ldr r1, [r3], #4 a00057e4: e0862004 add r2, r6, r4 a00057e8: e7861004 str r1, [r6, r4] a00057ec: e5951004 ldr r1, [r5, #4] a00057f0: e5821004 str r1, [r2, #4] a00057f4: e5933004 ldr r3, [r3, #4] a00057f8: e5823008 str r3, [r2, #8] static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( a00057fc: e129f007 msr CPSR_fc, r7 * now (signals not posted when SIG_IGN). * + If we are now ignoring a signal that was previously pending, * we clear the pending signal indicator. */ return 0; a0005800: e3a00000 mov r0, #0 a0005804: e8bd80f0 pop {r4, r5, r6, r7, pc} a0005808: e1a00005 mov r0, r5 } a000580c: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED =============================================================================== a0007e20 : int sigwait( const sigset_t *set, int *sig ) { a0007e20: e92d4010 push {r4, lr} a0007e24: e1a04001 mov r4, r1 int status; status = sigtimedwait( set, NULL, NULL ); a0007e28: e3a01000 mov r1, #0 a0007e2c: e1a02001 mov r2, r1 a0007e30: ebffff84 bl a0007c48 if ( status != -1 ) { a0007e34: e3700001 cmn r0, #1 a0007e38: 0a000004 beq a0007e50 if ( sig ) a0007e3c: e3540000 cmp r4, #0 a0007e40: 0a000005 beq a0007e5c *sig = status; a0007e44: e5840000 str r0, [r4] return 0; a0007e48: e3a00000 mov r0, #0 a0007e4c: e8bd8010 pop {r4, pc} } return errno; a0007e50: eb0020b1 bl a001011c <__errno> a0007e54: e5900000 ldr r0, [r0] a0007e58: e8bd8010 pop {r4, pc} status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) *sig = status; return 0; a0007e5c: e1a00004 mov r0, r4 <== NOT EXECUTED } return errno; } a0007e60: e8bd8010 pop {r4, pc} <== NOT EXECUTED