=============================================================================== 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> =============================================================================== 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 =============================================================================== 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