=============================================================================== 000460d0 <_API_Mutex_Unlock>: #include void _API_Mutex_Unlock( API_Mutex_Control *the_mutex ) { 460d0: 4e56 0000 linkw %fp,#0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 460d4: 2039 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d0 460da: 5280 addql #1,%d0 460dc: 206e 0008 moveal %fp@(8),%a0 460e0: 23c0 0005 dc1c movel %d0,5dc1c <_Thread_Dispatch_disable_level> _Thread_Disable_dispatch(); _CORE_mutex_Surrender( 460e6: 42a7 clrl %sp@- 460e8: 2f28 0008 movel %a0@(8),%sp@- 460ec: 4868 0010 pea %a0@(16) 460f0: 4eb9 0004 6358 jsr 46358 <_CORE_mutex_Surrender> &the_mutex->Mutex, the_mutex->Object.id, NULL ); _Thread_Enable_dispatch(); 460f6: 4fef 000c lea %sp@(12),%sp } 460fa: 4e5e unlk %fp _CORE_mutex_Surrender( &the_mutex->Mutex, the_mutex->Object.id, NULL ); _Thread_Enable_dispatch(); 460fc: 4ef9 0004 7632 jmp 47632 <_Thread_Enable_dispatch> ... =============================================================================== 0004ad78 <_CORE_barrier_Wait>: Thread_Control *executing; ISR_Level level; executing = _Thread_Executing; executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL; _ISR_Disable( level ); 4ad78: 203c 0000 0700 movel #1792,%d0 Objects_Id id, bool wait, Watchdog_Interval timeout, CORE_barrier_API_mp_support_callout api_barrier_mp_support ) { 4ad7e: 4e56 fff4 linkw %fp,#-12 Thread_Control *executing; ISR_Level level; executing = _Thread_Executing; 4ad82: 2279 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a1 Objects_Id id, bool wait, Watchdog_Interval timeout, CORE_barrier_API_mp_support_callout api_barrier_mp_support ) { 4ad88: 48d7 001c moveml %d2-%d4,%sp@ 4ad8c: 242e 000c movel %fp@(12),%d2 4ad90: 262e 0014 movel %fp@(20),%d3 Thread_Control *executing; ISR_Level level; executing = _Thread_Executing; executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL; 4ad94: 42a9 0034 clrl %a1@(52) Objects_Id id, bool wait, Watchdog_Interval timeout, CORE_barrier_API_mp_support_callout api_barrier_mp_support ) { 4ad98: 206e 0008 moveal %fp@(8),%a0 4ad9c: 282e 0018 movel %fp@(24),%d4 Thread_Control *executing; ISR_Level level; executing = _Thread_Executing; executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL; _ISR_Disable( level ); 4ada0: 40c1 movew %sr,%d1 4ada2: 8081 orl %d1,%d0 4ada4: 46c0 movew %d0,%sr the_barrier->number_of_waiting_threads++; 4ada6: 2028 0048 movel %a0@(72),%d0 4adaa: 5280 addql #1,%d0 4adac: 2140 0048 movel %d0,%a0@(72) if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) { 4adb0: 4aa8 0040 tstl %a0@(64) 4adb4: 6626 bnes 4addc <_CORE_barrier_Wait+0x64> if ( the_barrier->number_of_waiting_threads == the_barrier->Attributes.maximum_count) { 4adb6: b0a8 0044 cmpl %a0@(68),%d0 4adba: 6620 bnes 4addc <_CORE_barrier_Wait+0x64> executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED; 4adbc: 7001 moveq #1,%d0 4adbe: 2340 0034 movel %d0,%a1@(52) _ISR_Enable( level ); 4adc2: 46c1 movew %d1,%sr _CORE_barrier_Release( the_barrier, id, api_barrier_mp_support ); 4adc4: 2d44 0010 movel %d4,%fp@(16) 4adc8: 2d42 000c movel %d2,%fp@(12) 4adcc: 2d48 0008 movel %a0,%fp@(8) executing->Wait.queue = &the_barrier->Wait_queue; executing->Wait.id = id; _ISR_Enable( level ); _Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout ); } 4add0: 4cd7 001c moveml %sp@,%d2-%d4 4add4: 4e5e unlk %fp if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) { if ( the_barrier->number_of_waiting_threads == the_barrier->Attributes.maximum_count) { executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED; _ISR_Enable( level ); _CORE_barrier_Release( the_barrier, id, api_barrier_mp_support ); 4add6: 4ef9 0004 ad44 jmp 4ad44 <_CORE_barrier_Release> 4addc: 7001 moveq #1,%d0 } } _Thread_queue_Enter_critical_section( &the_barrier->Wait_queue ); executing->Wait.queue = &the_barrier->Wait_queue; executing->Wait.id = id; 4adde: 2342 0020 movel %d2,%a1@(32) return; } } _Thread_queue_Enter_critical_section( &the_barrier->Wait_queue ); executing->Wait.queue = &the_barrier->Wait_queue; 4ade2: 2348 0044 movel %a0,%a1@(68) 4ade6: 2140 0030 movel %d0,%a0@(48) executing->Wait.id = id; _ISR_Enable( level ); 4adea: 46c1 movew %d1,%sr _Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout ); 4adec: 2d43 000c movel %d3,%fp@(12) 4adf0: 203c 0004 7d90 movel #294288,%d0 4adf6: 2d48 0008 movel %a0,%fp@(8) 4adfa: 2d40 0010 movel %d0,%fp@(16) } 4adfe: 4cd7 001c moveml %sp@,%d2-%d4 4ae02: 4e5e unlk %fp _Thread_queue_Enter_critical_section( &the_barrier->Wait_queue ); executing->Wait.queue = &the_barrier->Wait_queue; executing->Wait.id = id; _ISR_Enable( level ); _Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout ); 4ae04: 4ef9 0004 7aa4 jmp 47aa4 <_Thread_queue_Enqueue_with_handler> ... =============================================================================== 000528e4 <_CORE_message_queue_Broadcast>: Objects_Id id __attribute__((unused)), CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)), #endif uint32_t *count ) { 528e4: 4e56 ffe0 linkw %fp,#-32 528e8: 48d7 3c3c moveml %d2-%d5/%a2-%a5,%sp@ 528ec: 246e 0008 moveal %fp@(8),%a2 528f0: 2a2e 000c movel %fp@(12),%d5 528f4: 262e 0010 movel %fp@(16),%d3 528f8: 286e 001c moveal %fp@(28),%a4 Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 528fc: b6aa 004c cmpl %a2@(76),%d3 52900: 6304 blss 52906 <_CORE_message_queue_Broadcast+0x22><== ALWAYS TAKEN 52902: 7001 moveq #1,%d0 <== NOT EXECUTED 52904: 6042 bras 52948 <_CORE_message_queue_Broadcast+0x64><== NOT EXECUTED * NOTE: This check is critical because threads can block on * send and receive and this ensures that we are broadcasting * the message to threads waiting to receive -- not to send. */ if ( the_message_queue->number_of_pending_messages != 0 ) { 52906: 4aaa 0048 tstl %a2@(72) 5290a: 6610 bnes 5291c <_CORE_message_queue_Broadcast+0x38> * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { 5290c: 4282 clrl %d2 5290e: 283c 0005 4b58 movel #346968,%d4 const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 52914: 4bf9 0005 a8e0 lea 5a8e0 ,%a5 5291a: 601a bras 52936 <_CORE_message_queue_Broadcast+0x52> * send and receive and this ensures that we are broadcasting * the message to threads waiting to receive -- not to send. */ if ( the_message_queue->number_of_pending_messages != 0 ) { *count = 0; 5291c: 4294 clrl %a4@ 5291e: 6026 bras 52946 <_CORE_message_queue_Broadcast+0x62> 52920: 2f03 movel %d3,%sp@- */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { waitp = &the_thread->Wait; number_broadcasted += 1; 52922: 5282 addql #1,%d2 52924: 2f05 movel %d5,%sp@- 52926: 2f2b 002c movel %a3@(44),%sp@- 5292a: 4e95 jsr %a5@ buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; 5292c: 206b 0028 moveal %a3@(40),%a0 52930: 4fef 000c lea %sp@(12),%sp 52934: 2083 movel %d3,%a0@ * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { 52936: 2f0a movel %a2,%sp@- 52938: 2044 moveal %d4,%a0 5293a: 4e90 jsr %a0@ /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = 5293c: 588f addql #4,%sp _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { 5293e: 2640 moveal %d0,%a3 /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = 52940: 4a80 tstl %d0 52942: 66dc bnes 52920 <_CORE_message_queue_Broadcast+0x3c> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_message_queue_mp_support) ( the_thread, id ); #endif } *count = number_broadcasted; 52944: 2882 movel %d2,%a4@ 52946: 4280 clrl %d0 return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; } 52948: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5 5294e: 4e5e unlk %fp ... =============================================================================== 0004e2e0 <_CORE_message_queue_Initialize>: /* * Round size up to multiple of a pointer for chain init and * check for overflow on adding overhead to each message. */ allocated_message_size = maximum_message_size; if (allocated_message_size & (sizeof(uint32_t) - 1)) { 4e2e0: 7003 moveq #3,%d0 CORE_message_queue_Control *the_message_queue, CORE_message_queue_Attributes *the_message_queue_attributes, uint32_t maximum_pending_messages, size_t maximum_message_size ) { 4e2e2: 4e56 fff4 linkw %fp,#-12 4e2e6: 222e 0014 movel %fp@(20),%d1 4e2ea: 48d7 040c moveml %d2-%d3/%a2,%sp@ 4e2ee: 246e 0008 moveal %fp@(8),%a2 4e2f2: 242e 0010 movel %fp@(16),%d2 /* * Round size up to multiple of a pointer for chain init and * check for overflow on adding overhead to each message. */ allocated_message_size = maximum_message_size; if (allocated_message_size & (sizeof(uint32_t) - 1)) { 4e2f6: c081 andl %d1,%d0 ) { size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; 4e2f8: 2542 0044 movel %d2,%a2@(68) the_message_queue->number_of_pending_messages = 0; 4e2fc: 42aa 0048 clrl %a2@(72) the_message_queue->maximum_message_size = maximum_message_size; 4e300: 2541 004c movel %d1,%a2@(76) /* * Round size up to multiple of a pointer for chain init and * check for overflow on adding overhead to each message. */ allocated_message_size = maximum_message_size; if (allocated_message_size & (sizeof(uint32_t) - 1)) { 4e304: 4a80 tstl %d0 4e306: 6604 bnes 4e30c <_CORE_message_queue_Initialize+0x2c> 4e308: 2001 movel %d1,%d0 4e30a: 600c bras 4e318 <_CORE_message_queue_Initialize+0x38> allocated_message_size += sizeof(uint32_t); 4e30c: 2001 movel %d1,%d0 4e30e: 5880 addql #4,%d0 allocated_message_size &= ~(sizeof(uint32_t) - 1); 4e310: 76fc moveq #-4,%d3 4e312: c083 andl %d3,%d0 } if (allocated_message_size < maximum_message_size) 4e314: b280 cmpl %d0,%d1 4e316: 626e bhis 4e386 <_CORE_message_queue_Initialize+0xa6><== NEVER TAKEN /* * Calculate how much total memory is required for message buffering and * check for overflow on the multiplication. */ message_buffering_required = (size_t) maximum_pending_messages * (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); 4e318: 2600 movel %d0,%d3 4e31a: 0683 0000 0010 addil #16,%d3 /* * Calculate how much total memory is required for message buffering and * check for overflow on the multiplication. */ message_buffering_required = (size_t) maximum_pending_messages * 4e320: 2203 movel %d3,%d1 4e322: 4c02 1800 mulsl %d2,%d1 (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) 4e326: b081 cmpl %d1,%d0 4e328: 625c bhis 4e386 <_CORE_message_queue_Initialize+0xa6><== NEVER TAKEN return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) 4e32a: 2f01 movel %d1,%sp@- 4e32c: 4eb9 0005 0bc8 jsr 50bc8 <_Workspace_Allocate> _Workspace_Allocate( message_buffering_required ); if (the_message_queue->message_buffers == 0) 4e332: 588f addql #4,%sp return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) 4e334: 2540 005c movel %d0,%a2@(92) _Workspace_Allocate( message_buffering_required ); if (the_message_queue->message_buffers == 0) 4e338: 674c beqs 4e386 <_CORE_message_queue_Initialize+0xa6> /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( 4e33a: 2f03 movel %d3,%sp@- 4e33c: 2f02 movel %d2,%sp@- 4e33e: 2f00 movel %d0,%sp@- 4e340: 486a 0060 pea %a2@(96) 4e344: 4eb9 0005 3118 jsr 53118 <_Chain_Initialize> allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( 4e34a: 4878 0006 pea 6 4e34e: 7001 moveq #1,%d0 4e350: 206e 000c moveal %fp@(12),%a0 4e354: b090 cmpl %a0@,%d0 4e356: 57c0 seq %d0 4e358: 4878 0080 pea 80 4e35c: 49c0 extbl %d0 4e35e: 4480 negl %d0 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4e360: 41ea 0054 lea %a2@(84),%a0 4e364: 2f00 movel %d0,%sp@- 4e366: 2548 0050 movel %a0,%a2@(80) the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 4e36a: 41ea 0050 lea %a2@(80),%a0 4e36e: 2548 0058 movel %a0,%a2@(88) 4e372: 2f0a movel %a2,%sp@- RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 4e374: 42aa 0054 clrl %a2@(84) 4e378: 4eb9 0005 0110 jsr 50110 <_Thread_queue_Initialize> THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; 4e37e: 4fef 0020 lea %sp@(32),%sp allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( 4e382: 7001 moveq #1,%d0 THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; 4e384: 6002 bras 4e388 <_CORE_message_queue_Initialize+0xa8> 4e386: 4200 clrb %d0 } 4e388: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2 4e38e: 4e5e unlk %fp ... =============================================================================== 0004e394 <_CORE_message_queue_Seize>: CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; _ISR_Disable( level ); 4e394: 223c 0000 0700 movel #1792,%d1 void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 4e39a: 4e56 ffe0 linkw %fp,#-32 ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; 4e39e: 2079 0006 69ae moveal 669ae <_Thread_Executing>,%a0 void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 4e3a4: 48d7 3c3c moveml %d2-%d5/%a2-%a5,%sp@ 4e3a8: 282e 000c movel %fp@(12),%d4 4e3ac: 262e 001c movel %fp@(28),%d3 4e3b0: 246e 0008 moveal %fp@(8),%a2 ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 4e3b4: 42a8 0034 clrl %a0@(52) void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 4e3b8: 242e 0010 movel %fp@(16),%d2 4e3bc: 226e 0014 moveal %fp@(20),%a1 4e3c0: 1a2e 001b moveb %fp@(27),%d5 CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; _ISR_Disable( level ); 4e3c4: 40c0 movew %sr,%d0 4e3c6: 8280 orl %d0,%d1 4e3c8: 46c1 movew %d1,%sr */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4e3ca: 220a movel %a2,%d1 4e3cc: 0681 0000 0054 addil #84,%d1 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 4e3d2: 266a 0050 moveal %a2@(80),%a3 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4e3d6: b28b cmpl %a3,%d1 4e3d8: 6752 beqs 4e42c <_CORE_message_queue_Seize+0x98> { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 4e3da: 2853 moveal %a3@,%a4 the_chain->first = new_first; new_first->previous = _Chain_Head(the_chain); 4e3dc: 4bea 0050 lea %a2@(80),%a5 Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; the_chain->first = new_first; 4e3e0: 254c 0050 movel %a4,%a2@(80) new_first->previous = _Chain_Head(the_chain); 4e3e4: 294d 0004 movel %a5,%a4@(4) the_message = _CORE_message_queue_Get_pending_message( the_message_queue ); if ( the_message != NULL ) { 4e3e8: 4a8b tstl %a3 4e3ea: 6740 beqs 4e42c <_CORE_message_queue_Seize+0x98> <== NEVER TAKEN the_message_queue->number_of_pending_messages -= 1; 4e3ec: 53aa 0048 subql #1,%a2@(72) _ISR_Enable( level ); 4e3f0: 46c0 movew %d0,%sr *size_p = the_message->Contents.size; 4e3f2: 22ab 0008 movel %a3@(8),%a1@ _Thread_Executing->Wait.count = 4e3f6: 2079 0006 69ae moveal 669ae <_Thread_Executing>,%a0 4e3fc: 42a8 0024 clrl %a0@(36) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 4e400: 2f11 movel %a1@,%sp@- 4e402: 486b 000c pea %a3@(12) RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer ( CORE_message_queue_Control *the_message_queue, CORE_message_queue_Buffer_control *the_message ) { _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node ); 4e406: 45ea 0060 lea %a2@(96),%a2 const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 4e40a: 2f02 movel %d2,%sp@- 4e40c: 4eb9 0005 5b68 jsr 55b68 RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer ( CORE_message_queue_Control *the_message_queue, CORE_message_queue_Buffer_control *the_message ) { _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node ); 4e412: 4fef 000c lea %sp@(12),%sp 4e416: 2d4a 0008 movel %a2,%fp@(8) 4e41a: 2d4b 000c movel %a3,%fp@(12) executing->Wait.return_argument = size_p; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); } 4e41e: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5 4e424: 4e5e unlk %fp 4e426: 4ef9 0004 e21c jmp 4e21c <_Chain_Append> return; } #endif } if ( !wait ) { 4e42c: 4a05 tstb %d5 4e42e: 6612 bnes 4e442 <_CORE_message_queue_Seize+0xae> _ISR_Enable( level ); 4e430: 46c0 movew %d0,%sr executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; 4e432: 7004 moveq #4,%d0 executing->Wait.return_argument = size_p; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); } 4e434: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5 #endif } if ( !wait ) { _ISR_Enable( level ); executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; 4e43a: 2140 0034 movel %d0,%a0@(52) executing->Wait.return_argument = size_p; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); } 4e43e: 4e5e unlk %fp 4e440: 4e75 rts 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; 4e442: 7201 moveq #1,%d1 4e444: 2541 0030 movel %d1,%a2@(48) _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; executing->Wait.id = id; executing->Wait.return_argument_second.mutable_object = buffer; executing->Wait.return_argument = size_p; 4e448: 2149 0028 movel %a1,%a0@(40) } _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; executing->Wait.id = id; executing->Wait.return_argument_second.mutable_object = buffer; 4e44c: 2142 002c movel %d2,%a0@(44) return; } _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; executing->Wait.id = id; 4e450: 2144 0020 movel %d4,%a0@(32) executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; return; } _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; 4e454: 214a 0044 movel %a2,%a0@(68) executing->Wait.id = id; executing->Wait.return_argument_second.mutable_object = buffer; executing->Wait.return_argument = size_p; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); 4e458: 46c0 movew %d0,%sr _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); 4e45a: 4bf9 0005 01cc lea 501cc <_Thread_queue_Timeout>,%a5 4e460: 2d43 000c movel %d3,%fp@(12) 4e464: 2d4d 0010 movel %a5,%fp@(16) 4e468: 2d4a 0008 movel %a2,%fp@(8) } 4e46c: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5 4e472: 4e5e unlk %fp executing->Wait.return_argument_second.mutable_object = buffer; executing->Wait.return_argument = size_p; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); 4e474: 4ef9 0004 fee0 jmp 4fee0 <_Thread_queue_Enqueue_with_handler> ... =============================================================================== 000462b0 <_CORE_mutex_Seize>: Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 462b0: 4e56 0000 linkw %fp,#0 462b4: 202e 0010 movel %fp@(16),%d0 462b8: 2f0a movel %a2,%sp@- 462ba: 246e 0008 moveal %fp@(8),%a2 462be: 2f02 movel %d2,%sp@- _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 462c0: 2239 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d1 Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 462c6: 1400 moveb %d0,%d2 _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 462c8: 4a81 tstl %d1 462ca: 671c beqs 462e8 <_CORE_mutex_Seize+0x38> 462cc: 4a00 tstb %d0 462ce: 6718 beqs 462e8 <_CORE_mutex_Seize+0x38> <== NEVER TAKEN 462d0: 7001 moveq #1,%d0 462d2: b0b9 0005 dd9e cmpl 5dd9e <_System_state_Current>,%d0 462d8: 640e bccs 462e8 <_CORE_mutex_Seize+0x38> 462da: 4878 0013 pea 13 462de: 42a7 clrl %sp@- 462e0: 42a7 clrl %sp@- 462e2: 4eb9 0004 68d4 jsr 468d4 <_Internal_error_Occurred> 462e8: 486e 0018 pea %fp@(24) 462ec: 2f0a movel %a2,%sp@- 462ee: 4eb9 0004 ae0c jsr 4ae0c <_CORE_mutex_Seize_interrupt_trylock> 462f4: 508f addql #8,%sp 462f6: 4a80 tstl %d0 462f8: 6750 beqs 4634a <_CORE_mutex_Seize+0x9a> 462fa: 4a02 tstb %d2 462fc: 6614 bnes 46312 <_CORE_mutex_Seize+0x62> 462fe: 202e 0018 movel %fp@(24),%d0 46302: 46c0 movew %d0,%sr 46304: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 4630a: 7001 moveq #1,%d0 4630c: 2140 0034 movel %d0,%a0@(52) 46310: 6038 bras 4634a <_CORE_mutex_Seize+0x9a> 46312: 2039 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d0 46318: 5280 addql #1,%d0 4631a: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 46320: 216e 000c 0020 movel %fp@(12),%a0@(32) 46326: 23c0 0005 dc1c movel %d0,5dc1c <_Thread_Dispatch_disable_level> 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; 4632c: 7001 moveq #1,%d0 4632e: 214a 0044 movel %a2,%a0@(68) 46332: 2540 0030 movel %d0,%a2@(48) 46336: 202e 0018 movel %fp@(24),%d0 4633a: 46c0 movew %d0,%sr 4633c: 2f2e 0014 movel %fp@(20),%sp@- 46340: 2f0a movel %a2,%sp@- 46342: 4eb9 0004 624c jsr 4624c <_CORE_mutex_Seize_interrupt_blocking> 46348: 508f addql #8,%sp } 4634a: 242e fff8 movel %fp@(-8),%d2 4634e: 246e fffc moveal %fp@(-4),%a2 46352: 4e5e unlk %fp ... =============================================================================== 0004ae0c <_CORE_mutex_Seize_interrupt_trylock>: #if defined(__RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__) int _CORE_mutex_Seize_interrupt_trylock( CORE_mutex_Control *the_mutex, ISR_Level *level_p ) { 4ae0c: 4e56 0000 linkw %fp,#0 { Thread_Control *executing; /* disabled when you get here */ executing = _Thread_Executing; 4ae10: 2279 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a1 4ae16: 2f0b movel %a3,%sp@- 4ae18: 206e 0008 moveal %fp@(8),%a0 4ae1c: 2f0a movel %a2,%sp@- 4ae1e: 246e 000c moveal %fp@(12),%a2 executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 4ae22: 42a9 0034 clrl %a1@(52) if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 4ae26: 4aa8 004e tstl %a0@(78) 4ae2a: 6700 0098 beqw 4aec4 <_CORE_mutex_Seize_interrupt_trylock+0xb8> the_mutex->lock = CORE_MUTEX_LOCKED; 4ae2e: 42a8 004e clrl %a0@(78) the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 4ae32: 7201 moveq #1,%d1 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 4ae34: 2169 0008 005e movel %a1@(8),%a0@(94) */ RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 4ae3a: 2028 0046 movel %a0@(70),%d0 executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 4ae3e: 2141 0052 movel %d1,%a0@(82) if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 4ae42: 123c 0002 moveb #2,%d1 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 4ae46: 2149 005a movel %a1,%a0@(90) the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 4ae4a: b280 cmpl %d0,%d1 4ae4c: 6708 beqs 4ae56 <_CORE_mutex_Seize_interrupt_trylock+0x4a> 4ae4e: 123c 0003 moveb #3,%d1 4ae52: b280 cmpl %d0,%d1 4ae54: 660a bnes 4ae60 <_CORE_mutex_Seize_interrupt_trylock+0x54> _Chain_Prepend_unprotected( &executing->lock_mutex, &the_mutex->queue.lock_queue ); the_mutex->queue.priority_before = executing->current_priority; #endif executing->resource_count++; 4ae56: 52a9 001c addql #1,%a1@(28) } if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 4ae5a: 7203 moveq #3,%d1 4ae5c: b280 cmpl %d0,%d1 4ae5e: 6706 beqs 4ae66 <_CORE_mutex_Seize_interrupt_trylock+0x5a> _ISR_Enable( *level_p ); 4ae60: 2012 movel %a2@,%d0 4ae62: 46c0 movew %d0,%sr 4ae64: 607c bras 4aee2 <_CORE_mutex_Seize_interrupt_trylock+0xd6> */ { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; 4ae66: 2028 004a movel %a0@(74),%d0 current = executing->current_priority; 4ae6a: 2229 0014 movel %a1@(20),%d1 if ( current == ceiling ) { 4ae6e: b081 cmpl %d1,%d0 4ae70: 6606 bnes 4ae78 <_CORE_mutex_Seize_interrupt_trylock+0x6c> _ISR_Enable( *level_p ); 4ae72: 2012 movel %a2@,%d0 4ae74: 46c0 movew %d0,%sr 4ae76: 606a bras 4aee2 <_CORE_mutex_Seize_interrupt_trylock+0xd6> return 0; } if ( current > ceiling ) { 4ae78: b081 cmpl %d1,%d0 4ae7a: 642e bccs 4aeaa <_CORE_mutex_Seize_interrupt_trylock+0x9e> rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4ae7c: 2039 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d0 4ae82: 5280 addql #1,%d0 4ae84: 23c0 0005 dc1c movel %d0,5dc1c <_Thread_Dispatch_disable_level> _Thread_Disable_dispatch(); _ISR_Enable( *level_p ); 4ae8a: 2012 movel %a2@,%d0 4ae8c: 46c0 movew %d0,%sr _Thread_Change_priority( 4ae8e: 42a7 clrl %sp@- 4ae90: 2f28 004a movel %a0@(74),%sp@- 4ae94: 2f28 005a movel %a0@(90),%sp@- 4ae98: 4eb9 0004 7138 jsr 47138 <_Thread_Change_priority> the_mutex->holder, the_mutex->Attributes.priority_ceiling, false ); _Thread_Enable_dispatch(); 4ae9e: 4eb9 0004 7632 jsr 47632 <_Thread_Enable_dispatch> 4aea4: 4fef 000c lea %sp@(12),%sp 4aea8: 6038 bras 4aee2 <_CORE_mutex_Seize_interrupt_trylock+0xd6> return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 4aeaa: 7006 moveq #6,%d0 the_mutex->lock = CORE_MUTEX_UNLOCKED; 4aeac: 7201 moveq #1,%d1 ); _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 4aeae: 2340 0034 movel %d0,%a1@(52) the_mutex->lock = CORE_MUTEX_UNLOCKED; the_mutex->nest_count = 0; /* undo locking above */ 4aeb2: 42a8 0052 clrl %a0@(82) _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 4aeb6: 2141 004e movel %d1,%a0@(78) the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 4aeba: 53a9 001c subql #1,%a1@(28) _ISR_Enable( *level_p ); 4aebe: 2012 movel %a2@,%d0 4aec0: 46c0 movew %d0,%sr 4aec2: 601e bras 4aee2 <_CORE_mutex_Seize_interrupt_trylock+0xd6> /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 4aec4: 2668 005a moveal %a0@(90),%a3 4aec8: b3cb cmpal %a3,%a1 4aeca: 6626 bnes 4aef2 <_CORE_mutex_Seize_interrupt_trylock+0xe6> switch ( the_mutex->Attributes.lock_nesting_behavior ) { 4aecc: 2028 0040 movel %a0@(64),%d0 4aed0: 6708 beqs 4aeda <_CORE_mutex_Seize_interrupt_trylock+0xce> 4aed2: 7201 moveq #1,%d1 4aed4: b280 cmpl %d0,%d1 4aed6: 661a bnes 4aef2 <_CORE_mutex_Seize_interrupt_trylock+0xe6><== ALWAYS TAKEN 4aed8: 600c bras 4aee6 <_CORE_mutex_Seize_interrupt_trylock+0xda><== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 4aeda: 52a8 0052 addql #1,%a0@(82) _ISR_Enable( *level_p ); 4aede: 2012 movel %a2@,%d0 4aee0: 46c0 movew %d0,%sr 4aee2: 4280 clrl %d0 4aee4: 600e bras 4aef4 <_CORE_mutex_Seize_interrupt_trylock+0xe8> return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4aee6: 7002 moveq #2,%d0 <== NOT EXECUTED 4aee8: 2740 0034 movel %d0,%a3@(52) <== NOT EXECUTED _ISR_Enable( *level_p ); 4aeec: 2012 movel %a2@,%d0 <== NOT EXECUTED 4aeee: 46c0 movew %d0,%sr <== NOT EXECUTED 4aef0: 60f0 bras 4aee2 <_CORE_mutex_Seize_interrupt_trylock+0xd6><== NOT EXECUTED 4aef2: 7001 moveq #1,%d0 return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p ); } 4aef4: 246e fff8 moveal %fp@(-8),%a2 4aef8: 266e fffc moveal %fp@(-4),%a3 4aefc: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 000464a4 <_CORE_semaphore_Surrender>: CORE_semaphore_Status _CORE_semaphore_Surrender( CORE_semaphore_Control *the_semaphore, Objects_Id id, CORE_semaphore_API_mp_support_callout api_semaphore_mp_support ) { 464a4: 4e56 0000 linkw %fp,#0 464a8: 2f0a movel %a2,%sp@- 464aa: 246e 0008 moveal %fp@(8),%a2 ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { 464ae: 2f0a movel %a2,%sp@- 464b0: 4eb9 0004 7964 jsr 47964 <_Thread_queue_Dequeue> 464b6: 588f addql #4,%sp 464b8: 4a80 tstl %d0 464ba: 6704 beqs 464c0 <_CORE_semaphore_Surrender+0x1c> 464bc: 4280 clrl %d0 464be: 6024 bras 464e4 <_CORE_semaphore_Surrender+0x40> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_semaphore_mp_support) ( the_thread, id ); #endif } else { _ISR_Disable( level ); 464c0: 203c 0000 0700 movel #1792,%d0 464c6: 40c1 movew %sr,%d1 464c8: 8081 orl %d1,%d0 464ca: 46c0 movew %d0,%sr if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) 464cc: 202a 0048 movel %a2@(72),%d0 464d0: b0aa 0040 cmpl %a2@(64),%d0 464d4: 6504 bcss 464da <_CORE_semaphore_Surrender+0x36> <== ALWAYS TAKEN 464d6: 7004 moveq #4,%d0 <== NOT EXECUTED 464d8: 6008 bras 464e2 <_CORE_semaphore_Surrender+0x3e> <== NOT EXECUTED the_semaphore->count += 1; 464da: 5280 addql #1,%d0 464dc: 2540 0048 movel %d0,%a2@(72) 464e0: 4280 clrl %d0 else status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; _ISR_Enable( level ); 464e2: 46c1 movew %d1,%sr } return status; } 464e4: 246e fffc moveal %fp@(-4),%a2 464e8: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00045268 <_Event_Seize>: executing = _Thread_Executing; executing->Wait.return_code = RTEMS_SUCCESSFUL; api = executing->API_Extensions[ THREAD_API_RTEMS ]; _ISR_Disable( level ); 45268: 203c 0000 0700 movel #1792,%d0 rtems_event_set event_in, rtems_option option_set, rtems_interval ticks, rtems_event_set *event_out ) { 4526e: 4e56 ffec linkw %fp,#-20 45272: 226e 0010 moveal %fp@(16),%a1 45276: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@ rtems_event_set pending_events; ISR_Level level; RTEMS_API_Control *api; Thread_blocking_operation_States sync_state; executing = _Thread_Executing; 4527a: 2479 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a2 rtems_event_set event_in, rtems_option option_set, rtems_interval ticks, rtems_event_set *event_out ) { 45280: 242e 0008 movel %fp@(8),%d2 45284: 262e 000c movel %fp@(12),%d3 ISR_Level level; RTEMS_API_Control *api; Thread_blocking_operation_States sync_state; executing = _Thread_Executing; executing->Wait.return_code = RTEMS_SUCCESSFUL; 45288: 42aa 0034 clrl %a2@(52) rtems_event_set event_in, rtems_option option_set, rtems_interval ticks, rtems_event_set *event_out ) { 4528c: 206e 0014 moveal %fp@(20),%a0 Thread_blocking_operation_States sync_state; executing = _Thread_Executing; executing->Wait.return_code = RTEMS_SUCCESSFUL; api = executing->API_Extensions[ THREAD_API_RTEMS ]; 45290: 266a 0108 moveal %a2@(264),%a3 _ISR_Disable( level ); 45294: 40c1 movew %sr,%d1 45296: 8081 orl %d1,%d0 45298: 46c0 movew %d0,%sr pending_events = api->pending_events; 4529a: 2813 movel %a3@,%d4 RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get( rtems_event_set the_event_set, rtems_event_set the_event_condition ) { return ( the_event_set & the_event_condition ); 4529c: 2002 movel %d2,%d0 4529e: c084 andl %d4,%d0 seized_events = _Event_sets_Get( pending_events, event_in ); if ( !_Event_sets_Is_empty( seized_events ) && 452a0: 6716 beqs 452b8 <_Event_Seize+0x50> 452a2: b480 cmpl %d0,%d2 452a4: 6706 beqs 452ac <_Event_Seize+0x44> 452a6: 0803 0001 btst #1,%d3 452aa: 670c beqs 452b8 <_Event_Seize+0x50> <== NEVER TAKEN (seized_events == event_in || _Options_Is_any( option_set )) ) { api->pending_events = 452ac: 2400 movel %d0,%d2 452ae: 4682 notl %d2 452b0: c484 andl %d4,%d2 452b2: 2682 movel %d2,%a3@ _Event_sets_Clear( pending_events, seized_events ); _ISR_Enable( level ); 452b4: 46c1 movew %d1,%sr 452b6: 600e bras 452c6 <_Event_Seize+0x5e> *event_out = seized_events; return; } if ( _Options_Is_no_wait( option_set ) ) { 452b8: 0803 0000 btst #0,%d3 452bc: 670e beqs 452cc <_Event_Seize+0x64> _ISR_Enable( level ); 452be: 46c1 movew %d1,%sr executing->Wait.return_code = RTEMS_UNSATISFIED; 452c0: 720d moveq #13,%d1 452c2: 2541 0034 movel %d1,%a2@(52) *event_out = seized_events; 452c6: 2080 movel %d0,%a0@ return; 452c8: 6000 0096 braw 45360 <_Event_Seize+0xf8> * * NOTE: Since interrupts are disabled, this isn't that much of an * issue but better safe than sorry. */ executing->Wait.option = (uint32_t) option_set; executing->Wait.count = (uint32_t) event_in; 452cc: 2542 0024 movel %d2,%a2@(36) executing->Wait.return_argument = event_out; _Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 452d0: 7401 moveq #1,%d2 * set properly when we are marked as in the event critical section. * * NOTE: Since interrupts are disabled, this isn't that much of an * issue but better safe than sorry. */ executing->Wait.option = (uint32_t) option_set; 452d2: 2543 0030 movel %d3,%a2@(48) executing->Wait.count = (uint32_t) event_in; executing->Wait.return_argument = event_out; 452d6: 2548 0028 movel %a0,%a2@(40) _Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 452da: 23c2 0005 de26 movel %d2,5de26 <_Event_Sync_state> _ISR_Enable( level ); 452e0: 46c1 movew %d1,%sr if ( ticks ) { 452e2: 4a89 tstl %a1 452e4: 6730 beqs 45316 <_Event_Seize+0xae> _Watchdog_Initialize( 452e6: 202a 0008 movel %a2@(8),%d0 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 452ea: 223c 0004 54c8 movel #283848,%d1 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 452f0: 2549 0054 movel %a1,%a2@(84) Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 452f4: 2541 0064 movel %d1,%a2@(100) the_watchdog->id = id; 452f8: 2540 0068 movel %d0,%a2@(104) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 452fc: 42aa 0050 clrl %a2@(80) the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 45300: 42aa 006c clrl %a2@(108) ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 45304: 486a 0048 pea %a2@(72) 45308: 4879 0005 dcf4 pea 5dcf4 <_Watchdog_Ticks_chain> 4530e: 4eb9 0004 8544 jsr 48544 <_Watchdog_Insert> 45314: 508f addql #8,%sp NULL ); _Watchdog_Insert_ticks( &executing->Timer, ticks ); } _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT ); 45316: 4878 0100 pea 100 4531a: 2f0a movel %a2,%sp@- 4531c: 4eb9 0004 7e38 jsr 47e38 <_Thread_Set_state> _ISR_Disable( level ); 45322: 203c 0000 0700 movel #1792,%d0 45328: 40c1 movew %sr,%d1 4532a: 8081 orl %d1,%d0 4532c: 46c0 movew %d0,%sr sync_state = _Event_Sync_state; _Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) { 4532e: 7401 moveq #1,%d2 45330: 508f addql #8,%sp _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT ); _ISR_Disable( level ); sync_state = _Event_Sync_state; 45332: 2039 0005 de26 movel 5de26 <_Event_Sync_state>,%d0 _Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 45338: 42b9 0005 de26 clrl 5de26 <_Event_Sync_state> if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) { 4533e: b480 cmpl %d0,%d2 45340: 6604 bnes 45346 <_Event_Seize+0xde> _ISR_Enable( level ); 45342: 46c1 movew %d1,%sr 45344: 601a bras 45360 <_Event_Seize+0xf8> * An interrupt completed the thread's blocking request. * The blocking thread was satisfied by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ _Thread_blocking_operation_Cancel( sync_state, executing, level ); 45346: 2d4a 000c movel %a2,%fp@(12) 4534a: 2d41 0010 movel %d1,%fp@(16) } 4534e: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3 * An interrupt completed the thread's blocking request. * The blocking thread was satisfied by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ _Thread_blocking_operation_Cancel( sync_state, executing, level ); 45354: 2d40 0008 movel %d0,%fp@(8) } 45358: 4e5e unlk %fp * An interrupt completed the thread's blocking request. * The blocking thread was satisfied by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ _Thread_blocking_operation_Cancel( sync_state, executing, level ); 4535a: 4ef9 0004 70e8 jmp 470e8 <_Thread_blocking_operation_Cancel> } 45360: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3 45366: 4e5e unlk %fp ... =============================================================================== 000453c0 <_Event_Surrender>: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; option_set = (rtems_option) the_thread->Wait.option; _ISR_Disable( level ); 453c0: 203c 0000 0700 movel #1792,%d0 */ void _Event_Surrender( Thread_Control *the_thread ) { 453c6: 4e56 ffe8 linkw %fp,#-24 453ca: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@ 453ce: 246e 0008 moveal %fp@(8),%a2 rtems_event_set event_condition; rtems_event_set seized_events; rtems_option option_set; RTEMS_API_Control *api; api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; 453d2: 206a 0108 moveal %a2@(264),%a0 option_set = (rtems_option) the_thread->Wait.option; 453d6: 282a 0030 movel %a2@(48),%d4 _ISR_Disable( level ); 453da: 40c1 movew %sr,%d1 453dc: 8081 orl %d1,%d0 453de: 46c0 movew %d0,%sr pending_events = api->pending_events; event_condition = (rtems_event_set) the_thread->Wait.count; 453e0: 262a 0024 movel %a2@(36),%d3 RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get( rtems_event_set the_event_set, rtems_event_set the_event_condition ) { return ( the_event_set & the_event_condition ); 453e4: 2003 movel %d3,%d0 api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; option_set = (rtems_option) the_thread->Wait.option; _ISR_Disable( level ); pending_events = api->pending_events; 453e6: 2410 movel %a0@,%d2 453e8: c082 andl %d2,%d0 seized_events = _Event_sets_Get( pending_events, event_condition ); /* * No events were seized in this operation */ if ( _Event_sets_Is_empty( seized_events ) ) { 453ea: 6606 bnes 453f2 <_Event_Surrender+0x32> _ISR_Enable( level ); 453ec: 46c1 movew %d1,%sr return; 453ee: 6000 00cc braw 454bc <_Event_Surrender+0xfc> /* * If we are in an ISR and sending to the current thread, then * we have a critical section issue to deal with. */ if ( _ISR_Is_in_progress() && 453f2: 2279 0005 dcb6 moveal 5dcb6 <_ISR_Nest_level>,%a1 453f8: 4a89 tstl %a1 453fa: 674a beqs 45446 <_Event_Surrender+0x86> 453fc: b5f9 0005 dcd6 cmpal 5dcd6 <_Thread_Executing>,%a2 45402: 6642 bnes 45446 <_Event_Surrender+0x86> _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || 45404: 2279 0005 de26 moveal 5de26 <_Event_Sync_state>,%a1 /* * If we are in an ISR and sending to the current thread, then * we have a critical section issue to deal with. */ if ( _ISR_Is_in_progress() && 4540a: 7a02 moveq #2,%d5 4540c: ba89 cmpl %a1,%d5 4540e: 670e beqs 4541e <_Event_Surrender+0x5e> <== NEVER TAKEN _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { 45410: 2279 0005 de26 moveal 5de26 <_Event_Sync_state>,%a1 /* * If we are in an ISR and sending to the current thread, then * we have a critical section issue to deal with. */ if ( _ISR_Is_in_progress() && 45416: 1a3c 0001 moveb #1,%d5 4541a: ba89 cmpl %a1,%d5 4541c: 6628 bnes 45446 <_Event_Surrender+0x86> _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { 4541e: b680 cmpl %d0,%d3 45420: 6706 beqs 45428 <_Event_Surrender+0x68> 45422: 0804 0001 btst #1,%d4 45426: 671a beqs 45442 <_Event_Surrender+0x82> <== NEVER TAKEN api->pending_events = _Event_sets_Clear( pending_events,seized_events ); 45428: 2600 movel %d0,%d3 4542a: 4683 notl %d3 4542c: c682 andl %d2,%d3 4542e: 2083 movel %d3,%a0@ the_thread->Wait.count = 0; *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 45430: 206a 0028 moveal %a2@(40),%a0 _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { api->pending_events = _Event_sets_Clear( pending_events,seized_events ); the_thread->Wait.count = 0; 45434: 42aa 0024 clrl %a2@(36) *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 45438: 2080 movel %d0,%a0@ _Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; 4543a: 7003 moveq #3,%d0 4543c: 23c0 0005 de26 movel %d0,5de26 <_Event_Sync_state> } _ISR_Enable( level ); 45442: 46c1 movew %d1,%sr return; 45444: 6076 bras 454bc <_Event_Surrender+0xfc> } /* * Otherwise, this is a normal send to another thread */ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { 45446: 2a2a 0010 movel %a2@(16),%d5 4544a: 0285 0000 0100 andil #256,%d5 45450: 6768 beqs 454ba <_Event_Surrender+0xfa> if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { 45452: b680 cmpl %d0,%d3 45454: 6706 beqs 4545c <_Event_Surrender+0x9c> 45456: 0804 0001 btst #1,%d4 4545a: 675e beqs 454ba <_Event_Surrender+0xfa> <== NEVER TAKEN api->pending_events = _Event_sets_Clear( pending_events, seized_events ); 4545c: 2600 movel %d0,%d3 4545e: 4683 notl %d3 45460: c682 andl %d2,%d3 45462: 2083 movel %d3,%a0@ the_thread->Wait.count = 0; *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 45464: 206a 0028 moveal %a2@(40),%a0 * Otherwise, this is a normal send to another thread */ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { api->pending_events = _Event_sets_Clear( pending_events, seized_events ); the_thread->Wait.count = 0; 45468: 42aa 0024 clrl %a2@(36) *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 4546c: 2080 movel %d0,%a0@ _ISR_Flash( level ); 4546e: 203c 0000 0700 movel #1792,%d0 45474: 46c1 movew %d1,%sr 45476: 8081 orl %d1,%d0 45478: 46c0 movew %d0,%sr 4547a: 47f9 0004 7278 lea 47278 <_Thread_Clear_state>,%a3 if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 45480: 7a02 moveq #2,%d5 45482: baaa 0050 cmpl %a2@(80),%d5 45486: 6710 beqs 45498 <_Event_Surrender+0xd8> _ISR_Enable( level ); 45488: 46c1 movew %d1,%sr RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 4548a: 2f3c 1003 fff8 movel #268697592,%sp@- 45490: 2f0a movel %a2,%sp@- 45492: 4e93 jsr %a3@ 45494: 508f addql #8,%sp 45496: 6024 bras 454bc <_Event_Surrender+0xfc> RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 45498: 7003 moveq #3,%d0 4549a: 2540 0050 movel %d0,%a2@(80) _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 4549e: 46c1 movew %d1,%sr (void) _Watchdog_Remove( &the_thread->Timer ); 454a0: 486a 0048 pea %a2@(72) 454a4: 4eb9 0004 8660 jsr 48660 <_Watchdog_Remove> 454aa: 2f3c 1003 fff8 movel #268697592,%sp@- 454b0: 2f0a movel %a2,%sp@- 454b2: 4e93 jsr %a3@ 454b4: 4fef 000c lea %sp@(12),%sp 454b8: 6002 bras 454bc <_Event_Surrender+0xfc> _Thread_Unblock( the_thread ); } return; } } _ISR_Enable( level ); 454ba: 46c1 movew %d1,%sr } 454bc: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3 454c2: 4e5e unlk %fp ... =============================================================================== 000454c8 <_Event_Timeout>: void _Event_Timeout( Objects_Id id, void *ignored ) { 454c8: 4e56 fffc linkw %fp,#-4 454cc: 2f03 movel %d3,%sp@- 454ce: 2f02 movel %d2,%sp@- Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); 454d0: 486e fffc pea %fp@(-4) 454d4: 2f2e 0008 movel %fp@(8),%sp@- 454d8: 4eb9 0004 7658 jsr 47658 <_Thread_Get> switch ( location ) { 454de: 508f addql #8,%sp 454e0: 4aae fffc tstl %fp@(-4) 454e4: 6656 bnes 4553c <_Event_Timeout+0x74> <== NEVER TAKEN * * If it is not satisfied, then it is "nothing happened" and * this is the "timeout" transition. After a request is satisfied, * a timeout is not allowed to occur. */ _ISR_Disable( level ); 454e6: 223c 0000 0700 movel #1792,%d1 454ec: 40c2 movew %sr,%d2 454ee: 8282 orl %d2,%d1 454f0: 46c1 movew %d1,%sr _ISR_Enable( level ); return; } #endif the_thread->Wait.count = 0; 454f2: 2040 moveal %d0,%a0 454f4: 42a8 0024 clrl %a0@(36) if ( _Thread_Is_executing( the_thread ) ) { 454f8: b0b9 0005 dcd6 cmpl 5dcd6 <_Thread_Executing>,%d0 454fe: 6614 bnes 45514 <_Event_Timeout+0x4c> if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) 45500: 2239 0005 de26 movel 5de26 <_Event_Sync_state>,%d1 45506: 7601 moveq #1,%d3 45508: b681 cmpl %d1,%d3 4550a: 6608 bnes 45514 <_Event_Timeout+0x4c> _Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 4550c: 7202 moveq #2,%d1 4550e: 23c1 0005 de26 movel %d1,5de26 <_Event_Sync_state> } the_thread->Wait.return_code = RTEMS_TIMEOUT; 45514: 7606 moveq #6,%d3 45516: 2040 moveal %d0,%a0 45518: 2143 0034 movel %d3,%a0@(52) _ISR_Enable( level ); 4551c: 46c2 movew %d2,%sr 4551e: 2f3c 1003 fff8 movel #268697592,%sp@- 45524: 2f00 movel %d0,%sp@- 45526: 4eb9 0004 7278 jsr 47278 <_Thread_Clear_state> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 4552c: 508f addql #8,%sp 4552e: 2039 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d0 45534: 5380 subql #1,%d0 45536: 23c0 0005 dc1c movel %d0,5dc1c <_Thread_Dispatch_disable_level> case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 4553c: 242e fff4 movel %fp@(-12),%d2 45540: 262e fff8 movel %fp@(-8),%d3 45544: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0004af6c <_Heap_Allocate_aligned_with_boundary>: Heap_Control *heap, uintptr_t alloc_size, uintptr_t alignment, uintptr_t boundary ) { 4af6c: 4e56 ffc8 linkw %fp,#-56 4af70: 202e 000c movel %fp@(12),%d0 4af74: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@ 4af78: 246e 0008 moveal %fp@(8),%a2 Heap_Statistics *const stats = &heap->stats; Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); Heap_Block *block = _Heap_Free_list_first( heap ); uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE - HEAP_BLOCK_SIZE_OFFSET; 4af7c: 2840 moveal %d0,%a4 4af7e: 588c addql #4,%a4 Heap_Control *heap, uintptr_t alloc_size, uintptr_t alignment, uintptr_t boundary ) { 4af80: 222e 0010 movel %fp@(16),%d1 4af84: 2a2e 0014 movel %fp@(20),%d5 return &heap->free_list; } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap ) { return _Heap_Free_list_head(heap)->next; 4af88: 206a 0008 moveal %a2@(8),%a0 Heap_Statistics *const stats = &heap->stats; Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); Heap_Block *block = _Heap_Free_list_first( heap ); uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE - HEAP_BLOCK_SIZE_OFFSET; uintptr_t const page_size = heap->page_size; 4af8c: 2e2a 0010 movel %a2@(16),%d7 uintptr_t alloc_begin = 0; uint32_t search_count = 0; if ( block_size_floor < alloc_size ) { 4af90: b08c cmpl %a4,%d0 4af92: 6200 0120 bhiw 4b0b4 <_Heap_Allocate_aligned_with_boundary+0x148> /* Integer overflow occured */ return NULL; } if ( boundary != 0 ) { 4af96: 4a85 tstl %d5 4af98: 670c beqs 4afa6 <_Heap_Allocate_aligned_with_boundary+0x3a> if ( boundary < alloc_size ) { 4af9a: b085 cmpl %d5,%d0 4af9c: 6200 0116 bhiw 4b0b4 <_Heap_Allocate_aligned_with_boundary+0x148> return NULL; } if ( alignment == 0 ) { 4afa0: 4a81 tstl %d1 4afa2: 6602 bnes 4afa6 <_Heap_Allocate_aligned_with_boundary+0x3a> 4afa4: 2207 movel %d7,%d1 uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; 4afa6: 2407 movel %d7,%d2 4afa8: 5e82 addql #7,%d2 if ( boundary != 0 ) { if ( boundary < alloc_size ) { return NULL; } if ( alignment == 0 ) { 4afaa: 4283 clrl %d3 4afac: 2a43 moveal %d3,%a5 uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; 4afae: 2d42 fff8 movel %d2,%fp@(-8) uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET; uintptr_t alloc_begin = alloc_end - alloc_size; 4afb2: 7404 moveq #4,%d2 4afb4: 9480 subl %d0,%d2 4afb6: 2d42 fff4 movel %d2,%fp@(-12) 4afba: 6000 00c6 braw 4b082 <_Heap_Allocate_aligned_with_boundary+0x116> /* * The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag * field. Thus the value is about one unit larger than the real block * size. The greater than operator takes this into account. */ if ( block->size_and_flag > block_size_floor ) { 4afbe: 2628 0004 movel %a0@(4),%d3 while ( block != free_list_tail ) { _HAssert( _Heap_Is_prev_used( block ) ); /* Statistics */ ++search_count; 4afc2: 528d addql #1,%a5 /* * The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag * field. Thus the value is about one unit larger than the real block * size. The greater than operator takes this into account. */ if ( block->size_and_flag > block_size_floor ) { 4afc4: b9c3 cmpal %d3,%a4 4afc6: 6400 00b6 bccw 4b07e <_Heap_Allocate_aligned_with_boundary+0x112> 4afca: 43e8 0008 lea %a0@(8),%a1 if ( alignment == 0 ) { 4afce: 4a81 tstl %d1 4afd0: 6606 bnes 4afd8 <_Heap_Allocate_aligned_with_boundary+0x6c> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block( const Heap_Block *block ) { return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE; 4afd2: 2409 movel %a1,%d2 4afd4: 6000 00a4 braw 4b07a <_Heap_Allocate_aligned_with_boundary+0x10e> uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; uintptr_t const block_begin = (uintptr_t) block; uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; 4afd8: 74fe moveq #-2,%d2 4afda: c682 andl %d2,%d3 uintptr_t alignment, uintptr_t boundary ) { uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; 4afdc: 266a 0014 moveal %a2@(20),%a3 uintptr_t const block_begin = (uintptr_t) block; uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; 4afe0: d688 addl %a0,%d3 uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; 4afe2: 282e fff8 movel %fp@(-8),%d4 4afe6: 988b subl %a3,%d4 uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET; uintptr_t alloc_begin = alloc_end - alloc_size; 4afe8: 242e fff4 movel %fp@(-12),%d2 4afec: d483 addl %d3,%d2 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 4afee: 2c02 movel %d2,%d6 uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; 4aff0: d684 addl %d4,%d3 4aff2: 4c41 6004 remul %d1,%d4,%d6 uintptr_t alignment, uintptr_t boundary ) { uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; 4aff6: 2d4b fff0 movel %a3,%fp@(-16) 4affa: 9484 subl %d4,%d2 uintptr_t alloc_begin = alloc_end - alloc_size; alloc_begin = _Heap_Align_down( alloc_begin, alignment ); /* Ensure that the we have a valid new block at the end */ if ( alloc_begin > alloc_begin_ceiling ) { 4affc: b682 cmpl %d2,%d3 4affe: 640a bccs 4b00a <_Heap_Allocate_aligned_with_boundary+0x9e> 4b000: 2803 movel %d3,%d4 4b002: 4c41 4002 remul %d1,%d2,%d4 4b006: 9682 subl %d2,%d3 4b008: 2403 movel %d3,%d2 } alloc_end = alloc_begin + alloc_size; /* Ensure boundary constaint */ if ( boundary != 0 ) { 4b00a: 4a85 tstl %d5 4b00c: 674e beqs 4b05c <_Heap_Allocate_aligned_with_boundary+0xf0> /* Ensure that the we have a valid new block at the end */ if ( alloc_begin > alloc_begin_ceiling ) { alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment ); } alloc_end = alloc_begin + alloc_size; 4b00e: 2802 movel %d2,%d4 4b010: d880 addl %d0,%d4 4b012: 2604 movel %d4,%d3 /* Ensure boundary constaint */ if ( boundary != 0 ) { uintptr_t const boundary_floor = alloc_begin_floor + alloc_size; 4b014: 47f1 0800 lea %a1@(00000000,%d0:l),%a3 4b018: 4c45 3006 remul %d5,%d6,%d3 4b01c: 2d4b fffc movel %a3,%fp@(-4) 4b020: 2604 movel %d4,%d3 4b022: 9686 subl %d6,%d3 4b024: 2c03 movel %d3,%d6 4b026: 266e fff0 moveal %fp@(-16),%a3 4b02a: 6020 bras 4b04c <_Heap_Allocate_aligned_with_boundary+0xe0> uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary ); while ( alloc_begin < boundary_line && boundary_line < alloc_end ) { if ( boundary_line < boundary_floor ) { 4b02c: bcae fffc cmpl %fp@(-4),%d6 4b030: 654c bcss 4b07e <_Heap_Allocate_aligned_with_boundary+0x112> 4b032: 2803 movel %d3,%d4 4b034: 4c41 4002 remul %d1,%d2,%d4 4b038: 9682 subl %d2,%d3 return 0; } alloc_begin = boundary_line - alloc_size; alloc_begin = _Heap_Align_down( alloc_begin, alignment ); alloc_end = alloc_begin + alloc_size; 4b03a: 2803 movel %d3,%d4 4b03c: d880 addl %d0,%d4 4b03e: 2403 movel %d3,%d2 4b040: 2604 movel %d4,%d3 4b042: 4c45 3006 remul %d5,%d6,%d3 4b046: 2604 movel %d4,%d3 4b048: 9686 subl %d6,%d3 4b04a: 2c03 movel %d3,%d6 while ( alloc_begin < boundary_line && boundary_line < alloc_end ) { if ( boundary_line < boundary_floor ) { return 0; } alloc_begin = boundary_line - alloc_size; 4b04c: 2606 movel %d6,%d3 4b04e: 9680 subl %d0,%d3 /* Ensure boundary constaint */ if ( boundary != 0 ) { uintptr_t const boundary_floor = alloc_begin_floor + alloc_size; uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary ); while ( alloc_begin < boundary_line && boundary_line < alloc_end ) { 4b050: bc82 cmpl %d2,%d6 4b052: 6304 blss 4b058 <_Heap_Allocate_aligned_with_boundary+0xec> 4b054: b886 cmpl %d6,%d4 4b056: 62d4 bhis 4b02c <_Heap_Allocate_aligned_with_boundary+0xc0> 4b058: 2d4b fff0 movel %a3,%fp@(-16) boundary_line = _Heap_Align_down( alloc_end, boundary ); } } /* Ensure that the we have a valid new block at the beginning */ if ( alloc_begin >= alloc_begin_floor ) { 4b05c: b3c2 cmpal %d2,%a1 4b05e: 621e bhis 4b07e <_Heap_Allocate_aligned_with_boundary+0x112> uintptr_t const alloc_block_begin = (uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size ); uintptr_t const free_size = alloc_block_begin - block_begin; 4b060: 2802 movel %d2,%d4 4b062: 327c fff8 moveaw #-8,%a1 4b066: 93c8 subal %a0,%a1 4b068: d3c2 addal %d2,%a1 4b06a: 4c47 4003 remul %d7,%d3,%d4 4b06e: 93c3 subal %d3,%a1 if ( free_size >= min_block_size || free_size == 0 ) { 4b070: b3ee fff0 cmpal %fp@(-16),%a1 4b074: 6404 bccs 4b07a <_Heap_Allocate_aligned_with_boundary+0x10e> 4b076: 4a89 tstl %a1 4b078: 6604 bnes 4b07e <_Heap_Allocate_aligned_with_boundary+0x112> boundary ); } } if ( alloc_begin != 0 ) { 4b07a: 4a82 tstl %d2 4b07c: 6610 bnes 4b08e <_Heap_Allocate_aligned_with_boundary+0x122><== ALWAYS TAKEN break; } block = block->next; 4b07e: 2068 0008 moveal %a0@(8),%a0 if ( alignment == 0 ) { alignment = page_size; } } while ( block != free_list_tail ) { 4b082: b5c8 cmpal %a0,%a2 4b084: 6600 ff38 bnew 4afbe <_Heap_Allocate_aligned_with_boundary+0x52> 4b088: 260d movel %a5,%d3 4b08a: 4282 clrl %d2 4b08c: 6018 bras 4b0a6 <_Heap_Allocate_aligned_with_boundary+0x13a> if ( alloc_begin != 0 ) { /* Statistics */ stats->searches += search_count; block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size ); 4b08e: 2f00 movel %d0,%sp@- 4b090: 260d movel %a5,%d3 block = block->next; } if ( alloc_begin != 0 ) { /* Statistics */ stats->searches += search_count; 4b092: d7aa 004c addl %d3,%a2@(76) block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size ); 4b096: 2f02 movel %d2,%sp@- 4b098: 2f08 movel %a0,%sp@- 4b09a: 2f0a movel %a2,%sp@- 4b09c: 4eb9 0004 67de jsr 467de <_Heap_Block_allocate> 4b0a2: 4fef 0010 lea %sp@(16),%sp uintptr_t alloc_size, uintptr_t alignment, uintptr_t boundary ) { Heap_Statistics *const stats = &heap->stats; 4b0a6: b6aa 0044 cmpl %a2@(68),%d3 4b0aa: 6304 blss 4b0b0 <_Heap_Allocate_aligned_with_boundary+0x144> ); } /* Statistics */ if ( stats->max_search < search_count ) { stats->max_search = search_count; 4b0ac: 2543 0044 movel %d3,%a2@(68) } return (void *) alloc_begin; 4b0b0: 2002 movel %d2,%d0 4b0b2: 6002 bras 4b0b6 <_Heap_Allocate_aligned_with_boundary+0x14a> 4b0b4: 4280 clrl %d0 } 4b0b6: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5 4b0bc: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0004f170 <_Heap_Extend>: Heap_Control *heap, void *area_begin_ptr, uintptr_t area_size, uintptr_t *amount_extended ) { 4f170: 4e56 fff4 linkw %fp,#-12 4f174: 206e 0008 moveal %fp@(8),%a0 4f178: 202e 000c movel %fp@(12),%d0 Heap_Statistics *const stats = &heap->stats; uintptr_t const area_begin = (uintptr_t) area_begin_ptr; uintptr_t const heap_area_begin = heap->area_begin; uintptr_t const heap_area_end = heap->area_end; 4f17c: 2228 001c movel %a0@(28),%d1 uintptr_t const new_heap_area_end = heap_area_end + area_size; uintptr_t extend_size = 0; Heap_Block *const last_block = heap->last_block; 4f180: 2268 0024 moveal %a0@(36),%a1 Heap_Control *heap, void *area_begin_ptr, uintptr_t area_size, uintptr_t *amount_extended ) { 4f184: 48d7 040c moveml %d2-%d3/%a2,%sp@ Heap_Statistics *const stats = &heap->stats; uintptr_t const area_begin = (uintptr_t) area_begin_ptr; uintptr_t const heap_area_begin = heap->area_begin; 4f188: b0a8 0018 cmpl %a0@(24),%d0 4f18c: 6508 bcss 4f196 <_Heap_Extend+0x26> * 5. non-contiguous higher address (NOT SUPPORTED) * * As noted, this code only supports (4). */ if ( area_begin >= heap_area_begin && area_begin < heap_area_end ) { 4f18e: b280 cmpl %d0,%d1 4f190: 6304 blss 4f196 <_Heap_Extend+0x26> 4f192: 7001 moveq #1,%d0 4f194: 606c bras 4f202 <_Heap_Extend+0x92> return HEAP_EXTEND_ERROR; /* case 3 */ } else if ( area_begin != heap_area_end ) { 4f196: b280 cmpl %d0,%d1 4f198: 6704 beqs 4f19e <_Heap_Extend+0x2e> 4f19a: 7002 moveq #2,%d0 4f19c: 6064 bras 4f202 <_Heap_Extend+0x92> { Heap_Statistics *const stats = &heap->stats; uintptr_t const area_begin = (uintptr_t) area_begin_ptr; uintptr_t const heap_area_begin = heap->area_begin; uintptr_t const heap_area_end = heap->area_end; uintptr_t const new_heap_area_end = heap_area_end + area_size; 4f19e: 2200 movel %d0,%d1 4f1a0: d2ae 0010 addl %fp@(16),%d1 * block and free it. */ heap->area_end = new_heap_area_end; extend_size = new_heap_area_end 4f1a4: 70f8 moveq #-8,%d0 4f1a6: 9089 subl %a1,%d0 4f1a8: d081 addl %d1,%d0 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 4f1aa: 2600 movel %d0,%d3 4f1ac: 4c68 3002 0010 remul %a0@(16),%d2,%d3 * Currently only case 4 should make it to this point. * The basic trick is to make the extend area look like a used * block and free it. */ heap->area_end = new_heap_area_end; 4f1b2: 2141 001c movel %d1,%a0@(28) extend_size = new_heap_area_end - (uintptr_t) last_block - HEAP_BLOCK_HEADER_SIZE; extend_size = _Heap_Align_down( extend_size, heap->page_size ); *amount_extended = extend_size; 4f1b6: 246e 0014 moveal %fp@(20),%a2 4f1ba: 9082 subl %d2,%d0 4f1bc: 2480 movel %d0,%a2@ if( extend_size >= heap->min_block_size ) { 4f1be: b0a8 0014 cmpl %a0@(20),%d0 4f1c2: 653c bcss 4f200 <_Heap_Extend+0x90> <== NEVER TAKEN uintptr_t size ) { uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED; block->size_and_flag = size | flag; 4f1c4: 7401 moveq #1,%d2 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 4f1c6: 45f1 0800 lea %a1@(00000000,%d0:l),%a2 uintptr_t size ) { uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED; block->size_and_flag = size | flag; 4f1ca: c4a9 0004 andl %a1@(4),%d2 Heap_Block *const new_last_block = _Heap_Block_at( last_block, extend_size ); _Heap_Block_set_size( last_block, extend_size ); new_last_block->size_and_flag = 4f1ce: 2228 0020 movel %a0@(32),%d1 4f1d2: 928a subl %a2,%d1 4f1d4: 8480 orl %d0,%d2 ((uintptr_t) heap->first_block - (uintptr_t) new_last_block) | HEAP_PREV_BLOCK_USED; heap->last_block = new_last_block; 4f1d6: 214a 0024 movel %a2,%a0@(36) 4f1da: 2342 0004 movel %d2,%a1@(4) if( extend_size >= heap->min_block_size ) { Heap_Block *const new_last_block = _Heap_Block_at( last_block, extend_size ); _Heap_Block_set_size( last_block, extend_size ); new_last_block->size_and_flag = 4f1de: 7401 moveq #1,%d2 4f1e0: 8481 orl %d1,%d2 4f1e2: 2542 0004 movel %d2,%a2@(4) /* Statistics */ stats->size += extend_size; ++stats->used_blocks; --stats->frees; /* Do not count subsequent call as actual free() */ _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( last_block )); 4f1e6: 4869 0008 pea %a1@(8) | HEAP_PREV_BLOCK_USED; heap->last_block = new_last_block; /* Statistics */ stats->size += extend_size; 4f1ea: d1a8 002c addl %d0,%a0@(44) ++stats->used_blocks; 4f1ee: 52a8 0040 addql #1,%a0@(64) --stats->frees; /* Do not count subsequent call as actual free() */ 4f1f2: 53a8 0050 subql #1,%a0@(80) _Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( last_block )); 4f1f6: 2f08 movel %a0,%sp@- 4f1f8: 4eb9 0004 a004 jsr 4a004 <_Heap_Free> 4f1fe: 508f addql #8,%sp 4f200: 4280 clrl %d0 } return HEAP_EXTEND_SUCCESSFUL; } 4f202: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2 4f208: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0005a6e4 <_Heap_Size_of_alloc_area>: bool _Heap_Size_of_alloc_area( Heap_Control *heap, void *alloc_begin_ptr, uintptr_t *alloc_size ) { 5a6e4: 4e56 0000 linkw %fp,#0 5a6e8: 202e 000c movel %fp@(12),%d0 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area( uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) 5a6ec: 2040 moveal %d0,%a0 5a6ee: 5188 subql #8,%a0 5a6f0: 226e 0008 moveal %fp@(8),%a1 5a6f4: 2f02 movel %d2,%sp@- 5a6f6: 2400 movel %d0,%d2 5a6f8: 4c69 2001 0010 remul %a1@(16),%d1,%d2 const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block && (uintptr_t) block <= (uintptr_t) heap->last_block; 5a6fe: 2429 0020 movel %a1@(32),%d2 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area( uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) 5a702: 91c1 subal %d1,%a0 RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap( const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block 5a704: b488 cmpl %a0,%d2 5a706: 6244 bhis 5a74c <_Heap_Size_of_alloc_area+0x68> 5a708: b1e9 0024 cmpal %a1@(36),%a0 5a70c: 53c1 sls %d1 5a70e: 49c1 extbl %d1 5a710: 4481 negl %d1 uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr; Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size ); Heap_Block *next_block = NULL; uintptr_t block_size = 0; if ( !_Heap_Is_block_in_heap( heap, block ) ) { 5a712: 4a01 tstb %d1 5a714: 6736 beqs 5a74c <_Heap_Size_of_alloc_area+0x68> <== NEVER TAKEN RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 5a716: 72fe moveq #-2,%d1 5a718: c2a8 0004 andl %a0@(4),%d1 5a71c: d1c1 addal %d1,%a0 RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap( const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block 5a71e: b488 cmpl %a0,%d2 5a720: 622a bhis 5a74c <_Heap_Size_of_alloc_area+0x68> <== NEVER TAKEN 5a722: b1e9 0024 cmpal %a1@(36),%a0 5a726: 53c1 sls %d1 5a728: 49c1 extbl %d1 5a72a: 4481 negl %d1 } block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( 5a72c: 4a01 tstb %d1 5a72e: 671c beqs 5a74c <_Heap_Size_of_alloc_area+0x68> <== NEVER TAKEN 5a730: 7201 moveq #1,%d1 5a732: c2a8 0004 andl %a0@(4),%d1 5a736: 4a01 tstb %d1 5a738: 6712 beqs 5a74c <_Heap_Size_of_alloc_area+0x68> <== NEVER TAKEN || !_Heap_Is_prev_used( next_block ) ) { return false; } *alloc_size = (uintptr_t) next_block + HEAP_BLOCK_SIZE_OFFSET - alloc_begin; 5a73a: 7204 moveq #4,%d1 5a73c: 9280 subl %d0,%d1 5a73e: 2001 movel %d1,%d0 5a740: d088 addl %a0,%d0 5a742: 226e 0010 moveal %fp@(16),%a1 5a746: 2280 movel %d0,%a1@ 5a748: 7001 moveq #1,%d0 return true; 5a74a: 6002 bras 5a74e <_Heap_Size_of_alloc_area+0x6a> 5a74c: 4200 clrb %d0 } 5a74e: 241f movel %sp@+,%d2 5a750: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00047298 <_Heap_Walk>: bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 47298: 4e56 ffd0 linkw %fp,#-48 4729c: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@ 472a0: 286e 0008 moveal %fp@(8),%a4 uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const last_block = heap->last_block; Heap_Block *block = heap->first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 472a4: 47fa 031a lea %pc@(475c0 <_Heap_Walk_print>),%a3 bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 472a8: 242e 000c movel %fp@(12),%d2 uintptr_t const page_size = heap->page_size; 472ac: 2c2c 0010 movel %a4@(16),%d6 uintptr_t const min_block_size = heap->min_block_size; 472b0: 262c 0014 movel %a4@(20),%d3 Heap_Block *const last_block = heap->last_block; 472b4: 2a2c 0024 movel %a4@(36),%d5 Heap_Block *block = heap->first_block; 472b8: 246c 0020 moveal %a4@(32),%a2 Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 472bc: 4a2e 0013 tstb %fp@(19) 472c0: 6604 bnes 472c6 <_Heap_Walk+0x2e> 472c2: 47fa ffcc lea %pc@(47290 <_Heap_Walk_print_nothing>),%a3 if ( !_System_state_Is_up( _System_state_Get() ) ) { 472c6: 7003 moveq #3,%d0 472c8: b0b9 0006 0146 cmpl 60146 <_System_state_Current>,%d0 472ce: 6600 02da bnew 475aa <_Heap_Walk+0x312> Heap_Block *const first_free_block = _Heap_Free_list_first( heap ); Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; (*printer)( 472d2: 2f2c 000c movel %a4@(12),%sp@- 472d6: 2f2c 0008 movel %a4@(8),%sp@- 472da: 2f05 movel %d5,%sp@- 472dc: 2f0a movel %a2,%sp@- 472de: 2f2c 001c movel %a4@(28),%sp@- 472e2: 2f2c 0018 movel %a4@(24),%sp@- 472e6: 2f03 movel %d3,%sp@- 472e8: 2f06 movel %d6,%sp@- 472ea: 4879 0005 c2fc pea 5c2fc 472f0: 42a7 clrl %sp@- 472f2: 2f02 movel %d2,%sp@- 472f4: 4e93 jsr %a3@ heap->area_begin, heap->area_end, first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { 472f6: 4fef 002c lea %sp@(44),%sp 472fa: 4a86 tstl %d6 472fc: 6608 bnes 47306 <_Heap_Walk+0x6e> (*printer)( source, true, "page size is zero\n" ); 472fe: 4879 0005 c38d pea 5c38d 47304: 607e bras 47384 <_Heap_Walk+0xec> return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { 47306: 7003 moveq #3,%d0 47308: c086 andl %d6,%d0 4730a: 670c beqs 47318 <_Heap_Walk+0x80> (*printer)( 4730c: 2f06 movel %d6,%sp@- 4730e: 4879 0005 c3a0 pea 5c3a0 47314: 6000 0268 braw 4757e <_Heap_Walk+0x2e6> ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { 47318: 2203 movel %d3,%d1 4731a: 4c46 1000 remul %d6,%d0,%d1 4731e: 4a80 tstl %d0 47320: 670c beqs 4732e <_Heap_Walk+0x96> (*printer)( 47322: 2f03 movel %d3,%sp@- 47324: 4879 0005 c3be pea 5c3be 4732a: 6000 0252 braw 4757e <_Heap_Walk+0x2e6> ); return false; } if ( 4732e: 200a movel %a2,%d0 47330: 5080 addql #8,%d0 47332: 4c46 0001 remul %d6,%d1,%d0 47336: 4a81 tstl %d1 47338: 670c beqs 47346 <_Heap_Walk+0xae> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( 4733a: 2f0a movel %a2,%sp@- 4733c: 4879 0005 c3e2 pea 5c3e2 47342: 6000 023a braw 4757e <_Heap_Walk+0x2e6> ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { 47346: 7001 moveq #1,%d0 47348: c0aa 0004 andl %a2@(4),%d0 4734c: 4a00 tstb %d0 4734e: 6608 bnes 47358 <_Heap_Walk+0xc0> (*printer)( 47350: 4879 0005 c413 pea 5c413 47356: 602c bras 47384 <_Heap_Walk+0xec> ); return false; } if ( first_block->prev_size != page_size ) { 47358: 2812 movel %a2@,%d4 4735a: bc84 cmpl %d4,%d6 4735c: 670e beqs 4736c <_Heap_Walk+0xd4> (*printer)( 4735e: 2f06 movel %d6,%sp@- 47360: 2f04 movel %d4,%sp@- 47362: 4879 0005 c441 pea 5c441 47368: 6000 0150 braw 474ba <_Heap_Walk+0x222> ); return false; } if ( _Heap_Is_free( last_block ) ) { 4736c: 2045 moveal %d5,%a0 4736e: 70fe moveq #-2,%d0 47370: 7201 moveq #1,%d1 47372: c0a8 0004 andl %a0@(4),%d0 47376: c2b0 0804 andl %a0@(00000004,%d0:l),%d1 4737a: 4a01 tstb %d1 4737c: 6616 bnes 47394 <_Heap_Walk+0xfc> (*printer)( 4737e: 4879 0005 c46c pea 5c46c 47384: 4878 0001 pea 1 47388: 2f02 movel %d2,%sp@- 4738a: 4e93 jsr %a3@ 4738c: 4fef 000c lea %sp@(12),%sp 47390: 6000 01f8 braw 4758a <_Heap_Walk+0x2f2> int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; 47394: 2c2c 0010 movel %a4@(16),%d6 return &heap->free_list; } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap ) { return _Heap_Free_list_head(heap)->next; 47398: 220c movel %a4,%d1 4739a: 206c 0008 moveal %a4@(8),%a0 4739e: 606a bras 4740a <_Heap_Walk+0x172> RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap( const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block 473a0: b1ec 0020 cmpal %a4@(32),%a0 473a4: 650e bcss 473b4 <_Heap_Walk+0x11c> 473a6: b1ec 0024 cmpal %a4@(36),%a0 473aa: 53c0 sls %d0 473ac: 49c0 extbl %d0 473ae: 4480 negl %d0 const Heap_Block *const first_free_block = _Heap_Free_list_first( heap ); const Heap_Block *prev_block = free_list_tail; const Heap_Block *free_block = first_free_block; while ( free_block != free_list_tail ) { if ( !_Heap_Is_block_in_heap( heap, free_block ) ) { 473b0: 4a00 tstb %d0 473b2: 660c bnes 473c0 <_Heap_Walk+0x128> <== ALWAYS TAKEN (*printer)( 473b4: 2f08 movel %a0,%sp@- 473b6: 4879 0005 c481 pea 5c481 473bc: 6000 01c0 braw 4757e <_Heap_Walk+0x2e6> ); return false; } if ( 473c0: 4c46 7000 remul %d6,%d0,%d7 473c4: 4a80 tstl %d0 473c6: 670c beqs 473d4 <_Heap_Walk+0x13c> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( 473c8: 2f08 movel %a0,%sp@- 473ca: 4879 0005 c4a1 pea 5c4a1 473d0: 6000 01ac braw 4757e <_Heap_Walk+0x2e6> ); return false; } if ( _Heap_Is_used( free_block ) ) { 473d4: 70fe moveq #-2,%d0 473d6: 7e01 moveq #1,%d7 473d8: c0a8 0004 andl %a0@(4),%d0 473dc: ceb0 0804 andl %a0@(00000004,%d0:l),%d7 473e0: 670c beqs 473ee <_Heap_Walk+0x156> (*printer)( 473e2: 2f08 movel %a0,%sp@- 473e4: 4879 0005 c4d1 pea 5c4d1 473ea: 6000 0192 braw 4757e <_Heap_Walk+0x2e6> ); return false; } if ( free_block->prev != prev_block ) { 473ee: 2028 000c movel %a0@(12),%d0 473f2: b280 cmpl %d0,%d1 473f4: 670e beqs 47404 <_Heap_Walk+0x16c> (*printer)( 473f6: 2f00 movel %d0,%sp@- 473f8: 2f08 movel %a0,%sp@- 473fa: 4879 0005 c4ed pea 5c4ed 47400: 6000 00b8 braw 474ba <_Heap_Walk+0x222> return false; } prev_block = free_block; free_block = free_block->next; 47404: 2208 movel %a0,%d1 47406: 2068 0008 moveal %a0@(8),%a0 ); return false; } if ( 4740a: 2e08 movel %a0,%d7 4740c: 5087 addql #8,%d7 const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); const Heap_Block *const first_free_block = _Heap_Free_list_first( heap ); const Heap_Block *prev_block = free_list_tail; const Heap_Block *free_block = first_free_block; while ( free_block != free_list_tail ) { 4740e: b9c8 cmpal %a0,%a4 47410: 668e bnes 473a0 <_Heap_Walk+0x108> 47412: 6000 0190 braw 475a4 <_Heap_Walk+0x30c> - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 47416: 202a 0004 movel %a2@(4),%d0 4741a: 7cfe moveq #-2,%d6 uintptr_t const block_size = _Heap_Block_size( block ); bool const prev_used = _Heap_Is_prev_used( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); uintptr_t const next_block_begin = (uintptr_t) next_block; if ( prev_used ) { 4741c: 7201 moveq #1,%d1 4741e: cc80 andl %d0,%d6 47420: c081 andl %d1,%d0 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 47422: 4bf2 6800 lea %a2@(00000000,%d6:l),%a5 47426: 4a00 tstb %d0 47428: 6716 beqs 47440 <_Heap_Walk+0x1a8> (*printer)( 4742a: 2f06 movel %d6,%sp@- 4742c: 2f0a movel %a2,%sp@- 4742e: 4879 0005 c51f pea 5c51f 47434: 42a7 clrl %sp@- 47436: 2f02 movel %d2,%sp@- 47438: 4e93 jsr %a3@ 4743a: 4fef 0014 lea %sp@(20),%sp 4743e: 6016 bras 47456 <_Heap_Walk+0x1be> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 47440: 2f12 movel %a2@,%sp@- 47442: 2f06 movel %d6,%sp@- 47444: 2f0a movel %a2,%sp@- 47446: 4879 0005 c536 pea 5c536 4744c: 42a7 clrl %sp@- 4744e: 2f02 movel %d2,%sp@- 47450: 4e93 jsr %a3@ 47452: 4fef 0018 lea %sp@(24),%sp RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap( const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block 47456: bbec 0020 cmpal %a4@(32),%a5 4745a: 650e bcss 4746a <_Heap_Walk+0x1d2> <== NEVER TAKEN 4745c: bbec 0024 cmpal %a4@(36),%a5 47460: 53c0 sls %d0 47462: 49c0 extbl %d0 47464: 4480 negl %d0 block_size, block->prev_size ); } if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { 47466: 4a00 tstb %d0 47468: 660c bnes 47476 <_Heap_Walk+0x1de> (*printer)( 4746a: 2f0d movel %a5,%sp@- 4746c: 2f0a movel %a2,%sp@- 4746e: 4879 0005 c55b pea 5c55b 47474: 6044 bras 474ba <_Heap_Walk+0x222> ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) ) { 47476: 2206 movel %d6,%d1 47478: 4c44 1000 remul %d4,%d0,%d1 4747c: 4a80 tstl %d0 4747e: 670c beqs 4748c <_Heap_Walk+0x1f4> (*printer)( 47480: 2f06 movel %d6,%sp@- 47482: 2f0a movel %a2,%sp@- 47484: 4879 0005 c588 pea 5c588 4748a: 602e bras 474ba <_Heap_Walk+0x222> ); return false; } if ( block_size < min_block_size ) { 4748c: b686 cmpl %d6,%d3 4748e: 631c blss 474ac <_Heap_Walk+0x214> (*printer)( 47490: 2f03 movel %d3,%sp@- 47492: 2f06 movel %d6,%sp@- 47494: 2f0a movel %a2,%sp@- 47496: 4879 0005 c5b6 pea 5c5b6 4749c: 4878 0001 pea 1 474a0: 2f02 movel %d2,%sp@- 474a2: 4e93 jsr %a3@ block, block_size, min_block_size ); return false; 474a4: 4fef 0018 lea %sp@(24),%sp 474a8: 6000 00e0 braw 4758a <_Heap_Walk+0x2f2> } if ( next_block_begin <= block_begin ) { 474ac: b5cd cmpal %a5,%a2 474ae: 651a bcss 474ca <_Heap_Walk+0x232> (*printer)( 474b0: 2f0d movel %a5,%sp@- 474b2: 2f0a movel %a2,%sp@- 474b4: 4879 0005 c5e1 pea 5c5e1 474ba: 4878 0001 pea 1 474be: 2f02 movel %d2,%sp@- 474c0: 4e93 jsr %a3@ "block 0x%08x: next block 0x%08x is not a successor\n", block, next_block ); return false; 474c2: 4fef 0014 lea %sp@(20),%sp 474c6: 6000 00c2 braw 4758a <_Heap_Walk+0x2f2> } if ( !_Heap_Is_prev_used( next_block ) ) { 474ca: 7001 moveq #1,%d0 474cc: c0ad 0004 andl %a5@(4),%d0 474d0: 4a00 tstb %d0 474d2: 6600 00ce bnew 475a2 <_Heap_Walk+0x30a> block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; 474d6: 2e2a 0004 movel %a2@(4),%d7 - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 474da: 7cfe moveq #-2,%d6 return _Heap_Free_list_head(heap)->next; } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_last( Heap_Control *heap ) { return _Heap_Free_list_tail(heap)->prev; 474dc: 43f9 0005 c615 lea 5c615 ,%a1 return &heap->free_list; } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap ) { return _Heap_Free_list_head(heap)->next; 474e2: 206c 0008 moveal %a4@(8),%a0 - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 474e6: cc87 andl %d7,%d6 block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; 474e8: 2d47 fffc movel %d7,%fp@(-4) RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 474ec: 2e0a movel %a2,%d7 474ee: de86 addl %d6,%d7 return &heap->free_list; } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap ) { return _Heap_Free_list_head(heap)->next; 474f0: 2d48 fff8 movel %a0,%fp@(-8) Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( 474f4: 206a 0008 moveal %a2@(8),%a0 } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_last( Heap_Control *heap ) { return _Heap_Free_list_tail(heap)->prev; 474f8: b1ec 000c cmpal %a4@(12),%a0 474fc: 6710 beqs 4750e <_Heap_Walk+0x276> " (= first)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last)" : (block->next == free_list_tail ? " (= tail)" : "") 474fe: 43f9 0005 c61f lea 5c61f ,%a1 47504: b9c8 cmpal %a0,%a4 47506: 6706 beqs 4750e <_Heap_Walk+0x276> 47508: 43f9 0005 c24c lea 5c24c ,%a1 Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( 4750e: 202a 000c movel %a2@(12),%d0 47512: 223c 0005 c629 movel #378409,%d1 47518: b0ae fff8 cmpl %fp@(-8),%d0 4751c: 6710 beqs 4752e <_Heap_Walk+0x296> "block 0x%08x: prev 0x%08x%s, next 0x%08x%s\n", block, block->prev, block->prev == first_free_block ? " (= first)" : (block->prev == free_list_head ? " (= head)" : ""), 4751e: 223c 0005 c634 movel #378420,%d1 47524: b9c0 cmpal %d0,%a4 47526: 6706 beqs 4752e <_Heap_Walk+0x296> 47528: 223c 0005 c24c movel #377420,%d1 Heap_Block *const last_free_block = _Heap_Free_list_last( heap ); bool const prev_used = _Heap_Is_prev_used( block ); uintptr_t const block_size = _Heap_Block_size( block ); Heap_Block *const next_block = _Heap_Block_at( block, block_size ); (*printer)( 4752e: 2f09 movel %a1,%sp@- 47530: 2f08 movel %a0,%sp@- 47532: 2f01 movel %d1,%sp@- 47534: 2f00 movel %d0,%sp@- 47536: 2f0a movel %a2,%sp@- 47538: 4879 0005 c63e pea 5c63e 4753e: 42a7 clrl %sp@- 47540: 2f02 movel %d2,%sp@- 47542: 4e93 jsr %a3@ block->next == last_free_block ? " (= last)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { 47544: 4fef 0020 lea %sp@(32),%sp 47548: 2047 moveal %d7,%a0 4754a: 2010 movel %a0@,%d0 4754c: b086 cmpl %d6,%d0 4754e: 671c beqs 4756c <_Heap_Walk+0x2d4> (*printer)( 47550: 2f07 movel %d7,%sp@- 47552: 2f00 movel %d0,%sp@- 47554: 2f06 movel %d6,%sp@- 47556: 2f0a movel %a2,%sp@- 47558: 4879 0005 c66a pea 5c66a 4755e: 4878 0001 pea 1 47562: 2f02 movel %d2,%sp@- 47564: 4e93 jsr %a3@ 47566: 4fef 001c lea %sp@(28),%sp 4756a: 601e bras 4758a <_Heap_Walk+0x2f2> ); return false; } if ( !prev_used ) { 4756c: 7001 moveq #1,%d0 4756e: c0ae fffc andl %fp@(-4),%d0 47572: 4a00 tstb %d0 47574: 6618 bnes 4758e <_Heap_Walk+0x2f6> (*printer)( 47576: 2f0a movel %a2,%sp@- 47578: 4879 0005 c6a3 pea 5c6a3 4757e: 4878 0001 pea 1 47582: 2f02 movel %d2,%sp@- 47584: 4e93 jsr %a3@ 47586: 4fef 0010 lea %sp@(16),%sp 4758a: 4200 clrb %d0 4758c: 601e bras 475ac <_Heap_Walk+0x314> return &heap->free_list; } RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap ) { return _Heap_Free_list_head(heap)->next; 4758e: 206c 0008 moveal %a4@(8),%a0 47592: 6008 bras 4759c <_Heap_Walk+0x304> { const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); const Heap_Block *free_block = _Heap_Free_list_first( heap ); while ( free_block != free_list_tail ) { if ( free_block == block ) { 47594: b5c8 cmpal %a0,%a2 47596: 670a beqs 475a2 <_Heap_Walk+0x30a> return true; } free_block = free_block->next; 47598: 2068 0008 moveal %a0@(8),%a0 ) { const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); const Heap_Block *free_block = _Heap_Free_list_first( heap ); while ( free_block != free_list_tail ) { 4759c: b9c8 cmpal %a0,%a4 4759e: 66f4 bnes 47594 <_Heap_Walk+0x2fc> 475a0: 6014 bras 475b6 <_Heap_Walk+0x31e> 475a2: 244d moveal %a5,%a2 if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; } while ( block != last_block ) { 475a4: ba8a cmpl %a2,%d5 475a6: 6600 fe6e bnew 47416 <_Heap_Walk+0x17e> 475aa: 7001 moveq #1,%d0 block = next_block; } return true; } 475ac: 4cee 3cfc ffd0 moveml %fp@(-48),%d2-%d7/%a2-%a5 475b2: 4e5e unlk %fp 475b4: 4e75 rts return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( 475b6: 2f0a movel %a2,%sp@- 475b8: 4879 0005 c6d2 pea 5c6d2 475be: 60be bras 4757e <_Heap_Walk+0x2e6> =============================================================================== 000468d4 <_Internal_error_Occurred>: void _Internal_error_Occurred( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 468d4: 4e56 0000 linkw %fp,#0 468d8: 222e 000c movel %fp@(12),%d1 468dc: 2f03 movel %d3,%sp@- _Internal_errors_What_happened.the_source = the_source; _Internal_errors_What_happened.is_internal = is_internal; _Internal_errors_What_happened.the_error = the_error; _User_extensions_Fatal( the_source, is_internal, the_error ); 468de: 4283 clrl %d3 468e0: 1601 moveb %d1,%d3 void _Internal_error_Occurred( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 468e2: 2f02 movel %d2,%sp@- 468e4: 242e 0010 movel %fp@(16),%d2 _Internal_errors_What_happened.the_source = the_source; _Internal_errors_What_happened.is_internal = is_internal; _Internal_errors_What_happened.the_error = the_error; _User_extensions_Fatal( the_source, is_internal, the_error ); 468e8: 2f02 movel %d2,%sp@- void _Internal_error_Occurred( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 468ea: 202e 0008 movel %fp@(8),%d0 _Internal_errors_What_happened.the_source = the_source; _Internal_errors_What_happened.is_internal = is_internal; _Internal_errors_What_happened.the_error = the_error; _User_extensions_Fatal( the_source, is_internal, the_error ); 468ee: 2f03 movel %d3,%sp@- _System_state_Set( SYSTEM_STATE_FAILED ); _CPU_Fatal_halt( the_error ); 468f0: 263c 0000 0700 movel #1792,%d3 _Internal_errors_What_happened.the_source = the_source; _Internal_errors_What_happened.is_internal = is_internal; _Internal_errors_What_happened.the_error = the_error; _User_extensions_Fatal( the_source, is_internal, the_error ); 468f6: 2f00 movel %d0,%sp@- Internal_errors_t the_error ) { _Internal_errors_What_happened.the_source = the_source; _Internal_errors_What_happened.is_internal = is_internal; 468f8: 13c1 0005 dcc6 moveb %d1,5dcc6 <_Internal_errors_What_happened+0x4> bool is_internal, Internal_errors_t the_error ) { _Internal_errors_What_happened.the_source = the_source; 468fe: 23c0 0005 dcc2 movel %d0,5dcc2 <_Internal_errors_What_happened> _Internal_errors_What_happened.is_internal = is_internal; _Internal_errors_What_happened.the_error = the_error; 46904: 23c2 0005 dcc8 movel %d2,5dcc8 <_Internal_errors_What_happened+0x6> _User_extensions_Fatal( the_source, is_internal, the_error ); 4690a: 4eb9 0004 83fe jsr 483fe <_User_extensions_Fatal> _System_state_Set( SYSTEM_STATE_FAILED ); _CPU_Fatal_halt( the_error ); 46910: 40c0 movew %sr,%d0 46912: 8083 orl %d3,%d0 46914: 46c0 movew %d0,%sr 46916: 2002 movel %d2,%d0 <== NOT EXECUTED 46918: 223c dead beef movel #-559038737,%d1 <== NOT EXECUTED 4691e: 4ac8 halt <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _System_state_Set ( System_state_Codes state ) { _System_state_Current = state; 46920: 7005 moveq #5,%d0 46922: 4fef 000c lea %sp@(12),%sp 46926: 23c0 0005 dd9e movel %d0,5dd9e <_System_state_Current> 4692c: 60fe bras 4692c <_Internal_error_Occurred+0x58> ... =============================================================================== 00046998 <_Objects_Allocate>: */ Objects_Control *_Objects_Allocate( Objects_Information *information ) { 46998: 4e56 fff0 linkw %fp,#-16 4699c: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@ 469a0: 246e 0008 moveal %fp@(8),%a2 * If the application is using the optional manager stubs and * still attempts to create the object, the information block * should be all zeroed out because it is in the BSS. So let's * check that code for this manager is even present. */ if ( information->size == 0 ) 469a4: 4aaa 0014 tstl %a2@(20) 469a8: 6604 bnes 469ae <_Objects_Allocate+0x16> <== ALWAYS TAKEN 469aa: 4280 clrl %d0 <== NOT EXECUTED 469ac: 605e bras 46a0c <_Objects_Allocate+0x74> <== NOT EXECUTED /* * OK. The manager should be initialized and configured to have objects. * With any luck, it is safe to attempt to allocate an object. */ the_object = (Objects_Control *) _Chain_Get( &information->Inactive ); 469ae: 240a movel %a2,%d2 469b0: 0682 0000 001c addil #28,%d2 469b6: 47f9 0004 6164 lea 46164 <_Chain_Get>,%a3 469bc: 2f02 movel %d2,%sp@- 469be: 4e93 jsr %a3@ if ( information->auto_extend ) { 469c0: 588f addql #4,%sp 469c2: 4a2a 0010 tstb %a2@(16) 469c6: 6744 beqs 46a0c <_Objects_Allocate+0x74> /* * If the list is empty then we are out of objects and need to * extend information base. */ if ( !the_object ) { 469c8: 4a80 tstl %d0 469ca: 6612 bnes 469de <_Objects_Allocate+0x46> _Objects_Extend_information( information ); 469cc: 2f0a movel %a2,%sp@- 469ce: 4eb9 0004 6a44 jsr 46a44 <_Objects_Extend_information> the_object = (Objects_Control *) _Chain_Get( &information->Inactive ); 469d4: 2f02 movel %d2,%sp@- 469d6: 4e93 jsr %a3@ } if ( the_object ) { 469d8: 508f addql #8,%sp 469da: 4a80 tstl %d0 469dc: 672e beqs 46a0c <_Objects_Allocate+0x74> uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - 469de: 2040 moveal %d0,%a0 469e0: 4281 clrl %d1 469e2: 4283 clrl %d3 _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; information->inactive_per_block[ block ]--; 469e4: 4282 clrl %d2 } if ( the_object ) { uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - 469e6: 362a 0008 movew %a2@(8),%d3 469ea: 3228 000a movew %a0@(10),%d1 _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; information->inactive_per_block[ block ]--; 469ee: 342a 0012 movew %a2@(18),%d2 information->inactive--; 469f2: 306a 0028 moveaw %a2@(40),%a0 } if ( the_object ) { uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - 469f6: 9283 subl %d3,%d1 _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; information->inactive_per_block[ block ]--; 469f8: 4c42 1001 remul %d2,%d1,%d1 information->inactive--; 469fc: 5388 subql #1,%a0 block = (uint32_t) _Objects_Get_index( the_object->id ) - _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; information->inactive_per_block[ block ]--; 469fe: e589 lsll #2,%d1 information->inactive--; 46a00: 3548 0028 movew %a0,%a2@(40) block = (uint32_t) _Objects_Get_index( the_object->id ) - _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; information->inactive_per_block[ block ]--; 46a04: 206a 002a moveal %a2@(42),%a0 46a08: d1c1 addal %d1,%a0 46a0a: 5390 subql #1,%a0@ information->inactive--; } } return the_object; } 46a0c: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3 46a12: 4e5e unlk %fp ... =============================================================================== 00046a18 <_Objects_Close>: #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 46a18: 4280 clrl %d0 void _Objects_Close( Objects_Information *information, Objects_Control *the_object ) { 46a1a: 4e56 0000 linkw %fp,#0 46a1e: 226e 000c moveal %fp@(12),%a1 46a22: 206e 0008 moveal %fp@(8),%a0 46a26: 2f0a movel %a2,%sp@- 46a28: 2468 0018 moveal %a0@(24),%a2 46a2c: 3029 000a movew %a1@(10),%d0 46a30: 42b2 0c00 clrl %a2@(00000000,%d0:l:4) _Objects_Invalidate_Id( information, the_object ); _Objects_Namespace_remove( information, the_object ); 46a34: 2d49 000c movel %a1,%fp@(12) } 46a38: 245f moveal %sp@+,%a2 46a3a: 4e5e unlk %fp Objects_Control *the_object ) { _Objects_Invalidate_Id( information, the_object ); _Objects_Namespace_remove( information, the_object ); 46a3c: 4ef9 0004 6f38 jmp 46f38 <_Objects_Namespace_remove> ... =============================================================================== 00046d3c <_Objects_Get_information>: Objects_Information *_Objects_Get_information( Objects_APIs the_api, uint32_t the_class ) { 46d3c: 4e56 0000 linkw %fp,#0 46d40: 2f03 movel %d3,%sp@- 46d42: 262e 0008 movel %fp@(8),%d3 46d46: 2f02 movel %d2,%sp@- 46d48: 242e 000c movel %fp@(12),%d2 Objects_Information *info; int the_class_api_maximum; if ( !the_class ) 46d4c: 672e beqs 46d7c <_Objects_Get_information+0x40> /* * This call implicitly validates the_api so we do not call * _Objects_Is_api_valid above here. */ the_class_api_maximum = _Objects_API_maximum_class( the_api ); 46d4e: 2f03 movel %d3,%sp@- 46d50: 4eb9 0004 b230 jsr 4b230 <_Objects_API_maximum_class> if ( the_class_api_maximum == 0 ) 46d56: 588f addql #4,%sp 46d58: 4a80 tstl %d0 46d5a: 6720 beqs 46d7c <_Objects_Get_information+0x40> return NULL; if ( the_class > (uint32_t) the_class_api_maximum ) 46d5c: b082 cmpl %d2,%d0 46d5e: 651c bcss 46d7c <_Objects_Get_information+0x40> return NULL; if ( !_Objects_Information_table[ the_api ] ) 46d60: 41f9 0005 dbd4 lea 5dbd4 <_Objects_Information_table>,%a0 46d66: 2070 3c00 moveal %a0@(00000000,%d3:l:4),%a0 46d6a: 4a88 tstl %a0 46d6c: 670e beqs 46d7c <_Objects_Get_information+0x40> <== NEVER TAKEN return NULL; info = _Objects_Information_table[ the_api ][ the_class ]; 46d6e: 2030 2c00 movel %a0@(00000000,%d2:l:4),%d0 if ( !info ) 46d72: 670a beqs 46d7e <_Objects_Get_information+0x42> <== NEVER TAKEN * In a multprocessing configuration, we may access remote objects. * Thus we may have 0 local instances and still have a valid object * pointer. */ #if !defined(RTEMS_MULTIPROCESSING) if ( info->maximum == 0 ) 46d74: 2040 moveal %d0,%a0 46d76: 4a68 000e tstw %a0@(14) 46d7a: 6602 bnes 46d7e <_Objects_Get_information+0x42> 46d7c: 4280 clrl %d0 return NULL; #endif return info; } 46d7e: 242e fff8 movel %fp@(-8),%d2 46d82: 262e fffc movel %fp@(-4),%d3 46d86: 4e5e unlk %fp ... =============================================================================== 00053eec <_Objects_Get_no_protection>: /* * You can't just extract the index portion or you can get tricked * by a value between 1 and maximum. */ index = id - information->minimum_id + 1; 53eec: 7001 moveq #1,%d0 if ( information->maximum >= index ) { 53eee: 4281 clrl %d1 Objects_Control *_Objects_Get_no_protection( Objects_Information *information, Objects_Id id, Objects_Locations *location ) { 53ef0: 4e56 0000 linkw %fp,#0 53ef4: 206e 0008 moveal %fp@(8),%a0 /* * You can't just extract the index portion or you can get tricked * by a value between 1 and maximum. */ index = id - information->minimum_id + 1; 53ef8: 90a8 0006 subl %a0@(6),%d0 53efc: d0ae 000c addl %fp@(12),%d0 if ( information->maximum >= index ) { 53f00: 3228 000e movew %a0@(14),%d1 Objects_Control *_Objects_Get_no_protection( Objects_Information *information, Objects_Id id, Objects_Locations *location ) { 53f04: 226e 0010 moveal %fp@(16),%a1 * You can't just extract the index portion or you can get tricked * by a value between 1 and maximum. */ index = id - information->minimum_id + 1; if ( information->maximum >= index ) { 53f08: b081 cmpl %d1,%d0 53f0a: 620e bhis 53f1a <_Objects_Get_no_protection+0x2e> if ( (the_object = information->local_table[ index ]) != NULL ) { 53f0c: 2068 0018 moveal %a0@(24),%a0 53f10: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0 53f14: 6704 beqs 53f1a <_Objects_Get_no_protection+0x2e><== NEVER TAKEN *location = OBJECTS_LOCAL; 53f16: 4291 clrl %a1@ return the_object; 53f18: 6006 bras 53f20 <_Objects_Get_no_protection+0x34> /* * This isn't supported or required yet for Global objects so * if it isn't local, we don't find it. */ *location = OBJECTS_ERROR; 53f1a: 7001 moveq #1,%d0 53f1c: 2280 movel %d0,%a1@ 53f1e: 4280 clrl %d0 return NULL; } 53f20: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00047c6c <_Objects_Id_to_name>: */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { 47c6c: 4e56 fffc linkw %fp,#-4 47c70: 222e 0008 movel %fp@(8),%d1 47c74: 2f02 movel %d2,%sp@- /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; 47c76: 4a81 tstl %d1 47c78: 660a bnes 47c84 <_Objects_Id_to_name+0x18> 47c7a: 2079 0005 f0fe moveal 5f0fe <_Thread_Executing>,%a0 47c80: 2228 0008 movel %a0@(8),%d1 */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 47c84: 7418 moveq #24,%d2 47c86: 2001 movel %d1,%d0 47c88: e4a8 lsrl %d2,%d0 47c8a: 143c 0007 moveb #7,%d2 47c8e: c082 andl %d2,%d0 */ RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid( uint32_t the_api ) { if ( !the_api || the_api > OBJECTS_APIS_LAST ) 47c90: 143c 0003 moveb #3,%d2 47c94: 2040 moveal %d0,%a0 47c96: 5388 subql #1,%a0 47c98: b488 cmpl %a0,%d2 47c9a: 6538 bcss 47cd4 <_Objects_Id_to_name+0x68> 47c9c: 6040 bras 47cde <_Objects_Id_to_name+0x72> if ( !_Objects_Information_table[ the_api ] ) return OBJECTS_INVALID_ID; the_class = _Objects_Get_class( tmpId ); information = _Objects_Information_table[ the_api ][ the_class ]; 47c9e: 2001 movel %d1,%d0 47ca0: 741b moveq #27,%d2 47ca2: e4a8 lsrl %d2,%d0 47ca4: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0 if ( !information ) 47ca8: 672a beqs 47cd4 <_Objects_Id_to_name+0x68> <== NEVER TAKEN #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) return OBJECTS_INVALID_ID; #endif the_object = _Objects_Get( information, tmpId, &ignored_location ); 47caa: 486e fffc pea %fp@(-4) 47cae: 2f01 movel %d1,%sp@- 47cb0: 2f00 movel %d0,%sp@- 47cb2: 4eb9 0004 7c0c jsr 47c0c <_Objects_Get> if ( !the_object ) 47cb8: 4fef 000c lea %sp@(12),%sp 47cbc: 4a80 tstl %d0 47cbe: 6714 beqs 47cd4 <_Objects_Id_to_name+0x68> return OBJECTS_INVALID_ID; *name = the_object->name; 47cc0: 206e 000c moveal %fp@(12),%a0 47cc4: 2240 moveal %d0,%a1 47cc6: 20a9 000c movel %a1@(12),%a0@ _Thread_Enable_dispatch(); 47cca: 4eb9 0004 84de jsr 484de <_Thread_Enable_dispatch> 47cd0: 4280 clrl %d0 return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; 47cd2: 6002 bras 47cd6 <_Objects_Id_to_name+0x6a> 47cd4: 7003 moveq #3,%d0 } 47cd6: 242e fff8 movel %fp@(-8),%d2 47cda: 4e5e unlk %fp 47cdc: 4e75 rts the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; if ( !_Objects_Information_table[ the_api ] ) 47cde: 41f9 0005 effc lea 5effc <_Objects_Information_table>,%a0 47ce4: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0 47ce8: 4a88 tstl %a0 47cea: 66b2 bnes 47c9e <_Objects_Id_to_name+0x32> 47cec: 60e6 bras 47cd4 <_Objects_Id_to_name+0x68> ... =============================================================================== 00046e44 <_Objects_Initialize_information>: information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 46e44: 41f9 0005 dbd4 lea 5dbd4 <_Objects_Information_table>,%a0 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 46e4a: 4e56 fff0 linkw %fp,#-16 46e4e: 202e 000c movel %fp@(12),%d0 information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 46e52: 2270 0c00 moveal %a0@(00000000,%d0:l:4),%a1 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 46e56: 48d7 003c moveml %d2-%d5,%sp@ 46e5a: 222e 0014 movel %fp@(20),%d1 46e5e: 4285 clrl %d5 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 46e60: 2601 movel %d1,%d3 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 46e62: 206e 0008 moveal %fp@(8),%a0 information->the_class = the_class; information->size = size; information->local_table = 0; information->inactive_per_block = 0; information->object_blocks = 0; information->inactive = 0; 46e66: 4242 clrw %d2 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 46e68: 3a2e 001a movew %fp@(26),%d5 46e6c: 282e 0010 movel %fp@(16),%d4 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 46e70: d683 addl %d3,%d3 46e72: 9783 subxl %d3,%d3 46e74: 4483 negl %d3 information->the_class = the_class; information->size = size; information->local_table = 0; information->inactive_per_block = 0; information->object_blocks = 0; information->inactive = 0; 46e76: 3142 0028 movew %d2,%a0@(40) /* * Set the maximum value to 0. It will be updated when objects are * added to the inactive set from _Objects_Extend_information() */ information->maximum = 0; 46e7a: 3142 000e movew %d2,%a0@(14) , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 46e7e: 242e 0020 movel %fp@(32),%d2 #if defined(RTEMS_MULTIPROCESSING) uint32_t index; #endif information->the_api = the_api; information->the_class = the_class; 46e82: 3144 0004 movew %d4,%a0@(4) _Objects_Information_table[ the_api ][ the_class ] = information; /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = 46e86: 1143 0010 moveb %d3,%a0@(16) uint32_t index; #endif information->the_api = the_api; information->the_class = the_class; information->size = size; 46e8a: 2145 0014 movel %d5,%a0@(20) information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 46e8e: 2388 4c00 movel %a0,%a1@(00000000,%d4:l:4) /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 46e92: 0881 001f bclr #31,%d1 uint32_t maximum_per_allocation; #if defined(RTEMS_MULTIPROCESSING) uint32_t index; #endif information->the_api = the_api; 46e96: 2080 movel %d0,%a0@ information->the_class = the_class; information->size = size; information->local_table = 0; 46e98: 42a8 0018 clrl %a0@(24) information->inactive_per_block = 0; 46e9c: 42a8 002a clrl %a0@(42) information->object_blocks = 0; 46ea0: 42a8 002e clrl %a0@(46) maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; /* * Unlimited and maximum of zero is illogical. */ if ( information->auto_extend && maximum_per_allocation == 0) { 46ea4: 4a03 tstb %d3 46ea6: 6714 beqs 46ebc <_Objects_Initialize_information+0x78> 46ea8: 4a81 tstl %d1 46eaa: 6610 bnes 46ebc <_Objects_Initialize_information+0x78> _Internal_error_Occurred( 46eac: 4878 0014 pea 14 46eb0: 4878 0001 pea 1 46eb4: 42a7 clrl %sp@- 46eb6: 4eb9 0004 68d4 jsr 468d4 <_Internal_error_Occurred> /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; information->minimum_id = 46ebc: 7a18 moveq #24,%d5 46ebe: 4a81 tstl %d1 46ec0: 56c3 sne %d3 46ec2: eba8 lsll %d5,%d0 46ec4: 1a3c 001b moveb #27,%d5 46ec8: 49c3 extbl %d3 46eca: 4483 negl %d3 information->allocation_size = maximum_per_allocation; /* * Provide a null local table entry for the case of any empty table. */ information->local_table = &null_local_table; 46ecc: 43f9 0005 d3c4 lea 5d3c4 ,%a1 /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; information->minimum_id = 46ed2: ebac lsll %d5,%d4 46ed4: 08c0 0010 bset #16,%d0 /* * Calculate the maximum name length */ name_length = maximum_name_length; if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) ) 46ed8: 1a3c 0003 moveb #3,%d5 /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; information->minimum_id = 46edc: 8084 orl %d4,%d0 /* * Calculate the maximum name length */ name_length = maximum_name_length; if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) ) 46ede: ca82 andl %d2,%d5 } /* * The allocation unit is the maximum value */ information->allocation_size = maximum_per_allocation; 46ee0: 3141 0012 movew %d1,%a0@(18) /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; information->minimum_id = 46ee4: 8083 orl %d3,%d0 information->allocation_size = maximum_per_allocation; /* * Provide a null local table entry for the case of any empty table. */ information->local_table = &null_local_table; 46ee6: 2149 0018 movel %a1,%a0@(24) /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; information->minimum_id = 46eea: 2140 0006 movel %d0,%a0@(6) /* * Calculate the maximum name length */ name_length = maximum_name_length; if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) ) 46eee: 4a85 tstl %d5 46ef0: 6604 bnes 46ef6 <_Objects_Initialize_information+0xb2><== NEVER TAKEN 46ef2: 2002 movel %d2,%d0 46ef4: 6008 bras 46efe <_Objects_Initialize_information+0xba> name_length = (name_length + OBJECTS_NAME_ALIGNMENT) & 46ef6: 2002 movel %d2,%d0 <== NOT EXECUTED 46ef8: 5880 addql #4,%d0 <== NOT EXECUTED 46efa: 74fc moveq #-4,%d2 <== NOT EXECUTED 46efc: c082 andl %d2,%d0 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 46efe: 43e8 0020 lea %a0@(32),%a1 46f02: 2149 001c movel %a1,%a0@(28) the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 46f06: 43e8 001c lea %a0@(28),%a1 ~(OBJECTS_NAME_ALIGNMENT-1); information->name_length = name_length; 46f0a: 3140 0032 movew %d0,%a0@(50) RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 46f0e: 42a8 0020 clrl %a0@(32) the_chain->last = _Chain_Head(the_chain); 46f12: 2149 0024 movel %a1,%a0@(36) _Chain_Initialize_empty( &information->Inactive ); /* * Initialize objects .. if there are any */ if ( maximum_per_allocation ) { 46f16: 4a81 tstl %d1 46f18: 6712 beqs 46f2c <_Objects_Initialize_information+0xe8> /* * Always have the maximum size available so the current performance * figures are create are met. If the user moves past the maximum * number then a performance hit is taken. */ _Objects_Extend_information( information ); 46f1a: 2d48 0008 movel %a0,%fp@(8) _Chain_Initialize_empty( &information->global_table[ index ] ); } else information->global_table = NULL; #endif } 46f1e: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5 46f24: 4e5e unlk %fp /* * Always have the maximum size available so the current performance * figures are create are met. If the user moves past the maximum * number then a performance hit is taken. */ _Objects_Extend_information( information ); 46f26: 4ef9 0004 6a44 jmp 46a44 <_Objects_Extend_information> _Chain_Initialize_empty( &information->global_table[ index ] ); } else information->global_table = NULL; #endif } 46f2c: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5 46f32: 4e5e unlk %fp ... =============================================================================== 00048ae8 <_Objects_Set_name>: { size_t length; const char *s; s = name; length = strnlen( name, information->name_length ); 48ae8: 4280 clrl %d0 bool _Objects_Set_name( Objects_Information *information, Objects_Control *the_object, const char *name ) { 48aea: 4e56 fff0 linkw %fp,#-16 48aee: 206e 0008 moveal %fp@(8),%a0 size_t length; const char *s; s = name; length = strnlen( name, information->name_length ); 48af2: 3028 0032 movew %a0@(50),%d0 bool _Objects_Set_name( Objects_Information *information, Objects_Control *the_object, const char *name ) { 48af6: 48d7 041c moveml %d2-%d4/%a2,%sp@ 48afa: 246e 0010 moveal %fp@(16),%a2 size_t length; const char *s; s = name; length = strnlen( name, information->name_length ); 48afe: 2f00 movel %d0,%sp@- 48b00: 2f0a movel %a2,%sp@- 48b02: 4eb9 0005 0064 jsr 50064 d[length] = '\0'; the_object->name.name_p = d; } else #endif { the_object->name.name_u32 = _Objects_Build_name( 48b08: 508f addql #8,%sp 48b0a: 7201 moveq #1,%d1 48b0c: 1812 moveb %a2@,%d4 48b0e: b280 cmpl %d0,%d1 48b10: 644a bccs 48b5c <_Objects_Set_name+0x74> 48b12: 7602 moveq #2,%d3 48b14: 142a 0001 moveb %a2@(1),%d2 48b18: 49c2 extbl %d2 48b1a: 4842 swap %d2 48b1c: 4242 clrw %d2 48b1e: b680 cmpl %d0,%d3 48b20: 643e bccs 48b60 <_Objects_Set_name+0x78> 48b22: 163c 0003 moveb #3,%d3 48b26: 122a 0002 moveb %a2@(2),%d1 48b2a: 49c1 extbl %d1 48b2c: e189 lsll #8,%d1 48b2e: b680 cmpl %d0,%d3 48b30: 6506 bcss 48b38 <_Objects_Set_name+0x50> 48b32: 163c 0020 moveb #32,%d3 48b36: 6006 bras 48b3e <_Objects_Set_name+0x56> 48b38: 162a 0003 moveb %a2@(3),%d3 48b3c: 49c3 extbl %d3 48b3e: 7018 moveq #24,%d0 48b40: e1ac lsll %d0,%d4 48b42: 206e 000c moveal %fp@(12),%a0 48b46: 8484 orl %d4,%d2 ); } return true; } 48b48: 7001 moveq #1,%d0 d[length] = '\0'; the_object->name.name_p = d; } else #endif { the_object->name.name_u32 = _Objects_Build_name( 48b4a: 8481 orl %d1,%d2 48b4c: 8483 orl %d3,%d2 48b4e: 2142 000c movel %d2,%a0@(12) ); } return true; } 48b52: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 48b58: 4e5e unlk %fp 48b5a: 4e75 rts d[length] = '\0'; the_object->name.name_p = d; } else #endif { the_object->name.name_u32 = _Objects_Build_name( 48b5c: 7420 moveq #32,%d2 48b5e: 4842 swap %d2 48b60: 223c 0000 2000 movel #8192,%d1 48b66: 7620 moveq #32,%d3 48b68: 60d4 bras 48b3e <_Objects_Set_name+0x56> ... =============================================================================== 0004aab2 <_RTEMS_tasks_Post_switch_extension>: */ void _RTEMS_tasks_Post_switch_extension( Thread_Control *executing ) { 4aab2: 4e56 ffec linkw %fp,#-20 4aab6: 206e 0008 moveal %fp@(8),%a0 4aaba: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@ RTEMS_API_Control *api; ASR_Information *asr; rtems_signal_set signal_set; Modes_Control prev_mode; api = executing->API_Extensions[ THREAD_API_RTEMS ]; 4aabe: 2468 0108 moveal %a0@(264),%a2 if ( !api ) 4aac2: 4a8a tstl %a2 4aac4: 6754 beqs 4ab1a <_RTEMS_tasks_Post_switch_extension+0x68><== NEVER TAKEN * Signal Processing */ asr = &api->Signal; _ISR_Disable( level ); 4aac6: 203c 0000 0700 movel #1792,%d0 4aacc: 40c1 movew %sr,%d1 4aace: 8081 orl %d1,%d0 4aad0: 46c0 movew %d0,%sr signal_set = asr->signals_posted; 4aad2: 262a 0012 movel %a2@(18),%d3 asr->signals_posted = 0; 4aad6: 42aa 0012 clrl %a2@(18) _ISR_Enable( level ); 4aada: 46c1 movew %d1,%sr if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */ 4aadc: 4a83 tstl %d3 4aade: 673a beqs 4ab1a <_RTEMS_tasks_Post_switch_extension+0x68><== NEVER TAKEN return; asr->nest_level += 1; 4aae0: 52aa 001a addql #1,%a2@(26) rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4aae4: 240e movel %fp,%d2 4aae6: 5982 subql #4,%d2 4aae8: 47f9 0004 cc14 lea 4cc14 ,%a3 4aaee: 2f02 movel %d2,%sp@- 4aaf0: 2f3c 0000 ffff movel #65535,%sp@- 4aaf6: 2f2a 000e movel %a2@(14),%sp@- 4aafa: 4e93 jsr %a3@ (*asr->handler)( signal_set ); 4aafc: 2f03 movel %d3,%sp@- 4aafe: 206a 000a moveal %a2@(10),%a0 4ab02: 4e90 jsr %a0@ asr->nest_level -= 1; 4ab04: 53aa 001a subql #1,%a2@(26) rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4ab08: 2f02 movel %d2,%sp@- 4ab0a: 2f3c 0000 ffff movel #65535,%sp@- 4ab10: 2f2e fffc movel %fp@(-4),%sp@- 4ab14: 4e93 jsr %a3@ 4ab16: 4fef 001c lea %sp@(28),%sp } 4ab1a: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3 4ab20: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00057e74 <_Region_Process_queue>: */ void _Region_Process_queue( Region_Control *the_region ) { 57e74: 4e56 ffe4 linkw %fp,#-28 57e78: 2039 0007 6278 movel 76278 <_Thread_Dispatch_disable_level>,%d0 57e7e: 5280 addql #1,%d0 57e80: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@ 57e84: 266e 0008 moveal %fp@(8),%a3 57e88: 23c0 0007 6278 movel %d0,76278 <_Thread_Dispatch_disable_level> * NOTE: Be sure to disable dispatching before unlocking the mutex * since we do not want to open a window where a context * switch could occur. */ _Thread_Disable_dispatch(); _RTEMS_Unlock_allocator(); 57e8e: 2f39 0007 632a movel 7632a <_RTEMS_Allocator_Mutex>,%sp@- /* * NOTE: The following loop is O(n) where n is the number of * threads whose memory request is satisfied. */ for ( ; ; ) { the_thread = _Thread_queue_First( &the_region->Wait_queue ); 57e94: 240b movel %a3,%d2 RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment ( Region_Control *the_region, uintptr_t size ) { return _Heap_Allocate( &the_region->Memory, size ); 57e96: 280b movel %a3,%d4 57e98: 0682 0000 0010 addil #16,%d2 57e9e: 0684 0000 0068 addil #104,%d4 57ea4: 4bf9 0005 31ac lea 531ac <_Heap_Allocate_aligned_with_boundary>,%a5 if ( the_segment == NULL ) break; *(void **)the_thread->Wait.return_argument = the_segment; the_region->number_of_used_blocks += 1; _Thread_queue_Extract( &the_region->Wait_queue, the_thread ); 57eaa: 49f9 0005 856c lea 5856c <_Thread_queue_Extract>,%a4 * NOTE: Be sure to disable dispatching before unlocking the mutex * since we do not want to open a window where a context * switch could occur. */ _Thread_Disable_dispatch(); _RTEMS_Unlock_allocator(); 57eb0: 4eb9 0005 27dc jsr 527dc <_API_Mutex_Unlock> 57eb6: 588f addql #4,%sp /* * NOTE: The following loop is O(n) where n is the number of * threads whose memory request is satisfied. */ for ( ; ; ) { the_thread = _Thread_queue_First( &the_region->Wait_queue ); 57eb8: 263c 0005 8670 movel #362096,%d3 57ebe: 2f02 movel %d2,%sp@- 57ec0: 2043 moveal %d3,%a0 57ec2: 4e90 jsr %a0@ if ( the_thread == NULL ) 57ec4: 588f addql #4,%sp /* * NOTE: The following loop is O(n) where n is the number of * threads whose memory request is satisfied. */ for ( ; ; ) { the_thread = _Thread_queue_First( &the_region->Wait_queue ); 57ec6: 2440 moveal %d0,%a2 if ( the_thread == NULL ) 57ec8: 4a80 tstl %d0 57eca: 672c beqs 57ef8 <_Region_Process_queue+0x84> 57ecc: 42a7 clrl %sp@- 57ece: 42a7 clrl %sp@- 57ed0: 2f2a 0024 movel %a2@(36),%sp@- 57ed4: 2f04 movel %d4,%sp@- 57ed6: 4e95 jsr %a5@ the_segment = (void **) _Region_Allocate_segment( the_region, the_thread->Wait.count ); if ( the_segment == NULL ) 57ed8: 4fef 0010 lea %sp@(16),%sp 57edc: 4a80 tstl %d0 57ede: 6718 beqs 57ef8 <_Region_Process_queue+0x84> break; *(void **)the_thread->Wait.return_argument = the_segment; 57ee0: 206a 0028 moveal %a2@(40),%a0 the_region->number_of_used_blocks += 1; 57ee4: 52ab 0064 addql #1,%a3@(100) ); if ( the_segment == NULL ) break; *(void **)the_thread->Wait.return_argument = the_segment; 57ee8: 2080 movel %d0,%a0@ the_region->number_of_used_blocks += 1; _Thread_queue_Extract( &the_region->Wait_queue, the_thread ); 57eea: 2f0a movel %a2,%sp@- 57eec: 2f02 movel %d2,%sp@- 57eee: 4e94 jsr %a4@ the_thread->Wait.return_code = RTEMS_SUCCESSFUL; } 57ef0: 508f addql #8,%sp break; *(void **)the_thread->Wait.return_argument = the_segment; the_region->number_of_used_blocks += 1; _Thread_queue_Extract( &the_region->Wait_queue, the_thread ); the_thread->Wait.return_code = RTEMS_SUCCESSFUL; 57ef2: 42aa 0034 clrl %a2@(52) } 57ef6: 60c6 bras 57ebe <_Region_Process_queue+0x4a> _Thread_Enable_dispatch(); } 57ef8: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5 57efe: 4e5e unlk %fp *(void **)the_thread->Wait.return_argument = the_segment; the_region->number_of_used_blocks += 1; _Thread_queue_Extract( &the_region->Wait_queue, the_thread ); the_thread->Wait.return_code = RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 57f00: 4ef9 0005 47f6 jmp 547f6 <_Thread_Enable_dispatch> ... =============================================================================== 00046170 <_TOD_Validate>: */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { 46170: 4e56 0000 linkw %fp,#0 46174: 206e 0008 moveal %fp@(8),%a0 46178: 2f03 movel %d3,%sp@- uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); 4617a: 2039 0005 e610 movel 5e610 ,%d0 */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { 46180: 2f02 movel %d2,%sp@- uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 46182: 4a88 tstl %a0 46184: 6762 beqs 461e8 <_TOD_Validate+0x78> <== NEVER TAKEN (the_tod->ticks >= ticks_per_second) || 46186: 243c 000f 4240 movel #1000000,%d2 4618c: 4c40 2002 remul %d0,%d2,%d2 46190: b4a8 0018 cmpl %a0@(24),%d2 46194: 6352 blss 461e8 <_TOD_Validate+0x78> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || 46196: 763b moveq #59,%d3 46198: b6a8 0014 cmpl %a0@(20),%d3 4619c: 654a bcss 461e8 <_TOD_Validate+0x78> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || 4619e: b6a8 0010 cmpl %a0@(16),%d3 461a2: 6544 bcss 461e8 <_TOD_Validate+0x78> (the_tod->hour >= TOD_HOURS_PER_DAY) || 461a4: 7017 moveq #23,%d0 461a6: b0a8 000c cmpl %a0@(12),%d0 461aa: 653c bcss 461e8 <_TOD_Validate+0x78> (the_tod->month == 0) || 461ac: 2028 0004 movel %a0@(4),%d0 uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 461b0: 6736 beqs 461e8 <_TOD_Validate+0x78> <== NEVER TAKEN 461b2: 720c moveq #12,%d1 461b4: b280 cmpl %d0,%d1 461b6: 6530 bcss 461e8 <_TOD_Validate+0x78> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || (the_tod->minute >= TOD_MINUTES_PER_HOUR) || (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || 461b8: 2410 movel %a0@,%d2 uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 461ba: 0c82 0000 07c3 cmpil #1987,%d2 461c0: 6326 blss 461e8 <_TOD_Validate+0x78> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) 461c2: 2228 0008 movel %a0@(8),%d1 uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 461c6: 6720 beqs 461e8 <_TOD_Validate+0x78> <== NEVER TAKEN (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) return false; if ( (the_tod->year % 4) == 0 ) 461c8: 163c 0003 moveb #3,%d3 461cc: 41f9 0005 d3c2 lea 5d3c2 <_TOD_Days_per_month>,%a0 461d2: c483 andl %d3,%d2 461d4: 6606 bnes 461dc <_TOD_Validate+0x6c> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; 461d6: 2030 0c34 movel %a0@(00000034,%d0:l:4),%d0 461da: 6004 bras 461e0 <_TOD_Validate+0x70> else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; 461dc: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0 * false - if the the_tod is invalid * * NOTE: This routine only works for leap-years through 2099. */ bool _TOD_Validate( 461e0: b081 cmpl %d1,%d0 461e2: 54c0 scc %d0 461e4: 4480 negl %d0 461e6: 6002 bras 461ea <_TOD_Validate+0x7a> 461e8: 4200 clrb %d0 if ( the_tod->day > days_in_month ) return false; return true; } 461ea: 241f movel %sp@+,%d2 461ec: 261f movel %sp@+,%d3 461ee: 4e5e unlk %fp ... =============================================================================== 00047138 <_Thread_Change_priority>: void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 47138: 4e56 fff0 linkw %fp,#-16 4713c: 48d7 041c moveml %d2-%d4/%a2,%sp@ 47140: 246e 0008 moveal %fp@(8),%a2 /* * Set a transient state for the thread so it is pulled off the Ready chains. * This will prevent it from being scheduled no matter what happens in an * ISR. */ _Thread_Set_transient( the_thread ); 47144: 2f0a movel %a2,%sp@- void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 47146: 262e 000c movel %fp@(12),%d3 */ /* * Save original state */ original_state = the_thread->current_state; 4714a: 242a 0010 movel %a2@(16),%d2 void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 4714e: 182e 0013 moveb %fp@(19),%d4 /* * Set a transient state for the thread so it is pulled off the Ready chains. * This will prevent it from being scheduled no matter what happens in an * ISR. */ _Thread_Set_transient( the_thread ); 47152: 4eb9 0004 7f20 jsr 47f20 <_Thread_Set_transient> /* * Do not bother recomputing all the priority related information if * we are not REALLY changing priority. */ if ( the_thread->current_priority != new_priority ) 47158: 588f addql #4,%sp 4715a: b6aa 0014 cmpl %a2@(20),%d3 4715e: 670c beqs 4716c <_Thread_Change_priority+0x34> _Thread_Set_priority( the_thread, new_priority ); 47160: 2f03 movel %d3,%sp@- 47162: 2f0a movel %a2,%sp@- 47164: 4eb9 0004 7dc8 jsr 47dc8 <_Thread_Set_priority> 4716a: 508f addql #8,%sp _ISR_Disable( level ); 4716c: 223c 0000 0700 movel #1792,%d1 47172: 40c0 movew %sr,%d0 47174: 8280 orl %d0,%d1 47176: 46c1 movew %d1,%sr 47178: 7604 moveq #4,%d3 /* * If the thread has more than STATES_TRANSIENT set, then it is blocked, * If it is blocked on a thread queue, then we need to requeue it. */ state = the_thread->current_state; 4717a: 222a 0010 movel %a2@(16),%d1 4717e: c483 andl %d3,%d2 if ( state != STATES_TRANSIENT ) { 47180: b681 cmpl %d1,%d3 47182: 6730 beqs 471b4 <_Thread_Change_priority+0x7c> /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) 47184: 4a82 tstl %d2 47186: 6608 bnes 47190 <_Thread_Change_priority+0x58> <== NEVER TAKEN the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); 47188: 74fb moveq #-5,%d2 4718a: c481 andl %d1,%d2 4718c: 2542 0010 movel %d2,%a2@(16) _ISR_Enable( level ); 47190: 46c0 movew %d0,%sr if ( _States_Is_waiting_on_thread_queue( state ) ) { 47192: 0281 0003 bee0 andil #245472,%d1 47198: 6700 00d2 beqw 4726c <_Thread_Change_priority+0x134> _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); 4719c: 2d4a 000c movel %a2,%fp@(12) 471a0: 2d6a 0044 0008 movel %a2@(68),%fp@(8) if ( !_Thread_Is_executing_also_the_heir() && _Thread_Executing->is_preemptible ) _Context_Switch_necessary = true; _ISR_Enable( level ); } 471a6: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 471ac: 4e5e unlk %fp /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); _ISR_Enable( level ); if ( _States_Is_waiting_on_thread_queue( state ) ) { _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); 471ae: 4ef9 0004 7d2c jmp 47d2c <_Thread_queue_Requeue> } return; } /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) { 471b4: 4a82 tstl %d2 471b6: 6650 bnes 47208 <_Thread_Change_priority+0xd0> <== NEVER TAKEN RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map ( Priority_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 471b8: 226a 008e moveal %a2@(142),%a1 471bc: 322a 0094 movew %a2@(148),%d1 471c0: 3411 movew %a1@,%d2 471c2: 206a 008a moveal %a2@(138),%a0 471c6: 8282 orl %d2,%d1 * Interrupts are STILL disabled. * We now know the thread will be in the READY state when we remove * the TRANSIENT state. So we have to place it on the appropriate * Ready Queue with interrupts off. */ the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); 471c8: 42aa 0010 clrl %a2@(16) 471cc: 3281 movew %d1,%a1@ _Priority_Major_bit_map |= the_priority_map->ready_major; 471ce: 3239 0005 dccc movew 5dccc <_Priority_Major_bit_map>,%d1 471d4: 342a 0092 movew %a2@(146),%d2 471d8: 8282 orl %d2,%d1 471da: 33c1 0005 dccc movew %d1,5dccc <_Priority_Major_bit_map> _Priority_Add_to_bit_map( &the_thread->Priority_map ); if ( prepend_it ) 471e0: 4a04 tstb %d4 471e2: 6710 beqs 471f4 <_Thread_Change_priority+0xbc> ) { Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; 471e4: 2250 moveal %a0@,%a1 Chain_Node *the_node ) { Chain_Node *before_node; the_node->previous = after_node; 471e6: 2548 0004 movel %a0,%a2@(4) before_node = after_node->next; after_node->next = the_node; 471ea: 208a movel %a2,%a0@ the_node->next = before_node; before_node->previous = the_node; 471ec: 234a 0004 movel %a2,%a1@(4) Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; after_node->next = the_node; the_node->next = before_node; 471f0: 2489 movel %a1,%a2@ 471f2: 6014 bras 47208 <_Thread_Change_priority+0xd0> Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 471f4: 2608 movel %a0,%d3 471f6: 5883 addql #4,%d3 471f8: 2483 movel %d3,%a2@ old_last_node = the_chain->last; 471fa: 2268 0008 moveal %a0@(8),%a1 the_chain->last = the_node; 471fe: 214a 0008 movel %a2,%a0@(8) old_last_node->next = the_node; the_node->previous = old_last_node; 47202: 2549 0004 movel %a1,%a2@(4) Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 47206: 228a movel %a2,%a1@ _Chain_Prepend_unprotected( the_thread->ready, &the_thread->Object.Node ); else _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node ); } _ISR_Flash( level ); 47208: 223c 0000 0700 movel #1792,%d1 4720e: 46c0 movew %d0,%sr 47210: 8280 orl %d0,%d1 47212: 46c1 movew %d1,%sr RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_highest( void ) { Priority_Bit_map_control minor; Priority_Bit_map_control major; _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); 47214: 3239 0005 dccc movew 5dccc <_Priority_Major_bit_map>,%d1 4721a: 4841 swap %d1 4721c: 04c1 ff1 %d1 _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 4721e: 4282 clrl %d2 47220: 41f9 0005 dd38 lea 5dd38 <_Priority_Bit_map>,%a0 47226: 3401 movew %d1,%d2 47228: 3230 2a00 movew %a0@(00000000,%d2:l:2),%d1 4722c: 4841 swap %d1 4722e: 04c1 ff1 %d1 * ready thread. */ RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void ) { _Thread_Heir = (Thread_Control *) 47230: 4283 clrl %d3 47232: e98a lsll #4,%d2 47234: 3601 movew %d1,%d3 47236: 2279 0005 dbc8 moveal 5dbc8 <_Thread_Ready_chain>,%a1 4723c: 2202 movel %d2,%d1 4723e: d283 addl %d3,%d1 47240: 2401 movel %d1,%d2 47242: e58a lsll #2,%d2 47244: e989 lsll #4,%d1 * is also the heir thread, and false otherwise. */ RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void ) { return ( _Thread_Executing == _Thread_Heir ); 47246: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 * ready thread. */ RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void ) { _Thread_Heir = (Thread_Control *) 4724c: 93c2 subal %d2,%a1 4724e: 2231 1800 movel %a1@(00000000,%d1:l),%d1 47252: 23c1 0005 dcaa movel %d1,5dcaa <_Thread_Heir> * We altered the set of thread priorities. So let's figure out * who is the heir and if we need to switch to them. */ _Thread_Calculate_heir(); if ( !_Thread_Is_executing_also_the_heir() && 47258: b288 cmpl %a0,%d1 4725a: 670e beqs 4726a <_Thread_Change_priority+0x132> _Thread_Executing->is_preemptible ) 4725c: 4a28 0075 tstb %a0@(117) 47260: 6708 beqs 4726a <_Thread_Change_priority+0x132> _Context_Switch_necessary = true; 47262: 7201 moveq #1,%d1 47264: 13c1 0005 dce6 moveb %d1,5dce6 <_Context_Switch_necessary> _ISR_Enable( level ); 4726a: 46c0 movew %d0,%sr } 4726c: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 47272: 4e5e unlk %fp ... =============================================================================== 00047278 <_Thread_Clear_state>: void _Thread_Clear_state( Thread_Control *the_thread, States_Control state ) { 47278: 4e56 ffec linkw %fp,#-20 4727c: 206e 0008 moveal %fp@(8),%a0 47280: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@ ISR_Level level; States_Control current_state; _ISR_Disable( level ); 47284: 263c 0000 0700 movel #1792,%d3 4728a: 2203 movel %d3,%d1 void _Thread_Clear_state( Thread_Control *the_thread, States_Control state ) { 4728c: 202e 000c movel %fp@(12),%d0 ISR_Level level; States_Control current_state; _ISR_Disable( level ); 47290: 40c2 movew %sr,%d2 47292: 8282 orl %d2,%d1 47294: 46c1 movew %d1,%sr current_state = the_thread->current_state; 47296: 2228 0010 movel %a0@(16),%d1 if ( current_state & state ) { 4729a: 2800 movel %d0,%d4 4729c: c881 andl %d1,%d4 4729e: 6778 beqs 47318 <_Thread_Clear_state+0xa0> RTEMS_INLINE_ROUTINE States_Control _States_Clear ( States_Control states_to_clear, States_Control current_state ) { return (current_state & ~states_to_clear); 472a0: 4680 notl %d0 472a2: c081 andl %d1,%d0 current_state = 472a4: 2140 0010 movel %d0,%a0@(16) the_thread->current_state = _States_Clear( state, current_state ); if ( _States_Is_ready( current_state ) ) { 472a8: 666e bnes 47318 <_Thread_Clear_state+0xa0> RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map ( Priority_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 472aa: 2668 008e moveal %a0@(142),%a3 472ae: 3028 0094 movew %a0@(148),%d0 472b2: 3213 movew %a3@,%d1 _Priority_Add_to_bit_map( &the_thread->Priority_map ); _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node); 472b4: 2268 008a moveal %a0@(138),%a1 Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 472b8: 2809 movel %a1,%d4 472ba: 5884 addql #4,%d4 472bc: 8081 orl %d1,%d0 472be: 2084 movel %d4,%a0@ old_last_node = the_chain->last; 472c0: 2469 0008 moveal %a1@(8),%a2 472c4: 3680 movew %d0,%a3@ the_chain->last = the_node; 472c6: 2348 0008 movel %a0,%a1@(8) _Priority_Major_bit_map |= the_priority_map->ready_major; 472ca: 3039 0005 dccc movew 5dccc <_Priority_Major_bit_map>,%d0 472d0: 3228 0092 movew %a0@(146),%d1 old_last_node->next = the_node; the_node->previous = old_last_node; 472d4: 214a 0004 movel %a2,%a0@(4) 472d8: 8081 orl %d1,%d0 Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 472da: 2488 movel %a0,%a2@ 472dc: 33c0 0005 dccc movew %d0,5dccc <_Priority_Major_bit_map> _ISR_Flash( level ); 472e2: 2003 movel %d3,%d0 472e4: 46c2 movew %d2,%sr 472e6: 8082 orl %d2,%d0 472e8: 46c0 movew %d0,%sr * a context switch. * Pseudo-ISR case: * Even if the thread isn't preemptible, if the new heir is * a pseudo-ISR system task, we need to do a context switch. */ if ( the_thread->current_priority < _Thread_Heir->current_priority ) { 472ea: 2028 0014 movel %a0@(20),%d0 472ee: 2279 0005 dcaa moveal 5dcaa <_Thread_Heir>,%a1 472f4: b0a9 0014 cmpl %a1@(20),%d0 472f8: 641e bccs 47318 <_Thread_Clear_state+0xa0> _Thread_Heir = the_thread; 472fa: 23c8 0005 dcaa movel %a0,5dcaa <_Thread_Heir> if ( _Thread_Executing->is_preemptible || 47300: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 47306: 4a28 0075 tstb %a0@(117) 4730a: 6604 bnes 47310 <_Thread_Clear_state+0x98> 4730c: 4a80 tstl %d0 4730e: 6608 bnes 47318 <_Thread_Clear_state+0xa0> <== ALWAYS TAKEN the_thread->current_priority == 0 ) _Context_Switch_necessary = true; 47310: 7001 moveq #1,%d0 47312: 13c0 0005 dce6 moveb %d0,5dce6 <_Context_Switch_necessary> } } } _ISR_Enable( level ); 47318: 46c2 movew %d2,%sr } 4731a: 4cd7 0c1c moveml %sp@,%d2-%d4/%a2-%a3 4731e: 4e5e unlk %fp ... =============================================================================== 000474a4 <_Thread_Delay_ended>: void _Thread_Delay_ended( Objects_Id id, void *ignored __attribute__((unused)) ) { 474a4: 4e56 fffc linkw %fp,#-4 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 474a8: 486e fffc pea %fp@(-4) 474ac: 2f2e 0008 movel %fp@(8),%sp@- 474b0: 4eb9 0004 7658 jsr 47658 <_Thread_Get> switch ( location ) { 474b6: 508f addql #8,%sp 474b8: 4aae fffc tstl %fp@(-4) 474bc: 661e bnes 474dc <_Thread_Delay_ended+0x38> <== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_Clear_state( 474be: 2f3c 1000 0018 movel #268435480,%sp@- 474c4: 2f00 movel %d0,%sp@- 474c6: 4eb9 0004 7278 jsr 47278 <_Thread_Clear_state> 474cc: 508f addql #8,%sp 474ce: 2039 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d0 474d4: 5380 subql #1,%d0 474d6: 23c0 0005 dc1c movel %d0,5dc1c <_Thread_Dispatch_disable_level> | STATES_INTERRUPTIBLE_BY_SIGNAL ); _Thread_Unnest_dispatch(); break; } } 474dc: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 000474e0 <_Thread_Dispatch>: Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); 474e0: 307c 0700 moveaw #1792,%a0 474e4: 2208 movel %a0,%d1 * dispatch thread * no dispatch thread */ void _Thread_Dispatch( void ) { 474e6: 4e56 ffc8 linkw %fp,#-56 474ea: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@ Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; 474ee: 2479 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a2 _ISR_Disable( level ); 474f4: 40c0 movew %sr,%d0 474f6: 8280 orl %d0,%d1 474f8: 46c1 movew %d1,%sr _ISR_Enable( level ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 474fa: 260e movel %fp,%d3 _Timestamp_Subtract( 474fc: 240e movel %fp,%d2 _ISR_Enable( level ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 474fe: 5183 subql #8,%d3 _Timestamp_Subtract( 47500: 0682 ffff fff0 addil #-16,%d2 47506: 2e3c 0004 8294 movel #295572,%d7 &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); 4750c: 2c3c 0004 825c movel #295516,%d6 if ( _Thread_libc_reent ) { executing->libc_reent = *_Thread_libc_reent; *_Thread_libc_reent = heir->libc_reent; } _User_extensions_Thread_switch( executing, heir ); 47512: 2a3c 0004 850c movel #296204,%d5 #if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) if ( (executing->fp_context != NULL) && !_Thread_Is_allocated_fp( executing ) ) { if ( _Thread_Allocated_fp != NULL ) _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); _Context_Restore_fp( &executing->fp_context ); 47518: 4bf9 0004 897c lea 4897c <_CPU_Context_restore_fp>,%a5 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) #if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) if ( (executing->fp_context != NULL) && !_Thread_Is_allocated_fp( executing ) ) { if ( _Thread_Allocated_fp != NULL ) _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); 4751e: 49f9 0004 895a lea 4895a <_CPU_Context_save_fp>,%a4 if ( executing->fp_context != NULL ) _Context_Save_fp( &executing->fp_context ); #endif #endif _Context_Switch( &executing->Registers, &heir->Registers ); 47524: 283c 0004 8824 movel #296996,%d4 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Context_Switch_necessary == true ) { 4752a: 6000 00d0 braw 475fc <_Thread_Dispatch+0x11c> heir = _Thread_Heir; _Thread_Dispatch_disable_level = 1; 4752e: 7201 moveq #1,%d1 47530: 23c1 0005 dc1c movel %d1,5dc1c <_Thread_Dispatch_disable_level> ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Context_Switch_necessary == true ) { heir = _Thread_Heir; 47536: 2679 0005 dcaa moveal 5dcaa <_Thread_Heir>,%a3 _Thread_Dispatch_disable_level = 1; _Context_Switch_necessary = false; 4753c: 4201 clrb %d1 _Thread_Executing = heir; 4753e: 23cb 0005 dcd6 movel %a3,5dcd6 <_Thread_Executing> executing = _Thread_Executing; _ISR_Disable( level ); while ( _Context_Switch_necessary == true ) { heir = _Thread_Heir; _Thread_Dispatch_disable_level = 1; _Context_Switch_necessary = false; 47544: 13c1 0005 dce6 moveb %d1,5dce6 <_Context_Switch_necessary> _Thread_Executing = heir; #if __RTEMS_ADA__ executing->rtems_ada_self = rtems_ada_self; rtems_ada_self = heir->rtems_ada_self; #endif if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE ) 4754a: 7201 moveq #1,%d1 4754c: b2ab 007a cmpl %a3@(122),%d1 47550: 660a bnes 4755c <_Thread_Dispatch+0x7c> heir->cpu_time_budget = _Thread_Ticks_per_timeslice; 47552: 41f9 0005 dbcc lea 5dbcc <_Thread_Ticks_per_timeslice>,%a0 47558: 2750 0076 movel %a0@,%a3@(118) _ISR_Enable( level ); 4755c: 46c0 movew %d0,%sr #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 4755e: 2f03 movel %d3,%sp@- 47560: 4eb9 0004 af00 jsr 4af00 <_TOD_Get_uptime> _Timestamp_Subtract( 47566: 2047 moveal %d7,%a0 47568: 2f02 movel %d2,%sp@- 4756a: 2f03 movel %d3,%sp@- 4756c: 4879 0005 dcde pea 5dcde <_Thread_Time_of_last_context_switch> 47572: 4e90 jsr %a0@ &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); 47574: 2046 moveal %d6,%a0 47576: 2f02 movel %d2,%sp@- 47578: 486a 0082 pea %a2@(130) 4757c: 4e90 jsr %a0@ #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 4757e: 2079 0005 dca6 moveal 5dca6 <_Thread_libc_reent>,%a0 47584: 4fef 0018 lea %sp@(24),%sp &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); _Thread_Time_of_last_context_switch = uptime; 47588: 202e fff8 movel %fp@(-8),%d0 4758c: 222e fffc movel %fp@(-4),%d1 47590: 23c0 0005 dcde movel %d0,5dcde <_Thread_Time_of_last_context_switch> 47596: 23c1 0005 dce2 movel %d1,5dce2 <_Thread_Time_of_last_context_switch+0x4> #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 4759c: 4a88 tstl %a0 4759e: 6708 beqs 475a8 <_Thread_Dispatch+0xc8> <== NEVER TAKEN executing->libc_reent = *_Thread_libc_reent; 475a0: 2550 0104 movel %a0@,%a2@(260) *_Thread_libc_reent = heir->libc_reent; 475a4: 20ab 0104 movel %a3@(260),%a0@ } _User_extensions_Thread_switch( executing, heir ); 475a8: 2f0b movel %a3,%sp@- 475aa: 2045 moveal %d5,%a0 475ac: 2f0a movel %a2,%sp@- 475ae: 4e90 jsr %a0@ if ( executing->fp_context != NULL ) _Context_Save_fp( &executing->fp_context ); #endif #endif _Context_Switch( &executing->Registers, &heir->Registers ); 475b0: 486b 00cc pea %a3@(204) 475b4: 2044 moveal %d4,%a0 475b6: 486a 00cc pea %a2@(204) 475ba: 4e90 jsr %a0@ #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) #if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) if ( (executing->fp_context != NULL) && 475bc: 4fef 0010 lea %sp@(16),%sp 475c0: 4aaa 0100 tstl %a2@(256) 475c4: 6724 beqs 475ea <_Thread_Dispatch+0x10a> #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Allocated_fp ); 475c6: 2079 0005 dca2 moveal 5dca2 <_Thread_Allocated_fp>,%a0 475cc: b1ca cmpal %a2,%a0 475ce: 671a beqs 475ea <_Thread_Dispatch+0x10a> !_Thread_Is_allocated_fp( executing ) ) { if ( _Thread_Allocated_fp != NULL ) 475d0: 4a88 tstl %a0 475d2: 6708 beqs 475dc <_Thread_Dispatch+0xfc> _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); 475d4: 4868 0100 pea %a0@(256) 475d8: 4e94 jsr %a4@ 475da: 588f addql #4,%sp _Context_Restore_fp( &executing->fp_context ); 475dc: 486a 0100 pea %a2@(256) 475e0: 4e95 jsr %a5@ _Thread_Allocated_fp = executing; 475e2: 588f addql #4,%sp 475e4: 23ca 0005 dca2 movel %a2,5dca2 <_Thread_Allocated_fp> if ( executing->fp_context != NULL ) _Context_Restore_fp( &executing->fp_context ); #endif #endif executing = _Thread_Executing; 475ea: 2479 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a2 _ISR_Disable( level ); 475f0: 223c 0000 0700 movel #1792,%d1 475f6: 40c0 movew %sr,%d0 475f8: 8280 orl %d0,%d1 475fa: 46c1 movew %d1,%sr Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Context_Switch_necessary == true ) { 475fc: 1239 0005 dce6 moveb 5dce6 <_Context_Switch_necessary>,%d1 47602: 6600 ff2a bnew 4752e <_Thread_Dispatch+0x4e> executing = _Thread_Executing; _ISR_Disable( level ); } _Thread_Dispatch_disable_level = 0; 47606: 42b9 0005 dc1c clrl 5dc1c <_Thread_Dispatch_disable_level> _ISR_Enable( level ); 4760c: 46c0 movew %d0,%sr if ( _Thread_Do_post_task_switch_extension || 4760e: 4ab9 0005 dcbe tstl 5dcbe <_Thread_Do_post_task_switch_extension> 47614: 6606 bnes 4761c <_Thread_Dispatch+0x13c> <== NEVER TAKEN executing->do_post_task_switch_extension ) { 47616: 4a2a 0074 tstb %a2@(116) 4761a: 670c beqs 47628 <_Thread_Dispatch+0x148> executing->do_post_task_switch_extension = false; 4761c: 4200 clrb %d0 4761e: 1540 0074 moveb %d0,%a2@(116) _API_extensions_Run_postswitch(); 47622: 4eb9 0004 5fba jsr 45fba <_API_extensions_Run_postswitch> } } 47628: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5 4762e: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0004cef0 <_Thread_Evaluate_mode>: * * XXX */ bool _Thread_Evaluate_mode( void ) { 4cef0: 4e56 0000 linkw %fp,#0 Thread_Control *executing; executing = _Thread_Executing; 4cef4: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 if ( !_States_Is_ready( executing->current_state ) || 4cefa: 4aa8 0010 tstl %a0@(16) 4cefe: 660e bnes 4cf0e <_Thread_Evaluate_mode+0x1e> <== NEVER TAKEN 4cf00: b1f9 0005 dcaa cmpal 5dcaa <_Thread_Heir>,%a0 4cf06: 6710 beqs 4cf18 <_Thread_Evaluate_mode+0x28> ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) { 4cf08: 4a28 0075 tstb %a0@(117) 4cf0c: 670a beqs 4cf18 <_Thread_Evaluate_mode+0x28> <== NEVER TAKEN _Context_Switch_necessary = true; 4cf0e: 7001 moveq #1,%d0 4cf10: 13c0 0005 dce6 moveb %d0,5dce6 <_Context_Switch_necessary> return true; 4cf16: 6002 bras 4cf1a <_Thread_Evaluate_mode+0x2a> 4cf18: 4200 clrb %d0 } return false; } 4cf1a: 4e5e unlk %fp ... =============================================================================== 0004cf20 <_Thread_Handler>: * * Output parameters: NONE */ void _Thread_Handler( void ) { 4cf20: 4e56 0000 linkw %fp,#0 4cf24: 2f0a movel %a2,%sp@- #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) static char doneConstructors; char doneCons; #endif executing = _Thread_Executing; 4cf26: 2479 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a2 * * Output parameters: NONE */ void _Thread_Handler( void ) { 4cf2c: 2f02 movel %d2,%sp@- /* * have to put level into a register for those cpu's that use * inline asm here */ level = executing->Start.isr_level; 4cf2e: 222a 00b4 movel %a2@(180),%d1 _ISR_Set_level(level); 4cf32: 40c0 movew %sr,%d0 4cf34: e189 lsll #8,%d1 4cf36: 0280 0000 f8ff andil #63743,%d0 4cf3c: 8081 orl %d1,%d0 4cf3e: 46c0 movew %d0,%sr #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; doneConstructors = 1; 4cf40: 7001 moveq #1,%d0 level = executing->Start.isr_level; _ISR_Set_level(level); #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; 4cf42: 1439 0005 d3d4 moveb 5d3d4 ,%d2 doneConstructors = 1; 4cf48: 13c0 0005 d3d4 moveb %d0,5d3d4 #endif #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) #if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) if ( (executing->fp_context != NULL) && 4cf4e: 4aaa 0100 tstl %a2@(256) 4cf52: 6720 beqs 4cf74 <_Thread_Handler+0x54> #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Allocated_fp ); 4cf54: 2079 0005 dca2 moveal 5dca2 <_Thread_Allocated_fp>,%a0 4cf5a: b1ca cmpal %a2,%a0 4cf5c: 6716 beqs 4cf74 <_Thread_Handler+0x54> !_Thread_Is_allocated_fp( executing ) ) { if ( _Thread_Allocated_fp != NULL ) 4cf5e: 4a88 tstl %a0 4cf60: 670c beqs 4cf6e <_Thread_Handler+0x4e> _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); 4cf62: 4868 0100 pea %a0@(256) 4cf66: 4eb9 0004 895a jsr 4895a <_CPU_Context_save_fp> 4cf6c: 588f addql #4,%sp _Thread_Allocated_fp = executing; 4cf6e: 23ca 0005 dca2 movel %a2,5dca2 <_Thread_Allocated_fp> /* * Take care that 'begin' extensions get to complete before * 'switch' extensions can run. This means must keep dispatch * disabled until all 'begin' extensions complete. */ _User_extensions_Thread_begin( executing ); 4cf74: 2f0a movel %a2,%sp@- 4cf76: 4eb9 0004 838c jsr 4838c <_User_extensions_Thread_begin> /* * At this point, the dispatch disable level BETTER be 1. */ _Thread_Enable_dispatch(); 4cf7c: 4eb9 0004 7632 jsr 47632 <_Thread_Enable_dispatch> /* * _init could be a weak symbol and we SHOULD test it but it isn't * in any configuration I know of and it generates a warning on every * RTEMS target configuration. --joel (12 May 2007) */ if (!doneCons) /* && (volatile void *)_init) */ { 4cf82: 588f addql #4,%sp 4cf84: 4a02 tstb %d2 4cf86: 6606 bnes 4cf8e <_Thread_Handler+0x6e> INIT_NAME (); 4cf88: 4eb9 0005 a7ec jsr 5a7ec <_init> } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { 4cf8e: 4aaa 009e tstl %a2@(158) 4cf92: 6610 bnes 4cfa4 <_Thread_Handler+0x84> <== NEVER TAKEN executing->Wait.return_argument = (*(Thread_Entry_numeric) executing->Start.entry_point)( 4cf94: 2f2a 00a6 movel %a2@(166),%sp@- 4cf98: 206a 009a moveal %a2@(154),%a0 4cf9c: 4e90 jsr %a0@ INIT_NAME (); } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { executing->Wait.return_argument = 4cf9e: 588f addql #4,%sp 4cfa0: 2540 0028 movel %d0,%a2@(40) * was placed in return_argument. This assumed that if it returned * anything (which is not supporting in all APIs), then it would be * able to fit in a (void *). */ _User_extensions_Thread_exitted( executing ); 4cfa4: 2f0a movel %a2,%sp@- 4cfa6: 4eb9 0004 83c4 jsr 483c4 <_User_extensions_Thread_exitted> _Internal_error_Occurred( 4cfac: 4878 0006 pea 6 4cfb0: 4878 0001 pea 1 4cfb4: 42a7 clrl %sp@- 4cfb6: 4eb9 0004 68d4 jsr 468d4 <_Internal_error_Occurred> =============================================================================== 000476e4 <_Thread_Initialize>: Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { 476e4: 4e56 ffec linkw %fp,#-20 476e8: 48d7 043c moveml %d2-%d5/%a2,%sp@ 476ec: 242e 0014 movel %fp@(20),%d2 476f0: 246e 000c moveal %fp@(12),%a2 /* * Allocate and Initialize the stack for this thread. */ #if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API) actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size ); 476f4: 2f02 movel %d2,%sp@- Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { 476f6: 262e 0018 movel %fp@(24),%d3 /* * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; 476fa: 42aa 0108 clrl %a2@(264) Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { 476fe: 282e 001c movel %fp@(28),%d4 /* * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; 47702: 42aa 010c clrl %a2@(268) Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { 47706: 1a2e 0023 moveb %fp@(35),%d5 /* * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; 4770a: 42aa 0110 clrl %a2@(272) extensions_area = NULL; the_thread->libc_reent = NULL; 4770e: 42aa 0104 clrl %a2@(260) /* * Allocate and Initialize the stack for this thread. */ #if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API) actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size ); 47712: 2f0a movel %a2,%sp@- 47714: 4eb9 0004 7f9c jsr 47f9c <_Thread_Stack_Allocate> if ( !actual_stack_size || actual_stack_size < stack_size ) 4771a: 508f addql #8,%sp 4771c: 4a80 tstl %d0 4771e: 6700 015a beqw 4787a <_Thread_Initialize+0x196> 47722: b480 cmpl %d0,%d2 47724: 6200 0154 bhiw 4787a <_Thread_Initialize+0x196> void *starting_address, size_t size ) { the_stack->area = starting_address; the_stack->size = size; 47728: 2540 00bc movel %d0,%a2@(188) Stack_Control *the_stack, void *starting_address, size_t size ) { the_stack->area = starting_address; 4772c: 256a 00c8 00c0 movel %a2@(200),%a2@(192) /* * Allocate the floating point area for this thread */ #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( is_fp ) { 47732: 4a03 tstb %d3 47734: 6604 bnes 4773a <_Thread_Initialize+0x56> 47736: 4283 clrl %d3 47738: 6016 bras 47750 <_Thread_Initialize+0x6c> fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); 4773a: 4878 001c pea 1c 4773e: 4eb9 0004 878c jsr 4878c <_Workspace_Allocate> if ( !fp_area ) 47744: 588f addql #4,%sp /* * Allocate the floating point area for this thread */ #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( is_fp ) { fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); 47746: 2600 movel %d0,%d3 if ( !fp_area ) 47748: 6606 bnes 47750 <_Thread_Initialize+0x6c> 4774a: 4282 clrl %d2 4774c: 6000 00c6 braw 47814 <_Thread_Initialize+0x130> #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { 47750: 2039 0005 dcba movel 5dcba <_Thread_Maximum_extensions>,%d0 fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); if ( !fp_area ) goto failed; fp_area = _Context_Fp_start( fp_area, 0 ); } the_thread->fp_context = fp_area; 47756: 2543 0100 movel %d3,%a2@(256) the_thread->Start.fp_context = fp_area; 4775a: 2543 00c4 movel %d3,%a2@(196) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 4775e: 42aa 0050 clrl %a2@(80) the_watchdog->routine = routine; 47762: 42aa 0064 clrl %a2@(100) the_watchdog->id = id; 47766: 42aa 0068 clrl %a2@(104) the_watchdog->user_data = user_data; 4776a: 42aa 006c clrl %a2@(108) #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { 4776e: 4a80 tstl %d0 47770: 6604 bnes 47776 <_Thread_Initialize+0x92> 47772: 4282 clrl %d2 47774: 6016 bras 4778c <_Thread_Initialize+0xa8> extensions_area = _Workspace_Allocate( 47776: e588 lsll #2,%d0 47778: 2040 moveal %d0,%a0 4777a: 4868 0004 pea %a0@(4) 4777e: 4eb9 0004 878c jsr 4878c <_Workspace_Allocate> (_Thread_Maximum_extensions + 1) * sizeof( void * ) ); if ( !extensions_area ) 47784: 588f addql #4,%sp /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { extensions_area = _Workspace_Allocate( 47786: 2400 movel %d0,%d2 (_Thread_Maximum_extensions + 1) * sizeof( void * ) ); if ( !extensions_area ) 47788: 6700 008a beqw 47814 <_Thread_Initialize+0x130> goto failed; } the_thread->extensions = (void **) extensions_area; 4778c: 2542 0114 movel %d2,%a2@(276) * if they are linked to the thread. An extension user may * create the extension long after tasks have been created * so they cannot rely on the thread create user extension * call. */ if ( the_thread->extensions ) { 47790: 6718 beqs 477aa <_Thread_Initialize+0xc6> for ( i = 0; i <= _Thread_Maximum_extensions ; i++ ) 47792: 2239 0005 dcba movel 5dcba <_Thread_Maximum_extensions>,%d1 47798: 4280 clrl %d0 4779a: 600a bras 477a6 <_Thread_Initialize+0xc2> the_thread->extensions[i] = NULL; 4779c: 206a 0114 moveal %a2@(276),%a0 477a0: 42b0 0c00 clrl %a0@(00000000,%d0:l:4) * create the extension long after tasks have been created * so they cannot rely on the thread create user extension * call. */ if ( the_thread->extensions ) { for ( i = 0; i <= _Thread_Maximum_extensions ; i++ ) 477a4: 5280 addql #1,%d0 477a6: b280 cmpl %d0,%d1 477a8: 64f2 bccs 4779c <_Thread_Initialize+0xb8> #if defined(RTEMS_ITRON_API) the_thread->suspend_count = 0; #endif the_thread->real_priority = priority; the_thread->Start.initial_priority = priority; _Thread_Set_priority( the_thread, priority ); 477aa: 2f04 movel %d4,%sp@- case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: break; #endif } the_thread->Start.isr_level = isr_level; 477ac: 256e 002c 00b4 movel %fp@(44),%a2@(180) the_thread->current_state = STATES_DORMANT; 477b2: 7001 moveq #1,%d0 /* * General initialization */ the_thread->Start.is_preemptible = is_preemptible; the_thread->Start.budget_algorithm = budget_algorithm; 477b4: 256e 0024 00ac movel %fp@(36),%a2@(172) the_thread->Start.budget_callout = budget_callout; 477ba: 256e 0028 00b0 movel %fp@(40),%a2@(176) /* * General initialization */ the_thread->Start.is_preemptible = is_preemptible; 477c0: 1545 00aa moveb %d5,%a2@(170) #if defined(RTEMS_ITRON_API) the_thread->suspend_count = 0; #endif the_thread->real_priority = priority; the_thread->Start.initial_priority = priority; _Thread_Set_priority( the_thread, priority ); 477c4: 2f0a movel %a2,%sp@- #endif } the_thread->Start.isr_level = isr_level; the_thread->current_state = STATES_DORMANT; 477c6: 2540 0010 movel %d0,%a2@(16) the_thread->Wait.queue = NULL; 477ca: 42aa 0044 clrl %a2@(68) the_thread->resource_count = 0; 477ce: 42aa 001c clrl %a2@(28) #if defined(RTEMS_ITRON_API) the_thread->suspend_count = 0; #endif the_thread->real_priority = priority; 477d2: 2544 0018 movel %d4,%a2@(24) the_thread->Start.initial_priority = priority; 477d6: 2544 00b8 movel %d4,%a2@(184) _Thread_Set_priority( the_thread, priority ); 477da: 4eb9 0004 7dc8 jsr 47dc8 <_Thread_Set_priority> #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 477e0: 206e 0008 moveal %fp@(8),%a0 477e4: 4280 clrl %d0 information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; 477e6: 256e 0030 000c movel %fp@(48),%a2@(12) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 477ec: 2068 0018 moveal %a0@(24),%a0 477f0: 302a 000a movew %a2@(10),%d0 /* * Initialize the CPU usage statistics */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Set_to_zero( &the_thread->cpu_time_used ); 477f4: 42aa 0082 clrl %a2@(130) 477f8: 218a 0c00 movel %a2,%a0@(00000000,%d0:l:4) 477fc: 42aa 0086 clrl %a2@(134) * enabled when we get here. We want to be able to run the * user extensions with dispatching enabled. The Allocator * Mutex provides sufficient protection to let the user extensions * run safely. */ extension_status = _User_extensions_Thread_create( the_thread ); 47800: 2f0a movel %a2,%sp@- 47802: 4eb9 0004 8448 jsr 48448 <_User_extensions_Thread_create> if ( extension_status ) 47808: 4fef 000c lea %sp@(12),%sp 4780c: 4a00 tstb %d0 4780e: 6704 beqs 47814 <_Thread_Initialize+0x130> 47810: 7001 moveq #1,%d0 47812: 6068 bras 4787c <_Thread_Initialize+0x198> return true; failed: if ( the_thread->libc_reent ) 47814: 202a 0104 movel %a2@(260),%d0 47818: 670a beqs 47824 <_Thread_Initialize+0x140> _Workspace_Free( the_thread->libc_reent ); 4781a: 2f00 movel %d0,%sp@- 4781c: 4eb9 0004 87a8 jsr 487a8 <_Workspace_Free> 47822: 588f addql #4,%sp for ( i=0 ; i <= THREAD_API_LAST ; i++ ) if ( the_thread->API_Extensions[i] ) 47824: 202a 0108 movel %a2@(264),%d0 47828: 670a beqs 47834 <_Thread_Initialize+0x150> _Workspace_Free( the_thread->API_Extensions[i] ); 4782a: 2f00 movel %d0,%sp@- 4782c: 4eb9 0004 87a8 jsr 487a8 <_Workspace_Free> 47832: 588f addql #4,%sp failed: if ( the_thread->libc_reent ) _Workspace_Free( the_thread->libc_reent ); for ( i=0 ; i <= THREAD_API_LAST ; i++ ) if ( the_thread->API_Extensions[i] ) 47834: 202a 010c movel %a2@(268),%d0 47838: 670a beqs 47844 <_Thread_Initialize+0x160> <== ALWAYS TAKEN _Workspace_Free( the_thread->API_Extensions[i] ); 4783a: 2f00 movel %d0,%sp@- <== NOT EXECUTED 4783c: 4eb9 0004 87a8 jsr 487a8 <_Workspace_Free> <== NOT EXECUTED 47842: 588f addql #4,%sp <== NOT EXECUTED failed: if ( the_thread->libc_reent ) _Workspace_Free( the_thread->libc_reent ); for ( i=0 ; i <= THREAD_API_LAST ; i++ ) if ( the_thread->API_Extensions[i] ) 47844: 202a 0110 movel %a2@(272),%d0 47848: 670a beqs 47854 <_Thread_Initialize+0x170> <== ALWAYS TAKEN _Workspace_Free( the_thread->API_Extensions[i] ); 4784a: 2f00 movel %d0,%sp@- <== NOT EXECUTED 4784c: 4eb9 0004 87a8 jsr 487a8 <_Workspace_Free> <== NOT EXECUTED 47852: 588f addql #4,%sp <== NOT EXECUTED if ( extensions_area ) 47854: 4a82 tstl %d2 47856: 670a beqs 47862 <_Thread_Initialize+0x17e> (void) _Workspace_Free( extensions_area ); 47858: 2f02 movel %d2,%sp@- 4785a: 4eb9 0004 87a8 jsr 487a8 <_Workspace_Free> 47860: 588f addql #4,%sp #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( fp_area ) 47862: 4a83 tstl %d3 47864: 670a beqs 47870 <_Thread_Initialize+0x18c> (void) _Workspace_Free( fp_area ); 47866: 2f03 movel %d3,%sp@- 47868: 4eb9 0004 87a8 jsr 487a8 <_Workspace_Free> 4786e: 588f addql #4,%sp #endif _Thread_Stack_Free( the_thread ); 47870: 2f0a movel %a2,%sp@- 47872: 4eb9 0004 7fe8 jsr 47fe8 <_Thread_Stack_Free> return false; 47878: 588f addql #4,%sp 4787a: 4200 clrb %d0 } 4787c: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2 47882: 4e5e unlk %fp ... =============================================================================== 0004b5b8 <_Thread_Reset_timeslice>: * ready chain * select heir */ void _Thread_Reset_timeslice( void ) { 4b5b8: 4e56 fff4 linkw %fp,#-12 ISR_Level level; Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; 4b5bc: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 * ready chain * select heir */ void _Thread_Reset_timeslice( void ) { 4b5c2: 48d7 0c04 moveml %d2/%a2-%a3,%sp@ Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; ready = executing->ready; _ISR_Disable( level ); 4b5c6: 243c 0000 0700 movel #1792,%d2 4b5cc: 2202 movel %d2,%d1 ISR_Level level; Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; ready = executing->ready; 4b5ce: 2268 008a moveal %a0@(138),%a1 _ISR_Disable( level ); 4b5d2: 40c0 movew %sr,%d0 4b5d4: 8280 orl %d0,%d1 4b5d6: 46c1 movew %d1,%sr if ( _Chain_Has_only_one_node( ready ) ) { 4b5d8: 2229 0008 movel %a1@(8),%d1 4b5dc: b291 cmpl %a1@,%d1 4b5de: 6604 bnes 4b5e4 <_Thread_Reset_timeslice+0x2c> _ISR_Enable( level ); 4b5e0: 46c0 movew %d0,%sr return; 4b5e2: 6040 bras 4b624 <_Thread_Reset_timeslice+0x6c> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 4b5e4: 2450 moveal %a0@,%a2 Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4b5e6: 2209 movel %a1,%d1 4b5e8: 5881 addql #4,%d1 { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 4b5ea: 2668 0004 moveal %a0@(4),%a3 next->previous = previous; previous->next = next; 4b5ee: 268a movel %a2,%a3@ Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 4b5f0: 254b 0004 movel %a3,%a2@(4) Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4b5f4: 2081 movel %d1,%a0@ old_last_node = the_chain->last; 4b5f6: 2469 0008 moveal %a1@(8),%a2 the_chain->last = the_node; 4b5fa: 2348 0008 movel %a0,%a1@(8) old_last_node->next = the_node; the_node->previous = old_last_node; 4b5fe: 214a 0004 movel %a2,%a0@(4) Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 4b602: 2488 movel %a0,%a2@ } _Chain_Extract_unprotected( &executing->Object.Node ); _Chain_Append_unprotected( ready, &executing->Object.Node ); _ISR_Flash( level ); 4b604: 2202 movel %d2,%d1 4b606: 46c0 movew %d0,%sr 4b608: 8280 orl %d0,%d1 4b60a: 46c1 movew %d1,%sr if ( _Thread_Is_heir( executing ) ) 4b60c: b1f9 0005 dcaa cmpal 5dcaa <_Thread_Heir>,%a0 4b612: 6606 bnes 4b61a <_Thread_Reset_timeslice+0x62> <== NEVER TAKEN _Thread_Heir = (Thread_Control *) ready->first; 4b614: 23d1 0005 dcaa movel %a1@,5dcaa <_Thread_Heir> _Context_Switch_necessary = true; 4b61a: 7201 moveq #1,%d1 4b61c: 13c1 0005 dce6 moveb %d1,5dce6 <_Context_Switch_necessary> _ISR_Enable( level ); 4b622: 46c0 movew %d0,%sr } 4b624: 4cd7 0c04 moveml %sp@,%d2/%a2-%a3 4b628: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0004853c <_Thread_Restart>: Thread_Control *the_thread, void *pointer_argument, Thread_Entry_numeric_type numeric_argument ) { if ( !_States_Is_dormant( the_thread->current_state ) ) { 4853c: 7001 moveq #1,%d0 bool _Thread_Restart( Thread_Control *the_thread, void *pointer_argument, Thread_Entry_numeric_type numeric_argument ) { 4853e: 4e56 0000 linkw %fp,#0 48542: 2f0a movel %a2,%sp@- 48544: 246e 0008 moveal %fp@(8),%a2 if ( !_States_Is_dormant( the_thread->current_state ) ) { 48548: c0aa 0010 andl %a2@(16),%d0 4854c: 4a00 tstb %d0 4854e: 6704 beqs 48554 <_Thread_Restart+0x18> 48550: 4200 clrb %d0 48552: 6064 bras 485b8 <_Thread_Restart+0x7c> _Thread_Set_transient( the_thread ); 48554: 2f0a movel %a2,%sp@- 48556: 4eb9 0004 8718 jsr 48718 <_Thread_Set_transient> _Thread_Reset( the_thread, pointer_argument, numeric_argument ); 4855c: 2f2e 0010 movel %fp@(16),%sp@- 48560: 2f2e 000c movel %fp@(12),%sp@- 48564: 2f0a movel %a2,%sp@- 48566: 4eb9 0004 bdf0 jsr 4bdf0 <_Thread_Reset> _Thread_Load_environment( the_thread ); 4856c: 2f0a movel %a2,%sp@- 4856e: 4eb9 0004 ba8c jsr 4ba8c <_Thread_Load_environment> _Thread_Ready( the_thread ); 48574: 2f0a movel %a2,%sp@- 48576: 4eb9 0004 bd30 jsr 4bd30 <_Thread_Ready> _User_extensions_Thread_restart( the_thread ); 4857c: 2f0a movel %a2,%sp@- 4857e: 4eb9 0004 8cc4 jsr 48cc4 <_User_extensions_Thread_restart> if ( _Thread_Is_executing ( the_thread ) ) 48584: 4fef 001c lea %sp@(28),%sp 48588: b5f9 0005 e7ce cmpal 5e7ce <_Thread_Executing>,%a2 4858e: 6626 bnes 485b6 <_Thread_Restart+0x7a> */ RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void ) { #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( _Thread_Executing->fp_context != NULL ) 48590: 4aaa 0100 tstl %a2@(256) 48594: 670c beqs 485a2 <_Thread_Restart+0x66> _Context_Restore_fp( &_Thread_Executing->fp_context ); 48596: 486a 0100 pea %a2@(256) 4859a: 4eb9 0004 91b4 jsr 491b4 <_CPU_Context_restore_fp> 485a0: 588f addql #4,%sp #endif _CPU_Context_Restart_self( &_Thread_Executing->Registers ); 485a2: 2079 0005 e7ce moveal 5e7ce <_Thread_Executing>,%a0 485a8: 41e8 00cc lea %a0@(204),%a0 485ac: 2f08 movel %a0,%sp@- 485ae: 4eb9 0004 9072 jsr 49072 <_CPU_Context_Restart_self> 485b4: 588f addql #4,%sp <== NOT EXECUTED 485b6: 7001 moveq #1,%d0 return true; } return false; } 485b8: 246e fffc moveal %fp@(-4),%a2 485bc: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0004acb0 <_Thread_Resume>: void _Thread_Resume( Thread_Control *the_thread, bool force ) { 4acb0: 4e56 ffec linkw %fp,#-20 4acb4: 206e 0008 moveal %fp@(8),%a0 4acb8: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@ ISR_Level level; States_Control current_state; _ISR_Disable( level ); 4acbc: 243c 0000 0700 movel #1792,%d2 4acc2: 2002 movel %d2,%d0 4acc4: 40c1 movew %sr,%d1 4acc6: 8081 orl %d1,%d0 4acc8: 46c0 movew %d0,%sr _ISR_Enable( level ); return; } #endif current_state = the_thread->current_state; 4acca: 2028 0010 movel %a0@(16),%d0 if ( current_state & STATES_SUSPENDED ) { 4acce: 0800 0001 btst #1,%d0 4acd2: 6778 beqs 4ad4c <_Thread_Resume+0x9c> <== NEVER TAKEN 4acd4: 76fd moveq #-3,%d3 4acd6: c083 andl %d3,%d0 current_state = 4acd8: 2140 0010 movel %d0,%a0@(16) the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state); if ( _States_Is_ready( current_state ) ) { 4acdc: 666e bnes 4ad4c <_Thread_Resume+0x9c> RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map ( Priority_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 4acde: 2668 008e moveal %a0@(142),%a3 4ace2: 3028 0094 movew %a0@(148),%d0 4ace6: 3613 movew %a3@,%d3 _Priority_Add_to_bit_map( &the_thread->Priority_map ); _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node); 4ace8: 2268 008a moveal %a0@(138),%a1 Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4acec: 2809 movel %a1,%d4 4acee: 5884 addql #4,%d4 4acf0: 8083 orl %d3,%d0 4acf2: 2084 movel %d4,%a0@ old_last_node = the_chain->last; 4acf4: 2469 0008 moveal %a1@(8),%a2 4acf8: 3680 movew %d0,%a3@ the_chain->last = the_node; 4acfa: 2348 0008 movel %a0,%a1@(8) _Priority_Major_bit_map |= the_priority_map->ready_major; 4acfe: 3039 0006 1004 movew 61004 <_Priority_Major_bit_map>,%d0 4ad04: 3628 0092 movew %a0@(146),%d3 old_last_node->next = the_node; the_node->previous = old_last_node; 4ad08: 214a 0004 movel %a2,%a0@(4) 4ad0c: 8083 orl %d3,%d0 Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 4ad0e: 2488 movel %a0,%a2@ 4ad10: 33c0 0006 1004 movew %d0,61004 <_Priority_Major_bit_map> _ISR_Flash( level ); 4ad16: 2002 movel %d2,%d0 4ad18: 46c1 movew %d1,%sr 4ad1a: 8081 orl %d1,%d0 4ad1c: 46c0 movew %d0,%sr if ( the_thread->current_priority < _Thread_Heir->current_priority ) { 4ad1e: 2028 0014 movel %a0@(20),%d0 4ad22: 2279 0006 0fe2 moveal 60fe2 <_Thread_Heir>,%a1 4ad28: b0a9 0014 cmpl %a1@(20),%d0 4ad2c: 641e bccs 4ad4c <_Thread_Resume+0x9c> _Thread_Heir = the_thread; 4ad2e: 23c8 0006 0fe2 movel %a0,60fe2 <_Thread_Heir> if ( _Thread_Executing->is_preemptible || 4ad34: 2079 0006 100e moveal 6100e <_Thread_Executing>,%a0 4ad3a: 4a28 0075 tstb %a0@(117) 4ad3e: 6604 bnes 4ad44 <_Thread_Resume+0x94> 4ad40: 4a80 tstl %d0 4ad42: 6608 bnes 4ad4c <_Thread_Resume+0x9c> <== ALWAYS TAKEN the_thread->current_priority == 0 ) _Context_Switch_necessary = true; 4ad44: 7001 moveq #1,%d0 4ad46: 13c0 0006 101e moveb %d0,6101e <_Context_Switch_necessary> } } } _ISR_Enable( level ); 4ad4c: 46c1 movew %d1,%sr } 4ad4e: 4cd7 0c1c moveml %sp@,%d2-%d4/%a2-%a3 4ad52: 4e5e unlk %fp ... =============================================================================== 00047fe8 <_Thread_Stack_Free>: */ void _Thread_Stack_Free( Thread_Control *the_thread ) { 47fe8: 4e56 0000 linkw %fp,#0 47fec: 206e 0008 moveal %fp@(8),%a0 * Call ONLY the CPU table stack free hook, or the * the RTEMS workspace free. This is so the free * routine properly matches the allocation of the stack. */ if ( Configuration.stack_free_hook ) 47ff0: 2279 0005 c4e8 moveal 5c4e8 ,%a1 47ff6: 4a89 tstl %a1 47ff8: 670a beqs 48004 <_Thread_Stack_Free+0x1c> (*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area ); 47ffa: 2d68 00c0 0008 movel %a0@(192),%fp@(8) else _Workspace_Free( the_thread->Start.Initial_stack.area ); } 48000: 4e5e unlk %fp * the RTEMS workspace free. This is so the free * routine properly matches the allocation of the stack. */ if ( Configuration.stack_free_hook ) (*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area ); 48002: 4ed1 jmp %a1@ else _Workspace_Free( the_thread->Start.Initial_stack.area ); 48004: 2d68 00c0 0008 movel %a0@(192),%fp@(8) } 4800a: 4e5e unlk %fp */ if ( Configuration.stack_free_hook ) (*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area ); else _Workspace_Free( the_thread->Start.Initial_stack.area ); 4800c: 4ef9 0004 87a8 jmp 487a8 <_Workspace_Free> ... =============================================================================== 000481e0 <_Thread_Yield_processor>: * ready chain * select heir */ void _Thread_Yield_processor( void ) { 481e0: 4e56 fff4 linkw %fp,#-12 ISR_Level level; Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; 481e4: 2079 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a0 * ready chain * select heir */ void _Thread_Yield_processor( void ) { 481ea: 48d7 0c04 moveml %d2/%a2-%a3,%sp@ Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; ready = executing->ready; _ISR_Disable( level ); 481ee: 243c 0000 0700 movel #1792,%d2 481f4: 2002 movel %d2,%d0 ISR_Level level; Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; ready = executing->ready; 481f6: 2268 008a moveal %a0@(138),%a1 _ISR_Disable( level ); 481fa: 40c1 movew %sr,%d1 481fc: 8081 orl %d1,%d0 481fe: 46c0 movew %d0,%sr if ( !_Chain_Has_only_one_node( ready ) ) { 48200: 2029 0008 movel %a1@(8),%d0 48204: b091 cmpl %a1@,%d0 48206: 6738 beqs 48240 <_Thread_Yield_processor+0x60> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 48208: 2450 moveal %a0@,%a2 Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4820a: 2009 movel %a1,%d0 4820c: 5880 addql #4,%d0 { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 4820e: 2668 0004 moveal %a0@(4),%a3 next->previous = previous; previous->next = next; 48212: 268a movel %a2,%a3@ Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 48214: 254b 0004 movel %a3,%a2@(4) Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 48218: 2080 movel %d0,%a0@ old_last_node = the_chain->last; 4821a: 2469 0008 moveal %a1@(8),%a2 the_chain->last = the_node; 4821e: 2348 0008 movel %a0,%a1@(8) old_last_node->next = the_node; the_node->previous = old_last_node; 48222: 214a 0004 movel %a2,%a0@(4) Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 48226: 2488 movel %a0,%a2@ _Chain_Extract_unprotected( &executing->Object.Node ); _Chain_Append_unprotected( ready, &executing->Object.Node ); _ISR_Flash( level ); 48228: 2002 movel %d2,%d0 4822a: 46c1 movew %d1,%sr 4822c: 8081 orl %d1,%d0 4822e: 46c0 movew %d0,%sr if ( _Thread_Is_heir( executing ) ) 48230: b1f9 0005 dcaa cmpal 5dcaa <_Thread_Heir>,%a0 48236: 6610 bnes 48248 <_Thread_Yield_processor+0x68> <== NEVER TAKEN _Thread_Heir = (Thread_Control *) ready->first; 48238: 23d1 0005 dcaa movel %a1@,5dcaa <_Thread_Heir> 4823e: 6008 bras 48248 <_Thread_Yield_processor+0x68> _Context_Switch_necessary = true; } else if ( !_Thread_Is_heir( executing ) ) 48240: b1f9 0005 dcaa cmpal 5dcaa <_Thread_Heir>,%a0 48246: 6708 beqs 48250 <_Thread_Yield_processor+0x70> <== ALWAYS TAKEN _Context_Switch_necessary = true; 48248: 7001 moveq #1,%d0 4824a: 13c0 0005 dce6 moveb %d0,5dce6 <_Context_Switch_necessary> _ISR_Enable( level ); 48250: 46c1 movew %d1,%sr } 48252: 4cd7 0c04 moveml %sp@,%d2/%a2-%a3 48256: 4e5e unlk %fp ... =============================================================================== 000470e8 <_Thread_blocking_operation_Cancel>: /* * If the sync state is timed out, this is very likely not needed. * But better safe than sorry when it comes to critical sections. */ if ( _Watchdog_Is_active( &the_thread->Timer ) ) { 470e8: 7202 moveq #2,%d1 Thread_blocking_operation_States sync_state __attribute__((unused)), #endif Thread_Control *the_thread, ISR_Level level ) { 470ea: 4e56 0000 linkw %fp,#0 470ee: 202e 0010 movel %fp@(16),%d0 470f2: 2f0a movel %a2,%sp@- 470f4: 246e 000c moveal %fp@(12),%a2 #endif /* * The thread is not waiting on anything after this completes. */ the_thread->Wait.queue = NULL; 470f8: 42aa 0044 clrl %a2@(68) /* * If the sync state is timed out, this is very likely not needed. * But better safe than sorry when it comes to critical sections. */ if ( _Watchdog_Is_active( &the_thread->Timer ) ) { 470fc: b2aa 0050 cmpl %a2@(80),%d1 47100: 6618 bnes 4711a <_Thread_blocking_operation_Cancel+0x32> RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 47102: 123c 0003 moveb #3,%d1 47106: 2541 0050 movel %d1,%a2@(80) _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 4710a: 46c0 movew %d0,%sr (void) _Watchdog_Remove( &the_thread->Timer ); 4710c: 486a 0048 pea %a2@(72) 47110: 4eb9 0004 8660 jsr 48660 <_Watchdog_Remove> 47116: 588f addql #4,%sp 47118: 6002 bras 4711c <_Thread_blocking_operation_Cancel+0x34> } else _ISR_Enable( level ); 4711a: 46c0 movew %d0,%sr RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 4711c: 2d4a 0008 movel %a2,%fp@(8) #if defined(RTEMS_MULTIPROCESSING) if ( !_Objects_Is_local_id( the_thread->Object.id ) ) _Thread_MP_Free_proxy( the_thread ); #endif } 47120: 246e fffc moveal %fp@(-4),%a2 47124: 203c 1003 fff8 movel #268697592,%d0 4712a: 2d40 000c movel %d0,%fp@(12) 4712e: 4e5e unlk %fp 47130: 4ef9 0004 7278 jmp 47278 <_Thread_Clear_state> ... =============================================================================== 00047b3c <_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 ) { 47b3c: 4e56 ffe4 linkw %fp,#-28 47b40: 206e 000c moveal %fp@(12),%a0 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 47b44: 43e8 003c lea %a0@(60),%a1 Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 47b48: 2028 0014 movel %a0@(20),%d0 Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, ISR_Level *level_p ) { 47b4c: 48d7 0c7c moveml %d2-%d6/%a2-%a3,%sp@ _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 ]; 47b50: 2400 movel %d0,%d2 47b52: ec8a lsrl #6,%d2 47b54: 2202 movel %d2,%d1 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); 47b56: 283c 0000 0700 movel #1792,%d4 _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 ]; 47b5c: e989 lsll #4,%d1 47b5e: e58a lsll #2,%d2 Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, ISR_Level *level_p ) { 47b60: 246e 0008 moveal %fp@(8),%a2 _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 ]; 47b64: 9282 subl %d2,%d1 47b66: 47f2 1800 lea %a2@(00000000,%d1:l),%a3 47b6a: 2149 0038 movel %a1,%a0@(56) the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 47b6e: 43e8 0038 lea %a0@(56),%a1 block_state = the_thread_queue->state; 47b72: 2a2a 0038 movel %a2@(56),%d5 47b76: 2149 0040 movel %a1,%a0@(64) RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 47b7a: 42a8 003c clrl %a0@(60) if ( _Thread_queue_Is_reverse_search( priority ) ) 47b7e: 0800 0005 btst #5,%d0 47b82: 6660 bnes 47be4 <_Thread_queue_Enqueue_priority+0xa8> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 47b84: 2c0b movel %a3,%d6 47b86: 5886 addql #4,%d6 goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); 47b88: 2404 movel %d4,%d2 47b8a: 40c1 movew %sr,%d1 47b8c: 8481 orl %d1,%d2 47b8e: 46c2 movew %d2,%sr search_thread = (Thread_Control *) header->first; 47b90: 2253 moveal %a3@,%a1 47b92: 76ff moveq #-1,%d3 while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 47b94: 601e bras 47bb4 <_Thread_queue_Enqueue_priority+0x78> search_priority = search_thread->current_priority; 47b96: 2629 0014 movel %a1@(20),%d3 if ( priority <= search_priority ) 47b9a: b680 cmpl %d0,%d3 47b9c: 641a bccs 47bb8 <_Thread_queue_Enqueue_priority+0x7c> break; search_priority = search_thread->current_priority; if ( priority <= search_priority ) break; #endif _ISR_Flash( level ); 47b9e: 2404 movel %d4,%d2 47ba0: 46c1 movew %d1,%sr 47ba2: 8481 orl %d1,%d2 47ba4: 46c2 movew %d2,%sr if ( !_States_Are_set( search_thread->current_state, block_state) ) { 47ba6: 2405 movel %d5,%d2 47ba8: c4a9 0010 andl %a1@(16),%d2 47bac: 6604 bnes 47bb2 <_Thread_queue_Enqueue_priority+0x76><== ALWAYS TAKEN _ISR_Enable( level ); 47bae: 46c1 movew %d1,%sr <== NOT EXECUTED goto restart_forward_search; 47bb0: 60d6 bras 47b88 <_Thread_queue_Enqueue_priority+0x4c><== NOT EXECUTED } search_thread = (Thread_Control *)search_thread->Object.Node.next; 47bb2: 2251 moveal %a1@,%a1 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 ) ) { 47bb4: bc89 cmpl %a1,%d6 47bb6: 66de bnes 47b96 <_Thread_queue_Enqueue_priority+0x5a> 47bb8: 2401 movel %d1,%d2 } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 47bba: 7801 moveq #1,%d4 47bbc: b8aa 0030 cmpl %a2@(48),%d4 47bc0: 6600 00a4 bnew 47c66 <_Thread_queue_Enqueue_priority+0x12a> THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 47bc4: 42aa 0030 clrl %a2@(48) if ( priority == search_priority ) 47bc8: b680 cmpl %d0,%d3 47bca: 677e beqs 47c4a <_Thread_queue_Enqueue_priority+0x10e> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 47bcc: 2669 0004 moveal %a1@(4),%a3 the_node = (Chain_Node *) the_thread; the_node->next = search_node; 47bd0: 2089 movel %a1,%a0@ the_node->previous = previous_node; 47bd2: 214b 0004 movel %a3,%a0@(4) previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 47bd6: 214a 0044 movel %a2,%a0@(68) 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; 47bda: 2688 movel %a0,%a3@ search_node->previous = the_node; 47bdc: 2348 0004 movel %a0,%a1@(4) the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 47be0: 46c1 movew %d1,%sr 47be2: 6062 bras 47c46 <_Thread_queue_Enqueue_priority+0x10a> return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 47be4: 4283 clrl %d3 47be6: 1639 0005 c4c2 moveb 5c4c2 ,%d3 _ISR_Disable( level ); 47bec: 2404 movel %d4,%d2 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 47bee: 5283 addql #1,%d3 _ISR_Disable( level ); 47bf0: 40c1 movew %sr,%d1 47bf2: 8481 orl %d1,%d2 47bf4: 46c2 movew %d2,%sr search_thread = (Thread_Control *) header->last; 47bf6: 226b 0008 moveal %a3@(8),%a1 while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 47bfa: 6020 bras 47c1c <_Thread_queue_Enqueue_priority+0xe0> search_priority = search_thread->current_priority; 47bfc: 2629 0014 movel %a1@(20),%d3 if ( priority >= search_priority ) 47c00: b680 cmpl %d0,%d3 47c02: 631c blss 47c20 <_Thread_queue_Enqueue_priority+0xe4> break; search_priority = search_thread->current_priority; if ( priority >= search_priority ) break; #endif _ISR_Flash( level ); 47c04: 2404 movel %d4,%d2 47c06: 46c1 movew %d1,%sr 47c08: 8481 orl %d1,%d2 47c0a: 46c2 movew %d2,%sr if ( !_States_Are_set( search_thread->current_state, block_state) ) { 47c0c: 2405 movel %d5,%d2 47c0e: c4a9 0010 andl %a1@(16),%d2 47c12: 6604 bnes 47c18 <_Thread_queue_Enqueue_priority+0xdc> _ISR_Enable( level ); 47c14: 46c1 movew %d1,%sr goto restart_reverse_search; 47c16: 60cc bras 47be4 <_Thread_queue_Enqueue_priority+0xa8> } search_thread = (Thread_Control *) 47c18: 2269 0004 moveal %a1@(4),%a1 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 ) ) { 47c1c: b7c9 cmpal %a1,%a3 47c1e: 66dc bnes 47bfc <_Thread_queue_Enqueue_priority+0xc0> 47c20: 2401 movel %d1,%d2 } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 47c22: 7801 moveq #1,%d4 47c24: b8aa 0030 cmpl %a2@(48),%d4 47c28: 663c bnes 47c66 <_Thread_queue_Enqueue_priority+0x12a> THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 47c2a: 42aa 0030 clrl %a2@(48) if ( priority == search_priority ) 47c2e: b680 cmpl %d0,%d3 47c30: 6718 beqs 47c4a <_Thread_queue_Enqueue_priority+0x10e> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 47c32: 2651 moveal %a1@,%a3 the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 47c34: 2149 0004 movel %a1,%a0@(4) search_node = (Chain_Node *) search_thread; next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; 47c38: 208b movel %a3,%a0@ the_node->previous = search_node; search_node->next = the_node; next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 47c3a: 214a 0044 movel %a2,%a0@(68) 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; 47c3e: 2288 movel %a0,%a1@ next_node->previous = the_node; 47c40: 2748 0004 movel %a0,%a3@(4) the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 47c44: 46c1 movew %d1,%sr 47c46: 7001 moveq #1,%d0 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 47c48: 6026 bras 47c70 <_Thread_queue_Enqueue_priority+0x134> 47c4a: 43e9 003c lea %a1@(60),%a1 equal_priority: /* add at end of priority group */ search_node = _Chain_Tail( &search_thread->Wait.Block2n ); previous_node = search_node->previous; 47c4e: 2669 0004 moveal %a1@(4),%a3 the_node = (Chain_Node *) the_thread; the_node->next = search_node; 47c52: 2089 movel %a1,%a0@ the_node->previous = previous_node; 47c54: 214b 0004 movel %a3,%a0@(4) previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 47c58: 214a 0044 movel %a2,%a0@(68) 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; 47c5c: 2688 movel %a0,%a3@ search_node->previous = the_node; 47c5e: 2348 0004 movel %a0,%a1@(4) the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 47c62: 46c2 movew %d2,%sr 47c64: 60e0 bras 47c46 <_Thread_queue_Enqueue_priority+0x10a> * 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; 47c66: 206e 0010 moveal %fp@(16),%a0 return the_thread_queue->sync_state; 47c6a: 202a 0030 movel %a2@(48),%d0 * 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; 47c6e: 2082 movel %d2,%a0@ return the_thread_queue->sync_state; } 47c70: 4cd7 0c7c moveml %sp@,%d2-%d6/%a2-%a3 47c74: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 0004cfbc <_Thread_queue_Extract_fifo>: Thread_Control *the_thread ) { ISR_Level level; _ISR_Disable( level ); 4cfbc: 223c 0000 0700 movel #1792,%d1 void _Thread_queue_Extract_fifo( Thread_queue_Control *the_thread_queue __attribute__((unused)), Thread_Control *the_thread ) { 4cfc2: 4e56 0000 linkw %fp,#0 4cfc6: 2f0a movel %a2,%sp@- 4cfc8: 246e 000c moveal %fp@(12),%a2 ISR_Level level; _ISR_Disable( level ); 4cfcc: 40c0 movew %sr,%d0 4cfce: 8280 orl %d0,%d1 4cfd0: 46c1 movew %d1,%sr if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 4cfd2: 222a 0010 movel %a2@(16),%d1 4cfd6: 0281 0003 bee0 andil #245472,%d1 4cfdc: 660a bnes 4cfe8 <_Thread_queue_Extract_fifo+0x2c> _ISR_Enable( level ); 4cfde: 46c0 movew %d0,%sr #if defined(RTEMS_MULTIPROCESSING) if ( !_Objects_Is_local_id( the_thread->Object.id ) ) _Thread_MP_Free_proxy( the_thread ); #endif } 4cfe0: 246e fffc moveal %fp@(-4),%a2 4cfe4: 4e5e unlk %fp 4cfe6: 4e75 rts ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 4cfe8: 2052 moveal %a2@,%a0 _Chain_Extract_unprotected( &the_thread->Object.Node ); the_thread->Wait.queue = NULL; if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 4cfea: 7202 moveq #2,%d1 previous = the_node->previous; 4cfec: 226a 0004 moveal %a2@(4),%a1 return; } _Chain_Extract_unprotected( &the_thread->Object.Node ); the_thread->Wait.queue = NULL; 4cff0: 42aa 0044 clrl %a2@(68) next->previous = previous; previous->next = next; 4cff4: 2288 movel %a0,%a1@ Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 4cff6: 2149 0004 movel %a1,%a0@(4) if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 4cffa: b2aa 0050 cmpl %a2@(80),%d1 4cffe: 6704 beqs 4d004 <_Thread_queue_Extract_fifo+0x48> _ISR_Enable( level ); 4d000: 46c0 movew %d0,%sr 4d002: 6014 bras 4d018 <_Thread_queue_Extract_fifo+0x5c> 4d004: 7203 moveq #3,%d1 4d006: 2541 0050 movel %d1,%a2@(80) } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 4d00a: 46c0 movew %d0,%sr (void) _Watchdog_Remove( &the_thread->Timer ); 4d00c: 486a 0048 pea %a2@(72) 4d010: 4eb9 0004 8660 jsr 48660 <_Watchdog_Remove> 4d016: 588f addql #4,%sp RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 4d018: 2d4a 0008 movel %a2,%fp@(8) #if defined(RTEMS_MULTIPROCESSING) if ( !_Objects_Is_local_id( the_thread->Object.id ) ) _Thread_MP_Free_proxy( the_thread ); #endif } 4d01c: 246e fffc moveal %fp@(-4),%a2 4d020: 203c 1003 fff8 movel #268697592,%d0 4d026: 2d40 000c movel %d0,%fp@(12) 4d02a: 4e5e unlk %fp 4d02c: 4ef9 0004 7278 jmp 47278 <_Thread_Clear_state> ... =============================================================================== 0004b4b0 <_Thread_queue_Process_timeout>: #include void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { 4b4b0: 4e56 0000 linkw %fp,#0 4b4b4: 206e 0008 moveal %fp@(8),%a0 Thread_queue_Control *the_thread_queue = the_thread->Wait.queue; 4b4b8: 2268 0044 moveal %a0@(68),%a1 * If it is not satisfied, then it is "nothing happened" and * this is the "timeout" transition. After a request is satisfied, * a timeout is not allowed to occur. */ if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED && 4b4bc: 2029 0030 movel %a1@(48),%d0 4b4c0: 671c beqs 4b4de <_Thread_queue_Process_timeout+0x2e> 4b4c2: b1f9 0005 dcd6 cmpal 5dcd6 <_Thread_Executing>,%a0 4b4c8: 6614 bnes 4b4de <_Thread_queue_Process_timeout+0x2e><== NEVER TAKEN _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { 4b4ca: 7203 moveq #3,%d1 4b4cc: b280 cmpl %d0,%d1 4b4ce: 6722 beqs 4b4f2 <_Thread_queue_Process_timeout+0x42> the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 4b4d0: 7002 moveq #2,%d0 */ if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED && _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4b4d2: 2169 003c 0034 movel %a1@(60),%a0@(52) the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 4b4d8: 2340 0030 movel %d0,%a1@(48) 4b4dc: 6014 bras 4b4f2 <_Thread_queue_Process_timeout+0x42> } } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4b4de: 2169 003c 0034 movel %a1@(60),%a0@(52) _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 4b4e4: 2f08 movel %a0,%sp@- 4b4e6: 2f28 0044 movel %a0@(68),%sp@- 4b4ea: 4eb9 0004 b3ac jsr 4b3ac <_Thread_queue_Extract> 4b4f0: 508f addql #8,%sp } } 4b4f2: 4e5e unlk %fp ... =============================================================================== 00047d2c <_Thread_queue_Requeue>: void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 47d2c: 4e56 fff0 linkw %fp,#-16 47d30: 48d7 0c04 moveml %d2/%a2-%a3,%sp@ 47d34: 246e 0008 moveal %fp@(8),%a2 47d38: 266e 000c moveal %fp@(12),%a3 /* * Just in case the thread really wasn't blocked on a thread queue * when we get here. */ if ( !the_thread_queue ) 47d3c: 4a8a tstl %a2 47d3e: 6746 beqs 47d86 <_Thread_queue_Requeue+0x5a> <== NEVER TAKEN /* * If queueing by FIFO, there is nothing to do. This only applies to * priority blocking discipline. */ if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) { 47d40: 7001 moveq #1,%d0 47d42: b0aa 0034 cmpl %a2@(52),%d0 47d46: 663e bnes 47d86 <_Thread_queue_Requeue+0x5a> <== NEVER TAKEN Thread_queue_Control *tq = the_thread_queue; ISR_Level level; ISR_Level level_ignored; _ISR_Disable( level ); 47d48: 303c 0700 movew #1792,%d0 47d4c: 40c2 movew %sr,%d2 47d4e: 8082 orl %d2,%d0 47d50: 46c0 movew %d0,%sr if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 47d52: 202b 0010 movel %a3@(16),%d0 47d56: 0280 0003 bee0 andil #245472,%d0 47d5c: 6726 beqs 47d84 <_Thread_queue_Requeue+0x58> <== NEVER TAKEN _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, true ); 47d5e: 4878 0001 pea 1 47d62: 7001 moveq #1,%d0 47d64: 2f0b movel %a3,%sp@- 47d66: 2540 0030 movel %d0,%a2@(48) 47d6a: 2f0a movel %a2,%sp@- 47d6c: 4eb9 0004 b3e4 jsr 4b3e4 <_Thread_queue_Extract_priority_helper> (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); 47d72: 486e fffc pea %fp@(-4) 47d76: 2f0b movel %a3,%sp@- 47d78: 2f0a movel %a2,%sp@- 47d7a: 4eb9 0004 7b3c jsr 47b3c <_Thread_queue_Enqueue_priority> 47d80: 4fef 0018 lea %sp@(24),%sp } _ISR_Enable( level ); 47d84: 46c2 movew %d2,%sr } } 47d86: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3 47d8c: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00047d90 <_Thread_queue_Timeout>: void _Thread_queue_Timeout( Objects_Id id, void *ignored __attribute__((unused)) ) { 47d90: 4e56 fffc linkw %fp,#-4 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 47d94: 486e fffc pea %fp@(-4) 47d98: 2f2e 0008 movel %fp@(8),%sp@- 47d9c: 4eb9 0004 7658 jsr 47658 <_Thread_Get> switch ( location ) { 47da2: 508f addql #8,%sp 47da4: 4aae fffc tstl %fp@(-4) 47da8: 6618 bnes 47dc2 <_Thread_queue_Timeout+0x32> <== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); 47daa: 2f00 movel %d0,%sp@- 47dac: 4eb9 0004 b4b0 jsr 4b4b0 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 47db2: 588f addql #4,%sp 47db4: 2039 0005 dc1c movel 5dc1c <_Thread_Dispatch_disable_level>,%d0 47dba: 5380 subql #1,%d0 47dbc: 23c0 0005 dc1c movel %d0,5dc1c <_Thread_Dispatch_disable_level> _Thread_Unnest_dispatch(); break; } } 47dc2: 4e5e unlk %fp ... =============================================================================== 00051ed4 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 51ed4: 4e56 ffb4 linkw %fp,#-76 51ed8: 200e movel %fp,%d0 51eda: 0680 ffff fff4 addil #-12,%d0 51ee0: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@ 51ee4: 246e 0008 moveal %fp@(8),%a2 51ee8: 240e movel %fp,%d2 51eea: 2a0e movel %fp,%d5 51eec: 260e movel %fp,%d3 51eee: 0682 ffff ffe8 addil #-24,%d2 51ef4: 5185 subql #8,%d5 51ef6: 0683 ffff ffec addil #-20,%d3 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 51efc: 41ea 0008 lea %a2@(8),%a0 static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 51f00: 4bea 0040 lea %a2@(64),%a5 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 51f04: 2e0a movel %a2,%d7 /* * 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 ); 51f06: 280a movel %a2,%d4 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 51f08: 0687 0000 0030 addil #48,%d7 /* * 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 ); 51f0e: 0684 0000 0068 addil #104,%d4 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 51f14: 49f9 0005 5984 lea 55984 <_Watchdog_Adjust_to_chain>,%a4 ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 51f1a: 47f9 0005 5a14 lea 55a14 <_Watchdog_Insert>,%a3 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 51f20: 2d48 ffe4 movel %a0,%fp@(-28) */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 51f24: 2d45 fff4 movel %d5,%fp@(-12) the_chain->permanent_null = NULL; 51f28: 42ae fff8 clrl %fp@(-8) the_chain->last = _Chain_Head(the_chain); 51f2c: 2d40 fffc movel %d0,%fp@(-4) */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 51f30: 2d43 ffe8 movel %d3,%fp@(-24) the_chain->permanent_null = NULL; 51f34: 42ae ffec clrl %fp@(-20) the_chain->last = _Chain_Head(the_chain); 51f38: 2d42 fff0 movel %d2,%fp@(-16) 51f3c: 2d4d ffe0 movel %a5,%fp@(-32) { /* * 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; 51f40: 41ee fff4 lea %fp@(-12),%a0 * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); 51f44: 3a7c 0700 moveaw #1792,%a5 { /* * 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; 51f48: 2548 0078 movel %a0,%a2@(120) static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 51f4c: 2039 0007 63b8 movel 763b8 <_Watchdog_Ticks_since_boot>,%d0 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 51f52: 222a 003c movel %a2@(60),%d1 watchdogs->last_snapshot = snapshot; 51f56: 2540 003c movel %d0,%a2@(60) _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 51f5a: 486e ffe8 pea %fp@(-24) 51f5e: 9081 subl %d1,%d0 51f60: 2f00 movel %d0,%sp@- 51f62: 2f07 movel %d7,%sp@- 51f64: 4e94 jsr %a4@ static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 51f66: 2039 0007 630a movel 7630a <_TOD_Now>,%d0 /* * 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 ) { 51f6c: 4fef 000c lea %sp@(12),%sp Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 51f70: 222a 0074 movel %a2@(116),%d1 /* * 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 ) { 51f74: b280 cmpl %d0,%d1 51f76: 6414 bccs 51f8c <_Timer_server_Body+0xb8> /* * 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 ); 51f78: 486e ffe8 pea %fp@(-24) 51f7c: 2c00 movel %d0,%d6 51f7e: 9c81 subl %d1,%d6 51f80: 2f06 movel %d6,%sp@- 51f82: 2d40 ffdc movel %d0,%fp@(-36) 51f86: 2f04 movel %d4,%sp@- 51f88: 4e94 jsr %a4@ 51f8a: 6018 bras 51fa4 <_Timer_server_Body+0xd0> } else if ( snapshot < last_snapshot ) { 51f8c: b280 cmpl %d0,%d1 51f8e: 631c blss 51fac <_Timer_server_Body+0xd8> /* * 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 ); 51f90: 9280 subl %d0,%d1 51f92: 2f01 movel %d1,%sp@- 51f94: 4878 0001 pea 1 51f98: 2d40 ffdc movel %d0,%fp@(-36) 51f9c: 2f04 movel %d4,%sp@- 51f9e: 4eb9 0005 5904 jsr 55904 <_Watchdog_Adjust> 51fa4: 202e ffdc movel %fp@(-36),%d0 51fa8: 4fef 000c lea %sp@(12),%sp } watchdogs->last_snapshot = snapshot; 51fac: 2540 0074 movel %d0,%a2@(116) } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); 51fb0: 202a 0078 movel %a2@(120),%d0 51fb4: 2f00 movel %d0,%sp@- 51fb6: 4eb9 0005 2870 jsr 52870 <_Chain_Get> if ( timer == NULL ) { 51fbc: 588f addql #4,%sp } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); 51fbe: 2040 moveal %d0,%a0 if ( timer == NULL ) { 51fc0: 4a80 tstl %d0 51fc2: 6724 beqs 51fe8 <_Timer_server_Body+0x114> <== ALWAYS TAKEN static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 51fc4: 2028 0038 movel %a0@(56),%d0 <== NOT EXECUTED 51fc8: 7201 moveq #1,%d1 <== NOT EXECUTED 51fca: b280 cmpl %d0,%d1 <== NOT EXECUTED 51fcc: 6608 bnes 51fd6 <_Timer_server_Body+0x102> <== NOT EXECUTED _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 51fce: 4868 0010 pea %a0@(16) <== NOT EXECUTED 51fd2: 2f07 movel %d7,%sp@- <== NOT EXECUTED 51fd4: 600c bras 51fe2 <_Timer_server_Body+0x10e> <== NOT EXECUTED } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 51fd6: 7c03 moveq #3,%d6 <== NOT EXECUTED 51fd8: bc80 cmpl %d0,%d6 <== NOT EXECUTED 51fda: 66d4 bnes 51fb0 <_Timer_server_Body+0xdc> <== NOT EXECUTED _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 51fdc: 4868 0010 pea %a0@(16) <== NOT EXECUTED 51fe0: 2f04 movel %d4,%sp@- <== NOT EXECUTED 51fe2: 4e93 jsr %a3@ <== NOT EXECUTED 51fe4: 508f addql #8,%sp <== NOT EXECUTED 51fe6: 60c8 bras 51fb0 <_Timer_server_Body+0xdc> <== NOT EXECUTED * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); 51fe8: 200d movel %a5,%d0 51fea: 40c1 movew %sr,%d1 51fec: 8081 orl %d1,%d0 51fee: 46c0 movew %d0,%sr if ( _Chain_Is_empty( insert_chain ) ) { 51ff0: baae fff4 cmpl %fp@(-12),%d5 51ff4: 6612 bnes 52008 <_Timer_server_Body+0x134> <== NEVER TAKEN ts->insert_chain = NULL; 51ff6: 42aa 0078 clrl %a2@(120) _ISR_Enable( level ); 51ffa: 46c1 movew %d1,%sr /* * It is essential that interrupts are disable here since an interrupt * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); 51ffc: 3a7c 0700 moveaw #1792,%a5 _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 ) ) { 52000: b6ae ffe8 cmpl %fp@(-24),%d3 52004: 6608 bnes 5200e <_Timer_server_Body+0x13a> 52006: 6042 bras 5204a <_Timer_server_Body+0x176> ts->insert_chain = NULL; _ISR_Enable( level ); break; } else { _ISR_Enable( level ); 52008: 46c1 movew %d1,%sr <== NOT EXECUTED 5200a: 6000 ff40 braw 51f4c <_Timer_server_Body+0x78> <== 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 ); 5200e: 220d movel %a5,%d1 52010: 40c0 movew %sr,%d0 52012: 8280 orl %d0,%d1 52014: 46c1 movew %d1,%sr */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 52016: 206e ffe8 moveal %fp@(-24),%a0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 5201a: b688 cmpl %a0,%d3 5201c: 6726 beqs 52044 <_Timer_server_Body+0x170> { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 5201e: 2250 moveal %a0@,%a1 the_chain->first = new_first; 52020: 2d49 ffe8 movel %a1,%fp@(-24) new_first->previous = _Chain_Head(the_chain); 52024: 2342 0004 movel %d2,%a1@(4) watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { 52028: 4a88 tstl %a0 5202a: 6718 beqs 52044 <_Timer_server_Body+0x170> <== NEVER TAKEN watchdog->state = WATCHDOG_INACTIVE; 5202c: 42a8 0008 clrl %a0@(8) _ISR_Enable( level ); 52030: 46c0 movew %d0,%sr /* * 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 ); 52032: 2f28 0024 movel %a0@(36),%sp@- 52036: 2f28 0020 movel %a0@(32),%sp@- 5203a: 2068 001c moveal %a0@(28),%a0 5203e: 4e90 jsr %a0@ } 52040: 508f addql #8,%sp 52042: 60ca bras 5200e <_Timer_server_Body+0x13a> watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { watchdog->state = WATCHDOG_INACTIVE; _ISR_Enable( level ); } else { _ISR_Enable( level ); 52044: 46c0 movew %d0,%sr 52046: 6000 fef8 braw 51f40 <_Timer_server_Body+0x6c> * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); } } else { ts->active = false; 5204a: 4200 clrb %d0 5204c: 1540 007c moveb %d0,%a2@(124) 52050: 2039 0007 6278 movel 76278 <_Thread_Dispatch_disable_level>,%d0 52056: 5280 addql #1,%d0 52058: 23c0 0007 6278 movel %d0,76278 <_Thread_Dispatch_disable_level> /* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING ); 5205e: 4878 0008 pea 8 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 52062: 4bf9 0005 5b30 lea 55b30 <_Watchdog_Remove>,%a5 /* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING ); 52068: 2f12 movel %a2@,%sp@- 5206a: 4eb9 0005 5158 jsr 55158 <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 52070: 2f0a movel %a2,%sp@- 52072: 4eba fd9c jsr %pc@(51e10 <_Timer_server_Reset_interval_system_watchdog>) _Timer_server_Reset_tod_system_watchdog( ts ); 52076: 2f0a movel %a2,%sp@- 52078: 4eba fdf6 jsr %pc@(51e70 <_Timer_server_Reset_tod_system_watchdog>) _Thread_Enable_dispatch(); 5207c: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> ts->active = true; 52082: 7201 moveq #1,%d1 52084: 1541 007c moveb %d1,%a2@(124) static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 52088: 2f2e ffe4 movel %fp@(-28),%sp@- 5208c: 4e95 jsr %a5@ static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 5208e: 2f2e ffe0 movel %fp@(-32),%sp@- 52092: 4e95 jsr %a5@ 52094: 4fef 0018 lea %sp@(24),%sp 52098: 6000 fea6 braw 51f40 <_Timer_server_Body+0x6c> =============================================================================== 0005209c <_Timer_server_Schedule_operation_method>: static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { 5209c: 4e56 fff0 linkw %fp,#-16 520a0: 206e 000c moveal %fp@(12),%a0 520a4: 48d7 041c moveml %d2-%d4/%a2,%sp@ 520a8: 246e 0008 moveal %fp@(8),%a2 if ( ts->insert_chain == NULL ) { 520ac: 202a 0078 movel %a2@(120),%d0 520b0: 6600 00f8 bnew 521aa <_Timer_server_Schedule_operation_method+0x10e> 520b4: 2039 0007 6278 movel 76278 <_Thread_Dispatch_disable_level>,%d0 520ba: 5280 addql #1,%d0 520bc: 23c0 0007 6278 movel %d0,76278 <_Thread_Dispatch_disable_level> * being inserted. This could result in an integer overflow. */ _Thread_Disable_dispatch(); if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 520c2: 2028 0038 movel %a0@(56),%d0 520c6: 7201 moveq #1,%d1 520c8: b280 cmpl %d0,%d1 520ca: 6660 bnes 5212c <_Timer_server_Schedule_operation_method+0x90> /* * We have to advance the last known ticks value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); 520cc: 203c 0000 0700 movel #1792,%d0 520d2: 40c3 movew %sr,%d3 520d4: 8083 orl %d3,%d0 520d6: 46c0 movew %d0,%sr snapshot = _Watchdog_Ticks_since_boot; 520d8: 2039 0007 63b8 movel 763b8 <_Watchdog_Ticks_since_boot>,%d0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 520de: 220a movel %a2,%d1 520e0: 0681 0000 0034 addil #52,%d1 last_snapshot = ts->Interval_watchdogs.last_snapshot; 520e6: 242a 003c movel %a2@(60),%d2 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 520ea: 226a 0030 moveal %a2@(48),%a1 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 520ee: b289 cmpl %a1,%d1 520f0: 6716 beqs 52108 <_Timer_server_Schedule_operation_method+0x6c> first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain ); /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; 520f2: 2800 movel %d0,%d4 520f4: 9882 subl %d2,%d4 delta_interval = first_watchdog->delta_interval; 520f6: 2229 0010 movel %a1@(16),%d1 if (delta_interval > delta) { 520fa: b881 cmpl %d1,%d4 520fc: 6504 bcss 52102 <_Timer_server_Schedule_operation_method+0x66> 520fe: 4281 clrl %d1 52100: 6002 bras 52104 <_Timer_server_Schedule_operation_method+0x68> delta_interval -= delta; 52102: 9284 subl %d4,%d1 } else { delta_interval = 0; } first_watchdog->delta_interval = delta_interval; 52104: 2341 0010 movel %d1,%a1@(16) } ts->Interval_watchdogs.last_snapshot = snapshot; 52108: 2540 003c movel %d0,%a2@(60) _ISR_Enable( level ); 5210c: 46c3 movew %d3,%sr _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 5210e: 4868 0010 pea %a0@(16) 52112: 486a 0030 pea %a2@(48) 52116: 4eb9 0005 5a14 jsr 55a14 <_Watchdog_Insert> if ( !ts->active ) { 5211c: 508f addql #8,%sp 5211e: 102a 007c moveb %a2@(124),%d0 52122: 6678 bnes 5219c <_Timer_server_Schedule_operation_method+0x100> _Timer_server_Reset_interval_system_watchdog( ts ); 52124: 2f0a movel %a2,%sp@- 52126: 4eba fce8 jsr %pc@(51e10 <_Timer_server_Reset_interval_system_watchdog>) 5212a: 606e bras 5219a <_Timer_server_Schedule_operation_method+0xfe> } } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 5212c: 7203 moveq #3,%d1 5212e: b280 cmpl %d0,%d1 52130: 666a bnes 5219c <_Timer_server_Schedule_operation_method+0x100> /* * We have to advance the last known seconds value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); 52132: 203c 0000 0700 movel #1792,%d0 52138: 40c3 movew %sr,%d3 5213a: 8083 orl %d3,%d0 5213c: 46c0 movew %d0,%sr 5213e: 200a movel %a2,%d0 52140: 0680 0000 006c addil #108,%d0 snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 52146: 2239 0007 630a movel 7630a <_TOD_Now>,%d1 last_snapshot = ts->TOD_watchdogs.last_snapshot; 5214c: 242a 0074 movel %a2@(116),%d2 */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 52150: 226a 0068 moveal %a2@(104),%a1 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 52154: b089 cmpl %a1,%d0 52156: 6720 beqs 52178 <_Timer_server_Schedule_operation_method+0xdc> if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) { first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; 52158: 2029 0010 movel %a1@(16),%d0 if ( snapshot > last_snapshot ) { 5215c: b481 cmpl %d1,%d2 5215e: 6410 bccs 52170 <_Timer_server_Schedule_operation_method+0xd4> /* * We advanced in time. */ delta = snapshot - last_snapshot; 52160: 2801 movel %d1,%d4 52162: 9882 subl %d2,%d4 if (delta_interval > delta) { 52164: b880 cmpl %d0,%d4 52166: 6504 bcss 5216c <_Timer_server_Schedule_operation_method+0xd0><== ALWAYS TAKEN 52168: 4280 clrl %d0 <== NOT EXECUTED 5216a: 6008 bras 52174 <_Timer_server_Schedule_operation_method+0xd8><== NOT EXECUTED delta_interval -= delta; 5216c: 9084 subl %d4,%d0 5216e: 6004 bras 52174 <_Timer_server_Schedule_operation_method+0xd8> } } else { /* * Someone put us in the past. */ delta = last_snapshot - snapshot; 52170: d082 addl %d2,%d0 delta_interval += delta; 52172: 9081 subl %d1,%d0 } first_watchdog->delta_interval = delta_interval; 52174: 2340 0010 movel %d0,%a1@(16) } ts->TOD_watchdogs.last_snapshot = snapshot; 52178: 2541 0074 movel %d1,%a2@(116) _ISR_Enable( level ); 5217c: 46c3 movew %d3,%sr _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 5217e: 4868 0010 pea %a0@(16) 52182: 486a 0068 pea %a2@(104) 52186: 4eb9 0005 5a14 jsr 55a14 <_Watchdog_Insert> if ( !ts->active ) { 5218c: 508f addql #8,%sp 5218e: 102a 007c moveb %a2@(124),%d0 52192: 6608 bnes 5219c <_Timer_server_Schedule_operation_method+0x100> _Timer_server_Reset_tod_system_watchdog( ts ); 52194: 2f0a movel %a2,%sp@- 52196: 4eba fcd8 jsr %pc@(51e70 <_Timer_server_Reset_tod_system_watchdog>) 5219a: 588f addql #4,%sp * critical section. We have to use the protected chain methods because * we may be interrupted by a higher priority interrupt. */ _Chain_Append( ts->insert_chain, &timer->Object.Node ); } } 5219c: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 521a2: 4e5e unlk %fp if ( !ts->active ) { _Timer_server_Reset_tod_system_watchdog( ts ); } } _Thread_Enable_dispatch(); 521a4: 4ef9 0005 47f6 jmp 547f6 <_Thread_Enable_dispatch> * server is not preemptible, so we must be in interrupt context here. No * thread dispatch will happen until the timer server finishes its * critical section. We have to use the protected chain methods because * we may be interrupted by a higher priority interrupt. */ _Chain_Append( ts->insert_chain, &timer->Object.Node ); 521aa: 202a 0078 movel %a2@(120),%d0 <== NOT EXECUTED 521ae: 2d48 000c movel %a0,%fp@(12) <== NOT EXECUTED } } 521b2: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 <== NOT EXECUTED * server is not preemptible, so we must be in interrupt context here. No * thread dispatch will happen until the timer server finishes its * critical section. We have to use the protected chain methods because * we may be interrupted by a higher priority interrupt. */ _Chain_Append( ts->insert_chain, &timer->Object.Node ); 521b8: 2d40 0008 movel %d0,%fp@(8) <== NOT EXECUTED } } 521bc: 4e5e unlk %fp <== NOT EXECUTED * server is not preemptible, so we must be in interrupt context here. No * thread dispatch will happen until the timer server finishes its * critical section. We have to use the protected chain methods because * we may be interrupted by a higher priority interrupt. */ _Chain_Append( ts->insert_chain, &timer->Object.Node ); 521be: 4ef9 0005 2810 jmp 52810 <_Chain_Append> <== NOT EXECUTED =============================================================================== 0004991c <_Timespec_Greater_than>: bool _Timespec_Greater_than( const struct timespec *lhs, const struct timespec *rhs ) { 4991c: 4e56 0000 linkw %fp,#0 49920: 226e 0008 moveal %fp@(8),%a1 49924: 206e 000c moveal %fp@(12),%a0 if ( lhs->tv_sec > rhs->tv_sec ) 49928: 2211 movel %a1@,%d1 4992a: 2010 movel %a0@,%d0 4992c: b081 cmpl %d1,%d0 4992e: 6c04 bges 49934 <_Timespec_Greater_than+0x18> 49930: 7001 moveq #1,%d0 49932: 6014 bras 49948 <_Timespec_Greater_than+0x2c> return true; if ( lhs->tv_sec < rhs->tv_sec ) 49934: b081 cmpl %d1,%d0 49936: 6f04 bles 4993c <_Timespec_Greater_than+0x20> <== ALWAYS TAKEN 49938: 4200 clrb %d0 4993a: 600c bras 49948 <_Timespec_Greater_than+0x2c> <== NOT EXECUTED #include #include #include bool _Timespec_Greater_than( 4993c: 2068 0004 moveal %a0@(4),%a0 49940: b1e9 0004 cmpal %a1@(4),%a0 49944: 5dc0 slt %d0 49946: 4480 negl %d0 /* ASSERT: lhs->tv_sec == rhs->tv_sec */ if ( lhs->tv_nsec > rhs->tv_nsec ) return true; return false; } 49948: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 000483c4 <_User_extensions_Thread_exitted>: void _User_extensions_Thread_exitted ( Thread_Control *executing ) { 483c4: 4e56 0000 linkw %fp,#0 483c8: 2f0a movel %a2,%sp@- Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; 483ca: 2479 0005 ddb2 moveal 5ddb2 <_User_extensions_List+0x8>,%a2 } void _User_extensions_Thread_exitted ( Thread_Control *executing ) { 483d0: 2f02 movel %d2,%sp@- 483d2: 242e 0008 movel %fp@(8),%d2 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; 483d6: 6012 bras 483ea <_User_extensions_Thread_exitted+0x26> !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_exitted != NULL ) 483d8: 206a 002c moveal %a2@(44),%a0 483dc: 4a88 tstl %a0 483de: 6706 beqs 483e6 <_User_extensions_Thread_exitted+0x22> (*the_extension->Callouts.thread_exitted)( executing ); 483e0: 2f02 movel %d2,%sp@- 483e2: 4e90 jsr %a0@ 483e4: 588f addql #4,%sp <== NOT EXECUTED Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { 483e6: 246a 0004 moveal %a2@(4),%a2 { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; !_Chain_Is_head( &_User_extensions_List, the_node ) ; 483ea: b5fc 0005 ddaa cmpal #384426,%a2 483f0: 66e6 bnes 483d8 <_User_extensions_Thread_exitted+0x14> the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_exitted != NULL ) (*the_extension->Callouts.thread_exitted)( executing ); } } 483f2: 242e fff8 movel %fp@(-8),%d2 483f6: 246e fffc moveal %fp@(-4),%a2 483fa: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00049a7c <_Watchdog_Adjust>: Watchdog_Interval units ) { ISR_Level level; _ISR_Disable( level ); 49a7c: 327c 0700 moveaw #1792,%a1 49a80: 2209 movel %a1,%d1 void _Watchdog_Adjust( Chain_Control *header, Watchdog_Adjust_directions direction, Watchdog_Interval units ) { 49a82: 4e56 ffe8 linkw %fp,#-24 49a86: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%sp@ 49a8a: 266e 0008 moveal %fp@(8),%a3 49a8e: 262e 000c movel %fp@(12),%d3 49a92: 242e 0010 movel %fp@(16),%d2 ISR_Level level; _ISR_Disable( level ); 49a96: 40c0 movew %sr,%d0 49a98: 8280 orl %d0,%d1 49a9a: 46c1 movew %d1,%sr */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 49a9c: 244b moveal %a3,%a2 49a9e: 205a moveal %a2@+,%a0 * hence the compiler must not assume *header to remain * unmodified across that call. * * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { 49aa0: b5c8 cmpal %a0,%a2 49aa2: 674c beqs 49af0 <_Watchdog_Adjust+0x74> switch ( direction ) { 49aa4: 4a83 tstl %d3 49aa6: 673c beqs 49ae4 <_Watchdog_Adjust+0x68> 49aa8: 7201 moveq #1,%d1 49aaa: b283 cmpl %d3,%d1 49aac: 6642 bnes 49af0 <_Watchdog_Adjust+0x74> <== NEVER TAKEN case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; 49aae: d5a8 0010 addl %d2,%a0@(16) break; 49ab2: 603c bras 49af0 <_Watchdog_Adjust+0x74> RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) header->first ); 49ab4: 2053 moveal %a3@,%a0 case WATCHDOG_FORWARD: while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { 49ab6: 2628 0010 movel %a0@(16),%d3 49aba: b682 cmpl %d2,%d3 49abc: 6308 blss 49ac6 <_Watchdog_Adjust+0x4a> _Watchdog_First( header )->delta_interval -= units; 49abe: 9682 subl %d2,%d3 49ac0: 2143 0010 movel %d3,%a0@(16) break; 49ac4: 602a bras 49af0 <_Watchdog_Adjust+0x74> } else { units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; 49ac6: 7201 moveq #1,%d1 49ac8: 2141 0010 movel %d1,%a0@(16) _ISR_Enable( level ); 49acc: 46c0 movew %d0,%sr _Watchdog_Tickle( header ); 49ace: 2f0b movel %a3,%sp@- 49ad0: 4e94 jsr %a4@ _ISR_Disable( level ); 49ad2: 2204 movel %d4,%d1 49ad4: 40c0 movew %sr,%d0 49ad6: 8280 orl %d0,%d1 49ad8: 46c1 movew %d1,%sr while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { _Watchdog_First( header )->delta_interval -= units; break; } else { units -= _Watchdog_First( header )->delta_interval; 49ada: 9483 subl %d3,%d2 _Watchdog_Tickle( header ); _ISR_Disable( level ); if ( _Chain_Is_empty( header ) ) 49adc: 588f addql #4,%sp 49ade: b5d3 cmpal %a3@,%a2 49ae0: 660a bnes 49aec <_Watchdog_Adjust+0x70> 49ae2: 600c bras 49af0 <_Watchdog_Adjust+0x74> _ISR_Enable( level ); _Watchdog_Tickle( header ); _ISR_Disable( level ); 49ae4: 2809 movel %a1,%d4 units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; _ISR_Enable( level ); _Watchdog_Tickle( header ); 49ae6: 49f9 0004 9c94 lea 49c94 <_Watchdog_Tickle>,%a4 switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; break; case WATCHDOG_FORWARD: while ( units ) { 49aec: 4a82 tstl %d2 49aee: 66c4 bnes 49ab4 <_Watchdog_Adjust+0x38> <== ALWAYS TAKEN } break; } } _ISR_Enable( level ); 49af0: 46c0 movew %d0,%sr } 49af2: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4 49af8: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00048660 <_Watchdog_Remove>: { ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); 48660: 203c 0000 0700 movel #1792,%d0 */ Watchdog_States _Watchdog_Remove( Watchdog_Control *the_watchdog ) { 48666: 4e56 0000 linkw %fp,#0 4866a: 206e 0008 moveal %fp@(8),%a0 4866e: 2f0a movel %a2,%sp@- 48670: 2f02 movel %d2,%sp@- ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); 48672: 40c1 movew %sr,%d1 48674: 8081 orl %d1,%d0 48676: 46c0 movew %d0,%sr previous_state = the_watchdog->state; 48678: 2028 0008 movel %a0@(8),%d0 switch ( previous_state ) { 4867c: 7401 moveq #1,%d2 4867e: b480 cmpl %d0,%d2 48680: 670c beqs 4868e <_Watchdog_Remove+0x2e> 48682: 6244 bhis 486c8 <_Watchdog_Remove+0x68> 48684: 143c 0003 moveb #3,%d2 48688: b480 cmpl %d0,%d2 4868a: 653c bcss 486c8 <_Watchdog_Remove+0x68> <== NEVER TAKEN 4868c: 6006 bras 48694 <_Watchdog_Remove+0x34> /* * It is not actually on the chain so just change the state and * the Insert operation we interrupted will be aborted. */ the_watchdog->state = WATCHDOG_INACTIVE; 4868e: 42a8 0008 clrl %a0@(8) break; 48692: 6034 bras 486c8 <_Watchdog_Remove+0x68> RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Next( Watchdog_Control *the_watchdog ) { return ( (Watchdog_Control *) the_watchdog->Node.next ); 48694: 2250 moveal %a0@,%a1 case WATCHDOG_ACTIVE: case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; 48696: 42a8 0008 clrl %a0@(8) next_watchdog = _Watchdog_Next( the_watchdog ); if ( _Watchdog_Next(next_watchdog) ) 4869a: 4a91 tstl %a1@ 4869c: 6708 beqs 486a6 <_Watchdog_Remove+0x46> next_watchdog->delta_interval += the_watchdog->delta_interval; 4869e: 2428 0010 movel %a0@(16),%d2 486a2: d5a9 0010 addl %d2,%a1@(16) if ( _Watchdog_Sync_count ) 486a6: 2279 0005 dd58 moveal 5dd58 <_Watchdog_Sync_count>,%a1 486ac: 4a89 tstl %a1 486ae: 670c beqs 486bc <_Watchdog_Remove+0x5c> _Watchdog_Sync_level = _ISR_Nest_level; 486b0: 2279 0005 dcb6 moveal 5dcb6 <_ISR_Nest_level>,%a1 486b6: 23c9 0005 dcd2 movel %a1,5dcd2 <_Watchdog_Sync_level> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 486bc: 2250 moveal %a0@,%a1 previous = the_node->previous; 486be: 2468 0004 moveal %a0@(4),%a2 next->previous = previous; previous->next = next; 486c2: 2489 movel %a1,%a2@ Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 486c4: 234a 0004 movel %a2,%a1@(4) _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 486c8: 2279 0005 dd5c moveal 5dd5c <_Watchdog_Ticks_since_boot>,%a1 486ce: 2149 0018 movel %a1,%a0@(24) _ISR_Enable( level ); 486d2: 46c1 movew %d1,%sr return( previous_state ); } 486d4: 241f movel %sp@+,%d2 486d6: 245f moveal %sp@+,%a2 486d8: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00049684 <_Watchdog_Report_chain>: ) { ISR_Level level; Chain_Node *node; _ISR_Disable( level ); 49684: 203c 0000 0700 movel #1792,%d0 void _Watchdog_Report_chain( const char *name, Chain_Control *header ) { 4968a: 4e56 ffec linkw %fp,#-20 4968e: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@ 49692: 242e 0008 movel %fp@(8),%d2 49696: 266e 000c moveal %fp@(12),%a3 ISR_Level level; Chain_Node *node; _ISR_Disable( level ); 4969a: 40c3 movew %sr,%d3 4969c: 8083 orl %d3,%d0 4969e: 46c0 movew %d0,%sr printk( "Watchdog Chain: %s %p\n", name, header ); 496a0: 2f0b movel %a3,%sp@- 496a2: 49f9 0004 3e90 lea 43e90 ,%a4 496a8: 2f02 movel %d2,%sp@- 496aa: 4879 0005 cf96 pea 5cf96 496b0: 4e94 jsr %a4@ */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 496b2: 245b moveal %a3@+,%a2 if ( !_Chain_Is_empty( header ) ) { 496b4: 4fef 000c lea %sp@(12),%sp 496b8: b7ca cmpal %a2,%a3 496ba: 6726 beqs 496e2 <_Watchdog_Report_chain+0x5e> node != _Chain_Tail(header) ; node = node->next ) { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); 496bc: 49f9 0004 96f8 lea 496f8 <_Watchdog_Report>,%a4 496c2: 2f0a movel %a2,%sp@- 496c4: 42a7 clrl %sp@- 496c6: 4e94 jsr %a4@ _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); if ( !_Chain_Is_empty( header ) ) { for ( node = header->first ; node != _Chain_Tail(header) ; node = node->next ) 496c8: 2452 moveal %a2@,%a2 Chain_Node *node; _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); if ( !_Chain_Is_empty( header ) ) { for ( node = header->first ; 496ca: 508f addql #8,%sp 496cc: b7ca cmpal %a2,%a3 496ce: 66f2 bnes 496c2 <_Watchdog_Report_chain+0x3e> <== NEVER TAKEN { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); } printk( "== end of %s \n", name ); 496d0: 2f02 movel %d2,%sp@- 496d2: 4879 0005 cfad pea 5cfad 496d8: 4eb9 0004 3e90 jsr 43e90 496de: 508f addql #8,%sp 496e0: 600a bras 496ec <_Watchdog_Report_chain+0x68> } else { printk( "Chain is empty\n" ); 496e2: 4879 0005 cfbc pea 5cfbc 496e8: 4e94 jsr %a4@ 496ea: 588f addql #4,%sp } _ISR_Enable( level ); 496ec: 46c3 movew %d3,%sr } 496ee: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4 496f4: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 000486dc <_Watchdog_Tickle>: * See the comment in watchdoginsert.c and watchdogadjust.c * about why it's safe not to declare header a pointer to * volatile data - till, 2003/7 */ _ISR_Disable( level ); 486dc: 203c 0000 0700 movel #1792,%d0 */ void _Watchdog_Tickle( Chain_Control *header ) { 486e2: 4e56 ffe8 linkw %fp,#-24 486e6: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@ 486ea: 286e 0008 moveal %fp@(8),%a4 * See the comment in watchdoginsert.c and watchdogadjust.c * about why it's safe not to declare header a pointer to * volatile data - till, 2003/7 */ _ISR_Disable( level ); 486ee: 40c2 movew %sr,%d2 486f0: 8082 orl %d2,%d0 486f2: 46c0 movew %d0,%sr */ RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 486f4: 264c moveal %a4,%a3 486f6: 245b moveal %a3@+,%a2 if ( _Chain_Is_empty( header ) ) 486f8: b7ca cmpal %a2,%a3 486fa: 674e beqs 4874a <_Watchdog_Tickle+0x6e> * to be inserted has already had its delta_interval adjusted to 0, and * so is added to the head of the chain with a delta_interval of 0. * * Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc) */ if (the_watchdog->delta_interval != 0) { 486fc: 202a 0010 movel %a2@(16),%d0 48700: 6708 beqs 4870a <_Watchdog_Tickle+0x2e> the_watchdog->delta_interval--; 48702: 5380 subql #1,%d0 48704: 2540 0010 movel %d0,%a2@(16) if ( the_watchdog->delta_interval != 0 ) 48708: 6640 bnes 4874a <_Watchdog_Tickle+0x6e> goto leave; } do { watchdog_state = _Watchdog_Remove( the_watchdog ); 4870a: 4bf9 0004 8660 lea 48660 <_Watchdog_Remove>,%a5 case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 48710: 263c 0000 0700 movel #1792,%d3 if ( the_watchdog->delta_interval != 0 ) goto leave; } do { watchdog_state = _Watchdog_Remove( the_watchdog ); 48716: 2f0a movel %a2,%sp@- 48718: 4e95 jsr %a5@ _ISR_Enable( level ); 4871a: 46c2 movew %d2,%sr switch( watchdog_state ) { 4871c: 7202 moveq #2,%d1 4871e: 588f addql #4,%sp 48720: b280 cmpl %d0,%d1 48722: 6610 bnes 48734 <_Watchdog_Tickle+0x58> <== NEVER TAKEN case WATCHDOG_ACTIVE: (*the_watchdog->routine)( 48724: 2f2a 0024 movel %a2@(36),%sp@- 48728: 2f2a 0020 movel %a2@(32),%sp@- 4872c: 206a 001c moveal %a2@(28),%a0 48730: 4e90 jsr %a0@ 48732: 508f addql #8,%sp case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 48734: 2003 movel %d3,%d0 48736: 40c2 movew %sr,%d2 48738: 8082 orl %d2,%d0 4873a: 46c0 movew %d0,%sr RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) header->first ); 4873c: 2014 movel %a4@,%d0 4873e: 2440 moveal %d0,%a2 the_watchdog = _Watchdog_First( header ); } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); 48740: b7c0 cmpal %d0,%a3 48742: 6706 beqs 4874a <_Watchdog_Tickle+0x6e> 48744: 4aaa 0010 tstl %a2@(16) 48748: 67cc beqs 48716 <_Watchdog_Tickle+0x3a> leave: _ISR_Enable(level); 4874a: 46c2 movew %d2,%sr } 4874c: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5 48752: 4e5e unlk %fp ... =============================================================================== 00046e2c : rtems_status_code rtems_io_register_driver( rtems_device_major_number major, const rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ) { 46e2c: 4e56 0000 linkw %fp,#0 46e30: 206e 000c moveal %fp@(12),%a0 46e34: 2f0a movel %a2,%sp@- 46e36: 226e 0010 moveal %fp@(16),%a1 46e3a: 2f02 movel %d2,%sp@- 46e3c: 242e 0008 movel %fp@(8),%d2 rtems_device_major_number major_limit = _IO_Number_of_drivers; 46e40: 2039 0006 13fa movel 613fa <_IO_Number_of_drivers>,%d0 if ( rtems_interrupt_is_in_progress() ) 46e46: 2239 0006 124e movel 6124e <_ISR_Nest_level>,%d1 46e4c: 6706 beqs 46e54 46e4e: 7012 moveq #18,%d0 46e50: 6000 00d6 braw 46f28 return RTEMS_CALLED_FROM_ISR; if ( registered_major == NULL ) 46e54: 4a89 tstl %a1 46e56: 6700 00ce beqw 46f26 return RTEMS_INVALID_ADDRESS; /* Set it to an invalid value */ *registered_major = major_limit; 46e5a: 2280 movel %d0,%a1@ if ( driver_table == NULL ) 46e5c: 4a88 tstl %a0 46e5e: 6700 00c6 beqw 46f26 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 46e62: 4a90 tstl %a0@ 46e64: 6600 00ce bnew 46f34 46e68: 4aa8 0004 tstl %a0@(4) 46e6c: 6600 00c6 bnew 46f34 46e70: 6000 00b4 braw 46f26 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 46e74: 2039 0006 11b4 movel 611b4 <_Thread_Dispatch_disable_level>,%d0 46e7a: 5280 addql #1,%d0 46e7c: 23c0 0006 11b4 movel %d0,611b4 <_Thread_Dispatch_disable_level> if ( major >= major_limit ) return RTEMS_INVALID_NUMBER; _Thread_Disable_dispatch(); if ( major == 0 ) { 46e82: 4a82 tstl %d2 46e84: 662c bnes 46eb2 static rtems_status_code rtems_io_obtain_major_number( rtems_device_major_number *major ) { rtems_device_major_number n = _IO_Number_of_drivers; 46e86: 2039 0006 13fa movel 613fa <_IO_Number_of_drivers>,%d0 46e8c: 2479 0006 13fe moveal 613fe <_IO_Driver_address_table>,%a2 46e92: 6010 bras 46ea4 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 46e94: 4a92 tstl %a2@ 46e96: 6600 00a6 bnew 46f3e 46e9a: 4aaa 0004 tstl %a2@(4) 46e9e: 6600 009e bnew 46f3e 46ea2: 6004 bras 46ea8 rtems_device_major_number n = _IO_Number_of_drivers; rtems_device_major_number m = 0; /* major is error checked by caller */ for ( m = 0; m < n; ++m ) { 46ea4: b082 cmpl %d2,%d0 46ea6: 62ec bhis 46e94 if ( rtems_io_is_empty_table( table ) ) break; } /* Assigns invalid value in case of failure */ *major = m; 46ea8: 2282 movel %d2,%a1@ if ( m != n ) 46eaa: b082 cmpl %d2,%d0 46eac: 6634 bnes 46ee2 46eae: 6000 0098 braw 46f48 _Thread_Enable_dispatch(); return sc; } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; 46eb2: 2202 movel %d2,%d1 46eb4: 2002 movel %d2,%d0 46eb6: e789 lsll #3,%d1 46eb8: eb88 lsll #5,%d0 46eba: 2479 0006 13fe moveal 613fe <_IO_Driver_address_table>,%a2 46ec0: 9081 subl %d1,%d0 46ec2: d5c0 addal %d0,%a2 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 46ec4: 4a92 tstl %a2@ 46ec6: 660e bnes 46ed6 46ec8: 4aaa 0004 tstl %a2@(4) 46ecc: 57c0 seq %d0 46ece: 49c0 extbl %d0 46ed0: 4480 negl %d0 } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; if ( !rtems_io_is_empty_table( table ) ) { 46ed2: 4a00 tstb %d0 46ed4: 660a bnes 46ee0 _Thread_Enable_dispatch(); 46ed6: 4eb9 0004 86da jsr 486da <_Thread_Enable_dispatch> 46edc: 700c moveq #12,%d0 return RTEMS_RESOURCE_IN_USE; 46ede: 6048 bras 46f28 } *registered_major = major; 46ee0: 2282 movel %d2,%a1@ } _IO_Driver_address_table [major] = *driver_table; 46ee2: 4878 0018 pea 18 46ee6: 2202 movel %d2,%d1 46ee8: 2002 movel %d2,%d0 46eea: e789 lsll #3,%d1 46eec: eb88 lsll #5,%d0 46eee: 2f08 movel %a0,%sp@- 46ef0: 9081 subl %d1,%d0 46ef2: d0b9 0006 13fe addl 613fe <_IO_Driver_address_table>,%d0 46ef8: 2f00 movel %d0,%sp@- 46efa: 4eb9 0005 0f98 jsr 50f98 _Thread_Enable_dispatch(); 46f00: 4eb9 0004 86da jsr 486da <_Thread_Enable_dispatch> return rtems_io_initialize( major, 0, NULL ); } 46f06: 246e fffc moveal %fp@(-4),%a2 _IO_Driver_address_table [major] = *driver_table; _Thread_Enable_dispatch(); return rtems_io_initialize( major, 0, NULL ); 46f0a: 4fef 000c lea %sp@(12),%sp 46f0e: 2d42 0008 movel %d2,%fp@(8) } 46f12: 242e fff8 movel %fp@(-8),%d2 _IO_Driver_address_table [major] = *driver_table; _Thread_Enable_dispatch(); return rtems_io_initialize( major, 0, NULL ); 46f16: 42ae 0010 clrl %fp@(16) 46f1a: 42ae 000c clrl %fp@(12) } 46f1e: 4e5e unlk %fp _IO_Driver_address_table [major] = *driver_table; _Thread_Enable_dispatch(); return rtems_io_initialize( major, 0, NULL ); 46f20: 4ef9 0004 e4ac jmp 4e4ac 46f26: 7009 moveq #9,%d0 } 46f28: 242e fff8 movel %fp@(-8),%d2 46f2c: 246e fffc moveal %fp@(-4),%a2 46f30: 4e5e unlk %fp 46f32: 4e75 rts return RTEMS_INVALID_ADDRESS; if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; if ( major >= major_limit ) 46f34: b082 cmpl %d2,%d0 46f36: 6200 ff3c bhiw 46e74 46f3a: 700a moveq #10,%d0 46f3c: 60ea bras 46f28 rtems_device_major_number n = _IO_Number_of_drivers; rtems_device_major_number m = 0; /* major is error checked by caller */ for ( m = 0; m < n; ++m ) { 46f3e: 5282 addql #1,%d2 46f40: 45ea 0018 lea %a2@(24),%a2 46f44: 6000 ff5e braw 46ea4 if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); 46f48: 4eb9 0004 86da jsr 486da <_Thread_Enable_dispatch> 46f4e: 7005 moveq #5,%d0 return sc; 46f50: 60d6 bras 46f28 ... =============================================================================== 00047c20 : #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { 47c20: 4e56 fff0 linkw %fp,#-16 47c24: 48d7 1c04 moveml %d2/%a2-%a4,%sp@ 47c28: 286e 0008 moveal %fp@(8),%a4 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 47c2c: 4a8c tstl %a4 47c2e: 6740 beqs 47c70 <== NEVER TAKEN 47c30: 45f9 0006 00f8 lea 600f8 <_Objects_Information_table+0x4>,%a2 return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { if ( !_Objects_Information_table[ api_index ] ) 47c36: 2052 moveal %a2@,%a0 47c38: 4a88 tstl %a0 47c3a: 672a beqs 47c66 continue; information = _Objects_Information_table[ api_index ][ 1 ]; 47c3c: 2668 0004 moveal %a0@(4),%a3 if ( !information ) 47c40: 4a8b tstl %a3 47c42: 6722 beqs 47c66 47c44: 7401 moveq #1,%d2 47c46: 6014 bras 47c5c continue; for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; 47c48: 206b 0018 moveal %a3@(24),%a0 47c4c: 2030 2c00 movel %a0@(00000000,%d2:l:4),%d0 information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 47c50: 5282 addql #1,%d2 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) 47c52: 4a80 tstl %d0 47c54: 6706 beqs 47c5c <== NEVER TAKEN continue; (*routine)(the_thread); 47c56: 2f00 movel %d0,%sp@- 47c58: 4e94 jsr %a4@ 47c5a: 588f addql #4,%sp information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 47c5c: 4280 clrl %d0 47c5e: 302b 000e movew %a3@(14),%d0 47c62: b082 cmpl %d2,%d0 47c64: 64e2 bccs 47c48 47c66: 588a addql #4,%a2 Objects_Information *information; if ( !routine ) return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 47c68: b5fc 0006 0108 cmpal #393480,%a2 47c6e: 66c6 bnes 47c36 (*routine)(the_thread); } } } 47c70: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4 47c76: 4e5e unlk %fp ... =============================================================================== 0004fc20 : rtems_status_code rtems_partition_return_buffer( rtems_id id, void *buffer ) { 4fc20: 4e56 fffc linkw %fp,#-4 4fc24: 2f0a movel %a2,%sp@- 4fc26: 2f02 movel %d2,%sp@- RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get ( Objects_Id id, Objects_Locations *location ) { return (Partition_Control *) 4fc28: 486e fffc pea %fp@(-4) 4fc2c: 2f2e 0008 movel %fp@(8),%sp@- 4fc30: 4879 0007 610c pea 7610c <_Partition_Information> 4fc36: 242e 000c movel %fp@(12),%d2 4fc3a: 4eb9 0005 3f24 jsr 53f24 <_Objects_Get> register Partition_Control *the_partition; Objects_Locations location; the_partition = _Partition_Get( id, &location ); switch ( location ) { 4fc40: 4fef 000c lea %sp@(12),%sp 4fc44: 2440 moveal %d0,%a2 4fc46: 4aae fffc tstl %fp@(-4) 4fc4a: 6704 beqs 4fc50 4fc4c: 7004 moveq #4,%d0 4fc4e: 603c bras 4fc8c ) { void *starting; void *ending; starting = the_partition->starting_address; 4fc50: 202a 0010 movel %a2@(16),%d0 ending = _Addresses_Add_offset( starting, the_partition->length ); 4fc54: 222a 0014 movel %a2@(20),%d1 const void *address, const void *base, const void *limit ) { return (address >= base && address <= limit); 4fc58: b082 cmpl %d2,%d0 4fc5a: 623c bhis 4fc98 4fc5c: d280 addl %d0,%d1 4fc5e: b282 cmpl %d2,%d1 4fc60: 6536 bcss 4fc98 <== NEVER TAKEN return ( 4fc62: 2202 movel %d2,%d1 4fc64: 9280 subl %d0,%d1 4fc66: 2001 movel %d1,%d0 4fc68: 4c6a 0001 0018 remul %a2@(24),%d1,%d0 4fc6e: 4a81 tstl %d1 4fc70: 6626 bnes 4fc98 RTEMS_INLINE_ROUTINE void _Partition_Free_buffer ( Partition_Control *the_partition, Chain_Node *the_buffer ) { _Chain_Append( &the_partition->Memory, the_buffer ); 4fc72: 2f02 movel %d2,%sp@- 4fc74: 486a 0024 pea %a2@(36) 4fc78: 4eb9 0005 2810 jsr 52810 <_Chain_Append> case OBJECTS_LOCAL: if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) { _Partition_Free_buffer( the_partition, buffer ); the_partition->number_of_used_blocks -= 1; 4fc7e: 53aa 0020 subql #1,%a2@(32) _Thread_Enable_dispatch(); 4fc82: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 4fc88: 508f addql #8,%sp case OBJECTS_LOCAL: if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) { _Partition_Free_buffer( the_partition, buffer ); the_partition->number_of_used_blocks -= 1; _Thread_Enable_dispatch(); 4fc8a: 4280 clrl %d0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 4fc8c: 242e fff4 movel %fp@(-12),%d2 4fc90: 246e fff8 moveal %fp@(-8),%a2 4fc94: 4e5e unlk %fp 4fc96: 4e75 rts _Partition_Free_buffer( the_partition, buffer ); the_partition->number_of_used_blocks -= 1; _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 4fc98: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> 4fc9e: 7009 moveq #9,%d0 return RTEMS_INVALID_ADDRESS; 4fca0: 60ea bras 4fc8c ... =============================================================================== 000464c0 : rtems_status_code rtems_rate_monotonic_period( rtems_id id, rtems_interval length ) { 464c0: 4e56 ffec linkw %fp,#-20 464c4: 48d7 041c moveml %d2-%d4/%a2,%sp@ RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get ( Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) 464c8: 486e fffc pea %fp@(-4) 464cc: 262e 0008 movel %fp@(8),%d3 464d0: 2f03 movel %d3,%sp@- 464d2: 4879 0005 f748 pea 5f748 <_Rate_monotonic_Information> 464d8: 242e 000c movel %fp@(12),%d2 464dc: 4eb9 0004 83ac jsr 483ac <_Objects_Get> rtems_rate_monotonic_period_states local_state; ISR_Level level; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { 464e2: 4fef 000c lea %sp@(12),%sp 464e6: 2440 moveal %d0,%a2 464e8: 4aae fffc tstl %fp@(-4) 464ec: 6600 0138 bnew 46626 case OBJECTS_LOCAL: if ( !_Thread_Is_executing( the_period->owner ) ) { 464f0: 2039 0005 f8fe movel 5f8fe <_Thread_Executing>,%d0 464f6: b0aa 0040 cmpl %a2@(64),%d0 464fa: 670c beqs 46508 _Thread_Enable_dispatch(); 464fc: 4eb9 0004 8bfa jsr 48bfa <_Thread_Enable_dispatch> 46502: 7817 moveq #23,%d4 return RTEMS_NOT_OWNER_OF_RESOURCE; 46504: 6000 0122 braw 46628 } if ( length == RTEMS_PERIOD_STATUS ) { 46508: 4a82 tstl %d2 4650a: 6622 bnes 4652e switch ( the_period->state ) { 4650c: 202a 0038 movel %a2@(56),%d0 46510: 7204 moveq #4,%d1 46512: b280 cmpl %d0,%d1 46514: 6404 bccs 4651a <== ALWAYS TAKEN 46516: 4284 clrl %d4 <== NOT EXECUTED 46518: 600a bras 46524 <== NOT EXECUTED 4651a: 41f9 0005 cd42 lea 5cd42 ,%a0 46520: 2830 0c00 movel %a0@(00000000,%d0:l:4),%d4 case RATE_MONOTONIC_ACTIVE: default: /* unreached -- only to remove warnings */ return_value = RTEMS_SUCCESSFUL; break; } _Thread_Enable_dispatch(); 46524: 4eb9 0004 8bfa jsr 48bfa <_Thread_Enable_dispatch> return( return_value ); 4652a: 6000 00fc braw 46628 } _ISR_Disable( level ); 4652e: 203c 0000 0700 movel #1792,%d0 46534: 40c4 movew %sr,%d4 46536: 8084 orl %d4,%d0 46538: 46c0 movew %d0,%sr switch ( the_period->state ) { 4653a: 202a 0038 movel %a2@(56),%d0 4653e: 7202 moveq #2,%d1 46540: b280 cmpl %d0,%d1 46542: 6740 beqs 46584 46544: 123c 0004 moveb #4,%d1 46548: b280 cmpl %d0,%d1 4654a: 6700 00a4 beqw 465f0 4654e: 4a80 tstl %d0 46550: 6600 00d4 bnew 46626 case RATE_MONOTONIC_INACTIVE: { _ISR_Enable( level ); 46554: 46c4 movew %d4,%sr /* * Baseline statistics information for the beginning of a period. */ _Rate_monotonic_Initiate_statistics( the_period ); 46556: 2f0a movel %a2,%sp@- ); the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); 46558: 4284 clrl %d4 _ISR_Enable( level ); /* * Baseline statistics information for the beginning of a period. */ _Rate_monotonic_Initiate_statistics( the_period ); 4655a: 4eb9 0004 62ac jsr 462ac <_Rate_monotonic_Initiate_statistics> Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 46560: 203c 0004 686c movel #288876,%d0 the_period->state = RATE_MONOTONIC_ACTIVE; 46566: 7202 moveq #2,%d1 46568: 2540 002c movel %d0,%a2@(44) the_watchdog->id = id; 4656c: 2543 0030 movel %d3,%a2@(48) Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 46570: 2542 001c movel %d2,%a2@(28) 46574: 2541 0038 movel %d1,%a2@(56) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 46578: 42aa 0018 clrl %a2@(24) the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 4657c: 42aa 0034 clrl %a2@(52) 46580: 6000 0084 braw 46606 case RATE_MONOTONIC_ACTIVE: /* * Update statistics from the concluding period. */ _Rate_monotonic_Update_statistics( the_period ); 46584: 2f0a movel %a2,%sp@- 46586: 4eb9 0004 63cc jsr 463cc <_Rate_monotonic_Update_statistics> * This tells the _Rate_monotonic_Timeout that this task is * in the process of blocking on the period and that we * may be changing the length of the next period. */ the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; the_period->next_length = length; 4658c: 2542 003c movel %d2,%a2@(60) /* * This tells the _Rate_monotonic_Timeout that this task is * in the process of blocking on the period and that we * may be changing the length of the next period. */ the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; 46590: 7401 moveq #1,%d2 46592: 2542 0038 movel %d2,%a2@(56) the_period->next_length = length; _ISR_Enable( level ); 46596: 46c4 movew %d4,%sr _Thread_Executing->Wait.id = the_period->Object.id; 46598: 2079 0005 f8fe moveal 5f8fe <_Thread_Executing>,%a0 4659e: 216a 0008 0020 movel %a2@(8),%a0@(32) _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 465a4: 4878 4000 pea 4000 465a8: 2f08 movel %a0,%sp@- 465aa: 4eb9 0004 9430 jsr 49430 <_Thread_Set_state> /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); 465b0: 203c 0000 0700 movel #1792,%d0 465b6: 40c1 movew %sr,%d1 465b8: 8081 orl %d1,%d0 465ba: 46c0 movew %d0,%sr local_state = the_period->state; the_period->state = RATE_MONOTONIC_ACTIVE; 465bc: 143c 0002 moveb #2,%d2 /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); local_state = the_period->state; 465c0: 202a 0038 movel %a2@(56),%d0 the_period->state = RATE_MONOTONIC_ACTIVE; 465c4: 2542 0038 movel %d2,%a2@(56) _ISR_Enable( level ); 465c8: 46c1 movew %d1,%sr /* * If it did, then we want to unblock ourself and continue as * if nothing happen. The period was reset in the timeout routine. */ if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING ) 465ca: 7203 moveq #3,%d1 465cc: 4fef 000c lea %sp@(12),%sp 465d0: b280 cmpl %d0,%d1 465d2: 6612 bnes 465e6 _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 465d4: 4878 4000 pea 4000 465d8: 2f39 0005 f8fe movel 5f8fe <_Thread_Executing>,%sp@- 465de: 4eb9 0004 8840 jsr 48840 <_Thread_Clear_state> 465e4: 508f addql #8,%sp _Thread_Enable_dispatch(); 465e6: 4eb9 0004 8bfa jsr 48bfa <_Thread_Enable_dispatch> 465ec: 4284 clrl %d4 return RTEMS_SUCCESSFUL; 465ee: 6038 bras 46628 case RATE_MONOTONIC_EXPIRED: /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); 465f0: 2f0a movel %a2,%sp@- 465f2: 4eb9 0004 63cc jsr 463cc <_Rate_monotonic_Update_statistics> _ISR_Enable( level ); 465f8: 46c4 movew %d4,%sr the_period->state = RATE_MONOTONIC_ACTIVE; 465fa: 7002 moveq #2,%d0 the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); 465fc: 7806 moveq #6,%d4 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 465fe: 2542 001c movel %d2,%a2@(28) */ _Rate_monotonic_Update_statistics( the_period ); _ISR_Enable( level ); the_period->state = RATE_MONOTONIC_ACTIVE; 46602: 2540 0038 movel %d0,%a2@(56) the_period->next_length = length; 46606: 2542 003c movel %d2,%a2@(60) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 4660a: 486a 0010 pea %a2@(16) 4660e: 4879 0005 f91c pea 5f91c <_Watchdog_Ticks_chain> 46614: 4eb9 0004 9c2c jsr 49c2c <_Watchdog_Insert> _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); 4661a: 4eb9 0004 8bfa jsr 48bfa <_Thread_Enable_dispatch> return RTEMS_TIMEOUT; 46620: 4fef 000c lea %sp@(12),%sp 46624: 6002 bras 46628 46626: 7804 moveq #4,%d4 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 46628: 2004 movel %d4,%d0 4662a: 4cee 041c ffec moveml %fp@(-20),%d2-%d4/%a2 46630: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00050818 : rtems_status_code rtems_region_get_segment_size( rtems_id id, void *segment, uintptr_t *size ) { 50818: 4e56 fffc linkw %fp,#-4 5081c: 2f03 movel %d3,%sp@- 5081e: 262e 0010 movel %fp@(16),%d3 50822: 2f02 movel %d2,%sp@- 50824: 242e 000c movel %fp@(12),%d2 Objects_Locations location; rtems_status_code return_status = RTEMS_SUCCESSFUL; register Region_Control *the_region; if ( !segment ) 50828: 6766 beqs 50890 return RTEMS_INVALID_ADDRESS; if ( !size ) 5082a: 4a83 tstl %d3 5082c: 6762 beqs 50890 return RTEMS_INVALID_ADDRESS; _RTEMS_Lock_allocator(); 5082e: 2f39 0007 632a movel 7632a <_RTEMS_Allocator_Mutex>,%sp@- 50834: 4eb9 0005 277c jsr 5277c <_API_Mutex_Lock> 5083a: 486e fffc pea %fp@(-4) 5083e: 2f2e 0008 movel %fp@(8),%sp@- 50842: 4879 0007 617c pea 7617c <_Region_Information> 50848: 4eb9 0005 3eec jsr 53eec <_Objects_Get_no_protection> the_region = _Region_Get( id, &location ); switch ( location ) { 5084e: 222e fffc movel %fp@(-4),%d1 50852: 4fef 0010 lea %sp@(16),%sp 50856: 670a beqs 50862 50858: 7001 moveq #1,%d0 5085a: b081 cmpl %d1,%d0 5085c: 6620 bnes 5087e <== NEVER TAKEN 5085e: 7404 moveq #4,%d2 50860: 601e bras 50880 case OBJECTS_LOCAL: if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) ) 50862: 2f03 movel %d3,%sp@- 50864: 2040 moveal %d0,%a0 50866: 2f02 movel %d2,%sp@- 50868: 4868 0068 pea %a0@(104) 5086c: 4eb9 0005 396c jsr 5396c <_Heap_Size_of_alloc_area> 50872: 4fef 000c lea %sp@(12),%sp 50876: 4a00 tstb %d0 50878: 6604 bnes 5087e 5087a: 7409 moveq #9,%d2 <== NOT EXECUTED 5087c: 6002 bras 50880 <== NOT EXECUTED 5087e: 4282 clrl %d2 case OBJECTS_ERROR: return_status = RTEMS_INVALID_ID; break; } _RTEMS_Unlock_allocator(); 50880: 2f39 0007 632a movel 7632a <_RTEMS_Allocator_Mutex>,%sp@- 50886: 4eb9 0005 27dc jsr 527dc <_API_Mutex_Unlock> return return_status; 5088c: 588f addql #4,%sp 5088e: 6002 bras 50892 50890: 7409 moveq #9,%d2 } 50892: 2002 movel %d2,%d0 50894: 242e fff4 movel %fp@(-12),%d2 50898: 262e fff8 movel %fp@(-8),%d3 5089c: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00050eb0 : rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { 50eb0: 4e56 fffc linkw %fp,#-4 50eb4: 2f03 movel %d3,%sp@- 50eb6: 2f02 movel %d2,%sp@- 50eb8: 242e 000c movel %fp@(12),%d2 register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) 50ebc: 6606 bnes 50ec4 50ebe: 700a moveq #10,%d0 50ec0: 6000 0084 braw 50f46 return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); 50ec4: 486e fffc pea %fp@(-4) 50ec8: 2f2e 0008 movel %fp@(8),%sp@- 50ecc: 4eb9 0005 484c jsr 5484c <_Thread_Get> switch ( location ) { 50ed2: 508f addql #8,%sp 50ed4: 4aae fffc tstl %fp@(-4) 50ed8: 6704 beqs 50ede 50eda: 7004 moveq #4,%d0 50edc: 6068 bras 50f46 case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; 50ede: 2240 moveal %d0,%a1 50ee0: 2069 0108 moveal %a1@(264),%a0 asr = &api->Signal; 50ee4: 4aa8 000a tstl %a0@(10) 50ee8: 6754 beqs 50f3e if ( ! _ASR_Is_null_handler( asr->handler ) ) { if ( asr->is_enabled ) { 50eea: 4a28 0008 tstb %a0@(8) 50eee: 6732 beqs 50f22 rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 50ef0: 223c 0000 0700 movel #1792,%d1 50ef6: 40c3 movew %sr,%d3 50ef8: 8283 orl %d3,%d1 50efa: 46c1 movew %d1,%sr *signal_set |= signals; 50efc: 85a8 0012 orl %d2,%a0@(18) _ISR_Enable( _level ); 50f00: 46c3 movew %d3,%sr _ASR_Post_signals( signal_set, &asr->signals_posted ); the_thread->do_post_task_switch_extension = true; if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 50f02: 2239 0007 6312 movel 76312 <_ISR_Nest_level>,%d1 if ( ! _ASR_Is_null_handler( asr->handler ) ) { if ( asr->is_enabled ) { _ASR_Post_signals( signal_set, &asr->signals_posted ); the_thread->do_post_task_switch_extension = true; 50f08: 7401 moveq #1,%d2 50f0a: 1342 0074 moveb %d2,%a1@(116) if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 50f0e: 4a81 tstl %d1 50f10: 6722 beqs 50f34 50f12: b0b9 0007 6332 cmpl 76332 <_Thread_Executing>,%d0 50f18: 661a bnes 50f34 <== NEVER TAKEN _ISR_Signals_to_thread_executing = true; 50f1a: 13c2 0007 63bc moveb %d2,763bc <_ISR_Signals_to_thread_executing> 50f20: 6012 bras 50f34 rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 50f22: 203c 0000 0700 movel #1792,%d0 50f28: 40c1 movew %sr,%d1 50f2a: 8081 orl %d1,%d0 50f2c: 46c0 movew %d0,%sr *signal_set |= signals; 50f2e: 85a8 0016 orl %d2,%a0@(22) _ISR_Enable( _level ); 50f32: 46c1 movew %d1,%sr } else { _ASR_Post_signals( signal_set, &asr->signals_pending ); } _Thread_Enable_dispatch(); 50f34: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> 50f3a: 4280 clrl %d0 return RTEMS_SUCCESSFUL; 50f3c: 6008 bras 50f46 } _Thread_Enable_dispatch(); 50f3e: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> 50f44: 700b moveq #11,%d0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 50f46: 242e fff4 movel %fp@(-12),%d2 50f4a: 262e fff8 movel %fp@(-8),%d3 50f4e: 4e5e unlk %fp ... =============================================================================== 0004cc14 : rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { 4cc14: 4e56 ffe4 linkw %fp,#-28 4cc18: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@ 4cc1c: 262e 0008 movel %fp@(8),%d3 4cc20: 282e 000c movel %fp@(12),%d4 4cc24: 286e 0010 moveal %fp@(16),%a4 ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) 4cc28: 4a8c tstl %a4 4cc2a: 6606 bnes 4cc32 4cc2c: 7009 moveq #9,%d0 4cc2e: 6000 00fc braw 4cd2c return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; 4cc32: 2479 0005 dcd6 moveal 5dcd6 <_Thread_Executing>,%a2 api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 4cc38: 4a2a 0075 tstb %a2@(117) 4cc3c: 57c0 seq %d0 4cc3e: 243c 0000 0100 movel #256,%d2 4cc44: 49c0 extbl %d0 if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; 4cc46: 266a 0108 moveal %a2@(264),%a3 asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 4cc4a: c480 andl %d0,%d2 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 4cc4c: 4aaa 007a tstl %a2@(122) 4cc50: 6704 beqs 4cc56 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; 4cc52: 08c2 0009 bset #9,%d2 if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; 4cc56: 4a2b 0008 tstb %a3@(8) 4cc5a: 57c0 seq %d0 4cc5c: 2a3c 0000 0400 movel #1024,%d5 4cc62: 49c0 extbl %d0 4cc64: ca80 andl %d0,%d5 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; old_mode |= _ISR_Get_level(); 4cc66: 4eb9 0004 88f0 jsr 488f0 <_CPU_ISR_Get_level> if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 4cc6c: 8085 orl %d5,%d0 old_mode |= _ISR_Get_level(); *previous_mode_set = old_mode; 4cc6e: 8082 orl %d2,%d0 4cc70: 2880 movel %d0,%a4@ /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) 4cc72: 0804 0008 btst #8,%d4 4cc76: 670e beqs 4cc86 executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; 4cc78: 2003 movel %d3,%d0 4cc7a: 7201 moveq #1,%d1 4cc7c: e088 lsrl #8,%d0 4cc7e: b380 eorl %d1,%d0 4cc80: c081 andl %d1,%d0 4cc82: 1540 0075 moveb %d0,%a2@(117) if ( mask & RTEMS_TIMESLICE_MASK ) { 4cc86: 0804 0009 btst #9,%d4 4cc8a: 671c beqs 4cca8 if ( _Modes_Is_timeslice(mode_set) ) { 4cc8c: 0803 0009 btst #9,%d3 4cc90: 6712 beqs 4cca4 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; executing->cpu_time_budget = _Thread_Ticks_per_timeslice; 4cc92: 41f9 0005 dbcc lea 5dbcc <_Thread_Ticks_per_timeslice>,%a0 if ( mask & RTEMS_PREEMPT_MASK ) executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; if ( mask & RTEMS_TIMESLICE_MASK ) { if ( _Modes_Is_timeslice(mode_set) ) { executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 4cc98: 7001 moveq #1,%d0 executing->cpu_time_budget = _Thread_Ticks_per_timeslice; 4cc9a: 2550 0076 movel %a0@,%a2@(118) if ( mask & RTEMS_PREEMPT_MASK ) executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; if ( mask & RTEMS_TIMESLICE_MASK ) { if ( _Modes_Is_timeslice(mode_set) ) { executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 4cc9e: 2540 007a movel %d0,%a2@(122) 4cca2: 6004 bras 4cca8 executing->cpu_time_budget = _Thread_Ticks_per_timeslice; } else executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 4cca4: 42aa 007a clrl %a2@(122) /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) 4cca8: 7007 moveq #7,%d0 4ccaa: c084 andl %d4,%d0 4ccac: 6712 beqs 4ccc0 */ RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level ( Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); 4ccae: 40c0 movew %sr,%d0 4ccb0: 7207 moveq #7,%d1 4ccb2: c283 andl %d3,%d1 4ccb4: 0280 0000 f8ff andil #63743,%d0 4ccba: e189 lsll #8,%d1 4ccbc: 8081 orl %d1,%d0 4ccbe: 46c0 movew %d0,%sr */ is_asr_enabled = false; needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { 4ccc0: 0804 000a btst #10,%d4 4ccc4: 6744 beqs 4cd0a * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( 4ccc6: 700a moveq #10,%d0 4ccc8: e0ab lsrl %d0,%d3 4ccca: 7201 moveq #1,%d1 if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; 4cccc: 4280 clrl %d0 4ccce: 102b 0008 moveb %a3@(8),%d0 * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( 4ccd2: b383 eorl %d1,%d3 4ccd4: c681 andl %d1,%d3 if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; 4ccd6: b083 cmpl %d3,%d0 4ccd8: 6730 beqs 4cd0a ) { rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); 4ccda: 203c 0000 0700 movel #1792,%d0 needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { asr->is_enabled = is_asr_enabled; 4cce0: 1743 0008 moveb %d3,%a3@(8) 4cce4: 40c1 movew %sr,%d1 4cce6: 8081 orl %d1,%d0 4cce8: 46c0 movew %d0,%sr _signals = information->signals_pending; 4ccea: 202b 0016 movel %a3@(22),%d0 information->signals_pending = information->signals_posted; 4ccee: 276b 0012 0016 movel %a3@(18),%a3@(22) information->signals_posted = _signals; 4ccf4: 2740 0012 movel %d0,%a3@(18) _ISR_Enable( _level ); 4ccf8: 46c1 movew %d1,%sr if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; 4ccfa: 4aab 0012 tstl %a3@(18) 4ccfe: 670a beqs 4cd0a if ( is_asr_enabled != asr->is_enabled ) { asr->is_enabled = is_asr_enabled; _ASR_Swap_signals( asr ); if ( _ASR_Are_signals_pending( asr ) ) { needs_asr_dispatching = true; executing->do_post_task_switch_extension = true; 4cd00: 7001 moveq #1,%d0 4cd02: 7401 moveq #1,%d2 4cd04: 1540 0074 moveb %d0,%a2@(116) 4cd08: 6002 bras 4cd0c 4cd0a: 4202 clrb %d2 } } } if ( _System_state_Is_up( _System_state_Get() ) ) 4cd0c: 7203 moveq #3,%d1 4cd0e: b2b9 0005 dd9e cmpl 5dd9e <_System_state_Current>,%d1 4cd14: 6614 bnes 4cd2a <== NEVER TAKEN if ( _Thread_Evaluate_mode() || needs_asr_dispatching ) 4cd16: 4eb9 0004 cef0 jsr 4cef0 <_Thread_Evaluate_mode> 4cd1c: 4a00 tstb %d0 4cd1e: 6604 bnes 4cd24 4cd20: 4a02 tstb %d2 4cd22: 6706 beqs 4cd2a _Thread_Dispatch(); 4cd24: 4eb9 0004 74e0 jsr 474e0 <_Thread_Dispatch> 4cd2a: 4280 clrl %d0 return RTEMS_SUCCESSFUL; } 4cd2c: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4 4cd32: 4e5e unlk %fp ... =============================================================================== 0004955c : rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { 4955c: 4e56 fffc linkw %fp,#-4 49560: 2f0a movel %a2,%sp@- 49562: 246e 0010 moveal %fp@(16),%a2 49566: 2f02 movel %d2,%sp@- 49568: 242e 000c movel %fp@(12),%d2 register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 4956c: 6710 beqs 4957e 4956e: 4280 clrl %d0 49570: 1039 0005 fd62 moveb 5fd62 ,%d0 49576: b082 cmpl %d2,%d0 49578: 6404 bccs 4957e 4957a: 7013 moveq #19,%d0 4957c: 6054 bras 495d2 !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) 4957e: 4a8a tstl %a2 49580: 6604 bnes 49586 49582: 7009 moveq #9,%d0 49584: 604c bras 495d2 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); 49586: 486e fffc pea %fp@(-4) 4958a: 2f2e 0008 movel %fp@(8),%sp@- 4958e: 4eb9 0004 b1e8 jsr 4b1e8 <_Thread_Get> switch ( location ) { 49594: 508f addql #8,%sp return RTEMS_INVALID_PRIORITY; if ( !old_priority ) return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); 49596: 2040 moveal %d0,%a0 switch ( location ) { 49598: 4aae fffc tstl %fp@(-4) 4959c: 6704 beqs 495a2 4959e: 7004 moveq #4,%d0 495a0: 6030 bras 495d2 case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; 495a2: 24a8 0014 movel %a0@(20),%a2@ if ( new_priority != RTEMS_CURRENT_PRIORITY ) { 495a6: 4a82 tstl %d2 495a8: 6720 beqs 495ca the_thread->real_priority = new_priority; 495aa: 2142 0018 movel %d2,%a0@(24) if ( the_thread->resource_count == 0 || 495ae: 4aa8 001c tstl %a0@(28) 495b2: 6706 beqs 495ba the_thread->current_priority > new_priority ) 495b4: b4a8 0014 cmpl %a0@(20),%d2 495b8: 6410 bccs 495ca <== ALWAYS TAKEN _Thread_Change_priority( the_thread, new_priority, false ); 495ba: 42a7 clrl %sp@- 495bc: 2f02 movel %d2,%sp@- 495be: 2f08 movel %a0,%sp@- 495c0: 4eb9 0004 ac98 jsr 4ac98 <_Thread_Change_priority> 495c6: 4fef 000c lea %sp@(12),%sp } _Thread_Enable_dispatch(); 495ca: 4eb9 0004 b192 jsr 4b192 <_Thread_Enable_dispatch> 495d0: 4280 clrl %d0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 495d2: 242e fff4 movel %fp@(-12),%d2 495d6: 246e fff8 moveal %fp@(-8),%a2 495da: 4e5e unlk %fp ... =============================================================================== 00051738 : */ rtems_status_code rtems_timer_cancel( rtems_id id ) { 51738: 4e56 fffc linkw %fp,#-4 RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get ( Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) 5173c: 486e fffc pea %fp@(-4) 51740: 2f2e 0008 movel %fp@(8),%sp@- 51744: 4879 0007 64c6 pea 764c6 <_Timer_Information> 5174a: 4eb9 0005 3f24 jsr 53f24 <_Objects_Get> Timer_Control *the_timer; Objects_Locations location; the_timer = _Timer_Get( id, &location ); switch ( location ) { 51750: 4fef 000c lea %sp@(12),%sp 51754: 4aae fffc tstl %fp@(-4) 51758: 6704 beqs 5175e 5175a: 7004 moveq #4,%d0 5175c: 601e bras 5177c case OBJECTS_LOCAL: if ( !_Timer_Is_dormant_class( the_timer->the_class ) ) 5175e: 7204 moveq #4,%d1 51760: 2040 moveal %d0,%a0 51762: b2a8 0038 cmpl %a0@(56),%d1 51766: 670c beqs 51774 <== NEVER TAKEN (void) _Watchdog_Remove( &the_timer->Ticker ); 51768: 4868 0010 pea %a0@(16) 5176c: 4eb9 0005 5b30 jsr 55b30 <_Watchdog_Remove> 51772: 588f addql #4,%sp _Thread_Enable_dispatch(); 51774: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> 5177a: 4280 clrl %d0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 5177c: 4e5e unlk %fp <== NOT EXECUTED =============================================================================== 00051bbc : rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { 51bbc: 4e56 ffe8 linkw %fp,#-24 51bc0: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@ 51bc4: 282e 0008 movel %fp@(8),%d4 51bc8: 262e 000c movel %fp@(12),%d3 51bcc: 242e 0010 movel %fp@(16),%d2 Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; 51bd0: 2679 0007 64fe moveal 764fe <_Timer_server>,%a3 if ( !timer_server ) 51bd6: 4a8b tstl %a3 51bd8: 6606 bnes 51be0 51bda: 700e moveq #14,%d0 51bdc: 6000 00a4 braw 51c82 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) 51be0: 4a39 0007 628c tstb 7628c <_TOD_Is_set> 51be6: 6606 bnes 51bee <== ALWAYS TAKEN 51be8: 700b moveq #11,%d0 <== NOT EXECUTED 51bea: 6000 0096 braw 51c82 <== NOT EXECUTED return RTEMS_NOT_DEFINED; if ( !routine ) 51bee: 4a82 tstl %d2 51bf0: 6606 bnes 51bf8 51bf2: 7009 moveq #9,%d0 51bf4: 6000 008c braw 51c82 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 51bf8: 2f03 movel %d3,%sp@- 51bfa: 4eb9 0004 f038 jsr 4f038 <_TOD_Validate> 51c00: 588f addql #4,%sp 51c02: 4a00 tstb %d0 51c04: 677a beqs 51c80 return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 51c06: 2f03 movel %d3,%sp@- 51c08: 4eb9 0004 ef98 jsr 4ef98 <_TOD_To_seconds> if ( seconds <= _TOD_Seconds_since_epoch() ) 51c0e: 588f addql #4,%sp return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 51c10: 2600 movel %d0,%d3 if ( seconds <= _TOD_Seconds_since_epoch() ) 51c12: b0b9 0007 630a cmpl 7630a <_TOD_Now>,%d0 51c18: 6366 blss 51c80 51c1a: 486e fffc pea %fp@(-4) 51c1e: 2f04 movel %d4,%sp@- 51c20: 4879 0007 64c6 pea 764c6 <_Timer_Information> 51c26: 4eb9 0005 3f24 jsr 53f24 <_Objects_Get> return RTEMS_INVALID_CLOCK; the_timer = _Timer_Get( id, &location ); switch ( location ) { 51c2c: 4fef 000c lea %sp@(12),%sp 51c30: 2440 moveal %d0,%a2 51c32: 4aae fffc tstl %fp@(-4) 51c36: 6704 beqs 51c3c 51c38: 7004 moveq #4,%d0 51c3a: 6046 bras 51c82 case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); 51c3c: 486a 0010 pea %a2@(16) 51c40: 4eb9 0005 5b30 jsr 55b30 <_Watchdog_Remove> the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 51c46: 256e 0014 0034 movel %fp@(20),%a2@(52) the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; 51c4c: 7003 moveq #3,%d0 void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; 51c4e: 2544 0030 movel %d4,%a2@(48) _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); 51c52: 96b9 0007 630a subl 7630a <_TOD_Now>,%d3 the_timer = _Timer_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; 51c58: 2540 0038 movel %d0,%a2@(56) _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); 51c5c: 2543 001c movel %d3,%a2@(28) Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 51c60: 2542 002c movel %d2,%a2@(44) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 51c64: 42aa 0018 clrl %a2@(24) (*timer_server->schedule_operation)( timer_server, the_timer ); 51c68: 2f0a movel %a2,%sp@- 51c6a: 2f0b movel %a3,%sp@- 51c6c: 206b 0004 moveal %a3@(4),%a0 51c70: 4e90 jsr %a0@ _Thread_Enable_dispatch(); 51c72: 4eb9 0005 47f6 jsr 547f6 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 51c78: 4fef 000c lea %sp@(12),%sp _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); (*timer_server->schedule_operation)( timer_server, the_timer ); _Thread_Enable_dispatch(); 51c7c: 4280 clrl %d0 return RTEMS_SUCCESSFUL; 51c7e: 6002 bras 51c82 51c80: 7014 moveq #20,%d0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 51c82: 4cee 0c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a3 51c88: 4e5e unlk %fp <== NOT EXECUTED