RTEMS 4.11Annotated Report
Sun Mar 20 22:33:27 2011
000461d4 <_API_Mutex_Unlock>:
#include <rtems/score/apimutex.h>
void _API_Mutex_Unlock(
API_Mutex_Control *the_mutex
)
{
461d4: 4e56 0000 linkw %fp,#0
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
461d8: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
461de: 5280 addql #1,%d0
461e0: 206e 0008 moveal %fp@(8),%a0
461e4: 23c0 0005 e9c8 movel %d0,5e9c8 <_Thread_Dispatch_disable_level>
_Thread_Disable_dispatch();
_CORE_mutex_Surrender(
461ea: 42a7 clrl %sp@-
461ec: 2f28 0008 movel %a0@(8),%sp@-
461f0: 4868 0010 pea %a0@(16)
461f4: 4eb9 0004 6458 jsr 46458 <_CORE_mutex_Surrender>
&the_mutex->Mutex,
the_mutex->Object.id,
NULL
);
_Thread_Enable_dispatch();
461fa: 4fef 000c lea %sp@(12),%sp
}
461fe: 4e5e unlk %fp
_CORE_mutex_Surrender(
&the_mutex->Mutex,
the_mutex->Object.id,
NULL
);
_Thread_Enable_dispatch();
46200: 4ef9 0004 7ac2 jmp 47ac2 <_Thread_Enable_dispatch>
...
000483b0 <_CORE_RWLock_Obtain_for_reading>:
* If unlocked, then OK to read.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
483b0: 203c 0000 0700 movel #1792,%d0
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
483b6: 4e56 ffe8 linkw %fp,#-24
483ba: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
483be: 246e 0008 moveal %fp@(8),%a2
483c2: 282e 000c movel %fp@(12),%d4
483c6: 262e 0014 movel %fp@(20),%d3
483ca: 1a2e 0013 moveb %fp@(19),%d5
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
483ce: 2679 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a3
* If unlocked, then OK to read.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
483d4: 40c2 movew %sr,%d2
483d6: 8082 orl %d2,%d0
483d8: 46c0 movew %d0,%sr
switch ( the_rwlock->current_state ) {
483da: 202a 0044 movel %a2@(68),%d0
483de: 6708 beqs 483e8 <_CORE_RWLock_Obtain_for_reading+0x38>
483e0: 7201 moveq #1,%d1
483e2: b280 cmpl %d0,%d1
483e4: 662a bnes 48410 <_CORE_RWLock_Obtain_for_reading+0x60><== NEVER TAKEN
483e6: 600e bras 483f6 <_CORE_RWLock_Obtain_for_reading+0x46>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
483e8: 7001 moveq #1,%d0
the_rwlock->number_of_readers += 1;
483ea: 52aa 0048 addql #1,%a2@(72)
*/
_ISR_Disable( level );
switch ( the_rwlock->current_state ) {
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
483ee: 2540 0044 movel %d0,%a2@(68)
the_rwlock->number_of_readers += 1;
_ISR_Enable( level );
483f2: 46c2 movew %d2,%sr
483f4: 6014 bras 4840a <_CORE_RWLock_Obtain_for_reading+0x5a>
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
return;
case CORE_RWLOCK_LOCKED_FOR_READING: {
Thread_Control *waiter;
waiter = _Thread_queue_First( &the_rwlock->Wait_queue );
483f6: 2f0a movel %a2,%sp@-
483f8: 4eb9 0004 a254 jsr 4a254 <_Thread_queue_First>
if ( !waiter ) {
483fe: 588f addql #4,%sp
48400: 4a80 tstl %d0
48402: 660c bnes 48410 <_CORE_RWLock_Obtain_for_reading+0x60>
the_rwlock->number_of_readers += 1;
48404: 52aa 0048 addql #1,%a2@(72)
_ISR_Enable( level );
48408: 46c2 movew %d2,%sr
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
4840a: 42ab 0034 clrl %a3@(52)
return;
4840e: 6046 bras 48456 <_CORE_RWLock_Obtain_for_reading+0xa6>
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
48410: 4a05 tstb %d5
48412: 660a bnes 4841e <_CORE_RWLock_Obtain_for_reading+0x6e>
_ISR_Enable( level );
48414: 46c2 movew %d2,%sr
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
48416: 7202 moveq #2,%d1
48418: 2741 0034 movel %d1,%a3@(52)
4841c: 6038 bras 48456 <_CORE_RWLock_Obtain_for_reading+0xa6>
4841e: 7001 moveq #1,%d0
48420: 2540 0030 movel %d0,%a2@(48)
/*
* We need to wait to enter this critical section
*/
_Thread_queue_Enter_critical_section( &the_rwlock->Wait_queue );
executing->Wait.queue = &the_rwlock->Wait_queue;
48424: 274a 0044 movel %a2,%a3@(68)
executing->Wait.id = id;
48428: 2744 0020 movel %d4,%a3@(32)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
4842c: 42ab 0030 clrl %a3@(48)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
48430: 42ab 0034 clrl %a3@(52)
_ISR_Enable( level );
48434: 46c2 movew %d2,%sr
_Thread_queue_Enqueue_with_handler(
48436: 2d43 000c movel %d3,%fp@(12)
4843a: 223c 0004 85a0 movel #296352,%d1
48440: 2d4a 0008 movel %a2,%fp@(8)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
48444: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
executing->Wait.id = id;
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
_ISR_Enable( level );
_Thread_queue_Enqueue_with_handler(
4844a: 2d41 0010 movel %d1,%fp@(16)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
4844e: 4e5e unlk %fp
executing->Wait.id = id;
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
_ISR_Enable( level );
_Thread_queue_Enqueue_with_handler(
48450: 4ef9 0004 9f40 jmp 49f40 <_Thread_queue_Enqueue_with_handler>
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
48456: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
4845c: 4e5e unlk %fp <== NOT EXECUTED
000484ec <_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 );
484ec: 223c 0000 0700 movel #1792,%d1
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
484f2: 4e56 fff0 linkw %fp,#-16
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
484f6: 2079 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a0
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
484fc: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
48500: 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 );
48504: 40c0 movew %sr,%d0
48506: 8280 orl %d0,%d1
48508: 46c1 movew %d1,%sr
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
4850a: 222a 0044 movel %a2@(68),%d1
4850e: 660a bnes 4851a <_CORE_RWLock_Release+0x2e>
_ISR_Enable( level );
48510: 46c0 movew %d0,%sr
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
48512: 7002 moveq #2,%d0
48514: 2140 0034 movel %d0,%a0@(52)
return CORE_RWLOCK_SUCCESSFUL;
48518: 6078 bras 48592 <_CORE_RWLock_Release+0xa6>
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
4851a: 7401 moveq #1,%d2
4851c: b481 cmpl %d1,%d2
4851e: 6610 bnes 48530 <_CORE_RWLock_Release+0x44>
the_rwlock->number_of_readers -= 1;
48520: 222a 0048 movel %a2@(72),%d1
48524: 5381 subql #1,%d1
48526: 2541 0048 movel %d1,%a2@(72)
if ( the_rwlock->number_of_readers != 0 ) {
4852a: 6704 beqs 48530 <_CORE_RWLock_Release+0x44>
/* must be unlocked again */
_ISR_Enable( level );
4852c: 46c0 movew %d0,%sr
return CORE_RWLOCK_SUCCESSFUL;
4852e: 6062 bras 48592 <_CORE_RWLock_Release+0xa6>
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
48530: 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;
48534: 42aa 0044 clrl %a2@(68)
_ISR_Enable( level );
48538: 46c0 movew %d0,%sr
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
4853a: 2f0a movel %a2,%sp@-
4853c: 4eb9 0004 9e00 jsr 49e00 <_Thread_queue_Dequeue>
if ( next ) {
48542: 588f addql #4,%sp
48544: 4a80 tstl %d0
48546: 674a beqs 48592 <_CORE_RWLock_Release+0xa6>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
48548: 7201 moveq #1,%d1
4854a: 2040 moveal %d0,%a0
4854c: b2a8 0030 cmpl %a0@(48),%d1
48550: 6608 bnes 4855a <_CORE_RWLock_Release+0x6e>
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
48552: 7002 moveq #2,%d0
48554: 2540 0044 movel %d0,%a2@(68)
return CORE_RWLOCK_SUCCESSFUL;
48558: 6038 bras 48592 <_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;
4855a: 7201 moveq #1,%d1
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
4855c: 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 );
48560: 49f9 0004 a254 lea 4a254 <_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 );
48566: 47f9 0004 a124 lea 4a124 <_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;
4856c: 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 );
48570: 2f0a movel %a2,%sp@-
48572: 4e94 jsr %a4@
if ( !next ||
48574: 588f addql #4,%sp
48576: 4a80 tstl %d0
48578: 6718 beqs 48592 <_CORE_RWLock_Release+0xa6>
4857a: 7401 moveq #1,%d2
4857c: 2040 moveal %d0,%a0
4857e: b4a8 0030 cmpl %a0@(48),%d2
48582: 670e beqs 48592 <_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;
48584: 52aa 0048 addql #1,%a2@(72)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
48588: 2f00 movel %d0,%sp@-
4858a: 2f0a movel %a2,%sp@-
4858c: 4e93 jsr %a3@
}
4858e: 508f addql #8,%sp
48590: 60de bras 48570 <_CORE_RWLock_Release+0x84>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
48592: 4280 clrl %d0
48594: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
4859a: 4e5e unlk %fp
...
000485a0 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
485a0: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
485a4: 486e fffc pea %fp@(-4)
485a8: 2f2e 0008 movel %fp@(8),%sp@-
485ac: 4eb9 0004 9b38 jsr 49b38 <_Thread_Get>
switch ( location ) {
485b2: 508f addql #8,%sp
485b4: 4aae fffc tstl %fp@(-4)
485b8: 6618 bnes 485d2 <_CORE_RWLock_Timeout+0x32> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
485ba: 2f00 movel %d0,%sp@-
485bc: 4eb9 0004 a354 jsr 4a354 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
485c2: 588f addql #4,%sp
485c4: 2039 0006 161c movel 6161c <_Thread_Dispatch_disable_level>,%d0
485ca: 5380 subql #1,%d0
485cc: 23c0 0006 161c movel %d0,6161c <_Thread_Dispatch_disable_level>
_Thread_Unnest_dispatch();
break;
}
}
485d2: 4e5e unlk %fp
...
0004726c <_CORE_barrier_Wait>:
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
4726c: 203c 0000 0700 movel #1792,%d0
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
47272: 4e56 fff4 linkw %fp,#-12
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
47276: 2279 0006 0416 moveal 60416 <_Per_CPU_Information+0xc>,%a1
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
4727c: 48d7 001c moveml %d2-%d4,%sp@
47280: 206e 0008 moveal %fp@(8),%a0
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
47284: 42a9 0034 clrl %a1@(52)
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
47288: 242e 000c movel %fp@(12),%d2
4728c: 262e 0014 movel %fp@(20),%d3
47290: 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 );
47294: 40c1 movew %sr,%d1
47296: 8081 orl %d1,%d0
47298: 46c0 movew %d0,%sr
the_barrier->number_of_waiting_threads++;
4729a: 2028 0048 movel %a0@(72),%d0
4729e: 5280 addql #1,%d0
472a0: 2140 0048 movel %d0,%a0@(72)
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
472a4: 4aa8 0040 tstl %a0@(64)
472a8: 6626 bnes 472d0 <_CORE_barrier_Wait+0x64>
if ( the_barrier->number_of_waiting_threads ==
472aa: b0a8 0044 cmpl %a0@(68),%d0
472ae: 6620 bnes 472d0 <_CORE_barrier_Wait+0x64>
the_barrier->Attributes.maximum_count) {
executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED;
472b0: 7001 moveq #1,%d0
472b2: 2340 0034 movel %d0,%a1@(52)
_ISR_Enable( level );
472b6: 46c1 movew %d1,%sr
_CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
472b8: 2d44 0010 movel %d4,%fp@(16)
472bc: 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 );
}
472c0: 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 );
472c4: 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 );
}
472c8: 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 );
472ca: 4ef9 0004 bc58 jmp 4bc58 <_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;
472d0: 7001 moveq #1,%d0
472d2: 2140 0030 movel %d0,%a0@(48)
return;
}
}
_Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
executing->Wait.queue = &the_barrier->Wait_queue;
472d6: 2348 0044 movel %a0,%a1@(68)
executing->Wait.id = id;
472da: 2342 0020 movel %d2,%a1@(32)
_ISR_Enable( level );
472de: 46c1 movew %d1,%sr
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
472e0: 2d43 000c movel %d3,%fp@(12)
472e4: 203c 0004 91f4 movel #299508,%d0
472ea: 2d48 0008 movel %a0,%fp@(8)
}
472ee: 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 );
472f2: 2d40 0010 movel %d0,%fp@(16)
}
472f6: 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 );
472f8: 4ef9 0004 8ee0 jmp 48ee0 <_Thread_queue_Enqueue_with_handler>
...
0004e084 <_CORE_message_queue_Initialize>:
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
4e084: 7003 moveq #3,%d0
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
4e086: 4e56 fff4 linkw %fp,#-12
4e08a: 222e 0014 movel %fp@(20),%d1
4e08e: 48d7 040c moveml %d2-%d3/%a2,%sp@
4e092: 246e 0008 moveal %fp@(8),%a2
4e096: 242e 0010 movel %fp@(16),%d2
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
4e09a: c081 andl %d1,%d0
)
{
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
4e09c: 2542 0044 movel %d2,%a2@(68)
the_message_queue->number_of_pending_messages = 0;
4e0a0: 42aa 0048 clrl %a2@(72)
the_message_queue->maximum_message_size = maximum_message_size;
4e0a4: 2541 004c movel %d1,%a2@(76)
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Notify_Handler the_handler,
void *the_argument
)
{
the_message_queue->notify_handler = the_handler;
4e0a8: 42aa 0060 clrl %a2@(96)
the_message_queue->notify_argument = the_argument;
4e0ac: 42aa 0064 clrl %a2@(100)
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
4e0b0: 4a80 tstl %d0
4e0b2: 670e beqs 4e0c2 <_CORE_message_queue_Initialize+0x3e>
allocated_message_size += sizeof(uint32_t);
4e0b4: 2001 movel %d1,%d0
4e0b6: 5880 addql #4,%d0
allocated_message_size &= ~(sizeof(uint32_t) - 1);
4e0b8: 76fc moveq #-4,%d3
4e0ba: c083 andl %d3,%d0
}
if (allocated_message_size < maximum_message_size)
4e0bc: b280 cmpl %d0,%d1
4e0be: 6272 bhis 4e132 <_CORE_message_queue_Initialize+0xae><== NEVER TAKEN
4e0c0: 6002 bras 4e0c4 <_CORE_message_queue_Initialize+0x40>
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
4e0c2: 2001 movel %d1,%d0
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
4e0c4: 2600 movel %d0,%d3
4e0c6: 0683 0000 0014 addil #20,%d3
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
4e0cc: 2203 movel %d3,%d1
4e0ce: 4c02 1800 mulsl %d2,%d1
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
4e0d2: b081 cmpl %d1,%d0
4e0d4: 625c bhis 4e132 <_CORE_message_queue_Initialize+0xae><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
4e0d6: 2f01 movel %d1,%sp@-
4e0d8: 4eb9 0005 0b44 jsr 50b44 <_Workspace_Allocate>
if (the_message_queue->message_buffers == 0)
4e0de: 588f addql #4,%sp
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
4e0e0: 2540 005c movel %d0,%a2@(92)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
4e0e4: 674c beqs 4e132 <_CORE_message_queue_Initialize+0xae>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
4e0e6: 2f03 movel %d3,%sp@-
4e0e8: 2f02 movel %d2,%sp@-
4e0ea: 2f00 movel %d0,%sp@-
4e0ec: 486a 0068 pea %a2@(104)
4e0f0: 4eb9 0005 2d8c jsr 52d8c <_Chain_Initialize>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
4e0f6: 41ea 0054 lea %a2@(84),%a0
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
4e0fa: 7001 moveq #1,%d0
4e0fc: 2548 0050 movel %a0,%a2@(80)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
4e100: 41ea 0050 lea %a2@(80),%a0
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
4e104: 42aa 0054 clrl %a2@(84)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
4e108: 2548 0058 movel %a0,%a2@(88)
4e10c: 4878 0006 pea 6 <EXTENDSFDF>
4e110: 206e 000c moveal %fp@(12),%a0
4e114: 4878 0080 pea 80 <DBL_MANT_DIG+0x4b>
4e118: b090 cmpl %a0@,%d0
4e11a: 57c0 seq %d0
4e11c: 49c0 extbl %d0
4e11e: 4480 negl %d0
4e120: 2f00 movel %d0,%sp@-
4e122: 2f0a movel %a2,%sp@-
4e124: 4eb9 0005 02a0 jsr 502a0 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
4e12a: 4fef 0020 lea %sp@(32),%sp
4e12e: 7001 moveq #1,%d0
4e130: 6002 bras 4e134 <_CORE_message_queue_Initialize+0xb0>
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
return false;
4e132: 4200 clrb %d0
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
4e134: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
4e13a: 4e5e unlk %fp
...
0004e140 <_CORE_message_queue_Seize>:
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
4e140: 223c 0000 0700 movel #1792,%d1
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
4e146: 4e56 ffe0 linkw %fp,#-32
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
4e14a: 2079 0006 7a3a moveal 67a3a <_Per_CPU_Information+0xc>,%a0
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
4e150: 48d7 3c3c moveml %d2-%d5/%a2-%a5,%sp@
4e154: 246e 0008 moveal %fp@(8),%a2
4e158: 262e 000c movel %fp@(12),%d3
4e15c: 2a2e 0010 movel %fp@(16),%d5
4e160: 226e 0014 moveal %fp@(20),%a1
4e164: 242e 001c movel %fp@(28),%d2
4e168: 182e 001b moveb %fp@(27),%d4
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
4e16c: 42a8 0034 clrl %a0@(52)
_ISR_Disable( level );
4e170: 40c0 movew %sr,%d0
4e172: 8280 orl %d0,%d1
4e174: 46c1 movew %d1,%sr
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
4e176: 220a movel %a2,%d1
4e178: 0681 0000 0054 addil #84,%d1
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
4e17e: 266a 0050 moveal %a2@(80),%a3
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
4e182: b28b cmpl %a3,%d1
4e184: 6700 00a6 beqw 4e22c <_CORE_message_queue_Seize+0xec>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
4e188: 2a53 moveal %a3@,%a5
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
4e18a: 49ea 0050 lea %a2@(80),%a4
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
4e18e: 254d 0050 movel %a5,%a2@(80)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
4e192: 2b4c 0004 movel %a4,%a5@(4)
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
4e196: 4a8b tstl %a3
4e198: 6700 0092 beqw 4e22c <_CORE_message_queue_Seize+0xec>
the_message_queue->number_of_pending_messages -= 1;
4e19c: 53aa 0048 subql #1,%a2@(72)
_ISR_Enable( level );
4e1a0: 46c0 movew %d0,%sr
*size_p = the_message->Contents.size;
_Thread_Executing->Wait.count =
4e1a2: 2079 0006 7a3a moveal 67a3a <_Per_CPU_Information+0xc>,%a0
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
_ISR_Enable( level );
*size_p = the_message->Contents.size;
4e1a8: 22ab 000c movel %a3@(12),%a1@
_Thread_Executing->Wait.count =
_CORE_message_queue_Get_message_priority( the_message );
_CORE_message_queue_Copy_buffer(
the_message->Contents.buffer,
4e1ac: 240b movel %a3,%d2
4e1ae: 0682 0000 0010 addil #16,%d2
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
_ISR_Enable( level );
*size_p = the_message->Contents.size;
_Thread_Executing->Wait.count =
4e1b4: 216b 0008 0024 movel %a3@(8),%a0@(36)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
4e1ba: 49f9 0005 55dc lea 555dc <memcpy>,%a4
4e1c0: 2f11 movel %a1@,%sp@-
4e1c2: 2f02 movel %d2,%sp@-
4e1c4: 2f05 movel %d5,%sp@-
4e1c6: 4e94 jsr %a4@
* is not, then we can go ahead and free the buffer.
*
* NOTE: If we note that the queue was not full before this receive,
* then we can avoid this dequeue.
*/
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
4e1c8: 2f0a movel %a2,%sp@-
4e1ca: 4eb9 0004 ff1c jsr 4ff1c <_Thread_queue_Dequeue>
if ( !the_thread ) {
4e1d0: 4fef 0010 lea %sp@(16),%sp
* is not, then we can go ahead and free the buffer.
*
* NOTE: If we note that the queue was not full before this receive,
* then we can avoid this dequeue.
*/
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
4e1d4: 2040 moveal %d0,%a0
if ( !the_thread ) {
4e1d6: 4a80 tstl %d0
4e1d8: 661a bnes 4e1f4 <_CORE_message_queue_Seize+0xb4>
RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
_Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
4e1da: 45ea 0068 lea %a2@(104),%a2
4e1de: 2d4b 000c movel %a3,%fp@(12)
4e1e2: 2d4a 0008 movel %a2,%fp@(8)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
4e1e6: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5
4e1ec: 4e5e unlk %fp
4e1ee: 4ef9 0004 dfc0 jmp 4dfc0 <_Chain_Append>
*/
_CORE_message_queue_Set_message_priority(
the_message,
the_thread->Wait.count
);
the_message->Contents.size = (size_t) the_thread->Wait.option;
4e1f4: 2028 0030 movel %a0@(48),%d0
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
4e1f8: 2768 0024 0008 movel %a0@(36),%a3@(8)
4e1fe: 2740 000c movel %d0,%a3@(12)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
4e202: 2f00 movel %d0,%sp@-
4e204: 2f28 002c movel %a0@(44),%sp@-
4e208: 2f02 movel %d2,%sp@-
4e20a: 4e94 jsr %a4@
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
4e20c: 2d6b 0008 0010 movel %a3@(8),%fp@(16)
4e212: 4fef 000c lea %sp@(12),%sp
4e216: 2d4b 000c movel %a3,%fp@(12)
4e21a: 2d4a 0008 movel %a2,%fp@(8)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
4e21e: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5
4e224: 4e5e unlk %fp
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
4e226: 4ef9 0005 2dd0 jmp 52dd0 <_CORE_message_queue_Insert_message>
return;
}
#endif
}
if ( !wait ) {
4e22c: 4a04 tstb %d4
4e22e: 6612 bnes 4e242 <_CORE_message_queue_Seize+0x102>
_ISR_Enable( level );
4e230: 46c0 movew %d0,%sr
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
4e232: 7004 moveq #4,%d0
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
4e234: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5
#endif
}
if ( !wait ) {
_ISR_Enable( level );
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
4e23a: 2140 0034 movel %d0,%a0@(52)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
4e23e: 4e5e unlk %fp
4e240: 4e75 rts
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
4e242: 7201 moveq #1,%d1
4e244: 2541 0030 movel %d1,%a2@(48)
}
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
executing->Wait.id = id;
executing->Wait.return_argument_second.mutable_object = buffer;
4e248: 2145 002c movel %d5,%a0@(44)
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
return;
}
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
4e24c: 214a 0044 movel %a2,%a0@(68)
executing->Wait.id = id;
4e250: 2143 0020 movel %d3,%a0@(32)
executing->Wait.return_argument_second.mutable_object = buffer;
executing->Wait.return_argument = size_p;
4e254: 2149 0028 movel %a1,%a0@(40)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
4e258: 46c0 movew %d0,%sr
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
4e25a: 49f9 0005 0370 lea 50370 <_Thread_queue_Timeout>,%a4
4e260: 2d42 000c movel %d2,%fp@(12)
4e264: 2d4c 0010 movel %a4,%fp@(16)
4e268: 2d4a 0008 movel %a2,%fp@(8)
}
4e26c: 4cee 3c3c ffe0 moveml %fp@(-32),%d2-%d5/%a2-%a5
4e272: 4e5e unlk %fp
executing->Wait.return_argument_second.mutable_object = buffer;
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
4e274: 4ef9 0005 005c jmp 5005c <_Thread_queue_Enqueue_with_handler>
...
000463b4 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
463b4: 4e56 0000 linkw %fp,#0
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
463b8: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
463be: 2f0a movel %a2,%sp@-
463c0: 246e 0008 moveal %fp@(8),%a2
463c4: 2f02 movel %d2,%sp@-
463c6: 142e 0013 moveb %fp@(19),%d2
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
463ca: 4a80 tstl %d0
463cc: 671c beqs 463ea <_CORE_mutex_Seize+0x36>
463ce: 4a02 tstb %d2
463d0: 6718 beqs 463ea <_CORE_mutex_Seize+0x36> <== NEVER TAKEN
463d2: 7001 moveq #1,%d0
463d4: b0b9 0005 eb14 cmpl 5eb14 <_System_state_Current>,%d0
463da: 640e bccs 463ea <_CORE_mutex_Seize+0x36>
463dc: 4878 0012 pea 12 <INVALID_OPERATION+0x2>
463e0: 42a7 clrl %sp@-
463e2: 42a7 clrl %sp@-
463e4: 4eb9 0004 6a08 jsr 46a08 <_Internal_error_Occurred>
463ea: 486e 0018 pea %fp@(24)
463ee: 2f0a movel %a2,%sp@-
463f0: 4eb9 0004 ac50 jsr 4ac50 <_CORE_mutex_Seize_interrupt_trylock>
463f6: 508f addql #8,%sp
463f8: 4a80 tstl %d0
463fa: 6750 beqs 4644c <_CORE_mutex_Seize+0x98>
463fc: 4a02 tstb %d2
463fe: 6614 bnes 46414 <_CORE_mutex_Seize+0x60>
46400: 202e 0018 movel %fp@(24),%d0
46404: 46c0 movew %d0,%sr
46406: 2079 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a0
4640c: 7001 moveq #1,%d0
4640e: 2140 0034 movel %d0,%a0@(52)
46412: 6038 bras 4644c <_CORE_mutex_Seize+0x98>
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;
46414: 7001 moveq #1,%d0
46416: 2079 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a0
4641c: 2540 0030 movel %d0,%a2@(48)
46420: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
46426: 5280 addql #1,%d0
46428: 216e 000c 0020 movel %fp@(12),%a0@(32)
4642e: 214a 0044 movel %a2,%a0@(68)
46432: 23c0 0005 e9c8 movel %d0,5e9c8 <_Thread_Dispatch_disable_level>
46438: 202e 0018 movel %fp@(24),%d0
4643c: 46c0 movew %d0,%sr
4643e: 2f2e 0014 movel %fp@(20),%sp@-
46442: 2f0a movel %a2,%sp@-
46444: 4eb9 0004 6350 jsr 46350 <_CORE_mutex_Seize_interrupt_blocking>
4644a: 508f addql #8,%sp
}
4644c: 242e fff8 movel %fp@(-8),%d2
46450: 246e fffc moveal %fp@(-4),%a2
46454: 4e5e unlk %fp <== NOT EXECUTED
00046590 <_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
)
{
46590: 4e56 0000 linkw %fp,#0
46594: 2f0a movel %a2,%sp@-
46596: 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)) ) {
4659a: 2f0a movel %a2,%sp@-
4659c: 4eb9 0004 7db0 jsr 47db0 <_Thread_queue_Dequeue>
465a2: 588f addql #4,%sp
465a4: 4a80 tstl %d0
465a6: 6624 bnes 465cc <_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 );
465a8: 303c 0700 movew #1792,%d0
465ac: 40c1 movew %sr,%d1
465ae: 8081 orl %d1,%d0
465b0: 46c0 movew %d0,%sr
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
465b2: 202a 0048 movel %a2@(72),%d0
465b6: b0aa 0040 cmpl %a2@(64),%d0
465ba: 640a bccs 465c6 <_CORE_semaphore_Surrender+0x36> <== NEVER TAKEN
the_semaphore->count += 1;
465bc: 5280 addql #1,%d0
465be: 2540 0048 movel %d0,%a2@(72)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
465c2: 4280 clrl %d0
465c4: 6002 bras 465c8 <_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;
465c6: 7004 moveq #4,%d0 <== NOT EXECUTED
_ISR_Enable( level );
465c8: 46c1 movew %d1,%sr
465ca: 6002 bras 465ce <_CORE_semaphore_Surrender+0x3e>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
465cc: 4280 clrl %d0
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
465ce: 246e fffc moveal %fp@(-4),%a2
465d2: 4e5e unlk %fp
...
00045458 <_Event_Surrender>:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
45458: 203c 0000 0700 movel #1792,%d0
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
4545e: 4e56 ffe8 linkw %fp,#-24
45462: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
45466: 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 ];
4546a: 206a 00fe moveal %a2@(254),%a0
option_set = (rtems_option) the_thread->Wait.option;
4546e: 282a 0030 movel %a2@(48),%d4
_ISR_Disable( level );
45472: 40c1 movew %sr,%d1
45474: 8081 orl %d1,%d0
45476: 46c0 movew %d0,%sr
pending_events = api->pending_events;
event_condition = (rtems_event_set) the_thread->Wait.count;
45478: 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 );
4547c: 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;
4547e: 2410 movel %a0@,%d2
45480: 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 ) ) {
45482: 6606 bnes 4548a <_Event_Surrender+0x32>
_ISR_Enable( level );
45484: 46c1 movew %d1,%sr
return;
45486: 6000 00ca braw 45552 <_Event_Surrender+0xfa>
/*
* 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() &&
4548a: 4ab9 0005 ee2e tstl 5ee2e <_Per_CPU_Information+0x8>
45490: 674a beqs 454dc <_Event_Surrender+0x84>
45492: b5f9 0005 ee32 cmpal 5ee32 <_Per_CPU_Information+0xc>,%a2
45498: 6642 bnes 454dc <_Event_Surrender+0x84>
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
4549a: 2279 0005 f204 moveal 5f204 <_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 ) &&
454a0: 7a02 moveq #2,%d5
454a2: ba89 cmpl %a1,%d5
454a4: 670e beqs 454b4 <_Event_Surrender+0x5c> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
454a6: 2279 0005 f204 moveal 5f204 <_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) ||
454ac: 1a3c 0001 moveb #1,%d5
454b0: ba89 cmpl %a1,%d5
454b2: 6628 bnes 454dc <_Event_Surrender+0x84>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
454b4: b680 cmpl %d0,%d3
454b6: 6706 beqs 454be <_Event_Surrender+0x66>
454b8: 0804 0001 btst #1,%d4
454bc: 671a beqs 454d8 <_Event_Surrender+0x80> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
454be: 2600 movel %d0,%d3
454c0: 4683 notl %d3
454c2: c682 andl %d2,%d3
454c4: 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;
454c6: 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;
454ca: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
454ce: 2080 movel %d0,%a0@
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
454d0: 7003 moveq #3,%d0
454d2: 23c0 0005 f204 movel %d0,5f204 <_Event_Sync_state>
}
_ISR_Enable( level );
454d8: 46c1 movew %d1,%sr
return;
454da: 6076 bras 45552 <_Event_Surrender+0xfa>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
454dc: 2a2a 0010 movel %a2@(16),%d5
454e0: 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 ) ) {
454e6: 6768 beqs 45550 <_Event_Surrender+0xf8>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
454e8: b680 cmpl %d0,%d3
454ea: 6706 beqs 454f2 <_Event_Surrender+0x9a>
454ec: 0804 0001 btst #1,%d4
454f0: 675e beqs 45550 <_Event_Surrender+0xf8> <== NEVER TAKEN
454f2: 2600 movel %d0,%d3
454f4: 4683 notl %d3
454f6: c682 andl %d2,%d3
454f8: 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;
454fa: 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;
454fe: 42aa 0024 clrl %a2@(36)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
45502: 2080 movel %d0,%a0@
_ISR_Flash( level );
45504: 203c 0000 0700 movel #1792,%d0
4550a: 46c1 movew %d1,%sr
4550c: 8081 orl %d1,%d0
4550e: 46c0 movew %d0,%sr
45510: 47f9 0004 7780 lea 47780 <_Thread_Clear_state>,%a3
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
45516: 7a02 moveq #2,%d5
45518: baaa 0050 cmpl %a2@(80),%d5
4551c: 6710 beqs 4552e <_Event_Surrender+0xd6>
_ISR_Enable( level );
4551e: 46c1 movew %d1,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
45520: 2f3c 1003 fff8 movel #268697592,%sp@-
45526: 2f0a movel %a2,%sp@-
45528: 4e93 jsr %a3@
4552a: 508f addql #8,%sp
4552c: 6024 bras 45552 <_Event_Surrender+0xfa>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
4552e: 7003 moveq #3,%d0
45530: 2540 0050 movel %d0,%a2@(80)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
45534: 46c1 movew %d1,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
45536: 486a 0048 pea %a2@(72)
4553a: 4eb9 0004 8880 jsr 48880 <_Watchdog_Remove>
45540: 2f3c 1003 fff8 movel #268697592,%sp@-
45546: 2f0a movel %a2,%sp@-
45548: 4e93 jsr %a3@
4554a: 4fef 000c lea %sp@(12),%sp
4554e: 6002 bras 45552 <_Event_Surrender+0xfa>
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
45550: 46c1 movew %d1,%sr
}
45552: 4cee 0c3c ffe8 moveml %fp@(-24),%d2-%d5/%a2-%a3
45558: 4e5e unlk %fp <== NOT EXECUTED
0004555c <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
4555c: 4e56 fffc linkw %fp,#-4
45560: 2f03 movel %d3,%sp@-
45562: 2f02 movel %d2,%sp@-
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
45564: 486e fffc pea %fp@(-4)
45568: 2f2e 0008 movel %fp@(8),%sp@-
4556c: 4eb9 0004 7ae8 jsr 47ae8 <_Thread_Get>
switch ( location ) {
45572: 508f addql #8,%sp
45574: 4aae fffc tstl %fp@(-4)
45578: 6656 bnes 455d0 <_Event_Timeout+0x74> <== NEVER TAKEN
*
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
_ISR_Disable( level );
4557a: 223c 0000 0700 movel #1792,%d1
45580: 40c2 movew %sr,%d2
45582: 8282 orl %d2,%d1
45584: 46c1 movew %d1,%sr
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
45586: 2040 moveal %d0,%a0
45588: 42a8 0024 clrl %a0@(36)
if ( _Thread_Is_executing( the_thread ) ) {
4558c: b0b9 0005 ee32 cmpl 5ee32 <_Per_CPU_Information+0xc>,%d0
45592: 6614 bnes 455a8 <_Event_Timeout+0x4c>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
45594: 2239 0005 f204 movel 5f204 <_Event_Sync_state>,%d1
4559a: 7601 moveq #1,%d3
4559c: b681 cmpl %d1,%d3
4559e: 6608 bnes 455a8 <_Event_Timeout+0x4c>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
455a0: 7202 moveq #2,%d1
455a2: 23c1 0005 f204 movel %d1,5f204 <_Event_Sync_state>
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
455a8: 7606 moveq #6,%d3
455aa: 2040 moveal %d0,%a0
455ac: 2143 0034 movel %d3,%a0@(52)
_ISR_Enable( level );
455b0: 46c2 movew %d2,%sr
455b2: 2f3c 1003 fff8 movel #268697592,%sp@-
455b8: 2f00 movel %d0,%sp@-
455ba: 4eb9 0004 7780 jsr 47780 <_Thread_Clear_state>
_Thread_Unblock( the_thread );
_Thread_Unnest_dispatch();
break;
455c0: 508f addql #8,%sp
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
455c2: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
455c8: 5380 subql #1,%d0
455ca: 23c0 0005 e9c8 movel %d0,5e9c8 <_Thread_Dispatch_disable_level>
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
455d0: 242e fff4 movel %fp@(-12),%d2
455d4: 262e fff8 movel %fp@(-8),%d3
455d8: 4e5e unlk %fp <== NOT EXECUTED
0004b228 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
4b228: 4e56 ffcc linkw %fp,#-52
4b22c: 202e 0010 movel %fp@(16),%d0
4b230: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4b234: 246e 0008 moveal %fp@(8),%a2
4b238: 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;
4b23c: 2403 movel %d3,%d2
4b23e: d480 addl %d0,%d2
uintptr_t const free_size = stats->free_size;
4b240: 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;
4b244: 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;
4b248: 2a2a 0010 movel %a2@(16),%d5
uintptr_t const min_block_size = heap->min_block_size;
4b24c: 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;
4b250: 42ae fffc clrl %fp@(-4)
Heap_Block *extend_last_block = NULL;
4b254: 42ae fff8 clrl %fp@(-8)
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;
4b258: 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 ) {
4b25c: b682 cmpl %d2,%d3
4b25e: 6200 01aa bhiw 4b40a <_Heap_Extend+0x1e2>
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
4b262: 486e fff8 pea %fp@(-8)
4b266: 486e fffc pea %fp@(-4)
4b26a: 2f01 movel %d1,%sp@-
4b26c: 2f05 movel %d5,%sp@-
4b26e: 2f00 movel %d0,%sp@-
4b270: 2f03 movel %d3,%sp@-
4b272: 4eb9 0004 6ac6 jsr 46ac6 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
4b278: 4fef 0018 lea %sp@(24),%sp
4b27c: 4a00 tstb %d0
4b27e: 6700 018a beqw 4b40a <_Heap_Extend+0x1e2>
4b282: 2044 moveal %d4,%a0
4b284: 9bcd subal %a5,%a5
4b286: 4281 clrl %d1
4b288: 97cb subal %a3,%a3
4b28a: 99cc subal %a4,%a4
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
4b28c: b888 cmpl %a0,%d4
4b28e: 6704 beqs 4b294 <_Heap_Extend+0x6c>
4b290: 2248 moveal %a0,%a1
4b292: 6004 bras 4b298 <_Heap_Extend+0x70>
4b294: 226a 0018 moveal %a2@(24),%a1
uintptr_t const sub_area_end = start_block->prev_size;
4b298: 2010 movel %a0@,%d0
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
4b29a: b680 cmpl %d0,%d3
4b29c: 6406 bccs 4b2a4 <_Heap_Extend+0x7c>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
4b29e: b3c2 cmpal %d2,%a1
4b2a0: 6500 0168 bcsw 4b40a <_Heap_Extend+0x1e2>
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
4b2a4: b3c2 cmpal %d2,%a1
4b2a6: 6706 beqs 4b2ae <_Heap_Extend+0x86>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
4b2a8: b082 cmpl %d2,%d0
4b2aa: 6206 bhis 4b2b2 <_Heap_Extend+0x8a>
4b2ac: 6006 bras 4b2b4 <_Heap_Extend+0x8c>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
4b2ae: 2848 moveal %a0,%a4
4b2b0: 6002 bras 4b2b4 <_Heap_Extend+0x8c>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
4b2b2: 2208 movel %a0,%d1
4b2b4: 2e00 movel %d0,%d7
4b2b6: 2240 moveal %d0,%a1
4b2b8: 5189 subql #8,%a1
4b2ba: 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);
4b2be: 93c6 subal %d6,%a1
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
4b2c0: b680 cmpl %d0,%d3
4b2c2: 6606 bnes 4b2ca <_Heap_Extend+0xa2>
start_block->prev_size = extend_area_end;
4b2c4: 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 )
4b2c6: 2649 moveal %a1,%a3
4b2c8: 6006 bras 4b2d0 <_Heap_Extend+0xa8>
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
4b2ca: b680 cmpl %d0,%d3
4b2cc: 6302 blss 4b2d0 <_Heap_Extend+0xa8>
4b2ce: 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;
4b2d0: 70fe moveq #-2,%d0
4b2d2: 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);
4b2d6: 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 );
4b2da: b888 cmpl %a0,%d4
4b2dc: 66ae bnes 4b28c <_Heap_Extend+0x64>
if ( extend_area_begin < heap->area_begin ) {
4b2de: b6aa 0018 cmpl %a2@(24),%d3
4b2e2: 6406 bccs 4b2ea <_Heap_Extend+0xc2>
heap->area_begin = extend_area_begin;
4b2e4: 2543 0018 movel %d3,%a2@(24)
4b2e8: 600a bras 4b2f4 <_Heap_Extend+0xcc>
} else if ( heap->area_end < extend_area_end ) {
4b2ea: b4aa 001c cmpl %a2@(28),%d2
4b2ee: 6304 blss 4b2f4 <_Heap_Extend+0xcc>
heap->area_end = extend_area_end;
4b2f0: 2542 001c movel %d2,%a2@(28)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
4b2f4: 206e fff8 moveal %fp@(-8),%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 =
4b2f8: 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;
4b2fa: 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;
4b2fc: 226e fffc moveal %fp@(-4),%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 =
4b300: 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;
4b302: 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;
4b304: 2282 movel %d2,%a1@
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
4b306: 2344 0004 movel %d4,%a1@(4)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
4b30a: 2080 movel %d0,%a0@
extend_last_block->size_and_flag = 0;
4b30c: 42a8 0004 clrl %a0@(4)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
4b310: b3ea 0020 cmpal %a2@(32),%a1
4b314: 6406 bccs 4b31c <_Heap_Extend+0xf4>
heap->first_block = extend_first_block;
4b316: 2549 0020 movel %a1,%a2@(32)
4b31a: 600a bras 4b326 <_Heap_Extend+0xfe>
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
4b31c: b1ea 0024 cmpal %a2@(36),%a0
4b320: 6304 blss 4b326 <_Heap_Extend+0xfe>
heap->last_block = extend_last_block;
4b322: 2548 0024 movel %a0,%a2@(36)
}
if ( merge_below_block != NULL ) {
4b326: 4a8c tstl %a4
4b328: 6732 beqs 4b35c <_Heap_Extend+0x134>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
4b32a: 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 );
4b32e: 5083 addql #8,%d3
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
4b330: 2803 movel %d3,%d4
4b332: 4c40 4001 remul %d0,%d1,%d4
if ( remainder != 0 ) {
4b336: 4a81 tstl %d1
4b338: 6704 beqs 4b33e <_Heap_Extend+0x116>
return value - remainder + alignment;
4b33a: d680 addl %d0,%d3
4b33c: 9681 subl %d1,%d3
uintptr_t const new_first_block_begin =
4b33e: 2043 moveal %d3,%a0
4b340: 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 =
4b342: 200c movel %a4,%d0
4b344: 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;
4b346: 7201 moveq #1,%d1
4b348: 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;
4b34a: 2094 movel %a4@,%a0@
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
4b34c: 2141 0004 movel %d1,%a0@(4)
_Heap_Free_block( heap, new_first_block );
4b350: 2f08 movel %a0,%sp@-
4b352: 2f0a movel %a2,%sp@-
4b354: 4eba feb6 jsr %pc@(4b20c <_Heap_Free_block>)
4b358: 508f addql #8,%sp
4b35a: 6012 bras 4b36e <_Heap_Extend+0x146>
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 ) {
4b35c: 4a81 tstl %d1
4b35e: 670e beqs 4b36e <_Heap_Extend+0x146>
_Heap_Link_below(
4b360: 206e fff8 moveal %fp@(-8),%a0
{
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;
4b364: 7801 moveq #1,%d4
4b366: 9288 subl %a0,%d1
4b368: 8881 orl %d1,%d4
4b36a: 2144 0004 movel %d4,%a0@(4)
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
4b36e: 4a8b tstl %a3
4b370: 6734 beqs 4b3a6 <_Heap_Extend+0x17e>
)
{
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,
4b372: 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(
4b374: 948b subl %a3,%d2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
4b376: 2202 movel %d2,%d1
4b378: 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;
4b37e: 7201 moveq #1,%d1
4b380: 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)
4b382: 202b 0004 movel %a3@(4),%d0
4b386: 9082 subl %d2,%d0
| HEAP_PREV_BLOCK_USED;
4b388: 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;
4b38a: 7001 moveq #1,%d0
4b38c: 2781 2804 movel %d1,%a3@(00000004,%d2:l)
4b390: c0ab 0004 andl %a3@(4),%d0
block->size_and_flag = size | flag;
4b394: 8480 orl %d0,%d2
4b396: 2742 0004 movel %d2,%a3@(4)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
4b39a: 2f0b movel %a3,%sp@-
4b39c: 2f0a movel %a2,%sp@-
4b39e: 4eba fe6c jsr %pc@(4b20c <_Heap_Free_block>)
4b3a2: 508f addql #8,%sp
4b3a4: 6020 bras 4b3c6 <_Heap_Extend+0x19e>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
4b3a6: 4a8d tstl %a5
4b3a8: 671c beqs 4b3c6 <_Heap_Extend+0x19e>
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;
4b3aa: 7001 moveq #1,%d0
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
4b3ac: 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 );
4b3ae: 222e fffc movel %fp@(-4),%d1
4b3b2: 928d subl %a5,%d1
4b3b4: c0ad 0004 andl %a5@(4),%d0
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
4b3b8: 206e fff8 moveal %fp@(-8),%a0
block->size_and_flag = size | flag;
4b3bc: 8280 orl %d0,%d1
4b3be: 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;
4b3c2: 89a8 0004 orl %d4,%a0@(4)
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
4b3c6: 4a8c tstl %a4
4b3c8: 6610 bnes 4b3da <_Heap_Extend+0x1b2>
4b3ca: 4a8b tstl %a3
4b3cc: 660c bnes 4b3da <_Heap_Extend+0x1b2>
_Heap_Free_block( heap, extend_first_block );
4b3ce: 2f2e fffc movel %fp@(-4),%sp@-
4b3d2: 2f0a movel %a2,%sp@-
4b3d4: 4eba fe36 jsr %pc@(4b20c <_Heap_Free_block>)
4b3d8: 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
4b3da: 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;
4b3de: 7001 moveq #1,%d0
* 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(
4b3e0: 222a 0020 movel %a2@(32),%d1
4b3e4: 9288 subl %a0,%d1
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4b3e6: c0a8 0004 andl %a0@(4),%d0
block->size_and_flag = size | flag;
4b3ea: 8280 orl %d0,%d1
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
4b3ec: 202a 0030 movel %a2@(48),%d0
4b3f0: 90ae fff4 subl %fp@(-12),%d0
4b3f4: 2141 0004 movel %d1,%a0@(4)
/* Statistics */
stats->size += extended_size;
4b3f8: d1aa 002c addl %d0,%a2@(44)
if ( extended_size_ptr != NULL )
4b3fc: 4aae 0014 tstl %fp@(20)
4b400: 670c beqs 4b40e <_Heap_Extend+0x1e6> <== NEVER TAKEN
*extended_size_ptr = extended_size;
4b402: 206e 0014 moveal %fp@(20),%a0
4b406: 2080 movel %d0,%a0@
4b408: 6004 bras 4b40e <_Heap_Extend+0x1e6>
_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;
4b40a: 4200 clrb %d0
4b40c: 6002 bras 4b410 <_Heap_Extend+0x1e8>
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
4b40e: 7001 moveq #1,%d0
}
4b410: 4cee 3cfc ffcc moveml %fp@(-52),%d2-%d7/%a2-%a5
4b416: 4e5e unlk %fp
...
0004af2c <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
4af2c: 4e56 ffe8 linkw %fp,#-24
4af30: 206e 0008 moveal %fp@(8),%a0
4af34: 48d7 0c3c moveml %d2-%d5/%a2-%a3,%sp@
4af38: 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 ) {
4af3c: 6700 0150 beqw 4b08e <_Heap_Free+0x162>
4af40: 2240 moveal %d0,%a1
4af42: 5189 subql #8,%a1
4af44: 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
4af4a: 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);
4af4e: 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;
4af50: b889 cmpl %a1,%d4
4af52: 620c bhis 4af60 <_Heap_Free+0x34>
4af54: b3e8 0024 cmpal %a0@(36),%a1
4af58: 53c0 sls %d0
4af5a: 49c0 extbl %d0
4af5c: 4480 negl %d0
4af5e: 6002 bras 4af62 <_Heap_Free+0x36>
4af60: 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 ) ) {
4af62: 4a00 tstb %d0
4af64: 6700 012c beqw 4b092 <_Heap_Free+0x166>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4af68: 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;
4af6c: 70fe moveq #-2,%d0
4af6e: 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);
4af70: 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;
4af74: b88a cmpl %a2,%d4
4af76: 620c bhis 4af84 <_Heap_Free+0x58> <== NEVER TAKEN
4af78: b5e8 0024 cmpal %a0@(36),%a2
4af7c: 53c1 sls %d1
4af7e: 49c1 extbl %d1
4af80: 4481 negl %d1
4af82: 6002 bras 4af86 <_Heap_Free+0x5a>
4af84: 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 ) ) {
4af86: 4a01 tstb %d1
4af88: 6700 0108 beqw 4b092 <_Heap_Free+0x166>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4af8c: 242a 0004 movel %a2@(4),%d2
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
4af90: 0802 0000 btst #0,%d2
4af94: 6700 00fc beqw 4b092 <_Heap_Free+0x166>
- 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;
4af98: 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
4af9a: 2668 0024 moveal %a0@(36),%a3
4af9e: c481 andl %d1,%d2
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
4afa0: b7ca cmpal %a2,%a3
4afa2: 670c beqs 4afb0 <_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;
4afa4: 7201 moveq #1,%d1
4afa6: c2b2 2804 andl %a2@(00000004,%d2:l),%d1
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
4afaa: 5381 subql #1,%d1
4afac: 4481 negl %d1
4afae: 6002 bras 4afb2 <_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 ));
4afb0: 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
4afb2: 1a01 moveb %d1,%d5
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
4afb4: 0803 0000 btst #0,%d3
4afb8: 6662 bnes 4b01c <_Heap_Free+0xf0>
uintptr_t const prev_size = block->prev_size;
4afba: 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);
4afbc: 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;
4afbe: b889 cmpl %a1,%d4
4afc0: 620a bhis 4afcc <_Heap_Free+0xa0> <== NEVER TAKEN
4afc2: b3cb cmpal %a3,%a1
4afc4: 53c1 sls %d1
4afc6: 49c1 extbl %d1
4afc8: 4481 negl %d1
4afca: 6002 bras 4afce <_Heap_Free+0xa2>
4afcc: 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 ) ) {
4afce: 4a01 tstb %d1
4afd0: 6700 00c0 beqw 4b092 <_Heap_Free+0x166>
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;
4afd4: 7201 moveq #1,%d1
4afd6: 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) ) {
4afda: 6700 00b6 beqw 4b092 <_Heap_Free+0x166>
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
4afde: 4a05 tstb %d5
4afe0: 6726 beqs 4b008 <_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;
4afe2: 266a 0008 moveal %a2@(8),%a3
uintptr_t const size = block_size + prev_size + next_block_size;
4afe6: d480 addl %d0,%d2
4afe8: d682 addl %d2,%d3
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4afea: 7401 moveq #1,%d2
Heap_Block *prev = block->prev;
4afec: 246a 000c moveal %a2@(12),%a2
prev->next = next;
4aff0: 254b 0008 movel %a3,%a2@(8)
4aff4: 8483 orl %d3,%d2
next->prev = prev;
4aff6: 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;
4affa: 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;
4affe: 2383 3800 movel %d3,%a1@(00000000,%d3:l)
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4b002: 2342 0004 movel %d2,%a1@(4)
4b006: 607a bras 4b082 <_Heap_Free+0x156>
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;
4b008: d680 addl %d0,%d3
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4b00a: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b00c: 74fe moveq #-2,%d2
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;
4b00e: 8283 orl %d3,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
4b010: 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;
4b012: 2341 0004 movel %d1,%a1@(4)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b016: c5aa 0004 andl %d2,%a2@(4)
4b01a: 6066 bras 4b082 <_Heap_Free+0x156>
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
4b01c: 4a01 tstb %d1
4b01e: 672a beqs 4b04a <_Heap_Free+0x11e>
RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
Heap_Block *old_block,
Heap_Block *new_block
)
{
Heap_Block *next = old_block->next;
4b020: 266a 0008 moveal %a2@(8),%a3
uintptr_t const size = block_size + next_block_size;
4b024: 2202 movel %d2,%d1
4b026: d280 addl %d0,%d1
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
4b028: 7401 moveq #1,%d2
Heap_Block *prev = old_block->prev;
4b02a: 246a 000c moveal %a2@(12),%a2
new_block->next = next;
4b02e: 234b 0008 movel %a3,%a1@(8)
4b032: 8481 orl %d1,%d2
new_block->prev = prev;
4b034: 234a 000c movel %a2,%a1@(12)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
4b038: 2381 1800 movel %d1,%a1@(00000000,%d1:l)
next->prev = new_block;
4b03c: 2749 000c movel %a1,%a3@(12)
prev->next = new_block;
4b040: 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;
4b044: 2342 0004 movel %d2,%a1@(4)
4b048: 6038 bras 4b082 <_Heap_Free+0x156>
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;
4b04a: 7201 moveq #1,%d1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
4b04c: 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;
4b04e: 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;
4b050: 2668 0008 moveal %a0@(8),%a3
new_block->next = next;
new_block->prev = block_before;
4b054: 2348 000c movel %a0,%a1@(12)
4b058: 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;
4b05c: 2228 0038 movel %a0@(56),%d1
4b060: 5281 addql #1,%d1
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
4b062: 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;
4b066: c5aa 0004 andl %d2,%a2@(4)
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
4b06a: 2749 000c movel %a1,%a3@(12)
next_block->prev_size = block_size;
4b06e: 2480 movel %d0,%a2@
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
4b070: 2149 0008 movel %a1,%a0@(8)
/* Statistics */
++stats->free_blocks;
4b074: 2141 0038 movel %d1,%a0@(56)
if ( stats->max_free_blocks < stats->free_blocks ) {
4b078: b2a8 003c cmpl %a0@(60),%d1
4b07c: 6304 blss 4b082 <_Heap_Free+0x156>
stats->max_free_blocks = stats->free_blocks;
4b07e: 2141 003c movel %d1,%a0@(60)
}
}
/* Statistics */
--stats->used_blocks;
4b082: 53a8 0040 subql #1,%a0@(64)
++stats->frees;
4b086: 52a8 0050 addql #1,%a0@(80)
stats->free_size += block_size;
4b08a: 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;
4b08e: 7001 moveq #1,%d0
4b090: 6002 bras 4b094 <_Heap_Free+0x168>
/* 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 );
4b092: 4200 clrb %d0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
4b094: 4cd7 0c3c moveml %sp@,%d2-%d5/%a2-%a3
4b098: 4e5e unlk %fp <== NOT EXECUTED
0005b188 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
5b188: 4e56 0000 linkw %fp,#0
5b18c: 202e 000c movel %fp@(12),%d0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
5b190: 2040 moveal %d0,%a0
5b192: 5188 subql #8,%a0
5b194: 226e 0008 moveal %fp@(8),%a1
5b198: 2f02 movel %d2,%sp@-
5b19a: 2400 movel %d0,%d2
5b19c: 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
5b1a2: 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);
5b1a6: 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;
5b1a8: b488 cmpl %a0,%d2
5b1aa: 620c bhis 5b1b8 <_Heap_Size_of_alloc_area+0x30>
5b1ac: b1e9 0024 cmpal %a1@(36),%a0
5b1b0: 53c1 sls %d1
5b1b2: 49c1 extbl %d1
5b1b4: 4481 negl %d1
5b1b6: 6002 bras 5b1ba <_Heap_Size_of_alloc_area+0x32>
5b1b8: 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 ) ) {
5b1ba: 4a01 tstb %d1
5b1bc: 6738 beqs 5b1f6 <_Heap_Size_of_alloc_area+0x6e>
- 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;
5b1be: 72fe moveq #-2,%d1
5b1c0: 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);
5b1c4: d1c1 addal %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;
5b1c6: b488 cmpl %a0,%d2
5b1c8: 620c bhis 5b1d6 <_Heap_Size_of_alloc_area+0x4e> <== NEVER TAKEN
5b1ca: b1e9 0024 cmpal %a1@(36),%a0
5b1ce: 53c1 sls %d1
5b1d0: 49c1 extbl %d1
5b1d2: 4481 negl %d1
5b1d4: 6002 bras 5b1d8 <_Heap_Size_of_alloc_area+0x50>
5b1d6: 4281 clrl %d1 <== NOT EXECUTED
}
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
5b1d8: 4a01 tstb %d1
5b1da: 671a beqs 5b1f6 <_Heap_Size_of_alloc_area+0x6e> <== 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;
5b1dc: 7201 moveq #1,%d1
5b1de: c2a8 0004 andl %a0@(4),%d1
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
5b1e2: 6712 beqs 5b1f6 <_Heap_Size_of_alloc_area+0x6e> <== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
5b1e4: 7204 moveq #4,%d1
5b1e6: 9280 subl %d0,%d1
5b1e8: 2001 movel %d1,%d0
5b1ea: d088 addl %a0,%d0
5b1ec: 226e 0010 moveal %fp@(16),%a1
5b1f0: 2280 movel %d0,%a1@
return true;
5b1f2: 7001 moveq #1,%d0
5b1f4: 6002 bras 5b1f8 <_Heap_Size_of_alloc_area+0x70>
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
5b1f6: 4200 clrb %d0
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
5b1f8: 241f movel %sp@+,%d2
5b1fa: 4e5e unlk %fp
...
00047426 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
47426: 4e56 ffd0 linkw %fp,#-48
4742a: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
4742e: 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;
47432: 45fa ffac lea %pc@(473e0 <_Heap_Walk_print_nothing>),%a2
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
47436: 242e 000c movel %fp@(12),%d2
uintptr_t const page_size = heap->page_size;
4743a: 282b 0010 movel %a3@(16),%d4
uintptr_t const min_block_size = heap->min_block_size;
4743e: 2a2b 0014 movel %a3@(20),%d5
Heap_Block *const first_block = heap->first_block;
47442: 2c2b 0020 movel %a3@(32),%d6
Heap_Block *const last_block = heap->last_block;
47446: 2e2b 0024 movel %a3@(36),%d7
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
4744a: 4a2e 0013 tstb %fp@(19)
4744e: 6704 beqs 47454 <_Heap_Walk+0x2e>
47450: 45fa ff96 lea %pc@(473e8 <_Heap_Walk_print>),%a2
if ( !_System_state_Is_up( _System_state_Get() ) ) {
47454: 7003 moveq #3,%d0
47456: b0b9 0006 0ebc cmpl 60ebc <_System_state_Current>,%d0
4745c: 6600 02fc bnew 4775a <_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)(
47460: 2f2b 000c movel %a3@(12),%sp@-
47464: 2f2b 0008 movel %a3@(8),%sp@-
47468: 2f07 movel %d7,%sp@-
4746a: 2f06 movel %d6,%sp@-
4746c: 2f2b 001c movel %a3@(28),%sp@-
47470: 2f2b 0018 movel %a3@(24),%sp@-
47474: 2f05 movel %d5,%sp@-
47476: 2f04 movel %d4,%sp@-
47478: 4879 0005 d139 pea 5d139 <_Status_Object_name_errors_to_status+0x5d>
4747e: 42a7 clrl %sp@-
47480: 2f02 movel %d2,%sp@-
47482: 4e92 jsr %a2@
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
47484: 4fef 002c lea %sp@(44),%sp
47488: 4a84 tstl %d4
4748a: 6608 bnes 47494 <_Heap_Walk+0x6e>
(*printer)( source, true, "page size is zero\n" );
4748c: 4879 0005 d1ca pea 5d1ca <_Status_Object_name_errors_to_status+0xee>
47492: 6050 bras 474e4 <_Heap_Walk+0xbe>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
47494: 7003 moveq #3,%d0
47496: c084 andl %d4,%d0
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
47498: 670c beqs 474a6 <_Heap_Walk+0x80>
(*printer)(
4749a: 2f04 movel %d4,%sp@-
4749c: 4879 0005 d1dd pea 5d1dd <_Status_Object_name_errors_to_status+0x101>
474a2: 6000 02ca braw 4776e <_Heap_Walk+0x348>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
474a6: 2205 movel %d5,%d1
474a8: 4c44 1000 remul %d4,%d0,%d1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
474ac: 4a80 tstl %d0
474ae: 670c beqs 474bc <_Heap_Walk+0x96>
(*printer)(
474b0: 2f05 movel %d5,%sp@-
474b2: 4879 0005 d1fb pea 5d1fb <_Status_Object_name_errors_to_status+0x11f>
474b8: 6000 02b4 braw 4776e <_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;
474bc: 2006 movel %d6,%d0
474be: 5080 addql #8,%d0
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
474c0: 4c44 0001 remul %d4,%d1,%d0
);
return false;
}
if (
474c4: 4a81 tstl %d1
474c6: 670c beqs 474d4 <_Heap_Walk+0xae>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
474c8: 2f06 movel %d6,%sp@-
474ca: 4879 0005 d21f pea 5d21f <_Status_Object_name_errors_to_status+0x143>
474d0: 6000 029c braw 4776e <_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;
474d4: 7001 moveq #1,%d0
474d6: 2046 moveal %d6,%a0
474d8: c0a8 0004 andl %a0@(4),%d0
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
474dc: 6616 bnes 474f4 <_Heap_Walk+0xce>
(*printer)(
474de: 4879 0005 d250 pea 5d250 <_Status_Object_name_errors_to_status+0x174>
474e4: 4878 0001 pea 1 <ADD>
474e8: 2f02 movel %d2,%sp@-
474ea: 4e92 jsr %a2@
474ec: 4fef 000c lea %sp@(12),%sp
474f0: 6000 00ba braw 475ac <_Heap_Walk+0x186>
- 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;
474f4: 70fe moveq #-2,%d0
474f6: 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);
474f8: 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;
474fa: 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);
474fe: 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;
47500: 7001 moveq #1,%d0
47502: c0ac 0004 andl %a4@(4),%d0
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
47506: 6608 bnes 47510 <_Heap_Walk+0xea>
(*printer)(
47508: 4879 0005 d27e pea 5d27e <_Status_Object_name_errors_to_status+0x1a2>
4750e: 60d4 bras 474e4 <_Heap_Walk+0xbe>
);
return false;
}
if (
47510: bc8c cmpl %a4,%d6
47512: 6708 beqs 4751c <_Heap_Walk+0xf6>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
47514: 4879 0005 d293 pea 5d293 <_Status_Object_name_errors_to_status+0x1b7>
4751a: 60c8 bras 474e4 <_Heap_Walk+0xbe>
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
4751c: 262b 0010 movel %a3@(16),%d3
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
47520: 220b movel %a3,%d1
block = next_block;
} while ( block != first_block );
return true;
}
47522: 206b 0008 moveal %a3@(8),%a0
47526: 2d44 fff8 movel %d4,%fp@(-8)
4752a: 2d43 fffc movel %d3,%fp@(-4)
4752e: 6000 0088 braw 475b8 <_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;
47532: b1eb 0020 cmpal %a3@(32),%a0
47536: 650c bcss 47544 <_Heap_Walk+0x11e>
47538: b1eb 0024 cmpal %a3@(36),%a0
4753c: 53c0 sls %d0
4753e: 49c0 extbl %d0
47540: 4480 negl %d0
47542: 6002 bras 47546 <_Heap_Walk+0x120>
47544: 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 ) ) {
47546: 4a00 tstb %d0
47548: 660c bnes 47556 <_Heap_Walk+0x130>
(*printer)(
4754a: 2f08 movel %a0,%sp@-
4754c: 4879 0005 d2c2 pea 5d2c2 <_Status_Object_name_errors_to_status+0x1e6>
47552: 6000 021a braw 4776e <_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;
47556: 4be8 0008 lea %a0@(8),%a5
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
4755a: 200d movel %a5,%d0
4755c: 262e fffc movel %fp@(-4),%d3
47560: 4c43 0004 remul %d3,%d4,%d0
);
return false;
}
if (
47564: 4a84 tstl %d4
47566: 670c beqs 47574 <_Heap_Walk+0x14e>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
47568: 2f08 movel %a0,%sp@-
4756a: 4879 0005 d2e2 pea 5d2e2 <_Status_Object_name_errors_to_status+0x206>
47570: 6000 01fc braw 4776e <_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;
47574: 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;
47576: 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;
47578: 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;
4757c: c6b0 0804 andl %a0@(00000004,%d0:l),%d3
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
47580: 670c beqs 4758e <_Heap_Walk+0x168>
(*printer)(
47582: 2f08 movel %a0,%sp@-
47584: 4879 0005 d312 pea 5d312 <_Status_Object_name_errors_to_status+0x236>
4758a: 6000 01e2 braw 4776e <_Heap_Walk+0x348>
);
return false;
}
if ( free_block->prev != prev_block ) {
4758e: 2028 000c movel %a0@(12),%d0
47592: b280 cmpl %d0,%d1
47594: 671c beqs 475b2 <_Heap_Walk+0x18c>
(*printer)(
47596: 2f00 movel %d0,%sp@-
47598: 2f08 movel %a0,%sp@-
4759a: 4879 0005 d32e pea 5d32e <_Status_Object_name_errors_to_status+0x252>
475a0: 4878 0001 pea 1 <ADD>
475a4: 2f02 movel %d2,%sp@-
475a6: 4e92 jsr %a2@
475a8: 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;
475ac: 4200 clrb %d0
475ae: 6000 01ac braw 4775c <_Heap_Walk+0x336>
return false;
}
prev_block = free_block;
free_block = free_block->next;
475b2: 2208 movel %a0,%d1
475b4: 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 ) {
475b8: b7c8 cmpal %a0,%a3
475ba: 6600 ff76 bnew 47532 <_Heap_Walk+0x10c>
475be: 282e fff8 movel %fp@(-8),%d4
475c2: 6002 bras 475c6 <_Heap_Walk+0x1a0>
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
475c4: 284d moveal %a5,%a4
return true;
}
475c6: 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;
475ca: 76fe moveq #-2,%d3
475cc: c680 andl %d0,%d3
475ce: 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);
475d2: 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;
475d6: bbeb 0020 cmpal %a3@(32),%a5
475da: 650c bcss 475e8 <_Heap_Walk+0x1c2> <== NEVER TAKEN
475dc: bbeb 0024 cmpal %a3@(36),%a5
475e0: 53c0 sls %d0
475e2: 49c0 extbl %d0
475e4: 4480 negl %d0
475e6: 6002 bras 475ea <_Heap_Walk+0x1c4>
475e8: 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 ) ) {
475ea: 4a00 tstb %d0
475ec: 660c bnes 475fa <_Heap_Walk+0x1d4>
(*printer)(
475ee: 2f0d movel %a5,%sp@-
475f0: 2f0c movel %a4,%sp@-
475f2: 4879 0005 d360 pea 5d360 <_Status_Object_name_errors_to_status+0x284>
475f8: 60a6 bras 475a0 <_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;
475fa: be8c cmpl %a4,%d7
475fc: 56c0 sne %d0
475fe: 2200 movel %d0,%d1
47600: 4481 negl %d1
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
47602: 2003 movel %d3,%d0
47604: 1d41 fffb moveb %d1,%fp@(-5)
47608: 4c44 0001 remul %d4,%d1,%d0
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
4760c: 4a81 tstl %d1
4760e: 6714 beqs 47624 <_Heap_Walk+0x1fe>
47610: 4a2e fffb tstb %fp@(-5)
47614: 670e beqs 47624 <_Heap_Walk+0x1fe>
(*printer)(
47616: 2f03 movel %d3,%sp@-
47618: 2f0c movel %a4,%sp@-
4761a: 4879 0005 d38d pea 5d38d <_Status_Object_name_errors_to_status+0x2b1>
47620: 6000 ff7e braw 475a0 <_Heap_Walk+0x17a>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
47624: ba83 cmpl %d3,%d5
47626: 6322 blss 4764a <_Heap_Walk+0x224>
47628: 4a2e fffb tstb %fp@(-5)
4762c: 671c beqs 4764a <_Heap_Walk+0x224> <== NEVER TAKEN
(*printer)(
4762e: 2f05 movel %d5,%sp@-
47630: 2f03 movel %d3,%sp@-
47632: 2f0c movel %a4,%sp@-
47634: 4879 0005 d3bb pea 5d3bb <_Status_Object_name_errors_to_status+0x2df>
4763a: 4878 0001 pea 1 <ADD>
4763e: 2f02 movel %d2,%sp@-
47640: 4e92 jsr %a2@
block,
block_size,
min_block_size
);
return false;
47642: 4fef 0018 lea %sp@(24),%sp
47646: 6000 ff64 braw 475ac <_Heap_Walk+0x186>
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
4764a: b9cd cmpal %a5,%a4
4764c: 6514 bcss 47662 <_Heap_Walk+0x23c>
4764e: 4a2e fffb tstb %fp@(-5)
47652: 670e beqs 47662 <_Heap_Walk+0x23c>
(*printer)(
47654: 2f0d movel %a5,%sp@-
47656: 2f0c movel %a4,%sp@-
47658: 4879 0005 d3e6 pea 5d3e6 <_Status_Object_name_errors_to_status+0x30a>
4765e: 6000 ff40 braw 475a0 <_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;
47662: 7001 moveq #1,%d0
47664: c0ae fffc andl %fp@(-4),%d0
47668: 2d40 fffc movel %d0,%fp@(-4)
4766c: 7001 moveq #1,%d0
4766e: c0ad 0004 andl %a5@(4),%d0
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
47672: 6600 00ae bnew 47722 <_Heap_Walk+0x2fc>
block = next_block;
} while ( block != first_block );
return true;
}
47676: 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)(
4767a: 43f9 0005 d106 lea 5d106 <_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 ?
47680: 206c 0008 moveal %a4@(8),%a0
block = next_block;
} while ( block != first_block );
return true;
}
47684: 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)(
47688: b1eb 000c cmpal %a3@(12),%a0
4768c: 6710 beqs 4769e <_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)" : "")
4768e: 43f9 0005 d04e lea 5d04e <rtems_filesystem_default_pathconf+0xb4>,%a1
47694: b7c8 cmpal %a0,%a3
47696: 6606 bnes 4769e <_Heap_Walk+0x278>
47698: 43f9 0005 d115 lea 5d115 <_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 ?
4769e: 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)(
476a2: 223c 0005 d11f movel #381215,%d1
476a8: b0ae fff8 cmpl %fp@(-8),%d0
476ac: 6710 beqs 476be <_Heap_Walk+0x298>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
476ae: 223c 0005 d04e movel #381006,%d1
476b4: b7c0 cmpal %d0,%a3
476b6: 6606 bnes 476be <_Heap_Walk+0x298>
476b8: 223c 0005 d12f movel #381231,%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)(
476be: 2f09 movel %a1,%sp@-
476c0: 2f08 movel %a0,%sp@-
476c2: 2f01 movel %d1,%sp@-
476c4: 2f00 movel %d0,%sp@-
476c6: 2f03 movel %d3,%sp@-
476c8: 2f0c movel %a4,%sp@-
476ca: 4879 0005 d41a pea 5d41a <_Status_Object_name_errors_to_status+0x33e>
476d0: 42a7 clrl %sp@-
476d2: 2f02 movel %d2,%sp@-
476d4: 4e92 jsr %a2@
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
476d6: 2015 movel %a5@,%d0
476d8: 4fef 0024 lea %sp@(36),%sp
476dc: b083 cmpl %d3,%d0
476de: 671e beqs 476fe <_Heap_Walk+0x2d8>
(*printer)(
476e0: 2f0d movel %a5,%sp@-
476e2: 2f00 movel %d0,%sp@-
476e4: 2f03 movel %d3,%sp@-
476e6: 2f0c movel %a4,%sp@-
476e8: 4879 0005 d44f pea 5d44f <_Status_Object_name_errors_to_status+0x373>
476ee: 4878 0001 pea 1 <ADD>
476f2: 2f02 movel %d2,%sp@-
476f4: 4e92 jsr %a2@
476f6: 4fef 001c lea %sp@(28),%sp
476fa: 6000 feb0 braw 475ac <_Heap_Walk+0x186>
);
return false;
}
if ( !prev_used ) {
476fe: 4aae fffc tstl %fp@(-4)
47702: 660a bnes 4770e <_Heap_Walk+0x2e8>
(*printer)(
47704: 2f0c movel %a4,%sp@-
47706: 4879 0005 d488 pea 5d488 <_Status_Object_name_errors_to_status+0x3ac>
4770c: 6060 bras 4776e <_Heap_Walk+0x348>
block = next_block;
} while ( block != first_block );
return true;
}
4770e: 206b 0008 moveal %a3@(8),%a0
47712: 6008 bras 4771c <_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 ) {
47714: b9c8 cmpal %a0,%a4
47716: 673c beqs 47754 <_Heap_Walk+0x32e>
return true;
}
free_block = free_block->next;
47718: 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 ) {
4771c: b7c8 cmpal %a0,%a3
4771e: 66f4 bnes 47714 <_Heap_Walk+0x2ee>
47720: 6044 bras 47766 <_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) {
47722: 4aae fffc tstl %fp@(-4)
47726: 6716 beqs 4773e <_Heap_Walk+0x318>
(*printer)(
47728: 2f03 movel %d3,%sp@-
4772a: 2f0c movel %a4,%sp@-
4772c: 4879 0005 d4b7 pea 5d4b7 <_Status_Object_name_errors_to_status+0x3db>
47732: 42a7 clrl %sp@-
47734: 2f02 movel %d2,%sp@-
47736: 4e92 jsr %a2@
47738: 4fef 0014 lea %sp@(20),%sp
4773c: 6016 bras 47754 <_Heap_Walk+0x32e>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
4773e: 2f14 movel %a4@,%sp@-
47740: 2f03 movel %d3,%sp@-
47742: 2f0c movel %a4,%sp@-
47744: 4879 0005 d4ce pea 5d4ce <_Status_Object_name_errors_to_status+0x3f2>
4774a: 42a7 clrl %sp@-
4774c: 2f02 movel %d2,%sp@-
4774e: 4e92 jsr %a2@
47750: 4fef 0018 lea %sp@(24),%sp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
47754: bc8d cmpl %a5,%d6
47756: 6600 fe6c bnew 475c4 <_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;
4775a: 7001 moveq #1,%d0
block = next_block;
} while ( block != first_block );
return true;
}
4775c: 4cee 3cfc ffd0 moveml %fp@(-48),%d2-%d7/%a2-%a5
47762: 4e5e unlk %fp
47764: 4e75 rts
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
47766: 2f0c movel %a4,%sp@-
47768: 4879 0005 d4f3 pea 5d4f3 <_Status_Object_name_errors_to_status+0x417>
4776e: 4878 0001 pea 1 <ADD>
47772: 2f02 movel %d2,%sp@-
47774: 4e92 jsr %a2@
47776: 4fef 0010 lea %sp@(16),%sp
4777a: 6000 fe30 braw 475ac <_Heap_Walk+0x186>
...
000473e8 <_Heap_Walk_print>:
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
473e8: 41f9 0004 3de0 lea 43de0 <printk>,%a0
473ee: 4e56 0000 linkw %fp,#0
473f2: 202e 0008 movel %fp@(8),%d0
va_list ap;
if ( error ) {
473f6: 4a2e 000f tstb %fp@(15)
473fa: 670a beqs 47406 <_Heap_Walk_print+0x1e> <== NEVER TAKEN
printk( "FAIL[%d]: ", source );
473fc: 2f00 movel %d0,%sp@-
473fe: 4879 0005 d0f0 pea 5d0f0 <_Status_Object_name_errors_to_status+0x14>
47404: 6008 bras 4740e <_Heap_Walk_print+0x26>
} else {
printk( "PASS[%d]: ", source );
47406: 2f00 movel %d0,%sp@-
47408: 4879 0005 d0fb pea 5d0fb <_Status_Object_name_errors_to_status+0x1f>
4740e: 4e90 jsr %a0@
47410: 508f addql #8,%sp
}
va_start( ap, fmt );
vprintk( fmt, ap );
47412: 486e 0014 pea %fp@(20)
47416: 2f2e 0010 movel %fp@(16),%sp@-
4741a: 4eb9 0004 56f8 jsr 456f8 <vprintk>
va_end( ap );
47420: 508f addql #8,%sp
}
47422: 4e5e unlk %fp <== NOT EXECUTED
00046a08 <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
46a08: 4e56 0000 linkw %fp,#0
46a0c: 222e 000c movel %fp@(12),%d1
46a10: 2f02 movel %d2,%sp@-
46a12: 242e 0010 movel %fp@(16),%d2
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
46a16: 13c1 0005 ea62 moveb %d1,5ea62 <_Internal_errors_What_happened+0x4>
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
46a1c: 2f02 movel %d2,%sp@-
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
46a1e: 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 );
46a22: 0281 0000 00ff andil #255,%d1
bool is_internal,
Internal_errors_t the_error
)
{
_Internal_errors_What_happened.the_source = the_source;
46a28: 23c0 0005 ea5e movel %d0,5ea5e <_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 );
46a2e: 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;
46a30: 23c2 0005 ea64 movel %d2,5ea64 <_Internal_errors_What_happened+0x6>
_User_extensions_Fatal( the_source, is_internal, the_error );
46a36: 2f00 movel %d0,%sp@-
46a38: 4eb9 0004 860e jsr 4860e <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
46a3e: 7005 moveq #5,%d0 <== NOT EXECUTED
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
46a40: 2042 moveal %d2,%a0 <== NOT EXECUTED
46a42: 243c 0000 0700 movel #1792,%d2 <== NOT EXECUTED
46a48: 23c0 0005 eb14 movel %d0,5eb14 <_System_state_Current> <== NOT EXECUTED
46a4e: 40c0 movew %sr,%d0 <== NOT EXECUTED
46a50: 8082 orl %d2,%d0 <== NOT EXECUTED
46a52: 46c0 movew %d0,%sr <== NOT EXECUTED
46a54: 2008 movel %a0,%d0 <== NOT EXECUTED
46a56: 223c dead beef movel #-559038737,%d1 <== NOT EXECUTED
46a5c: 4ac8 halt <== NOT EXECUTED
46a5e: 4fef 000c lea %sp@(12),%sp <== NOT EXECUTED
46a62: 60fe bras 46a62 <_Internal_error_Occurred+0x5a> <== NOT EXECUTED
00046ac4 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
46ac4: 4e56 fff0 linkw %fp,#-16
46ac8: 48d7 0c0c moveml %d2-%d3/%a2-%a3,%sp@
46acc: 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 )
46ad0: 4aaa 0014 tstl %a2@(20)
46ad4: 675e beqs 46b34 <_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 );
46ad6: 240a movel %a2,%d2
46ad8: 0682 0000 001c addil #28,%d2
46ade: 47f9 0004 6268 lea 46268 <_Chain_Get>,%a3
46ae4: 2f02 movel %d2,%sp@-
46ae6: 4e93 jsr %a3@
if ( information->auto_extend ) {
46ae8: 588f addql #4,%sp
46aea: 4a2a 0010 tstb %a2@(16)
46aee: 6746 beqs 46b36 <_Objects_Allocate+0x72>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
46af0: 4a80 tstl %d0
46af2: 6612 bnes 46b06 <_Objects_Allocate+0x42>
_Objects_Extend_information( information );
46af4: 2f0a movel %a2,%sp@-
46af6: 4eb9 0004 6b6c jsr 46b6c <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
46afc: 2f02 movel %d2,%sp@-
46afe: 4e93 jsr %a3@
}
if ( the_object ) {
46b00: 508f addql #8,%sp
46b02: 4a80 tstl %d0
46b04: 6730 beqs 46b36 <_Objects_Allocate+0x72>
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
46b06: 2040 moveal %d0,%a0
46b08: 4281 clrl %d1
46b0a: 4282 clrl %d2
46b0c: 3228 000a movew %a0@(10),%d1
46b10: 342a 0008 movew %a2@(8),%d2
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
46b14: 206a 002a moveal %a2@(42),%a0
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
46b18: 9282 subl %d2,%d1
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
46b1a: 342a 0012 movew %a2@(18),%d2
46b1e: 4c42 1001 remul %d2,%d1,%d1
information->inactive_per_block[ block ]--;
46b22: e589 lsll #2,%d1
46b24: d1c1 addal %d1,%a0
46b26: 5390 subql #1,%a0@
information->inactive--;
46b28: 322a 0028 movew %a2@(40),%d1
46b2c: 5381 subql #1,%d1
46b2e: 3541 0028 movew %d1,%a2@(40)
46b32: 6002 bras 46b36 <_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;
46b34: 4280 clrl %d0 <== NOT EXECUTED
);
}
#endif
return the_object;
}
46b36: 4cee 0c0c fff0 moveml %fp@(-16),%d2-%d3/%a2-%a3
46b3c: 4e5e unlk %fp <== NOT EXECUTED
00046b40 <_Objects_Close>:
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
46b40: 4280 clrl %d0
void _Objects_Close(
Objects_Information *information,
Objects_Control *the_object
)
{
46b42: 4e56 0000 linkw %fp,#0
46b46: 226e 000c moveal %fp@(12),%a1
46b4a: 206e 0008 moveal %fp@(8),%a0
46b4e: 2f0a movel %a2,%sp@-
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
46b50: 2468 0018 moveal %a0@(24),%a2
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
46b54: 3029 000a movew %a1@(10),%d0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
46b58: 42b2 0c00 clrl %a2@(00000000,%d0:l:4)
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
}
46b5c: 245f moveal %sp@+,%a2
Objects_Control *the_object
)
{
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
46b5e: 2d49 000c movel %a1,%fp@(12)
}
46b62: 4e5e unlk %fp
Objects_Control *the_object
)
{
_Objects_Invalidate_Id( information, the_object );
_Objects_Namespace_remove( information, the_object );
46b64: 4ef9 0004 7074 jmp 47074 <_Objects_Namespace_remove>
...
00046e64 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
46e64: 4e56 0000 linkw %fp,#0
46e68: 2f03 movel %d3,%sp@-
46e6a: 362e 000e movew %fp@(14),%d3
46e6e: 2f02 movel %d2,%sp@-
46e70: 242e 0008 movel %fp@(8),%d2
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
46e74: 4a43 tstw %d3
46e76: 673a beqs 46eb2 <_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 );
46e78: 2f02 movel %d2,%sp@-
46e7a: 4eb9 0004 b09c jsr 4b09c <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
46e80: 588f addql #4,%sp
46e82: 4a80 tstl %d0
46e84: 672c beqs 46eb2 <_Objects_Get_information+0x4e>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
46e86: 0283 0000 ffff andil #65535,%d3
46e8c: b083 cmpl %d3,%d0
46e8e: 6522 bcss 46eb2 <_Objects_Get_information+0x4e>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
46e90: 41f9 0005 e984 lea 5e984 <_Objects_Information_table>,%a0
46e96: 2070 2c00 moveal %a0@(00000000,%d2:l:4),%a0
46e9a: 4a88 tstl %a0
46e9c: 6714 beqs 46eb2 <_Objects_Get_information+0x4e> <== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
46e9e: 2030 3c00 movel %a0@(00000000,%d3:l:4),%d0
if ( !info )
46ea2: 6710 beqs 46eb4 <_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;
46ea4: 2040 moveal %d0,%a0
46ea6: 4a68 000e tstw %a0@(14)
46eaa: 56c1 sne %d1
46eac: 49c1 extbl %d1
46eae: c081 andl %d1,%d0
46eb0: 6002 bras 46eb4 <_Objects_Get_information+0x50>
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
return NULL;
46eb2: 4280 clrl %d0
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
46eb4: 242e fff8 movel %fp@(-8),%d2
46eb8: 262e fffc movel %fp@(-4),%d3
46ebc: 4e5e unlk %fp <== NOT EXECUTED
0005468c <_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;
5468c: 7001 moveq #1,%d0
if ( information->maximum >= index ) {
5468e: 4281 clrl %d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
54690: 4e56 0000 linkw %fp,#0
54694: 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;
54698: 90a8 0006 subl %a0@(6),%d0
5469c: d0ae 000c addl %fp@(12),%d0
if ( information->maximum >= index ) {
546a0: 3228 000e movew %a0@(14),%d1
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
546a4: 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 ) {
546a8: b081 cmpl %d1,%d0
546aa: 620e bhis 546ba <_Objects_Get_no_protection+0x2e>
if ( (the_object = information->local_table[ index ]) != NULL ) {
546ac: 2068 0018 moveal %a0@(24),%a0
546b0: 2030 0c00 movel %a0@(00000000,%d0:l:4),%d0
546b4: 6704 beqs 546ba <_Objects_Get_no_protection+0x2e><== NEVER TAKEN
*location = OBJECTS_LOCAL;
546b6: 4291 clrl %a1@
return the_object;
546b8: 6006 bras 546c0 <_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;
546ba: 7001 moveq #1,%d0
546bc: 2280 movel %d0,%a1@
return NULL;
546be: 4280 clrl %d0
}
546c0: 4e5e unlk %fp <== NOT EXECUTED
00047e44 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
47e44: 4e56 fffc linkw %fp,#-4
47e48: 222e 0008 movel %fp@(8),%d1
47e4c: 2f02 movel %d2,%sp@-
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
47e4e: 4a81 tstl %d1
47e50: 660a bnes 47e5c <_Objects_Id_to_name+0x18>
47e52: 2079 0006 02ea moveal 602ea <_Per_CPU_Information+0xc>,%a0
47e58: 2228 0008 movel %a0@(8),%d1
47e5c: 7418 moveq #24,%d2
47e5e: 2001 movel %d1,%d0
47e60: e4a8 lsrl %d2,%d0
47e62: 143c 0007 moveb #7,%d2
47e66: c082 andl %d2,%d0
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
47e68: 143c 0002 moveb #2,%d2
47e6c: 2040 moveal %d0,%a0
47e6e: 5388 subql #1,%a0
47e70: b488 cmpl %a0,%d2
47e72: 6540 bcss 47eb4 <_Objects_Id_to_name+0x70>
47e74: 6048 bras 47ebe <_Objects_Id_to_name+0x7a>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
47e76: 2001 movel %d1,%d0
47e78: 741b moveq #27,%d2
47e7a: 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 ];
47e7c: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
if ( !information )
47e80: 4a88 tstl %a0
47e82: 6730 beqs 47eb4 <_Objects_Id_to_name+0x70> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
47e84: 4a28 0032 tstb %a0@(50)
47e88: 662a bnes 47eb4 <_Objects_Id_to_name+0x70> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
47e8a: 486e fffc pea %fp@(-4)
47e8e: 2f01 movel %d1,%sp@-
47e90: 2f08 movel %a0,%sp@-
47e92: 4eb9 0004 7de4 jsr 47de4 <_Objects_Get>
if ( !the_object )
47e98: 4fef 000c lea %sp@(12),%sp
47e9c: 4a80 tstl %d0
47e9e: 6714 beqs 47eb4 <_Objects_Id_to_name+0x70>
return OBJECTS_INVALID_ID;
*name = the_object->name;
47ea0: 206e 000c moveal %fp@(12),%a0
47ea4: 2240 moveal %d0,%a1
47ea6: 20a9 000c movel %a1@(12),%a0@
_Thread_Enable_dispatch();
47eaa: 4eb9 0004 8a1a jsr 48a1a <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
47eb0: 4280 clrl %d0
47eb2: 6002 bras 47eb6 <_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;
47eb4: 7003 moveq #3,%d0
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
47eb6: 242e fff8 movel %fp@(-8),%d2
47eba: 4e5e unlk %fp
47ebc: 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 ] )
47ebe: 41f9 0005 fe3c lea 5fe3c <_Objects_Information_table>,%a0
47ec4: 2070 0c00 moveal %a0@(00000000,%d0:l:4),%a0
47ec8: 4a88 tstl %a0
47eca: 66aa bnes 47e76 <_Objects_Id_to_name+0x32>
47ecc: 60e6 bras 47eb4 <_Objects_Id_to_name+0x70>
...
0004748c <_Objects_Set_name>:
{
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
4748c: 4280 clrl %d0
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
4748e: 4e56 ffec linkw %fp,#-20
47492: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
47496: 2a6e 0008 moveal %fp@(8),%a5
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
4749a: 302d 0034 movew %a5@(52),%d0
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
4749e: 246e 0010 moveal %fp@(16),%a2
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
474a2: 2f00 movel %d0,%sp@-
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
474a4: 286e 000c moveal %fp@(12),%a4
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
474a8: 2f0a movel %a2,%sp@-
474aa: 4eb9 0004 e69c jsr 4e69c <strnlen>
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
474b0: 508f addql #8,%sp
{
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
474b2: 2640 moveal %d0,%a3
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
474b4: 4a2d 0032 tstb %a5@(50)
474b8: 673c beqs 474f6 <_Objects_Set_name+0x6a>
char *d;
d = _Workspace_Allocate( length + 1 );
474ba: 486b 0001 pea %a3@(1)
474be: 4eb9 0004 8e18 jsr 48e18 <_Workspace_Allocate>
if ( !d )
474c4: 588f addql #4,%sp
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
474c6: 2a40 moveal %d0,%a5
if ( !d )
474c8: 4a80 tstl %d0
474ca: 677a beqs 47546 <_Objects_Set_name+0xba> <== NEVER TAKEN
return false;
_Workspace_Free( (void *)the_object->name.name_p );
474cc: 2f2c 000c movel %a4@(12),%sp@-
474d0: 4eb9 0004 8e34 jsr 48e34 <_Workspace_Free>
the_object->name.name_p = NULL;
474d6: 42ac 000c clrl %a4@(12)
strncpy( d, name, length );
474da: 2f0b movel %a3,%sp@-
474dc: 2f0a movel %a2,%sp@-
474de: 2f0d movel %a5,%sp@-
474e0: 4eb9 0004 e618 jsr 4e618 <strncpy>
d[length] = '\0';
the_object->name.name_p = d;
474e6: 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';
474ea: 4200 clrb %d0
474ec: 1b80 b800 moveb %d0,%a5@(00000000,%a3:l)
the_object->name.name_p = d;
474f0: 294d 000c movel %a5,%a4@(12)
474f4: 604c bras 47542 <_Objects_Set_name+0xb6>
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
474f6: 7418 moveq #24,%d2
474f8: 1212 moveb %a2@,%d1
474fa: 7020 moveq #32,%d0
474fc: 4840 swap %d0
474fe: 49c1 extbl %d1
47500: e5a9 lsll %d2,%d1
47502: 143c 0001 moveb #1,%d2
47506: b48b cmpl %a3,%d2
47508: 640a bccs 47514 <_Objects_Set_name+0x88>
4750a: 102a 0001 moveb %a2@(1),%d0
4750e: 49c0 extbl %d0
47510: 4840 swap %d0
47512: 4240 clrw %d0
47514: 7402 moveq #2,%d2
47516: 8280 orl %d0,%d1
47518: 203c 0000 2000 movel #8192,%d0
4751e: b48b cmpl %a3,%d2
47520: 6408 bccs 4752a <_Objects_Set_name+0x9e>
47522: 102a 0002 moveb %a2@(2),%d0
47526: 49c0 extbl %d0
47528: e188 lsll #8,%d0
4752a: 8081 orl %d1,%d0
4752c: 7203 moveq #3,%d1
4752e: b28b cmpl %a3,%d1
47530: 6408 bccs 4753a <_Objects_Set_name+0xae>
47532: 142a 0003 moveb %a2@(3),%d2
47536: 49c2 extbl %d2
47538: 6002 bras 4753c <_Objects_Set_name+0xb0>
4753a: 7420 moveq #32,%d2
4753c: 8082 orl %d2,%d0
4753e: 2940 000c movel %d0,%a4@(12)
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
47542: 7001 moveq #1,%d0
47544: 6002 bras 47548 <_Objects_Set_name+0xbc>
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
if ( !d )
return false;
47546: 4200 clrb %d0
);
}
return true;
}
47548: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4754e: 4e5e unlk %fp
...
00045924 <_POSIX_Keys_Free_memory>:
#include <rtems/posix/key.h>
void _POSIX_Keys_Free_memory(
POSIX_Keys_Control *the_key
)
{
45924: 4e56 0000 linkw %fp,#0
45928: 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 ] );
4592a: 47f9 0004 983c lea 4983c <_Workspace_Free>,%a3
#include <rtems/posix/key.h>
void _POSIX_Keys_Free_memory(
POSIX_Keys_Control *the_key
)
{
45930: 2f0a movel %a2,%sp@-
45932: 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 ] );
45936: 2f2a 0018 movel %a2@(24),%sp@-
4593a: 4e93 jsr %a3@
4593c: 2f2a 001c movel %a2@(28),%sp@-
45940: 4e93 jsr %a3@
45942: 2d6a 0020 0008 movel %a2@(32),%fp@(8)
45948: 508f addql #8,%sp
}
4594a: 246e fff8 moveal %fp@(-8),%a2
4594e: 266e fffc moveal %fp@(-4),%a3
45952: 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 ] );
45954: 4ef9 0004 983c jmp 4983c <_Workspace_Free>
...
00049bc4 <_POSIX_Message_queue_Delete>:
*/
void _POSIX_Message_queue_Delete(
POSIX_Message_queue_Control *the_mq
)
{
49bc4: 4e56 0000 linkw %fp,#0
49bc8: 2f0a movel %a2,%sp@-
49bca: 246e 0008 moveal %fp@(8),%a2
if ( !the_mq->linked && !the_mq->open_count ) {
49bce: 4a2a 0015 tstb %a2@(21)
49bd2: 6636 bnes 49c0a <_POSIX_Message_queue_Delete+0x46><== NEVER TAKEN
49bd4: 4aaa 0016 tstl %a2@(22)
49bd8: 6630 bnes 49c0a <_POSIX_Message_queue_Delete+0x46>
);
_Workspace_Free( (void *)the_object->name.name_p );
}
#endif
_Objects_Close( &_POSIX_Message_queue_Information, the_object );
49bda: 2f0a movel %a2,%sp@-
49bdc: 4879 0006 6e8e pea 66e8e <_POSIX_Message_queue_Information>
49be2: 4eb9 0004 c8a4 jsr 4c8a4 <_Objects_Close>
_CORE_message_queue_Close(
49be8: 4878 0005 pea 5 <COMPARE>
49bec: 42a7 clrl %sp@-
49bee: 486a 001a pea %a2@(26)
49bf2: 4eb9 0004 bcfc jsr 4bcfc <_CORE_message_queue_Close>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
POSIX_Message_queue_Control *the_mq
)
{
_Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
49bf8: 2f0a movel %a2,%sp@-
49bfa: 4879 0006 6e8e pea 66e8e <_POSIX_Message_queue_Information>
49c00: 4eb9 0004 cb18 jsr 4cb18 <_Objects_Free>
49c06: 4fef 001c lea %sp@(28),%sp
);
_POSIX_Message_queue_Free( the_mq );
}
}
49c0a: 246e fffc moveal %fp@(-4),%a2
49c0e: 4e5e unlk %fp
...
00049f00 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
49f00: 4e56 ffe4 linkw %fp,#-28
49f04: 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(
49f08: 486e fffc pea %fp@(-4)
49f0c: 242e 0008 movel %fp@(8),%d2
49f10: 2f02 movel %d2,%sp@-
49f12: 4879 0006 6ffc pea 66ffc <_POSIX_Message_queue_Information_fds>
49f18: 162e 001b moveb %fp@(27),%d3
49f1c: 4eb9 0004 cc7c jsr 4cc7c <_Objects_Get>
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
49f22: 4fef 000c lea %sp@(12),%sp
49f26: 4aae fffc tstl %fp@(-4)
49f2a: 6600 00c0 bnew 49fec <_POSIX_Message_queue_Receive_support+0xec>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
49f2e: 2040 moveal %d0,%a0
49f30: 7803 moveq #3,%d4
49f32: 7a01 moveq #1,%d5
49f34: 2228 0014 movel %a0@(20),%d1
49f38: c881 andl %d1,%d4
49f3a: ba84 cmpl %d4,%d5
49f3c: 660a bnes 49f48 <_POSIX_Message_queue_Receive_support+0x48>
_Thread_Enable_dispatch();
49f3e: 4eb9 0004 d832 jsr 4d832 <_Thread_Enable_dispatch>
49f44: 6000 00a6 braw 49fec <_POSIX_Message_queue_Receive_support+0xec>
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
49f48: 2240 moveal %d0,%a1
49f4a: 2069 0010 moveal %a1@(16),%a0
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
49f4e: 2028 0066 movel %a0@(102),%d0
49f52: b0ae 0010 cmpl %fp@(16),%d0
49f56: 6316 blss 49f6e <_POSIX_Message_queue_Receive_support+0x6e>
_Thread_Enable_dispatch();
49f58: 4eb9 0004 d832 jsr 4d832 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
49f5e: 4eb9 0005 2f48 jsr 52f48 <__errno>
49f64: 727a moveq #122,%d1
49f66: 2040 moveal %d0,%a0
49f68: 2081 movel %d1,%a0@
49f6a: 6000 008c braw 49ff8 <_POSIX_Message_queue_Receive_support+0xf8>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
49f6e: 70ff moveq #-1,%d0
49f70: 2d40 fff8 movel %d0,%fp@(-8)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
49f74: 4a03 tstb %d3
49f76: 670a beqs 49f82 <_POSIX_Message_queue_Receive_support+0x82><== NEVER TAKEN
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
49f78: 0801 000e btst #14,%d1
49f7c: 57c0 seq %d0
49f7e: 4480 negl %d0
49f80: 6002 bras 49f84 <_POSIX_Message_queue_Receive_support+0x84>
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
49f82: 4200 clrb %d0 <== NOT EXECUTED
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
49f84: 2f2e 001c movel %fp@(28),%sp@-
49f88: 0280 0000 00ff andil #255,%d0
49f8e: 2f00 movel %d0,%sp@-
49f90: 486e fff8 pea %fp@(-8)
49f94: 2f2e 000c movel %fp@(12),%sp@-
49f98: 2f02 movel %d2,%sp@-
49f9a: 4868 001a pea %a0@(26)
49f9e: 4eb9 0004 bd98 jsr 4bd98 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
49fa4: 4eb9 0004 d832 jsr 4d832 <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
49faa: 2079 0006 706e moveal 6706e <_Per_CPU_Information+0xc>,%a0
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);
49fb0: 2028 0024 movel %a0@(36),%d0
49fb4: 6c02 bges 49fb8 <_POSIX_Message_queue_Receive_support+0xb8>
49fb6: 4480 negl %d0
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
49fb8: 226e 0014 moveal %fp@(20),%a1
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
49fbc: 4fef 0018 lea %sp@(24),%sp
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
49fc0: 2280 movel %d0,%a1@
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
49fc2: 4aa8 0034 tstl %a0@(52)
49fc6: 6606 bnes 49fce <_POSIX_Message_queue_Receive_support+0xce>
return length_out;
49fc8: 202e fff8 movel %fp@(-8),%d0
49fcc: 602c bras 49ffa <_POSIX_Message_queue_Receive_support+0xfa>
rtems_set_errno_and_return_minus_one(
49fce: 4eb9 0005 2f48 jsr 52f48 <__errno>
49fd4: 2079 0006 706e moveal 6706e <_Per_CPU_Information+0xc>,%a0
49fda: 2440 moveal %d0,%a2
49fdc: 2f28 0034 movel %a0@(52),%sp@-
49fe0: 4eb9 0004 a214 jsr 4a214 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
49fe6: 588f addql #4,%sp
49fe8: 2480 movel %d0,%a2@
49fea: 600c bras 49ff8 <_POSIX_Message_queue_Receive_support+0xf8>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
49fec: 4eb9 0005 2f48 jsr 52f48 <__errno>
49ff2: 2040 moveal %d0,%a0
49ff4: 7009 moveq #9,%d0
49ff6: 2080 movel %d0,%a0@
49ff8: 70ff moveq #-1,%d0
}
49ffa: 4cee 043c ffe4 moveml %fp@(-28),%d2-%d5/%a2
4a000: 4e5e unlk %fp <== NOT EXECUTED
0004a280 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
4a280: 4e56 0000 linkw %fp,#0
4a284: 226e 0008 moveal %fp@(8),%a1
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a288: 2069 0102 moveal %a1@(258),%a0
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
4a28c: 4aa8 00d8 tstl %a0@(216)
4a290: 662e bnes 4a2c0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x40><== NEVER TAKEN
4a292: 7001 moveq #1,%d0
4a294: b0a8 00dc cmpl %a0@(220),%d0
4a298: 6626 bnes 4a2c0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x40>
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
4a29a: 4aa8 00e0 tstl %a0@(224)
4a29e: 6720 beqs 4a2c0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x40>
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
4a2a0: 4878 ffff pea ffffffff <LESS>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
4a2a4: 2039 0005 f03c movel 5f03c <_Thread_Dispatch_disable_level>,%d0
4a2aa: 5380 subql #1,%d0
4a2ac: 2f09 movel %a1,%sp@-
4a2ae: 23c0 0005 f03c movel %d0,5f03c <_Thread_Dispatch_disable_level>
4a2b4: 4eb9 0004 aa58 jsr 4aa58 <_POSIX_Thread_Exit>
4a2ba: 508f addql #8,%sp
} else
_Thread_Enable_dispatch();
}
4a2bc: 4e5e unlk %fp
4a2be: 4e75 rts
4a2c0: 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();
4a2c2: 4ef9 0004 7dde jmp 47dde <_Thread_Enable_dispatch>
0004b4d4 <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
4b4d4: 4e56 ffec linkw %fp,#-20
4b4d8: 48d7 3c04 moveml %d2/%a2-%a5,%sp@
4b4dc: 246e 000c moveal %fp@(12),%a2
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
4b4e0: 2f12 movel %a2@,%sp@-
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
4b4e2: 242e 0008 movel %fp@(8),%d2
4b4e6: 266e 0010 moveal %fp@(16),%a3
4b4ea: 286e 0014 moveal %fp@(20),%a4
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
4b4ee: 4eb9 0004 b4b0 jsr 4b4b0 <_POSIX_Priority_Is_valid>
4b4f4: 588f addql #4,%sp
4b4f6: 4a00 tstb %d0
4b4f8: 6778 beqs 4b572 <_POSIX_Thread_Translate_sched_param+0x9e><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
4b4fa: 4293 clrl %a3@
*budget_callout = NULL;
4b4fc: 4294 clrl %a4@
if ( policy == SCHED_OTHER ) {
4b4fe: 4a82 tstl %d2
4b500: 6606 bnes 4b508 <_POSIX_Thread_Translate_sched_param+0x34>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
4b502: 7201 moveq #1,%d1
4b504: 2681 movel %d1,%a3@
4b506: 6066 bras 4b56e <_POSIX_Thread_Translate_sched_param+0x9a>
return 0;
}
if ( policy == SCHED_FIFO ) {
4b508: 7001 moveq #1,%d0
4b50a: b082 cmpl %d2,%d0
4b50c: 6760 beqs 4b56e <_POSIX_Thread_Translate_sched_param+0x9a>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
4b50e: 103c 0002 moveb #2,%d0
4b512: b082 cmpl %d2,%d0
4b514: 6606 bnes 4b51c <_POSIX_Thread_Translate_sched_param+0x48>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
4b516: 2680 movel %d0,%a3@
return 0;
4b518: 4200 clrb %d0
4b51a: 6058 bras 4b574 <_POSIX_Thread_Translate_sched_param+0xa0>
}
if ( policy == SCHED_SPORADIC ) {
4b51c: 7004 moveq #4,%d0
4b51e: b082 cmpl %d2,%d0
4b520: 6650 bnes 4b572 <_POSIX_Thread_Translate_sched_param+0x9e>
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
4b522: 4aaa 0008 tstl %a2@(8)
4b526: 6606 bnes 4b52e <_POSIX_Thread_Translate_sched_param+0x5a>
4b528: 4aaa 000c tstl %a2@(12)
4b52c: 6744 beqs 4b572 <_POSIX_Thread_Translate_sched_param+0x9e>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
4b52e: 4aaa 0010 tstl %a2@(16)
4b532: 6606 bnes 4b53a <_POSIX_Thread_Translate_sched_param+0x66>
4b534: 4aaa 0014 tstl %a2@(20)
4b538: 6738 beqs 4b572 <_POSIX_Thread_Translate_sched_param+0x9e>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
4b53a: 486a 0008 pea %a2@(8)
4b53e: 4bf9 0004 93cc lea 493cc <_Timespec_To_ticks>,%a5
4b544: 4e95 jsr %a5@
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
4b546: 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 ) <
4b54a: 2400 movel %d0,%d2
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
4b54c: 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 ) <
4b54e: 508f addql #8,%sp
4b550: b082 cmpl %d2,%d0
4b552: 621e bhis 4b572 <_POSIX_Thread_Translate_sched_param+0x9e>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
4b554: 2f2a 0004 movel %a2@(4),%sp@-
4b558: 4eb9 0004 b4b0 jsr 4b4b0 <_POSIX_Priority_Is_valid>
4b55e: 588f addql #4,%sp
4b560: 4a00 tstb %d0
4b562: 670e beqs 4b572 <_POSIX_Thread_Translate_sched_param+0x9e>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
4b564: 7003 moveq #3,%d0
4b566: 2680 movel %d0,%a3@
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
4b568: 28bc 0004 5edc movel #286428,%a4@
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
4b56e: 4280 clrl %d0
4b570: 6002 bras 4b574 <_POSIX_Thread_Translate_sched_param+0xa0>
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;
4b572: 7016 moveq #22,%d0
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
4b574: 4cee 3c04 ffec moveml %fp@(-20),%d2/%a2-%a5
4b57a: 4e5e unlk %fp
...
00045c0c <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
45c0c: 4e56 ff98 linkw %fp,#-104
45c10: 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;
45c14: 2479 0005 e11e moveal 5e11e <Configuration_POSIX_API+0x34>,%a2
maximum = Configuration_POSIX_API.number_of_initialization_threads;
45c1a: 2839 0005 e11a movel 5e11a <Configuration_POSIX_API+0x30>,%d4
if ( !user_threads || maximum == 0 )
45c20: 4a8a tstl %a2
45c22: 676a beqs 45c8e <_POSIX_Threads_Initialize_user_threads_body+0x82><== NEVER TAKEN
45c24: 4a84 tstl %d4
45c26: 6766 beqs 45c8e <_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 );
45c28: 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(
45c2a: 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 )
45c2c: 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 );
45c2e: 0682 ffff ffbc addil #-68,%d2
45c34: 2c3c 0004 b580 movel #308608,%d6
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
45c3a: 4bf9 0004 b5ac lea 4b5ac <pthread_attr_setinheritsched>,%a5
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
45c40: 49f9 0004 b5e4 lea 4b5e4 <pthread_attr_setstacksize>,%a4
status = pthread_create(
45c46: 5985 subql #4,%d5
45c48: 47f9 0004 5960 lea 45960 <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 );
45c4e: 2f02 movel %d2,%sp@-
45c50: 2046 moveal %d6,%a0
45c52: 4e90 jsr %a0@
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
45c54: 4878 0002 pea 2 <DOUBLE_FLOAT>
45c58: 2f02 movel %d2,%sp@-
45c5a: 4e95 jsr %a5@
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
45c5c: 2f2a 0004 movel %a2@(4),%sp@-
45c60: 2f02 movel %d2,%sp@-
45c62: 4e94 jsr %a4@
status = pthread_create(
45c64: 42a7 clrl %sp@-
45c66: 2f12 movel %a2@,%sp@-
45c68: 2f02 movel %d2,%sp@-
45c6a: 2f05 movel %d5,%sp@-
45c6c: 4e93 jsr %a3@
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
45c6e: 4fef 0024 lea %sp@(36),%sp
45c72: 4a80 tstl %d0
45c74: 6710 beqs 45c86 <_POSIX_Threads_Initialize_user_threads_body+0x7a>
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
45c76: 2f00 movel %d0,%sp@-
45c78: 4878 0001 pea 1 <ADD>
45c7c: 4878 0002 pea 2 <DOUBLE_FLOAT>
45c80: 4eb9 0004 7924 jsr 47924 <_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++ ) {
45c86: 5283 addql #1,%d3
45c88: 508a addql #8,%a2
45c8a: b883 cmpl %d3,%d4
45c8c: 62c0 bhis 45c4e <_POSIX_Threads_Initialize_user_threads_body+0x42><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
45c8e: 4cee 3c7c ff98 moveml %fp@(-104),%d2-%d6/%a2-%a5
45c94: 4e5e unlk %fp <== NOT EXECUTED
0004a618 <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
4a618: 4e56 0000 linkw %fp,#0
4a61c: 2f0b movel %a3,%sp@-
4a61e: 2f0a movel %a2,%sp@-
4a620: 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 ];
4a624: 266a 0102 moveal %a2@(258),%a3
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
4a628: 486b 0098 pea %a3@(152)
4a62c: 4eb9 0004 b388 jsr 4b388 <_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 ) {
4a632: 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;
4a634: 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);
4a638: 4280 clrl %d0
4a63a: 1039 0005 d0d2 moveb 5d0d2 <rtems_maximum_priority>,%d0
4a640: 90ab 0088 subl %a3@(136),%d0
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
4a644: 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 ) {
4a648: 4aaa 001c tstl %a2@(28)
4a64c: 6618 bnes 4a666 <_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 ) {
4a64e: b0aa 0014 cmpl %a2@(20),%d0
4a652: 6412 bccs 4a666 <_POSIX_Threads_Sporadic_budget_TSR+0x4e>
_Thread_Change_priority( the_thread, new_priority, true );
4a654: 4878 0001 pea 1 <ADD>
4a658: 2f00 movel %d0,%sp@-
4a65a: 2f0a movel %a2,%sp@-
4a65c: 4eb9 0004 76a4 jsr 476a4 <_Thread_Change_priority>
4a662: 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 );
4a666: 486b 0090 pea %a3@(144)
4a66a: 4eb9 0004 b388 jsr 4b388 <_Timespec_To_ticks>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
4a670: 246e fff8 moveal %fp@(-8),%a2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
4a674: 588f addql #4,%sp
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
4a676: 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 );
4a67a: 47eb 00a8 lea %a3@(168),%a3
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
4a67e: 203c 0005 ea88 movel #387720,%d0
4a684: 2d4b 000c movel %a3,%fp@(12)
}
4a688: 266e fffc moveal %fp@(-4),%a3
4a68c: 2d40 0008 movel %d0,%fp@(8)
4a690: 4e5e unlk %fp
4a692: 4ef9 0004 8758 jmp 48758 <_Watchdog_Insert>
0004a698 <_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 */
4a698: 70ff moveq #-1,%d0
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
4a69a: 4e56 0000 linkw %fp,#0
4a69e: 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 */
4a6a2: 2140 0076 movel %d0,%a0@(118)
4a6a6: 4280 clrl %d0
4a6a8: 1039 0005 d0d2 moveb 5d0d2 <rtems_maximum_priority>,%d0
)
{
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4a6ae: 2268 0102 moveal %a0@(258),%a1
4a6b2: 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;
4a6b6: 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 ) {
4a6ba: 4aa8 001c tstl %a0@(28)
4a6be: 6618 bnes 4a6d8 <_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 ) {
4a6c0: b0a8 0014 cmpl %a0@(20),%d0
4a6c4: 6312 blss 4a6d8 <_POSIX_Threads_Sporadic_budget_callout+0x40><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
4a6c6: 4878 0001 pea 1 <ADD>
4a6ca: 2f00 movel %d0,%sp@-
4a6cc: 2f08 movel %a0,%sp@-
4a6ce: 4eb9 0004 76a4 jsr 476a4 <_Thread_Change_priority>
4a6d4: 4fef 000c lea %sp@(12),%sp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
4a6d8: 4e5e unlk %fp <== NOT EXECUTED
00045794 <_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)
{
45794: 4e56 0000 linkw %fp,#0
45798: 2f0a movel %a2,%sp@-
4579a: 246e 000c moveal %fp@(12),%a2
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
4579e: 52aa 0066 addql #1,%a2@(102)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
457a2: 4aaa 0052 tstl %a2@(82)
457a6: 6606 bnes 457ae <_POSIX_Timer_TSR+0x1a>
457a8: 4aaa 0056 tstl %a2@(86)
457ac: 6736 beqs 457e4 <_POSIX_Timer_TSR+0x50> <== NEVER TAKEN
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
457ae: 2f0a movel %a2,%sp@-
457b0: 4879 0004 5794 pea 45794 <_POSIX_Timer_TSR>
457b6: 2f2a 0008 movel %a2@(8),%sp@-
457ba: 2f2a 0062 movel %a2@(98),%sp@-
457be: 486a 0010 pea %a2@(16)
457c2: 4eb9 0004 af80 jsr 4af80 <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
457c8: 4fef 0014 lea %sp@(20),%sp
457cc: 4a00 tstb %d0
457ce: 672e beqs 457fe <_POSIX_Timer_TSR+0x6a> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
457d0: 486a 006a pea %a2@(106)
457d4: 4eb9 0004 6cc4 jsr 46cc4 <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
457da: 588f addql #4,%sp
457dc: 7003 moveq #3,%d0
457de: 1540 003c moveb %d0,%a2@(60)
457e2: 6006 bras 457ea <_POSIX_Timer_TSR+0x56>
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
457e4: 7004 moveq #4,%d0 <== NOT EXECUTED
457e6: 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 ) ) {
457ea: 2f2a 0042 movel %a2@(66),%sp@-
457ee: 2f2a 0038 movel %a2@(56),%sp@-
457f2: 4eb9 0004 ab74 jsr 4ab74 <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
457f8: 508f addql #8,%sp
457fa: 42aa 0066 clrl %a2@(102)
}
457fe: 246e fffc moveal %fp@(-4),%a2
45802: 4e5e unlk %fp
...
0004c3f4 <_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,
4c3f4: 4280 clrl %d0
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c3f6: 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,
4c3fa: 102e 0013 moveb %fp@(19),%d0
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c3fe: 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,
4c402: 4878 0001 pea 1 <ADD>
4c406: 2a0e movel %fp,%d5
4c408: 0685 ffff fff4 addil #-12,%d5
4c40e: 2f00 movel %d0,%sp@-
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c410: 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,
4c414: 2f05 movel %d5,%sp@-
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
4c416: 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,
4c41a: 2f02 movel %d2,%sp@-
4c41c: 2f0a movel %a2,%sp@-
4c41e: 4eb9 0004 c4cc jsr 4c4cc <_POSIX_signals_Clear_signals>
4c424: 4fef 0014 lea %sp@(20),%sp
4c428: 4a00 tstb %d0
4c42a: 6700 0092 beqw 4c4be <_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 )
4c42e: 2002 movel %d2,%d0
4c430: 2602 movel %d2,%d3
4c432: e588 lsll #2,%d0
4c434: e98b lsll #4,%d3
4c436: 9680 subl %d0,%d3
4c438: 2043 moveal %d3,%a0
4c43a: d1fc 0005 ee64 addal #388708,%a0
4c440: 7001 moveq #1,%d0
4c442: 2668 0008 moveal %a0@(8),%a3
4c446: b08b cmpl %a3,%d0
4c448: 6774 beqs 4c4be <_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;
4c44a: 2028 0004 movel %a0@(4),%d0
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
4c44e: 282a 00d0 movel %a2@(208),%d4
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
4c452: 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,
4c454: 2079 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a0
4c45a: 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;
4c45e: 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,
4c462: 4878 0028 pea 28 <OPER2+0x14>
4c466: 2f08 movel %a0,%sp@-
4c468: 486e ffcc pea %fp@(-52)
4c46c: 4eb9 0004 d37c jsr 4d37c <memcpy>
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
4c472: 4fef 000c lea %sp@(12),%sp
4c476: 41f9 0005 ee64 lea 5ee64 <_POSIX_signals_Vectors>,%a0
4c47c: 7002 moveq #2,%d0
4c47e: b0b0 3800 cmpl %a0@(00000000,%d3:l),%d0
4c482: 660e bnes 4c492 <_POSIX_signals_Check_signal+0x9e>
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
4c484: 42a7 clrl %sp@-
4c486: 2f05 movel %d5,%sp@-
4c488: 2f02 movel %d2,%sp@-
4c48a: 4e93 jsr %a3@
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
4c48c: 4fef 000c lea %sp@(12),%sp
4c490: 6006 bras 4c498 <_POSIX_signals_Check_signal+0xa4>
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
4c492: 2f02 movel %d2,%sp@-
4c494: 4e93 jsr %a3@
break;
4c496: 588f addql #4,%sp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
4c498: 4878 0028 pea 28 <OPER2+0x14>
4c49c: 486e ffcc pea %fp@(-52)
4c4a0: 2079 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a0
4c4a6: 41e8 0020 lea %a0@(32),%a0
4c4aa: 2f08 movel %a0,%sp@-
4c4ac: 4eb9 0004 d37c jsr 4d37c <memcpy>
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
4c4b2: 4fef 000c lea %sp@(12),%sp
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
4c4b6: 2544 00d0 movel %d4,%a2@(208)
return true;
4c4ba: 7001 moveq #1,%d0
4c4bc: 6002 bras 4c4c0 <_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;
4c4be: 4200 clrb %d0
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
4c4c0: 4cee 0c3c ffb4 moveml %fp@(-76),%d2-%d5/%a2-%a3
4c4c6: 4e5e unlk %fp
...
0004ca44 <_POSIX_signals_Clear_process_signals>:
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
4ca44: 203c 0000 0700 movel #1792,%d0
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
4ca4a: 4e56 0000 linkw %fp,#0
4ca4e: 222e 0008 movel %fp@(8),%d1
4ca52: 2f03 movel %d3,%sp@-
4ca54: 2f02 movel %d2,%sp@-
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
4ca56: 40c2 movew %sr,%d2
4ca58: 8082 orl %d2,%d0
4ca5a: 46c0 movew %d0,%sr
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
4ca5c: 2601 movel %d1,%d3
4ca5e: 2001 movel %d1,%d0
4ca60: 41f9 0005 ee64 lea 5ee64 <_POSIX_signals_Vectors>,%a0
4ca66: e58b lsll #2,%d3
4ca68: e988 lsll #4,%d0
4ca6a: 9083 subl %d3,%d0
4ca6c: 7602 moveq #2,%d3
4ca6e: b6b0 0800 cmpl %a0@(00000000,%d0:l),%d3
4ca72: 6614 bnes 4ca88 <_POSIX_signals_Clear_process_signals+0x44>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
4ca74: 2040 moveal %d0,%a0
4ca76: d1fc 0005 f060 addal #389216,%a0
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
4ca7c: 43f9 0005 f05c lea 5f05c <_POSIX_signals_Siginfo>,%a1
4ca82: b1f1 0800 cmpal %a1@(00000000,%d0:l),%a0
4ca86: 660e bnes 4ca96 <_POSIX_signals_Clear_process_signals+0x52><== NEVER TAKEN
4ca88: 5381 subql #1,%d1
4ca8a: 7001 moveq #1,%d0
4ca8c: e3a8 lsll %d1,%d0
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
4ca8e: 4680 notl %d0
4ca90: c1b9 0005 f058 andl %d0,5f058 <_POSIX_signals_Pending>
}
_ISR_Enable( level );
4ca96: 46c2 movew %d2,%sr
}
4ca98: 241f movel %sp@+,%d2
4ca9a: 261f movel %sp@+,%d3
4ca9c: 4e5e unlk %fp <== NOT EXECUTED
00046284 <_POSIX_signals_Get_lowest>:
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
46284: 701b moveq #27,%d0
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
46286: 4e56 fff4 linkw %fp,#-12
4628a: 48d7 001c moveml %d2-%d4,%sp@
4628e: 242e 0008 movel %fp@(8),%d2
46292: 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(
46294: 2200 movel %d0,%d1
46296: 5381 subql #1,%d1
46298: 2803 movel %d3,%d4
4629a: e3ac lsll %d1,%d4
4629c: 2204 movel %d4,%d1
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
4629e: c282 andl %d2,%d1
462a0: 6626 bnes 462c8 <_POSIX_signals_Get_lowest+0x44> <== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
462a2: 5280 addql #1,%d0
462a4: 123c 0020 moveb #32,%d1
462a8: b280 cmpl %d0,%d1
462aa: 66e8 bnes 46294 <_POSIX_signals_Get_lowest+0x10>
462ac: 7001 moveq #1,%d0
462ae: 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(
462b0: 2200 movel %d0,%d1
462b2: 5381 subql #1,%d1
462b4: 2803 movel %d3,%d4
462b6: e3ac lsll %d1,%d4
462b8: 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 ) ) {
462ba: c282 andl %d2,%d1
462bc: 660a bnes 462c8 <_POSIX_signals_Get_lowest+0x44>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
462be: 5280 addql #1,%d0
462c0: 123c 001b moveb #27,%d1
462c4: b280 cmpl %d0,%d1
462c6: 66e8 bnes 462b0 <_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;
}
462c8: 4cd7 001c moveml %sp@,%d2-%d4
462cc: 4e5e unlk %fp <== NOT EXECUTED
0005ae6c <_POSIX_signals_Unblock_thread>:
5ae6c: 7201 moveq #1,%d1
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
5ae6e: 4e56 fff4 linkw %fp,#-12
5ae72: 226e 0010 moveal %fp@(16),%a1
5ae76: 48d7 040c moveml %d2-%d3/%a2,%sp@
5ae7a: 242e 000c movel %fp@(12),%d2
5ae7e: 2002 movel %d2,%d0
5ae80: 5380 subql #1,%d0
5ae82: 246e 0008 moveal %fp@(8),%a2
5ae86: e1a9 lsll %d0,%d1
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
5ae88: 202a 0010 movel %a2@(16),%d0
5ae8c: 2600 movel %d0,%d3
5ae8e: 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 ];
5ae94: 206a 0102 moveal %a2@(258),%a0
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
5ae98: 0c83 1000 8000 cmpil #268468224,%d3
5ae9e: 6650 bnes 5aef0 <_POSIX_signals_Unblock_thread+0x84>
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
5aea0: 2001 movel %d1,%d0
5aea2: c0aa 0030 andl %a2@(48),%d0
5aea6: 660c bnes 5aeb4 <_POSIX_signals_Unblock_thread+0x48>
5aea8: 2028 00d0 movel %a0@(208),%d0
5aeac: 4680 notl %d0
5aeae: c280 andl %d0,%d1
5aeb0: 6700 00a8 beqw 5af5a <_POSIX_signals_Unblock_thread+0xee>
the_thread->Wait.return_code = EINTR;
5aeb4: 7004 moveq #4,%d0
the_info = (siginfo_t *) the_thread->Wait.return_argument;
5aeb6: 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;
5aeba: 2540 0034 movel %d0,%a2@(52)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
5aebe: 4a89 tstl %a1
5aec0: 660e bnes 5aed0 <_POSIX_signals_Unblock_thread+0x64>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
5aec2: 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;
5aec4: 2082 movel %d2,%a0@
the_info->si_code = SI_USER;
5aec6: 2141 0004 movel %d1,%a0@(4)
the_info->si_value.sival_int = 0;
5aeca: 42a8 0008 clrl %a0@(8)
5aece: 6012 bras 5aee2 <_POSIX_signals_Unblock_thread+0x76>
} else {
*the_info = *info;
5aed0: 4878 000c pea c <OPER1>
5aed4: 2f09 movel %a1,%sp@-
5aed6: 2f08 movel %a0,%sp@-
5aed8: 4eb9 0004 d37c jsr 4d37c <memcpy>
5aede: 4fef 000c lea %sp@(12),%sp
}
_Thread_queue_Extract_with_proxy( the_thread );
5aee2: 2f0a movel %a2,%sp@-
5aee4: 4eb9 0004 80d4 jsr 480d4 <_Thread_queue_Extract_with_proxy>
return true;
5aeea: 588f addql #4,%sp
5aeec: 7001 moveq #1,%d0
5aeee: 606c bras 5af5c <_POSIX_signals_Unblock_thread+0xf0>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
5aef0: 2428 00d0 movel %a0@(208),%d2
5aef4: 4682 notl %d2
5aef6: c282 andl %d2,%d1
5aef8: 6760 beqs 5af5a <_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 ) ) {
5aefa: 0800 001c btst #28,%d0
5aefe: 673e beqs 5af3e <_POSIX_signals_Unblock_thread+0xd2>
the_thread->Wait.return_code = EINTR;
5af00: 7204 moveq #4,%d1
5af02: 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);
5af06: 2200 movel %d0,%d1
5af08: 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) )
5af0e: 670c beqs 5af1c <_POSIX_signals_Unblock_thread+0xb0>
_Thread_queue_Extract_with_proxy( the_thread );
5af10: 2f0a movel %a2,%sp@-
5af12: 4eb9 0004 80d4 jsr 480d4 <_Thread_queue_Extract_with_proxy>
5af18: 588f addql #4,%sp
5af1a: 603e bras 5af5a <_POSIX_signals_Unblock_thread+0xee>
else if ( _States_Is_delaying(the_thread->current_state) ) {
5af1c: 44c0 movew %d0,%ccr
5af1e: 6a3a bpls 5af5a <_POSIX_signals_Unblock_thread+0xee><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
5af20: 486a 0048 pea %a2@(72)
5af24: 4eb9 0004 8880 jsr 48880 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
5af2a: 2f3c 1003 fff8 movel #268697592,%sp@-
5af30: 2f0a movel %a2,%sp@-
5af32: 4eb9 0004 7780 jsr 47780 <_Thread_Clear_state>
5af38: 4fef 000c lea %sp@(12),%sp
5af3c: 601c bras 5af5a <_POSIX_signals_Unblock_thread+0xee>
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
5af3e: 4a80 tstl %d0
5af40: 6618 bnes 5af5a <_POSIX_signals_Unblock_thread+0xee><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
5af42: 4ab9 0005 ee2e tstl 5ee2e <_Per_CPU_Information+0x8>
5af48: 6710 beqs 5af5a <_POSIX_signals_Unblock_thread+0xee>
5af4a: b5f9 0005 ee32 cmpal 5ee32 <_Per_CPU_Information+0xc>,%a2
5af50: 6608 bnes 5af5a <_POSIX_signals_Unblock_thread+0xee><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
5af52: 7001 moveq #1,%d0
5af54: 13c0 0005 ee3e moveb %d0,5ee3e <_Per_CPU_Information+0x18>
}
}
return false;
5af5a: 4200 clrb %d0
}
5af5c: 4cee 040c fff4 moveml %fp@(-12),%d2-%d3/%a2
5af62: 4e5e unlk %fp
...
0004637c <_Rate_monotonic_Get_status>:
bool _Rate_monotonic_Get_status(
Rate_monotonic_Control *the_period,
Rate_monotonic_Period_time_t *wall_since_last_period,
Thread_CPU_usage_t *cpu_since_last_period
)
{
4637c: 4e56 ffd4 linkw %fp,#-44
46380: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
46384: 266e 0008 moveal %fp@(8),%a3
/*
* Determine elapsed wall time since period initiated.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_TOD_Get_uptime( &uptime );
46388: 240e movel %fp,%d2
4638a: 5182 subql #8,%d2
_Timestamp_Subtract(
4638c: 45f9 0004 9bbc lea 49bbc <_Timespec_Subtract>,%a2
)
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
Timestamp_Control uptime;
#endif
Thread_Control *owning_thread = the_period->owner;
46392: 286b 0040 moveal %a3@(64),%a4
/*
* Determine elapsed wall time since period initiated.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_TOD_Get_uptime( &uptime );
46396: 2f02 movel %d2,%sp@-
46398: 4eb9 0004 7b18 jsr 47b18 <_TOD_Get_uptime>
_Timestamp_Subtract(
4639e: 2f2e 000c movel %fp@(12),%sp@-
463a2: 2f02 movel %d2,%sp@-
463a4: 486b 004c pea %a3@(76)
463a8: 4e92 jsr %a2@
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
463aa: 4fef 0010 lea %sp@(16),%sp
#endif
/*
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
463ae: 202c 0082 movel %a4@(130),%d0
463b2: 222c 0086 movel %a4@(134),%d1
463b6: 2d40 fff0 movel %d0,%fp@(-16)
463ba: 2d41 fff4 movel %d1,%fp@(-12)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
463be: b9f9 0006 0a4c cmpal 60a4c <_Per_CPU_Information+0xc>,%a4
463c4: 6644 bnes 4640a <_Rate_monotonic_Get_status+0x8e><== NEVER TAKEN
Thread_CPU_usage_t ran;
/* How much time time since last context switch */
_Timestamp_Subtract(
463c6: 260e movel %fp,%d3
463c8: 0683 ffff ffe8 addil #-24,%d3
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
463ce: 47eb 0044 lea %a3@(68),%a3
if (owning_thread == _Thread_Executing) {
Thread_CPU_usage_t ran;
/* How much time time since last context switch */
_Timestamp_Subtract(
463d2: 2f03 movel %d3,%sp@-
463d4: 2f02 movel %d2,%sp@-
463d6: 4879 0006 068e pea 6068e <_Thread_Time_of_last_context_switch>
&_Thread_Time_of_last_context_switch, &uptime, &ran
);
/* cpu usage += ran */
_Timestamp_Add_to( &used, &ran );
463dc: 5182 subql #8,%d2
if (owning_thread == _Thread_Executing) {
Thread_CPU_usage_t ran;
/* How much time time since last context switch */
_Timestamp_Subtract(
463de: 4e92 jsr %a2@
&_Thread_Time_of_last_context_switch, &uptime, &ran
);
/* cpu usage += ran */
_Timestamp_Add_to( &used, &ran );
463e0: 2f03 movel %d3,%sp@-
463e2: 2f02 movel %d2,%sp@-
463e4: 4eb9 0004 9a94 jsr 49a94 <_Timespec_Add_to>
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
463ea: 2f0b movel %a3,%sp@-
463ec: 2f02 movel %d2,%sp@-
463ee: 4eb9 0004 9b8c jsr 49b8c <_Timespec_Less_than>
463f4: 4fef 001c lea %sp@(28),%sp
463f8: 4a00 tstb %d0
463fa: 6612 bnes 4640e <_Rate_monotonic_Get_status+0x92>
return false;
/* used = current cpu usage - cpu usage at start of period */
_Timestamp_Subtract(
463fc: 2f2e 0010 movel %fp@(16),%sp@-
46400: 2f02 movel %d2,%sp@-
46402: 2f0b movel %a3,%sp@-
46404: 4e92 jsr %a2@
46406: 4fef 000c lea %sp@(12),%sp
if (used < the_period->cpu_usage_period_initiated)
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
4640a: 7001 moveq #1,%d0
4640c: 6002 bras 46410 <_Rate_monotonic_Get_status+0x94>
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
return false;
4640e: 4200 clrb %d0
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
}
46410: 4cee 1c0c ffd4 moveml %fp@(-44),%d2-%d3/%a2-%a4
46416: 4e5e unlk %fp <== NOT EXECUTED
000582d8 <_Region_Process_queue>:
*/
void _Region_Process_queue(
Region_Control *the_region
)
{
582d8: 4e56 ffe4 linkw %fp,#-28
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
582dc: 2039 0007 751c movel 7751c <_Thread_Dispatch_disable_level>,%d0
582e2: 5280 addql #1,%d0
582e4: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
582e8: 266e 0008 moveal %fp@(8),%a3
582ec: 23c0 0007 751c movel %d0,7751c <_Thread_Dispatch_disable_level>
* NOTE: Be sure to disable dispatching before unlocking the mutex
* since we do not want to open a window where a context
* switch could occur.
*/
_Thread_Disable_dispatch();
_RTEMS_Unlock_allocator();
582f2: 2f39 0007 75bc movel 775bc <_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 );
582f8: 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 );
582fa: 260b movel %a3,%d3
582fc: 0682 0000 0010 addil #16,%d2
58302: 0683 0000 0068 addil #104,%d3
58308: 4bf9 0005 375c lea 5375c <_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 );
5830e: 49f9 0005 8968 lea 58968 <_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();
58314: 4eb9 0005 2cf0 jsr 52cf0 <_API_Mutex_Unlock>
5831a: 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 );
5831c: 283c 0005 8a6c movel #363116,%d4
58322: 2f02 movel %d2,%sp@-
58324: 2044 moveal %d4,%a0
58326: 4e90 jsr %a0@
if ( the_thread == NULL )
58328: 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 );
5832a: 2440 moveal %d0,%a2
if ( the_thread == NULL )
5832c: 4a80 tstl %d0
5832e: 672c beqs 5835c <_Region_Process_queue+0x84>
58330: 42a7 clrl %sp@-
58332: 42a7 clrl %sp@-
58334: 2f2a 0024 movel %a2@(36),%sp@-
58338: 2f03 movel %d3,%sp@-
5833a: 4e95 jsr %a5@
the_segment = (void **) _Region_Allocate_segment(
the_region,
the_thread->Wait.count
);
if ( the_segment == NULL )
5833c: 4fef 0010 lea %sp@(16),%sp
58340: 4a80 tstl %d0
58342: 6718 beqs 5835c <_Region_Process_queue+0x84>
break;
*(void **)the_thread->Wait.return_argument = the_segment;
58344: 206a 0028 moveal %a2@(40),%a0
58348: 2080 movel %d0,%a0@
the_region->number_of_used_blocks += 1;
5834a: 52ab 0064 addql #1,%a3@(100)
_Thread_queue_Extract( &the_region->Wait_queue, the_thread );
5834e: 2f0a movel %a2,%sp@-
58350: 2f02 movel %d2,%sp@-
58352: 4e94 jsr %a4@
the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
}
58354: 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;
58356: 42aa 0034 clrl %a2@(52)
}
5835a: 60c6 bras 58322 <_Region_Process_queue+0x4a>
_Thread_Enable_dispatch();
}
5835c: 4cee 3c1c ffe4 moveml %fp@(-28),%d2-%d4/%a2-%a5
58362: 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();
58364: 4ef9 0005 526e jmp 5526e <_Thread_Enable_dispatch>
...
00047244 <_Scheduler_Handler_initialization>:
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
void _Scheduler_Handler_initialization(void)
{
47244: 4e56 0000 linkw %fp,#0
(*_Scheduler.Operations.initialize)();
}
47248: 4e5e unlk %fp
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
void _Scheduler_Handler_initialization(void)
{
(*_Scheduler.Operations.initialize)();
4724a: 2279 0005 d004 moveal 5d004 <_Scheduler+0x4>,%a1
47250: 4ed1 jmp %a1@
...
00047270 <_Scheduler_priority_Block>:
#include <rtems/score/thread.h>
void _Scheduler_priority_Block(
Thread_Control *the_thread
)
{
47270: 4e56 0000 linkw %fp,#0
47274: 226e 0008 moveal %fp@(8),%a1
47278: 2f0a movel %a2,%sp@-
)
{
Scheduler_priority_Per_thread *sched_info;
Chain_Control *ready;
sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info;
4727a: 2469 008a moveal %a1@(138),%a2
ready = sched_info->ready_chain;
4727e: 2052 moveal %a2@,%a0
if ( _Chain_Has_only_one_node( ready ) ) {
47280: 2028 0008 movel %a0@(8),%d0
47284: b090 cmpl %a0@,%d0
47286: 6632 bnes 472ba <_Scheduler_priority_Block+0x4a>
Chain_Node *tail = _Chain_Tail( the_chain );
47288: 2008 movel %a0,%d0
4728a: 5880 addql #4,%d0
head->next = tail;
head->previous = NULL;
4728c: 42a8 0004 clrl %a0@(4)
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
47290: 2080 movel %d0,%a0@
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
47292: 302a 000e movew %a2@(14),%d0
head->next = tail;
head->previous = NULL;
tail->previous = head;
47296: 2148 0008 movel %a0,%a0@(8)
4729a: 206a 0004 moveal %a2@(4),%a0
4729e: 3210 movew %a0@,%d1
472a0: c081 andl %d1,%d0
472a2: 3080 movew %d0,%a0@
if ( *the_priority_map->minor == 0 )
472a4: 6620 bnes 472c6 <_Scheduler_priority_Block+0x56>
_Priority_Major_bit_map &= the_priority_map->block_major;
472a6: 3039 0005 ee40 movew 5ee40 <_Priority_Major_bit_map>,%d0
472ac: 322a 000c movew %a2@(12),%d1
472b0: c081 andl %d1,%d0
472b2: 33c0 0005 ee40 movew %d0,5ee40 <_Priority_Major_bit_map>
472b8: 600c bras 472c6 <_Scheduler_priority_Block+0x56>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
472ba: 2451 moveal %a1@,%a2
previous = the_node->previous;
472bc: 2069 0004 moveal %a1@(4),%a0
next->previous = previous;
472c0: 2548 0004 movel %a0,%a2@(4)
previous->next = next;
472c4: 208a movel %a2,%a0@
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
472c6: b3f9 0005 ee36 cmpal 5ee36 <_Per_CPU_Information+0x10>,%a1
472cc: 6646 bnes 47314 <_Scheduler_priority_Block+0xa4>
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
472ce: 3039 0005 ee40 movew 5ee40 <_Priority_Major_bit_map>,%d0
472d4: 4840 swap %d0
472d6: 04c0 ff1 %d0
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
472d8: 41f9 0005 ee44 lea 5ee44 <_Priority_Bit_map>,%a0
472de: 0280 0000 ffff andil #65535,%d0
472e4: 3230 0a00 movew %a0@(00000000,%d0:l:2),%d1
472e8: 4841 swap %d1
472ea: 04c1 ff1 %d1
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
472ec: 2079 0005 d000 moveal 5d000 <_Scheduler>,%a0
return (_Priority_Bits_index( major ) << 4) +
472f2: 0281 0000 ffff andil #65535,%d1
472f8: e988 lsll #4,%d0
472fa: d081 addl %d1,%d0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
472fc: 2200 movel %d0,%d1
472fe: e988 lsll #4,%d0
47300: e589 lsll #2,%d1
47302: 9081 subl %d1,%d0
47304: d1c0 addal %d0,%a0
47306: 2018 movel %a0@+,%d0
47308: b1c0 cmpal %d0,%a0
4730a: 6602 bnes 4730e <_Scheduler_priority_Block+0x9e> <== ALWAYS TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
4730c: 4280 clrl %d0 <== NOT EXECUTED
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
4730e: 23c0 0005 ee36 movel %d0,5ee36 <_Per_CPU_Information+0x10>
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
47314: b3f9 0005 ee32 cmpal 5ee32 <_Per_CPU_Information+0xc>,%a1
4731a: 6608 bnes 47324 <_Scheduler_priority_Block+0xb4>
_Thread_Dispatch_necessary = true;
4731c: 7001 moveq #1,%d0
4731e: 13c0 0005 ee3e moveb %d0,5ee3e <_Per_CPU_Information+0x18>
}
47324: 245f moveal %sp@+,%a2
47326: 4e5e unlk %fp
...
0004741c <_Scheduler_priority_Free>:
#include <rtems/score/wkspace.h>
void _Scheduler_priority_Free (
Thread_Control *the_thread
)
{
4741c: 4e56 0000 linkw %fp,#0
_Workspace_Free( the_thread->scheduler_info );
47420: 206e 0008 moveal %fp@(8),%a0
47424: 2d68 008a 0008 movel %a0@(138),%fp@(8)
}
4742a: 4e5e unlk %fp
void _Scheduler_priority_Free (
Thread_Control *the_thread
)
{
_Workspace_Free( the_thread->scheduler_info );
4742c: 4ef9 0004 89f4 jmp 489f4 <_Workspace_Free>
...
0004749c <_Scheduler_priority_Schedule>:
#include <rtems/system.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulerpriority.h>
void _Scheduler_priority_Schedule(void)
{
4749c: 4e56 0000 linkw %fp,#0
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
474a0: 3039 0005 ee40 movew 5ee40 <_Priority_Major_bit_map>,%d0
474a6: 4840 swap %d0
474a8: 04c0 ff1 %d0
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
474aa: 41f9 0005 ee44 lea 5ee44 <_Priority_Bit_map>,%a0
474b0: 0280 0000 ffff andil #65535,%d0
474b6: 3230 0a00 movew %a0@(00000000,%d0:l:2),%d1
474ba: 4841 swap %d1
474bc: 04c1 ff1 %d1
_Scheduler_priority_Schedule_body();
}
474be: 2079 0005 d000 moveal 5d000 <_Scheduler>,%a0
return (_Priority_Bits_index( major ) << 4) +
474c4: 0281 0000 ffff andil #65535,%d1
474ca: e988 lsll #4,%d0
474cc: d081 addl %d1,%d0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
474ce: 2200 movel %d0,%d1
474d0: e988 lsll #4,%d0
474d2: e589 lsll #2,%d1
474d4: 9081 subl %d1,%d0
474d6: d1c0 addal %d0,%a0
474d8: 2018 movel %a0@+,%d0
474da: b1c0 cmpal %d0,%a0
474dc: 6602 bnes 474e0 <_Scheduler_priority_Schedule+0x44><== ALWAYS TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
474de: 4280 clrl %d0 <== NOT EXECUTED
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
474e0: 23c0 0005 ee36 movel %d0,5ee36 <_Per_CPU_Information+0x10>
474e6: 4e5e unlk %fp
...
0004627c <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
4627c: 4e56 0000 linkw %fp,#0
46280: 206e 0008 moveal %fp@(8),%a0
46284: 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();
46286: 2039 0005 f180 movel 5f180 <Configuration+0xc>,%d0
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
4628c: 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) ||
4628e: 4a88 tstl %a0
46290: 6762 beqs 462f4 <_TOD_Validate+0x78> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
46292: 243c 000f 4240 movel #1000000,%d2
46298: 4c40 2002 remul %d0,%d2,%d2
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
4629c: b4a8 0018 cmpl %a0@(24),%d2
462a0: 6352 blss 462f4 <_TOD_Validate+0x78>
(the_tod->ticks >= ticks_per_second) ||
462a2: 763b moveq #59,%d3
462a4: b6a8 0014 cmpl %a0@(20),%d3
462a8: 654a bcss 462f4 <_TOD_Validate+0x78>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
462aa: b6a8 0010 cmpl %a0@(16),%d3
462ae: 6544 bcss 462f4 <_TOD_Validate+0x78>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
462b0: 7017 moveq #23,%d0
462b2: b0a8 000c cmpl %a0@(12),%d0
462b6: 653c bcss 462f4 <_TOD_Validate+0x78>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
462b8: 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) ||
462bc: 6736 beqs 462f4 <_TOD_Validate+0x78> <== NEVER TAKEN
(the_tod->month == 0) ||
462be: 720c moveq #12,%d1
462c0: b280 cmpl %d0,%d1
462c2: 6530 bcss 462f4 <_TOD_Validate+0x78>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
462c4: 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) ||
462c6: 0c82 0000 07c3 cmpil #1987,%d2
462cc: 6326 blss 462f4 <_TOD_Validate+0x78>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
462ce: 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) ||
462d2: 6720 beqs 462f4 <_TOD_Validate+0x78> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
462d4: 163c 0003 moveb #3,%d3
462d8: 41f9 0005 e136 lea 5e136 <_TOD_Days_per_month>,%a0
462de: c483 andl %d3,%d2
462e0: 6606 bnes 462e8 <_TOD_Validate+0x6c>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
462e2: 2030 0c34 movel %a0@(00000034,%d0:l:4),%d0
462e6: 6004 bras 462ec <_TOD_Validate+0x70>
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
462e8: 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(
462ec: b081 cmpl %d1,%d0
462ee: 54c0 scc %d0
462f0: 4480 negl %d0
462f2: 6002 bras 462f6 <_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;
462f4: 4200 clrb %d0
if ( the_tod->day > days_in_month )
return false;
return true;
}
462f6: 241f movel %sp@+,%d2
462f8: 261f movel %sp@+,%d3
462fa: 4e5e unlk %fp
...
000476a4 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
476a4: 4e56 fff0 linkw %fp,#-16
476a8: 48d7 041c moveml %d2-%d4/%a2,%sp@
476ac: 246e 0008 moveal %fp@(8),%a2
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
476b0: 282a 0010 movel %a2@(16),%d4
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
476b4: 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 );
476b8: 2f0a movel %a2,%sp@-
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
476ba: 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 );
476be: 4eb9 0004 8298 jsr 48298 <_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 )
476c4: 588f addql #4,%sp
476c6: b4aa 0014 cmpl %a2@(20),%d2
476ca: 670c beqs 476d8 <_Thread_Change_priority+0x34>
_Thread_Set_priority( the_thread, new_priority );
476cc: 2f02 movel %d2,%sp@-
476ce: 2f0a movel %a2,%sp@-
476d0: 4eb9 0004 823c jsr 4823c <_Thread_Set_priority>
476d6: 508f addql #8,%sp
_ISR_Disable( level );
476d8: 203c 0000 0700 movel #1792,%d0
476de: 40c2 movew %sr,%d2
476e0: 8082 orl %d2,%d0
476e2: 46c0 movew %d0,%sr
476e4: 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;
476e6: 202a 0010 movel %a2@(16),%d0
476ea: c284 andl %d4,%d1
if ( state != STATES_TRANSIENT ) {
476ec: 7804 moveq #4,%d4
476ee: b880 cmpl %d0,%d4
476f0: 672e beqs 47720 <_Thread_Change_priority+0x7c>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
476f2: 4a81 tstl %d1
476f4: 6608 bnes 476fe <_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);
476f6: 72fb moveq #-5,%d1
476f8: c280 andl %d0,%d1
476fa: 2541 0010 movel %d1,%a2@(16)
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
476fe: 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);
47700: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( state ) ) {
47706: 676c beqs 47774 <_Thread_Change_priority+0xd0>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
47708: 2d4a 000c movel %a2,%fp@(12)
4770c: 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 );
}
47712: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
47718: 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 );
4771a: 4ef9 0004 81a0 jmp 481a0 <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
47720: 4a81 tstl %d1
47722: 661e bnes 47742 <_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 );
47724: 42aa 0010 clrl %a2@(16)
if ( prepend_it )
47728: 4a03 tstb %d3
4772a: 670a beqs 47736 <_Thread_Change_priority+0x92>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
4772c: 2f0a movel %a2,%sp@-
4772e: 2079 0005 d028 moveal 5d028 <_Scheduler+0x28>,%a0
47734: 6008 bras 4773e <_Thread_Change_priority+0x9a>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
47736: 2079 0005 d024 moveal 5d024 <_Scheduler+0x24>,%a0
4773c: 2f0a movel %a2,%sp@-
4773e: 4e90 jsr %a0@
47740: 588f addql #4,%sp
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
47742: 203c 0000 0700 movel #1792,%d0
47748: 46c2 movew %d2,%sr
4774a: 8082 orl %d2,%d0
4774c: 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();
4774e: 2079 0005 d008 moveal 5d008 <_Scheduler+0x8>,%a0
47754: 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 );
47756: 2079 0005 ee32 moveal 5ee32 <_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() &&
4775c: b1f9 0005 ee36 cmpal 5ee36 <_Per_CPU_Information+0x10>,%a0
47762: 670e beqs 47772 <_Thread_Change_priority+0xce>
47764: 4a28 0074 tstb %a0@(116)
47768: 6708 beqs 47772 <_Thread_Change_priority+0xce>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
4776a: 7801 moveq #1,%d4
4776c: 13c4 0005 ee3e moveb %d4,5ee3e <_Per_CPU_Information+0x18>
_ISR_Enable( level );
47772: 46c2 movew %d2,%sr
}
47774: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2
4777a: 4e5e unlk %fp
...
00047948 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
47948: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
4794c: 486e fffc pea %fp@(-4)
47950: 2f2e 0008 movel %fp@(8),%sp@-
47954: 4eb9 0004 7ae8 jsr 47ae8 <_Thread_Get>
switch ( location ) {
4795a: 508f addql #8,%sp
4795c: 4aae fffc tstl %fp@(-4)
47960: 661e bnes 47980 <_Thread_Delay_ended+0x38> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
47962: 2f3c 1000 0018 movel #268435480,%sp@-
47968: 2f00 movel %d0,%sp@-
4796a: 4eb9 0004 7780 jsr 47780 <_Thread_Clear_state>
47970: 508f addql #8,%sp
47972: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
47978: 5380 subql #1,%d0
4797a: 23c0 0005 e9c8 movel %d0,5e9c8 <_Thread_Dispatch_disable_level>
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
47980: 4e5e unlk %fp <== NOT EXECUTED
00047984 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
47984: 4e56 ffc8 linkw %fp,#-56
47988: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
4798c: 283c 0000 0700 movel #1792,%d4
47992: 2204 movel %d4,%d1
{
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
47994: 2479 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a2
_ISR_Disable( level );
4799a: 40c0 movew %sr,%d0
4799c: 8280 orl %d0,%d1
4799e: 46c1 movew %d1,%sr
_ISR_Enable( level );
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
479a0: 260e movel %fp,%d3
_Timestamp_Subtract(
479a2: 240e movel %fp,%d2
_ISR_Enable( level );
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
479a4: 5183 subql #8,%d3
_Timestamp_Subtract(
479a6: 0682 ffff fff0 addil #-16,%d2
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
479ac: 2e3c 0004 846c movel #296044,%d7
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
479b2: 2c3c 0004 8720 movel #296736,%d6
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
479b8: 2a3c 0004 8a44 movel #297540,%d5
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
_Context_Restore_fp( &executing->fp_context );
479be: 4bf9 0004 8bac lea 48bac <_CPU_Context_restore_fp>,%a5
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
479c4: 49f9 0004 8b8a lea 48b8a <_CPU_Context_save_fp>,%a4
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
479ca: 6000 00d4 braw 47aa0 <_Thread_Dispatch+0x11c>
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
479ce: 7201 moveq #1,%d1
479d0: 23c1 0005 e9c8 movel %d1,5e9c8 <_Thread_Dispatch_disable_level>
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
479d6: 2679 0005 ee36 moveal 5ee36 <_Per_CPU_Information+0x10>,%a3
_Thread_Dispatch_disable_level = 1;
_Thread_Dispatch_necessary = false;
479dc: 4201 clrb %d1
_Thread_Executing = heir;
479de: 23cb 0005 ee32 movel %a3,5ee32 <_Per_CPU_Information+0xc>
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
_Thread_Dispatch_necessary = false;
479e4: 13c1 0005 ee3e moveb %d1,5ee3e <_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 )
479ea: b5cb cmpal %a3,%a2
479ec: 6700 00bc beqw 47aaa <_Thread_Dispatch+0x126>
*/
#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 )
479f0: 7201 moveq #1,%d1
479f2: b2ab 007a cmpl %a3@(122),%d1
479f6: 660a bnes 47a02 <_Thread_Dispatch+0x7e>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
479f8: 41f9 0005 e980 lea 5e980 <_Thread_Ticks_per_timeslice>,%a0
479fe: 2750 0076 movel %a0@,%a3@(118)
_ISR_Enable( level );
47a02: 46c0 movew %d0,%sr
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
47a04: 2f03 movel %d3,%sp@-
47a06: 4eb9 0004 ad48 jsr 4ad48 <_TOD_Get_uptime>
_Timestamp_Subtract(
47a0c: 2f02 movel %d2,%sp@-
47a0e: 2f03 movel %d3,%sp@-
47a10: 4879 0005 ea74 pea 5ea74 <_Thread_Time_of_last_context_switch>
47a16: 4eb9 0004 84a4 jsr 484a4 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
47a1c: 2047 moveal %d7,%a0
47a1e: 2f02 movel %d2,%sp@-
47a20: 486a 0082 pea %a2@(130)
47a24: 4e90 jsr %a0@
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
47a26: 2079 0005 ea4e moveal 5ea4e <_Thread_libc_reent>,%a0
47a2c: 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;
47a30: 202e fff8 movel %fp@(-8),%d0
47a34: 222e fffc movel %fp@(-4),%d1
47a38: 23c0 0005 ea74 movel %d0,5ea74 <_Thread_Time_of_last_context_switch>
47a3e: 23c1 0005 ea78 movel %d1,5ea78 <_Thread_Time_of_last_context_switch+0x4>
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
47a44: 4a88 tstl %a0
47a46: 6708 beqs 47a50 <_Thread_Dispatch+0xcc> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
47a48: 2550 00fa movel %a0@,%a2@(250)
*_Thread_libc_reent = heir->libc_reent;
47a4c: 20ab 00fa movel %a3@(250),%a0@
}
_User_extensions_Thread_switch( executing, heir );
47a50: 2f0b movel %a3,%sp@-
47a52: 2046 moveal %d6,%a0
47a54: 2f0a movel %a2,%sp@-
47a56: 4e90 jsr %a0@
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
47a58: 486b 00c2 pea %a3@(194)
47a5c: 2045 moveal %d5,%a0
47a5e: 486a 00c2 pea %a2@(194)
47a62: 4e90 jsr %a0@
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
47a64: 4fef 0010 lea %sp@(16),%sp
47a68: 4aaa 00f6 tstl %a2@(246)
47a6c: 6724 beqs 47a92 <_Thread_Dispatch+0x10e>
#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 );
47a6e: 2079 0005 ea4a moveal 5ea4a <_Thread_Allocated_fp>,%a0
47a74: b1ca cmpal %a2,%a0
47a76: 671a beqs 47a92 <_Thread_Dispatch+0x10e>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
47a78: 4a88 tstl %a0
47a7a: 6708 beqs 47a84 <_Thread_Dispatch+0x100>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
47a7c: 4868 00f6 pea %a0@(246)
47a80: 4e94 jsr %a4@
47a82: 588f addql #4,%sp
_Context_Restore_fp( &executing->fp_context );
47a84: 486a 00f6 pea %a2@(246)
47a88: 4e95 jsr %a5@
_Thread_Allocated_fp = executing;
47a8a: 588f addql #4,%sp
47a8c: 23ca 0005 ea4a movel %a2,5ea4a <_Thread_Allocated_fp>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
47a92: 2479 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a2
_ISR_Disable( level );
47a98: 2204 movel %d4,%d1
47a9a: 40c0 movew %sr,%d0
47a9c: 8280 orl %d0,%d1
47a9e: 46c1 movew %d1,%sr
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
47aa0: 1239 0005 ee3e moveb 5ee3e <_Per_CPU_Information+0x18>,%d1
47aa6: 6600 ff26 bnew 479ce <_Thread_Dispatch+0x4a>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
47aaa: 42b9 0005 e9c8 clrl 5e9c8 <_Thread_Dispatch_disable_level>
_ISR_Enable( level );
47ab0: 46c0 movew %d0,%sr
_API_extensions_Run_postswitch();
47ab2: 4eb9 0004 60e0 jsr 460e0 <_API_extensions_Run_postswitch>
}
47ab8: 4cee 3cfc ffc8 moveml %fp@(-56),%d2-%d7/%a2-%a5
47abe: 4e5e unlk %fp <== NOT EXECUTED
0004c8e8 <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
4c8e8: 4e56 0000 linkw %fp,#0
4c8ec: 2f0a movel %a2,%sp@-
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
4c8ee: 2479 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a2
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
4c8f4: 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;
4c8f6: 222a 00a8 movel %a2@(168),%d1
_ISR_Set_level(level);
4c8fa: 40c0 movew %sr,%d0
4c8fc: e189 lsll #8,%d1
4c8fe: 0280 0000 f8ff andil #63743,%d0
4c904: 8081 orl %d1,%d0
4c906: 46c0 movew %d0,%sr
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
doneConstructors = 1;
4c908: 7001 moveq #1,%d0
level = executing->Start.isr_level;
_ISR_Set_level(level);
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
4c90a: 1439 0005 e188 moveb 5e188 <doneConstructors.3362>,%d2
doneConstructors = 1;
4c910: 13c0 0005 e188 moveb %d0,5e188 <doneConstructors.3362>
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
4c916: 4aaa 00f6 tstl %a2@(246)
4c91a: 6720 beqs 4c93c <_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 );
4c91c: 2079 0005 ea4a moveal 5ea4a <_Thread_Allocated_fp>,%a0
4c922: b1ca cmpal %a2,%a0
4c924: 6716 beqs 4c93c <_Thread_Handler+0x54>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
4c926: 4a88 tstl %a0
4c928: 670c beqs 4c936 <_Thread_Handler+0x4e>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
4c92a: 4868 00f6 pea %a0@(246)
4c92e: 4eb9 0004 8b8a jsr 48b8a <_CPU_Context_save_fp>
4c934: 588f addql #4,%sp
_Thread_Allocated_fp = executing;
4c936: 23ca 0005 ea4a movel %a2,5ea4a <_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 );
4c93c: 2f0a movel %a2,%sp@-
4c93e: 4eb9 0004 859c jsr 4859c <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
4c944: 4eb9 0004 7ac2 jsr 47ac2 <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
4c94a: 588f addql #4,%sp
4c94c: 4a02 tstb %d2
4c94e: 6606 bnes 4c956 <_Thread_Handler+0x6e>
INIT_NAME ();
4c950: 4eb9 0005 b294 jsr 5b294 <_init>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
4c956: 202a 0092 movel %a2@(146),%d0
4c95a: 6606 bnes 4c962 <_Thread_Handler+0x7a>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
4c95c: 2f2a 009a movel %a2@(154),%sp@-
4c960: 600a bras 4c96c <_Thread_Handler+0x84>
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
4c962: 7201 moveq #1,%d1
4c964: b280 cmpl %d0,%d1
4c966: 6610 bnes 4c978 <_Thread_Handler+0x90> <== NEVER TAKEN
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
4c968: 2f2a 0096 movel %a2@(150),%sp@-
4c96c: 206a 008e moveal %a2@(142),%a0
4c970: 4e90 jsr %a0@
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
4c972: 588f addql #4,%sp
4c974: 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 );
4c978: 2f0a movel %a2,%sp@-
4c97a: 4eb9 0004 85d4 jsr 485d4 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
4c980: 4878 0005 pea 5 <COMPARE>
4c984: 4878 0001 pea 1 <ADD>
4c988: 42a7 clrl %sp@-
4c98a: 4eb9 0004 6a08 jsr 46a08 <_Internal_error_Occurred>
000489f4 <_Thread_Restart>:
*/
RTEMS_INLINE_ROUTINE bool _States_Is_dormant (
States_Control the_states
)
{
return (the_states & STATES_DORMANT);
489f4: 7001 moveq #1,%d0
bool _Thread_Restart(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
489f6: 4e56 0000 linkw %fp,#0
489fa: 2f0a movel %a2,%sp@-
489fc: 246e 0008 moveal %fp@(8),%a2
48a00: c0aa 0010 andl %a2@(16),%d0
if ( !_States_Is_dormant( the_thread->current_state ) ) {
48a04: 6664 bnes 48a6a <_Thread_Restart+0x76>
_Thread_Set_transient( the_thread );
48a06: 2f0a movel %a2,%sp@-
48a08: 4eb9 0004 8ad4 jsr 48ad4 <_Thread_Set_transient>
_Thread_Reset( the_thread, pointer_argument, numeric_argument );
48a0e: 2f2e 0010 movel %fp@(16),%sp@-
48a12: 2f2e 000c movel %fp@(12),%sp@-
48a16: 2f0a movel %a2,%sp@-
48a18: 4eb9 0004 bc04 jsr 4bc04 <_Thread_Reset>
_Thread_Load_environment( the_thread );
48a1e: 2f0a movel %a2,%sp@-
48a20: 4eb9 0004 b93c jsr 4b93c <_Thread_Load_environment>
_Thread_Ready( the_thread );
48a26: 2f0a movel %a2,%sp@-
48a28: 4eb9 0004 bbd4 jsr 4bbd4 <_Thread_Ready>
_User_extensions_Thread_restart( the_thread );
48a2e: 2f0a movel %a2,%sp@-
48a30: 4eb9 0004 8f1c jsr 48f1c <_User_extensions_Thread_restart>
if ( _Thread_Is_executing ( the_thread ) )
48a36: 4fef 001c lea %sp@(28),%sp
48a3a: b5f9 0005 f95a cmpal 5f95a <_Per_CPU_Information+0xc>,%a2
48a40: 662c bnes 48a6e <_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 )
48a42: 4aaa 00f6 tstl %a2@(246)
48a46: 670c beqs 48a54 <_Thread_Restart+0x60>
_Context_Restore_fp( &_Thread_Executing->fp_context );
48a48: 486a 00f6 pea %a2@(246)
48a4c: 4eb9 0004 9428 jsr 49428 <_CPU_Context_restore_fp>
48a52: 588f addql #4,%sp
#endif
_CPU_Context_Restart_self( &_Thread_Executing->Registers );
48a54: 2079 0005 f95a moveal 5f95a <_Per_CPU_Information+0xc>,%a0
48a5a: 41e8 00c2 lea %a0@(194),%a0
48a5e: 2f08 movel %a0,%sp@-
48a60: 4eb9 0004 92d6 jsr 492d6 <_CPU_Context_Restart_self>
48a66: 588f addql #4,%sp <== NOT EXECUTED
48a68: 6004 bras 48a6e <_Thread_Restart+0x7a> <== NOT EXECUTED
_Thread_Restart_self();
return true;
}
return false;
48a6a: 4200 clrb %d0
48a6c: 6002 bras 48a70 <_Thread_Restart+0x7c>
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
_Thread_Restart_self();
return true;
48a6e: 7001 moveq #1,%d0
}
return false;
}
48a70: 246e fffc moveal %fp@(-4),%a2
48a74: 4e5e unlk %fp <== NOT EXECUTED
000483f8 <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
483f8: 4e56 0000 linkw %fp,#0
483fc: 2f0a movel %a2,%sp@-
Thread_Control *executing;
executing = _Thread_Executing;
483fe: 2479 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a2
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
48404: 4a2a 0074 tstb %a2@(116)
48408: 6758 beqs 48462 <_Thread_Tickle_timeslice+0x6a>
return;
if ( !_States_Is_ready( executing->current_state ) )
4840a: 4aaa 0010 tstl %a2@(16)
4840e: 6652 bnes 48462 <_Thread_Tickle_timeslice+0x6a>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
48410: 202a 007a movel %a2@(122),%d0
48414: 7201 moveq #1,%d1
48416: b280 cmpl %d0,%d1
48418: 6248 bhis 48462 <_Thread_Tickle_timeslice+0x6a>
4841a: 123c 0002 moveb #2,%d1
4841e: b280 cmpl %d0,%d1
48420: 640a bccs 4842c <_Thread_Tickle_timeslice+0x34>
48422: 123c 0003 moveb #3,%d1
48426: b280 cmpl %d0,%d1
48428: 6638 bnes 48462 <_Thread_Tickle_timeslice+0x6a> <== NEVER TAKEN
4842a: 6020 bras 4844c <_Thread_Tickle_timeslice+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 ) {
4842c: 202a 0076 movel %a2@(118),%d0
48430: 5380 subql #1,%d0
48432: 2540 0076 movel %d0,%a2@(118)
48436: 6e2a bgts 48462 <_Thread_Tickle_timeslice+0x6a>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
48438: 2079 0005 d00c moveal 5d00c <_Scheduler+0xc>,%a0
4843e: 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;
48440: 41f9 0005 e980 lea 5e980 <_Thread_Ticks_per_timeslice>,%a0
48446: 2550 0076 movel %a0@,%a2@(118)
4844a: 6016 bras 48462 <_Thread_Tickle_timeslice+0x6a>
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
4844c: 202a 0076 movel %a2@(118),%d0
48450: 5380 subql #1,%d0
48452: 2540 0076 movel %d0,%a2@(118)
48456: 660a bnes 48462 <_Thread_Tickle_timeslice+0x6a>
(*executing->budget_callout)( executing );
48458: 2f0a movel %a2,%sp@-
4845a: 206a 007e moveal %a2@(126),%a0
4845e: 4e90 jsr %a0@
48460: 588f addql #4,%sp
break;
#endif
}
}
48462: 246e fffc moveal %fp@(-4),%a2
48466: 4e5e unlk %fp
...
00047654 <_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 ) ) {
47654: 7202 moveq #2,%d1
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
47656: 4e56 0000 linkw %fp,#0
4765a: 202e 0010 movel %fp@(16),%d0
4765e: 2f0a movel %a2,%sp@-
47660: 246e 000c moveal %fp@(12),%a2
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
47664: 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 ) ) {
47668: b2aa 0050 cmpl %a2@(80),%d1
4766c: 6618 bnes 47686 <_Thread_blocking_operation_Cancel+0x32>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
4766e: 123c 0003 moveb #3,%d1
47672: 2541 0050 movel %d1,%a2@(80)
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
47676: 46c0 movew %d0,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
47678: 486a 0048 pea %a2@(72)
4767c: 4eb9 0004 8880 jsr 48880 <_Watchdog_Remove>
47682: 588f addql #4,%sp
47684: 6002 bras 47688 <_Thread_blocking_operation_Cancel+0x34>
} else
_ISR_Enable( level );
47686: 46c0 movew %d0,%sr
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
47688: 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
}
4768c: 246e fffc moveal %fp@(-4),%a2
47690: 203c 1003 fff8 movel #268697592,%d0
47696: 2d40 000c movel %d0,%fp@(12)
4769a: 4e5e unlk %fp
4769c: 4ef9 0004 7780 jmp 47780 <_Thread_Clear_state>
...
0004c990 <_Thread_queue_Extract_fifo>:
Thread_Control *the_thread
)
{
ISR_Level level;
_ISR_Disable( level );
4c990: 223c 0000 0700 movel #1792,%d1
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
4c996: 4e56 0000 linkw %fp,#0
4c99a: 2f0a movel %a2,%sp@-
4c99c: 246e 000c moveal %fp@(12),%a2
ISR_Level level;
_ISR_Disable( level );
4c9a0: 40c0 movew %sr,%d0
4c9a2: 8280 orl %d0,%d1
4c9a4: 46c1 movew %d1,%sr
4c9a6: 222a 0010 movel %a2@(16),%d1
4c9aa: 0281 0003 bee0 andil #245472,%d1
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
4c9b0: 660a bnes 4c9bc <_Thread_queue_Extract_fifo+0x2c>
_ISR_Enable( level );
4c9b2: 46c0 movew %d0,%sr
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
4c9b4: 246e fffc moveal %fp@(-4),%a2
4c9b8: 4e5e unlk %fp
4c9ba: 4e75 rts
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
4c9bc: 2252 moveal %a2@,%a1
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4c9be: 7202 moveq #2,%d1
previous = the_node->previous;
4c9c0: 206a 0004 moveal %a2@(4),%a0
next->previous = previous;
4c9c4: 2348 0004 movel %a0,%a1@(4)
previous->next = next;
4c9c8: 2089 movel %a1,%a0@
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
4c9ca: 42aa 0044 clrl %a2@(68)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
4c9ce: b2aa 0050 cmpl %a2@(80),%d1
4c9d2: 6704 beqs 4c9d8 <_Thread_queue_Extract_fifo+0x48>
_ISR_Enable( level );
4c9d4: 46c0 movew %d0,%sr
4c9d6: 6014 bras 4c9ec <_Thread_queue_Extract_fifo+0x5c>
4c9d8: 7203 moveq #3,%d1
4c9da: 2541 0050 movel %d1,%a2@(80)
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
4c9de: 46c0 movew %d0,%sr
(void) _Watchdog_Remove( &the_thread->Timer );
4c9e0: 486a 0048 pea %a2@(72)
4c9e4: 4eb9 0004 8880 jsr 48880 <_Watchdog_Remove>
4c9ea: 588f addql #4,%sp
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4c9ec: 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
}
4c9f0: 246e fffc moveal %fp@(-4),%a2
4c9f4: 203c 1003 fff8 movel #268697592,%d0
4c9fa: 2d40 000c movel %d0,%fp@(12)
4c9fe: 4e5e unlk %fp
4ca00: 4ef9 0004 7780 jmp 47780 <_Thread_Clear_state>
...
0004b314 <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
4b314: 4e56 0000 linkw %fp,#0
4b318: 226e 0008 moveal %fp@(8),%a1
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
4b31c: 2069 0044 moveal %a1@(68),%a0
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
4b320: 2028 0030 movel %a0@(48),%d0
4b324: 671c beqs 4b342 <_Thread_queue_Process_timeout+0x2e>
4b326: b3f9 0005 ee32 cmpal 5ee32 <_Per_CPU_Information+0xc>,%a1
4b32c: 6614 bnes 4b342 <_Thread_queue_Process_timeout+0x2e><== NEVER TAKEN
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
4b32e: 7203 moveq #3,%d1
4b330: b280 cmpl %d0,%d1
4b332: 6720 beqs 4b354 <_Thread_queue_Process_timeout+0x40>
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
4b334: 7002 moveq #2,%d0
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
4b336: 2368 003c 0034 movel %a0@(60),%a1@(52)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
4b33c: 2140 0030 movel %d0,%a0@(48)
4b340: 6012 bras 4b354 <_Thread_queue_Process_timeout+0x40>
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
4b342: 2368 003c 0034 movel %a0@(60),%a1@(52)
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
4b348: 2f09 movel %a1,%sp@-
4b34a: 2f08 movel %a0,%sp@-
4b34c: 4eb9 0004 b210 jsr 4b210 <_Thread_queue_Extract>
4b352: 508f addql #8,%sp
}
}
4b354: 4e5e unlk %fp <== NOT EXECUTED
000481a0 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
481a0: 4e56 fff0 linkw %fp,#-16
481a4: 48d7 0c04 moveml %d2/%a2-%a3,%sp@
481a8: 246e 0008 moveal %fp@(8),%a2
481ac: 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 )
481b0: 4a8a tstl %a2
481b2: 6746 beqs 481fa <_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 ) {
481b4: 7001 moveq #1,%d0
481b6: b0aa 0034 cmpl %a2@(52),%d0
481ba: 663e bnes 481fa <_Thread_queue_Requeue+0x5a> <== NEVER TAKEN
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
481bc: 303c 0700 movew #1792,%d0
481c0: 40c2 movew %sr,%d2
481c2: 8082 orl %d2,%d0
481c4: 46c0 movew %d0,%sr
481c6: 202b 0010 movel %a3@(16),%d0
481ca: 0280 0003 bee0 andil #245472,%d0
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
481d0: 6726 beqs 481f8 <_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;
481d2: 7001 moveq #1,%d0
481d4: 2540 0030 movel %d0,%a2@(48)
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
481d8: 4878 0001 pea 1 <ADD>
481dc: 2f0b movel %a3,%sp@-
481de: 2f0a movel %a2,%sp@-
481e0: 4eb9 0004 b248 jsr 4b248 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
481e6: 486e fffc pea %fp@(-4)
481ea: 2f0b movel %a3,%sp@-
481ec: 2f0a movel %a2,%sp@-
481ee: 4eb9 0004 7f88 jsr 47f88 <_Thread_queue_Enqueue_priority>
481f4: 4fef 0018 lea %sp@(24),%sp
}
_ISR_Enable( level );
481f8: 46c2 movew %d2,%sr
}
}
481fa: 4cee 0c04 fff0 moveml %fp@(-16),%d2/%a2-%a3
48200: 4e5e unlk %fp <== NOT EXECUTED
00048204 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
48204: 4e56 fffc linkw %fp,#-4
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
48208: 486e fffc pea %fp@(-4)
4820c: 2f2e 0008 movel %fp@(8),%sp@-
48210: 4eb9 0004 7ae8 jsr 47ae8 <_Thread_Get>
switch ( location ) {
48216: 508f addql #8,%sp
48218: 4aae fffc tstl %fp@(-4)
4821c: 6618 bnes 48236 <_Thread_queue_Timeout+0x32> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
4821e: 2f00 movel %d0,%sp@-
48220: 4eb9 0004 b314 jsr 4b314 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
48226: 588f addql #4,%sp
48228: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
4822e: 5380 subql #1,%d0
48230: 23c0 0005 e9c8 movel %d0,5e9c8 <_Thread_Dispatch_disable_level>
_Thread_Unnest_dispatch();
break;
}
}
48236: 4e5e unlk %fp
...
00052292 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
52292: 4e56 ffb4 linkw %fp,#-76
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
52296: 41ee ffec lea %fp@(-20),%a0
5229a: 200e movel %fp,%d0
5229c: 220e movel %fp,%d1
5229e: 5181 subql #8,%d1
522a0: 0680 ffff fff4 addil #-12,%d0
522a6: 48d7 3cfc moveml %d2-%d7/%a2-%a5,%sp@
522aa: 246e 0008 moveal %fp@(8),%a2
522ae: 260e movel %fp,%d3
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
522b0: 2808 movel %a0,%d4
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
522b2: 2c0a movel %a2,%d6
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
522b4: 0683 ffff ffe8 addil #-24,%d3
522ba: 0686 0000 0040 addil #64,%d6
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
522c0: 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 );
522c2: 240a movel %a2,%d2
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
522c4: 0685 0000 0030 addil #48,%d5
522ca: 47f9 0005 60a8 lea 560a8 <_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 );
522d0: 0682 0000 0068 addil #104,%d2
522d6: 4bf9 0005 6028 lea 56028 <_Watchdog_Adjust>,%a5
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
522dc: 2e01 movel %d1,%d7
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
522de: 2d48 ffe8 movel %a0,%fp@(-24)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
522e2: 41ea 0008 lea %a2@(8),%a0
522e6: 2d41 fff4 movel %d1,%fp@(-12)
head->previous = NULL;
522ea: 42ae fff8 clrl %fp@(-8)
tail->previous = head;
522ee: 2d40 fffc movel %d0,%fp@(-4)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
522f2: 42ae ffec clrl %fp@(-20)
tail->previous = head;
522f6: 2d43 fff0 movel %d3,%fp@(-16)
522fa: 2d48 ffe4 movel %a0,%fp@(-28)
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
522fe: 2d46 ffe0 movel %d6,%fp@(-32)
{
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
52302: 41ee fff4 lea %fp@(-12),%a0
)
{
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 );
52306: 49f9 0005 6138 lea 56138 <_Watchdog_Insert>,%a4
{
/*
* 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;
5230c: 2548 0078 movel %a0,%a2@(120)
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
52310: 2039 0007 7626 movel 77626 <_Watchdog_Ticks_since_boot>,%d0
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
52316: 222a 003c movel %a2@(60),%d1
watchdogs->last_snapshot = snapshot;
5231a: 2540 003c movel %d0,%a2@(60)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
5231e: 9081 subl %d1,%d0
52320: 2f03 movel %d3,%sp@-
52322: 2f00 movel %d0,%sp@-
52324: 2f05 movel %d5,%sp@-
52326: 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();
52328: 2039 0007 75a6 movel 775a6 <_TOD_Now>,%d0
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
5232e: 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;
52332: 222a 0074 movel %a2@(116),%d1
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
52336: b280 cmpl %d0,%d1
52338: 6412 bccs 5234c <_Timer_server_Body+0xba>
/*
* 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 );
5233a: 2f03 movel %d3,%sp@-
5233c: 2c00 movel %d0,%d6
5233e: 9c81 subl %d1,%d6
52340: 2f06 movel %d6,%sp@-
52342: 2d40 ffdc movel %d0,%fp@(-36)
52346: 2f02 movel %d2,%sp@-
52348: 4e93 jsr %a3@
5234a: 6014 bras 52360 <_Timer_server_Body+0xce>
} else if ( snapshot < last_snapshot ) {
5234c: b280 cmpl %d0,%d1
5234e: 6318 blss 52368 <_Timer_server_Body+0xd6>
/*
* 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 );
52350: 9280 subl %d0,%d1
52352: 2f01 movel %d1,%sp@-
52354: 4878 0001 pea 1 <ADD>
52358: 2d40 ffdc movel %d0,%fp@(-36)
5235c: 2f02 movel %d2,%sp@-
5235e: 4e95 jsr %a5@
52360: 202e ffdc movel %fp@(-36),%d0
52364: 4fef 000c lea %sp@(12),%sp
}
watchdogs->last_snapshot = snapshot;
52368: 2540 0074 movel %d0,%a2@(116)
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
5236c: 202a 0078 movel %a2@(120),%d0
52370: 2f00 movel %d0,%sp@-
52372: 4eb9 0005 2d84 jsr 52d84 <_Chain_Get>
if ( timer == NULL ) {
52378: 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 );
5237a: 2040 moveal %d0,%a0
if ( timer == NULL ) {
5237c: 4a80 tstl %d0
5237e: 6724 beqs 523a4 <_Timer_server_Body+0x112>
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
52380: 2028 0038 movel %a0@(56),%d0
52384: 7201 moveq #1,%d1
52386: b280 cmpl %d0,%d1
52388: 6608 bnes 52392 <_Timer_server_Body+0x100>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
5238a: 4868 0010 pea %a0@(16)
5238e: 2f05 movel %d5,%sp@-
52390: 600c bras 5239e <_Timer_server_Body+0x10c>
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
52392: 7c03 moveq #3,%d6
52394: bc80 cmpl %d0,%d6
52396: 66d4 bnes 5236c <_Timer_server_Body+0xda> <== NEVER TAKEN
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
52398: 4868 0010 pea %a0@(16)
5239c: 2f02 movel %d2,%sp@-
5239e: 4e94 jsr %a4@
523a0: 508f addql #8,%sp
523a2: 60c8 bras 5236c <_Timer_server_Body+0xda>
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
523a4: 203c 0000 0700 movel #1792,%d0
523aa: 40c1 movew %sr,%d1
523ac: 8081 orl %d1,%d0
523ae: 46c0 movew %d0,%sr
if ( _Chain_Is_empty( insert_chain ) ) {
523b0: beae fff4 cmpl %fp@(-12),%d7
523b4: 6614 bnes 523ca <_Timer_server_Body+0x138>
ts->insert_chain = NULL;
523b6: 42aa 0078 clrl %a2@(120)
_ISR_Enable( level );
523ba: 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 );
523bc: 2c3c 0000 0700 movel #1792,%d6
_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 ) ) {
523c2: b8ae ffe8 cmpl %fp@(-24),%d4
523c6: 6608 bnes 523d0 <_Timer_server_Body+0x13e>
523c8: 6042 bras 5240c <_Timer_server_Body+0x17a>
ts->insert_chain = NULL;
_ISR_Enable( level );
break;
} else {
_ISR_Enable( level );
523ca: 46c1 movew %d1,%sr
523cc: 6000 ff42 braw 52310 <_Timer_server_Body+0x7e>
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
523d0: 2006 movel %d6,%d0
523d2: 40c1 movew %sr,%d1
523d4: 8081 orl %d1,%d0
523d6: 46c0 movew %d0,%sr
initialized = false;
}
#endif
return status;
}
523d8: 206e ffe8 moveal %fp@(-24),%a0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
523dc: b888 cmpl %a0,%d4
523de: 6726 beqs 52406 <_Timer_server_Body+0x174>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
523e0: 2250 moveal %a0@,%a1
head->next = new_first;
523e2: 2d49 ffe8 movel %a1,%fp@(-24)
new_first->previous = head;
523e6: 2343 0004 movel %d3,%a1@(4)
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
523ea: 4a88 tstl %a0
523ec: 6718 beqs 52406 <_Timer_server_Body+0x174> <== NEVER TAKEN
watchdog->state = WATCHDOG_INACTIVE;
523ee: 42a8 0008 clrl %a0@(8)
_ISR_Enable( level );
523f2: 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 );
523f4: 2f28 0024 movel %a0@(36),%sp@-
523f8: 2f28 0020 movel %a0@(32),%sp@-
523fc: 2068 001c moveal %a0@(28),%a0
52400: 4e90 jsr %a0@
}
52402: 508f addql #8,%sp
52404: 60ca bras 523d0 <_Timer_server_Body+0x13e>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
52406: 46c1 movew %d1,%sr
52408: 6000 fef8 braw 52302 <_Timer_server_Body+0x70>
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
5240c: 49f9 0005 6260 lea 56260 <_Watchdog_Remove>,%a4
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
52412: 4200 clrb %d0
52414: 1540 007c moveb %d0,%a2@(124)
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
52418: 4eba fd9e jsr %pc@(521b8 <_Thread_Disable_dispatch>)
_Thread_Set_state( ts->thread, STATES_DELAYING );
5241c: 4878 0008 pea 8 <DIVIDE_BY_ZERO>
52420: 2f12 movel %a2@,%sp@-
52422: 4eb9 0005 5a84 jsr 55a84 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
52428: 2f0a movel %a2,%sp@-
5242a: 4eba fda2 jsr %pc@(521ce <_Timer_server_Reset_interval_system_watchdog>)
_Timer_server_Reset_tod_system_watchdog( ts );
5242e: 2f0a movel %a2,%sp@-
52430: 4eba fdfc jsr %pc@(5222e <_Timer_server_Reset_tod_system_watchdog>)
_Thread_Enable_dispatch();
52434: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
ts->active = true;
5243a: 7201 moveq #1,%d1
5243c: 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 );
52440: 2f2e ffe4 movel %fp@(-28),%sp@-
52444: 4e94 jsr %a4@
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
52446: 2f2e ffe0 movel %fp@(-32),%sp@-
5244a: 4e94 jsr %a4@
5244c: 4fef 0018 lea %sp@(24),%sp
52450: 6000 feb0 braw 52302 <_Timer_server_Body+0x70>
00052454 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
52454: 4e56 fff0 linkw %fp,#-16
52458: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
5245c: 246e 0008 moveal %fp@(8),%a2
52460: 266e 000c moveal %fp@(12),%a3
if ( ts->insert_chain == NULL ) {
52464: 202a 0078 movel %a2@(120),%d0
52468: 6600 00ea bnew 52554 <_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();
5246c: 4eba fd4a jsr %pc@(521b8 <_Thread_Disable_dispatch>)
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
52470: 202b 0038 movel %a3@(56),%d0
52474: 7201 moveq #1,%d1
52476: b280 cmpl %d0,%d1
52478: 665c bnes 524d6 <_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 );
5247a: 203c 0000 0700 movel #1792,%d0
52480: 40c2 movew %sr,%d2
52482: 8082 orl %d2,%d0
52484: 46c0 movew %d0,%sr
snapshot = _Watchdog_Ticks_since_boot;
52486: 2039 0007 7626 movel 77626 <_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 );
5248c: 43ea 0034 lea %a2@(52),%a1
last_snapshot = ts->Interval_watchdogs.last_snapshot;
52490: 222a 003c movel %a2@(60),%d1
initialized = false;
}
#endif
return status;
}
52494: 206a 0030 moveal %a2@(48),%a0
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
last_snapshot = ts->Interval_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
52498: b3c8 cmpal %a0,%a1
5249a: 6716 beqs 524b2 <_Timer_server_Schedule_operation_method+0x5e>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
5249c: 2240 moveal %d0,%a1
5249e: 93c1 subal %d1,%a1
delta_interval = first_watchdog->delta_interval;
524a0: 2228 0010 movel %a0@(16),%d1
if (delta_interval > delta) {
524a4: b3c1 cmpal %d1,%a1
524a6: 6404 bccs 524ac <_Timer_server_Schedule_operation_method+0x58>
delta_interval -= delta;
524a8: 9289 subl %a1,%d1
524aa: 6002 bras 524ae <_Timer_server_Schedule_operation_method+0x5a>
} else {
delta_interval = 0;
524ac: 4281 clrl %d1
}
first_watchdog->delta_interval = delta_interval;
524ae: 2141 0010 movel %d1,%a0@(16)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
524b2: 2540 003c movel %d0,%a2@(60)
_ISR_Enable( level );
524b6: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
524b8: 486b 0010 pea %a3@(16)
524bc: 486a 0030 pea %a2@(48)
524c0: 4eb9 0005 6138 jsr 56138 <_Watchdog_Insert>
if ( !ts->active ) {
524c6: 508f addql #8,%sp
524c8: 102a 007c moveb %a2@(124),%d0
524cc: 6678 bnes 52546 <_Timer_server_Schedule_operation_method+0xf2>
_Timer_server_Reset_interval_system_watchdog( ts );
524ce: 2f0a movel %a2,%sp@-
524d0: 4eba fcfc jsr %pc@(521ce <_Timer_server_Reset_interval_system_watchdog>)
524d4: 606e bras 52544 <_Timer_server_Schedule_operation_method+0xf0>
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
524d6: 7203 moveq #3,%d1
524d8: b280 cmpl %d0,%d1
524da: 666a bnes 52546 <_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 );
524dc: 203c 0000 0700 movel #1792,%d0
524e2: 40c2 movew %sr,%d2
524e4: 8082 orl %d2,%d0
524e6: 46c0 movew %d0,%sr
524e8: 200a movel %a2,%d0
524ea: 0680 0000 006c addil #108,%d0
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
524f0: 2239 0007 75a6 movel 775a6 <_TOD_Now>,%d1
last_snapshot = ts->TOD_watchdogs.last_snapshot;
524f6: 226a 0074 moveal %a2@(116),%a1
initialized = false;
}
#endif
return status;
}
524fa: 206a 0068 moveal %a2@(104),%a0
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
524fe: b088 cmpl %a0,%d0
52500: 6720 beqs 52522 <_Timer_server_Schedule_operation_method+0xce>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
52502: 2028 0010 movel %a0@(16),%d0
if ( snapshot > last_snapshot ) {
52506: b3c1 cmpal %d1,%a1
52508: 640c bccs 52516 <_Timer_server_Schedule_operation_method+0xc2>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
5250a: 2841 moveal %d1,%a4
5250c: 99c9 subal %a1,%a4
if (delta_interval > delta) {
5250e: b9c0 cmpal %d0,%a4
52510: 640a bccs 5251c <_Timer_server_Schedule_operation_method+0xc8><== NEVER TAKEN
delta_interval -= delta;
52512: 908c subl %a4,%d0
52514: 6008 bras 5251e <_Timer_server_Schedule_operation_method+0xca>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
52516: d089 addl %a1,%d0
delta_interval += delta;
52518: 9081 subl %d1,%d0
5251a: 6002 bras 5251e <_Timer_server_Schedule_operation_method+0xca>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
5251c: 4280 clrl %d0 <== NOT EXECUTED
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
5251e: 2140 0010 movel %d0,%a0@(16)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
52522: 2541 0074 movel %d1,%a2@(116)
_ISR_Enable( level );
52526: 46c2 movew %d2,%sr
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
52528: 486b 0010 pea %a3@(16)
5252c: 486a 0068 pea %a2@(104)
52530: 4eb9 0005 6138 jsr 56138 <_Watchdog_Insert>
if ( !ts->active ) {
52536: 508f addql #8,%sp
52538: 102a 007c moveb %a2@(124),%d0
5253c: 6608 bnes 52546 <_Timer_server_Schedule_operation_method+0xf2>
_Timer_server_Reset_tod_system_watchdog( ts );
5253e: 2f0a movel %a2,%sp@-
52540: 4eba fcec jsr %pc@(5222e <_Timer_server_Reset_tod_system_watchdog>)
52544: 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 );
}
}
52546: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
5254c: 4e5e unlk %fp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
5254e: 4ef9 0005 526e jmp 5526e <_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 );
52554: 202a 0078 movel %a2@(120),%d0
52558: 2d4b 000c movel %a3,%fp@(12)
}
}
5255c: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
* 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 );
52562: 2d40 0008 movel %d0,%fp@(8)
}
}
52566: 4e5e unlk %fp
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
52568: 4ef9 0005 2d24 jmp 52d24 <_Chain_Append>
0004860e <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
4860e: 4e56 fff0 linkw %fp,#-16
48612: 48d7 041c moveml %d2-%d4/%a2,%sp@
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
48616: 4282 clrl %d2
48618: 142e 000f moveb %fp@(15),%d2
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
4861c: 282e 0008 movel %fp@(8),%d4
48620: 262e 0010 movel %fp@(16),%d3
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
48624: 2479 0005 eb20 moveal 5eb20 <_User_extensions_List+0x8>,%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
4862a: 6018 bras 48644 <_User_extensions_Fatal+0x36>
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
4862c: 206a 0030 moveal %a2@(48),%a0
48630: 4a88 tstl %a0
48632: 670c beqs 48640 <_User_extensions_Fatal+0x32>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
48634: 2f03 movel %d3,%sp@-
48636: 2f02 movel %d2,%sp@-
48638: 2f04 movel %d4,%sp@-
4863a: 4e90 jsr %a0@
4863c: 4fef 000c lea %sp@(12),%sp <== NOT EXECUTED
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
48640: 246a 0004 moveal %a2@(4),%a2
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
48644: b5fc 0005 eb18 cmpal #387864,%a2
4864a: 66e0 bnes 4862c <_User_extensions_Fatal+0x1e> <== ALWAYS TAKEN
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
4864c: 4cee 041c fff0 moveml %fp@(-16),%d2-%d4/%a2 <== NOT EXECUTED
48652: 4e5e unlk %fp <== NOT EXECUTED
...
000484e8 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
484e8: 4e56 ffe8 linkw %fp,#-24
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
484ec: 203c 0005 eb1c movel #387868,%d0
484f2: 23c0 0005 eb18 movel %d0,5eb18 <_User_extensions_List>
head->previous = NULL;
tail->previous = head;
484f8: 203c 0005 eb18 movel #387864,%d0
484fe: 23c0 0005 eb20 movel %d0,5eb20 <_User_extensions_List+0x8>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
48504: 203c 0005 e9d0 movel #387536,%d0
4850a: 23c0 0005 e9cc movel %d0,5e9cc <_User_extensions_Switches_list>
head->previous = NULL;
tail->previous = head;
48510: 203c 0005 e9cc movel #387532,%d0
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
48516: 42b9 0005 eb1c clrl 5eb1c <_User_extensions_List+0x4>
4851c: 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;
48520: 2839 0005 d10a movel 5d10a <Configuration+0x36>,%d4
initial_extensions = Configuration.User_extension_table;
48526: 2639 0005 d10e movel 5d10e <Configuration+0x3a>,%d3
4852c: 42b9 0005 e9d0 clrl 5e9d0 <_User_extensions_Switches_list+0x4>
tail->previous = head;
48532: 23c0 0005 e9d4 movel %d0,5e9d4 <_User_extensions_Switches_list+0x8>
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
48538: 4a83 tstl %d3
4853a: 6754 beqs 48590 <_User_extensions_Handler_initialization+0xa8><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
4853c: 7434 moveq #52,%d2
4853e: 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;
48542: 49f9 0004 d37c lea 4d37c <memcpy>,%a4
_User_extensions_Add_set( extension );
48548: 47f9 0004 b3d8 lea 4b3d8 <_User_extensions_Add_set>,%a3
4854e: 2f02 movel %d2,%sp@-
48550: 4eb9 0004 8a0e jsr 48a0e <_Workspace_Allocate_or_fatal_error>
48556: 2440 moveal %d0,%a2
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
48558: 2f02 movel %d2,%sp@-
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
4855a: 4282 clrl %d2
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
4855c: 42a7 clrl %sp@-
4855e: 2f00 movel %d0,%sp@-
48560: 4eb9 0004 d3ec jsr 4d3ec <memset>
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
48566: 4fef 0010 lea %sp@(16),%sp
4856a: 6020 bras 4858c <_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;
4856c: 4878 0020 pea 20 <OPER2+0xc>
48570: 5282 addql #1,%d2
48572: 2f03 movel %d3,%sp@-
48574: 486a 0014 pea %a2@(20)
48578: 0683 0000 0020 addil #32,%d3
4857e: 4e94 jsr %a4@
_User_extensions_Add_set( extension );
48580: 2f0a movel %a2,%sp@-
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
48582: 45ea 0034 lea %a2@(52),%a2
48586: 4e93 jsr %a3@
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
48588: 4fef 0010 lea %sp@(16),%sp
4858c: b882 cmpl %d2,%d4
4858e: 62dc bhis 4856c <_User_extensions_Handler_initialization+0x84>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
48590: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
48596: 4e5e unlk %fp
...
00049c38 <_Watchdog_Adjust>:
Watchdog_Interval units
)
{
ISR_Level level;
_ISR_Disable( level );
49c38: 327c 0700 moveaw #1792,%a1
49c3c: 2209 movel %a1,%d1
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
49c3e: 4e56 ffe8 linkw %fp,#-24
49c42: 48d7 1c1c moveml %d2-%d4/%a2-%a4,%sp@
49c46: 266e 0008 moveal %fp@(8),%a3
49c4a: 262e 000c movel %fp@(12),%d3
49c4e: 242e 0010 movel %fp@(16),%d2
ISR_Level level;
_ISR_Disable( level );
49c52: 40c0 movew %sr,%d0
49c54: 8280 orl %d0,%d1
49c56: 46c1 movew %d1,%sr
}
}
_ISR_Enable( level );
}
49c58: 244b moveal %a3,%a2
49c5a: 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 ) ) {
49c5c: b5c8 cmpal %a0,%a2
49c5e: 674c beqs 49cac <_Watchdog_Adjust+0x74>
switch ( direction ) {
49c60: 4a83 tstl %d3
49c62: 673c beqs 49ca0 <_Watchdog_Adjust+0x68>
49c64: 7201 moveq #1,%d1
49c66: b283 cmpl %d3,%d1
49c68: 6642 bnes 49cac <_Watchdog_Adjust+0x74> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
49c6a: d5a8 0010 addl %d2,%a0@(16)
break;
49c6e: 603c bras 49cac <_Watchdog_Adjust+0x74>
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
49c70: 2053 moveal %a3@,%a0
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
49c72: 2628 0010 movel %a0@(16),%d3
49c76: b682 cmpl %d2,%d3
49c78: 6308 blss 49c82 <_Watchdog_Adjust+0x4a>
_Watchdog_First( header )->delta_interval -= units;
49c7a: 9682 subl %d2,%d3
49c7c: 2143 0010 movel %d3,%a0@(16)
break;
49c80: 602a bras 49cac <_Watchdog_Adjust+0x74>
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
49c82: 7201 moveq #1,%d1
49c84: 2141 0010 movel %d1,%a0@(16)
_ISR_Enable( level );
49c88: 46c0 movew %d0,%sr
_Watchdog_Tickle( header );
49c8a: 2f0b movel %a3,%sp@-
49c8c: 4e94 jsr %a4@
_ISR_Disable( level );
49c8e: 2204 movel %d4,%d1
49c90: 40c0 movew %sr,%d0
49c92: 8280 orl %d0,%d1
49c94: 46c1 movew %d1,%sr
if ( _Chain_Is_empty( header ) )
49c96: 588f addql #4,%sp
49c98: b5d3 cmpal %a3@,%a2
49c9a: 6710 beqs 49cac <_Watchdog_Adjust+0x74>
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
49c9c: 9483 subl %d3,%d2
49c9e: 6008 bras 49ca8 <_Watchdog_Adjust+0x70>
_Watchdog_First( header )->delta_interval = 1;
_ISR_Enable( level );
_Watchdog_Tickle( header );
49ca0: 49f9 0004 9e5c lea 49e5c <_Watchdog_Tickle>,%a4
_ISR_Disable( level );
49ca6: 2809 movel %a1,%d4
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
49ca8: 4a82 tstl %d2
49caa: 66c4 bnes 49c70 <_Watchdog_Adjust+0x38> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
49cac: 46c0 movew %d0,%sr
}
49cae: 4cee 1c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a4
49cb4: 4e5e unlk %fp <== NOT EXECUTED
00048880 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
48880: 203c 0000 0700 movel #1792,%d0
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
48886: 4e56 0000 linkw %fp,#0
4888a: 206e 0008 moveal %fp@(8),%a0
4888e: 2f0a movel %a2,%sp@-
48890: 2f02 movel %d2,%sp@-
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
48892: 40c1 movew %sr,%d1
48894: 8081 orl %d1,%d0
48896: 46c0 movew %d0,%sr
previous_state = the_watchdog->state;
48898: 2028 0008 movel %a0@(8),%d0
switch ( previous_state ) {
4889c: 7401 moveq #1,%d2
4889e: b480 cmpl %d0,%d2
488a0: 670c beqs 488ae <_Watchdog_Remove+0x2e>
488a2: 6242 bhis 488e6 <_Watchdog_Remove+0x66>
488a4: 143c 0003 moveb #3,%d2
488a8: b480 cmpl %d0,%d2
488aa: 653a bcss 488e6 <_Watchdog_Remove+0x66> <== NEVER TAKEN
488ac: 6006 bras 488b4 <_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;
488ae: 42a8 0008 clrl %a0@(8)
break;
488b2: 6032 bras 488e6 <_Watchdog_Remove+0x66>
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
488b4: 2250 moveal %a0@,%a1
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
488b6: 42a8 0008 clrl %a0@(8)
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
488ba: 4a91 tstl %a1@
488bc: 6708 beqs 488c6 <_Watchdog_Remove+0x46>
next_watchdog->delta_interval += the_watchdog->delta_interval;
488be: 2428 0010 movel %a0@(16),%d2
488c2: d5a9 0010 addl %d2,%a1@(16)
if ( _Watchdog_Sync_count )
488c6: 2479 0005 eace moveal 5eace <_Watchdog_Sync_count>,%a2
488cc: 4a8a tstl %a2
488ce: 670c beqs 488dc <_Watchdog_Remove+0x5c>
_Watchdog_Sync_level = _ISR_Nest_level;
488d0: 45f9 0005 ee2e lea 5ee2e <_Per_CPU_Information+0x8>,%a2
488d6: 23d2 0005 ea6c movel %a2@,5ea6c <_Watchdog_Sync_level>
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
488dc: 2468 0004 moveal %a0@(4),%a2
next->previous = previous;
488e0: 234a 0004 movel %a2,%a1@(4)
previous->next = next;
488e4: 2489 movel %a1,%a2@
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
488e6: 2279 0005 ead2 moveal 5ead2 <_Watchdog_Ticks_since_boot>,%a1
488ec: 2149 0018 movel %a1,%a0@(24)
_ISR_Enable( level );
488f0: 46c1 movew %d1,%sr
return( previous_state );
}
488f2: 241f movel %sp@+,%d2
488f4: 245f moveal %sp@+,%a2
488f6: 4e5e unlk %fp
...
00049830 <_Watchdog_Report_chain>:
)
{
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
49830: 203c 0000 0700 movel #1792,%d0
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
49836: 4e56 ffec linkw %fp,#-20
4983a: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
4983e: 242e 0008 movel %fp@(8),%d2
49842: 266e 000c moveal %fp@(12),%a3
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
49846: 40c3 movew %sr,%d3
49848: 8083 orl %d3,%d0
4984a: 46c0 movew %d0,%sr
printk( "Watchdog Chain: %s %p\n", name, header );
4984c: 2f0b movel %a3,%sp@-
4984e: 49f9 0004 404c lea 4404c <printk>,%a4
49854: 2f02 movel %d2,%sp@-
49856: 4879 0005 dd1a pea 5dd1a <_Status_Object_name_errors_to_status+0x14>
4985c: 4e94 jsr %a4@
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
4985e: 245b moveal %a3@+,%a2
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
49860: 4fef 000c lea %sp@(12),%sp
49864: b7ca cmpal %a2,%a3
49866: 6726 beqs 4988e <_Watchdog_Report_chain+0x5e>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
49868: 49f9 0004 98a4 lea 498a4 <_Watchdog_Report>,%a4
4986e: 2f0a movel %a2,%sp@-
49870: 42a7 clrl %sp@-
49872: 4e94 jsr %a4@
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
node != _Chain_Tail(header) ;
node = node->next )
49874: 2452 moveal %a2@,%a2
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
49876: 508f addql #8,%sp
49878: b7ca cmpal %a2,%a3
4987a: 66f2 bnes 4986e <_Watchdog_Report_chain+0x3e> <== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
4987c: 2f02 movel %d2,%sp@-
4987e: 4879 0005 dd31 pea 5dd31 <_Status_Object_name_errors_to_status+0x2b>
49884: 4eb9 0004 404c jsr 4404c <printk>
4988a: 508f addql #8,%sp
4988c: 600a bras 49898 <_Watchdog_Report_chain+0x68>
} else {
printk( "Chain is empty\n" );
4988e: 4879 0005 dd40 pea 5dd40 <_Status_Object_name_errors_to_status+0x3a>
49894: 4e94 jsr %a4@
49896: 588f addql #4,%sp
}
_ISR_Enable( level );
49898: 46c3 movew %d3,%sr
}
4989a: 4cee 1c0c ffec moveml %fp@(-20),%d2-%d3/%a2-%a4
498a0: 4e5e unlk %fp <== NOT EXECUTED
000488fc <_Watchdog_Tickle>:
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
488fc: 203c 0000 0700 movel #1792,%d0
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
48902: 4e56 ffe8 linkw %fp,#-24
48906: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
4890a: 286e 0008 moveal %fp@(8),%a4
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
4890e: 40c2 movew %sr,%d2
48910: 8082 orl %d2,%d0
48912: 46c0 movew %d0,%sr
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
48914: 264c moveal %a4,%a3
48916: 245b moveal %a3@+,%a2
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
48918: b7ca cmpal %a2,%a3
4891a: 674c beqs 48968 <_Watchdog_Tickle+0x6c>
* to be inserted has already had its delta_interval adjusted to 0, and
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
4891c: 202a 0010 movel %a2@(16),%d0
48920: 6708 beqs 4892a <_Watchdog_Tickle+0x2e>
the_watchdog->delta_interval--;
48922: 5380 subql #1,%d0
48924: 2540 0010 movel %d0,%a2@(16)
if ( the_watchdog->delta_interval != 0 )
48928: 663e bnes 48968 <_Watchdog_Tickle+0x6c>
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
4892a: 4bf9 0004 8880 lea 48880 <_Watchdog_Remove>,%a5
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
48930: 263c 0000 0700 movel #1792,%d3
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
48936: 2f0a movel %a2,%sp@-
48938: 4e95 jsr %a5@
_ISR_Enable( level );
4893a: 46c2 movew %d2,%sr
switch( watchdog_state ) {
4893c: 7202 moveq #2,%d1
4893e: 588f addql #4,%sp
48940: b280 cmpl %d0,%d1
48942: 6610 bnes 48954 <_Watchdog_Tickle+0x58> <== NEVER TAKEN
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
48944: 2f2a 0024 movel %a2@(36),%sp@-
48948: 2f2a 0020 movel %a2@(32),%sp@-
4894c: 206a 001c moveal %a2@(28),%a0
48950: 4e90 jsr %a0@
the_watchdog->id,
the_watchdog->user_data
);
break;
48952: 508f addql #8,%sp
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
48954: 2003 movel %d3,%d0
48956: 40c2 movew %sr,%d2
48958: 8082 orl %d2,%d0
4895a: 46c0 movew %d0,%sr
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
4895c: 2454 moveal %a4@,%a2
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
4895e: b7ca cmpal %a2,%a3
48960: 6706 beqs 48968 <_Watchdog_Tickle+0x6c>
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
48962: 4aaa 0010 tstl %a2@(16)
48966: 67ce beqs 48936 <_Watchdog_Tickle+0x3a>
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
48968: 46c2 movew %d2,%sr
}
4896a: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
48970: 4e5e unlk %fp <== NOT EXECUTED
00045f94 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
45f94: 4e56 ffe8 linkw %fp,#-24
45f98: 48d7 3c0c moveml %d2-%d3/%a2-%a5,%sp@
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
45f9c: 4879 0006 1378 pea 61378 <aio_request_queue>
45fa2: 49f9 0004 7078 lea 47078 <pthread_mutex_lock>,%a4
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
45fa8: 242e 0008 movel %fp@(8),%d2
45fac: 266e 000c moveal %fp@(12),%a3
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
45fb0: 4e94 jsr %a4@
if (fcntl (fildes, F_GETFD) < 0) {
45fb2: 4878 0001 pea 1 <ADD>
45fb6: 2f02 movel %d2,%sp@-
45fb8: 4eb9 0004 c2b0 jsr 4c2b0 <fcntl>
45fbe: 4fef 000c lea %sp@(12),%sp
45fc2: 4a80 tstl %d0
45fc4: 6c1c bges 45fe2 <aio_cancel+0x4e>
pthread_mutex_unlock(&aio_request_queue.mutex);
45fc6: 4879 0006 1378 pea 61378 <aio_request_queue>
45fcc: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
45fd2: 4eb9 0004 f150 jsr 4f150 <__errno>
45fd8: 7209 moveq #9,%d1
45fda: 2040 moveal %d0,%a0
45fdc: 2081 movel %d1,%a0@
45fde: 6000 00f4 braw 460d4 <aio_cancel+0x140>
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
45fe2: 4a8b tstl %a3
45fe4: 6600 00d0 bnew 460b6 <aio_cancel+0x122>
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
45fe8: 42a7 clrl %sp@-
45fea: 47f9 0004 634a lea 4634a <rtems_aio_search_fd>,%a3
45ff0: 2f02 movel %d2,%sp@-
45ff2: 4879 0006 13c0 pea 613c0 <aio_request_queue+0x48>
45ff8: 4e93 jsr %a3@
if (r_chain == NULL) {
45ffa: 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);
45ffe: 2440 moveal %d0,%a2
if (r_chain == NULL) {
46000: 4a80 tstl %d0
46002: 667a bnes 4607e <aio_cancel+0xea>
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
46004: 203c 0006 13d0 movel #398288,%d0
4600a: b0b9 0006 13cc cmpl 613cc <aio_request_queue+0x54>,%d0
46010: 6700 0136 beqw 46148 <aio_cancel+0x1b4>
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
46014: 42a7 clrl %sp@-
46016: 45f9 0004 7110 lea 47110 <pthread_mutex_unlock>,%a2
4601c: 2f02 movel %d2,%sp@-
4601e: 4879 0006 13cc pea 613cc <aio_request_queue+0x54>
46024: 4e93 jsr %a3@
if (r_chain == NULL) {
46026: 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);
4602a: 2400 movel %d0,%d2
if (r_chain == NULL) {
4602c: 6612 bnes 46040 <aio_cancel+0xac>
pthread_mutex_unlock(&aio_request_queue.mutex);
4602e: 4879 0006 1378 pea 61378 <aio_request_queue>
return AIO_ALLDONE;
46034: 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);
46038: 4e92 jsr %a2@
return AIO_ALLDONE;
4603a: 588f addql #4,%sp
4603c: 6000 014c braw 4618a <aio_cancel+0x1f6>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
46040: 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);
46042: 2602 movel %d2,%d3
46044: 0683 0000 001c addil #28,%d3
4604a: 4eb9 0004 88b8 jsr 488b8 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
46050: 2f02 movel %d2,%sp@-
46052: 4eb9 0004 669e jsr 4669e <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
46058: 2f03 movel %d3,%sp@-
4605a: 4eb9 0004 6e40 jsr 46e40 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
46060: 2f03 movel %d3,%sp@-
46062: 4eb9 0004 6b3c jsr 46b3c <pthread_cond_destroy>
free (r_chain);
46068: 2f02 movel %d2,%sp@-
4606a: 4eb9 0004 3434 jsr 43434 <free>
pthread_mutex_unlock (&aio_request_queue.mutex);
46070: 4879 0006 1378 pea 61378 <aio_request_queue>
46076: 4e92 jsr %a2@
return AIO_CANCELED;
46078: 4fef 0018 lea %sp@(24),%sp
4607c: 6032 bras 460b0 <aio_cancel+0x11c>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
4607e: 2400 movel %d0,%d2
46080: 0682 0000 001c addil #28,%d2
46086: 2f02 movel %d2,%sp@-
46088: 4e94 jsr %a4@
4608a: 2f0a movel %a2,%sp@-
4608c: 4eb9 0004 88b8 jsr 488b8 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
46092: 2f0a movel %a2,%sp@-
pthread_mutex_unlock (&r_chain->mutex);
46094: 45f9 0004 7110 lea 47110 <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);
4609a: 4eb9 0004 669e jsr 4669e <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
460a0: 2f02 movel %d2,%sp@-
460a2: 4e92 jsr %a2@
pthread_mutex_unlock (&aio_request_queue.mutex);
460a4: 4879 0006 1378 pea 61378 <aio_request_queue>
460aa: 4e92 jsr %a2@
return AIO_CANCELED;
460ac: 4fef 0014 lea %sp@(20),%sp
460b0: 4282 clrl %d2
460b2: 6000 00d6 braw 4618a <aio_cancel+0x1f6>
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
460b6: 2613 movel %a3@,%d3
460b8: b483 cmpl %d3,%d2
460ba: 6720 beqs 460dc <aio_cancel+0x148>
pthread_mutex_unlock (&aio_request_queue.mutex);
460bc: 4879 0006 1378 pea 61378 <aio_request_queue>
460c2: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
460c8: 4eb9 0004 f150 jsr 4f150 <__errno>
460ce: 2040 moveal %d0,%a0
460d0: 7016 moveq #22,%d0
460d2: 2080 movel %d0,%a0@
460d4: 588f addql #4,%sp
460d6: 74ff moveq #-1,%d2
460d8: 6000 00b0 braw 4618a <aio_cancel+0x1f6>
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
460dc: 42a7 clrl %sp@-
460de: 4bf9 0004 634a lea 4634a <rtems_aio_search_fd>,%a5
460e4: 2f03 movel %d3,%sp@-
460e6: 4879 0006 13c0 pea 613c0 <aio_request_queue+0x48>
460ec: 4e95 jsr %a5@
if (r_chain == NULL) {
460ee: 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);
460f2: 2440 moveal %d0,%a2
if (r_chain == NULL) {
460f4: 4a80 tstl %d0
460f6: 6662 bnes 4615a <aio_cancel+0x1c6>
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
460f8: 203c 0006 13d0 movel #398288,%d0
460fe: b0b9 0006 13cc cmpl 613cc <aio_request_queue+0x54>,%d0
46104: 6742 beqs 46148 <aio_cancel+0x1b4> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
46106: 42a7 clrl %sp@-
46108: 45f9 0004 7110 lea 47110 <pthread_mutex_unlock>,%a2
4610e: 2f03 movel %d3,%sp@-
46110: 4879 0006 13cc pea 613cc <aio_request_queue+0x54>
46116: 4e95 jsr %a5@
if (r_chain == NULL) {
46118: 4fef 000c lea %sp@(12),%sp
4611c: 4a80 tstl %d0
4611e: 660a bnes 4612a <aio_cancel+0x196>
pthread_mutex_unlock (&aio_request_queue.mutex);
46120: 4879 0006 1378 pea 61378 <aio_request_queue>
46126: 4e92 jsr %a2@
46128: 609e bras 460c8 <aio_cancel+0x134>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
4612a: 2f0b movel %a3,%sp@-
4612c: 2040 moveal %d0,%a0
4612e: 4868 0008 pea %a0@(8)
46132: 4eb9 0004 66f4 jsr 466f4 <rtems_aio_remove_req>
pthread_mutex_unlock (&aio_request_queue.mutex);
46138: 4879 0006 1378 pea 61378 <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);
4613e: 2400 movel %d0,%d2
pthread_mutex_unlock (&aio_request_queue.mutex);
46140: 4e92 jsr %a2@
return result;
46142: 4fef 000c lea %sp@(12),%sp
46146: 6042 bras 4618a <aio_cancel+0x1f6>
} else {
pthread_mutex_unlock (&aio_request_queue.mutex);
46148: 4879 0006 1378 pea 61378 <aio_request_queue> <== NOT EXECUTED
return AIO_ALLDONE;
4614e: 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);
46150: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
46156: 588f addql #4,%sp <== NOT EXECUTED
46158: 6030 bras 4618a <aio_cancel+0x1f6> <== NOT EXECUTED
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
4615a: 2600 movel %d0,%d3
4615c: 0683 0000 001c addil #28,%d3
46162: 2f03 movel %d3,%sp@-
46164: 4e94 jsr %a4@
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
46166: 2f0b movel %a3,%sp@-
46168: 486a 0008 pea %a2@(8)
pthread_mutex_unlock (&r_chain->mutex);
4616c: 45f9 0004 7110 lea 47110 <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);
46172: 4eb9 0004 66f4 jsr 466f4 <rtems_aio_remove_req>
46178: 2400 movel %d0,%d2
pthread_mutex_unlock (&r_chain->mutex);
4617a: 2f03 movel %d3,%sp@-
4617c: 4e92 jsr %a2@
pthread_mutex_unlock (&aio_request_queue.mutex);
4617e: 4879 0006 1378 pea 61378 <aio_request_queue>
46184: 4e92 jsr %a2@
return result;
46186: 4fef 0014 lea %sp@(20),%sp
}
return AIO_ALLDONE;
}
4618a: 2002 movel %d2,%d0
4618c: 4cee 3c0c ffe8 moveml %fp@(-24),%d2-%d3/%a2-%a5
46192: 4e5e unlk %fp
...
000461a8 <aio_fsync>:
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
461a8: 203c 0000 2000 movel #8192,%d0
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
461ae: 4e56 0000 linkw %fp,#0
461b2: 2f0a movel %a2,%sp@-
461b4: 246e 000c moveal %fp@(12),%a2
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
461b8: b0ae 0008 cmpl %fp@(8),%d0
461bc: 671a beqs 461d8 <aio_fsync+0x30>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
461be: 7216 moveq #22,%d1
461c0: 70ff moveq #-1,%d0
461c2: 2541 0030 movel %d1,%a2@(48)
461c6: 2540 0034 movel %d0,%a2@(52)
461ca: 4eb9 0004 f150 jsr 4f150 <__errno>
461d0: 2040 moveal %d0,%a0
461d2: 7016 moveq #22,%d0
461d4: 2080 movel %d0,%a0@
461d6: 607e bras 46256 <aio_fsync+0xae>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
461d8: 4878 0003 pea 3 <DIVIDE>
461dc: 2f12 movel %a2@,%sp@-
461de: 4eb9 0004 c2b0 jsr 4c2b0 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
461e4: 508f addql #8,%sp
461e6: 7203 moveq #3,%d1
461e8: c081 andl %d1,%d0
461ea: 123c 0001 moveb #1,%d1
461ee: 5380 subql #1,%d0
461f0: b280 cmpl %d0,%d1
461f2: 641a bccs 4620e <aio_fsync+0x66>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
461f4: 72ff moveq #-1,%d1
461f6: 7009 moveq #9,%d0
461f8: 2541 0034 movel %d1,%a2@(52)
461fc: 2540 0030 movel %d0,%a2@(48)
46200: 4eb9 0004 f150 jsr 4f150 <__errno>
46206: 7209 moveq #9,%d1
46208: 2040 moveal %d0,%a0
4620a: 2081 movel %d1,%a0@
4620c: 6048 bras 46256 <aio_fsync+0xae>
req = malloc (sizeof (rtems_aio_request));
4620e: 4878 0018 pea 18 <OPER2+0x4>
46212: 4eb9 0004 395c jsr 4395c <malloc>
if (req == NULL)
46218: 588f addql #4,%sp
4621a: 4a80 tstl %d0
4621c: 661c bnes 4623a <aio_fsync+0x92> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
4621e: 103c 000b moveb #11,%d0 <== NOT EXECUTED
46222: 72ff moveq #-1,%d1 <== NOT EXECUTED
46224: 2540 0030 movel %d0,%a2@(48) <== NOT EXECUTED
46228: 2541 0034 movel %d1,%a2@(52) <== NOT EXECUTED
4622c: 4eb9 0004 f150 jsr 4f150 <__errno> <== NOT EXECUTED
46232: 2040 moveal %d0,%a0 <== NOT EXECUTED
46234: 700b moveq #11,%d0 <== NOT EXECUTED
46236: 2080 movel %d0,%a0@ <== NOT EXECUTED
46238: 601c bras 46256 <aio_fsync+0xae> <== NOT EXECUTED
req->aiocbp = aiocbp;
4623a: 2040 moveal %d0,%a0
req->aiocbp->aio_lio_opcode = LIO_SYNC;
4623c: 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;
4623e: 214a 0014 movel %a2,%a0@(20)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
46242: 2541 002c movel %d1,%a2@(44)
return rtems_aio_enqueue (req);
}
46246: 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);
4624a: 2d40 0008 movel %d0,%fp@(8)
}
4624e: 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);
46250: 4ef9 0004 6750 jmp 46750 <rtems_aio_enqueue>
}
46256: 246e fffc moveal %fp@(-4),%a2
4625a: 70ff moveq #-1,%d0
4625c: 4e5e unlk %fp <== NOT EXECUTED
00046950 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
46950: 4e56 0000 linkw %fp,#0
46954: 2f0a movel %a2,%sp@-
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
46956: 4878 0003 pea 3 <DIVIDE>
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
4695a: 246e 0008 moveal %fp@(8),%a2
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
4695e: 2f12 movel %a2@,%sp@-
46960: 4eb9 0004 c2b0 jsr 4c2b0 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
46966: 508f addql #8,%sp
46968: 7203 moveq #3,%d1
4696a: c081 andl %d1,%d0
4696c: 6722 beqs 46990 <aio_read+0x40> <== NEVER TAKEN
4696e: 123c 0002 moveb #2,%d1
46972: b280 cmpl %d0,%d1
46974: 671a beqs 46990 <aio_read+0x40>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
46976: 7009 moveq #9,%d0
46978: 72ff moveq #-1,%d1
4697a: 2540 0030 movel %d0,%a2@(48)
4697e: 2541 0034 movel %d1,%a2@(52)
46982: 4eb9 0004 f150 jsr 4f150 <__errno>
46988: 2040 moveal %d0,%a0
4698a: 7009 moveq #9,%d0
4698c: 2080 movel %d0,%a0@
4698e: 606e bras 469fe <aio_read+0xae>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
46990: 4aaa 0014 tstl %a2@(20)
46994: 6606 bnes 4699c <aio_read+0x4c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
46996: 4aaa 0004 tstl %a2@(4)
4699a: 6a1a bpls 469b6 <aio_read+0x66>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
4699c: 72ff moveq #-1,%d1
4699e: 7016 moveq #22,%d0
469a0: 2541 0034 movel %d1,%a2@(52)
469a4: 2540 0030 movel %d0,%a2@(48)
469a8: 4eb9 0004 f150 jsr 4f150 <__errno>
469ae: 7216 moveq #22,%d1
469b0: 2040 moveal %d0,%a0
469b2: 2081 movel %d1,%a0@
469b4: 6048 bras 469fe <aio_read+0xae>
req = malloc (sizeof (rtems_aio_request));
469b6: 4878 0018 pea 18 <OPER2+0x4>
469ba: 4eb9 0004 395c jsr 4395c <malloc>
if (req == NULL)
469c0: 588f addql #4,%sp
469c2: 4a80 tstl %d0
469c4: 661c bnes 469e2 <aio_read+0x92> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
469c6: 103c 000b moveb #11,%d0 <== NOT EXECUTED
469ca: 72ff moveq #-1,%d1 <== NOT EXECUTED
469cc: 2540 0030 movel %d0,%a2@(48) <== NOT EXECUTED
469d0: 2541 0034 movel %d1,%a2@(52) <== NOT EXECUTED
469d4: 4eb9 0004 f150 jsr 4f150 <__errno> <== NOT EXECUTED
469da: 2040 moveal %d0,%a0 <== NOT EXECUTED
469dc: 700b moveq #11,%d0 <== NOT EXECUTED
469de: 2080 movel %d0,%a0@ <== NOT EXECUTED
469e0: 601c bras 469fe <aio_read+0xae> <== NOT EXECUTED
req->aiocbp = aiocbp;
469e2: 2040 moveal %d0,%a0
req->aiocbp->aio_lio_opcode = LIO_READ;
469e4: 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;
469e6: 214a 0014 movel %a2,%a0@(20)
req->aiocbp->aio_lio_opcode = LIO_READ;
469ea: 2541 002c movel %d1,%a2@(44)
return rtems_aio_enqueue (req);
}
469ee: 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);
469f2: 2d40 0008 movel %d0,%fp@(8)
}
469f6: 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);
469f8: 4ef9 0004 6750 jmp 46750 <rtems_aio_enqueue>
}
469fe: 246e fffc moveal %fp@(-4),%a2
46a02: 70ff moveq #-1,%d0
46a04: 4e5e unlk %fp <== NOT EXECUTED
00046a18 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
46a18: 4e56 0000 linkw %fp,#0
46a1c: 2f0a movel %a2,%sp@-
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
46a1e: 4878 0003 pea 3 <DIVIDE>
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
46a22: 246e 0008 moveal %fp@(8),%a2
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
46a26: 2f12 movel %a2@,%sp@-
46a28: 4eb9 0004 c2b0 jsr 4c2b0 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
46a2e: 508f addql #8,%sp
46a30: 7203 moveq #3,%d1
46a32: c081 andl %d1,%d0
46a34: 123c 0001 moveb #1,%d1
46a38: 5380 subql #1,%d0
46a3a: b280 cmpl %d0,%d1
46a3c: 641a bccs 46a58 <aio_write+0x40>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
46a3e: 7009 moveq #9,%d0
46a40: 72ff moveq #-1,%d1
46a42: 2540 0030 movel %d0,%a2@(48)
46a46: 2541 0034 movel %d1,%a2@(52)
46a4a: 4eb9 0004 f150 jsr 4f150 <__errno>
46a50: 2040 moveal %d0,%a0
46a52: 7009 moveq #9,%d0
46a54: 2080 movel %d0,%a0@
46a56: 606e bras 46ac6 <aio_write+0xae>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
46a58: 4aaa 0014 tstl %a2@(20)
46a5c: 6606 bnes 46a64 <aio_write+0x4c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
46a5e: 4aaa 0004 tstl %a2@(4)
46a62: 6a1a bpls 46a7e <aio_write+0x66>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
46a64: 72ff moveq #-1,%d1
46a66: 7016 moveq #22,%d0
46a68: 2541 0034 movel %d1,%a2@(52)
46a6c: 2540 0030 movel %d0,%a2@(48)
46a70: 4eb9 0004 f150 jsr 4f150 <__errno>
46a76: 7216 moveq #22,%d1
46a78: 2040 moveal %d0,%a0
46a7a: 2081 movel %d1,%a0@
46a7c: 6048 bras 46ac6 <aio_write+0xae>
req = malloc (sizeof (rtems_aio_request));
46a7e: 4878 0018 pea 18 <OPER2+0x4>
46a82: 4eb9 0004 395c jsr 4395c <malloc>
if (req == NULL)
46a88: 588f addql #4,%sp
46a8a: 4a80 tstl %d0
46a8c: 661c bnes 46aaa <aio_write+0x92> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
46a8e: 103c 000b moveb #11,%d0 <== NOT EXECUTED
46a92: 72ff moveq #-1,%d1 <== NOT EXECUTED
46a94: 2540 0030 movel %d0,%a2@(48) <== NOT EXECUTED
46a98: 2541 0034 movel %d1,%a2@(52) <== NOT EXECUTED
46a9c: 4eb9 0004 f150 jsr 4f150 <__errno> <== NOT EXECUTED
46aa2: 2040 moveal %d0,%a0 <== NOT EXECUTED
46aa4: 700b moveq #11,%d0 <== NOT EXECUTED
46aa6: 2080 movel %d0,%a0@ <== NOT EXECUTED
46aa8: 601c bras 46ac6 <aio_write+0xae> <== NOT EXECUTED
req->aiocbp = aiocbp;
46aaa: 2040 moveal %d0,%a0
req->aiocbp->aio_lio_opcode = LIO_WRITE;
46aac: 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;
46aae: 214a 0014 movel %a2,%a0@(20)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
46ab2: 2541 002c movel %d1,%a2@(44)
return rtems_aio_enqueue (req);
}
46ab6: 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);
46aba: 2d40 0008 movel %d0,%fp@(8)
}
46abe: 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);
46ac0: 4ef9 0004 6750 jmp 46750 <rtems_aio_enqueue>
}
46ac6: 246e fffc moveal %fp@(-4),%a2
46aca: 70ff moveq #-1,%d0
46acc: 4e5e unlk %fp <== NOT EXECUTED
000456cc <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
456cc: 4e56 0000 linkw %fp,#0
456d0: 222e 0008 movel %fp@(8),%d1
456d4: 202e 000c movel %fp@(12),%d0
456d8: 2f02 movel %d2,%sp@-
if ( !tp )
456da: 4a80 tstl %d0
456dc: 6608 bnes 456e6 <clock_gettime+0x1a>
rtems_set_errno_and_return_minus_one( EINVAL );
456de: 4eb9 0004 d94c jsr 4d94c <__errno>
456e4: 6042 bras 45728 <clock_gettime+0x5c>
if ( clock_id == CLOCK_REALTIME ) {
456e6: 7401 moveq #1,%d2
456e8: b481 cmpl %d1,%d2
456ea: 660a bnes 456f6 <clock_gettime+0x2a> <== NEVER TAKEN
_TOD_Get(tp);
456ec: 2f00 movel %d0,%sp@-
456ee: 4eb9 0004 7334 jsr 47334 <_TOD_Get>
456f4: 6014 bras 4570a <clock_gettime+0x3e>
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
456f6: 7404 moveq #4,%d2
456f8: b481 cmpl %d1,%d2
456fa: 6706 beqs 45702 <clock_gettime+0x36> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
456fc: 7402 moveq #2,%d2
456fe: b481 cmpl %d1,%d2
45700: 660e bnes 45710 <clock_gettime+0x44>
_TOD_Get_uptime_as_timespec( tp );
45702: 2f00 movel %d0,%sp@-
45704: 4eb9 0004 7398 jsr 47398 <_TOD_Get_uptime_as_timespec>
return 0;
4570a: 588f addql #4,%sp
4570c: 4280 clrl %d0
4570e: 6020 bras 45730 <clock_gettime+0x64>
45710: 41f9 0004 d94c lea 4d94c <__errno>,%a0
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
45716: 7003 moveq #3,%d0
45718: b081 cmpl %d1,%d0
4571a: 660a bnes 45726 <clock_gettime+0x5a>
rtems_set_errno_and_return_minus_one( ENOSYS );
4571c: 4e90 jsr %a0@
4571e: 7258 moveq #88,%d1
45720: 2040 moveal %d0,%a0
45722: 2081 movel %d1,%a0@
45724: 6008 bras 4572e <clock_gettime+0x62>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
45726: 4e90 jsr %a0@
45728: 2040 moveal %d0,%a0
4572a: 7016 moveq #22,%d0
4572c: 2080 movel %d0,%a0@
4572e: 70ff moveq #-1,%d0
return 0;
}
45730: 242e fffc movel %fp@(-4),%d2
45734: 4e5e unlk %fp <== NOT EXECUTED
00045738 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
45738: 4e56 0000 linkw %fp,#0
4573c: 222e 0008 movel %fp@(8),%d1
45740: 206e 000c moveal %fp@(12),%a0
if ( !tp )
45744: 4a88 tstl %a0
45746: 6710 beqs 45758 <clock_settime+0x20> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
45748: 7001 moveq #1,%d0
4574a: b081 cmpl %d1,%d0
4574c: 6634 bnes 45782 <clock_settime+0x4a>
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
4574e: 203c 21da e4ff movel #567993599,%d0
45754: b090 cmpl %a0@,%d0
45756: 6508 bcss 45760 <clock_settime+0x28>
rtems_set_errno_and_return_minus_one( EINVAL );
45758: 4eb9 0004 d94c jsr 4d94c <__errno>
4575e: 6048 bras 457a8 <clock_settime+0x70>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
45760: 2039 0006 0668 movel 60668 <_Thread_Dispatch_disable_level>,%d0
45766: 5280 addql #1,%d0
45768: 23c0 0006 0668 movel %d0,60668 <_Thread_Dispatch_disable_level>
_Thread_Disable_dispatch();
_TOD_Set( tp );
4576e: 2f08 movel %a0,%sp@-
45770: 4eb9 0004 73f0 jsr 473f0 <_TOD_Set>
_Thread_Enable_dispatch();
45776: 4eb9 0004 883a jsr 4883a <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
4577c: 588f addql #4,%sp
4577e: 4280 clrl %d0
45780: 602e bras 457b0 <clock_settime+0x78>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
45782: 7002 moveq #2,%d0
45784: b081 cmpl %d1,%d0
45786: 6608 bnes 45790 <clock_settime+0x58>
rtems_set_errno_and_return_minus_one( ENOSYS );
45788: 4eb9 0004 d94c jsr 4d94c <__errno>
4578e: 600e bras 4579e <clock_settime+0x66>
45790: 41f9 0004 d94c lea 4d94c <__errno>,%a0
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
45796: 7003 moveq #3,%d0
45798: b081 cmpl %d1,%d0
4579a: 660a bnes 457a6 <clock_settime+0x6e>
rtems_set_errno_and_return_minus_one( ENOSYS );
4579c: 4e90 jsr %a0@
4579e: 2040 moveal %d0,%a0
457a0: 7258 moveq #88,%d1
457a2: 2081 movel %d1,%a0@
457a4: 6008 bras 457ae <clock_settime+0x76>
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
457a6: 4e90 jsr %a0@
457a8: 2040 moveal %d0,%a0
457aa: 7016 moveq #22,%d0
457ac: 2080 movel %d0,%a0@
457ae: 70ff moveq #-1,%d0
return 0;
}
457b0: 4e5e unlk %fp <== NOT EXECUTED
0005ac38 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
5ac38: 4e56 ffd0 linkw %fp,#-48
5ac3c: 48d7 1cfc moveml %d2-%d7/%a2-%a4,%sp@
5ac40: 242e 000c movel %fp@(12),%d2
5ac44: 246e 0010 moveal %fp@(16),%a2
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
5ac48: 4eb9 0005 a85c jsr 5a85c <getpid>
5ac4e: b0ae 0008 cmpl %fp@(8),%d0
5ac52: 6710 beqs 5ac64 <killinfo+0x2c>
rtems_set_errno_and_return_minus_one( ESRCH );
5ac54: 4eb9 0004 cad0 jsr 4cad0 <__errno>
5ac5a: 7403 moveq #3,%d2
5ac5c: 2040 moveal %d0,%a0
5ac5e: 2082 movel %d2,%a0@
5ac60: 6000 01ae braw 5ae10 <killinfo+0x1d8>
/*
* Validate the signal passed.
*/
if ( !sig )
5ac64: 4a82 tstl %d2
5ac66: 670a beqs 5ac72 <killinfo+0x3a>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
5ac68: 2202 movel %d2,%d1
5ac6a: 5381 subql #1,%d1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
5ac6c: 701f moveq #31,%d0
5ac6e: b081 cmpl %d1,%d0
5ac70: 6410 bccs 5ac82 <killinfo+0x4a>
rtems_set_errno_and_return_minus_one( EINVAL );
5ac72: 4eb9 0004 cad0 jsr 4cad0 <__errno>
5ac78: 7216 moveq #22,%d1
5ac7a: 2040 moveal %d0,%a0
5ac7c: 2081 movel %d1,%a0@
5ac7e: 6000 0190 braw 5ae10 <killinfo+0x1d8>
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
5ac82: 2602 movel %d2,%d3
5ac84: 2002 movel %d2,%d0
5ac86: e58b lsll #2,%d3
5ac88: e988 lsll #4,%d0
5ac8a: 9083 subl %d3,%d0
5ac8c: 0680 0005 ee6c addil #388716,%d0
5ac92: 7601 moveq #1,%d3
5ac94: 2040 moveal %d0,%a0
5ac96: b690 cmpl %a0@,%d3
5ac98: 6700 01a6 beqw 5ae40 <killinfo+0x208>
/*
* 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 ) )
5ac9c: 7008 moveq #8,%d0
5ac9e: b082 cmpl %d2,%d0
5aca0: 6710 beqs 5acb2 <killinfo+0x7a>
5aca2: 163c 0004 moveb #4,%d3
5aca6: b682 cmpl %d2,%d3
5aca8: 6708 beqs 5acb2 <killinfo+0x7a>
5acaa: 103c 000b moveb #11,%d0
5acae: b082 cmpl %d2,%d0
5acb0: 6616 bnes 5acc8 <killinfo+0x90>
return pthread_kill( pthread_self(), sig );
5acb2: 4eb9 0005 b014 jsr 5b014 <pthread_self>
5acb8: 2f02 movel %d2,%sp@-
5acba: 2f00 movel %d0,%sp@-
5acbc: 4eb9 0005 af68 jsr 5af68 <pthread_kill>
5acc2: 508f addql #8,%sp
5acc4: 6000 017c braw 5ae42 <killinfo+0x20a>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
5acc8: 7601 moveq #1,%d3
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
5acca: 7001 moveq #1,%d0
5accc: e3ab lsll %d1,%d3
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
5acce: 2d42 fff4 movel %d2,%fp@(-12)
siginfo->si_code = SI_USER;
5acd2: 2d40 fff8 movel %d0,%fp@(-8)
if ( !value ) {
5acd6: 4a8a tstl %a2
5acd8: 6606 bnes 5ace0 <killinfo+0xa8>
siginfo->si_value.sival_int = 0;
5acda: 42ae fffc clrl %fp@(-4)
5acde: 6004 bras 5ace4 <killinfo+0xac>
} else {
siginfo->si_value = *value;
5ace0: 2d52 fffc movel %a2@,%fp@(-4)
5ace4: 2039 0005 e9c8 movel 5e9c8 <_Thread_Dispatch_disable_level>,%d0
5acea: 5280 addql #1,%d0
5acec: 23c0 0005 e9c8 movel %d0,5e9c8 <_Thread_Dispatch_disable_level>
/*
* 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;
5acf2: 2079 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a0
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
5acf8: 2268 0102 moveal %a0@(258),%a1
5acfc: 2029 00d0 movel %a1@(208),%d0
5ad00: 4680 notl %d0
5ad02: c083 andl %d3,%d0
5ad04: 6600 00ae bnew 5adb4 <killinfo+0x17c>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
5ad08: 2279 0005 eff0 moveal 5eff0 <_POSIX_signals_Wait_queue>,%a1
/* 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 );
5ad0e: 601e bras 5ad2e <killinfo+0xf6>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
5ad10: 2003 movel %d3,%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;
5ad12: 2049 moveal %a1,%a0
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
5ad14: c0a9 0030 andl %a1@(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 ];
5ad18: 2469 0102 moveal %a1@(258),%a2
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
5ad1c: 6600 0096 bnew 5adb4 <killinfo+0x17c>
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
5ad20: 202a 00d0 movel %a2@(208),%d0
5ad24: 4680 notl %d0
5ad26: c083 andl %d3,%d0
5ad28: 6600 008a bnew 5adb4 <killinfo+0x17c>
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 ) {
5ad2c: 2251 moveal %a1@,%a1
/* 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 );
5ad2e: b3fc 0005 eff4 cmpal #389108,%a1
5ad34: 66da bnes 5ad10 <killinfo+0xd8>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
5ad36: 4280 clrl %d0
5ad38: 1039 0005 d0d2 moveb 5d0d2 <rtems_maximum_priority>,%d0
5ad3e: 45f9 0005 e98c lea 5e98c <_Objects_Information_table+0x8>,%a2
5ad44: 5280 addql #1,%d0
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
5ad46: 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 ] )
5ad48: 225a moveal %a2@+,%a1
5ad4a: 4a89 tstl %a1
5ad4c: 675a beqs 5ada8 <killinfo+0x170> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
5ad4e: 2269 0004 moveal %a1@(4),%a1
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
5ad52: 4287 clrl %d7
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
5ad54: 7801 moveq #1,%d4
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
5ad56: 2669 0018 moveal %a1@(24),%a3
5ad5a: 588b addql #4,%a3
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
5ad5c: 3e29 000e movew %a1@(14),%d7
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
5ad60: 6042 bras 5ada4 <killinfo+0x16c>
the_thread = (Thread_Control *) object_table[ index ];
5ad62: 225b moveal %a3@+,%a1
if ( !the_thread )
5ad64: 4a89 tstl %a1
5ad66: 673a beqs 5ada2 <killinfo+0x16a>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
5ad68: 2229 0014 movel %a1@(20),%d1
5ad6c: b081 cmpl %d1,%d0
5ad6e: 6532 bcss 5ada2 <killinfo+0x16a>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
5ad70: 2869 0102 moveal %a1@(258),%a4
5ad74: 2a2c 00d0 movel %a4@(208),%d5
5ad78: 4685 notl %d5
5ad7a: ca83 andl %d3,%d5
5ad7c: 6724 beqs 5ada2 <killinfo+0x16a>
*
* 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 ) {
5ad7e: b081 cmpl %d1,%d0
5ad80: 621c bhis 5ad9e <killinfo+0x166>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
5ad82: 4a88 tstl %a0
5ad84: 671c beqs 5ada2 <killinfo+0x16a> <== NEVER TAKEN
5ad86: 2c28 0010 movel %a0@(16),%d6
5ad8a: 6716 beqs 5ada2 <killinfo+0x16a> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
5ad8c: 2a29 0010 movel %a1@(16),%d5
5ad90: 670c beqs 5ad9e <killinfo+0x166>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
5ad92: 0806 001c btst #28,%d6
5ad96: 660a bnes 5ada2 <killinfo+0x16a>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
5ad98: 0805 001c btst #28,%d5
5ad9c: 6704 beqs 5ada2 <killinfo+0x16a>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
5ad9e: 2001 movel %d1,%d0
5ada0: 2049 moveal %a1,%a0
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
5ada2: 5284 addql #1,%d4
5ada4: be84 cmpl %d4,%d7
5ada6: 64ba bccs 5ad62 <killinfo+0x12a>
* + 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++) {
5ada8: b5fc 0005 e994 cmpal #387476,%a2
5adae: 6698 bnes 5ad48 <killinfo+0x110>
}
}
}
}
if ( interested ) {
5adb0: 4a88 tstl %a0
5adb2: 6716 beqs 5adca <killinfo+0x192>
/*
* 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 ) ) {
5adb4: 486e fff4 pea %fp@(-12)
5adb8: 2f02 movel %d2,%sp@-
5adba: 2f08 movel %a0,%sp@-
5adbc: 4eb9 0005 ae6c jsr 5ae6c <_POSIX_signals_Unblock_thread>
5adc2: 4fef 000c lea %sp@(12),%sp
5adc6: 4a00 tstb %d0
5adc8: 6670 bnes 5ae3a <killinfo+0x202>
/*
* 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 );
5adca: 2f03 movel %d3,%sp@-
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
5adcc: 7602 moveq #2,%d3
/*
* 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 );
5adce: 4eb9 0005 ae4c jsr 5ae4c <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
5add4: 588f addql #4,%sp
5add6: 2002 movel %d2,%d0
5add8: 41f9 0005 ee64 lea 5ee64 <_POSIX_signals_Vectors>,%a0
5adde: e588 lsll #2,%d0
5ade0: e98a lsll #4,%d2
5ade2: 9480 subl %d0,%d2
5ade4: b6b0 2800 cmpl %a0@(00000000,%d2:l),%d3
5ade8: 6650 bnes 5ae3a <killinfo+0x202>
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
5adea: 4879 0005 efe4 pea 5efe4 <_POSIX_signals_Inactive_siginfo>
5adf0: 4eb9 0004 6268 jsr 46268 <_Chain_Get>
if ( !psiginfo ) {
5adf6: 588f addql #4,%sp
_POSIX_signals_Set_process_signals( mask );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
5adf8: 2440 moveal %d0,%a2
if ( !psiginfo ) {
5adfa: 4a80 tstl %d0
5adfc: 6616 bnes 5ae14 <killinfo+0x1dc>
_Thread_Enable_dispatch();
5adfe: 4eb9 0004 7ac2 jsr 47ac2 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
5ae04: 4eb9 0004 cad0 jsr 4cad0 <__errno>
5ae0a: 2040 moveal %d0,%a0
5ae0c: 700b moveq #11,%d0
5ae0e: 2080 movel %d0,%a0@
5ae10: 70ff moveq #-1,%d0
5ae12: 602e bras 5ae42 <killinfo+0x20a>
}
psiginfo->Info = *siginfo;
5ae14: 4878 000c pea c <OPER1>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
5ae18: 0682 0005 f05c addil #389212,%d2
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
5ae1e: 486e fff4 pea %fp@(-12)
5ae22: 486a 0008 pea %a2@(8)
5ae26: 4eb9 0004 d37c jsr 4d37c <memcpy>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
5ae2c: 2f0a movel %a2,%sp@-
5ae2e: 2f02 movel %d2,%sp@-
5ae30: 4eb9 0004 6208 jsr 46208 <_Chain_Append>
5ae36: 4fef 0014 lea %sp@(20),%sp
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
5ae3a: 4eb9 0004 7ac2 jsr 47ac2 <_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;
5ae40: 4280 clrl %d0
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
5ae42: 4cee 1cfc ffd0 moveml %fp@(-48),%d2-%d7/%a2-%a4
5ae48: 4e5e unlk %fp <== NOT EXECUTED
0004a56c <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
4a56c: 4e56 0000 linkw %fp,#0
4a570: 206e 0008 moveal %fp@(8),%a0
4a574: 222e 000c movel %fp@(12),%d1
4a578: 2f02 movel %d2,%sp@-
if ( !attr || !attr->is_initialized )
4a57a: 4a88 tstl %a0
4a57c: 671e beqs 4a59c <pthread_attr_setschedpolicy+0x30>
4a57e: 4a90 tstl %a0@
4a580: 671a beqs 4a59c <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
4a582: 7004 moveq #4,%d0
4a584: b081 cmpl %d1,%d0
4a586: 6518 bcss 4a5a0 <pthread_attr_setschedpolicy+0x34>
4a588: 103c 0001 moveb #1,%d0
4a58c: 7417 moveq #23,%d2
4a58e: e3a8 lsll %d1,%d0
4a590: c082 andl %d2,%d0
4a592: 670c beqs 4a5a0 <pthread_attr_setschedpolicy+0x34><== NEVER TAKEN
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
4a594: 2141 0014 movel %d1,%a0@(20)
return 0;
4a598: 4280 clrl %d0
4a59a: 600a bras 4a5a6 <pthread_attr_setschedpolicy+0x3a>
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
4a59c: 7016 moveq #22,%d0
4a59e: 6006 bras 4a5a6 <pthread_attr_setschedpolicy+0x3a>
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
4a5a0: 203c 0000 0086 movel #134,%d0
}
}
4a5a6: 241f movel %sp@+,%d2
4a5a8: 4e5e unlk %fp <== NOT EXECUTED
00045c0c <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
45c0c: 4e56 ffdc linkw %fp,#-36
45c10: 206e 000c moveal %fp@(12),%a0
45c14: 48d7 1c0c moveml %d2-%d3/%a2-%a4,%sp@
45c18: 246e 0008 moveal %fp@(8),%a2
45c1c: 242e 0010 movel %fp@(16),%d2
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
45c20: 4a8a tstl %a2
45c22: 6700 008e beqw 45cb2 <pthread_barrier_init+0xa6>
return EINVAL;
if ( count == 0 )
45c26: 4a82 tstl %d2
45c28: 6700 0088 beqw 45cb2 <pthread_barrier_init+0xa6>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
45c2c: 4a88 tstl %a0
45c2e: 6614 bnes 45c44 <pthread_barrier_init+0x38>
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
45c30: 260e movel %fp,%d3
45c32: 0683 ffff fff0 addil #-16,%d3
45c38: 2f03 movel %d3,%sp@-
45c3a: 4eb9 0004 5b50 jsr 45b50 <pthread_barrierattr_init>
45c40: 588f addql #4,%sp
the_attr = &my_attr;
45c42: 2043 moveal %d3,%a0
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
45c44: 4a90 tstl %a0@
45c46: 676a beqs 45cb2 <pthread_barrier_init+0xa6>
return EINVAL;
switch ( the_attr->process_shared ) {
45c48: 4aa8 0004 tstl %a0@(4)
45c4c: 6664 bnes 45cb2 <pthread_barrier_init+0xa6> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
45c4e: 2039 0005 ffac movel 5ffac <_Thread_Dispatch_disable_level>,%d0
45c54: 5280 addql #1,%d0
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
45c56: 42ae fff8 clrl %fp@(-8)
the_attributes.maximum_count = count;
45c5a: 2d42 fffc movel %d2,%fp@(-4)
45c5e: 23c0 0005 ffac movel %d0,5ffac <_Thread_Dispatch_disable_level>
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
_Objects_Allocate( &_POSIX_Barrier_Information );
45c64: 4879 0006 02aa pea 602aa <_POSIX_Barrier_Information>
45c6a: 49f9 0004 8ab2 lea 48ab2 <_Thread_Enable_dispatch>,%a4
45c70: 4eb9 0004 7b28 jsr 47b28 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
45c76: 588f addql #4,%sp
45c78: 2640 moveal %d0,%a3
45c7a: 4a80 tstl %d0
45c7c: 6606 bnes 45c84 <pthread_barrier_init+0x78>
_Thread_Enable_dispatch();
45c7e: 4e94 jsr %a4@
return EAGAIN;
45c80: 700b moveq #11,%d0
45c82: 6030 bras 45cb4 <pthread_barrier_init+0xa8>
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
45c84: 486e fff8 pea %fp@(-8)
45c88: 486b 0010 pea %a3@(16)
45c8c: 4eb9 0004 7230 jsr 47230 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
45c92: 202b 0008 movel %a3@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
45c96: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
45c98: 2079 0006 02c2 moveal 602c2 <_POSIX_Barrier_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
45c9e: 3200 movew %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
45ca0: 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;
45ca4: 42ab 000c clrl %a3@(12)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
45ca8: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
45caa: 4e94 jsr %a4@
return 0;
45cac: 508f addql #8,%sp
45cae: 4280 clrl %d0
45cb0: 6002 bras 45cb4 <pthread_barrier_init+0xa8>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
45cb2: 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;
}
45cb4: 4cee 1c0c ffdc moveml %fp@(-36),%d2-%d3/%a2-%a4
45cba: 4e5e unlk %fp
...
00045630 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
45630: 4e56 0000 linkw %fp,#0
45634: 2f03 movel %d3,%sp@-
45636: 262e 000c movel %fp@(12),%d3
4563a: 2f02 movel %d2,%sp@-
4563c: 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 )
45640: 6754 beqs 45696 <pthread_cleanup_push+0x66>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
45642: 2039 0005 f8f2 movel 5f8f2 <_Thread_Dispatch_disable_level>,%d0
45648: 5280 addql #1,%d0
4564a: 23c0 0005 f8f2 movel %d0,5f8f2 <_Thread_Dispatch_disable_level>
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
45650: 4878 0010 pea 10 <INVALID_OPERATION>
45654: 4eb9 0004 94b8 jsr 494b8 <_Workspace_Allocate>
if ( handler ) {
4565a: 588f addql #4,%sp
4565c: 4a80 tstl %d0
4565e: 6726 beqs 45686 <pthread_cleanup_push+0x56> <== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
45660: 2079 0005 fd5c moveal 5fd5c <_Per_CPU_Information+0xc>,%a0
handler_stack = &thread_support->Cancellation_Handlers;
45666: 2228 0102 movel %a0@(258),%d1
handler->routine = routine;
4566a: 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;
4566c: 0681 0000 00e4 addil #228,%d1
handler->routine = routine;
45672: 2142 0008 movel %d2,%a0@(8)
handler->arg = arg;
45676: 2143 000c movel %d3,%a0@(12)
_Chain_Append( handler_stack, &handler->Node );
4567a: 2f00 movel %d0,%sp@-
4567c: 2f01 movel %d1,%sp@-
4567e: 4eb9 0004 6cc8 jsr 46cc8 <_Chain_Append>
45684: 508f addql #8,%sp
}
_Thread_Enable_dispatch();
}
45686: 242e fff8 movel %fp@(-8),%d2
4568a: 262e fffc movel %fp@(-4),%d3
4568e: 4e5e unlk %fp
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
45690: 4ef9 0004 850e jmp 4850e <_Thread_Enable_dispatch>
}
45696: 242e fff8 movel %fp@(-8),%d2
4569a: 262e fffc movel %fp@(-4),%d3
4569e: 4e5e unlk %fp
...
00046354 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
46354: 4e56 fff4 linkw %fp,#-12
46358: 48d7 1c00 moveml %a2-%a4,%sp@
4635c: 246e 000c moveal %fp@(12),%a2
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
46360: 4a8a tstl %a2
46362: 6606 bnes 4636a <pthread_cond_init+0x16>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
46364: 45f9 0005 e662 lea 5e662 <_POSIX_Condition_variables_Default_attributes>,%a2
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
4636a: 7001 moveq #1,%d0
4636c: b0aa 0004 cmpl %a2@(4),%d0
46370: 6778 beqs 463ea <pthread_cond_init+0x96> <== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
46372: 4a92 tstl %a2@
46374: 6774 beqs 463ea <pthread_cond_init+0x96>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
46376: 2039 0006 0ed8 movel 60ed8 <_Thread_Dispatch_disable_level>,%d0
4637c: 5280 addql #1,%d0
4637e: 23c0 0006 0ed8 movel %d0,60ed8 <_Thread_Dispatch_disable_level>
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
46384: 4879 0006 1262 pea 61262 <_POSIX_Condition_variables_Information>
4638a: 49f9 0004 96fe lea 496fe <_Thread_Enable_dispatch>,%a4
46390: 4eb9 0004 8774 jsr 48774 <_Objects_Allocate>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
46396: 588f addql #4,%sp
46398: 2640 moveal %d0,%a3
4639a: 4a80 tstl %d0
4639c: 6606 bnes 463a4 <pthread_cond_init+0x50>
_Thread_Enable_dispatch();
4639e: 4e94 jsr %a4@
return ENOMEM;
463a0: 700c moveq #12,%d0
463a2: 6048 bras 463ec <pthread_cond_init+0x98>
}
the_cond->process_shared = the_attr->process_shared;
463a4: 276a 0004 0010 movel %a2@(4),%a3@(16)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
463aa: 42ab 0014 clrl %a3@(20)
_Thread_queue_Initialize(
463ae: 4878 0074 pea 74 <DBL_MANT_DIG+0x3f>
463b2: 2f3c 1000 0800 movel #268437504,%sp@-
463b8: 42a7 clrl %sp@-
463ba: 486b 0018 pea %a3@(24)
463be: 4eb9 0004 9dd0 jsr 49dd0 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
463c4: 202b 0008 movel %a3@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
463c8: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
463ca: 2079 0006 127a moveal 6127a <_POSIX_Condition_variables_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
463d0: 3200 movew %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
463d2: 218b 1c00 movel %a3,%a0@(00000000,%d1:l:4)
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
463d6: 206e 0008 moveal %fp@(8),%a0
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
463da: 42ab 000c clrl %a3@(12)
463de: 2080 movel %d0,%a0@
_Thread_Enable_dispatch();
463e0: 4e94 jsr %a4@
return 0;
463e2: 4fef 0010 lea %sp@(16),%sp
463e6: 4280 clrl %d0
463e8: 6002 bras 463ec <pthread_cond_init+0x98>
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
return EINVAL;
if ( !the_attr->is_initialized )
return EINVAL;
463ea: 7016 moveq #22,%d0
*cond = the_cond->Object.id;
_Thread_Enable_dispatch();
return 0;
}
463ec: 4cee 1c00 fff4 moveml %fp@(-12),%a2-%a4
463f2: 4e5e unlk %fp
...
000461f0 <pthread_condattr_destroy>:
*/
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
461f0: 4e56 0000 linkw %fp,#0
461f4: 206e 0008 moveal %fp@(8),%a0
if ( !attr || attr->is_initialized == false )
461f8: 4a88 tstl %a0
461fa: 670a beqs 46206 <pthread_condattr_destroy+0x16>
461fc: 4a90 tstl %a0@
461fe: 6706 beqs 46206 <pthread_condattr_destroy+0x16> <== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
46200: 4290 clrl %a0@
return 0;
46202: 4280 clrl %d0
46204: 6002 bras 46208 <pthread_condattr_destroy+0x18>
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
46206: 7016 moveq #22,%d0
attr->is_initialized = false;
return 0;
}
46208: 4e5e unlk %fp <== NOT EXECUTED
0004c634 <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
4c634: 4e56 0000 linkw %fp,#0
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
4c638: 2f2e 0008 movel %fp@(8),%sp@-
4c63c: 2f39 0005 ee32 movel 5ee32 <_Per_CPU_Information+0xc>,%sp@-
4c642: 4eb9 0004 c5c4 jsr 4c5c4 <_POSIX_Thread_Exit>
4c648: 508f addql #8,%sp <== NOT EXECUTED
}
4c64a: 4e5e unlk %fp <== NOT EXECUTED
...
0005af68 <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
5af68: 4e56 fff0 linkw %fp,#-16
5af6c: 48d7 040c moveml %d2-%d3/%a2,%sp@
5af70: 242e 000c movel %fp@(12),%d2
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
5af74: 670a beqs 5af80 <pthread_kill+0x18>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
5af76: 2602 movel %d2,%d3
5af78: 5383 subql #1,%d3
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
5af7a: 701f moveq #31,%d0
5af7c: b083 cmpl %d3,%d0
5af7e: 640e bccs 5af8e <pthread_kill+0x26>
rtems_set_errno_and_return_minus_one( EINVAL );
5af80: 4eb9 0004 cad0 jsr 4cad0 <__errno>
5af86: 7216 moveq #22,%d1
5af88: 2040 moveal %d0,%a0
5af8a: 2081 movel %d1,%a0@
5af8c: 607a bras 5b008 <pthread_kill+0xa0>
the_thread = _Thread_Get( thread, &location );
5af8e: 486e fffc pea %fp@(-4)
5af92: 2f2e 0008 movel %fp@(8),%sp@-
5af96: 4eb9 0004 7ae8 jsr 47ae8 <_Thread_Get>
switch ( location ) {
5af9c: 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 );
5af9e: 2440 moveal %d0,%a2
switch ( location ) {
5afa0: 4aae fffc tstl %fp@(-4)
5afa4: 6656 bnes 5affc <pthread_kill+0x94> <== NEVER TAKEN
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
5afa6: 2202 movel %d2,%d1
5afa8: 2002 movel %d2,%d0
5afaa: e589 lsll #2,%d1
5afac: e988 lsll #4,%d0
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
5afae: 206a 0102 moveal %a2@(258),%a0
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
5afb2: 9081 subl %d1,%d0
5afb4: 0680 0005 ee6c addil #388716,%d0
5afba: 7201 moveq #1,%d1
5afbc: 2240 moveal %d0,%a1
5afbe: b291 cmpl %a1@,%d1
5afc0: 6730 beqs 5aff2 <pthread_kill+0x8a>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
5afc2: 7001 moveq #1,%d0
5afc4: e7a8 lsll %d3,%d0
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
5afc6: 81a8 00d4 orl %d0,%a0@(212)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
5afca: 42a7 clrl %sp@-
5afcc: 2f02 movel %d2,%sp@-
5afce: 2f0a movel %a2,%sp@-
5afd0: 4eb9 0005 ae6c jsr 5ae6c <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
5afd6: 4fef 000c lea %sp@(12),%sp
5afda: 4ab9 0005 ee2e tstl 5ee2e <_Per_CPU_Information+0x8>
5afe0: 6710 beqs 5aff2 <pthread_kill+0x8a>
5afe2: b5f9 0005 ee32 cmpal 5ee32 <_Per_CPU_Information+0xc>,%a2
5afe8: 6608 bnes 5aff2 <pthread_kill+0x8a>
_Thread_Dispatch_necessary = true;
5afea: 7001 moveq #1,%d0
5afec: 13c0 0005 ee3e moveb %d0,5ee3e <_Per_CPU_Information+0x18>
}
_Thread_Enable_dispatch();
5aff2: 4eb9 0004 7ac2 jsr 47ac2 <_Thread_Enable_dispatch>
return 0;
5aff8: 4280 clrl %d0
5affa: 600e bras 5b00a <pthread_kill+0xa2>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
5affc: 4eb9 0004 cad0 jsr 4cad0 <__errno> <== NOT EXECUTED
5b002: 2040 moveal %d0,%a0 <== NOT EXECUTED
5b004: 7003 moveq #3,%d0 <== NOT EXECUTED
5b006: 2080 movel %d0,%a0@ <== NOT EXECUTED
5b008: 70ff moveq #-1,%d0
}
5b00a: 4cee 040c fff0 moveml %fp@(-16),%d2-%d3/%a2
5b010: 4e5e unlk %fp <== NOT EXECUTED
000475c4 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
475c4: 4e56 fffc linkw %fp,#-4
475c8: 2f03 movel %d3,%sp@-
475ca: 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 );
475cc: 486e fffc pea %fp@(-4)
475d0: 2f2e 000c movel %fp@(12),%sp@-
475d4: 4eb9 0004 76ac jsr 476ac <_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,
475da: 508f addql #8,%sp
475dc: 2400 movel %d0,%d2
475de: 7003 moveq #3,%d0
475e0: b082 cmpl %d2,%d0
475e2: 57c3 seq %d3
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
475e4: 2f2e fffc movel %fp@(-4),%sp@-
475e8: 4483 negl %d3
475ea: 4280 clrl %d0
475ec: 1003 moveb %d3,%d0
475ee: 2f00 movel %d0,%sp@-
475f0: 2f2e 0008 movel %fp@(8),%sp@-
475f4: 4eb9 0004 74cc jsr 474cc <_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) ) {
475fa: 4fef 000c lea %sp@(12),%sp
475fe: 4a03 tstb %d3
47600: 661c bnes 4761e <pthread_mutex_timedlock+0x5a>
47602: 7210 moveq #16,%d1
47604: b280 cmpl %d0,%d1
47606: 6616 bnes 4761e <pthread_mutex_timedlock+0x5a> <== NEVER TAKEN
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
47608: 4a82 tstl %d2
4760a: 670c beqs 47618 <pthread_mutex_timedlock+0x54> <== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
4760c: 5382 subql #1,%d2
4760e: 123c 0001 moveb #1,%d1
47612: b282 cmpl %d2,%d1
47614: 6508 bcss 4761e <pthread_mutex_timedlock+0x5a> <== NEVER TAKEN
47616: 6004 bras 4761c <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;
47618: 7016 moveq #22,%d0 <== NOT EXECUTED
4761a: 6002 bras 4761e <pthread_mutex_timedlock+0x5a> <== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
4761c: 7074 moveq #116,%d0
}
return lock_status;
}
4761e: 242e fff4 movel %fp@(-12),%d2
47622: 262e fff8 movel %fp@(-8),%d3
47626: 4e5e unlk %fp
...
0004547c <pthread_mutexattr_gettype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
4547c: 4e56 0000 linkw %fp,#0
45480: 206e 0008 moveal %fp@(8),%a0
45484: 226e 000c moveal %fp@(12),%a1
if ( !attr )
45488: 4a88 tstl %a0
4548a: 6710 beqs 4549c <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !attr->is_initialized )
4548c: 4a90 tstl %a0@
4548e: 670c beqs 4549c <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !type )
45490: 4a89 tstl %a1
45492: 6708 beqs 4549c <pthread_mutexattr_gettype+0x20> <== NEVER TAKEN
return EINVAL;
*type = attr->type;
45494: 22a8 0010 movel %a0@(16),%a1@
return 0;
45498: 4280 clrl %d0
4549a: 6002 bras 4549e <pthread_mutexattr_gettype+0x22>
if ( !attr->is_initialized )
return EINVAL;
if ( !type )
return EINVAL;
4549c: 7016 moveq #22,%d0
*type = attr->type;
return 0;
}
4549e: 4e5e unlk %fp
...
0004720c <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
4720c: 4e56 0000 linkw %fp,#0
47210: 206e 0008 moveal %fp@(8),%a0
47214: 202e 000c movel %fp@(12),%d0
if ( !attr || !attr->is_initialized )
47218: 4a88 tstl %a0
4721a: 6712 beqs 4722e <pthread_mutexattr_setpshared+0x22>
4721c: 4a90 tstl %a0@
4721e: 670e beqs 4722e <pthread_mutexattr_setpshared+0x22>
return EINVAL;
switch ( pshared ) {
47220: 7201 moveq #1,%d1
47222: b280 cmpl %d0,%d1
47224: 6508 bcss 4722e <pthread_mutexattr_setpshared+0x22><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
47226: 2140 0004 movel %d0,%a0@(4)
return 0;
4722a: 4280 clrl %d0
4722c: 6002 bras 47230 <pthread_mutexattr_setpshared+0x24>
default:
return EINVAL;
4722e: 7016 moveq #22,%d0
}
}
47230: 4e5e unlk %fp <== NOT EXECUTED
000454d0 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
454d0: 4e56 0000 linkw %fp,#0
454d4: 206e 0008 moveal %fp@(8),%a0
454d8: 202e 000c movel %fp@(12),%d0
if ( !attr || !attr->is_initialized )
454dc: 4a88 tstl %a0
454de: 6712 beqs 454f2 <pthread_mutexattr_settype+0x22>
454e0: 4a90 tstl %a0@
454e2: 670e beqs 454f2 <pthread_mutexattr_settype+0x22> <== NEVER TAKEN
return EINVAL;
switch ( type ) {
454e4: 7203 moveq #3,%d1
454e6: b280 cmpl %d0,%d1
454e8: 6508 bcss 454f2 <pthread_mutexattr_settype+0x22>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
454ea: 2140 0010 movel %d0,%a0@(16)
return 0;
454ee: 4280 clrl %d0
454f0: 6002 bras 454f4 <pthread_mutexattr_settype+0x24>
default:
return EINVAL;
454f2: 7016 moveq #22,%d0
}
}
454f4: 4e5e unlk %fp <== NOT EXECUTED
00045f6c <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
45f6c: 4e56 fffc linkw %fp,#-4
45f70: 2f0b movel %a3,%sp@-
45f72: 266e 000c moveal %fp@(12),%a3
45f76: 2f0a movel %a2,%sp@-
45f78: 246e 0008 moveal %fp@(8),%a2
if ( !once_control || !init_routine )
45f7c: 4a8a tstl %a2
45f7e: 674a beqs 45fca <pthread_once+0x5e>
45f80: 4a8b tstl %a3
45f82: 6746 beqs 45fca <pthread_once+0x5e>
return EINVAL;
if ( !once_control->init_executed ) {
45f84: 4aaa 0004 tstl %a2@(4)
45f88: 6644 bnes 45fce <pthread_once+0x62>
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
45f8a: 486e fffc pea %fp@(-4)
45f8e: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
45f92: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
45f96: 4eb9 0004 6a78 jsr 46a78 <rtems_task_mode>
if ( !once_control->init_executed ) {
45f9c: 4fef 000c lea %sp@(12),%sp
45fa0: 4aaa 0004 tstl %a2@(4)
45fa4: 660c bnes 45fb2 <pthread_once+0x46> <== NEVER TAKEN
once_control->is_initialized = true;
45fa6: 7001 moveq #1,%d0
45fa8: 2480 movel %d0,%a2@
once_control->init_executed = true;
45faa: 7001 moveq #1,%d0
45fac: 2540 0004 movel %d0,%a2@(4)
(*init_routine)();
45fb0: 4e93 jsr %a3@
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
45fb2: 486e fffc pea %fp@(-4)
45fb6: 4878 0100 pea 100 <DBL_MANT_DIG+0xcb>
45fba: 2f2e fffc movel %fp@(-4),%sp@-
45fbe: 4eb9 0004 6a78 jsr 46a78 <rtems_task_mode>
45fc4: 4fef 000c lea %sp@(12),%sp
45fc8: 6004 bras 45fce <pthread_once+0x62>
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
45fca: 7016 moveq #22,%d0
45fcc: 6002 bras 45fd0 <pthread_once+0x64>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
45fce: 4280 clrl %d0
}
45fd0: 246e fff4 moveal %fp@(-12),%a2
45fd4: 266e fff8 moveal %fp@(-8),%a3
45fd8: 4e5e unlk %fp <== NOT EXECUTED
00046748 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
46748: 4e56 ffe4 linkw %fp,#-28
4674c: 206e 000c moveal %fp@(12),%a0
46750: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
46754: 246e 0008 moveal %fp@(8),%a2
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
46758: 4a8a tstl %a2
4675a: 6700 0084 beqw 467e0 <pthread_rwlock_init+0x98>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
4675e: 4a88 tstl %a0
46760: 6614 bnes 46776 <pthread_rwlock_init+0x2e>
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
46762: 240e movel %fp,%d2
46764: 0682 ffff fff4 addil #-12,%d2
4676a: 2f02 movel %d2,%sp@-
4676c: 4eb9 0004 7064 jsr 47064 <pthread_rwlockattr_init>
46772: 588f addql #4,%sp
the_attr = &default_attr;
46774: 2042 moveal %d2,%a0
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
46776: 4a90 tstl %a0@
46778: 6766 beqs 467e0 <pthread_rwlock_init+0x98> <== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
4677a: 4aa8 0004 tstl %a0@(4)
4677e: 6660 bnes 467e0 <pthread_rwlock_init+0x98> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
46780: 2039 0006 161c movel 6161c <_Thread_Dispatch_disable_level>,%d0
46786: 5280 addql #1,%d0
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
46788: 42ae fffc clrl %fp@(-4)
4678c: 23c0 0006 161c movel %d0,6161c <_Thread_Dispatch_disable_level>
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
_Objects_Allocate( &_POSIX_RWLock_Information );
46792: 4879 0006 1784 pea 61784 <_POSIX_RWLock_Information>
46798: 49f9 0004 9b12 lea 49b12 <_Thread_Enable_dispatch>,%a4
4679e: 4eb9 0004 8b88 jsr 48b88 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
467a4: 588f addql #4,%sp
467a6: 2640 moveal %d0,%a3
467a8: 4a80 tstl %d0
467aa: 6606 bnes 467b2 <pthread_rwlock_init+0x6a>
_Thread_Enable_dispatch();
467ac: 4e94 jsr %a4@
return EAGAIN;
467ae: 700b moveq #11,%d0
467b0: 6030 bras 467e2 <pthread_rwlock_init+0x9a>
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
467b2: 486e fffc pea %fp@(-4)
467b6: 486b 0010 pea %a3@(16)
467ba: 4eb9 0004 837c jsr 4837c <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
467c0: 202b 0008 movel %a3@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
467c4: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
467c6: 2079 0006 179c moveal 6179c <_POSIX_RWLock_Information+0x18>,%a0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
467cc: 3200 movew %d0,%d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
467ce: 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;
467d2: 42ab 000c clrl %a3@(12)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
467d6: 2480 movel %d0,%a2@
_Thread_Enable_dispatch();
467d8: 4e94 jsr %a4@
return 0;
467da: 508f addql #8,%sp
467dc: 4280 clrl %d0
467de: 6002 bras 467e2 <pthread_rwlock_init+0x9a>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
467e0: 7016 moveq #22,%d0
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
467e2: 4cee 1c04 ffe4 moveml %fp@(-28),%d2/%a2-%a4
467e8: 4e5e unlk %fp <== NOT EXECUTED
000467ec <pthread_rwlock_rdlock>:
*/
int pthread_rwlock_rdlock(
pthread_rwlock_t *rwlock
)
{
467ec: 4e56 fffc linkw %fp,#-4
467f0: 2f0a movel %a2,%sp@-
467f2: 246e 0008 moveal %fp@(8),%a2
POSIX_RWLock_Control *the_rwlock;
Objects_Locations location;
if ( !rwlock )
467f6: 4a8a tstl %a2
467f8: 674e beqs 46848 <pthread_rwlock_rdlock+0x5c> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Get (
pthread_rwlock_t *RWLock,
Objects_Locations *location
)
{
return (POSIX_RWLock_Control *) _Objects_Get(
467fa: 486e fffc pea %fp@(-4)
467fe: 2f12 movel %a2@,%sp@-
46800: 4879 0006 1784 pea 61784 <_POSIX_RWLock_Information>
46806: 4eb9 0004 8fdc jsr 48fdc <_Objects_Get>
return EINVAL;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
4680c: 4fef 000c lea %sp@(12),%sp
46810: 4aae fffc tstl %fp@(-4)
46814: 6632 bnes 46848 <pthread_rwlock_rdlock+0x5c>
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
46816: 42a7 clrl %sp@-
46818: 2040 moveal %d0,%a0
4681a: 42a7 clrl %sp@-
4681c: 4878 0001 pea 1 <ADD>
46820: 2f12 movel %a2@,%sp@-
46822: 4868 0010 pea %a0@(16)
46826: 4eb9 0004 83b0 jsr 483b0 <_CORE_RWLock_Obtain_for_reading>
true, /* we are willing to wait forever */
0,
NULL
);
_Thread_Enable_dispatch();
4682c: 4eb9 0004 9b12 jsr 49b12 <_Thread_Enable_dispatch>
return _POSIX_RWLock_Translate_core_RWLock_return_code(
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
46832: 2079 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a0
0,
NULL
);
_Thread_Enable_dispatch();
return _POSIX_RWLock_Translate_core_RWLock_return_code(
46838: 2f28 0034 movel %a0@(52),%sp@-
4683c: 4eb9 0004 69ac jsr 469ac <_POSIX_RWLock_Translate_core_RWLock_return_code>
46842: 4fef 0018 lea %sp@(24),%sp
46846: 6002 bras 4684a <pthread_rwlock_rdlock+0x5e>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
46848: 7016 moveq #22,%d0
}
4684a: 246e fff8 moveal %fp@(-8),%a2
4684e: 4e5e unlk %fp
...
00046854 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
46854: 4e56 ffec linkw %fp,#-20
46858: 48d7 040c moveml %d2-%d3/%a2,%sp@
4685c: 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 )
46860: 4a8a tstl %a2
46862: 6700 008c beqw 468f0 <pthread_rwlock_timedrdlock+0x9c>
*
* 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 );
46866: 486e fff8 pea %fp@(-8)
4686a: 2f2e 000c movel %fp@(12),%sp@-
4686e: 4eb9 0004 c430 jsr 4c430 <_POSIX_Absolute_timeout_to_ticks>
46874: 486e fffc pea %fp@(-4)
46878: 2400 movel %d0,%d2
4687a: 2f12 movel %a2@,%sp@-
4687c: 4879 0006 1784 pea 61784 <_POSIX_RWLock_Information>
46882: 4eb9 0004 8fdc jsr 48fdc <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
46888: 4fef 0014 lea %sp@(20),%sp
4688c: 4aae fffc tstl %fp@(-4)
46890: 665e bnes 468f0 <pthread_rwlock_timedrdlock+0x9c>
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,
46892: 7203 moveq #3,%d1
46894: b282 cmpl %d2,%d1
46896: 57c3 seq %d3
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
46898: 42a7 clrl %sp@-
4689a: 2f2e fff8 movel %fp@(-8),%sp@-
4689e: 4483 negl %d3
468a0: 4281 clrl %d1
468a2: 1203 moveb %d3,%d1
468a4: 2040 moveal %d0,%a0
468a6: 2f01 movel %d1,%sp@-
468a8: 2f12 movel %a2@,%sp@-
468aa: 4868 0010 pea %a0@(16)
468ae: 4eb9 0004 83b0 jsr 483b0 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
468b4: 4eb9 0004 9b12 jsr 49b12 <_Thread_Enable_dispatch>
if ( !do_wait ) {
468ba: 4fef 0014 lea %sp@(20),%sp
468be: 4a03 tstb %d3
468c0: 661a bnes 468dc <pthread_rwlock_timedrdlock+0x88>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
468c2: 2079 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a0
468c8: 7002 moveq #2,%d0
468ca: b0a8 0034 cmpl %a0@(52),%d0
468ce: 660c bnes 468dc <pthread_rwlock_timedrdlock+0x88>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
468d0: 4a82 tstl %d2
468d2: 671c beqs 468f0 <pthread_rwlock_timedrdlock+0x9c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
468d4: 5382 subql #1,%d2
468d6: 7201 moveq #1,%d1
468d8: b282 cmpl %d2,%d1
468da: 6418 bccs 468f4 <pthread_rwlock_timedrdlock+0xa0><== ALWAYS TAKEN
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
468dc: 2079 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a0
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
468e2: 2f28 0034 movel %a0@(52),%sp@-
468e6: 4eb9 0004 69ac jsr 469ac <_POSIX_RWLock_Translate_core_RWLock_return_code>
468ec: 588f addql #4,%sp
468ee: 6006 bras 468f6 <pthread_rwlock_timedrdlock+0xa2>
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
468f0: 7016 moveq #22,%d0
468f2: 6002 bras 468f6 <pthread_rwlock_timedrdlock+0xa2>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
468f4: 7074 moveq #116,%d0
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
468f6: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
468fc: 4e5e unlk %fp <== NOT EXECUTED
00046900 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
46900: 4e56 ffec linkw %fp,#-20
46904: 48d7 040c moveml %d2-%d3/%a2,%sp@
46908: 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 )
4690c: 4a8a tstl %a2
4690e: 6700 008c beqw 4699c <pthread_rwlock_timedwrlock+0x9c>
*
* 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 );
46912: 486e fff8 pea %fp@(-8)
46916: 2f2e 000c movel %fp@(12),%sp@-
4691a: 4eb9 0004 c430 jsr 4c430 <_POSIX_Absolute_timeout_to_ticks>
46920: 486e fffc pea %fp@(-4)
46924: 2400 movel %d0,%d2
46926: 2f12 movel %a2@,%sp@-
46928: 4879 0006 1784 pea 61784 <_POSIX_RWLock_Information>
4692e: 4eb9 0004 8fdc jsr 48fdc <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
46934: 4fef 0014 lea %sp@(20),%sp
46938: 4aae fffc tstl %fp@(-4)
4693c: 665e bnes 4699c <pthread_rwlock_timedwrlock+0x9c>
(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,
4693e: 7203 moveq #3,%d1
46940: b282 cmpl %d2,%d1
46942: 57c3 seq %d3
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
46944: 42a7 clrl %sp@-
46946: 2f2e fff8 movel %fp@(-8),%sp@-
4694a: 4483 negl %d3
4694c: 4281 clrl %d1
4694e: 1203 moveb %d3,%d1
46950: 2040 moveal %d0,%a0
46952: 2f01 movel %d1,%sp@-
46954: 2f12 movel %a2@,%sp@-
46956: 4868 0010 pea %a0@(16)
4695a: 4eb9 0004 8460 jsr 48460 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
46960: 4eb9 0004 9b12 jsr 49b12 <_Thread_Enable_dispatch>
if ( !do_wait &&
46966: 4fef 0014 lea %sp@(20),%sp
4696a: 4a03 tstb %d3
4696c: 661a bnes 46988 <pthread_rwlock_timedwrlock+0x88>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
4696e: 2079 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a0
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
46974: 7002 moveq #2,%d0
46976: b0a8 0034 cmpl %a0@(52),%d0
4697a: 660c bnes 46988 <pthread_rwlock_timedwrlock+0x88>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
4697c: 4a82 tstl %d2
4697e: 671c beqs 4699c <pthread_rwlock_timedwrlock+0x9c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
46980: 5382 subql #1,%d2
46982: 7201 moveq #1,%d1
46984: b282 cmpl %d2,%d1
46986: 6418 bccs 469a0 <pthread_rwlock_timedwrlock+0xa0><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
46988: 2079 0006 1a86 moveal 61a86 <_Per_CPU_Information+0xc>,%a0
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
4698e: 2f28 0034 movel %a0@(52),%sp@-
46992: 4eb9 0004 69ac jsr 469ac <_POSIX_RWLock_Translate_core_RWLock_return_code>
46998: 588f addql #4,%sp
4699a: 6006 bras 469a2 <pthread_rwlock_timedwrlock+0xa2>
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
4699c: 7016 moveq #22,%d0
4699e: 6002 bras 469a2 <pthread_rwlock_timedwrlock+0xa2>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
469a0: 7074 moveq #116,%d0
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
469a2: 4cee 040c ffec moveml %fp@(-20),%d2-%d3/%a2
469a8: 4e5e unlk %fp <== NOT EXECUTED
00047084 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
47084: 4e56 0000 linkw %fp,#0
47088: 206e 0008 moveal %fp@(8),%a0
4708c: 202e 000c movel %fp@(12),%d0
if ( !attr )
47090: 4a88 tstl %a0
47092: 6712 beqs 470a6 <pthread_rwlockattr_setpshared+0x22>
return EINVAL;
if ( !attr->is_initialized )
47094: 4a90 tstl %a0@
47096: 670e beqs 470a6 <pthread_rwlockattr_setpshared+0x22>
return EINVAL;
switch ( pshared ) {
47098: 7201 moveq #1,%d1
4709a: b280 cmpl %d0,%d1
4709c: 6508 bcss 470a6 <pthread_rwlockattr_setpshared+0x22><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
4709e: 2140 0004 movel %d0,%a0@(4)
return 0;
470a2: 4280 clrl %d0
470a4: 6002 bras 470a8 <pthread_rwlockattr_setpshared+0x24>
default:
return EINVAL;
470a6: 7016 moveq #22,%d0
}
}
470a8: 4e5e unlk %fp <== NOT EXECUTED
00047dc8 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
47dc8: 4e56 ffe0 linkw %fp,#-32
47dcc: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
47dd0: 242e 000c movel %fp@(12),%d2
47dd4: 282e 0010 movel %fp@(16),%d4
int rc;
/*
* Check all the parameters
*/
if ( !param )
47dd8: 6700 00d8 beqw 47eb2 <pthread_setschedparam+0xea>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
47ddc: 486e fff8 pea %fp@(-8)
47de0: 486e fffc pea %fp@(-4)
47de4: 2f04 movel %d4,%sp@-
47de6: 2f02 movel %d2,%sp@-
47de8: 4eb9 0004 d2a4 jsr 4d2a4 <_POSIX_Thread_Translate_sched_param>
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
47dee: 4fef 0010 lea %sp@(16),%sp
* Check all the parameters
*/
if ( !param )
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
47df2: 2600 movel %d0,%d3
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
47df4: 6600 00c2 bnew 47eb8 <pthread_setschedparam+0xf0>
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
47df8: 486e fff4 pea %fp@(-12)
47dfc: 2f2e 0008 movel %fp@(8),%sp@-
47e00: 4eb9 0004 a6e8 jsr 4a6e8 <_Thread_Get>
switch ( location ) {
47e06: 508f addql #8,%sp
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
47e08: 2640 moveal %d0,%a3
switch ( location ) {
47e0a: 4aae fff4 tstl %fp@(-12)
47e0e: 6600 00a6 bnew 47eb6 <pthread_setschedparam+0xee>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
47e12: 246b 0102 moveal %a3@(258),%a2
if ( api->schedpolicy == SCHED_SPORADIC )
47e16: 7004 moveq #4,%d0
47e18: b0aa 0084 cmpl %a2@(132),%d0
47e1c: 660c bnes 47e2a <pthread_setschedparam+0x62>
(void) _Watchdog_Remove( &api->Sporadic_timer );
47e1e: 486a 00a8 pea %a2@(168)
47e22: 4eb9 0004 b5ec jsr 4b5ec <_Watchdog_Remove>
47e28: 588f addql #4,%sp
api->schedpolicy = policy;
47e2a: 2542 0084 movel %d2,%a2@(132)
api->schedparam = *param;
47e2e: 4878 001c pea 1c <OPER2+0x8>
47e32: 2f04 movel %d4,%sp@-
47e34: 486a 0088 pea %a2@(136)
47e38: 4eb9 0004 fe38 jsr 4fe38 <memcpy>
the_thread->budget_algorithm = budget_algorithm;
47e3e: 276e fffc 007a movel %fp@(-4),%a3@(122)
the_thread->budget_callout = budget_callout;
switch ( api->schedpolicy ) {
47e44: 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;
47e48: 276e fff8 007e movel %fp@(-8),%a3@(126)
switch ( api->schedpolicy ) {
47e4e: 4a82 tstl %d2
47e50: 6d58 blts 47eaa <pthread_setschedparam+0xe2> <== NEVER TAKEN
47e52: 7002 moveq #2,%d0
47e54: b082 cmpl %d2,%d0
47e56: 6c0a bges 47e62 <pthread_setschedparam+0x9a>
47e58: 103c 0004 moveb #4,%d0
47e5c: b082 cmpl %d2,%d0
47e5e: 664a bnes 47eaa <pthread_setschedparam+0xe2> <== NEVER TAKEN
47e60: 602a bras 47e8c <pthread_setschedparam+0xc4>
47e62: 4280 clrl %d0
47e64: 1039 0006 1bf6 moveb 61bf6 <rtems_maximum_priority>,%d0
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
47e6a: 41f9 0006 34d0 lea 634d0 <_Thread_Ticks_per_timeslice>,%a0
47e70: 90aa 0088 subl %a2@(136),%d0
47e74: 2750 0076 movel %a0@,%a3@(118)
the_thread->real_priority =
47e78: 2740 0018 movel %d0,%a3@(24)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
47e7c: 4878 0001 pea 1 <ADD>
47e80: 2f00 movel %d0,%sp@-
47e82: 2f0b movel %a3,%sp@-
47e84: 4eb9 0004 a2a4 jsr 4a2a4 <_Thread_Change_priority>
47e8a: 601a bras 47ea6 <pthread_setschedparam+0xde>
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
47e8c: 256a 0088 00a4 movel %a2@(136),%a2@(164)
_Watchdog_Remove( &api->Sporadic_timer );
47e92: 486a 00a8 pea %a2@(168)
47e96: 4eb9 0004 b5ec jsr 4b5ec <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
47e9c: 2f0b movel %a3,%sp@-
47e9e: 42a7 clrl %sp@-
47ea0: 4eb9 0004 7ca4 jsr 47ca4 <_POSIX_Threads_Sporadic_budget_TSR>
break;
47ea6: 4fef 000c lea %sp@(12),%sp
}
_Thread_Enable_dispatch();
47eaa: 4eb9 0004 a6c2 jsr 4a6c2 <_Thread_Enable_dispatch>
return 0;
47eb0: 6006 bras 47eb8 <pthread_setschedparam+0xf0>
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
47eb2: 7616 moveq #22,%d3
47eb4: 6002 bras 47eb8 <pthread_setschedparam+0xf0>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
47eb6: 7603 moveq #3,%d3
}
47eb8: 2003 movel %d3,%d0
47eba: 4cee 0c1c ffe0 moveml %fp@(-32),%d2-%d4/%a2-%a3
47ec0: 4e5e unlk %fp <== NOT EXECUTED
00045d54 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
45d54: 4e56 0000 linkw %fp,#0
45d58: 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() )
45d5a: 4ab9 0005 fd58 tstl 5fd58 <_Per_CPU_Information+0x8>
45d60: 6646 bnes 45da8 <pthread_testcancel+0x54> <== NEVER TAKEN
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
45d62: 2079 0005 fd5c moveal 5fd5c <_Per_CPU_Information+0xc>,%a0
45d68: 2039 0005 f8f2 movel 5f8f2 <_Thread_Dispatch_disable_level>,%d0
45d6e: 5280 addql #1,%d0
45d70: 2068 0102 moveal %a0@(258),%a0
45d74: 23c0 0005 f8f2 movel %d0,5f8f2 <_Thread_Dispatch_disable_level>
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
45d7a: 4aa8 00d8 tstl %a0@(216)
45d7e: 660a bnes 45d8a <pthread_testcancel+0x36> <== 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));
45d80: 4aa8 00e0 tstl %a0@(224)
45d84: 56c2 sne %d2
45d86: 4482 negl %d2
45d88: 6002 bras 45d8c <pthread_testcancel+0x38>
*/
void pthread_testcancel( void )
{
POSIX_API_Control *thread_support;
bool cancel = false;
45d8a: 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();
45d8c: 4eb9 0004 850e jsr 4850e <_Thread_Enable_dispatch>
if ( cancel )
45d92: 4a02 tstb %d2
45d94: 6712 beqs 45da8 <pthread_testcancel+0x54>
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
45d96: 4878 ffff pea ffffffff <LESS>
45d9a: 2f39 0005 fd5c movel 5fd5c <_Per_CPU_Information+0xc>,%sp@-
45da0: 4eb9 0004 b1c8 jsr 4b1c8 <_POSIX_Thread_Exit>
45da6: 508f addql #8,%sp <== NOT EXECUTED
}
45da8: 242e fffc movel %fp@(-4),%d2
45dac: 4e5e unlk %fp <== NOT EXECUTED
00046750 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
46750: 4e56 ffc0 linkw %fp,#-64
46754: 48d7 3c1c moveml %d2-%d4/%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);
46758: 4879 0006 1378 pea 61378 <aio_request_queue>
4675e: 4bf9 0004 7078 lea 47078 <pthread_mutex_lock>,%a5
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
46764: 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);
46768: 4e95 jsr %a5@
if (result != 0) {
4676a: 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);
4676c: 2400 movel %d0,%d2
if (result != 0) {
4676e: 670c beqs 4677c <rtems_aio_enqueue+0x2c> <== ALWAYS TAKEN
free (req);
46770: 2f0a movel %a2,%sp@- <== NOT EXECUTED
46772: 4eb9 0004 3434 jsr 43434 <free> <== NOT EXECUTED
46778: 6000 01c6 braw 46940 <rtems_aio_enqueue+0x1f0> <== 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);
4677c: 47f9 0004 784c lea 4784c <pthread_self>,%a3
46782: 4e93 jsr %a3@
46784: 486e ffdc pea %fp@(-36)
46788: 486e fff8 pea %fp@(-8)
4678c: 2f00 movel %d0,%sp@-
4678e: 4eb9 0004 7478 jsr 47478 <pthread_getschedparam>
req->caller_thread = pthread_self ();
46794: 4e93 jsr %a3@
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
46796: 206a 0014 moveal %a2@(20),%a0
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
4679a: 7277 moveq #119,%d1
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
4679c: 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 ();
467a0: 2540 0010 movel %d0,%a2@(16)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
467a4: 202e ffdc movel %fp@(-36),%d0
467a8: 90a8 0014 subl %a0@(20),%d0
req->policy = policy;
467ac: 256e fff8 0008 movel %fp@(-8),%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;
467b2: 2540 000c movel %d0,%a2@(12)
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
467b6: 2141 0030 movel %d1,%a0@(48)
req->aiocbp->return_value = 0;
467ba: 42a8 0034 clrl %a0@(52)
if ((aio_request_queue.idle_threads == 0) &&
467be: 4ab9 0006 13e0 tstl 613e0 <aio_request_queue+0x68>
467c4: 6600 00ae bnew 46874 <rtems_aio_enqueue+0x124>
467c8: 7004 moveq #4,%d0
467ca: b0b9 0006 13dc cmpl 613dc <aio_request_queue+0x64>,%d0
467d0: 6d00 00a2 bltw 46874 <rtems_aio_enqueue+0x124>
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);
467d4: 4878 0001 pea 1 <ADD>
467d8: 2f10 movel %a0@,%sp@-
467da: 4879 0006 13c0 pea 613c0 <aio_request_queue+0x48>
467e0: 4eb9 0004 634a jsr 4634a <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
467e6: 4fef 000c lea %sp@(12),%sp
467ea: 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);
467ec: 2640 moveal %d0,%a3
467ee: 2800 movel %d0,%d4
467f0: 2600 movel %d0,%d3
467f2: 5084 addql #8,%d4
467f4: 0683 0000 001c addil #28,%d3
467fa: 49eb 0020 lea %a3@(32),%a4
if (r_chain->new_fd == 1) {
467fe: b2ab 0018 cmpl %a3@(24),%d1
46802: 665e bnes 46862 <rtems_aio_enqueue+0x112>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
46804: 2f0a movel %a2,%sp@-
46806: 2f04 movel %d4,%sp@-
46808: 4eb9 0004 8914 jsr 48914 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
4680e: 42ab 0018 clrl %a3@(24)
pthread_mutex_init (&r_chain->mutex, NULL);
46812: 42a7 clrl %sp@-
46814: 2f03 movel %d3,%sp@-
46816: 4eb9 0004 6f60 jsr 46f60 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
4681c: 42a7 clrl %sp@-
4681e: 2f0c movel %a4,%sp@-
46820: 4eb9 0004 6c00 jsr 46c00 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
46826: 2f0b movel %a3,%sp@-
46828: 487a fbe8 pea %pc@(46412 <rtems_aio_handle>)
4682c: 4879 0006 1380 pea 61380 <aio_request_queue+0x8>
46832: 486e fffc pea %fp@(-4)
46836: 4eb9 0004 7270 jsr 47270 <pthread_create>
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
4683c: 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,
46840: 2600 movel %d0,%d3
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
46842: 6714 beqs 46858 <rtems_aio_enqueue+0x108> <== ALWAYS TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
46844: 4879 0006 1378 pea 61378 <aio_request_queue> <== NOT EXECUTED
return result;
4684a: 2403 movel %d3,%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);
4684c: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
46852: 588f addql #4,%sp <== NOT EXECUTED
46854: 6000 00ec braw 46942 <rtems_aio_enqueue+0x1f2> <== NOT EXECUTED
}
++aio_request_queue.active_threads;
46858: 52b9 0006 13dc addql #1,613dc <aio_request_queue+0x64>
4685e: 6000 00d4 braw 46934 <rtems_aio_enqueue+0x1e4>
}
else {
/* put request in the fd chain it belongs to */
pthread_mutex_lock (&r_chain->mutex);
46862: 2f03 movel %d3,%sp@-
46864: 4e95 jsr %a5@
rtems_aio_insert_prio (&r_chain->perfd, req);
46866: 2f0a movel %a2,%sp@-
46868: 2f04 movel %d4,%sp@-
4686a: 4eb9 0004 664c jsr 4664c <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
46870: 2f0c movel %a4,%sp@-
46872: 603c bras 468b0 <rtems_aio_enqueue+0x160>
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,
46874: 42a7 clrl %sp@-
46876: 2f10 movel %a0@,%sp@-
46878: 49f9 0004 634a lea 4634a <rtems_aio_search_fd>,%a4
4687e: 4879 0006 13c0 pea 613c0 <aio_request_queue+0x48>
46884: 4e94 jsr %a4@
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
46886: 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,
4688a: 2640 moveal %d0,%a3
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
4688c: 4a80 tstl %d0
4688e: 6734 beqs 468c4 <rtems_aio_enqueue+0x174>
{
pthread_mutex_lock (&r_chain->mutex);
46890: 2600 movel %d0,%d3
46892: 0683 0000 001c addil #28,%d3
46898: 2f03 movel %d3,%sp@-
4689a: 4eb9 0004 7078 jsr 47078 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
468a0: 2f0a movel %a2,%sp@-
468a2: 486b 0008 pea %a3@(8)
468a6: 4eb9 0004 664c jsr 4664c <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
468ac: 486b 0020 pea %a3@(32)
468b0: 4eb9 0004 6ca4 jsr 46ca4 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
468b6: 2f03 movel %d3,%sp@-
468b8: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock>
468be: 4fef 0014 lea %sp@(20),%sp
468c2: 6070 bras 46934 <rtems_aio_enqueue+0x1e4>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
468c4: 4878 0001 pea 1 <ADD>
468c8: 206a 0014 moveal %a2@(20),%a0
468cc: 2f10 movel %a0@,%sp@-
468ce: 4879 0006 13cc pea 613cc <aio_request_queue+0x54>
468d4: 4e94 jsr %a4@
if (r_chain->new_fd == 1) {
468d6: 4fef 000c lea %sp@(12),%sp
468da: 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);
468dc: 2640 moveal %d0,%a3
468de: 5080 addql #8,%d0
if (r_chain->new_fd == 1) {
468e0: b2ab 0018 cmpl %a3@(24),%d1
468e4: 662c bnes 46912 <rtems_aio_enqueue+0x1c2>
468e6: 2f0a movel %a2,%sp@-
468e8: 2f00 movel %d0,%sp@-
468ea: 4eb9 0004 8914 jsr 48914 <_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;
468f0: 42ab 0018 clrl %a3@(24)
pthread_mutex_init (&r_chain->mutex, NULL);
468f4: 42a7 clrl %sp@-
468f6: 486b 001c pea %a3@(28)
468fa: 4eb9 0004 6f60 jsr 46f60 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
46900: 42a7 clrl %sp@-
46902: 486b 0020 pea %a3@(32)
46906: 4eb9 0004 6c00 jsr 46c00 <pthread_cond_init>
4690c: 4fef 0018 lea %sp@(24),%sp
46910: 600c bras 4691e <rtems_aio_enqueue+0x1ce>
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
46912: 2f0a movel %a2,%sp@-
46914: 2f00 movel %d0,%sp@-
46916: 4eb9 0004 664c jsr 4664c <rtems_aio_insert_prio>
4691c: 508f addql #8,%sp
if (aio_request_queue.idle_threads > 0)
4691e: 4ab9 0006 13e0 tstl 613e0 <aio_request_queue+0x68>
46924: 6f0e bles 46934 <rtems_aio_enqueue+0x1e4> <== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
46926: 4879 0006 137c pea 6137c <aio_request_queue+0x4> <== NOT EXECUTED
4692c: 4eb9 0004 6ca4 jsr 46ca4 <pthread_cond_signal> <== NOT EXECUTED
46932: 588f addql #4,%sp <== NOT EXECUTED
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
46934: 4879 0006 1378 pea 61378 <aio_request_queue>
4693a: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock>
return 0;
46940: 588f addql #4,%sp
}
46942: 2002 movel %d2,%d0
46944: 4cee 3c1c ffc0 moveml %fp@(-64),%d2-%d4/%a2-%a5
4694a: 4e5e unlk %fp
...
00046412 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
46412: 4e56 ffa8 linkw %fp,#-88
46416: 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);
4641a: 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);
4641c: 280e movel %fp,%d4
/* 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);
4641e: 2e3c 0004 7078 movel #290936,%d7
46424: 4bf9 0004 7110 lea 47110 <pthread_mutex_unlock>,%a5
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
4642a: 0682 ffff fff4 addil #-12,%d2
46430: 2c3c 0004 6ad0 movel #289488,%d6
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
46436: 2a3c 0004 6d18 movel #290072,%d5
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
4643c: 49f9 0004 88b8 lea 488b8 <_Chain_Extract>,%a4
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);
46442: 0684 ffff ffd8 addil #-40,%d4
static void *
rtems_aio_handle (void *arg)
{
rtems_aio_request_chain *r_chain = arg;
46448: 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);
4644c: 260a movel %a2,%d3
4644e: 0683 0000 001c addil #28,%d3
46454: 2047 moveal %d7,%a0
46456: 2f03 movel %d3,%sp@-
46458: 4e90 jsr %a0@
if (result != 0)
4645a: 588f addql #4,%sp
4645c: 4a80 tstl %d0
4645e: 6600 01e0 bnew 46640 <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 );
46462: 200a movel %a2,%d0
46464: 0680 0000 000c addil #12,%d0
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
4646a: 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)) {
4646e: b08b cmpl %a3,%d0
46470: 6700 00da beqw 4654c <rtems_aio_handle+0x13a>
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);
46474: 41f9 0004 784c lea 4784c <pthread_self>,%a0
4647a: 2d48 ffd0 movel %a0,%fp@(-48)
4647e: 4e90 jsr %a0@
46480: 2f04 movel %d4,%sp@-
46482: 486e fffc pea %fp@(-4)
46486: 2f00 movel %d0,%sp@-
46488: 4eb9 0004 7478 jsr 47478 <pthread_getschedparam>
param.sched_priority = req->priority;
pthread_setschedparam (pthread_self(), req->policy, ¶m);
4648e: 202b 0008 movel %a3@(8),%d0
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;
46492: 2d6b 000c ffd8 movel %a3@(12),%fp@(-40)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
46498: 206e ffd0 moveal %fp@(-48),%a0
4649c: 2d40 ffd4 movel %d0,%fp@(-44)
464a0: 4e90 jsr %a0@
464a2: 2f04 movel %d4,%sp@-
464a4: 2f2e ffd4 movel %fp@(-44),%sp@-
464a8: 2f00 movel %d0,%sp@-
464aa: 4eb9 0004 7860 jsr 47860 <pthread_setschedparam>
464b0: 2f0b movel %a3,%sp@-
464b2: 4e94 jsr %a4@
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
464b4: 2f03 movel %d3,%sp@-
464b6: 4e95 jsr %a5@
switch (req->aiocbp->aio_lio_opcode) {
464b8: 206b 0014 moveal %a3@(20),%a0
464bc: 4fef 0020 lea %sp@(32),%sp
464c0: 7202 moveq #2,%d1
464c2: 2028 002c movel %a0@(44),%d0
464c6: b280 cmpl %d0,%d1
464c8: 672a beqs 464f4 <rtems_aio_handle+0xe2>
464ca: 123c 0003 moveb #3,%d1
464ce: b280 cmpl %d0,%d1
464d0: 6740 beqs 46512 <rtems_aio_handle+0x100> <== NEVER TAKEN
464d2: 123c 0001 moveb #1,%d1
464d6: b280 cmpl %d0,%d1
464d8: 6648 bnes 46522 <rtems_aio_handle+0x110> <== NEVER TAKEN
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
464da: 2f28 0008 movel %a0@(8),%sp@-
464de: 2f28 0004 movel %a0@(4),%sp@-
464e2: 2f28 0010 movel %a0@(16),%sp@-
464e6: 2f28 000c movel %a0@(12),%sp@-
464ea: 2f10 movel %a0@,%sp@-
464ec: 4eb9 0004 fbf6 jsr 4fbf6 <pread>
464f2: 6018 bras 4650c <rtems_aio_handle+0xfa>
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
464f4: 2f28 0008 movel %a0@(8),%sp@-
464f8: 2f28 0004 movel %a0@(4),%sp@-
464fc: 2f28 0010 movel %a0@(16),%sp@-
46500: 2f28 000c movel %a0@(12),%sp@-
46504: 2f10 movel %a0@,%sp@-
46506: 4eb9 0004 fcbe jsr 4fcbe <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
4650c: 4fef 0014 lea %sp@(20),%sp
46510: 600a bras 4651c <rtems_aio_handle+0x10a>
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
46512: 2f10 movel %a0@,%sp@- <== NOT EXECUTED
46514: 4eb9 0004 c438 jsr 4c438 <fsync> <== NOT EXECUTED
break;
4651a: 588f addql #4,%sp <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
4651c: 72ff moveq #-1,%d1
4651e: b280 cmpl %d0,%d1
46520: 661a bnes 4653c <rtems_aio_handle+0x12a> <== ALWAYS TAKEN
req->aiocbp->return_value = -1;
46522: 266b 0014 moveal %a3@(20),%a3 <== NOT EXECUTED
46526: 70ff moveq #-1,%d0 <== NOT EXECUTED
46528: 2740 0034 movel %d0,%a3@(52) <== NOT EXECUTED
req->aiocbp->error_code = errno;
4652c: 4eb9 0004 f150 jsr 4f150 <__errno> <== NOT EXECUTED
46532: 2040 moveal %d0,%a0 <== NOT EXECUTED
46534: 2750 0030 movel %a0@,%a3@(48) <== NOT EXECUTED
46538: 6000 ff12 braw 4644c <rtems_aio_handle+0x3a> <== NOT EXECUTED
} else {
req->aiocbp->return_value = result;
4653c: 206b 0014 moveal %a3@(20),%a0
46540: 2140 0034 movel %d0,%a0@(52)
req->aiocbp->error_code = 0;
46544: 42a8 0030 clrl %a0@(48)
46548: 6000 ff02 braw 4644c <rtems_aio_handle+0x3a>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
4654c: 2f03 movel %d3,%sp@-
4654e: 4e95 jsr %a5@
pthread_mutex_lock (&aio_request_queue.mutex);
46550: 4879 0006 1378 pea 61378 <aio_request_queue>
46556: 2047 moveal %d7,%a0
46558: 4e90 jsr %a0@
if (rtems_chain_is_empty (chain))
4655a: 508f addql #8,%sp
4655c: b7ea 0008 cmpal %a2@(8),%a3
46560: 6600 00d0 bnew 46632 <rtems_aio_handle+0x220>
{
clock_gettime (CLOCK_REALTIME, &timeout);
46564: 2f02 movel %d2,%sp@-
46566: 4878 0001 pea 1 <ADD>
4656a: 2046 moveal %d6,%a0
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
4656c: 47ea 0020 lea %a2@(32),%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);
46570: 4e90 jsr %a0@
timeout.tv_sec += 3;
46572: 56ae fff4 addql #3,%fp@(-12)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
46576: 2045 moveal %d5,%a0
46578: 2f02 movel %d2,%sp@-
4657a: 4879 0006 1378 pea 61378 <aio_request_queue>
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
46580: 42ae fff8 clrl %fp@(-8)
result = pthread_cond_timedwait (&r_chain->cond,
46584: 2f0b movel %a3,%sp@-
46586: 4e90 jsr %a0@
&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) {
46588: 4fef 0014 lea %sp@(20),%sp
4658c: 7274 moveq #116,%d1
4658e: b280 cmpl %d0,%d1
46590: 6600 00a0 bnew 46632 <rtems_aio_handle+0x220>
46594: 2f0a movel %a2,%sp@-
46596: 4e94 jsr %a4@
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
46598: 2f03 movel %d3,%sp@-
4659a: 4eb9 0004 6e40 jsr 46e40 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
465a0: 2f0b movel %a3,%sp@-
465a2: 4eb9 0004 6b3c jsr 46b3c <pthread_cond_destroy>
free (r_chain);
465a8: 2f0a movel %a2,%sp@-
465aa: 4eb9 0004 3434 jsr 43434 <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)) {
465b0: 4fef 0010 lea %sp@(16),%sp
465b4: 41f9 0006 13d0 lea 613d0 <aio_request_queue+0x58>,%a0
465ba: b1f9 0006 13cc cmpal 613cc <aio_request_queue+0x54>,%a0
465c0: 6650 bnes 46612 <rtems_aio_handle+0x200>
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);
465c2: 2f02 movel %d2,%sp@-
465c4: 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;
465c8: 52b9 0006 13e0 addql #1,613e0 <aio_request_queue+0x68>
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
465ce: 2046 moveal %d6,%a0
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;
--aio_request_queue.active_threads;
465d0: 53b9 0006 13dc subql #1,613dc <aio_request_queue+0x64>
clock_gettime (CLOCK_REALTIME, &timeout);
465d6: 4e90 jsr %a0@
timeout.tv_sec += 3;
465d8: 56ae fff4 addql #3,%fp@(-12)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
465dc: 2045 moveal %d5,%a0
465de: 2f02 movel %d2,%sp@-
465e0: 4879 0006 1378 pea 61378 <aio_request_queue>
465e6: 4879 0006 137c pea 6137c <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;
465ec: 42ae fff8 clrl %fp@(-8)
result = pthread_cond_timedwait (&aio_request_queue.new_req,
465f0: 4e90 jsr %a0@
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
465f2: 4fef 0014 lea %sp@(20),%sp
465f6: 7274 moveq #116,%d1
465f8: b280 cmpl %d0,%d1
465fa: 6616 bnes 46612 <rtems_aio_handle+0x200> <== NEVER TAKEN
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
pthread_mutex_unlock (&aio_request_queue.mutex);
465fc: 4879 0006 1378 pea 61378 <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;
46602: 53b9 0006 13e0 subql #1,613e0 <aio_request_queue+0x68>
pthread_mutex_unlock (&aio_request_queue.mutex);
46608: 4eb9 0004 7110 jsr 47110 <pthread_mutex_unlock>
return NULL;
4660e: 588f addql #4,%sp
46610: 602e bras 46640 <rtems_aio_handle+0x22e>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
46612: 2479 0006 13cc moveal 613cc <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;
46618: 53b9 0006 13e0 subql #1,613e0 <aio_request_queue+0x68>
++aio_request_queue.active_threads;
4661e: 52b9 0006 13dc addql #1,613dc <aio_request_queue+0x64>
46624: 2f0a movel %a2,%sp@-
46626: 4e94 jsr %a4@
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);
46628: 2f0a movel %a2,%sp@-
4662a: 4eb9 0004 63dc jsr 463dc <rtems_aio_move_to_work>
46630: 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);
46632: 4879 0006 1378 pea 61378 <aio_request_queue>
46638: 4e95 jsr %a5@
4663a: 588f addql #4,%sp
4663c: 6000 fe0e braw 4644c <rtems_aio_handle+0x3a>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
46640: 4280 clrl %d0
46642: 4cee 3cfc ffa8 moveml %fp@(-88),%d2-%d7/%a2-%a5
46648: 4e5e unlk %fp <== NOT EXECUTED
00046260 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
46260: 4e56 0000 linkw %fp,#0
46264: 2f02 movel %d2,%sp@-
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
46266: 4879 0006 1380 pea 61380 <aio_request_queue+0x8>
4626c: 4eb9 0004 721c jsr 4721c <pthread_attr_init>
if (result != 0)
46272: 588f addql #4,%sp
int
rtems_aio_init (void)
{
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
46274: 2400 movel %d0,%d2
if (result != 0)
46276: 6600 00c8 bnew 46340 <rtems_aio_init+0xe0>
return result;
result =
4627a: 42a7 clrl %sp@-
4627c: 4879 0006 1380 pea 61380 <aio_request_queue+0x8>
46282: 4eb9 0004 7248 jsr 47248 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
46288: 508f addql #8,%sp
4628a: 4a80 tstl %d0
4628c: 670e beqs 4629c <rtems_aio_init+0x3c> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
4628e: 4879 0006 1380 pea 61380 <aio_request_queue+0x8> <== NOT EXECUTED
46294: 4eb9 0004 7200 jsr 47200 <pthread_attr_destroy> <== NOT EXECUTED
4629a: 588f addql #4,%sp <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
4629c: 42a7 clrl %sp@-
4629e: 4879 0006 1378 pea 61378 <aio_request_queue>
462a4: 4eb9 0004 6f60 jsr 46f60 <pthread_mutex_init>
if (result != 0)
462aa: 508f addql #8,%sp
462ac: 4a80 tstl %d0
462ae: 670e beqs 462be <rtems_aio_init+0x5e> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
462b0: 4879 0006 1380 pea 61380 <aio_request_queue+0x8> <== NOT EXECUTED
462b6: 4eb9 0004 7200 jsr 47200 <pthread_attr_destroy> <== NOT EXECUTED
462bc: 588f addql #4,%sp <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
462be: 42a7 clrl %sp@-
462c0: 4879 0006 137c pea 6137c <aio_request_queue+0x4>
462c6: 4eb9 0004 6c00 jsr 46c00 <pthread_cond_init>
if (result != 0) {
462cc: 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);
462ce: 2400 movel %d0,%d2
if (result != 0) {
462d0: 671a beqs 462ec <rtems_aio_init+0x8c> <== ALWAYS TAKEN
pthread_mutex_destroy (&aio_request_queue.mutex);
462d2: 4879 0006 1378 pea 61378 <aio_request_queue> <== NOT EXECUTED
462d8: 4eb9 0004 6e40 jsr 46e40 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
462de: 4879 0006 1380 pea 61380 <aio_request_queue+0x8> <== NOT EXECUTED
462e4: 4eb9 0004 7200 jsr 47200 <pthread_attr_destroy> <== NOT EXECUTED
462ea: 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;
462ec: 42b9 0006 13c4 clrl 613c4 <aio_request_queue+0x4c>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
462f2: 203c 0006 13c4 movel #398276,%d0
462f8: 23c0 0006 13c0 movel %d0,613c0 <aio_request_queue+0x48>
head->previous = NULL;
tail->previous = head;
462fe: 203c 0006 13c0 movel #398272,%d0
46304: 23c0 0006 13c8 movel %d0,613c8 <aio_request_queue+0x50>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
4630a: 203c 0006 13d0 movel #398288,%d0
46310: 23c0 0006 13cc movel %d0,613cc <aio_request_queue+0x54>
head->previous = NULL;
tail->previous = head;
46316: 203c 0006 13cc movel #398284,%d0
4631c: 23c0 0006 13d4 movel %d0,613d4 <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;
46322: 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;
46328: 42b9 0006 13d0 clrl 613d0 <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;
4632e: 42b9 0006 13dc clrl 613dc <aio_request_queue+0x64>
aio_request_queue.idle_threads = 0;
46334: 42b9 0006 13e0 clrl 613e0 <aio_request_queue+0x68>
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
4633a: 23c0 0006 13d8 movel %d0,613d8 <aio_request_queue+0x60>
return result;
}
46340: 2002 movel %d2,%d0
46342: 242e fffc movel %fp@(-4),%d2
46346: 4e5e unlk %fp <== NOT EXECUTED
0004664c <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
4664c: 4e56 0000 linkw %fp,#0
46650: 202e 0008 movel %fp@(8),%d0
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
46654: 2240 moveal %d0,%a1
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
46656: 2f0b movel %a3,%sp@-
46658: 2f0a movel %a2,%sp@-
4665a: 246e 000c moveal %fp@(12),%a2
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
4665e: 2059 moveal %a1@+,%a0
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
46660: b3c8 cmpal %a0,%a1
46662: 672e beqs 46692 <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;
46664: 2668 0014 moveal %a0@(20),%a3
46668: 202b 0014 movel %a3@(20),%d0
while (req->aiocbp->aio_reqprio > prio &&
4666c: 266a 0014 moveal %a2@(20),%a3
46670: 222b 0014 movel %a3@(20),%d1
46674: 600a bras 46680 <rtems_aio_insert_prio+0x34>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
46676: 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;
46678: 2668 0014 moveal %a0@(20),%a3 <== NOT EXECUTED
4667c: 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 &&
46680: b081 cmpl %d1,%d0
46682: 6c04 bges 46688 <rtems_aio_insert_prio+0x3c> <== ALWAYS TAKEN
46684: b3c8 cmpal %a0,%a1 <== NOT EXECUTED
46686: 66ee bnes 46676 <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 );
46688: 2d4a 000c movel %a2,%fp@(12)
4668c: 2d68 0004 0008 movel %a0@(4),%fp@(8)
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
46692: 245f moveal %sp@+,%a2
46694: 265f moveal %sp@+,%a3
46696: 4e5e unlk %fp
46698: 4ef9 0004 8914 jmp 48914 <_Chain_Insert>
000463dc <rtems_aio_move_to_work>:
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
463dc: 4e56 0000 linkw %fp,#0
463e0: 226e 0008 moveal %fp@(8),%a1
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
463e4: 2079 0006 13c0 moveal 613c0 <aio_request_queue+0x48>,%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 &&
463ea: 2029 0014 movel %a1@(20),%d0
463ee: 6002 bras 463f2 <rtems_aio_move_to_work+0x16>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
463f0: 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 &&
463f2: b0a8 0014 cmpl %a0@(20),%d0
463f6: 6f08 bles 46400 <rtems_aio_move_to_work+0x24>
463f8: b1fc 0006 13c4 cmpal #398276,%a0
463fe: 66f0 bnes 463f0 <rtems_aio_move_to_work+0x14> <== ALWAYS TAKEN
46400: 2f09 movel %a1,%sp@-
46402: 2f28 0004 movel %a0@(4),%sp@-
46406: 4eb9 0004 8914 jsr 48914 <_Chain_Insert>
4640c: 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);
}
4640e: 4e5e unlk %fp <== NOT EXECUTED
000466f4 <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)
{
466f4: 4e56 0000 linkw %fp,#0
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
466f8: 206e 0008 moveal %fp@(8),%a0
* 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)
{
466fc: 2f0a movel %a2,%sp@-
466fe: 202e 000c movel %fp@(12),%d0
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
46702: 2458 moveal %a0@+,%a2
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
46704: b1ca cmpal %a2,%a0
46706: 6608 bnes 46710 <rtems_aio_remove_req+0x1c>
46708: 6038 bras 46742 <rtems_aio_remove_req+0x4e>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
4670a: 2451 moveal %a1@,%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) {
4670c: b1ca cmpal %a2,%a0 <== NOT EXECUTED
4670e: 6736 beqs 46746 <rtems_aio_remove_req+0x52> <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
46710: 224a moveal %a2,%a1
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) {
46712: b0aa 0014 cmpl %a2@(20),%d0
46716: 66f2 bnes 4670a <rtems_aio_remove_req+0x16> <== NEVER TAKEN
46718: 2f0a movel %a2,%sp@-
4671a: 4eb9 0004 88b8 jsr 488b8 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
46720: 206a 0014 moveal %a2@(20),%a0
46724: 203c 0000 008c movel #140,%d0
4672a: 2140 0030 movel %d0,%a0@(48)
current->aiocbp->return_value = -1;
4672e: 70ff moveq #-1,%d0
46730: 2140 0034 movel %d0,%a0@(52)
free (current);
46734: 2f0a movel %a2,%sp@-
46736: 4eb9 0004 3434 jsr 43434 <free>
}
return AIO_CANCELED;
4673c: 508f addql #8,%sp
4673e: 4280 clrl %d0
46740: 6006 bras 46748 <rtems_aio_remove_req+0x54>
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
46742: 7002 moveq #2,%d0
46744: 6002 bras 46748 <rtems_aio_remove_req+0x54>
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
46746: 7001 moveq #1,%d0 <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
46748: 246e fffc moveal %fp@(-4),%a2
4674c: 4e5e unlk %fp <== NOT EXECUTED
0004cf60 <rtems_barrier_delete>:
*/
rtems_status_code rtems_barrier_delete(
rtems_id id
)
{
4cf60: 4e56 fffc linkw %fp,#-4
4cf64: 2f0a movel %a2,%sp@-
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
_Objects_Get( &_Barrier_Information, id, location );
4cf66: 486e fffc pea %fp@(-4)
4cf6a: 2f2e 0008 movel %fp@(8),%sp@-
4cf6e: 4879 0006 15b8 pea 615b8 <_Barrier_Information>
4cf74: 4eb9 0004 8c14 jsr 48c14 <_Objects_Get>
Barrier_Control *the_barrier;
Objects_Locations location;
the_barrier = _Barrier_Get( id, &location );
switch ( location ) {
4cf7a: 4fef 000c lea %sp@(12),%sp
4cf7e: 2440 moveal %d0,%a2
4cf80: 4aae fffc tstl %fp@(-4)
4cf84: 663a bnes 4cfc0 <rtems_barrier_delete+0x60> <== NEVER TAKEN
case OBJECTS_LOCAL:
_CORE_barrier_Flush(
4cf86: 4878 0002 pea 2 <DOUBLE_FLOAT>
4cf8a: 42a7 clrl %sp@-
4cf8c: 486a 0014 pea %a2@(20)
4cf90: 4eb9 0004 9db8 jsr 49db8 <_Thread_queue_Flush>
&the_barrier->Barrier,
NULL,
CORE_BARRIER_WAS_DELETED
);
_Objects_Close( &_Barrier_Information, &the_barrier->Object );
4cf96: 2f0a movel %a2,%sp@-
4cf98: 4879 0006 15b8 pea 615b8 <_Barrier_Information>
4cf9e: 4eb9 0004 883c jsr 4883c <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Barrier_Free (
Barrier_Control *the_barrier
)
{
_Objects_Free( &_Barrier_Information, &the_barrier->Object );
4cfa4: 2f0a movel %a2,%sp@-
4cfa6: 4879 0006 15b8 pea 615b8 <_Barrier_Information>
4cfac: 4eb9 0004 8ab0 jsr 48ab0 <_Objects_Free>
_Barrier_Free( the_barrier );
_Thread_Enable_dispatch();
4cfb2: 4eb9 0004 977a jsr 4977a <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4cfb8: 4fef 001c lea %sp@(28),%sp
4cfbc: 4280 clrl %d0
4cfbe: 6002 bras 4cfc2 <rtems_barrier_delete+0x62>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4cfc0: 7004 moveq #4,%d0
}
4cfc2: 246e fff8 moveal %fp@(-8),%a2
4cfc6: 4e5e unlk %fp
...
000464a4 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
464a4: 4e56 ffe0 linkw %fp,#-32
464a8: 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(
464ac: 260e movel %fp,%d3
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
464ae: 47f9 0004 6a80 lea 46a80 <_Chain_Get>,%a3
464b4: 5983 subql #4,%d3
464b6: 45f9 0004 5930 lea 45930 <rtems_event_receive>,%a2
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
464bc: 2c2e 0008 movel %fp@(8),%d6
464c0: 2a2e 000c movel %fp@(12),%d5
464c4: 282e 0010 movel %fp@(16),%d4
464c8: 6012 bras 464dc <rtems_chain_get_with_wait+0x38>
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
464ca: 2f03 movel %d3,%sp@-
464cc: 2f04 movel %d4,%sp@-
464ce: 42a7 clrl %sp@-
464d0: 2f05 movel %d5,%sp@-
464d2: 4e92 jsr %a2@
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
464d4: 4fef 0010 lea %sp@(16),%sp
464d8: 4a80 tstl %d0
464da: 660c bnes 464e8 <rtems_chain_get_with_wait+0x44> <== ALWAYS TAKEN
464dc: 2f06 movel %d6,%sp@-
464de: 4e93 jsr %a3@
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
464e0: 588f addql #4,%sp
464e2: 2400 movel %d0,%d2
464e4: 67e4 beqs 464ca <rtems_chain_get_with_wait+0x26>
464e6: 4280 clrl %d0
timeout,
&out
);
}
*node_ptr = node;
464e8: 206e 0014 moveal %fp@(20),%a0
464ec: 2082 movel %d2,%a0@
return sc;
}
464ee: 4cee 0c7c ffe0 moveml %fp@(-32),%d2-%d6/%a2-%a3
464f4: 4e5e unlk %fp <== NOT EXECUTED
0004f3b8 <rtems_clock_get_tod_timeval>:
#include <rtems/score/watchdog.h>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
4f3b8: 4e56 fff8 linkw %fp,#-8
4f3bc: 2f0a movel %a2,%sp@-
4f3be: 246e 0008 moveal %fp@(8),%a2
4f3c2: 2f02 movel %d2,%sp@-
if ( !time )
4f3c4: 4a8a tstl %a2
4f3c6: 673c beqs 4f404 <rtems_clock_get_tod_timeval+0x4c><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
4f3c8: 4a39 0007 752c tstb 7752c <_TOD_Is_set>
4f3ce: 6738 beqs 4f408 <rtems_clock_get_tod_timeval+0x50><== NEVER TAKEN
{
ISR_Level level;
struct timespec now;
suseconds_t useconds;
_ISR_Disable(level);
4f3d0: 203c 0000 0700 movel #1792,%d0
4f3d6: 40c2 movew %sr,%d2
4f3d8: 8082 orl %d2,%d0
4f3da: 46c0 movew %d0,%sr
_TOD_Get( &now );
4f3dc: 486e fff8 pea %fp@(-8)
4f3e0: 4eb9 0005 355c jsr 5355c <_TOD_Get>
_ISR_Enable(level);
4f3e6: 46c2 movew %d2,%sr
useconds = (suseconds_t)now.tv_nsec;
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
time->tv_sec = now.tv_sec;
time->tv_usec = useconds;
4f3e8: 243c 0000 03e8 movel #1000,%d2
return RTEMS_NOT_DEFINED;
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
4f3ee: 588f addql #4,%sp
_ISR_Disable(level);
_TOD_Get( &now );
_ISR_Enable(level);
useconds = (suseconds_t)now.tv_nsec;
4f3f0: 202e fffc movel %fp@(-4),%d0
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
time->tv_sec = now.tv_sec;
time->tv_usec = useconds;
4f3f4: 4c42 0800 remsl %d2,%d0,%d0
_ISR_Enable(level);
useconds = (suseconds_t)now.tv_nsec;
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
time->tv_sec = now.tv_sec;
4f3f8: 24ae fff8 movel %fp@(-8),%a2@
time->tv_usec = useconds;
4f3fc: 2540 0004 movel %d0,%a2@(4)
4f400: 4280 clrl %d0
4f402: 6006 bras 4f40a <rtems_clock_get_tod_timeval+0x52>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
if ( !time )
return RTEMS_INVALID_ADDRESS;
4f404: 7009 moveq #9,%d0
4f406: 6002 bras 4f40a <rtems_clock_get_tod_timeval+0x52>
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
4f408: 700b moveq #11,%d0
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
}
4f40a: 242e fff0 movel %fp@(-16),%d2
4f40e: 246e fff4 moveal %fp@(-12),%a2
4f412: 4e5e unlk %fp
...
00047dc0 <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)
{
47dc0: 4e56 fff0 linkw %fp,#-16
47dc4: 48d7 1c04 moveml %d2/%a2-%a4,%sp@
47dc8: 286e 0008 moveal %fp@(8),%a4
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
47dcc: 4a8c tstl %a4
47dce: 6738 beqs 47e08 <rtems_iterate_over_all_threads+0x48><== NEVER TAKEN
47dd0: 45f9 0006 0e08 lea 60e08 <_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 ];
47dd6: 205a moveal %a2@+,%a0
47dd8: 2668 0004 moveal %a0@(4),%a3
if ( !information )
47ddc: 4a8b tstl %a3
47dde: 6720 beqs 47e00 <rtems_iterate_over_all_threads+0x40>
47de0: 7401 moveq #1,%d2
47de2: 6012 bras 47df6 <rtems_iterate_over_all_threads+0x36>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
47de4: 206b 0018 moveal %a3@(24),%a0
47de8: 2030 2c00 movel %a0@(00000000,%d2:l:4),%d0
if ( !the_thread )
47dec: 6706 beqs 47df4 <rtems_iterate_over_all_threads+0x34><== NEVER TAKEN
continue;
(*routine)(the_thread);
47dee: 2f00 movel %d0,%sp@-
47df0: 4e94 jsr %a4@
47df2: 588f addql #4,%sp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
47df4: 5282 addql #1,%d2
47df6: 4280 clrl %d0
47df8: 302b 000e movew %a3@(14),%d0
47dfc: b082 cmpl %d2,%d0
47dfe: 64e4 bccs 47de4 <rtems_iterate_over_all_threads+0x24>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
47e00: b5fc 0006 0e14 cmpal #396820,%a2
47e06: 66ce bnes 47dd6 <rtems_iterate_over_all_threads+0x16>
(*routine)(the_thread);
}
}
}
47e08: 4cee 1c04 fff0 moveml %fp@(-16),%d2/%a2-%a4
47e0e: 4e5e unlk %fp
...
00050188 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
50188: 4e56 fffc linkw %fp,#-4
5018c: 2f0a movel %a2,%sp@-
5018e: 2f02 movel %d2,%sp@-
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
50190: 486e fffc pea %fp@(-4)
50194: 2f2e 0008 movel %fp@(8),%sp@-
50198: 4879 0007 73b2 pea 773b2 <_Partition_Information>
5019e: 242e 000c movel %fp@(12),%d2
501a2: 4eb9 0005 46c4 jsr 546c4 <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
501a8: 4fef 000c lea %sp@(12),%sp
501ac: 2440 moveal %d0,%a2
501ae: 4aae fffc tstl %fp@(-4)
501b2: 663e bnes 501f2 <rtems_partition_return_buffer+0x6a>
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
501b4: 202a 0010 movel %a2@(16),%d0
ending = _Addresses_Add_offset( starting, the_partition->length );
501b8: 222a 0014 movel %a2@(20),%d1
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
501bc: b082 cmpl %d2,%d0
501be: 6240 bhis 50200 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
501c0: d280 addl %d0,%d1
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
501c2: b282 cmpl %d2,%d1
501c4: 653a bcss 50200 <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);
501c6: 2202 movel %d2,%d1
501c8: 9280 subl %d0,%d1
501ca: 2001 movel %d1,%d0
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
501cc: 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 ) &&
501d2: 4a81 tstl %d1
501d4: 662a bnes 50200 <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 );
501d6: 2f02 movel %d2,%sp@-
501d8: 486a 0024 pea %a2@(36)
501dc: 4eb9 0005 2d24 jsr 52d24 <_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;
501e2: 53aa 0020 subql #1,%a2@(32)
_Thread_Enable_dispatch();
501e6: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
501ec: 508f addql #8,%sp
501ee: 4280 clrl %d0
501f0: 6002 bras 501f4 <rtems_partition_return_buffer+0x6c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
501f2: 7004 moveq #4,%d0
}
501f4: 242e fff4 movel %fp@(-12),%d2
501f8: 246e fff8 moveal %fp@(-8),%a2
501fc: 4e5e unlk %fp
501fe: 4e75 rts
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
50200: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
50206: 7009 moveq #9,%d0
50208: 60ea bras 501f4 <rtems_partition_return_buffer+0x6c>
...
0004f7ac <rtems_port_internal_to_external>:
rtems_status_code rtems_port_internal_to_external(
rtems_id id,
void *internal,
void **external
)
{
4f7ac: 4e56 fffc linkw %fp,#-4
4f7b0: 2f0a movel %a2,%sp@-
4f7b2: 246e 0010 moveal %fp@(16),%a2
4f7b6: 2f02 movel %d2,%sp@-
4f7b8: 242e 000c movel %fp@(12),%d2
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
4f7bc: 4a8a tstl %a2
4f7be: 6740 beqs 4f800 <rtems_port_internal_to_external+0x54><== NEVER TAKEN
4f7c0: 486e fffc pea %fp@(-4)
4f7c4: 2f2e 0008 movel %fp@(8),%sp@-
4f7c8: 4879 0007 7378 pea 77378 <_Dual_ported_memory_Information>
4f7ce: 4eb9 0005 46c4 jsr 546c4 <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
4f7d4: 4fef 000c lea %sp@(12),%sp
4f7d8: 2040 moveal %d0,%a0
4f7da: 4aae fffc tstl %fp@(-4)
4f7de: 6624 bnes 4f804 <rtems_port_internal_to_external+0x58><== NEVER TAKEN
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
4f7e0: 2002 movel %d2,%d0
4f7e2: 90a8 0010 subl %a0@(16),%d0
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( internal, the_port->internal_base );
if ( ending > the_port->length )
4f7e6: b0a8 0018 cmpl %a0@(24),%d0
4f7ea: 6304 blss 4f7f0 <rtems_port_internal_to_external+0x44>
*external = internal;
4f7ec: 2482 movel %d2,%a2@
4f7ee: 6006 bras 4f7f6 <rtems_port_internal_to_external+0x4a>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
4f7f0: d0a8 0014 addl %a0@(20),%d0
4f7f4: 2480 movel %d0,%a2@
else
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
4f7f6: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4f7fc: 4280 clrl %d0
4f7fe: 6006 bras 4f806 <rtems_port_internal_to_external+0x5a>
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
return RTEMS_INVALID_ADDRESS;
4f800: 7009 moveq #9,%d0
4f802: 6002 bras 4f806 <rtems_port_internal_to_external+0x5a>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4f804: 7004 moveq #4,%d0
}
4f806: 242e fff4 movel %fp@(-12),%d2
4f80a: 246e fff8 moveal %fp@(-8),%a2
4f80e: 4e5e unlk %fp
...
0004bfb4 <rtems_rate_monotonic_get_statistics>:
rtems_status_code rtems_rate_monotonic_get_statistics(
rtems_id id,
rtems_rate_monotonic_period_statistics *statistics
)
{
4bfb4: 4e56 fffc linkw %fp,#-4
4bfb8: 2f0a movel %a2,%sp@-
4bfba: 246e 000c moveal %fp@(12),%a2
Objects_Locations location;
Rate_monotonic_Control *the_period;
rtems_rate_monotonic_period_statistics *dst;
Rate_monotonic_Statistics *src;
if ( !statistics )
4bfbe: 4a8a tstl %a2
4bfc0: 6700 0096 beqw 4c058 <rtems_rate_monotonic_get_statistics+0xa4>
4bfc4: 486e fffc pea %fp@(-4)
4bfc8: 2f2e 0008 movel %fp@(8),%sp@-
4bfcc: 4879 0006 04ec pea 604ec <_Rate_monotonic_Information>
4bfd2: 4eb9 0004 8540 jsr 48540 <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
4bfd8: 4fef 000c lea %sp@(12),%sp
4bfdc: 2040 moveal %d0,%a0
4bfde: 4aae fffc tstl %fp@(-4)
4bfe2: 6678 bnes 4c05c <rtems_rate_monotonic_get_statistics+0xa8><== NEVER TAKEN
case OBJECTS_LOCAL:
dst = statistics;
src = &the_period->Statistics;
dst->count = src->count;
4bfe4: 24a8 0054 movel %a0@(84),%a2@
dst->missed_count = src->missed_count;
4bfe8: 2568 0058 0004 movel %a0@(88),%a2@(4)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec( &src->min_cpu_time, &dst->min_cpu_time );
4bfee: 2028 005c movel %a0@(92),%d0
4bff2: 2228 0060 movel %a0@(96),%d1
4bff6: 2540 0008 movel %d0,%a2@(8)
4bffa: 2541 000c movel %d1,%a2@(12)
_Timestamp_To_timespec( &src->max_cpu_time, &dst->max_cpu_time );
4bffe: 2028 0064 movel %a0@(100),%d0
4c002: 2228 0068 movel %a0@(104),%d1
4c006: 2540 0010 movel %d0,%a2@(16)
4c00a: 2541 0014 movel %d1,%a2@(20)
_Timestamp_To_timespec( &src->total_cpu_time, &dst->total_cpu_time );
4c00e: 2028 006c movel %a0@(108),%d0
4c012: 2228 0070 movel %a0@(112),%d1
4c016: 2540 0018 movel %d0,%a2@(24)
4c01a: 2541 001c movel %d1,%a2@(28)
_Timestamp_To_timespec( &src->min_wall_time, &dst->min_wall_time );
4c01e: 2028 0074 movel %a0@(116),%d0
4c022: 2228 0078 movel %a0@(120),%d1
4c026: 2540 0020 movel %d0,%a2@(32)
4c02a: 2541 0024 movel %d1,%a2@(36)
_Timestamp_To_timespec( &src->max_wall_time, &dst->max_wall_time );
4c02e: 2028 007c movel %a0@(124),%d0
4c032: 2228 0080 movel %a0@(128),%d1
4c036: 2540 0028 movel %d0,%a2@(40)
4c03a: 2541 002c movel %d1,%a2@(44)
_Timestamp_To_timespec( &src->total_wall_time, &dst->total_wall_time );
4c03e: 2028 0084 movel %a0@(132),%d0
4c042: 2228 0088 movel %a0@(136),%d1
4c046: 2540 0030 movel %d0,%a2@(48)
4c04a: 2541 0034 movel %d1,%a2@(52)
dst->min_wall_time = src->min_wall_time;
dst->max_wall_time = src->max_wall_time;
dst->total_wall_time = src->total_wall_time;
#endif
_Thread_Enable_dispatch();
4c04e: 4eb9 0004 90ea jsr 490ea <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4c054: 4280 clrl %d0
4c056: 6006 bras 4c05e <rtems_rate_monotonic_get_statistics+0xaa>
Rate_monotonic_Control *the_period;
rtems_rate_monotonic_period_statistics *dst;
Rate_monotonic_Statistics *src;
if ( !statistics )
return RTEMS_INVALID_ADDRESS;
4c058: 7009 moveq #9,%d0
4c05a: 6002 bras 4c05e <rtems_rate_monotonic_get_statistics+0xaa>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4c05c: 7004 moveq #4,%d0
}
4c05e: 246e fff8 moveal %fp@(-8),%a2
4c062: 4e5e unlk %fp
...
00046586 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
46586: 4e56 ffec linkw %fp,#-20
4658a: 48d7 041c moveml %d2-%d4/%a2,%sp@
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
4658e: 486e fffc pea %fp@(-4)
46592: 262e 0008 movel %fp@(8),%d3
46596: 2f03 movel %d3,%sp@-
46598: 4879 0006 04ec pea 604ec <_Rate_monotonic_Information>
4659e: 242e 000c movel %fp@(12),%d2
465a2: 4eb9 0004 8540 jsr 48540 <_Objects_Get>
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
465a8: 4fef 000c lea %sp@(12),%sp
465ac: 2440 moveal %d0,%a2
465ae: 4aae fffc tstl %fp@(-4)
465b2: 6600 0148 bnew 466fc <rtems_rate_monotonic_period+0x176>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
465b6: 2039 0006 0a4c movel 60a4c <_Per_CPU_Information+0xc>,%d0
465bc: b0aa 0040 cmpl %a2@(64),%d0
465c0: 670c beqs 465ce <rtems_rate_monotonic_period+0x48>
_Thread_Enable_dispatch();
465c2: 4eb9 0004 90ea jsr 490ea <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
465c8: 7417 moveq #23,%d2
465ca: 6000 0132 braw 466fe <rtems_rate_monotonic_period+0x178>
}
if ( length == RTEMS_PERIOD_STATUS ) {
465ce: 4a82 tstl %d2
465d0: 6622 bnes 465f4 <rtems_rate_monotonic_period+0x6e>
switch ( the_period->state ) {
465d2: 202a 0038 movel %a2@(56),%d0
465d6: 7204 moveq #4,%d1
465d8: b280 cmpl %d0,%d1
465da: 650c bcss 465e8 <rtems_rate_monotonic_period+0x62><== NEVER TAKEN
465dc: 41f9 0005 db46 lea 5db46 <CSWTCH.2>,%a0
465e2: 2430 0c00 movel %a0@(00000000,%d0:l:4),%d2
465e6: 6002 bras 465ea <rtems_rate_monotonic_period+0x64>
465e8: 4282 clrl %d2 <== NOT EXECUTED
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
465ea: 4eb9 0004 90ea jsr 490ea <_Thread_Enable_dispatch>
return( return_value );
465f0: 6000 010c braw 466fe <rtems_rate_monotonic_period+0x178>
}
_ISR_Disable( level );
465f4: 203c 0000 0700 movel #1792,%d0
465fa: 40c4 movew %sr,%d4
465fc: 8084 orl %d4,%d0
465fe: 46c0 movew %d0,%sr
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
46600: 202a 0038 movel %a2@(56),%d0
46604: 664a bnes 46650 <rtems_rate_monotonic_period+0xca>
_ISR_Enable( level );
46606: 46c4 movew %d4,%sr
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
46608: 2f0a movel %a2,%sp@-
4660a: 4eb9 0004 641a jsr 4641a <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
46610: 7002 moveq #2,%d0
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
46612: 223c 0004 6948 movel #289096,%d1
46618: 2540 0038 movel %d0,%a2@(56)
4661c: 2541 002c movel %d1,%a2@(44)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
46620: 42aa 0018 clrl %a2@(24)
the_watchdog->routine = routine;
the_watchdog->id = id;
46624: 2543 0030 movel %d3,%a2@(48)
the_watchdog->user_data = user_data;
46628: 42aa 0034 clrl %a2@(52)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
4662c: 2542 003c movel %d2,%a2@(60)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
46630: 2542 001c movel %d2,%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
46634: 486a 0010 pea %a2@(16)
46638: 4879 0006 06a2 pea 606a2 <_Watchdog_Ticks_chain>
4663e: 4eb9 0004 9e70 jsr 49e70 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
46644: 4eb9 0004 90ea jsr 490ea <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
4664a: 4fef 000c lea %sp@(12),%sp
4664e: 606c bras 466bc <rtems_rate_monotonic_period+0x136>
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
46650: 7202 moveq #2,%d1
46652: b280 cmpl %d0,%d1
46654: 666a bnes 466c0 <rtems_rate_monotonic_period+0x13a>
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
46656: 2f0a movel %a2,%sp@-
46658: 4eb9 0004 6492 jsr 46492 <_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;
4665e: 7001 moveq #1,%d0
the_period->next_length = length;
46660: 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;
46664: 2540 0038 movel %d0,%a2@(56)
the_period->next_length = length;
_ISR_Enable( level );
46668: 46c4 movew %d4,%sr
_Thread_Executing->Wait.id = the_period->Object.id;
4666a: 2079 0006 0a4c moveal 60a4c <_Per_CPU_Information+0xc>,%a0
46670: 216a 0008 0020 movel %a2@(8),%a0@(32)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
46676: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
4667a: 2f08 movel %a0,%sp@-
4667c: 4eb9 0004 987c jsr 4987c <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
46682: 203c 0000 0700 movel #1792,%d0
46688: 40c1 movew %sr,%d1
4668a: 8081 orl %d1,%d0
4668c: 46c0 movew %d0,%sr
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
4668e: 7402 moveq #2,%d2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
46690: 202a 0038 movel %a2@(56),%d0
the_period->state = RATE_MONOTONIC_ACTIVE;
46694: 2542 0038 movel %d2,%a2@(56)
_ISR_Enable( level );
46698: 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 )
4669a: 7203 moveq #3,%d1
4669c: 4fef 000c lea %sp@(12),%sp
466a0: b280 cmpl %d0,%d1
466a2: 6612 bnes 466b6 <rtems_rate_monotonic_period+0x130>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
466a4: 4878 4000 pea 4000 <D_MAX_EXP+0x3801>
466a8: 2f39 0006 0a4c movel 60a4c <_Per_CPU_Information+0xc>,%sp@-
466ae: 4eb9 0004 8da8 jsr 48da8 <_Thread_Clear_state>
466b4: 508f addql #8,%sp
_Thread_Enable_dispatch();
466b6: 4eb9 0004 90ea jsr 490ea <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
466bc: 4282 clrl %d2
466be: 603e bras 466fe <rtems_rate_monotonic_period+0x178>
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
466c0: 7204 moveq #4,%d1
466c2: b280 cmpl %d0,%d1
466c4: 6636 bnes 466fc <rtems_rate_monotonic_period+0x176><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
466c6: 2f0a movel %a2,%sp@-
466c8: 4eb9 0004 6492 jsr 46492 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
466ce: 46c4 movew %d4,%sr
the_period->state = RATE_MONOTONIC_ACTIVE;
466d0: 7002 moveq #2,%d0
the_period->next_length = length;
466d2: 2542 003c movel %d2,%a2@(60)
*/
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
466d6: 2540 0038 movel %d0,%a2@(56)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
466da: 2542 001c movel %d2,%a2@(28)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
466de: 486a 0010 pea %a2@(16)
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
466e2: 7406 moveq #6,%d2
466e4: 4879 0006 06a2 pea 606a2 <_Watchdog_Ticks_chain>
466ea: 4eb9 0004 9e70 jsr 49e70 <_Watchdog_Insert>
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
466f0: 4eb9 0004 90ea jsr 490ea <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
466f6: 4fef 000c lea %sp@(12),%sp
466fa: 6002 bras 466fe <rtems_rate_monotonic_period+0x178>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
466fc: 7404 moveq #4,%d2
}
466fe: 2002 movel %d2,%d0
46700: 4cee 041c ffec moveml %fp@(-20),%d2-%d4/%a2
46706: 4e5e unlk %fp
...
00050d70 <rtems_region_get_segment_size>:
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
uintptr_t *size
)
{
50d70: 4e56 fffc linkw %fp,#-4
50d74: 2f03 movel %d3,%sp@-
50d76: 262e 0010 movel %fp@(16),%d3
50d7a: 2f02 movel %d2,%sp@-
50d7c: 242e 000c movel %fp@(12),%d2
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
50d80: 6768 beqs 50dea <rtems_region_get_segment_size+0x7a>
return RTEMS_INVALID_ADDRESS;
if ( !size )
50d82: 4a83 tstl %d3
50d84: 6764 beqs 50dea <rtems_region_get_segment_size+0x7a>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
50d86: 2f39 0007 75bc movel 775bc <_RTEMS_Allocator_Mutex>,%sp@-
50d8c: 4eb9 0005 2c90 jsr 52c90 <_API_Mutex_Lock>
50d92: 486e fffc pea %fp@(-4)
50d96: 2f2e 0008 movel %fp@(8),%sp@-
50d9a: 4879 0007 7426 pea 77426 <_Region_Information>
50da0: 4eb9 0005 468c jsr 5468c <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
50da6: 222e fffc movel %fp@(-4),%d1
50daa: 4fef 0010 lea %sp@(16),%sp
50dae: 6708 beqs 50db8 <rtems_region_get_segment_size+0x48>
50db0: 7001 moveq #1,%d0
50db2: b081 cmpl %d1,%d0
50db4: 661a bnes 50dd0 <rtems_region_get_segment_size+0x60><== NEVER TAKEN
50db6: 601c bras 50dd4 <rtems_region_get_segment_size+0x64>
case OBJECTS_LOCAL:
if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) )
50db8: 2f03 movel %d3,%sp@-
50dba: 2040 moveal %d0,%a0
50dbc: 2f02 movel %d2,%sp@-
50dbe: 4868 0068 pea %a0@(104)
50dc2: 4eb9 0005 4104 jsr 54104 <_Heap_Size_of_alloc_area>
50dc8: 4fef 000c lea %sp@(12),%sp
50dcc: 4a00 tstb %d0
50dce: 6708 beqs 50dd8 <rtems_region_get_segment_size+0x68><== NEVER TAKEN
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
50dd0: 4282 clrl %d2
50dd2: 6006 bras 50dda <rtems_region_get_segment_size+0x6a>
case OBJECTS_REMOTE: /* this error cannot be returned */
break;
#endif
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
50dd4: 7404 moveq #4,%d2
50dd6: 6002 bras 50dda <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;
50dd8: 7409 moveq #9,%d2 <== NOT EXECUTED
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
50dda: 2f39 0007 75bc movel 775bc <_RTEMS_Allocator_Mutex>,%sp@-
50de0: 4eb9 0005 2cf0 jsr 52cf0 <_API_Mutex_Unlock>
return return_status;
50de6: 588f addql #4,%sp
50de8: 6002 bras 50dec <rtems_region_get_segment_size+0x7c>
if ( !segment )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
50dea: 7409 moveq #9,%d2
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
50dec: 2002 movel %d2,%d0
50dee: 242e fff4 movel %fp@(-12),%d2
50df2: 262e fff8 movel %fp@(-8),%d3
50df6: 4e5e unlk %fp
...
00045e94 <rtems_shutdown_executive>:
void rtems_shutdown_executive(
uint32_t result
)
{
if ( _System_state_Is_up( _System_state_Get() ) ) {
45e94: 7003 moveq #3,%d0
*/
void rtems_shutdown_executive(
uint32_t result
)
{
45e96: 4e56 0000 linkw %fp,#0
if ( _System_state_Is_up( _System_state_Get() ) ) {
45e9a: b0b9 0005 eb14 cmpl 5eb14 <_System_state_Current>,%d0
45ea0: 6618 bnes 45eba <rtems_shutdown_executive+0x26>
45ea2: 103c 0004 moveb #4,%d0
* 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 );
45ea6: 4879 0005 e994 pea 5e994 <_Thread_BSP_context>
45eac: 23c0 0005 eb14 movel %d0,5eb14 <_System_state_Current>
45eb2: 4eb9 0004 8a5a jsr 48a5a <_CPU_Context_Restart_self>
45eb8: 588f addql #4,%sp <== NOT EXECUTED
_System_state_Set( SYSTEM_STATE_SHUTDOWN );
_Thread_Stop_multitasking();
}
_Internal_error_Occurred(
45eba: 4878 0014 pea 14 <OPER2>
45ebe: 4878 0001 pea 1 <ADD>
45ec2: 42a7 clrl %sp@-
45ec4: 4eb9 0004 6a08 jsr 46a08 <_Internal_error_Occurred>
...
000513d0 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
513d0: 4e56 fffc linkw %fp,#-4
513d4: 2f03 movel %d3,%sp@-
513d6: 2f02 movel %d2,%sp@-
513d8: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
513dc: 677a beqs 51458 <rtems_signal_send+0x88> <== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
513de: 486e fffc pea %fp@(-4)
513e2: 2f2e 0008 movel %fp@(8),%sp@-
513e6: 4eb9 0005 5294 jsr 55294 <_Thread_Get>
switch ( location ) {
513ec: 508f addql #8,%sp
513ee: 4aae fffc tstl %fp@(-4)
513f2: 6668 bnes 5145c <rtems_signal_send+0x8c> <== NEVER TAKEN
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
513f4: 2240 moveal %d0,%a1
513f6: 2069 00fe moveal %a1@(254),%a0
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
513fa: 4aa8 000a tstl %a0@(10)
513fe: 674e beqs 5144e <rtems_signal_send+0x7e>
if ( asr->is_enabled ) {
51400: 4a28 0008 tstb %a0@(8)
51404: 672c beqs 51432 <rtems_signal_send+0x62>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
51406: 223c 0000 0700 movel #1792,%d1
5140c: 40c3 movew %sr,%d3
5140e: 8283 orl %d3,%d1
51410: 46c1 movew %d1,%sr
*signal_set |= signals;
51412: 85a8 0012 orl %d2,%a0@(18)
_ISR_Enable( _level );
51416: 46c3 movew %d3,%sr
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
51418: 4ab9 0007 798a tstl 7798a <_Per_CPU_Information+0x8>
5141e: 6724 beqs 51444 <rtems_signal_send+0x74>
51420: b0b9 0007 798e cmpl 7798e <_Per_CPU_Information+0xc>,%d0
51426: 661c bnes 51444 <rtems_signal_send+0x74> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
51428: 7001 moveq #1,%d0
5142a: 13c0 0007 799a moveb %d0,7799a <_Per_CPU_Information+0x18>
51430: 6012 bras 51444 <rtems_signal_send+0x74>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
51432: 203c 0000 0700 movel #1792,%d0
51438: 40c1 movew %sr,%d1
5143a: 8081 orl %d1,%d0
5143c: 46c0 movew %d0,%sr
*signal_set |= signals;
5143e: 85a8 0016 orl %d2,%a0@(22)
_ISR_Enable( _level );
51442: 46c1 movew %d1,%sr
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
51444: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
5144a: 4280 clrl %d0
5144c: 6010 bras 5145e <rtems_signal_send+0x8e>
}
_Thread_Enable_dispatch();
5144e: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
51454: 700b moveq #11,%d0
51456: 6006 bras 5145e <rtems_signal_send+0x8e>
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
51458: 700a moveq #10,%d0
5145a: 6002 bras 5145e <rtems_signal_send+0x8e>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
5145c: 7004 moveq #4,%d0
}
5145e: 242e fff4 movel %fp@(-12),%d2
51462: 262e fff8 movel %fp@(-8),%d3
51466: 4e5e unlk %fp
...
0004c650 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
4c650: 4e56 ffe4 linkw %fp,#-28
4c654: 48d7 1c3c moveml %d2-%d5/%a2-%a4,%sp@
4c658: 262e 0008 movel %fp@(8),%d3
4c65c: 282e 000c movel %fp@(12),%d4
4c660: 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 )
4c664: 4a8c tstl %a4
4c666: 6700 0104 beqw 4c76c <rtems_task_mode+0x11c>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
4c66a: 2679 0005 ee32 moveal 5ee32 <_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;
4c670: 4a2b 0074 tstb %a3@(116)
4c674: 57c2 seq %d2
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
4c676: 246b 00fe moveal %a3@(254),%a2
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
4c67a: 49c2 extbl %d2
4c67c: 0282 0000 0100 andil #256,%d2
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
4c682: 4aab 007a tstl %a3@(122)
4c686: 6704 beqs 4c68c <rtems_task_mode+0x3c>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
4c688: 08c2 0009 bset #9,%d2
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
4c68c: 4a2a 0008 tstb %a2@(8)
4c690: 57c5 seq %d5
old_mode |= _ISR_Get_level();
4c692: 4eb9 0004 8b00 jsr 48b00 <_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;
4c698: 49c5 extbl %d5
4c69a: 0285 0000 0400 andil #1024,%d5
4c6a0: 8085 orl %d5,%d0
old_mode |= _ISR_Get_level();
4c6a2: 8082 orl %d2,%d0
4c6a4: 2880 movel %d0,%a4@
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
4c6a6: 0804 0008 btst #8,%d4
4c6aa: 670c beqs 4c6b8 <rtems_task_mode+0x68>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
4c6ac: 0803 0008 btst #8,%d3
4c6b0: 57c0 seq %d0
4c6b2: 4480 negl %d0
4c6b4: 1740 0074 moveb %d0,%a3@(116)
if ( mask & RTEMS_TIMESLICE_MASK ) {
4c6b8: 0804 0009 btst #9,%d4
4c6bc: 671c beqs 4c6da <rtems_task_mode+0x8a>
if ( _Modes_Is_timeslice(mode_set) ) {
4c6be: 0803 0009 btst #9,%d3
4c6c2: 6712 beqs 4c6d6 <rtems_task_mode+0x86>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4c6c4: 41f9 0005 e980 lea 5e980 <_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;
4c6ca: 7001 moveq #1,%d0
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
4c6cc: 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;
4c6d0: 2740 007a movel %d0,%a3@(122)
4c6d4: 6004 bras 4c6da <rtems_task_mode+0x8a>
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
4c6d6: 42ab 007a clrl %a3@(122)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
4c6da: 7007 moveq #7,%d0
4c6dc: c084 andl %d4,%d0
4c6de: 6712 beqs 4c6f2 <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 ) );
4c6e0: 40c0 movew %sr,%d0
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
4c6e2: 7207 moveq #7,%d1
4c6e4: 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 ) );
4c6e6: 0280 0000 f8ff andil #63743,%d0
4c6ec: e189 lsll #8,%d1
4c6ee: 8081 orl %d1,%d0
4c6f0: 46c0 movew %d0,%sr
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
4c6f2: 0804 000a btst #10,%d4
4c6f6: 6740 beqs 4c738 <rtems_task_mode+0xe8>
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
4c6f8: 4281 clrl %d1
4c6fa: 122a 0008 moveb %a2@(8),%d1
4c6fe: 4282 clrl %d2
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
4c700: 0803 000a btst #10,%d3
4c704: 57c0 seq %d0
4c706: 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 ) {
4c708: 1400 moveb %d0,%d2
4c70a: b282 cmpl %d2,%d1
4c70c: 672a beqs 4c738 <rtems_task_mode+0xe8>
asr->is_enabled = is_asr_enabled;
4c70e: 1540 0008 moveb %d0,%a2@(8)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
4c712: 203c 0000 0700 movel #1792,%d0
4c718: 40c1 movew %sr,%d1
4c71a: 8081 orl %d1,%d0
4c71c: 46c0 movew %d0,%sr
_signals = information->signals_pending;
4c71e: 202a 0016 movel %a2@(22),%d0
information->signals_pending = information->signals_posted;
4c722: 256a 0012 0016 movel %a2@(18),%a2@(22)
information->signals_posted = _signals;
4c728: 2540 0012 movel %d0,%a2@(18)
_ISR_Enable( _level );
4c72c: 46c1 movew %d1,%sr
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
4c72e: 4aaa 0012 tstl %a2@(18)
4c732: 56c0 sne %d0
4c734: 4480 negl %d0
4c736: 6002 bras 4c73a <rtems_task_mode+0xea>
4c738: 4200 clrb %d0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
4c73a: 7203 moveq #3,%d1
4c73c: b2b9 0005 eb14 cmpl 5eb14 <_System_state_Current>,%d1
4c742: 662c bnes 4c770 <rtems_task_mode+0x120>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
4c744: 2079 0005 ee32 moveal 5ee32 <_Per_CPU_Information+0xc>,%a0
if ( are_signals_pending ||
4c74a: 4a00 tstb %d0
4c74c: 660e bnes 4c75c <rtems_task_mode+0x10c>
4c74e: b1f9 0005 ee36 cmpal 5ee36 <_Per_CPU_Information+0x10>,%a0
4c754: 671a beqs 4c770 <rtems_task_mode+0x120>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
4c756: 4a28 0074 tstb %a0@(116)
4c75a: 6714 beqs 4c770 <rtems_task_mode+0x120> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
4c75c: 7001 moveq #1,%d0
4c75e: 13c0 0005 ee3e moveb %d0,5ee3e <_Per_CPU_Information+0x18>
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
4c764: 4eb9 0004 7984 jsr 47984 <_Thread_Dispatch>
4c76a: 6004 bras 4c770 <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;
4c76c: 7009 moveq #9,%d0
4c76e: 6002 bras 4c772 <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;
4c770: 4280 clrl %d0
}
4c772: 4cee 1c3c ffe4 moveml %fp@(-28),%d2-%d5/%a2-%a4
4c778: 4e5e unlk %fp <== NOT EXECUTED
0004952c <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
4952c: 4e56 fffc linkw %fp,#-4
49530: 2f0a movel %a2,%sp@-
49532: 246e 0010 moveal %fp@(16),%a2
49536: 2f02 movel %d2,%sp@-
49538: 242e 000c movel %fp@(12),%d2
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
4953c: 670c beqs 4954a <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 ) );
4953e: 4280 clrl %d0
49540: 1039 0006 0952 moveb 60952 <rtems_maximum_priority>,%d0
49546: b082 cmpl %d2,%d0
49548: 654e bcss 49598 <rtems_task_set_priority+0x6c>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
4954a: 4a8a tstl %a2
4954c: 674e beqs 4959c <rtems_task_set_priority+0x70>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
4954e: 486e fffc pea %fp@(-4)
49552: 2f2e 0008 movel %fp@(8),%sp@-
49556: 4eb9 0004 b580 jsr 4b580 <_Thread_Get>
switch ( location ) {
4955c: 508f addql #8,%sp
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
4955e: 2040 moveal %d0,%a0
switch ( location ) {
49560: 4aae fffc tstl %fp@(-4)
49564: 663a bnes 495a0 <rtems_task_set_priority+0x74>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
49566: 24a8 0014 movel %a0@(20),%a2@
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
4956a: 4a82 tstl %d2
4956c: 6720 beqs 4958e <rtems_task_set_priority+0x62>
the_thread->real_priority = new_priority;
4956e: 2142 0018 movel %d2,%a0@(24)
if ( the_thread->resource_count == 0 ||
49572: 4aa8 001c tstl %a0@(28)
49576: 6706 beqs 4957e <rtems_task_set_priority+0x52>
49578: b4a8 0014 cmpl %a0@(20),%d2
4957c: 6410 bccs 4958e <rtems_task_set_priority+0x62> <== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
4957e: 42a7 clrl %sp@-
49580: 2f02 movel %d2,%sp@-
49582: 2f08 movel %a0,%sp@-
49584: 4eb9 0004 b13c jsr 4b13c <_Thread_Change_priority>
4958a: 4fef 000c lea %sp@(12),%sp
}
_Thread_Enable_dispatch();
4958e: 4eb9 0004 b55a jsr 4b55a <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
49594: 4280 clrl %d0
49596: 600a bras 495a2 <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;
49598: 7013 moveq #19,%d0
4959a: 6006 bras 495a2 <rtems_task_set_priority+0x76>
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
4959c: 7009 moveq #9,%d0
4959e: 6002 bras 495a2 <rtems_task_set_priority+0x76>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
495a0: 7004 moveq #4,%d0
}
495a2: 242e fff4 movel %fp@(-12),%d2
495a6: 246e fff8 moveal %fp@(-8),%a2
495aa: 4e5e unlk %fp
...
000468d4 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
468d4: 4e56 fffc linkw %fp,#-4
468d8: 2f0a movel %a2,%sp@-
468da: 246e 0010 moveal %fp@(16),%a2
468de: 2f02 movel %d2,%sp@-
468e0: 242e 000c movel %fp@(12),%d2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
468e4: 6742 beqs 46928 <rtems_task_variable_get+0x54>
return RTEMS_INVALID_ADDRESS;
if ( !result )
468e6: 4a8a tstl %a2
468e8: 673e beqs 46928 <rtems_task_variable_get+0x54> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
468ea: 486e fffc pea %fp@(-4)
468ee: 2f2e 0008 movel %fp@(8),%sp@-
468f2: 4eb9 0004 86c0 jsr 486c0 <_Thread_Get>
switch (location) {
468f8: 508f addql #8,%sp
468fa: 4aae fffc tstl %fp@(-4)
468fe: 662c bnes 4692c <rtems_task_variable_get+0x58>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
46900: 2240 moveal %d0,%a1
46902: 2069 010a moveal %a1@(266),%a0
while (tvp) {
46906: 6016 bras 4691e <rtems_task_variable_get+0x4a>
if (tvp->ptr == ptr) {
46908: b4a8 0004 cmpl %a0@(4),%d2
4690c: 660e bnes 4691c <rtems_task_variable_get+0x48>
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
4690e: 24a8 000c movel %a0@(12),%a2@
_Thread_Enable_dispatch();
46912: 4eb9 0004 869a jsr 4869a <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
46918: 4280 clrl %d0
4691a: 6012 bras 4692e <rtems_task_variable_get+0x5a>
}
tvp = (rtems_task_variable_t *)tvp->next;
4691c: 2050 moveal %a0@,%a0
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
4691e: 4a88 tstl %a0
46920: 66e6 bnes 46908 <rtems_task_variable_get+0x34>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
46922: 4eb9 0004 869a jsr 4869a <_Thread_Enable_dispatch>
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
if ( !result )
return RTEMS_INVALID_ADDRESS;
46928: 7009 moveq #9,%d0
4692a: 6002 bras 4692e <rtems_task_variable_get+0x5a>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
4692c: 7004 moveq #4,%d0
}
4692e: 242e fff4 movel %fp@(-12),%d2
46932: 246e fff8 moveal %fp@(-8),%a2
46936: 4e5e unlk %fp
...
0004692c <rtems_task_wake_when>:
*/
rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
4692c: 4e56 0000 linkw %fp,#0
46930: 2f0a movel %a2,%sp@-
46932: 246e 0008 moveal %fp@(8),%a2
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
46936: 4a39 0005 ff80 tstb 5ff80 <_TOD_Is_set>
4693c: 6700 0096 beqw 469d4 <rtems_task_wake_when+0xa8>
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
46940: 4a8a tstl %a2
46942: 6700 0094 beqw 469d8 <rtems_task_wake_when+0xac>
return RTEMS_INVALID_ADDRESS;
time_buffer->ticks = 0;
46946: 42aa 0018 clrl %a2@(24)
if ( !_TOD_Validate( time_buffer ) )
4694a: 2f0a movel %a2,%sp@-
4694c: 4eb9 0004 5de0 jsr 45de0 <_TOD_Validate>
46952: 588f addql #4,%sp
46954: 4a00 tstb %d0
46956: 6700 0084 beqw 469dc <rtems_task_wake_when+0xb0>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
4695a: 2f0a movel %a2,%sp@-
4695c: 4eb9 0004 5d44 jsr 45d44 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
46962: 588f addql #4,%sp
time_buffer->ticks = 0;
if ( !_TOD_Validate( time_buffer ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
46964: 2440 moveal %d0,%a2
if ( seconds <= _TOD_Seconds_since_epoch() )
46966: b0b9 0005 fffa cmpl 5fffa <_TOD_Now>,%d0
4696c: 636e blss 469dc <rtems_task_wake_when+0xb0> <== NEVER TAKEN
4696e: 2039 0005 ff70 movel 5ff70 <_Thread_Dispatch_disable_level>,%d0
46974: 5280 addql #1,%d0
46976: 23c0 0005 ff70 movel %d0,5ff70 <_Thread_Dispatch_disable_level>
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
4697c: 4878 0010 pea 10 <INVALID_OPERATION>
46980: 2f39 0006 03da movel 603da <_Per_CPU_Information+0xc>,%sp@-
46986: 4eb9 0004 8e7c jsr 48e7c <_Thread_Set_state>
_Watchdog_Initialize(
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
4698c: 2079 0006 03da moveal 603da <_Per_CPU_Information+0xc>,%a0
NULL
);
_Watchdog_Insert_seconds(
46992: 95f9 0005 fffa subal 5fffa <_TOD_Now>,%a2
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
46998: 223c 0004 8570 movel #296304,%d1
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
_Watchdog_Initialize(
4699e: 2028 0008 movel %a0@(8),%d0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
469a2: 42a8 0050 clrl %a0@(80)
the_watchdog->routine = routine;
the_watchdog->id = id;
469a6: 2140 0068 movel %d0,%a0@(104)
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
469aa: 2141 0064 movel %d1,%a0@(100)
the_watchdog->id = id;
the_watchdog->user_data = user_data;
469ae: 42a8 006c clrl %a0@(108)
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_seconds(
469b2: 214a 0054 movel %a2,%a0@(84)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
469b6: 4868 0048 pea %a0@(72)
469ba: 4879 0006 0024 pea 60024 <_Watchdog_Seconds_chain>
469c0: 4eb9 0004 9400 jsr 49400 <_Watchdog_Insert>
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
469c6: 4eb9 0004 86ea jsr 486ea <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
469cc: 4fef 0010 lea %sp@(16),%sp
469d0: 4280 clrl %d0
469d2: 600a bras 469de <rtems_task_wake_when+0xb2>
)
{
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
469d4: 700b moveq #11,%d0
469d6: 6006 bras 469de <rtems_task_wake_when+0xb2>
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
469d8: 7009 moveq #9,%d0
469da: 6002 bras 469de <rtems_task_wake_when+0xb2>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
469dc: 7014 moveq #20,%d0
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
469de: 246e fffc moveal %fp@(-4),%a2
469e2: 4e5e unlk %fp
...
00051c5c <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
51c5c: 4e56 fffc linkw %fp,#-4
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
51c60: 486e fffc pea %fp@(-4)
51c64: 2f2e 0008 movel %fp@(8),%sp@-
51c68: 4879 0007 7d9e pea 77d9e <_Timer_Information>
51c6e: 4eb9 0005 46c4 jsr 546c4 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
51c74: 4fef 000c lea %sp@(12),%sp
51c78: 4aae fffc tstl %fp@(-4)
51c7c: 6620 bnes 51c9e <rtems_timer_cancel+0x42>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
51c7e: 7204 moveq #4,%d1
51c80: 2040 moveal %d0,%a0
51c82: b2a8 0038 cmpl %a0@(56),%d1
51c86: 670c beqs 51c94 <rtems_timer_cancel+0x38> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
51c88: 4868 0010 pea %a0@(16)
51c8c: 4eb9 0005 6260 jsr 56260 <_Watchdog_Remove>
51c92: 588f addql #4,%sp
_Thread_Enable_dispatch();
51c94: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
51c9a: 4280 clrl %d0
51c9c: 6002 bras 51ca0 <rtems_timer_cancel+0x44>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
51c9e: 7004 moveq #4,%d0
}
51ca0: 4e5e unlk %fp <== NOT EXECUTED
00051f98 <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
51f98: 4e56 fffc linkw %fp,#-4
51f9c: 2f0b movel %a3,%sp@-
51f9e: 2f0a movel %a2,%sp@-
51fa0: 486e fffc pea %fp@(-4)
51fa4: 2f2e 0008 movel %fp@(8),%sp@-
51fa8: 4879 0007 7d9e pea 77d9e <_Timer_Information>
51fae: 4eb9 0005 46c4 jsr 546c4 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
51fb4: 4fef 000c lea %sp@(12),%sp
51fb8: 2440 moveal %d0,%a2
51fba: 4aae fffc tstl %fp@(-4)
51fbe: 6656 bnes 52016 <rtems_timer_reset+0x7e> <== NEVER TAKEN
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
51fc0: 202a 0038 movel %a2@(56),%d0
51fc4: 661c bnes 51fe2 <rtems_timer_reset+0x4a>
_Watchdog_Remove( &the_timer->Ticker );
51fc6: 45ea 0010 lea %a2@(16),%a2
51fca: 2f0a movel %a2,%sp@-
51fcc: 4eb9 0005 6260 jsr 56260 <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
51fd2: 2f0a movel %a2,%sp@-
51fd4: 4879 0007 75dc pea 775dc <_Watchdog_Ticks_chain>
51fda: 4eb9 0005 6138 jsr 56138 <_Watchdog_Insert>
51fe0: 6020 bras 52002 <rtems_timer_reset+0x6a>
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
51fe2: 7201 moveq #1,%d1
51fe4: b280 cmpl %d0,%d1
51fe6: 6622 bnes 5200a <rtems_timer_reset+0x72> <== NEVER TAKEN
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
51fe8: 486a 0010 pea %a2@(16)
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
Timer_server_Control *timer_server = _Timer_server;
51fec: 2679 0007 7dd8 moveal 77dd8 <_Timer_server>,%a3
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
51ff2: 4eb9 0005 6260 jsr 56260 <_Watchdog_Remove>
(*timer_server->schedule_operation)( timer_server, the_timer );
51ff8: 2f0a movel %a2,%sp@-
51ffa: 2f0b movel %a3,%sp@-
51ffc: 206b 0004 moveal %a3@(4),%a0
52000: 4e90 jsr %a0@
52002: 4fef 000c lea %sp@(12),%sp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
52006: 95ca subal %a2,%a2
52008: 6004 bras 5200e <rtems_timer_reset+0x76>
/*
* Must be dormant or time of day timer (e.g. TIMER_DORMANT,
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
5200a: 347c 000b moveaw #11,%a2
}
_Thread_Enable_dispatch();
5200e: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return status;
52014: 6004 bras 5201a <rtems_timer_reset+0x82>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
52016: 347c 0004 moveaw #4,%a2
}
5201a: 200a movel %a2,%d0
5201c: 246e fff4 moveal %fp@(-12),%a2
52020: 266e fff8 moveal %fp@(-8),%a3
52024: 4e5e unlk %fp <== NOT EXECUTED
000520e4 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
520e4: 4e56 ffe8 linkw %fp,#-24
520e8: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
520ec: 262e 0008 movel %fp@(8),%d3
520f0: 242e 000c movel %fp@(12),%d2
520f4: 282e 0010 movel %fp@(16),%d4
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
520f8: 2679 0007 7dd8 moveal 77dd8 <_Timer_server>,%a3
if ( !timer_server )
520fe: 4a8b tstl %a3
52100: 6700 0098 beqw 5219a <rtems_timer_server_fire_when+0xb6>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
52104: 4a39 0007 752c tstb 7752c <_TOD_Is_set>
5210a: 6700 0092 beqw 5219e <rtems_timer_server_fire_when+0xba>
return RTEMS_NOT_DEFINED;
if ( !routine )
5210e: 4a84 tstl %d4
52110: 6700 0090 beqw 521a2 <rtems_timer_server_fire_when+0xbe>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
52114: 2f02 movel %d2,%sp@-
52116: 4eb9 0004 f5a4 jsr 4f5a4 <_TOD_Validate>
5211c: 588f addql #4,%sp
5211e: 4a00 tstb %d0
52120: 6700 0084 beqw 521a6 <rtems_timer_server_fire_when+0xc2>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
52124: 2f02 movel %d2,%sp@-
52126: 4eb9 0004 f508 jsr 4f508 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
5212c: 588f addql #4,%sp
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
5212e: 2400 movel %d0,%d2
if ( seconds <= _TOD_Seconds_since_epoch() )
52130: b0b9 0007 75a6 cmpl 775a6 <_TOD_Now>,%d0
52136: 636e blss 521a6 <rtems_timer_server_fire_when+0xc2>
52138: 486e fffc pea %fp@(-4)
5213c: 2f03 movel %d3,%sp@-
5213e: 4879 0007 7d9e pea 77d9e <_Timer_Information>
52144: 4eb9 0005 46c4 jsr 546c4 <_Objects_Get>
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
5214a: 4fef 000c lea %sp@(12),%sp
5214e: 2440 moveal %d0,%a2
52150: 4aae fffc tstl %fp@(-4)
52154: 6654 bnes 521aa <rtems_timer_server_fire_when+0xc6>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
52156: 486a 0010 pea %a2@(16)
5215a: 4eb9 0005 6260 jsr 56260 <_Watchdog_Remove>
the_watchdog->user_data = user_data;
52160: 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();
52166: 94b9 0007 75a6 subl 775a6 <_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;
5216c: 7003 moveq #3,%d0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
5216e: 42aa 0018 clrl %a2@(24)
52172: 2540 0038 movel %d0,%a2@(56)
the_watchdog->routine = routine;
52176: 2544 002c movel %d4,%a2@(44)
the_watchdog->id = id;
5217a: 2543 0030 movel %d3,%a2@(48)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
5217e: 2542 001c movel %d2,%a2@(28)
(*timer_server->schedule_operation)( timer_server, the_timer );
52182: 2f0a movel %a2,%sp@-
52184: 2f0b movel %a3,%sp@-
52186: 206b 0004 moveal %a3@(4),%a0
5218a: 4e90 jsr %a0@
_Thread_Enable_dispatch();
5218c: 4eb9 0005 526e jsr 5526e <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
52192: 4fef 000c lea %sp@(12),%sp
52196: 4280 clrl %d0
52198: 6012 bras 521ac <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;
5219a: 700e moveq #14,%d0
5219c: 600e bras 521ac <rtems_timer_server_fire_when+0xc8>
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
5219e: 700b moveq #11,%d0 <== NOT EXECUTED
521a0: 600a bras 521ac <rtems_timer_server_fire_when+0xc8><== NOT EXECUTED
if ( !routine )
return RTEMS_INVALID_ADDRESS;
521a2: 7009 moveq #9,%d0
521a4: 6006 bras 521ac <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;
521a6: 7014 moveq #20,%d0
521a8: 6002 bras 521ac <rtems_timer_server_fire_when+0xc8>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
521aa: 7004 moveq #4,%d0
}
521ac: 4cee 0c1c ffe8 moveml %fp@(-24),%d2-%d4/%a2-%a3
521b2: 4e5e unlk %fp
...
00045ff0 <sched_get_priority_max>:
int sched_get_priority_max(
int policy
)
{
switch ( policy ) {
45ff0: 7004 moveq #4,%d0
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
45ff2: 4e56 0000 linkw %fp,#0
45ff6: 222e 0008 movel %fp@(8),%d1
switch ( policy ) {
45ffa: b081 cmpl %d1,%d0
45ffc: 650c bcss 4600a <sched_get_priority_max+0x1a> <== NEVER TAKEN
45ffe: 103c 0001 moveb #1,%d0
46002: e3a8 lsll %d1,%d0
46004: 7217 moveq #23,%d1
46006: c081 andl %d1,%d0
46008: 6610 bnes 4601a <sched_get_priority_max+0x2a> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
4600a: 4eb9 0004 d690 jsr 4d690 <__errno>
46010: 2040 moveal %d0,%a0
46012: 7016 moveq #22,%d0
46014: 2080 movel %d0,%a0@
46016: 70ff moveq #-1,%d0
46018: 600a bras 46024 <sched_get_priority_max+0x34>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
4601a: 4280 clrl %d0
4601c: 1039 0005 e126 moveb 5e126 <rtems_maximum_priority>,%d0
46022: 5380 subql #1,%d0
}
46024: 4e5e unlk %fp <== NOT EXECUTED
00046028 <sched_get_priority_min>:
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
46028: 7004 moveq #4,%d0
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
4602a: 4e56 0000 linkw %fp,#0
4602e: 222e 0008 movel %fp@(8),%d1
switch ( policy ) {
46032: b081 cmpl %d1,%d0
46034: 650c bcss 46042 <sched_get_priority_min+0x1a>
46036: 103c 0001 moveb #1,%d0
4603a: e3a8 lsll %d1,%d0
4603c: 7217 moveq #23,%d1
4603e: c081 andl %d1,%d0
46040: 6610 bnes 46052 <sched_get_priority_min+0x2a> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
46042: 4eb9 0004 d690 jsr 4d690 <__errno>
46048: 2040 moveal %d0,%a0
4604a: 7016 moveq #22,%d0
4604c: 2080 movel %d0,%a0@
4604e: 70ff moveq #-1,%d0
46050: 6002 bras 46054 <sched_get_priority_min+0x2c>
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
46052: 7001 moveq #1,%d0
}
46054: 4e5e unlk %fp <== NOT EXECUTED
00046058 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
46058: 4e56 0000 linkw %fp,#0
4605c: 2f03 movel %d3,%sp@-
4605e: 262e 0008 movel %fp@(8),%d3
46062: 2f02 movel %d2,%sp@-
46064: 242e 000c movel %fp@(12),%d2
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
46068: 4a83 tstl %d3
4606a: 6718 beqs 46084 <sched_rr_get_interval+0x2c> <== NEVER TAKEN
4606c: 4eb9 0004 3100 jsr 43100 <getpid>
46072: b083 cmpl %d3,%d0
46074: 670e beqs 46084 <sched_rr_get_interval+0x2c>
rtems_set_errno_and_return_minus_one( ESRCH );
46076: 4eb9 0004 d690 jsr 4d690 <__errno>
4607c: 7203 moveq #3,%d1
4607e: 2040 moveal %d0,%a0
46080: 2081 movel %d1,%a0@
46082: 6010 bras 46094 <sched_rr_get_interval+0x3c>
if ( !interval )
46084: 4a82 tstl %d2
46086: 6610 bnes 46098 <sched_rr_get_interval+0x40>
rtems_set_errno_and_return_minus_one( EINVAL );
46088: 4eb9 0004 d690 jsr 4d690 <__errno>
4608e: 2040 moveal %d0,%a0
46090: 7016 moveq #22,%d0
46092: 2080 movel %d0,%a0@
46094: 70ff moveq #-1,%d0
46096: 6012 bras 460aa <sched_rr_get_interval+0x52>
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
46098: 2f02 movel %d2,%sp@-
4609a: 2f39 0005 f9a0 movel 5f9a0 <_Thread_Ticks_per_timeslice>,%sp@-
460a0: 4eb9 0004 934c jsr 4934c <_Timespec_From_ticks>
return 0;
460a6: 508f addql #8,%sp
460a8: 4280 clrl %d0
}
460aa: 242e fff8 movel %fp@(-8),%d2
460ae: 262e fffc movel %fp@(-4),%d3
460b2: 4e5e unlk %fp
...
00048694 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
48694: 4e56 ffe0 linkw %fp,#-32
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
48698: 2039 0006 3934 movel 63934 <_Thread_Dispatch_disable_level>,%d0
4869e: 5280 addql #1,%d0
486a0: 48d7 043c moveml %d2-%d5/%a2,%sp@
486a4: 242e 0008 movel %fp@(8),%d2
486a8: 282e 000c movel %fp@(12),%d4
486ac: 23c0 0006 3934 movel %d0,63934 <_Thread_Dispatch_disable_level>
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
486b2: 2a04 movel %d4,%d5
486b4: 0285 0000 0200 andil #512,%d5
486ba: 6706 beqs 486c2 <sem_open+0x2e>
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
486bc: 262e 0014 movel %fp@(20),%d3
486c0: 6002 bras 486c4 <sem_open+0x30>
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
486c2: 4283 clrl %d3
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 );
486c4: 486e fffc pea %fp@(-4)
486c8: 2f02 movel %d2,%sp@-
486ca: 4eb9 0004 e204 jsr 4e204 <_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 ) {
486d0: 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 );
486d2: 2440 moveal %d0,%a2
* 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 ) {
486d4: 4a80 tstl %d0
486d6: 671c beqs 486f4 <sem_open+0x60>
/*
* 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) ) ) {
486d8: 7002 moveq #2,%d0
486da: b08a cmpl %a2,%d0
486dc: 6604 bnes 486e2 <sem_open+0x4e> <== NEVER TAKEN
486de: 4a85 tstl %d5
486e0: 665e bnes 48740 <sem_open+0xac>
_Thread_Enable_dispatch();
486e2: 4eb9 0004 b10a jsr 4b10a <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
486e8: 4eb9 0005 093c jsr 5093c <__errno>
486ee: 2040 moveal %d0,%a0
486f0: 208a movel %a2,%a0@
486f2: 6076 bras 4876a <sem_open+0xd6>
486f4: 45f9 0004 b10a lea 4b10a <_Thread_Enable_dispatch>,%a2
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
486fa: 0284 0000 0a00 andil #2560,%d4
48700: 0c84 0000 0a00 cmpil #2560,%d4
48706: 6610 bnes 48718 <sem_open+0x84>
_Thread_Enable_dispatch();
48708: 4e92 jsr %a2@
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
4870a: 4eb9 0005 093c jsr 5093c <__errno>
48710: 2040 moveal %d0,%a0
48712: 7011 moveq #17,%d0
48714: 2080 movel %d0,%a0@
48716: 6052 bras 4876a <sem_open+0xd6>
48718: 486e fff4 pea %fp@(-12)
4871c: 2f2e fffc movel %fp@(-4),%sp@-
48720: 4879 0006 3b4a pea 63b4a <_POSIX_Semaphore_Information>
48726: 4eb9 0004 a554 jsr 4a554 <_Objects_Get>
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
the_semaphore->open_count += 1;
4872c: 2040 moveal %d0,%a0
4872e: 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 );
48732: 2d40 fff8 movel %d0,%fp@(-8)
the_semaphore->open_count += 1;
_Thread_Enable_dispatch();
48736: 4e92 jsr %a2@
_Thread_Enable_dispatch();
48738: 4e92 jsr %a2@
goto return_id;
4873a: 4fef 000c lea %sp@(12),%sp
4873e: 6022 bras 48762 <sem_open+0xce>
/*
* 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(
48740: 486e fff8 pea %fp@(-8)
48744: 2f03 movel %d3,%sp@-
48746: 42a7 clrl %sp@-
48748: 2f02 movel %d2,%sp@-
4874a: 4eb9 0004 e0c0 jsr 4e0c0 <_POSIX_Semaphore_Create_support>
48750: 2400 movel %d0,%d2
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
48752: 4eb9 0004 b10a jsr 4b10a <_Thread_Enable_dispatch>
if ( status == -1 )
48758: 4fef 0010 lea %sp@(16),%sp
4875c: 70ff moveq #-1,%d0
4875e: b082 cmpl %d2,%d0
48760: 6708 beqs 4876a <sem_open+0xd6>
return_id:
#if defined(RTEMS_USE_16_BIT_OBJECT)
the_semaphore->Semaphore_id = the_semaphore->Object.id;
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
48762: 202e fff8 movel %fp@(-8),%d0
48766: 5080 addql #8,%d0
#endif
return id;
48768: 6002 bras 4876c <sem_open+0xd8>
*/
_Thread_Enable_dispatch();
if ( status == -1 )
return SEM_FAILED;
4876a: 70ff moveq #-1,%d0
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
4876c: 4cee 043c ffe0 moveml %fp@(-32),%d2-%d5/%a2
48772: 4e5e unlk %fp
...
00045ee4 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
45ee4: 4e56 ffec linkw %fp,#-20
45ee8: 222e 0010 movel %fp@(16),%d1
45eec: 48d7 0c1c moveml %d2-%d4/%a2-%a3,%sp@
45ef0: 242e 0008 movel %fp@(8),%d2
45ef4: 246e 000c moveal %fp@(12),%a2
ISR_Level level;
if ( oact )
45ef8: 4a81 tstl %d1
45efa: 6722 beqs 45f1e <sigaction+0x3a>
*oact = _POSIX_signals_Vectors[ sig ];
45efc: 2602 movel %d2,%d3
45efe: 2002 movel %d2,%d0
45f00: 4878 000c pea c <OPER1>
45f04: e58b lsll #2,%d3
45f06: e988 lsll #4,%d0
45f08: 9083 subl %d3,%d0
45f0a: 0680 0006 0b04 addil #396036,%d0
45f10: 2f00 movel %d0,%sp@-
45f12: 2f01 movel %d1,%sp@-
45f14: 4eb9 0004 e210 jsr 4e210 <memcpy>
45f1a: 4fef 000c lea %sp@(12),%sp
if ( !sig )
45f1e: 4a82 tstl %d2
45f20: 6710 beqs 45f32 <sigaction+0x4e>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
45f22: 2002 movel %d2,%d0
45f24: 5380 subql #1,%d0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
45f26: 721f moveq #31,%d1
45f28: b280 cmpl %d0,%d1
45f2a: 6506 bcss 45f32 <sigaction+0x4e>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
45f2c: 7009 moveq #9,%d0
45f2e: b082 cmpl %d2,%d0
45f30: 6610 bnes 45f42 <sigaction+0x5e>
rtems_set_errno_and_return_minus_one( EINVAL );
45f32: 4eb9 0004 d94c jsr 4d94c <__errno>
45f38: 2040 moveal %d0,%a0
45f3a: 7016 moveq #22,%d0
45f3c: 2080 movel %d0,%a0@
45f3e: 70ff moveq #-1,%d0
45f40: 6060 bras 45fa2 <sigaction+0xbe>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
45f42: 4a8a tstl %a2
45f44: 675a beqs 45fa0 <sigaction+0xbc> <== 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 );
45f46: 203c 0000 0700 movel #1792,%d0
45f4c: 40c3 movew %sr,%d3
45f4e: 8083 orl %d3,%d0
45f50: 46c0 movew %d0,%sr
45f52: 780c moveq #12,%d4
45f54: 4c02 4800 mulsl %d2,%d4
45f58: 47f9 0004 e210 lea 4e210 <memcpy>,%a3
if ( act->sa_handler == SIG_DFL ) {
45f5e: 4aaa 0008 tstl %a2@(8)
45f62: 661e bnes 45f82 <sigaction+0x9e>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
45f64: 4878 000c pea c <OPER1>
45f68: 2004 movel %d4,%d0
45f6a: 0680 0005 e066 addil #385126,%d0
45f70: 2f00 movel %d0,%sp@-
45f72: 0684 0006 0b04 addil #396036,%d4
45f78: 2f04 movel %d4,%sp@-
45f7a: 4e93 jsr %a3@
45f7c: 4fef 000c lea %sp@(12),%sp
45f80: 601c bras 45f9e <sigaction+0xba>
} else {
_POSIX_signals_Clear_process_signals( sig );
45f82: 2f02 movel %d2,%sp@-
_POSIX_signals_Vectors[ sig ] = *act;
45f84: 0684 0006 0b04 addil #396036,%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 );
45f8a: 4eb9 0004 b0c8 jsr 4b0c8 <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
45f90: 4878 000c pea c <OPER1>
45f94: 2f0a movel %a2,%sp@-
45f96: 2f04 movel %d4,%sp@-
45f98: 4e93 jsr %a3@
45f9a: 4fef 0010 lea %sp@(16),%sp
}
_ISR_Enable( level );
45f9e: 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;
45fa0: 4280 clrl %d0
}
45fa2: 4cee 0c1c ffec moveml %fp@(-20),%d2-%d4/%a2-%a3
45fa8: 4e5e unlk %fp <== NOT EXECUTED
000462d0 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
462d0: 4e56 ffd8 linkw %fp,#-40
462d4: 48d7 3c1c moveml %d2-%d4/%a2-%a5,%sp@
462d8: 266e 0008 moveal %fp@(8),%a3
462dc: 246e 000c moveal %fp@(12),%a2
462e0: 242e 0010 movel %fp@(16),%d2
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
462e4: 4a8b tstl %a3
462e6: 6730 beqs 46318 <sigtimedwait+0x48>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
462e8: 4a82 tstl %d2
462ea: 673c beqs 46328 <sigtimedwait+0x58>
if ( !_Timespec_Is_valid( timeout ) )
462ec: 2f02 movel %d2,%sp@-
462ee: 4eb9 0004 962c jsr 4962c <_Timespec_Is_valid>
462f4: 588f addql #4,%sp
462f6: 4a00 tstb %d0
462f8: 6610 bnes 4630a <sigtimedwait+0x3a>
rtems_set_errno_and_return_minus_one( EINVAL );
462fa: 4eb9 0004 dec8 jsr 4dec8 <__errno>
46300: 7616 moveq #22,%d3
46302: 2240 moveal %d0,%a1
46304: 2283 movel %d3,%a1@
46306: 6000 0144 braw 4644c <sigtimedwait+0x17c>
interval = _Timespec_To_ticks( timeout );
4630a: 2f02 movel %d2,%sp@-
4630c: 4eb9 0004 9698 jsr 49698 <_Timespec_To_ticks>
if ( !interval )
46312: 588f addql #4,%sp
46314: 4a80 tstl %d0
46316: 6612 bnes 4632a <sigtimedwait+0x5a> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
46318: 4eb9 0004 dec8 jsr 4dec8 <__errno>
4631e: 7416 moveq #22,%d2
46320: 2040 moveal %d0,%a0
46322: 2082 movel %d2,%a0@
46324: 6000 0126 braw 4644c <sigtimedwait+0x17c>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
46328: 4280 clrl %d0
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
4632a: 4a8a tstl %a2
4632c: 6604 bnes 46332 <sigtimedwait+0x62>
4632e: 45ee fff4 lea %fp@(-12),%a2
the_thread = _Thread_Executing;
46332: 2079 0006 0ea2 moveal 60ea2 <_Per_CPU_Information+0xc>,%a0
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
46338: 223c 0000 0700 movel #1792,%d1
the_info = ( info ) ? info : &signal_information;
the_thread = _Thread_Executing;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4633e: 2868 0102 moveal %a0@(258),%a4
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
46342: 40c3 movew %sr,%d3
46344: 8283 orl %d3,%d1
46346: 46c1 movew %d1,%sr
if ( *set & api->signals_pending ) {
46348: 2413 movel %a3@,%d2
4634a: 2802 movel %d2,%d4
4634c: 222c 00d4 movel %a4@(212),%d1
46350: c881 andl %d1,%d4
46352: 672a beqs 4637e <sigtimedwait+0xae>
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
46354: 2f01 movel %d1,%sp@-
46356: 4eb9 0004 6284 jsr 46284 <_POSIX_signals_Get_lowest>
4635c: 2480 movel %d0,%a2@
_POSIX_signals_Clear_signals(
4635e: 4297 clrl %sp@
46360: 42a7 clrl %sp@-
46362: 2f0a movel %a2,%sp@-
46364: 2f00 movel %d0,%sp@-
46366: 2f0c movel %a4,%sp@-
46368: 4eb9 0004 b70c jsr 4b70c <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
4636e: 46c3 movew %d3,%sr
the_info->si_code = SI_USER;
46370: 7001 moveq #1,%d0
the_info->si_value.sival_int = 0;
46372: 42aa 0008 clrl %a2@(8)
return the_info->si_signo;
46376: 2412 movel %a2@,%d2
false,
false
);
_ISR_Enable( level );
the_info->si_code = SI_USER;
46378: 2540 0004 movel %d0,%a2@(4)
4637c: 6036 bras 463b4 <sigtimedwait+0xe4>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
4637e: 2239 0006 10c8 movel 610c8 <_POSIX_signals_Pending>,%d1
46384: 4bf9 0004 b70c lea 4b70c <_POSIX_signals_Clear_signals>,%a5
4638a: c481 andl %d1,%d2
4638c: 672e beqs 463bc <sigtimedwait+0xec>
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
4638e: 2f01 movel %d1,%sp@-
46390: 4eb9 0004 6284 jsr 46284 <_POSIX_signals_Get_lowest>
46396: 2400 movel %d0,%d2
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
46398: 4297 clrl %sp@
4639a: 4878 0001 pea 1 <ADD>
4639e: 2f0a movel %a2,%sp@-
463a0: 2f00 movel %d0,%sp@-
463a2: 2f0c movel %a4,%sp@-
463a4: 4e95 jsr %a5@
_ISR_Enable( level );
463a6: 46c3 movew %d3,%sr
the_info->si_signo = signo;
the_info->si_code = SI_USER;
463a8: 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;
463aa: 2482 movel %d2,%a2@
the_info->si_code = SI_USER;
463ac: 2541 0004 movel %d1,%a2@(4)
the_info->si_value.sival_int = 0;
463b0: 42aa 0008 clrl %a2@(8)
return signo;
463b4: 4fef 0014 lea %sp@(20),%sp
463b8: 6000 0094 braw 4644e <sigtimedwait+0x17e>
}
the_info->si_signo = -1;
463bc: 72ff moveq #-1,%d1
463be: 2481 movel %d1,%a2@
463c0: 2239 0006 0a38 movel 60a38 <_Thread_Dispatch_disable_level>,%d1
463c6: 5281 addql #1,%d1
463c8: 23c1 0006 0a38 movel %d1,60a38 <_Thread_Dispatch_disable_level>
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
463ce: 7204 moveq #4,%d1
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
463d0: 43f9 0006 1060 lea 61060 <_POSIX_signals_Wait_queue>,%a1
the_thread->Wait.return_code = EINTR;
463d6: 2141 0034 movel %d1,%a0@(52)
the_thread->Wait.option = *set;
463da: 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;
463de: 123c 0001 moveb #1,%d1
the_thread->Wait.return_argument = the_info;
463e2: 214a 0028 movel %a2,%a0@(40)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
463e6: 2149 0044 movel %a1,%a0@(68)
463ea: 23c1 0006 1090 movel %d1,61090 <_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 );
463f0: 46c3 movew %d3,%sr
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
463f2: 4879 0004 938c pea 4938c <_Thread_queue_Timeout>
463f8: 2f00 movel %d0,%sp@-
463fa: 4879 0006 1060 pea 61060 <_POSIX_signals_Wait_queue>
46400: 4eb9 0004 9078 jsr 49078 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
46406: 4eb9 0004 8c4a jsr 48c4a <_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 );
4640c: 42a7 clrl %sp@-
4640e: 42a7 clrl %sp@-
46410: 2f0a movel %a2,%sp@-
46412: 2f12 movel %a2@,%sp@-
46414: 2f0c movel %a4,%sp@-
46416: 4e95 jsr %a5@
/* 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)
46418: 2079 0006 0ea2 moveal 60ea2 <_Per_CPU_Information+0xc>,%a0
4641e: 4fef 0020 lea %sp@(32),%sp
46422: 7004 moveq #4,%d0
46424: b0a8 0034 cmpl %a0@(52),%d0
46428: 6610 bnes 4643a <sigtimedwait+0x16a>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
4642a: 2412 movel %a2@,%d2
4642c: 2202 movel %d2,%d1
4642e: 5381 subql #1,%d1
46430: 103c 0001 moveb #1,%d0
46434: e3a8 lsll %d1,%d0
46436: c093 andl %a3@,%d0
46438: 6614 bnes 4644e <sigtimedwait+0x17e>
errno = _Thread_Executing->Wait.return_code;
4643a: 4eb9 0004 dec8 jsr 4dec8 <__errno>
46440: 2079 0006 0ea2 moveal 60ea2 <_Per_CPU_Information+0xc>,%a0
46446: 2240 moveal %d0,%a1
46448: 22a8 0034 movel %a0@(52),%a1@
return -1;
4644c: 74ff moveq #-1,%d2
}
return the_info->si_signo;
}
4644e: 2002 movel %d2,%d0
46450: 4cee 3c1c ffd8 moveml %fp@(-40),%d2-%d4/%a2-%a5
46456: 4e5e unlk %fp
...
00047ff4 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
47ff4: 4e56 0000 linkw %fp,#0
47ff8: 2f0a movel %a2,%sp@-
47ffa: 246e 000c moveal %fp@(12),%a2
int status;
status = sigtimedwait( set, NULL, NULL );
47ffe: 42a7 clrl %sp@-
48000: 42a7 clrl %sp@-
48002: 2f2e 0008 movel %fp@(8),%sp@-
48006: 4eb9 0004 7e50 jsr 47e50 <sigtimedwait>
if ( status != -1 ) {
4800c: 4fef 000c lea %sp@(12),%sp
48010: 72ff moveq #-1,%d1
48012: b280 cmpl %d0,%d1
48014: 6708 beqs 4801e <sigwait+0x2a>
if ( sig )
48016: 4a8a tstl %a2
48018: 6710 beqs 4802a <sigwait+0x36> <== NEVER TAKEN
*sig = status;
4801a: 2480 movel %d0,%a2@
4801c: 600c bras 4802a <sigwait+0x36>
return 0;
}
return errno;
4801e: 4eb9 0004 f698 jsr 4f698 <__errno>
48024: 2040 moveal %d0,%a0
48026: 2010 movel %a0@,%d0
48028: 6002 bras 4802c <sigwait+0x38>
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
4802a: 4280 clrl %d0
}
return errno;
}
4802c: 246e fffc moveal %fp@(-4),%a2
48030: 4e5e unlk %fp <== NOT EXECUTED
000454f4 <timer_create>:
timer_t *timerid
)
{
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
454f4: 7001 moveq #1,%d0
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
454f6: 4e56 0000 linkw %fp,#0
454fa: 2f0b movel %a3,%sp@-
454fc: 266e 0010 moveal %fp@(16),%a3
45500: 2f0a movel %a2,%sp@-
45502: 246e 000c moveal %fp@(12),%a2
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
45506: b0ae 0008 cmpl %fp@(8),%d0
4550a: 6620 bnes 4552c <timer_create+0x38>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
4550c: 4a8b tstl %a3
4550e: 671c beqs 4552c <timer_create+0x38>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
45510: 4a8a tstl %a2
45512: 6726 beqs 4553a <timer_create+0x46>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
45514: 2012 movel %a2@,%d0
45516: 7201 moveq #1,%d1
45518: 5380 subql #1,%d0
4551a: b280 cmpl %d0,%d1
4551c: 650e bcss 4552c <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 )
4551e: 202a 0004 movel %a2@(4),%d0
45522: 6708 beqs 4552c <timer_create+0x38> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
45524: 5380 subql #1,%d0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
45526: 721f moveq #31,%d1
45528: b280 cmpl %d0,%d1
4552a: 640e bccs 4553a <timer_create+0x46> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
4552c: 4eb9 0004 d3b4 jsr 4d3b4 <__errno>
45532: 7216 moveq #22,%d1
45534: 2040 moveal %d0,%a0
45536: 2081 movel %d1,%a0@
45538: 6034 bras 4556e <timer_create+0x7a>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
4553a: 2039 0005 f548 movel 5f548 <_Thread_Dispatch_disable_level>,%d0
45540: 5280 addql #1,%d0
45542: 23c0 0005 f548 movel %d0,5f548 <_Thread_Dispatch_disable_level>
* 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 );
45548: 4879 0005 f798 pea 5f798 <_POSIX_Timer_Information>
4554e: 4eb9 0004 71b0 jsr 471b0 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
45554: 588f addql #4,%sp
45556: 2040 moveal %d0,%a0
45558: 4a80 tstl %d0
4555a: 6616 bnes 45572 <timer_create+0x7e>
_Thread_Enable_dispatch();
4555c: 4eb9 0004 813a jsr 4813a <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
45562: 4eb9 0004 d3b4 jsr 4d3b4 <__errno>
45568: 2040 moveal %d0,%a0
4556a: 700b moveq #11,%d0
4556c: 2080 movel %d0,%a0@
4556e: 70ff moveq #-1,%d0
45570: 606a bras 455dc <timer_create+0xe8>
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
45572: 7002 moveq #2,%d0
45574: 1140 003c moveb %d0,%a0@(60)
ptimer->thread_id = _Thread_Executing->Object.id;
45578: 2279 0005 f9b2 moveal 5f9b2 <_Per_CPU_Information+0xc>,%a1
4557e: 2169 0008 0038 movel %a1@(8),%a0@(56)
if ( evp != NULL ) {
45584: 4a8a tstl %a2
45586: 6710 beqs 45598 <timer_create+0xa4>
ptimer->inf.sigev_notify = evp->sigev_notify;
45588: 2152 003e movel %a2@,%a0@(62)
ptimer->inf.sigev_signo = evp->sigev_signo;
4558c: 216a 0004 0042 movel %a2@(4),%a0@(66)
ptimer->inf.sigev_value = evp->sigev_value;
45592: 216a 0008 0046 movel %a2@(8),%a0@(70)
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
45598: 2028 0008 movel %a0@(8),%d0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
4559c: 4281 clrl %d1
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
4559e: 2279 0005 f7b0 moveal 5f7b0 <_POSIX_Timer_Information+0x18>,%a1
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
455a4: 3200 movew %d0,%d1
}
ptimer->overrun = 0;
455a6: 42a8 0066 clrl %a0@(102)
ptimer->timer_data.it_value.tv_sec = 0;
455aa: 42a8 005a clrl %a0@(90)
ptimer->timer_data.it_value.tv_nsec = 0;
455ae: 42a8 005e clrl %a0@(94)
ptimer->timer_data.it_interval.tv_sec = 0;
455b2: 42a8 0052 clrl %a0@(82)
ptimer->timer_data.it_interval.tv_nsec = 0;
455b6: 42a8 0056 clrl %a0@(86)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
455ba: 42a8 0018 clrl %a0@(24)
the_watchdog->routine = routine;
455be: 42a8 002c clrl %a0@(44)
the_watchdog->id = id;
455c2: 42a8 0030 clrl %a0@(48)
the_watchdog->user_data = user_data;
455c6: 42a8 0034 clrl %a0@(52)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
455ca: 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;
455ce: 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;
455d2: 2680 movel %d0,%a3@
_Thread_Enable_dispatch();
455d4: 4eb9 0004 813a jsr 4813a <_Thread_Enable_dispatch>
return 0;
455da: 4280 clrl %d0
}
455dc: 246e fff8 moveal %fp@(-8),%a2
455e0: 266e fffc moveal %fp@(-4),%a3
455e4: 4e5e unlk %fp <== NOT EXECUTED
000456ba <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
456ba: 4e56 ffe8 linkw %fp,#-24
456be: 48d7 041c moveml %d2-%d4/%a2,%sp@
456c2: 262e 0008 movel %fp@(8),%d3
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
456c6: 4ab9 0006 09d8 tstl 609d8 <_POSIX_signals_Ualarm_timer+0x1c>
456cc: 6620 bnes 456ee <ualarm+0x34>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
456ce: 42b9 0006 09c4 clrl 609c4 <_POSIX_signals_Ualarm_timer+0x8>
the_watchdog->routine = routine;
456d4: 203c 0004 5678 movel #284280,%d0
the_watchdog->id = id;
456da: 42b9 0006 09dc clrl 609dc <_POSIX_signals_Ualarm_timer+0x20>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
456e0: 23c0 0006 09d8 movel %d0,609d8 <_POSIX_signals_Ualarm_timer+0x1c>
the_watchdog->id = id;
the_watchdog->user_data = user_data;
456e6: 42b9 0006 09e0 clrl 609e0 <_POSIX_signals_Ualarm_timer+0x24>
456ec: 6056 bras 45744 <ualarm+0x8a>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
456ee: 4879 0006 09bc pea 609bc <_POSIX_signals_Ualarm_timer>
456f4: 4eb9 0004 8e34 jsr 48e34 <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
456fa: 588f addql #4,%sp
456fc: 7201 moveq #1,%d1
456fe: 5580 subql #2,%d0
45700: b280 cmpl %d0,%d1
45702: 6540 bcss 45744 <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);
45704: 2039 0006 09d0 movel 609d0 <_POSIX_signals_Ualarm_timer+0x14>,%d0
4570a: d0b9 0006 09c8 addl 609c8 <_POSIX_signals_Ualarm_timer+0xc>,%d0
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
45710: 486e fff8 pea %fp@(-8)
45714: 90b9 0006 09d4 subl 609d4 <_POSIX_signals_Ualarm_timer+0x18>,%d0
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
4571a: 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 );
45720: 2f00 movel %d0,%sp@-
45722: 4eb9 0004 894c jsr 4894c <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
45728: 202e fff8 movel %fp@(-8),%d0
4572c: 4c04 0800 mulsl %d4,%d0
remaining += tp.tv_nsec / 1000;
45730: 283c 0000 03e8 movel #1000,%d4
45736: 508f addql #8,%sp
45738: 242e fffc movel %fp@(-4),%d2
4573c: 4c44 2802 remsl %d4,%d2,%d2
45740: d480 addl %d0,%d2
45742: 6002 bras 45746 <ualarm+0x8c>
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
45744: 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 ) {
45746: 4a83 tstl %d3
45748: 674e beqs 45798 <ualarm+0xde>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
4574a: 283c 0000 03e8 movel #1000,%d4
ticks = _Timespec_To_ticks( &tp );
45750: 45f9 0004 89cc lea 489cc <_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;
45756: 223c 000f 4240 movel #1000000,%d1
4575c: 4c41 3000 remul %d1,%d0,%d3
45760: 4c41 3003 remul %d1,%d3,%d3
45764: 2d43 fff8 movel %d3,%fp@(-8)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
45768: 4c00 4800 mulsl %d0,%d4
ticks = _Timespec_To_ticks( &tp );
4576c: 260e movel %fp,%d3
4576e: 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;
45770: 2d44 fffc movel %d4,%fp@(-4)
ticks = _Timespec_To_ticks( &tp );
45774: 2f03 movel %d3,%sp@-
45776: 4e92 jsr %a2@
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
45778: 2f03 movel %d3,%sp@-
4577a: 4e92 jsr %a2@
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
4577c: 4879 0006 09bc pea 609bc <_POSIX_signals_Ualarm_timer>
45782: 4879 0006 0268 pea 60268 <_Watchdog_Ticks_chain>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
45788: 23c0 0006 09c8 movel %d0,609c8 <_POSIX_signals_Ualarm_timer+0xc>
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
4578e: 4eb9 0004 8d0c jsr 48d0c <_Watchdog_Insert>
45794: 4fef 0010 lea %sp@(16),%sp
}
return remaining;
}
45798: 2002 movel %d2,%d0
4579a: 4cee 041c ffe8 moveml %fp@(-24),%d2-%d4/%a2
457a0: 4e5e unlk %fp <== NOT EXECUTED