30005338 <_POSIX_Condition_variables_Wait_support>: pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, bool already_timedout ) { 30005338: e92d45f1 push {r0, r4, r5, r6, r7, r8, sl, lr} 3000533c: e1a04001 mov r4, r1 30005340: e1a06000 mov r6, r0 register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; int status; int mutex_status; if ( !_POSIX_Mutex_Get( mutex, &location ) ) { 30005344: e1a0100d mov r1, sp 30005348: e1a00004 mov r0, r4 pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, bool already_timedout ) { 3000534c: e1a08002 mov r8, r2 30005350: e20370ff and r7, r3, #255 ; 0xff register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; int status; int mutex_status; if ( !_POSIX_Mutex_Get( mutex, &location ) ) { 30005354: eb00006f bl 30005518 <_POSIX_Mutex_Get> 30005358: e3500000 cmp r0, #0 3000535c: 0a000032 beq 3000542c <_POSIX_Condition_variables_Wait_support+0xf4> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 30005360: e59f30d0 ldr r3, [pc, #208] ; 30005438 <_POSIX_Condition_variables_Wait_support+0x100> return EINVAL; } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location ); 30005364: e1a0100d mov r1, sp 30005368: e5932000 ldr r2, [r3] 3000536c: e1a00006 mov r0, r6 30005370: e2422001 sub r2, r2, #1 30005374: e5832000 str r2, [r3] 30005378: ebffff7d bl 30005174 <_POSIX_Condition_variables_Get> switch ( location ) { 3000537c: e59d3000 ldr r3, [sp] return EINVAL; } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location ); 30005380: e1a0a000 mov sl, r0 switch ( location ) { 30005384: e3530000 cmp r3, #0 30005388: 1a000027 bne 3000542c <_POSIX_Condition_variables_Wait_support+0xf4> case OBJECTS_LOCAL: if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) { 3000538c: e5903014 ldr r3, [r0, #20] 30005390: e3530000 cmp r3, #0 30005394: 0a000004 beq 300053ac <_POSIX_Condition_variables_Wait_support+0x74> 30005398: e5942000 ldr r2, [r4] 3000539c: e1530002 cmp r3, r2 300053a0: 0a000001 beq 300053ac <_POSIX_Condition_variables_Wait_support+0x74> _Thread_Enable_dispatch(); 300053a4: eb000bab bl 30008258 <_Thread_Enable_dispatch> 300053a8: ea00001f b 3000542c <_POSIX_Condition_variables_Wait_support+0xf4> return EINVAL; } (void) pthread_mutex_unlock( mutex ); 300053ac: e1a00004 mov r0, r4 300053b0: eb0000de bl 30005730 _Thread_Enable_dispatch(); return EINVAL; } */ if ( !already_timedout ) { 300053b4: e3570000 cmp r7, #0 300053b8: 1a000015 bne 30005414 <_POSIX_Condition_variables_Wait_support+0xdc> the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 300053bc: e59f5078 ldr r5, [pc, #120] ; 3000543c <_POSIX_Condition_variables_Wait_support+0x104> return EINVAL; } */ if ( !already_timedout ) { the_cond->Mutex = *mutex; 300053c0: e5942000 ldr r2, [r4] _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 300053c4: e5953000 ldr r3, [r5] return EINVAL; } */ if ( !already_timedout ) { the_cond->Mutex = *mutex; 300053c8: e58a2014 str r2, [sl, #20] _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 300053cc: e5837034 str r7, [r3, #52] ; 0x34 _Thread_Executing->Wait.queue = &the_cond->Wait_queue; _Thread_Executing->Wait.id = *cond; 300053d0: e5961000 ldr r1, [r6] if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; 300053d4: e28a2018 add r2, sl, #24 _Thread_Executing->Wait.id = *cond; 300053d8: e5831020 str r1, [r3, #32] RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 300053dc: e3a01001 mov r1, #1 if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; 300053e0: e5832044 str r2, [r3, #68] ; 0x44 _Thread_Executing->Wait.id = *cond; _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout ); 300053e4: e1a00002 mov r0, r2 300053e8: e58a1048 str r1, [sl, #72] ; 0x48 300053ec: e59f204c ldr r2, [pc, #76] ; 30005440 <_POSIX_Condition_variables_Wait_support+0x108> 300053f0: e1a01008 mov r1, r8 300053f4: eb000cd0 bl 3000873c <_Thread_queue_Enqueue_with_handler> _Thread_Enable_dispatch(); 300053f8: eb000b96 bl 30008258 <_Thread_Enable_dispatch> /* * Switch ourself out because we blocked as a result of the * _Thread_queue_Enqueue. */ status = _Thread_Executing->Wait.return_code; 300053fc: e5953000 ldr r3, [r5] 30005400: e5935034 ldr r5, [r3, #52] ; 0x34 if ( status && status != ETIMEDOUT ) 30005404: e3550074 cmp r5, #116 ; 0x74 30005408: 13550000 cmpne r5, #0 3000540c: 0a000002 beq 3000541c <_POSIX_Condition_variables_Wait_support+0xe4> 30005410: ea000006 b 30005430 <_POSIX_Condition_variables_Wait_support+0xf8> <== NOT EXECUTED return status; } else { _Thread_Enable_dispatch(); 30005414: eb000b8f bl 30008258 <_Thread_Enable_dispatch> 30005418: e3a05074 mov r5, #116 ; 0x74 /* * When we get here the dispatch disable level is 0. */ mutex_status = pthread_mutex_lock( mutex ); 3000541c: e1a00004 mov r0, r4 30005420: eb0000a3 bl 300056b4 if ( mutex_status ) 30005424: e3500000 cmp r0, #0 30005428: 0a000000 beq 30005430 <_POSIX_Condition_variables_Wait_support+0xf8> 3000542c: e3a05016 mov r5, #22 case OBJECTS_ERROR: break; } return EINVAL; } 30005430: e1a00005 mov r0, r5 30005434: e8bd85f8 pop {r3, r4, r5, r6, r7, r8, sl, pc} 30005438: 3001c6ac .word 0x3001c6ac 3000543c: 3001c760 .word 0x3001c760 30005440: 30008ae8 .word 0x30008ae8 30006710 <_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 ) { 30006710: 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; 30006714: e5913014 ldr r3, [r1, #20] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 30006718: e281503c add r5, r1, #60 ; 0x3c 3000671c: e5815038 str r5, [r1, #56] ; 0x38 the_chain->permanent_null = NULL; 30006720: e3a05000 mov r5, #0 the_chain->last = _Chain_Head(the_chain); 30006724: 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 ) ) 30006728: 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 ]; 3000672c: 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; 30006730: e581503c str r5, [r1, #60] ; 0x3c 30006734: e285500c add r5, r5, #12 the_chain->last = _Chain_Head(the_chain); 30006738: e581c040 str ip, [r1, #64] ; 0x40 block_state = the_thread_queue->state; 3000673c: 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 ]; 30006740: 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; 30006744: 159f8154 ldrne r8, [pc, #340] ; 300068a0 <_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 ) ) 30006748: 1a000023 bne 300067dc <_Thread_queue_Enqueue_priority+0xcc> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 3000674c: e28c8004 add r8, ip, #4 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 30006750: e10f5000 mrs r5, CPSR 30006754: e3854080 orr r4, r5, #128 ; 0x80 30006758: 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; 3000675c: e3e06000 mvn r6, #0 30006760: e59c4000 ldr r4, [ip] while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 30006764: ea00000b b 30006798 <_Thread_queue_Enqueue_priority+0x88> search_priority = search_thread->current_priority; 30006768: e5946014 ldr r6, [r4, #20] if ( priority <= search_priority ) 3000676c: e1530006 cmp r3, r6 30006770: 9a00000a bls 300067a0 <_Thread_queue_Enqueue_priority+0x90> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile ( 30006774: e10fa000 mrs sl, CPSR 30006778: e129f005 msr CPSR_fc, r5 3000677c: 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) ) { 30006780: e594a010 ldr sl, [r4, #16] 30006784: e117000a tst r7, sl 30006788: 1a000001 bne 30006794 <_Thread_queue_Enqueue_priority+0x84> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 3000678c: e129f005 msr CPSR_fc, r5 <== NOT EXECUTED 30006790: eaffffee b 30006750 <_Thread_queue_Enqueue_priority+0x40> <== NOT EXECUTED _ISR_Enable( level ); goto restart_forward_search; } search_thread = (Thread_Control *)search_thread->Object.Node.next; 30006794: 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 ) ) { 30006798: e1540008 cmp r4, r8 3000679c: 1afffff1 bne 30006768 <_Thread_queue_Enqueue_priority+0x58> } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 300067a0: e5907030 ldr r7, [r0, #48] ; 0x30 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 ) ) { 300067a4: e1a0c005 mov ip, r5 } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 300067a8: e3570001 cmp r7, #1 300067ac: 1a000038 bne 30006894 <_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 ) 300067b0: 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; 300067b4: e3a03000 mov r3, #0 300067b8: e5803030 str r3, [r0, #48] ; 0x30 if ( priority == search_priority ) 300067bc: 0a00002a beq 3000686c <_Thread_queue_Enqueue_priority+0x15c> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 300067c0: e5943004 ldr r3, [r4, #4] the_node = (Chain_Node *) the_thread; the_node->next = search_node; 300067c4: e5814000 str r4, [r1] the_node->previous = previous_node; 300067c8: e5813004 str r3, [r1, #4] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 300067cc: 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; 300067d0: e5831000 str r1, [r3] search_node->previous = the_node; 300067d4: e5841004 str r1, [r4, #4] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 300067d8: ea000021 b 30006864 <_Thread_queue_Enqueue_priority+0x154> return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 300067dc: e5d86000 ldrb r6, [r8] 300067e0: e2866001 add r6, r6, #1 static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 300067e4: e10f5000 mrs r5, CPSR 300067e8: e3854080 orr r4, r5, #128 ; 0x80 300067ec: e129f004 msr CPSR_fc, r4 _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; 300067f0: e59c4008 ldr r4, [ip, #8] while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 300067f4: ea00000b b 30006828 <_Thread_queue_Enqueue_priority+0x118> search_priority = search_thread->current_priority; 300067f8: e5946014 ldr r6, [r4, #20] if ( priority >= search_priority ) 300067fc: e1530006 cmp r3, r6 30006800: 2a00000a bcs 30006830 <_Thread_queue_Enqueue_priority+0x120> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile ( 30006804: e10fa000 mrs sl, CPSR 30006808: e129f005 msr CPSR_fc, r5 3000680c: 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) ) { 30006810: e594a010 ldr sl, [r4, #16] 30006814: e117000a tst r7, sl 30006818: 1a000001 bne 30006824 <_Thread_queue_Enqueue_priority+0x114> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 3000681c: e129f005 msr CPSR_fc, r5 30006820: eaffffed b 300067dc <_Thread_queue_Enqueue_priority+0xcc> _ISR_Enable( level ); goto restart_reverse_search; } search_thread = (Thread_Control *) 30006824: 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 ) ) { 30006828: e154000c cmp r4, ip 3000682c: 1afffff1 bne 300067f8 <_Thread_queue_Enqueue_priority+0xe8> } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 30006830: e5907030 ldr r7, [r0, #48] ; 0x30 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 ) ) { 30006834: e1a0c005 mov ip, r5 } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 30006838: e3570001 cmp r7, #1 3000683c: 1a000014 bne 30006894 <_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 ) 30006840: 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; 30006844: e3a03000 mov r3, #0 30006848: e5803030 str r3, [r0, #48] ; 0x30 if ( priority == search_priority ) 3000684c: 0a000006 beq 3000686c <_Thread_queue_Enqueue_priority+0x15c> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 30006850: e5943000 ldr r3, [r4] the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 30006854: e8810018 stm r1, {r3, r4} search_node->next = the_node; next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 30006858: 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; 3000685c: e5841000 str r1, [r4] next_node->previous = the_node; 30006860: e5831004 str r1, [r3, #4] 30006864: e129f005 msr CPSR_fc, r5 30006868: ea000007 b 3000688c <_Thread_queue_Enqueue_priority+0x17c> 3000686c: 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; 30006870: e5943004 ldr r3, [r4, #4] the_node = (Chain_Node *) the_thread; the_node->next = search_node; 30006874: e5814000 str r4, [r1] the_node->previous = previous_node; 30006878: e5813004 str r3, [r1, #4] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 3000687c: 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; 30006880: e5831000 str r1, [r3] search_node->previous = the_node; 30006884: e5841004 str r1, [r4, #4] 30006888: e129f00c msr CPSR_fc, ip 3000688c: e3a00001 mov r0, #1 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 30006890: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} * the mutex by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; 30006894: e5900030 ldr r0, [r0, #48] ; 0x30 * 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; 30006898: e582c000 str ip, [r2] return the_thread_queue->sync_state; } 3000689c: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} 300068a0: 300192a8 .word 0x300192a8 30013d98 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 30013d98: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} 30013d9c: e24dd020 sub sp, sp, #32 30013da0: e28d3014 add r3, sp, #20 30013da4: 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; 30013da8: e3a09000 mov r9, #0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 30013dac: e283a004 add sl, r3, #4 30013db0: 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); 30013db4: e58d301c str r3, [sp, #28] static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 30013db8: e2802008 add r2, r0, #8 static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 30013dbc: e2803040 add r3, r0, #64 ; 0x40 * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 30013dc0: e1a04000 mov r4, r0 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 30013dc4: e58da014 str sl, [sp, #20] the_chain->permanent_null = NULL; 30013dc8: e58d9018 str r9, [sp, #24] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 30013dcc: e58d8008 str r8, [sp, #8] the_chain->permanent_null = NULL; 30013dd0: e58d900c str r9, [sp, #12] the_chain->last = _Chain_Head(the_chain); 30013dd4: e58d5010 str r5, [sp, #16] */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 30013dd8: 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 ); 30013ddc: e2807068 add r7, r0, #104 ; 0x68 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 30013de0: e58d2004 str r2, [sp, #4] static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 30013de4: e58d3000 str r3, [sp] { /* * 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; 30013de8: e28d2014 add r2, sp, #20 30013dec: 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; 30013df0: e59f2168 ldr r2, [pc, #360] ; 30013f60 <_Timer_server_Body+0x1c8> */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 30013df4: e1a0000b mov r0, fp static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 30013df8: e5923000 ldr r3, [r2] /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 30013dfc: e594103c ldr r1, [r4, #60] ; 0x3c watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 30013e00: e1a02005 mov r2, r5 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; 30013e04: e584303c str r3, [r4, #60] ; 0x3c _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 30013e08: e0611003 rsb r1, r1, r3 30013e0c: eb00104c bl 30017f44 <_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(); 30013e10: e59f314c ldr r3, [pc, #332] ; 30013f64 <_Timer_server_Body+0x1cc> Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 30013e14: 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(); 30013e18: 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 ) { 30013e1c: e1560002 cmp r6, r2 30013e20: 9a000004 bls 30013e38 <_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 ); 30013e24: e0621006 rsb r1, r2, r6 30013e28: e1a00007 mov r0, r7 30013e2c: e1a02005 mov r2, r5 30013e30: eb001043 bl 30017f44 <_Watchdog_Adjust_to_chain> 30013e34: ea000003 b 30013e48 <_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 ); 30013e38: 30662002 rsbcc r2, r6, r2 30013e3c: 31a00007 movcc r0, r7 30013e40: 33a01001 movcc r1, #1 30013e44: 3b001016 blcc 30017ea4 <_Watchdog_Adjust> } watchdogs->last_snapshot = snapshot; 30013e48: 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 ); 30013e4c: e5940078 ldr r0, [r4, #120] ; 0x78 30013e50: eb00023c bl 30014748 <_Chain_Get> if ( timer == NULL ) { 30013e54: e2501000 subs r1, r0, #0 30013e58: 0a00000a beq 30013e88 <_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 ) { 30013e5c: e5913038 ldr r3, [r1, #56] ; 0x38 30013e60: e3530001 cmp r3, #1 _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 30013e64: 02811010 addeq r1, r1, #16 30013e68: 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 ) { 30013e6c: 0a000003 beq 30013e80 <_Timer_server_Body+0xe8> _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 30013e70: e3530003 cmp r3, #3 30013e74: 1afffff4 bne 30013e4c <_Timer_server_Body+0xb4> _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 30013e78: e2811010 add r1, r1, #16 30013e7c: e1a00007 mov r0, r7 30013e80: eb00105c bl 30017ff8 <_Watchdog_Insert> 30013e84: eafffff0 b 30013e4c <_Timer_server_Body+0xb4> static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 30013e88: e10f3000 mrs r3, CPSR 30013e8c: e3832080 orr r2, r3, #128 ; 0x80 30013e90: e129f002 msr CPSR_fc, r2 * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); if ( _Chain_Is_empty( insert_chain ) ) { 30013e94: e59d2014 ldr r2, [sp, #20] 30013e98: e152000a cmp r2, sl 30013e9c: 1a000005 bne 30013eb8 <_Timer_server_Body+0x120> ts->insert_chain = NULL; 30013ea0: e5841078 str r1, [r4, #120] ; 0x78 static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 30013ea4: 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 ) ) { 30013ea8: e59d3008 ldr r3, [sp, #8] 30013eac: e1530008 cmp r3, r8 30013eb0: 1a000002 bne 30013ec0 <_Timer_server_Body+0x128> 30013eb4: ea000015 b 30013f10 <_Timer_server_Body+0x178> 30013eb8: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED 30013ebc: eaffffcb b 30013df0 <_Timer_server_Body+0x58> <== NOT EXECUTED static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile ( 30013ec0: e10f2000 mrs r2, CPSR 30013ec4: e3823080 orr r3, r2, #128 ; 0x80 30013ec8: e129f003 msr CPSR_fc, r3 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 30013ecc: e59d3008 ldr r3, [sp, #8] */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 30013ed0: e1530008 cmp r3, r8 30013ed4: 0a00000b beq 30013f08 <_Timer_server_Body+0x170> { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 30013ed8: 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 ) { 30013edc: e3530000 cmp r3, #0 the_chain->first = new_first; 30013ee0: e58d1008 str r1, [sp, #8] new_first->previous = _Chain_Head(the_chain); 30013ee4: e5815004 str r5, [r1, #4] 30013ee8: 0a000006 beq 30013f08 <_Timer_server_Body+0x170> watchdog->state = WATCHDOG_INACTIVE; 30013eec: e5839008 str r9, [r3, #8] static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile ( 30013ef0: 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 ); 30013ef4: e5930020 ldr r0, [r3, #32] 30013ef8: e5931024 ldr r1, [r3, #36] ; 0x24 30013efc: e1a0e00f mov lr, pc 30013f00: e593f01c ldr pc, [r3, #28] } 30013f04: eaffffed b 30013ec0 <_Timer_server_Body+0x128> 30013f08: e129f002 msr CPSR_fc, r2 30013f0c: eaffffb5 b 30013de8 <_Timer_server_Body+0x50> 30013f10: e59f3050 ldr r3, [pc, #80] ; 30013f68 <_Timer_server_Body+0x1d0> } else { ts->active = false; 30013f14: e5c4907c strb r9, [r4, #124] ; 0x7c 30013f18: e5932000 ldr r2, [r3] 30013f1c: e2822001 add r2, r2, #1 30013f20: e5832000 str r2, [r3] /* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING ); 30013f24: e3a01008 mov r1, #8 30013f28: e5940000 ldr r0, [r4] 30013f2c: eb000d7e bl 3001752c <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 30013f30: e1a00004 mov r0, r4 30013f34: ebffff6b bl 30013ce8 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); 30013f38: e1a00004 mov r0, r4 30013f3c: ebffff7f bl 30013d40 <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); 30013f40: eb000ae0 bl 30016ac8 <_Thread_Enable_dispatch> ts->active = true; 30013f44: e3a03001 mov r3, #1 30013f48: 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 ); 30013f4c: e59d0004 ldr r0, [sp, #4] 30013f50: eb001081 bl 3001815c <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 30013f54: e59d0000 ldr r0, [sp] 30013f58: eb00107f bl 3001815c <_Watchdog_Remove> 30013f5c: eaffffa1 b 30013de8 <_Timer_server_Body+0x50> 30013f60: 30039364 .word 0x30039364 30013f64: 30039294 .word 0x30039294 30013f68: 3003920c .word 0x3003920c