RTEMS 4.11Annotated Report
Sat Dec 22 23:43:15 2012
0004d1fc <TOD_MICROSECONDS_TO_TICKS>:
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
microseconds_per_tick = rtems_configuration_get_microseconds_per_tick();
ticks = microseconds / microseconds_per_tick;
4d1fc: 41f9 0006 1a24 lea 61a24 <Configuration+0xc>,%a0
#include <rtems/score/tod.h>
uint32_t TOD_MICROSECONDS_TO_TICKS(
uint32_t microseconds
)
{
4d202: 4e56 0000 linkw %fp,#0
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
microseconds_per_tick = rtems_configuration_get_microseconds_per_tick();
ticks = microseconds / microseconds_per_tick;
4d206: 202e 0008 movel %fp@(8),%d0
4d20a: 4c50 0001 remul %a0@,%d1,%d0
4d20e: 4c50 0000 remul %a0@,%d0,%d0
if ( (microseconds % microseconds_per_tick) != 0 )
4d212: 4a81 tstl %d1
4d214: 6702 beqs 4d218 <TOD_MICROSECONDS_TO_TICKS+0x1c> <== ALWAYS TAKEN
ticks += 1;
4d216: 5280 addql #1,%d0 <== NOT EXECUTED
return ticks;
}
4d218: 4e5e unlk %fp <== NOT EXECUTED
00048cdc <TOD_MILLISECONDS_TO_TICKS>:
#include <rtems/score/tod.h>
uint32_t TOD_MILLISECONDS_TO_TICKS(
uint32_t milliseconds
)
{
48cdc: 4e56 0000 linkw %fp,#0
/**
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
milliseconds_per_tick = rtems_configuration_get_milliseconds_per_tick();
48ce0: 2039 0005 d6c4 movel 5d6c4 <Configuration+0xc>,%d0
#include <rtems/score/tod.h>
uint32_t TOD_MILLISECONDS_TO_TICKS(
uint32_t milliseconds
)
{
48ce6: 2f02 movel %d2,%sp@-
/**
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
milliseconds_per_tick = rtems_configuration_get_milliseconds_per_tick();
48ce8: 243c 0000 03e8 movel #1000,%d2
48cee: 4c42 0000 remul %d2,%d0,%d0
ticks = milliseconds / milliseconds_per_tick;
48cf2: 242e 0008 movel %fp@(8),%d2
48cf6: 4c40 2001 remul %d0,%d1,%d2
48cfa: 4c40 2002 remul %d0,%d2,%d2
48cfe: 2002 movel %d2,%d0
if ( (milliseconds % milliseconds_per_tick) != 0 )
48d00: 4a81 tstl %d1
48d02: 6702 beqs 48d06 <TOD_MILLISECONDS_TO_TICKS+0x2a> <== ALWAYS TAKEN
ticks += 1;
48d04: 5280 addql #1,%d0 <== NOT EXECUTED
return ticks;
}
48d06: 241f movel %sp@+,%d2
48d08: 4e5e unlk %fp <== NOT EXECUTED
00047f08 <_API_Mutex_Unlock>:
#include <rtems/score/apimutex.h>
void _API_Mutex_Unlock(
API_Mutex_Control *the_mutex
)
{
47f08: 4e56 0000 linkw %fp,#0
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
47f0c: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
++level;
47f12: 5280 addql #1,%d0
47f14: 206e 0008 moveal %fp@(8),%a0
_Thread_Dispatch_disable_level = level;
47f18: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
/* Dispatch is already disabled in SMP while lock is held. */
#if !defined(RTEMS_SMP)
_Thread_Disable_dispatch();
#endif
_CORE_mutex_Surrender(
47f1e: 42a7 clrl %sp@-
47f20: 2f28 0008 movel %a0@(8),%sp@-
47f24: 4868 0010 pea %a0@(16)
47f28: 4eb9 0004 8298 jsr 48298 <_CORE_mutex_Surrender>
&the_mutex->Mutex,
the_mutex->Object.id,
NULL
);
_Thread_Enable_dispatch();
47f2e: 4fef 000c lea %sp@(12),%sp
}
47f32: 4e5e unlk %fp
_CORE_mutex_Surrender(
&the_mutex->Mutex,
the_mutex->Object.id,
NULL
);
_Thread_Enable_dispatch();
47f34: 4ef9 0004 9c44 jmp 49c44 <_Thread_Enable_dispatch>
...
00047de2 <_API_extensions_Add_post_switch>:
void _API_extensions_Add_post_switch(
API_extensions_Post_switch_control *post_switch
)
{
47de2: 4e56 0000 linkw %fp,#0
47de6: 206e 0008 moveal %fp@(8),%a0
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
47dea: 4a90 tstl %a0@
47dec: 6704 beqs 47df2 <_API_extensions_Add_post_switch+0x10>
_Chain_Append_if_is_off_chain_unprotected(
&_API_extensions_Post_switch_list,
&post_switch->Node
);
}
47dee: 4e5e unlk %fp
47df0: 4e75 rts
47df2: 4aa8 0004 tstl %a0@(4)
47df6: 66f6 bnes 47dee <_API_extensions_Add_post_switch+0xc><== NEVER TAKEN
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
47df8: 2279 0005 fa82 moveal 5fa82 <_API_extensions_Post_switch_list+0x8>,%a1
47dfe: 4e5e unlk %fp
the_node->next = tail;
47e00: 20bc 0005 fa7e movel #391806,%a0@
tail->previous = the_node;
47e06: 23c8 0005 fa82 movel %a0,5fa82 <_API_extensions_Post_switch_list+0x8>
old_last->next = the_node;
47e0c: 2288 movel %a0,%a1@
the_node->previous = old_last;
47e0e: 2149 0004 movel %a1,%a0@(4)
00047e14 <_API_extensions_Run_postdriver>:
}
}
#endif
void _API_extensions_Run_postdriver( void )
{
47e14: 4e56 0000 linkw %fp,#0
47e18: 2f0a movel %a2,%sp@-
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
47e1a: 2479 0005 fb2a moveal 5fb2a <_API_extensions_List>,%a2
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
47e20: b5fc 0005 fb2e cmpal #391982,%a2
47e26: 6710 beqs 47e38 <_API_extensions_Run_postdriver+0x24><== NEVER TAKEN
* Currently all APIs configure this hook so it is always non-NULL.
*/
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
47e28: 206a 0008 moveal %a2@(8),%a0
47e2c: 4e90 jsr %a0@
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
47e2e: 2452 moveal %a2@,%a2
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
47e30: b5fc 0005 fb2e cmpal #391982,%a2
47e36: 66f0 bnes 47e28 <_API_extensions_Run_postdriver+0x14><== NEVER TAKEN
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
47e38: 246e fffc moveal %fp@(-4),%a2
47e3c: 4e5e unlk %fp <== NOT EXECUTED
0004f30c <_CORE_barrier_Wait>:
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
4f30c: 203c 0000 0700 movel #1792,%d0
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4f312: 4e56 fff4 linkw %fp,#-12
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
4f316: 2279 0006 2092 moveal 62092 <_Per_CPU_Information+0xe>,%a1
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4f31c: 48d7 001c moveml %d2-%d4,%sp@
4f320: 206e 0008 moveal %fp@(8),%a0
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
4f324: 42a9 0034 clrl %a1@(52)
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4f328: 242e 000c movel %fp@(12),%d2
4f32c: 262e 0014 movel %fp@(20),%d3
4f330: 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 );
4f334: 40c1 movew %sr,%d1
4f336: 8081 orl %d1,%d0
4f338: 46c0 movew %d0,%sr
the_barrier->number_of_waiting_threads++;
4f33a: 2028 0048 movel %a0@(72),%d0
4f33e: 5280 addql #1,%d0
4f340: 2140 0048 movel %d0,%a0@(72)
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
4f344: 4aa8 0040 tstl %a0@(64)
4f348: 6606 bnes 4f350 <_CORE_barrier_Wait+0x44>
if ( the_barrier->number_of_waiting_threads ==
4f34a: b0a8 0044 cmpl %a0@(68),%d0
4f34e: 672e beqs 4f37e <_CORE_barrier_Wait+0x72>
4f350: 7001 moveq #1,%d0
4f352: 2140 0030 movel %d0,%a0@(48)
return;
}
}
_Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
executing->Wait.queue = &the_barrier->Wait_queue;
4f356: 2348 0044 movel %a0,%a1@(68)
executing->Wait.id = id;
4f35a: 2342 0020 movel %d2,%a1@(32)
_ISR_Enable( level );
4f35e: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
4f360: 2d43 000c movel %d3,%fp@(12)
4f364: 203c 0004 bee0 movel #311008,%d0
4f36a: 2d48 0008 movel %a0,%fp@(8)
}
4f36e: 4cd7 001c moveml %sp@,%d2-%d4
_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 );
4f372: 2d40 0010 movel %d0,%fp@(16)
}
4f376: 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 );
4f378: 4ef9 0004 bb10 jmp 4bb10 <_Thread_queue_Enqueue_with_handler>
_ISR_Disable( level );
the_barrier->number_of_waiting_threads++;
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;
4f37e: 7001 moveq #1,%d0
4f380: 2340 0034 movel %d0,%a1@(52)
_ISR_Enable( level );
4f384: 46c1 movew %d1,%sr
_CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
4f386: 2d44 0010 movel %d4,%fp@(16)
4f38a: 2d42 000c movel %d2,%fp@(12)
executing->Wait.queue = &the_barrier->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
}
4f38e: 4cd7 001c moveml %sp@,%d2-%d4
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 );
4f392: 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 );
}
4f396: 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 );
4f398: 4ef9 0004 f2d0 jmp 4f2d0 <_CORE_barrier_Release>
...
00058830 <_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
)
{
58830: 4e56 ffe4 linkw %fp,#-28
58834: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
58838: 266e 0008 moveal %fp@(8),%a3
5883c: 282e 000c movel %fp@(12),%d4
58840: 242e 0010 movel %fp@(16),%d2
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
58844: b4ab 004c cmpl %a3@(76),%d2
58848: 6266 bhis 588b0 <_CORE_message_queue_Broadcast+0x80>
* 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 ) {
5884a: 4aab 0048 tstl %a3@(72)
5884e: 664e bnes 5889e <_CORE_message_queue_Broadcast+0x6e>
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
58850: 2f0b movel %a3,%sp@-
58852: 49f9 0005 b554 lea 5b554 <_Thread_queue_Dequeue>,%a4
* 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 ) {
58858: 4283 clrl %d3
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
5885a: 4bf9 0005 fe18 lea 5fe18 <memcpy>,%a5
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
58860: 4e94 jsr %a4@
58862: 588f addql #4,%sp
58864: 2440 moveal %d0,%a2
58866: 4a80 tstl %d0
58868: 6722 beqs 5888c <_CORE_message_queue_Broadcast+0x5c>
5886a: 2f02 movel %d2,%sp@-
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
5886c: 5283 addql #1,%d3
5886e: 2f04 movel %d4,%sp@-
58870: 2f2a 002c movel %a2@(44),%sp@-
58874: 4e95 jsr %a5@
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
58876: 206a 0028 moveal %a2@(40),%a0
5887a: 4fef 000c lea %sp@(12),%sp
5887e: 2082 movel %d2,%a0@
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
58880: 2f0b movel %a3,%sp@-
58882: 4e94 jsr %a4@
58884: 588f addql #4,%sp
58886: 2440 moveal %d0,%a2
58888: 4a80 tstl %d0
5888a: 66de bnes 5886a <_CORE_message_queue_Broadcast+0x3a><== NEVER TAKEN
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
5888c: 206e 001c moveal %fp@(28),%a0
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
58890: 4280 clrl %d0
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
58892: 2083 movel %d3,%a0@
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
58894: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
5889a: 4e5e unlk %fp
5889c: 4e75 rts
* 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;
5889e: 206e 001c moveal %fp@(28),%a0
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
588a2: 4280 clrl %d0
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
588a4: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
* 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;
588aa: 4290 clrl %a0@
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
588ac: 4e5e unlk %fp
588ae: 4e75 rts
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
588b0: 7001 moveq #1,%d0
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
588b2: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
588b8: 4e5e unlk %fp <== NOT EXECUTED
000552f4 <_CORE_message_queue_Close>:
void _CORE_message_queue_Close(
CORE_message_queue_Control *the_message_queue,
Thread_queue_Flush_callout remote_extract_callout,
uint32_t status
)
{
552f4: 4e56 0000 linkw %fp,#0
552f8: 2f0a movel %a2,%sp@-
/*
* This will flush blocked threads whether they were blocked on
* a send or receive.
*/
_Thread_queue_Flush(
552fa: 2f2e 0010 movel %fp@(16),%sp@-
552fe: 2f2e 000c movel %fp@(12),%sp@-
void _CORE_message_queue_Close(
CORE_message_queue_Control *the_message_queue,
Thread_queue_Flush_callout remote_extract_callout,
uint32_t status
)
{
55302: 246e 0008 moveal %fp@(8),%a2
/*
* This will flush blocked threads whether they were blocked on
* a send or receive.
*/
_Thread_queue_Flush(
55306: 2f0a movel %a2,%sp@-
55308: 4eb9 0005 0118 jsr 50118 <_Thread_queue_Flush>
* This removes all messages from the pending message queue. Since
* we just flushed all waiting threads, we don't have to worry about
* the flush satisfying any blocked senders as a side-effect.
*/
if ( the_message_queue->number_of_pending_messages != 0 )
5530e: 4fef 000c lea %sp@(12),%sp
55312: 4aaa 0048 tstl %a2@(72)
55316: 6612 bnes 5532a <_CORE_message_queue_Close+0x36>
(void) _CORE_message_queue_Flush_support( the_message_queue );
(void) _Workspace_Free( the_message_queue->message_buffers );
55318: 2d6a 005c 0008 movel %a2@(92),%fp@(8)
}
5531e: 246e fffc moveal %fp@(-4),%a2
55322: 4e5e unlk %fp
*/
if ( the_message_queue->number_of_pending_messages != 0 )
(void) _CORE_message_queue_Flush_support( the_message_queue );
(void) _Workspace_Free( the_message_queue->message_buffers );
55324: 4ef9 0005 09ec jmp 509ec <_Workspace_Free>
* we just flushed all waiting threads, we don't have to worry about
* the flush satisfying any blocked senders as a side-effect.
*/
if ( the_message_queue->number_of_pending_messages != 0 )
(void) _CORE_message_queue_Flush_support( the_message_queue );
5532a: 2f0a movel %a2,%sp@-
5532c: 4eb9 0005 5348 jsr 55348 <_CORE_message_queue_Flush_support>
(void) _Workspace_Free( the_message_queue->message_buffers );
55332: 2d6a 005c 0008 movel %a2@(92),%fp@(8)
* we just flushed all waiting threads, we don't have to worry about
* the flush satisfying any blocked senders as a side-effect.
*/
if ( the_message_queue->number_of_pending_messages != 0 )
(void) _CORE_message_queue_Flush_support( the_message_queue );
55338: 588f addql #4,%sp
(void) _Workspace_Free( the_message_queue->message_buffers );
}
5533a: 246e fffc moveal %fp@(-4),%a2
5533e: 4e5e unlk %fp
*/
if ( the_message_queue->number_of_pending_messages != 0 )
(void) _CORE_message_queue_Flush_support( the_message_queue );
(void) _Workspace_Free( the_message_queue->message_buffers );
55340: 4ef9 0005 09ec jmp 509ec <_Workspace_Free>
...
000507c0 <_CORE_message_queue_Initialize>:
/*
* Check if allocated_message_size is aligned to uintptr-size boundary.
* If not, it will increase allocated_message_size to multiplicity of pointer
* size.
*/
if (allocated_message_size & (sizeof(uintptr_t) - 1)) {
507c0: 7203 moveq #3,%d1
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
)
{
507c2: 4e56 ffe4 linkw %fp,#-28
507c6: 202e 0014 movel %fp@(20),%d0
507ca: 48d7 04fc moveml %d2-%d7/%a2,%sp@
507ce: 246e 0008 moveal %fp@(8),%a2
507d2: 282e 0010 movel %fp@(16),%d4
/*
* Check if allocated_message_size is aligned to uintptr-size boundary.
* If not, it will increase allocated_message_size to multiplicity of pointer
* size.
*/
if (allocated_message_size & (sizeof(uintptr_t) - 1)) {
507d6: c280 andl %d0,%d1
)
{
size_t message_buffering_required = 0;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
507d8: 2544 0044 movel %d4,%a2@(68)
the_message_queue->number_of_pending_messages = 0;
507dc: 42aa 0048 clrl %a2@(72)
the_message_queue->maximum_message_size = maximum_message_size;
507e0: 2540 004c movel %d0,%a2@(76)
/*
* Check if allocated_message_size is aligned to uintptr-size boundary.
* If not, it will increase allocated_message_size to multiplicity of pointer
* size.
*/
if (allocated_message_size & (sizeof(uintptr_t) - 1)) {
507e4: 4a81 tstl %d1
507e6: 6718 beqs 50800 <_CORE_message_queue_Initialize+0x40>
allocated_message_size += sizeof(uintptr_t);
507e8: 2200 movel %d0,%d1
507ea: 5881 addql #4,%d1
allocated_message_size &= ~(sizeof(uintptr_t) - 1);
507ec: 74fc moveq #-4,%d2
507ee: c282 andl %d2,%d1
/*
* Check for an overflow. It can occur while increasing allocated_message_size
* to multiplicity of uintptr_t above.
*/
if (allocated_message_size < maximum_message_size)
507f0: b280 cmpl %d0,%d1
507f2: 640e bccs 50802 <_CORE_message_queue_Initialize+0x42>
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
507f4: 4cee 04fc ffe4 moveml %fp@(-28),%d2-%d7/%a2
/*
* Check for an overflow. It can occur while increasing allocated_message_size
* to multiplicity of uintptr_t above.
*/
if (allocated_message_size < maximum_message_size)
return false;
507fa: 4200 clrb %d0
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
507fc: 4e5e unlk %fp
507fe: 4e75 rts
/*
* Check if allocated_message_size is aligned to uintptr-size boundary.
* If not, it will increase allocated_message_size to multiplicity of pointer
* size.
*/
if (allocated_message_size & (sizeof(uintptr_t) - 1)) {
50800: 2200 movel %d0,%d1
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
if ( !size_t_mult32_with_overflow(
50802: 2a01 movel %d1,%d5
50804: 0685 0000 0010 addil #16,%d5
size_t a,
size_t b,
size_t *c
)
{
long long x = (long long)a*b;
5080a: 2f05 movel %d5,%sp@-
if ( x > SIZE_MAX )
5080c: 4286 clrl %d6
5080e: 7eff moveq #-1,%d7
size_t a,
size_t b,
size_t *c
)
{
long long x = (long long)a*b;
50810: 42a7 clrl %sp@-
50812: 2f04 movel %d4,%sp@-
50814: 42a7 clrl %sp@-
50816: 4eb9 0006 3584 jsr 63584 <__muldi3>
5081c: 4fef 0010 lea %sp@(16),%sp
50820: 2400 movel %d0,%d2
50822: 2601 movel %d1,%d3
if ( x > SIZE_MAX )
50824: 9e83 subl %d3,%d7
50826: 9d82 subxl %d2,%d6
50828: 6dca blts 507f4 <_CORE_message_queue_Initialize+0x34>
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
5082a: 2f01 movel %d1,%sp@-
5082c: 4eb9 0005 3694 jsr 53694 <_Workspace_Allocate>
if (the_message_queue->message_buffers == 0)
50832: 588f addql #4,%sp
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
50834: 2540 005c movel %d0,%a2@(92)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
50838: 67ba beqs 507f4 <_CORE_message_queue_Initialize+0x34><== NEVER TAKEN
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
5083a: 2f05 movel %d5,%sp@-
*/
RTEMS_INLINE_ROUTINE bool _CORE_message_queue_Is_priority(
CORE_message_queue_Attributes *the_attribute
)
{
return
5083c: 7e01 moveq #1,%d7
5083e: 2f04 movel %d4,%sp@-
50840: 2f00 movel %d0,%sp@-
50842: 486a 0060 pea %a2@(96)
50846: 4eb9 0005 0758 jsr 50758 <_Chain_Initialize>
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
5084c: 4878 0006 pea 6 <EXTENDSFDF>
50850: 206e 000c moveal %fp@(12),%a0
50854: be90 cmpl %a0@,%d7
50856: 57c0 seq %d0
50858: 4878 0080 pea 80 <DBL_MANT_DIG+0x4b>
5085c: 49c0 extbl %d0
5085e: 4480 negl %d0
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
50860: 41ea 0054 lea %a2@(84),%a0
50864: 2f00 movel %d0,%sp@-
50866: 2548 0050 movel %a0,%a2@(80)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
5086a: 41ea 0050 lea %a2@(80),%a0
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
5086e: 42aa 0054 clrl %a2@(84)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
50872: 2548 0058 movel %a0,%a2@(88)
50876: 2f0a movel %a2,%sp@-
50878: 4eb9 0005 2e90 jsr 52e90 <_Thread_queue_Initialize>
5087e: 4fef 0020 lea %sp@(32),%sp
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
50882: 4cee 04fc ffe4 moveml %fp@(-28),%d2-%d7/%a2
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
50888: 7001 moveq #1,%d0
}
5088a: 4e5e unlk %fp
...
00050890 <_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 );
50890: 203c 0000 0700 movel #1792,%d0
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
50896: 4e56 ffe4 linkw %fp,#-28
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
5089a: 2079 0006 91a6 moveal 691a6 <_Per_CPU_Information+0xe>,%a0
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
508a0: 48d7 0c7c moveml %d2-%d6/%a2-%a3,%sp@
508a4: 246e 0008 moveal %fp@(8),%a2
508a8: 282e 000c movel %fp@(12),%d4
508ac: 242e 0010 movel %fp@(16),%d2
508b0: 226e 0014 moveal %fp@(20),%a1
508b4: 2a2e 001c movel %fp@(28),%d5
508b8: 1c2e 001b moveb %fp@(27),%d6
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;
508bc: 42a8 0034 clrl %a0@(52)
_ISR_Disable( level );
508c0: 40c1 movew %sr,%d1
508c2: 8081 orl %d1,%d0
508c4: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
508c6: 260a movel %a2,%d3
508c8: 200a movel %a2,%d0
508ca: 0683 0000 0050 addil #80,%d3
508d0: 0680 0000 0054 addil #84,%d0
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
508d6: 266a 0050 moveal %a2@(80),%a3
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
508da: b08b cmpl %a3,%d0
508dc: 674a beqs 50928 <_CORE_message_queue_Seize+0x98>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
508de: 2053 moveal %a3@,%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
508e0: 2143 0004 movel %d3,%a0@(4)
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
508e4: 53aa 0048 subql #1,%a2@(72)
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
508e8: 2548 0050 movel %a0,%a2@(80)
_ISR_Enable( level );
508ec: 46c1 movew %d1,%sr
*size_p = the_message->Contents.size;
508ee: 22ab 0008 movel %a3@(8),%a1@
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 );
508f2: 45ea 0060 lea %a2@(96),%a2
_Thread_Executing->Wait.count =
508f6: 2079 0006 91a6 moveal 691a6 <_Per_CPU_Information+0xe>,%a0
508fc: 42a8 0024 clrl %a0@(36)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
50900: 2f11 movel %a1@,%sp@-
50902: 486b 000c pea %a3@(12)
50906: 2f02 movel %d2,%sp@-
50908: 4eb9 0005 76b8 jsr 576b8 <memcpy>
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 );
5090e: 4fef 000c lea %sp@(12),%sp
50912: 2d4a 0008 movel %a2,%fp@(8)
50916: 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 );
}
5091a: 4cee 0c7c ffe4 moveml %fp@(-28),%d2-%d6/%a2-%a3
50920: 4e5e unlk %fp
50922: 4ef9 0005 06e4 jmp 506e4 <_Chain_Append>
return;
}
#endif
}
if ( !wait ) {
50928: 4a06 tstb %d6
5092a: 6612 bnes 5093e <_CORE_message_queue_Seize+0xae>
_ISR_Enable( level );
5092c: 46c1 movew %d1,%sr
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
5092e: 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 );
}
50930: 4cee 0c7c ffe4 moveml %fp@(-28),%d2-%d6/%a2-%a3
#endif
}
if ( !wait ) {
_ISR_Enable( level );
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
50936: 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 );
}
5093a: 4e5e unlk %fp
5093c: 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;
5093e: 7001 moveq #1,%d0
50940: 2540 0030 movel %d0,%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;
50944: 2142 002c movel %d2,%a0@(44)
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;
50948: 214a 0044 movel %a2,%a0@(68)
executing->Wait.id = id;
5094c: 2144 0020 movel %d4,%a0@(32)
executing->Wait.return_argument_second.mutable_object = buffer;
executing->Wait.return_argument = size_p;
50950: 2149 0028 movel %a1,%a0@(40)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
50954: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
50956: 2d45 000c movel %d5,%fp@(12)
5095a: 203c 0005 2f90 movel #339856,%d0
50960: 2d4a 0008 movel %a2,%fp@(8)
}
50964: 4cee 0c7c ffe4 moveml %fp@(-28),%d2-%d6/%a2-%a3
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 );
5096a: 2d40 0010 movel %d0,%fp@(16)
}
5096e: 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 );
50970: 4ef9 0005 2bc0 jmp 52bc0 <_Thread_queue_Enqueue_with_handler>
...
000481ac <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
481ac: 4e56 0000 linkw %fp,#0
* This routine returns true if thread dispatch indicates
* that we are in a critical section.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Dispatch_in_critical_section(void)
{
if ( _Thread_Dispatch_disable_level == 0 )
481b0: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
481b6: 2f0a movel %a2,%sp@-
481b8: 246e 0008 moveal %fp@(8),%a2
481bc: 2f02 movel %d2,%sp@-
481be: 142e 0013 moveb %fp@(19),%d2
481c2: 4a80 tstl %d0
481c4: 6768 beqs 4822e <_CORE_mutex_Seize+0x82>
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
481c6: 4a02 tstb %d2
481c8: 6700 0098 beqw 48262 <_CORE_mutex_Seize+0xb6>
481cc: 7001 moveq #1,%d0
481ce: b0b9 0005 fb6c cmpl 5fb6c <_System_state_Current>,%d0
481d4: 6500 00b2 bcsw 48288 <_CORE_mutex_Seize+0xdc>
481d8: 486e 0018 pea %fp@(24)
481dc: 2f0a movel %a2,%sp@-
481de: 4eb9 0004 c5ac jsr 4c5ac <_CORE_mutex_Seize_interrupt_trylock>
481e4: 508f addql #8,%sp
481e6: 4a80 tstl %d0
481e8: 6738 beqs 48222 <_CORE_mutex_Seize+0x76> <== ALWAYS TAKEN
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;
481ea: 7001 moveq #1,%d0
481ec: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
481f2: 2540 0030 movel %d0,%a2@(48)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
481f6: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
++level;
481fc: 5280 addql #1,%d0
481fe: 216e 000c 0020 movel %fp@(12),%a0@(32)
48204: 214a 0044 movel %a2,%a0@(68)
_Thread_Dispatch_disable_level = level;
48208: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
4820e: 202e 0018 movel %fp@(24),%d0
48212: 46c0 movew %d0,%sr
48214: 2f2e 0014 movel %fp@(20),%sp@-
48218: 2f0a movel %a2,%sp@-
4821a: 4eb9 0004 8114 jsr 48114 <_CORE_mutex_Seize_interrupt_blocking>
48220: 508f addql #8,%sp
}
48222: 242e fff8 movel %fp@(-8),%d2
48226: 246e fffc moveal %fp@(-4),%a2
4822a: 4e5e unlk %fp
4822c: 4e75 rts
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
4822e: 486e 0018 pea %fp@(24)
48232: 2f0a movel %a2,%sp@-
48234: 4eb9 0004 c5ac jsr 4c5ac <_CORE_mutex_Seize_interrupt_trylock>
4823a: 508f addql #8,%sp
4823c: 4a80 tstl %d0
4823e: 67e2 beqs 48222 <_CORE_mutex_Seize+0x76>
48240: 4a02 tstb %d2
48242: 66a6 bnes 481ea <_CORE_mutex_Seize+0x3e>
48244: 202e 0018 movel %fp@(24),%d0
48248: 46c0 movew %d0,%sr
4824a: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
48250: 7001 moveq #1,%d0
48252: 2140 0034 movel %d0,%a0@(52)
}
48256: 242e fff8 movel %fp@(-8),%d2
4825a: 246e fffc moveal %fp@(-4),%a2
4825e: 4e5e unlk %fp
48260: 4e75 rts
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
48262: 486e 0018 pea %fp@(24)
48266: 2f0a movel %a2,%sp@-
48268: 4eb9 0004 c5ac jsr 4c5ac <_CORE_mutex_Seize_interrupt_trylock>
4826e: 508f addql #8,%sp
48270: 4a80 tstl %d0
48272: 67ae beqs 48222 <_CORE_mutex_Seize+0x76> <== ALWAYS TAKEN
48274: 202e 0018 movel %fp@(24),%d0 <== NOT EXECUTED
48278: 46c0 movew %d0,%sr <== NOT EXECUTED
4827a: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0 <== NOT EXECUTED
48280: 7001 moveq #1,%d0 <== NOT EXECUTED
48282: 2140 0034 movel %d0,%a0@(52) <== NOT EXECUTED
48286: 60ce bras 48256 <_CORE_mutex_Seize+0xaa> <== NOT EXECUTED
48288: 4878 0012 pea 12 <INVALID_OPERATION+0x2>
4828c: 42a7 clrl %sp@-
4828e: 42a7 clrl %sp@-
48290: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
...
000483ec <_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
)
{
483ec: 4e56 0000 linkw %fp,#0
483f0: 2f0a movel %a2,%sp@-
483f2: 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)) ) {
483f6: 2f0a movel %a2,%sp@-
483f8: 4eb9 0004 9fb0 jsr 49fb0 <_Thread_queue_Dequeue>
483fe: 588f addql #4,%sp
48400: 4a80 tstl %d0
48402: 670a beqs 4840e <_CORE_semaphore_Surrender+0x22>
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
48404: 246e fffc moveal %fp@(-4),%a2
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
48408: 4280 clrl %d0
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
4840a: 4e5e unlk %fp
4840c: 4e75 rts
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
4840e: 303c 0700 movew #1792,%d0
48412: 40c1 movew %sr,%d1
48414: 8081 orl %d1,%d0
48416: 46c0 movew %d0,%sr
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
48418: 202a 0048 movel %a2@(72),%d0
4841c: b0aa 0040 cmpl %a2@(64),%d0
48420: 6412 bccs 48434 <_CORE_semaphore_Surrender+0x48> <== NEVER TAKEN
the_semaphore->count += 1;
48422: 5280 addql #1,%d0
48424: 2540 0048 movel %d0,%a2@(72)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
48428: 4280 clrl %d0
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
4842a: 46c1 movew %d1,%sr
}
return status;
}
4842c: 246e fffc moveal %fp@(-4),%a2
48430: 4e5e unlk %fp
48432: 4e75 rts
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
48434: 7004 moveq #4,%d0 <== NOT EXECUTED
_ISR_Enable( level );
48436: 46c1 movew %d1,%sr <== NOT EXECUTED
48438: 60f2 bras 4842c <_CORE_semaphore_Surrender+0x40> <== NOT EXECUTED
...
00047fb0 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
47fb0: 4e56 ffec linkw %fp,#-20
47fb4: 202e 0010 movel %fp@(16),%d0
47fb8: 48d7 043c moveml %d2-%d5/%a2,%sp@
47fbc: 246e 0008 moveal %fp@(8),%a2
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
47fc0: 2600 movel %d0,%d3
size_t node_size
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
47fc2: 280a movel %a2,%d4
47fc4: 5884 addql #4,%d4
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
47fc6: 5383 subql #1,%d3
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
47fc8: 242e 000c movel %fp@(12),%d2
47fcc: 222e 0014 movel %fp@(20),%d1
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
47fd0: 42aa 0004 clrl %a2@(4)
while ( count-- ) {
47fd4: 4a80 tstl %d0
47fd6: 672e beqs 48006 <_Chain_Initialize+0x56> <== NEVER TAKEN
47fd8: 2003 movel %d3,%d0
47fda: 2042 moveal %d2,%a0
47fdc: 224a moveal %a2,%a1
current->next = next;
47fde: 2288 movel %a0,%a1@
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
47fe0: 5380 subql #1,%d0
47fe2: 7aff moveq #-1,%d5
current->next = next;
next->previous = current;
47fe4: 2149 0004 movel %a1,%a0@(4)
47fe8: 2248 moveal %a0,%a1
current = next;
next = (Chain_Node *)
47fea: d1c1 addal %d1,%a0
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
47fec: ba80 cmpl %d0,%d5
47fee: 66ee bnes 47fde <_Chain_Initialize+0x2e>
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/isr.h>
void _Chain_Initialize(
47ff0: 4c03 1800 mulsl %d3,%d1
47ff4: 2042 moveal %d2,%a0
47ff6: d1c1 addal %d1,%a0
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
47ff8: 2084 movel %d4,%a0@
tail->previous = current;
47ffa: 2548 0008 movel %a0,%a2@(8)
}
47ffe: 4cd7 043c moveml %sp@,%d2-%d5/%a2
48002: 4e5e unlk %fp
48004: 4e75 rts
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
48006: 204a moveal %a2,%a0 <== NOT EXECUTED
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
48008: 2084 movel %d4,%a0@ <== NOT EXECUTED
tail->previous = current;
4800a: 2548 0008 movel %a0,%a2@(8) <== NOT EXECUTED
}
4800e: 4cd7 043c moveml %sp@,%d2-%d5/%a2 <== NOT EXECUTED
48012: 4e5e unlk %fp <== NOT EXECUTED
...
00046fa8 <_Event_Surrender>:
rtems_event_set seized_events;
rtems_option option_set;
option_set = the_thread->Wait.option;
_ISR_Disable( level );
46fa8: 223c 0000 0700 movel #1792,%d1
rtems_event_set event_in,
Event_Control *event,
Thread_blocking_operation_States *sync_state,
States_Control wait_state
)
{
46fae: 4e56 ffe4 linkw %fp,#-28
46fb2: 202e 000c movel %fp@(12),%d0
46fb6: 48d7 04fc moveml %d2-%d7/%a2,%sp@
46fba: 246e 0008 moveal %fp@(8),%a2
46fbe: 206e 0010 moveal %fp@(16),%a0
rtems_event_set pending_events;
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
option_set = the_thread->Wait.option;
46fc2: 2a2a 0030 movel %a2@(48),%d5
rtems_event_set event_in,
Event_Control *event,
Thread_blocking_operation_States *sync_state,
States_Control wait_state
)
{
46fc6: 226e 0014 moveal %fp@(20),%a1
46fca: 282e 0018 movel %fp@(24),%d4
rtems_event_set seized_events;
rtems_option option_set;
option_set = the_thread->Wait.option;
_ISR_Disable( level );
46fce: 40c3 movew %sr,%d3
46fd0: 8283 orl %d3,%d1
46fd2: 46c1 movew %d1,%sr
RTEMS_INLINE_ROUTINE void _Event_sets_Post(
rtems_event_set the_new_events,
rtems_event_set *the_event_set
)
{
*the_event_set |= the_new_events;
46fd4: 8090 orl %a0@,%d0
46fd6: 2080 movel %d0,%a0@
_Event_sets_Post( event_in, &event->pending_events );
pending_events = event->pending_events;
event_condition = the_thread->Wait.count;
46fd8: 242a 0024 movel %a2@(36),%d2
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 );
46fdc: 2200 movel %d0,%d1
46fde: c282 andl %d2,%d1
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
46fe0: 6700 0090 beqw 47072 <_Event_Surrender+0xca>
/*
* 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() &&
46fe4: 4ab9 0005 fb78 tstl 5fb78 <_Per_CPU_Information+0x8>
46fea: 6708 beqs 46ff4 <_Event_Surrender+0x4c>
46fec: b5f9 0005 fb7e cmpal 5fb7e <_Per_CPU_Information+0xe>,%a2
46ff2: 6754 beqs 47048 <_Event_Surrender+0xa0> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
46ff4: c8aa 0010 andl %a2@(16),%d4
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Are_set( the_thread->current_state, wait_state ) ) {
46ff8: 6778 beqs 47072 <_Event_Surrender+0xca>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
46ffa: b282 cmpl %d2,%d1
46ffc: 6706 beqs 47004 <_Event_Surrender+0x5c>
46ffe: 0805 0001 btst #1,%d5
47002: 676e beqs 47072 <_Event_Surrender+0xca> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
47004: 2401 movel %d1,%d2
47006: 4682 notl %d2
47008: c480 andl %d0,%d2
4700a: 2082 movel %d2,%a0@
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
4700c: 206a 0028 moveal %a2@(40),%a0
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
47010: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
47014: 2081 movel %d1,%a0@
_ISR_Flash( level );
47016: 203c 0000 0700 movel #1792,%d0
4701c: 46c3 movew %d3,%sr
4701e: 8083 orl %d3,%d0
47020: 46c0 movew %d0,%sr
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
47022: 7002 moveq #2,%d0
47024: b0aa 0050 cmpl %a2@(80),%d0
47028: 6754 beqs 4707e <_Event_Surrender+0xd6>
_ISR_Enable( level );
4702a: 46c3 movew %d3,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4702c: 2d4a 0008 movel %a2,%fp@(8)
47030: 2e3c 1007 fff8 movel #268959736,%d7
47036: 2d47 000c movel %d7,%fp@(12)
}
return;
}
}
_ISR_Enable( level );
}
4703a: 4cee 04fc ffe4 moveml %fp@(-28),%d2-%d7/%a2
47040: 4e5e unlk %fp
47042: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
* 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() &&
_Thread_Is_executing( the_thread ) &&
((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
47048: 2c11 movel %a1@,%d6
/*
* 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() &&
_Thread_Is_executing( the_thread ) &&
4704a: 7e01 moveq #1,%d7
((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
4704c: 5386 subql #1,%d6
/*
* 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() &&
_Thread_Is_executing( the_thread ) &&
4704e: be86 cmpl %d6,%d7
47050: 65a2 bcss 46ff4 <_Event_Surrender+0x4c> <== NEVER TAKEN
((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(*sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
47052: b282 cmpl %d2,%d1
47054: 6706 beqs 4705c <_Event_Surrender+0xb4>
47056: 0805 0001 btst #1,%d5
4705a: 6716 beqs 47072 <_Event_Surrender+0xca> <== NEVER TAKEN
4705c: 2401 movel %d1,%d2
4705e: 4682 notl %d2
47060: c480 andl %d0,%d2
pending_events,
seized_events
);
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
*sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
47062: 7003 moveq #3,%d0
47064: 2082 movel %d2,%a0@
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
47066: 206a 0028 moveal %a2@(40),%a0
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
4706a: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
4706e: 2081 movel %d1,%a0@
*sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
47070: 2280 movel %d0,%a1@
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
47072: 46c3 movew %d3,%sr
}
47074: 4cee 04fc ffe4 moveml %fp@(-28),%d2-%d7/%a2
4707a: 4e5e unlk %fp
4707c: 4e75 rts
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
4707e: 7003 moveq #3,%d0
47080: 2540 0050 movel %d0,%a2@(80)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
47084: 46c3 movew %d3,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
47086: 486a 0048 pea %a2@(72)
4708a: 2e3c 1007 fff8 movel #268959736,%d7
47090: 4eb9 0004 a9d4 jsr 4a9d4 <_Watchdog_Remove>
47096: 588f addql #4,%sp
47098: 2d47 000c movel %d7,%fp@(12)
4709c: 2d4a 0008 movel %a2,%fp@(8)
}
return;
}
}
_ISR_Enable( level );
}
470a0: 4cee 04fc ffe4 moveml %fp@(-28),%d2-%d7/%a2
470a6: 4e5e unlk %fp
470a8: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
...
000470b0 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *arg
)
{
470b0: 4e56 fffc linkw %fp,#-4
470b4: 2f02 movel %d2,%sp@-
ISR_Level level;
Thread_blocking_operation_States *sync_state;
sync_state = arg;
the_thread = _Thread_Get( id, &location );
470b6: 486e fffc pea %fp@(-4)
470ba: 2f2e 0008 movel %fp@(8),%sp@-
470be: 4eb9 0004 9c64 jsr 49c64 <_Thread_Get>
switch ( location ) {
470c4: 508f addql #8,%sp
470c6: 4aae fffc tstl %fp@(-4)
470ca: 6642 bnes 4710e <_Event_Timeout+0x5e> <== 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 );
470cc: 223c 0000 0700 movel #1792,%d1
470d2: 40c2 movew %sr,%d2
470d4: 8282 orl %d2,%d1
470d6: 46c1 movew %d1,%sr
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
470d8: 2040 moveal %d0,%a0
470da: 42a8 0024 clrl %a0@(36)
if ( _Thread_Is_executing( the_thread ) ) {
470de: b0b9 0005 fb7e cmpl 5fb7e <_Per_CPU_Information+0xe>,%d0
470e4: 6730 beqs 47116 <_Event_Timeout+0x66>
if ( *sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
*sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
470e6: 7206 moveq #6,%d1
470e8: 2040 moveal %d0,%a0
470ea: 2141 0034 movel %d1,%a0@(52)
_ISR_Enable( level );
470ee: 46c2 movew %d2,%sr
470f0: 2f3c 1007 fff8 movel #268959736,%sp@-
470f6: 2f00 movel %d0,%sp@-
470f8: 4eb9 0004 9844 jsr 49844 <_Thread_Clear_state>
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
--level;
_Thread_Dispatch_disable_level = level;
470fe: 508f addql #8,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
47100: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
--level;
47106: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
47108: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
4710e: 242e fff8 movel %fp@(-8),%d2
47112: 4e5e unlk %fp
47114: 4e75 rts
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( *sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
47116: 206e 000c moveal %fp@(12),%a0
4711a: 7201 moveq #1,%d1
4711c: b290 cmpl %a0@,%d1
4711e: 66c6 bnes 470e6 <_Event_Timeout+0x36>
*sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
47120: 7202 moveq #2,%d1
47122: 2081 movel %d1,%a0@
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
47124: 7206 moveq #6,%d1
47126: 2040 moveal %d0,%a0
47128: 2141 0034 movel %d1,%a0@(52)
_ISR_Enable( level );
4712c: 46c2 movew %d2,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4712e: 2f3c 1007 fff8 movel #268959736,%sp@-
47134: 2f00 movel %d0,%sp@-
47136: 4eb9 0004 9844 jsr 49844 <_Thread_Clear_state>
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
--level;
_Thread_Dispatch_disable_level = level;
4713c: 508f addql #8,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
4713e: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
--level;
47144: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
47146: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
4714c: 60c0 bras 4710e <_Event_Timeout+0x5e>
...
0004c6b0 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
4c6b0: 4e56 ffc4 linkw %fp,#-60
4c6b4: 226e 000c moveal %fp@(12),%a1
4c6b8: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4c6bc: 246e 0008 moveal %fp@(8),%a2
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
4c6c0: 2c09 movel %a1,%d6
4c6c2: 5886 addql #4,%d6
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
4c6c4: 202a 0010 movel %a2@(16),%d0
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
4c6c8: 262e 0010 movel %fp@(16),%d3
4c6cc: 2a2e 0014 movel %fp@(20),%d5
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
4c6d0: 2d40 fffc movel %d0,%fp@(-4)
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
4c6d4: bc89 cmpl %a1,%d6
4c6d6: 6500 0164 bcsw 4c83c <_Heap_Allocate_aligned_with_boundary+0x18c>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
4c6da: 4a85 tstl %d5
4c6dc: 670c beqs 4c6ea <_Heap_Allocate_aligned_with_boundary+0x3a>
if ( boundary < alloc_size ) {
4c6de: ba89 cmpl %a1,%d5
4c6e0: 6500 015a bcsw 4c83c <_Heap_Allocate_aligned_with_boundary+0x18c>
return NULL;
}
if ( alignment == 0 ) {
4c6e4: 4a83 tstl %d3
4c6e6: 6602 bnes 4c6ea <_Heap_Allocate_aligned_with_boundary+0x3a>
alignment = page_size;
4c6e8: 2600 movel %d0,%d3
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
4c6ea: 206a 0008 moveal %a2@(8),%a0
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
4c6ee: 4284 clrl %d4
4c6f0: b1ca cmpal %a2,%a0
4c6f2: 6732 beqs 4c726 <_Heap_Allocate_aligned_with_boundary+0x76>
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;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
4c6f4: 222e fffc movel %fp@(-4),%d1
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
4c6f8: 7404 moveq #4,%d2
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;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
4c6fa: 5e81 addql #7,%d1
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
4c6fc: 9489 subl %a1,%d2
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;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
4c6fe: 2d41 fff8 movel %d1,%fp@(-8)
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
4c702: 2d42 fff4 movel %d2,%fp@(-12)
/*
* 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 ) {
4c706: 2028 0004 movel %a0@(4),%d0
4c70a: b086 cmpl %d6,%d0
4c70c: 632e blss 4c73c <_Heap_Allocate_aligned_with_boundary+0x8c>
if ( alignment == 0 ) {
4c70e: 4a83 tstl %d3
4c710: 6636 bnes 4c748 <_Heap_Allocate_aligned_with_boundary+0x98>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
4c712: 2408 movel %a0,%d2
4c714: 5082 addql #8,%d2
);
}
}
/* Statistics */
++search_count;
4c716: 5284 addql #1,%d4
if ( alloc_begin != 0 ) {
4c718: 4a82 tstl %d2
4c71a: 6600 00f4 bnew 4c810 <_Heap_Allocate_aligned_with_boundary+0x160>
break;
}
block = block->next;
4c71e: 2068 0008 moveal %a0@(8),%a0
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
4c722: b1ca cmpal %a2,%a0
4c724: 66e0 bnes 4c706 <_Heap_Allocate_aligned_with_boundary+0x56>
);
}
}
/* Statistics */
++search_count;
4c726: 4280 clrl %d0
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
4c728: b8aa 0044 cmpl %a2@(68),%d4
4c72c: 6304 blss 4c732 <_Heap_Allocate_aligned_with_boundary+0x82>
stats->max_search = search_count;
4c72e: 2544 0044 movel %d4,%a2@(68)
}
return (void *) alloc_begin;
}
4c732: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
4c738: 4e5e unlk %fp
4c73a: 4e75 rts
if ( alloc_begin != 0 ) {
break;
}
block = block->next;
4c73c: 2068 0008 moveal %a0@(8),%a0
);
}
}
/* Statistics */
++search_count;
4c740: 5284 addql #1,%d4
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
4c742: b1ca cmpal %a2,%a0
4c744: 66c0 bnes 4c706 <_Heap_Allocate_aligned_with_boundary+0x56>
4c746: 60de bras 4c726 <_Heap_Allocate_aligned_with_boundary+0x76>
- 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;
4c748: 7efe moveq #-2,%d7
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
4c74a: 49e8 0008 lea %a0@(8),%a4
- 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;
4c74e: c087 andl %d7,%d0
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
4c750: 266a 0014 moveal %a2@(20),%a3
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;
4c754: d088 addl %a0,%d0
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;
4c756: 222e fff8 movel %fp@(-8),%d1
4c75a: 928b subl %a3,%d1
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
4c75c: 242e fff4 movel %fp@(-12),%d2
4c760: d480 addl %d0,%d2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4c762: 2e02 movel %d2,%d7
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;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
4c764: d081 addl %d1,%d0
4c766: 4c43 7001 remul %d3,%d1,%d7
4c76a: 9481 subl %d1,%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 ) {
4c76c: b480 cmpl %d0,%d2
4c76e: 630a blss 4c77a <_Heap_Allocate_aligned_with_boundary+0xca>
4c770: 2400 movel %d0,%d2
4c772: 4c43 2001 remul %d3,%d1,%d2
4c776: 2400 movel %d0,%d2
4c778: 9481 subl %d1,%d2
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
4c77a: 4a85 tstl %d5
4c77c: 6766 beqs 4c7e4 <_Heap_Allocate_aligned_with_boundary+0x134>
/* 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;
4c77e: 2202 movel %d2,%d1
4c780: d289 addl %a1,%d1
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
4c782: 4bf4 9800 lea %a4@(00000000,%a1:l),%a5
4c786: 2001 movel %d1,%d0
4c788: 4c45 0007 remul %d5,%d7,%d0
4c78c: 2d4d ffec movel %a5,%fp@(-20)
4c790: 2a41 moveal %d1,%a5
4c792: 9bc7 subal %d7,%a5
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
4c794: bbc2 cmpal %d2,%a5
4c796: 634c blss 4c7e4 <_Heap_Allocate_aligned_with_boundary+0x134>
4c798: bbc1 cmpal %d1,%a5
4c79a: 6448 bccs 4c7e4 <_Heap_Allocate_aligned_with_boundary+0x134>
if ( boundary_line < boundary_floor ) {
4c79c: bbee ffec cmpal %fp@(-20),%a5
4c7a0: 6500 008e bcsw 4c830 <_Heap_Allocate_aligned_with_boundary+0x180>
4c7a4: 200d movel %a5,%d0
4c7a6: 2a44 moveal %d4,%a5
4c7a8: 2e2e ffec movel %fp@(-20),%d7
return 0;
}
alloc_begin = boundary_line - alloc_size;
4c7ac: 9089 subl %a1,%d0
4c7ae: 2400 movel %d0,%d2
4c7b0: 4c43 2001 remul %d3,%d1,%d2
4c7b4: 2400 movel %d0,%d2
4c7b6: 9481 subl %d1,%d2
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
4c7b8: 2202 movel %d2,%d1
4c7ba: d289 addl %a1,%d1
4c7bc: 2801 movel %d1,%d4
4c7be: 4c45 4000 remul %d5,%d0,%d4
4c7c2: 2801 movel %d1,%d4
4c7c4: 9880 subl %d0,%d4
4c7c6: 2004 movel %d4,%d0
/* 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 ) {
4c7c8: b882 cmpl %d2,%d4
4c7ca: 6316 blss 4c7e2 <_Heap_Allocate_aligned_with_boundary+0x132>
4c7cc: b881 cmpl %d1,%d4
4c7ce: 6412 bccs 4c7e2 <_Heap_Allocate_aligned_with_boundary+0x132>
if ( boundary_line < boundary_floor ) {
4c7d0: b087 cmpl %d7,%d0
4c7d2: 64d8 bccs 4c7ac <_Heap_Allocate_aligned_with_boundary+0xfc><== ALWAYS TAKEN
4c7d4: 280d movel %a5,%d4 <== NOT EXECUTED
return 0;
4c7d6: 4282 clrl %d2 <== NOT EXECUTED
);
}
}
/* Statistics */
++search_count;
4c7d8: 5284 addql #1,%d4 <== NOT EXECUTED
if ( alloc_begin != 0 ) {
4c7da: 4a82 tstl %d2 <== NOT EXECUTED
4c7dc: 6700 ff40 beqw 4c71e <_Heap_Allocate_aligned_with_boundary+0x6e><== NOT EXECUTED
4c7e0: 602e bras 4c810 <_Heap_Allocate_aligned_with_boundary+0x160><== NOT EXECUTED
4c7e2: 280d movel %a5,%d4
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 ) {
4c7e4: b48c cmpl %a4,%d2
4c7e6: 6548 bcss 4c830 <_Heap_Allocate_aligned_with_boundary+0x180>
4c7e8: 70f8 moveq #-8,%d0
4c7ea: 9088 subl %a0,%d0
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4c7ec: 2a40 moveal %d0,%a5
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4c7ee: 2e02 movel %d2,%d7
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4c7f0: dbc2 addal %d2,%a5
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4c7f2: 202e fffc movel %fp@(-4),%d0
4c7f6: 4c40 7001 remul %d0,%d1,%d7
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;
4c7fa: 9bc1 subal %d1,%a5
if ( free_size >= min_block_size || free_size == 0 ) {
4c7fc: bbcb cmpal %a3,%a5
4c7fe: 6400 ff16 bccw 4c716 <_Heap_Allocate_aligned_with_boundary+0x66>
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 ) {
if ( boundary_line < boundary_floor ) {
return 0;
4c802: 4a8d tstl %a5
4c804: 57c0 seq %d0
);
}
}
/* Statistics */
++search_count;
4c806: 5284 addql #1,%d4
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 ) {
if ( boundary_line < boundary_floor ) {
return 0;
4c808: 49c0 extbl %d0
4c80a: c480 andl %d0,%d2
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
4c80c: 6700 ff10 beqw 4c71e <_Heap_Allocate_aligned_with_boundary+0x6e>
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
stats->searches += search_count;
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
4c810: 2f09 movel %a1,%sp@-
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
4c812: 52aa 0048 addql #1,%a2@(72)
stats->searches += search_count;
4c816: d9aa 004c addl %d4,%a2@(76)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
4c81a: 2f02 movel %d2,%sp@-
4c81c: 2f08 movel %a0,%sp@-
4c81e: 2f0a movel %a2,%sp@-
4c820: 4eb9 0004 8800 jsr 48800 <_Heap_Block_allocate>
4c826: 4fef 0010 lea %sp@(16),%sp
4c82a: 2002 movel %d2,%d0
4c82c: 6000 fefa braw 4c728 <_Heap_Allocate_aligned_with_boundary+0x78>
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 ) {
if ( boundary_line < boundary_floor ) {
return 0;
4c830: 4282 clrl %d2
);
}
}
/* Statistics */
++search_count;
4c832: 5284 addql #1,%d4
if ( alloc_begin != 0 ) {
4c834: 4a82 tstl %d2
4c836: 6700 fee6 beqw 4c71e <_Heap_Allocate_aligned_with_boundary+0x6e>
4c83a: 60d4 bras 4c810 <_Heap_Allocate_aligned_with_boundary+0x160><== NOT EXECUTED
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
/* Integer overflow occured */
return NULL;
4c83c: 4280 clrl %d0
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
4c83e: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
4c844: 4e5e unlk %fp <== NOT EXECUTED
0004c848 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
4c848: 4e56 ffe8 linkw %fp,#-24
4c84c: 206e 0008 moveal %fp@(8),%a0
4c850: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
4c854: 202e 000c movel %fp@(12),%d0
/*
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
4c858: 6700 00ba beqw 4c914 <_Heap_Free+0xcc>
4c85c: 2240 moveal %d0,%a1
4c85e: 5189 subql #8,%a1
4c860: 4c68 0001 0010 remul %a0@(16),%d1,%d0
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
4c866: 2028 0020 movel %a0@(32),%d0
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4c86a: 93c1 subal %d1,%a1
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;
4c86c: b089 cmpl %a1,%d0
4c86e: 6200 009a bhiw 4c90a <_Heap_Free+0xc2>
4c872: 2228 0024 movel %a0@(36),%d1
4c876: b289 cmpl %a1,%d1
4c878: 6500 0090 bcsw 4c90a <_Heap_Free+0xc2>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4c87c: 2829 0004 movel %a1@(4),%d4
- 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;
4c880: 74fe moveq #-2,%d2
4c882: c484 andl %d4,%d2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4c884: 45f1 2800 lea %a1@(00000000,%d2:l),%a2
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;
4c888: b5c0 cmpal %d0,%a2
4c88a: 657e bcss 4c90a <_Heap_Free+0xc2> <== NEVER TAKEN
4c88c: b5c1 cmpal %d1,%a2
4c88e: 627a bhis 4c90a <_Heap_Free+0xc2> <== NEVER TAKEN
4c890: 262a 0004 movel %a2@(4),%d3
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
4c894: 0803 0000 btst #0,%d3
4c898: 6770 beqs 4c90a <_Heap_Free+0xc2> <== NEVER TAKEN
- 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;
4c89a: 7afe moveq #-2,%d5
4c89c: c685 andl %d5,%d3
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
4c89e: b5c1 cmpal %d1,%a2
4c8a0: 6700 00b2 beqw 4c954 <_Heap_Free+0x10c>
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;
4c8a4: 7a01 moveq #1,%d5
4c8a6: cab2 3804 andl %a2@(00000004,%d3:l),%d5
4c8aa: 6600 00a8 bnew 4c954 <_Heap_Free+0x10c>
if ( !_Heap_Is_prev_used( block ) ) {
4c8ae: 0804 0000 btst #0,%d4
4c8b2: 666a bnes 4c91e <_Heap_Free+0xd6>
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
4c8b4: 7a01 moveq #1,%d5
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
uintptr_t const prev_size = block->prev_size;
4c8b6: 2811 movel %a1@,%d4
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4c8b8: 93c4 subal %d4,%a1
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;
4c8ba: b3c0 cmpal %d0,%a1
4c8bc: 654c bcss 4c90a <_Heap_Free+0xc2> <== NEVER TAKEN
4c8be: b3c1 cmpal %d1,%a1
4c8c0: 6248 bhis 4c90a <_Heap_Free+0xc2> <== NEVER TAKEN
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;
4c8c2: 7001 moveq #1,%d0
4c8c4: c0a9 0004 andl %a1@(4),%d0
return( false );
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
4c8c8: 6740 beqs 4c90a <_Heap_Free+0xc2> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
4c8ca: 4a05 tstb %d5
4c8cc: 6700 00de beqw 4c9ac <_Heap_Free+0x164>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4c8d0: 266a 0008 moveal %a2@(8),%a3
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
4c8d4: d882 addl %d2,%d4
4c8d6: d684 addl %d4,%d3
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c8d8: 7001 moveq #1,%d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4c8da: 246a 000c moveal %a2@(12),%a2
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
4c8de: 254b 0008 movel %a3,%a2@(8)
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c8e2: 8083 orl %d3,%d0
next->prev = prev;
4c8e4: 274a 000c movel %a2,%a3@(12)
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
4c8e8: 53a8 0038 subql #1,%a0@(56)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
4c8ec: 2383 3800 movel %d3,%a1@(00000000,%d3:l)
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c8f0: 2340 0004 movel %d0,%a1@(4)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4c8f4: 53a8 0040 subql #1,%a0@(64)
++stats->frees;
4c8f8: 52a8 0050 addql #1,%a0@(80)
stats->free_size += block_size;
4c8fc: d5a8 0030 addl %d2,%a0@(48)
return( true );
4c900: 7001 moveq #1,%d0
}
4c902: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
4c906: 4e5e unlk %fp
4c908: 4e75 rts
4c90a: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
alloc_begin = (uintptr_t) alloc_begin_ptr;
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
4c90e: 4200 clrb %d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4c910: 4e5e unlk %fp
4c912: 4e75 rts
4c914: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
return true;
4c918: 7001 moveq #1,%d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4c91a: 4e5e unlk %fp
4c91c: 4e75 rts
4c91e: 266a 0008 moveal %a2@(8),%a3
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
4c922: d682 addl %d2,%d3
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c924: 7001 moveq #1,%d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4c926: 246a 000c moveal %a2@(12),%a2
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c92a: 8083 orl %d3,%d0
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
4c92c: 234b 0008 movel %a3,%a1@(8)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
4c930: 2383 3800 movel %d3,%a1@(00000000,%d3:l)
new_block->prev = prev;
4c934: 234a 000c movel %a2,%a1@(12)
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c938: 2340 0004 movel %d0,%a1@(4)
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
4c93c: 7001 moveq #1,%d0
next->prev = new_block;
prev->next = new_block;
4c93e: 2549 0008 movel %a1,%a2@(8)
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
next->prev = new_block;
4c942: 2749 000c movel %a1,%a3@(12)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4c946: 53a8 0040 subql #1,%a0@(64)
++stats->frees;
4c94a: 52a8 0050 addql #1,%a0@(80)
stats->free_size += block_size;
4c94e: d5a8 0030 addl %d2,%a0@(48)
4c952: 60ae bras 4c902 <_Heap_Free+0xba>
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
4c954: 0804 0000 btst #0,%d4
4c958: 6606 bnes 4c960 <_Heap_Free+0x118>
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
4c95a: 4205 clrb %d5
4c95c: 6000 ff58 braw 4c8b6 <_Heap_Free+0x6e>
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
4c960: 2028 0038 movel %a0@(56),%d0
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
4c964: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4c966: 7afe moveq #-2,%d5
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
4c968: 5280 addql #1,%d0
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
4c96a: 2668 0008 moveal %a0@(8),%a3
new_block->next = next;
new_block->prev = block_before;
4c96e: 2348 000c movel %a0,%a1@(12)
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
4c972: 8282 orl %d2,%d1
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
4c974: 234b 0008 movel %a3,%a1@(8)
4c978: 2341 0004 movel %d1,%a1@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4c97c: cbaa 0004 andl %d5,%a2@(4)
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
4c980: 2749 000c movel %a1,%a3@(12)
next_block->prev_size = block_size;
4c984: 2482 movel %d2,%a2@
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
4c986: 2149 0008 movel %a1,%a0@(8)
/* Statistics */
++stats->free_blocks;
4c98a: 2140 0038 movel %d0,%a0@(56)
if ( stats->max_free_blocks < stats->free_blocks ) {
4c98e: b0a8 003c cmpl %a0@(60),%d0
4c992: 6300 ff60 blsw 4c8f4 <_Heap_Free+0xac>
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4c996: 53a8 0040 subql #1,%a0@(64)
++stats->frees;
4c99a: 52a8 0050 addql #1,%a0@(80)
stats->free_size += block_size;
4c99e: d5a8 0030 addl %d2,%a0@(48)
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
if ( stats->max_free_blocks < stats->free_blocks ) {
stats->max_free_blocks = stats->free_blocks;
4c9a2: 2140 003c movel %d0,%a0@(60)
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
4c9a6: 7001 moveq #1,%d0
4c9a8: 6000 ff58 braw 4c902 <_Heap_Free+0xba>
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
4c9ac: d882 addl %d2,%d4
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c9ae: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4c9b0: 7afe moveq #-2,%d5
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c9b2: 8284 orl %d4,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
4c9b4: 2484 movel %d4,%a2@
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
4c9b6: 7001 moveq #1,%d0
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4c9b8: 2341 0004 movel %d1,%a1@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4c9bc: cbaa 0004 andl %d5,%a2@(4)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4c9c0: 53a8 0040 subql #1,%a0@(64)
++stats->frees;
4c9c4: 52a8 0050 addql #1,%a0@(80)
stats->free_size += block_size;
4c9c8: d5a8 0030 addl %d2,%a0@(48)
4c9cc: 6000 ff34 braw 4c902 <_Heap_Free+0xba>
00051b08 <_Heap_Get_free_information>:
void _Heap_Get_free_information(
Heap_Control *the_heap,
Heap_Information *info
)
{
51b08: 4e56 fff0 linkw %fp,#-16
51b0c: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
51b10: 266e 0008 moveal %fp@(8),%a3
51b14: 246e 000c moveal %fp@(12),%a2
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
51b18: 206b 0008 moveal %a3@(8),%a0
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
51b1c: 4292 clrl %a2@
info->largest = 0;
51b1e: 42aa 0004 clrl %a2@(4)
info->total = 0;
51b22: 42aa 0008 clrl %a2@(8)
for(the_block = _Heap_Free_list_first(the_heap);
51b26: b1cb cmpal %a3,%a0
51b28: 6732 beqs 51b5c <_Heap_Get_free_information+0x54><== NEVER TAKEN
51b2a: 327c 0001 moveaw #1,%a1
51b2e: 4282 clrl %d2
51b30: 4281 clrl %d1
- 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;
51b32: 70fe moveq #-2,%d0
51b34: 2609 movel %a1,%d3
51b36: 5283 addql #1,%d3
51b38: c0a8 0004 andl %a0@(4),%d0
/* As we always coalesce free blocks, prev block must have been used. */
_HAssert(_Heap_Is_prev_used(the_block));
info->number++;
info->total += the_size;
51b3c: d280 addl %d0,%d1
if ( info->largest < the_size )
51b3e: b480 cmpl %d0,%d2
51b40: 6404 bccs 51b46 <_Heap_Get_free_information+0x3e>
info->largest = the_size;
51b42: 2540 0004 movel %d0,%a2@(4)
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
the_block != tail;
the_block = the_block->next)
51b46: 2068 0008 moveal %a0@(8),%a0
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
51b4a: b1cb cmpal %a3,%a0
51b4c: 6708 beqs 51b56 <_Heap_Get_free_information+0x4e>
51b4e: 242a 0004 movel %a2@(4),%d2
51b52: 2243 moveal %d3,%a1
51b54: 60dc bras 51b32 <_Heap_Get_free_information+0x2a>
51b56: 2489 movel %a1,%a2@
51b58: 2541 0008 movel %d1,%a2@(8)
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
}
}
51b5c: 4cd7 0c0c moveml %sp@,%d2-%d3/%a2-%a3
51b60: 4e5e unlk %fp <== NOT EXECUTED
0004aa48 <_Heap_Greedy_allocate>:
Heap_Block *_Heap_Greedy_allocate(
Heap_Control *heap,
const uintptr_t *block_sizes,
size_t block_count
)
{
4aa48: 4e56 ffe8 linkw %fp,#-24
4aa4c: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
4aa50: 246e 0008 moveal %fp@(8),%a2
4aa54: 242e 0010 movel %fp@(16),%d2
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
4aa58: 6700 00ca beqw 4ab24 <_Heap_Greedy_allocate+0xdc>
4aa5c: 2a6e 000c moveal %fp@(12),%a5
4aa60: 97cb subal %a3,%a3
const uintptr_t *block_sizes,
size_t block_count
)
{
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
Heap_Block *allocated_blocks = NULL;
4aa62: 99cc subal %a4,%a4
4aa64: 263c 0005 1610 movel #333328,%d3
* @brief See _Heap_Allocate_aligned_with_boundary() with alignment and
* boundary equals zero.
*/
RTEMS_INLINE_ROUTINE void *_Heap_Allocate( Heap_Control *heap, uintptr_t size )
{
return _Heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
4aa6a: 42a7 clrl %sp@-
4aa6c: 2043 moveal %d3,%a0
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
4aa6e: 528b addql #1,%a3
4aa70: 42a7 clrl %sp@-
4aa72: 2f1d movel %a5@+,%sp@-
4aa74: 2f0a movel %a2,%sp@-
4aa76: 4e90 jsr %a0@
void *next = _Heap_Allocate( heap, block_sizes [i] );
if ( next != NULL ) {
4aa78: 4fef 0010 lea %sp@(16),%sp
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4aa7c: 2040 moveal %d0,%a0
4aa7e: 5188 subql #8,%a0
4aa80: 4a80 tstl %d0
4aa82: 670e beqs 4aa92 <_Heap_Greedy_allocate+0x4a> <== NEVER TAKEN
4aa84: 4c6a 0001 0010 remul %a2@(16),%d1,%d0
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4aa8a: 91c1 subal %d1,%a0
Heap_Block *next_block = _Heap_Block_of_alloc_area(
(uintptr_t) next,
heap->page_size
);
next_block->next = allocated_blocks;
4aa8c: 214c 0008 movel %a4,%a0@(8)
4aa90: 2848 moveal %a0,%a4
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
4aa92: b48b cmpl %a3,%d2
4aa94: 66d4 bnes 4aa6a <_Heap_Greedy_allocate+0x22>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
4aa96: 266a 0008 moveal %a2@(8),%a3
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
4aa9a: b7ca cmpal %a2,%a3
4aa9c: 6700 008c beqw 4ab2a <_Heap_Greedy_allocate+0xe2>
- 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;
4aaa0: 70fe moveq #-2,%d0
4aaa2: 4bf9 0004 ae20 lea 4ae20 <_Heap_Block_allocate>,%a5
4aaa8: 4282 clrl %d2
4aaaa: c0ab 0004 andl %a3@(4),%d0
_Heap_Block_allocate(
4aaae: 2040 moveal %d0,%a0
4aab0: 4868 fff8 pea %a0@(-8)
4aab4: 486b 0008 pea %a3@(8)
4aab8: 2f0b movel %a3,%sp@-
4aaba: 2f0a movel %a2,%sp@-
4aabc: 4e95 jsr %a5@
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
4aabe: 4fef 0010 lea %sp@(16),%sp
current,
_Heap_Alloc_area_of_block( current ),
_Heap_Block_size( current ) - HEAP_BLOCK_HEADER_SIZE
);
current->next = blocks;
4aac2: 2742 0008 movel %d2,%a3@(8)
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
4aac6: 202a 0008 movel %a2@(8),%d0
4aaca: 240b movel %a3,%d2
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
4aacc: b08a cmpl %a2,%d0
4aace: 672a beqs 4aafa <_Heap_Greedy_allocate+0xb2>
4aad0: 2640 moveal %d0,%a3
- 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;
4aad2: 70fe moveq #-2,%d0
4aad4: c0ab 0004 andl %a3@(4),%d0
_Heap_Block_allocate(
4aad8: 2040 moveal %d0,%a0
4aada: 4868 fff8 pea %a0@(-8)
4aade: 486b 0008 pea %a3@(8)
4aae2: 2f0b movel %a3,%sp@-
4aae4: 2f0a movel %a2,%sp@-
4aae6: 4e95 jsr %a5@
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
4aae8: 4fef 0010 lea %sp@(16),%sp
current,
_Heap_Alloc_area_of_block( current ),
_Heap_Block_size( current ) - HEAP_BLOCK_HEADER_SIZE
);
current->next = blocks;
4aaec: 2742 0008 movel %d2,%a3@(8)
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
4aaf0: 202a 0008 movel %a2@(8),%d0
4aaf4: 240b movel %a3,%d2
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
4aaf6: b08a cmpl %a2,%d0
4aaf8: 66d6 bnes 4aad0 <_Heap_Greedy_allocate+0x88>
4aafa: 4bf9 0005 17a8 lea 517a8 <_Heap_Free>,%a5
current->next = blocks;
blocks = current;
}
while ( allocated_blocks != NULL ) {
4ab00: 4a8c tstl %a4
4ab02: 6714 beqs 4ab18 <_Heap_Greedy_allocate+0xd0>
current = allocated_blocks;
allocated_blocks = allocated_blocks->next;
4ab04: 222c 0008 movel %a4@(8),%d1
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
4ab08: 486c 0008 pea %a4@(8)
blocks = current;
}
while ( allocated_blocks != NULL ) {
current = allocated_blocks;
allocated_blocks = allocated_blocks->next;
4ab0c: 2841 moveal %d1,%a4
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
4ab0e: 2f0a movel %a2,%sp@-
4ab10: 4e95 jsr %a5@
current->next = blocks;
blocks = current;
}
while ( allocated_blocks != NULL ) {
4ab12: 508f addql #8,%sp
4ab14: 4a8c tstl %a4
4ab16: 66ec bnes 4ab04 <_Heap_Greedy_allocate+0xbc>
allocated_blocks = allocated_blocks->next;
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
}
return blocks;
}
4ab18: 200b movel %a3,%d0
4ab1a: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4ab20: 4e5e unlk %fp
4ab22: 4e75 rts
const uintptr_t *block_sizes,
size_t block_count
)
{
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
Heap_Block *allocated_blocks = NULL;
4ab24: 99cc subal %a4,%a4
4ab26: 6000 ff6e braw 4aa96 <_Heap_Greedy_allocate+0x4e>
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
4ab2a: 97cb subal %a3,%a3 <== NOT EXECUTED
4ab2c: 4bf9 0005 17a8 lea 517a8 <_Heap_Free>,%a5 <== NOT EXECUTED
current->next = blocks;
blocks = current;
}
while ( allocated_blocks != NULL ) {
4ab32: 4a8c tstl %a4 <== NOT EXECUTED
4ab34: 66ce bnes 4ab04 <_Heap_Greedy_allocate+0xbc> <== NOT EXECUTED
4ab36: 60e0 bras 4ab18 <_Heap_Greedy_allocate+0xd0> <== NOT EXECUTED
0004ab38 <_Heap_Greedy_free>:
void _Heap_Greedy_free(
Heap_Control *heap,
Heap_Block *blocks
)
{
4ab38: 4e56 fff4 linkw %fp,#-12
4ab3c: 206e 000c moveal %fp@(12),%a0
4ab40: 48d7 040c moveml %d2-%d3/%a2,%sp@
4ab44: 262e 0008 movel %fp@(8),%d3
4ab48: 45f9 0005 17a8 lea 517a8 <_Heap_Free>,%a2
while ( blocks != NULL ) {
4ab4e: 4a88 tstl %a0
4ab50: 6714 beqs 4ab66 <_Heap_Greedy_free+0x2e> <== NEVER TAKEN
Heap_Block *current = blocks;
blocks = blocks->next;
4ab52: 2428 0008 movel %a0@(8),%d2
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
4ab56: 4868 0008 pea %a0@(8)
4ab5a: 2f03 movel %d3,%sp@-
4ab5c: 4e92 jsr %a2@
void _Heap_Greedy_free(
Heap_Control *heap,
Heap_Block *blocks
)
{
while ( blocks != NULL ) {
4ab5e: 508f addql #8,%sp
Heap_Block *current = blocks;
blocks = blocks->next;
4ab60: 2042 moveal %d2,%a0
void _Heap_Greedy_free(
Heap_Control *heap,
Heap_Block *blocks
)
{
while ( blocks != NULL ) {
4ab62: 4a82 tstl %d2
4ab64: 66ec bnes 4ab52 <_Heap_Greedy_free+0x1a>
Heap_Block *current = blocks;
blocks = blocks->next;
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
}
}
4ab66: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
4ab6c: 4e5e unlk %fp <== NOT EXECUTED
00051bc0 <_Heap_Iterate>:
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
51bc0: 4e56 fff0 linkw %fp,#-16
51bc4: 226e 0008 moveal %fp@(8),%a1
51bc8: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
51bcc: 266e 000c moveal %fp@(12),%a3
51bd0: 262e 0010 movel %fp@(16),%d3
Heap_Block *current = heap->first_block;
51bd4: 2069 0020 moveal %a1@(32),%a0
Heap_Block *end = heap->last_block;
51bd8: 2429 0024 movel %a1@(36),%d2
bool stop = false;
while ( !stop && current != end ) {
51bdc: b488 cmpl %a0,%d2
51bde: 6728 beqs 51c08 <_Heap_Iterate+0x48> <== NEVER TAKEN
51be0: 70fe moveq #-2,%d0
uintptr_t size = _Heap_Block_size( current );
Heap_Block *next = _Heap_Block_at( current, size );
bool used = _Heap_Is_prev_used( next );
stop = (*visitor)( current, size, used, visitor_arg );
51be2: 7201 moveq #1,%d1
51be4: c0a8 0004 andl %a0@(4),%d0
51be8: 2f03 movel %d3,%sp@-
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
51bea: 45f0 0800 lea %a0@(00000000,%d0:l),%a2
51bee: c2aa 0004 andl %a2@(4),%d1
51bf2: 2f01 movel %d1,%sp@-
51bf4: 2f00 movel %d0,%sp@-
51bf6: 2f08 movel %a0,%sp@-
51bf8: 4e93 jsr %a3@
{
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
bool stop = false;
while ( !stop && current != end ) {
51bfa: 4fef 0010 lea %sp@(16),%sp
51bfe: 204a moveal %a2,%a0
51c00: 4a00 tstb %d0
51c02: 6604 bnes 51c08 <_Heap_Iterate+0x48> <== NEVER TAKEN
51c04: b5c2 cmpal %d2,%a2
51c06: 66d8 bnes 51be0 <_Heap_Iterate+0x20>
stop = (*visitor)( current, size, used, visitor_arg );
current = next;
}
}
51c08: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
51c0e: 4e5e unlk %fp
...
0005c2b0 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
5c2b0: 4e56 0000 linkw %fp,#0
5c2b4: 202e 000c movel %fp@(12),%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
5c2b8: 2040 moveal %d0,%a0
5c2ba: 5188 subql #8,%a0
5c2bc: 226e 0008 moveal %fp@(8),%a1
5c2c0: 2f02 movel %d2,%sp@-
5c2c2: 2400 movel %d0,%d2
5c2c4: 4c69 2001 0010 remul %a1@(16),%d1,%d2
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
5c2ca: 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
5c2cc: 2229 0020 movel %a1@(32),%d1
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
5c2d0: b288 cmpl %a0,%d1
5c2d2: 6238 bhis 5c30c <_Heap_Size_of_alloc_area+0x5c>
5c2d4: 2269 0024 moveal %a1@(36),%a1
5c2d8: b3c8 cmpal %a0,%a1
5c2da: 6530 bcss 5c30c <_Heap_Size_of_alloc_area+0x5c> <== NEVER TAKEN
- 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;
5c2dc: 74fe moveq #-2,%d2
5c2de: c4a8 0004 andl %a0@(4),%d2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
5c2e2: 41f0 2800 lea %a0@(00000000,%d2:l),%a0
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;
5c2e6: b1c1 cmpal %d1,%a0
5c2e8: 6522 bcss 5c30c <_Heap_Size_of_alloc_area+0x5c> <== NEVER TAKEN
5c2ea: b1c9 cmpal %a1,%a0
5c2ec: 621e bhis 5c30c <_Heap_Size_of_alloc_area+0x5c> <== NEVER TAKEN
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;
5c2ee: 7201 moveq #1,%d1
5c2f0: c2a8 0004 andl %a0@(4),%d1
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
5c2f4: 6716 beqs 5c30c <_Heap_Size_of_alloc_area+0x5c> <== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
5c2f6: 7204 moveq #4,%d1
5c2f8: 9280 subl %d0,%d1
5c2fa: 2001 movel %d1,%d0
5c2fc: d088 addl %a0,%d0
5c2fe: 226e 0010 moveal %fp@(16),%a1
return true;
}
5c302: 241f movel %sp@+,%d2
5c304: 4e5e unlk %fp
|| !_Heap_Is_prev_used( next_block )
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
5c306: 2280 movel %d0,%a1@
return true;
5c308: 7001 moveq #1,%d0
}
5c30a: 4e75 rts
5c30c: 241f movel %sp@+,%d2
5c30e: 4e5e unlk %fp
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 ) ) {
return false;
5c310: 4200 clrb %d0 <== NOT EXECUTED
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
000490ce <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
490ce: 4e56 ffc8 linkw %fp,#-56
490d2: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
490d6: 246e 0008 moveal %fp@(8),%a2
uintptr_t const page_size = heap->page_size;
490da: 242a 0010 movel %a2@(16),%d2
uintptr_t const min_block_size = heap->min_block_size;
490de: 262a 0014 movel %a2@(20),%d3
Heap_Block *const first_block = heap->first_block;
490e2: 266a 0020 moveal %a2@(32),%a3
Heap_Block *const last_block = heap->last_block;
490e6: 2a6a 0024 moveal %a2@(36),%a5
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
490ea: 4a2e 0013 tstb %fp@(19)
490ee: 671a beqs 4910a <_Heap_Walk+0x3c>
490f0: 49fa ff86 lea %pc@(49078 <_Heap_Walk_print>),%a4
if ( !_System_state_Is_up( _System_state_Get() ) ) {
490f4: 7003 moveq #3,%d0
490f6: b0b9 0006 1d44 cmpl 61d44 <_System_state_Current>,%d0
490fc: 671a beqs 49118 <_Heap_Walk+0x4a> <== ALWAYS TAKEN
block = next_block;
} while ( block != first_block );
return true;
}
490fe: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
}
block = next_block;
} while ( block != first_block );
return true;
49104: 7001 moveq #1,%d0
}
49106: 4e5e unlk %fp
49108: 4e75 rts
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
4910a: 49fa ff64 lea %pc@(49070 <_Heap_Walk_print_nothing>),%a4
if ( !_System_state_Is_up( _System_state_Get() ) ) {
4910e: 7003 moveq #3,%d0
49110: b0b9 0006 1d44 cmpl 61d44 <_System_state_Current>,%d0
49116: 66e6 bnes 490fe <_Heap_Walk+0x30>
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)(
49118: 2f2a 000c movel %a2@(12),%sp@-
4911c: 2f2a 0008 movel %a2@(8),%sp@-
49120: 2f0d movel %a5,%sp@-
49122: 2f0b movel %a3,%sp@-
49124: 2f2a 001c movel %a2@(28),%sp@-
49128: 2f2a 0018 movel %a2@(24),%sp@-
4912c: 2f03 movel %d3,%sp@-
4912e: 2f02 movel %d2,%sp@-
49130: 4879 0005 e292 pea 5e292 <_Copyright_Notice+0x94>
49136: 42a7 clrl %sp@-
49138: 2f2e 000c movel %fp@(12),%sp@-
4913c: 4e94 jsr %a4@
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
4913e: 4fef 002c lea %sp@(44),%sp
49142: 4a82 tstl %d2
49144: 677e beqs 491c4 <_Heap_Walk+0xf6>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
49146: 7003 moveq #3,%d0
49148: c082 andl %d2,%d0
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
4914a: 6600 0090 bnew 491dc <_Heap_Walk+0x10e>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4914e: 2203 movel %d3,%d1
49150: 4c42 1000 remul %d2,%d0,%d1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
49154: 4a80 tstl %d0
49156: 6600 009e bnew 491f6 <_Heap_Walk+0x128>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
4915a: 200b movel %a3,%d0
4915c: 5080 addql #8,%d0
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4915e: 4c42 0001 remul %d2,%d1,%d0
);
return false;
}
if (
49162: 4a81 tstl %d1
49164: 6600 00aa bnew 49210 <_Heap_Walk+0x142>
block = next_block;
} while ( block != first_block );
return true;
}
49168: 202b 0004 movel %a3@(4),%d0
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;
4916c: 7801 moveq #1,%d4
4916e: c880 andl %d0,%d4
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
49170: 6700 00ba beqw 4922c <_Heap_Walk+0x15e>
- 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;
49174: 72fe moveq #-2,%d1
49176: c2ad 0004 andl %a5@(4),%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4917a: 41f5 1800 lea %a5@(00000000,%d1:l),%a0
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;
4917e: 7201 moveq #1,%d1
49180: c2a8 0004 andl %a0@(4),%d1
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
49184: 6726 beqs 491ac <_Heap_Walk+0xde>
);
return false;
}
if (
49186: b1cb cmpal %a3,%a0
49188: 6700 00bc beqw 49246 <_Heap_Walk+0x178>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
4918c: 4879 0005 e3ec pea 5e3ec <_Copyright_Notice+0x1ee>
49192: 4878 0001 pea 1 <ADD>
49196: 2f2e 000c movel %fp@(12),%sp@-
4919a: 4e94 jsr %a4@
4919c: 4fef 000c lea %sp@(12),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
491a0: 4200 clrb %d0
block = next_block;
} while ( block != first_block );
return true;
}
491a2: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
491a8: 4e5e unlk %fp
491aa: 4e75 rts
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
491ac: 4879 0005 e3d7 pea 5e3d7 <_Copyright_Notice+0x1d9>
491b2: 4878 0001 pea 1 <ADD>
491b6: 2f2e 000c movel %fp@(12),%sp@-
491ba: 4e94 jsr %a4@
491bc: 4fef 000c lea %sp@(12),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
491c0: 4200 clrb %d0
491c2: 60de bras 491a2 <_Heap_Walk+0xd4>
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
491c4: 4879 0005 e323 pea 5e323 <_Copyright_Notice+0x125>
491ca: 4878 0001 pea 1 <ADD>
491ce: 2f2e 000c movel %fp@(12),%sp@-
491d2: 4e94 jsr %a4@
491d4: 4fef 000c lea %sp@(12),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
491d8: 4200 clrb %d0
491da: 60c6 bras 491a2 <_Heap_Walk+0xd4>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
491dc: 2f02 movel %d2,%sp@-
491de: 4879 0005 e336 pea 5e336 <_Copyright_Notice+0x138>
491e4: 4878 0001 pea 1 <ADD>
491e8: 2f2e 000c movel %fp@(12),%sp@-
491ec: 4e94 jsr %a4@
491ee: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
491f2: 4200 clrb %d0
491f4: 60ac bras 491a2 <_Heap_Walk+0xd4>
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
491f6: 2f03 movel %d3,%sp@-
491f8: 4879 0005 e354 pea 5e354 <_Copyright_Notice+0x156>
491fe: 4878 0001 pea 1 <ADD>
49202: 2f2e 000c movel %fp@(12),%sp@-
49206: 4e94 jsr %a4@
49208: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
4920c: 4200 clrb %d0
4920e: 6092 bras 491a2 <_Heap_Walk+0xd4>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
49210: 2f0b movel %a3,%sp@-
49212: 4879 0005 e378 pea 5e378 <_Copyright_Notice+0x17a>
49218: 4878 0001 pea 1 <ADD>
4921c: 2f2e 000c movel %fp@(12),%sp@-
49220: 4e94 jsr %a4@
49222: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
49226: 4200 clrb %d0
49228: 6000 ff78 braw 491a2 <_Heap_Walk+0xd4>
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
4922c: 4879 0005 e3a9 pea 5e3a9 <_Copyright_Notice+0x1ab>
49232: 4878 0001 pea 1 <ADD>
49236: 2f2e 000c movel %fp@(12),%sp@-
4923a: 4e94 jsr %a4@
4923c: 4fef 000c lea %sp@(12),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
49240: 4200 clrb %d0
49242: 6000 ff5e braw 491a2 <_Heap_Walk+0xd4>
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
49246: 222a 0010 movel %a2@(16),%d1
4924a: 2d41 fffc movel %d1,%fp@(-4)
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
4924e: 206a 0008 moveal %a2@(8),%a0
block = next_block;
} while ( block != first_block );
return true;
}
49252: 222a 0020 movel %a2@(32),%d1
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 ) {
49256: b1ca cmpal %a2,%a0
49258: 6700 00c6 beqw 49320 <_Heap_Walk+0x252>
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;
4925c: b1c1 cmpal %d1,%a0
4925e: 6500 009c bcsw 492fc <_Heap_Walk+0x22e>
49262: 2a2a 0024 movel %a2@(36),%d5
49266: 2d45 fff0 movel %d5,%fp@(-16)
4926a: b1c5 cmpal %d5,%a0
4926c: 6200 008e bhiw 492fc <_Heap_Walk+0x22e>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
49270: 43e8 0008 lea %a0@(8),%a1
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
49274: 2c09 movel %a1,%d6
49276: 2e2e fffc movel %fp@(-4),%d7
4927a: 4c47 6005 remul %d7,%d5,%d6
);
return false;
}
if (
4927e: 4a85 tstl %d5
49280: 6600 02b8 bnew 4953a <_Heap_Walk+0x46c>
- 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;
49284: 7afe moveq #-2,%d5
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;
49286: 7c01 moveq #1,%d6
- 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;
49288: caa8 0004 andl %a0@(4),%d5
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;
4928c: ccb0 5804 andl %a0@(00000004,%d5:l),%d6
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
49290: 664e bnes 492e0 <_Heap_Walk+0x212> <== NEVER TAKEN
49292: 2e2e fff0 movel %fp@(-16),%d7
49296: 224a moveal %a2,%a1
49298: 2c08 movel %a0,%d6
4929a: 2d42 fff8 movel %d2,%fp@(-8)
4929e: 2d40 fff4 movel %d0,%fp@(-12)
);
return false;
}
if ( free_block->prev != prev_block ) {
492a2: 2a28 000c movel %a0@(12),%d5
492a6: b3c5 cmpal %d5,%a1
492a8: 6600 02ac bnew 49556 <_Heap_Walk+0x488>
return false;
}
prev_block = free_block;
free_block = free_block->next;
492ac: 2068 0008 moveal %a0@(8),%a0
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 ) {
492b0: b1ca cmpal %a2,%a0
492b2: 6764 beqs 49318 <_Heap_Walk+0x24a>
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;
492b4: b288 cmpl %a0,%d1
492b6: 6244 bhis 492fc <_Heap_Walk+0x22e>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
492b8: 2408 movel %a0,%d2
492ba: 5082 addql #8,%d2
492bc: 2246 moveal %d6,%a1
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;
492be: be88 cmpl %a0,%d7
492c0: 653a bcss 492fc <_Heap_Walk+0x22e> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
492c2: 202e fffc movel %fp@(-4),%d0
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
492c6: 2c08 movel %a0,%d6
492c8: 4c40 2005 remul %d0,%d5,%d2
);
return false;
}
if (
492cc: 4a85 tstl %d5
492ce: 6600 026a bnew 4953a <_Heap_Walk+0x46c>
- 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;
492d2: 74fe moveq #-2,%d2
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;
492d4: 7001 moveq #1,%d0
- 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;
492d6: c4a8 0004 andl %a0@(4),%d2
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;
492da: c0b0 2804 andl %a0@(00000004,%d2:l),%d0
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
492de: 67c2 beqs 492a2 <_Heap_Walk+0x1d4>
(*printer)(
492e0: 2f08 movel %a0,%sp@-
492e2: 4879 0005 e46b pea 5e46b <_Copyright_Notice+0x26d>
492e8: 4878 0001 pea 1 <ADD>
492ec: 2f2e 000c movel %fp@(12),%sp@-
492f0: 4e94 jsr %a4@
492f2: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
492f6: 4200 clrb %d0
492f8: 6000 fea8 braw 491a2 <_Heap_Walk+0xd4>
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 ) ) {
(*printer)(
492fc: 2f08 movel %a0,%sp@-
492fe: 4879 0005 e41b pea 5e41b <_Copyright_Notice+0x21d>
49304: 4878 0001 pea 1 <ADD>
49308: 2f2e 000c movel %fp@(12),%sp@-
4930c: 4e94 jsr %a4@
4930e: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
49312: 4200 clrb %d0
49314: 6000 fe8c braw 491a2 <_Heap_Walk+0xd4>
49318: 242e fff8 movel %fp@(-8),%d2
4931c: 202e fff4 movel %fp@(-12),%d0
49320: 2d42 fffc movel %d2,%fp@(-4)
49324: 2e00 movel %d0,%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;
49326: 74fe moveq #-2,%d2
49328: 204d moveal %a5,%a0
4932a: 2a4b moveal %a3,%a5
4932c: 2a0b movel %a3,%d5
4932e: 264a moveal %a2,%a3
49330: ce82 andl %d2,%d7
49332: 2d48 fff8 movel %a0,%fp@(-8)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
49336: 45f5 7800 lea %a5@(00000000,%d7:l),%a2
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;
4933a: b5c1 cmpal %d1,%a2
4933c: 6568 bcss 493a6 <_Heap_Walk+0x2d8> <== NEVER TAKEN
4933e: b5eb 0024 cmpal %a3@(36),%a2
49342: 6262 bhis 493a6 <_Heap_Walk+0x2d8>
uintptr_t const block_begin = (uintptr_t) block;
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;
bool const is_not_last_block = block != last_block;
49344: bbee fff8 cmpal %fp@(-8),%a5
49348: 56c0 sne %d0
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4934a: 2c2e fffc movel %fp@(-4),%d6
4934e: 2407 movel %d7,%d2
49350: 4480 negl %d0
49352: 4c46 2001 remul %d6,%d1,%d2
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
49356: 4a81 tstl %d1
49358: 6700 0084 beqw 493de <_Heap_Walk+0x310>
4935c: 4a00 tstb %d0
4935e: 6664 bnes 493c4 <_Heap_Walk+0x2f6>
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;
49360: 7001 moveq #1,%d0
49362: c0aa 0004 andl %a2@(4),%d0
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
49366: 6700 00e8 beqw 49450 <_Heap_Walk+0x382>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
4936a: 4a84 tstl %d4
4936c: 6700 00c6 beqw 49434 <_Heap_Walk+0x366>
(*printer)(
49370: 2f07 movel %d7,%sp@-
49372: 2f0d movel %a5,%sp@-
49374: 4879 0005 e610 pea 5e610 <_Copyright_Notice+0x412>
4937a: 42a7 clrl %sp@-
4937c: 2f2e 000c movel %fp@(12),%sp@-
49380: 4e94 jsr %a4@
49382: 4fef 0014 lea %sp@(20),%sp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
49386: b5c5 cmpal %d5,%a2
49388: 6700 fd74 beqw 490fe <_Heap_Walk+0x30>
4938c: 2e2a 0004 movel %a2@(4),%d7
49390: 7801 moveq #1,%d4
- 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;
49392: 74fe moveq #-2,%d2
49394: 2a4a moveal %a2,%a5
49396: c887 andl %d7,%d4
49398: ce82 andl %d2,%d7
4939a: 222b 0020 movel %a3@(32),%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4939e: 45f5 7800 lea %a5@(00000000,%d7:l),%a2
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;
493a2: b5c1 cmpal %d1,%a2
493a4: 6498 bccs 4933e <_Heap_Walk+0x270> <== ALWAYS TAKEN
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
493a6: 2f0a movel %a2,%sp@-
493a8: 2f0d movel %a5,%sp@-
493aa: 4879 0005 e4b9 pea 5e4b9 <_Copyright_Notice+0x2bb>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
493b0: 4878 0001 pea 1 <ADD>
493b4: 2f2e 000c movel %fp@(12),%sp@-
493b8: 4e94 jsr %a4@
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
493ba: 4fef 0014 lea %sp@(20),%sp
493be: 4200 clrb %d0
493c0: 6000 fde0 braw 491a2 <_Heap_Walk+0xd4>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
493c4: 2f07 movel %d7,%sp@-
493c6: 2f0d movel %a5,%sp@-
493c8: 4879 0005 e4e6 pea 5e4e6 <_Copyright_Notice+0x2e8>
493ce: 4878 0001 pea 1 <ADD>
493d2: 2f2e 000c movel %fp@(12),%sp@-
493d6: 4e94 jsr %a4@
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
493d8: 4fef 0014 lea %sp@(20),%sp
493dc: 60e0 bras 493be <_Heap_Walk+0x2f0>
}
if ( block_size < min_block_size && is_not_last_block ) {
493de: be83 cmpl %d3,%d7
493e0: 642c bccs 4940e <_Heap_Walk+0x340>
493e2: 4a00 tstb %d0
493e4: 6700 ff7a beqw 49360 <_Heap_Walk+0x292>
(*printer)(
493e8: 2f03 movel %d3,%sp@-
493ea: 2f07 movel %d7,%sp@-
493ec: 2f0d movel %a5,%sp@-
493ee: 4879 0005 e514 pea 5e514 <_Copyright_Notice+0x316>
493f4: 4878 0001 pea 1 <ADD>
493f8: 2f2e 000c movel %fp@(12),%sp@-
493fc: 4e94 jsr %a4@
block,
block_size,
min_block_size
);
return false;
493fe: 4fef 0018 lea %sp@(24),%sp
block = next_block;
} while ( block != first_block );
return true;
}
49402: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
block,
block_size,
min_block_size
);
return false;
49408: 4200 clrb %d0
block = next_block;
} while ( block != first_block );
return true;
}
4940a: 4e5e unlk %fp
4940c: 4e75 rts
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
4940e: b5cd cmpal %a5,%a2
49410: 6200 ff4e bhiw 49360 <_Heap_Walk+0x292>
49414: 4a00 tstb %d0
49416: 6700 ff48 beqw 49360 <_Heap_Walk+0x292>
(*printer)(
4941a: 2f0a movel %a2,%sp@-
4941c: 2f0d movel %a5,%sp@-
4941e: 4879 0005 e53f pea 5e53f <_Copyright_Notice+0x341>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
49424: 4878 0001 pea 1 <ADD>
49428: 2f2e 000c movel %fp@(12),%sp@-
4942c: 4e94 jsr %a4@
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
4942e: 4fef 0014 lea %sp@(20),%sp
49432: 608a bras 493be <_Heap_Walk+0x2f0>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
49434: 2f15 movel %a5@,%sp@-
49436: 2f07 movel %d7,%sp@-
49438: 2f0d movel %a5,%sp@-
4943a: 4879 0005 e627 pea 5e627 <_Copyright_Notice+0x429>
49440: 42a7 clrl %sp@-
49442: 2f2e 000c movel %fp@(12),%sp@-
49446: 4e94 jsr %a4@
49448: 4fef 0018 lea %sp@(24),%sp
4944c: 6000 ff38 braw 49386 <_Heap_Walk+0x2b8>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
49450: 206b 0008 moveal %a3@(8),%a0
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
49454: 222d 0008 movel %a5@(8),%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)(
49458: b2ab 000c cmpl %a3@(12),%d1
4945c: 6700 00b6 beqw 49514 <_Heap_Walk+0x446>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
49460: 43f9 0005 e13e lea 5e13e <rtems_termios_baud_table+0x10a>,%a1
49466: b28b cmpl %a3,%d1
49468: 676e beqs 494d8 <_Heap_Walk+0x40a>
false,
"block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n",
block,
block_size,
block->prev,
block->prev == first_free_block ?
4946a: 202d 000c movel %a5@(12),%d0
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)(
4946e: b088 cmpl %a0,%d0
49470: 6700 0098 beqw 4950a <_Heap_Walk+0x43c>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
49474: 41f9 0005 e13e lea 5e13e <rtems_termios_baud_table+0x10a>,%a0
4947a: b08b cmpl %a3,%d0
4947c: 6762 beqs 494e0 <_Heap_Walk+0x412>
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)(
4947e: 2f09 movel %a1,%sp@-
49480: 2f01 movel %d1,%sp@-
49482: 2f08 movel %a0,%sp@-
49484: 2f00 movel %d0,%sp@-
49486: 2f07 movel %d7,%sp@-
49488: 2f0d movel %a5,%sp@-
4948a: 4879 0005 e573 pea 5e573 <_Copyright_Notice+0x375>
49490: 42a7 clrl %sp@-
49492: 2f2e 000c movel %fp@(12),%sp@-
49496: 4e94 jsr %a4@
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
49498: 2012 movel %a2@,%d0
4949a: 4fef 0024 lea %sp@(36),%sp
4949e: b087 cmpl %d7,%d0
494a0: 6646 bnes 494e8 <_Heap_Walk+0x41a>
);
return false;
}
if ( !prev_used ) {
494a2: 4a84 tstl %d4
494a4: 6778 beqs 4951e <_Heap_Walk+0x450>
494a6: 206b 0008 moveal %a3@(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 ) {
494aa: b1cb cmpal %a3,%a0
494ac: 670e beqs 494bc <_Heap_Walk+0x3ee> <== NEVER TAKEN
if ( free_block == block ) {
494ae: b1cd cmpal %a5,%a0
494b0: 6700 fed4 beqw 49386 <_Heap_Walk+0x2b8>
return true;
}
free_block = free_block->next;
494b4: 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 ) {
494b8: b1cb cmpal %a3,%a0
494ba: 66f2 bnes 494ae <_Heap_Walk+0x3e0>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
494bc: 2f0d movel %a5,%sp@-
494be: 4879 0005 e64c pea 5e64c <_Copyright_Notice+0x44e>
494c4: 4878 0001 pea 1 <ADD>
494c8: 2f2e 000c movel %fp@(12),%sp@-
494cc: 4e94 jsr %a4@
494ce: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
494d2: 4200 clrb %d0
494d4: 6000 fccc braw 491a2 <_Heap_Walk+0xd4>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
494d8: 43f9 0005 e26e lea 5e26e <_Copyright_Notice+0x70>,%a1
494de: 608a bras 4946a <_Heap_Walk+0x39c>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
494e0: 41f9 0005 e288 lea 5e288 <_Copyright_Notice+0x8a>,%a0
494e6: 6096 bras 4947e <_Heap_Walk+0x3b0>
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
494e8: 2f0a movel %a2,%sp@-
494ea: 2f00 movel %d0,%sp@-
494ec: 2f07 movel %d7,%sp@-
494ee: 2f0d movel %a5,%sp@-
494f0: 4879 0005 e5a8 pea 5e5a8 <_Copyright_Notice+0x3aa>
494f6: 4878 0001 pea 1 <ADD>
494fa: 2f2e 000c movel %fp@(12),%sp@-
494fe: 4e94 jsr %a4@
49500: 4fef 001c lea %sp@(28),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
49504: 4200 clrb %d0
49506: 6000 fc9a braw 491a2 <_Heap_Walk+0xd4>
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)(
4950a: 41f9 0005 e278 lea 5e278 <_Copyright_Notice+0x7a>,%a0
49510: 6000 ff6c braw 4947e <_Heap_Walk+0x3b0>
49514: 43f9 0005 e25f lea 5e25f <_Copyright_Notice+0x61>,%a1
4951a: 6000 ff4e braw 4946a <_Heap_Walk+0x39c>
return false;
}
if ( !prev_used ) {
(*printer)(
4951e: 2f0d movel %a5,%sp@-
49520: 4879 0005 e5e1 pea 5e5e1 <_Copyright_Notice+0x3e3>
49526: 4878 0001 pea 1 <ADD>
4952a: 2f2e 000c movel %fp@(12),%sp@-
4952e: 4e94 jsr %a4@
49530: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
49534: 4200 clrb %d0
49536: 6000 fc6a braw 491a2 <_Heap_Walk+0xd4>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
4953a: 2f08 movel %a0,%sp@-
4953c: 4879 0005 e43b pea 5e43b <_Copyright_Notice+0x23d>
49542: 4878 0001 pea 1 <ADD>
49546: 2f2e 000c movel %fp@(12),%sp@-
4954a: 4e94 jsr %a4@
4954c: 4fef 0010 lea %sp@(16),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
49550: 4200 clrb %d0
49552: 6000 fc4e braw 491a2 <_Heap_Walk+0xd4>
return false;
}
if ( free_block->prev != prev_block ) {
(*printer)(
49556: 2f05 movel %d5,%sp@-
49558: 2f08 movel %a0,%sp@-
4955a: 4879 0005 e487 pea 5e487 <_Copyright_Notice+0x289>
49560: 4878 0001 pea 1 <ADD>
49564: 2f2e 000c movel %fp@(12),%sp@-
49568: 4e94 jsr %a4@
4956a: 4fef 0014 lea %sp@(20),%sp
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
4956e: 4200 clrb %d0
49570: 6000 fc30 braw 491a2 <_Heap_Walk+0xd4>
00047d00 <_IO_Initialize_all_drivers>:
void _IO_Initialize_all_drivers( void )
{
47d00: 4e56 0000 linkw %fp,#0
47d04: 2f0a movel %a2,%sp@-
47d06: 2f02 movel %d2,%sp@-
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
47d08: 4ab9 0005 fbf8 tstl 5fbf8 <_IO_Number_of_drivers>
47d0e: 671e beqs 47d2e <_IO_Initialize_all_drivers+0x2e><== NEVER TAKEN
47d10: 4282 clrl %d2
47d12: 45f9 0004 c53c lea 4c53c <rtems_io_initialize>,%a2
(void) rtems_io_initialize( major, 0, NULL );
47d18: 42a7 clrl %sp@-
47d1a: 42a7 clrl %sp@-
47d1c: 2f02 movel %d2,%sp@-
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
47d1e: 5282 addql #1,%d2
(void) rtems_io_initialize( major, 0, NULL );
47d20: 4e92 jsr %a2@
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
47d22: 4fef 000c lea %sp@(12),%sp
47d26: b4b9 0005 fbf8 cmpl 5fbf8 <_IO_Number_of_drivers>,%d2
47d2c: 65ea bcss 47d18 <_IO_Initialize_all_drivers+0x18>
(void) rtems_io_initialize( major, 0, NULL );
}
47d2e: 242e fff8 movel %fp@(-8),%d2
47d32: 246e fffc moveal %fp@(-4),%a2
47d36: 4e5e unlk %fp
...
00047c60 <_IO_Manager_initialization>:
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
{
47c60: 4e56 fff0 linkw %fp,#-16
47c64: 48d7 003c moveml %d2-%d5,%sp@
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = rtems_configuration_get_device_driver_table();
47c68: 2439 0005 c610 movel 5c610 <Configuration+0x3c>,%d2
drivers_in_table = rtems_configuration_get_number_of_device_drivers();
47c6e: 2839 0005 c60c movel 5c60c <Configuration+0x38>,%d4
number_of_drivers = rtems_configuration_get_maximum_drivers();
47c74: 2639 0005 c608 movel 5c608 <Configuration+0x34>,%d3
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
47c7a: b684 cmpl %d4,%d3
47c7c: 636c blss 47cea <_IO_Manager_initialization+0x8a>
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
47c7e: 2003 movel %d3,%d0
47c80: 2a03 movel %d3,%d5
47c82: e788 lsll #3,%d0
47c84: eb8d lsll #5,%d5
47c86: 9a80 subl %d0,%d5
47c88: 2f05 movel %d5,%sp@-
47c8a: 4eb9 0004 ac2a jsr 4ac2a <_Workspace_Allocate_or_fatal_error>
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
47c90: 2f05 movel %d5,%sp@-
47c92: 42a7 clrl %sp@-
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
47c94: 23c0 0005 fbfc movel %d0,5fbfc <_IO_Driver_address_table>
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
47c9a: 2f00 movel %d0,%sp@-
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
47c9c: 23c3 0005 fbf8 movel %d3,5fbf8 <_IO_Number_of_drivers>
memset(
47ca2: 4eb9 0004 e9d4 jsr 4e9d4 <memset>
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
47ca8: 4fef 0010 lea %sp@(16),%sp
47cac: 4a84 tstl %d4
47cae: 6730 beqs 47ce0 <_IO_Manager_initialization+0x80><== NEVER TAKEN
#include <rtems/score/thread.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
47cb0: 2a04 movel %d4,%d5
47cb2: 2204 movel %d4,%d1
47cb4: 4280 clrl %d0
47cb6: e78d lsll #3,%d5
47cb8: eb89 lsll #5,%d1
47cba: 2639 0005 fbfc movel 5fbfc <_IO_Driver_address_table>,%d3
47cc0: 9285 subl %d5,%d1
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
47cc2: 2242 moveal %d2,%a1
47cc4: 2043 moveal %d3,%a0
47cc6: d3c0 addal %d0,%a1
47cc8: d1c0 addal %d0,%a0
47cca: 0680 0000 0018 addil #24,%d0
47cd0: 20d9 movel %a1@+,%a0@+
47cd2: 20d9 movel %a1@+,%a0@+
47cd4: 20d9 movel %a1@+,%a0@+
47cd6: 20d9 movel %a1@+,%a0@+
47cd8: 20d9 movel %a1@+,%a0@+
47cda: 2091 movel %a1@,%a0@
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
47cdc: b280 cmpl %d0,%d1
47cde: 66e2 bnes 47cc2 <_IO_Manager_initialization+0x62>
_IO_Driver_address_table[index] = driver_table[index];
}
47ce0: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5
47ce6: 4e5e unlk %fp
47ce8: 4e75 rts
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
47cea: 23c2 0005 fbfc movel %d2,5fbfc <_IO_Driver_address_table>
_IO_Number_of_drivers = number_of_drivers;
47cf0: 23c4 0005 fbf8 movel %d4,5fbf8 <_IO_Number_of_drivers>
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
47cf6: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5
47cfc: 4e5e unlk %fp <== NOT EXECUTED
0004891c <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
4891c: 4e56 ffe8 linkw %fp,#-24
48920: 48d7 001c moveml %d2-%d4,%sp@
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, is_internal, error };
_User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor );
48924: 4879 0004 a788 pea 4a788 <_User_extensions_Fatal_visitor>
4892a: 262e 0010 movel %fp@(16),%d3
4892e: 486e fff6 pea %fp@(-10)
48932: 282e 0008 movel %fp@(8),%d4
48936: 242e 000c movel %fp@(12),%d2
Internal_errors_Source source,
bool is_internal,
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, is_internal, error };
4893a: 2d44 fff6 movel %d4,%fp@(-10)
4893e: 1d42 fffa moveb %d2,%fp@(-6)
48942: 2d43 fffc movel %d3,%fp@(-4)
_User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor );
48946: 4eb9 0004 a7b8 jsr 4a7b8 <_User_extensions_Iterate>
_User_extensions_Fatal( the_source, is_internal, the_error );
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
4894c: 13c2 0005 fb66 moveb %d2,5fb66 <_Internal_errors_What_happened+0x4><== NOT EXECUTED
_Internal_errors_What_happened.the_error = the_error;
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
48952: 2043 moveal %d3,%a0 <== NOT EXECUTED
48954: 243c 0000 0700 movel #1792,%d2 <== NOT EXECUTED
Internal_errors_t the_error
)
{
_User_extensions_Fatal( the_source, is_internal, the_error );
_Internal_errors_What_happened.the_source = the_source;
4895a: 23c4 0005 fb62 movel %d4,5fb62 <_Internal_errors_What_happened><== NOT EXECUTED
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
48960: 23c3 0005 fb68 movel %d3,5fb68 <_Internal_errors_What_happened+0x6><== NOT EXECUTED
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
48966: 40c0 movew %sr,%d0 <== NOT EXECUTED
48968: 8082 orl %d2,%d0 <== NOT EXECUTED
4896a: 46c0 movew %d0,%sr <== NOT EXECUTED
4896c: 2008 movel %a0,%d0 <== NOT EXECUTED
4896e: 223c dead beef movel #-559038737,%d1 <== NOT EXECUTED
48974: 4ac8 halt <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
48976: 7005 moveq #5,%d0 <== NOT EXECUTED
48978: 508f addql #8,%sp <== NOT EXECUTED
4897a: 23c0 0005 fb6c movel %d0,5fb6c <_System_state_Current> <== NOT EXECUTED
48980: 60fe bras 48980 <_Internal_error_Occurred+0x64> <== NOT EXECUTED
...
000489e4 <_Objects_Allocate>:
#endif
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
489e4: 4e56 fff0 linkw %fp,#-16
489e8: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
489ec: 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 )
489f0: 4aaa 0014 tstl %a2@(20)
489f4: 6770 beqs 48a66 <_Objects_Allocate+0x82> <== NEVER TAKEN
/*
* 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 );
489f6: 240a movel %a2,%d2
489f8: 0682 0000 001c addil #28,%d2
489fe: 47f9 0004 7f74 lea 47f74 <_Chain_Get>,%a3
48a04: 2f02 movel %d2,%sp@-
48a06: 4e93 jsr %a3@
if ( information->auto_extend ) {
48a08: 588f addql #4,%sp
48a0a: 4a2a 0010 tstb %a2@(16)
48a0e: 673a beqs 48a4a <_Objects_Allocate+0x66>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
48a10: 4a80 tstl %d0
48a12: 6740 beqs 48a54 <_Objects_Allocate+0x70>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
48a14: 2040 moveal %d0,%a0
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
48a16: 4282 clrl %d2
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
48a18: 2228 0008 movel %a0@(8),%d1
48a1c: 262a 0006 movel %a2@(6),%d3
48a20: 0281 0000 ffff andil #65535,%d1
48a26: 0283 0000 ffff andil #65535,%d3
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
48a2c: 342a 0012 movew %a2@(18),%d2
information->inactive_per_block[ block ]--;
48a30: 206a 002a moveal %a2@(42),%a0
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
48a34: 9283 subl %d3,%d1
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
48a36: 4c42 1001 remul %d2,%d1,%d1
information->inactive_per_block[ block ]--;
information->inactive--;
48a3a: 326a 0028 moveaw %a2@(40),%a1
block = (uint32_t) _Objects_Get_index( the_object->id ) -
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
48a3e: e589 lsll #2,%d1
information->inactive--;
48a40: 5389 subql #1,%a1
block = (uint32_t) _Objects_Get_index( the_object->id ) -
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
48a42: d1c1 addal %d1,%a0
48a44: 5390 subql #1,%a0@
information->inactive--;
48a46: 3549 0028 movew %a1,%a2@(40)
);
}
#endif
return the_object;
}
48a4a: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
48a50: 4e5e unlk %fp
48a52: 4e75 rts
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
_Objects_Extend_information( information );
48a54: 2f0a movel %a2,%sp@-
48a56: 4eb9 0004 8aa0 jsr 48aa0 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
48a5c: 2f02 movel %d2,%sp@-
48a5e: 4e93 jsr %a3@
}
if ( the_object ) {
48a60: 508f addql #8,%sp
48a62: 4a80 tstl %d0
48a64: 66ae bnes 48a14 <_Objects_Allocate+0x30>
* 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 )
return NULL;
48a66: 4280 clrl %d0
);
}
#endif
return the_object;
}
48a68: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
48a6e: 4e5e unlk %fp
...
00048a74 <_Objects_Close>:
void _Objects_Close(
Objects_Information *information,
Objects_Control *the_object
)
{
48a74: 4e56 0000 linkw %fp,#0
48a78: 226e 000c moveal %fp@(12),%a1
48a7c: 206e 0008 moveal %fp@(8),%a0
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
48a80: 2029 0008 movel %a1@(8),%d0
48a84: 2f0a movel %a2,%sp@-
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
48a86: 2468 0018 moveal %a0@(24),%a2
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
48a8a: 0280 0000 ffff andil #65535,%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
48a90: 42b2 0c00 clrl %a2@(00000000,%d0:l:4)
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
}
48a94: 245f moveal %sp@+,%a2
48a96: 4e5e unlk %fp
Objects_Control *the_object
)
{
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
48a98: 4ef9 0004 9024 jmp 49024 <_Objects_Namespace_remove>
...
00048aa0 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
48aa0: 4e56 ffc8 linkw %fp,#-56
48aa4: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
48aa8: 246e 0008 moveal %fp@(8),%a2
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
48aac: 2a2a 0006 movel %a2@(6),%d5
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
48ab0: 206a 002e moveal %a2@(46),%a0
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
48ab4: 0285 0000 ffff andil #65535,%d5
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
48aba: 4a88 tstl %a0
48abc: 6700 020c beqw 48cca <_Objects_Extend_information+0x22a>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
48ac0: 3e2a 000e movew %a2@(14),%d7
48ac4: 302a 0012 movew %a2@(18),%d0
48ac8: 3807 movew %d7,%d4
48aca: 0284 0000 ffff andil #65535,%d4
48ad0: 88c0 divuw %d0,%d4
48ad2: 0284 0000 ffff andil #65535,%d4
for ( ; block < block_count; block++ ) {
48ad8: 6700 0260 beqw 48d3a <_Objects_Extend_information+0x29a>
if ( information->object_blocks[ block ] == NULL ) {
48adc: 4a90 tstl %a0@
48ade: 6700 026c beqw 48d4c <_Objects_Extend_information+0x2ac>
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
48ae2: 5888 addql #4,%a0
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
48ae4: 2605 movel %d5,%d3
index_base = minimum_index;
block = 0;
48ae6: 4282 clrl %d2
48ae8: 0280 0000 ffff andil #65535,%d0
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
break;
} else
index_base += information->allocation_size;
48aee: d680 addl %d0,%d3
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
48af0: 5282 addql #1,%d2
48af2: b484 cmpl %d4,%d2
48af4: 6400 01ac bccw 48ca2 <_Objects_Extend_information+0x202>
if ( information->object_blocks[ block ] == NULL ) {
48af8: 4a98 tstl %a0@+
48afa: 66f2 bnes 48aee <_Objects_Extend_information+0x4e>
do_extend = false;
48afc: 97cb subal %a3,%a3
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
48afe: 0287 0000 ffff andil #65535,%d7
48b04: de80 addl %d0,%d7
/*
* We need to limit the number of objects to the maximum number
* representable in the index portion of the object Id. In the
* case of 16-bit Ids, this is only 256 object instances.
*/
if ( maximum > OBJECTS_ID_FINAL_INDEX ) {
48b06: 0c87 0000 ffff cmpil #65535,%d7
48b0c: 6200 018a bhiw 48c98 <_Objects_Extend_information+0x1f8>
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
48b10: 41ea 0014 lea %a2@(20),%a0
48b14: 4c10 0800 mulsl %a0@,%d0
if ( information->auto_extend ) {
48b18: 4a2a 0010 tstb %a2@(16)
48b1c: 6700 018c beqw 48caa <_Objects_Extend_information+0x20a>
new_object_block = _Workspace_Allocate( block_size );
48b20: 2f00 movel %d0,%sp@-
48b22: 4eb9 0004 abf4 jsr 4abf4 <_Workspace_Allocate>
if ( !new_object_block )
48b28: 588f addql #4,%sp
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
48b2a: 2c00 movel %d0,%d6
if ( !new_object_block )
48b2c: 6700 016a beqw 48c98 <_Objects_Extend_information+0x1f8>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
48b30: 300b movew %a3,%d0
48b32: 4a00 tstb %d0
48b34: 6700 00c4 beqw 48bfa <_Objects_Extend_information+0x15a>
*/
/*
* Up the block count and maximum
*/
block_count++;
48b38: 2844 moveal %d4,%a4
48b3a: 528c addql #1,%a4
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
48b3c: 2007 movel %d7,%d0
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
48b3e: 41f4 ca00 lea %a4@(00000000,%a4:l:2),%a0
((maximum + minimum_index) * sizeof(Objects_Control *));
48b42: d088 addl %a0,%d0
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
48b44: d085 addl %d5,%d0
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
48b46: e588 lsll #2,%d0
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
48b48: 4a2a 0010 tstb %a2@(16)
48b4c: 6700 016c beqw 48cba <_Objects_Extend_information+0x21a>
object_blocks = _Workspace_Allocate( block_size );
48b50: 2f00 movel %d0,%sp@-
48b52: 4eb9 0004 abf4 jsr 4abf4 <_Workspace_Allocate>
if ( !object_blocks ) {
48b58: 588f addql #4,%sp
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
object_blocks = _Workspace_Allocate( block_size );
48b5a: 2640 moveal %d0,%a3
if ( !object_blocks ) {
48b5c: 4a80 tstl %d0
48b5e: 6700 01c6 beqw 48d26 <_Objects_Extend_information+0x286>
}
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
48b62: 220c movel %a4,%d1
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
48b64: 4280 clrl %d0
}
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
48b66: e589 lsll #2,%d1
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
48b68: 302a 000e movew %a2@(14),%d0
48b6c: 43f3 1800 lea %a3@(00000000,%d1:l),%a1
48b70: 49f1 1800 lea %a1@(00000000,%d1:l),%a4
48b74: b085 cmpl %d5,%d0
48b76: 6200 016a bhiw 48ce2 <_Objects_Extend_information+0x242>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
48b7a: 4a85 tstl %d5
48b7c: 670c beqs 48b8a <_Objects_Extend_information+0xea><== NEVER TAKEN
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
48b7e: 204c moveal %a4,%a0
48b80: 4bf4 5c00 lea %a4@(00000000,%d5:l:4),%a5
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
local_table[ index ] = NULL;
48b84: 4298 clrl %a0@+
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
48b86: bbc8 cmpal %a0,%a5
48b88: 66fa bnes 48b84 <_Objects_Extend_information+0xe4><== NEVER TAKEN
48b8a: e58c lsll #2,%d4
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
48b8c: 4280 clrl %d0
48b8e: 2203 movel %d3,%d1
48b90: 302a 0012 movew %a2@(18),%d0
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
48b94: 42b3 4800 clrl %a3@(00000000,%d4:l)
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
48b98: d280 addl %d0,%d1
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
48b9a: 42b1 4800 clrl %a1@(00000000,%d4:l)
for ( index=index_base ;
48b9e: b283 cmpl %d3,%d1
48ba0: 630e blss 48bb0 <_Objects_Extend_information+0x110><== NEVER TAKEN
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
48ba2: 4281 clrl %d1
48ba4: 41f4 3c00 lea %a4@(00000000,%d3:l:4),%a0
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
48ba8: 4298 clrl %a0@+
48baa: 5281 addql #1,%d1
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
48bac: b081 cmpl %d1,%d0
48bae: 66f8 bnes 48ba8 <_Objects_Extend_information+0x108>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
48bb0: 203c 0000 0700 movel #1792,%d0
48bb6: 40c4 movew %sr,%d4
48bb8: 8084 orl %d4,%d0
48bba: 46c0 movew %d0,%sr
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48bbc: 2012 movel %a2@,%d0
48bbe: 7a18 moveq #24,%d5
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
information->maximum_id = _Objects_Build_id(
48bc0: 4281 clrl %d1
48bc2: eba8 lsll %d5,%d0
48bc4: 322a 0004 movew %a2@(4),%d1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48bc8: 1a3c 001b moveb #27,%d5
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48bcc: 08c0 0010 bset #16,%d0
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48bd0: eba9 lsll %d5,%d1
local_table[ index ] = NULL;
}
_ISR_Disable( level );
old_tables = information->object_blocks;
48bd2: 206a 002e moveal %a2@(46),%a0
48bd6: 8081 orl %d1,%d0
information->object_blocks = object_blocks;
48bd8: 254b 002e movel %a3,%a2@(46)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48bdc: 8087 orl %d7,%d0
information->inactive_per_block = inactive_per_block;
48bde: 2549 002a movel %a1,%a2@(42)
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
48be2: 3547 000e movew %d7,%a2@(14)
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
48be6: 254c 0018 movel %a4,%a2@(24)
48bea: 2540 000a movel %d0,%a2@(10)
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
48bee: 46c4 movew %d4,%sr
_Workspace_Free( old_tables );
48bf0: 2f08 movel %a0,%sp@-
48bf2: 4eb9 0004 ac10 jsr 4ac10 <_Workspace_Free>
48bf8: 588f addql #4,%sp
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
48bfa: 206a 002e moveal %a2@(46),%a0
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
48bfe: 4280 clrl %d0
48c00: 280e movel %fp,%d4
48c02: 0684 ffff fff4 addil #-12,%d4
48c08: 47f9 0004 7f74 lea 47f74 <_Chain_Get>,%a3
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
48c0e: 2a0a movel %a2,%d5
48c10: 0685 0000 001c addil #28,%d5
48c16: 49f9 0004 7f3c lea 47f3c <_Chain_Append>,%a4
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
48c1c: e58a lsll #2,%d2
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
48c1e: 302a 0012 movew %a2@(18),%d0
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
48c22: 2186 2800 movel %d6,%a0@(00000000,%d2:l)
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
48c26: 2f2a 0014 movel %a2@(20),%sp@-
48c2a: 206a 002e moveal %a2@(46),%a0
48c2e: 2f00 movel %d0,%sp@-
48c30: 2f30 2800 movel %a0@(00000000,%d2:l),%sp@-
48c34: 2f04 movel %d4,%sp@-
48c36: 4eb9 0004 7fb0 jsr 47fb0 <_Chain_Initialize>
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
48c3c: 4fef 0010 lea %sp@(16),%sp
48c40: 2f04 movel %d4,%sp@-
48c42: 4e93 jsr %a3@
48c44: 588f addql #4,%sp
48c46: 4a80 tstl %d0
48c48: 6734 beqs 48c7e <_Objects_Extend_information+0x1de><== NEVER TAKEN
48c4a: 2212 movel %a2@,%d1
48c4c: 7e18 moveq #24,%d7
the_object->id = _Objects_Build_id(
48c4e: 4286 clrl %d6
48c50: 2040 moveal %d0,%a0
48c52: 3c2a 0004 movew %a2@(4),%d6
48c56: efa9 lsll %d7,%d1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48c58: 1e3c 001b moveb #27,%d7
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48c5c: 08c1 0010 bset #16,%d1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48c60: efae lsll %d7,%d6
48c62: 8286 orl %d6,%d1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48c64: 8283 orl %d3,%d1
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
48c66: 5283 addql #1,%d3
48c68: 2141 0008 movel %d1,%a0@(8)
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
48c6c: 2f00 movel %d0,%sp@-
48c6e: 2f05 movel %d5,%sp@-
48c70: 4e94 jsr %a4@
index++;
48c72: 508f addql #8,%sp
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
48c74: 2f04 movel %d4,%sp@-
48c76: 4e93 jsr %a3@
48c78: 588f addql #4,%sp
48c7a: 4a80 tstl %d0
48c7c: 66cc bnes 48c4a <_Objects_Extend_information+0x1aa>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
48c7e: 4281 clrl %d1
48c80: 302a 0012 movew %a2@(18),%d0
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
48c84: 326a 0028 moveaw %a2@(40),%a1
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
48c88: 206a 002a moveal %a2@(42),%a0
48c8c: 3200 movew %d0,%d1
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
48c8e: d089 addl %a1,%d0
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
48c90: 2181 2800 movel %d1,%a0@(00000000,%d2:l)
information->inactive =
48c94: 3540 0028 movew %d0,%a2@(40)
(Objects_Maximum)(information->inactive + information->allocation_size);
}
48c98: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
48c9e: 4e5e unlk %fp
48ca0: 4e75 rts
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
48ca2: 367c 0001 moveaw #1,%a3
48ca6: 6000 fe56 braw 48afe <_Objects_Extend_information+0x5e>
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
if ( !new_object_block )
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
48caa: 2f00 movel %d0,%sp@-
48cac: 4eb9 0004 ac2a jsr 4ac2a <_Workspace_Allocate_or_fatal_error>
48cb2: 588f addql #4,%sp
48cb4: 2c00 movel %d0,%d6
48cb6: 6000 fe78 braw 48b30 <_Objects_Extend_information+0x90>
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
return;
}
} else {
object_blocks = _Workspace_Allocate_or_fatal_error( block_size );
48cba: 2f00 movel %d0,%sp@-
48cbc: 4eb9 0004 ac2a jsr 4ac2a <_Workspace_Allocate_or_fatal_error>
48cc2: 588f addql #4,%sp
48cc4: 2640 moveal %d0,%a3
48cc6: 6000 fe9a braw 48b62 <_Objects_Extend_information+0xc2>
48cca: 4280 clrl %d0
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
48ccc: 2605 movel %d5,%d3
index_base = minimum_index;
block = 0;
48cce: 4282 clrl %d2
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
48cd0: 4284 clrl %d4
48cd2: 3e2a 000e movew %a2@(14),%d7
48cd6: 302a 0012 movew %a2@(18),%d0
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
48cda: 367c 0001 moveaw #1,%a3
48cde: 6000 fe1e braw 48afe <_Objects_Extend_information+0x5e>
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
48ce2: 4bf9 0004 e964 lea 4e964 <memcpy>,%a5
48ce8: e58c lsll #2,%d4
48cea: 2f04 movel %d4,%sp@-
48cec: 2f2a 002e movel %a2@(46),%sp@-
48cf0: 2d49 fff0 movel %a1,%fp@(-16)
48cf4: 2f0b movel %a3,%sp@-
48cf6: 4e95 jsr %a5@
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
48cf8: 226e fff0 moveal %fp@(-16),%a1
48cfc: 2f04 movel %d4,%sp@-
48cfe: 2f2a 002a movel %a2@(42),%sp@-
48d02: 2f09 movel %a1,%sp@-
48d04: 4e95 jsr %a5@
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
48d06: 4280 clrl %d0
48d08: 302a 000e movew %a2@(14),%d0
48d0c: da80 addl %d0,%d5
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
48d0e: e58d lsll #2,%d5
48d10: 2f05 movel %d5,%sp@-
48d12: 2f2a 0018 movel %a2@(24),%sp@-
48d16: 2f0c movel %a4,%sp@-
48d18: 4e95 jsr %a5@
48d1a: 226e fff0 moveal %fp@(-16),%a1
48d1e: 4fef 0024 lea %sp@(36),%sp
48d22: 6000 fe68 braw 48b8c <_Objects_Extend_information+0xec>
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
object_blocks = _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
48d26: 2f06 movel %d6,%sp@-
48d28: 4eb9 0004 ac10 jsr 4ac10 <_Workspace_Free>
48d2e: 588f addql #4,%sp
}
information->inactive_per_block[ block ] = information->allocation_size;
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
}
48d30: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
48d36: 4e5e unlk %fp
48d38: 4e75 rts
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
48d3a: 2605 movel %d5,%d3 <== NOT EXECUTED
index_base = minimum_index;
block = 0;
48d3c: 4282 clrl %d2 <== NOT EXECUTED
48d3e: 0280 0000 ffff andil #65535,%d0 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
48d44: 367c 0001 moveaw #1,%a3 <== NOT EXECUTED
48d48: 6000 fdb4 braw 48afe <_Objects_Extend_information+0x5e><== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
48d4c: 2605 movel %d5,%d3 <== NOT EXECUTED
index_base = minimum_index;
block = 0;
48d4e: 4282 clrl %d2 <== NOT EXECUTED
48d50: 0280 0000 ffff andil #65535,%d0 <== NOT EXECUTED
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
48d56: 97cb subal %a3,%a3 <== NOT EXECUTED
48d58: 6000 fda4 braw 48afe <_Objects_Extend_information+0x5e><== NOT EXECUTED
00048e14 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
48e14: 4e56 0000 linkw %fp,#0
48e18: 2f03 movel %d3,%sp@-
48e1a: 262e 0008 movel %fp@(8),%d3
48e1e: 2f02 movel %d2,%sp@-
48e20: 342e 000e movew %fp@(14),%d2
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
48e24: 6740 beqs 48e66 <_Objects_Get_information+0x52>
/*
* 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 );
48e26: 2f03 movel %d3,%sp@-
48e28: 4eb9 0004 c9d0 jsr 4c9d0 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
48e2e: 588f addql #4,%sp
48e30: 4a80 tstl %d0
48e32: 6732 beqs 48e66 <_Objects_Get_information+0x52>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
48e34: 0282 0000 ffff andil #65535,%d2
48e3a: b480 cmpl %d0,%d2
48e3c: 6228 bhis 48e66 <_Objects_Get_information+0x52>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
48e3e: 41f9 0005 f9c2 lea 5f9c2 <_Objects_Information_table>,%a0
48e44: 2070 3c00 moveal %a0@(00000000,%d3:l:4),%a0
48e48: 4a88 tstl %a0
48e4a: 671a beqs 48e66 <_Objects_Get_information+0x52> <== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
48e4c: 2030 2c00 movel %a0@(00000000,%d2:l:4),%d0
if ( !info )
48e50: 6714 beqs 48e66 <_Objects_Get_information+0x52> <== 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 )
48e52: 2040 moveal %d0,%a0
48e54: 4a68 000e tstw %a0@(14)
48e58: 670c beqs 48e66 <_Objects_Get_information+0x52>
return NULL;
#endif
return info;
}
48e5a: 242e fff8 movel %fp@(-8),%d2
48e5e: 262e fffc movel %fp@(-4),%d3
48e62: 4e5e unlk %fp
48e64: 4e75 rts
48e66: 242e fff8 movel %fp@(-8),%d2
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
48e6a: 4280 clrl %d0
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
48e6c: 262e fffc movel %fp@(-4),%d3
48e70: 4e5e unlk %fp <== NOT EXECUTED
0005598c <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
5598c: 4e56 ffdc linkw %fp,#-36
55990: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
55994: 242e 000c movel %fp@(12),%d2
55998: 262e 0010 movel %fp@(16),%d3
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
5599c: 4a82 tstl %d2
5599e: 6700 00c6 beqw 55a66 <_Objects_Get_name_as_string+0xda>
return NULL;
if ( name == NULL )
559a2: 4a83 tstl %d3
559a4: 6700 00c0 beqw 55a66 <_Objects_Get_name_as_string+0xda>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
559a8: 4aae 0008 tstl %fp@(8)
559ac: 6600 00b0 bnew 55a5e <_Objects_Get_name_as_string+0xd2>
559b0: 2079 0006 df62 moveal 6df62 <_Per_CPU_Information+0xe>,%a0
559b6: 2468 0008 moveal %a0@(8),%a2
information = _Objects_Get_information_id( tmpId );
559ba: 2f0a movel %a2,%sp@-
559bc: 4eb9 0004 eac4 jsr 4eac4 <_Objects_Get_information_id>
if ( !information )
559c2: 588f addql #4,%sp
559c4: 4a80 tstl %d0
559c6: 6700 009e beqw 55a66 <_Objects_Get_name_as_string+0xda>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
559ca: 486e fff6 pea %fp@(-10)
559ce: 2f0a movel %a2,%sp@-
559d0: 2f00 movel %d0,%sp@-
559d2: 4eb9 0004 ebb8 jsr 4ebb8 <_Objects_Get>
switch ( location ) {
559d8: 4fef 000c lea %sp@(12),%sp
559dc: 4aae fff6 tstl %fp@(-10)
559e0: 6600 0084 bnew 55a66 <_Objects_Get_name_as_string+0xda>
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
559e4: 2040 moveal %d0,%a0
lname[ 0 ] = (u32_name >> 24) & 0xff;
559e6: 7818 moveq #24,%d4
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
559e8: 2028 000c movel %a0@(12),%d0
lname[ 0 ] = (u32_name >> 24) & 0xff;
559ec: 2200 movel %d0,%d1
559ee: e8a9 lsrl %d4,%d1
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
559f0: 2800 movel %d0,%d4
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
559f2: 2a00 movel %d0,%d5
lname[ 2 ] = (u32_name >> 8) & 0xff;
559f4: e08c lsrl #8,%d4
lname[ 3 ] = (u32_name >> 0) & 0xff;
559f6: 1d40 fffe moveb %d0,%fp@(-2)
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
559fa: 4245 clrw %d5
559fc: 4845 swap %d5
lname[ 2 ] = (u32_name >> 8) & 0xff;
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
559fe: 4200 clrb %d0
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
55a00: 1d44 fffd moveb %d4,%fp@(-3)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
55a04: 7801 moveq #1,%d4
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
55a06: 1d41 fffb moveb %d1,%fp@(-5)
lname[ 1 ] = (u32_name >> 16) & 0xff;
55a0a: 1d45 fffc moveb %d5,%fp@(-4)
lname[ 2 ] = (u32_name >> 8) & 0xff;
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
55a0e: 1d40 ffff moveb %d0,%fp@(-1)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
55a12: b882 cmpl %d2,%d4
55a14: 675e beqs 55a74 <_Objects_Get_name_as_string+0xe8><== NEVER TAKEN
55a16: 4a01 tstb %d1
55a18: 675a beqs 55a74 <_Objects_Get_name_as_string+0xe8>
* This method objects the name of an object and returns its name
* in the form of a C string. It attempts to be careful about
* overflowing the user's string and about returning unprintable characters.
*/
char *_Objects_Get_name_as_string(
55a1a: 43ee fffc lea %fp@(-4),%a1
55a1e: 2043 moveal %d3,%a0
55a20: 47f6 28fa lea %fp@(fffffffa,%d2:l),%a3
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
*d = (isprint((unsigned char)*s)) ? *s : '*';
55a24: 4282 clrl %d2
55a26: 1401 moveb %d1,%d2
55a28: 2479 0006 c074 moveal 6c074 <__ctype_ptr__>,%a2
55a2e: 1432 2801 moveb %a2@(00000001,%d2:l),%d2
55a32: 49c2 extbl %d2
55a34: 0282 0000 0097 andil #151,%d2
55a3a: 6602 bnes 55a3e <_Objects_Get_name_as_string+0xb2>
55a3c: 722a moveq #42,%d1
55a3e: 10c1 moveb %d1,%a0@+
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
55a40: 2448 moveal %a0,%a2
55a42: b7c9 cmpal %a1,%a3
55a44: 6704 beqs 55a4a <_Objects_Get_name_as_string+0xbe>
55a46: 1219 moveb %a1@+,%d1
55a48: 66da bnes 55a24 <_Objects_Get_name_as_string+0x98>
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
55a4a: 4212 clrb %a2@
_Thread_Enable_dispatch();
55a4c: 4eb9 0004 f9a8 jsr 4f9a8 <_Thread_Enable_dispatch>
return name;
}
return NULL; /* unreachable path */
}
55a52: 2003 movel %d3,%d0
55a54: 4cee 0c3c ffdc moveml %fp@(-36),%d2-%d5/%a2-%a3
55a5a: 4e5e unlk %fp
55a5c: 4e75 rts
return NULL;
if ( name == NULL )
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
55a5e: 246e 0008 moveal %fp@(8),%a2
55a62: 6000 ff56 braw 559ba <_Objects_Get_name_as_string+0x2e>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
55a66: 4283 clrl %d3
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
55a68: 2003 movel %d3,%d0
55a6a: 4cee 0c3c ffdc moveml %fp@(-36),%d2-%d5/%a2-%a3
55a70: 4e5e unlk %fp
55a72: 4e75 rts
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
55a74: 2443 moveal %d3,%a2
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
55a76: 4212 clrb %a2@
_Thread_Enable_dispatch();
55a78: 4eb9 0004 f9a8 jsr 4f9a8 <_Thread_Enable_dispatch>
55a7e: 60d2 bras 55a52 <_Objects_Get_name_as_string+0xc6>
0005a440 <_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;
5a440: 7001 moveq #1,%d0
if ( information->maximum >= index ) {
5a442: 4281 clrl %d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
5a444: 4e56 0000 linkw %fp,#0
5a448: 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;
5a44c: 90a8 0006 subl %a0@(6),%d0
5a450: d0ae 000c addl %fp@(12),%d0
if ( information->maximum >= index ) {
5a454: 3228 000e movew %a0@(14),%d1
5a458: b280 cmpl %d0,%d1
5a45a: 6514 bcss 5a470 <_Objects_Get_no_protection+0x30>
if ( (the_object = information->local_table[ index ]) != NULL ) {
5a45c: 2068 0018 moveal %a0@(24),%a0
5a460: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
5a464: 670a beqs 5a470 <_Objects_Get_no_protection+0x30><== NEVER TAKEN
*location = OBJECTS_LOCAL;
5a466: 206e 0010 moveal %fp@(16),%a0
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
return NULL;
}
5a46a: 4e5e unlk %fp
*/
index = id - information->minimum_id + 1;
if ( information->maximum >= index ) {
if ( (the_object = information->local_table[ index ]) != NULL ) {
*location = OBJECTS_LOCAL;
5a46c: 4290 clrl %a0@
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
return NULL;
}
5a46e: 4e75 rts
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
5a470: 226e 0010 moveal %fp@(16),%a1
5a474: 7001 moveq #1,%d0
return NULL;
}
5a476: 4e5e unlk %fp
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
5a478: 2280 movel %d0,%a1@
return NULL;
5a47a: 4280 clrl %d0
}
...
0004ec20 <_Objects_Id_to_name>:
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
4ec20: 4e56 fffc linkw %fp,#-4
4ec24: 202e 0008 movel %fp@(8),%d0
4ec28: 2f02 movel %d2,%sp@-
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
4ec2a: 4a80 tstl %d0
4ec2c: 6676 bnes 4eca4 <_Objects_Id_to_name+0x84>
4ec2e: 2079 0006 df62 moveal 6df62 <_Per_CPU_Information+0xe>,%a0
4ec34: 2228 0008 movel %a0@(8),%d1
4ec38: 7418 moveq #24,%d2
4ec3a: 2001 movel %d1,%d0
4ec3c: e4a8 lsrl %d2,%d0
4ec3e: 143c 0007 moveb #7,%d2
4ec42: c082 andl %d2,%d0
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
4ec44: 143c 0002 moveb #2,%d2
4ec48: 2040 moveal %d0,%a0
4ec4a: 5388 subql #1,%a0
4ec4c: b488 cmpl %a0,%d2
4ec4e: 654a bcss 4ec9a <_Objects_Id_to_name+0x7a>
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
4ec50: 41f9 0006 dd6e lea 6dd6e <_Objects_Information_table>,%a0
4ec56: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
4ec5a: 4a88 tstl %a0
4ec5c: 673c beqs 4ec9a <_Objects_Id_to_name+0x7a>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
4ec5e: 2001 movel %d1,%d0
4ec60: 741b moveq #27,%d2
4ec62: e4a8 lsrl %d2,%d0
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
4ec64: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
if ( !information )
4ec68: 6730 beqs 4ec9a <_Objects_Id_to_name+0x7a> <== 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 );
4ec6a: 486e fffc pea %fp@(-4)
4ec6e: 2f01 movel %d1,%sp@-
4ec70: 2f00 movel %d0,%sp@-
4ec72: 4eb9 0004 ebb8 jsr 4ebb8 <_Objects_Get>
if ( !the_object )
4ec78: 4fef 000c lea %sp@(12),%sp
4ec7c: 4a80 tstl %d0
4ec7e: 671a beqs 4ec9a <_Objects_Id_to_name+0x7a>
return OBJECTS_INVALID_ID;
*name = the_object->name;
4ec80: 206e 000c moveal %fp@(12),%a0
4ec84: 2240 moveal %d0,%a1
4ec86: 20a9 000c movel %a1@(12),%a0@
_Thread_Enable_dispatch();
4ec8a: 4eb9 0004 f9a8 jsr 4f9a8 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
4ec90: 242e fff8 movel %fp@(-8),%d2
if ( !the_object )
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
4ec94: 4280 clrl %d0
}
4ec96: 4e5e unlk %fp
4ec98: 4e75 rts
4ec9a: 242e fff8 movel %fp@(-8),%d2
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
4ec9e: 7003 moveq #3,%d0
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
4eca0: 4e5e unlk %fp
4eca2: 4e75 rts
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
4eca4: 2200 movel %d0,%d1
4eca6: 6090 bras 4ec38 <_Objects_Id_to_name+0x18>
00048f44 <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
48f44: 4e56 ffec linkw %fp,#-20
48f48: 202e 000c movel %fp@(12),%d0
48f4c: 48d7 043c moveml %d2-%d5/%a2,%sp@
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
48f50: 45f9 0005 f9c2 lea 5f9c2 <_Objects_Information_table>,%a2
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
48f56: 4282 clrl %d2
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
48f58: 4283 clrl %d3
48f5a: 2472 0c00 moveal %a2@(00000000,%d0:l:4),%a2
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
48f5e: 206e 0008 moveal %fp@(8),%a0
48f62: 342e 001a movew %fp@(26),%d2
48f66: 226e 0010 moveal %fp@(16),%a1
uint32_t index;
#endif
information->the_api = the_api;
information->the_class = the_class;
information->size = size;
48f6a: 2142 0014 movel %d2,%a0@(20)
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
48f6e: 222e 0014 movel %fp@(20),%d1
information->the_class = the_class;
information->size = size;
information->local_table = 0;
information->inactive_per_block = 0;
information->object_blocks = 0;
information->inactive = 0;
48f72: 4242 clrw %d2
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
48f74: 3609 movew %a1,%d3
Objects_Maximum maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
48f76: 2080 movel %d0,%a0@
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
48f78: 282e 0020 movel %fp@(32),%d4
information->the_class = the_class;
information->size = size;
information->local_table = 0;
information->inactive_per_block = 0;
information->object_blocks = 0;
information->inactive = 0;
48f7c: 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;
48f80: 3142 000e movew %d2,%a0@(14)
* @retval true Unlimited objects are available.
* @retval false The object count is fixed.
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_unlimited( uint32_t maximum )
{
return (maximum & OBJECTS_UNLIMITED_OBJECTS) != 0;
48f84: 2401 movel %d1,%d2
#endif
information->the_api = the_api;
information->the_class = the_class;
information->size = size;
information->local_table = 0;
48f86: 42a8 0018 clrl %a0@(24)
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
information->the_class = the_class;
48f8a: 3149 0004 movew %a1,%a0@(4)
information->size = size;
information->local_table = 0;
information->inactive_per_block = 0;
48f8e: 42a8 002a clrl %a0@(42)
48f92: d482 addl %d2,%d2
48f94: 9582 subxl %d2,%d2
48f96: 4482 negl %d2
information->object_blocks = 0;
48f98: 42a8 002e clrl %a0@(46)
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
48f9c: 2588 3c00 movel %a0,%a2@(00000000,%d3:l:4)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend = _Objects_Is_unlimited( maximum );
48fa0: 1142 0010 moveb %d2,%a0@(16)
maximum_per_allocation = _Objects_Maximum_per_allocation( maximum );
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
48fa4: 4a82 tstl %d2
48fa6: 6704 beqs 48fac <_Objects_Initialize_information+0x68>
48fa8: 4a41 tstw %d1
48faa: 6766 beqs 49012 <_Objects_Initialize_information+0xce>
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48fac: 7a18 moveq #24,%d5
information->local_table = &null_local_table;
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
48fae: 4a41 tstw %d1
48fb0: 56c2 sne %d2
48fb2: eba8 lsll %d5,%d0
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48fb4: 1a3c 001b moveb #27,%d5
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;
48fb8: 43f9 0005 f200 lea 5f200 <null_local_table.3490>,%a1
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
48fbe: 4482 negl %d2
48fc0: ebab lsll %d5,%d3
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48fc2: 08c0 0010 bset #16,%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;
48fc6: 2149 0018 movel %a1,%a0@(24)
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
48fca: 4285 clrl %d5
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
48fcc: 43e8 0020 lea %a0@(32),%a1
48fd0: 1a02 moveb %d2,%d5
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48fd2: 8083 orl %d3,%d0
48fd4: 2149 001c movel %a1,%a0@(28)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
48fd8: 43e8 001c lea %a0@(28),%a1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48fdc: 8085 orl %d5,%d0
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
48fde: 3141 0012 movew %d1,%a0@(18)
* NOTE: Either 4 bytes for Classic API names or an arbitrary
* number for POSIX names which are strings that may be
* an odd number of bytes.
*/
information->name_length = maximum_name_length;
48fe2: 3144 0032 movew %d4,%a0@(50)
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
48fe6: 42a8 0020 clrl %a0@(32)
48fea: 2140 0006 movel %d0,%a0@(6)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
48fee: 2149 0024 movel %a1,%a0@(36)
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
48ff2: 4a02 tstb %d2
48ff4: 660a bnes 49000 <_Objects_Initialize_information+0xbc>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
48ff6: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
48ffc: 4e5e unlk %fp
48ffe: 4e75 rts
/*
* 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 );
49000: 2d48 0008 movel %a0,%fp@(8)
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
49004: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
4900a: 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 );
4900c: 4ef9 0004 8aa0 jmp 48aa0 <_Objects_Extend_information>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
49012: 4878 0013 pea 13 <INVALID_OPERATION+0x3>
49016: 4878 0001 pea 1 <ADD>
4901a: 42a7 clrl %sp@-
4901c: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
...
000490b4 <_Objects_Shrink_information>:
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
490b4: 4281 clrl %d1
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
Objects_Information *information
)
{
490b6: 4e56 ffec linkw %fp,#-20
490ba: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
490be: 246e 0008 moveal %fp@(8),%a2
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
490c2: 4283 clrl %d3
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
490c4: 242a 0006 movel %a2@(6),%d2
block_count = (information->maximum - index_base) /
490c8: 362a 000e movew %a2@(14),%d3
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
490cc: 0282 0000 ffff andil #65535,%d2
block_count = (information->maximum - index_base) /
490d2: 322a 0012 movew %a2@(18),%d1
490d6: 9682 subl %d2,%d3
490d8: 4c41 3003 remul %d1,%d3,%d3
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
490dc: 6778 beqs 49156 <_Objects_Shrink_information+0xa2><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
490de: 206a 002a moveal %a2@(42),%a0
490e2: b290 cmpl %a0@,%d1
490e4: 6700 0088 beqw 4916e <_Objects_Shrink_information+0xba>
#include <rtems/score/thread.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
490e8: 5888 addql #4,%a0
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
490ea: 4280 clrl %d0
490ec: 5280 addql #1,%d0
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
490ee: d481 addl %d1,%d2
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
490f0: b680 cmpl %d0,%d3
490f2: 6762 beqs 49156 <_Objects_Shrink_information+0xa2>
#include <rtems/score/thread.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
490f4: 2800 movel %d0,%d4
490f6: e58c lsll #2,%d4
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
490f8: b298 cmpl %a0@+,%d1
490fa: 66f0 bnes 490ec <_Objects_Shrink_information+0x38>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
490fc: 206a 001c moveal %a2@(28),%a0
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
49100: 47f9 0004 c584 lea 4c584 <_Chain_Extract>,%a3
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
do {
index = _Objects_Get_index( the_object->id );
49106: 2028 0008 movel %a0@(8),%d0
4910a: 0280 0000 ffff andil #65535,%d0
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
49110: 2610 movel %a0@,%d3
if ((index >= index_base) &&
49112: b480 cmpl %d0,%d2
49114: 620c bhis 49122 <_Objects_Shrink_information+0x6e>
(index < (index_base + information->allocation_size))) {
49116: 4281 clrl %d1
49118: 322a 0012 movew %a2@(18),%d1
4911c: d282 addl %d2,%d1
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
4911e: b280 cmpl %d0,%d1
49120: 623e bhis 49160 <_Objects_Shrink_information+0xac>
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
49122: 2043 moveal %d3,%a0
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
49124: 4a83 tstl %d3
49126: 66de bnes 49106 <_Objects_Shrink_information+0x52>
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
49128: 206a 002e moveal %a2@(46),%a0
4912c: 2f30 4800 movel %a0@(00000000,%d4:l),%sp@-
49130: 4eb9 0004 ac10 jsr 4ac10 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
49136: 206a 002e moveal %a2@(46),%a0
information->inactive_per_block[ block ] = 0;
information->inactive -= information->allocation_size;
return;
4913a: 588f addql #4,%sp
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
4913c: 42b0 4800 clrl %a0@(00000000,%d4:l)
information->inactive_per_block[ block ] = 0;
49140: 206a 002a moveal %a2@(42),%a0
information->inactive -= information->allocation_size;
49144: 302a 0028 movew %a2@(40),%d0
49148: 322a 0012 movew %a2@(18),%d1
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
information->inactive_per_block[ block ] = 0;
4914c: 42b0 4800 clrl %a0@(00000000,%d4:l)
information->inactive -= information->allocation_size;
49150: 9081 subl %d1,%d0
49152: 3540 0028 movew %d0,%a2@(40)
return;
}
index_base += information->allocation_size;
}
}
49156: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
4915c: 4e5e unlk %fp
4915e: 4e75 rts
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
49160: 2f08 movel %a0,%sp@-
49162: 4e93 jsr %a3@
49164: 588f addql #4,%sp
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
49166: 2043 moveal %d3,%a0
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
49168: 4a83 tstl %d3
4916a: 669a bnes 49106 <_Objects_Shrink_information+0x52>
4916c: 60ba bras 49128 <_Objects_Shrink_information+0x74>
4916e: 206a 001c moveal %a2@(28),%a0 <== NOT EXECUTED
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
49172: 4284 clrl %d4 <== NOT EXECUTED
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
49174: 47f9 0004 c584 lea 4c584 <_Chain_Extract>,%a3 <== NOT EXECUTED
4917a: 608a bras 49106 <_Objects_Shrink_information+0x52><== NOT EXECUTED
0004e298 <_Protected_heap_Walk>:
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
4e298: 4e56 fff0 linkw %fp,#-16
* This routine returns true if thread dispatch indicates
* that we are in a critical section.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Dispatch_in_critical_section(void)
{
if ( _Thread_Dispatch_disable_level == 0 )
4e29c: 2039 0006 5fd2 movel 65fd2 <_Thread_Dispatch_disable_level>,%d0
4e2a2: 48d7 001c moveml %d2-%d4,%sp@
4e2a6: 262e 0008 movel %fp@(8),%d3
4e2aa: 282e 000c movel %fp@(12),%d4
4e2ae: 142e 0013 moveb %fp@(19),%d2
4e2b2: 4a80 tstl %d0
4e2b4: 6640 bnes 4e2f6 <_Protected_heap_Walk+0x5e>
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( _Thread_Dispatch_in_critical_section() == false ) {
_RTEMS_Lock_allocator();
4e2b6: 2f39 0006 6056 movel 66056 <_RTEMS_Allocator_Mutex>,%sp@-
status = _Heap_Walk( the_heap, source, do_dump );
4e2bc: 0282 0000 00ff andil #255,%d2
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( _Thread_Dispatch_in_critical_section() == false ) {
_RTEMS_Lock_allocator();
4e2c2: 4eb9 0004 c2a8 jsr 4c2a8 <_API_Mutex_Lock>
status = _Heap_Walk( the_heap, source, do_dump );
4e2c8: 2f02 movel %d2,%sp@-
4e2ca: 2f04 movel %d4,%sp@-
4e2cc: 2f03 movel %d3,%sp@-
4e2ce: 4eb9 0004 d3b2 jsr 4d3b2 <_Heap_Walk>
_RTEMS_Unlock_allocator();
4e2d4: 2f39 0006 6056 movel 66056 <_RTEMS_Allocator_Mutex>,%sp@-
4e2da: 2d40 fffc movel %d0,%fp@(-4)
4e2de: 4eb9 0004 c308 jsr 4c308 <_API_Mutex_Unlock>
4e2e4: 202e fffc movel %fp@(-4),%d0
4e2e8: 4fef 0014 lea %sp@(20),%sp
} else {
status = _Heap_Walk( the_heap, source, do_dump );
}
return status;
}
4e2ec: 4cee 001c fff0 moveml %fp@(-16),%d2-%d4
4e2f2: 4e5e unlk %fp
4e2f4: 4e75 rts
if ( _Thread_Dispatch_in_critical_section() == false ) {
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
4e2f6: 2d44 000c movel %d4,%fp@(12)
4e2fa: 0282 0000 00ff andil #255,%d2
4e300: 2d43 0008 movel %d3,%fp@(8)
4e304: 2d42 0010 movel %d2,%fp@(16)
}
return status;
}
4e308: 4cee 001c fff0 moveml %fp@(-16),%d2-%d4
4e30e: 4e5e unlk %fp
if ( _Thread_Dispatch_in_critical_section() == false ) {
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
4e310: 4ef9 0004 d3b2 jmp 4d3b2 <_Heap_Walk>
...
00049f3a <_RBTree_Extract_unprotected>:
*/
void _RBTree_Extract_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
49f3a: 4e56 ffec linkw %fp,#-20
49f3e: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
49f42: 2a6e 0008 moveal %fp@(8),%a5
49f46: 266e 000c moveal %fp@(12),%a3
RBTree_Node *leaf, *target;
RBTree_Color victim_color;
RBTree_Direction dir;
if (!the_node) return;
49f4a: 4a8b tstl %a3
49f4c: 6700 00b0 beqw 49ffe <_RBTree_Extract_unprotected+0xc4>
/* check if min needs to be updated */
if (the_node == the_rbtree->first[RBT_LEFT]) {
49f50: b7ed 0008 cmpal %a5@(8),%a3
49f54: 6700 00d2 beqw 4a028 <_RBTree_Extract_unprotected+0xee>
the_rbtree->first[RBT_LEFT] = next;
}
/* Check if max needs to be updated. min=max for 1 element trees so
* do not use else if here. */
if (the_node == the_rbtree->first[RBT_RIGHT]) {
49f58: b7ed 000c cmpal %a5@(12),%a3
49f5c: 6700 00e4 beqw 4a042 <_RBTree_Extract_unprotected+0x108>
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
49f60: 246b 0004 moveal %a3@(4),%a2
49f64: 4a8a tstl %a2
49f66: 6700 00f4 beqw 4a05c <_RBTree_Extract_unprotected+0x122>
49f6a: 4aab 0008 tstl %a3@(8)
49f6e: 6700 0098 beqw 4a008 <_RBTree_Extract_unprotected+0xce>
target = the_node->child[RBT_LEFT]; /* find max in node->child[RBT_LEFT] */
while (target->child[RBT_RIGHT]) target = target->child[RBT_RIGHT];
49f72: 202a 0008 movel %a2@(8),%d0
49f76: 6708 beqs 49f80 <_RBTree_Extract_unprotected+0x46>
49f78: 2440 moveal %d0,%a2
49f7a: 202a 0008 movel %a2@(8),%d0
49f7e: 66f8 bnes 49f78 <_RBTree_Extract_unprotected+0x3e>
* target's position (target is the right child of target->parent)
* when target vacates it. if there is no child, then target->parent
* should become NULL. This may cause the coloring to be violated.
* For now we store the color of the node being deleted in victim_color.
*/
leaf = target->child[RBT_LEFT];
49f80: 286a 0004 moveal %a2@(4),%a4
if(leaf) {
49f84: 4a8c tstl %a4
49f86: 6700 00fc beqw 4a084 <_RBTree_Extract_unprotected+0x14a>
leaf->parent = target->parent;
49f8a: 2892 movel %a2@,%a4@
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
dir = target != target->parent->child[0];
49f8c: 2252 moveal %a2@,%a1
49f8e: b5e9 0004 cmpal %a1@(4),%a2
49f92: 56c0 sne %d0
target->parent->child[dir] = leaf;
49f94: 7201 moveq #1,%d1
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
the_node->parent->child[dir] = target;
49f96: 7401 moveq #1,%d2
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
dir = target != target->parent->child[0];
49f98: 49c0 extbl %d0
target->parent->child[dir] = leaf;
49f9a: 9280 subl %d0,%d1
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
49f9c: 2053 moveal %a3@,%a0
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
dir = target != target->parent->child[0];
target->parent->child[dir] = leaf;
49f9e: 238c 1c00 movel %a4,%a1@(00000000,%d1:l:4)
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
49fa2: b7e8 0004 cmpal %a0@(4),%a3
49fa6: 56c1 sne %d1
leaf->parent = target->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
49fa8: 202a 000c movel %a2@(12),%d0
dir = target != target->parent->child[0];
target->parent->child[dir] = leaf;
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
49fac: 49c1 extbl %d1
the_node->parent->child[dir] = target;
49fae: 9481 subl %d1,%d2
49fb0: 218a 2c00 movel %a2,%a0@(00000000,%d2:l:4)
/* set target's new children to the original node's children */
target->child[RBT_RIGHT] = the_node->child[RBT_RIGHT];
49fb4: 256b 0008 0008 movel %a3@(8),%a2@(8)
if (the_node->child[RBT_RIGHT])
49fba: 206b 0008 moveal %a3@(8),%a0
49fbe: 4a88 tstl %a0
49fc0: 6702 beqs 49fc4 <_RBTree_Extract_unprotected+0x8a><== NEVER TAKEN
the_node->child[RBT_RIGHT]->parent = target;
49fc2: 208a movel %a2,%a0@
target->child[RBT_LEFT] = the_node->child[RBT_LEFT];
49fc4: 256b 0004 0004 movel %a3@(4),%a2@(4)
if (the_node->child[RBT_LEFT])
49fca: 206b 0004 moveal %a3@(4),%a0
49fce: 4a88 tstl %a0
49fd0: 6702 beqs 49fd4 <_RBTree_Extract_unprotected+0x9a>
the_node->child[RBT_LEFT]->parent = target;
49fd2: 208a movel %a2,%a0@
/* finally, update the parent node and recolor. target has completely
* replaced the_node, and target's child has moved up the tree if needed.
* the_node is no longer part of the tree, although it has valid pointers
* still.
*/
target->parent = the_node->parent;
49fd4: 2493 movel %a3@,%a2@
target->color = the_node->color;
49fd6: 256b 000c 000c movel %a3@(12),%a2@(12)
/* fix coloring. leaf has moved up the tree. The color of the deleted
* node is in victim_color. There are two cases:
* 1. Deleted a red node, its child must be black. Nothing must be done.
* 2. Deleted a black node, its child must be red. Paint child black.
*/
if (victim_color == RBT_BLACK) { /* eliminate case 1 */
49fdc: 4a80 tstl %d0
49fde: 6608 bnes 49fe8 <_RBTree_Extract_unprotected+0xae>
if (leaf) {
49fe0: 4a8c tstl %a4
49fe2: 6704 beqs 49fe8 <_RBTree_Extract_unprotected+0xae>
leaf->color = RBT_BLACK; /* case 2 */
49fe4: 42ac 000c clrl %a4@(12)
/* Wipe the_node */
_RBTree_Set_off_rbtree(the_node);
/* set root to black, if it exists */
if (the_rbtree->root) the_rbtree->root->color = RBT_BLACK;
49fe8: 206d 0004 moveal %a5@(4),%a0
*/
RTEMS_INLINE_ROUTINE void _RBTree_Set_off_rbtree(
RBTree_Node *node
)
{
node->parent = node->child[RBT_LEFT] = node->child[RBT_RIGHT] = NULL;
49fec: 42ab 0008 clrl %a3@(8)
49ff0: 42ab 0004 clrl %a3@(4)
49ff4: 4293 clrl %a3@
49ff6: 4a88 tstl %a0
49ff8: 6704 beqs 49ffe <_RBTree_Extract_unprotected+0xc4>
49ffa: 42a8 000c clrl %a0@(12)
}
49ffe: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4a004: 4e5e unlk %fp
4a006: 4e75 rts
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
4a008: 284a moveal %a2,%a4
* For now we store the color of the node being deleted in victim_color.
*/
leaf = the_node->child[RBT_LEFT] ?
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
if( leaf ) {
leaf->parent = the_node->parent;
4a00a: 2893 movel %a3@,%a4@
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
the_node->parent->child[dir] = leaf;
4a00c: 7401 moveq #1,%d2
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
4a00e: 2053 moveal %a3@,%a0
4a010: b7e8 0004 cmpal %a0@(4),%a3
4a014: 56c1 sne %d1
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
4a016: 202b 000c movel %a3@(12),%d0
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
4a01a: 49c1 extbl %d1
the_node->parent->child[dir] = leaf;
4a01c: 9481 subl %d1,%d2
4a01e: 218c 2c00 movel %a4,%a0@(00000000,%d2:l:4)
/* fix coloring. leaf has moved up the tree. The color of the deleted
* node is in victim_color. There are two cases:
* 1. Deleted a red node, its child must be black. Nothing must be done.
* 2. Deleted a black node, its child must be red. Paint child black.
*/
if (victim_color == RBT_BLACK) { /* eliminate case 1 */
4a022: 4a80 tstl %d0
4a024: 66c2 bnes 49fe8 <_RBTree_Extract_unprotected+0xae>
4a026: 60b8 bras 49fe0 <_RBTree_Extract_unprotected+0xa6>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Successor_unprotected(
const RBTree_Node *node
)
{
return _RBTree_Next_unprotected( node, RBT_RIGHT );
4a028: 4878 0001 pea 1 <ADD>
4a02c: 2f0b movel %a3,%sp@-
4a02e: 4eb9 0004 a33c jsr 4a33c <_RBTree_Next_unprotected>
/* check if min needs to be updated */
if (the_node == the_rbtree->first[RBT_LEFT]) {
RBTree_Node *next;
next = _RBTree_Successor_unprotected(the_node);
the_rbtree->first[RBT_LEFT] = next;
4a034: 508f addql #8,%sp
4a036: 2b40 0008 movel %d0,%a5@(8)
}
/* Check if max needs to be updated. min=max for 1 element trees so
* do not use else if here. */
if (the_node == the_rbtree->first[RBT_RIGHT]) {
4a03a: b7ed 000c cmpal %a5@(12),%a3
4a03e: 6600 ff20 bnew 49f60 <_RBTree_Extract_unprotected+0x26>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Predecessor_unprotected(
const RBTree_Node *node
)
{
return _RBTree_Next_unprotected( node, RBT_LEFT );
4a042: 42a7 clrl %sp@-
4a044: 2f0b movel %a3,%sp@-
4a046: 4eb9 0004 a33c jsr 4a33c <_RBTree_Next_unprotected>
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
4a04c: 246b 0004 moveal %a3@(4),%a2
/* Check if max needs to be updated. min=max for 1 element trees so
* do not use else if here. */
if (the_node == the_rbtree->first[RBT_RIGHT]) {
RBTree_Node *previous;
previous = _RBTree_Predecessor_unprotected(the_node);
the_rbtree->first[RBT_RIGHT] = previous;
4a050: 508f addql #8,%sp
4a052: 2b40 000c movel %d0,%a5@(12)
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
4a056: 4a8a tstl %a2
4a058: 6600 ff10 bnew 49f6a <_RBTree_Extract_unprotected+0x30>
* the_node's location in the tree. This may cause the coloring to be
* violated. We will fix it later.
* For now we store the color of the node being deleted in victim_color.
*/
leaf = the_node->child[RBT_LEFT] ?
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
4a05c: 286b 0008 moveal %a3@(8),%a4
if( leaf ) {
4a060: 4a8c tstl %a4
4a062: 66a6 bnes 4a00a <_RBTree_Extract_unprotected+0xd0>
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
4a064: 2f0b movel %a3,%sp@-
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
the_node->parent->child[dir] = leaf;
4a066: 7401 moveq #1,%d2
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
if( leaf ) {
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
4a068: 4eba fcc2 jsr %pc@(49d2c <_RBTree_Extract_validate_unprotected>)
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
4a06c: 2053 moveal %a3@,%a0
4a06e: b7e8 0004 cmpal %a0@(4),%a3
4a072: 56c1 sne %d1
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
4a074: 202b 000c movel %a3@(12),%d0
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
4a078: 49c1 extbl %d1
the_node->parent->child[dir] = leaf;
4a07a: 9481 subl %d1,%d2
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
if( leaf ) {
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
4a07c: 588f addql #4,%sp
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
the_node->parent->child[dir] = leaf;
4a07e: 218c 2c00 movel %a4,%a0@(00000000,%d2:l:4)
4a082: 609e bras 4a022 <_RBTree_Extract_unprotected+0xe8>
leaf = target->child[RBT_LEFT];
if(leaf) {
leaf->parent = target->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
4a084: 2f0a movel %a2,%sp@-
4a086: 4eba fca4 jsr %pc@(49d2c <_RBTree_Extract_validate_unprotected>)
4a08a: 588f addql #4,%sp
4a08c: 6000 fefe braw 49f8c <_RBTree_Extract_unprotected+0x52>
00049d2c <_RBTree_Extract_validate_unprotected>:
* of the extract operation.
*/
static void _RBTree_Extract_validate_unprotected(
RBTree_Node *the_node
)
{
49d2c: 4e56 ffec linkw %fp,#-20
49d30: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
49d34: 266e 0008 moveal %fp@(8),%a3
RBTree_Node *parent, *sibling;
RBTree_Direction dir;
parent = the_node->parent;
49d38: 2053 moveal %a3@,%a0
if(!parent->parent) return;
49d3a: 4a90 tstl %a0@
49d3c: 677e beqs 49dbc <_RBTree_Extract_validate_unprotected+0x90>
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
49d3e: 2268 0004 moveal %a0@(4),%a1
49d42: b3cb cmpal %a3,%a1
49d44: 6700 01de beqw 49f24 <_RBTree_Extract_validate_unprotected+0x1f8>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
49d48: 7401 moveq #1,%d2
49d4a: b4ab 000c cmpl %a3@(12),%d2
49d4e: 6764 beqs 49db4 <_RBTree_Extract_validate_unprotected+0x88>
sibling = _RBTree_Sibling(the_node);
/* continue to correct tree as long as the_node is black and not the root */
while (!_RBTree_Is_red(the_node) && parent->parent) {
49d50: 4a90 tstl %a0@
49d52: 6760 beqs 49db4 <_RBTree_Extract_validate_unprotected+0x88>
49d54: 4a89 tstl %a1
49d56: 670a beqs 49d62 <_RBTree_Extract_validate_unprotected+0x36><== NEVER TAKEN
49d58: 7001 moveq #1,%d0
49d5a: b0a9 000c cmpl %a1@(12),%d0
49d5e: 6700 011c beqw 49e7c <_RBTree_Extract_validate_unprotected+0x150>
_RBTree_Rotate(parent, dir);
sibling = parent->child[_RBTree_Opposite_direction(dir)];
}
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
49d62: 2469 0008 moveal %a1@(8),%a2
49d66: 4a8a tstl %a2
49d68: 6708 beqs 49d72 <_RBTree_Extract_validate_unprotected+0x46>
49d6a: 7601 moveq #1,%d3
49d6c: b6aa 000c cmpl %a2@(12),%d3
49d70: 6752 beqs 49dc4 <_RBTree_Extract_validate_unprotected+0x98>
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
49d72: 2469 0004 moveal %a1@(4),%a2
49d76: 4a8a tstl %a2
49d78: 6708 beqs 49d82 <_RBTree_Extract_validate_unprotected+0x56>
49d7a: 7001 moveq #1,%d0
49d7c: b0aa 000c cmpl %a2@(12),%d0
49d80: 6742 beqs 49dc4 <_RBTree_Extract_validate_unprotected+0x98>
sibling->color = RBT_RED;
49d82: 7001 moveq #1,%d0
49d84: 2340 000c movel %d0,%a1@(12)
49d88: b0a8 000c cmpl %a0@(12),%d0
49d8c: 6700 019e beqw 49f2c <_RBTree_Extract_validate_unprotected+0x200>
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
break;
}
the_node = parent; /* done if parent is red */
parent = the_node->parent;
49d90: 2450 moveal %a0@,%a2
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
49d92: 4a8a tstl %a2
49d94: 6700 0154 beqw 49eea <_RBTree_Extract_validate_unprotected+0x1be>
if(!(the_node->parent->parent)) return NULL;
49d98: 4a92 tstl %a2@
49d9a: 6700 014e beqw 49eea <_RBTree_Extract_validate_unprotected+0x1be>
if(the_node == the_node->parent->child[RBT_LEFT])
49d9e: 226a 0004 moveal %a2@(4),%a1
49da2: b3c8 cmpal %a0,%a1
49da4: 6700 0138 beqw 49ede <_RBTree_Extract_validate_unprotected+0x1b2>
49da8: 2648 moveal %a0,%a3
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
49daa: 204a moveal %a2,%a0
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
49dac: 7401 moveq #1,%d2
49dae: b4ab 000c cmpl %a3@(12),%d2
49db2: 669c bnes 49d50 <_RBTree_Extract_validate_unprotected+0x24><== ALWAYS TAKEN
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
49db4: 2053 moveal %a3@,%a0
49db6: 4a90 tstl %a0@
49db8: 6700 0140 beqw 49efa <_RBTree_Extract_validate_unprotected+0x1ce>
}
49dbc: 4cd7 1c0c moveml %sp@,%d2-%d3/%a2-%a4
49dc0: 4e5e unlk %fp
49dc2: 4e75 rts
* cases, either the_node is to the left or the right of the parent.
* In both cases, first check if one of sibling's children is black,
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
49dc4: b7e8 0004 cmpal %a0@(4),%a3
49dc8: 56c0 sne %d0
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
49dca: 7201 moveq #1,%d1
49dcc: 4480 negl %d0
49dce: b181 eorl %d0,%d1
49dd0: 0280 0000 00ff andil #255,%d0
49dd6: 0281 0000 00ff andil #255,%d1
if (!_RBTree_Is_red(sibling->child[_RBTree_Opposite_direction(dir)])) {
49ddc: 5281 addql #1,%d1
49dde: 2471 1c00 moveal %a1@(00000000,%d1:l:4),%a2
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
49de2: 4a8a tstl %a2
49de4: 670a beqs 49df0 <_RBTree_Extract_validate_unprotected+0xc4>
49de6: 7401 moveq #1,%d2
49de8: b4aa 000c cmpl %a2@(12),%d2
49dec: 6700 0118 beqw 49f06 <_RBTree_Extract_validate_unprotected+0x1da>
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
49df0: 5280 addql #1,%d0
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[_RBTree_Opposite_direction(dir)])) {
sibling->color = RBT_RED;
49df2: 7401 moveq #1,%d2
sibling->child[dir]->color = RBT_BLACK;
49df4: 2471 0c00 moveal %a1@(00000000,%d0:l:4),%a2
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[_RBTree_Opposite_direction(dir)])) {
sibling->color = RBT_RED;
49df8: 2342 000c movel %d2,%a1@(12)
sibling->child[dir]->color = RBT_BLACK;
49dfc: 42aa 000c clrl %a2@(12)
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
49e00: 4a8a tstl %a2
49e02: 672c beqs 49e30 <_RBTree_Extract_validate_unprotected+0x104><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
49e04: 49f2 1c00 lea %a2@(00000000,%d1:l:4),%a4
49e08: 2394 0c00 movel %a4@,%a1@(00000000,%d0:l:4)
if (c->child[dir])
49e0c: 2872 1c00 moveal %a2@(00000000,%d1:l:4),%a4
49e10: 4a8c tstl %a4
49e12: 6702 beqs 49e16 <_RBTree_Extract_validate_unprotected+0xea>
c->child[dir]->parent = the_node;
49e14: 2889 movel %a1,%a4@
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e16: 2851 moveal %a1@,%a4
49e18: 7601 moveq #1,%d3
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
49e1a: 2589 1c00 movel %a1,%a2@(00000000,%d1:l:4)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e1e: b3ec 0004 cmpal %a4@(4),%a1
49e22: 56c2 sne %d2
c->parent = the_node->parent;
49e24: 248c movel %a4,%a2@
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e26: 49c2 extbl %d2
49e28: 9682 subl %d2,%d3
49e2a: 298a 3c00 movel %a2,%a4@(00000000,%d3:l:4)
c->parent = the_node->parent;
the_node->parent = c;
49e2e: 228a movel %a2,%a1@
_RBTree_Rotate(sibling, _RBTree_Opposite_direction(dir));
sibling = parent->child[_RBTree_Opposite_direction(dir)];
49e30: 2870 1c00 moveal %a0@(00000000,%d1:l:4),%a4
}
sibling->color = parent->color;
49e34: 2968 000c 000c movel %a0@(12),%a4@(12)
49e3a: 2274 1c00 moveal %a4@(00000000,%d1:l:4),%a1
parent->color = RBT_BLACK;
49e3e: 42a8 000c clrl %a0@(12)
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
49e42: 42a9 000c clrl %a1@(12)
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
49e46: 43f4 0c00 lea %a4@(00000000,%d0:l:4),%a1
49e4a: 2191 1c00 movel %a1@,%a0@(00000000,%d1:l:4)
if (c->child[dir])
49e4e: 2274 0c00 moveal %a4@(00000000,%d0:l:4),%a1
49e52: 4a89 tstl %a1
49e54: 6702 beqs 49e58 <_RBTree_Extract_validate_unprotected+0x12c>
c->child[dir]->parent = the_node;
49e56: 2288 movel %a0,%a1@
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e58: 2250 moveal %a0@,%a1
49e5a: 7201 moveq #1,%d1
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
49e5c: 2988 0c00 movel %a0,%a4@(00000000,%d0:l:4)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e60: b1e9 0004 cmpal %a1@(4),%a0
49e64: 56c0 sne %d0
c->parent = the_node->parent;
49e66: 2889 movel %a1,%a4@
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e68: 49c0 extbl %d0
49e6a: 9280 subl %d0,%d1
c->parent = the_node->parent;
the_node->parent = c;
49e6c: 208c movel %a4,%a0@
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
49e6e: 2053 moveal %a3@,%a0
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49e70: 238c 1c00 movel %a4,%a1@(00000000,%d1:l:4)
49e74: 4a90 tstl %a0@
49e76: 6600 ff44 bnew 49dbc <_RBTree_Extract_validate_unprotected+0x90>
49e7a: 607e bras 49efa <_RBTree_Extract_validate_unprotected+0x1ce><== NOT EXECUTED
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
49e7c: b7e8 0004 cmpal %a0@(4),%a3
49e80: 56c1 sne %d1
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
49e82: 7001 moveq #1,%d0
* then rotate parent left, making the sibling be the_node's grandparent.
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
49e84: 7601 moveq #1,%d3
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
49e86: 4481 negl %d1
49e88: b380 eorl %d1,%d0
* then rotate parent left, making the sibling be the_node's grandparent.
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
49e8a: 2143 000c movel %d3,%a0@(12)
49e8e: 0280 0000 00ff andil #255,%d0
sibling->color = RBT_BLACK;
49e94: 42a9 000c clrl %a1@(12)
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
49e98: 5280 addql #1,%d0
49e9a: 2470 0c00 moveal %a0@(00000000,%d0:l:4),%a2
dir = the_node != parent->child[0];
49e9e: 0281 0000 00ff andil #255,%d1
49ea4: 4a8a tstl %a2
49ea6: 674c beqs 49ef4 <_RBTree_Extract_validate_unprotected+0x1c8><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
49ea8: 5281 addql #1,%d1
49eaa: 43f2 1c00 lea %a2@(00000000,%d1:l:4),%a1
49eae: 2191 0c00 movel %a1@,%a0@(00000000,%d0:l:4)
if (c->child[dir])
49eb2: 2272 1c00 moveal %a2@(00000000,%d1:l:4),%a1
49eb6: 4a89 tstl %a1
49eb8: 6702 beqs 49ebc <_RBTree_Extract_validate_unprotected+0x190><== NEVER TAKEN
c->child[dir]->parent = the_node;
49eba: 2288 movel %a0,%a1@
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49ebc: 2250 moveal %a0@,%a1
49ebe: 7401 moveq #1,%d2
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
49ec0: 2588 1c00 movel %a0,%a2@(00000000,%d1:l:4)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49ec4: b1e9 0004 cmpal %a1@(4),%a0
49ec8: 56c1 sne %d1
c->parent = the_node->parent;
49eca: 2489 movel %a1,%a2@
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
49ecc: 49c1 extbl %d1
49ece: 9481 subl %d1,%d2
49ed0: 238a 2c00 movel %a2,%a1@(00000000,%d2:l:4)
49ed4: 2270 0c00 moveal %a0@(00000000,%d0:l:4),%a1
c->parent = the_node->parent;
the_node->parent = c;
49ed8: 208a movel %a2,%a0@
49eda: 6000 fe86 braw 49d62 <_RBTree_Extract_validate_unprotected+0x36>
49ede: 2648 moveal %a0,%a3
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
49ee0: 204a moveal %a2,%a0
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
49ee2: 226a 0008 moveal %a2@(8),%a1
49ee6: 6000 fec4 braw 49dac <_RBTree_Extract_validate_unprotected+0x80>
49eea: 2648 moveal %a0,%a3
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
49eec: 93c9 subal %a1,%a1
49eee: 204a moveal %a2,%a0
49ef0: 6000 feba braw 49dac <_RBTree_Extract_validate_unprotected+0x80>
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
49ef4: 93c9 subal %a1,%a1 <== NOT EXECUTED
49ef6: 6000 fe6a braw 49d62 <_RBTree_Extract_validate_unprotected+0x36><== NOT EXECUTED
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
49efa: 42ab 000c clrl %a3@(12)
}
49efe: 4cd7 1c0c moveml %sp@,%d2-%d3/%a2-%a4
49f02: 4e5e unlk %fp
49f04: 4e75 rts
49f06: 2870 1c00 moveal %a0@(00000000,%d1:l:4),%a4
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, _RBTree_Opposite_direction(dir));
sibling = parent->child[_RBTree_Opposite_direction(dir)];
}
sibling->color = parent->color;
49f0a: 2368 000c 000c movel %a0@(12),%a1@(12)
parent->color = RBT_BLACK;
49f10: 42a8 000c clrl %a0@(12)
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
49f14: 42aa 000c clrl %a2@(12)
49f18: 4a8c tstl %a4
49f1a: 6700 fe98 beqw 49db4 <_RBTree_Extract_validate_unprotected+0x88>
49f1e: 5280 addql #1,%d0
49f20: 6000 ff24 braw 49e46 <_RBTree_Extract_validate_unprotected+0x11a>
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
49f24: 2268 0008 moveal %a0@(8),%a1
49f28: 6000 fe1e braw 49d48 <_RBTree_Extract_validate_unprotected+0x1c>
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
sibling->color = RBT_RED;
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
49f2c: 42a8 000c clrl %a0@(12)
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
49f30: 2053 moveal %a3@,%a0
49f32: 4a90 tstl %a0@
49f34: 6600 fe86 bnew 49dbc <_RBTree_Extract_validate_unprotected+0x90>
49f38: 60c0 bras 49efa <_RBTree_Extract_validate_unprotected+0x1ce><== NOT EXECUTED
0004a59c <_RBTree_Find>:
{
ISR_Level level;
RBTree_Node *return_node;
return_node = NULL;
_ISR_Disable( level );
4a59c: 203c 0000 0700 movel #1792,%d0
RBTree_Node *_RBTree_Find(
RBTree_Control *the_rbtree,
RBTree_Node *search_node
)
{
4a5a2: 4e56 ffec linkw %fp,#-20
4a5a6: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
4a5aa: 266e 0008 moveal %fp@(8),%a3
4a5ae: 242e 000c movel %fp@(12),%d2
ISR_Level level;
RBTree_Node *return_node;
return_node = NULL;
_ISR_Disable( level );
4a5b2: 40c4 movew %sr,%d4
4a5b4: 8084 orl %d4,%d0
4a5b6: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
4a5b8: 246b 0004 moveal %a3@(4),%a2
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
4a5bc: 4283 clrl %d3
4a5be: 4a8a tstl %a2
4a5c0: 672a beqs 4a5ec <_RBTree_Find+0x50> <== NEVER TAKEN
compare_result = the_rbtree->compare_function(the_node, iter_node);
4a5c2: 2f0a movel %a2,%sp@-
4a5c4: 206b 0010 moveal %a3@(16),%a0
4a5c8: 2f02 movel %d2,%sp@-
4a5ca: 4e90 jsr %a0@
if ( _RBTree_Is_equal( compare_result ) ) {
4a5cc: 508f addql #8,%sp
4a5ce: 4a80 tstl %d0
4a5d0: 6608 bnes 4a5da <_RBTree_Find+0x3e>
found = iter_node;
if ( the_rbtree->is_unique )
4a5d2: 260a movel %a2,%d3
4a5d4: 4a2b 0014 tstb %a3@(20)
4a5d8: 6612 bnes 4a5ec <_RBTree_Find+0x50>
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
4a5da: 4a80 tstl %d0
4a5dc: 5ec1 sgt %d1
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
4a5de: 7001 moveq #1,%d0
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
4a5e0: 49c1 extbl %d1
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
4a5e2: 9081 subl %d1,%d0
4a5e4: 2472 0c00 moveal %a2@(00000000,%d0:l:4),%a2
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
4a5e8: 4a8a tstl %a2
4a5ea: 66d6 bnes 4a5c2 <_RBTree_Find+0x26>
return_node = _RBTree_Find_unprotected( the_rbtree, search_node );
_ISR_Enable( level );
4a5ec: 46c4 movew %d4,%sr
return return_node;
}
4a5ee: 2003 movel %d3,%d0
4a5f0: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
4a5f6: 4e5e unlk %fp
...
0004a55c <_RBTree_Find_header>:
{
ISR_Level level;
RBTree_Control *return_header;
return_header = NULL;
_ISR_Disable( level );
4a55c: 203c 0000 0700 movel #1792,%d0
#include <rtems/score/isr.h>
RBTree_Control *_RBTree_Find_header(
RBTree_Node *the_node
)
{
4a562: 4e56 0000 linkw %fp,#0
4a566: 206e 0008 moveal %fp@(8),%a0
4a56a: 2f02 movel %d2,%sp@-
ISR_Level level;
RBTree_Control *return_header;
return_header = NULL;
_ISR_Disable( level );
4a56c: 40c2 movew %sr,%d2
4a56e: 8082 orl %d2,%d0
4a570: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_header_unprotected(
RBTree_Node *the_node
)
{
if(!the_node) return NULL;
4a572: 4a88 tstl %a0
4a574: 671a beqs 4a590 <_RBTree_Find_header+0x34>
if(!(the_node->parent)) return NULL;
4a576: 2050 moveal %a0@,%a0
4a578: 4a88 tstl %a0
4a57a: 670a beqs 4a586 <_RBTree_Find_header+0x2a>
4a57c: 2210 movel %a0@,%d1
while(the_node->parent) the_node = the_node->parent;
4a57e: 6706 beqs 4a586 <_RBTree_Find_header+0x2a> <== NEVER TAKEN
4a580: 2041 moveal %d1,%a0
4a582: 2210 movel %a0@,%d1
4a584: 66fa bnes 4a580 <_RBTree_Find_header+0x24>
return_header = _RBTree_Find_header_unprotected( the_node );
_ISR_Enable( level );
4a586: 46c2 movew %d2,%sr
return return_header;
}
4a588: 241f movel %sp@+,%d2
4a58a: 2008 movel %a0,%d0
4a58c: 4e5e unlk %fp
4a58e: 4e75 rts
*/
RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_header_unprotected(
RBTree_Node *the_node
)
{
if(!the_node) return NULL;
4a590: 91c8 subal %a0,%a0
RBTree_Control *return_header;
return_header = NULL;
_ISR_Disable( level );
return_header = _RBTree_Find_header_unprotected( the_node );
_ISR_Enable( level );
4a592: 46c2 movew %d2,%sr
return return_header;
}
4a594: 241f movel %sp@+,%d2
4a596: 2008 movel %a0,%d0
4a598: 4e5e unlk %fp <== NOT EXECUTED
0004a8f0 <_RBTree_Initialize>:
void *starting_address,
size_t number_nodes,
size_t node_size,
bool is_unique
)
{
4a8f0: 4e56 ffec linkw %fp,#-20
4a8f4: 202e 001c movel %fp@(28),%d0
4a8f8: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
4a8fc: 246e 0008 moveal %fp@(8),%a2
4a900: 242e 0014 movel %fp@(20),%d2
4a904: 282e 0018 movel %fp@(24),%d4
size_t count;
RBTree_Node *next;
/* TODO: Error message? */
if (!the_rbtree) return;
4a908: 4a8a tstl %a2
4a90a: 6736 beqs 4a942 <_RBTree_Initialize+0x52> <== NEVER TAKEN
RBTree_Control *the_rbtree,
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
4a90c: 4292 clrl %a2@
the_rbtree->root = NULL;
the_rbtree->first[0] = NULL;
the_rbtree->first[1] = NULL;
the_rbtree->compare_function = compare_function;
4a90e: 256e 000c 0010 movel %fp@(12),%a2@(16)
the_rbtree->is_unique = is_unique;
4a914: 1540 0014 moveb %d0,%a2@(20)
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
the_rbtree->root = NULL;
4a918: 42aa 0004 clrl %a2@(4)
the_rbtree->first[0] = NULL;
4a91c: 42aa 0008 clrl %a2@(8)
the_rbtree->first[1] = NULL;
4a920: 42aa 000c clrl %a2@(12)
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
4a924: 4a82 tstl %d2
4a926: 671a beqs 4a942 <_RBTree_Initialize+0x52> <== NEVER TAKEN
4a928: 262e 0010 movel %fp@(16),%d3
4a92c: 47f9 0004 a638 lea 4a638 <_RBTree_Insert_unprotected>,%a3
_RBTree_Insert_unprotected(the_rbtree, next);
4a932: 2f03 movel %d3,%sp@-
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/rbtree.h>
#include <rtems/score/isr.h>
void _RBTree_Initialize(
4a934: d684 addl %d4,%d3
4a936: 5382 subql #1,%d2
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
_RBTree_Insert_unprotected(the_rbtree, next);
4a938: 2f0a movel %a2,%sp@-
4a93a: 4e93 jsr %a3@
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
4a93c: 508f addql #8,%sp
4a93e: 4a82 tstl %d2
4a940: 66f0 bnes 4a932 <_RBTree_Initialize+0x42>
_RBTree_Insert_unprotected(the_rbtree, next);
next = (RBTree_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
}
4a942: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
4a948: 4e5e unlk %fp <== NOT EXECUTED
0004a0bc <_RBTree_Insert_unprotected>:
*/
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
4a0bc: 4e56 ffe4 linkw %fp,#-28
4a0c0: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
4a0c4: 286e 0008 moveal %fp@(8),%a4
4a0c8: 266e 000c moveal %fp@(12),%a3
if(!the_node) return (RBTree_Node*)-1;
4a0cc: 4a8b tstl %a3
4a0ce: 6700 01b6 beqw 4a286 <_RBTree_Insert_unprotected+0x1ca>
RBTree_Node *iter_node = the_rbtree->root;
4a0d2: 246c 0004 moveal %a4@(4),%a2
int compare_result;
if (!iter_node) { /* special case: first node inserted */
4a0d6: 4a8a tstl %a2
4a0d8: 6700 01ba beqw 4a294 <_RBTree_Insert_unprotected+0x1d8>
the_node->parent = (RBTree_Node *) the_rbtree;
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
4a0dc: 2f0a movel %a2,%sp@-
4a0de: 206c 0010 moveal %a4@(16),%a0
4a0e2: 2f0b movel %a3,%sp@-
4a0e4: 4e90 jsr %a0@
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
4a0e6: 508f addql #8,%sp
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
4a0e8: 2400 movel %d0,%d2
4a0ea: 4682 notl %d2
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
4a0ec: 4a2c 0014 tstb %a4@(20)
4a0f0: 6706 beqs 4a0f8 <_RBTree_Insert_unprotected+0x3c>
4a0f2: 4a80 tstl %d0
4a0f4: 6700 0182 beqw 4a278 <_RBTree_Insert_unprotected+0x1bc>
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
4a0f8: d482 addl %d2,%d2
4a0fa: 9582 subxl %d2,%d2
4a0fc: 4482 negl %d2
if (!iter_node->child[dir]) {
4a0fe: 2202 movel %d2,%d1
4a100: 5281 addql #1,%d1
4a102: 2632 1c00 movel %a2@(00000000,%d1:l:4),%d3
4a106: 6704 beqs 4a10c <_RBTree_Insert_unprotected+0x50>
(dir && _RBTree_Is_greater(compare_result)) ) {
the_rbtree->first[dir] = the_node;
}
break;
} else {
iter_node = iter_node->child[dir];
4a108: 2443 moveal %d3,%a2
4a10a: 60d0 bras 4a0dc <_RBTree_Insert_unprotected+0x20>
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
the_node->color = RBT_RED;
iter_node->child[dir] = the_node;
the_node->parent = iter_node;
/* update min/max */
compare_result = the_rbtree->compare_function(
4a10c: 206c 0010 moveal %a4@(16),%a0
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
the_node->color = RBT_RED;
4a110: 7001 moveq #1,%d0
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_First(
const RBTree_Control *the_rbtree,
RBTree_Direction dir
)
{
return the_rbtree->first[dir];
4a112: 2a42 moveal %d2,%a5
4a114: 548d addql #2,%a5
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
4a116: 42ab 0008 clrl %a3@(8)
4a11a: 42ab 0004 clrl %a3@(4)
the_node->color = RBT_RED;
iter_node->child[dir] = the_node;
4a11e: 258b 1c00 movel %a3,%a2@(00000000,%d1:l:4)
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
the_node->color = RBT_RED;
4a122: 2740 000c movel %d0,%a3@(12)
iter_node->child[dir] = the_node;
the_node->parent = iter_node;
4a126: 268a movel %a2,%a3@
/* update min/max */
compare_result = the_rbtree->compare_function(
4a128: 2f34 dc00 movel %a4@(00000000,%a5:l:4),%sp@-
4a12c: 2f0b movel %a3,%sp@-
4a12e: 4e90 jsr %a0@
the_node,
_RBTree_First(the_rbtree, dir)
);
if ( (!dir && _RBTree_Is_lesser(compare_result)) ||
4a130: 508f addql #8,%sp
4a132: 4a82 tstl %d2
4a134: 6600 0124 bnew 4a25a <_RBTree_Insert_unprotected+0x19e>
4a138: 4a80 tstl %d0
4a13a: 6d00 0124 bltw 4a260 <_RBTree_Insert_unprotected+0x1a4>
_ISR_Disable( level );
return_node = _RBTree_Insert_unprotected( tree, node );
_ISR_Enable( level );
return return_node;
}
4a13e: 2053 moveal %a3@,%a0
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
const RBTree_Node *the_node
)
{
if (!the_node->parent->parent) return NULL;
4a140: 2250 moveal %a0@,%a1
4a142: 2449 moveal %a1,%a2
4a144: 4a89 tstl %a1
4a146: 6700 00ee beqw 4a236 <_RBTree_Insert_unprotected+0x17a>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
4a14a: 7801 moveq #1,%d4
4a14c: b8a8 000c cmpl %a0@(12),%d4
4a150: 670c beqs 4a15e <_RBTree_Insert_unprotected+0xa2>
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
4a152: 2003 movel %d3,%d0
4a154: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
4a15a: 4e5e unlk %fp
4a15c: 4e75 rts
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(!(the_node->parent->parent->parent)) return NULL;
4a15e: 4a91 tstl %a1@
4a160: 6700 0106 beqw 4a268 <_RBTree_Insert_unprotected+0x1ac>
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
4a164: 2229 0004 movel %a1@(4),%d1
4a168: b288 cmpl %a0,%d1
4a16a: 6700 0104 beqw 4a270 <_RBTree_Insert_unprotected+0x1b4>
4a16e: 2841 moveal %d1,%a4
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
4a170: 4a8c tstl %a4
4a172: 670a beqs 4a17e <_RBTree_Insert_unprotected+0xc2>
4a174: 7401 moveq #1,%d2
4a176: b4ac 000c cmpl %a4@(12),%d2
4a17a: 6700 00ca beqw 4a246 <_RBTree_Insert_unprotected+0x18a>
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
4a17e: b7e8 0004 cmpal %a0@(4),%a3
4a182: 56c2 sne %d2
RBTree_Direction pdir = the_node->parent != g->child[0];
4a184: b288 cmpl %a0,%d1
4a186: 56c1 sne %d1
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
4a188: 49c2 extbl %d2
RBTree_Direction pdir = the_node->parent != g->child[0];
4a18a: 49c1 extbl %d1
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
4a18c: 2001 movel %d1,%d0
4a18e: 4480 negl %d0
RBTree_Direction pdir = the_node->parent != g->child[0];
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
4a190: b282 cmpl %d2,%d1
4a192: 6748 beqs 4a1dc <_RBTree_Insert_unprotected+0x120>
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
4a194: 4a80 tstl %d0
4a196: 57c2 seq %d2
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
4a198: 7801 moveq #1,%d4
4a19a: 2200 movel %d0,%d1
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
4a19c: 49c2 extbl %d2
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
4a19e: 9882 subl %d2,%d4
4a1a0: 5281 addql #1,%d1
4a1a2: 2870 4c00 moveal %a0@(00000000,%d4:l:4),%a4
4a1a6: 4a8c tstl %a4
4a1a8: 672c beqs 4a1d6 <_RBTree_Insert_unprotected+0x11a><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
4a1aa: 4bf4 1c00 lea %a4@(00000000,%d1:l:4),%a5
4a1ae: 2195 4c00 movel %a5@,%a0@(00000000,%d4:l:4)
if (c->child[dir])
4a1b2: 2a74 1c00 moveal %a4@(00000000,%d1:l:4),%a5
4a1b6: 4a8d tstl %a5
4a1b8: 6704 beqs 4a1be <_RBTree_Insert_unprotected+0x102>
c->child[dir]->parent = the_node;
4a1ba: 2a88 movel %a0,%a5@
4a1bc: 2250 moveal %a0@,%a1
c->child[dir] = the_node;
4a1be: 2988 1c00 movel %a0,%a4@(00000000,%d1:l:4)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
4a1c2: 7801 moveq #1,%d4
4a1c4: b1e9 0004 cmpal %a1@(4),%a0
4a1c8: 56c2 sne %d2
c->parent = the_node->parent;
4a1ca: 2889 movel %a1,%a4@
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
4a1cc: 49c2 extbl %d2
4a1ce: 9882 subl %d2,%d4
4a1d0: 238c 4c00 movel %a4,%a1@(00000000,%d4:l:4)
c->parent = the_node->parent;
the_node->parent = c;
4a1d4: 208c movel %a4,%a0@
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
4a1d6: 2673 1c00 moveal %a3@(00000000,%d1:l:4),%a3
4a1da: 2053 moveal %a3@,%a0
}
the_node->parent->color = RBT_BLACK;
g->color = RBT_RED;
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
4a1dc: 7201 moveq #1,%d1
4a1de: 9280 subl %d0,%d1
4a1e0: 2001 movel %d1,%d0
4a1e2: 7201 moveq #1,%d1
if (dir != pdir) {
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
}
the_node->parent->color = RBT_BLACK;
g->color = RBT_RED;
4a1e4: 7401 moveq #1,%d2
4a1e6: b181 eorl %d0,%d1
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
}
the_node->parent->color = RBT_BLACK;
4a1e8: 42a8 000c clrl %a0@(12)
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
4a1ec: 5281 addql #1,%d1
4a1ee: 2072 1c00 moveal %a2@(00000000,%d1:l:4),%a0
g->color = RBT_RED;
4a1f2: 2542 000c movel %d2,%a2@(12)
4a1f6: 4a88 tstl %a0
4a1f8: 6700 ff44 beqw 4a13e <_RBTree_Insert_unprotected+0x82>
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
4a1fc: 5280 addql #1,%d0
4a1fe: 43f0 0c00 lea %a0@(00000000,%d0:l:4),%a1
4a202: 2591 1c00 movel %a1@,%a2@(00000000,%d1:l:4)
if (c->child[dir])
4a206: 2270 0c00 moveal %a0@(00000000,%d0:l:4),%a1
4a20a: 4a89 tstl %a1
4a20c: 6702 beqs 4a210 <_RBTree_Insert_unprotected+0x154>
c->child[dir]->parent = the_node;
4a20e: 228a movel %a2,%a1@
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
4a210: 2252 moveal %a2@,%a1
4a212: 7201 moveq #1,%d1
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
4a214: 218a 0c00 movel %a2,%a0@(00000000,%d0:l:4)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
4a218: b5e9 0004 cmpal %a1@(4),%a2
4a21c: 56c0 sne %d0
c->parent = the_node->parent;
4a21e: 2089 movel %a1,%a0@
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
4a220: 49c0 extbl %d0
4a222: 9280 subl %d0,%d1
4a224: 2388 1c00 movel %a0,%a1@(00000000,%d1:l:4)
c->parent = the_node->parent;
the_node->parent = c;
4a228: 2488 movel %a0,%a2@
_ISR_Disable( level );
return_node = _RBTree_Insert_unprotected( tree, node );
_ISR_Enable( level );
return return_node;
}
4a22a: 2053 moveal %a3@,%a0
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
const RBTree_Node *the_node
)
{
if (!the_node->parent->parent) return NULL;
4a22c: 2250 moveal %a0@,%a1
4a22e: 2449 moveal %a1,%a2
4a230: 4a89 tstl %a1
4a232: 6600 ff16 bnew 4a14a <_RBTree_Insert_unprotected+0x8e>
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
4a236: 2003 movel %d3,%d0
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
}
}
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
4a238: 42ab 000c clrl %a3@(12)
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
4a23c: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
4a242: 4e5e unlk %fp
4a244: 4e75 rts
u = _RBTree_Parent_sibling(the_node);
g = the_node->parent->parent;
/* if uncle is red, repaint uncle/parent black and grandparent red */
if(_RBTree_Is_red(u)) {
the_node->parent->color = RBT_BLACK;
4a246: 42a8 000c clrl %a0@(12)
u->color = RBT_BLACK;
g->color = RBT_RED;
4a24a: 7401 moveq #1,%d2
4a24c: 2649 moveal %a1,%a3
g = the_node->parent->parent;
/* if uncle is red, repaint uncle/parent black and grandparent red */
if(_RBTree_Is_red(u)) {
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
4a24e: 42ac 000c clrl %a4@(12)
g->color = RBT_RED;
4a252: 2342 000c movel %d2,%a1@(12)
4a256: 6000 fee6 braw 4a13e <_RBTree_Insert_unprotected+0x82>
compare_result = the_rbtree->compare_function(
the_node,
_RBTree_First(the_rbtree, dir)
);
if ( (!dir && _RBTree_Is_lesser(compare_result)) ||
(dir && _RBTree_Is_greater(compare_result)) ) {
4a25a: 4a80 tstl %d0
4a25c: 6f00 fee0 blew 4a13e <_RBTree_Insert_unprotected+0x82>
the_rbtree->first[dir] = the_node;
4a260: 298b dc00 movel %a3,%a4@(00000000,%a5:l:4)
4a264: 6000 fed8 braw 4a13e <_RBTree_Insert_unprotected+0x82>
4a268: 2229 0004 movel %a1@(4),%d1 <== NOT EXECUTED
4a26c: 6000 ff10 braw 4a17e <_RBTree_Insert_unprotected+0xc2><== NOT EXECUTED
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
4a270: 2869 0008 moveal %a1@(8),%a4
4a274: 6000 fefa braw 4a170 <_RBTree_Insert_unprotected+0xb4>
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
4a278: 260a movel %a2,%d3
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
4a27a: 2003 movel %d3,%d0
4a27c: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
4a282: 4e5e unlk %fp
4a284: 4e75 rts
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
if(!the_node) return (RBTree_Node*)-1;
4a286: 76ff moveq #-1,%d3
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
4a288: 2003 movel %d3,%d0
4a28a: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
4a290: 4e5e unlk %fp
4a292: 4e75 rts
RBTree_Node *iter_node = the_rbtree->root;
int compare_result;
if (!iter_node) { /* special case: first node inserted */
the_node->color = RBT_BLACK;
4a294: 42ab 000c clrl %a3@(12)
} /* while(iter_node) */
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
4a298: 4283 clrl %d3
}
4a29a: 2003 movel %d3,%d0
RBTree_Node *iter_node = the_rbtree->root;
int compare_result;
if (!iter_node) { /* special case: first node inserted */
the_node->color = RBT_BLACK;
the_rbtree->root = the_node;
4a29c: 294b 0004 movel %a3,%a4@(4)
the_rbtree->first[0] = the_rbtree->first[1] = the_node;
4a2a0: 294b 000c movel %a3,%a4@(12)
4a2a4: 294b 0008 movel %a3,%a4@(8)
the_node->parent = (RBTree_Node *) the_rbtree;
4a2a8: 268c movel %a4,%a3@
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
4a2aa: 42ab 0008 clrl %a3@(8)
4a2ae: 42ab 0004 clrl %a3@(4)
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
4a2b2: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
4a2b8: 4e5e unlk %fp <== NOT EXECUTED
0004a2e8 <_RBTree_Iterate_unprotected>:
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_First(
const RBTree_Control *the_rbtree,
RBTree_Direction dir
)
{
return the_rbtree->first[dir];
4a2e8: 7202 moveq #2,%d1
const RBTree_Control *rbtree,
RBTree_Direction dir,
RBTree_Visitor visitor,
void *visitor_arg
)
{
4a2ea: 4e56 ffe8 linkw %fp,#-24
4a2ee: 206e 0008 moveal %fp@(8),%a0
4a2f2: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
4a2f6: 262e 000c movel %fp@(12),%d3
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
4a2fa: 57c0 seq %d0
4a2fc: 246e 0010 moveal %fp@(16),%a2
4a300: 49c0 extbl %d0
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_First(
const RBTree_Control *the_rbtree,
RBTree_Direction dir
)
{
return the_rbtree->first[dir];
4a302: 9280 subl %d0,%d1
4a304: 47f9 0004 a33c lea 4a33c <_RBTree_Next_unprotected>,%a3
4a30a: 2430 1c00 movel %a0@(00000000,%d1:l:4),%d2
4a30e: 2a2e 0014 movel %fp@(20),%d5
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
4a312: 4a82 tstl %d2
4a314: 671a beqs 4a330 <_RBTree_Iterate_unprotected+0x48>
stop = (*visitor)( current, dir, visitor_arg );
4a316: 2f05 movel %d5,%sp@-
4a318: 2f03 movel %d3,%sp@-
4a31a: 2f02 movel %d2,%sp@-
4a31c: 4e92 jsr %a2@
current = _RBTree_Next_unprotected( current, dir );
4a31e: 2f03 movel %d3,%sp@-
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
stop = (*visitor)( current, dir, visitor_arg );
4a320: 1800 moveb %d0,%d4
current = _RBTree_Next_unprotected( current, dir );
4a322: 2f02 movel %d2,%sp@-
4a324: 4e93 jsr %a3@
{
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
4a326: 4fef 0014 lea %sp@(20),%sp
stop = (*visitor)( current, dir, visitor_arg );
current = _RBTree_Next_unprotected( current, dir );
4a32a: 2400 movel %d0,%d2
{
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
4a32c: 4a04 tstb %d4
4a32e: 67e2 beqs 4a312 <_RBTree_Iterate_unprotected+0x2a><== ALWAYS TAKEN
stop = (*visitor)( current, dir, visitor_arg );
current = _RBTree_Next_unprotected( current, dir );
}
}
4a330: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
4a336: 4e5e unlk %fp
...
0004a33c <_RBTree_Next_unprotected>:
RBTree_Node *_RBTree_Next_unprotected(
const RBTree_Node *node,
RBTree_Direction dir
)
{
4a33c: 4e56 0000 linkw %fp,#0
4a340: 222e 000c movel %fp@(12),%d1
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
4a344: 57c0 seq %d0
4a346: 226e 0008 moveal %fp@(8),%a1
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
RBTree_Node *current = node->child [dir];
4a34a: 5281 addql #1,%d1
4a34c: 49c0 extbl %d0
4a34e: 4480 negl %d0
4a350: 2071 1c00 moveal %a1@(00000000,%d1:l:4),%a0
RBTree_Node *_RBTree_Next_unprotected(
const RBTree_Node *node,
RBTree_Direction dir
)
{
4a354: 2f0a movel %a2,%sp@-
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
RBTree_Node *current = node->child [dir];
RBTree_Node *next = NULL;
if ( current != NULL ) {
4a356: 4a88 tstl %a0
4a358: 6718 beqs 4a372 <_RBTree_Next_unprotected+0x36>
4a35a: 5280 addql #1,%d0
next = current;
while ( (current = current->child [opp_dir]) != NULL ) {
4a35c: 2230 0c00 movel %a0@(00000000,%d0:l:4),%d1
4a360: 6708 beqs 4a36a <_RBTree_Next_unprotected+0x2e>
4a362: 2041 moveal %d1,%a0
4a364: 2230 0c00 movel %a0@(00000000,%d0:l:4),%d1
4a368: 66f8 bnes 4a362 <_RBTree_Next_unprotected+0x26> <== NEVER TAKEN
}
}
}
return next;
}
4a36a: 245f moveal %sp@+,%a2
RBTree_Node *parent = node->parent;
if ( parent->parent && node == parent->child [opp_dir] ) {
next = parent;
} else {
while ( parent->parent && node == parent->child [dir] ) {
4a36c: 2008 movel %a0,%d0
}
}
}
return next;
}
4a36e: 4e5e unlk %fp
4a370: 4e75 rts
next = current;
while ( (current = current->child [opp_dir]) != NULL ) {
next = current;
}
} else {
RBTree_Node *parent = node->parent;
4a372: 2051 moveal %a1@,%a0
if ( parent->parent && node == parent->child [opp_dir] ) {
4a374: 2450 moveal %a0@,%a2
4a376: 4a8a tstl %a2
4a378: 6706 beqs 4a380 <_RBTree_Next_unprotected+0x44>
4a37a: b3f0 0c04 cmpal %a0@(00000004,%d0:l:4),%a1
4a37e: 67ea beqs 4a36a <_RBTree_Next_unprotected+0x2e>
next = parent;
} else {
while ( parent->parent && node == parent->child [dir] ) {
4a380: 4a8a tstl %a2
4a382: 670e beqs 4a392 <_RBTree_Next_unprotected+0x56>
4a384: b3f0 1c00 cmpal %a0@(00000000,%d1:l:4),%a1
4a388: 66e0 bnes 4a36a <_RBTree_Next_unprotected+0x2e>
4a38a: 2248 moveal %a0,%a1
4a38c: 204a moveal %a2,%a0
4a38e: 2452 moveal %a2@,%a2
4a390: 60ee bras 4a380 <_RBTree_Next_unprotected+0x44>
}
}
}
return next;
}
4a392: 245f moveal %sp@+,%a2
RBTree_Direction dir
)
{
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
RBTree_Node *current = node->child [dir];
RBTree_Node *next = NULL;
4a394: 4280 clrl %d0
}
}
}
return next;
}
4a396: 4e5e unlk %fp <== NOT EXECUTED
000486cc <_RTEMS_signal_Post_switch_hook>:
#include <rtems/score/thread.h>
#include <rtems/score/apiext.h>
#include <rtems/rtems/tasks.h>
static void _RTEMS_signal_Post_switch_hook( Thread_Control *executing )
{
486cc: 4e56 ffec linkw %fp,#-20
486d0: 206e 0008 moveal %fp@(8),%a0
486d4: 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 ];
486d8: 2468 00f8 moveal %a0@(248),%a2
if ( !api )
486dc: 4a8a tstl %a2
486de: 671a beqs 486fa <_RTEMS_signal_Post_switch_hook+0x2e><== NEVER TAKEN
* Signal Processing
*/
asr = &api->Signal;
_ISR_Disable( level );
486e0: 203c 0000 0700 movel #1792,%d0
486e6: 40c1 movew %sr,%d1
486e8: 8081 orl %d1,%d0
486ea: 46c0 movew %d0,%sr
signal_set = asr->signals_posted;
486ec: 242a 0012 movel %a2@(18),%d2
asr->signals_posted = 0;
486f0: 42aa 0012 clrl %a2@(18)
_ISR_Enable( level );
486f4: 46c1 movew %d1,%sr
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
486f6: 4a82 tstl %d2
486f8: 660a bnes 48704 <_RTEMS_signal_Post_switch_hook+0x38>
(*asr->handler)( signal_set );
asr->nest_level -= 1;
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
}
486fa: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
48700: 4e5e unlk %fp
48702: 4e75 rts
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
return;
asr->nest_level += 1;
48704: 52aa 001a addql #1,%a2@(26)
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
48708: 260e movel %fp,%d3
4870a: 5983 subql #4,%d3
4870c: 47f9 0004 8b5c lea 48b5c <rtems_task_mode>,%a3
48712: 2f03 movel %d3,%sp@-
48714: 2f3c 0000 ffff movel #65535,%sp@-
4871a: 2f2a 000e movel %a2@(14),%sp@-
4871e: 4e93 jsr %a3@
(*asr->handler)( signal_set );
48720: 2f02 movel %d2,%sp@-
48722: 206a 000a moveal %a2@(10),%a0
48726: 4e90 jsr %a0@
asr->nest_level -= 1;
48728: 53aa 001a subql #1,%a2@(26)
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
4872c: 2f03 movel %d3,%sp@-
4872e: 2f3c 0000 ffff movel #65535,%sp@-
48734: 2f2e fffc movel %fp@(-4),%sp@-
48738: 4e93 jsr %a3@
4873a: 4fef 001c lea %sp@(28),%sp
}
4873e: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
48744: 4e5e unlk %fp <== NOT EXECUTED
0004c3d6 <_RTEMS_tasks_Create_extension>:
static bool _RTEMS_tasks_Create_extension(
Thread_Control *executing,
Thread_Control *created
)
{
4c3d6: 4e56 0000 linkw %fp,#0
4c3da: 2f0a movel %a2,%sp@-
4c3dc: 246e 000c moveal %fp@(12),%a2
/*
* Notepads must be the last entry in the structure and they
* can be left off if disabled in the configuration.
*/
to_allocate = sizeof( RTEMS_API_Control );
if ( !rtems_configuration_get_notepads_enabled() )
4c3e0: 4a39 0005 e1a6 tstb 5e1a6 <Configuration_RTEMS_API+0x4>
4c3e6: 675c beqs 4c444 <_RTEMS_tasks_Create_extension+0x6e>
/*
* Notepads must be the last entry in the structure and they
* can be left off if disabled in the configuration.
*/
to_allocate = sizeof( RTEMS_API_Control );
4c3e8: 705e moveq #94,%d0
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
4c3ea: 2f00 movel %d0,%sp@-
4c3ec: 4eb9 0004 abf4 jsr 4abf4 <_Workspace_Allocate>
if ( !api )
4c3f2: 588f addql #4,%sp
*/
to_allocate = sizeof( RTEMS_API_Control );
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
4c3f4: 2040 moveal %d0,%a0
if ( !api )
4c3f6: 4a80 tstl %d0
4c3f8: 675c beqs 4c456 <_RTEMS_tasks_Create_extension+0x80>
return false;
created->API_Extensions[ THREAD_API_RTEMS ] = api;
4c3fa: 2540 00f8 movel %d0,%a2@(248)
*/
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
ASR_Information *information
)
{
information->is_enabled = false;
4c3fe: 4200 clrb %d0
4c400: 4290 clrl %a0@
4c402: 1140 0008 moveb %d0,%a0@(8)
4c406: 42a8 0004 clrl %a0@(4)
information->handler = NULL;
4c40a: 42a8 000a clrl %a0@(10)
information->mode_set = RTEMS_DEFAULT_MODES;
4c40e: 42a8 000e clrl %a0@(14)
information->signals_posted = 0;
4c412: 42a8 0012 clrl %a0@(18)
information->signals_pending = 0;
4c416: 42a8 0016 clrl %a0@(22)
information->nest_level = 0;
4c41a: 42a8 001a clrl %a0@(26)
_Event_Initialize( &api->Event );
_Event_Initialize( &api->System_event );
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
4c41e: 42aa 0104 clrl %a2@(260)
if ( rtems_configuration_get_notepads_enabled() ) {
4c422: 4a39 0005 e1a6 tstb 5e1a6 <Configuration_RTEMS_API+0x4>
4c428: 6710 beqs 4c43a <_RTEMS_tasks_Create_extension+0x64>
* task is created via another API, then this routine is invoked
* and this API given the opportunity to initialize its extension
* area.
*/
static bool _RTEMS_tasks_Create_extension(
4c42a: 41e8 001e lea %a0@(30),%a0
4c42e: 4280 clrl %d0
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
4c430: 4298 clrl %a0@+
_Event_Initialize( &api->System_event );
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
4c432: 5280 addql #1,%d0
4c434: 7210 moveq #16,%d1
4c436: b280 cmpl %d0,%d1
4c438: 66f6 bnes 4c430 <_RTEMS_tasks_Create_extension+0x5a>
api->Notepads[i] = 0;
}
return true;
}
4c43a: 246e fffc moveal %fp@(-4),%a2
4c43e: 4e5e unlk %fp
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
4c440: 7001 moveq #1,%d0
}
4c442: 4e75 rts
* Notepads must be the last entry in the structure and they
* can be left off if disabled in the configuration.
*/
to_allocate = sizeof( RTEMS_API_Control );
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
4c444: 701e moveq #30,%d0
api = _Workspace_Allocate( to_allocate );
4c446: 2f00 movel %d0,%sp@-
4c448: 4eb9 0004 abf4 jsr 4abf4 <_Workspace_Allocate>
if ( !api )
4c44e: 588f addql #4,%sp
*/
to_allocate = sizeof( RTEMS_API_Control );
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
4c450: 2040 moveal %d0,%a0
if ( !api )
4c452: 4a80 tstl %d0
4c454: 66a4 bnes 4c3fa <_RTEMS_tasks_Create_extension+0x24><== ALWAYS TAKEN
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
4c456: 246e fffc moveal %fp@(-4),%a2
4c45a: 4e5e unlk %fp
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
if ( !api )
return false;
4c45c: 4200 clrb %d0 <== NOT EXECUTED
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
00047908 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
47908: 4e56 ffe4 linkw %fp,#-28
4790c: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%sp@
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
47910: 2479 0005 e1cc moveal 5e1cc <Configuration_RTEMS_API+0x2a>,%a2
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
47916: 2639 0005 e1c8 movel 5e1c8 <Configuration_RTEMS_API+0x26>,%d3
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
4791c: 4a8a tstl %a2
4791e: 6754 beqs 47974 <_RTEMS_tasks_Initialize_user_tasks_body+0x6c>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
47920: 4a83 tstl %d3
47922: 6750 beqs 47974 <_RTEMS_tasks_Initialize_user_tasks_body+0x6c><== NEVER TAKEN
47924: 280e movel %fp,%d4
47926: 4282 clrl %d2
47928: 5984 subql #4,%d4
4792a: 47f9 0004 76c4 lea 476c4 <rtems_task_create>,%a3
&id
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
47930: 49f9 0004 7990 lea 47990 <rtems_task_start>,%a4
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
return_value = rtems_task_create(
47936: 2f04 movel %d4,%sp@-
47938: 2f2a 000c movel %a2@(12),%sp@-
4793c: 2f2a 0014 movel %a2@(20),%sp@-
47940: 2f2a 0004 movel %a2@(4),%sp@-
47944: 2f2a 0008 movel %a2@(8),%sp@-
47948: 2f12 movel %a2@,%sp@-
4794a: 4e93 jsr %a3@
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
4794c: 4fef 0018 lea %sp@(24),%sp
47950: 4a80 tstl %d0
47952: 662a bnes 4797e <_RTEMS_tasks_Initialize_user_tasks_body+0x76>
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
47954: 2f2a 0018 movel %a2@(24),%sp@-
47958: 2f2a 0010 movel %a2@(16),%sp@-
4795c: 2f2e fffc movel %fp@(-4),%sp@-
47960: 4e94 jsr %a4@
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
47962: 4fef 000c lea %sp@(12),%sp
47966: 4a80 tstl %d0
47968: 6614 bnes 4797e <_RTEMS_tasks_Initialize_user_tasks_body+0x76>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
4796a: 5282 addql #1,%d2
4796c: 45ea 001c lea %a2@(28),%a2
47970: b682 cmpl %d2,%d3
47972: 66c2 bnes 47936 <_RTEMS_tasks_Initialize_user_tasks_body+0x2e><== NEVER TAKEN
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
47974: 4cee 1c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a4
4797a: 4e5e unlk %fp
4797c: 4e75 rts
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
4797e: 2f00 movel %d0,%sp@-
47980: 4878 0001 pea 1 <ADD>
47984: 4878 0001 pea 1 <ADD>
47988: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
...
0004c336 <_RTEMS_tasks_Switch_extension>:
static void _RTEMS_tasks_Switch_extension(
Thread_Control *executing,
Thread_Control *heir
)
{
4c336: 4e56 0000 linkw %fp,#0
4c33a: 206e 0008 moveal %fp@(8),%a0
/*
* Per Task Variables
*/
tvp = executing->task_variables;
4c33e: 2068 0104 moveal %a0@(260),%a0
while (tvp) {
4c342: 4a88 tstl %a0
4c344: 6712 beqs 4c358 <_RTEMS_tasks_Switch_extension+0x22>
tvp->tval = *tvp->ptr;
4c346: 2268 0004 moveal %a0@(4),%a1
4c34a: 2151 000c movel %a1@,%a0@(12)
*tvp->ptr = tvp->gval;
4c34e: 22a8 0008 movel %a0@(8),%a1@
tvp = (rtems_task_variable_t *)tvp->next;
4c352: 2050 moveal %a0@,%a0
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
4c354: 4a88 tstl %a0
4c356: 66ee bnes 4c346 <_RTEMS_tasks_Switch_extension+0x10><== NEVER TAKEN
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
4c358: 206e 000c moveal %fp@(12),%a0
4c35c: 2068 0104 moveal %a0@(260),%a0
while (tvp) {
4c360: 4a88 tstl %a0
4c362: 6712 beqs 4c376 <_RTEMS_tasks_Switch_extension+0x40>
tvp->gval = *tvp->ptr;
4c364: 2268 0004 moveal %a0@(4),%a1
4c368: 2151 0008 movel %a1@,%a0@(8)
*tvp->ptr = tvp->tval;
4c36c: 22a8 000c movel %a0@(12),%a1@
tvp = (rtems_task_variable_t *)tvp->next;
4c370: 2050 moveal %a0@,%a0
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
4c372: 4a88 tstl %a0
4c374: 66ee bnes 4c364 <_RTEMS_tasks_Switch_extension+0x2e><== NEVER TAKEN
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
}
}
4c376: 4e5e unlk %fp <== NOT EXECUTED
00073c48 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
73c48: 4e56 fffc linkw %fp,#-4
73c4c: 2f0a movel %a2,%sp@-
73c4e: 486e fffc pea %fp@(-4)
73c52: 2f2e 0008 movel %fp@(8),%sp@-
73c56: 4879 000a 01c0 pea a01c0 <_Rate_monotonic_Information>
73c5c: 4eb9 0004 8c00 jsr 48c00 <_Objects_Get>
/*
* When we get here, the Timer is already off the chain so we do not
* have to worry about that -- hence no _Watchdog_Remove().
*/
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
73c62: 4fef 000c lea %sp@(12),%sp
73c66: 2440 moveal %d0,%a2
73c68: 4aae fffc tstl %fp@(-4)
73c6c: 6636 bnes 73ca4 <_Rate_monotonic_Timeout+0x5c> <== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
73c6e: 206a 0040 moveal %a2@(64),%a0
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_PERIOD);
73c72: 2028 0010 movel %a0@(16),%d0
73c76: 0280 0000 4000 andil #16384,%d0
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
73c7c: 670a beqs 73c88 <_Rate_monotonic_Timeout+0x40>
73c7e: 202a 0008 movel %a2@(8),%d0
73c82: b0a8 0020 cmpl %a0@(32),%d0
73c86: 675e beqs 73ce6 <_Rate_monotonic_Timeout+0x9e>
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
73c88: 7001 moveq #1,%d0
73c8a: b0aa 0038 cmpl %a2@(56),%d0
73c8e: 671c beqs 73cac <_Rate_monotonic_Timeout+0x64>
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
73c90: 7004 moveq #4,%d0
73c92: 2540 0038 movel %d0,%a2@(56)
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
73c96: 2039 0009 fe7a movel 9fe7a <_Thread_Dispatch_disable_level>,%d0
--level;
73c9c: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
73c9e: 23c0 0009 fe7a movel %d0,9fe7a <_Thread_Dispatch_disable_level>
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
73ca4: 246e fff8 moveal %fp@(-8),%a2
73ca8: 4e5e unlk %fp
73caa: 4e75 rts
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
73cac: 103c 0003 moveb #3,%d0
73cb0: 2540 0038 movel %d0,%a2@(56)
_Rate_monotonic_Initiate_statistics( the_period );
73cb4: 2f0a movel %a2,%sp@-
73cb6: 4eb9 0007 3984 jsr 73984 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
73cbc: 256a 003c 001c movel %a2@(60),%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
73cc2: 486a 0010 pea %a2@(16)
73cc6: 4879 0009 ff16 pea 9ff16 <_Watchdog_Ticks_chain>
73ccc: 4eb9 0004 a548 jsr 4a548 <_Watchdog_Insert>
73cd2: 4fef 000c lea %sp@(12),%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
73cd6: 2039 0009 fe7a movel 9fe7a <_Thread_Dispatch_disable_level>,%d0
--level;
73cdc: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
73cde: 23c0 0009 fe7a movel %d0,9fe7a <_Thread_Dispatch_disable_level>
73ce4: 60be bras 73ca4 <_Rate_monotonic_Timeout+0x5c>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
73ce6: 2f3c 1007 fff8 movel #268959736,%sp@-
73cec: 2f08 movel %a0,%sp@-
73cee: 4eb9 0004 94e8 jsr 494e8 <_Thread_Clear_state>
the_thread = the_period->owner;
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
73cf4: 2f0a movel %a2,%sp@-
73cf6: 4eb9 0007 3984 jsr 73984 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
73cfc: 256a 003c 001c movel %a2@(60),%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
73d02: 486a 0010 pea %a2@(16)
73d06: 4879 0009 ff16 pea 9ff16 <_Watchdog_Ticks_chain>
73d0c: 4eb9 0004 a548 jsr 4a548 <_Watchdog_Insert>
73d12: 4fef 0014 lea %sp@(20),%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
73d16: 2039 0009 fe7a movel 9fe7a <_Thread_Dispatch_disable_level>,%d0
--level;
73d1c: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
73d1e: 23c0 0009 fe7a movel %d0,9fe7a <_Thread_Dispatch_disable_level>
73d24: 6000 ff7e braw 73ca4 <_Rate_monotonic_Timeout+0x5c>
00049bc0 <_Scheduler_CBS_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_CBS_Allocate(
Thread_Control *the_thread
)
{
49bc0: 4e56 0000 linkw %fp,#0
49bc4: 2f0a movel %a2,%sp@-
void *sched;
Scheduler_CBS_Per_thread *schinfo;
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
49bc6: 4878 001c pea 1c <OPER2+0x8>
#include <rtems/score/wkspace.h>
void *_Scheduler_CBS_Allocate(
Thread_Control *the_thread
)
{
49bca: 246e 0008 moveal %fp@(8),%a2
void *sched;
Scheduler_CBS_Per_thread *schinfo;
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
49bce: 4eb9 0004 b5e8 jsr 4b5e8 <_Workspace_Allocate>
if ( sched ) {
49bd4: 588f addql #4,%sp
49bd6: 4a80 tstl %d0
49bd8: 6712 beqs 49bec <_Scheduler_CBS_Allocate+0x2c> <== NEVER TAKEN
the_thread->scheduler_info = sched;
49bda: 2540 0086 movel %d0,%a2@(134)
schinfo = (Scheduler_CBS_Per_thread *)(the_thread->scheduler_info);
schinfo->edf_per_thread.thread = the_thread;
49bde: 2040 moveal %d0,%a0
schinfo->edf_per_thread.queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
49be0: 7202 moveq #2,%d1
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
if ( sched ) {
the_thread->scheduler_info = sched;
schinfo = (Scheduler_CBS_Per_thread *)(the_thread->scheduler_info);
schinfo->edf_per_thread.thread = the_thread;
49be2: 208a movel %a2,%a0@
schinfo->edf_per_thread.queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
49be4: 2141 0014 movel %d1,%a0@(20)
schinfo->cbs_server = NULL;
49be8: 42a8 0018 clrl %a0@(24)
}
return sched;
}
49bec: 246e fffc moveal %fp@(-4),%a2
49bf0: 4e5e unlk %fp <== NOT EXECUTED
0004b2f8 <_Scheduler_CBS_Budget_callout>:
Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
void _Scheduler_CBS_Budget_callout(
Thread_Control *the_thread
)
{
4b2f8: 4e56 fffc linkw %fp,#-4
4b2fc: 2f0a movel %a2,%sp@-
4b2fe: 246e 0008 moveal %fp@(8),%a2
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info;
Scheduler_CBS_Server_id server_id;
/* Put violating task to background until the end of period. */
new_priority = the_thread->Start.initial_priority;
4b302: 202a 00a8 movel %a2@(168),%d0
if ( the_thread->real_priority != new_priority )
4b306: b0aa 0018 cmpl %a2@(24),%d0
4b30a: 6704 beqs 4b310 <_Scheduler_CBS_Budget_callout+0x18><== NEVER TAKEN
the_thread->real_priority = new_priority;
4b30c: 2540 0018 movel %d0,%a2@(24)
if ( the_thread->current_priority != new_priority )
4b310: b0aa 0014 cmpl %a2@(20),%d0
4b314: 6712 beqs 4b328 <_Scheduler_CBS_Budget_callout+0x30><== NEVER TAKEN
_Thread_Change_priority(the_thread, new_priority, true);
4b316: 4878 0001 pea 1 <ADD>
4b31a: 2f00 movel %d0,%sp@-
4b31c: 2f0a movel %a2,%sp@-
4b31e: 4eb9 0004 b8d0 jsr 4b8d0 <_Thread_Change_priority>
4b324: 4fef 000c lea %sp@(12),%sp
/* Invoke callback function if any. */
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
4b328: 246a 0086 moveal %a2@(134),%a2
if ( sched_info->cbs_server->cbs_budget_overrun ) {
4b32c: 206a 0018 moveal %a2@(24),%a0
4b330: 4aa8 000c tstl %a0@(12)
4b334: 671e beqs 4b354 <_Scheduler_CBS_Budget_callout+0x5c>
_Scheduler_CBS_Get_server_id(
4b336: 486e fffc pea %fp@(-4)
4b33a: 2f10 movel %a0@,%sp@-
4b33c: 4eb9 0004 b2b4 jsr 4b2b4 <_Scheduler_CBS_Get_server_id>
sched_info->cbs_server->task_id,
&server_id
);
sched_info->cbs_server->cbs_budget_overrun( server_id );
4b342: 206a 0018 moveal %a2@(24),%a0
4b346: 2f2e fffc movel %fp@(-4),%sp@-
4b34a: 2068 000c moveal %a0@(12),%a0
4b34e: 4e90 jsr %a0@
4b350: 4fef 000c lea %sp@(12),%sp
}
}
4b354: 246e fff8 moveal %fp@(-8),%a2
4b358: 4e5e unlk %fp <== NOT EXECUTED
0004aeb0 <_Scheduler_CBS_Cleanup>:
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Cleanup (void)
{
4aeb0: 4e56 0000 linkw %fp,#0
4aeb4: 2079 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a0
4aeba: 2f0a movel %a2,%sp@-
4aebc: 2f02 movel %d2,%sp@-
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4aebe: 4ab9 0006 18fc tstl 618fc <_Scheduler_CBS_Maximum_servers>
4aec4: 6724 beqs 4aeea <_Scheduler_CBS_Cleanup+0x3a> <== NEVER TAKEN
4aec6: 4282 clrl %d2
if ( _Scheduler_CBS_Server_list[ i ] )
_Scheduler_CBS_Destroy_server( i );
4aec8: 45f9 0004 afb8 lea 4afb8 <_Scheduler_CBS_Destroy_server>,%a2
int _Scheduler_CBS_Cleanup (void)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( _Scheduler_CBS_Server_list[ i ] )
4aece: 4ab0 2c00 tstl %a0@(00000000,%d2:l:4)
4aed2: 670c beqs 4aee0 <_Scheduler_CBS_Cleanup+0x30>
_Scheduler_CBS_Destroy_server( i );
4aed4: 2f02 movel %d2,%sp@-
4aed6: 4e92 jsr %a2@
4aed8: 2079 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a0
4aede: 588f addql #4,%sp
int _Scheduler_CBS_Cleanup (void)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4aee0: 5282 addql #1,%d2
4aee2: b4b9 0006 18fc cmpl 618fc <_Scheduler_CBS_Maximum_servers>,%d2
4aee8: 65e4 bcss 4aece <_Scheduler_CBS_Cleanup+0x1e>
if ( _Scheduler_CBS_Server_list[ i ] )
_Scheduler_CBS_Destroy_server( i );
}
_Workspace_Free( _Scheduler_CBS_Server_list );
4aeea: 2f08 movel %a0,%sp@-
4aeec: 4eb9 0004 cd80 jsr 4cd80 <_Workspace_Free>
return SCHEDULER_CBS_OK;
}
4aef2: 242e fff8 movel %fp@(-8),%d2
4aef6: 4280 clrl %d0
4aef8: 246e fffc moveal %fp@(-4),%a2
4aefc: 4e5e unlk %fp <== NOT EXECUTED
0004af00 <_Scheduler_CBS_Create_server>:
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
4af00: 4e56 fff0 linkw %fp,#-16
4af04: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
4af08: 266e 0008 moveal %fp@(8),%a3
4af0c: 246e 0010 moveal %fp@(16),%a2
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
4af10: 4aab 0004 tstl %a3@(4)
4af14: 6f00 0088 blew 4af9e <_Scheduler_CBS_Create_server+0x9e>
4af18: 4a93 tstl %a3@
4af1a: 6f00 0082 blew 4af9e <_Scheduler_CBS_Create_server+0x9e>
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4af1e: 2239 0006 18fc movel 618fc <_Scheduler_CBS_Maximum_servers>,%d1
4af24: 6766 beqs 4af8c <_Scheduler_CBS_Create_server+0x8c><== NEVER TAKEN
if ( !_Scheduler_CBS_Server_list[i] )
4af26: 2279 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a1
4af2c: 4a91 tstl %a1@
4af2e: 6768 beqs 4af98 <_Scheduler_CBS_Create_server+0x98>
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Create_server (
4af30: 41e9 0004 lea %a1@(4),%a0
4af34: 4280 clrl %d0
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4af36: 5280 addql #1,%d0
4af38: b280 cmpl %d0,%d1
4af3a: 6750 beqs 4af8c <_Scheduler_CBS_Create_server+0x8c>
if ( !_Scheduler_CBS_Server_list[i] )
4af3c: 4a98 tstl %a0@+
4af3e: 66f6 bnes 4af36 <_Scheduler_CBS_Create_server+0x36>
4af40: 2200 movel %d0,%d1
4af42: e589 lsll #2,%d1
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
4af44: 4878 0010 pea 10 <INVALID_OPERATION>
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
4af48: 49f1 1800 lea %a1@(00000000,%d1:l),%a4
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
4af4c: 2480 movel %d0,%a2@
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
4af4e: 4eb9 0004 cd64 jsr 4cd64 <_Workspace_Allocate>
the_server = _Scheduler_CBS_Server_list[*server_id];
4af54: 2212 movel %a2@,%d1
if ( !the_server )
4af56: 588f addql #4,%sp
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
4af58: 2880 movel %d0,%a4@
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
4af5a: 2079 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a0
4af60: 2070 1c00 moveal %a0@(00000000,%d1:l:4),%a0
if ( !the_server )
4af64: 4a88 tstl %a0
4af66: 6742 beqs 4afaa <_Scheduler_CBS_Create_server+0xaa><== NEVER TAKEN
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
4af68: 4280 clrl %d0
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
4af6a: 2213 movel %a3@,%d1
4af6c: 242b 0004 movel %a3@(4),%d2
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
4af70: 216e 000c 000c movel %fp@(12),%a0@(12)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
4af76: 2141 0004 movel %d1,%a0@(4)
4af7a: 2142 0008 movel %d2,%a0@(8)
the_server->task_id = -1;
4af7e: 72ff moveq #-1,%d1
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
4af80: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
the_server->task_id = -1;
4af86: 2081 movel %d1,%a0@
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
4af88: 4e5e unlk %fp
4af8a: 4e75 rts
if ( !_Scheduler_CBS_Server_list[i] )
break;
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
4af8c: 70e6 moveq #-26,%d0
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
4af8e: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
4af94: 4e5e unlk %fp
4af96: 4e75 rts
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( !_Scheduler_CBS_Server_list[i] )
4af98: 4281 clrl %d1
4af9a: 4280 clrl %d0
4af9c: 60a6 bras 4af44 <_Scheduler_CBS_Create_server+0x44>
if ( params->budget <= 0 ||
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
4af9e: 70ee moveq #-18,%d0
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
4afa0: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
4afa6: 4e5e unlk %fp
4afa8: 4e75 rts
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
4afaa: 70ef moveq #-17,%d0 <== NOT EXECUTED
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
4afac: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4 <== NOT EXECUTED
4afb2: 4e5e unlk %fp <== NOT EXECUTED
...
0004b058 <_Scheduler_CBS_Detach_thread>:
int _Scheduler_CBS_Detach_thread (
Scheduler_CBS_Server_id server_id,
rtems_id task_id
)
{
4b058: 4e56 fff0 linkw %fp,#-16
4b05c: 48d7 040c moveml %d2-%d3/%a2,%sp@
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
4b060: 486e fffc pea %fp@(-4)
int _Scheduler_CBS_Detach_thread (
Scheduler_CBS_Server_id server_id,
rtems_id task_id
)
{
4b064: 242e 000c movel %fp@(12),%d2
4b068: 262e 0008 movel %fp@(8),%d3
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
4b06c: 2f02 movel %d2,%sp@-
4b06e: 4eb9 0004 bdd4 jsr 4bdd4 <_Thread_Get>
/* The routine _Thread_Get may disable dispatch and not enable again. */
if ( the_thread ) {
4b074: 508f addql #8,%sp
{
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
4b076: 2440 moveal %d0,%a2
/* The routine _Thread_Get may disable dispatch and not enable again. */
if ( the_thread ) {
4b078: 4a80 tstl %d0
4b07a: 674a beqs 4b0c6 <_Scheduler_CBS_Detach_thread+0x6e>
_Thread_Enable_dispatch();
4b07c: 4eb9 0004 bdb4 jsr 4bdb4 <_Thread_Enable_dispatch>
}
if ( server_id >= _Scheduler_CBS_Maximum_servers )
4b082: b6b9 0006 18fc cmpl 618fc <_Scheduler_CBS_Maximum_servers>,%d3
4b088: 643c bccs 4b0c6 <_Scheduler_CBS_Detach_thread+0x6e>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !the_thread )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
/* Server is not valid. */
if ( !_Scheduler_CBS_Server_list[server_id] )
4b08a: 2079 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a0
4b090: 2070 3c00 moveal %a0@(00000000,%d3:l:4),%a0
4b094: 4a88 tstl %a0
4b096: 673a beqs 4b0d2 <_Scheduler_CBS_Detach_thread+0x7a>
return SCHEDULER_CBS_ERROR_NOSERVER;
/* Thread and server are not attached. */
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
4b098: b490 cmpl %a0@,%d2
4b09a: 662a bnes 4b0c6 <_Scheduler_CBS_Detach_thread+0x6e><== NEVER TAKEN
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
4b09c: 70ff moveq #-1,%d0
4b09e: 2080 movel %d0,%a0@
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
4b0a0: 206a 0086 moveal %a2@(134),%a0
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
return SCHEDULER_CBS_OK;
4b0a4: 4280 clrl %d0
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
4b0a6: 42a8 0018 clrl %a0@(24)
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
4b0aa: 256a 009c 0076 movel %a2@(156),%a2@(118)
the_thread->budget_callout = the_thread->Start.budget_callout;
4b0b0: 256a 00a0 007a movel %a2@(160),%a2@(122)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
4b0b6: 156a 009a 0070 moveb %a2@(154),%a2@(112)
return SCHEDULER_CBS_OK;
}
4b0bc: 4cee 040c fff0 moveml %fp@(-16),%d2-%d3/%a2
4b0c2: 4e5e unlk %fp
4b0c4: 4e75 rts
if ( the_thread ) {
_Thread_Enable_dispatch();
}
if ( server_id >= _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
4b0c6: 70ee moveq #-18,%d0
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
return SCHEDULER_CBS_OK;
}
4b0c8: 4cee 040c fff0 moveml %fp@(-16),%d2-%d3/%a2
4b0ce: 4e5e unlk %fp
4b0d0: 4e75 rts
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !the_thread )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
/* Server is not valid. */
if ( !_Scheduler_CBS_Server_list[server_id] )
return SCHEDULER_CBS_ERROR_NOSERVER;
4b0d2: 70e7 moveq #-25,%d0
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
return SCHEDULER_CBS_OK;
}
4b0d4: 4cee 040c fff0 moveml %fp@(-16),%d2-%d3/%a2
4b0da: 4e5e unlk %fp
...
0004b2b4 <_Scheduler_CBS_Get_server_id>:
int _Scheduler_CBS_Get_server_id (
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
4b2b4: 4e56 0000 linkw %fp,#0
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4b2b8: 2239 0006 18fc movel 618fc <_Scheduler_CBS_Maximum_servers>,%d1
int _Scheduler_CBS_Get_server_id (
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
4b2be: 2f02 movel %d2,%sp@-
4b2c0: 242e 0008 movel %fp@(8),%d2
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4b2c4: 4a81 tstl %d1
4b2c6: 6718 beqs 4b2e0 <_Scheduler_CBS_Get_server_id+0x2c><== NEVER TAKEN
4b2c8: 2279 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a1
4b2ce: 4280 clrl %d0
if ( _Scheduler_CBS_Server_list[i] &&
4b2d0: 2059 moveal %a1@+,%a0
4b2d2: 4a88 tstl %a0
4b2d4: 6704 beqs 4b2da <_Scheduler_CBS_Get_server_id+0x26>
4b2d6: b490 cmpl %a0@,%d2
4b2d8: 670e beqs 4b2e8 <_Scheduler_CBS_Get_server_id+0x34>
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4b2da: 5280 addql #1,%d0
4b2dc: b280 cmpl %d0,%d1
4b2de: 66f0 bnes 4b2d0 <_Scheduler_CBS_Get_server_id+0x1c>
*server_id = i;
return SCHEDULER_CBS_OK;
}
}
return SCHEDULER_CBS_ERROR_NOSERVER;
}
4b2e0: 241f movel %sp@+,%d2
_Scheduler_CBS_Server_list[i]->task_id == task_id ) {
*server_id = i;
return SCHEDULER_CBS_OK;
}
}
return SCHEDULER_CBS_ERROR_NOSERVER;
4b2e2: 70e7 moveq #-25,%d0
}
4b2e4: 4e5e unlk %fp
4b2e6: 4e75 rts
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( _Scheduler_CBS_Server_list[i] &&
_Scheduler_CBS_Server_list[i]->task_id == task_id ) {
*server_id = i;
4b2e8: 206e 000c moveal %fp@(12),%a0
return SCHEDULER_CBS_OK;
}
}
return SCHEDULER_CBS_ERROR_NOSERVER;
}
4b2ec: 241f movel %sp@+,%d2
4b2ee: 4e5e unlk %fp
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( _Scheduler_CBS_Server_list[i] &&
_Scheduler_CBS_Server_list[i]->task_id == task_id ) {
*server_id = i;
4b2f0: 2080 movel %d0,%a0@
return SCHEDULER_CBS_OK;
4b2f2: 4280 clrl %d0
}
}
return SCHEDULER_CBS_ERROR_NOSERVER;
}
...
0004b35c <_Scheduler_CBS_Initialize>:
int _Scheduler_CBS_Initialize(void)
{
4b35c: 4e56 0000 linkw %fp,#0
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
4b360: 2039 0006 18fc movel 618fc <_Scheduler_CBS_Maximum_servers>,%d0
4b366: e588 lsll #2,%d0
4b368: 2f00 movel %d0,%sp@-
4b36a: 4eb9 0004 cd64 jsr 4cd64 <_Workspace_Allocate>
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
4b370: 588f addql #4,%sp
}
int _Scheduler_CBS_Initialize(void)
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
4b372: 2040 moveal %d0,%a0
4b374: 23c0 0006 32d2 movel %d0,632d2 <_Scheduler_CBS_Server_list>
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
4b37a: 672c beqs 4b3a8 <_Scheduler_CBS_Initialize+0x4c> <== NEVER TAKEN
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
4b37c: 2039 0006 18fc movel 618fc <_Scheduler_CBS_Maximum_servers>,%d0
4b382: 4281 clrl %d1
4b384: 4a80 tstl %d0
4b386: 671a beqs 4b3a2 <_Scheduler_CBS_Initialize+0x46> <== NEVER TAKEN
_Scheduler_CBS_Server_list[i] = NULL;
4b388: 42b0 1c00 clrl %a0@(00000000,%d1:l:4)
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
4b38c: 5281 addql #1,%d1
4b38e: b081 cmpl %d1,%d0
4b390: 6710 beqs 4b3a2 <_Scheduler_CBS_Initialize+0x46> <== NEVER TAKEN
4b392: 2079 0006 32d2 moveal 632d2 <_Scheduler_CBS_Server_list>,%a0
_Scheduler_CBS_Server_list[i] = NULL;
4b398: 42b0 1c00 clrl %a0@(00000000,%d1:l:4)
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
4b39c: 5281 addql #1,%d1
4b39e: b081 cmpl %d1,%d0
4b3a0: 66f0 bnes 4b392 <_Scheduler_CBS_Initialize+0x36>
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
4b3a2: 4280 clrl %d0
}
4b3a4: 4e5e unlk %fp
4b3a6: 4e75 rts
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
4b3a8: 70ef moveq #-17,%d0 <== NOT EXECUTED
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
}
4b3aa: 4e5e unlk %fp <== NOT EXECUTED
...
00049bf4 <_Scheduler_CBS_Release_job>:
void _Scheduler_CBS_Release_job(
Thread_Control *the_thread,
uint32_t deadline
)
{
49bf4: 4e56 0000 linkw %fp,#0
49bf8: 206e 0008 moveal %fp@(8),%a0
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
(Scheduler_CBS_Server *) sched_info->cbs_server;
49bfc: 2268 0086 moveal %a0@(134),%a1
)
{
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
49c00: 2269 0018 moveal %a1@(24),%a1
(Scheduler_CBS_Server *) sched_info->cbs_server;
if (deadline) {
49c04: 4aae 000c tstl %fp@(12)
49c08: 6732 beqs 49c3c <_Scheduler_CBS_Release_job+0x48>
/* Initializing or shifting deadline. */
if (serv_info)
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
49c0a: 2039 0006 13a2 movel 613a2 <_Watchdog_Ticks_since_boot>,%d0
Scheduler_CBS_Server *serv_info =
(Scheduler_CBS_Server *) sched_info->cbs_server;
if (deadline) {
/* Initializing or shifting deadline. */
if (serv_info)
49c10: 4a89 tstl %a1
49c12: 6738 beqs 49c4c <_Scheduler_CBS_Release_job+0x58><== NEVER TAKEN
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
49c14: d0a9 0004 addl %a1@(4),%d0
49c18: 0880 001f bclr #31,%d0
new_priority = the_thread->Start.initial_priority;
}
/* Budget replenishment for the next job. */
if (serv_info)
the_thread->cpu_time_budget = serv_info->parameters.budget;
49c1c: 2169 0008 0072 movel %a1@(8),%a0@(114)
the_thread->real_priority = new_priority;
_Thread_Change_priority(the_thread, new_priority, true);
49c22: 4878 0001 pea 1 <ADD>
49c26: 2f00 movel %d0,%sp@-
/* Budget replenishment for the next job. */
if (serv_info)
the_thread->cpu_time_budget = serv_info->parameters.budget;
the_thread->real_priority = new_priority;
49c28: 2140 0018 movel %d0,%a0@(24)
_Thread_Change_priority(the_thread, new_priority, true);
49c2c: 2f08 movel %a0,%sp@-
49c2e: 4eb9 0004 a0c0 jsr 4a0c0 <_Thread_Change_priority>
49c34: 4fef 000c lea %sp@(12),%sp
}
49c38: 4e5e unlk %fp
49c3a: 4e75 rts
new_priority = (_Watchdog_Ticks_since_boot + deadline)
& ~SCHEDULER_EDF_PRIO_MSB;
}
else {
/* Switch back to background priority. */
new_priority = the_thread->Start.initial_priority;
49c3c: 2028 00a8 movel %a0@(168),%d0
}
/* Budget replenishment for the next job. */
if (serv_info)
49c40: 4a89 tstl %a1
49c42: 67de beqs 49c22 <_Scheduler_CBS_Release_job+0x2e><== NEVER TAKEN
the_thread->cpu_time_budget = serv_info->parameters.budget;
49c44: 2169 0008 0072 movel %a1@(8),%a0@(114)
49c4a: 60d6 bras 49c22 <_Scheduler_CBS_Release_job+0x2e>
/* Initializing or shifting deadline. */
if (serv_info)
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
& ~SCHEDULER_EDF_PRIO_MSB;
else
new_priority = (_Watchdog_Ticks_since_boot + deadline)
49c4c: d0ae 000c addl %fp@(12),%d0
/* Budget replenishment for the next job. */
if (serv_info)
the_thread->cpu_time_budget = serv_info->parameters.budget;
the_thread->real_priority = new_priority;
_Thread_Change_priority(the_thread, new_priority, true);
49c50: 4878 0001 pea 1 <ADD>
/* Initializing or shifting deadline. */
if (serv_info)
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
& ~SCHEDULER_EDF_PRIO_MSB;
else
new_priority = (_Watchdog_Ticks_since_boot + deadline)
49c54: 0880 001f bclr #31,%d0
/* Budget replenishment for the next job. */
if (serv_info)
the_thread->cpu_time_budget = serv_info->parameters.budget;
the_thread->real_priority = new_priority;
_Thread_Change_priority(the_thread, new_priority, true);
49c58: 2f00 movel %d0,%sp@-
/* Budget replenishment for the next job. */
if (serv_info)
the_thread->cpu_time_budget = serv_info->parameters.budget;
the_thread->real_priority = new_priority;
49c5a: 2140 0018 movel %d0,%a0@(24)
_Thread_Change_priority(the_thread, new_priority, true);
49c5e: 2f08 movel %a0,%sp@-
49c60: 4eb9 0004 a0c0 jsr 4a0c0 <_Thread_Change_priority>
49c66: 4fef 000c lea %sp@(12),%sp
}
49c6a: 4e5e unlk %fp
...
00049c70 <_Scheduler_CBS_Unblock>:
#include <rtems/score/schedulercbs.h>
void _Scheduler_CBS_Unblock(
Thread_Control *the_thread
)
{
49c70: 4e56 0000 linkw %fp,#0
49c74: 2f0a movel %a2,%sp@-
49c76: 246e 0008 moveal %fp@(8),%a2
49c7a: 2f02 movel %d2,%sp@-
Scheduler_CBS_Per_thread *sched_info;
Scheduler_CBS_Server *serv_info;
Priority_Control new_priority;
_Scheduler_EDF_Enqueue(the_thread);
49c7c: 2f0a movel %a2,%sp@-
49c7e: 4eb9 0004 9d94 jsr 49d94 <_Scheduler_EDF_Enqueue>
/* TODO: flash critical section? */
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
serv_info = (Scheduler_CBS_Server *) sched_info->cbs_server;
49c84: 206a 0086 moveal %a2@(134),%a0
* Late unblock rule for deadline-driven tasks. The remaining time to
* deadline must be sufficient to serve the remaining computation time
* without increased utilization of this task. It might cause a deadline
* miss of another task.
*/
if (serv_info) {
49c88: 588f addql #4,%sp
_Scheduler_EDF_Enqueue(the_thread);
/* TODO: flash critical section? */
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
serv_info = (Scheduler_CBS_Server *) sched_info->cbs_server;
49c8a: 2068 0018 moveal %a0@(24),%a0
* Late unblock rule for deadline-driven tasks. The remaining time to
* deadline must be sufficient to serve the remaining computation time
* without increased utilization of this task. It might cause a deadline
* miss of another task.
*/
if (serv_info) {
49c8e: 4a88 tstl %a0
49c90: 6700 0094 beqw 49d26 <_Scheduler_CBS_Unblock+0xb6>
time_t deadline = serv_info->parameters.deadline;
time_t budget = serv_info->parameters.budget;
time_t deadline_left = the_thread->cpu_time_budget;
time_t budget_left = the_thread->real_priority -
49c94: 222a 0018 movel %a2@(24),%d1
49c98: 2401 movel %d1,%d2
_Watchdog_Ticks_since_boot;
if ( deadline*budget_left > budget*deadline_left ) {
49c9a: 43e8 0004 lea %a0@(4),%a1
*/
if (serv_info) {
time_t deadline = serv_info->parameters.deadline;
time_t budget = serv_info->parameters.budget;
time_t deadline_left = the_thread->cpu_time_budget;
time_t budget_left = the_thread->real_priority -
49c9e: 2039 0006 13a2 movel 613a2 <_Watchdog_Ticks_since_boot>,%d0
49ca4: 9480 subl %d0,%d2
49ca6: 2002 movel %d2,%d0
_Watchdog_Ticks_since_boot;
if ( deadline*budget_left > budget*deadline_left ) {
49ca8: 4c11 0800 mulsl %a1@,%d0
49cac: 43ea 0072 lea %a2@(114),%a1
49cb0: 2428 0008 movel %a0@(8),%d2
49cb4: 4c11 2800 mulsl %a1@,%d2
49cb8: b480 cmpl %d0,%d2
49cba: 6c6a bges 49d26 <_Scheduler_CBS_Unblock+0xb6>
/* Put late unblocked task to background until the end of period. */
new_priority = the_thread->Start.initial_priority;
49cbc: 206a 00a8 moveal %a2@(168),%a0
if ( the_thread->real_priority != new_priority )
49cc0: b1c1 cmpal %d1,%a0
49cc2: 6704 beqs 49cc8 <_Scheduler_CBS_Unblock+0x58>
the_thread->real_priority = new_priority;
49cc4: 2548 0018 movel %a0,%a2@(24)
if ( the_thread->current_priority != new_priority )
49cc8: 202a 0014 movel %a2@(20),%d0
49ccc: b1c0 cmpal %d0,%a0
49cce: 6716 beqs 49ce6 <_Scheduler_CBS_Unblock+0x76>
_Thread_Change_priority(the_thread, new_priority, true);
49cd0: 4878 0001 pea 1 <ADD>
49cd4: 2f08 movel %a0,%sp@-
49cd6: 2f0a movel %a2,%sp@-
49cd8: 4eb9 0004 a0c0 jsr 4a0c0 <_Thread_Change_priority>
49cde: 202a 0014 movel %a2@(20),%d0
49ce2: 4fef 000c lea %sp@(12),%sp
* 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 ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
49ce6: 2079 0006 143a moveal 6143a <_Per_CPU_Information+0x12>,%a0
49cec: 2f28 0014 movel %a0@(20),%sp@-
49cf0: 2079 0005 faa0 moveal 5faa0 <_Scheduler+0x30>,%a0
49cf6: 2f00 movel %d0,%sp@-
49cf8: 4e90 jsr %a0@
49cfa: 508f addql #8,%sp
49cfc: 4a80 tstl %d0
49cfe: 6f1a bles 49d1a <_Scheduler_CBS_Unblock+0xaa>
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
49d00: 2079 0006 1436 moveal 61436 <_Per_CPU_Information+0xe>,%a0
* 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 ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
49d06: 23ca 0006 143a movel %a2,6143a <_Per_CPU_Information+0x12>
if ( _Thread_Executing->is_preemptible ||
49d0c: 4a28 0070 tstb %a0@(112)
49d10: 671a beqs 49d2c <_Scheduler_CBS_Unblock+0xbc>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
49d12: 7001 moveq #1,%d0
49d14: 13c0 0006 1434 moveb %d0,61434 <_Per_CPU_Information+0xc>
}
}
49d1a: 242e fff8 movel %fp@(-8),%d2
49d1e: 246e fffc moveal %fp@(-4),%a2
49d22: 4e5e unlk %fp
49d24: 4e75 rts
49d26: 202a 0014 movel %a2@(20),%d0
49d2a: 60ba bras 49ce6 <_Scheduler_CBS_Unblock+0x76>
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
49d2c: 4aaa 0014 tstl %a2@(20)
49d30: 66e8 bnes 49d1a <_Scheduler_CBS_Unblock+0xaa> <== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
49d32: 7001 moveq #1,%d0 <== NOT EXECUTED
49d34: 13c0 0006 1434 moveb %d0,61434 <_Per_CPU_Information+0xc> <== NOT EXECUTED
49d3a: 60de bras 49d1a <_Scheduler_CBS_Unblock+0xaa> <== NOT EXECUTED
00049bc0 <_Scheduler_EDF_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
49bc0: 4e56 0000 linkw %fp,#0
49bc4: 2f0a movel %a2,%sp@-
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
49bc6: 4878 0018 pea 18 <OPER2+0x4>
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
49bca: 246e 0008 moveal %fp@(8),%a2
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
49bce: 4eb9 0004 b55c jsr 4b55c <_Workspace_Allocate>
if ( sched ) {
49bd4: 588f addql #4,%sp
49bd6: 4a80 tstl %d0
49bd8: 670e beqs 49be8 <_Scheduler_EDF_Allocate+0x28> <== NEVER TAKEN
the_thread->scheduler_info = sched;
49bda: 2540 0086 movel %d0,%a2@(134)
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
49bde: 2040 moveal %d0,%a0
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
49be0: 7202 moveq #2,%d1
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
if ( sched ) {
the_thread->scheduler_info = sched;
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
49be2: 208a movel %a2,%a0@
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
49be4: 2141 0014 movel %d1,%a0@(20)
}
return sched;
}
49be8: 246e fffc moveal %fp@(-4),%a2
49bec: 4e5e unlk %fp <== NOT EXECUTED
00049d3c <_Scheduler_EDF_Block>:
#include <rtems/score/thread.h>
void _Scheduler_EDF_Block(
Thread_Control *the_thread
)
{
49d3c: 4e56 0000 linkw %fp,#0
49d40: 2f02 movel %d2,%sp@-
49d42: 242e 0008 movel %fp@(8),%d2
_Scheduler_EDF_Extract( the_thread );
49d46: 2f02 movel %d2,%sp@-
49d48: 4eb9 0004 9dc4 jsr 49dc4 <_Scheduler_EDF_Extract>
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
49d4e: 588f addql #4,%sp
49d50: b4b9 0006 143a cmpl 6143a <_Per_CPU_Information+0x12>,%d2
49d56: 6720 beqs 49d78 <_Scheduler_EDF_Block+0x3c>
_Scheduler_EDF_Schedule();
if ( _Thread_Is_executing( the_thread ) )
49d58: b4b9 0006 1436 cmpl 61436 <_Per_CPU_Information+0xe>,%d2
49d5e: 6708 beqs 49d68 <_Scheduler_EDF_Block+0x2c> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
}
49d60: 242e fffc movel %fp@(-4),%d2
49d64: 4e5e unlk %fp
49d66: 4e75 rts
49d68: 242e fffc movel %fp@(-4),%d2
49d6c: 4e5e unlk %fp
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_EDF_Schedule();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
49d6e: 7001 moveq #1,%d0
49d70: 13c0 0006 1434 moveb %d0,61434 <_Per_CPU_Information+0xc>
}
49d76: 4e75 rts
_Scheduler_EDF_Extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_EDF_Schedule();
49d78: 4eb9 0004 9ea4 jsr 49ea4 <_Scheduler_EDF_Schedule>
if ( _Thread_Is_executing( the_thread ) )
49d7e: b4b9 0006 1436 cmpl 61436 <_Per_CPU_Information+0xe>,%d2
49d84: 66da bnes 49d60 <_Scheduler_EDF_Block+0x24> <== NEVER TAKEN
49d86: 60e0 bras 49d68 <_Scheduler_EDF_Block+0x2c>
00049df0 <_Scheduler_EDF_Free>:
#include <rtems/score/wkspace.h>
void _Scheduler_EDF_Free(
Thread_Control *the_thread
)
{
49df0: 4e56 0000 linkw %fp,#0
49df4: 206e 0008 moveal %fp@(8),%a0
_Workspace_Free( the_thread->scheduler_info );
49df8: 2d68 0086 0008 movel %a0@(134),%fp@(8)
}
49dfe: 4e5e unlk %fp
void _Scheduler_EDF_Free(
Thread_Control *the_thread
)
{
_Workspace_Free( the_thread->scheduler_info );
49e00: 4ef9 0004 b604 jmp 4b604 <_Workspace_Free>
...
00049dc4 <_Scheduler_EDF_Unblock>:
#include <rtems/score/scheduleredf.h>
void _Scheduler_EDF_Unblock(
Thread_Control *the_thread
)
{
49dc4: 4e56 0000 linkw %fp,#0
49dc8: 2f0a movel %a2,%sp@-
49dca: 246e 0008 moveal %fp@(8),%a2
_Scheduler_EDF_Enqueue(the_thread);
49dce: 2f0a movel %a2,%sp@-
49dd0: 4eb9 0004 9c48 jsr 49c48 <_Scheduler_EDF_Enqueue>
49dd6: 2f2a 0014 movel %a2@(20),%sp@-
* 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 ( _Scheduler_Is_priority_lower_than(
49dda: 2079 0006 13ba moveal 613ba <_Per_CPU_Information+0x12>,%a0
49de0: 2f28 0014 movel %a0@(20),%sp@-
49de4: 2079 0005 fa20 moveal 5fa20 <_Scheduler+0x30>,%a0
49dea: 4e90 jsr %a0@
49dec: 4fef 000c lea %sp@(12),%sp
49df0: 4a80 tstl %d0
49df2: 6d08 blts 49dfc <_Scheduler_EDF_Unblock+0x38>
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
}
}
49df4: 246e fffc moveal %fp@(-4),%a2
49df8: 4e5e unlk %fp
49dfa: 4e75 rts
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
49dfc: 2079 0006 13b6 moveal 613b6 <_Per_CPU_Information+0xe>,%a0
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
49e02: 23ca 0006 13ba movel %a2,613ba <_Per_CPU_Information+0x12>
if ( _Thread_Executing->is_preemptible ||
49e08: 4a28 0070 tstb %a0@(112)
49e0c: 6710 beqs 49e1e <_Scheduler_EDF_Unblock+0x5a>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
49e0e: 7001 moveq #1,%d0
49e10: 13c0 0006 13b4 moveb %d0,613b4 <_Per_CPU_Information+0xc>
}
}
49e16: 246e fffc moveal %fp@(-4),%a2
49e1a: 4e5e unlk %fp
49e1c: 4e75 rts
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
49e1e: 4aaa 0014 tstl %a2@(20)
49e22: 66d0 bnes 49df4 <_Scheduler_EDF_Unblock+0x30> <== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
49e24: 7001 moveq #1,%d0 <== NOT EXECUTED
49e26: 13c0 0006 13b4 moveb %d0,613b4 <_Per_CPU_Information+0xc> <== NOT EXECUTED
49e2c: 60e8 bras 49e16 <_Scheduler_EDF_Unblock+0x52> <== NOT EXECUTED
...
00049204 <_Scheduler_Handler_initialization>:
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
void _Scheduler_Handler_initialization(void)
{
49204: 4e56 0000 linkw %fp,#0
(*_Scheduler.Operations.initialize)();
}
49208: 4e5e unlk %fp
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
void _Scheduler_Handler_initialization(void)
{
(*_Scheduler.Operations.initialize)();
4920a: 2279 0005 e224 moveal 5e224 <_Scheduler+0x4>,%a1
49210: 4ed1 jmp %a1@
...
00049230 <_Scheduler_priority_Block>:
#include <rtems/score/thread.h>
void _Scheduler_priority_Block(
Thread_Control *the_thread
)
{
49230: 4e56 0000 linkw %fp,#0
49234: 206e 0008 moveal %fp@(8),%a0
49238: 2f0b movel %a3,%sp@-
4923a: 2f0a movel %a2,%sp@-
)
{
Scheduler_priority_Per_thread *sched_info;
Chain_Control *ready;
sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info;
4923c: 2468 0086 moveal %a0@(134),%a2
ready = sched_info->ready_chain;
49240: 2252 moveal %a2@,%a1
if ( _Chain_Has_only_one_node( ready ) ) {
49242: 2029 0008 movel %a1@(8),%d0
49246: b091 cmpl %a1@,%d0
49248: 6700 0088 beqw 492d2 <_Scheduler_priority_Block+0xa2>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
4924c: 2450 moveal %a0@,%a2
previous = the_node->previous;
4924e: 2268 0004 moveal %a0@(4),%a1
next->previous = previous;
49252: 2549 0004 movel %a1,%a2@(4)
previous->next = next;
49256: 228a movel %a2,%a1@
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
49258: b1f9 0005 fb82 cmpal 5fb82 <_Per_CPU_Information+0x12>,%a0
4925e: 6720 beqs 49280 <_Scheduler_priority_Block+0x50>
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
49260: b1f9 0005 fb7e cmpal 5fb7e <_Per_CPU_Information+0xe>,%a0
49266: 6708 beqs 49270 <_Scheduler_priority_Block+0x40>
_Thread_Dispatch_necessary = true;
}
49268: 245f moveal %sp@+,%a2
4926a: 265f moveal %sp@+,%a3
4926c: 4e5e unlk %fp
4926e: 4e75 rts
49270: 245f moveal %sp@+,%a2
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
49272: 7001 moveq #1,%d0
}
49274: 265f moveal %sp@+,%a3
49276: 4e5e unlk %fp
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
49278: 13c0 0005 fb7c moveb %d0,5fb7c <_Per_CPU_Information+0xc>
}
4927e: 4e75 rts
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
49280: 3039 0005 fb94 movew 5fb94 <_Priority_Major_bit_map>,%d0
49286: 4840 swap %d0
49288: 04c0 ff1 %d0
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
4928a: 43f9 0005 fb98 lea 5fb98 <_Priority_Bit_map>,%a1
49290: 0280 0000 ffff andil #65535,%d0
49296: 3231 0a00 movew %a1@(00000000,%d0:l:2),%d1
4929a: 4841 swap %d1
4929c: 04c1 ff1 %d1
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
4929e: 2279 0005 e220 moveal 5e220 <_Scheduler>,%a1
return (_Priority_Bits_index( major ) << 4) +
492a4: 0281 0000 ffff andil #65535,%d1
492aa: e988 lsll #4,%d0
492ac: d081 addl %d1,%d0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
492ae: 2200 movel %d0,%d1
492b0: e988 lsll #4,%d0
492b2: e589 lsll #2,%d1
492b4: 9081 subl %d1,%d0
492b6: d3c0 addal %d0,%a1
492b8: 2019 movel %a1@+,%d0
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
492ba: b3c0 cmpal %d0,%a1
492bc: 56c1 sne %d1
492be: 49c1 extbl %d1
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
492c0: c081 andl %d1,%d0
492c2: 23c0 0005 fb82 movel %d0,5fb82 <_Per_CPU_Information+0x12>
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
492c8: b1f9 0005 fb7e cmpal 5fb7e <_Per_CPU_Information+0xe>,%a0
492ce: 6698 bnes 49268 <_Scheduler_priority_Block+0x38>
492d0: 609e bras 49270 <_Scheduler_priority_Block+0x40>
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
492d2: 266a 0004 moveal %a2@(4),%a3
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
492d6: 2209 movel %a1,%d1
492d8: 5881 addql #4,%d1
492da: 2281 movel %d1,%a1@
492dc: 3013 movew %a3@,%d0
492de: 322a 000e movew %a2@(14),%d1
head->next = tail;
head->previous = NULL;
492e2: 42a9 0004 clrl %a1@(4)
492e6: c081 andl %d1,%d0
tail->previous = head;
492e8: 2349 0008 movel %a1,%a1@(8)
492ec: 3680 movew %d0,%a3@
if ( *the_priority_map->minor == 0 )
492ee: 6600 ff68 bnew 49258 <_Scheduler_priority_Block+0x28>
_Priority_Major_bit_map &= the_priority_map->block_major;
492f2: 3239 0005 fb94 movew 5fb94 <_Priority_Major_bit_map>,%d1
492f8: 302a 000c movew %a2@(12),%d0
492fc: c081 andl %d1,%d0
492fe: 33c0 0005 fb94 movew %d0,5fb94 <_Priority_Major_bit_map>
{
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
49304: b1f9 0005 fb82 cmpal 5fb82 <_Per_CPU_Information+0x12>,%a0
4930a: 6600 ff54 bnew 49260 <_Scheduler_priority_Block+0x30>
4930e: 6000 ff70 braw 49280 <_Scheduler_priority_Block+0x50>
...
00049408 <_Scheduler_priority_Free>:
#include <rtems/score/wkspace.h>
void _Scheduler_priority_Free (
Thread_Control *the_thread
)
{
49408: 4e56 0000 linkw %fp,#0
4940c: 206e 0008 moveal %fp@(8),%a0
_Workspace_Free( the_thread->scheduler_info );
49410: 2d68 0086 0008 movel %a0@(134),%fp@(8)
}
49416: 4e5e unlk %fp
void _Scheduler_priority_Free (
Thread_Control *the_thread
)
{
_Workspace_Free( the_thread->scheduler_info );
49418: 4ef9 0004 ac10 jmp 4ac10 <_Workspace_Free>
...
00049c1c <_Scheduler_simple_Block>:
#include <rtems/score/schedulersimple.h>
void _Scheduler_simple_Block(
Thread_Control *the_thread
)
{
49c1c: 4e56 0000 linkw %fp,#0
49c20: 2f02 movel %d2,%sp@-
49c22: 242e 0008 movel %fp@(8),%d2
_Scheduler_simple_Extract(the_thread);
49c26: 2f02 movel %d2,%sp@-
49c28: 4eb9 0004 9c80 jsr 49c80 <_Scheduler_simple_Extract>
if ( _Thread_Is_heir( the_thread ) )
49c2e: 588f addql #4,%sp
49c30: b4b9 0006 0aca cmpl 60aca <_Per_CPU_Information+0x12>,%d2
49c36: 6720 beqs 49c58 <_Scheduler_simple_Block+0x3c>
_Scheduler_simple_Schedule();
if ( _Thread_Is_executing( the_thread ) )
49c38: b4b9 0006 0ac6 cmpl 60ac6 <_Per_CPU_Information+0xe>,%d2
49c3e: 6708 beqs 49c48 <_Scheduler_simple_Block+0x2c> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
}
49c40: 242e fffc movel %fp@(-4),%d2
49c44: 4e5e unlk %fp
49c46: 4e75 rts
49c48: 242e fffc movel %fp@(-4),%d2
49c4c: 4e5e unlk %fp
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_simple_Schedule();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
49c4e: 7001 moveq #1,%d0
49c50: 13c0 0006 0ac4 moveb %d0,60ac4 <_Per_CPU_Information+0xc>
}
49c56: 4e75 rts
)
{
_Scheduler_simple_Extract(the_thread);
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_simple_Schedule();
49c58: 4eb9 0004 9d7c jsr 49d7c <_Scheduler_simple_Schedule>
if ( _Thread_Is_executing( the_thread ) )
49c5e: b4b9 0006 0ac6 cmpl 60ac6 <_Per_CPU_Information+0xe>,%d2
49c64: 66da bnes 49c40 <_Scheduler_simple_Block+0x24> <== NEVER TAKEN
49c66: 60e0 bras 49c48 <_Scheduler_simple_Block+0x2c>
00049bfc <_TOD_Set_with_timestamp>:
#include <rtems/score/watchdog.h>
void _TOD_Set_with_timestamp(
const Timestamp_Control *tod
)
{
49bfc: 4e56 ffec linkw %fp,#-20
49c00: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
49c04: 246e 0008 moveal %fp@(8),%a2
static inline uint32_t _Timestamp64_implementation_Get_seconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time / 1000000000L);
49c08: 47f9 0005 c83c lea 5c83c <__divdi3>,%a3
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
}
49c0e: 2412 movel %a2@,%d2
49c10: 262a 0004 movel %a2@(4),%d3
static inline uint32_t _Timestamp64_implementation_Get_nanoseconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time % 1000000000L);
49c14: 2f3c 3b9a ca00 movel #1000000000,%sp@-
49c1a: 42a7 clrl %sp@-
49c1c: 2f03 movel %d3,%sp@-
49c1e: 2f02 movel %d2,%sp@-
49c20: 4eb9 0005 cc9c jsr 5cc9c <__moddi3>
49c26: 4fef 0010 lea %sp@(16),%sp
49c2a: 2801 movel %d1,%d4
static inline uint32_t _Timestamp64_implementation_Get_seconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time / 1000000000L);
49c2c: 2f3c 3b9a ca00 movel #1000000000,%sp@-
49c32: 42a7 clrl %sp@-
49c34: 2f03 movel %d3,%sp@-
49c36: 2f02 movel %d2,%sp@-
49c38: 4e93 jsr %a3@
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
49c3a: 2039 0006 24a6 movel 624a6 <_Thread_Dispatch_disable_level>,%d0
++level;
49c40: 5280 addql #1,%d0
49c42: 4fef 0010 lea %sp@(16),%sp
49c46: 2401 movel %d1,%d2
_Thread_Dispatch_disable_level = level;
49c48: 23c0 0006 24a6 movel %d0,624a6 <_Thread_Dispatch_disable_level>
49c4e: 2f3c 3b9a ca00 movel #1000000000,%sp@-
49c54: 42a7 clrl %sp@-
49c56: 2f39 0006 244c movel 6244c <_TOD+0x4>,%sp@-
49c5c: 2f39 0006 2448 movel 62448 <_TOD>,%sp@-
49c62: 4e93 jsr %a3@
49c64: 4fef 0010 lea %sp@(16),%sp
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds_now = _TOD_Seconds_since_epoch();
if ( seconds_next < seconds_now )
49c68: b282 cmpl %d2,%d1
49c6a: 6244 bhis 49cb0 <_TOD_Set_with_timestamp+0xb4>
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
_Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
49c6c: 9481 subl %d1,%d2
49c6e: 2f02 movel %d2,%sp@-
49c70: 42a7 clrl %sp@-
49c72: 4879 0006 2536 pea 62536 <_Watchdog_Seconds_chain>
49c78: 4eb9 0004 c28c jsr 4c28c <_Watchdog_Adjust>
49c7e: 4fef 000c lea %sp@(12),%sp
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds_now - seconds_next );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
49c82: 2012 movel %a2@,%d0
49c84: 222a 0004 movel %a2@(4),%d1
_TOD.seconds_trigger = nanoseconds;
49c88: 23c4 0006 2458 movel %d4,62458 <_TOD+0x10>
if ( seconds_next < seconds_now )
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds_now - seconds_next );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
49c8e: 23c0 0006 2448 movel %d0,62448 <_TOD>
49c94: 23c1 0006 244c movel %d1,6244c <_TOD+0x4>
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
}
49c9a: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
49ca0: 7201 moveq #1,%d1
_TOD_Activate();
_Thread_Enable_dispatch();
}
49ca2: 4e5e unlk %fp
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
49ca4: 13c1 0006 245c moveb %d1,6245c <_TOD+0x14>
_TOD_Activate();
_Thread_Enable_dispatch();
49caa: 4ef9 0004 b54c jmp 4b54c <_Thread_Enable_dispatch>
49cb0: 9282 subl %d2,%d1
49cb2: 2f01 movel %d1,%sp@-
49cb4: 4878 0001 pea 1 <ADD>
49cb8: 4879 0006 2536 pea 62536 <_Watchdog_Seconds_chain>
49cbe: 4eb9 0004 c28c jsr 4c28c <_Watchdog_Adjust>
49cc4: 4fef 000c lea %sp@(12),%sp
if ( seconds_next < seconds_now )
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds_now - seconds_next );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
49cc8: 2012 movel %a2@,%d0
49cca: 222a 0004 movel %a2@(4),%d1
_TOD.seconds_trigger = nanoseconds;
49cce: 23c4 0006 2458 movel %d4,62458 <_TOD+0x10>
if ( seconds_next < seconds_now )
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds_now - seconds_next );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
49cd4: 23c0 0006 2448 movel %d0,62448 <_TOD>
49cda: 23c1 0006 244c movel %d1,6244c <_TOD+0x4>
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
}
49ce0: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
49ce6: 7201 moveq #1,%d1
_TOD_Activate();
_Thread_Enable_dispatch();
}
49ce8: 4e5e unlk %fp
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
_TOD.now = *tod;
_TOD.seconds_trigger = nanoseconds;
_TOD.is_set = true;
49cea: 13c1 0006 245c moveb %d1,6245c <_TOD+0x14>
_TOD_Activate();
_Thread_Enable_dispatch();
49cf0: 4ef9 0004 b54c jmp 4b54c <_Thread_Enable_dispatch>
...
00048218 <_TOD_Validate>:
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
48218: 43f9 0005 e70e lea 5e70e <Configuration+0xc>,%a1
};
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
4821e: 4e56 0000 linkw %fp,#0
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
48222: 203c 000f 4240 movel #1000000,%d0
};
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
48228: 206e 0008 moveal %fp@(8),%a0
4822c: 2f02 movel %d2,%sp@-
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
4822e: 4c51 0000 remul %a1@,%d0,%d0
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
48232: 4a88 tstl %a0
48234: 6758 beqs 4828e <_TOD_Validate+0x76> <== NEVER TAKEN
48236: b0a8 0018 cmpl %a0@(24),%d0
4823a: 6352 blss 4828e <_TOD_Validate+0x76>
(the_tod->ticks >= ticks_per_second) ||
4823c: 703b moveq #59,%d0
4823e: b0a8 0014 cmpl %a0@(20),%d0
48242: 654a bcss 4828e <_TOD_Validate+0x76>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
48244: b0a8 0010 cmpl %a0@(16),%d0
48248: 6544 bcss 4828e <_TOD_Validate+0x76>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
4824a: 7217 moveq #23,%d1
4824c: b2a8 000c cmpl %a0@(12),%d1
48250: 653c bcss 4828e <_TOD_Validate+0x76>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
48252: 2028 0004 movel %a0@(4),%d0
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
48256: 6736 beqs 4828e <_TOD_Validate+0x76> <== NEVER TAKEN
(the_tod->month == 0) ||
48258: 740c moveq #12,%d2
4825a: b480 cmpl %d0,%d2
4825c: 6530 bcss 4828e <_TOD_Validate+0x76>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
4825e: 2210 movel %a0@,%d1
(the_tod->ticks >= ticks_per_second) ||
(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) ||
48260: 0c81 0000 07c3 cmpil #1987,%d1
48266: 6326 blss 4828e <_TOD_Validate+0x76>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
48268: 2068 0008 moveal %a0@(8),%a0
(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) ||
4826c: 4a88 tstl %a0
4826e: 671e beqs 4828e <_TOD_Validate+0x76> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
48270: 143c 0003 moveb #3,%d2
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
48274: 43f9 0005 fa98 lea 5fa98 <_TOD_Days_per_month>,%a1
(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 )
4827a: c282 andl %d2,%d1
4827c: 6618 bnes 48296 <_TOD_Validate+0x7e>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
4827e: 2031 0c34 movel %a1@(00000034,%d0:l:4),%d0
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
if ( the_tod->day > days_in_month )
48282: b1c0 cmpal %d0,%a0
48284: 53c0 sls %d0
48286: 4480 negl %d0
return false;
return true;
}
48288: 241f movel %sp@+,%d2
4828a: 4e5e unlk %fp
4828c: 4e75 rts
4828e: 241f movel %sp@+,%d2
48290: 4e5e unlk %fp
(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) )
return false;
48292: 4200 clrb %d0
if ( the_tod->day > days_in_month )
return false;
return true;
}
48294: 4e75 rts
return false;
if ( (the_tod->year % 4) == 0 )
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
48296: 2031 0c00 movel %a1@(00000000,%d0:l:4),%d0
if ( the_tod->day > days_in_month )
4829a: b1c0 cmpal %d0,%a0
4829c: 53c0 sls %d0
4829e: 4480 negl %d0
482a0: 60e6 bras 48288 <_TOD_Validate+0x70>
...
00049760 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
49760: 4e56 fff0 linkw %fp,#-16
49764: 48d7 041c moveml %d2-%d4/%a2,%sp@
49768: 246e 0008 moveal %fp@(8),%a2
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
4976c: 262a 0010 movel %a2@(16),%d3
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
49770: 242e 000c movel %fp@(12),%d2
/*
* 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 );
49774: 2f0a movel %a2,%sp@-
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
49776: 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 );
4977a: 4eb9 0004 a58c jsr 4a58c <_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 )
49780: 588f addql #4,%sp
49782: b4aa 0014 cmpl %a2@(20),%d2
49786: 670c beqs 49794 <_Thread_Change_priority+0x34>
_Thread_Set_priority( the_thread, new_priority );
49788: 2f02 movel %d2,%sp@-
4978a: 2f0a movel %a2,%sp@-
4978c: 4eb9 0004 a528 jsr 4a528 <_Thread_Set_priority>
49792: 508f addql #8,%sp
_ISR_Disable( level );
49794: 203c 0000 0700 movel #1792,%d0
4979a: 40c2 movew %sr,%d2
4979c: 8082 orl %d2,%d0
4979e: 46c0 movew %d0,%sr
/*
* 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;
497a0: 202a 0010 movel %a2@(16),%d0
if ( state != STATES_TRANSIENT ) {
497a4: 7204 moveq #4,%d1
497a6: b280 cmpl %d0,%d1
497a8: 6738 beqs 497e2 <_Thread_Change_priority+0x82>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
497aa: 44c3 movew %d3,%ccr
497ac: 6708 beqs 497b6 <_Thread_Change_priority+0x56> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
497ae: 72fb moveq #-5,%d1
497b0: c280 andl %d0,%d1
497b2: 2541 0010 movel %d1,%a2@(16)
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
497b6: 46c2 movew %d2,%sr
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
497b8: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( state ) ) {
497be: 660a bnes 497ca <_Thread_Change_priority+0x6a>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
497c0: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
497c6: 4e5e unlk %fp
497c8: 4e75 rts
/* 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 );
497ca: 2d4a 000c movel %a2,%fp@(12)
497ce: 2d6a 0044 0008 movel %a2@(68),%fp@(8)
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
497d4: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
497da: 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 );
497dc: 4ef9 0004 a478 jmp 4a478 <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
497e2: 44c3 movew %d3,%ccr
497e4: 6714 beqs 497fa <_Thread_Change_priority+0x9a> <== NEVER TAKEN
* 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 );
497e6: 42aa 0010 clrl %a2@(16)
if ( prepend_it )
497ea: 4a04 tstb %d4
497ec: 6748 beqs 49836 <_Thread_Change_priority+0xd6>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
497ee: 2f0a movel %a2,%sp@-
497f0: 2079 0005 e248 moveal 5e248 <_Scheduler+0x28>,%a0
497f6: 4e90 jsr %a0@
497f8: 588f addql #4,%sp
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
497fa: 203c 0000 0700 movel #1792,%d0
49800: 46c2 movew %d2,%sr
49802: 8082 orl %d2,%d0
49804: 46c0 movew %d0,%sr
* This kernel routine implements the scheduling decision logic for
* the scheduler. It does NOT dispatch.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( void )
{
_Scheduler.Operations.schedule();
49806: 2079 0005 e228 moveal 5e228 <_Scheduler+0x8>,%a0
4980c: 4e90 jsr %a0@
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
4980e: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule();
if ( !_Thread_Is_executing_also_the_heir() &&
49814: b1f9 0005 fb82 cmpal 5fb82 <_Per_CPU_Information+0x12>,%a0
4981a: 670e beqs 4982a <_Thread_Change_priority+0xca>
4981c: 4a28 0070 tstb %a0@(112)
49820: 6708 beqs 4982a <_Thread_Change_priority+0xca>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
49822: 7001 moveq #1,%d0
49824: 13c0 0005 fb7c moveb %d0,5fb7c <_Per_CPU_Information+0xc>
_ISR_Enable( level );
4982a: 46c2 movew %d2,%sr
}
4982c: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
49832: 4e5e unlk %fp
49834: 4e75 rts
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
49836: 2f0a movel %a2,%sp@-
49838: 2079 0005 e244 moveal 5e244 <_Scheduler+0x24>,%a0
4983e: 4e90 jsr %a0@
49840: 588f addql #4,%sp
49842: 60b6 bras 497fa <_Thread_Change_priority+0x9a>
000498a0 <_Thread_Close>:
void _Thread_Close(
Objects_Information *information,
Thread_Control *the_thread
)
{
498a0: 4e56 0000 linkw %fp,#0
498a4: 2f0b movel %a3,%sp@-
498a6: 266e 0008 moveal %fp@(8),%a3
498aa: 2f0a movel %a2,%sp@-
498ac: 246e 000c moveal %fp@(12),%a2
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
498b0: 202a 0008 movel %a2@(8),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
498b4: 206b 0018 moveal %a3@(24),%a0
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
498b8: 0280 0000 ffff andil #65535,%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
498be: 42b0 0c00 clrl %a0@(00000000,%d0:l:4)
return ctx.ok;
}
static inline void _User_extensions_Thread_delete( Thread_Control *deleted )
{
_User_extensions_Iterate(
498c2: 4879 0004 a710 pea 4a710 <_User_extensions_Thread_delete_visitor>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
498c8: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
--level;
498ce: 5380 subql #1,%d0
498d0: 2f0a movel %a2,%sp@-
_Thread_Dispatch_disable_level = level;
498d2: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
498d8: 4eb9 0004 a7b8 jsr 4a7b8 <_User_extensions_Iterate>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
498de: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
++level;
498e4: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
498e6: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
/*
* Now we are in a dispatching critical section again and we
* can take the thread OUT of the published set. It is invalid
* to use this thread's Id OR name after this call.
*/
_Objects_Close( information, &the_thread->Object );
498ec: 2f0a movel %a2,%sp@-
498ee: 2f0b movel %a3,%sp@-
498f0: 4eb9 0004 8a74 jsr 48a74 <_Objects_Close>
/*
* By setting the dormant state, the thread will not be considered
* for scheduling when we remove any blocking states.
*/
_Thread_Set_state( the_thread, STATES_DORMANT );
498f6: 4878 0001 pea 1 <ADD>
498fa: 2f0a movel %a2,%sp@-
498fc: 4eb9 0004 a540 jsr 4a540 <_Thread_Set_state>
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
49902: 2f0a movel %a2,%sp@-
49904: 4eb9 0004 a384 jsr 4a384 <_Thread_queue_Extract_with_proxy>
4990a: 4fef 001c lea %sp@(28),%sp
4990e: 4a00 tstb %d0
49910: 660a bnes 4991c <_Thread_Close+0x7c>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
49912: 7002 moveq #2,%d0
49914: b0aa 0050 cmpl %a2@(80),%d0
49918: 6700 0088 beqw 499a2 <_Thread_Close+0x102>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Free(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.free( the_thread );
4991c: 2f0a movel %a2,%sp@-
4991e: 2079 0005 e23c moveal 5e23c <_Scheduler+0x1c>,%a0
49924: 4e90 jsr %a0@
/*
* The thread might have been FP. So deal with that.
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( _Thread_Is_allocated_fp( the_thread ) )
49926: 588f addql #4,%sp
49928: b5f9 0005 fa72 cmpal 5fa72 <_Thread_Allocated_fp>,%a2
4992e: 6736 beqs 49966 <_Thread_Close+0xc6>
_Thread_Deallocate_fp();
#endif
the_thread->fp_context = NULL;
_Workspace_Free( the_thread->Start.fp_context );
49930: 2f2a 00b4 movel %a2@(180),%sp@-
49934: 47f9 0004 ac10 lea 4ac10 <_Workspace_Free>,%a3
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( _Thread_Is_allocated_fp( the_thread ) )
_Thread_Deallocate_fp();
#endif
the_thread->fp_context = NULL;
4993a: 42aa 00f0 clrl %a2@(240)
_Workspace_Free( the_thread->Start.fp_context );
4993e: 4e93 jsr %a3@
/*
* Free the rest of the memory associated with this task
* and set the associated pointers to NULL for safety.
*/
_Thread_Stack_Free( the_thread );
49940: 2f0a movel %a2,%sp@-
49942: 4eb9 0004 a610 jsr 4a610 <_Thread_Stack_Free>
the_thread->Start.stack = NULL;
_Workspace_Free( the_thread->extensions );
49948: 2f2a 0100 movel %a2@(256),%sp@-
/*
* Free the rest of the memory associated with this task
* and set the associated pointers to NULL for safety.
*/
_Thread_Stack_Free( the_thread );
the_thread->Start.stack = NULL;
4994c: 42aa 00b8 clrl %a2@(184)
_Workspace_Free( the_thread->extensions );
49950: 4e93 jsr %a3@
the_thread->extensions = NULL;
}
49952: 266e fffc moveal %fp@(-4),%a3
*/
_Thread_Stack_Free( the_thread );
the_thread->Start.stack = NULL;
_Workspace_Free( the_thread->extensions );
the_thread->extensions = NULL;
49956: 4fef 000c lea %sp@(12),%sp
4995a: 42aa 0100 clrl %a2@(256)
}
4995e: 246e fff8 moveal %fp@(-8),%a2
49962: 4e5e unlk %fp
49964: 4e75 rts
if ( _Thread_Is_allocated_fp( the_thread ) )
_Thread_Deallocate_fp();
#endif
the_thread->fp_context = NULL;
_Workspace_Free( the_thread->Start.fp_context );
49966: 2f2a 00b4 movel %a2@(180),%sp@-
4996a: 47f9 0004 ac10 lea 4ac10 <_Workspace_Free>,%a3
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( _Thread_Is_allocated_fp( the_thread ) )
_Thread_Deallocate_fp();
#endif
the_thread->fp_context = NULL;
49970: 42aa 00f0 clrl %a2@(240)
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE void _Thread_Deallocate_fp( void )
{
_Thread_Allocated_fp = NULL;
49974: 42b9 0005 fa72 clrl 5fa72 <_Thread_Allocated_fp>
_Workspace_Free( the_thread->Start.fp_context );
4997a: 4e93 jsr %a3@
/*
* Free the rest of the memory associated with this task
* and set the associated pointers to NULL for safety.
*/
_Thread_Stack_Free( the_thread );
4997c: 2f0a movel %a2,%sp@-
4997e: 4eb9 0004 a610 jsr 4a610 <_Thread_Stack_Free>
the_thread->Start.stack = NULL;
_Workspace_Free( the_thread->extensions );
49984: 2f2a 0100 movel %a2@(256),%sp@-
/*
* Free the rest of the memory associated with this task
* and set the associated pointers to NULL for safety.
*/
_Thread_Stack_Free( the_thread );
the_thread->Start.stack = NULL;
49988: 42aa 00b8 clrl %a2@(184)
_Workspace_Free( the_thread->extensions );
4998c: 4e93 jsr %a3@
the_thread->extensions = NULL;
}
4998e: 266e fffc moveal %fp@(-4),%a3
*/
_Thread_Stack_Free( the_thread );
the_thread->Start.stack = NULL;
_Workspace_Free( the_thread->extensions );
the_thread->extensions = NULL;
49992: 4fef 000c lea %sp@(12),%sp
49996: 42aa 0100 clrl %a2@(256)
}
4999a: 246e fff8 moveal %fp@(-8),%a2
4999e: 4e5e unlk %fp
499a0: 4e75 rts
*/
_Thread_Set_state( the_thread, STATES_DORMANT );
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
499a2: 486a 0048 pea %a2@(72)
499a6: 4eb9 0004 a9d4 jsr 4a9d4 <_Watchdog_Remove>
499ac: 588f addql #4,%sp
499ae: 2079 0005 e23c moveal 5e23c <_Scheduler+0x1c>,%a0
499b4: 2f0a movel %a2,%sp@-
499b6: 4e90 jsr %a0@
/*
* The thread might have been FP. So deal with that.
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( _Thread_Is_allocated_fp( the_thread ) )
499b8: 588f addql #4,%sp
499ba: b5f9 0005 fa72 cmpal 5fa72 <_Thread_Allocated_fp>,%a2
499c0: 6600 ff6e bnew 49930 <_Thread_Close+0x90>
499c4: 60a0 bras 49966 <_Thread_Close+0xc6> <== NOT EXECUTED
...
00049a74 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
49a74: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
49a78: 486e fffc pea %fp@(-4)
49a7c: 2f2e 0008 movel %fp@(8),%sp@-
49a80: 4eb9 0004 9c64 jsr 49c64 <_Thread_Get>
switch ( location ) {
49a86: 508f addql #8,%sp
49a88: 4aae fffc tstl %fp@(-4)
49a8c: 661e bnes 49aac <_Thread_Delay_ended+0x38> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
49a8e: 2f3c 1000 0018 movel #268435480,%sp@-
49a94: 2f00 movel %d0,%sp@-
49a96: 4eb9 0004 9844 jsr 49844 <_Thread_Clear_state>
49a9c: 508f addql #8,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
49a9e: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
--level;
49aa4: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
49aa6: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
49aac: 4e5e unlk %fp <== NOT EXECUTED
00049ab0 <_Thread_Dispatch>:
#if defined(RTEMS_SMP)
#include <rtems/score/smp.h>
#endif
void _Thread_Dispatch( void )
{
49ab0: 4e56 ffd0 linkw %fp,#-48
49ab4: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
49ab8: 283c 0000 0700 movel #1792,%d4
49abe: 2004 movel %d4,%d0
#endif
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
49ac0: 2479 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a2
_ISR_Disable( level );
49ac6: 40c1 movew %sr,%d1
49ac8: 8081 orl %d1,%d0
49aca: 46c0 movew %d0,%sr
while ( _Thread_Dispatch_necessary == true ) {
49acc: 1039 0005 fb7c moveb 5fb7c <_Per_CPU_Information+0xc>,%d0
49ad2: 6700 012e beqw 49c02 <_Thread_Dispatch+0x152>
* This routine sets thread dispatch level to the
* value passed in.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_set_disable_level(uint32_t value)
{
_Thread_Dispatch_disable_level = value;
49ad6: 7001 moveq #1,%d0
heir = _Thread_Heir;
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
49ad8: 4207 clrb %d7
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
49ada: 2679 0005 fb82 moveal 5fb82 <_Per_CPU_Information+0x12>,%a3
49ae0: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
49ae6: 13c7 0005 fb7c moveb %d7,5fb7c <_Per_CPU_Information+0xc>
_Thread_Executing = heir;
49aec: 23cb 0005 fb7e movel %a3,5fb7e <_Per_CPU_Information+0xe>
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
49af2: b7ca cmpal %a2,%a3
49af4: 6700 010c beqw 49c02 <_Thread_Dispatch+0x152>
49af8: 2a0e movel %fp,%d5
49afa: 5185 subql #8,%d5
49afc: 4bf9 0004 843c lea 4843c <_TOD_Get_with_nanoseconds>,%a5
#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 );
49b02: 2c3c 0004 adc8 movel #306632,%d6
*/
#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 )
49b08: 7001 moveq #1,%d0
49b0a: b0ab 0076 cmpl %a3@(118),%d0
49b0e: 6700 0126 beqw 49c36 <_Thread_Dispatch+0x186>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
_ISR_Enable( level );
49b12: 46c1 movew %d1,%sr
*/
static inline void _TOD_Get_uptime(
Timestamp_Control *time
)
{
_TOD_Get_with_nanoseconds( time, &_TOD.uptime );
49b14: 4879 0005 f9b0 pea 5f9b0 <_TOD+0x8>
49b1a: 2f05 movel %d5,%sp@-
49b1c: 4e95 jsr %a5@
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
49b1e: 2079 0005 fa76 moveal 5fa76 <_Thread_libc_reent>,%a0
49b24: 508f addql #8,%sp
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
_Timestamp_Subtract(
49b26: 202e fff8 movel %fp@(-8),%d0
49b2a: 222e fffc movel %fp@(-4),%d1
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
49b2e: 2400 movel %d0,%d2
49b30: 2601 movel %d1,%d3
49b32: 2e39 0005 fb8a movel 5fb8a <_Per_CPU_Information+0x1a>,%d7
49b38: 96b9 0005 fb8e subl 5fb8e <_Per_CPU_Information+0x1e>,%d3
49b3e: 9587 subxl %d7,%d2
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
49b40: d7aa 0082 addl %d3,%a2@(130)
49b44: 2e2a 007e movel %a2@(126),%d7
49b48: df82 addxl %d2,%d7
49b4a: 2547 007e movel %d7,%a2@(126)
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
49b4e: 23c0 0005 fb8a movel %d0,5fb8a <_Per_CPU_Information+0x1a>
49b54: 23c1 0005 fb8e movel %d1,5fb8e <_Per_CPU_Information+0x1e>
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
49b5a: 4a88 tstl %a0
49b5c: 6708 beqs 49b66 <_Thread_Dispatch+0xb6> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
49b5e: 2550 00f4 movel %a0@,%a2@(244)
*_Thread_libc_reent = heir->libc_reent;
49b62: 20ab 00f4 movel %a3@(244),%a0@
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
49b66: 2879 0005 e348 moveal 5e348 <_User_extensions_Switches_list>,%a4
{
const Chain_Control *chain = &_User_extensions_Switches_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
49b6c: b9fc 0005 e34c cmpal #385868,%a4
49b72: 6716 beqs 49b8a <_Thread_Dispatch+0xda> <== NEVER TAKEN
const User_extensions_Switch_control *extension =
(const User_extensions_Switch_control *) node;
(*extension->thread_switch)( executing, heir );
49b74: 2f0b movel %a3,%sp@-
49b76: 2f0a movel %a2,%sp@-
49b78: 206c 0008 moveal %a4@(8),%a0
49b7c: 4e90 jsr %a0@
#ifdef RTEMS_SMP
_Thread_Unnest_dispatch();
#endif
_API_extensions_Run_post_switch( executing );
}
49b7e: 2854 moveal %a4@,%a4
{
const Chain_Control *chain = &_User_extensions_Switches_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
49b80: 508f addql #8,%sp
49b82: b9fc 0005 e34c cmpal #385868,%a4
49b88: 66ea bnes 49b74 <_Thread_Dispatch+0xc4>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
49b8a: 486b 00bc pea %a3@(188)
49b8e: 486a 00bc pea %a2@(188)
49b92: 4eb9 0004 ac60 jsr 4ac60 <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
49b98: 508f addql #8,%sp
49b9a: 4aaa 00f0 tstl %a2@(240)
49b9e: 672a beqs 49bca <_Thread_Dispatch+0x11a>
#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 );
49ba0: 2079 0005 fa72 moveal 5fa72 <_Thread_Allocated_fp>,%a0
49ba6: b1ca cmpal %a2,%a0
49ba8: 6720 beqs 49bca <_Thread_Dispatch+0x11a>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
49baa: 4a88 tstl %a0
49bac: 670c beqs 49bba <_Thread_Dispatch+0x10a>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
49bae: 4868 00f0 pea %a0@(240)
49bb2: 4eb9 0004 ad90 jsr 4ad90 <_CPU_Context_save_fp>
49bb8: 588f addql #4,%sp
_Context_Restore_fp( &executing->fp_context );
49bba: 486a 00f0 pea %a2@(240)
49bbe: 2046 moveal %d6,%a0
49bc0: 4e90 jsr %a0@
_Thread_Allocated_fp = executing;
49bc2: 588f addql #4,%sp
49bc4: 23ca 0005 fa72 movel %a2,5fa72 <_Thread_Allocated_fp>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
49bca: 2479 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a2
_ISR_Disable( level );
49bd0: 2004 movel %d4,%d0
49bd2: 40c1 movew %sr,%d1
49bd4: 8081 orl %d1,%d0
49bd6: 46c0 movew %d0,%sr
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
49bd8: 1039 0005 fb7c moveb 5fb7c <_Per_CPU_Information+0xc>,%d0
49bde: 6722 beqs 49c02 <_Thread_Dispatch+0x152>
* This routine sets thread dispatch level to the
* value passed in.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_set_disable_level(uint32_t value)
{
_Thread_Dispatch_disable_level = value;
49be0: 7001 moveq #1,%d0
heir = _Thread_Heir;
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
49be2: 4207 clrb %d7
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
49be4: 2679 0005 fb82 moveal 5fb82 <_Per_CPU_Information+0x12>,%a3
49bea: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
49bf0: 13c7 0005 fb7c moveb %d7,5fb7c <_Per_CPU_Information+0xc>
_Thread_Executing = heir;
49bf6: 23cb 0005 fb7e movel %a3,5fb7e <_Per_CPU_Information+0xe>
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
49bfc: b5cb cmpal %a3,%a2
49bfe: 6600 ff08 bnew 49b08 <_Thread_Dispatch+0x58>
49c02: 42b9 0005 fa06 clrl 5fa06 <_Thread_Dispatch_disable_level>
post_switch:
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 0 );
#endif
_ISR_Enable( level );
49c08: 46c1 movew %d1,%sr
49c0a: 2679 0005 fa7a moveal 5fa7a <_API_extensions_Post_switch_list>,%a3
{
const Chain_Control *chain = &_API_extensions_Post_switch_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
49c10: b7fc 0005 fa7e cmpal #391806,%a3
49c16: 6714 beqs 49c2c <_Thread_Dispatch+0x17c>
const API_extensions_Post_switch_control *post_switch =
(const API_extensions_Post_switch_control *) node;
(*post_switch->hook)( executing );
49c18: 2f0a movel %a2,%sp@-
49c1a: 206b 0008 moveal %a3@(8),%a0
49c1e: 4e90 jsr %a0@
#ifdef RTEMS_SMP
_Thread_Unnest_dispatch();
#endif
_API_extensions_Run_post_switch( executing );
}
49c20: 2653 moveal %a3@,%a3
{
const Chain_Control *chain = &_API_extensions_Post_switch_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
49c22: 588f addql #4,%sp
49c24: b7fc 0005 fa7e cmpal #391806,%a3
49c2a: 66ec bnes 49c18 <_Thread_Dispatch+0x168> <== NEVER TAKEN
49c2c: 4cee 3cfc ffd0 moveml %fp@(-48),%d2-%d7/%a2-%a5
49c32: 4e5e unlk %fp
49c34: 4e75 rts
#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 )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
49c36: 41f9 0005 f9be lea 5f9be <_Thread_Ticks_per_timeslice>,%a0
49c3c: 2750 0072 movel %a0@,%a3@(114)
49c40: 6000 fed0 braw 49b12 <_Thread_Dispatch+0x62>
0004df68 <_Thread_Handler>:
#define INIT_NAME __main
#define EXECUTE_GLOBAL_CONSTRUCTORS
#endif
void _Thread_Handler( void )
{
4df68: 4e56 fff4 linkw %fp,#-12
4df6c: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static bool doneConstructors;
bool doCons;
#endif
executing = _Thread_Executing;
4df70: 2479 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a2
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
4df76: 222a 00a4 movel %a2@(164),%d1
_ISR_Set_level(level);
4df7a: 40c0 movew %sr,%d0
4df7c: e189 lsll #8,%d1
4df7e: 0280 0000 f8ff andil #63743,%d0
4df84: 8081 orl %d1,%d0
4df86: 46c0 movew %d0,%sr
&& _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
if (doCons)
doneConstructors = true;
#else
doCons = !doneConstructors;
doneConstructors = true;
4df88: 7001 moveq #1,%d0
doCons = !doneConstructors
&& _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
if (doCons)
doneConstructors = true;
#else
doCons = !doneConstructors;
4df8a: 1439 0005 f208 moveb 5f208 <doneConstructors.3716>,%d2
doneConstructors = true;
4df90: 13c0 0005 f208 moveb %d0,5f208 <doneConstructors.3716>
#endif
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
4df96: 4aaa 00f0 tstl %a2@(240)
4df9a: 6720 beqs 4dfbc <_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 );
4df9c: 2079 0005 fa72 moveal 5fa72 <_Thread_Allocated_fp>,%a0
4dfa2: b1ca cmpal %a2,%a0
4dfa4: 6716 beqs 4dfbc <_Thread_Handler+0x54>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
4dfa6: 4a88 tstl %a0
4dfa8: 670c beqs 4dfb6 <_Thread_Handler+0x4e>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
4dfaa: 4868 00f0 pea %a0@(240)
4dfae: 4eb9 0004 ad90 jsr 4ad90 <_CPU_Context_save_fp>
4dfb4: 588f addql #4,%sp
_Thread_Allocated_fp = executing;
4dfb6: 23ca 0005 fa72 movel %a2,5fa72 <_Thread_Allocated_fp>
);
}
static inline void _User_extensions_Thread_begin( Thread_Control *executing )
{
_User_extensions_Iterate(
4dfbc: 4879 0004 a758 pea 4a758 <_User_extensions_Thread_begin_visitor>
4dfc2: 47f9 0004 a7b8 lea 4a7b8 <_User_extensions_Iterate>,%a3
4dfc8: 2f0a movel %a2,%sp@-
4dfca: 4e93 jsr %a3@
_User_extensions_Thread_begin( executing );
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
4dfcc: 4eb9 0004 9c44 jsr 49c44 <_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 (doCons) /* && (volatile void *)_init) */ {
4dfd2: 508f addql #8,%sp
4dfd4: 4a02 tstb %d2
4dfd6: 674a beqs 4e022 <_Thread_Handler+0xba>
_Thread_Enable_dispatch();
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
4dfd8: 4aaa 008e tstl %a2@(142)
4dfdc: 671a beqs 4dff8 <_Thread_Handler+0x90> <== ALWAYS TAKEN
}
}
static inline void _User_extensions_Thread_exitted( Thread_Control *executing )
{
_User_extensions_Iterate(
4dfde: 4879 0004 a770 pea 4a770 <_User_extensions_Thread_exitted_visitor><== NOT EXECUTED
4dfe4: 2f0a movel %a2,%sp@- <== NOT EXECUTED
4dfe6: 4e93 jsr %a3@ <== NOT EXECUTED
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
_Internal_error_Occurred(
4dfe8: 4878 0005 pea 5 <COMPARE> <== NOT EXECUTED
4dfec: 4878 0001 pea 1 <ADD> <== NOT EXECUTED
4dff0: 42a7 clrl %sp@- <== NOT EXECUTED
4dff2: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred> <== NOT EXECUTED
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
4dff8: 2f2a 0096 movel %a2@(150),%sp@-
4dffc: 206a 008a moveal %a2@(138),%a0
4e000: 4e90 jsr %a0@
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
4e002: 588f addql #4,%sp
4e004: 2540 0028 movel %d0,%a2@(40)
4e008: 4879 0004 a770 pea 4a770 <_User_extensions_Thread_exitted_visitor>
4e00e: 2f0a movel %a2,%sp@-
4e010: 4e93 jsr %a3@
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
_Internal_error_Occurred(
4e012: 4878 0005 pea 5 <COMPARE>
4e016: 4878 0001 pea 1 <ADD>
4e01a: 42a7 clrl %sp@-
4e01c: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
* _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 (doCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
4e022: 4eb9 0005 c3a8 jsr 5c3a8 <_init>
_Thread_Enable_dispatch();
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
4e028: 4aaa 008e tstl %a2@(142)
4e02c: 66b0 bnes 4dfde <_Thread_Handler+0x76> <== NEVER TAKEN
4e02e: 60c8 bras 4dff8 <_Thread_Handler+0x90>
00049f1c <_Thread_Handler_initialization>:
#if defined(RTEMS_SMP)
#include <rtems/bspsmp.h>
#endif
void _Thread_Handler_initialization(void)
{
49f1c: 4e56 0000 linkw %fp,#0
uint32_t ticks_per_timeslice =
rtems_configuration_get_ticks_per_timeslice();
uint32_t maximum_extensions =
rtems_configuration_get_maximum_extensions();
rtems_stack_allocate_init_hook stack_allocate_init_hook =
49f20: 2079 0005 c5f8 moveal 5c5f8 <Configuration+0x24>,%a0
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
49f26: 4ab9 0005 c5fc tstl 5c5fc <Configuration+0x28>
49f2c: 6772 beqs 49fa0 <_Thread_Handler_initialization+0x84><== NEVER TAKEN
49f2e: 4ab9 0005 c600 tstl 5c600 <Configuration+0x2c>
49f34: 676a beqs 49fa0 <_Thread_Handler_initialization+0x84>
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_BAD_STACK_HOOK
);
if ( stack_allocate_init_hook != NULL )
49f36: 4a88 tstl %a0
49f38: 670a beqs 49f44 <_Thread_Handler_initialization+0x28>
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
49f3a: 2f39 0005 c5d8 movel 5c5d8 <Configuration+0x4>,%sp@-
49f40: 4e90 jsr %a0@
49f42: 588f addql #4,%sp
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
49f44: 4878 0008 pea 8 <DIVIDE_BY_ZERO>
_Thread_Heir = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
#endif
_Thread_Maximum_extensions = maximum_extensions;
49f48: 41f9 0005 c5dc lea 5c5dc <Configuration+0x8>,%a0
49f4e: 23d0 0005 fa86 movel %a0@,5fa86 <_Thread_Maximum_extensions>
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
49f54: 41f9 0005 c5e8 lea 5c5e8 <Configuration+0x14>,%a0
49f5a: 23d0 0005 f9be movel %a0@,5f9be <_Thread_Ticks_per_timeslice>
);
if ( stack_allocate_init_hook != NULL )
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
_Thread_Dispatch_necessary = false;
49f60: 4200 clrb %d0
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
49f62: 42a7 clrl %sp@-
49f64: 4878 0108 pea 108 <DBL_MANT_DIG+0xd3>
49f68: 4878 0001 pea 1 <ADD>
49f6c: 4878 0001 pea 1 <ADD>
49f70: 4878 0001 pea 1 <ADD>
49f74: 4879 0005 faf2 pea 5faf2 <_Thread_Internal_information>
);
if ( stack_allocate_init_hook != NULL )
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
_Thread_Dispatch_necessary = false;
49f7a: 13c0 0005 fb7c moveb %d0,5fb7c <_Per_CPU_Information+0xc>
_Thread_Executing = NULL;
49f80: 42b9 0005 fb7e clrl 5fb7e <_Per_CPU_Information+0xe>
_Thread_Heir = NULL;
49f86: 42b9 0005 fb82 clrl 5fb82 <_Per_CPU_Information+0x12>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
49f8c: 42b9 0005 fa72 clrl 5fa72 <_Thread_Allocated_fp>
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
49f92: 4eb9 0004 8f44 jsr 48f44 <_Objects_Initialize_information>
49f98: 4fef 001c lea %sp@(28),%sp
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
49f9c: 4e5e unlk %fp
49f9e: 4e75 rts
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
rtems_configuration_get_stack_free_hook() == NULL)
_Internal_error_Occurred(
49fa0: 4878 000e pea e <OPER1+0x2>
49fa4: 4878 0001 pea 1 <ADD>
49fa8: 42a7 clrl %sp@-
49faa: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
0004d614 <_Thread_Reset>:
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
4d614: 4e56 0000 linkw %fp,#0
4d618: 2f0a movel %a2,%sp@-
4d61a: 246e 0008 moveal %fp@(8),%a2
the_thread->resource_count = 0;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
4d61e: 256a 009c 0076 movel %a2@(156),%a2@(118)
the_thread->budget_callout = the_thread->Start.budget_callout;
4d624: 256a 00a0 007a movel %a2@(160),%a2@(122)
the_thread->Start.pointer_argument = pointer_argument;
4d62a: 256e 000c 0092 movel %fp@(12),%a2@(146)
the_thread->Start.numeric_argument = numeric_argument;
4d630: 256e 0010 0096 movel %fp@(16),%a2@(150)
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
the_thread->resource_count = 0;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
4d636: 156a 009a 0070 moveb %a2@(154),%a2@(112)
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
the_thread->resource_count = 0;
4d63c: 42aa 001c clrl %a2@(28)
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->Start.pointer_argument = pointer_argument;
the_thread->Start.numeric_argument = numeric_argument;
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
4d640: 2f0a movel %a2,%sp@-
4d642: 4eb9 0004 ac18 jsr 4ac18 <_Thread_queue_Extract_with_proxy>
4d648: 588f addql #4,%sp
4d64a: 4a00 tstb %d0
4d64c: 6608 bnes 4d656 <_Thread_Reset+0x42>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
4d64e: 7002 moveq #2,%d0
4d650: b0aa 0050 cmpl %a2@(80),%d0
4d654: 672a beqs 4d680 <_Thread_Reset+0x6c>
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
4d656: 202a 00a8 movel %a2@(168),%d0
4d65a: b0aa 0014 cmpl %a2@(20),%d0
4d65e: 6718 beqs 4d678 <_Thread_Reset+0x64>
the_thread->real_priority = the_thread->Start.initial_priority;
4d660: 2540 0018 movel %d0,%a2@(24)
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
4d664: 2d4a 0008 movel %a2,%fp@(8)
}
}
4d668: 246e fffc moveal %fp@(-4),%a2
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
the_thread->real_priority = the_thread->Start.initial_priority;
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
4d66c: 2d40 000c movel %d0,%fp@(12)
}
}
4d670: 4e5e unlk %fp
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
the_thread->real_priority = the_thread->Start.initial_priority;
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
4d672: 4ef9 0004 ae4c jmp 4ae4c <_Thread_Set_priority>
}
}
4d678: 246e fffc moveal %fp@(-4),%a2
4d67c: 4e5e unlk %fp
4d67e: 4e75 rts
the_thread->Start.numeric_argument = numeric_argument;
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
4d680: 486a 0048 pea %a2@(72)
4d684: 4eb9 0004 b2f8 jsr 4b2f8 <_Watchdog_Remove>
4d68a: 588f addql #4,%sp
4d68c: 60c8 bras 4d656 <_Thread_Reset+0x42>
...
0004adbc <_Thread_Restart>:
*/
RTEMS_INLINE_ROUTINE bool _States_Is_dormant (
States_Control the_states
)
{
return (the_states & STATES_DORMANT);
4adbc: 7001 moveq #1,%d0
bool _Thread_Restart(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
4adbe: 4e56 0000 linkw %fp,#0
4adc2: 2f0a movel %a2,%sp@-
4adc4: 246e 0008 moveal %fp@(8),%a2
4adc8: c0aa 0010 andl %a2@(16),%d0
if ( !_States_Is_dormant( the_thread->current_state ) ) {
4adcc: 670a beqs 4add8 <_Thread_Restart+0x1c>
_Thread_Restart_self();
return true;
}
return false;
4adce: 4200 clrb %d0
}
4add0: 246e fffc moveal %fp@(-4),%a2
4add4: 4e5e unlk %fp
4add6: 4e75 rts
Thread_Entry_numeric_type numeric_argument
)
{
if ( !_States_Is_dormant( the_thread->current_state ) ) {
_Thread_Set_transient( the_thread );
4add8: 2f0a movel %a2,%sp@-
4adda: 4eb9 0004 aeb0 jsr 4aeb0 <_Thread_Set_transient>
_Thread_Reset( the_thread, pointer_argument, numeric_argument );
4ade0: 2f2e 0010 movel %fp@(16),%sp@-
4ade4: 2f2e 000c movel %fp@(12),%sp@-
4ade8: 2f0a movel %a2,%sp@-
4adea: 4eb9 0004 d614 jsr 4d614 <_Thread_Reset>
_Thread_Load_environment( the_thread );
4adf0: 2f0a movel %a2,%sp@-
4adf2: 4eb9 0004 d318 jsr 4d318 <_Thread_Load_environment>
_Thread_Ready( the_thread );
4adf8: 2f0a movel %a2,%sp@-
4adfa: 4eb9 0004 d5e4 jsr 4d5e4 <_Thread_Ready>
);
}
static inline void _User_extensions_Thread_restart( Thread_Control *restarted )
{
_User_extensions_Iterate(
4ae00: 4879 0004 b064 pea 4b064 <_User_extensions_Thread_restart_visitor>
4ae06: 2f0a movel %a2,%sp@-
4ae08: 4eb9 0004 b0dc jsr 4b0dc <_User_extensions_Iterate>
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
4ae0e: 4fef 0020 lea %sp@(32),%sp
_Thread_Restart_self();
return true;
4ae12: 7001 moveq #1,%d0
_Thread_Ready( the_thread );
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
4ae14: b5f9 0006 06d6 cmpal 606d6 <_Per_CPU_Information+0xe>,%a2
4ae1a: 66b4 bnes 4add0 <_Thread_Restart+0x14>
*/
RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
{
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( _Thread_Executing->fp_context != NULL )
4ae1c: 4aaa 00f0 tstl %a2@(240)
4ae20: 6712 beqs 4ae34 <_Thread_Restart+0x78>
_Context_Restore_fp( &_Thread_Executing->fp_context );
4ae22: 486a 00f0 pea %a2@(240)
4ae26: 4eb9 0004 b6ec jsr 4b6ec <_CPU_Context_restore_fp>
4ae2c: 2479 0006 06d6 moveal 606d6 <_Per_CPU_Information+0xe>,%a2
4ae32: 588f addql #4,%sp
#endif
_CPU_Context_Restart_self( &_Thread_Executing->Registers );
4ae34: 486a 00bc pea %a2@(188)
4ae38: 4eb9 0004 b59a jsr 4b59a <_CPU_Context_Restart_self>
return true;
}
return false;
}
4ae3e: 246e fffc moveal %fp@(-4),%a2 <== NOT EXECUTED
4ae42: 588f addql #4,%sp <== NOT EXECUTED
4ae44: 4e5e unlk %fp <== NOT EXECUTED
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
_Thread_Restart_self();
return true;
4ae46: 7001 moveq #1,%d0 <== NOT EXECUTED
}
return false;
}
...
000496f8 <_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 ) ) {
496f8: 7202 moveq #2,%d1
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
496fa: 4e56 0000 linkw %fp,#0
496fe: 202e 0010 movel %fp@(16),%d0
49702: 2f0a movel %a2,%sp@-
49704: 246e 000c moveal %fp@(12),%a2
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
49708: 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 ) ) {
4970c: b2aa 0050 cmpl %a2@(80),%d1
49710: 671c beqs 4972e <_Thread_blocking_operation_Cancel+0x36>
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
} else
_ISR_Enable( level );
49712: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
49714: 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
}
49718: 246e fffc moveal %fp@(-4),%a2
4971c: 203c 1007 fff8 movel #268959736,%d0
49722: 2d40 000c movel %d0,%fp@(12)
49726: 4e5e unlk %fp
49728: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
4972e: 123c 0003 moveb #3,%d1
49732: 2541 0050 movel %d1,%a2@(80)
* 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 ) ) {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
49736: 46c0 movew %d0,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
49738: 486a 0048 pea %a2@(72)
4973c: 4eb9 0004 a9d4 jsr 4a9d4 <_Watchdog_Remove>
49742: 588f addql #4,%sp
49744: 203c 1007 fff8 movel #268959736,%d0
4974a: 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
}
4974e: 246e fffc moveal %fp@(-4),%a2
49752: 2d40 000c movel %d0,%fp@(12)
49756: 4e5e unlk %fp
49758: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
...
0004a02c <_Thread_queue_Dequeue_priority>:
Chain_Node *new_second_node;
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
4a02c: 203c 0000 0700 movel #1792,%d0
#include <rtems/score/tqdata.h>
Thread_Control *_Thread_queue_Dequeue_priority(
Thread_queue_Control *the_thread_queue
)
{
4a032: 4e56 ffe8 linkw %fp,#-24
4a036: 226e 0008 moveal %fp@(8),%a1
4a03a: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
Chain_Node *new_second_node;
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
4a03e: 40c3 movew %sr,%d3
4a040: 8083 orl %d3,%d0
4a042: 46c0 movew %d0,%sr
for( index=0 ;
4a044: 4281 clrl %d1
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
4a046: 2401 movel %d1,%d2
4a048: 2001 movel %d1,%d0
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
4a04a: 5281 addql #1,%d1
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
4a04c: e58a lsll #2,%d2
4a04e: e988 lsll #4,%d0
4a050: 9082 subl %d2,%d0
4a052: 41f1 0800 lea %a1@(00000000,%d0:l),%a0
4a056: 2458 moveal %a0@+,%a2
4a058: b1ca cmpal %a2,%a0
4a05a: 6616 bnes 4a072 <_Thread_queue_Dequeue_priority+0x46>
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
4a05c: 7004 moveq #4,%d0
4a05e: b081 cmpl %d1,%d0
4a060: 66e4 bnes 4a046 <_Thread_queue_Dequeue_priority+0x1a>
}
/*
* We did not find a thread to unblock.
*/
_ISR_Enable( level );
4a062: 46c3 movew %d3,%sr
return NULL;
4a064: 95ca subal %a2,%a2
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
4a066: 200a movel %a2,%d0
4a068: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4a06e: 4e5e unlk %fp
4a070: 4e75 rts
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
4a072: 200a movel %a2,%d0
4a074: 0680 0000 003c addil #60,%d0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4a07a: 206a 0038 moveal %a2@(56),%a0
dequeue:
the_thread->Wait.queue = NULL;
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
next_node = the_thread->Object.Node.next;
4a07e: 2252 moveal %a2@,%a1
previous_node = the_thread->Object.Node.previous;
4a080: 266a 0004 moveal %a2@(4),%a3
*/
_ISR_Enable( level );
return NULL;
dequeue:
the_thread->Wait.queue = NULL;
4a084: 42aa 0044 clrl %a2@(68)
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
next_node = the_thread->Object.Node.next;
previous_node = the_thread->Object.Node.previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
4a088: b088 cmpl %a0,%d0
4a08a: 6700 008a beqw 4a116 <_Thread_queue_Dequeue_priority+0xea>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Last(
Chain_Control *the_chain
)
{
return _Chain_Tail( the_chain )->previous;
4a08e: 286a 0040 moveal %a2@(64),%a4
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
4a092: 2a50 moveal %a0@,%a5
previous_node->next = new_first_node;
next_node->previous = new_first_node;
4a094: 2348 0004 movel %a0,%a1@(4)
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
4a098: 2688 movel %a0,%a3@
next_node->previous = new_first_node;
new_first_node->next = next_node;
new_first_node->previous = previous_node;
4a09a: 214b 0004 movel %a3,%a0@(4)
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
next_node->previous = new_first_node;
new_first_node->next = next_node;
4a09e: 2089 movel %a1,%a0@
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
4a0a0: 226a 0040 moveal %a2@(64),%a1
4a0a4: b3ea 0038 cmpal %a2@(56),%a1
4a0a8: 6716 beqs 4a0c0 <_Thread_queue_Dequeue_priority+0x94>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
4a0aa: 214d 0038 movel %a5,%a0@(56)
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
4a0ae: 43e8 003c lea %a0@(60),%a1
4a0b2: 2889 movel %a1,%a4@
new_first_node->next = next_node;
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
4a0b4: 43e8 0038 lea %a0@(56),%a1
4a0b8: 2b49 0004 movel %a1,%a5@(4)
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
tail->previous = last_node;
4a0bc: 214c 0040 movel %a4,%a0@(64)
} else {
previous_node->next = next_node;
next_node->previous = previous_node;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4a0c0: 7002 moveq #2,%d0
4a0c2: b0aa 0050 cmpl %a2@(80),%d0
4a0c6: 671e beqs 4a0e6 <_Thread_queue_Dequeue_priority+0xba>
_ISR_Enable( level );
4a0c8: 46c3 movew %d3,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4a0ca: 2f3c 1007 fff8 movel #268959736,%sp@-
4a0d0: 2f0a movel %a2,%sp@-
4a0d2: 4eb9 0004 9844 jsr 49844 <_Thread_Clear_state>
4a0d8: 508f addql #8,%sp
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
4a0da: 200a movel %a2,%d0
4a0dc: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4a0e2: 4e5e unlk %fp
4a0e4: 4e75 rts
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
4a0e6: 7003 moveq #3,%d0
4a0e8: 2540 0050 movel %d0,%a2@(80)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
4a0ec: 46c3 movew %d3,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4a0ee: 486a 0048 pea %a2@(72)
4a0f2: 4eb9 0004 a9d4 jsr 4a9d4 <_Watchdog_Remove>
4a0f8: 2f3c 1007 fff8 movel #268959736,%sp@-
4a0fe: 2f0a movel %a2,%sp@-
4a100: 4eb9 0004 9844 jsr 49844 <_Thread_Clear_state>
4a106: 4fef 000c lea %sp@(12),%sp
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
4a10a: 200a movel %a2,%d0
4a10c: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4a112: 4e5e unlk %fp
4a114: 4e75 rts
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
4a116: 2689 movel %a1,%a3@
next_node->previous = previous_node;
4a118: 234b 0004 movel %a3,%a1@(4)
4a11c: 60a2 bras 4a0c0 <_Thread_queue_Dequeue_priority+0x94>
...
0004a1cc <_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
)
{
4a1cc: 4e56 ffe0 linkw %fp,#-32
4a1d0: 48d7 1c7c moveml %d2-%d6/%a2-%a4,%sp@
4a1d4: 266e 000c moveal %fp@(12),%a3
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
4a1d8: 45eb 0038 lea %a3@(56),%a2
Chain_Node *tail = _Chain_Tail( the_chain );
4a1dc: 41eb 003c lea %a3@(60),%a0
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
4a1e0: 222b 0014 movel %a3@(20),%d1
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
4a1e4: 2001 movel %d1,%d0
4a1e6: ec88 lsrl #6,%d0
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
4a1e8: 2400 movel %d0,%d2
4a1ea: e988 lsll #4,%d0
4a1ec: 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
)
{
4a1ee: 286e 0008 moveal %fp@(8),%a4
_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 ];
4a1f2: 9082 subl %d2,%d0
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
4a1f4: 274a 0040 movel %a2,%a3@(64)
block_state = the_thread_queue->state;
4a1f8: 242c 0038 movel %a4@(56),%d2
_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 ];
4a1fc: 45f4 0800 lea %a4@(00000000,%d0:l),%a2
Chain_Node *tail = _Chain_Tail( the_chain );
4a200: 2748 0038 movel %a0,%a3@(56)
head->next = tail;
head->previous = NULL;
4a204: 42ab 003c clrl %a3@(60)
block_state = the_thread_queue->state;
if ( _Thread_queue_Is_reverse_search( priority ) )
4a208: 0801 0005 btst #5,%d1
4a20c: 6656 bnes 4a264 <_Thread_queue_Enqueue_priority+0x98>
4a20e: 2c0a movel %a2,%d6
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
4a210: 2a3c 0000 0700 movel #1792,%d5
4a216: 5886 addql #4,%d6
4a218: 2005 movel %d5,%d0
4a21a: 40c3 movew %sr,%d3
4a21c: 8083 orl %d3,%d0
4a21e: 46c0 movew %d0,%sr
4a220: 2803 movel %d3,%d4
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4a222: 2052 moveal %a2@,%a0
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
4a224: bc88 cmpl %a0,%d6
4a226: 6700 0148 beqw 4a370 <_Thread_queue_Enqueue_priority+0x1a4>
search_priority = search_thread->current_priority;
4a22a: 2268 0014 moveal %a0@(20),%a1
if ( priority <= search_priority )
4a22e: b3c1 cmpal %d1,%a1
4a230: 6418 bccs 4a24a <_Thread_queue_Enqueue_priority+0x7e>
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
4a232: 2005 movel %d5,%d0
4a234: 46c3 movew %d3,%sr
4a236: 8083 orl %d3,%d0
4a238: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
4a23a: 2002 movel %d2,%d0
4a23c: c0a8 0010 andl %a0@(16),%d0
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
4a240: 6700 0092 beqw 4a2d4 <_Thread_queue_Enqueue_priority+0x108>
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
4a244: 2050 moveal %a0@,%a0
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
4a246: bc88 cmpl %a0,%d6
4a248: 66e0 bnes 4a22a <_Thread_queue_Enqueue_priority+0x5e>
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
4a24a: 202c 0030 movel %a4@(48),%d0
4a24e: 7401 moveq #1,%d2
4a250: b480 cmpl %d0,%d2
4a252: 6700 00b6 beqw 4a30a <_Thread_queue_Enqueue_priority+0x13e>
* 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;
4a256: 206e 0010 moveal %fp@(16),%a0
4a25a: 2084 movel %d4,%a0@
return the_thread_queue->sync_state;
}
4a25c: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
4a260: 4e5e unlk %fp
4a262: 4e75 rts
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
4a264: 2a3c 0000 0700 movel #1792,%d5
4a26a: 2005 movel %d5,%d0
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
4a26c: 1c39 0005 e19c moveb 5e19c <rtems_maximum_priority>,%d6
_ISR_Disable( level );
4a272: 40c3 movew %sr,%d3
4a274: 8083 orl %d3,%d0
4a276: 46c0 movew %d0,%sr
4a278: 2803 movel %d3,%d4
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Last(
Chain_Control *the_chain
)
{
return _Chain_Tail( the_chain )->previous;
4a27a: 206a 0008 moveal %a2@(8),%a0
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
4a27e: b5c8 cmpal %a0,%a2
4a280: 6700 00d4 beqw 4a356 <_Thread_queue_Enqueue_priority+0x18a>
search_priority = search_thread->current_priority;
4a284: 2268 0014 moveal %a0@(20),%a1
if ( priority >= search_priority )
4a288: b3c1 cmpal %d1,%a1
4a28a: 6318 blss 4a2a4 <_Thread_queue_Enqueue_priority+0xd8>
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
4a28c: 2005 movel %d5,%d0
4a28e: 46c3 movew %d3,%sr
4a290: 8083 orl %d3,%d0
4a292: 46c0 movew %d0,%sr
4a294: 2002 movel %d2,%d0
4a296: c0a8 0010 andl %a0@(16),%d0
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
4a29a: 6750 beqs 4a2ec <_Thread_queue_Enqueue_priority+0x120>
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
4a29c: 2068 0004 moveal %a0@(4),%a0
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
4a2a0: b5c8 cmpal %a0,%a2
4a2a2: 66e0 bnes 4a284 <_Thread_queue_Enqueue_priority+0xb8>
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
4a2a4: 202c 0030 movel %a4@(48),%d0
4a2a8: 7401 moveq #1,%d2
4a2aa: b480 cmpl %d0,%d2
4a2ac: 66a8 bnes 4a256 <_Thread_queue_Enqueue_priority+0x8a><== NEVER TAKEN
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
4a2ae: 42ac 0030 clrl %a4@(48)
if ( priority == search_priority )
4a2b2: b3c1 cmpal %d1,%a1
4a2b4: 677c beqs 4a332 <_Thread_queue_Enqueue_priority+0x166>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
4a2b6: 2250 moveal %a0@,%a1
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
4a2b8: 2748 0004 movel %a0,%a3@(4)
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
4a2bc: 2689 movel %a1,%a3@
the_node->previous = search_node;
search_node->next = the_node;
next_node->previous = the_node;
4a2be: 234b 0004 movel %a3,%a1@(4)
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;
4a2c2: 208b movel %a3,%a0@
next_node->previous = the_node;
the_thread->Wait.queue = the_thread_queue;
4a2c4: 274c 0044 movel %a4,%a3@(68)
_ISR_Enable( level );
4a2c8: 46c3 movew %d3,%sr
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
4a2ca: 7001 moveq #1,%d0
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
4a2cc: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
4a2d0: 4e5e unlk %fp
4a2d2: 4e75 rts
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
4a2d4: 46c3 movew %d3,%sr
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
4a2d6: 2005 movel %d5,%d0
4a2d8: 40c3 movew %sr,%d3
4a2da: 8083 orl %d3,%d0
4a2dc: 46c0 movew %d0,%sr
4a2de: 2803 movel %d3,%d4
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4a2e0: 2052 moveal %a2@,%a0
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
4a2e2: bc88 cmpl %a0,%d6
4a2e4: 6600 ff44 bnew 4a22a <_Thread_queue_Enqueue_priority+0x5e>
4a2e8: 6000 0086 braw 4a370 <_Thread_queue_Enqueue_priority+0x1a4>
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
4a2ec: 46c3 movew %d3,%sr
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
4a2ee: 2005 movel %d5,%d0
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
4a2f0: 1c39 0005 e19c moveb 5e19c <rtems_maximum_priority>,%d6
_ISR_Disable( level );
4a2f6: 40c3 movew %sr,%d3
4a2f8: 8083 orl %d3,%d0
4a2fa: 46c0 movew %d0,%sr
4a2fc: 2803 movel %d3,%d4
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Last(
Chain_Control *the_chain
)
{
return _Chain_Tail( the_chain )->previous;
4a2fe: 206a 0008 moveal %a2@(8),%a0
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
4a302: b5c8 cmpal %a0,%a2
4a304: 6600 ff7e bnew 4a284 <_Thread_queue_Enqueue_priority+0xb8>
4a308: 604c bras 4a356 <_Thread_queue_Enqueue_priority+0x18a>
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
4a30a: 42ac 0030 clrl %a4@(48)
if ( priority == search_priority )
4a30e: b3c1 cmpal %d1,%a1
4a310: 6720 beqs 4a332 <_Thread_queue_Enqueue_priority+0x166>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
4a312: 2268 0004 moveal %a0@(4),%a1
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
4a316: 2688 movel %a0,%a3@
the_node->previous = previous_node;
4a318: 2749 0004 movel %a1,%a3@(4)
previous_node->next = the_node;
4a31c: 228b movel %a3,%a1@
search_node->previous = the_node;
4a31e: 214b 0004 movel %a3,%a0@(4)
the_thread->Wait.queue = the_thread_queue;
4a322: 274c 0044 movel %a4,%a3@(68)
_ISR_Enable( level );
4a326: 46c3 movew %d3,%sr
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
4a328: 7001 moveq #1,%d0
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
4a32a: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
4a32e: 4e5e unlk %fp
4a330: 4e75 rts
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
previous_node = search_node->previous;
4a332: 2268 0040 moveal %a0@(64),%a1
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
4a336: 45e8 003c lea %a0@(60),%a2
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
the_node->previous = previous_node;
4a33a: 2749 0004 movel %a1,%a3@(4)
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
4a33e: 268a movel %a2,%a3@
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
the_node->previous = previous_node;
previous_node->next = the_node;
search_node->previous = the_node;
4a340: 214b 0040 movel %a3,%a0@(64)
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;
4a344: 228b movel %a3,%a1@
search_node->previous = the_node;
the_thread->Wait.queue = the_thread_queue;
4a346: 274c 0044 movel %a4,%a3@(68)
_ISR_Enable( level );
4a34a: 46c4 movew %d4,%sr
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
4a34c: 7001 moveq #1,%d0
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
4a34e: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
4a352: 4e5e unlk %fp
4a354: 4e75 rts
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
4a356: 202c 0030 movel %a4@(48),%d0
4a35a: 7401 moveq #1,%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;
4a35c: 0286 0000 00ff andil #255,%d6
4a362: 2246 moveal %d6,%a1
4a364: 5289 addql #1,%a1
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
4a366: b480 cmpl %d0,%d2
4a368: 6600 feec bnew 4a256 <_Thread_queue_Enqueue_priority+0x8a>
4a36c: 6000 ff40 braw 4a2ae <_Thread_queue_Enqueue_priority+0xe2>
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
4a370: 202c 0030 movel %a4@(48),%d0
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
4a374: 327c ffff moveaw #-1,%a1
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
4a378: 7401 moveq #1,%d2
4a37a: b480 cmpl %d0,%d2
4a37c: 6600 fed8 bnew 4a256 <_Thread_queue_Enqueue_priority+0x8a>
4a380: 6088 bras 4a30a <_Thread_queue_Enqueue_priority+0x13e>
...
0004e030 <_Thread_queue_Extract_fifo>:
Thread_Control *the_thread
)
{
ISR_Level level;
_ISR_Disable( level );
4e030: 203c 0000 0700 movel #1792,%d0
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
4e036: 4e56 0000 linkw %fp,#0
4e03a: 2f0a movel %a2,%sp@-
4e03c: 246e 000c moveal %fp@(12),%a2
ISR_Level level;
_ISR_Disable( level );
4e040: 40c1 movew %sr,%d1
4e042: 8081 orl %d1,%d0
4e044: 46c0 movew %d0,%sr
4e046: 202a 0010 movel %a2@(16),%d0
4e04a: 0280 0003 bee0 andil #245472,%d0
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4e050: 6734 beqs 4e086 <_Thread_queue_Extract_fifo+0x56>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
4e052: 2252 moveal %a2@,%a1
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4e054: 7002 moveq #2,%d0
previous = the_node->previous;
4e056: 206a 0004 moveal %a2@(4),%a0
next->previous = previous;
4e05a: 2348 0004 movel %a0,%a1@(4)
previous->next = next;
4e05e: 2089 movel %a1,%a0@
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
4e060: 42aa 0044 clrl %a2@(68)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4e064: b0aa 0050 cmpl %a2@(80),%d0
4e068: 6726 beqs 4e090 <_Thread_queue_Extract_fifo+0x60>
_ISR_Enable( level );
4e06a: 46c1 movew %d1,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4e06c: 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
}
4e070: 246e fffc moveal %fp@(-4),%a2
4e074: 203c 1007 fff8 movel #268959736,%d0
4e07a: 2d40 000c movel %d0,%fp@(12)
4e07e: 4e5e unlk %fp
4e080: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
ISR_Level level;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
4e086: 46c1 movew %d1,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4e088: 246e fffc moveal %fp@(-4),%a2
4e08c: 4e5e unlk %fp
4e08e: 4e75 rts
4e090: 7003 moveq #3,%d0
4e092: 2540 0050 movel %d0,%a2@(80)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
4e096: 46c1 movew %d1,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4e098: 486a 0048 pea %a2@(72)
4e09c: 4eb9 0004 a9d4 jsr 4a9d4 <_Watchdog_Remove>
4e0a2: 588f addql #4,%sp
4e0a4: 203c 1007 fff8 movel #268959736,%d0
4e0aa: 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
}
4e0ae: 246e fffc moveal %fp@(-4),%a2
4e0b2: 2d40 000c movel %d0,%fp@(12)
4e0b6: 4e5e unlk %fp
4e0b8: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
...
0004cb94 <_Thread_queue_Extract_priority_helper>:
Chain_Node *new_first_node;
Chain_Node *new_second_node;
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
4cb94: 203c 0000 0700 movel #1792,%d0
void _Thread_queue_Extract_priority_helper(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread,
bool requeuing
)
{
4cb9a: 4e56 ffec linkw %fp,#-20
4cb9e: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
4cba2: 246e 000c moveal %fp@(12),%a2
4cba6: 142e 0013 moveb %fp@(19),%d2
Chain_Node *new_first_node;
Chain_Node *new_second_node;
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
4cbaa: 40c1 movew %sr,%d1
4cbac: 8081 orl %d1,%d0
4cbae: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
4cbb0: 202a 0010 movel %a2@(16),%d0
4cbb4: 0280 0003 bee0 andil #245472,%d0
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4cbba: 6772 beqs 4cc2e <_Thread_queue_Extract_priority_helper+0x9a>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
4cbbc: 200a movel %a2,%d0
4cbbe: 0680 0000 003c addil #60,%d0
/*
* The thread was actually waiting on a thread queue so let's remove it.
*/
next_node = the_node->next;
4cbc4: 2252 moveal %a2@,%a1
previous_node = the_node->previous;
4cbc6: 266a 0004 moveal %a2@(4),%a3
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
4cbca: 206a 0038 moveal %a2@(56),%a0
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
4cbce: b088 cmpl %a0,%d0
4cbd0: 6768 beqs 4cc3a <_Thread_queue_Extract_priority_helper+0xa6>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Last(
Chain_Control *the_chain
)
{
return _Chain_Tail( the_chain )->previous;
4cbd2: 286a 0040 moveal %a2@(64),%a4
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
4cbd6: 2a50 moveal %a0@,%a5
previous_node->next = new_first_node;
next_node->previous = new_first_node;
4cbd8: 2348 0004 movel %a0,%a1@(4)
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
4cbdc: 2688 movel %a0,%a3@
next_node->previous = new_first_node;
new_first_node->next = next_node;
new_first_node->previous = previous_node;
4cbde: 214b 0004 movel %a3,%a0@(4)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
4cbe2: 202a 0040 movel %a2@(64),%d0
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
next_node->previous = new_first_node;
new_first_node->next = next_node;
4cbe6: 2089 movel %a1,%a0@
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
4cbe8: b0aa 0038 cmpl %a2@(56),%d0
4cbec: 6716 beqs 4cc04 <_Thread_queue_Extract_priority_helper+0x70>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
4cbee: 214d 0038 movel %a5,%a0@(56)
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
4cbf2: 43e8 003c lea %a0@(60),%a1
4cbf6: 2889 movel %a1,%a4@
new_first_node->next = next_node;
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
4cbf8: 43e8 0038 lea %a0@(56),%a1
4cbfc: 2b49 0004 movel %a1,%a5@(4)
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
tail->previous = last_node;
4cc00: 214c 0040 movel %a4,%a0@(64)
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
4cc04: 4a02 tstb %d2
4cc06: 6626 bnes 4cc2e <_Thread_queue_Extract_priority_helper+0x9a>
_ISR_Enable( level );
return;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4cc08: 7002 moveq #2,%d0
4cc0a: b0aa 0050 cmpl %a2@(80),%d0
4cc0e: 6736 beqs 4cc46 <_Thread_queue_Extract_priority_helper+0xb2>
_ISR_Enable( level );
4cc10: 46c1 movew %d1,%sr
4cc12: 2d4a 0008 movel %a2,%fp@(8)
4cc16: 227c 1007 fff8 moveal #268959736,%a1
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4cc1c: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4cc22: 2d49 000c movel %a1,%fp@(12)
4cc26: 4e5e unlk %fp
4cc28: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
_ISR_Enable( level );
4cc2e: 46c1 movew %d1,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4cc30: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4cc36: 4e5e unlk %fp
4cc38: 4e75 rts
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
4cc3a: 2689 movel %a1,%a3@
next_node->previous = previous_node;
4cc3c: 234b 0004 movel %a3,%a1@(4)
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
4cc40: 4a02 tstb %d2
4cc42: 67c4 beqs 4cc08 <_Thread_queue_Extract_priority_helper+0x74>
4cc44: 60e8 bras 4cc2e <_Thread_queue_Extract_priority_helper+0x9a>
4cc46: 7003 moveq #3,%d0
4cc48: 2540 0050 movel %d0,%a2@(80)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
4cc4c: 46c1 movew %d1,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4cc4e: 486a 0048 pea %a2@(72)
4cc52: 4eb9 0004 a9d4 jsr 4a9d4 <_Watchdog_Remove>
4cc58: 588f addql #4,%sp
4cc5a: 227c 1007 fff8 moveal #268959736,%a1
4cc60: 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
}
4cc64: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4cc6a: 2d49 000c movel %a1,%fp@(12)
4cc6e: 4e5e unlk %fp
4cc70: 4ef9 0004 9844 jmp 49844 <_Thread_Clear_state>
...
0004a3f0 <_Thread_queue_Initialize>:
the_thread_queue->state = state;
the_thread_queue->discipline = the_discipline;
the_thread_queue->timeout_status = timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
4a3f0: 7201 moveq #1,%d1
Thread_queue_Control *the_thread_queue,
Thread_queue_Disciplines the_discipline,
States_Control state,
uint32_t timeout_status
)
{
4a3f2: 4e56 0000 linkw %fp,#0
4a3f6: 206e 0008 moveal %fp@(8),%a0
4a3fa: 2f02 movel %d2,%sp@-
4a3fc: 202e 000c movel %fp@(12),%d0
the_thread_queue->state = state;
4a400: 216e 0010 0038 movel %fp@(16),%a0@(56)
the_thread_queue->discipline = the_discipline;
the_thread_queue->timeout_status = timeout_status;
4a406: 216e 0014 003c movel %fp@(20),%a0@(60)
States_Control state,
uint32_t timeout_status
)
{
the_thread_queue->state = state;
the_thread_queue->discipline = the_discipline;
4a40c: 2140 0034 movel %d0,%a0@(52)
the_thread_queue->timeout_status = timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
4a410: 42a8 0030 clrl %a0@(48)
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
4a414: b280 cmpl %d0,%d1
4a416: 6714 beqs 4a42c <_Thread_queue_Initialize+0x3c>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
4a418: 2008 movel %a0,%d0
4a41a: 5880 addql #4,%d0
head->next = tail;
head->previous = NULL;
4a41c: 42a8 0004 clrl %a0@(4)
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
4a420: 2080 movel %d0,%a0@
head->next = tail;
head->previous = NULL;
tail->previous = head;
4a422: 2148 0008 movel %a0,%a0@(8)
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
} else { /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
}
}
4a426: 241f movel %sp@+,%d2
4a428: 4e5e unlk %fp
4a42a: 4e75 rts
the_thread_queue->state = state;
the_thread_queue->discipline = the_discipline;
the_thread_queue->timeout_status = timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
4a42c: 4280 clrl %d0
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
4a42e: 2400 movel %d0,%d2
4a430: 2200 movel %d0,%d1
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
4a432: 5280 addql #1,%d0
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
4a434: e58a lsll #2,%d2
4a436: e989 lsll #4,%d1
4a438: 9282 subl %d2,%d1
4a43a: 43f0 1800 lea %a0@(00000000,%d1:l),%a1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
4a43e: 2209 movel %a1,%d1
4a440: 5881 addql #4,%d1
4a442: 2281 movel %d1,%a1@
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
4a444: 7204 moveq #4,%d1
head->next = tail;
head->previous = NULL;
4a446: 42a9 0004 clrl %a1@(4)
tail->previous = head;
4a44a: 2349 0008 movel %a1,%a1@(8)
4a44e: b280 cmpl %d0,%d1
4a450: 67d4 beqs 4a426 <_Thread_queue_Initialize+0x36> <== NEVER TAKEN
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
4a452: 2400 movel %d0,%d2
4a454: 2200 movel %d0,%d1
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
4a456: 5280 addql #1,%d0
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
4a458: e58a lsll #2,%d2
4a45a: e989 lsll #4,%d1
4a45c: 9282 subl %d2,%d1
4a45e: 43f0 1800 lea %a0@(00000000,%d1:l),%a1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
4a462: 2209 movel %a1,%d1
4a464: 5881 addql #4,%d1
4a466: 2281 movel %d1,%a1@
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
4a468: 7204 moveq #4,%d1
head->next = tail;
head->previous = NULL;
4a46a: 42a9 0004 clrl %a1@(4)
tail->previous = head;
4a46e: 2349 0008 movel %a1,%a1@(8)
4a472: b280 cmpl %d0,%d1
4a474: 66b8 bnes 4a42e <_Thread_queue_Initialize+0x3e>
4a476: 60ae bras 4a426 <_Thread_queue_Initialize+0x36>
0004cc78 <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
4cc78: 4e56 0000 linkw %fp,#0
4cc7c: 206e 0008 moveal %fp@(8),%a0
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
4cc80: 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 &&
4cc84: 2029 0030 movel %a1@(48),%d0
4cc88: 6708 beqs 4cc92 <_Thread_queue_Process_timeout+0x1a>
4cc8a: b1f9 0005 fb7e cmpal 5fb7e <_Per_CPU_Information+0xe>,%a0
4cc90: 6716 beqs 4cca8 <_Thread_queue_Process_timeout+0x30><== ALWAYS TAKEN
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
4cc92: 2169 003c 0034 movel %a1@(60),%a0@(52)
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
4cc98: 2f08 movel %a0,%sp@-
4cc9a: 2f09 movel %a1,%sp@-
4cc9c: 4eb9 0004 cb5c jsr 4cb5c <_Thread_queue_Extract>
4cca2: 508f addql #8,%sp
}
}
4cca4: 4e5e unlk %fp
4cca6: 4e75 rts
* a timeout is not allowed to occur.
*/
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 ) {
4cca8: 7203 moveq #3,%d1
4ccaa: b280 cmpl %d0,%d1
4ccac: 67f6 beqs 4cca4 <_Thread_queue_Process_timeout+0x2c>
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
4ccae: 7002 moveq #2,%d0
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
}
}
4ccb0: 4e5e unlk %fp
*/
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;
4ccb2: 2169 003c 0034 movel %a1@(60),%a0@(52)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
4ccb8: 2340 0030 movel %d0,%a1@(48)
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
}
}
...
0004a478 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
4a478: 4e56 fffc linkw %fp,#-4
4a47c: 2f0a movel %a2,%sp@-
4a47e: 246e 0008 moveal %fp@(8),%a2
4a482: 2f02 movel %d2,%sp@-
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
4a484: 4a8a tstl %a2
4a486: 6708 beqs 4a490 <_Thread_queue_Requeue+0x18> <== 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 ) {
4a488: 7001 moveq #1,%d0
4a48a: b0aa 0034 cmpl %a2@(52),%d0
4a48e: 670c beqs 4a49c <_Thread_queue_Requeue+0x24> <== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
4a490: 242e fff4 movel %fp@(-12),%d2 <== NOT EXECUTED
4a494: 246e fff8 moveal %fp@(-8),%a2 <== NOT EXECUTED
4a498: 4e5e unlk %fp <== NOT EXECUTED
4a49a: 4e75 rts <== NOT EXECUTED
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
4a49c: 303c 0700 movew #1792,%d0
4a4a0: 40c2 movew %sr,%d2
4a4a2: 8082 orl %d2,%d0
4a4a4: 46c0 movew %d0,%sr
4a4a6: 206e 000c moveal %fp@(12),%a0
4a4aa: 2028 0010 movel %a0@(16),%d0
4a4ae: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4a4b4: 660e bnes 4a4c4 <_Thread_queue_Requeue+0x4c> <== ALWAYS TAKEN
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
4a4b6: 46c2 movew %d2,%sr <== NOT EXECUTED
}
}
4a4b8: 242e fff4 movel %fp@(-12),%d2
4a4bc: 246e fff8 moveal %fp@(-8),%a2
4a4c0: 4e5e unlk %fp
4a4c2: 4e75 rts
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
4a4c4: 4878 0001 pea 1 <ADD>
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;
4a4c8: 7001 moveq #1,%d0
4a4ca: 2f08 movel %a0,%sp@-
4a4cc: 2540 0030 movel %d0,%a2@(48)
4a4d0: 2f0a movel %a2,%sp@-
4a4d2: 4eb9 0004 cb94 jsr 4cb94 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
4a4d8: 486e fffc pea %fp@(-4)
4a4dc: 2f2e 000c movel %fp@(12),%sp@-
4a4e0: 2f0a movel %a2,%sp@-
4a4e2: 4eb9 0004 a1cc jsr 4a1cc <_Thread_queue_Enqueue_priority>
4a4e8: 4fef 0018 lea %sp@(24),%sp
}
_ISR_Enable( level );
4a4ec: 46c2 movew %d2,%sr
4a4ee: 60c8 bras 4a4b8 <_Thread_queue_Requeue+0x40>
0004a4f0 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
4a4f0: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
4a4f4: 486e fffc pea %fp@(-4)
4a4f8: 2f2e 0008 movel %fp@(8),%sp@-
4a4fc: 4eb9 0004 9c64 jsr 49c64 <_Thread_Get>
switch ( location ) {
4a502: 508f addql #8,%sp
4a504: 4aae fffc tstl %fp@(-4)
4a508: 6618 bnes 4a522 <_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 );
4a50a: 2f00 movel %d0,%sp@-
4a50c: 4eb9 0004 cc78 jsr 4cc78 <_Thread_queue_Process_timeout>
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
--level;
_Thread_Dispatch_disable_level = level;
4a512: 588f addql #4,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
4a514: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
--level;
4a51a: 5380 subql #1,%d0
_Thread_Dispatch_disable_level = level;
4a51c: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
_Thread_Unnest_dispatch();
break;
}
}
4a522: 4e5e unlk %fp
...
00057cc4 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
57cc4: 4e56 ffb0 linkw %fp,#-80
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
57cc8: 41ee ffe8 lea %fp@(-24),%a0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
57ccc: 200e movel %fp,%d0
57cce: 5180 subql #8,%d0
57cd0: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
57cd4: 246e 0008 moveal %fp@(8),%a2
57cd8: 2a0e movel %fp,%d5
57cda: 2c0e movel %fp,%d6
57cdc: 0685 ffff fff4 addil #-12,%d5
57ce2: 0686 ffff ffec addil #-20,%d6
57ce8: 260a movel %a2,%d3
57cea: 240a movel %a2,%d2
57cec: 4bf9 0005 bf6c lea 5bf6c <_Watchdog_Adjust_to_chain>,%a5
57cf2: 0683 0000 0030 addil #48,%d3
57cf8: 0682 0000 0068 addil #104,%d2
57cfe: 47f9 0005 878c lea 5878c <_Chain_Get>,%a3
57d04: 49f9 0005 bff8 lea 5bff8 <_Watchdog_Insert>,%a4
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
57d0a: 283c 0000 0700 movel #1792,%d4
head->previous = NULL;
tail->previous = head;
57d10: 2d48 fff0 movel %a0,%fp@(-16)
57d14: 41ea 0008 lea %a2@(8),%a0
57d18: 2d48 ffe0 movel %a0,%fp@(-32)
57d1c: 41ea 0040 lea %a2@(64),%a0
57d20: 2d48 ffe4 movel %a0,%fp@(-28)
{
/*
* 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;
57d24: 41ee ffe8 lea %fp@(-24),%a0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
57d28: 2d40 fff4 movel %d0,%fp@(-12)
head->previous = NULL;
57d2c: 42ae ffec clrl %fp@(-20)
57d30: 42ae fff8 clrl %fp@(-8)
tail->previous = head;
57d34: 2d45 fffc movel %d5,%fp@(-4)
57d38: 2d40 ffd8 movel %d0,%fp@(-40)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
57d3c: 2d46 ffe8 movel %d6,%fp@(-24)
57d40: 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;
57d44: 2039 0007 c3e6 movel 7c3e6 <_Watchdog_Ticks_since_boot>,%d0
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
57d4a: 222a 003c movel %a2@(60),%d1
watchdogs->last_snapshot = snapshot;
57d4e: 2540 003c movel %d0,%a2@(60)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
57d52: 9081 subl %d1,%d0
57d54: 2f05 movel %d5,%sp@-
57d56: 2f00 movel %d0,%sp@-
57d58: 2f03 movel %d3,%sp@-
57d5a: 4e95 jsr %a5@
57d5c: 2f3c 3b9a ca00 movel #1000000000,%sp@-
57d62: 42a7 clrl %sp@-
57d64: 2f39 0007 c2a8 movel 7c2a8 <_TOD+0x4>,%sp@-
57d6a: 2f39 0007 c2a4 movel 7c2a4 <_TOD>,%sp@-
57d70: 4eb9 0006 c3c0 jsr 6c3c0 <__divdi3>
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
57d76: 202a 0074 movel %a2@(116),%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 ) {
57d7a: 4fef 001c lea %sp@(28),%sp
57d7e: b081 cmpl %d1,%d0
57d80: 6500 009a bcsw 57e1c <_Timer_server_Body+0x158>
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
57d84: b081 cmpl %d1,%d0
57d86: 6200 00b8 bhiw 57e40 <_Timer_server_Body+0x17c>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
57d8a: 2541 0074 movel %d1,%a2@(116)
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
57d8e: 202a 0078 movel %a2@(120),%d0
57d92: 2f00 movel %d0,%sp@-
57d94: 4e93 jsr %a3@
if ( timer == NULL ) {
57d96: 588f addql #4,%sp
57d98: 4a80 tstl %d0
57d9a: 672e beqs 57dca <_Timer_server_Body+0x106>
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
57d9c: 2040 moveal %d0,%a0
57d9e: 7e01 moveq #1,%d7
57da0: 2228 0038 movel %a0@(56),%d1
57da4: be81 cmpl %d1,%d7
57da6: 6700 00bc beqw 57e64 <_Timer_server_Body+0x1a0>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
57daa: 7e03 moveq #3,%d7
57dac: be81 cmpl %d1,%d7
57dae: 66de bnes 57d8e <_Timer_server_Body+0xca> <== NEVER TAKEN
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
57db0: 2040 moveal %d0,%a0
57db2: 4868 0010 pea %a0@(16)
57db6: 2f02 movel %d2,%sp@-
57db8: 4e94 jsr %a4@
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
57dba: 202a 0078 movel %a2@(120),%d0
)
{
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 );
57dbe: 508f addql #8,%sp
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
57dc0: 2f00 movel %d0,%sp@-
57dc2: 4e93 jsr %a3@
if ( timer == NULL ) {
57dc4: 588f addql #4,%sp
57dc6: 4a80 tstl %d0
57dc8: 66d2 bnes 57d9c <_Timer_server_Body+0xd8> <== NEVER TAKEN
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
57dca: 2004 movel %d4,%d0
57dcc: 40c1 movew %sr,%d1
57dce: 8081 orl %d1,%d0
57dd0: 46c0 movew %d0,%sr
if ( _Chain_Is_empty( insert_chain ) ) {
57dd2: bcae ffe8 cmpl %fp@(-24),%d6
57dd6: 6700 009a beqw 57e72 <_Timer_server_Body+0x1ae>
ts->insert_chain = NULL;
_ISR_Enable( level );
break;
} else {
_ISR_Enable( level );
57dda: 46c1 movew %d1,%sr <== NOT EXECUTED
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
57ddc: 2039 0007 c3e6 movel 7c3e6 <_Watchdog_Ticks_since_boot>,%d0<== NOT EXECUTED
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
57de2: 222a 003c movel %a2@(60),%d1 <== NOT EXECUTED
watchdogs->last_snapshot = snapshot;
57de6: 2540 003c movel %d0,%a2@(60) <== NOT EXECUTED
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
57dea: 9081 subl %d1,%d0 <== NOT EXECUTED
57dec: 2f05 movel %d5,%sp@- <== NOT EXECUTED
57dee: 2f00 movel %d0,%sp@- <== NOT EXECUTED
57df0: 2f03 movel %d3,%sp@- <== NOT EXECUTED
57df2: 4e95 jsr %a5@ <== NOT EXECUTED
57df4: 2f3c 3b9a ca00 movel #1000000000,%sp@- <== NOT EXECUTED
57dfa: 42a7 clrl %sp@- <== NOT EXECUTED
57dfc: 2f39 0007 c2a8 movel 7c2a8 <_TOD+0x4>,%sp@- <== NOT EXECUTED
57e02: 2f39 0007 c2a4 movel 7c2a4 <_TOD>,%sp@- <== NOT EXECUTED
57e08: 4eb9 0006 c3c0 jsr 6c3c0 <__divdi3> <== NOT EXECUTED
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
57e0e: 202a 0074 movel %a2@(116),%d0 <== NOT EXECUTED
/*
* 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 ) {
57e12: 4fef 001c lea %sp@(28),%sp <== NOT EXECUTED
57e16: b081 cmpl %d1,%d0 <== NOT EXECUTED
57e18: 6400 ff6a bccw 57d84 <_Timer_server_Body+0xc0> <== NOT EXECUTED
/*
* 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 );
57e1c: 2f05 movel %d5,%sp@-
57e1e: 2e01 movel %d1,%d7
57e20: 9e80 subl %d0,%d7
57e22: 2f07 movel %d7,%sp@-
57e24: 2d41 ffdc movel %d1,%fp@(-36)
57e28: 2f02 movel %d2,%sp@-
57e2a: 4eb9 0005 bf6c jsr 5bf6c <_Watchdog_Adjust_to_chain>
57e30: 222e ffdc movel %fp@(-36),%d1
57e34: 4fef 000c lea %sp@(12),%sp
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
57e38: 2541 0074 movel %d1,%a2@(116)
57e3c: 6000 ff50 braw 57d8e <_Timer_server_Body+0xca>
/*
* 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 );
57e40: 9081 subl %d1,%d0
57e42: 2f00 movel %d0,%sp@-
57e44: 4878 0001 pea 1 <ADD>
57e48: 2d41 ffdc movel %d1,%fp@(-36)
57e4c: 2f02 movel %d2,%sp@-
57e4e: 4eb9 0005 bed8 jsr 5bed8 <_Watchdog_Adjust>
57e54: 222e ffdc movel %fp@(-36),%d1
57e58: 4fef 000c lea %sp@(12),%sp
}
watchdogs->last_snapshot = snapshot;
57e5c: 2541 0074 movel %d1,%a2@(116)
57e60: 6000 ff2c braw 57d8e <_Timer_server_Body+0xca>
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
57e64: 4868 0010 pea %a0@(16)
57e68: 2f03 movel %d3,%sp@-
57e6a: 4e94 jsr %a4@
57e6c: 508f addql #8,%sp
57e6e: 6000 ff1e braw 57d8e <_Timer_server_Body+0xca>
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
57e72: 42aa 0078 clrl %a2@(120)
_ISR_Enable( level );
57e76: 46c1 movew %d1,%sr
_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 ) ) {
57e78: 2e2e ffd8 movel %fp@(-40),%d7
57e7c: beae fff4 cmpl %fp@(-12),%d7
57e80: 6758 beqs 57eda <_Timer_server_Body+0x216>
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
57e82: 2004 movel %d4,%d0
57e84: 40c1 movew %sr,%d1
57e86: 8081 orl %d1,%d0
57e88: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
57e8a: 206e fff4 moveal %fp@(-12),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
57e8e: be88 cmpl %a0,%d7
57e90: 673a beqs 57ecc <_Timer_server_Body+0x208> <== NEVER TAKEN
57e92: 2e0a movel %a2,%d7
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
57e94: 2250 moveal %a0@,%a1
head->next = new_first;
new_first->previous = head;
57e96: 45ee fff4 lea %fp@(-12),%a2
57e9a: 234a 0004 movel %a2,%a1@(4)
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
57e9e: 42a8 0008 clrl %a0@(8)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
57ea2: 2d49 fff4 movel %a1,%fp@(-12)
_ISR_Enable( level );
57ea6: 46c1 movew %d1,%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 );
57ea8: 2f28 0024 movel %a0@(36),%sp@-
57eac: 2f28 0020 movel %a0@(32),%sp@-
57eb0: 2068 001c moveal %a0@(28),%a0
57eb4: 4e90 jsr %a0@
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
57eb6: 2004 movel %d4,%d0
57eb8: 40c1 movew %sr,%d1
57eba: 8081 orl %d1,%d0
57ebc: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
57ebe: 508f addql #8,%sp
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
57ec0: 206e fff4 moveal %fp@(-12),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
57ec4: b1ee ffd8 cmpal %fp@(-40),%a0
57ec8: 66ca bnes 57e94 <_Timer_server_Body+0x1d0>
57eca: 2447 moveal %d7,%a2
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
57ecc: 46c1 movew %d1,%sr
{
/*
* 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;
57ece: 41ee ffe8 lea %fp@(-24),%a0
57ed2: 2548 0078 movel %a0,%a2@(120)
57ed6: 6000 fe6c braw 57d44 <_Timer_server_Body+0x80>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
57eda: 4200 clrb %d0
57edc: 1540 007c moveb %d0,%a2@(124)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
57ee0: 2039 0007 c302 movel 7c302 <_Thread_Dispatch_disable_level>,%d0
++level;
57ee6: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
57ee8: 23c0 0007 c302 movel %d0,7c302 <_Thread_Dispatch_disable_level>
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
57eee: 4878 0008 pea 8 <DIVIDE_BY_ZERO>
57ef2: 2f12 movel %a2@,%sp@-
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
57ef4: 7e01 moveq #1,%d7
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
57ef6: 4eb9 0005 bb74 jsr 5bb74 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
57efc: 2f0a movel %a2,%sp@-
57efe: 4eba fb7c jsr %pc@(57a7c <_Timer_server_Reset_interval_system_watchdog>)
_Timer_server_Reset_tod_system_watchdog( ts );
57f02: 2f0a movel %a2,%sp@-
57f04: 4eba fbe0 jsr %pc@(57ae6 <_Timer_server_Reset_tod_system_watchdog>)
_Thread_Enable_dispatch();
57f08: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
ts->active = true;
57f0e: 1547 007c moveb %d7,%a2@(124)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
57f12: 2f2e ffe0 movel %fp@(-32),%sp@-
57f16: 4eb9 0005 c128 jsr 5c128 <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
57f1c: 2f2e ffe4 movel %fp@(-28),%sp@-
57f20: 4eb9 0005 c128 jsr 5c128 <_Watchdog_Remove>
57f26: 4fef 0018 lea %sp@(24),%sp
{
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
57f2a: 41ee ffe8 lea %fp@(-24),%a0
57f2e: 2548 0078 movel %a0,%a2@(120)
57f32: 6000 fe10 braw 57d44 <_Timer_server_Body+0x80>
00057b54 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
57b54: 4e56 fff0 linkw %fp,#-16
57b58: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
57b5c: 246e 0008 moveal %fp@(8),%a2
57b60: 266e 000c moveal %fp@(12),%a3
if ( ts->insert_chain == NULL ) {
57b64: 202a 0078 movel %a2@(120),%d0
57b68: 671a beqs 57b84 <_Timer_server_Schedule_operation_method+0x30>
* 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 );
57b6a: 246a 0078 moveal %a2@(120),%a2
57b6e: 2d4b 000c movel %a3,%fp@(12)
57b72: 2d4a 0008 movel %a2,%fp@(8)
}
}
57b76: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
57b7c: 4e5e unlk %fp
* 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 );
57b7e: 4ef9 0005 8754 jmp 58754 <_Chain_Append>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
57b84: 2039 0007 c302 movel 7c302 <_Thread_Dispatch_disable_level>,%d0
++level;
57b8a: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
57b8c: 23c0 0007 c302 movel %d0,7c302 <_Thread_Dispatch_disable_level>
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
57b92: 202b 0038 movel %a3@(56),%d0
57b96: 7201 moveq #1,%d1
57b98: b280 cmpl %d0,%d1
57b9a: 6700 009e beqw 57c3a <_Timer_server_Schedule_operation_method+0xe6>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
if ( !ts->active ) {
_Timer_server_Reset_interval_system_watchdog( ts );
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
57b9e: 7603 moveq #3,%d3
57ba0: b680 cmpl %d0,%d3
57ba2: 670e beqs 57bb2 <_Timer_server_Schedule_operation_method+0x5e>
* 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 );
}
}
57ba4: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
57baa: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
57bac: 4ef9 0005 b1e8 jmp 5b1e8 <_Thread_Enable_dispatch>
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
57bb2: 203c 0000 0700 movel #1792,%d0
57bb8: 40c2 movew %sr,%d2
57bba: 8082 orl %d2,%d0
57bbc: 46c0 movew %d0,%sr
57bbe: 2f3c 3b9a ca00 movel #1000000000,%sp@-
57bc4: 42a7 clrl %sp@-
57bc6: 2f39 0007 c2a8 movel 7c2a8 <_TOD+0x4>,%sp@-
57bcc: 2f39 0007 c2a4 movel 7c2a4 <_TOD>,%sp@-
57bd2: 4eb9 0006 c3c0 jsr 6c3c0 <__divdi3>
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
57bd8: 202a 0074 movel %a2@(116),%d0
57bdc: 4fef 0010 lea %sp@(16),%sp
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
57be0: 43ea 006c lea %a2@(108),%a1
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
57be4: 206a 0068 moveal %a2@(104),%a0
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
57be8: b3c8 cmpal %a0,%a1
57bea: 671c beqs 57c08 <_Timer_server_Schedule_operation_method+0xb4>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
57bec: 2268 0010 moveal %a0@(16),%a1
if ( snapshot > last_snapshot ) {
57bf0: b081 cmpl %d1,%d0
57bf2: 6400 00ba bccw 57cae <_Timer_server_Schedule_operation_method+0x15a>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
57bf6: 2601 movel %d1,%d3
57bf8: 9680 subl %d0,%d3
if (delta_interval > delta) {
57bfa: b689 cmpl %a1,%d3
57bfc: 6400 00bc bccw 57cba <_Timer_server_Schedule_operation_method+0x166>
delta_interval -= delta;
57c00: 93c3 subal %d3,%a1
57c02: 2009 movel %a1,%d0
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
57c04: 2140 0010 movel %d0,%a0@(16)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
57c08: 2541 0074 movel %d1,%a2@(116)
_ISR_Enable( level );
57c0c: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
57c0e: 486b 0010 pea %a3@(16)
57c12: 486a 0068 pea %a2@(104)
57c16: 4eb9 0005 bff8 jsr 5bff8 <_Watchdog_Insert>
if ( !ts->active ) {
57c1c: 508f addql #8,%sp
57c1e: 102a 007c moveb %a2@(124),%d0
57c22: 6680 bnes 57ba4 <_Timer_server_Schedule_operation_method+0x50><== NEVER TAKEN
_Timer_server_Reset_tod_system_watchdog( ts );
57c24: 2f0a movel %a2,%sp@-
57c26: 4eba febe jsr %pc@(57ae6 <_Timer_server_Reset_tod_system_watchdog>)
57c2a: 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 );
}
}
57c2c: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
57c32: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
57c34: 4ef9 0005 b1e8 jmp 5b1e8 <_Thread_Enable_dispatch>
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
57c3a: 203c 0000 0700 movel #1792,%d0
57c40: 40c2 movew %sr,%d2
57c42: 8082 orl %d2,%d0
57c44: 46c0 movew %d0,%sr
snapshot = _Watchdog_Ticks_since_boot;
57c46: 2039 0007 c3e6 movel 7c3e6 <_Watchdog_Ticks_since_boot>,%d0
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
57c4c: 220a movel %a2,%d1
57c4e: 0681 0000 0034 addil #52,%d1
last_snapshot = ts->Interval_watchdogs.last_snapshot;
57c54: 262a 003c movel %a2@(60),%d3
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
57c58: 206a 0030 moveal %a2@(48),%a0
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
57c5c: b288 cmpl %a0,%d1
57c5e: 6712 beqs 57c72 <_Timer_server_Schedule_operation_method+0x11e>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
57c60: 2200 movel %d0,%d1
57c62: 9283 subl %d3,%d1
delta_interval = first_watchdog->delta_interval;
57c64: 2268 0010 moveal %a0@(16),%a1
if (delta_interval > delta) {
57c68: b3c1 cmpal %d1,%a1
57c6a: 633a blss 57ca6 <_Timer_server_Schedule_operation_method+0x152>
delta_interval -= delta;
57c6c: 93c1 subal %d1,%a1
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
57c6e: 2149 0010 movel %a1,%a0@(16)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
57c72: 2540 003c movel %d0,%a2@(60)
_ISR_Enable( level );
57c76: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
57c78: 486b 0010 pea %a3@(16)
57c7c: 486a 0030 pea %a2@(48)
57c80: 4eb9 0005 bff8 jsr 5bff8 <_Watchdog_Insert>
if ( !ts->active ) {
57c86: 508f addql #8,%sp
57c88: 102a 007c moveb %a2@(124),%d0
57c8c: 6600 ff16 bnew 57ba4 <_Timer_server_Schedule_operation_method+0x50>
_Timer_server_Reset_interval_system_watchdog( ts );
57c90: 2f0a movel %a2,%sp@-
57c92: 4eba fde8 jsr %pc@(57a7c <_Timer_server_Reset_interval_system_watchdog>)
57c96: 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 );
}
}
57c98: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
57c9e: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
57ca0: 4ef9 0005 b1e8 jmp 5b1e8 <_Thread_Enable_dispatch>
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
57ca6: 93c9 subal %a1,%a1
}
first_watchdog->delta_interval = delta_interval;
57ca8: 2149 0010 movel %a1,%a0@(16)
57cac: 60c4 bras 57c72 <_Timer_server_Schedule_operation_method+0x11e>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
57cae: d089 addl %a1,%d0
delta_interval += delta;
57cb0: 9081 subl %d1,%d0
}
first_watchdog->delta_interval = delta_interval;
57cb2: 2140 0010 movel %d0,%a0@(16)
57cb6: 6000 ff50 braw 57c08 <_Timer_server_Schedule_operation_method+0xb4>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
57cba: 4280 clrl %d0 <== NOT EXECUTED
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
57cbc: 2140 0010 movel %d0,%a0@(16) <== NOT EXECUTED
57cc0: 6000 ff46 braw 57c08 <_Timer_server_Schedule_operation_method+0xb4><== NOT EXECUTED
0004ac84 <_Timespec_Add_to>:
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
4ac84: 4e56 0000 linkw %fp,#0
4ac88: 226e 000c moveal %fp@(12),%a1
4ac8c: 2f0a movel %a2,%sp@-
4ac8e: 246e 0008 moveal %fp@(8),%a2
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
4ac92: 206a 0004 moveal %a2@(4),%a0
4ac96: d1e9 0004 addal %a1@(4),%a0
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
4ac9a: 2208 movel %a0,%d1
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
uint32_t seconds = add->tv_sec;
4ac9c: 2011 movel %a1@,%d0
/* Add the basics */
time->tv_sec += add->tv_sec;
4ac9e: d192 addl %d0,%a2@
time->tv_nsec += add->tv_nsec;
4aca0: 2548 0004 movel %a0,%a2@(4)
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
4aca4: b1fc 3b9a c9ff cmpal #999999999,%a0
4acaa: 6320 blss 4accc <_Timespec_Add_to+0x48>
4acac: 2052 moveal %a2@,%a0
4acae: 5288 addql #1,%a0
#include <sys/types.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
uint32_t _Timespec_Add_to(
4acb0: 91c0 subal %d0,%a0
4acb2: 43f0 0800 lea %a0@(00000000,%d0:l),%a1
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
4acb6: 0681 c465 3600 addil #-1000000000,%d1
time->tv_sec++;
seconds++;
4acbc: 5280 addql #1,%d0
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
4acbe: 0c81 3b9a c9ff cmpil #999999999,%d1
4acc4: 62ec bhis 4acb2 <_Timespec_Add_to+0x2e> <== NEVER TAKEN
4acc6: 2541 0004 movel %d1,%a2@(4)
4acca: 2489 movel %a1,%a2@
time->tv_sec++;
seconds++;
}
return seconds;
}
4accc: 245f moveal %sp@+,%a2
4acce: 4e5e unlk %fp
...
0004bfe0 <_Timestamp64_Divide>:
const Timestamp64_Control *_lhs,
const Timestamp64_Control *_rhs,
uint32_t *_ival_percentage,
uint32_t *_fval_percentage
)
{
4bfe0: 4e56 fff4 linkw %fp,#-12
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
4bfe4: 206e 000c moveal %fp@(12),%a0
const Timestamp64_Control *_lhs,
const Timestamp64_Control *_rhs,
uint32_t *_ival_percentage,
uint32_t *_fval_percentage
)
{
4bfe8: 48d7 040c moveml %d2-%d3/%a2,%sp@
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
4bfec: 2410 movel %a0@,%d2
4bfee: 2628 0004 movel %a0@(4),%d3
4bff2: 2002 movel %d2,%d0
4bff4: 8083 orl %d3,%d0
4bff6: 676e beqs 4c066 <_Timestamp64_Divide+0x86> <== NEVER TAKEN
* This looks odd but gives the results the proper precision.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
4bff8: 206e 0008 moveal %fp@(8),%a0
4bffc: 45f9 0005 c83c lea 5c83c <__divdi3>,%a2
4c002: 2f3c 0001 86a0 movel #100000,%sp@-
4c008: 42a7 clrl %sp@-
4c00a: 2f28 0004 movel %a0@(4),%sp@-
4c00e: 2f10 movel %a0@,%sp@-
4c010: 4eb9 0005 c7d4 jsr 5c7d4 <__muldi3>
4c016: 4fef 000c lea %sp@(12),%sp
4c01a: 2e83 movel %d3,%sp@
4c01c: 2f02 movel %d2,%sp@-
4c01e: 2f01 movel %d1,%sp@-
4c020: 2f00 movel %d0,%sp@-
4c022: 4e92 jsr %a2@
4c024: 4fef 0010 lea %sp@(16),%sp
4c028: 2400 movel %d0,%d2
*_ival_percentage = answer / 1000;
4c02a: 4878 03e8 pea 3e8 <DBL_MANT_DIG+0x3b3>
* This looks odd but gives the results the proper precision.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
4c02e: 2601 movel %d1,%d3
*_ival_percentage = answer / 1000;
4c030: 42a7 clrl %sp@-
4c032: 2f01 movel %d1,%sp@-
4c034: 2f02 movel %d2,%sp@-
4c036: 4e92 jsr %a2@
4c038: 4fef 0010 lea %sp@(16),%sp
*_fval_percentage = answer % 1000;
4c03c: 4878 03e8 pea 3e8 <DBL_MANT_DIG+0x3b3>
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
4c040: 206e 0010 moveal %fp@(16),%a0
*_fval_percentage = answer % 1000;
4c044: 42a7 clrl %sp@-
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
4c046: 2081 movel %d1,%a0@
*_fval_percentage = answer % 1000;
4c048: 2f03 movel %d3,%sp@-
4c04a: 2f02 movel %d2,%sp@-
4c04c: 4eb9 0005 cc9c jsr 5cc9c <__moddi3>
4c052: 206e 0014 moveal %fp@(20),%a0
4c056: 4fef 0010 lea %sp@(16),%sp
}
4c05a: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
*/
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
*_fval_percentage = answer % 1000;
4c060: 2081 movel %d1,%a0@
}
4c062: 4e5e unlk %fp
4c064: 4e75 rts
)
{
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
*_ival_percentage = 0;
4c066: 206e 0010 moveal %fp@(16),%a0 <== NOT EXECUTED
4c06a: 4290 clrl %a0@ <== NOT EXECUTED
*_fval_percentage = 0;
4c06c: 206e 0014 moveal %fp@(20),%a0 <== NOT EXECUTED
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
*_fval_percentage = answer % 1000;
}
4c070: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2 <== NOT EXECUTED
{
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
*_ival_percentage = 0;
*_fval_percentage = 0;
4c076: 4290 clrl %a0@ <== NOT EXECUTED
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
*_fval_percentage = answer % 1000;
}
4c078: 4e5e unlk %fp <== NOT EXECUTED
0004a86c <_User_extensions_Handler_initialization>:
void _User_extensions_Handler_initialization(void)
{
4a86c: 4e56 fffc linkw %fp,#-4
uint32_t number_of_initial_extensions =
4a870: 2039 0005 c614 movel 5c614 <Configuration+0x40>,%d0
rtems_configuration_get_number_of_initial_extensions();
if ( number_of_initial_extensions > 0 ) {
4a876: 6604 bnes 4a87c <_User_extensions_Handler_initialization+0x10><== ALWAYS TAKEN
);
User_extensions_Switch_context ctx = { initial_extension_switch_controls };
_User_extensions_Iterate( &ctx, _User_extensions_Switch_visitor );
}
}
4a878: 4e5e unlk %fp <== NOT EXECUTED
4a87a: 4e75 rts <== NOT EXECUTED
uint32_t number_of_initial_extensions =
rtems_configuration_get_number_of_initial_extensions();
if ( number_of_initial_extensions > 0 ) {
User_extensions_Switch_control *initial_extension_switch_controls =
_Workspace_Allocate_or_fatal_error(
4a87c: 2200 movel %d0,%d1
4a87e: e988 lsll #4,%d0
4a880: e589 lsll #2,%d1
{
uint32_t number_of_initial_extensions =
rtems_configuration_get_number_of_initial_extensions();
if ( number_of_initial_extensions > 0 ) {
User_extensions_Switch_control *initial_extension_switch_controls =
4a882: 9081 subl %d1,%d0
4a884: 2f00 movel %d0,%sp@-
4a886: 4eb9 0004 ac2a jsr 4ac2a <_Workspace_Allocate_or_fatal_error>
_Workspace_Allocate_or_fatal_error(
number_of_initial_extensions
* sizeof( *initial_extension_switch_controls )
);
User_extensions_Switch_context ctx = { initial_extension_switch_controls };
4a88c: 204e moveal %fp,%a0
4a88e: 2100 movel %d0,%a0@-
_User_extensions_Iterate( &ctx, _User_extensions_Switch_visitor );
4a890: 487a ff9a pea %pc@(4a82c <_User_extensions_Switch_visitor>)
4a894: 2f08 movel %a0,%sp@-
4a896: 4eb9 0004 a7b8 jsr 4a7b8 <_User_extensions_Iterate>
4a89c: 4fef 000c lea %sp@(12),%sp
}
}
4a8a0: 4e5e unlk %fp <== NOT EXECUTED
0004a7b8 <_User_extensions_Iterate>:
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
4a7b8: 4e56 ffec linkw %fp,#-20
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
rtems_configuration_get_user_extension_table();
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
4a7bc: 2039 0005 c614 movel 5c614 <Configuration+0x40>,%d0
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
4a7c2: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
rtems_configuration_get_user_extension_table();
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
4a7c6: eb88 lsll #5,%d0
void *arg,
User_extensions_Visitor visitor
)
{
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
4a7c8: 2439 0005 c618 movel 5c618 <Configuration+0x44>,%d2
rtems_configuration_get_user_extension_table();
const User_extensions_Table *callouts_end =
4a7ce: 2442 moveal %d2,%a2
4a7d0: d5c0 addal %d0,%a2
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
4a7d2: 282e 0008 movel %fp@(8),%d4
4a7d6: 266e 000c moveal %fp@(12),%a3
Thread_Control *executing = _Thread_Executing;
4a7da: 2639 0005 fb7e movel 5fb7e <_Per_CPU_Information+0xe>,%d3
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
4a7e0: b5c2 cmpal %d2,%a2
4a7e2: 6716 beqs 4a7fa <_User_extensions_Iterate+0x42> <== NEVER TAKEN
(*visitor)( executing, arg, callouts_current );
4a7e4: 2f02 movel %d2,%sp@-
++callouts_current;
4a7e6: 0682 0000 0020 addil #32,%d2
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
(*visitor)( executing, arg, callouts_current );
4a7ec: 2f04 movel %d4,%sp@-
4a7ee: 2f03 movel %d3,%sp@-
4a7f0: 4e93 jsr %a3@
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
4a7f2: 4fef 000c lea %sp@(12),%sp
4a7f6: b48a cmpl %a2,%d2
4a7f8: 66ea bnes 4a7e4 <_User_extensions_Iterate+0x2c>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
4a7fa: 2479 0005 e33c moveal 5e33c <_User_extensions_List>,%a2
++callouts_current;
}
node = _Chain_Immutable_first( &_User_extensions_List );
tail = _Chain_Immutable_tail( &_User_extensions_List );
while ( node != tail ) {
4a800: b5fc 0005 e340 cmpal #385856,%a2
4a806: 6718 beqs 4a820 <_User_extensions_Iterate+0x68>
const User_extensions_Control *extension =
(const User_extensions_Control *) node;
(*visitor)( executing, arg, &extension->Callouts );
4a808: 486a 0014 pea %a2@(20)
4a80c: 2f04 movel %d4,%sp@-
4a80e: 2f03 movel %d3,%sp@-
4a810: 4e93 jsr %a3@
node = _Chain_Immutable_next( node );
}
}
4a812: 2452 moveal %a2@,%a2
++callouts_current;
}
node = _Chain_Immutable_first( &_User_extensions_List );
tail = _Chain_Immutable_tail( &_User_extensions_List );
while ( node != tail ) {
4a814: 4fef 000c lea %sp@(12),%sp
4a818: b5fc 0005 e340 cmpal #385856,%a2
4a81e: 66e8 bnes 4a808 <_User_extensions_Iterate+0x50>
(*visitor)( executing, arg, &extension->Callouts );
node = _Chain_Immutable_next( node );
}
}
4a820: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
4a826: 4e5e unlk %fp
...
0004c28c <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
4c28c: 4e56 ffe8 linkw %fp,#-24
4c290: 226e 000c moveal %fp@(12),%a1
4c294: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%sp@
ISR_Level level;
_ISR_Disable( level );
4c298: 263c 0000 0700 movel #1792,%d3
4c29e: 2003 movel %d3,%d0
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
4c2a0: 266e 0008 moveal %fp@(8),%a3
4c2a4: 242e 0010 movel %fp@(16),%d2
ISR_Level level;
_ISR_Disable( level );
4c2a8: 40c1 movew %sr,%d1
4c2aa: 8081 orl %d1,%d0
4c2ac: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
4c2ae: 244b moveal %a3,%a2
4c2b0: 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 ) ) {
4c2b2: b5c8 cmpal %a0,%a2
4c2b4: 6746 beqs 4c2fc <_Watchdog_Adjust+0x70>
switch ( direction ) {
4c2b6: 4a89 tstl %a1
4c2b8: 664e bnes 4c308 <_Watchdog_Adjust+0x7c>
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
4c2ba: 4a82 tstl %d2
4c2bc: 673e beqs 4c2fc <_Watchdog_Adjust+0x70> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
4c2be: 2028 0010 movel %a0@(16),%d0
4c2c2: b082 cmpl %d2,%d0
4c2c4: 6230 bhis 4c2f6 <_Watchdog_Adjust+0x6a> <== NEVER TAKEN
4c2c6: 49f9 0004 c4f0 lea 4c4f0 <_Watchdog_Tickle>,%a4
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
4c2cc: 7801 moveq #1,%d4
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
4c2ce: 9480 subl %d0,%d2
_Watchdog_First( header )->delta_interval = 1;
4c2d0: 2144 0010 movel %d4,%a0@(16)
_ISR_Enable( level );
4c2d4: 46c1 movew %d1,%sr
_Watchdog_Tickle( header );
4c2d6: 2f0b movel %a3,%sp@-
4c2d8: 4e94 jsr %a4@
_ISR_Disable( level );
4c2da: 2003 movel %d3,%d0
4c2dc: 40c1 movew %sr,%d1
4c2de: 8081 orl %d1,%d0
4c2e0: 46c0 movew %d0,%sr
if ( _Chain_Is_empty( header ) )
4c2e2: 588f addql #4,%sp
4c2e4: 2053 moveal %a3@,%a0
4c2e6: b1ca cmpal %a2,%a0
4c2e8: 6712 beqs 4c2fc <_Watchdog_Adjust+0x70>
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
4c2ea: 4a82 tstl %d2
4c2ec: 670e beqs 4c2fc <_Watchdog_Adjust+0x70> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
4c2ee: 2028 0010 movel %a0@(16),%d0
4c2f2: b480 cmpl %d0,%d2
4c2f4: 64d6 bccs 4c2cc <_Watchdog_Adjust+0x40>
_Watchdog_First( header )->delta_interval -= units;
4c2f6: 9082 subl %d2,%d0
4c2f8: 2140 0010 movel %d0,%a0@(16)
}
break;
}
}
_ISR_Enable( level );
4c2fc: 46c1 movew %d1,%sr
}
4c2fe: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
4c304: 4e5e unlk %fp
4c306: 4e75 rts
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
4c308: 7001 moveq #1,%d0
4c30a: b089 cmpl %a1,%d0
4c30c: 66ee bnes 4c2fc <_Watchdog_Adjust+0x70> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
4c30e: d5a8 0010 addl %d2,%a0@(16)
}
break;
}
}
_ISR_Enable( level );
4c312: 46c1 movew %d1,%sr
}
4c314: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
4c31a: 4e5e unlk %fp
...
0005bf6c <_Watchdog_Adjust_to_chain>:
Chain_Control *header,
Watchdog_Interval units_arg,
Chain_Control *to_fire
)
{
5bf6c: 4e56 ffe4 linkw %fp,#-28
5bf70: 226e 0010 moveal %fp@(16),%a1
5bf74: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
Watchdog_Interval units = units_arg;
ISR_Level level;
Watchdog_Control *first;
_ISR_Disable( level );
5bf78: 263c 0000 0700 movel #1792,%d3
5bf7e: 2003 movel %d3,%d0
Chain_Control *header,
Watchdog_Interval units_arg,
Chain_Control *to_fire
)
{
5bf80: 242e 0008 movel %fp@(8),%d2
Watchdog_Interval units = units_arg;
ISR_Level level;
Watchdog_Control *first;
_ISR_Disable( level );
5bf84: 40c1 movew %sr,%d1
5bf86: 8081 orl %d1,%d0
5bf88: 46c0 movew %d0,%sr
5bf8a: 2a42 moveal %d2,%a5
Watchdog_Interval units_arg,
Chain_Control *to_fire
)
{
Watchdog_Interval units = units_arg;
5bf8c: 282e 000c movel %fp@(12),%d4
5bf90: 205d moveal %a5@+,%a0
Watchdog_Control *first;
_ISR_Disable( level );
while ( 1 ) {
if ( _Chain_Is_empty( header ) ) {
5bf92: b1cd cmpal %a5,%a0
5bf94: 6748 beqs 5bfde <_Watchdog_Adjust_to_chain+0x72>
/*
* If it is longer than "units" until the first element on the chain
* fires, then bump it and quit.
*/
if ( units < first->delta_interval ) {
5bf96: 2028 0010 movel %a0@(16),%d0
5bf9a: b084 cmpl %d4,%d0
5bf9c: 624a bhis 5bfe8 <_Watchdog_Adjust_to_chain+0x7c>
/*
* The first set happens in less than units, so take all of them
* off the chain and adjust units to reflect this.
*/
units -= first->delta_interval;
5bf9e: 9880 subl %d0,%d4
first->delta_interval = 0;
5bfa0: 42a8 0010 clrl %a0@(16)
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
5bfa4: 2850 moveal %a0@,%a4
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
5bfa6: 2009 movel %a1,%d0
5bfa8: 5880 addql #4,%d0
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
5bfaa: 2668 0004 moveal %a0@(4),%a3
next->previous = previous;
5bfae: 294b 0004 movel %a3,%a4@(4)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
5bfb2: 2469 0008 moveal %a1@(8),%a2
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
next->previous = previous;
previous->next = next;
5bfb6: 268c movel %a4,%a3@
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
5bfb8: 2348 0008 movel %a0,%a1@(8)
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
5bfbc: 2080 movel %d0,%a0@
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
old_last->next = the_node;
the_node->previous = old_last;
5bfbe: 214a 0004 movel %a2,%a0@(4)
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
old_last->next = the_node;
5bfc2: 2488 movel %a0,%a2@
while ( 1 ) {
_Chain_Extract_unprotected( &first->Node );
_Chain_Append_unprotected( to_fire, &first->Node );
_ISR_Flash( level );
5bfc4: 2003 movel %d3,%d0
5bfc6: 46c1 movew %d1,%sr
5bfc8: 8081 orl %d1,%d0
5bfca: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
5bfcc: 2442 moveal %d2,%a2
5bfce: 2052 moveal %a2@,%a0
if ( _Chain_Is_empty( header ) )
5bfd0: b1cd cmpal %a5,%a0
5bfd2: 67be beqs 5bf92 <_Watchdog_Adjust_to_chain+0x26>
break;
first = _Watchdog_First( header );
if ( first->delta_interval != 0 )
5bfd4: 4aa8 0010 tstl %a0@(16)
5bfd8: 67ca beqs 5bfa4 <_Watchdog_Adjust_to_chain+0x38>
Watchdog_Control *first;
_ISR_Disable( level );
while ( 1 ) {
if ( _Chain_Is_empty( header ) ) {
5bfda: b1cd cmpal %a5,%a0
5bfdc: 66b8 bnes 5bf96 <_Watchdog_Adjust_to_chain+0x2a> <== ALWAYS TAKEN
if ( first->delta_interval != 0 )
break;
}
}
_ISR_Enable( level );
5bfde: 46c1 movew %d1,%sr
}
5bfe0: 4cd7 3c1c moveml %sp@,%d2-%d4/%a2-%a5
5bfe4: 4e5e unlk %fp
5bfe6: 4e75 rts
/*
* If it is longer than "units" until the first element on the chain
* fires, then bump it and quit.
*/
if ( units < first->delta_interval ) {
first->delta_interval -= units;
5bfe8: 9084 subl %d4,%d0
5bfea: 2140 0010 movel %d0,%a0@(16)
if ( first->delta_interval != 0 )
break;
}
}
_ISR_Enable( level );
5bfee: 46c1 movew %d1,%sr
}
5bff0: 4cd7 3c1c moveml %sp@,%d2-%d4/%a2-%a5
5bff4: 4e5e unlk %fp <== NOT EXECUTED
0004a8a4 <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
4a8a4: 4e56 fff0 linkw %fp,#-16
4a8a8: 226e 000c moveal %fp@(12),%a1
4a8ac: 48d7 041c moveml %d2-%d4/%a2,%sp@
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
_ISR_Disable( level );
4a8b0: 283c 0000 0700 movel #1792,%d4
4a8b6: 2004 movel %d4,%d0
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
4a8b8: 2639 0005 fb78 movel 5fb78 <_Per_CPU_Information+0x8>,%d3
_ISR_Disable( level );
4a8be: 40c2 movew %sr,%d2
4a8c0: 8082 orl %d2,%d0
4a8c2: 46c0 movew %d0,%sr
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
4a8c4: 4aa9 0008 tstl %a1@(8)
4a8c8: 6600 009c bnew 4a966 <_Watchdog_Insert+0xc2>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
4a8cc: 2039 0005 fae6 movel 5fae6 <_Watchdog_Sync_count>,%d0
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
4a8d2: 7201 moveq #1,%d1
_Watchdog_Sync_count++;
4a8d4: 5280 addql #1,%d0
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
4a8d6: 2341 0008 movel %d1,%a1@(8)
_Watchdog_Sync_count++;
4a8da: 23c0 0005 fae6 movel %d0,5fae6 <_Watchdog_Sync_count>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4a8e0: 246e 0008 moveal %fp@(8),%a2
restart:
delta_interval = the_watchdog->initial;
4a8e4: 2029 000c movel %a1@(12),%d0
4a8e8: 2052 moveal %a2@,%a0
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
4a8ea: 6740 beqs 4a92c <_Watchdog_Insert+0x88>
4a8ec: 4a90 tstl %a0@
4a8ee: 673c beqs 4a92c <_Watchdog_Insert+0x88>
break;
if ( delta_interval < after->delta_interval ) {
4a8f0: 2228 0010 movel %a0@(16),%d1
4a8f4: b280 cmpl %d0,%d1
4a8f6: 622e bhis 4a926 <_Watchdog_Insert+0x82>
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
4a8f8: 9081 subl %d1,%d0
_ISR_Flash( level );
4a8fa: 2204 movel %d4,%d1
4a8fc: 46c2 movew %d2,%sr
4a8fe: 8282 orl %d2,%d1
4a900: 46c1 movew %d1,%sr
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
4a902: 7201 moveq #1,%d1
4a904: b2a9 0008 cmpl %a1@(8),%d1
4a908: 6648 bnes 4a952 <_Watchdog_Insert+0xae>
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
4a90a: 2239 0005 fa8e movel 5fa8e <_Watchdog_Sync_level>,%d1
4a910: b283 cmpl %d3,%d1
4a912: 625c bhis 4a970 <_Watchdog_Insert+0xcc>
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
4a914: 2050 moveal %a0@,%a0
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
4a916: 4a80 tstl %d0
4a918: 6712 beqs 4a92c <_Watchdog_Insert+0x88>
4a91a: 4a90 tstl %a0@
4a91c: 670e beqs 4a92c <_Watchdog_Insert+0x88>
break;
if ( delta_interval < after->delta_interval ) {
4a91e: 2228 0010 movel %a0@(16),%d1
4a922: b081 cmpl %d1,%d0
4a924: 64d2 bccs 4a8f8 <_Watchdog_Insert+0x54>
after->delta_interval -= delta_interval;
4a926: 9280 subl %d0,%d1
4a928: 2141 0010 movel %d1,%a0@(16)
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
4a92c: 2068 0004 moveal %a0@(4),%a0
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
4a930: 7202 moveq #2,%d1
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
4a932: 2450 moveal %a0@,%a2
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
4a934: 2340 0010 movel %d0,%a1@(16)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
4a938: 2039 0005 faea movel 5faea <_Watchdog_Ticks_since_boot>,%d0
4a93e: 2341 0008 movel %d1,%a1@(8)
4a942: 2340 0014 movel %d0,%a1@(20)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
4a946: 2348 0004 movel %a0,%a1@(4)
before_node = after_node->next;
after_node->next = the_node;
4a94a: 2089 movel %a1,%a0@
the_node->next = before_node;
before_node->previous = the_node;
4a94c: 2549 0004 movel %a1,%a2@(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;
4a950: 228a movel %a2,%a1@
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
4a952: 23c3 0005 fa8e movel %d3,5fa8e <_Watchdog_Sync_level>
_Watchdog_Sync_count--;
4a958: 2039 0005 fae6 movel 5fae6 <_Watchdog_Sync_count>,%d0
4a95e: 5380 subql #1,%d0
4a960: 23c0 0005 fae6 movel %d0,5fae6 <_Watchdog_Sync_count>
_ISR_Enable( level );
4a966: 46c2 movew %d2,%sr
}
4a968: 4cd7 041c moveml %sp@,%d2-%d4/%a2
4a96c: 4e5e unlk %fp
4a96e: 4e75 rts
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
_Watchdog_Sync_level = insert_isr_nest_level;
4a970: 23c3 0005 fa8e movel %d3,5fa8e <_Watchdog_Sync_level>
goto restart;
4a976: 6000 ff68 braw 4a8e0 <_Watchdog_Insert+0x3c>
...
0004a9d4 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
4a9d4: 203c 0000 0700 movel #1792,%d0
#include <rtems/score/watchdog.h>
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
4a9da: 4e56 0000 linkw %fp,#0
4a9de: 206e 0008 moveal %fp@(8),%a0
4a9e2: 2f0a movel %a2,%sp@-
4a9e4: 2f02 movel %d2,%sp@-
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
4a9e6: 40c1 movew %sr,%d1
4a9e8: 8081 orl %d1,%d0
4a9ea: 46c0 movew %d0,%sr
previous_state = the_watchdog->state;
4a9ec: 2028 0008 movel %a0@(8),%d0
switch ( previous_state ) {
4a9f0: 7401 moveq #1,%d2
4a9f2: b480 cmpl %d0,%d2
4a9f4: 6764 beqs 4aa5a <_Watchdog_Remove+0x86>
4a9f6: 6314 blss 4aa0c <_Watchdog_Remove+0x38>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
4a9f8: 2439 0005 faea movel 5faea <_Watchdog_Ticks_since_boot>,%d2
4a9fe: 2142 0018 movel %d2,%a0@(24)
_ISR_Enable( level );
4aa02: 46c1 movew %d1,%sr
return( previous_state );
}
4aa04: 241f movel %sp@+,%d2
4aa06: 245f moveal %sp@+,%a2
4aa08: 4e5e unlk %fp
4aa0a: 4e75 rts
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
4aa0c: 143c 0003 moveb #3,%d2
4aa10: b480 cmpl %d0,%d2
4aa12: 65e4 bcss 4a9f8 <_Watchdog_Remove+0x24> <== NEVER TAKEN
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
4aa14: 2250 moveal %a0@,%a1
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
4aa16: 42a8 0008 clrl %a0@(8)
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
4aa1a: 4a91 tstl %a1@
4aa1c: 6708 beqs 4aa26 <_Watchdog_Remove+0x52>
next_watchdog->delta_interval += the_watchdog->delta_interval;
4aa1e: 2428 0010 movel %a0@(16),%d2
4aa22: d5a9 0010 addl %d2,%a1@(16)
if ( _Watchdog_Sync_count )
4aa26: 2479 0005 fae6 moveal 5fae6 <_Watchdog_Sync_count>,%a2
4aa2c: 4a8a tstl %a2
4aa2e: 670c beqs 4aa3c <_Watchdog_Remove+0x68>
_Watchdog_Sync_level = _ISR_Nest_level;
4aa30: 45f9 0005 fb78 lea 5fb78 <_Per_CPU_Information+0x8>,%a2
4aa36: 23d2 0005 fa8e movel %a2@,5fa8e <_Watchdog_Sync_level>
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
4aa3c: 2468 0004 moveal %a0@(4),%a2
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
4aa40: 2439 0005 faea movel 5faea <_Watchdog_Ticks_since_boot>,%d2
next->previous = previous;
4aa46: 234a 0004 movel %a2,%a1@(4)
previous->next = next;
4aa4a: 2489 movel %a1,%a2@
4aa4c: 2142 0018 movel %d2,%a0@(24)
_ISR_Enable( level );
4aa50: 46c1 movew %d1,%sr
return( previous_state );
}
4aa52: 241f movel %sp@+,%d2
4aa54: 245f moveal %sp@+,%a2
4aa56: 4e5e unlk %fp
4aa58: 4e75 rts
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
4aa5a: 2439 0005 faea movel 5faea <_Watchdog_Ticks_since_boot>,%d2
/*
* 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;
4aa60: 42a8 0008 clrl %a0@(8)
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
4aa64: 2142 0018 movel %d2,%a0@(24)
_ISR_Enable( level );
4aa68: 46c1 movew %d1,%sr
return( previous_state );
}
4aa6a: 241f movel %sp@+,%d2
4aa6c: 245f moveal %sp@+,%a2
4aa6e: 4e5e unlk %fp
...
0004bbcc <_Watchdog_Report_chain>:
)
{
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
4bbcc: 203c 0000 0700 movel #1792,%d0
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
4bbd2: 4e56 ffe8 linkw %fp,#-24
4bbd6: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
4bbda: 242e 0008 movel %fp@(8),%d2
4bbde: 266e 000c moveal %fp@(12),%a3
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
4bbe2: 40c3 movew %sr,%d3
4bbe4: 8083 orl %d3,%d0
4bbe6: 46c0 movew %d0,%sr
printk( "Watchdog Chain: %s %p\n", name, header );
4bbe8: 2f0b movel %a3,%sp@-
4bbea: 4bf9 0004 4990 lea 44990 <printk>,%a5
4bbf0: 2f02 movel %d2,%sp@-
4bbf2: 4879 0005 f213 pea 5f213 <_Copyright_Notice+0x4b>
4bbf8: 4e95 jsr %a5@
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
4bbfa: 245b moveal %a3@+,%a2
if ( !_Chain_Is_empty( header ) ) {
4bbfc: 4fef 000c lea %sp@(12),%sp
4bc00: b7ca cmpal %a2,%a3
4bc02: 672c beqs 4bc30 <_Watchdog_Report_chain+0x64>
4bc04: 49f9 0004 bc48 lea 4bc48 <_Watchdog_Report>,%a4
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
4bc0a: 2f0a movel %a2,%sp@-
4bc0c: 42a7 clrl %sp@-
4bc0e: 4e94 jsr %a4@
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
node != _Chain_Tail(header) ;
node = node->next )
4bc10: 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 = _Chain_First( header ) ;
4bc12: 508f addql #8,%sp
4bc14: b7ca cmpal %a2,%a3
4bc16: 66f2 bnes 4bc0a <_Watchdog_Report_chain+0x3e> <== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
4bc18: 2f02 movel %d2,%sp@-
4bc1a: 4879 0005 f22a pea 5f22a <_Copyright_Notice+0x62>
4bc20: 4e95 jsr %a5@
4bc22: 508f addql #8,%sp
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
4bc24: 46c3 movew %d3,%sr
}
4bc26: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4bc2c: 4e5e unlk %fp
4bc2e: 4e75 rts
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
4bc30: 4879 0005 f239 pea 5f239 <_Copyright_Notice+0x71>
4bc36: 4e95 jsr %a5@
4bc38: 588f addql #4,%sp
}
_ISR_Enable( level );
4bc3a: 46c3 movew %d3,%sr
}
4bc3c: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4bc42: 4e5e unlk %fp
...
0004aa74 <_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 );
4aa74: 203c 0000 0700 movel #1792,%d0
#include <rtems/score/watchdog.h>
void _Watchdog_Tickle(
Chain_Control *header
)
{
4aa7a: 4e56 ffe8 linkw %fp,#-24
4aa7e: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
4aa82: 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 );
4aa86: 40c2 movew %sr,%d2
4aa88: 8082 orl %d2,%d0
4aa8a: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
4aa8c: 264c moveal %a4,%a3
4aa8e: 245b moveal %a3@+,%a2
if ( _Chain_Is_empty( header ) )
4aa90: b7ca cmpal %a2,%a3
4aa92: 673c beqs 4aad0 <_Watchdog_Tickle+0x5c>
* 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) {
4aa94: 202a 0010 movel %a2@(16),%d0
4aa98: 6708 beqs 4aaa2 <_Watchdog_Tickle+0x2e> <== NEVER TAKEN
the_watchdog->delta_interval--;
4aa9a: 5380 subql #1,%d0
4aa9c: 2540 0010 movel %d0,%a2@(16)
if ( the_watchdog->delta_interval != 0 )
4aaa0: 662e bnes 4aad0 <_Watchdog_Tickle+0x5c>
4aaa2: 4bf9 0004 a9d4 lea 4a9d4 <_Watchdog_Remove>,%a5
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
4aaa8: 263c 0000 0700 movel #1792,%d3
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
4aaae: 2f0a movel %a2,%sp@-
4aab0: 4e95 jsr %a5@
_ISR_Enable( level );
4aab2: 46c2 movew %d2,%sr
switch( watchdog_state ) {
4aab4: 7202 moveq #2,%d1
4aab6: 588f addql #4,%sp
4aab8: b280 cmpl %d0,%d1
4aaba: 6720 beqs 4aadc <_Watchdog_Tickle+0x68> <== ALWAYS TAKEN
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
4aabc: 2003 movel %d3,%d0
4aabe: 40c2 movew %sr,%d2
4aac0: 8082 orl %d2,%d0
4aac2: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4aac4: 2454 moveal %a4@,%a2
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
4aac6: b5cb cmpal %a3,%a2
4aac8: 6706 beqs 4aad0 <_Watchdog_Tickle+0x5c>
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
4aaca: 4aaa 0010 tstl %a2@(16)
4aace: 67de beqs 4aaae <_Watchdog_Tickle+0x3a>
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
4aad0: 46c2 movew %d2,%sr
}
4aad2: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4aad8: 4e5e unlk %fp
4aada: 4e75 rts
_ISR_Enable( level );
switch( watchdog_state ) {
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
4aadc: 2f2a 0024 movel %a2@(36),%sp@-
4aae0: 2f2a 0020 movel %a2@(32),%sp@-
4aae4: 206a 001c moveal %a2@(28),%a0
4aae8: 4e90 jsr %a0@
the_watchdog->id,
the_watchdog->user_data
);
break;
4aaea: 508f addql #8,%sp
4aaec: 60ce bras 4aabc <_Watchdog_Tickle+0x48>
...
0004ac2a <_Workspace_Allocate_or_fatal_error>:
void *_Workspace_Allocate_or_fatal_error(
size_t size
)
{
4ac2a: 4e56 0000 linkw %fp,#0
4ac2e: 42a7 clrl %sp@-
4ac30: 42a7 clrl %sp@-
4ac32: 2f2e 0008 movel %fp@(8),%sp@-
4ac36: 4879 0005 fa16 pea 5fa16 <_Workspace_Area>
4ac3c: 4eb9 0004 c6b0 jsr 4c6b0 <_Heap_Allocate_aligned_with_boundary>
__builtin_return_address( 1 ),
memory
);
#endif
if ( memory == NULL )
4ac42: 4fef 0010 lea %sp@(16),%sp
4ac46: 4a80 tstl %d0
4ac48: 6704 beqs 4ac4e <_Workspace_Allocate_or_fatal_error+0x24>
true,
INTERNAL_ERROR_WORKSPACE_ALLOCATION
);
return memory;
}
4ac4a: 4e5e unlk %fp
4ac4c: 4e75 rts
memory
);
#endif
if ( memory == NULL )
_Internal_error_Occurred(
4ac4e: 4878 0003 pea 3 <DIVIDE>
4ac52: 4878 0001 pea 1 <ADD>
4ac56: 42a7 clrl %sp@-
4ac58: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
...
0004aaf0 <_Workspace_Handler_initialization>:
void _Workspace_Handler_initialization(
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
4aaf0: 4e56 ffd8 linkw %fp,#-40
4aaf4: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4aaf8: 266e 0008 moveal %fp@(8),%a3
4aafc: 2c2e 000c movel %fp@(12),%d6
4ab00: 2a2e 0010 movel %fp@(16),%d5
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
4ab04: 4a39 0005 c606 tstb 5c606 <Configuration+0x32>
4ab0a: 6600 00d2 bnew 4abde <_Workspace_Handler_initialization+0xee>
4ab0e: 2839 0005 c5d8 movel 5c5d8 <Configuration+0x4>,%d4
4ab14: d8b9 0005 c5d4 addl 5c5d4 <Configuration>,%d4
bool do_zero = rtems_configuration_get_do_zero_of_workspace();
4ab1a: 1e39 0005 c604 moveb 5c604 <Configuration+0x30>,%d7
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
4ab20: 4a86 tstl %d6
4ab22: 6768 beqs 4ab8c <_Workspace_Handler_initialization+0x9c><== NEVER TAKEN
/* #define DEBUG_WORKSPACE */
#if defined(DEBUG_WORKSPACE)
#include <rtems/bspIo.h>
#endif
void _Workspace_Handler_initialization(
4ab24: 45eb 0004 lea %a3@(4),%a2
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
4ab28: 4283 clrl %d3
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
4ab2a: 49f9 0004 86b0 lea 486b0 <_Heap_Initialize>,%a4
for (i = 0; i < area_count; ++i) {
Heap_Area *area = &areas [i];
if ( do_zero ) {
memset( area->begin, 0, area->size );
4ab30: 4bf9 0004 e9d4 lea 4e9d4 <memset>,%a5
size_t i;
for (i = 0; i < area_count; ++i) {
Heap_Area *area = &areas [i];
if ( do_zero ) {
4ab36: 4a07 tstb %d7
4ab38: 6660 bnes 4ab9a <_Workspace_Handler_initialization+0xaa><== NEVER TAKEN
memset( area->begin, 0, area->size );
}
if ( area->size > overhead ) {
4ab3a: 2412 movel %a2@,%d2
4ab3c: 700e moveq #14,%d0
4ab3e: b082 cmpl %d2,%d0
4ab40: 6440 bccs 4ab82 <_Workspace_Handler_initialization+0x92>
uintptr_t space_available;
uintptr_t size;
if ( unified ) {
4ab42: 4a39 0005 c605 tstb 5c605 <Configuration+0x31>
4ab48: 6618 bnes 4ab62 <_Workspace_Handler_initialization+0x72>
size = area->size;
} else {
if ( remaining > 0 ) {
4ab4a: 4a84 tstl %d4
4ab4c: 675a beqs 4aba8 <_Workspace_Handler_initialization+0xb8><== NEVER TAKEN
size = remaining < area->size - overhead ?
4ab4e: 2002 movel %d2,%d0
4ab50: 0680 ffff fff2 addil #-14,%d0
remaining + overhead : area->size;
4ab56: b880 cmpl %d0,%d4
4ab58: 6408 bccs 4ab62 <_Workspace_Handler_initialization+0x72><== NEVER TAKEN
4ab5a: 2404 movel %d4,%d2
4ab5c: 0682 0000 000e addil #14,%d2
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
4ab62: 4878 0004 pea 4 <CONTEXT_ARG>
4ab66: 2f02 movel %d2,%sp@-
4ab68: 2f13 movel %a3@,%sp@-
4ab6a: 4879 0005 fa16 pea 5fa16 <_Workspace_Area>
4ab70: 4e94 jsr %a4@
);
area->begin = (char *) area->begin + size;
area->size -= size;
if ( space_available < remaining ) {
4ab72: 4fef 0010 lea %sp@(16),%sp
area->begin,
size,
page_size
);
area->begin = (char *) area->begin + size;
4ab76: d593 addl %d2,%a3@
area->size -= size;
4ab78: 9592 subl %d2,%a2@
if ( space_available < remaining ) {
4ab7a: b880 cmpl %d0,%d4
4ab7c: 634e blss 4abcc <_Workspace_Handler_initialization+0xdc><== ALWAYS TAKEN
remaining -= space_available;
4ab7e: 9880 subl %d0,%d4 <== NOT EXECUTED
} else {
remaining = 0;
}
init_or_extend = extend;
4ab80: 2845 moveal %d5,%a4 <== NOT EXECUTED
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
4ab82: 5283 addql #1,%d3
4ab84: 508a addql #8,%a2
4ab86: 508b addql #8,%a3
4ab88: bc83 cmpl %d3,%d6
4ab8a: 66aa bnes 4ab36 <_Workspace_Handler_initialization+0x46><== NEVER TAKEN
init_or_extend = extend;
}
}
if ( remaining > 0 ) {
4ab8c: 4a84 tstl %d4
4ab8e: 6654 bnes 4abe4 <_Workspace_Handler_initialization+0xf4>
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
);
}
}
4ab90: 4cee 3cfc ffd8 moveml %fp@(-40),%d2-%d7/%a2-%a5
4ab96: 4e5e unlk %fp
4ab98: 4e75 rts
for (i = 0; i < area_count; ++i) {
Heap_Area *area = &areas [i];
if ( do_zero ) {
memset( area->begin, 0, area->size );
4ab9a: 2f12 movel %a2@,%sp@-
4ab9c: 42a7 clrl %sp@-
4ab9e: 2f13 movel %a3@,%sp@-
4aba0: 4e95 jsr %a5@
4aba2: 4fef 000c lea %sp@(12),%sp
4aba6: 6092 bras 4ab3a <_Workspace_Handler_initialization+0x4a>
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
4aba8: 4878 0004 pea 4 <CONTEXT_ARG> <== NOT EXECUTED
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
4abac: 5283 addql #1,%d3 <== NOT EXECUTED
4abae: 508a addql #8,%a2 <== NOT EXECUTED
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
4abb0: 42a7 clrl %sp@- <== NOT EXECUTED
4abb2: 2f13 movel %a3@,%sp@- <== NOT EXECUTED
4abb4: 508b addql #8,%a3 <== NOT EXECUTED
4abb6: 4879 0005 fa16 pea 5fa16 <_Workspace_Area> <== NOT EXECUTED
4abbc: 4e94 jsr %a4@ <== NOT EXECUTED
4abbe: 4fef 0010 lea %sp@(16),%sp <== NOT EXECUTED
remaining -= space_available;
} else {
remaining = 0;
}
init_or_extend = extend;
4abc2: 2845 moveal %d5,%a4 <== NOT EXECUTED
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
4abc4: bc83 cmpl %d3,%d6 <== NOT EXECUTED
4abc6: 6600 ff6e bnew 4ab36 <_Workspace_Handler_initialization+0x46><== NOT EXECUTED
4abca: 60c0 bras 4ab8c <_Workspace_Handler_initialization+0x9c><== NOT EXECUTED
remaining -= space_available;
} else {
remaining = 0;
}
init_or_extend = extend;
4abcc: 2845 moveal %d5,%a4
area->size -= size;
if ( space_available < remaining ) {
remaining -= space_available;
} else {
remaining = 0;
4abce: 4284 clrl %d4
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
4abd0: 5283 addql #1,%d3
4abd2: 508a addql #8,%a2
4abd4: 508b addql #8,%a3
4abd6: bc83 cmpl %d3,%d6
4abd8: 6600 ff5c bnew 4ab36 <_Workspace_Handler_initialization+0x46>
4abdc: 60ae bras 4ab8c <_Workspace_Handler_initialization+0x9c>
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
4abde: 4284 clrl %d4
4abe0: 6000 ff32 braw 4ab14 <_Workspace_Handler_initialization+0x24>
init_or_extend = extend;
}
}
if ( remaining > 0 ) {
_Internal_error_Occurred(
4abe4: 4878 0002 pea 2 <DOUBLE_FLOAT>
4abe8: 4878 0001 pea 1 <ADD>
4abec: 42a7 clrl %sp@-
4abee: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
0004aefc <_Workspace_String_duplicate>:
char *_Workspace_String_duplicate(
const char *string,
size_t len
)
{
4aefc: 4e56 0000 linkw %fp,#0
4af00: 2f0b movel %a3,%sp@-
4af02: 266e 000c moveal %fp@(12),%a3
4af06: 2f0a movel %a2,%sp@-
char *dup = _Workspace_Allocate(len + 1);
4af08: 486b 0001 pea %a3@(1)
4af0c: 4eb9 0004 ae90 jsr 4ae90 <_Workspace_Allocate>
if (dup != NULL) {
4af12: 588f addql #4,%sp
char *_Workspace_String_duplicate(
const char *string,
size_t len
)
{
char *dup = _Workspace_Allocate(len + 1);
4af14: 2440 moveal %d0,%a2
if (dup != NULL) {
4af16: 4a80 tstl %d0
4af18: 6718 beqs 4af32 <_Workspace_String_duplicate+0x36><== NEVER TAKEN
dup [len] = '\0';
4af1a: 4200 clrb %d0
4af1c: 1580 b800 moveb %d0,%a2@(00000000,%a3:l)
memcpy(dup, string, len);
4af20: 2f0b movel %a3,%sp@-
4af22: 2f2e 0008 movel %fp@(8),%sp@-
4af26: 2f0a movel %a2,%sp@-
4af28: 4eb9 0004 ecf4 jsr 4ecf4 <memcpy>
4af2e: 4fef 000c lea %sp@(12),%sp
}
return dup;
}
4af32: 200a movel %a2,%d0
4af34: 246e fff8 moveal %fp@(-8),%a2
4af38: 266e fffc moveal %fp@(-4),%a3
4af3c: 4e5e unlk %fp <== NOT EXECUTED
00048538 <check_and_merge>:
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
48538: 72f8 moveq #-8,%d1
rtems_chain_control *free_chain,
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
4853a: 4e56 fff4 linkw %fp,#-12
4853e: 202e 000c movel %fp@(12),%d0
48542: 48d7 1c00 moveml %a2-%a4,%sp@
48546: 266e 0008 moveal %fp@(8),%a3
4854a: 226e 0010 moveal %fp@(16),%a1
4854e: 206e 0014 moveal %fp@(20),%a0
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
48552: b288 cmpl %a0,%d1
48554: 6754 beqs 485aa <check_and_merge+0x72>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
48556: 2450 moveal %a0@,%a2
48558: 4a8a tstl %a2
4855a: 6748 beqs 485a4 <check_and_merge+0x6c>
if (b->begin < a->begin) {
4855c: 2229 0018 movel %a1@(24),%d1
48560: b2a8 0018 cmpl %a0@(24),%d1
48564: 6308 blss 4856e <check_and_merge+0x36>
48566: 2451 moveal %a1@,%a2
48568: 2209 movel %a1,%d1
4856a: 2248 moveal %a0,%a1
4856c: 2041 moveal %d1,%a0
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
4856e: 2868 0004 moveal %a0@(4),%a4
a = b;
b = t;
}
a->size += b->size;
48572: 2228 001c movel %a0@(28),%d1
48576: d3a9 001c addl %d1,%a1@(28)
next->previous = previous;
previous->next = next;
4857a: 288a movel %a2,%a4@
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
4857c: 2253 moveal %a3@,%a1
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
next->previous = previous;
4857e: 254c 0004 movel %a4,%a2@(4)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
48582: 2688 movel %a0,%a3@
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
48584: 214b 0004 movel %a3,%a0@(4)
rtems_chain_extract_unprotected(&b->chain_node);
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
48588: 4cd7 1c00 moveml %sp@,%a2-%a4
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
4858c: 2089 movel %a1,%a0@
before_node->previous = the_node;
4858e: 2348 0004 movel %a0,%a1@(4)
}
a->size += b->size;
rtems_chain_extract_unprotected(&b->chain_node);
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
48592: 5088 addql #8,%a0
48594: 2d40 0008 movel %d0,%fp@(8)
48598: 2d48 000c movel %a0,%fp@(12)
}
}
4859c: 4e5e unlk %fp
}
a->size += b->size;
rtems_chain_extract_unprotected(&b->chain_node);
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
4859e: 4ef9 0004 9f3a jmp 49f3a <_RBTree_Extract_unprotected>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
485a4: 4aa8 0004 tstl %a0@(4)
485a8: 66b2 bnes 4855c <check_and_merge+0x24> <== NEVER TAKEN
}
}
485aa: 4cd7 1c00 moveml %sp@,%a2-%a4
485ae: 4e5e unlk %fp <== NOT EXECUTED
00047ee0 <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
47ee0: 4e56 0000 linkw %fp,#0
47ee4: 2f03 movel %d3,%sp@-
47ee6: 262e 0014 movel %fp@(20),%d3
47eea: 2f02 movel %d2,%sp@-
RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Append_with_empty_check( chain, node );
47eec: 2f2e 000c movel %fp@(12),%sp@-
47ef0: 2f2e 0008 movel %fp@(8),%sp@-
47ef4: 242e 0010 movel %fp@(16),%d2
47ef8: 4eb9 0004 8498 jsr 48498 <_Chain_Append_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
47efe: 508f addql #8,%sp
47f00: 4a00 tstb %d0
47f02: 660e bnes 47f12 <rtems_chain_append_with_notification+0x32>
sc = rtems_event_send( task, events );
}
return sc;
}
47f04: 242e fff8 movel %fp@(-8),%d2
47f08: 4280 clrl %d0
47f0a: 262e fffc movel %fp@(-4),%d3
47f0e: 4e5e unlk %fp
47f10: 4e75 rts
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
47f12: 2d43 000c movel %d3,%fp@(12)
}
return sc;
}
47f16: 262e fffc movel %fp@(-4),%d3
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
47f1a: 2d42 0008 movel %d2,%fp@(8)
}
return sc;
}
47f1e: 242e fff8 movel %fp@(-8),%d2
47f22: 4e5e unlk %fp
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
47f24: 4ef9 0004 73ac jmp 473ac <rtems_event_send>
...
00047f2c <rtems_chain_get_with_notification>:
rtems_chain_control *chain,
rtems_id task,
rtems_event_set events,
rtems_chain_node **node
)
{
47f2c: 4e56 0000 linkw %fp,#0
47f30: 2f03 movel %d3,%sp@-
47f32: 262e 0010 movel %fp@(16),%d3
47f36: 2f02 movel %d2,%sp@-
RTEMS_INLINE_ROUTINE bool rtems_chain_get_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node **node
)
{
return _Chain_Get_with_empty_check( chain, node );
47f38: 2f2e 0014 movel %fp@(20),%sp@-
47f3c: 2f2e 0008 movel %fp@(8),%sp@-
47f40: 242e 000c movel %fp@(12),%d2
47f44: 4eb9 0004 8510 jsr 48510 <_Chain_Get_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
47f4a: 508f addql #8,%sp
47f4c: 4a00 tstb %d0
47f4e: 660e bnes 47f5e <rtems_chain_get_with_notification+0x32>
sc = rtems_event_send( task, events );
}
return sc;
}
47f50: 242e fff8 movel %fp@(-8),%d2
47f54: 4280 clrl %d0
47f56: 262e fffc movel %fp@(-4),%d3
47f5a: 4e5e unlk %fp
47f5c: 4e75 rts
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
47f5e: 2d43 000c movel %d3,%fp@(12)
}
return sc;
}
47f62: 262e fffc movel %fp@(-4),%d3
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
47f66: 2d42 0008 movel %d2,%fp@(8)
}
return sc;
}
47f6a: 242e fff8 movel %fp@(-8),%d2
47f6e: 4e5e unlk %fp
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
47f70: 4ef9 0004 73ac jmp 473ac <rtems_event_send>
...
00047f78 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
47f78: 4e56 ffe0 linkw %fp,#-32
47f7c: 48d7 0c7c moveml %d2-%d6/%a2-%a3,%sp@
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
47f80: 2c0e movel %fp,%d6
47f82: 45f9 0004 855c lea 4855c <_Chain_Get>,%a2
47f88: 5986 subql #4,%d6
47f8a: 47f9 0004 7200 lea 47200 <rtems_event_receive>,%a3
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
47f90: 262e 0008 movel %fp@(8),%d3
47f94: 2a2e 000c movel %fp@(12),%d5
47f98: 282e 0010 movel %fp@(16),%d4
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
47f9c: 2f03 movel %d3,%sp@-
47f9e: 4e92 jsr %a2@
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
47fa0: 588f addql #4,%sp
47fa2: 2400 movel %d0,%d2
47fa4: 6622 bnes 47fc8 <rtems_chain_get_with_wait+0x50>
) {
rtems_event_set out;
sc = rtems_event_receive(
47fa6: 2f06 movel %d6,%sp@-
47fa8: 2f04 movel %d4,%sp@-
47faa: 42a7 clrl %sp@-
47fac: 2f05 movel %d5,%sp@-
47fae: 4e93 jsr %a3@
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
47fb0: 4fef 0010 lea %sp@(16),%sp
47fb4: 4a80 tstl %d0
47fb6: 67e4 beqs 47f9c <rtems_chain_get_with_wait+0x24> <== NEVER TAKEN
timeout,
&out
);
}
*node_ptr = node;
47fb8: 206e 0014 moveal %fp@(20),%a0
47fbc: 2082 movel %d2,%a0@
return sc;
}
47fbe: 4cee 0c7c ffe0 moveml %fp@(-32),%d2-%d6/%a2-%a3
47fc4: 4e5e unlk %fp
47fc6: 4e75 rts
timeout,
&out
);
}
*node_ptr = node;
47fc8: 206e 0014 moveal %fp@(20),%a0
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
47fcc: 4280 clrl %d0
timeout,
&out
);
}
*node_ptr = node;
47fce: 2082 movel %d2,%a0@
return sc;
}
47fd0: 4cee 0c7c ffe0 moveml %fp@(-32),%d2-%d6/%a2-%a3
47fd6: 4e5e unlk %fp
...
00047fdc <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
47fdc: 4e56 0000 linkw %fp,#0
47fe0: 2f03 movel %d3,%sp@-
47fe2: 262e 0014 movel %fp@(20),%d3
47fe6: 2f02 movel %d2,%sp@-
RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Prepend_with_empty_check( chain, node );
47fe8: 2f2e 000c movel %fp@(12),%sp@-
47fec: 2f2e 0008 movel %fp@(8),%sp@-
47ff0: 242e 0010 movel %fp@(16),%d2
47ff4: 4eb9 0004 8630 jsr 48630 <_Chain_Prepend_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
47ffa: 508f addql #8,%sp
47ffc: 4a00 tstb %d0
47ffe: 660e bnes 4800e <rtems_chain_prepend_with_notification+0x32>
sc = rtems_event_send( task, events );
}
return sc;
}
48000: 242e fff8 movel %fp@(-8),%d2
48004: 4280 clrl %d0
48006: 262e fffc movel %fp@(-4),%d3
4800a: 4e5e unlk %fp
4800c: 4e75 rts
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
4800e: 2d43 000c movel %d3,%fp@(12)
}
return sc;
}
48012: 262e fffc movel %fp@(-4),%d3
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
48016: 2d42 0008 movel %d2,%fp@(8)
}
return sc;
}
4801a: 242e fff8 movel %fp@(-8),%d2
4801e: 4e5e unlk %fp
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
48020: 4ef9 0004 73ac jmp 473ac <rtems_event_send>
...
00050878 <rtems_event_system_receive>:
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
50878: 4e56 0000 linkw %fp,#0
5087c: 206e 0014 moveal %fp@(20),%a0
50880: 2f0a movel %a2,%sp@-
rtems_status_code sc;
if ( event_out != NULL ) {
50882: 4a88 tstl %a0
50884: 671e beqs 508a4 <rtems_event_system_receive+0x2c><== NEVER TAKEN
Thread_Control *executing = _Thread_Executing;
50886: 2479 0006 4162 moveal 64162 <_Per_CPU_Information+0xe>,%a2
RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ];
5088c: 226a 00f8 moveal %a2@(248),%a1
Event_Control *event = &api->System_event;
if ( !_Event_sets_Is_empty( event_in ) ) {
50890: 4aae 0008 tstl %fp@(8)
50894: 6618 bnes 508ae <rtems_event_system_receive+0x36><== ALWAYS TAKEN
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
50896: 246e fffc moveal %fp@(-4),%a2 <== NOT EXECUTED
_Thread_Enable_dispatch();
sc = executing->Wait.return_code;
} else {
*event_out = event->pending_events;
sc = RTEMS_SUCCESSFUL;
5089a: 4280 clrl %d0 <== NOT EXECUTED
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
5089c: 4e5e unlk %fp <== NOT EXECUTED
);
_Thread_Enable_dispatch();
sc = executing->Wait.return_code;
} else {
*event_out = event->pending_events;
5089e: 20a9 0004 movel %a1@(4),%a0@ <== NOT EXECUTED
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
508a2: 4e75 rts <== NOT EXECUTED
508a4: 246e fffc moveal %fp@(-4),%a2 <== NOT EXECUTED
} else {
*event_out = event->pending_events;
sc = RTEMS_SUCCESSFUL;
}
} else {
sc = RTEMS_INVALID_ADDRESS;
508a8: 7009 moveq #9,%d0 <== NOT EXECUTED
}
return sc;
}
508aa: 4e5e unlk %fp <== NOT EXECUTED
508ac: 4e75 rts <== NOT EXECUTED
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
508ae: 2039 0006 3fea movel 63fea <_Thread_Dispatch_disable_level>,%d0
++level;
508b4: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
508b6: 23c0 0006 3fea movel %d0,63fea <_Thread_Dispatch_disable_level>
RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ];
Event_Control *event = &api->System_event;
if ( !_Event_sets_Is_empty( event_in ) ) {
_Thread_Disable_dispatch();
_Event_Seize(
508bc: 2f3c 0004 0000 movel #262144,%sp@-
508c2: 4879 0006 419c pea 6419c <_System_event_Sync_state>
508c8: 4869 0004 pea %a1@(4)
508cc: 2f0a movel %a2,%sp@-
508ce: 2f08 movel %a0,%sp@-
508d0: 2f2e 0010 movel %fp@(16),%sp@-
508d4: 2f2e 000c movel %fp@(12),%sp@-
508d8: 2f2e 0008 movel %fp@(8),%sp@-
508dc: 4eb9 0004 861c jsr 4861c <_Event_Seize>
executing,
event,
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
508e2: 4fef 0020 lea %sp@(32),%sp
508e6: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
sc = executing->Wait.return_code;
508ec: 202a 0034 movel %a2@(52),%d0
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
508f0: 246e fffc moveal %fp@(-4),%a2
508f4: 4e5e unlk %fp <== NOT EXECUTED
00047670 <rtems_event_system_send>:
rtems_status_code rtems_event_system_send(
rtems_id id,
rtems_event_set event_in
)
{
47670: 4e56 fffc linkw %fp,#-4
rtems_status_code sc;
Thread_Control *thread;
Objects_Locations location;
RTEMS_API_Control *api;
thread = _Thread_Get( id, &location );
47674: 486e fffc pea %fp@(-4)
47678: 2f2e 0008 movel %fp@(8),%sp@-
4767c: 4eb9 0004 9c64 jsr 49c64 <_Thread_Get>
switch ( location ) {
47682: 508f addql #8,%sp
47684: 4aae fffc tstl %fp@(-4)
47688: 6632 bnes 476bc <rtems_event_system_send+0x4c> <== NEVER TAKEN
case OBJECTS_LOCAL:
api = thread->API_Extensions[ THREAD_API_RTEMS ];
_Event_Surrender(
4768a: 2040 moveal %d0,%a0
4768c: 2f3c 0004 0000 movel #262144,%sp@-
47692: 4879 0005 fbb8 pea 5fbb8 <_System_event_Sync_state>
47698: 2228 00f8 movel %a0@(248),%d1
4769c: 5881 addql #4,%d1
4769e: 2f01 movel %d1,%sp@-
476a0: 2f2e 000c movel %fp@(12),%sp@-
476a4: 2f00 movel %d0,%sp@-
476a6: 4eb9 0004 6fa8 jsr 46fa8 <_Event_Surrender>
event_in,
&api->System_event,
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
476ac: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
sc = RTEMS_SUCCESSFUL;
break;
476b2: 4fef 0014 lea %sp@(20),%sp
&api->System_event,
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
sc = RTEMS_SUCCESSFUL;
476b6: 4280 clrl %d0
sc = RTEMS_INVALID_ID;
break;
}
return sc;
}
476b8: 4e5e unlk %fp
476ba: 4e75 rts
case OBJECTS_REMOTE:
sc = RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
break;
#endif
default:
sc = RTEMS_INVALID_ID;
476bc: 7004 moveq #4,%d0 <== NOT EXECUTED
break;
}
return sc;
}
476be: 4e5e unlk %fp <== NOT EXECUTED
...
00047b8c <rtems_initialize_start_multitasking>:
47b8c: 7002 moveq #2,%d0
}
void rtems_initialize_start_multitasking(void)
{
47b8e: 4e56 0000 linkw %fp,#0
47b92: 23c0 0005 fb6c movel %d0,5fb6c <_System_state_Current>
uint32_t status;
_System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
_Thread_Start_multitasking();
47b98: 4eb9 0004 a628 jsr 4a628 <_Thread_Start_multitasking>
****** RETURNS WHEN SYSTEM IS SHUT DOWN ******
*******************************************************************
*******************************************************************
*******************************************************************/
status = _Per_CPU_Information[0].idle->Wait.return_code;
47b9e: 2079 0005 fb86 moveal 5fb86 <_Per_CPU_Information+0x16>,%a0
rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, status );
47ba4: 2f28 0034 movel %a0@(52),%sp@-
47ba8: 4878 0005 pea 5 <COMPARE>
47bac: 4eb9 0004 7c38 jsr 47c38 <rtems_fatal>
...
000494dc <rtems_io_register_driver>:
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
)
{
494dc: 4e56 0000 linkw %fp,#0
494e0: 226e 000c moveal %fp@(12),%a1
494e4: 2f0a movel %a2,%sp@-
494e6: 206e 0010 moveal %fp@(16),%a0
494ea: 2f02 movel %d2,%sp@-
494ec: 242e 0008 movel %fp@(8),%d2
rtems_device_major_number major_limit = _IO_Number_of_drivers;
494f0: 2039 0006 41dc movel 641dc <_IO_Number_of_drivers>,%d0
if ( rtems_interrupt_is_in_progress() )
494f6: 4ab9 0006 415c tstl 6415c <_Per_CPU_Information+0x8>
494fc: 670e beqs 4950c <rtems_io_register_driver+0x30>
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
494fe: 242e fff8 movel %fp@(-8),%d2
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
49502: 7012 moveq #18,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
49504: 246e fffc moveal %fp@(-4),%a2
49508: 4e5e unlk %fp
4950a: 4e75 rts
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
4950c: 4a88 tstl %a0
4950e: 6722 beqs 49532 <rtems_io_register_driver+0x56>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
49510: 2080 movel %d0,%a0@
if ( driver_table == NULL )
49512: 4a89 tstl %a1
49514: 671c beqs 49532 <rtems_io_register_driver+0x56>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
49516: 4a91 tstl %a1@
49518: 6712 beqs 4952c <rtems_io_register_driver+0x50>
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
4951a: b480 cmpl %d0,%d2
4951c: 6522 bcss 49540 <rtems_io_register_driver+0x64>
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
4951e: 242e fff8 movel %fp@(-8),%d2
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
49522: 700a moveq #10,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
49524: 246e fffc moveal %fp@(-4),%a2
49528: 4e5e unlk %fp
4952a: 4e75 rts
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
4952c: 4aa9 0004 tstl %a1@(4)
49530: 66e8 bnes 4951a <rtems_io_register_driver+0x3e>
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
49532: 242e fff8 movel %fp@(-8),%d2
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
49536: 7009 moveq #9,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
49538: 246e fffc moveal %fp@(-4),%a2
4953c: 4e5e unlk %fp
4953e: 4e75 rts
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
49540: 2039 0006 3fea movel 63fea <_Thread_Dispatch_disable_level>,%d0
++level;
49546: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
49548: 23c0 0006 3fea movel %d0,63fea <_Thread_Dispatch_disable_level>
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
4954e: 4a82 tstl %d2
49550: 676a beqs 495bc <rtems_io_register_driver+0xe0>
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
49552: 2202 movel %d2,%d1
49554: 2002 movel %d2,%d0
49556: e789 lsll #3,%d1
49558: eb88 lsll #5,%d0
4955a: 2479 0006 41e0 moveal 641e0 <_IO_Driver_address_table>,%a2
49560: 9081 subl %d1,%d0
49562: 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;
49564: 4a92 tstl %a2@
49566: 6714 beqs 4957c <rtems_io_register_driver+0xa0>
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
49568: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
4956e: 242e fff8 movel %fp@(-8),%d2
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
49572: 700c moveq #12,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
49574: 246e fffc moveal %fp@(-4),%a2
49578: 4e5e unlk %fp
4957a: 4e75 rts
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
4957c: 4aaa 0004 tstl %a2@(4)
49580: 66e6 bnes 49568 <rtems_io_register_driver+0x8c>
49582: 2239 0006 41e0 movel 641e0 <_IO_Driver_address_table>,%d1
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
49588: 2082 movel %d2,%a0@
}
_IO_Driver_address_table [major] = *driver_table;
4958a: 2041 moveal %d1,%a0
4958c: d1c0 addal %d0,%a0
4958e: 20d9 movel %a1@+,%a0@+
49590: 20d9 movel %a1@+,%a0@+
49592: 20d9 movel %a1@+,%a0@+
49594: 20d9 movel %a1@+,%a0@+
49596: 20d9 movel %a1@+,%a0@+
49598: 2091 movel %a1@,%a0@
_Thread_Enable_dispatch();
4959a: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
}
495a0: 246e fffc moveal %fp@(-4),%a2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
495a4: 2d42 0008 movel %d2,%fp@(8)
}
495a8: 242e fff8 movel %fp@(-8),%d2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
495ac: 42ae 0010 clrl %fp@(16)
495b0: 42ae 000c clrl %fp@(12)
}
495b4: 4e5e unlk %fp
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
495b6: 4ef9 0005 0ca8 jmp 50ca8 <rtems_io_initialize>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
495bc: 2039 0006 41dc movel 641dc <_IO_Number_of_drivers>,%d0
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
495c2: 6770 beqs 49634 <rtems_io_register_driver+0x158> <== NEVER TAKEN
495c4: 2239 0006 41e0 movel 641e0 <_IO_Driver_address_table>,%d1
495ca: 2441 moveal %d1,%a2
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
495cc: 4a92 tstl %a2@
495ce: 6720 beqs 495f0 <rtems_io_register_driver+0x114>
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 ) {
495d0: 5282 addql #1,%d2
495d2: 45ea 0018 lea %a2@(24),%a2
495d6: b082 cmpl %d2,%d0
495d8: 66f2 bnes 495cc <rtems_io_register_driver+0xf0>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
495da: 2082 movel %d2,%a0@
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
495dc: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
495e2: 7005 moveq #5,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
495e4: 242e fff8 movel %fp@(-8),%d2
495e8: 246e fffc moveal %fp@(-4),%a2
495ec: 4e5e unlk %fp
495ee: 4e75 rts
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
495f0: 4aaa 0004 tstl %a2@(4)
495f4: 66da bnes 495d0 <rtems_io_register_driver+0xf4>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
495f6: 2082 movel %d2,%a0@
if ( m != n )
495f8: b480 cmpl %d0,%d2
495fa: 67e0 beqs 495dc <rtems_io_register_driver+0x100> <== NEVER TAKEN
495fc: 7018 moveq #24,%d0
495fe: 4c02 0800 mulsl %d2,%d0
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
49602: 2041 moveal %d1,%a0
49604: d1c0 addal %d0,%a0
49606: 20d9 movel %a1@+,%a0@+
49608: 20d9 movel %a1@+,%a0@+
4960a: 20d9 movel %a1@+,%a0@+
4960c: 20d9 movel %a1@+,%a0@+
4960e: 20d9 movel %a1@+,%a0@+
49610: 2091 movel %a1@,%a0@
_Thread_Enable_dispatch();
49612: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
}
49618: 246e fffc moveal %fp@(-4),%a2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
4961c: 2d42 0008 movel %d2,%fp@(8)
}
49620: 242e fff8 movel %fp@(-8),%d2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
49624: 42ae 0010 clrl %fp@(16)
49628: 42ae 000c clrl %fp@(12)
}
4962c: 4e5e unlk %fp
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
4962e: 4ef9 0005 0ca8 jmp 50ca8 <rtems_io_initialize>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
49634: 4290 clrl %a0@ <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
49636: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch> <== NOT EXECUTED
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
4963c: 7005 moveq #5,%d0 <== NOT EXECUTED
4963e: 60a4 bras 495e4 <rtems_io_register_driver+0x108> <== NOT EXECUTED
0004a21c <rtems_iterate_over_all_threads>:
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
{
4a21c: 4e56 fff0 linkw %fp,#-16
4a220: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
4a224: 266e 0008 moveal %fp@(8),%a3
4a228: 49f9 0006 2466 lea 62466 <_Objects_Information_table+0x4>,%a4
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
4a22e: 4a8b tstl %a3
4a230: 673c beqs 4a26e <rtems_iterate_over_all_threads+0x52><== NEVER TAKEN
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
4a232: 205c moveal %a4@+,%a0
4a234: 4a88 tstl %a0
4a236: 672e beqs 4a266 <rtems_iterate_over_all_threads+0x4a>
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
4a238: 2468 0004 moveal %a0@(4),%a2
if ( !information )
4a23c: 4a8a tstl %a2
4a23e: 6726 beqs 4a266 <rtems_iterate_over_all_threads+0x4a>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
4a240: 4a6a 000e tstw %a2@(14)
4a244: 6720 beqs 4a266 <rtems_iterate_over_all_threads+0x4a><== NEVER TAKEN
4a246: 7401 moveq #1,%d2
the_thread = (Thread_Control *)information->local_table[ i ];
4a248: 206a 0018 moveal %a2@(24),%a0
4a24c: 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++ ) {
4a250: 5282 addql #1,%d2
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
4a252: 4a80 tstl %d0
4a254: 6706 beqs 4a25c <rtems_iterate_over_all_threads+0x40><== NEVER TAKEN
continue;
(*routine)(the_thread);
4a256: 2f00 movel %d0,%sp@-
4a258: 4e93 jsr %a3@
4a25a: 588f addql #4,%sp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
4a25c: 4280 clrl %d0
4a25e: 302a 000e movew %a2@(14),%d0
4a262: b480 cmpl %d0,%d2
4a264: 63e2 blss 4a248 <rtems_iterate_over_all_threads+0x2c>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
4a266: b9fc 0006 2472 cmpal #402546,%a4
4a26c: 66c4 bnes 4a232 <rtems_iterate_over_all_threads+0x16>
(*routine)(the_thread);
}
}
}
4a26e: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
4a274: 4e5e unlk %fp <== NOT EXECUTED
00048d9c <rtems_object_get_class_information>:
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
48d9c: 4e56 0000 linkw %fp,#0
48da0: 2f0a movel %a2,%sp@-
48da2: 246e 0010 moveal %fp@(16),%a2
48da6: 2f02 movel %d2,%sp@-
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
48da8: 4a8a tstl %a2
48daa: 6768 beqs 48e14 <rtems_object_get_class_information+0x78>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
48dac: 3f2e 000e movew %fp@(14),%sp@-
48db0: 4267 clrw %sp@-
48db2: 2f2e 0008 movel %fp@(8),%sp@-
48db6: 4eb9 0004 ac44 jsr 4ac44 <_Objects_Get_information>
if ( !obj_info )
48dbc: 508f addql #8,%sp
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
48dbe: 2040 moveal %d0,%a0
if ( !obj_info )
48dc0: 4a80 tstl %d0
48dc2: 675e beqs 48e22 <rtems_object_get_class_information+0x86>
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
48dc4: 24a8 0006 movel %a0@(6),%a2@
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
48dc8: 4282 clrl %d2
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
48dca: 2568 000a 0004 movel %a0@(10),%a2@(4)
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
48dd0: 3428 000e movew %a0@(14),%d2
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
48dd4: 1568 0010 000c moveb %a0@(16),%a2@(12)
info->maximum = obj_info->maximum;
48dda: 2542 0008 movel %d2,%a2@(8)
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
48dde: 6750 beqs 48e30 <rtems_object_get_class_information+0x94><== NEVER TAKEN
48de0: 2068 0018 moveal %a0@(24),%a0
48de4: 7201 moveq #1,%d1
48de6: 7001 moveq #1,%d0
48de8: 93c9 subal %a1,%a1
48dea: 5280 addql #1,%d0
if ( !obj_info->local_table[i] )
48dec: 4ab0 1c00 tstl %a0@(00000000,%d1:l:4)
48df0: 6718 beqs 48e0a <rtems_object_get_class_information+0x6e>
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
48df2: 2200 movel %d0,%d1
48df4: b082 cmpl %d2,%d0
48df6: 63f2 blss 48dea <rtems_object_get_class_information+0x4e><== ALWAYS TAKEN
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
48df8: 2549 000e movel %a1,%a2@(14)
return RTEMS_SUCCESSFUL;
48dfc: 4280 clrl %d0
}
48dfe: 242e fff8 movel %fp@(-8),%d2
48e02: 246e fffc moveal %fp@(-4),%a2
48e06: 4e5e unlk %fp
48e08: 4e75 rts
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
if ( !obj_info->local_table[i] )
unallocated++;
48e0a: 5289 addql #1,%a1
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
48e0c: 2200 movel %d0,%d1
48e0e: b082 cmpl %d2,%d0
48e10: 63d8 blss 48dea <rtems_object_get_class_information+0x4e><== NEVER TAKEN
48e12: 60e4 bras 48df8 <rtems_object_get_class_information+0x5c>
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
48e14: 242e fff8 movel %fp@(-8),%d2
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
48e18: 7009 moveq #9,%d0
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
48e1a: 246e fffc moveal %fp@(-4),%a2
48e1e: 4e5e unlk %fp
48e20: 4e75 rts
48e22: 242e fff8 movel %fp@(-8),%d2
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
return RTEMS_INVALID_NUMBER;
48e26: 700a moveq #10,%d0
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
48e28: 246e fffc moveal %fp@(-4),%a2
48e2c: 4e5e unlk %fp
48e2e: 4e75 rts
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
48e30: 93c9 subal %a1,%a1 <== NOT EXECUTED
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
48e32: 4280 clrl %d0 <== NOT EXECUTED
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
48e34: 2549 000e movel %a1,%a2@(14) <== NOT EXECUTED
48e38: 60c4 bras 48dfe <rtems_object_get_class_information+0x62><== NOT EXECUTED
...
00048ea4 <rtems_object_set_name>:
*/
rtems_status_code rtems_object_set_name(
rtems_id id,
const char *name
)
{
48ea4: 4e56 fffc linkw %fp,#-4
48ea8: 2f03 movel %d3,%sp@-
48eaa: 2f02 movel %d2,%sp@-
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
48eac: 4aae 000c tstl %fp@(12)
48eb0: 677c beqs 48f2e <rtems_object_set_name+0x8a>
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
48eb2: 4aae 0008 tstl %fp@(8)
48eb6: 6656 bnes 48f0e <rtems_object_set_name+0x6a>
48eb8: 2079 0006 2aa6 moveal 62aa6 <_Per_CPU_Information+0xe>,%a0
48ebe: 2628 0008 movel %a0@(8),%d3
information = _Objects_Get_information_id( tmpId );
48ec2: 2f03 movel %d3,%sp@-
48ec4: 4eb9 0004 ac18 jsr 4ac18 <_Objects_Get_information_id>
if ( !information )
48eca: 588f addql #4,%sp
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
information = _Objects_Get_information_id( tmpId );
48ecc: 2400 movel %d0,%d2
if ( !information )
48ece: 6750 beqs 48f20 <rtems_object_set_name+0x7c> <== NEVER TAKEN
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
48ed0: 486e fffc pea %fp@(-4)
48ed4: 2f03 movel %d3,%sp@-
48ed6: 2f00 movel %d0,%sp@-
48ed8: 4eb9 0004 ae00 jsr 4ae00 <_Objects_Get>
switch ( location ) {
48ede: 4fef 000c lea %sp@(12),%sp
48ee2: 4aae fffc tstl %fp@(-4)
48ee6: 6638 bnes 48f20 <rtems_object_set_name+0x7c>
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
48ee8: 2f2e 000c movel %fp@(12),%sp@-
48eec: 2f00 movel %d0,%sp@-
48eee: 2f02 movel %d2,%sp@-
48ef0: 4eb9 0004 afe0 jsr 4afe0 <_Objects_Set_name>
_Thread_Enable_dispatch();
48ef6: 4eb9 0004 bc20 jsr 4bc20 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
48efc: 242e fff4 movel %fp@(-12),%d2
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
_Thread_Enable_dispatch();
48f00: 4fef 000c lea %sp@(12),%sp
return RTEMS_SUCCESSFUL;
48f04: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
48f06: 262e fff8 movel %fp@(-8),%d3
48f0a: 4e5e unlk %fp
48f0c: 4e75 rts
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
48f0e: 262e 0008 movel %fp@(8),%d3
information = _Objects_Get_information_id( tmpId );
48f12: 2f03 movel %d3,%sp@-
48f14: 4eb9 0004 ac18 jsr 4ac18 <_Objects_Get_information_id>
if ( !information )
48f1a: 588f addql #4,%sp
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
information = _Objects_Get_information_id( tmpId );
48f1c: 2400 movel %d0,%d2
if ( !information )
48f1e: 66b0 bnes 48ed0 <rtems_object_set_name+0x2c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
48f20: 242e fff4 movel %fp@(-12),%d2
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
48f24: 7004 moveq #4,%d0
}
48f26: 262e fff8 movel %fp@(-8),%d3
48f2a: 4e5e unlk %fp
48f2c: 4e75 rts
48f2e: 242e fff4 movel %fp@(-12),%d2
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
48f32: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
48f34: 262e fff8 movel %fp@(-8),%d3
48f38: 4e5e unlk %fp <== NOT EXECUTED
00054f90 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
54f90: 4e56 0000 linkw %fp,#0
54f94: 2f0a movel %a2,%sp@-
54f96: 2f02 movel %d2,%sp@-
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
54f98: 4aae 0008 tstl %fp@(8)
54f9c: 660e bnes 54fac <rtems_partition_create+0x1c>
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
54f9e: 242e fff8 movel %fp@(-8),%d2
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
54fa2: 7003 moveq #3,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
54fa4: 246e fffc moveal %fp@(-4),%a2
54fa8: 4e5e unlk %fp
54faa: 4e75 rts
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
54fac: 4aae 000c tstl %fp@(12)
54fb0: 671a beqs 54fcc <rtems_partition_create+0x3c>
return RTEMS_INVALID_ADDRESS;
if ( !id )
54fb2: 4aae 001c tstl %fp@(28)
54fb6: 6714 beqs 54fcc <rtems_partition_create+0x3c> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
54fb8: 4aae 0010 tstl %fp@(16)
54fbc: 661c bnes 54fda <rtems_partition_create+0x4a>
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
54fbe: 242e fff8 movel %fp@(-8),%d2
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
54fc2: 7008 moveq #8,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
54fc4: 246e fffc moveal %fp@(-4),%a2
54fc8: 4e5e unlk %fp
54fca: 4e75 rts
54fcc: 242e fff8 movel %fp@(-8),%d2
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
54fd0: 7009 moveq #9,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
54fd2: 246e fffc moveal %fp@(-4),%a2
54fd6: 4e5e unlk %fp
54fd8: 4e75 rts
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
54fda: 4aae 0014 tstl %fp@(20)
54fde: 67de beqs 54fbe <rtems_partition_create+0x2e>
54fe0: 202e 0014 movel %fp@(20),%d0
54fe4: b0ae 0010 cmpl %fp@(16),%d0
54fe8: 62d4 bhis 54fbe <rtems_partition_create+0x2e>
*/
RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned (
uint32_t buffer_size
)
{
return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
54fea: 7003 moveq #3,%d0
54fec: c0ae 0014 andl %fp@(20),%d0
54ff0: 66cc bnes 54fbe <rtems_partition_create+0x2e>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
54ff2: 103c 0003 moveb #3,%d0
54ff6: c0ae 000c andl %fp@(12),%d0
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
54ffa: 66d0 bnes 54fcc <rtems_partition_create+0x3c>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
54ffc: 2039 0007 c302 movel 7c302 <_Thread_Dispatch_disable_level>,%d0
++level;
55002: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
55004: 23c0 0007 c302 movel %d0,7c302 <_Thread_Dispatch_disable_level>
* This function allocates a partition control block from
* the inactive chain of free partition control blocks.
*/
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
{
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
5500a: 4879 0007 c18c pea 7c18c <_Partition_Information>
55010: 4eb9 0005 9f48 jsr 59f48 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
55016: 588f addql #4,%sp
55018: 2440 moveal %d0,%a2
5501a: 4a80 tstl %d0
5501c: 6776 beqs 55094 <rtems_partition_create+0x104>
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
5501e: 242e 0010 movel %fp@(16),%d2
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
55022: 2002 movel %d2,%d0
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
55024: 2542 0014 movel %d2,%a2@(20)
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
55028: 242e 0014 movel %fp@(20),%d2
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
5502c: 222e 000c movel %fp@(12),%d1
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
55030: 256e 0018 001c movel %fp@(24),%a2@(28)
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
55036: 2541 0010 movel %d1,%a2@(16)
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
5503a: 4c42 0000 remul %d2,%d0,%d0
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
5503e: 2542 0018 movel %d2,%a2@(24)
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
55042: 42aa 0020 clrl %a2@(32)
_Chain_Initialize( &the_partition->Memory, starting_address,
55046: 2f02 movel %d2,%sp@-
55048: 2f00 movel %d0,%sp@-
5504a: 2f2e 000c movel %fp@(12),%sp@-
5504e: 486a 0024 pea %a2@(36)
55052: 4eb9 0005 87c8 jsr 587c8 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
55058: 202a 0008 movel %a2@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
5505c: 2200 movel %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
5505e: 2079 0007 c1a4 moveal 7c1a4 <_Partition_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
55064: 0281 0000 ffff andil #65535,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
5506a: 218a 1c00 movel %a2,%a0@(00000000,%d1:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
5506e: 206e 0008 moveal %fp@(8),%a0
55072: 2548 000c movel %a0,%a2@(12)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
55076: 206e 001c moveal %fp@(28),%a0
5507a: 2080 movel %d0,%a0@
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
5507c: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
}
55082: 242e fff8 movel %fp@(-8),%d2
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
55086: 4fef 0010 lea %sp@(16),%sp
5508a: 4280 clrl %d0
}
5508c: 246e fffc moveal %fp@(-4),%a2
55090: 4e5e unlk %fp
55092: 4e75 rts
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
55094: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
5509a: 242e fff8 movel %fp@(-8),%d2
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
5509e: 7005 moveq #5,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
550a0: 246e fffc moveal %fp@(-4),%a2
550a4: 4e5e unlk %fp <== NOT EXECUTED
000551d0 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
551d0: 4e56 fff8 linkw %fp,#-8
551d4: 2f02 movel %d2,%sp@-
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
551d6: 486e fffc pea %fp@(-4)
551da: 2f2e 0008 movel %fp@(8),%sp@-
551de: 4879 0007 c18c pea 7c18c <_Partition_Information>
551e4: 4eb9 0005 a480 jsr 5a480 <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
551ea: 4fef 000c lea %sp@(12),%sp
551ee: 4aae fffc tstl %fp@(-4)
551f2: 6660 bnes 55254 <rtems_partition_return_buffer+0x84>
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
551f4: 2040 moveal %d0,%a0
551f6: 2228 0010 movel %a0@(16),%d1
ending = _Addresses_Add_offset( starting, the_partition->length );
551fa: 2068 0014 moveal %a0@(20),%a0
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
551fe: b2ae 000c cmpl %fp@(12),%d1
55202: 625a bhis 5525e <rtems_partition_return_buffer+0x8e>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
55204: 41f0 1800 lea %a0@(00000000,%d1:l),%a0
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
55208: b1ee 000c cmpal %fp@(12),%a0
5520c: 6550 bcss 5525e <rtems_partition_return_buffer+0x8e><== NEVER TAKEN
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
5520e: 242e 000c movel %fp@(12),%d2
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
55212: 2040 moveal %d0,%a0
55214: 9481 subl %d1,%d2
55216: 2202 movel %d2,%d1
55218: 41e8 0018 lea %a0@(24),%a0
5521c: 4c50 1002 remul %a0@,%d2,%d1
starting = the_partition->starting_address;
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
55220: 4a82 tstl %d2
55222: 663a bnes 5525e <rtems_partition_return_buffer+0x8e>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
55224: 2f2e 000c movel %fp@(12),%sp@-
55228: 2240 moveal %d0,%a1
5522a: 4869 0024 pea %a1@(36)
5522e: 2d40 fff8 movel %d0,%fp@(-8)
55232: 4eb9 0005 8754 jsr 58754 <_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;
55238: 202e fff8 movel %fp@(-8),%d0
5523c: 2040 moveal %d0,%a0
5523e: 53a8 0020 subql #1,%a0@(32)
_Thread_Enable_dispatch();
55242: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
55248: 242e fff4 movel %fp@(-12),%d2
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();
5524c: 508f addql #8,%sp
return RTEMS_SUCCESSFUL;
5524e: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
55250: 4e5e unlk %fp
55252: 4e75 rts
55254: 242e fff4 movel %fp@(-12),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
55258: 7004 moveq #4,%d0
}
5525a: 4e5e unlk %fp
5525c: 4e75 rts
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
5525e: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
55264: 242e fff4 movel %fp@(-12),%d2
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
55268: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
5526a: 4e5e unlk %fp
...
00054640 <rtems_port_external_to_internal>:
rtems_status_code rtems_port_external_to_internal(
rtems_id id,
void *external,
void **internal
)
{
54640: 4e56 fffc linkw %fp,#-4
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
54644: 4aae 0010 tstl %fp@(16)
54648: 6748 beqs 54692 <rtems_port_external_to_internal+0x52>
RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Dual_ported_memory_Control *)
5464a: 486e fffc pea %fp@(-4)
5464e: 2f2e 0008 movel %fp@(8),%sp@-
54652: 4879 0007 c154 pea 7c154 <_Dual_ported_memory_Information>
54658: 4eb9 0005 a480 jsr 5a480 <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
5465e: 4fef 000c lea %sp@(12),%sp
54662: 4aae fffc tstl %fp@(-4)
54666: 6624 bnes 5468c <rtems_port_external_to_internal+0x4c>
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
54668: 222e 000c movel %fp@(12),%d1
5466c: 2040 moveal %d0,%a0
5466e: 92a8 0014 subl %a0@(20),%d1
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( external, the_port->external_base );
if ( ending > the_port->length )
54672: b2a8 0018 cmpl %a0@(24),%d1
54676: 6320 blss 54698 <rtems_port_external_to_internal+0x58>
*internal = external;
54678: 206e 0010 moveal %fp@(16),%a0
5467c: 20ae 000c movel %fp@(12),%a0@
else
*internal = _Addresses_Add_offset( the_port->internal_base,
ending );
_Thread_Enable_dispatch();
54680: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
54686: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
54688: 4e5e unlk %fp
5468a: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
5468c: 7004 moveq #4,%d0
}
5468e: 4e5e unlk %fp
54690: 4e75 rts
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
return RTEMS_INVALID_ADDRESS;
54692: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
54694: 4e5e unlk %fp
54696: 4e75 rts
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
54698: 2040 moveal %d0,%a0
5469a: d2a8 0010 addl %a0@(16),%d1
5469e: 206e 0010 moveal %fp@(16),%a0
546a2: 2081 movel %d1,%a0@
if ( ending > the_port->length )
*internal = external;
else
*internal = _Addresses_Add_offset( the_port->internal_base,
ending );
_Thread_Enable_dispatch();
546a4: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
546aa: 4280 clrl %d0
546ac: 60da bras 54688 <rtems_port_external_to_internal+0x48>
...
000546d8 <rtems_port_internal_to_external>:
rtems_status_code rtems_port_internal_to_external(
rtems_id id,
void *internal,
void **external
)
{
546d8: 4e56 fffc linkw %fp,#-4
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
546dc: 4aae 0010 tstl %fp@(16)
546e0: 6748 beqs 5472a <rtems_port_internal_to_external+0x52>
546e2: 486e fffc pea %fp@(-4)
546e6: 2f2e 0008 movel %fp@(8),%sp@-
546ea: 4879 0007 c154 pea 7c154 <_Dual_ported_memory_Information>
546f0: 4eb9 0005 a480 jsr 5a480 <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
546f6: 4fef 000c lea %sp@(12),%sp
546fa: 4aae fffc tstl %fp@(-4)
546fe: 6624 bnes 54724 <rtems_port_internal_to_external+0x4c>
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
54700: 222e 000c movel %fp@(12),%d1
54704: 2040 moveal %d0,%a0
54706: 92a8 0010 subl %a0@(16),%d1
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( internal, the_port->internal_base );
if ( ending > the_port->length )
5470a: b2a8 0018 cmpl %a0@(24),%d1
5470e: 6320 blss 54730 <rtems_port_internal_to_external+0x58>
*external = internal;
54710: 206e 0010 moveal %fp@(16),%a0
54714: 20ae 000c movel %fp@(12),%a0@
else
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
54718: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
5471e: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
54720: 4e5e unlk %fp
54722: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
54724: 7004 moveq #4,%d0
}
54726: 4e5e unlk %fp
54728: 4e75 rts
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
return RTEMS_INVALID_ADDRESS;
5472a: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
5472c: 4e5e unlk %fp
5472e: 4e75 rts
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
54730: 2040 moveal %d0,%a0
54732: d2a8 0014 addl %a0@(20),%d1
54736: 206e 0010 moveal %fp@(16),%a0
5473a: 2081 movel %d1,%a0@
if ( ending > the_port->length )
*external = internal;
else
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
5473c: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
54742: 4280 clrl %d0
54744: 60da bras 54720 <rtems_port_internal_to_external+0x48>
...
00073a24 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
73a24: 4e56 fff8 linkw %fp,#-8
73a28: 2f03 movel %d3,%sp@-
73a2a: 2f02 movel %d2,%sp@-
73a2c: 486e fffc pea %fp@(-4)
73a30: 2f2e 0008 movel %fp@(8),%sp@-
73a34: 4879 000a 01c0 pea a01c0 <_Rate_monotonic_Information>
73a3a: 4eb9 0004 8c00 jsr 48c00 <_Objects_Get>
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
73a40: 4fef 000c lea %sp@(12),%sp
73a44: 4aae fffc tstl %fp@(-4)
73a48: 6624 bnes 73a6e <rtems_rate_monotonic_period+0x4a>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
73a4a: 2279 0009 fff2 moveal 9fff2 <_Per_CPU_Information+0xe>,%a1
73a50: 2040 moveal %d0,%a0
73a52: b3e8 0040 cmpal %a0@(64),%a1
73a56: 6726 beqs 73a7e <rtems_rate_monotonic_period+0x5a>
_Thread_Enable_dispatch();
73a58: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
73a5e: 7417 moveq #23,%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73a60: 2002 movel %d2,%d0
73a62: 242e fff0 movel %fp@(-16),%d2
73a66: 262e fff4 movel %fp@(-12),%d3
73a6a: 4e5e unlk %fp
73a6c: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
73a6e: 7404 moveq #4,%d2
}
73a70: 2002 movel %d2,%d0
73a72: 242e fff0 movel %fp@(-16),%d2
73a76: 262e fff4 movel %fp@(-12),%d3
73a7a: 4e5e unlk %fp
73a7c: 4e75 rts
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
73a7e: 4aae 000c tstl %fp@(12)
73a82: 6700 008a beqw 73b0e <rtems_rate_monotonic_period+0xea>
}
_Thread_Enable_dispatch();
return( return_value );
}
_ISR_Disable( level );
73a86: 223c 0000 0700 movel #1792,%d1
73a8c: 40c2 movew %sr,%d2
73a8e: 8282 orl %d2,%d1
73a90: 46c1 movew %d1,%sr
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
73a92: 2040 moveal %d0,%a0
73a94: 2228 0038 movel %a0@(56),%d1
73a98: 6700 00a8 beqw 73b42 <rtems_rate_monotonic_period+0x11e>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
73a9c: 7602 moveq #2,%d3
73a9e: b681 cmpl %d1,%d3
73aa0: 6700 010e beqw 73bb0 <rtems_rate_monotonic_period+0x18c>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
73aa4: 7604 moveq #4,%d3
73aa6: b681 cmpl %d1,%d3
73aa8: 66c4 bnes 73a6e <rtems_rate_monotonic_period+0x4a><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
73aaa: 2f00 movel %d0,%sp@-
73aac: 2d40 fff8 movel %d0,%fp@(-8)
73ab0: 4eba fe08 jsr %pc@(738ba <_Rate_monotonic_Update_statistics>)
_ISR_Enable( level );
73ab4: 46c2 movew %d2,%sr
the_period->state = RATE_MONOTONIC_ACTIVE;
73ab6: 7202 moveq #2,%d1
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
73ab8: 7406 moveq #6,%d2
*/
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
73aba: 202e fff8 movel %fp@(-8),%d0
73abe: 2040 moveal %d0,%a0
the_period->next_length = length;
73ac0: 226e 000c moveal %fp@(12),%a1
*/
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
73ac4: 2141 0038 movel %d1,%a0@(56)
the_period->next_length = length;
73ac8: 2149 003c movel %a1,%a0@(60)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
73acc: 2149 001c movel %a1,%a0@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
73ad0: 4868 0010 pea %a0@(16)
73ad4: 4879 0009 ff16 pea 9ff16 <_Watchdog_Ticks_chain>
73ada: 4eb9 0004 a548 jsr 4a548 <_Watchdog_Insert>
73ae0: 202e fff8 movel %fp@(-8),%d0
73ae4: 2040 moveal %d0,%a0
73ae6: 2f28 003c movel %a0@(60),%sp@-
73aea: 2f28 0040 movel %a0@(64),%sp@-
73aee: 2079 0009 b1b0 moveal 9b1b0 <_Scheduler+0x34>,%a0
73af4: 4e90 jsr %a0@
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
73af6: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73afc: 262e fff4 movel %fp@(-12),%d3
73b00: 2002 movel %d2,%d0
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
73b02: 4fef 0014 lea %sp@(20),%sp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73b06: 242e fff0 movel %fp@(-16),%d2
73b0a: 4e5e unlk %fp
73b0c: 4e75 rts
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
73b0e: 2040 moveal %d0,%a0
73b10: 7204 moveq #4,%d1
73b12: 2028 0038 movel %a0@(56),%d0
73b16: b280 cmpl %d0,%d1
73b18: 651e bcss 73b38 <rtems_rate_monotonic_period+0x114><== NEVER TAKEN
73b1a: 41f9 0009 9958 lea 99958 <CSWTCH.24>,%a0
73b20: 2430 0c00 movel %a0@(00000000,%d0:l:4),%d2
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
73b24: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73b2a: 2002 movel %d2,%d0
73b2c: 242e fff0 movel %fp@(-16),%d2
73b30: 262e fff4 movel %fp@(-12),%d3
73b34: 4e5e unlk %fp
73b36: 4e75 rts
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
73b38: 4282 clrl %d2 <== NOT EXECUTED
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
73b3a: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch> <== NOT EXECUTED
73b40: 60e8 bras 73b2a <rtems_rate_monotonic_period+0x106><== NOT EXECUTED
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
73b42: 46c2 movew %d2,%sr
the_period->next_length = length;
73b44: 226e 000c moveal %fp@(12),%a1
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
73b48: 4282 clrl %d2
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
the_period->next_length = length;
73b4a: 2149 003c movel %a1,%a0@(60)
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
73b4e: 2f00 movel %d0,%sp@-
73b50: 2d40 fff8 movel %d0,%fp@(-8)
73b54: 4eb9 0007 3984 jsr 73984 <_Rate_monotonic_Initiate_statistics>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
73b5a: 202e fff8 movel %fp@(-8),%d0
73b5e: 43f9 0007 3c48 lea 73c48 <_Rate_monotonic_Timeout>,%a1
73b64: 2040 moveal %d0,%a0
the_period->state = RATE_MONOTONIC_ACTIVE;
73b66: 7202 moveq #2,%d1
73b68: 2149 002c movel %a1,%a0@(44)
the_watchdog->id = id;
73b6c: 262e 0008 movel %fp@(8),%d3
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
73b70: 226e 000c moveal %fp@(12),%a1
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
the_watchdog->id = id;
73b74: 2143 0030 movel %d3,%a0@(48)
73b78: 2141 0038 movel %d1,%a0@(56)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
73b7c: 42a8 0018 clrl %a0@(24)
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
73b80: 42a8 0034 clrl %a0@(52)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
73b84: 2149 001c movel %a1,%a0@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
73b88: 4868 0010 pea %a0@(16)
73b8c: 4879 0009 ff16 pea 9ff16 <_Watchdog_Ticks_chain>
73b92: 4eb9 0004 a548 jsr 4a548 <_Watchdog_Insert>
id,
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
73b98: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73b9e: 262e fff4 movel %fp@(-12),%d3
73ba2: 2002 movel %d2,%d0
id,
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
73ba4: 4fef 000c lea %sp@(12),%sp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73ba8: 242e fff0 movel %fp@(-16),%d2
73bac: 4e5e unlk %fp
73bae: 4e75 rts
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
73bb0: 2f00 movel %d0,%sp@-
73bb2: 2d40 fff8 movel %d0,%fp@(-8)
73bb6: 4eba fd02 jsr %pc@(738ba <_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;
73bba: 202e fff8 movel %fp@(-8),%d0
73bbe: 7201 moveq #1,%d1
73bc0: 2040 moveal %d0,%a0
the_period->next_length = length;
73bc2: 226e 000c moveal %fp@(12),%a1
/*
* 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;
73bc6: 2141 0038 movel %d1,%a0@(56)
the_period->next_length = length;
73bca: 2149 003c movel %a1,%a0@(60)
_ISR_Enable( level );
73bce: 46c2 movew %d2,%sr
_Thread_Executing->Wait.id = the_period->Object.id;
73bd0: 2079 0009 fff2 moveal 9fff2 <_Per_CPU_Information+0xe>,%a0
73bd6: 2240 moveal %d0,%a1
73bd8: 5089 addql #8,%a1
73bda: 2151 0020 movel %a1@,%a0@(32)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
73bde: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
73be2: 2d40 fff8 movel %d0,%fp@(-8)
73be6: 2f08 movel %a0,%sp@-
73be8: 4eb9 0004 a1e4 jsr 4a1e4 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
73bee: 223c 0000 0700 movel #1792,%d1
73bf4: 40c2 movew %sr,%d2
73bf6: 8282 orl %d2,%d1
73bf8: 46c1 movew %d1,%sr
local_state = the_period->state;
73bfa: 202e fff8 movel %fp@(-8),%d0
73bfe: 2040 moveal %d0,%a0
73c00: 2228 0038 movel %a0@(56),%d1
the_period->state = RATE_MONOTONIC_ACTIVE;
73c04: 2143 0038 movel %d3,%a0@(56)
_ISR_Enable( level );
73c08: 46c2 movew %d2,%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 )
73c0a: 7003 moveq #3,%d0
73c0c: 4fef 000c lea %sp@(12),%sp
73c10: b081 cmpl %d1,%d0
73c12: 6716 beqs 73c2a <rtems_rate_monotonic_period+0x206>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
73c14: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
73c1a: 4282 clrl %d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
73c1c: 2002 movel %d2,%d0
73c1e: 242e fff0 movel %fp@(-16),%d2
73c22: 262e fff4 movel %fp@(-12),%d3
73c26: 4e5e unlk %fp
73c28: 4e75 rts
/*
* 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 )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
73c2a: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
73c2e: 4282 clrl %d2
/*
* 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 )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
73c30: 2f39 0009 fff2 movel 9fff2 <_Per_CPU_Information+0xe>,%sp@-
73c36: 4eb9 0004 94e8 jsr 494e8 <_Thread_Clear_state>
73c3c: 508f addql #8,%sp
_Thread_Enable_dispatch();
73c3e: 4eb9 0004 98e8 jsr 498e8 <_Thread_Enable_dispatch>
73c44: 60d6 bras 73c1c <rtems_rate_monotonic_period+0x1f8>
...
000664e8 <rtems_rate_monotonic_report_statistics_with_plugin>:
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
664e8: 4e56 ff78 linkw %fp,#-136
664ec: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
664f0: 242e 0008 movel %fp@(8),%d2
664f4: 246e 000c moveal %fp@(12),%a2
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
664f8: 4a8a tstl %a2
664fa: 6700 0082 beqw 6657e <rtems_rate_monotonic_report_statistics_with_plugin+0x96>
return;
(*print)( context, "Period information by period\n" );
664fe: 4879 0009 7050 pea 97050 <_TOD_Days_per_month+0x68>
66504: 2f02 movel %d2,%sp@-
66506: 4e92 jsr %a2@
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
66508: 4879 0009 706e pea 9706e <_TOD_Days_per_month+0x86>
6650e: 2f02 movel %d2,%sp@-
66510: 4e92 jsr %a2@
(*print)( context, "--- Wall times are in seconds ---\n" );
66512: 4879 0009 7090 pea 97090 <_TOD_Days_per_month+0xa8>
66518: 2f02 movel %d2,%sp@-
6651a: 4e92 jsr %a2@
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
6651c: 4879 0009 70b3 pea 970b3 <_TOD_Days_per_month+0xcb>
66522: 2f02 movel %d2,%sp@-
66524: 4e92 jsr %a2@
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
66526: 4fef 001c lea %sp@(28),%sp
6652a: 2ebc 0009 70fe movel #618750,%sp@
66530: 2f02 movel %d2,%sp@-
66532: 4e92 jsr %a2@
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
66534: 2e39 000a 01c6 movel a01c6 <_Rate_monotonic_Information+0x6>,%d7
6653a: 508f addql #8,%sp
6653c: beb9 000a 01ca cmpl a01ca <_Rate_monotonic_Information+0xa>,%d7
66542: 623a bhis 6657e <rtems_rate_monotonic_report_statistics_with_plugin+0x96><== NEVER TAKEN
66544: 260e movel %fp,%d3
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
66546: 2a0e movel %fp,%d5
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
66548: 280e movel %fp,%d4
6654a: 0683 ffff ffc8 addil #-56,%d3
66550: 47f9 0007 3538 lea 73538 <rtems_rate_monotonic_get_statistics>,%a3
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
66556: 0685 ffff ffb0 addil #-80,%d5
6655c: 4bf9 0007 36e4 lea 736e4 <rtems_rate_monotonic_get_status>,%a5
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
66562: 0684 ffff ffa3 addil #-93,%d4
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
66568: 2f03 movel %d3,%sp@-
6656a: 2f07 movel %d7,%sp@-
6656c: 4e93 jsr %a3@
if ( status != RTEMS_SUCCESSFUL )
6656e: 508f addql #8,%sp
66570: 4a80 tstl %d0
66572: 6714 beqs 66588 <rtems_rate_monotonic_report_statistics_with_plugin+0xa0>
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
66574: 5287 addql #1,%d7
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
66576: beb9 000a 01ca cmpl a01ca <_Rate_monotonic_Information+0xa>,%d7
6657c: 63ea blss 66568 <rtems_rate_monotonic_report_statistics_with_plugin+0x80>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
6657e: 4cee 3cfc ff78 moveml %fp@(-136),%d2-%d7/%a2-%a5
66584: 4e5e unlk %fp
66586: 4e75 rts
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
66588: 2f05 movel %d5,%sp@-
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
6658a: 49f9 0006 7160 lea 67160 <_Timespec_Divide_by_integer>,%a4
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
66590: 2f07 movel %d7,%sp@-
66592: 4e95 jsr %a5@
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
66594: 2f04 movel %d4,%sp@-
66596: 4878 0005 pea 5 <COMPARE>
6659a: 2f2e ffb0 movel %fp@(-80),%sp@-
6659e: 4eb9 0004 e620 jsr 4e620 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
665a4: 2f2e ffcc movel %fp@(-52),%sp@-
665a8: 2f2e ffc8 movel %fp@(-56),%sp@-
665ac: 2f04 movel %d4,%sp@-
665ae: 2f07 movel %d7,%sp@-
665b0: 4879 0009 714a pea 9714a <_TOD_Days_per_month+0x162>
665b6: 2f02 movel %d2,%sp@-
665b8: 4e92 jsr %a2@
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
665ba: 202e ffc8 movel %fp@(-56),%d0
665be: 4fef 002c lea %sp@(44),%sp
665c2: 6618 bnes 665dc <rtems_rate_monotonic_report_statistics_with_plugin+0xf4>
(*print)( context, "\n" );
665c4: 4879 0009 20cb pea 920cb <_CPU_m68k_BFFFO_table+0x382>
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
665ca: 5287 addql #1,%d7
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
665cc: 2f02 movel %d2,%sp@-
665ce: 4e92 jsr %a2@
continue;
665d0: 508f addql #8,%sp
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
665d2: beb9 000a 01ca cmpl a01ca <_Rate_monotonic_Information+0xa>,%d7
665d8: 638e blss 66568 <rtems_rate_monotonic_report_statistics_with_plugin+0x80><== ALWAYS TAKEN
665da: 60a2 bras 6657e <rtems_rate_monotonic_report_statistics_with_plugin+0x96><== NOT EXECUTED
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
665dc: 486e ffa8 pea %fp@(-88)
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
665e0: 5287 addql #1,%d7
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
665e2: 2f00 movel %d0,%sp@-
665e4: 486e ffe0 pea %fp@(-32)
665e8: 4e94 jsr %a4@
(*print)( context,
665ea: 202e ffac movel %fp@(-84),%d0
665ee: 223c 0000 03e8 movel #1000,%d1
665f4: 4c41 0800 remsl %d1,%d0,%d0
665f8: 2c2e ffdc movel %fp@(-36),%d6
665fc: 2f00 movel %d0,%sp@-
665fe: 2001 movel %d1,%d0
66600: 2f2e ffa8 movel %fp@(-88),%sp@-
66604: 4c40 6806 remsl %d0,%d6,%d6
66608: 202e ffd4 movel %fp@(-44),%d0
6660c: 2246 moveal %d6,%a1
6660e: 223c 0000 03e8 movel #1000,%d1
66614: 2f09 movel %a1,%sp@-
66616: 2f2e ffd8 movel %fp@(-40),%sp@-
6661a: 4c41 0800 remsl %d1,%d0,%d0
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
6661e: 2c3c 0000 03e8 movel #1000,%d6
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
(*print)( context,
66624: 2f00 movel %d0,%sp@-
66626: 2f2e ffd0 movel %fp@(-48),%sp@-
6662a: 4879 0009 7161 pea 97161 <_TOD_Days_per_month+0x179>
66630: 2f02 movel %d2,%sp@-
66632: 4e92 jsr %a2@
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
66634: 4fef 002c lea %sp@(44),%sp
66638: 486e ffa8 pea %fp@(-88)
6663c: 2f2e ffc8 movel %fp@(-56),%sp@-
66640: 486e fff8 pea %fp@(-8)
66644: 4e94 jsr %a4@
(*print)( context,
66646: 202e ffac movel %fp@(-84),%d0
6664a: 4c46 0800 remsl %d6,%d0,%d0
6664e: 222e fff4 movel %fp@(-12),%d1
66652: 2f00 movel %d0,%sp@-
66654: 2f2e ffa8 movel %fp@(-88),%sp@-
66658: 4c46 1801 remsl %d6,%d1,%d1
6665c: 202e ffec movel %fp@(-20),%d0
66660: 2241 moveal %d1,%a1
66662: 2f09 movel %a1,%sp@-
66664: 2f2e fff0 movel %fp@(-16),%sp@-
66668: 4c46 0800 remsl %d6,%d0,%d0
6666c: 2f00 movel %d0,%sp@-
6666e: 2f2e ffe8 movel %fp@(-24),%sp@-
66672: 4879 0009 7180 pea 97180 <_TOD_Days_per_month+0x198>
66678: 2f02 movel %d2,%sp@-
6667a: 4e92 jsr %a2@
6667c: 4fef 002c lea %sp@(44),%sp
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
66680: beb9 000a 01ca cmpl a01ca <_Rate_monotonic_Information+0xa>,%d7
66686: 6300 fee0 blsw 66568 <rtems_rate_monotonic_report_statistics_with_plugin+0x80>
6668a: 6000 fef2 braw 6657e <rtems_rate_monotonic_report_statistics_with_plugin+0x96><== NOT EXECUTED
000666a8 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
666a8: 4e56 0000 linkw %fp,#0
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
666ac: 2039 0009 fe7a movel 9fe7a <_Thread_Dispatch_disable_level>,%d0
++level;
666b2: 5280 addql #1,%d0
666b4: 2f0a movel %a2,%sp@-
_Thread_Dispatch_disable_level = level;
666b6: 23c0 0009 fe7a movel %d0,9fe7a <_Thread_Dispatch_disable_level>
666bc: 2f02 movel %d2,%sp@-
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
666be: 2439 000a 01c6 movel a01c6 <_Rate_monotonic_Information+0x6>,%d2
666c4: 45f9 0006 66f4 lea 666f4 <rtems_rate_monotonic_reset_statistics>,%a2
666ca: b4b9 000a 01ca cmpl a01ca <_Rate_monotonic_Information+0xa>,%d2
666d0: 6210 bhis 666e2 <rtems_rate_monotonic_reset_all_statistics+0x3a><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
666d2: 2f02 movel %d2,%sp@-
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
666d4: 5282 addql #1,%d2
(void) rtems_rate_monotonic_reset_statistics( id );
666d6: 4e92 jsr %a2@
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
666d8: 588f addql #4,%sp
666da: b4b9 000a 01ca cmpl a01ca <_Rate_monotonic_Information+0xa>,%d2
666e0: 63f0 blss 666d2 <rtems_rate_monotonic_reset_all_statistics+0x2a>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
666e2: 242e fff8 movel %fp@(-8),%d2
666e6: 246e fffc moveal %fp@(-4),%a2
666ea: 4e5e unlk %fp
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
666ec: 4ef9 0004 98e8 jmp 498e8 <_Thread_Enable_dispatch>
...
000486de <rtems_rbheap_allocate>:
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
486de: 4e56 ffec linkw %fp,#-20
486e2: 202e 000c movel %fp@(12),%d0
486e6: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
486ea: 266e 0008 moveal %fp@(8),%a3
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
486ee: 2400 movel %d0,%d2
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
486f0: 262b 002e movel %a3@(46),%d3
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
486f4: 4c43 2001 remul %d3,%d1,%d2
if (excess > 0) {
486f8: 4a81 tstl %d1
486fa: 664a bnes 48746 <rtems_rbheap_allocate+0x68> <== NEVER TAKEN
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
486fc: 2600 movel %d0,%d3
486fe: 6716 beqs 48716 <rtems_rbheap_allocate+0x38>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
48700: 204b moveal %a3,%a0
48702: 2458 moveal %a0@+,%a2
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
48704: b1ca cmpal %a2,%a0
48706: 670e beqs 48716 <rtems_rbheap_allocate+0x38>
rtems_rbheap_chunk *free_chunk = (rtems_rbheap_chunk *) current;
if (free_chunk->size >= size) {
48708: 242a 001c movel %a2@(28),%d2
4870c: b682 cmpl %d2,%d3
4870e: 6312 blss 48722 <rtems_rbheap_allocate+0x44>
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
if (chunk != NULL) {
rtems_rbheap_add_to_spare_descriptor_chain(control, chunk);
}
}
48710: 2452 moveal %a2@,%a2
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
48712: b5c8 cmpal %a0,%a2
48714: 66f2 bnes 48708 <rtems_rbheap_allocate+0x2a> <== NEVER TAKEN
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
48716: 4280 clrl %d0
}
}
}
return ptr;
}
48718: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4
4871e: 4e5e unlk %fp
48720: 4e75 rts
rtems_rbheap_chunk *free_chunk = search_free_chunk(free_chain, aligned_size);
if (free_chunk != NULL) {
uintptr_t free_size = free_chunk->size;
if (free_size > aligned_size) {
48722: b483 cmpl %d3,%d2
48724: 6236 bhis 4875c <rtems_rbheap_allocate+0x7e>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
48726: 2252 moveal %a2@,%a1
previous = the_node->previous;
48728: 206a 0004 moveal %a2@(4),%a0
ptr = (void *) new_chunk->begin;
}
} else {
rtems_chain_extract_unprotected(&free_chunk->chain_node);
rtems_chain_set_off_chain(&free_chunk->chain_node);
ptr = (void *) free_chunk->begin;
4872c: 202a 0018 movel %a2@(24),%d0
next->previous = previous;
48730: 2348 0004 movel %a0,%a1@(4)
previous->next = next;
48734: 2089 movel %a1,%a0@
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
48736: 42aa 0004 clrl %a2@(4)
4873a: 4292 clrl %a2@
}
}
}
return ptr;
}
4873c: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4
48742: 4e5e unlk %fp
48744: 4e75 rts
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
value += alignment - excess;
48746: d680 addl %d0,%d3 <== NOT EXECUTED
48748: 9681 subl %d1,%d3 <== NOT EXECUTED
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
4874a: 4a80 tstl %d0 <== NOT EXECUTED
4874c: 67c8 beqs 48716 <rtems_rbheap_allocate+0x38> <== NOT EXECUTED
4874e: b680 cmpl %d0,%d3 <== NOT EXECUTED
48750: 65c4 bcss 48716 <rtems_rbheap_allocate+0x38> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
48752: 204b moveal %a3,%a0 <== NOT EXECUTED
48754: 2458 moveal %a0@+,%a2 <== NOT EXECUTED
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
48756: b1ca cmpal %a2,%a0 <== NOT EXECUTED
48758: 66ae bnes 48708 <rtems_rbheap_allocate+0x2a> <== NOT EXECUTED
4875a: 60ba bras 48716 <rtems_rbheap_allocate+0x38> <== NOT EXECUTED
if (free_chunk != NULL) {
uintptr_t free_size = free_chunk->size;
if (free_size > aligned_size) {
rtems_rbheap_chunk *new_chunk = get_chunk(control);
4875c: 2f0b movel %a3,%sp@-
4875e: 4eba fd5c jsr %pc@(484bc <get_chunk>)
if (new_chunk != NULL) {
48762: 588f addql #4,%sp
if (free_chunk != NULL) {
uintptr_t free_size = free_chunk->size;
if (free_size > aligned_size) {
rtems_rbheap_chunk *new_chunk = get_chunk(control);
48764: 2840 moveal %d0,%a4
if (new_chunk != NULL) {
48766: 4a80 tstl %d0
48768: 67ac beqs 48716 <rtems_rbheap_allocate+0x38> <== NEVER TAKEN
uintptr_t new_free_size = free_size - aligned_size;
4876a: 9483 subl %d3,%d2
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
4876c: 2002 movel %d2,%d0
4876e: d0aa 0018 addl %a2@(24),%d0
rtems_rbheap_chunk *new_chunk = get_chunk(control);
if (new_chunk != NULL) {
uintptr_t new_free_size = free_size - aligned_size;
free_chunk->size = new_free_size;
48772: 2542 001c movel %d2,%a2@(28)
new_chunk->begin = free_chunk->begin + new_free_size;
48776: 2940 0018 movel %d0,%a4@(24)
new_chunk->size = aligned_size;
4877a: 2943 001c movel %d3,%a4@(28)
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
4877e: 42ac 0004 clrl %a4@(4)
48782: 4294 clrl %a4@
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
48784: 486c 0008 pea %a4@(8)
48788: 486b 0018 pea %a3@(24)
4878c: 4eb9 0004 a0bc jsr 4a0bc <_RBTree_Insert_unprotected>
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
new_chunk->size = aligned_size;
rtems_chain_set_off_chain(&new_chunk->chain_node);
insert_into_tree(chunk_tree, new_chunk);
ptr = (void *) new_chunk->begin;
48792: 202c 0018 movel %a4@(24),%d0
48796: 508f addql #8,%sp
}
}
}
return ptr;
}
48798: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4
4879e: 4e5e unlk %fp <== NOT EXECUTED
000488a2 <rtems_rbheap_extend_descriptors_with_malloc>:
void rtems_rbheap_extend_descriptors_with_malloc(rtems_rbheap_control *control)
{
488a2: 4e56 0000 linkw %fp,#0 <== NOT EXECUTED
488a6: 2f0b movel %a3,%sp@- <== NOT EXECUTED
488a8: 2f0a movel %a2,%sp@- <== NOT EXECUTED
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
488aa: 4878 0020 pea 20 <OPER2+0xc> <== NOT EXECUTED
{
/* Do nothing */
}
void rtems_rbheap_extend_descriptors_with_malloc(rtems_rbheap_control *control)
{
488ae: 246e 0008 moveal %fp@(8),%a2 <== NOT EXECUTED
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
488b2: 4eb9 0004 3b84 jsr 43b84 <malloc> <== NOT EXECUTED
if (chunk != NULL) {
488b8: 588f addql #4,%sp <== NOT EXECUTED
488ba: 4a80 tstl %d0 <== NOT EXECUTED
488bc: 6718 beqs 488d6 <rtems_rbheap_extend_descriptors_with_malloc+0x34><== NOT EXECUTED
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
488be: 206a 000c moveal %a2@(12),%a0 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert_unprotected(_Chain_Head(the_chain), the_node);
488c2: 2240 moveal %d0,%a1 <== NOT EXECUTED
488c4: 47ea 000c lea %a2@(12),%a3 <== NOT EXECUTED
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
488c8: 2540 000c movel %d0,%a2@(12) <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert_unprotected(_Chain_Head(the_chain), the_node);
488cc: 234b 0004 movel %a3,%a1@(4) <== NOT EXECUTED
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
488d0: 2288 movel %a0,%a1@ <== NOT EXECUTED
before_node->previous = the_node;
488d2: 2140 0004 movel %d0,%a0@(4) <== NOT EXECUTED
rtems_rbheap_add_to_spare_descriptor_chain(control, chunk);
}
}
488d6: 246e fff8 moveal %fp@(-8),%a2 <== NOT EXECUTED
488da: 266e fffc moveal %fp@(-4),%a3 <== NOT EXECUTED
488de: 4e5e unlk %fp <== NOT EXECUTED
...
000487a2 <rtems_rbheap_free>:
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
487a2: 4e56 ffc4 linkw %fp,#-60
487a6: 202e 000c movel %fp@(12),%d0
487aa: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
487ae: 2a6e 0008 moveal %fp@(8),%a5
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
487b2: 4a80 tstl %d0
487b4: 6700 00cc beqw 48882 <rtems_rbheap_free+0xe0>
#define NULL_PAGE rtems_rbheap_chunk_of_node(NULL)
static rtems_rbheap_chunk *find(rtems_rbtree_control *chunk_tree, uintptr_t key)
{
rtems_rbheap_chunk chunk = { .begin = key };
487b8: 49ee ffe8 lea %fp@(-24),%a4
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
487bc: 47ed 0018 lea %a5@(24),%a3
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
487c0: 246d 001c moveal %a5@(28),%a2
#define NULL_PAGE rtems_rbheap_chunk_of_node(NULL)
static rtems_rbheap_chunk *find(rtems_rbtree_control *chunk_tree, uintptr_t key)
{
rtems_rbheap_chunk chunk = { .begin = key };
487c4: 42ae ffe0 clrl %fp@(-32)
487c8: 42ae ffe4 clrl %fp@(-28)
487cc: 4294 clrl %a4@
487ce: 42ae ffec clrl %fp@(-20)
487d2: 42ae fff0 clrl %fp@(-16)
487d6: 42ae fff4 clrl %fp@(-12)
487da: 42ae fffc clrl %fp@(-4)
487de: 2d40 fff8 movel %d0,%fp@(-8)
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
487e2: 4a8a tstl %a2
487e4: 6700 00a8 beqw 4888e <rtems_rbheap_free+0xec>
487e8: 4282 clrl %d2
compare_result = the_rbtree->compare_function(the_node, iter_node);
487ea: 2f0a movel %a2,%sp@-
487ec: 206b 0010 moveal %a3@(16),%a0
487f0: 2f0c movel %a4,%sp@-
487f2: 4e90 jsr %a0@
if ( _RBTree_Is_equal( compare_result ) ) {
487f4: 508f addql #8,%sp
487f6: 4a80 tstl %d0
487f8: 6608 bnes 48802 <rtems_rbheap_free+0x60> <== NEVER TAKEN
found = iter_node;
if ( the_rbtree->is_unique )
487fa: 240a movel %a2,%d2
487fc: 4a2b 0014 tstb %a3@(20)
48800: 6612 bnes 48814 <rtems_rbheap_free+0x72> <== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
48802: 4a80 tstl %d0
48804: 5ec0 sgt %d0
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
48806: 7201 moveq #1,%d1
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
48808: 49c0 extbl %d0
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
4880a: 9280 subl %d0,%d1
4880c: 2472 1c00 moveal %a2@(00000000,%d1:l:4),%a2
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
48810: 4a8a tstl %a2
48812: 66d6 bnes 487ea <rtems_rbheap_free+0x48> <== NEVER TAKEN
return rtems_rbheap_chunk_of_node(
48814: 2442 moveal %d2,%a2
48816: 518a subql #8,%a2
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
48818: 70f8 moveq #-8,%d0
4881a: b08a cmpl %a2,%d0
4881c: 6770 beqs 4888e <rtems_rbheap_free+0xec>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
4881e: 4a92 tstl %a2@
48820: 670c beqs 4882e <rtems_rbheap_free+0x8c>
check_and_merge(free_chain, chunk_tree, chunk, succ);
add_to_chain(free_chain, chunk);
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
48822: 700e moveq #14,%d0
sc = RTEMS_INVALID_ID;
}
}
return sc;
}
48824: 4cee 3c1c ffc4 moveml %fp@(-60),%d2-%d4/%a2-%a5
4882a: 4e5e unlk %fp
4882c: 4e75 rts
4882e: 4aaa 0004 tstl %a2@(4)
48832: 66ee bnes 48822 <rtems_rbheap_free+0x80> <== NEVER TAKEN
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
48834: 42a7 clrl %sp@-
48836: 283c 0004 a33c movel #303932,%d4
4883c: 2f02 movel %d2,%sp@-
4883e: 2044 moveal %d4,%a0
if (chunk != NULL_PAGE) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
rtems_rbheap_chunk *pred = get_next(chunk, RBT_LEFT);
rtems_rbheap_chunk *succ = get_next(chunk, RBT_RIGHT);
check_and_merge(free_chain, chunk_tree, chunk, succ);
48840: 49fa fcf6 lea %pc@(48538 <check_and_merge>),%a4
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
48844: 4e90 jsr %a0@
48846: 4878 0001 pea 1 <ADD>
4884a: 2044 moveal %d4,%a0
4884c: 2600 movel %d0,%d3
4884e: 2f02 movel %d2,%sp@-
48850: 4e90 jsr %a0@
if (chunk != NULL_PAGE) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
rtems_rbheap_chunk *pred = get_next(chunk, RBT_LEFT);
rtems_rbheap_chunk *succ = get_next(chunk, RBT_RIGHT);
check_and_merge(free_chain, chunk_tree, chunk, succ);
48852: 5180 subql #8,%d0
48854: 2f00 movel %d0,%sp@-
48856: 2f0a movel %a2,%sp@-
48858: 2f0b movel %a3,%sp@-
4885a: 2f0d movel %a5,%sp@-
4885c: 4e94 jsr %a4@
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
4885e: 2055 moveal %a5@,%a0
add_to_chain(free_chain, chunk);
check_and_merge(free_chain, chunk_tree, chunk, pred);
48860: 4fef 0020 lea %sp@(32),%sp
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
48864: 254d 0004 movel %a5,%a2@(4)
before_node = after_node->next;
after_node->next = the_node;
48868: 2a8a movel %a2,%a5@
the_node->next = before_node;
before_node->previous = the_node;
4886a: 214a 0004 movel %a2,%a0@(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;
4886e: 2488 movel %a0,%a2@
48870: 2043 moveal %d3,%a0
48872: 4868 fff8 pea %a0@(-8)
48876: 2f0a movel %a2,%sp@-
48878: 2f0b movel %a3,%sp@-
4887a: 2f0d movel %a5,%sp@-
4887c: 4e94 jsr %a4@
4887e: 4fef 0010 lea %sp@(16),%sp
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
48882: 4280 clrl %d0
sc = RTEMS_INVALID_ID;
}
}
return sc;
}
48884: 4cee 3c1c ffc4 moveml %fp@(-60),%d2-%d4/%a2-%a5
4888a: 4e5e unlk %fp
4888c: 4e75 rts
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
}
} else {
sc = RTEMS_INVALID_ID;
4888e: 7004 moveq #4,%d0
}
}
return sc;
}
48890: 4cee 3c1c ffc4 moveml %fp@(-60),%d2-%d4/%a2-%a5
48896: 4e5e unlk %fp <== NOT EXECUTED
000485b2 <rtems_rbheap_initialize>:
uintptr_t area_size,
uintptr_t alignment,
rtems_rbheap_extend_descriptors extend_descriptors,
void *handler_arg
)
{
485b2: 4e56 fff0 linkw %fp,#-16
485b6: 202e 0014 movel %fp@(20),%d0
485ba: 48d7 041c moveml %d2-%d4/%a2,%sp@
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (alignment > 0) {
485be: 4a80 tstl %d0
485c0: 660c bnes 485ce <rtems_rbheap_initialize+0x1c>
}
} else {
sc = RTEMS_INVALID_ADDRESS;
}
} else {
sc = RTEMS_INVALID_NUMBER;
485c2: 700a moveq #10,%d0
}
return sc;
}
485c4: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
485ca: 4e5e unlk %fp
485cc: 4e75 rts
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
485ce: 262e 000c movel %fp@(12),%d3
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (alignment > 0) {
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
485d2: 242e 000c movel %fp@(12),%d2
485d6: d4ae 0010 addl %fp@(16),%d2
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
485da: 4c40 3001 remul %d0,%d1,%d3
if (excess > 0) {
485de: 4a81 tstl %d1
485e0: 6600 00c2 bnew 486a4 <rtems_rbheap_initialize+0xf2>
return value;
}
static uintptr_t align_down(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
485e4: 2602 movel %d2,%d3
return value - excess;
485e6: 2802 movel %d2,%d4
return value;
}
static uintptr_t align_down(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
485e8: 4c40 3001 remul %d0,%d1,%d3
return value - excess;
485ec: 9881 subl %d1,%d4
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
485ee: b4ae 000c cmpl %fp@(12),%d2
485f2: 6300 00b6 blsw 486aa <rtems_rbheap_initialize+0xf8>
485f6: 262e 000c movel %fp@(12),%d3
485fa: b684 cmpl %d4,%d3
485fc: 6400 00ac bccw 486aa <rtems_rbheap_initialize+0xf8>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
48600: 206e 0008 moveal %fp@(8),%a0
48604: 2448 moveal %a0,%a2
48606: 45ea 0010 lea %a2@(16),%a2
4860a: 226e 0008 moveal %fp@(8),%a1
4860e: 5889 addql #4,%a1
48610: 2089 movel %a1,%a0@
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
48612: 2248 moveal %a0,%a1
48614: 43e9 000c lea %a1@(12),%a1
Chain_Node *tail = _Chain_Tail( the_chain );
48618: 214a 000c movel %a2,%a0@(12)
{
the_rbtree->permanent_null = NULL;
the_rbtree->root = NULL;
the_rbtree->first[0] = NULL;
the_rbtree->first[1] = NULL;
the_rbtree->compare_function = compare_function;
4861c: 45fa fe86 lea %pc@(484a4 <chunk_compare>),%a2
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
48620: 2149 0014 movel %a1,%a0@(20)
rtems_chain_initialize_empty(free_chain);
rtems_chain_initialize_empty(&control->spare_descriptor_chain);
rtems_rbtree_initialize_empty(chunk_tree, chunk_compare, true);
control->alignment = alignment;
control->handler_arg = handler_arg;
48624: 43ee 001c lea %fp@(28),%a1
48628: 214a 0028 movel %a2,%a0@(40)
control->extend_descriptors = extend_descriptors;
4862c: 45ee 0018 lea %fp@(24),%a2
rtems_chain_initialize_empty(free_chain);
rtems_chain_initialize_empty(&control->spare_descriptor_chain);
rtems_rbtree_initialize_empty(chunk_tree, chunk_compare, true);
control->alignment = alignment;
control->handler_arg = handler_arg;
48630: 2151 0036 movel %a1@,%a0@(54)
control->extend_descriptors = extend_descriptors;
48634: 2152 0032 movel %a2@,%a0@(50)
the_rbtree->is_unique = is_unique;
48638: 7201 moveq #1,%d1
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
4863a: 42a8 0004 clrl %a0@(4)
4863e: 1141 002c moveb %d1,%a0@(44)
tail->previous = head;
48642: 2148 0008 movel %a0,%a0@(8)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
48646: 42a8 0010 clrl %a0@(16)
RBTree_Control *the_rbtree,
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
4864a: 42a8 0018 clrl %a0@(24)
the_rbtree->root = NULL;
4864e: 42a8 001c clrl %a0@(28)
the_rbtree->first[0] = NULL;
48652: 42a8 0020 clrl %a0@(32)
the_rbtree->first[1] = NULL;
48656: 42a8 0024 clrl %a0@(36)
rtems_rbheap_chunk *first = NULL;
rtems_chain_initialize_empty(free_chain);
rtems_chain_initialize_empty(&control->spare_descriptor_chain);
rtems_rbtree_initialize_empty(chunk_tree, chunk_compare, true);
control->alignment = alignment;
4865a: 2140 002e movel %d0,%a0@(46)
control->handler_arg = handler_arg;
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
4865e: 2f08 movel %a0,%sp@-
48660: 4eba fe5a jsr %pc@(484bc <get_chunk>)
if (first != NULL) {
48664: 588f addql #4,%sp
rtems_rbtree_initialize_empty(chunk_tree, chunk_compare, true);
control->alignment = alignment;
control->handler_arg = handler_arg;
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
48666: 2040 moveal %d0,%a0
if (first != NULL) {
48668: 4a80 tstl %d0
4866a: 6766 beqs 486d2 <rtems_rbheap_initialize+0x120>
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
4866c: 246e 0008 moveal %fp@(8),%a2
first->begin = aligned_begin;
first->size = aligned_end - aligned_begin;
48670: 9883 subl %d3,%d4
48672: 2252 moveal %a2@,%a1
48674: 2144 001c movel %d4,%a0@(28)
control->handler_arg = handler_arg;
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
if (first != NULL) {
first->begin = aligned_begin;
48678: 2143 0018 movel %d3,%a0@(24)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
4867c: 214a 0004 movel %a2,%a0@(4)
before_node = after_node->next;
after_node->next = the_node;
48680: 2480 movel %d0,%a2@
the_node->next = before_node;
before_node->previous = the_node;
48682: 2340 0004 movel %d0,%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;
48686: 2089 movel %a1,%a0@
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
48688: 4868 0008 pea %a0@(8)
4868c: 486a 0018 pea %a2@(24)
48690: 4eb9 0004 a0bc jsr 4a0bc <_RBTree_Insert_unprotected>
48696: 508f addql #8,%sp
uintptr_t alignment,
rtems_rbheap_extend_descriptors extend_descriptors,
void *handler_arg
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
48698: 4280 clrl %d0
} else {
sc = RTEMS_INVALID_NUMBER;
}
return sc;
}
4869a: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
486a0: 4e5e unlk %fp
486a2: 4e75 rts
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
486a4: b4ae 000c cmpl %fp@(12),%d2
486a8: 620c bhis 486b6 <rtems_rbheap_initialize+0x104>
insert_into_tree(chunk_tree, first);
} else {
sc = RTEMS_NO_MEMORY;
}
} else {
sc = RTEMS_INVALID_ADDRESS;
486aa: 7009 moveq #9,%d0
} else {
sc = RTEMS_INVALID_NUMBER;
}
return sc;
}
486ac: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
486b2: 4e5e unlk %fp
486b4: 4e75 rts
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
value += alignment - excess;
486b6: 262e 000c movel %fp@(12),%d3
486ba: d680 addl %d0,%d3
486bc: 9681 subl %d1,%d3
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
486be: b6ae 000c cmpl %fp@(12),%d3
486c2: 65e6 bcss 486aa <rtems_rbheap_initialize+0xf8> <== NEVER TAKEN
return value;
}
static uintptr_t align_down(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
486c4: 2802 movel %d2,%d4
486c6: 4c40 4001 remul %d0,%d1,%d4
return value - excess;
486ca: 2802 movel %d2,%d4
486cc: 9881 subl %d1,%d4
486ce: 6000 ff2a braw 485fa <rtems_rbheap_initialize+0x48>
first->begin = aligned_begin;
first->size = aligned_end - aligned_begin;
add_to_chain(free_chain, first);
insert_into_tree(chunk_tree, first);
} else {
sc = RTEMS_NO_MEMORY;
486d2: 701a moveq #26,%d0
} else {
sc = RTEMS_INVALID_NUMBER;
}
return sc;
}
486d4: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
486da: 4e5e unlk %fp <== NOT EXECUTED
00055e80 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
55e80: 4e56 fffc linkw %fp,#-4
55e84: 2f0a movel %a2,%sp@-
55e86: 2f02 movel %d2,%sp@-
uintptr_t amount_extended;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
55e88: 4aae 000c tstl %fp@(12)
55e8c: 6700 0082 beqw 55f10 <rtems_region_extend+0x90>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
55e90: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
55e96: 4eb9 0005 86c0 jsr 586c0 <_API_Mutex_Lock>
RTEMS_INLINE_ROUTINE Region_Control *_Region_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
55e9c: 486e fffc pea %fp@(-4)
55ea0: 2f2e 0008 movel %fp@(8),%sp@-
55ea4: 4879 0007 c1fc pea 7c1fc <_Region_Information>
55eaa: 4eb9 0005 a440 jsr 5a440 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
55eb0: 4fef 0010 lea %sp@(16),%sp
55eb4: 2440 moveal %d0,%a2
55eb6: 4aae fffc tstl %fp@(-4)
55eba: 6642 bnes 55efe <rtems_region_extend+0x7e>
case OBJECTS_LOCAL:
amount_extended = _Heap_Extend(
55ebc: 42a7 clrl %sp@-
55ebe: 2f2e 0010 movel %fp@(16),%sp@-
55ec2: 2f2e 000c movel %fp@(12),%sp@-
55ec6: 486a 0068 pea %a2@(104)
55eca: 4eb9 0005 947c jsr 5947c <_Heap_Extend>
starting_address,
length,
0
);
if ( amount_extended > 0 ) {
55ed0: 4fef 0010 lea %sp@(16),%sp
55ed4: 4a80 tstl %d0
55ed6: 6748 beqs 55f20 <rtems_region_extend+0xa0>
the_region->length += amount_extended;
55ed8: d1aa 0054 addl %d0,%a2@(84)
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
55edc: 4282 clrl %d2
0
);
if ( amount_extended > 0 ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
55ede: d1aa 005c addl %d0,%a2@(92)
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
55ee2: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
55ee8: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
55eee: 588f addql #4,%sp
return return_status;
}
55ef0: 2002 movel %d2,%d0
55ef2: 242e fff4 movel %fp@(-12),%d2
55ef6: 246e fff8 moveal %fp@(-8),%a2
55efa: 4e5e unlk %fp
55efc: 4e75 rts
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
55efe: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
55f04: 7404 moveq #4,%d2
break;
}
_RTEMS_Unlock_allocator();
55f06: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
55f0c: 588f addql #4,%sp
55f0e: 60e0 bras 55ef0 <rtems_region_extend+0x70>
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
55f10: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
55f12: 2002 movel %d2,%d0
55f14: 242e fff4 movel %fp@(-12),%d2
55f18: 246e fff8 moveal %fp@(-8),%a2
55f1c: 4e5e unlk %fp
55f1e: 4e75 rts
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
55f20: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
if ( amount_extended > 0 ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
} else {
return_status = RTEMS_INVALID_ADDRESS;
55f26: 7409 moveq #9,%d2
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
55f28: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
55f2e: 588f addql #4,%sp
55f30: 60be bras 55ef0 <rtems_region_extend+0x70>
...
00055fcc <rtems_region_get_information>:
rtems_status_code rtems_region_get_information(
rtems_id id,
Heap_Information_block *the_info
)
{
55fcc: 4e56 fffc linkw %fp,#-4
55fd0: 2f02 movel %d2,%sp@-
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
55fd2: 4aae 000c tstl %fp@(12)
55fd6: 6768 beqs 56040 <rtems_region_get_information+0x74><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
55fd8: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
55fde: 4eb9 0005 86c0 jsr 586c0 <_API_Mutex_Lock>
55fe4: 486e fffc pea %fp@(-4)
55fe8: 2f2e 0008 movel %fp@(8),%sp@-
55fec: 4879 0007 c1fc pea 7c1fc <_Region_Information>
55ff2: 4eb9 0005 a440 jsr 5a440 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
55ff8: 4fef 0010 lea %sp@(16),%sp
55ffc: 4aae fffc tstl %fp@(-4)
56000: 662c bnes 5602e <rtems_region_get_information+0x62>
case OBJECTS_LOCAL:
_Heap_Get_information( &the_region->Memory, the_info );
56002: 2f2e 000c movel %fp@(12),%sp@-
56006: 2040 moveal %d0,%a0
56008: 4868 0068 pea %a0@(104)
return_status = RTEMS_SUCCESSFUL;
5600c: 4282 clrl %d2
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Heap_Get_information( &the_region->Memory, the_info );
5600e: 4eb9 0005 98e4 jsr 598e4 <_Heap_Get_information>
return_status = RTEMS_SUCCESSFUL;
break;
56014: 508f addql #8,%sp
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
56016: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
5601c: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
56022: 588f addql #4,%sp
return return_status;
}
56024: 2002 movel %d2,%d0
56026: 242e fff8 movel %fp@(-8),%d2
5602a: 4e5e unlk %fp
5602c: 4e75 rts
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
5602e: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
56034: 7404 moveq #4,%d2
break;
}
_RTEMS_Unlock_allocator();
56036: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
5603c: 588f addql #4,%sp
5603e: 60e4 bras 56024 <rtems_region_get_information+0x58>
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
56040: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
56042: 2002 movel %d2,%d0
56044: 242e fff8 movel %fp@(-8),%d2
56048: 4e5e unlk %fp <== NOT EXECUTED
000561bc <rtems_region_get_segment_size>:
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
uintptr_t *size
)
{
561bc: 4e56 fff8 linkw %fp,#-8
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
561c0: 4aae 000c tstl %fp@(12)
561c4: 6768 beqs 5622e <rtems_region_get_segment_size+0x72>
return RTEMS_INVALID_ADDRESS;
if ( !size )
561c6: 4aae 0010 tstl %fp@(16)
561ca: 6762 beqs 5622e <rtems_region_get_segment_size+0x72>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
561cc: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
561d2: 4eb9 0005 86c0 jsr 586c0 <_API_Mutex_Lock>
561d8: 486e fffc pea %fp@(-4)
561dc: 2f2e 0008 movel %fp@(8),%sp@-
561e0: 4879 0007 c1fc pea 7c1fc <_Region_Information>
561e6: 4eb9 0005 a440 jsr 5a440 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
561ec: 222e fffc movel %fp@(-4),%d1
561f0: 4fef 0010 lea %sp@(16),%sp
561f4: 663e bnes 56234 <rtems_region_get_segment_size+0x78>
case OBJECTS_LOCAL:
if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) )
561f6: 2f2e 0010 movel %fp@(16),%sp@-
561fa: 2040 moveal %d0,%a0
561fc: 2f2e 000c movel %fp@(12),%sp@-
56200: 4868 0068 pea %a0@(104)
56204: 4eb9 0005 9e1c jsr 59e1c <_Heap_Size_of_alloc_area>
5620a: 4fef 000c lea %sp@(12),%sp
5620e: 4a00 tstb %d0
56210: 675c beqs 5626e <rtems_region_get_segment_size+0xb2><== NEVER TAKEN
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
56212: 4280 clrl %d0
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
56214: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
5621a: 2d40 fff8 movel %d0,%fp@(-8)
5621e: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
56224: 202e fff8 movel %fp@(-8),%d0
56228: 588f addql #4,%sp
return return_status;
}
5622a: 4e5e unlk %fp
5622c: 4e75 rts
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
return RTEMS_INVALID_ADDRESS;
5622e: 7009 moveq #9,%d0
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
56230: 4e5e unlk %fp
56232: 4e75 rts
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
56234: 7001 moveq #1,%d0
56236: b081 cmpl %d1,%d0
56238: 671a beqs 56254 <rtems_region_get_segment_size+0x98><== ALWAYS TAKEN
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
5623a: 4200 clrb %d0 <== NOT EXECUTED
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
5623c: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@- <== NOT EXECUTED
56242: 2d40 fff8 movel %d0,%fp@(-8) <== NOT EXECUTED
56246: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock> <== NOT EXECUTED
5624c: 202e fff8 movel %fp@(-8),%d0 <== NOT EXECUTED
56250: 588f addql #4,%sp <== NOT EXECUTED
56252: 60d6 bras 5622a <rtems_region_get_segment_size+0x6e><== NOT EXECUTED
case OBJECTS_REMOTE: /* this error cannot be returned */
break;
#endif
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
56254: 7004 moveq #4,%d0
break;
}
_RTEMS_Unlock_allocator();
56256: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@-
5625c: 2d40 fff8 movel %d0,%fp@(-8)
56260: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock>
56266: 202e fff8 movel %fp@(-8),%d0
5626a: 588f addql #4,%sp
5626c: 60bc bras 5622a <rtems_region_get_segment_size+0x6e>
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) )
return_status = RTEMS_INVALID_ADDRESS;
5626e: 7009 moveq #9,%d0 <== NOT EXECUTED
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
56270: 2f39 0007 c386 movel 7c386 <_RTEMS_Allocator_Mutex>,%sp@- <== NOT EXECUTED
56276: 2d40 fff8 movel %d0,%fp@(-8) <== NOT EXECUTED
5627a: 4eb9 0005 8720 jsr 58720 <_API_Mutex_Unlock> <== NOT EXECUTED
56280: 202e fff8 movel %fp@(-8),%d0 <== NOT EXECUTED
56284: 588f addql #4,%sp <== NOT EXECUTED
56286: 60a2 bras 5622a <rtems_region_get_segment_size+0x6e><== NOT EXECUTED
00047194 <rtems_semaphore_create>:
uint32_t count,
rtems_attribute attribute_set,
rtems_task_priority priority_ceiling,
rtems_id *id
)
{
47194: 4e56 ffe8 linkw %fp,#-24
47198: 2f0a movel %a2,%sp@-
4719a: 2f02 movel %d2,%sp@-
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
4719c: 4aae 0008 tstl %fp@(8)
471a0: 660e bnes 471b0 <rtems_semaphore_create+0x1c>
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
471a2: 242e ffe0 movel %fp@(-32),%d2
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
471a6: 7003 moveq #3,%d0
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
471a8: 246e ffe4 moveal %fp@(-28),%a2
471ac: 4e5e unlk %fp
471ae: 4e75 rts
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
471b0: 4aae 0018 tstl %fp@(24)
471b4: 6726 beqs 471dc <rtems_semaphore_create+0x48>
* id - semaphore id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_semaphore_create(
471b6: 202e 0010 movel %fp@(16),%d0
471ba: 0280 0000 00c0 andil #192,%d0
return RTEMS_NOT_DEFINED;
} else
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
471c0: 6728 beqs 471ea <rtems_semaphore_create+0x56>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_binary_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_BINARY_SEMAPHORE);
471c2: 7230 moveq #48,%d1
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
471c4: 7410 moveq #16,%d2
471c6: c2ae 0010 andl %fp@(16),%d1
471ca: b481 cmpl %d1,%d2
471cc: 673a beqs 47208 <rtems_semaphore_create+0x74>
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
471ce: 700b moveq #11,%d0
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
471d0: 242e ffe0 movel %fp@(-32),%d2
471d4: 246e ffe4 moveal %fp@(-28),%a2
471d8: 4e5e unlk %fp
471da: 4e75 rts
471dc: 242e ffe0 movel %fp@(-32),%d2
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
471e0: 7009 moveq #9,%d0
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
471e2: 246e ffe4 moveal %fp@(-28),%a2
471e6: 4e5e unlk %fp
471e8: 4e75 rts
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_counting_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE);
471ea: 7430 moveq #48,%d2
471ec: c4ae 0010 andl %fp@(16),%d2
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
471f0: 672a beqs 4721c <rtems_semaphore_create+0x88>
471f2: 7001 moveq #1,%d0
471f4: b0ae 000c cmpl %fp@(12),%d0
471f8: 6422 bccs 4721c <rtems_semaphore_create+0x88>
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
471fa: 242e ffe0 movel %fp@(-32),%d2
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
return RTEMS_INVALID_NUMBER;
471fe: 700a moveq #10,%d0
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
47200: 246e ffe4 moveal %fp@(-28),%a2
47204: 4e5e unlk %fp
47206: 4e75 rts
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
47208: 222e 0010 movel %fp@(16),%d1
4720c: 44c1 movew %d1,%ccr
4720e: 66be bnes 471ce <rtems_semaphore_create+0x3a>
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
47210: 0c80 0000 00c0 cmpil #192,%d0
47216: 66da bnes 471f2 <rtems_semaphore_create+0x5e>
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
47218: 700b moveq #11,%d0
4721a: 60b4 bras 471d0 <rtems_semaphore_create+0x3c>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
4721c: 2039 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d0
++level;
47222: 5280 addql #1,%d0
_Thread_Dispatch_disable_level = level;
47224: 23c0 0005 fa06 movel %d0,5fa06 <_Thread_Dispatch_disable_level>
* This function allocates a semaphore control block from
* the inactive chain of free semaphore control blocks.
*/
RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
{
return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
4722a: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
47230: 4eb9 0004 89e4 jsr 489e4 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
47236: 588f addql #4,%sp
47238: 2440 moveal %d0,%a2
4723a: 4a80 tstl %d0
4723c: 6700 00e2 beqw 47320 <rtems_semaphore_create+0x18c>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_semaphore->attribute_set = attribute_set;
47240: 222e 0010 movel %fp@(16),%d1
47244: 2541 0010 movel %d1,%a2@(16)
/*
* Initialize it as a counting semaphore.
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
47248: 4a82 tstl %d2
4724a: 6668 bnes 472b4 <rtems_semaphore_create+0x120>
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
_CORE_semaphore_Initialize(
4724c: 2f2e 000c movel %fp@(12),%sp@-
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
47250: 74ff moveq #-1,%d2
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
_CORE_semaphore_Initialize(
47252: 486e ffea pea %fp@(-22)
47256: 486a 0014 pea %a2@(20)
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
4725a: 44c1 movew %d1,%ccr
4725c: 56c0 sne %d0
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
4725e: 2d42 ffea movel %d2,%fp@(-22)
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
47262: 49c0 extbl %d0
47264: 5280 addql #1,%d0
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
47266: 42ae fff2 clrl %fp@(-14)
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
4726a: 2d40 ffee movel %d0,%fp@(-18)
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
4726e: 42ae fffc clrl %fp@(-4)
_CORE_semaphore_Initialize(
47272: 4eb9 0004 83a4 jsr 483a4 <_CORE_semaphore_Initialize>
47278: 4fef 000c lea %sp@(12),%sp
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
4727c: 202a 0008 movel %a2@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
47280: 2200 movel %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
47282: 2079 0005 f950 moveal 5f950 <_Semaphore_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
47288: 0281 0000 ffff andil #65535,%d1
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
4728e: 242e 0008 movel %fp@(8),%d2
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
47292: 218a 1c00 movel %a2,%a0@(00000000,%d1:l:4)
&_Semaphore_Information,
&the_semaphore->Object,
(Objects_Name) name
);
*id = the_semaphore->Object.id;
47296: 206e 0018 moveal %fp@(24),%a0
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
4729a: 2542 000c movel %d2,%a2@(12)
4729e: 2080 movel %d0,%a0@
the_semaphore->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
472a0: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
}
472a6: 242e ffe0 movel %fp@(-32),%d2
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
472aa: 4280 clrl %d0
}
472ac: 246e ffe4 moveal %fp@(-28),%a2
472b0: 4e5e unlk %fp
472b2: 4e75 rts
/*
* It is either simple binary semaphore or a more powerful mutex
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
472b4: 202e 0010 movel %fp@(16),%d0
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
472b8: 7210 moveq #16,%d1
/*
* It is either simple binary semaphore or a more powerful mutex
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
472ba: 44c0 movew %d0,%ccr
472bc: 56c0 sne %d0
472be: 49c0 extbl %d0
472c0: 5280 addql #1,%d0
472c2: 2d40 fff8 movel %d0,%fp@(-8)
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
472c6: b282 cmpl %d2,%d1
472c8: 676a beqs 47334 <rtems_semaphore_create+0x1a0>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
the_mutex_attr.only_owner_release = true;
}
}
} else /* must be simple binary semaphore */ {
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
472ca: 7201 moveq #1,%d1
the_mutex_attr.only_owner_release = false;
472cc: 4202 clrb %d2
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
the_mutex_attr.only_owner_release = true;
}
}
} else /* must be simple binary semaphore */ {
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
472ce: 2d41 fff2 movel %d1,%fp@(-14)
the_mutex_attr.only_owner_release = false;
472d2: 1d42 fff6 moveb %d2,%fp@(-10)
}
mutex_status = _CORE_mutex_Initialize(
472d6: 7001 moveq #1,%d0
472d8: b0ae 000c cmpl %fp@(12),%d0
472dc: 57c0 seq %d0
472de: 49c0 extbl %d0
472e0: 4480 negl %d0
472e2: 2f00 movel %d0,%sp@-
472e4: 486e fff2 pea %fp@(-14)
472e8: 486a 0014 pea %a2@(20)
472ec: 4eb9 0004 8024 jsr 48024 <_CORE_mutex_Initialize>
&the_semaphore->Core_control.mutex,
&the_mutex_attr,
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
472f2: 4fef 000c lea %sp@(12),%sp
472f6: 7205 moveq #5,%d1
472f8: b280 cmpl %d0,%d1
472fa: 6680 bnes 4727c <rtems_semaphore_create+0xe8>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
472fc: 2f0a movel %a2,%sp@-
472fe: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
47304: 4eb9 0004 8d5c jsr 48d5c <_Objects_Free>
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
4730a: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
47310: 242e ffe0 movel %fp@(-32),%d2
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
47314: 508f addql #8,%sp
return RTEMS_INVALID_PRIORITY;
47316: 7013 moveq #19,%d0
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
47318: 246e ffe4 moveal %fp@(-28),%a2
4731c: 4e5e unlk %fp
4731e: 4e75 rts
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
47320: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
47326: 242e ffe0 movel %fp@(-32),%d2
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
4732a: 7005 moveq #5,%d0
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
4732c: 246e ffe4 moveal %fp@(-28),%a2
47330: 4e5e unlk %fp
47332: 4e75 rts
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
47334: 42ae fff2 clrl %fp@(-14)
the_mutex_attr.only_owner_release = false;
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
47338: 7001 moveq #1,%d0
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.only_owner_release = false;
4733a: 4202 clrb %d2
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
4733c: 2d6e 0014 fffc movel %fp@(20),%fp@(-4)
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.only_owner_release = false;
47342: 1d42 fff6 moveb %d2,%fp@(-10)
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
47346: b0ae fff8 cmpl %fp@(-8),%d0
4734a: 668a bnes 472d6 <rtems_semaphore_create+0x142>
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
4734c: 222e 0010 movel %fp@(16),%d1
47350: 0801 0006 btst #6,%d1
47354: 670e beqs 47364 <rtems_semaphore_create+0x1d0>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
47356: 7402 moveq #2,%d2
47358: 2d42 fff8 movel %d2,%fp@(-8)
the_mutex_attr.only_owner_release = true;
4735c: 1d40 fff6 moveb %d0,%fp@(-10)
47360: 6000 ff74 braw 472d6 <rtems_semaphore_create+0x142>
} else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
47364: 222e 0010 movel %fp@(16),%d1
47368: 4a01 tstb %d1
4736a: 6c00 ff6a bgew 472d6 <rtems_semaphore_create+0x142>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
4736e: 7403 moveq #3,%d2
the_mutex_attr.only_owner_release = true;
47370: 7001 moveq #1,%d0
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
the_mutex_attr.only_owner_release = true;
} else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
47372: 2d42 fff8 movel %d2,%fp@(-8)
the_mutex_attr.only_owner_release = true;
47376: 1d40 fff6 moveb %d0,%fp@(-10)
4737a: 6000 ff5a braw 472d6 <rtems_semaphore_create+0x142>
...
00047380 <rtems_semaphore_delete>:
#endif
rtems_status_code rtems_semaphore_delete(
rtems_id id
)
{
47380: 4e56 fffc linkw %fp,#-4
47384: 2f0a movel %a2,%sp@-
RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
47386: 486e fffc pea %fp@(-4)
4738a: 2f2e 0008 movel %fp@(8),%sp@-
4738e: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
47394: 4eb9 0004 8edc jsr 48edc <_Objects_Get>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
4739a: 4fef 000c lea %sp@(12),%sp
4739e: 2440 moveal %d0,%a2
473a0: 4aae fffc tstl %fp@(-4)
473a4: 6624 bnes 473ca <rtems_semaphore_delete+0x4a>
473a6: 7030 moveq #48,%d0
473a8: c0aa 0010 andl %a2@(16),%d0
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
473ac: 6726 beqs 473d4 <rtems_semaphore_delete+0x54>
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) &&
473ae: 4aaa 0062 tstl %a2@(98)
473b2: 6664 bnes 47418 <rtems_semaphore_delete+0x98>
473b4: 7220 moveq #32,%d1
473b6: b280 cmpl %d0,%d1
473b8: 675e beqs 47418 <rtems_semaphore_delete+0x98>
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
473ba: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
473c0: 246e fff8 moveal %fp@(-8),%a2
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) &&
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
473c4: 700c moveq #12,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
473c6: 4e5e unlk %fp
473c8: 4e75 rts
473ca: 246e fff8 moveal %fp@(-8),%a2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
473ce: 7004 moveq #4,%d0
}
473d0: 4e5e unlk %fp
473d2: 4e75 rts
&the_semaphore->Core_control.mutex,
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_MUTEX_WAS_DELETED
);
} else {
_CORE_semaphore_Flush(
473d4: 4878 0002 pea 2 <DOUBLE_FLOAT>
473d8: 42a7 clrl %sp@-
473da: 486a 0014 pea %a2@(20)
473de: 4eb9 0004 8398 jsr 48398 <_CORE_semaphore_Flush>
473e4: 4fef 000c lea %sp@(12),%sp
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
473e8: 2f0a movel %a2,%sp@-
473ea: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
473f0: 4eb9 0004 8a74 jsr 48a74 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
473f6: 2f0a movel %a2,%sp@-
473f8: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
473fe: 4eb9 0004 8d5c jsr 48d5c <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
47404: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
4740a: 4fef 0010 lea %sp@(16),%sp
return RTEMS_SUCCESSFUL;
4740e: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
47410: 246e fff8 moveal %fp@(-8),%a2
47414: 4e5e unlk %fp
47416: 4e75 rts
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
_CORE_mutex_Flush(
47418: 4878 0003 pea 3 <DIVIDE>
4741c: 42a7 clrl %sp@-
4741e: 486a 0014 pea %a2@(20)
47422: 4eb9 0004 8018 jsr 48018 <_CORE_mutex_Flush>
47428: 4fef 000c lea %sp@(12),%sp
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
4742c: 2f0a movel %a2,%sp@-
4742e: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
47434: 4eb9 0004 8a74 jsr 48a74 <_Objects_Close>
4743a: 2f0a movel %a2,%sp@-
4743c: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
47442: 4eb9 0004 8d5c jsr 48d5c <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
47448: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
4744e: 4fef 0010 lea %sp@(16),%sp
return RTEMS_SUCCESSFUL;
47452: 4280 clrl %d0
47454: 60ba bras 47410 <rtems_semaphore_delete+0x90>
...
000507cc <rtems_semaphore_flush>:
#endif
rtems_status_code rtems_semaphore_flush(
rtems_id id
)
{
507cc: 4e56 fffc linkw %fp,#-4
507d0: 486e fffc pea %fp@(-4)
507d4: 2f2e 0008 movel %fp@(8),%sp@-
507d8: 4879 0006 3f1c pea 63f1c <_Semaphore_Information>
507de: 4eb9 0004 a840 jsr 4a840 <_Objects_Get>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
507e4: 4fef 000c lea %sp@(12),%sp
507e8: 4aae fffc tstl %fp@(-4)
507ec: 662a bnes 50818 <rtems_semaphore_flush+0x4c>
507ee: 7230 moveq #48,%d1
507f0: 2040 moveal %d0,%a0
507f2: c2a8 0010 andl %a0@(16),%d1
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
507f6: 6726 beqs 5081e <rtems_semaphore_flush+0x52>
_CORE_mutex_Flush(
507f8: 4878 0001 pea 1 <ADD>
507fc: 42a7 clrl %sp@-
507fe: 4868 0014 pea %a0@(20)
50802: 4eb9 0004 997c jsr 4997c <_CORE_mutex_Flush>
50808: 4fef 000c lea %sp@(12),%sp
&the_semaphore->Core_control.semaphore,
SEND_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT
);
}
_Thread_Enable_dispatch();
5080c: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
50812: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
50814: 4e5e unlk %fp
50816: 4e75 rts
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
50818: 7004 moveq #4,%d0
}
5081a: 4e5e unlk %fp
5081c: 4e75 rts
&the_semaphore->Core_control.mutex,
SEND_OBJECT_WAS_DELETED,
CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT
);
} else {
_CORE_semaphore_Flush(
5081e: 4878 0001 pea 1 <ADD>
50822: 2040 moveal %d0,%a0
50824: 42a7 clrl %sp@-
50826: 4868 0014 pea %a0@(20)
5082a: 4eb9 0004 9cfc jsr 49cfc <_CORE_semaphore_Flush>
50830: 4fef 000c lea %sp@(12),%sp
&the_semaphore->Core_control.semaphore,
SEND_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT
);
}
_Thread_Enable_dispatch();
50834: 4eb9 0004 b5b0 jsr 4b5b0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
5083a: 4280 clrl %d0
5083c: 60d6 bras 50814 <rtems_semaphore_flush+0x48>
...
00047458 <rtems_semaphore_obtain>:
rtems_status_code rtems_semaphore_obtain(
rtems_id id,
rtems_option option_set,
rtems_interval timeout
)
{
47458: 4e56 fff8 linkw %fp,#-8
4745c: 2f02 movel %d2,%sp@-
Objects_Id id,
Objects_Locations *location,
ISR_Level *level
)
{
return (Semaphore_Control *)
4745e: 486e fffc pea %fp@(-4)
47462: 486e fff8 pea %fp@(-8)
47466: 2f2e 0008 movel %fp@(8),%sp@-
4746a: 4879 0005 f938 pea 5f938 <_Semaphore_Information>
47470: 4eb9 0004 8e74 jsr 48e74 <_Objects_Get_isr_disable>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
ISR_Level level;
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
47476: 4fef 0010 lea %sp@(16),%sp
4747a: 4aae fff8 tstl %fp@(-8)
4747e: 6650 bnes 474d0 <rtems_semaphore_obtain+0x78>
47480: 7230 moveq #48,%d1
47482: 2040 moveal %d0,%a0
47484: c2a8 0010 andl %a0@(16),%d1
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
47488: 6650 bnes 474da <rtems_semaphore_obtain+0x82>
return _Semaphore_Translate_core_mutex_return_code(
_Thread_Executing->Wait.return_code );
}
/* must be a counting semaphore */
_CORE_semaphore_Seize_isr_disable(
4748a: 222e 000c movel %fp@(12),%d1
4748e: 0801 0000 btst #0,%d1
47492: 6700 00a6 beqw 4753a <rtems_semaphore_obtain+0xe2>
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
47496: 2240 moveal %d0,%a1
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
47498: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
4749e: 2229 005c movel %a1@(92),%d1
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
474a2: 42a8 0034 clrl %a0@(52)
if ( the_semaphore->count != 0 ) {
474a6: 4a81 tstl %d1
474a8: 666e bnes 47518 <rtems_semaphore_obtain+0xc0>
_ISR_Enable( *level_p );
return;
}
if ( !wait ) {
_ISR_Enable( *level_p );
474aa: 202e fffc movel %fp@(-4),%d0
474ae: 46c0 movew %d0,%sr
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
474b0: 7001 moveq #1,%d0
474b2: 2140 0034 movel %d0,%a0@(52)
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
_Thread_Executing->Wait.return_code );
474b6: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
474bc: 2f28 0034 movel %a0@(52),%sp@-
474c0: 4eb9 0004 765a jsr 4765a <_Semaphore_Translate_core_semaphore_return_code>
474c6: 588f addql #4,%sp
break;
}
return RTEMS_INVALID_ID;
}
474c8: 242e fff4 movel %fp@(-12),%d2
474cc: 4e5e unlk %fp
474ce: 4e75 rts
474d0: 242e fff4 movel %fp@(-12),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
474d4: 7004 moveq #4,%d0
}
474d6: 4e5e unlk %fp
474d8: 4e75 rts
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
_CORE_mutex_Seize(
474da: 2f2e fffc movel %fp@(-4),%sp@-
474de: 7401 moveq #1,%d2
474e0: 222e 000c movel %fp@(12),%d1
474e4: 4681 notl %d1
474e6: 2f2e 0010 movel %fp@(16),%sp@-
474ea: c481 andl %d1,%d2
474ec: 2f02 movel %d2,%sp@-
474ee: 2f2e 0008 movel %fp@(8),%sp@-
474f2: 4868 0014 pea %a0@(20)
474f6: 4eb9 0004 81ac jsr 481ac <_CORE_mutex_Seize>
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
_Thread_Executing->Wait.return_code );
474fc: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
47502: 2f28 0034 movel %a0@(52),%sp@-
47506: 4eb9 0004 7644 jsr 47644 <_Semaphore_Translate_core_mutex_return_code>
break;
}
return RTEMS_INVALID_ID;
}
4750c: 242e fff4 movel %fp@(-12),%d2
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
47510: 4fef 0018 lea %sp@(24),%sp
break;
}
return RTEMS_INVALID_ID;
}
47514: 4e5e unlk %fp
47516: 4e75 rts
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
the_semaphore->count -= 1;
47518: 5381 subql #1,%d1
4751a: 2040 moveal %d0,%a0
4751c: 2141 005c movel %d1,%a0@(92)
_ISR_Enable( *level_p );
47520: 202e fffc movel %fp@(-4),%d0
47524: 46c0 movew %d0,%sr
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
_Thread_Executing->Wait.return_code );
47526: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
4752c: 2f28 0034 movel %a0@(52),%sp@-
47530: 4eb9 0004 765a jsr 4765a <_Semaphore_Translate_core_semaphore_return_code>
47536: 588f addql #4,%sp
47538: 608e bras 474c8 <rtems_semaphore_obtain+0x70>
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
4753a: 2240 moveal %d0,%a1
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
4753c: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
47542: 2229 005c movel %a1@(92),%d1
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
47546: 42a8 0034 clrl %a0@(52)
if ( the_semaphore->count != 0 ) {
4754a: 4a81 tstl %d1
4754c: 66ca bnes 47518 <rtems_semaphore_obtain+0xc0>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
4754e: 2239 0005 fa06 movel 5fa06 <_Thread_Dispatch_disable_level>,%d1
++level;
47554: 5281 addql #1,%d1
_Thread_Dispatch_disable_level = level;
47556: 23c1 0005 fa06 movel %d1,5fa06 <_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;
4755c: 7201 moveq #1,%d1
4755e: 2240 moveal %d0,%a1
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
47560: 0680 0000 0014 addil #20,%d0
47566: 2341 0044 movel %d1,%a1@(68)
executing->Wait.id = id;
4756a: 222e 0008 movel %fp@(8),%d1
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
4756e: 2140 0044 movel %d0,%a0@(68)
executing->Wait.id = id;
47572: 2141 0020 movel %d1,%a0@(32)
_ISR_Enable( *level_p );
47576: 222e fffc movel %fp@(-4),%d1
4757a: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
4757c: 4879 0004 a4f0 pea 4a4f0 <_Thread_queue_Timeout>
47582: 2f2e 0010 movel %fp@(16),%sp@-
47586: 2f00 movel %d0,%sp@-
47588: 4eb9 0004 a120 jsr 4a120 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
4758e: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
_Thread_Executing->Wait.return_code );
47594: 2079 0005 fb7e moveal 5fb7e <_Per_CPU_Information+0xe>,%a0
4759a: 4fef 000c lea %sp@(12),%sp
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
4759e: 2f28 0034 movel %a0@(52),%sp@-
475a2: 4eb9 0004 765a jsr 4765a <_Semaphore_Translate_core_semaphore_return_code>
475a8: 588f addql #4,%sp
475aa: 6000 ff1c braw 474c8 <rtems_semaphore_obtain+0x70>
...
00047bb4 <rtems_shutdown_executive>:
void rtems_shutdown_executive(
uint32_t result
)
{
if ( _System_state_Is_up( _System_state_Get() ) ) {
47bb4: 7003 moveq #3,%d0
*/
void rtems_shutdown_executive(
uint32_t result
)
{
47bb6: 4e56 0000 linkw %fp,#0
if ( _System_state_Is_up( _System_state_Get() ) ) {
47bba: b0b9 0005 fb6c cmpl 5fb6c <_System_state_Current>,%d0
47bc0: 6710 beqs 47bd2 <rtems_shutdown_executive+0x1e>
****** RETURN TO RTEMS_INITIALIZE_START_MULTITASKING() ******
****** AND THEN TO BOOT_CARD() ******
*******************************************************************
*******************************************************************/
}
_Internal_error_Occurred(
47bc2: 4878 0014 pea 14 <OPER2>
47bc6: 4878 0001 pea 1 <ADD>
47bca: 42a7 clrl %sp@-
47bcc: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred>
if ( _System_state_Is_up( _System_state_Get() ) ) {
#if defined(RTEMS_SMP)
_SMP_Request_other_cores_to_shutdown();
#endif
_Per_CPU_Information[0].idle->Wait.return_code = result;
47bd2: 2079 0005 fb86 moveal 5fb86 <_Per_CPU_Information+0x16>,%a0
47bd8: 103c 0004 moveb #4,%d0
47bdc: 216e 0008 0034 movel %fp@(8),%a0@(52)
* if we were running within the same context, it would work.
*
* And we will not return to this thread, so there is no point of
* saving the context.
*/
_Context_Restart_self( &_Thread_BSP_context );
47be2: 4879 0005 f9d2 pea 5f9d2 <_Thread_BSP_context>
47be8: 23c0 0005 fb6c movel %d0,5fb6c <_System_state_Current>
47bee: 4eb9 0004 ac76 jsr 4ac76 <_CPU_Context_Restart_self>
47bf4: 588f addql #4,%sp <== NOT EXECUTED
****** RETURN TO RTEMS_INITIALIZE_START_MULTITASKING() ******
****** AND THEN TO BOOT_CARD() ******
*******************************************************************
*******************************************************************/
}
_Internal_error_Occurred(
47bf6: 4878 0014 pea 14 <OPER2> <== NOT EXECUTED
47bfa: 4878 0001 pea 1 <ADD> <== NOT EXECUTED
47bfe: 42a7 clrl %sp@- <== NOT EXECUTED
47c00: 4eb9 0004 891c jsr 4891c <_Internal_error_Occurred> <== NOT EXECUTED
...
00056988 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
56988: 4e56 fffc linkw %fp,#-4
5698c: 2f02 movel %d2,%sp@-
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
5698e: 4aae 000c tstl %fp@(12)
56992: 660a bnes 5699e <rtems_signal_send+0x16>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56994: 242e fff8 movel %fp@(-8),%d2
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
56998: 700a moveq #10,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
5699a: 4e5e unlk %fp
5699c: 4e75 rts
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
5699e: 486e fffc pea %fp@(-4)
569a2: 2f2e 0008 movel %fp@(8),%sp@-
569a6: 4eb9 0005 b208 jsr 5b208 <_Thread_Get>
switch ( location ) {
569ac: 508f addql #8,%sp
569ae: 4aae fffc tstl %fp@(-4)
569b2: 6648 bnes 569fc <rtems_signal_send+0x74>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
569b4: 2240 moveal %d0,%a1
569b6: 2069 00f8 moveal %a1@(248),%a0
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
569ba: 4aa8 000a tstl %a0@(10)
569be: 6746 beqs 56a06 <rtems_signal_send+0x7e>
if ( asr->is_enabled ) {
569c0: 4a28 0008 tstb %a0@(8)
569c4: 6762 beqs 56a28 <rtems_signal_send+0xa0>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
569c6: 223c 0000 0700 movel #1792,%d1
569cc: 40c2 movew %sr,%d2
569ce: 8282 orl %d2,%d1
569d0: 46c1 movew %d1,%sr
*signal_set |= signals;
569d2: 222e 000c movel %fp@(12),%d1
569d6: 83a8 0012 orl %d1,%a0@(18)
_ISR_Enable( _level );
569da: 46c2 movew %d2,%sr
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
569dc: 4ab9 0007 c47c tstl 7c47c <_Per_CPU_Information+0x8>
569e2: 6708 beqs 569ec <rtems_signal_send+0x64>
569e4: b0b9 0007 c482 cmpl 7c482 <_Per_CPU_Information+0xe>,%d0
569ea: 672a beqs 56a16 <rtems_signal_send+0x8e> <== ALWAYS TAKEN
_Thread_Dispatch_necessary = true;
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
569ec: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
569f2: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
569f4: 242e fff8 movel %fp@(-8),%d2
569f8: 4e5e unlk %fp
569fa: 4e75 rts
569fc: 242e fff8 movel %fp@(-8),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
56a00: 7004 moveq #4,%d0
}
56a02: 4e5e unlk %fp
56a04: 4e75 rts
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
56a06: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56a0c: 242e fff8 movel %fp@(-8),%d2
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_NOT_DEFINED;
56a10: 700b moveq #11,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56a12: 4e5e unlk %fp
56a14: 4e75 rts
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
if ( asr->is_enabled ) {
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
56a16: 7001 moveq #1,%d0
56a18: 13c0 0007 c480 moveb %d0,7c480 <_Per_CPU_Information+0xc>
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
56a1e: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
56a24: 4280 clrl %d0
56a26: 60cc bras 569f4 <rtems_signal_send+0x6c>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
56a28: 203c 0000 0700 movel #1792,%d0
56a2e: 40c1 movew %sr,%d1
56a30: 8081 orl %d1,%d0
56a32: 46c0 movew %d0,%sr
*signal_set |= signals;
56a34: 202e 000c movel %fp@(12),%d0
56a38: 81a8 0016 orl %d0,%a0@(22)
_ISR_Enable( _level );
56a3c: 46c1 movew %d1,%sr
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
56a3e: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
56a44: 4280 clrl %d0
56a46: 60ac bras 569f4 <rtems_signal_send+0x6c>
000508f8 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
508f8: 4e56 ffe4 linkw %fp,#-28
508fc: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@
50900: 2a2e 0008 movel %fp@(8),%d5
50904: 242e 000c movel %fp@(12),%d2
50908: 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 )
5090c: 4a8c tstl %a4
5090e: 6700 0148 beqw 50a58 <rtems_task_mode+0x160>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
50912: 2479 0006 4162 moveal 64162 <_Per_CPU_Information+0xe>,%a2
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
50918: 4a2a 0070 tstb %a2@(112)
5091c: 57c3 seq %d3
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
5091e: 266a 00f8 moveal %a2@(248),%a3
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
50922: 49c3 extbl %d3
50924: 0283 0000 0100 andil #256,%d3
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
5092a: 4aaa 0076 tstl %a2@(118)
5092e: 6600 00cc bnew 509fc <rtems_task_mode+0x104>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
50932: 4a2b 0008 tstb %a3@(8)
50936: 57c4 seq %d4
old_mode |= _ISR_Get_level();
50938: 4eb9 0004 c688 jsr 4c688 <_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;
5093e: 49c4 extbl %d4
50940: 0284 0000 0400 andil #1024,%d4
50946: 8084 orl %d4,%d0
old_mode |= _ISR_Get_level();
50948: 8083 orl %d3,%d0
5094a: 2880 movel %d0,%a4@
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
5094c: 0802 0008 btst #8,%d2
50950: 670e beqs 50960 <rtems_task_mode+0x68>
50952: 2005 movel %d5,%d0
50954: 7201 moveq #1,%d1
50956: e088 lsrl #8,%d0
50958: b380 eorl %d1,%d0
5095a: c081 andl %d1,%d0
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
5095c: 1540 0070 moveb %d0,%a2@(112)
if ( mask & RTEMS_TIMESLICE_MASK ) {
50960: 0802 0009 btst #9,%d2
50964: 6718 beqs 5097e <rtems_task_mode+0x86>
if ( _Modes_Is_timeslice(mode_set) ) {
50966: 0805 0009 btst #9,%d5
5096a: 6700 00f8 beqw 50a64 <rtems_task_mode+0x16c>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
5096e: 7001 moveq #1,%d0
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
50970: 41f9 0006 3fa2 lea 63fa2 <_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;
50976: 2540 0076 movel %d0,%a2@(118)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
5097a: 2550 0072 movel %a0@,%a2@(114)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
5097e: 7007 moveq #7,%d0
50980: c082 andl %d2,%d0
50982: 6712 beqs 50996 <rtems_task_mode+0x9e>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
50984: 40c0 movew %sr,%d0
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
50986: 7207 moveq #7,%d1
50988: c285 andl %d5,%d1
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
5098a: 0280 0000 f8ff andil #63743,%d0
50990: e189 lsll #8,%d1
50992: 8081 orl %d1,%d0
50994: 46c0 movew %d0,%sr
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
50996: 0802 000a btst #10,%d2
5099a: 6752 beqs 509ee <rtems_task_mode+0xf6>
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
5099c: 700a moveq #10,%d0
5099e: e0ad lsrl %d0,%d5
509a0: 7201 moveq #1,%d1
if ( is_asr_enabled != asr->is_enabled ) {
509a2: 4280 clrl %d0
509a4: 102b 0008 moveb %a3@(8),%d0
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
509a8: b385 eorl %d1,%d5
509aa: ca81 andl %d1,%d5
if ( is_asr_enabled != asr->is_enabled ) {
509ac: ba80 cmpl %d0,%d5
509ae: 673e beqs 509ee <rtems_task_mode+0xf6>
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
509b0: 203c 0000 0700 movel #1792,%d0
asr->is_enabled = is_asr_enabled;
509b6: 1745 0008 moveb %d5,%a3@(8)
509ba: 40c1 movew %sr,%d1
509bc: 8081 orl %d1,%d0
509be: 46c0 movew %d0,%sr
_signals = information->signals_pending;
509c0: 202b 0016 movel %a3@(22),%d0
information->signals_pending = information->signals_posted;
509c4: 276b 0012 0016 movel %a3@(18),%a3@(22)
information->signals_posted = _signals;
509ca: 2740 0012 movel %d0,%a3@(18)
_ISR_Enable( _level );
509ce: 46c1 movew %d1,%sr
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
509d0: 4aab 0012 tstl %a3@(18)
509d4: 56c0 sne %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
509d6: 7203 moveq #3,%d1
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;
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
509d8: 4480 negl %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
509da: b2b9 0006 4150 cmpl 64150 <_System_state_Current>,%d1
509e0: 6744 beqs 50a26 <rtems_task_mode+0x12e> <== ALWAYS TAKEN
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
509e2: 4280 clrl %d0
}
509e4: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
509ea: 4e5e unlk %fp
509ec: 4e75 rts
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
509ee: 7203 moveq #3,%d1
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
509f0: 4200 clrb %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
509f2: b2b9 0006 4150 cmpl 64150 <_System_state_Current>,%d1
509f8: 66e8 bnes 509e2 <rtems_task_mode+0xea>
509fa: 602a bras 50a26 <rtems_task_mode+0x12e>
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;
509fc: 4a2b 0008 tstb %a3@(8)
50a00: 57c4 seq %d4
old_mode |= _ISR_Get_level();
50a02: 4eb9 0004 c688 jsr 4c688 <_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;
50a08: 49c4 extbl %d4
50a0a: 0284 0000 0400 andil #1024,%d4
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
50a10: 08c3 0009 bset #9,%d3
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
50a14: 8084 orl %d4,%d0
old_mode |= _ISR_Get_level();
50a16: 8083 orl %d3,%d0
50a18: 2880 movel %d0,%a4@
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
50a1a: 0802 0008 btst #8,%d2
50a1e: 6700 ff40 beqw 50960 <rtems_task_mode+0x68>
50a22: 6000 ff2e braw 50952 <rtems_task_mode+0x5a>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
50a26: 2079 0006 4162 moveal 64162 <_Per_CPU_Information+0xe>,%a0
if ( are_signals_pending ||
50a2c: 4a00 tstb %d0
50a2e: 660e bnes 50a3e <rtems_task_mode+0x146>
50a30: b1f9 0006 4166 cmpal 64166 <_Per_CPU_Information+0x12>,%a0
50a36: 67aa beqs 509e2 <rtems_task_mode+0xea>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
50a38: 4a28 0070 tstb %a0@(112)
50a3c: 67a4 beqs 509e2 <rtems_task_mode+0xea> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
50a3e: 7001 moveq #1,%d0
50a40: 13c0 0006 4160 moveb %d0,64160 <_Per_CPU_Information+0xc>
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
50a46: 4eb9 0004 b41c jsr 4b41c <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
}
50a4c: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
50a52: 4280 clrl %d0
}
50a54: 4e5e unlk %fp
50a56: 4e75 rts
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
50a58: 7009 moveq #9,%d0
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
50a5a: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
50a60: 4e5e unlk %fp
50a62: 4e75 rts
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
50a64: 7007 moveq #7,%d0
50a66: c082 andl %d2,%d0
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
50a68: 42aa 0076 clrl %a2@(118)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
50a6c: 4a80 tstl %d0
50a6e: 6700 ff26 beqw 50996 <rtems_task_mode+0x9e>
50a72: 6000 ff10 braw 50984 <rtems_task_mode+0x8c>
...
0004b91c <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
4b91c: 4e56 fffc linkw %fp,#-4
4b920: 2f02 movel %d2,%sp@-
4b922: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
4b926: 670c beqs 4b934 <rtems_task_set_priority+0x18>
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
4b928: 4280 clrl %d0
4b92a: 1039 0006 22ac moveb 622ac <rtems_maximum_priority>,%d0
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
4b930: b082 cmpl %d2,%d0
4b932: 656e bcss 4b9a2 <rtems_task_set_priority+0x86>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
4b934: 4aae 0010 tstl %fp@(16)
4b938: 6754 beqs 4b98e <rtems_task_set_priority+0x72>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
4b93a: 486e fffc pea %fp@(-4)
4b93e: 2f2e 0008 movel %fp@(8),%sp@-
4b942: 4eb9 0004 ddec jsr 4ddec <_Thread_Get>
switch ( location ) {
4b948: 508f addql #8,%sp
4b94a: 4aae fffc tstl %fp@(-4)
4b94e: 6648 bnes 4b998 <rtems_task_set_priority+0x7c>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
4b950: 206e 0010 moveal %fp@(16),%a0
4b954: 2240 moveal %d0,%a1
4b956: 20a9 0014 movel %a1@(20),%a0@
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
4b95a: 4a82 tstl %d2
4b95c: 6720 beqs 4b97e <rtems_task_set_priority+0x62>
the_thread->real_priority = new_priority;
4b95e: 2342 0018 movel %d2,%a1@(24)
if ( the_thread->resource_count == 0 ||
4b962: 4aa9 001c tstl %a1@(28)
4b966: 6706 beqs 4b96e <rtems_task_set_priority+0x52>
4b968: b4a9 0014 cmpl %a1@(20),%d2
4b96c: 6410 bccs 4b97e <rtems_task_set_priority+0x62> <== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
4b96e: 42a7 clrl %sp@-
4b970: 2f02 movel %d2,%sp@-
4b972: 2f00 movel %d0,%sp@-
4b974: 4eb9 0004 d8e8 jsr 4d8e8 <_Thread_Change_priority>
4b97a: 4fef 000c lea %sp@(12),%sp
}
_Thread_Enable_dispatch();
4b97e: 4eb9 0004 ddcc jsr 4ddcc <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4b984: 242e fff8 movel %fp@(-8),%d2
if ( the_thread->resource_count == 0 ||
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
4b988: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4b98a: 4e5e unlk %fp
4b98c: 4e75 rts
4b98e: 242e fff8 movel %fp@(-8),%d2
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
4b992: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4b994: 4e5e unlk %fp
4b996: 4e75 rts
4b998: 242e fff8 movel %fp@(-8),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4b99c: 7004 moveq #4,%d0
}
4b99e: 4e5e unlk %fp
4b9a0: 4e75 rts
4b9a2: 242e fff8 movel %fp@(-8),%d2
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
4b9a6: 7013 moveq #19,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4b9a8: 4e5e unlk %fp <== NOT EXECUTED
00047990 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
47990: 4e56 fffc linkw %fp,#-4
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
47994: 4aae 000c tstl %fp@(12)
47998: 6744 beqs 479de <rtems_task_start+0x4e> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
4799a: 486e fffc pea %fp@(-4)
4799e: 2f2e 0008 movel %fp@(8),%sp@-
479a2: 4eb9 0004 9c64 jsr 49c64 <_Thread_Get>
switch ( location ) {
479a8: 508f addql #8,%sp
479aa: 4aae fffc tstl %fp@(-4)
479ae: 6628 bnes 479d8 <rtems_task_start+0x48>
case OBJECTS_LOCAL:
if ( _Thread_Start(
479b0: 2f2e 0010 movel %fp@(16),%sp@-
479b4: 42a7 clrl %sp@-
479b6: 2f2e 000c movel %fp@(12),%sp@-
479ba: 42a7 clrl %sp@-
479bc: 2f00 movel %d0,%sp@-
479be: 4eb9 0004 a678 jsr 4a678 <_Thread_Start>
479c4: 4fef 0014 lea %sp@(20),%sp
479c8: 4a00 tstb %d0
479ca: 6618 bnes 479e4 <rtems_task_start+0x54>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
479cc: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
479d2: 700e moveq #14,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
479d4: 4e5e unlk %fp
479d6: 4e75 rts
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
479d8: 7004 moveq #4,%d0
}
479da: 4e5e unlk %fp
479dc: 4e75 rts
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
479de: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
479e0: 4e5e unlk %fp
479e2: 4e75 rts
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
479e4: 4eb9 0004 9c44 jsr 49c44 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
479ea: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
479ec: 4e5e unlk %fp <== NOT EXECUTED
00045558 <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
45558: 4e56 fffc linkw %fp,#-4
4555c: 2f02 movel %d2,%sp@-
4555e: 242e 000c movel %fp@(12),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
45562: 6740 beqs 455a4 <rtems_task_variable_delete+0x4c>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
45564: 486e fffc pea %fp@(-4)
45568: 2f2e 0008 movel %fp@(8),%sp@-
4556c: 4eb9 0004 72fc jsr 472fc <_Thread_Get>
switch (location) {
45572: 508f addql #8,%sp
45574: 4aae fffc tstl %fp@(-4)
45578: 6620 bnes 4559a <rtems_task_variable_delete+0x42>
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
4557a: 2040 moveal %d0,%a0
4557c: 2268 0104 moveal %a0@(260),%a1
while (tvp) {
45580: 4a89 tstl %a1
45582: 672a beqs 455ae <rtems_task_variable_delete+0x56>
if (tvp->ptr == ptr) {
45584: b4a9 0004 cmpl %a1@(4),%d2
45588: 6752 beqs 455dc <rtems_task_variable_delete+0x84>
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
4558a: 2051 moveal %a1@,%a0
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
4558c: 4a88 tstl %a0
4558e: 671e beqs 455ae <rtems_task_variable_delete+0x56><== NEVER TAKEN
if (tvp->ptr == ptr) {
45590: b4a8 0004 cmpl %a0@(4),%d2
45594: 6728 beqs 455be <rtems_task_variable_delete+0x66>
45596: 2248 moveal %a0,%a1
45598: 60f0 bras 4558a <rtems_task_variable_delete+0x32>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4559a: 242e fff8 movel %fp@(-8),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4559e: 7004 moveq #4,%d0
}
455a0: 4e5e unlk %fp
455a2: 4e75 rts
455a4: 242e fff8 movel %fp@(-8),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
455a8: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
455aa: 4e5e unlk %fp
455ac: 4e75 rts
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
455ae: 4eb9 0004 72dc jsr 472dc <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
455b4: 242e fff8 movel %fp@(-8),%d2
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
455b8: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
455ba: 4e5e unlk %fp
455bc: 4e75 rts
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
455be: 2290 movel %a0@,%a1@
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
455c0: 2f08 movel %a0,%sp@-
455c2: 2f00 movel %d0,%sp@-
455c4: 4eb9 0004 5678 jsr 45678 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
455ca: 4eb9 0004 72dc jsr 472dc <_Thread_Enable_dispatch>
455d0: 508f addql #8,%sp
return RTEMS_SUCCESSFUL;
455d2: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
455d4: 242e fff8 movel %fp@(-8),%d2
455d8: 4e5e unlk %fp
455da: 4e75 rts
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
455dc: 2040 moveal %d0,%a0
455de: 2151 0104 movel %a1@,%a0@(260)
455e2: 2049 moveal %a1,%a0
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
455e4: 2f08 movel %a0,%sp@-
455e6: 2f00 movel %d0,%sp@-
455e8: 4eb9 0004 5678 jsr 45678 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
455ee: 4eb9 0004 72dc jsr 472dc <_Thread_Enable_dispatch>
455f4: 508f addql #8,%sp
return RTEMS_SUCCESSFUL;
455f6: 4280 clrl %d0
455f8: 60da bras 455d4 <rtems_task_variable_delete+0x7c>
...
000455fc <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
455fc: 4e56 fffc linkw %fp,#-4
45600: 2f02 movel %d2,%sp@-
45602: 242e 000c movel %fp@(12),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
45606: 6742 beqs 4564a <rtems_task_variable_get+0x4e>
return RTEMS_INVALID_ADDRESS;
if ( !result )
45608: 4aae 0010 tstl %fp@(16)
4560c: 673c beqs 4564a <rtems_task_variable_get+0x4e>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
4560e: 486e fffc pea %fp@(-4)
45612: 2f2e 0008 movel %fp@(8),%sp@-
45616: 4eb9 0004 72fc jsr 472fc <_Thread_Get>
switch (location) {
4561c: 508f addql #8,%sp
4561e: 4aae fffc tstl %fp@(-4)
45622: 6630 bnes 45654 <rtems_task_variable_get+0x58>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
45624: 2240 moveal %d0,%a1
45626: 2069 0104 moveal %a1@(260),%a0
while (tvp) {
4562a: 4a88 tstl %a0
4562c: 670c beqs 4563a <rtems_task_variable_get+0x3e>
if (tvp->ptr == ptr) {
4562e: b4a8 0004 cmpl %a0@(4),%d2
45632: 672a beqs 4565e <rtems_task_variable_get+0x62>
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
45634: 2050 moveal %a0@,%a0
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
45636: 4a88 tstl %a0
45638: 66f4 bnes 4562e <rtems_task_variable_get+0x32> <== ALWAYS TAKEN
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
4563a: 4eb9 0004 72dc jsr 472dc <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
45640: 242e fff8 movel %fp@(-8),%d2
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
45644: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
45646: 4e5e unlk %fp
45648: 4e75 rts
4564a: 242e fff8 movel %fp@(-8),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
4564e: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
45650: 4e5e unlk %fp
45652: 4e75 rts
45654: 242e fff8 movel %fp@(-8),%d2
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
45658: 7004 moveq #4,%d0
}
4565a: 4e5e unlk %fp
4565c: 4e75 rts
if (tvp->ptr == ptr) {
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
4565e: 226e 0010 moveal %fp@(16),%a1
45662: 22a8 000c movel %a0@(12),%a1@
_Thread_Enable_dispatch();
45666: 4eb9 0004 72dc jsr 472dc <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4566c: 242e fff8 movel %fp@(-8),%d2
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
45670: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
45672: 4e5e unlk %fp
...
000573b8 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
573b8: 4e56 fffc linkw %fp,#-4
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
573bc: 486e fffc pea %fp@(-4)
573c0: 2f2e 0008 movel %fp@(8),%sp@-
573c4: 4879 0007 c4fc pea 7c4fc <_Timer_Information>
573ca: 4eb9 0005 a480 jsr 5a480 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
573d0: 4fef 000c lea %sp@(12),%sp
573d4: 4aae fffc tstl %fp@(-4)
573d8: 6622 bnes 573fc <rtems_timer_cancel+0x44>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
573da: 7204 moveq #4,%d1
573dc: 2040 moveal %d0,%a0
573de: b2a8 0038 cmpl %a0@(56),%d1
573e2: 670c beqs 573f0 <rtems_timer_cancel+0x38> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
573e4: 4868 0010 pea %a0@(16)
573e8: 4eb9 0005 c128 jsr 5c128 <_Watchdog_Remove>
573ee: 588f addql #4,%sp
_Thread_Enable_dispatch();
573f0: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
573f6: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
573f8: 4e5e unlk %fp
573fa: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
573fc: 7004 moveq #4,%d0
}
573fe: 4e5e unlk %fp
...
000577b4 <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
577b4: 4e56 fff0 linkw %fp,#-16
577b8: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
577bc: 486e fffc pea %fp@(-4)
577c0: 2f2e 0008 movel %fp@(8),%sp@-
577c4: 4879 0007 c4fc pea 7c4fc <_Timer_Information>
577ca: 4eb9 0005 a480 jsr 5a480 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
577d0: 4fef 000c lea %sp@(12),%sp
577d4: 2440 moveal %d0,%a2
577d6: 4aae fffc tstl %fp@(-4)
577da: 6620 bnes 577fc <rtems_timer_reset+0x48>
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
577dc: 202a 0038 movel %a2@(56),%d0
577e0: 6728 beqs 5780a <rtems_timer_reset+0x56>
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
577e2: 7201 moveq #1,%d1
577e4: b280 cmpl %d0,%d1
577e6: 674a beqs 57832 <rtems_timer_reset+0x7e>
/*
* Must be dormant or time of day timer (e.g. TIMER_DORMANT,
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
577e8: 740b moveq #11,%d2
}
_Thread_Enable_dispatch();
577ea: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
577f0: 2002 movel %d2,%d0
577f2: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
577f8: 4e5e unlk %fp
577fa: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
577fc: 7404 moveq #4,%d2
}
577fe: 2002 movel %d2,%d0
57800: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
57806: 4e5e unlk %fp
57808: 4e75 rts
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
5780a: 45ea 0010 lea %a2@(16),%a2
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
5780e: 4282 clrl %d2
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
57810: 2f0a movel %a2,%sp@-
57812: 4eb9 0005 c128 jsr 5c128 <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
57818: 2f0a movel %a2,%sp@-
5781a: 4879 0007 c39e pea 7c39e <_Watchdog_Ticks_chain>
57820: 4eb9 0005 bff8 jsr 5bff8 <_Watchdog_Insert>
57826: 4fef 000c lea %sp@(12),%sp
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
5782a: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
57830: 60be bras 577f0 <rtems_timer_reset+0x3c>
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
57832: 486a 0010 pea %a2@(16)
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
57836: 4282 clrl %d2
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
Timer_server_Control *timer_server = _Timer_server;
57838: 2679 0007 c534 moveal 7c534 <_Timer_server>,%a3
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
5783e: 4eb9 0005 c128 jsr 5c128 <_Watchdog_Remove>
(*timer_server->schedule_operation)( timer_server, the_timer );
57844: 2f0a movel %a2,%sp@-
57846: 2f0b movel %a3,%sp@-
57848: 206b 0004 moveal %a3@(4),%a0
5784c: 4e90 jsr %a0@
5784e: 4fef 000c lea %sp@(12),%sp
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
57852: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
57858: 6096 bras 577f0 <rtems_timer_reset+0x3c>
...
00057954 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
57954: 4e56 ffec linkw %fp,#-20
57958: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
5795c: 2479 0007 c534 moveal 7c534 <_Timer_server>,%a2
if ( !timer_server )
57962: 4a8a tstl %a2
57964: 6736 beqs 5799c <rtems_timer_server_fire_when+0x48>
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
57966: 4a39 0007 c2b8 tstb 7c2b8 <_TOD+0x14>
5796c: 660c bnes 5797a <rtems_timer_server_fire_when+0x26><== ALWAYS TAKEN
return RTEMS_NOT_DEFINED;
5796e: 700b moveq #11,%d0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
57970: 4cee 1c04 ffec moveml %fp@(-20),%d2/%a2-%a4 <== NOT EXECUTED
57976: 4e5e unlk %fp <== NOT EXECUTED
57978: 4e75 rts <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
5797a: 4aae 0010 tstl %fp@(16)
5797e: 6728 beqs 579a8 <rtems_timer_server_fire_when+0x54>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
57980: 2f2e 000c movel %fp@(12),%sp@-
57984: 4eb9 0005 44b4 jsr 544b4 <_TOD_Validate>
5798a: 588f addql #4,%sp
5798c: 4a00 tstb %d0
5798e: 6624 bnes 579b4 <rtems_timer_server_fire_when+0x60>
return RTEMS_INVALID_CLOCK;
57990: 7014 moveq #20,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
57992: 4cee 1c04 ffec moveml %fp@(-20),%d2/%a2-%a4
57998: 4e5e unlk %fp
5799a: 4e75 rts
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
5799c: 700e moveq #14,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
5799e: 4cee 1c04 ffec moveml %fp@(-20),%d2/%a2-%a4
579a4: 4e5e unlk %fp
579a6: 4e75 rts
if ( !_TOD.is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
579a8: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
579aa: 4cee 1c04 ffec moveml %fp@(-20),%d2/%a2-%a4
579b0: 4e5e unlk %fp
579b2: 4e75 rts
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
579b4: 2f2e 000c movel %fp@(12),%sp@-
579b8: 47f9 0006 c3c0 lea 6c3c0 <__divdi3>,%a3
579be: 4eb9 0005 4410 jsr 54410 <_TOD_To_seconds>
579c4: 2400 movel %d0,%d2
579c6: 2f3c 3b9a ca00 movel #1000000000,%sp@-
579cc: 42a7 clrl %sp@-
579ce: 2f39 0007 c2a8 movel 7c2a8 <_TOD+0x4>,%sp@-
579d4: 2f39 0007 c2a4 movel 7c2a4 <_TOD>,%sp@-
579da: 4e93 jsr %a3@
if ( seconds <= _TOD_Seconds_since_epoch() )
579dc: 4fef 0014 lea %sp@(20),%sp
579e0: b282 cmpl %d2,%d1
579e2: 64ac bccs 57990 <rtems_timer_server_fire_when+0x3c>
579e4: 486e fffc pea %fp@(-4)
579e8: 2f2e 0008 movel %fp@(8),%sp@-
579ec: 4879 0007 c4fc pea 7c4fc <_Timer_Information>
579f2: 4eb9 0005 a480 jsr 5a480 <_Objects_Get>
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
579f8: 4fef 000c lea %sp@(12),%sp
579fc: 2840 moveal %d0,%a4
579fe: 4aae fffc tstl %fp@(-4)
57a02: 666a bnes 57a6e <rtems_timer_server_fire_when+0x11a>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
57a04: 486c 0010 pea %a4@(16)
57a08: 4eb9 0005 c128 jsr 5c128 <_Watchdog_Remove>
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
57a0e: 296e 0014 0034 movel %fp@(20),%a4@(52)
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
57a14: 7003 moveq #3,%d0
57a16: 2940 0038 movel %d0,%a4@(56)
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
57a1a: 202e 0010 movel %fp@(16),%d0
57a1e: 2940 002c movel %d0,%a4@(44)
the_watchdog->id = id;
57a22: 202e 0008 movel %fp@(8),%d0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
57a26: 42ac 0018 clrl %a4@(24)
the_watchdog->routine = routine;
the_watchdog->id = id;
57a2a: 2940 0030 movel %d0,%a4@(48)
57a2e: 2f3c 3b9a ca00 movel #1000000000,%sp@-
57a34: 42a7 clrl %sp@-
57a36: 2f39 0007 c2a8 movel 7c2a8 <_TOD+0x4>,%sp@-
57a3c: 2f39 0007 c2a4 movel 7c2a4 <_TOD>,%sp@-
57a42: 4e93 jsr %a3@
57a44: 4fef 0010 lea %sp@(16),%sp
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
57a48: 9481 subl %d1,%d2
57a4a: 2942 001c movel %d2,%a4@(28)
(*timer_server->schedule_operation)( timer_server, the_timer );
57a4e: 2f0c movel %a4,%sp@-
57a50: 2f0a movel %a2,%sp@-
57a52: 206a 0004 moveal %a2@(4),%a0
57a56: 4e90 jsr %a0@
_Thread_Enable_dispatch();
57a58: 4eb9 0005 b1e8 jsr 5b1e8 <_Thread_Enable_dispatch>
57a5e: 4fef 000c lea %sp@(12),%sp
return RTEMS_SUCCESSFUL;
57a62: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
57a64: 4cee 1c04 ffec moveml %fp@(-20),%d2/%a2-%a4
57a6a: 4e5e unlk %fp
57a6c: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
57a6e: 7004 moveq #4,%d0
}
57a70: 4cee 1c04 ffec moveml %fp@(-20),%d2/%a2-%a4
57a76: 4e5e unlk %fp
...
00047fec <rtems_workspace_greedy_free>:
void rtems_workspace_greedy_free( void *opaque )
{
47fec: 4e56 0000 linkw %fp,#0
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
47ff0: 2239 0006 05ea movel 605ea <_Thread_Dispatch_disable_level>,%d1
++level;
47ff6: 5281 addql #1,%d1
47ff8: 202e 0008 movel %fp@(8),%d0
_Thread_Dispatch_disable_level = level;
47ffc: 23c1 0006 05ea movel %d1,605ea <_Thread_Dispatch_disable_level>
_Thread_Disable_dispatch();
_Heap_Greedy_free( &_Workspace_Area, opaque );
48002: 2f00 movel %d0,%sp@-
48004: 4879 0006 05fa pea 605fa <_Workspace_Area>
4800a: 4eb9 0004 8bb8 jsr 48bb8 <_Heap_Greedy_free>
_Thread_Enable_dispatch();
48010: 508f addql #8,%sp
}
48012: 4e5e unlk %fp
void rtems_workspace_greedy_free( void *opaque )
{
_Thread_Disable_dispatch();
_Heap_Greedy_free( &_Workspace_Area, opaque );
_Thread_Enable_dispatch();
48014: 4ef9 0004 a264 jmp 4a264 <_Thread_Enable_dispatch>
...