RTEMS 4.11Annotated Report
Sat Jul 17 05:17:31 2010
00047008 <_API_Mutex_Unlock>:
#include <rtems/score/apimutex.h>
void _API_Mutex_Unlock(
API_Mutex_Control *the_mutex
)
{
47008: 4e56 0000 linkw %fp,#0
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
4700c: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
47012: 5280 addql #1,%d0
47014: 206e 0008 moveal %fp@(8),%a0
47018: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
_Thread_Disable_dispatch();
_CORE_mutex_Surrender(
4701e: 42a7 clrl %sp@-
47020: 2f28 0008 movel %a0@(8),%sp@-
47024: 4868 0010 pea %a0@(16)
47028: 4eb9 0004 7310 jsr 47310 <_CORE_mutex_Surrender>
&the_mutex->Mutex,
the_mutex->Object.id,
NULL
);
_Thread_Enable_dispatch();
4702e: 4fef 000c lea %sp@(12),%sp
}
47032: 4e5e unlk %fp
_CORE_mutex_Surrender(
&the_mutex->Mutex,
the_mutex->Object.id,
NULL
);
_Thread_Enable_dispatch();
47034: 4ef9 0004 882e jmp 4882e <_Thread_Enable_dispatch>
...
00046ee2 <_API_extensions_Run_postdriver>:
*
* _API_extensions_Run_postdriver
*/
void _API_extensions_Run_postdriver( void )
{
46ee2: 4e56 0000 linkw %fp,#0
46ee6: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _API_extensions_List.first ;
46ee8: 2479 0005 e59c moveal 5e59c <_API_extensions_List>,%a2
46eee: b5fc 0005 e5a0 cmpal #386464,%a2
46ef4: 6710 beqs 46f06 <_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)();
46ef6: 206a 0008 moveal %a2@(8),%a0
46efa: 4e90 jsr %a0@
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _API_extensions_List.first ;
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
46efc: 2452 moveal %a2@,%a2
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _API_extensions_List.first ;
46efe: b5fc 0005 e5a0 cmpal #386464,%a2
46f04: 66f0 bnes 46ef6 <_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)();
}
}
46f06: 246e fffc moveal %fp@(-4),%a2
46f0a: 4e5e unlk %fp <== NOT EXECUTED
00046f0e <_API_extensions_Run_postswitch>:
*
* _API_extensions_Run_postswitch
*/
void _API_extensions_Run_postswitch( void )
{
46f0e: 4e56 0000 linkw %fp,#0
46f12: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _API_extensions_List.first ;
46f14: 2479 0005 e59c moveal 5e59c <_API_extensions_List>,%a2
46f1a: b5fc 0005 e5a0 cmpal #386464,%a2
46f20: 6718 beqs 46f3a <_API_extensions_Run_postswitch+0x2c><== NEVER TAKEN
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
46f22: 2f39 0005 e5e0 movel 5e5e0 <_Per_CPU_Information+0xc>,%sp@-
46f28: 206a 000c moveal %a2@(12),%a0
46f2c: 4e90 jsr %a0@
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _API_extensions_List.first ;
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
46f2e: 2452 moveal %a2@,%a2
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _API_extensions_List.first ;
46f30: 588f addql #4,%sp
46f32: b5fc 0005 e5a0 cmpal #386464,%a2
46f38: 66e8 bnes 46f22 <_API_extensions_Run_postswitch+0x14><== NEVER TAKEN
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
46f3a: 246e fffc moveal %fp@(-4),%a2
46f3e: 4e5e unlk %fp
...
0004e664 <_CORE_barrier_Release>:
#else
Objects_Id id __attribute__((unused)),
CORE_barrier_API_mp_support_callout api_barrier_mp_support __attribute__((unused))
#endif
)
{
4e664: 4e56 fff4 linkw %fp,#-12
4e668: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
4e66c: 246e 0008 moveal %fp@(8),%a2
4e670: 47f9 0004 a400 lea 4a400 <_Thread_queue_Dequeue>,%a3
Thread_Control *the_thread;
uint32_t count;
count = 0;
4e676: 4282 clrl %d2
while ( (the_thread = _Thread_queue_Dequeue(&the_barrier->Wait_queue)) ) {
4e678: 2f0a movel %a2,%sp@-
4e67a: 4e93 jsr %a3@
4e67c: 588f addql #4,%sp
4e67e: 4a80 tstl %d0
4e680: 670c beqs 4e68e <_CORE_barrier_Release+0x2a>
4e682: 2f0a movel %a2,%sp@-
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_barrier_mp_support) ( the_thread, id );
#endif
count++;
4e684: 5282 addql #1,%d2
{
Thread_Control *the_thread;
uint32_t count;
count = 0;
while ( (the_thread = _Thread_queue_Dequeue(&the_barrier->Wait_queue)) ) {
4e686: 4e93 jsr %a3@
4e688: 588f addql #4,%sp
4e68a: 4a80 tstl %d0
4e68c: 66f4 bnes 4e682 <_CORE_barrier_Release+0x1e> <== NEVER TAKEN
#endif
count++;
}
the_barrier->number_of_waiting_threads = 0;
return count;
}
4e68e: 2002 movel %d2,%d0
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_barrier_mp_support) ( the_thread, id );
#endif
count++;
}
the_barrier->number_of_waiting_threads = 0;
4e690: 42aa 0048 clrl %a2@(72)
return count;
}
4e694: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
4e69a: 4e5e unlk %fp
...
0004e6a0 <_CORE_barrier_Wait>:
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
4e6a0: 203c 0000 0700 movel #1792,%d0
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4e6a6: 4e56 fff4 linkw %fp,#-12
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
4e6aa: 2279 0006 0078 moveal 60078 <_Per_CPU_Information+0xc>,%a1
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4e6b0: 48d7 001c moveml %d2-%d4,%sp@
4e6b4: 206e 0008 moveal %fp@(8),%a0
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
4e6b8: 42a9 0034 clrl %a1@(52)
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4e6bc: 242e 000c movel %fp@(12),%d2
4e6c0: 262e 0014 movel %fp@(20),%d3
4e6c4: 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 );
4e6c8: 40c1 movew %sr,%d1
4e6ca: 8081 orl %d1,%d0
4e6cc: 46c0 movew %d0,%sr
the_barrier->number_of_waiting_threads++;
4e6ce: 2028 0048 movel %a0@(72),%d0
4e6d2: 5280 addql #1,%d0
4e6d4: 2140 0048 movel %d0,%a0@(72)
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
4e6d8: 4aa8 0040 tstl %a0@(64)
4e6dc: 6606 bnes 4e6e4 <_CORE_barrier_Wait+0x44>
if ( the_barrier->number_of_waiting_threads ==
4e6de: b0a8 0044 cmpl %a0@(68),%d0
4e6e2: 672e beqs 4e712 <_CORE_barrier_Wait+0x72>
4e6e4: 7001 moveq #1,%d0
4e6e6: 2140 0030 movel %d0,%a0@(48)
return;
}
}
_Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
executing->Wait.queue = &the_barrier->Wait_queue;
4e6ea: 2348 0044 movel %a0,%a1@(68)
executing->Wait.id = id;
4e6ee: 2342 0020 movel %d2,%a1@(32)
_ISR_Enable( level );
4e6f2: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
4e6f4: 2d43 000c movel %d3,%fp@(12)
4e6f8: 203c 0004 a938 movel #305464,%d0
4e6fe: 2d48 0008 movel %a0,%fp@(8)
}
4e702: 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 );
4e706: 2d40 0010 movel %d0,%fp@(16)
}
4e70a: 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 );
4e70c: 4ef9 0004 a570 jmp 4a570 <_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;
4e712: 7001 moveq #1,%d0
4e714: 2340 0034 movel %d0,%a1@(52)
_ISR_Enable( level );
4e718: 46c1 movew %d1,%sr
_CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
4e71a: 2d44 0010 movel %d4,%fp@(16)
4e71e: 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 );
}
4e722: 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 );
4e726: 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 );
}
4e72a: 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 );
4e72c: 4ef9 0004 e664 jmp 4e664 <_CORE_barrier_Release>
...
00059fb8 <_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
)
{
59fb8: 4e56 ffe0 linkw %fp,#-32
59fbc: 48d7 3c3c moveml %d2-%d5/%a2-%a5,%sp@
59fc0: 266e 0008 moveal %fp@(8),%a3
59fc4: 282e 000c movel %fp@(12),%d4
59fc8: 242e 0010 movel %fp@(16),%d2
59fcc: 2a2e 001c movel %fp@(28),%d5
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
59fd0: b4ab 004c cmpl %a3@(76),%d2
59fd4: 6262 bhis 5a038 <_CORE_message_queue_Broadcast+0x80><== NEVER TAKEN
* 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 ) {
59fd6: 4aab 0048 tstl %a3@(72)
59fda: 664c bnes 5a028 <_CORE_message_queue_Broadcast+0x70>
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
59fdc: 2f0b movel %a3,%sp@-
59fde: 49f9 0005 c750 lea 5c750 <_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 ) {
59fe4: 4283 clrl %d3
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
59fe6: 4bf9 0006 1cd8 lea 61cd8 <memcpy>,%a5
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
59fec: 4e94 jsr %a4@
59fee: 588f addql #4,%sp
59ff0: 2440 moveal %d0,%a2
59ff2: 4a80 tstl %d0
59ff4: 6722 beqs 5a018 <_CORE_message_queue_Broadcast+0x60>
59ff6: 2f02 movel %d2,%sp@-
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
59ff8: 5283 addql #1,%d3
59ffa: 2f04 movel %d4,%sp@-
59ffc: 2f2a 002c movel %a2@(44),%sp@-
5a000: 4e95 jsr %a5@
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
5a002: 206a 0028 moveal %a2@(40),%a0
5a006: 4fef 000c lea %sp@(12),%sp
5a00a: 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 =
5a00c: 2f0b movel %a3,%sp@-
5a00e: 4e94 jsr %a4@
5a010: 588f addql #4,%sp
5a012: 2440 moveal %d0,%a2
5a014: 4a80 tstl %d0
5a016: 66de bnes 59ff6 <_CORE_message_queue_Broadcast+0x3e>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
5a018: 2045 moveal %d5,%a0
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
5a01a: 4280 clrl %d0
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
5a01c: 2083 movel %d3,%a0@
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
5a01e: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5
5a024: 4e5e unlk %fp
5a026: 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;
5a028: 2045 moveal %d5,%a0
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
5a02a: 4280 clrl %d0
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
5a02c: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%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;
5a032: 4290 clrl %a0@
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
5a034: 4e5e unlk %fp
5a036: 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;
5a038: 7001 moveq #1,%d0 <== NOT EXECUTED
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
5a03a: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5 <== NOT EXECUTED
5a040: 4e5e unlk %fp <== NOT EXECUTED
0005a044 <_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
)
{
5a044: 4e56 0000 linkw %fp,#0
5a048: 2f0a movel %a2,%sp@-
/*
* This will flush blocked threads whether they were blocked on
* a send or receive.
*/
_Thread_queue_Flush(
5a04a: 2f2e 0010 movel %fp@(16),%sp@-
5a04e: 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
)
{
5a052: 246e 0008 moveal %fp@(8),%a2
/*
* This will flush blocked threads whether they were blocked on
* a send or receive.
*/
_Thread_queue_Flush(
5a056: 2f0a movel %a2,%sp@-
5a058: 4eb9 0005 cb40 jsr 5cb40 <_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 )
5a05e: 4fef 000c lea %sp@(12),%sp
5a062: 4aaa 0048 tstl %a2@(72)
5a066: 6612 bnes 5a07a <_CORE_message_queue_Close+0x36>
(void) _CORE_message_queue_Flush_support( the_message_queue );
(void) _Workspace_Free( the_message_queue->message_buffers );
5a068: 2d6a 005c 0008 movel %a2@(92),%fp@(8)
}
5a06e: 246e fffc moveal %fp@(-4),%a2
5a072: 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 );
5a074: 4ef9 0005 db2a jmp 5db2a <_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 );
5a07a: 2f0a movel %a2,%sp@-
5a07c: 4eb9 0005 a0b4 jsr 5a0b4 <_CORE_message_queue_Flush_support>
(void) _Workspace_Free( the_message_queue->message_buffers );
5a082: 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 );
5a088: 588f addql #4,%sp
(void) _Workspace_Free( the_message_queue->message_buffers );
}
5a08a: 246e fffc moveal %fp@(-4),%a2
5a08e: 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 );
5a090: 4ef9 0005 db2a jmp 5db2a <_Workspace_Free>
...
000502dc <_CORE_message_queue_Initialize>:
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
502dc: 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
)
{
502de: 4e56 fff4 linkw %fp,#-12
502e2: 202e 0014 movel %fp@(20),%d0
502e6: 48d7 040c moveml %d2-%d3/%a2,%sp@
502ea: 246e 0008 moveal %fp@(8),%a2
502ee: 242e 0010 movel %fp@(16),%d2
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
502f2: c280 andl %d0,%d1
)
{
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
502f4: 2542 0044 movel %d2,%a2@(68)
the_message_queue->number_of_pending_messages = 0;
502f8: 42aa 0048 clrl %a2@(72)
the_message_queue->maximum_message_size = maximum_message_size;
502fc: 2540 004c movel %d0,%a2@(76)
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
50300: 4a81 tstl %d1
50302: 6718 beqs 5031c <_CORE_message_queue_Initialize+0x40>
allocated_message_size += sizeof(uint32_t);
50304: 2200 movel %d0,%d1
50306: 5881 addql #4,%d1
allocated_message_size &= ~(sizeof(uint32_t) - 1);
50308: 76fc moveq #-4,%d3
5030a: c283 andl %d3,%d1
}
if (allocated_message_size < maximum_message_size)
5030c: b280 cmpl %d0,%d1
5030e: 640e bccs 5031e <_CORE_message_queue_Initialize+0x42><== ALWAYS TAKEN
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
50310: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
return false;
50316: 4200 clrb %d0
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
50318: 4e5e unlk %fp
5031a: 4e75 rts
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
5031c: 2200 movel %d0,%d1
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
5031e: 2601 movel %d1,%d3
50320: 0683 0000 0010 addil #16,%d3
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
50326: 2003 movel %d3,%d0
50328: 4c02 0800 mulsl %d2,%d0
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
5032c: b280 cmpl %d0,%d1
5032e: 62e0 bhis 50310 <_CORE_message_queue_Initialize+0x34><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
50330: 2f00 movel %d0,%sp@-
50332: 4eb9 0005 3132 jsr 53132 <_Workspace_Allocate>
if (the_message_queue->message_buffers == 0)
50338: 588f addql #4,%sp
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
5033a: 2540 005c movel %d0,%a2@(92)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
5033e: 67d0 beqs 50310 <_CORE_message_queue_Initialize+0x34>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
50340: 2f03 movel %d3,%sp@-
50342: 2f02 movel %d2,%sp@-
50344: 2f00 movel %d0,%sp@-
50346: 486a 0060 pea %a2@(96)
5034a: 4eb9 0005 4f68 jsr 54f68 <_Chain_Initialize>
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
50350: 4878 0006 pea 6 <EXTENDSFDF>
50354: 7001 moveq #1,%d0
50356: 206e 000c moveal %fp@(12),%a0
5035a: b090 cmpl %a0@,%d0
5035c: 57c0 seq %d0
5035e: 4878 0080 pea 80 <DBL_MANT_DIG+0x4b>
50362: 49c0 extbl %d0
50364: 4480 negl %d0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
50366: 41ea 0054 lea %a2@(84),%a0
5036a: 2f00 movel %d0,%sp@-
5036c: 2548 0050 movel %a0,%a2@(80)
the_message_queue->message_buffers,
(size_t) maximum_pending_messages,
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
50370: 41ea 0050 lea %a2@(80),%a0
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
50374: 42aa 0054 clrl %a2@(84)
50378: 2548 0058 movel %a0,%a2@(88)
_Thread_queue_Initialize(
5037c: 2f0a movel %a2,%sp@-
5037e: 4eb9 0005 24a8 jsr 524a8 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
50384: 4fef 0020 lea %sp@(32),%sp
}
50388: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
5038e: 7001 moveq #1,%d0
}
50390: 4e5e unlk %fp <== NOT EXECUTED
00050394 <_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 );
50394: 203c 0000 0700 movel #1792,%d0
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
5039a: 4e56 ffe4 linkw %fp,#-28
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
5039e: 2079 0006 8488 moveal 68488 <_Per_CPU_Information+0xc>,%a0
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
503a4: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@
503a8: 246e 0008 moveal %fp@(8),%a2
503ac: 2a2e 000c movel %fp@(12),%d5
503b0: 242e 0010 movel %fp@(16),%d2
503b4: 226e 0014 moveal %fp@(20),%a1
503b8: 282e 001c movel %fp@(28),%d4
503bc: 162e 001b moveb %fp@(27),%d3
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;
503c0: 42a8 0034 clrl %a0@(52)
_ISR_Disable( level );
503c4: 40c1 movew %sr,%d1
503c6: 8081 orl %d1,%d0
503c8: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
503ca: 200a movel %a2,%d0
503cc: 0680 0000 0054 addil #84,%d0
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
503d2: 266a 0050 moveal %a2@(80),%a3
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
503d6: b08b cmpl %a3,%d0
503d8: 674e beqs 50428 <_CORE_message_queue_Seize+0x94>
{
Chain_Node *return_node;
Chain_Node *new_first;
return_node = the_chain->first;
new_first = return_node->next;
503da: 2053 moveal %a3@,%a0
CORE_message_queue_Buffer_control *_CORE_message_queue_Get_pending_message (
CORE_message_queue_Control *the_message_queue
)
{
return (CORE_message_queue_Buffer_control *)
_Chain_Get_unprotected( &the_message_queue->Pending_messages );
503dc: 49ea 0050 lea %a2@(80),%a4
the_chain->first = new_first;
503e0: 2548 0050 movel %a0,%a2@(80)
503e4: 214c 0004 movel %a4,%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;
503e8: 53aa 0048 subql #1,%a2@(72)
_ISR_Enable( level );
503ec: 46c1 movew %d1,%sr
*size_p = the_message->Contents.size;
503ee: 22ab 0008 movel %a3@(8),%a1@
_Thread_Executing->Wait.count =
503f2: 2079 0006 8488 moveal 68488 <_Per_CPU_Information+0xc>,%a0
503f8: 42a8 0024 clrl %a0@(36)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
503fc: 2f11 movel %a1@,%sp@-
503fe: 486b 000c pea %a3@(12)
RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
_Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
50402: 45ea 0060 lea %a2@(96),%a2
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
50406: 2f02 movel %d2,%sp@-
50408: 4eb9 0005 7804 jsr 57804 <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 );
5040e: 4fef 000c lea %sp@(12),%sp
50412: 2d4a 0008 movel %a2,%fp@(8)
50416: 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 );
}
5041a: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
50420: 4e5e unlk %fp
50422: 4ef9 0005 0210 jmp 50210 <_Chain_Append>
return;
}
#endif
}
if ( !wait ) {
50428: 4a03 tstb %d3
5042a: 6612 bnes 5043e <_CORE_message_queue_Seize+0xaa>
_ISR_Enable( level );
5042c: 46c1 movew %d1,%sr
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
5042e: 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 );
}
50430: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
#endif
}
if ( !wait ) {
_ISR_Enable( level );
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
50436: 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 );
}
5043a: 4e5e unlk %fp
5043c: 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;
5043e: 7001 moveq #1,%d0
50440: 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;
50444: 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;
50448: 214a 0044 movel %a2,%a0@(68)
executing->Wait.id = id;
5044c: 2145 0020 movel %d5,%a0@(32)
executing->Wait.return_argument_second.mutable_object = buffer;
executing->Wait.return_argument = size_p;
50450: 2149 0028 movel %a1,%a0@(40)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
50454: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
50456: 49f9 0005 25b4 lea 525b4 <_Thread_queue_Timeout>,%a4
5045c: 2d44 000c movel %d4,%fp@(12)
50460: 2d4c 0010 movel %a4,%fp@(16)
50464: 2d4a 0008 movel %a2,%fp@(8)
}
50468: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
5046e: 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 );
50470: 4ef9 0005 21ec jmp 521ec <_Thread_queue_Enqueue_with_handler>
...
00050478 <_CORE_message_queue_Submit>:
#endif
CORE_message_queue_Submit_types submit_type,
bool wait,
Watchdog_Interval timeout
)
{
50478: 4e56 fff4 linkw %fp,#-12
5047c: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
50480: 246e 0008 moveal %fp@(8),%a2
50484: 242e 0010 movel %fp@(16),%d2
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
50488: b4aa 004c cmpl %a2@(76),%d2
5048c: 6256 bhis 504e4 <_CORE_message_queue_Submit+0x6c>
}
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
5048e: 202a 0048 movel %a2@(72),%d0
50492: 675c beqs 504f0 <_CORE_message_queue_Submit+0x78>
/*
* No one waiting on the message queue at this time, so attempt to
* queue the message up for a future receive.
*/
if ( the_message_queue->number_of_pending_messages <
50494: b0aa 0044 cmpl %a2@(68),%d0
50498: 650c bcss 504a6 <_CORE_message_queue_Submit+0x2e>
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
#if !defined(RTEMS_SCORE_COREMSG_ENABLE_BLOCKING_SEND)
return CORE_MESSAGE_QUEUE_STATUS_TOO_MANY;
5049a: 7002 moveq #2,%d0
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
5049c: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
504a2: 4e5e unlk %fp
504a4: 4e75 rts
_CORE_message_queue_Allocate_message_buffer (
CORE_message_queue_Control *the_message_queue
)
{
return (CORE_message_queue_Buffer_control *)
_Chain_Get( &the_message_queue->Inactive_messages );
504a6: 486a 0060 pea %a2@(96)
504aa: 4eb9 0005 0270 jsr 50270 <_Chain_Get>
504b0: 2640 moveal %d0,%a3
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
504b2: 2f02 movel %d2,%sp@-
504b4: 2f2e 000c movel %fp@(12),%sp@-
504b8: 486b 000c pea %a3@(12)
504bc: 4eb9 0005 7804 jsr 57804 <memcpy>
_CORE_message_queue_Copy_buffer(
buffer,
the_message->Contents.buffer,
size
);
the_message->Contents.size = size;
504c2: 2742 0008 movel %d2,%a3@(8)
_CORE_message_queue_Set_message_priority( the_message, submit_type );
_CORE_message_queue_Insert_message(
504c6: 2f2e 001c movel %fp@(28),%sp@-
504ca: 2f0b movel %a3,%sp@-
504cc: 2f0a movel %a2,%sp@-
504ce: 4eb9 0005 4fd0 jsr 54fd0 <_CORE_message_queue_Insert_message>
the_message_queue,
the_message,
submit_type
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
504d4: 4fef 001c lea %sp@(28),%sp
504d8: 4280 clrl %d0
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
504da: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
504e0: 4e5e unlk %fp
504e2: 4e75 rts
{
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
504e4: 7001 moveq #1,%d0
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
504e6: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
504ec: 4e5e unlk %fp
504ee: 4e75 rts
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
504f0: 2f0a movel %a2,%sp@-
504f2: 4eb9 0005 207c jsr 5207c <_Thread_queue_Dequeue>
if ( the_thread ) {
504f8: 588f addql #4,%sp
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
504fa: 2640 moveal %d0,%a3
if ( the_thread ) {
504fc: 4a80 tstl %d0
504fe: 672e beqs 5052e <_CORE_message_queue_Submit+0xb6>
50500: 2f02 movel %d2,%sp@-
50502: 2f2e 000c movel %fp@(12),%sp@-
50506: 2f2b 002c movel %a3@(44),%sp@-
5050a: 4eb9 0005 7804 jsr 57804 <memcpy>
_CORE_message_queue_Copy_buffer(
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
50510: 206b 0028 moveal %a3@(40),%a0
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
50514: 4fef 000c lea %sp@(12),%sp
50518: 4280 clrl %d0
_CORE_message_queue_Copy_buffer(
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
5051a: 2082 movel %d2,%a0@
the_thread->Wait.count = (uint32_t) submit_type;
5051c: 222e 001c movel %fp@(28),%d1
50520: 2741 0024 movel %d1,%a3@(36)
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
50524: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
5052a: 4e5e unlk %fp
5052c: 4e75 rts
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
if ( the_thread ) {
5052e: 202a 0048 movel %a2@(72),%d0
/*
* No one waiting on the message queue at this time, so attempt to
* queue the message up for a future receive.
*/
if ( the_message_queue->number_of_pending_messages <
50532: b0aa 0044 cmpl %a2@(68),%d0
50536: 6400 ff62 bccw 5049a <_CORE_message_queue_Submit+0x22>
5053a: 6000 ff6a braw 504a6 <_CORE_message_queue_Submit+0x2e>
...
000470e4 <_CORE_mutex_Initialize>:
CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex,
CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock
)
{
470e4: 4e56 0000 linkw %fp,#0
470e8: 206e 0008 moveal %fp@(8),%a0
470ec: 2f0a movel %a2,%sp@-
470ee: 246e 000c moveal %fp@(12),%a2
/* Add this to the RTEMS environment later ?????????
rtems_assert( initial_lock == CORE_MUTEX_LOCKED ||
initial_lock == CORE_MUTEX_UNLOCKED );
*/
the_mutex->Attributes = *the_mutex_attributes;
470f2: 224a moveal %a2,%a1
470f4: 2159 0040 movel %a1@+,%a0@(64)
470f8: 2159 0044 movel %a1@+,%a0@(68)
470fc: 2159 0048 movel %a1@+,%a0@(72)
CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex,
CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock
)
{
47100: 202e 0010 movel %fp@(16),%d0
/* Add this to the RTEMS environment later ?????????
rtems_assert( initial_lock == CORE_MUTEX_LOCKED ||
initial_lock == CORE_MUTEX_UNLOCKED );
*/
the_mutex->Attributes = *the_mutex_attributes;
47104: 3151 004c movew %a1@,%a0@(76)
the_mutex->lock = initial_lock;
47108: 2140 004e movel %d0,%a0@(78)
the_mutex->blocked_count = 0;
4710c: 42a8 0056 clrl %a0@(86)
if ( initial_lock == CORE_MUTEX_LOCKED ) {
47110: 4a80 tstl %d0
47112: 6654 bnes 47168 <_CORE_mutex_Initialize+0x84>
the_mutex->nest_count = 1;
the_mutex->holder = _Thread_Executing;
47114: 2279 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a1
the_mutex->Attributes = *the_mutex_attributes;
the_mutex->lock = initial_lock;
the_mutex->blocked_count = 0;
if ( initial_lock == CORE_MUTEX_LOCKED ) {
the_mutex->nest_count = 1;
4711a: 7201 moveq #1,%d1
the_mutex->holder = _Thread_Executing;
the_mutex->holder_id = _Thread_Executing->Object.id;
4711c: 2169 0008 005e movel %a1@(8),%a0@(94)
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
47122: 2028 0046 movel %a0@(70),%d0
the_mutex->Attributes = *the_mutex_attributes;
the_mutex->lock = initial_lock;
the_mutex->blocked_count = 0;
if ( initial_lock == CORE_MUTEX_LOCKED ) {
the_mutex->nest_count = 1;
47126: 2141 0052 movel %d1,%a0@(82)
the_mutex->holder = _Thread_Executing;
the_mutex->holder_id = _Thread_Executing->Object.id;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
4712a: 123c 0002 moveb #2,%d1
the_mutex->lock = initial_lock;
the_mutex->blocked_count = 0;
if ( initial_lock == CORE_MUTEX_LOCKED ) {
the_mutex->nest_count = 1;
the_mutex->holder = _Thread_Executing;
4712e: 2149 005a movel %a1,%a0@(90)
the_mutex->holder_id = _Thread_Executing->Object.id;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
47132: b280 cmpl %d0,%d1
47134: 6762 beqs 47198 <_CORE_mutex_Initialize+0xb4>
47136: 123c 0003 moveb #3,%d1
4713a: b280 cmpl %d0,%d1
4713c: 675a beqs 47198 <_CORE_mutex_Initialize+0xb4>
the_mutex->nest_count = 0;
the_mutex->holder = NULL;
the_mutex->holder_id = 0;
}
_Thread_queue_Initialize(
4713e: 4aaa 0006 tstl %a2@(6)
47142: 56c0 sne %d0
47144: 4878 0005 pea 5 <COMPARE>
47148: 49c0 extbl %d0
4714a: 4878 0400 pea 400 <D_BIAS+0x2>
4714e: 4480 negl %d0
47150: 2f00 movel %d0,%sp@-
47152: 2f08 movel %a0,%sp@-
47154: 4eb9 0004 8fb8 jsr 48fb8 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
4715a: 4fef 0010 lea %sp@(16),%sp
4715e: 4280 clrl %d0
}
47160: 246e fffc moveal %fp@(-4),%a2
47164: 4e5e unlk %fp
47166: 4e75 rts
the_mutex->nest_count = 0;
the_mutex->holder = NULL;
the_mutex->holder_id = 0;
}
_Thread_queue_Initialize(
47168: 4aaa 0006 tstl %a2@(6)
4716c: 56c0 sne %d0
#endif
_Thread_Executing->resource_count++;
}
} else {
the_mutex->nest_count = 0;
4716e: 42a8 0052 clrl %a0@(82)
the_mutex->holder = NULL;
the_mutex->holder_id = 0;
}
_Thread_queue_Initialize(
47172: 49c0 extbl %d0
47174: 4480 negl %d0
_Thread_Executing->resource_count++;
}
} else {
the_mutex->nest_count = 0;
the_mutex->holder = NULL;
47176: 42a8 005a clrl %a0@(90)
the_mutex->holder_id = 0;
4717a: 42a8 005e clrl %a0@(94)
}
_Thread_queue_Initialize(
4717e: 4878 0005 pea 5 <COMPARE>
47182: 4878 0400 pea 400 <D_BIAS+0x2>
47186: 2f00 movel %d0,%sp@-
47188: 2f08 movel %a0,%sp@-
4718a: 4eb9 0004 8fb8 jsr 48fb8 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
47190: 4fef 0010 lea %sp@(16),%sp
47194: 4280 clrl %d0
47196: 60c8 bras 47160 <_CORE_mutex_Initialize+0x7c>
the_mutex->holder = _Thread_Executing;
the_mutex->holder_id = _Thread_Executing->Object.id;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
47198: 2028 004a movel %a0@(74),%d0
4719c: b0a9 0014 cmpl %a1@(20),%d0
471a0: 6228 bhis 471ca <_CORE_mutex_Initialize+0xe6> <== NEVER TAKEN
_Chain_Prepend_unprotected( &_Thread_Executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = _Thread_Executing->current_priority;
#endif
_Thread_Executing->resource_count++;
471a2: 52a9 001c addql #1,%a1@(28)
the_mutex->nest_count = 0;
the_mutex->holder = NULL;
the_mutex->holder_id = 0;
}
_Thread_queue_Initialize(
471a6: 4aaa 0006 tstl %a2@(6)
471aa: 56c0 sne %d0
471ac: 4878 0005 pea 5 <COMPARE>
471b0: 49c0 extbl %d0
471b2: 4878 0400 pea 400 <D_BIAS+0x2>
471b6: 4480 negl %d0
471b8: 2f00 movel %d0,%sp@-
471ba: 2f08 movel %a0,%sp@-
471bc: 4eb9 0004 8fb8 jsr 48fb8 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
471c2: 4fef 0010 lea %sp@(16),%sp
471c6: 4280 clrl %d0
471c8: 6096 bras 47160 <_CORE_mutex_Initialize+0x7c>
}
471ca: 246e fffc moveal %fp@(-4),%a2
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
the_mutex->Attributes.priority_ceiling )
return CORE_MUTEX_STATUS_CEILING_VIOLATED;
471ce: 7006 moveq #6,%d0
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
471d0: 4e5e unlk %fp <== NOT EXECUTED
00047260 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
47260: 4e56 0000 linkw %fp,#0
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
47264: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
4726a: 2f0a movel %a2,%sp@-
4726c: 246e 0008 moveal %fp@(8),%a2
47270: 2f02 movel %d2,%sp@-
47272: 142e 0013 moveb %fp@(19),%d2
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
47276: 4a80 tstl %d0
47278: 6704 beqs 4727e <_CORE_mutex_Seize+0x1e>
4727a: 4a02 tstb %d2
4727c: 6634 bnes 472b2 <_CORE_mutex_Seize+0x52> <== ALWAYS TAKEN
4727e: 486e 0018 pea %fp@(24)
47282: 2f0a movel %a2,%sp@-
47284: 4eb9 0004 bacc jsr 4bacc <_CORE_mutex_Seize_interrupt_trylock>
4728a: 508f addql #8,%sp
4728c: 4a80 tstl %d0
4728e: 6716 beqs 472a6 <_CORE_mutex_Seize+0x46>
47290: 4a02 tstb %d2
47292: 6636 bnes 472ca <_CORE_mutex_Seize+0x6a>
47294: 202e 0018 movel %fp@(24),%d0
47298: 46c0 movew %d0,%sr
4729a: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
472a0: 7001 moveq #1,%d0
472a2: 2140 0034 movel %d0,%a0@(52)
}
472a6: 242e fff8 movel %fp@(-8),%d2
472aa: 246e fffc moveal %fp@(-4),%a2
472ae: 4e5e unlk %fp
472b0: 4e75 rts
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
472b2: 7001 moveq #1,%d0
472b4: b0b9 0005 e588 cmpl 5e588 <_System_state_Current>,%d0
472ba: 64c2 bccs 4727e <_CORE_mutex_Seize+0x1e>
472bc: 4878 0012 pea 12 <INVALID_OPERATION+0x2>
472c0: 42a7 clrl %sp@-
472c2: 42a7 clrl %sp@-
472c4: 4eb9 0004 79c8 jsr 479c8 <_Internal_error_Occurred>
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;
472ca: 7001 moveq #1,%d0
472cc: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
472d2: 2540 0030 movel %d0,%a2@(48)
472d6: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
472dc: 5280 addql #1,%d0
472de: 216e 000c 0020 movel %fp@(12),%a0@(32)
472e4: 214a 0044 movel %a2,%a0@(68)
472e8: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
472ee: 202e 0018 movel %fp@(24),%d0
472f2: 46c0 movew %d0,%sr
472f4: 2f2e 0014 movel %fp@(20),%sp@-
472f8: 2f0a movel %a2,%sp@-
472fa: 4eb9 0004 71d4 jsr 471d4 <_CORE_mutex_Seize_interrupt_blocking>
}
47300: 242e fff8 movel %fp@(-8),%d2
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
47304: 508f addql #8,%sp
}
47306: 246e fffc moveal %fp@(-4),%a2
4730a: 4e5e unlk %fp
...
0004bacc <_CORE_mutex_Seize_interrupt_trylock>:
#if defined(__RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__)
int _CORE_mutex_Seize_interrupt_trylock(
CORE_mutex_Control *the_mutex,
ISR_Level *level_p
)
{
4bacc: 4e56 0000 linkw %fp,#0
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
4bad0: 2279 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a1
4bad6: 2f0a movel %a2,%sp@-
4bad8: 206e 0008 moveal %fp@(8),%a0
4badc: 2f02 movel %d2,%sp@-
4bade: 246e 000c moveal %fp@(12),%a2
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
4bae2: 42a9 0034 clrl %a1@(52)
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
4bae6: 4aa8 004e tstl %a0@(78)
4baea: 673a beqs 4bb26 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
the_mutex->lock = CORE_MUTEX_LOCKED;
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
the_mutex->nest_count = 1;
4baec: 7201 moveq #1,%d1
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
the_mutex->lock = CORE_MUTEX_LOCKED;
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
4baee: 2169 0008 005e movel %a1@(8),%a0@(94)
return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p );
}
4baf4: 2028 0046 movel %a0@(70),%d0
the_mutex->nest_count = 1;
4baf8: 2141 0052 movel %d1,%a0@(82)
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
4bafc: 123c 0002 moveb #2,%d1
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
the_mutex->lock = CORE_MUTEX_LOCKED;
4bb00: 42a8 004e clrl %a0@(78)
the_mutex->holder = executing;
4bb04: 2149 005a movel %a1,%a0@(90)
the_mutex->holder_id = executing->Object.id;
the_mutex->nest_count = 1;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
4bb08: b280 cmpl %d0,%d1
4bb0a: 672e beqs 4bb3a <_CORE_mutex_Seize_interrupt_trylock+0x6e>
4bb0c: 123c 0003 moveb #3,%d1
4bb10: b280 cmpl %d0,%d1
4bb12: 674e beqs 4bb62 <_CORE_mutex_Seize_interrupt_trylock+0x96>
executing->resource_count++;
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
4bb14: 2012 movel %a2@,%d0
4bb16: 46c0 movew %d0,%sr
return 0;
4bb18: 4280 clrl %d0
4bb1a: 242e fff8 movel %fp@(-8),%d2
4bb1e: 246e fffc moveal %fp@(-4),%a2
4bb22: 4e5e unlk %fp
4bb24: 4e75 rts
/*
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
4bb26: b3e8 005a cmpal %a0@(90),%a1
4bb2a: 671a beqs 4bb46 <_CORE_mutex_Seize_interrupt_trylock+0x7a>
4bb2c: 242e fff8 movel %fp@(-8),%d2
/*
* The mutex is not available and the caller must deal with the possibility
* of blocking.
*/
return 1;
4bb30: 7001 moveq #1,%d0
4bb32: 246e fffc moveal %fp@(-4),%a2
4bb36: 4e5e unlk %fp
4bb38: 4e75 rts
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
4bb3a: 52a9 001c addql #1,%a1@(28)
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
4bb3e: 2012 movel %a2@,%d0
4bb40: 46c0 movew %d0,%sr
return 0;
4bb42: 4280 clrl %d0
4bb44: 60d4 bras 4bb1a <_CORE_mutex_Seize_interrupt_trylock+0x4e>
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
4bb46: 2028 0040 movel %a0@(64),%d0
4bb4a: 6658 bnes 4bba4 <_CORE_mutex_Seize_interrupt_trylock+0xd8>
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
4bb4c: 52a8 0052 addql #1,%a0@(82)
_ISR_Enable( *level_p );
4bb50: 2012 movel %a2@,%d0
4bb52: 46c0 movew %d0,%sr
4bb54: 242e fff8 movel %fp@(-8),%d2
return 0;
4bb58: 4280 clrl %d0
4bb5a: 246e fffc moveal %fp@(-4),%a2
4bb5e: 4e5e unlk %fp
4bb60: 4e75 rts
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
4bb62: 2429 001c movel %a1@(28),%d2
4bb66: 2002 movel %d2,%d0
4bb68: 5280 addql #1,%d0
4bb6a: 2340 001c movel %d0,%a1@(28)
*/
{
Priority_Control ceiling;
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
4bb6e: 2228 004a movel %a0@(74),%d1
current = executing->current_priority;
4bb72: 2029 0014 movel %a1@(20),%d0
if ( current == ceiling ) {
4bb76: b081 cmpl %d1,%d0
4bb78: 6700 0082 beqw 4bbfc <_CORE_mutex_Seize_interrupt_trylock+0x130>
_ISR_Enable( *level_p );
return 0;
}
if ( current > ceiling ) {
4bb7c: 6244 bhis 4bbc2 <_CORE_mutex_Seize_interrupt_trylock+0xf6>
);
_Thread_Enable_dispatch();
return 0;
}
/* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
4bb7e: 7206 moveq #6,%d1
the_mutex->lock = CORE_MUTEX_UNLOCKED;
4bb80: 7001 moveq #1,%d0
);
_Thread_Enable_dispatch();
return 0;
}
/* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
4bb82: 2341 0034 movel %d1,%a1@(52)
the_mutex->lock = CORE_MUTEX_UNLOCKED;
4bb86: 2140 004e movel %d0,%a0@(78)
the_mutex->nest_count = 0; /* undo locking above */
4bb8a: 42a8 0052 clrl %a0@(82)
executing->resource_count--; /* undo locking above */
4bb8e: 2342 001c movel %d2,%a1@(28)
_ISR_Enable( *level_p );
4bb92: 2012 movel %a2@,%d0
4bb94: 46c0 movew %d0,%sr
4bb96: 242e fff8 movel %fp@(-8),%d2
return 0;
4bb9a: 4280 clrl %d0
4bb9c: 246e fffc moveal %fp@(-4),%a2
4bba0: 4e5e unlk %fp
4bba2: 4e75 rts
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
4bba4: 7201 moveq #1,%d1
4bba6: b280 cmpl %d0,%d1
4bba8: 6682 bnes 4bb2c <_CORE_mutex_Seize_interrupt_trylock+0x60><== ALWAYS TAKEN
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
_ISR_Enable( *level_p );
return 0;
case CORE_MUTEX_NESTING_IS_ERROR:
executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
4bbaa: 7002 moveq #2,%d0 <== NOT EXECUTED
4bbac: 2340 0034 movel %d0,%a1@(52) <== NOT EXECUTED
_ISR_Enable( *level_p );
4bbb0: 2012 movel %a2@,%d0 <== NOT EXECUTED
4bbb2: 46c0 movew %d0,%sr <== NOT EXECUTED
4bbb4: 242e fff8 movel %fp@(-8),%d2 <== NOT EXECUTED
return 0;
4bbb8: 4280 clrl %d0 <== NOT EXECUTED
4bbba: 246e fffc moveal %fp@(-4),%a2 <== NOT EXECUTED
4bbbe: 4e5e unlk %fp <== NOT EXECUTED
4bbc0: 4e75 rts <== NOT EXECUTED
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
4bbc2: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
4bbc8: 5280 addql #1,%d0
4bbca: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
return 0;
}
if ( current > ceiling ) {
_Thread_Disable_dispatch();
_ISR_Enable( *level_p );
4bbd0: 2012 movel %a2@,%d0
4bbd2: 46c0 movew %d0,%sr
_Thread_Change_priority(
4bbd4: 42a7 clrl %sp@-
4bbd6: 2f28 004a movel %a0@(74),%sp@-
4bbda: 2f28 005a movel %a0@(90),%sp@-
4bbde: 4eb9 0004 82fc jsr 482fc <_Thread_Change_priority>
the_mutex->holder,
the_mutex->Attributes.priority_ceiling,
false
);
_Thread_Enable_dispatch();
4bbe4: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
4bbea: 242e fff8 movel %fp@(-8),%d2
4bbee: 4fef 000c lea %sp@(12),%sp
return 0;
4bbf2: 4280 clrl %d0
4bbf4: 246e fffc moveal %fp@(-4),%a2
4bbf8: 4e5e unlk %fp
4bbfa: 4e75 rts
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
_ISR_Enable( *level_p );
4bbfc: 2012 movel %a2@,%d0
4bbfe: 46c0 movew %d0,%sr
4bc00: 242e fff8 movel %fp@(-8),%d2
return 0;
4bc04: 4280 clrl %d0
4bc06: 246e fffc moveal %fp@(-4),%a2
4bc0a: 4e5e unlk %fp
...
00047310 <_CORE_mutex_Surrender>:
#else
Objects_Id id __attribute__((unused)),
CORE_mutex_API_mp_support_callout api_mutex_mp_support __attribute__((unused))
#endif
)
{
47310: 4e56 0000 linkw %fp,#0
47314: 2f0a movel %a2,%sp@-
47316: 246e 0008 moveal %fp@(8),%a2
Thread_Control *the_thread;
Thread_Control *holder;
holder = the_mutex->holder;
4731a: 206a 005a moveal %a2@(90),%a0
* allowed when the mutex in quetion is FIFO or simple Priority
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
4731e: 4a2a 0044 tstb %a2@(68)
47322: 6712 beqs 47336 <_CORE_mutex_Surrender+0x26>
if ( !_Thread_Is_executing( holder ) )
47324: b1f9 0005 e5e0 cmpal 5e5e0 <_Per_CPU_Information+0xc>,%a0
4732a: 670a beqs 47336 <_CORE_mutex_Surrender+0x26>
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
4732c: 246e fffc moveal %fp@(-4),%a2
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
if ( !_Thread_Is_executing( holder ) )
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
47330: 7003 moveq #3,%d0
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
47332: 4e5e unlk %fp
47334: 4e75 rts
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
}
/* XXX already unlocked -- not right status */
if ( !the_mutex->nest_count )
47336: 202a 0052 movel %a2@(82),%d0
4733a: 6758 beqs 47394 <_CORE_mutex_Surrender+0x84>
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
4733c: 5380 subql #1,%d0
4733e: 2540 0052 movel %d0,%a2@(82)
if ( the_mutex->nest_count != 0 ) {
47342: 6650 bnes 47394 <_CORE_mutex_Surrender+0x84>
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
47344: 202a 0046 movel %a2@(70),%d0
/*
* Formally release the mutex before possibly transferring it to a
* blocked thread.
*/
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
47348: 7202 moveq #2,%d1
4734a: b280 cmpl %d0,%d1
4734c: 6750 beqs 4739e <_CORE_mutex_Surrender+0x8e>
4734e: 123c 0003 moveb #3,%d1
47352: b280 cmpl %d0,%d1
47354: 6748 beqs 4739e <_CORE_mutex_Surrender+0x8e>
if ( holder->resource_count == 0 &&
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
}
}
the_mutex->holder = NULL;
47356: 42aa 005a clrl %a2@(90)
the_mutex->holder_id = 0;
4735a: 42aa 005e clrl %a2@(94)
/*
* Now we check if another thread was waiting for this mutex. If so,
* transfer the mutex to that thread.
*/
if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) {
4735e: 2f0a movel %a2,%sp@-
47360: 4eb9 0004 8b8c jsr 48b8c <_Thread_queue_Dequeue>
47366: 588f addql #4,%sp
47368: 2040 moveal %d0,%a0
4736a: 4a80 tstl %d0
4736c: 6700 0090 beqw 473fe <_CORE_mutex_Surrender+0xee>
#endif
{
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
the_mutex->nest_count = 1;
47370: 7201 moveq #1,%d1
} else
#endif
{
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
47372: 2568 0008 005e movel %a0@(8),%a2@(94)
the_mutex->nest_count = 1;
switch ( the_mutex->Attributes.discipline ) {
47378: 202a 0046 movel %a2@(70),%d0
#endif
{
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
the_mutex->nest_count = 1;
4737c: 2541 0052 movel %d1,%a2@(82)
switch ( the_mutex->Attributes.discipline ) {
47380: 123c 0002 moveb #2,%d1
} else
#endif
{
the_mutex->holder = the_thread;
47384: 2548 005a movel %a0,%a2@(90)
the_mutex->holder_id = the_thread->Object.id;
the_mutex->nest_count = 1;
switch ( the_mutex->Attributes.discipline ) {
47388: b280 cmpl %d0,%d1
4738a: 6764 beqs 473f0 <_CORE_mutex_Surrender+0xe0>
4738c: 123c 0003 moveb #3,%d1
47390: b280 cmpl %d0,%d1
47392: 6734 beqs 473c8 <_CORE_mutex_Surrender+0xb8> <== NEVER TAKEN
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
47394: 246e fffc moveal %fp@(-4),%a2
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
47398: 4280 clrl %d0
}
4739a: 4e5e unlk %fp
4739c: 4e75 rts
_CORE_mutex_Pop_priority( the_mutex, holder );
if ( pop_status != CORE_MUTEX_STATUS_SUCCESSFUL )
return pop_status;
holder->resource_count--;
4739e: 2028 001c movel %a0@(28),%d0
473a2: 5380 subql #1,%d0
473a4: 2140 001c movel %d0,%a0@(28)
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
473a8: 66ac bnes 47356 <_CORE_mutex_Surrender+0x46>
holder->real_priority != holder->current_priority ) {
473aa: 2028 0018 movel %a0@(24),%d0
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
473ae: b0a8 0014 cmpl %a0@(20),%d0
473b2: 67a2 beqs 47356 <_CORE_mutex_Surrender+0x46>
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
473b4: 4878 0001 pea 1 <ADD>
473b8: 2f00 movel %d0,%sp@-
473ba: 2f08 movel %a0,%sp@-
473bc: 4eb9 0004 82fc jsr 482fc <_Thread_Change_priority>
473c2: 4fef 000c lea %sp@(12),%sp
473c6: 608e bras 47356 <_CORE_mutex_Surrender+0x46>
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
if (the_mutex->Attributes.priority_ceiling <
473c8: 202a 004a movel %a2@(74),%d0
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
473cc: 52a8 001c addql #1,%a0@(28)
if (the_mutex->Attributes.priority_ceiling <
473d0: b0a8 0014 cmpl %a0@(20),%d0
473d4: 64be bccs 47394 <_CORE_mutex_Surrender+0x84> <== NEVER TAKEN
the_thread->current_priority){
_Thread_Change_priority(
473d6: 42a7 clrl %sp@-
473d8: 2f00 movel %d0,%sp@-
473da: 2f08 movel %a0,%sp@-
473dc: 4eb9 0004 82fc jsr 482fc <_Thread_Change_priority>
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
473e2: 246e fffc moveal %fp@(-4),%a2
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
if (the_mutex->Attributes.priority_ceiling <
the_thread->current_priority){
_Thread_Change_priority(
473e6: 4fef 000c lea %sp@(12),%sp
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
473ea: 4280 clrl %d0
}
473ec: 4e5e unlk %fp
473ee: 4e75 rts
473f0: 246e fffc moveal %fp@(-4),%a2
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
473f4: 4280 clrl %d0
case CORE_MUTEX_DISCIPLINES_FIFO:
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
473f6: 52a8 001c addql #1,%a0@(28)
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
473fa: 4e5e unlk %fp
473fc: 4e75 rts
}
break;
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
473fe: 7001 moveq #1,%d0
47400: 2540 004e movel %d0,%a2@(78)
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
47404: 246e fffc moveal %fp@(-4),%a2
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
47408: 4200 clrb %d0
}
4740a: 4e5e unlk %fp
...
00047464 <_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
)
{
47464: 4e56 0000 linkw %fp,#0
47468: 2f0a movel %a2,%sp@-
4746a: 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)) ) {
4746e: 2f0a movel %a2,%sp@-
47470: 4eb9 0004 8b8c jsr 48b8c <_Thread_queue_Dequeue>
47476: 588f addql #4,%sp
47478: 4a80 tstl %d0
4747a: 670a beqs 47486 <_CORE_semaphore_Surrender+0x22>
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
4747c: 246e fffc moveal %fp@(-4),%a2
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
47480: 4280 clrl %d0
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
47482: 4e5e unlk %fp
47484: 4e75 rts
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
47486: 303c 0700 movew #1792,%d0
4748a: 40c1 movew %sr,%d1
4748c: 8081 orl %d1,%d0
4748e: 46c0 movew %d0,%sr
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
47490: 202a 0048 movel %a2@(72),%d0
47494: b0aa 0040 cmpl %a2@(64),%d0
47498: 6412 bccs 474ac <_CORE_semaphore_Surrender+0x48> <== NEVER TAKEN
the_semaphore->count += 1;
4749a: 5280 addql #1,%d0
4749c: 2540 0048 movel %d0,%a2@(72)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
474a0: 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 );
474a2: 46c1 movew %d1,%sr
}
return status;
}
474a4: 246e fffc moveal %fp@(-4),%a2
474a8: 4e5e unlk %fp
474aa: 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;
474ac: 7004 moveq #4,%d0 <== NOT EXECUTED
_ISR_Enable( level );
474ae: 46c1 movew %d1,%sr <== NOT EXECUTED
474b0: 60f2 bras 474a4 <_CORE_semaphore_Surrender+0x40> <== NOT EXECUTED
...
0004ba64 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
4ba64: 4e56 fff0 linkw %fp,#-16
4ba68: 48d7 041c moveml %d2-%d4/%a2,%sp@
4ba6c: 246e 0008 moveal %fp@(8),%a2
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head(
Chain_Control *the_chain
)
{
return (Chain_Node *) the_chain;
4ba70: 224a moveal %a2,%a1
4ba72: 282e 000c movel %fp@(12),%d4
4ba76: 262e 0010 movel %fp@(16),%d3
4ba7a: 242e 0014 movel %fp@(20),%d2
Chain_Node *current;
Chain_Node *next;
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
4ba7e: 42aa 0004 clrl %a2@(4)
next = starting_address;
while ( count-- ) {
4ba82: 4a83 tstl %d3
4ba84: 6732 beqs 4bab8 <_Chain_Initialize+0x54> <== NEVER TAKEN
Chain_Node *next;
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
next = starting_address;
4ba86: 2044 moveal %d4,%a0
4ba88: 2003 movel %d3,%d0
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
4ba8a: 2208 movel %a0,%d1
4ba8c: d282 addl %d2,%d1
4ba8e: 5380 subql #1,%d0
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
next = starting_address;
while ( count-- ) {
current->next = next;
4ba90: 2288 movel %a0,%a1@
next->previous = current;
4ba92: 2149 0004 movel %a1,%a0@(4)
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
next = starting_address;
while ( count-- ) {
4ba96: 4a80 tstl %d0
4ba98: 6714 beqs 4baae <_Chain_Initialize+0x4a>
4ba9a: 2248 moveal %a0,%a1
current->next = next;
next->previous = current;
current = next;
next = (Chain_Node *)
4ba9c: 2041 moveal %d1,%a0
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
4ba9e: 2208 movel %a0,%d1
4baa0: d282 addl %d2,%d1
4baa2: 5380 subql #1,%d0
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
next = starting_address;
while ( count-- ) {
current->next = next;
4baa4: 2288 movel %a0,%a1@
next->previous = current;
4baa6: 2149 0004 movel %a1,%a0@(4)
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
next = starting_address;
while ( count-- ) {
4baaa: 4a80 tstl %d0
4baac: 66ec bnes 4ba9a <_Chain_Initialize+0x36>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
4baae: 5383 subql #1,%d3
4bab0: 4c02 3800 mulsl %d2,%d3
count = number_nodes;
current = _Chain_Head( the_chain );
the_chain->permanent_null = NULL;
next = starting_address;
while ( count-- ) {
4bab4: 2244 moveal %d4,%a1
4bab6: d3c3 addal %d3,%a1
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4bab8: 200a movel %a2,%d0
4baba: 5880 addql #4,%d0
4babc: 2280 movel %d0,%a1@
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = _Chain_Tail( the_chain );
the_chain->last = current;
4babe: 2549 0008 movel %a1,%a2@(8)
}
4bac2: 4cd7 041c moveml %sp@,%d2-%d4/%a2
4bac6: 4e5e unlk %fp
...
00045ff4 <_Event_Seize>:
executing = _Thread_Executing;
executing->Wait.return_code = RTEMS_SUCCESSFUL;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
_ISR_Disable( level );
45ff4: 203c 0000 0700 movel #1792,%d0
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
45ffa: 4e56 ffec linkw %fp,#-20
45ffe: 222e 0008 movel %fp@(8),%d1
46002: 48d7 043c moveml %d2-%d5/%a2,%sp@
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
46006: 2479 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a2
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
4600c: 242e 000c movel %fp@(12),%d2
46010: 2a2e 0010 movel %fp@(16),%d5
46014: 226e 0014 moveal %fp@(20),%a1
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
executing->Wait.return_code = RTEMS_SUCCESSFUL;
46018: 42aa 0034 clrl %a2@(52)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
4601c: 206a 0108 moveal %a2@(264),%a0
_ISR_Disable( level );
46020: 40c4 movew %sr,%d4
46022: 8084 orl %d4,%d0
46024: 46c0 movew %d0,%sr
pending_events = api->pending_events;
46026: 2610 movel %a0@,%d3
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
rtems_event_set the_event_set,
rtems_event_set the_event_condition
)
{
return ( the_event_set & the_event_condition );
46028: 2001 movel %d1,%d0
4602a: c083 andl %d3,%d0
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
4602c: 670c beqs 4603a <_Event_Seize+0x46>
4602e: b081 cmpl %d1,%d0
46030: 6700 0084 beqw 460b6 <_Event_Seize+0xc2>
(seized_events == event_in || _Options_Is_any( option_set )) ) {
46034: 0802 0001 btst #1,%d2
46038: 667c bnes 460b6 <_Event_Seize+0xc2> <== ALWAYS TAKEN
_ISR_Enable( level );
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
4603a: 0802 0000 btst #0,%d2
4603e: 6662 bnes 460a2 <_Event_Seize+0xae>
* set properly when we are marked as in the event critical section.
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
46040: 2542 0030 movel %d2,%a2@(48)
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
46044: 7401 moveq #1,%d2
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
46046: 2541 0024 movel %d1,%a2@(36)
executing->Wait.return_argument = event_out;
4604a: 2549 0028 movel %a1,%a2@(40)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
4604e: 23c2 0005 e5ee movel %d2,5e5ee <_Event_Sync_state>
_ISR_Enable( level );
46054: 46c4 movew %d4,%sr
if ( ticks ) {
46056: 4a85 tstl %d5
46058: 6672 bnes 460cc <_Event_Seize+0xd8>
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
4605a: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
4605e: 2f0a movel %a2,%sp@-
46060: 4eb9 0004 916c jsr 4916c <_Thread_Set_state>
_ISR_Disable( level );
46066: 203c 0000 0700 movel #1792,%d0
4606c: 40c1 movew %sr,%d1
4606e: 8081 orl %d1,%d0
46070: 46c0 movew %d0,%sr
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
46072: 7401 moveq #1,%d2
46074: 508f addql #8,%sp
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
_ISR_Disable( level );
sync_state = _Event_Sync_state;
46076: 2039 0005 e5ee movel 5e5ee <_Event_Sync_state>,%d0
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
4607c: 42b9 0005 e5ee clrl 5e5ee <_Event_Sync_state>
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
46082: b480 cmpl %d0,%d2
46084: 6700 00a4 beqw 4612a <_Event_Seize+0x136>
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
46088: 2d4a 000c movel %a2,%fp@(12)
4608c: 2d41 0010 movel %d1,%fp@(16)
}
46090: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
46096: 2d40 0008 movel %d0,%fp@(8)
}
4609a: 4e5e unlk %fp
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
4609c: 4ef9 0004 8294 jmp 48294 <_Thread_blocking_operation_Cancel>
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
460a2: 46c4 movew %d4,%sr
executing->Wait.return_code = RTEMS_UNSATISFIED;
460a4: 720d moveq #13,%d1
460a6: 2541 0034 movel %d1,%a2@(52)
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
460aa: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
executing->Wait.return_code = RTEMS_UNSATISFIED;
*event_out = seized_events;
460b0: 2280 movel %d0,%a1@
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
460b2: 4e5e unlk %fp
460b4: 4e75 rts
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) );
460b6: 2200 movel %d0,%d1
460b8: 4681 notl %d1
460ba: c283 andl %d3,%d1
460bc: 2081 movel %d1,%a0@
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
api->pending_events =
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
460be: 46c4 movew %d4,%sr
*event_out = seized_events;
460c0: 2280 movel %d0,%a1@
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
460c2: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
460c8: 4e5e unlk %fp
460ca: 4e75 rts
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
if ( ticks ) {
_Watchdog_Initialize(
460cc: 202a 0008 movel %a2@(8),%d0
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
460d0: 223c 0004 62bc movel #287420,%d1
the_watchdog->id = id;
460d6: 2540 0068 movel %d0,%a2@(104)
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
460da: 2541 0064 movel %d1,%a2@(100)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
460de: 42aa 0050 clrl %a2@(80)
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
460e2: 42aa 006c clrl %a2@(108)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
460e6: 2545 0054 movel %d5,%a2@(84)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
460ea: 486a 0048 pea %a2@(72)
460ee: 4879 0005 e4de pea 5e4de <_Watchdog_Ticks_chain>
460f4: 4eb9 0004 9978 jsr 49978 <_Watchdog_Insert>
460fa: 508f addql #8,%sp
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
460fc: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
46100: 2f0a movel %a2,%sp@-
46102: 4eb9 0004 916c jsr 4916c <_Thread_Set_state>
_ISR_Disable( level );
46108: 203c 0000 0700 movel #1792,%d0
4610e: 40c1 movew %sr,%d1
46110: 8081 orl %d1,%d0
46112: 46c0 movew %d0,%sr
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
46114: 7401 moveq #1,%d2
46116: 508f addql #8,%sp
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
_ISR_Disable( level );
sync_state = _Event_Sync_state;
46118: 2039 0005 e5ee movel 5e5ee <_Event_Sync_state>,%d0
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
4611e: 42b9 0005 e5ee clrl 5e5ee <_Event_Sync_state>
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
46124: b480 cmpl %d0,%d2
46126: 6600 ff60 bnew 46088 <_Event_Seize+0x94>
_ISR_Enable( level );
4612a: 46c1 movew %d1,%sr
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
4612c: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
46132: 4e5e unlk %fp
...
00046194 <_Event_Surrender>:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
46194: 203c 0000 0700 movel #1792,%d0
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
4619a: 4e56 ffec linkw %fp,#-20
4619e: 48d7 043c moveml %d2-%d5/%a2,%sp@
461a2: 246e 0008 moveal %fp@(8),%a2
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
461a6: 206a 0108 moveal %a2@(264),%a0
option_set = (rtems_option) the_thread->Wait.option;
461aa: 282a 0030 movel %a2@(48),%d4
_ISR_Disable( level );
461ae: 40c3 movew %sr,%d3
461b0: 8083 orl %d3,%d0
461b2: 46c0 movew %d0,%sr
pending_events = api->pending_events;
event_condition = (rtems_event_set) the_thread->Wait.count;
461b4: 222a 0024 movel %a2@(36),%d1
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 );
461b8: 2001 movel %d1,%d0
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
pending_events = api->pending_events;
461ba: 2410 movel %a0@,%d2
461bc: c082 andl %d2,%d0
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
461be: 6776 beqs 46236 <_Event_Surrender+0xa2>
/*
* 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() &&
461c0: 4ab9 0005 e5dc tstl 5e5dc <_Per_CPU_Information+0x8>
461c6: 670a beqs 461d2 <_Event_Surrender+0x3e>
461c8: b5f9 0005 e5e0 cmpal 5e5e0 <_Per_CPU_Information+0xc>,%a2
461ce: 6700 00a0 beqw 46270 <_Event_Surrender+0xdc>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
461d2: 2a2a 0010 movel %a2@(16),%d5
461d6: 0285 0000 0100 andil #256,%d5
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
461dc: 674c beqs 4622a <_Event_Surrender+0x96>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
461de: b081 cmpl %d1,%d0
461e0: 6706 beqs 461e8 <_Event_Surrender+0x54>
461e2: 0804 0001 btst #1,%d4
461e6: 6742 beqs 4622a <_Event_Surrender+0x96> <== 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) );
461e8: 2200 movel %d0,%d1
461ea: 4681 notl %d1
461ec: c282 andl %d2,%d1
461ee: 2081 movel %d1,%a0@
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
461f0: 206a 0028 moveal %a2@(40),%a0
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
461f4: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
461f8: 2080 movel %d0,%a0@
_ISR_Flash( level );
461fa: 203c 0000 0700 movel #1792,%d0
46200: 46c3 movew %d3,%sr
46202: 8083 orl %d3,%d0
46204: 46c0 movew %d0,%sr
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
46206: 7a02 moveq #2,%d5
46208: baaa 0050 cmpl %a2@(80),%d5
4620c: 6734 beqs 46242 <_Event_Surrender+0xae>
_ISR_Enable( level );
4620e: 46c3 movew %d3,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
46210: 2f3c 1003 fff8 movel #268697592,%sp@-
46216: 2f0a movel %a2,%sp@-
46218: 4eb9 0004 8448 jsr 48448 <_Thread_Clear_state>
4621e: 508f addql #8,%sp
}
return;
}
}
_ISR_Enable( level );
}
46220: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
46226: 4e5e unlk %fp
46228: 4e75 rts
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
4622a: 46c3 movew %d3,%sr
}
4622c: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
46232: 4e5e unlk %fp
46234: 4e75 rts
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
_ISR_Enable( level );
46236: 46c3 movew %d3,%sr
}
return;
}
}
_ISR_Enable( level );
}
46238: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
4623e: 4e5e unlk %fp
46240: 4e75 rts
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
46242: 7003 moveq #3,%d0
46244: 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 );
46248: 46c3 movew %d3,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4624a: 486a 0048 pea %a2@(72)
4624e: 4eb9 0004 9ac0 jsr 49ac0 <_Watchdog_Remove>
46254: 2f3c 1003 fff8 movel #268697592,%sp@-
4625a: 2f0a movel %a2,%sp@-
4625c: 4eb9 0004 8448 jsr 48448 <_Thread_Clear_state>
46262: 4fef 000c lea %sp@(12),%sp
}
return;
}
}
_ISR_Enable( level );
}
46266: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
4626c: 4e5e unlk %fp
4626e: 4e75 rts
* 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 ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
46270: 2279 0005 e5ee moveal 5e5ee <_Event_Sync_state>,%a1
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
46276: 7a02 moveq #2,%d5
46278: ba89 cmpl %a1,%d5
4627a: 6710 beqs 4628c <_Event_Surrender+0xf8> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
4627c: 2279 0005 e5ee moveal 5e5ee <_Event_Sync_state>,%a1
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
46282: 1a3c 0001 moveb #1,%d5
46286: ba89 cmpl %a1,%d5
46288: 6600 ff48 bnew 461d2 <_Event_Surrender+0x3e>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
4628c: b081 cmpl %d1,%d0
4628e: 6706 beqs 46296 <_Event_Surrender+0x102>
46290: 0804 0001 btst #1,%d4
46294: 671a beqs 462b0 <_Event_Surrender+0x11c> <== NEVER TAKEN
46296: 2200 movel %d0,%d1
46298: 4681 notl %d1
4629a: c282 andl %d2,%d1
4629c: 2081 movel %d1,%a0@
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
4629e: 206a 0028 moveal %a2@(40),%a0
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
462a2: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
462a6: 2080 movel %d0,%a0@
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
462a8: 7003 moveq #3,%d0
462aa: 23c0 0005 e5ee movel %d0,5e5ee <_Event_Sync_state>
}
_ISR_Enable( level );
462b0: 46c3 movew %d3,%sr
}
return;
}
}
_ISR_Enable( level );
}
462b2: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
462b8: 4e5e unlk %fp <== NOT EXECUTED
000462bc <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
462bc: 4e56 fffc linkw %fp,#-4
462c0: 2f03 movel %d3,%sp@-
462c2: 2f02 movel %d2,%sp@-
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
462c4: 486e fffc pea %fp@(-4)
462c8: 2f2e 0008 movel %fp@(8),%sp@-
462cc: 4eb9 0004 8854 jsr 48854 <_Thread_Get>
switch ( location ) {
462d2: 508f addql #8,%sp
462d4: 4aae fffc tstl %fp@(-4)
462d8: 6642 bnes 4631c <_Event_Timeout+0x60> <== 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 );
462da: 223c 0000 0700 movel #1792,%d1
462e0: 40c2 movew %sr,%d2
462e2: 8282 orl %d2,%d1
462e4: 46c1 movew %d1,%sr
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
462e6: 2040 moveal %d0,%a0
462e8: 42a8 0024 clrl %a0@(36)
if ( _Thread_Is_executing( the_thread ) ) {
462ec: b0b9 0005 e5e0 cmpl 5e5e0 <_Per_CPU_Information+0xc>,%d0
462f2: 6734 beqs 46328 <_Event_Timeout+0x6c>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
462f4: 7606 moveq #6,%d3
462f6: 2040 moveal %d0,%a0
462f8: 2143 0034 movel %d3,%a0@(52)
_ISR_Enable( level );
462fc: 46c2 movew %d2,%sr
462fe: 2f3c 1003 fff8 movel #268697592,%sp@-
46304: 2f00 movel %d0,%sp@-
46306: 4eb9 0004 8448 jsr 48448 <_Thread_Clear_state>
_Thread_Unblock( the_thread );
_Thread_Unnest_dispatch();
break;
4630c: 508f addql #8,%sp
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
4630e: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
46314: 5380 subql #1,%d0
46316: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
4631c: 242e fff4 movel %fp@(-12),%d2
46320: 262e fff8 movel %fp@(-8),%d3
46324: 4e5e unlk %fp
46326: 4e75 rts
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
46328: 2239 0005 e5ee movel 5e5ee <_Event_Sync_state>,%d1
4632e: 7601 moveq #1,%d3
46330: b681 cmpl %d1,%d3
46332: 66c0 bnes 462f4 <_Event_Timeout+0x38>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
46334: 7606 moveq #6,%d3
46336: 2040 moveal %d0,%a0
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
46338: 7202 moveq #2,%d1
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
4633a: 2143 0034 movel %d3,%a0@(52)
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
4633e: 23c1 0005 e5ee movel %d1,5e5ee <_Event_Sync_state>
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
_ISR_Enable( level );
46344: 46c2 movew %d2,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
46346: 2f3c 1003 fff8 movel #268697592,%sp@-
4634c: 2f00 movel %d0,%sp@-
4634e: 4eb9 0004 8448 jsr 48448 <_Thread_Clear_state>
_Thread_Unblock( the_thread );
_Thread_Unnest_dispatch();
break;
46354: 508f addql #8,%sp
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
46356: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
4635c: 5380 subql #1,%d0
4635e: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
46364: 60b6 bras 4631c <_Event_Timeout+0x60>
...
0004bcac <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
4bcac: 4e56 ffcc linkw %fp,#-52
4bcb0: 226e 000c moveal %fp@(12),%a1
4bcb4: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4bcb8: 246e 0008 moveal %fp@(8),%a2
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
Heap_Block *block = _Heap_Free_list_first( heap );
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
4bcbc: 2e09 movel %a1,%d7
4bcbe: 5887 addql #4,%d7
- HEAP_BLOCK_SIZE_OFFSET;
uintptr_t const page_size = heap->page_size;
4bcc0: 202a 0010 movel %a2@(16),%d0
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
4bcc4: 222e 0010 movel %fp@(16),%d1
4bcc8: 282e 0014 movel %fp@(20),%d4
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
4bccc: 206a 0008 moveal %a2@(8),%a0
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
Heap_Block *block = _Heap_Free_list_first( heap );
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_BLOCK_SIZE_OFFSET;
uintptr_t const page_size = heap->page_size;
4bcd0: 2d40 fffc movel %d0,%fp@(-4)
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
if ( block_size_floor < alloc_size ) {
4bcd4: be89 cmpl %a1,%d7
4bcd6: 6500 0144 bcsw 4be1c <_Heap_Allocate_aligned_with_boundary+0x170>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
4bcda: 4a84 tstl %d4
4bcdc: 6600 013a bnew 4be18 <_Heap_Allocate_aligned_with_boundary+0x16c>
if ( alignment == 0 ) {
alignment = page_size;
}
}
while ( block != free_list_tail ) {
4bce0: b1ca cmpal %a2,%a0
4bce2: 6700 0138 beqw 4be1c <_Heap_Allocate_aligned_with_boundary+0x170>
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
4bce6: 242e fffc movel %fp@(-4),%d2
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET;
4bcea: 7c04 moveq #4,%d6
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
4bcec: 5e82 addql #7,%d2
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET;
4bcee: 9c89 subl %a1,%d6
if ( alignment == 0 ) {
alignment = page_size;
}
}
while ( block != free_list_tail ) {
4bcf0: 4283 clrl %d3
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET;
4bcf2: 2647 moveal %d7,%a3
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
4bcf4: 2d42 fff8 movel %d2,%fp@(-8)
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET;
4bcf8: 2d46 fff4 movel %d6,%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 ) {
4bcfc: 2028 0004 movel %a0@(4),%d0
while ( block != free_list_tail ) {
_HAssert( _Heap_Is_prev_used( block ) );
/* Statistics */
++search_count;
4bd00: 5283 addql #1,%d3
/*
* 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 ) {
4bd02: b08b cmpl %a3,%d0
4bd04: 630e blss 4bd14 <_Heap_Allocate_aligned_with_boundary+0x68>
if ( alignment == 0 ) {
4bd06: 4a81 tstl %d1
4bd08: 6628 bnes 4bd32 <_Heap_Allocate_aligned_with_boundary+0x86>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
4bd0a: 2408 movel %a0,%d2
4bd0c: 5082 addql #8,%d2
boundary
);
}
}
if ( alloc_begin != 0 ) {
4bd0e: 4a82 tstl %d2
4bd10: 6600 00ea bnew 4bdfc <_Heap_Allocate_aligned_with_boundary+0x150>
break;
}
block = block->next;
4bd14: 2068 0008 moveal %a0@(8),%a0
if ( alignment == 0 ) {
alignment = page_size;
}
}
while ( block != free_list_tail ) {
4bd18: b1ca cmpal %a2,%a0
4bd1a: 66e0 bnes 4bcfc <_Heap_Allocate_aligned_with_boundary+0x50>
4bd1c: 4280 clrl %d0
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
4bd1e: b6aa 0044 cmpl %a2@(68),%d3
4bd22: 6304 blss 4bd28 <_Heap_Allocate_aligned_with_boundary+0x7c>
stats->max_search = search_count;
4bd24: 2543 0044 movel %d3,%a2@(68)
}
return (void *) alloc_begin;
}
4bd28: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
4bd2e: 4e5e unlk %fp
4bd30: 4e75 rts
- 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;
4bd32: 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;
4bd34: 4be8 0008 lea %a0@(8),%a5
- 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;
4bd38: c087 andl %d7,%d0
4bd3a: 286a 0014 moveal %a2@(20),%a4
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;
4bd3e: 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;
4bd40: 2a2e fff8 movel %fp@(-8),%d5
4bd44: 9a8c subl %a4,%d5
uintptr_t alloc_end = block_end + HEAP_BLOCK_SIZE_OFFSET;
uintptr_t alloc_begin = alloc_end - alloc_size;
4bd46: 242e fff4 movel %fp@(-12),%d2
4bd4a: d480 addl %d0,%d2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4bd4c: 2c02 movel %d2,%d6
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
4bd4e: d085 addl %d5,%d0
4bd50: 4c41 6005 remul %d1,%d5,%d6
4bd54: 9485 subl %d5,%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 ) {
4bd56: b480 cmpl %d0,%d2
4bd58: 630a blss 4bd64 <_Heap_Allocate_aligned_with_boundary+0xb8>
4bd5a: 2a00 movel %d0,%d5
4bd5c: 4c41 5002 remul %d1,%d2,%d5
4bd60: 9082 subl %d2,%d0
4bd62: 2400 movel %d0,%d2
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
4bd64: 4a84 tstl %d4
4bd66: 676a beqs 4bdd2 <_Heap_Allocate_aligned_with_boundary+0x126>
/* 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;
4bd68: 2002 movel %d2,%d0
4bd6a: d089 addl %a1,%d0
4bd6c: 2c00 movel %d0,%d6
4bd6e: 4c44 6005 remul %d4,%d5,%d6
4bd72: 2c00 movel %d0,%d6
4bd74: 9c85 subl %d5,%d6
4bd76: 2a06 movel %d6,%d5
/* 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 ) {
4bd78: bc82 cmpl %d2,%d6
4bd7a: 6356 blss 4bdd2 <_Heap_Allocate_aligned_with_boundary+0x126>
4bd7c: bc80 cmpl %d0,%d6
4bd7e: 6452 bccs 4bdd2 <_Heap_Allocate_aligned_with_boundary+0x126>
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
4bd80: 2c0d movel %a5,%d6
4bd82: dc89 addl %a1,%d6
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
4bd84: ba86 cmpl %d6,%d5
4bd86: 658c bcss 4bd14 <_Heap_Allocate_aligned_with_boundary+0x68>
return 0;
}
alloc_begin = boundary_line - alloc_size;
4bd88: 2405 movel %d5,%d2
4bd8a: 9489 subl %a1,%d2
4bd8c: 2a02 movel %d2,%d5
4bd8e: 4c41 5000 remul %d1,%d0,%d5
4bd92: 9480 subl %d0,%d2
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
4bd94: 2002 movel %d2,%d0
4bd96: d089 addl %a1,%d0
4bd98: 2e00 movel %d0,%d7
4bd9a: 4c44 7005 remul %d4,%d5,%d7
4bd9e: 2e00 movel %d0,%d7
4bda0: 9e85 subl %d5,%d7
4bda2: 2a07 movel %d7,%d5
/* 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 ) {
4bda4: be82 cmpl %d2,%d7
4bda6: 632a blss 4bdd2 <_Heap_Allocate_aligned_with_boundary+0x126>
4bda8: be80 cmpl %d0,%d7
4bdaa: 6426 bccs 4bdd2 <_Heap_Allocate_aligned_with_boundary+0x126>
if ( boundary_line < boundary_floor ) {
4bdac: ba86 cmpl %d6,%d5
4bdae: 6500 ff64 bcsw 4bd14 <_Heap_Allocate_aligned_with_boundary+0x68>
return 0;
}
alloc_begin = boundary_line - alloc_size;
4bdb2: 2405 movel %d5,%d2
4bdb4: 9489 subl %a1,%d2
4bdb6: 2a02 movel %d2,%d5
4bdb8: 4c41 5000 remul %d1,%d0,%d5
4bdbc: 9480 subl %d0,%d2
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
4bdbe: 2002 movel %d2,%d0
4bdc0: d089 addl %a1,%d0
4bdc2: 2e00 movel %d0,%d7
4bdc4: 4c44 7005 remul %d4,%d5,%d7
4bdc8: 2e00 movel %d0,%d7
4bdca: 9e85 subl %d5,%d7
4bdcc: 2a07 movel %d7,%d5
/* 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 ) {
4bdce: be82 cmpl %d2,%d7
4bdd0: 62d6 bhis 4bda8 <_Heap_Allocate_aligned_with_boundary+0xfc><== ALWAYS TAKEN
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 ) {
4bdd2: b48d cmpl %a5,%d2
4bdd4: 6500 ff3e bcsw 4bd14 <_Heap_Allocate_aligned_with_boundary+0x68>
4bdd8: 2e2e fffc movel %fp@(-4),%d7
4bddc: 2c02 movel %d2,%d6
4bdde: 70f8 moveq #-8,%d0
4bde0: 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);
4bde2: d082 addl %d2,%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4bde4: 4c47 6005 remul %d7,%d5,%d6
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;
4bde8: 9085 subl %d5,%d0
if ( free_size >= min_block_size || free_size == 0 ) {
4bdea: b08c cmpl %a4,%d0
4bdec: 6400 ff20 bccw 4bd0e <_Heap_Allocate_aligned_with_boundary+0x62>
4bdf0: 4a80 tstl %d0
4bdf2: 6600 ff20 bnew 4bd14 <_Heap_Allocate_aligned_with_boundary+0x68>
boundary
);
}
}
if ( alloc_begin != 0 ) {
4bdf6: 4a82 tstl %d2
4bdf8: 6700 ff1a beqw 4bd14 <_Heap_Allocate_aligned_with_boundary+0x68>
if ( alloc_begin != 0 ) {
/* Statistics */
stats->searches += search_count;
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
4bdfc: 2f09 movel %a1,%sp@-
block = block->next;
}
if ( alloc_begin != 0 ) {
/* Statistics */
stats->searches += search_count;
4bdfe: d7aa 004c addl %d3,%a2@(76)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
4be02: 2f02 movel %d2,%sp@-
4be04: 2f08 movel %a0,%sp@-
4be06: 2f0a movel %a2,%sp@-
4be08: 4eb9 0004 78ac jsr 478ac <_Heap_Block_allocate>
4be0e: 4fef 0010 lea %sp@(16),%sp
4be12: 2002 movel %d2,%d0
4be14: 6000 ff08 braw 4bd1e <_Heap_Allocate_aligned_with_boundary+0x72>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
4be18: b889 cmpl %a1,%d4
4be1a: 640c bccs 4be28 <_Heap_Allocate_aligned_with_boundary+0x17c>
if ( alignment == 0 ) {
alignment = page_size;
}
}
while ( block != free_list_tail ) {
4be1c: 4280 clrl %d0
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
4be1e: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
4be24: 4e5e unlk %fp
4be26: 4e75 rts
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
return NULL;
}
if ( alignment == 0 ) {
4be28: 4a81 tstl %d1
4be2a: 6600 feb4 bnew 4bce0 <_Heap_Allocate_aligned_with_boundary+0x34>
alignment = page_size;
4be2e: 2200 movel %d0,%d1
4be30: 6000 feae braw 4bce0 <_Heap_Allocate_aligned_with_boundary+0x34>
000478ac <_Heap_Block_allocate>:
- 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;
478ac: 70fe moveq #-2,%d0
Heap_Control *heap,
Heap_Block *block,
uintptr_t alloc_begin,
uintptr_t alloc_size
)
{
478ae: 4e56 ffe0 linkw %fp,#-32
478b2: 206e 000c moveal %fp@(12),%a0
478b6: 48d7 3c3c moveml %d2-%d5/%a2-%a5,%sp@
if ( stats->min_free_size > stats->free_size ) {
stats->min_free_size = stats->free_size;
}
return block;
}
478ba: 2428 0004 movel %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;
478be: 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;
478c0: c082 andl %d2,%d0
Heap_Control *heap,
Heap_Block *block,
uintptr_t alloc_begin,
uintptr_t alloc_size
)
{
478c2: 222e 0010 movel %fp@(16),%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
478c6: 49f0 0800 lea %a0@(00000000,%d0:l),%a4
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
478ca: 2641 moveal %d1,%a3
478cc: 518b subql #8,%a3
Heap_Statistics *const stats = &heap->stats;
uintptr_t const alloc_area_begin = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_area_offset = alloc_begin - alloc_area_begin;
478ce: 2a0b movel %a3,%d5
478d0: 9a88 subl %a0,%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;
478d2: c8ac 0004 andl %a4@(4),%d4
Heap_Control *heap,
Heap_Block *block,
uintptr_t alloc_begin,
uintptr_t alloc_size
)
{
478d6: 246e 0008 moveal %fp@(8),%a2
478da: 262e 0014 movel %fp@(20),%d3
Heap_Block *free_list_anchor = NULL;
_HAssert( alloc_area_begin <= alloc_begin );
if ( _Heap_Is_free( block ) ) {
478de: 4a84 tstl %d4
478e0: 6600 0092 bnew 47974 <_Heap_Block_allocate+0xc8>
if ( stats->min_free_size > stats->free_size ) {
stats->min_free_size = stats->free_size;
}
return block;
}
478e4: 2828 0008 movel %a0@(8),%d4
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
next->prev = prev;
478e8: 2a44 moveal %d4,%a5
Heap_Block *free_list_anchor = NULL;
_HAssert( alloc_area_begin <= alloc_begin );
if ( _Heap_Is_free( block ) ) {
free_list_anchor = block->prev;
478ea: 2268 000c moveal %a0@(12),%a1
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
478ee: 2344 0008 movel %d4,%a1@(8)
next->prev = prev;
478f2: 2b49 000c movel %a1,%a5@(12)
_Heap_Free_list_remove( block );
/* Statistics */
--stats->free_blocks;
++stats->used_blocks;
stats->free_size -= _Heap_Block_size( block );
478f6: 91aa 0030 subl %d0,%a2@(48)
free_list_anchor = block->prev;
_Heap_Free_list_remove( block );
/* Statistics */
--stats->free_blocks;
478fa: 53aa 0038 subql #1,%a2@(56)
++stats->used_blocks;
478fe: 52aa 0040 addql #1,%a2@(64)
stats->free_size -= _Heap_Block_size( block );
} else {
free_list_anchor = _Heap_Free_list_head( heap );
}
if ( alloc_area_offset < heap->page_size ) {
47902: 202a 0010 movel %a2@(16),%d0
47906: b085 cmpl %d5,%d0
47908: 6274 bhis 4797e <_Heap_Block_allocate+0xd2>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4790a: 4c40 1004 remul %d0,%d4,%d1
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4790e: 97c4 subal %d4,%a3
_Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
uintptr_t const new_block_begin = (uintptr_t) new_block;
uintptr_t const new_block_size = block_end - new_block_begin;
block_end = new_block_begin;
block_size = block_end - block_begin;
47910: 200b movel %a3,%d0
47912: 9088 subl %a0,%d0
_HAssert( block_size >= heap->min_block_size );
_HAssert( new_block_size >= heap->min_block_size );
/* Statistics */
stats->free_size += block_size;
47914: d1aa 0030 addl %d0,%a2@(48)
uintptr_t block_end = block_begin + block_size;
Heap_Block *const new_block =
_Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
uintptr_t const new_block_begin = (uintptr_t) new_block;
uintptr_t const new_block_size = block_end - new_block_begin;
47918: 99cb subal %a3,%a4
_HAssert( new_block_size >= heap->min_block_size );
/* Statistics */
stats->free_size += block_size;
if ( _Heap_Is_prev_used( block ) ) {
4791a: 0802 0000 btst #0,%d2
4791e: 6778 beqs 47998 <_Heap_Block_allocate+0xec>
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
47920: 2a69 0008 moveal %a1@(8),%a5
block = prev_block;
block_begin = (uintptr_t) block;
block_size += prev_block_size;
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
47924: 7401 moveq #1,%d2
_Heap_Free_list_insert_after( free_list_anchor, block );
free_list_anchor = block;
/* Statistics */
++stats->free_blocks;
47926: 2208 movel %a0,%d1
new_block->next = next;
47928: 214d 0008 movel %a5,%a0@(8)
block = prev_block;
block_begin = (uintptr_t) block;
block_size += prev_block_size;
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
4792c: 8480 orl %d0,%d2
new_block->prev = block_before;
4792e: 2149 000c movel %a1,%a0@(12)
block_before->next = new_block;
47932: 2348 0008 movel %a0,%a1@(8)
next->prev = new_block;
47936: 2b48 000c movel %a0,%a5@(12)
_Heap_Free_list_insert_after( free_list_anchor, block );
free_list_anchor = block;
/* Statistics */
++stats->free_blocks;
4793a: 52aa 0038 addql #1,%a2@(56)
block = prev_block;
block_begin = (uintptr_t) block;
block_size += prev_block_size;
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
4793e: 2142 0004 movel %d2,%a0@(4)
new_block->prev_size = block_size;
47942: 2680 movel %d0,%a3@
new_block->size_and_flag = new_block_size;
47944: 274c 0004 movel %a4,%a3@(4)
_Heap_Block_split( heap, new_block, free_list_anchor, alloc_size );
47948: 2f03 movel %d3,%sp@-
4794a: 2f01 movel %d1,%sp@-
4794c: 2f0b movel %a3,%sp@-
4794e: 2f0a movel %a2,%sp@-
47950: 4eb9 0004 77b8 jsr 477b8 <_Heap_Block_split>
47956: 4fef 0010 lea %sp@(16),%sp
alloc_size
);
}
/* Statistics */
if ( stats->min_free_size > stats->free_size ) {
4795a: 202a 0030 movel %a2@(48),%d0
4795e: b0aa 0034 cmpl %a2@(52),%d0
47962: 6404 bccs 47968 <_Heap_Block_allocate+0xbc>
stats->min_free_size = stats->free_size;
47964: 2540 0034 movel %d0,%a2@(52)
}
return block;
}
47968: 200b movel %a3,%d0
4796a: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5
47970: 4e5e unlk %fp
47972: 4e75 rts
stats->free_size -= _Heap_Block_size( block );
} else {
free_list_anchor = _Heap_Free_list_head( heap );
}
if ( alloc_area_offset < heap->page_size ) {
47974: 202a 0010 movel %a2@(16),%d0
/* Statistics */
--stats->free_blocks;
++stats->used_blocks;
stats->free_size -= _Heap_Block_size( block );
} else {
free_list_anchor = _Heap_Free_list_head( heap );
47978: 224a moveal %a2,%a1
}
if ( alloc_area_offset < heap->page_size ) {
4797a: b085 cmpl %d5,%d0
4797c: 638c blss 4790a <_Heap_Block_allocate+0x5e>
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
_Heap_Block_split( heap, block, free_list_anchor, alloc_size );
4797e: 2645 moveal %d5,%a3
47980: 4873 3800 pea %a3@(00000000,%d3:l)
47984: 2648 moveal %a0,%a3
47986: 2f09 movel %a1,%sp@-
47988: 2f08 movel %a0,%sp@-
4798a: 2f0a movel %a2,%sp@-
4798c: 4eb9 0004 77b8 jsr 477b8 <_Heap_Block_split>
47992: 4fef 0010 lea %sp@(16),%sp
47996: 60c2 bras 4795a <_Heap_Block_allocate+0xae>
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Prev_block(
const Heap_Block *block
)
{
return (Heap_Block *) ((uintptr_t) block - block->prev_size);
47998: 91d0 subal %a0@,%a0
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
4799a: 74fe moveq #-2,%d2
Heap_Block *const prev_block = _Heap_Prev_block( block );
uintptr_t const prev_block_size = _Heap_Block_size( prev_block );
block = prev_block;
block_begin = (uintptr_t) block;
block_size += prev_block_size;
4799c: 2209 movel %a1,%d1
4799e: c4a8 0004 andl %a0@(4),%d2
479a2: d082 addl %d2,%d0
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
479a4: 7401 moveq #1,%d2
479a6: 8480 orl %d0,%d2
new_block->prev_size = block_size;
479a8: 2680 movel %d0,%a3@
block = prev_block;
block_begin = (uintptr_t) block;
block_size += prev_block_size;
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
479aa: 2142 0004 movel %d2,%a0@(4)
new_block->prev_size = block_size;
new_block->size_and_flag = new_block_size;
479ae: 274c 0004 movel %a4,%a3@(4)
_Heap_Block_split( heap, new_block, free_list_anchor, alloc_size );
479b2: 2f03 movel %d3,%sp@-
479b4: 2f01 movel %d1,%sp@-
479b6: 2f0b movel %a3,%sp@-
479b8: 2f0a movel %a2,%sp@-
479ba: 4eb9 0004 77b8 jsr 477b8 <_Heap_Block_split>
479c0: 4fef 0010 lea %sp@(16),%sp
479c4: 6094 bras 4795a <_Heap_Block_allocate+0xae>
...
000477b8 <_Heap_Block_split>:
Heap_Control *heap,
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
477b8: 4e56 ffe4 linkw %fp,#-28
477bc: 226e 0008 moveal %fp@(8),%a1
477c0: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@
477c4: 246e 000c moveal %fp@(12),%a2
- 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;
477c8: 76fe moveq #-2,%d3
if ( stats->min_free_size > stats->free_size ) {
stats->min_free_size = stats->free_size;
}
return block;
}
477ca: 282a 0004 movel %a2@(4),%d4
)
{
Heap_Statistics *const stats = &heap->stats;
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
477ce: 2669 0014 moveal %a1@(20),%a3
uintptr_t const min_alloc_size = min_block_size - HEAP_BLOCK_HEADER_SIZE;
477d2: 220b movel %a3,%d1
477d4: 5181 subql #8,%d1
Heap_Control *heap,
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
477d6: 286e 0010 moveal %fp@(16),%a4
Heap_Statistics *const stats = &heap->stats;
uintptr_t const page_size = heap->page_size;
477da: 2429 0010 movel %a1@(16),%d2
return heap->stats.size;
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Max( uintptr_t a, uintptr_t b )
{
return a > b ? a : b;
477de: 202e 0014 movel %fp@(20),%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;
477e2: c684 andl %d4,%d3
return heap->stats.size;
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Max( uintptr_t a, uintptr_t b )
{
return a > b ? a : b;
477e4: b280 cmpl %d0,%d1
477e6: 6302 blss 477ea <_Heap_Block_split+0x32>
477e8: 2001 movel %d1,%d0
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const min_alloc_size = min_block_size - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const used_size =
477ea: 5080 addql #8,%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
477ec: 2a00 movel %d0,%d5
477ee: 4c42 5001 remul %d2,%d1,%d5
if ( remainder != 0 ) {
477f2: 4a81 tstl %d1
477f4: 6766 beqs 4785c <_Heap_Block_split+0xa4>
return value - remainder + alignment;
477f6: d480 addl %d0,%d2
477f8: 9481 subl %d1,%d2
_Heap_Max( alloc_size, min_alloc_size ) + HEAP_BLOCK_HEADER_SIZE;
uintptr_t const used_block_size = _Heap_Align_up( used_size, page_size );
uintptr_t const free_size = block_size + HEAP_BLOCK_SIZE_OFFSET - used_size;
477fa: 2203 movel %d3,%d1
477fc: 5881 addql #4,%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
477fe: 41f2 3800 lea %a2@(00000000,%d3:l),%a0
47802: 9280 subl %d0,%d1
uintptr_t const free_size_limit = min_block_size + HEAP_BLOCK_SIZE_OFFSET;
47804: 588b addql #4,%a3
Heap_Block *next_block = _Heap_Block_at( block, block_size );
_HAssert( used_size <= block_size + HEAP_BLOCK_SIZE_OFFSET );
_HAssert( used_size + free_size == block_size + HEAP_BLOCK_SIZE_OFFSET );
if ( free_size >= free_size_limit ) {
47806: b7c1 cmpal %d1,%a3
47808: 6264 bhis 4786e <_Heap_Block_split+0xb6>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4780a: 7001 moveq #1,%d0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4780c: 47f2 2800 lea %a2@(00000000,%d2:l),%a3
Heap_Block *const free_block = _Heap_Block_at( block, used_block_size );
uintptr_t free_block_size = block_size - used_block_size;
47810: 9682 subl %d2,%d3
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;
47812: 7201 moveq #1,%d1
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
47814: c880 andl %d0,%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;
47816: 70fe moveq #-2,%d0
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
block->size_and_flag = size | flag;
47818: 8484 orl %d4,%d2
4781a: 2542 0004 movel %d2,%a2@(4)
_HAssert( used_block_size + free_block_size == block_size );
_Heap_Block_set_size( block, used_block_size );
/* Statistics */
stats->free_size += free_block_size;
4781e: d7a9 0030 addl %d3,%a1@(48)
- 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;
47822: c0a8 0004 andl %a0@(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;
47826: c2b0 0804 andl %a0@(00000004,%d0:l),%d1
if ( _Heap_Is_used( next_block ) ) {
4782a: 6750 beqs 4787c <_Heap_Block_split+0xc4> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
4782c: 246c 0008 moveal %a4@(8),%a2
free_block_size += next_block_size;
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
47830: 7001 moveq #1,%d0
new_block->next = next;
new_block->prev = block_before;
47832: 274c 000c movel %a4,%a3@(12)
47836: 8083 orl %d3,%d0
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
47838: 274a 0008 movel %a2,%a3@(8)
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
4783c: 254b 000c movel %a3,%a2@(12)
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
47840: 294b 0008 movel %a3,%a4@(8)
if ( _Heap_Is_used( next_block ) ) {
_Heap_Free_list_insert_after( free_list_anchor, free_block );
/* Statistics */
++stats->free_blocks;
47844: 52a9 0038 addql #1,%a1@(56)
free_block_size += next_block_size;
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
47848: 2740 0004 movel %d0,%a3@(4)
next_block->prev_size = free_block_size;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4784c: 70fe moveq #-2,%d0
4784e: c1a8 0004 andl %d0,%a0@(4)
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
next_block->prev_size = free_block_size;
47852: 2083 movel %d3,%a0@
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
} else {
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
}
}
47854: 4cd7 1c3c moveml %sp@,%d2-%d5/%a2-%a4
47858: 4e5e unlk %fp
4785a: 4e75 rts
uintptr_t const used_size =
_Heap_Max( alloc_size, min_alloc_size ) + HEAP_BLOCK_HEADER_SIZE;
uintptr_t const used_block_size = _Heap_Align_up( used_size, page_size );
uintptr_t const free_size = block_size + HEAP_BLOCK_SIZE_OFFSET - used_size;
4785c: 2203 movel %d3,%d1
4785e: 5881 addql #4,%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
47860: 41f2 3800 lea %a2@(00000000,%d3:l),%a0
uintptr_t remainder = value % alignment;
if ( remainder != 0 ) {
return value - remainder + alignment;
} else {
return value;
47864: 2400 movel %d0,%d2
47866: 9280 subl %d0,%d1
uintptr_t const free_size_limit = min_block_size + HEAP_BLOCK_SIZE_OFFSET;
47868: 588b addql #4,%a3
Heap_Block *next_block = _Heap_Block_at( block, block_size );
_HAssert( used_size <= block_size + HEAP_BLOCK_SIZE_OFFSET );
_HAssert( used_size + free_size == block_size + HEAP_BLOCK_SIZE_OFFSET );
if ( free_size >= free_size_limit ) {
4786a: b7c1 cmpal %d1,%a3
4786c: 639c blss 4780a <_Heap_Block_split+0x52>
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
next_block->prev_size = free_block_size;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
} else {
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
4786e: 7001 moveq #1,%d0
}
}
47870: 4cd7 1c3c moveml %sp@,%d2-%d5/%a2-%a4
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
next_block->prev_size = free_block_size;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
} else {
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
47874: 81a8 0004 orl %d0,%a0@(4)
}
}
47878: 4e5e unlk %fp
4787a: 4e75 rts
} else {
uintptr_t const next_block_size = _Heap_Block_size( next_block );
_Heap_Free_list_replace( next_block, free_block );
free_block_size += next_block_size;
4787c: d680 addl %d0,%d3
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
4787e: 7001 moveq #1,%d0
if ( stats->min_free_size > stats->free_size ) {
stats->min_free_size = stats->free_size;
}
return block;
}
47880: 2268 0008 moveal %a0@(8),%a1
47884: 2468 000c moveal %a0@(12),%a2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
47888: 41f3 3800 lea %a3@(00000000,%d3:l),%a0
free_block_size += next_block_size;
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
4788c: 8083 orl %d3,%d0
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
4788e: 2749 0008 movel %a1,%a3@(8)
new_block->prev = prev;
47892: 274a 000c movel %a2,%a3@(12)
47896: 2740 0004 movel %d0,%a3@(4)
next_block->prev_size = free_block_size;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4789a: 70fe moveq #-2,%d0
next->prev = new_block;
prev->next = new_block;
4789c: 254b 0008 movel %a3,%a2@(8)
478a0: c1a8 0004 andl %d0,%a0@(4)
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
next->prev = new_block;
478a4: 234b 000c movel %a3,%a1@(12)
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
next_block->prev_size = free_block_size;
478a8: 2083 movel %d3,%a0@
478aa: 60a8 bras 47854 <_Heap_Block_split+0x9c>
0004c140 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
4c140: 4e56 ffcc linkw %fp,#-52
4c144: 202e 0010 movel %fp@(16),%d0
4c148: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4c14c: 246e 0008 moveal %fp@(8),%a2
4c150: 242e 000c movel %fp@(12),%d2
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
4c154: 2602 movel %d2,%d3
4c156: d680 addl %d0,%d3
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
4c158: 2a2a 0020 movel %a2@(32),%d5
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
4c15c: 282a 0010 movel %a2@(16),%d4
uintptr_t const min_block_size = heap->min_block_size;
4c160: 222a 0014 movel %a2@(20),%d1
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
uintptr_t const free_size = stats->free_size;
4c164: 2c2a 0030 movel %a2@(48),%d6
Heap_Block *start_block = first_block;
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
4c168: 42ae fffc clrl %fp@(-4)
Heap_Block *extend_last_block = NULL;
4c16c: 42ae fff8 clrl %fp@(-8)
uintptr_t const free_size = stats->free_size;
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
4c170: b682 cmpl %d2,%d3
4c172: 640c bccs 4c180 <_Heap_Extend+0x40>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
4c174: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
4c17a: 4200 clrb %d0
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
4c17c: 4e5e unlk %fp
4c17e: 4e75 rts
if ( extend_area_end < extend_area_begin ) {
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
4c180: 486e fff8 pea %fp@(-8)
4c184: 486e fffc pea %fp@(-4)
4c188: 2f01 movel %d1,%sp@-
4c18a: 2f04 movel %d4,%sp@-
4c18c: 2f00 movel %d0,%sp@-
4c18e: 2f02 movel %d2,%sp@-
4c190: 4eb9 0004 7924 jsr 47924 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
4c196: 4fef 0018 lea %sp@(24),%sp
4c19a: 4a00 tstb %d0
4c19c: 67d6 beqs 4c174 <_Heap_Extend+0x34>
4c19e: 2045 moveal %d5,%a0
4c1a0: 9bcd subal %a5,%a5
4c1a2: 97cb subal %a3,%a3
4c1a4: 99cc subal %a4,%a4
4c1a6: 42ae fff4 clrl %fp@(-12)
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
4c1aa: ba88 cmpl %a0,%d5
4c1ac: 6700 014a beqw 4c2f8 <_Heap_Extend+0x1b8>
4c1b0: 2208 movel %a0,%d1
uintptr_t const sub_area_end = start_block->prev_size;
4c1b2: 2010 movel %a0@,%d0
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
4c1b4: b082 cmpl %d2,%d0
4c1b6: 6304 blss 4c1bc <_Heap_Extend+0x7c>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
4c1b8: b681 cmpl %d1,%d3
4c1ba: 62b8 bhis 4c174 <_Heap_Extend+0x34> <== NEVER TAKEN
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
4c1bc: b681 cmpl %d1,%d3
4c1be: 6700 0132 beqw 4c2f2 <_Heap_Extend+0x1b2>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
4c1c2: b083 cmpl %d3,%d0
4c1c4: 6304 blss 4c1ca <_Heap_Extend+0x8a>
4c1c6: 2d48 fff4 movel %a0,%fp@(-12)
4c1ca: 2e00 movel %d0,%d7
4c1cc: 2240 moveal %d0,%a1
4c1ce: 5189 subql #8,%a1
4c1d0: 4c44 7001 remul %d4,%d1,%d7
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4c1d4: 93c1 subal %d1,%a1
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
4c1d6: b480 cmpl %d0,%d2
4c1d8: 6700 0100 beqw 4c2da <_Heap_Extend+0x19a>
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
4c1dc: b082 cmpl %d2,%d0
4c1de: 6402 bccs 4c1e2 <_Heap_Extend+0xa2>
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
4c1e0: 2a49 moveal %a1,%a5
- 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;
4c1e2: 70fe moveq #-2,%d0
4c1e4: c0a9 0004 andl %a1@(4),%d0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4c1e8: 41f1 0800 lea %a1@(00000000,%d0:l),%a0
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
4c1ec: b1c5 cmpal %d5,%a0
4c1ee: 66ba bnes 4c1aa <_Heap_Extend+0x6a>
if ( extend_area_begin < heap->area_begin ) {
4c1f0: b4aa 0018 cmpl %a2@(24),%d2
4c1f4: 6500 010a bcsw 4c300 <_Heap_Extend+0x1c0>
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
4c1f8: b6aa 001c cmpl %a2@(28),%d3
4c1fc: 6304 blss 4c202 <_Heap_Extend+0xc2>
heap->area_end = extend_area_end;
4c1fe: 2543 001c movel %d3,%a2@(28)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
4c202: 226e fff8 moveal %fp@(-8),%a1
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
4c206: 2009 movel %a1,%d0
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4c208: 7201 moveq #1,%d1
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
4c20a: 206e fffc moveal %fp@(-4),%a0
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
4c20e: 9088 subl %a0,%d0
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4c210: 8280 orl %d0,%d1
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
4c212: 2083 movel %d3,%a0@
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4c214: 2141 0004 movel %d1,%a0@(4)
extend_last_block->prev_size = extend_first_block_size;
4c218: 2280 movel %d0,%a1@
extend_last_block->size_and_flag = 0;
4c21a: 42a9 0004 clrl %a1@(4)
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
4c21e: b1ea 0020 cmpal %a2@(32),%a0
4c222: 6400 0104 bccw 4c328 <_Heap_Extend+0x1e8>
heap->first_block = extend_first_block;
4c226: 2548 0020 movel %a0,%a2@(32)
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
4c22a: 4a8c tstl %a4
4c22c: 6700 0148 beqw 4c376 <_Heap_Extend+0x236>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
4c230: 202a 0010 movel %a2@(16),%d0
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
4c234: 5082 addql #8,%d2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
4c236: 2802 movel %d2,%d4
4c238: 4c40 4001 remul %d0,%d1,%d4
if ( remainder != 0 ) {
4c23c: 4a81 tstl %d1
4c23e: 6704 beqs 4c244 <_Heap_Extend+0x104> <== ALWAYS TAKEN
return value - remainder + alignment;
4c240: d480 addl %d0,%d2 <== NOT EXECUTED
4c242: 9481 subl %d1,%d2 <== NOT EXECUTED
uintptr_t const new_first_block_begin =
4c244: 2042 moveal %d2,%a0
4c246: 5188 subql #8,%a0
new_first_block_alloc_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
4c248: 200c movel %a4,%d0
4c24a: 9088 subl %a0,%d0
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
4c24c: 7201 moveq #1,%d1
4c24e: 8280 orl %d0,%d1
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
4c250: 2094 movel %a4@,%a0@
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
4c252: 2141 0004 movel %d1,%a0@(4)
_Heap_Free_block( heap, new_first_block );
4c256: 2f08 movel %a0,%sp@-
4c258: 2f0a movel %a2,%sp@-
4c25a: 4eba fec8 jsr %pc@(4c124 <_Heap_Free_block>)
4c25e: 508f addql #8,%sp
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
4c260: 4a8b tstl %a3
4c262: 6700 00d4 beqw 4c338 <_Heap_Extend+0x1f8>
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
extend_area_end - last_block_begin - HEAP_BLOCK_HEADER_SIZE,
4c266: 5183 subql #8,%d3
uintptr_t extend_area_end
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
4c268: 968b subl %a3,%d3
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4c26a: 2203 movel %d3,%d1
4c26c: 4c6a 1000 0010 remul %a2@(16),%d0,%d1
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
(last_block->size_and_flag - last_block_new_size)
| HEAP_PREV_BLOCK_USED;
4c272: 7201 moveq #1,%d1
4c274: 9680 subl %d0,%d3
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
(last_block->size_and_flag - last_block_new_size)
4c276: 202b 0004 movel %a3@(4),%d0
4c27a: 9083 subl %d3,%d0
| HEAP_PREV_BLOCK_USED;
4c27c: 8280 orl %d0,%d1
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4c27e: 7001 moveq #1,%d0
4c280: 2781 3804 movel %d1,%a3@(00000004,%d3:l)
4c284: c0ab 0004 andl %a3@(4),%d0
block->size_and_flag = size | flag;
4c288: 8680 orl %d0,%d3
4c28a: 2743 0004 movel %d3,%a3@(4)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
4c28e: 2f0b movel %a3,%sp@-
4c290: 2f0a movel %a2,%sp@-
4c292: 4eba fe90 jsr %pc@(4c124 <_Heap_Free_block>)
4c296: 508f addql #8,%sp
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
4c298: 4a8c tstl %a4
4c29a: 6700 00c4 beqw 4c360 <_Heap_Extend+0x220>
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
4c29e: 202a 0030 movel %a2@(48),%d0
4c2a2: 9086 subl %d6,%d0
4c2a4: 2c00 movel %d0,%d6
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4c2a6: 7001 moveq #1,%d0
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
4c2a8: 206a 0024 moveal %a2@(36),%a0
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
4c2ac: 222a 0020 movel %a2@(32),%d1
4c2b0: 9288 subl %a0,%d1
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4c2b2: c0a8 0004 andl %a0@(4),%d0
block->size_and_flag = size | flag;
4c2b6: 8280 orl %d0,%d1
4c2b8: 2141 0004 movel %d1,%a0@(4)
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
4c2bc: ddaa 002c addl %d6,%a2@(44)
if ( extended_size_ptr != NULL )
4c2c0: 4aae 0014 tstl %fp@(20)
4c2c4: 6700 00ca beqw 4c390 <_Heap_Extend+0x250>
*extended_size_ptr = extended_size;
4c2c8: 206e 0014 moveal %fp@(20),%a0
4c2cc: 2086 movel %d6,%a0@
return true;
}
4c2ce: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
4c2d4: 7001 moveq #1,%d0
}
4c2d6: 4e5e unlk %fp
4c2d8: 4e75 rts
- 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;
4c2da: 70fe moveq #-2,%d0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
4c2dc: 2649 moveal %a1,%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;
4c2de: c0a9 0004 andl %a1@(4),%d0
} else if ( extend_area_end < sub_area_end ) {
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
start_block->prev_size = extend_area_end;
4c2e2: 2083 movel %d3,%a0@
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4c2e4: 41f1 0800 lea %a1@(00000000,%d0:l),%a0
} else if ( sub_area_end < extend_area_begin ) {
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
4c2e8: b1c5 cmpal %d5,%a0
4c2ea: 6600 febe bnew 4c1aa <_Heap_Extend+0x6a>
4c2ee: 6000 ff00 braw 4c1f0 <_Heap_Extend+0xb0>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
4c2f2: 2848 moveal %a0,%a4
4c2f4: 6000 fed4 braw 4c1ca <_Heap_Extend+0x8a>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
4c2f8: 222a 0018 movel %a2@(24),%d1
4c2fc: 6000 feb4 braw 4c1b2 <_Heap_Extend+0x72>
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
4c300: 226e fff8 moveal %fp@(-8),%a1
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
4c304: 2009 movel %a1,%d0
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4c306: 7201 moveq #1,%d1
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
4c308: 206e fffc moveal %fp@(-4),%a0
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
4c30c: 9088 subl %a0,%d0
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
if ( extend_area_begin < heap->area_begin ) {
heap->area_begin = extend_area_begin;
4c30e: 2542 0018 movel %d2,%a2@(24)
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4c312: 8280 orl %d0,%d1
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
4c314: 2083 movel %d3,%a0@
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4c316: 2141 0004 movel %d1,%a0@(4)
extend_last_block->prev_size = extend_first_block_size;
4c31a: 2280 movel %d0,%a1@
extend_last_block->size_and_flag = 0;
4c31c: 42a9 0004 clrl %a1@(4)
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
4c320: b1ea 0020 cmpal %a2@(32),%a0
4c324: 6500 ff00 bcsw 4c226 <_Heap_Extend+0xe6>
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
4c328: b3ea 0024 cmpal %a2@(36),%a1
4c32c: 6300 fefc blsw 4c22a <_Heap_Extend+0xea>
heap->last_block = extend_last_block;
4c330: 2549 0024 movel %a1,%a2@(36)
4c334: 6000 fef4 braw 4c22a <_Heap_Extend+0xea>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
4c338: 4a8d tstl %a5
4c33a: 6700 ff5c beqw 4c298 <_Heap_Extend+0x158>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4c33e: 7001 moveq #1,%d0
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
4c340: 222e fffc movel %fp@(-4),%d1
4c344: 928d subl %a5,%d1
4c346: c0ad 0004 andl %a5@(4),%d0
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
4c34a: 206e fff8 moveal %fp@(-8),%a0
block->size_and_flag = size | flag;
4c34e: 8280 orl %d0,%d1
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
4c350: 7001 moveq #1,%d0
4c352: 2b41 0004 movel %d1,%a5@(4)
4c356: 81a8 0004 orl %d0,%a0@(4)
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
4c35a: 4a8c tstl %a4
4c35c: 6600 ff40 bnew 4c29e <_Heap_Extend+0x15e>
4c360: 4a8b tstl %a3
4c362: 6600 ff3a bnew 4c29e <_Heap_Extend+0x15e>
_Heap_Free_block( heap, extend_first_block );
4c366: 2f2e fffc movel %fp@(-4),%sp@-
4c36a: 2f0a movel %a2,%sp@-
4c36c: 4eba fdb6 jsr %pc@(4c124 <_Heap_Free_block>)
4c370: 508f addql #8,%sp
4c372: 6000 ff2a braw 4c29e <_Heap_Extend+0x15e>
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
4c376: 4aae fff4 tstl %fp@(-12)
4c37a: 6700 fee4 beqw 4c260 <_Heap_Extend+0x120>
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
(link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED;
4c37e: 202e fff4 movel %fp@(-12),%d0
4c382: 7201 moveq #1,%d1
4c384: 9089 subl %a1,%d0
4c386: 8280 orl %d0,%d1
4c388: 2341 0004 movel %d1,%a1@(4)
4c38c: 6000 fed2 braw 4c260 <_Heap_Extend+0x120>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
4c390: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5 <== NOT EXECUTED
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
4c396: 7001 moveq #1,%d0 <== NOT EXECUTED
}
4c398: 4e5e unlk %fp <== NOT EXECUTED
0004be34 <_Heap_Free>:
#include <rtems/system.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/heap.h>
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
4be34: 4e56 ffe8 linkw %fp,#-24
4be38: 202e 000c movel %fp@(12),%d0
4be3c: 2040 moveal %d0,%a0
4be3e: 5188 subql #8,%a0
4be40: 226e 0008 moveal %fp@(8),%a1
4be44: 4c69 0001 0010 remul %a1@(16),%d1,%d0
4be4a: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
4be4e: 2029 0020 movel %a1@(32),%d0
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4be52: 91c1 subal %d1,%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;
4be54: b088 cmpl %a0,%d0
4be56: 6200 0098 bhiw 4bef0 <_Heap_Free+0xbc>
4be5a: 2229 0024 movel %a1@(36),%d1
4be5e: b288 cmpl %a0,%d1
4be60: 6500 008e bcsw 4bef0 <_Heap_Free+0xbc>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4be64: 2628 0004 movel %a0@(4),%d3
- 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;
4be68: 74fe moveq #-2,%d2
4be6a: c483 andl %d3,%d2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4be6c: 45f0 2800 lea %a0@(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;
4be70: b5c0 cmpal %d0,%a2
4be72: 657c bcss 4bef0 <_Heap_Free+0xbc> <== NEVER TAKEN
4be74: b5c1 cmpal %d1,%a2
4be76: 6278 bhis 4bef0 <_Heap_Free+0xbc> <== NEVER TAKEN
4be78: 282a 0004 movel %a2@(4),%d4
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
_HAssert( false );
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
4be7c: 0804 0000 btst #0,%d4
4be80: 676e beqs 4bef0 <_Heap_Free+0xbc> <== 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;
4be82: 7afe moveq #-2,%d5
4be84: c885 andl %d5,%d4
return false;
}
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 ));
4be86: b5c1 cmpal %d1,%a2
4be88: 6700 00f6 beqw 4bf80 <_Heap_Free+0x14c>
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;
4be8c: 7a01 moveq #1,%d5
4be8e: cab2 4804 andl %a2@(00000004,%d4:l),%d5
#include <rtems/system.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/heap.h>
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
4be92: 57c5 seq %d5
4be94: 4485 negl %d5
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 ) ) {
4be96: 0803 0000 btst #0,%d3
4be9a: 665e bnes 4befa <_Heap_Free+0xc6>
uintptr_t const prev_size = block->prev_size;
4be9c: 2610 movel %a0@,%d3
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4be9e: 91c3 subal %d3,%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;
4bea0: b1c0 cmpal %d0,%a0
4bea2: 654c bcss 4bef0 <_Heap_Free+0xbc> <== NEVER TAKEN
4bea4: b1c1 cmpal %d1,%a0
4bea6: 6248 bhis 4bef0 <_Heap_Free+0xbc> <== 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;
4bea8: 7001 moveq #1,%d0
4beaa: c0a8 0004 andl %a0@(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) ) {
4beae: 6740 beqs 4bef0 <_Heap_Free+0xbc> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
4beb0: 4a05 tstb %d5
4beb2: 6700 00d2 beqw 4bf86 <_Heap_Free+0x152>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4beb6: 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;
4beba: d882 addl %d2,%d4
4bebc: d684 addl %d4,%d3
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4bebe: 7001 moveq #1,%d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4bec0: 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;
4bec4: 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;
4bec8: 8083 orl %d3,%d0
next->prev = prev;
4beca: 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;
4bece: 53a9 0038 subql #1,%a1@(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;
4bed2: 2183 3800 movel %d3,%a0@(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;
4bed6: 2140 0004 movel %d0,%a0@(4)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4beda: 53a9 0040 subql #1,%a1@(64)
++stats->frees;
4bede: 52a9 0050 addql #1,%a1@(80)
stats->free_size += block_size;
4bee2: d5a9 0030 addl %d2,%a1@(48)
return( true );
4bee6: 7001 moveq #1,%d0
}
4bee8: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
4beec: 4e5e unlk %fp
4beee: 4e75 rts
4bef0: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
_HAssert( false );
return( false );
4bef4: 4200 clrb %d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4bef6: 4e5e unlk %fp
4bef8: 4e75 rts
uintptr_t const size = block_size + prev_size;
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 */
4befa: 4a05 tstb %d5
4befc: 6736 beqs 4bf34 <_Heap_Free+0x100>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4befe: 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;
4bf02: d882 addl %d2,%d4
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4bf04: 7001 moveq #1,%d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4bf06: 246a 000c moveal %a2@(12),%a2
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
4bf0a: 214b 0008 movel %a3,%a0@(8)
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;
4bf0e: 8084 orl %d4,%d0
new_block->prev = prev;
4bf10: 214a 000c movel %a2,%a0@(12)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
4bf14: 2184 4800 movel %d4,%a0@(00000000,%d4:l)
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;
4bf18: 2140 0004 movel %d0,%a0@(4)
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
4bf1c: 7001 moveq #1,%d0
next->prev = new_block;
prev->next = new_block;
4bf1e: 2548 0008 movel %a0,%a2@(8)
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
next->prev = new_block;
4bf22: 2748 000c movel %a0,%a3@(12)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4bf26: 53a9 0040 subql #1,%a1@(64)
++stats->frees;
4bf2a: 52a9 0050 addql #1,%a1@(80)
stats->free_size += block_size;
4bf2e: d5a9 0030 addl %d2,%a1@(48)
4bf32: 60b4 bras 4bee8 <_Heap_Free+0xb4>
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;
4bf34: 2029 0038 movel %a1@(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;
4bf38: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4bf3a: 7afe moveq #-2,%d5
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
4bf3c: 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;
4bf3e: 2669 0008 moveal %a1@(8),%a3
new_block->next = next;
new_block->prev = block_before;
4bf42: 2149 000c movel %a1,%a0@(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;
4bf46: 8282 orl %d2,%d1
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
4bf48: 214b 0008 movel %a3,%a0@(8)
4bf4c: 2141 0004 movel %d1,%a0@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4bf50: cbaa 0004 andl %d5,%a2@(4)
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
4bf54: 2748 000c movel %a0,%a3@(12)
next_block->prev_size = block_size;
4bf58: 2482 movel %d2,%a2@
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
4bf5a: 2348 0008 movel %a0,%a1@(8)
/* Statistics */
++stats->free_blocks;
4bf5e: 2340 0038 movel %d0,%a1@(56)
if ( stats->max_free_blocks < stats->free_blocks ) {
4bf62: b0a9 003c cmpl %a1@(60),%d0
4bf66: 6300 ff72 blsw 4beda <_Heap_Free+0xa6>
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4bf6a: 53a9 0040 subql #1,%a1@(64)
++stats->frees;
4bf6e: 52a9 0050 addql #1,%a1@(80)
stats->free_size += block_size;
4bf72: d5a9 0030 addl %d2,%a1@(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;
4bf76: 2340 003c movel %d0,%a1@(60)
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
4bf7a: 7001 moveq #1,%d0
4bf7c: 6000 ff6a braw 4bee8 <_Heap_Free+0xb4>
return false;
}
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 ));
4bf80: 4205 clrb %d5
4bf82: 6000 ff12 braw 4be96 <_Heap_Free+0x62>
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;
4bf86: d682 addl %d2,%d3
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4bf88: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4bf8a: 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;
4bf8c: 8283 orl %d3,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
4bf8e: 2483 movel %d3,%a2@
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
4bf90: 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;
4bf92: 2141 0004 movel %d1,%a0@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4bf96: cbaa 0004 andl %d5,%a2@(4)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
4bf9a: 53a9 0040 subql #1,%a1@(64)
++stats->frees;
4bf9e: 52a9 0050 addql #1,%a1@(80)
stats->free_size += block_size;
4bfa2: d5a9 0030 addl %d2,%a1@(48)
4bfa6: 6000 ff40 braw 4bee8 <_Heap_Free+0xb4>
...
00050f88 <_Heap_Get_information>:
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
50f88: 4e56 fff0 linkw %fp,#-16
50f8c: 226e 0008 moveal %fp@(8),%a1
50f90: 48d7 041c moveml %d2-%d4/%a2,%sp@
50f94: 282e 000c movel %fp@(12),%d4
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
50f98: 2044 moveal %d4,%a0
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
Heap_Block *the_block = the_heap->first_block;
50f9a: 2469 0020 moveal %a1@(32),%a2
Heap_Block *const end = the_heap->last_block;
50f9e: 2429 0024 movel %a1@(36),%d2
memset(the_info, 0, sizeof(*the_info));
50fa2: 4298 clrl %a0@+
50fa4: 4298 clrl %a0@+
50fa6: 4298 clrl %a0@+
50fa8: 4298 clrl %a0@+
50faa: 4298 clrl %a0@+
50fac: 4290 clrl %a0@
while ( the_block != end ) {
50fae: b48a cmpl %a2,%d2
50fb0: 6738 beqs 50fea <_Heap_Get_information+0x62> <== NEVER TAKEN
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
50fb2: 2604 movel %d4,%d3
50fb4: 0683 0000 000c addil #12,%d3
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
50fba: 222a 0004 movel %a2@(4),%d1
50fbe: 70fe moveq #-2,%d0
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
50fc0: 2043 moveal %d3,%a0
50fc2: c081 andl %d1,%d0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
50fc4: 43f2 0800 lea %a2@(00000000,%d0:l),%a1
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
50fc8: 2229 0004 movel %a1@(4),%d1
while ( the_block != end ) {
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
50fcc: 0801 0000 btst #0,%d1
50fd0: 6602 bnes 50fd4 <_Heap_Get_information+0x4c>
info = &the_info->Used;
else
info = &the_info->Free;
50fd2: 2044 moveal %d4,%a0
info->number++;
50fd4: 5290 addql #1,%a0@
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
50fd6: 2449 moveal %a1,%a2
info = &the_info->Used;
else
info = &the_info->Free;
info->number++;
info->total += the_size;
50fd8: d1a8 0008 addl %d0,%a0@(8)
if ( info->largest < the_size )
50fdc: b0a8 0004 cmpl %a0@(4),%d0
50fe0: 6304 blss 50fe6 <_Heap_Get_information+0x5e>
info->largest = the_size;
50fe2: 2140 0004 movel %d0,%a0@(4)
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
50fe6: b3c2 cmpal %d2,%a1
50fe8: 66d4 bnes 50fbe <_Heap_Get_information+0x36>
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
50fea: 4cd7 041c moveml %sp@,%d2-%d4/%a2
50fee: 4e5e unlk %fp
...
0005b2e0 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
5b2e0: 4e56 0000 linkw %fp,#0
5b2e4: 202e 000c movel %fp@(12),%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
5b2e8: 2040 moveal %d0,%a0
5b2ea: 5188 subql #8,%a0
5b2ec: 226e 0008 moveal %fp@(8),%a1
5b2f0: 2f02 movel %d2,%sp@-
5b2f2: 2400 movel %d0,%d2
5b2f4: 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);
5b2fa: 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
5b2fc: 2229 0020 movel %a1@(32),%d1
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
5b300: b288 cmpl %a0,%d1
5b302: 6236 bhis 5b33a <_Heap_Size_of_alloc_area+0x5a>
5b304: 2269 0024 moveal %a1@(36),%a1
5b308: b3c8 cmpal %a0,%a1
5b30a: 652e bcss 5b33a <_Heap_Size_of_alloc_area+0x5a> <== 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;
5b30c: 74fe moveq #-2,%d2
5b30e: 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);
5b312: d1c2 addal %d2,%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;
5b314: b1c1 cmpal %d1,%a0
5b316: 6522 bcss 5b33a <_Heap_Size_of_alloc_area+0x5a> <== NEVER TAKEN
5b318: b1c9 cmpal %a1,%a0
5b31a: 621e bhis 5b33a <_Heap_Size_of_alloc_area+0x5a> <== 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;
5b31c: 7201 moveq #1,%d1
5b31e: 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 )
5b322: 6716 beqs 5b33a <_Heap_Size_of_alloc_area+0x5a> <== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_BLOCK_SIZE_OFFSET - alloc_begin;
5b324: 7204 moveq #4,%d1
5b326: 9280 subl %d0,%d1
5b328: 2001 movel %d1,%d0
5b32a: d088 addl %a0,%d0
5b32c: 226e 0010 moveal %fp@(16),%a1
return true;
}
5b330: 241f movel %sp@+,%d2
5b332: 4e5e unlk %fp
|| !_Heap_Is_prev_used( next_block )
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_BLOCK_SIZE_OFFSET - alloc_begin;
5b334: 2280 movel %d0,%a1@
return true;
5b336: 7001 moveq #1,%d0
}
5b338: 4e75 rts
5b33a: 241f movel %sp@+,%d2
5b33c: 4e5e unlk %fp
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
5b33e: 4200 clrb %d0
}
*alloc_size = (uintptr_t) next_block + HEAP_BLOCK_SIZE_OFFSET - alloc_begin;
return true;
}
...
000483d6 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
483d6: 4e56 ffc4 linkw %fp,#-60
483da: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
483de: 246e 0008 moveal %fp@(8),%a2
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;
483e2: 4bfa ff94 lea %pc@(48378 <_Heap_Walk_print_nothing>),%a5
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
483e6: 2a2e 000c movel %fp@(12),%d5
uintptr_t const page_size = heap->page_size;
483ea: 262a 0010 movel %a2@(16),%d3
uintptr_t const min_block_size = heap->min_block_size;
483ee: 2c2a 0014 movel %a2@(20),%d6
Heap_Block *const first_block = heap->first_block;
483f2: 282a 0020 movel %a2@(32),%d4
Heap_Block *const last_block = heap->last_block;
483f6: 2e2a 0024 movel %a2@(36),%d7
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
483fa: 4a2e 0013 tstb %fp@(19)
483fe: 6704 beqs 48404 <_Heap_Walk+0x2e>
48400: 4bfa ff7e lea %pc@(48380 <_Heap_Walk_print>),%a5
if ( !_System_state_Is_up( _System_state_Get() ) ) {
48404: 7003 moveq #3,%d0
48406: b0b9 0006 0a40 cmpl 60a40 <_System_state_Current>,%d0
4840c: 670c beqs 4841a <_Heap_Walk+0x44>
block = next_block;
} while ( block != first_block );
return true;
}
4840e: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
}
block = next_block;
} while ( block != first_block );
return true;
48414: 7001 moveq #1,%d0
}
48416: 4e5e unlk %fp
48418: 4e75 rts
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)(
4841a: 2f2a 000c movel %a2@(12),%sp@-
4841e: 2f2a 0008 movel %a2@(8),%sp@-
48422: 2f07 movel %d7,%sp@-
48424: 2f04 movel %d4,%sp@-
48426: 2f2a 001c movel %a2@(28),%sp@-
4842a: 2f2a 0018 movel %a2@(24),%sp@-
4842e: 2f06 movel %d6,%sp@-
48430: 2f03 movel %d3,%sp@-
48432: 4879 0005 d01f pea 5d01f <_Status_Object_name_errors_to_status+0x5d>
48438: 42a7 clrl %sp@-
4843a: 2f05 movel %d5,%sp@-
4843c: 4e95 jsr %a5@
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
4843e: 4fef 002c lea %sp@(44),%sp
48442: 4a83 tstl %d3
48444: 6700 0082 beqw 484c8 <_Heap_Walk+0xf2>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
48448: 7003 moveq #3,%d0
4844a: c083 andl %d3,%d0
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
4844c: 6600 0090 bnew 484de <_Heap_Walk+0x108>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
48450: 2206 movel %d6,%d1
48452: 4c43 1000 remul %d3,%d0,%d1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
48456: 4a80 tstl %d0
48458: 6600 00a4 bnew 484fe <_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;
4845c: 2004 movel %d4,%d0
4845e: 5080 addql #8,%d0
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
48460: 4c43 0001 remul %d3,%d1,%d0
);
return false;
}
if (
48464: 4a81 tstl %d1
48466: 6600 00ae bnew 48516 <_Heap_Walk+0x140>
block = next_block;
} while ( block != first_block );
return true;
}
4846a: 2044 moveal %d4,%a0
4846c: 2228 0004 movel %a0@(4),%d1
48470: 2d41 fff0 movel %d1,%fp@(-16)
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
48474: 0801 0000 btst #0,%d1
48478: 6700 017e beqw 485f8 <_Heap_Walk+0x222>
- 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;
4847c: 2047 moveal %d7,%a0
4847e: 72fe moveq #-2,%d1
48480: c2a8 0004 andl %a0@(4),%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
48484: d1c1 addal %d1,%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;
48486: 7201 moveq #1,%d1
48488: c2a8 0004 andl %a0@(4),%d1
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
4848c: 6724 beqs 484b2 <_Heap_Walk+0xdc>
);
return false;
}
if (
4848e: b1c4 cmpal %d4,%a0
48490: 6700 009c beqw 4852e <_Heap_Walk+0x158>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
48494: 4879 0005 d179 pea 5d179 <_Status_Object_name_errors_to_status+0x1b7><== NOT EXECUTED
4849a: 4878 0001 pea 1 <ADD> <== NOT EXECUTED
4849e: 2f05 movel %d5,%sp@- <== NOT EXECUTED
484a0: 4e95 jsr %a5@ <== NOT EXECUTED
484a2: 4fef 000c lea %sp@(12),%sp <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
484a6: 4200 clrb %d0 <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
484a8: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
484ae: 4e5e unlk %fp
484b0: 4e75 rts
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
484b2: 4879 0005 d164 pea 5d164 <_Status_Object_name_errors_to_status+0x1a2>
}
if (
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
484b8: 4878 0001 pea 1 <ADD>
484bc: 2f05 movel %d5,%sp@-
484be: 4e95 jsr %a5@
484c0: 4fef 000c lea %sp@(12),%sp
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
484c4: 4200 clrb %d0
484c6: 60e0 bras 484a8 <_Heap_Walk+0xd2>
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
484c8: 4879 0005 d0b0 pea 5d0b0 <_Status_Object_name_errors_to_status+0xee>
}
if (
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
484ce: 4878 0001 pea 1 <ADD>
484d2: 2f05 movel %d5,%sp@-
484d4: 4e95 jsr %a5@
484d6: 4fef 000c lea %sp@(12),%sp
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
484da: 4200 clrb %d0
484dc: 60ca bras 484a8 <_Heap_Walk+0xd2>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
484de: 2f03 movel %d3,%sp@-
484e0: 4879 0005 d0c3 pea 5d0c3 <_Status_Object_name_errors_to_status+0x101>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
484e6: 4878 0001 pea 1 <ADD>
484ea: 2f05 movel %d5,%sp@-
484ec: 4e95 jsr %a5@
484ee: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
484f2: 4200 clrb %d0
block = next_block;
} while ( block != first_block );
return true;
}
484f4: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
484fa: 4e5e unlk %fp
484fc: 4e75 rts
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
484fe: 2f06 movel %d6,%sp@-
48500: 4879 0005 d0e1 pea 5d0e1 <_Status_Object_name_errors_to_status+0x11f>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
48506: 4878 0001 pea 1 <ADD>
4850a: 2f05 movel %d5,%sp@-
4850c: 4e95 jsr %a5@
4850e: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
48512: 4200 clrb %d0
48514: 60de bras 484f4 <_Heap_Walk+0x11e>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
48516: 2f04 movel %d4,%sp@-
48518: 4879 0005 d105 pea 5d105 <_Status_Object_name_errors_to_status+0x143>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
4851e: 4878 0001 pea 1 <ADD>
48522: 2f05 movel %d5,%sp@-
48524: 4e95 jsr %a5@
48526: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
4852a: 4200 clrb %d0
4852c: 60c6 bras 484f4 <_Heap_Walk+0x11e>
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
4852e: 202a 0010 movel %a2@(16),%d0
block = next_block;
} while ( block != first_block );
return true;
}
48532: 206a 0008 moveal %a2@(8),%a0
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
48536: 2d40 fffc movel %d0,%fp@(-4)
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 ) {
4853a: b1ca cmpal %a2,%a0
4853c: 6700 032c beqw 4886a <_Heap_Walk+0x494>
block = next_block;
} while ( block != first_block );
return true;
}
48540: 242a 0020 movel %a2@(32),%d2
48544: 2d42 fff4 movel %d2,%fp@(-12)
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;
48548: b1c2 cmpal %d2,%a0
4854a: 6500 0092 bcsw 485de <_Heap_Walk+0x208>
4854e: 286a 0024 moveal %a2@(36),%a4
48552: b1cc cmpal %a4,%a0
48554: 6200 0088 bhiw 485de <_Heap_Walk+0x208>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
48558: 47e8 0008 lea %a0@(8),%a3
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4855c: 200b movel %a3,%d0
4855e: 222e fffc movel %fp@(-4),%d1
48562: 4c41 0002 remul %d1,%d2,%d0
);
return false;
}
if (
48566: 4a82 tstl %d2
48568: 6600 00a6 bnew 48610 <_Heap_Walk+0x23a>
- 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;
4856c: 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;
4856e: 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;
48570: 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;
48574: c0b0 2804 andl %a0@(00000004,%d2:l),%d0
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
48578: 664a bnes 485c4 <_Heap_Walk+0x1ee> <== NEVER TAKEN
4857a: 222e fff4 movel %fp@(-12),%d1
4857e: 224a moveal %a2,%a1
48580: 2648 moveal %a0,%a3
48582: 2d43 fff8 movel %d3,%fp@(-8)
);
return false;
}
if ( free_block->prev != prev_block ) {
48586: 2428 000c movel %a0@(12),%d2
4858a: b3c2 cmpal %d2,%a1
4858c: 6600 02c0 bnew 4884e <_Heap_Walk+0x478>
return false;
}
prev_block = free_block;
free_block = free_block->next;
48590: 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 ) {
48594: b1ca cmpal %a2,%a0
48596: 6700 0092 beqw 4862a <_Heap_Walk+0x254>
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;
4859a: b1c1 cmpal %d1,%a0
4859c: 6540 bcss 485de <_Heap_Walk+0x208>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
4859e: 2408 movel %a0,%d2
485a0: 5082 addql #8,%d2
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
485a2: b9c8 cmpal %a0,%a4
485a4: 6538 bcss 485de <_Heap_Walk+0x208> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
485a6: 202e fffc movel %fp@(-4),%d0
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
485aa: 224b moveal %a3,%a1
485ac: 2648 moveal %a0,%a3
485ae: 4c40 2003 remul %d0,%d3,%d2
);
return false;
}
if (
485b2: 4a83 tstl %d3
485b4: 665a bnes 48610 <_Heap_Walk+0x23a>
- 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;
485b6: 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;
485b8: 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;
485ba: 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;
485be: c0b0 2804 andl %a0@(00000004,%d2:l),%d0
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
485c2: 67c2 beqs 48586 <_Heap_Walk+0x1b0>
(*printer)(
485c4: 2f08 movel %a0,%sp@-
485c6: 4879 0005 d1f8 pea 5d1f8 <_Status_Object_name_errors_to_status+0x236>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
485cc: 4878 0001 pea 1 <ADD>
485d0: 2f05 movel %d5,%sp@-
485d2: 4e95 jsr %a5@
485d4: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
485d8: 4200 clrb %d0
485da: 6000 ff18 braw 484f4 <_Heap_Walk+0x11e>
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)(
485de: 2f08 movel %a0,%sp@-
485e0: 4879 0005 d1a8 pea 5d1a8 <_Status_Object_name_errors_to_status+0x1e6>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
485e6: 4878 0001 pea 1 <ADD>
485ea: 2f05 movel %d5,%sp@-
485ec: 4e95 jsr %a5@
485ee: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
485f2: 4200 clrb %d0
485f4: 6000 fefe braw 484f4 <_Heap_Walk+0x11e>
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
485f8: 4879 0005 d136 pea 5d136 <_Status_Object_name_errors_to_status+0x174>
}
if (
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
485fe: 4878 0001 pea 1 <ADD>
48602: 2f05 movel %d5,%sp@-
48604: 4e95 jsr %a5@
48606: 4fef 000c lea %sp@(12),%sp
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
4860a: 4200 clrb %d0
4860c: 6000 fe9a braw 484a8 <_Heap_Walk+0xd2>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
48610: 2f08 movel %a0,%sp@-
48612: 4879 0005 d1c8 pea 5d1c8 <_Status_Object_name_errors_to_status+0x206>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
48618: 4878 0001 pea 1 <ADD>
4861c: 2f05 movel %d5,%sp@-
4861e: 4e95 jsr %a5@
48620: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
48624: 4200 clrb %d0
48626: 6000 fecc braw 484f4 <_Heap_Walk+0x11e>
4862a: 262e fff8 movel %fp@(-8),%d3
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
4862e: 2844 moveal %d4,%a4
48630: 2d41 fff4 movel %d1,%fp@(-12)
48634: 222e fff4 movel %fp@(-12),%d1
48638: 2d43 fffc movel %d3,%fp@(-4)
4863c: 262e fff0 movel %fp@(-16),%d3
48640: 2d47 ffec movel %d7,%fp@(-20)
- 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;
48644: 74fe moveq #-2,%d2
48646: c483 andl %d3,%d2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
48648: 47f4 2800 lea %a4@(00000000,%d2:l),%a3
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;
4864c: b7c1 cmpal %d1,%a3
4864e: 657e bcss 486ce <_Heap_Walk+0x2f8> <== NEVER TAKEN
48650: b7ea 0024 cmpal %a2@(36),%a3
48654: 6278 bhis 486ce <_Heap_Walk+0x2f8>
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;
48656: b9ee ffec cmpal %fp@(-20),%a4
4865a: 56c1 sne %d1
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4865c: 202e fffc movel %fp@(-4),%d0
48660: 2e02 movel %d2,%d7
48662: 3241 moveaw %d1,%a1
48664: 4c40 7001 remul %d0,%d1,%d7
48668: 2009 movel %a1,%d0
4866a: 4480 negl %d0
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
4866c: 4a81 tstl %d1
4866e: 6704 beqs 48674 <_Heap_Walk+0x29e>
48670: 4a00 tstb %d0
48672: 667c bnes 486f0 <_Heap_Walk+0x31a>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
48674: b486 cmpl %d6,%d2
48676: 6406 bccs 4867e <_Heap_Walk+0x2a8>
48678: 4a00 tstb %d0
4867a: 6600 008e bnew 4870a <_Heap_Walk+0x334>
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
4867e: b7cc cmpal %a4,%a3
48680: 6206 bhis 48688 <_Heap_Walk+0x2b2>
48682: 4a00 tstb %d0
48684: 6600 00a8 bnew 4872e <_Heap_Walk+0x358>
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;
48688: 7001 moveq #1,%d0
4868a: 7e01 moveq #1,%d7
4868c: c0ab 0004 andl %a3@(4),%d0
48690: c687 andl %d7,%d3
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
48692: 4a80 tstl %d0
48694: 6700 00cc beqw 48762 <_Heap_Walk+0x38c>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
48698: 4a83 tstl %d3
4869a: 6700 00ac beqw 48748 <_Heap_Walk+0x372>
(*printer)(
4869e: 2f02 movel %d2,%sp@-
486a0: 2f0c movel %a4,%sp@-
486a2: 4879 0005 d39d pea 5d39d <_Status_Object_name_errors_to_status+0x3db>
486a8: 42a7 clrl %sp@-
486aa: 2f05 movel %d5,%sp@-
486ac: 4e95 jsr %a5@
486ae: 4fef 0014 lea %sp@(20),%sp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
486b2: b7c4 cmpal %d4,%a3
486b4: 6700 fd58 beqw 4840e <_Heap_Walk+0x38>
486b8: 262b 0004 movel %a3@(4),%d3
- 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;
486bc: 74fe moveq #-2,%d2
486be: 284b moveal %a3,%a4
486c0: c483 andl %d3,%d2
486c2: 222a 0020 movel %a2@(32),%d1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
486c6: 47f4 2800 lea %a4@(00000000,%d2:l),%a3
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;
486ca: b7c1 cmpal %d1,%a3
486cc: 6482 bccs 48650 <_Heap_Walk+0x27a> <== 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)(
486ce: 2f0b movel %a3,%sp@-
486d0: 2f0c movel %a4,%sp@-
486d2: 4879 0005 d246 pea 5d246 <_Status_Object_name_errors_to_status+0x284>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
486d8: 4878 0001 pea 1 <ADD>
486dc: 2f05 movel %d5,%sp@-
486de: 4e95 jsr %a5@
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
486e0: 4fef 0014 lea %sp@(20),%sp
486e4: 4200 clrb %d0
block = next_block;
} while ( block != first_block );
return true;
}
486e6: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
486ec: 4e5e unlk %fp
486ee: 4e75 rts
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
486f0: 2f02 movel %d2,%sp@-
486f2: 2f0c movel %a4,%sp@-
486f4: 4879 0005 d273 pea 5d273 <_Status_Object_name_errors_to_status+0x2b1>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
486fa: 4878 0001 pea 1 <ADD>
486fe: 2f05 movel %d5,%sp@-
48700: 4e95 jsr %a5@
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
48702: 4fef 0014 lea %sp@(20),%sp
48706: 4200 clrb %d0
48708: 60dc bras 486e6 <_Heap_Walk+0x310>
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
4870a: 2f06 movel %d6,%sp@-
4870c: 2f02 movel %d2,%sp@-
4870e: 2f0c movel %a4,%sp@-
48710: 4879 0005 d2a1 pea 5d2a1 <_Status_Object_name_errors_to_status+0x2df>
48716: 4878 0001 pea 1 <ADD>
4871a: 2f05 movel %d5,%sp@-
4871c: 4e95 jsr %a5@
block,
block_size,
min_block_size
);
return false;
4871e: 4fef 0018 lea %sp@(24),%sp
block = next_block;
} while ( block != first_block );
return true;
}
48722: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
block,
block_size,
min_block_size
);
return false;
48728: 4200 clrb %d0
block = next_block;
} while ( block != first_block );
return true;
}
4872a: 4e5e unlk %fp
4872c: 4e75 rts
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
4872e: 2f0b movel %a3,%sp@-
48730: 2f0c movel %a4,%sp@-
48732: 4879 0005 d2cc pea 5d2cc <_Status_Object_name_errors_to_status+0x30a>
48738: 4878 0001 pea 1 <ADD>
4873c: 2f05 movel %d5,%sp@-
4873e: 4e95 jsr %a5@
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
48740: 4fef 0014 lea %sp@(20),%sp
48744: 4200 clrb %d0
48746: 609e bras 486e6 <_Heap_Walk+0x310>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
48748: 2f14 movel %a4@,%sp@-
4874a: 2f02 movel %d2,%sp@-
4874c: 2f0c movel %a4,%sp@-
4874e: 4879 0005 d3b4 pea 5d3b4 <_Status_Object_name_errors_to_status+0x3f2>
48754: 42a7 clrl %sp@-
48756: 2f05 movel %d5,%sp@-
48758: 4e95 jsr %a5@
4875a: 4fef 0018 lea %sp@(24),%sp
4875e: 6000 ff52 braw 486b2 <_Heap_Walk+0x2dc>
block = next_block;
} while ( block != first_block );
return true;
}
48762: 2e2a 0008 movel %a2@(8),%d7
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)(
48766: 43f9 0005 cfec lea 5cfec <_Status_Object_name_errors_to_status+0x2a>,%a1
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
4876c: 222c 0008 movel %a4@(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)(
48770: b2aa 000c cmpl %a2@(12),%d1
48774: 670a beqs 48780 <_Heap_Walk+0x3aa>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
48776: 43f9 0005 cf34 lea 5cf34 <rtems_filesystem_default_pathconf+0x40>,%a1
4877c: b28a cmpl %a2,%d1
4877e: 6764 beqs 487e4 <_Heap_Walk+0x40e>
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 ?
48780: 202c 000c movel %a4@(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)(
48784: 41f9 0005 d005 lea 5d005 <_Status_Object_name_errors_to_status+0x43>,%a0
4878a: b087 cmpl %d7,%d0
4878c: 670a beqs 48798 <_Heap_Walk+0x3c2>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
4878e: 41f9 0005 cf34 lea 5cf34 <rtems_filesystem_default_pathconf+0x40>,%a0
48794: b08a cmpl %a2,%d0
48796: 6754 beqs 487ec <_Heap_Walk+0x416>
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)(
48798: 2f09 movel %a1,%sp@-
4879a: 2f01 movel %d1,%sp@-
4879c: 2f08 movel %a0,%sp@-
4879e: 2f00 movel %d0,%sp@-
487a0: 2f02 movel %d2,%sp@-
487a2: 2f0c movel %a4,%sp@-
487a4: 4879 0005 d300 pea 5d300 <_Status_Object_name_errors_to_status+0x33e>
487aa: 42a7 clrl %sp@-
487ac: 2f05 movel %d5,%sp@-
487ae: 4e95 jsr %a5@
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
487b0: 2213 movel %a3@,%d1
487b2: 4fef 0024 lea %sp@(36),%sp
487b6: b282 cmpl %d2,%d1
487b8: 663a bnes 487f4 <_Heap_Walk+0x41e>
);
return false;
}
if ( !prev_used ) {
487ba: 4a83 tstl %d3
487bc: 6776 beqs 48834 <_Heap_Walk+0x45e> <== NEVER TAKEN
block = next_block;
} while ( block != first_block );
return true;
}
487be: 206a 0008 moveal %a2@(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 ) {
487c2: b1ca cmpal %a2,%a0
487c4: 6754 beqs 4881a <_Heap_Walk+0x444> <== NEVER TAKEN
if ( free_block == block ) {
487c6: b1cc cmpal %a4,%a0
487c8: 6700 fee8 beqw 486b2 <_Heap_Walk+0x2dc>
487cc: 2e2e ffec movel %fp@(-20),%d7
return true;
}
free_block = free_block->next;
487d0: 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 ) {
487d4: b1ca cmpal %a2,%a0
487d6: 6742 beqs 4881a <_Heap_Walk+0x444> <== NEVER TAKEN
if ( free_block == block ) {
487d8: b1cc cmpal %a4,%a0
487da: 66f4 bnes 487d0 <_Heap_Walk+0x3fa>
487dc: 2d47 ffec movel %d7,%fp@(-20)
487e0: 6000 fed0 braw 486b2 <_Heap_Walk+0x2dc>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
487e4: 43f9 0005 cffb lea 5cffb <_Status_Object_name_errors_to_status+0x39>,%a1
487ea: 6094 bras 48780 <_Heap_Walk+0x3aa>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
487ec: 41f9 0005 d015 lea 5d015 <_Status_Object_name_errors_to_status+0x53>,%a0
487f2: 60a4 bras 48798 <_Heap_Walk+0x3c2>
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
487f4: 2f0b movel %a3,%sp@-
487f6: 2f01 movel %d1,%sp@-
487f8: 2f02 movel %d2,%sp@-
487fa: 2f0c movel %a4,%sp@-
487fc: 4879 0005 d335 pea 5d335 <_Status_Object_name_errors_to_status+0x373>
48802: 4878 0001 pea 1 <ADD>
48806: 2f05 movel %d5,%sp@-
48808: 4e95 jsr %a5@
4880a: 4fef 001c lea %sp@(28),%sp
block = next_block;
} while ( block != first_block );
return true;
}
4880e: 4cee 3cfc ffc4 moveml %fp@(-60),%d2-%d7/%a2-%a5
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
48814: 4200 clrb %d0
block = next_block;
} while ( block != first_block );
return true;
}
48816: 4e5e unlk %fp
48818: 4e75 rts
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
4881a: 2f0c movel %a4,%sp@-
4881c: 4879 0005 d3d9 pea 5d3d9 <_Status_Object_name_errors_to_status+0x417>
48822: 4878 0001 pea 1 <ADD>
48826: 2f05 movel %d5,%sp@-
48828: 4e95 jsr %a5@
4882a: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
4882e: 4200 clrb %d0
48830: 6000 fcc2 braw 484f4 <_Heap_Walk+0x11e>
return false;
}
if ( !prev_used ) {
(*printer)(
48834: 2f0c movel %a4,%sp@-
48836: 4879 0005 d36e pea 5d36e <_Status_Object_name_errors_to_status+0x3ac>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
4883c: 4878 0001 pea 1 <ADD>
48840: 2f05 movel %d5,%sp@-
48842: 4e95 jsr %a5@
48844: 4fef 0010 lea %sp@(16),%sp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
48848: 4200 clrb %d0
4884a: 6000 fca8 braw 484f4 <_Heap_Walk+0x11e>
return false;
}
if ( free_block->prev != prev_block ) {
(*printer)(
4884e: 2f02 movel %d2,%sp@-
48850: 2f08 movel %a0,%sp@-
48852: 4879 0005 d214 pea 5d214 <_Status_Object_name_errors_to_status+0x252>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
48858: 4878 0001 pea 1 <ADD>
4885c: 2f05 movel %d5,%sp@-
4885e: 4e95 jsr %a5@
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
48860: 4fef 0014 lea %sp@(20),%sp
48864: 4200 clrb %d0
48866: 6000 fe7e braw 486e6 <_Heap_Walk+0x310>
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 ) {
4886a: 222a 0020 movel %a2@(32),%d1
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
4886e: 2844 moveal %d4,%a4
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 ) {
48870: 2d41 fff4 movel %d1,%fp@(-12)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
48874: 222e fff4 movel %fp@(-12),%d1
48878: 2d43 fffc movel %d3,%fp@(-4)
4887c: 262e fff0 movel %fp@(-16),%d3
48880: 2d47 ffec movel %d7,%fp@(-20)
48884: 6000 fdbe braw 48644 <_Heap_Walk+0x26e>
00046e1a <_IO_Initialize_all_drivers>:
*
* Output Parameters: NONE
*/
void _IO_Initialize_all_drivers( void )
{
46e1a: 4e56 0000 linkw %fp,#0
46e1e: 2f0a movel %a2,%sp@-
46e20: 2f02 movel %d2,%sp@-
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
46e22: 4ab9 0005 e62a tstl 5e62a <_IO_Number_of_drivers>
46e28: 671e beqs 46e48 <_IO_Initialize_all_drivers+0x2e><== NEVER TAKEN
46e2a: 4282 clrl %d2
46e2c: 45f9 0004 ba1c lea 4ba1c <rtems_io_initialize>,%a2
(void) rtems_io_initialize( major, 0, NULL );
46e32: 42a7 clrl %sp@-
46e34: 42a7 clrl %sp@-
46e36: 2f02 movel %d2,%sp@-
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
46e38: 5282 addql #1,%d2
(void) rtems_io_initialize( major, 0, NULL );
46e3a: 4e92 jsr %a2@
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
46e3c: 4fef 000c lea %sp@(12),%sp
46e40: b4b9 0005 e62a cmpl 5e62a <_IO_Number_of_drivers>,%d2
46e46: 65ea bcss 46e32 <_IO_Initialize_all_drivers+0x18>
(void) rtems_io_initialize( major, 0, NULL );
}
46e48: 242e fff8 movel %fp@(-8),%d2
46e4c: 246e fffc moveal %fp@(-4),%a2
46e50: 4e5e unlk %fp <== NOT EXECUTED
00046d80 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
46d80: 4e56 fff0 linkw %fp,#-16
46d84: 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 = Configuration.Device_driver_table;
46d88: 2639 0005 cd26 movel 5cd26 <Configuration+0x32>,%d3
drivers_in_table = Configuration.number_of_device_drivers;
46d8e: 2439 0005 cd22 movel 5cd22 <Configuration+0x2e>,%d2
number_of_drivers = Configuration.maximum_drivers;
46d94: 2839 0005 cd1e movel 5cd1e <Configuration+0x2a>,%d4
/*
* 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 )
46d9a: b882 cmpl %d2,%d4
46d9c: 6366 blss 46e04 <_IO_Manager_initialization+0x84>
* 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(
46d9e: 2004 movel %d4,%d0
46da0: 2a04 movel %d4,%d5
46da2: e788 lsll #3,%d0
46da4: eb8d lsll #5,%d5
46da6: 9a80 subl %d0,%d5
46da8: 2f05 movel %d5,%sp@-
46daa: 4eb9 0004 9c76 jsr 49c76 <_Workspace_Allocate_or_fatal_error>
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
46db0: 2f05 movel %d5,%sp@-
46db2: 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 *)
46db4: 23c0 0005 e62e movel %d0,5e62e <_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(
46dba: 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;
46dbc: 23c4 0005 e62a movel %d4,5e62a <_IO_Number_of_drivers>
memset(
46dc2: 4eb9 0004 e388 jsr 4e388 <memset>
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
46dc8: 4fef 0010 lea %sp@(16),%sp
46dcc: 4a82 tstl %d2
46dce: 672a beqs 46dfa <_IO_Manager_initialization+0x7a><== NEVER TAKEN
46dd0: 2839 0005 e62e movel 5e62e <_IO_Driver_address_table>,%d4
46dd6: 4280 clrl %d0
46dd8: 4281 clrl %d1
_IO_Driver_address_table[index] = driver_table[index];
46dda: 2243 moveal %d3,%a1
46ddc: 2044 moveal %d4,%a0
46dde: d3c0 addal %d0,%a1
46de0: d1c0 addal %d0,%a0
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
46de2: 5281 addql #1,%d1
46de4: 0680 0000 0018 addil #24,%d0
_IO_Driver_address_table[index] = driver_table[index];
46dea: 20d9 movel %a1@+,%a0@+
46dec: 20d9 movel %a1@+,%a0@+
46dee: 20d9 movel %a1@+,%a0@+
46df0: 20d9 movel %a1@+,%a0@+
46df2: 20d9 movel %a1@+,%a0@+
46df4: 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++ )
46df6: b282 cmpl %d2,%d1
46df8: 65e0 bcss 46dda <_IO_Manager_initialization+0x5a>
_IO_Driver_address_table[index] = driver_table[index];
number_of_drivers = drivers_in_table;
}
46dfa: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5
46e00: 4e5e unlk %fp
46e02: 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;
46e04: 23c3 0005 e62e movel %d3,5e62e <_IO_Driver_address_table>
_IO_Number_of_drivers = number_of_drivers;
46e0a: 23c2 0005 e62a movel %d2,5e62a <_IO_Number_of_drivers>
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
number_of_drivers = drivers_in_table;
}
46e10: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5
46e16: 4e5e unlk %fp <== NOT EXECUTED
000479c8 <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
479c8: 4e56 fffc linkw %fp,#-4
479cc: 206e 0010 moveal %fp@(16),%a0
479d0: 2f02 movel %d2,%sp@-
479d2: 222e 000c movel %fp@(12),%d1
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
479d6: 4282 clrl %d2
479d8: 1401 moveb %d1,%d2
479da: 2242 moveal %d2,%a1
479dc: 2f08 movel %a0,%sp@-
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
479de: 202e 0008 movel %fp@(8),%d0
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
479e2: 2f09 movel %a1,%sp@-
Internal_errors_t the_error
)
{
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
479e4: 13c1 0005 e4b6 moveb %d1,5e4b6 <_Internal_errors_What_happened+0x4>
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
479ea: 2d48 fffc movel %a0,%fp@(-4)
bool is_internal,
Internal_errors_t the_error
)
{
_Internal_errors_What_happened.the_source = the_source;
479ee: 23c0 0005 e4b2 movel %d0,5e4b2 <_Internal_errors_What_happened>
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
479f4: 23c8 0005 e4b8 movel %a0,5e4b8 <_Internal_errors_What_happened+0x6>
_User_extensions_Fatal( the_source, is_internal, the_error );
479fa: 2f00 movel %d0,%sp@-
479fc: 4eb9 0004 9802 jsr 49802 <_User_extensions_Fatal>
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
47a02: 206e fffc moveal %fp@(-4),%a0 <== NOT EXECUTED
47a06: 327c 0700 moveaw #1792,%a1 <== NOT EXECUTED
47a0a: 2409 movel %a1,%d2 <== NOT EXECUTED
47a0c: 40c0 movew %sr,%d0 <== NOT EXECUTED
47a0e: 8082 orl %d2,%d0 <== NOT EXECUTED
47a10: 46c0 movew %d0,%sr <== NOT EXECUTED
47a12: 2008 movel %a0,%d0 <== NOT EXECUTED
47a14: 223c dead beef movel #-559038737,%d1 <== NOT EXECUTED
47a1a: 4ac8 halt <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
47a1c: 7005 moveq #5,%d0 <== NOT EXECUTED
47a1e: 4fef 000c lea %sp@(12),%sp <== NOT EXECUTED
47a22: 23c0 0005 e588 movel %d0,5e588 <_System_state_Current> <== NOT EXECUTED
47a28: 60fe bras 47a28 <_Internal_error_Occurred+0x60> <== NOT EXECUTED
...
00047a8c <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
47a8c: 4e56 fff0 linkw %fp,#-16
47a90: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
47a94: 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 )
47a98: 4aaa 0014 tstl %a2@(20)
47a9c: 660c bnes 47aaa <_Objects_Allocate+0x1e> <== ALWAYS TAKEN
return NULL;
47a9e: 4280 clrl %d0 <== NOT EXECUTED
);
}
#endif
return the_object;
}
47aa0: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
47aa6: 4e5e unlk %fp
47aa8: 4e75 rts
/*
* 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 );
47aaa: 240a movel %a2,%d2
47aac: 0682 0000 001c addil #28,%d2
47ab2: 47f9 0004 709c lea 4709c <_Chain_Get>,%a3
47ab8: 2f02 movel %d2,%sp@-
47aba: 4e93 jsr %a3@
if ( information->auto_extend ) {
47abc: 588f addql #4,%sp
47abe: 4a2a 0010 tstb %a2@(16)
47ac2: 67dc beqs 47aa0 <_Objects_Allocate+0x14>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
47ac4: 4a80 tstl %d0
47ac6: 6738 beqs 47b00 <_Objects_Allocate+0x74>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
47ac8: 2040 moveal %d0,%a0
47aca: 4281 clrl %d1
47acc: 4283 clrl %d3
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
47ace: 4282 clrl %d2
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
47ad0: 362a 0008 movew %a2@(8),%d3
47ad4: 3228 000a movew %a0@(10),%d1
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
47ad8: 342a 0012 movew %a2@(18),%d2
information->inactive_per_block[ block ]--;
47adc: 206a 002a moveal %a2@(42),%a0
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
47ae0: 9283 subl %d3,%d1
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
47ae2: 4c42 1001 remul %d2,%d1,%d1
information->inactive_per_block[ block ]--;
information->inactive--;
47ae6: 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 ]--;
47aea: e589 lsll #2,%d1
information->inactive--;
47aec: 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 ]--;
47aee: d1c1 addal %d1,%a0
47af0: 5390 subql #1,%a0@
information->inactive--;
47af2: 3549 0028 movew %a1,%a2@(40)
);
}
#endif
return the_object;
}
47af6: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
47afc: 4e5e unlk %fp
47afe: 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 );
47b00: 2f0a movel %a2,%sp@-
47b02: 4eb9 0004 7b48 jsr 47b48 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
47b08: 2f02 movel %d2,%sp@-
47b0a: 4e93 jsr %a3@
}
if ( the_object ) {
47b0c: 508f addql #8,%sp
47b0e: 4a80 tstl %d0
47b10: 66b6 bnes 47ac8 <_Objects_Allocate+0x3c>
);
}
#endif
return the_object;
}
47b12: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
47b18: 4e5e unlk %fp <== NOT EXECUTED
00047b1c <_Objects_Close>:
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
47b1c: 4280 clrl %d0
void _Objects_Close(
Objects_Information *information,
Objects_Control *the_object
)
{
47b1e: 4e56 0000 linkw %fp,#0
47b22: 226e 000c moveal %fp@(12),%a1
47b26: 206e 0008 moveal %fp@(8),%a0
47b2a: 2f0a movel %a2,%sp@-
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
47b2c: 2468 0018 moveal %a0@(24),%a2
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
47b30: 3029 000a movew %a1@(10),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
47b34: 42b2 0c00 clrl %a2@(00000000,%d0:l:4)
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
}
47b38: 245f moveal %sp@+,%a2
Objects_Control *the_object
)
{
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
47b3a: 2d49 000c movel %a1,%fp@(12)
}
47b3e: 4e5e unlk %fp
Objects_Control *the_object
)
{
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
47b40: 4ef9 0004 80c0 jmp 480c0 <_Objects_Namespace_remove>
...
00047b48 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
47b48: 4e56 ffcc linkw %fp,#-52
47b4c: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
47b50: 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 );
47b54: 4285 clrl %d5
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
47b56: 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 );
47b5a: 3a2a 0008 movew %a2@(8),%d5
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
47b5e: 4a88 tstl %a0
47b60: 6700 0232 beqw 47d94 <_Objects_Extend_information+0x24c>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
47b64: 322a 000e movew %a2@(14),%d1
47b68: 302a 0012 movew %a2@(18),%d0
47b6c: 3801 movew %d1,%d4
47b6e: 0284 0000 ffff andil #65535,%d4
47b74: 88c0 divuw %d0,%d4
47b76: 0284 0000 ffff andil #65535,%d4
for ( ; block < block_count; block++ ) {
47b7c: 6700 022c beqw 47daa <_Objects_Extend_information+0x262>
if ( information->object_blocks[ block ] == NULL ) {
47b80: 4a90 tstl %a0@
47b82: 6700 0236 beqw 47dba <_Objects_Extend_information+0x272>
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
47b86: 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 );
47b88: 2605 movel %d5,%d3
index_base = minimum_index;
block = 0;
47b8a: 4282 clrl %d2
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
47b8c: 0280 0000 ffff andil #65535,%d0
do_extend = false;
break;
} else
index_base += information->allocation_size;
47b92: 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++ ) {
47b94: 5282 addql #1,%d2
47b96: b484 cmpl %d4,%d2
47b98: 6400 01a6 bccw 47d40 <_Objects_Extend_information+0x1f8>
if ( information->object_blocks[ block ] == NULL ) {
47b9c: 4a98 tstl %a0@+
47b9e: 66f2 bnes 47b92 <_Objects_Extend_information+0x4a>
do_extend = false;
47ba0: 4207 clrb %d7
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
47ba2: 0281 0000 ffff andil #65535,%d1
47ba8: 2641 moveal %d1,%a3
47baa: d7c0 addal %d0,%a3
/*
* 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 ) {
47bac: b7fc 0000 ffff cmpal #65535,%a3
47bb2: 6200 0182 bhiw 47d36 <_Objects_Extend_information+0x1ee>
/*
* 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;
47bb6: 41ea 0014 lea %a2@(20),%a0
47bba: 4c10 0800 mulsl %a0@,%d0
if ( information->auto_extend ) {
47bbe: 4a2a 0010 tstb %a2@(16)
47bc2: 6700 0182 beqw 47d46 <_Objects_Extend_information+0x1fe>
new_object_block = _Workspace_Allocate( block_size );
47bc6: 2f00 movel %d0,%sp@-
47bc8: 4eb9 0004 9c42 jsr 49c42 <_Workspace_Allocate>
if ( !new_object_block )
47bce: 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 );
47bd0: 2c00 movel %d0,%d6
if ( !new_object_block )
47bd2: 6700 0162 beqw 47d36 <_Objects_Extend_information+0x1ee>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
47bd6: 4a07 tstb %d7
47bd8: 6700 00c4 beqw 47c9e <_Objects_Extend_information+0x156>
*/
/*
* Up the block count and maximum
*/
block_count++;
47bdc: 2a44 moveal %d4,%a5
47bde: 528d addql #1,%a5
/*
* 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 *));
47be0: 200b movel %a3,%d0
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
47be2: 41f5 da00 lea %a5@(00000000,%a5:l:2),%a0
((maximum + minimum_index) * sizeof(Objects_Control *));
47be6: d088 addl %a0,%d0
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
47be8: d085 addl %d5,%d0
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
47bea: e588 lsll #2,%d0
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
47bec: 2f00 movel %d0,%sp@-
47bee: 4eb9 0004 9c42 jsr 49c42 <_Workspace_Allocate>
if ( !object_blocks ) {
47bf4: 588f addql #4,%sp
* 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 *));
object_blocks = (void**) _Workspace_Allocate( block_size );
47bf6: 2840 moveal %d0,%a4
if ( !object_blocks ) {
47bf8: 4a80 tstl %d0
47bfa: 6700 01ce beqw 47dca <_Objects_Extend_information+0x282>
}
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
47bfe: 2e0d movel %a5,%d7
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
47c00: 4280 clrl %d0
}
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
47c02: e58f lsll #2,%d7
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
47c04: 302a 000e movew %a2@(14),%d0
47c08: 4bf4 7800 lea %a4@(00000000,%d7:l),%a5
47c0c: de8d addl %a5,%d7
47c0e: b085 cmpl %d5,%d0
47c10: 6200 0144 bhiw 47d56 <_Objects_Extend_information+0x20e>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
47c14: 4a85 tstl %d5
47c16: 670c beqs 47c24 <_Objects_Extend_information+0xdc><== NEVER TAKEN
47c18: 2047 moveal %d7,%a0
47c1a: 4280 clrl %d0
local_table[ index ] = NULL;
47c1c: 4298 clrl %a0@+
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
47c1e: 5280 addql #1,%d0
47c20: b085 cmpl %d5,%d0
47c22: 65f8 bcss 47c1c <_Objects_Extend_information+0xd4><== NEVER TAKEN
47c24: 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 );
47c26: 4281 clrl %d1
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
47c28: 42b4 4800 clrl %a4@(00000000,%d4:l)
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
47c2c: 322a 0012 movew %a2@(18),%d1
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
47c30: 42b5 4800 clrl %a5@(00000000,%d4:l)
for ( index=index_base ;
index < ( information->allocation_size + index_base );
47c34: d283 addl %d3,%d1
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
47c36: b283 cmpl %d3,%d1
47c38: 6310 blss 47c4a <_Objects_Extend_information+0x102><== NEVER TAKEN
47c3a: 2247 moveal %d7,%a1
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
47c3c: 2003 movel %d3,%d0
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
47c3e: 41f1 3c00 lea %a1@(00000000,%d3:l:4),%a0
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
47c42: 4298 clrl %a0@+
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
47c44: 5280 addql #1,%d0
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
47c46: b280 cmpl %d0,%d1
47c48: 62f8 bhis 47c42 <_Objects_Extend_information+0xfa>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
47c4a: 203c 0000 0700 movel #1792,%d0
47c50: 40c4 movew %sr,%d4
47c52: 8084 orl %d4,%d0
47c54: 46c0 movew %d0,%sr
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
47c56: 2012 movel %a2@,%d0
47c58: 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(
47c5a: 4281 clrl %d1
47c5c: eba8 lsll %d5,%d0
47c5e: 4285 clrl %d5
47c60: 3a0b movew %a3,%d5
47c62: 322a 0004 movew %a2@(4),%d1
47c66: 08c0 0010 bset #16,%d0
47c6a: 2245 moveal %d5,%a1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
47c6c: 7a1b moveq #27,%d5
47c6e: eba9 lsll %d5,%d1
local_table[ index ] = NULL;
}
_ISR_Disable( level );
old_tables = information->object_blocks;
47c70: 206a 002e moveal %a2@(46),%a0
47c74: 8081 orl %d1,%d0
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
47c76: 2209 movel %a1,%d1
47c78: 8280 orl %d0,%d1
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
47c7a: 354b 000e movew %a3,%a2@(14)
_ISR_Disable( level );
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
47c7e: 254c 002e movel %a4,%a2@(46)
information->inactive_per_block = inactive_per_block;
47c82: 254d 002a movel %a5,%a2@(42)
47c86: 2541 000a movel %d1,%a2@(10)
information->local_table = local_table;
47c8a: 2547 0018 movel %d7,%a2@(24)
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
47c8e: 46c4 movew %d4,%sr
if ( old_tables )
47c90: 4a88 tstl %a0
47c92: 670a beqs 47c9e <_Objects_Extend_information+0x156>
_Workspace_Free( old_tables );
47c94: 2f08 movel %a0,%sp@-
47c96: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
47c9c: 588f addql #4,%sp
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
47c9e: 206a 002e moveal %a2@(46),%a0
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
47ca2: 4280 clrl %d0
47ca4: 280e movel %fp,%d4
47ca6: 0684 ffff fff4 addil #-12,%d4
47cac: 47f9 0004 709c lea 4709c <_Chain_Get>,%a3
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
47cb2: 2a0a movel %a2,%d5
47cb4: 0685 0000 001c addil #28,%d5
47cba: 49f9 0004 703c lea 4703c <_Chain_Append>,%a4
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
47cc0: e58a lsll #2,%d2
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
47cc2: 302a 0012 movew %a2@(18),%d0
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
47cc6: 2186 2800 movel %d6,%a0@(00000000,%d2:l)
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
47cca: 2f2a 0014 movel %a2@(20),%sp@-
47cce: 2f00 movel %d0,%sp@-
47cd0: 2f06 movel %d6,%sp@-
47cd2: 2f04 movel %d4,%sp@-
47cd4: 4eb9 0004 ba64 jsr 4ba64 <_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 ) {
47cda: 4fef 0010 lea %sp@(16),%sp
47cde: 2f04 movel %d4,%sp@-
47ce0: 4e93 jsr %a3@
47ce2: 588f addql #4,%sp
47ce4: 4a80 tstl %d0
47ce6: 6734 beqs 47d1c <_Objects_Extend_information+0x1d4><== NEVER TAKEN
47ce8: 2212 movel %a2@,%d1
47cea: 7e18 moveq #24,%d7
the_object->id = _Objects_Build_id(
47cec: 4286 clrl %d6
47cee: 2040 moveal %d0,%a0
47cf0: 3c2a 0004 movew %a2@(4),%d6
47cf4: efa9 lsll %d7,%d1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
47cf6: 1e3c 001b moveb #27,%d7
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
47cfa: 08c1 0010 bset #16,%d1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
47cfe: efae lsll %d7,%d6
47d00: 8286 orl %d6,%d1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
47d02: 8283 orl %d3,%d1
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
47d04: 5283 addql #1,%d3
47d06: 2141 0008 movel %d1,%a0@(8)
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
47d0a: 2f00 movel %d0,%sp@-
47d0c: 2f05 movel %d5,%sp@-
47d0e: 4e94 jsr %a4@
index++;
47d10: 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 ) {
47d12: 2f04 movel %d4,%sp@-
47d14: 4e93 jsr %a3@
47d16: 588f addql #4,%sp
47d18: 4a80 tstl %d0
47d1a: 66cc bnes 47ce8 <_Objects_Extend_information+0x1a0>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
47d1c: 4281 clrl %d1
47d1e: 302a 0012 movew %a2@(18),%d0
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
47d22: 326a 0028 moveaw %a2@(40),%a1
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
47d26: 206a 002a moveal %a2@(42),%a0
47d2a: 3200 movew %d0,%d1
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
47d2c: d089 addl %a1,%d0
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
47d2e: 2181 2800 movel %d1,%a0@(00000000,%d2:l)
information->inactive =
47d32: 3540 0028 movew %d0,%a2@(40)
(Objects_Maximum)(information->inactive + information->allocation_size);
}
47d36: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
47d3c: 4e5e unlk %fp
47d3e: 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;
47d40: 7e01 moveq #1,%d7
47d42: 6000 fe5e braw 47ba2 <_Objects_Extend_information+0x5a>
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 );
47d46: 2f00 movel %d0,%sp@-
47d48: 4eb9 0004 9c76 jsr 49c76 <_Workspace_Allocate_or_fatal_error>
47d4e: 588f addql #4,%sp
47d50: 2c00 movel %d0,%d6
47d52: 6000 fe82 braw 47bd6 <_Objects_Extend_information+0x8e>
/*
* 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,
47d56: e58c lsll #2,%d4
47d58: 2f04 movel %d4,%sp@-
47d5a: 2f2a 002e movel %a2@(46),%sp@-
47d5e: 2f0c movel %a4,%sp@-
47d60: 4eb9 0004 e318 jsr 4e318 <memcpy>
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
47d66: 2f04 movel %d4,%sp@-
47d68: 2f2a 002a movel %a2@(42),%sp@-
47d6c: 2f0d movel %a5,%sp@-
47d6e: 4eb9 0004 e318 jsr 4e318 <memcpy>
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
47d74: 4280 clrl %d0
47d76: 302a 000e movew %a2@(14),%d0
47d7a: 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,
47d7c: e58d lsll #2,%d5
47d7e: 2f05 movel %d5,%sp@-
47d80: 2f2a 0018 movel %a2@(24),%sp@-
47d84: 2f07 movel %d7,%sp@-
47d86: 4eb9 0004 e318 jsr 4e318 <memcpy>
47d8c: 4fef 0024 lea %sp@(36),%sp
47d90: 6000 fe94 braw 47c26 <_Objects_Extend_information+0xde>
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
47d94: 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 );
47d96: 2605 movel %d5,%d3
index_base = minimum_index;
block = 0;
47d98: 4282 clrl %d2
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
47d9a: 4284 clrl %d4
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
47d9c: 322a 000e movew %a2@(14),%d1
47da0: 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;
47da4: 7e01 moveq #1,%d7
47da6: 6000 fdfa braw 47ba2 <_Objects_Extend_information+0x5a>
minimum_index = _Objects_Get_index( information->minimum_id );
47daa: 2605 movel %d5,%d3 <== NOT EXECUTED
index_base = minimum_index;
block = 0;
47dac: 4282 clrl %d2 <== NOT EXECUTED
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
47dae: 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;
47db4: 7e01 moveq #1,%d7 <== NOT EXECUTED
47db6: 6000 fdea braw 47ba2 <_Objects_Extend_information+0x5a><== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
47dba: 2605 movel %d5,%d3 <== NOT EXECUTED
index_base = minimum_index;
block = 0;
47dbc: 4282 clrl %d2 <== NOT EXECUTED
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
47dbe: 0280 0000 ffff andil #65535,%d0 <== NOT EXECUTED
do_extend = false;
47dc4: 4207 clrb %d7 <== NOT EXECUTED
47dc6: 6000 fdda braw 47ba2 <_Objects_Extend_information+0x5a><== NOT EXECUTED
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
47dca: 2f06 movel %d6,%sp@-
47dcc: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
return;
47dd2: 588f addql #4,%sp
}
information->inactive_per_block[ block ] = information->allocation_size;
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
}
47dd4: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
47dda: 4e5e unlk %fp
...
00047e90 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint32_t the_class
)
{
47e90: 4e56 0000 linkw %fp,#0
47e94: 2f02 movel %d2,%sp@-
47e96: 242e 000c movel %fp@(12),%d2
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
47e9a: 660a bnes 47ea6 <_Objects_Get_information+0x16>
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
return NULL;
47e9c: 4280 clrl %d0
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
47e9e: 242e fffc movel %fp@(-4),%d2
47ea2: 4e5e unlk %fp
47ea4: 4e75 rts
/*
* 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 );
47ea6: 2f2e 0008 movel %fp@(8),%sp@-
47eaa: 4eb9 0004 bfac jsr 4bfac <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
47eb0: 588f addql #4,%sp
47eb2: 4a80 tstl %d0
47eb4: 67e6 beqs 47e9c <_Objects_Get_information+0xc>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
47eb6: b082 cmpl %d2,%d0
47eb8: 65e2 bcss 47e9c <_Objects_Get_information+0xc>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
47eba: 202e 0008 movel %fp@(8),%d0
47ebe: 41f9 0005 e3d8 lea 5e3d8 <_Objects_Information_table>,%a0
47ec4: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
47ec8: 4a88 tstl %a0
47eca: 67d0 beqs 47e9c <_Objects_Get_information+0xc> <== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
47ecc: 2030 2c00 movel %a0@(00000000,%d2:l:4),%d0
if ( !info )
47ed0: 67cc beqs 47e9e <_Objects_Get_information+0xe> <== NEVER TAKEN
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
return NULL;
47ed2: 2040 moveal %d0,%a0
47ed4: 4a68 000e tstw %a0@(14)
47ed8: 56c1 sne %d1
#endif
return info;
}
47eda: 242e fffc movel %fp@(-4),%d2
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
return NULL;
47ede: 49c1 extbl %d1
#endif
return info;
}
47ee0: 4e5e unlk %fp
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
return NULL;
47ee2: c081 andl %d1,%d0
#endif
return info;
}
...
00049988 <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
49988: 4e56 ffdc linkw %fp,#-36
4998c: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
49990: 262e 000c movel %fp@(12),%d3
49994: 242e 0010 movel %fp@(16),%d2
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
49998: 4a83 tstl %d3
4999a: 660e bnes 499aa <_Objects_Get_name_as_string+0x22>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
4999c: 4282 clrl %d2
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
4999e: 2002 movel %d2,%d0
499a0: 4cee 0c3c ffdc moveml %fp@(-36),%d2-%d5/%a2-%a3
499a6: 4e5e unlk %fp
499a8: 4e75 rts
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
499aa: 4a82 tstl %d2
499ac: 67f0 beqs 4999e <_Objects_Get_name_as_string+0x16>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
499ae: 4aae 0008 tstl %fp@(8)
499b2: 6600 00b4 bnew 49a68 <_Objects_Get_name_as_string+0xe0>
499b6: 2079 0006 8c28 moveal 68c28 <_Per_CPU_Information+0xc>,%a0
499bc: 2828 0008 movel %a0@(8),%d4
information = _Objects_Get_information_id( tmpId );
499c0: 2f04 movel %d4,%sp@-
499c2: 4eb9 0004 98a4 jsr 498a4 <_Objects_Get_information_id>
if ( !information )
499c8: 588f addql #4,%sp
499ca: 4a80 tstl %d0
499cc: 67ce beqs 4999c <_Objects_Get_name_as_string+0x14>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
499ce: 486e fffc pea %fp@(-4)
499d2: 2f04 movel %d4,%sp@-
499d4: 2f00 movel %d0,%sp@-
499d6: 4eb9 0004 9a7c jsr 49a7c <_Objects_Get>
switch ( location ) {
499dc: 4fef 000c lea %sp@(12),%sp
499e0: 4aae fffc tstl %fp@(-4)
499e4: 66b6 bnes 4999c <_Objects_Get_name_as_string+0x14>
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
499e6: 2040 moveal %d0,%a0
lname[ 0 ] = (u32_name >> 24) & 0xff;
499e8: 7818 moveq #24,%d4
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
499ea: 5383 subql #1,%d3
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
499ec: 2228 000c movel %a0@(12),%d1
lname[ 0 ] = (u32_name >> 24) & 0xff;
499f0: 2001 movel %d1,%d0
499f2: e8a8 lsrl %d4,%d0
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
499f4: 2801 movel %d1,%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;
499f6: 2a01 movel %d1,%d5
lname[ 2 ] = (u32_name >> 8) & 0xff;
499f8: e08c lsrl #8,%d4
lname[ 3 ] = (u32_name >> 0) & 0xff;
499fa: 1d41 fffa moveb %d1,%fp@(-6)
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
499fe: 4245 clrw %d5
49a00: 4845 swap %d5
lname[ 2 ] = (u32_name >> 8) & 0xff;
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
49a02: 4201 clrb %d1
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
49a04: 1d40 fff7 moveb %d0,%fp@(-9)
lname[ 1 ] = (u32_name >> 16) & 0xff;
49a08: 1d45 fff8 moveb %d5,%fp@(-8)
lname[ 2 ] = (u32_name >> 8) & 0xff;
49a0c: 1d44 fff9 moveb %d4,%fp@(-7)
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
49a10: 1d41 fffb moveb %d1,%fp@(-5)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
49a14: 4a83 tstl %d3
49a16: 6758 beqs 49a70 <_Objects_Get_name_as_string+0xe8><== NEVER TAKEN
49a18: 4a00 tstb %d0
49a1a: 6754 beqs 49a70 <_Objects_Get_name_as_string+0xe8>
49a1c: 280e movel %fp,%d4
49a1e: 43ee fff8 lea %fp@(-8),%a1
49a22: 2042 moveal %d2,%a0
49a24: 0684 ffff fff7 addil #-9,%d4
*d = (isprint((unsigned char)*s)) ? *s : '*';
49a2a: 4281 clrl %d1
49a2c: 1200 moveb %d0,%d1
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
49a2e: 2449 moveal %a1,%a2
49a30: 95c4 subal %d4,%a2
*d = (isprint((unsigned char)*s)) ? *s : '*';
49a32: 2679 0005 f63c moveal 5f63c <__ctype_ptr__>,%a3
49a38: 1233 1801 moveb %a3@(00000001,%d1:l),%d1
49a3c: 49c1 extbl %d1
49a3e: 0281 0000 0097 andil #151,%d1
49a44: 6602 bnes 49a48 <_Objects_Get_name_as_string+0xc0>
49a46: 702a moveq #42,%d0
49a48: 10c0 moveb %d0,%a0@+
49a4a: 2648 moveal %a0,%a3
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
49a4c: b5c3 cmpal %d3,%a2
49a4e: 6404 bccs 49a54 <_Objects_Get_name_as_string+0xcc>
49a50: 1019 moveb %a1@+,%d0
49a52: 66d6 bnes 49a2a <_Objects_Get_name_as_string+0xa2>
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
49a54: 4213 clrb %a3@
_Thread_Enable_dispatch();
49a56: 4eb9 0004 a2e2 jsr 4a2e2 <_Thread_Enable_dispatch>
return name;
}
return NULL; /* unreachable path */
}
49a5c: 2002 movel %d2,%d0
49a5e: 4cee 0c3c ffdc moveml %fp@(-36),%d2-%d5/%a2-%a3
49a64: 4e5e unlk %fp
49a66: 4e75 rts
return NULL;
if ( name == NULL )
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
49a68: 282e 0008 movel %fp@(8),%d4
49a6c: 6000 ff52 braw 499c0 <_Objects_Get_name_as_string+0x38>
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
49a70: 2642 moveal %d2,%a3
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
49a72: 4213 clrb %a3@
_Thread_Enable_dispatch();
49a74: 4eb9 0004 a2e2 jsr 4a2e2 <_Thread_Enable_dispatch>
49a7a: 60e0 bras 49a5c <_Objects_Get_name_as_string+0xd4>
0005bad0 <_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;
5bad0: 7001 moveq #1,%d0
if ( information->maximum >= index ) {
5bad2: 4281 clrl %d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
5bad4: 4e56 0000 linkw %fp,#0
5bad8: 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;
5badc: 90a8 0006 subl %a0@(6),%d0
5bae0: d0ae 000c addl %fp@(12),%d0
if ( information->maximum >= index ) {
5bae4: 3228 000e movew %a0@(14),%d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
5bae8: 226e 0010 moveal %fp@(16),%a1
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
if ( information->maximum >= index ) {
5baec: b280 cmpl %d0,%d1
5baee: 6510 bcss 5bb00 <_Objects_Get_no_protection+0x30>
if ( (the_object = information->local_table[ index ]) != NULL ) {
5baf0: 2068 0018 moveal %a0@(24),%a0
5baf4: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
5baf8: 6706 beqs 5bb00 <_Objects_Get_no_protection+0x30><== NEVER TAKEN
*location = OBJECTS_LOCAL;
5bafa: 4291 clrl %a1@
* 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;
}
5bafc: 4e5e unlk %fp
5bafe: 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;
5bb00: 7001 moveq #1,%d0
return NULL;
}
5bb02: 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;
5bb04: 2280 movel %d0,%a1@
return NULL;
5bb06: 4280 clrl %d0
}
...
000496a4 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
496a4: 4e56 fffc linkw %fp,#-4
496a8: 222e 0008 movel %fp@(8),%d1
496ac: 2f02 movel %d2,%sp@-
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
496ae: 4a81 tstl %d1
496b0: 660a bnes 496bc <_Objects_Id_to_name+0x18>
496b2: 2079 0006 02b8 moveal 602b8 <_Per_CPU_Information+0xc>,%a0
496b8: 2228 0008 movel %a0@(8),%d1
496bc: 7418 moveq #24,%d2
496be: 2001 movel %d1,%d0
496c0: e4a8 lsrl %d2,%d0
496c2: 143c 0007 moveb #7,%d2
496c6: c082 andl %d2,%d0
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
496c8: 143c 0002 moveb #2,%d2
496cc: 2040 moveal %d0,%a0
496ce: 5388 subql #1,%a0
496d0: b488 cmpl %a0,%d2
496d2: 654a bcss 4971e <_Objects_Id_to_name+0x7a> <== NEVER TAKEN
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
496d4: 41f9 0006 00b0 lea 600b0 <_Objects_Information_table>,%a0
496da: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
496de: 4a88 tstl %a0
496e0: 673c beqs 4971e <_Objects_Id_to_name+0x7a> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
496e2: 2001 movel %d1,%d0
496e4: 741b moveq #27,%d2
496e6: e4a8 lsrl %d2,%d0
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
496e8: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
if ( !information )
496ec: 6730 beqs 4971e <_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 );
496ee: 486e fffc pea %fp@(-4)
496f2: 2f01 movel %d1,%sp@-
496f4: 2f00 movel %d0,%sp@-
496f6: 4eb9 0004 9638 jsr 49638 <_Objects_Get>
if ( !the_object )
496fc: 4fef 000c lea %sp@(12),%sp
49700: 4a80 tstl %d0
49702: 671a beqs 4971e <_Objects_Id_to_name+0x7a> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
*name = the_object->name;
49704: 206e 000c moveal %fp@(12),%a0
49708: 2240 moveal %d0,%a1
4970a: 20a9 000c movel %a1@(12),%a0@
_Thread_Enable_dispatch();
4970e: 4eb9 0004 9fa2 jsr 49fa2 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
49714: 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;
49718: 4280 clrl %d0
}
4971a: 4e5e unlk %fp
4971c: 4e75 rts
4971e: 242e fff8 movel %fp@(-8),%d2
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
49722: 7003 moveq #3,%d0
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
49724: 4e5e unlk %fp <== NOT EXECUTED
00047fb4 <_Objects_Initialize_information>:
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
47fb4: 43f9 0005 e3d8 lea 5e3d8 <_Objects_Information_table>,%a1
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
47fba: 4e56 fff0 linkw %fp,#-16
47fbe: 202e 000c movel %fp@(12),%d0
47fc2: 48d7 003c moveml %d2-%d5,%sp@
47fc6: 4283 clrl %d3
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
47fc8: 2271 0c00 moveal %a1@(00000000,%d0:l:4),%a1
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
47fcc: 206e 0008 moveal %fp@(8),%a0
47fd0: 362e 001a movew %fp@(26),%d3
47fd4: 222e 0014 movel %fp@(20),%d1
uint32_t index;
#endif
information->the_api = the_api;
information->the_class = the_class;
information->size = size;
47fd8: 2143 0014 movel %d3,%a0@(20)
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
47fdc: 242e 0010 movel %fp@(16),%d2
information->the_class = the_class;
information->size = size;
information->local_table = 0;
information->inactive_per_block = 0;
information->object_blocks = 0;
information->inactive = 0;
47fe0: 4243 clrw %d3
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
47fe2: 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;
47fe6: 3143 0028 movew %d3,%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;
47fea: 3143 000e movew %d3,%a0@(14)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
47fee: 2601 movel %d1,%d3
uint32_t maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
47ff0: 2080 movel %d0,%a0@
information->the_class = the_class;
47ff2: 3142 0004 movew %d2,%a0@(4)
information->size = size;
information->local_table = 0;
47ff6: 42a8 0018 clrl %a0@(24)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
47ffa: d683 addl %d3,%d3
47ffc: 9783 subxl %d3,%d3
47ffe: 4483 negl %d3
information->the_api = the_api;
information->the_class = the_class;
information->size = size;
information->local_table = 0;
information->inactive_per_block = 0;
48000: 42a8 002a clrl %a0@(42)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
48004: 0881 001f bclr #31,%d1
information->the_api = the_api;
information->the_class = the_class;
information->size = size;
information->local_table = 0;
information->inactive_per_block = 0;
information->object_blocks = 0;
48008: 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;
4800c: 2388 2c00 movel %a0,%a1@(00000000,%d2:l:4)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
48010: 1143 0010 moveb %d3,%a0@(16)
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
48014: 4a83 tstl %d3
48016: 6706 beqs 4801e <_Objects_Initialize_information+0x6a>
48018: 4a81 tstl %d1
4801a: 6700 0092 beqw 480ae <_Objects_Initialize_information+0xfa>
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
4801e: 7a18 moveq #24,%d5
information->local_table = &null_local_table;
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
48020: 4a81 tstl %d1
48022: 56c3 sne %d3
48024: eba8 lsll %d5,%d0
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
48026: 1a3c 001b moveb #27,%d5
4802a: 49c3 extbl %d3
4802c: 4483 negl %d3
information->allocation_size = maximum_per_allocation;
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
4802e: 43f9 0005 dbd4 lea 5dbd4 <null_local_table.3094>,%a1
48034: ebaa lsll %d5,%d2
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48036: 08c0 0010 bset #16,%d0
/*
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
4803a: 1a3c 0003 moveb #3,%d5
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
4803e: 8082 orl %d2,%d0
48040: ca84 andl %d4,%d5
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
48042: 3141 0012 movew %d1,%a0@(18)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
48046: 8083 orl %d3,%d0
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
48048: 2149 0018 movel %a1,%a0@(24)
4804c: 2140 0006 movel %d0,%a0@(6)
/*
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
48050: 4a85 tstl %d5
48052: 6626 bnes 4807a <_Objects_Initialize_information+0xc6><== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
48054: 43e8 0020 lea %a0@(32),%a1
48058: 2149 001c movel %a1,%a0@(28)
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
_Chain_Initialize_empty( &information->Inactive );
4805c: 43e8 001c lea %a0@(28),%a1
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
48060: 3144 0032 movew %d4,%a0@(50)
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
48064: 42a8 0020 clrl %a0@(32)
_Chain_Initialize_empty( &information->Inactive );
48068: 2149 0024 movel %a1,%a0@(36)
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
4806c: 4a81 tstl %d1
4806e: 662c bnes 4809c <_Objects_Initialize_information+0xe8>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
48070: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5
48076: 4e5e unlk %fp
48078: 4e75 rts
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
4807a: 5884 addql #4,%d4 <== NOT EXECUTED
4807c: 70fc moveq #-4,%d0 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4807e: 43e8 0020 lea %a0@(32),%a1 <== NOT EXECUTED
48082: c880 andl %d0,%d4 <== NOT EXECUTED
48084: 2149 001c movel %a1,%a0@(28) <== NOT EXECUTED
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
_Chain_Initialize_empty( &information->Inactive );
48088: 43e8 001c lea %a0@(28),%a1 <== NOT EXECUTED
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
4808c: 3144 0032 movew %d4,%a0@(50) <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
48090: 42a8 0020 clrl %a0@(32) <== NOT EXECUTED
_Chain_Initialize_empty( &information->Inactive );
48094: 2149 0024 movel %a1,%a0@(36) <== NOT EXECUTED
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
48098: 4a81 tstl %d1 <== NOT EXECUTED
4809a: 67d4 beqs 48070 <_Objects_Initialize_information+0xbc><== NOT EXECUTED
/*
* 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 );
4809c: 2d48 0008 movel %a0,%fp@(8)
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
480a0: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5
480a6: 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 );
480a8: 4ef9 0004 7b48 jmp 47b48 <_Objects_Extend_information>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
480ae: 4878 0013 pea 13 <INVALID_OPERATION+0x3>
480b2: 4878 0001 pea 1 <ADD>
480b6: 42a7 clrl %sp@-
480b8: 4eb9 0004 79c8 jsr 479c8 <_Internal_error_Occurred>
...
00048150 <_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) /
48150: 4281 clrl %d1
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
48152: 4e56 ffec linkw %fp,#-20
48156: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
4815a: 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 );
4815e: 4283 clrl %d3
block_count = (information->maximum - index_base) /
48160: 4284 clrl %d4
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
48162: 362a 0008 movew %a2@(8),%d3
block_count = (information->maximum - index_base) /
48166: 382a 000e movew %a2@(14),%d4
4816a: 322a 0012 movew %a2@(18),%d1
4816e: 9883 subl %d3,%d4
48170: 4c41 4004 remul %d1,%d4,%d4
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
48174: 6774 beqs 481ea <_Objects_Shrink_information+0x9a><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
48176: 206a 002a moveal %a2@(42),%a0
4817a: b290 cmpl %a0@,%d1
4817c: 677e beqs 481fc <_Objects_Shrink_information+0xac><== NEVER TAKEN
* the_block - the block to remove
*
* Output parameters: NONE
*/
void _Objects_Shrink_information(
4817e: 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++ ) {
48180: 4280 clrl %d0
48182: 5280 addql #1,%d0
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
48184: d681 addl %d1,%d3
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
48186: b084 cmpl %d4,%d0
48188: 6460 bccs 481ea <_Objects_Shrink_information+0x9a>
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
4818a: 2400 movel %d0,%d2
4818c: e58a lsll #2,%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++ ) {
if ( information->inactive_per_block[ block ] ==
4818e: b298 cmpl %a0@+,%d1
48190: 66f0 bnes 48182 <_Objects_Shrink_information+0x32>
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) information->Inactive.first;
48192: 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 );
48196: 47f9 0004 7074 lea 47074 <_Chain_Extract>,%a3
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) information->Inactive.first;
do {
index = _Objects_Get_index( the_object->id );
4819c: 4280 clrl %d0
4819e: 3028 000a movew %a0@(10),%d0
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
481a2: 2810 movel %a0@,%d4
if ((index >= index_base) &&
481a4: b680 cmpl %d0,%d3
481a6: 620c bhis 481b4 <_Objects_Shrink_information+0x64>
(index < (index_base + information->allocation_size))) {
481a8: 4281 clrl %d1
481aa: 322a 0012 movew %a2@(18),%d1
481ae: d283 addl %d3,%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) &&
481b0: b280 cmpl %d0,%d1
481b2: 6240 bhis 481f4 <_Objects_Shrink_information+0xa4>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
481b4: 4a84 tstl %d4
481b6: 6704 beqs 481bc <_Objects_Shrink_information+0x6c>
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;
481b8: 2044 moveal %d4,%a0
481ba: 60e0 bras 4819c <_Objects_Shrink_information+0x4c>
while ( the_object );
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
481bc: 206a 002e moveal %a2@(46),%a0
481c0: 2f30 2800 movel %a0@(00000000,%d2:l),%sp@-
481c4: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
information->object_blocks[ block ] = NULL;
481ca: 206a 002e moveal %a2@(46),%a0
information->inactive_per_block[ block ] = 0;
information->inactive -= information->allocation_size;
return;
481ce: 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;
481d0: 42b0 2800 clrl %a0@(00000000,%d2:l)
information->inactive_per_block[ block ] = 0;
481d4: 206a 002a moveal %a2@(42),%a0
information->inactive -= information->allocation_size;
481d8: 302a 0028 movew %a2@(40),%d0
481dc: 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;
481e0: 42b0 2800 clrl %a0@(00000000,%d2:l)
information->inactive -= information->allocation_size;
481e4: 9081 subl %d1,%d0
481e6: 3540 0028 movew %d0,%a2@(40)
return;
}
index_base += information->allocation_size;
}
}
481ea: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
481f0: 4e5e unlk %fp
481f2: 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 );
481f4: 2f08 movel %a0,%sp@-
481f6: 4e93 jsr %a3@
481f8: 588f addql #4,%sp
481fa: 60b8 bras 481b4 <_Objects_Shrink_information+0x64>
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) information->Inactive.first;
481fc: 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 ] ==
48200: 4282 clrl %d2 <== 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 );
48202: 47f9 0004 7074 lea 47074 <_Chain_Extract>,%a3 <== NOT EXECUTED
48208: 6092 bras 4819c <_Objects_Shrink_information+0x4c><== NOT EXECUTED
...
0004b8ba <_RTEMS_tasks_Create_extension>:
bool _RTEMS_tasks_Create_extension(
Thread_Control *executing,
Thread_Control *created
)
{
4b8ba: 4e56 0000 linkw %fp,#0
4b8be: 2f0a movel %a2,%sp@-
4b8c0: 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() )
4b8c4: 4a39 0005 ccc4 tstb 5ccc4 <Configuration_RTEMS_API+0x4>
4b8ca: 6758 beqs 4b924 <_RTEMS_tasks_Create_extension+0x6a>
/*
* 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 );
4b8cc: 705e moveq #94,%d0
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
4b8ce: 2f00 movel %d0,%sp@-
4b8d0: 4eb9 0004 9c42 jsr 49c42 <_Workspace_Allocate>
if ( !api )
4b8d6: 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 );
4b8d8: 2040 moveal %d0,%a0
if ( !api )
4b8da: 4a80 tstl %d0
4b8dc: 6758 beqs 4b936 <_RTEMS_tasks_Create_extension+0x7c>
return false;
created->API_Extensions[ THREAD_API_RTEMS ] = api;
4b8de: 2540 0108 movel %d0,%a2@(264)
*/
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
ASR_Information *information
)
{
information->is_enabled = false;
4b8e2: 4200 clrb %d0
api->pending_events = EVENT_SETS_NONE_PENDING;
4b8e4: 4290 clrl %a0@
4b8e6: 1140 0008 moveb %d0,%a0@(8)
api->event_condition = 0;
4b8ea: 42a8 0004 clrl %a0@(4)
information->handler = NULL;
4b8ee: 42a8 000a clrl %a0@(10)
information->mode_set = RTEMS_DEFAULT_MODES;
4b8f2: 42a8 000e clrl %a0@(14)
information->signals_posted = 0;
4b8f6: 42a8 0012 clrl %a0@(18)
information->signals_pending = 0;
4b8fa: 42a8 0016 clrl %a0@(22)
information->nest_level = 0;
4b8fe: 42a8 001a clrl %a0@(26)
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
4b902: 42aa 0114 clrl %a2@(276)
if ( rtems_configuration_get_notepads_enabled() ) {
4b906: 4a39 0005 ccc4 tstb 5ccc4 <Configuration_RTEMS_API+0x4>
4b90c: 670c beqs 4b91a <_RTEMS_tasks_Create_extension+0x60>
* task is created via another API, then this routine is invoked
* and this API given the opportunity to initialize its extension
* area.
*/
bool _RTEMS_tasks_Create_extension(
4b90e: 41e8 001e lea %a0@(30),%a0
4b912: 7010 moveq #16,%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;
4b914: 4298 clrl %a0@+
4b916: 5380 subql #1,%d0
api->event_condition = 0;
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
4b918: 66fa bnes 4b914 <_RTEMS_tasks_Create_extension+0x5a>
api->Notepads[i] = 0;
}
return true;
}
4b91a: 246e fffc moveal %fp@(-4),%a2
4b91e: 4e5e unlk %fp
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
4b920: 7001 moveq #1,%d0
}
4b922: 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));
4b924: 701e moveq #30,%d0
api = _Workspace_Allocate( to_allocate );
4b926: 2f00 movel %d0,%sp@-
4b928: 4eb9 0004 9c42 jsr 49c42 <_Workspace_Allocate>
if ( !api )
4b92e: 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 );
4b930: 2040 moveal %d0,%a0
if ( !api )
4b932: 4a80 tstl %d0
4b934: 66a8 bnes 4b8de <_RTEMS_tasks_Create_extension+0x24><== ALWAYS TAKEN
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
4b936: 246e fffc moveal %fp@(-4),%a2
4b93a: 4e5e unlk %fp
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
if ( !api )
return false;
4b93c: 4200 clrb %d0 <== NOT EXECUTED
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
0004b864 <_RTEMS_tasks_Delete_extension>:
void _RTEMS_tasks_Delete_extension(
Thread_Control *executing,
Thread_Control *deleted
)
{
4b864: 4e56 fff4 linkw %fp,#-12
4b868: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
4b86c: 246e 000c moveal %fp@(12),%a2
4b870: 47f9 0004 b98c lea 4b98c <_RTEMS_Tasks_Invoke_task_variable_dtor>,%a3
/*
* Free per task variable memory
*/
tvp = deleted->task_variables;
4b876: 206a 0114 moveal %a2@(276),%a0
deleted->task_variables = NULL;
4b87a: 42aa 0114 clrl %a2@(276)
while (tvp) {
4b87e: 4a88 tstl %a0
4b880: 671e beqs 4b8a0 <_RTEMS_tasks_Delete_extension+0x3c>
next = (rtems_task_variable_t *)tvp->next;
4b882: 2410 movel %a0@,%d2
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
4b884: 2f08 movel %a0,%sp@-
4b886: 2f0a movel %a2,%sp@-
4b888: 4e93 jsr %a3@
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
4b88a: 508f addql #8,%sp
4b88c: 4a82 tstl %d2
4b88e: 6710 beqs 4b8a0 <_RTEMS_tasks_Delete_extension+0x3c><== NEVER TAKEN
next = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
tvp = next;
4b890: 2042 moveal %d2,%a0
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = (rtems_task_variable_t *)tvp->next;
4b892: 2410 movel %a0@,%d2
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
4b894: 2f08 movel %a0,%sp@-
4b896: 2f0a movel %a2,%sp@-
4b898: 4e93 jsr %a3@
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
4b89a: 508f addql #8,%sp
4b89c: 4a82 tstl %d2
4b89e: 66f0 bnes 4b890 <_RTEMS_tasks_Delete_extension+0x2c>
/*
* Free API specific memory
*/
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
4b8a0: 2f2a 0108 movel %a2@(264),%sp@-
4b8a4: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
4b8aa: 588f addql #4,%sp
4b8ac: 42aa 0108 clrl %a2@(264)
}
4b8b0: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
4b8b6: 4e5e unlk %fp <== NOT EXECUTED
00046a6c <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
46a6c: 4e56 ffe4 linkw %fp,#-28
46a70: 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;
46a74: 2479 0005 ccea moveal 5ccea <Configuration_RTEMS_API+0x2a>,%a2
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
46a7a: 2639 0005 cce6 movel 5cce6 <Configuration_RTEMS_API+0x26>,%d3
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
46a80: 4a8a tstl %a2
46a82: 6754 beqs 46ad8 <_RTEMS_tasks_Initialize_user_tasks_body+0x6c>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
46a84: 4a83 tstl %d3
46a86: 6750 beqs 46ad8 <_RTEMS_tasks_Initialize_user_tasks_body+0x6c><== NEVER TAKEN
46a88: 280e movel %fp,%d4
46a8a: 4282 clrl %d2
46a8c: 5984 subql #4,%d4
46a8e: 47f9 0004 6844 lea 46844 <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(
46a94: 49f9 0004 6af4 lea 46af4 <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(
46a9a: 2f04 movel %d4,%sp@-
46a9c: 2f2a 000c movel %a2@(12),%sp@-
46aa0: 2f2a 0014 movel %a2@(20),%sp@-
46aa4: 2f2a 0004 movel %a2@(4),%sp@-
46aa8: 2f2a 0008 movel %a2@(8),%sp@-
46aac: 2f12 movel %a2@,%sp@-
46aae: 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 ) )
46ab0: 4fef 0018 lea %sp@(24),%sp
46ab4: 4a80 tstl %d0
46ab6: 662a bnes 46ae2 <_RTEMS_tasks_Initialize_user_tasks_body+0x76>
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
46ab8: 2f2a 0018 movel %a2@(24),%sp@-
46abc: 2f2a 0010 movel %a2@(16),%sp@-
46ac0: 2f2e fffc movel %fp@(-4),%sp@-
46ac4: 4e94 jsr %a4@
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
46ac6: 4fef 000c lea %sp@(12),%sp
46aca: 4a80 tstl %d0
46acc: 6614 bnes 46ae2 <_RTEMS_tasks_Initialize_user_tasks_body+0x76>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
46ace: 5282 addql #1,%d2
46ad0: 45ea 001c lea %a2@(28),%a2
46ad4: b483 cmpl %d3,%d2
46ad6: 65c2 bcss 46a9a <_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 );
}
}
46ad8: 4cee 1c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a4
46ade: 4e5e unlk %fp
46ae0: 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 );
46ae2: 2f00 movel %d0,%sp@-
46ae4: 4878 0001 pea 1 <ADD>
46ae8: 4878 0001 pea 1 <ADD>
46aec: 4eb9 0004 79c8 jsr 479c8 <_Internal_error_Occurred>
...
0004b7e8 <_RTEMS_tasks_Post_switch_extension>:
*/
void _RTEMS_tasks_Post_switch_extension(
Thread_Control *executing
)
{
4b7e8: 4e56 ffec linkw %fp,#-20
4b7ec: 206e 0008 moveal %fp@(8),%a0
4b7f0: 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 ];
4b7f4: 2468 0108 moveal %a0@(264),%a2
if ( !api )
4b7f8: 4a8a tstl %a2
4b7fa: 671a beqs 4b816 <_RTEMS_tasks_Post_switch_extension+0x2e><== NEVER TAKEN
* Signal Processing
*/
asr = &api->Signal;
_ISR_Disable( level );
4b7fc: 203c 0000 0700 movel #1792,%d0
4b802: 40c1 movew %sr,%d1
4b804: 8081 orl %d1,%d0
4b806: 46c0 movew %d0,%sr
signal_set = asr->signals_posted;
4b808: 242a 0012 movel %a2@(18),%d2
asr->signals_posted = 0;
4b80c: 42aa 0012 clrl %a2@(18)
_ISR_Enable( level );
4b810: 46c1 movew %d1,%sr
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
4b812: 4a82 tstl %d2
4b814: 660a bnes 4b820 <_RTEMS_tasks_Post_switch_extension+0x38>
(*asr->handler)( signal_set );
asr->nest_level -= 1;
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
}
4b816: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
4b81c: 4e5e unlk %fp
4b81e: 4e75 rts
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
return;
asr->nest_level += 1;
4b820: 52aa 001a addql #1,%a2@(26)
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
4b824: 260e movel %fp,%d3
4b826: 5983 subql #4,%d3
4b828: 47f9 0004 d5ac lea 4d5ac <rtems_task_mode>,%a3
4b82e: 2f03 movel %d3,%sp@-
4b830: 2f3c 0000 ffff movel #65535,%sp@-
4b836: 2f2a 000e movel %a2@(14),%sp@-
4b83a: 4e93 jsr %a3@
(*asr->handler)( signal_set );
4b83c: 2f02 movel %d2,%sp@-
4b83e: 206a 000a moveal %a2@(10),%a0
4b842: 4e90 jsr %a0@
asr->nest_level -= 1;
4b844: 53aa 001a subql #1,%a2@(26)
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
4b848: 2f03 movel %d3,%sp@-
4b84a: 2f3c 0000 ffff movel #65535,%sp@-
4b850: 2f2e fffc movel %fp@(-4),%sp@-
4b854: 4e93 jsr %a3@
4b856: 4fef 001c lea %sp@(28),%sp
}
4b85a: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
4b860: 4e5e unlk %fp <== NOT EXECUTED
0004b78e <_RTEMS_tasks_Switch_extension>:
void _RTEMS_tasks_Switch_extension(
Thread_Control *executing,
Thread_Control *heir
)
{
4b78e: 4e56 0000 linkw %fp,#0
4b792: 206e 0008 moveal %fp@(8),%a0
/*
* Per Task Variables
*/
tvp = executing->task_variables;
4b796: 2068 0114 moveal %a0@(276),%a0
while (tvp) {
4b79a: 4a88 tstl %a0
4b79c: 6712 beqs 4b7b0 <_RTEMS_tasks_Switch_extension+0x22>
tvp->tval = *tvp->ptr;
4b79e: 2268 0004 moveal %a0@(4),%a1
4b7a2: 2151 000c movel %a1@,%a0@(12)
*tvp->ptr = tvp->gval;
4b7a6: 22a8 0008 movel %a0@(8),%a1@
tvp = (rtems_task_variable_t *)tvp->next;
4b7aa: 2050 moveal %a0@,%a0
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
4b7ac: 4a88 tstl %a0
4b7ae: 66ee bnes 4b79e <_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;
4b7b0: 206e 000c moveal %fp@(12),%a0
4b7b4: 2068 0114 moveal %a0@(276),%a0
while (tvp) {
4b7b8: 4a88 tstl %a0
4b7ba: 6712 beqs 4b7ce <_RTEMS_tasks_Switch_extension+0x40>
tvp->gval = *tvp->ptr;
4b7bc: 2268 0004 moveal %a0@(4),%a1
4b7c0: 2151 0008 movel %a1@,%a0@(8)
*tvp->ptr = tvp->tval;
4b7c4: 22a8 000c movel %a0@(12),%a1@
tvp = (rtems_task_variable_t *)tvp->next;
4b7c8: 2050 moveal %a0@,%a0
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
4b7ca: 4a88 tstl %a0
4b7cc: 66ee bnes 4b7bc <_RTEMS_tasks_Switch_extension+0x2e><== NEVER TAKEN
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
}
}
4b7ce: 4e5e unlk %fp <== NOT EXECUTED
00047b44 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
47b44: 4e56 fffc linkw %fp,#-4
47b48: 2f0a movel %a2,%sp@-
47b4a: 486e fffc pea %fp@(-4)
47b4e: 2f2e 0008 movel %fp@(8),%sp@-
47b52: 4879 0006 0460 pea 60460 <_Rate_monotonic_Information>
47b58: 4eb9 0004 9a9c jsr 49a9c <_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 ) {
47b5e: 4fef 000c lea %sp@(12),%sp
47b62: 2440 moveal %d0,%a2
47b64: 4aae fffc tstl %fp@(-4)
47b68: 6636 bnes 47ba0 <_Rate_monotonic_Timeout+0x5c> <== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
47b6a: 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);
47b6e: 2028 0010 movel %a0@(16),%d0
47b72: 0280 0000 4000 andil #16384,%d0
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
47b78: 670a beqs 47b84 <_Rate_monotonic_Timeout+0x40>
47b7a: 202a 0008 movel %a2@(8),%d0
47b7e: b0a8 0020 cmpl %a0@(32),%d0
47b82: 675e beqs 47be2 <_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 ) {
47b84: 7001 moveq #1,%d0
47b86: b0aa 0038 cmpl %a2@(56),%d0
47b8a: 671c beqs 47ba8 <_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;
47b8c: 7004 moveq #4,%d0
47b8e: 2540 0038 movel %d0,%a2@(56)
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
47b92: 2039 0006 0554 movel 60554 <_Thread_Dispatch_disable_level>,%d0
47b98: 5380 subql #1,%d0
47b9a: 23c0 0006 0554 movel %d0,60554 <_Thread_Dispatch_disable_level>
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
47ba0: 246e fff8 moveal %fp@(-8),%a2
47ba4: 4e5e unlk %fp
47ba6: 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;
47ba8: 103c 0003 moveb #3,%d0
47bac: 2540 0038 movel %d0,%a2@(56)
_Rate_monotonic_Initiate_statistics( the_period );
47bb0: 2f0a movel %a2,%sp@-
47bb2: 4eb9 0004 7548 jsr 47548 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
47bb8: 256a 003c 001c movel %a2@(60),%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
47bbe: 486a 0010 pea %a2@(16)
47bc2: 4879 0006 0616 pea 60616 <_Watchdog_Ticks_chain>
47bc8: 4eb9 0004 b5c4 jsr 4b5c4 <_Watchdog_Insert>
47bce: 4fef 000c lea %sp@(12),%sp
47bd2: 2039 0006 0554 movel 60554 <_Thread_Dispatch_disable_level>,%d0
47bd8: 5380 subql #1,%d0
47bda: 23c0 0006 0554 movel %d0,60554 <_Thread_Dispatch_disable_level>
47be0: 60be bras 47ba0 <_Rate_monotonic_Timeout+0x5c>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
47be2: 2f3c 1003 fff8 movel #268697592,%sp@-
47be8: 2f08 movel %a0,%sp@-
47bea: 4eb9 0004 9f9c jsr 49f9c <_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 );
47bf0: 2f0a movel %a2,%sp@-
47bf2: 4eb9 0004 7548 jsr 47548 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
47bf8: 256a 003c 001c movel %a2@(60),%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
47bfe: 486a 0010 pea %a2@(16)
47c02: 4879 0006 0616 pea 60616 <_Watchdog_Ticks_chain>
47c08: 4eb9 0004 b5c4 jsr 4b5c4 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
47c0e: 4fef 0014 lea %sp@(20),%sp
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
47c12: 2039 0006 0554 movel 60554 <_Thread_Dispatch_disable_level>,%d0
47c18: 5380 subql #1,%d0
47c1a: 23c0 0006 0554 movel %d0,60554 <_Thread_Dispatch_disable_level>
47c20: 6000 ff7e braw 47ba0 <_Rate_monotonic_Timeout+0x5c>
00048ecc <_TOD_Set>:
*/
void _TOD_Set(
const struct timespec *time
)
{
48ecc: 4e56 0000 linkw %fp,#0
48ed0: 2039 0006 8a2c movel 68a2c <_Thread_Dispatch_disable_level>,%d0
48ed6: 5280 addql #1,%d0
48ed8: 2f0a movel %a2,%sp@-
48eda: 246e 0008 moveal %fp@(8),%a2
48ede: 23c0 0006 8a2c movel %d0,68a2c <_Thread_Dispatch_disable_level>
long seconds;
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
48ee4: 2039 0006 8ab6 movel 68ab6 <_TOD_Now>,%d0
if ( time->tv_sec < seconds )
48eea: 2212 movel %a2@,%d1
48eec: b280 cmpl %d0,%d1
48eee: 6d38 blts 48f28 <_TOD_Set+0x5c>
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
_Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
48ef0: 9280 subl %d0,%d1
48ef2: 2f01 movel %d1,%sp@-
48ef4: 42a7 clrl %sp@-
48ef6: 4879 0006 8ae2 pea 68ae2 <_Watchdog_Seconds_chain>
48efc: 4eb9 0004 b604 jsr 4b604 <_Watchdog_Adjust>
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
48f02: 23d2 0006 8ab6 movel %a2@,68ab6 <_TOD_Now>
48f08: 588a addql #4,%a2
48f0a: 4fef 000c lea %sp@(12),%sp
48f0e: 23d2 0006 8aba movel %a2@,68aba <_TOD_Now+0x4>
_TOD_Is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
}
48f14: 246e fffc moveal %fp@(-4),%a2
48f18: 4e5e unlk %fp
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
_TOD_Is_set = true;
48f1a: 7001 moveq #1,%d0
48f1c: 13c0 0006 8a3c moveb %d0,68a3c <_TOD_Is_set>
_TOD_Activate();
_Thread_Enable_dispatch();
48f22: 4ef9 0004 a2e2 jmp 4a2e2 <_Thread_Enable_dispatch>
48f28: 9081 subl %d1,%d0
48f2a: 2f00 movel %d0,%sp@-
48f2c: 4878 0001 pea 1 <ADD>
48f30: 4879 0006 8ae2 pea 68ae2 <_Watchdog_Seconds_chain>
48f36: 4eb9 0004 b604 jsr 4b604 <_Watchdog_Adjust>
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
48f3c: 23d2 0006 8ab6 movel %a2@,68ab6 <_TOD_Now>
48f42: 588a addql #4,%a2
48f44: 4fef 000c lea %sp@(12),%sp
48f48: 23d2 0006 8aba movel %a2@,68aba <_TOD_Now+0x4>
_TOD_Is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
}
48f4e: 246e fffc moveal %fp@(-4),%a2
48f52: 4e5e unlk %fp
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
_TOD_Is_set = true;
48f54: 7001 moveq #1,%d0
48f56: 13c0 0006 8a3c moveb %d0,68a3c <_TOD_Is_set>
_TOD_Activate();
_Thread_Enable_dispatch();
48f5c: 4ef9 0004 a2e2 jmp 4a2e2 <_Thread_Enable_dispatch>
...
00047580 <_TOD_Tickle_ticks>:
*
* Output parameters: NONE
*/
void _TOD_Tickle_ticks( void )
{
47580: 4e56 ffec linkw %fp,#-20
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
47584: 2239 0005 cd00 movel 5cd00 <Configuration+0xc>,%d1
*
* Output parameters: NONE
*/
void _TOD_Tickle_ticks( void )
{
4758a: 48d7 040c moveml %d2-%d3/%a2,%sp@
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
4758e: 240e movel %fp,%d2
47590: 5182 subql #8,%d2
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
47592: 263c 0000 03e8 movel #1000,%d3
47598: 4c03 1800 mulsl %d3,%d1
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
4759c: 45f9 0004 9628 lea 49628 <_Timespec_Add_to>,%a2
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
475a2: 2039 0005 e548 movel 5e548 <_Watchdog_Ticks_since_boot>,%d0
475a8: 5280 addql #1,%d0
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
475aa: 2f02 movel %d2,%sp@-
475ac: 4879 0005 e496 pea 5e496 <_TOD_Uptime>
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
475b2: 2d41 fffc movel %d1,%fp@(-4)
475b6: 42ae fff8 clrl %fp@(-8)
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
475ba: 23c0 0005 e548 movel %d0,5e548 <_Watchdog_Ticks_since_boot>
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
475c0: 4e92 jsr %a2@
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
475c2: 2f02 movel %d2,%sp@-
475c4: 4879 0005 e4a6 pea 5e4a6 <_TOD_Now>
475ca: 4e92 jsr %a2@
while ( seconds ) {
475cc: 4fef 0010 lea %sp@(16),%sp
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
475d0: 2400 movel %d0,%d2
while ( seconds ) {
475d2: 6716 beqs 475ea <_TOD_Tickle_ticks+0x6a>
475d4: 45f9 0004 9b60 lea 49b60 <_Watchdog_Tickle>,%a2
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
{
_Watchdog_Tickle( &_Watchdog_Seconds_chain );
475da: 4879 0005 e4d2 pea 5e4d2 <_Watchdog_Seconds_chain>
_Watchdog_Tickle_seconds();
seconds--;
475e0: 5382 subql #1,%d2
475e2: 4e92 jsr %a2@
_Timestamp_Add_to( &_TOD_Uptime, &tick );
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
while ( seconds ) {
475e4: 588f addql #4,%sp
475e6: 4a82 tstl %d2
475e8: 66f0 bnes 475da <_TOD_Tickle_ticks+0x5a> <== NEVER TAKEN
_Watchdog_Tickle_seconds();
seconds--;
}
}
475ea: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
475f0: 4e5e unlk %fp <== NOT EXECUTED
00047554 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
47554: 4e56 0000 linkw %fp,#0
47558: 206e 0008 moveal %fp@(8),%a0
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
4755c: 2039 0005 f540 movel 5f540 <Configuration+0xc>,%d0
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
47562: 2f02 movel %d2,%sp@-
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
47564: 4a88 tstl %a0
47566: 6762 beqs 475ca <_TOD_Validate+0x76> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
47568: 243c 000f 4240 movel #1000000,%d2
4756e: 4c40 2002 remul %d0,%d2,%d2
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
47572: b4a8 0018 cmpl %a0@(24),%d2
47576: 6352 blss 475ca <_TOD_Validate+0x76>
(the_tod->ticks >= ticks_per_second) ||
47578: 703b moveq #59,%d0
4757a: b0a8 0014 cmpl %a0@(20),%d0
4757e: 654a bcss 475ca <_TOD_Validate+0x76>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
47580: b0a8 0010 cmpl %a0@(16),%d0
47584: 6544 bcss 475ca <_TOD_Validate+0x76>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
47586: 7217 moveq #23,%d1
47588: b2a8 000c cmpl %a0@(12),%d1
4758c: 653c bcss 475ca <_TOD_Validate+0x76>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
4758e: 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) ||
47592: 6736 beqs 475ca <_TOD_Validate+0x76> <== NEVER TAKEN
(the_tod->month == 0) ||
47594: 740c moveq #12,%d2
47596: b480 cmpl %d0,%d2
47598: 6530 bcss 475ca <_TOD_Validate+0x76>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
4759a: 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) ||
4759c: 0c81 0000 07c3 cmpil #1987,%d1
475a2: 6326 blss 475ca <_TOD_Validate+0x76>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
475a4: 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) ||
475a8: 4a88 tstl %a0
475aa: 671e beqs 475ca <_TOD_Validate+0x76> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
475ac: 143c 0003 moveb #3,%d2
475b0: c282 andl %d2,%d1
475b2: 661e bnes 475d2 <_TOD_Validate+0x7e>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
475b4: 43f9 0005 e6ba lea 5e6ba <_TOD_Days_per_month>,%a1
475ba: 2031 0c34 movel %a1@(00000034,%d0:l:4),%d0
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
475be: b1c0 cmpal %d0,%a0
475c0: 53c0 sls %d0
475c2: 4480 negl %d0
if ( the_tod->day > days_in_month )
return false;
return true;
}
475c4: 241f movel %sp@+,%d2
475c6: 4e5e unlk %fp
475c8: 4e75 rts
475ca: 241f movel %sp@+,%d2
475cc: 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;
475ce: 4200 clrb %d0
if ( the_tod->day > days_in_month )
return false;
return true;
}
475d0: 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 ];
475d2: 43f9 0005 e6ba lea 5e6ba <_TOD_Days_per_month>,%a1
475d8: 2031 0c00 movel %a1@(00000000,%d0:l:4),%d0
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
475dc: b1c0 cmpal %d0,%a0
475de: 53c0 sls %d0
475e0: 4480 negl %d0
475e2: 60e0 bras 475c4 <_TOD_Validate+0x70>
000482fc <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
482fc: 4e56 fff0 linkw %fp,#-16
48300: 48d7 041c moveml %d2-%d4/%a2,%sp@
48304: 246e 0008 moveal %fp@(8),%a2
*/
/*
* Save original state
*/
original_state = the_thread->current_state;
48308: 262a 0010 movel %a2@(16),%d3
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
4830c: 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 );
48310: 2f0a movel %a2,%sp@-
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
48312: 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 );
48316: 4eb9 0004 9280 jsr 49280 <_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 )
4831c: 588f addql #4,%sp
4831e: b4aa 0014 cmpl %a2@(20),%d2
48322: 670c beqs 48330 <_Thread_Change_priority+0x34>
_Thread_Set_priority( the_thread, new_priority );
48324: 2f02 movel %d2,%sp@-
48326: 2f0a movel %a2,%sp@-
48328: 4eb9 0004 90fc jsr 490fc <_Thread_Set_priority>
4832e: 508f addql #8,%sp
_ISR_Disable( level );
48330: 203c 0000 0700 movel #1792,%d0
48336: 40c1 movew %sr,%d1
48338: 8081 orl %d1,%d0
4833a: 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;
4833c: 202a 0010 movel %a2@(16),%d0
if ( state != STATES_TRANSIENT ) {
48340: 7404 moveq #4,%d2
48342: b480 cmpl %d0,%d2
48344: 6738 beqs 4837e <_Thread_Change_priority+0x82>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
48346: 44c3 movew %d3,%ccr
48348: 6708 beqs 48352 <_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);
4834a: 74fb moveq #-5,%d2
4834c: c480 andl %d0,%d2
4834e: 2542 0010 movel %d2,%a2@(16)
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
48352: 46c1 movew %d1,%sr
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
48354: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( state ) ) {
4835a: 660a bnes 48366 <_Thread_Change_priority+0x6a>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Context_Switch_necessary = true;
_ISR_Enable( level );
}
4835c: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
48362: 4e5e unlk %fp
48364: 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 );
48366: 2d4a 000c movel %a2,%fp@(12)
4836a: 2d6a 0044 0008 movel %a2@(68),%fp@(8)
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Context_Switch_necessary = true;
_ISR_Enable( level );
}
48370: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
48376: 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 );
48378: 4ef9 0004 9050 jmp 49050 <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
4837e: 44c3 movew %d3,%ccr
48380: 673c beqs 483be <_Thread_Change_priority+0xc2> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map (
Priority_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
48382: 206a 008e moveal %a2@(142),%a0
48386: 302a 0094 movew %a2@(148),%d0
4838a: 3410 movew %a0@,%d2
* 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 );
4838c: 42aa 0010 clrl %a2@(16)
48390: 8082 orl %d2,%d0
48392: 3080 movew %d0,%a0@
_Priority_Major_bit_map |= the_priority_map->ready_major;
48394: 3439 0005 e4bc movew 5e4bc <_Priority_Major_bit_map>,%d2
4839a: 302a 0092 movew %a2@(146),%d0
4839e: 8082 orl %d2,%d0
483a0: 33c0 0005 e4bc movew %d0,5e4bc <_Priority_Major_bit_map>
_Priority_Add_to_bit_map( &the_thread->Priority_map );
if ( prepend_it )
483a6: 4a04 tstb %d4
483a8: 6700 0082 beqw 4842c <_Thread_Change_priority+0x130>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head(
Chain_Control *the_chain
)
{
return (Chain_Node *) the_chain;
483ac: 206a 008a moveal %a2@(138),%a0
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
483b0: 2250 moveal %a0@,%a1
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
483b2: 2548 0004 movel %a0,%a2@(4)
before_node = after_node->next;
after_node->next = the_node;
483b6: 208a movel %a2,%a0@
the_node->next = before_node;
before_node->previous = the_node;
483b8: 234a 0004 movel %a2,%a1@(4)
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
483bc: 2489 movel %a1,%a2@
_Chain_Prepend_unprotected( the_thread->ready, &the_thread->Object.Node );
else
_Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
}
_ISR_Flash( level );
483be: 203c 0000 0700 movel #1792,%d0
483c4: 46c1 movew %d1,%sr
483c6: 8081 orl %d1,%d0
483c8: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_highest( void )
{
Priority_Bit_map_control minor;
Priority_Bit_map_control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
483ca: 3039 0005 e4bc movew 5e4bc <_Priority_Major_bit_map>,%d0
483d0: 4840 swap %d0
483d2: 04c0 ff1 %d0
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
483d4: 4282 clrl %d2
483d6: 41f9 0005 e524 lea 5e524 <_Priority_Bit_map>,%a0
483dc: 3400 movew %d0,%d2
483de: 3030 2a00 movew %a0@(00000000,%d2:l:2),%d0
483e2: 4840 swap %d0
483e4: 04c0 ff1 %d0
return (_Priority_Bits_index( major ) << 4) +
483e6: 4283 clrl %d3
483e8: e98a lsll #4,%d2
483ea: 3600 movew %d0,%d3
*/
RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
{
_Thread_Heir = (Thread_Control *)
_Thread_Ready_chain[ _Priority_Get_highest() ].first;
483ec: 2279 0005 e3d0 moveal 5e3d0 <_Thread_Ready_chain>,%a1
483f2: 2002 movel %d2,%d0
483f4: d083 addl %d3,%d0
483f6: 2400 movel %d0,%d2
483f8: e58a lsll #2,%d2
483fa: e988 lsll #4,%d0
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
483fc: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
*/
RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
{
_Thread_Heir = (Thread_Control *)
_Thread_Ready_chain[ _Priority_Get_highest() ].first;
48402: 93c2 subal %d2,%a1
* ready thread.
*/
RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
{
_Thread_Heir = (Thread_Control *)
48404: 2031 0800 movel %a1@(00000000,%d0:l),%d0
48408: 23c0 0005 e5e4 movel %d0,5e5e4 <_Per_CPU_Information+0x10>
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Thread_Calculate_heir();
if ( !_Thread_Is_executing_also_the_heir() &&
4840e: b1c0 cmpal %d0,%a0
48410: 670e beqs 48420 <_Thread_Change_priority+0x124>
48412: 4a28 0074 tstb %a0@(116)
48416: 6708 beqs 48420 <_Thread_Change_priority+0x124>
_Thread_Executing->is_preemptible )
_Context_Switch_necessary = true;
48418: 7401 moveq #1,%d2
4841a: 13c2 0005 e5ec moveb %d2,5e5ec <_Per_CPU_Information+0x18>
_ISR_Enable( level );
48420: 46c1 movew %d1,%sr
}
48422: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
48428: 4e5e unlk %fp
4842a: 4e75 rts
_Priority_Add_to_bit_map( &the_thread->Priority_map );
if ( prepend_it )
_Chain_Prepend_unprotected( the_thread->ready, &the_thread->Object.Node );
else
_Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
4842c: 206a 008a moveal %a2@(138),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
48430: 2008 movel %a0,%d0
48432: 5880 addql #4,%d0
)
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
48434: 2268 0008 moveal %a0@(8),%a1
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
48438: 2480 movel %d0,%a2@
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
the_chain->last = the_node;
4843a: 214a 0008 movel %a2,%a0@(8)
old_last_node->next = the_node;
4843e: 228a movel %a2,%a1@
the_node->previous = old_last_node;
48440: 2549 0004 movel %a1,%a2@(4)
48444: 6000 ff78 braw 483be <_Thread_Change_priority+0xc2>
00048448 <_Thread_Clear_state>:
)
{
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
48448: 327c 0700 moveaw #1792,%a1
4844c: 2009 movel %a1,%d0
void _Thread_Clear_state(
Thread_Control *the_thread,
States_Control state
)
{
4844e: 4e56 ffec linkw %fp,#-20
48452: 206e 0008 moveal %fp@(8),%a0
48456: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
4845a: 242e 000c movel %fp@(12),%d2
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
4845e: 40c3 movew %sr,%d3
48460: 8083 orl %d3,%d0
48462: 46c0 movew %d0,%sr
current_state = the_thread->current_state;
48464: 2228 0010 movel %a0@(16),%d1
if ( current_state & state ) {
48468: 2002 movel %d2,%d0
4846a: c081 andl %d1,%d0
4846c: 6776 beqs 484e4 <_Thread_Clear_state+0x9c>
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
4846e: 2002 movel %d2,%d0
48470: 4680 notl %d0
48472: c081 andl %d1,%d0
current_state =
the_thread->current_state = _States_Clear( state, current_state );
48474: 2140 0010 movel %d0,%a0@(16)
if ( _States_Is_ready( current_state ) ) {
48478: 666a bnes 484e4 <_Thread_Clear_state+0x9c>
RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map (
Priority_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
4847a: 2868 008e moveal %a0@(142),%a4
_Priority_Add_to_bit_map( &the_thread->Priority_map );
_Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node);
4847e: 2468 008a moveal %a0@(138),%a2
48482: 3214 movew %a4@,%d1
48484: 3028 0094 movew %a0@(148),%d0
)
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
48488: 266a 0008 moveal %a2@(8),%a3
4848c: 8081 orl %d1,%d0
4848e: 3880 movew %d0,%a4@
_Priority_Major_bit_map |= the_priority_map->ready_major;
48490: 3239 0005 e4bc movew 5e4bc <_Priority_Major_bit_map>,%d1
48496: 3028 0092 movew %a0@(146),%d0
4849a: 8081 orl %d1,%d0
4849c: 33c0 0005 e4bc movew %d0,5e4bc <_Priority_Major_bit_map>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
484a2: 200a movel %a2,%d0
484a4: 5880 addql #4,%d0
484a6: 2080 movel %d0,%a0@
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
the_chain->last = the_node;
484a8: 2548 0008 movel %a0,%a2@(8)
old_last_node->next = the_node;
484ac: 2688 movel %a0,%a3@
the_node->previous = old_last_node;
484ae: 214b 0004 movel %a3,%a0@(4)
_ISR_Flash( level );
484b2: 2009 movel %a1,%d0
484b4: 46c3 movew %d3,%sr
484b6: 8083 orl %d3,%d0
484b8: 46c0 movew %d0,%sr
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
484ba: 2028 0014 movel %a0@(20),%d0
484be: 2279 0005 e5e4 moveal 5e5e4 <_Per_CPU_Information+0x10>,%a1
484c4: b0a9 0014 cmpl %a1@(20),%d0
484c8: 641a bccs 484e4 <_Thread_Clear_state+0x9c>
_Thread_Heir = the_thread;
484ca: 23c8 0005 e5e4 movel %a0,5e5e4 <_Per_CPU_Information+0x10>
if ( _Thread_Executing->is_preemptible ||
484d0: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
484d6: 4a28 0074 tstb %a0@(116)
484da: 6712 beqs 484ee <_Thread_Clear_state+0xa6>
the_thread->current_priority == 0 )
_Context_Switch_necessary = true;
484dc: 7001 moveq #1,%d0
484de: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18>
}
}
}
_ISR_Enable( level );
484e4: 46c3 movew %d3,%sr
}
484e6: 4cd7 1c0c moveml %sp@,%d2-%d3/%a2-%a4
484ea: 4e5e unlk %fp
484ec: 4e75 rts
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
484ee: 4a80 tstl %d0
484f0: 66f2 bnes 484e4 <_Thread_Clear_state+0x9c> <== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Context_Switch_necessary = true;
484f2: 7001 moveq #1,%d0 <== NOT EXECUTED
484f4: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18> <== NOT EXECUTED
484fa: 60e8 bras 484e4 <_Thread_Clear_state+0x9c> <== NOT EXECUTED
000484fc <_Thread_Close>:
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
484fc: 4280 clrl %d0
void _Thread_Close(
Objects_Information *information,
Thread_Control *the_thread
)
{
484fe: 4e56 0000 linkw %fp,#0
48502: 2f0b movel %a3,%sp@-
48504: 266e 0008 moveal %fp@(8),%a3
48508: 2f0a movel %a2,%sp@-
4850a: 246e 000c moveal %fp@(12),%a2
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
4850e: 206b 0018 moveal %a3@(24),%a0
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
48512: 302a 000a movew %a2@(10),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
48516: 42b0 0c00 clrl %a0@(00000000,%d0:l:4)
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
4851a: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
48520: 5380 subql #1,%d0
* disappear and set a transient state on it. So we temporarily
* unnest dispatching.
*/
_Thread_Unnest_dispatch();
_User_extensions_Thread_delete( the_thread );
48522: 2f0a movel %a2,%sp@-
48524: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
4852a: 4eb9 0004 98ac jsr 498ac <_User_extensions_Thread_delete>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
48530: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
48536: 5280 addql #1,%d0
48538: 23c0 0005 e41c movel %d0,5e41c <_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 );
4853e: 2f0a movel %a2,%sp@-
48540: 2f0b movel %a3,%sp@-
48542: 4eb9 0004 7b1c jsr 47b1c <_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 );
48548: 4878 0001 pea 1 <ADD>
4854c: 2f0a movel %a2,%sp@-
4854e: 4eb9 0004 916c jsr 4916c <_Thread_Set_state>
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
48554: 2f0a movel %a2,%sp@-
48556: 4eb9 0004 8f4c jsr 48f4c <_Thread_queue_Extract_with_proxy>
4855c: 4fef 0018 lea %sp@(24),%sp
48560: 4a00 tstb %d0
48562: 6608 bnes 4856c <_Thread_Close+0x70>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
48564: 7002 moveq #2,%d0
48566: b0aa 0050 cmpl %a2@(80),%d0
4856a: 6756 beqs 485c2 <_Thread_Close+0xc6>
/*
* 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 ) )
4856c: b5f9 0005 e49e cmpal 5e49e <_Thread_Allocated_fp>,%a2
48572: 6746 beqs 485ba <_Thread_Close+0xbe>
_Thread_Deallocate_fp();
#endif
the_thread->fp_context = NULL;
if ( the_thread->Start.fp_context )
48574: 202a 00c4 movel %a2@(196),%d0
#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;
48578: 42aa 0100 clrl %a2@(256)
if ( the_thread->Start.fp_context )
4857c: 4a80 tstl %d0
4857e: 670a beqs 4858a <_Thread_Close+0x8e>
(void) _Workspace_Free( the_thread->Start.fp_context );
48580: 2f00 movel %d0,%sp@-
48582: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
48588: 588f addql #4,%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 );
4858a: 2f0a movel %a2,%sp@-
4858c: 4eb9 0004 9368 jsr 49368 <_Thread_Stack_Free>
the_thread->Start.stack = NULL;
if ( the_thread->extensions )
48592: 202a 0110 movel %a2@(272),%d0
48596: 588f addql #4,%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;
48598: 42aa 00c8 clrl %a2@(200)
if ( the_thread->extensions )
4859c: 4a80 tstl %d0
4859e: 670a beqs 485aa <_Thread_Close+0xae>
(void) _Workspace_Free( the_thread->extensions );
485a0: 2f00 movel %d0,%sp@-
485a2: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
485a8: 588f addql #4,%sp
the_thread->extensions = NULL;
485aa: 42aa 0110 clrl %a2@(272)
}
485ae: 246e fff8 moveal %fp@(-8),%a2
485b2: 266e fffc moveal %fp@(-4),%a3
485b6: 4e5e unlk %fp
485b8: 4e75 rts
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE void _Thread_Deallocate_fp( void )
{
_Thread_Allocated_fp = NULL;
485ba: 42b9 0005 e49e clrl 5e49e <_Thread_Allocated_fp>
485c0: 60b2 bras 48574 <_Thread_Close+0x78>
*/
_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 );
485c2: 486a 0048 pea %a2@(72)
485c6: 4eb9 0004 9ac0 jsr 49ac0 <_Watchdog_Remove>
485cc: 588f addql #4,%sp
/*
* 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 ) )
485ce: b5f9 0005 e49e cmpal 5e49e <_Thread_Allocated_fp>,%a2
485d4: 669e bnes 48574 <_Thread_Close+0x78> <== ALWAYS TAKEN
485d6: 60e2 bras 485ba <_Thread_Close+0xbe> <== NOT EXECUTED
00048688 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
48688: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
4868c: 486e fffc pea %fp@(-4)
48690: 2f2e 0008 movel %fp@(8),%sp@-
48694: 4eb9 0004 8854 jsr 48854 <_Thread_Get>
switch ( location ) {
4869a: 508f addql #8,%sp
4869c: 4aae fffc tstl %fp@(-4)
486a0: 661e bnes 486c0 <_Thread_Delay_ended+0x38> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
486a2: 2f3c 1000 0018 movel #268435480,%sp@-
486a8: 2f00 movel %d0,%sp@-
486aa: 4eb9 0004 8448 jsr 48448 <_Thread_Clear_state>
486b0: 508f addql #8,%sp
486b2: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
486b8: 5380 subql #1,%d0
486ba: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
486c0: 4e5e unlk %fp <== NOT EXECUTED
000486c4 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
486c4: 4e56 ffc8 linkw %fp,#-56
486c8: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
486cc: 283c 0000 0700 movel #1792,%d4
486d2: 2004 movel %d4,%d0
{
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
486d4: 2479 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a2
_ISR_Disable( level );
486da: 40c1 movew %sr,%d1
486dc: 8081 orl %d1,%d0
486de: 46c0 movew %d0,%sr
while ( _Context_Switch_necessary == true ) {
486e0: 1039 0005 e5ec moveb 5e5ec <_Per_CPU_Information+0x18>,%d0
486e6: 6700 0120 beqw 48808 <_Thread_Dispatch+0x144>
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
486ea: 7001 moveq #1,%d0
486ec: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Context_Switch_necessary == true ) {
heir = _Thread_Heir;
486f2: 2679 0005 e5e4 moveal 5e5e4 <_Per_CPU_Information+0x10>,%a3
_Thread_Dispatch_disable_level = 1;
_Context_Switch_necessary = false;
486f8: 4200 clrb %d0
_Thread_Executing = heir;
486fa: 23cb 0005 e5e0 movel %a3,5e5e0 <_Per_CPU_Information+0xc>
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Context_Switch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
_Context_Switch_necessary = false;
48700: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18>
/*
* 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 )
48706: b7ca cmpal %a2,%a3
48708: 6700 00fe beqw 48808 <_Thread_Dispatch+0x144>
4870c: 260e movel %fp,%d3
4870e: 240e movel %fp,%d2
48710: 5183 subql #8,%d3
48712: 2e3c 0004 bc10 movel #310288,%d7
48718: 0682 ffff fff0 addil #-16,%d2
4871e: 2c3c 0004 9670 movel #300656,%d6
48724: 2a3c 0004 9628 movel #300584,%d5
4872a: 4bf9 0004 9938 lea 49938 <_User_extensions_Thread_switch>,%a5
48730: 49f9 0004 9cac lea 49cac <_CPU_Context_switch>,%a4
*/
#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 )
48736: 7001 moveq #1,%d0
48738: b0ab 007a cmpl %a3@(122),%d0
4873c: 6700 00e2 beqw 48820 <_Thread_Dispatch+0x15c>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
_ISR_Enable( level );
48740: 46c1 movew %d1,%sr
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
48742: 2f03 movel %d3,%sp@-
48744: 2047 moveal %d7,%a0
48746: 4e90 jsr %a0@
_Timestamp_Subtract(
48748: 2046 moveal %d6,%a0
4874a: 2f02 movel %d2,%sp@-
4874c: 2f03 movel %d3,%sp@-
4874e: 4879 0005 e4ca pea 5e4ca <_Thread_Time_of_last_context_switch>
48754: 4e90 jsr %a0@
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
48756: 2045 moveal %d5,%a0
48758: 2f02 movel %d2,%sp@-
4875a: 486a 0082 pea %a2@(130)
4875e: 4e90 jsr %a0@
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
48760: 2079 0005 e4a2 moveal 5e4a2 <_Thread_libc_reent>,%a0
48766: 4fef 0018 lea %sp@(24),%sp
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
4876a: 202e fff8 movel %fp@(-8),%d0
4876e: 222e fffc movel %fp@(-4),%d1
48772: 23c0 0005 e4ca movel %d0,5e4ca <_Thread_Time_of_last_context_switch>
48778: 23c1 0005 e4ce movel %d1,5e4ce <_Thread_Time_of_last_context_switch+0x4>
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
4877e: 4a88 tstl %a0
48780: 6708 beqs 4878a <_Thread_Dispatch+0xc6> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
48782: 2550 0104 movel %a0@,%a2@(260)
*_Thread_libc_reent = heir->libc_reent;
48786: 20ab 0104 movel %a3@(260),%a0@
}
_User_extensions_Thread_switch( executing, heir );
4878a: 2f0b movel %a3,%sp@-
4878c: 2f0a movel %a2,%sp@-
4878e: 4e95 jsr %a5@
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
48790: 486b 00cc pea %a3@(204)
48794: 486a 00cc pea %a2@(204)
48798: 4e94 jsr %a4@
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
4879a: 4fef 0010 lea %sp@(16),%sp
4879e: 4aaa 0100 tstl %a2@(256)
487a2: 672c beqs 487d0 <_Thread_Dispatch+0x10c>
#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 );
487a4: 2079 0005 e49e moveal 5e49e <_Thread_Allocated_fp>,%a0
487aa: b1ca cmpal %a2,%a0
487ac: 6722 beqs 487d0 <_Thread_Dispatch+0x10c>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
487ae: 4a88 tstl %a0
487b0: 670c beqs 487be <_Thread_Dispatch+0xfa>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
487b2: 4868 0100 pea %a0@(256)
487b6: 4eb9 0004 9dd2 jsr 49dd2 <_CPU_Context_save_fp>
487bc: 588f addql #4,%sp
_Context_Restore_fp( &executing->fp_context );
487be: 486a 0100 pea %a2@(256)
487c2: 4eb9 0004 9e0a jsr 49e0a <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
487c8: 588f addql #4,%sp
487ca: 23ca 0005 e49e movel %a2,5e49e <_Thread_Allocated_fp>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
487d0: 2479 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a2
_ISR_Disable( level );
487d6: 2004 movel %d4,%d0
487d8: 40c1 movew %sr,%d1
487da: 8081 orl %d1,%d0
487dc: 46c0 movew %d0,%sr
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Context_Switch_necessary == true ) {
487de: 1039 0005 e5ec moveb 5e5ec <_Per_CPU_Information+0x18>,%d0
487e4: 6722 beqs 48808 <_Thread_Dispatch+0x144>
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
487e6: 7001 moveq #1,%d0
487e8: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Context_Switch_necessary == true ) {
heir = _Thread_Heir;
487ee: 2679 0005 e5e4 moveal 5e5e4 <_Per_CPU_Information+0x10>,%a3
_Thread_Dispatch_disable_level = 1;
_Context_Switch_necessary = false;
487f4: 4200 clrb %d0
_Thread_Executing = heir;
487f6: 23cb 0005 e5e0 movel %a3,5e5e0 <_Per_CPU_Information+0xc>
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Context_Switch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
_Context_Switch_necessary = false;
487fc: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18>
/*
* 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 )
48802: b5cb cmpal %a3,%a2
48804: 6600 ff30 bnew 48736 <_Thread_Dispatch+0x72>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
48808: 42b9 0005 e41c clrl 5e41c <_Thread_Dispatch_disable_level>
_ISR_Enable( level );
4880e: 46c1 movew %d1,%sr
_API_extensions_Run_postswitch();
48810: 4eb9 0004 6f0e jsr 46f0e <_API_extensions_Run_postswitch>
}
48816: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
4881c: 4e5e unlk %fp
4881e: 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;
48820: 41f9 0005 e3d4 lea 5e3d4 <_Thread_Ticks_per_timeslice>,%a0
48826: 2750 0076 movel %a0@,%a3@(118)
4882a: 6000 ff14 braw 48740 <_Thread_Dispatch+0x7c>
00048854 <_Thread_Get>:
Thread_Control *_Thread_Get (
Objects_Id id,
Objects_Locations *location
)
{
48854: 4e56 0000 linkw %fp,#0
48858: 202e 0008 movel %fp@(8),%d0
4885c: 2f03 movel %d3,%sp@-
4885e: 206e 000c moveal %fp@(12),%a0
48862: 2f02 movel %d2,%sp@-
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
48864: 4a80 tstl %d0
48866: 6766 beqs 488ce <_Thread_Get+0x7a>
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
48868: 7418 moveq #24,%d2
4886a: 2200 movel %d0,%d1
4886c: e4a9 lsrl %d2,%d1
4886e: 7607 moveq #7,%d3
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
48870: 143c 0002 moveb #2,%d2
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
48874: c283 andl %d3,%d1
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
48876: 2241 moveal %d1,%a1
48878: 5389 subql #1,%a1
4887a: b489 cmpl %a1,%d2
4887c: 653e bcss 488bc <_Thread_Get+0x68>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
4887e: 761b moveq #27,%d3
48880: 2400 movel %d0,%d2
48882: e6aa lsrl %d3,%d2
*location = OBJECTS_ERROR;
goto done;
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
48884: 163c 0001 moveb #1,%d3
48888: b682 cmpl %d2,%d3
4888a: 6630 bnes 488bc <_Thread_Get+0x68>
*location = OBJECTS_ERROR;
goto done;
}
api_information = _Objects_Information_table[ the_api ];
4888c: 43f9 0005 e3d8 lea 5e3d8 <_Objects_Information_table>,%a1
48892: 2271 1c00 moveal %a1@(00000000,%d1:l:4),%a1
if ( !api_information ) {
48896: 4a89 tstl %a1
48898: 6722 beqs 488bc <_Thread_Get+0x68> <== NEVER TAKEN
*location = OBJECTS_ERROR;
goto done;
}
information = api_information[ the_class ];
4889a: 2229 0004 movel %a1@(4),%d1
if ( !information ) {
4889e: 671c beqs 488bc <_Thread_Get+0x68>
*location = OBJECTS_ERROR;
goto done;
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
488a0: 2f08 movel %a0,%sp@-
488a2: 2f00 movel %d0,%sp@-
488a4: 2f01 movel %d1,%sp@-
488a6: 4eb9 0004 7f48 jsr 47f48 <_Objects_Get>
done:
return tp;
}
488ac: 242e fff8 movel %fp@(-8),%d2
if ( !information ) {
*location = OBJECTS_ERROR;
goto done;
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
488b0: 4fef 000c lea %sp@(12),%sp
done:
return tp;
}
488b4: 262e fffc movel %fp@(-4),%d3
488b8: 4e5e unlk %fp
488ba: 4e75 rts
goto done;
}
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
488bc: 7001 moveq #1,%d0
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
488be: 242e fff8 movel %fp@(-8),%d2
488c2: 262e fffc movel %fp@(-4),%d3
488c6: 4e5e unlk %fp
goto done;
}
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
488c8: 2080 movel %d0,%a0@
{
uint32_t the_api;
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
488ca: 4280 clrl %d0
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
488cc: 4e75 rts
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
488ce: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
488d4: 5280 addql #1,%d0
488d6: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
488dc: 242e fff8 movel %fp@(-8),%d2
488e0: 262e fffc movel %fp@(-4),%d3
488e4: 4e5e unlk %fp
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
_Thread_Disable_dispatch();
*location = OBJECTS_LOCAL;
tp = _Thread_Executing;
488e6: 2039 0005 e5e0 movel 5e5e0 <_Per_CPU_Information+0xc>,%d0
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
_Thread_Disable_dispatch();
*location = OBJECTS_LOCAL;
488ec: 4290 clrl %a0@ <== NOT EXECUTED
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
0004d8a4 <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
4d8a4: 4e56 0000 linkw %fp,#0
4d8a8: 2f0a movel %a2,%sp@-
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
4d8aa: 2479 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a2
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
4d8b0: 2f02 movel %d2,%sp@-
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
4d8b2: 222a 00b4 movel %a2@(180),%d1
_ISR_Set_level(level);
4d8b6: 40c0 movew %sr,%d0
4d8b8: e189 lsll #8,%d1
4d8ba: 0280 0000 f8ff andil #63743,%d0
4d8c0: 8081 orl %d1,%d0
4d8c2: 46c0 movew %d0,%sr
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
doneConstructors = 1;
4d8c4: 7001 moveq #1,%d0
level = executing->Start.isr_level;
_ISR_Set_level(level);
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
4d8c6: 1439 0005 dbdc moveb 5dbdc <doneConstructors.3245>,%d2
doneConstructors = 1;
4d8cc: 13c0 0005 dbdc moveb %d0,5dbdc <doneConstructors.3245>
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
4d8d2: 4aaa 0100 tstl %a2@(256)
4d8d6: 6720 beqs 4d8f8 <_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 );
4d8d8: 2079 0005 e49e moveal 5e49e <_Thread_Allocated_fp>,%a0
4d8de: b1ca cmpal %a2,%a0
4d8e0: 6716 beqs 4d8f8 <_Thread_Handler+0x54>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
4d8e2: 4a88 tstl %a0
4d8e4: 670c beqs 4d8f2 <_Thread_Handler+0x4e>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
4d8e6: 4868 0100 pea %a0@(256)
4d8ea: 4eb9 0004 9dd2 jsr 49dd2 <_CPU_Context_save_fp>
4d8f0: 588f addql #4,%sp
_Thread_Allocated_fp = executing;
4d8f2: 23ca 0005 e49e movel %a2,5e49e <_Thread_Allocated_fp>
/*
* Take care that 'begin' extensions get to complete before
* 'switch' extensions can run. This means must keep dispatch
* disabled until all 'begin' extensions complete.
*/
_User_extensions_Thread_begin( executing );
4d8f8: 2f0a movel %a2,%sp@-
4d8fa: 4eb9 0004 9784 jsr 49784 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
4d900: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
4d906: 588f addql #4,%sp
4d908: 4a02 tstb %d2
4d90a: 6746 beqs 4d952 <_Thread_Handler+0xae>
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
4d90c: 4aaa 009e tstl %a2@(158)
4d910: 6718 beqs 4d92a <_Thread_Handler+0x86> <== ALWAYS TAKEN
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
4d912: 2f0a movel %a2,%sp@- <== NOT EXECUTED
4d914: 4eb9 0004 97c2 jsr 497c2 <_User_extensions_Thread_exitted> <== NOT EXECUTED
_Internal_error_Occurred(
4d91a: 4878 0005 pea 5 <COMPARE> <== NOT EXECUTED
4d91e: 4878 0001 pea 1 <ADD> <== NOT EXECUTED
4d922: 42a7 clrl %sp@- <== NOT EXECUTED
4d924: 4eb9 0004 79c8 jsr 479c8 <_Internal_error_Occurred> <== NOT EXECUTED
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
4d92a: 2f2a 00a6 movel %a2@(166),%sp@-
4d92e: 206a 009a moveal %a2@(154),%a0
4d932: 4e90 jsr %a0@
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
4d934: 588f addql #4,%sp
4d936: 2540 0028 movel %d0,%a2@(40)
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
4d93a: 2f0a movel %a2,%sp@-
4d93c: 4eb9 0004 97c2 jsr 497c2 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
4d942: 4878 0005 pea 5 <COMPARE>
4d946: 4878 0001 pea 1 <ADD>
4d94a: 42a7 clrl %sp@-
4d94c: 4eb9 0004 79c8 jsr 479c8 <_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 (!doneCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
4d952: 4eb9 0005 b3d8 jsr 5b3d8 <_init>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
4d958: 4aaa 009e tstl %a2@(158)
4d95c: 66b4 bnes 4d912 <_Thread_Handler+0x6e> <== NEVER TAKEN
4d95e: 60ca bras 4d92a <_Thread_Handler+0x86>
000488f0 <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
488f0: 4e56 ffec linkw %fp,#-20
488f4: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
488f8: 266e 0014 moveal %fp@(20),%a3
488fc: 246e 000c moveal %fp@(12),%a2
/*
* Allocate and Initialize the stack for this thread.
*/
#if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
48900: 2f0b movel %a3,%sp@-
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
48902: 242e 001c movel %fp@(28),%d2
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
48906: 42aa 0108 clrl %a2@(264)
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
4890a: 162e 001b moveb %fp@(27),%d3
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
4890e: 42aa 010c clrl %a2@(268)
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
48912: 182e 0023 moveb %fp@(35),%d4
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
the_thread->libc_reent = NULL;
48916: 42aa 0104 clrl %a2@(260)
/*
* Allocate and Initialize the stack for this thread.
*/
#if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
4891a: 2f0a movel %a2,%sp@-
4891c: 4eb9 0004 9304 jsr 49304 <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
48922: 508f addql #8,%sp
48924: 4a80 tstl %d0
48926: 6700 010e beqw 48a36 <_Thread_Initialize+0x146>
4892a: b08b cmpl %a3,%d0
4892c: 6500 0108 bcsw 48a36 <_Thread_Initialize+0x146>
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
the_stack->size = size;
48930: 2540 00bc movel %d0,%a2@(188)
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
48934: 256a 00c8 00c0 movel %a2@(200),%a2@(192)
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
4893a: 4a03 tstb %d3
4893c: 6600 0110 bnew 48a4e <_Thread_Initialize+0x15e>
48940: 4280 clrl %d0
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
48942: 4283 clrl %d3
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
48944: 2239 0005 e4ae movel 5e4ae <_Thread_Maximum_extensions>,%d1
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area )
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
4894a: 2540 0100 movel %d0,%a2@(256)
the_thread->Start.fp_context = fp_area;
4894e: 2540 00c4 movel %d0,%a2@(196)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
48952: 42aa 0050 clrl %a2@(80)
the_watchdog->routine = routine;
48956: 42aa 0064 clrl %a2@(100)
the_watchdog->id = id;
4895a: 42aa 0068 clrl %a2@(104)
the_watchdog->user_data = user_data;
4895e: 42aa 006c clrl %a2@(108)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
48962: 4a81 tstl %d1
48964: 6600 0108 bnew 48a6e <_Thread_Initialize+0x17e>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
48968: 42aa 0110 clrl %a2@(272)
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
4896c: 97cb subal %a3,%a3
the_thread->current_state = STATES_DORMANT;
the_thread->Wait.queue = NULL;
the_thread->resource_count = 0;
the_thread->real_priority = priority;
the_thread->Start.initial_priority = priority;
_Thread_Set_priority( the_thread, priority );
4896e: 2f02 movel %d2,%sp@-
#endif
}
the_thread->Start.isr_level = isr_level;
the_thread->current_state = STATES_DORMANT;
48970: 7001 moveq #1,%d0
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
48972: 1544 00aa moveb %d4,%a2@(170)
the_thread->current_state = STATES_DORMANT;
the_thread->Wait.queue = NULL;
the_thread->resource_count = 0;
the_thread->real_priority = priority;
the_thread->Start.initial_priority = priority;
_Thread_Set_priority( the_thread, priority );
48976: 2f0a movel %a2,%sp@-
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
the_thread->Start.budget_algorithm = budget_algorithm;
48978: 256e 0024 00ac movel %fp@(36),%a2@(172)
the_thread->Start.budget_callout = budget_callout;
4897e: 256e 0028 00b0 movel %fp@(40),%a2@(176)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
48984: 256e 002c 00b4 movel %fp@(44),%a2@(180)
the_thread->current_state = STATES_DORMANT;
4898a: 2540 0010 movel %d0,%a2@(16)
the_thread->Wait.queue = NULL;
4898e: 42aa 0044 clrl %a2@(68)
the_thread->resource_count = 0;
48992: 42aa 001c clrl %a2@(28)
the_thread->real_priority = priority;
48996: 2542 0018 movel %d2,%a2@(24)
the_thread->Start.initial_priority = priority;
4899a: 2542 00b8 movel %d2,%a2@(184)
_Thread_Set_priority( the_thread, priority );
4899e: 4eb9 0004 90fc jsr 490fc <_Thread_Set_priority>
_Thread_Stack_Free( the_thread );
return false;
}
489a4: 206e 0008 moveal %fp@(8),%a0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
489a8: 4280 clrl %d0
489aa: 2068 0018 moveal %a0@(24),%a0
489ae: 302a 000a movew %a2@(10),%d0
/*
* Initialize the CPU usage statistics
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Set_to_zero( &the_thread->cpu_time_used );
489b2: 42aa 0082 clrl %a2@(130)
489b6: 42aa 0086 clrl %a2@(134)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
489ba: 218a 0c00 movel %a2,%a0@(00000000,%d0:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
489be: 256e 0030 000c movel %fp@(48),%a2@(12)
* enabled when we get here. We want to be able to run the
* user extensions with dispatching enabled. The Allocator
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
489c4: 2f0a movel %a2,%sp@-
489c6: 4eb9 0004 9854 jsr 49854 <_User_extensions_Thread_create>
if ( extension_status )
489cc: 4fef 000c lea %sp@(12),%sp
489d0: 4a00 tstb %d0
489d2: 666e bnes 48a42 <_Thread_Initialize+0x152>
return true;
failed:
if ( the_thread->libc_reent )
489d4: 202a 0104 movel %a2@(260),%d0
489d8: 670a beqs 489e4 <_Thread_Initialize+0xf4>
_Workspace_Free( the_thread->libc_reent );
489da: 2f00 movel %d0,%sp@-
489dc: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
489e2: 588f addql #4,%sp
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
if ( the_thread->API_Extensions[i] )
489e4: 202a 0108 movel %a2@(264),%d0
489e8: 670a beqs 489f4 <_Thread_Initialize+0x104>
_Workspace_Free( the_thread->API_Extensions[i] );
489ea: 2f00 movel %d0,%sp@-
489ec: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
489f2: 588f addql #4,%sp
failed:
if ( the_thread->libc_reent )
_Workspace_Free( the_thread->libc_reent );
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
if ( the_thread->API_Extensions[i] )
489f4: 202a 010c movel %a2@(268),%d0
489f8: 670a beqs 48a04 <_Thread_Initialize+0x114> <== ALWAYS TAKEN
_Workspace_Free( the_thread->API_Extensions[i] );
489fa: 2f00 movel %d0,%sp@- <== NOT EXECUTED
489fc: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free> <== NOT EXECUTED
48a02: 588f addql #4,%sp <== NOT EXECUTED
if ( extensions_area )
48a04: 4a8b tstl %a3
48a06: 670a beqs 48a12 <_Thread_Initialize+0x122>
(void) _Workspace_Free( extensions_area );
48a08: 2f0b movel %a3,%sp@-
48a0a: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
48a10: 588f addql #4,%sp
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( fp_area )
48a12: 4a83 tstl %d3
48a14: 670a beqs 48a20 <_Thread_Initialize+0x130>
(void) _Workspace_Free( fp_area );
48a16: 2f03 movel %d3,%sp@-
48a18: 4eb9 0004 9c5e jsr 49c5e <_Workspace_Free>
48a1e: 588f addql #4,%sp
#endif
_Thread_Stack_Free( the_thread );
48a20: 2f0a movel %a2,%sp@-
48a22: 4eb9 0004 9368 jsr 49368 <_Thread_Stack_Free>
return false;
48a28: 588f addql #4,%sp
}
48a2a: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
if ( fp_area )
(void) _Workspace_Free( fp_area );
#endif
_Thread_Stack_Free( the_thread );
return false;
48a30: 4200 clrb %d0
}
48a32: 4e5e unlk %fp
48a34: 4e75 rts
48a36: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
* Allocate and Initialize the stack for this thread.
*/
#if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
48a3c: 4200 clrb %d0
_Thread_Stack_Free( the_thread );
return false;
}
48a3e: 4e5e unlk %fp
48a40: 4e75 rts
48a42: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
48a48: 7001 moveq #1,%d0
_Thread_Stack_Free( the_thread );
return false;
}
48a4a: 4e5e unlk %fp
48a4c: 4e75 rts
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
48a4e: 4878 001c pea 1c <OPER2+0x8>
48a52: 4eb9 0004 9c42 jsr 49c42 <_Workspace_Allocate>
if ( !fp_area )
48a58: 588f addql #4,%sp
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
48a5a: 2600 movel %d0,%d3
if ( !fp_area )
48a5c: 6600 fee6 bnew 48944 <_Thread_Initialize+0x54>
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
failed:
if ( the_thread->libc_reent )
48a60: 202a 0104 movel %a2@(260),%d0
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
48a64: 97cb subal %a3,%a3
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
failed:
if ( the_thread->libc_reent )
48a66: 6600 ff72 bnew 489da <_Thread_Initialize+0xea>
48a6a: 6000 ff78 braw 489e4 <_Thread_Initialize+0xf4>
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
48a6e: e589 lsll #2,%d1
48a70: 2041 moveal %d1,%a0
48a72: 4868 0004 pea %a0@(4)
48a76: 4eb9 0004 9c42 jsr 49c42 <_Workspace_Allocate>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
48a7c: 588f addql #4,%sp
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
48a7e: 2640 moveal %d0,%a3
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
48a80: 4a80 tstl %d0
48a82: 6700 ff50 beqw 489d4 <_Thread_Initialize+0xe4>
goto failed;
}
the_thread->extensions = (void **) extensions_area;
48a86: 2079 0005 e4ae moveal 5e4ae <_Thread_Maximum_extensions>,%a0
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
48a8c: 4281 clrl %d1
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
48a8e: 4280 clrl %d0
48a90: 254b 0110 movel %a3,%a2@(272)
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
the_thread->extensions[i] = NULL;
48a94: 42b3 1c00 clrl %a3@(00000000,%d1:l:4)
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
48a98: 5280 addql #1,%d0
48a9a: 2200 movel %d0,%d1
48a9c: b088 cmpl %a0,%d0
48a9e: 6200 fece bhiw 4896e <_Thread_Initialize+0x7e>
the_thread->extensions[i] = NULL;
48aa2: 42b3 1c00 clrl %a3@(00000000,%d1:l:4)
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
48aa6: 5280 addql #1,%d0
48aa8: 2200 movel %d0,%d1
48aaa: b088 cmpl %a0,%d0
48aac: 63e6 blss 48a94 <_Thread_Initialize+0x1a4>
48aae: 6000 febe braw 4896e <_Thread_Initialize+0x7e>
...
0004d054 <_Thread_Reset>:
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
4d054: 4e56 0000 linkw %fp,#0
4d058: 2f0a movel %a2,%sp@-
4d05a: 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;
4d05e: 256a 00ac 007a movel %a2@(172),%a2@(122)
the_thread->budget_callout = the_thread->Start.budget_callout;
4d064: 256a 00b0 007e movel %a2@(176),%a2@(126)
the_thread->Start.pointer_argument = pointer_argument;
4d06a: 256e 000c 00a2 movel %fp@(12),%a2@(162)
the_thread->Start.numeric_argument = numeric_argument;
4d070: 256e 0010 00a6 movel %fp@(16),%a2@(166)
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
the_thread->resource_count = 0;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
4d076: 156a 00aa 0074 moveb %a2@(170),%a2@(116)
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
the_thread->resource_count = 0;
4d07c: 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 ) ) {
4d080: 2f0a movel %a2,%sp@-
4d082: 4eb9 0004 9b60 jsr 49b60 <_Thread_queue_Extract_with_proxy>
4d088: 588f addql #4,%sp
4d08a: 4a00 tstb %d0
4d08c: 6608 bnes 4d096 <_Thread_Reset+0x42>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
4d08e: 7002 moveq #2,%d0
4d090: b0aa 0050 cmpl %a2@(80),%d0
4d094: 672a beqs 4d0c0 <_Thread_Reset+0x6c>
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
4d096: 202a 00b8 movel %a2@(184),%d0
4d09a: b0aa 0014 cmpl %a2@(20),%d0
4d09e: 6718 beqs 4d0b8 <_Thread_Reset+0x64>
the_thread->real_priority = the_thread->Start.initial_priority;
4d0a0: 2540 0018 movel %d0,%a2@(24)
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
4d0a4: 2d4a 0008 movel %a2,%fp@(8)
}
}
4d0a8: 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 );
4d0ac: 2d40 000c movel %d0,%fp@(12)
}
}
4d0b0: 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 );
4d0b2: 4ef9 0004 9da0 jmp 49da0 <_Thread_Set_priority>
}
}
4d0b8: 246e fffc moveal %fp@(-4),%a2
4d0bc: 4e5e unlk %fp
4d0be: 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 );
4d0c0: 486a 0048 pea %a2@(72)
4d0c4: 4eb9 0004 a7a8 jsr 4a7a8 <_Watchdog_Remove>
4d0ca: 588f addql #4,%sp
4d0cc: 60c8 bras 4d096 <_Thread_Reset+0x42>
...
00049d10 <_Thread_Restart>:
*/
RTEMS_INLINE_ROUTINE bool _States_Is_dormant (
States_Control the_states
)
{
return (the_states & STATES_DORMANT);
49d10: 7001 moveq #1,%d0
bool _Thread_Restart(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
49d12: 4e56 0000 linkw %fp,#0
49d16: 2f0a movel %a2,%sp@-
49d18: 246e 0008 moveal %fp@(8),%a2
49d1c: c0aa 0010 andl %a2@(16),%d0
if ( !_States_Is_dormant( the_thread->current_state ) ) {
49d20: 670a beqs 49d2c <_Thread_Restart+0x1c>
return true;
}
return false;
}
49d22: 246e fffc moveal %fp@(-4),%a2
49d26: 4e5e unlk %fp
_Thread_Restart_self();
return true;
}
return false;
49d28: 4200 clrb %d0
}
49d2a: 4e75 rts
Thread_Entry_numeric_type numeric_argument
)
{
if ( !_States_Is_dormant( the_thread->current_state ) ) {
_Thread_Set_transient( the_thread );
49d2c: 2f0a movel %a2,%sp@-
49d2e: 4eb9 0004 9f24 jsr 49f24 <_Thread_Set_transient>
_Thread_Reset( the_thread, pointer_argument, numeric_argument );
49d34: 2f2e 0010 movel %fp@(16),%sp@-
49d38: 2f2e 000c movel %fp@(12),%sp@-
49d3c: 2f0a movel %a2,%sp@-
49d3e: 4eb9 0004 d054 jsr 4d054 <_Thread_Reset>
_Thread_Load_environment( the_thread );
49d44: 2f0a movel %a2,%sp@-
49d46: 4eb9 0004 ccb8 jsr 4ccb8 <_Thread_Load_environment>
_Thread_Ready( the_thread );
49d4c: 2f0a movel %a2,%sp@-
49d4e: 4eb9 0004 cf94 jsr 4cf94 <_Thread_Ready>
_User_extensions_Thread_restart( the_thread );
49d54: 2f0a movel %a2,%sp@-
49d56: 4eb9 0004 a598 jsr 4a598 <_User_extensions_Thread_restart>
if ( _Thread_Is_executing ( the_thread ) )
49d5c: 4fef 001c lea %sp@(28),%sp
49d60: b5f9 0005 f578 cmpal 5f578 <_Per_CPU_Information+0xc>,%a2
49d66: 670a beqs 49d72 <_Thread_Restart+0x62>
return true;
}
return false;
}
49d68: 246e fffc moveal %fp@(-4),%a2
49d6c: 4e5e unlk %fp
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
_Thread_Restart_self();
return true;
49d6e: 7001 moveq #1,%d0
}
return false;
}
49d70: 4e75 rts
*/
RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
{
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( _Thread_Executing->fp_context != NULL )
49d72: 4aaa 0100 tstl %a2@(256)
49d76: 6712 beqs 49d8a <_Thread_Restart+0x7a>
_Context_Restore_fp( &_Thread_Executing->fp_context );
49d78: 486a 0100 pea %a2@(256)
49d7c: 4eb9 0004 aaf2 jsr 4aaf2 <_CPU_Context_restore_fp>
49d82: 2479 0005 f578 moveal 5f578 <_Per_CPU_Information+0xc>,%a2
49d88: 588f addql #4,%sp
#endif
_CPU_Context_Restart_self( &_Thread_Executing->Registers );
49d8a: 486a 00cc pea %a2@(204)
49d8e: 4eb9 0004 a9aa jsr 4a9aa <_CPU_Context_Restart_self>
49d94: 246e fffc moveal %fp@(-4),%a2 <== NOT EXECUTED
49d98: 588f addql #4,%sp <== NOT EXECUTED
49d9a: 4e5e unlk %fp <== NOT EXECUTED
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
_Thread_Restart_self();
return true;
49d9c: 7001 moveq #1,%d0 <== NOT EXECUTED
}
return false;
}
0004c7c8 <_Thread_Resume>:
{
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
4c7c8: 327c 0700 moveaw #1792,%a1
4c7cc: 2009 movel %a1,%d0
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
4c7ce: 4e56 fff0 linkw %fp,#-16
4c7d2: 206e 0008 moveal %fp@(8),%a0
4c7d6: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
4c7da: 40c1 movew %sr,%d1
4c7dc: 8081 orl %d1,%d0
4c7de: 46c0 movew %d0,%sr
current_state = the_thread->current_state;
4c7e0: 2028 0010 movel %a0@(16),%d0
if ( current_state & STATES_SUSPENDED ) {
4c7e4: 0800 0001 btst #1,%d0
4c7e8: 6774 beqs 4c85e <_Thread_Resume+0x96> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
4c7ea: 74fd moveq #-3,%d2
4c7ec: c082 andl %d2,%d0
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
4c7ee: 2140 0010 movel %d0,%a0@(16)
if ( _States_Is_ready( current_state ) ) {
4c7f2: 666a bnes 4c85e <_Thread_Resume+0x96>
RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map (
Priority_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
4c7f4: 2868 008e moveal %a0@(142),%a4
_Priority_Add_to_bit_map( &the_thread->Priority_map );
_Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node);
4c7f8: 2468 008a moveal %a0@(138),%a2
4c7fc: 3414 movew %a4@,%d2
4c7fe: 3028 0094 movew %a0@(148),%d0
)
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
4c802: 266a 0008 moveal %a2@(8),%a3
4c806: 8082 orl %d2,%d0
4c808: 3880 movew %d0,%a4@
_Priority_Major_bit_map |= the_priority_map->ready_major;
4c80a: 3439 0006 2274 movew 62274 <_Priority_Major_bit_map>,%d2
4c810: 3028 0092 movew %a0@(146),%d0
4c814: 8082 orl %d2,%d0
4c816: 33c0 0006 2274 movew %d0,62274 <_Priority_Major_bit_map>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4c81c: 200a movel %a2,%d0
4c81e: 5880 addql #4,%d0
4c820: 2080 movel %d0,%a0@
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
the_chain->last = the_node;
4c822: 2548 0008 movel %a0,%a2@(8)
old_last_node->next = the_node;
4c826: 2688 movel %a0,%a3@
the_node->previous = old_last_node;
4c828: 214b 0004 movel %a3,%a0@(4)
_ISR_Flash( level );
4c82c: 2009 movel %a1,%d0
4c82e: 46c1 movew %d1,%sr
4c830: 8081 orl %d1,%d0
4c832: 46c0 movew %d0,%sr
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
4c834: 2028 0014 movel %a0@(20),%d0
4c838: 2279 0006 239c moveal 6239c <_Per_CPU_Information+0x10>,%a1
4c83e: b0a9 0014 cmpl %a1@(20),%d0
4c842: 641a bccs 4c85e <_Thread_Resume+0x96>
_Thread_Heir = the_thread;
4c844: 23c8 0006 239c movel %a0,6239c <_Per_CPU_Information+0x10>
if ( _Thread_Executing->is_preemptible ||
4c84a: 2079 0006 2398 moveal 62398 <_Per_CPU_Information+0xc>,%a0
4c850: 4a28 0074 tstb %a0@(116)
4c854: 6712 beqs 4c868 <_Thread_Resume+0xa0>
the_thread->current_priority == 0 )
_Context_Switch_necessary = true;
4c856: 7401 moveq #1,%d2
4c858: 13c2 0006 23a4 moveb %d2,623a4 <_Per_CPU_Information+0x18>
}
}
}
_ISR_Enable( level );
4c85e: 46c1 movew %d1,%sr
}
4c860: 4cd7 1c04 moveml %sp@,%d2/%a2-%a4
4c864: 4e5e unlk %fp
4c866: 4e75 rts
_ISR_Flash( level );
if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
4c868: 4a80 tstl %d0
4c86a: 66f2 bnes 4c85e <_Thread_Resume+0x96> <== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Context_Switch_necessary = true;
4c86c: 7401 moveq #1,%d2 <== NOT EXECUTED
4c86e: 13c2 0006 23a4 moveb %d2,623a4 <_Per_CPU_Information+0x18> <== NOT EXECUTED
4c874: 60e8 bras 4c85e <_Thread_Resume+0x96> <== NOT EXECUTED
...
00049368 <_Thread_Stack_Free>:
*/
void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
49368: 4e56 0000 linkw %fp,#0
4936c: 206e 0008 moveal %fp@(8),%a0
* Call ONLY the CPU table stack free hook, or the
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
if ( Configuration.stack_free_hook )
49370: 2279 0005 cd18 moveal 5cd18 <Configuration+0x24>,%a1
49376: 4a89 tstl %a1
49378: 670a beqs 49384 <_Thread_Stack_Free+0x1c>
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
4937a: 2d68 00c0 0008 movel %a0@(192),%fp@(8)
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
49380: 4e5e unlk %fp
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
49382: 4ed1 jmp %a1@
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
49384: 2d68 00c0 0008 movel %a0@(192),%fp@(8)
}
4938a: 4e5e unlk %fp
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
4938c: 4ef9 0004 9c5e jmp 49c5e <_Workspace_Free>
...
00049440 <_Thread_Suspend>:
{
ISR_Level level;
Chain_Control *ready;
ready = the_thread->ready;
_ISR_Disable( level );
49440: 203c 0000 0700 movel #1792,%d0
*/
void _Thread_Suspend(
Thread_Control *the_thread
)
{
49446: 4e56 fff4 linkw %fp,#-12
4944a: 206e 0008 moveal %fp@(8),%a0
4944e: 48d7 040c moveml %d2-%d3/%a2,%sp@
ISR_Level level;
Chain_Control *ready;
ready = the_thread->ready;
49452: 2268 008a moveal %a0@(138),%a1
_ISR_Disable( level );
49456: 40c1 movew %sr,%d1
49458: 8081 orl %d1,%d0
4945a: 46c0 movew %d0,%sr
if ( !_States_Is_ready( the_thread->current_state ) ) {
4945c: 2028 0010 movel %a0@(16),%d0
49460: 6642 bnes 494a4 <_Thread_Suspend+0x64>
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
return;
}
the_thread->current_state = STATES_SUSPENDED;
49462: 7002 moveq #2,%d0
if ( _Chain_Has_only_one_node( ready ) ) {
49464: 2429 0008 movel %a1@(8),%d2
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
return;
}
the_thread->current_state = STATES_SUSPENDED;
49468: 2140 0010 movel %d0,%a0@(16)
if ( _Chain_Has_only_one_node( ready ) ) {
4946c: b491 cmpl %a1@,%d2
4946e: 6700 0098 beqw 49508 <_Thread_Suspend+0xc8>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
49472: 2450 moveal %a0@,%a2
previous = the_node->previous;
49474: 2268 0004 moveal %a0@(4),%a1
next->previous = previous;
49478: 2549 0004 movel %a1,%a2@(4)
previous->next = next;
4947c: 228a movel %a2,%a1@
_Priority_Remove_from_bit_map( &the_thread->Priority_map );
} else
_Chain_Extract_unprotected( &the_thread->Object.Node );
_ISR_Flash( level );
4947e: 203c 0000 0700 movel #1792,%d0
49484: 46c1 movew %d1,%sr
49486: 8081 orl %d1,%d0
49488: 46c0 movew %d0,%sr
if ( _Thread_Is_heir( the_thread ) )
4948a: b1f9 0005 e5e4 cmpal 5e5e4 <_Per_CPU_Information+0x10>,%a0
49490: 6730 beqs 494c2 <_Thread_Suspend+0x82>
_Thread_Calculate_heir();
if ( _Thread_Is_executing( the_thread ) )
49492: b1f9 0005 e5e0 cmpal 5e5e0 <_Per_CPU_Information+0xc>,%a0
49498: 671c beqs 494b6 <_Thread_Suspend+0x76> <== NEVER TAKEN
_Context_Switch_necessary = true;
_ISR_Enable( level );
4949a: 46c1 movew %d1,%sr
}
4949c: 4cd7 040c moveml %sp@,%d2-%d3/%a2
494a0: 4e5e unlk %fp
494a2: 4e75 rts
RTEMS_INLINE_ROUTINE States_Control _States_Set (
States_Control states_to_set,
States_Control current_state
)
{
return (current_state | states_to_set);
494a4: 7402 moveq #2,%d2
494a6: 8480 orl %d0,%d2
494a8: 2142 0010 movel %d2,%a0@(16)
ready = the_thread->ready;
_ISR_Disable( level );
if ( !_States_Is_ready( the_thread->current_state ) ) {
the_thread->current_state =
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
494ac: 46c1 movew %d1,%sr
if ( _Thread_Is_executing( the_thread ) )
_Context_Switch_necessary = true;
_ISR_Enable( level );
}
494ae: 4cd7 040c moveml %sp@,%d2-%d3/%a2
494b2: 4e5e unlk %fp
494b4: 4e75 rts
if ( _Thread_Is_heir( the_thread ) )
_Thread_Calculate_heir();
if ( _Thread_Is_executing( the_thread ) )
_Context_Switch_necessary = true;
494b6: 7401 moveq #1,%d2
494b8: 13c2 0005 e5ec moveb %d2,5e5ec <_Per_CPU_Information+0x18>
_ISR_Enable( level );
494be: 46c1 movew %d1,%sr
494c0: 60da bras 4949c <_Thread_Suspend+0x5c>
RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_highest( void )
{
Priority_Bit_map_control minor;
Priority_Bit_map_control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
494c2: 3039 0005 e4bc movew 5e4bc <_Priority_Major_bit_map>,%d0
494c8: 4840 swap %d0
494ca: 04c0 ff1 %d0
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
494cc: 4282 clrl %d2
494ce: 43f9 0005 e524 lea 5e524 <_Priority_Bit_map>,%a1
494d4: 3400 movew %d0,%d2
494d6: 3031 2a00 movew %a1@(00000000,%d2:l:2),%d0
494da: 4840 swap %d0
494dc: 04c0 ff1 %d0
return (_Priority_Bits_index( major ) << 4) +
494de: 4283 clrl %d3
494e0: e98a lsll #4,%d2
494e2: 3600 movew %d0,%d3
_Thread_Ready_chain[ _Priority_Get_highest() ].first;
494e4: 2279 0005 e3d0 moveal 5e3d0 <_Thread_Ready_chain>,%a1
494ea: 2002 movel %d2,%d0
494ec: d083 addl %d3,%d0
494ee: 2400 movel %d0,%d2
494f0: e58a lsll #2,%d2
494f2: e988 lsll #4,%d0
494f4: 93c2 subal %d2,%a1
* ready thread.
*/
RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
{
_Thread_Heir = (Thread_Control *)
494f6: d3c0 addal %d0,%a1
494f8: 23d1 0005 e5e4 movel %a1@,5e5e4 <_Per_CPU_Information+0x10>
_ISR_Flash( level );
if ( _Thread_Is_heir( the_thread ) )
_Thread_Calculate_heir();
if ( _Thread_Is_executing( the_thread ) )
494fe: b1f9 0005 e5e0 cmpal 5e5e0 <_Per_CPU_Information+0xc>,%a0
49504: 6694 bnes 4949a <_Thread_Suspend+0x5a> <== NEVER TAKEN
49506: 60ae bras 494b6 <_Thread_Suspend+0x76>
RTEMS_INLINE_ROUTINE void _Priority_Remove_from_bit_map (
Priority_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
49508: 2468 008e moveal %a0@(142),%a2
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4950c: 2009 movel %a1,%d0
4950e: 5880 addql #4,%d0
49510: 2280 movel %d0,%a1@
49512: 3412 movew %a2@,%d2
49514: 3028 0098 movew %a0@(152),%d0
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
49518: 42a9 0004 clrl %a1@(4)
4951c: c082 andl %d2,%d0
the_chain->last = _Chain_Head(the_chain);
4951e: 2349 0008 movel %a1,%a1@(8)
49522: 3480 movew %d0,%a2@
if ( *the_priority_map->minor == 0 )
49524: 6600 ff58 bnew 4947e <_Thread_Suspend+0x3e>
_Priority_Major_bit_map &= the_priority_map->block_major;
49528: 3439 0005 e4bc movew 5e4bc <_Priority_Major_bit_map>,%d2
4952e: 3028 0096 movew %a0@(150),%d0
49532: c082 andl %d2,%d0
49534: 33c0 0005 e4bc movew %d0,5e4bc <_Priority_Major_bit_map>
_Priority_Remove_from_bit_map( &the_thread->Priority_map );
} else
_Chain_Extract_unprotected( &the_thread->Object.Node );
_ISR_Flash( level );
4953a: 203c 0000 0700 movel #1792,%d0
49540: 46c1 movew %d1,%sr
49542: 8081 orl %d1,%d0
49544: 46c0 movew %d0,%sr
if ( _Thread_Is_heir( the_thread ) )
49546: b1f9 0005 e5e4 cmpal 5e5e4 <_Per_CPU_Information+0x10>,%a0
4954c: 6600 ff44 bnew 49492 <_Thread_Suspend+0x52>
49550: 6000 ff70 braw 494c2 <_Thread_Suspend+0x82>
000495a0 <_Thread_Yield_processor>:
* ready chain
* select heir
*/
void _Thread_Yield_processor( void )
{
495a0: 4e56 fff0 linkw %fp,#-16
ISR_Level level;
Thread_Control *executing;
Chain_Control *ready;
executing = _Thread_Executing;
495a4: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
* ready chain
* select heir
*/
void _Thread_Yield_processor( void )
{
495aa: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
Thread_Control *executing;
Chain_Control *ready;
executing = _Thread_Executing;
ready = executing->ready;
_ISR_Disable( level );
495ae: 243c 0000 0700 movel #1792,%d2
495b4: 2002 movel %d2,%d0
ISR_Level level;
Thread_Control *executing;
Chain_Control *ready;
executing = _Thread_Executing;
ready = executing->ready;
495b6: 2268 008a moveal %a0@(138),%a1
_ISR_Disable( level );
495ba: 40c1 movew %sr,%d1
495bc: 8081 orl %d1,%d0
495be: 46c0 movew %d0,%sr
}
else if ( !_Thread_Is_heir( executing ) )
_Context_Switch_necessary = true;
_ISR_Enable( level );
}
495c0: 2469 0008 moveal %a1@(8),%a2
Chain_Control *ready;
executing = _Thread_Executing;
ready = executing->ready;
_ISR_Disable( level );
if ( !_Chain_Has_only_one_node( ready ) ) {
495c4: b5d1 cmpal %a1@,%a2
495c6: 674c beqs 49614 <_Thread_Yield_processor+0x74>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
495c8: 2650 moveal %a0@,%a3
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
495ca: 2009 movel %a1,%d0
495cc: 5880 addql #4,%d0
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
495ce: 2868 0004 moveal %a0@(4),%a4
next->previous = previous;
previous->next = next;
495d2: 288b movel %a3,%a4@
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
next->previous = previous;
495d4: 274c 0004 movel %a4,%a3@(4)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
495d8: 2080 movel %d0,%a0@
{
Chain_Node *old_last_node;
the_node->next = _Chain_Tail(the_chain);
old_last_node = the_chain->last;
the_chain->last = the_node;
495da: 2348 0008 movel %a0,%a1@(8)
old_last_node->next = the_node;
495de: 2488 movel %a0,%a2@
the_node->previous = old_last_node;
495e0: 214a 0004 movel %a2,%a0@(4)
_Chain_Extract_unprotected( &executing->Object.Node );
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
495e4: 46c1 movew %d1,%sr
495e6: 8481 orl %d1,%d2
495e8: 46c2 movew %d2,%sr
if ( _Thread_Is_heir( executing ) )
495ea: b1f9 0005 e5e4 cmpal 5e5e4 <_Per_CPU_Information+0x10>,%a0
495f0: 6712 beqs 49604 <_Thread_Yield_processor+0x64> <== ALWAYS TAKEN
_Thread_Heir = (Thread_Control *) ready->first;
_Context_Switch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
_Context_Switch_necessary = true;
495f2: 7001 moveq #1,%d0 <== NOT EXECUTED
495f4: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18> <== NOT EXECUTED
_ISR_Enable( level );
495fa: 46c1 movew %d1,%sr
}
495fc: 4cd7 1c04 moveml %sp@,%d2/%a2-%a4
49600: 4e5e unlk %fp
49602: 4e75 rts
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
if ( _Thread_Is_heir( executing ) )
_Thread_Heir = (Thread_Control *) ready->first;
49604: 23d1 0005 e5e4 movel %a1@,5e5e4 <_Per_CPU_Information+0x10>
_Context_Switch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
_Context_Switch_necessary = true;
4960a: 7001 moveq #1,%d0
4960c: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18>
49612: 60e6 bras 495fa <_Thread_Yield_processor+0x5a>
if ( _Thread_Is_heir( executing ) )
_Thread_Heir = (Thread_Control *) ready->first;
_Context_Switch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
49614: b1f9 0005 e5e4 cmpal 5e5e4 <_Per_CPU_Information+0x10>,%a0
4961a: 67de beqs 495fa <_Thread_Yield_processor+0x5a> <== ALWAYS TAKEN
_Context_Switch_necessary = true;
4961c: 7001 moveq #1,%d0 <== NOT EXECUTED
4961e: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18> <== NOT EXECUTED
49624: 60d4 bras 495fa <_Thread_Yield_processor+0x5a> <== NOT EXECUTED
...
00048294 <_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 ) ) {
48294: 7202 moveq #2,%d1
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
48296: 4e56 0000 linkw %fp,#0
4829a: 202e 0010 movel %fp@(16),%d0
4829e: 2f0a movel %a2,%sp@-
482a0: 246e 000c moveal %fp@(12),%a2
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
482a4: 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 ) ) {
482a8: b2aa 0050 cmpl %a2@(80),%d1
482ac: 671c beqs 482ca <_Thread_blocking_operation_Cancel+0x36>
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
} else
_ISR_Enable( level );
482ae: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
482b0: 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
}
482b4: 246e fffc moveal %fp@(-4),%a2
482b8: 203c 1003 fff8 movel #268697592,%d0
482be: 2d40 000c movel %d0,%fp@(12)
482c2: 4e5e unlk %fp
482c4: 4ef9 0004 8448 jmp 48448 <_Thread_Clear_state>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
482ca: 123c 0003 moveb #3,%d1
482ce: 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 );
482d2: 46c0 movew %d0,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
482d4: 486a 0048 pea %a2@(72)
482d8: 4eb9 0004 9ac0 jsr 49ac0 <_Watchdog_Remove>
482de: 588f addql #4,%sp
482e0: 203c 1003 fff8 movel #268697592,%d0
482e6: 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
}
482ea: 246e fffc moveal %fp@(-4),%a2
482ee: 2d40 000c movel %d0,%fp@(12)
482f2: 4e5e unlk %fp
482f4: 4ef9 0004 8448 jmp 48448 <_Thread_Clear_state>
...
00048da4 <_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
)
{
48da4: 4e56 ffe0 linkw %fp,#-32
48da8: 48d7 1c7c moveml %d2-%d6/%a2-%a4,%sp@
48dac: 246e 000c moveal %fp@(12),%a2
48db0: 41ea 003c lea %a2@(60),%a0
48db4: 266e 0008 moveal %fp@(8),%a3
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
48db8: 222a 0014 movel %a2@(20),%d1
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
48dbc: 2a01 movel %d1,%d5
48dbe: ec8d lsrl #6,%d5
48dc0: 2548 0038 movel %a0,%a2@(56)
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
48dc4: 242b 0038 movel %a3@(56),%d2
Chain_Node *previous_node;
Chain_Node *search_node;
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
48dc8: 41ea 0038 lea %a2@(56),%a0
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
48dcc: 42aa 003c clrl %a2@(60)
48dd0: 2548 0040 movel %a0,%a2@(64)
priority = the_thread->current_priority;
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
if ( _Thread_queue_Is_reverse_search( priority ) )
48dd4: 0801 0005 btst #5,%d1
48dd8: 665e bnes 48e38 <_Thread_queue_Enqueue_priority+0x94>
48dda: 700c moveq #12,%d0
48ddc: 4c00 5800 mulsl %d0,%d5
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
48de0: 2c3c 0000 0700 movel #1792,%d6
48de6: 2006 movel %d6,%d0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
48de8: 49f3 5804 lea %a3@(00000004,%d5:l),%a4
48dec: 40c3 movew %sr,%d3
48dee: 8083 orl %d3,%d0
48df0: 46c0 movew %d0,%sr
48df2: 2803 movel %d3,%d4
search_thread = (Thread_Control *) header->first;
48df4: 2073 5800 moveal %a3@(00000000,%d5:l),%a0
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
48df8: b9c8 cmpal %a0,%a4
48dfa: 6700 013c beqw 48f38 <_Thread_queue_Enqueue_priority+0x194>
search_priority = search_thread->current_priority;
48dfe: 2268 0014 moveal %a0@(20),%a1
if ( priority <= search_priority )
48e02: b3c1 cmpal %d1,%a1
48e04: 6418 bccs 48e1e <_Thread_queue_Enqueue_priority+0x7a>
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
48e06: 2006 movel %d6,%d0
48e08: 46c3 movew %d3,%sr
48e0a: 8083 orl %d3,%d0
48e0c: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
48e0e: 2002 movel %d2,%d0
48e10: c0a8 0010 andl %a0@(16),%d0
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
48e14: 6700 00c0 beqw 48ed6 <_Thread_queue_Enqueue_priority+0x132>
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
48e18: 2050 moveal %a0@,%a0
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) header->first;
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
48e1a: b9c8 cmpal %a0,%a4
48e1c: 66e0 bnes 48dfe <_Thread_queue_Enqueue_priority+0x5a>
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
48e1e: 202b 0030 movel %a3@(48),%d0
48e22: 7401 moveq #1,%d2
48e24: b480 cmpl %d0,%d2
48e26: 6700 00c6 beqw 48eee <_Thread_queue_Enqueue_priority+0x14a>
* 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;
48e2a: 206e 0010 moveal %fp@(16),%a0
48e2e: 2084 movel %d4,%a0@
return the_thread_queue->sync_state;
}
48e30: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
48e34: 4e5e unlk %fp
48e36: 4e75 rts
_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 ];
48e38: 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;
48e3a: 4283 clrl %d3
48e3c: 1639 0005 ccf2 moveb 5ccf2 <rtems_maximum_priority>,%d3
_ISR_Disable( level );
48e42: 2c3c 0000 0700 movel #1792,%d6
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
48e48: 2243 moveal %d3,%a1
48e4a: 5289 addql #1,%a1
_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 ];
48e4c: e588 lsll #2,%d0
48e4e: e98d lsll #4,%d5
48e50: 9a80 subl %d0,%d5
48e52: da8b addl %a3,%d5
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) header->last;
48e54: 2845 moveal %d5,%a4
48e56: 508c addql #8,%a4
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
48e58: 2006 movel %d6,%d0
48e5a: 40c3 movew %sr,%d3
48e5c: 8083 orl %d3,%d0
48e5e: 46c0 movew %d0,%sr
48e60: 2803 movel %d3,%d4
search_thread = (Thread_Control *) header->last;
48e62: 2054 moveal %a4@,%a0
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
48e64: ba88 cmpl %a0,%d5
48e66: 6720 beqs 48e88 <_Thread_queue_Enqueue_priority+0xe4>
search_priority = search_thread->current_priority;
48e68: 2268 0014 moveal %a0@(20),%a1
if ( priority >= search_priority )
48e6c: b3c1 cmpal %d1,%a1
48e6e: 6318 blss 48e88 <_Thread_queue_Enqueue_priority+0xe4>
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
48e70: 2006 movel %d6,%d0
48e72: 46c3 movew %d3,%sr
48e74: 8083 orl %d3,%d0
48e76: 46c0 movew %d0,%sr
48e78: 2002 movel %d2,%d0
48e7a: c0a8 0010 andl %a0@(16),%d0
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
48e7e: 6736 beqs 48eb6 <_Thread_queue_Enqueue_priority+0x112>
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
48e80: 2068 0004 moveal %a0@(4),%a0
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) header->last;
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
48e84: ba88 cmpl %a0,%d5
48e86: 66e0 bnes 48e68 <_Thread_queue_Enqueue_priority+0xc4>
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
48e88: 202b 0030 movel %a3@(48),%d0
48e8c: 7401 moveq #1,%d2
48e8e: b480 cmpl %d0,%d2
48e90: 6698 bnes 48e2a <_Thread_queue_Enqueue_priority+0x86>
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
48e92: 42ab 0030 clrl %a3@(48)
if ( priority == search_priority )
48e96: b3c1 cmpal %d1,%a1
48e98: 677a beqs 48f14 <_Thread_queue_Enqueue_priority+0x170>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
48e9a: 2250 moveal %a0@,%a1
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
48e9c: 2548 0004 movel %a0,%a2@(4)
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
48ea0: 2489 movel %a1,%a2@
the_node->previous = search_node;
search_node->next = the_node;
next_node->previous = the_node;
48ea2: 234a 0004 movel %a2,%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;
48ea6: 208a movel %a2,%a0@
next_node->previous = the_node;
the_thread->Wait.queue = the_thread_queue;
48ea8: 254b 0044 movel %a3,%a2@(68)
_ISR_Enable( level );
48eac: 46c3 movew %d3,%sr
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
48eae: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
48eb2: 4e5e unlk %fp
48eb4: 4e75 rts
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
48eb6: 46c3 movew %d3,%sr
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
48eb8: 4283 clrl %d3
48eba: 1639 0005 ccf2 moveb 5ccf2 <rtems_maximum_priority>,%d3
_ISR_Disable( level );
48ec0: 2006 movel %d6,%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;
48ec2: 2243 moveal %d3,%a1
48ec4: 5289 addql #1,%a1
_ISR_Disable( level );
48ec6: 40c3 movew %sr,%d3
48ec8: 8083 orl %d3,%d0
48eca: 46c0 movew %d0,%sr
48ecc: 2803 movel %d3,%d4
search_thread = (Thread_Control *) header->last;
48ece: 2054 moveal %a4@,%a0
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
48ed0: ba88 cmpl %a0,%d5
48ed2: 6694 bnes 48e68 <_Thread_queue_Enqueue_priority+0xc4><== NEVER TAKEN
48ed4: 60b2 bras 48e88 <_Thread_queue_Enqueue_priority+0xe4>
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
48ed6: 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 );
48ed8: 2006 movel %d6,%d0
48eda: 40c3 movew %sr,%d3
48edc: 8083 orl %d3,%d0
48ede: 46c0 movew %d0,%sr
48ee0: 2803 movel %d3,%d4
search_thread = (Thread_Control *) header->first;
48ee2: 2073 5800 moveal %a3@(00000000,%d5:l),%a0
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
48ee6: b9c8 cmpal %a0,%a4
48ee8: 6600 ff14 bnew 48dfe <_Thread_queue_Enqueue_priority+0x5a>
48eec: 604a bras 48f38 <_Thread_queue_Enqueue_priority+0x194>
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
48eee: 42ab 0030 clrl %a3@(48)
if ( priority == search_priority )
48ef2: b3c1 cmpal %d1,%a1
48ef4: 671e beqs 48f14 <_Thread_queue_Enqueue_priority+0x170>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
48ef6: 2268 0004 moveal %a0@(4),%a1
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
48efa: 2488 movel %a0,%a2@
the_node->previous = previous_node;
48efc: 2549 0004 movel %a1,%a2@(4)
previous_node->next = the_node;
48f00: 228a movel %a2,%a1@
search_node->previous = the_node;
48f02: 214a 0004 movel %a2,%a0@(4)
the_thread->Wait.queue = the_thread_queue;
48f06: 254b 0044 movel %a3,%a2@(68)
_ISR_Enable( level );
48f0a: 46c3 movew %d3,%sr
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
48f0c: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
48f10: 4e5e unlk %fp
48f12: 4e75 rts
48f14: 41e8 003c lea %a0@(60),%a0
_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;
48f18: 2268 0004 moveal %a0@(4),%a1
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
48f1c: 2488 movel %a0,%a2@
the_node->previous = previous_node;
48f1e: 2549 0004 movel %a1,%a2@(4)
previous_node->next = the_node;
48f22: 228a movel %a2,%a1@
search_node->previous = the_node;
48f24: 214a 0004 movel %a2,%a0@(4)
the_thread->Wait.queue = the_thread_queue;
48f28: 254b 0044 movel %a3,%a2@(68)
_ISR_Enable( level );
48f2c: 46c4 movew %d4,%sr
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
48f2e: 7001 moveq #1,%d0
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
48f30: 4cd7 1c7c moveml %sp@,%d2-%d6/%a2-%a4
48f34: 4e5e unlk %fp
48f36: 4e75 rts
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
48f38: 202b 0030 movel %a3@(48),%d0
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
48f3c: 327c ffff moveaw #-1,%a1
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
48f40: 7401 moveq #1,%d2
48f42: b480 cmpl %d0,%d2
48f44: 6600 fee4 bnew 48e2a <_Thread_queue_Enqueue_priority+0x86>
48f48: 60a4 bras 48eee <_Thread_queue_Enqueue_priority+0x14a>
...
0004d960 <_Thread_queue_Extract_fifo>:
Thread_Control *the_thread
)
{
ISR_Level level;
_ISR_Disable( level );
4d960: 203c 0000 0700 movel #1792,%d0
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
4d966: 4e56 0000 linkw %fp,#0
4d96a: 2f0a movel %a2,%sp@-
4d96c: 246e 000c moveal %fp@(12),%a2
ISR_Level level;
_ISR_Disable( level );
4d970: 40c1 movew %sr,%d1
4d972: 8081 orl %d1,%d0
4d974: 46c0 movew %d0,%sr
4d976: 202a 0010 movel %a2@(16),%d0
4d97a: 0280 0003 bee0 andil #245472,%d0
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4d980: 6734 beqs 4d9b6 <_Thread_queue_Extract_fifo+0x56>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
4d982: 2252 moveal %a2@,%a1
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4d984: 7002 moveq #2,%d0
previous = the_node->previous;
4d986: 206a 0004 moveal %a2@(4),%a0
next->previous = previous;
4d98a: 2348 0004 movel %a0,%a1@(4)
previous->next = next;
4d98e: 2089 movel %a1,%a0@
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
4d990: 42aa 0044 clrl %a2@(68)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4d994: b0aa 0050 cmpl %a2@(80),%d0
4d998: 6726 beqs 4d9c0 <_Thread_queue_Extract_fifo+0x60>
_ISR_Enable( level );
4d99a: 46c1 movew %d1,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4d99c: 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
}
4d9a0: 246e fffc moveal %fp@(-4),%a2
4d9a4: 203c 1003 fff8 movel #268697592,%d0
4d9aa: 2d40 000c movel %d0,%fp@(12)
4d9ae: 4e5e unlk %fp
4d9b0: 4ef9 0004 8448 jmp 48448 <_Thread_Clear_state>
ISR_Level level;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
4d9b6: 46c1 movew %d1,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4d9b8: 246e fffc moveal %fp@(-4),%a2
4d9bc: 4e5e unlk %fp
4d9be: 4e75 rts
4d9c0: 7003 moveq #3,%d0
4d9c2: 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 );
4d9c6: 46c1 movew %d1,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4d9c8: 486a 0048 pea %a2@(72)
4d9cc: 4eb9 0004 9ac0 jsr 49ac0 <_Watchdog_Remove>
4d9d2: 588f addql #4,%sp
4d9d4: 203c 1003 fff8 movel #268697592,%d0
4d9da: 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
}
4d9de: 246e fffc moveal %fp@(-4),%a2
4d9e2: 2d40 000c movel %d0,%fp@(12)
4d9e6: 4e5e unlk %fp
4d9e8: 4ef9 0004 8448 jmp 48448 <_Thread_Clear_state>
...
0004c17c <_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 );
4c17c: 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
)
{
4c182: 4e56 ffec linkw %fp,#-20
4c186: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
4c18a: 246e 000c moveal %fp@(12),%a2
4c18e: 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 );
4c192: 40c1 movew %sr,%d1
4c194: 8081 orl %d1,%d0
4c196: 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);
4c198: 202a 0010 movel %a2@(16),%d0
4c19c: 0280 0003 bee0 andil #245472,%d0
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4c1a2: 6778 beqs 4c21c <_Thread_queue_Extract_priority_helper+0xa0>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4c1a4: 200a movel %a2,%d0
4c1a6: 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;
4c1ac: 2652 moveal %a2@,%a3
previous_node = the_node->previous;
4c1ae: 286a 0004 moveal %a2@(4),%a4
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
4c1b2: 206a 0038 moveal %a2@(56),%a0
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
4c1b6: b088 cmpl %a0,%d0
4c1b8: 676e beqs 4c228 <_Thread_queue_Extract_priority_helper+0xac>
new_first_node = the_thread->Wait.Block2n.first;
new_first_thread = (Thread_Control *) new_first_node;
last_node = the_thread->Wait.Block2n.last;
4c1ba: 226a 0040 moveal %a2@(64),%a1
new_second_node = new_first_node->next;
4c1be: 2a50 moveal %a0@,%a5
previous_node->next = new_first_node;
next_node->previous = new_first_node;
4c1c0: 2748 0004 movel %a0,%a3@(4)
new_first_node = the_thread->Wait.Block2n.first;
new_first_thread = (Thread_Control *) new_first_node;
last_node = the_thread->Wait.Block2n.last;
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
4c1c4: 2888 movel %a0,%a4@
next_node->previous = new_first_node;
new_first_node->next = next_node;
new_first_node->previous = previous_node;
4c1c6: 214c 0004 movel %a4,%a0@(4)
last_node = the_thread->Wait.Block2n.last;
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;
4c1ca: 208b movel %a3,%a0@
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
4c1cc: b1c9 cmpal %a1,%a0
4c1ce: 6716 beqs 4c1e6 <_Thread_queue_Extract_priority_helper+0x6a>
/* > two threads on 2-n */
new_second_node->previous =
_Chain_Head( &new_first_thread->Wait.Block2n );
4c1d0: 47e8 0038 lea %a0@(56),%a3
4c1d4: 2b4b 0004 movel %a3,%a5@(4)
new_first_thread->Wait.Block2n.first = new_second_node;
4c1d8: 214d 0038 movel %a5,%a0@(56)
new_first_thread->Wait.Block2n.last = last_node;
4c1dc: 2149 0040 movel %a1,%a0@(64)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4c1e0: 41e8 003c lea %a0@(60),%a0
4c1e4: 2288 movel %a0,%a1@
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
4c1e6: 4a02 tstb %d2
4c1e8: 6626 bnes 4c210 <_Thread_queue_Extract_priority_helper+0x94>
_ISR_Enable( level );
return;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4c1ea: 7002 moveq #2,%d0
4c1ec: b0aa 0050 cmpl %a2@(80),%d0
4c1f0: 6742 beqs 4c234 <_Thread_queue_Extract_priority_helper+0xb8><== NEVER TAKEN
_ISR_Enable( level );
4c1f2: 46c1 movew %d1,%sr
4c1f4: 2d4a 0008 movel %a2,%fp@(8)
4c1f8: 267c 1003 fff8 moveal #268697592,%a3
4c1fe: 2d4b 000c movel %a3,%fp@(12)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4c202: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4c208: 4e5e unlk %fp
4c20a: 4ef9 0004 8448 jmp 48448 <_Thread_Clear_state>
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
_ISR_Enable( level );
4c210: 46c1 movew %d1,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4c212: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4c218: 4e5e unlk %fp
4c21a: 4e75 rts
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
4c21c: 46c1 movew %d1,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4c21e: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4c224: 4e5e unlk %fp
4c226: 4e75 rts
new_first_thread->Wait.Block2n.last = last_node;
last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n );
}
} else {
previous_node->next = next_node;
4c228: 288b movel %a3,%a4@
next_node->previous = previous_node;
4c22a: 274c 0004 movel %a4,%a3@(4)
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
4c22e: 4a02 tstb %d2
4c230: 67b8 beqs 4c1ea <_Thread_queue_Extract_priority_helper+0x6e>
4c232: 60dc bras 4c210 <_Thread_queue_Extract_priority_helper+0x94>
4c234: 7003 moveq #3,%d0 <== NOT EXECUTED
4c236: 2540 0050 movel %d0,%a2@(80) <== NOT EXECUTED
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
4c23a: 46c1 movew %d1,%sr <== NOT EXECUTED
(void) _Watchdog_Remove( &the_thread->Timer );
4c23c: 486a 0048 pea %a2@(72) <== NOT EXECUTED
4c240: 267c 1003 fff8 moveal #268697592,%a3 <== NOT EXECUTED
4c246: 4eb9 0004 9ac0 jsr 49ac0 <_Watchdog_Remove> <== NOT EXECUTED
4c24c: 588f addql #4,%sp <== NOT EXECUTED
4c24e: 2d4a 0008 movel %a2,%fp@(8) <== NOT EXECUTED
4c252: 2d4b 000c movel %a3,%fp@(12) <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4c256: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5 <== NOT EXECUTED
4c25c: 4e5e unlk %fp <== NOT EXECUTED
4c25e: 4ef9 0004 8448 jmp 48448 <_Thread_Clear_state> <== NOT EXECUTED
00048fb8 <_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 ) {
48fb8: 7201 moveq #1,%d1
Thread_queue_Control *the_thread_queue,
Thread_queue_Disciplines the_discipline,
States_Control state,
uint32_t timeout_status
)
{
48fba: 4e56 0000 linkw %fp,#0
48fbe: 206e 0008 moveal %fp@(8),%a0
48fc2: 2f0a movel %a2,%sp@-
48fc4: 202e 000c movel %fp@(12),%d0
48fc8: 2f02 movel %d2,%sp@-
the_thread_queue->state = state;
48fca: 216e 0010 0038 movel %fp@(16),%a0@(56)
the_thread_queue->discipline = the_discipline;
the_thread_queue->timeout_status = timeout_status;
48fd0: 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;
48fd6: 2140 0034 movel %d0,%a0@(52)
the_thread_queue->timeout_status = timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
48fda: 42a8 0030 clrl %a0@(48)
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
48fde: b280 cmpl %d0,%d1
48fe0: 6716 beqs 48ff8 <_Thread_queue_Initialize+0x40>
48fe2: 2448 moveal %a0,%a2
48fe4: 588a addql #4,%a2
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
48fe6: 42a8 0004 clrl %a0@(4)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
48fea: 208a movel %a2,%a0@
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
the_chain->last = _Chain_Head(the_chain);
48fec: 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 );
}
}
48ff0: 241f movel %sp@+,%d2
48ff2: 245f moveal %sp@+,%a2
48ff4: 4e5e unlk %fp
48ff6: 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 ) {
48ff8: 2248 moveal %a0,%a1
48ffa: 4280 clrl %d0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
48ffc: 2400 movel %d0,%d2
48ffe: 2200 movel %d0,%d1
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
49000: 5280 addql #1,%d0
49002: e58a lsll #2,%d2
49004: e989 lsll #4,%d1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
49006: 42a9 0004 clrl %a1@(4)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
4900a: 9282 subl %d2,%d1
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
4900c: 45f0 1800 lea %a0@(00000000,%d1:l),%a2
49010: 234a 0008 movel %a2,%a1@(8)
49014: 45f0 1804 lea %a0@(00000004,%d1:l),%a2
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
49018: 7204 moveq #4,%d1
4901a: 228a movel %a2,%a1@
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
4901c: 43e9 000c lea %a1@(12),%a1
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
49020: b280 cmpl %d0,%d1
49022: 67cc beqs 48ff0 <_Thread_queue_Initialize+0x38> <== NEVER TAKEN
49024: 2400 movel %d0,%d2
49026: 2200 movel %d0,%d1
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
49028: 5280 addql #1,%d0
4902a: e58a lsll #2,%d2
4902c: e989 lsll #4,%d1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
4902e: 42a9 0004 clrl %a1@(4)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
49032: 9282 subl %d2,%d1
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
49034: 45f0 1800 lea %a0@(00000000,%d1:l),%a2
49038: 234a 0008 movel %a2,%a1@(8)
4903c: 45f0 1804 lea %a0@(00000004,%d1:l),%a2
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
49040: 7204 moveq #4,%d1
49042: 228a movel %a2,%a1@
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
49044: 43e9 000c lea %a1@(12),%a1
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
49048: b280 cmpl %d0,%d1
4904a: 66b0 bnes 48ffc <_Thread_queue_Initialize+0x44>
4904c: 60a2 bras 48ff0 <_Thread_queue_Initialize+0x38>
...
0004c264 <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
4c264: 4e56 0000 linkw %fp,#0
4c268: 206e 0008 moveal %fp@(8),%a0
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
4c26c: 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 &&
4c270: 2029 0030 movel %a1@(48),%d0
4c274: 6708 beqs 4c27e <_Thread_queue_Process_timeout+0x1a>
4c276: b1f9 0005 e5e0 cmpal 5e5e0 <_Per_CPU_Information+0xc>,%a0
4c27c: 6716 beqs 4c294 <_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;
4c27e: 2169 003c 0034 movel %a1@(60),%a0@(52)
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
4c284: 2f08 movel %a0,%sp@-
4c286: 2f09 movel %a1,%sp@-
4c288: 4eb9 0004 c144 jsr 4c144 <_Thread_queue_Extract>
4c28e: 508f addql #8,%sp
}
}
4c290: 4e5e unlk %fp
4c292: 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 ) {
4c294: 7203 moveq #3,%d1
4c296: b280 cmpl %d0,%d1
4c298: 67f6 beqs 4c290 <_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;
4c29a: 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 );
}
}
4c29c: 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;
4c29e: 2169 003c 0034 movel %a1@(60),%a0@(52)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
4c2a4: 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 );
}
}
...
00049050 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
49050: 4e56 fff0 linkw %fp,#-16
49054: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
49058: 246e 0008 moveal %fp@(8),%a2
4905c: 266e 000c moveal %fp@(12),%a3
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
49060: 4a8a tstl %a2
49062: 6708 beqs 4906c <_Thread_queue_Requeue+0x1c> <== 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 ) {
49064: 7001 moveq #1,%d0
49066: b0aa 0034 cmpl %a2@(52),%d0
4906a: 670a beqs 49076 <_Thread_queue_Requeue+0x26> <== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
4906c: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3 <== NOT EXECUTED
49072: 4e5e unlk %fp <== NOT EXECUTED
49074: 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 );
49076: 303c 0700 movew #1792,%d0
4907a: 40c2 movew %sr,%d2
4907c: 8082 orl %d2,%d0
4907e: 46c0 movew %d0,%sr
49080: 202b 0010 movel %a3@(16),%d0
49084: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4908a: 660c bnes 49098 <_Thread_queue_Requeue+0x48> <== 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 );
4908c: 46c2 movew %d2,%sr <== NOT EXECUTED
}
}
4908e: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
49094: 4e5e unlk %fp
49096: 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 );
49098: 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;
4909c: 7001 moveq #1,%d0
4909e: 2f0b movel %a3,%sp@-
490a0: 2540 0030 movel %d0,%a2@(48)
490a4: 2f0a movel %a2,%sp@-
490a6: 4eb9 0004 c17c jsr 4c17c <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
490ac: 486e fffc pea %fp@(-4)
490b0: 2f0b movel %a3,%sp@-
490b2: 2f0a movel %a2,%sp@-
490b4: 4eb9 0004 8da4 jsr 48da4 <_Thread_queue_Enqueue_priority>
490ba: 4fef 0018 lea %sp@(24),%sp
}
_ISR_Enable( level );
490be: 46c2 movew %d2,%sr
490c0: 60cc bras 4908e <_Thread_queue_Requeue+0x3e>
...
000490c4 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
490c4: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
490c8: 486e fffc pea %fp@(-4)
490cc: 2f2e 0008 movel %fp@(8),%sp@-
490d0: 4eb9 0004 8854 jsr 48854 <_Thread_Get>
switch ( location ) {
490d6: 508f addql #8,%sp
490d8: 4aae fffc tstl %fp@(-4)
490dc: 6618 bnes 490f6 <_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 );
490de: 2f00 movel %d0,%sp@-
490e0: 4eb9 0004 c264 jsr 4c264 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
490e6: 588f addql #4,%sp
490e8: 2039 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d0
490ee: 5380 subql #1,%d0
490f0: 23c0 0005 e41c movel %d0,5e41c <_Thread_Dispatch_disable_level>
_Thread_Unnest_dispatch();
break;
}
}
490f6: 4e5e unlk %fp
...
00059360 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
59360: 4e56 ffb0 linkw %fp,#-80
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
59364: 41ee ffec lea %fp@(-20),%a0
59368: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
5936c: 246e 0008 moveal %fp@(8),%a2
59370: 2c0e movel %fp,%d6
59372: 260e movel %fp,%d3
59374: 5186 subql #8,%d6
59376: 0683 ffff ffe8 addil #-24,%d3
5937c: 240a movel %a2,%d2
5937e: 2a0a movel %a2,%d5
59380: 4bf9 0005 d7bc lea 5d7bc <_Watchdog_Adjust_to_chain>,%a5
59386: 0682 0000 0030 addil #48,%d2
5938c: 0685 0000 0068 addil #104,%d5
59392: 47f9 0005 9f14 lea 59f14 <_Chain_Get>,%a3
59398: 49f9 0005 d844 lea 5d844 <_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 );
5939e: 283c 0000 0700 movel #1792,%d4
593a4: 2d48 ffd8 movel %a0,%fp@(-40)
593a8: 41ea 0008 lea %a2@(8),%a0
593ac: 2d48 ffe4 movel %a0,%fp@(-28)
593b0: 41ea 0040 lea %a2@(64),%a0
593b4: 2d48 ffe0 movel %a0,%fp@(-32)
{
Timer_server_Control *ts = (Timer_server_Control *) arg;
Chain_Control insert_chain;
Chain_Control fire_chain;
_Chain_Initialize_empty( &insert_chain );
593b8: 41ee fff4 lea %fp@(-12),%a0
593bc: 2d48 fffc movel %a0,%fp@(-4)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
593c0: 41ee ffec lea %fp@(-20),%a0
593c4: 2d46 fff4 movel %d6,%fp@(-12)
the_chain->permanent_null = NULL;
593c8: 42ae fff8 clrl %fp@(-8)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
593cc: 2d48 ffe8 movel %a0,%fp@(-24)
the_chain->permanent_null = NULL;
593d0: 42ae ffec clrl %fp@(-20)
the_chain->last = _Chain_Head(the_chain);
593d4: 2d43 fff0 movel %d3,%fp@(-16)
{
/*
* 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;
593d8: 41ee fff4 lea %fp@(-12),%a0
593dc: 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;
593e0: 2039 0007 d3f4 movel 7d3f4 <_Watchdog_Ticks_since_boot>,%d0
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
593e6: 222a 003c movel %a2@(60),%d1
watchdogs->last_snapshot = snapshot;
593ea: 2540 003c movel %d0,%a2@(60)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
593ee: 9081 subl %d1,%d0
593f0: 2f03 movel %d3,%sp@-
593f2: 2f00 movel %d0,%sp@-
593f4: 2f02 movel %d2,%sp@-
593f6: 4e95 jsr %a5@
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
593f8: 2039 0007 d352 movel 7d352 <_TOD_Now>,%d0
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
593fe: 4fef 000c lea %sp@(12),%sp
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
59402: 222a 0074 movel %a2@(116),%d1
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
59406: b280 cmpl %d0,%d1
59408: 6500 0086 bcsw 59490 <_Timer_server_Body+0x130>
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
5940c: b280 cmpl %d0,%d1
5940e: 6200 00a4 bhiw 594b4 <_Timer_server_Body+0x154>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
59412: 2540 0074 movel %d0,%a2@(116)
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
59416: 202a 0078 movel %a2@(120),%d0
5941a: 2f00 movel %d0,%sp@-
5941c: 4e93 jsr %a3@
if ( timer == NULL ) {
5941e: 588f addql #4,%sp
59420: 4a80 tstl %d0
59422: 672e beqs 59452 <_Timer_server_Body+0xf2> <== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
59424: 2040 moveal %d0,%a0 <== NOT EXECUTED
59426: 7e01 moveq #1,%d7 <== NOT EXECUTED
59428: 2228 0038 movel %a0@(56),%d1 <== NOT EXECUTED
5942c: be81 cmpl %d1,%d7 <== NOT EXECUTED
5942e: 6700 00a8 beqw 594d8 <_Timer_server_Body+0x178> <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
59432: 7e03 moveq #3,%d7 <== NOT EXECUTED
59434: be81 cmpl %d1,%d7 <== NOT EXECUTED
59436: 66de bnes 59416 <_Timer_server_Body+0xb6> <== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
59438: 2040 moveal %d0,%a0 <== NOT EXECUTED
5943a: 4868 0010 pea %a0@(16) <== NOT EXECUTED
5943e: 2f05 movel %d5,%sp@- <== NOT EXECUTED
59440: 4e94 jsr %a4@ <== NOT EXECUTED
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
59442: 202a 0078 movel %a2@(120),%d0 <== NOT EXECUTED
)
{
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 );
59446: 508f addql #8,%sp <== NOT EXECUTED
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
59448: 2f00 movel %d0,%sp@- <== NOT EXECUTED
5944a: 4e93 jsr %a3@ <== NOT EXECUTED
if ( timer == NULL ) {
5944c: 588f addql #4,%sp <== NOT EXECUTED
5944e: 4a80 tstl %d0 <== NOT EXECUTED
59450: 66d2 bnes 59424 <_Timer_server_Body+0xc4> <== NOT EXECUTED
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
59452: 2004 movel %d4,%d0
59454: 40c1 movew %sr,%d1
59456: 8081 orl %d1,%d0
59458: 46c0 movew %d0,%sr
if ( _Chain_Is_empty( insert_chain ) ) {
5945a: bcae fff4 cmpl %fp@(-12),%d6
5945e: 6700 0086 beqw 594e6 <_Timer_server_Body+0x186>
ts->insert_chain = NULL;
_ISR_Enable( level );
break;
} else {
_ISR_Enable( level );
59462: 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;
59464: 2039 0007 d3f4 movel 7d3f4 <_Watchdog_Ticks_since_boot>,%d0<== NOT EXECUTED
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
5946a: 222a 003c movel %a2@(60),%d1 <== NOT EXECUTED
watchdogs->last_snapshot = snapshot;
5946e: 2540 003c movel %d0,%a2@(60) <== NOT EXECUTED
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
59472: 9081 subl %d1,%d0 <== NOT EXECUTED
59474: 2f03 movel %d3,%sp@- <== NOT EXECUTED
59476: 2f00 movel %d0,%sp@- <== NOT EXECUTED
59478: 2f02 movel %d2,%sp@- <== NOT EXECUTED
5947a: 4e95 jsr %a5@ <== NOT EXECUTED
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
5947c: 2039 0007 d352 movel 7d352 <_TOD_Now>,%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 ) {
59482: 4fef 000c lea %sp@(12),%sp <== 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;
59486: 222a 0074 movel %a2@(116),%d1 <== 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 ) {
5948a: b280 cmpl %d0,%d1 <== NOT EXECUTED
5948c: 6400 ff7e bccw 5940c <_Timer_server_Body+0xac> <== 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 );
59490: 2f03 movel %d3,%sp@-
59492: 2e00 movel %d0,%d7
59494: 9e81 subl %d1,%d7
59496: 2f07 movel %d7,%sp@-
59498: 2d40 ffdc movel %d0,%fp@(-36)
5949c: 2f05 movel %d5,%sp@-
5949e: 4eb9 0005 d7bc jsr 5d7bc <_Watchdog_Adjust_to_chain>
594a4: 202e ffdc movel %fp@(-36),%d0
594a8: 4fef 000c lea %sp@(12),%sp
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
594ac: 2540 0074 movel %d0,%a2@(116)
594b0: 6000 ff64 braw 59416 <_Timer_server_Body+0xb6>
/*
* 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 );
594b4: 9280 subl %d0,%d1
594b6: 2f01 movel %d1,%sp@-
594b8: 4878 0001 pea 1 <ADD>
594bc: 2d40 ffdc movel %d0,%fp@(-36)
594c0: 2f05 movel %d5,%sp@-
594c2: 4eb9 0005 d728 jsr 5d728 <_Watchdog_Adjust>
594c8: 202e ffdc movel %fp@(-36),%d0
594cc: 4fef 000c lea %sp@(12),%sp
}
watchdogs->last_snapshot = snapshot;
594d0: 2540 0074 movel %d0,%a2@(116)
594d4: 6000 ff40 braw 59416 <_Timer_server_Body+0xb6>
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
594d8: 4868 0010 pea %a0@(16) <== NOT EXECUTED
594dc: 2f02 movel %d2,%sp@- <== NOT EXECUTED
594de: 4e94 jsr %a4@ <== NOT EXECUTED
594e0: 508f addql #8,%sp <== NOT EXECUTED
594e2: 6000 ff32 braw 59416 <_Timer_server_Body+0xb6> <== NOT EXECUTED
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
594e6: 42aa 0078 clrl %a2@(120)
_ISR_Enable( level );
594ea: 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 ) ) {
594ec: 202e ffd8 movel %fp@(-40),%d0
594f0: b0ae ffe8 cmpl %fp@(-24),%d0
594f4: 6752 beqs 59548 <_Timer_server_Body+0x1e8>
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
594f6: 2204 movel %d4,%d1
594f8: 40c0 movew %sr,%d0
594fa: 8280 orl %d0,%d1
594fc: 46c1 movew %d1,%sr
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
594fe: 206e ffe8 moveal %fp@(-24),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
59502: b1ee ffd8 cmpal %fp@(-40),%a0
59506: 6732 beqs 5953a <_Timer_server_Body+0x1da> <== NEVER TAKEN
{
Chain_Node *return_node;
Chain_Node *new_first;
return_node = the_chain->first;
new_first = return_node->next;
59508: 2250 moveal %a0@,%a1
the_chain->first = new_first;
new_first->previous = _Chain_Head(the_chain);
5950a: 2343 0004 movel %d3,%a1@(4)
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
5950e: 42a8 0008 clrl %a0@(8)
Chain_Node *return_node;
Chain_Node *new_first;
return_node = the_chain->first;
new_first = return_node->next;
the_chain->first = new_first;
59512: 2d49 ffe8 movel %a1,%fp@(-24)
_ISR_Enable( level );
59516: 46c0 movew %d0,%sr
/*
* The timer server may block here and wait for resources or time.
* The system watchdogs are inactive and will remain inactive since
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
59518: 2f28 0024 movel %a0@(36),%sp@-
5951c: 2f28 0020 movel %a0@(32),%sp@-
59520: 2068 001c moveal %a0@(28),%a0
59524: 4e90 jsr %a0@
}
59526: 508f addql #8,%sp
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
59528: 2204 movel %d4,%d1
5952a: 40c0 movew %sr,%d0
5952c: 8280 orl %d0,%d1
5952e: 46c1 movew %d1,%sr
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
59530: 206e ffe8 moveal %fp@(-24),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
59534: b1ee ffd8 cmpal %fp@(-40),%a0
59538: 66ce bnes 59508 <_Timer_server_Body+0x1a8>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
5953a: 46c0 movew %d0,%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;
5953c: 41ee fff4 lea %fp@(-12),%a0
59540: 2548 0078 movel %a0,%a2@(120)
59544: 6000 fe9a braw 593e0 <_Timer_server_Body+0x80>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
59548: 4207 clrb %d7
5954a: 1547 007c moveb %d7,%a2@(124)
5954e: 2039 0007 d2c8 movel 7d2c8 <_Thread_Dispatch_disable_level>,%d0
59554: 5280 addql #1,%d0
59556: 23c0 0007 d2c8 movel %d0,7d2c8 <_Thread_Dispatch_disable_level>
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
5955c: 4878 0008 pea 8 <DIVIDE_BY_ZERO>
59560: 2f12 movel %a2@,%sp@-
59562: 4eb9 0005 ce70 jsr 5ce70 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
59568: 2f0a movel %a2,%sp@-
5956a: 4eba fd1c jsr %pc@(59288 <_Timer_server_Reset_interval_system_watchdog>)
_Timer_server_Reset_tod_system_watchdog( ts );
5956e: 2f0a movel %a2,%sp@-
59570: 4eba fd80 jsr %pc@(592f2 <_Timer_server_Reset_tod_system_watchdog>)
_Thread_Enable_dispatch();
59574: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
ts->active = true;
5957a: 7001 moveq #1,%d0
5957c: 1540 007c moveb %d0,%a2@(124)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
59580: 2f2e ffe4 movel %fp@(-28),%sp@-
59584: 4eb9 0005 d98c jsr 5d98c <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
5958a: 2f2e ffe0 movel %fp@(-32),%sp@-
5958e: 4eb9 0005 d98c jsr 5d98c <_Watchdog_Remove>
59594: 4fef 0018 lea %sp@(24),%sp
59598: 6000 fe3e braw 593d8 <_Timer_server_Body+0x78>
0005959c <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
5959c: 4e56 fff0 linkw %fp,#-16
595a0: 206e 000c moveal %fp@(12),%a0
595a4: 48d7 041c moveml %d2-%d4/%a2,%sp@
595a8: 246e 0008 moveal %fp@(8),%a2
if ( ts->insert_chain == NULL ) {
595ac: 202a 0078 movel %a2@(120),%d0
595b0: 671a beqs 595cc <_Timer_server_Schedule_operation_method+0x30><== ALWAYS TAKEN
* 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 );
595b2: 202a 0078 movel %a2@(120),%d0 <== NOT EXECUTED
595b6: 2d48 000c movel %a0,%fp@(12) <== NOT EXECUTED
}
}
595ba: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 <== NOT EXECUTED
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
595c0: 2d40 0008 movel %d0,%fp@(8) <== NOT EXECUTED
}
}
595c4: 4e5e unlk %fp <== NOT EXECUTED
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
595c6: 4ef9 0005 9eb4 jmp 59eb4 <_Chain_Append> <== NOT EXECUTED
595cc: 2039 0007 d2c8 movel 7d2c8 <_Thread_Dispatch_disable_level>,%d0
595d2: 5280 addql #1,%d0
595d4: 23c0 0007 d2c8 movel %d0,7d2c8 <_Thread_Dispatch_disable_level>
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
595da: 2028 0038 movel %a0@(56),%d0
595de: 7201 moveq #1,%d1
595e0: b280 cmpl %d0,%d1
595e2: 6700 008a beqw 5966e <_Timer_server_Schedule_operation_method+0xd2>
_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 ) {
595e6: 7803 moveq #3,%d4
595e8: b880 cmpl %d0,%d4
595ea: 670e beqs 595fa <_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 );
}
}
595ec: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
595f2: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
595f4: 4ef9 0005 c3f2 jmp 5c3f2 <_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 );
595fa: 203c 0000 0700 movel #1792,%d0
59600: 40c2 movew %sr,%d2
59602: 8082 orl %d2,%d0
59604: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
59606: 260a movel %a2,%d3
59608: 0683 0000 006c addil #108,%d3
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
5960e: 2039 0007 d352 movel 7d352 <_TOD_Now>,%d0
last_snapshot = ts->TOD_watchdogs.last_snapshot;
59614: 222a 0074 movel %a2@(116),%d1
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
59618: 226a 0068 moveal %a2@(104),%a1
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
5961c: b689 cmpl %a1,%d3
5961e: 671c beqs 5963c <_Timer_server_Schedule_operation_method+0xa0>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
59620: 2629 0010 movel %a1@(16),%d3
if ( snapshot > last_snapshot ) {
59624: b280 cmpl %d0,%d1
59626: 6400 00ba bccw 596e2 <_Timer_server_Schedule_operation_method+0x146>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
5962a: 2800 movel %d0,%d4
5962c: 9881 subl %d1,%d4
if (delta_interval > delta) {
5962e: b883 cmpl %d3,%d4
59630: 6400 00bc bccw 596ee <_Timer_server_Schedule_operation_method+0x152>
delta_interval -= delta;
59634: 9684 subl %d4,%d3
59636: 2203 movel %d3,%d1
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
59638: 2341 0010 movel %d1,%a1@(16)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
5963c: 2540 0074 movel %d0,%a2@(116)
_ISR_Enable( level );
59640: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
59642: 4868 0010 pea %a0@(16)
59646: 486a 0068 pea %a2@(104)
5964a: 4eb9 0005 d844 jsr 5d844 <_Watchdog_Insert>
if ( !ts->active ) {
59650: 508f addql #8,%sp
59652: 102a 007c moveb %a2@(124),%d0
59656: 6694 bnes 595ec <_Timer_server_Schedule_operation_method+0x50>
_Timer_server_Reset_tod_system_watchdog( ts );
59658: 2f0a movel %a2,%sp@-
5965a: 4eba fc96 jsr %pc@(592f2 <_Timer_server_Reset_tod_system_watchdog>)
5965e: 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 );
}
}
59660: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
59666: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
59668: 4ef9 0005 c3f2 jmp 5c3f2 <_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 );
5966e: 203c 0000 0700 movel #1792,%d0
59674: 40c3 movew %sr,%d3
59676: 8083 orl %d3,%d0
59678: 46c0 movew %d0,%sr
snapshot = _Watchdog_Ticks_since_boot;
5967a: 2039 0007 d3f4 movel 7d3f4 <_Watchdog_Ticks_since_boot>,%d0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
Chain_Control *the_chain
)
{
return (Chain_Node *) &the_chain->permanent_null;
59680: 220a movel %a2,%d1
59682: 0681 0000 0034 addil #52,%d1
last_snapshot = ts->Interval_watchdogs.last_snapshot;
59688: 282a 003c movel %a2@(60),%d4
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
5968c: 226a 0030 moveal %a2@(48),%a1
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
59690: b289 cmpl %a1,%d1
59692: 6712 beqs 596a6 <_Timer_server_Schedule_operation_method+0x10a>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
59694: 2200 movel %d0,%d1
59696: 9284 subl %d4,%d1
delta_interval = first_watchdog->delta_interval;
59698: 2429 0010 movel %a1@(16),%d2
if (delta_interval > delta) {
5969c: b481 cmpl %d1,%d2
5969e: 633a blss 596da <_Timer_server_Schedule_operation_method+0x13e>
delta_interval -= delta;
596a0: 9481 subl %d1,%d2
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
596a2: 2342 0010 movel %d2,%a1@(16)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
596a6: 2540 003c movel %d0,%a2@(60)
_ISR_Enable( level );
596aa: 46c3 movew %d3,%sr
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
596ac: 4868 0010 pea %a0@(16)
596b0: 486a 0030 pea %a2@(48)
596b4: 4eb9 0005 d844 jsr 5d844 <_Watchdog_Insert>
if ( !ts->active ) {
596ba: 508f addql #8,%sp
596bc: 102a 007c moveb %a2@(124),%d0
596c0: 6600 ff2a bnew 595ec <_Timer_server_Schedule_operation_method+0x50>
_Timer_server_Reset_interval_system_watchdog( ts );
596c4: 2f0a movel %a2,%sp@-
596c6: 4eba fbc0 jsr %pc@(59288 <_Timer_server_Reset_interval_system_watchdog>)
596ca: 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 );
}
}
596cc: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
596d2: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
596d4: 4ef9 0005 c3f2 jmp 5c3f2 <_Thread_Enable_dispatch>
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
596da: 4282 clrl %d2
}
first_watchdog->delta_interval = delta_interval;
596dc: 2342 0010 movel %d2,%a1@(16)
596e0: 60c4 bras 596a6 <_Timer_server_Schedule_operation_method+0x10a>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
596e2: d283 addl %d3,%d1
delta_interval += delta;
596e4: 9280 subl %d0,%d1
}
first_watchdog->delta_interval = delta_interval;
596e6: 2341 0010 movel %d1,%a1@(16)
596ea: 6000 ff50 braw 5963c <_Timer_server_Schedule_operation_method+0xa0>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
596ee: 4281 clrl %d1 <== NOT EXECUTED
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
596f0: 2341 0010 movel %d1,%a1@(16) <== NOT EXECUTED
596f4: 6000 ff46 braw 5963c <_Timer_server_Schedule_operation_method+0xa0><== NOT EXECUTED
00049628 <_Timespec_Add_to>:
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
49628: 4e56 0000 linkw %fp,#0
4962c: 226e 0008 moveal %fp@(8),%a1
49630: 2f0a movel %a2,%sp@-
49632: 246e 000c moveal %fp@(12),%a2
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
49636: 206a 0004 moveal %a2@(4),%a0
4963a: d1e9 0004 addal %a1@(4),%a0
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
4963e: 2208 movel %a0,%d1
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
uint32_t seconds = add->tv_sec;
49640: 2012 movel %a2@,%d0
/* Add the basics */
time->tv_sec += add->tv_sec;
49642: d191 addl %d0,%a1@
time->tv_nsec += add->tv_nsec;
49644: 2348 0004 movel %a0,%a1@(4)
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
49648: b1fc 3b9a c9ff cmpal #999999999,%a0
4964e: 631a blss 4966a <_Timespec_Add_to+0x42>
49650: 2051 moveal %a1@,%a0
*
* This routines adds two timespecs. The second argument is added
* to the first.
*/
uint32_t _Timespec_Add_to(
49652: 5288 addql #1,%a0
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;
49654: 0681 c465 3600 addil #-1000000000,%d1
time->tv_sec++;
seconds++;
4965a: 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 ) {
4965c: 0c81 3b9a c9ff cmpil #999999999,%d1
49662: 62ee bhis 49652 <_Timespec_Add_to+0x2a> <== NEVER TAKEN
49664: 2341 0004 movel %d1,%a1@(4)
49668: 2288 movel %a0,%a1@
time->tv_sec++;
seconds++;
}
return seconds;
}
4966a: 245f moveal %sp@+,%a2
4966c: 4e5e unlk %fp <== NOT EXECUTED
0004b254 <_Timespec_Greater_than>:
bool _Timespec_Greater_than(
const struct timespec *lhs,
const struct timespec *rhs
)
{
4b254: 4e56 0000 linkw %fp,#0
4b258: 226e 0008 moveal %fp@(8),%a1
4b25c: 206e 000c moveal %fp@(12),%a0
if ( lhs->tv_sec > rhs->tv_sec )
4b260: 2211 movel %a1@,%d1
4b262: 2010 movel %a0@,%d0
4b264: b081 cmpl %d1,%d0
4b266: 6d18 blts 4b280 <_Timespec_Greater_than+0x2c>
return true;
if ( lhs->tv_sec < rhs->tv_sec )
4b268: 6e10 bgts 4b27a <_Timespec_Greater_than+0x26> <== NEVER TAKEN
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Greater_than(
4b26a: 2068 0004 moveal %a0@(4),%a0
4b26e: b1e9 0004 cmpal %a1@(4),%a0
4b272: 5dc0 slt %d0
/* ASSERT: lhs->tv_sec == rhs->tv_sec */
if ( lhs->tv_nsec > rhs->tv_nsec )
return true;
return false;
}
4b274: 4e5e unlk %fp
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Greater_than(
4b276: 4480 negl %d0
/* ASSERT: lhs->tv_sec == rhs->tv_sec */
if ( lhs->tv_nsec > rhs->tv_nsec )
return true;
return false;
}
4b278: 4e75 rts
4b27a: 4e5e unlk %fp <== NOT EXECUTED
{
if ( lhs->tv_sec > rhs->tv_sec )
return true;
if ( lhs->tv_sec < rhs->tv_sec )
return false;
4b27c: 4200 clrb %d0 <== NOT EXECUTED
/* ASSERT: lhs->tv_sec == rhs->tv_sec */
if ( lhs->tv_nsec > rhs->tv_nsec )
return true;
return false;
}
4b27e: 4e75 rts <== NOT EXECUTED
4b280: 4e5e unlk %fp
const struct timespec *lhs,
const struct timespec *rhs
)
{
if ( lhs->tv_sec > rhs->tv_sec )
return true;
4b282: 7001 moveq #1,%d0
/* ASSERT: lhs->tv_sec == rhs->tv_sec */
if ( lhs->tv_nsec > rhs->tv_nsec )
return true;
return false;
}
...
00049802 <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
49802: 4e56 fff0 linkw %fp,#-16
49806: 48d7 041c moveml %d2-%d4/%a2,%sp@
4980a: 242e 0008 movel %fp@(8),%d2
4980e: 262e 0010 movel %fp@(16),%d3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
49812: 2479 0005 e598 moveal 5e598 <_User_extensions_List+0x8>,%a2
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
49818: 182e 000f moveb %fp@(15),%d4
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
4981c: b5fc 0005 e590 cmpal #386448,%a2
49822: 6726 beqs 4984a <_User_extensions_Fatal+0x48> <== NEVER TAKEN
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
49824: 0284 0000 00ff andil #255,%d4
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
4982a: 206a 0030 moveal %a2@(48),%a0
4982e: 4a88 tstl %a0
49830: 670c beqs 4983e <_User_extensions_Fatal+0x3c>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
49832: 2f03 movel %d3,%sp@-
49834: 2f04 movel %d4,%sp@-
49836: 2f02 movel %d2,%sp@-
49838: 4e90 jsr %a0@
4983a: 4fef 000c lea %sp@(12),%sp <== NOT EXECUTED
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
4983e: 246a 0004 moveal %a2@(4),%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
49842: b5fc 0005 e590 cmpal #386448,%a2
49848: 66e0 bnes 4982a <_User_extensions_Fatal+0x28> <== ALWAYS TAKEN
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
4984a: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 <== NOT EXECUTED
49850: 4e5e unlk %fp <== NOT EXECUTED
000496c0 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
496c0: 4e56 ffec linkw %fp,#-20
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
496c4: 203c 0005 e594 movel #386452,%d0
496ca: 23c0 0005 e590 movel %d0,5e590 <_User_extensions_List>
the_chain->permanent_null = NULL;
the_chain->last = _Chain_Head(the_chain);
496d0: 203c 0005 e590 movel #386448,%d0
496d6: 23c0 0005 e598 movel %d0,5e598 <_User_extensions_List+0x8>
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
496dc: 203c 0005 e424 movel #386084,%d0
496e2: 23c0 0005 e420 movel %d0,5e420 <_User_extensions_Switches_list>
the_chain->permanent_null = NULL;
the_chain->last = _Chain_Head(the_chain);
496e8: 203c 0005 e420 movel #386080,%d0
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
496ee: 42b9 0005 e594 clrl 5e594 <_User_extensions_List+0x4>
496f4: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
User_extensions_Control *extension;
uint32_t i;
uint32_t number_of_extensions;
User_extensions_Table *initial_extensions;
number_of_extensions = Configuration.number_of_initial_extensions;
496f8: 2439 0005 cd2a movel 5cd2a <Configuration+0x36>,%d2
initial_extensions = Configuration.User_extension_table;
496fe: 2639 0005 cd2e movel 5cd2e <Configuration+0x3a>,%d3
49704: 42b9 0005 e424 clrl 5e424 <_User_extensions_Switches_list+0x4>
the_chain->last = _Chain_Head(the_chain);
4970a: 23c0 0005 e428 movel %d0,5e428 <_User_extensions_Switches_list+0x8>
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
49710: 4a83 tstl %d3
49712: 6764 beqs 49778 <_User_extensions_Handler_initialization+0xb8><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
49714: 7834 moveq #52,%d4
49716: 4c02 4800 mulsl %d2,%d4
4971a: 2f04 movel %d4,%sp@-
4971c: 4eb9 0004 9c76 jsr 49c76 <_Workspace_Allocate_or_fatal_error>
49722: 2440 moveal %d0,%a2
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
49724: 2f04 movel %d4,%sp@-
49726: 42a7 clrl %sp@-
49728: 2f00 movel %d0,%sp@-
4972a: 4eb9 0004 e388 jsr 4e388 <memset>
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
49730: 4fef 0010 lea %sp@(16),%sp
49734: 4a82 tstl %d2
49736: 6740 beqs 49778 <_User_extensions_Handler_initialization+0xb8><== NEVER TAKEN
49738: 4284 clrl %d4
4973a: 47f9 0004 c36c lea 4c36c <_User_extensions_Add_set>,%a3
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
49740: 2043 moveal %d3,%a0
49742: 5284 addql #1,%d4
49744: 0683 0000 0020 addil #32,%d3
4974a: 2558 0014 movel %a0@+,%a2@(20)
4974e: 2558 0018 movel %a0@+,%a2@(24)
49752: 2558 001c movel %a0@+,%a2@(28)
49756: 2558 0020 movel %a0@+,%a2@(32)
4975a: 2558 0024 movel %a0@+,%a2@(36)
4975e: 2558 0028 movel %a0@+,%a2@(40)
49762: 2558 002c movel %a0@+,%a2@(44)
49766: 2550 0030 movel %a0@,%a2@(48)
_User_extensions_Add_set( extension );
4976a: 2f0a movel %a2,%sp@-
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
4976c: 45ea 0034 lea %a2@(52),%a2
49770: 4e93 jsr %a3@
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
49772: 588f addql #4,%sp
49774: b882 cmpl %d2,%d4
49776: 65c8 bcss 49740 <_User_extensions_Handler_initialization+0x80>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
49778: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
4977e: 4e5e unlk %fp
...
00049784 <_User_extensions_Thread_begin>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
49784: 4e56 0000 linkw %fp,#0
49788: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
4978a: 2479 0005 e590 moveal 5e590 <_User_extensions_List>,%a2
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
49790: 2f02 movel %d2,%sp@-
49792: 242e 0008 movel %fp@(8),%d2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
49796: b5fc 0005 e594 cmpal #386452,%a2
4979c: 6718 beqs 497b6 <_User_extensions_Thread_begin+0x32><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
4979e: 206a 0028 moveal %a2@(40),%a0
497a2: 4a88 tstl %a0
497a4: 6706 beqs 497ac <_User_extensions_Thread_begin+0x28>
(*the_extension->Callouts.thread_begin)( executing );
497a6: 2f02 movel %d2,%sp@-
497a8: 4e90 jsr %a0@
497aa: 588f addql #4,%sp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
497ac: 2452 moveal %a2@,%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
497ae: b5fc 0005 e594 cmpal #386452,%a2
497b4: 66e8 bnes 4979e <_User_extensions_Thread_begin+0x1a>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
(*the_extension->Callouts.thread_begin)( executing );
}
}
497b6: 242e fff8 movel %fp@(-8),%d2
497ba: 246e fffc moveal %fp@(-4),%a2
497be: 4e5e unlk %fp <== NOT EXECUTED
00049854 <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
49854: 4e56 0000 linkw %fp,#0
49858: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _User_extensions_List.first ;
4985a: 2479 0005 e590 moveal 5e590 <_User_extensions_List>,%a2
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
49860: 2f02 movel %d2,%sp@-
49862: 242e 0008 movel %fp@(8),%d2
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _User_extensions_List.first ;
49866: b5fc 0005 e594 cmpal #386452,%a2
4986c: 6722 beqs 49890 <_User_extensions_Thread_create+0x3c><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
4986e: 206a 0014 moveal %a2@(20),%a0
49872: 4a88 tstl %a0
49874: 6710 beqs 49886 <_User_extensions_Thread_create+0x32>
status = (*the_extension->Callouts.thread_create)(
49876: 2f02 movel %d2,%sp@-
49878: 2f39 0005 e5e0 movel 5e5e0 <_Per_CPU_Information+0xc>,%sp@-
4987e: 4e90 jsr %a0@
_Thread_Executing,
the_thread
);
if ( !status )
49880: 508f addql #8,%sp
49882: 4a00 tstb %d0
49884: 6718 beqs 4989e <_User_extensions_Thread_create+0x4a>
User_extensions_Control *the_extension;
bool status;
for ( the_node = _User_extensions_List.first ;
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
49886: 2452 moveal %a2@,%a2
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _User_extensions_List.first ;
49888: b5fc 0005 e594 cmpal #386452,%a2
4988e: 66de bnes 4986e <_User_extensions_Thread_create+0x1a>
return false;
}
}
return true;
}
49890: 242e fff8 movel %fp@(-8),%d2
49894: 246e fffc moveal %fp@(-4),%a2
49898: 4e5e unlk %fp
if ( !status )
return false;
}
}
return true;
4989a: 7001 moveq #1,%d0
}
4989c: 4e75 rts
4989e: 242e fff8 movel %fp@(-8),%d2
498a2: 246e fffc moveal %fp@(-4),%a2
498a6: 4e5e unlk %fp
status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
if ( !status )
return false;
498a8: 4200 clrb %d0 <== NOT EXECUTED
}
}
return true;
}
000498ac <_User_extensions_Thread_delete>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
498ac: 4e56 0000 linkw %fp,#0
498b0: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
498b2: 2479 0005 e598 moveal 5e598 <_User_extensions_List+0x8>,%a2
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
498b8: 2f02 movel %d2,%sp@-
498ba: 242e 0008 movel %fp@(8),%d2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
498be: b5fc 0005 e590 cmpal #386448,%a2
498c4: 6720 beqs 498e6 <_User_extensions_Thread_delete+0x3a><== NEVER TAKEN
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
498c6: 206a 0020 moveal %a2@(32),%a0
498ca: 4a88 tstl %a0
498cc: 670c beqs 498da <_User_extensions_Thread_delete+0x2e>
(*the_extension->Callouts.thread_delete)(
498ce: 2f02 movel %d2,%sp@-
498d0: 2f39 0005 e5e0 movel 5e5e0 <_Per_CPU_Information+0xc>,%sp@-
498d6: 4e90 jsr %a0@
498d8: 508f addql #8,%sp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
498da: 246a 0004 moveal %a2@(4),%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
498de: b5fc 0005 e590 cmpal #386448,%a2
498e4: 66e0 bnes 498c6 <_User_extensions_Thread_delete+0x1a>
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
498e6: 242e fff8 movel %fp@(-8),%d2
498ea: 246e fffc moveal %fp@(-4),%a2
498ee: 4e5e unlk %fp
...
000497c2 <_User_extensions_Thread_exitted>:
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
497c2: 4e56 0000 linkw %fp,#0
497c6: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
497c8: 2479 0005 e598 moveal 5e598 <_User_extensions_List+0x8>,%a2
}
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
497ce: 2f02 movel %d2,%sp@-
497d0: 242e 0008 movel %fp@(8),%d2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
497d4: b5fc 0005 e590 cmpal #386448,%a2
497da: 671a beqs 497f6 <_User_extensions_Thread_exitted+0x34><== NEVER TAKEN
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
497dc: 206a 002c moveal %a2@(44),%a0
497e0: 4a88 tstl %a0
497e2: 6706 beqs 497ea <_User_extensions_Thread_exitted+0x28>
(*the_extension->Callouts.thread_exitted)( executing );
497e4: 2f02 movel %d2,%sp@-
497e6: 4e90 jsr %a0@
497e8: 588f addql #4,%sp <== NOT EXECUTED
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
497ea: 246a 0004 moveal %a2@(4),%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.last ;
497ee: b5fc 0005 e590 cmpal #386448,%a2
497f4: 66e6 bnes 497dc <_User_extensions_Thread_exitted+0x1a>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
(*the_extension->Callouts.thread_exitted)( executing );
}
}
497f6: 242e fff8 movel %fp@(-8),%d2
497fa: 246e fffc moveal %fp@(-4),%a2
497fe: 4e5e unlk %fp <== NOT EXECUTED
0004a598 <_User_extensions_Thread_restart>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
4a598: 4e56 0000 linkw %fp,#0
4a59c: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
4a59e: 2479 0005 f528 moveal 5f528 <_User_extensions_List>,%a2
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
4a5a4: 2f02 movel %d2,%sp@-
4a5a6: 242e 0008 movel %fp@(8),%d2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
4a5aa: b5fc 0005 f52c cmpal #390444,%a2
4a5b0: 671e beqs 4a5d0 <_User_extensions_Thread_restart+0x38><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
4a5b2: 206a 001c moveal %a2@(28),%a0
4a5b6: 4a88 tstl %a0
4a5b8: 670c beqs 4a5c6 <_User_extensions_Thread_restart+0x2e>
(*the_extension->Callouts.thread_restart)(
4a5ba: 2f02 movel %d2,%sp@-
4a5bc: 2f39 0005 f578 movel 5f578 <_Per_CPU_Information+0xc>,%sp@-
4a5c2: 4e90 jsr %a0@
4a5c4: 508f addql #8,%sp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
4a5c6: 2452 moveal %a2@,%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
4a5c8: b5fc 0005 f52c cmpal #390444,%a2
4a5ce: 66e2 bnes 4a5b2 <_User_extensions_Thread_restart+0x1a>
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
4a5d0: 242e fff8 movel %fp@(-8),%d2
4a5d4: 246e fffc moveal %fp@(-4),%a2
4a5d8: 4e5e unlk %fp <== NOT EXECUTED
000498f4 <_User_extensions_Thread_start>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
498f4: 4e56 0000 linkw %fp,#0
498f8: 2f0a movel %a2,%sp@-
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
498fa: 2479 0005 e590 moveal 5e590 <_User_extensions_List>,%a2
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
49900: 2f02 movel %d2,%sp@-
49902: 242e 0008 movel %fp@(8),%d2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
49906: b5fc 0005 e594 cmpal #386452,%a2
4990c: 671e beqs 4992c <_User_extensions_Thread_start+0x38><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
4990e: 206a 0018 moveal %a2@(24),%a0
49912: 4a88 tstl %a0
49914: 670c beqs 49922 <_User_extensions_Thread_start+0x2e>
(*the_extension->Callouts.thread_start)(
49916: 2f02 movel %d2,%sp@-
49918: 2f39 0005 e5e0 movel 5e5e0 <_Per_CPU_Information+0xc>,%sp@-
4991e: 4e90 jsr %a0@
49920: 508f addql #8,%sp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
49922: 2452 moveal %a2@,%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _User_extensions_List.first ;
49924: b5fc 0005 e594 cmpal #386452,%a2
4992a: 66e2 bnes 4990e <_User_extensions_Thread_start+0x1a>
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
4992c: 242e fff8 movel %fp@(-8),%d2
49930: 246e fffc moveal %fp@(-4),%a2
49934: 4e5e unlk %fp <== NOT EXECUTED
00049938 <_User_extensions_Thread_switch>:
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
49938: 4e56 fff4 linkw %fp,#-12
4993c: 48d7 040c moveml %d2-%d3/%a2,%sp@
49940: 262e 0008 movel %fp@(8),%d3
49944: 242e 000c movel %fp@(12),%d2
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _User_extensions_Switches_list.first ;
49948: 2479 0005 e420 moveal 5e420 <_User_extensions_Switches_list>,%a2
4994e: b5fc 0005 e424 cmpal #386084,%a2
49954: 6716 beqs 4996c <_User_extensions_Thread_switch+0x34><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
49956: 2f02 movel %d2,%sp@-
49958: 2f03 movel %d3,%sp@-
4995a: 206a 0008 moveal %a2@(8),%a0
4995e: 4e90 jsr %a0@
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _User_extensions_Switches_list.first ;
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
49960: 2452 moveal %a2@,%a2
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _User_extensions_Switches_list.first ;
49962: 508f addql #8,%sp
49964: b5fc 0005 e424 cmpal #386084,%a2
4996a: 66ea bnes 49956 <_User_extensions_Thread_switch+0x1e>
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
4996c: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
49972: 4e5e unlk %fp
...
0004b604 <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
4b604: 4e56 ffe8 linkw %fp,#-24
4b608: 226e 000c moveal %fp@(12),%a1
4b60c: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%sp@
ISR_Level level;
_ISR_Disable( level );
4b610: 283c 0000 0700 movel #1792,%d4
4b616: 2004 movel %d4,%d0
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
4b618: 266e 0008 moveal %fp@(8),%a3
4b61c: 242e 0010 movel %fp@(16),%d2
ISR_Level level;
_ISR_Disable( level );
4b620: 40c1 movew %sr,%d1
4b622: 8081 orl %d1,%d0
4b624: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
4b626: 244b moveal %a3,%a2
4b628: 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 ) ) {
4b62a: b5c8 cmpal %a0,%a2
4b62c: 6748 beqs 4b676 <_Watchdog_Adjust+0x72>
switch ( direction ) {
4b62e: 4a89 tstl %a1
4b630: 6650 bnes 4b682 <_Watchdog_Adjust+0x7e>
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
4b632: 4a82 tstl %d2
4b634: 6740 beqs 4b676 <_Watchdog_Adjust+0x72> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
4b636: 2628 0010 movel %a0@(16),%d3
4b63a: 49f9 0004 b880 lea 4b880 <_Watchdog_Tickle>,%a4
4b640: b682 cmpl %d2,%d3
4b642: 622c bhis 4b670 <_Watchdog_Adjust+0x6c> <== NEVER TAKEN
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
4b644: 7001 moveq #1,%d0
4b646: 2140 0010 movel %d0,%a0@(16)
_ISR_Enable( level );
4b64a: 46c1 movew %d1,%sr
_Watchdog_Tickle( header );
4b64c: 2f0b movel %a3,%sp@-
4b64e: 4e94 jsr %a4@
_ISR_Disable( level );
4b650: 2004 movel %d4,%d0
4b652: 40c1 movew %sr,%d1
4b654: 8081 orl %d1,%d0
4b656: 46c0 movew %d0,%sr
if ( _Chain_Is_empty( header ) )
4b658: 588f addql #4,%sp
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
4b65a: 9483 subl %d3,%d2
4b65c: 2013 movel %a3@,%d0
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) header->first );
4b65e: 2040 moveal %d0,%a0
_Watchdog_Tickle( header );
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
4b660: b08a cmpl %a2,%d0
4b662: 6712 beqs 4b676 <_Watchdog_Adjust+0x72>
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
4b664: 4a82 tstl %d2
4b666: 670e beqs 4b676 <_Watchdog_Adjust+0x72> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
4b668: 2628 0010 movel %a0@(16),%d3
4b66c: b483 cmpl %d3,%d2
4b66e: 64d4 bccs 4b644 <_Watchdog_Adjust+0x40>
_Watchdog_First( header )->delta_interval -= units;
4b670: 9682 subl %d2,%d3
4b672: 2143 0010 movel %d3,%a0@(16)
}
break;
}
}
_ISR_Enable( level );
4b676: 46c1 movew %d1,%sr
}
4b678: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
4b67e: 4e5e unlk %fp
4b680: 4e75 rts
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
4b682: 7001 moveq #1,%d0
4b684: b089 cmpl %a1,%d0
4b686: 66ee bnes 4b676 <_Watchdog_Adjust+0x72> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
4b688: d5a8 0010 addl %d2,%a0@(16)
}
break;
}
}
_ISR_Enable( level );
4b68c: 46c1 movew %d1,%sr
}
4b68e: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
4b694: 4e5e unlk %fp <== NOT EXECUTED
00049978 <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
49978: 4e56 ffec linkw %fp,#-20
4997c: 226e 000c moveal %fp@(12),%a1
49980: 48d7 043c moveml %d2-%d5/%a2,%sp@
49984: 246e 0008 moveal %fp@(8),%a2
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
_ISR_Disable( level );
49988: 2a3c 0000 0700 movel #1792,%d5
4998e: 2005 movel %d5,%d0
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
49990: 2839 0005 e5dc movel 5e5dc <_Per_CPU_Information+0x8>,%d4
_ISR_Disable( level );
49996: 40c3 movew %sr,%d3
49998: 8083 orl %d3,%d0
4999a: 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 ) {
4999c: 4aa9 0008 tstl %a1@(8)
499a0: 6600 00c6 bnew 49a68 <_Watchdog_Insert+0xf0>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
499a4: 2039 0005 e544 movel 5e544 <_Watchdog_Sync_count>,%d0
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
499aa: 7201 moveq #1,%d1
_Watchdog_Sync_count++;
499ac: 5280 addql #1,%d0
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
499ae: 2341 0008 movel %d1,%a1@(8)
_Watchdog_Sync_count++;
499b2: 23c0 0005 e544 movel %d0,5e544 <_Watchdog_Sync_count>
restart:
delta_interval = the_watchdog->initial;
499b8: 2029 000c movel %a1@(12),%d0
* cache *header!!
*
* Till Straumann, 7/2003 (gcc-3.2.2 -O4 on powerpc)
*
*/
for ( after = (Watchdog_Control *) ((volatile Chain_Control *)header)->first ;
499bc: 2052 moveal %a2@,%a0
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
499be: 6764 beqs 49a24 <_Watchdog_Insert+0xac>
499c0: 4a90 tstl %a0@
499c2: 6760 beqs 49a24 <_Watchdog_Insert+0xac>
break;
if ( delta_interval < after->delta_interval ) {
499c4: 2228 0010 movel %a0@(16),%d1
499c8: b280 cmpl %d0,%d1
499ca: 6252 bhis 49a1e <_Watchdog_Insert+0xa6>
* used around this flash point allowed interrupts to execute
* which violated the design assumptions. The critical section
* mechanism used here WAS redesigned to address this.
*/
_ISR_Flash( level );
499cc: 2405 movel %d5,%d2
499ce: 46c3 movew %d3,%sr
499d0: 8483 orl %d3,%d2
499d2: 46c2 movew %d2,%sr
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
499d4: 7401 moveq #1,%d2
499d6: b4a9 0008 cmpl %a1@(8),%d2
499da: 666e bnes 49a4a <_Watchdog_Insert+0xd2>
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
499dc: 2439 0005 e4c2 movel 5e4c2 <_Watchdog_Sync_level>,%d2
499e2: b484 cmpl %d4,%d2
499e4: 6230 bhis 49a16 <_Watchdog_Insert+0x9e>
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
499e6: 9081 subl %d1,%d0
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
499e8: 2050 moveal %a0@,%a0
*/
for ( after = (Watchdog_Control *) ((volatile Chain_Control *)header)->first ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
499ea: 4a80 tstl %d0
499ec: 6736 beqs 49a24 <_Watchdog_Insert+0xac>
499ee: 4a90 tstl %a0@
499f0: 6732 beqs 49a24 <_Watchdog_Insert+0xac>
break;
if ( delta_interval < after->delta_interval ) {
499f2: 2228 0010 movel %a0@(16),%d1
499f6: b081 cmpl %d1,%d0
499f8: 6524 bcss 49a1e <_Watchdog_Insert+0xa6>
* used around this flash point allowed interrupts to execute
* which violated the design assumptions. The critical section
* mechanism used here WAS redesigned to address this.
*/
_ISR_Flash( level );
499fa: 2405 movel %d5,%d2
499fc: 46c3 movew %d3,%sr
499fe: 8483 orl %d3,%d2
49a00: 46c2 movew %d2,%sr
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
49a02: 9081 subl %d1,%d0
* mechanism used here WAS redesigned to address this.
*/
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
49a04: 7201 moveq #1,%d1
49a06: b2a9 0008 cmpl %a1@(8),%d1
49a0a: 663e bnes 49a4a <_Watchdog_Insert+0xd2> <== NEVER TAKEN
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
49a0c: 2239 0005 e4c2 movel 5e4c2 <_Watchdog_Sync_level>,%d1
49a12: b284 cmpl %d4,%d1
49a14: 63d2 blss 499e8 <_Watchdog_Insert+0x70> <== ALWAYS TAKEN
_Watchdog_Sync_level = insert_isr_nest_level;
49a16: 23c4 0005 e4c2 movel %d4,5e4c2 <_Watchdog_Sync_level>
goto restart;
49a1c: 609a bras 499b8 <_Watchdog_Insert+0x40>
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
break;
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
49a1e: 9280 subl %d0,%d1
49a20: 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 );
49a24: 2068 0004 moveal %a0@(4),%a0
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
49a28: 7402 moveq #2,%d2
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
49a2a: 2450 moveal %a0@,%a2
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
49a2c: 2340 0010 movel %d0,%a1@(16)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
49a30: 2039 0005 e548 movel 5e548 <_Watchdog_Ticks_since_boot>,%d0
49a36: 2342 0008 movel %d2,%a1@(8)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
49a3a: 2348 0004 movel %a0,%a1@(4)
before_node = after_node->next;
after_node->next = the_node;
49a3e: 2089 movel %a1,%a0@
the_node->next = before_node;
before_node->previous = the_node;
49a40: 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;
49a44: 228a movel %a2,%a1@
49a46: 2340 0014 movel %d0,%a1@(20)
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
49a4a: 23c4 0005 e4c2 movel %d4,5e4c2 <_Watchdog_Sync_level>
_Watchdog_Sync_count--;
49a50: 2039 0005 e544 movel 5e544 <_Watchdog_Sync_count>,%d0
49a56: 5380 subql #1,%d0
49a58: 23c0 0005 e544 movel %d0,5e544 <_Watchdog_Sync_count>
_ISR_Enable( level );
49a5e: 46c3 movew %d3,%sr
}
49a60: 4cd7 043c moveml %sp@,%d2-%d5/%a2
49a64: 4e5e unlk %fp
49a66: 4e75 rts
* 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 ) {
_ISR_Enable( level );
49a68: 46c3 movew %d3,%sr
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
49a6a: 4cd7 043c moveml %sp@,%d2-%d5/%a2
49a6e: 4e5e unlk %fp
...
00049ac0 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
49ac0: 203c 0000 0700 movel #1792,%d0
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
49ac6: 4e56 0000 linkw %fp,#0
49aca: 206e 0008 moveal %fp@(8),%a0
49ace: 2f0a movel %a2,%sp@-
49ad0: 2f02 movel %d2,%sp@-
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
49ad2: 40c1 movew %sr,%d1
49ad4: 8081 orl %d1,%d0
49ad6: 46c0 movew %d0,%sr
previous_state = the_watchdog->state;
49ad8: 2028 0008 movel %a0@(8),%d0
switch ( previous_state ) {
49adc: 7401 moveq #1,%d2
49ade: b480 cmpl %d0,%d2
49ae0: 6764 beqs 49b46 <_Watchdog_Remove+0x86> <== NEVER TAKEN
49ae2: 6314 blss 49af8 <_Watchdog_Remove+0x38>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
49ae4: 2279 0005 e548 moveal 5e548 <_Watchdog_Ticks_since_boot>,%a1
49aea: 2149 0018 movel %a1,%a0@(24)
_ISR_Enable( level );
49aee: 46c1 movew %d1,%sr
return( previous_state );
}
49af0: 241f movel %sp@+,%d2
49af2: 245f moveal %sp@+,%a2
49af4: 4e5e unlk %fp
49af6: 4e75 rts
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
49af8: 143c 0003 moveb #3,%d2
49afc: b480 cmpl %d0,%d2
49afe: 65e4 bcss 49ae4 <_Watchdog_Remove+0x24> <== NEVER TAKEN
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
49b00: 2250 moveal %a0@,%a1
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
49b02: 42a8 0008 clrl %a0@(8)
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
49b06: 4a91 tstl %a1@
49b08: 6708 beqs 49b12 <_Watchdog_Remove+0x52>
next_watchdog->delta_interval += the_watchdog->delta_interval;
49b0a: 2428 0010 movel %a0@(16),%d2
49b0e: d5a9 0010 addl %d2,%a1@(16)
if ( _Watchdog_Sync_count )
49b12: 2479 0005 e544 moveal 5e544 <_Watchdog_Sync_count>,%a2
49b18: 4a8a tstl %a2
49b1a: 670c beqs 49b28 <_Watchdog_Remove+0x68>
_Watchdog_Sync_level = _ISR_Nest_level;
49b1c: 45f9 0005 e5dc lea 5e5dc <_Per_CPU_Information+0x8>,%a2
49b22: 23d2 0005 e4c2 movel %a2@,5e4c2 <_Watchdog_Sync_level>
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
49b28: 2468 0004 moveal %a0@(4),%a2
next->previous = previous;
49b2c: 234a 0004 movel %a2,%a1@(4)
previous->next = next;
49b30: 2489 movel %a1,%a2@
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
49b32: 2279 0005 e548 moveal 5e548 <_Watchdog_Ticks_since_boot>,%a1
49b38: 2149 0018 movel %a1,%a0@(24)
_ISR_Enable( level );
49b3c: 46c1 movew %d1,%sr
return( previous_state );
}
49b3e: 241f movel %sp@+,%d2
49b40: 245f moveal %sp@+,%a2
49b42: 4e5e unlk %fp
49b44: 4e75 rts
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
49b46: 2279 0005 e548 moveal 5e548 <_Watchdog_Ticks_since_boot>,%a1
/*
* 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;
49b4c: 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;
49b50: 2149 0018 movel %a1,%a0@(24)
_ISR_Enable( level );
49b54: 46c1 movew %d1,%sr
return( previous_state );
}
49b56: 241f movel %sp@+,%d2
49b58: 245f moveal %sp@+,%a2
49b5a: 4e5e unlk %fp
...
0004afbc <_Watchdog_Report_chain>:
)
{
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
4afbc: 203c 0000 0700 movel #1792,%d0
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
4afc2: 4e56 ffe8 linkw %fp,#-24
4afc6: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
4afca: 242e 0008 movel %fp@(8),%d2
4afce: 266e 000c moveal %fp@(12),%a3
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
4afd2: 40c3 movew %sr,%d3
4afd4: 8083 orl %d3,%d0
4afd6: 46c0 movew %d0,%sr
printk( "Watchdog Chain: %s %p\n", name, header );
4afd8: 2f0b movel %a3,%sp@-
4afda: 4bf9 0004 4928 lea 44928 <printk>,%a5
4afe0: 2f02 movel %d2,%sp@-
4afe2: 4879 0005 e05c pea 5e05c <_Status_Object_name_errors_to_status+0x14>
4afe8: 4e95 jsr %a5@
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
4afea: 245b moveal %a3@+,%a2
if ( !_Chain_Is_empty( header ) ) {
4afec: 4fef 000c lea %sp@(12),%sp
4aff0: b7ca cmpal %a2,%a3
4aff2: 672c beqs 4b020 <_Watchdog_Report_chain+0x64> <== NEVER TAKEN
4aff4: 49f9 0004 b038 lea 4b038 <_Watchdog_Report>,%a4
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
4affa: 2f0a movel %a2,%sp@-
4affc: 42a7 clrl %sp@-
4affe: 4e94 jsr %a4@
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = header->first ;
node != _Chain_Tail(header) ;
node = node->next )
4b000: 2452 moveal %a2@,%a2
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = header->first ;
4b002: 508f addql #8,%sp
4b004: b7ca cmpal %a2,%a3
4b006: 66f2 bnes 4affa <_Watchdog_Report_chain+0x3e> <== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
4b008: 2f02 movel %d2,%sp@-
4b00a: 4879 0005 e073 pea 5e073 <_Status_Object_name_errors_to_status+0x2b>
4b010: 4e95 jsr %a5@
4b012: 508f addql #8,%sp
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
4b014: 46c3 movew %d3,%sr
}
4b016: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4b01c: 4e5e unlk %fp
4b01e: 4e75 rts
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
4b020: 4879 0005 e082 pea 5e082 <_Status_Object_name_errors_to_status+0x3a>
4b026: 4e95 jsr %a5@
4b028: 588f addql #4,%sp
}
_ISR_Enable( level );
4b02a: 46c3 movew %d3,%sr
}
4b02c: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4b032: 4e5e unlk %fp
...
00049b60 <_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 );
49b60: 203c 0000 0700 movel #1792,%d0
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
49b66: 4e56 ffe8 linkw %fp,#-24
49b6a: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
49b6e: 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 );
49b72: 40c2 movew %sr,%d2
49b74: 8082 orl %d2,%d0
49b76: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
Chain_Control *the_chain
)
{
return (the_chain->first == _Chain_Tail(the_chain));
49b78: 264c moveal %a4,%a3
49b7a: 245b moveal %a3@+,%a2
if ( _Chain_Is_empty( header ) )
49b7c: b7ca cmpal %a2,%a3
49b7e: 673e beqs 49bbe <_Watchdog_Tickle+0x5e>
* 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) {
49b80: 202a 0010 movel %a2@(16),%d0
49b84: 4bf9 0004 9ac0 lea 49ac0 <_Watchdog_Remove>,%a5
49b8a: 6708 beqs 49b94 <_Watchdog_Tickle+0x34>
the_watchdog->delta_interval--;
49b8c: 5380 subql #1,%d0
49b8e: 2540 0010 movel %d0,%a2@(16)
if ( the_watchdog->delta_interval != 0 )
49b92: 662a bnes 49bbe <_Watchdog_Tickle+0x5e>
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
49b94: 263c 0000 0700 movel #1792,%d3
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
49b9a: 2f0a movel %a2,%sp@-
49b9c: 4e95 jsr %a5@
_ISR_Enable( level );
49b9e: 46c2 movew %d2,%sr
switch( watchdog_state ) {
49ba0: 7202 moveq #2,%d1
49ba2: 588f addql #4,%sp
49ba4: b280 cmpl %d0,%d1
49ba6: 6722 beqs 49bca <_Watchdog_Tickle+0x6a> <== ALWAYS TAKEN
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
49ba8: 2003 movel %d3,%d0
49baa: 40c2 movew %sr,%d2
49bac: 8082 orl %d2,%d0
49bae: 46c0 movew %d0,%sr
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
49bb0: 2014 movel %a4@,%d0
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) header->first );
49bb2: 2440 moveal %d0,%a2
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
49bb4: b7c0 cmpal %d0,%a3
49bb6: 6706 beqs 49bbe <_Watchdog_Tickle+0x5e>
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
49bb8: 4aaa 0010 tstl %a2@(16)
49bbc: 67dc beqs 49b9a <_Watchdog_Tickle+0x3a>
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
49bbe: 46c2 movew %d2,%sr
}
49bc0: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
49bc6: 4e5e unlk %fp
49bc8: 4e75 rts
_ISR_Enable( level );
switch( watchdog_state ) {
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
49bca: 2f2a 0024 movel %a2@(36),%sp@-
49bce: 2f2a 0020 movel %a2@(32),%sp@-
49bd2: 206a 001c moveal %a2@(28),%a0
49bd6: 4e90 jsr %a0@
the_watchdog->id,
the_watchdog->user_data
);
break;
49bd8: 508f addql #8,%sp
49bda: 60cc bras 49ba8 <_Watchdog_Tickle+0x48>
00049c76 <_Workspace_Allocate_or_fatal_error>:
* _Workspace_Allocate_or_fatal_error
*/
void *_Workspace_Allocate_or_fatal_error(
size_t size
)
{
49c76: 4e56 0000 linkw %fp,#0
49c7a: 42a7 clrl %sp@-
49c7c: 42a7 clrl %sp@-
49c7e: 2f2e 0008 movel %fp@(8),%sp@-
49c82: 4879 0005 e43a pea 5e43a <_Workspace_Area>
49c88: 4eb9 0004 bcac jsr 4bcac <_Heap_Allocate_aligned_with_boundary>
__builtin_return_address( 1 ),
memory
);
#endif
if ( memory == NULL )
49c8e: 4fef 0010 lea %sp@(16),%sp
49c92: 4a80 tstl %d0
49c94: 6704 beqs 49c9a <_Workspace_Allocate_or_fatal_error+0x24>
true,
INTERNAL_ERROR_WORKSPACE_ALLOCATION
);
return memory;
}
49c96: 4e5e unlk %fp
49c98: 4e75 rts
memory
);
#endif
if ( memory == NULL )
_Internal_error_Occurred(
49c9a: 4878 0003 pea 3 <DIVIDE>
49c9e: 4878 0001 pea 1 <ADD>
49ca2: 42a7 clrl %sp@-
49ca4: 4eb9 0004 79c8 jsr 479c8 <_Internal_error_Occurred>
...
0004dd84 <rtems_barrier_create>:
rtems_name name,
rtems_attribute attribute_set,
uint32_t maximum_waiters,
rtems_id *id
)
{
4dd84: 4e56 ffe8 linkw %fp,#-24
4dd88: 202e 0010 movel %fp@(16),%d0
4dd8c: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
4dd90: 242e 0008 movel %fp@(8),%d2
4dd94: 262e 000c movel %fp@(12),%d3
4dd98: 246e 0014 moveal %fp@(20),%a2
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
4dd9c: 4a82 tstl %d2
4dd9e: 677a beqs 4de1a <rtems_barrier_create+0x96> <== NEVER TAKEN
return RTEMS_INVALID_NAME;
if ( !id )
4dda0: 4a8a tstl %a2
4dda2: 6700 00cc beqw 4de70 <rtems_barrier_create+0xec>
return RTEMS_INVALID_ADDRESS;
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
4dda6: 0803 0004 btst #4,%d3
4ddaa: 677a beqs 4de26 <rtems_barrier_create+0xa2>
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
4ddac: 42ae fff8 clrl %fp@(-8)
if ( maximum_waiters == 0 )
4ddb0: 4a80 tstl %d0
4ddb2: 6700 00b0 beqw 4de64 <rtems_barrier_create+0xe0>
4ddb6: 2239 0005 feb4 movel 5feb4 <_Thread_Dispatch_disable_level>,%d1
4ddbc: 5281 addql #1,%d1
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
the_attributes.maximum_count = maximum_waiters;
4ddbe: 2d40 fffc movel %d0,%fp@(-4)
4ddc2: 23c1 0005 feb4 movel %d1,5feb4 <_Thread_Dispatch_disable_level>
* This function allocates a barrier control block from
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Allocate( void )
{
return (Barrier_Control *) _Objects_Allocate( &_Barrier_Information );
4ddc8: 4879 0006 0086 pea 60086 <_Barrier_Information>
4ddce: 4eb9 0004 9380 jsr 49380 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
4ddd4: 588f addql #4,%sp
4ddd6: 2640 moveal %d0,%a3
4ddd8: 4a80 tstl %d0
4ddda: 6776 beqs 4de52 <rtems_barrier_create+0xce> <== NEVER TAKEN
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_barrier->attribute_set = attribute_set;
4dddc: 2743 0010 movel %d3,%a3@(16)
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
4dde0: 486e fff8 pea %fp@(-8)
4dde4: 486b 0014 pea %a3@(20)
4dde8: 4eb9 0004 e628 jsr 4e628 <_CORE_barrier_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
4ddee: 202b 0008 movel %a3@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
4ddf2: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
4ddf4: 2079 0006 009e moveal 6009e <_Barrier_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
4ddfa: 3200 movew %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
4ddfc: 218b 1c00 movel %a3,%a0@(00000000,%d1:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
4de00: 2742 000c movel %d2,%a3@(12)
&_Barrier_Information,
&the_barrier->Object,
(Objects_Name) name
);
*id = the_barrier->Object.id;
4de04: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
4de06: 4eb9 0004 a0a2 jsr 4a0a2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4de0c: 508f addql #8,%sp
4de0e: 4280 clrl %d0
}
4de10: 4cee 0c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a3
4de16: 4e5e unlk %fp
4de18: 4e75 rts
{
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
4de1a: 7003 moveq #3,%d0
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
4de1c: 4cee 0c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a3
4de22: 4e5e unlk %fp
4de24: 4e75 rts
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
4de26: 7201 moveq #1,%d1
4de28: 2d41 fff8 movel %d1,%fp@(-8)
4de2c: 2239 0005 feb4 movel 5feb4 <_Thread_Dispatch_disable_level>,%d1
4de32: 5281 addql #1,%d1
the_attributes.maximum_count = maximum_waiters;
4de34: 2d40 fffc movel %d0,%fp@(-4)
4de38: 23c1 0005 feb4 movel %d1,5feb4 <_Thread_Dispatch_disable_level>
4de3e: 4879 0006 0086 pea 60086 <_Barrier_Information>
4de44: 4eb9 0004 9380 jsr 49380 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
4de4a: 588f addql #4,%sp
4de4c: 2640 moveal %d0,%a3
4de4e: 4a80 tstl %d0
4de50: 668a bnes 4dddc <rtems_barrier_create+0x58>
_Thread_Enable_dispatch();
4de52: 4eb9 0004 a0a2 jsr 4a0a2 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
4de58: 7005 moveq #5,%d0
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
4de5a: 4cee 0c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a3
4de60: 4e5e unlk %fp
4de62: 4e75 rts
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
4de64: 700a moveq #10,%d0
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
4de66: 4cee 0c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a3
4de6c: 4e5e unlk %fp
4de6e: 4e75 rts
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
4de70: 7009 moveq #9,%d0
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
4de72: 4cee 0c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a3
4de78: 4e5e unlk %fp <== NOT EXECUTED
0004852c <rtems_extension_create>:
rtems_status_code rtems_extension_create(
rtems_name name,
const rtems_extensions_table *extension_table,
rtems_id *id
)
{
4852c: 4e56 fff4 linkw %fp,#-12
48530: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
48534: 242e 0008 movel %fp@(8),%d2
48538: 246e 0010 moveal %fp@(16),%a2
Extension_Control *the_extension;
if ( !id )
4853c: 4a8a tstl %a2
4853e: 6700 00a0 beqw 485e0 <rtems_extension_create+0xb4>
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
48542: 4a82 tstl %d2
48544: 660c bnes 48552 <rtems_extension_create+0x26>
return RTEMS_INVALID_NAME;
48546: 7003 moveq #3,%d0
);
*id = the_extension->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
48548: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
4854e: 4e5e unlk %fp
48550: 4e75 rts
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
48552: 2039 0006 8a2c movel 68a2c <_Thread_Dispatch_disable_level>,%d0
48558: 5280 addql #1,%d0
4855a: 23c0 0006 8a2c movel %d0,68a2c <_Thread_Dispatch_disable_level>
#ifndef __EXTENSION_MANAGER_inl
#define __EXTENSION_MANAGER_inl
RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
{
return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
48560: 4879 0006 8bb8 pea 68bb8 <_Extension_Information>
48566: 4eb9 0004 94cc jsr 494cc <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_extension = _Extension_Allocate();
if ( !the_extension ) {
4856c: 588f addql #4,%sp
4856e: 2640 moveal %d0,%a3
48570: 4a80 tstl %d0
48572: 675a beqs 485ce <rtems_extension_create+0xa2> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
48574: 206e 000c moveal %fp@(12),%a0
48578: 2758 0024 movel %a0@+,%a3@(36)
4857c: 2758 0028 movel %a0@+,%a3@(40)
48580: 2758 002c movel %a0@+,%a3@(44)
48584: 2758 0030 movel %a0@+,%a3@(48)
48588: 2758 0034 movel %a0@+,%a3@(52)
4858c: 2758 0038 movel %a0@+,%a3@(56)
48590: 2758 003c movel %a0@+,%a3@(60)
48594: 2750 0040 movel %a0@,%a3@(64)
_User_extensions_Add_set( extension );
48598: 486b 0010 pea %a3@(16)
4859c: 4eb9 0004 b308 jsr 4b308 <_User_extensions_Add_set>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
485a2: 202b 0008 movel %a3@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
485a6: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
485a8: 2079 0006 8bd0 moveal 68bd0 <_Extension_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
485ae: 3200 movew %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
485b0: 218b 1c00 movel %a3,%a0@(00000000,%d1:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
485b4: 2742 000c movel %d2,%a3@(12)
&_Extension_Information,
&the_extension->Object,
(Objects_Name) name
);
*id = the_extension->Object.id;
485b8: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
485ba: 4eb9 0004 a2e2 jsr 4a2e2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
485c0: 588f addql #4,%sp
485c2: 4280 clrl %d0
}
485c4: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
485ca: 4e5e unlk %fp
485cc: 4e75 rts
_Thread_Disable_dispatch(); /* to prevent deletion */
the_extension = _Extension_Allocate();
if ( !the_extension ) {
_Thread_Enable_dispatch();
485ce: 4eb9 0004 a2e2 jsr 4a2e2 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
485d4: 7005 moveq #5,%d0
);
*id = the_extension->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
485d6: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
485dc: 4e5e unlk %fp
485de: 4e75 rts
)
{
Extension_Control *the_extension;
if ( !id )
return RTEMS_INVALID_ADDRESS;
485e0: 7009 moveq #9,%d0
);
*id = the_extension->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
485e2: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
485e8: 4e5e unlk %fp <== NOT EXECUTED
00048240 <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
)
{
48240: 4e56 fff4 linkw %fp,#-12
48244: 226e 000c moveal %fp@(12),%a1
48248: 48d7 040c moveml %d2-%d3/%a2,%sp@
4824c: 242e 0008 movel %fp@(8),%d2
48250: 246e 0010 moveal %fp@(16),%a2
rtems_device_major_number major_limit = _IO_Number_of_drivers;
48254: 2039 0006 2872 movel 62872 <_IO_Number_of_drivers>,%d0
if ( rtems_interrupt_is_in_progress() )
4825a: 4ab9 0006 2824 tstl 62824 <_Per_CPU_Information+0x8>
48260: 6600 009c bnew 482fe <rtems_io_register_driver+0xbe>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
48264: 4a8a tstl %a2
48266: 6700 00ea beqw 48352 <rtems_io_register_driver+0x112>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
4826a: 2480 movel %d0,%a2@
if ( driver_table == NULL )
4826c: 4a89 tstl %a1
4826e: 6700 00e2 beqw 48352 <rtems_io_register_driver+0x112>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
48272: 4a91 tstl %a1@
48274: 6700 00d4 beqw 4834a <rtems_io_register_driver+0x10a>
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
48278: b480 cmpl %d0,%d2
4827a: 6476 bccs 482f2 <rtems_io_register_driver+0xb2>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
4827c: 2039 0006 2664 movel 62664 <_Thread_Dispatch_disable_level>,%d0
48282: 5280 addql #1,%d0
48284: 23c0 0006 2664 movel %d0,62664 <_Thread_Dispatch_disable_level>
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
4828a: 4a82 tstl %d2
4828c: 667c bnes 4830a <rtems_io_register_driver+0xca>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
4828e: 2039 0006 2872 movel 62872 <_IO_Number_of_drivers>,%d0
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
48294: 6700 0106 beqw 4839c <rtems_io_register_driver+0x15c>
48298: 2239 0006 2876 movel 62876 <_IO_Driver_address_table>,%d1
4829e: 2041 moveal %d1,%a0
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
482a0: 4a90 tstl %a0@
482a2: 6700 008e beqw 48332 <rtems_io_register_driver+0xf2>
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 ) {
482a6: 5282 addql #1,%d2
482a8: 41e8 0018 lea %a0@(24),%a0
482ac: b480 cmpl %d0,%d2
482ae: 65f0 bcss 482a0 <rtems_io_register_driver+0x60>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
482b0: 2482 movel %d2,%a2@
if ( m != n )
482b2: b480 cmpl %d0,%d2
482b4: 6700 00e8 beqw 4839e <rtems_io_register_driver+0x15e>
482b8: 2602 movel %d2,%d3
482ba: 2002 movel %d2,%d0
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
482bc: 2041 moveal %d1,%a0
}
/* Assigns invalid value in case of failure */
*major = m;
if ( m != n )
482be: e78b lsll #3,%d3
482c0: eb88 lsll #5,%d0
482c2: 9083 subl %d3,%d0
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
482c4: d1c0 addal %d0,%a0
482c6: 20d9 movel %a1@+,%a0@+
482c8: 20d9 movel %a1@+,%a0@+
482ca: 20d9 movel %a1@+,%a0@+
482cc: 20d9 movel %a1@+,%a0@+
482ce: 20d9 movel %a1@+,%a0@+
482d0: 2091 movel %a1@,%a0@
_Thread_Enable_dispatch();
482d2: 4eb9 0004 9dee jsr 49dee <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
482d8: 2d42 0008 movel %d2,%fp@(8)
}
482dc: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
482e2: 42ae 0010 clrl %fp@(16)
482e6: 42ae 000c clrl %fp@(12)
}
482ea: 4e5e unlk %fp
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
482ec: 4ef9 0004 fde0 jmp 4fde0 <rtems_io_initialize>
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
482f2: 700a moveq #10,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
482f4: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
482fa: 4e5e unlk %fp
482fc: 4e75 rts
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
482fe: 7012 moveq #18,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
48300: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
48306: 4e5e unlk %fp
48308: 4e75 rts
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
4830a: 2202 movel %d2,%d1
4830c: 2002 movel %d2,%d0
4830e: e789 lsll #3,%d1
48310: eb88 lsll #5,%d0
48312: 2079 0006 2876 moveal 62876 <_IO_Driver_address_table>,%a0
48318: 9081 subl %d1,%d0
4831a: d1c0 addal %d0,%a0
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
4831c: 4a90 tstl %a0@
4831e: 673e beqs 4835e <rtems_io_register_driver+0x11e>
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();
48320: 4eb9 0004 9dee jsr 49dee <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
48326: 700c moveq #12,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
48328: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
4832e: 4e5e unlk %fp
48330: 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;
48332: 4aa8 0004 tstl %a0@(4)
48336: 6700 ff78 beqw 482b0 <rtems_io_register_driver+0x70>
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 ) {
4833a: 5282 addql #1,%d2
4833c: 41e8 0018 lea %a0@(24),%a0
48340: b480 cmpl %d0,%d2
48342: 6500 ff5c bcsw 482a0 <rtems_io_register_driver+0x60>
48346: 6000 ff68 braw 482b0 <rtems_io_register_driver+0x70>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
4834a: 4aa9 0004 tstl %a1@(4)
4834e: 6600 ff28 bnew 48278 <rtems_io_register_driver+0x38>
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
48352: 7009 moveq #9,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
48354: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
4835a: 4e5e unlk %fp
4835c: 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;
4835e: 4aa8 0004 tstl %a0@(4)
48362: 66bc bnes 48320 <rtems_io_register_driver+0xe0>
48364: 2239 0006 2876 movel 62876 <_IO_Driver_address_table>,%d1
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
4836a: 2041 moveal %d1,%a0
4836c: d1c0 addal %d0,%a0
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
4836e: 2482 movel %d2,%a2@
}
_IO_Driver_address_table [major] = *driver_table;
48370: 20d9 movel %a1@+,%a0@+
48372: 20d9 movel %a1@+,%a0@+
48374: 20d9 movel %a1@+,%a0@+
48376: 20d9 movel %a1@+,%a0@+
48378: 20d9 movel %a1@+,%a0@+
4837a: 2091 movel %a1@,%a0@
_Thread_Enable_dispatch();
4837c: 4eb9 0004 9dee jsr 49dee <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
48382: 2d42 0008 movel %d2,%fp@(8)
}
48386: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
4838c: 42ae 0010 clrl %fp@(16)
48390: 42ae 000c clrl %fp@(12)
}
48394: 4e5e unlk %fp
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
48396: 4ef9 0004 fde0 jmp 4fde0 <rtems_io_initialize>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
4839c: 4292 clrl %a2@ <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
4839e: 4eb9 0004 9dee jsr 49dee <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
483a4: 7005 moveq #5,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
483a6: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
483ac: 4e5e unlk %fp <== NOT EXECUTED
00049470 <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)
{
49470: 4e56 fff0 linkw %fp,#-16
49474: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
49478: 266e 0008 moveal %fp@(8),%a3
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
4947c: 4a8b tstl %a3
4947e: 6742 beqs 494c2 <rtems_iterate_over_all_threads+0x52><== NEVER TAKEN
49480: 49f9 0006 89ec lea 689ec <_Objects_Information_table+0x4>,%a4
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
if ( !_Objects_Information_table[ api_index ] )
49486: 205c moveal %a4@+,%a0
49488: 4a88 tstl %a0
4948a: 672e beqs 494ba <rtems_iterate_over_all_threads+0x4a>
continue;
information = _Objects_Information_table[ api_index ][ 1 ];
4948c: 2468 0004 moveal %a0@(4),%a2
if ( !information )
49490: 4a8a tstl %a2
49492: 6726 beqs 494ba <rtems_iterate_over_all_threads+0x4a>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
49494: 4a6a 000e tstw %a2@(14)
49498: 6720 beqs 494ba <rtems_iterate_over_all_threads+0x4a><== NEVER TAKEN
4949a: 7401 moveq #1,%d2
the_thread = (Thread_Control *)information->local_table[ i ];
4949c: 206a 0018 moveal %a2@(24),%a0
494a0: 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++ ) {
494a4: 5282 addql #1,%d2
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
494a6: 4a80 tstl %d0
494a8: 6706 beqs 494b0 <rtems_iterate_over_all_threads+0x40><== NEVER TAKEN
continue;
(*routine)(the_thread);
494aa: 2f00 movel %d0,%sp@-
494ac: 4e93 jsr %a3@
494ae: 588f addql #4,%sp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
494b0: 4280 clrl %d0
494b2: 302a 000e movew %a2@(14),%d0
494b6: b480 cmpl %d0,%d2
494b8: 63e2 blss 4949c <rtems_iterate_over_all_threads+0x2c>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
494ba: b9fc 0006 89f8 cmpal #428536,%a4
494c0: 66c4 bnes 49486 <rtems_iterate_over_all_threads+0x16>
(*routine)(the_thread);
}
}
}
494c2: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
494c8: 4e5e unlk %fp <== NOT EXECUTED
00047fbc <rtems_object_get_api_class_name>:
)
{
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
47fbc: 7001 moveq #1,%d0
const char *rtems_object_get_api_class_name(
int the_api,
int the_class
)
{
47fbe: 4e56 0000 linkw %fp,#0
47fc2: 222e 0008 movel %fp@(8),%d1
47fc6: 2f02 movel %d2,%sp@-
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
47fc8: b081 cmpl %d1,%d0
47fca: 673e beqs 4800a <rtems_object_get_api_class_name+0x4e><== NEVER TAKEN
api_assoc = rtems_object_api_internal_assoc;
else if ( the_api == OBJECTS_CLASSIC_API )
47fcc: 7402 moveq #2,%d2
#ifdef RTEMS_POSIX_API
else if ( the_api == OBJECTS_POSIX_API )
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
47fce: 203c 0005 ed44 movel #388420,%d0
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
api_assoc = rtems_object_api_internal_assoc;
else if ( the_api == OBJECTS_CLASSIC_API )
47fd4: b481 cmpl %d1,%d2
47fd6: 6708 beqs 47fe0 <rtems_object_get_api_class_name+0x24>
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
if ( class_assoc )
return class_assoc->name;
return "BAD CLASS";
}
47fd8: 242e fffc movel %fp@(-4),%d2
47fdc: 4e5e unlk %fp
47fde: 4e75 rts
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
api_assoc = rtems_object_api_internal_assoc;
else if ( the_api == OBJECTS_CLASSIC_API )
api_assoc = rtems_object_api_classic_assoc;
47fe0: 203c 0005 fc2c movel #392236,%d0
else if ( the_api == OBJECTS_POSIX_API )
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
47fe6: 2f2e 000c movel %fp@(12),%sp@-
47fea: 2f00 movel %d0,%sp@-
47fec: 4eb9 0004 ced8 jsr 4ced8 <rtems_assoc_ptr_by_local>
if ( class_assoc )
47ff2: 508f addql #8,%sp
else if ( the_api == OBJECTS_POSIX_API )
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
47ff4: 2040 moveal %d0,%a0
if ( class_assoc )
return class_assoc->name;
return "BAD CLASS";
47ff6: 203c 0005 ed4c movel #388428,%d0
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
if ( class_assoc )
47ffc: 4a88 tstl %a0
47ffe: 67d8 beqs 47fd8 <rtems_object_get_api_class_name+0x1c>
return class_assoc->name;
return "BAD CLASS";
}
48000: 242e fffc movel %fp@(-4),%d2
48004: 4e5e unlk %fp
#endif
else
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
if ( class_assoc )
return class_assoc->name;
48006: 2010 movel %a0@,%d0
return "BAD CLASS";
}
48008: 4e75 rts
{
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
api_assoc = rtems_object_api_internal_assoc;
4800a: 203c 0005 fc14 movel #392212,%d0
48010: 60d4 bras 47fe6 <rtems_object_get_api_class_name+0x2a>
...
0004807c <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
)
{
4807c: 4e56 0000 linkw %fp,#0
48080: 2f0a movel %a2,%sp@-
48082: 246e 0010 moveal %fp@(16),%a2
48086: 2f02 movel %d2,%sp@-
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
48088: 4a8a tstl %a2
4808a: 6766 beqs 480f2 <rtems_object_get_class_information+0x76>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
4808c: 2f2e 000c movel %fp@(12),%sp@-
48090: 2f2e 0008 movel %fp@(8),%sp@-
48094: 4eb9 0004 9d80 jsr 49d80 <_Objects_Get_information>
if ( !obj_info )
4809a: 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 );
4809c: 2040 moveal %d0,%a0
if ( !obj_info )
4809e: 4a80 tstl %d0
480a0: 675e beqs 48100 <rtems_object_get_class_information+0x84>
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
480a2: 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;
480a6: 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;
480a8: 2568 000a 0004 movel %a0@(10),%a2@(4)
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
480ae: 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;
480b2: 1568 0010 000c moveb %a0@(16),%a2@(12)
info->maximum = obj_info->maximum;
480b8: 2542 0008 movel %d2,%a2@(8)
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
480bc: 6750 beqs 4810e <rtems_object_get_class_information+0x92><== NEVER TAKEN
480be: 2068 0018 moveal %a0@(24),%a0
480c2: 7201 moveq #1,%d1
480c4: 7001 moveq #1,%d0
480c6: 93c9 subal %a1,%a1
480c8: 5280 addql #1,%d0
if ( !obj_info->local_table[i] )
480ca: 4ab0 1c00 tstl %a0@(00000000,%d1:l:4)
480ce: 6718 beqs 480e8 <rtems_object_get_class_information+0x6c>
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++ )
480d0: 2200 movel %d0,%d1
480d2: b082 cmpl %d2,%d0
480d4: 63f2 blss 480c8 <rtems_object_get_class_information+0x4c><== ALWAYS TAKEN
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
480d6: 2549 000e movel %a1,%a2@(14)
return RTEMS_SUCCESSFUL;
480da: 4280 clrl %d0
}
480dc: 242e fff8 movel %fp@(-8),%d2
480e0: 246e fffc moveal %fp@(-4),%a2
480e4: 4e5e unlk %fp
480e6: 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++;
480e8: 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++ )
480ea: 2200 movel %d0,%d1
480ec: b082 cmpl %d2,%d0
480ee: 63d8 blss 480c8 <rtems_object_get_class_information+0x4c><== NEVER TAKEN
480f0: 60e4 bras 480d6 <rtems_object_get_class_information+0x5a>
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
480f2: 242e fff8 movel %fp@(-8),%d2
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
480f6: 7009 moveq #9,%d0
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
480f8: 246e fffc moveal %fp@(-4),%a2
480fc: 4e5e unlk %fp
480fe: 4e75 rts
48100: 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;
48104: 700a moveq #10,%d0
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
48106: 246e fffc moveal %fp@(-4),%a2
4810a: 4e5e unlk %fp
4810c: 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++ )
4810e: 93c9 subal %a1,%a1 <== NOT EXECUTED
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
48110: 4280 clrl %d0 <== NOT EXECUTED
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
48112: 2549 000e movel %a1,%a2@(14) <== NOT EXECUTED
48116: 60c4 bras 480dc <rtems_object_get_class_information+0x60><== NOT EXECUTED
00056a40 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
56a40: 4e56 ffe8 linkw %fp,#-24
56a44: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
56a48: 242e 0008 movel %fp@(8),%d2
56a4c: 2a2e 000c movel %fp@(12),%d5
56a50: 282e 0010 movel %fp@(16),%d4
56a54: 262e 0014 movel %fp@(20),%d3
56a58: 246e 001c moveal %fp@(28),%a2
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
56a5c: 4a82 tstl %d2
56a5e: 673a beqs 56a9a <rtems_partition_create+0x5a>
return RTEMS_INVALID_NAME;
if ( !starting_address )
56a60: 4a85 tstl %d5
56a62: 671e beqs 56a82 <rtems_partition_create+0x42>
return RTEMS_INVALID_ADDRESS;
if ( !id )
56a64: 4a8a tstl %a2
56a66: 671a beqs 56a82 <rtems_partition_create+0x42> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
56a68: 4a84 tstl %d4
56a6a: 6722 beqs 56a8e <rtems_partition_create+0x4e>
56a6c: 4a83 tstl %d3
56a6e: 671e beqs 56a8e <rtems_partition_create+0x4e>
56a70: b684 cmpl %d4,%d3
56a72: 621a bhis 56a8e <rtems_partition_create+0x4e>
*/
RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned (
uint32_t buffer_size
)
{
return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
56a74: 7003 moveq #3,%d0
56a76: c083 andl %d3,%d0
56a78: 6614 bnes 56a8e <rtems_partition_create+0x4e>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
56a7a: 103c 0003 moveb #3,%d0
56a7e: c085 andl %d5,%d0
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
56a80: 6724 beqs 56aa6 <rtems_partition_create+0x66>
return RTEMS_INVALID_ADDRESS;
56a82: 7009 moveq #9,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
56a84: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
56a8a: 4e5e unlk %fp
56a8c: 4e75 rts
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;
56a8e: 7008 moveq #8,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
56a90: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
56a96: 4e5e unlk %fp
56a98: 4e75 rts
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
56a9a: 7003 moveq #3,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
56a9c: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
56aa2: 4e5e unlk %fp
56aa4: 4e75 rts
56aa6: 2039 0007 d2c8 movel 7d2c8 <_Thread_Dispatch_disable_level>,%d0
56aac: 5280 addql #1,%d0
56aae: 23c0 0007 d2c8 movel %d0,7d2c8 <_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 );
56ab4: 4879 0007 d164 pea 7d164 <_Partition_Information>
56aba: 4eb9 0005 b614 jsr 5b614 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
56ac0: 588f addql #4,%sp
56ac2: 2640 moveal %d0,%a3
56ac4: 4a80 tstl %d0
56ac6: 6758 beqs 56b20 <rtems_partition_create+0xe0>
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
56ac8: 2744 0014 movel %d4,%a3@(20)
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
56acc: 276e 0018 001c movel %fp@(24),%a3@(28)
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
56ad2: 4c43 4004 remul %d3,%d4,%d4
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
56ad6: 2745 0010 movel %d5,%a3@(16)
the_partition->length = length;
the_partition->buffer_size = buffer_size;
56ada: 2743 0018 movel %d3,%a3@(24)
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
56ade: 42ab 0020 clrl %a3@(32)
_Chain_Initialize( &the_partition->Memory, starting_address,
56ae2: 2f03 movel %d3,%sp@-
56ae4: 2f04 movel %d4,%sp@-
56ae6: 2f05 movel %d5,%sp@-
56ae8: 486b 0024 pea %a3@(36)
56aec: 4eb9 0005 9f50 jsr 59f50 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
56af2: 202b 0008 movel %a3@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
56af6: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
56af8: 2079 0007 d17c moveal 7d17c <_Partition_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
56afe: 3200 movew %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
56b00: 218b 1c00 movel %a3,%a0@(00000000,%d1:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
56b04: 2742 000c movel %d2,%a3@(12)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
56b08: 2480 movel %d0,%a2@
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
56b0a: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
56b10: 4fef 0010 lea %sp@(16),%sp
56b14: 4280 clrl %d0
}
56b16: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
56b1c: 4e5e unlk %fp
56b1e: 4e75 rts
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
56b20: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
56b26: 7005 moveq #5,%d0
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
56b28: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
56b2e: 4e5e unlk %fp
...
00056ba4 <rtems_partition_get_buffer>:
rtems_status_code rtems_partition_get_buffer(
rtems_id id,
void **buffer
)
{
56ba4: 4e56 fff0 linkw %fp,#-16
56ba8: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
56bac: 246e 000c moveal %fp@(12),%a2
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
56bb0: 4a8a tstl %a2
56bb2: 6754 beqs 56c08 <rtems_partition_get_buffer+0x64><== NEVER TAKEN
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
56bb4: 486e fffc pea %fp@(-4)
56bb8: 2f2e 0008 movel %fp@(8),%sp@-
56bbc: 4879 0007 d164 pea 7d164 <_Partition_Information>
56bc2: 4eb9 0005 bb0c jsr 5bb0c <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
56bc8: 4fef 000c lea %sp@(12),%sp
56bcc: 2640 moveal %d0,%a3
56bce: 4aae fffc tstl %fp@(-4)
56bd2: 6628 bnes 56bfc <rtems_partition_get_buffer+0x58>
*/
RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
Partition_Control *the_partition
)
{
return _Chain_Get( &the_partition->Memory );
56bd4: 486b 0024 pea %a3@(36)
56bd8: 4eb9 0005 9f14 jsr 59f14 <_Chain_Get>
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
56bde: 588f addql #4,%sp
56be0: 2400 movel %d0,%d2
56be2: 6730 beqs 56c14 <rtems_partition_get_buffer+0x70>
the_partition->number_of_used_blocks += 1;
56be4: 52ab 0020 addql #1,%a3@(32)
_Thread_Enable_dispatch();
56be8: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
56bee: 4280 clrl %d0
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
56bf0: 2482 movel %d2,%a2@
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56bf2: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
56bf8: 4e5e unlk %fp
56bfa: 4e75 rts
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
56bfc: 7004 moveq #4,%d0
}
56bfe: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
56c04: 4e5e unlk %fp
56c06: 4e75 rts
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
56c08: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56c0a: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
56c10: 4e5e unlk %fp
56c12: 4e75 rts
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
56c14: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
56c1a: 700d moveq #13,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56c1c: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
56c22: 4e5e unlk %fp
...
00056c54 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
56c54: 4e56 fffc linkw %fp,#-4
56c58: 2f0a movel %a2,%sp@-
56c5a: 2f02 movel %d2,%sp@-
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
56c5c: 486e fffc pea %fp@(-4)
56c60: 2f2e 0008 movel %fp@(8),%sp@-
56c64: 4879 0007 d164 pea 7d164 <_Partition_Information>
56c6a: 242e 000c movel %fp@(12),%d2
56c6e: 4eb9 0005 bb0c jsr 5bb0c <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
56c74: 4fef 000c lea %sp@(12),%sp
56c78: 2440 moveal %d0,%a2
56c7a: 4aae fffc tstl %fp@(-4)
56c7e: 670e beqs 56c8e <rtems_partition_return_buffer+0x3a>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56c80: 242e fff4 movel %fp@(-12),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
56c84: 7004 moveq #4,%d0
}
56c86: 246e fff8 moveal %fp@(-8),%a2
56c8a: 4e5e unlk %fp
56c8c: 4e75 rts
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
56c8e: 202a 0010 movel %a2@(16),%d0
ending = _Addresses_Add_offset( starting, the_partition->length );
56c92: 222a 0014 movel %a2@(20),%d1
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
56c96: b082 cmpl %d2,%d0
56c98: 623c bhis 56cd6 <rtems_partition_return_buffer+0x82>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
56c9a: d280 addl %d0,%d1
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
56c9c: b282 cmpl %d2,%d1
56c9e: 6536 bcss 56cd6 <rtems_partition_return_buffer+0x82><== NEVER TAKEN
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
56ca0: 2202 movel %d2,%d1
56ca2: 9280 subl %d0,%d1
56ca4: 2001 movel %d1,%d0
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
56ca6: 4c6a 0001 0018 remul %a2@(24),%d1,%d0
starting = the_partition->starting_address;
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
56cac: 4a81 tstl %d1
56cae: 6626 bnes 56cd6 <rtems_partition_return_buffer+0x82>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
56cb0: 2f02 movel %d2,%sp@-
56cb2: 486a 0024 pea %a2@(36)
56cb6: 4eb9 0005 9eb4 jsr 59eb4 <_Chain_Append>
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
56cbc: 53aa 0020 subql #1,%a2@(32)
_Thread_Enable_dispatch();
56cc0: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56cc6: 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();
return RTEMS_SUCCESSFUL;
56cca: 508f addql #8,%sp
56ccc: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56cce: 246e fff8 moveal %fp@(-8),%a2
56cd2: 4e5e unlk %fp
56cd4: 4e75 rts
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
56cd6: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56cdc: 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;
56ce0: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
56ce2: 246e fff8 moveal %fp@(-8),%a2
56ce6: 4e5e unlk %fp
...
000476e0 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
476e0: 4e56 ffec linkw %fp,#-20
476e4: 48d7 040c moveml %d2-%d3/%a2,%sp@
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
476e8: 486e fffc pea %fp@(-4)
476ec: 242e 0008 movel %fp@(8),%d2
476f0: 2f02 movel %d2,%sp@-
476f2: 4879 0006 0460 pea 60460 <_Rate_monotonic_Information>
476f8: 4eb9 0004 9a9c jsr 49a9c <_Objects_Get>
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
476fe: 4fef 000c lea %sp@(12),%sp
47702: 2440 moveal %d0,%a2
47704: 4aae fffc tstl %fp@(-4)
47708: 661e bnes 47728 <rtems_rate_monotonic_period+0x48>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
4770a: 2039 0006 0718 movel 60718 <_Per_CPU_Information+0xc>,%d0
47710: b0aa 0040 cmpl %a2@(64),%d0
47714: 671e beqs 47734 <rtems_rate_monotonic_period+0x54>
_Thread_Enable_dispatch();
47716: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
4771c: 7017 moveq #23,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4771e: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
47724: 4e5e unlk %fp
47726: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
47728: 7004 moveq #4,%d0
}
4772a: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
47730: 4e5e unlk %fp
47732: 4e75 rts
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
47734: 4aae 000c tstl %fp@(12)
47738: 6700 00ce beqw 47808 <rtems_rate_monotonic_period+0x128>
}
_Thread_Enable_dispatch();
return( return_value );
}
_ISR_Disable( level );
4773c: 203c 0000 0700 movel #1792,%d0
47742: 40c3 movew %sr,%d3
47744: 8083 orl %d3,%d0
47746: 46c0 movew %d0,%sr
switch ( the_period->state ) {
47748: 202a 0038 movel %a2@(56),%d0
4774c: 7202 moveq #2,%d1
4774e: b280 cmpl %d0,%d1
47750: 6700 00e4 beqw 47836 <rtems_rate_monotonic_period+0x156>
47754: 123c 0004 moveb #4,%d1
47758: b280 cmpl %d0,%d1
4775a: 6762 beqs 477be <rtems_rate_monotonic_period+0xde>
4775c: 4a80 tstl %d0
4775e: 66c8 bnes 47728 <rtems_rate_monotonic_period+0x48><== NEVER TAKEN
case RATE_MONOTONIC_INACTIVE: {
_ISR_Enable( level );
47760: 46c3 movew %d3,%sr
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
47762: 2f0a movel %a2,%sp@-
47764: 2d40 fff8 movel %d0,%fp@(-8)
47768: 4eb9 0004 7548 jsr 47548 <_Rate_monotonic_Initiate_statistics>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
4776e: 223c 0004 7b44 movel #293700,%d1
the_watchdog->id = id;
47774: 2542 0030 movel %d2,%a2@(48)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
47778: 242e 000c movel %fp@(12),%d2
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
4777c: 2541 002c movel %d1,%a2@(44)
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
the_period->state = RATE_MONOTONIC_ACTIVE;
47780: 7202 moveq #2,%d1
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
47782: 42aa 0018 clrl %a2@(24)
47786: 2541 0038 movel %d1,%a2@(56)
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
4778a: 42aa 0034 clrl %a2@(52)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
4778e: 2542 003c movel %d2,%a2@(60)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
47792: 2542 001c movel %d2,%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
47796: 486a 0010 pea %a2@(16)
4779a: 4879 0006 0616 pea 60616 <_Watchdog_Ticks_chain>
477a0: 4eb9 0004 b5c4 jsr 4b5c4 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
477a6: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
477ac: 202e fff8 movel %fp@(-8),%d0
477b0: 4fef 000c lea %sp@(12),%sp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
477b4: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
477ba: 4e5e unlk %fp
477bc: 4e75 rts
case RATE_MONOTONIC_EXPIRED:
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
477be: 2f0a movel %a2,%sp@-
477c0: 4eb9 0004 75c6 jsr 475c6 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
477c6: 46c3 movew %d3,%sr
the_period->state = RATE_MONOTONIC_ACTIVE;
477c8: 7402 moveq #2,%d2
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
477ca: 7006 moveq #6,%d0
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
477cc: 222e 000c movel %fp@(12),%d1
*/
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
477d0: 2542 0038 movel %d2,%a2@(56)
the_period->next_length = length;
477d4: 2541 003c movel %d1,%a2@(60)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
477d8: 2541 001c movel %d1,%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
477dc: 486a 0010 pea %a2@(16)
477e0: 4879 0006 0616 pea 60616 <_Watchdog_Ticks_chain>
477e6: 2d40 fff8 movel %d0,%fp@(-8)
477ea: 4eb9 0004 b5c4 jsr 4b5c4 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
477f0: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
477f6: 202e fff8 movel %fp@(-8),%d0
477fa: 4fef 000c lea %sp@(12),%sp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
477fe: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
47804: 4e5e unlk %fp
47806: 4e75 rts
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
47808: 202a 0038 movel %a2@(56),%d0
4780c: 7204 moveq #4,%d1
4780e: b280 cmpl %d0,%d1
47810: 6500 00a4 bcsw 478b6 <rtems_rate_monotonic_period+0x1d6>
47814: 41f9 0005 de3a lea 5de3a <CSWTCH.2>,%a0
4781a: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
4781e: 2d40 fff8 movel %d0,%fp@(-8)
47822: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch>
return( return_value );
47828: 202e fff8 movel %fp@(-8),%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4782c: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
47832: 4e5e unlk %fp
47834: 4e75 rts
case RATE_MONOTONIC_ACTIVE:
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
47836: 2f0a movel %a2,%sp@-
47838: 4eb9 0004 75c6 jsr 475c6 <_Rate_monotonic_Update_statistics>
* This tells the _Rate_monotonic_Timeout that this task is
* in the process of blocking on the period and that we
* may be changing the length of the next period.
*/
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
the_period->next_length = length;
4783e: 222e 000c movel %fp@(12),%d1
/*
* 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;
47842: 7001 moveq #1,%d0
the_period->next_length = length;
47844: 2541 003c movel %d1,%a2@(60)
/*
* This tells the _Rate_monotonic_Timeout that this task is
* in the process of blocking on the period and that we
* may be changing the length of the next period.
*/
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
47848: 2540 0038 movel %d0,%a2@(56)
the_period->next_length = length;
_ISR_Enable( level );
4784c: 46c3 movew %d3,%sr
_Thread_Executing->Wait.id = the_period->Object.id;
4784e: 2079 0006 0718 moveal 60718 <_Per_CPU_Information+0xc>,%a0
47854: 216a 0008 0020 movel %a2@(8),%a0@(32)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
4785a: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
4785e: 2f08 movel %a0,%sp@-
47860: 4eb9 0004 acc0 jsr 4acc0 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
47866: 203c 0000 0700 movel #1792,%d0
4786c: 40c1 movew %sr,%d1
4786e: 8081 orl %d1,%d0
47870: 46c0 movew %d0,%sr
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
47872: 7402 moveq #2,%d2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
47874: 202a 0038 movel %a2@(56),%d0
the_period->state = RATE_MONOTONIC_ACTIVE;
47878: 2542 0038 movel %d2,%a2@(56)
_ISR_Enable( level );
4787c: 46c1 movew %d1,%sr
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
4787e: 7203 moveq #3,%d1
47880: 4fef 000c lea %sp@(12),%sp
47884: b280 cmpl %d0,%d1
47886: 6712 beqs 4789a <rtems_rate_monotonic_period+0x1ba>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
47888: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4788e: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
47890: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
47896: 4e5e unlk %fp
47898: 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 );
4789a: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
4789e: 2f39 0006 0718 movel 60718 <_Per_CPU_Information+0xc>,%sp@-
478a4: 4eb9 0004 9f9c jsr 49f9c <_Thread_Clear_state>
478aa: 508f addql #8,%sp
_Thread_Enable_dispatch();
478ac: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
478b2: 4280 clrl %d0
478b4: 60da bras 47890 <rtems_rate_monotonic_period+0x1b0>
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
478b6: 4280 clrl %d0 <== NOT EXECUTED
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
478b8: 2d40 fff8 movel %d0,%fp@(-8) <== NOT EXECUTED
478bc: 4eb9 0004 a382 jsr 4a382 <_Thread_Enable_dispatch> <== NOT EXECUTED
return( return_value );
478c2: 202e fff8 movel %fp@(-8),%d0 <== NOT EXECUTED
478c6: 6000 ff64 braw 4782c <rtems_rate_monotonic_period+0x14c><== NOT EXECUTED
...
000478cc <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
478cc: 4e56 ff78 linkw %fp,#-136
478d0: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
478d4: 262e 0008 movel %fp@(8),%d3
478d8: 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 )
478dc: 4a8a tstl %a2
478de: 6700 0082 beqw 47962 <rtems_rate_monotonic_report_statistics_with_plugin+0x96>
return;
(*print)( context, "Period information by period\n" );
478e2: 4879 0005 de4e pea 5de4e <CSWTCH.2+0x14>
478e8: 2f03 movel %d3,%sp@-
478ea: 4e92 jsr %a2@
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
478ec: 4879 0005 de6c pea 5de6c <CSWTCH.2+0x32>
478f2: 2f03 movel %d3,%sp@-
478f4: 4e92 jsr %a2@
(*print)( context, "--- Wall times are in seconds ---\n" );
478f6: 4879 0005 de8e pea 5de8e <CSWTCH.2+0x54>
478fc: 2f03 movel %d3,%sp@-
478fe: 4e92 jsr %a2@
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
47900: 4879 0005 deb1 pea 5deb1 <CSWTCH.2+0x77>
47906: 2f03 movel %d3,%sp@-
47908: 4e92 jsr %a2@
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
4790a: 4fef 001c lea %sp@(28),%sp
4790e: 2ebc 0005 defc movel #384764,%sp@
47914: 2f03 movel %d3,%sp@-
47916: 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 ;
47918: 2439 0006 0466 movel 60466 <_Rate_monotonic_Information+0x6>,%d2
4791e: 508f addql #8,%sp
47920: b4b9 0006 046a cmpl 6046a <_Rate_monotonic_Information+0xa>,%d2
47926: 623a bhis 47962 <rtems_rate_monotonic_report_statistics_with_plugin+0x96><== NEVER TAKEN
47928: 280e movel %fp,%d4
#if defined(RTEMS_DEBUG)
if ( status != RTEMS_SUCCESSFUL )
continue;
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
4792a: 2a0e movel %fp,%d5
4792c: 0684 ffff ffa2 addil #-94,%d4
47932: 47f9 0004 d310 lea 4d310 <rtems_rate_monotonic_get_statistics>,%a3
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
if ( status != RTEMS_SUCCESSFUL )
continue;
/* If the above passed, so should this but check it anyway */
status = rtems_rate_monotonic_get_status( id, &the_status );
47938: 4bf9 0004 d3d0 lea 4d3d0 <rtems_rate_monotonic_get_status>,%a5
#if defined(RTEMS_DEBUG)
if ( status != RTEMS_SUCCESSFUL )
continue;
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
4793e: 5b85 subql #5,%d5
47940: 49f9 0004 7c24 lea 47c24 <rtems_object_get_name>,%a4
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 );
47946: 2e3c 0004 b1c4 movel #307652,%d7
* 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 );
4794c: 2f04 movel %d4,%sp@-
4794e: 2f02 movel %d2,%sp@-
47950: 4e93 jsr %a3@
if ( status != RTEMS_SUCCESSFUL )
47952: 508f addql #8,%sp
47954: 4a80 tstl %d0
47956: 6714 beqs 4796c <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++ ) {
47958: 5282 addql #1,%d2
/*
* 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 ;
4795a: b4b9 0006 046a cmpl 6046a <_Rate_monotonic_Information+0xa>,%d2
47960: 63ea blss 4794c <rtems_rate_monotonic_report_statistics_with_plugin+0x80>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
47962: 4cee 3cfc ff78 moveml %fp@(-136),%d2-%d7/%a2-%a5
47968: 4e5e unlk %fp
4796a: 4e75 rts
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
if ( status != RTEMS_SUCCESSFUL )
continue;
/* If the above passed, so should this but check it anyway */
status = rtems_rate_monotonic_get_status( id, &the_status );
4796c: 486e ffda pea %fp@(-38)
47970: 2f02 movel %d2,%sp@-
47972: 4e95 jsr %a5@
#if defined(RTEMS_DEBUG)
if ( status != RTEMS_SUCCESSFUL )
continue;
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
47974: 2f05 movel %d5,%sp@-
47976: 4878 0005 pea 5 <COMPARE>
4797a: 2f2e ffda movel %fp@(-38),%sp@-
4797e: 4e94 jsr %a4@
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
47980: 2f2e ffa6 movel %fp@(-90),%sp@-
47984: 2f2e ffa2 movel %fp@(-94),%sp@-
47988: 2f05 movel %d5,%sp@-
4798a: 2f02 movel %d2,%sp@-
4798c: 4879 0005 df48 pea 5df48 <CSWTCH.2+0x10e>
47992: 2f03 movel %d3,%sp@-
47994: 4e92 jsr %a2@
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
47996: 202e ffa2 movel %fp@(-94),%d0
4799a: 4fef 002c lea %sp@(44),%sp
4799e: 6618 bnes 479b8 <rtems_rate_monotonic_report_statistics_with_plugin+0xec>
(*print)( context, "\n" );
479a0: 4879 0005 dde6 pea 5dde6 <rtems_status_assoc+0x19e>
* 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++ ) {
479a6: 5282 addql #1,%d2
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
479a8: 2f03 movel %d3,%sp@-
479aa: 4e92 jsr %a2@
continue;
479ac: 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 ;
479ae: b4b9 0006 046a cmpl 6046a <_Rate_monotonic_Information+0xa>,%d2
479b4: 6396 blss 4794c <rtems_rate_monotonic_report_statistics_with_plugin+0x80><== ALWAYS TAKEN
479b6: 60aa bras 47962 <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 );
479b8: 486e fff2 pea %fp@(-14)
479bc: 2047 moveal %d7,%a0
* 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++ ) {
479be: 5282 addql #1,%d2
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 );
479c0: 2f00 movel %d0,%sp@-
479c2: 486e ffba pea %fp@(-70)
479c6: 4e90 jsr %a0@
(*print)( context,
479c8: 202e fff6 movel %fp@(-10),%d0
479cc: 223c 0000 03e8 movel #1000,%d1
479d2: 4c41 0800 remsl %d1,%d0,%d0
479d6: 2c2e ffb6 movel %fp@(-74),%d6
479da: 2f00 movel %d0,%sp@-
479dc: 2001 movel %d1,%d0
479de: 2f2e fff2 movel %fp@(-14),%sp@-
479e2: 4c40 6806 remsl %d0,%d6,%d6
479e6: 202e ffae movel %fp@(-82),%d0
479ea: 2246 moveal %d6,%a1
479ec: 223c 0000 03e8 movel #1000,%d1
479f2: 2f09 movel %a1,%sp@-
479f4: 2f2e ffb2 movel %fp@(-78),%sp@-
479f8: 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,
479fc: 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,
47a02: 2f00 movel %d0,%sp@-
47a04: 2f2e ffaa movel %fp@(-86),%sp@-
47a08: 4879 0005 df5f pea 5df5f <CSWTCH.2+0x125>
47a0e: 2f03 movel %d3,%sp@-
47a10: 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);
47a12: 4fef 002c lea %sp@(44),%sp
47a16: 2047 moveal %d7,%a0
47a18: 486e fff2 pea %fp@(-14)
47a1c: 2f2e ffa2 movel %fp@(-94),%sp@-
47a20: 486e ffd2 pea %fp@(-46)
47a24: 4e90 jsr %a0@
(*print)( context,
47a26: 202e fff6 movel %fp@(-10),%d0
47a2a: 4c46 0800 remsl %d6,%d0,%d0
47a2e: 222e ffce movel %fp@(-50),%d1
47a32: 2f00 movel %d0,%sp@-
47a34: 2f2e fff2 movel %fp@(-14),%sp@-
47a38: 4c46 1801 remsl %d6,%d1,%d1
47a3c: 202e ffc6 movel %fp@(-58),%d0
47a40: 2241 moveal %d1,%a1
47a42: 2f09 movel %a1,%sp@-
47a44: 2f2e ffca movel %fp@(-54),%sp@-
47a48: 4c46 0800 remsl %d6,%d0,%d0
47a4c: 2f00 movel %d0,%sp@-
47a4e: 2f2e ffc2 movel %fp@(-62),%sp@-
47a52: 4879 0005 df7e pea 5df7e <CSWTCH.2+0x144>
47a58: 2f03 movel %d3,%sp@-
47a5a: 4e92 jsr %a2@
47a5c: 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 ;
47a60: b4b9 0006 046a cmpl 6046a <_Rate_monotonic_Information+0xa>,%d2
47a66: 6300 fee4 blsw 4794c <rtems_rate_monotonic_report_statistics_with_plugin+0x80>
47a6a: 6000 fef6 braw 47962 <rtems_rate_monotonic_report_statistics_with_plugin+0x96><== NOT EXECUTED
00047a88 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
47a88: 4e56 0000 linkw %fp,#0
47a8c: 2039 0006 0554 movel 60554 <_Thread_Dispatch_disable_level>,%d0
47a92: 5280 addql #1,%d0
47a94: 2f0a movel %a2,%sp@-
47a96: 23c0 0006 0554 movel %d0,60554 <_Thread_Dispatch_disable_level>
47a9c: 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 ;
47a9e: 2439 0006 0466 movel 60466 <_Rate_monotonic_Information+0x6>,%d2
47aa4: b4b9 0006 046a cmpl 6046a <_Rate_monotonic_Information+0xa>,%d2
47aaa: 6216 bhis 47ac2 <rtems_rate_monotonic_reset_all_statistics+0x3a><== NEVER TAKEN
47aac: 45f9 0004 7ad4 lea 47ad4 <rtems_rate_monotonic_reset_statistics>,%a2
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_reset_statistics( id );
47ab2: 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++ ) {
47ab4: 5282 addql #1,%d2
status = rtems_rate_monotonic_reset_statistics( id );
47ab6: 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 ;
47ab8: 588f addql #4,%sp
47aba: b4b9 0006 046a cmpl 6046a <_Rate_monotonic_Information+0xa>,%d2
47ac0: 63f0 blss 47ab2 <rtems_rate_monotonic_reset_all_statistics+0x2a>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
47ac2: 242e fff8 movel %fp@(-8),%d2
47ac6: 246e fffc moveal %fp@(-4),%a2
47aca: 4e5e unlk %fp
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
47acc: 4ef9 0004 a382 jmp 4a382 <_Thread_Enable_dispatch>
...
00057788 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
57788: 4e56 fff8 linkw %fp,#-8
5778c: 2f0a movel %a2,%sp@-
5778e: 2f02 movel %d2,%sp@-
57790: 242e 000c movel %fp@(12),%d2
bool extend_ok;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
57794: 6700 0086 beqw 5781c <rtems_region_extend+0x94>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
57798: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
5779e: 4eb9 0005 9e20 jsr 59e20 <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
577a4: 486e fff8 pea %fp@(-8)
577a8: 2f2e 0008 movel %fp@(8),%sp@-
577ac: 4879 0007 d1d4 pea 7d1d4 <_Region_Information>
577b2: 4eb9 0005 bad0 jsr 5bad0 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
577b8: 4fef 0010 lea %sp@(16),%sp
577bc: 2440 moveal %d0,%a2
577be: 4aae fff8 tstl %fp@(-8)
577c2: 6646 bnes 5780a <rtems_region_extend+0x82> <== NEVER TAKEN
case OBJECTS_LOCAL:
extend_ok = _Heap_Extend(
577c4: 486e fffc pea %fp@(-4)
577c8: 2f2e 0010 movel %fp@(16),%sp@-
577cc: 2f02 movel %d2,%sp@-
577ce: 486a 0068 pea %a2@(104)
577d2: 4eb9 0005 ab90 jsr 5ab90 <_Heap_Extend>
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
577d8: 4fef 0010 lea %sp@(16),%sp
577dc: 4a00 tstb %d0
577de: 674c beqs 5782c <rtems_region_extend+0xa4>
the_region->length += amount_extended;
577e0: 202e fffc movel %fp@(-4),%d0
577e4: d1aa 0054 addl %d0,%a2@(84)
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
577e8: 4282 clrl %d2
&amount_extended
);
if ( extend_ok ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
577ea: d1aa 005c addl %d0,%a2@(92)
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
577ee: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
577f4: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
return return_status;
577fa: 588f addql #4,%sp
}
577fc: 2002 movel %d2,%d0
577fe: 242e fff0 movel %fp@(-16),%d2
57802: 246e fff4 moveal %fp@(-12),%a2
57806: 4e5e unlk %fp
57808: 4e75 rts
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
5780a: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
57810: 7404 moveq #4,%d2
break;
}
_RTEMS_Unlock_allocator();
57812: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
return return_status;
57818: 588f addql #4,%sp
5781a: 60e0 bras 577fc <rtems_region_extend+0x74>
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
5781c: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
5781e: 2002 movel %d2,%d0
57820: 242e fff0 movel %fp@(-16),%d2
57824: 246e fff4 moveal %fp@(-12),%a2
57828: 4e5e unlk %fp
5782a: 4e75 rts
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
5782c: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
if ( extend_ok ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
} else {
return_status = RTEMS_INVALID_ADDRESS;
57832: 7409 moveq #9,%d2
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57834: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
return return_status;
5783a: 588f addql #4,%sp
5783c: 60be bras 577fc <rtems_region_extend+0x74>
...
00057ac4 <rtems_region_get_segment_size>:
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
uintptr_t *size
)
{
57ac4: 4e56 fffc linkw %fp,#-4
57ac8: 2f03 movel %d3,%sp@-
57aca: 262e 0010 movel %fp@(16),%d3
57ace: 2f02 movel %d2,%sp@-
57ad0: 242e 000c movel %fp@(12),%d2
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
57ad4: 6700 0092 beqw 57b68 <rtems_region_get_segment_size+0xa4>
return RTEMS_INVALID_ADDRESS;
if ( !size )
57ad8: 4a83 tstl %d3
57ada: 6700 008c beqw 57b68 <rtems_region_get_segment_size+0xa4>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
57ade: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
57ae4: 4eb9 0005 9e20 jsr 59e20 <_API_Mutex_Lock>
57aea: 486e fffc pea %fp@(-4)
57aee: 2f2e 0008 movel %fp@(8),%sp@-
57af2: 4879 0007 d1d4 pea 7d1d4 <_Region_Information>
57af8: 4eb9 0005 bad0 jsr 5bad0 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
57afe: 222e fffc movel %fp@(-4),%d1
57b02: 4fef 0010 lea %sp@(16),%sp
57b06: 6636 bnes 57b3e <rtems_region_get_segment_size+0x7a>
case OBJECTS_LOCAL:
if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) )
57b08: 2f03 movel %d3,%sp@-
57b0a: 2040 moveal %d0,%a0
57b0c: 2f02 movel %d2,%sp@-
57b0e: 4868 0068 pea %a0@(104)
57b12: 4eb9 0005 b4ec jsr 5b4ec <_Heap_Size_of_alloc_area>
57b18: 4fef 000c lea %sp@(12),%sp
57b1c: 4a00 tstb %d0
57b1e: 6624 bnes 57b44 <rtems_region_get_segment_size+0x80><== ALWAYS TAKEN
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57b20: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@- <== NOT EXECUTED
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;
57b26: 7409 moveq #9,%d2 <== NOT EXECUTED
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57b28: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
57b2e: 588f addql #4,%sp <== NOT EXECUTED
}
57b30: 2002 movel %d2,%d0
57b32: 242e fff4 movel %fp@(-12),%d2
57b36: 262e fff8 movel %fp@(-8),%d3
57b3a: 4e5e unlk %fp
57b3c: 4e75 rts
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
57b3e: 7001 moveq #1,%d0
57b40: b081 cmpl %d1,%d0
57b42: 6712 beqs 57b56 <rtems_region_get_segment_size+0x92><== ALWAYS TAKEN
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57b44: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
57b4a: 4282 clrl %d2
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57b4c: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
return return_status;
57b52: 588f addql #4,%sp
57b54: 60da bras 57b30 <rtems_region_get_segment_size+0x6c>
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57b56: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
case OBJECTS_REMOTE: /* this error cannot be returned */
break;
#endif
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
57b5c: 7404 moveq #4,%d2
break;
}
_RTEMS_Unlock_allocator();
57b5e: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
return return_status;
57b64: 588f addql #4,%sp
57b66: 60c8 bras 57b30 <rtems_region_get_segment_size+0x6c>
if ( !segment )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
57b68: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
57b6a: 2002 movel %d2,%d0
57b6c: 242e fff4 movel %fp@(-12),%d2
57b70: 262e fff8 movel %fp@(-8),%d3
57b74: 4e5e unlk %fp <== NOT EXECUTED
00057ba4 <rtems_region_resize_segment>:
rtems_id id,
void *segment,
uintptr_t size,
uintptr_t *old_size
)
{
57ba4: 4e56 fff0 linkw %fp,#-16
57ba8: 2f0b movel %a3,%sp@-
57baa: 2f0a movel %a2,%sp@-
57bac: 246e 0014 moveal %fp@(20),%a2
uintptr_t osize;
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
57bb0: 4a8a tstl %a2
57bb2: 6700 00a4 beqw 57c58 <rtems_region_resize_segment+0xb4>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
57bb6: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
57bbc: 4eb9 0005 9e20 jsr 59e20 <_API_Mutex_Lock>
57bc2: 486e fff8 pea %fp@(-8)
57bc6: 2f2e 0008 movel %fp@(8),%sp@-
57bca: 4879 0007 d1d4 pea 7d1d4 <_Region_Information>
57bd0: 4eb9 0005 bad0 jsr 5bad0 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
57bd6: 4fef 0010 lea %sp@(16),%sp
57bda: 2640 moveal %d0,%a3
57bdc: 4aae fff8 tstl %fp@(-8)
57be0: 663e bnes 57c20 <rtems_region_resize_segment+0x7c><== NEVER TAKEN
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 7 );
status = _Heap_Resize_block(
57be2: 486e fffc pea %fp@(-4)
57be6: 486e fff4 pea %fp@(-12)
57bea: 2f2e 0010 movel %fp@(16),%sp@-
57bee: 2f2e 000c movel %fp@(12),%sp@-
57bf2: 486b 0068 pea %a3@(104)
57bf6: 4eb9 0005 b400 jsr 5b400 <_Heap_Resize_block>
segment,
(uint32_t) size,
&osize,
&avail_size
);
*old_size = (uint32_t) osize;
57bfc: 24ae fff4 movel %fp@(-12),%a2@
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
57c00: 4fef 0014 lea %sp@(20),%sp
57c04: 4a80 tstl %d0
57c06: 6634 bnes 57c3c <rtems_region_resize_segment+0x98>
_Region_Process_queue( the_region ); /* unlocks allocator */
57c08: 2f0b movel %a3,%sp@-
57c0a: 4eb9 0005 f5ec jsr 5f5ec <_Region_Process_queue>
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
57c10: 246e ffe8 moveal %fp@(-24),%a2
*old_size = (uint32_t) osize;
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
_Region_Process_queue( the_region ); /* unlocks allocator */
57c14: 588f addql #4,%sp
else
_RTEMS_Unlock_allocator();
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
57c16: 4280 clrl %d0
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
57c18: 266e ffec moveal %fp@(-20),%a3
57c1c: 4e5e unlk %fp
57c1e: 4e75 rts
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
57c20: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
57c26: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
return return_status;
}
57c2c: 246e ffe8 moveal %fp@(-24),%a2
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
return return_status;
57c30: 588f addql #4,%sp
57c32: 7004 moveq #4,%d0
}
57c34: 266e ffec moveal %fp@(-20),%a3
57c38: 4e5e unlk %fp
57c3a: 4e75 rts
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
_Region_Process_queue( the_region ); /* unlocks allocator */
else
_RTEMS_Unlock_allocator();
57c3c: 2f39 0007 d36a movel 7d36a <_RTEMS_Allocator_Mutex>,%sp@-
57c42: 2d40 fff0 movel %d0,%fp@(-16)
57c46: 4eb9 0005 9e80 jsr 59e80 <_API_Mutex_Unlock>
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
57c4c: 202e fff0 movel %fp@(-16),%d0
57c50: 588f addql #4,%sp
57c52: 7201 moveq #1,%d1
57c54: b280 cmpl %d0,%d1
57c56: 670e beqs 57c66 <rtems_region_resize_segment+0xc2>
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
57c58: 246e ffe8 moveal %fp@(-24),%a2
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
return RTEMS_UNSATISFIED;
return RTEMS_INVALID_ADDRESS;
57c5c: 7009 moveq #9,%d0
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
57c5e: 266e ffec moveal %fp@(-20),%a3
57c62: 4e5e unlk %fp
57c64: 4e75 rts
57c66: 246e ffe8 moveal %fp@(-24),%a2
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
return RTEMS_UNSATISFIED;
57c6a: 700d moveq #13,%d0
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
57c6c: 266e ffec moveal %fp@(-20),%a3
57c70: 4e5e unlk %fp <== NOT EXECUTED
00046570 <rtems_semaphore_delete>:
#endif
rtems_status_code rtems_semaphore_delete(
rtems_id id
)
{
46570: 4e56 fffc linkw %fp,#-4
46574: 2f0a movel %a2,%sp@-
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
_Objects_Get( &_Semaphore_Information, id, location );
46576: 486e fffc pea %fp@(-4)
4657a: 2f2e 0008 movel %fp@(8),%sp@-
4657e: 4879 0005 e360 pea 5e360 <_Semaphore_Information>
46584: 4eb9 0004 7f48 jsr 47f48 <_Objects_Get>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
4658a: 4fef 000c lea %sp@(12),%sp
4658e: 2440 moveal %d0,%a2
46590: 4aae fffc tstl %fp@(-4)
46594: 670a beqs 465a0 <rtems_semaphore_delete+0x30>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46596: 246e fff8 moveal %fp@(-8),%a2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4659a: 7004 moveq #4,%d0
}
4659c: 4e5e unlk %fp
4659e: 4e75 rts
465a0: 7030 moveq #48,%d0
465a2: c0aa 0010 andl %a2@(16),%d0
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
465a6: 6760 beqs 46608 <rtems_semaphore_delete+0x98>
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) &&
465a8: 4aaa 0062 tstl %a2@(98)
465ac: 6616 bnes 465c4 <rtems_semaphore_delete+0x54>
465ae: 7220 moveq #32,%d1
465b0: b280 cmpl %d0,%d1
465b2: 6710 beqs 465c4 <rtems_semaphore_delete+0x54>
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
465b4: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
465ba: 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;
465be: 700c moveq #12,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
465c0: 4e5e unlk %fp
465c2: 4e75 rts
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
_CORE_mutex_Flush(
465c4: 4878 0004 pea 4 <CONTEXT_ARG>
465c8: 42a7 clrl %sp@-
465ca: 486a 0014 pea %a2@(20)
465ce: 4eb9 0004 70d8 jsr 470d8 <_CORE_mutex_Flush>
465d4: 4fef 000c lea %sp@(12),%sp
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
465d8: 2f0a movel %a2,%sp@-
465da: 4879 0005 e360 pea 5e360 <_Semaphore_Information>
465e0: 4eb9 0004 7b1c jsr 47b1c <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
465e6: 2f0a movel %a2,%sp@-
465e8: 4879 0005 e360 pea 5e360 <_Semaphore_Information>
465ee: 4eb9 0004 7de0 jsr 47de0 <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
465f4: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
465fa: 4fef 0010 lea %sp@(16),%sp
465fe: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46600: 246e fff8 moveal %fp@(-8),%a2
46604: 4e5e unlk %fp
46606: 4e75 rts
&the_semaphore->Core_control.mutex,
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_MUTEX_WAS_DELETED
);
} else {
_CORE_semaphore_Flush(
46608: 4878 0002 pea 2 <DOUBLE_FLOAT>
4660c: 42a7 clrl %sp@-
4660e: 486a 0014 pea %a2@(20)
46612: 4eb9 0004 7410 jsr 47410 <_CORE_semaphore_Flush>
46618: 4fef 000c lea %sp@(12),%sp
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
4661c: 2f0a movel %a2,%sp@-
4661e: 4879 0005 e360 pea 5e360 <_Semaphore_Information>
46624: 4eb9 0004 7b1c jsr 47b1c <_Objects_Close>
4662a: 2f0a movel %a2,%sp@-
4662c: 4879 0005 e360 pea 5e360 <_Semaphore_Information>
46632: 4eb9 0004 7de0 jsr 47de0 <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
46638: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4663e: 4fef 0010 lea %sp@(16),%sp
46642: 4280 clrl %d0
46644: 60ba bras 46600 <rtems_semaphore_delete+0x90>
...
0004f8f0 <rtems_semaphore_flush>:
#endif
rtems_status_code rtems_semaphore_flush(
rtems_id id
)
{
4f8f0: 4e56 fffc linkw %fp,#-4
4f8f4: 486e fffc pea %fp@(-4)
4f8f8: 2f2e 0008 movel %fp@(8),%sp@-
4f8fc: 4879 0006 25a8 pea 625a8 <_Semaphore_Information>
4f902: 4eb9 0004 9500 jsr 49500 <_Objects_Get>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
4f908: 4fef 000c lea %sp@(12),%sp
4f90c: 4aae fffc tstl %fp@(-4)
4f910: 6706 beqs 4f918 <rtems_semaphore_flush+0x28>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4f912: 7004 moveq #4,%d0
}
4f914: 4e5e unlk %fp
4f916: 4e75 rts
4f918: 7230 moveq #48,%d1
4f91a: 2040 moveal %d0,%a0
4f91c: c2a8 0010 andl %a0@(16),%d1
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
4f920: 6720 beqs 4f942 <rtems_semaphore_flush+0x52>
_CORE_mutex_Flush(
4f922: 4878 0001 pea 1 <ADD>
4f926: 42a7 clrl %sp@-
4f928: 4868 0014 pea %a0@(20)
4f92c: 4eb9 0004 8690 jsr 48690 <_CORE_mutex_Flush>
4f932: 4fef 000c lea %sp@(12),%sp
&the_semaphore->Core_control.semaphore,
SEND_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT
);
}
_Thread_Enable_dispatch();
4f936: 4eb9 0004 9dee jsr 49dee <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4f93c: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4f93e: 4e5e unlk %fp
4f940: 4e75 rts
&the_semaphore->Core_control.mutex,
SEND_OBJECT_WAS_DELETED,
CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT
);
} else {
_CORE_semaphore_Flush(
4f942: 4878 0001 pea 1 <ADD>
4f946: 2040 moveal %d0,%a0
4f948: 42a7 clrl %sp@-
4f94a: 4868 0014 pea %a0@(20)
4f94e: 4eb9 0004 89c8 jsr 489c8 <_CORE_semaphore_Flush>
4f954: 4fef 000c lea %sp@(12),%sp
&the_semaphore->Core_control.semaphore,
SEND_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT
);
}
_Thread_Enable_dispatch();
4f958: 4eb9 0004 9dee jsr 49dee <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4f95e: 4280 clrl %d0
4f960: 60dc bras 4f93e <rtems_semaphore_flush+0x4e>
...
00046648 <rtems_semaphore_obtain>:
rtems_status_code rtems_semaphore_obtain(
rtems_id id,
rtems_option option_set,
rtems_interval timeout
)
{
46648: 4e56 ffec linkw %fp,#-20
4664c: 48d7 001c moveml %d2-%d4,%sp@
Objects_Locations *location,
ISR_Level *level
)
{
return (Semaphore_Control *)
_Objects_Get_isr_disable( &_Semaphore_Information, id, location, level );
46650: 486e fff8 pea %fp@(-8)
46654: 486e fffc pea %fp@(-4)
46658: 242e 0008 movel %fp@(8),%d2
4665c: 2f02 movel %d2,%sp@-
4665e: 4879 0005 e360 pea 5e360 <_Semaphore_Information>
46664: 262e 000c movel %fp@(12),%d3
46668: 282e 0010 movel %fp@(16),%d4
4666c: 4eb9 0004 7ee8 jsr 47ee8 <_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 ) {
46672: 4fef 0010 lea %sp@(16),%sp
46676: 4aae fffc tstl %fp@(-4)
4667a: 670c beqs 46688 <rtems_semaphore_obtain+0x40>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4667c: 7004 moveq #4,%d0
}
4667e: 4cee 001c ffec moveml %fp@(-20),%d2-%d4
46684: 4e5e unlk %fp
46686: 4e75 rts
46688: 7230 moveq #48,%d1
4668a: 2040 moveal %d0,%a0
4668c: c2a8 0010 andl %a0@(16),%d1
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
46690: 6738 beqs 466ca <rtems_semaphore_obtain+0x82>
_CORE_mutex_Seize(
46692: 2f2e fff8 movel %fp@(-8),%sp@-
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
46696: 7201 moveq #1,%d1
46698: c681 andl %d1,%d3
4669a: 2f04 movel %d4,%sp@-
4669c: b781 eorl %d3,%d1
4669e: 2f01 movel %d1,%sp@-
466a0: 2f02 movel %d2,%sp@-
466a2: 4868 0014 pea %a0@(20)
466a6: 4eb9 0004 7260 jsr 47260 <_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 );
466ac: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
466b2: 2f28 0034 movel %a0@(52),%sp@-
466b6: 4eb9 0004 6818 jsr 46818 <_Semaphore_Translate_core_mutex_return_code>
466bc: 4fef 0018 lea %sp@(24),%sp
break;
}
return RTEMS_INVALID_ID;
}
466c0: 4cee 001c ffec moveml %fp@(-20),%d2-%d4
466c6: 4e5e unlk %fp
466c8: 4e75 rts
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
466ca: 2240 moveal %d0,%a1
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
466cc: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
466d2: 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;
466d6: 42a8 0034 clrl %a0@(52)
if ( the_semaphore->count != 0 ) {
466da: 4a81 tstl %d1
466dc: 662e bnes 4670c <rtems_semaphore_obtain+0xc4>
the_semaphore->count -= 1;
_ISR_Enable( *level_p );
return;
}
if ( !wait ) {
466de: 0803 0000 btst #0,%d3
466e2: 6748 beqs 4672c <rtems_semaphore_obtain+0xe4>
_ISR_Enable( *level_p );
466e4: 202e fff8 movel %fp@(-8),%d0
466e8: 46c0 movew %d0,%sr
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
466ea: 7001 moveq #1,%d0
466ec: 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 );
466f0: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
466f6: 2f28 0034 movel %a0@(52),%sp@-
466fa: 4eb9 0004 682e jsr 4682e <_Semaphore_Translate_core_semaphore_return_code>
46700: 588f addql #4,%sp
break;
}
return RTEMS_INVALID_ID;
}
46702: 4cee 001c ffec moveml %fp@(-20),%d2-%d4
46708: 4e5e unlk %fp
4670a: 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;
4670c: 5381 subql #1,%d1
4670e: 2341 005c movel %d1,%a1@(92)
_ISR_Enable( *level_p );
46712: 202e fff8 movel %fp@(-8),%d0
46716: 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 );
46718: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
4671e: 2f28 0034 movel %a0@(52),%sp@-
46722: 4eb9 0004 682e jsr 4682e <_Semaphore_Translate_core_semaphore_return_code>
46728: 588f addql #4,%sp
4672a: 60d6 bras 46702 <rtems_semaphore_obtain+0xba>
4672c: 2239 0005 e41c movel 5e41c <_Thread_Dispatch_disable_level>,%d1
46732: 5281 addql #1,%d1
46734: 23c1 0005 e41c movel %d1,5e41c <_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;
4673a: 7201 moveq #1,%d1
4673c: 2240 moveal %d0,%a1
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
4673e: 0680 0000 0014 addil #20,%d0
46744: 2341 0044 movel %d1,%a1@(68)
executing->Wait.id = id;
46748: 2142 0020 movel %d2,%a0@(32)
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
4674c: 2140 0044 movel %d0,%a0@(68)
executing->Wait.id = id;
_ISR_Enable( *level_p );
46750: 222e fff8 movel %fp@(-8),%d1
46754: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
46756: 4879 0004 90c4 pea 490c4 <_Thread_queue_Timeout>
4675c: 2f04 movel %d4,%sp@-
4675e: 2f00 movel %d0,%sp@-
46760: 4eb9 0004 8cfc jsr 48cfc <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
46766: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
_Thread_Executing->Wait.return_code );
4676c: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
46772: 4fef 000c lea %sp@(12),%sp
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
46776: 2f28 0034 movel %a0@(52),%sp@-
4677a: 4eb9 0004 682e jsr 4682e <_Semaphore_Translate_core_semaphore_return_code>
46780: 588f addql #4,%sp
46782: 6000 ff7e braw 46702 <rtems_semaphore_obtain+0xba>
...
00058244 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
58244: 4e56 fffc linkw %fp,#-4
58248: 2f03 movel %d3,%sp@-
5824a: 2f02 movel %d2,%sp@-
5824c: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
58250: 660e bnes 58260 <rtems_signal_send+0x1c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
58252: 242e fff4 movel %fp@(-12),%d2
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
58256: 700a moveq #10,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
58258: 262e fff8 movel %fp@(-8),%d3
5825c: 4e5e unlk %fp
5825e: 4e75 rts
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
58260: 486e fffc pea %fp@(-4)
58264: 2f2e 0008 movel %fp@(8),%sp@-
58268: 4eb9 0005 c418 jsr 5c418 <_Thread_Get>
switch ( location ) {
5826e: 508f addql #8,%sp
58270: 4aae fffc tstl %fp@(-4)
58274: 670e beqs 58284 <rtems_signal_send+0x40>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
58276: 242e fff4 movel %fp@(-12),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
5827a: 7004 moveq #4,%d0
}
5827c: 262e fff8 movel %fp@(-8),%d3
58280: 4e5e unlk %fp
58282: 4e75 rts
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
58284: 2240 moveal %d0,%a1
58286: 2069 0108 moveal %a1@(264),%a0
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
5828a: 4aa8 000a tstl %a0@(10)
5828e: 676a beqs 582fa <rtems_signal_send+0xb6>
if ( asr->is_enabled ) {
58290: 4a28 0008 tstb %a0@(8)
58294: 6736 beqs 582cc <rtems_signal_send+0x88>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
58296: 223c 0000 0700 movel #1792,%d1
5829c: 40c3 movew %sr,%d3
5829e: 8283 orl %d3,%d1
582a0: 46c1 movew %d1,%sr
*signal_set |= signals;
582a2: 85a8 0012 orl %d2,%a0@(18)
_ISR_Enable( _level );
582a6: 46c3 movew %d3,%sr
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
582a8: 4ab9 0007 d490 tstl 7d490 <_Per_CPU_Information+0x8>
582ae: 6708 beqs 582b8 <rtems_signal_send+0x74>
582b0: b0b9 0007 d494 cmpl 7d494 <_Per_CPU_Information+0xc>,%d0
582b6: 6730 beqs 582e8 <rtems_signal_send+0xa4> <== ALWAYS TAKEN
_Context_Switch_necessary = true;
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
582b8: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
582be: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
582c0: 242e fff4 movel %fp@(-12),%d2
582c4: 262e fff8 movel %fp@(-8),%d3
582c8: 4e5e unlk %fp
582ca: 4e75 rts
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
582cc: 203c 0000 0700 movel #1792,%d0
582d2: 40c1 movew %sr,%d1
582d4: 8081 orl %d1,%d0
582d6: 46c0 movew %d0,%sr
*signal_set |= signals;
582d8: 85a8 0016 orl %d2,%a0@(22)
_ISR_Enable( _level );
582dc: 46c1 movew %d1,%sr
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Context_Switch_necessary = true;
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
582de: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
582e4: 4280 clrl %d0
582e6: 60d8 bras 582c0 <rtems_signal_send+0x7c>
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 ) )
_Context_Switch_necessary = true;
582e8: 7001 moveq #1,%d0
582ea: 13c0 0007 d4a0 moveb %d0,7d4a0 <_Per_CPU_Information+0x18>
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
582f0: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
582f6: 4280 clrl %d0
582f8: 60c6 bras 582c0 <rtems_signal_send+0x7c>
}
_Thread_Enable_dispatch();
582fa: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
58300: 242e fff4 movel %fp@(-12),%d2
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_NOT_DEFINED;
58304: 700b moveq #11,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
58306: 262e fff8 movel %fp@(-8),%d3
5830a: 4e5e unlk %fp
...
0004d5ac <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
4d5ac: 4e56 ffe4 linkw %fp,#-28
4d5b0: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@
4d5b4: 2a2e 0008 movel %fp@(8),%d5
4d5b8: 242e 000c movel %fp@(12),%d2
4d5bc: 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 )
4d5c0: 4a8c tstl %a4
4d5c2: 6700 015c beqw 4d720 <rtems_task_mode+0x174>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
4d5c6: 2479 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a2
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
4d5cc: 4a2a 0074 tstb %a2@(116)
4d5d0: 57c3 seq %d3
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
4d5d2: 266a 0108 moveal %a2@(264),%a3
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
4d5d6: 49c3 extbl %d3
4d5d8: 0283 0000 0100 andil #256,%d3
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
4d5de: 4aaa 007a tstl %a2@(122)
4d5e2: 6600 00cc bnew 4d6b0 <rtems_task_mode+0x104>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
4d5e6: 4a2b 0008 tstb %a3@(8)
4d5ea: 57c4 seq %d4
old_mode |= _ISR_Get_level();
4d5ec: 4eb9 0004 9d68 jsr 49d68 <_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;
4d5f2: 49c4 extbl %d4
4d5f4: 0284 0000 0400 andil #1024,%d4
4d5fa: 8084 orl %d4,%d0
old_mode |= _ISR_Get_level();
4d5fc: 8083 orl %d3,%d0
4d5fe: 2880 movel %d0,%a4@
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
4d600: 0802 0008 btst #8,%d2
4d604: 670c beqs 4d612 <rtems_task_mode+0x66>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
4d606: 0805 0008 btst #8,%d5
4d60a: 57c0 seq %d0
4d60c: 4480 negl %d0
4d60e: 1540 0074 moveb %d0,%a2@(116)
if ( mask & RTEMS_TIMESLICE_MASK ) {
4d612: 0802 0009 btst #9,%d2
4d616: 6718 beqs 4d630 <rtems_task_mode+0x84>
if ( _Modes_Is_timeslice(mode_set) ) {
4d618: 0805 0009 btst #9,%d5
4d61c: 6700 00f0 beqw 4d70e <rtems_task_mode+0x162>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
4d620: 7001 moveq #1,%d0
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4d622: 41f9 0005 e3d4 lea 5e3d4 <_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;
4d628: 2540 007a movel %d0,%a2@(122)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4d62c: 2550 0076 movel %a0@,%a2@(118)
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
4d630: 7007 moveq #7,%d0
4d632: c082 andl %d2,%d0
4d634: 6712 beqs 4d648 <rtems_task_mode+0x9c>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
4d636: 40c0 movew %sr,%d0
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
4d638: 7207 moveq #7,%d1
4d63a: 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 ) );
4d63c: 0280 0000 f8ff andil #63743,%d0
4d642: e189 lsll #8,%d1
4d644: 8081 orl %d1,%d0
4d646: 46c0 movew %d0,%sr
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
4d648: 0802 000a btst #10,%d2
4d64c: 6754 beqs 4d6a2 <rtems_task_mode+0xf6>
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
4d64e: 4282 clrl %d2
4d650: 142b 0008 moveb %a3@(8),%d2
4d654: 4280 clrl %d0
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
4d656: 0805 000a btst #10,%d5
4d65a: 57c1 seq %d1
4d65c: 4481 negl %d1
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
4d65e: 1001 moveb %d1,%d0
4d660: b082 cmpl %d2,%d0
4d662: 673e beqs 4d6a2 <rtems_task_mode+0xf6>
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
4d664: 203c 0000 0700 movel #1792,%d0
asr->is_enabled = is_asr_enabled;
4d66a: 1741 0008 moveb %d1,%a3@(8)
4d66e: 40c1 movew %sr,%d1
4d670: 8081 orl %d1,%d0
4d672: 46c0 movew %d0,%sr
_signals = information->signals_pending;
4d674: 202b 0016 movel %a3@(22),%d0
information->signals_pending = information->signals_posted;
4d678: 276b 0012 0016 movel %a3@(18),%a3@(22)
information->signals_posted = _signals;
4d67e: 2740 0012 movel %d0,%a3@(18)
_ISR_Enable( _level );
4d682: 46c1 movew %d1,%sr
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
4d684: 4aab 0012 tstl %a3@(18)
4d688: 56c0 sne %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) )
4d68a: 7203 moveq #3,%d1
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
4d68c: 4480 negl %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) )
4d68e: b2b9 0005 e588 cmpl 5e588 <_System_state_Current>,%d1
4d694: 6744 beqs 4d6da <rtems_task_mode+0x12e> <== ALWAYS TAKEN
if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
_Thread_Dispatch();
return RTEMS_SUCCESSFUL;
4d696: 4280 clrl %d0
}
4d698: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
4d69e: 4e5e unlk %fp
4d6a0: 4e75 rts
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) )
4d6a2: 7203 moveq #3,%d1
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
4d6a4: 4200 clrb %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) )
4d6a6: b2b9 0005 e588 cmpl 5e588 <_System_state_Current>,%d1
4d6ac: 66e8 bnes 4d696 <rtems_task_mode+0xea> <== NEVER TAKEN
4d6ae: 602a bras 4d6da <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;
4d6b0: 4a2b 0008 tstb %a3@(8)
4d6b4: 57c4 seq %d4
old_mode |= _ISR_Get_level();
4d6b6: 4eb9 0004 9d68 jsr 49d68 <_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;
4d6bc: 49c4 extbl %d4
4d6be: 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;
4d6c4: 08c3 0009 bset #9,%d3
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
4d6c8: 8084 orl %d4,%d0
old_mode |= _ISR_Get_level();
4d6ca: 8083 orl %d3,%d0
4d6cc: 2880 movel %d0,%a4@
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
4d6ce: 0802 0008 btst #8,%d2
4d6d2: 6700 ff3e beqw 4d612 <rtems_task_mode+0x66>
4d6d6: 6000 ff2e braw 4d606 <rtems_task_mode+0x5a>
*/
RTEMS_INLINE_ROUTINE bool _Thread_Evaluate_mode( void )
{
Thread_Control *executing;
executing = _Thread_Executing;
4d6da: 2079 0005 e5e0 moveal 5e5e0 <_Per_CPU_Information+0xc>,%a0
if ( !_States_Is_ready( executing->current_state ) ||
4d6e0: 4aa8 0010 tstl %a0@(16)
4d6e4: 660e bnes 4d6f4 <rtems_task_mode+0x148> <== NEVER TAKEN
4d6e6: b1f9 0005 e5e4 cmpal 5e5e4 <_Per_CPU_Information+0x10>,%a0
4d6ec: 673e beqs 4d72c <rtems_task_mode+0x180>
( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) {
4d6ee: 4a28 0074 tstb %a0@(116)
4d6f2: 6738 beqs 4d72c <rtems_task_mode+0x180> <== NEVER TAKEN
_Context_Switch_necessary = true;
4d6f4: 7001 moveq #1,%d0
4d6f6: 13c0 0005 e5ec moveb %d0,5e5ec <_Per_CPU_Information+0x18>
}
}
if ( _System_state_Is_up( _System_state_Get() ) )
if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
_Thread_Dispatch();
4d6fc: 4eb9 0004 86c4 jsr 486c4 <_Thread_Dispatch>
return RTEMS_SUCCESSFUL;
4d702: 4280 clrl %d0
}
4d704: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
4d70a: 4e5e unlk %fp
4d70c: 4e75 rts
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
4d70e: 7007 moveq #7,%d0
4d710: 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;
4d712: 42aa 007a clrl %a2@(122)
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
4d716: 4a80 tstl %d0
4d718: 6700 ff2e beqw 4d648 <rtems_task_mode+0x9c>
4d71c: 6000 ff18 braw 4d636 <rtems_task_mode+0x8a>
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
4d720: 7009 moveq #9,%d0
if ( _System_state_Is_up( _System_state_Get() ) )
if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
_Thread_Dispatch();
return RTEMS_SUCCESSFUL;
}
4d722: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
4d728: 4e5e unlk %fp
4d72a: 4e75 rts
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) )
if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
4d72c: 4a00 tstb %d0
4d72e: 6700 ff66 beqw 4d696 <rtems_task_mode+0xea>
_Thread_Dispatch();
4d732: 4eb9 0004 86c4 jsr 486c4 <_Thread_Dispatch>
return RTEMS_SUCCESSFUL;
4d738: 4280 clrl %d0
4d73a: 60c8 bras 4d704 <rtems_task_mode+0x158>
0004af0c <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
4af0c: 4e56 fffc linkw %fp,#-4
4af10: 2f0a movel %a2,%sp@-
4af12: 246e 0010 moveal %fp@(16),%a2
4af16: 2f02 movel %d2,%sp@-
4af18: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
4af1c: 670c beqs 4af2a <rtems_task_set_priority+0x1e>
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 ) );
4af1e: 4280 clrl %d0
4af20: 1039 0006 11b2 moveb 611b2 <rtems_maximum_priority>,%d0
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
4af26: b082 cmpl %d2,%d0
4af28: 6566 bcss 4af90 <rtems_task_set_priority+0x84>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
4af2a: 4a8a tstl %a2
4af2c: 6770 beqs 4af9e <rtems_task_set_priority+0x92>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
4af2e: 486e fffc pea %fp@(-4)
4af32: 2f2e 0008 movel %fp@(8),%sp@-
4af36: 4eb9 0004 ceb4 jsr 4ceb4 <_Thread_Get>
switch ( location ) {
4af3c: 508f addql #8,%sp
4af3e: 4aae fffc tstl %fp@(-4)
4af42: 663e bnes 4af82 <rtems_task_set_priority+0x76>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
4af44: 2040 moveal %d0,%a0
4af46: 24a8 0014 movel %a0@(20),%a2@
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
4af4a: 4a82 tstl %d2
4af4c: 6720 beqs 4af6e <rtems_task_set_priority+0x62>
the_thread->real_priority = new_priority;
4af4e: 2142 0018 movel %d2,%a0@(24)
if ( the_thread->resource_count == 0 ||
4af52: 4aa8 001c tstl %a0@(28)
4af56: 6706 beqs 4af5e <rtems_task_set_priority+0x52>
4af58: b4a8 0014 cmpl %a0@(20),%d2
4af5c: 6410 bccs 4af6e <rtems_task_set_priority+0x62> <== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
4af5e: 42a7 clrl %sp@-
4af60: 2f02 movel %d2,%sp@-
4af62: 2f00 movel %d0,%sp@-
4af64: 4eb9 0004 c95c jsr 4c95c <_Thread_Change_priority>
4af6a: 4fef 000c lea %sp@(12),%sp
}
_Thread_Enable_dispatch();
4af6e: 4eb9 0004 ce8e jsr 4ce8e <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4af74: 242e fff4 movel %fp@(-12),%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;
4af78: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4af7a: 246e fff8 moveal %fp@(-8),%a2
4af7e: 4e5e unlk %fp
4af80: 4e75 rts
4af82: 242e fff4 movel %fp@(-12),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4af86: 7004 moveq #4,%d0
}
4af88: 246e fff8 moveal %fp@(-8),%a2
4af8c: 4e5e unlk %fp
4af8e: 4e75 rts
4af90: 242e fff4 movel %fp@(-12),%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;
4af94: 7013 moveq #19,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4af96: 246e fff8 moveal %fp@(-8),%a2
4af9a: 4e5e unlk %fp
4af9c: 4e75 rts
4af9e: 242e fff4 movel %fp@(-12),%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;
4afa2: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4afa4: 246e fff8 moveal %fp@(-8),%a2
4afa8: 4e5e unlk %fp <== NOT EXECUTED
00046af4 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
46af4: 4e56 fffc linkw %fp,#-4
46af8: 2f02 movel %d2,%sp@-
46afa: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
46afe: 674a beqs 46b4a <rtems_task_start+0x56> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
46b00: 486e fffc pea %fp@(-4)
46b04: 2f2e 0008 movel %fp@(8),%sp@-
46b08: 4eb9 0004 8854 jsr 48854 <_Thread_Get>
switch ( location ) {
46b0e: 508f addql #8,%sp
46b10: 4aae fffc tstl %fp@(-4)
46b14: 662a bnes 46b40 <rtems_task_start+0x4c>
case OBJECTS_LOCAL:
if ( _Thread_Start(
46b16: 2f2e 0010 movel %fp@(16),%sp@-
46b1a: 42a7 clrl %sp@-
46b1c: 2f02 movel %d2,%sp@-
46b1e: 42a7 clrl %sp@-
46b20: 2f00 movel %d0,%sp@-
46b22: 4eb9 0004 93e4 jsr 493e4 <_Thread_Start>
46b28: 4fef 0014 lea %sp@(20),%sp
46b2c: 4a00 tstb %d0
46b2e: 6624 bnes 46b54 <rtems_task_start+0x60>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
46b30: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46b36: 242e fff8 movel %fp@(-8),%d2
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
46b3a: 700e moveq #14,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46b3c: 4e5e unlk %fp
46b3e: 4e75 rts
46b40: 242e fff8 movel %fp@(-8),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
46b44: 7004 moveq #4,%d0
}
46b46: 4e5e unlk %fp
46b48: 4e75 rts
46b4a: 242e fff8 movel %fp@(-8),%d2
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
46b4e: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46b50: 4e5e unlk %fp
46b52: 4e75 rts
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
46b54: 4eb9 0004 882e jsr 4882e <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46b5a: 242e fff8 movel %fp@(-8),%d2
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
46b5e: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
46b60: 4e5e unlk %fp <== NOT EXECUTED
00047788 <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
47788: 4e56 fffc linkw %fp,#-4
4778c: 2f02 movel %d2,%sp@-
4778e: 242e 000c movel %fp@(12),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
47792: 6772 beqs 47806 <rtems_task_variable_delete+0x7e>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
47794: 486e fffc pea %fp@(-4)
47798: 2f2e 0008 movel %fp@(8),%sp@-
4779c: 4eb9 0004 9524 jsr 49524 <_Thread_Get>
switch (location) {
477a2: 508f addql #8,%sp
477a4: 4aae fffc tstl %fp@(-4)
477a8: 6634 bnes 477de <rtems_task_variable_delete+0x56>
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
477aa: 2040 moveal %d0,%a0
477ac: 2268 0114 moveal %a0@(276),%a1
while (tvp) {
477b0: 4a89 tstl %a1
477b2: 671a beqs 477ce <rtems_task_variable_delete+0x46>
if (tvp->ptr == ptr) {
477b4: b4a9 0004 cmpl %a1@(4),%d2
477b8: 6756 beqs 47810 <rtems_task_variable_delete+0x88><== NEVER TAKEN
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
477ba: 2051 moveal %a1@,%a0
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
477bc: 4a88 tstl %a0
477be: 670e beqs 477ce <rtems_task_variable_delete+0x46><== NEVER TAKEN
if (tvp->ptr == ptr) {
477c0: b4a8 0004 cmpl %a0@(4),%d2
477c4: 6722 beqs 477e8 <rtems_task_variable_delete+0x60>
477c6: 2248 moveal %a0,%a1
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
477c8: 2051 moveal %a1@,%a0
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
477ca: 4a88 tstl %a0
477cc: 66f2 bnes 477c0 <rtems_task_variable_delete+0x38><== ALWAYS TAKEN
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
477ce: 4eb9 0004 94fe jsr 494fe <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
477d4: 242e fff8 movel %fp@(-8),%d2
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
477d8: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
477da: 4e5e unlk %fp
477dc: 4e75 rts
477de: 242e fff8 movel %fp@(-8),%d2
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
477e2: 7004 moveq #4,%d0
}
477e4: 4e5e unlk %fp
477e6: 4e75 rts
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
477e8: 2290 movel %a0@,%a1@
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
477ea: 2f08 movel %a0,%sp@-
477ec: 2f00 movel %d0,%sp@-
477ee: 4eb9 0004 78bc jsr 478bc <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
477f4: 4eb9 0004 94fe jsr 494fe <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
477fa: 508f addql #8,%sp
477fc: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
477fe: 242e fff8 movel %fp@(-8),%d2
47802: 4e5e unlk %fp
47804: 4e75 rts
47806: 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;
4780a: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4780c: 4e5e unlk %fp
4780e: 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;
47810: 2040 moveal %d0,%a0
47812: 2151 0114 movel %a1@,%a0@(276)
47816: 2049 moveal %a1,%a0
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
47818: 2f08 movel %a0,%sp@-
4781a: 2f00 movel %d0,%sp@-
4781c: 4eb9 0004 78bc jsr 478bc <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
47822: 4eb9 0004 94fe jsr 494fe <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
47828: 508f addql #8,%sp
4782a: 4280 clrl %d0
4782c: 60d0 bras 477fe <rtems_task_variable_delete+0x76>
...
00047830 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
47830: 4e56 fffc linkw %fp,#-4
47834: 2f0a movel %a2,%sp@-
47836: 246e 0010 moveal %fp@(16),%a2
4783a: 2f02 movel %d2,%sp@-
4783c: 242e 000c movel %fp@(12),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
47840: 6752 beqs 47894 <rtems_task_variable_get+0x64>
return RTEMS_INVALID_ADDRESS;
if ( !result )
47842: 4a8a tstl %a2
47844: 674e beqs 47894 <rtems_task_variable_get+0x64>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
47846: 486e fffc pea %fp@(-4)
4784a: 2f2e 0008 movel %fp@(8),%sp@-
4784e: 4eb9 0004 9524 jsr 49524 <_Thread_Get>
switch (location) {
47854: 508f addql #8,%sp
47856: 4aae fffc tstl %fp@(-4)
4785a: 662a bnes 47886 <rtems_task_variable_get+0x56>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
4785c: 2240 moveal %d0,%a1
4785e: 2069 0114 moveal %a1@(276),%a0
while (tvp) {
47862: 4a88 tstl %a0
47864: 670c beqs 47872 <rtems_task_variable_get+0x42>
if (tvp->ptr == ptr) {
47866: b4a8 0004 cmpl %a0@(4),%d2
4786a: 6736 beqs 478a2 <rtems_task_variable_get+0x72>
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
4786c: 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) {
4786e: 4a88 tstl %a0
47870: 66f4 bnes 47866 <rtems_task_variable_get+0x36> <== ALWAYS TAKEN
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
47872: 4eb9 0004 94fe jsr 494fe <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
47878: 242e fff4 movel %fp@(-12),%d2
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
4787c: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4787e: 246e fff8 moveal %fp@(-8),%a2
47882: 4e5e unlk %fp
47884: 4e75 rts
47886: 242e fff4 movel %fp@(-12),%d2
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4788a: 7004 moveq #4,%d0
}
4788c: 246e fff8 moveal %fp@(-8),%a2
47890: 4e5e unlk %fp
47892: 4e75 rts
47894: 242e fff4 movel %fp@(-12),%d2
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
if ( !result )
return RTEMS_INVALID_ADDRESS;
47898: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
4789a: 246e fff8 moveal %fp@(-8),%a2
4789e: 4e5e unlk %fp
478a0: 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;
478a2: 24a8 000c movel %a0@(12),%a2@
_Thread_Enable_dispatch();
478a6: 4eb9 0004 94fe jsr 494fe <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
478ac: 242e fff4 movel %fp@(-12),%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;
478b0: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
478b2: 246e fff8 moveal %fp@(-8),%a2
478b6: 4e5e unlk %fp
...
00058c44 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
58c44: 4e56 fffc linkw %fp,#-4
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
58c48: 486e fffc pea %fp@(-4)
58c4c: 2f2e 0008 movel %fp@(8),%sp@-
58c50: 4879 0007 d4de pea 7d4de <_Timer_Information>
58c56: 4eb9 0005 bb0c jsr 5bb0c <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
58c5c: 4fef 000c lea %sp@(12),%sp
58c60: 4aae fffc tstl %fp@(-4)
58c64: 6706 beqs 58c6c <rtems_timer_cancel+0x28>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
58c66: 7004 moveq #4,%d0
}
58c68: 4e5e unlk %fp
58c6a: 4e75 rts
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
58c6c: 7204 moveq #4,%d1
58c6e: 2040 moveal %d0,%a0
58c70: b2a8 0038 cmpl %a0@(56),%d1
58c74: 670c beqs 58c82 <rtems_timer_cancel+0x3e> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
58c76: 4868 0010 pea %a0@(16)
58c7a: 4eb9 0005 d98c jsr 5d98c <_Watchdog_Remove>
58c80: 588f addql #4,%sp
_Thread_Enable_dispatch();
58c82: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
58c88: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
58c8a: 4e5e unlk %fp
...
000596f8 <rtems_timer_initiate_server>:
rtems_status_code rtems_timer_initiate_server(
uint32_t priority,
uint32_t stack_size,
rtems_attribute attribute_set
)
{
596f8: 4e56 fffc linkw %fp,#-4
596fc: 202e 0008 movel %fp@(8),%d0
59700: 2f03 movel %d3,%sp@-
59702: 2f02 movel %d2,%sp@-
59704: 4a80 tstl %d0
59706: 6748 beqs 59750 <rtems_timer_initiate_server+0x58>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
59708: 4281 clrl %d1
5970a: 1239 0007 77f2 moveb 777f2 <rtems_maximum_priority>,%d1
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
59710: b280 cmpl %d0,%d1
59712: 644a bccs 5975e <rtems_timer_initiate_server+0x66>
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
59714: 72ff moveq #-1,%d1
59716: b280 cmpl %d0,%d1
59718: 6636 bnes 59750 <rtems_timer_initiate_server+0x58>
5971a: 2239 0007 d2c8 movel 7d2c8 <_Thread_Dispatch_disable_level>,%d1
59720: 5281 addql #1,%d1
return RTEMS_INVALID_PRIORITY;
_priority = 0;
59722: 4283 clrl %d3
59724: 23c1 0007 d2c8 movel %d1,7d2c8 <_Thread_Dispatch_disable_level>
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
initialized = true;
5972a: 7001 moveq #1,%d0
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
5972c: 1439 0007 87ae moveb 787ae <initialized.3554>,%d2
initialized = true;
59732: 13c0 0007 87ae moveb %d0,787ae <initialized.3554>
_Thread_Enable_dispatch();
59738: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
if ( tmpInitialized )
5973e: 4a02 tstb %d2
59740: 6744 beqs 59786 <rtems_timer_initiate_server+0x8e>
initialized = false;
}
#endif
return status;
}
59742: 242e fff4 movel %fp@(-12),%d2
tmpInitialized = initialized;
initialized = true;
_Thread_Enable_dispatch();
if ( tmpInitialized )
return RTEMS_INCORRECT_STATE;
59746: 700e moveq #14,%d0
initialized = false;
}
#endif
return status;
}
59748: 262e fff8 movel %fp@(-8),%d3
5974c: 4e5e unlk %fp
5974e: 4e75 rts
59750: 242e fff4 movel %fp@(-12),%d2
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
return RTEMS_INVALID_PRIORITY;
59754: 7013 moveq #19,%d0
initialized = false;
}
#endif
return status;
}
59756: 262e fff8 movel %fp@(-8),%d3
5975a: 4e5e unlk %fp
5975c: 4e75 rts
5975e: 2239 0007 d2c8 movel 7d2c8 <_Thread_Dispatch_disable_level>,%d1
59764: 5281 addql #1,%d1
59766: 2600 movel %d0,%d3
59768: 23c1 0007 d2c8 movel %d1,7d2c8 <_Thread_Dispatch_disable_level>
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
initialized = true;
5976e: 7001 moveq #1,%d0
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
59770: 1439 0007 87ae moveb 787ae <initialized.3554>,%d2
initialized = true;
59776: 13c0 0007 87ae moveb %d0,787ae <initialized.3554>
_Thread_Enable_dispatch();
5977c: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
if ( tmpInitialized )
59782: 4a02 tstb %d2
59784: 66bc bnes 59742 <rtems_timer_initiate_server+0x4a><== NEVER TAKEN
* other library rules. For example, if using a TSR written in Ada the
* Server should run at the same priority as the priority Ada task.
* Otherwise, the priority ceiling for the mutex used to protect the
* GNAT run-time is violated.
*/
status = rtems_task_create(
59786: 222e 0010 movel %fp@(16),%d1
5978a: 486e fffc pea %fp@(-4)
5978e: 08c1 000f bset #15,%d1
59792: 2f01 movel %d1,%sp@-
59794: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
59798: 2f2e 000c movel %fp@(12),%sp@-
5979c: 2f03 movel %d3,%sp@-
5979e: 2f3c 5449 4d45 movel #1414090053,%sp@-
597a4: 4eb9 0005 8310 jsr 58310 <rtems_task_create>
/* user may want floating point but we need */
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
597aa: 4fef 0018 lea %sp@(24),%sp
597ae: 4a80 tstl %d0
597b0: 6714 beqs 597c6 <rtems_timer_initiate_server+0xce>
initialized = false;
}
#endif
return status;
}
597b2: 242e fff4 movel %fp@(-12),%d2
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
initialized = false;
597b6: 4201 clrb %d1
initialized = false;
}
#endif
return status;
}
597b8: 262e fff8 movel %fp@(-8),%d3
597bc: 4e5e unlk %fp
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
initialized = false;
597be: 13c1 0007 87ae moveb %d1,787ae <initialized.3554>
initialized = false;
}
#endif
return status;
}
597c4: 4e75 rts
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
&_RTEMS_tasks_Information,
_Objects_Get_index(id)
597c6: 202e fffc movel %fp@(-4),%d0
*/
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return NULL;
#endif
return information->local_table[ index ];
597ca: 4282 clrl %d2
/*
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
597cc: 2079 0007 d25c moveal 7d25c <_RTEMS_tasks_Information+0x18>,%a0
597d2: 3400 movew %d0,%d2
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
597d4: 2239 0007 d3f4 movel 7d3f4 <_Watchdog_Ticks_since_boot>,%d1
/*
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
597da: 41f0 2c00 lea %a0@(00000000,%d2:l:4),%a0
597de: 23d0 0007 8730 movel %a0@,78730 <_Timer_server_Default>
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
597e4: 41f9 0007 8764 lea 78764 <_Timer_server_Default+0x34>,%a0
_Timer_server = ts;
/*
* Start the timer server
*/
status = rtems_task_start(
597ea: 4879 0007 8730 pea 78730 <_Timer_server_Default>
597f0: 487a fb6e pea %pc@(59360 <_Timer_server_Body>)
597f4: 23c8 0007 8760 movel %a0,78760 <_Timer_server_Default+0x30>
the_chain->permanent_null = NULL;
the_chain->last = _Chain_Head(the_chain);
597fa: 41f9 0007 8760 lea 78760 <_Timer_server_Default+0x30>,%a0
59800: 23c8 0007 8768 movel %a0,78768 <_Timer_server_Default+0x38>
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
59806: 41f9 0007 879c lea 7879c <_Timer_server_Default+0x6c>,%a0
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
5980c: 23c1 0007 876c movel %d1,7876c <_Timer_server_Default+0x3c>
the_chain->permanent_null = NULL;
the_chain->last = _Chain_Head(the_chain);
59812: 223c 0007 8798 movel #493464,%d1
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
59818: 23c8 0007 8798 movel %a0,78798 <_Timer_server_Default+0x68>
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
5981e: 41f9 0007 d352 lea 7d352 <_TOD_Now>,%a0
the_chain->permanent_null = NULL;
the_chain->last = _Chain_Head(the_chain);
59824: 23c1 0007 87a0 movel %d1,787a0 <_Timer_server_Default+0x70>
5982a: 23d0 0007 87a4 movel %a0@,787a4 <_Timer_server_Default+0x74>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
59830: 223c 0005 c24c movel #377420,%d1
59836: 41f9 0005 c24c lea 5c24c <_Thread_Delay_ended>,%a0
5983c: 23c1 0007 8754 movel %d1,78754 <_Timer_server_Default+0x24>
ts->insert_chain = NULL;
ts->active = false;
59842: 4201 clrb %d1
ts->schedule_operation = _Timer_server_Schedule_operation_method;
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
ts->insert_chain = NULL;
59844: 42b9 0007 87a8 clrl 787a8 <_Timer_server_Default+0x78>
ts->active = false;
5984a: 13c1 0007 87ac moveb %d1,787ac <_Timer_server_Default+0x7c>
59850: 23c8 0007 878c movel %a0,7878c <_Timer_server_Default+0x5c>
/*
* The default timer server is now available.
*/
_Timer_server = ts;
59856: 41f9 0007 8730 lea 78730 <_Timer_server_Default>,%a0
/*
* Start the timer server
*/
status = rtems_task_start(
5985c: 2f00 movel %d0,%sp@-
/*
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
5985e: 223c 0005 959c movel #365980,%d1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
the_chain->first = _Chain_Tail(the_chain);
the_chain->permanent_null = NULL;
59864: 42b9 0007 8764 clrl 78764 <_Timer_server_Default+0x34>
5986a: 42b9 0007 879c clrl 7879c <_Timer_server_Default+0x6c>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
59870: 42b9 0007 8740 clrl 78740 <_Timer_server_Default+0x10>
59876: 23c1 0007 8734 movel %d1,78734 <_Timer_server_Default+0x4>
the_watchdog->routine = routine;
the_watchdog->id = id;
5987c: 23c0 0007 8758 movel %d0,78758 <_Timer_server_Default+0x28>
ts->active = false;
/*
* The default timer server is now available.
*/
_Timer_server = ts;
59882: 23c8 0007 d516 movel %a0,7d516 <_Timer_server>
the_watchdog->user_data = user_data;
59888: 42b9 0007 875c clrl 7875c <_Timer_server_Default+0x2c>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
5988e: 42b9 0007 8778 clrl 78778 <_Timer_server_Default+0x48>
the_watchdog->routine = routine;
the_watchdog->id = id;
59894: 23c0 0007 8790 movel %d0,78790 <_Timer_server_Default+0x60>
the_watchdog->user_data = user_data;
5989a: 42b9 0007 8794 clrl 78794 <_Timer_server_Default+0x64>
/*
* Start the timer server
*/
status = rtems_task_start(
598a0: 4eb9 0005 8a2c jsr 58a2c <rtems_task_start>
initialized = false;
}
#endif
return status;
}
598a6: 242e fff4 movel %fp@(-12),%d2
if (status) {
initialized = false;
}
#endif
return status;
598aa: 4fef 000c lea %sp@(12),%sp
}
598ae: 262e fff8 movel %fp@(-8),%d3
598b2: 4e5e unlk %fp
...
00058ffc <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
58ffc: 4e56 fff0 linkw %fp,#-16
59000: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
59004: 486e fffc pea %fp@(-4)
59008: 2f2e 0008 movel %fp@(8),%sp@-
5900c: 4879 0007 d4de pea 7d4de <_Timer_Information>
59012: 4eb9 0005 bb0c jsr 5bb0c <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
59018: 4fef 000c lea %sp@(12),%sp
5901c: 2440 moveal %d0,%a2
5901e: 4aae fffc tstl %fp@(-4)
59022: 670e beqs 59032 <rtems_timer_reset+0x36>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
59024: 7404 moveq #4,%d2
}
59026: 2002 movel %d2,%d0
59028: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
5902e: 4e5e unlk %fp
59030: 4e75 rts
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
59032: 202a 0038 movel %a2@(56),%d0
59036: 671a beqs 59052 <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 ) {
59038: 7201 moveq #1,%d1
5903a: b280 cmpl %d0,%d1
5903c: 673c beqs 5907a <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;
5903e: 740b moveq #11,%d2
}
_Thread_Enable_dispatch();
59040: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
59046: 2002 movel %d2,%d0
59048: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
5904e: 4e5e unlk %fp
59050: 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 );
59052: 45ea 0010 lea %a2@(16),%a2
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
59056: 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 );
59058: 2f0a movel %a2,%sp@-
5905a: 4eb9 0005 d98c jsr 5d98c <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
59060: 2f0a movel %a2,%sp@-
59062: 4879 0007 d38a pea 7d38a <_Watchdog_Ticks_chain>
59068: 4eb9 0005 d844 jsr 5d844 <_Watchdog_Insert>
5906e: 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();
59072: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
59078: 60cc bras 59046 <rtems_timer_reset+0x4a>
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
5907a: 486a 0010 pea %a2@(16)
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
5907e: 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;
59080: 2679 0007 d516 moveal 7d516 <_Timer_server>,%a3
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
59086: 4eb9 0005 d98c jsr 5d98c <_Watchdog_Remove>
(*timer_server->schedule_operation)( timer_server, the_timer );
5908c: 2f0a movel %a2,%sp@-
5908e: 2f0b movel %a3,%sp@-
59090: 206b 0004 moveal %a3@(4),%a0
59094: 4e90 jsr %a0@
59096: 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();
5909a: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
590a0: 60a4 bras 59046 <rtems_timer_reset+0x4a>
...
0005918c <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
5918c: 4e56 ffec linkw %fp,#-20
59190: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
59194: 242e 000c movel %fp@(12),%d2
59198: 262e 0010 movel %fp@(16),%d3
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
5919c: 2479 0007 d516 moveal 7d516 <_Timer_server>,%a2
if ( !timer_server )
591a2: 4a8a tstl %a2
591a4: 6700 00c8 beqw 5926e <rtems_timer_server_fire_when+0xe2>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
591a8: 4a39 0007 d2d8 tstb 7d2d8 <_TOD_Is_set>
591ae: 6700 00a6 beqw 59256 <rtems_timer_server_fire_when+0xca>
return RTEMS_NOT_DEFINED;
if ( !routine )
591b2: 4a83 tstl %d3
591b4: 6700 00ac beqw 59262 <rtems_timer_server_fire_when+0xd6>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
591b8: 2f02 movel %d2,%sp@-
591ba: 4eb9 0005 5eac jsr 55eac <_TOD_Validate>
591c0: 588f addql #4,%sp
591c2: 4a00 tstb %d0
591c4: 660c bnes 591d2 <rtems_timer_server_fire_when+0x46>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
591c6: 7014 moveq #20,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
591c8: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
591ce: 4e5e unlk %fp
591d0: 4e75 rts
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
591d2: 2f02 movel %d2,%sp@-
591d4: 4eb9 0005 5da4 jsr 55da4 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
591da: 588f addql #4,%sp
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
591dc: 2400 movel %d0,%d2
if ( seconds <= _TOD_Seconds_since_epoch() )
591de: b0b9 0007 d352 cmpl 7d352 <_TOD_Now>,%d0
591e4: 63e0 blss 591c6 <rtems_timer_server_fire_when+0x3a>
591e6: 486e fffc pea %fp@(-4)
591ea: 2f2e 0008 movel %fp@(8),%sp@-
591ee: 4879 0007 d4de pea 7d4de <_Timer_Information>
591f4: 4eb9 0005 bb0c jsr 5bb0c <_Objects_Get>
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
591fa: 4fef 000c lea %sp@(12),%sp
591fe: 2640 moveal %d0,%a3
59200: 4aae fffc tstl %fp@(-4)
59204: 6674 bnes 5927a <rtems_timer_server_fire_when+0xee>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
59206: 486b 0010 pea %a3@(16)
5920a: 4eb9 0005 d98c jsr 5d98c <_Watchdog_Remove>
the_watchdog->user_data = user_data;
59210: 276e 0014 0034 movel %fp@(20),%a3@(52)
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
59216: 7003 moveq #3,%d0
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
59218: 94b9 0007 d352 subl 7d352 <_TOD_Now>,%d2
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
5921e: 2740 0038 movel %d0,%a3@(56)
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
the_watchdog->id = id;
59222: 202e 0008 movel %fp@(8),%d0
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
59226: 2742 001c movel %d2,%a3@(28)
5922a: 2740 0030 movel %d0,%a3@(48)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
5922e: 42ab 0018 clrl %a3@(24)
the_watchdog->routine = routine;
59232: 2743 002c movel %d3,%a3@(44)
(*timer_server->schedule_operation)( timer_server, the_timer );
59236: 2f0b movel %a3,%sp@-
59238: 2f0a movel %a2,%sp@-
5923a: 206a 0004 moveal %a2@(4),%a0
5923e: 4e90 jsr %a0@
_Thread_Enable_dispatch();
59240: 4eb9 0005 c3f2 jsr 5c3f2 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
59246: 4fef 000c lea %sp@(12),%sp
5924a: 4280 clrl %d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
5924c: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
59252: 4e5e unlk %fp
59254: 4e75 rts
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
59256: 700b moveq #11,%d0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
59258: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3 <== NOT EXECUTED
5925e: 4e5e unlk %fp <== NOT EXECUTED
59260: 4e75 rts <== NOT EXECUTED
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
59262: 7009 moveq #9,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
59264: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
5926a: 4e5e unlk %fp
5926c: 4e75 rts
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
5926e: 700e moveq #14,%d0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
59270: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
59276: 4e5e unlk %fp
59278: 4e75 rts
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
5927a: 7004 moveq #4,%d0
}
5927c: 4cee 0c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a3
59282: 4e5e unlk %fp
...