30005b18 <_POSIX_Condition_variables_Wait_support>: pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, bool already_timedout ) {
30005b18: e92d45f1 push {r0, r4, r5, r6, r7, r8, sl, lr} 30005b1c: e1a04001 mov r4, r1 30005b20: 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 ) ) {
30005b24: e1a0100d mov r1, sp 30005b28: e1a00004 mov r0, r4
pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, bool already_timedout ) {
30005b2c: e1a08002 mov r8, r2 30005b30: 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 ) ) {
30005b34: eb00006f bl 30005cf8 <_POSIX_Mutex_Get> 30005b38: e3500000 cmp r0, #0
30005b3c: 0a000032 beq 30005c0c <_POSIX_Condition_variables_Wait_support+0xf4> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1;
30005b40: e59f30d0 ldr r3, [pc, #208] ; 30005c18 <_POSIX_Condition_variables_Wait_support+0x100>
return EINVAL; } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location );
30005b44: e1a0100d mov r1, sp 30005b48: e5932000 ldr r2, [r3] 30005b4c: e1a00006 mov r0, r6 30005b50: e2422001 sub r2, r2, #1 30005b54: e5832000 str r2, [r3] 30005b58: ebffff7d bl 30005954 <_POSIX_Condition_variables_Get>
switch ( location ) {
30005b5c: e59d3000 ldr r3, [sp]
return EINVAL; } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location );
30005b60: e1a0a000 mov sl, r0
switch ( location ) {
30005b64: e3530000 cmp r3, #0
30005b68: 1a000027 bne 30005c0c <_POSIX_Condition_variables_Wait_support+0xf4> case OBJECTS_LOCAL: if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
30005b6c: e5903014 ldr r3, [r0, #20] 30005b70: e3530000 cmp r3, #0
30005b74: 0a000004 beq 30005b8c <_POSIX_Condition_variables_Wait_support+0x74>
30005b78: e5942000 ldr r2, [r4] 30005b7c: e1530002 cmp r3, r2
30005b80: 0a000001 beq 30005b8c <_POSIX_Condition_variables_Wait_support+0x74> _Thread_Enable_dispatch();
30005b84: eb000bda bl 30008af4 <_Thread_Enable_dispatch> 30005b88: ea00001f b 30005c0c <_POSIX_Condition_variables_Wait_support+0xf4>
return EINVAL; } (void) pthread_mutex_unlock( mutex );
30005b8c: e1a00004 mov r0, r4 30005b90: eb0000de bl 30005f10 <pthread_mutex_unlock>
_Thread_Enable_dispatch(); return EINVAL; } */ if ( !already_timedout ) {
30005b94: e3570000 cmp r7, #0
30005b98: 1a000015 bne 30005bf4 <_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;
30005b9c: e59f5078 ldr r5, [pc, #120] ; 30005c1c <_POSIX_Condition_variables_Wait_support+0x104>
return EINVAL; } */ if ( !already_timedout ) { the_cond->Mutex = *mutex;
30005ba0: e5942000 ldr r2, [r4]
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0;
30005ba4: e5953000 ldr r3, [r5]
return EINVAL; } */ if ( !already_timedout ) { the_cond->Mutex = *mutex;
30005ba8: e58a2014 str r2, [sl, #20]
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0;
30005bac: e5837034 str r7, [r3, #52] ; 0x34
_Thread_Executing->Wait.queue = &the_cond->Wait_queue; _Thread_Executing->Wait.id = *cond;
30005bb0: 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;
30005bb4: e28a2018 add r2, sl, #24
_Thread_Executing->Wait.id = *cond;
30005bb8: 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;
30005bbc: 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;
30005bc0: e5832044 str r2, [r3, #68] ; 0x44
_Thread_Executing->Wait.id = *cond; _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
30005bc4: e1a00002 mov r0, r2 30005bc8: e58a1048 str r1, [sl, #72] ; 0x48 30005bcc: e59f204c ldr r2, [pc, #76] ; 30005c20 <_POSIX_Condition_variables_Wait_support+0x108> 30005bd0: e1a01008 mov r1, r8 30005bd4: eb000cff bl 30008fd8 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
30005bd8: eb000bc5 bl 30008af4 <_Thread_Enable_dispatch>
/* * Switch ourself out because we blocked as a result of the * _Thread_queue_Enqueue. */ status = _Thread_Executing->Wait.return_code;
30005bdc: e5953000 ldr r3, [r5] 30005be0: e5935034 ldr r5, [r3, #52] ; 0x34
if ( status && status != ETIMEDOUT )
30005be4: e3550074 cmp r5, #116 ; 0x74 30005be8: 13550000 cmpne r5, #0
30005bec: 0a000002 beq 30005bfc <_POSIX_Condition_variables_Wait_support+0xe4>
30005bf0: ea000006 b 30005c10 <_POSIX_Condition_variables_Wait_support+0xf8><== NOT EXECUTED
return status; } else { _Thread_Enable_dispatch();
30005bf4: eb000bbe bl 30008af4 <_Thread_Enable_dispatch> 30005bf8: e3a05074 mov r5, #116 ; 0x74
/* * When we get here the dispatch disable level is 0. */ mutex_status = pthread_mutex_lock( mutex );
30005bfc: e1a00004 mov r0, r4 30005c00: eb0000a3 bl 30005e94 <pthread_mutex_lock>
if ( mutex_status )
30005c04: e3500000 cmp r0, #0
30005c08: 0a000000 beq 30005c10 <_POSIX_Condition_variables_Wait_support+0xf8>
30005c0c: e3a05016 mov r5, #22
case OBJECTS_ERROR: break; } return EINVAL; }
30005c10: e1a00005 mov r0, r5 30005c14: e8bd85f8 pop {r3, r4, r5, r6, r7, r8, sl, pc} 30005c18: 3001cc6c .word 0x3001cc6c 30005c1c: 3001cd20 .word 0x3001cd20 30005c20: 30009384 .word 0x30009384
30006fac <_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 ) {
30006fac: 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;
30006fb0: e5913014 ldr r3, [r1, #20]
*/ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain);
30006fb4: e281503c add r5, r1, #60 ; 0x3c 30006fb8: e5815038 str r5, [r1, #56] ; 0x38
the_chain->permanent_null = NULL;
30006fbc: e3a05000 mov r5, #0
the_chain->last = _Chain_Head(the_chain);
30006fc0: 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 ) )
30006fc4: 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 ];
30006fc8: 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;
30006fcc: e581503c str r5, [r1, #60] ; 0x3c 30006fd0: e285500c add r5, r5, #12
the_chain->last = _Chain_Head(the_chain);
30006fd4: e581c040 str ip, [r1, #64] ; 0x40
block_state = the_thread_queue->state;
30006fd8: 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 ];
30006fdc: 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;
30006fe0: 159f8154 ldrne r8, [pc, #340] ; 3000713c <_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 ) ) 30006fe4: 1a000023 bne 30007078 <_Thread_queue_Enqueue_priority+0xcc> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null;
30006fe8: e28c8004 add r8, ip, #4
static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile (
30006fec: e10f5000 mrs r5, CPSR 30006ff0: e3854080 orr r4, r5, #128 ; 0x80 30006ff4: 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;
30006ff8: e3e06000 mvn r6, #0 30006ffc: e59c4000 ldr r4, [ip]
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
30007000: ea00000b b 30007034 <_Thread_queue_Enqueue_priority+0x88>
search_priority = search_thread->current_priority;
30007004: e5946014 ldr r6, [r4, #20]
if ( priority <= search_priority )
30007008: e1530006 cmp r3, r6
3000700c: 9a00000a bls 3000703c <_Thread_queue_Enqueue_priority+0x90> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile (
30007010: e10fa000 mrs sl, CPSR 30007014: e129f005 msr CPSR_fc, r5 30007018: 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) ) {
3000701c: e594a010 ldr sl, [r4, #16] 30007020: e117000a tst r7, sl
30007024: 1a000001 bne 30007030 <_Thread_queue_Enqueue_priority+0x84> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile (
30007028: e129f005 msr CPSR_fc, r5 <== NOT EXECUTED 3000702c: eaffffee b 30006fec <_Thread_queue_Enqueue_priority+0x40> <== NOT EXECUTED
_ISR_Enable( level ); goto restart_forward_search; } search_thread = (Thread_Control *)search_thread->Object.Node.next;
30007030: 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 ) ) {
30007034: e1540008 cmp r4, r8
30007038: 1afffff1 bne 30007004 <_Thread_queue_Enqueue_priority+0x58> } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state !=
3000703c: 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 ) ) {
30007040: e1a0c005 mov ip, r5
} search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state !=
30007044: e3570001 cmp r7, #1
30007048: 1a000038 bne 30007130 <_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 )
3000704c: 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;
30007050: e3a03000 mov r3, #0 30007054: e5803030 str r3, [r0, #48] ; 0x30
if ( priority == search_priority ) 30007058: 0a00002a beq 30007108 <_Thread_queue_Enqueue_priority+0x15c> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous;
3000705c: e5943004 ldr r3, [r4, #4]
the_node = (Chain_Node *) the_thread; the_node->next = search_node;
30007060: e5814000 str r4, [r1]
the_node->previous = previous_node;
30007064: e5813004 str r3, [r1, #4]
previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue;
30007068: 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;
3000706c: e5831000 str r1, [r3]
search_node->previous = the_node;
30007070: e5841004 str r1, [r4, #4]
the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level );
30007074: ea000021 b 30007100 <_Thread_queue_Enqueue_priority+0x154>
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1;
30007078: e5d86000 ldrb r6, [r8] 3000707c: e2866001 add r6, r6, #1
static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile (
30007080: e10f5000 mrs r5, CPSR 30007084: e3854080 orr r4, r5, #128 ; 0x80 30007088: e129f004 msr CPSR_fc, r4
_ISR_Disable( level ); search_thread = (Thread_Control *) header->last;
3000708c: e59c4008 ldr r4, [ip, #8]
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
30007090: ea00000b b 300070c4 <_Thread_queue_Enqueue_priority+0x118>
search_priority = search_thread->current_priority;
30007094: e5946014 ldr r6, [r4, #20]
if ( priority >= search_priority )
30007098: e1530006 cmp r3, r6
3000709c: 2a00000a bcs 300070cc <_Thread_queue_Enqueue_priority+0x120> static inline void arm_interrupt_flash( uint32_t level ) { uint32_t arm_switch_reg; asm volatile (
300070a0: e10fa000 mrs sl, CPSR 300070a4: e129f005 msr CPSR_fc, r5 300070a8: 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) ) {
300070ac: e594a010 ldr sl, [r4, #16] 300070b0: e117000a tst r7, sl
300070b4: 1a000001 bne 300070c0 <_Thread_queue_Enqueue_priority+0x114> static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile (
300070b8: e129f005 msr CPSR_fc, r5 300070bc: eaffffed b 30007078 <_Thread_queue_Enqueue_priority+0xcc>
_ISR_Enable( level ); goto restart_reverse_search; } search_thread = (Thread_Control *)
300070c0: 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 ) ) {
300070c4: e154000c cmp r4, ip
300070c8: 1afffff1 bne 30007094 <_Thread_queue_Enqueue_priority+0xe8> } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state !=
300070cc: 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 ) ) {
300070d0: e1a0c005 mov ip, r5
} search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state !=
300070d4: e3570001 cmp r7, #1
300070d8: 1a000014 bne 30007130 <_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 )
300070dc: 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;
300070e0: e3a03000 mov r3, #0 300070e4: e5803030 str r3, [r0, #48] ; 0x30
if ( priority == search_priority ) 300070e8: 0a000006 beq 30007108 <_Thread_queue_Enqueue_priority+0x15c> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next;
300070ec: e5943000 ldr r3, [r4]
the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node;
300070f0: e8810018 stm r1, {r3, r4}
search_node->next = the_node; next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue;
300070f4: 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;
300070f8: e5841000 str r1, [r4]
next_node->previous = the_node;
300070fc: e5831004 str r1, [r3, #4] 30007100: e129f005 msr CPSR_fc, r5 30007104: ea000007 b 30007128 <_Thread_queue_Enqueue_priority+0x17c> 30007108: 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;
3000710c: e5943004 ldr r3, [r4, #4]
the_node = (Chain_Node *) the_thread; the_node->next = search_node;
30007110: e5814000 str r4, [r1]
the_node->previous = previous_node;
30007114: e5813004 str r3, [r1, #4]
previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue;
30007118: 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;
3000711c: e5831000 str r1, [r3]
search_node->previous = the_node;
30007120: e5841004 str r1, [r4, #4] 30007124: e129f00c msr CPSR_fc, ip 30007128: e3a00001 mov r0, #1
the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
3000712c: 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;
30007130: 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;
30007134: e582c000 str ip, [r2]
return the_thread_queue->sync_state; }
30007138: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} 3000713c: 30019600 .word 0x30019600
30014aa0 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) {
30014aa0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} 30014aa4: e24dd020 sub sp, sp, #32 30014aa8: e28d3014 add r3, sp, #20 30014aac: 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;
30014ab0: e3a09000 mov r9, #0
*/ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null;
30014ab4: e283a004 add sl, r3, #4 30014ab8: 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);
30014abc: e58d301c str r3, [sp, #28]
static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
30014ac0: e2802008 add r2, r0, #8
static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
30014ac4: 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 ) {
30014ac8: e1a04000 mov r4, r0
*/ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain);
30014acc: e58da014 str sl, [sp, #20]
the_chain->permanent_null = NULL;
30014ad0: e58d9018 str r9, [sp, #24]
*/ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain);
30014ad4: e58d8008 str r8, [sp, #8]
the_chain->permanent_null = NULL;
30014ad8: e58d900c str r9, [sp, #12]
the_chain->last = _Chain_Head(the_chain);
30014adc: 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 );
30014ae0: 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 );
30014ae4: 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 );
30014ae8: e58d2004 str r2, [sp, #4]
static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
30014aec: 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;
30014af0: e28d2014 add r2, sp, #20 30014af4: 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;
30014af8: e59f2168 ldr r2, [pc, #360] ; 30014c68 <_Timer_server_Body+0x1c8>
*/ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
30014afc: 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;
30014b00: e5923000 ldr r3, [r2]
/* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
30014b04: e594103c ldr r1, [r4, #60] ; 0x3c
watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
30014b08: e1a02005 mov r2, r5
/* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot;
30014b0c: e584303c str r3, [r4, #60] ; 0x3c
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
30014b10: e0611003 rsb r1, r1, r3 30014b14: eb00106e bl 30018cd4 <_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();
30014b18: e59f314c ldr r3, [pc, #332] ; 30014c6c <_Timer_server_Body+0x1cc>
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
30014b1c: 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();
30014b20: 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 ) {
30014b24: e1560002 cmp r6, r2
30014b28: 9a000004 bls 30014b40 <_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 );
30014b2c: e0621006 rsb r1, r2, r6 30014b30: e1a00007 mov r0, r7 30014b34: e1a02005 mov r2, r5 30014b38: eb001065 bl 30018cd4 <_Watchdog_Adjust_to_chain> 30014b3c: ea000003 b 30014b50 <_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 );
30014b40: 30662002 rsbcc r2, r6, r2 30014b44: 31a00007 movcc r0, r7 30014b48: 33a01001 movcc r1, #1 30014b4c: 3b001038 blcc 30018c34 <_Watchdog_Adjust>
} watchdogs->last_snapshot = snapshot;
30014b50: 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 );
30014b54: e5940078 ldr r0, [r4, #120] ; 0x78 30014b58: eb00023c bl 30015450 <_Chain_Get>
if ( timer == NULL ) {
30014b5c: e2501000 subs r1, r0, #0
30014b60: 0a00000a beq 30014b90 <_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 ) {
30014b64: e5913038 ldr r3, [r1, #56] ; 0x38 30014b68: e3530001 cmp r3, #1
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
30014b6c: 02811010 addeq r1, r1, #16 30014b70: 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 ) { 30014b74: 0a000003 beq 30014b88 <_Timer_server_Body+0xe8> _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
30014b78: e3530003 cmp r3, #3
30014b7c: 1afffff4 bne 30014b54 <_Timer_server_Body+0xb4> _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
30014b80: e2811010 add r1, r1, #16 30014b84: e1a00007 mov r0, r7 30014b88: eb00107e bl 30018d88 <_Watchdog_Insert> 30014b8c: eafffff0 b 30014b54 <_Timer_server_Body+0xb4>
static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile (
30014b90: e10f3000 mrs r3, CPSR 30014b94: e3832080 orr r2, r3, #128 ; 0x80 30014b98: e129f002 msr CPSR_fc, r2
* body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); if ( _Chain_Is_empty( insert_chain ) ) {
30014b9c: e59d2014 ldr r2, [sp, #20] 30014ba0: e152000a cmp r2, sl
30014ba4: 1a000005 bne 30014bc0 <_Timer_server_Body+0x120> ts->insert_chain = NULL;
30014ba8: e5841078 str r1, [r4, #120] ; 0x78
static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile (
30014bac: 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 ) ) {
30014bb0: e59d3008 ldr r3, [sp, #8] 30014bb4: e1530008 cmp r3, r8
30014bb8: 1a000002 bne 30014bc8 <_Timer_server_Body+0x128>
30014bbc: ea000015 b 30014c18 <_Timer_server_Body+0x178>
30014bc0: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED 30014bc4: eaffffcb b 30014af8 <_Timer_server_Body+0x58> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void ) { uint32_t arm_switch_reg; uint32_t level; asm volatile (
30014bc8: e10f2000 mrs r2, CPSR 30014bcc: e3823080 orr r3, r2, #128 ; 0x80 30014bd0: e129f003 msr CPSR_fc, r3
*/ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain));
30014bd4: e59d3008 ldr r3, [sp, #8]
*/ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain))
30014bd8: e1530008 cmp r3, r8
30014bdc: 0a00000b beq 30014c10 <_Timer_server_Body+0x170> { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next;
30014be0: 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 ) {
30014be4: e3530000 cmp r3, #0
the_chain->first = new_first;
30014be8: e58d1008 str r1, [sp, #8]
new_first->previous = _Chain_Head(the_chain);
30014bec: e5815004 str r5, [r1, #4]
30014bf0: 0a000006 beq 30014c10 <_Timer_server_Body+0x170> watchdog->state = WATCHDOG_INACTIVE;
30014bf4: e5839008 str r9, [r3, #8]
static inline void arm_interrupt_enable( uint32_t level ) { ARM_SWITCH_REGISTERS; asm volatile (
30014bf8: 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 );
30014bfc: e5930020 ldr r0, [r3, #32] 30014c00: e5931024 ldr r1, [r3, #36] ; 0x24 30014c04: e1a0e00f mov lr, pc 30014c08: e593f01c ldr pc, [r3, #28]
}
30014c0c: eaffffed b 30014bc8 <_Timer_server_Body+0x128> 30014c10: e129f002 msr CPSR_fc, r2 30014c14: eaffffb5 b 30014af0 <_Timer_server_Body+0x50> 30014c18: e59f3050 ldr r3, [pc, #80] ; 30014c70 <_Timer_server_Body+0x1d0>
} else { ts->active = false;
30014c1c: e5c4907c strb r9, [r4, #124] ; 0x7c 30014c20: e5932000 ldr r2, [r3] 30014c24: e2822001 add r2, r2, #1 30014c28: e5832000 str r2, [r3]
/* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING );
30014c2c: e3a01008 mov r1, #8 30014c30: e5940000 ldr r0, [r4] 30014c34: eb000da0 bl 300182bc <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
30014c38: e1a00004 mov r0, r4 30014c3c: ebffff6b bl 300149f0 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
30014c40: e1a00004 mov r0, r4 30014c44: ebffff7f bl 30014a48 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
30014c48: eb000b02 bl 30017858 <_Thread_Enable_dispatch>
ts->active = true;
30014c4c: e3a03001 mov r3, #1 30014c50: 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 );
30014c54: e59d0004 ldr r0, [sp, #4] 30014c58: eb0010a3 bl 30018eec <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
30014c5c: e59d0000 ldr r0, [sp] 30014c60: eb0010a1 bl 30018eec <_Watchdog_Remove> 30014c64: eaffffa1 b 30014af0 <_Timer_server_Body+0x50> 30014c68: 30039e24 .word 0x30039e24 30014c6c: 30039d54 .word 0x30039d54 30014c70: 30039ccc .word 0x30039ccc