=============================================================================== 00009928 <_CORE_mutex_Seize_interrupt_trylock>: { Thread_Control *executing; /* disabled when you get here */ executing = _Thread_Executing; 9928: e59f3120 ldr r3, [pc, #288] ; 9a50 <_CORE_mutex_Seize_interrupt_trylock+0x128> 992c: e5933000 ldr r3, [r3] executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 9930: e3a02000 mov r2, #0 9934: e5832034 str r2, [r3, #52] ; 0x34 if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 9938: e590c050 ldr ip, [r0, #80] ; 0x50 993c: e15c0002 cmp ip, r2 #if defined(__RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__) int _CORE_mutex_Seize_interrupt_trylock( CORE_mutex_Control *the_mutex, ISR_Level *level_p ) { 9940: e52de004 push {lr} ; (str lr, [sp, #-4]!) 9944: 0a00002c beq 99fc <_CORE_mutex_Seize_interrupt_trylock+0xd4> the_mutex->lock = CORE_MUTEX_LOCKED; 9948: e5802050 str r2, [r0, #80] ; 0x50 */ RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 994c: e5902048 ldr r2, [r0, #72] ; 0x48 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 9950: e593c008 ldr ip, [r3, #8] the_mutex->nest_count = 1; if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 9954: e3520002 cmp r2, #2 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 9958: e580c060 str ip, [r0, #96] ; 0x60 the_mutex->nest_count = 1; 995c: e3a0c001 mov ip, #1 9960: e580c054 str ip, [r0, #84] ; 0x54 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 9964: e580305c str r3, [r0, #92] ; 0x5c the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 9968: 0a000001 beq 9974 <_CORE_mutex_Seize_interrupt_trylock+0x4c> 996c: e3520003 cmp r2, #3 9970: 1a000004 bne 9988 <_CORE_mutex_Seize_interrupt_trylock+0x60> _Chain_Prepend_unprotected( &executing->lock_mutex, &the_mutex->queue.lock_queue ); the_mutex->queue.priority_before = executing->current_priority; #endif executing->resource_count++; 9974: e593c01c ldr ip, [r3, #28] } if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 9978: e3520003 cmp r2, #3 _Chain_Prepend_unprotected( &executing->lock_mutex, &the_mutex->queue.lock_queue ); the_mutex->queue.priority_before = executing->current_priority; #endif executing->resource_count++; 997c: e28c2001 add r2, ip, #1 9980: e583201c str r2, [r3, #28] } if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 9984: 0a000000 beq 998c <_CORE_mutex_Seize_interrupt_trylock+0x64> _ISR_Enable( *level_p ); 9988: ea00002a b 9a38 <_CORE_mutex_Seize_interrupt_trylock+0x110> */ { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; 998c: e590204c ldr r2, [r0, #76] ; 0x4c current = executing->current_priority; 9990: e593c014 ldr ip, [r3, #20] if ( current == ceiling ) { 9994: e15c0002 cmp ip, r2 9998: 1a000000 bne 99a0 <_CORE_mutex_Seize_interrupt_trylock+0x78> _ISR_Enable( *level_p ); 999c: ea000025 b 9a38 <_CORE_mutex_Seize_interrupt_trylock+0x110> return 0; } if ( current > ceiling ) { 99a0: 9a00000b bls 99d4 <_CORE_mutex_Seize_interrupt_trylock+0xac> rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 99a4: e59f30a8 ldr r3, [pc, #168] ; 9a54 <_CORE_mutex_Seize_interrupt_trylock+0x12c> 99a8: e5932000 ldr r2, [r3] 99ac: e2822001 add r2, r2, #1 99b0: e5832000 str r2, [r3] 99b4: e5913000 ldr r3, [r1] 99b8: e129f003 msr CPSR_fc, r3 _Thread_Disable_dispatch(); _ISR_Enable( *level_p ); _Thread_Change_priority( 99bc: e3a02000 mov r2, #0 99c0: e590104c ldr r1, [r0, #76] ; 0x4c 99c4: e590005c ldr r0, [r0, #92] ; 0x5c 99c8: ebfff278 bl 63b0 <_Thread_Change_priority> the_mutex->holder, the_mutex->Attributes.priority_ceiling, false ); _Thread_Enable_dispatch(); 99cc: ebfff3d8 bl 6934 <_Thread_Enable_dispatch> 99d0: ea00001a b 9a40 <_CORE_mutex_Seize_interrupt_trylock+0x118> return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 99d4: e3a02006 mov r2, #6 99d8: e5832034 str r2, [r3, #52] ; 0x34 the_mutex->lock = CORE_MUTEX_UNLOCKED; the_mutex->nest_count = 0; /* undo locking above */ 99dc: e3a02000 mov r2, #0 99e0: e5802054 str r2, [r0, #84] ; 0x54 _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 99e4: e2822001 add r2, r2, #1 99e8: e5802050 str r2, [r0, #80] ; 0x50 the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 99ec: e593201c ldr r2, [r3, #28] 99f0: e2422001 sub r2, r2, #1 99f4: e583201c str r2, [r3, #28] _ISR_Enable( *level_p ); 99f8: ea00000e b 9a38 <_CORE_mutex_Seize_interrupt_trylock+0x110> /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 99fc: e590205c ldr r2, [r0, #92] ; 0x5c 9a00: e1520003 cmp r2, r3 9a04: 1a00000f bne 9a48 <_CORE_mutex_Seize_interrupt_trylock+0x120> switch ( the_mutex->Attributes.lock_nesting_behavior ) { 9a08: e5903040 ldr r3, [r0, #64] ; 0x40 9a0c: e3530000 cmp r3, #0 9a10: 0a000002 beq 9a20 <_CORE_mutex_Seize_interrupt_trylock+0xf8> 9a14: e3530001 cmp r3, #1 9a18: 1a00000a bne 9a48 <_CORE_mutex_Seize_interrupt_trylock+0x120> 9a1c: ea000003 b 9a30 <_CORE_mutex_Seize_interrupt_trylock+0x108><== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 9a20: e5903054 ldr r3, [r0, #84] ; 0x54 9a24: e2833001 add r3, r3, #1 9a28: e5803054 str r3, [r0, #84] ; 0x54 _ISR_Enable( *level_p ); 9a2c: ea000001 b 9a38 <_CORE_mutex_Seize_interrupt_trylock+0x110> return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 9a30: e3a03002 mov r3, #2 <== NOT EXECUTED 9a34: e5823034 str r3, [r2, #52] ; 0x34 <== NOT EXECUTED 9a38: e5913000 ldr r3, [r1] 9a3c: e129f003 msr CPSR_fc, r3 9a40: e3a00000 mov r0, #0 9a44: e49df004 pop {pc} ; (ldr pc, [sp], #4) 9a48: e3a00001 mov r0, #1 return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p ); } 9a4c: e49df004 pop {pc} ; (ldr pc, [sp], #4) =============================================================================== 00006e90 <_Thread_queue_Enqueue_priority>: Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, ISR_Level *level_p ) { 6e90: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr} Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 6e94: e5913014 ldr r3, [r1, #20] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 6e98: e281503c add r5, r1, #60 ; 0x3c 6e9c: e5815038 str r5, [r1, #56] ; 0x38 the_chain->permanent_null = NULL; 6ea0: e3a05000 mov r5, #0 the_chain->last = _Chain_Head(the_chain); 6ea4: e281c038 add ip, r1, #56 ; 0x38 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 ) ) 6ea8: e3130020 tst r3, #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 ]; 6eac: e1a04323 lsr r4, r3, #6 RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 6eb0: e581503c str r5, [r1, #60] ; 0x3c 6eb4: e285500c add r5, r5, #12 the_chain->last = _Chain_Head(the_chain); 6eb8: e581c040 str ip, [r1, #64] ; 0x40 block_state = the_thread_queue->state; 6ebc: e5907038 ldr r7, [r0, #56] ; 0x38 _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 ]; 6ec0: e02c0495 mla ip, r5, r4, r0 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 6ec4: 159f8154 ldrne r8, [pc, #340] ; 7020 <_Thread_queue_Enqueue_priority+0x190> 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 ) ) 6ec8: 1a000023 bne 6f5c <_Thread_queue_Enqueue_priority+0xcc> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 6ecc: e28c8004 add r8, ip, #4 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 6ed0: e10f5000 mrs r5, CPSR 6ed4: e3854080 orr r4, r5, #128 ; 0x80 6ed8: e129f004 msr CPSR_fc, r4 goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->first; 6edc: e3e06000 mvn r6, #0 6ee0: e59c4000 ldr r4, [ip] while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 6ee4: ea00000b b 6f18 <_Thread_queue_Enqueue_priority+0x88> search_priority = search_thread->current_priority; 6ee8: e5946014 ldr r6, [r4, #20] if ( priority <= search_priority ) 6eec: e1530006 cmp r3, r6 6ef0: 9a00000a bls 6f20 <_Thread_queue_Enqueue_priority+0x90> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile ( 6ef4: e10fa000 mrs sl, CPSR 6ef8: e129f005 msr CPSR_fc, r5 6efc: e129f00a msr CPSR_fc, sl 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) ) { 6f00: e594a010 ldr sl, [r4, #16] 6f04: e117000a tst r7, sl 6f08: 1a000001 bne 6f14 <_Thread_queue_Enqueue_priority+0x84> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 6f0c: e129f005 msr CPSR_fc, r5 <== NOT EXECUTED 6f10: eaffffee b 6ed0 <_Thread_queue_Enqueue_priority+0x40> <== NOT EXECUTED _ISR_Enable( level ); goto restart_forward_search; } search_thread = (Thread_Control *)search_thread->Object.Node.next; 6f14: e5944000 ldr r4, [r4] 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 ) ) { 6f18: e1540008 cmp r4, r8 6f1c: 1afffff1 bne 6ee8 <_Thread_queue_Enqueue_priority+0x58> } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 6f20: e590c030 ldr ip, [r0, #48] ; 0x30 6f24: e35c0001 cmp ip, #1 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 ) ) { 6f28: e1a0c005 mov ip, r5 } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 6f2c: 1a000038 bne 7014 <_Thread_queue_Enqueue_priority+0x184> THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; if ( priority == search_priority ) 6f30: e1530006 cmp r3, r6 if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 6f34: e3a03000 mov r3, #0 6f38: e5803030 str r3, [r0, #48] ; 0x30 if ( priority == search_priority ) 6f3c: 0a00002a beq 6fec <_Thread_queue_Enqueue_priority+0x15c> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 6f40: e5943004 ldr r3, [r4, #4] the_node = (Chain_Node *) the_thread; the_node->next = search_node; 6f44: e5814000 str r4, [r1] the_node->previous = previous_node; 6f48: e5813004 str r3, [r1, #4] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 6f4c: e5810044 str r0, [r1, #68] ; 0x44 previous_node = search_node->previous; the_node = (Chain_Node *) the_thread; the_node->next = search_node; the_node->previous = previous_node; previous_node->next = the_node; 6f50: e5831000 str r1, [r3] search_node->previous = the_node; 6f54: e5841004 str r1, [r4, #4] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 6f58: ea000021 b 6fe4 <_Thread_queue_Enqueue_priority+0x154> return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 6f5c: e5d86000 ldrb r6, [r8] 6f60: e2866001 add r6, r6, #1 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 6f64: e10f5000 mrs r5, CPSR 6f68: e3854080 orr r4, r5, #128 ; 0x80 6f6c: e129f004 msr CPSR_fc, r4 _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; 6f70: e59c4008 ldr r4, [ip, #8] while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 6f74: ea00000b b 6fa8 <_Thread_queue_Enqueue_priority+0x118> search_priority = search_thread->current_priority; 6f78: e5946014 ldr r6, [r4, #20] if ( priority >= search_priority ) 6f7c: e1530006 cmp r3, r6 6f80: 2a00000a bcs 6fb0 <_Thread_queue_Enqueue_priority+0x120> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile ( 6f84: e10fa000 mrs sl, CPSR 6f88: e129f005 msr CPSR_fc, r5 6f8c: e129f00a msr CPSR_fc, sl 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) ) { 6f90: e594a010 ldr sl, [r4, #16] 6f94: e117000a tst r7, sl 6f98: 1a000001 bne 6fa4 <_Thread_queue_Enqueue_priority+0x114> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 6f9c: e129f005 msr CPSR_fc, r5 6fa0: eaffffed b 6f5c <_Thread_queue_Enqueue_priority+0xcc> _ISR_Enable( level ); goto restart_reverse_search; } search_thread = (Thread_Control *) 6fa4: e5944004 ldr r4, [r4, #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 ) ) { 6fa8: e154000c cmp r4, ip 6fac: 1afffff1 bne 6f78 <_Thread_queue_Enqueue_priority+0xe8> } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 6fb0: e590c030 ldr ip, [r0, #48] ; 0x30 6fb4: e35c0001 cmp ip, #1 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 ) ) { 6fb8: e1a0c005 mov ip, r5 } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 6fbc: 1a000014 bne 7014 <_Thread_queue_Enqueue_priority+0x184> THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; if ( priority == search_priority ) 6fc0: e1530006 cmp r3, r6 if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 6fc4: e3a03000 mov r3, #0 6fc8: e5803030 str r3, [r0, #48] ; 0x30 if ( priority == search_priority ) 6fcc: 0a000006 beq 6fec <_Thread_queue_Enqueue_priority+0x15c> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 6fd0: e5943000 ldr r3, [r4] the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 6fd4: e8810018 stm r1, {r3, r4} search_node->next = the_node; next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 6fd8: e5810044 str r0, [r1, #68] ; 0x44 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; 6fdc: e5841000 str r1, [r4] next_node->previous = the_node; 6fe0: e5831004 str r1, [r3, #4] 6fe4: e129f005 msr CPSR_fc, r5 6fe8: ea000007 b 700c <_Thread_queue_Enqueue_priority+0x17c> 6fec: e284403c add r4, r4, #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; 6ff0: e5943004 ldr r3, [r4, #4] the_node = (Chain_Node *) the_thread; the_node->next = search_node; 6ff4: e5814000 str r4, [r1] the_node->previous = previous_node; 6ff8: e5813004 str r3, [r1, #4] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 6ffc: e5810044 str r0, [r1, #68] ; 0x44 previous_node = search_node->previous; the_node = (Chain_Node *) the_thread; the_node->next = search_node; the_node->previous = previous_node; previous_node->next = the_node; 7000: e5831000 str r1, [r3] search_node->previous = the_node; 7004: e5841004 str r1, [r4, #4] 7008: e129f00c msr CPSR_fc, ip 700c: e3a00001 mov r0, #1 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 7010: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, 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; 7014: e582c000 str ip, [r2] return the_thread_queue->sync_state; 7018: e5900030 ldr r0, [r0, #48] ; 0x30 } 701c: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} =============================================================================== 00014a24 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 14a24: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} 14a28: e24dd020 sub sp, sp, #32 14a2c: e28d3014 add r3, sp, #20 14a30: e28d5008 add r5, sp, #8 RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 14a34: e3a09000 mov r9, #0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 14a38: e283a004 add sl, r3, #4 14a3c: e2858004 add r8, r5, #4 Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 14a40: e58d301c str r3, [sp, #28] static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 14a44: e2802008 add r2, r0, #8 static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 14a48: e2803040 add r3, r0, #64 ; 0x40 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 14a4c: e58da014 str sl, [sp, #20] the_chain->permanent_null = NULL; 14a50: e58d9018 str r9, [sp, #24] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 14a54: e58d8008 str r8, [sp, #8] the_chain->permanent_null = NULL; 14a58: e58d900c str r9, [sp, #12] the_chain->last = _Chain_Head(the_chain); 14a5c: e58d5010 str r5, [sp, #16] static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 14a60: e58d2004 str r2, [sp, #4] static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 14a64: e58d3000 str r3, [sp] * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 14a68: e1a04000 mov r4, r0 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 14a6c: e280b030 add fp, r0, #48 ; 0x30 /* * 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 ); 14a70: e2807068 add r7, r0, #104 ; 0x68 { /* * 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; 14a74: e28d2014 add r2, sp, #20 14a78: e5842078 str r2, [r4, #120] ; 0x78 static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 14a7c: e59f2168 ldr r2, [pc, #360] ; 14bec <_Timer_server_Body+0x1c8> 14a80: e5923000 ldr r3, [r2] /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 14a84: e594103c ldr r1, [r4, #60] ; 0x3c watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 14a88: e1a02005 mov r2, r5 14a8c: e0611003 rsb r1, r1, r3 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; 14a90: e584303c str r3, [r4, #60] ; 0x3c _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 14a94: e1a0000b mov r0, fp 14a98: eb000ffe bl 18a98 <_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(); 14a9c: e59f314c ldr r3, [pc, #332] ; 14bf0 <_Timer_server_Body+0x1cc> Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 14aa0: 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(); 14aa4: 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 ) { 14aa8: e1560002 cmp r6, r2 14aac: 9a000004 bls 14ac4 <_Timer_server_Body+0xa0> /* * 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 ); 14ab0: e0621006 rsb r1, r2, r6 14ab4: e1a00007 mov r0, r7 14ab8: e1a02005 mov r2, r5 14abc: eb000ff5 bl 18a98 <_Watchdog_Adjust_to_chain> 14ac0: ea000003 b 14ad4 <_Timer_server_Body+0xb0> /* * 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 ); 14ac4: 30662002 rsbcc r2, r6, r2 14ac8: 31a00007 movcc r0, r7 14acc: 33a01001 movcc r1, #1 14ad0: 3b000fc8 blcc 189f8 <_Watchdog_Adjust> } watchdogs->last_snapshot = snapshot; 14ad4: 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 ); 14ad8: e5940078 ldr r0, [r4, #120] ; 0x78 14adc: eb000228 bl 15384 <_Chain_Get> if ( timer == NULL ) { 14ae0: e2501000 subs r1, r0, #0 14ae4: 0a00000a beq 14b14 <_Timer_server_Body+0xf0> static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 14ae8: e5913038 ldr r3, [r1, #56] ; 0x38 14aec: e3530001 cmp r3, #1 _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 14af0: 02811010 addeq r1, r1, #16 14af4: 01a0000b moveq r0, fp static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 14af8: 0a000003 beq 14b0c <_Timer_server_Body+0xe8> _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 14afc: e3530003 cmp r3, #3 14b00: 1afffff4 bne 14ad8 <_Timer_server_Body+0xb4> _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 14b04: e2811010 add r1, r1, #16 14b08: e1a00007 mov r0, r7 14b0c: eb00100e bl 18b4c <_Watchdog_Insert> 14b10: eafffff0 b 14ad8 <_Timer_server_Body+0xb4> static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 14b14: e10f3000 mrs r3, CPSR 14b18: e3832080 orr r2, r3, #128 ; 0x80 14b1c: e129f002 msr CPSR_fc, r2 * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); if ( _Chain_Is_empty( insert_chain ) ) { 14b20: e59d2014 ldr r2, [sp, #20] 14b24: e152000a cmp r2, sl 14b28: 1a000005 bne 14b44 <_Timer_server_Body+0x120> ts->insert_chain = NULL; 14b2c: e5841078 str r1, [r4, #120] ; 0x78 static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 14b30: e129f003 msr CPSR_fc, r3 _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 ) ) { 14b34: e59d3008 ldr r3, [sp, #8] 14b38: e1530008 cmp r3, r8 14b3c: 1a000002 bne 14b4c <_Timer_server_Body+0x128> 14b40: ea000015 b 14b9c <_Timer_server_Body+0x178> 14b44: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED 14b48: eaffffcb b 14a7c <_Timer_server_Body+0x58> <== NOT EXECUTED static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 14b4c: e10f2000 mrs r2, CPSR 14b50: e3823080 orr r3, r2, #128 ; 0x80 14b54: e129f003 msr CPSR_fc, r3 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 14b58: e59d3008 ldr r3, [sp, #8] */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 14b5c: e1530008 cmp r3, r8 14b60: 0a00000b beq 14b94 <_Timer_server_Body+0x170> { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 14b64: e5931000 ldr r1, [r3] * It is essential that interrupts are disable here since an interrupt * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { 14b68: e3530000 cmp r3, #0 the_chain->first = new_first; 14b6c: e58d1008 str r1, [sp, #8] new_first->previous = _Chain_Head(the_chain); 14b70: e5815004 str r5, [r1, #4] 14b74: 0a000006 beq 14b94 <_Timer_server_Body+0x170> watchdog->state = WATCHDOG_INACTIVE; 14b78: e5839008 str r9, [r3, #8] static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 14b7c: e129f002 msr CPSR_fc, r2 /* * 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 ); 14b80: e2830020 add r0, r3, #32 14b84: e8900003 ldm r0, {r0, r1} 14b88: e1a0e00f mov lr, pc 14b8c: e593f01c ldr pc, [r3, #28] } 14b90: eaffffed b 14b4c <_Timer_server_Body+0x128> 14b94: e129f002 msr CPSR_fc, r2 14b98: eaffffb5 b 14a74 <_Timer_server_Body+0x50> } else { ts->active = false; 14b9c: e5c4907c strb r9, [r4, #124] ; 0x7c 14ba0: e59f304c ldr r3, [pc, #76] ; 14bf4 <_Timer_server_Body+0x1d0> 14ba4: e5932000 ldr r2, [r3] 14ba8: e2822001 add r2, r2, #1 14bac: e5832000 str r2, [r3] /* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING ); 14bb0: e3a01008 mov r1, #8 14bb4: e5940000 ldr r0, [r4] 14bb8: eb000d42 bl 180c8 <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 14bbc: e1a00004 mov r0, r4 14bc0: ebffff6b bl 14974 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); 14bc4: e1a00004 mov r0, r4 14bc8: ebffff7f bl 149cc <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); 14bcc: eb000aae bl 1768c <_Thread_Enable_dispatch> ts->active = true; 14bd0: e3a03001 mov r3, #1 14bd4: 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 ); 14bd8: e59d0004 ldr r0, [sp, #4] 14bdc: eb001033 bl 18cb0 <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 14be0: e59d0000 ldr r0, [sp] 14be4: eb001031 bl 18cb0 <_Watchdog_Remove> 14be8: eaffffa1 b 14a74 <_Timer_server_Body+0x50>