40008c10 <_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 ) { 40008c10: 9d e3 bf a0 save %sp, -96, %sp Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 40008c14: e0 06 60 14 ld [ %i1 + 0x14 ], %l0 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40008c18: 82 06 60 3c add %i1, 0x3c, %g1 the_chain->permanent_null = NULL; 40008c1c: c0 26 60 3c clr [ %i1 + 0x3c ] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40008c20: c2 26 60 38 st %g1, [ %i1 + 0x38 ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 40008c24: 82 06 60 38 add %i1, 0x38, %g1 40008c28: c2 26 60 40 st %g1, [ %i1 + 0x40 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 40008c2c: 2d 10 00 73 sethi %hi(0x4001cc00), %l6 _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 ]; 40008c30: 83 34 20 06 srl %l0, 6, %g1 block_state = the_thread_queue->state; if ( _Thread_queue_Is_reverse_search( priority ) ) 40008c34: 80 8c 20 20 btst 0x20, %l0 _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 ]; 40008c38: a7 28 60 04 sll %g1, 4, %l3 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 40008c3c: ac 15 a3 94 or %l6, 0x394, %l6 _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 ]; 40008c40: 83 28 60 02 sll %g1, 2, %g1 block_state = the_thread_queue->state; 40008c44: ea 06 20 38 ld [ %i0 + 0x38 ], %l5 _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 ]; 40008c48: a6 24 c0 01 sub %l3, %g1, %l3 block_state = the_thread_queue->state; if ( _Thread_queue_Is_reverse_search( priority ) ) 40008c4c: 12 80 00 28 bne 40008cec <_Thread_queue_Enqueue_priority+0xdc> 40008c50: a6 06 00 13 add %i0, %l3, %l3 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 40008c54: ac 04 e0 04 add %l3, 4, %l6 goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); 40008c58: 7f ff e4 3d call 40001d4c 40008c5c: 01 00 00 00 nop 40008c60: a4 10 00 08 mov %o0, %l2 search_thread = (Thread_Control *) header->first; 40008c64: a8 10 3f ff mov -1, %l4 while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 40008c68: 10 80 00 10 b 40008ca8 <_Thread_queue_Enqueue_priority+0x98> 40008c6c: e2 04 c0 00 ld [ %l3 ], %l1 search_priority = search_thread->current_priority; if ( priority <= search_priority ) 40008c70: 80 a4 00 14 cmp %l0, %l4 40008c74: 28 80 00 11 bleu,a 40008cb8 <_Thread_queue_Enqueue_priority+0xa8> 40008c78: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; search_priority = search_thread->current_priority; if ( priority <= search_priority ) break; #endif _ISR_Flash( level ); 40008c7c: 7f ff e4 38 call 40001d5c 40008c80: 90 10 00 12 mov %l2, %o0 40008c84: 7f ff e4 32 call 40001d4c 40008c88: 01 00 00 00 nop if ( !_States_Are_set( search_thread->current_state, block_state) ) { 40008c8c: c2 04 60 10 ld [ %l1 + 0x10 ], %g1 40008c90: 80 8d 40 01 btst %l5, %g1 40008c94: 32 80 00 05 bne,a 40008ca8 <_Thread_queue_Enqueue_priority+0x98> 40008c98: e2 04 40 00 ld [ %l1 ], %l1 _ISR_Enable( level ); 40008c9c: 7f ff e4 30 call 40001d5c <== NOT EXECUTED 40008ca0: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED goto restart_forward_search; 40008ca4: 30 bf ff ed b,a 40008c58 <_Thread_queue_Enqueue_priority+0x48> <== NOT EXECUTED 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 ) ) { 40008ca8: 80 a4 40 16 cmp %l1, %l6 40008cac: 32 bf ff f1 bne,a 40008c70 <_Thread_queue_Enqueue_priority+0x60> 40008cb0: e8 04 60 14 ld [ %l1 + 0x14 ], %l4 } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 40008cb4: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 40008cb8: 80 a0 60 01 cmp %g1, 1 40008cbc: 12 80 00 3c bne 40008dac <_Thread_queue_Enqueue_priority+0x19c> 40008cc0: 90 10 00 12 mov %l2, %o0 THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; if ( priority == search_priority ) 40008cc4: 80 a4 00 14 cmp %l0, %l4 40008cc8: 02 80 00 2e be 40008d80 <_Thread_queue_Enqueue_priority+0x170> 40008ccc: c0 26 20 30 clr [ %i0 + 0x30 ] goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 40008cd0: c2 04 60 04 ld [ %l1 + 4 ], %g1 the_node = (Chain_Node *) the_thread; the_node->next = search_node; 40008cd4: e2 26 40 00 st %l1, [ %i1 ] the_node->previous = previous_node; 40008cd8: c2 26 60 04 st %g1, [ %i1 + 4 ] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 40008cdc: f0 26 60 44 st %i0, [ %i1 + 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; 40008ce0: f2 20 40 00 st %i1, [ %g1 ] search_node->previous = the_node; 40008ce4: f2 24 60 04 st %i1, [ %l1 + 4 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 40008ce8: 30 80 00 2d b,a 40008d9c <_Thread_queue_Enqueue_priority+0x18c> return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); 40008cec: 7f ff e4 18 call 40001d4c 40008cf0: e8 0d 80 00 ldub [ %l6 ], %l4 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 40008cf4: a8 05 20 01 inc %l4 _ISR_Disable( level ); 40008cf8: a4 10 00 08 mov %o0, %l2 search_thread = (Thread_Control *) header->last; while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 40008cfc: 10 80 00 10 b 40008d3c <_Thread_queue_Enqueue_priority+0x12c> 40008d00: e2 04 e0 08 ld [ %l3 + 8 ], %l1 search_priority = search_thread->current_priority; if ( priority >= search_priority ) 40008d04: 80 a4 00 14 cmp %l0, %l4 40008d08: 3a 80 00 11 bcc,a 40008d4c <_Thread_queue_Enqueue_priority+0x13c> 40008d0c: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; search_priority = search_thread->current_priority; if ( priority >= search_priority ) break; #endif _ISR_Flash( level ); 40008d10: 7f ff e4 13 call 40001d5c 40008d14: 90 10 00 12 mov %l2, %o0 40008d18: 7f ff e4 0d call 40001d4c 40008d1c: 01 00 00 00 nop if ( !_States_Are_set( search_thread->current_state, block_state) ) { 40008d20: c2 04 60 10 ld [ %l1 + 0x10 ], %g1 40008d24: 80 8d 40 01 btst %l5, %g1 40008d28: 32 80 00 05 bne,a 40008d3c <_Thread_queue_Enqueue_priority+0x12c> 40008d2c: e2 04 60 04 ld [ %l1 + 4 ], %l1 _ISR_Enable( level ); 40008d30: 7f ff e4 0b call 40001d5c 40008d34: 90 10 00 12 mov %l2, %o0 goto restart_reverse_search; 40008d38: 30 bf ff ed b,a 40008cec <_Thread_queue_Enqueue_priority+0xdc> 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 ) ) { 40008d3c: 80 a4 40 13 cmp %l1, %l3 40008d40: 32 bf ff f1 bne,a 40008d04 <_Thread_queue_Enqueue_priority+0xf4> 40008d44: e8 04 60 14 ld [ %l1 + 0x14 ], %l4 } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 40008d48: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 40008d4c: 80 a0 60 01 cmp %g1, 1 40008d50: 12 80 00 17 bne 40008dac <_Thread_queue_Enqueue_priority+0x19c> 40008d54: 90 10 00 12 mov %l2, %o0 THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; if ( priority == search_priority ) 40008d58: 80 a4 00 14 cmp %l0, %l4 40008d5c: 02 80 00 09 be 40008d80 <_Thread_queue_Enqueue_priority+0x170> 40008d60: c0 26 20 30 clr [ %i0 + 0x30 ] goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 40008d64: c2 04 40 00 ld [ %l1 ], %g1 the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 40008d68: e2 26 60 04 st %l1, [ %i1 + 4 ] search_node = (Chain_Node *) search_thread; next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; 40008d6c: c2 26 40 00 st %g1, [ %i1 ] the_node->previous = search_node; search_node->next = the_node; next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 40008d70: f0 26 60 44 st %i0, [ %i1 + 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; 40008d74: f2 24 40 00 st %i1, [ %l1 ] next_node->previous = the_node; 40008d78: f2 20 60 04 st %i1, [ %g1 + 4 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 40008d7c: 30 80 00 08 b,a 40008d9c <_Thread_queue_Enqueue_priority+0x18c> 40008d80: a2 04 60 3c add %l1, 0x3c, %l1 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; 40008d84: c2 04 60 04 ld [ %l1 + 4 ], %g1 the_node = (Chain_Node *) the_thread; the_node->next = search_node; 40008d88: e2 26 40 00 st %l1, [ %i1 ] the_node->previous = previous_node; 40008d8c: c2 26 60 04 st %g1, [ %i1 + 4 ] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 40008d90: f0 26 60 44 st %i0, [ %i1 + 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; 40008d94: f2 20 40 00 st %i1, [ %g1 ] search_node->previous = the_node; 40008d98: f2 24 60 04 st %i1, [ %l1 + 4 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 40008d9c: 7f ff e3 f0 call 40001d5c 40008da0: b0 10 20 01 mov 1, %i0 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 40008da4: 81 c7 e0 08 ret 40008da8: 81 e8 00 00 restore * the mutex by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; 40008dac: f0 06 20 30 ld [ %i0 + 0x30 ], %i0 * 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; 40008db0: d0 26 80 00 st %o0, [ %i2 ] return the_thread_queue->sync_state; } 40008db4: 81 c7 e0 08 ret 40008db8: 81 e8 00 00 restore 40015aec <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 40015aec: 9d e3 bf 88 save %sp, -120, %sp static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 40015af0: 35 10 00 f5 sethi %hi(0x4003d400), %i2 40015af4: b2 07 bf f4 add %fp, -12, %i1 40015af8: ac 07 bf f8 add %fp, -8, %l6 40015afc: a2 07 bf e8 add %fp, -24, %l1 40015b00: a6 07 bf ec add %fp, -20, %l3 static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 40015b04: 37 10 00 f5 sethi %hi(0x4003d400), %i3 40015b08: 2b 10 00 f5 sethi %hi(0x4003d400), %l5 RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 40015b0c: c0 27 bf f8 clr [ %fp + -8 ] 40015b10: c0 27 bf ec clr [ %fp + -20 ] the_chain->last = _Chain_Head(the_chain); 40015b14: f2 27 bf fc st %i1, [ %fp + -4 ] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40015b18: ec 27 bf f4 st %l6, [ %fp + -12 ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 40015b1c: e2 27 bf f0 st %l1, [ %fp + -16 ] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40015b20: e6 27 bf e8 st %l3, [ %fp + -24 ] static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 40015b24: b4 16 a2 94 or %i2, 0x294, %i2 static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 40015b28: b6 16 e1 d0 or %i3, 0x1d0, %i3 40015b2c: aa 15 61 40 or %l5, 0x140, %l5 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 40015b30: a8 06 20 30 add %i0, 0x30, %l4 /* * 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 ); 40015b34: a4 06 20 68 add %i0, 0x68, %l2 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 40015b38: b8 06 20 08 add %i0, 8, %i4 static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 40015b3c: ba 06 20 40 add %i0, 0x40, %i5 _Thread_Set_state( ts->thread, STATES_DELAYING ); _Timer_server_Reset_interval_system_watchdog( ts ); _Timer_server_Reset_tod_system_watchdog( ts ); _Thread_Enable_dispatch(); ts->active = true; 40015b40: ae 10 20 01 mov 1, %l7 { /* * 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; 40015b44: f2 26 20 78 st %i1, [ %i0 + 0x78 ] static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 40015b48: c2 06 80 00 ld [ %i2 ], %g1 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 40015b4c: d2 06 20 3c ld [ %i0 + 0x3c ], %o1 watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 40015b50: 94 10 00 11 mov %l1, %o2 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; 40015b54: c2 26 20 3c st %g1, [ %i0 + 0x3c ] _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 40015b58: 92 20 40 09 sub %g1, %o1, %o1 40015b5c: 40 00 11 5f call 4001a0d8 <_Watchdog_Adjust_to_chain> 40015b60: 90 10 00 14 mov %l4, %o0 Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 40015b64: d4 06 20 74 ld [ %i0 + 0x74 ], %o2 static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 40015b68: e0 06 c0 00 ld [ %i3 ], %l0 /* * 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 ) { 40015b6c: 80 a4 00 0a cmp %l0, %o2 40015b70: 08 80 00 06 bleu 40015b88 <_Timer_server_Body+0x9c> 40015b74: 92 24 00 0a sub %l0, %o2, %o1 /* * 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 ); 40015b78: 90 10 00 12 mov %l2, %o0 40015b7c: 40 00 11 57 call 4001a0d8 <_Watchdog_Adjust_to_chain> 40015b80: 94 10 00 11 mov %l1, %o2 40015b84: 30 80 00 06 b,a 40015b9c <_Timer_server_Body+0xb0> } else if ( snapshot < last_snapshot ) { 40015b88: 1a 80 00 05 bcc 40015b9c <_Timer_server_Body+0xb0> 40015b8c: 94 22 80 10 sub %o2, %l0, %o2 /* * 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 ); 40015b90: 90 10 00 12 mov %l2, %o0 40015b94: 40 00 11 2a call 4001a03c <_Watchdog_Adjust> 40015b98: 92 10 20 01 mov 1, %o1 } watchdogs->last_snapshot = snapshot; 40015b9c: e0 26 20 74 st %l0, [ %i0 + 0x74 ] } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); 40015ba0: d0 06 20 78 ld [ %i0 + 0x78 ], %o0 40015ba4: 40 00 02 7e call 4001659c <_Chain_Get> 40015ba8: 01 00 00 00 nop if ( timer == NULL ) { 40015bac: 80 a2 20 00 cmp %o0, 0 40015bb0: 02 80 00 0f be 40015bec <_Timer_server_Body+0x100> 40015bb4: 01 00 00 00 nop static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 40015bb8: c2 02 20 38 ld [ %o0 + 0x38 ], %g1 40015bbc: 80 a0 60 01 cmp %g1, 1 40015bc0: 12 80 00 05 bne 40015bd4 <_Timer_server_Body+0xe8> 40015bc4: 80 a0 60 03 cmp %g1, 3 _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 40015bc8: 92 02 20 10 add %o0, 0x10, %o1 40015bcc: 10 80 00 05 b 40015be0 <_Timer_server_Body+0xf4> 40015bd0: 90 10 00 14 mov %l4, %o0 } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 40015bd4: 12 bf ff f3 bne 40015ba0 <_Timer_server_Body+0xb4> 40015bd8: 92 02 20 10 add %o0, 0x10, %o1 _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 40015bdc: 90 10 00 12 mov %l2, %o0 40015be0: 40 00 11 73 call 4001a1ac <_Watchdog_Insert> 40015be4: 01 00 00 00 nop 40015be8: 30 bf ff ee b,a 40015ba0 <_Timer_server_Body+0xb4> * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); 40015bec: 7f ff e1 4c call 4000e11c 40015bf0: 01 00 00 00 nop if ( _Chain_Is_empty( insert_chain ) ) { 40015bf4: c2 07 bf f4 ld [ %fp + -12 ], %g1 40015bf8: 80 a0 40 16 cmp %g1, %l6 40015bfc: 12 80 00 0a bne 40015c24 <_Timer_server_Body+0x138> 40015c00: 01 00 00 00 nop ts->insert_chain = NULL; 40015c04: c0 26 20 78 clr [ %i0 + 0x78 ] _ISR_Enable( level ); 40015c08: 7f ff e1 49 call 4000e12c 40015c0c: 01 00 00 00 nop _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 ) ) { 40015c10: c2 07 bf e8 ld [ %fp + -24 ], %g1 40015c14: 80 a0 40 13 cmp %g1, %l3 40015c18: 12 80 00 06 bne 40015c30 <_Timer_server_Body+0x144> 40015c1c: 01 00 00 00 nop 40015c20: 30 80 00 1a b,a 40015c88 <_Timer_server_Body+0x19c> ts->insert_chain = NULL; _ISR_Enable( level ); break; } else { _ISR_Enable( level ); 40015c24: 7f ff e1 42 call 4000e12c <== NOT EXECUTED 40015c28: 01 00 00 00 nop <== NOT EXECUTED 40015c2c: 30 bf ff c7 b,a 40015b48 <_Timer_server_Body+0x5c> <== 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 ); 40015c30: 7f ff e1 3b call 4000e11c 40015c34: 01 00 00 00 nop 40015c38: 84 10 00 08 mov %o0, %g2 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 40015c3c: e0 07 bf e8 ld [ %fp + -24 ], %l0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 40015c40: 80 a4 00 13 cmp %l0, %l3 40015c44: 02 80 00 0e be 40015c7c <_Timer_server_Body+0x190> 40015c48: 80 a4 20 00 cmp %l0, 0 { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 40015c4c: c2 04 00 00 ld [ %l0 ], %g1 the_chain->first = new_first; 40015c50: c2 27 bf e8 st %g1, [ %fp + -24 ] watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { 40015c54: 02 80 00 0a be 40015c7c <_Timer_server_Body+0x190> 40015c58: e2 20 60 04 st %l1, [ %g1 + 4 ] watchdog->state = WATCHDOG_INACTIVE; 40015c5c: c0 24 20 08 clr [ %l0 + 8 ] _ISR_Enable( level ); 40015c60: 7f ff e1 33 call 4000e12c 40015c64: 01 00 00 00 nop /* * 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 ); 40015c68: d2 04 20 24 ld [ %l0 + 0x24 ], %o1 40015c6c: c2 04 20 1c ld [ %l0 + 0x1c ], %g1 40015c70: 9f c0 40 00 call %g1 40015c74: d0 04 20 20 ld [ %l0 + 0x20 ], %o0 } 40015c78: 30 bf ff ee b,a 40015c30 <_Timer_server_Body+0x144> watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { watchdog->state = WATCHDOG_INACTIVE; _ISR_Enable( level ); } else { _ISR_Enable( level ); 40015c7c: 7f ff e1 2c call 4000e12c 40015c80: 90 10 00 02 mov %g2, %o0 40015c84: 30 bf ff b0 b,a 40015b44 <_Timer_server_Body+0x58> * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); } } else { ts->active = false; 40015c88: c0 2e 20 7c clrb [ %i0 + 0x7c ] 40015c8c: c2 05 40 00 ld [ %l5 ], %g1 40015c90: 82 00 60 01 inc %g1 40015c94: c2 25 40 00 st %g1, [ %l5 ] /* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING ); 40015c98: d0 06 00 00 ld [ %i0 ], %o0 40015c9c: 40 00 0e 4c call 400195cc <_Thread_Set_state> 40015ca0: 92 10 20 08 mov 8, %o1 _Timer_server_Reset_interval_system_watchdog( ts ); 40015ca4: 7f ff ff 68 call 40015a44 <_Timer_server_Reset_interval_system_watchdog> 40015ca8: 90 10 00 18 mov %i0, %o0 _Timer_server_Reset_tod_system_watchdog( ts ); 40015cac: 7f ff ff 7b call 40015a98 <_Timer_server_Reset_tod_system_watchdog> 40015cb0: 90 10 00 18 mov %i0, %o0 _Thread_Enable_dispatch(); 40015cb4: 40 00 0b 93 call 40018b00 <_Thread_Enable_dispatch> 40015cb8: 01 00 00 00 nop static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 40015cbc: 90 10 00 1c mov %i4, %o0 _Thread_Set_state( ts->thread, STATES_DELAYING ); _Timer_server_Reset_interval_system_watchdog( ts ); _Timer_server_Reset_tod_system_watchdog( ts ); _Thread_Enable_dispatch(); ts->active = true; 40015cc0: ee 2e 20 7c stb %l7, [ %i0 + 0x7c ] static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 40015cc4: 40 00 11 97 call 4001a320 <_Watchdog_Remove> 40015cc8: 01 00 00 00 nop static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 40015ccc: 40 00 11 95 call 4001a320 <_Watchdog_Remove> 40015cd0: 90 10 00 1d mov %i5, %o0 40015cd4: 30 bf ff 9c b,a 40015b44 <_Timer_server_Body+0x58> 4000f04c : int killinfo( pid_t pid, int sig, const union sigval *value ) { 4000f04c: 9d e3 bf 90 save %sp, -112, %sp POSIX_signals_Siginfo_node *psiginfo; /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) 4000f050: 7f ff fb d5 call 4000dfa4 4000f054: 01 00 00 00 nop 4000f058: 80 a6 00 08 cmp %i0, %o0 4000f05c: 02 80 00 06 be 4000f074 4000f060: 80 a6 60 00 cmp %i1, 0 rtems_set_errno_and_return_minus_one( ESRCH ); 4000f064: 40 00 01 97 call 4000f6c0 <__errno> 4000f068: 01 00 00 00 nop 4000f06c: 10 80 00 07 b 4000f088 4000f070: 82 10 20 03 mov 3, %g1 ! 3 /* * Validate the signal passed. */ if ( !sig ) 4000f074: 12 80 00 08 bne 4000f094 4000f078: 82 06 7f ff add %i1, -1, %g1 rtems_set_errno_and_return_minus_one( EINVAL ); 4000f07c: 40 00 01 91 call 4000f6c0 <__errno> 4000f080: 01 00 00 00 nop 4000f084: 82 10 20 16 mov 0x16, %g1 ! 16 4000f088: c2 22 00 00 st %g1, [ %o0 ] 4000f08c: 10 80 00 a5 b 4000f320 4000f090: 90 10 3f ff mov -1, %o0 if ( !is_valid_signo(sig) ) 4000f094: 80 a0 60 1f cmp %g1, 0x1f 4000f098: 18 bf ff f9 bgu 4000f07c 4000f09c: 85 2e 60 02 sll %i1, 2, %g2 rtems_set_errno_and_return_minus_one( EINVAL ); /* * If the signal is being ignored, then we are out of here. */ if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) 4000f0a0: 87 2e 60 04 sll %i1, 4, %g3 4000f0a4: 86 20 c0 02 sub %g3, %g2, %g3 4000f0a8: 05 10 00 77 sethi %hi(0x4001dc00), %g2 4000f0ac: 84 10 a3 e4 or %g2, 0x3e4, %g2 ! 4001dfe4 <_POSIX_signals_Vectors> 4000f0b0: 84 00 80 03 add %g2, %g3, %g2 4000f0b4: c4 00 a0 08 ld [ %g2 + 8 ], %g2 4000f0b8: 80 a0 a0 01 cmp %g2, 1 4000f0bc: 02 80 00 99 be 4000f320 4000f0c0: 90 10 20 00 clr %o0 /* * P1003.1c/Draft 10, p. 33 says that certain signals should always * be directed to the executing thread such as those caused by hardware * faults. */ if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) ) 4000f0c4: 80 a6 60 04 cmp %i1, 4 4000f0c8: 02 80 00 06 be 4000f0e0 4000f0cc: 80 a6 60 08 cmp %i1, 8 4000f0d0: 02 80 00 04 be 4000f0e0 4000f0d4: 80 a6 60 0b cmp %i1, 0xb 4000f0d8: 12 80 00 08 bne 4000f0f8 4000f0dc: a0 10 20 01 mov 1, %l0 return pthread_kill( pthread_self(), sig ); 4000f0e0: 40 00 01 4f call 4000f61c 4000f0e4: 01 00 00 00 nop 4000f0e8: 40 00 01 11 call 4000f52c 4000f0ec: 92 10 00 19 mov %i1, %o1 4000f0f0: 81 c7 e0 08 ret 4000f0f4: 91 e8 00 08 restore %g0, %o0, %o0 /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; 4000f0f8: f2 27 bf f4 st %i1, [ %fp + -12 ] siginfo->si_code = SI_USER; 4000f0fc: e0 27 bf f8 st %l0, [ %fp + -8 ] if ( !value ) { 4000f100: 80 a6 a0 00 cmp %i2, 0 4000f104: 12 80 00 04 bne 4000f114 4000f108: a1 2c 00 01 sll %l0, %g1, %l0 siginfo->si_value.sival_int = 0; 4000f10c: 10 80 00 04 b 4000f11c 4000f110: c0 27 bf fc clr [ %fp + -4 ] } else { siginfo->si_value = *value; 4000f114: c2 06 80 00 ld [ %i2 ], %g1 4000f118: c2 27 bf fc st %g1, [ %fp + -4 ] 4000f11c: 03 10 00 76 sethi %hi(0x4001d800), %g1 4000f120: c4 00 62 50 ld [ %g1 + 0x250 ], %g2 ! 4001da50 <_Thread_Dispatch_disable_level> 4000f124: 84 00 a0 01 inc %g2 4000f128: c4 20 62 50 st %g2, [ %g1 + 0x250 ] /* * Is the currently executing thread interested? If so then it will * get it an execute it as soon as the dispatcher executes. */ the_thread = _Thread_Executing; 4000f12c: 03 10 00 76 sethi %hi(0x4001d800), %g1 4000f130: c2 00 63 0c ld [ %g1 + 0x30c ], %g1 ! 4001db0c <_Thread_Executing> api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000f134: c4 00 61 60 ld [ %g1 + 0x160 ], %g2 4000f138: c4 00 a0 c4 ld [ %g2 + 0xc4 ], %g2 4000f13c: 80 ac 00 02 andncc %l0, %g2, %g0 4000f140: 12 80 00 4e bne 4000f278 4000f144: 07 10 00 78 sethi %hi(0x4001e000), %g3 /* XXX violation of visibility -- need to define thread queue support */ the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo; for ( the_node = the_chain->first ; 4000f148: 03 10 00 78 sethi %hi(0x4001e000), %g1 4000f14c: c4 00 61 70 ld [ %g1 + 0x170 ], %g2 ! 4001e170 <_POSIX_signals_Wait_queue> 4000f150: 10 80 00 0b b 4000f17c 4000f154: 86 10 e1 74 or %g3, 0x174, %g3 !_Chain_Is_tail( the_chain, the_node ) ; the_node = the_node->next ) { the_thread = (Thread_Control *)the_node; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000f158: c8 00 a1 60 ld [ %g2 + 0x160 ], %g4 #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 4000f15c: 80 8c 00 01 btst %l0, %g1 4000f160: 12 80 00 46 bne 4000f278 4000f164: 82 10 00 02 mov %g2, %g1 /* * Is this thread is blocked waiting for another signal but has * not blocked this one? */ if (~api->signals_blocked & mask) 4000f168: c8 01 20 c4 ld [ %g4 + 0xc4 ], %g4 4000f16c: 80 ac 00 04 andncc %l0, %g4, %g0 4000f170: 32 80 00 43 bne,a 4000f27c 4000f174: 84 10 20 01 mov 1, %g2 the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo; for ( the_node = the_chain->first ; !_Chain_Is_tail( the_chain, the_node ) ; the_node = the_node->next ) { 4000f178: c4 00 80 00 ld [ %g2 ], %g2 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000f17c: 80 a0 80 03 cmp %g2, %g3 4000f180: 32 bf ff f6 bne,a 4000f158 4000f184: c2 00 a0 30 ld [ %g2 + 0x30 ], %g1 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 4000f188: 03 10 00 73 sethi %hi(0x4001cc00), %g1 4000f18c: c8 08 63 94 ldub [ %g1 + 0x394 ], %g4 ! 4001cf94 4000f190: 05 10 00 76 sethi %hi(0x4001d800), %g2 4000f194: 88 01 20 01 inc %g4 4000f198: 84 10 a1 b8 or %g2, 0x1b8, %g2 */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( 4000f19c: 82 10 20 00 clr %g1 4000f1a0: 90 00 a0 0c add %g2, 0xc, %o0 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { 4000f1a4: 17 04 00 00 sethi %hi(0x10000000), %o3 for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) { /* * This can occur when no one is interested and ITRON is not configured. */ if ( !_Objects_Information_table[ the_api ] ) 4000f1a8: c6 00 80 00 ld [ %g2 ], %g3 4000f1ac: 80 a0 e0 00 cmp %g3, 0 4000f1b0: 22 80 00 2c be,a 4000f260 4000f1b4: 84 00 a0 04 add %g2, 4, %g2 continue; the_info = _Objects_Information_table[ the_api ][ 1 ]; 4000f1b8: c6 00 e0 04 ld [ %g3 + 4 ], %g3 if ( !the_info ) continue; #endif maximum = the_info->maximum; object_table = the_info->local_table; 4000f1bc: 9a 10 20 01 mov 1, %o5 4000f1c0: f4 00 e0 1c ld [ %g3 + 0x1c ], %i2 for ( index = 1 ; index <= maximum ; index++ ) { 4000f1c4: 10 80 00 23 b 4000f250 4000f1c8: de 10 e0 10 lduh [ %g3 + 0x10 ], %o7 the_thread = (Thread_Control *) object_table[ index ]; 4000f1cc: c6 06 80 03 ld [ %i2 + %g3 ], %g3 if ( !the_thread ) 4000f1d0: 80 a0 e0 00 cmp %g3, 0 4000f1d4: 02 80 00 1d be 4000f248 4000f1d8: 98 10 00 04 mov %g4, %o4 /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( the_thread->current_priority > interested_priority ) 4000f1dc: d8 00 e0 14 ld [ %g3 + 0x14 ], %o4 4000f1e0: 80 a3 00 04 cmp %o4, %g4 4000f1e4: 38 80 00 19 bgu,a 4000f248 4000f1e8: 98 10 00 04 mov %g4, %o4 DEBUG_STEP("2"); /* * If this thread is not interested, then go on to the next thread. */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000f1ec: d4 00 e1 60 ld [ %g3 + 0x160 ], %o2 4000f1f0: d4 02 a0 c4 ld [ %o2 + 0xc4 ], %o2 4000f1f4: 80 ac 00 0a andncc %l0, %o2, %g0 4000f1f8: 22 80 00 14 be,a 4000f248 4000f1fc: 98 10 00 04 mov %g4, %o4 * * NOTE: We initialized interested_priority to PRIORITY_MAXIMUM + 1 * so we never have to worry about deferencing a NULL * interested thread. */ if ( the_thread->current_priority < interested_priority ) { 4000f200: 80 a3 00 04 cmp %o4, %g4 4000f204: 2a 80 00 11 bcs,a 4000f248 4000f208: 82 10 00 03 mov %g3, %g1 * and blocking interruptibutable by signal. * * If the interested thread is ready, don't think about changing. */ if ( !_States_Is_ready( interested->current_state ) ) { 4000f20c: d2 00 60 10 ld [ %g1 + 0x10 ], %o1 4000f210: 80 a2 60 00 cmp %o1, 0 4000f214: 22 80 00 0d be,a 4000f248 4000f218: 98 10 00 04 mov %g4, %o4 <== NOT EXECUTED /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 4000f21c: d4 00 e0 10 ld [ %g3 + 0x10 ], %o2 4000f220: 80 a2 a0 00 cmp %o2, 0 4000f224: 22 80 00 09 be,a 4000f248 4000f228: 82 10 00 03 mov %g3, %g1 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { 4000f22c: 80 8a 40 0b btst %o1, %o3 4000f230: 32 80 00 06 bne,a 4000f248 4000f234: 98 10 00 04 mov %g4, %o4 DEBUG_STEP("7"); if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) { 4000f238: 80 8a 80 0b btst %o2, %o3 4000f23c: 32 80 00 03 bne,a 4000f248 4000f240: 82 10 00 03 mov %g3, %g1 4000f244: 98 10 00 04 mov %g4, %o4 #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { 4000f248: 9a 03 60 01 inc %o5 4000f24c: 88 10 00 0c mov %o4, %g4 4000f250: 80 a3 40 0f cmp %o5, %o7 4000f254: 28 bf ff de bleu,a 4000f1cc 4000f258: 87 2b 60 02 sll %o5, 2, %g3 4000f25c: 84 00 a0 04 add %g2, 4, %g2 * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) { 4000f260: 80 a0 80 08 cmp %g2, %o0 4000f264: 32 bf ff d2 bne,a 4000f1ac 4000f268: c6 00 80 00 ld [ %g2 ], %g3 } } } } if ( interested ) { 4000f26c: 80 a0 60 00 cmp %g1, 0 4000f270: 02 80 00 0b be 4000f29c 4000f274: 01 00 00 00 nop * thread needs to do the post context switch extension so it can * evaluate the signals pending. */ process_it: the_thread->do_post_task_switch_extension = true; 4000f278: 84 10 20 01 mov 1, %g2 ! 1 /* * Returns true if the signal was synchronously given to a thread * blocked waiting for the signal. */ if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) { 4000f27c: 90 10 00 01 mov %g1, %o0 * thread needs to do the post context switch extension so it can * evaluate the signals pending. */ process_it: the_thread->do_post_task_switch_extension = true; 4000f280: c4 28 60 74 stb %g2, [ %g1 + 0x74 ] /* * Returns true if the signal was synchronously given to a thread * blocked waiting for the signal. */ if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) { 4000f284: 92 10 00 19 mov %i1, %o1 4000f288: 40 00 00 5d call 4000f3fc <_POSIX_signals_Unblock_thread> 4000f28c: 94 07 bf f4 add %fp, -12, %o2 4000f290: 80 8a 20 ff btst 0xff, %o0 4000f294: 12 80 00 20 bne 4000f314 4000f298: 01 00 00 00 nop /* * We may have woken up a thread but we definitely need to post the * signal to the process wide information set. */ _POSIX_signals_Set_process_signals( mask ); 4000f29c: 40 00 00 47 call 4000f3b8 <_POSIX_signals_Set_process_signals> 4000f2a0: 90 10 00 10 mov %l0, %o0 if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { 4000f2a4: 83 2e 60 04 sll %i1, 4, %g1 4000f2a8: b3 2e 60 02 sll %i1, 2, %i1 4000f2ac: b2 20 40 19 sub %g1, %i1, %i1 4000f2b0: 03 10 00 77 sethi %hi(0x4001dc00), %g1 4000f2b4: 82 10 63 e4 or %g1, 0x3e4, %g1 ! 4001dfe4 <_POSIX_signals_Vectors> 4000f2b8: c2 00 40 19 ld [ %g1 + %i1 ], %g1 4000f2bc: 80 a0 60 02 cmp %g1, 2 4000f2c0: 12 80 00 15 bne 4000f314 4000f2c4: 11 10 00 78 sethi %hi(0x4001e000), %o0 psiginfo = (POSIX_signals_Siginfo_node *) 4000f2c8: 7f ff f4 8e call 4000c500 <_Chain_Get> 4000f2cc: 90 12 21 64 or %o0, 0x164, %o0 ! 4001e164 <_POSIX_signals_Inactive_siginfo> _Chain_Get( &_POSIX_signals_Inactive_siginfo ); if ( !psiginfo ) { 4000f2d0: a0 92 20 00 orcc %o0, 0, %l0 4000f2d4: 12 80 00 08 bne 4000f2f4 4000f2d8: 92 07 bf f4 add %fp, -12, %o1 _Thread_Enable_dispatch(); 4000f2dc: 7f ff e4 dd call 40008650 <_Thread_Enable_dispatch> 4000f2e0: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EAGAIN ); 4000f2e4: 40 00 00 f7 call 4000f6c0 <__errno> 4000f2e8: 01 00 00 00 nop 4000f2ec: 10 bf ff 67 b 4000f088 4000f2f0: 82 10 20 0b mov 0xb, %g1 ! b } psiginfo->Info = *siginfo; 4000f2f4: 90 04 20 08 add %l0, 8, %o0 4000f2f8: 40 00 03 2d call 4000ffac 4000f2fc: 94 10 20 0c mov 0xc, %o2 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 4000f300: 11 10 00 78 sethi %hi(0x4001e000), %o0 4000f304: 92 10 00 10 mov %l0, %o1 4000f308: 90 12 21 b4 or %o0, 0x1b4, %o0 4000f30c: 7f ff de fd call 40006f00 <_Chain_Append> 4000f310: 90 02 00 19 add %o0, %i1, %o0 } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); 4000f314: 7f ff e4 cf call 40008650 <_Thread_Enable_dispatch> 4000f318: 01 00 00 00 nop 4000f31c: 90 10 20 00 clr %o0 ! 0 return 0; } 4000f320: b0 10 00 08 mov %o0, %i0 4000f324: 81 c7 e0 08 ret 4000f328: 81 e8 00 00 restore