=============================================================================== 00014b3c <_CORE_message_queue_Broadcast>: { Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 14b3c: 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 ) { 14b40: 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 ) { 14b44: 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 ) { 14b48: e1a06000 mov r6, r0 14b4c: e1a0a001 mov sl, r1 14b50: e1a07002 mov r7, r2 14b54: 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 ) { 14b58: 8a000013 bhi 14bac <_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 ) { 14b5c: e5905048 ldr r5, [r0, #72] ; 0x48 14b60: e3550000 cmp r5, #0 *count = 0; 14b64: 13a00000 movne r0, #0 14b68: 15880000 strne r0, [r8] * 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 ) { 14b6c: 0a000007 beq 14b90 <_CORE_message_queue_Broadcast+0x54> 14b70: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 14b74: e594002c ldr r0, [r4, #44] ; 0x2c 14b78: e1a0100a mov r1, sl 14b7c: e1a02007 mov r2, r7 14b80: eb00222b bl 1d434 buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; 14b84: e5943028 ldr r3, [r4, #40] ; 0x28 14b88: e5837000 str r7, [r3] */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { waitp = &the_thread->Wait; number_broadcasted += 1; 14b8c: e2855001 add r5, r5, #1 /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = 14b90: e1a00006 mov r0, r6 14b94: eb0009df bl 17318 <_Thread_queue_Dequeue> 14b98: e2504000 subs r4, r0, #0 14b9c: 1afffff4 bne 14b74 <_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; 14ba0: e5885000 str r5, [r8] return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 14ba4: e1a00004 mov r0, r4 14ba8: 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; 14bac: e3a00001 mov r0, #1 <== NOT EXECUTED #endif } *count = number_broadcasted; return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; } 14bb0: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED =============================================================================== 00006c9c <_Heap_Walk>: bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 6c9c: 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; 6ca0: e5903014 ldr r3, [r0, #20] bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 6ca4: e24dd030 sub sp, sp, #48 ; 0x30 uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; 6ca8: e58d3024 str r3, [sp, #36] ; 0x24 Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; 6cac: e5903024 ldr r3, [r0, #36] ; 0x24 Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 6cb0: e59f4500 ldr r4, [pc, #1280] ; 71b8 <_Heap_Walk+0x51c> ) { 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; Heap_Block *const last_block = heap->last_block; 6cb4: e58d3028 str r3, [sp, #40] ; 0x28 Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 6cb8: e59f34fc ldr r3, [pc, #1276] ; 71bc <_Heap_Walk+0x520> 6cbc: e31200ff tst r2, #255 ; 0xff 6cc0: 11a04003 movne r4, r3 if ( !_System_state_Is_up( _System_state_Get() ) ) { 6cc4: e59f34f4 ldr r3, [pc, #1268] ; 71c0 <_Heap_Walk+0x524> 6cc8: e5933000 ldr r3, [r3] 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; 6ccc: e590c020 ldr ip, [r0, #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() ) ) { 6cd0: e3530003 cmp r3, #3 bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 6cd4: e1a06000 mov r6, r0 6cd8: e1a05001 mov r5, r1 uintptr_t const page_size = heap->page_size; 6cdc: e5909010 ldr r9, [r0, #16] uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const first_block = heap->first_block; 6ce0: 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() ) ) { 6ce4: 1a000127 bne 7188 <_Heap_Walk+0x4ec> 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)( 6ce8: e59dc024 ldr ip, [sp, #36] ; 0x24 6cec: e58dc000 str ip, [sp] 6cf0: e5903018 ldr r3, [r0, #24] 6cf4: e58d3004 str r3, [sp, #4] 6cf8: e590301c ldr r3, [r0, #28] 6cfc: e59d2020 ldr r2, [sp, #32] 6d00: e58d3008 str r3, [sp, #8] 6d04: e59d3028 ldr r3, [sp, #40] ; 0x28 6d08: e58d200c str r2, [sp, #12] 6d0c: e58d3010 str r3, [sp, #16] 6d10: e5903008 ldr r3, [r0, #8] 6d14: e58d3014 str r3, [sp, #20] 6d18: e590300c ldr r3, [r0, #12] 6d1c: e59f24a0 ldr r2, [pc, #1184] ; 71c4 <_Heap_Walk+0x528> 6d20: e58d3018 str r3, [sp, #24] 6d24: e1a00001 mov r0, r1 6d28: e1a03009 mov r3, r9 6d2c: e3a01000 mov r1, #0 6d30: e1a0e00f mov lr, pc 6d34: e12fff14 bx r4 heap->area_begin, heap->area_end, first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { 6d38: e3590000 cmp r9, #0 6d3c: 1a000006 bne 6d5c <_Heap_Walk+0xc0> (*printer)( source, true, "page size is zero\n" ); 6d40: e1a00005 mov r0, r5 6d44: e3a01001 mov r1, #1 6d48: e59f2478 ldr r2, [pc, #1144] ; 71c8 <_Heap_Walk+0x52c> 6d4c: e1a0e00f mov lr, pc 6d50: e12fff14 bx r4 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 6d54: e1a08009 mov r8, r9 6d58: ea00010b b 718c <_Heap_Walk+0x4f0> (*printer)( source, true, "page size is zero\n" ); return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { 6d5c: e2198003 ands r8, r9, #3 (*printer)( 6d60: 11a00005 movne r0, r5 6d64: 13a01001 movne r1, #1 6d68: 159f245c ldrne r2, [pc, #1116] ; 71cc <_Heap_Walk+0x530> 6d6c: 11a03009 movne r3, r9 6d70: 1a00010c bne 71a8 <_Heap_Walk+0x50c> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 6d74: e59d0024 ldr r0, [sp, #36] ; 0x24 6d78: e1a01009 mov r1, r9 6d7c: ebffe788 bl ba4 <__umodsi3> ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { 6d80: e250b000 subs fp, r0, #0 6d84: 0a000006 beq 6da4 <_Heap_Walk+0x108> (*printer)( 6d88: e1a00005 mov r0, r5 6d8c: e3a01001 mov r1, #1 6d90: e59f2438 ldr r2, [pc, #1080] ; 71d0 <_Heap_Walk+0x534> 6d94: e59d3024 ldr r3, [sp, #36] ; 0x24 6d98: e1a0e00f mov lr, pc 6d9c: e12fff14 bx r4 6da0: ea0000f9 b 718c <_Heap_Walk+0x4f0> 6da4: e59dc020 ldr ip, [sp, #32] 6da8: e1a01009 mov r1, r9 6dac: e28c0008 add r0, ip, #8 6db0: ebffe77b bl ba4 <__umodsi3> ); return false; } if ( 6db4: e250a000 subs sl, r0, #0 !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( 6db8: 11a00005 movne r0, r5 6dbc: 13a01001 movne r1, #1 6dc0: 159f240c ldrne r2, [pc, #1036] ; 71d4 <_Heap_Walk+0x538> 6dc4: 159d3020 ldrne r3, [sp, #32] 6dc8: 1a0000cc bne 7100 <_Heap_Walk+0x464> 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; 6dcc: e59d2020 ldr r2, [sp, #32] 6dd0: e5928004 ldr r8, [r2, #4] ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { 6dd4: e2188001 ands r8, r8, #1 (*printer)( 6dd8: 01a00005 moveq r0, r5 6ddc: 03a01001 moveq r1, #1 6de0: 059f23f0 ldreq r2, [pc, #1008] ; 71d8 <_Heap_Walk+0x53c> 6de4: 0a000009 beq 6e10 <_Heap_Walk+0x174> - 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; 6de8: e59d3028 ldr r3, [sp, #40] ; 0x28 6dec: e5937004 ldr r7, [r3, #4] 6df0: 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); 6df4: 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; 6df8: e5978004 ldr r8, [r7, #4] ); return false; } if ( _Heap_Is_free( last_block ) ) { 6dfc: e2188001 ands r8, r8, #1 6e00: 1a000005 bne 6e1c <_Heap_Walk+0x180> (*printer)( 6e04: e59f23d0 ldr r2, [pc, #976] ; 71dc <_Heap_Walk+0x540> 6e08: e1a00005 mov r0, r5 6e0c: e3a01001 mov r1, #1 6e10: e1a0e00f mov lr, pc 6e14: e12fff14 bx r4 6e18: ea0000db b 718c <_Heap_Walk+0x4f0> ); return false; } if ( 6e1c: e59dc020 ldr ip, [sp, #32] 6e20: e157000c cmp r7, ip 6e24: 0a000006 beq 6e44 <_Heap_Walk+0x1a8> _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block ) { (*printer)( 6e28: e1a00005 mov r0, r5 <== NOT EXECUTED 6e2c: e3a01001 mov r1, #1 <== NOT EXECUTED 6e30: e59f23a8 ldr r2, [pc, #936] ; 71e0 <_Heap_Walk+0x544> <== NOT EXECUTED 6e34: e1a0e00f mov lr, pc <== NOT EXECUTED 6e38: e12fff14 bx r4 <== NOT EXECUTED if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 6e3c: e1a0800a mov r8, sl <== NOT EXECUTED 6e40: ea0000d1 b 718c <_Heap_Walk+0x4f0> <== NOT EXECUTED int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; 6e44: e596b010 ldr fp, [r6, #16] block = next_block; } while ( block != first_block ); return true; } 6e48: 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 ); 6e4c: e1a0a006 mov sl, r6 6e50: ea000034 b 6f28 <_Heap_Walk+0x28c> 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; 6e54: e5963020 ldr r3, [r6, #32] 6e58: e1530008 cmp r3, r8 6e5c: 83a0c000 movhi ip, #0 6e60: 8a000003 bhi 6e74 <_Heap_Walk+0x1d8> 6e64: e596c024 ldr ip, [r6, #36] ; 0x24 6e68: e15c0008 cmp ip, r8 6e6c: 33a0c000 movcc ip, #0 6e70: 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 ) ) { 6e74: e21cc0ff ands ip, ip, #255 ; 0xff (*printer)( 6e78: 01a00005 moveq r0, r5 6e7c: 03a01001 moveq r1, #1 6e80: 059f235c ldreq r2, [pc, #860] ; 71e4 <_Heap_Walk+0x548> 6e84: 0a000012 beq 6ed4 <_Heap_Walk+0x238> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 6e88: e2880008 add r0, r8, #8 6e8c: e1a0100b mov r1, fp 6e90: ebffe743 bl ba4 <__umodsi3> ); return false; } if ( 6e94: e250c000 subs ip, r0, #0 !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( 6e98: 11a00005 movne r0, r5 6e9c: 13a01001 movne r1, #1 6ea0: 159f2340 ldrne r2, [pc, #832] ; 71e8 <_Heap_Walk+0x54c> 6ea4: 11a03008 movne r3, r8 6ea8: 1a0000be bne 71a8 <_Heap_Walk+0x50c> - 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; 6eac: e5983004 ldr r3, [r8, #4] 6eb0: e3c33001 bic r3, r3, #1 block = next_block; } while ( block != first_block ); return true; } 6eb4: 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; 6eb8: e5933004 ldr r3, [r3, #4] ); return false; } if ( _Heap_Is_used( free_block ) ) { 6ebc: e2133001 ands r3, r3, #1 6ec0: e58d302c str r3, [sp, #44] ; 0x2c 6ec4: 0a000009 beq 6ef0 <_Heap_Walk+0x254> (*printer)( 6ec8: e59f231c ldr r2, [pc, #796] ; 71ec <_Heap_Walk+0x550> 6ecc: e1a00005 mov r0, r5 6ed0: e3a01001 mov r1, #1 6ed4: e1a03008 mov r3, r8 6ed8: e58dc01c str ip, [sp, #28] 6edc: e1a0e00f mov lr, pc 6ee0: e12fff14 bx r4 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 6ee4: e59dc01c ldr ip, [sp, #28] 6ee8: e1a0800c mov r8, ip 6eec: ea0000a6 b 718c <_Heap_Walk+0x4f0> ); return false; } if ( free_block->prev != prev_block ) { 6ef0: e598300c ldr r3, [r8, #12] 6ef4: e153000a cmp r3, sl 6ef8: 0a000008 beq 6f20 <_Heap_Walk+0x284> (*printer)( 6efc: e58d3000 str r3, [sp] 6f00: e1a00005 mov r0, r5 6f04: e1a03008 mov r3, r8 6f08: e3a01001 mov r1, #1 6f0c: e59f22dc ldr r2, [pc, #732] ; 71f0 <_Heap_Walk+0x554> 6f10: e1a0e00f mov lr, pc 6f14: e12fff14 bx r4 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 6f18: e59d802c ldr r8, [sp, #44] ; 0x2c 6f1c: ea00009a b 718c <_Heap_Walk+0x4f0> return false; } prev_block = free_block; free_block = free_block->next; 6f20: e1a0a008 mov sl, r8 6f24: 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 ) { 6f28: e1580006 cmp r8, r6 6f2c: 1affffc8 bne 6e54 <_Heap_Walk+0x1b8> 6f30: ea000000 b 6f38 <_Heap_Walk+0x29c> block->prev_size ); } block = next_block; } while ( block != first_block ); 6f34: e1a07008 mov r7, r8 return true; } 6f38: 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; 6f3c: 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; 6f40: 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); 6f44: 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; 6f48: e1520008 cmp r2, r8 6f4c: 83a0b000 movhi fp, #0 6f50: 8a000003 bhi 6f64 <_Heap_Walk+0x2c8> 6f54: e596b024 ldr fp, [r6, #36] ; 0x24 6f58: e15b0008 cmp fp, r8 6f5c: 33a0b000 movcc fp, #0 6f60: 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 ) ) { 6f64: e21bb0ff ands fp, fp, #255 ; 0xff 6f68: 1a000007 bne 6f8c <_Heap_Walk+0x2f0> (*printer)( 6f6c: e58d8000 str r8, [sp] 6f70: e1a00005 mov r0, r5 6f74: e3a01001 mov r1, #1 6f78: e59f2274 ldr r2, [pc, #628] ; 71f4 <_Heap_Walk+0x558> 6f7c: e1a03007 mov r3, r7 6f80: e1a0e00f mov lr, pc 6f84: e12fff14 bx r4 6f88: ea00005e b 7108 <_Heap_Walk+0x46c> 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; 6f8c: e59d2028 ldr r2, [sp, #40] ; 0x28 RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 6f90: e1a0000a mov r0, sl 6f94: e1a01009 mov r1, r9 6f98: e057b002 subs fp, r7, r2 6f9c: 13a0b001 movne fp, #1 6fa0: e58d301c str r3, [sp, #28] 6fa4: ebffe6fe bl ba4 <__umodsi3> ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { 6fa8: e3500000 cmp r0, #0 6fac: e59d301c ldr r3, [sp, #28] 6fb0: 0a000005 beq 6fcc <_Heap_Walk+0x330> 6fb4: e35b0000 cmp fp, #0 (*printer)( 6fb8: 158da000 strne sl, [sp] 6fbc: 11a00005 movne r0, r5 6fc0: 13a01001 movne r1, #1 6fc4: 159f222c ldrne r2, [pc, #556] ; 71f8 <_Heap_Walk+0x55c> 6fc8: 1a000014 bne 7020 <_Heap_Walk+0x384> ); return false; } if ( block_size < min_block_size && is_not_last_block ) { 6fcc: e59dc024 ldr ip, [sp, #36] ; 0x24 6fd0: e15a000c cmp sl, ip 6fd4: 2a000009 bcs 7000 <_Heap_Walk+0x364> 6fd8: e35b0000 cmp fp, #0 6fdc: 0a000007 beq 7000 <_Heap_Walk+0x364> (*printer)( 6fe0: e88d1400 stm sp, {sl, ip} 6fe4: e1a00005 mov r0, r5 6fe8: e3a01001 mov r1, #1 6fec: e59f2208 ldr r2, [pc, #520] ; 71fc <_Heap_Walk+0x560> 6ff0: e1a03007 mov r3, r7 6ff4: e1a0e00f mov lr, pc 6ff8: e12fff14 bx r4 6ffc: ea00006b b 71b0 <_Heap_Walk+0x514> ); return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { 7000: e1580007 cmp r8, r7 7004: 8a000009 bhi 7030 <_Heap_Walk+0x394> 7008: e35b0000 cmp fp, #0 700c: 0a000007 beq 7030 <_Heap_Walk+0x394> (*printer)( 7010: e58d8000 str r8, [sp] 7014: e59f21e4 ldr r2, [pc, #484] ; 7200 <_Heap_Walk+0x564> 7018: e1a00005 mov r0, r5 701c: e3a01001 mov r1, #1 7020: e1a03007 mov r3, r7 7024: e1a0e00f mov lr, pc 7028: e12fff14 bx r4 702c: ea00005f b 71b0 <_Heap_Walk+0x514> 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; 7030: e203b001 and fp, r3, #1 7034: e5983004 ldr r3, [r8, #4] ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 7038: e3130001 tst r3, #1 703c: 1a00003b bne 7130 <_Heap_Walk+0x494> 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 ? 7040: 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)( 7044: e5963008 ldr r3, [r6, #8] 7048: e1520003 cmp r2, r3 block = next_block; } while ( block != first_block ); return true; } 704c: 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)( 7050: 059f01ac ldreq r0, [pc, #428] ; 7204 <_Heap_Walk+0x568> 7054: 0a000003 beq 7068 <_Heap_Walk+0x3cc> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 7058: e59f31a8 ldr r3, [pc, #424] ; 7208 <_Heap_Walk+0x56c> 705c: e1520006 cmp r2, r6 7060: e59f01a4 ldr r0, [pc, #420] ; 720c <_Heap_Walk+0x570> 7064: 01a00003 moveq r0, r3 block->next, block->next == last_free_block ? 7068: 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)( 706c: e1530001 cmp r3, r1 7070: 059f1198 ldreq r1, [pc, #408] ; 7210 <_Heap_Walk+0x574> 7074: 0a000003 beq 7088 <_Heap_Walk+0x3ec> " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 7078: e59fc194 ldr ip, [pc, #404] ; 7214 <_Heap_Walk+0x578> 707c: e1530006 cmp r3, r6 7080: e59f1184 ldr r1, [pc, #388] ; 720c <_Heap_Walk+0x570> 7084: 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)( 7088: e58d2004 str r2, [sp, #4] 708c: e58d0008 str r0, [sp, #8] 7090: e58d300c str r3, [sp, #12] 7094: e58d1010 str r1, [sp, #16] 7098: e1a03007 mov r3, r7 709c: e58da000 str sl, [sp] 70a0: e1a00005 mov r0, r5 70a4: e3a01000 mov r1, #0 70a8: e59f2168 ldr r2, [pc, #360] ; 7218 <_Heap_Walk+0x57c> 70ac: e1a0e00f mov lr, pc 70b0: e12fff14 bx r4 block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { 70b4: e5983000 ldr r3, [r8] 70b8: e15a0003 cmp sl, r3 70bc: 0a000009 beq 70e8 <_Heap_Walk+0x44c> (*printer)( 70c0: e58d3004 str r3, [sp, #4] 70c4: e58da000 str sl, [sp] 70c8: e58d8008 str r8, [sp, #8] 70cc: e1a00005 mov r0, r5 70d0: e3a01001 mov r1, #1 70d4: e59f2140 ldr r2, [pc, #320] ; 721c <_Heap_Walk+0x580> 70d8: e1a03007 mov r3, r7 70dc: e1a0e00f mov lr, pc 70e0: e12fff14 bx r4 70e4: ea000031 b 71b0 <_Heap_Walk+0x514> ); return false; } if ( !prev_used ) { 70e8: e35b0000 cmp fp, #0 70ec: 1a000007 bne 7110 <_Heap_Walk+0x474> (*printer)( 70f0: e59f2128 ldr r2, [pc, #296] ; 7220 <_Heap_Walk+0x584> 70f4: e1a00005 mov r0, r5 70f8: e3a01001 mov r1, #1 70fc: e1a03007 mov r3, r7 7100: e1a0e00f mov lr, pc 7104: e12fff14 bx r4 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; 7108: e1a0800b mov r8, fp 710c: ea00001e b 718c <_Heap_Walk+0x4f0> block = next_block; } while ( block != first_block ); return true; } 7110: e5963008 ldr r3, [r6, #8] 7114: ea000002 b 7124 <_Heap_Walk+0x488> { 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 ) { 7118: e1530007 cmp r3, r7 711c: 0a000016 beq 717c <_Heap_Walk+0x4e0> return true; } free_block = free_block->next; 7120: 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 ) { 7124: e1530006 cmp r3, r6 7128: 1afffffa bne 7118 <_Heap_Walk+0x47c> 712c: ea000019 b 7198 <_Heap_Walk+0x4fc> if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { 7130: e35b0000 cmp fp, #0 7134: 0a000007 beq 7158 <_Heap_Walk+0x4bc> (*printer)( 7138: e58da000 str sl, [sp] 713c: e1a00005 mov r0, r5 7140: e3a01000 mov r1, #0 7144: e59f20d8 ldr r2, [pc, #216] ; 7224 <_Heap_Walk+0x588> 7148: e1a03007 mov r3, r7 714c: e1a0e00f mov lr, pc 7150: e12fff14 bx r4 7154: ea000008 b 717c <_Heap_Walk+0x4e0> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 7158: e58da000 str sl, [sp] 715c: e5973000 ldr r3, [r7] 7160: e1a00005 mov r0, r5 7164: e58d3004 str r3, [sp, #4] 7168: e1a0100b mov r1, fp 716c: e59f20b4 ldr r2, [pc, #180] ; 7228 <_Heap_Walk+0x58c> 7170: e1a03007 mov r3, r7 7174: e1a0e00f mov lr, pc 7178: e12fff14 bx r4 block->prev_size ); } block = next_block; } while ( block != first_block ); 717c: e59d2020 ldr r2, [sp, #32] 7180: e1580002 cmp r8, r2 7184: 1affff6a bne 6f34 <_Heap_Walk+0x298> 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; 7188: e3a08001 mov r8, #1 block = next_block; } while ( block != first_block ); return true; } 718c: e1a00008 mov r0, r8 7190: e28dd030 add sp, sp, #48 ; 0x30 7194: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( 7198: e59f208c ldr r2, [pc, #140] ; 722c <_Heap_Walk+0x590> 719c: e1a00005 mov r0, r5 71a0: e3a01001 mov r1, #1 71a4: e1a03007 mov r3, r7 71a8: e1a0e00f mov lr, pc 71ac: e12fff14 bx r4 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; 71b0: e3a08000 mov r8, #0 71b4: eafffff4 b 718c <_Heap_Walk+0x4f0> =============================================================================== 00020824 <_POSIX_signals_Unblock_thread>: bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 20824: e92d41f0 push {r4, r5, r6, r7, r8, lr} /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 20828: e5903010 ldr r3, [r0, #16] 2082c: e59f50f8 ldr r5, [pc, #248] ; 2092c <_POSIX_signals_Unblock_thread+0x108> 20830: e59f80f4 ldr r8, [pc, #244] ; 2092c <_POSIX_signals_Unblock_thread+0x108> 20834: e0035005 and r5, r3, r5 20838: e241c001 sub ip, r1, #1 2083c: e3a06001 mov r6, #1 20840: e1550008 cmp r5, r8 bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 20844: e1a04000 mov r4, r0 POSIX_API_Control *api; sigset_t mask; siginfo_t *the_info = NULL; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 20848: e5907108 ldr r7, [r0, #264] ; 0x108 2084c: e1a0cc16 lsl ip, r6, ip /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 20850: 1a000013 bne 208a4 <_POSIX_signals_Unblock_thread+0x80> if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { 20854: e5903030 ldr r3, [r0, #48] ; 0x30 20858: e11c0003 tst ip, r3 2085c: 1a000002 bne 2086c <_POSIX_signals_Unblock_thread+0x48> 20860: e59750d0 ldr r5, [r7, #208] ; 0xd0 20864: e1dc5005 bics r5, ip, r5 20868: 0a00002d beq 20924 <_POSIX_signals_Unblock_thread+0x100> the_thread->Wait.return_code = EINTR; 2086c: e3a03004 mov r3, #4 the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { 20870: e3520000 cmp r2, #0 */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { the_thread->Wait.return_code = EINTR; 20874: e5843034 str r3, [r4, #52] ; 0x34 the_info = (siginfo_t *) the_thread->Wait.return_argument; 20878: e5943028 ldr r3, [r4, #40] ; 0x28 if ( !info ) { the_info->si_signo = signo; the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; } else { *the_info = *info; 2087c: 18920007 ldmne r2, {r0, r1, r2} the_thread->Wait.return_code = EINTR; the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { the_info->si_signo = signo; 20880: 05831000 streq r1, [r3] the_info->si_code = SI_USER; 20884: 03a01001 moveq r1, #1 the_info->si_value.sival_int = 0; } else { *the_info = *info; 20888: 18830007 stmne r3, {r0, r1, r2} the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { the_info->si_signo = signo; the_info->si_code = SI_USER; 2088c: 05831004 streq r1, [r3, #4] the_info->si_value.sival_int = 0; 20890: 05832008 streq r2, [r3, #8] } else { *the_info = *info; } _Thread_queue_Extract_with_proxy( the_thread ); 20894: e1a00004 mov r0, r4 20898: ebffaf1c bl c510 <_Thread_queue_Extract_with_proxy> return true; 2089c: e3a05001 mov r5, #1 208a0: ea00001f b 20924 <_POSIX_signals_Unblock_thread+0x100> } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 208a4: e59750d0 ldr r5, [r7, #208] ; 0xd0 208a8: e1dc5005 bics r5, ip, r5 208ac: 0a00001c beq 20924 <_POSIX_signals_Unblock_thread+0x100> * it is not blocked, THEN * we need to dispatch at the end of this ISR. * + Any other combination, do nothing. */ if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) { 208b0: e2135201 ands r5, r3, #268435456 ; 0x10000000 208b4: 0a000010 beq 208fc <_POSIX_signals_Unblock_thread+0xd8> */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue ( States_Control the_states ) { return (the_states & STATES_WAITING_ON_THREAD_QUEUE); 208b8: e59f5070 ldr r5, [pc, #112] ; 20930 <_POSIX_signals_Unblock_thread+0x10c> 208bc: e0035005 and r5, r3, r5 the_thread->Wait.return_code = EINTR; 208c0: e3a02004 mov r2, #4 /* * In pthread_cond_wait, a thread will be blocking on a thread * queue, but is also interruptible by a POSIX signal. */ if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) ) 208c4: e3550000 cmp r5, #0 * we need to dispatch at the end of this ISR. * + Any other combination, do nothing. */ if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) { the_thread->Wait.return_code = EINTR; 208c8: e5802034 str r2, [r0, #52] ; 0x34 /* * In pthread_cond_wait, a thread will be blocking on a thread * queue, but is also interruptible by a POSIX signal. */ if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) ) 208cc: 0a000002 beq 208dc <_POSIX_signals_Unblock_thread+0xb8> _Thread_queue_Extract_with_proxy( the_thread ); 208d0: ebffaf0e bl c510 <_Thread_queue_Extract_with_proxy> <== NOT EXECUTED } else if ( the_thread->current_state == STATES_READY ) { if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } } return false; 208d4: e3a05000 mov r5, #0 <== NOT EXECUTED 208d8: ea000011 b 20924 <_POSIX_signals_Unblock_thread+0x100> <== NOT EXECUTED * In pthread_cond_wait, a thread will be blocking on a thread * queue, but is also interruptible by a POSIX signal. */ if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) ) _Thread_queue_Extract_with_proxy( the_thread ); else if ( _States_Is_delaying(the_thread->current_state) ) { 208dc: e2133008 ands r3, r3, #8 208e0: 0a00000e beq 20920 <_POSIX_signals_Unblock_thread+0xfc> (void) _Watchdog_Remove( &the_thread->Timer ); 208e4: e2800048 add r0, r0, #72 ; 0x48 208e8: ebffb1a3 bl cf7c <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 208ec: e1a00004 mov r0, r4 208f0: e59f103c ldr r1, [pc, #60] ; 20934 <_POSIX_signals_Unblock_thread+0x110> 208f4: ebffac64 bl ba8c <_Thread_Clear_state> 208f8: ea000009 b 20924 <_POSIX_signals_Unblock_thread+0x100> _Thread_Unblock( the_thread ); } } else if ( the_thread->current_state == STATES_READY ) { 208fc: e3530000 cmp r3, #0 20900: 1a000007 bne 20924 <_POSIX_signals_Unblock_thread+0x100> if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 20904: e59f202c ldr r2, [pc, #44] ; 20938 <_POSIX_signals_Unblock_thread+0x114> 20908: e5925000 ldr r5, [r2] 2090c: e3550000 cmp r5, #0 20910: 0a000003 beq 20924 <_POSIX_signals_Unblock_thread+0x100> 20914: e5921004 ldr r1, [r2, #4] 20918: e1500001 cmp r0, r1 _Thread_Dispatch_necessary = true; 2091c: 05c26010 strbeq r6, [r2, #16] } } return false; 20920: e1a05003 mov r5, r3 } 20924: e1a00005 mov r0, r5 20928: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} =============================================================================== 00007384 <_Thread_queue_Enqueue_priority>: 7384: e281303c add r3, r1, #60 ; 0x3c Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 7388: e591c014 ldr ip, [r1, #20] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 738c: e5813038 str r3, [r1, #56] ; 0x38 the_chain->permanent_null = NULL; 7390: e3a03000 mov r3, #0 7394: e581303c str r3, [r1, #60] ; 0x3c Chain_Node *previous_node; Chain_Node *search_node; Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); 7398: e2813038 add r3, r1, #56 ; 0x38 Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, ISR_Level *level_p ) { 739c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} the_chain->last = _Chain_Head(the_chain); 73a0: e5813040 str r3, [r1, #64] ; 0x40 _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; 73a4: e3a0400c mov r4, #12 RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number ( Priority_Control the_priority ) { return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER); 73a8: e1a0332c lsr r3, ip, #6 73ac: e0030394 mul r3, r4, r3 block_state = the_thread_queue->state; if ( _Thread_queue_Is_reverse_search( priority ) ) 73b0: e31c0020 tst ip, #32 _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; 73b4: e0807003 add r7, r0, r3 block_state = the_thread_queue->state; 73b8: e5908038 ldr r8, [r0, #56] ; 0x38 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 73bc: 159fa15c ldrne sl, [pc, #348] ; 7520 <_Thread_queue_Enqueue_priority+0x19c> _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; 73c0: 11a0b007 movne fp, r7 priority = the_thread->current_priority; header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; block_state = the_thread_queue->state; if ( _Thread_queue_Is_reverse_search( priority ) ) 73c4: 1a000024 bne 745c <_Thread_queue_Enqueue_priority+0xd8> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 73c8: e2833004 add r3, r3, #4 73cc: e080a003 add sl, r0, r3 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 73d0: e10f4000 mrs r4, CPSR 73d4: e3843080 orr r3, r4, #128 ; 0x80 73d8: e129f003 msr CPSR_fc, r3 73dc: e1a05004 mov r5, r4 goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; 73e0: e3e06000 mvn r6, #0 _ISR_Disable( level ); search_thread = (Thread_Control *) header->first; 73e4: e5973000 ldr r3, [r7] while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 73e8: ea00000b b 741c <_Thread_queue_Enqueue_priority+0x98> search_priority = search_thread->current_priority; 73ec: e5936014 ldr r6, [r3, #20] if ( priority <= search_priority ) 73f0: e15c0006 cmp ip, r6 73f4: 9a00000a bls 7424 <_Thread_queue_Enqueue_priority+0xa0> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile ( 73f8: e10f9000 mrs r9, CPSR 73fc: e129f004 msr CPSR_fc, r4 7400: e129f009 msr CPSR_fc, r9 RTEMS_INLINE_ROUTINE bool _States_Are_set ( States_Control the_states, States_Control mask ) { return ( (the_states & mask) != STATES_READY); 7404: e5939010 ldr r9, [r3, #16] search_priority = search_thread->current_priority; if ( priority <= search_priority ) break; #endif _ISR_Flash( level ); if ( !_States_Are_set( search_thread->current_state, block_state) ) { 7408: e1180009 tst r8, r9 740c: 1a000001 bne 7418 <_Thread_queue_Enqueue_priority+0x94> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 7410: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED 7414: eaffffed b 73d0 <_Thread_queue_Enqueue_priority+0x4c> <== NOT EXECUTED _ISR_Enable( level ); goto restart_forward_search; } search_thread = (Thread_Control *)search_thread->Object.Node.next; 7418: e5933000 ldr r3, [r3] restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->first; while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 741c: e153000a cmp r3, sl 7420: 1afffff1 bne 73ec <_Thread_queue_Enqueue_priority+0x68> } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 7424: e5907030 ldr r7, [r0, #48] ; 0x30 7428: e3570001 cmp r7, #1 742c: 1a000038 bne 7514 <_Thread_queue_Enqueue_priority+0x190> THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 7430: e3a02000 mov r2, #0 if ( priority == search_priority ) 7434: e15c0006 cmp ip, r6 if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 7438: e5802030 str r2, [r0, #48] ; 0x30 if ( priority == search_priority ) 743c: 0a00002a beq 74ec <_Thread_queue_Enqueue_priority+0x168> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 7440: e5932004 ldr r2, [r3, #4] the_node = (Chain_Node *) the_thread; the_node->next = search_node; 7444: e5813000 str r3, [r1] the_node->previous = previous_node; 7448: e5812004 str r2, [r1, #4] previous_node->next = the_node; 744c: e5821000 str r1, [r2] search_node->previous = the_node; 7450: e5831004 str r1, [r3, #4] the_thread->Wait.queue = the_thread_queue; 7454: e5810044 str r0, [r1, #68] ; 0x44 _ISR_Enable( level ); 7458: ea000021 b 74e4 <_Thread_queue_Enqueue_priority+0x160> return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 745c: e5da6000 ldrb r6, [sl] 7460: e2866001 add r6, r6, #1 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 7464: e10f4000 mrs r4, CPSR 7468: e3843080 orr r3, r4, #128 ; 0x80 746c: e129f003 msr CPSR_fc, r3 7470: e1a05004 mov r5, r4 _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; 7474: e59b3008 ldr r3, [fp, #8] while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 7478: ea00000b b 74ac <_Thread_queue_Enqueue_priority+0x128> search_priority = search_thread->current_priority; 747c: e5936014 ldr r6, [r3, #20] if ( priority >= search_priority ) 7480: e15c0006 cmp ip, r6 7484: 2a00000a bcs 74b4 <_Thread_queue_Enqueue_priority+0x130> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile ( 7488: e10f9000 mrs r9, CPSR 748c: e129f004 msr CPSR_fc, r4 7490: e129f009 msr CPSR_fc, r9 7494: e5939010 ldr r9, [r3, #16] search_priority = search_thread->current_priority; if ( priority >= search_priority ) break; #endif _ISR_Flash( level ); if ( !_States_Are_set( search_thread->current_state, block_state) ) { 7498: e1180009 tst r8, r9 749c: 1a000001 bne 74a8 <_Thread_queue_Enqueue_priority+0x124> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 74a0: e129f004 msr CPSR_fc, r4 74a4: eaffffec b 745c <_Thread_queue_Enqueue_priority+0xd8> _ISR_Enable( level ); goto restart_reverse_search; } search_thread = (Thread_Control *) search_thread->Object.Node.previous; 74a8: e5933004 ldr r3, [r3, #4] restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 74ac: e1530007 cmp r3, r7 74b0: 1afffff1 bne 747c <_Thread_queue_Enqueue_priority+0xf8> } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 74b4: e5907030 ldr r7, [r0, #48] ; 0x30 74b8: e3570001 cmp r7, #1 74bc: 1a000014 bne 7514 <_Thread_queue_Enqueue_priority+0x190> THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 74c0: e3a02000 mov r2, #0 if ( priority == search_priority ) 74c4: e15c0006 cmp ip, r6 if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 74c8: e5802030 str r2, [r0, #48] ; 0x30 if ( priority == search_priority ) 74cc: 0a000006 beq 74ec <_Thread_queue_Enqueue_priority+0x168> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 74d0: e5932000 ldr r2, [r3] the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 74d4: e881000c stm r1, {r2, r3} search_node->next = the_node; next_node->previous = the_node; 74d8: e5821004 str r1, [r2, #4] next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; search_node->next = the_node; 74dc: e5831000 str r1, [r3] next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 74e0: e5810044 str r0, [r1, #68] ; 0x44 74e4: e129f004 msr CPSR_fc, r4 74e8: ea000007 b 750c <_Thread_queue_Enqueue_priority+0x188> 74ec: e283303c add r3, r3, #60 ; 0x3c _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; equal_priority: /* add at end of priority group */ search_node = _Chain_Tail( &search_thread->Wait.Block2n ); previous_node = search_node->previous; 74f0: e5932004 ldr r2, [r3, #4] the_node = (Chain_Node *) the_thread; the_node->next = search_node; 74f4: e5813000 str r3, [r1] the_node->previous = previous_node; 74f8: e5812004 str r2, [r1, #4] previous_node->next = the_node; 74fc: e5821000 str r1, [r2] search_node->previous = the_node; 7500: e5831004 str r1, [r3, #4] the_thread->Wait.queue = the_thread_queue; 7504: e5810044 str r0, [r1, #68] ; 0x44 7508: e129f005 msr CPSR_fc, r5 _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 750c: e3a00001 mov r0, #1 7510: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} * For example, the blocking thread could have been given * the mutex by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ *level_p = level; 7514: e5825000 str r5, [r2] return the_thread_queue->sync_state; 7518: e5900030 ldr r0, [r0, #48] ; 0x30 } 751c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} =============================================================================== 00013fc0 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 13fc0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} 13fc4: e24dd018 sub sp, sp, #24 13fc8: e28db00c add fp, sp, #12 RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 13fcc: e3a03000 mov r3, #0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 13fd0: e28ba004 add sl, fp, #4 13fd4: e28d7004 add r7, sp, #4 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 13fd8: e58da00c str sl, [sp, #12] the_chain->permanent_null = NULL; 13fdc: e58d3010 str r3, [sp, #16] the_chain->last = _Chain_Head(the_chain); 13fe0: e58db014 str fp, [sp, #20] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 13fe4: e58d7000 str r7, [sp] the_chain->permanent_null = NULL; 13fe8: e98d2008 stmib sp, {r3, sp} 13fec: e1a04000 mov r4, r0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 13ff0: e1a0500d mov r5, sp */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 13ff4: e2809030 add r9, r0, #48 ; 0x30 { /* * Afterwards all timer inserts are directed to this chain and the interval * and TOD chains will be no more modified by other parties. */ ts->insert_chain = insert_chain; 13ff8: e584b078 str fp, [r4, #120] ; 0x78 /* * The current TOD is before the last TOD which indicates that * TOD has been set backwards. */ delta = last_snapshot - snapshot; _Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta ); 13ffc: e2848068 add r8, r4, #104 ; 0x68 static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 14000: e59f2150 ldr r2, [pc, #336] ; 14158 <_Timer_server_Body+0x198> 14004: e5923000 ldr r3, [r2] /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 14008: e594103c ldr r1, [r4, #60] ; 0x3c watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 1400c: e1a02005 mov r2, r5 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; 14010: e584303c str r3, [r4, #60] ; 0x3c _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 14014: e0611003 rsb r1, r1, r3 14018: e1a00009 mov r0, r9 1401c: eb0010dd bl 18398 <_Watchdog_Adjust_to_chain> static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 14020: e59f3134 ldr r3, [pc, #308] ; 1415c <_Timer_server_Body+0x19c> Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 14024: e5942074 ldr r2, [r4, #116] ; 0x74 static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 14028: e5936000 ldr r6, [r3] /* * Process the seconds chain. Start by checking that the Time * of Day (TOD) has not been set backwards. If it has then * we want to adjust the watchdogs->Chain to indicate this. */ if ( snapshot > last_snapshot ) { 1402c: e1560002 cmp r6, r2 14030: 9a000004 bls 14048 <_Timer_server_Body+0x88> /* * This path is for normal forward movement and cases where the * TOD has been set forward. */ delta = snapshot - last_snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 14034: e0621006 rsb r1, r2, r6 14038: e1a00008 mov r0, r8 1403c: e1a02005 mov r2, r5 14040: eb0010d4 bl 18398 <_Watchdog_Adjust_to_chain> 14044: ea000003 b 14058 <_Timer_server_Body+0x98> /* * The current TOD is before the last TOD which indicates that * TOD has been set backwards. */ delta = last_snapshot - snapshot; _Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta ); 14048: 31a00008 movcc r0, r8 1404c: 33a01001 movcc r1, #1 14050: 30662002 rsbcc r2, r6, r2 14054: 3b0010a7 blcc 182f8 <_Watchdog_Adjust> } watchdogs->last_snapshot = snapshot; 14058: e5846074 str r6, [r4, #116] ; 0x74 } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); 1405c: e5940078 ldr r0, [r4, #120] ; 0x78 14060: eb000298 bl 14ac8 <_Chain_Get> if ( timer == NULL ) { 14064: e2506000 subs r6, r0, #0 14068: 0a000009 beq 14094 <_Timer_server_Body+0xd4> static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 1406c: e5963038 ldr r3, [r6, #56] ; 0x38 14070: e3530001 cmp r3, #1 _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 14074: 01a00009 moveq r0, r9 static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 14078: 0a000002 beq 14088 <_Timer_server_Body+0xc8> _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 1407c: e3530003 cmp r3, #3 14080: 1afffff5 bne 1405c <_Timer_server_Body+0x9c> _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 14084: e1a00008 mov r0, r8 14088: e2861010 add r1, r6, #16 1408c: eb0010ec bl 18444 <_Watchdog_Insert> 14090: eafffff1 b 1405c <_Timer_server_Body+0x9c> * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); 14094: ebffff97 bl 13ef8 if ( _Chain_Is_empty( insert_chain ) ) { 14098: e59d300c ldr r3, [sp, #12] 1409c: e153000a cmp r3, sl 140a0: 1a000006 bne 140c0 <_Timer_server_Body+0x100> ts->insert_chain = NULL; 140a4: e5846078 str r6, [r4, #120] ; 0x78 140a8: e129f000 msr CPSR_fc, r0 _Chain_Initialize_empty( &fire_chain ); while ( true ) { _Timer_server_Get_watchdogs_that_fire_now( ts, &insert_chain, &fire_chain ); if ( !_Chain_Is_empty( &fire_chain ) ) { 140ac: e59d3000 ldr r3, [sp] 140b0: e1530007 cmp r3, r7 ) { if ( !_Chain_Is_empty(the_chain)) return _Chain_Get_first_unprotected(the_chain); else return NULL; 140b4: 13a06000 movne r6, #0 140b8: 1a000002 bne 140c8 <_Timer_server_Body+0x108> 140bc: ea000013 b 14110 <_Timer_server_Body+0x150> 140c0: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED 140c4: eaffffcd b 14000 <_Timer_server_Body+0x40> <== NOT EXECUTED /* * It is essential that interrupts are disable here since an interrupt * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); 140c8: ebffff8a bl 13ef8 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 140cc: e59d3000 ldr r3, [sp] */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 140d0: e1530007 cmp r3, r7 140d4: 0a00000b beq 14108 <_Timer_server_Body+0x148> { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 140d8: e5932000 ldr r2, [r3] watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { 140dc: e3530000 cmp r3, #0 the_chain->first = new_first; 140e0: e58d2000 str r2, [sp] new_first->previous = _Chain_Head(the_chain); 140e4: e5825004 str r5, [r2, #4] 140e8: 0a000006 beq 14108 <_Timer_server_Body+0x148> watchdog->state = WATCHDOG_INACTIVE; 140ec: e5836008 str r6, [r3, #8] 140f0: e129f000 msr CPSR_fc, r0 /* * The timer server may block here and wait for resources or time. * The system watchdogs are inactive and will remain inactive since * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); 140f4: e2830020 add r0, r3, #32 140f8: e8900003 ldm r0, {r0, r1} 140fc: e1a0e00f mov lr, pc 14100: e593f01c ldr pc, [r3, #28] } 14104: eaffffef b 140c8 <_Timer_server_Body+0x108> 14108: e129f000 msr CPSR_fc, r0 1410c: eaffffb9 b 13ff8 <_Timer_server_Body+0x38> } else { ts->active = false; 14110: e3a03000 mov r3, #0 14114: e5c4307c strb r3, [r4, #124] ; 0x7c /* * Block until there is something to do. */ _Thread_Disable_dispatch(); 14118: ebffff7a bl 13f08 <_Thread_Disable_dispatch> _Thread_Set_state( ts->thread, STATES_DELAYING ); 1411c: e3a01008 mov r1, #8 14120: e5940000 ldr r0, [r4] 14124: eb000e22 bl 179b4 <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 14128: e1a00004 mov r0, r4 1412c: ebffff7b bl 13f20 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); 14130: e1a00004 mov r0, r4 14134: ebffff8d bl 13f70 <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); 14138: eb000ba1 bl 16fc4 <_Thread_Enable_dispatch> ts->active = true; 1413c: e3a03001 mov r3, #1 14140: e5c4307c strb r3, [r4, #124] ; 0x7c static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 14144: e2840008 add r0, r4, #8 14148: eb001113 bl 1859c <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 1414c: e2840040 add r0, r4, #64 ; 0x40 14150: eb001111 bl 1859c <_Watchdog_Remove> 14154: eaffffa7 b 13ff8 <_Timer_server_Body+0x38> =============================================================================== 00005224 : * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 5224: e92d40f0 push {r4, r5, r6, r7, lr} rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 5228: e59f41a4 ldr r4, [pc, #420] ; 53d4 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 522c: e1a05001 mov r5, r1 5230: e1a07000 mov r7, r0 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 5234: e1a00004 mov r0, r4 5238: eb0003bf bl 613c if (aiocbp == NULL) 523c: e3550000 cmp r5, #0 5240: 1a000036 bne 5320 { if (fcntl (fildes, F_GETFL) < 0) { 5244: e1a00007 mov r0, r7 <== NOT EXECUTED 5248: e3a01003 mov r1, #3 <== NOT EXECUTED 524c: eb001968 bl b7f4 <== NOT EXECUTED 5250: e3500000 cmp r0, #0 <== NOT EXECUTED 5254: aa000004 bge 526c <== NOT EXECUTED pthread_mutex_unlock(&aio_request_queue.mutex); 5258: e1a00004 mov r0, r4 <== NOT EXECUTED 525c: eb0003d5 bl 61b8 <== NOT EXECUTED rtems_set_errno_and_return_minus_one (EBADF); 5260: eb00272d bl ef1c <__errno> <== NOT EXECUTED 5264: e3a03009 mov r3, #9 <== NOT EXECUTED 5268: ea000033 b 533c <== NOT EXECUTED } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, 526c: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED 5270: e1a01007 mov r1, r7 <== NOT EXECUTED 5274: e1a02005 mov r2, r5 <== NOT EXECUTED 5278: eb000088 bl 54a0 <== NOT EXECUTED fildes, 0); if (r_chain == NULL) 527c: e2506000 subs r6, r0, #0 <== NOT EXECUTED 5280: 1a00001c bne 52f8 <== NOT EXECUTED { if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) 5284: e5942054 ldr r2, [r4, #84] ; 0x54 <== NOT EXECUTED 5288: e2843058 add r3, r4, #88 ; 0x58 <== NOT EXECUTED 528c: e1520003 cmp r2, r3 <== NOT EXECUTED 5290: 0a000014 beq 52e8 <== NOT EXECUTED { r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, 5294: e2840054 add r0, r4, #84 ; 0x54 <== NOT EXECUTED 5298: e1a01007 mov r1, r7 <== NOT EXECUTED 529c: e1a02006 mov r2, r6 <== NOT EXECUTED 52a0: eb00007e bl 54a0 <== NOT EXECUTED fildes, 0); if (r_chain == NULL) { 52a4: e2505000 subs r5, r0, #0 <== NOT EXECUTED 52a8: 0a00000e beq 52e8 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 52ac: e2850008 add r0, r5, #8 <== NOT EXECUTED return AIO_ALLDONE; } rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); pthread_mutex_destroy (&r_chain->mutex); 52b0: e285701c add r7, r5, #28 <== NOT EXECUTED 52b4: eb0009b2 bl 7984 <_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); 52b8: e1a00005 mov r0, r5 <== NOT EXECUTED 52bc: eb00014a bl 57ec <== NOT EXECUTED pthread_mutex_destroy (&r_chain->mutex); 52c0: e1a00007 mov r0, r7 <== NOT EXECUTED 52c4: eb0002fe bl 5ec4 <== NOT EXECUTED pthread_cond_destroy (&r_chain->mutex); 52c8: e1a00007 mov r0, r7 <== NOT EXECUTED 52cc: eb000230 bl 5b94 <== NOT EXECUTED free (r_chain); 52d0: e1a00005 mov r0, r5 <== NOT EXECUTED 52d4: ebfff478 bl 24bc <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); 52d8: e1a00004 mov r0, r4 <== NOT EXECUTED 52dc: eb0003b5 bl 61b8 <== NOT EXECUTED return AIO_CANCELED; 52e0: e1a05006 mov r5, r6 <== NOT EXECUTED 52e4: ea000038 b 53cc <== NOT EXECUTED } pthread_mutex_unlock (&aio_request_queue.mutex); 52e8: e1a00004 mov r0, r4 <== NOT EXECUTED 52ec: eb0003b1 bl 61b8 <== NOT EXECUTED return AIO_ALLDONE; 52f0: e3a05002 mov r5, #2 <== NOT EXECUTED 52f4: ea000034 b 53cc <== NOT EXECUTED } pthread_mutex_lock (&r_chain->mutex); 52f8: e286701c add r7, r6, #28 <== NOT EXECUTED 52fc: e1a00007 mov r0, r7 <== NOT EXECUTED 5300: eb00038d bl 613c <== NOT EXECUTED 5304: e2860008 add r0, r6, #8 <== NOT EXECUTED 5308: eb00099d bl 7984 <_Chain_Extract> <== NOT EXECUTED rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 530c: e1a00006 mov r0, r6 <== NOT EXECUTED 5310: eb000135 bl 57ec <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); 5314: e1a00007 mov r0, r7 <== NOT EXECUTED 5318: eb0003a6 bl 61b8 <== NOT EXECUTED 531c: ea00001d b 5398 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); return AIO_CANCELED; } else { if (aiocbp->aio_fildes != fildes) { 5320: e5956000 ldr r6, [r5] 5324: e1560007 cmp r6, r7 5328: 0a000006 beq 5348 pthread_mutex_unlock (&aio_request_queue.mutex); 532c: e1a00004 mov r0, r4 5330: eb0003a0 bl 61b8 rtems_set_errno_and_return_minus_one (EINVAL); 5334: eb0026f8 bl ef1c <__errno> 5338: e3a03016 mov r3, #22 533c: e5803000 str r3, [r0] 5340: e3e05000 mvn r5, #0 5344: ea000020 b 53cc } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, 5348: e2840048 add r0, r4, #72 ; 0x48 534c: e1a01006 mov r1, r6 5350: e3a02000 mov r2, #0 5354: eb000051 bl 54a0 fildes, 0); if (r_chain == NULL) 5358: e2507000 subs r7, r0, #0 535c: 1a00000f bne 53a0 if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) 5360: e5942054 ldr r2, [r4, #84] ; 0x54 5364: e2843058 add r3, r4, #88 ; 0x58 5368: e1520003 cmp r2, r3 536c: 0a00000b beq 53a0 { r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, 5370: e2840054 add r0, r4, #84 ; 0x54 5374: e1a01006 mov r1, r6 5378: e1a02007 mov r2, r7 537c: eb000047 bl 54a0 fildes, 0); if (r_chain == NULL) 5380: e3500000 cmp r0, #0 5384: 0affffe8 beq 532c { 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); 5388: e1a01005 mov r1, r5 <== NOT EXECUTED 538c: e2800008 add r0, r0, #8 <== NOT EXECUTED 5390: eb000125 bl 582c <== NOT EXECUTED 5394: e1a05000 mov r5, r0 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); 5398: e1a00004 mov r0, r4 <== NOT EXECUTED 539c: ea000009 b 53c8 <== NOT EXECUTED return result; } pthread_mutex_lock (&r_chain->mutex); 53a0: e287401c add r4, r7, #28 <== NOT EXECUTED 53a4: e1a00004 mov r0, r4 <== NOT EXECUTED 53a8: eb000363 bl 613c <== NOT EXECUTED result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp); 53ac: e1a01005 mov r1, r5 <== NOT EXECUTED 53b0: e2870008 add r0, r7, #8 <== NOT EXECUTED 53b4: eb00011c bl 582c <== NOT EXECUTED 53b8: e1a05000 mov r5, r0 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); 53bc: e1a00004 mov r0, r4 <== NOT EXECUTED 53c0: eb00037c bl 61b8 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); 53c4: e59f0008 ldr r0, [pc, #8] ; 53d4 <== NOT EXECUTED 53c8: eb00037a bl 61b8 <== NOT EXECUTED return result; } return AIO_ALLDONE; } 53cc: e1a00005 mov r0, r5 53d0: e8bd80f0 pop {r4, r5, r6, r7, pc} =============================================================================== 00005a74 : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { 5a74: e92d4030 push {r4, r5, lr} rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 5a78: e3a01003 mov r1, #3 * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { 5a7c: e1a04000 mov r4, r0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 5a80: e5900000 ldr r0, [r0] 5a84: eb001756 bl b7e4 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) 5a88: e2000003 and r0, r0, #3 5a8c: e3500002 cmp r0, #2 5a90: 13500000 cmpne r0, #0 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 5a94: 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))) 5a98: 1a00000d bne 5ad4 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 5a9c: e5943014 ldr r3, [r4, #20] 5aa0: e3530000 cmp r3, #0 5aa4: 1a000007 bne 5ac8 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 5aa8: e5943008 ldr r3, [r4, #8] 5aac: e3530000 cmp r3, #0 5ab0: ba000004 blt 5ac8 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 5ab4: e3a00018 mov r0, #24 5ab8: ebfff388 bl 28e0 if (req == NULL) 5abc: e2503000 subs r3, r0, #0 5ac0: 1a00000a bne 5af0 5ac4: ea000001 b 5ad0 <== 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); 5ac8: e3a05016 mov r5, #22 <== NOT EXECUTED 5acc: ea000000 b 5ad4 <== NOT EXECUTED req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 5ad0: e3a0500b mov r5, #11 <== NOT EXECUTED 5ad4: e3e03000 mvn r3, #0 5ad8: e5845030 str r5, [r4, #48] ; 0x30 5adc: e5843034 str r3, [r4, #52] ; 0x34 5ae0: eb002509 bl ef0c <__errno> 5ae4: e5805000 str r5, [r0] req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_READ; return rtems_aio_enqueue (req); } 5ae8: e3e00000 mvn r0, #0 5aec: 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; 5af0: e5834014 str r4, [r3, #20] req->aiocbp->aio_lio_opcode = LIO_READ; 5af4: e3a03001 mov r3, #1 5af8: e584302c str r3, [r4, #44] ; 0x2c return rtems_aio_enqueue (req); } 5afc: 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); 5b00: eaffff5b b 5874 =============================================================================== 00005a8c : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { 5a8c: e92d4030 push {r4, r5, lr} rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 5a90: e3a01003 mov r1, #3 * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { 5a94: e1a04000 mov r4, r0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 5a98: e5900000 ldr r0, [r0] 5a9c: eb001754 bl b7f4 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 5aa0: e2000003 and r0, r0, #3 5aa4: e2400001 sub r0, r0, #1 5aa8: e3500001 cmp r0, #1 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 5aac: 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))) 5ab0: 8a00000d bhi 5aec rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 5ab4: e5943014 ldr r3, [r4, #20] 5ab8: e3530000 cmp r3, #0 5abc: 1a000007 bne 5ae0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 5ac0: e5943008 ldr r3, [r4, #8] 5ac4: e3530000 cmp r3, #0 5ac8: ba000004 blt 5ae0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 5acc: e3a00018 mov r0, #24 5ad0: ebfff386 bl 28f0 if (req == NULL) 5ad4: e2503000 subs r3, r0, #0 5ad8: 1a00000a bne 5b08 5adc: ea000001 b 5ae8 <== 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); 5ae0: e3a05016 mov r5, #22 <== NOT EXECUTED 5ae4: ea000000 b 5aec <== NOT EXECUTED req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 5ae8: e3a0500b mov r5, #11 <== NOT EXECUTED 5aec: e3e03000 mvn r3, #0 5af0: e5845030 str r5, [r4, #48] ; 0x30 5af4: e5843034 str r3, [r4, #52] ; 0x34 5af8: eb002507 bl ef1c <__errno> 5afc: e5805000 str r5, [r0] req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_WRITE; return rtems_aio_enqueue (req); } 5b00: e3e00000 mvn r0, #0 5b04: 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; 5b08: e5834014 str r4, [r3, #20] req->aiocbp->aio_lio_opcode = LIO_WRITE; 5b0c: e3a03002 mov r3, #2 5b10: e584302c str r3, [r4, #44] ; 0x2c return rtems_aio_enqueue (req); } 5b14: 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); 5b18: eaffff59 b 5884 =============================================================================== 0000a1fc : int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) a1fc: e3500000 cmp r0, #0 a200: 0a00000b beq a234 a204: e5903000 ldr r3, [r0] a208: e3530000 cmp r3, #0 a20c: 0a000008 beq a234 return EINVAL; switch ( policy ) { a210: e3510004 cmp r1, #4 a214: 8a000008 bhi a23c a218: e3a03001 mov r3, #1 a21c: e1a03113 lsl r3, r3, r1 a220: e3130017 tst r3, #23 case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; a224: 15801014 strne r1, [r0, #20] return 0; a228: 13a00000 movne r0, #0 ) { if ( !attr || !attr->is_initialized ) return EINVAL; switch ( policy ) { a22c: 112fff1e bxne lr a230: ea000001 b a23c <== NOT EXECUTED pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) return EINVAL; a234: e3a00016 mov r0, #22 a238: e12fff1e bx lr case SCHED_SPORADIC: attr->schedpolicy = policy; return 0; default: return ENOTSUP; a23c: e3a00086 mov r0, #134 ; 0x86 } } a240: e12fff1e bx lr =============================================================================== 00007040 : int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) 7040: e3500000 cmp r0, #0 7044: 0a000007 beq 7068 7048: e5903000 ldr r3, [r0] 704c: e3530000 cmp r3, #0 7050: 0a000004 beq 7068 return EINVAL; switch ( pshared ) { 7054: e3510001 cmp r1, #1 case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 7058: 95801004 strls r1, [r0, #4] return 0; 705c: 93a00000 movls r0, #0 ) { if ( !attr || !attr->is_initialized ) return EINVAL; switch ( pshared ) { 7060: 912fff1e bxls lr 7064: ea000001 b 7070 <== NOT EXECUTED pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) return EINVAL; 7068: e3a00016 mov r0, #22 706c: e12fff1e bx lr case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; return 0; default: return EINVAL; 7070: e3a00016 mov r0, #22 <== NOT EXECUTED } } 7074: e12fff1e bx lr <== NOT EXECUTED =============================================================================== 00006aac : int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) 6aac: e3500000 cmp r0, #0 6ab0: 0a000007 beq 6ad4 return EINVAL; if ( !attr->is_initialized ) 6ab4: e5903000 ldr r3, [r0] 6ab8: e3530000 cmp r3, #0 6abc: 0a000004 beq 6ad4 return EINVAL; switch ( pshared ) { 6ac0: e3510001 cmp r1, #1 case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 6ac4: 95801004 strls r1, [r0, #4] return 0; 6ac8: 93a00000 movls r0, #0 return EINVAL; if ( !attr->is_initialized ) return EINVAL; switch ( pshared ) { 6acc: 912fff1e bxls lr 6ad0: ea000001 b 6adc <== NOT EXECUTED { if ( !attr ) return EINVAL; if ( !attr->is_initialized ) return EINVAL; 6ad4: e3a00016 mov r0, #22 6ad8: e12fff1e bx lr case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; return 0; default: return EINVAL; 6adc: e3a00016 mov r0, #22 <== NOT EXECUTED } } 6ae0: e12fff1e bx lr <== NOT EXECUTED =============================================================================== 00005884 : * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 5884: 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); 5888: e59f41e0 ldr r4, [pc, #480] ; 5a70 * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 588c: e24dd024 sub sp, sp, #36 ; 0x24 5890: 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); 5894: e1a00004 mov r0, r4 5898: eb000227 bl 613c if (result != 0) { 589c: e2505000 subs r5, r0, #0 58a0: 0a000002 beq 58b0 free (req); 58a4: e1a00006 mov r0, r6 58a8: ebfff303 bl 24bc return result; 58ac: ea00006c b 5a64 } /* _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); 58b0: eb00042e bl 6970 <== NOT EXECUTED 58b4: e28d101c add r1, sp, #28 <== NOT EXECUTED 58b8: e1a0200d mov r2, sp <== NOT EXECUTED 58bc: eb000333 bl 6590 <== NOT EXECUTED req->caller_thread = pthread_self (); 58c0: eb00042a bl 6970 <== NOT EXECUTED req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 58c4: e5963014 ldr r3, [r6, #20] <== NOT EXECUTED 58c8: e59d1000 ldr r1, [sp] <== NOT EXECUTED 58cc: e5932014 ldr r2, [r3, #20] <== NOT EXECUTED 58d0: e0622001 rsb r2, r2, r1 <== NOT EXECUTED 58d4: e5862004 str r2, [r6, #4] <== NOT EXECUTED req->policy = policy; 58d8: e59d201c ldr r2, [sp, #28] <== NOT EXECUTED 58dc: e5862000 str r2, [r6] <== NOT EXECUTED req->aiocbp->error_code = EINPROGRESS; 58e0: e3a02077 mov r2, #119 ; 0x77 <== 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); req->caller_thread = pthread_self (); 58e4: e5860010 str r0, [r6, #16] <== NOT EXECUTED req->priority = param.sched_priority - req->aiocbp->aio_reqprio; req->policy = policy; req->aiocbp->error_code = EINPROGRESS; 58e8: e5832030 str r2, [r3, #48] ; 0x30 <== NOT EXECUTED req->aiocbp->return_value = 0; if ((aio_request_queue.idle_threads == 0) && 58ec: e5942068 ldr r2, [r4, #104] ; 0x68 <== NOT EXECUTED 58f0: e3520000 cmp r2, #0 <== NOT EXECUTED 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; 58f4: e5835034 str r5, [r3, #52] ; 0x34 <== NOT EXECUTED if ((aio_request_queue.idle_threads == 0) && 58f8: 1a00002e bne 59b8 <== NOT EXECUTED 58fc: e5942064 ldr r2, [r4, #100] ; 0x64 <== NOT EXECUTED 5900: e3520004 cmp r2, #4 <== NOT EXECUTED 5904: ca00002b bgt 59b8 <== NOT EXECUTED 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); 5908: e5931000 ldr r1, [r3] <== NOT EXECUTED 590c: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED 5910: e3a02001 mov r2, #1 <== NOT EXECUTED 5914: ebfffee1 bl 54a0 <== NOT EXECUTED if (r_chain->new_fd == 1) { 5918: e5903004 ldr r3, [r0, #4] <== NOT EXECUTED 591c: e3530001 cmp r3, #1 <== NOT EXECUTED 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); 5920: e1a07000 mov r7, r0 <== NOT EXECUTED 5924: e2809010 add r9, r0, #16 <== NOT EXECUTED 5928: e280801c add r8, r0, #28 <== NOT EXECUTED 592c: e280a020 add sl, r0, #32 <== NOT EXECUTED if (r_chain->new_fd == 1) { 5930: 1a000017 bne 5994 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); 5934: e2861008 add r1, r6, #8 <== NOT EXECUTED 5938: e1a00009 mov r0, r9 <== NOT EXECUTED 593c: eb000825 bl 79d8 <_Chain_Insert> <== NOT EXECUTED rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); 5940: e1a01005 mov r1, r5 <== NOT EXECUTED 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; 5944: e5875004 str r5, [r7, #4] <== NOT EXECUTED pthread_mutex_init (&r_chain->mutex, NULL); 5948: e1a00008 mov r0, r8 <== NOT EXECUTED 594c: eb0001a8 bl 5ff4 <== NOT EXECUTED pthread_cond_init (&r_chain->cond, NULL); 5950: e1a01005 mov r1, r5 <== NOT EXECUTED 5954: e1a0000a mov r0, sl <== NOT EXECUTED 5958: eb0000bd bl 5c54 <== NOT EXECUTED AIO_printf ("New thread"); result = pthread_create (&thid, &aio_request_queue.attr, 595c: e1a03007 mov r3, r7 <== NOT EXECUTED 5960: e28d0020 add r0, sp, #32 <== NOT EXECUTED 5964: e2841008 add r1, r4, #8 <== NOT EXECUTED 5968: e59f2104 ldr r2, [pc, #260] ; 5a74 <== NOT EXECUTED 596c: eb000273 bl 6340 <== NOT EXECUTED rtems_aio_handle, (void *) r_chain); if (result != 0) { 5970: e2506000 subs r6, r0, #0 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); return result; } ++aio_request_queue.active_threads; 5974: 05943064 ldreq r3, [r4, #100] ; 0x64 <== NOT EXECUTED 5978: 02833001 addeq r3, r3, #1 <== NOT EXECUTED 597c: 05843064 streq r3, [r4, #100] ; 0x64 <== NOT EXECUTED pthread_cond_init (&r_chain->cond, NULL); AIO_printf ("New thread"); result = pthread_create (&thid, &aio_request_queue.attr, rtems_aio_handle, (void *) r_chain); if (result != 0) { 5980: 0a000035 beq 5a5c <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); 5984: e1a00004 mov r0, r4 <== NOT EXECUTED 5988: eb00020a bl 61b8 <== NOT EXECUTED return result; 598c: e1a05006 mov r5, r6 <== NOT EXECUTED 5990: ea000033 b 5a64 <== NOT EXECUTED } ++aio_request_queue.active_threads; } else { /* put request in the fd chain it belongs to */ pthread_mutex_lock (&r_chain->mutex); 5994: e1a00008 mov r0, r8 <== NOT EXECUTED 5998: eb0001e7 bl 613c <== NOT EXECUTED rtems_aio_insert_prio (&r_chain->perfd, req); 599c: e1a00009 mov r0, r9 <== NOT EXECUTED 59a0: e1a01006 mov r1, r6 <== NOT EXECUTED 59a4: ebffff7d bl 57a0 <== NOT EXECUTED pthread_cond_signal (&r_chain->cond); 59a8: e1a0000a mov r0, sl <== NOT EXECUTED 59ac: eb0000d8 bl 5d14 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); 59b0: e1a00008 mov r0, r8 <== NOT EXECUTED 59b4: ea00000e b 59f4 <== NOT EXECUTED 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, 59b8: e59f00b8 ldr r0, [pc, #184] ; 5a78 <== NOT EXECUTED 59bc: e5931000 ldr r1, [r3] <== NOT EXECUTED 59c0: e3a02000 mov r2, #0 <== NOT EXECUTED 59c4: ebfffeb5 bl 54a0 <== NOT EXECUTED req->aiocbp->aio_fildes, 0); if (r_chain != NULL) 59c8: e2504000 subs r4, r0, #0 <== NOT EXECUTED 59cc: 0a00000a beq 59fc <== NOT EXECUTED { pthread_mutex_lock (&r_chain->mutex); 59d0: e284701c add r7, r4, #28 <== NOT EXECUTED 59d4: e1a00007 mov r0, r7 <== NOT EXECUTED 59d8: eb0001d7 bl 613c <== NOT EXECUTED rtems_aio_insert_prio (&r_chain->perfd, req); 59dc: e2840010 add r0, r4, #16 <== NOT EXECUTED 59e0: e1a01006 mov r1, r6 <== NOT EXECUTED 59e4: ebffff6d bl 57a0 <== NOT EXECUTED pthread_cond_signal (&r_chain->cond); 59e8: e2840020 add r0, r4, #32 <== NOT EXECUTED 59ec: eb0000c8 bl 5d14 <== NOT EXECUTED pthread_mutex_unlock (&r_chain->mutex); 59f0: e1a00007 mov r0, r7 <== NOT EXECUTED 59f4: eb0001ef bl 61b8 <== NOT EXECUTED 59f8: ea000017 b 5a5c <== NOT EXECUTED } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 59fc: e5963014 ldr r3, [r6, #20] <== NOT EXECUTED 5a00: e59f0074 ldr r0, [pc, #116] ; 5a7c <== NOT EXECUTED 5a04: e5931000 ldr r1, [r3] <== NOT EXECUTED 5a08: e3a02001 mov r2, #1 <== NOT EXECUTED 5a0c: ebfffea3 bl 54a0 <== NOT EXECUTED if (r_chain->new_fd == 1) { 5a10: e5903004 ldr r3, [r0, #4] <== NOT EXECUTED 5a14: e3530001 cmp r3, #1 <== NOT EXECUTED } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 5a18: e1a07000 mov r7, r0 <== NOT EXECUTED 5a1c: e2800010 add r0, r0, #16 <== NOT EXECUTED if (r_chain->new_fd == 1) { 5a20: 1a00000b bne 5a54 <== NOT EXECUTED 5a24: e2861008 add r1, r6, #8 <== NOT EXECUTED 5a28: eb0007ea bl 79d8 <_Chain_Insert> <== NOT EXECUTED /* If this is a new fd chain we signal the idle threads that might be waiting for requests */ rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); 5a2c: e1a01004 mov r1, r4 <== NOT EXECUTED if (r_chain->new_fd == 1) { /* If this is a new fd chain we signal the idle threads that might be waiting for requests */ rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; 5a30: e5874004 str r4, [r7, #4] <== NOT EXECUTED pthread_mutex_init (&r_chain->mutex, NULL); 5a34: e287001c add r0, r7, #28 <== NOT EXECUTED 5a38: eb00016d bl 5ff4 <== NOT EXECUTED pthread_cond_init (&r_chain->cond, NULL); 5a3c: e2870020 add r0, r7, #32 <== NOT EXECUTED 5a40: e1a01004 mov r1, r4 <== NOT EXECUTED 5a44: eb000082 bl 5c54 <== NOT EXECUTED pthread_cond_signal (&aio_request_queue.new_req); 5a48: e59f0030 ldr r0, [pc, #48] ; 5a80 <== NOT EXECUTED 5a4c: eb0000b0 bl 5d14 <== NOT EXECUTED 5a50: ea000001 b 5a5c <== NOT EXECUTED } else /* just insert the request in the existing fd chain */ rtems_aio_insert_prio (&r_chain->perfd, req); 5a54: e1a01006 mov r1, r6 <== NOT EXECUTED 5a58: ebffff50 bl 57a0 <== NOT EXECUTED } } pthread_mutex_unlock (&aio_request_queue.mutex); 5a5c: e59f000c ldr r0, [pc, #12] ; 5a70 <== NOT EXECUTED 5a60: eb0001d4 bl 61b8 <== NOT EXECUTED return 0; } 5a64: e1a00005 mov r0, r5 5a68: e28dd024 add sp, sp, #36 ; 0x24 5a6c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} =============================================================================== 00005540 : * NULL - if error */ static void * rtems_aio_handle (void *arg) { 5540: 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); 5544: e59f6248 ldr r6, [pc, #584] ; 5794 <== NOT EXECUTED * NULL - if error */ static void * rtems_aio_handle (void *arg) { 5548: e24dd02c sub sp, sp, #44 ; 0x2c <== NOT EXECUTED 554c: 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); 5550: 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)) { 5554: e286b058 add fp, r6, #88 ; 0x58 <== NOT EXECUTED node = chain->first; req = (rtems_aio_request *) node; /* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING discussion in rtems_aio_enqueue () */ pthread_getschedparam (pthread_self(), &policy, ¶m); 5558: 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); 555c: e284a01c add sl, r4, #28 <== NOT EXECUTED 5560: e1a0000a mov r0, sl <== NOT EXECUTED 5564: eb0002f4 bl 613c <== NOT EXECUTED if (result != 0) 5568: e2508000 subs r8, r0, #0 <== NOT EXECUTED 556c: 1a000085 bne 5788 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 5570: e5945010 ldr r5, [r4, #16] <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 5574: e2843014 add r3, r4, #20 <== 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)) { 5578: e1550003 cmp r5, r3 <== NOT EXECUTED 557c: 0a000035 beq 5658 <== NOT EXECUTED node = chain->first; req = (rtems_aio_request *) node; /* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING discussion in rtems_aio_enqueue () */ pthread_getschedparam (pthread_self(), &policy, ¶m); 5580: eb0004fa bl 6970 <== NOT EXECUTED 5584: e28d1028 add r1, sp, #40 ; 0x28 <== NOT EXECUTED 5588: e1a02009 mov r2, r9 <== NOT EXECUTED 558c: eb0003ff bl 6590 <== NOT EXECUTED param.sched_priority = req->priority; 5590: e5953004 ldr r3, [r5, #4] <== NOT EXECUTED 5594: e58d3004 str r3, [sp, #4] <== NOT EXECUTED pthread_setschedparam (pthread_self(), req->policy, ¶m); 5598: eb0004f4 bl 6970 <== NOT EXECUTED 559c: e1a02009 mov r2, r9 <== NOT EXECUTED 55a0: e5951000 ldr r1, [r5] <== NOT EXECUTED 55a4: eb0004f6 bl 6984 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 55a8: e1a00005 mov r0, r5 <== NOT EXECUTED 55ac: eb0008f4 bl 7984 <_Chain_Extract> <== NOT EXECUTED rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); 55b0: e1a0000a mov r0, sl <== NOT EXECUTED 55b4: eb0002ff bl 61b8 <== NOT EXECUTED switch (req->aiocbp->aio_lio_opcode) { 55b8: e5952014 ldr r2, [r5, #20] <== NOT EXECUTED 55bc: e592302c ldr r3, [r2, #44] ; 0x2c <== NOT EXECUTED 55c0: e3530002 cmp r3, #2 <== NOT EXECUTED 55c4: 0a00000b beq 55f8 <== NOT EXECUTED 55c8: e3530003 cmp r3, #3 <== NOT EXECUTED 55cc: 0a000011 beq 5618 <== NOT EXECUTED 55d0: e3530001 cmp r3, #1 <== NOT EXECUTED 55d4: 1a000013 bne 5628 <== NOT EXECUTED case LIO_READ: result = pread (req->aiocbp->aio_fildes, 55d8: e5921008 ldr r1, [r2, #8] <== NOT EXECUTED 55dc: e5923004 ldr r3, [r2, #4] <== NOT EXECUTED 55e0: e58d1000 str r1, [sp] <== NOT EXECUTED 55e4: e592100c ldr r1, [r2, #12] <== NOT EXECUTED 55e8: e5920000 ldr r0, [r2] <== NOT EXECUTED 55ec: e5922010 ldr r2, [r2, #16] <== NOT EXECUTED 55f0: eb00294b bl fb24 <== NOT EXECUTED (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; 55f4: ea000009 b 5620 <== NOT EXECUTED case LIO_WRITE: result = pwrite (req->aiocbp->aio_fildes, 55f8: e5921008 ldr r1, [r2, #8] <== NOT EXECUTED 55fc: e5923004 ldr r3, [r2, #4] <== NOT EXECUTED 5600: e58d1000 str r1, [sp] <== NOT EXECUTED 5604: e592100c ldr r1, [r2, #12] <== NOT EXECUTED 5608: e5920000 ldr r0, [r2] <== NOT EXECUTED 560c: e5922010 ldr r2, [r2, #16] <== NOT EXECUTED 5610: eb00298b bl fc44 <== NOT EXECUTED (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; 5614: ea000001 b 5620 <== NOT EXECUTED case LIO_SYNC: result = fsync (req->aiocbp->aio_fildes); 5618: e5920000 ldr r0, [r2] <== NOT EXECUTED 561c: eb0018e9 bl b9c8 <== NOT EXECUTED break; default: result = -1; } if (result == -1) { 5620: e3700001 cmn r0, #1 <== NOT EXECUTED 5624: 1a000006 bne 5644 <== NOT EXECUTED req->aiocbp->return_value = -1; 5628: e5955014 ldr r5, [r5, #20] <== NOT EXECUTED 562c: e3e02000 mvn r2, #0 <== NOT EXECUTED 5630: e5852034 str r2, [r5, #52] ; 0x34 <== NOT EXECUTED req->aiocbp->error_code = errno; 5634: eb002638 bl ef1c <__errno> <== NOT EXECUTED 5638: e5903000 ldr r3, [r0] <== NOT EXECUTED 563c: e5853030 str r3, [r5, #48] ; 0x30 <== NOT EXECUTED 5640: eaffffc5 b 555c <== NOT EXECUTED } else { req->aiocbp->return_value = result; 5644: e5953014 ldr r3, [r5, #20] <== NOT EXECUTED req->aiocbp->error_code = 0; 5648: 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; 564c: e5830034 str r0, [r3, #52] ; 0x34 <== NOT EXECUTED req->aiocbp->error_code = 0; 5650: e5832030 str r2, [r3, #48] ; 0x30 <== NOT EXECUTED 5654: eaffffc0 b 555c <== 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); 5658: e1a0000a mov r0, sl <== NOT EXECUTED 565c: eb0002d5 bl 61b8 <== NOT EXECUTED pthread_mutex_lock (&aio_request_queue.mutex); 5660: e59f012c ldr r0, [pc, #300] ; 5794 <== NOT EXECUTED 5664: eb0002b4 bl 613c <== NOT EXECUTED if (rtems_chain_is_empty (chain)) 5668: e5943010 ldr r3, [r4, #16] <== NOT EXECUTED 566c: e1530005 cmp r3, r5 <== NOT EXECUTED 5670: 1affffb9 bne 555c <== NOT EXECUTED { clock_gettime (CLOCK_REALTIME, &timeout); 5674: e1a01007 mov r1, r7 <== NOT EXECUTED 5678: e3a00001 mov r0, #1 <== NOT EXECUTED 567c: eb000126 bl 5b1c <== NOT EXECUTED timeout.tv_sec += 3; 5680: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, 5684: e2845020 add r5, r4, #32 <== 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; 5688: e2833003 add r3, r3, #3 <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, 568c: e1a00005 mov r0, r5 <== NOT EXECUTED 5690: e59f10fc ldr r1, [pc, #252] ; 5794 <== NOT EXECUTED 5694: 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; 5698: e58d3020 str r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; 569c: e58d8024 str r8, [sp, #36] ; 0x24 <== NOT EXECUTED result = pthread_cond_timedwait (&r_chain->cond, 56a0: eb0001b2 bl 5d70 <== 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) { 56a4: e3500074 cmp r0, #116 ; 0x74 <== NOT EXECUTED 56a8: 1affffab bne 555c <== NOT EXECUTED 56ac: e2840008 add r0, r4, #8 <== NOT EXECUTED 56b0: eb0008b3 bl 7984 <_Chain_Extract> <== NOT EXECUTED rtems_chain_extract (&r_chain->next_fd); pthread_mutex_destroy (&r_chain->mutex); 56b4: e1a0000a mov r0, sl <== NOT EXECUTED 56b8: eb000201 bl 5ec4 <== NOT EXECUTED pthread_cond_destroy (&r_chain->cond); 56bc: e1a00005 mov r0, r5 <== NOT EXECUTED 56c0: eb000133 bl 5b94 <== NOT EXECUTED free (r_chain); 56c4: e1a00004 mov r0, r4 <== NOT EXECUTED 56c8: ebfff37b bl 24bc <== 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)) { 56cc: e5963054 ldr r3, [r6, #84] ; 0x54 <== NOT EXECUTED 56d0: e153000b cmp r3, fp <== NOT EXECUTED 56d4: 1a000028 bne 577c <== NOT EXECUTED ++aio_request_queue.idle_threads; 56d8: e5963068 ldr r3, [r6, #104] ; 0x68 <== NOT EXECUTED clock_gettime (CLOCK_REALTIME, &timeout); 56dc: e1a01007 mov r1, r7 <== 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; 56e0: e2833001 add r3, r3, #1 <== NOT EXECUTED clock_gettime (CLOCK_REALTIME, &timeout); 56e4: 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; 56e8: e5863068 str r3, [r6, #104] ; 0x68 <== NOT EXECUTED clock_gettime (CLOCK_REALTIME, &timeout); 56ec: eb00010a bl 5b1c <== NOT EXECUTED timeout.tv_sec += 3; 56f0: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, 56f4: e59f009c ldr r0, [pc, #156] ; 5798 <== 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; 56f8: e2833003 add r3, r3, #3 <== NOT EXECUTED timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, 56fc: e59f1090 ldr r1, [pc, #144] ; 5794 <== NOT EXECUTED 5700: 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; 5704: e58d3020 str r3, [sp, #32] <== NOT EXECUTED timeout.tv_nsec = 0; 5708: e58d8024 str r8, [sp, #36] ; 0x24 <== NOT EXECUTED result = pthread_cond_timedwait (&aio_request_queue.new_req, 570c: eb000197 bl 5d70 <== 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) { 5710: e3500074 cmp r0, #116 ; 0x74 <== NOT EXECUTED 5714: 1a000002 bne 5724 <== NOT EXECUTED pthread_mutex_unlock (&aio_request_queue.mutex); 5718: e59f0074 ldr r0, [pc, #116] ; 5794 <== NOT EXECUTED 571c: eb0002a5 bl 61b8 <== NOT EXECUTED return NULL; 5720: ea000018 b 5788 <== NOT EXECUTED } /* Otherwise move this chain to the working chain and start the loop all over again */ --aio_request_queue.idle_threads; node = aio_request_queue.idle_req.first; 5724: 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; 5728: e5963068 ldr r3, [r6, #104] ; 0x68 <== NOT EXECUTED 572c: e1a00005 mov r0, r5 <== NOT EXECUTED 5730: e2433001 sub r3, r3, #1 <== NOT EXECUTED 5734: e5863068 str r3, [r6, #104] ; 0x68 <== NOT EXECUTED 5738: eb000891 bl 7984 <_Chain_Extract> <== NOT EXECUTED node = aio_request_queue.idle_req.first; rtems_chain_extract (node); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, 573c: e3a02001 mov r2, #1 <== NOT EXECUTED 5740: e4951010 ldr r1, [r5], #16 <== NOT EXECUTED 5744: e59f0050 ldr r0, [pc, #80] ; 579c <== NOT EXECUTED 5748: ebffff54 bl 54a0 <== NOT EXECUTED ((rtems_aio_request_chain *)node)->fildes, 1); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); 574c: 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 = aio_request_queue.idle_req.first; rtems_chain_extract (node); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, 5750: e1a04000 mov r4, r0 <== NOT EXECUTED ((rtems_aio_request_chain *)node)->fildes, 1); r_chain->new_fd = 0; 5754: e5808004 str r8, [r0, #4] <== NOT EXECUTED pthread_mutex_init (&r_chain->mutex, NULL); 5758: e280001c add r0, r0, #28 <== NOT EXECUTED 575c: eb000224 bl 5ff4 <== NOT EXECUTED pthread_cond_init (&r_chain->cond, NULL); 5760: e1a01008 mov r1, r8 <== NOT EXECUTED 5764: e2840020 add r0, r4, #32 <== NOT EXECUTED 5768: eb000139 bl 5c54 <== NOT EXECUTED r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd; 576c: e8950007 ldm r5, {r0, r1, r2} <== NOT EXECUTED 5770: e2843010 add r3, r4, #16 <== NOT EXECUTED 5774: e8830007 stm r3, {r0, r1, r2} <== NOT EXECUTED 5778: eaffff77 b 555c <== 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); 577c: e59f0010 ldr r0, [pc, #16] ; 5794 <== NOT EXECUTED 5780: eb00028c bl 61b8 <== NOT EXECUTED 5784: eaffff74 b 555c <== NOT EXECUTED } AIO_printf ("Thread finished\n"); return NULL; } 5788: e3a00000 mov r0, #0 <== NOT EXECUTED 578c: e28dd02c add sp, sp, #44 ; 0x2c <== NOT EXECUTED 5790: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED =============================================================================== 000053e0 : * 0 - if initialization succeeded */ int rtems_aio_init (void) { 53e0: e92d4010 push {r4, lr} <== NOT EXECUTED int result = 0; result = pthread_attr_init (&aio_request_queue.attr); 53e4: e59f00a4 ldr r0, [pc, #164] ; 5490 <== NOT EXECUTED 53e8: eb0003b4 bl 62c0 <== NOT EXECUTED if (result != 0) 53ec: e2504000 subs r4, r0, #0 <== NOT EXECUTED 53f0: 1a000024 bne 5488 <== NOT EXECUTED return result; result = 53f4: e59f0094 ldr r0, [pc, #148] ; 5490 <== NOT EXECUTED 53f8: e1a01004 mov r1, r4 <== NOT EXECUTED 53fc: eb0003c1 bl 6308 <== NOT EXECUTED pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) 5400: e3500000 cmp r0, #0 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 5404: 159f0084 ldrne r0, [pc, #132] ; 5490 <== NOT EXECUTED 5408: 1b0003a3 blne 629c <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 540c: e59f0080 ldr r0, [pc, #128] ; 5494 <== NOT EXECUTED 5410: e3a01000 mov r1, #0 <== NOT EXECUTED 5414: eb0002f6 bl 5ff4 <== NOT EXECUTED if (result != 0) 5418: e3500000 cmp r0, #0 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 541c: 159f006c ldrne r0, [pc, #108] ; 5490 <== NOT EXECUTED 5420: 1b00039d blne 629c <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); 5424: e59f006c ldr r0, [pc, #108] ; 5498 <== NOT EXECUTED 5428: e3a01000 mov r1, #0 <== NOT EXECUTED 542c: eb000208 bl 5c54 <== NOT EXECUTED if (result != 0) { 5430: e2504000 subs r4, r0, #0 <== NOT EXECUTED 5434: 0a000003 beq 5448 <== NOT EXECUTED pthread_mutex_destroy (&aio_request_queue.mutex); 5438: e59f0054 ldr r0, [pc, #84] ; 5494 <== NOT EXECUTED 543c: eb0002a0 bl 5ec4 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 5440: e59f0048 ldr r0, [pc, #72] ; 5490 <== NOT EXECUTED 5444: eb000394 bl 629c <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 5448: e59f3044 ldr r3, [pc, #68] ; 5494 <== NOT EXECUTED 544c: e283204c add r2, r3, #76 ; 0x4c <== NOT EXECUTED the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 5450: e2831048 add r1, r3, #72 ; 0x48 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 5454: e5832048 str r2, [r3, #72] ; 0x48 <== NOT EXECUTED the_chain->permanent_null = NULL; 5458: e3a02000 mov r2, #0 <== NOT EXECUTED 545c: e583204c str r2, [r3, #76] ; 0x4c <== NOT EXECUTED the_chain->last = _Chain_Head(the_chain); 5460: e5831050 str r1, [r3, #80] ; 0x50 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 5464: e5832058 str r2, [r3, #88] ; 0x58 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 5468: e2831058 add r1, r3, #88 ; 0x58 <== NOT EXECUTED } rtems_chain_initialize_empty (&aio_request_queue.work_req); rtems_chain_initialize_empty (&aio_request_queue.idle_req); aio_request_queue.active_threads = 0; 546c: e5832064 str r2, [r3, #100] ; 0x64 <== NOT EXECUTED aio_request_queue.idle_threads = 0; 5470: e5832068 str r2, [r3, #104] ; 0x68 <== NOT EXECUTED aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; 5474: e59f2020 ldr r2, [pc, #32] ; 549c <== NOT EXECUTED 5478: e5831054 str r1, [r3, #84] ; 0x54 <== NOT EXECUTED the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 547c: e2831054 add r1, r3, #84 ; 0x54 <== NOT EXECUTED 5480: e583105c str r1, [r3, #92] ; 0x5c <== NOT EXECUTED 5484: e5832060 str r2, [r3, #96] ; 0x60 <== NOT EXECUTED return result; } 5488: e1a00004 mov r0, r4 <== NOT EXECUTED 548c: e8bd8010 pop {r4, pc} <== NOT EXECUTED =============================================================================== 000057a0 : rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { rtems_chain_node *node; AIO_printf ("FD exists \n"); node = chain->first; 57a0: e1a02000 mov r2, r0 <== NOT EXECUTED 57a4: e4923004 ldr r3, [r2], #4 <== NOT EXECUTED if (rtems_chain_is_empty (chain)) { 57a8: e1530002 cmp r3, r2 <== NOT EXECUTED 57ac: 0a00000c beq 57e4 <== NOT EXECUTED 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; 57b0: e5930014 ldr r0, [r3, #20] <== NOT EXECUTED while (req->aiocbp->aio_reqprio > prio && 57b4: e591c014 ldr ip, [r1, #20] <== NOT EXECUTED 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; 57b8: e5900014 ldr r0, [r0, #20] <== NOT EXECUTED while (req->aiocbp->aio_reqprio > prio && 57bc: e59cc014 ldr ip, [ip, #20] <== NOT EXECUTED 57c0: ea000002 b 57d0 <== NOT EXECUTED !rtems_chain_is_tail (chain, node)) { node = node->next; 57c4: e5933000 ldr r3, [r3] <== NOT EXECUTED prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; 57c8: e5930014 ldr r0, [r3, #20] <== NOT EXECUTED 57cc: e5900014 ldr r0, [r0, #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 && 57d0: e15c0000 cmp ip, r0 <== NOT EXECUTED 57d4: da000001 ble 57e0 <== NOT EXECUTED 57d8: e1530002 cmp r3, r2 <== NOT EXECUTED 57dc: 1afffff8 bne 57c4 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void rtems_chain_insert( rtems_chain_node *after_node, rtems_chain_node *the_node ) { _Chain_Insert( after_node, the_node ); 57e0: e5930004 ldr r0, [r3, #4] <== NOT EXECUTED 57e4: e2811008 add r1, r1, #8 <== NOT EXECUTED 57e8: ea00087a b 79d8 <_Chain_Insert> <== NOT EXECUTED =============================================================================== 000057ec : * Output parameters: * NONE */ void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain) { 57ec: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED rtems_chain_control *chain; rtems_chain_node *node; chain = &r_chain->perfd; node = chain->first; 57f0: e5904010 ldr r4, [r0, #16] <== NOT EXECUTED 57f4: e2807014 add r7, r0, #20 <== 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; 57f8: e3a0608c mov r6, #140 ; 0x8c <== NOT EXECUTED req->aiocbp->return_value = -1; 57fc: e3e05000 mvn r5, #0 <== NOT EXECUTED rtems_chain_node *node; chain = &r_chain->perfd; node = chain->first; while (!rtems_chain_is_tail (chain, node)) 5800: ea000006 b 5820 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 5804: e1a00004 mov r0, r4 <== NOT EXECUTED 5808: eb00085d bl 7984 <_Chain_Extract> <== NOT EXECUTED { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; req->aiocbp->error_code = ECANCELED; 580c: e5943014 ldr r3, [r4, #20] <== NOT EXECUTED req->aiocbp->return_value = -1; free (req); 5810: 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; 5814: e5836030 str r6, [r3, #48] ; 0x30 <== NOT EXECUTED req->aiocbp->return_value = -1; 5818: e5835034 str r5, [r3, #52] ; 0x34 <== NOT EXECUTED free (req); 581c: ebfff326 bl 24bc <== NOT EXECUTED rtems_chain_node *node; chain = &r_chain->perfd; node = chain->first; while (!rtems_chain_is_tail (chain, node)) 5820: e1540007 cmp r4, r7 <== NOT EXECUTED 5824: 1afffff6 bne 5804 <== NOT EXECUTED rtems_aio_request *req = (rtems_aio_request *) node; req->aiocbp->error_code = ECANCELED; req->aiocbp->return_value = -1; free (req); } } 5828: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED =============================================================================== 0000582c : * 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) { 582c: e92d4010 push {r4, lr} <== NOT EXECUTED rtems_chain_node *node = chain->first; 5830: e4904004 ldr r4, [r0], #4 <== NOT EXECUTED rtems_aio_request *current; current = (rtems_aio_request *) node; while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { 5834: ea000000 b 583c <== NOT EXECUTED node = node->next; 5838: e5944000 ldr r4, [r4] <== NOT EXECUTED rtems_chain_node *node = chain->first; rtems_aio_request *current; current = (rtems_aio_request *) node; while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { 583c: e1540000 cmp r4, r0 <== NOT EXECUTED 5840: 0a00000d beq 587c <== NOT EXECUTED 5844: e5943014 ldr r3, [r4, #20] <== NOT EXECUTED 5848: e1530001 cmp r3, r1 <== NOT EXECUTED 584c: 1afffff9 bne 5838 <== NOT EXECUTED 5850: e1a00004 mov r0, r4 <== NOT EXECUTED 5854: eb00084a bl 7984 <_Chain_Extract> <== NOT EXECUTED if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; 5858: e5943014 ldr r3, [r4, #20] <== NOT EXECUTED 585c: e3a0208c mov r2, #140 ; 0x8c <== NOT EXECUTED 5860: e5832030 str r2, [r3, #48] ; 0x30 <== NOT EXECUTED current->aiocbp->return_value = -1; 5864: e3e02000 mvn r2, #0 <== NOT EXECUTED free (current); 5868: e1a00004 mov r0, r4 <== NOT EXECUTED return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; current->aiocbp->return_value = -1; 586c: e5832034 str r2, [r3, #52] ; 0x34 <== NOT EXECUTED free (current); 5870: ebfff311 bl 24bc <== NOT EXECUTED } return AIO_CANCELED; 5874: e3a00000 mov r0, #0 <== NOT EXECUTED 5878: e8bd8010 pop {r4, pc} <== NOT EXECUTED node = node->next; current = (rtems_aio_request *) node; } if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; 587c: e3a00001 mov r0, #1 <== NOT EXECUTED current->aiocbp->return_value = -1; free (current); } return AIO_CANCELED; } 5880: e8bd8010 pop {r4, pc} <== NOT EXECUTED =============================================================================== 000054a0 : rtems_aio_search_fd (rtems_chain_control *chain, int fildes, int create) { rtems_aio_request_chain *r_chain; rtems_chain_node *node; node = chain->first; 54a0: e1a03000 mov r3, r0 * */ rtems_aio_request_chain * rtems_aio_search_fd (rtems_chain_control *chain, int fildes, int create) { 54a4: e92d40f0 push {r4, r5, r6, r7, lr} 54a8: e1a04000 mov r4, r0 rtems_aio_request_chain *r_chain; rtems_chain_node *node; node = chain->first; 54ac: e4937004 ldr r7, [r3], #4 54b0: ea000000 b 54b8 r_chain = (rtems_aio_request_chain *) node; while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { node = node->next; 54b4: e1a07000 mov r7, r0 rtems_chain_node *node; node = chain->first; r_chain = (rtems_aio_request_chain *) node; while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 54b8: e5970000 ldr r0, [r7] 54bc: e1500001 cmp r0, r1 node = node->next; r_chain = (rtems_aio_request_chain *) node; 54c0: e1a06007 mov r6, r7 rtems_chain_node *node; node = chain->first; r_chain = (rtems_aio_request_chain *) node; while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 54c4: ba000003 blt 54d8 node = node->next; r_chain = (rtems_aio_request_chain *) node; } if (r_chain->fildes == fildes) r_chain->new_fd = 0; 54c8: 03a03000 moveq r3, #0 54cc: 05873004 streq r3, [r7, #4] while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { node = node->next; r_chain = (rtems_aio_request_chain *) node; } if (r_chain->fildes == fildes) 54d0: 0a000018 beq 5538 54d4: ea000001 b 54e0 rtems_chain_node *node; node = chain->first; r_chain = (rtems_aio_request_chain *) node; while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 54d8: e1570003 cmp r7, r3 54dc: 1afffff4 bne 54b4 } if (r_chain->fildes == fildes) r_chain->new_fd = 0; else { if (create == 0) 54e0: e3520000 cmp r2, #0 r_chain = NULL; 54e4: 01a06002 moveq r6, r2 } if (r_chain->fildes == fildes) r_chain->new_fd = 0; else { if (create == 0) 54e8: 0a000012 beq 5538 r_chain = NULL; else { r_chain = malloc (sizeof (rtems_aio_request_chain)); 54ec: e3a00024 mov r0, #36 ; 0x24 <== NOT EXECUTED 54f0: ebfff4fe bl 28f0 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 54f4: e2803014 add r3, r0, #20 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 54f8: e5803010 str r3, [r0, #16] <== NOT EXECUTED the_chain->permanent_null = NULL; 54fc: e3a03000 mov r3, #0 <== NOT EXECUTED 5500: e5803014 str r3, [r0, #20] <== NOT EXECUTED rtems_chain_initialize_empty (&r_chain->perfd); if (rtems_chain_is_empty (chain)) 5504: e5942000 ldr r2, [r4] <== NOT EXECUTED else { if (create == 0) r_chain = NULL; else { r_chain = malloc (sizeof (rtems_aio_request_chain)); rtems_chain_initialize_empty (&r_chain->perfd); 5508: e2803010 add r3, r0, #16 <== NOT EXECUTED the_chain->last = _Chain_Head(the_chain); 550c: e5803018 str r3, [r0, #24] <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 5510: e2843004 add r3, r4, #4 <== NOT EXECUTED if (rtems_chain_is_empty (chain)) 5514: e1520003 cmp r2, r3 <== NOT EXECUTED r_chain->new_fd = 0; else { if (create == 0) r_chain = NULL; else { r_chain = malloc (sizeof (rtems_aio_request_chain)); 5518: e1a05000 mov r5, r0 <== NOT EXECUTED 551c: e1a06000 mov r6, r0 <== NOT EXECUTED 5520: e2801008 add r1, r0, #8 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); 5524: 01a00004 moveq r0, r4 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void rtems_chain_insert( rtems_chain_node *after_node, rtems_chain_node *the_node ) { _Chain_Insert( after_node, the_node ); 5528: 15970004 ldrne r0, [r7, #4] <== NOT EXECUTED 552c: eb000929 bl 79d8 <_Chain_Insert> <== NOT EXECUTED if (rtems_chain_is_empty (chain)) rtems_chain_prepend (chain, &r_chain->next_fd); else rtems_chain_insert (node->previous, &r_chain->next_fd); r_chain->new_fd = 1; 5530: e3a03001 mov r3, #1 <== NOT EXECUTED 5534: e5853004 str r3, [r5, #4] <== NOT EXECUTED } } return r_chain; } 5538: e1a00006 mov r0, r6 553c: e8bd80f0 pop {r4, r5, r6, r7, pc} =============================================================================== 0000c4c4 : rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { c4c4: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) c4c8: e252a000 subs sl, r2, #0 rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { c4cc: e1a04000 mov r4, r0 c4d0: e1a05001 mov r5, r1 bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; c4d4: 03a00009 moveq r0, #9 ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) c4d8: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; c4dc: e59f313c ldr r3, [pc, #316] ; c620 c4e0: e5937004 ldr r7, [r3, #4] api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; c4e4: e5d78074 ldrb r8, [r7, #116] ; 0x74 if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; c4e8: e5976104 ldr r6, [r7, #260] ; 0x104 asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) c4ec: e597307c ldr r3, [r7, #124] ; 0x7c executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; c4f0: e3580000 cmp r8, #0 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; c4f4: e5d69008 ldrb r9, [r6, #8] executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; c4f8: 03a08c01 moveq r8, #256 ; 0x100 c4fc: 13a08000 movne r8, #0 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) c500: e3530000 cmp r3, #0 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; c504: 13888c02 orrne r8, r8, #512 ; 0x200 old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; c508: e3590000 cmp r9, #0 c50c: 03a09b01 moveq r9, #1024 ; 0x400 c510: 13a09000 movne r9, #0 old_mode |= _ISR_Get_level(); c514: ebffeff9 bl 8500 <_CPU_ISR_Get_level> if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; c518: e1899000 orr r9, r9, r0 old_mode |= _ISR_Get_level(); c51c: e1898008 orr r8, r9, r8 *previous_mode_set = old_mode; /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) c520: e3150c01 tst r5, #256 ; 0x100 old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; old_mode |= _ISR_Get_level(); *previous_mode_set = old_mode; c524: e58a8000 str r8, [sl] /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) c528: 0a000003 beq c53c executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; c52c: e3140c01 tst r4, #256 ; 0x100 c530: 13a03000 movne r3, #0 c534: 03a03001 moveq r3, #1 c538: e5c73074 strb r3, [r7, #116] ; 0x74 if ( mask & RTEMS_TIMESLICE_MASK ) { c53c: e3150c02 tst r5, #512 ; 0x200 c540: 0a000006 beq c560 if ( _Modes_Is_timeslice(mode_set) ) { c544: e2143c02 ands r3, r4, #512 ; 0x200 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; c548: 13a03001 movne r3, #1 c54c: 1587307c strne r3, [r7, #124] ; 0x7c executing->cpu_time_budget = _Thread_Ticks_per_timeslice; c550: 159f30cc ldrne r3, [pc, #204] ; c624 c554: 15933000 ldrne r3, [r3] } else executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; c558: 0587307c streq r3, [r7, #124] ; 0x7c executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; if ( mask & RTEMS_TIMESLICE_MASK ) { if ( _Modes_Is_timeslice(mode_set) ) { executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; executing->cpu_time_budget = _Thread_Ticks_per_timeslice; c55c: 15873078 strne r3, [r7, #120] ; 0x78 } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) c560: e3150080 tst r5, #128 ; 0x80 c564: 0a000001 beq c570 */ RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level ( Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); c568: e2040080 and r0, r4, #128 ; 0x80 c56c: ebffefde bl 84ec <_CPU_ISR_Set_level> * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { c570: e2150b01 ands r0, r5, #1024 ; 0x400 c574: 0a000013 beq c5c8 * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( c578: e3140b01 tst r4, #1024 ; 0x400 is_asr_enabled = false; needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { c57c: e5d62008 ldrb r2, [r6, #8] * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( c580: 13a03000 movne r3, #0 c584: 03a03001 moveq r3, #1 is_asr_enabled = false; needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { c588: e1520003 cmp r2, r3 /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; c58c: 03a00000 moveq r0, #0 if ( mask & RTEMS_ASR_MASK ) { is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { c590: 0a00000c beq c5c8 asr->is_enabled = is_asr_enabled; c594: e5c63008 strb r3, [r6, #8] static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( c598: e10f3000 mrs r3, CPSR c59c: e3832080 orr r2, r3, #128 ; 0x80 c5a0: e129f002 msr CPSR_fc, r2 { rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); _signals = information->signals_pending; c5a4: e2861014 add r1, r6, #20 c5a8: e8910006 ldm r1, {r1, r2} information->signals_pending = information->signals_posted; information->signals_posted = _signals; c5ac: e5862014 str r2, [r6, #20] rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); _signals = information->signals_pending; information->signals_pending = information->signals_posted; c5b0: e5861018 str r1, [r6, #24] static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( c5b4: e129f003 msr CPSR_fc, r3 _ASR_Swap_signals( asr ); if ( _ASR_Are_signals_pending( asr ) ) { c5b8: e5960014 ldr r0, [r6, #20] /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; c5bc: e3500000 cmp r0, #0 c5c0: 13a00001 movne r0, #1 c5c4: 03a00000 moveq r0, #0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { c5c8: e59f3058 ldr r3, [pc, #88] ; c628 c5cc: e5933000 ldr r3, [r3] c5d0: e3530003 cmp r3, #3 c5d4: 1a00000f bne c618 bool are_signals_pending ) { Thread_Control *executing; executing = _Thread_Executing; c5d8: e59f2040 ldr r2, [pc, #64] ; c620 if ( are_signals_pending || c5dc: e3500000 cmp r0, #0 bool are_signals_pending ) { Thread_Control *executing; executing = _Thread_Executing; c5e0: e5923004 ldr r3, [r2, #4] if ( are_signals_pending || c5e4: 1a000005 bne c600 c5e8: e5922008 ldr r2, [r2, #8] c5ec: e1530002 cmp r3, r2 c5f0: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} (!_Thread_Is_heir( executing ) && executing->is_preemptible) ) { c5f4: e5d33074 ldrb r3, [r3, #116] ; 0x74 c5f8: e3530000 cmp r3, #0 c5fc: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} _Thread_Dispatch_necessary = true; c600: e59f3018 ldr r3, [pc, #24] ; c620 c604: e3a02001 mov r2, #1 c608: e5c32010 strb r2, [r3, #16] if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); c60c: ebffe9c2 bl 6d1c <_Thread_Dispatch> } return RTEMS_SUCCESSFUL; c610: e3a00000 mov r0, #0 c614: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} c618: e3a00000 mov r0, #0 <== NOT EXECUTED } c61c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED =============================================================================== 00005734 : struct sigaction *oact ) { ISR_Level level; if ( oact ) 5734: e2523000 subs r3, r2, #0 *oact = _POSIX_signals_Vectors[ sig ]; 5738: 159f20b8 ldrne r2, [pc, #184] ; 57f8 int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { 573c: e92d40f0 push {r4, r5, r6, r7, lr} 5740: e1a05001 mov r5, r1 ISR_Level level; if ( oact ) *oact = _POSIX_signals_Vectors[ sig ]; 5744: 13a0100c movne r1, #12 5748: 10222091 mlane r2, r1, r0, r2 int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { 574c: e1a04000 mov r4, r0 ISR_Level level; if ( oact ) *oact = _POSIX_signals_Vectors[ sig ]; 5750: 18920007 ldmne r2, {r0, r1, r2} 5754: 18830007 stmne r3, {r0, r1, r2} if ( !sig ) 5758: e3540000 cmp r4, #0 575c: 0a000004 beq 5774 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 5760: e2443001 sub r3, r4, #1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 5764: e353001f cmp r3, #31 5768: 8a000001 bhi 5774 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) 576c: e3540009 cmp r4, #9 5770: 1a000004 bne 5788 rtems_set_errno_and_return_minus_one( EINVAL ); 5774: eb002104 bl db8c <__errno> 5778: e3a03016 mov r3, #22 577c: e5803000 str r3, [r0] 5780: e3e00000 mvn r0, #0 5784: e8bd80f0 pop {r4, r5, r6, r7, pc} /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { 5788: e3550000 cmp r5, #0 578c: 0a000017 beq 57f0 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 5790: e10f6000 mrs r6, CPSR 5794: e3863080 orr r3, r6, #128 ; 0x80 5798: 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 ) { 579c: e5953008 ldr r3, [r5, #8] 57a0: e3530000 cmp r3, #0 57a4: e59f704c ldr r7, [pc, #76] ; 57f8 57a8: 1a000007 bne 57cc _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; 57ac: e283300c add r3, r3, #12 57b0: e0040493 mul r4, r3, r4 57b4: e59f2040 ldr r2, [pc, #64] ; 57fc 57b8: e0873004 add r3, r7, r4 57bc: e0824004 add r4, r2, r4 57c0: e8940007 ldm r4, {r0, r1, r2} 57c4: e8830007 stm r3, {r0, r1, r2} 57c8: ea000005 b 57e4 } else { _POSIX_signals_Clear_process_signals( sig ); 57cc: e1a00004 mov r0, r4 57d0: eb001575 bl adac <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; 57d4: e3a0300c mov r3, #12 57d8: e0247493 mla r4, r3, r4, r7 57dc: e8950007 ldm r5, {r0, r1, r2} 57e0: e8840007 stm r4, {r0, r1, r2} static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 57e4: e129f006 msr CPSR_fc, r6 * 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; 57e8: e3a00000 mov r0, #0 57ec: e8bd80f0 pop {r4, r5, r6, r7, pc} 57f0: e1a00005 mov r0, r5 <== NOT EXECUTED } 57f4: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED =============================================================================== 00007dac : int sigwait( const sigset_t *set, int *sig ) { 7dac: e92d4010 push {r4, lr} 7db0: e1a04001 mov r4, r1 int status; status = sigtimedwait( set, NULL, NULL ); 7db4: e3a01000 mov r1, #0 7db8: e1a02001 mov r2, r1 7dbc: ebffff84 bl 7bd4 if ( status != -1 ) { 7dc0: e3700001 cmn r0, #1 7dc4: 0a000004 beq 7ddc if ( sig ) 7dc8: e3540000 cmp r4, #0 *sig = status; 7dcc: 15840000 strne r0, [r4] return 0; 7dd0: 13a00000 movne r0, #0 int status; status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) 7dd4: 18bd8010 popne {r4, pc} 7dd8: ea000002 b 7de8 <== NOT EXECUTED *sig = status; return 0; } return errno; 7ddc: eb002032 bl feac <__errno> 7de0: e5900000 ldr r0, [r0] 7de4: e8bd8010 pop {r4, pc} status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) *sig = status; return 0; 7de8: e1a00004 mov r0, r4 <== NOT EXECUTED } return errno; } 7dec: e8bd8010 pop {r4, pc} <== NOT EXECUTED