RTEMS 4.11Annotated Report
Mon Sep 12 16:48:29 2011
0004af78 <TOD_MICROSECONDS_TO_TICKS>:
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
microseconds_per_tick = rtems_configuration_get_microseconds_per_tick();
ticks = microseconds / microseconds_per_tick;
4af78: 41f9 0006 1df8 lea 61df8 <Configuration+0xc>,%a0
#include <rtems/score/tod.h>
uint32_t TOD_MICROSECONDS_TO_TICKS(
uint32_t microseconds
)
{
4af7e: 4e56 0000 linkw %fp,#0
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
microseconds_per_tick = rtems_configuration_get_microseconds_per_tick();
ticks = microseconds / microseconds_per_tick;
4af82: 202e 0008 movel %fp@(8),%d0
4af86: 4c50 0001 remul %a0@,%d1,%d0
4af8a: 4c50 0000 remul %a0@,%d0,%d0
if ( (microseconds % microseconds_per_tick) != 0 )
4af8e: 4a81 tstl %d1
4af90: 6702 beqs 4af94 <TOD_MICROSECONDS_TO_TICKS+0x1c> <== ALWAYS TAKEN
ticks += 1;
4af92: 5280 addql #1,%d0 <== NOT EXECUTED
return ticks;
}
4af94: 4e5e unlk %fp <== NOT EXECUTED
00046e08 <TOD_MILLISECONDS_TO_TICKS>:
#include <rtems/score/tod.h>
uint32_t TOD_MILLISECONDS_TO_TICKS(
uint32_t milliseconds
)
{
46e08: 4e56 0000 linkw %fp,#0
/**
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
milliseconds_per_tick = rtems_configuration_get_milliseconds_per_tick();
46e0c: 2039 0005 e0d8 movel 5e0d8 <Configuration+0xc>,%d0
#include <rtems/score/tod.h>
uint32_t TOD_MILLISECONDS_TO_TICKS(
uint32_t milliseconds
)
{
46e12: 2f02 movel %d2,%sp@-
/**
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
milliseconds_per_tick = rtems_configuration_get_milliseconds_per_tick();
46e14: 243c 0000 03e8 movel #1000,%d2
46e1a: 4c42 0000 remul %d2,%d0,%d0
ticks = milliseconds / milliseconds_per_tick;
46e1e: 242e 0008 movel %fp@(8),%d2
46e22: 4c40 2001 remul %d0,%d1,%d2
46e26: 4c40 2002 remul %d0,%d2,%d2
46e2a: 2002 movel %d2,%d0
if ( (milliseconds % milliseconds_per_tick) != 0 )
46e2c: 4a81 tstl %d1
46e2e: 6702 beqs 46e32 <TOD_MILLISECONDS_TO_TICKS+0x2a> <== ALWAYS TAKEN
ticks += 1;
46e30: 5280 addql #1,%d0 <== NOT EXECUTED
return ticks;
}
46e32: 241f movel %sp@+,%d2
46e34: 4e5e unlk %fp <== NOT EXECUTED
000484ac <_CORE_RWLock_Release>:
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
484ac: 223c 0000 0700 movel #1792,%d1
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
484b2: 4e56 fff0 linkw %fp,#-16
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
484b6: 2079 0006 19ce moveal 619ce <_Per_CPU_Information+0xc>,%a0
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
484bc: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
484c0: 246e 0008 moveal %fp@(8),%a2
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
484c4: 40c0 movew %sr,%d0
484c6: 8280 orl %d0,%d1
484c8: 46c1 movew %d1,%sr
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
484ca: 222a 0044 movel %a2@(68),%d1
484ce: 660a bnes 484da <_CORE_RWLock_Release+0x2e>
_ISR_Enable( level );
484d0: 46c0 movew %d0,%sr
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
484d2: 7002 moveq #2,%d0
484d4: 2140 0034 movel %d0,%a0@(52)
return CORE_RWLOCK_SUCCESSFUL;
484d8: 6078 bras 48552 <_CORE_RWLock_Release+0xa6>
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
484da: 7401 moveq #1,%d2
484dc: b481 cmpl %d1,%d2
484de: 6610 bnes 484f0 <_CORE_RWLock_Release+0x44>
the_rwlock->number_of_readers -= 1;
484e0: 222a 0048 movel %a2@(72),%d1
484e4: 5381 subql #1,%d1
484e6: 2541 0048 movel %d1,%a2@(72)
if ( the_rwlock->number_of_readers != 0 ) {
484ea: 6704 beqs 484f0 <_CORE_RWLock_Release+0x44>
/* must be unlocked again */
_ISR_Enable( level );
484ec: 46c0 movew %d0,%sr
return CORE_RWLOCK_SUCCESSFUL;
484ee: 6062 bras 48552 <_CORE_RWLock_Release+0xa6>
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
484f0: 42a8 0034 clrl %a0@(52)
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
484f4: 42aa 0044 clrl %a2@(68)
_ISR_Enable( level );
484f8: 46c0 movew %d0,%sr
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
484fa: 2f0a movel %a2,%sp@-
484fc: 4eb9 0004 9ec4 jsr 49ec4 <_Thread_queue_Dequeue>
if ( next ) {
48502: 588f addql #4,%sp
48504: 4a80 tstl %d0
48506: 674a beqs 48552 <_CORE_RWLock_Release+0xa6>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
48508: 7201 moveq #1,%d1
4850a: 2040 moveal %d0,%a0
4850c: b2a8 0030 cmpl %a0@(48),%d1
48510: 6608 bnes 4851a <_CORE_RWLock_Release+0x6e>
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
48512: 7002 moveq #2,%d0
48514: 2540 0044 movel %d0,%a2@(68)
return CORE_RWLOCK_SUCCESSFUL;
48518: 6038 bras 48552 <_CORE_RWLock_Release+0xa6>
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
4851a: 7201 moveq #1,%d1
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
4851c: 52aa 0048 addql #1,%a2@(72)
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
48520: 49f9 0004 a2f8 lea 4a2f8 <_Thread_queue_First>,%a4
if ( !next ||
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
48526: 47f9 0004 a1d0 lea 4a1d0 <_Thread_queue_Extract>,%a3
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
4852c: 2541 0044 movel %d1,%a2@(68)
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
48530: 2f0a movel %a2,%sp@-
48532: 4e94 jsr %a4@
if ( !next ||
48534: 588f addql #4,%sp
48536: 4a80 tstl %d0
48538: 6718 beqs 48552 <_CORE_RWLock_Release+0xa6>
4853a: 7401 moveq #1,%d2
4853c: 2040 moveal %d0,%a0
4853e: b4a8 0030 cmpl %a0@(48),%d2
48542: 670e beqs 48552 <_CORE_RWLock_Release+0xa6> <== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
48544: 52aa 0048 addql #1,%a2@(72)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
48548: 2f00 movel %d0,%sp@-
4854a: 2f0a movel %a2,%sp@-
4854c: 4e93 jsr %a3@
}
4854e: 508f addql #8,%sp
48550: 60de bras 48530 <_CORE_RWLock_Release+0x84>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
48552: 4280 clrl %d0
48554: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
4855a: 4e5e unlk %fp
...
00048560 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
48560: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
48564: 486e fffc pea %fp@(-4)
48568: 2f2e 0008 movel %fp@(8),%sp@-
4856c: 4eb9 0004 9bf0 jsr 49bf0 <_Thread_Get>
switch ( location ) {
48572: 508f addql #8,%sp
48574: 4aae fffc tstl %fp@(-4)
48578: 661e bnes 48598 <_CORE_RWLock_Timeout+0x38> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
4857a: 2f00 movel %d0,%sp@-
4857c: 4eb9 0004 a3e4 jsr 4a3e4 <_Thread_queue_Process_timeout>
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
return _Thread_Dispatch_disable_level;
48582: 588f addql #4,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
48584: 2039 0006 156c movel 6156c <_Thread_Dispatch_disable_level>,%d0
4858a: 5380 subql #1,%d0
4858c: 23c0 0006 156c movel %d0,6156c <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
48592: 2039 0006 156c movel 6156c <_Thread_Dispatch_disable_level>,%d0
_Thread_Unnest_dispatch();
break;
}
}
48598: 4e5e unlk %fp <== NOT EXECUTED
00047244 <_CORE_barrier_Wait>:
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
47244: 203c 0000 0700 movel #1792,%d0
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4724a: 4e56 fff4 linkw %fp,#-12
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
4724e: 2279 0006 03ae moveal 603ae <_Per_CPU_Information+0xc>,%a1
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
47254: 48d7 001c moveml %d2-%d4,%sp@
47258: 206e 0008 moveal %fp@(8),%a0
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
4725c: 42a9 0034 clrl %a1@(52)
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
47260: 242e 000c movel %fp@(12),%d2
47264: 262e 0014 movel %fp@(20),%d3
47268: 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 );
4726c: 40c1 movew %sr,%d1
4726e: 8081 orl %d1,%d0
47270: 46c0 movew %d0,%sr
the_barrier->number_of_waiting_threads++;
47272: 2028 0048 movel %a0@(72),%d0
47276: 5280 addql #1,%d0
47278: 2140 0048 movel %d0,%a0@(72)
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
4727c: 4aa8 0040 tstl %a0@(64)
47280: 6626 bnes 472a8 <_CORE_barrier_Wait+0x64>
if ( the_barrier->number_of_waiting_threads ==
47282: b0a8 0044 cmpl %a0@(68),%d0
47286: 6620 bnes 472a8 <_CORE_barrier_Wait+0x64>
the_barrier->Attributes.maximum_count) {
executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED;
47288: 7001 moveq #1,%d0
4728a: 2340 0034 movel %d0,%a1@(52)
_ISR_Enable( level );
4728e: 46c1 movew %d1,%sr
_CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
47290: 2d44 0010 movel %d4,%fp@(16)
47294: 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 );
}
47298: 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 );
4729c: 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 );
}
472a0: 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 );
472a2: 4ef9 0004 bd0c jmp 4bd0c <_CORE_barrier_Release>
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;
472a8: 7001 moveq #1,%d0
472aa: 2140 0030 movel %d0,%a0@(48)
return;
}
}
_Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
executing->Wait.queue = &the_barrier->Wait_queue;
472ae: 2348 0044 movel %a0,%a1@(68)
executing->Wait.id = id;
472b2: 2342 0020 movel %d2,%a1@(32)
_ISR_Enable( level );
472b6: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
472b8: 2d43 000c movel %d3,%fp@(12)
472bc: 203c 0004 92cc movel #299724,%d0
472c2: 2d48 0008 movel %a0,%fp@(8)
}
472c6: 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 );
472ca: 2d40 0010 movel %d0,%fp@(16)
}
472ce: 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 );
472d0: 4ef9 0004 8fd4 jmp 48fd4 <_Thread_queue_Enqueue_with_handler>
...
0004675c <_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
)
{
4675c: 4e56 0000 linkw %fp,#0
46760: 2f0a movel %a2,%sp@-
46762: 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)) ) {
46766: 2f0a movel %a2,%sp@-
46768: 4eb9 0004 807c jsr 4807c <_Thread_queue_Dequeue>
4676e: 588f addql #4,%sp
46770: 4a80 tstl %d0
46772: 6624 bnes 46798 <_CORE_semaphore_Surrender+0x3c>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
46774: 303c 0700 movew #1792,%d0
46778: 40c1 movew %sr,%d1
4677a: 8081 orl %d1,%d0
4677c: 46c0 movew %d0,%sr
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
4677e: 202a 0048 movel %a2@(72),%d0
46782: b0aa 0040 cmpl %a2@(64),%d0
46786: 640a bccs 46792 <_CORE_semaphore_Surrender+0x36> <== NEVER TAKEN
the_semaphore->count += 1;
46788: 5280 addql #1,%d0
4678a: 2540 0048 movel %d0,%a2@(72)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
4678e: 4280 clrl %d0
46790: 6002 bras 46794 <_CORE_semaphore_Surrender+0x38>
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
46792: 7004 moveq #4,%d0 <== NOT EXECUTED
_ISR_Enable( level );
46794: 46c1 movew %d1,%sr
46796: 6002 bras 4679a <_CORE_semaphore_Surrender+0x3e>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
46798: 4280 clrl %d0
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
4679a: 246e fffc moveal %fp@(-4),%a2
4679e: 4e5e unlk %fp
...
000455d8 <_Event_Surrender>:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
455d8: 203c 0000 0700 movel #1792,%d0
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
455de: 4e56 ffec linkw %fp,#-20
455e2: 48d7 043c moveml %d2-%d5/%a2,%sp@
455e6: 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 ];
455ea: 206a 00fe moveal %a2@(254),%a0
option_set = (rtems_option) the_thread->Wait.option;
455ee: 282a 0030 movel %a2@(48),%d4
_ISR_Disable( level );
455f2: 40c1 movew %sr,%d1
455f4: 8081 orl %d1,%d0
455f6: 46c0 movew %d0,%sr
pending_events = api->pending_events;
event_condition = (rtems_event_set) the_thread->Wait.count;
455f8: 262a 0024 movel %a2@(36),%d3
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
rtems_event_set the_event_set,
rtems_event_set the_event_condition
)
{
return ( the_event_set & the_event_condition );
455fc: 2003 movel %d3,%d0
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
pending_events = api->pending_events;
455fe: 2410 movel %a0@,%d2
45600: 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 ) ) {
45602: 6700 00ca beqw 456ce <_Event_Surrender+0xf6>
/*
* 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() &&
45606: 4ab9 0005 eff6 tstl 5eff6 <_Per_CPU_Information+0x8>
4560c: 674a beqs 45658 <_Event_Surrender+0x80>
4560e: b5f9 0005 effa cmpal 5effa <_Per_CPU_Information+0xc>,%a2
45614: 6642 bnes 45658 <_Event_Surrender+0x80>
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
45616: 2279 0005 f3d4 moveal 5f3d4 <_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 ) &&
4561c: 7a02 moveq #2,%d5
4561e: ba89 cmpl %a1,%d5
45620: 670e beqs 45630 <_Event_Surrender+0x58> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
45622: 2279 0005 f3d4 moveal 5f3d4 <_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) ||
45628: 1a3c 0001 moveb #1,%d5
4562c: ba89 cmpl %a1,%d5
4562e: 6628 bnes 45658 <_Event_Surrender+0x80>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
45630: b680 cmpl %d0,%d3
45632: 6708 beqs 4563c <_Event_Surrender+0x64>
45634: 0804 0001 btst #1,%d4
45638: 6700 0094 beqw 456ce <_Event_Surrender+0xf6>
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) );
4563c: 2600 movel %d0,%d3
4563e: 4683 notl %d3
45640: c682 andl %d2,%d3
45642: 2083 movel %d3,%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;
45644: 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;
45648: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
4564c: 2080 movel %d0,%a0@
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
4564e: 7003 moveq #3,%d0
45650: 23c0 0005 f3d4 movel %d0,5f3d4 <_Event_Sync_state>
45656: 6076 bras 456ce <_Event_Surrender+0xf6>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
45658: 2a2a 0010 movel %a2@(16),%d5
4565c: 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 ) ) {
45662: 676a beqs 456ce <_Event_Surrender+0xf6>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
45664: b680 cmpl %d0,%d3
45666: 6706 beqs 4566e <_Event_Surrender+0x96>
45668: 0804 0001 btst #1,%d4
4566c: 6760 beqs 456ce <_Event_Surrender+0xf6> <== NEVER TAKEN
4566e: 2600 movel %d0,%d3
45670: 4683 notl %d3
45672: c682 andl %d2,%d3
45674: 2083 movel %d3,%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;
45676: 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;
4567a: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
4567e: 2080 movel %d0,%a0@
_ISR_Flash( level );
45680: 203c 0000 0700 movel #1792,%d0
45686: 46c1 movew %d1,%sr
45688: 8081 orl %d1,%d0
4568a: 46c0 movew %d0,%sr
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4568c: 7a02 moveq #2,%d5
4568e: baaa 0050 cmpl %a2@(80),%d5
45692: 6714 beqs 456a8 <_Event_Surrender+0xd0>
_ISR_Enable( level );
45694: 46c1 movew %d1,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
45696: 2f3c 1003 fff8 movel #268697592,%sp@-
4569c: 2f0a movel %a2,%sp@-
4569e: 4eb9 0004 7a0c jsr 47a0c <_Thread_Clear_state>
456a4: 508f addql #8,%sp
456a6: 6028 bras 456d0 <_Event_Surrender+0xf8>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
456a8: 7003 moveq #3,%d0
456aa: 2540 0050 movel %d0,%a2@(80)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
456ae: 46c1 movew %d1,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
456b0: 486a 0048 pea %a2@(72)
456b4: 4eb9 0004 8ab8 jsr 48ab8 <_Watchdog_Remove>
456ba: 2f3c 1003 fff8 movel #268697592,%sp@-
456c0: 2f0a movel %a2,%sp@-
456c2: 4eb9 0004 7a0c jsr 47a0c <_Thread_Clear_state>
456c8: 4fef 000c lea %sp@(12),%sp
456cc: 6002 bras 456d0 <_Event_Surrender+0xf8>
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
456ce: 46c1 movew %d1,%sr
}
456d0: 4cee 043c ffec moveml %fp@(-20),%d2-%d5/%a2
456d6: 4e5e unlk %fp
...
000456dc <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
456dc: 4e56 fffc linkw %fp,#-4
456e0: 2f03 movel %d3,%sp@-
456e2: 2f02 movel %d2,%sp@-
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
456e4: 486e fffc pea %fp@(-4)
456e8: 2f2e 0008 movel %fp@(8),%sp@-
456ec: 4eb9 0004 7da8 jsr 47da8 <_Thread_Get>
switch ( location ) {
456f2: 508f addql #8,%sp
456f4: 4aae fffc tstl %fp@(-4)
456f8: 665c bnes 45756 <_Event_Timeout+0x7a> <== 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 );
456fa: 223c 0000 0700 movel #1792,%d1
45700: 40c2 movew %sr,%d2
45702: 8282 orl %d2,%d1
45704: 46c1 movew %d1,%sr
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
45706: 2040 moveal %d0,%a0
45708: 42a8 0024 clrl %a0@(36)
if ( _Thread_Is_executing( the_thread ) ) {
4570c: b0b9 0005 effa cmpl 5effa <_Per_CPU_Information+0xc>,%d0
45712: 6614 bnes 45728 <_Event_Timeout+0x4c>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
45714: 2239 0005 f3d4 movel 5f3d4 <_Event_Sync_state>,%d1
4571a: 7601 moveq #1,%d3
4571c: b681 cmpl %d1,%d3
4571e: 6608 bnes 45728 <_Event_Timeout+0x4c>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
45720: 7202 moveq #2,%d1
45722: 23c1 0005 f3d4 movel %d1,5f3d4 <_Event_Sync_state>
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
45728: 7606 moveq #6,%d3
4572a: 2040 moveal %d0,%a0
4572c: 2143 0034 movel %d3,%a0@(52)
_ISR_Enable( level );
45730: 46c2 movew %d2,%sr
45732: 2f3c 1003 fff8 movel #268697592,%sp@-
45738: 2f00 movel %d0,%sp@-
4573a: 4eb9 0004 7a0c jsr 47a0c <_Thread_Clear_state>
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
return _Thread_Dispatch_disable_level;
45740: 508f addql #8,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
45742: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
45748: 5380 subql #1,%d0
4574a: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
45750: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
45756: 242e fff4 movel %fp@(-12),%d2
4575a: 262e fff8 movel %fp@(-8),%d3
4575e: 4e5e unlk %fp
...
0004b168 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
4b168: 4e56 ffcc linkw %fp,#-52
4b16c: 202e 0010 movel %fp@(16),%d0
4b170: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4b174: 246e 0008 moveal %fp@(8),%a2
4b178: 262e 000c movel %fp@(12),%d3
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;
4b17c: 2403 movel %d3,%d2
4b17e: d480 addl %d0,%d2
uintptr_t const free_size = stats->free_size;
4b180: 206a 0030 moveal %a2@(48),%a0
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
4b184: 282a 0020 movel %a2@(32),%d4
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;
4b188: 2a2a 0010 movel %a2@(16),%d5
uintptr_t const min_block_size = heap->min_block_size;
4b18c: 222a 0014 movel %a2@(20),%d1
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;
4b190: 42ae fff8 clrl %fp@(-8)
Heap_Block *extend_last_block = NULL;
4b194: 42ae fffc clrl %fp@(-4)
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;
uintptr_t const free_size = stats->free_size;
4b198: 2d48 fff4 movel %a0,%fp@(-12)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
4b19c: b682 cmpl %d2,%d3
4b19e: 6200 01a6 bhiw 4b346 <_Heap_Extend+0x1de>
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
4b1a2: 486e fffc pea %fp@(-4)
4b1a6: 486e fff8 pea %fp@(-8)
4b1aa: 2f01 movel %d1,%sp@-
4b1ac: 2f05 movel %d5,%sp@-
4b1ae: 2f00 movel %d0,%sp@-
4b1b0: 2f03 movel %d3,%sp@-
4b1b2: 4eb9 0004 69e6 jsr 469e6 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
4b1b8: 4fef 0018 lea %sp@(24),%sp
4b1bc: 4a00 tstb %d0
4b1be: 6700 0186 beqw 4b346 <_Heap_Extend+0x1de>
4b1c2: 2044 moveal %d4,%a0
4b1c4: 9bcd subal %a5,%a5
4b1c6: 4281 clrl %d1
4b1c8: 97cb subal %a3,%a3
4b1ca: 99cc subal %a4,%a4
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
4b1cc: b888 cmpl %a0,%d4
4b1ce: 6704 beqs 4b1d4 <_Heap_Extend+0x6c>
4b1d0: 2248 moveal %a0,%a1
4b1d2: 6004 bras 4b1d8 <_Heap_Extend+0x70>
4b1d4: 226a 0018 moveal %a2@(24),%a1
uintptr_t const sub_area_end = start_block->prev_size;
4b1d8: 2010 movel %a0@,%d0
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
4b1da: b680 cmpl %d0,%d3
4b1dc: 6406 bccs 4b1e4 <_Heap_Extend+0x7c>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
4b1de: b3c2 cmpal %d2,%a1
4b1e0: 6500 0164 bcsw 4b346 <_Heap_Extend+0x1de>
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
4b1e4: b3c2 cmpal %d2,%a1
4b1e6: 6706 beqs 4b1ee <_Heap_Extend+0x86>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
4b1e8: b082 cmpl %d2,%d0
4b1ea: 6206 bhis 4b1f2 <_Heap_Extend+0x8a>
4b1ec: 6006 bras 4b1f4 <_Heap_Extend+0x8c>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
4b1ee: 2848 moveal %a0,%a4
4b1f0: 6002 bras 4b1f4 <_Heap_Extend+0x8c>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
4b1f2: 2208 movel %a0,%d1
4b1f4: 2e00 movel %d0,%d7
4b1f6: 2240 moveal %d0,%a1
4b1f8: 5189 subql #8,%a1
4b1fa: 4c45 7006 remul %d5,%d6,%d7
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4b1fe: 93c6 subal %d6,%a1
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
4b200: b680 cmpl %d0,%d3
4b202: 6606 bnes 4b20a <_Heap_Extend+0xa2>
start_block->prev_size = extend_area_end;
4b204: 2082 movel %d2,%a0@
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 )
4b206: 2649 moveal %a1,%a3
4b208: 6006 bras 4b210 <_Heap_Extend+0xa8>
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
4b20a: b680 cmpl %d0,%d3
4b20c: 6302 blss 4b210 <_Heap_Extend+0xa8>
4b20e: 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;
4b210: 70fe moveq #-2,%d0
4b212: 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);
4b216: 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 );
4b21a: b888 cmpl %a0,%d4
4b21c: 66ae bnes 4b1cc <_Heap_Extend+0x64>
if ( extend_area_begin < heap->area_begin ) {
4b21e: b6aa 0018 cmpl %a2@(24),%d3
4b222: 6406 bccs 4b22a <_Heap_Extend+0xc2>
heap->area_begin = extend_area_begin;
4b224: 2543 0018 movel %d3,%a2@(24)
4b228: 600a bras 4b234 <_Heap_Extend+0xcc>
} else if ( heap->area_end < extend_area_end ) {
4b22a: b4aa 001c cmpl %a2@(28),%d2
4b22e: 6304 blss 4b234 <_Heap_Extend+0xcc>
heap->area_end = extend_area_end;
4b230: 2542 001c movel %d2,%a2@(28)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
4b234: 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 =
4b238: 2008 movel %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;
4b23a: 7801 moveq #1,%d4
} 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;
4b23c: 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 =
4b240: 9089 subl %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;
4b242: 8880 orl %d0,%d4
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
4b244: 2282 movel %d2,%a1@
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4b246: 2344 0004 movel %d4,%a1@(4)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
4b24a: 2080 movel %d0,%a0@
extend_last_block->size_and_flag = 0;
4b24c: 42a8 0004 clrl %a0@(4)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
4b250: b3ea 0020 cmpal %a2@(32),%a1
4b254: 6406 bccs 4b25c <_Heap_Extend+0xf4>
heap->first_block = extend_first_block;
4b256: 2549 0020 movel %a1,%a2@(32)
4b25a: 600a bras 4b266 <_Heap_Extend+0xfe>
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
4b25c: b1ea 0024 cmpal %a2@(36),%a0
4b260: 6304 blss 4b266 <_Heap_Extend+0xfe>
heap->last_block = extend_last_block;
4b262: 2548 0024 movel %a0,%a2@(36)
}
if ( merge_below_block != NULL ) {
4b266: 4a8c tstl %a4
4b268: 6732 beqs 4b29c <_Heap_Extend+0x134>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
4b26a: 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 );
4b26e: 5083 addql #8,%d3
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
4b270: 2803 movel %d3,%d4
4b272: 4c40 4001 remul %d0,%d1,%d4
if ( remainder != 0 ) {
4b276: 4a81 tstl %d1
4b278: 6704 beqs 4b27e <_Heap_Extend+0x116>
return value - remainder + alignment;
4b27a: d680 addl %d0,%d3
4b27c: 9681 subl %d1,%d3
uintptr_t const new_first_block_begin =
4b27e: 2043 moveal %d3,%a0
4b280: 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 =
4b282: 200c movel %a4,%d0
4b284: 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;
4b286: 7201 moveq #1,%d1
4b288: 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;
4b28a: 2094 movel %a4@,%a0@
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
4b28c: 2141 0004 movel %d1,%a0@(4)
_Heap_Free_block( heap, new_first_block );
4b290: 2f08 movel %a0,%sp@-
4b292: 2f0a movel %a2,%sp@-
4b294: 4eba feb6 jsr %pc@(4b14c <_Heap_Free_block>)
4b298: 508f addql #8,%sp
4b29a: 600e bras 4b2aa <_Heap_Extend+0x142>
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 ) {
4b29c: 4a81 tstl %d1
4b29e: 670a beqs 4b2aa <_Heap_Extend+0x142>
{
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;
4b2a0: 9288 subl %a0,%d1
4b2a2: 7801 moveq #1,%d4
4b2a4: 8881 orl %d1,%d4
4b2a6: 2144 0004 movel %d4,%a0@(4)
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
4b2aa: 4a8b tstl %a3
4b2ac: 6734 beqs 4b2e2 <_Heap_Extend+0x17a>
)
{
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,
4b2ae: 5182 subql #8,%d2
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(
4b2b0: 948b subl %a3,%d2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4b2b2: 2202 movel %d2,%d1
4b2b4: 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;
4b2ba: 7201 moveq #1,%d1
4b2bc: 9480 subl %d0,%d2
);
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)
4b2be: 202b 0004 movel %a3@(4),%d0
4b2c2: 9082 subl %d2,%d0
| HEAP_PREV_BLOCK_USED;
4b2c4: 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;
4b2c6: 7001 moveq #1,%d0
4b2c8: 2781 2804 movel %d1,%a3@(00000004,%d2:l)
4b2cc: c0ab 0004 andl %a3@(4),%d0
block->size_and_flag = size | flag;
4b2d0: 8480 orl %d0,%d2
4b2d2: 2742 0004 movel %d2,%a3@(4)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
4b2d6: 2f0b movel %a3,%sp@-
4b2d8: 2f0a movel %a2,%sp@-
4b2da: 4eba fe70 jsr %pc@(4b14c <_Heap_Free_block>)
4b2de: 508f addql #8,%sp
4b2e0: 6020 bras 4b302 <_Heap_Extend+0x19a>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
4b2e2: 4a8d tstl %a5
4b2e4: 671c beqs 4b302 <_Heap_Extend+0x19a>
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;
4b2e6: 7201 moveq #1,%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;
4b2e8: 7801 moveq #1,%d4
)
{
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 );
4b2ea: 202e fff8 movel %fp@(-8),%d0
4b2ee: 908d subl %a5,%d0
4b2f0: c2ad 0004 andl %a5@(4),%d1
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
4b2f4: 206e fffc moveal %fp@(-4),%a0
block->size_and_flag = size | flag;
4b2f8: 8280 orl %d0,%d1
4b2fa: 2b41 0004 movel %d1,%a5@(4)
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;
4b2fe: 89a8 0004 orl %d4,%a0@(4)
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
4b302: 4a8c tstl %a4
4b304: 6610 bnes 4b316 <_Heap_Extend+0x1ae>
4b306: 4a8b tstl %a3
4b308: 660c bnes 4b316 <_Heap_Extend+0x1ae>
_Heap_Free_block( heap, extend_first_block );
4b30a: 2f2e fff8 movel %fp@(-8),%sp@-
4b30e: 2f0a movel %a2,%sp@-
4b310: 4eba fe3a jsr %pc@(4b14c <_Heap_Free_block>)
4b314: 508f addql #8,%sp
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
heap->last_block,
(uintptr_t) heap->first_block - (uintptr_t) heap->last_block
4b316: 206a 0024 moveal %a2@(36),%a0
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;
4b31a: 7201 moveq #1,%d1
* 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(
4b31c: 202a 0020 movel %a2@(32),%d0
4b320: 9088 subl %a0,%d0
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;
4b322: c2a8 0004 andl %a0@(4),%d1
block->size_and_flag = size | flag;
4b326: 8280 orl %d0,%d1
4b328: 2141 0004 movel %d1,%a0@(4)
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
4b32c: 202a 0030 movel %a2@(48),%d0
4b330: 90ae fff4 subl %fp@(-12),%d0
/* Statistics */
stats->size += extended_size;
4b334: d1aa 002c addl %d0,%a2@(44)
if ( extended_size_ptr != NULL )
4b338: 4aae 0014 tstl %fp@(20)
4b33c: 670c beqs 4b34a <_Heap_Extend+0x1e2> <== NEVER TAKEN
*extended_size_ptr = extended_size;
4b33e: 206e 0014 moveal %fp@(20),%a0
4b342: 2080 movel %d0,%a0@
4b344: 6004 bras 4b34a <_Heap_Extend+0x1e2>
_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;
4b346: 4200 clrb %d0
4b348: 6002 bras 4b34c <_Heap_Extend+0x1e4>
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
4b34a: 7001 moveq #1,%d0
}
4b34c: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
4b352: 4e5e unlk %fp
...
0004b118 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
4b118: 4e56 ffe8 linkw %fp,#-24
4b11c: 206e 0008 moveal %fp@(8),%a0
4b120: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
4b124: 202e 000c movel %fp@(12),%d0
/*
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
4b128: 6700 014e beqw 4b278 <_Heap_Free+0x160>
4b12c: 2240 moveal %d0,%a1
4b12e: 5189 subql #8,%a1
4b130: 4c68 0001 0010 remul %a0@(16),%d1,%d0
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
4b136: 2828 0020 movel %a0@(32),%d4
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
4b13a: 93c1 subal %d1,%a1
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
4b13c: b889 cmpl %a1,%d4
4b13e: 620c bhis 4b14c <_Heap_Free+0x34>
4b140: b3e8 0024 cmpal %a0@(36),%a1
4b144: 53c0 sls %d0
4b146: 49c0 extbl %d0
4b148: 4480 negl %d0
4b14a: 6002 bras 4b14e <_Heap_Free+0x36>
4b14c: 4280 clrl %d0
}
alloc_begin = (uintptr_t) alloc_begin_ptr;
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
4b14e: 4a00 tstb %d0
4b150: 6700 012a beqw 4b27c <_Heap_Free+0x164>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4b154: 2629 0004 movel %a1@(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;
4b158: 70fe moveq #-2,%d0
4b15a: c083 andl %d3,%d0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4b15c: 45f1 0800 lea %a1@(00000000,%d0: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;
4b160: b88a cmpl %a2,%d4
4b162: 620c bhis 4b170 <_Heap_Free+0x58> <== NEVER TAKEN
4b164: b5e8 0024 cmpal %a0@(36),%a2
4b168: 53c1 sls %d1
4b16a: 49c1 extbl %d1
4b16c: 4481 negl %d1
4b16e: 6002 bras 4b172 <_Heap_Free+0x5a>
4b170: 4281 clrl %d1 <== NOT EXECUTED
_Heap_Protection_block_check( heap, block );
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
4b172: 4a01 tstb %d1
4b174: 6700 0106 beqw 4b27c <_Heap_Free+0x164>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4b178: 242a 0004 movel %a2@(4),%d2
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
4b17c: 0802 0000 btst #0,%d2
4b180: 6700 00fa beqw 4b27c <_Heap_Free+0x164>
- 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;
4b184: 72fe moveq #-2,%d1
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
4b186: 2668 0024 moveal %a0@(36),%a3
4b18a: c481 andl %d1,%d2
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
4b18c: b7ca cmpal %a2,%a3
4b18e: 670c beqs 4b19c <_Heap_Free+0x84>
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;
4b190: 7201 moveq #1,%d1
4b192: c2b2 2804 andl %a2@(00000004,%d2:l),%d1
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
4b196: 5381 subql #1,%d1
4b198: 4481 negl %d1
4b19a: 6002 bras 4b19e <_Heap_Free+0x86>
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
4b19c: 4281 clrl %d1
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
4b19e: 1a01 moveb %d1,%d5
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
4b1a0: 0803 0000 btst #0,%d3
4b1a4: 6660 bnes 4b206 <_Heap_Free+0xee>
uintptr_t const prev_size = block->prev_size;
4b1a6: 2611 movel %a1@,%d3
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
4b1a8: 93c3 subal %d3,%a1
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
4b1aa: b889 cmpl %a1,%d4
4b1ac: 620a bhis 4b1b8 <_Heap_Free+0xa0> <== NEVER TAKEN
4b1ae: b3cb cmpal %a3,%a1
4b1b0: 53c1 sls %d1
4b1b2: 49c1 extbl %d1
4b1b4: 4481 negl %d1
4b1b6: 6002 bras 4b1ba <_Heap_Free+0xa2>
4b1b8: 4281 clrl %d1 <== NOT EXECUTED
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
4b1ba: 4a01 tstb %d1
4b1bc: 6700 00be beqw 4b27c <_Heap_Free+0x164>
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;
4b1c0: 7201 moveq #1,%d1
4b1c2: c2a9 0004 andl %a1@(4),%d1
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) ) {
4b1c6: 6700 00b4 beqw 4b27c <_Heap_Free+0x164>
4b1ca: d680 addl %d0,%d3
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
4b1cc: 4a05 tstb %d5
4b1ce: 6724 beqs 4b1f4 <_Heap_Free+0xdc>
return _Heap_Free_list_tail(heap)->prev;
}
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
4b1d0: 266a 0008 moveal %a2@(8),%a3
uintptr_t const size = block_size + prev_size + next_block_size;
4b1d4: d483 addl %d3,%d2
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4b1d6: 7201 moveq #1,%d1
Heap_Block *prev = block->prev;
4b1d8: 246a 000c moveal %a2@(12),%a2
prev->next = next;
4b1dc: 254b 0008 movel %a3,%a2@(8)
4b1e0: 8282 orl %d2,%d1
next->prev = prev;
4b1e2: 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;
4b1e6: 53a8 0038 subql #1,%a0@(56)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
4b1ea: 2382 2800 movel %d2,%a1@(00000000,%d2: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;
4b1ee: 2341 0004 movel %d1,%a1@(4)
4b1f2: 6078 bras 4b26c <_Heap_Free+0x154>
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;
4b1f4: 7401 moveq #1,%d2
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b1f6: 72fe moveq #-2,%d1
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;
4b1f8: 8483 orl %d3,%d2
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
4b1fa: 2483 movel %d3,%a2@
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;
4b1fc: 2342 0004 movel %d2,%a1@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b200: c3aa 0004 andl %d1,%a2@(4)
4b204: 6066 bras 4b26c <_Heap_Free+0x154>
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
4b206: 4a01 tstb %d1
4b208: 672a beqs 4b234 <_Heap_Free+0x11c>
RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
Heap_Block *old_block,
Heap_Block *new_block
)
{
Heap_Block *next = old_block->next;
4b20a: 266a 0008 moveal %a2@(8),%a3
uintptr_t const size = block_size + next_block_size;
4b20e: 2202 movel %d2,%d1
4b210: d280 addl %d0,%d1
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4b212: 7401 moveq #1,%d2
Heap_Block *prev = old_block->prev;
4b214: 246a 000c moveal %a2@(12),%a2
new_block->next = next;
4b218: 234b 0008 movel %a3,%a1@(8)
4b21c: 8481 orl %d1,%d2
new_block->prev = prev;
4b21e: 234a 000c movel %a2,%a1@(12)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
4b222: 2381 1800 movel %d1,%a1@(00000000,%d1:l)
next->prev = new_block;
4b226: 2749 000c movel %a1,%a3@(12)
prev->next = new_block;
4b22a: 2549 0008 movel %a1,%a2@(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;
4b22e: 2342 0004 movel %d2,%a1@(4)
4b232: 6038 bras 4b26c <_Heap_Free+0x154>
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;
4b234: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b236: 74fe moveq #-2,%d2
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;
4b238: 8280 orl %d0,%d1
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
4b23a: 2668 0008 moveal %a0@(8),%a3
new_block->next = next;
new_block->prev = block_before;
4b23e: 2348 000c movel %a0,%a1@(12)
4b242: 2341 0004 movel %d1,%a1@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
4b246: 2228 0038 movel %a0@(56),%d1
4b24a: 5281 addql #1,%d1
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
4b24c: 234b 0008 movel %a3,%a1@(8)
} 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;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b250: c5aa 0004 andl %d2,%a2@(4)
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
4b254: 2749 000c movel %a1,%a3@(12)
next_block->prev_size = block_size;
4b258: 2480 movel %d0,%a2@
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
4b25a: 2149 0008 movel %a1,%a0@(8)
/* Statistics */
++stats->free_blocks;
4b25e: 2141 0038 movel %d1,%a0@(56)
if ( stats->max_free_blocks < stats->free_blocks ) {
4b262: b2a8 003c cmpl %a0@(60),%d1
4b266: 6304 blss 4b26c <_Heap_Free+0x154>
stats->max_free_blocks = stats->free_blocks;
4b268: 2141 003c movel %d1,%a0@(60)
}
}
/* Statistics */
--stats->used_blocks;
4b26c: 53a8 0040 subql #1,%a0@(64)
++stats->frees;
4b270: 52a8 0050 addql #1,%a0@(80)
stats->free_size += block_size;
4b274: d1a8 0030 addl %d0,%a0@(48)
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
return true;
4b278: 7001 moveq #1,%d0
4b27a: 6002 bras 4b27e <_Heap_Free+0x166>
/* 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 );
4b27c: 4200 clrb %d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4b27e: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
4b282: 4e5e unlk %fp
...
0004697e <_Heap_Get_first_and_last_block>:
uintptr_t page_size,
uintptr_t min_block_size,
Heap_Block **first_block_ptr,
Heap_Block **last_block_ptr
)
{
4697e: 4e56 fff4 linkw %fp,#-12
46982: 206e 0008 moveal %fp@(8),%a0
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
46986: 2008 movel %a0,%d0
46988: 5080 addql #8,%d0
uintptr_t page_size,
uintptr_t min_block_size,
Heap_Block **first_block_ptr,
Heap_Block **last_block_ptr
)
{
4698a: 48d7 001c moveml %d2-%d4,%sp@
4698e: 222e 0010 movel %fp@(16),%d1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
46992: 2800 movel %d0,%d4
46994: 242e 000c movel %fp@(12),%d2
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
46998: 43f0 2800 lea %a0@(00000000,%d2:l),%a1
4699c: 4c41 4003 remul %d1,%d3,%d4
if ( remainder != 0 ) {
469a0: 4a83 tstl %d3
469a2: 6704 beqs 469a8 <_Heap_Get_first_and_last_block+0x2a>
return value - remainder + alignment;
469a4: d081 addl %d1,%d0
469a6: 9083 subl %d3,%d0
_Heap_Align_down( heap_area_size - overhead, page_size );
Heap_Block *const first_block = (Heap_Block *) first_block_begin;
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
469a8: b1c9 cmpal %a1,%a0
469aa: 622e bhis 469da <_Heap_Get_first_and_last_block+0x5c>
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin);
469ac: 2240 moveal %d0,%a1
469ae: 5189 subql #8,%a1
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
469b0: 9088 subl %a0,%d0
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
469b2: b082 cmpl %d2,%d0
469b4: 6424 bccs 469da <_Heap_Get_first_and_last_block+0x5c>
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin);
uintptr_t const first_block_size =
_Heap_Align_down( heap_area_size - overhead, page_size );
469b6: 9480 subl %d0,%d2
469b8: 2002 movel %d2,%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
469ba: 2602 movel %d2,%d3
469bc: 4c41 3002 remul %d1,%d2,%d3
469c0: 9082 subl %d2,%d0
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
|| first_block_size < min_block_size
469c2: b0ae 0014 cmpl %fp@(20),%d0
469c6: 6512 bcss 469da <_Heap_Get_first_and_last_block+0x5c><== NEVER TAKEN
) {
/* Invalid area or area too small */
return false;
}
*first_block_ptr = first_block;
469c8: 206e 0018 moveal %fp@(24),%a0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
469cc: d089 addl %a1,%d0
469ce: 2089 movel %a1,%a0@
469d0: 206e 001c moveal %fp@(28),%a0
469d4: 2080 movel %d0,%a0@
*last_block_ptr = last_block;
return true;
469d6: 7001 moveq #1,%d0
469d8: 6002 bras 469dc <_Heap_Get_first_and_last_block+0x5e>
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
|| first_block_size < min_block_size
) {
/* Invalid area or area too small */
return false;
469da: 4200 clrb %d0
*first_block_ptr = first_block;
*last_block_ptr = last_block;
return true;
}
469dc: 4cd7 001c moveml %sp@,%d2-%d4
469e0: 4e5e unlk %fp <== NOT EXECUTED
0005b19c <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
5b19c: 4e56 0000 linkw %fp,#0
5b1a0: 202e 000c movel %fp@(12),%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
5b1a4: 2040 moveal %d0,%a0
5b1a6: 5188 subql #8,%a0
5b1a8: 226e 0008 moveal %fp@(8),%a1
5b1ac: 2f02 movel %d2,%sp@-
5b1ae: 2400 movel %d0,%d2
5b1b0: 4c69 2001 0010 remul %a1@(16),%d1,%d2
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
5b1b6: 2429 0020 movel %a1@(32),%d2
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
5b1ba: 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;
5b1bc: b488 cmpl %a0,%d2
5b1be: 620c bhis 5b1cc <_Heap_Size_of_alloc_area+0x30>
5b1c0: b1e9 0024 cmpal %a1@(36),%a0
5b1c4: 53c1 sls %d1
5b1c6: 49c1 extbl %d1
5b1c8: 4481 negl %d1
5b1ca: 6002 bras 5b1ce <_Heap_Size_of_alloc_area+0x32>
5b1cc: 4281 clrl %d1
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
5b1ce: 4a01 tstb %d1
5b1d0: 673a beqs 5b20c <_Heap_Size_of_alloc_area+0x70>
- 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;
5b1d2: 72fe moveq #-2,%d1
5b1d4: 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);
5b1d8: 41f0 1800 lea %a0@(00000000,%d1:l),%a0
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
5b1dc: b488 cmpl %a0,%d2
5b1de: 620c bhis 5b1ec <_Heap_Size_of_alloc_area+0x50> <== NEVER TAKEN
5b1e0: b1e9 0024 cmpal %a1@(36),%a0
5b1e4: 53c1 sls %d1
5b1e6: 49c1 extbl %d1
5b1e8: 4481 negl %d1
5b1ea: 6002 bras 5b1ee <_Heap_Size_of_alloc_area+0x52>
5b1ec: 4281 clrl %d1 <== NOT EXECUTED
}
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
5b1ee: 4a01 tstb %d1
5b1f0: 671a beqs 5b20c <_Heap_Size_of_alloc_area+0x70> <== 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;
5b1f2: 7201 moveq #1,%d1
5b1f4: c2a8 0004 andl %a0@(4),%d1
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
5b1f8: 6712 beqs 5b20c <_Heap_Size_of_alloc_area+0x70> <== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
5b1fa: 7204 moveq #4,%d1
5b1fc: 9280 subl %d0,%d1
5b1fe: 2001 movel %d1,%d0
5b200: d088 addl %a0,%d0
5b202: 226e 0010 moveal %fp@(16),%a1
5b206: 2280 movel %d0,%a1@
return true;
5b208: 7001 moveq #1,%d0
5b20a: 6002 bras 5b20e <_Heap_Size_of_alloc_area+0x72>
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
5b20c: 4200 clrb %d0
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
5b20e: 241f movel %sp@+,%d2
5b210: 4e5e unlk %fp <== NOT EXECUTED
00047416 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
47416: 4e56 ffd0 linkw %fp,#-48
4741a: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4741e: 266e 0008 moveal %fp@(8),%a3
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;
47422: 45fa ffac lea %pc@(473d0 <_Heap_Walk_print_nothing>),%a2
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
47426: 242e 000c movel %fp@(12),%d2
uintptr_t const page_size = heap->page_size;
4742a: 282b 0010 movel %a3@(16),%d4
uintptr_t const min_block_size = heap->min_block_size;
4742e: 2a2b 0014 movel %a3@(20),%d5
Heap_Block *const first_block = heap->first_block;
47432: 2c2b 0020 movel %a3@(32),%d6
Heap_Block *const last_block = heap->last_block;
47436: 2e2b 0024 movel %a3@(36),%d7
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
4743a: 4a2e 0013 tstb %fp@(19)
4743e: 6704 beqs 47444 <_Heap_Walk+0x2e>
47440: 45fa ff96 lea %pc@(473d8 <_Heap_Walk_print>),%a2
if ( !_System_state_Is_up( _System_state_Get() ) ) {
47444: 7003 moveq #3,%d0
47446: b0b9 0006 0e44 cmpl 60e44 <_System_state_Current>,%d0
4744c: 6600 02fc bnew 4774a <_Heap_Walk+0x334>
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)(
47450: 2f2b 000c movel %a3@(12),%sp@-
47454: 2f2b 0008 movel %a3@(8),%sp@-
47458: 2f07 movel %d7,%sp@-
4745a: 2f06 movel %d6,%sp@-
4745c: 2f2b 001c movel %a3@(28),%sp@-
47460: 2f2b 0018 movel %a3@(24),%sp@-
47464: 2f05 movel %d5,%sp@-
47466: 2f04 movel %d4,%sp@-
47468: 4879 0005 d0cb pea 5d0cb <_Status_Object_name_errors_to_status+0x5d>
4746e: 42a7 clrl %sp@-
47470: 2f02 movel %d2,%sp@-
47472: 4e92 jsr %a2@
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
47474: 4fef 002c lea %sp@(44),%sp
47478: 4a84 tstl %d4
4747a: 6608 bnes 47484 <_Heap_Walk+0x6e>
(*printer)( source, true, "page size is zero\n" );
4747c: 4879 0005 d15c pea 5d15c <_Status_Object_name_errors_to_status+0xee>
47482: 606c bras 474f0 <_Heap_Walk+0xda>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
47484: 7003 moveq #3,%d0
47486: c084 andl %d4,%d0
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
47488: 670c beqs 47496 <_Heap_Walk+0x80>
(*printer)(
4748a: 2f04 movel %d4,%sp@-
4748c: 4879 0005 d16f pea 5d16f <_Status_Object_name_errors_to_status+0x101>
47492: 6000 02ca braw 4775e <_Heap_Walk+0x348>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
47496: 2205 movel %d5,%d1
47498: 4c44 1000 remul %d4,%d0,%d1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
4749c: 4a80 tstl %d0
4749e: 670c beqs 474ac <_Heap_Walk+0x96>
(*printer)(
474a0: 2f05 movel %d5,%sp@-
474a2: 4879 0005 d18d pea 5d18d <_Status_Object_name_errors_to_status+0x11f>
474a8: 6000 02b4 braw 4775e <_Heap_Walk+0x348>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
474ac: 2006 movel %d6,%d0
474ae: 5080 addql #8,%d0
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
474b0: 4c44 0001 remul %d4,%d1,%d0
);
return false;
}
if (
474b4: 4a81 tstl %d1
474b6: 670c beqs 474c4 <_Heap_Walk+0xae>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
474b8: 2f06 movel %d6,%sp@-
474ba: 4879 0005 d1b1 pea 5d1b1 <_Status_Object_name_errors_to_status+0x143>
474c0: 6000 029c braw 4775e <_Heap_Walk+0x348>
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;
474c4: 7001 moveq #1,%d0
474c6: 2046 moveal %d6,%a0
474c8: c0a8 0004 andl %a0@(4),%d0
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
474cc: 6608 bnes 474d6 <_Heap_Walk+0xc0>
(*printer)(
474ce: 4879 0005 d1e2 pea 5d1e2 <_Status_Object_name_errors_to_status+0x174>
474d4: 601a bras 474f0 <_Heap_Walk+0xda>
- 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;
474d6: 70fe moveq #-2,%d0
474d8: 2047 moveal %d7,%a0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
474da: 2847 moveal %d7,%a4
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
474dc: c0a8 0004 andl %a0@(4),%d0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
474e0: d9c0 addal %d0,%a4
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;
474e2: 7001 moveq #1,%d0
474e4: c0ac 0004 andl %a4@(4),%d0
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
474e8: 6616 bnes 47500 <_Heap_Walk+0xea>
(*printer)(
474ea: 4879 0005 d210 pea 5d210 <_Status_Object_name_errors_to_status+0x1a2>
474f0: 4878 0001 pea 1 <ADD>
474f4: 2f02 movel %d2,%sp@-
474f6: 4e92 jsr %a2@
474f8: 4fef 000c lea %sp@(12),%sp
474fc: 6000 009e braw 4759c <_Heap_Walk+0x186>
);
return false;
}
if (
47500: bc8c cmpl %a4,%d6
47502: 6708 beqs 4750c <_Heap_Walk+0xf6>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
47504: 4879 0005 d225 pea 5d225 <_Status_Object_name_errors_to_status+0x1b7>
4750a: 60e4 bras 474f0 <_Heap_Walk+0xda>
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
4750c: 262b 0010 movel %a3@(16),%d3
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
47510: 220b movel %a3,%d1
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
47512: 206b 0008 moveal %a3@(8),%a0
47516: 2d44 fff8 movel %d4,%fp@(-8)
4751a: 2d43 fffc movel %d3,%fp@(-4)
4751e: 6000 0088 braw 475a8 <_Heap_Walk+0x192>
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;
47522: b1eb 0020 cmpal %a3@(32),%a0
47526: 650c bcss 47534 <_Heap_Walk+0x11e>
47528: b1eb 0024 cmpal %a3@(36),%a0
4752c: 53c0 sls %d0
4752e: 49c0 extbl %d0
47530: 4480 negl %d0
47532: 6002 bras 47536 <_Heap_Walk+0x120>
47534: 4280 clrl %d0
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
47536: 4a00 tstb %d0
47538: 660c bnes 47546 <_Heap_Walk+0x130>
(*printer)(
4753a: 2f08 movel %a0,%sp@-
4753c: 4879 0005 d254 pea 5d254 <_Status_Object_name_errors_to_status+0x1e6>
47542: 6000 021a braw 4775e <_Heap_Walk+0x348>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
47546: 4be8 0008 lea %a0@(8),%a5
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4754a: 200d movel %a5,%d0
4754c: 262e fffc movel %fp@(-4),%d3
47550: 4c43 0004 remul %d3,%d4,%d0
);
return false;
}
if (
47554: 4a84 tstl %d4
47556: 670c beqs 47564 <_Heap_Walk+0x14e>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
47558: 2f08 movel %a0,%sp@-
4755a: 4879 0005 d274 pea 5d274 <_Status_Object_name_errors_to_status+0x206>
47560: 6000 01fc braw 4775e <_Heap_Walk+0x348>
- 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;
47564: 70fe moveq #-2,%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;
47566: 7601 moveq #1,%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;
47568: 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;
4756c: c6b0 0804 andl %a0@(00000004,%d0:l),%d3
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
47570: 670c beqs 4757e <_Heap_Walk+0x168>
(*printer)(
47572: 2f08 movel %a0,%sp@-
47574: 4879 0005 d2a4 pea 5d2a4 <_Status_Object_name_errors_to_status+0x236>
4757a: 6000 01e2 braw 4775e <_Heap_Walk+0x348>
);
return false;
}
if ( free_block->prev != prev_block ) {
4757e: 2028 000c movel %a0@(12),%d0
47582: b280 cmpl %d0,%d1
47584: 671c beqs 475a2 <_Heap_Walk+0x18c>
(*printer)(
47586: 2f00 movel %d0,%sp@-
47588: 2f08 movel %a0,%sp@-
4758a: 4879 0005 d2c0 pea 5d2c0 <_Status_Object_name_errors_to_status+0x252>
47590: 4878 0001 pea 1 <ADD>
47594: 2f02 movel %d2,%sp@-
47596: 4e92 jsr %a2@
47598: 4fef 0014 lea %sp@(20),%sp
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
4759c: 4200 clrb %d0
4759e: 6000 01ac braw 4774c <_Heap_Walk+0x336>
return false;
}
prev_block = free_block;
free_block = free_block->next;
475a2: 2208 movel %a0,%d1
475a4: 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 ) {
475a8: b7c8 cmpal %a0,%a3
475aa: 6600 ff76 bnew 47522 <_Heap_Walk+0x10c>
475ae: 282e fff8 movel %fp@(-8),%d4
475b2: 6002 bras 475b6 <_Heap_Walk+0x1a0>
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
475b4: 284d moveal %a5,%a4
return true;
}
475b6: 202c 0004 movel %a4@(4),%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;
475ba: 76fe moveq #-2,%d3
475bc: c680 andl %d0,%d3
475be: 2d40 fffc movel %d0,%fp@(-4)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
475c2: 4bf4 3800 lea %a4@(00000000,%d3:l),%a5
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;
475c6: bbeb 0020 cmpal %a3@(32),%a5
475ca: 650c bcss 475d8 <_Heap_Walk+0x1c2> <== NEVER TAKEN
475cc: bbeb 0024 cmpal %a3@(36),%a5
475d0: 53c0 sls %d0
475d2: 49c0 extbl %d0
475d4: 4480 negl %d0
475d6: 6002 bras 475da <_Heap_Walk+0x1c4>
475d8: 4280 clrl %d0 <== NOT EXECUTED
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;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
475da: 4a00 tstb %d0
475dc: 660c bnes 475ea <_Heap_Walk+0x1d4>
(*printer)(
475de: 2f0d movel %a5,%sp@-
475e0: 2f0c movel %a4,%sp@-
475e2: 4879 0005 d2f2 pea 5d2f2 <_Status_Object_name_errors_to_status+0x284>
475e8: 60a6 bras 47590 <_Heap_Walk+0x17a>
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;
475ea: be8c cmpl %a4,%d7
475ec: 56c0 sne %d0
475ee: 2200 movel %d0,%d1
475f0: 4481 negl %d1
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
475f2: 2003 movel %d3,%d0
475f4: 1d41 fffb moveb %d1,%fp@(-5)
475f8: 4c44 0001 remul %d4,%d1,%d0
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
475fc: 4a81 tstl %d1
475fe: 6714 beqs 47614 <_Heap_Walk+0x1fe>
47600: 4a2e fffb tstb %fp@(-5)
47604: 670e beqs 47614 <_Heap_Walk+0x1fe>
(*printer)(
47606: 2f03 movel %d3,%sp@-
47608: 2f0c movel %a4,%sp@-
4760a: 4879 0005 d31f pea 5d31f <_Status_Object_name_errors_to_status+0x2b1>
47610: 6000 ff7e braw 47590 <_Heap_Walk+0x17a>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
47614: ba83 cmpl %d3,%d5
47616: 6322 blss 4763a <_Heap_Walk+0x224>
47618: 4a2e fffb tstb %fp@(-5)
4761c: 671c beqs 4763a <_Heap_Walk+0x224> <== NEVER TAKEN
(*printer)(
4761e: 2f05 movel %d5,%sp@-
47620: 2f03 movel %d3,%sp@-
47622: 2f0c movel %a4,%sp@-
47624: 4879 0005 d34d pea 5d34d <_Status_Object_name_errors_to_status+0x2df>
4762a: 4878 0001 pea 1 <ADD>
4762e: 2f02 movel %d2,%sp@-
47630: 4e92 jsr %a2@
block,
block_size,
min_block_size
);
return false;
47632: 4fef 0018 lea %sp@(24),%sp
47636: 6000 ff64 braw 4759c <_Heap_Walk+0x186>
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
4763a: b9cd cmpal %a5,%a4
4763c: 6514 bcss 47652 <_Heap_Walk+0x23c>
4763e: 4a2e fffb tstb %fp@(-5)
47642: 670e beqs 47652 <_Heap_Walk+0x23c>
(*printer)(
47644: 2f0d movel %a5,%sp@-
47646: 2f0c movel %a4,%sp@-
47648: 4879 0005 d378 pea 5d378 <_Status_Object_name_errors_to_status+0x30a>
4764e: 6000 ff40 braw 47590 <_Heap_Walk+0x17a>
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;
47652: 7001 moveq #1,%d0
47654: c0ae fffc andl %fp@(-4),%d0
47658: 2d40 fffc movel %d0,%fp@(-4)
4765c: 7001 moveq #1,%d0
4765e: c0ad 0004 andl %a5@(4),%d0
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
47662: 6600 00ae bnew 47712 <_Heap_Walk+0x2fc>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
47666: 222b 0008 movel %a3@(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)(
4766a: 43f9 0005 d098 lea 5d098 <_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 ?
47670: 206c 0008 moveal %a4@(8),%a0
47674: 2d41 fff8 movel %d1,%fp@(-8)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
47678: b1eb 000c cmpal %a3@(12),%a0
4767c: 6710 beqs 4768e <_Heap_Walk+0x278>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
4767e: 43f9 0005 cfe0 lea 5cfe0 <rtems_filesystem_default_pathconf+0xb4>,%a1
47684: b7c8 cmpal %a0,%a3
47686: 6606 bnes 4768e <_Heap_Walk+0x278>
47688: 43f9 0005 d0a7 lea 5d0a7 <_Status_Object_name_errors_to_status+0x39>,%a1
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 ?
4768e: 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)(
47692: 223c 0005 d0b1 movel #381105,%d1
47698: b0ae fff8 cmpl %fp@(-8),%d0
4769c: 6710 beqs 476ae <_Heap_Walk+0x298>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
4769e: 223c 0005 cfe0 movel #380896,%d1
476a4: b7c0 cmpal %d0,%a3
476a6: 6606 bnes 476ae <_Heap_Walk+0x298>
476a8: 223c 0005 d0c1 movel #381121,%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)(
476ae: 2f09 movel %a1,%sp@-
476b0: 2f08 movel %a0,%sp@-
476b2: 2f01 movel %d1,%sp@-
476b4: 2f00 movel %d0,%sp@-
476b6: 2f03 movel %d3,%sp@-
476b8: 2f0c movel %a4,%sp@-
476ba: 4879 0005 d3ac pea 5d3ac <_Status_Object_name_errors_to_status+0x33e>
476c0: 42a7 clrl %sp@-
476c2: 2f02 movel %d2,%sp@-
476c4: 4e92 jsr %a2@
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
476c6: 2015 movel %a5@,%d0
476c8: 4fef 0024 lea %sp@(36),%sp
476cc: b083 cmpl %d3,%d0
476ce: 671e beqs 476ee <_Heap_Walk+0x2d8>
(*printer)(
476d0: 2f0d movel %a5,%sp@-
476d2: 2f00 movel %d0,%sp@-
476d4: 2f03 movel %d3,%sp@-
476d6: 2f0c movel %a4,%sp@-
476d8: 4879 0005 d3e1 pea 5d3e1 <_Status_Object_name_errors_to_status+0x373>
476de: 4878 0001 pea 1 <ADD>
476e2: 2f02 movel %d2,%sp@-
476e4: 4e92 jsr %a2@
476e6: 4fef 001c lea %sp@(28),%sp
476ea: 6000 feb0 braw 4759c <_Heap_Walk+0x186>
);
return false;
}
if ( !prev_used ) {
476ee: 4aae fffc tstl %fp@(-4)
476f2: 660a bnes 476fe <_Heap_Walk+0x2e8>
(*printer)(
476f4: 2f0c movel %a4,%sp@-
476f6: 4879 0005 d41a pea 5d41a <_Status_Object_name_errors_to_status+0x3ac>
476fc: 6060 bras 4775e <_Heap_Walk+0x348>
476fe: 206b 0008 moveal %a3@(8),%a0
47702: 6008 bras 4770c <_Heap_Walk+0x2f6>
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
if ( free_block == block ) {
47704: b9c8 cmpal %a0,%a4
47706: 673c beqs 47744 <_Heap_Walk+0x32e>
return true;
}
free_block = free_block->next;
47708: 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 ) {
4770c: b7c8 cmpal %a0,%a3
4770e: 66f4 bnes 47704 <_Heap_Walk+0x2ee>
47710: 6044 bras 47756 <_Heap_Walk+0x340>
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
47712: 4aae fffc tstl %fp@(-4)
47716: 6716 beqs 4772e <_Heap_Walk+0x318>
(*printer)(
47718: 2f03 movel %d3,%sp@-
4771a: 2f0c movel %a4,%sp@-
4771c: 4879 0005 d449 pea 5d449 <_Status_Object_name_errors_to_status+0x3db>
47722: 42a7 clrl %sp@-
47724: 2f02 movel %d2,%sp@-
47726: 4e92 jsr %a2@
47728: 4fef 0014 lea %sp@(20),%sp
4772c: 6016 bras 47744 <_Heap_Walk+0x32e>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
4772e: 2f14 movel %a4@,%sp@-
47730: 2f03 movel %d3,%sp@-
47732: 2f0c movel %a4,%sp@-
47734: 4879 0005 d460 pea 5d460 <_Status_Object_name_errors_to_status+0x3f2>
4773a: 42a7 clrl %sp@-
4773c: 2f02 movel %d2,%sp@-
4773e: 4e92 jsr %a2@
47740: 4fef 0018 lea %sp@(24),%sp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
47744: bc8d cmpl %a5,%d6
47746: 6600 fe6c bnew 475b4 <_Heap_Walk+0x19e>
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
4774a: 7001 moveq #1,%d0
block = next_block;
} while ( block != first_block );
return true;
}
4774c: 4cee 3cfc ffd0 moveml %fp@(-48),%d2-%d7/%a2-%a5
47752: 4e5e unlk %fp
47754: 4e75 rts
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
47756: 2f0c movel %a4,%sp@-
47758: 4879 0005 d485 pea 5d485 <_Status_Object_name_errors_to_status+0x417>
4775e: 4878 0001 pea 1 <ADD>
47762: 2f02 movel %d2,%sp@-
47764: 4e92 jsr %a2@
47766: 4fef 0010 lea %sp@(16),%sp
4776a: 6000 fe30 braw 4759c <_Heap_Walk+0x186>
...
00046bdc <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
46bdc: 4e56 0000 linkw %fp,#0
46be0: 222e 000c movel %fp@(12),%d1
46be4: 2f02 movel %d2,%sp@-
46be6: 242e 0010 movel %fp@(16),%d2
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
46bea: 13c1 0005 ec32 moveb %d1,5ec32 <_Internal_errors_What_happened+0x4>
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
46bf0: 2f02 movel %d2,%sp@-
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
46bf2: 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 );
46bf6: 0281 0000 00ff andil #255,%d1
bool is_internal,
Internal_errors_t the_error
)
{
_Internal_errors_What_happened.the_source = the_source;
46bfc: 23c0 0005 ec2e movel %d0,5ec2e <_Internal_errors_What_happened>
_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 );
46c02: 2f01 movel %d1,%sp@-
)
{
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
46c04: 23c2 0005 ec34 movel %d2,5ec34 <_Internal_errors_What_happened+0x6>
_User_extensions_Fatal( the_source, is_internal, the_error );
46c0a: 2f00 movel %d0,%sp@-
46c0c: 4eb9 0004 884a jsr 4884a <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
46c12: 7005 moveq #5,%d0
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
46c14: 2042 moveal %d2,%a0
46c16: 243c 0000 0700 movel #1792,%d2
46c1c: 23c0 0005 ecdc movel %d0,5ecdc <_System_state_Current>
46c22: 40c0 movew %sr,%d0
46c24: 8082 orl %d2,%d0
46c26: 46c0 movew %d0,%sr
46c28: 2008 movel %a0,%d0 <== NOT EXECUTED
46c2a: 223c dead beef movel #-559038737,%d1 <== NOT EXECUTED
46c30: 4ac8 halt <== NOT EXECUTED
46c32: 4fef 000c lea %sp@(12),%sp
46c36: 60fe bras 46c36 <_Internal_error_Occurred+0x5a>
00046c98 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
46c98: 4e56 fff0 linkw %fp,#-16
46c9c: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
46ca0: 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 )
46ca4: 4aaa 0014 tstl %a2@(20)
46ca8: 675e beqs 46d08 <_Objects_Allocate+0x70> <== NEVER TAKEN
/*
* OK. The manager should be initialized and configured to have objects.
* With any luck, it is safe to attempt to allocate an object.
*/
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
46caa: 240a movel %a2,%d2
46cac: 0682 0000 001c addil #28,%d2
46cb2: 47f9 0004 6414 lea 46414 <_Chain_Get>,%a3
46cb8: 2f02 movel %d2,%sp@-
46cba: 4e93 jsr %a3@
if ( information->auto_extend ) {
46cbc: 588f addql #4,%sp
46cbe: 4a2a 0010 tstb %a2@(16)
46cc2: 6746 beqs 46d0a <_Objects_Allocate+0x72>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
46cc4: 4a80 tstl %d0
46cc6: 6612 bnes 46cda <_Objects_Allocate+0x42>
_Objects_Extend_information( information );
46cc8: 2f0a movel %a2,%sp@-
46cca: 4eb9 0004 6d3c jsr 46d3c <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
46cd0: 2f02 movel %d2,%sp@-
46cd2: 4e93 jsr %a3@
}
if ( the_object ) {
46cd4: 508f addql #8,%sp
46cd6: 4a80 tstl %d0
46cd8: 6730 beqs 46d0a <_Objects_Allocate+0x72>
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
46cda: 2040 moveal %d0,%a0
46cdc: 4281 clrl %d1
46cde: 4282 clrl %d2
46ce0: 3228 000a movew %a0@(10),%d1
46ce4: 342a 0008 movew %a2@(8),%d2
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
46ce8: 206a 002a moveal %a2@(42),%a0
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
46cec: 9282 subl %d2,%d1
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
46cee: 342a 0012 movew %a2@(18),%d2
46cf2: 4c42 1001 remul %d2,%d1,%d1
information->inactive_per_block[ block ]--;
46cf6: e589 lsll #2,%d1
46cf8: d1c1 addal %d1,%a0
46cfa: 5390 subql #1,%a0@
information->inactive--;
46cfc: 322a 0028 movew %a2@(40),%d1
46d00: 5381 subql #1,%d1
46d02: 3541 0028 movew %d1,%a2@(40)
46d06: 6002 bras 46d0a <_Objects_Allocate+0x72>
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
return NULL;
46d08: 4280 clrl %d0 <== NOT EXECUTED
);
}
#endif
return the_object;
}
46d0a: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
46d10: 4e5e unlk %fp <== NOT EXECUTED
00046d14 <_Objects_Close>:
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
46d14: 4280 clrl %d0
void _Objects_Close(
Objects_Information *information,
Objects_Control *the_object
)
{
46d16: 4e56 0000 linkw %fp,#0
46d1a: 206e 0008 moveal %fp@(8),%a0
46d1e: 226e 000c moveal %fp@(12),%a1
46d22: 2f0a movel %a2,%sp@-
46d24: 2468 0018 moveal %a0@(24),%a2
46d28: 3029 000a movew %a1@(10),%d0
46d2c: 42b2 0c00 clrl %a2@(00000000,%d0:l:4)
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
}
46d30: 245f moveal %sp@+,%a2
46d32: 4e5e unlk %fp
Objects_Control *the_object
)
{
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
46d34: 4ef9 0004 725c jmp 4725c <_Objects_Namespace_remove>
...
00047044 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
47044: 4e56 0000 linkw %fp,#0
47048: 2f03 movel %d3,%sp@-
4704a: 362e 000e movew %fp@(14),%d3
4704e: 2f02 movel %d2,%sp@-
47050: 242e 0008 movel %fp@(8),%d2
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
47054: 4a43 tstw %d3
47056: 673a beqs 47092 <_Objects_Get_information+0x4e>
/*
* 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 );
47058: 2f02 movel %d2,%sp@-
4705a: 4eb9 0004 b288 jsr 4b288 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
47060: 588f addql #4,%sp
47062: 4a80 tstl %d0
47064: 672c beqs 47092 <_Objects_Get_information+0x4e>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
47066: 0283 0000 ffff andil #65535,%d3
4706c: b083 cmpl %d3,%d0
4706e: 6522 bcss 47092 <_Objects_Get_information+0x4e>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
47070: 41f9 0005 eb54 lea 5eb54 <_Objects_Information_table>,%a0
47076: 2070 2c00 moveal %a0@(00000000,%d2:l:4),%a0
4707a: 4a88 tstl %a0
4707c: 6714 beqs 47092 <_Objects_Get_information+0x4e> <== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
4707e: 2030 3c00 movel %a0@(00000000,%d3:l:4),%d0
if ( !info )
47082: 6710 beqs 47094 <_Objects_Get_information+0x50> <== 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;
47084: 2040 moveal %d0,%a0
47086: 4a68 000e tstw %a0@(14)
4708a: 56c1 sne %d1
4708c: 49c1 extbl %d1
4708e: c081 andl %d1,%d0
47090: 6002 bras 47094 <_Objects_Get_information+0x50>
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
return NULL;
47092: 4280 clrl %d0
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
47094: 242e fff8 movel %fp@(-8),%d2
47098: 262e fffc movel %fp@(-4),%d3
4709c: 4e5e unlk %fp <== NOT EXECUTED
00053df4 <_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;
53df4: 7001 moveq #1,%d0
if ( information->maximum >= index ) {
53df6: 4281 clrl %d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
53df8: 4e56 0000 linkw %fp,#0
53dfc: 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;
53e00: 90a8 0006 subl %a0@(6),%d0
53e04: d0ae 000c addl %fp@(12),%d0
if ( information->maximum >= index ) {
53e08: 3228 000e movew %a0@(14),%d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
53e0c: 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 ) {
53e10: b081 cmpl %d1,%d0
53e12: 620e bhis 53e22 <_Objects_Get_no_protection+0x2e>
if ( (the_object = information->local_table[ index ]) != NULL ) {
53e14: 2068 0018 moveal %a0@(24),%a0
53e18: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
53e1c: 6704 beqs 53e22 <_Objects_Get_no_protection+0x2e><== NEVER TAKEN
*location = OBJECTS_LOCAL;
53e1e: 4291 clrl %a1@
return the_object;
53e20: 6006 bras 53e28 <_Objects_Get_no_protection+0x34>
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
53e22: 7001 moveq #1,%d0
53e24: 2280 movel %d0,%a1@
return NULL;
53e26: 4280 clrl %d0
}
53e28: 4e5e unlk %fp <== NOT EXECUTED
000477fc <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
477fc: 4e56 fffc linkw %fp,#-4
47800: 222e 0008 movel %fp@(8),%d1
47804: 2f02 movel %d2,%sp@-
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
47806: 4a81 tstl %d1
47808: 660a bnes 47814 <_Objects_Id_to_name+0x18>
4780a: 2079 0005 ff62 moveal 5ff62 <_Per_CPU_Information+0xc>,%a0
47810: 2228 0008 movel %a0@(8),%d1
47814: 7418 moveq #24,%d2
47816: 2001 movel %d1,%d0
47818: e4a8 lsrl %d2,%d0
4781a: 143c 0007 moveb #7,%d2
4781e: c082 andl %d2,%d0
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
47820: 143c 0002 moveb #2,%d2
47824: 2040 moveal %d0,%a0
47826: 5388 subql #1,%a0
47828: b488 cmpl %a0,%d2
4782a: 6540 bcss 4786c <_Objects_Id_to_name+0x70> <== NEVER TAKEN
4782c: 6048 bras 47876 <_Objects_Id_to_name+0x7a>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
4782e: 2001 movel %d1,%d0
47830: 741b moveq #27,%d2
47832: e4a8 lsrl %d2,%d0
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
47834: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
if ( !information )
47838: 4a88 tstl %a0
4783a: 6730 beqs 4786c <_Objects_Id_to_name+0x70> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
4783c: 4a28 0032 tstb %a0@(50)
47840: 662a bnes 4786c <_Objects_Id_to_name+0x70> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
47842: 486e fffc pea %fp@(-4)
47846: 2f01 movel %d1,%sp@-
47848: 2f08 movel %a0,%sp@-
4784a: 4eb9 0004 7794 jsr 47794 <_Objects_Get>
if ( !the_object )
47850: 4fef 000c lea %sp@(12),%sp
47854: 4a80 tstl %d0
47856: 6714 beqs 4786c <_Objects_Id_to_name+0x70>
return OBJECTS_INVALID_ID;
*name = the_object->name;
47858: 206e 000c moveal %fp@(12),%a0
4785c: 2240 moveal %d0,%a1
4785e: 20a9 000c movel %a1@(12),%a0@
_Thread_Enable_dispatch();
47862: 4eb9 0004 8434 jsr 48434 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
47868: 4280 clrl %d0
4786a: 6002 bras 4786e <_Objects_Id_to_name+0x72>
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;
4786c: 7003 moveq #3,%d0
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
4786e: 242e fff8 movel %fp@(-8),%d2
47872: 4e5e unlk %fp
47874: 4e75 rts
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
47876: 41f9 0005 fabc lea 5fabc <_Objects_Information_table>,%a0
4787c: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
47880: 4a88 tstl %a0
47882: 66aa bnes 4782e <_Objects_Id_to_name+0x32>
47884: 60e6 bras 4786c <_Objects_Id_to_name+0x70>
...
00047288 <_Objects_Name_to_id_u32>:
Objects_Information *information,
uint32_t name,
uint32_t node,
Objects_Id *id
)
{
47288: 4e56 fff4 linkw %fp,#-12
4728c: 226e 0008 moveal %fp@(8),%a1
47290: 48d7 040c moveml %d2-%d3/%a2,%sp@
47294: 242e 000c movel %fp@(12),%d2
47298: 202e 0010 movel %fp@(16),%d0
4729c: 246e 0014 moveal %fp@(20),%a2
Objects_Name name_for_mp;
#endif
/* ASSERT: information->is_string == false */
if ( !id )
472a0: 4a8a tstl %a2
472a2: 674a beqs 472ee <_Objects_Name_to_id_u32+0x66>
return OBJECTS_INVALID_ADDRESS;
if ( name == 0 )
472a4: 4a82 tstl %d2
472a6: 674a beqs 472f2 <_Objects_Name_to_id_u32+0x6a> <== NEVER TAKEN
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
472a8: 3229 000e movew %a1@(14),%d1
472ac: 6744 beqs 472f2 <_Objects_Name_to_id_u32+0x6a>
472ae: 4a80 tstl %d0
472b0: 672e beqs 472e0 <_Objects_Name_to_id_u32+0x58>
(node == OBJECTS_SEARCH_ALL_NODES ||
472b2: 0c80 7fff ffff cmpil #2147483647,%d0
472b8: 6726 beqs 472e0 <_Objects_Name_to_id_u32+0x58>
node == OBJECTS_SEARCH_LOCAL_NODE ||
472ba: 7601 moveq #1,%d3
472bc: b680 cmpl %d0,%d3
472be: 6632 bnes 472f2 <_Objects_Name_to_id_u32+0x6a> <== NEVER TAKEN
472c0: 601e bras 472e0 <_Objects_Name_to_id_u32+0x58>
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
the_object = information->local_table[ index ];
472c2: 2069 0018 moveal %a1@(24),%a0
472c6: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
if ( !the_object )
472ca: 4a88 tstl %a0
472cc: 670e beqs 472dc <_Objects_Name_to_id_u32+0x54>
continue;
if ( name == the_object->name.name_u32 ) {
472ce: b4a8 000c cmpl %a0@(12),%d2
472d2: 6608 bnes 472dc <_Objects_Name_to_id_u32+0x54>
*id = the_object->id;
472d4: 24a8 0008 movel %a0@(8),%a2@
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
472d8: 4280 clrl %d0
472da: 6018 bras 472f4 <_Objects_Name_to_id_u32+0x6c>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
472dc: 5280 addql #1,%d0
472de: 6008 bras 472e8 <_Objects_Name_to_id_u32+0x60>
search_local_node = false;
if ( information->maximum != 0 &&
(node == OBJECTS_SEARCH_ALL_NODES ||
node == OBJECTS_SEARCH_LOCAL_NODE ||
472e0: 7001 moveq #1,%d0
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
472e2: 0281 0000 ffff andil #65535,%d1
472e8: b280 cmpl %d0,%d1
472ea: 64d6 bccs 472c2 <_Objects_Name_to_id_u32+0x3a>
472ec: 6004 bras 472f2 <_Objects_Name_to_id_u32+0x6a>
#endif
/* ASSERT: information->is_string == false */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
472ee: 7002 moveq #2,%d0
472f0: 6002 bras 472f4 <_Objects_Name_to_id_u32+0x6c>
return OBJECTS_INVALID_NAME;
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
472f2: 7001 moveq #1,%d0
#endif
}
472f4: 4cd7 040c moveml %sp@,%d2-%d3/%a2
472f8: 4e5e unlk %fp <== NOT EXECUTED
00047470 <_Objects_Set_name>:
{
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
47470: 4280 clrl %d0
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
47472: 4e56 ffec linkw %fp,#-20
47476: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
4747a: 2a6e 0008 moveal %fp@(8),%a5
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
4747e: 302d 0034 movew %a5@(52),%d0
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
47482: 246e 0010 moveal %fp@(16),%a2
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
47486: 2f00 movel %d0,%sp@-
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
47488: 286e 000c moveal %fp@(12),%a4
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
4748c: 2f0a movel %a2,%sp@-
4748e: 4eb9 0004 e6f8 jsr 4e6f8 <strnlen>
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
47494: 508f addql #8,%sp
{
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
47496: 2640 moveal %d0,%a3
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
47498: 4a2d 0032 tstb %a5@(50)
4749c: 673c beqs 474da <_Objects_Set_name+0x6a>
char *d;
d = _Workspace_Allocate( length + 1 );
4749e: 486b 0001 pea %a3@(1)
474a2: 4eb9 0004 8e4c jsr 48e4c <_Workspace_Allocate>
if ( !d )
474a8: 588f addql #4,%sp
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
474aa: 2a40 moveal %d0,%a5
if ( !d )
474ac: 4a80 tstl %d0
474ae: 677a beqs 4752a <_Objects_Set_name+0xba> <== NEVER TAKEN
return false;
_Workspace_Free( (void *)the_object->name.name_p );
474b0: 2f2c 000c movel %a4@(12),%sp@-
474b4: 4eb9 0004 8e68 jsr 48e68 <_Workspace_Free>
the_object->name.name_p = NULL;
474ba: 42ac 000c clrl %a4@(12)
strncpy( d, name, length );
474be: 2f0b movel %a3,%sp@-
474c0: 2f0a movel %a2,%sp@-
474c2: 2f0d movel %a5,%sp@-
474c4: 4eb9 0004 e670 jsr 4e670 <strncpy>
d[length] = '\0';
the_object->name.name_p = d;
474ca: 4fef 0010 lea %sp@(16),%sp
_Workspace_Free( (void *)the_object->name.name_p );
the_object->name.name_p = NULL;
strncpy( d, name, length );
d[length] = '\0';
474ce: 4200 clrb %d0
474d0: 1b80 b800 moveb %d0,%a5@(00000000,%a3:l)
the_object->name.name_p = d;
474d4: 294d 000c movel %a5,%a4@(12)
474d8: 604c bras 47526 <_Objects_Set_name+0xb6>
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
474da: 7418 moveq #24,%d2
474dc: 1212 moveb %a2@,%d1
474de: 7020 moveq #32,%d0
474e0: 4840 swap %d0
474e2: 49c1 extbl %d1
474e4: e5a9 lsll %d2,%d1
474e6: 143c 0001 moveb #1,%d2
474ea: b48b cmpl %a3,%d2
474ec: 640a bccs 474f8 <_Objects_Set_name+0x88>
474ee: 102a 0001 moveb %a2@(1),%d0
474f2: 49c0 extbl %d0
474f4: 4840 swap %d0
474f6: 4240 clrw %d0
474f8: 7402 moveq #2,%d2
474fa: 8280 orl %d0,%d1
474fc: 203c 0000 2000 movel #8192,%d0
47502: b48b cmpl %a3,%d2
47504: 6408 bccs 4750e <_Objects_Set_name+0x9e>
47506: 102a 0002 moveb %a2@(2),%d0
4750a: 49c0 extbl %d0
4750c: e188 lsll #8,%d0
4750e: 8081 orl %d1,%d0
47510: 7203 moveq #3,%d1
47512: b28b cmpl %a3,%d1
47514: 6408 bccs 4751e <_Objects_Set_name+0xae>
47516: 142a 0003 moveb %a2@(3),%d2
4751a: 49c2 extbl %d2
4751c: 6002 bras 47520 <_Objects_Set_name+0xb0>
4751e: 7420 moveq #32,%d2
47520: 8082 orl %d2,%d0
47522: 2940 000c movel %d0,%a4@(12)
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
47526: 7001 moveq #1,%d0
47528: 6002 bras 4752c <_Objects_Set_name+0xbc>
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
if ( !d )
return false;
4752a: 4200 clrb %d0
);
}
return true;
}
4752c: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
47532: 4e5e unlk %fp
...
000458b0 <_POSIX_Keys_Free_memory>:
#include <rtems/posix/key.h>
void _POSIX_Keys_Free_memory(
POSIX_Keys_Control *the_key
)
{
458b0: 4e56 0000 linkw %fp,#0
458b4: 2f0b movel %a3,%sp@-
uint32_t the_api;
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ )
_Workspace_Free( the_key->Values[ the_api ] );
458b6: 47f9 0004 9910 lea 49910 <_Workspace_Free>,%a3
#include <rtems/posix/key.h>
void _POSIX_Keys_Free_memory(
POSIX_Keys_Control *the_key
)
{
458bc: 2f0a movel %a2,%sp@-
458be: 246e 0008 moveal %fp@(8),%a2
uint32_t the_api;
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ )
_Workspace_Free( the_key->Values[ the_api ] );
458c2: 2f2a 0018 movel %a2@(24),%sp@-
458c6: 4e93 jsr %a3@
458c8: 2f2a 001c movel %a2@(28),%sp@-
458cc: 4e93 jsr %a3@
458ce: 2d6a 0020 0008 movel %a2@(32),%fp@(8)
458d4: 508f addql #8,%sp
}
458d6: 246e fff8 moveal %fp@(-8),%a2
458da: 266e fffc moveal %fp@(-4),%a3
458de: 4e5e unlk %fp
)
{
uint32_t the_api;
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ )
_Workspace_Free( the_key->Values[ the_api ] );
458e0: 4ef9 0004 9910 jmp 49910 <_Workspace_Free>
...
0004c5a0 <_POSIX_Keys_Run_destructors>:
4c5a0: 7218 moveq #24,%d1
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
4c5a2: 4e56 ffe8 linkw %fp,#-24
Objects_Maximum thread_index = _Objects_Get_index( thread->Object.id );
4c5a6: 206e 0008 moveal %fp@(8),%a0
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
4c5aa: 48d7 047c moveml %d2-%d6/%a2,%sp@
Objects_Maximum thread_index = _Objects_Get_index( thread->Object.id );
4c5ae: 2428 0008 movel %a0@(8),%d2
4c5b2: 2002 movel %d2,%d0
4c5b4: e2a8 lsrl %d1,%d0
4c5b6: 123c 0007 moveb #7,%d1
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
4c5ba: 0282 0000 ffff andil #65535,%d2
4c5c0: c081 andl %d1,%d0
4c5c2: e58a lsll #2,%d2
4c5c4: 2a00 movel %d0,%d5
4c5c6: 5a85 addql #5,%d5
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
4c5c8: 4286 clrl %d6
4c5ca: 7601 moveq #1,%d3
*/
while ( !done ) {
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
4c5cc: 7201 moveq #1,%d1
for ( index = 1 ; index <= max ; ++index ) {
4c5ce: 3c39 0005 eeee movew 5eeee <_POSIX_Keys_Information+0xe>,%d6
4c5d4: 6030 bras 4c606 <_POSIX_Keys_Run_destructors+0x66>
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
4c5d6: 2079 0005 eef8 moveal 5eef8 <_POSIX_Keys_Information+0x18>,%a0
4c5dc: 2070 4c00 moveal %a0@(00000000,%d4:l:4),%a0
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
4c5e0: 4a88 tstl %a0
4c5e2: 6720 beqs 4c604 <_POSIX_Keys_Run_destructors+0x64>
4c5e4: 4aa8 0010 tstl %a0@(16)
4c5e8: 671a beqs 4c604 <_POSIX_Keys_Run_destructors+0x64>
void *value = key->Values [ thread_api ][ thread_index ];
4c5ea: 2470 5c00 moveal %a0@(00000000,%d5:l:4),%a2
4c5ee: d5c2 addal %d2,%a2
4c5f0: 2252 moveal %a2@,%a1
if ( value != NULL ) {
4c5f2: 4a89 tstl %a1
4c5f4: 670e beqs 4c604 <_POSIX_Keys_Run_destructors+0x64><== ALWAYS TAKEN
key->Values [ thread_api ][ thread_index ] = NULL;
4c5f6: 4292 clrl %a2@ <== NOT EXECUTED
(*key->destructor)( value );
4c5f8: 2f09 movel %a1,%sp@- <== NOT EXECUTED
4c5fa: 2068 0010 moveal %a0@(16),%a0 <== NOT EXECUTED
4c5fe: 4e90 jsr %a0@ <== NOT EXECUTED
4c600: 588f addql #4,%sp <== NOT EXECUTED
done = false;
4c602: 4201 clrb %d1 <== NOT EXECUTED
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
4c604: 5283 addql #1,%d3
4c606: 4284 clrl %d4
4c608: 3803 movew %d3,%d4
4c60a: bc84 cmpl %d4,%d6
4c60c: 64c8 bccs 4c5d6 <_POSIX_Keys_Run_destructors+0x36>
* number of iterations. An infinite loop may happen if destructors set
* thread specific data. This can be considered dubious.
*
* Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
*/
while ( !done ) {
4c60e: 4a01 tstb %d1
4c610: 67b6 beqs 4c5c8 <_POSIX_Keys_Run_destructors+0x28><== NEVER TAKEN
done = false;
}
}
}
}
}
4c612: 4cee 047c ffe8 moveml %fp@(-24),%d2-%d6/%a2
4c618: 4e5e unlk %fp <== NOT EXECUTED
00049fc0 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
49fc0: 4e56 ffe4 linkw %fp,#-28
49fc4: 48d7 043c moveml %d2-%d5/%a2,%sp@
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd (
mqd_t id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control_fd *) _Objects_Get(
49fc8: 486e fff8 pea %fp@(-8)
49fcc: 242e 0008 movel %fp@(8),%d2
49fd0: 2f02 movel %d2,%sp@-
49fd2: 4879 0006 7144 pea 67144 <_POSIX_Message_queue_Information_fds>
49fd8: 246e 0014 moveal %fp@(20),%a2
49fdc: 162e 001b moveb %fp@(27),%d3
49fe0: 4eb9 0004 ce3c jsr 4ce3c <_Objects_Get>
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
49fe6: 4fef 000c lea %sp@(12),%sp
49fea: 4aae fff8 tstl %fp@(-8)
49fee: 6600 00be bnew 4a0ae <_POSIX_Message_queue_Receive_support+0xee>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
49ff2: 2040 moveal %d0,%a0
49ff4: 7803 moveq #3,%d4
49ff6: 7a01 moveq #1,%d5
49ff8: 2228 0014 movel %a0@(20),%d1
49ffc: c881 andl %d1,%d4
49ffe: ba84 cmpl %d4,%d5
4a000: 660a bnes 4a00c <_POSIX_Message_queue_Receive_support+0x4c>
_Thread_Enable_dispatch();
4a002: 4eb9 0004 dad0 jsr 4dad0 <_Thread_Enable_dispatch>
4a008: 6000 00a4 braw 4a0ae <_POSIX_Message_queue_Receive_support+0xee>
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
4a00c: 2068 0010 moveal %a0@(16),%a0
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
4a010: 2028 0066 movel %a0@(102),%d0
4a014: b0ae 0010 cmpl %fp@(16),%d0
4a018: 6316 blss 4a030 <_POSIX_Message_queue_Receive_support+0x70>
_Thread_Enable_dispatch();
4a01a: 4eb9 0004 dad0 jsr 4dad0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
4a020: 4eb9 0005 3158 jsr 53158 <__errno>
4a026: 727a moveq #122,%d1
4a028: 2040 moveal %d0,%a0
4a02a: 2081 movel %d1,%a0@
4a02c: 6000 008c braw 4a0ba <_POSIX_Message_queue_Receive_support+0xfa>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
4a030: 70ff moveq #-1,%d0
4a032: 2d40 fffc movel %d0,%fp@(-4)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
4a036: 4a03 tstb %d3
4a038: 670a beqs 4a044 <_POSIX_Message_queue_Receive_support+0x84>
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
4a03a: 0801 000e btst #14,%d1
4a03e: 57c0 seq %d0
4a040: 4480 negl %d0
4a042: 6002 bras 4a046 <_POSIX_Message_queue_Receive_support+0x86>
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
4a044: 4200 clrb %d0
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
4a046: 2f2e 001c movel %fp@(28),%sp@-
4a04a: 0280 0000 00ff andil #255,%d0
4a050: 2f00 movel %d0,%sp@-
4a052: 486e fffc pea %fp@(-4)
4a056: 2f2e 000c movel %fp@(12),%sp@-
4a05a: 2f02 movel %d2,%sp@-
4a05c: 4868 001a pea %a0@(26)
4a060: 4eb9 0004 bf28 jsr 4bf28 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
4a066: 4eb9 0004 dad0 jsr 4dad0 <_Thread_Enable_dispatch>
4a06c: 2079 0006 71b6 moveal 671b6 <_Per_CPU_Information+0xc>,%a0
if (msg_prio) {
4a072: 4fef 0018 lea %sp@(24),%sp
4a076: 4a8a tstl %a2
4a078: 670a beqs 4a084 <_POSIX_Message_queue_Receive_support+0xc4><== NEVER TAKEN
RTEMS_INLINE_ROUTINE unsigned int _POSIX_Message_queue_Priority_from_core(
CORE_message_queue_Submit_types priority
)
{
/* absolute value without a library dependency */
return ((priority >= 0) ? priority : -priority);
4a07a: 2028 0024 movel %a0@(36),%d0
4a07e: 6c02 bges 4a082 <_POSIX_Message_queue_Receive_support+0xc2>
4a080: 4480 negl %d0
*msg_prio = _POSIX_Message_queue_Priority_from_core(
4a082: 2480 movel %d0,%a2@
_Thread_Executing->Wait.count
);
}
if ( !_Thread_Executing->Wait.return_code )
4a084: 4aa8 0034 tstl %a0@(52)
4a088: 6606 bnes 4a090 <_POSIX_Message_queue_Receive_support+0xd0>
return length_out;
4a08a: 202e fffc movel %fp@(-4),%d0
4a08e: 602c bras 4a0bc <_POSIX_Message_queue_Receive_support+0xfc>
rtems_set_errno_and_return_minus_one(
4a090: 4eb9 0005 3158 jsr 53158 <__errno>
4a096: 2079 0006 71b6 moveal 671b6 <_Per_CPU_Information+0xc>,%a0
4a09c: 2440 moveal %d0,%a2
4a09e: 2f28 0034 movel %a0@(52),%sp@-
4a0a2: 4eb9 0004 a2d8 jsr 4a2d8 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
4a0a8: 588f addql #4,%sp
4a0aa: 2480 movel %d0,%a2@
4a0ac: 600c bras 4a0ba <_POSIX_Message_queue_Receive_support+0xfa>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
4a0ae: 4eb9 0005 3158 jsr 53158 <__errno>
4a0b4: 2040 moveal %d0,%a0
4a0b6: 7009 moveq #9,%d0
4a0b8: 2080 movel %d0,%a0@
4a0ba: 70ff moveq #-1,%d0
}
4a0bc: 4cee 043c ffe4 moveml %fp@(-28),%d2-%d5/%a2
4a0c2: 4e5e unlk %fp
...
0004a450 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
4a450: 4e56 0000 linkw %fp,#0
4a454: 226e 0008 moveal %fp@(8),%a1
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a458: 2069 0102 moveal %a1@(258),%a0
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
4a45c: 4aa8 00d8 tstl %a0@(216)
4a460: 6634 bnes 4a496 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x46><== NEVER TAKEN
4a462: 7001 moveq #1,%d0
4a464: b0a8 00dc cmpl %a0@(220),%d0
4a468: 662c bnes 4a496 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x46>
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
4a46a: 4aa8 00e0 tstl %a0@(224)
4a46e: 6726 beqs 4a496 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x46>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
4a470: 2039 0005 f00c movel 5f00c <_Thread_Dispatch_disable_level>,%d0
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
4a476: 4878 ffff pea ffffffff <LESS>
4a47a: 5380 subql #1,%d0
4a47c: 23c0 0005 f00c movel %d0,5f00c <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
4a482: 2039 0005 f00c movel 5f00c <_Thread_Dispatch_disable_level>,%d0
4a488: 2f09 movel %a1,%sp@-
4a48a: 4eb9 0004 aab0 jsr 4aab0 <_POSIX_Thread_Exit>
4a490: 508f addql #8,%sp
} else
_Thread_Enable_dispatch();
}
4a492: 4e5e unlk %fp
4a494: 4e75 rts
4a496: 4e5e unlk %fp
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
} else
_Thread_Enable_dispatch();
4a498: 4ef9 0004 7eec jmp 47eec <_Thread_Enable_dispatch>
...
0004b58c <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
4b58c: 4e56 ffec linkw %fp,#-20
4b590: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
4b594: 246e 000c moveal %fp@(12),%a2
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
4b598: 2f12 movel %a2@,%sp@-
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
4b59a: 242e 0008 movel %fp@(8),%d2
4b59e: 266e 0010 moveal %fp@(16),%a3
4b5a2: 286e 0014 moveal %fp@(20),%a4
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
4b5a6: 4eb9 0004 b568 jsr 4b568 <_POSIX_Priority_Is_valid>
4b5ac: 588f addql #4,%sp
4b5ae: 4a00 tstb %d0
4b5b0: 677a beqs 4b62c <_POSIX_Thread_Translate_sched_param+0xa0><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
4b5b2: 4293 clrl %a3@
*budget_callout = NULL;
4b5b4: 4294 clrl %a4@
if ( policy == SCHED_OTHER ) {
4b5b6: 4a82 tstl %d2
4b5b8: 6606 bnes 4b5c0 <_POSIX_Thread_Translate_sched_param+0x34>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
4b5ba: 7401 moveq #1,%d2
4b5bc: 2682 movel %d2,%a3@
4b5be: 6068 bras 4b628 <_POSIX_Thread_Translate_sched_param+0x9c>
return 0;
}
if ( policy == SCHED_FIFO ) {
4b5c0: 7001 moveq #1,%d0
4b5c2: b082 cmpl %d2,%d0
4b5c4: 6762 beqs 4b628 <_POSIX_Thread_Translate_sched_param+0x9c>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
4b5c6: 103c 0002 moveb #2,%d0
4b5ca: b082 cmpl %d2,%d0
4b5cc: 6608 bnes 4b5d6 <_POSIX_Thread_Translate_sched_param+0x4a>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
4b5ce: 7202 moveq #2,%d1
return 0;
4b5d0: 4200 clrb %d0
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
4b5d2: 2681 movel %d1,%a3@
return 0;
4b5d4: 6058 bras 4b62e <_POSIX_Thread_Translate_sched_param+0xa2>
}
if ( policy == SCHED_SPORADIC ) {
4b5d6: 7004 moveq #4,%d0
4b5d8: b082 cmpl %d2,%d0
4b5da: 6650 bnes 4b62c <_POSIX_Thread_Translate_sched_param+0xa0>
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
4b5dc: 4aaa 0008 tstl %a2@(8)
4b5e0: 6606 bnes 4b5e8 <_POSIX_Thread_Translate_sched_param+0x5c>
4b5e2: 4aaa 000c tstl %a2@(12)
4b5e6: 6744 beqs 4b62c <_POSIX_Thread_Translate_sched_param+0xa0><== NEVER TAKEN
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
4b5e8: 4aaa 0010 tstl %a2@(16)
4b5ec: 6606 bnes 4b5f4 <_POSIX_Thread_Translate_sched_param+0x68>
4b5ee: 4aaa 0014 tstl %a2@(20)
4b5f2: 6738 beqs 4b62c <_POSIX_Thread_Translate_sched_param+0xa0><== NEVER TAKEN
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
4b5f4: 486a 0008 pea %a2@(8)
4b5f8: 4bf9 0004 94b8 lea 494b8 <_Timespec_To_ticks>,%a5
4b5fe: 4e95 jsr %a5@
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
4b600: 486a 0010 pea %a2@(16)
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
4b604: 2400 movel %d0,%d2
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
4b606: 4e95 jsr %a5@
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
4b608: 508f addql #8,%sp
4b60a: b082 cmpl %d2,%d0
4b60c: 621e bhis 4b62c <_POSIX_Thread_Translate_sched_param+0xa0>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
4b60e: 2f2a 0004 movel %a2@(4),%sp@-
4b612: 4eb9 0004 b568 jsr 4b568 <_POSIX_Priority_Is_valid>
4b618: 588f addql #4,%sp
4b61a: 4a00 tstb %d0
4b61c: 670e beqs 4b62c <_POSIX_Thread_Translate_sched_param+0xa0>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
4b61e: 7003 moveq #3,%d0
4b620: 2680 movel %d0,%a3@
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
4b622: 28bc 0004 5f02 movel #286466,%a4@
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
4b628: 4280 clrl %d0
4b62a: 6002 bras 4b62e <_POSIX_Thread_Translate_sched_param+0xa2>
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
return EINVAL;
4b62c: 7016 moveq #22,%d0
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
4b62e: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4b634: 4e5e unlk %fp <== NOT EXECUTED
0004a69a <_POSIX_Threads_Delete_extension>:
*/
void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
4a69a: 4e56 ffec linkw %fp,#-20
4a69e: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
4a6a2: 246e 000c moveal %fp@(12),%a2
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
4a6a6: 49f9 0004 807c lea 4807c <_Thread_queue_Dequeue>,%a4
{
Thread_Control *the_thread;
POSIX_API_Control *api;
void **value_ptr;
api = deleted->API_Extensions[ THREAD_API_POSIX ];
4a6ac: 266a 0102 moveal %a2@(258),%a3
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
4a6b0: 240b movel %a3,%d2
4a6b2: 0682 0000 0044 addil #68,%d2
api = deleted->API_Extensions[ THREAD_API_POSIX ];
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
4a6b8: 2f0a movel %a2,%sp@-
4a6ba: 4eb9 0004 c538 jsr 4c538 <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
4a6c0: 2f0a movel %a2,%sp@-
4a6c2: 4eb9 0004 c5a0 jsr 4c5a0 <_POSIX_Keys_Run_destructors>
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
4a6c8: 262a 0028 movel %a2@(40),%d3
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
4a6cc: 508f addql #8,%sp
4a6ce: 6008 bras 4a6d8 <_POSIX_Threads_Delete_extension+0x3e>
*(void **)the_thread->Wait.return_argument = value_ptr;
4a6d0: 2240 moveal %d0,%a1 <== NOT EXECUTED
4a6d2: 2069 0028 moveal %a1@(40),%a0 <== NOT EXECUTED
4a6d6: 2083 movel %d3,%a0@ <== NOT EXECUTED
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
4a6d8: 2f02 movel %d2,%sp@-
4a6da: 4e94 jsr %a4@
4a6dc: 588f addql #4,%sp
4a6de: 4a80 tstl %d0
4a6e0: 66ee bnes 4a6d0 <_POSIX_Threads_Delete_extension+0x36><== NEVER TAKEN
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
4a6e2: 103c 0004 moveb #4,%d0
4a6e6: b0ab 0084 cmpl %a3@(132),%d0
4a6ea: 660c bnes 4a6f8 <_POSIX_Threads_Delete_extension+0x5e>
(void) _Watchdog_Remove( &api->Sporadic_timer );
4a6ec: 486b 00a8 pea %a3@(168)
4a6f0: 4eb9 0004 8ab8 jsr 48ab8 <_Watchdog_Remove>
4a6f6: 588f addql #4,%sp
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
4a6f8: 42aa 0102 clrl %a2@(258)
_Workspace_Free( api );
4a6fc: 2d4b 0008 movel %a3,%fp@(8)
}
4a700: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4
4a706: 4e5e unlk %fp
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
4a708: 4ef9 0004 8c2c jmp 48c2c <_Workspace_Free>
00045c2c <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
45c2c: 4e56 ff98 linkw %fp,#-104
45c30: 48d7 3c7c moveml %d2-%d6/%a2-%a5,%sp@
uint32_t maximum;
posix_initialization_threads_table *user_threads;
pthread_t thread_id;
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
45c34: 2479 0005 e024 moveal 5e024 <Configuration_POSIX_API+0x34>,%a2
maximum = Configuration_POSIX_API.number_of_initialization_threads;
45c3a: 2839 0005 e020 movel 5e020 <Configuration_POSIX_API+0x30>,%d4
if ( !user_threads || maximum == 0 )
45c40: 4a8a tstl %a2
45c42: 676a beqs 45cae <_POSIX_Threads_Initialize_user_threads_body+0x82><== NEVER TAKEN
45c44: 4a84 tstl %d4
45c46: 6766 beqs 45cae <_POSIX_Threads_Initialize_user_threads_body+0x82><== NEVER TAKEN
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
45c48: 240e movel %fp,%d2
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
status = pthread_create(
45c4a: 2a0e movel %fp,%d5
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
maximum = Configuration_POSIX_API.number_of_initialization_threads;
if ( !user_threads || maximum == 0 )
45c4c: 4283 clrl %d3
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
45c4e: 0682 ffff ffbc addil #-68,%d2
45c54: 2c3c 0004 b638 movel #308792,%d6
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
45c5a: 4bf9 0004 b664 lea 4b664 <pthread_attr_setinheritsched>,%a5
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
45c60: 49f9 0004 b69c lea 4b69c <pthread_attr_setstacksize>,%a4
status = pthread_create(
45c66: 5985 subql #4,%d5
45c68: 47f9 0004 5904 lea 45904 <pthread_create>,%a3
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
45c6e: 2f02 movel %d2,%sp@-
45c70: 2046 moveal %d6,%a0
45c72: 4e90 jsr %a0@
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
45c74: 4878 0002 pea 2 <DOUBLE_FLOAT>
45c78: 2f02 movel %d2,%sp@-
45c7a: 4e95 jsr %a5@
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
45c7c: 2f2a 0004 movel %a2@(4),%sp@-
45c80: 2f02 movel %d2,%sp@-
45c82: 4e94 jsr %a4@
status = pthread_create(
45c84: 42a7 clrl %sp@-
45c86: 2f12 movel %a2@,%sp@-
45c88: 2f02 movel %d2,%sp@-
45c8a: 2f05 movel %d5,%sp@-
45c8c: 4e93 jsr %a3@
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
45c8e: 4fef 0024 lea %sp@(36),%sp
45c92: 4a80 tstl %d0
45c94: 6710 beqs 45ca6 <_POSIX_Threads_Initialize_user_threads_body+0x7a>
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
45c96: 2f00 movel %d0,%sp@-
45c98: 4878 0001 pea 1 <ADD>
45c9c: 4878 0002 pea 2 <DOUBLE_FLOAT>
45ca0: 4eb9 0004 79a8 jsr 479a8 <_Internal_error_Occurred>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
45ca6: 5283 addql #1,%d3
45ca8: 508a addql #8,%a2
45caa: b883 cmpl %d3,%d4
45cac: 66c0 bnes 45c6e <_POSIX_Threads_Initialize_user_threads_body+0x42><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
45cae: 4cee 3c7c ff98 moveml %fp@(-104),%d2-%d6/%a2-%a5
45cb4: 4e5e unlk %fp <== NOT EXECUTED
0004a822 <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
4a822: 4e56 0000 linkw %fp,#0
4a826: 2f0b movel %a3,%sp@-
4a828: 2f0a movel %a2,%sp@-
4a82a: 246e 000c moveal %fp@(12),%a2
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a82e: 266a 0102 moveal %a2@(258),%a3
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
4a832: 486b 0098 pea %a3@(152)
4a836: 4eb9 0004 b56c jsr 4b56c <_Timespec_To_ticks>
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
4a83c: 588f addql #4,%sp
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
the_thread->cpu_time_budget = ticks;
4a83e: 2540 0076 movel %d0,%a2@(118)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
4a842: 4280 clrl %d0
4a844: 1039 0005 d1fa moveb 5d1fa <rtems_maximum_priority>,%d0
4a84a: 90ab 0088 subl %a3@(136),%d0
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
4a84e: 2540 0018 movel %d0,%a2@(24)
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
4a852: 4aaa 001c tstl %a2@(28)
4a856: 6618 bnes 4a870 <_POSIX_Threads_Sporadic_budget_TSR+0x4e><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
4a858: b0aa 0014 cmpl %a2@(20),%d0
4a85c: 6412 bccs 4a870 <_POSIX_Threads_Sporadic_budget_TSR+0x4e>
_Thread_Change_priority( the_thread, new_priority, true );
4a85e: 4878 0001 pea 1 <ADD>
4a862: 2f00 movel %d0,%sp@-
4a864: 2f0a movel %a2,%sp@-
4a866: 4eb9 0004 7930 jsr 47930 <_Thread_Change_priority>
4a86c: 4fef 000c lea %sp@(12),%sp
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
4a870: 486b 0090 pea %a3@(144)
4a874: 4eb9 0004 b56c jsr 4b56c <_Timespec_To_ticks>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
4a87a: 246e fff8 moveal %fp@(-8),%a2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
4a87e: 588f addql #4,%sp
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
4a880: 2740 00b4 movel %d0,%a3@(180)
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
4a884: 47eb 00a8 lea %a3@(168),%a3
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
4a888: 203c 0005 ec50 movel #388176,%d0
4a88e: 2d4b 000c movel %a3,%fp@(12)
}
4a892: 266e fffc moveal %fp@(-4),%a3
4a896: 2d40 0008 movel %d0,%fp@(8)
4a89a: 4e5e unlk %fp
4a89c: 4ef9 0004 8994 jmp 48994 <_Watchdog_Insert>
0004a8a2 <_POSIX_Threads_Sporadic_budget_callout>:
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
4a8a2: 70ff moveq #-1,%d0
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
4a8a4: 4e56 0000 linkw %fp,#0
4a8a8: 206e 0008 moveal %fp@(8),%a0
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
4a8ac: 2140 0076 movel %d0,%a0@(118)
4a8b0: 4280 clrl %d0
4a8b2: 1039 0005 d1fa moveb 5d1fa <rtems_maximum_priority>,%d0
)
{
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a8b8: 2268 0102 moveal %a0@(258),%a1
4a8bc: 90a9 008c subl %a1@(140),%d0
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority);
the_thread->real_priority = new_priority;
4a8c0: 2140 0018 movel %d0,%a0@(24)
*/
#if 0
printk( "callout %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
4a8c4: 4aa8 001c tstl %a0@(28)
4a8c8: 6618 bnes 4a8e2 <_POSIX_Threads_Sporadic_budget_callout+0x40><== NEVER TAKEN
/*
* Make sure we are actually lowering it. If they have lowered it
* to logically lower than sched_ss_low_priority, then we do not want to
* change it.
*/
if ( the_thread->current_priority < new_priority ) {
4a8ca: b0a8 0014 cmpl %a0@(20),%d0
4a8ce: 6312 blss 4a8e2 <_POSIX_Threads_Sporadic_budget_callout+0x40><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
4a8d0: 4878 0001 pea 1 <ADD>
4a8d4: 2f00 movel %d0,%sp@-
4a8d6: 2f08 movel %a0,%sp@-
4a8d8: 4eb9 0004 7930 jsr 47930 <_Thread_Change_priority>
4a8de: 4fef 000c lea %sp@(12),%sp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
4a8e2: 4e5e unlk %fp <== NOT EXECUTED
00045764 <_POSIX_Timer_TSR>:
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR(
Objects_Id timer __attribute__((unused)),
void *data)
{
45764: 4e56 0000 linkw %fp,#0
45768: 2f0a movel %a2,%sp@-
4576a: 246e 000c moveal %fp@(12),%a2
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
4576e: 52aa 0066 addql #1,%a2@(102)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
45772: 4aaa 0052 tstl %a2@(82)
45776: 6606 bnes 4577e <_POSIX_Timer_TSR+0x1a>
45778: 4aaa 0056 tstl %a2@(86)
4577c: 6736 beqs 457b4 <_POSIX_Timer_TSR+0x50> <== NEVER TAKEN
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
4577e: 2f0a movel %a2,%sp@-
45780: 4879 0004 5764 pea 45764 <_POSIX_Timer_TSR>
45786: 2f2a 0008 movel %a2@(8),%sp@-
4578a: 2f2a 0062 movel %a2@(98),%sp@-
4578e: 486a 0010 pea %a2@(16)
45792: 4eb9 0004 aff4 jsr 4aff4 <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
45798: 4fef 0014 lea %sp@(20),%sp
4579c: 4a00 tstb %d0
4579e: 672e beqs 457ce <_POSIX_Timer_TSR+0x6a> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
457a0: 486a 006a pea %a2@(106)
457a4: 4eb9 0004 6cf4 jsr 46cf4 <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
457aa: 588f addql #4,%sp
457ac: 7003 moveq #3,%d0
457ae: 1540 003c moveb %d0,%a2@(60)
457b2: 6006 bras 457ba <_POSIX_Timer_TSR+0x56>
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
457b4: 7004 moveq #4,%d0 <== NOT EXECUTED
457b6: 1540 003c moveb %d0,%a2@(60) <== NOT EXECUTED
/*
* The sending of the signal to the process running the handling function
* specified for that signal is simulated
*/
if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) {
457ba: 2f2a 0042 movel %a2@(66),%sp@-
457be: 2f2a 0038 movel %a2@(56),%sp@-
457c2: 4eb9 0004 abe0 jsr 4abe0 <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
457c8: 508f addql #8,%sp
457ca: 42aa 0066 clrl %a2@(102)
}
457ce: 246e fffc moveal %fp@(-4),%a2
457d2: 4e5e unlk %fp
...
0004c61c <_POSIX_signals_Check_signal>:
{
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
4c61c: 4280 clrl %d0
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c61e: 4e56 ffb4 linkw %fp,#-76
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
4c622: 102e 0013 moveb %fp@(19),%d0
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c626: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
4c62a: 4878 0001 pea 1 <ADD>
4c62e: 2a0e movel %fp,%d5
4c630: 0685 ffff fff4 addil #-12,%d5
4c636: 2f00 movel %d0,%sp@-
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c638: 242e 000c movel %fp@(12),%d2
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
4c63c: 2f05 movel %d5,%sp@-
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c63e: 246e 0008 moveal %fp@(8),%a2
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
4c642: 2f02 movel %d2,%sp@-
4c644: 2f0a movel %a2,%sp@-
4c646: 4eb9 0004 c6f4 jsr 4c6f4 <_POSIX_signals_Clear_signals>
4c64c: 4fef 0014 lea %sp@(20),%sp
4c650: 4a00 tstb %d0
4c652: 6700 0092 beqw 4c6e6 <_POSIX_signals_Check_signal+0xca>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
4c656: 2002 movel %d2,%d0
4c658: 2602 movel %d2,%d3
4c65a: e588 lsll #2,%d0
4c65c: e98b lsll #4,%d3
4c65e: 9680 subl %d0,%d3
4c660: 2043 moveal %d3,%a0
4c662: d1fc 0005 f034 addal #389172,%a0
4c668: 7001 moveq #1,%d0
4c66a: 2668 0008 moveal %a0@(8),%a3
4c66e: b08b cmpl %a3,%d0
4c670: 6774 beqs 4c6e6 <_POSIX_signals_Check_signal+0xca><== NEVER TAKEN
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
4c672: 2028 0004 movel %a0@(4),%d0
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
4c676: 282a 00d0 movel %a2@(208),%d4
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
4c67a: 8084 orl %d4,%d0
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
4c67c: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
4c682: 41e8 0020 lea %a0@(32),%a0
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
4c686: 2540 00d0 movel %d0,%a2@(208)
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
4c68a: 4878 0028 pea 28 <OPER2+0x14>
4c68e: 2f08 movel %a0,%sp@-
4c690: 486e ffcc pea %fp@(-52)
4c694: 4eb9 0004 d588 jsr 4d588 <memcpy>
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
4c69a: 4fef 000c lea %sp@(12),%sp
4c69e: 41f9 0005 f034 lea 5f034 <_POSIX_signals_Vectors>,%a0
4c6a4: 7002 moveq #2,%d0
4c6a6: b0b0 3800 cmpl %a0@(00000000,%d3:l),%d0
4c6aa: 660e bnes 4c6ba <_POSIX_signals_Check_signal+0x9e>
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
4c6ac: 42a7 clrl %sp@-
4c6ae: 2f05 movel %d5,%sp@-
4c6b0: 2f02 movel %d2,%sp@-
4c6b2: 4e93 jsr %a3@
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
4c6b4: 4fef 000c lea %sp@(12),%sp
4c6b8: 6006 bras 4c6c0 <_POSIX_signals_Check_signal+0xa4>
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
4c6ba: 2f02 movel %d2,%sp@-
4c6bc: 4e93 jsr %a3@
break;
4c6be: 588f addql #4,%sp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
4c6c0: 4878 0028 pea 28 <OPER2+0x14>
4c6c4: 486e ffcc pea %fp@(-52)
4c6c8: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
4c6ce: 41e8 0020 lea %a0@(32),%a0
4c6d2: 2f08 movel %a0,%sp@-
4c6d4: 4eb9 0004 d588 jsr 4d588 <memcpy>
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
4c6da: 4fef 000c lea %sp@(12),%sp
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
4c6de: 2544 00d0 movel %d4,%a2@(208)
return true;
4c6e2: 7001 moveq #1,%d0
4c6e4: 6002 bras 4c6e8 <_POSIX_signals_Check_signal+0xcc>
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
return false;
4c6e6: 4200 clrb %d0
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
4c6e8: 4cee 0c3c ffb4 moveml %fp@(-76),%d2-%d5/%a2-%a3
4c6ee: 4e5e unlk %fp
...
0004cce0 <_POSIX_signals_Clear_process_signals>:
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
4cce0: 203c 0000 0700 movel #1792,%d0
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
4cce6: 4e56 0000 linkw %fp,#0
4ccea: 222e 0008 movel %fp@(8),%d1
4ccee: 2f03 movel %d3,%sp@-
4ccf0: 2f02 movel %d2,%sp@-
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
4ccf2: 40c2 movew %sr,%d2
4ccf4: 8082 orl %d2,%d0
4ccf6: 46c0 movew %d0,%sr
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
4ccf8: 2601 movel %d1,%d3
4ccfa: 2001 movel %d1,%d0
4ccfc: 41f9 0005 f034 lea 5f034 <_POSIX_signals_Vectors>,%a0
4cd02: e58b lsll #2,%d3
4cd04: e988 lsll #4,%d0
4cd06: 9083 subl %d3,%d0
4cd08: 7602 moveq #2,%d3
4cd0a: b6b0 0800 cmpl %a0@(00000000,%d0:l),%d3
4cd0e: 6610 bnes 4cd20 <_POSIX_signals_Clear_process_signals+0x40>
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
4cd10: 2040 moveal %d0,%a0
4cd12: d1fc 0005 f22c addal #389676,%a0
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
4cd18: 2008 movel %a0,%d0
4cd1a: 5880 addql #4,%d0
4cd1c: b090 cmpl %a0@,%d0
4cd1e: 660e bnes 4cd2e <_POSIX_signals_Clear_process_signals+0x4e><== NEVER TAKEN
4cd20: 5381 subql #1,%d1
4cd22: 7001 moveq #1,%d0
4cd24: e3a8 lsll %d1,%d0
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
4cd26: 4680 notl %d0
4cd28: c1b9 0005 f228 andl %d0,5f228 <_POSIX_signals_Pending>
}
_ISR_Enable( level );
4cd2e: 46c2 movew %d2,%sr
}
4cd30: 241f movel %sp@+,%d2
4cd32: 261f movel %sp@+,%d3
4cd34: 4e5e unlk %fp <== NOT EXECUTED
000462dc <_POSIX_signals_Get_lowest>:
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
462dc: 701b moveq #27,%d0
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
462de: 4e56 fff4 linkw %fp,#-12
462e2: 48d7 001c moveml %d2-%d4,%sp@
462e6: 242e 0008 movel %fp@(8),%d2
462ea: 7601 moveq #1,%d3
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
462ec: 2200 movel %d0,%d1
462ee: 5381 subql #1,%d1
462f0: 2803 movel %d3,%d4
462f2: e3ac lsll %d1,%d4
462f4: 2204 movel %d4,%d1
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
462f6: c282 andl %d2,%d1
462f8: 6626 bnes 46320 <_POSIX_signals_Get_lowest+0x44> <== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
462fa: 5280 addql #1,%d0
462fc: 123c 0020 moveb #32,%d1
46300: b280 cmpl %d0,%d1
46302: 66e8 bnes 462ec <_POSIX_signals_Get_lowest+0x10>
46304: 7001 moveq #1,%d0
46306: 7601 moveq #1,%d3
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
46308: 2200 movel %d0,%d1
4630a: 5381 subql #1,%d1
4630c: 2803 movel %d3,%d4
4630e: e3ac lsll %d1,%d4
46310: 2204 movel %d4,%d1
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
46312: c282 andl %d2,%d1
46314: 660a bnes 46320 <_POSIX_signals_Get_lowest+0x44>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
46316: 5280 addql #1,%d0
46318: 123c 001b moveb #27,%d1
4631c: b280 cmpl %d0,%d1
4631e: 66e8 bnes 46308 <_POSIX_signals_Get_lowest+0x2c> <== ALWAYS TAKEN
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
46320: 4cd7 001c moveml %sp@,%d2-%d4
46324: 4e5e unlk %fp <== NOT EXECUTED
0004a482 <_POSIX_signals_Post_switch_extension>:
*/
void _POSIX_signals_Post_switch_extension(
Thread_Control *the_thread
)
{
4a482: 4e56 ffec linkw %fp,#-20
POSIX_API_Control *api;
int signo;
ISR_Level level;
int hold_errno;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a486: 206e 0008 moveal %fp@(8),%a0
*/
void _POSIX_signals_Post_switch_extension(
Thread_Control *the_thread
)
{
4a48a: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
POSIX_API_Control *api;
int signo;
ISR_Level level;
int hold_errno;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a48e: 2468 0102 moveal %a0@(258),%a2
/*
* We need to ensure that if the signal handler executes a call
* which overwrites the unblocking status, we restore it.
*/
hold_errno = _Thread_Executing->Wait.return_code;
4a492: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
4a498: 2628 0034 movel %a0@(52),%d3
/*
* api may be NULL in case of a thread close in progress
*/
if ( !api )
4a49c: 4a8a tstl %a2
4a49e: 677a beqs 4a51a <_POSIX_signals_Post_switch_extension+0x98><== NEVER TAKEN
*
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
4a4a0: 283c 0000 0700 movel #1792,%d4
break;
}
_ISR_Enable( level );
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
_POSIX_signals_Check_signal( api, signo, false );
4a4a6: 47f9 0004 c61c lea 4c61c <_POSIX_signals_Check_signal>,%a3
*
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
4a4ac: 2004 movel %d4,%d0
4a4ae: 40c1 movew %sr,%d1
4a4b0: 8081 orl %d1,%d0
4a4b2: 46c0 movew %d0,%sr
if ( !(~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending)) ) {
4a4b4: 2039 0005 f228 movel 5f228 <_POSIX_signals_Pending>,%d0
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
4a4ba: 242a 00d0 movel %a2@(208),%d2
4a4be: 4682 notl %d2
(api->signals_pending | _POSIX_signals_Pending)) ) {
4a4c0: 80aa 00d4 orl %a2@(212),%d0
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
4a4c4: c082 andl %d2,%d0
(api->signals_pending | _POSIX_signals_Pending)) ) {
_ISR_Enable( level );
4a4c6: 46c1 movew %d1,%sr
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
4a4c8: 4a80 tstl %d0
4a4ca: 660c bnes 4a4d8 <_POSIX_signals_Post_switch_extension+0x56>
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
}
}
_Thread_Executing->Wait.return_code = hold_errno;
4a4cc: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
4a4d2: 2143 0034 movel %d3,%a0@(52)
4a4d6: 6042 bras 4a51a <_POSIX_signals_Post_switch_extension+0x98>
_ISR_Enable( level );
break;
}
_ISR_Enable( level );
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
4a4d8: 741b moveq #27,%d2
_POSIX_signals_Check_signal( api, signo, false );
4a4da: 42a7 clrl %sp@-
4a4dc: 2f02 movel %d2,%sp@-
4a4de: 2f0a movel %a2,%sp@-
4a4e0: 4e93 jsr %a3@
_POSIX_signals_Check_signal( api, signo, true );
4a4e2: 4878 0001 pea 1 <ADD>
4a4e6: 2f02 movel %d2,%sp@-
_ISR_Enable( level );
break;
}
_ISR_Enable( level );
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
4a4e8: 5282 addql #1,%d2
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
4a4ea: 2f0a movel %a2,%sp@-
4a4ec: 4e93 jsr %a3@
_ISR_Enable( level );
break;
}
_ISR_Enable( level );
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
4a4ee: 4fef 0018 lea %sp@(24),%sp
4a4f2: 7020 moveq #32,%d0
4a4f4: b082 cmpl %d2,%d0
4a4f6: 66e2 bnes 4a4da <_POSIX_signals_Post_switch_extension+0x58>
4a4f8: 7401 moveq #1,%d2
_POSIX_signals_Check_signal( api, signo, true );
}
/* Unfortunately - nothing like __SIGFIRSTNOTRT in newlib signal .h */
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
_POSIX_signals_Check_signal( api, signo, false );
4a4fa: 42a7 clrl %sp@-
4a4fc: 2f02 movel %d2,%sp@-
4a4fe: 2f0a movel %a2,%sp@-
4a500: 4e93 jsr %a3@
_POSIX_signals_Check_signal( api, signo, true );
4a502: 4878 0001 pea 1 <ADD>
4a506: 2f02 movel %d2,%sp@-
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
}
/* Unfortunately - nothing like __SIGFIRSTNOTRT in newlib signal .h */
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
4a508: 5282 addql #1,%d2
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
4a50a: 2f0a movel %a2,%sp@-
4a50c: 4e93 jsr %a3@
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
}
/* Unfortunately - nothing like __SIGFIRSTNOTRT in newlib signal .h */
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
4a50e: 4fef 0018 lea %sp@(24),%sp
4a512: 701b moveq #27,%d0
4a514: b082 cmpl %d2,%d0
4a516: 66e2 bnes 4a4fa <_POSIX_signals_Post_switch_extension+0x78>
4a518: 6092 bras 4a4ac <_POSIX_signals_Post_switch_extension+0x2a>
_POSIX_signals_Check_signal( api, signo, true );
}
}
_Thread_Executing->Wait.return_code = hold_errno;
}
4a51a: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
4a520: 4e5e unlk %fp <== NOT EXECUTED
0005ae80 <_POSIX_signals_Unblock_thread>:
5ae80: 7201 moveq #1,%d1
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
5ae82: 4e56 fff4 linkw %fp,#-12
5ae86: 226e 0010 moveal %fp@(16),%a1
5ae8a: 48d7 040c moveml %d2-%d3/%a2,%sp@
5ae8e: 242e 000c movel %fp@(12),%d2
5ae92: 2002 movel %d2,%d0
5ae94: 5380 subql #1,%d0
5ae96: 246e 0008 moveal %fp@(8),%a2
5ae9a: e1a9 lsll %d0,%d1
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
5ae9c: 202a 0010 movel %a2@(16),%d0
5aea0: 2600 movel %d0,%d3
5aea2: 0283 1000 8000 andil #268468224,%d3
{
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
5aea8: 206a 0102 moveal %a2@(258),%a0
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
5aeac: 0c83 1000 8000 cmpil #268468224,%d3
5aeb2: 6650 bnes 5af04 <_POSIX_signals_Unblock_thread+0x84>
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
5aeb4: 2001 movel %d1,%d0
5aeb6: c0aa 0030 andl %a2@(48),%d0
5aeba: 660c bnes 5aec8 <_POSIX_signals_Unblock_thread+0x48>
5aebc: 2028 00d0 movel %a0@(208),%d0
5aec0: 4680 notl %d0
5aec2: c280 andl %d0,%d1
5aec4: 6700 00a8 beqw 5af6e <_POSIX_signals_Unblock_thread+0xee>
the_thread->Wait.return_code = EINTR;
5aec8: 7004 moveq #4,%d0
the_info = (siginfo_t *) the_thread->Wait.return_argument;
5aeca: 206a 0028 moveal %a2@(40),%a0
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
the_thread->Wait.return_code = EINTR;
5aece: 2540 0034 movel %d0,%a2@(52)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
5aed2: 4a89 tstl %a1
5aed4: 660e bnes 5aee4 <_POSIX_signals_Unblock_thread+0x64>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
5aed6: 7201 moveq #1,%d1
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
5aed8: 2082 movel %d2,%a0@
the_info->si_code = SI_USER;
5aeda: 2141 0004 movel %d1,%a0@(4)
the_info->si_value.sival_int = 0;
5aede: 42a8 0008 clrl %a0@(8)
5aee2: 6012 bras 5aef6 <_POSIX_signals_Unblock_thread+0x76>
} else {
*the_info = *info;
5aee4: 4878 000c pea c <OPER1>
5aee8: 2f09 movel %a1,%sp@-
5aeea: 2f08 movel %a0,%sp@-
5aeec: 4eb9 0004 d588 jsr 4d588 <memcpy>
5aef2: 4fef 000c lea %sp@(12),%sp
}
_Thread_queue_Extract_with_proxy( the_thread );
5aef6: 2f0a movel %a2,%sp@-
5aef8: 4eb9 0004 8388 jsr 48388 <_Thread_queue_Extract_with_proxy>
return true;
5aefe: 588f addql #4,%sp
5af00: 7001 moveq #1,%d0
5af02: 606c bras 5af70 <_POSIX_signals_Unblock_thread+0xf0>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
5af04: 2428 00d0 movel %a0@(208),%d2
5af08: 4682 notl %d2
5af0a: c282 andl %d2,%d1
5af0c: 6760 beqs 5af6e <_POSIX_signals_Unblock_thread+0xee>
* it is not blocked, THEN
* we need to dispatch at the end of this ISR.
* + Any other combination, do nothing.
*/
if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) {
5af0e: 0800 001c btst #28,%d0
5af12: 673e beqs 5af52 <_POSIX_signals_Unblock_thread+0xd2>
the_thread->Wait.return_code = EINTR;
5af14: 7204 moveq #4,%d1
5af16: 2541 0034 movel %d1,%a2@(52)
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
5af1a: 2200 movel %d0,%d1
5af1c: 0281 0003 bee0 andil #245472,%d1
/*
* In pthread_cond_wait, a thread will be blocking on a thread
* queue, but is also interruptible by a POSIX signal.
*/
if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
5af22: 670c beqs 5af30 <_POSIX_signals_Unblock_thread+0xb0>
_Thread_queue_Extract_with_proxy( the_thread );
5af24: 2f0a movel %a2,%sp@-
5af26: 4eb9 0004 8388 jsr 48388 <_Thread_queue_Extract_with_proxy>
5af2c: 588f addql #4,%sp
5af2e: 603e bras 5af6e <_POSIX_signals_Unblock_thread+0xee>
else if ( _States_Is_delaying(the_thread->current_state) ) {
5af30: 44c0 movew %d0,%ccr
5af32: 6a3a bpls 5af6e <_POSIX_signals_Unblock_thread+0xee><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
5af34: 486a 0048 pea %a2@(72)
5af38: 4eb9 0004 8ab8 jsr 48ab8 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
5af3e: 2f3c 1003 fff8 movel #268697592,%sp@-
5af44: 2f0a movel %a2,%sp@-
5af46: 4eb9 0004 7a0c jsr 47a0c <_Thread_Clear_state>
5af4c: 4fef 000c lea %sp@(12),%sp
5af50: 601c bras 5af6e <_POSIX_signals_Unblock_thread+0xee>
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
5af52: 4a80 tstl %d0
5af54: 6618 bnes 5af6e <_POSIX_signals_Unblock_thread+0xee><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
5af56: 4ab9 0005 eff6 tstl 5eff6 <_Per_CPU_Information+0x8>
5af5c: 6710 beqs 5af6e <_POSIX_signals_Unblock_thread+0xee>
5af5e: b5f9 0005 effa cmpal 5effa <_Per_CPU_Information+0xc>,%a2
5af64: 6608 bnes 5af6e <_POSIX_signals_Unblock_thread+0xee><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
5af66: 7001 moveq #1,%d0
5af68: 13c0 0005 f006 moveb %d0,5f006 <_Per_CPU_Information+0x18>
}
}
return false;
5af6e: 4200 clrb %d0
}
5af70: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
5af76: 4e5e unlk %fp
...
0004bb9e <_RBTree_Extract_unprotected>:
*/
void _RBTree_Extract_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
4bb9e: 4e56 ffec linkw %fp,#-20
4bba2: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
4bba6: 286e 0008 moveal %fp@(8),%a4
4bbaa: 246e 000c moveal %fp@(12),%a2
RBTree_Node *leaf, *target;
RBTree_Color victim_color;
RBTree_Direction dir;
if (!the_node) return;
4bbae: 4a8a tstl %a2
4bbb0: 6700 0110 beqw 4bcc2 <_RBTree_Extract_unprotected+0x124>
/* check if min needs to be updated */
if (the_node == the_rbtree->first[RBT_LEFT]) {
4bbb4: b5ec 0008 cmpal %a4@(8),%a2
4bbb8: 661a bnes 4bbd4 <_RBTree_Extract_unprotected+0x36>
if (the_node->child[RBT_RIGHT])
4bbba: 202a 0008 movel %a2@(8),%d0
4bbbe: 6706 beqs 4bbc6 <_RBTree_Extract_unprotected+0x28>
the_rbtree->first[RBT_LEFT] = the_node->child[RBT_RIGHT];
4bbc0: 2940 0008 movel %d0,%a4@(8)
4bbc4: 600e bras 4bbd4 <_RBTree_Extract_unprotected+0x36>
else {
the_rbtree->first[RBT_LEFT] = the_node->parent;
4bbc6: 2012 movel %a2@,%d0
4bbc8: 2940 0008 movel %d0,%a4@(8)
if(_RBTree_Are_nodes_equal((RBTree_Node *)the_rbtree,
4bbcc: b08c cmpl %a4,%d0
4bbce: 6604 bnes 4bbd4 <_RBTree_Extract_unprotected+0x36>
the_rbtree->first[RBT_LEFT]))
the_rbtree->first[RBT_LEFT] = NULL;
4bbd0: 42ac 0008 clrl %a4@(8)
4bbd4: 2a6a 0004 moveal %a2@(4),%a5
}
}
/* check if max needs to be updated: note, min can equal max (1 element) */
if (the_node == the_rbtree->first[RBT_RIGHT]) {
4bbd8: b5ec 000c cmpal %a4@(12),%a2
4bbdc: 6618 bnes 4bbf6 <_RBTree_Extract_unprotected+0x58>
if (the_node->child[RBT_LEFT])
4bbde: 4a8d tstl %a5
4bbe0: 6706 beqs 4bbe8 <_RBTree_Extract_unprotected+0x4a>
the_rbtree->first[RBT_RIGHT] = the_node->child[RBT_LEFT];
4bbe2: 294d 000c movel %a5,%a4@(12)
4bbe6: 600e bras 4bbf6 <_RBTree_Extract_unprotected+0x58>
else {
the_rbtree->first[RBT_RIGHT] = the_node->parent;
4bbe8: 2012 movel %a2@,%d0
4bbea: 2940 000c movel %d0,%a4@(12)
if(_RBTree_Are_nodes_equal((RBTree_Node *)the_rbtree,
4bbee: b08c cmpl %a4,%d0
4bbf0: 6604 bnes 4bbf6 <_RBTree_Extract_unprotected+0x58>
the_rbtree->first[RBT_RIGHT]))
the_rbtree->first[RBT_RIGHT] = NULL;
4bbf2: 42ac 000c clrl %a4@(12)
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
4bbf6: 264d moveal %a5,%a3
4bbf8: 4a8d tstl %a5
4bbfa: 6778 beqs 4bc74 <_RBTree_Extract_unprotected+0xd6>
4bbfc: 4aaa 0008 tstl %a2@(8)
4bc00: 6604 bnes 4bc06 <_RBTree_Extract_unprotected+0x68>
4bc02: 6078 bras 4bc7c <_RBTree_Extract_unprotected+0xde>
target = the_node->child[RBT_LEFT]; /* find max in node->child[RBT_LEFT] */
while (target->child[RBT_RIGHT]) target = target->child[RBT_RIGHT];
4bc04: 2640 moveal %d0,%a3
4bc06: 202b 0008 movel %a3@(8),%d0
4bc0a: 66f8 bnes 4bc04 <_RBTree_Extract_unprotected+0x66>
* target's position (target is the right child of target->parent)
* when target vacates it. if there is no child, then target->parent
* should become NULL. This may cause the coloring to be violated.
* For now we store the color of the node being deleted in victim_color.
*/
leaf = target->child[RBT_LEFT];
4bc0c: 2a6b 0004 moveal %a3@(4),%a5
if(leaf) {
4bc10: 4a8d tstl %a5
4bc12: 6704 beqs 4bc18 <_RBTree_Extract_unprotected+0x7a>
leaf->parent = target->parent;
4bc14: 2a93 movel %a3@,%a5@
4bc16: 600a bras 4bc22 <_RBTree_Extract_unprotected+0x84>
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
4bc18: 2f0b movel %a3,%sp@-
4bc1a: 4eb9 0004 ba58 jsr 4ba58 <_RBTree_Extract_validate_unprotected>
4bc20: 588f addql #4,%sp
}
victim_color = target->color;
dir = target != target->parent->child[0];
4bc22: 2053 moveal %a3@,%a0
4bc24: b7e8 0004 cmpal %a0@(4),%a3
4bc28: 56c1 sne %d1
target->parent->child[dir] = leaf;
4bc2a: 7401 moveq #1,%d2
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
dir = target != target->parent->child[0];
4bc2c: 49c1 extbl %d1
target->parent->child[dir] = leaf;
4bc2e: 9481 subl %d1,%d2
4bc30: 218d 2c00 movel %a5,%a0@(00000000,%d2:l:4)
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
the_node->parent->child[dir] = target;
4bc34: 7401 moveq #1,%d2
victim_color = target->color;
dir = target != target->parent->child[0];
target->parent->child[dir] = leaf;
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
4bc36: 2052 moveal %a2@,%a0
4bc38: b5e8 0004 cmpal %a0@(4),%a2
4bc3c: 56c1 sne %d1
leaf->parent = target->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
4bc3e: 202b 000c movel %a3@(12),%d0
dir = target != target->parent->child[0];
target->parent->child[dir] = leaf;
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
4bc42: 49c1 extbl %d1
the_node->parent->child[dir] = target;
4bc44: 9481 subl %d1,%d2
4bc46: 218b 2c00 movel %a3,%a0@(00000000,%d2:l:4)
/* set target's new children to the original node's children */
target->child[RBT_RIGHT] = the_node->child[RBT_RIGHT];
4bc4a: 276a 0008 0008 movel %a2@(8),%a3@(8)
if (the_node->child[RBT_RIGHT])
4bc50: 206a 0008 moveal %a2@(8),%a0
4bc54: 4a88 tstl %a0
4bc56: 6702 beqs 4bc5a <_RBTree_Extract_unprotected+0xbc><== NEVER TAKEN
the_node->child[RBT_RIGHT]->parent = target;
4bc58: 208b movel %a3,%a0@
target->child[RBT_LEFT] = the_node->child[RBT_LEFT];
4bc5a: 276a 0004 0004 movel %a2@(4),%a3@(4)
if (the_node->child[RBT_LEFT])
4bc60: 206a 0004 moveal %a2@(4),%a0
4bc64: 4a88 tstl %a0
4bc66: 6702 beqs 4bc6a <_RBTree_Extract_unprotected+0xcc>
the_node->child[RBT_LEFT]->parent = target;
4bc68: 208b movel %a3,%a0@
/* finally, update the parent node and recolor. target has completely
* replaced the_node, and target's child has moved up the tree if needed.
* the_node is no longer part of the tree, although it has valid pointers
* still.
*/
target->parent = the_node->parent;
4bc6a: 2692 movel %a2@,%a3@
target->color = the_node->color;
4bc6c: 276a 000c 000c movel %a2@(12),%a3@(12)
4bc72: 602c bras 4bca0 <_RBTree_Extract_unprotected+0x102>
* the_node's location in the tree. This may cause the coloring to be
* violated. We will fix it later.
* For now we store the color of the node being deleted in victim_color.
*/
leaf = the_node->child[RBT_LEFT] ?
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
4bc74: 2a6a 0008 moveal %a2@(8),%a5
if( leaf ) {
4bc78: 4a8d tstl %a5
4bc7a: 6704 beqs 4bc80 <_RBTree_Extract_unprotected+0xe2>
leaf->parent = the_node->parent;
4bc7c: 2a92 movel %a2@,%a5@
4bc7e: 600a bras 4bc8a <_RBTree_Extract_unprotected+0xec>
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
4bc80: 2f0a movel %a2,%sp@-
4bc82: 4eb9 0004 ba58 jsr 4ba58 <_RBTree_Extract_validate_unprotected>
4bc88: 588f addql #4,%sp
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
4bc8a: 2052 moveal %a2@,%a0
4bc8c: b5e8 0004 cmpal %a0@(4),%a2
4bc90: 56c1 sne %d1
the_node->parent->child[dir] = leaf;
4bc92: 7401 moveq #1,%d2
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
4bc94: 49c1 extbl %d1
the_node->parent->child[dir] = leaf;
4bc96: 9481 subl %d1,%d2
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
4bc98: 202a 000c movel %a2@(12),%d0
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
the_node->parent->child[dir] = leaf;
4bc9c: 218d 2c00 movel %a5,%a0@(00000000,%d2:l:4)
/* fix coloring. leaf has moved up the tree. The color of the deleted
* node is in victim_color. There are two cases:
* 1. Deleted a red node, its child must be black. Nothing must be done.
* 2. Deleted a black node, its child must be red. Paint child black.
*/
if (victim_color == RBT_BLACK) { /* eliminate case 1 */
4bca0: 4a80 tstl %d0
4bca2: 6608 bnes 4bcac <_RBTree_Extract_unprotected+0x10e>
if (leaf) {
4bca4: 4a8d tstl %a5
4bca6: 6704 beqs 4bcac <_RBTree_Extract_unprotected+0x10e>
leaf->color = RBT_BLACK; /* case 2 */
4bca8: 42ad 000c clrl %a5@(12)
/* Wipe the_node */
_RBTree_Set_off_rbtree(the_node);
/* set root to black, if it exists */
if (the_rbtree->root) the_rbtree->root->color = RBT_BLACK;
4bcac: 206c 0004 moveal %a4@(4),%a0
*/
RTEMS_INLINE_ROUTINE void _RBTree_Set_off_rbtree(
RBTree_Node *node
)
{
node->parent = node->child[RBT_LEFT] = node->child[RBT_RIGHT] = NULL;
4bcb0: 42aa 0008 clrl %a2@(8)
4bcb4: 42aa 0004 clrl %a2@(4)
4bcb8: 4292 clrl %a2@
4bcba: 4a88 tstl %a0
4bcbc: 6704 beqs 4bcc2 <_RBTree_Extract_unprotected+0x124>
4bcbe: 42a8 000c clrl %a0@(12)
}
4bcc2: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4bcc8: 4e5e unlk %fp <== NOT EXECUTED
0004ba58 <_RBTree_Extract_validate_unprotected>:
* of the extract operation.
*/
void _RBTree_Extract_validate_unprotected(
RBTree_Node *the_node
)
{
4ba58: 4e56 ffe8 linkw %fp,#-24
4ba5c: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
4ba60: 266e 0008 moveal %fp@(8),%a3
RBTree_Node *parent, *sibling;
RBTree_Direction dir;
parent = the_node->parent;
4ba64: 2453 moveal %a3@,%a2
if(!parent->parent) return;
4ba66: 4a92 tstl %a2@
4ba68: 6700 012a beqw 4bb94 <_RBTree_Extract_validate_unprotected+0x13c>
sibling = _RBTree_Sibling(the_node);
4ba6c: 2f0b movel %a3,%sp@-
4ba6e: 49fa ff6c lea %pc@(4b9dc <_RBTree_Sibling>),%a4
4ba72: 4e94 jsr %a4@
4ba74: 588f addql #4,%sp
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
_RBTree_Rotate(parent, dir);
4ba76: 4bfa ff8e lea %pc@(4ba06 <_RBTree_Rotate>),%a5
RBTree_Direction dir;
parent = the_node->parent;
if(!parent->parent) return;
sibling = _RBTree_Sibling(the_node);
4ba7a: 2040 moveal %d0,%a0
/* continue to correct tree as long as the_node is black and not the root */
while (!_RBTree_Is_red(the_node) && parent->parent) {
4ba7c: 6000 00ec braw 4bb6a <_RBTree_Extract_validate_unprotected+0x112>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
4ba80: 4a88 tstl %a0
4ba82: 6730 beqs 4bab4 <_RBTree_Extract_validate_unprotected+0x5c><== NEVER TAKEN
4ba84: 7001 moveq #1,%d0
4ba86: b0a8 000c cmpl %a0@(12),%d0
4ba8a: 6628 bnes 4bab4 <_RBTree_Extract_validate_unprotected+0x5c>
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
4ba8c: b7ea 0004 cmpal %a2@(4),%a3
4ba90: 56c2 sne %d2
* then rotate parent left, making the sibling be the_node's grandparent.
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
4ba92: 2540 000c movel %d0,%a2@(12)
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
4ba96: 49c2 extbl %d2
4ba98: 4482 negl %d2
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
4ba9a: 42a8 000c clrl %a0@(12)
dir = the_node != parent->child[0];
_RBTree_Rotate(parent, dir);
4ba9e: 2f02 movel %d2,%sp@-
4baa0: 2f0a movel %a2,%sp@-
4baa2: 4e95 jsr %a5@
sibling = parent->child[!dir];
4baa4: 508f addql #8,%sp
4baa6: 4a82 tstl %d2
4baa8: 57c0 seq %d0
4baaa: 7201 moveq #1,%d1
4baac: 49c0 extbl %d0
4baae: 9280 subl %d0,%d1
4bab0: 2072 1c00 moveal %a2@(00000000,%d1:l:4),%a0
}
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
4bab4: 2268 0008 moveal %a0@(8),%a1
4bab8: 4a89 tstl %a1
4baba: 670e beqs 4baca <_RBTree_Extract_validate_unprotected+0x72>
* This function maintains the properties of the red-black tree.
*
* @note It does NOT disable interrupts to ensure the atomicity
* of the extract operation.
*/
void _RBTree_Extract_validate_unprotected(
4babc: 7001 moveq #1,%d0
4babe: b0a9 000c cmpl %a1@(12),%d0
4bac2: 57c0 seq %d0
4bac4: 49c0 extbl %d0
4bac6: 4480 negl %d0
4bac8: 6002 bras 4bacc <_RBTree_Extract_validate_unprotected+0x74>
4baca: 4280 clrl %d0
_RBTree_Rotate(parent, dir);
sibling = parent->child[!dir];
}
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
4bacc: 4a00 tstb %d0
4bace: 6630 bnes 4bb00 <_RBTree_Extract_validate_unprotected+0xa8>
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
4bad0: 2268 0004 moveal %a0@(4),%a1
4bad4: 4a89 tstl %a1
4bad6: 670e beqs 4bae6 <_RBTree_Extract_validate_unprotected+0x8e>
* This function maintains the properties of the red-black tree.
*
* @note It does NOT disable interrupts to ensure the atomicity
* of the extract operation.
*/
void _RBTree_Extract_validate_unprotected(
4bad8: 7201 moveq #1,%d1
4bada: b2a9 000c cmpl %a1@(12),%d1
4bade: 57c0 seq %d0
4bae0: 49c0 extbl %d0
4bae2: 4480 negl %d0
4bae4: 6002 bras 4bae8 <_RBTree_Extract_validate_unprotected+0x90>
4bae6: 4280 clrl %d0
_RBTree_Rotate(parent, dir);
sibling = parent->child[!dir];
}
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
4bae8: 4a00 tstb %d0
4baea: 6614 bnes 4bb00 <_RBTree_Extract_validate_unprotected+0xa8>
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
sibling->color = RBT_RED;
4baec: 7001 moveq #1,%d0
4baee: 2140 000c movel %d0,%a0@(12)
4baf2: b0aa 000c cmpl %a2@(12),%d0
4baf6: 6600 008c bnew 4bb84 <_RBTree_Extract_validate_unprotected+0x12c>
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
4bafa: 42aa 000c clrl %a2@(12)
break;
4bafe: 6078 bras 4bb78 <_RBTree_Extract_validate_unprotected+0x120>
* cases, either the_node is to the left or the right of the parent.
* In both cases, first check if one of sibling's children is black,
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
4bb00: b7ea 0004 cmpal %a2@(4),%a3
4bb04: 56c2 sne %d2
4bb06: 49c2 extbl %d2
4bb08: 4482 negl %d2
if (!_RBTree_Is_red(sibling->child[!dir])) {
4bb0a: 57c3 seq %d3
4bb0c: 49c3 extbl %d3
4bb0e: 4483 negl %d3
4bb10: 2270 3c04 moveal %a0@(00000004,%d3:l:4),%a1
4bb14: 4a89 tstl %a1
4bb16: 670e beqs 4bb26 <_RBTree_Extract_validate_unprotected+0xce>
* This function maintains the properties of the red-black tree.
*
* @note It does NOT disable interrupts to ensure the atomicity
* of the extract operation.
*/
void _RBTree_Extract_validate_unprotected(
4bb18: 7201 moveq #1,%d1
4bb1a: b2a9 000c cmpl %a1@(12),%d1
4bb1e: 57c0 seq %d0
4bb20: 49c0 extbl %d0
4bb22: 4480 negl %d0
4bb24: 6002 bras 4bb28 <_RBTree_Extract_validate_unprotected+0xd0>
4bb26: 4280 clrl %d0
* In both cases, first check if one of sibling's children is black,
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[!dir])) {
4bb28: 4a00 tstb %d0
4bb2a: 6620 bnes 4bb4c <_RBTree_Extract_validate_unprotected+0xf4>
sibling->color = RBT_RED;
4bb2c: 7001 moveq #1,%d0
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, !dir);
4bb2e: 7201 moveq #1,%d1
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[!dir])) {
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
4bb30: 2270 2c04 moveal %a0@(00000004,%d2:l:4),%a1
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[!dir])) {
sibling->color = RBT_RED;
4bb34: 2140 000c movel %d0,%a0@(12)
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, !dir);
4bb38: b581 eorl %d2,%d1
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[!dir])) {
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
4bb3a: 42a9 000c clrl %a1@(12)
_RBTree_Rotate(sibling, !dir);
4bb3e: 2f01 movel %d1,%sp@-
4bb40: 2f08 movel %a0,%sp@-
4bb42: 4eba fec2 jsr %pc@(4ba06 <_RBTree_Rotate>)
sibling = parent->child[!dir];
4bb46: 508f addql #8,%sp
4bb48: 2072 3c04 moveal %a2@(00000004,%d3:l:4),%a0
}
sibling->color = parent->color;
4bb4c: 216a 000c 000c movel %a2@(12),%a0@(12)
parent->color = RBT_BLACK;
sibling->child[!dir]->color = RBT_BLACK;
4bb52: 2070 3c04 moveal %a0@(00000004,%d3:l:4),%a0
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, !dir);
sibling = parent->child[!dir];
}
sibling->color = parent->color;
parent->color = RBT_BLACK;
4bb56: 42aa 000c clrl %a2@(12)
sibling->child[!dir]->color = RBT_BLACK;
4bb5a: 42a8 000c clrl %a0@(12)
_RBTree_Rotate(parent, dir);
4bb5e: 2f02 movel %d2,%sp@-
4bb60: 2f0a movel %a2,%sp@-
4bb62: 4eba fea2 jsr %pc@(4ba06 <_RBTree_Rotate>)
break; /* done */
4bb66: 508f addql #8,%sp
4bb68: 600e bras 4bb78 <_RBTree_Extract_validate_unprotected+0x120>
if(!parent->parent) return;
sibling = _RBTree_Sibling(the_node);
/* continue to correct tree as long as the_node is black and not the root */
while (!_RBTree_Is_red(the_node) && parent->parent) {
4bb6a: 7001 moveq #1,%d0
4bb6c: b0ab 000c cmpl %a3@(12),%d0
4bb70: 6706 beqs 4bb78 <_RBTree_Extract_validate_unprotected+0x120>
4bb72: 4a92 tstl %a2@
4bb74: 6600 ff0a bnew 4ba80 <_RBTree_Extract_validate_unprotected+0x28>
sibling->child[!dir]->color = RBT_BLACK;
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
4bb78: 2053 moveal %a3@,%a0
4bb7a: 4a90 tstl %a0@
4bb7c: 6616 bnes 4bb94 <_RBTree_Extract_validate_unprotected+0x13c>
4bb7e: 42ab 000c clrl %a3@(12)
4bb82: 6010 bras 4bb94 <_RBTree_Extract_validate_unprotected+0x13c>
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
break;
}
the_node = parent; /* done if parent is red */
parent = the_node->parent;
4bb84: 2412 movel %a2@,%d2
sibling = _RBTree_Sibling(the_node);
4bb86: 264a moveal %a2,%a3
4bb88: 2f0a movel %a2,%sp@-
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
break;
}
the_node = parent; /* done if parent is red */
parent = the_node->parent;
4bb8a: 2442 moveal %d2,%a2
sibling = _RBTree_Sibling(the_node);
4bb8c: 4e94 jsr %a4@
4bb8e: 588f addql #4,%sp
4bb90: 2040 moveal %d0,%a0
4bb92: 60d6 bras 4bb6a <_RBTree_Extract_validate_unprotected+0x112>
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
}
4bb94: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
4bb9a: 4e5e unlk %fp <== NOT EXECUTED
00048ae4 <_RBTree_Initialize>:
void *starting_address,
size_t number_nodes,
size_t node_size,
bool is_unique
)
{
48ae4: 4e56 ffec linkw %fp,#-20
48ae8: 202e 001c movel %fp@(28),%d0
48aec: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
48af0: 246e 0008 moveal %fp@(8),%a2
48af4: 262e 0014 movel %fp@(20),%d3
48af8: 282e 0018 movel %fp@(24),%d4
size_t count;
RBTree_Node *next;
/* TODO: Error message? */
if (!the_rbtree) return;
48afc: 4a8a tstl %a2
48afe: 6734 beqs 48b34 <_RBTree_Initialize+0x50> <== NEVER TAKEN
RBTree_Control *the_rbtree,
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
48b00: 4292 clrl %a2@
the_rbtree->root = NULL;
the_rbtree->first[0] = NULL;
the_rbtree->first[1] = NULL;
the_rbtree->compare_function = compare_function;
48b02: 256e 000c 0010 movel %fp@(12),%a2@(16)
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
48b08: 242e 0010 movel %fp@(16),%d2
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
the_rbtree->root = NULL;
48b0c: 42aa 0004 clrl %a2@(4)
while ( count-- ) {
_RBTree_Insert(the_rbtree, next);
48b10: 47f9 0004 8ab8 lea 48ab8 <_RBTree_Insert>,%a3
the_rbtree->first[0] = NULL;
48b16: 42aa 0008 clrl %a2@(8)
the_rbtree->first[1] = NULL;
48b1a: 42aa 000c clrl %a2@(12)
the_rbtree->compare_function = compare_function;
the_rbtree->is_unique = is_unique;
48b1e: 1540 0014 moveb %d0,%a2@(20)
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
48b22: 600c bras 48b30 <_RBTree_Initialize+0x4c>
_RBTree_Insert(the_rbtree, next);
48b24: 2f02 movel %d2,%sp@-
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _RBTree_Initialize(
48b26: d484 addl %d4,%d2
48b28: 5383 subql #1,%d3
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
_RBTree_Insert(the_rbtree, next);
48b2a: 2f0a movel %a2,%sp@-
48b2c: 4e93 jsr %a3@
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _RBTree_Initialize(
48b2e: 508f addql #8,%sp
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
48b30: 4a83 tstl %d3
48b32: 66f0 bnes 48b24 <_RBTree_Initialize+0x40>
_RBTree_Insert(the_rbtree, next);
next = (RBTree_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
}
48b34: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
48b3a: 4e5e unlk %fp
...
0004b9dc <_RBTree_Sibling>:
* exists, and NULL if not.
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
RBTree_Node *the_node
)
{
4b9dc: 4e56 0000 linkw %fp,#0
4b9e0: 226e 0008 moveal %fp@(8),%a1
if(!the_node) return NULL;
4b9e4: 4a89 tstl %a1
4b9e6: 6718 beqs 4ba00 <_RBTree_Sibling+0x24>
if(!(the_node->parent)) return NULL;
4b9e8: 2051 moveal %a1@,%a0
4b9ea: 4a88 tstl %a0
4b9ec: 6712 beqs 4ba00 <_RBTree_Sibling+0x24> <== NEVER TAKEN
if(!(the_node->parent->parent)) return NULL;
4b9ee: 4a90 tstl %a0@
4b9f0: 670e beqs 4ba00 <_RBTree_Sibling+0x24>
if(the_node == the_node->parent->child[RBT_LEFT])
4b9f2: 2028 0004 movel %a0@(4),%d0
4b9f6: b089 cmpl %a1,%d0
4b9f8: 6608 bnes 4ba02 <_RBTree_Sibling+0x26>
return the_node->parent->child[RBT_RIGHT];
4b9fa: 2028 0008 movel %a0@(8),%d0
4b9fe: 6002 bras 4ba02 <_RBTree_Sibling+0x26>
RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
4ba00: 4280 clrl %d0
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
else
return the_node->parent->child[RBT_LEFT];
}
4ba02: 4e5e unlk %fp <== NOT EXECUTED
0004bd4a <_RBTree_Validate_insert_unprotected>:
* append operation.
*/
void _RBTree_Validate_insert_unprotected(
RBTree_Node *the_node
)
{
4bd4a: 4e56 fff0 linkw %fp,#-16
4bd4e: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
4bd52: 266e 0008 moveal %fp@(8),%a3
}
the_node->parent->color = RBT_BLACK;
g->color = RBT_RED;
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
4bd56: 49fa ffa0 lea %pc@(4bcf8 <_RBTree_Rotate>),%a4
RBTree_Node *u,*g;
/* note: the insert root case is handled already */
/* if the parent is black, nothing needs to be done
* otherwise may need to loop a few times */
while (_RBTree_Is_red(_RBTree_Parent(the_node))) {
4bd5a: 604e bras 4bdaa <_RBTree_Validate_insert_unprotected+0x60>
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(!(the_node->parent->parent->parent)) return NULL;
4bd5c: 4a92 tstl %a2@
4bd5e: 6762 beqs 4bdc2 <_RBTree_Validate_insert_unprotected+0x78><== NEVER TAKEN
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
4bd60: 226a 0004 moveal %a2@(4),%a1
4bd64: b3c8 cmpal %a0,%a1
4bd66: 6604 bnes 4bd6c <_RBTree_Validate_insert_unprotected+0x22>
return the_node->parent->child[RBT_RIGHT];
4bd68: 226a 0008 moveal %a2@(8),%a1
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
4bd6c: 4a89 tstl %a1
4bd6e: 6752 beqs 4bdc2 <_RBTree_Validate_insert_unprotected+0x78>
4bd70: 7001 moveq #1,%d0
4bd72: b0a9 000c cmpl %a1@(12),%d0
4bd76: 664a bnes 4bdc2 <_RBTree_Validate_insert_unprotected+0x78>
u = _RBTree_Parent_sibling(the_node);
g = the_node->parent->parent;
/* if uncle is red, repaint uncle/parent black and grandparent red */
if(_RBTree_Is_red(u)) {
the_node->parent->color = RBT_BLACK;
4bd78: 42a8 000c clrl %a0@(12)
u->color = RBT_BLACK;
g->color = RBT_RED;
4bd7c: 264a moveal %a2,%a3
g = the_node->parent->parent;
/* if uncle is red, repaint uncle/parent black and grandparent red */
if(_RBTree_Is_red(u)) {
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
4bd7e: 42a9 000c clrl %a1@(12)
g->color = RBT_RED;
4bd82: 2540 000c movel %d0,%a2@(12)
4bd86: 6022 bras 4bdaa <_RBTree_Validate_insert_unprotected+0x60>
RBTree_Direction dir = the_node != the_node->parent->child[0];
RBTree_Direction pdir = the_node->parent != g->child[0];
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
_RBTree_Rotate(the_node->parent, pdir);
4bd88: 2f02 movel %d2,%sp@-
4bd8a: 2f08 movel %a0,%sp@-
4bd8c: 4e94 jsr %a4@
the_node = the_node->child[pdir];
4bd8e: 508f addql #8,%sp
4bd90: 2673 2c04 moveal %a3@(00000004,%d2:l:4),%a3
}
the_node->parent->color = RBT_BLACK;
4bd94: 2053 moveal %a3@,%a0
g->color = RBT_RED;
4bd96: 7001 moveq #1,%d0
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
}
the_node->parent->color = RBT_BLACK;
4bd98: 42a8 000c clrl %a0@(12)
g->color = RBT_RED;
4bd9c: 2540 000c movel %d0,%a2@(12)
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
4bda0: 9082 subl %d2,%d0
4bda2: 2f00 movel %d0,%sp@-
4bda4: 2f0a movel %a2,%sp@-
4bda6: 4e94 jsr %a4@
4bda8: 508f addql #8,%sp
ISR_Level level;
_ISR_Disable( level );
return _RBTree_Insert_unprotected( tree, node );
_ISR_Enable( level );
}
4bdaa: 2053 moveal %a3@,%a0
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
RBTree_Node *the_node
)
{
if (!the_node->parent->parent) return NULL;
4bdac: 2450 moveal %a0@,%a2
4bdae: 4a8a tstl %a2
4bdb0: 670a beqs 4bdbc <_RBTree_Validate_insert_unprotected+0x72>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
4bdb2: 7001 moveq #1,%d0
4bdb4: b0a8 000c cmpl %a0@(12),%d0
4bdb8: 6622 bnes 4bddc <_RBTree_Validate_insert_unprotected+0x92>
4bdba: 60a0 bras 4bd5c <_RBTree_Validate_insert_unprotected+0x12>
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
}
}
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
4bdbc: 42ab 000c clrl %a3@(12)
4bdc0: 601a bras 4bddc <_RBTree_Validate_insert_unprotected+0x92>
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
RBTree_Direction pdir = the_node->parent != g->child[0];
4bdc2: b1ea 0004 cmpal %a2@(4),%a0
4bdc6: 56c2 sne %d2
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
4bdc8: b7e8 0004 cmpal %a0@(4),%a3
4bdcc: 56c0 sne %d0
RBTree_Direction pdir = the_node->parent != g->child[0];
4bdce: 49c2 extbl %d2
4bdd0: 4482 negl %d2
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
4bdd2: 49c0 extbl %d0
4bdd4: 4480 negl %d0
RBTree_Direction pdir = the_node->parent != g->child[0];
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
4bdd6: b480 cmpl %d0,%d2
4bdd8: 66ae bnes 4bd88 <_RBTree_Validate_insert_unprotected+0x3e>
4bdda: 60b8 bras 4bd94 <_RBTree_Validate_insert_unprotected+0x4a>
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
}
}
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
}
4bddc: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
4bde2: 4e5e unlk %fp <== NOT EXECUTED
00057a68 <_Region_Process_queue>:
*/
void _Region_Process_queue(
Region_Control *the_region
)
{
57a68: 4e56 ffe4 linkw %fp,#-28
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
57a6c: 2039 0007 6b3c movel 76b3c <_Thread_Dispatch_disable_level>,%d0
57a72: 5280 addql #1,%d0
57a74: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
57a78: 23c0 0007 6b3c movel %d0,76b3c <_Thread_Dispatch_disable_level>
57a7e: 266e 0008 moveal %fp@(8),%a3
return _Thread_Dispatch_disable_level;
57a82: 2039 0007 6b3c movel 76b3c <_Thread_Dispatch_disable_level>,%d0
* NOTE: Be sure to disable dispatching before unlocking the mutex
* since we do not want to open a window where a context
* switch could occur.
*/
_Thread_Disable_dispatch();
_RTEMS_Unlock_allocator();
57a88: 2f39 0007 6bdc movel 76bdc <_RTEMS_Allocator_Mutex>,%sp@-
/*
* NOTE: The following loop is O(n) where n is the number of
* threads whose memory request is satisfied.
*/
for ( ; ; ) {
the_thread = _Thread_queue_First( &the_region->Wait_queue );
57a8e: 240b movel %a3,%d2
RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
Region_Control *the_region,
uintptr_t size
)
{
return _Heap_Allocate( &the_region->Memory, size );
57a90: 260b movel %a3,%d3
57a92: 0682 0000 0010 addil #16,%d2
57a98: 0683 0000 0068 addil #104,%d3
57a9e: 4bf9 0005 2ec8 lea 52ec8 <_Heap_Allocate_aligned_with_boundary>,%a5
if ( the_segment == NULL )
break;
*(void **)the_thread->Wait.return_argument = the_segment;
the_region->number_of_used_blocks += 1;
_Thread_queue_Extract( &the_region->Wait_queue, the_thread );
57aa4: 49f9 0005 80ec lea 580ec <_Thread_queue_Extract>,%a4
* NOTE: Be sure to disable dispatching before unlocking the mutex
* since we do not want to open a window where a context
* switch could occur.
*/
_Thread_Disable_dispatch();
_RTEMS_Unlock_allocator();
57aaa: 4eb9 0005 2428 jsr 52428 <_API_Mutex_Unlock>
57ab0: 588f addql #4,%sp
/*
* NOTE: The following loop is O(n) where n is the number of
* threads whose memory request is satisfied.
*/
for ( ; ; ) {
the_thread = _Thread_queue_First( &the_region->Wait_queue );
57ab2: 283c 0005 81e8 movel #360936,%d4
57ab8: 2f02 movel %d2,%sp@-
57aba: 2044 moveal %d4,%a0
57abc: 4e90 jsr %a0@
if ( the_thread == NULL )
57abe: 588f addql #4,%sp
/*
* NOTE: The following loop is O(n) where n is the number of
* threads whose memory request is satisfied.
*/
for ( ; ; ) {
the_thread = _Thread_queue_First( &the_region->Wait_queue );
57ac0: 2440 moveal %d0,%a2
if ( the_thread == NULL )
57ac2: 4a80 tstl %d0
57ac4: 672c beqs 57af2 <_Region_Process_queue+0x8a>
57ac6: 42a7 clrl %sp@-
57ac8: 42a7 clrl %sp@-
57aca: 2f2a 0024 movel %a2@(36),%sp@-
57ace: 2f03 movel %d3,%sp@-
57ad0: 4e95 jsr %a5@
the_segment = (void **) _Region_Allocate_segment(
the_region,
the_thread->Wait.count
);
if ( the_segment == NULL )
57ad2: 4fef 0010 lea %sp@(16),%sp
57ad6: 4a80 tstl %d0
57ad8: 6718 beqs 57af2 <_Region_Process_queue+0x8a> <== NEVER TAKEN
break;
*(void **)the_thread->Wait.return_argument = the_segment;
57ada: 206a 0028 moveal %a2@(40),%a0
57ade: 2080 movel %d0,%a0@
the_region->number_of_used_blocks += 1;
57ae0: 52ab 0064 addql #1,%a3@(100)
_Thread_queue_Extract( &the_region->Wait_queue, the_thread );
57ae4: 2f0a movel %a2,%sp@-
57ae6: 2f02 movel %d2,%sp@-
57ae8: 4e94 jsr %a4@
the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
}
57aea: 508f addql #8,%sp
break;
*(void **)the_thread->Wait.return_argument = the_segment;
the_region->number_of_used_blocks += 1;
_Thread_queue_Extract( &the_region->Wait_queue, the_thread );
the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
57aec: 42aa 0034 clrl %a2@(52)
}
57af0: 60c6 bras 57ab8 <_Region_Process_queue+0x50>
_Thread_Enable_dispatch();
}
57af2: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
57af8: 4e5e unlk %fp
*(void **)the_thread->Wait.return_argument = the_segment;
the_region->number_of_used_blocks += 1;
_Thread_queue_Extract( &the_region->Wait_queue, the_thread );
the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
57afa: 4ef9 0005 4ab4 jmp 54ab4 <_Thread_Enable_dispatch>
00047b10 <_Scheduler_EDF_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
47b10: 4e56 0000 linkw %fp,#0
47b14: 2f0a movel %a2,%sp@-
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
47b16: 4878 0018 pea 18 <OPER2+0x4>
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
47b1a: 246e 0008 moveal %fp@(8),%a2
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
47b1e: 4eb9 0004 933c jsr 4933c <_Workspace_Allocate>
if ( sched ) {
47b24: 588f addql #4,%sp
47b26: 4a80 tstl %d0
47b28: 670e beqs 47b38 <_Scheduler_EDF_Allocate+0x28> <== NEVER TAKEN
the_thread->scheduler_info = sched;
47b2a: 2540 008a movel %d0,%a2@(138)
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
47b2e: 2040 moveal %d0,%a0
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
47b30: 7202 moveq #2,%d1
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
if ( sched ) {
the_thread->scheduler_info = sched;
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
47b32: 208a movel %a2,%a0@
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
47b34: 2141 0014 movel %d1,%a0@(20)
}
return sched;
}
47b38: 246e fffc moveal %fp@(-4),%a2
47b3c: 4e5e unlk %fp <== NOT EXECUTED
00047b40 <_Scheduler_EDF_Block>:
#include <rtems/score/thread.h>
void _Scheduler_EDF_Block(
Thread_Control *the_thread
)
{
47b40: 4e56 0000 linkw %fp,#0
47b44: 2f02 movel %d2,%sp@-
47b46: 242e 0008 movel %fp@(8),%d2
_Scheduler_EDF_Extract( the_thread );
47b4a: 2f02 movel %d2,%sp@-
47b4c: 4eb9 0004 7bb8 jsr 47bb8 <_Scheduler_EDF_Extract>
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
47b52: 588f addql #4,%sp
47b54: b4b9 0006 04a6 cmpl 604a6 <_Per_CPU_Information+0x10>,%d2
47b5a: 6606 bnes 47b62 <_Scheduler_EDF_Block+0x22> <== NEVER TAKEN
_Scheduler_EDF_Schedule();
47b5c: 4eb9 0004 7cd8 jsr 47cd8 <_Scheduler_EDF_Schedule>
if ( _Thread_Is_executing( the_thread ) )
47b62: b4b9 0006 04a2 cmpl 604a2 <_Per_CPU_Information+0xc>,%d2
47b68: 6608 bnes 47b72 <_Scheduler_EDF_Block+0x32> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
47b6a: 7001 moveq #1,%d0
47b6c: 13c0 0006 04ae moveb %d0,604ae <_Per_CPU_Information+0x18>
}
47b72: 242e fffc movel %fp@(-4),%d2
47b76: 4e5e unlk %fp
...
00047be4 <_Scheduler_EDF_Free>:
#include <rtems/score/wkspace.h>
void _Scheduler_EDF_Free(
Thread_Control *the_thread
)
{
47be4: 4e56 0000 linkw %fp,#0
_Workspace_Free( the_thread->scheduler_info );
47be8: 206e 0008 moveal %fp@(8),%a0
47bec: 2d68 008a 0008 movel %a0@(138),%fp@(8)
}
47bf2: 4e5e unlk %fp
void _Scheduler_EDF_Free(
Thread_Control *the_thread
)
{
_Workspace_Free( the_thread->scheduler_info );
47bf4: 4ef9 0004 9358 jmp 49358 <_Workspace_Free>
...
00047c9c <_Scheduler_EDF_Release_job>:
void _Scheduler_EDF_Release_job(
Thread_Control *the_thread,
uint32_t deadline
)
{
47c9c: 4e56 0000 linkw %fp,#0
47ca0: 206e 0008 moveal %fp@(8),%a0
47ca4: 202e 000c movel %fp@(12),%d0
Priority_Control new_priority;
if (deadline) {
47ca8: 670e beqs 47cb8 <_Scheduler_EDF_Release_job+0x1c><== NEVER TAKEN
/* Initializing or shifting deadline. */
new_priority = (_Watchdog_Ticks_since_boot + deadline)
47caa: 2239 0006 0142 movel 60142 <_Watchdog_Ticks_since_boot>,%d1
47cb0: d081 addl %d1,%d0
47cb2: 0880 001f bclr #31,%d0
47cb6: 6004 bras 47cbc <_Scheduler_EDF_Release_job+0x20>
& ~SCHEDULER_EDF_PRIO_MSB;
}
else {
/* Switch back to background priority. */
new_priority = the_thread->Start.initial_priority;
47cb8: 2028 00ac movel %a0@(172),%d0 <== NOT EXECUTED
}
the_thread->real_priority = new_priority;
47cbc: 2140 0018 movel %d0,%a0@(24)
_Thread_Change_priority(the_thread, new_priority, true);
47cc0: 4878 0001 pea 1 <ADD>
47cc4: 2f00 movel %d0,%sp@-
47cc6: 2f08 movel %a0,%sp@-
47cc8: 4eb9 0004 7fdc jsr 47fdc <_Thread_Change_priority>
47cce: 4fef 000c lea %sp@(12),%sp
}
47cd2: 4e5e unlk %fp
...
00047cfc <_Scheduler_EDF_Unblock>:
#include <rtems/score/scheduleredf.h>
void _Scheduler_EDF_Unblock(
Thread_Control *the_thread
)
{
47cfc: 4e56 0000 linkw %fp,#0
47d00: 2f0a movel %a2,%sp@-
47d02: 246e 0008 moveal %fp@(8),%a2
_Scheduler_EDF_Enqueue(the_thread);
47d06: 2f0a movel %a2,%sp@-
47d08: 4eb9 0004 7b88 jsr 47b88 <_Scheduler_EDF_Enqueue>
47d0e: 2f2a 0014 movel %a2@(20),%sp@-
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_lower_than(
47d12: 2079 0006 04a6 moveal 604a6 <_Per_CPU_Information+0x10>,%a0
47d18: 2f28 0014 movel %a0@(20),%sp@-
47d1c: 2079 0005 e6fe moveal 5e6fe <_Scheduler+0x30>,%a0
47d22: 4e90 jsr %a0@
47d24: 4fef 000c lea %sp@(12),%sp
47d28: 4a80 tstl %d0
47d2a: 6c20 bges 47d4c <_Scheduler_EDF_Unblock+0x50>
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
47d2c: 2079 0006 04a2 moveal 604a2 <_Per_CPU_Information+0xc>,%a0
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
47d32: 23ca 0006 04a6 movel %a2,604a6 <_Per_CPU_Information+0x10>
if ( _Thread_Executing->is_preemptible ||
47d38: 4a28 0074 tstb %a0@(116)
47d3c: 6606 bnes 47d44 <_Scheduler_EDF_Unblock+0x48> <== ALWAYS TAKEN
47d3e: 4aaa 0014 tstl %a2@(20) <== NOT EXECUTED
47d42: 6608 bnes 47d4c <_Scheduler_EDF_Unblock+0x50> <== NOT EXECUTED
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
47d44: 7001 moveq #1,%d0
47d46: 13c0 0006 04ae moveb %d0,604ae <_Per_CPU_Information+0x18>
}
}
47d4c: 246e fffc moveal %fp@(-4),%a2
47d50: 4e5e unlk %fp <== NOT EXECUTED
00047d54 <_Scheduler_EDF_Update>:
{
Scheduler_EDF_Per_thread *sched_info =
(Scheduler_EDF_Per_thread*)the_thread->scheduler_info;
RBTree_Node *the_node = &(sched_info->Node);
if (sched_info->queue_state == SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN) {
47d54: 7002 moveq #2,%d0
#include <rtems/score/thread.h>
void _Scheduler_EDF_Update(
Thread_Control *the_thread
)
{
47d56: 4e56 0000 linkw %fp,#0
47d5a: 2f0a movel %a2,%sp@-
47d5c: 246e 0008 moveal %fp@(8),%a2
Scheduler_EDF_Per_thread *sched_info =
47d60: 206a 008a moveal %a2@(138),%a0
#include <rtems/score/thread.h>
void _Scheduler_EDF_Update(
Thread_Control *the_thread
)
{
47d64: 2f02 movel %d2,%sp@-
Scheduler_EDF_Per_thread *sched_info =
(Scheduler_EDF_Per_thread*)the_thread->scheduler_info;
RBTree_Node *the_node = &(sched_info->Node);
if (sched_info->queue_state == SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN) {
47d66: b0a8 0014 cmpl %a0@(20),%d0
47d6a: 6618 bnes 47d84 <_Scheduler_EDF_Update+0x30>
/* Shifts the priority to the region of background tasks. */
the_thread->Start.initial_priority |= (SCHEDULER_EDF_PRIO_MSB);
47d6c: 202a 00ac movel %a2@(172),%d0
47d70: 08c0 001f bset #31,%d0
47d74: 2540 00ac movel %d0,%a2@(172)
the_thread->real_priority = the_thread->Start.initial_priority;
47d78: 2540 0018 movel %d0,%a2@(24)
the_thread->current_priority = the_thread->Start.initial_priority;
47d7c: 2540 0014 movel %d0,%a2@(20)
sched_info->queue_state = SCHEDULER_EDF_QUEUE_STATE_NOT_PRESENTLY;
47d80: 42a8 0014 clrl %a0@(20)
}
if ( sched_info->queue_state == SCHEDULER_EDF_QUEUE_STATE_YES ) {
47d84: 7001 moveq #1,%d0
47d86: b0a8 0014 cmpl %a0@(20),%d0
47d8a: 664c bnes 47dd8 <_Scheduler_EDF_Update+0x84> <== ALWAYS TAKEN
Thread_Control *the_thread
)
{
Scheduler_EDF_Per_thread *sched_info =
(Scheduler_EDF_Per_thread*)the_thread->scheduler_info;
RBTree_Node *the_node = &(sched_info->Node);
47d8c: 2408 movel %a0,%d2 <== NOT EXECUTED
47d8e: 5882 addql #4,%d2 <== NOT EXECUTED
the_thread->current_priority = the_thread->Start.initial_priority;
sched_info->queue_state = SCHEDULER_EDF_QUEUE_STATE_NOT_PRESENTLY;
}
if ( sched_info->queue_state == SCHEDULER_EDF_QUEUE_STATE_YES ) {
_RBTree_Extract(&_Scheduler_EDF_Ready_queue, the_node);
47d90: 2f02 movel %d2,%sp@- <== NOT EXECUTED
47d92: 4879 0006 04b8 pea 604b8 <_Scheduler_EDF_Ready_queue> <== NOT EXECUTED
47d98: 4eb9 0004 bccc jsr 4bccc <_RBTree_Extract> <== NOT EXECUTED
_RBTree_Insert(&_Scheduler_EDF_Ready_queue, the_node);
47d9e: 2f02 movel %d2,%sp@- <== NOT EXECUTED
47da0: 4879 0006 04b8 pea 604b8 <_Scheduler_EDF_Ready_queue> <== NOT EXECUTED
47da6: 4eb9 0004 be90 jsr 4be90 <_RBTree_Insert> <== NOT EXECUTED
_Scheduler_EDF_Schedule();
47dac: 4eb9 0004 7cd8 jsr 47cd8 <_Scheduler_EDF_Schedule> <== NOT EXECUTED
if ( _Thread_Executing != _Thread_Heir ) {
47db2: 2079 0006 04a2 moveal 604a2 <_Per_CPU_Information+0xc>,%a0 <== NOT EXECUTED
47db8: 4fef 0010 lea %sp@(16),%sp <== NOT EXECUTED
47dbc: b1f9 0006 04a6 cmpal 604a6 <_Per_CPU_Information+0x10>,%a0 <== NOT EXECUTED
47dc2: 6714 beqs 47dd8 <_Scheduler_EDF_Update+0x84> <== NOT EXECUTED
if ( _Thread_Executing->is_preemptible ||
47dc4: 4a28 0074 tstb %a0@(116) <== NOT EXECUTED
47dc8: 6606 bnes 47dd0 <_Scheduler_EDF_Update+0x7c> <== NOT EXECUTED
47dca: 4aaa 0014 tstl %a2@(20) <== NOT EXECUTED
47dce: 6608 bnes 47dd8 <_Scheduler_EDF_Update+0x84> <== NOT EXECUTED
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
47dd0: 7001 moveq #1,%d0 <== NOT EXECUTED
47dd2: 13c0 0006 04ae moveb %d0,604ae <_Per_CPU_Information+0x18> <== NOT EXECUTED
}
}
}
47dd8: 242e fff8 movel %fp@(-8),%d2
47ddc: 246e fffc moveal %fp@(-4),%a2
47de0: 4e5e unlk %fp <== NOT EXECUTED
00047de4 <_Scheduler_EDF_Yield>:
Thread_Control *executing = _Thread_Executing;
Scheduler_EDF_Per_thread *executing_info =
(Scheduler_EDF_Per_thread *) executing->scheduler_info;
RBTree_Node *executing_node = &(executing_info->Node);
_ISR_Disable( level );
47de4: 203c 0000 0700 movel #1792,%d0 <== NOT EXECUTED
#include <rtems/score/scheduler.h>
#include <rtems/score/scheduleredf.h>
#include <rtems/score/thread.h>
void _Scheduler_EDF_Yield(void)
{
47dea: 4e56 fff4 linkw %fp,#-12 <== NOT EXECUTED
47dee: 48d7 040c moveml %d2-%d3/%a2,%sp@ <== NOT EXECUTED
Scheduler_EDF_Per_thread *first_info;
RBTree_Node *first_node;
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
47df2: 2479 0006 04a2 moveal 604a2 <_Per_CPU_Information+0xc>,%a2 <== NOT EXECUTED
Scheduler_EDF_Per_thread *executing_info =
47df8: 262a 008a movel %a2@(138),%d3 <== NOT EXECUTED
(Scheduler_EDF_Per_thread *) executing->scheduler_info;
RBTree_Node *executing_node = &(executing_info->Node);
_ISR_Disable( level );
47dfc: 40c2 movew %sr,%d2 <== NOT EXECUTED
47dfe: 8082 orl %d2,%d0 <== NOT EXECUTED
47e00: 46c0 movew %d0,%sr <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _RBTree_Has_only_one_node(
const RBTree_Control *the_rbtree
)
{
if(!the_rbtree) return NULL; /* TODO: expected behavior? */
return (the_rbtree->root->child[RBT_LEFT] == NULL && the_rbtree->root->child[RBT_RIGHT] == NULL);
47e02: 2079 0006 04bc moveal 604bc <_Scheduler_EDF_Ready_queue+0x4>,%a0<== NOT EXECUTED
47e08: 4aa8 0004 tstl %a0@(4) <== NOT EXECUTED
47e0c: 660c bnes 47e1a <_Scheduler_EDF_Yield+0x36> <== NOT EXECUTED
#include <rtems/score/isr.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/scheduleredf.h>
#include <rtems/score/thread.h>
void _Scheduler_EDF_Yield(void)
47e0e: 4aa8 0008 tstl %a0@(8) <== NOT EXECUTED
47e12: 57c0 seq %d0 <== NOT EXECUTED
47e14: 49c0 extbl %d0 <== NOT EXECUTED
47e16: 4480 negl %d0 <== NOT EXECUTED
47e18: 6002 bras 47e1c <_Scheduler_EDF_Yield+0x38> <== NOT EXECUTED
47e1a: 4280 clrl %d0 <== NOT EXECUTED
(Scheduler_EDF_Per_thread *) executing->scheduler_info;
RBTree_Node *executing_node = &(executing_info->Node);
_ISR_Disable( level );
if ( !_RBTree_Has_only_one_node(&_Scheduler_EDF_Ready_queue) ) {
47e1c: 4a00 tstb %d0 <== NOT EXECUTED
47e1e: 6652 bnes 47e72 <_Scheduler_EDF_Yield+0x8e> <== NOT EXECUTED
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
Scheduler_EDF_Per_thread *executing_info =
(Scheduler_EDF_Per_thread *) executing->scheduler_info;
RBTree_Node *executing_node = &(executing_info->Node);
47e20: 5883 addql #4,%d3 <== NOT EXECUTED
if ( !_RBTree_Has_only_one_node(&_Scheduler_EDF_Ready_queue) ) {
/*
* The RBTree has more than one node, enqueue behind the tasks
* with the same priority in case there are such ones.
*/
_RBTree_Extract( &_Scheduler_EDF_Ready_queue, executing_node );
47e22: 2f03 movel %d3,%sp@- <== NOT EXECUTED
47e24: 4879 0006 04b8 pea 604b8 <_Scheduler_EDF_Ready_queue> <== NOT EXECUTED
47e2a: 4eb9 0004 bccc jsr 4bccc <_RBTree_Extract> <== NOT EXECUTED
_RBTree_Insert( &_Scheduler_EDF_Ready_queue, executing_node );
47e30: 2f03 movel %d3,%sp@- <== NOT EXECUTED
47e32: 4879 0006 04b8 pea 604b8 <_Scheduler_EDF_Ready_queue> <== NOT EXECUTED
47e38: 4eb9 0004 be90 jsr 4be90 <_RBTree_Insert> <== NOT EXECUTED
_ISR_Flash( level );
47e3e: 203c 0000 0700 movel #1792,%d0 <== NOT EXECUTED
47e44: 46c2 movew %d2,%sr <== NOT EXECUTED
47e46: 8082 orl %d2,%d0 <== NOT EXECUTED
47e48: 46c0 movew %d0,%sr <== NOT EXECUTED
if ( _Thread_Is_heir( executing ) ) {
47e4a: 4fef 0010 lea %sp@(16),%sp <== NOT EXECUTED
47e4e: b5f9 0006 04a6 cmpal 604a6 <_Per_CPU_Information+0x10>,%a2 <== NOT EXECUTED
47e54: 6624 bnes 47e7a <_Scheduler_EDF_Yield+0x96> <== NOT EXECUTED
first_node = _RBTree_Peek( &_Scheduler_EDF_Ready_queue, RBT_LEFT );
47e56: 42a7 clrl %sp@- <== NOT EXECUTED
47e58: 4879 0006 04b8 pea 604b8 <_Scheduler_EDF_Ready_queue> <== NOT EXECUTED
47e5e: 4eb9 0004 bebc jsr 4bebc <_RBTree_Peek> <== NOT EXECUTED
first_info =
_RBTree_Container_of(first_node, Scheduler_EDF_Per_thread, Node);
_Thread_Heir = first_info->thread;
47e64: 508f addql #8,%sp <== NOT EXECUTED
47e66: 2040 moveal %d0,%a0 <== NOT EXECUTED
47e68: 5988 subql #4,%a0 <== NOT EXECUTED
47e6a: 23d0 0006 04a6 movel %a0@,604a6 <_Per_CPU_Information+0x10><== NOT EXECUTED
47e70: 6008 bras 47e7a <_Scheduler_EDF_Yield+0x96> <== NOT EXECUTED
}
_Thread_Dispatch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
47e72: b5f9 0006 04a6 cmpal 604a6 <_Per_CPU_Information+0x10>,%a2 <== NOT EXECUTED
47e78: 6708 beqs 47e82 <_Scheduler_EDF_Yield+0x9e> <== NOT EXECUTED
_Thread_Dispatch_necessary = true;
47e7a: 7001 moveq #1,%d0 <== NOT EXECUTED
47e7c: 13c0 0006 04ae moveb %d0,604ae <_Per_CPU_Information+0x18> <== NOT EXECUTED
_ISR_Enable( level );
47e82: 46c2 movew %d2,%sr <== NOT EXECUTED
}
47e84: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2 <== NOT EXECUTED
47e8a: 4e5e unlk %fp <== NOT EXECUTED
...
00047434 <_Scheduler_Handler_initialization>:
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
void _Scheduler_Handler_initialization(void)
{
47434: 4e56 0000 linkw %fp,#0
(*_Scheduler.Operations.initialize)();
}
47438: 4e5e unlk %fp
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
void _Scheduler_Handler_initialization(void)
{
(*_Scheduler.Operations.initialize)();
4743a: 2279 0005 d2a2 moveal 5d2a2 <_Scheduler+0x4>,%a1
47440: 4ed1 jmp %a1@
...
0004760c <_Scheduler_priority_Free>:
#include <rtems/score/wkspace.h>
void _Scheduler_priority_Free (
Thread_Control *the_thread
)
{
4760c: 4e56 0000 linkw %fp,#0
_Workspace_Free( the_thread->scheduler_info );
47610: 206e 0008 moveal %fp@(8),%a0
47614: 2d68 008a 0008 movel %a0@(138),%fp@(8)
}
4761a: 4e5e unlk %fp
void _Scheduler_priority_Free (
Thread_Control *the_thread
)
{
_Workspace_Free( the_thread->scheduler_info );
4761c: 4ef9 0004 8c2c jmp 48c2c <_Workspace_Free>
...
00047704 <_Scheduler_priority_Tick>:
#include <rtems/system.h>
#include <rtems/score/schedulerpriority.h>
void _Scheduler_priority_Tick( void )
{
47704: 4e56 0000 linkw %fp,#0
47708: 2f0a movel %a2,%sp@-
Thread_Control *executing;
executing = _Thread_Executing;
4770a: 2479 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a2
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
47710: 4a2a 0074 tstb %a2@(116)
47714: 6758 beqs 4776e <_Scheduler_priority_Tick+0x6a>
return;
if ( !_States_Is_ready( executing->current_state ) )
47716: 4aaa 0010 tstl %a2@(16)
4771a: 6652 bnes 4776e <_Scheduler_priority_Tick+0x6a>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
4771c: 202a 007a movel %a2@(122),%d0
47720: 7201 moveq #1,%d1
47722: b280 cmpl %d0,%d1
47724: 6248 bhis 4776e <_Scheduler_priority_Tick+0x6a>
47726: 123c 0002 moveb #2,%d1
4772a: b280 cmpl %d0,%d1
4772c: 640a bccs 47738 <_Scheduler_priority_Tick+0x34>
4772e: 123c 0003 moveb #3,%d1
47732: b280 cmpl %d0,%d1
47734: 6638 bnes 4776e <_Scheduler_priority_Tick+0x6a> <== NEVER TAKEN
47736: 6020 bras 47758 <_Scheduler_priority_Tick+0x54>
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
#endif
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
47738: 202a 0076 movel %a2@(118),%d0
4773c: 5380 subql #1,%d0
4773e: 2540 0076 movel %d0,%a2@(118)
47742: 6e2a bgts 4776e <_Scheduler_priority_Tick+0x6a>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
47744: 2079 0005 d2aa moveal 5d2aa <_Scheduler+0xc>,%a0
4774a: 4e90 jsr %a0@
* executing thread's timeslice is reset. Otherwise, the
* currently executing thread is placed at the rear of the
* FIFO for this priority and a new heir is selected.
*/
_Scheduler_Yield();
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4774c: 41f9 0005 eb50 lea 5eb50 <_Thread_Ticks_per_timeslice>,%a0
47752: 2550 0076 movel %a0@,%a2@(118)
47756: 6016 bras 4776e <_Scheduler_priority_Tick+0x6a>
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
47758: 202a 0076 movel %a2@(118),%d0
4775c: 5380 subql #1,%d0
4775e: 2540 0076 movel %d0,%a2@(118)
47762: 660a bnes 4776e <_Scheduler_priority_Tick+0x6a>
(*executing->budget_callout)( executing );
47764: 2f0a movel %a2,%sp@-
47766: 206a 007e moveal %a2@(126),%a0
4776a: 4e90 jsr %a0@
4776c: 588f addql #4,%sp
break;
#endif
}
}
4776e: 246e fffc moveal %fp@(-4),%a2
47772: 4e5e unlk %fp
...
000461dc <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
461dc: 4e56 0000 linkw %fp,#0
461e0: 206e 0008 moveal %fp@(8),%a0
461e4: 2f03 movel %d3,%sp@-
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
461e6: 2039 0005 efd8 movel 5efd8 <Configuration+0xc>,%d0
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
461ec: 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) ||
461ee: 4a88 tstl %a0
461f0: 6762 beqs 46254 <_TOD_Validate+0x78> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
461f2: 243c 000f 4240 movel #1000000,%d2
461f8: 4c40 2002 remul %d0,%d2,%d2
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
461fc: b4a8 0018 cmpl %a0@(24),%d2
46200: 6352 blss 46254 <_TOD_Validate+0x78>
(the_tod->ticks >= ticks_per_second) ||
46202: 763b moveq #59,%d3
46204: b6a8 0014 cmpl %a0@(20),%d3
46208: 654a bcss 46254 <_TOD_Validate+0x78>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
4620a: b6a8 0010 cmpl %a0@(16),%d3
4620e: 6544 bcss 46254 <_TOD_Validate+0x78>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
46210: 7017 moveq #23,%d0
46212: b0a8 000c cmpl %a0@(12),%d0
46216: 653c bcss 46254 <_TOD_Validate+0x78>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
46218: 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) ||
4621c: 6736 beqs 46254 <_TOD_Validate+0x78> <== NEVER TAKEN
(the_tod->month == 0) ||
4621e: 720c moveq #12,%d1
46220: b280 cmpl %d0,%d1
46222: 6530 bcss 46254 <_TOD_Validate+0x78>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
46224: 2410 movel %a0@,%d2
(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) ||
46226: 0c82 0000 07c3 cmpil #1987,%d2
4622c: 6326 blss 46254 <_TOD_Validate+0x78>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
4622e: 2228 0008 movel %a0@(8),%d1
(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) ||
46232: 6720 beqs 46254 <_TOD_Validate+0x78> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
46234: 163c 0003 moveb #3,%d3
46238: 41f9 0005 e058 lea 5e058 <_TOD_Days_per_month>,%a0
4623e: c483 andl %d3,%d2
46240: 6606 bnes 46248 <_TOD_Validate+0x6c>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
46242: 2030 0c34 movel %a0@(00000034,%d0:l:4),%d0
46246: 6004 bras 4624c <_TOD_Validate+0x70>
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
46248: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
4624c: b081 cmpl %d1,%d0
4624e: 54c0 scc %d0
46250: 4480 negl %d0
46252: 6002 bras 46256 <_TOD_Validate+0x7a>
(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;
46254: 4200 clrb %d0
if ( the_tod->day > days_in_month )
return false;
return true;
}
46256: 241f movel %sp@+,%d2
46258: 261f movel %sp@+,%d3
4625a: 4e5e unlk %fp
...
00047930 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
47930: 4e56 fff0 linkw %fp,#-16
47934: 48d7 041c moveml %d2-%d4/%a2,%sp@
47938: 246e 0008 moveal %fp@(8),%a2
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
4793c: 282a 0010 movel %a2@(16),%d4
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
47940: 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 );
47944: 2f0a movel %a2,%sp@-
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
47946: 162e 0013 moveb %fp@(19),%d3
/*
* 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 );
4794a: 4eb9 0004 8548 jsr 48548 <_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 )
47950: 588f addql #4,%sp
47952: b4aa 0014 cmpl %a2@(20),%d2
47956: 670c beqs 47964 <_Thread_Change_priority+0x34>
_Thread_Set_priority( the_thread, new_priority );
47958: 2f02 movel %d2,%sp@-
4795a: 2f0a movel %a2,%sp@-
4795c: 4eb9 0004 84ec jsr 484ec <_Thread_Set_priority>
47962: 508f addql #8,%sp
_ISR_Disable( level );
47964: 203c 0000 0700 movel #1792,%d0
4796a: 40c2 movew %sr,%d2
4796c: 8082 orl %d2,%d0
4796e: 46c0 movew %d0,%sr
47970: 7204 moveq #4,%d1
/*
* 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;
47972: 202a 0010 movel %a2@(16),%d0
47976: c284 andl %d4,%d1
if ( state != STATES_TRANSIENT ) {
47978: 7804 moveq #4,%d4
4797a: b880 cmpl %d0,%d4
4797c: 672e beqs 479ac <_Thread_Change_priority+0x7c>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
4797e: 4a81 tstl %d1
47980: 6608 bnes 4798a <_Thread_Change_priority+0x5a> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
47982: 72fb moveq #-5,%d1
47984: c280 andl %d0,%d1
47986: 2541 0010 movel %d1,%a2@(16)
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
4798a: 46c2 movew %d2,%sr
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
4798c: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( state ) ) {
47992: 676c beqs 47a00 <_Thread_Change_priority+0xd0>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
47994: 2d4a 000c movel %a2,%fp@(12)
47998: 2d6a 0044 0008 movel %a2@(68),%fp@(8)
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
4799e: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
479a4: 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 );
479a6: 4ef9 0004 844c jmp 4844c <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
479ac: 4a81 tstl %d1
479ae: 661e bnes 479ce <_Thread_Change_priority+0x9e> <== NEVER TAKEN
* Interrupts are STILL disabled.
* We now know the thread will be in the READY state when we remove
* the TRANSIENT state. So we have to place it on the appropriate
* Ready Queue with interrupts off.
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
479b0: 42aa 0010 clrl %a2@(16)
if ( prepend_it )
479b4: 4a03 tstb %d3
479b6: 670a beqs 479c2 <_Thread_Change_priority+0x92>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
479b8: 2f0a movel %a2,%sp@-
479ba: 2079 0005 d2c6 moveal 5d2c6 <_Scheduler+0x28>,%a0
479c0: 6008 bras 479ca <_Thread_Change_priority+0x9a>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
479c2: 2079 0005 d2c2 moveal 5d2c2 <_Scheduler+0x24>,%a0
479c8: 2f0a movel %a2,%sp@-
479ca: 4e90 jsr %a0@
479cc: 588f addql #4,%sp
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
479ce: 203c 0000 0700 movel #1792,%d0
479d4: 46c2 movew %d2,%sr
479d6: 8082 orl %d2,%d0
479d8: 46c0 movew %d0,%sr
* This kernel routine implements the scheduling decision logic for
* the scheduler. It does NOT dispatch.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( void )
{
_Scheduler.Operations.schedule();
479da: 2079 0005 d2a6 moveal 5d2a6 <_Scheduler+0x8>,%a0
479e0: 4e90 jsr %a0@
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
479e2: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule();
if ( !_Thread_Is_executing_also_the_heir() &&
479e8: b1f9 0005 effe cmpal 5effe <_Per_CPU_Information+0x10>,%a0
479ee: 670e beqs 479fe <_Thread_Change_priority+0xce>
479f0: 4a28 0074 tstb %a0@(116)
479f4: 6708 beqs 479fe <_Thread_Change_priority+0xce>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
479f6: 7801 moveq #1,%d4
479f8: 13c4 0005 f006 moveb %d4,5f006 <_Per_CPU_Information+0x18>
_ISR_Enable( level );
479fe: 46c2 movew %d2,%sr
}
47a00: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
47a06: 4e5e unlk %fp
...
00047be4 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
47be4: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
47be8: 486e fffc pea %fp@(-4)
47bec: 2f2e 0008 movel %fp@(8),%sp@-
47bf0: 4eb9 0004 7da8 jsr 47da8 <_Thread_Get>
switch ( location ) {
47bf6: 508f addql #8,%sp
47bf8: 4aae fffc tstl %fp@(-4)
47bfc: 6624 bnes 47c22 <_Thread_Delay_ended+0x3e> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
47bfe: 2f3c 1000 0018 movel #268435480,%sp@-
47c04: 2f00 movel %d0,%sp@-
47c06: 4eb9 0004 7a0c jsr 47a0c <_Thread_Clear_state>
47c0c: 508f addql #8,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
47c0e: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
47c14: 5380 subql #1,%d0
47c16: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
47c1c: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
47c22: 4e5e unlk %fp
...
00047c28 <_Thread_Dispatch>:
* INTERRUPT LATENCY:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
47c28: 4e56 ffd0 linkw %fp,#-48
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
47c2c: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
47c32: 5280 addql #1,%d0
47c34: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
47c3a: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
47c40: 48d7 3c3c moveml %d2-%d5/%a2-%a5,%sp@
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
47c44: 223c 0000 0700 movel #1792,%d1
#endif
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
47c4a: 2479 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a2
_ISR_Disable( level );
47c50: 40c0 movew %sr,%d0
47c52: 8280 orl %d0,%d1
47c54: 46c1 movew %d1,%sr
_ISR_Enable( level );
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
47c56: 260e movel %fp,%d3
_Timestamp_Subtract(
47c58: 240e movel %fp,%d2
_ISR_Enable( level );
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
47c5a: 0683 ffff fff0 addil #-16,%d3
47c60: 2a3c 0004 af48 movel #307016,%d5
_Timestamp_Subtract(
47c66: 5182 subql #8,%d2
47c68: 283c 0004 86dc movel #296668,%d4
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
47c6e: 4bf9 0004 86a4 lea 486a4 <_Timespec_Add_to>,%a5
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
47c74: 49f9 0004 895c lea 4895c <_User_extensions_Thread_switch>,%a4
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
47c7a: 6000 00d2 braw 47d4e <_Thread_Dispatch+0x126>
heir = _Thread_Heir;
47c7e: 2679 0005 effe moveal 5effe <_Per_CPU_Information+0x10>,%a3
_Thread_Dispatch_necessary = false;
47c84: 4201 clrb %d1
_Thread_Executing = heir;
47c86: 23cb 0005 effa movel %a3,5effa <_Per_CPU_Information+0xc>
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_necessary = false;
47c8c: 13c1 0005 f006 moveb %d1,5f006 <_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 )
47c92: b5cb cmpal %a3,%a2
47c94: 6700 00c2 beqw 47d58 <_Thread_Dispatch+0x130>
*/
#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 )
47c98: 7201 moveq #1,%d1
47c9a: b2ab 007a cmpl %a3@(122),%d1
47c9e: 660a bnes 47caa <_Thread_Dispatch+0x82>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
47ca0: 41f9 0005 eb50 lea 5eb50 <_Thread_Ticks_per_timeslice>,%a0
47ca6: 2750 0076 movel %a0@,%a3@(118)
_ISR_Enable( level );
47caa: 46c0 movew %d0,%sr
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
47cac: 2f03 movel %d3,%sp@-
47cae: 2045 moveal %d5,%a0
47cb0: 4e90 jsr %a0@
_Timestamp_Subtract(
47cb2: 2044 moveal %d4,%a0
47cb4: 2f02 movel %d2,%sp@-
47cb6: 2f03 movel %d3,%sp@-
47cb8: 4879 0005 f008 pea 5f008 <_Per_CPU_Information+0x1a>
47cbe: 4e90 jsr %a0@
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
47cc0: 2f02 movel %d2,%sp@-
47cc2: 486a 0082 pea %a2@(130)
47cc6: 4e95 jsr %a5@
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
47cc8: 2079 0005 ec1e moveal 5ec1e <_Thread_libc_reent>,%a0
47cce: 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;
47cd2: 202e fff0 movel %fp@(-16),%d0
47cd6: 222e fff4 movel %fp@(-12),%d1
47cda: 23c0 0005 f008 movel %d0,5f008 <_Per_CPU_Information+0x1a>
47ce0: 23c1 0005 f00c movel %d1,5f00c <_Per_CPU_Information+0x1e>
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
47ce6: 4a88 tstl %a0
47ce8: 6708 beqs 47cf2 <_Thread_Dispatch+0xca> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
47cea: 2550 00fa movel %a0@,%a2@(250)
*_Thread_libc_reent = heir->libc_reent;
47cee: 20ab 00fa movel %a3@(250),%a0@
}
_User_extensions_Thread_switch( executing, heir );
47cf2: 2f0b movel %a3,%sp@-
47cf4: 2f0a movel %a2,%sp@-
47cf6: 4e94 jsr %a4@
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
47cf8: 486b 00c2 pea %a3@(194)
47cfc: 486a 00c2 pea %a2@(194)
47d00: 4eb9 0004 8c7c jsr 48c7c <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
47d06: 4fef 0010 lea %sp@(16),%sp
47d0a: 4aaa 00f6 tstl %a2@(246)
47d0e: 672c beqs 47d3c <_Thread_Dispatch+0x114>
#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 );
47d10: 2079 0005 ec1a moveal 5ec1a <_Thread_Allocated_fp>,%a0
47d16: b1ca cmpal %a2,%a0
47d18: 6722 beqs 47d3c <_Thread_Dispatch+0x114>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
47d1a: 4a88 tstl %a0
47d1c: 670c beqs 47d2a <_Thread_Dispatch+0x102>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
47d1e: 4868 00f6 pea %a0@(246)
47d22: 4eb9 0004 8dc2 jsr 48dc2 <_CPU_Context_save_fp>
47d28: 588f addql #4,%sp
_Context_Restore_fp( &executing->fp_context );
47d2a: 486a 00f6 pea %a2@(246)
47d2e: 4eb9 0004 8de4 jsr 48de4 <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
47d34: 588f addql #4,%sp
47d36: 23ca 0005 ec1a movel %a2,5ec1a <_Thread_Allocated_fp>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
47d3c: 2479 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a2
_ISR_Disable( level );
47d42: 223c 0000 0700 movel #1792,%d1
47d48: 40c0 movew %sr,%d0
47d4a: 8280 orl %d0,%d1
47d4c: 46c1 movew %d1,%sr
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
47d4e: 1239 0005 f006 moveb 5f006 <_Per_CPU_Information+0x18>,%d1
47d54: 6600 ff28 bnew 47c7e <_Thread_Dispatch+0x56>
_ISR_Disable( level );
}
post_switch:
_ISR_Enable( level );
47d58: 46c0 movew %d0,%sr
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
47d5a: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
47d60: 5380 subql #1,%d0
47d62: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
47d68: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
_Thread_Unnest_dispatch();
_API_extensions_Run_postswitch();
47d6e: 4eb9 0004 6288 jsr 46288 <_API_extensions_Run_postswitch>
}
47d74: 4cee 3c3c ffd0 moveml %fp@(-48),%d2-%d5/%a2-%a5
47d7a: 4e5e unlk %fp
...
00047da8 <_Thread_Get>:
*/
Thread_Control *_Thread_Get (
Objects_Id id,
Objects_Locations *location
)
{
47da8: 4e56 0000 linkw %fp,#0
47dac: 202e 0008 movel %fp@(8),%d0
47db0: 2f03 movel %d3,%sp@-
47db2: 206e 000c moveal %fp@(12),%a0
47db6: 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 ) ) {
47db8: 4a80 tstl %d0
47dba: 661e bnes 47dda <_Thread_Get+0x32>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
47dbc: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
47dc2: 5280 addql #1,%d0
47dc4: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
47dca: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
_Thread_Disable_dispatch();
*location = OBJECTS_LOCAL;
47dd0: 4290 clrl %a0@
tp = _Thread_Executing;
47dd2: 2039 0005 effa movel 5effa <_Per_CPU_Information+0xc>,%d0
goto done;
47dd8: 6044 bras 47e1e <_Thread_Get+0x76>
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
47dda: 7418 moveq #24,%d2
47ddc: 2200 movel %d0,%d1
47dde: e4a9 lsrl %d2,%d1
47de0: 7607 moveq #7,%d3
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
47de2: 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);
47de6: c283 andl %d3,%d1
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
47de8: 2241 moveal %d1,%a1
47dea: 5389 subql #1,%a1
47dec: b489 cmpl %a1,%d2
47dee: 643a bccs 47e2a <_Thread_Get+0x82>
47df0: 6014 bras 47e06 <_Thread_Get+0x5e>
if ( the_class != 1 ) { /* threads are always first class :) */
*location = OBJECTS_ERROR;
goto done;
}
api_information = _Objects_Information_table[ the_api ];
47df2: 43f9 0005 eb54 lea 5eb54 <_Objects_Information_table>,%a1
47df8: 2271 1c00 moveal %a1@(00000000,%d1:l:4),%a1
* There is no way for this to happen if POSIX is enabled. But there
* is actually a test case in sp43 for this which trips it whether or
* not POSIX is enabled. So in the interest of safety, this is left
* on in all configurations.
*/
if ( !api_information ) {
47dfc: 4a89 tstl %a1
47dfe: 6706 beqs 47e06 <_Thread_Get+0x5e>
*location = OBJECTS_ERROR;
goto done;
}
information = api_information[ the_class ];
47e00: 2229 0004 movel %a1@(4),%d1
if ( !information ) {
47e04: 6608 bnes 47e0e <_Thread_Get+0x66>
*location = OBJECTS_ERROR;
47e06: 7001 moveq #1,%d0
47e08: 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;
47e0a: 4280 clrl %d0
}
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
goto done;
47e0c: 6010 bras 47e1e <_Thread_Get+0x76>
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
47e0e: 2f08 movel %a0,%sp@-
47e10: 2f00 movel %d0,%sp@-
47e12: 2f01 movel %d1,%sp@-
47e14: 4eb9 0004 70f8 jsr 470f8 <_Objects_Get>
47e1a: 4fef 000c lea %sp@(12),%sp
done:
return tp;
}
47e1e: 242e fff8 movel %fp@(-8),%d2
47e22: 262e fffc movel %fp@(-4),%d3
47e26: 4e5e unlk %fp
47e28: 4e75 rts
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
47e2a: 761b moveq #27,%d3
47e2c: 2400 movel %d0,%d2
47e2e: e6aa lsrl %d3,%d2
*location = OBJECTS_ERROR;
goto done;
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
47e30: 163c 0001 moveb #1,%d3
47e34: b682 cmpl %d2,%d3
47e36: 67ba beqs 47df2 <_Thread_Get+0x4a>
47e38: 60cc bras 47e06 <_Thread_Get+0x5e>
...
0004cb84 <_Thread_Handler>:
* Input parameters: NONE
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
4cb84: 4e56 0000 linkw %fp,#0
4cb88: 2f0a movel %a2,%sp@-
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static bool doneConstructors;
bool doCons;
#endif
executing = _Thread_Executing;
4cb8a: 2479 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a2
* Input parameters: NONE
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
4cb90: 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;
4cb92: 222a 00a8 movel %a2@(168),%d1
_ISR_Set_level(level);
4cb96: 40c0 movew %sr,%d0
4cb98: e189 lsll #8,%d1
4cb9a: 0280 0000 f8ff andil #63743,%d0
4cba0: 8081 orl %d1,%d0
4cba2: 46c0 movew %d0,%sr
&& _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
if (doCons)
doneConstructors = true;
#else
doCons = !doneConstructors;
doneConstructors = true;
4cba4: 7001 moveq #1,%d0
doCons = !doneConstructors
&& _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
if (doCons)
doneConstructors = true;
#else
doCons = !doneConstructors;
4cba6: 1439 0005 e358 moveb 5e358 <doneConstructors.3399>,%d2
doneConstructors = true;
4cbac: 13c0 0005 e358 moveb %d0,5e358 <doneConstructors.3399>
#endif
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
4cbb2: 4aaa 00f6 tstl %a2@(246)
4cbb6: 6720 beqs 4cbd8 <_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 );
4cbb8: 2079 0005 ec1a moveal 5ec1a <_Thread_Allocated_fp>,%a0
4cbbe: b1ca cmpal %a2,%a0
4cbc0: 6716 beqs 4cbd8 <_Thread_Handler+0x54>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
4cbc2: 4a88 tstl %a0
4cbc4: 670c beqs 4cbd2 <_Thread_Handler+0x4e>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
4cbc6: 4868 00f6 pea %a0@(246)
4cbca: 4eb9 0004 8dc2 jsr 48dc2 <_CPU_Context_save_fp>
4cbd0: 588f addql #4,%sp
_Thread_Allocated_fp = executing;
4cbd2: 23ca 0005 ec1a movel %a2,5ec1a <_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 );
4cbd8: 2f0a movel %a2,%sp@-
4cbda: 4eb9 0004 87d8 jsr 487d8 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
4cbe0: 4eb9 0004 7d80 jsr 47d80 <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (doCons) /* && (volatile void *)_init) */ {
4cbe6: 588f addql #4,%sp
4cbe8: 4a02 tstb %d2
4cbea: 6606 bnes 4cbf2 <_Thread_Handler+0x6e>
INIT_NAME ();
4cbec: 4eb9 0005 b2a8 jsr 5b2a8 <_init>
_Thread_Enable_dispatch();
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
4cbf2: 202a 0092 movel %a2@(146),%d0
4cbf6: 6606 bnes 4cbfe <_Thread_Handler+0x7a>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
4cbf8: 2f2a 009a movel %a2@(154),%sp@-
4cbfc: 600a bras 4cc08 <_Thread_Handler+0x84>
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
4cbfe: 7201 moveq #1,%d1
4cc00: b280 cmpl %d0,%d1
4cc02: 6610 bnes 4cc14 <_Thread_Handler+0x90> <== NEVER TAKEN
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
4cc04: 2f2a 0096 movel %a2@(150),%sp@-
4cc08: 206a 008e moveal %a2@(142),%a0
4cc0c: 4e90 jsr %a0@
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
4cc0e: 588f addql #4,%sp
4cc10: 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 );
4cc14: 2f0a movel %a2,%sp@-
4cc16: 4eb9 0004 8810 jsr 48810 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
4cc1c: 4878 0005 pea 5 <COMPARE>
4cc20: 4878 0001 pea 1 <ADD>
4cc24: 42a7 clrl %sp@-
4cc26: 4eb9 0004 6bdc jsr 46bdc <_Internal_error_Occurred>
00047e3c <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
47e3c: 4e56 ffe4 linkw %fp,#-28
47e40: 222e 0010 movel %fp@(16),%d1
47e44: 48d7 0c7c moveml %d2-%d6/%a2-%a3,%sp@
47e48: 246e 000c moveal %fp@(12),%a2
47e4c: 242e 0014 movel %fp@(20),%d2
47e50: 2a2e 001c movel %fp@(28),%d5
47e54: 282e 0024 movel %fp@(36),%d4
47e58: 162e 001b moveb %fp@(27),%d3
47e5c: 1c2e 0023 moveb %fp@(35),%d6
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
47e60: 42aa 00fe clrl %a2@(254)
47e64: 42aa 0102 clrl %a2@(258)
extensions_area = NULL;
the_thread->libc_reent = NULL;
47e68: 42aa 00fa clrl %a2@(250)
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
47e6c: 4a81 tstl %d1
47e6e: 6624 bnes 47e94 <_Thread_Initialize+0x58>
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
47e70: 2f02 movel %d2,%sp@-
47e72: 2f0a movel %a2,%sp@-
47e74: 4eb9 0004 8584 jsr 48584 <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
47e7a: 508f addql #8,%sp
47e7c: 4a80 tstl %d0
47e7e: 6700 0152 beqw 47fd2 <_Thread_Initialize+0x196>
47e82: b480 cmpl %d0,%d2
47e84: 6200 014c bhiw 47fd2 <_Thread_Initialize+0x196>
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
47e88: 222a 00be movel %a2@(190),%d1
the_thread->Start.core_allocated_stack = true;
47e8c: 7401 moveq #1,%d2
47e8e: 1542 00b0 moveb %d2,%a2@(176)
47e92: 6008 bras 47e9c <_Thread_Initialize+0x60>
} else {
stack = stack_area;
actual_stack_size = stack_size;
the_thread->Start.core_allocated_stack = false;
47e94: 4200 clrb %d0
47e96: 1540 00b0 moveb %d0,%a2@(176)
47e9a: 2002 movel %d2,%d0
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
47e9c: 2541 00b6 movel %d1,%a2@(182)
the_stack->size = size;
47ea0: 2540 00b2 movel %d0,%a2@(178)
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
47ea4: 4a03 tstb %d3
47ea6: 6714 beqs 47ebc <_Thread_Initialize+0x80>
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
47ea8: 4878 001c pea 1c <OPER2+0x8>
47eac: 4eb9 0004 8c10 jsr 48c10 <_Workspace_Allocate>
if ( !fp_area )
47eb2: 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 );
47eb4: 2600 movel %d0,%d3
if ( !fp_area )
47eb6: 6606 bnes 47ebe <_Thread_Initialize+0x82>
47eb8: 6000 00e4 braw 47f9e <_Thread_Initialize+0x162>
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
47ebc: 4283 clrl %d3
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
47ebe: 2039 0005 ec2a movel 5ec2a <_Thread_Maximum_extensions>,%d0
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area )
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
47ec4: 2543 00f6 movel %d3,%a2@(246)
the_thread->Start.fp_context = fp_area;
47ec8: 2543 00ba movel %d3,%a2@(186)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
47ecc: 42aa 0050 clrl %a2@(80)
the_watchdog->routine = routine;
47ed0: 42aa 0064 clrl %a2@(100)
the_watchdog->id = id;
47ed4: 42aa 0068 clrl %a2@(104)
the_watchdog->user_data = user_data;
47ed8: 42aa 006c clrl %a2@(108)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
47edc: 4a80 tstl %d0
47ede: 6718 beqs 47ef8 <_Thread_Initialize+0xbc>
extensions_area = _Workspace_Allocate(
47ee0: e588 lsll #2,%d0
47ee2: 2040 moveal %d0,%a0
47ee4: 4868 0004 pea %a0@(4)
47ee8: 4eb9 0004 8c10 jsr 48c10 <_Workspace_Allocate>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
47eee: 588f addql #4,%sp
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
47ef0: 2400 movel %d0,%d2
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
47ef2: 6606 bnes 47efa <_Thread_Initialize+0xbe>
47ef4: 6000 00aa braw 47fa0 <_Thread_Initialize+0x164>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
47ef8: 4282 clrl %d2
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
47efa: 2542 0106 movel %d2,%a2@(262)
* if they are linked to the thread. An extension user may
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
47efe: 6718 beqs 47f18 <_Thread_Initialize+0xdc>
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
47f00: 2239 0005 ec2a movel 5ec2a <_Thread_Maximum_extensions>,%d1
47f06: 4280 clrl %d0
47f08: 600a bras 47f14 <_Thread_Initialize+0xd8>
the_thread->extensions[i] = NULL;
47f0a: 206a 0106 moveal %a2@(262),%a0
47f0e: 42b0 0c00 clrl %a0@(00000000,%d0:l:4)
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
47f12: 5280 addql #1,%d0
47f14: b280 cmpl %d0,%d1
47f16: 64f2 bccs 47f0a <_Thread_Initialize+0xce>
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
the_thread->Start.budget_algorithm = budget_algorithm;
47f18: 2544 00a0 movel %d4,%a2@(160)
the_thread->Start.budget_callout = budget_callout;
switch ( budget_algorithm ) {
47f1c: 7002 moveq #2,%d0
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
47f1e: 1546 009e moveb %d6,%a2@(158)
the_thread->Start.budget_algorithm = budget_algorithm;
the_thread->Start.budget_callout = budget_callout;
47f22: 256e 0028 00a4 movel %fp@(40),%a2@(164)
switch ( budget_algorithm ) {
47f28: b084 cmpl %d4,%d0
47f2a: 660a bnes 47f36 <_Thread_Initialize+0xfa>
case THREAD_CPU_BUDGET_ALGORITHM_NONE:
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
47f2c: 41f9 0005 eb50 lea 5eb50 <_Thread_Ticks_per_timeslice>,%a0
47f32: 2550 0076 movel %a0@,%a2@(118)
#endif
}
the_thread->Start.isr_level = isr_level;
the_thread->current_state = STATES_DORMANT;
47f36: 7001 moveq #1,%d0
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
47f38: 256e 002c 00a8 movel %fp@(44),%a2@(168)
*/
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.allocate( the_thread );
47f3e: 2079 0005 d2b6 moveal 5d2b6 <_Scheduler+0x18>,%a0
the_thread->current_state = STATES_DORMANT;
47f44: 2540 0010 movel %d0,%a2@(16)
the_thread->Wait.queue = NULL;
47f48: 42aa 0044 clrl %a2@(68)
the_thread->resource_count = 0;
47f4c: 42aa 001c clrl %a2@(28)
the_thread->real_priority = priority;
47f50: 2545 0018 movel %d5,%a2@(24)
the_thread->Start.initial_priority = priority;
47f54: 2545 00ac movel %d5,%a2@(172)
47f58: 2f0a movel %a2,%sp@-
47f5a: 4e90 jsr %a0@
sched =_Scheduler_Allocate( the_thread );
if ( !sched )
47f5c: 588f addql #4,%sp
47f5e: 2800 movel %d0,%d4
47f60: 6740 beqs 47fa2 <_Thread_Initialize+0x166> <== NEVER TAKEN
goto failed;
_Thread_Set_priority( the_thread, priority );
47f62: 2f05 movel %d5,%sp@-
47f64: 2f0a movel %a2,%sp@-
47f66: 4eb9 0004 84ec jsr 484ec <_Thread_Set_priority>
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
47f6c: 206e 0008 moveal %fp@(8),%a0
47f70: 4280 clrl %d0
47f72: 2068 0018 moveal %a0@(24),%a0
47f76: 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 );
47f7a: 42aa 0082 clrl %a2@(130)
47f7e: 42aa 0086 clrl %a2@(134)
47f82: 218a 0c00 movel %a2,%a0@(00000000,%d0:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
47f86: 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 );
47f8c: 2f0a movel %a2,%sp@-
47f8e: 4eb9 0004 8894 jsr 48894 <_User_extensions_Thread_create>
if ( extension_status )
47f94: 4fef 000c lea %sp@(12),%sp
47f98: 4a00 tstb %d0
47f9a: 6706 beqs 47fa2 <_Thread_Initialize+0x166>
47f9c: 6038 bras 47fd6 <_Thread_Initialize+0x19a>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
47f9e: 4282 clrl %d2
size_t actual_stack_size = 0;
void *stack = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
void *fp_area;
#endif
void *sched = NULL;
47fa0: 4284 clrl %d4
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
failed:
_Workspace_Free( the_thread->libc_reent );
47fa2: 2f2a 00fa movel %a2@(250),%sp@-
47fa6: 47f9 0004 8c2c lea 48c2c <_Workspace_Free>,%a3
47fac: 4e93 jsr %a3@
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
_Workspace_Free( the_thread->API_Extensions[i] );
47fae: 2f2a 00fe movel %a2@(254),%sp@-
47fb2: 4e93 jsr %a3@
47fb4: 2f2a 0102 movel %a2@(258),%sp@-
47fb8: 4e93 jsr %a3@
_Workspace_Free( extensions_area );
47fba: 2f02 movel %d2,%sp@-
47fbc: 4e93 jsr %a3@
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Workspace_Free( fp_area );
47fbe: 2f03 movel %d3,%sp@-
47fc0: 4e93 jsr %a3@
#endif
_Workspace_Free( sched );
47fc2: 2f04 movel %d4,%sp@-
47fc4: 4e93 jsr %a3@
_Thread_Stack_Free( the_thread );
47fc6: 2f0a movel %a2,%sp@-
47fc8: 4eb9 0004 85d0 jsr 485d0 <_Thread_Stack_Free>
return false;
47fce: 4fef 001c lea %sp@(28),%sp
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
47fd2: 4200 clrb %d0
47fd4: 6002 bras 47fd8 <_Thread_Initialize+0x19c>
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
47fd6: 7001 moveq #1,%d0
_Workspace_Free( sched );
_Thread_Stack_Free( the_thread );
return false;
}
47fd8: 4cee 0c7c ffe4 moveml %fp@(-28),%d2-%d6/%a2-%a3
47fde: 4e5e unlk %fp
...
00048ae8 <_Thread_Restart>:
*/
RTEMS_INLINE_ROUTINE bool _States_Is_dormant (
States_Control the_states
)
{
return (the_states & STATES_DORMANT);
48ae8: 7001 moveq #1,%d0
bool _Thread_Restart(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
48aea: 4e56 0000 linkw %fp,#0
48aee: 2f0a movel %a2,%sp@-
48af0: 246e 0008 moveal %fp@(8),%a2
48af4: c0aa 0010 andl %a2@(16),%d0
if ( !_States_Is_dormant( the_thread->current_state ) ) {
48af8: 6664 bnes 48b5e <_Thread_Restart+0x76>
_Thread_Set_transient( the_thread );
48afa: 2f0a movel %a2,%sp@-
48afc: 4eb9 0004 8bc8 jsr 48bc8 <_Thread_Set_transient>
_Thread_Reset( the_thread, pointer_argument, numeric_argument );
48b02: 2f2e 0010 movel %fp@(16),%sp@-
48b06: 2f2e 000c movel %fp@(12),%sp@-
48b0a: 2f0a movel %a2,%sp@-
48b0c: 4eb9 0004 bc2c jsr 4bc2c <_Thread_Reset>
_Thread_Load_environment( the_thread );
48b12: 2f0a movel %a2,%sp@-
48b14: 4eb9 0004 b970 jsr 4b970 <_Thread_Load_environment>
_Thread_Ready( the_thread );
48b1a: 2f0a movel %a2,%sp@-
48b1c: 4eb9 0004 bbfc jsr 4bbfc <_Thread_Ready>
_User_extensions_Thread_restart( the_thread );
48b22: 2f0a movel %a2,%sp@-
48b24: 4eb9 0004 8f9c jsr 48f9c <_User_extensions_Thread_restart>
if ( _Thread_Is_executing ( the_thread ) )
48b2a: 4fef 001c lea %sp@(28),%sp
48b2e: b5f9 0005 f902 cmpal 5f902 <_Per_CPU_Information+0xc>,%a2
48b34: 662c bnes 48b62 <_Thread_Restart+0x7a>
*/
RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
{
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( _Thread_Executing->fp_context != NULL )
48b36: 4aaa 00f6 tstl %a2@(246)
48b3a: 670c beqs 48b48 <_Thread_Restart+0x60>
_Context_Restore_fp( &_Thread_Executing->fp_context );
48b3c: 486a 00f6 pea %a2@(246)
48b40: 4eb9 0004 94a4 jsr 494a4 <_CPU_Context_restore_fp>
48b46: 588f addql #4,%sp
#endif
_CPU_Context_Restart_self( &_Thread_Executing->Registers );
48b48: 2079 0005 f902 moveal 5f902 <_Per_CPU_Information+0xc>,%a0
48b4e: 41e8 00c2 lea %a0@(194),%a0
48b52: 2f08 movel %a0,%sp@-
48b54: 4eb9 0004 9352 jsr 49352 <_CPU_Context_Restart_self>
48b5a: 588f addql #4,%sp <== NOT EXECUTED
48b5c: 6004 bras 48b62 <_Thread_Restart+0x7a> <== NOT EXECUTED
_Thread_Restart_self();
return true;
}
return false;
48b5e: 4200 clrb %d0
48b60: 6002 bras 48b64 <_Thread_Restart+0x7c>
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
_Thread_Restart_self();
return true;
48b62: 7001 moveq #1,%d0
}
return false;
}
48b64: 246e fffc moveal %fp@(-4),%a2
48b68: 4e5e unlk %fp <== NOT EXECUTED
000485d0 <_Thread_Stack_Free>:
*/
void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
485d0: 4e56 0000 linkw %fp,#0
485d4: 206e 0008 moveal %fp@(8),%a0
#if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
/*
* If the API provided the stack space, then don't free it.
*/
if ( !the_thread->Start.core_allocated_stack )
485d8: 4a28 00b0 tstb %a0@(176)
485dc: 671c beqs 485fa <_Thread_Stack_Free+0x2a> <== NEVER TAKEN
* 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 )
485de: 2279 0005 d1e0 moveal 5d1e0 <Configuration+0x24>,%a1
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
485e4: 2d68 00b6 0008 movel %a0@(182),%fp@(8)
* 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 )
485ea: 4a89 tstl %a1
485ec: 6704 beqs 485f2 <_Thread_Stack_Free+0x22>
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
485ee: 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 );
485f0: 4ed1 jmp %a1@
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
485f2: 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 );
485f4: 4ef9 0004 8c2c jmp 48c2c <_Workspace_Free>
}
485fa: 4e5e unlk %fp <== NOT EXECUTED
...
000478e0 <_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 ) ) {
478e0: 7202 moveq #2,%d1
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
478e2: 4e56 0000 linkw %fp,#0
478e6: 202e 0010 movel %fp@(16),%d0
478ea: 2f0a movel %a2,%sp@-
478ec: 246e 000c moveal %fp@(12),%a2
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
478f0: 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 ) ) {
478f4: b2aa 0050 cmpl %a2@(80),%d1
478f8: 6618 bnes 47912 <_Thread_blocking_operation_Cancel+0x32>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
478fa: 123c 0003 moveb #3,%d1
478fe: 2541 0050 movel %d1,%a2@(80)
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
47902: 46c0 movew %d0,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
47904: 486a 0048 pea %a2@(72)
47908: 4eb9 0004 8ab8 jsr 48ab8 <_Watchdog_Remove>
4790e: 588f addql #4,%sp
47910: 6002 bras 47914 <_Thread_blocking_operation_Cancel+0x34>
} else
_ISR_Enable( level );
47912: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
47914: 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
}
47918: 246e fffc moveal %fp@(-4),%a2
4791c: 203c 1003 fff8 movel #268697592,%d0
47922: 2d40 000c movel %d0,%fp@(12)
47926: 4e5e unlk %fp
47928: 4ef9 0004 7a0c jmp 47a0c <_Thread_Clear_state>
...
0004cc2c <_Thread_queue_Extract_fifo>:
Thread_Control *the_thread
)
{
ISR_Level level;
_ISR_Disable( level );
4cc2c: 223c 0000 0700 movel #1792,%d1
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
4cc32: 4e56 0000 linkw %fp,#0
4cc36: 2f0a movel %a2,%sp@-
4cc38: 246e 000c moveal %fp@(12),%a2
ISR_Level level;
_ISR_Disable( level );
4cc3c: 40c0 movew %sr,%d0
4cc3e: 8280 orl %d0,%d1
4cc40: 46c1 movew %d1,%sr
4cc42: 222a 0010 movel %a2@(16),%d1
4cc46: 0281 0003 bee0 andil #245472,%d1
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4cc4c: 660a bnes 4cc58 <_Thread_queue_Extract_fifo+0x2c>
_ISR_Enable( level );
4cc4e: 46c0 movew %d0,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4cc50: 246e fffc moveal %fp@(-4),%a2
4cc54: 4e5e unlk %fp
4cc56: 4e75 rts
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
4cc58: 2252 moveal %a2@,%a1
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4cc5a: 7202 moveq #2,%d1
previous = the_node->previous;
4cc5c: 206a 0004 moveal %a2@(4),%a0
next->previous = previous;
4cc60: 2348 0004 movel %a0,%a1@(4)
previous->next = next;
4cc64: 2089 movel %a1,%a0@
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
4cc66: 42aa 0044 clrl %a2@(68)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4cc6a: b2aa 0050 cmpl %a2@(80),%d1
4cc6e: 6704 beqs 4cc74 <_Thread_queue_Extract_fifo+0x48>
_ISR_Enable( level );
4cc70: 46c0 movew %d0,%sr
4cc72: 6014 bras 4cc88 <_Thread_queue_Extract_fifo+0x5c>
4cc74: 7203 moveq #3,%d1
4cc76: 2541 0050 movel %d1,%a2@(80)
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
4cc7a: 46c0 movew %d0,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4cc7c: 486a 0048 pea %a2@(72)
4cc80: 4eb9 0004 8ab8 jsr 48ab8 <_Watchdog_Remove>
4cc86: 588f addql #4,%sp
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4cc88: 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
}
4cc8c: 246e fffc moveal %fp@(-4),%a2
4cc90: 203c 1003 fff8 movel #268697592,%d0
4cc96: 2d40 000c movel %d0,%fp@(12)
4cc9a: 4e5e unlk %fp
4cc9c: 4ef9 0004 7a0c jmp 47a0c <_Thread_Clear_state>
...
0004844c <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
4844c: 4e56 fff0 linkw %fp,#-16
48450: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
48454: 246e 0008 moveal %fp@(8),%a2
48458: 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 )
4845c: 4a8a tstl %a2
4845e: 6746 beqs 484a6 <_Thread_queue_Requeue+0x5a> <== NEVER TAKEN
/*
* If queueing by FIFO, there is nothing to do. This only applies to
* priority blocking discipline.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
48460: 7001 moveq #1,%d0
48462: b0aa 0034 cmpl %a2@(52),%d0
48466: 663e bnes 484a6 <_Thread_queue_Requeue+0x5a> <== NEVER TAKEN
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
48468: 303c 0700 movew #1792,%d0
4846c: 40c2 movew %sr,%d2
4846e: 8082 orl %d2,%d0
48470: 46c0 movew %d0,%sr
48472: 202b 0010 movel %a3@(16),%d0
48476: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4847c: 6726 beqs 484a4 <_Thread_queue_Requeue+0x58> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
4847e: 7001 moveq #1,%d0
48480: 2540 0030 movel %d0,%a2@(48)
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
48484: 4878 0001 pea 1 <ADD>
48488: 2f0b movel %a3,%sp@-
4848a: 2f0a movel %a2,%sp@-
4848c: 4eb9 0004 b434 jsr 4b434 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
48492: 486e fffc pea %fp@(-4)
48496: 2f0b movel %a3,%sp@-
48498: 2f0a movel %a2,%sp@-
4849a: 4eb9 0004 8250 jsr 48250 <_Thread_queue_Enqueue_priority>
484a0: 4fef 0018 lea %sp@(24),%sp
}
_ISR_Enable( level );
484a4: 46c2 movew %d2,%sr
}
}
484a6: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
484ac: 4e5e unlk %fp <== NOT EXECUTED
000484b0 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
484b0: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
484b4: 486e fffc pea %fp@(-4)
484b8: 2f2e 0008 movel %fp@(8),%sp@-
484bc: 4eb9 0004 7da8 jsr 47da8 <_Thread_Get>
switch ( location ) {
484c2: 508f addql #8,%sp
484c4: 4aae fffc tstl %fp@(-4)
484c8: 661e bnes 484e8 <_Thread_queue_Timeout+0x38> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
484ca: 2f00 movel %d0,%sp@-
484cc: 4eb9 0004 b4f8 jsr 4b4f8 <_Thread_queue_Process_timeout>
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
return _Thread_Dispatch_disable_level;
484d2: 588f addql #4,%sp
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
484d4: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
484da: 5380 subql #1,%d0
484dc: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
484e2: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
_Thread_Unnest_dispatch();
break;
}
}
484e8: 4e5e unlk %fp <== NOT EXECUTED
000519e0 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
519e0: 4e56 ffc0 linkw %fp,#-64
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
519e4: 200e movel %fp,%d0
519e6: 41ee ffec lea %fp@(-20),%a0
519ea: 5180 subql #8,%d0
519ec: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
519f0: 246e 0008 moveal %fp@(8),%a2
519f4: 2e0e movel %fp,%d7
519f6: 260e movel %fp,%d3
519f8: 0687 ffff ffe8 addil #-24,%d7
519fe: 0683 ffff fff4 addil #-12,%d3
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
51a04: 2a0a movel %a2,%d5
/*
* 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 );
51a06: 240a movel %a2,%d2
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
51a08: 0685 0000 0030 addil #48,%d5
/*
* 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 );
51a0e: 0682 0000 0068 addil #104,%d2
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
51a14: 2c08 movel %a0,%d6
51a16: 2800 movel %d0,%d4
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
51a18: 2d48 ffe8 movel %a0,%fp@(-24)
head->previous = NULL;
51a1c: 42ae ffec clrl %fp@(-20)
tail->previous = head;
51a20: 2d47 fff0 movel %d7,%fp@(-16)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
51a24: 2d40 fff4 movel %d0,%fp@(-12)
head->previous = NULL;
51a28: 42ae fff8 clrl %fp@(-8)
tail->previous = head;
51a2c: 2d43 fffc movel %d3,%fp@(-4)
{
/*
* 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;
51a30: 2547 0078 movel %d7,%a2@(120)
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
51a34: 47f9 0005 586c lea 5586c <_Watchdog_Adjust_to_chain>,%a3
/*
* 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 );
51a3a: 4bf9 0005 57ec lea 557ec <_Watchdog_Adjust>,%a5
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
51a40: 2039 0007 6c3e movel 76c3e <_Watchdog_Ticks_since_boot>,%d0
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
51a46: 222a 003c movel %a2@(60),%d1
watchdogs->last_snapshot = snapshot;
51a4a: 2540 003c movel %d0,%a2@(60)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
51a4e: 9081 subl %d1,%d0
51a50: 2f03 movel %d3,%sp@-
51a52: 2f00 movel %d0,%sp@-
51a54: 2f05 movel %d5,%sp@-
51a56: 4e93 jsr %a3@
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
51a58: 2879 0007 6bc6 moveal 76bc6 <_TOD_Now>,%a4
/*
* 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 ) {
51a5e: 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;
51a62: 202a 0074 movel %a2@(116),%d0
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
51a66: b08c cmpl %a4,%d0
51a68: 640e bccs 51a78 <_Timer_server_Body+0x98>
/*
* 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 );
51a6a: 2f03 movel %d3,%sp@-
51a6c: 220c movel %a4,%d1
51a6e: 9280 subl %d0,%d1
51a70: 2f01 movel %d1,%sp@-
51a72: 2f02 movel %d2,%sp@-
51a74: 4e93 jsr %a3@
51a76: 6010 bras 51a88 <_Timer_server_Body+0xa8>
} else if ( snapshot < last_snapshot ) {
51a78: b08c cmpl %a4,%d0
51a7a: 6310 blss 51a8c <_Timer_server_Body+0xac>
/*
* 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 );
51a7c: 908c subl %a4,%d0
51a7e: 2f00 movel %d0,%sp@-
51a80: 4878 0001 pea 1 <ADD>
51a84: 2f02 movel %d2,%sp@-
51a86: 4e95 jsr %a5@
51a88: 4fef 000c lea %sp@(12),%sp
}
watchdogs->last_snapshot = snapshot;
51a8c: 254c 0074 movel %a4,%a2@(116)
)
{
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 );
51a90: 49f9 0005 58f8 lea 558f8 <_Watchdog_Insert>,%a4
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
51a96: 202a 0078 movel %a2@(120),%d0
51a9a: 2f00 movel %d0,%sp@-
51a9c: 4eb9 0005 24c0 jsr 524c0 <_Chain_Get>
if ( timer == NULL ) {
51aa2: 588f addql #4,%sp
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
51aa4: 2040 moveal %d0,%a0
if ( timer == NULL ) {
51aa6: 4a80 tstl %d0
51aa8: 6724 beqs 51ace <_Timer_server_Body+0xee> <== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
51aaa: 2028 0038 movel %a0@(56),%d0 <== NOT EXECUTED
51aae: 7201 moveq #1,%d1 <== NOT EXECUTED
51ab0: b280 cmpl %d0,%d1 <== NOT EXECUTED
51ab2: 6608 bnes 51abc <_Timer_server_Body+0xdc> <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
51ab4: 4868 0010 pea %a0@(16) <== NOT EXECUTED
51ab8: 2f05 movel %d5,%sp@- <== NOT EXECUTED
51aba: 600c bras 51ac8 <_Timer_server_Body+0xe8> <== NOT EXECUTED
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
51abc: 7203 moveq #3,%d1 <== NOT EXECUTED
51abe: b280 cmpl %d0,%d1 <== NOT EXECUTED
51ac0: 66d4 bnes 51a96 <_Timer_server_Body+0xb6> <== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
51ac2: 4868 0010 pea %a0@(16) <== NOT EXECUTED
51ac6: 2f02 movel %d2,%sp@- <== NOT EXECUTED
51ac8: 4e94 jsr %a4@ <== NOT EXECUTED
51aca: 508f addql #8,%sp <== NOT EXECUTED
51acc: 60c8 bras 51a96 <_Timer_server_Body+0xb6> <== 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 );
51ace: 203c 0000 0700 movel #1792,%d0
51ad4: 40c1 movew %sr,%d1
51ad6: 8081 orl %d1,%d0
51ad8: 46c0 movew %d0,%sr
if ( _Chain_Is_empty( insert_chain ) ) {
51ada: bcae ffe8 cmpl %fp@(-24),%d6
51ade: 6612 bnes 51af2 <_Timer_server_Body+0x112> <== NEVER TAKEN
ts->insert_chain = NULL;
51ae0: 42aa 0078 clrl %a2@(120)
_ISR_Enable( level );
51ae4: 46c1 movew %d1,%sr
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
51ae6: 367c 0700 moveaw #1792,%a3
_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 ) ) {
51aea: b8ae fff4 cmpl %fp@(-12),%d4
51aee: 6608 bnes 51af8 <_Timer_server_Body+0x118>
51af0: 603e bras 51b30 <_Timer_server_Body+0x150>
ts->insert_chain = NULL;
_ISR_Enable( level );
break;
} else {
_ISR_Enable( level );
51af2: 46c1 movew %d1,%sr <== NOT EXECUTED
51af4: 6000 ff4a braw 51a40 <_Timer_server_Body+0x60> <== NOT EXECUTED
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
51af8: 200b movel %a3,%d0
51afa: 40c1 movew %sr,%d1
51afc: 8081 orl %d1,%d0
51afe: 46c0 movew %d0,%sr
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
51b00: 206e fff4 moveal %fp@(-12),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
51b04: b888 cmpl %a0,%d4
51b06: 6722 beqs 51b2a <_Timer_server_Body+0x14a>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
51b08: 2250 moveal %a0@,%a1
head->next = new_first;
new_first->previous = head;
51b0a: 2343 0004 movel %d3,%a1@(4)
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
51b0e: 42a8 0008 clrl %a0@(8)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
51b12: 2d49 fff4 movel %a1,%fp@(-12)
_ISR_Enable( level );
51b16: 46c1 movew %d1,%sr
/*
* The timer server may block here and wait for resources or time.
* The system watchdogs are inactive and will remain inactive since
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
51b18: 2f28 0024 movel %a0@(36),%sp@-
51b1c: 2f28 0020 movel %a0@(32),%sp@-
51b20: 2068 001c moveal %a0@(28),%a0
51b24: 4e90 jsr %a0@
}
51b26: 508f addql #8,%sp
51b28: 60ce bras 51af8 <_Timer_server_Body+0x118>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
51b2a: 46c1 movew %d1,%sr
51b2c: 6000 ff02 braw 51a30 <_Timer_server_Body+0x50>
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
51b30: 47f9 0005 5a1c lea 55a1c <_Watchdog_Remove>,%a3
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
51b36: 4200 clrb %d0
51b38: 1540 007c moveb %d0,%a2@(124)
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
51b3c: 4eba fdc2 jsr %pc@(51900 <_Thread_Disable_dispatch>)
_Thread_Set_state( ts->thread, STATES_DELAYING );
51b40: 4878 0008 pea 8 <DIVIDE_BY_ZERO>
51b44: 2f12 movel %a2@,%sp@-
51b46: 4eb9 0005 52bc jsr 552bc <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
51b4c: 2f0a movel %a2,%sp@-
51b4e: 4eba fdcc jsr %pc@(5191c <_Timer_server_Reset_interval_system_watchdog>)
_Timer_server_Reset_tod_system_watchdog( ts );
51b52: 2f0a movel %a2,%sp@-
51b54: 4eba fe26 jsr %pc@(5197c <_Timer_server_Reset_tod_system_watchdog>)
_Thread_Enable_dispatch();
51b58: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
ts->active = true;
51b5e: 7201 moveq #1,%d1
51b60: 1541 007c moveb %d1,%a2@(124)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
51b64: 486a 0008 pea %a2@(8)
51b68: 4e93 jsr %a3@
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
51b6a: 486a 0040 pea %a2@(64)
51b6e: 4e93 jsr %a3@
51b70: 4fef 0018 lea %sp@(24),%sp
51b74: 6000 feba braw 51a30 <_Timer_server_Body+0x50>
00051b78 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
51b78: 4e56 fff0 linkw %fp,#-16
51b7c: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
51b80: 246e 0008 moveal %fp@(8),%a2
51b84: 266e 000c moveal %fp@(12),%a3
if ( ts->insert_chain == NULL ) {
51b88: 202a 0078 movel %a2@(120),%d0
51b8c: 6600 00ea bnew 51c78 <_Timer_server_Schedule_operation_method+0x100>
* is the reference point for the delta chain. Thus if we do not update the
* reference point we have to add DT to the initial delta of the watchdog
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
51b90: 4eba fd6e jsr %pc@(51900 <_Thread_Disable_dispatch>)
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
51b94: 202b 0038 movel %a3@(56),%d0
51b98: 7201 moveq #1,%d1
51b9a: b280 cmpl %d0,%d1
51b9c: 665c bnes 51bfa <_Timer_server_Schedule_operation_method+0x82>
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
51b9e: 203c 0000 0700 movel #1792,%d0
51ba4: 40c2 movew %sr,%d2
51ba6: 8082 orl %d2,%d0
51ba8: 46c0 movew %d0,%sr
snapshot = _Watchdog_Ticks_since_boot;
51baa: 2039 0007 6c3e movel 76c3e <_Watchdog_Ticks_since_boot>,%d0
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
51bb0: 43ea 0034 lea %a2@(52),%a1
last_snapshot = ts->Interval_watchdogs.last_snapshot;
51bb4: 222a 003c movel %a2@(60),%d1
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
51bb8: 206a 0030 moveal %a2@(48),%a0
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
51bbc: b3c8 cmpal %a0,%a1
51bbe: 6716 beqs 51bd6 <_Timer_server_Schedule_operation_method+0x5e>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
51bc0: 2240 moveal %d0,%a1
51bc2: 93c1 subal %d1,%a1
delta_interval = first_watchdog->delta_interval;
51bc4: 2228 0010 movel %a0@(16),%d1
if (delta_interval > delta) {
51bc8: b3c1 cmpal %d1,%a1
51bca: 6404 bccs 51bd0 <_Timer_server_Schedule_operation_method+0x58>
delta_interval -= delta;
51bcc: 9289 subl %a1,%d1
51bce: 6002 bras 51bd2 <_Timer_server_Schedule_operation_method+0x5a>
} else {
delta_interval = 0;
51bd0: 4281 clrl %d1
}
first_watchdog->delta_interval = delta_interval;
51bd2: 2141 0010 movel %d1,%a0@(16)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
51bd6: 2540 003c movel %d0,%a2@(60)
_ISR_Enable( level );
51bda: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
51bdc: 486b 0010 pea %a3@(16)
51be0: 486a 0030 pea %a2@(48)
51be4: 4eb9 0005 58f8 jsr 558f8 <_Watchdog_Insert>
if ( !ts->active ) {
51bea: 508f addql #8,%sp
51bec: 102a 007c moveb %a2@(124),%d0
51bf0: 6678 bnes 51c6a <_Timer_server_Schedule_operation_method+0xf2>
_Timer_server_Reset_interval_system_watchdog( ts );
51bf2: 2f0a movel %a2,%sp@-
51bf4: 4eba fd26 jsr %pc@(5191c <_Timer_server_Reset_interval_system_watchdog>)
51bf8: 606e bras 51c68 <_Timer_server_Schedule_operation_method+0xf0>
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
51bfa: 7203 moveq #3,%d1
51bfc: b280 cmpl %d0,%d1
51bfe: 666a bnes 51c6a <_Timer_server_Schedule_operation_method+0xf2>
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
51c00: 203c 0000 0700 movel #1792,%d0
51c06: 40c2 movew %sr,%d2
51c08: 8082 orl %d2,%d0
51c0a: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
51c0c: 200a movel %a2,%d0
51c0e: 0680 0000 006c addil #108,%d0
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
51c14: 2239 0007 6bc6 movel 76bc6 <_TOD_Now>,%d1
last_snapshot = ts->TOD_watchdogs.last_snapshot;
51c1a: 226a 0074 moveal %a2@(116),%a1
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
51c1e: 206a 0068 moveal %a2@(104),%a0
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
51c22: b088 cmpl %a0,%d0
51c24: 6720 beqs 51c46 <_Timer_server_Schedule_operation_method+0xce>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
51c26: 2028 0010 movel %a0@(16),%d0
if ( snapshot > last_snapshot ) {
51c2a: b3c1 cmpal %d1,%a1
51c2c: 640c bccs 51c3a <_Timer_server_Schedule_operation_method+0xc2>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
51c2e: 2841 moveal %d1,%a4
51c30: 99c9 subal %a1,%a4
if (delta_interval > delta) {
51c32: b9c0 cmpal %d0,%a4
51c34: 640a bccs 51c40 <_Timer_server_Schedule_operation_method+0xc8><== NEVER TAKEN
delta_interval -= delta;
51c36: 908c subl %a4,%d0
51c38: 6008 bras 51c42 <_Timer_server_Schedule_operation_method+0xca>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
51c3a: d089 addl %a1,%d0
delta_interval += delta;
51c3c: 9081 subl %d1,%d0
51c3e: 6002 bras 51c42 <_Timer_server_Schedule_operation_method+0xca>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
51c40: 4280 clrl %d0 <== NOT EXECUTED
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
51c42: 2140 0010 movel %d0,%a0@(16)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
51c46: 2541 0074 movel %d1,%a2@(116)
_ISR_Enable( level );
51c4a: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
51c4c: 486b 0010 pea %a3@(16)
51c50: 486a 0068 pea %a2@(104)
51c54: 4eb9 0005 58f8 jsr 558f8 <_Watchdog_Insert>
if ( !ts->active ) {
51c5a: 508f addql #8,%sp
51c5c: 102a 007c moveb %a2@(124),%d0
51c60: 6608 bnes 51c6a <_Timer_server_Schedule_operation_method+0xf2>
_Timer_server_Reset_tod_system_watchdog( ts );
51c62: 2f0a movel %a2,%sp@-
51c64: 4eba fd16 jsr %pc@(5197c <_Timer_server_Reset_tod_system_watchdog>)
51c68: 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 );
}
}
51c6a: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
51c70: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
51c72: 4ef9 0005 4ab4 jmp 54ab4 <_Thread_Enable_dispatch>
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
51c78: 202a 0078 movel %a2@(120),%d0 <== NOT EXECUTED
51c7c: 2d4b 000c movel %a3,%fp@(12) <== NOT EXECUTED
}
}
51c80: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4 <== 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 );
51c86: 2d40 0008 movel %d0,%fp@(8) <== NOT EXECUTED
}
}
51c8a: 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 );
51c8c: 4ef9 0005 2460 jmp 52460 <_Chain_Append> <== NOT EXECUTED
00048724 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
48724: 4e56 ffe8 linkw %fp,#-24
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
48728: 203c 0005 ece4 movel #388324,%d0
4872e: 23c0 0005 ece0 movel %d0,5ece0 <_User_extensions_List>
head->previous = NULL;
tail->previous = head;
48734: 203c 0005 ece0 movel #388320,%d0
4873a: 23c0 0005 ece8 movel %d0,5ece8 <_User_extensions_List+0x8>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
48740: 203c 0005 eba0 movel #388000,%d0
48746: 23c0 0005 eb9c movel %d0,5eb9c <_User_extensions_Switches_list>
head->previous = NULL;
tail->previous = head;
4874c: 203c 0005 eb9c movel #387996,%d0
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
48752: 42b9 0005 ece4 clrl 5ece4 <_User_extensions_List+0x4>
48758: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%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;
4875c: 2839 0005 d1f2 movel 5d1f2 <Configuration+0x36>,%d4
initial_extensions = Configuration.User_extension_table;
48762: 2639 0005 d1f6 movel 5d1f6 <Configuration+0x3a>,%d3
48768: 42b9 0005 eba0 clrl 5eba0 <_User_extensions_Switches_list+0x4>
tail->previous = head;
4876e: 23c0 0005 eba4 movel %d0,5eba4 <_User_extensions_Switches_list+0x8>
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
48774: 4a83 tstl %d3
48776: 6754 beqs 487cc <_User_extensions_Handler_initialization+0xa8><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
48778: 7434 moveq #52,%d2
4877a: 4c04 2800 mulsl %d4,%d2
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
4877e: 49f9 0004 d588 lea 4d588 <memcpy>,%a4
_User_extensions_Add_set( extension );
48784: 47f9 0004 b5c0 lea 4b5c0 <_User_extensions_Add_set>,%a3
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
4878a: 2f02 movel %d2,%sp@-
4878c: 4eb9 0004 8c46 jsr 48c46 <_Workspace_Allocate_or_fatal_error>
48792: 2440 moveal %d0,%a2
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
48794: 2f02 movel %d2,%sp@-
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
48796: 4282 clrl %d2
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
48798: 42a7 clrl %sp@-
4879a: 2f00 movel %d0,%sp@-
4879c: 4eb9 0004 d5f8 jsr 4d5f8 <memset>
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
487a2: 4fef 0010 lea %sp@(16),%sp
487a6: 6020 bras 487c8 <_User_extensions_Handler_initialization+0xa4>
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
487a8: 4878 0020 pea 20 <OPER2+0xc>
487ac: 5282 addql #1,%d2
487ae: 2f03 movel %d3,%sp@-
487b0: 486a 0014 pea %a2@(20)
487b4: 0683 0000 0020 addil #32,%d3
487ba: 4e94 jsr %a4@
_User_extensions_Add_set( extension );
487bc: 2f0a movel %a2,%sp@-
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
487be: 45ea 0034 lea %a2@(52),%a2
487c2: 4e93 jsr %a3@
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
487c4: 4fef 0010 lea %sp@(16),%sp
487c8: b882 cmpl %d2,%d4
487ca: 66dc bnes 487a8 <_User_extensions_Handler_initialization+0x84>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
487cc: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
487d2: 4e5e unlk %fp
...
00049c60 <_Watchdog_Adjust>:
Watchdog_Interval units
)
{
ISR_Level level;
_ISR_Disable( level );
49c60: 327c 0700 moveaw #1792,%a1
49c64: 2209 movel %a1,%d1
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
49c66: 4e56 ffec linkw %fp,#-20
49c6a: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
49c6e: 266e 0008 moveal %fp@(8),%a3
49c72: 262e 000c movel %fp@(12),%d3
49c76: 242e 0010 movel %fp@(16),%d2
ISR_Level level;
_ISR_Disable( level );
49c7a: 40c0 movew %sr,%d0
49c7c: 8280 orl %d0,%d1
49c7e: 46c1 movew %d1,%sr
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
49c80: 244b moveal %a3,%a2
49c82: 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 ) ) {
49c84: b5c8 cmpal %a0,%a2
49c86: 674c beqs 49cd4 <_Watchdog_Adjust+0x74>
switch ( direction ) {
49c88: 4a83 tstl %d3
49c8a: 673c beqs 49cc8 <_Watchdog_Adjust+0x68>
49c8c: 7201 moveq #1,%d1
49c8e: b283 cmpl %d3,%d1
49c90: 6642 bnes 49cd4 <_Watchdog_Adjust+0x74> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
49c92: d5a8 0010 addl %d2,%a0@(16)
break;
49c96: 603c bras 49cd4 <_Watchdog_Adjust+0x74>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
49c98: 2053 moveal %a3@,%a0
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
49c9a: 2228 0010 movel %a0@(16),%d1
49c9e: b282 cmpl %d2,%d1
49ca0: 6308 blss 49caa <_Watchdog_Adjust+0x4a>
_Watchdog_First( header )->delta_interval -= units;
49ca2: 9282 subl %d2,%d1
49ca4: 2141 0010 movel %d1,%a0@(16)
break;
49ca8: 602a bras 49cd4 <_Watchdog_Adjust+0x74>
} else {
units -= _Watchdog_First( header )->delta_interval;
49caa: 9481 subl %d1,%d2
_Watchdog_First( header )->delta_interval = 1;
49cac: 7201 moveq #1,%d1
49cae: 2141 0010 movel %d1,%a0@(16)
_ISR_Enable( level );
49cb2: 46c0 movew %d0,%sr
_Watchdog_Tickle( header );
49cb4: 2f0b movel %a3,%sp@-
49cb6: 4e94 jsr %a4@
_ISR_Disable( level );
49cb8: 2203 movel %d3,%d1
49cba: 40c0 movew %sr,%d0
49cbc: 8280 orl %d0,%d1
49cbe: 46c1 movew %d1,%sr
if ( _Chain_Is_empty( header ) )
49cc0: 588f addql #4,%sp
49cc2: b5d3 cmpal %a3@,%a2
49cc4: 660a bnes 49cd0 <_Watchdog_Adjust+0x70>
49cc6: 600c bras 49cd4 <_Watchdog_Adjust+0x74>
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
_ISR_Enable( level );
_Watchdog_Tickle( header );
49cc8: 49f9 0004 9e80 lea 49e80 <_Watchdog_Tickle>,%a4
_ISR_Disable( level );
49cce: 2609 movel %a1,%d3
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
49cd0: 4a82 tstl %d2
49cd2: 66c4 bnes 49c98 <_Watchdog_Adjust+0x38> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
49cd4: 46c0 movew %d0,%sr
}
49cd6: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4
49cdc: 4e5e unlk %fp <== NOT EXECUTED
00048ab8 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
48ab8: 203c 0000 0700 movel #1792,%d0
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
48abe: 4e56 0000 linkw %fp,#0
48ac2: 206e 0008 moveal %fp@(8),%a0
48ac6: 2f0a movel %a2,%sp@-
48ac8: 2f02 movel %d2,%sp@-
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
48aca: 40c1 movew %sr,%d1
48acc: 8081 orl %d1,%d0
48ace: 46c0 movew %d0,%sr
previous_state = the_watchdog->state;
48ad0: 2028 0008 movel %a0@(8),%d0
switch ( previous_state ) {
48ad4: 7401 moveq #1,%d2
48ad6: b480 cmpl %d0,%d2
48ad8: 670c beqs 48ae6 <_Watchdog_Remove+0x2e>
48ada: 6242 bhis 48b1e <_Watchdog_Remove+0x66>
48adc: 143c 0003 moveb #3,%d2
48ae0: b480 cmpl %d0,%d2
48ae2: 653a bcss 48b1e <_Watchdog_Remove+0x66> <== NEVER TAKEN
48ae4: 6006 bras 48aec <_Watchdog_Remove+0x34>
/*
* It is not actually on the chain so just change the state and
* the Insert operation we interrupted will be aborted.
*/
the_watchdog->state = WATCHDOG_INACTIVE;
48ae6: 42a8 0008 clrl %a0@(8)
break;
48aea: 6032 bras 48b1e <_Watchdog_Remove+0x66>
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
48aec: 2250 moveal %a0@,%a1
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
48aee: 42a8 0008 clrl %a0@(8)
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
48af2: 4a91 tstl %a1@
48af4: 6708 beqs 48afe <_Watchdog_Remove+0x46>
next_watchdog->delta_interval += the_watchdog->delta_interval;
48af6: 2428 0010 movel %a0@(16),%d2
48afa: d5a9 0010 addl %d2,%a1@(16)
if ( _Watchdog_Sync_count )
48afe: 2479 0005 ec96 moveal 5ec96 <_Watchdog_Sync_count>,%a2
48b04: 4a8a tstl %a2
48b06: 670c beqs 48b14 <_Watchdog_Remove+0x5c>
_Watchdog_Sync_level = _ISR_Nest_level;
48b08: 45f9 0005 eff6 lea 5eff6 <_Per_CPU_Information+0x8>,%a2
48b0e: 23d2 0005 ec3c movel %a2@,5ec3c <_Watchdog_Sync_level>
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
48b14: 2468 0004 moveal %a0@(4),%a2
next->previous = previous;
48b18: 234a 0004 movel %a2,%a1@(4)
previous->next = next;
48b1c: 2489 movel %a1,%a2@
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
48b1e: 2279 0005 ec9a moveal 5ec9a <_Watchdog_Ticks_since_boot>,%a1
48b24: 2149 0018 movel %a1,%a0@(24)
_ISR_Enable( level );
48b28: 46c1 movew %d1,%sr
return( previous_state );
}
48b2a: 241f movel %sp@+,%d2
48b2c: 245f moveal %sp@+,%a2
48b2e: 4e5e unlk %fp
...
00045f10 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
45f10: 4e56 ffe8 linkw %fp,#-24
45f14: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
45f18: 4879 0006 12c8 pea 612c8 <aio_request_queue>
45f1e: 49f9 0004 6fe0 lea 46fe0 <pthread_mutex_lock>,%a4
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
45f24: 242e 0008 movel %fp@(8),%d2
45f28: 246e 000c moveal %fp@(12),%a2
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
45f2c: 4e94 jsr %a4@
if (fcntl (fildes, F_GETFD) < 0) {
45f2e: 4878 0001 pea 1 <ADD>
45f32: 2f02 movel %d2,%sp@-
45f34: 4eb9 0004 c41c jsr 4c41c <fcntl>
45f3a: 4fef 000c lea %sp@(12),%sp
45f3e: 4a80 tstl %d0
45f40: 6c1c bges 45f5e <aio_cancel+0x4e>
pthread_mutex_unlock(&aio_request_queue.mutex);
45f42: 4879 0006 12c8 pea 612c8 <aio_request_queue>
45f48: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
45f4e: 4eb9 0004 f1bc jsr 4f1bc <__errno>
45f54: 7209 moveq #9,%d1
45f56: 2040 moveal %d0,%a0
45f58: 2081 movel %d1,%a0@
45f5a: 6000 00f6 braw 46052 <aio_cancel+0x142>
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
45f5e: 4a8a tstl %a2
45f60: 6600 00d2 bnew 46034 <aio_cancel+0x124>
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
45f64: 42a7 clrl %sp@-
45f66: 47f9 0004 62ba lea 462ba <rtems_aio_search_fd>,%a3
45f6c: 2f02 movel %d2,%sp@-
45f6e: 4879 0006 1310 pea 61310 <aio_request_queue+0x48>
45f74: 4e93 jsr %a3@
if (r_chain == NULL) {
45f76: 4fef 000c lea %sp@(12),%sp
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
45f7a: 2440 moveal %d0,%a2
if (r_chain == NULL) {
45f7c: 4a80 tstl %d0
45f7e: 667c bnes 45ffc <aio_cancel+0xec>
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
45f80: 203c 0006 1320 movel #398112,%d0
45f86: b0b9 0006 131c cmpl 6131c <aio_request_queue+0x54>,%d0
45f8c: 6700 012c beqw 460ba <aio_cancel+0x1aa>
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
45f90: 42a7 clrl %sp@-
45f92: 2f02 movel %d2,%sp@-
45f94: 4879 0006 131c pea 6131c <aio_request_queue+0x54>
45f9a: 4e93 jsr %a3@
if (r_chain == NULL) {
45f9c: 4fef 000c lea %sp@(12),%sp
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
45fa0: 2400 movel %d0,%d2
if (r_chain == NULL) {
45fa2: 6616 bnes 45fba <aio_cancel+0xaa>
pthread_mutex_unlock(&aio_request_queue.mutex);
45fa4: 4879 0006 12c8 pea 612c8 <aio_request_queue>
return AIO_ALLDONE;
45faa: 143c 0002 moveb #2,%d2
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
if (r_chain == NULL) {
pthread_mutex_unlock(&aio_request_queue.mutex);
45fae: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
return AIO_ALLDONE;
45fb4: 588f addql #4,%sp
45fb6: 6000 0144 braw 460fc <aio_cancel+0x1ec>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
45fba: 2f00 movel %d0,%sp@-
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
pthread_mutex_destroy (&r_chain->mutex);
45fbc: 2602 movel %d2,%d3
45fbe: 0683 0000 001c addil #28,%d3
45fc4: 4eb9 0004 8854 jsr 48854 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
45fca: 2f02 movel %d2,%sp@-
45fcc: 4eb9 0004 660c jsr 4660c <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
45fd2: 2f03 movel %d3,%sp@-
45fd4: 4eb9 0004 6da8 jsr 46da8 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
45fda: 2f03 movel %d3,%sp@-
45fdc: 4eb9 0004 6a94 jsr 46a94 <pthread_cond_destroy>
free (r_chain);
45fe2: 2f02 movel %d2,%sp@-
45fe4: 4eb9 0004 33b4 jsr 433b4 <free>
pthread_mutex_unlock (&aio_request_queue.mutex);
45fea: 4879 0006 12c8 pea 612c8 <aio_request_queue>
45ff0: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
return AIO_CANCELED;
45ff6: 4fef 0018 lea %sp@(24),%sp
45ffa: 6032 bras 4602e <aio_cancel+0x11e>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
45ffc: 2400 movel %d0,%d2
45ffe: 0682 0000 001c addil #28,%d2
46004: 2f02 movel %d2,%sp@-
46006: 4e94 jsr %a4@
46008: 2f0a movel %a2,%sp@-
4600a: 4eb9 0004 8854 jsr 48854 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
46010: 2f0a movel %a2,%sp@-
pthread_mutex_unlock (&r_chain->mutex);
46012: 45f9 0004 7078 lea 47078 <pthread_mutex_unlock>,%a2
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
46018: 4eb9 0004 660c jsr 4660c <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
4601e: 2f02 movel %d2,%sp@-
46020: 4e92 jsr %a2@
pthread_mutex_unlock (&aio_request_queue.mutex);
46022: 4879 0006 12c8 pea 612c8 <aio_request_queue>
46028: 4e92 jsr %a2@
return AIO_CANCELED;
4602a: 4fef 0014 lea %sp@(20),%sp
4602e: 4282 clrl %d2
46030: 6000 00ca braw 460fc <aio_cancel+0x1ec>
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
46034: 2612 movel %a2@,%d3
46036: b483 cmpl %d3,%d2
46038: 6720 beqs 4605a <aio_cancel+0x14a>
pthread_mutex_unlock (&aio_request_queue.mutex);
4603a: 4879 0006 12c8 pea 612c8 <aio_request_queue>
46040: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
46046: 4eb9 0004 f1bc jsr 4f1bc <__errno>
4604c: 2040 moveal %d0,%a0
4604e: 7016 moveq #22,%d0
46050: 2080 movel %d0,%a0@
46052: 588f addql #4,%sp
46054: 74ff moveq #-1,%d2
46056: 6000 00a4 braw 460fc <aio_cancel+0x1ec>
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
4605a: 42a7 clrl %sp@-
4605c: 4bf9 0004 62ba lea 462ba <rtems_aio_search_fd>,%a5
46062: 2f03 movel %d3,%sp@-
46064: 4879 0006 1310 pea 61310 <aio_request_queue+0x48>
4606a: 4e95 jsr %a5@
if (r_chain == NULL) {
4606c: 4fef 000c lea %sp@(12),%sp
if (aiocbp->aio_fildes != fildes) {
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
46070: 2640 moveal %d0,%a3
if (r_chain == NULL) {
46072: 4a80 tstl %d0
46074: 6656 bnes 460cc <aio_cancel+0x1bc>
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
46076: 203c 0006 1320 movel #398112,%d0
4607c: b0b9 0006 131c cmpl 6131c <aio_request_queue+0x54>,%d0
46082: 6736 beqs 460ba <aio_cancel+0x1aa> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
46084: 42a7 clrl %sp@-
46086: 2f03 movel %d3,%sp@-
46088: 4879 0006 131c pea 6131c <aio_request_queue+0x54>
4608e: 4e95 jsr %a5@
if (r_chain == NULL) {
46090: 4fef 000c lea %sp@(12),%sp
46094: 4a80 tstl %d0
46096: 67a2 beqs 4603a <aio_cancel+0x12a>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
46098: 2f0a movel %a2,%sp@-
4609a: 2040 moveal %d0,%a0
4609c: 4868 0008 pea %a0@(8)
460a0: 4eb9 0004 6662 jsr 46662 <rtems_aio_remove_req>
pthread_mutex_unlock (&aio_request_queue.mutex);
460a6: 4879 0006 12c8 pea 612c8 <aio_request_queue>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
460ac: 2400 movel %d0,%d2
pthread_mutex_unlock (&aio_request_queue.mutex);
460ae: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
return result;
460b4: 4fef 000c lea %sp@(12),%sp
460b8: 6042 bras 460fc <aio_cancel+0x1ec>
} else {
pthread_mutex_unlock (&aio_request_queue.mutex);
460ba: 4879 0006 12c8 pea 612c8 <aio_request_queue> <== NOT EXECUTED
return AIO_ALLDONE;
460c0: 7402 moveq #2,%d2 <== NOT EXECUTED
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
} else {
pthread_mutex_unlock (&aio_request_queue.mutex);
460c2: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
460c8: 588f addql #4,%sp <== NOT EXECUTED
460ca: 6030 bras 460fc <aio_cancel+0x1ec> <== NOT EXECUTED
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
460cc: 2600 movel %d0,%d3
460ce: 0683 0000 001c addil #28,%d3
460d4: 2f03 movel %d3,%sp@-
460d6: 4e94 jsr %a4@
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
460d8: 2f0a movel %a2,%sp@-
460da: 486b 0008 pea %a3@(8)
pthread_mutex_unlock (&r_chain->mutex);
460de: 45f9 0004 7078 lea 47078 <pthread_mutex_unlock>,%a2
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
460e4: 4eb9 0004 6662 jsr 46662 <rtems_aio_remove_req>
460ea: 2400 movel %d0,%d2
pthread_mutex_unlock (&r_chain->mutex);
460ec: 2f03 movel %d3,%sp@-
460ee: 4e92 jsr %a2@
pthread_mutex_unlock (&aio_request_queue.mutex);
460f0: 4879 0006 12c8 pea 612c8 <aio_request_queue>
460f6: 4e92 jsr %a2@
return result;
460f8: 4fef 0014 lea %sp@(20),%sp
}
return AIO_ALLDONE;
}
460fc: 2002 movel %d2,%d0
460fe: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
46104: 4e5e unlk %fp <== NOT EXECUTED
00046118 <aio_fsync>:
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
46118: 203c 0000 2000 movel #8192,%d0
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
4611e: 4e56 0000 linkw %fp,#0
46122: 2f0a movel %a2,%sp@-
46124: 246e 000c moveal %fp@(12),%a2
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
46128: b0ae 0008 cmpl %fp@(8),%d0
4612c: 671a beqs 46148 <aio_fsync+0x30>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
4612e: 7216 moveq #22,%d1
46130: 70ff moveq #-1,%d0
46132: 2541 0030 movel %d1,%a2@(48)
46136: 2540 0034 movel %d0,%a2@(52)
4613a: 4eb9 0004 f1bc jsr 4f1bc <__errno>
46140: 2040 moveal %d0,%a0
46142: 7016 moveq #22,%d0
46144: 2080 movel %d0,%a0@
46146: 607e bras 461c6 <aio_fsync+0xae>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
46148: 4878 0003 pea 3 <DIVIDE>
4614c: 2f12 movel %a2@,%sp@-
4614e: 4eb9 0004 c41c jsr 4c41c <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
46154: 508f addql #8,%sp
46156: 7203 moveq #3,%d1
46158: c081 andl %d1,%d0
4615a: 123c 0001 moveb #1,%d1
4615e: 5380 subql #1,%d0
46160: b280 cmpl %d0,%d1
46162: 641a bccs 4617e <aio_fsync+0x66>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
46164: 72ff moveq #-1,%d1
46166: 7009 moveq #9,%d0
46168: 2541 0034 movel %d1,%a2@(52)
4616c: 2540 0030 movel %d0,%a2@(48)
46170: 4eb9 0004 f1bc jsr 4f1bc <__errno>
46176: 7209 moveq #9,%d1
46178: 2040 moveal %d0,%a0
4617a: 2081 movel %d1,%a0@
4617c: 6048 bras 461c6 <aio_fsync+0xae>
req = malloc (sizeof (rtems_aio_request));
4617e: 4878 0018 pea 18 <OPER2+0x4>
46182: 4eb9 0004 38dc jsr 438dc <malloc>
if (req == NULL)
46188: 588f addql #4,%sp
4618a: 4a80 tstl %d0
4618c: 661c bnes 461aa <aio_fsync+0x92> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
4618e: 103c 000b moveb #11,%d0 <== NOT EXECUTED
46192: 72ff moveq #-1,%d1 <== NOT EXECUTED
46194: 2540 0030 movel %d0,%a2@(48) <== NOT EXECUTED
46198: 2541 0034 movel %d1,%a2@(52) <== NOT EXECUTED
4619c: 4eb9 0004 f1bc jsr 4f1bc <__errno> <== NOT EXECUTED
461a2: 2040 moveal %d0,%a0 <== NOT EXECUTED
461a4: 700b moveq #11,%d0 <== NOT EXECUTED
461a6: 2080 movel %d0,%a0@ <== NOT EXECUTED
461a8: 601c bras 461c6 <aio_fsync+0xae> <== NOT EXECUTED
req->aiocbp = aiocbp;
461aa: 2040 moveal %d0,%a0
req->aiocbp->aio_lio_opcode = LIO_SYNC;
461ac: 7203 moveq #3,%d1
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
461ae: 214a 0014 movel %a2,%a0@(20)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
461b2: 2541 002c movel %d1,%a2@(44)
return rtems_aio_enqueue (req);
}
461b6: 246e fffc moveal %fp@(-4),%a2
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
461ba: 2d40 0008 movel %d0,%fp@(8)
}
461be: 4e5e unlk %fp
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
461c0: 4ef9 0004 66bc jmp 466bc <rtems_aio_enqueue>
}
461c6: 246e fffc moveal %fp@(-4),%a2
461ca: 70ff moveq #-1,%d0
461cc: 4e5e unlk %fp <== NOT EXECUTED
000468a8 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
468a8: 4e56 0000 linkw %fp,#0
468ac: 2f0a movel %a2,%sp@-
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
468ae: 4878 0003 pea 3 <DIVIDE>
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
468b2: 246e 0008 moveal %fp@(8),%a2
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
468b6: 2f12 movel %a2@,%sp@-
468b8: 4eb9 0004 c41c jsr 4c41c <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
468be: 508f addql #8,%sp
468c0: 7203 moveq #3,%d1
468c2: c081 andl %d1,%d0
468c4: 6722 beqs 468e8 <aio_read+0x40> <== NEVER TAKEN
468c6: 123c 0002 moveb #2,%d1
468ca: b280 cmpl %d0,%d1
468cc: 671a beqs 468e8 <aio_read+0x40>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
468ce: 7009 moveq #9,%d0
468d0: 72ff moveq #-1,%d1
468d2: 2540 0030 movel %d0,%a2@(48)
468d6: 2541 0034 movel %d1,%a2@(52)
468da: 4eb9 0004 f1bc jsr 4f1bc <__errno>
468e0: 2040 moveal %d0,%a0
468e2: 7009 moveq #9,%d0
468e4: 2080 movel %d0,%a0@
468e6: 606e bras 46956 <aio_read+0xae>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
468e8: 4aaa 0014 tstl %a2@(20)
468ec: 6606 bnes 468f4 <aio_read+0x4c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
468ee: 4aaa 0004 tstl %a2@(4)
468f2: 6a1a bpls 4690e <aio_read+0x66>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
468f4: 72ff moveq #-1,%d1
468f6: 7016 moveq #22,%d0
468f8: 2541 0034 movel %d1,%a2@(52)
468fc: 2540 0030 movel %d0,%a2@(48)
46900: 4eb9 0004 f1bc jsr 4f1bc <__errno>
46906: 7216 moveq #22,%d1
46908: 2040 moveal %d0,%a0
4690a: 2081 movel %d1,%a0@
4690c: 6048 bras 46956 <aio_read+0xae>
req = malloc (sizeof (rtems_aio_request));
4690e: 4878 0018 pea 18 <OPER2+0x4>
46912: 4eb9 0004 38dc jsr 438dc <malloc>
if (req == NULL)
46918: 588f addql #4,%sp
4691a: 4a80 tstl %d0
4691c: 661c bnes 4693a <aio_read+0x92> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
4691e: 103c 000b moveb #11,%d0 <== NOT EXECUTED
46922: 72ff moveq #-1,%d1 <== NOT EXECUTED
46924: 2540 0030 movel %d0,%a2@(48) <== NOT EXECUTED
46928: 2541 0034 movel %d1,%a2@(52) <== NOT EXECUTED
4692c: 4eb9 0004 f1bc jsr 4f1bc <__errno> <== NOT EXECUTED
46932: 2040 moveal %d0,%a0 <== NOT EXECUTED
46934: 700b moveq #11,%d0 <== NOT EXECUTED
46936: 2080 movel %d0,%a0@ <== NOT EXECUTED
46938: 601c bras 46956 <aio_read+0xae> <== NOT EXECUTED
req->aiocbp = aiocbp;
4693a: 2040 moveal %d0,%a0
req->aiocbp->aio_lio_opcode = LIO_READ;
4693c: 7201 moveq #1,%d1
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
4693e: 214a 0014 movel %a2,%a0@(20)
req->aiocbp->aio_lio_opcode = LIO_READ;
46942: 2541 002c movel %d1,%a2@(44)
return rtems_aio_enqueue (req);
}
46946: 246e fffc moveal %fp@(-4),%a2
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
4694a: 2d40 0008 movel %d0,%fp@(8)
}
4694e: 4e5e unlk %fp
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
46950: 4ef9 0004 66bc jmp 466bc <rtems_aio_enqueue>
}
46956: 246e fffc moveal %fp@(-4),%a2
4695a: 70ff moveq #-1,%d0
4695c: 4e5e unlk %fp <== NOT EXECUTED
00046970 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
46970: 4e56 0000 linkw %fp,#0
46974: 2f0a movel %a2,%sp@-
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
46976: 4878 0003 pea 3 <DIVIDE>
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
4697a: 246e 0008 moveal %fp@(8),%a2
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
4697e: 2f12 movel %a2@,%sp@-
46980: 4eb9 0004 c41c jsr 4c41c <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
46986: 508f addql #8,%sp
46988: 7203 moveq #3,%d1
4698a: c081 andl %d1,%d0
4698c: 123c 0001 moveb #1,%d1
46990: 5380 subql #1,%d0
46992: b280 cmpl %d0,%d1
46994: 641a bccs 469b0 <aio_write+0x40>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
46996: 7009 moveq #9,%d0
46998: 72ff moveq #-1,%d1
4699a: 2540 0030 movel %d0,%a2@(48)
4699e: 2541 0034 movel %d1,%a2@(52)
469a2: 4eb9 0004 f1bc jsr 4f1bc <__errno>
469a8: 2040 moveal %d0,%a0
469aa: 7009 moveq #9,%d0
469ac: 2080 movel %d0,%a0@
469ae: 606e bras 46a1e <aio_write+0xae>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
469b0: 4aaa 0014 tstl %a2@(20)
469b4: 6606 bnes 469bc <aio_write+0x4c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
469b6: 4aaa 0004 tstl %a2@(4)
469ba: 6a1a bpls 469d6 <aio_write+0x66>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
469bc: 72ff moveq #-1,%d1
469be: 7016 moveq #22,%d0
469c0: 2541 0034 movel %d1,%a2@(52)
469c4: 2540 0030 movel %d0,%a2@(48)
469c8: 4eb9 0004 f1bc jsr 4f1bc <__errno>
469ce: 7216 moveq #22,%d1
469d0: 2040 moveal %d0,%a0
469d2: 2081 movel %d1,%a0@
469d4: 6048 bras 46a1e <aio_write+0xae>
req = malloc (sizeof (rtems_aio_request));
469d6: 4878 0018 pea 18 <OPER2+0x4>
469da: 4eb9 0004 38dc jsr 438dc <malloc>
if (req == NULL)
469e0: 588f addql #4,%sp
469e2: 4a80 tstl %d0
469e4: 661c bnes 46a02 <aio_write+0x92> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
469e6: 103c 000b moveb #11,%d0 <== NOT EXECUTED
469ea: 72ff moveq #-1,%d1 <== NOT EXECUTED
469ec: 2540 0030 movel %d0,%a2@(48) <== NOT EXECUTED
469f0: 2541 0034 movel %d1,%a2@(52) <== NOT EXECUTED
469f4: 4eb9 0004 f1bc jsr 4f1bc <__errno> <== NOT EXECUTED
469fa: 2040 moveal %d0,%a0 <== NOT EXECUTED
469fc: 700b moveq #11,%d0 <== NOT EXECUTED
469fe: 2080 movel %d0,%a0@ <== NOT EXECUTED
46a00: 601c bras 46a1e <aio_write+0xae> <== NOT EXECUTED
req->aiocbp = aiocbp;
46a02: 2040 moveal %d0,%a0
req->aiocbp->aio_lio_opcode = LIO_WRITE;
46a04: 7202 moveq #2,%d1
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
46a06: 214a 0014 movel %a2,%a0@(20)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
46a0a: 2541 002c movel %d1,%a2@(44)
return rtems_aio_enqueue (req);
}
46a0e: 246e fffc moveal %fp@(-4),%a2
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
46a12: 2d40 0008 movel %d0,%fp@(8)
}
46a16: 4e5e unlk %fp
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
46a18: 4ef9 0004 66bc jmp 466bc <rtems_aio_enqueue>
}
46a1e: 246e fffc moveal %fp@(-4),%a2
46a22: 70ff moveq #-1,%d0
46a24: 4e5e unlk %fp <== NOT EXECUTED
00045694 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
45694: 4e56 0000 linkw %fp,#0
45698: 222e 0008 movel %fp@(8),%d1
4569c: 202e 000c movel %fp@(12),%d0
456a0: 2f02 movel %d2,%sp@-
if ( !tp )
456a2: 4a80 tstl %d0
456a4: 6608 bnes 456ae <clock_gettime+0x1a>
rtems_set_errno_and_return_minus_one( EINVAL );
456a6: 4eb9 0004 da30 jsr 4da30 <__errno>
456ac: 6042 bras 456f0 <clock_gettime+0x5c>
if ( clock_id == CLOCK_REALTIME ) {
456ae: 7401 moveq #1,%d2
456b0: b481 cmpl %d1,%d2
456b2: 660a bnes 456be <clock_gettime+0x2a>
_TOD_Get(tp);
456b4: 2f00 movel %d0,%sp@-
456b6: 4eb9 0004 7350 jsr 47350 <_TOD_Get>
456bc: 6014 bras 456d2 <clock_gettime+0x3e>
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
456be: 7404 moveq #4,%d2
456c0: b481 cmpl %d1,%d2
456c2: 6706 beqs 456ca <clock_gettime+0x36> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME_ID ) {
456c4: 7402 moveq #2,%d2
456c6: b481 cmpl %d1,%d2
456c8: 660e bnes 456d8 <clock_gettime+0x44>
_TOD_Get_uptime_as_timespec( tp );
456ca: 2f00 movel %d0,%sp@-
456cc: 4eb9 0004 73b4 jsr 473b4 <_TOD_Get_uptime_as_timespec>
return 0;
456d2: 588f addql #4,%sp
456d4: 4280 clrl %d0
456d6: 6020 bras 456f8 <clock_gettime+0x64>
456d8: 41f9 0004 da30 lea 4da30 <__errno>,%a0
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
456de: 7003 moveq #3,%d0
456e0: b081 cmpl %d1,%d0
456e2: 660a bnes 456ee <clock_gettime+0x5a>
rtems_set_errno_and_return_minus_one( ENOSYS );
456e4: 4e90 jsr %a0@
456e6: 7258 moveq #88,%d1
456e8: 2040 moveal %d0,%a0
456ea: 2081 movel %d1,%a0@
456ec: 6008 bras 456f6 <clock_gettime+0x62>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
456ee: 4e90 jsr %a0@
456f0: 2040 moveal %d0,%a0
456f2: 7016 moveq #22,%d0
456f4: 2080 movel %d0,%a0@
456f6: 70ff moveq #-1,%d0
return 0;
}
456f8: 242e fffc movel %fp@(-4),%d2
456fc: 4e5e unlk %fp <== NOT EXECUTED
00045700 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
45700: 4e56 0000 linkw %fp,#0
45704: 202e 0008 movel %fp@(8),%d0
45708: 206e 000c moveal %fp@(12),%a0
if ( !tp )
4570c: 4a88 tstl %a0
4570e: 6710 beqs 45720 <clock_settime+0x20> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
45710: 7201 moveq #1,%d1
45712: b280 cmpl %d0,%d1
45714: 663a bnes 45750 <clock_settime+0x50> <== NEVER TAKEN
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
45716: 203c 21da e4ff movel #567993599,%d0
4571c: b090 cmpl %a0@,%d0
4571e: 6508 bcss 45728 <clock_settime+0x28>
rtems_set_errno_and_return_minus_one( EINVAL );
45720: 4eb9 0004 da30 jsr 4da30 <__errno>
45726: 6046 bras 4576e <clock_settime+0x6e>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
45728: 2039 0006 05c8 movel 605c8 <_Thread_Dispatch_disable_level>,%d0
4572e: 5280 addql #1,%d0
45730: 23c0 0006 05c8 movel %d0,605c8 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
45736: 2039 0006 05c8 movel 605c8 <_Thread_Dispatch_disable_level>,%d0
_Thread_Disable_dispatch();
_TOD_Set( tp );
4573c: 2f08 movel %a0,%sp@-
4573e: 4eb9 0004 740c jsr 4740c <_TOD_Set>
_Thread_Enable_dispatch();
45744: 4eb9 0004 894c jsr 4894c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
4574a: 588f addql #4,%sp
4574c: 4280 clrl %d0
4574e: 6026 bras 45776 <clock_settime+0x76>
45750: 41f9 0004 da30 lea 4da30 <__errno>,%a0
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
45756: 7202 moveq #2,%d1
45758: b280 cmpl %d0,%d1
4575a: 6706 beqs 45762 <clock_settime+0x62>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
4575c: 7203 moveq #3,%d1
4575e: b280 cmpl %d0,%d1
45760: 660a bnes 4576c <clock_settime+0x6c>
rtems_set_errno_and_return_minus_one( ENOSYS );
45762: 4e90 jsr %a0@
45764: 7258 moveq #88,%d1
45766: 2040 moveal %d0,%a0
45768: 2081 movel %d1,%a0@
4576a: 6008 bras 45774 <clock_settime+0x74>
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
4576c: 4e90 jsr %a0@
4576e: 2040 moveal %d0,%a0
45770: 7016 moveq #22,%d0
45772: 2080 movel %d0,%a0@
45774: 70ff moveq #-1,%d0
return 0;
}
45776: 4e5e unlk %fp
...
0005ac44 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
5ac44: 4e56 ffcc linkw %fp,#-52
5ac48: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
5ac4c: 242e 000c movel %fp@(12),%d2
5ac50: 246e 0010 moveal %fp@(16),%a2
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
5ac54: 4eb9 0005 a870 jsr 5a870 <getpid>
5ac5a: b0ae 0008 cmpl %fp@(8),%d0
5ac5e: 6710 beqs 5ac70 <killinfo+0x2c>
rtems_set_errno_and_return_minus_one( ESRCH );
5ac60: 4eb9 0004 cd68 jsr 4cd68 <__errno>
5ac66: 7403 moveq #3,%d2
5ac68: 2040 moveal %d0,%a0
5ac6a: 2082 movel %d2,%a0@
5ac6c: 6000 01ae braw 5ae1c <killinfo+0x1d8>
/*
* Validate the signal passed.
*/
if ( !sig )
5ac70: 4a82 tstl %d2
5ac72: 670a beqs 5ac7e <killinfo+0x3a>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
5ac74: 2002 movel %d2,%d0
5ac76: 5380 subql #1,%d0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
5ac78: 721f moveq #31,%d1
5ac7a: b280 cmpl %d0,%d1
5ac7c: 6410 bccs 5ac8e <killinfo+0x4a>
rtems_set_errno_and_return_minus_one( EINVAL );
5ac7e: 4eb9 0004 cd68 jsr 4cd68 <__errno>
5ac84: 7216 moveq #22,%d1
5ac86: 2040 moveal %d0,%a0
5ac88: 2081 movel %d1,%a0@
5ac8a: 6000 0190 braw 5ae1c <killinfo+0x1d8>
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
5ac8e: 2202 movel %d2,%d1
5ac90: 2802 movel %d2,%d4
5ac92: e589 lsll #2,%d1
5ac94: e98c lsll #4,%d4
5ac96: 9881 subl %d1,%d4
5ac98: 2044 moveal %d4,%a0
5ac9a: d1fc 0005 f03c addal #389180,%a0
5aca0: 7201 moveq #1,%d1
5aca2: b290 cmpl %a0@,%d1
5aca4: 6700 01ae beqw 5ae54 <killinfo+0x210>
/*
* P1003.1c/Draft 10, p. 33 says that certain signals should always
* be directed to the executing thread such as those caused by hardware
* faults.
*/
if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
5aca8: 123c 0008 moveb #8,%d1
5acac: b282 cmpl %d2,%d1
5acae: 6710 beqs 5acc0 <killinfo+0x7c>
5acb0: 123c 0004 moveb #4,%d1
5acb4: b282 cmpl %d2,%d1
5acb6: 6708 beqs 5acc0 <killinfo+0x7c>
5acb8: 123c 000b moveb #11,%d1
5acbc: b282 cmpl %d2,%d1
5acbe: 6616 bnes 5acd6 <killinfo+0x92>
return pthread_kill( pthread_self(), sig );
5acc0: 4eb9 0005 b028 jsr 5b028 <pthread_self>
5acc6: 2f02 movel %d2,%sp@-
5acc8: 2f00 movel %d0,%sp@-
5acca: 4eb9 0005 af7c jsr 5af7c <pthread_kill>
5acd0: 508f addql #8,%sp
5acd2: 6000 0182 braw 5ae56 <killinfo+0x212>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
5acd6: 7601 moveq #1,%d3
5acd8: e1ab lsll %d0,%d3
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
5acda: 7001 moveq #1,%d0
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
5acdc: 2d42 fff4 movel %d2,%fp@(-12)
siginfo->si_code = SI_USER;
5ace0: 2d40 fff8 movel %d0,%fp@(-8)
if ( !value ) {
5ace4: 4a8a tstl %a2
5ace6: 6606 bnes 5acee <killinfo+0xaa>
siginfo->si_value.sival_int = 0;
5ace8: 42ae fffc clrl %fp@(-4)
5acec: 6004 bras 5acf2 <killinfo+0xae>
} else {
siginfo->si_value = *value;
5acee: 2d52 fffc movel %a2@,%fp@(-4)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
5acf2: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
5acf8: 5280 addql #1,%d0
5acfa: 23c0 0005 eb98 movel %d0,5eb98 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
5ad00: 2039 0005 eb98 movel 5eb98 <_Thread_Dispatch_disable_level>,%d0
/*
* Is the currently executing thread interested? If so then it will
* get it an execute it as soon as the dispatcher executes.
*/
the_thread = _Thread_Executing;
5ad06: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
5ad0c: 2268 0102 moveal %a0@(258),%a1
5ad10: 2029 00d0 movel %a1@(208),%d0
5ad14: 4680 notl %d0
5ad16: c083 andl %d3,%d0
5ad18: 6600 00ae bnew 5adc8 <killinfo+0x184>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
5ad1c: 2079 0005 f1c0 moveal 5f1c0 <_POSIX_signals_Wait_queue>,%a0
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
5ad22: 601c bras 5ad40 <killinfo+0xfc>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
5ad24: 2003 movel %d3,%d0
5ad26: c0a8 0030 andl %a0@(48),%d0
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
5ad2a: 2268 0102 moveal %a0@(258),%a1
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
5ad2e: 6600 0098 bnew 5adc8 <killinfo+0x184>
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
5ad32: 2029 00d0 movel %a1@(208),%d0
5ad36: 4680 notl %d0
5ad38: c083 andl %d3,%d0
5ad3a: 6600 008c bnew 5adc8 <killinfo+0x184>
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
5ad3e: 2050 moveal %a0@,%a0
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
5ad40: b1fc 0005 f1c4 cmpal #389572,%a0
5ad46: 66dc bnes 5ad24 <killinfo+0xe0>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
5ad48: 4280 clrl %d0
5ad4a: 1039 0005 d1fa moveb 5d1fa <rtems_maximum_priority>,%d0
5ad50: 45f9 0005 eb5c lea 5eb5c <_Objects_Information_table+0x8>,%a2
5ad56: 5280 addql #1,%d0
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
5ad58: 91c8 subal %a0,%a0
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
5ad5a: 225a moveal %a2@+,%a1
5ad5c: 4a89 tstl %a1
5ad5e: 675c beqs 5adbc <killinfo+0x178> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
5ad60: 2269 0004 moveal %a1@(4),%a1
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
5ad64: 4281 clrl %d1
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
5ad66: 7a01 moveq #1,%d5
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
5ad68: 3229 000e movew %a1@(14),%d1
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
5ad6c: 2669 0018 moveal %a1@(24),%a3
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
5ad70: 2841 moveal %d1,%a4
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
5ad72: 588b addql #4,%a3
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
5ad74: 6042 bras 5adb8 <killinfo+0x174>
the_thread = (Thread_Control *) object_table[ index ];
5ad76: 225b moveal %a3@+,%a1
if ( !the_thread )
5ad78: 4a89 tstl %a1
5ad7a: 673a beqs 5adb6 <killinfo+0x172>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
5ad7c: 2229 0014 movel %a1@(20),%d1
5ad80: b081 cmpl %d1,%d0
5ad82: 6532 bcss 5adb6 <killinfo+0x172>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
5ad84: 2a69 0102 moveal %a1@(258),%a5
5ad88: 2c2d 00d0 movel %a5@(208),%d6
5ad8c: 4686 notl %d6
5ad8e: cc83 andl %d3,%d6
5ad90: 6724 beqs 5adb6 <killinfo+0x172>
*
* NOTE: We initialized interested_priority to PRIORITY_MAXIMUM + 1
* so we never have to worry about deferencing a NULL
* interested thread.
*/
if ( the_thread->current_priority < interested_priority ) {
5ad92: b081 cmpl %d1,%d0
5ad94: 621c bhis 5adb2 <killinfo+0x16e>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
5ad96: 4a88 tstl %a0
5ad98: 671c beqs 5adb6 <killinfo+0x172> <== NEVER TAKEN
5ad9a: 2e28 0010 movel %a0@(16),%d7
5ad9e: 6716 beqs 5adb6 <killinfo+0x172> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
5ada0: 2c29 0010 movel %a1@(16),%d6
5ada4: 670c beqs 5adb2 <killinfo+0x16e>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
5ada6: 0807 001c btst #28,%d7
5adaa: 660a bnes 5adb6 <killinfo+0x172>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
5adac: 0806 001c btst #28,%d6
5adb0: 6704 beqs 5adb6 <killinfo+0x172>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
5adb2: 2001 movel %d1,%d0
5adb4: 2049 moveal %a1,%a0
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
5adb6: 5285 addql #1,%d5
5adb8: b9c5 cmpal %d5,%a4
5adba: 64ba bccs 5ad76 <killinfo+0x132>
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
5adbc: b5fc 0005 eb64 cmpal #387940,%a2
5adc2: 6696 bnes 5ad5a <killinfo+0x116>
}
}
}
}
if ( interested ) {
5adc4: 4a88 tstl %a0
5adc6: 6716 beqs 5adde <killinfo+0x19a>
/*
* Returns true if the signal was synchronously given to a thread
* blocked waiting for the signal.
*/
if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
5adc8: 486e fff4 pea %fp@(-12)
5adcc: 2f02 movel %d2,%sp@-
5adce: 2f08 movel %a0,%sp@-
5add0: 4eb9 0005 ae80 jsr 5ae80 <_POSIX_signals_Unblock_thread>
5add6: 4fef 000c lea %sp@(12),%sp
5adda: 4a00 tstb %d0
5addc: 6670 bnes 5ae4e <killinfo+0x20a>
/*
* We may have woken up a thread but we definitely need to post the
* signal to the process wide information set.
*/
_POSIX_signals_Set_process_signals( mask );
5adde: 2f03 movel %d3,%sp@-
5ade0: 4eb9 0005 ae60 jsr 5ae60 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
5ade6: 588f addql #4,%sp
5ade8: 41f9 0005 f034 lea 5f034 <_POSIX_signals_Vectors>,%a0
5adee: 7002 moveq #2,%d0
5adf0: b0b0 4800 cmpl %a0@(00000000,%d4:l),%d0
5adf4: 6658 bnes 5ae4e <killinfo+0x20a>
psiginfo = (POSIX_signals_Siginfo_node *)
5adf6: 4879 0005 f1b4 pea 5f1b4 <_POSIX_signals_Inactive_siginfo>
5adfc: 4eb9 0004 6414 jsr 46414 <_Chain_Get>
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
5ae02: 588f addql #4,%sp
*/
_POSIX_signals_Set_process_signals( mask );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
5ae04: 2440 moveal %d0,%a2
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
5ae06: 4a80 tstl %d0
5ae08: 6616 bnes 5ae20 <killinfo+0x1dc>
_Thread_Enable_dispatch();
5ae0a: 4eb9 0004 7d80 jsr 47d80 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
5ae10: 4eb9 0004 cd68 jsr 4cd68 <__errno>
5ae16: 2040 moveal %d0,%a0
5ae18: 700b moveq #11,%d0
5ae1a: 2080 movel %d0,%a0@
5ae1c: 70ff moveq #-1,%d0
5ae1e: 6036 bras 5ae56 <killinfo+0x212>
}
psiginfo->Info = *siginfo;
5ae20: 4878 000c pea c <OPER1>
5ae24: 486e fff4 pea %fp@(-12)
5ae28: 486a 0008 pea %a2@(8)
5ae2c: 4eb9 0004 d588 jsr 4d588 <memcpy>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
5ae32: 2002 movel %d2,%d0
5ae34: e98a lsll #4,%d2
5ae36: e588 lsll #2,%d0
5ae38: 2f0a movel %a2,%sp@-
5ae3a: 9480 subl %d0,%d2
5ae3c: 0682 0005 f22c addil #389676,%d2
5ae42: 2f02 movel %d2,%sp@-
5ae44: 4eb9 0004 63b4 jsr 463b4 <_Chain_Append>
5ae4a: 4fef 0014 lea %sp@(20),%sp
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
5ae4e: 4eb9 0004 7d80 jsr 47d80 <_Thread_Enable_dispatch>
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
return 0;
5ae54: 4280 clrl %d0
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
5ae56: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
5ae5c: 4e5e unlk %fp <== NOT EXECUTED
0004a3e8 <pthread_attr_getstack>:
int pthread_attr_getstack(
const pthread_attr_t *attr,
void **stackaddr,
size_t *stacksize
)
{
4a3e8: 4e56 0000 linkw %fp,#0
4a3ec: 206e 0008 moveal %fp@(8),%a0
4a3f0: 2f0a movel %a2,%sp@-
4a3f2: 246e 000c moveal %fp@(12),%a2
4a3f6: 226e 0010 moveal %fp@(16),%a1
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
4a3fa: 4a88 tstl %a0
4a3fc: 6718 beqs 4a416 <pthread_attr_getstack+0x2e> <== NEVER TAKEN
4a3fe: 4a90 tstl %a0@
4a400: 6714 beqs 4a416 <pthread_attr_getstack+0x2e>
4a402: 4a8a tstl %a2
4a404: 6710 beqs 4a416 <pthread_attr_getstack+0x2e>
4a406: 4a89 tstl %a1
4a408: 670c beqs 4a416 <pthread_attr_getstack+0x2e>
return EINVAL;
*stackaddr = attr->stackaddr;
4a40a: 24a8 0004 movel %a0@(4),%a2@
*stacksize = attr->stacksize;
return 0;
4a40e: 4280 clrl %d0
{
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
return EINVAL;
*stackaddr = attr->stackaddr;
*stacksize = attr->stacksize;
4a410: 22a8 0008 movel %a0@(8),%a1@
return 0;
4a414: 6002 bras 4a418 <pthread_attr_getstack+0x30>
void **stackaddr,
size_t *stacksize
)
{
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
return EINVAL;
4a416: 7016 moveq #22,%d0
*stackaddr = attr->stackaddr;
*stacksize = attr->stacksize;
return 0;
}
4a418: 245f moveal %sp@+,%a2
4a41a: 4e5e unlk %fp
...
0004a52c <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
4a52c: 4e56 0000 linkw %fp,#0
4a530: 206e 0008 moveal %fp@(8),%a0
4a534: 222e 000c movel %fp@(12),%d1
4a538: 2f02 movel %d2,%sp@-
if ( !attr || !attr->is_initialized )
4a53a: 4a88 tstl %a0
4a53c: 671e beqs 4a55c <pthread_attr_setschedpolicy+0x30>
4a53e: 4a90 tstl %a0@
4a540: 671a beqs 4a55c <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
4a542: 7004 moveq #4,%d0
4a544: b081 cmpl %d1,%d0
4a546: 6518 bcss 4a560 <pthread_attr_setschedpolicy+0x34>
4a548: 103c 0001 moveb #1,%d0
4a54c: 7417 moveq #23,%d2
4a54e: e3a8 lsll %d1,%d0
4a550: c082 andl %d2,%d0
4a552: 670c beqs 4a560 <pthread_attr_setschedpolicy+0x34><== NEVER TAKEN
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
4a554: 2141 0014 movel %d1,%a0@(20)
return 0;
4a558: 4280 clrl %d0
4a55a: 600a bras 4a566 <pthread_attr_setschedpolicy+0x3a>
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
4a55c: 7016 moveq #22,%d0
4a55e: 6006 bras 4a566 <pthread_attr_setschedpolicy+0x3a>
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
4a560: 203c 0000 0086 movel #134,%d0
}
}
4a566: 241f movel %sp@+,%d2
4a568: 4e5e unlk %fp <== NOT EXECUTED
00045bac <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
45bac: 4e56 ffe0 linkw %fp,#-32
45bb0: 206e 000c moveal %fp@(12),%a0
45bb4: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
45bb8: 246e 0008 moveal %fp@(8),%a2
45bbc: 242e 0010 movel %fp@(16),%d2
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
45bc0: 4a8a tstl %a2
45bc2: 6700 0092 beqw 45c56 <pthread_barrier_init+0xaa>
return EINVAL;
if ( count == 0 )
45bc6: 4a82 tstl %d2
45bc8: 6700 008c beqw 45c56 <pthread_barrier_init+0xaa>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
45bcc: 4a88 tstl %a0
45bce: 6610 bnes 45be0 <pthread_barrier_init+0x34>
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
45bd0: 260e movel %fp,%d3
45bd2: 5183 subql #8,%d3
45bd4: 2f03 movel %d3,%sp@-
45bd6: 4eb9 0004 5af4 jsr 45af4 <pthread_barrierattr_init>
45bdc: 588f addql #4,%sp
the_attr = &my_attr;
45bde: 2043 moveal %d3,%a0
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
45be0: 4a90 tstl %a0@
45be2: 6772 beqs 45c56 <pthread_barrier_init+0xaa> <== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
45be4: 4aa8 0004 tstl %a0@(4)
45be8: 666c bnes 45c56 <pthread_barrier_init+0xaa> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
45bea: 2039 0005 ff4c movel 5ff4c <_Thread_Dispatch_disable_level>,%d0
45bf0: 5280 addql #1,%d0
45bf2: 23c0 0005 ff4c movel %d0,5ff4c <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
45bf8: 2039 0005 ff4c movel 5ff4c <_Thread_Dispatch_disable_level>,%d0
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
45bfe: 42ae fff0 clrl %fp@(-16)
the_attributes.maximum_count = count;
45c02: 2d42 fff4 movel %d2,%fp@(-12)
* This function allocates a barrier control block from
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
45c06: 4879 0006 0242 pea 60242 <_POSIX_Barrier_Information>
45c0c: 4eb9 0004 7b28 jsr 47b28 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
45c12: 588f addql #4,%sp
45c14: 2640 moveal %d0,%a3
45c16: 4a80 tstl %d0
45c18: 660a bnes 45c24 <pthread_barrier_init+0x78>
_Thread_Enable_dispatch();
45c1a: 4eb9 0004 8b9c jsr 48b9c <_Thread_Enable_dispatch>
return EAGAIN;
45c20: 700b moveq #11,%d0
45c22: 6034 bras 45c58 <pthread_barrier_init+0xac>
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
45c24: 486e fff0 pea %fp@(-16)
45c28: 486b 0010 pea %a3@(16)
45c2c: 4eb9 0004 7208 jsr 47208 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
45c32: 202b 0008 movel %a3@(8),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
45c36: 4281 clrl %d1
45c38: 2079 0006 025a moveal 6025a <_POSIX_Barrier_Information+0x18>,%a0
45c3e: 3200 movew %d0,%d1
45c40: 218b 1c00 movel %a3,%a0@(00000000,%d1:l:4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
45c44: 42ab 000c clrl %a3@(12)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
45c48: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
45c4a: 4eb9 0004 8b9c jsr 48b9c <_Thread_Enable_dispatch>
return 0;
45c50: 508f addql #8,%sp
45c52: 4280 clrl %d0
45c54: 6002 bras 45c58 <pthread_barrier_init+0xac>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
45c56: 7016 moveq #22,%d0
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
_Thread_Enable_dispatch();
return 0;
}
45c58: 4cee 0c0c ffe0 moveml %fp@(-32),%d2-%d3/%a2-%a3
45c5e: 4e5e unlk %fp
...
000455b8 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
455b8: 4e56 0000 linkw %fp,#0
455bc: 2f03 movel %d3,%sp@-
455be: 262e 000c movel %fp@(12),%d3
455c2: 2f02 movel %d2,%sp@-
455c4: 242e 0008 movel %fp@(8),%d2
/*
* The POSIX standard does not address what to do when the routine
* is NULL. It also does not address what happens when we cannot
* allocate memory or anything else bad happens.
*/
if ( !routine )
455c8: 675a beqs 45624 <pthread_cleanup_push+0x6c>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
455ca: 2039 0005 f8d2 movel 5f8d2 <_Thread_Dispatch_disable_level>,%d0
455d0: 5280 addql #1,%d0
455d2: 23c0 0005 f8d2 movel %d0,5f8d2 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
455d8: 2039 0005 f8d2 movel 5f8d2 <_Thread_Dispatch_disable_level>,%d0
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
455de: 4878 0010 pea 10 <INVALID_OPERATION>
455e2: 4eb9 0004 955c jsr 4955c <_Workspace_Allocate>
if ( handler ) {
455e8: 588f addql #4,%sp
455ea: 4a80 tstl %d0
455ec: 6726 beqs 45614 <pthread_cleanup_push+0x5c> <== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
455ee: 2079 0005 fd34 moveal 5fd34 <_Per_CPU_Information+0xc>,%a0
handler_stack = &thread_support->Cancellation_Handlers;
455f4: 2228 0102 movel %a0@(258),%d1
handler->routine = routine;
455f8: 2040 moveal %d0,%a0
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
if ( handler ) {
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
455fa: 0681 0000 00e4 addil #228,%d1
handler->routine = routine;
45600: 2142 0008 movel %d2,%a0@(8)
handler->arg = arg;
45604: 2143 000c movel %d3,%a0@(12)
_Chain_Append( handler_stack, &handler->Node );
45608: 2f00 movel %d0,%sp@-
4560a: 2f01 movel %d1,%sp@-
4560c: 4eb9 0004 6cdc jsr 46cdc <_Chain_Append>
45612: 508f addql #8,%sp
}
_Thread_Enable_dispatch();
}
45614: 242e fff8 movel %fp@(-8),%d2
45618: 262e fffc movel %fp@(-4),%d3
4561c: 4e5e unlk %fp
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
4561e: 4ef9 0004 8634 jmp 48634 <_Thread_Enable_dispatch>
}
45624: 242e fff8 movel %fp@(-8),%d2
45628: 262e fffc movel %fp@(-4),%d3
4562c: 4e5e unlk %fp <== NOT EXECUTED
00046188 <pthread_condattr_destroy>:
*/
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
46188: 4e56 0000 linkw %fp,#0
4618c: 206e 0008 moveal %fp@(8),%a0
if ( !attr || attr->is_initialized == false )
46190: 4a88 tstl %a0
46192: 670a beqs 4619e <pthread_condattr_destroy+0x16>
46194: 4a90 tstl %a0@
46196: 6706 beqs 4619e <pthread_condattr_destroy+0x16> <== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
46198: 4290 clrl %a0@
return 0;
4619a: 4280 clrl %d0
4619c: 6002 bras 461a0 <pthread_condattr_destroy+0x18>
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
4619e: 7016 moveq #22,%d0
attr->is_initialized = false;
return 0;
}
461a0: 4e5e unlk %fp <== NOT EXECUTED
0004c8d0 <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
4c8d0: 4e56 0000 linkw %fp,#0
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
4c8d4: 2f2e 0008 movel %fp@(8),%sp@-
4c8d8: 2f39 0005 effa movel 5effa <_Per_CPU_Information+0xc>,%sp@-
4c8de: 4eb9 0004 c7e0 jsr 4c7e0 <_POSIX_Thread_Exit>
4c8e4: 508f addql #8,%sp <== NOT EXECUTED
}
4c8e6: 4e5e unlk %fp <== NOT EXECUTED
...
0005af7c <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
5af7c: 4e56 fff0 linkw %fp,#-16
5af80: 48d7 040c moveml %d2-%d3/%a2,%sp@
5af84: 242e 000c movel %fp@(12),%d2
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
5af88: 670a beqs 5af94 <pthread_kill+0x18>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
5af8a: 2602 movel %d2,%d3
5af8c: 5383 subql #1,%d3
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
5af8e: 701f moveq #31,%d0
5af90: b083 cmpl %d3,%d0
5af92: 640e bccs 5afa2 <pthread_kill+0x26>
rtems_set_errno_and_return_minus_one( EINVAL );
5af94: 4eb9 0004 cd68 jsr 4cd68 <__errno>
5af9a: 7216 moveq #22,%d1
5af9c: 2040 moveal %d0,%a0
5af9e: 2081 movel %d1,%a0@
5afa0: 607a bras 5b01c <pthread_kill+0xa0>
the_thread = _Thread_Get( thread, &location );
5afa2: 486e fffc pea %fp@(-4)
5afa6: 2f2e 0008 movel %fp@(8),%sp@-
5afaa: 4eb9 0004 7da8 jsr 47da8 <_Thread_Get>
switch ( location ) {
5afb0: 508f addql #8,%sp
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
the_thread = _Thread_Get( thread, &location );
5afb2: 2440 moveal %d0,%a2
switch ( location ) {
5afb4: 4aae fffc tstl %fp@(-4)
5afb8: 6656 bnes 5b010 <pthread_kill+0x94> <== NEVER TAKEN
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
5afba: 2202 movel %d2,%d1
5afbc: 2002 movel %d2,%d0
5afbe: e589 lsll #2,%d1
5afc0: e988 lsll #4,%d0
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
5afc2: 206a 0102 moveal %a2@(258),%a0
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
5afc6: 9081 subl %d1,%d0
5afc8: 0680 0005 f03c addil #389180,%d0
5afce: 7201 moveq #1,%d1
5afd0: 2240 moveal %d0,%a1
5afd2: b291 cmpl %a1@,%d1
5afd4: 6730 beqs 5b006 <pthread_kill+0x8a>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
5afd6: 7001 moveq #1,%d0
5afd8: e7a8 lsll %d3,%d0
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
5afda: 81a8 00d4 orl %d0,%a0@(212)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
5afde: 42a7 clrl %sp@-
5afe0: 2f02 movel %d2,%sp@-
5afe2: 2f0a movel %a2,%sp@-
5afe4: 4eb9 0005 ae80 jsr 5ae80 <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
5afea: 4fef 000c lea %sp@(12),%sp
5afee: 4ab9 0005 eff6 tstl 5eff6 <_Per_CPU_Information+0x8>
5aff4: 6710 beqs 5b006 <pthread_kill+0x8a>
5aff6: b5f9 0005 effa cmpal 5effa <_Per_CPU_Information+0xc>,%a2
5affc: 6608 bnes 5b006 <pthread_kill+0x8a>
_Thread_Dispatch_necessary = true;
5affe: 7001 moveq #1,%d0
5b000: 13c0 0005 f006 moveb %d0,5f006 <_Per_CPU_Information+0x18>
}
_Thread_Enable_dispatch();
5b006: 4eb9 0004 7d80 jsr 47d80 <_Thread_Enable_dispatch>
return 0;
5b00c: 4280 clrl %d0
5b00e: 600e bras 5b01e <pthread_kill+0xa2>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
5b010: 4eb9 0004 cd68 jsr 4cd68 <__errno> <== NOT EXECUTED
5b016: 2040 moveal %d0,%a0 <== NOT EXECUTED
5b018: 7003 moveq #3,%d0 <== NOT EXECUTED
5b01a: 2080 movel %d0,%a0@ <== NOT EXECUTED
5b01c: 70ff moveq #-1,%d0
}
5b01e: 4cee 040c fff0 moveml %fp@(-16),%d2-%d3/%a2
5b024: 4e5e unlk %fp <== NOT EXECUTED
0004753c <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
4753c: 4e56 fffc linkw %fp,#-4
47540: 2f03 movel %d3,%sp@-
47542: 2f02 movel %d2,%sp@-
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
47544: 486e fffc pea %fp@(-4)
47548: 2f2e 000c movel %fp@(12),%sp@-
4754c: 4eb9 0004 7624 jsr 47624 <_POSIX_Absolute_timeout_to_ticks>
int _EXFUN(pthread_mutex_trylock, (pthread_mutex_t *__mutex));
int _EXFUN(pthread_mutex_unlock, (pthread_mutex_t *__mutex));
#if defined(_POSIX_TIMEOUTS)
int _EXFUN(pthread_mutex_timedlock,
47552: 508f addql #8,%sp
47554: 2400 movel %d0,%d2
47556: 7003 moveq #3,%d0
47558: b082 cmpl %d2,%d0
4755a: 57c3 seq %d3
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
4755c: 2f2e fffc movel %fp@(-4),%sp@-
47560: 4483 negl %d3
47562: 4280 clrl %d0
47564: 1003 moveb %d3,%d0
47566: 2f00 movel %d0,%sp@-
47568: 2f2e 0008 movel %fp@(8),%sp@-
4756c: 4eb9 0004 7444 jsr 47444 <_POSIX_Mutex_Lock_support>
* This service only gives us the option to block. We used a polling
* attempt to lock if the abstime was not in the future. If we did
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
47572: 4fef 000c lea %sp@(12),%sp
47576: 4a03 tstb %d3
47578: 661c bnes 47596 <pthread_mutex_timedlock+0x5a>
4757a: 7210 moveq #16,%d1
4757c: b280 cmpl %d0,%d1
4757e: 6616 bnes 47596 <pthread_mutex_timedlock+0x5a>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
47580: 4a82 tstl %d2
47582: 670c beqs 47590 <pthread_mutex_timedlock+0x54> <== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
47584: 5382 subql #1,%d2
47586: 123c 0001 moveb #1,%d1
4758a: b282 cmpl %d2,%d1
4758c: 6508 bcss 47596 <pthread_mutex_timedlock+0x5a> <== NEVER TAKEN
4758e: 6004 bras 47594 <pthread_mutex_timedlock+0x58>
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
47590: 7016 moveq #22,%d0 <== NOT EXECUTED
47592: 6002 bras 47596 <pthread_mutex_timedlock+0x5a> <== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
47594: 7074 moveq #116,%d0
}
return lock_status;
}
47596: 242e fff4 movel %fp@(-12),%d2
4759a: 262e fff8 movel %fp@(-8),%d3
4759e: 4e5e unlk %fp
...
00045420 <pthread_mutexattr_gettype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
45420: 4e56 0000 linkw %fp,#0
45424: 206e 0008 moveal %fp@(8),%a0
45428: 226e 000c moveal %fp@(12),%a1
if ( !attr )
4542c: 4a88 tstl %a0
4542e: 6710 beqs 45440 <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !attr->is_initialized )
45430: 4a90 tstl %a0@
45432: 670c beqs 45440 <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !type )
45434: 4a89 tstl %a1
45436: 6708 beqs 45440 <pthread_mutexattr_gettype+0x20> <== NEVER TAKEN
return EINVAL;
*type = attr->type;
45438: 22a8 0010 movel %a0@(16),%a1@
return 0;
4543c: 4280 clrl %d0
4543e: 6002 bras 45442 <pthread_mutexattr_gettype+0x22>
if ( !attr->is_initialized )
return EINVAL;
if ( !type )
return EINVAL;
45440: 7016 moveq #22,%d0
*type = attr->type;
return 0;
}
45442: 4e5e unlk %fp
...
00047184 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
47184: 4e56 0000 linkw %fp,#0
47188: 206e 0008 moveal %fp@(8),%a0
4718c: 202e 000c movel %fp@(12),%d0
if ( !attr || !attr->is_initialized )
47190: 4a88 tstl %a0
47192: 6712 beqs 471a6 <pthread_mutexattr_setpshared+0x22>
47194: 4a90 tstl %a0@
47196: 670e beqs 471a6 <pthread_mutexattr_setpshared+0x22>
return EINVAL;
switch ( pshared ) {
47198: 7201 moveq #1,%d1
4719a: b280 cmpl %d0,%d1
4719c: 6508 bcss 471a6 <pthread_mutexattr_setpshared+0x22><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
4719e: 2140 0004 movel %d0,%a0@(4)
return 0;
471a2: 4280 clrl %d0
471a4: 6002 bras 471a8 <pthread_mutexattr_setpshared+0x24>
default:
return EINVAL;
471a6: 7016 moveq #22,%d0
}
}
471a8: 4e5e unlk %fp <== NOT EXECUTED
00045474 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
45474: 4e56 0000 linkw %fp,#0
45478: 206e 0008 moveal %fp@(8),%a0
4547c: 202e 000c movel %fp@(12),%d0
if ( !attr || !attr->is_initialized )
45480: 4a88 tstl %a0
45482: 6712 beqs 45496 <pthread_mutexattr_settype+0x22>
45484: 4a90 tstl %a0@
45486: 670e beqs 45496 <pthread_mutexattr_settype+0x22> <== NEVER TAKEN
return EINVAL;
switch ( type ) {
45488: 7203 moveq #3,%d1
4548a: b280 cmpl %d0,%d1
4548c: 6508 bcss 45496 <pthread_mutexattr_settype+0x22>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
4548e: 2140 0010 movel %d0,%a0@(16)
return 0;
45492: 4280 clrl %d0
45494: 6002 bras 45498 <pthread_mutexattr_settype+0x24>
default:
return EINVAL;
45496: 7016 moveq #22,%d0
}
}
45498: 4e5e unlk %fp <== NOT EXECUTED
00045f94 <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
45f94: 4e56 fff0 linkw %fp,#-16
45f98: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
45f9c: 246e 0008 moveal %fp@(8),%a2
45fa0: 266e 000c moveal %fp@(12),%a3
if ( !once_control || !init_routine )
45fa4: 4a8a tstl %a2
45fa6: 674a beqs 45ff2 <pthread_once+0x5e>
45fa8: 4a8b tstl %a3
45faa: 6746 beqs 45ff2 <pthread_once+0x5e>
return EINVAL;
if ( !once_control->init_executed ) {
45fac: 4aaa 0004 tstl %a2@(4)
45fb0: 6644 bnes 45ff6 <pthread_once+0x62>
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
45fb2: 240e movel %fp,%d2
45fb4: 5982 subql #4,%d2
45fb6: 2f02 movel %d2,%sp@-
45fb8: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
45fbc: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
45fc0: 4eb9 0004 6ab8 jsr 46ab8 <rtems_task_mode>
if ( !once_control->init_executed ) {
45fc6: 4fef 000c lea %sp@(12),%sp
45fca: 4aaa 0004 tstl %a2@(4)
45fce: 660c bnes 45fdc <pthread_once+0x48> <== NEVER TAKEN
once_control->is_initialized = true;
45fd0: 7001 moveq #1,%d0
45fd2: 2480 movel %d0,%a2@
once_control->init_executed = true;
45fd4: 7001 moveq #1,%d0
45fd6: 2540 0004 movel %d0,%a2@(4)
(*init_routine)();
45fda: 4e93 jsr %a3@
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
45fdc: 2f02 movel %d2,%sp@-
45fde: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
45fe2: 2f2e fffc movel %fp@(-4),%sp@-
45fe6: 4eb9 0004 6ab8 jsr 46ab8 <rtems_task_mode>
45fec: 4fef 000c lea %sp@(12),%sp
45ff0: 6004 bras 45ff6 <pthread_once+0x62>
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
45ff2: 7016 moveq #22,%d0
45ff4: 6002 bras 45ff8 <pthread_once+0x64>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
45ff6: 4280 clrl %d0
}
45ff8: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
45ffe: 4e5e unlk %fp
...
00046670 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
46670: 4e56 ffe8 linkw %fp,#-24
46674: 206e 000c moveal %fp@(12),%a0
46678: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
4667c: 246e 0008 moveal %fp@(8),%a2
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
46680: 4a8a tstl %a2
46682: 6700 008c beqw 46710 <pthread_rwlock_init+0xa0>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
46686: 4a88 tstl %a0
46688: 6614 bnes 4669e <pthread_rwlock_init+0x2e>
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
4668a: 240e movel %fp,%d2
4668c: 0682 ffff fff4 addil #-12,%d2
46692: 2f02 movel %d2,%sp@-
46694: 4eb9 0004 6fd8 jsr 46fd8 <pthread_rwlockattr_init>
4669a: 588f addql #4,%sp
the_attr = &default_attr;
4669c: 2042 moveal %d2,%a0
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
4669e: 4a90 tstl %a0@
466a0: 676e beqs 46710 <pthread_rwlock_init+0xa0> <== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
466a2: 4aa8 0004 tstl %a0@(4)
466a6: 6668 bnes 46710 <pthread_rwlock_init+0xa0> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
466a8: 2039 0006 156c movel 6156c <_Thread_Dispatch_disable_level>,%d0
466ae: 5280 addql #1,%d0
466b0: 23c0 0006 156c movel %d0,6156c <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
466b6: 2039 0006 156c movel 6156c <_Thread_Dispatch_disable_level>,%d0
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
466bc: 42ae fffc clrl %fp@(-4)
* This function allocates a RWLock control block from
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
466c0: 4879 0006 16cc pea 616cc <_POSIX_RWLock_Information>
466c6: 4eb9 0004 8b54 jsr 48b54 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
466cc: 588f addql #4,%sp
466ce: 2640 moveal %d0,%a3
466d0: 4a80 tstl %d0
466d2: 660a bnes 466de <pthread_rwlock_init+0x6e>
_Thread_Enable_dispatch();
466d4: 4eb9 0004 9bc8 jsr 49bc8 <_Thread_Enable_dispatch>
return EAGAIN;
466da: 700b moveq #11,%d0
466dc: 6034 bras 46712 <pthread_rwlock_init+0xa2>
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
466de: 486e fffc pea %fp@(-4)
466e2: 486b 0010 pea %a3@(16)
466e6: 4eb9 0004 8340 jsr 48340 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
466ec: 202b 0008 movel %a3@(8),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
466f0: 4281 clrl %d1
466f2: 2079 0006 16e4 moveal 616e4 <_POSIX_RWLock_Information+0x18>,%a0
466f8: 3200 movew %d0,%d1
466fa: 218b 1c00 movel %a3,%a0@(00000000,%d1:l:4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
466fe: 42ab 000c clrl %a3@(12)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
46702: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
46704: 4eb9 0004 9bc8 jsr 49bc8 <_Thread_Enable_dispatch>
return 0;
4670a: 508f addql #8,%sp
4670c: 4280 clrl %d0
4670e: 6002 bras 46712 <pthread_rwlock_init+0xa2>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
46710: 7016 moveq #22,%d0
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
46712: 4cee 0c04 ffe8 moveml %fp@(-24),%d2/%a2-%a3
46718: 4e5e unlk %fp <== NOT EXECUTED
00046784 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
46784: 4e56 ffec linkw %fp,#-20
46788: 48d7 040c moveml %d2-%d3/%a2,%sp@
4678c: 246e 0008 moveal %fp@(8),%a2
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
46790: 4a8a tstl %a2
46792: 6700 0086 beqw 4681a <pthread_rwlock_timedrdlock+0x96>
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
46796: 486e fffc pea %fp@(-4)
4679a: 2f2e 000c movel %fp@(12),%sp@-
4679e: 4eb9 0004 c598 jsr 4c598 <_POSIX_Absolute_timeout_to_ticks>
467a4: 486e fff8 pea %fp@(-8)
467a8: 2400 movel %d0,%d2
467aa: 2f12 movel %a2@,%sp@-
467ac: 4879 0006 16cc pea 616cc <_POSIX_RWLock_Information>
467b2: 4eb9 0004 8fb4 jsr 48fb4 <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
467b8: 4fef 0014 lea %sp@(20),%sp
467bc: 4aae fff8 tstl %fp@(-8)
467c0: 6658 bnes 4681a <pthread_rwlock_timedrdlock+0x96><== NEVER TAKEN
int _EXFUN(pthread_rwlock_init,
(pthread_rwlock_t *__rwlock, _CONST pthread_rwlockattr_t *__attr));
int _EXFUN(pthread_rwlock_destroy, (pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_rdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_tryrdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedrdlock,
467c2: 7203 moveq #3,%d1
467c4: b282 cmpl %d2,%d1
467c6: 57c3 seq %d3
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
467c8: 42a7 clrl %sp@-
467ca: 2f2e fffc movel %fp@(-4),%sp@-
467ce: 4483 negl %d3
467d0: 4281 clrl %d1
467d2: 1203 moveb %d3,%d1
467d4: 2040 moveal %d0,%a0
467d6: 2f01 movel %d1,%sp@-
467d8: 2f12 movel %a2@,%sp@-
467da: 4868 0010 pea %a0@(16)
467de: 4eb9 0004 8374 jsr 48374 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
467e4: 4eb9 0004 9bc8 jsr 49bc8 <_Thread_Enable_dispatch>
467ea: 2079 0006 19ce moveal 619ce <_Per_CPU_Information+0xc>,%a0
if ( !do_wait ) {
467f0: 4fef 0014 lea %sp@(20),%sp
467f4: 4a03 tstb %d3
467f6: 6614 bnes 4680c <pthread_rwlock_timedrdlock+0x88><== NEVER TAKEN
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
467f8: 7002 moveq #2,%d0
467fa: b0a8 0034 cmpl %a0@(52),%d0
467fe: 660c bnes 4680c <pthread_rwlock_timedrdlock+0x88>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
46800: 4a82 tstl %d2
46802: 6716 beqs 4681a <pthread_rwlock_timedrdlock+0x96><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
46804: 5382 subql #1,%d2
46806: 7201 moveq #1,%d1
46808: b282 cmpl %d2,%d1
4680a: 6412 bccs 4681e <pthread_rwlock_timedrdlock+0x9a><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
4680c: 2f28 0034 movel %a0@(52),%sp@-
46810: 4eb9 0004 68d4 jsr 468d4 <_POSIX_RWLock_Translate_core_RWLock_return_code>
46816: 588f addql #4,%sp
46818: 6006 bras 46820 <pthread_rwlock_timedrdlock+0x9c>
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
4681a: 7016 moveq #22,%d0
4681c: 6002 bras 46820 <pthread_rwlock_timedrdlock+0x9c>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
4681e: 7074 moveq #116,%d0
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
46820: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
46826: 4e5e unlk %fp
...
0004682c <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
4682c: 4e56 ffec linkw %fp,#-20
46830: 48d7 040c moveml %d2-%d3/%a2,%sp@
46834: 246e 0008 moveal %fp@(8),%a2
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
46838: 4a8a tstl %a2
4683a: 6700 0086 beqw 468c2 <pthread_rwlock_timedwrlock+0x96>
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
4683e: 486e fffc pea %fp@(-4)
46842: 2f2e 000c movel %fp@(12),%sp@-
46846: 4eb9 0004 c598 jsr 4c598 <_POSIX_Absolute_timeout_to_ticks>
4684c: 486e fff8 pea %fp@(-8)
46850: 2400 movel %d0,%d2
46852: 2f12 movel %a2@,%sp@-
46854: 4879 0006 16cc pea 616cc <_POSIX_RWLock_Information>
4685a: 4eb9 0004 8fb4 jsr 48fb4 <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
46860: 4fef 0014 lea %sp@(20),%sp
46864: 4aae fff8 tstl %fp@(-8)
46868: 6658 bnes 468c2 <pthread_rwlock_timedwrlock+0x96>
(pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime));
int _EXFUN(pthread_rwlock_unlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_wrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_trywrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedwrlock,
4686a: 7203 moveq #3,%d1
4686c: b282 cmpl %d2,%d1
4686e: 57c3 seq %d3
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
46870: 42a7 clrl %sp@-
46872: 2f2e fffc movel %fp@(-4),%sp@-
46876: 4483 negl %d3
46878: 4281 clrl %d1
4687a: 1203 moveb %d3,%d1
4687c: 2040 moveal %d0,%a0
4687e: 2f01 movel %d1,%sp@-
46880: 2f12 movel %a2@,%sp@-
46882: 4868 0010 pea %a0@(16)
46886: 4eb9 0004 8420 jsr 48420 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
4688c: 4eb9 0004 9bc8 jsr 49bc8 <_Thread_Enable_dispatch>
46892: 2079 0006 19ce moveal 619ce <_Per_CPU_Information+0xc>,%a0
if ( !do_wait &&
46898: 4fef 0014 lea %sp@(20),%sp
4689c: 4a03 tstb %d3
4689e: 6614 bnes 468b4 <pthread_rwlock_timedwrlock+0x88>
468a0: 7002 moveq #2,%d0
468a2: b0a8 0034 cmpl %a0@(52),%d0
468a6: 660c bnes 468b4 <pthread_rwlock_timedwrlock+0x88>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
468a8: 4a82 tstl %d2
468aa: 6716 beqs 468c2 <pthread_rwlock_timedwrlock+0x96><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
468ac: 5382 subql #1,%d2
468ae: 7201 moveq #1,%d1
468b0: b282 cmpl %d2,%d1
468b2: 6412 bccs 468c6 <pthread_rwlock_timedwrlock+0x9a><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
468b4: 2f28 0034 movel %a0@(52),%sp@-
468b8: 4eb9 0004 68d4 jsr 468d4 <_POSIX_RWLock_Translate_core_RWLock_return_code>
468be: 588f addql #4,%sp
468c0: 6006 bras 468c8 <pthread_rwlock_timedwrlock+0x9c>
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
468c2: 7016 moveq #22,%d0
468c4: 6002 bras 468c8 <pthread_rwlock_timedwrlock+0x9c>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
468c6: 7074 moveq #116,%d0
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
468c8: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
468ce: 4e5e unlk %fp
...
00046ff8 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
46ff8: 4e56 0000 linkw %fp,#0
46ffc: 206e 0008 moveal %fp@(8),%a0
47000: 202e 000c movel %fp@(12),%d0
if ( !attr )
47004: 4a88 tstl %a0
47006: 6712 beqs 4701a <pthread_rwlockattr_setpshared+0x22>
return EINVAL;
if ( !attr->is_initialized )
47008: 4a90 tstl %a0@
4700a: 670e beqs 4701a <pthread_rwlockattr_setpshared+0x22>
return EINVAL;
switch ( pshared ) {
4700c: 7201 moveq #1,%d1
4700e: b280 cmpl %d0,%d1
47010: 6508 bcss 4701a <pthread_rwlockattr_setpshared+0x22><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
47012: 2140 0004 movel %d0,%a0@(4)
return 0;
47016: 4280 clrl %d0
47018: 6002 bras 4701c <pthread_rwlockattr_setpshared+0x24>
default:
return EINVAL;
4701a: 7016 moveq #22,%d0
}
}
4701c: 4e5e unlk %fp <== NOT EXECUTED
00047dc4 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
47dc4: 4e56 ffe0 linkw %fp,#-32
47dc8: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
47dcc: 242e 000c movel %fp@(12),%d2
47dd0: 282e 0010 movel %fp@(16),%d4
int rc;
/*
* Check all the parameters
*/
if ( !param )
47dd4: 6700 00d8 beqw 47eae <pthread_setschedparam+0xea>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
47dd8: 486e fff8 pea %fp@(-8)
47ddc: 486e fff4 pea %fp@(-12)
47de0: 2f04 movel %d4,%sp@-
47de2: 2f02 movel %d2,%sp@-
47de4: 4eb9 0004 d330 jsr 4d330 <_POSIX_Thread_Translate_sched_param>
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
47dea: 4fef 0010 lea %sp@(16),%sp
* Check all the parameters
*/
if ( !param )
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
47dee: 2600 movel %d0,%d3
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
47df0: 6600 00c2 bnew 47eb4 <pthread_setschedparam+0xf0>
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
47df4: 486e fffc pea %fp@(-4)
47df8: 2f2e 0008 movel %fp@(8),%sp@-
47dfc: 4eb9 0004 a82c jsr 4a82c <_Thread_Get>
switch ( location ) {
47e02: 508f addql #8,%sp
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
47e04: 2640 moveal %d0,%a3
switch ( location ) {
47e06: 4aae fffc tstl %fp@(-4)
47e0a: 6600 00a6 bnew 47eb2 <pthread_setschedparam+0xee>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
47e0e: 246b 0102 moveal %a3@(258),%a2
if ( api->schedpolicy == SCHED_SPORADIC )
47e12: 7004 moveq #4,%d0
47e14: b0aa 0084 cmpl %a2@(132),%d0
47e18: 660c bnes 47e26 <pthread_setschedparam+0x62>
(void) _Watchdog_Remove( &api->Sporadic_timer );
47e1a: 486a 00a8 pea %a2@(168)
47e1e: 4eb9 0004 b6ac jsr 4b6ac <_Watchdog_Remove>
47e24: 588f addql #4,%sp
api->schedpolicy = policy;
47e26: 2542 0084 movel %d2,%a2@(132)
api->schedparam = *param;
47e2a: 4878 001c pea 1c <OPER2+0x8>
47e2e: 2f04 movel %d4,%sp@-
47e30: 486a 0088 pea %a2@(136)
47e34: 4eb9 0004 fe40 jsr 4fe40 <memcpy>
the_thread->budget_algorithm = budget_algorithm;
47e3a: 276e fff4 007a movel %fp@(-12),%a3@(122)
the_thread->budget_callout = budget_callout;
switch ( api->schedpolicy ) {
47e40: 4fef 000c lea %sp@(12),%sp
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
api->schedparam = *param;
the_thread->budget_algorithm = budget_algorithm;
the_thread->budget_callout = budget_callout;
47e44: 276e fff8 007e movel %fp@(-8),%a3@(126)
switch ( api->schedpolicy ) {
47e4a: 4a82 tstl %d2
47e4c: 6d58 blts 47ea6 <pthread_setschedparam+0xe2> <== NEVER TAKEN
47e4e: 7002 moveq #2,%d0
47e50: b082 cmpl %d2,%d0
47e52: 6c0a bges 47e5e <pthread_setschedparam+0x9a>
47e54: 103c 0004 moveb #4,%d0
47e58: b082 cmpl %d2,%d0
47e5a: 664a bnes 47ea6 <pthread_setschedparam+0xe2> <== NEVER TAKEN
47e5c: 602a bras 47e88 <pthread_setschedparam+0xc4>
47e5e: 4280 clrl %d0
47e60: 1039 0006 1a1a moveb 61a1a <rtems_maximum_priority>,%d0
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
47e66: 41f9 0006 33d0 lea 633d0 <_Thread_Ticks_per_timeslice>,%a0
47e6c: 90aa 0088 subl %a2@(136),%d0
47e70: 2750 0076 movel %a0@,%a3@(118)
the_thread->real_priority =
47e74: 2740 0018 movel %d0,%a3@(24)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
47e78: 4878 0001 pea 1 <ADD>
47e7c: 2f00 movel %d0,%sp@-
47e7e: 2f0b movel %a3,%sp@-
47e80: 4eb9 0004 a3b4 jsr 4a3b4 <_Thread_Change_priority>
47e86: 601a bras 47ea2 <pthread_setschedparam+0xde>
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
47e88: 256a 0088 00a4 movel %a2@(136),%a2@(164)
_Watchdog_Remove( &api->Sporadic_timer );
47e8e: 486a 00a8 pea %a2@(168)
47e92: 4eb9 0004 b6ac jsr 4b6ac <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
47e98: 2f0b movel %a3,%sp@-
47e9a: 42a7 clrl %sp@-
47e9c: 4eb9 0004 7c9e jsr 47c9e <_POSIX_Threads_Sporadic_budget_TSR>
break;
47ea2: 4fef 000c lea %sp@(12),%sp
}
_Thread_Enable_dispatch();
47ea6: 4eb9 0004 a804 jsr 4a804 <_Thread_Enable_dispatch>
return 0;
47eac: 6006 bras 47eb4 <pthread_setschedparam+0xf0>
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
47eae: 7616 moveq #22,%d3
47eb0: 6002 bras 47eb4 <pthread_setschedparam+0xf0>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
47eb2: 7603 moveq #3,%d3
}
47eb4: 2003 movel %d3,%d0
47eb6: 4cee 0c1c ffe0 moveml %fp@(-32),%d2-%d4/%a2-%a3
47ebc: 4e5e unlk %fp <== NOT EXECUTED
00045d30 <pthread_testcancel>:
/*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
45d30: 4e56 0000 linkw %fp,#0
45d34: 2f02 movel %d2,%sp@-
* Don't even think about deleting a resource from an ISR.
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
45d36: 4ab9 0005 fd30 tstl 5fd30 <_Per_CPU_Information+0x8>
45d3c: 664c bnes 45d8a <pthread_testcancel+0x5a> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
45d3e: 2039 0005 f8d2 movel 5f8d2 <_Thread_Dispatch_disable_level>,%d0
45d44: 5280 addql #1,%d0
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
45d46: 2079 0005 fd34 moveal 5fd34 <_Per_CPU_Information+0xc>,%a0
45d4c: 23c0 0005 f8d2 movel %d0,5f8d2 <_Thread_Dispatch_disable_level>
45d52: 2068 0102 moveal %a0@(258),%a0
return _Thread_Dispatch_disable_level;
45d56: 2039 0005 f8d2 movel 5f8d2 <_Thread_Dispatch_disable_level>,%d0
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
45d5c: 4aa8 00d8 tstl %a0@(216)
45d60: 660a bnes 45d6c <pthread_testcancel+0x3c> <== NEVER TAKEN
/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */
int _EXFUN(pthread_setcancelstate, (int __state, int *__oldstate));
int _EXFUN(pthread_setcanceltype, (int __type, int *__oldtype));
void _EXFUN(pthread_testcancel, (void));
45d62: 4aa8 00e0 tstl %a0@(224)
45d66: 56c2 sne %d2
45d68: 4482 negl %d2
45d6a: 6002 bras 45d6e <pthread_testcancel+0x3e>
*/
void pthread_testcancel( void )
{
POSIX_API_Control *thread_support;
bool cancel = false;
45d6c: 4202 clrb %d2 <== NOT EXECUTED
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
45d6e: 4eb9 0004 8634 jsr 48634 <_Thread_Enable_dispatch>
if ( cancel )
45d74: 4a02 tstb %d2
45d76: 6712 beqs 45d8a <pthread_testcancel+0x5a>
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
45d78: 4878 ffff pea ffffffff <LESS>
45d7c: 2f39 0005 fd34 movel 5fd34 <_Per_CPU_Information+0xc>,%sp@-
45d82: 4eb9 0004 b240 jsr 4b240 <_POSIX_Thread_Exit>
45d88: 508f addql #8,%sp <== NOT EXECUTED
}
45d8a: 242e fffc movel %fp@(-4),%d2
45d8e: 4e5e unlk %fp
...
000466bc <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
466bc: 4e56 ffc8 linkw %fp,#-56
466c0: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
466c4: 4879 0006 12c8 pea 612c8 <aio_request_queue>
466ca: 4bf9 0004 6fe0 lea 46fe0 <pthread_mutex_lock>,%a5
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
466d0: 246e 0008 moveal %fp@(8),%a2
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
466d4: 4e95 jsr %a5@
if (result != 0) {
466d6: 588f addql #4,%sp
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
466d8: 2400 movel %d0,%d2
if (result != 0) {
466da: 670c beqs 466e8 <rtems_aio_enqueue+0x2c> <== ALWAYS TAKEN
free (req);
466dc: 2f0a movel %a2,%sp@- <== NOT EXECUTED
466de: 4eb9 0004 33b4 jsr 433b4 <free> <== NOT EXECUTED
466e4: 6000 01b2 braw 46898 <rtems_aio_enqueue+0x1dc> <== NOT EXECUTED
return result;
}
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
466e8: 47f9 0004 77b8 lea 477b8 <pthread_self>,%a3
466ee: 4e93 jsr %a3@
466f0: 486e ffdc pea %fp@(-36)
466f4: 486e fffc pea %fp@(-4)
466f8: 2f00 movel %d0,%sp@-
466fa: 4eb9 0004 73dc jsr 473dc <pthread_getschedparam>
req->caller_thread = pthread_self ();
46700: 4e93 jsr %a3@
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
46702: 206a 0014 moveal %a2@(20),%a0
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
46706: 7277 moveq #119,%d1
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
46708: 4fef 000c lea %sp@(12),%sp
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
req->caller_thread = pthread_self ();
4670c: 2540 0010 movel %d0,%a2@(16)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
46710: 202e ffdc movel %fp@(-36),%d0
46714: 90a8 0014 subl %a0@(20),%d0
req->policy = policy;
46718: 256e fffc 0008 movel %fp@(-4),%a2@(8)
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
req->caller_thread = pthread_self ();
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
4671e: 2540 000c movel %d0,%a2@(12)
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
46722: 2141 0030 movel %d1,%a0@(48)
req->aiocbp->return_value = 0;
46726: 42a8 0034 clrl %a0@(52)
if ((aio_request_queue.idle_threads == 0) &&
4672a: 4ab9 0006 1330 tstl 61330 <aio_request_queue+0x68>
46730: 6600 009e bnew 467d0 <rtems_aio_enqueue+0x114>
46734: 7004 moveq #4,%d0
46736: b0b9 0006 132c cmpl 6132c <aio_request_queue+0x64>,%d0
4673c: 6d00 0092 bltw 467d0 <rtems_aio_enqueue+0x114>
aio_request_queue.active_threads < AIO_MAX_THREADS)
/* we still have empty places on the active_threads chain */
{
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
46740: 4878 0001 pea 1 <ADD>
46744: 2f10 movel %a0@,%sp@-
46746: 4879 0006 1310 pea 61310 <aio_request_queue+0x48>
4674c: 4eb9 0004 62ba jsr 462ba <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
46752: 4fef 000c lea %sp@(12),%sp
46756: 7201 moveq #1,%d1
if ((aio_request_queue.idle_threads == 0) &&
aio_request_queue.active_threads < AIO_MAX_THREADS)
/* we still have empty places on the active_threads chain */
{
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
46758: 2640 moveal %d0,%a3
if (r_chain->new_fd == 1) {
4675a: b2ab 0018 cmpl %a3@(24),%d1
4675e: 6666 bnes 467c6 <rtems_aio_enqueue+0x10a>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
46760: 2f0a movel %a2,%sp@-
46762: 486b 0008 pea %a3@(8)
46766: 4eb9 0004 88b0 jsr 488b0 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
4676c: 42ab 0018 clrl %a3@(24)
pthread_mutex_init (&r_chain->mutex, NULL);
46770: 42a7 clrl %sp@-
46772: 486b 001c pea %a3@(28)
46776: 4eb9 0004 6ec4 jsr 46ec4 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
4677c: 42a7 clrl %sp@-
4677e: 486b 0020 pea %a3@(32)
46782: 4eb9 0004 6b54 jsr 46b54 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
46788: 2f0b movel %a3,%sp@-
4678a: 487a fbf4 pea %pc@(46380 <rtems_aio_handle>)
4678e: 4879 0006 12d0 pea 612d0 <aio_request_queue+0x8>
46794: 486e fff8 pea %fp@(-8)
46798: 4eb9 0004 71d8 jsr 471d8 <pthread_create>
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
4679e: 4fef 0028 lea %sp@(40),%sp
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
pthread_cond_init (&r_chain->cond, NULL);
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
467a2: 2440 moveal %d0,%a2
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
467a4: 4a80 tstl %d0
467a6: 6714 beqs 467bc <rtems_aio_enqueue+0x100> <== ALWAYS TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
467a8: 4879 0006 12c8 pea 612c8 <aio_request_queue> <== NOT EXECUTED
return result;
467ae: 240a movel %a2,%d2 <== NOT EXECUTED
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
pthread_mutex_unlock (&aio_request_queue.mutex);
467b0: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
467b6: 588f addql #4,%sp <== NOT EXECUTED
467b8: 6000 00e0 braw 4689a <rtems_aio_enqueue+0x1de> <== NOT EXECUTED
}
++aio_request_queue.active_threads;
467bc: 52b9 0006 132c addql #1,6132c <aio_request_queue+0x64>
467c2: 6000 00c8 braw 4688c <rtems_aio_enqueue+0x1d0>
}
else {
/* put request in the fd chain it belongs to */
pthread_mutex_lock (&r_chain->mutex);
467c6: 49eb 001c lea %a3@(28),%a4
467ca: 2f0c movel %a4,%sp@-
467cc: 4e95 jsr %a5@
467ce: 6028 bras 467f8 <rtems_aio_enqueue+0x13c>
else
{
/* the maximum number of threads has been already created
even though some of them might be idle.
The request belongs to one of the active fd chain */
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
467d0: 42a7 clrl %sp@-
467d2: 2f10 movel %a0@,%sp@-
467d4: 49f9 0004 62ba lea 462ba <rtems_aio_search_fd>,%a4
467da: 4879 0006 1310 pea 61310 <aio_request_queue+0x48>
467e0: 4e94 jsr %a4@
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
467e2: 4fef 000c lea %sp@(12),%sp
else
{
/* the maximum number of threads has been already created
even though some of them might be idle.
The request belongs to one of the active fd chain */
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
467e6: 2640 moveal %d0,%a3
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
467e8: 4a80 tstl %d0
467ea: 6730 beqs 4681c <rtems_aio_enqueue+0x160>
{
pthread_mutex_lock (&r_chain->mutex);
467ec: 49eb 001c lea %a3@(28),%a4
467f0: 2f0c movel %a4,%sp@-
467f2: 4eb9 0004 6fe0 jsr 46fe0 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
467f8: 2f0a movel %a2,%sp@-
467fa: 486b 0008 pea %a3@(8)
467fe: 4eb9 0004 65ba jsr 465ba <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
46804: 486b 0020 pea %a3@(32)
46808: 4eb9 0004 6c04 jsr 46c04 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
4680e: 2f0c movel %a4,%sp@-
46810: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
46816: 4fef 0014 lea %sp@(20),%sp
4681a: 6070 bras 4688c <rtems_aio_enqueue+0x1d0>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
4681c: 4878 0001 pea 1 <ADD>
46820: 206a 0014 moveal %a2@(20),%a0
46824: 2f10 movel %a0@,%sp@-
46826: 4879 0006 131c pea 6131c <aio_request_queue+0x54>
4682c: 4e94 jsr %a4@
if (r_chain->new_fd == 1) {
4682e: 4fef 000c lea %sp@(12),%sp
46832: 7201 moveq #1,%d1
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
46834: 2640 moveal %d0,%a3
46836: 5080 addql #8,%d0
if (r_chain->new_fd == 1) {
46838: b2ab 0018 cmpl %a3@(24),%d1
4683c: 662c bnes 4686a <rtems_aio_enqueue+0x1ae>
4683e: 2f0a movel %a2,%sp@-
46840: 2f00 movel %d0,%sp@-
46842: 4eb9 0004 88b0 jsr 488b0 <_Chain_Insert>
/* If this is a new fd chain we signal the idle threads that
might be waiting for requests */
AIO_printf (" New chain on waiting queue \n ");
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
46848: 42ab 0018 clrl %a3@(24)
pthread_mutex_init (&r_chain->mutex, NULL);
4684c: 42a7 clrl %sp@-
4684e: 486b 001c pea %a3@(28)
46852: 4eb9 0004 6ec4 jsr 46ec4 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
46858: 42a7 clrl %sp@-
4685a: 486b 0020 pea %a3@(32)
4685e: 4eb9 0004 6b54 jsr 46b54 <pthread_cond_init>
46864: 4fef 0018 lea %sp@(24),%sp
46868: 600c bras 46876 <rtems_aio_enqueue+0x1ba>
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
4686a: 2f0a movel %a2,%sp@-
4686c: 2f00 movel %d0,%sp@-
4686e: 4eb9 0004 65ba jsr 465ba <rtems_aio_insert_prio>
46874: 508f addql #8,%sp
if (aio_request_queue.idle_threads > 0)
46876: 4ab9 0006 1330 tstl 61330 <aio_request_queue+0x68>
4687c: 6f0e bles 4688c <rtems_aio_enqueue+0x1d0> <== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
4687e: 4879 0006 12cc pea 612cc <aio_request_queue+0x4> <== NOT EXECUTED
46884: 4eb9 0004 6c04 jsr 46c04 <pthread_cond_signal> <== NOT EXECUTED
4688a: 588f addql #4,%sp <== NOT EXECUTED
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
4688c: 4879 0006 12c8 pea 612c8 <aio_request_queue>
46892: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
return 0;
46898: 588f addql #4,%sp
}
4689a: 2002 movel %d2,%d0
4689c: 4cee 3c04 ffc8 moveml %fp@(-56),%d2/%a2-%a5
468a2: 4e5e unlk %fp
...
00046380 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
46380: 4e56 ffac linkw %fp,#-84
46384: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
46388: 240e movel %fp,%d2
node = rtems_chain_first (chain);
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
4638a: 280e movel %fp,%d4
4638c: 2e0e movel %fp,%d7
/* acquire the mutex of the current fd chain.
we don't need to lock the queue mutex since we can
add requests to idle fd chains or even active ones
if the working request has been extracted from the
chain */
result = pthread_mutex_lock (&r_chain->mutex);
4638e: 2a3c 0004 6fe0 movel #290784,%d5
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
46394: 49f9 0004 7078 lea 47078 <pthread_mutex_unlock>,%a4
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
4639a: 0682 ffff fff4 addil #-12,%d2
463a0: 4bf9 0004 6a28 lea 46a28 <clock_gettime>,%a5
node = rtems_chain_first (chain);
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
463a6: 0684 ffff ffd8 addil #-40,%d4
463ac: 5987 subql #4,%d7
static void *
rtems_aio_handle (void *arg)
{
rtems_aio_request_chain *r_chain = arg;
463ae: 246e 0008 moveal %fp@(8),%a2
/* acquire the mutex of the current fd chain.
we don't need to lock the queue mutex since we can
add requests to idle fd chains or even active ones
if the working request has been extracted from the
chain */
result = pthread_mutex_lock (&r_chain->mutex);
463b2: 260a movel %a2,%d3
463b4: 0683 0000 001c addil #28,%d3
463ba: 2045 moveal %d5,%a0
463bc: 2f03 movel %d3,%sp@-
463be: 4e90 jsr %a0@
if (result != 0)
463c0: 588f addql #4,%sp
463c2: 4a80 tstl %d0
463c4: 6600 01e8 bnew 465ae <rtems_aio_handle+0x22e>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
463c8: 200a movel %a2,%d0
463ca: 0680 0000 000c addil #12,%d0
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
463d0: 266a 0008 moveal %a2@(8),%a3
/* If the locked chain is not empty, take the first
request extract it, unlock the chain and process
the request, in this way the user can supply more
requests to this fd chain */
if (!rtems_chain_is_empty (chain)) {
463d4: b08b cmpl %a3,%d0
463d6: 6700 00d8 beqw 464b0 <rtems_aio_handle+0x130>
node = rtems_chain_first (chain);
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
463da: 2c3c 0004 77b8 movel #292792,%d6
463e0: 2046 moveal %d6,%a0
463e2: 4e90 jsr %a0@
463e4: 2f04 movel %d4,%sp@-
463e6: 2f07 movel %d7,%sp@-
463e8: 2f00 movel %d0,%sp@-
463ea: 4eb9 0004 73dc jsr 473dc <pthread_getschedparam>
param.sched_priority = req->priority;
pthread_setschedparam (pthread_self(), req->policy, ¶m);
463f0: 222b 0008 movel %a3@(8),%d1
463f4: 2046 moveal %d6,%a0
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
param.sched_priority = req->priority;
463f6: 2d6b 000c ffd8 movel %a3@(12),%fp@(-40)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
463fc: 2d41 ffd4 movel %d1,%fp@(-44)
46400: 4e90 jsr %a0@
46402: 2f04 movel %d4,%sp@-
46404: 2f2e ffd4 movel %fp@(-44),%sp@-
46408: 2f00 movel %d0,%sp@-
4640a: 4eb9 0004 77cc jsr 477cc <pthread_setschedparam>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
46410: 2f0b movel %a3,%sp@-
46412: 4eb9 0004 8854 jsr 48854 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
46418: 2f03 movel %d3,%sp@-
4641a: 4e94 jsr %a4@
switch (req->aiocbp->aio_lio_opcode) {
4641c: 206b 0014 moveal %a3@(20),%a0
46420: 4fef 0020 lea %sp@(32),%sp
46424: 7202 moveq #2,%d1
46426: 2028 002c movel %a0@(44),%d0
4642a: b280 cmpl %d0,%d1
4642c: 672a beqs 46458 <rtems_aio_handle+0xd8>
4642e: 123c 0003 moveb #3,%d1
46432: b280 cmpl %d0,%d1
46434: 6740 beqs 46476 <rtems_aio_handle+0xf6> <== NEVER TAKEN
46436: 123c 0001 moveb #1,%d1
4643a: b280 cmpl %d0,%d1
4643c: 6648 bnes 46486 <rtems_aio_handle+0x106> <== NEVER TAKEN
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
4643e: 2f28 0008 movel %a0@(8),%sp@-
46442: 2f28 0004 movel %a0@(4),%sp@-
46446: 2f28 0010 movel %a0@(16),%sp@-
4644a: 2f28 000c movel %a0@(12),%sp@-
4644e: 2f10 movel %a0@,%sp@-
46450: 4eb9 0004 fbdc jsr 4fbdc <pread>
46456: 6018 bras 46470 <rtems_aio_handle+0xf0>
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
46458: 2f28 0008 movel %a0@(8),%sp@-
4645c: 2f28 0004 movel %a0@(4),%sp@-
46460: 2f28 0010 movel %a0@(16),%sp@-
46464: 2f28 000c movel %a0@(12),%sp@-
46468: 2f10 movel %a0@,%sp@-
4646a: 4eb9 0004 fca0 jsr 4fca0 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
46470: 4fef 0014 lea %sp@(20),%sp
46474: 600a bras 46480 <rtems_aio_handle+0x100>
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
46476: 2f10 movel %a0@,%sp@- <== NOT EXECUTED
46478: 4eb9 0004 c5a8 jsr 4c5a8 <fsync> <== NOT EXECUTED
break;
4647e: 588f addql #4,%sp <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
46480: 72ff moveq #-1,%d1
46482: b280 cmpl %d0,%d1
46484: 661a bnes 464a0 <rtems_aio_handle+0x120> <== ALWAYS TAKEN
req->aiocbp->return_value = -1;
46486: 266b 0014 moveal %a3@(20),%a3 <== NOT EXECUTED
4648a: 70ff moveq #-1,%d0 <== NOT EXECUTED
4648c: 2740 0034 movel %d0,%a3@(52) <== NOT EXECUTED
req->aiocbp->error_code = errno;
46490: 4eb9 0004 f1bc jsr 4f1bc <__errno> <== NOT EXECUTED
46496: 2040 moveal %d0,%a0 <== NOT EXECUTED
46498: 2750 0030 movel %a0@,%a3@(48) <== NOT EXECUTED
4649c: 6000 ff14 braw 463b2 <rtems_aio_handle+0x32> <== NOT EXECUTED
} else {
req->aiocbp->return_value = result;
464a0: 206b 0014 moveal %a3@(20),%a0
464a4: 2140 0034 movel %d0,%a0@(52)
req->aiocbp->error_code = 0;
464a8: 42a8 0030 clrl %a0@(48)
464ac: 6000 ff04 braw 463b2 <rtems_aio_handle+0x32>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
464b0: 2f03 movel %d3,%sp@-
464b2: 4e94 jsr %a4@
pthread_mutex_lock (&aio_request_queue.mutex);
464b4: 4879 0006 12c8 pea 612c8 <aio_request_queue>
464ba: 2045 moveal %d5,%a0
464bc: 4e90 jsr %a0@
if (rtems_chain_is_empty (chain))
464be: 508f addql #8,%sp
464c0: b7ea 0008 cmpal %a2@(8),%a3
464c4: 6600 00da bnew 465a0 <rtems_aio_handle+0x220>
{
clock_gettime (CLOCK_REALTIME, &timeout);
464c8: 2f02 movel %d2,%sp@-
464ca: 4878 0001 pea 1 <ADD>
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
464ce: 2c0a movel %a2,%d6
464d0: 0686 0000 0020 addil #32,%d6
464d6: 47f9 0004 6c78 lea 46c78 <pthread_cond_timedwait>,%a3
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
464dc: 4e95 jsr %a5@
timeout.tv_sec += 3;
464de: 56ae fff4 addql #3,%fp@(-12)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
464e2: 2f02 movel %d2,%sp@-
464e4: 4879 0006 12c8 pea 612c8 <aio_request_queue>
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
464ea: 42ae fff8 clrl %fp@(-8)
result = pthread_cond_timedwait (&r_chain->cond,
464ee: 2f06 movel %d6,%sp@-
464f0: 4e93 jsr %a3@
&aio_request_queue.mutex,
&timeout);
/* If no requests were added to the chain we delete the fd chain from
the queue and start working with idle fd chains */
if (result == ETIMEDOUT) {
464f2: 4fef 0014 lea %sp@(20),%sp
464f6: 7274 moveq #116,%d1
464f8: b280 cmpl %d0,%d1
464fa: 6600 00a4 bnew 465a0 <rtems_aio_handle+0x220>
464fe: 2f0a movel %a2,%sp@-
46500: 4eb9 0004 8854 jsr 48854 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
46506: 2f03 movel %d3,%sp@-
46508: 4eb9 0004 6da8 jsr 46da8 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
4650e: 2f06 movel %d6,%sp@-
46510: 4eb9 0004 6a94 jsr 46a94 <pthread_cond_destroy>
free (r_chain);
46516: 2f0a movel %a2,%sp@-
46518: 4eb9 0004 33b4 jsr 433b4 <free>
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
4651e: 4fef 0010 lea %sp@(16),%sp
46522: 41f9 0006 1320 lea 61320 <aio_request_queue+0x58>,%a0
46528: b1f9 0006 131c cmpal 6131c <aio_request_queue+0x54>,%a0
4652e: 664c bnes 4657c <rtems_aio_handle+0x1fc>
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
46530: 2f02 movel %d2,%sp@-
46532: 4878 0001 pea 1 <ADD>
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
46536: 52b9 0006 1330 addql #1,61330 <aio_request_queue+0x68>
--aio_request_queue.active_threads;
4653c: 53b9 0006 132c subql #1,6132c <aio_request_queue+0x64>
clock_gettime (CLOCK_REALTIME, &timeout);
46542: 4e95 jsr %a5@
timeout.tv_sec += 3;
46544: 56ae fff4 addql #3,%fp@(-12)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
46548: 2f02 movel %d2,%sp@-
4654a: 4879 0006 12c8 pea 612c8 <aio_request_queue>
46550: 4879 0006 12cc pea 612cc <aio_request_queue+0x4>
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
46556: 42ae fff8 clrl %fp@(-8)
result = pthread_cond_timedwait (&aio_request_queue.new_req,
4655a: 4e93 jsr %a3@
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
4655c: 4fef 0014 lea %sp@(20),%sp
46560: 7274 moveq #116,%d1
46562: b280 cmpl %d0,%d1
46564: 6616 bnes 4657c <rtems_aio_handle+0x1fc> <== NEVER TAKEN
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
pthread_mutex_unlock (&aio_request_queue.mutex);
46566: 4879 0006 12c8 pea 612c8 <aio_request_queue>
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
4656c: 53b9 0006 1330 subql #1,61330 <aio_request_queue+0x68>
pthread_mutex_unlock (&aio_request_queue.mutex);
46572: 4eb9 0004 7078 jsr 47078 <pthread_mutex_unlock>
return NULL;
46578: 588f addql #4,%sp
4657a: 6032 bras 465ae <rtems_aio_handle+0x22e>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4657c: 2479 0006 131c moveal 6131c <aio_request_queue+0x54>,%a2
}
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
AIO_printf ("Work on idle\n");
--aio_request_queue.idle_threads;
46582: 53b9 0006 1330 subql #1,61330 <aio_request_queue+0x68>
++aio_request_queue.active_threads;
46588: 52b9 0006 132c addql #1,6132c <aio_request_queue+0x64>
4658e: 2f0a movel %a2,%sp@-
46590: 4eb9 0004 8854 jsr 48854 <_Chain_Extract>
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = (rtems_aio_request_chain *) node;
rtems_aio_move_to_work (r_chain);
46596: 2f0a movel %a2,%sp@-
46598: 4eb9 0004 634a jsr 4634a <rtems_aio_move_to_work>
4659e: 508f addql #8,%sp
}
}
/* If there was a request added in the initial fd chain then release
the mutex and process it */
pthread_mutex_unlock (&aio_request_queue.mutex);
465a0: 4879 0006 12c8 pea 612c8 <aio_request_queue>
465a6: 4e94 jsr %a4@
465a8: 588f addql #4,%sp
465aa: 6000 fe06 braw 463b2 <rtems_aio_handle+0x32>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
465ae: 4280 clrl %d0
465b0: 4cee 3cfc ffac moveml %fp@(-84),%d2-%d7/%a2-%a5
465b6: 4e5e unlk %fp <== NOT EXECUTED
000461d0 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
461d0: 4e56 0000 linkw %fp,#0
461d4: 2f02 movel %d2,%sp@-
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
461d6: 4879 0006 12d0 pea 612d0 <aio_request_queue+0x8>
461dc: 4eb9 0004 7184 jsr 47184 <pthread_attr_init>
if (result != 0)
461e2: 588f addql #4,%sp
int
rtems_aio_init (void)
{
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
461e4: 2400 movel %d0,%d2
if (result != 0)
461e6: 6600 00c8 bnew 462b0 <rtems_aio_init+0xe0>
return result;
result =
461ea: 42a7 clrl %sp@-
461ec: 4879 0006 12d0 pea 612d0 <aio_request_queue+0x8>
461f2: 4eb9 0004 71b0 jsr 471b0 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
461f8: 508f addql #8,%sp
461fa: 4a80 tstl %d0
461fc: 670e beqs 4620c <rtems_aio_init+0x3c> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
461fe: 4879 0006 12d0 pea 612d0 <aio_request_queue+0x8> <== NOT EXECUTED
46204: 4eb9 0004 7168 jsr 47168 <pthread_attr_destroy> <== NOT EXECUTED
4620a: 588f addql #4,%sp <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
4620c: 42a7 clrl %sp@-
4620e: 4879 0006 12c8 pea 612c8 <aio_request_queue>
46214: 4eb9 0004 6ec4 jsr 46ec4 <pthread_mutex_init>
if (result != 0)
4621a: 508f addql #8,%sp
4621c: 4a80 tstl %d0
4621e: 670e beqs 4622e <rtems_aio_init+0x5e> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
46220: 4879 0006 12d0 pea 612d0 <aio_request_queue+0x8> <== NOT EXECUTED
46226: 4eb9 0004 7168 jsr 47168 <pthread_attr_destroy> <== NOT EXECUTED
4622c: 588f addql #4,%sp <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
4622e: 42a7 clrl %sp@-
46230: 4879 0006 12cc pea 612cc <aio_request_queue+0x4>
46236: 4eb9 0004 6b54 jsr 46b54 <pthread_cond_init>
if (result != 0) {
4623c: 508f addql #8,%sp
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
4623e: 2400 movel %d0,%d2
if (result != 0) {
46240: 671a beqs 4625c <rtems_aio_init+0x8c> <== ALWAYS TAKEN
pthread_mutex_destroy (&aio_request_queue.mutex);
46242: 4879 0006 12c8 pea 612c8 <aio_request_queue> <== NOT EXECUTED
46248: 4eb9 0004 6da8 jsr 46da8 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
4624e: 4879 0006 12d0 pea 612d0 <aio_request_queue+0x8> <== NOT EXECUTED
46254: 4eb9 0004 7168 jsr 47168 <pthread_attr_destroy> <== NOT EXECUTED
4625a: 508f addql #8,%sp <== NOT EXECUTED
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
4625c: 42b9 0006 1314 clrl 61314 <aio_request_queue+0x4c>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
46262: 203c 0006 1314 movel #398100,%d0
46268: 23c0 0006 1310 movel %d0,61310 <aio_request_queue+0x48>
head->previous = NULL;
tail->previous = head;
4626e: 203c 0006 1310 movel #398096,%d0
46274: 23c0 0006 1318 movel %d0,61318 <aio_request_queue+0x50>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
4627a: 203c 0006 1320 movel #398112,%d0
46280: 23c0 0006 131c movel %d0,6131c <aio_request_queue+0x54>
head->previous = NULL;
tail->previous = head;
46286: 203c 0006 131c movel #398108,%d0
4628c: 23c0 0006 1324 movel %d0,61324 <aio_request_queue+0x5c>
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
46292: 203c 0000 b00b movel #45067,%d0
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
46298: 42b9 0006 1320 clrl 61320 <aio_request_queue+0x58>
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
4629e: 42b9 0006 132c clrl 6132c <aio_request_queue+0x64>
aio_request_queue.idle_threads = 0;
462a4: 42b9 0006 1330 clrl 61330 <aio_request_queue+0x68>
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
462aa: 23c0 0006 1328 movel %d0,61328 <aio_request_queue+0x60>
return result;
}
462b0: 2002 movel %d2,%d0
462b2: 242e fffc movel %fp@(-4),%d2
462b6: 4e5e unlk %fp <== NOT EXECUTED
000465ba <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
465ba: 4e56 0000 linkw %fp,#0
465be: 202e 0008 movel %fp@(8),%d0
465c2: 2240 moveal %d0,%a1
465c4: 2f0b movel %a3,%sp@-
465c6: 2059 moveal %a1@+,%a0
465c8: 2f0a movel %a2,%sp@-
465ca: 246e 000c moveal %fp@(12),%a2
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
465ce: b3c8 cmpal %a0,%a1
465d0: 672e beqs 46600 <rtems_aio_insert_prio+0x46> <== NEVER TAKEN
AIO_printf ("First in chain \n");
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
465d2: 2668 0014 moveal %a0@(20),%a3
465d6: 202b 0014 movel %a3@(20),%d0
while (req->aiocbp->aio_reqprio > prio &&
465da: 266a 0014 moveal %a2@(20),%a3
465de: 222b 0014 movel %a3@(20),%d1
465e2: 600a bras 465ee <rtems_aio_insert_prio+0x34>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
465e4: 2050 moveal %a0@,%a0 <== NOT EXECUTED
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
!rtems_chain_is_tail (chain, node)) {
node = rtems_chain_next (node);
prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
465e6: 2668 0014 moveal %a0@(20),%a3 <== NOT EXECUTED
465ea: 202b 0014 movel %a3@(20),%d0 <== NOT EXECUTED
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
465ee: b081 cmpl %d1,%d0
465f0: 6c04 bges 465f6 <rtems_aio_insert_prio+0x3c> <== ALWAYS TAKEN
465f2: b3c8 cmpal %a0,%a1 <== NOT EXECUTED
465f4: 66ee bnes 465e4 <rtems_aio_insert_prio+0x2a> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
465f6: 2d4a 000c movel %a2,%fp@(12)
465fa: 2d68 0004 0008 movel %a0@(4),%fp@(8)
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
46600: 245f moveal %sp@+,%a2
46602: 265f moveal %sp@+,%a3
46604: 4e5e unlk %fp
46606: 4ef9 0004 88b0 jmp 488b0 <_Chain_Insert>
0004634a <rtems_aio_move_to_work>:
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
4634a: 4e56 0000 linkw %fp,#0
4634e: 226e 0008 moveal %fp@(8),%a1
rtems_aio_request_chain *temp;
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
46352: 2079 0006 1310 moveal 61310 <aio_request_queue+0x48>,%a0
while (temp->fildes < r_chain->fildes &&
46358: 2029 0014 movel %a1@(20),%d0
4635c: 6002 bras 46360 <rtems_aio_move_to_work+0x16>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
4635e: 2050 moveal %a0@,%a0
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
46360: b0a8 0014 cmpl %a0@(20),%d0
46364: 6f08 bles 4636e <rtems_aio_move_to_work+0x24>
46366: b1fc 0006 1314 cmpal #398100,%a0
4636c: 66f0 bnes 4635e <rtems_aio_move_to_work+0x14> <== ALWAYS TAKEN
4636e: 2f09 movel %a1,%sp@-
46370: 2f28 0004 movel %a0@(4),%sp@-
46374: 4eb9 0004 88b0 jsr 488b0 <_Chain_Insert>
4637a: 508f addql #8,%sp
node = rtems_chain_next (node);
temp = (rtems_aio_request_chain *) node;
}
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
}
4637c: 4e5e unlk %fp <== NOT EXECUTED
00046662 <rtems_aio_remove_req>:
* AIO_NOTCANCELED - if request was not canceled
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
46662: 4e56 0000 linkw %fp,#0
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
46666: 206e 0008 moveal %fp@(8),%a0
4666a: 2f0a movel %a2,%sp@-
4666c: 202e 000c movel %fp@(12),%d0
46670: 2458 moveal %a0@+,%a2
if (rtems_chain_is_empty (chain))
46672: b1ca cmpal %a2,%a0
46674: 6604 bnes 4667a <rtems_aio_remove_req+0x18>
46676: 6036 bras 466ae <rtems_aio_remove_req+0x4c>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
46678: 2452 moveal %a2@,%a2 <== NOT EXECUTED
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
4667a: b1ca cmpal %a2,%a0
4667c: 6734 beqs 466b2 <rtems_aio_remove_req+0x50> <== NEVER TAKEN
4667e: b0aa 0014 cmpl %a2@(20),%d0
46682: 66f4 bnes 46678 <rtems_aio_remove_req+0x16> <== NEVER TAKEN
46684: 2f0a movel %a2,%sp@-
46686: 4eb9 0004 8854 jsr 48854 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
4668c: 206a 0014 moveal %a2@(20),%a0
46690: 203c 0000 008c movel #140,%d0
46696: 2140 0030 movel %d0,%a0@(48)
current->aiocbp->return_value = -1;
4669a: 70ff moveq #-1,%d0
4669c: 2140 0034 movel %d0,%a0@(52)
free (current);
466a0: 2f0a movel %a2,%sp@-
466a2: 4eb9 0004 33b4 jsr 433b4 <free>
}
return AIO_CANCELED;
466a8: 508f addql #8,%sp
466aa: 4280 clrl %d0
466ac: 6006 bras 466b4 <rtems_aio_remove_req+0x52>
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
466ae: 7002 moveq #2,%d0
466b0: 6002 bras 466b4 <rtems_aio_remove_req+0x52>
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
466b2: 7001 moveq #1,%d0 <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
466b4: 246e fffc moveal %fp@(-4),%a2
466b8: 4e5e unlk %fp <== NOT EXECUTED
000463cc <rtems_chain_get_with_notification>:
rtems_chain_control *chain,
rtems_id task,
rtems_event_set events,
rtems_chain_node **node
)
{
463cc: 4e56 0000 linkw %fp,#0
463d0: 2f03 movel %d3,%sp@-
463d2: 262e 0010 movel %fp@(16),%d3
463d6: 2f02 movel %d2,%sp@-
RTEMS_INLINE_ROUTINE bool rtems_chain_get_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node **node
)
{
return _Chain_Get_with_empty_check( chain, node );
463d8: 2f2e 0014 movel %fp@(20),%sp@-
463dc: 2f2e 0008 movel %fp@(8),%sp@-
463e0: 242e 000c movel %fp@(12),%d2
463e4: 4eb9 0004 69c8 jsr 469c8 <_Chain_Get_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
463ea: 508f addql #8,%sp
463ec: 4a00 tstb %d0
463ee: 6718 beqs 46408 <rtems_chain_get_with_notification+0x3c><== NEVER TAKEN
sc = rtems_event_send( task, events );
463f0: 2d43 000c movel %d3,%fp@(12)
}
return sc;
}
463f4: 262e fffc movel %fp@(-4),%d3
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
463f8: 2d42 0008 movel %d2,%fp@(8)
}
return sc;
}
463fc: 242e fff8 movel %fp@(-8),%d2
46400: 4e5e unlk %fp
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
46402: 4ef9 0004 59f8 jmp 459f8 <rtems_event_send>
}
return sc;
}
46408: 242e fff8 movel %fp@(-8),%d2
4640c: 4280 clrl %d0
4640e: 262e fffc movel %fp@(-4),%d3
46412: 4e5e unlk %fp
...
00046418 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
46418: 4e56 ffe0 linkw %fp,#-32
4641c: 48d7 0c7c moveml %d2-%d6/%a2-%a3,%sp@
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
46420: 260e movel %fp,%d3
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
46422: 47f9 0004 6a10 lea 46a10 <_Chain_Get>,%a3
46428: 5983 subql #4,%d3
4642a: 45f9 0004 5890 lea 45890 <rtems_event_receive>,%a2
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
46430: 2c2e 0008 movel %fp@(8),%d6
46434: 2a2e 000c movel %fp@(12),%d5
46438: 282e 0010 movel %fp@(16),%d4
4643c: 6012 bras 46450 <rtems_chain_get_with_wait+0x38>
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
4643e: 2f03 movel %d3,%sp@-
46440: 2f04 movel %d4,%sp@-
46442: 42a7 clrl %sp@-
46444: 2f05 movel %d5,%sp@-
46446: 4e92 jsr %a2@
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
46448: 4fef 0010 lea %sp@(16),%sp
4644c: 4a80 tstl %d0
4644e: 660c bnes 4645c <rtems_chain_get_with_wait+0x44> <== ALWAYS TAKEN
46450: 2f06 movel %d6,%sp@-
46452: 4e93 jsr %a3@
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
46454: 588f addql #4,%sp
46456: 2400 movel %d0,%d2
46458: 67e4 beqs 4643e <rtems_chain_get_with_wait+0x26>
4645a: 4280 clrl %d0
timeout,
&out
);
}
*node_ptr = node;
4645c: 206e 0014 moveal %fp@(20),%a0
46460: 2082 movel %d2,%a0@
return sc;
}
46462: 4cee 0c7c ffe0 moveml %fp@(-32),%d2-%d6/%a2-%a3
46468: 4e5e unlk %fp <== NOT EXECUTED
00046ff0 <rtems_extension_create>:
rtems_status_code rtems_extension_create(
rtems_name name,
const rtems_extensions_table *extension_table,
rtems_id *id
)
{
46ff0: 4e56 fff4 linkw %fp,#-12
46ff4: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
46ff8: 242e 0008 movel %fp@(8),%d2
46ffc: 266e 0010 moveal %fp@(16),%a3
Extension_Control *the_extension;
if ( !id )
47000: 4a8b tstl %a3
47002: 6778 beqs 4707c <rtems_extension_create+0x8c> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
47004: 4a82 tstl %d2
47006: 6778 beqs 47080 <rtems_extension_create+0x90> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
47008: 2039 0006 0d78 movel 60d78 <_Thread_Dispatch_disable_level>,%d0
4700e: 5280 addql #1,%d0
47010: 23c0 0006 0d78 movel %d0,60d78 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
47016: 2039 0006 0d78 movel 60d78 <_Thread_Dispatch_disable_level>,%d0
#ifndef __EXTENSION_MANAGER_inl
#define __EXTENSION_MANAGER_inl
RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
{
return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
4701c: 4879 0006 0ed8 pea 60ed8 <_Extension_Information>
47022: 4eb9 0004 7dd4 jsr 47dd4 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_extension = _Extension_Allocate();
if ( !the_extension ) {
47028: 588f addql #4,%sp
4702a: 2440 moveal %d0,%a2
4702c: 4a80 tstl %d0
4702e: 660a bnes 4703a <rtems_extension_create+0x4a>
_Thread_Enable_dispatch();
47030: 4eb9 0004 8f2c jsr 48f2c <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
47036: 7005 moveq #5,%d0
47038: 6048 bras 47082 <rtems_extension_create+0x92>
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
4703a: 4878 0020 pea 20 <OPER2+0xc>
4703e: 2f2e 000c movel %fp@(12),%sp@-
47042: 486a 0024 pea %a2@(36)
47046: 4eb9 0004 e71c jsr 4e71c <memcpy>
_User_extensions_Add_set( extension );
4704c: 486a 0010 pea %a2@(16)
47050: 4eb9 0004 99ac jsr 499ac <_User_extensions_Add_set>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
47056: 202a 0008 movel %a2@(8),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
4705a: 4281 clrl %d1
4705c: 2079 0006 0ef0 moveal 60ef0 <_Extension_Information+0x18>,%a0
47062: 3200 movew %d0,%d1
47064: 218a 1c00 movel %a2,%a0@(00000000,%d1:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
47068: 2542 000c movel %d2,%a2@(12)
&_Extension_Information,
&the_extension->Object,
(Objects_Name) name
);
*id = the_extension->Object.id;
4706c: 2680 movel %d0,%a3@
_Thread_Enable_dispatch();
4706e: 4eb9 0004 8f2c jsr 48f2c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
47074: 4fef 0010 lea %sp@(16),%sp
47078: 4280 clrl %d0
4707a: 6006 bras 47082 <rtems_extension_create+0x92>
)
{
Extension_Control *the_extension;
if ( !id )
return RTEMS_INVALID_ADDRESS;
4707c: 7009 moveq #9,%d0
4707e: 6002 bras 47082 <rtems_extension_create+0x92>
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
47080: 7003 moveq #3,%d0
);
*id = the_extension->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
47082: 4cee 0c04 fff4 moveml %fp@(-12),%d2/%a2-%a3
47088: 4e5e unlk %fp <== NOT EXECUTED
0004ca18 <rtems_io_close>:
rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
4ca18: 4e56 0000 linkw %fp,#0
4ca1c: 202e 0008 movel %fp@(8),%d0
4ca20: 2f03 movel %d3,%sp@-
4ca22: 2f02 movel %d2,%sp@-
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
4ca24: b0b9 0005 f412 cmpl 5f412 <_IO_Number_of_drivers>,%d0
4ca2a: 6420 bccs 4ca4c <rtems_io_close+0x34> <== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
4ca2c: 2600 movel %d0,%d3
4ca2e: 2200 movel %d0,%d1
4ca30: e78b lsll #3,%d3
4ca32: eb89 lsll #5,%d1
4ca34: 2279 0005 f416 moveal 5f416 <_IO_Driver_address_table>,%a1
4ca3a: 9283 subl %d3,%d1
4ca3c: 2271 1808 moveal %a1@(00000008,%d1:l),%a1
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
4ca40: 4a89 tstl %a1
4ca42: 670c beqs 4ca50 <rtems_io_close+0x38>
}
4ca44: 241f movel %sp@+,%d2
4ca46: 261f movel %sp@+,%d3
4ca48: 4e5e unlk %fp
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
4ca4a: 4ed1 jmp %a1@
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
4ca4c: 700a moveq #10,%d0
4ca4e: 6002 bras 4ca52 <rtems_io_close+0x3a>
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
4ca50: 4280 clrl %d0
}
4ca52: 241f movel %sp@+,%d2
4ca54: 261f movel %sp@+,%d3
4ca56: 4e5e unlk %fp
...
00046e1c <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
)
{
46e1c: 4e56 0000 linkw %fp,#0
46e20: 206e 000c moveal %fp@(12),%a0
46e24: 2f0a movel %a2,%sp@-
46e26: 226e 0010 moveal %fp@(16),%a1
46e2a: 2f02 movel %d2,%sp@-
46e2c: 242e 0008 movel %fp@(8),%d2
rtems_device_major_number major_limit = _IO_Number_of_drivers;
46e30: 2039 0006 282a movel 6282a <_IO_Number_of_drivers>,%d0
if ( rtems_interrupt_is_in_progress() )
46e36: 4ab9 0006 240e tstl 6240e <_Per_CPU_Information+0x8>
46e3c: 6600 00de bnew 46f1c <rtems_io_register_driver+0x100>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
46e40: 4a89 tstl %a1
46e42: 6700 00dc beqw 46f20 <rtems_io_register_driver+0x104>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
46e46: 2280 movel %d0,%a1@
if ( driver_table == NULL )
46e48: 4a88 tstl %a0
46e4a: 6700 00d4 beqw 46f20 <rtems_io_register_driver+0x104>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
46e4e: 4a90 tstl %a0@
46e50: 6600 00e0 bnew 46f32 <rtems_io_register_driver+0x116>
46e54: 4aa8 0004 tstl %a0@(4)
46e58: 6600 00d8 bnew 46f32 <rtems_io_register_driver+0x116>
46e5c: 6000 00c2 braw 46f20 <rtems_io_register_driver+0x104>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
46e60: 2039 0006 1fb0 movel 61fb0 <_Thread_Dispatch_disable_level>,%d0
46e66: 5280 addql #1,%d0
46e68: 23c0 0006 1fb0 movel %d0,61fb0 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
46e6e: 2039 0006 1fb0 movel 61fb0 <_Thread_Dispatch_disable_level>,%d0
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
46e74: 4a82 tstl %d2
46e76: 662c bnes 46ea4 <rtems_io_register_driver+0x88>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
46e78: 2039 0006 282a movel 6282a <_IO_Number_of_drivers>,%d0
46e7e: 2479 0006 282e moveal 6282e <_IO_Driver_address_table>,%a2
46e84: 6010 bras 46e96 <rtems_io_register_driver+0x7a>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
46e86: 4a92 tstl %a2@
46e88: 6600 00b0 bnew 46f3a <rtems_io_register_driver+0x11e>
46e8c: 4aaa 0004 tstl %a2@(4)
46e90: 6600 00a8 bnew 46f3a <rtems_io_register_driver+0x11e>
46e94: 6004 bras 46e9a <rtems_io_register_driver+0x7e>
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 ) {
46e96: b082 cmpl %d2,%d0
46e98: 66ec bnes 46e86 <rtems_io_register_driver+0x6a>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
46e9a: 2282 movel %d2,%a1@
if ( m != n )
46e9c: b082 cmpl %d2,%d0
46e9e: 6638 bnes 46ed8 <rtems_io_register_driver+0xbc>
46ea0: 6000 00a2 braw 46f44 <rtems_io_register_driver+0x128>
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
46ea4: 2202 movel %d2,%d1
46ea6: 2002 movel %d2,%d0
46ea8: e789 lsll #3,%d1
46eaa: eb88 lsll #5,%d0
46eac: 2479 0006 282e moveal 6282e <_IO_Driver_address_table>,%a2
46eb2: 9081 subl %d1,%d0
46eb4: d5c0 addal %d0,%a2
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
46eb6: 4a92 tstl %a2@
46eb8: 660c bnes 46ec6 <rtems_io_register_driver+0xaa>
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
}
rtems_status_code rtems_io_register_driver(
46eba: 4aaa 0004 tstl %a2@(4)
46ebe: 57c0 seq %d0
46ec0: 49c0 extbl %d0
46ec2: 4480 negl %d0
46ec4: 6002 bras 46ec8 <rtems_io_register_driver+0xac>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
46ec6: 4280 clrl %d0
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
46ec8: 4a00 tstb %d0
46eca: 660a bnes 46ed6 <rtems_io_register_driver+0xba>
_Thread_Enable_dispatch();
46ecc: 4eb9 0004 8bc4 jsr 48bc4 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
46ed2: 700c moveq #12,%d0
46ed4: 6050 bras 46f26 <rtems_io_register_driver+0x10a>
}
*registered_major = major;
46ed6: 2282 movel %d2,%a1@
}
_IO_Driver_address_table [major] = *driver_table;
46ed8: 2202 movel %d2,%d1
46eda: 2002 movel %d2,%d0
46edc: 4878 0018 pea 18 <OPER2+0x4>
46ee0: e789 lsll #3,%d1
46ee2: eb88 lsll #5,%d0
46ee4: 2f08 movel %a0,%sp@-
46ee6: 9081 subl %d1,%d0
46ee8: d0b9 0006 282e addl 6282e <_IO_Driver_address_table>,%d0
46eee: 2f00 movel %d0,%sp@-
46ef0: 4eb9 0005 0b90 jsr 50b90 <memcpy>
_Thread_Enable_dispatch();
46ef6: 4eb9 0004 8bc4 jsr 48bc4 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
}
46efc: 246e fffc moveal %fp@(-4),%a2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
46f00: 4fef 000c lea %sp@(12),%sp
46f04: 2d42 0008 movel %d2,%fp@(8)
}
46f08: 242e fff8 movel %fp@(-8),%d2
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
46f0c: 42ae 0010 clrl %fp@(16)
46f10: 42ae 000c clrl %fp@(12)
}
46f14: 4e5e unlk %fp
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
46f16: 4ef9 0004 e388 jmp 4e388 <rtems_io_initialize>
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
46f1c: 7012 moveq #18,%d0
46f1e: 6006 bras 46f26 <rtems_io_register_driver+0x10a>
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
46f20: 7009 moveq #9,%d0
46f22: 6002 bras 46f26 <rtems_io_register_driver+0x10a>
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
46f24: 700a moveq #10,%d0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
46f26: 242e fff8 movel %fp@(-8),%d2
46f2a: 246e fffc moveal %fp@(-4),%a2
46f2e: 4e5e unlk %fp
46f30: 4e75 rts
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
46f32: b082 cmpl %d2,%d0
46f34: 63ee blss 46f24 <rtems_io_register_driver+0x108>
46f36: 6000 ff28 braw 46e60 <rtems_io_register_driver+0x44>
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 ) {
46f3a: 5282 addql #1,%d2
46f3c: 45ea 0018 lea %a2@(24),%a2
46f40: 6000 ff54 braw 46e96 <rtems_io_register_driver+0x7a>
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
46f44: 4eb9 0004 8bc4 jsr 48bc4 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
46f4a: 7005 moveq #5,%d0
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
46f4c: 60d8 bras 46f26 <rtems_io_register_driver+0x10a>
...
00047d80 <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)
{
47d80: 4e56 fff0 linkw %fp,#-16
47d84: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
47d88: 286e 0008 moveal %fp@(8),%a4
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
47d8c: 4a8c tstl %a4
47d8e: 6738 beqs 47dc8 <rtems_iterate_over_all_threads+0x48><== NEVER TAKEN
47d90: 45f9 0006 0d38 lea 60d38 <_Objects_Information_table+0x4>,%a2
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
47d96: 205a moveal %a2@+,%a0
47d98: 2668 0004 moveal %a0@(4),%a3
if ( !information )
47d9c: 4a8b tstl %a3
47d9e: 6720 beqs 47dc0 <rtems_iterate_over_all_threads+0x40>
47da0: 7401 moveq #1,%d2
47da2: 6012 bras 47db6 <rtems_iterate_over_all_threads+0x36>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
47da4: 206b 0018 moveal %a3@(24),%a0
47da8: 2030 2c00 movel %a0@(00000000,%d2:l:4),%d0
if ( !the_thread )
47dac: 6706 beqs 47db4 <rtems_iterate_over_all_threads+0x34><== NEVER TAKEN
continue;
(*routine)(the_thread);
47dae: 2f00 movel %d0,%sp@-
47db0: 4e94 jsr %a4@
47db2: 588f addql #4,%sp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
47db4: 5282 addql #1,%d2
47db6: 4280 clrl %d0
47db8: 302b 000e movew %a3@(14),%d0
47dbc: b082 cmpl %d2,%d0
47dbe: 64e4 bccs 47da4 <rtems_iterate_over_all_threads+0x24>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
47dc0: b5fc 0006 0d44 cmpal #396612,%a2
47dc6: 66ce bnes 47d96 <rtems_iterate_over_all_threads+0x16>
(*routine)(the_thread);
}
}
}
47dc8: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
47dce: 4e5e unlk %fp
...
0004b7bc <rtems_message_queue_delete>:
*/
rtems_status_code rtems_message_queue_delete(
rtems_id id
)
{
4b7bc: 4e56 fffc linkw %fp,#-4
4b7c0: 2f0a movel %a2,%sp@-
RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
4b7c2: 486e fffc pea %fp@(-4)
4b7c6: 2f2e 0008 movel %fp@(8),%sp@-
4b7ca: 4879 0006 1688 pea 61688 <_Message_queue_Information>
4b7d0: 4eb9 0004 7a78 jsr 47a78 <_Objects_Get>
register Message_queue_Control *the_message_queue;
Objects_Locations location;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
4b7d6: 4fef 000c lea %sp@(12),%sp
4b7da: 2440 moveal %d0,%a2
4b7dc: 4aae fffc tstl %fp@(-4)
4b7e0: 663a bnes 4b81c <rtems_message_queue_delete+0x60><== NEVER TAKEN
case OBJECTS_LOCAL:
_Objects_Close( &_Message_queue_Information,
4b7e2: 2f00 movel %d0,%sp@-
4b7e4: 4879 0006 1688 pea 61688 <_Message_queue_Information>
4b7ea: 4eb9 0004 7694 jsr 47694 <_Objects_Close>
&the_message_queue->Object );
_CORE_message_queue_Close(
4b7f0: 4878 0005 pea 5 <COMPARE>
4b7f4: 42a7 clrl %sp@-
4b7f6: 486a 0014 pea %a2@(20)
4b7fa: 4eb9 0004 bd3c jsr 4bd3c <_CORE_message_queue_Close>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
4b800: 2f0a movel %a2,%sp@-
4b802: 4879 0006 1688 pea 61688 <_Message_queue_Information>
4b808: 4eb9 0004 7914 jsr 47914 <_Objects_Free>
0, /* Not used */
0
);
}
#endif
_Thread_Enable_dispatch();
4b80e: 4eb9 0004 868c jsr 4868c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4b814: 4fef 001c lea %sp@(28),%sp
4b818: 4280 clrl %d0
4b81a: 6002 bras 4b81e <rtems_message_queue_delete+0x62>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4b81c: 7004 moveq #4,%d0
}
4b81e: 246e fff8 moveal %fp@(-8),%a2
4b822: 4e5e unlk %fp
...
0004f7dc <rtems_partition_get_buffer>:
rtems_status_code rtems_partition_get_buffer(
rtems_id id,
void **buffer
)
{
4f7dc: 4e56 fff0 linkw %fp,#-16
4f7e0: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
4f7e4: 266e 000c moveal %fp@(12),%a3
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
4f7e8: 4a8b tstl %a3
4f7ea: 6748 beqs 4f834 <rtems_partition_get_buffer+0x58><== NEVER TAKEN
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
4f7ec: 486e fffc pea %fp@(-4)
4f7f0: 2f2e 0008 movel %fp@(8),%sp@-
4f7f4: 4879 0007 69d2 pea 769d2 <_Partition_Information>
4f7fa: 4eb9 0005 3e2c jsr 53e2c <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
4f800: 4fef 000c lea %sp@(12),%sp
4f804: 2440 moveal %d0,%a2
4f806: 4aae fffc tstl %fp@(-4)
4f80a: 662c bnes 4f838 <rtems_partition_get_buffer+0x5c>
*/
RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
Partition_Control *the_partition
)
{
return _Chain_Get( &the_partition->Memory );
4f80c: 486a 0024 pea %a2@(36)
4f810: 4eb9 0005 24c0 jsr 524c0 <_Chain_Get>
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
4f816: 588f addql #4,%sp
4f818: 41f9 0005 4ab4 lea 54ab4 <_Thread_Enable_dispatch>,%a0
4f81e: 2400 movel %d0,%d2
4f820: 670c beqs 4f82e <rtems_partition_get_buffer+0x52>
the_partition->number_of_used_blocks += 1;
4f822: 52aa 0020 addql #1,%a2@(32)
_Thread_Enable_dispatch();
4f826: 4e90 jsr %a0@
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
4f828: 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;
4f82a: 2682 movel %d2,%a3@
return RTEMS_SUCCESSFUL;
4f82c: 600c bras 4f83a <rtems_partition_get_buffer+0x5e>
}
_Thread_Enable_dispatch();
4f82e: 4e90 jsr %a0@
return RTEMS_UNSATISFIED;
4f830: 700d moveq #13,%d0
4f832: 6006 bras 4f83a <rtems_partition_get_buffer+0x5e>
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
4f834: 7009 moveq #9,%d0
4f836: 6002 bras 4f83a <rtems_partition_get_buffer+0x5e>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4f838: 7004 moveq #4,%d0
}
4f83a: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
4f840: 4e5e unlk %fp <== NOT EXECUTED
0004f870 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
4f870: 4e56 fffc linkw %fp,#-4
4f874: 2f0a movel %a2,%sp@-
4f876: 2f02 movel %d2,%sp@-
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
4f878: 486e fffc pea %fp@(-4)
4f87c: 2f2e 0008 movel %fp@(8),%sp@-
4f880: 4879 0007 69d2 pea 769d2 <_Partition_Information>
4f886: 242e 000c movel %fp@(12),%d2
4f88a: 4eb9 0005 3e2c jsr 53e2c <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
4f890: 4fef 000c lea %sp@(12),%sp
4f894: 2440 moveal %d0,%a2
4f896: 4aae fffc tstl %fp@(-4)
4f89a: 663e bnes 4f8da <rtems_partition_return_buffer+0x6a>
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
4f89c: 202a 0010 movel %a2@(16),%d0
ending = _Addresses_Add_offset( starting, the_partition->length );
4f8a0: 222a 0014 movel %a2@(20),%d1
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
4f8a4: b082 cmpl %d2,%d0
4f8a6: 6240 bhis 4f8e8 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
4f8a8: d280 addl %d0,%d1
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
4f8aa: b282 cmpl %d2,%d1
4f8ac: 653a bcss 4f8e8 <rtems_partition_return_buffer+0x78><== NEVER TAKEN
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
4f8ae: 2202 movel %d2,%d1
4f8b0: 9280 subl %d0,%d1
4f8b2: 2001 movel %d1,%d0
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
4f8b4: 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 ) &&
4f8ba: 4a81 tstl %d1
4f8bc: 662a bnes 4f8e8 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
4f8be: 2f02 movel %d2,%sp@-
4f8c0: 486a 0024 pea %a2@(36)
4f8c4: 4eb9 0005 2460 jsr 52460 <_Chain_Append>
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
4f8ca: 53aa 0020 subql #1,%a2@(32)
_Thread_Enable_dispatch();
4f8ce: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4f8d4: 508f addql #8,%sp
4f8d6: 4280 clrl %d0
4f8d8: 6002 bras 4f8dc <rtems_partition_return_buffer+0x6c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4f8da: 7004 moveq #4,%d0
}
4f8dc: 242e fff4 movel %fp@(-12),%d2
4f8e0: 246e fff8 moveal %fp@(-8),%a2
4f8e4: 4e5e unlk %fp
4f8e6: 4e75 rts
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
4f8e8: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
4f8ee: 7009 moveq #9,%d0
4f8f0: 60ea bras 4f8dc <rtems_partition_return_buffer+0x6c>
...
00046552 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
46552: 4e56 ffec linkw %fp,#-20
46556: 48d7 041c moveml %d2-%d4/%a2,%sp@
RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
4655a: 486e fffc pea %fp@(-4)
4655e: 262e 0008 movel %fp@(8),%d3
46562: 2f03 movel %d3,%sp@-
46564: 4879 0006 04ac pea 604ac <_Rate_monotonic_Information>
4656a: 242e 000c movel %fp@(12),%d2
4656e: 4eb9 0004 8580 jsr 48580 <_Objects_Get>
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
46574: 4fef 000c lea %sp@(12),%sp
46578: 2440 moveal %d0,%a2
4657a: 4aae fffc tstl %fp@(-4)
4657e: 6600 015a bnew 466da <rtems_rate_monotonic_period+0x188>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
46582: 2039 0006 0a04 movel 60a04 <_Per_CPU_Information+0xc>,%d0
46588: b0aa 0040 cmpl %a2@(64),%d0
4658c: 670c beqs 4659a <rtems_rate_monotonic_period+0x48>
_Thread_Enable_dispatch();
4658e: 4eb9 0004 9208 jsr 49208 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
46594: 7417 moveq #23,%d2
46596: 6000 0144 braw 466dc <rtems_rate_monotonic_period+0x18a>
}
if ( length == RTEMS_PERIOD_STATUS ) {
4659a: 4a82 tstl %d2
4659c: 6624 bnes 465c2 <rtems_rate_monotonic_period+0x70>
switch ( the_period->state ) {
4659e: 202a 0038 movel %a2@(56),%d0
465a2: 7204 moveq #4,%d1
465a4: b280 cmpl %d0,%d1
465a6: 650e bcss 465b6 <rtems_rate_monotonic_period+0x64><== NEVER TAKEN
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
465a8: 41f9 0005 db0a lea 5db0a <CSWTCH.2>,%a0
465ae: 4282 clrl %d2
465b0: 1430 0800 moveb %a0@(00000000,%d0:l),%d2
465b4: 6002 bras 465b8 <rtems_rate_monotonic_period+0x66>
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
465b6: 4282 clrl %d2 <== NOT EXECUTED
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
465b8: 4eb9 0004 9208 jsr 49208 <_Thread_Enable_dispatch>
return( return_value );
465be: 6000 011c braw 466dc <rtems_rate_monotonic_period+0x18a>
}
_ISR_Disable( level );
465c2: 203c 0000 0700 movel #1792,%d0
465c8: 40c4 movew %sr,%d4
465ca: 8084 orl %d4,%d0
465cc: 46c0 movew %d0,%sr
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
465ce: 202a 0038 movel %a2@(56),%d0
465d2: 664a bnes 4661e <rtems_rate_monotonic_period+0xcc>
_ISR_Enable( level );
465d4: 46c4 movew %d4,%sr
the_period->next_length = length;
465d6: 2542 003c movel %d2,%a2@(60)
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
465da: 2f0a movel %a2,%sp@-
465dc: 4eb9 0004 63d6 jsr 463d6 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
465e2: 7002 moveq #2,%d0
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
465e4: 223c 0004 692c movel #289068,%d1
465ea: 2540 0038 movel %d0,%a2@(56)
465ee: 2541 002c movel %d1,%a2@(44)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
465f2: 42aa 0018 clrl %a2@(24)
the_watchdog->routine = routine;
the_watchdog->id = id;
465f6: 2543 0030 movel %d3,%a2@(48)
the_watchdog->user_data = user_data;
465fa: 42aa 0034 clrl %a2@(52)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
465fe: 2542 001c movel %d2,%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
46602: 486a 0010 pea %a2@(16)
46606: 4879 0006 065a pea 6065a <_Watchdog_Ticks_chain>
4660c: 4eb9 0004 9f0c jsr 49f0c <_Watchdog_Insert>
id,
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
46612: 4eb9 0004 9208 jsr 49208 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
46618: 4fef 000c lea %sp@(12),%sp
4661c: 606c bras 4668a <rtems_rate_monotonic_period+0x138>
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
4661e: 7202 moveq #2,%d1
46620: b280 cmpl %d0,%d1
46622: 666a bnes 4668e <rtems_rate_monotonic_period+0x13c>
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
46624: 2f0a movel %a2,%sp@-
46626: 4eb9 0004 6460 jsr 46460 <_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;
4662c: 7001 moveq #1,%d0
the_period->next_length = length;
4662e: 2542 003c movel %d2,%a2@(60)
/*
* This tells the _Rate_monotonic_Timeout that this task is
* in the process of blocking on the period and that we
* may be changing the length of the next period.
*/
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
46632: 2540 0038 movel %d0,%a2@(56)
the_period->next_length = length;
_ISR_Enable( level );
46636: 46c4 movew %d4,%sr
_Thread_Executing->Wait.id = the_period->Object.id;
46638: 2079 0006 0a04 moveal 60a04 <_Per_CPU_Information+0xc>,%a0
4663e: 216a 0008 0020 movel %a2@(8),%a0@(32)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
46644: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
46648: 2f08 movel %a0,%sp@-
4664a: 4eb9 0004 998c jsr 4998c <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
46650: 203c 0000 0700 movel #1792,%d0
46656: 40c1 movew %sr,%d1
46658: 8081 orl %d1,%d0
4665a: 46c0 movew %d0,%sr
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
4665c: 7402 moveq #2,%d2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
4665e: 202a 0038 movel %a2@(56),%d0
the_period->state = RATE_MONOTONIC_ACTIVE;
46662: 2542 0038 movel %d2,%a2@(56)
_ISR_Enable( level );
46666: 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 )
46668: 7203 moveq #3,%d1
4666a: 4fef 000c lea %sp@(12),%sp
4666e: b280 cmpl %d0,%d1
46670: 6612 bnes 46684 <rtems_rate_monotonic_period+0x132>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
46672: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
46676: 2f39 0006 0a04 movel 60a04 <_Per_CPU_Information+0xc>,%sp@-
4667c: 4eb9 0004 8e94 jsr 48e94 <_Thread_Clear_state>
46682: 508f addql #8,%sp
_Thread_Enable_dispatch();
46684: 4eb9 0004 9208 jsr 49208 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4668a: 4282 clrl %d2
4668c: 604e bras 466dc <rtems_rate_monotonic_period+0x18a>
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
4668e: 7204 moveq #4,%d1
46690: b280 cmpl %d0,%d1
46692: 6646 bnes 466da <rtems_rate_monotonic_period+0x188><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
46694: 2f0a movel %a2,%sp@-
46696: 4eb9 0004 6460 jsr 46460 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
4669c: 46c4 movew %d4,%sr
the_period->state = RATE_MONOTONIC_ACTIVE;
4669e: 7002 moveq #2,%d0
the_period->next_length = length;
466a0: 2542 003c movel %d2,%a2@(60)
*/
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
466a4: 2540 0038 movel %d0,%a2@(56)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
466a8: 2542 001c movel %d2,%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
466ac: 486a 0010 pea %a2@(16)
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
466b0: 7406 moveq #6,%d2
466b2: 4879 0006 065a pea 6065a <_Watchdog_Ticks_chain>
466b8: 4eb9 0004 9f0c jsr 49f0c <_Watchdog_Insert>
466be: 2f2a 003c movel %a2@(60),%sp@-
466c2: 2f2a 0040 movel %a2@(64),%sp@-
466c6: 2079 0005 ebf2 moveal 5ebf2 <_Scheduler+0x34>,%a0
466cc: 4e90 jsr %a0@
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
466ce: 4eb9 0004 9208 jsr 49208 <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
466d4: 4fef 0014 lea %sp@(20),%sp
466d8: 6002 bras 466dc <rtems_rate_monotonic_period+0x18a>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
466da: 7404 moveq #4,%d2
}
466dc: 2002 movel %d2,%d0
466de: 4cee 041c ffec moveml %fp@(-20),%d2-%d4/%a2
466e4: 4e5e unlk %fp <== NOT EXECUTED
0004687c <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
4687c: 4e56 0000 linkw %fp,#0
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
46880: 2039 0006 05a2 movel 605a2 <_Thread_Dispatch_disable_level>,%d0
46886: 5280 addql #1,%d0
46888: 2f0a movel %a2,%sp@-
4688a: 23c0 0006 05a2 movel %d0,605a2 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
46890: 2039 0006 05a2 movel 605a2 <_Thread_Dispatch_disable_level>,%d0
46896: 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 ;
46898: 2439 0006 04b2 movel 604b2 <_Rate_monotonic_Information+0x6>,%d2
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
4689e: 45f9 0004 68c8 lea 468c8 <rtems_rate_monotonic_reset_statistics>,%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 ;
468a4: 6008 bras 468ae <rtems_rate_monotonic_reset_all_statistics+0x32>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
468a6: 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++ ) {
468a8: 5282 addql #1,%d2
(void) rtems_rate_monotonic_reset_statistics( id );
468aa: 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 ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
468ac: 588f addql #4,%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 ;
468ae: b4b9 0006 04b6 cmpl 604b6 <_Rate_monotonic_Information+0xa>,%d2
468b4: 63f0 blss 468a6 <rtems_rate_monotonic_reset_all_statistics+0x2a>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
468b6: 242e fff8 movel %fp@(-8),%d2
468ba: 246e fffc moveal %fp@(-4),%a2
468be: 4e5e unlk %fp
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
468c0: 4ef9 0004 9208 jmp 49208 <_Thread_Enable_dispatch>
...
00050224 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
50224: 4e56 fff8 linkw %fp,#-8
50228: 2f0a movel %a2,%sp@-
5022a: 2f02 movel %d2,%sp@-
5022c: 242e 000c movel %fp@(12),%d2
bool extend_ok;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
50230: 676e beqs 502a0 <rtems_region_extend+0x7c>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
50232: 2f39 0007 6bdc movel 76bdc <_RTEMS_Allocator_Mutex>,%sp@-
50238: 4eb9 0005 23c8 jsr 523c8 <_API_Mutex_Lock>
RTEMS_INLINE_ROUTINE Region_Control *_Region_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
5023e: 486e fffc pea %fp@(-4)
50242: 2f2e 0008 movel %fp@(8),%sp@-
50246: 4879 0007 6a46 pea 76a46 <_Region_Information>
5024c: 4eb9 0005 3df4 jsr 53df4 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
50252: 4fef 0010 lea %sp@(16),%sp
50256: 2440 moveal %d0,%a2
50258: 4aae fffc tstl %fp@(-4)
5025c: 662c bnes 5028a <rtems_region_extend+0x66>
case OBJECTS_LOCAL:
extend_ok = _Heap_Extend(
5025e: 486e fff8 pea %fp@(-8)
50262: 2f2e 0010 movel %fp@(16),%sp@-
50266: 2f02 movel %d2,%sp@-
50268: 486a 0068 pea %a2@(104)
5026c: 4eb9 0005 3050 jsr 53050 <_Heap_Extend>
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
50272: 4fef 0010 lea %sp@(16),%sp
50276: 4a00 tstb %d0
50278: 6714 beqs 5028e <rtems_region_extend+0x6a> <== ALWAYS TAKEN
the_region->length += amount_extended;
5027a: 202e fff8 movel %fp@(-8),%d0 <== NOT EXECUTED
5027e: d1aa 0054 addl %d0,%a2@(84) <== NOT EXECUTED
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
50282: 4282 clrl %d2 <== NOT EXECUTED
&amount_extended
);
if ( extend_ok ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
50284: d1aa 005c addl %d0,%a2@(92) <== NOT EXECUTED
50288: 6006 bras 50290 <rtems_region_extend+0x6c> <== NOT EXECUTED
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
5028a: 7404 moveq #4,%d2
5028c: 6002 bras 50290 <rtems_region_extend+0x6c>
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;
5028e: 7409 moveq #9,%d2
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
50290: 2f39 0007 6bdc movel 76bdc <_RTEMS_Allocator_Mutex>,%sp@-
50296: 4eb9 0005 2428 jsr 52428 <_API_Mutex_Unlock>
return return_status;
5029c: 588f addql #4,%sp
5029e: 6002 bras 502a2 <rtems_region_extend+0x7e>
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
502a0: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
502a2: 2002 movel %d2,%d0
502a4: 242e fff0 movel %fp@(-16),%d2
502a8: 246e fff4 moveal %fp@(-12),%a2
502ac: 4e5e unlk %fp <== NOT EXECUTED
000504a8 <rtems_region_get_segment_size>:
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
uintptr_t *size
)
{
504a8: 4e56 fffc linkw %fp,#-4
504ac: 2f03 movel %d3,%sp@-
504ae: 262e 0010 movel %fp@(16),%d3
504b2: 2f02 movel %d2,%sp@-
504b4: 242e 000c movel %fp@(12),%d2
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
504b8: 6768 beqs 50522 <rtems_region_get_segment_size+0x7a>
return RTEMS_INVALID_ADDRESS;
if ( !size )
504ba: 4a83 tstl %d3
504bc: 6764 beqs 50522 <rtems_region_get_segment_size+0x7a>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
504be: 2f39 0007 6bdc movel 76bdc <_RTEMS_Allocator_Mutex>,%sp@-
504c4: 4eb9 0005 23c8 jsr 523c8 <_API_Mutex_Lock>
504ca: 486e fffc pea %fp@(-4)
504ce: 2f2e 0008 movel %fp@(8),%sp@-
504d2: 4879 0007 6a46 pea 76a46 <_Region_Information>
504d8: 4eb9 0005 3df4 jsr 53df4 <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
504de: 222e fffc movel %fp@(-4),%d1
504e2: 4fef 0010 lea %sp@(16),%sp
504e6: 6708 beqs 504f0 <rtems_region_get_segment_size+0x48>
504e8: 7001 moveq #1,%d0
504ea: b081 cmpl %d1,%d0
504ec: 661a bnes 50508 <rtems_region_get_segment_size+0x60><== NEVER TAKEN
504ee: 601c bras 5050c <rtems_region_get_segment_size+0x64>
case OBJECTS_LOCAL:
if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) )
504f0: 2f03 movel %d3,%sp@-
504f2: 2040 moveal %d0,%a0
504f4: 2f02 movel %d2,%sp@-
504f6: 4868 0068 pea %a0@(104)
504fa: 4eb9 0005 3860 jsr 53860 <_Heap_Size_of_alloc_area>
50500: 4fef 000c lea %sp@(12),%sp
50504: 4a00 tstb %d0
50506: 6708 beqs 50510 <rtems_region_get_segment_size+0x68><== NEVER TAKEN
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
50508: 4282 clrl %d2
5050a: 6006 bras 50512 <rtems_region_get_segment_size+0x6a>
case OBJECTS_REMOTE: /* this error cannot be returned */
break;
#endif
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
5050c: 7404 moveq #4,%d2
5050e: 6002 bras 50512 <rtems_region_get_segment_size+0x6a>
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;
50510: 7409 moveq #9,%d2 <== NOT EXECUTED
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
50512: 2f39 0007 6bdc movel 76bdc <_RTEMS_Allocator_Mutex>,%sp@-
50518: 4eb9 0005 2428 jsr 52428 <_API_Mutex_Unlock>
return return_status;
5051e: 588f addql #4,%sp
50520: 6002 bras 50524 <rtems_region_get_segment_size+0x7c>
if ( !segment )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
50522: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
50524: 2002 movel %d2,%d0
50526: 242e fff4 movel %fp@(-12),%d2
5052a: 262e fff8 movel %fp@(-8),%d3
5052e: 4e5e unlk %fp
...
00046030 <rtems_shutdown_executive>:
void rtems_shutdown_executive(
uint32_t result
)
{
if ( _System_state_Is_up( _System_state_Get() ) ) {
46030: 7003 moveq #3,%d0
*/
void rtems_shutdown_executive(
uint32_t result
)
{
46032: 4e56 0000 linkw %fp,#0
if ( _System_state_Is_up( _System_state_Get() ) ) {
46036: b0b9 0005 ecdc cmpl 5ecdc <_System_state_Current>,%d0
4603c: 6624 bnes 46062 <rtems_shutdown_executive+0x32>
#if defined(RTEMS_SMP)
_SMP_Request_other_cores_to_shutdown();
#endif
_Per_CPU_Information[0].idle->Wait.return_code = result;
4603e: 2079 0005 f002 moveal 5f002 <_Per_CPU_Information+0x14>,%a0
46044: 103c 0004 moveb #4,%d0
46048: 216e 0008 0034 movel %fp@(8),%a0@(52)
* if we were running within the same context, it would work.
*
* And we will not return to this thread, so there is no point of
* saving the context.
*/
_Context_Restart_self( &_Thread_BSP_context );
4604e: 4879 0005 eb64 pea 5eb64 <_Thread_BSP_context>
46054: 23c0 0005 ecdc movel %d0,5ecdc <_System_state_Current>
4605a: 4eb9 0004 8c92 jsr 48c92 <_CPU_Context_Restart_self>
46060: 588f addql #4,%sp <== NOT EXECUTED
****** AND THEN TO BOOT_CARD() ******
*******************************************************************
*******************************************************************
*******************************************************************/
}
_Internal_error_Occurred(
46062: 4878 0014 pea 14 <OPER2>
46066: 4878 0001 pea 1 <ADD>
4606a: 42a7 clrl %sp@-
4606c: 4eb9 0004 6bdc jsr 46bdc <_Internal_error_Occurred>
...
00050b0c <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
50b0c: 4e56 fffc linkw %fp,#-4
50b10: 2f03 movel %d3,%sp@-
50b12: 2f02 movel %d2,%sp@-
50b14: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
50b18: 6776 beqs 50b90 <rtems_signal_send+0x84>
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
50b1a: 486e fffc pea %fp@(-4)
50b1e: 2f2e 0008 movel %fp@(8),%sp@-
50b22: 4eb9 0005 4adc jsr 54adc <_Thread_Get>
switch ( location ) {
50b28: 508f addql #8,%sp
50b2a: 4aae fffc tstl %fp@(-4)
50b2e: 6664 bnes 50b94 <rtems_signal_send+0x88>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
50b30: 2240 moveal %d0,%a1
50b32: 2069 00fe moveal %a1@(254),%a0
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
50b36: 4aa8 000a tstl %a0@(10)
50b3a: 674a beqs 50b86 <rtems_signal_send+0x7a>
50b3c: 223c 0000 0700 movel #1792,%d1
if ( asr->is_enabled ) {
50b42: 4a28 0008 tstb %a0@(8)
50b46: 6726 beqs 50b6e <rtems_signal_send+0x62>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
50b48: 40c3 movew %sr,%d3
50b4a: 8283 orl %d3,%d1
50b4c: 46c1 movew %d1,%sr
*signal_set |= signals;
50b4e: 85a8 0012 orl %d2,%a0@(18)
_ISR_Enable( _level );
50b52: 46c3 movew %d3,%sr
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
50b54: 4ab9 0007 6fa2 tstl 76fa2 <_Per_CPU_Information+0x8>
50b5a: 6720 beqs 50b7c <rtems_signal_send+0x70>
50b5c: b0b9 0007 6fa6 cmpl 76fa6 <_Per_CPU_Information+0xc>,%d0
50b62: 6618 bnes 50b7c <rtems_signal_send+0x70> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
50b64: 7001 moveq #1,%d0
50b66: 13c0 0007 6fb2 moveb %d0,76fb2 <_Per_CPU_Information+0x18>
50b6c: 600e bras 50b7c <rtems_signal_send+0x70>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
50b6e: 2001 movel %d1,%d0
50b70: 40c1 movew %sr,%d1
50b72: 8081 orl %d1,%d0
50b74: 46c0 movew %d0,%sr
*signal_set |= signals;
50b76: 85a8 0016 orl %d2,%a0@(22)
_ISR_Enable( _level );
50b7a: 46c1 movew %d1,%sr
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
50b7c: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
50b82: 4280 clrl %d0
50b84: 6010 bras 50b96 <rtems_signal_send+0x8a>
}
_Thread_Enable_dispatch();
50b86: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
50b8c: 700b moveq #11,%d0
50b8e: 6006 bras 50b96 <rtems_signal_send+0x8a>
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
50b90: 700a moveq #10,%d0
50b92: 6002 bras 50b96 <rtems_signal_send+0x8a>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
50b94: 7004 moveq #4,%d0
}
50b96: 242e fff4 movel %fp@(-12),%d2
50b9a: 262e fff8 movel %fp@(-8),%d3
50b9e: 4e5e unlk %fp
...
0004c8ec <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
4c8ec: 4e56 ffe4 linkw %fp,#-28
4c8f0: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@
4c8f4: 262e 0008 movel %fp@(8),%d3
4c8f8: 282e 000c movel %fp@(12),%d4
4c8fc: 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 )
4c900: 4a8c tstl %a4
4c902: 6700 0104 beqw 4ca08 <rtems_task_mode+0x11c>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
4c906: 2679 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a3
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
4c90c: 4a2b 0074 tstb %a3@(116)
4c910: 57c2 seq %d2
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
4c912: 246b 00fe moveal %a3@(254),%a2
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
4c916: 49c2 extbl %d2
4c918: 0282 0000 0100 andil #256,%d2
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
4c91e: 4aab 007a tstl %a3@(122)
4c922: 6704 beqs 4c928 <rtems_task_mode+0x3c>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
4c924: 08c2 0009 bset #9,%d2
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
4c928: 4a2a 0008 tstb %a2@(8)
4c92c: 57c5 seq %d5
old_mode |= _ISR_Get_level();
4c92e: 4eb9 0004 8d38 jsr 48d38 <_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;
4c934: 49c5 extbl %d5
4c936: 0285 0000 0400 andil #1024,%d5
4c93c: 8085 orl %d5,%d0
old_mode |= _ISR_Get_level();
4c93e: 8082 orl %d2,%d0
4c940: 2880 movel %d0,%a4@
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
4c942: 0804 0008 btst #8,%d4
4c946: 670c beqs 4c954 <rtems_task_mode+0x68>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
4c948: 0803 0008 btst #8,%d3
4c94c: 57c0 seq %d0
4c94e: 4480 negl %d0
4c950: 1740 0074 moveb %d0,%a3@(116)
if ( mask & RTEMS_TIMESLICE_MASK ) {
4c954: 0804 0009 btst #9,%d4
4c958: 671c beqs 4c976 <rtems_task_mode+0x8a>
if ( _Modes_Is_timeslice(mode_set) ) {
4c95a: 0803 0009 btst #9,%d3
4c95e: 6712 beqs 4c972 <rtems_task_mode+0x86>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4c960: 41f9 0005 eb50 lea 5eb50 <_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;
4c966: 7001 moveq #1,%d0
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4c968: 2750 0076 movel %a0@,%a3@(118)
if ( mask & RTEMS_PREEMPT_MASK )
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
4c96c: 2740 007a movel %d0,%a3@(122)
4c970: 6004 bras 4c976 <rtems_task_mode+0x8a>
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
4c972: 42ab 007a clrl %a3@(122)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
4c976: 7007 moveq #7,%d0
4c978: c084 andl %d4,%d0
4c97a: 6712 beqs 4c98e <rtems_task_mode+0xa2>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
4c97c: 40c0 movew %sr,%d0
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
4c97e: 7207 moveq #7,%d1
4c980: c283 andl %d3,%d1
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
4c982: 0280 0000 f8ff andil #63743,%d0
4c988: e189 lsll #8,%d1
4c98a: 8081 orl %d1,%d0
4c98c: 46c0 movew %d0,%sr
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
4c98e: 0804 000a btst #10,%d4
4c992: 6740 beqs 4c9d4 <rtems_task_mode+0xe8>
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
4c994: 4281 clrl %d1
4c996: 122a 0008 moveb %a2@(8),%d1
4c99a: 4282 clrl %d2
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
4c99c: 0803 000a btst #10,%d3
4c9a0: 57c0 seq %d0
4c9a2: 4480 negl %d0
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
4c9a4: 1400 moveb %d0,%d2
4c9a6: b282 cmpl %d2,%d1
4c9a8: 672a beqs 4c9d4 <rtems_task_mode+0xe8>
asr->is_enabled = is_asr_enabled;
4c9aa: 1540 0008 moveb %d0,%a2@(8)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
4c9ae: 203c 0000 0700 movel #1792,%d0
4c9b4: 40c1 movew %sr,%d1
4c9b6: 8081 orl %d1,%d0
4c9b8: 46c0 movew %d0,%sr
_signals = information->signals_pending;
4c9ba: 202a 0016 movel %a2@(22),%d0
information->signals_pending = information->signals_posted;
4c9be: 256a 0012 0016 movel %a2@(18),%a2@(22)
information->signals_posted = _signals;
4c9c4: 2540 0012 movel %d0,%a2@(18)
_ISR_Enable( _level );
4c9c8: 46c1 movew %d1,%sr
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
4c9ca: 4aaa 0012 tstl %a2@(18)
4c9ce: 56c0 sne %d0
4c9d0: 4480 negl %d0
4c9d2: 6002 bras 4c9d6 <rtems_task_mode+0xea>
4c9d4: 4200 clrb %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
4c9d6: 7203 moveq #3,%d1
4c9d8: b2b9 0005 ecdc cmpl 5ecdc <_System_state_Current>,%d1
4c9de: 662c bnes 4ca0c <rtems_task_mode+0x120>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
4c9e0: 2079 0005 effa moveal 5effa <_Per_CPU_Information+0xc>,%a0
if ( are_signals_pending ||
4c9e6: 4a00 tstb %d0
4c9e8: 660e bnes 4c9f8 <rtems_task_mode+0x10c>
4c9ea: b1f9 0005 effe cmpal 5effe <_Per_CPU_Information+0x10>,%a0
4c9f0: 671a beqs 4ca0c <rtems_task_mode+0x120>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
4c9f2: 4a28 0074 tstb %a0@(116)
4c9f6: 6714 beqs 4ca0c <rtems_task_mode+0x120> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
4c9f8: 7001 moveq #1,%d0
4c9fa: 13c0 0005 f006 moveb %d0,5f006 <_Per_CPU_Information+0x18>
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
4ca00: 4eb9 0004 7c28 jsr 47c28 <_Thread_Dispatch>
4ca06: 6004 bras 4ca0c <rtems_task_mode+0x120>
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
4ca08: 7009 moveq #9,%d0
4ca0a: 6002 bras 4ca0e <rtems_task_mode+0x122>
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
4ca0c: 4280 clrl %d0
}
4ca0e: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
4ca14: 4e5e unlk %fp <== NOT EXECUTED
00049500 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
49500: 4e56 fffc linkw %fp,#-4
49504: 2f0a movel %a2,%sp@-
49506: 246e 0010 moveal %fp@(16),%a2
4950a: 2f02 movel %d2,%sp@-
4950c: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
49510: 670c beqs 4951e <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 ) );
49512: 4280 clrl %d0
49514: 1039 0006 085a moveb 6085a <rtems_maximum_priority>,%d0
4951a: b082 cmpl %d2,%d0
4951c: 654e bcss 4956c <rtems_task_set_priority+0x6c>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
4951e: 4a8a tstl %a2
49520: 674e beqs 49570 <rtems_task_set_priority+0x70>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
49522: 486e fffc pea %fp@(-4)
49526: 2f2e 0008 movel %fp@(8),%sp@-
4952a: 4eb9 0004 b68c jsr 4b68c <_Thread_Get>
switch ( location ) {
49530: 508f addql #8,%sp
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
49532: 2040 moveal %d0,%a0
switch ( location ) {
49534: 4aae fffc tstl %fp@(-4)
49538: 663a bnes 49574 <rtems_task_set_priority+0x74>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
4953a: 24a8 0014 movel %a0@(20),%a2@
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
4953e: 4a82 tstl %d2
49540: 6720 beqs 49562 <rtems_task_set_priority+0x62>
the_thread->real_priority = new_priority;
49542: 2142 0018 movel %d2,%a0@(24)
if ( the_thread->resource_count == 0 ||
49546: 4aa8 001c tstl %a0@(28)
4954a: 6706 beqs 49552 <rtems_task_set_priority+0x52>
4954c: b4a8 0014 cmpl %a0@(20),%d2
49550: 6410 bccs 49562 <rtems_task_set_priority+0x62> <== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
49552: 42a7 clrl %sp@-
49554: 2f02 movel %d2,%sp@-
49556: 2f08 movel %a0,%sp@-
49558: 4eb9 0004 b214 jsr 4b214 <_Thread_Change_priority>
4955e: 4fef 000c lea %sp@(12),%sp
}
_Thread_Enable_dispatch();
49562: 4eb9 0004 b664 jsr 4b664 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
49568: 4280 clrl %d0
4956a: 600a bras 49576 <rtems_task_set_priority+0x76>
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;
4956c: 7013 moveq #19,%d0
4956e: 6006 bras 49576 <rtems_task_set_priority+0x76>
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
49570: 7009 moveq #9,%d0
49572: 6002 bras 49576 <rtems_task_set_priority+0x76>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
49574: 7004 moveq #4,%d0
}
49576: 242e fff4 movel %fp@(-12),%d2
4957a: 246e fff8 moveal %fp@(-8),%a2
4957e: 4e5e unlk %fp
...
00051390 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
51390: 4e56 fffc linkw %fp,#-4
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
51394: 486e fffc pea %fp@(-4)
51398: 2f2e 0008 movel %fp@(8),%sp@-
5139c: 4879 0007 73be pea 773be <_Timer_Information>
513a2: 4eb9 0005 3e2c jsr 53e2c <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
513a8: 4fef 000c lea %sp@(12),%sp
513ac: 4aae fffc tstl %fp@(-4)
513b0: 6620 bnes 513d2 <rtems_timer_cancel+0x42>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
513b2: 7204 moveq #4,%d1
513b4: 2040 moveal %d0,%a0
513b6: b2a8 0038 cmpl %a0@(56),%d1
513ba: 670c beqs 513c8 <rtems_timer_cancel+0x38> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
513bc: 4868 0010 pea %a0@(16)
513c0: 4eb9 0005 5a1c jsr 55a1c <_Watchdog_Remove>
513c6: 588f addql #4,%sp
_Thread_Enable_dispatch();
513c8: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
513ce: 4280 clrl %d0
513d0: 6002 bras 513d4 <rtems_timer_cancel+0x44>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
513d2: 7004 moveq #4,%d0
}
513d4: 4e5e unlk %fp <== NOT EXECUTED
00045ee4 <rtems_timer_create>:
rtems_status_code rtems_timer_create(
rtems_name name,
rtems_id *id
)
{
45ee4: 4e56 0000 linkw %fp,#0
45ee8: 2f0a movel %a2,%sp@-
45eea: 246e 000c moveal %fp@(12),%a2
45eee: 2f02 movel %d2,%sp@-
45ef0: 242e 0008 movel %fp@(8),%d2
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
45ef4: 676e beqs 45f64 <rtems_timer_create+0x80> <== NEVER TAKEN
return RTEMS_INVALID_NAME;
if ( !id )
45ef6: 4a8a tstl %a2
45ef8: 676e beqs 45f68 <rtems_timer_create+0x84> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
45efa: 2039 0005 ec1a movel 5ec1a <_Thread_Dispatch_disable_level>,%d0
45f00: 5280 addql #1,%d0
45f02: 23c0 0005 ec1a movel %d0,5ec1a <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
45f08: 2039 0005 ec1a movel 5ec1a <_Thread_Dispatch_disable_level>,%d0
* This function allocates a timer control block from
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
{
return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
45f0e: 4879 0005 f45c pea 5f45c <_Timer_Information>
45f14: 4eb9 0004 6d84 jsr 46d84 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
45f1a: 588f addql #4,%sp
45f1c: 2040 moveal %d0,%a0
45f1e: 4a80 tstl %d0
45f20: 660a bnes 45f2c <rtems_timer_create+0x48>
_Thread_Enable_dispatch();
45f22: 4eb9 0004 7df8 jsr 47df8 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
45f28: 7005 moveq #5,%d0
45f2a: 603e bras 45f6a <rtems_timer_create+0x86>
}
the_timer->the_class = TIMER_DORMANT;
45f2c: 7004 moveq #4,%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
45f2e: 4281 clrl %d1
45f30: 2140 0038 movel %d0,%a0@(56)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
45f34: 2028 0008 movel %a0@(8),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
45f38: 2279 0005 f474 moveal 5f474 <_Timer_Information+0x18>,%a1
45f3e: 3200 movew %d0,%d1
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
45f40: 42a8 0018 clrl %a0@(24)
the_watchdog->routine = routine;
45f44: 42a8 002c clrl %a0@(44)
the_watchdog->id = id;
45f48: 42a8 0030 clrl %a0@(48)
the_watchdog->user_data = user_data;
45f4c: 42a8 0034 clrl %a0@(52)
45f50: 2388 1c00 movel %a0,%a1@(00000000,%d1:l:4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
45f54: 2142 000c movel %d2,%a0@(12)
&_Timer_Information,
&the_timer->Object,
(Objects_Name) name
);
*id = the_timer->Object.id;
45f58: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
45f5a: 4eb9 0004 7df8 jsr 47df8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
45f60: 4280 clrl %d0
45f62: 6006 bras 45f6a <rtems_timer_create+0x86>
)
{
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
45f64: 7003 moveq #3,%d0
45f66: 6002 bras 45f6a <rtems_timer_create+0x86>
if ( !id )
return RTEMS_INVALID_ADDRESS;
45f68: 7009 moveq #9,%d0
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
45f6a: 242e fff8 movel %fp@(-8),%d2
45f6e: 246e fffc moveal %fp@(-4),%a2
45f72: 4e5e unlk %fp
...
0005176c <rtems_timer_server_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
5176c: 4e56 ffe8 linkw %fp,#-24
51770: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
51774: 262e 0008 movel %fp@(8),%d3
51778: 242e 000c movel %fp@(12),%d2
5177c: 282e 0010 movel %fp@(16),%d4
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
51780: 2679 0007 73f8 moveal 773f8 <_Timer_server>,%a3
if ( !timer_server )
51786: 4a8b tstl %a3
51788: 6700 0088 beqw 51812 <rtems_timer_server_fire_after+0xa6>
return RTEMS_INCORRECT_STATE;
if ( !routine )
5178c: 4a84 tstl %d4
5178e: 6700 0086 beqw 51816 <rtems_timer_server_fire_after+0xaa>
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
51792: 4a82 tstl %d2
51794: 6700 0084 beqw 5181a <rtems_timer_server_fire_after+0xae>
51798: 486e fffc pea %fp@(-4)
5179c: 2f03 movel %d3,%sp@-
5179e: 4879 0007 73be pea 773be <_Timer_Information>
517a4: 4eb9 0005 3e2c jsr 53e2c <_Objects_Get>
return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
517aa: 4fef 000c lea %sp@(12),%sp
517ae: 2440 moveal %d0,%a2
517b0: 4aae fffc tstl %fp@(-4)
517b4: 6668 bnes 5181e <rtems_timer_server_fire_after+0xb2><== NEVER TAKEN
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
517b6: 486a 0010 pea %a2@(16)
517ba: 4eb9 0005 5a1c jsr 55a1c <_Watchdog_Remove>
_ISR_Disable( level );
517c0: 203c 0000 0700 movel #1792,%d0
517c6: 40c1 movew %sr,%d1
517c8: 8081 orl %d1,%d0
517ca: 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_timer->Ticker.state != WATCHDOG_INACTIVE ) {
517cc: 588f addql #4,%sp
517ce: 4aaa 0018 tstl %a2@(24)
517d2: 670a beqs 517de <rtems_timer_server_fire_after+0x72>
_ISR_Enable( level );
517d4: 46c1 movew %d1,%sr
_Thread_Enable_dispatch();
517d6: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
517dc: 6030 bras 5180e <rtems_timer_server_fire_after+0xa2>
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL_ON_TASK;
517de: 7001 moveq #1,%d0
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
517e0: 256e 0014 0034 movel %fp@(20),%a2@(52)
517e6: 2540 0038 movel %d0,%a2@(56)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
517ea: 42aa 0018 clrl %a2@(24)
the_watchdog->routine = routine;
517ee: 2544 002c movel %d4,%a2@(44)
the_watchdog->id = id;
517f2: 2543 0030 movel %d3,%a2@(48)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = ticks;
517f6: 2542 001c movel %d2,%a2@(28)
_ISR_Enable( level );
517fa: 46c1 movew %d1,%sr
(*timer_server->schedule_operation)( timer_server, the_timer );
517fc: 2f0a movel %a2,%sp@-
517fe: 2f0b movel %a3,%sp@-
51800: 206b 0004 moveal %a3@(4),%a0
51804: 4e90 jsr %a0@
_Thread_Enable_dispatch();
51806: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
5180c: 508f addql #8,%sp
5180e: 4280 clrl %d0
51810: 600e bras 51820 <rtems_timer_server_fire_after+0xb4>
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
51812: 700e moveq #14,%d0
51814: 600a bras 51820 <rtems_timer_server_fire_after+0xb4>
if ( !routine )
return RTEMS_INVALID_ADDRESS;
51816: 7009 moveq #9,%d0
51818: 6006 bras 51820 <rtems_timer_server_fire_after+0xb4>
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
5181a: 700a moveq #10,%d0
5181c: 6002 bras 51820 <rtems_timer_server_fire_after+0xb4>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
5181e: 7004 moveq #4,%d0
}
51820: 4cee 0c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a3
51826: 4e5e unlk %fp
...
0005182c <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
5182c: 4e56 ffe8 linkw %fp,#-24
51830: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
51834: 262e 0008 movel %fp@(8),%d3
51838: 242e 000c movel %fp@(12),%d2
5183c: 282e 0010 movel %fp@(16),%d4
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
51840: 2679 0007 73f8 moveal 773f8 <_Timer_server>,%a3
if ( !timer_server )
51846: 4a8b tstl %a3
51848: 6700 0098 beqw 518e2 <rtems_timer_server_fire_when+0xb6>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
5184c: 4a39 0007 6b4c tstb 76b4c <_TOD_Is_set>
51852: 6700 0092 beqw 518e6 <rtems_timer_server_fire_when+0xba>
return RTEMS_NOT_DEFINED;
if ( !routine )
51856: 4a84 tstl %d4
51858: 6700 0090 beqw 518ea <rtems_timer_server_fire_when+0xbe>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
5185c: 2f02 movel %d2,%sp@-
5185e: 4eb9 0004 ec6c jsr 4ec6c <_TOD_Validate>
51864: 588f addql #4,%sp
51866: 4a00 tstb %d0
51868: 6700 0084 beqw 518ee <rtems_timer_server_fire_when+0xc2>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
5186c: 2f02 movel %d2,%sp@-
5186e: 4eb9 0004 ebd4 jsr 4ebd4 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
51874: 588f addql #4,%sp
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
51876: 2400 movel %d0,%d2
if ( seconds <= _TOD_Seconds_since_epoch() )
51878: b0b9 0007 6bc6 cmpl 76bc6 <_TOD_Now>,%d0
5187e: 636e blss 518ee <rtems_timer_server_fire_when+0xc2>
51880: 486e fffc pea %fp@(-4)
51884: 2f03 movel %d3,%sp@-
51886: 4879 0007 73be pea 773be <_Timer_Information>
5188c: 4eb9 0005 3e2c jsr 53e2c <_Objects_Get>
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
51892: 4fef 000c lea %sp@(12),%sp
51896: 2440 moveal %d0,%a2
51898: 4aae fffc tstl %fp@(-4)
5189c: 6654 bnes 518f2 <rtems_timer_server_fire_when+0xc6>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
5189e: 486a 0010 pea %a2@(16)
518a2: 4eb9 0005 5a1c jsr 55a1c <_Watchdog_Remove>
the_watchdog->user_data = user_data;
518a8: 256e 0014 0034 movel %fp@(20),%a2@(52)
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
518ae: 94b9 0007 6bc6 subl 76bc6 <_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;
518b4: 7003 moveq #3,%d0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
518b6: 42aa 0018 clrl %a2@(24)
518ba: 2540 0038 movel %d0,%a2@(56)
the_watchdog->routine = routine;
518be: 2544 002c movel %d4,%a2@(44)
the_watchdog->id = id;
518c2: 2543 0030 movel %d3,%a2@(48)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
518c6: 2542 001c movel %d2,%a2@(28)
(*timer_server->schedule_operation)( timer_server, the_timer );
518ca: 2f0a movel %a2,%sp@-
518cc: 2f0b movel %a3,%sp@-
518ce: 206b 0004 moveal %a3@(4),%a0
518d2: 4e90 jsr %a0@
_Thread_Enable_dispatch();
518d4: 4eb9 0005 4ab4 jsr 54ab4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
518da: 4fef 000c lea %sp@(12),%sp
518de: 4280 clrl %d0
518e0: 6012 bras 518f4 <rtems_timer_server_fire_when+0xc8>
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
518e2: 700e moveq #14,%d0
518e4: 600e bras 518f4 <rtems_timer_server_fire_when+0xc8>
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
518e6: 700b moveq #11,%d0 <== NOT EXECUTED
518e8: 600a bras 518f4 <rtems_timer_server_fire_when+0xc8><== NOT EXECUTED
if ( !routine )
return RTEMS_INVALID_ADDRESS;
518ea: 7009 moveq #9,%d0
518ec: 6006 bras 518f4 <rtems_timer_server_fire_when+0xc8>
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
518ee: 7014 moveq #20,%d0
518f0: 6002 bras 518f4 <rtems_timer_server_fire_when+0xc8>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
518f2: 7004 moveq #4,%d0
}
518f4: 4cee 0c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a3
518fa: 4e5e unlk %fp
...
00046018 <sched_get_priority_max>:
int sched_get_priority_max(
int policy
)
{
switch ( policy ) {
46018: 7004 moveq #4,%d0
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
4601a: 4e56 0000 linkw %fp,#0
4601e: 222e 0008 movel %fp@(8),%d1
switch ( policy ) {
46022: b081 cmpl %d1,%d0
46024: 650c bcss 46032 <sched_get_priority_max+0x1a>
46026: 103c 0001 moveb #1,%d0
4602a: e3a8 lsll %d1,%d0
4602c: 7217 moveq #23,%d1
4602e: c081 andl %d1,%d0
46030: 6610 bnes 46042 <sched_get_priority_max+0x2a> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
46032: 4eb9 0004 d750 jsr 4d750 <__errno>
46038: 2040 moveal %d0,%a0
4603a: 7016 moveq #22,%d0
4603c: 2080 movel %d0,%a0@
4603e: 70ff moveq #-1,%d0
46040: 600a bras 4604c <sched_get_priority_max+0x34>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
46042: 4280 clrl %d0
46044: 1039 0005 dfea moveb 5dfea <rtems_maximum_priority>,%d0
4604a: 5380 subql #1,%d0
}
4604c: 4e5e unlk %fp <== NOT EXECUTED
00046050 <sched_get_priority_min>:
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
46050: 7004 moveq #4,%d0
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
46052: 4e56 0000 linkw %fp,#0
46056: 222e 0008 movel %fp@(8),%d1
switch ( policy ) {
4605a: b081 cmpl %d1,%d0
4605c: 650c bcss 4606a <sched_get_priority_min+0x1a>
4605e: 103c 0001 moveb #1,%d0
46062: e3a8 lsll %d1,%d0
46064: 7217 moveq #23,%d1
46066: c081 andl %d1,%d0
46068: 6610 bnes 4607a <sched_get_priority_min+0x2a> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
4606a: 4eb9 0004 d750 jsr 4d750 <__errno>
46070: 2040 moveal %d0,%a0
46072: 7016 moveq #22,%d0
46074: 2080 movel %d0,%a0@
46076: 70ff moveq #-1,%d0
46078: 6002 bras 4607c <sched_get_priority_min+0x2c>
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
4607a: 7001 moveq #1,%d0
}
4607c: 4e5e unlk %fp <== NOT EXECUTED
00046080 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
46080: 4e56 0000 linkw %fp,#0
46084: 2f03 movel %d3,%sp@-
46086: 262e 0008 movel %fp@(8),%d3
4608a: 2f02 movel %d2,%sp@-
4608c: 242e 000c movel %fp@(12),%d2
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
46090: 4a83 tstl %d3
46092: 6718 beqs 460ac <sched_rr_get_interval+0x2c> <== NEVER TAKEN
46094: 4eb9 0004 30a4 jsr 430a4 <getpid>
4609a: b083 cmpl %d3,%d0
4609c: 670e beqs 460ac <sched_rr_get_interval+0x2c>
rtems_set_errno_and_return_minus_one( ESRCH );
4609e: 4eb9 0004 d750 jsr 4d750 <__errno>
460a4: 7203 moveq #3,%d1
460a6: 2040 moveal %d0,%a0
460a8: 2081 movel %d1,%a0@
460aa: 6010 bras 460bc <sched_rr_get_interval+0x3c>
if ( !interval )
460ac: 4a82 tstl %d2
460ae: 6610 bnes 460c0 <sched_rr_get_interval+0x40>
rtems_set_errno_and_return_minus_one( EINVAL );
460b0: 4eb9 0004 d750 jsr 4d750 <__errno>
460b6: 2040 moveal %d0,%a0
460b8: 7016 moveq #22,%d0
460ba: 2080 movel %d0,%a0@
460bc: 70ff moveq #-1,%d0
460be: 6012 bras 460d2 <sched_rr_get_interval+0x52>
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
460c0: 2f02 movel %d2,%sp@-
460c2: 2f39 0005 f940 movel 5f940 <_Thread_Ticks_per_timeslice>,%sp@-
460c8: 4eb9 0004 9434 jsr 49434 <_Timespec_From_ticks>
return 0;
460ce: 508f addql #8,%sp
460d0: 4280 clrl %d0
}
460d2: 242e fff8 movel %fp@(-8),%d2
460d6: 262e fffc movel %fp@(-4),%d3
460da: 4e5e unlk %fp
...
000485f4 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
485f4: 4e56 ffdc linkw %fp,#-36
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
485f8: 2039 0006 38b4 movel 638b4 <_Thread_Dispatch_disable_level>,%d0
485fe: 5280 addql #1,%d0
48600: 48d7 047c moveml %d2-%d6/%a2,%sp@
48604: 23c0 0006 38b4 movel %d0,638b4 <_Thread_Dispatch_disable_level>
4860a: 262e 0008 movel %fp@(8),%d3
4860e: 2a2e 000c movel %fp@(12),%d5
return _Thread_Dispatch_disable_level;
48612: 2039 0006 38b4 movel 638b4 <_Thread_Dispatch_disable_level>,%d0
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
48618: 2c05 movel %d5,%d6
4861a: 0286 0000 0200 andil #512,%d6
48620: 6706 beqs 48628 <sem_open+0x34>
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
48622: 282e 0014 movel %fp@(20),%d4
48626: 6002 bras 4862a <sem_open+0x36>
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
48628: 4284 clrl %d4
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
4862a: 45ee fff4 lea %fp@(-12),%a2
4862e: 2f0a movel %a2,%sp@-
48630: 2f03 movel %d3,%sp@-
48632: 4eb9 0004 e208 jsr 4e208 <_POSIX_Semaphore_Name_to_id>
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "semaphore does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
48638: 508f addql #8,%sp
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
4863a: 2400 movel %d0,%d2
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "semaphore does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
4863c: 671c beqs 4865a <sem_open+0x66>
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
4863e: 7002 moveq #2,%d0
48640: b082 cmpl %d2,%d0
48642: 6604 bnes 48648 <sem_open+0x54> <== NEVER TAKEN
48644: 4a86 tstl %d6
48646: 6660 bnes 486a8 <sem_open+0xb4>
_Thread_Enable_dispatch();
48648: 4eb9 0004 b1bc jsr 4b1bc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
4864e: 4eb9 0005 09d0 jsr 509d0 <__errno>
48654: 2040 moveal %d0,%a0
48656: 2082 movel %d2,%a0@
48658: 6078 bras 486d2 <sem_open+0xde>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
4865a: 0285 0000 0a00 andil #2560,%d5
48660: 0c85 0000 0a00 cmpil #2560,%d5
48666: 6614 bnes 4867c <sem_open+0x88>
_Thread_Enable_dispatch();
48668: 4eb9 0004 b1bc jsr 4b1bc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
4866e: 4eb9 0005 09d0 jsr 509d0 <__errno>
48674: 2040 moveal %d0,%a0
48676: 7011 moveq #17,%d0
48678: 2080 movel %d0,%a0@
4867a: 6056 bras 486d2 <sem_open+0xde>
4867c: 486e fffc pea %fp@(-4)
48680: 2f12 movel %a2@,%sp@-
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
the_semaphore->open_count += 1;
_Thread_Enable_dispatch();
48682: 45f9 0004 b1bc lea 4b1bc <_Thread_Enable_dispatch>,%a2
48688: 4879 0006 3ac2 pea 63ac2 <_POSIX_Semaphore_Information>
4868e: 4eb9 0004 a528 jsr 4a528 <_Objects_Get>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
the_semaphore->open_count += 1;
48694: 2040 moveal %d0,%a0
48696: 52a8 0016 addql #1,%a0@(22)
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
4869a: 2d40 fff8 movel %d0,%fp@(-8)
the_semaphore->open_count += 1;
_Thread_Enable_dispatch();
4869e: 4e92 jsr %a2@
_Thread_Enable_dispatch();
486a0: 4e92 jsr %a2@
goto return_id;
486a2: 4fef 000c lea %sp@(12),%sp
486a6: 6022 bras 486ca <sem_open+0xd6>
/*
* At this point, the semaphore does not exist and everything has been
* checked. We should go ahead and create a semaphore.
*/
status =_POSIX_Semaphore_Create_support(
486a8: 486e fff8 pea %fp@(-8)
486ac: 2f04 movel %d4,%sp@-
486ae: 42a7 clrl %sp@-
486b0: 2f03 movel %d3,%sp@-
486b2: 4eb9 0004 e0bc jsr 4e0bc <_POSIX_Semaphore_Create_support>
486b8: 2400 movel %d0,%d2
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
486ba: 4eb9 0004 b1bc jsr 4b1bc <_Thread_Enable_dispatch>
if ( status == -1 )
486c0: 4fef 0010 lea %sp@(16),%sp
486c4: 70ff moveq #-1,%d0
486c6: b082 cmpl %d2,%d0
486c8: 6708 beqs 486d2 <sem_open+0xde>
the_semaphore->Semaphore_id = the_semaphore->Object.id;
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
486ca: 202e fff8 movel %fp@(-8),%d0
486ce: 5080 addql #8,%d0
486d0: 6002 bras 486d4 <sem_open+0xe0>
*/
_Thread_Enable_dispatch();
if ( status == -1 )
return SEM_FAILED;
486d2: 70ff moveq #-1,%d0
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
486d4: 4cee 047c ffdc moveml %fp@(-36),%d2-%d6/%a2
486da: 4e5e unlk %fp
...
00045eac <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
45eac: 4e56 fff0 linkw %fp,#-16
45eb0: 222e 0010 movel %fp@(16),%d1
45eb4: 48d7 041c moveml %d2-%d4/%a2,%sp@
45eb8: 242e 0008 movel %fp@(8),%d2
45ebc: 246e 000c moveal %fp@(12),%a2
ISR_Level level;
if ( oact )
45ec0: 4a81 tstl %d1
45ec2: 6722 beqs 45ee6 <sigaction+0x3a>
*oact = _POSIX_signals_Vectors[ sig ];
45ec4: 2602 movel %d2,%d3
45ec6: 2002 movel %d2,%d0
45ec8: 4878 000c pea c <OPER1>
45ecc: e58b lsll #2,%d3
45ece: e988 lsll #4,%d0
45ed0: 9083 subl %d3,%d0
45ed2: 0680 0006 0a64 addil #395876,%d0
45ed8: 2f00 movel %d0,%sp@-
45eda: 2f01 movel %d1,%sp@-
45edc: 4eb9 0004 e268 jsr 4e268 <memcpy>
45ee2: 4fef 000c lea %sp@(12),%sp
if ( !sig )
45ee6: 4a82 tstl %d2
45ee8: 6710 beqs 45efa <sigaction+0x4e>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
45eea: 2002 movel %d2,%d0
45eec: 5380 subql #1,%d0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
45eee: 721f moveq #31,%d1
45ef0: b280 cmpl %d0,%d1
45ef2: 6506 bcss 45efa <sigaction+0x4e>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
45ef4: 7009 moveq #9,%d0
45ef6: b082 cmpl %d2,%d0
45ef8: 6610 bnes 45f0a <sigaction+0x5e>
rtems_set_errno_and_return_minus_one( EINVAL );
45efa: 4eb9 0004 da30 jsr 4da30 <__errno>
45f00: 2040 moveal %d0,%a0
45f02: 7016 moveq #22,%d0
45f04: 2080 movel %d0,%a0@
45f06: 70ff moveq #-1,%d0
45f08: 6062 bras 45f6c <sigaction+0xc0>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
45f0a: 4a8a tstl %a2
45f0c: 675c beqs 45f6a <sigaction+0xbe> <== NEVER TAKEN
/*
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
45f0e: 203c 0000 0700 movel #1792,%d0
45f14: 40c3 movew %sr,%d3
45f16: 8083 orl %d3,%d0
45f18: 46c0 movew %d0,%sr
45f1a: 780c moveq #12,%d4
45f1c: 4c02 4800 mulsl %d2,%d4
if ( act->sa_handler == SIG_DFL ) {
45f20: 4aaa 0008 tstl %a2@(8)
45f24: 6622 bnes 45f48 <sigaction+0x9c>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
45f26: 4878 000c pea c <OPER1>
45f2a: 2004 movel %d4,%d0
45f2c: 0680 0005 dfaa addil #384938,%d0
45f32: 2f00 movel %d0,%sp@-
45f34: 0684 0006 0a64 addil #395876,%d4
45f3a: 2f04 movel %d4,%sp@-
45f3c: 4eb9 0004 e268 jsr 4e268 <memcpy>
45f42: 4fef 000c lea %sp@(12),%sp
45f46: 6020 bras 45f68 <sigaction+0xbc>
} else {
_POSIX_signals_Clear_process_signals( sig );
45f48: 2f02 movel %d2,%sp@-
_POSIX_signals_Vectors[ sig ] = *act;
45f4a: 0684 0006 0a64 addil #395876,%d4
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
45f50: 4eb9 0004 b2a0 jsr 4b2a0 <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
45f56: 4878 000c pea c <OPER1>
45f5a: 2f0a movel %a2,%sp@-
45f5c: 2f04 movel %d4,%sp@-
45f5e: 4eb9 0004 e268 jsr 4e268 <memcpy>
45f64: 4fef 0010 lea %sp@(16),%sp
}
_ISR_Enable( level );
45f68: 46c3 movew %d3,%sr
* now (signals not posted when SIG_IGN).
* + If we are now ignoring a signal that was previously pending,
* we clear the pending signal indicator.
*/
return 0;
45f6a: 4280 clrl %d0
}
45f6c: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
45f72: 4e5e unlk %fp
...
00047bc8 <sigismember>:
int sigismember(
const sigset_t *set,
int signo
)
{
47bc8: 4e56 0000 linkw %fp,#0
47bcc: 206e 0008 moveal %fp@(8),%a0
47bd0: 222e 000c movel %fp@(12),%d1
if ( !set )
47bd4: 4a88 tstl %a0
47bd6: 670c beqs 47be4 <sigismember+0x1c>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !signo )
47bd8: 4a81 tstl %d1
47bda: 6726 beqs 47c02 <sigismember+0x3a> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
47bdc: 5381 subql #1,%d1
return 0;
if ( !is_valid_signo(signo) )
47bde: 701f moveq #31,%d0
47be0: b081 cmpl %d1,%d0
47be2: 6410 bccs 47bf4 <sigismember+0x2c>
rtems_set_errno_and_return_minus_one( EINVAL );
47be4: 4eb9 0004 f778 jsr 4f778 <__errno>
47bea: 2040 moveal %d0,%a0
47bec: 7016 moveq #22,%d0
47bee: 2080 movel %d0,%a0@
47bf0: 70ff moveq #-1,%d0
47bf2: 6010 bras 47c04 <sigismember+0x3c>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
47bf4: 7001 moveq #1,%d0
47bf6: e3a8 lsll %d1,%d0
if ( *set & signo_to_mask(signo) )
47bf8: c090 andl %a0@,%d0
const sigset_t *set,
int signo
)
{
if ( !set )
rtems_set_errno_and_return_minus_one( EINVAL );
47bfa: 56c0 sne %d0
47bfc: 49c0 extbl %d0
47bfe: 4480 negl %d0
47c00: 6002 bras 47c04 <sigismember+0x3c>
if ( !signo )
return 0;
47c02: 4280 clrl %d0
if ( *set & signo_to_mask(signo) )
return 1;
return 0;
}
47c04: 4e5e unlk %fp <== NOT EXECUTED
00046328 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
46328: 4e56 ffdc linkw %fp,#-36
4632c: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%sp@
46330: 266e 0008 moveal %fp@(8),%a3
46334: 246e 000c moveal %fp@(12),%a2
46338: 242e 0010 movel %fp@(16),%d2
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
4633c: 4a8b tstl %a3
4633e: 6730 beqs 46370 <sigtimedwait+0x48>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
46340: 4a82 tstl %d2
46342: 673c beqs 46380 <sigtimedwait+0x58>
if ( !_Timespec_Is_valid( timeout ) )
46344: 2f02 movel %d2,%sp@-
46346: 4eb9 0004 974c jsr 4974c <_Timespec_Is_valid>
4634c: 588f addql #4,%sp
4634e: 4a00 tstb %d0
46350: 6610 bnes 46362 <sigtimedwait+0x3a>
rtems_set_errno_and_return_minus_one( EINVAL );
46352: 4eb9 0004 dfc8 jsr 4dfc8 <__errno>
46358: 7616 moveq #22,%d3
4635a: 2240 moveal %d0,%a1
4635c: 2283 movel %d3,%a1@
4635e: 6000 014c braw 464ac <sigtimedwait+0x184>
interval = _Timespec_To_ticks( timeout );
46362: 2f02 movel %d2,%sp@-
46364: 4eb9 0004 97bc jsr 497bc <_Timespec_To_ticks>
if ( !interval )
4636a: 588f addql #4,%sp
4636c: 4a80 tstl %d0
4636e: 6612 bnes 46382 <sigtimedwait+0x5a> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
46370: 4eb9 0004 dfc8 jsr 4dfc8 <__errno>
46376: 7416 moveq #22,%d2
46378: 2040 moveal %d0,%a0
4637a: 2082 movel %d2,%a0@
4637c: 6000 012e braw 464ac <sigtimedwait+0x184>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
46380: 4280 clrl %d0
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
46382: 4a8a tstl %a2
46384: 6604 bnes 4638a <sigtimedwait+0x62>
46386: 45ee fff4 lea %fp@(-12),%a2
the_thread = _Thread_Executing;
4638a: 2079 0006 0dfa moveal 60dfa <_Per_CPU_Information+0xc>,%a0
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
46390: 223c 0000 0700 movel #1792,%d1
the_info = ( info ) ? info : &signal_information;
the_thread = _Thread_Executing;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
46396: 2868 0102 moveal %a0@(258),%a4
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
4639a: 40c3 movew %sr,%d3
4639c: 8283 orl %d3,%d1
4639e: 46c1 movew %d1,%sr
if ( *set & api->signals_pending ) {
463a0: 2413 movel %a3@,%d2
463a2: 2802 movel %d2,%d4
463a4: 222c 00d4 movel %a4@(212),%d1
463a8: c881 andl %d1,%d4
463aa: 672a beqs 463d6 <sigtimedwait+0xae>
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
463ac: 2f01 movel %d1,%sp@-
463ae: 4eb9 0004 62dc jsr 462dc <_POSIX_signals_Get_lowest>
463b4: 2480 movel %d0,%a2@
_POSIX_signals_Clear_signals(
463b6: 4297 clrl %sp@
463b8: 42a7 clrl %sp@-
463ba: 2f0a movel %a2,%sp@-
463bc: 2f00 movel %d0,%sp@-
463be: 2f0c movel %a4,%sp@-
463c0: 4eb9 0004 b97c jsr 4b97c <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
463c6: 46c3 movew %d3,%sr
the_info->si_code = SI_USER;
463c8: 7001 moveq #1,%d0
the_info->si_value.sival_int = 0;
463ca: 42aa 0008 clrl %a2@(8)
return the_info->si_signo;
463ce: 2412 movel %a2@,%d2
false,
false
);
_ISR_Enable( level );
the_info->si_code = SI_USER;
463d0: 2540 0004 movel %d0,%a2@(4)
463d4: 6034 bras 4640a <sigtimedwait+0xe2>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
463d6: 2239 0006 1028 movel 61028 <_POSIX_signals_Pending>,%d1
463dc: c481 andl %d1,%d2
463de: 6732 beqs 46412 <sigtimedwait+0xea>
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
463e0: 2f01 movel %d1,%sp@-
463e2: 4eb9 0004 62dc jsr 462dc <_POSIX_signals_Get_lowest>
463e8: 2400 movel %d0,%d2
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
463ea: 4297 clrl %sp@
463ec: 4878 0001 pea 1 <ADD>
463f0: 2f0a movel %a2,%sp@-
463f2: 2f00 movel %d0,%sp@-
463f4: 2f0c movel %a4,%sp@-
463f6: 4eb9 0004 b97c jsr 4b97c <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
463fc: 46c3 movew %d3,%sr
the_info->si_signo = signo;
the_info->si_code = SI_USER;
463fe: 7201 moveq #1,%d1
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
_ISR_Enable( level );
the_info->si_signo = signo;
46400: 2482 movel %d2,%a2@
the_info->si_code = SI_USER;
46402: 2541 0004 movel %d1,%a2@(4)
the_info->si_value.sival_int = 0;
46406: 42aa 0008 clrl %a2@(8)
return signo;
4640a: 4fef 0014 lea %sp@(20),%sp
4640e: 6000 009e braw 464ae <sigtimedwait+0x186>
}
the_info->si_signo = -1;
46412: 72ff moveq #-1,%d1
46414: 2481 movel %d1,%a2@
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
46416: 2239 0006 0998 movel 60998 <_Thread_Dispatch_disable_level>,%d1
4641c: 5281 addql #1,%d1
4641e: 23c1 0006 0998 movel %d1,60998 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
46424: 2239 0006 0998 movel 60998 <_Thread_Dispatch_disable_level>,%d1
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
4642a: 7204 moveq #4,%d1
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
4642c: 43f9 0006 0fc0 lea 60fc0 <_POSIX_signals_Wait_queue>,%a1
the_thread->Wait.return_code = EINTR;
46432: 2141 0034 movel %d1,%a0@(52)
the_thread->Wait.option = *set;
46436: 2153 0030 movel %a3@,%a0@(48)
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;
4643a: 123c 0001 moveb #1,%d1
the_thread->Wait.return_argument = the_info;
4643e: 214a 0028 movel %a2,%a0@(40)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
46442: 2149 0044 movel %a1,%a0@(68)
46446: 23c1 0006 0ff0 movel %d1,60ff0 <_POSIX_signals_Wait_queue+0x30>
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
the_thread->Wait.return_argument = the_info;
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
4644c: 46c3 movew %d3,%sr
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
4644e: 4879 0004 9520 pea 49520 <_Thread_queue_Timeout>
46454: 2f00 movel %d0,%sp@-
46456: 4879 0006 0fc0 pea 60fc0 <_POSIX_signals_Wait_queue>
4645c: 4eb9 0004 9228 jsr 49228 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
46462: 4eb9 0004 8df0 jsr 48df0 <_Thread_Enable_dispatch>
/*
* When the thread is set free by a signal, it is need to eliminate
* the signal.
*/
_POSIX_signals_Clear_signals( api, the_info->si_signo, the_info, false, false );
46468: 42a7 clrl %sp@-
4646a: 42a7 clrl %sp@-
4646c: 2f0a movel %a2,%sp@-
4646e: 2f12 movel %a2@,%sp@-
46470: 2f0c movel %a4,%sp@-
46472: 4eb9 0004 b97c jsr 4b97c <_POSIX_signals_Clear_signals>
/* Set errno only if return code is not EINTR or
* if EINTR was caused by a signal being caught, which
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
46478: 2079 0006 0dfa moveal 60dfa <_Per_CPU_Information+0xc>,%a0
4647e: 4fef 0020 lea %sp@(32),%sp
46482: 7004 moveq #4,%d0
46484: b0a8 0034 cmpl %a0@(52),%d0
46488: 6610 bnes 4649a <sigtimedwait+0x172>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
4648a: 2412 movel %a2@,%d2
4648c: 2202 movel %d2,%d1
4648e: 5381 subql #1,%d1
46490: 103c 0001 moveb #1,%d0
46494: e3a8 lsll %d1,%d0
46496: c093 andl %a3@,%d0
46498: 6614 bnes 464ae <sigtimedwait+0x186>
errno = _Thread_Executing->Wait.return_code;
4649a: 4eb9 0004 dfc8 jsr 4dfc8 <__errno>
464a0: 2079 0006 0dfa moveal 60dfa <_Per_CPU_Information+0xc>,%a0
464a6: 2240 moveal %d0,%a1
464a8: 22a8 0034 movel %a0@(52),%a1@
return -1;
464ac: 74ff moveq #-1,%d2
}
return the_info->si_signo;
}
464ae: 2002 movel %d2,%d0
464b0: 4cee 1c1c ffdc moveml %fp@(-36),%d2-%d4/%a2-%a4
464b6: 4e5e unlk %fp
...
00047eb8 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
47eb8: 4e56 0000 linkw %fp,#0
47ebc: 2f0a movel %a2,%sp@-
47ebe: 246e 000c moveal %fp@(12),%a2
int status;
status = sigtimedwait( set, NULL, NULL );
47ec2: 42a7 clrl %sp@-
47ec4: 42a7 clrl %sp@-
47ec6: 2f2e 0008 movel %fp@(8),%sp@-
47eca: 4eb9 0004 7d0c jsr 47d0c <sigtimedwait>
if ( status != -1 ) {
47ed0: 4fef 000c lea %sp@(12),%sp
47ed4: 72ff moveq #-1,%d1
47ed6: b280 cmpl %d0,%d1
47ed8: 6708 beqs 47ee2 <sigwait+0x2a>
if ( sig )
47eda: 4a8a tstl %a2
47edc: 6710 beqs 47eee <sigwait+0x36> <== NEVER TAKEN
*sig = status;
47ede: 2480 movel %d0,%a2@
47ee0: 600c bras 47eee <sigwait+0x36>
return 0;
}
return errno;
47ee2: 4eb9 0004 f778 jsr 4f778 <__errno>
47ee8: 2040 moveal %d0,%a0
47eea: 2010 movel %a0@,%d0
47eec: 6002 bras 47ef0 <sigwait+0x38>
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
47eee: 4280 clrl %d0
}
return errno;
}
47ef0: 246e fffc moveal %fp@(-4),%a2
47ef4: 4e5e unlk %fp <== NOT EXECUTED
000454bc <timer_create>:
timer_t *timerid
)
{
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
454bc: 7001 moveq #1,%d0
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
454be: 4e56 0000 linkw %fp,#0
454c2: 2f0b movel %a3,%sp@-
454c4: 266e 0010 moveal %fp@(16),%a3
454c8: 2f0a movel %a2,%sp@-
454ca: 246e 000c moveal %fp@(12),%a2
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
454ce: b0ae 0008 cmpl %fp@(8),%d0
454d2: 6620 bnes 454f4 <timer_create+0x38>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
454d4: 4a8b tstl %a3
454d6: 671c beqs 454f4 <timer_create+0x38>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
454d8: 4a8a tstl %a2
454da: 6726 beqs 45502 <timer_create+0x46>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
454dc: 2012 movel %a2@,%d0
454de: 7201 moveq #1,%d1
454e0: 5380 subql #1,%d0
454e2: b280 cmpl %d0,%d1
454e4: 650e bcss 454f4 <timer_create+0x38> <== NEVER TAKEN
( evp->sigev_notify != SIGEV_SIGNAL ) ) {
/* The value of the field sigev_notify is not valid */
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !evp->sigev_signo )
454e6: 202a 0004 movel %a2@(4),%d0
454ea: 6708 beqs 454f4 <timer_create+0x38> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
454ec: 5380 subql #1,%d0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
454ee: 721f moveq #31,%d1
454f0: b280 cmpl %d0,%d1
454f2: 640e bccs 45502 <timer_create+0x46> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
454f4: 4eb9 0004 d4b0 jsr 4d4b0 <__errno>
454fa: 7216 moveq #22,%d1
454fc: 2040 moveal %d0,%a0
454fe: 2081 movel %d1,%a0@
45500: 603a bras 4553c <timer_create+0x80>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
45502: 2039 0005 f538 movel 5f538 <_Thread_Dispatch_disable_level>,%d0
45508: 5280 addql #1,%d0
4550a: 23c0 0005 f538 movel %d0,5f538 <_Thread_Dispatch_disable_level>
return _Thread_Dispatch_disable_level;
45510: 2039 0005 f538 movel 5f538 <_Thread_Dispatch_disable_level>,%d0
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Allocate( void )
{
return (POSIX_Timer_Control *) _Objects_Allocate( &_POSIX_Timer_Information );
45516: 4879 0005 f780 pea 5f780 <_POSIX_Timer_Information>
4551c: 4eb9 0004 71e8 jsr 471e8 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
45522: 588f addql #4,%sp
45524: 2040 moveal %d0,%a0
45526: 4a80 tstl %d0
45528: 6616 bnes 45540 <timer_create+0x84>
_Thread_Enable_dispatch();
4552a: 4eb9 0004 825c jsr 4825c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
45530: 4eb9 0004 d4b0 jsr 4d4b0 <__errno>
45536: 2040 moveal %d0,%a0
45538: 700b moveq #11,%d0
4553a: 2080 movel %d0,%a0@
4553c: 70ff moveq #-1,%d0
4553e: 606a bras 455aa <timer_create+0xee>
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
45540: 7002 moveq #2,%d0
45542: 1140 003c moveb %d0,%a0@(60)
ptimer->thread_id = _Thread_Executing->Object.id;
45546: 2279 0005 f99a moveal 5f99a <_Per_CPU_Information+0xc>,%a1
4554c: 2169 0008 0038 movel %a1@(8),%a0@(56)
if ( evp != NULL ) {
45552: 4a8a tstl %a2
45554: 6710 beqs 45566 <timer_create+0xaa>
ptimer->inf.sigev_notify = evp->sigev_notify;
45556: 2152 003e movel %a2@,%a0@(62)
ptimer->inf.sigev_signo = evp->sigev_signo;
4555a: 216a 0004 0042 movel %a2@(4),%a0@(66)
ptimer->inf.sigev_value = evp->sigev_value;
45560: 216a 0008 0046 movel %a2@(8),%a0@(70)
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
45566: 2028 0008 movel %a0@(8),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
4556a: 4281 clrl %d1
4556c: 2279 0005 f798 moveal 5f798 <_POSIX_Timer_Information+0x18>,%a1
45572: 3200 movew %d0,%d1
}
ptimer->overrun = 0;
45574: 42a8 0066 clrl %a0@(102)
ptimer->timer_data.it_value.tv_sec = 0;
45578: 42a8 005a clrl %a0@(90)
ptimer->timer_data.it_value.tv_nsec = 0;
4557c: 42a8 005e clrl %a0@(94)
ptimer->timer_data.it_interval.tv_sec = 0;
45580: 42a8 0052 clrl %a0@(82)
ptimer->timer_data.it_interval.tv_nsec = 0;
45584: 42a8 0056 clrl %a0@(86)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
45588: 42a8 0018 clrl %a0@(24)
the_watchdog->routine = routine;
4558c: 42a8 002c clrl %a0@(44)
the_watchdog->id = id;
45590: 42a8 0030 clrl %a0@(48)
the_watchdog->user_data = user_data;
45594: 42a8 0034 clrl %a0@(52)
45598: 2388 1c00 movel %a0,%a1@(00000000,%d1:l:4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
4559c: 42a8 000c clrl %a0@(12)
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
455a0: 2680 movel %d0,%a3@
_Thread_Enable_dispatch();
455a2: 4eb9 0004 825c jsr 4825c <_Thread_Enable_dispatch>
return 0;
455a8: 4280 clrl %d0
}
455aa: 246e fff8 moveal %fp@(-8),%a2
455ae: 266e fffc moveal %fp@(-4),%a3
455b2: 4e5e unlk %fp
...
000456b2 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
456b2: 4e56 ffe8 linkw %fp,#-24
456b6: 48d7 041c moveml %d2-%d4/%a2,%sp@
456ba: 262e 0008 movel %fp@(8),%d3
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
456be: 4ab9 0006 0968 tstl 60968 <_POSIX_signals_Ualarm_timer+0x1c>
456c4: 6620 bnes 456e6 <ualarm+0x34>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
456c6: 42b9 0006 0954 clrl 60954 <_POSIX_signals_Ualarm_timer+0x8>
the_watchdog->routine = routine;
456cc: 203c 0004 5670 movel #284272,%d0
the_watchdog->id = id;
456d2: 42b9 0006 096c clrl 6096c <_POSIX_signals_Ualarm_timer+0x20>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
456d8: 23c0 0006 0968 movel %d0,60968 <_POSIX_signals_Ualarm_timer+0x1c>
the_watchdog->id = id;
the_watchdog->user_data = user_data;
456de: 42b9 0006 0970 clrl 60970 <_POSIX_signals_Ualarm_timer+0x24>
456e4: 6056 bras 4573c <ualarm+0x8a>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
456e6: 4879 0006 094c pea 6094c <_POSIX_signals_Ualarm_timer>
456ec: 4eb9 0004 8ef0 jsr 48ef0 <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
456f2: 588f addql #4,%sp
456f4: 7201 moveq #1,%d1
456f6: 5580 subql #2,%d0
456f8: b280 cmpl %d0,%d1
456fa: 6540 bcss 4573c <ualarm+0x8a> <== NEVER TAKEN
* boot. Since alarm() is dealing in seconds, we must account for
* this.
*/
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
456fc: 2039 0006 0960 movel 60960 <_POSIX_signals_Ualarm_timer+0x14>,%d0
45702: d0b9 0006 0958 addl 60958 <_POSIX_signals_Ualarm_timer+0xc>,%d0
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
45708: 486e fff8 pea %fp@(-8)
4570c: 90b9 0006 0964 subl 60964 <_POSIX_signals_Ualarm_timer+0x18>,%d0
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
45712: 283c 000f 4240 movel #1000000,%d4
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
45718: 2f00 movel %d0,%sp@-
4571a: 4eb9 0004 8a04 jsr 48a04 <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
45720: 202e fff8 movel %fp@(-8),%d0
45724: 4c04 0800 mulsl %d4,%d0
remaining += tp.tv_nsec / 1000;
45728: 283c 0000 03e8 movel #1000,%d4
4572e: 508f addql #8,%sp
45730: 242e fffc movel %fp@(-4),%d2
45734: 4c44 2802 remsl %d4,%d2,%d2
45738: d480 addl %d0,%d2
4573a: 6002 bras 4573e <ualarm+0x8c>
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
4573c: 4282 clrl %d2
/*
* If useconds is non-zero, then the caller wants to schedule
* the alarm repeatedly at that interval. If the interval is
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
4573e: 4a83 tstl %d3
45740: 674e beqs 45790 <ualarm+0xde>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
45742: 283c 0000 03e8 movel #1000,%d4
ticks = _Timespec_To_ticks( &tp );
45748: 45f9 0004 8a88 lea 48a88 <_Timespec_To_ticks>,%a2
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
4574e: 223c 000f 4240 movel #1000000,%d1
45754: 4c41 3000 remul %d1,%d0,%d3
45758: 4c41 3003 remul %d1,%d3,%d3
4575c: 2d43 fff8 movel %d3,%fp@(-8)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
45760: 4c00 4800 mulsl %d0,%d4
ticks = _Timespec_To_ticks( &tp );
45764: 260e movel %fp,%d3
45766: 5183 subql #8,%d3
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
45768: 2d44 fffc movel %d4,%fp@(-4)
ticks = _Timespec_To_ticks( &tp );
4576c: 2f03 movel %d3,%sp@-
4576e: 4e92 jsr %a2@
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
45770: 2f03 movel %d3,%sp@-
45772: 4e92 jsr %a2@
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
45774: 4879 0006 094c pea 6094c <_POSIX_signals_Ualarm_timer>
4577a: 4879 0006 01f0 pea 601f0 <_Watchdog_Ticks_chain>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
45780: 23c0 0006 0958 movel %d0,60958 <_POSIX_signals_Ualarm_timer+0xc>
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
45786: 4eb9 0004 8dcc jsr 48dcc <_Watchdog_Insert>
4578c: 4fef 0010 lea %sp@(16),%sp
}
return remaining;
}
45790: 2002 movel %d2,%d0
45792: 4cee 041c ffe8 moveml %fp@(-24),%d2-%d4/%a2
45798: 4e5e unlk %fp <== NOT EXECUTED