RTEMS 4.11Annotated Report
Mon Mar 21 02:24:41 2011
080036f0 <_API_extensions_Run_postdriver>:
*
* _API_extensions_Run_postdriver
*/
void _API_extensions_Run_postdriver( void )
{
80036f0: 37 9c ff f4 addi sp,sp,-12
80036f4: 5b 8b 00 0c sw (sp+12),r11
80036f8: 5b 8c 00 08 sw (sp+8),r12
80036fc: 5b 9d 00 04 sw (sp+4),ra
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
8003700: 78 01 08 01 mvhi r1,0x801
8003704: 38 21 4a 70 ori r1,r1,0x4a70
8003708: 28 2b 00 00 lw r11,(r1+0)
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
800370c: 78 0c 08 01 mvhi r12,0x801
8003710: 39 8c 4a 74 ori r12,r12,0x4a74
8003714: 45 6c 00 05 be r11,r12,8003728 <_API_extensions_Run_postdriver+0x38><== NEVER TAKEN
* Currently all APIs configure this hook so it is always non-NULL.
*/
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
8003718: 29 61 00 08 lw r1,(r11+8)
800371c: d8 20 00 00 call r1
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
8003720: 29 6b 00 00 lw r11,(r11+0)
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
8003724: 5d 6c ff fd bne r11,r12,8003718 <_API_extensions_Run_postdriver+0x28>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
8003728: 2b 9d 00 04 lw ra,(sp+4)
800372c: 2b 8b 00 0c lw r11,(sp+12)
8003730: 2b 8c 00 08 lw r12,(sp+8)
8003734: 37 9c 00 0c addi sp,sp,12
8003738: c3 a0 00 00 ret
0800373c <_API_extensions_Run_postswitch>:
*
* _API_extensions_Run_postswitch
*/
void _API_extensions_Run_postswitch( void )
{
800373c: 37 9c ff f0 addi sp,sp,-16
8003740: 5b 8b 00 10 sw (sp+16),r11
8003744: 5b 8c 00 0c sw (sp+12),r12
8003748: 5b 8d 00 08 sw (sp+8),r13
800374c: 5b 9d 00 04 sw (sp+4),ra
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
8003750: 78 01 08 01 mvhi r1,0x801
8003754: 38 21 4a 70 ori r1,r1,0x4a70
8003758: 28 2b 00 00 lw r11,(r1+0)
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
800375c: 78 0c 08 01 mvhi r12,0x801
8003760: 39 8c 4a 74 ori r12,r12,0x4a74
8003764: 45 6c 00 08 be r11,r12,8003784 <_API_extensions_Run_postswitch+0x48><== NEVER TAKEN
8003768: 78 0d 08 01 mvhi r13,0x801
800376c: 39 ad 4d b4 ori r13,r13,0x4db4
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
8003770: 29 62 00 0c lw r2,(r11+12)
8003774: 29 a1 00 0c lw r1,(r13+12)
8003778: d8 40 00 00 call r2
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
800377c: 29 6b 00 00 lw r11,(r11+0)
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
8003780: 5d 6c ff fc bne r11,r12,8003770 <_API_extensions_Run_postswitch+0x34>
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
8003784: 2b 9d 00 04 lw ra,(sp+4)
8003788: 2b 8b 00 10 lw r11,(sp+16)
800378c: 2b 8c 00 0c lw r12,(sp+12)
8003790: 2b 8d 00 08 lw r13,(sp+8)
8003794: 37 9c 00 10 addi sp,sp,16
8003798: c3 a0 00 00 ret
08006488 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
8006488: 37 9c ff f4 addi sp,sp,-12
800648c: 5b 8b 00 0c sw (sp+12),r11
8006490: 5b 8c 00 08 sw (sp+8),r12
8006494: 5b 9d 00 04 sw (sp+4),ra
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
8006498: 78 02 08 01 mvhi r2,0x801
800649c: 38 42 9d 84 ori r2,r2,0x9d84
80064a0: 28 43 00 0c lw r3,(r2+12)
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
80064a4: b8 20 58 00 mv r11,r1
* 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 );
80064a8: 90 00 08 00 rcsr r1,IE
80064ac: 34 02 ff fe mvi r2,-2
80064b0: a0 22 10 00 and r2,r1,r2
80064b4: d0 02 00 00 wcsr IE,r2
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
80064b8: 29 62 00 44 lw r2,(r11+68)
80064bc: 44 40 00 2f be r2,r0,8006578 <_CORE_RWLock_Release+0xf0>
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
80064c0: 34 04 00 01 mvi r4,1
80064c4: 44 44 00 22 be r2,r4,800654c <_CORE_RWLock_Release+0xc4>
return CORE_RWLOCK_SUCCESSFUL;
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
80064c8: 58 60 00 34 sw (r3+52),r0
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
80064cc: 59 60 00 44 sw (r11+68),r0
_ISR_Enable( level );
80064d0: d0 01 00 00 wcsr IE,r1
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
80064d4: b9 60 08 00 mv r1,r11
80064d8: f8 00 08 45 calli 80085ec <_Thread_queue_Dequeue>
if ( next ) {
80064dc: 44 20 00 16 be r1,r0,8006534 <_CORE_RWLock_Release+0xac>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
80064e0: 28 22 00 30 lw r2,(r1+48)
80064e4: 34 01 00 01 mvi r1,1
80064e8: 44 41 00 2d be r2,r1,800659c <_CORE_RWLock_Release+0x114>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
80064ec: 29 62 00 48 lw r2,(r11+72)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
80064f0: 59 61 00 44 sw (r11+68),r1
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
80064f4: 34 0c 00 01 mvi r12,1
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
80064f8: 34 41 00 01 addi r1,r2,1
80064fc: 59 61 00 48 sw (r11+72),r1
8006500: e0 00 00 07 bi 800651c <_CORE_RWLock_Release+0x94>
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
8006504: 28 63 00 30 lw r3,(r3+48)
8006508: 44 6c 00 0b be r3,r12,8006534 <_CORE_RWLock_Release+0xac> <== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
800650c: 29 63 00 48 lw r3,(r11+72)
8006510: 34 63 00 01 addi r3,r3,1
8006514: 59 63 00 48 sw (r11+72),r3
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
8006518: f8 00 09 5d calli 8008a8c <_Thread_queue_Extract>
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
800651c: b9 60 08 00 mv r1,r11
8006520: f8 00 09 ae calli 8008bd8 <_Thread_queue_First>
8006524: b8 20 18 00 mv r3,r1
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 );
8006528: b8 20 10 00 mv r2,r1
800652c: b9 60 08 00 mv r1,r11
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
8006530: 5c 60 ff f5 bne r3,r0,8006504 <_CORE_RWLock_Release+0x7c>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
8006534: 34 01 00 00 mvi r1,0
8006538: 2b 9d 00 04 lw ra,(sp+4)
800653c: 2b 8b 00 0c lw r11,(sp+12)
8006540: 2b 8c 00 08 lw r12,(sp+8)
8006544: 37 9c 00 0c addi sp,sp,12
8006548: c3 a0 00 00 ret
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
the_rwlock->number_of_readers -= 1;
800654c: 29 62 00 48 lw r2,(r11+72)
8006550: 34 42 ff ff addi r2,r2,-1
8006554: 59 62 00 48 sw (r11+72),r2
if ( the_rwlock->number_of_readers != 0 ) {
8006558: 44 40 ff dc be r2,r0,80064c8 <_CORE_RWLock_Release+0x40>
/* must be unlocked again */
_ISR_Enable( level );
800655c: d0 01 00 00 wcsr IE,r1
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
8006560: 34 01 00 00 mvi r1,0
8006564: 2b 9d 00 04 lw ra,(sp+4)
8006568: 2b 8b 00 0c lw r11,(sp+12)
800656c: 2b 8c 00 08 lw r12,(sp+8)
8006570: 37 9c 00 0c addi sp,sp,12
8006574: c3 a0 00 00 ret
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
8006578: d0 01 00 00 wcsr IE,r1
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
800657c: 34 01 00 02 mvi r1,2
8006580: 58 61 00 34 sw (r3+52),r1
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
8006584: 34 01 00 00 mvi r1,0
8006588: 2b 9d 00 04 lw ra,(sp+4)
800658c: 2b 8b 00 0c lw r11,(sp+12)
8006590: 2b 8c 00 08 lw r12,(sp+8)
8006594: 37 9c 00 0c addi sp,sp,12
8006598: c3 a0 00 00 ret
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
if ( next ) {
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
800659c: 34 01 00 02 mvi r1,2
80065a0: 59 61 00 44 sw (r11+68),r1
return CORE_RWLOCK_SUCCESSFUL;
80065a4: e3 ff ff e4 bi 8006534 <_CORE_RWLock_Release+0xac>
080065a8 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
80065a8: 37 9c ff f8 addi sp,sp,-8
80065ac: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
80065b0: 37 82 00 08 addi r2,sp,8
80065b4: f8 00 07 13 calli 8008200 <_Thread_Get>
switch ( location ) {
80065b8: 2b 82 00 08 lw r2,(sp+8)
80065bc: 5c 40 00 07 bne r2,r0,80065d8 <_CORE_RWLock_Timeout+0x30> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
80065c0: f8 00 09 c4 calli 8008cd0 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
80065c4: 78 01 08 01 mvhi r1,0x801
80065c8: 38 21 98 d8 ori r1,r1,0x98d8
80065cc: 28 22 00 00 lw r2,(r1+0)
80065d0: 34 42 ff ff addi r2,r2,-1
80065d4: 58 22 00 00 sw (r1+0),r2
_Thread_Unnest_dispatch();
break;
}
}
80065d8: 2b 9d 00 04 lw ra,(sp+4)
80065dc: 37 9c 00 08 addi sp,sp,8
80065e0: c3 a0 00 00 ret
0800ed94 <_CORE_message_queue_Initialize>:
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
)
{
800ed94: 37 9c ff e4 addi sp,sp,-28
800ed98: 5b 8b 00 1c sw (sp+28),r11
800ed9c: 5b 8c 00 18 sw (sp+24),r12
800eda0: 5b 8d 00 14 sw (sp+20),r13
800eda4: 5b 8e 00 10 sw (sp+16),r14
800eda8: 5b 8f 00 0c sw (sp+12),r15
800edac: 5b 90 00 08 sw (sp+8),r16
800edb0: 5b 9d 00 04 sw (sp+4),ra
800edb4: b8 20 58 00 mv r11,r1
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
the_message_queue->number_of_pending_messages = 0;
800edb8: 58 20 00 48 sw (r1+72),r0
the_message_queue->maximum_message_size = maximum_message_size;
800edbc: 58 24 00 4c sw (r1+76),r4
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Notify_Handler the_handler,
void *the_argument
)
{
the_message_queue->notify_handler = the_handler;
800edc0: 58 20 00 60 sw (r1+96),r0
the_message_queue->notify_argument = the_argument;
800edc4: 58 20 00 64 sw (r1+100),r0
)
{
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
800edc8: 59 63 00 44 sw (r11+68),r3
/*
* 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)) {
800edcc: 20 81 00 03 andi r1,r4,0x3
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
)
{
800edd0: b8 60 70 00 mv r14,r3
800edd4: b8 40 80 00 mv r16,r2
/*
* 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)) {
800edd8: b8 80 60 00 mv r12,r4
800eddc: 44 20 00 06 be r1,r0,800edf4 <_CORE_message_queue_Initialize+0x60>
allocated_message_size += sizeof(uint32_t);
800ede0: 34 8c 00 04 addi r12,r4,4
allocated_message_size &= ~(sizeof(uint32_t) - 1);
800ede4: 34 01 ff fc mvi r1,-4
800ede8: a1 81 60 00 and r12,r12,r1
}
if (allocated_message_size < maximum_message_size)
return false;
800edec: 34 0d 00 00 mvi r13,0
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
allocated_message_size += sizeof(uint32_t);
allocated_message_size &= ~(sizeof(uint32_t) - 1);
}
if (allocated_message_size < maximum_message_size)
800edf0: 54 8c 00 1c bgu r4,r12,800ee60 <_CORE_message_queue_Initialize+0xcc><== NEVER TAKEN
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
800edf4: 35 8f 00 14 addi r15,r12,20
/*
* 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 *
800edf8: b9 e0 08 00 mv r1,r15
800edfc: b9 c0 10 00 mv r2,r14
800ee00: f8 00 5f 8b calli 8026c2c <__mulsi3>
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
return false;
800ee04: 34 0d 00 00 mvi r13,0
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
800ee08: 55 81 00 16 bgu r12,r1,800ee60 <_CORE_message_queue_Initialize+0xcc><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
800ee0c: f8 00 0f 3b calli 8012af8 <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
800ee10: 59 61 00 5c sw (r11+92),r1
_Workspace_Allocate( message_buffering_required );
800ee14: b8 20 18 00 mv r3,r1
if (the_message_queue->message_buffers == 0)
800ee18: 44 20 00 12 be r1,r0,800ee60 <_CORE_message_queue_Initialize+0xcc>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
800ee1c: b8 60 10 00 mv r2,r3
800ee20: 35 61 00 68 addi r1,r11,104
800ee24: b9 c0 18 00 mv r3,r14
800ee28: b9 e0 20 00 mv r4,r15
800ee2c: f8 00 1a aa calli 80158d4 <_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 );
800ee30: 35 62 00 54 addi r2,r11,84
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
800ee34: 35 61 00 50 addi r1,r11,80
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
800ee38: 59 61 00 58 sw (r11+88),r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
800ee3c: 59 62 00 50 sw (r11+80),r2
head->previous = NULL;
800ee40: 59 60 00 54 sw (r11+84),r0
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
800ee44: 2a 02 00 00 lw r2,(r16+0)
800ee48: b9 60 08 00 mv r1,r11
800ee4c: 34 03 00 80 mvi r3,128
800ee50: 64 42 00 01 cmpei r2,r2,1
800ee54: 34 04 00 06 mvi r4,6
800ee58: f8 00 0b e2 calli 8011de0 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
800ee5c: 34 0d 00 01 mvi r13,1
}
800ee60: b9 a0 08 00 mv r1,r13
800ee64: 2b 9d 00 04 lw ra,(sp+4)
800ee68: 2b 8b 00 1c lw r11,(sp+28)
800ee6c: 2b 8c 00 18 lw r12,(sp+24)
800ee70: 2b 8d 00 14 lw r13,(sp+20)
800ee74: 2b 8e 00 10 lw r14,(sp+16)
800ee78: 2b 8f 00 0c lw r15,(sp+12)
800ee7c: 2b 90 00 08 lw r16,(sp+8)
800ee80: 37 9c 00 1c addi sp,sp,28
800ee84: c3 a0 00 00 ret
08003aac <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
8003aac: 37 9c ff e4 addi sp,sp,-28
8003ab0: 5b 8b 00 18 sw (sp+24),r11
8003ab4: 5b 8c 00 14 sw (sp+20),r12
8003ab8: 5b 8d 00 10 sw (sp+16),r13
8003abc: 5b 8e 00 0c sw (sp+12),r14
8003ac0: 5b 8f 00 08 sw (sp+8),r15
8003ac4: 5b 9d 00 04 sw (sp+4),ra
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8003ac8: 78 0b 08 01 mvhi r11,0x801
8003acc: 39 6b 49 08 ori r11,r11,0x4908
8003ad0: 29 66 00 00 lw r6,(r11+0)
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
8003ad4: 5b 85 00 1c sw (sp+28),r5
8003ad8: b8 20 60 00 mv r12,r1
8003adc: b8 40 78 00 mv r15,r2
8003ae0: b8 80 70 00 mv r14,r4
8003ae4: 20 6d 00 ff andi r13,r3,0xff
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8003ae8: 44 c0 00 02 be r6,r0,8003af0 <_CORE_mutex_Seize+0x44>
8003aec: 5d a0 00 15 bne r13,r0,8003b40 <_CORE_mutex_Seize+0x94> <== ALWAYS TAKEN
8003af0: b9 80 08 00 mv r1,r12
8003af4: 37 82 00 1c addi r2,sp,28
8003af8: f8 00 19 32 calli 8009fc0 <_CORE_mutex_Seize_interrupt_trylock>
8003afc: 44 20 00 09 be r1,r0,8003b20 <_CORE_mutex_Seize+0x74>
8003b00: 5d a0 00 19 bne r13,r0,8003b64 <_CORE_mutex_Seize+0xb8>
8003b04: 2b 81 00 1c lw r1,(sp+28)
8003b08: d0 01 00 00 wcsr IE,r1
8003b0c: 78 01 08 01 mvhi r1,0x801
8003b10: 38 21 4d b4 ori r1,r1,0x4db4
8003b14: 28 21 00 0c lw r1,(r1+12)
8003b18: 34 02 00 01 mvi r2,1
8003b1c: 58 22 00 34 sw (r1+52),r2
}
8003b20: 2b 9d 00 04 lw ra,(sp+4)
8003b24: 2b 8b 00 18 lw r11,(sp+24)
8003b28: 2b 8c 00 14 lw r12,(sp+20)
8003b2c: 2b 8d 00 10 lw r13,(sp+16)
8003b30: 2b 8e 00 0c lw r14,(sp+12)
8003b34: 2b 8f 00 08 lw r15,(sp+8)
8003b38: 37 9c 00 1c addi sp,sp,28
8003b3c: c3 a0 00 00 ret
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8003b40: 78 01 08 01 mvhi r1,0x801
8003b44: 38 21 4a 60 ori r1,r1,0x4a60
8003b48: 28 21 00 00 lw r1,(r1+0)
8003b4c: 34 02 00 01 mvi r2,1
8003b50: 50 41 ff e8 bgeu r2,r1,8003af0 <_CORE_mutex_Seize+0x44>
8003b54: 34 01 00 00 mvi r1,0
8003b58: 34 02 00 00 mvi r2,0
8003b5c: 34 03 00 12 mvi r3,18
8003b60: f8 00 02 31 calli 8004424 <_Internal_error_Occurred>
8003b64: 78 01 08 01 mvhi r1,0x801
8003b68: 29 62 00 00 lw r2,(r11+0)
8003b6c: 38 21 4d b4 ori r1,r1,0x4db4
8003b70: 28 21 00 0c lw r1,(r1+12)
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;
8003b74: 34 03 00 01 mvi r3,1
8003b78: 59 83 00 30 sw (r12+48),r3
8003b7c: 34 42 00 01 addi r2,r2,1
8003b80: 58 2c 00 44 sw (r1+68),r12
8003b84: 58 2f 00 20 sw (r1+32),r15
8003b88: 59 62 00 00 sw (r11+0),r2
8003b8c: 2b 81 00 1c lw r1,(sp+28)
8003b90: d0 01 00 00 wcsr IE,r1
8003b94: b9 80 08 00 mv r1,r12
8003b98: b9 c0 10 00 mv r2,r14
8003b9c: fb ff ff a3 calli 8003a28 <_CORE_mutex_Seize_interrupt_blocking>
}
8003ba0: 2b 9d 00 04 lw ra,(sp+4)
8003ba4: 2b 8b 00 18 lw r11,(sp+24)
8003ba8: 2b 8c 00 14 lw r12,(sp+20)
8003bac: 2b 8d 00 10 lw r13,(sp+16)
8003bb0: 2b 8e 00 0c lw r14,(sp+12)
8003bb4: 2b 8f 00 08 lw r15,(sp+8)
8003bb8: 37 9c 00 1c addi sp,sp,28
8003bbc: c3 a0 00 00 ret
08003d2c <_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
)
{
8003d2c: 37 9c ff f8 addi sp,sp,-8
8003d30: 5b 8b 00 08 sw (sp+8),r11
8003d34: 5b 9d 00 04 sw (sp+4),ra
8003d38: b8 20 58 00 mv r11,r1
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
8003d3c: f8 00 08 56 calli 8005e94 <_Thread_queue_Dequeue>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
8003d40: 34 02 00 00 mvi r2,0
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
8003d44: 44 20 00 06 be r1,r0,8003d5c <_CORE_semaphore_Surrender+0x30>
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
8003d48: b8 40 08 00 mv r1,r2
8003d4c: 2b 9d 00 04 lw ra,(sp+4)
8003d50: 2b 8b 00 08 lw r11,(sp+8)
8003d54: 37 9c 00 08 addi sp,sp,8
8003d58: c3 a0 00 00 ret
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
8003d5c: 90 00 08 00 rcsr r1,IE
8003d60: 34 02 ff fe mvi r2,-2
8003d64: a0 22 10 00 and r2,r1,r2
8003d68: d0 02 00 00 wcsr IE,r2
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
8003d6c: 29 63 00 48 lw r3,(r11+72)
8003d70: 29 64 00 40 lw r4,(r11+64)
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
8003d74: 34 02 00 04 mvi r2,4
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
8003d78: 50 64 00 04 bgeu r3,r4,8003d88 <_CORE_semaphore_Surrender+0x5c><== NEVER TAKEN
the_semaphore->count += 1;
8003d7c: 34 63 00 01 addi r3,r3,1
8003d80: 59 63 00 48 sw (r11+72),r3
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
8003d84: 34 02 00 00 mvi r2,0
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
8003d88: d0 01 00 00 wcsr IE,r1
}
return status;
}
8003d8c: b8 40 08 00 mv r1,r2
8003d90: 2b 9d 00 04 lw ra,(sp+4)
8003d94: 2b 8b 00 08 lw r11,(sp+8)
8003d98: 37 9c 00 08 addi sp,sp,8
8003d9c: c3 a0 00 00 ret
08009f24 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
8009f24: 37 9c ff f0 addi sp,sp,-16
8009f28: 5b 8b 00 10 sw (sp+16),r11
8009f2c: 5b 8c 00 0c sw (sp+12),r12
8009f30: 5b 8d 00 08 sw (sp+8),r13
8009f34: 5b 9d 00 04 sw (sp+4),ra
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
8009f38: 58 20 00 04 sw (r1+4),r0
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
8009f3c: b8 20 58 00 mv r11,r1
8009f40: b8 40 60 00 mv r12,r2
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8009f44: 34 2d 00 04 addi r13,r1,4
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009f48: 44 60 00 10 be r3,r0,8009f88 <_Chain_Initialize+0x64> <== NEVER TAKEN
8009f4c: 34 63 ff ff addi r3,r3,-1
8009f50: b8 60 10 00 mv r2,r3
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
8009f54: b9 80 28 00 mv r5,r12
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
8009f58: b9 60 30 00 mv r6,r11
8009f5c: e0 00 00 04 bi 8009f6c <_Chain_Initialize+0x48>
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009f60: b8 a0 30 00 mv r6,r5
8009f64: 34 63 ff ff addi r3,r3,-1
current->next = next;
next->previous = current;
current = next;
next = (Chain_Node *)
8009f68: b8 e0 28 00 mv r5,r7
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
current->next = next;
8009f6c: 58 c5 00 00 sw (r6+0),r5
next->previous = current;
8009f70: 58 a6 00 04 sw (r5+4),r6
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
8009f74: b4 a4 38 00 add r7,r5,r4
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009f78: 5c 60 ff fa bne r3,r0,8009f60 <_Chain_Initialize+0x3c>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
8009f7c: b8 80 08 00 mv r1,r4
8009f80: f8 00 20 e2 calli 8012308 <__mulsi3>
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009f84: b5 81 08 00 add r1,r12,r1
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
8009f88: 58 2d 00 00 sw (r1+0),r13
tail->previous = current;
8009f8c: 59 61 00 08 sw (r11+8),r1
}
8009f90: 2b 9d 00 04 lw ra,(sp+4)
8009f94: 2b 8b 00 10 lw r11,(sp+16)
8009f98: 2b 8c 00 0c lw r12,(sp+12)
8009f9c: 2b 8d 00 08 lw r13,(sp+8)
8009fa0: 37 9c 00 10 addi sp,sp,16
8009fa4: c3 a0 00 00 ret
0800e064 <_Event_Seize>:
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
800e064: 37 9c ff f4 addi sp,sp,-12
800e068: 5b 8b 00 0c sw (sp+12),r11
800e06c: 5b 8c 00 08 sw (sp+8),r12
800e070: 5b 9d 00 04 sw (sp+4),ra
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
800e074: 78 05 08 01 mvhi r5,0x801
800e078: 38 a5 ae 3c ori r5,r5,0xae3c
800e07c: 28 ab 00 0c lw r11,(r5+12)
executing->Wait.return_code = RTEMS_SUCCESSFUL;
800e080: 59 60 00 34 sw (r11+52),r0
api = executing->API_Extensions[ THREAD_API_RTEMS ];
800e084: 29 67 01 1c lw r7,(r11+284)
_ISR_Disable( level );
800e088: 90 00 30 00 rcsr r6,IE
800e08c: 34 05 ff fe mvi r5,-2
800e090: a0 c5 28 00 and r5,r6,r5
800e094: d0 05 00 00 wcsr IE,r5
pending_events = api->pending_events;
800e098: 28 e8 00 00 lw r8,(r7+0)
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 );
800e09c: a0 28 28 00 and r5,r1,r8
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
800e0a0: 44 a0 00 04 be r5,r0,800e0b0 <_Event_Seize+0x4c>
800e0a4: 44 25 00 29 be r1,r5,800e148 <_Event_Seize+0xe4>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_any (
rtems_option option_set
)
{
return (option_set & RTEMS_EVENT_ANY) ? true : false;
800e0a8: 20 49 00 02 andi r9,r2,0x2
(seized_events == event_in || _Options_Is_any( option_set )) ) {
800e0ac: 5d 20 00 27 bne r9,r0,800e148 <_Event_Seize+0xe4>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
800e0b0: 20 47 00 01 andi r7,r2,0x1
_ISR_Enable( level );
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
800e0b4: 5c e0 00 1c bne r7,r0,800e124 <_Event_Seize+0xc0>
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800e0b8: 78 0c 08 01 mvhi r12,0x801
800e0bc: 39 8c b3 30 ori r12,r12,0xb330
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
800e0c0: 59 61 00 24 sw (r11+36),r1
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800e0c4: 34 01 00 01 mvi r1,1
* set properly when we are marked as in the event critical section.
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
800e0c8: 59 62 00 30 sw (r11+48),r2
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
800e0cc: 59 64 00 28 sw (r11+40),r4
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800e0d0: 59 81 00 00 sw (r12+0),r1
_ISR_Enable( level );
800e0d4: d0 06 00 00 wcsr IE,r6
if ( ticks ) {
800e0d8: 5c 60 00 2c bne r3,r0,800e188 <_Event_Seize+0x124>
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
800e0dc: b9 60 08 00 mv r1,r11
800e0e0: 34 02 01 00 mvi r2,256
800e0e4: fb ff e5 e7 calli 8007880 <_Thread_Set_state>
_ISR_Disable( level );
800e0e8: 90 00 18 00 rcsr r3,IE
800e0ec: 34 01 ff fe mvi r1,-2
800e0f0: a0 61 08 00 and r1,r3,r1
800e0f4: d0 01 00 00 wcsr IE,r1
sync_state = _Event_Sync_state;
800e0f8: 29 81 00 00 lw r1,(r12+0)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
800e0fc: 34 02 00 01 mvi r2,1
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
800e100: 59 80 00 00 sw (r12+0),r0
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
800e104: 44 22 00 1b be r1,r2,800e170 <_Event_Seize+0x10c> <== ALWAYS TAKEN
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
800e108: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
800e10c: f8 00 05 93 calli 800f758 <_Thread_blocking_operation_Cancel><== NOT EXECUTED
}
800e110: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800e114: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
800e118: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
800e11c: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800e120: c3 a0 00 00 ret <== NOT EXECUTED
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
800e124: d0 06 00 00 wcsr IE,r6
executing->Wait.return_code = RTEMS_UNSATISFIED;
800e128: 34 01 00 0d mvi r1,13
800e12c: 59 61 00 34 sw (r11+52),r1
*event_out = seized_events;
800e130: 58 85 00 00 sw (r4+0),r5
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
800e134: 2b 9d 00 04 lw ra,(sp+4)
800e138: 2b 8b 00 0c lw r11,(sp+12)
800e13c: 2b 8c 00 08 lw r12,(sp+8)
800e140: 37 9c 00 0c addi sp,sp,12
800e144: c3 a0 00 00 ret
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) );
800e148: a4 a0 08 00 not r1,r5
800e14c: a0 28 40 00 and r8,r1,r8
pending_events = api->pending_events;
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
api->pending_events =
800e150: 58 e8 00 00 sw (r7+0),r8
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
800e154: d0 06 00 00 wcsr IE,r6
*event_out = seized_events;
800e158: 58 85 00 00 sw (r4+0),r5
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
800e15c: 2b 9d 00 04 lw ra,(sp+4)
800e160: 2b 8b 00 0c lw r11,(sp+12)
800e164: 2b 8c 00 08 lw r12,(sp+8)
800e168: 37 9c 00 0c addi sp,sp,12
800e16c: c3 a0 00 00 ret
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
_ISR_Enable( level );
800e170: d0 03 00 00 wcsr IE,r3
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
800e174: 2b 9d 00 04 lw ra,(sp+4)
800e178: 2b 8b 00 0c lw r11,(sp+12)
800e17c: 2b 8c 00 08 lw r12,(sp+8)
800e180: 37 9c 00 0c addi sp,sp,12
800e184: c3 a0 00 00 ret
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
if ( ticks ) {
_Watchdog_Initialize(
800e188: 29 62 00 08 lw r2,(r11+8)
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
800e18c: 78 01 08 00 mvhi r1,0x800
800e190: 38 21 e3 94 ori r1,r1,0xe394
800e194: 59 61 00 64 sw (r11+100),r1
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800e198: 78 01 08 01 mvhi r1,0x801
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
the_watchdog->id = id;
800e19c: 59 62 00 68 sw (r11+104),r2
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
800e1a0: 59 60 00 50 sw (r11+80),r0
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
800e1a4: 59 60 00 6c sw (r11+108),r0
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800e1a8: 59 63 00 54 sw (r11+84),r3
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800e1ac: 38 21 aa 50 ori r1,r1,0xaa50
800e1b0: 35 62 00 48 addi r2,r11,72
800e1b4: fb ff e7 5a calli 8007f1c <_Watchdog_Insert>
800e1b8: e3 ff ff c9 bi 800e0dc <_Event_Seize+0x78>
0800e230 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
800e230: 37 9c ff f8 addi sp,sp,-8
800e234: 5b 8b 00 08 sw (sp+8),r11
800e238: 5b 9d 00 04 sw (sp+4),ra
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 ];
800e23c: 28 25 01 1c lw r5,(r1+284)
option_set = (rtems_option) the_thread->Wait.option;
800e240: 28 28 00 30 lw r8,(r1+48)
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
800e244: b8 20 58 00 mv r11,r1
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
800e248: 90 00 08 00 rcsr r1,IE
800e24c: 34 07 ff fe mvi r7,-2
800e250: a0 27 38 00 and r7,r1,r7
800e254: d0 07 00 00 wcsr IE,r7
pending_events = api->pending_events;
800e258: 28 a6 00 00 lw r6,(r5+0)
event_condition = (rtems_event_set) the_thread->Wait.count;
800e25c: 29 64 00 24 lw r4,(r11+36)
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 );
800e260: a0 86 10 00 and r2,r4,r6
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
800e264: 44 40 00 27 be r2,r0,800e300 <_Event_Surrender+0xd0>
/*
* 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() &&
800e268: 78 03 08 01 mvhi r3,0x801
800e26c: 38 63 ae 3c ori r3,r3,0xae3c
800e270: 28 69 00 08 lw r9,(r3+8)
800e274: 45 20 00 03 be r9,r0,800e280 <_Event_Surrender+0x50>
800e278: 28 63 00 0c lw r3,(r3+12)
800e27c: 45 63 00 31 be r11,r3,800e340 <_Event_Surrender+0x110> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
800e280: 29 63 00 10 lw r3,(r11+16)
800e284: 20 63 01 00 andi r3,r3,0x100
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
800e288: 44 60 00 19 be r3,r0,800e2ec <_Event_Surrender+0xbc>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
800e28c: 44 82 00 03 be r4,r2,800e298 <_Event_Surrender+0x68>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_any (
rtems_option option_set
)
{
return (option_set & RTEMS_EVENT_ANY) ? true : false;
800e290: 21 08 00 02 andi r8,r8,0x2
800e294: 45 00 00 16 be r8,r0,800e2ec <_Event_Surrender+0xbc> <== 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) );
800e298: a4 40 18 00 not r3,r2
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;
800e29c: 29 64 00 28 lw r4,(r11+40)
800e2a0: a0 66 30 00 and r6,r3,r6
/*
* 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 );
800e2a4: 58 a6 00 00 sw (r5+0),r6
the_thread->Wait.count = 0;
800e2a8: 59 60 00 24 sw (r11+36),r0
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800e2ac: 58 82 00 00 sw (r4+0),r2
_ISR_Flash( level );
800e2b0: d0 01 00 00 wcsr IE,r1
800e2b4: d0 07 00 00 wcsr IE,r7
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
800e2b8: 29 63 00 50 lw r3,(r11+80)
800e2bc: 34 02 00 02 mvi r2,2
800e2c0: 44 62 00 15 be r3,r2,800e314 <_Event_Surrender+0xe4>
_ISR_Enable( level );
800e2c4: d0 01 00 00 wcsr IE,r1
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800e2c8: 78 01 08 01 mvhi r1,0x801
800e2cc: 38 21 8b 54 ori r1,r1,0x8b54
800e2d0: 28 22 00 00 lw r2,(r1+0)
800e2d4: b9 60 08 00 mv r1,r11
800e2d8: f8 00 05 38 calli 800f7b8 <_Thread_Clear_state>
}
return;
}
}
_ISR_Enable( level );
}
800e2dc: 2b 9d 00 04 lw ra,(sp+4)
800e2e0: 2b 8b 00 08 lw r11,(sp+8)
800e2e4: 37 9c 00 08 addi sp,sp,8
800e2e8: c3 a0 00 00 ret
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
800e2ec: d0 01 00 00 wcsr IE,r1
}
800e2f0: 2b 9d 00 04 lw ra,(sp+4)
800e2f4: 2b 8b 00 08 lw r11,(sp+8)
800e2f8: 37 9c 00 08 addi sp,sp,8
800e2fc: c3 a0 00 00 ret
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
_ISR_Enable( level );
800e300: d0 01 00 00 wcsr IE,r1
}
return;
}
}
_ISR_Enable( level );
}
800e304: 2b 9d 00 04 lw ra,(sp+4)
800e308: 2b 8b 00 08 lw r11,(sp+8)
800e30c: 37 9c 00 08 addi sp,sp,8
800e310: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
800e314: 34 02 00 03 mvi r2,3
800e318: 59 62 00 50 sw (r11+80),r2
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
800e31c: d0 01 00 00 wcsr IE,r1
(void) _Watchdog_Remove( &the_thread->Timer );
800e320: 35 61 00 48 addi r1,r11,72
800e324: fb ff e7 69 calli 80080c8 <_Watchdog_Remove>
800e328: 78 03 08 01 mvhi r3,0x801
800e32c: 38 63 8b 54 ori r3,r3,0x8b54
800e330: 28 62 00 00 lw r2,(r3+0)
800e334: b9 60 08 00 mv r1,r11
800e338: f8 00 05 20 calli 800f7b8 <_Thread_Clear_state>
800e33c: e3 ff ff ed bi 800e2f0 <_Event_Surrender+0xc0>
* 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) ||
800e340: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED
800e344: 38 63 b3 30 ori r3,r3,0xb330 <== NOT EXECUTED
800e348: 28 6a 00 00 lw r10,(r3+0) <== NOT EXECUTED
/*
* 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 ) &&
800e34c: 34 09 00 02 mvi r9,2 <== NOT EXECUTED
800e350: 45 49 00 04 be r10,r9,800e360 <_Event_Surrender+0x130> <== NOT EXECUTED
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
800e354: 28 6a 00 00 lw r10,(r3+0) <== NOT EXECUTED
* 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) ||
800e358: 34 09 00 01 mvi r9,1 <== NOT EXECUTED
800e35c: 5d 49 ff c9 bne r10,r9,800e280 <_Event_Surrender+0x50> <== NOT EXECUTED
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
800e360: 44 82 00 03 be r4,r2,800e36c <_Event_Surrender+0x13c> <== NOT EXECUTED
800e364: 21 08 00 02 andi r8,r8,0x2 <== NOT EXECUTED
800e368: 45 00 00 09 be r8,r0,800e38c <_Event_Surrender+0x15c> <== NOT EXECUTED
800e36c: a4 40 20 00 not r4,r2 <== NOT EXECUTED
800e370: a0 86 30 00 and r6,r4,r6 <== NOT EXECUTED
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;
800e374: 29 64 00 28 lw r4,(r11+40) <== NOT EXECUTED
if ( _ISR_Is_in_progress() &&
_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 );
800e378: 58 a6 00 00 sw (r5+0),r6 <== NOT EXECUTED
the_thread->Wait.count = 0;
800e37c: 59 60 00 24 sw (r11+36),r0 <== NOT EXECUTED
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800e380: 58 82 00 00 sw (r4+0),r2 <== NOT EXECUTED
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
800e384: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
800e388: 58 62 00 00 sw (r3+0),r2 <== NOT EXECUTED
}
_ISR_Enable( level );
800e38c: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
return;
800e390: e3 ff ff d8 bi 800e2f0 <_Event_Surrender+0xc0> <== NOT EXECUTED
0800e394 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
800e394: 37 9c ff f8 addi sp,sp,-8
800e398: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
800e39c: 37 82 00 08 addi r2,sp,8
800e3a0: fb ff e2 a3 calli 8006e2c <_Thread_Get>
switch ( location ) {
800e3a4: 2b 82 00 08 lw r2,(sp+8)
800e3a8: 44 40 00 04 be r2,r0,800e3b8 <_Event_Timeout+0x24> <== ALWAYS TAKEN
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
800e3ac: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800e3b0: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
800e3b4: c3 a0 00 00 ret <== NOT EXECUTED
*
* 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 );
800e3b8: 90 00 18 00 rcsr r3,IE
800e3bc: 34 02 ff fe mvi r2,-2
800e3c0: a0 62 10 00 and r2,r3,r2
800e3c4: d0 02 00 00 wcsr IE,r2
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800e3c8: 78 02 08 01 mvhi r2,0x801
800e3cc: 38 42 ae 3c ori r2,r2,0xae3c
return;
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
800e3d0: 28 42 00 0c lw r2,(r2+12)
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
800e3d4: 58 20 00 24 sw (r1+36),r0
if ( _Thread_Is_executing( the_thread ) ) {
800e3d8: 44 22 00 10 be r1,r2,800e418 <_Event_Timeout+0x84> <== NEVER TAKEN
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
800e3dc: 34 02 00 06 mvi r2,6
800e3e0: 58 22 00 34 sw (r1+52),r2
_ISR_Enable( level );
800e3e4: d0 03 00 00 wcsr IE,r3
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800e3e8: 78 03 08 01 mvhi r3,0x801
800e3ec: 38 63 8b 54 ori r3,r3,0x8b54
800e3f0: 28 62 00 00 lw r2,(r3+0)
800e3f4: f8 00 04 f1 calli 800f7b8 <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
800e3f8: 78 01 08 01 mvhi r1,0x801
800e3fc: 38 21 a9 90 ori r1,r1,0xa990
800e400: 28 22 00 00 lw r2,(r1+0)
800e404: 34 42 ff ff addi r2,r2,-1
800e408: 58 22 00 00 sw (r1+0),r2
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
800e40c: 2b 9d 00 04 lw ra,(sp+4)
800e410: 37 9c 00 08 addi sp,sp,8
800e414: c3 a0 00 00 ret
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
800e418: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
800e41c: 38 42 b3 30 ori r2,r2,0xb330 <== NOT EXECUTED
800e420: 28 45 00 00 lw r5,(r2+0) <== NOT EXECUTED
800e424: 34 04 00 01 mvi r4,1 <== NOT EXECUTED
800e428: 5c a4 ff ed bne r5,r4,800e3dc <_Event_Timeout+0x48> <== NOT EXECUTED
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
800e42c: 34 04 00 02 mvi r4,2 <== NOT EXECUTED
800e430: 58 44 00 00 sw (r2+0),r4 <== NOT EXECUTED
800e434: e3 ff ff ea bi 800e3dc <_Event_Timeout+0x48> <== NOT EXECUTED
0800a1b8 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
800a1b8: 37 9c ff bc addi sp,sp,-68
800a1bc: 5b 8b 00 44 sw (sp+68),r11
800a1c0: 5b 8c 00 40 sw (sp+64),r12
800a1c4: 5b 8d 00 3c sw (sp+60),r13
800a1c8: 5b 8e 00 38 sw (sp+56),r14
800a1cc: 5b 8f 00 34 sw (sp+52),r15
800a1d0: 5b 90 00 30 sw (sp+48),r16
800a1d4: 5b 91 00 2c sw (sp+44),r17
800a1d8: 5b 92 00 28 sw (sp+40),r18
800a1dc: 5b 93 00 24 sw (sp+36),r19
800a1e0: 5b 94 00 20 sw (sp+32),r20
800a1e4: 5b 95 00 1c sw (sp+28),r21
800a1e8: 5b 96 00 18 sw (sp+24),r22
800a1ec: 5b 97 00 14 sw (sp+20),r23
800a1f0: 5b 98 00 10 sw (sp+16),r24
800a1f4: 5b 99 00 0c sw (sp+12),r25
800a1f8: 5b 9b 00 08 sw (sp+8),fp
800a1fc: 5b 9d 00 04 sw (sp+4),ra
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
800a200: 34 54 00 04 addi r20,r2,4
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
800a204: b8 20 78 00 mv r15,r1
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
800a208: 28 37 00 10 lw r23,(r1+16)
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
800a20c: b8 40 70 00 mv r14,r2
800a210: b8 60 80 00 mv r16,r3
800a214: b8 80 90 00 mv r18,r4
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
/* Integer overflow occured */
return NULL;
800a218: 34 01 00 00 mvi r1,0
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
800a21c: 54 54 00 5b bgu r2,r20,800a388 <_Heap_Allocate_aligned_with_boundary+0x1d0>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
800a220: 5c 80 00 6f bne r4,r0,800a3dc <_Heap_Allocate_aligned_with_boundary+0x224>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
800a224: 29 ec 00 08 lw r12,(r15+8)
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a228: 34 01 00 00 mvi r1,0
800a22c: 45 ec 00 57 be r15,r12,800a388 <_Heap_Allocate_aligned_with_boundary+0x1d0>
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
800a230: 34 18 00 04 mvi r24,4
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a234: 34 11 00 01 mvi r17,1
- 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;
800a238: 34 1b ff fe mvi fp,-2
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
800a23c: 36 f9 00 07 addi r25,r23,7
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
800a240: cb 0e c0 00 sub r24,r24,r14
/*
* The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag
* field. Thus the value is about one unit larger than the real block
* size. The greater than operator takes this into account.
*/
if ( block->size_and_flag > block_size_floor ) {
800a244: 29 81 00 04 lw r1,(r12+4)
800a248: 52 81 00 3b bgeu r20,r1,800a334 <_Heap_Allocate_aligned_with_boundary+0x17c>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
800a24c: 35 8b 00 08 addi r11,r12,8
if ( alignment == 0 ) {
800a250: 46 00 00 3e be r16,r0,800a348 <_Heap_Allocate_aligned_with_boundary+0x190>
- 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;
800a254: a0 3b 68 00 and r13,r1,fp
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
800a258: 29 f5 00 14 lw r21,(r15+20)
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
800a25c: b5 8d 68 00 add r13,r12,r13
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
800a260: b7 0d 58 00 add r11,r24,r13
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
800a264: cb 35 18 00 sub r3,r25,r21
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a268: b9 60 08 00 mv r1,r11
800a26c: ba 00 10 00 mv r2,r16
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
800a270: b4 6d 68 00 add r13,r3,r13
800a274: f8 00 20 9a calli 80124dc <__umodsi3>
800a278: c9 61 58 00 sub r11,r11,r1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
800a27c: 35 96 00 08 addi r22,r12,8
uintptr_t alloc_begin = alloc_end - alloc_size;
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
800a280: 51 ab 00 05 bgeu r13,r11,800a294 <_Heap_Allocate_aligned_with_boundary+0xdc>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a284: b9 a0 08 00 mv r1,r13
800a288: ba 00 10 00 mv r2,r16
800a28c: f8 00 20 94 calli 80124dc <__umodsi3>
800a290: c9 a1 58 00 sub r11,r13,r1
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
800a294: 46 40 00 1c be r18,r0,800a304 <_Heap_Allocate_aligned_with_boundary+0x14c>
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment );
}
alloc_end = alloc_begin + alloc_size;
800a298: b5 6e 68 00 add r13,r11,r14
800a29c: b9 a0 08 00 mv r1,r13
800a2a0: ba 40 10 00 mv r2,r18
800a2a4: f8 00 20 8e calli 80124dc <__umodsi3>
800a2a8: c9 a1 28 00 sub r5,r13,r1
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
800a2ac: f5 a5 68 00 cmpgu r13,r13,r5
800a2b0: f4 ab 08 00 cmpgu r1,r5,r11
800a2b4: a1 a1 68 00 and r13,r13,r1
800a2b8: 45 a0 00 13 be r13,r0,800a304 <_Heap_Allocate_aligned_with_boundary+0x14c>
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
800a2bc: b6 ce 98 00 add r19,r22,r14
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
800a2c0: 56 65 00 1d bgu r19,r5,800a334 <_Heap_Allocate_aligned_with_boundary+0x17c>
800a2c4: e0 00 00 02 bi 800a2cc <_Heap_Allocate_aligned_with_boundary+0x114>
800a2c8: 56 65 00 1b bgu r19,r5,800a334 <_Heap_Allocate_aligned_with_boundary+0x17c><== NEVER TAKEN
return 0;
}
alloc_begin = boundary_line - alloc_size;
800a2cc: c8 ae 58 00 sub r11,r5,r14
800a2d0: ba 00 10 00 mv r2,r16
800a2d4: b9 60 08 00 mv r1,r11
800a2d8: f8 00 20 81 calli 80124dc <__umodsi3>
800a2dc: c9 61 58 00 sub r11,r11,r1
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
800a2e0: b5 6e 68 00 add r13,r11,r14
800a2e4: b9 a0 08 00 mv r1,r13
800a2e8: ba 40 10 00 mv r2,r18
800a2ec: f8 00 20 7c calli 80124dc <__umodsi3>
800a2f0: c9 a1 28 00 sub r5,r13,r1
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
800a2f4: f5 a5 68 00 cmpgu r13,r13,r5
800a2f8: f4 ab 08 00 cmpgu r1,r5,r11
800a2fc: a1 a1 68 00 and r13,r13,r1
800a300: 5d a0 ff f2 bne r13,r0,800a2c8 <_Heap_Allocate_aligned_with_boundary+0x110>
boundary_line = _Heap_Align_down( alloc_end, boundary );
}
}
/* Ensure that the we have a valid new block at the beginning */
if ( alloc_begin >= alloc_begin_floor ) {
800a304: 56 cb 00 0c bgu r22,r11,800a334 <_Heap_Allocate_aligned_with_boundary+0x17c>
800a308: 34 01 ff f8 mvi r1,-8
800a30c: c8 2c 68 00 sub r13,r1,r12
800a310: ba e0 10 00 mv r2,r23
800a314: b9 60 08 00 mv r1,r11
800a318: f8 00 20 71 calli 80124dc <__umodsi3>
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a31c: b5 ab 68 00 add r13,r13,r11
uintptr_t const alloc_block_begin =
(uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size );
uintptr_t const free_size = alloc_block_begin - block_begin;
800a320: c9 a1 08 00 sub r1,r13,r1
if ( free_size >= min_block_size || free_size == 0 ) {
800a324: 64 22 00 00 cmpei r2,r1,0
800a328: f0 35 a8 00 cmpgeu r21,r1,r21
800a32c: b8 55 08 00 or r1,r2,r21
800a330: 5c 20 00 06 bne r1,r0,800a348 <_Heap_Allocate_aligned_with_boundary+0x190>
if ( alloc_begin != 0 ) {
break;
}
block = block->next;
800a334: 29 8c 00 08 lw r12,(r12+8)
800a338: 36 21 00 01 addi r1,r17,1
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a33c: 45 ec 00 26 be r15,r12,800a3d4 <_Heap_Allocate_aligned_with_boundary+0x21c>
800a340: b8 20 88 00 mv r17,r1
800a344: e3 ff ff c0 bi 800a244 <_Heap_Allocate_aligned_with_boundary+0x8c>
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
800a348: 45 60 ff fb be r11,r0,800a334 <_Heap_Allocate_aligned_with_boundary+0x17c><== NEVER TAKEN
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
800a34c: 29 e3 00 48 lw r3,(r15+72)
stats->searches += search_count;
800a350: 29 e2 00 4c lw r2,(r15+76)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
800a354: b9 e0 08 00 mv r1,r15
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
800a358: 34 63 00 01 addi r3,r3,1
stats->searches += search_count;
800a35c: b4 51 10 00 add r2,r2,r17
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
800a360: 59 e3 00 48 sw (r15+72),r3
stats->searches += search_count;
800a364: 59 e2 00 4c sw (r15+76),r2
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
800a368: b9 60 18 00 mv r3,r11
800a36c: b9 80 10 00 mv r2,r12
800a370: b9 c0 20 00 mv r4,r14
800a374: fb ff e7 d0 calli 80042b4 <_Heap_Block_allocate>
800a378: b9 60 08 00 mv r1,r11
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
800a37c: 29 e2 00 44 lw r2,(r15+68)
800a380: 50 51 00 02 bgeu r2,r17,800a388 <_Heap_Allocate_aligned_with_boundary+0x1d0>
stats->max_search = search_count;
800a384: 59 f1 00 44 sw (r15+68),r17
}
return (void *) alloc_begin;
}
800a388: 2b 9d 00 04 lw ra,(sp+4)
800a38c: 2b 8b 00 44 lw r11,(sp+68)
800a390: 2b 8c 00 40 lw r12,(sp+64)
800a394: 2b 8d 00 3c lw r13,(sp+60)
800a398: 2b 8e 00 38 lw r14,(sp+56)
800a39c: 2b 8f 00 34 lw r15,(sp+52)
800a3a0: 2b 90 00 30 lw r16,(sp+48)
800a3a4: 2b 91 00 2c lw r17,(sp+44)
800a3a8: 2b 92 00 28 lw r18,(sp+40)
800a3ac: 2b 93 00 24 lw r19,(sp+36)
800a3b0: 2b 94 00 20 lw r20,(sp+32)
800a3b4: 2b 95 00 1c lw r21,(sp+28)
800a3b8: 2b 96 00 18 lw r22,(sp+24)
800a3bc: 2b 97 00 14 lw r23,(sp+20)
800a3c0: 2b 98 00 10 lw r24,(sp+16)
800a3c4: 2b 99 00 0c lw r25,(sp+12)
800a3c8: 2b 9b 00 08 lw fp,(sp+8)
800a3cc: 37 9c 00 44 addi sp,sp,68
800a3d0: c3 a0 00 00 ret
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a3d4: 34 01 00 00 mvi r1,0
800a3d8: e3 ff ff e9 bi 800a37c <_Heap_Allocate_aligned_with_boundary+0x1c4>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
800a3dc: 54 44 ff eb bgu r2,r4,800a388 <_Heap_Allocate_aligned_with_boundary+0x1d0>
return NULL;
}
if ( alignment == 0 ) {
800a3e0: 5c 60 ff 91 bne r3,r0,800a224 <_Heap_Allocate_aligned_with_boundary+0x6c>
alignment = page_size;
800a3e4: ba e0 80 00 mv r16,r23
800a3e8: e3 ff ff 8f bi 800a224 <_Heap_Allocate_aligned_with_boundary+0x6c>
0800a64c <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
800a64c: 37 9c ff b8 addi sp,sp,-72
800a650: 5b 8b 00 40 sw (sp+64),r11
800a654: 5b 8c 00 3c sw (sp+60),r12
800a658: 5b 8d 00 38 sw (sp+56),r13
800a65c: 5b 8e 00 34 sw (sp+52),r14
800a660: 5b 8f 00 30 sw (sp+48),r15
800a664: 5b 90 00 2c sw (sp+44),r16
800a668: 5b 91 00 28 sw (sp+40),r17
800a66c: 5b 92 00 24 sw (sp+36),r18
800a670: 5b 93 00 20 sw (sp+32),r19
800a674: 5b 94 00 1c sw (sp+28),r20
800a678: 5b 95 00 18 sw (sp+24),r21
800a67c: 5b 96 00 14 sw (sp+20),r22
800a680: 5b 97 00 10 sw (sp+16),r23
800a684: 5b 98 00 0c sw (sp+12),r24
800a688: 5b 99 00 08 sw (sp+8),r25
800a68c: 5b 9d 00 04 sw (sp+4),ra
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;
800a690: 5b 80 00 48 sw (sp+72),r0
Heap_Block *extend_last_block = NULL;
800a694: 5b 80 00 44 sw (sp+68),r0
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;
800a698: b4 43 70 00 add r14,r2,r3
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
800a69c: b8 40 68 00 mv r13,r2
800a6a0: b8 20 58 00 mv r11,r1
800a6a4: b8 80 b8 00 mv r23,r4
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
800a6a8: 28 30 00 20 lw r16,(r1+32)
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;
800a6ac: 28 32 00 10 lw r18,(r1+16)
uintptr_t const min_block_size = heap->min_block_size;
800a6b0: 28 25 00 14 lw r5,(r1+20)
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;
800a6b4: 28 38 00 30 lw r24,(r1+48)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
return false;
800a6b8: 34 0c 00 00 mvi r12,0
uintptr_t const free_size = stats->free_size;
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
800a6bc: 54 4e 00 76 bgu r2,r14,800a894 <_Heap_Extend+0x248>
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
800a6c0: b8 40 08 00 mv r1,r2
800a6c4: b8 a0 20 00 mv r4,r5
800a6c8: b8 60 10 00 mv r2,r3
800a6cc: 37 85 00 48 addi r5,sp,72
800a6d0: ba 40 18 00 mv r3,r18
800a6d4: 37 86 00 44 addi r6,sp,68
800a6d8: fb ff e7 5f calli 8004454 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
800a6dc: 44 20 00 6e be r1,r0,800a894 <_Heap_Extend+0x248>
800a6e0: ba 00 60 00 mv r12,r16
800a6e4: 34 16 00 00 mvi r22,0
800a6e8: 34 19 00 00 mvi r25,0
800a6ec: 34 11 00 00 mvi r17,0
800a6f0: 34 14 00 00 mvi r20,0
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a6f4: 34 15 ff fe mvi r21,-2
800a6f8: e0 00 00 0d bi 800a72c <_Heap_Extend+0xe0>
return false;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
800a6fc: 55 ee 00 7b bgu r15,r14,800a8e8 <_Heap_Extend+0x29c>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a700: b9 e0 08 00 mv r1,r15
800a704: ba 40 10 00 mv r2,r18
800a708: 35 f3 ff f8 addi r19,r15,-8
800a70c: f8 00 20 f8 calli 8012aec <__umodsi3>
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a710: ca 61 08 00 sub r1,r19,r1
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
800a714: 45 af 00 15 be r13,r15,800a768 <_Heap_Extend+0x11c>
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
800a718: 55 af 00 72 bgu r13,r15,800a8e0 <_Heap_Extend+0x294>
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a71c: 28 2c 00 04 lw r12,(r1+4)
800a720: a2 ac 60 00 and r12,r21,r12
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a724: b4 2c 60 00 add r12,r1,r12
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
800a728: 46 0c 00 16 be r16,r12,800a780 <_Heap_Extend+0x134>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
800a72c: b9 80 08 00 mv r1,r12
800a730: 45 90 00 70 be r12,r16,800a8f0 <_Heap_Extend+0x2a4>
uintptr_t const sub_area_end = start_block->prev_size;
800a734: 29 8f 00 00 lw r15,(r12+0)
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
800a738: f5 c1 30 00 cmpgu r6,r14,r1
800a73c: f5 ed 28 00 cmpgu r5,r15,r13
(uintptr_t) start_block : heap->area_begin;
uintptr_t const sub_area_end = start_block->prev_size;
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
800a740: a0 c5 28 00 and r5,r6,r5
800a744: 5c a0 00 75 bne r5,r0,800a918 <_Heap_Extend+0x2cc>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
800a748: 5c 2e ff ed bne r1,r14,800a6fc <_Heap_Extend+0xb0>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a74c: b9 e0 08 00 mv r1,r15
800a750: ba 40 10 00 mv r2,r18
800a754: 35 f3 ff f8 addi r19,r15,-8
800a758: f8 00 20 e5 calli 8012aec <__umodsi3>
800a75c: b9 80 a0 00 mv r20,r12
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a760: ca 61 08 00 sub r1,r19,r1
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
800a764: 5d af ff ed bne r13,r15,800a718 <_Heap_Extend+0xcc> <== ALWAYS TAKEN
start_block->prev_size = extend_area_end;
800a768: 59 8e 00 00 sw (r12+0),r14
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a76c: 28 2c 00 04 lw r12,(r1+4)
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 )
800a770: b8 20 88 00 mv r17,r1
- 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;
800a774: a2 ac 60 00 and r12,r21,r12
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a778: b4 2c 60 00 add r12,r1,r12
} else if ( sub_area_end < extend_area_begin ) {
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
800a77c: 5e 0c ff ec bne r16,r12,800a72c <_Heap_Extend+0xe0> <== NEVER TAKEN
if ( extend_area_begin < heap->area_begin ) {
800a780: 29 61 00 18 lw r1,(r11+24)
800a784: 51 a1 00 61 bgeu r13,r1,800a908 <_Heap_Extend+0x2bc>
heap->area_begin = extend_area_begin;
800a788: 59 6d 00 18 sw (r11+24),r13
} 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;
800a78c: 2b 81 00 44 lw r1,(sp+68)
800a790: 2b 82 00 48 lw r2,(sp+72)
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
800a794: 29 65 00 20 lw r5,(r11+32)
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
800a798: c8 22 18 00 sub r3,r1,r2
(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;
800a79c: 38 64 00 01 ori r4,r3,0x1
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
800a7a0: 58 4e 00 00 sw (r2+0),r14
extend_first_block->size_and_flag =
800a7a4: 58 44 00 04 sw (r2+4),r4
extend_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
800a7a8: 58 23 00 00 sw (r1+0),r3
extend_last_block->size_and_flag = 0;
800a7ac: 58 20 00 04 sw (r1+4),r0
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
800a7b0: 50 45 00 52 bgeu r2,r5,800a8f8 <_Heap_Extend+0x2ac>
heap->first_block = extend_first_block;
800a7b4: 59 62 00 20 sw (r11+32),r2
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
800a7b8: 46 80 00 6a be r20,r0,800a960 <_Heap_Extend+0x314>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
800a7bc: 29 6c 00 10 lw r12,(r11+16)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
800a7c0: 35 ad 00 08 addi r13,r13,8
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
800a7c4: b9 a0 08 00 mv r1,r13
800a7c8: b9 80 10 00 mv r2,r12
800a7cc: f8 00 20 c8 calli 8012aec <__umodsi3>
if ( remainder != 0 ) {
800a7d0: 44 20 00 03 be r1,r0,800a7dc <_Heap_Extend+0x190>
return value - remainder + alignment;
800a7d4: b5 ac 68 00 add r13,r13,r12
800a7d8: c9 a1 68 00 sub r13,r13,r1
uintptr_t const new_first_block_begin =
800a7dc: 35 a2 ff f8 addi r2,r13,-8
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;
800a7e0: 2a 83 00 00 lw r3,(r20+0)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
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 =
800a7e4: ca 82 08 00 sub r1,r20,r2
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;
800a7e8: 38 21 00 01 ori r1,r1,0x1
800a7ec: 58 41 00 04 sw (r2+4),r1
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;
800a7f0: 59 a3 ff f8 sw (r13+-8),r3
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Free_block( heap, new_first_block );
800a7f4: b9 60 08 00 mv r1,r11
800a7f8: fb ff ff 88 calli 800a618 <_Heap_Free_block>
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
800a7fc: 46 20 00 49 be r17,r0,800a920 <_Heap_Extend+0x2d4>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a800: 29 62 00 10 lw r2,(r11+16)
)
{
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,
800a804: 35 ce ff f8 addi r14,r14,-8
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(
800a808: c9 d1 70 00 sub r14,r14,r17
800a80c: b9 c0 08 00 mv r1,r14
800a810: f8 00 20 b7 calli 8012aec <__umodsi3>
);
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)
800a814: 2a 22 00 04 lw r2,(r17+4)
800a818: c9 c1 70 00 sub r14,r14,r1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
800a81c: b5 d1 08 00 add r1,r14,r17
(last_block->size_and_flag - last_block_new_size)
800a820: c8 4e 10 00 sub r2,r2,r14
| HEAP_PREV_BLOCK_USED;
800a824: 38 42 00 01 ori r2,r2,0x1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
800a828: 58 22 00 04 sw (r1+4),r2
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;
800a82c: 2a 23 00 04 lw r3,(r17+4)
(last_block->size_and_flag - last_block_new_size)
| HEAP_PREV_BLOCK_USED;
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
800a830: b9 60 08 00 mv r1,r11
800a834: ba 20 10 00 mv r2,r17
800a838: 20 63 00 01 andi r3,r3,0x1
block->size_and_flag = size | flag;
800a83c: b9 c3 70 00 or r14,r14,r3
800a840: 5a 2e 00 04 sw (r17+4),r14
800a844: fb ff ff 75 calli 800a618 <_Heap_Free_block>
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
800a848: 66 31 00 00 cmpei r17,r17,0
800a84c: 66 94 00 00 cmpei r20,r20,0
800a850: a2 34 88 00 and r17,r17,r20
800a854: 5e 20 00 3f bne r17,r0,800a950 <_Heap_Extend+0x304>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
800a858: 29 61 00 24 lw r1,(r11+36)
* 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(
800a85c: 29 63 00 20 lw r3,(r11+32)
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
800a860: 29 65 00 30 lw r5,(r11+48)
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;
800a864: 28 22 00 04 lw r2,(r1+4)
/* Statistics */
stats->size += extended_size;
800a868: 29 64 00 2c lw r4,(r11+44)
* 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(
800a86c: c8 61 18 00 sub r3,r3,r1
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;
800a870: 20 42 00 01 andi r2,r2,0x1
block->size_and_flag = size | flag;
800a874: b8 62 10 00 or r2,r3,r2
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
800a878: c8 b8 c0 00 sub r24,r5,r24
800a87c: 58 22 00 04 sw (r1+4),r2
/* Statistics */
stats->size += extended_size;
800a880: b4 98 08 00 add r1,r4,r24
800a884: 59 61 00 2c sw (r11+44),r1
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
800a888: 34 0c 00 01 mvi r12,1
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
if ( extended_size_ptr != NULL )
800a88c: 46 e0 00 02 be r23,r0,800a894 <_Heap_Extend+0x248> <== NEVER TAKEN
*extended_size_ptr = extended_size;
800a890: 5a f8 00 00 sw (r23+0),r24
return true;
}
800a894: b9 80 08 00 mv r1,r12
800a898: 2b 9d 00 04 lw ra,(sp+4)
800a89c: 2b 8b 00 40 lw r11,(sp+64)
800a8a0: 2b 8c 00 3c lw r12,(sp+60)
800a8a4: 2b 8d 00 38 lw r13,(sp+56)
800a8a8: 2b 8e 00 34 lw r14,(sp+52)
800a8ac: 2b 8f 00 30 lw r15,(sp+48)
800a8b0: 2b 90 00 2c lw r16,(sp+44)
800a8b4: 2b 91 00 28 lw r17,(sp+40)
800a8b8: 2b 92 00 24 lw r18,(sp+36)
800a8bc: 2b 93 00 20 lw r19,(sp+32)
800a8c0: 2b 94 00 1c lw r20,(sp+28)
800a8c4: 2b 95 00 18 lw r21,(sp+24)
800a8c8: 2b 96 00 14 lw r22,(sp+20)
800a8cc: 2b 97 00 10 lw r23,(sp+16)
800a8d0: 2b 98 00 0c lw r24,(sp+12)
800a8d4: 2b 99 00 08 lw r25,(sp+8)
800a8d8: 37 9c 00 48 addi sp,sp,72
800a8dc: c3 a0 00 00 ret
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 )
800a8e0: b8 20 b0 00 mv r22,r1
800a8e4: e3 ff ff 8e bi 800a71c <_Heap_Extend+0xd0>
return false;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
800a8e8: b9 80 c8 00 mv r25,r12
800a8ec: e3 ff ff 85 bi 800a700 <_Heap_Extend+0xb4>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
800a8f0: 29 61 00 18 lw r1,(r11+24)
800a8f4: e3 ff ff 90 bi 800a734 <_Heap_Extend+0xe8>
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
800a8f8: 29 62 00 24 lw r2,(r11+36)
800a8fc: 50 41 ff af bgeu r2,r1,800a7b8 <_Heap_Extend+0x16c>
heap->last_block = extend_last_block;
800a900: 59 61 00 24 sw (r11+36),r1
800a904: e3 ff ff ad bi 800a7b8 <_Heap_Extend+0x16c>
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
if ( extend_area_begin < heap->area_begin ) {
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
800a908: 29 61 00 1c lw r1,(r11+28)
800a90c: 50 2e ff a0 bgeu r1,r14,800a78c <_Heap_Extend+0x140>
heap->area_end = extend_area_end;
800a910: 59 6e 00 1c sw (r11+28),r14
800a914: e3 ff ff 9e bi 800a78c <_Heap_Extend+0x140>
_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;
800a918: 34 0c 00 00 mvi r12,0
800a91c: e3 ff ff de bi 800a894 <_Heap_Extend+0x248>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
800a920: 46 d1 ff ca be r22,r17,800a848 <_Heap_Extend+0x1fc>
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;
800a924: 2a c3 00 04 lw r3,(r22+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 );
800a928: 2b 82 00 48 lw r2,(sp+72)
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
800a92c: 2b 81 00 44 lw r1,(sp+68)
800a930: 20 63 00 01 andi r3,r3,0x1
)
{
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 );
800a934: c8 56 10 00 sub r2,r2,r22
block->size_and_flag = size | flag;
800a938: b8 43 10 00 or r2,r2,r3
800a93c: 5a c2 00 04 sw (r22+4),r2
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
800a940: 28 22 00 04 lw r2,(r1+4)
800a944: 38 42 00 01 ori r2,r2,0x1
800a948: 58 22 00 04 sw (r1+4),r2
800a94c: e3 ff ff bf bi 800a848 <_Heap_Extend+0x1fc>
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
_Heap_Free_block( heap, extend_first_block );
800a950: 2b 82 00 48 lw r2,(sp+72)
800a954: b9 60 08 00 mv r1,r11
800a958: fb ff ff 30 calli 800a618 <_Heap_Free_block>
800a95c: e3 ff ff bf bi 800a858 <_Heap_Extend+0x20c>
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 ) {
800a960: 47 34 ff a7 be r25,r20,800a7fc <_Heap_Extend+0x1b0>
{
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;
800a964: cb 21 c8 00 sub r25,r25,r1
800a968: 3b 39 00 01 ori r25,r25,0x1
)
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
800a96c: 58 39 00 04 sw (r1+4),r25
800a970: e3 ff ff a3 bi 800a7fc <_Heap_Extend+0x1b0>
0800a3ec <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
800a3ec: 37 9c ff f4 addi sp,sp,-12
800a3f0: 5b 8b 00 0c sw (sp+12),r11
800a3f4: 5b 8c 00 08 sw (sp+8),r12
800a3f8: 5b 9d 00 04 sw (sp+4),ra
800a3fc: b8 20 58 00 mv r11,r1
800a400: b8 40 18 00 mv r3,r2
* 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;
800a404: 34 01 00 01 mvi r1,1
/*
* 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 ) {
800a408: 44 40 00 4b be r2,r0,800a534 <_Heap_Free+0x148>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a40c: 29 62 00 10 lw r2,(r11+16)
800a410: b8 60 08 00 mv r1,r3
800a414: 34 6c ff f8 addi r12,r3,-8
800a418: f8 00 20 31 calli 80124dc <__umodsi3>
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
800a41c: 29 64 00 20 lw r4,(r11+32)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a420: c9 81 10 00 sub r2,r12,r1
alloc_begin = (uintptr_t) alloc_begin_ptr;
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
800a424: 34 01 00 00 mvi r1,0
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;
800a428: 54 82 00 43 bgu r4,r2,800a534 <_Heap_Free+0x148>
800a42c: 29 65 00 24 lw r5,(r11+36)
800a430: 54 45 00 41 bgu r2,r5,800a534 <_Heap_Free+0x148> <== NEVER TAKEN
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a434: 28 48 00 04 lw r8,(r2+4)
- 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;
800a438: 34 07 ff fe mvi r7,-2
800a43c: a1 07 30 00 and r6,r8,r7
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a440: b4 46 18 00 add r3,r2,r6
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;
800a444: 54 83 00 3c bgu r4,r3,800a534 <_Heap_Free+0x148> <== NEVER TAKEN
800a448: 54 65 00 3b bgu r3,r5,800a534 <_Heap_Free+0x148> <== NEVER TAKEN
800a44c: 28 69 00 04 lw r9,(r3+4)
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;
800a450: 21 2a 00 01 andi r10,r9,0x1
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
800a454: 45 40 00 38 be r10,r0,800a534 <_Heap_Free+0x148> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a458: a1 27 48 00 and r9,r9,r7
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 ));
800a45c: 34 07 00 00 mvi r7,0
800a460: 44 a3 00 05 be r5,r3,800a474 <_Heap_Free+0x88>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a464: b4 69 08 00 add r1,r3,r9
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;
800a468: 28 27 00 04 lw r7,(r1+4)
800a46c: 20 e7 00 01 andi r7,r7,0x1
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
800a470: 18 e7 00 01 xori r7,r7,0x1
800a474: 21 08 00 01 andi r8,r8,0x1
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
800a478: 5d 00 00 19 bne r8,r0,800a4dc <_Heap_Free+0xf0>
uintptr_t const prev_size = block->prev_size;
800a47c: 28 4a 00 00 lw r10,(r2+0)
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
_HAssert( false );
return( false );
800a480: 34 01 00 00 mvi r1,0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a484: c8 4a 10 00 sub r2,r2,r10
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;
800a488: 54 82 00 2b bgu r4,r2,800a534 <_Heap_Free+0x148> <== NEVER TAKEN
800a48c: b9 00 08 00 mv r1,r8
800a490: 54 45 00 29 bgu r2,r5,800a534 <_Heap_Free+0x148> <== 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;
800a494: 28 44 00 04 lw r4,(r2+4)
800a498: 20 84 00 01 andi r4,r4,0x1
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
800a49c: 44 80 00 26 be r4,r0,800a534 <_Heap_Free+0x148> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
800a4a0: 44 e0 00 3d be r7,r0,800a594 <_Heap_Free+0x1a8>
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
800a4a4: 29 64 00 38 lw r4,(r11+56)
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a4a8: 28 61 00 08 lw r1,(r3+8)
800a4ac: 28 63 00 0c lw r3,(r3+12)
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
800a4b0: b4 c9 48 00 add r9,r6,r9
800a4b4: b5 2a 50 00 add r10,r9,r10
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
800a4b8: 58 61 00 08 sw (r3+8),r1
next->prev = prev;
800a4bc: 58 23 00 0c sw (r1+12),r3
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
800a4c0: 34 81 ff ff addi r1,r4,-1
800a4c4: 59 61 00 38 sw (r11+56),r1
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a4c8: 39 43 00 01 ori r3,r10,0x1
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
800a4cc: b4 4a 08 00 add r1,r2,r10
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;
800a4d0: 58 43 00 04 sw (r2+4),r3
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
800a4d4: 58 2a 00 00 sw (r1+0),r10
800a4d8: e0 00 00 0d bi 800a50c <_Heap_Free+0x120>
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
800a4dc: 44 e0 00 1b be r7,r0,800a548 <_Heap_Free+0x15c>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a4e0: 28 64 00 08 lw r4,(r3+8)
800a4e4: 28 61 00 0c lw r1,(r3+12)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
800a4e8: b5 26 48 00 add r9,r9,r6
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
800a4ec: 58 44 00 08 sw (r2+8),r4
new_block->prev = prev;
800a4f0: 58 41 00 0c sw (r2+12),r1
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a4f4: 39 25 00 01 ori r5,r9,0x1
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
800a4f8: b4 49 18 00 add r3,r2,r9
next->prev = new_block;
800a4fc: 58 82 00 0c sw (r4+12),r2
prev->next = new_block;
800a500: 58 22 00 08 sw (r1+8),r2
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;
800a504: 58 45 00 04 sw (r2+4),r5
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
800a508: 58 69 00 00 sw (r3+0),r9
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
800a50c: 29 62 00 40 lw r2,(r11+64)
++stats->frees;
800a510: 29 61 00 50 lw r1,(r11+80)
stats->free_size += block_size;
800a514: 29 63 00 30 lw r3,(r11+48)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
800a518: 34 42 ff ff addi r2,r2,-1
++stats->frees;
800a51c: 34 21 00 01 addi r1,r1,1
stats->free_size += block_size;
800a520: b4 66 30 00 add r6,r3,r6
}
}
/* Statistics */
--stats->used_blocks;
++stats->frees;
800a524: 59 61 00 50 sw (r11+80),r1
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
800a528: 59 62 00 40 sw (r11+64),r2
++stats->frees;
stats->free_size += block_size;
800a52c: 59 66 00 30 sw (r11+48),r6
return( true );
800a530: 34 01 00 01 mvi r1,1
}
800a534: 2b 9d 00 04 lw ra,(sp+4)
800a538: 2b 8b 00 0c lw r11,(sp+12)
800a53c: 2b 8c 00 08 lw r12,(sp+8)
800a540: 37 9c 00 0c addi sp,sp,12
800a544: c3 a0 00 00 ret
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;
800a548: 38 c1 00 01 ori r1,r6,0x1
800a54c: 58 41 00 04 sw (r2+4),r1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a550: 28 67 00 04 lw r7,(r3+4)
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
800a554: 29 61 00 38 lw r1,(r11+56)
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
800a558: 29 64 00 08 lw r4,(r11+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;
800a55c: 34 05 ff fe mvi r5,-2
new_block->next = next;
new_block->prev = block_before;
800a560: 58 4b 00 0c sw (r2+12),r11
800a564: a0 e5 28 00 and r5,r7,r5
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
if ( stats->max_free_blocks < stats->free_blocks ) {
800a568: 29 67 00 3c lw r7,(r11+60)
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
800a56c: 34 21 00 01 addi r1,r1,1
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
800a570: 58 44 00 08 sw (r2+8),r4
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
800a574: 58 82 00 0c sw (r4+12),r2
} 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;
800a578: 58 65 00 04 sw (r3+4),r5
next_block->prev_size = block_size;
800a57c: 58 66 00 00 sw (r3+0),r6
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
800a580: 59 62 00 08 sw (r11+8),r2
/* Statistics */
++stats->free_blocks;
800a584: 59 61 00 38 sw (r11+56),r1
if ( stats->max_free_blocks < stats->free_blocks ) {
800a588: 50 e1 ff e1 bgeu r7,r1,800a50c <_Heap_Free+0x120>
stats->max_free_blocks = stats->free_blocks;
800a58c: 59 61 00 3c sw (r11+60),r1
800a590: e3 ff ff df bi 800a50c <_Heap_Free+0x120>
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
800a594: b4 ca 50 00 add r10,r6,r10
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a598: 39 41 00 01 ori r1,r10,0x1
800a59c: 58 41 00 04 sw (r2+4),r1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a5a0: 28 62 00 04 lw r2,(r3+4)
800a5a4: 34 01 ff fe mvi r1,-2
next_block->prev_size = size;
800a5a8: 58 6a 00 00 sw (r3+0),r10
_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;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a5ac: a0 41 08 00 and r1,r2,r1
800a5b0: 58 61 00 04 sw (r3+4),r1
800a5b4: e3 ff ff d6 bi 800a50c <_Heap_Free+0x120>
0800afd0 <_Heap_Get_information>:
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
Heap_Block *the_block = the_heap->first_block;
800afd0: 28 24 00 20 lw r4,(r1+32)
Heap_Block *const end = the_heap->last_block;
800afd4: 28 28 00 24 lw r8,(r1+36)
memset(the_info, 0, sizeof(*the_info));
800afd8: 58 40 00 00 sw (r2+0),r0
800afdc: 58 40 00 04 sw (r2+4),r0
800afe0: 58 40 00 08 sw (r2+8),r0
800afe4: 58 40 00 0c sw (r2+12),r0
800afe8: 58 40 00 10 sw (r2+16),r0
800afec: 58 40 00 14 sw (r2+20),r0
while ( the_block != end ) {
800aff0: 44 88 00 14 be r4,r8,800b040 <_Heap_Get_information+0x70> <== NEVER TAKEN
800aff4: 28 85 00 04 lw r5,(r4+4)
- 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;
800aff8: 34 09 ff fe mvi r9,-2
800affc: a0 a9 18 00 and r3,r5,r9
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800b000: b4 83 20 00 add r4,r4,r3
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
800b004: 28 85 00 04 lw r5,(r4+4)
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
800b008: b8 40 08 00 mv r1,r2
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;
800b00c: 20 a6 00 01 andi r6,r5,0x1
while ( the_block != end ) {
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
800b010: 44 c0 00 02 be r6,r0,800b018 <_Heap_Get_information+0x48>
info = &the_info->Used;
800b014: 34 41 00 0c addi r1,r2,12
else
info = &the_info->Free;
info->number++;
800b018: 28 27 00 00 lw r7,(r1+0)
info->total += the_size;
800b01c: 28 26 00 08 lw r6,(r1+8)
if ( info->largest < the_size )
800b020: 28 2a 00 04 lw r10,(r1+4)
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
info->number++;
800b024: 34 e7 00 01 addi r7,r7,1
info->total += the_size;
800b028: b4 c3 30 00 add r6,r6,r3
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
info->number++;
800b02c: 58 27 00 00 sw (r1+0),r7
info->total += the_size;
800b030: 58 26 00 08 sw (r1+8),r6
if ( info->largest < the_size )
800b034: 51 43 00 02 bgeu r10,r3,800b03c <_Heap_Get_information+0x6c>
info->largest = the_size;
800b038: 58 23 00 04 sw (r1+4),r3
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
800b03c: 5d 04 ff f0 bne r8,r4,800affc <_Heap_Get_information+0x2c>
800b040: c3 a0 00 00 ret
08012f08 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
8012f08: 37 9c ff f0 addi sp,sp,-16
8012f0c: 5b 8b 00 10 sw (sp+16),r11
8012f10: 5b 8c 00 0c sw (sp+12),r12
8012f14: 5b 8d 00 08 sw (sp+8),r13
8012f18: 5b 9d 00 04 sw (sp+4),ra
8012f1c: b8 40 60 00 mv r12,r2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
8012f20: 28 22 00 10 lw r2,(r1+16)
8012f24: b8 20 58 00 mv r11,r1
8012f28: b9 80 08 00 mv r1,r12
8012f2c: b8 60 68 00 mv r13,r3
8012f30: fb ff fd 6b calli 80124dc <__umodsi3>
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
8012f34: 29 62 00 20 lw r2,(r11+32)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
8012f38: 35 84 ff f8 addi r4,r12,-8
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
8012f3c: c8 81 20 00 sub r4,r4,r1
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
8012f40: 34 01 00 00 mvi r1,0
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;
8012f44: 54 44 00 10 bgu r2,r4,8012f84 <_Heap_Size_of_alloc_area+0x7c>
8012f48: 29 65 00 24 lw r5,(r11+36)
8012f4c: 54 85 00 0e bgu r4,r5,8012f84 <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8012f50: 28 86 00 04 lw r6,(r4+4)
8012f54: 34 03 ff fe mvi r3,-2
8012f58: a0 66 18 00 and r3,r3,r6
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8012f5c: b4 83 20 00 add r4,r4,r3
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;
8012f60: 54 44 00 09 bgu r2,r4,8012f84 <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
8012f64: 54 85 00 08 bgu r4,r5,8012f84 <_Heap_Size_of_alloc_area+0x7c><== 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;
8012f68: 28 82 00 04 lw r2,(r4+4)
8012f6c: 20 42 00 01 andi r2,r2,0x1
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
8012f70: 44 40 00 05 be r2,r0,8012f84 <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
8012f74: c8 8c 20 00 sub r4,r4,r12
8012f78: 34 84 00 04 addi r4,r4,4
8012f7c: 59 a4 00 00 sw (r13+0),r4
return true;
8012f80: 34 01 00 01 mvi r1,1
}
8012f84: 2b 9d 00 04 lw ra,(sp+4)
8012f88: 2b 8b 00 10 lw r11,(sp+16)
8012f8c: 2b 8c 00 0c lw r12,(sp+12)
8012f90: 2b 8d 00 08 lw r13,(sp+8)
8012f94: 37 9c 00 10 addi sp,sp,16
8012f98: c3 a0 00 00 ret
08004ed4 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
8004ed4: 37 9c ff 9c addi sp,sp,-100
8004ed8: 5b 8b 00 50 sw (sp+80),r11
8004edc: 5b 8c 00 4c sw (sp+76),r12
8004ee0: 5b 8d 00 48 sw (sp+72),r13
8004ee4: 5b 8e 00 44 sw (sp+68),r14
8004ee8: 5b 8f 00 40 sw (sp+64),r15
8004eec: 5b 90 00 3c sw (sp+60),r16
8004ef0: 5b 91 00 38 sw (sp+56),r17
8004ef4: 5b 92 00 34 sw (sp+52),r18
8004ef8: 5b 93 00 30 sw (sp+48),r19
8004efc: 5b 94 00 2c sw (sp+44),r20
8004f00: 5b 95 00 28 sw (sp+40),r21
8004f04: 5b 96 00 24 sw (sp+36),r22
8004f08: 5b 97 00 20 sw (sp+32),r23
8004f0c: 5b 98 00 1c sw (sp+28),r24
8004f10: 5b 99 00 18 sw (sp+24),r25
8004f14: 5b 9b 00 14 sw (sp+20),fp
8004f18: 5b 9d 00 10 sw (sp+16),ra
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;
8004f1c: 78 0f 08 00 mvhi r15,0x800
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
8004f20: 20 63 00 ff andi r3,r3,0xff
8004f24: b8 20 68 00 mv r13,r1
8004f28: b8 40 98 00 mv r19,r2
uintptr_t const page_size = heap->page_size;
8004f2c: 28 35 00 10 lw r21,(r1+16)
uintptr_t const min_block_size = heap->min_block_size;
8004f30: 28 36 00 14 lw r22,(r1+20)
Heap_Block *const first_block = heap->first_block;
8004f34: 28 34 00 20 lw r20,(r1+32)
Heap_Block *const last_block = heap->last_block;
8004f38: 28 37 00 24 lw r23,(r1+36)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
8004f3c: 39 ef 4e 2c ori r15,r15,0x4e2c
8004f40: 44 60 00 03 be r3,r0,8004f4c <_Heap_Walk+0x78>
8004f44: 78 0f 08 00 mvhi r15,0x800
8004f48: 39 ef 4e 50 ori r15,r15,0x4e50
if ( !_System_state_Is_up( _System_state_Get() ) ) {
8004f4c: 78 03 08 01 mvhi r3,0x801
8004f50: 38 63 7a a8 ori r3,r3,0x7aa8
8004f54: 28 69 00 00 lw r9,(r3+0)
8004f58: 34 07 00 03 mvi r7,3
return true;
8004f5c: 34 03 00 01 mvi r3,1
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;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
8004f60: 45 27 00 15 be r9,r7,8004fb4 <_Heap_Walk+0xe0>
block = next_block;
} while ( block != first_block );
return true;
}
8004f64: b8 60 08 00 mv r1,r3
8004f68: 2b 9d 00 10 lw ra,(sp+16)
8004f6c: 2b 8b 00 50 lw r11,(sp+80)
8004f70: 2b 8c 00 4c lw r12,(sp+76)
8004f74: 2b 8d 00 48 lw r13,(sp+72)
8004f78: 2b 8e 00 44 lw r14,(sp+68)
8004f7c: 2b 8f 00 40 lw r15,(sp+64)
8004f80: 2b 90 00 3c lw r16,(sp+60)
8004f84: 2b 91 00 38 lw r17,(sp+56)
8004f88: 2b 92 00 34 lw r18,(sp+52)
8004f8c: 2b 93 00 30 lw r19,(sp+48)
8004f90: 2b 94 00 2c lw r20,(sp+44)
8004f94: 2b 95 00 28 lw r21,(sp+40)
8004f98: 2b 96 00 24 lw r22,(sp+36)
8004f9c: 2b 97 00 20 lw r23,(sp+32)
8004fa0: 2b 98 00 1c lw r24,(sp+28)
8004fa4: 2b 99 00 18 lw r25,(sp+24)
8004fa8: 2b 9b 00 14 lw fp,(sp+20)
8004fac: 37 9c 00 64 addi sp,sp,100
8004fb0: c3 a0 00 00 ret
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)(
8004fb4: 29 a2 00 08 lw r2,(r13+8)
8004fb8: 29 a1 00 0c lw r1,(r13+12)
8004fbc: 29 a6 00 18 lw r6,(r13+24)
8004fc0: 29 a7 00 1c lw r7,(r13+28)
8004fc4: 78 03 08 01 mvhi r3,0x801
8004fc8: 5b 82 00 08 sw (sp+8),r2
8004fcc: 5b 81 00 0c sw (sp+12),r1
8004fd0: 5b 97 00 04 sw (sp+4),r23
8004fd4: ba 60 08 00 mv r1,r19
8004fd8: 34 02 00 00 mvi r2,0
8004fdc: 38 63 49 24 ori r3,r3,0x4924
8004fe0: ba a0 20 00 mv r4,r21
8004fe4: ba c0 28 00 mv r5,r22
8004fe8: ba 80 40 00 mv r8,r20
8004fec: d9 e0 00 00 call r15
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
8004ff0: 46 a0 00 26 be r21,r0,8005088 <_Heap_Walk+0x1b4> <== NEVER TAKEN
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
8004ff4: 22 ab 00 07 andi r11,r21,0x7
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
8004ff8: 5d 60 00 2b bne r11,r0,80050a4 <_Heap_Walk+0x1d0> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8004ffc: ba c0 08 00 mv r1,r22
8005000: ba a0 10 00 mv r2,r21
8005004: fb ff ee 87 calli 8000a20 <__umodsi3>
8005008: b8 20 60 00 mv r12,r1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
800500c: 5c 2b 00 2e bne r1,r11,80050c4 <_Heap_Walk+0x1f0>
8005010: 36 81 00 08 addi r1,r20,8
8005014: ba a0 10 00 mv r2,r21
8005018: fb ff ee 82 calli 8000a20 <__umodsi3>
800501c: b8 20 18 00 mv r3,r1
);
return false;
}
if (
8005020: 5c 2c 00 31 bne r1,r12,80050e4 <_Heap_Walk+0x210>
block = next_block;
} while ( block != first_block );
return true;
}
8005024: 2a 8c 00 04 lw r12,(r20+4)
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;
8005028: 21 81 00 01 andi r1,r12,0x1
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
800502c: 44 23 00 fe be r1,r3,8005424 <_Heap_Walk+0x550>
- 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;
8005030: 2a e2 00 04 lw r2,(r23+4)
8005034: 34 01 ff fe mvi r1,-2
8005038: a0 22 08 00 and r1,r1,r2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800503c: b6 e1 08 00 add r1,r23,r1
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;
8005040: 28 22 00 04 lw r2,(r1+4)
8005044: 20 42 00 01 andi r2,r2,0x1
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
8005048: 44 43 00 09 be r2,r3,800506c <_Heap_Walk+0x198>
);
return false;
}
if (
800504c: 46 81 00 2e be r20,r1,8005104 <_Heap_Walk+0x230>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
8005050: 78 03 08 01 mvhi r3,0x801
8005054: 38 63 4a 8c ori r3,r3,0x4a8c
8005058: ba 60 08 00 mv r1,r19
800505c: 34 02 00 01 mvi r2,1
8005060: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005064: 34 03 00 00 mvi r3,0
8005068: e3 ff ff bf bi 8004f64 <_Heap_Walk+0x90>
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
800506c: 78 03 08 01 mvhi r3,0x801
8005070: 38 63 4a 74 ori r3,r3,0x4a74
8005074: ba 60 08 00 mv r1,r19
8005078: 34 02 00 01 mvi r2,1
800507c: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005080: 34 03 00 00 mvi r3,0
8005084: e3 ff ff b8 bi 8004f64 <_Heap_Walk+0x90>
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
8005088: 78 03 08 01 mvhi r3,0x801
800508c: 38 63 49 b8 ori r3,r3,0x49b8
8005090: ba 60 08 00 mv r1,r19
8005094: 34 02 00 01 mvi r2,1
8005098: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
800509c: 34 03 00 00 mvi r3,0
80050a0: e3 ff ff b1 bi 8004f64 <_Heap_Walk+0x90>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
80050a4: 78 03 08 01 mvhi r3,0x801
80050a8: 38 63 49 cc ori r3,r3,0x49cc
80050ac: ba 60 08 00 mv r1,r19
80050b0: 34 02 00 01 mvi r2,1
80050b4: ba a0 20 00 mv r4,r21
80050b8: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80050bc: 34 03 00 00 mvi r3,0
80050c0: e3 ff ff a9 bi 8004f64 <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
80050c4: 78 03 08 01 mvhi r3,0x801
80050c8: 38 63 49 ec ori r3,r3,0x49ec
80050cc: ba 60 08 00 mv r1,r19
80050d0: 34 02 00 01 mvi r2,1
80050d4: ba c0 20 00 mv r4,r22
80050d8: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80050dc: 34 03 00 00 mvi r3,0
80050e0: e3 ff ff a1 bi 8004f64 <_Heap_Walk+0x90>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
80050e4: 78 03 08 01 mvhi r3,0x801
80050e8: 38 63 4a 10 ori r3,r3,0x4a10
80050ec: ba 60 08 00 mv r1,r19
80050f0: 34 02 00 01 mvi r2,1
80050f4: ba 80 20 00 mv r4,r20
80050f8: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80050fc: 34 03 00 00 mvi r3,0
8005100: e3 ff ff 99 bi 8004f64 <_Heap_Walk+0x90>
block = next_block;
} while ( block != first_block );
return true;
}
8005104: 29 b0 00 08 lw r16,(r13+8)
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
8005108: 29 b2 00 10 lw r18,(r13+16)
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 ) {
800510c: 45 b0 00 2f be r13,r16,80051c8 <_Heap_Walk+0x2f4>
block = next_block;
} while ( block != first_block );
return true;
}
8005110: 29 ae 00 20 lw r14,(r13+32)
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;
8005114: ba 00 58 00 mv r11,r16
8005118: 55 d0 00 dc bgu r14,r16,8005488 <_Heap_Walk+0x5b4> <== NEVER TAKEN
800511c: 29 b8 00 24 lw r24,(r13+36)
8005120: 56 18 00 da bgu r16,r24,8005488 <_Heap_Walk+0x5b4> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8005124: 36 01 00 08 addi r1,r16,8
8005128: ba 40 10 00 mv r2,r18
800512c: fb ff ee 3d calli 8000a20 <__umodsi3>
);
return false;
}
if (
8005130: 5c 20 00 de bne r1,r0,80054a8 <_Heap_Walk+0x5d4> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8005134: 2a 03 00 04 lw r3,(r16+4)
8005138: 34 02 ff fe mvi r2,-2
800513c: 34 11 ff fe mvi r17,-2
8005140: a0 43 10 00 and r2,r2,r3
block = next_block;
} while ( block != first_block );
return true;
}
8005144: b6 02 10 00 add r2,r16,r2
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;
8005148: 28 42 00 04 lw r2,(r2+4)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
800514c: b9 a0 18 00 mv r3,r13
8005150: 20 42 00 01 andi r2,r2,0x1
8005154: 44 41 00 12 be r2,r1,800519c <_Heap_Walk+0x2c8> <== ALWAYS TAKEN
8005158: e0 00 00 dc bi 80054c8 <_Heap_Walk+0x5f4> <== NOT EXECUTED
return false;
}
prev_block = free_block;
free_block = free_block->next;
800515c: 2a 0b 00 08 lw r11,(r16+8)
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 ) {
8005160: 45 ab 00 1b be r13,r11,80051cc <_Heap_Walk+0x2f8>
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;
8005164: 55 cb 00 c9 bgu r14,r11,8005488 <_Heap_Walk+0x5b4>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8005168: 35 61 00 08 addi r1,r11,8
800516c: ba 40 10 00 mv r2,r18
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;
8005170: 55 78 00 c6 bgu r11,r24,8005488 <_Heap_Walk+0x5b4> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8005174: fb ff ee 2b calli 8000a20 <__umodsi3>
);
return false;
}
if (
8005178: 5c 20 00 cc bne r1,r0,80054a8 <_Heap_Walk+0x5d4>
- 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;
800517c: 29 64 00 04 lw r4,(r11+4)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
8005180: ba 00 18 00 mv r3,r16
8005184: b9 60 80 00 mv r16,r11
8005188: a2 24 20 00 and r4,r17,r4
block = next_block;
} while ( block != first_block );
return true;
}
800518c: b4 8b 20 00 add r4,r4,r11
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;
8005190: 28 84 00 04 lw r4,(r4+4)
8005194: 20 84 00 01 andi r4,r4,0x1
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
8005198: 5c 81 00 cc bne r4,r1,80054c8 <_Heap_Walk+0x5f4>
);
return false;
}
if ( free_block->prev != prev_block ) {
800519c: 2a 07 00 0c lw r7,(r16+12)
80051a0: 44 e3 ff ef be r7,r3,800515c <_Heap_Walk+0x288>
(*printer)(
80051a4: 78 03 08 01 mvhi r3,0x801
80051a8: 38 63 4b 28 ori r3,r3,0x4b28
80051ac: ba 60 08 00 mv r1,r19
80051b0: 34 02 00 01 mvi r2,1
80051b4: ba 00 20 00 mv r4,r16
80051b8: b8 e0 28 00 mv r5,r7
80051bc: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80051c0: 34 03 00 00 mvi r3,0
80051c4: e3 ff ff 68 bi 8004f64 <_Heap_Walk+0x90>
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 ) {
80051c8: 29 ae 00 20 lw r14,(r13+32)
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)(
80051cc: 78 01 08 01 mvhi r1,0x801
80051d0: 5b 81 00 54 sw (sp+84),r1
80051d4: 78 01 08 01 mvhi r1,0x801
80051d8: 5b 81 00 58 sw (sp+88),r1
80051dc: 78 01 08 01 mvhi r1,0x801
80051e0: 5b 81 00 5c sw (sp+92),r1
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
80051e4: 78 01 08 01 mvhi r1,0x801
80051e8: 5b 81 00 60 sw (sp+96),r1
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
80051ec: 78 01 08 01 mvhi r1,0x801
80051f0: 5b 81 00 64 sw (sp+100),r1
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)(
80051f4: 2b 81 00 54 lw r1,(sp+84)
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
80051f8: 78 1b 08 01 mvhi fp,0x801
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
80051fc: 78 19 08 01 mvhi r25,0x801
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)(
8005200: 38 21 48 ec ori r1,r1,0x48ec
8005204: 5b 81 00 54 sw (sp+84),r1
8005208: 2b 81 00 58 lw r1,(sp+88)
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
800520c: 78 18 08 01 mvhi r24,0x801
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
8005210: ba 80 88 00 mv r17,r20
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)(
8005214: 38 21 49 08 ori r1,r1,0x4908
8005218: 5b 81 00 58 sw (sp+88),r1
800521c: 2b 81 00 5c lw r1,(sp+92)
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
8005220: 3b 7b 4c d8 ori fp,fp,0x4cd8
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
8005224: 3b 39 4c c0 ori r25,r25,0x4cc0
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)(
8005228: 38 21 4c 1c ori r1,r1,0x4c1c
800522c: 5b 81 00 5c sw (sp+92),r1
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
8005230: 2b 81 00 60 lw r1,(sp+96)
8005234: 3b 18 4c 8c ori r24,r24,0x4c8c
8005238: 38 21 49 18 ori r1,r1,0x4918
800523c: 5b 81 00 60 sw (sp+96),r1
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
8005240: 2b 81 00 64 lw r1,(sp+100)
8005244: 38 21 48 fc ori r1,r1,0x48fc
8005248: 5b 81 00 64 sw (sp+100),r1
- 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;
800524c: 34 01 ff fe mvi r1,-2
8005250: a1 81 90 00 and r18,r12,r1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8005254: b6 51 80 00 add r16,r18,r17
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;
8005258: 55 d0 00 7a bgu r14,r16,8005440 <_Heap_Walk+0x56c> <== NEVER TAKEN
800525c: 29 a4 00 24 lw r4,(r13+36)
8005260: 56 04 00 78 bgu r16,r4,8005440 <_Heap_Walk+0x56c>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8005264: ba 40 08 00 mv r1,r18
8005268: ba a0 10 00 mv r2,r21
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;
800526c: fe 37 58 00 cmpne r11,r17,r23
8005270: fb ff ed ec calli 8000a20 <__umodsi3>
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
8005274: 44 20 00 02 be r1,r0,800527c <_Heap_Walk+0x3a8>
8005278: 5d 60 00 15 bne r11,r0,80052cc <_Heap_Walk+0x3f8>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
800527c: 52 56 00 02 bgeu r18,r22,8005284 <_Heap_Walk+0x3b0>
8005280: 5d 60 00 1c bne r11,r0,80052f0 <_Heap_Walk+0x41c> <== ALWAYS TAKEN
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
8005284: 56 11 00 02 bgu r16,r17,800528c <_Heap_Walk+0x3b8>
8005288: 5d 60 00 77 bne r11,r0,8005464 <_Heap_Walk+0x590>
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;
800528c: 2a 06 00 04 lw r6,(r16+4)
8005290: 21 8c 00 01 andi r12,r12,0x1
8005294: 20 c6 00 01 andi r6,r6,0x1
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
8005298: 44 c0 00 28 be r6,r0,8005338 <_Heap_Walk+0x464>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
800529c: 45 80 00 1f be r12,r0,8005318 <_Heap_Walk+0x444>
(*printer)(
80052a0: ba 60 08 00 mv r1,r19
80052a4: 34 02 00 00 mvi r2,0
80052a8: bb 20 18 00 mv r3,r25
80052ac: ba 20 20 00 mv r4,r17
80052b0: ba 40 28 00 mv r5,r18
80052b4: d9 e0 00 00 call r15
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
80052b8: 46 90 00 43 be r20,r16,80053c4 <_Heap_Walk+0x4f0>
80052bc: 2a 0c 00 04 lw r12,(r16+4)
80052c0: 29 ae 00 20 lw r14,(r13+32)
80052c4: ba 00 88 00 mv r17,r16
80052c8: e3 ff ff e1 bi 800524c <_Heap_Walk+0x378>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
80052cc: 78 03 08 01 mvhi r3,0x801
80052d0: 38 63 4b 8c ori r3,r3,0x4b8c
80052d4: ba 60 08 00 mv r1,r19
80052d8: 34 02 00 01 mvi r2,1
80052dc: ba 20 20 00 mv r4,r17
80052e0: ba 40 28 00 mv r5,r18
80052e4: d9 e0 00 00 call r15
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
80052e8: 34 03 00 00 mvi r3,0
80052ec: e3 ff ff 1e bi 8004f64 <_Heap_Walk+0x90>
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
80052f0: 78 03 08 01 mvhi r3,0x801
80052f4: 38 63 4b bc ori r3,r3,0x4bbc
80052f8: ba 60 08 00 mv r1,r19
80052fc: 34 02 00 01 mvi r2,1
8005300: ba 20 20 00 mv r4,r17
8005304: ba 40 28 00 mv r5,r18
8005308: ba c0 30 00 mv r6,r22
800530c: d9 e0 00 00 call r15
block,
block_size,
min_block_size
);
return false;
8005310: 34 03 00 00 mvi r3,0
8005314: e3 ff ff 14 bi 8004f64 <_Heap_Walk+0x90>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
8005318: 2a 26 00 00 lw r6,(r17+0)
800531c: ba 20 20 00 mv r4,r17
8005320: ba 60 08 00 mv r1,r19
8005324: 34 02 00 00 mvi r2,0
8005328: bb 60 18 00 mv r3,fp
800532c: ba 40 28 00 mv r5,r18
8005330: d9 e0 00 00 call r15
8005334: e3 ff ff e1 bi 80052b8 <_Heap_Walk+0x3e4>
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 ?
8005338: 2a 26 00 0c lw r6,(r17+12)
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)(
800533c: 29 a4 00 08 lw r4,(r13+8)
block = next_block;
} while ( block != first_block );
return true;
}
8005340: 29 a5 00 0c lw r5,(r13+12)
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)(
8005344: 2b 87 00 54 lw r7,(sp+84)
8005348: 44 86 00 03 be r4,r6,8005354 <_Heap_Walk+0x480>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
800534c: bb 00 38 00 mv r7,r24
8005350: 45 a6 00 29 be r13,r6,80053f4 <_Heap_Walk+0x520>
block->next,
block->next == last_free_block ?
8005354: 2a 28 00 08 lw r8,(r17+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)(
8005358: 2b 84 00 58 lw r4,(sp+88)
800535c: 44 a8 00 03 be r5,r8,8005368 <_Heap_Walk+0x494>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
8005360: bb 00 20 00 mv r4,r24
8005364: 45 a8 00 26 be r13,r8,80053fc <_Heap_Walk+0x528>
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)(
8005368: 2b 83 00 5c lw r3,(sp+92)
800536c: 5b 84 00 04 sw (sp+4),r4
8005370: ba 60 08 00 mv r1,r19
8005374: 34 02 00 00 mvi r2,0
8005378: ba 20 20 00 mv r4,r17
800537c: ba 40 28 00 mv r5,r18
8005380: d9 e0 00 00 call r15
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
8005384: 2a 06 00 00 lw r6,(r16+0)
8005388: 5e 46 00 11 bne r18,r6,80053cc <_Heap_Walk+0x4f8>
);
return false;
}
if ( !prev_used ) {
800538c: 45 80 00 1e be r12,r0,8005404 <_Heap_Walk+0x530>
block = next_block;
} while ( block != first_block );
return true;
}
8005390: 29 a5 00 08 lw r5,(r13+8)
)
{
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 ) {
8005394: 45 a5 00 04 be r13,r5,80053a4 <_Heap_Walk+0x4d0> <== NEVER TAKEN
if ( free_block == block ) {
8005398: 46 25 ff c8 be r17,r5,80052b8 <_Heap_Walk+0x3e4>
return true;
}
free_block = free_block->next;
800539c: 28 a5 00 08 lw r5,(r5+8)
)
{
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 ) {
80053a0: 5d a5 ff fe bne r13,r5,8005398 <_Heap_Walk+0x4c4>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
80053a4: 78 03 08 01 mvhi r3,0x801
80053a8: 38 63 4d 00 ori r3,r3,0x4d00
80053ac: ba 60 08 00 mv r1,r19
80053b0: 34 02 00 01 mvi r2,1
80053b4: ba 20 20 00 mv r4,r17
80053b8: d9 e0 00 00 call r15
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
80053bc: 34 03 00 00 mvi r3,0
80053c0: e3 ff fe e9 bi 8004f64 <_Heap_Walk+0x90>
}
block = next_block;
} while ( block != first_block );
return true;
80053c4: 34 03 00 01 mvi r3,1
80053c8: e3 ff fe e7 bi 8004f64 <_Heap_Walk+0x90>
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
80053cc: 78 03 08 01 mvhi r3,0x801
80053d0: 38 63 4c 54 ori r3,r3,0x4c54
80053d4: ba 60 08 00 mv r1,r19
80053d8: 34 02 00 01 mvi r2,1
80053dc: ba 20 20 00 mv r4,r17
80053e0: ba 40 28 00 mv r5,r18
80053e4: ba 00 38 00 mv r7,r16
80053e8: d9 e0 00 00 call r15
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
80053ec: 34 03 00 00 mvi r3,0
80053f0: e3 ff fe dd bi 8004f64 <_Heap_Walk+0x90>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
80053f4: 2b 87 00 64 lw r7,(sp+100)
80053f8: e3 ff ff d7 bi 8005354 <_Heap_Walk+0x480>
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
80053fc: 2b 84 00 60 lw r4,(sp+96)
8005400: e3 ff ff da bi 8005368 <_Heap_Walk+0x494>
return false;
}
if ( !prev_used ) {
(*printer)(
8005404: 78 03 08 01 mvhi r3,0x801
8005408: 38 63 4c 90 ori r3,r3,0x4c90
800540c: ba 60 08 00 mv r1,r19
8005410: 34 02 00 01 mvi r2,1
8005414: ba 20 20 00 mv r4,r17
8005418: d9 e0 00 00 call r15
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
800541c: 34 03 00 00 mvi r3,0
8005420: e3 ff fe d1 bi 8004f64 <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
8005424: 78 03 08 01 mvhi r3,0x801
8005428: 38 63 4a 44 ori r3,r3,0x4a44
800542c: ba 60 08 00 mv r1,r19
8005430: 34 02 00 01 mvi r2,1
8005434: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005438: 34 03 00 00 mvi r3,0
800543c: e3 ff fe ca bi 8004f64 <_Heap_Walk+0x90>
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
8005440: 78 03 08 01 mvhi r3,0x801
8005444: 38 63 4b 5c ori r3,r3,0x4b5c
8005448: ba 60 08 00 mv r1,r19
800544c: 34 02 00 01 mvi r2,1
8005450: ba 20 20 00 mv r4,r17
8005454: ba 00 28 00 mv r5,r16
8005458: d9 e0 00 00 call r15
"block 0x%08x: next block 0x%08x not in heap\n",
block,
next_block
);
return false;
800545c: 34 03 00 00 mvi r3,0
8005460: e3 ff fe c1 bi 8004f64 <_Heap_Walk+0x90>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
8005464: 78 03 08 01 mvhi r3,0x801
8005468: 38 63 4b e8 ori r3,r3,0x4be8
800546c: ba 60 08 00 mv r1,r19
8005470: 34 02 00 01 mvi r2,1
8005474: ba 20 20 00 mv r4,r17
8005478: ba 00 28 00 mv r5,r16
800547c: d9 e0 00 00 call r15
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
8005480: 34 03 00 00 mvi r3,0
8005484: e3 ff fe b8 bi 8004f64 <_Heap_Walk+0x90>
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
8005488: 78 03 08 01 mvhi r3,0x801
800548c: 38 63 4a bc ori r3,r3,0x4abc
8005490: ba 60 08 00 mv r1,r19
8005494: 34 02 00 01 mvi r2,1
8005498: b9 60 20 00 mv r4,r11
800549c: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80054a0: 34 03 00 00 mvi r3,0
80054a4: e3 ff fe b0 bi 8004f64 <_Heap_Walk+0x90>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
80054a8: 78 03 08 01 mvhi r3,0x801
80054ac: 38 63 4a dc ori r3,r3,0x4adc
80054b0: ba 60 08 00 mv r1,r19
80054b4: 34 02 00 01 mvi r2,1
80054b8: b9 60 20 00 mv r4,r11
80054bc: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80054c0: 34 03 00 00 mvi r3,0
80054c4: e3 ff fe a8 bi 8004f64 <_Heap_Walk+0x90>
return false;
}
if ( _Heap_Is_used( free_block ) ) {
(*printer)(
80054c8: 78 03 08 01 mvhi r3,0x801
80054cc: 38 63 4b 0c ori r3,r3,0x4b0c
80054d0: ba 60 08 00 mv r1,r19
80054d4: 34 02 00 01 mvi r2,1
80054d8: b9 60 20 00 mv r4,r11
80054dc: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80054e0: 34 03 00 00 mvi r3,0
80054e4: e3 ff fe a0 bi 8004f64 <_Heap_Walk+0x90>
080035b0 <_IO_Initialize_all_drivers>:
*
* Output Parameters: NONE
*/
void _IO_Initialize_all_drivers( void )
{
80035b0: 37 9c ff f4 addi sp,sp,-12
80035b4: 5b 8b 00 0c sw (sp+12),r11
80035b8: 5b 8c 00 08 sw (sp+8),r12
80035bc: 5b 9d 00 04 sw (sp+4),ra
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
80035c0: 78 0c 08 01 mvhi r12,0x801
80035c4: 39 8c 51 e0 ori r12,r12,0x51e0
80035c8: 29 81 00 00 lw r1,(r12+0)
80035cc: 44 20 00 09 be r1,r0,80035f0 <_IO_Initialize_all_drivers+0x40><== NEVER TAKEN
80035d0: 34 0b 00 00 mvi r11,0
(void) rtems_io_initialize( major, 0, NULL );
80035d4: b9 60 08 00 mv r1,r11
80035d8: 34 02 00 00 mvi r2,0
80035dc: 34 03 00 00 mvi r3,0
80035e0: f8 00 1a 38 calli 8009ec0 <rtems_io_initialize>
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
80035e4: 29 81 00 00 lw r1,(r12+0)
80035e8: 35 6b 00 01 addi r11,r11,1
80035ec: 54 2b ff fa bgu r1,r11,80035d4 <_IO_Initialize_all_drivers+0x24>
(void) rtems_io_initialize( major, 0, NULL );
}
80035f0: 2b 9d 00 04 lw ra,(sp+4)
80035f4: 2b 8b 00 0c lw r11,(sp+12)
80035f8: 2b 8c 00 08 lw r12,(sp+8)
80035fc: 37 9c 00 0c addi sp,sp,12
8003600: c3 a0 00 00 ret
08003490 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
8003490: 37 9c ff e8 addi sp,sp,-24
8003494: 5b 8b 00 18 sw (sp+24),r11
8003498: 5b 8c 00 14 sw (sp+20),r12
800349c: 5b 8d 00 10 sw (sp+16),r13
80034a0: 5b 8e 00 0c sw (sp+12),r14
80034a4: 5b 8f 00 08 sw (sp+8),r15
80034a8: 5b 9d 00 04 sw (sp+4),ra
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
80034ac: 78 01 08 01 mvhi r1,0x801
80034b0: 38 21 40 f4 ori r1,r1,0x40f4
drivers_in_table = Configuration.number_of_device_drivers;
80034b4: 28 2b 00 30 lw r11,(r1+48)
number_of_drivers = Configuration.maximum_drivers;
80034b8: 28 2e 00 2c lw r14,(r1+44)
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
80034bc: 28 2d 00 34 lw r13,(r1+52)
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
80034c0: 51 6e 00 2e bgeu r11,r14,8003578 <_IO_Manager_initialization+0xe8>
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
80034c4: b5 ce 60 00 add r12,r14,r14
80034c8: b5 8e 60 00 add r12,r12,r14
80034cc: b5 8c 60 00 add r12,r12,r12
80034d0: b5 8c 60 00 add r12,r12,r12
80034d4: b5 8c 60 00 add r12,r12,r12
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
80034d8: b9 80 08 00 mv r1,r12
80034dc: f8 00 0f 00 calli 80070dc <_Workspace_Allocate_or_fatal_error>
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
80034e0: 78 04 08 01 mvhi r4,0x801
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
80034e4: 78 0f 08 01 mvhi r15,0x801
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
80034e8: 38 84 51 e0 ori r4,r4,0x51e0
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
80034ec: 39 ef 51 e4 ori r15,r15,0x51e4
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
80034f0: 34 02 00 00 mvi r2,0
80034f4: b9 80 18 00 mv r3,r12
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
80034f8: 58 8e 00 00 sw (r4+0),r14
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
80034fc: 59 e1 00 00 sw (r15+0),r1
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
8003500: f8 00 29 16 calli 800d958 <memset>
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
8003504: 45 60 00 15 be r11,r0,8003558 <_IO_Manager_initialization+0xc8><== NEVER TAKEN
8003508: 29 e5 00 00 lw r5,(r15+0)
800350c: 34 03 00 00 mvi r3,0
8003510: 34 04 00 00 mvi r4,0
* registration. The driver table is now allocated in the
* workspace.
*
*/
void _IO_Manager_initialization(void)
8003514: b5 a3 08 00 add r1,r13,r3
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
8003518: 28 26 00 00 lw r6,(r1+0)
* registration. The driver table is now allocated in the
* workspace.
*
*/
void _IO_Manager_initialization(void)
800351c: b4 a3 10 00 add r2,r5,r3
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
8003520: 34 84 00 01 addi r4,r4,1
_IO_Driver_address_table[index] = driver_table[index];
8003524: 58 46 00 00 sw (r2+0),r6
8003528: 28 26 00 04 lw r6,(r1+4)
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
800352c: 34 63 00 18 addi r3,r3,24
_IO_Driver_address_table[index] = driver_table[index];
8003530: 58 46 00 04 sw (r2+4),r6
8003534: 28 26 00 08 lw r6,(r1+8)
8003538: 58 46 00 08 sw (r2+8),r6
800353c: 28 26 00 0c lw r6,(r1+12)
8003540: 58 46 00 0c sw (r2+12),r6
8003544: 28 26 00 10 lw r6,(r1+16)
8003548: 58 46 00 10 sw (r2+16),r6
800354c: 28 21 00 14 lw r1,(r1+20)
8003550: 58 41 00 14 sw (r2+20),r1
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
8003554: 55 64 ff f0 bgu r11,r4,8003514 <_IO_Manager_initialization+0x84>
_IO_Driver_address_table[index] = driver_table[index];
}
8003558: 2b 9d 00 04 lw ra,(sp+4)
800355c: 2b 8b 00 18 lw r11,(sp+24)
8003560: 2b 8c 00 14 lw r12,(sp+20)
8003564: 2b 8d 00 10 lw r13,(sp+16)
8003568: 2b 8e 00 0c lw r14,(sp+12)
800356c: 2b 8f 00 08 lw r15,(sp+8)
8003570: 37 9c 00 18 addi sp,sp,24
8003574: c3 a0 00 00 ret
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
8003578: 78 02 08 01 mvhi r2,0x801
_IO_Number_of_drivers = number_of_drivers;
800357c: 78 01 08 01 mvhi r1,0x801
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
8003580: 38 42 51 e4 ori r2,r2,0x51e4
_IO_Number_of_drivers = number_of_drivers;
8003584: 38 21 51 e0 ori r1,r1,0x51e0
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
8003588: 58 4d 00 00 sw (r2+0),r13
_IO_Number_of_drivers = number_of_drivers;
800358c: 58 2b 00 00 sw (r1+0),r11
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
8003590: 2b 9d 00 04 lw ra,(sp+4)
8003594: 2b 8b 00 18 lw r11,(sp+24)
8003598: 2b 8c 00 14 lw r12,(sp+20)
800359c: 2b 8d 00 10 lw r13,(sp+16)
80035a0: 2b 8e 00 0c lw r14,(sp+12)
80035a4: 2b 8f 00 08 lw r15,(sp+8)
80035a8: 37 9c 00 18 addi sp,sp,24
80035ac: c3 a0 00 00 ret
080044f0 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
80044f0: 37 9c ff ec addi sp,sp,-20
80044f4: 5b 8b 00 14 sw (sp+20),r11
80044f8: 5b 8c 00 10 sw (sp+16),r12
80044fc: 5b 8d 00 0c sw (sp+12),r13
8004500: 5b 8e 00 08 sw (sp+8),r14
8004504: 5b 9d 00 04 sw (sp+4),ra
8004508: b8 20 58 00 mv r11,r1
* 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 )
800450c: 28 21 00 18 lw r1,(r1+24)
return NULL;
8004510: 34 0c 00 00 mvi r12,0
* 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 )
8004514: 5c 20 00 09 bne r1,r0,8004538 <_Objects_Allocate+0x48> <== ALWAYS TAKEN
);
}
#endif
return the_object;
}
8004518: b9 80 08 00 mv r1,r12
800451c: 2b 9d 00 04 lw ra,(sp+4)
8004520: 2b 8b 00 14 lw r11,(sp+20)
8004524: 2b 8c 00 10 lw r12,(sp+16)
8004528: 2b 8d 00 0c lw r13,(sp+12)
800452c: 2b 8e 00 08 lw r14,(sp+8)
8004530: 37 9c 00 14 addi sp,sp,20
8004534: c3 a0 00 00 ret
/*
* 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 );
8004538: 35 6d 00 20 addi r13,r11,32
800453c: b9 a0 08 00 mv r1,r13
8004540: fb ff fc fb calli 800392c <_Chain_Get>
8004544: b8 20 60 00 mv r12,r1
if ( information->auto_extend ) {
8004548: 41 61 00 12 lbu r1,(r11+18)
/*
* 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 );
800454c: b9 80 70 00 mv r14,r12
if ( information->auto_extend ) {
8004550: 44 20 ff f2 be r1,r0,8004518 <_Objects_Allocate+0x28>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
8004554: 45 80 00 18 be r12,r0,80045b4 <_Objects_Allocate+0xc4>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
8004558: 2d 83 00 0a lhu r3,(r12+10)
800455c: 2d 61 00 0a lhu r1,(r11+10)
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
8004560: 2d 62 00 14 lhu r2,(r11+20)
8004564: c8 61 08 00 sub r1,r3,r1
8004568: f8 00 37 cd calli 801249c <__udivsi3>
information->inactive_per_block[ block ]--;
800456c: 29 62 00 30 lw r2,(r11+48)
8004570: b4 21 08 00 add r1,r1,r1
8004574: b4 21 08 00 add r1,r1,r1
8004578: b4 41 08 00 add r1,r2,r1
800457c: 28 22 00 00 lw r2,(r1+0)
information->inactive--;
8004580: 2d 63 00 2c lhu r3,(r11+44)
block = (uint32_t) _Objects_Get_index( the_object->id ) -
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
8004584: 34 42 ff ff addi r2,r2,-1
8004588: 58 22 00 00 sw (r1+0),r2
information->inactive--;
800458c: 34 61 ff ff addi r1,r3,-1
8004590: 0d 61 00 2c sh (r11+44),r1
);
}
#endif
return the_object;
}
8004594: b9 80 08 00 mv r1,r12
8004598: 2b 9d 00 04 lw ra,(sp+4)
800459c: 2b 8b 00 14 lw r11,(sp+20)
80045a0: 2b 8c 00 10 lw r12,(sp+16)
80045a4: 2b 8d 00 0c lw r13,(sp+12)
80045a8: 2b 8e 00 08 lw r14,(sp+8)
80045ac: 37 9c 00 14 addi sp,sp,20
80045b0: c3 a0 00 00 ret
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
_Objects_Extend_information( information );
80045b4: b9 60 08 00 mv r1,r11
80045b8: f8 00 00 06 calli 80045d0 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
80045bc: b9 a0 08 00 mv r1,r13
80045c0: fb ff fc db calli 800392c <_Chain_Get>
80045c4: b8 20 60 00 mv r12,r1
}
if ( the_object ) {
80045c8: 44 2e ff d4 be r1,r14,8004518 <_Objects_Allocate+0x28>
80045cc: e3 ff ff e3 bi 8004558 <_Objects_Allocate+0x68>
080045d0 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
80045d0: 37 9c ff c8 addi sp,sp,-56
80045d4: 5b 8b 00 2c sw (sp+44),r11
80045d8: 5b 8c 00 28 sw (sp+40),r12
80045dc: 5b 8d 00 24 sw (sp+36),r13
80045e0: 5b 8e 00 20 sw (sp+32),r14
80045e4: 5b 8f 00 1c sw (sp+28),r15
80045e8: 5b 90 00 18 sw (sp+24),r16
80045ec: 5b 91 00 14 sw (sp+20),r17
80045f0: 5b 92 00 10 sw (sp+16),r18
80045f4: 5b 93 00 0c sw (sp+12),r19
80045f8: 5b 94 00 08 sw (sp+8),r20
80045fc: 5b 9d 00 04 sw (sp+4),ra
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
8004600: 28 2c 00 34 lw r12,(r1+52)
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
8004604: b8 20 58 00 mv r11,r1
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
8004608: 2c 30 00 0a lhu r16,(r1+10)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
800460c: 45 80 00 a9 be r12,r0,80048b0 <_Objects_Extend_information+0x2e0>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
8004610: 2c 2f 00 14 lhu r15,(r1+20)
8004614: 2c 31 00 10 lhu r17,(r1+16)
8004618: b9 e0 10 00 mv r2,r15
800461c: ba 20 08 00 mv r1,r17
8004620: f8 00 37 9f calli 801249c <__udivsi3>
8004624: 20 2e ff ff andi r14,r1,0xffff
for ( ; block < block_count; block++ ) {
8004628: 45 c0 00 a8 be r14,r0,80048c8 <_Objects_Extend_information+0x2f8><== NEVER TAKEN
if ( information->object_blocks[ block ] == NULL ) {
800462c: 29 81 00 00 lw r1,(r12+0)
8004630: 44 20 00 ab be r1,r0,80048dc <_Objects_Extend_information+0x30c><== NEVER TAKEN
8004634: b9 80 18 00 mv r3,r12
8004638: b9 e0 08 00 mv r1,r15
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
800463c: ba 00 68 00 mv r13,r16
index_base = minimum_index;
block = 0;
8004640: 34 0c 00 00 mvi r12,0
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
8004644: 35 8c 00 01 addi r12,r12,1
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
break;
} else
index_base += information->allocation_size;
8004648: b5 af 68 00 add r13,r13,r15
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
800464c: 55 cc 00 80 bgu r14,r12,800484c <_Objects_Extend_information+0x27c>
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
8004650: 34 12 00 01 mvi r18,1
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
8004654: b6 21 88 00 add r17,r17,r1
/*
* We need to limit the number of objects to the maximum number
* representable in the index portion of the object Id. In the
* case of 16-bit Ids, this is only 256 object instances.
*/
if ( maximum > OBJECTS_ID_FINAL_INDEX ) {
8004658: 38 02 ff ff mvu r2,0xffff
800465c: 56 22 00 6f bgu r17,r2,8004818 <_Objects_Extend_information+0x248>
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
8004660: 29 62 00 18 lw r2,(r11+24)
8004664: f8 00 37 29 calli 8012308 <__mulsi3>
if ( information->auto_extend ) {
8004668: 41 62 00 12 lbu r2,(r11+18)
800466c: 44 40 00 7d be r2,r0,8004860 <_Objects_Extend_information+0x290>
new_object_block = _Workspace_Allocate( block_size );
8004670: f8 00 0a 87 calli 800708c <_Workspace_Allocate>
8004674: b8 20 78 00 mv r15,r1
if ( !new_object_block )
8004678: 44 20 00 68 be r1,r0,8004818 <_Objects_Extend_information+0x248>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
800467c: 46 40 00 40 be r18,r0,800477c <_Objects_Extend_information+0x1ac>
*/
/*
* Up the block count and maximum
*/
block_count++;
8004680: 35 c1 00 01 addi r1,r14,1
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
8004684: b4 21 98 00 add r19,r1,r1
8004688: b6 61 08 00 add r1,r19,r1
((maximum + minimum_index) * sizeof(Objects_Control *));
800468c: b6 21 08 00 add r1,r17,r1
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
8004690: b4 30 08 00 add r1,r1,r16
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
8004694: b4 21 08 00 add r1,r1,r1
8004698: b4 21 08 00 add r1,r1,r1
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
800469c: f8 00 0a 7c calli 800708c <_Workspace_Allocate>
80046a0: b8 20 90 00 mv r18,r1
if ( !object_blocks ) {
80046a4: 44 20 00 93 be r1,r0,80048f0 <_Objects_Extend_information+0x320>
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
80046a8: 2d 62 00 10 lhu r2,(r11+16)
}
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
80046ac: b6 73 a0 00 add r20,r19,r19
80046b0: b4 34 98 00 add r19,r1,r20
80046b4: b6 74 a0 00 add r20,r19,r20
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
80046b8: 54 50 00 6d bgu r2,r16,800486c <_Objects_Extend_information+0x29c>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
80046bc: ba 80 20 00 mv r4,r20
80046c0: 34 03 00 00 mvi r3,0
80046c4: 46 00 00 05 be r16,r0,80046d8 <_Objects_Extend_information+0x108><== NEVER TAKEN
local_table[ index ] = NULL;
80046c8: 58 80 00 00 sw (r4+0),r0
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
80046cc: 34 63 00 01 addi r3,r3,1
80046d0: 34 84 00 04 addi r4,r4,4
80046d4: 56 03 ff fd bgu r16,r3,80046c8 <_Objects_Extend_information+0xf8><== NEVER TAKEN
80046d8: b5 ce 70 00 add r14,r14,r14
80046dc: b5 ce 70 00 add r14,r14,r14
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
80046e0: 2d 65 00 14 lhu r5,(r11+20)
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
80046e4: b6 4e 08 00 add r1,r18,r14
80046e8: 58 20 00 00 sw (r1+0),r0
inactive_per_block[block_count] = 0;
80046ec: b6 6e 70 00 add r14,r19,r14
80046f0: 59 c0 00 00 sw (r14+0),r0
for ( index=index_base ;
index < ( information->allocation_size + index_base );
80046f4: b5 a5 28 00 add r5,r13,r5
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
80046f8: 51 a5 00 09 bgeu r13,r5,800471c <_Objects_Extend_information+0x14c><== NEVER TAKEN
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
80046fc: b5 ad 20 00 add r4,r13,r13
8004700: b4 84 20 00 add r4,r4,r4
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
8004704: b6 84 20 00 add r4,r20,r4
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
8004708: b9 a0 18 00 mv r3,r13
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
800470c: 58 80 00 00 sw (r4+0),r0
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
8004710: 34 63 00 01 addi r3,r3,1
8004714: 34 84 00 04 addi r4,r4,4
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
8004718: 54 a3 ff fd bgu r5,r3,800470c <_Objects_Extend_information+0x13c>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
800471c: 90 00 70 00 rcsr r14,IE
8004720: 34 01 ff fe mvi r1,-2
8004724: a1 c1 08 00 and r1,r14,r1
8004728: d0 01 00 00 wcsr IE,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
800472c: 29 61 00 00 lw r1,(r11+0)
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
8004730: 22 31 ff ff andi r17,r17,0xffff
8004734: 0d 71 00 10 sh (r11+16),r17
local_table[ index ] = NULL;
}
_ISR_Disable( level );
old_tables = information->object_blocks;
8004738: 29 70 00 34 lw r16,(r11+52)
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
800473c: 59 73 00 30 sw (r11+48),r19
_ISR_Disable( level );
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
8004740: 59 72 00 34 sw (r11+52),r18
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
8004744: 59 74 00 1c sw (r11+28),r20
8004748: 34 02 00 18 mvi r2,24
800474c: f8 00 36 7a calli 8012134 <__ashlsi3>
8004750: 78 12 00 01 mvhi r18,0x1
8004754: b8 32 90 00 or r18,r1,r18
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
8004758: 2d 61 00 04 lhu r1,(r11+4)
800475c: 34 02 00 1b mvi r2,27
8004760: f8 00 36 75 calli 8012134 <__ashlsi3>
8004764: ba 41 10 00 or r2,r18,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8004768: b8 51 88 00 or r17,r2,r17
information->maximum = (Objects_Maximum) maximum;
information->maximum_id = _Objects_Build_id(
800476c: 59 71 00 0c sw (r11+12),r17
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
8004770: d0 0e 00 00 wcsr IE,r14
_Workspace_Free( old_tables );
8004774: ba 00 08 00 mv r1,r16
8004778: f8 00 0a 50 calli 80070b8 <_Workspace_Free>
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
800477c: 29 61 00 34 lw r1,(r11+52)
8004780: b5 8c 60 00 add r12,r12,r12
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
8004784: 2d 63 00 14 lhu r3,(r11+20)
8004788: 29 64 00 18 lw r4,(r11+24)
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
800478c: b5 8c 60 00 add r12,r12,r12
8004790: b4 2c 08 00 add r1,r1,r12
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
8004794: 37 90 00 30 addi r16,sp,48
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
8004798: 58 2f 00 00 sw (r1+0),r15
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
800479c: b9 e0 10 00 mv r2,r15
80047a0: ba 00 08 00 mv r1,r16
80047a4: f8 00 15 e0 calli 8009f24 <_Chain_Initialize>
80047a8: 78 12 00 01 mvhi r18,0x1
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
80047ac: 35 71 00 20 addi r17,r11,32
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
80047b0: e0 00 00 0e bi 80047e8 <_Objects_Extend_information+0x218>
80047b4: 29 61 00 00 lw r1,(r11+0)
80047b8: f8 00 36 5f calli 8012134 <__ashlsi3>
80047bc: b8 32 78 00 or r15,r1,r18
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
80047c0: 2d 61 00 04 lhu r1,(r11+4)
80047c4: 34 02 00 1b mvi r2,27
80047c8: f8 00 36 5b calli 8012134 <__ashlsi3>
80047cc: b9 e1 10 00 or r2,r15,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
80047d0: b8 4d 10 00 or r2,r2,r13
the_object->id = _Objects_Build_id(
80047d4: 59 c2 00 08 sw (r14+8),r2
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
80047d8: ba 20 08 00 mv r1,r17
80047dc: b9 c0 10 00 mv r2,r14
80047e0: fb ff fc 3d calli 80038d4 <_Chain_Append>
index++;
80047e4: 35 ad 00 01 addi r13,r13,1
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
80047e8: ba 00 08 00 mv r1,r16
80047ec: fb ff fc 50 calli 800392c <_Chain_Get>
80047f0: b8 20 70 00 mv r14,r1
80047f4: 34 02 00 18 mvi r2,24
80047f8: 5c 20 ff ef bne r1,r0,80047b4 <_Objects_Extend_information+0x1e4>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
80047fc: 29 63 00 30 lw r3,(r11+48)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
8004800: 2d 62 00 2c lhu r2,(r11+44)
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
8004804: 2d 61 00 14 lhu r1,(r11+20)
8004808: b4 6c 60 00 add r12,r3,r12
800480c: 59 81 00 00 sw (r12+0),r1
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
8004810: b4 22 08 00 add r1,r1,r2
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
information->inactive =
8004814: 0d 61 00 2c sh (r11+44),r1
(Objects_Maximum)(information->inactive + information->allocation_size);
}
8004818: 2b 9d 00 04 lw ra,(sp+4)
800481c: 2b 8b 00 2c lw r11,(sp+44)
8004820: 2b 8c 00 28 lw r12,(sp+40)
8004824: 2b 8d 00 24 lw r13,(sp+36)
8004828: 2b 8e 00 20 lw r14,(sp+32)
800482c: 2b 8f 00 1c lw r15,(sp+28)
8004830: 2b 90 00 18 lw r16,(sp+24)
8004834: 2b 91 00 14 lw r17,(sp+20)
8004838: 2b 92 00 10 lw r18,(sp+16)
800483c: 2b 93 00 0c lw r19,(sp+12)
8004840: 2b 94 00 08 lw r20,(sp+8)
8004844: 37 9c 00 38 addi sp,sp,56
8004848: c3 a0 00 00 ret
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
800484c: 28 62 00 04 lw r2,(r3+4)
8004850: 34 63 00 04 addi r3,r3,4
8004854: 5c 40 ff 7c bne r2,r0,8004644 <_Objects_Extend_information+0x74>
do_extend = false;
8004858: 34 12 00 00 mvi r18,0
800485c: e3 ff ff 7e bi 8004654 <_Objects_Extend_information+0x84>
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
if ( !new_object_block )
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
8004860: f8 00 0a 1f calli 80070dc <_Workspace_Allocate_or_fatal_error>
8004864: b8 20 78 00 mv r15,r1
8004868: e3 ff ff 85 bi 800467c <_Objects_Extend_information+0xac>
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
800486c: 29 62 00 34 lw r2,(r11+52)
information->object_blocks,
block_count * sizeof(void*) );
8004870: b5 ce 70 00 add r14,r14,r14
8004874: b5 ce 70 00 add r14,r14,r14
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
8004878: b9 c0 18 00 mv r3,r14
800487c: f8 00 23 f6 calli 800d854 <memcpy>
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
8004880: 29 62 00 30 lw r2,(r11+48)
8004884: b9 c0 18 00 mv r3,r14
8004888: ba 60 08 00 mv r1,r19
800488c: f8 00 23 f2 calli 800d854 <memcpy>
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
8004890: 2d 63 00 10 lhu r3,(r11+16)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
8004894: 29 62 00 1c lw r2,(r11+28)
8004898: ba 80 08 00 mv r1,r20
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
800489c: b6 03 18 00 add r3,r16,r3
80048a0: b4 63 18 00 add r3,r3,r3
80048a4: b4 63 18 00 add r3,r3,r3
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
80048a8: f8 00 23 eb calli 800d854 <memcpy>
80048ac: e3 ff ff 8d bi 80046e0 <_Objects_Extend_information+0x110>
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
80048b0: 2c 31 00 10 lhu r17,(r1+16)
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
80048b4: ba 00 68 00 mv r13,r16
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
80048b8: 2c 21 00 14 lhu r1,(r1+20)
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
80048bc: 34 12 00 01 mvi r18,1
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
80048c0: 34 0e 00 00 mvi r14,0
80048c4: e3 ff ff 64 bi 8004654 <_Objects_Extend_information+0x84>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
80048c8: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
80048cc: ba 00 68 00 mv r13,r16 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
80048d0: 34 12 00 01 mvi r18,1 <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
80048d4: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
80048d8: e3 ff ff 5f bi 8004654 <_Objects_Extend_information+0x84> <== NOT EXECUTED
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
80048dc: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
80048e0: ba 00 68 00 mv r13,r16 <== NOT EXECUTED
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
80048e4: 34 12 00 00 mvi r18,0 <== NOT EXECUTED
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
80048e8: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
80048ec: e3 ff ff 5a bi 8004654 <_Objects_Extend_information+0x84> <== NOT EXECUTED
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
80048f0: b9 e0 08 00 mv r1,r15
80048f4: f8 00 09 f1 calli 80070b8 <_Workspace_Free>
return;
80048f8: e3 ff ff c8 bi 8004818 <_Objects_Extend_information+0x248>
080049e4 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
80049e4: 37 9c ff f0 addi sp,sp,-16
80049e8: 5b 8b 00 10 sw (sp+16),r11
80049ec: 5b 8c 00 0c sw (sp+12),r12
80049f0: 5b 8d 00 08 sw (sp+8),r13
80049f4: 5b 9d 00 04 sw (sp+4),ra
80049f8: 20 4c ff ff andi r12,r2,0xffff
80049fc: b8 20 68 00 mv r13,r1
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
8004a00: 34 0b 00 00 mvi r11,0
)
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
8004a04: 5d 80 00 08 bne r12,r0,8004a24 <_Objects_Get_information+0x40>
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
8004a08: b9 60 08 00 mv r1,r11
8004a0c: 2b 9d 00 04 lw ra,(sp+4)
8004a10: 2b 8b 00 10 lw r11,(sp+16)
8004a14: 2b 8c 00 0c lw r12,(sp+12)
8004a18: 2b 8d 00 08 lw r13,(sp+8)
8004a1c: 37 9c 00 10 addi sp,sp,16
8004a20: c3 a0 00 00 ret
/*
* 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 );
8004a24: f8 00 16 e5 calli 800a5b8 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
8004a28: 44 20 ff f8 be r1,r0,8004a08 <_Objects_Get_information+0x24>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
8004a2c: 55 81 ff f7 bgu r12,r1,8004a08 <_Objects_Get_information+0x24>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
8004a30: 78 01 08 01 mvhi r1,0x801
8004a34: b5 ad 68 00 add r13,r13,r13
8004a38: 38 21 48 a4 ori r1,r1,0x48a4
8004a3c: b5 ad 68 00 add r13,r13,r13
8004a40: b4 2d 08 00 add r1,r1,r13
8004a44: 28 21 00 00 lw r1,(r1+0)
8004a48: 44 20 ff f0 be r1,r0,8004a08 <_Objects_Get_information+0x24><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
8004a4c: b5 8c 60 00 add r12,r12,r12
8004a50: b5 8c 60 00 add r12,r12,r12
8004a54: b4 2c 08 00 add r1,r1,r12
8004a58: 28 2b 00 00 lw r11,(r1+0)
if ( !info )
8004a5c: 45 60 ff eb be r11,r0,8004a08 <_Objects_Get_information+0x24><== NEVER TAKEN
* In a multprocessing configuration, we may access remote objects.
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
8004a60: 2d 61 00 10 lhu r1,(r11+16)
return NULL;
8004a64: 7c 21 00 00 cmpnei r1,r1,0
8004a68: c8 01 08 00 sub r1,r0,r1
8004a6c: a1 61 58 00 and r11,r11,r1
8004a70: e3 ff ff e6 bi 8004a08 <_Objects_Get_information+0x24>
08006a58 <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
8006a58: 37 9c ff e0 addi sp,sp,-32
8006a5c: 5b 8b 00 14 sw (sp+20),r11
8006a60: 5b 8c 00 10 sw (sp+16),r12
8006a64: 5b 8d 00 0c sw (sp+12),r13
8006a68: 5b 8e 00 08 sw (sp+8),r14
8006a6c: 5b 9d 00 04 sw (sp+4),ra
8006a70: b8 40 60 00 mv r12,r2
8006a74: b8 60 58 00 mv r11,r3
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
8006a78: 5c 40 00 0a bne r2,r0,8006aa0 <_Objects_Get_name_as_string+0x48>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
8006a7c: 34 0b 00 00 mvi r11,0
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
8006a80: b9 60 08 00 mv r1,r11
8006a84: 2b 9d 00 04 lw ra,(sp+4)
8006a88: 2b 8b 00 14 lw r11,(sp+20)
8006a8c: 2b 8c 00 10 lw r12,(sp+16)
8006a90: 2b 8d 00 0c lw r13,(sp+12)
8006a94: 2b 8e 00 08 lw r14,(sp+8)
8006a98: 37 9c 00 20 addi sp,sp,32
8006a9c: c3 a0 00 00 ret
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
8006aa0: 44 60 ff f8 be r3,r0,8006a80 <_Objects_Get_name_as_string+0x28>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
8006aa4: b8 20 68 00 mv r13,r1
8006aa8: 5c 20 00 05 bne r1,r0,8006abc <_Objects_Get_name_as_string+0x64>
8006aac: 78 01 08 02 mvhi r1,0x802
8006ab0: 38 21 32 14 ori r1,r1,0x3214
8006ab4: 28 21 00 0c lw r1,(r1+12)
8006ab8: 28 2d 00 08 lw r13,(r1+8)
information = _Objects_Get_information_id( tmpId );
8006abc: b9 a0 08 00 mv r1,r13
8006ac0: fb ff ff 94 calli 8006910 <_Objects_Get_information_id>
8006ac4: b8 20 70 00 mv r14,r1
if ( !information )
8006ac8: 44 20 ff ed be r1,r0,8006a7c <_Objects_Get_name_as_string+0x24>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
8006acc: b9 a0 10 00 mv r2,r13
8006ad0: 37 83 00 20 addi r3,sp,32
8006ad4: f8 00 00 36 calli 8006bac <_Objects_Get>
switch ( location ) {
8006ad8: 2b 82 00 20 lw r2,(sp+32)
8006adc: 5c 40 ff e8 bne r2,r0,8006a7c <_Objects_Get_name_as_string+0x24>
return NULL;
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
8006ae0: 41 c3 00 38 lbu r3,(r14+56)
8006ae4: 44 62 00 1c be r3,r2,8006b54 <_Objects_Get_name_as_string+0xfc>
s = the_object->name.name_p;
8006ae8: 28 27 00 0c lw r7,(r1+12)
lname[ 4 ] = '\0';
s = lname;
}
d = name;
if ( s ) {
8006aec: b9 60 08 00 mv r1,r11
8006af0: 44 e0 00 16 be r7,r0,8006b48 <_Objects_Get_name_as_string+0xf0>
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
8006af4: 35 8c ff ff addi r12,r12,-1
8006af8: b9 60 08 00 mv r1,r11
8006afc: 45 80 00 13 be r12,r0,8006b48 <_Objects_Get_name_as_string+0xf0><== NEVER TAKEN
8006b00: 40 e3 00 00 lbu r3,(r7+0)
8006b04: 44 60 00 11 be r3,r0,8006b48 <_Objects_Get_name_as_string+0xf0><== NEVER TAKEN
8006b08: 78 04 08 02 mvhi r4,0x802
8006b0c: 34 02 00 00 mvi r2,0
8006b10: 38 84 22 30 ori r4,r4,0x2230
*d = (isprint((unsigned char)*s)) ? *s : '*';
8006b14: 28 85 00 00 lw r5,(r4+0)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
8006b18: 34 42 00 01 addi r2,r2,1
* This method objects the name of an object and returns its name
* in the form of a C string. It attempts to be careful about
* overflowing the user's string and about returning unprintable characters.
*/
char *_Objects_Get_name_as_string(
8006b1c: b4 e2 30 00 add r6,r7,r2
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
*d = (isprint((unsigned char)*s)) ? *s : '*';
8006b20: b4 a3 28 00 add r5,r5,r3
8006b24: 40 a5 00 01 lbu r5,(r5+1)
8006b28: 20 a5 00 97 andi r5,r5,0x97
8006b2c: 5c a0 00 02 bne r5,r0,8006b34 <_Objects_Get_name_as_string+0xdc>
8006b30: 34 03 00 2a mvi r3,42
8006b34: 30 23 00 00 sb (r1+0),r3
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
8006b38: 34 21 00 01 addi r1,r1,1
8006b3c: 50 4c 00 03 bgeu r2,r12,8006b48 <_Objects_Get_name_as_string+0xf0>
8006b40: 40 c3 00 00 lbu r3,(r6+0)
8006b44: 5c 60 ff f4 bne r3,r0,8006b14 <_Objects_Get_name_as_string+0xbc>
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
8006b48: 30 20 00 00 sb (r1+0),r0
_Thread_Enable_dispatch();
8006b4c: f8 00 03 c3 calli 8007a58 <_Thread_Enable_dispatch>
return name;
8006b50: e3 ff ff cc bi 8006a80 <_Objects_Get_name_as_string+0x28>
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
8006b54: 28 2d 00 0c lw r13,(r1+12)
lname[ 0 ] = (u32_name >> 24) & 0xff;
8006b58: 34 02 00 18 mvi r2,24
8006b5c: b9 a0 08 00 mv r1,r13
8006b60: fb ff e9 93 calli 80011ac <__lshrsi3>
8006b64: 33 81 00 18 sb (sp+24),r1
lname[ 1 ] = (u32_name >> 16) & 0xff;
8006b68: 34 02 00 10 mvi r2,16
8006b6c: b9 a0 08 00 mv r1,r13
8006b70: fb ff e9 8f calli 80011ac <__lshrsi3>
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b74: 01 a2 00 01 srui r2,r13,1
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
8006b78: 33 81 00 19 sb (sp+25),r1
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b7c: 00 42 00 01 srui r2,r2,1
lname[ 3 ] = (u32_name >> 0) & 0xff;
8006b80: 33 8d 00 1b sb (sp+27),r13
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b84: 00 42 00 01 srui r2,r2,1
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
8006b88: 33 80 00 1c sb (sp+28),r0
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b8c: 00 42 00 01 srui r2,r2,1
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
s = lname;
8006b90: 37 87 00 18 addi r7,sp,24
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b94: 00 42 00 01 srui r2,r2,1
8006b98: 00 42 00 01 srui r2,r2,1
8006b9c: 00 42 00 01 srui r2,r2,1
8006ba0: 00 42 00 01 srui r2,r2,1
8006ba4: 33 82 00 1a sb (sp+26),r2
8006ba8: e3 ff ff d3 bi 8006af4 <_Objects_Get_name_as_string+0x9c>
080176f0 <_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;
80176f0: 28 25 00 08 lw r5,(r1+8)
if ( information->maximum >= index ) {
80176f4: 2c 24 00 10 lhu r4,(r1+16)
/*
* 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;
80176f8: c8 45 10 00 sub r2,r2,r5
80176fc: 34 42 00 01 addi r2,r2,1
if ( information->maximum >= index ) {
8017700: 54 44 00 09 bgu r2,r4,8017724 <_Objects_Get_no_protection+0x34>
if ( (the_object = information->local_table[ index ]) != NULL ) {
8017704: 28 24 00 1c lw r4,(r1+28)
8017708: b4 42 08 00 add r1,r2,r2
801770c: b4 21 08 00 add r1,r1,r1
8017710: b4 81 08 00 add r1,r4,r1
8017714: 28 21 00 00 lw r1,(r1+0)
8017718: 44 20 00 03 be r1,r0,8017724 <_Objects_Get_no_protection+0x34><== NEVER TAKEN
*location = OBJECTS_LOCAL;
801771c: 58 60 00 00 sw (r3+0),r0
return the_object;
8017720: c3 a0 00 00 ret
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
8017724: 34 01 00 01 mvi r1,1
8017728: 58 61 00 00 sw (r3+0),r1
return NULL;
801772c: 34 01 00 00 mvi r1,0
}
8017730: c3 a0 00 00 ret
0800657c <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
800657c: 37 9c ff e8 addi sp,sp,-24
8006580: 5b 8b 00 14 sw (sp+20),r11
8006584: 5b 8c 00 10 sw (sp+16),r12
8006588: 5b 8d 00 0c sw (sp+12),r13
800658c: 5b 8e 00 08 sw (sp+8),r14
8006590: 5b 9d 00 04 sw (sp+4),ra
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
8006594: b8 20 58 00 mv r11,r1
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
8006598: b8 40 70 00 mv r14,r2
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
800659c: 5c 20 00 05 bne r1,r0,80065b0 <_Objects_Id_to_name+0x34>
80065a0: 78 01 08 02 mvhi r1,0x802
80065a4: 38 21 1e 0c ori r1,r1,0x1e0c
80065a8: 28 21 00 0c lw r1,(r1+12)
80065ac: 28 2b 00 08 lw r11,(r1+8)
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
80065b0: b9 60 08 00 mv r1,r11
80065b4: 34 02 00 18 mvi r2,24
80065b8: f8 00 59 57 calli 801cb14 <__lshrsi3>
80065bc: 20 23 00 07 andi r3,r1,0x7
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
80065c0: 34 64 ff ff addi r4,r3,-1
80065c4: 34 01 00 02 mvi r1,2
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
80065c8: 34 0c 00 03 mvi r12,3
80065cc: 54 81 00 12 bgu r4,r1,8006614 <_Objects_Id_to_name+0x98>
if ( !_Objects_Information_table[ the_api ] )
80065d0: 78 04 08 02 mvhi r4,0x802
80065d4: b4 63 18 00 add r3,r3,r3
80065d8: 38 84 18 fc ori r4,r4,0x18fc
80065dc: b4 63 18 00 add r3,r3,r3
80065e0: b4 83 18 00 add r3,r4,r3
80065e4: 28 6d 00 00 lw r13,(r3+0)
80065e8: 45 a0 00 0b be r13,r0,8006614 <_Objects_Id_to_name+0x98>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
80065ec: b9 60 08 00 mv r1,r11
80065f0: 34 02 00 1b mvi r2,27
80065f4: f8 00 59 48 calli 801cb14 <__lshrsi3>
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
80065f8: b4 21 18 00 add r3,r1,r1
80065fc: b4 63 18 00 add r3,r3,r3
8006600: b5 a3 18 00 add r3,r13,r3
8006604: 28 63 00 00 lw r3,(r3+0)
if ( !information )
8006608: 44 60 00 03 be r3,r0,8006614 <_Objects_Id_to_name+0x98> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
800660c: 40 6d 00 38 lbu r13,(r3+56)
8006610: 45 a0 00 09 be r13,r0,8006634 <_Objects_Id_to_name+0xb8> <== ALWAYS TAKEN
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
8006614: b9 80 08 00 mv r1,r12
8006618: 2b 9d 00 04 lw ra,(sp+4)
800661c: 2b 8b 00 14 lw r11,(sp+20)
8006620: 2b 8c 00 10 lw r12,(sp+16)
8006624: 2b 8d 00 0c lw r13,(sp+12)
8006628: 2b 8e 00 08 lw r14,(sp+8)
800662c: 37 9c 00 18 addi sp,sp,24
8006630: c3 a0 00 00 ret
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
8006634: b8 60 08 00 mv r1,r3
8006638: b9 60 10 00 mv r2,r11
800663c: 37 83 00 18 addi r3,sp,24
8006640: fb ff ff a9 calli 80064e4 <_Objects_Get>
if ( !the_object )
8006644: 44 2d ff f4 be r1,r13,8006614 <_Objects_Id_to_name+0x98>
return OBJECTS_INVALID_ID;
*name = the_object->name;
8006648: 28 21 00 0c lw r1,(r1+12)
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
800664c: 34 0c 00 00 mvi r12,0
the_object = _Objects_Get( information, tmpId, &ignored_location );
if ( !the_object )
return OBJECTS_INVALID_ID;
*name = the_object->name;
8006650: 59 c1 00 00 sw (r14+0),r1
_Thread_Enable_dispatch();
8006654: f8 00 03 da calli 80075bc <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
8006658: b9 80 08 00 mv r1,r12
800665c: 2b 9d 00 04 lw ra,(sp+4)
8006660: 2b 8b 00 14 lw r11,(sp+20)
8006664: 2b 8c 00 10 lw r12,(sp+16)
8006668: 2b 8d 00 0c lw r13,(sp+12)
800666c: 2b 8e 00 08 lw r14,(sp+8)
8006670: 37 9c 00 18 addi sp,sp,24
8006674: c3 a0 00 00 ret
08004b78 <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004b78: 37 9c ff e8 addi sp,sp,-24
8004b7c: 5b 8b 00 18 sw (sp+24),r11
8004b80: 5b 8c 00 14 sw (sp+20),r12
8004b84: 5b 8d 00 10 sw (sp+16),r13
8004b88: 5b 8e 00 0c sw (sp+12),r14
8004b8c: 5b 8f 00 08 sw (sp+8),r15
8004b90: 5b 9d 00 04 sw (sp+4),ra
8004b94: b8 40 68 00 mv r13,r2
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004b98: b5 ad 40 00 add r8,r13,r13
8004b9c: 78 02 08 01 mvhi r2,0x801
8004ba0: 38 42 48 a4 ori r2,r2,0x48a4
8004ba4: b5 08 40 00 add r8,r8,r8
8004ba8: b4 48 40 00 add r8,r2,r8
8004bac: 29 02 00 00 lw r2,(r8+0)
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004bb0: 20 6c ff ff andi r12,r3,0xffff
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004bb4: b5 8c 40 00 add r8,r12,r12
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004bb8: 20 a5 ff ff andi r5,r5,0xffff
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004bbc: b5 08 40 00 add r8,r8,r8
uint32_t maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
8004bc0: 58 2d 00 00 sw (r1+0),r13
information->the_class = the_class;
8004bc4: 0c 2c 00 04 sh (r1+4),r12
information->size = size;
8004bc8: 58 25 00 18 sw (r1+24),r5
information->local_table = 0;
8004bcc: 58 20 00 1c sw (r1+28),r0
information->inactive_per_block = 0;
8004bd0: 58 20 00 30 sw (r1+48),r0
information->object_blocks = 0;
8004bd4: 58 20 00 34 sw (r1+52),r0
information->inactive = 0;
8004bd8: 0c 20 00 2c sh (r1+44),r0
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
information->is_string = is_string;
8004bdc: 30 26 00 38 sb (r1+56),r6
/*
* Set the maximum value to 0. It will be updated when objects are
* added to the inactive set from _Objects_Extend_information()
*/
information->maximum = 0;
8004be0: 0c 20 00 10 sh (r1+16),r0
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004be4: b4 48 40 00 add r8,r2,r8
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004be8: b8 20 58 00 mv r11,r1
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004bec: 59 01 00 00 sw (r8+0),r1
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8004bf0: 34 02 00 1f mvi r2,31
8004bf4: b8 80 08 00 mv r1,r4
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004bf8: b8 80 70 00 mv r14,r4
8004bfc: b8 e0 78 00 mv r15,r7
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8004c00: f8 00 35 9b calli 801226c <__lshrsi3>
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8004c04: 78 03 08 01 mvhi r3,0x801
8004c08: 38 63 36 bc ori r3,r3,0x36bc
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8004c0c: 20 22 00 ff andi r2,r1,0xff
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8004c10: 28 61 00 00 lw r1,(r3+0)
_Objects_Information_table[ the_api ][ the_class ] = information;
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
8004c14: 31 62 00 12 sb (r11+18),r2
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8004c18: a1 c1 70 00 and r14,r14,r1
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
8004c1c: 44 40 00 02 be r2,r0,8004c24 <_Objects_Initialize_information+0xac>
8004c20: 45 c0 00 29 be r14,r0,8004cc4 <_Objects_Initialize_information+0x14c><== NEVER TAKEN
information->allocation_size = maximum_per_allocation;
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
8004c24: 78 01 08 01 mvhi r1,0x801
8004c28: 38 21 47 14 ori r1,r1,0x4714
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8004c2c: 34 02 00 18 mvi r2,24
8004c30: 59 61 00 1c sw (r11+28),r1
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
8004c34: 0d 6e 00 14 sh (r11+20),r14
8004c38: b9 a0 08 00 mv r1,r13
8004c3c: f8 00 35 3e calli 8012134 <__ashlsi3>
8004c40: 78 0d 00 01 mvhi r13,0x1
8004c44: b8 2d 68 00 or r13,r1,r13
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
8004c48: 34 02 00 1b mvi r2,27
8004c4c: b9 80 08 00 mv r1,r12
8004c50: f8 00 35 39 calli 8012134 <__ashlsi3>
information->local_table = &null_local_table;
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
8004c54: 7d c2 00 00 cmpnei r2,r14,0
8004c58: b9 a1 08 00 or r1,r13,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8004c5c: b8 22 08 00 or r1,r1,r2
information->minimum_id =
8004c60: 59 61 00 08 sw (r11+8),r1
* lengths that may be an odd number of bytes.
*/
name_length = maximum_name_length;
#if defined(RTEMS_POSIX_API)
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
8004c64: 21 e1 00 03 andi r1,r15,0x3
8004c68: b9 e0 38 00 mv r7,r15
8004c6c: 5c 20 00 12 bne r1,r0,8004cb4 <_Objects_Initialize_information+0x13c>
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 );
8004c70: 35 62 00 24 addi r2,r11,36
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
8004c74: 35 61 00 20 addi r1,r11,32
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
#endif
information->name_length = name_length;
8004c78: 0d 67 00 3a sh (r11+58),r7
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8004c7c: 59 62 00 20 sw (r11+32),r2
head->previous = NULL;
8004c80: 59 60 00 24 sw (r11+36),r0
tail->previous = head;
8004c84: 59 61 00 28 sw (r11+40),r1
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
8004c88: 45 c0 00 03 be r14,r0,8004c94 <_Objects_Initialize_information+0x11c>
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
8004c8c: b9 60 08 00 mv r1,r11
8004c90: fb ff fe 50 calli 80045d0 <_Objects_Extend_information>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
8004c94: 2b 9d 00 04 lw ra,(sp+4)
8004c98: 2b 8b 00 18 lw r11,(sp+24)
8004c9c: 2b 8c 00 14 lw r12,(sp+20)
8004ca0: 2b 8d 00 10 lw r13,(sp+16)
8004ca4: 2b 8e 00 0c lw r14,(sp+12)
8004ca8: 2b 8f 00 08 lw r15,(sp+8)
8004cac: 37 9c 00 18 addi sp,sp,24
8004cb0: c3 a0 00 00 ret
*/
name_length = maximum_name_length;
#if defined(RTEMS_POSIX_API)
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
8004cb4: 35 e7 00 04 addi r7,r15,4
8004cb8: 34 01 ff fc mvi r1,-4
8004cbc: a0 e1 38 00 and r7,r7,r1
8004cc0: e3 ff ff ec bi 8004c70 <_Objects_Initialize_information+0xf8>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
8004cc4: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8004cc8: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8004ccc: 34 03 00 13 mvi r3,19 <== NOT EXECUTED
8004cd0: fb ff fd d5 calli 8004424 <_Internal_error_Occurred> <== NOT EXECUTED
08004d50 <_Objects_Shrink_information>:
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
8004d50: 37 9c ff ec addi sp,sp,-20
8004d54: 5b 8b 00 14 sw (sp+20),r11
8004d58: 5b 8c 00 10 sw (sp+16),r12
8004d5c: 5b 8d 00 0c sw (sp+12),r13
8004d60: 5b 8e 00 08 sw (sp+8),r14
8004d64: 5b 9d 00 04 sw (sp+4),ra
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
8004d68: 2c 2c 00 0a lhu r12,(r1+10)
block_count = (information->maximum - index_base) /
8004d6c: 2c 2d 00 14 lhu r13,(r1+20)
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
8004d70: b8 20 70 00 mv r14,r1
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
8004d74: 2c 21 00 10 lhu r1,(r1+16)
8004d78: b9 a0 10 00 mv r2,r13
8004d7c: c8 2c 08 00 sub r1,r1,r12
8004d80: f8 00 35 c7 calli 801249c <__udivsi3>
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
8004d84: 44 20 00 09 be r1,r0,8004da8 <_Objects_Shrink_information+0x58><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
8004d88: 29 c5 00 30 lw r5,(r14+48)
8004d8c: 34 0b 00 04 mvi r11,4
8004d90: 34 03 00 00 mvi r3,0
8004d94: 28 a2 00 00 lw r2,(r5+0)
8004d98: 45 a2 00 11 be r13,r2,8004ddc <_Objects_Shrink_information+0x8c><== NEVER TAKEN
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
8004d9c: 34 63 00 01 addi r3,r3,1
* the_block - the block to remove
*
* Output parameters: NONE
*/
void _Objects_Shrink_information(
8004da0: b4 ab 10 00 add r2,r5,r11
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
8004da4: 54 23 00 08 bgu r1,r3,8004dc4 <_Objects_Shrink_information+0x74>
return;
}
index_base += information->allocation_size;
}
}
8004da8: 2b 9d 00 04 lw ra,(sp+4)
8004dac: 2b 8b 00 14 lw r11,(sp+20)
8004db0: 2b 8c 00 10 lw r12,(sp+16)
8004db4: 2b 8d 00 0c lw r13,(sp+12)
8004db8: 2b 8e 00 08 lw r14,(sp+8)
8004dbc: 37 9c 00 14 addi sp,sp,20
8004dc0: c3 a0 00 00 ret
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
8004dc4: 28 42 00 00 lw r2,(r2+0)
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
8004dc8: 35 64 00 04 addi r4,r11,4
8004dcc: b5 8d 60 00 add r12,r12,r13
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
8004dd0: 45 a2 00 04 be r13,r2,8004de0 <_Objects_Shrink_information+0x90>
8004dd4: b8 80 58 00 mv r11,r4
8004dd8: e3 ff ff f1 bi 8004d9c <_Objects_Shrink_information+0x4c>
8004ddc: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
8004de0: 29 c1 00 20 lw r1,(r14+32)
do {
index = _Objects_Get_index( the_object->id );
8004de4: 2c 22 00 0a lhu r2,(r1+10)
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
8004de8: 28 2d 00 00 lw r13,(r1+0)
if ((index >= index_base) &&
8004dec: 55 82 00 05 bgu r12,r2,8004e00 <_Objects_Shrink_information+0xb0>
(index < (index_base + information->allocation_size))) {
8004df0: 2d c3 00 14 lhu r3,(r14+20)
8004df4: b5 83 18 00 add r3,r12,r3
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
8004df8: 50 43 00 02 bgeu r2,r3,8004e00 <_Objects_Shrink_information+0xb0>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
8004dfc: fb ff fa c2 calli 8003904 <_Chain_Extract>
}
}
while ( the_object );
8004e00: 45 a0 00 03 be r13,r0,8004e0c <_Objects_Shrink_information+0xbc>
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
8004e04: b9 a0 08 00 mv r1,r13
8004e08: e3 ff ff f7 bi 8004de4 <_Objects_Shrink_information+0x94>
while ( the_object );
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
8004e0c: 29 c1 00 34 lw r1,(r14+52)
8004e10: b4 2b 08 00 add r1,r1,r11
8004e14: 28 21 00 00 lw r1,(r1+0)
8004e18: f8 00 08 a8 calli 80070b8 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
8004e1c: 29 c2 00 34 lw r2,(r14+52)
information->inactive_per_block[ block ] = 0;
8004e20: 29 c4 00 30 lw r4,(r14+48)
information->inactive -= information->allocation_size;
8004e24: 2d c3 00 2c lhu r3,(r14+44)
8004e28: 2d c1 00 14 lhu r1,(r14+20)
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
8004e2c: b4 4b 10 00 add r2,r2,r11
8004e30: 58 40 00 00 sw (r2+0),r0
information->inactive_per_block[ block ] = 0;
8004e34: b4 8b 58 00 add r11,r4,r11
8004e38: 59 60 00 00 sw (r11+0),r0
information->inactive -= information->allocation_size;
8004e3c: c8 61 08 00 sub r1,r3,r1
8004e40: 0d c1 00 2c sh (r14+44),r1
return;
}
index_base += information->allocation_size;
}
}
8004e44: 2b 9d 00 04 lw ra,(sp+4)
8004e48: 2b 8b 00 14 lw r11,(sp+20)
8004e4c: 2b 8c 00 10 lw r12,(sp+16)
8004e50: 2b 8d 00 0c lw r13,(sp+12)
8004e54: 2b 8e 00 08 lw r14,(sp+8)
8004e58: 37 9c 00 14 addi sp,sp,20
8004e5c: c3 a0 00 00 ret
08009044 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
8009044: 37 9c ff dc addi sp,sp,-36
8009048: 5b 8b 00 1c sw (sp+28),r11
800904c: 5b 8c 00 18 sw (sp+24),r12
8009050: 5b 8d 00 14 sw (sp+20),r13
8009054: 5b 8e 00 10 sw (sp+16),r14
8009058: 5b 8f 00 0c sw (sp+12),r15
800905c: 5b 90 00 08 sw (sp+8),r16
8009060: 5b 9d 00 04 sw (sp+4),ra
8009064: b8 20 60 00 mv r12,r1
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(
8009068: 78 01 08 02 mvhi r1,0x802
800906c: b8 40 78 00 mv r15,r2
8009070: b8 60 58 00 mv r11,r3
8009074: b9 80 10 00 mv r2,r12
8009078: 38 21 a2 58 ori r1,r1,0xa258
800907c: 37 83 00 24 addi r3,sp,36
8009080: b8 80 68 00 mv r13,r4
8009084: b8 c0 70 00 mv r14,r6
8009088: 20 b0 00 ff andi r16,r5,0xff
800908c: f8 00 0d 28 calli 800c52c <_Objects_Get>
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
8009090: 2b 82 00 24 lw r2,(sp+36)
8009094: 44 40 00 0e be r2,r0,80090cc <_POSIX_Message_queue_Receive_support+0x88>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
8009098: f8 00 30 6b calli 8015244 <__errno>
800909c: 34 02 00 09 mvi r2,9
80090a0: 58 22 00 00 sw (r1+0),r2
80090a4: 34 01 ff ff mvi r1,-1
}
80090a8: 2b 9d 00 04 lw ra,(sp+4)
80090ac: 2b 8b 00 1c lw r11,(sp+28)
80090b0: 2b 8c 00 18 lw r12,(sp+24)
80090b4: 2b 8d 00 14 lw r13,(sp+20)
80090b8: 2b 8e 00 10 lw r14,(sp+16)
80090bc: 2b 8f 00 0c lw r15,(sp+12)
80090c0: 2b 90 00 08 lw r16,(sp+8)
80090c4: 37 9c 00 24 addi sp,sp,36
80090c8: c3 a0 00 00 ret
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
80090cc: 28 28 00 14 lw r8,(r1+20)
80090d0: 34 07 00 01 mvi r7,1
80090d4: 21 09 00 03 andi r9,r8,0x3
80090d8: 45 27 00 2e be r9,r7,8009190 <_POSIX_Message_queue_Receive_support+0x14c>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
80090dc: 28 27 00 10 lw r7,(r1+16)
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
80090e0: 28 e1 00 68 lw r1,(r7+104)
80090e4: 51 61 00 07 bgeu r11,r1,8009100 <_POSIX_Message_queue_Receive_support+0xbc>
_Thread_Enable_dispatch();
80090e8: f8 00 11 11 calli 800d52c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
80090ec: f8 00 30 56 calli 8015244 <__errno>
80090f0: 34 02 00 7a mvi r2,122
80090f4: 58 22 00 00 sw (r1+0),r2
80090f8: 34 01 ff ff mvi r1,-1
80090fc: e3 ff ff eb bi 80090a8 <_POSIX_Message_queue_Receive_support+0x64>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
8009100: 34 01 ff ff mvi r1,-1
8009104: 5b 81 00 20 sw (sp+32),r1
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
8009108: 34 05 00 00 mvi r5,0
800910c: 5e 00 00 16 bne r16,r0,8009164 <_POSIX_Message_queue_Receive_support+0x120><== ALWAYS TAKEN
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8009110: 78 0b 08 02 mvhi r11,0x802
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
8009114: 34 e1 00 1c addi r1,r7,28
8009118: b9 80 10 00 mv r2,r12
800911c: b9 e0 18 00 mv r3,r15
8009120: 37 84 00 20 addi r4,sp,32
8009124: b9 c0 30 00 mv r6,r14
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8009128: 39 6b a2 c4 ori r11,r11,0xa2c4
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
800912c: f8 00 07 cf calli 800b068 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
8009130: f8 00 10 ff calli 800d52c <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8009134: 29 6c 00 0c lw r12,(r11+12)
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);
8009138: 34 02 00 1f mvi r2,31
800913c: 29 81 00 24 lw r1,(r12+36)
8009140: f8 00 6f 75 calli 8024f14 <__ashrsi3>
8009144: 29 83 00 24 lw r3,(r12+36)
if ( !_Thread_Executing->Wait.return_code )
8009148: 29 82 00 34 lw r2,(r12+52)
800914c: 98 23 18 00 xor r3,r1,r3
8009150: c8 61 08 00 sub r1,r3,r1
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
8009154: 59 a1 00 00 sw (r13+0),r1
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
8009158: 5c 40 00 06 bne r2,r0,8009170 <_POSIX_Message_queue_Receive_support+0x12c>
return length_out;
800915c: 2b 81 00 20 lw r1,(sp+32)
8009160: e3 ff ff d2 bi 80090a8 <_POSIX_Message_queue_Receive_support+0x64>
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
8009164: 21 05 40 00 andi r5,r8,0x4000
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
8009168: 64 a5 00 00 cmpei r5,r5,0
800916c: e3 ff ff e9 bi 8009110 <_POSIX_Message_queue_Receive_support+0xcc>
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
return length_out;
rtems_set_errno_and_return_minus_one(
8009170: f8 00 30 35 calli 8015244 <__errno>
8009174: b8 20 60 00 mv r12,r1
8009178: 29 61 00 0c lw r1,(r11+12)
800917c: 28 21 00 34 lw r1,(r1+52)
8009180: f8 00 00 c2 calli 8009488 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
8009184: 59 81 00 00 sw (r12+0),r1
8009188: 34 01 ff ff mvi r1,-1
800918c: e3 ff ff c7 bi 80090a8 <_POSIX_Message_queue_Receive_support+0x64>
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
_Thread_Enable_dispatch();
8009190: f8 00 10 e7 calli 800d52c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
8009194: f8 00 30 2c calli 8015244 <__errno>
8009198: 34 02 00 09 mvi r2,9
800919c: 58 22 00 00 sw (r1+0),r2
80091a0: 34 01 ff ff mvi r1,-1
80091a4: e3 ff ff c1 bi 80090a8 <_POSIX_Message_queue_Receive_support+0x64>
08008dec <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
8008dec: 37 9c ff fc addi sp,sp,-4
8008df0: 5b 9d 00 04 sw (sp+4),ra
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
8008df4: 28 22 01 20 lw r2,(r1+288)
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
8008df8: 28 43 00 d8 lw r3,(r2+216)
8008dfc: 5c 60 00 04 bne r3,r0,8008e0c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20><== NEVER TAKEN
8008e00: 28 44 00 dc lw r4,(r2+220)
8008e04: 34 03 00 01 mvi r3,1
8008e08: 44 83 00 05 be r4,r3,8008e1c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x30>
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();
8008e0c: fb ff f3 07 calli 8005a28 <_Thread_Enable_dispatch>
}
8008e10: 2b 9d 00 04 lw ra,(sp+4)
8008e14: 37 9c 00 04 addi sp,sp,4
8008e18: c3 a0 00 00 ret
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
8008e1c: 28 42 00 e0 lw r2,(r2+224)
8008e20: 44 40 ff fb be r2,r0,8008e0c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
8008e24: 78 03 08 01 mvhi r3,0x801
8008e28: 38 63 68 c8 ori r3,r3,0x68c8
8008e2c: 28 64 00 00 lw r4,(r3+0)
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
8008e30: 34 02 ff ff mvi r2,-1
8008e34: 34 84 ff ff addi r4,r4,-1
8008e38: 58 64 00 00 sw (r3+0),r4
8008e3c: f8 00 02 89 calli 8009860 <_POSIX_Thread_Exit>
8008e40: e3 ff ff f4 bi 8008e10 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x24>
0800a804 <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
800a804: 37 9c ff e8 addi sp,sp,-24
800a808: 5b 8b 00 18 sw (sp+24),r11
800a80c: 5b 8c 00 14 sw (sp+20),r12
800a810: 5b 8d 00 10 sw (sp+16),r13
800a814: 5b 8e 00 0c sw (sp+12),r14
800a818: 5b 8f 00 08 sw (sp+8),r15
800a81c: 5b 9d 00 04 sw (sp+4),ra
800a820: b8 20 68 00 mv r13,r1
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a824: 28 41 00 00 lw r1,(r2+0)
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
800a828: b8 40 60 00 mv r12,r2
800a82c: b8 60 70 00 mv r14,r3
800a830: b8 80 78 00 mv r15,r4
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a834: fb ff ff ec calli 800a7e4 <_POSIX_Priority_Is_valid>
return EINVAL;
800a838: 34 0b 00 16 mvi r11,22
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a83c: 44 20 00 0c be r1,r0,800a86c <_POSIX_Thread_Translate_sched_param+0x68><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
800a840: 59 c0 00 00 sw (r14+0),r0
*budget_callout = NULL;
800a844: 59 e0 00 00 sw (r15+0),r0
if ( policy == SCHED_OTHER ) {
800a848: 45 a0 00 12 be r13,r0,800a890 <_POSIX_Thread_Translate_sched_param+0x8c>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
800a84c: 34 01 00 01 mvi r1,1
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
800a850: 34 0b 00 00 mvi r11,0
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
800a854: 45 a1 00 06 be r13,r1,800a86c <_POSIX_Thread_Translate_sched_param+0x68>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
800a858: 34 01 00 02 mvi r1,2
800a85c: 45 a1 00 2b be r13,r1,800a908 <_POSIX_Thread_Translate_sched_param+0x104>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
800a860: 34 01 00 04 mvi r1,4
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
800a864: 34 0b 00 16 mvi r11,22
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
800a868: 45 a1 00 0e be r13,r1,800a8a0 <_POSIX_Thread_Translate_sched_param+0x9c>
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
800a86c: b9 60 08 00 mv r1,r11
800a870: 2b 9d 00 04 lw ra,(sp+4)
800a874: 2b 8b 00 18 lw r11,(sp+24)
800a878: 2b 8c 00 14 lw r12,(sp+20)
800a87c: 2b 8d 00 10 lw r13,(sp+16)
800a880: 2b 8e 00 0c lw r14,(sp+12)
800a884: 2b 8f 00 08 lw r15,(sp+8)
800a888: 37 9c 00 18 addi sp,sp,24
800a88c: c3 a0 00 00 ret
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
800a890: 34 01 00 01 mvi r1,1
800a894: 59 c1 00 00 sw (r14+0),r1
return 0;
800a898: 34 0b 00 00 mvi r11,0
800a89c: e3 ff ff f4 bi 800a86c <_POSIX_Thread_Translate_sched_param+0x68>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
800a8a0: 29 81 00 08 lw r1,(r12+8)
800a8a4: 5c 20 00 03 bne r1,r0,800a8b0 <_POSIX_Thread_Translate_sched_param+0xac>
800a8a8: 29 82 00 0c lw r2,(r12+12)
800a8ac: 44 41 ff f0 be r2,r1,800a86c <_POSIX_Thread_Translate_sched_param+0x68>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
800a8b0: 29 81 00 10 lw r1,(r12+16)
800a8b4: 5c 20 00 04 bne r1,r0,800a8c4 <_POSIX_Thread_Translate_sched_param+0xc0>
800a8b8: 29 82 00 14 lw r2,(r12+20)
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
800a8bc: 34 0b 00 16 mvi r11,22
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
800a8c0: 44 41 ff eb be r2,r1,800a86c <_POSIX_Thread_Translate_sched_param+0x68>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
800a8c4: 35 81 00 08 addi r1,r12,8
800a8c8: fb ff f4 36 calli 80079a0 <_Timespec_To_ticks>
800a8cc: b8 20 68 00 mv r13,r1
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
800a8d0: 35 81 00 10 addi r1,r12,16
800a8d4: fb ff f4 33 calli 80079a0 <_Timespec_To_ticks>
return EINVAL;
800a8d8: 34 0b 00 16 mvi r11,22
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 ) <
800a8dc: 54 2d ff e4 bgu r1,r13,800a86c <_POSIX_Thread_Translate_sched_param+0x68>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
800a8e0: 29 81 00 04 lw r1,(r12+4)
800a8e4: fb ff ff c0 calli 800a7e4 <_POSIX_Priority_Is_valid>
800a8e8: 44 20 ff e1 be r1,r0,800a86c <_POSIX_Thread_Translate_sched_param+0x68>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
800a8ec: 78 01 08 00 mvhi r1,0x800
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
800a8f0: 34 02 00 03 mvi r2,3
800a8f4: 59 c2 00 00 sw (r14+0),r2
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
800a8f8: 38 21 3b e0 ori r1,r1,0x3be0
800a8fc: 59 e1 00 00 sw (r15+0),r1
return 0;
800a900: 34 0b 00 00 mvi r11,0
800a904: e3 ff ff da bi 800a86c <_POSIX_Thread_Translate_sched_param+0x68>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
800a908: 59 cd 00 00 sw (r14+0),r13
return 0;
800a90c: e3 ff ff d8 bi 800a86c <_POSIX_Thread_Translate_sched_param+0x68>
0800947c <_POSIX_Threads_Exitted_extension>:
* This method is invoked each time a thread exits.
*/
void _POSIX_Threads_Exitted_extension(
Thread_Control *executing
)
{
800947c: 37 9c ff f8 addi sp,sp,-8
8009480: 5b 8b 00 08 sw (sp+8),r11
8009484: 5b 9d 00 04 sw (sp+4),ra
8009488: b8 20 58 00 mv r11,r1
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
800948c: 28 21 00 08 lw r1,(r1+8)
8009490: 34 02 00 18 mvi r2,24
8009494: f8 00 23 76 calli 801226c <__lshrsi3>
8009498: 20 21 00 07 andi r1,r1,0x7
/*
* If the executing thread was not created with the POSIX API, then this
* API do not get to define its exit behavior.
*/
if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API )
800949c: 34 02 00 03 mvi r2,3
80094a0: 44 22 00 05 be r1,r2,80094b4 <_POSIX_Threads_Exitted_extension+0x38>
pthread_exit( executing->Wait.return_argument );
}
80094a4: 2b 9d 00 04 lw ra,(sp+4)
80094a8: 2b 8b 00 08 lw r11,(sp+8)
80094ac: 37 9c 00 08 addi sp,sp,8
80094b0: c3 a0 00 00 ret
/*
* If the executing thread was not created with the POSIX API, then this
* API do not get to define its exit behavior.
*/
if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API )
pthread_exit( executing->Wait.return_argument );
80094b4: 29 61 00 28 lw r1,(r11+40)
80094b8: f8 00 0c 87 calli 800c6d4 <pthread_exit>
}
80094bc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80094c0: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80094c4: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
80094c8: c3 a0 00 00 ret <== NOT EXECUTED
08003838 <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
8003838: 37 9c ff a8 addi sp,sp,-88
800383c: 5b 8b 00 14 sw (sp+20),r11
8003840: 5b 8c 00 10 sw (sp+16),r12
8003844: 5b 8d 00 0c sw (sp+12),r13
8003848: 5b 8e 00 08 sw (sp+8),r14
800384c: 5b 9d 00 04 sw (sp+4),ra
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;
8003850: 78 01 08 02 mvhi r1,0x802
8003854: 38 21 00 d8 ori r1,r1,0xd8
maximum = Configuration_POSIX_API.number_of_initialization_threads;
8003858: 28 2e 00 30 lw r14,(r1+48)
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;
800385c: 28 2c 00 34 lw r12,(r1+52)
maximum = Configuration_POSIX_API.number_of_initialization_threads;
if ( !user_threads || maximum == 0 )
8003860: 65 c2 00 00 cmpei r2,r14,0
8003864: 65 81 00 00 cmpei r1,r12,0
8003868: b8 41 08 00 or r1,r2,r1
800386c: 5c 20 00 15 bne r1,r0,80038c0 <_POSIX_Threads_Initialize_user_threads_body+0x88><== NEVER TAKEN
8003870: 34 0d 00 00 mvi r13,0
8003874: 37 8b 00 18 addi r11,sp,24
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
8003878: b9 60 08 00 mv r1,r11
800387c: f8 00 1c 25 calli 800a910 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
8003880: 34 02 00 02 mvi r2,2
8003884: b9 60 08 00 mv r1,r11
8003888: f8 00 1c 59 calli 800a9ec <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
800388c: 29 82 00 04 lw r2,(r12+4)
8003890: b9 60 08 00 mv r1,r11
8003894: f8 00 1c 62 calli 800aa1c <pthread_attr_setstacksize>
status = pthread_create(
8003898: 29 83 00 00 lw r3,(r12+0)
800389c: 37 81 00 58 addi r1,sp,88
80038a0: b9 60 10 00 mv r2,r11
80038a4: 34 04 00 00 mvi r4,0
80038a8: fb ff fe db calli 8003414 <pthread_create>
80038ac: b8 20 18 00 mv r3,r1
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
80038b0: 5c 20 00 0b bne r1,r0,80038dc <_POSIX_Threads_Initialize_user_threads_body+0xa4><== NEVER TAKEN
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
80038b4: 35 ad 00 01 addi r13,r13,1
80038b8: 35 8c 00 08 addi r12,r12,8
80038bc: 55 cd ff ef bgu r14,r13,8003878 <_POSIX_Threads_Initialize_user_threads_body+0x40><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
80038c0: 2b 9d 00 04 lw ra,(sp+4)
80038c4: 2b 8b 00 14 lw r11,(sp+20)
80038c8: 2b 8c 00 10 lw r12,(sp+16)
80038cc: 2b 8d 00 0c lw r13,(sp+12)
80038d0: 2b 8e 00 08 lw r14,(sp+8)
80038d4: 37 9c 00 58 addi sp,sp,88
80038d8: c3 a0 00 00 ret
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
80038dc: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
80038e0: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
80038e4: f8 00 07 5c calli 8005654 <_Internal_error_Occurred> <== NOT EXECUTED
080096c4 <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
80096c4: 37 9c ff f4 addi sp,sp,-12
80096c8: 5b 8b 00 0c sw (sp+12),r11
80096cc: 5b 8c 00 08 sw (sp+8),r12
80096d0: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
80096d4: 28 4c 01 20 lw r12,(r2+288)
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
80096d8: b8 40 58 00 mv r11,r2
the_thread = argument;
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 );
80096dc: 35 81 00 98 addi r1,r12,152
80096e0: f8 00 04 f5 calli 800aab4 <_Timespec_To_ticks>
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
80096e4: 78 03 08 01 mvhi r3,0x801
80096e8: 38 63 40 f0 ori r3,r3,0x40f0
80096ec: 29 84 00 88 lw r4,(r12+136)
80096f0: 40 62 00 00 lbu r2,(r3+0)
*/
#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 ) {
80096f4: 29 63 00 1c lw r3,(r11+28)
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;
80096f8: 59 61 00 78 sw (r11+120),r1
80096fc: c8 44 10 00 sub r2,r2,r4
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
8009700: 59 62 00 18 sw (r11+24),r2
*/
#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 ) {
8009704: 5c 60 00 06 bne r3,r0,800971c <_POSIX_Threads_Sporadic_budget_TSR+0x58><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
8009708: 29 61 00 14 lw r1,(r11+20)
800970c: 50 41 00 04 bgeu r2,r1,800971c <_POSIX_Threads_Sporadic_budget_TSR+0x58>
_Thread_Change_priority( the_thread, new_priority, true );
8009710: b9 60 08 00 mv r1,r11
8009714: 34 03 00 01 mvi r3,1
8009718: fb ff ef a2 calli 80055a0 <_Thread_Change_priority>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
800971c: 35 81 00 90 addi r1,r12,144
8009720: f8 00 04 e5 calli 800aab4 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8009724: 59 81 00 b4 sw (r12+180),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8009728: 78 01 08 01 mvhi r1,0x801
800972c: 35 82 00 a8 addi r2,r12,168
8009730: 38 21 49 c8 ori r1,r1,0x49c8
8009734: fb ff f5 5c calli 8006ca4 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
8009738: 2b 9d 00 04 lw ra,(sp+4)
800973c: 2b 8b 00 0c lw r11,(sp+12)
8009740: 2b 8c 00 08 lw r12,(sp+8)
8009744: 37 9c 00 0c addi sp,sp,12
8009748: c3 a0 00 00 ret
0800974c <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
800974c: 37 9c ff fc addi sp,sp,-4
8009750: 5b 9d 00 04 sw (sp+4),ra
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8009754: 28 22 01 20 lw r2,(r1+288)
8009758: 78 04 08 01 mvhi r4,0x801
800975c: 38 84 40 f0 ori r4,r4,0x40f0
8009760: 28 42 00 8c lw r2,(r2+140)
8009764: 40 84 00 00 lbu r4,(r4+0)
*/
#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 ) {
8009768: 28 25 00 1c lw r5,(r1+28)
800976c: c8 82 10 00 sub r2,r4,r2
/*
* 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 */
8009770: 34 04 ff ff mvi r4,-1
8009774: 58 24 00 78 sw (r1+120),r4
new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority);
the_thread->real_priority = new_priority;
8009778: 58 22 00 18 sw (r1+24),r2
*/
#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 ) {
800977c: 5c a0 00 05 bne r5,r0,8009790 <_POSIX_Threads_Sporadic_budget_callout+0x44><== 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 ) {
8009780: 28 23 00 14 lw r3,(r1+20)
8009784: 50 62 00 03 bgeu r3,r2,8009790 <_POSIX_Threads_Sporadic_budget_callout+0x44><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
8009788: 34 03 00 01 mvi r3,1
800978c: fb ff ef 85 calli 80055a0 <_Thread_Change_priority>
#if 0
printk( "lower priority\n" );
#endif
}
}
}
8009790: 2b 9d 00 04 lw ra,(sp+4)
8009794: 37 9c 00 04 addi sp,sp,4
8009798: c3 a0 00 00 ret
0800c1b0 <_POSIX_Threads_cancel_run>:
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
800c1b0: 37 9c ff ec addi sp,sp,-20
800c1b4: 5b 8b 00 14 sw (sp+20),r11
800c1b8: 5b 8c 00 10 sw (sp+16),r12
800c1bc: 5b 8d 00 0c sw (sp+12),r13
800c1c0: 5b 8e 00 08 sw (sp+8),r14
800c1c4: 5b 9d 00 04 sw (sp+4),ra
POSIX_Cancel_Handler_control *handler;
Chain_Control *handler_stack;
POSIX_API_Control *thread_support;
ISR_Level level;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
800c1c8: 28 2c 01 20 lw r12,(r1+288)
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
800c1cc: 34 01 00 01 mvi r1,1
while ( !_Chain_Is_empty( handler_stack ) ) {
800c1d0: 29 82 00 e4 lw r2,(r12+228)
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
800c1d4: 59 81 00 d8 sw (r12+216),r1
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800c1d8: 35 8d 00 e8 addi r13,r12,232
while ( !_Chain_Is_empty( handler_stack ) ) {
800c1dc: 44 4d 00 12 be r2,r13,800c224 <_POSIX_Threads_cancel_run+0x74>
_ISR_Disable( level );
800c1e0: 34 0e ff fe mvi r14,-2
800c1e4: 90 00 08 00 rcsr r1,IE
800c1e8: a0 2e 10 00 and r2,r1,r14
800c1ec: d0 02 00 00 wcsr IE,r2
handler = (POSIX_Cancel_Handler_control *)
800c1f0: 29 8b 00 ec lw r11,(r12+236)
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
800c1f4: 29 63 00 00 lw r3,(r11+0)
previous = the_node->previous;
800c1f8: 29 62 00 04 lw r2,(r11+4)
next->previous = previous;
800c1fc: 58 62 00 04 sw (r3+4),r2
previous->next = next;
800c200: 58 43 00 00 sw (r2+0),r3
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
800c204: d0 01 00 00 wcsr IE,r1
(*handler->routine)( handler->arg );
800c208: 29 62 00 08 lw r2,(r11+8)
800c20c: 29 61 00 0c lw r1,(r11+12)
800c210: d8 40 00 00 call r2
_Workspace_Free( handler );
800c214: b9 60 08 00 mv r1,r11
800c218: fb ff eb a8 calli 80070b8 <_Workspace_Free>
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
800c21c: 29 81 00 e4 lw r1,(r12+228)
800c220: 5c 2d ff f1 bne r1,r13,800c1e4 <_POSIX_Threads_cancel_run+0x34><== NEVER TAKEN
(*handler->routine)( handler->arg );
_Workspace_Free( handler );
}
}
800c224: 2b 9d 00 04 lw ra,(sp+4)
800c228: 2b 8b 00 14 lw r11,(sp+20)
800c22c: 2b 8c 00 10 lw r12,(sp+16)
800c230: 2b 8d 00 0c lw r13,(sp+12)
800c234: 2b 8e 00 08 lw r14,(sp+8)
800c238: 37 9c 00 14 addi sp,sp,20
800c23c: c3 a0 00 00 ret
080034f8 <_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)
{
80034f8: 37 9c ff f8 addi sp,sp,-8
80034fc: 5b 8b 00 08 sw (sp+8),r11
8003500: 5b 9d 00 04 sw (sp+4),ra
8003504: b8 40 58 00 mv r11,r2
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
8003508: 28 42 00 68 lw r2,(r2+104)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
800350c: 29 61 00 54 lw r1,(r11+84)
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
8003510: 34 42 00 01 addi r2,r2,1
8003514: 59 62 00 68 sw (r11+104),r2
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
8003518: 5c 20 00 0d bne r1,r0,800354c <_POSIX_Timer_TSR+0x54>
800351c: 29 62 00 58 lw r2,(r11+88)
8003520: 5c 41 00 0b bne r2,r1,800354c <_POSIX_Timer_TSR+0x54> <== ALWAYS TAKEN
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
8003524: 34 01 00 04 mvi r1,4 <== NOT EXECUTED
8003528: 31 61 00 3c sb (r11+60),r1 <== 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 ) ) {
800352c: 29 61 00 38 lw r1,(r11+56)
8003530: 29 62 00 44 lw r2,(r11+68)
8003534: f8 00 1a 32 calli 8009dfc <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
8003538: 59 60 00 68 sw (r11+104),r0
}
800353c: 2b 9d 00 04 lw ra,(sp+4)
8003540: 2b 8b 00 08 lw r11,(sp+8)
8003544: 37 9c 00 08 addi sp,sp,8
8003548: c3 a0 00 00 ret
ptimer->overrun = ptimer->overrun + 1;
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
800354c: 29 62 00 64 lw r2,(r11+100)
8003550: 29 63 00 08 lw r3,(r11+8)
8003554: 78 04 08 00 mvhi r4,0x800
8003558: 35 61 00 10 addi r1,r11,16
800355c: 38 84 34 f8 ori r4,r4,0x34f8
8003560: b9 60 28 00 mv r5,r11
8003564: f8 00 1b 84 calli 800a374 <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
8003568: 44 20 ff f5 be r1,r0,800353c <_POSIX_Timer_TSR+0x44> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
800356c: 35 61 00 6c addi r1,r11,108
8003570: f8 00 04 ad calli 8004824 <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
8003574: 34 01 00 03 mvi r1,3
8003578: 31 61 00 3c sb (r11+60),r1
800357c: e3 ff ff ec bi 800352c <_POSIX_Timer_TSR+0x34>
0800c318 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
800c318: 37 9c ff a0 addi sp,sp,-96
800c31c: 5b 8b 00 2c sw (sp+44),r11
800c320: 5b 8c 00 28 sw (sp+40),r12
800c324: 5b 8d 00 24 sw (sp+36),r13
800c328: 5b 8e 00 20 sw (sp+32),r14
800c32c: 5b 8f 00 1c sw (sp+28),r15
800c330: 5b 90 00 18 sw (sp+24),r16
800c334: 5b 91 00 14 sw (sp+20),r17
800c338: 5b 92 00 10 sw (sp+16),r18
800c33c: 5b 93 00 0c sw (sp+12),r19
800c340: 5b 94 00 08 sw (sp+8),r20
800c344: 5b 9d 00 04 sw (sp+4),ra
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,
800c348: 37 8e 00 58 addi r14,sp,88
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
800c34c: 20 64 00 ff andi r4,r3,0xff
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,
800c350: 34 05 00 01 mvi r5,1
800c354: b9 c0 18 00 mv r3,r14
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
800c358: b8 20 68 00 mv r13,r1
800c35c: b8 40 58 00 mv r11,r2
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,
800c360: f8 00 00 57 calli 800c4bc <_POSIX_signals_Clear_signals>
is_global, true ) )
return false;
800c364: 34 06 00 00 mvi r6,0
{
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,
800c368: 44 20 00 42 be r1,r0,800c470 <_POSIX_signals_Check_signal+0x158>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
800c36c: b5 6b 20 00 add r4,r11,r11
800c370: b4 8b 20 00 add r4,r4,r11
800c374: 78 05 08 01 mvhi r5,0x801
800c378: b4 84 20 00 add r4,r4,r4
800c37c: 38 a5 4e 00 ori r5,r5,0x4e00
800c380: b4 84 20 00 add r4,r4,r4
800c384: b4 a4 28 00 add r5,r5,r4
800c388: 28 a7 00 08 lw r7,(r5+8)
800c38c: 34 01 00 01 mvi r1,1
800c390: 44 e1 00 38 be r7,r1,800c470 <_POSIX_signals_Check_signal+0x158><== NEVER TAKEN
/*
* 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,
800c394: 78 0c 08 01 mvhi r12,0x801
800c398: 39 8c 4d b4 ori r12,r12,0x4db4
800c39c: 29 84 00 0c lw r4,(r12+12)
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
800c3a0: 29 af 00 d0 lw r15,(r13+208)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
800c3a4: 28 a1 00 04 lw r1,(r5+4)
/*
* 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,
800c3a8: 28 94 00 20 lw r20,(r4+32)
800c3ac: 28 93 00 24 lw r19,(r4+36)
800c3b0: 28 92 00 28 lw r18,(r4+40)
800c3b4: 28 91 00 2c lw r17,(r4+44)
800c3b8: 28 90 00 30 lw r16,(r4+48)
800c3bc: 28 8a 00 34 lw r10,(r4+52)
800c3c0: 28 89 00 38 lw r9,(r4+56)
800c3c4: 28 88 00 3c lw r8,(r4+60)
800c3c8: 28 86 00 40 lw r6,(r4+64)
800c3cc: 28 83 00 44 lw r3,(r4+68)
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
800c3d0: 28 a2 00 00 lw r2,(r5+0)
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
800c3d4: b8 2f 08 00 or r1,r1,r15
800c3d8: 59 a1 00 d0 sw (r13+208),r1
/*
* 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,
800c3dc: 5b 94 00 30 sw (sp+48),r20
800c3e0: 5b 93 00 34 sw (sp+52),r19
800c3e4: 5b 92 00 38 sw (sp+56),r18
800c3e8: 5b 91 00 3c sw (sp+60),r17
800c3ec: 5b 90 00 40 sw (sp+64),r16
800c3f0: 5b 8a 00 44 sw (sp+68),r10
800c3f4: 5b 89 00 48 sw (sp+72),r9
800c3f8: 5b 88 00 4c sw (sp+76),r8
800c3fc: 5b 86 00 50 sw (sp+80),r6
800c400: 5b 83 00 54 sw (sp+84),r3
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
800c404: 34 01 00 02 mvi r1,2
800c408: 44 41 00 28 be r2,r1,800c4a8 <_POSIX_signals_Check_signal+0x190>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
800c40c: b9 60 08 00 mv r1,r11
800c410: d8 e0 00 00 call r7
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
800c414: 29 82 00 0c lw r2,(r12+12)
800c418: 2b 81 00 30 lw r1,(sp+48)
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
800c41c: 34 06 00 01 mvi r6,1
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
800c420: 58 41 00 20 sw (r2+32),r1
800c424: 2b 81 00 34 lw r1,(sp+52)
800c428: 58 41 00 24 sw (r2+36),r1
800c42c: 2b 81 00 38 lw r1,(sp+56)
800c430: 58 41 00 28 sw (r2+40),r1
800c434: 2b 81 00 3c lw r1,(sp+60)
800c438: 58 41 00 2c sw (r2+44),r1
800c43c: 2b 81 00 40 lw r1,(sp+64)
800c440: 58 41 00 30 sw (r2+48),r1
800c444: 2b 81 00 44 lw r1,(sp+68)
800c448: 58 41 00 34 sw (r2+52),r1
800c44c: 2b 81 00 48 lw r1,(sp+72)
800c450: 58 41 00 38 sw (r2+56),r1
800c454: 2b 81 00 4c lw r1,(sp+76)
800c458: 58 41 00 3c sw (r2+60),r1
800c45c: 2b 81 00 50 lw r1,(sp+80)
800c460: 58 41 00 40 sw (r2+64),r1
800c464: 2b 81 00 54 lw r1,(sp+84)
800c468: 58 41 00 44 sw (r2+68),r1
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
800c46c: 59 af 00 d0 sw (r13+208),r15
return true;
}
800c470: b8 c0 08 00 mv r1,r6
800c474: 2b 9d 00 04 lw ra,(sp+4)
800c478: 2b 8b 00 2c lw r11,(sp+44)
800c47c: 2b 8c 00 28 lw r12,(sp+40)
800c480: 2b 8d 00 24 lw r13,(sp+36)
800c484: 2b 8e 00 20 lw r14,(sp+32)
800c488: 2b 8f 00 1c lw r15,(sp+28)
800c48c: 2b 90 00 18 lw r16,(sp+24)
800c490: 2b 91 00 14 lw r17,(sp+20)
800c494: 2b 92 00 10 lw r18,(sp+16)
800c498: 2b 93 00 0c lw r19,(sp+12)
800c49c: 2b 94 00 08 lw r20,(sp+8)
800c4a0: 37 9c 00 60 addi sp,sp,96
800c4a4: c3 a0 00 00 ret
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
800c4a8: b9 60 08 00 mv r1,r11
800c4ac: b9 c0 10 00 mv r2,r14
800c4b0: 34 03 00 00 mvi r3,0
800c4b4: d8 e0 00 00 call r7
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
800c4b8: e3 ff ff d7 bi 800c414 <_POSIX_signals_Check_signal+0xfc>
0800cc94 <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
800cc94: 37 9c ff f4 addi sp,sp,-12
800cc98: 5b 8b 00 0c sw (sp+12),r11
800cc9c: 5b 8c 00 08 sw (sp+8),r12
800cca0: 5b 9d 00 04 sw (sp+4),ra
800cca4: b8 20 10 00 mv r2,r1
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
800cca8: 90 00 60 00 rcsr r12,IE
800ccac: 34 01 ff fe mvi r1,-2
800ccb0: a1 81 08 00 and r1,r12,r1
800ccb4: d0 01 00 00 wcsr IE,r1
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
800ccb8: b4 42 20 00 add r4,r2,r2
800ccbc: b4 82 20 00 add r4,r4,r2
800ccc0: 78 01 08 01 mvhi r1,0x801
800ccc4: b4 84 18 00 add r3,r4,r4
800ccc8: 38 21 4e 00 ori r1,r1,0x4e00
800cccc: b4 63 18 00 add r3,r3,r3
800ccd0: b4 23 18 00 add r3,r1,r3
800ccd4: 28 63 00 00 lw r3,(r3+0)
800ccd8: 34 01 00 02 mvi r1,2
800ccdc: 44 61 00 10 be r3,r1,800cd1c <_POSIX_signals_Clear_process_signals+0x88>
800cce0: 34 42 ff ff addi r2,r2,-1
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
800cce4: 78 0b 08 01 mvhi r11,0x801
800cce8: 34 01 00 01 mvi r1,1
800ccec: f8 00 15 12 calli 8012134 <__ashlsi3>
800ccf0: 39 6b 4f f4 ori r11,r11,0x4ff4
800ccf4: 29 62 00 00 lw r2,(r11+0)
800ccf8: a4 20 08 00 not r1,r1
800ccfc: a0 22 08 00 and r1,r1,r2
800cd00: 59 61 00 00 sw (r11+0),r1
}
_ISR_Enable( level );
800cd04: d0 0c 00 00 wcsr IE,r12
}
800cd08: 2b 9d 00 04 lw ra,(sp+4)
800cd0c: 2b 8b 00 0c lw r11,(sp+12)
800cd10: 2b 8c 00 08 lw r12,(sp+8)
800cd14: 37 9c 00 0c addi sp,sp,12
800cd18: c3 a0 00 00 ret
800cd1c: 78 01 08 01 mvhi r1,0x801
800cd20: b4 84 20 00 add r4,r4,r4
800cd24: 38 21 4f f8 ori r1,r1,0x4ff8
800cd28: b4 84 20 00 add r4,r4,r4
800cd2c: b4 24 20 00 add r4,r1,r4
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
800cd30: 28 81 00 00 lw r1,(r4+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800cd34: 34 84 00 04 addi r4,r4,4
800cd38: 44 24 ff ea be r1,r4,800cce0 <_POSIX_signals_Clear_process_signals+0x4c><== ALWAYS TAKEN
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
}
_ISR_Enable( level );
800cd3c: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED
}
800cd40: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800cd44: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
800cd48: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
800cd4c: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800cd50: c3 a0 00 00 ret <== NOT EXECUTED
080041bc <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
80041bc: 37 9c ff f0 addi sp,sp,-16
80041c0: 5b 8b 00 10 sw (sp+16),r11
80041c4: 5b 8c 00 0c sw (sp+12),r12
80041c8: 5b 8d 00 08 sw (sp+8),r13
80041cc: 5b 9d 00 04 sw (sp+4),ra
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
80041d0: 34 0b 00 1b mvi r11,27
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
80041d4: b8 20 60 00 mv r12,r1
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
80041d8: 34 0d 00 20 mvi r13,32
80041dc: 35 62 ff ff addi r2,r11,-1
80041e0: 34 01 00 01 mvi r1,1
80041e4: f8 00 68 6a calli 801e38c <__ashlsi3>
if ( set & signo_to_mask( signo ) ) {
80041e8: a0 2c 08 00 and r1,r1,r12
80041ec: 5c 20 00 0d bne r1,r0,8004220 <_POSIX_signals_Get_lowest+0x64><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
80041f0: 35 6b 00 01 addi r11,r11,1
80041f4: 5d 6d ff fa bne r11,r13,80041dc <_POSIX_signals_Get_lowest+0x20>
80041f8: 34 0b 00 01 mvi r11,1
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
80041fc: 34 0d 00 1b mvi r13,27
8004200: e0 00 00 03 bi 800420c <_POSIX_signals_Get_lowest+0x50>
8004204: 35 6b 00 01 addi r11,r11,1
8004208: 45 6d 00 06 be r11,r13,8004220 <_POSIX_signals_Get_lowest+0x64><== NEVER TAKEN
800420c: 35 62 ff ff addi r2,r11,-1
8004210: 34 01 00 01 mvi r1,1
8004214: f8 00 68 5e calli 801e38c <__ashlsi3>
if ( set & signo_to_mask( signo ) ) {
8004218: a0 2c 10 00 and r2,r1,r12
800421c: 44 40 ff fa be r2,r0,8004204 <_POSIX_signals_Get_lowest+0x48>
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
8004220: b9 60 08 00 mv r1,r11
8004224: 2b 9d 00 04 lw ra,(sp+4)
8004228: 2b 8b 00 10 lw r11,(sp+16)
800422c: 2b 8c 00 0c lw r12,(sp+12)
8004230: 2b 8d 00 08 lw r13,(sp+8)
8004234: 37 9c 00 10 addi sp,sp,16
8004238: c3 a0 00 00 ret
08026d7c <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
8026d7c: 37 9c ff ec addi sp,sp,-20
8026d80: 5b 8b 00 14 sw (sp+20),r11
8026d84: 5b 8c 00 10 sw (sp+16),r12
8026d88: 5b 8d 00 0c sw (sp+12),r13
8026d8c: 5b 8e 00 08 sw (sp+8),r14
8026d90: 5b 9d 00 04 sw (sp+4),ra
8026d94: b8 20 58 00 mv r11,r1
8026d98: b8 40 70 00 mv r14,r2
8026d9c: 34 01 00 01 mvi r1,1
8026da0: 34 42 ff ff addi r2,r2,-1
8026da4: b8 60 68 00 mv r13,r3
8026da8: fb ff 6c f0 calli 8002168 <__ashlsi3>
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
8026dac: 78 02 08 02 mvhi r2,0x802
8026db0: 38 42 85 f8 ori r2,r2,0x85f8
8026db4: 29 64 00 10 lw r4,(r11+16)
8026db8: 28 43 00 00 lw r3,(r2+0)
{
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8026dbc: 29 65 01 20 lw r5,(r11+288)
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
8026dc0: a0 83 10 00 and r2,r4,r3
8026dc4: 44 43 00 21 be r2,r3,8026e48 <_POSIX_signals_Unblock_thread+0xcc>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
8026dc8: 28 a2 00 d0 lw r2,(r5+208)
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
8026dcc: 34 0c 00 00 mvi r12,0
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
8026dd0: a4 40 10 00 not r2,r2
8026dd4: a0 22 08 00 and r1,r1,r2
8026dd8: 44 20 00 14 be r1,r0,8026e28 <_POSIX_signals_Unblock_thread+0xac>
8026ddc: 78 01 10 00 mvhi r1,0x1000
8026de0: a0 81 08 00 and r1,r4,r1
* 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 ) ) {
8026de4: 44 20 00 31 be r1,r0,8026ea8 <_POSIX_signals_Unblock_thread+0x12c>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
8026de8: 78 03 08 02 mvhi r3,0x802
the_thread->Wait.return_code = EINTR;
8026dec: 34 01 00 04 mvi r1,4
8026df0: 38 63 83 a0 ori r3,r3,0x83a0
8026df4: 59 61 00 34 sw (r11+52),r1
8026df8: 28 61 00 00 lw r1,(r3+0)
8026dfc: a0 81 08 00 and r1,r4,r1
/*
* 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) )
8026e00: 5c 20 00 3a bne r1,r0,8026ee8 <_POSIX_signals_Unblock_thread+0x16c>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_delaying (
States_Control the_states
)
{
return (the_states & STATES_DELAYING);
8026e04: 20 84 00 08 andi r4,r4,0x8
_Thread_queue_Extract_with_proxy( the_thread );
else if ( _States_Is_delaying(the_thread->current_state) ) {
8026e08: 44 8c 00 08 be r4,r12,8026e28 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
8026e0c: 35 61 00 48 addi r1,r11,72
8026e10: fb ff 9c 76 calli 800dfe8 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
8026e14: 78 03 08 02 mvhi r3,0x802
8026e18: 38 63 82 04 ori r3,r3,0x8204
8026e1c: 28 62 00 00 lw r2,(r3+0)
8026e20: b9 60 08 00 mv r1,r11
8026e24: fb ff 96 5a calli 800c78c <_Thread_Clear_state>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
8026e28: b9 80 08 00 mv r1,r12
8026e2c: 2b 9d 00 04 lw ra,(sp+4)
8026e30: 2b 8b 00 14 lw r11,(sp+20)
8026e34: 2b 8c 00 10 lw r12,(sp+16)
8026e38: 2b 8d 00 0c lw r13,(sp+12)
8026e3c: 2b 8e 00 08 lw r14,(sp+8)
8026e40: 37 9c 00 14 addi sp,sp,20
8026e44: c3 a0 00 00 ret
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
8026e48: 29 62 00 30 lw r2,(r11+48)
8026e4c: a0 22 10 00 and r2,r1,r2
8026e50: 44 40 00 20 be r2,r0,8026ed0 <_POSIX_signals_Unblock_thread+0x154>
the_thread->Wait.return_code = EINTR;
8026e54: 34 01 00 04 mvi r1,4
8026e58: 59 61 00 34 sw (r11+52),r1
the_info = (siginfo_t *) the_thread->Wait.return_argument;
8026e5c: 29 61 00 28 lw r1,(r11+40)
if ( !info ) {
8026e60: 45 a0 00 25 be r13,r0,8026ef4 <_POSIX_signals_Unblock_thread+0x178>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
} else {
*the_info = *info;
8026e64: 29 a2 00 00 lw r2,(r13+0)
8026e68: 58 22 00 00 sw (r1+0),r2
8026e6c: 29 a2 00 04 lw r2,(r13+4)
8026e70: 58 22 00 04 sw (r1+4),r2
8026e74: 29 a2 00 08 lw r2,(r13+8)
8026e78: 58 22 00 08 sw (r1+8),r2
}
_Thread_queue_Extract_with_proxy( the_thread );
8026e7c: b9 60 08 00 mv r1,r11
8026e80: fb ff 99 83 calli 800d48c <_Thread_queue_Extract_with_proxy>
return true;
8026e84: 34 0c 00 01 mvi r12,1
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
8026e88: b9 80 08 00 mv r1,r12
8026e8c: 2b 9d 00 04 lw ra,(sp+4)
8026e90: 2b 8b 00 14 lw r11,(sp+20)
8026e94: 2b 8c 00 10 lw r12,(sp+16)
8026e98: 2b 8d 00 0c lw r13,(sp+12)
8026e9c: 2b 8e 00 08 lw r14,(sp+8)
8026ea0: 37 9c 00 14 addi sp,sp,20
8026ea4: c3 a0 00 00 ret
else if ( _States_Is_delaying(the_thread->current_state) ) {
(void) _Watchdog_Remove( &the_thread->Timer );
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
8026ea8: 5c 8c ff e0 bne r4,r12,8026e28 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
8026eac: 78 01 08 02 mvhi r1,0x802
8026eb0: 38 21 af 2c ori r1,r1,0xaf2c
8026eb4: 28 22 00 08 lw r2,(r1+8)
8026eb8: 44 4c ff dc be r2,r12,8026e28 <_POSIX_signals_Unblock_thread+0xac>
8026ebc: 28 22 00 0c lw r2,(r1+12)
8026ec0: 5d 62 ff da bne r11,r2,8026e28 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
8026ec4: 34 02 00 01 mvi r2,1
8026ec8: 30 22 00 18 sb (r1+24),r2
8026ecc: e3 ff ff d7 bi 8026e28 <_POSIX_signals_Unblock_thread+0xac>
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
8026ed0: 28 a2 00 d0 lw r2,(r5+208)
/*
* This should only be reached via pthread_kill().
*/
return false;
8026ed4: 34 0c 00 00 mvi r12,0
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
8026ed8: a4 40 10 00 not r2,r2
8026edc: a0 22 08 00 and r1,r1,r2
8026ee0: 5c 2c ff dd bne r1,r12,8026e54 <_POSIX_signals_Unblock_thread+0xd8>
8026ee4: e3 ff ff d1 bi 8026e28 <_POSIX_signals_Unblock_thread+0xac>
/*
* 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) )
_Thread_queue_Extract_with_proxy( the_thread );
8026ee8: b9 60 08 00 mv r1,r11
8026eec: fb ff 99 68 calli 800d48c <_Thread_queue_Extract_with_proxy>
8026ef0: e3 ff ff ce bi 8026e28 <_POSIX_signals_Unblock_thread+0xac>
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
the_info->si_code = SI_USER;
8026ef4: 34 02 00 01 mvi r2,1
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
8026ef8: 58 2e 00 00 sw (r1+0),r14
the_info->si_code = SI_USER;
8026efc: 58 22 00 04 sw (r1+4),r2
the_info->si_value.sival_int = 0;
8026f00: 58 20 00 08 sw (r1+8),r0
8026f04: e3 ff ff de bi 8026e7c <_POSIX_signals_Unblock_thread+0x100>
080031c0 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
80031c0: 37 9c ff e8 addi sp,sp,-24
80031c4: 5b 8b 00 14 sw (sp+20),r11
80031c8: 5b 8c 00 10 sw (sp+16),r12
80031cc: 5b 8d 00 0c sw (sp+12),r13
80031d0: 5b 8e 00 08 sw (sp+8),r14
80031d4: 5b 9d 00 04 sw (sp+4),ra
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
80031d8: 78 01 08 01 mvhi r1,0x801
80031dc: 38 21 40 bc ori r1,r1,0x40bc
80031e0: 28 2b 00 2c lw r11,(r1+44)
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
80031e4: 28 2e 00 28 lw r14,(r1+40)
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
80031e8: 45 60 00 15 be r11,r0,800323c <_RTEMS_tasks_Initialize_user_tasks_body+0x7c>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
80031ec: 45 c0 00 14 be r14,r0,800323c <_RTEMS_tasks_Initialize_user_tasks_body+0x7c><== NEVER TAKEN
80031f0: 34 0c 00 00 mvi r12,0
return_value = rtems_task_create(
80031f4: 29 61 00 00 lw r1,(r11+0)
80031f8: 29 62 00 08 lw r2,(r11+8)
80031fc: 29 63 00 04 lw r3,(r11+4)
8003200: 29 64 00 14 lw r4,(r11+20)
8003204: 29 65 00 0c lw r5,(r11+12)
8003208: 37 86 00 18 addi r6,sp,24
800320c: fb ff ff 52 calli 8002f54 <rtems_task_create>
8003210: b8 20 68 00 mv r13,r1
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
8003214: 5c 20 00 11 bne r1,r0,8003258 <_RTEMS_tasks_Initialize_user_tasks_body+0x98><== NEVER TAKEN
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
8003218: 29 63 00 18 lw r3,(r11+24)
800321c: 2b 81 00 18 lw r1,(sp+24)
8003220: 29 62 00 10 lw r2,(r11+16)
8003224: f8 00 00 14 calli 8003274 <rtems_task_start>
8003228: b8 20 18 00 mv r3,r1
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
800322c: 5c 2d 00 0f bne r1,r13,8003268 <_RTEMS_tasks_Initialize_user_tasks_body+0xa8><== NEVER TAKEN
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
8003230: 35 8c 00 01 addi r12,r12,1
8003234: 35 6b 00 1c addi r11,r11,28
8003238: 55 cc ff ef bgu r14,r12,80031f4 <_RTEMS_tasks_Initialize_user_tasks_body+0x34><== NEVER TAKEN
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
800323c: 2b 9d 00 04 lw ra,(sp+4)
8003240: 2b 8b 00 14 lw r11,(sp+20)
8003244: 2b 8c 00 10 lw r12,(sp+16)
8003248: 2b 8d 00 0c lw r13,(sp+12)
800324c: 2b 8e 00 08 lw r14,(sp+8)
8003250: 37 9c 00 18 addi sp,sp,24
8003254: c3 a0 00 00 ret
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
8003258: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
800325c: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8003260: b9 a0 18 00 mv r3,r13 <== NOT EXECUTED
8003264: f8 00 04 70 calli 8004424 <_Internal_error_Occurred> <== NOT EXECUTED
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
8003268: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
800326c: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8003270: f8 00 04 6d calli 8004424 <_Internal_error_Occurred> <== NOT EXECUTED
08009bb0 <_RTEMS_tasks_Switch_extension>:
/*
* Per Task Variables
*/
tvp = executing->task_variables;
8009bb0: 28 21 01 28 lw r1,(r1+296)
while (tvp) {
8009bb4: 44 20 00 08 be r1,r0,8009bd4 <_RTEMS_tasks_Switch_extension+0x24>
tvp->tval = *tvp->ptr;
8009bb8: 28 23 00 04 lw r3,(r1+4)
*tvp->ptr = tvp->gval;
8009bbc: 28 24 00 08 lw r4,(r1+8)
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
8009bc0: 28 65 00 00 lw r5,(r3+0)
8009bc4: 58 25 00 0c sw (r1+12),r5
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
8009bc8: 28 21 00 00 lw r1,(r1+0)
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
8009bcc: 58 64 00 00 sw (r3+0),r4
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
8009bd0: 5c 20 ff fa bne r1,r0,8009bb8 <_RTEMS_tasks_Switch_extension+0x8><== NEVER TAKEN
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
8009bd4: 28 41 01 28 lw r1,(r2+296)
while (tvp) {
8009bd8: 44 20 00 08 be r1,r0,8009bf8 <_RTEMS_tasks_Switch_extension+0x48>
tvp->gval = *tvp->ptr;
8009bdc: 28 22 00 04 lw r2,(r1+4)
*tvp->ptr = tvp->tval;
8009be0: 28 23 00 0c lw r3,(r1+12)
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
8009be4: 28 44 00 00 lw r4,(r2+0)
8009be8: 58 24 00 08 sw (r1+8),r4
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
8009bec: 28 21 00 00 lw r1,(r1+0)
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
8009bf0: 58 43 00 00 sw (r2+0),r3
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
8009bf4: 5c 20 ff fa bne r1,r0,8009bdc <_RTEMS_tasks_Switch_extension+0x2c><== NEVER TAKEN
8009bf8: c3 a0 00 00 ret
080048a8 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
80048a8: 37 9c ff f4 addi sp,sp,-12
80048ac: 5b 8b 00 08 sw (sp+8),r11
80048b0: 5b 9d 00 04 sw (sp+4),ra
80048b4: b8 20 10 00 mv r2,r1
80048b8: 78 01 08 02 mvhi r1,0x802
80048bc: 38 21 19 00 ori r1,r1,0x1900
80048c0: 37 83 00 0c addi r3,sp,12
80048c4: f8 00 09 2b calli 8006d70 <_Objects_Get>
/*
* When we get here, the Timer is already off the chain so we do not
* have to worry about that -- hence no _Watchdog_Remove().
*/
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
80048c8: 2b 82 00 0c lw r2,(sp+12)
80048cc: b8 20 58 00 mv r11,r1
80048d0: 44 40 00 05 be r2,r0,80048e4 <_Rate_monotonic_Timeout+0x3c><== ALWAYS TAKEN
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
80048d4: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80048d8: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80048dc: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
80048e0: c3 a0 00 00 ret <== NOT EXECUTED
*/
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_thread = the_period->owner;
80048e4: 28 21 00 40 lw r1,(r1+64)
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_PERIOD);
80048e8: 28 23 00 10 lw r3,(r1+16)
80048ec: 20 63 40 00 andi r3,r3,0x4000
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
80048f0: 44 62 00 04 be r3,r2,8004900 <_Rate_monotonic_Timeout+0x58>
80048f4: 28 23 00 20 lw r3,(r1+32)
80048f8: 29 62 00 08 lw r2,(r11+8)
80048fc: 44 62 00 1a be r3,r2,8004964 <_Rate_monotonic_Timeout+0xbc>
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
8004900: 29 62 00 38 lw r2,(r11+56)
8004904: 34 01 00 01 mvi r1,1
8004908: 44 41 00 0c be r2,r1,8004938 <_Rate_monotonic_Timeout+0x90><== NEVER TAKEN
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
800490c: 34 01 00 04 mvi r1,4
8004910: 59 61 00 38 sw (r11+56),r1
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
8004914: 78 01 08 02 mvhi r1,0x802
8004918: 38 21 1a 28 ori r1,r1,0x1a28
800491c: 28 22 00 00 lw r2,(r1+0)
8004920: 34 42 ff ff addi r2,r2,-1
8004924: 58 22 00 00 sw (r1+0),r2
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
8004928: 2b 9d 00 04 lw ra,(sp+4)
800492c: 2b 8b 00 08 lw r11,(sp+8)
8004930: 37 9c 00 0c addi sp,sp,12
8004934: c3 a0 00 00 ret
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
8004938: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
800493c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
8004940: 59 62 00 38 sw (r11+56),r2 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
8004944: fb ff fe 00 calli 8004144 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004948: 29 62 00 3c lw r2,(r11+60)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800494c: 78 01 08 02 mvhi r1,0x802
8004950: 38 21 1a e8 ori r1,r1,0x1ae8
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004954: 59 62 00 1c sw (r11+28),r2
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004958: 35 62 00 10 addi r2,r11,16
800495c: f8 00 12 22 calli 80091e4 <_Watchdog_Insert>
8004960: e3 ff ff ed bi 8004914 <_Rate_monotonic_Timeout+0x6c>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
8004964: 78 03 08 01 mvhi r3,0x801
8004968: 38 63 f5 84 ori r3,r3,0xf584
800496c: 28 62 00 00 lw r2,(r3+0)
8004970: f8 00 0c 03 calli 800797c <_Thread_Clear_state>
the_thread = the_period->owner;
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
8004974: b9 60 08 00 mv r1,r11
8004978: e3 ff ff f3 bi 8004944 <_Rate_monotonic_Timeout+0x9c>
080041f0 <_Rate_monotonic_Update_statistics>:
void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
80041f0: 37 9c ff e0 addi sp,sp,-32
80041f4: 5b 8b 00 10 sw (sp+16),r11
80041f8: 5b 8c 00 0c sw (sp+12),r12
80041fc: 5b 8d 00 08 sw (sp+8),r13
8004200: 5b 9d 00 04 sw (sp+4),ra
8004204: b8 20 58 00 mv r11,r1
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
8004208: 28 21 00 54 lw r1,(r1+84)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
800420c: 29 62 00 38 lw r2,(r11+56)
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
8004210: 34 21 00 01 addi r1,r1,1
8004214: 59 61 00 54 sw (r11+84),r1
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
8004218: 34 01 00 04 mvi r1,4
800421c: 44 41 00 36 be r2,r1,80042f4 <_Rate_monotonic_Update_statistics+0x104>
/*
* Grab status for time statistics.
*/
valid_status =
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
8004220: 37 8c 00 14 addi r12,sp,20
8004224: 37 8d 00 1c addi r13,sp,28
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
8004228: b9 60 08 00 mv r1,r11
800422c: b9 80 10 00 mv r2,r12
8004230: b9 a0 18 00 mv r3,r13
8004234: fb ff ff 8a calli 800405c <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
8004238: 5c 20 00 07 bne r1,r0,8004254 <_Rate_monotonic_Update_statistics+0x64><== ALWAYS TAKEN
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
800423c: 2b 9d 00 04 lw ra,(sp+4)
8004240: 2b 8b 00 10 lw r11,(sp+16)
8004244: 2b 8c 00 0c lw r12,(sp+12)
8004248: 2b 8d 00 08 lw r13,(sp+8)
800424c: 37 9c 00 20 addi sp,sp,32
8004250: c3 a0 00 00 ret
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
8004254: b9 a0 10 00 mv r2,r13
8004258: 35 61 00 6c addi r1,r11,108
800425c: f8 00 11 e4 calli 80089ec <_Timespec_Add_to>
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
8004260: b9 a0 08 00 mv r1,r13
8004264: 35 62 00 5c addi r2,r11,92
8004268: f8 00 12 cd calli 8008d9c <_Timespec_Less_than>
800426c: 44 20 00 05 be r1,r0,8004280 <_Rate_monotonic_Update_statistics+0x90>
stats->min_cpu_time = executed;
8004270: 2b 81 00 1c lw r1,(sp+28)
8004274: 59 61 00 5c sw (r11+92),r1
8004278: 2b 81 00 20 lw r1,(sp+32)
800427c: 59 61 00 60 sw (r11+96),r1
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
8004280: b9 a0 08 00 mv r1,r13
8004284: 35 62 00 64 addi r2,r11,100
8004288: f8 00 12 ba calli 8008d70 <_Timespec_Greater_than>
800428c: 44 20 00 05 be r1,r0,80042a0 <_Rate_monotonic_Update_statistics+0xb0>
stats->max_cpu_time = executed;
8004290: 2b 81 00 1c lw r1,(sp+28)
8004294: 59 61 00 64 sw (r11+100),r1
8004298: 2b 81 00 20 lw r1,(sp+32)
800429c: 59 61 00 68 sw (r11+104),r1
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
80042a0: b9 80 10 00 mv r2,r12
80042a4: 35 61 00 84 addi r1,r11,132
80042a8: f8 00 11 d1 calli 80089ec <_Timespec_Add_to>
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
80042ac: b9 80 08 00 mv r1,r12
80042b0: 35 62 00 74 addi r2,r11,116
80042b4: f8 00 12 ba calli 8008d9c <_Timespec_Less_than>
80042b8: 5c 20 00 13 bne r1,r0,8004304 <_Rate_monotonic_Update_statistics+0x114>
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
80042bc: b9 80 08 00 mv r1,r12
80042c0: 35 62 00 7c addi r2,r11,124
80042c4: f8 00 12 ab calli 8008d70 <_Timespec_Greater_than>
80042c8: 44 20 ff dd be r1,r0,800423c <_Rate_monotonic_Update_statistics+0x4c>
stats->max_wall_time = since_last_period;
80042cc: 2b 81 00 14 lw r1,(sp+20)
80042d0: 59 61 00 7c sw (r11+124),r1
80042d4: 2b 81 00 18 lw r1,(sp+24)
80042d8: 59 61 00 80 sw (r11+128),r1
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
80042dc: 2b 9d 00 04 lw ra,(sp+4)
80042e0: 2b 8b 00 10 lw r11,(sp+16)
80042e4: 2b 8c 00 0c lw r12,(sp+12)
80042e8: 2b 8d 00 08 lw r13,(sp+8)
80042ec: 37 9c 00 20 addi sp,sp,32
80042f0: c3 a0 00 00 ret
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
stats->missed_count++;
80042f4: 29 61 00 58 lw r1,(r11+88)
80042f8: 34 21 00 01 addi r1,r1,1
80042fc: 59 61 00 58 sw (r11+88),r1
8004300: e3 ff ff c8 bi 8004220 <_Rate_monotonic_Update_statistics+0x30>
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
stats->min_wall_time = since_last_period;
8004304: 2b 81 00 14 lw r1,(sp+20)
8004308: 59 61 00 74 sw (r11+116),r1
800430c: 2b 81 00 18 lw r1,(sp+24)
8004310: 59 61 00 78 sw (r11+120),r1
8004314: e3 ff ff ea bi 80042bc <_Rate_monotonic_Update_statistics+0xcc>
08004f78 <_Scheduler_priority_Block>:
)
{
Scheduler_priority_Per_thread *sched_info;
Chain_Control *ready;
sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info;
8004f78: 28 23 00 8c lw r3,(r1+140)
ready = sched_info->ready_chain;
8004f7c: 28 62 00 00 lw r2,(r3+0)
if ( _Chain_Has_only_one_node( ready ) ) {
8004f80: 28 45 00 00 lw r5,(r2+0)
8004f84: 28 44 00 08 lw r4,(r2+8)
8004f88: 44 a4 00 37 be r5,r4,8005064 <_Scheduler_priority_Block+0xec>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
8004f8c: 28 23 00 00 lw r3,(r1+0)
previous = the_node->previous;
8004f90: 28 22 00 04 lw r2,(r1+4)
next->previous = previous;
8004f94: 58 62 00 04 sw (r3+4),r2
previous->next = next;
8004f98: 58 43 00 00 sw (r2+0),r3
RTEMS_INLINE_ROUTINE bool _Thread_Is_heir (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Heir );
8004f9c: 78 02 08 01 mvhi r2,0x801
8004fa0: 38 42 4d b4 ori r2,r2,0x4db4
{
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
8004fa4: 28 43 00 10 lw r3,(r2+16)
8004fa8: 44 23 00 07 be r1,r3,8004fc4 <_Scheduler_priority_Block+0x4c>
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
8004fac: 28 43 00 0c lw r3,(r2+12)
8004fb0: 44 23 00 02 be r1,r3,8004fb8 <_Scheduler_priority_Block+0x40>
8004fb4: c3 a0 00 00 ret
_Thread_Dispatch_necessary = true;
8004fb8: 34 01 00 01 mvi r1,1
8004fbc: 30 41 00 18 sb (r2+24),r1
8004fc0: c3 a0 00 00 ret
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 );
8004fc4: 78 03 08 01 mvhi r3,0x801
8004fc8: 38 63 4d d0 ori r3,r3,0x4dd0
8004fcc: 2c 64 00 00 lhu r4,(r3+0)
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
(Chain_Control *) _Scheduler.information
8004fd0: 78 03 08 01 mvhi r3,0x801
8004fd4: 38 63 40 1c ori r3,r3,0x401c
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
8004fd8: 28 67 00 00 lw r7,(r3+0)
8004fdc: 20 84 ff ff andi r4,r4,0xffff
8004fe0: 34 03 00 ff mvi r3,255
8004fe4: 54 83 00 3c bgu r4,r3,80050d4 <_Scheduler_priority_Block+0x15c>
8004fe8: 78 05 08 01 mvhi r5,0x801
8004fec: 38 a5 35 58 ori r5,r5,0x3558
8004ff0: b4 a4 20 00 add r4,r5,r4
8004ff4: 40 84 00 00 lbu r4,(r4+0)
8004ff8: 34 84 00 08 addi r4,r4,8
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
8004ffc: 78 06 08 01 mvhi r6,0x801
8005000: 38 c6 4d d8 ori r6,r6,0x4dd8
8005004: b4 84 20 00 add r4,r4,r4
8005008: b4 c4 30 00 add r6,r6,r4
800500c: 2c c3 00 00 lhu r3,(r6+0)
8005010: 34 06 00 ff mvi r6,255
8005014: 54 66 00 25 bgu r3,r6,80050a8 <_Scheduler_priority_Block+0x130>
8005018: b4 a3 18 00 add r3,r5,r3
800501c: 40 65 00 00 lbu r5,(r3+0)
8005020: 34 a5 00 08 addi r5,r5,8
return (_Priority_Bits_index( major ) << 4) +
8005024: b4 84 18 00 add r3,r4,r4
8005028: b4 63 18 00 add r3,r3,r3
800502c: b4 63 18 00 add r3,r3,r3
8005030: b4 a3 18 00 add r3,r5,r3
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
8005034: b4 63 20 00 add r4,r3,r3
8005038: b4 83 18 00 add r3,r4,r3
800503c: b4 63 18 00 add r3,r3,r3
8005040: b4 63 18 00 add r3,r3,r3
8005044: b4 e3 18 00 add r3,r7,r3
}
8005048: 28 65 00 00 lw r5,(r3+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800504c: 34 63 00 04 addi r3,r3,4
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
8005050: 34 04 00 00 mvi r4,0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
8005054: 44 a3 00 02 be r5,r3,800505c <_Scheduler_priority_Block+0xe4><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
8005058: b8 a0 20 00 mv r4,r5
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
800505c: 58 44 00 10 sw (r2+16),r4
8005060: e3 ff ff d3 bi 8004fac <_Scheduler_priority_Block+0x34>
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
8005064: 28 64 00 04 lw r4,(r3+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 );
8005068: 34 45 00 04 addi r5,r2,4
head->next = tail;
800506c: 58 45 00 00 sw (r2+0),r5
head->previous = NULL;
8005070: 58 40 00 04 sw (r2+4),r0
tail->previous = head;
8005074: 58 42 00 08 sw (r2+8),r2
8005078: 2c 65 00 0e lhu r5,(r3+14)
800507c: 2c 82 00 00 lhu r2,(r4+0)
8005080: a0 45 10 00 and r2,r2,r5
8005084: 0c 82 00 00 sh (r4+0),r2
if ( *the_priority_map->minor == 0 )
8005088: 5c 40 ff c5 bne r2,r0,8004f9c <_Scheduler_priority_Block+0x24>
_Priority_Major_bit_map &= the_priority_map->block_major;
800508c: 78 02 08 01 mvhi r2,0x801
8005090: 38 42 4d d0 ori r2,r2,0x4dd0
8005094: 2c 44 00 00 lhu r4,(r2+0)
8005098: 2c 63 00 0c lhu r3,(r3+12)
800509c: a0 64 18 00 and r3,r3,r4
80050a0: 0c 43 00 00 sh (r2+0),r3
80050a4: e3 ff ff be bi 8004f9c <_Scheduler_priority_Block+0x24>
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
80050a8: 00 63 00 01 srui r3,r3,1
80050ac: 00 63 00 01 srui r3,r3,1
80050b0: 00 63 00 01 srui r3,r3,1
80050b4: 00 63 00 01 srui r3,r3,1
80050b8: 00 63 00 01 srui r3,r3,1
80050bc: 00 63 00 01 srui r3,r3,1
80050c0: 00 63 00 01 srui r3,r3,1
80050c4: 00 63 00 01 srui r3,r3,1
80050c8: b4 a3 18 00 add r3,r5,r3
80050cc: 40 65 00 00 lbu r5,(r3+0)
80050d0: e3 ff ff d5 bi 8005024 <_Scheduler_priority_Block+0xac>
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 );
80050d4: 00 84 00 01 srui r4,r4,1
80050d8: 78 05 08 01 mvhi r5,0x801
80050dc: 00 84 00 01 srui r4,r4,1
80050e0: 38 a5 35 58 ori r5,r5,0x3558
80050e4: 00 84 00 01 srui r4,r4,1
80050e8: 00 84 00 01 srui r4,r4,1
80050ec: 00 84 00 01 srui r4,r4,1
80050f0: 00 84 00 01 srui r4,r4,1
80050f4: 00 84 00 01 srui r4,r4,1
80050f8: 00 84 00 01 srui r4,r4,1
80050fc: b4 a4 20 00 add r4,r5,r4
8005100: 40 84 00 00 lbu r4,(r4+0)
8005104: e3 ff ff be bi 8004ffc <_Scheduler_priority_Block+0x84>
080052c8 <_Scheduler_priority_Schedule>:
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 );
80052c8: 78 01 08 01 mvhi r1,0x801
80052cc: 38 21 4d d0 ori r1,r1,0x4dd0
80052d0: 2c 22 00 00 lhu r2,(r1+0)
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
(Chain_Control *) _Scheduler.information
80052d4: 78 01 08 01 mvhi r1,0x801
80052d8: 38 21 40 1c ori r1,r1,0x401c
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
80052dc: 28 25 00 00 lw r5,(r1+0)
80052e0: 20 42 ff ff andi r2,r2,0xffff
80052e4: 34 01 00 ff mvi r1,255
80052e8: 54 41 00 2d bgu r2,r1,800539c <_Scheduler_priority_Schedule+0xd4>
80052ec: 78 03 08 01 mvhi r3,0x801
80052f0: 38 63 35 58 ori r3,r3,0x3558
80052f4: b4 62 10 00 add r2,r3,r2
80052f8: 40 42 00 00 lbu r2,(r2+0)
80052fc: 34 42 00 08 addi r2,r2,8
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
8005300: 78 04 08 01 mvhi r4,0x801
8005304: 38 84 4d d8 ori r4,r4,0x4dd8
8005308: b4 42 10 00 add r2,r2,r2
800530c: b4 82 20 00 add r4,r4,r2
8005310: 2c 81 00 00 lhu r1,(r4+0)
8005314: 34 04 00 ff mvi r4,255
8005318: 54 24 00 16 bgu r1,r4,8005370 <_Scheduler_priority_Schedule+0xa8>
800531c: b4 61 08 00 add r1,r3,r1
8005320: 40 23 00 00 lbu r3,(r1+0)
8005324: 34 63 00 08 addi r3,r3,8
return (_Priority_Bits_index( major ) << 4) +
8005328: b4 42 08 00 add r1,r2,r2
800532c: b4 21 08 00 add r1,r1,r1
8005330: b4 21 08 00 add r1,r1,r1
8005334: b4 61 08 00 add r1,r3,r1
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
8005338: b4 21 10 00 add r2,r1,r1
800533c: b4 41 08 00 add r1,r2,r1
8005340: b4 21 08 00 add r1,r1,r1
8005344: b4 21 08 00 add r1,r1,r1
8005348: b4 a1 08 00 add r1,r5,r1
#include <rtems/score/schedulerpriority.h>
void _Scheduler_priority_Schedule(void)
{
_Scheduler_priority_Schedule_body();
}
800534c: 28 23 00 00 lw r3,(r1+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8005350: 34 21 00 04 addi r1,r1,4
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
8005354: 34 02 00 00 mvi r2,0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
8005358: 44 61 00 02 be r3,r1,8005360 <_Scheduler_priority_Schedule+0x98><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
800535c: b8 60 10 00 mv r2,r3
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
8005360: 78 01 08 01 mvhi r1,0x801
8005364: 38 21 4d b4 ori r1,r1,0x4db4
8005368: 58 22 00 10 sw (r1+16),r2
800536c: c3 a0 00 00 ret
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
8005370: 00 21 00 01 srui r1,r1,1
8005374: 00 21 00 01 srui r1,r1,1
8005378: 00 21 00 01 srui r1,r1,1
800537c: 00 21 00 01 srui r1,r1,1
8005380: 00 21 00 01 srui r1,r1,1
8005384: 00 21 00 01 srui r1,r1,1
8005388: 00 21 00 01 srui r1,r1,1
800538c: 00 21 00 01 srui r1,r1,1
8005390: b4 61 08 00 add r1,r3,r1
8005394: 40 23 00 00 lbu r3,(r1+0)
8005398: e3 ff ff e4 bi 8005328 <_Scheduler_priority_Schedule+0x60>
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 );
800539c: 00 42 00 01 srui r2,r2,1
80053a0: 78 03 08 01 mvhi r3,0x801
80053a4: 00 42 00 01 srui r2,r2,1
80053a8: 38 63 35 58 ori r3,r3,0x3558
80053ac: 00 42 00 01 srui r2,r2,1
80053b0: 00 42 00 01 srui r2,r2,1
80053b4: 00 42 00 01 srui r2,r2,1
80053b8: 00 42 00 01 srui r2,r2,1
80053bc: 00 42 00 01 srui r2,r2,1
80053c0: 00 42 00 01 srui r2,r2,1
80053c4: b4 62 10 00 add r2,r3,r2
80053c8: 40 42 00 00 lbu r2,(r2+0)
80053cc: e3 ff ff cd bi 8005300 <_Scheduler_priority_Schedule+0x38>
08003e68 <_TOD_Tickle_ticks>:
*
* Output parameters: NONE
*/
void _TOD_Tickle_ticks( void )
{
8003e68: 37 9c ff ec addi sp,sp,-20
8003e6c: 5b 8b 00 0c sw (sp+12),r11
8003e70: 5b 8c 00 08 sw (sp+8),r12
8003e74: 5b 9d 00 04 sw (sp+4),ra
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003e78: 78 01 08 01 mvhi r1,0x801
8003e7c: 38 21 40 f4 ori r1,r1,0x40f4
8003e80: 28 21 00 0c lw r1,(r1+12)
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003e84: 78 03 08 01 mvhi r3,0x801
8003e88: 38 63 4a 18 ori r3,r3,0x4a18
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003e8c: b4 21 08 00 add r1,r1,r1
8003e90: b4 21 08 00 add r1,r1,r1
8003e94: b4 21 08 00 add r1,r1,r1
8003e98: b4 21 10 00 add r2,r1,r1
8003e9c: b4 42 10 00 add r2,r2,r2
8003ea0: b4 22 08 00 add r1,r1,r2
8003ea4: b4 21 10 00 add r2,r1,r1
8003ea8: b4 42 10 00 add r2,r2,r2
8003eac: b4 22 08 00 add r1,r1,r2
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003eb0: 28 65 00 00 lw r5,(r3+0)
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003eb4: b4 21 20 00 add r4,r1,r1
8003eb8: b4 84 20 00 add r4,r4,r4
8003ebc: b4 24 20 00 add r4,r1,r4
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003ec0: 37 8b 00 10 addi r11,sp,16
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003ec4: 34 a5 00 01 addi r5,r5,1
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003ec8: 78 01 08 01 mvhi r1,0x801
8003ecc: b9 60 10 00 mv r2,r11
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003ed0: 58 65 00 00 sw (r3+0),r5
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003ed4: 38 21 49 84 ori r1,r1,0x4984
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003ed8: 5b 84 00 14 sw (sp+20),r4
8003edc: 5b 80 00 10 sw (sp+16),r0
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003ee0: f8 00 0a 38 calli 80067c0 <_Timespec_Add_to>
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
8003ee4: 78 01 08 01 mvhi r1,0x801
8003ee8: b9 60 10 00 mv r2,r11
8003eec: 38 21 49 90 ori r1,r1,0x4990
8003ef0: f8 00 0a 34 calli 80067c0 <_Timespec_Add_to>
8003ef4: b8 20 58 00 mv r11,r1
while ( seconds ) {
8003ef8: 44 20 00 07 be r1,r0,8003f14 <_TOD_Tickle_ticks+0xac>
8003efc: 78 0c 08 01 mvhi r12,0x801
8003f00: 39 8c 49 bc ori r12,r12,0x49bc
_Watchdog_Tickle_seconds();
seconds--;
8003f04: 35 6b ff ff addi r11,r11,-1
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
{
_Watchdog_Tickle( &_Watchdog_Seconds_chain );
8003f08: b9 80 08 00 mv r1,r12
8003f0c: f8 00 0c 06 calli 8006f24 <_Watchdog_Tickle>
_Timestamp_Add_to( &_TOD_Uptime, &tick );
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
while ( seconds ) {
8003f10: 5d 60 ff fd bne r11,r0,8003f04 <_TOD_Tickle_ticks+0x9c> <== NEVER TAKEN
_Watchdog_Tickle_seconds();
seconds--;
}
}
8003f14: 2b 9d 00 04 lw ra,(sp+4)
8003f18: 2b 8b 00 0c lw r11,(sp+12)
8003f1c: 2b 8c 00 08 lw r12,(sp+8)
8003f20: 37 9c 00 14 addi sp,sp,20
8003f24: c3 a0 00 00 ret
080044a0 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
80044a0: 37 9c ff f4 addi sp,sp,-12
80044a4: 5b 8b 00 0c sw (sp+12),r11
80044a8: 5b 8c 00 08 sw (sp+8),r12
80044ac: 5b 9d 00 04 sw (sp+4),ra
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
80044b0: 78 02 08 02 mvhi r2,0x802
80044b4: 38 42 20 f4 ori r2,r2,0x20f4
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
80044b8: b8 20 58 00 mv r11,r1
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
80044bc: 28 42 00 0c lw r2,(r2+12)
(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;
80044c0: 34 0c 00 00 mvi r12,0
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) ||
80044c4: 44 20 00 22 be r1,r0,800454c <_TOD_Validate+0xac> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
80044c8: 78 03 08 01 mvhi r3,0x801
80044cc: 38 63 f6 18 ori r3,r3,0xf618
80044d0: 28 61 00 00 lw r1,(r3+0)
80044d4: f8 00 66 98 calli 801df34 <__udivsi3>
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
80044d8: 29 62 00 18 lw r2,(r11+24)
80044dc: 50 41 00 1c bgeu r2,r1,800454c <_TOD_Validate+0xac>
(the_tod->ticks >= ticks_per_second) ||
80044e0: 29 62 00 14 lw r2,(r11+20)
80044e4: 34 01 00 3b mvi r1,59
80044e8: 54 41 00 19 bgu r2,r1,800454c <_TOD_Validate+0xac>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
80044ec: 29 62 00 10 lw r2,(r11+16)
80044f0: 54 41 00 17 bgu r2,r1,800454c <_TOD_Validate+0xac>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
80044f4: 29 62 00 0c lw r2,(r11+12)
80044f8: 34 01 00 17 mvi r1,23
80044fc: 54 41 00 14 bgu r2,r1,800454c <_TOD_Validate+0xac>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
8004500: 29 61 00 04 lw r1,(r11+4)
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) ||
8004504: 44 20 00 12 be r1,r0,800454c <_TOD_Validate+0xac> <== NEVER TAKEN
(the_tod->month == 0) ||
8004508: 34 02 00 0c mvi r2,12
800450c: 54 22 00 10 bgu r1,r2,800454c <_TOD_Validate+0xac>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
8004510: 29 62 00 00 lw r2,(r11+0)
(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) ||
8004514: 34 03 07 c3 mvi r3,1987
8004518: 50 62 00 0d bgeu r3,r2,800454c <_TOD_Validate+0xac>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
800451c: 29 63 00 08 lw r3,(r11+8)
(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) ||
8004520: 44 60 00 0b be r3,r0,800454c <_TOD_Validate+0xac> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
8004524: 20 42 00 03 andi r2,r2,0x3
8004528: 5c 40 00 02 bne r2,r0,8004530 <_TOD_Validate+0x90>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
800452c: 34 21 00 0d addi r1,r1,13
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
8004530: 78 02 08 01 mvhi r2,0x801
8004534: b4 21 08 00 add r1,r1,r1
8004538: 38 42 fe c8 ori r2,r2,0xfec8
800453c: b4 21 08 00 add r1,r1,r1
8004540: b4 41 08 00 add r1,r2,r1
8004544: 28 2c 00 00 lw r12,(r1+0)
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
8004548: f1 83 60 00 cmpgeu r12,r12,r3
if ( the_tod->day > days_in_month )
return false;
return true;
}
800454c: b9 80 08 00 mv r1,r12
8004550: 2b 9d 00 04 lw ra,(sp+4)
8004554: 2b 8b 00 0c lw r11,(sp+12)
8004558: 2b 8c 00 08 lw r12,(sp+8)
800455c: 37 9c 00 0c addi sp,sp,12
8004560: c3 a0 00 00 ret
080055a0 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
80055a0: 37 9c ff e4 addi sp,sp,-28
80055a4: 5b 8b 00 1c sw (sp+28),r11
80055a8: 5b 8c 00 18 sw (sp+24),r12
80055ac: 5b 8d 00 14 sw (sp+20),r13
80055b0: 5b 8e 00 10 sw (sp+16),r14
80055b4: 5b 8f 00 0c sw (sp+12),r15
80055b8: 5b 90 00 08 sw (sp+8),r16
80055bc: 5b 9d 00 04 sw (sp+4),ra
80055c0: b8 20 58 00 mv r11,r1
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
80055c4: 28 2f 00 10 lw r15,(r1+16)
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
80055c8: b8 40 60 00 mv r12,r2
80055cc: 20 70 00 ff andi r16,r3,0xff
/*
* 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 );
80055d0: f8 00 03 e5 calli 8006564 <_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 )
80055d4: 29 61 00 14 lw r1,(r11+20)
80055d8: 44 2c 00 04 be r1,r12,80055e8 <_Thread_Change_priority+0x48>
_Thread_Set_priority( the_thread, new_priority );
80055dc: b9 60 08 00 mv r1,r11
80055e0: b9 80 10 00 mv r2,r12
80055e4: f8 00 03 bc calli 80064d4 <_Thread_Set_priority>
_ISR_Disable( level );
80055e8: 90 00 60 00 rcsr r12,IE
80055ec: 34 0d ff fe mvi r13,-2
80055f0: a1 8d 68 00 and r13,r12,r13
80055f4: d0 0d 00 00 wcsr IE,r13
/*
* 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;
80055f8: 29 61 00 10 lw r1,(r11+16)
if ( state != STATES_TRANSIENT ) {
80055fc: 34 02 00 04 mvi r2,4
8005600: 44 22 00 1f be r1,r2,800567c <_Thread_Change_priority+0xdc>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_transient (
States_Control the_states
)
{
return (the_states & STATES_TRANSIENT);
8005604: 21 ef 00 04 andi r15,r15,0x4
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
8005608: 45 e0 00 10 be r15,r0,8005648 <_Thread_Change_priority+0xa8><== ALWAYS TAKEN
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
800560c: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
8005610: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED
8005614: 38 63 36 c0 ori r3,r3,0x36c0 <== NOT EXECUTED
8005618: 28 62 00 00 lw r2,(r3+0) <== NOT EXECUTED
800561c: a0 22 08 00 and r1,r1,r2 <== NOT EXECUTED
if ( _States_Is_waiting_on_thread_queue( state ) ) {
8005620: 5c 20 00 13 bne r1,r0,800566c <_Thread_Change_priority+0xcc><== NOT EXECUTED
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
8005624: 2b 9d 00 04 lw ra,(sp+4)
8005628: 2b 8b 00 1c lw r11,(sp+28)
800562c: 2b 8c 00 18 lw r12,(sp+24)
8005630: 2b 8d 00 14 lw r13,(sp+20)
8005634: 2b 8e 00 10 lw r14,(sp+16)
8005638: 2b 8f 00 0c lw r15,(sp+12)
800563c: 2b 90 00 08 lw r16,(sp+8)
8005640: 37 9c 00 1c addi sp,sp,28
8005644: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
8005648: 34 02 ff fb mvi r2,-5
800564c: a0 22 10 00 and r2,r1,r2
*/
state = the_thread->current_state;
if ( state != STATES_TRANSIENT ) {
/* 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 );
8005650: 59 62 00 10 sw (r11+16),r2
_ISR_Enable( level );
8005654: d0 0c 00 00 wcsr IE,r12
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
8005658: 78 03 08 01 mvhi r3,0x801
800565c: 38 63 36 c0 ori r3,r3,0x36c0
8005660: 28 62 00 00 lw r2,(r3+0)
8005664: a0 22 08 00 and r1,r1,r2
if ( _States_Is_waiting_on_thread_queue( state ) ) {
8005668: 44 20 ff ef be r1,r0,8005624 <_Thread_Change_priority+0x84>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
800566c: 29 61 00 44 lw r1,(r11+68)
8005670: b9 60 10 00 mv r2,r11
8005674: f8 00 03 5b calli 80063e0 <_Thread_queue_Requeue>
8005678: e3 ff ff eb bi 8005624 <_Thread_Change_priority+0x84>
800567c: 78 0e 08 01 mvhi r14,0x801
*/
RTEMS_INLINE_ROUTINE bool _States_Is_transient (
States_Control the_states
)
{
return (the_states & STATES_TRANSIENT);
8005680: 21 ef 00 04 andi r15,r15,0x4
8005684: 39 ce 40 1c ori r14,r14,0x401c
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
8005688: 5d e0 00 06 bne r15,r0,80056a0 <_Thread_Change_priority+0x100><== 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 );
800568c: 59 60 00 10 sw (r11+16),r0
if ( prepend_it )
8005690: 46 0f 00 13 be r16,r15,80056dc <_Thread_Change_priority+0x13c>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
8005694: 29 c2 00 28 lw r2,(r14+40)
8005698: b9 60 08 00 mv r1,r11
800569c: d8 40 00 00 call r2
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
80056a0: d0 0c 00 00 wcsr IE,r12
80056a4: d0 0d 00 00 wcsr IE,r13
* 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();
80056a8: 29 c1 00 08 lw r1,(r14+8)
80056ac: d8 20 00 00 call r1
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
80056b0: 78 01 08 01 mvhi r1,0x801
80056b4: 38 21 4d b4 ori r1,r1,0x4db4
80056b8: 28 22 00 0c lw r2,(r1+12)
* 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() &&
80056bc: 28 23 00 10 lw r3,(r1+16)
80056c0: 44 43 00 05 be r2,r3,80056d4 <_Thread_Change_priority+0x134>
80056c4: 40 42 00 74 lbu r2,(r2+116)
80056c8: 44 40 00 03 be r2,r0,80056d4 <_Thread_Change_priority+0x134>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
80056cc: 34 02 00 01 mvi r2,1
80056d0: 30 22 00 18 sb (r1+24),r2
_ISR_Enable( level );
80056d4: d0 0c 00 00 wcsr IE,r12
80056d8: e3 ff ff d3 bi 8005624 <_Thread_Change_priority+0x84>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
80056dc: 29 c2 00 24 lw r2,(r14+36)
80056e0: b9 60 08 00 mv r1,r11
80056e4: d8 40 00 00 call r2
80056e8: e3 ff ff ee bi 80056a0 <_Thread_Change_priority+0x100>
0800c9cc <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
800c9cc: 37 9c ff f8 addi sp,sp,-8
800c9d0: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
800c9d4: 37 82 00 08 addi r2,sp,8
800c9d8: f8 00 00 8a calli 800cc00 <_Thread_Get>
switch ( location ) {
800c9dc: 2b 82 00 08 lw r2,(sp+8)
800c9e0: 5c 40 00 0a bne r2,r0,800ca08 <_Thread_Delay_ended+0x3c> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
800c9e4: 78 03 08 02 mvhi r3,0x802
800c9e8: 38 63 83 a8 ori r3,r3,0x83a8
800c9ec: 28 62 00 00 lw r2,(r3+0)
800c9f0: fb ff ff 67 calli 800c78c <_Thread_Clear_state>
800c9f4: 78 01 08 02 mvhi r1,0x802
800c9f8: 38 21 aa 80 ori r1,r1,0xaa80
800c9fc: 28 22 00 00 lw r2,(r1+0)
800ca00: 34 42 ff ff addi r2,r2,-1
800ca04: 58 22 00 00 sw (r1+0),r2
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
800ca08: 2b 9d 00 04 lw ra,(sp+4)
800ca0c: 37 9c 00 08 addi sp,sp,8
800ca10: c3 a0 00 00 ret
080058bc <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
80058bc: 37 9c ff bc addi sp,sp,-68
80058c0: 5b 8b 00 34 sw (sp+52),r11
80058c4: 5b 8c 00 30 sw (sp+48),r12
80058c8: 5b 8d 00 2c sw (sp+44),r13
80058cc: 5b 8e 00 28 sw (sp+40),r14
80058d0: 5b 8f 00 24 sw (sp+36),r15
80058d4: 5b 90 00 20 sw (sp+32),r16
80058d8: 5b 91 00 1c sw (sp+28),r17
80058dc: 5b 92 00 18 sw (sp+24),r18
80058e0: 5b 93 00 14 sw (sp+20),r19
80058e4: 5b 94 00 10 sw (sp+16),r20
80058e8: 5b 95 00 0c sw (sp+12),r21
80058ec: 5b 96 00 08 sw (sp+8),r22
80058f0: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
80058f4: 78 01 08 01 mvhi r1,0x801
80058f8: 38 21 4d b4 ori r1,r1,0x4db4
80058fc: 28 2c 00 0c lw r12,(r1+12)
_ISR_Disable( level );
8005900: 90 00 08 00 rcsr r1,IE
8005904: 34 02 ff fe mvi r2,-2
8005908: a0 22 10 00 and r2,r1,r2
800590c: d0 02 00 00 wcsr IE,r2
while ( _Thread_Dispatch_necessary == true ) {
8005910: 78 0e 08 01 mvhi r14,0x801
8005914: 39 ce 4d b4 ori r14,r14,0x4db4
8005918: 41 c2 00 18 lbu r2,(r14+24)
800591c: 78 10 08 01 mvhi r16,0x801
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
8005920: b8 20 20 00 mv r4,r1
while ( _Thread_Dispatch_necessary == true ) {
8005924: 20 42 00 ff andi r2,r2,0xff
8005928: 3a 10 49 08 ori r16,r16,0x4908
800592c: 44 40 00 40 be r2,r0,8005a2c <_Thread_Dispatch+0x170>
heir = _Thread_Heir;
8005930: 29 cb 00 10 lw r11,(r14+16)
_Thread_Dispatch_disable_level = 1;
8005934: 34 02 00 01 mvi r2,1
8005938: 5a 02 00 00 sw (r16+0),r2
_Thread_Dispatch_necessary = false;
800593c: 31 c0 00 18 sb (r14+24),r0
_Thread_Executing = heir;
8005940: 59 cb 00 0c sw (r14+12),r11
/*
* 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 )
8005944: 45 8b 00 3a be r12,r11,8005a2c <_Thread_Dispatch+0x170>
8005948: 78 0f 08 01 mvhi r15,0x801
800594c: 78 14 08 01 mvhi r20,0x801
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8005950: 78 15 08 01 mvhi r21,0x801
8005954: 37 92 00 40 addi r18,sp,64
8005958: 39 ef 49 b4 ori r15,r15,0x49b4
800595c: 37 91 00 38 addi r17,sp,56
8005960: 3a 94 49 8c ori r20,r20,0x498c
*/
#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 )
8005964: 34 13 00 01 mvi r19,1
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8005968: 3a b5 48 a0 ori r21,r21,0x48a0
#endif
#endif
executing = _Thread_Executing;
_ISR_Disable( level );
800596c: 34 16 ff fe mvi r22,-2
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
8005970: b9 c0 68 00 mv r13,r14
8005974: e0 00 00 29 bi 8005a18 <_Thread_Dispatch+0x15c>
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
_ISR_Enable( level );
8005978: d0 01 00 00 wcsr IE,r1
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
800597c: ba 40 08 00 mv r1,r18
8005980: f8 00 11 eb calli 800a12c <_TOD_Get_uptime>
_Timestamp_Subtract(
8005984: ba 20 18 00 mv r3,r17
8005988: b9 e0 08 00 mv r1,r15
800598c: ba 40 10 00 mv r2,r18
8005990: f8 00 03 a3 calli 800681c <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
8005994: ba 20 10 00 mv r2,r17
8005998: 35 81 00 84 addi r1,r12,132
800599c: f8 00 03 89 calli 80067c0 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
80059a0: 2b 83 00 40 lw r3,(sp+64)
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
80059a4: 2a 84 00 00 lw r4,(r20+0)
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
80059a8: b9 80 08 00 mv r1,r12
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
80059ac: 59 e3 00 00 sw (r15+0),r3
80059b0: 2b 83 00 44 lw r3,(sp+68)
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
80059b4: b9 60 10 00 mv r2,r11
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
80059b8: 59 e3 00 04 sw (r15+4),r3
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
80059bc: 44 80 00 05 be r4,r0,80059d0 <_Thread_Dispatch+0x114> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
80059c0: 28 83 00 00 lw r3,(r4+0)
80059c4: 59 83 01 18 sw (r12+280),r3
*_Thread_libc_reent = heir->libc_reent;
80059c8: 29 63 01 18 lw r3,(r11+280)
80059cc: 58 83 00 00 sw (r4+0),r3
}
_User_extensions_Thread_switch( executing, heir );
80059d0: f8 00 04 9a calli 8006c38 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
80059d4: 35 81 00 c4 addi r1,r12,196
80059d8: 35 62 00 c4 addi r2,r11,196
80059dc: f8 00 05 cf calli 8007118 <_CPU_Context_switch>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
80059e0: 29 cc 00 0c lw r12,(r14+12)
_ISR_Disable( level );
80059e4: 90 00 20 00 rcsr r4,IE
80059e8: a0 96 08 00 and r1,r4,r22
80059ec: d0 01 00 00 wcsr IE,r1
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
80059f0: 41 a2 00 18 lbu r2,(r13+24)
80059f4: b9 a0 70 00 mv r14,r13
#endif
#endif
executing = _Thread_Executing;
_ISR_Disable( level );
80059f8: b8 80 08 00 mv r1,r4
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
80059fc: 20 42 00 ff andi r2,r2,0xff
8005a00: 44 40 00 0b be r2,r0,8005a2c <_Thread_Dispatch+0x170> <== ALWAYS TAKEN
heir = _Thread_Heir;
8005a04: 29 ab 00 10 lw r11,(r13+16) <== NOT EXECUTED
_Thread_Dispatch_disable_level = 1;
8005a08: 5a 13 00 00 sw (r16+0),r19 <== NOT EXECUTED
_Thread_Dispatch_necessary = false;
8005a0c: 31 a0 00 18 sb (r13+24),r0 <== NOT EXECUTED
_Thread_Executing = heir;
8005a10: 59 ab 00 0c sw (r13+12),r11 <== NOT EXECUTED
/*
* 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 )
8005a14: 45 6c 00 06 be r11,r12,8005a2c <_Thread_Dispatch+0x170> <== NOT EXECUTED
*/
#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 )
8005a18: 29 62 00 7c lw r2,(r11+124)
8005a1c: 5c 53 ff d7 bne r2,r19,8005978 <_Thread_Dispatch+0xbc>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8005a20: 2a a2 00 00 lw r2,(r21+0)
8005a24: 59 62 00 78 sw (r11+120),r2
8005a28: e3 ff ff d4 bi 8005978 <_Thread_Dispatch+0xbc>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
8005a2c: 5a 00 00 00 sw (r16+0),r0
_ISR_Enable( level );
8005a30: d0 04 00 00 wcsr IE,r4
_API_extensions_Run_postswitch();
8005a34: fb ff f7 42 calli 800373c <_API_extensions_Run_postswitch>
}
8005a38: 2b 9d 00 04 lw ra,(sp+4)
8005a3c: 2b 8b 00 34 lw r11,(sp+52)
8005a40: 2b 8c 00 30 lw r12,(sp+48)
8005a44: 2b 8d 00 2c lw r13,(sp+44)
8005a48: 2b 8e 00 28 lw r14,(sp+40)
8005a4c: 2b 8f 00 24 lw r15,(sp+36)
8005a50: 2b 90 00 20 lw r16,(sp+32)
8005a54: 2b 91 00 1c lw r17,(sp+28)
8005a58: 2b 92 00 18 lw r18,(sp+24)
8005a5c: 2b 93 00 14 lw r19,(sp+20)
8005a60: 2b 94 00 10 lw r20,(sp+16)
8005a64: 2b 95 00 0c lw r21,(sp+12)
8005a68: 2b 96 00 08 lw r22,(sp+8)
8005a6c: 37 9c 00 44 addi sp,sp,68
8005a70: c3 a0 00 00 ret
0800cae4 <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
800cae4: 37 9c ff f4 addi sp,sp,-12
800cae8: 5b 8b 00 0c sw (sp+12),r11
800caec: 5b 8c 00 08 sw (sp+8),r12
800caf0: 5b 9d 00 04 sw (sp+4),ra
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
800caf4: 78 01 08 01 mvhi r1,0x801
800caf8: 38 21 4d b4 ori r1,r1,0x4db4
800cafc: 28 2b 00 0c lw r11,(r1+12)
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
800cb00: 29 61 00 ac lw r1,(r11+172)
_ISR_Set_level(level);
800cb04: 64 21 00 00 cmpei r1,r1,0
800cb08: d0 01 00 00 wcsr IE,r1
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
800cb0c: 78 02 08 01 mvhi r2,0x801
800cb10: 38 42 47 1c ori r2,r2,0x471c
800cb14: 40 4c 00 00 lbu r12,(r2+0)
doneConstructors = 1;
800cb18: 34 03 00 01 mvi r3,1
/*
* 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 );
800cb1c: b9 60 08 00 mv r1,r11
level = executing->Start.isr_level;
_ISR_Set_level(level);
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
doneConstructors = 1;
800cb20: 30 43 00 00 sb (r2+0),r3
/*
* 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 );
800cb24: fb ff e7 99 calli 8006988 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
800cb28: fb ff e3 d3 calli 8005a74 <_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) */ {
800cb2c: 45 80 00 0b be r12,r0,800cb58 <_Thread_Handler+0x74>
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
800cb30: 29 61 00 94 lw r1,(r11+148)
800cb34: 44 20 00 0c be r1,r0,800cb64 <_Thread_Handler+0x80>
(*(Thread_Entry_numeric) executing->Start.entry_point)(
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
800cb38: 34 02 00 01 mvi r2,1
800cb3c: 44 22 00 0f be r1,r2,800cb78 <_Thread_Handler+0x94> <== ALWAYS TAKEN
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
800cb40: b9 60 08 00 mv r1,r11
800cb44: fb ff e7 a9 calli 80069e8 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
800cb48: 34 01 00 00 mvi r1,0
800cb4c: 34 02 00 01 mvi r2,1
800cb50: 34 03 00 05 mvi r3,5
800cb54: fb ff de 34 calli 8004424 <_Internal_error_Occurred>
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
800cb58: fb ff cd 2a calli 8000000 <RamBase>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
800cb5c: 29 61 00 94 lw r1,(r11+148)
800cb60: 5c 20 ff f6 bne r1,r0,800cb38 <_Thread_Handler+0x54>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
800cb64: 29 62 00 90 lw r2,(r11+144)
800cb68: 29 61 00 9c lw r1,(r11+156)
800cb6c: d8 40 00 00 call r2
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
800cb70: 59 61 00 28 sw (r11+40),r1
800cb74: e3 ff ff f3 bi 800cb40 <_Thread_Handler+0x5c>
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
800cb78: 29 62 00 90 lw r2,(r11+144)
800cb7c: 29 61 00 98 lw r1,(r11+152)
800cb80: d8 40 00 00 call r2
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
800cb84: 59 61 00 28 sw (r11+40),r1
800cb88: e3 ff ff ee bi 800cb40 <_Thread_Handler+0x5c>
08006720 <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
8006720: 37 9c ff f8 addi sp,sp,-8
8006724: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *executing;
executing = _Thread_Executing;
8006728: 78 01 08 01 mvhi r1,0x801
800672c: 38 21 4d b4 ori r1,r1,0x4db4
8006730: 28 21 00 0c lw r1,(r1+12)
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
8006734: 40 22 00 74 lbu r2,(r1+116)
8006738: 44 40 00 09 be r2,r0,800675c <_Thread_Tickle_timeslice+0x3c>
return;
if ( !_States_Is_ready( executing->current_state ) )
800673c: 28 22 00 10 lw r2,(r1+16)
8006740: 5c 40 00 07 bne r2,r0,800675c <_Thread_Tickle_timeslice+0x3c>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
8006744: 28 22 00 7c lw r2,(r1+124)
8006748: 44 40 00 05 be r2,r0,800675c <_Thread_Tickle_timeslice+0x3c>
800674c: 34 03 00 02 mvi r3,2
8006750: 50 62 00 0d bgeu r3,r2,8006784 <_Thread_Tickle_timeslice+0x64>
8006754: 34 03 00 03 mvi r3,3
8006758: 44 43 00 04 be r2,r3,8006768 <_Thread_Tickle_timeslice+0x48><== ALWAYS TAKEN
if ( --executing->cpu_time_budget == 0 )
(*executing->budget_callout)( executing );
break;
#endif
}
}
800675c: 2b 9d 00 04 lw ra,(sp+4)
8006760: 37 9c 00 08 addi sp,sp,8
8006764: c3 a0 00 00 ret
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
8006768: 28 22 00 78 lw r2,(r1+120)
800676c: 34 42 ff ff addi r2,r2,-1
8006770: 58 22 00 78 sw (r1+120),r2
8006774: 5c 40 ff fa bne r2,r0,800675c <_Thread_Tickle_timeslice+0x3c>
(*executing->budget_callout)( executing );
8006778: 28 22 00 80 lw r2,(r1+128)
800677c: d8 40 00 00 call r2
8006780: e3 ff ff f7 bi 800675c <_Thread_Tickle_timeslice+0x3c>
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 ) {
8006784: 28 22 00 78 lw r2,(r1+120)
8006788: 34 42 ff ff addi r2,r2,-1
800678c: 58 22 00 78 sw (r1+120),r2
8006790: 48 40 ff f3 bg r2,r0,800675c <_Thread_Tickle_timeslice+0x3c>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
8006794: 78 02 08 01 mvhi r2,0x801
8006798: 38 42 40 1c ori r2,r2,0x401c
800679c: 28 42 00 0c lw r2,(r2+12)
80067a0: 5b 81 00 08 sw (sp+8),r1
80067a4: d8 40 00 00 call r2
* 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;
80067a8: 78 02 08 01 mvhi r2,0x801
80067ac: 38 42 48 a0 ori r2,r2,0x48a0
80067b0: 28 42 00 00 lw r2,(r2+0)
80067b4: 2b 81 00 08 lw r1,(sp+8)
80067b8: 58 22 00 78 sw (r1+120),r2
80067bc: e3 ff ff e8 bi 800675c <_Thread_Tickle_timeslice+0x3c>
0800a644 <_Thread_blocking_operation_Cancel>:
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
800a644: 37 9c ff f8 addi sp,sp,-8 <== NOT EXECUTED
800a648: 5b 8b 00 08 sw (sp+8),r11 <== NOT EXECUTED
800a64c: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
800a650: b8 40 58 00 mv r11,r2 <== NOT EXECUTED
/*
* 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 ) ) {
800a654: 28 42 00 50 lw r2,(r2+80) <== NOT EXECUTED
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
800a658: 59 60 00 44 sw (r11+68),r0 <== NOT EXECUTED
/*
* 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 ) ) {
800a65c: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
800a660: 44 41 00 0b be r2,r1,800a68c <_Thread_blocking_operation_Cancel+0x48><== NOT EXECUTED
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
} else
_ISR_Enable( level );
800a664: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800a668: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
800a66c: 38 21 36 c8 ori r1,r1,0x36c8 <== NOT EXECUTED
800a670: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED
800a674: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800a678: f8 00 00 0b calli 800a6a4 <_Thread_Clear_state> <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
800a67c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800a680: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
800a684: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
800a688: c3 a0 00 00 ret <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
800a68c: 34 01 00 03 mvi r1,3 <== NOT EXECUTED
800a690: 59 61 00 50 sw (r11+80),r1 <== NOT EXECUTED
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
800a694: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED
(void) _Watchdog_Remove( &the_thread->Timer );
800a698: 35 61 00 48 addi r1,r11,72 <== NOT EXECUTED
800a69c: fb ff f1 ed calli 8006e50 <_Watchdog_Remove> <== NOT EXECUTED
800a6a0: e3 ff ff f2 bi 800a668 <_Thread_blocking_operation_Cancel+0x24><== NOT EXECUTED
0800a82c <_Thread_queue_Enqueue_fifo>:
)
{
Thread_blocking_operation_States sync_state;
ISR_Level level;
_ISR_Disable( level );
800a82c: 90 00 20 00 rcsr r4,IE
800a830: 34 05 ff fe mvi r5,-2
800a834: a0 85 28 00 and r5,r4,r5
800a838: d0 05 00 00 wcsr IE,r5
sync_state = the_thread_queue->sync_state;
800a83c: 28 25 00 30 lw r5,(r1+48)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) {
800a840: 34 06 00 01 mvi r6,1
ISR_Level level;
_ISR_Disable( level );
sync_state = the_thread_queue->sync_state;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
800a844: 58 20 00 30 sw (r1+48),r0
if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) {
800a848: 44 a6 00 04 be r5,r6,800a858 <_Thread_queue_Enqueue_fifo+0x2c><== ALWAYS TAKEN
* For example, the blocking thread could have been given
* the mutex by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
800a84c: 58 64 00 00 sw (r3+0),r4 <== NOT EXECUTED
return sync_state;
}
800a850: b8 a0 08 00 mv r1,r5 <== NOT EXECUTED
800a854: c3 a0 00 00 ret <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
800a858: 28 23 00 08 lw r3,(r1+8)
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
800a85c: 34 26 00 04 addi r6,r1,4
Chain_Node *old_last = tail->previous;
the_node->next = tail;
800a860: 58 46 00 00 sw (r2+0),r6
tail->previous = the_node;
800a864: 58 22 00 08 sw (r1+8),r2
old_last->next = the_node;
800a868: 58 62 00 00 sw (r3+0),r2
the_node->previous = old_last;
800a86c: 58 43 00 04 sw (r2+4),r3
if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) {
_Chain_Append_unprotected(
&the_thread_queue->Queues.Fifo,
&the_thread->Object.Node
);
the_thread->Wait.queue = the_thread_queue;
800a870: 58 41 00 44 sw (r2+68),r1
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
_ISR_Enable( level );
800a874: d0 04 00 00 wcsr IE,r4
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return sync_state;
}
800a878: b8 a0 08 00 mv r1,r5
800a87c: c3 a0 00 00 ret
08006140 <_Thread_queue_Enqueue_priority>:
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
8006140: 37 9c ff f4 addi sp,sp,-12
8006144: 5b 8b 00 0c sw (sp+12),r11
8006148: 5b 8c 00 08 sw (sp+8),r12
800614c: 5b 8d 00 04 sw (sp+4),r13
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
8006150: 28 45 00 14 lw r5,(r2+20)
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 );
8006154: 34 47 00 3c addi r7,r2,60
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
8006158: 34 46 00 38 addi r6,r2,56
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
800615c: 00 a4 00 01 srui r4,r5,1
8006160: 78 0c 08 01 mvhi r12,0x801
8006164: 00 84 00 01 srui r4,r4,1
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8006168: 58 47 00 38 sw (r2+56),r7
800616c: 00 84 00 01 srui r4,r4,1
head->previous = NULL;
tail->previous = head;
8006170: 58 46 00 40 sw (r2+64),r6
8006174: 00 84 00 01 srui r4,r4,1
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
8006178: 58 40 00 3c sw (r2+60),r0
800617c: 00 84 00 01 srui r4,r4,1
RTEMS_INLINE_ROUTINE bool _Thread_queue_Is_reverse_search (
Priority_Control the_priority
)
{
return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK );
8006180: 20 a8 00 20 andi r8,r5,0x20
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
8006184: 00 84 00 01 srui r4,r4,1
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
8006188: 28 27 00 38 lw r7,(r1+56)
800618c: b4 84 30 00 add r6,r4,r4
8006190: 39 8c 40 f0 ori r12,r12,0x40f0
if ( _Thread_queue_Is_reverse_search( priority ) )
8006194: 5d 00 00 18 bne r8,r0,80061f4 <_Thread_queue_Enqueue_priority+0xb4>
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006198: b4 c4 20 00 add r4,r6,r4
800619c: b4 84 20 00 add r4,r4,r4
80061a0: b4 84 20 00 add r4,r4,r4
80061a4: b4 24 60 00 add r12,r1,r4
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
80061a8: 34 0d ff fe mvi r13,-2
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
80061ac: 35 8b 00 04 addi r11,r12,4
80061b0: 90 00 40 00 rcsr r8,IE
80061b4: a1 0d 50 00 and r10,r8,r13
80061b8: d0 0a 00 00 wcsr IE,r10
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
80061bc: 29 84 00 00 lw r4,(r12+0)
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
80061c0: 5c 8b 00 04 bne r4,r11,80061d0 <_Thread_queue_Enqueue_priority+0x90>
80061c4: e0 00 00 24 bi 8006254 <_Thread_queue_Enqueue_priority+0x114>
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
80061c8: 28 84 00 00 lw r4,(r4+0)
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
80061cc: 44 8b 00 23 be r4,r11,8006258 <_Thread_queue_Enqueue_priority+0x118>
search_priority = search_thread->current_priority;
80061d0: 28 86 00 14 lw r6,(r4+20)
if ( priority <= search_priority )
80061d4: 50 c5 00 21 bgeu r6,r5,8006258 <_Thread_queue_Enqueue_priority+0x118>
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
80061d8: d0 08 00 00 wcsr IE,r8
80061dc: d0 0a 00 00 wcsr IE,r10
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
80061e0: 28 89 00 10 lw r9,(r4+16)
80061e4: a0 e9 48 00 and r9,r7,r9
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
80061e8: 5d 20 ff f8 bne r9,r0,80061c8 <_Thread_queue_Enqueue_priority+0x88><== ALWAYS TAKEN
_ISR_Enable( level );
80061ec: d0 08 00 00 wcsr IE,r8 <== NOT EXECUTED
goto restart_forward_search;
80061f0: e3 ff ff f0 bi 80061b0 <_Thread_queue_Enqueue_priority+0x70><== NOT EXECUTED
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
80061f4: b4 c4 20 00 add r4,r6,r4
80061f8: b4 84 20 00 add r4,r4,r4
80061fc: b4 84 20 00 add r4,r4,r4
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
8006200: 34 0d ff fe mvi r13,-2
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006204: b4 24 50 00 add r10,r1,r4
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
8006208: 41 86 00 00 lbu r6,(r12+0)
800620c: 34 c6 00 01 addi r6,r6,1
_ISR_Disable( level );
8006210: 90 00 40 00 rcsr r8,IE
8006214: a1 0d 58 00 and r11,r8,r13
8006218: d0 0b 00 00 wcsr IE,r11
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
800621c: 29 44 00 08 lw r4,(r10+8)
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
8006220: 5c 8a 00 04 bne r4,r10,8006230 <_Thread_queue_Enqueue_priority+0xf0>
8006224: e0 00 00 18 bi 8006284 <_Thread_queue_Enqueue_priority+0x144>
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
8006228: 28 84 00 04 lw r4,(r4+4)
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
800622c: 44 8a 00 16 be r4,r10,8006284 <_Thread_queue_Enqueue_priority+0x144>
search_priority = search_thread->current_priority;
8006230: 28 86 00 14 lw r6,(r4+20)
if ( priority >= search_priority )
8006234: 50 a6 00 14 bgeu r5,r6,8006284 <_Thread_queue_Enqueue_priority+0x144>
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
8006238: d0 08 00 00 wcsr IE,r8
800623c: d0 0b 00 00 wcsr IE,r11
8006240: 28 89 00 10 lw r9,(r4+16)
8006244: a0 e9 48 00 and r9,r7,r9
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
8006248: 5d 20 ff f8 bne r9,r0,8006228 <_Thread_queue_Enqueue_priority+0xe8><== ALWAYS TAKEN
_ISR_Enable( level );
800624c: d0 08 00 00 wcsr IE,r8 <== NOT EXECUTED
goto restart_reverse_search;
8006250: e3 ff ff ee bi 8006208 <_Thread_queue_Enqueue_priority+0xc8><== NOT EXECUTED
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
8006254: 34 06 ff ff mvi r6,-1
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
8006258: 28 27 00 30 lw r7,(r1+48)
800625c: 34 0a 00 01 mvi r10,1
8006260: b9 00 48 00 mv r9,r8
8006264: 44 ea 00 1b be r7,r10,80062d0 <_Thread_queue_Enqueue_priority+0x190><== ALWAYS TAKEN
* For example, the blocking thread could have been given
* the mutex by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
8006268: 58 69 00 00 sw (r3+0),r9 <== NOT EXECUTED
return the_thread_queue->sync_state;
}
800626c: b8 e0 08 00 mv r1,r7
8006270: 2b 8b 00 0c lw r11,(sp+12)
8006274: 2b 8c 00 08 lw r12,(sp+8)
8006278: 2b 8d 00 04 lw r13,(sp+4)
800627c: 37 9c 00 0c addi sp,sp,12
8006280: c3 a0 00 00 ret
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
8006284: 28 27 00 30 lw r7,(r1+48)
8006288: 34 0a 00 01 mvi r10,1
800628c: b9 00 48 00 mv r9,r8
8006290: 5c ea ff f6 bne r7,r10,8006268 <_Thread_queue_Enqueue_priority+0x128><== NEVER TAKEN
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8006294: 58 20 00 30 sw (r1+48),r0
if ( priority == search_priority )
8006298: 44 a6 00 1d be r5,r6,800630c <_Thread_queue_Enqueue_priority+0x1cc>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
800629c: 28 83 00 00 lw r3,(r4+0)
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
80062a0: 58 44 00 04 sw (r2+4),r4
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
80062a4: 58 43 00 00 sw (r2+0),r3
the_node->previous = search_node;
search_node->next = the_node;
80062a8: 58 82 00 00 sw (r4+0),r2
next_node->previous = the_node;
80062ac: 58 62 00 04 sw (r3+4),r2
the_thread->Wait.queue = the_thread_queue;
80062b0: 58 41 00 44 sw (r2+68),r1
_ISR_Enable( level );
80062b4: d0 08 00 00 wcsr IE,r8
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
80062b8: b8 e0 08 00 mv r1,r7
80062bc: 2b 8b 00 0c lw r11,(sp+12)
80062c0: 2b 8c 00 08 lw r12,(sp+8)
80062c4: 2b 8d 00 04 lw r13,(sp+4)
80062c8: 37 9c 00 0c addi sp,sp,12
80062cc: c3 a0 00 00 ret
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
80062d0: 58 20 00 30 sw (r1+48),r0
if ( priority == search_priority )
80062d4: 44 a6 00 0e be r5,r6,800630c <_Thread_queue_Enqueue_priority+0x1cc>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
80062d8: 28 83 00 04 lw r3,(r4+4)
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
80062dc: 58 44 00 00 sw (r2+0),r4
the_node->previous = previous_node;
80062e0: 58 43 00 04 sw (r2+4),r3
previous_node->next = the_node;
80062e4: 58 62 00 00 sw (r3+0),r2
search_node->previous = the_node;
80062e8: 58 82 00 04 sw (r4+4),r2
the_thread->Wait.queue = the_thread_queue;
80062ec: 58 41 00 44 sw (r2+68),r1
_ISR_Enable( level );
80062f0: d0 08 00 00 wcsr IE,r8
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
80062f4: b8 e0 08 00 mv r1,r7
80062f8: 2b 8b 00 0c lw r11,(sp+12)
80062fc: 2b 8c 00 08 lw r12,(sp+8)
8006300: 2b 8d 00 04 lw r13,(sp+4)
8006304: 37 9c 00 0c addi sp,sp,12
8006308: c3 a0 00 00 ret
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
previous_node = search_node->previous;
800630c: 28 83 00 40 lw r3,(r4+64)
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
8006310: 34 85 00 3c addi r5,r4,60
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
8006314: 58 45 00 00 sw (r2+0),r5
the_node->previous = previous_node;
8006318: 58 43 00 04 sw (r2+4),r3
previous_node->next = the_node;
800631c: 58 62 00 00 sw (r3+0),r2
search_node->previous = the_node;
8006320: 58 82 00 40 sw (r4+64),r2
the_thread->Wait.queue = the_thread_queue;
8006324: 58 41 00 44 sw (r2+68),r1
_ISR_Enable( level );
8006328: d0 08 00 00 wcsr IE,r8
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800632c: 34 07 00 01 mvi r7,1
8006330: e3 ff ff cf bi 800626c <_Thread_queue_Enqueue_priority+0x12c>
08006064 <_Thread_queue_Enqueue_with_handler>:
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8006064: 37 9c ff e8 addi sp,sp,-24
8006068: 5b 8b 00 14 sw (sp+20),r11
800606c: 5b 8c 00 10 sw (sp+16),r12
8006070: 5b 8d 00 0c sw (sp+12),r13
8006074: 5b 8e 00 08 sw (sp+8),r14
8006078: 5b 9d 00 04 sw (sp+4),ra
Thread_queue_Control *,
Thread_Control *,
ISR_Level *
);
the_thread = _Thread_Executing;
800607c: 78 04 08 01 mvhi r4,0x801
8006080: 38 84 4d b4 ori r4,r4,0x4db4
8006084: 28 8b 00 0c lw r11,(r4+12)
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8006088: b8 40 68 00 mv r13,r2
else
#endif
/*
* Set the blocking state for this thread queue in the thread.
*/
_Thread_Set_state( the_thread, the_thread_queue->state );
800608c: 28 22 00 38 lw r2,(r1+56)
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8006090: b8 20 60 00 mv r12,r1
else
#endif
/*
* Set the blocking state for this thread queue in the thread.
*/
_Thread_Set_state( the_thread, the_thread_queue->state );
8006094: b9 60 08 00 mv r1,r11
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8006098: b8 60 70 00 mv r14,r3
else
#endif
/*
* Set the blocking state for this thread queue in the thread.
*/
_Thread_Set_state( the_thread, the_thread_queue->state );
800609c: f8 00 01 18 calli 80064fc <_Thread_Set_state>
/*
* If the thread wants to timeout, then schedule its timer.
*/
if ( timeout ) {
80060a0: 5d a0 00 16 bne r13,r0,80060f8 <_Thread_queue_Enqueue_with_handler+0x94>
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
80060a4: 29 82 00 34 lw r2,(r12+52)
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
80060a8: 78 04 08 00 mvhi r4,0x800
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
80060ac: 34 01 00 01 mvi r1,1
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
80060b0: 38 84 a8 2c ori r4,r4,0xa82c
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
80060b4: 44 41 00 20 be r2,r1,8006134 <_Thread_queue_Enqueue_with_handler+0xd0>
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
sync_state = (*enqueue_p)( the_thread_queue, the_thread, &level );
80060b8: b9 60 10 00 mv r2,r11
80060bc: b9 80 08 00 mv r1,r12
80060c0: 37 83 00 18 addi r3,sp,24
80060c4: d8 80 00 00 call r4
if ( sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
80060c8: 34 02 00 01 mvi r2,1
80060cc: 44 22 00 04 be r1,r2,80060dc <_Thread_queue_Enqueue_with_handler+0x78><== ALWAYS TAKEN
_Thread_blocking_operation_Cancel( sync_state, the_thread, level );
80060d0: 2b 83 00 18 lw r3,(sp+24) <== NOT EXECUTED
80060d4: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
80060d8: f8 00 11 5b calli 800a644 <_Thread_blocking_operation_Cancel><== NOT EXECUTED
}
80060dc: 2b 9d 00 04 lw ra,(sp+4)
80060e0: 2b 8b 00 14 lw r11,(sp+20)
80060e4: 2b 8c 00 10 lw r12,(sp+16)
80060e8: 2b 8d 00 0c lw r13,(sp+12)
80060ec: 2b 8e 00 08 lw r14,(sp+8)
80060f0: 37 9c 00 18 addi sp,sp,24
80060f4: c3 a0 00 00 ret
/*
* If the thread wants to timeout, then schedule its timer.
*/
if ( timeout ) {
_Watchdog_Initialize(
80060f8: 29 61 00 08 lw r1,(r11+8)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
80060fc: 35 62 00 48 addi r2,r11,72
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8006100: 59 60 00 50 sw (r11+80),r0
the_watchdog->routine = routine;
the_watchdog->id = id;
8006104: 59 61 00 68 sw (r11+104),r1
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8006108: 78 01 08 01 mvhi r1,0x801
800610c: 38 21 49 c8 ori r1,r1,0x49c8
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8006110: 59 6e 00 64 sw (r11+100),r14
the_watchdog->id = id;
the_watchdog->user_data = user_data;
8006114: 59 60 00 6c sw (r11+108),r0
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8006118: 59 6d 00 54 sw (r11+84),r13
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800611c: f8 00 02 e2 calli 8006ca4 <_Watchdog_Insert>
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8006120: 29 82 00 34 lw r2,(r12+52)
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
8006124: 78 04 08 00 mvhi r4,0x800
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8006128: 34 01 00 01 mvi r1,1
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
800612c: 38 84 a8 2c ori r4,r4,0xa82c
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8006130: 5c 41 ff e2 bne r2,r1,80060b8 <_Thread_queue_Enqueue_with_handler+0x54>
enqueue_p = _Thread_queue_Enqueue_priority;
8006134: 78 04 08 00 mvhi r4,0x800
8006138: 38 84 61 40 ori r4,r4,0x6140
800613c: e3 ff ff df bi 80060b8 <_Thread_queue_Enqueue_with_handler+0x54>
0800aa0c <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
800aa0c: 37 9c ff fc addi sp,sp,-4
800aa10: 5b 9d 00 04 sw (sp+4),ra
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
800aa14: 28 23 00 44 lw r3,(r1+68)
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
800aa18: b8 20 20 00 mv r4,r1
* 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 &&
800aa1c: 28 62 00 30 lw r2,(r3+48)
800aa20: 44 40 00 05 be r2,r0,800aa34 <_Thread_queue_Process_timeout+0x28><== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800aa24: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
800aa28: 38 21 4d b4 ori r1,r1,0x4db4 <== NOT EXECUTED
800aa2c: 28 21 00 0c lw r1,(r1+12) <== NOT EXECUTED
800aa30: 44 81 00 09 be r4,r1,800aa54 <_Thread_queue_Process_timeout+0x48><== NOT EXECUTED
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800aa34: 28 65 00 3c lw r5,(r3+60)
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
800aa38: b8 60 08 00 mv r1,r3
800aa3c: b8 80 10 00 mv r2,r4
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800aa40: 58 85 00 34 sw (r4+52),r5
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
800aa44: fb ff ff 8f calli 800a880 <_Thread_queue_Extract>
}
}
800aa48: 2b 9d 00 04 lw ra,(sp+4)
800aa4c: 37 9c 00 04 addi sp,sp,4
800aa50: c3 a0 00 00 ret
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
800aa54: 34 01 00 03 mvi r1,3 <== NOT EXECUTED
800aa58: 44 41 ff fc be r2,r1,800aa48 <_Thread_queue_Process_timeout+0x3c><== NOT EXECUTED
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800aa5c: 28 61 00 3c lw r1,(r3+60) <== NOT EXECUTED
800aa60: 58 81 00 34 sw (r4+52),r1 <== NOT EXECUTED
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
800aa64: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
800aa68: 58 61 00 30 sw (r3+48),r1 <== NOT EXECUTED
800aa6c: e3 ff ff f7 bi 800aa48 <_Thread_queue_Process_timeout+0x3c><== NOT EXECUTED
080063e0 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
80063e0: 37 9c ff ec addi sp,sp,-20
80063e4: 5b 8b 00 10 sw (sp+16),r11
80063e8: 5b 8c 00 0c sw (sp+12),r12
80063ec: 5b 8d 00 08 sw (sp+8),r13
80063f0: 5b 9d 00 04 sw (sp+4),ra
80063f4: b8 20 58 00 mv r11,r1
80063f8: b8 40 60 00 mv r12,r2
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
80063fc: 44 20 00 04 be r1,r0,800640c <_Thread_queue_Requeue+0x2c> <== 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 ) {
8006400: 28 22 00 34 lw r2,(r1+52)
8006404: 34 01 00 01 mvi r1,1
8006408: 44 41 00 07 be r2,r1,8006424 <_Thread_queue_Requeue+0x44> <== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
800640c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8006410: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
8006414: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8006418: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
800641c: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED
8006420: c3 a0 00 00 ret <== NOT EXECUTED
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
8006424: 90 00 68 00 rcsr r13,IE
8006428: 34 01 ff fe mvi r1,-2
800642c: a1 a1 08 00 and r1,r13,r1
8006430: d0 01 00 00 wcsr IE,r1
8006434: 78 03 08 01 mvhi r3,0x801
8006438: 38 63 36 c0 ori r3,r3,0x36c0
800643c: 29 82 00 10 lw r2,(r12+16)
8006440: 28 61 00 00 lw r1,(r3+0)
8006444: a0 41 08 00 and r1,r2,r1
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
8006448: 5c 20 00 08 bne r1,r0,8006468 <_Thread_queue_Requeue+0x88> <== ALWAYS TAKEN
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
800644c: d0 0d 00 00 wcsr IE,r13 <== NOT EXECUTED
}
}
8006450: 2b 9d 00 04 lw ra,(sp+4)
8006454: 2b 8b 00 10 lw r11,(sp+16)
8006458: 2b 8c 00 0c lw r12,(sp+12)
800645c: 2b 8d 00 08 lw r13,(sp+8)
8006460: 37 9c 00 14 addi sp,sp,20
8006464: c3 a0 00 00 ret
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;
8006468: 34 01 00 01 mvi r1,1
800646c: 59 61 00 30 sw (r11+48),r1
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
8006470: b9 80 10 00 mv r2,r12
8006474: b9 60 08 00 mv r1,r11
8006478: 34 03 00 01 mvi r3,1
800647c: f8 00 11 0f calli 800a8b8 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
8006480: b9 60 08 00 mv r1,r11
8006484: b9 80 10 00 mv r2,r12
8006488: 37 83 00 14 addi r3,sp,20
800648c: fb ff ff 2d calli 8006140 <_Thread_queue_Enqueue_priority>
}
_ISR_Enable( level );
8006490: d0 0d 00 00 wcsr IE,r13
8006494: e3 ff ff ef bi 8006450 <_Thread_queue_Requeue+0x70>
08006498 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
8006498: 37 9c ff f8 addi sp,sp,-8
800649c: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
80064a0: 37 82 00 08 addi r2,sp,8
80064a4: fb ff fd 81 calli 8005aa8 <_Thread_Get>
switch ( location ) {
80064a8: 2b 82 00 08 lw r2,(sp+8)
80064ac: 5c 40 00 07 bne r2,r0,80064c8 <_Thread_queue_Timeout+0x30> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
80064b0: f8 00 11 57 calli 800aa0c <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
80064b4: 78 01 08 01 mvhi r1,0x801
80064b8: 38 21 49 08 ori r1,r1,0x4908
80064bc: 28 22 00 00 lw r2,(r1+0)
80064c0: 34 42 ff ff addi r2,r2,-1
80064c4: 58 22 00 00 sw (r1+0),r2
_Thread_Unnest_dispatch();
break;
}
}
80064c8: 2b 9d 00 04 lw ra,(sp+4)
80064cc: 37 9c 00 08 addi sp,sp,8
80064d0: c3 a0 00 00 ret
0801456c <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
801456c: 37 9c ff a4 addi sp,sp,-92
8014570: 5b 8b 00 44 sw (sp+68),r11
8014574: 5b 8c 00 40 sw (sp+64),r12
8014578: 5b 8d 00 3c sw (sp+60),r13
801457c: 5b 8e 00 38 sw (sp+56),r14
8014580: 5b 8f 00 34 sw (sp+52),r15
8014584: 5b 90 00 30 sw (sp+48),r16
8014588: 5b 91 00 2c sw (sp+44),r17
801458c: 5b 92 00 28 sw (sp+40),r18
8014590: 5b 93 00 24 sw (sp+36),r19
8014594: 5b 94 00 20 sw (sp+32),r20
8014598: 5b 95 00 1c sw (sp+28),r21
801459c: 5b 96 00 18 sw (sp+24),r22
80145a0: 5b 97 00 14 sw (sp+20),r23
80145a4: 5b 98 00 10 sw (sp+16),r24
80145a8: 5b 99 00 0c sw (sp+12),r25
80145ac: 5b 9b 00 08 sw (sp+8),fp
80145b0: 5b 9d 00 04 sw (sp+4),ra
80145b4: 78 13 08 04 mvhi r19,0x804
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80145b8: 37 96 00 54 addi r22,sp,84
80145bc: 37 95 00 58 addi r21,sp,88
80145c0: 37 8e 00 48 addi r14,sp,72
80145c4: 37 94 00 4c addi r20,sp,76
80145c8: 78 12 08 04 mvhi r18,0x804
80145cc: 78 17 08 04 mvhi r23,0x804
80145d0: b8 20 58 00 mv r11,r1
80145d4: 5b 95 00 54 sw (sp+84),r21
head->previous = NULL;
80145d8: 5b 80 00 58 sw (sp+88),r0
tail->previous = head;
80145dc: 5b 96 00 5c sw (sp+92),r22
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80145e0: 5b 94 00 48 sw (sp+72),r20
head->previous = NULL;
80145e4: 5b 80 00 4c sw (sp+76),r0
tail->previous = head;
80145e8: 5b 8e 00 50 sw (sp+80),r14
80145ec: 3a 73 0e 20 ori r19,r19,0xe20
80145f0: 34 30 00 30 addi r16,r1,48
80145f4: 3a 52 0d 98 ori r18,r18,0xd98
80145f8: 34 2f 00 68 addi r15,r1,104
80145fc: 3a f7 0d 10 ori r23,r23,0xd10
8014600: 34 3b 00 08 addi fp,r1,8
8014604: 34 39 00 40 addi r25,r1,64
Timer_Control *timer
)
{
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 ) {
8014608: 34 0d 00 03 mvi r13,3
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
801460c: 34 11 ff fe mvi r17,-2
_Thread_Set_state( ts->thread, STATES_DELAYING );
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
8014610: 34 18 00 01 mvi r24,1
{
/*
* 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;
8014614: 59 76 00 78 sw (r11+120),r22
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
8014618: 2a 62 00 00 lw r2,(r19+0)
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
801461c: 29 63 00 3c lw r3,(r11+60)
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014620: ba 00 08 00 mv r1,r16
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
8014624: 59 62 00 3c sw (r11+60),r2
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014628: c8 43 10 00 sub r2,r2,r3
801462c: b9 c0 18 00 mv r3,r14
8014630: f8 00 15 a6 calli 8019cc8 <_Watchdog_Adjust_to_chain>
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
8014634: 29 64 00 74 lw r4,(r11+116)
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
8014638: 2a 4c 00 00 lw r12,(r18+0)
/*
* 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 ) {
801463c: 50 8c 00 1c bgeu r4,r12,80146ac <_Timer_server_Body+0x140>
/*
* 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 );
8014640: b9 e0 08 00 mv r1,r15
8014644: c9 84 10 00 sub r2,r12,r4
8014648: b9 c0 18 00 mv r3,r14
801464c: f8 00 15 9f calli 8019cc8 <_Watchdog_Adjust_to_chain>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
8014650: 59 6c 00 74 sw (r11+116),r12
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
8014654: 34 0c 00 01 mvi r12,1
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
8014658: 29 61 00 78 lw r1,(r11+120)
801465c: f8 00 03 4b calli 8015388 <_Chain_Get>
8014660: b8 20 10 00 mv r2,r1
if ( timer == NULL ) {
8014664: 44 20 00 0b be r1,r0,8014690 <_Timer_server_Body+0x124> <== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
8014668: 28 24 00 38 lw r4,(r1+56) <== NOT EXECUTED
801466c: 44 8c 00 16 be r4,r12,80146c4 <_Timer_server_Body+0x158> <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
8014670: 5c 8d ff fa bne r4,r13,8014658 <_Timer_server_Body+0xec> <== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
8014674: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED
8014678: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
801467c: f8 00 15 b9 calli 8019d60 <_Watchdog_Insert> <== NOT EXECUTED
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
8014680: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED
8014684: f8 00 03 41 calli 8015388 <_Chain_Get> <== NOT EXECUTED
8014688: b8 20 10 00 mv r2,r1 <== NOT EXECUTED
if ( timer == NULL ) {
801468c: 5c 20 ff f7 bne r1,r0,8014668 <_Timer_server_Body+0xfc> <== NOT EXECUTED
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
8014690: 90 00 10 00 rcsr r2,IE
8014694: a0 51 18 00 and r3,r2,r17
8014698: d0 03 00 00 wcsr IE,r3
if ( _Chain_Is_empty( insert_chain ) ) {
801469c: 2b 83 00 54 lw r3,(sp+84)
80146a0: 44 75 00 0d be r3,r21,80146d4 <_Timer_server_Body+0x168> <== ALWAYS TAKEN
ts->insert_chain = NULL;
_ISR_Enable( level );
break;
} else {
_ISR_Enable( level );
80146a4: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
80146a8: e3 ff ff dc bi 8014618 <_Timer_server_Body+0xac> <== NOT EXECUTED
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
80146ac: 51 84 ff e9 bgeu r12,r4,8014650 <_Timer_server_Body+0xe4>
/*
* 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 );
80146b0: b9 e0 08 00 mv r1,r15
80146b4: 34 02 00 01 mvi r2,1
80146b8: c8 8c 18 00 sub r3,r4,r12
80146bc: f8 00 15 45 calli 8019bd0 <_Watchdog_Adjust>
80146c0: e3 ff ff e4 bi 8014650 <_Timer_server_Body+0xe4>
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
80146c4: ba 00 08 00 mv r1,r16 <== NOT EXECUTED
80146c8: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED
80146cc: f8 00 15 a5 calli 8019d60 <_Watchdog_Insert> <== NOT EXECUTED
80146d0: e3 ff ff e2 bi 8014658 <_Timer_server_Body+0xec> <== NOT EXECUTED
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
80146d4: 59 60 00 78 sw (r11+120),r0
_ISR_Enable( level );
80146d8: d0 02 00 00 wcsr IE,r2
_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 ) ) {
80146dc: 2b 82 00 48 lw r2,(sp+72)
80146e0: 5c 54 00 0b bne r2,r20,801470c <_Timer_server_Body+0x1a0>
80146e4: e0 00 00 11 bi 8014728 <_Timer_server_Body+0x1bc>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
80146e8: 28 43 00 00 lw r3,(r2+0)
head->next = new_first;
new_first->previous = head;
80146ec: 58 6e 00 04 sw (r3+4),r14
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
80146f0: 5b 83 00 48 sw (sp+72),r3
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
80146f4: 58 40 00 08 sw (r2+8),r0
_ISR_Enable( level );
80146f8: d0 04 00 00 wcsr IE,r4
/*
* 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 );
80146fc: 28 43 00 1c lw r3,(r2+28)
8014700: 28 41 00 20 lw r1,(r2+32)
8014704: 28 42 00 24 lw r2,(r2+36)
8014708: d8 60 00 00 call r3
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
801470c: 90 00 20 00 rcsr r4,IE
8014710: a0 91 10 00 and r2,r4,r17
8014714: d0 02 00 00 wcsr IE,r2
initialized = false;
}
#endif
return status;
}
8014718: 2b 82 00 48 lw r2,(sp+72)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
801471c: 5c 54 ff f3 bne r2,r20,80146e8 <_Timer_server_Body+0x17c>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
8014720: d0 04 00 00 wcsr IE,r4
8014724: e3 ff ff bc bi 8014614 <_Timer_server_Body+0xa8>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
8014728: 31 60 00 7c sb (r11+124),r0
801472c: 2a e1 00 00 lw r1,(r23+0)
8014730: 34 21 00 01 addi r1,r1,1
8014734: 5a e1 00 00 sw (r23+0),r1
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
8014738: 29 61 00 00 lw r1,(r11+0)
801473c: 34 02 00 08 mvi r2,8
8014740: f8 00 13 07 calli 801935c <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
8014744: b9 60 08 00 mv r1,r11
8014748: fb ff ff 47 calli 8014464 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
801474c: b9 60 08 00 mv r1,r11
8014750: fb ff ff 66 calli 80144e8 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
8014754: f8 00 10 2f calli 8018810 <_Thread_Enable_dispatch>
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
8014758: bb 60 08 00 mv r1,fp
_Thread_Set_state( ts->thread, STATES_DELAYING );
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
801475c: 31 78 00 7c sb (r11+124),r24
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
8014760: f8 00 15 eb calli 8019f0c <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
8014764: bb 20 08 00 mv r1,r25
8014768: f8 00 15 e9 calli 8019f0c <_Watchdog_Remove>
801476c: e3 ff ff aa bi 8014614 <_Timer_server_Body+0xa8>
08014770 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
8014770: 37 9c ff f8 addi sp,sp,-8
8014774: 5b 8b 00 08 sw (sp+8),r11
8014778: 5b 9d 00 04 sw (sp+4),ra
801477c: b8 20 58 00 mv r11,r1
if ( ts->insert_chain == NULL ) {
8014780: 28 21 00 78 lw r1,(r1+120)
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
8014784: b8 40 18 00 mv r3,r2
if ( ts->insert_chain == NULL ) {
8014788: 44 20 00 07 be r1,r0,80147a4 <_Timer_server_Schedule_operation_method+0x34><== ALWAYS TAKEN
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
801478c: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED
8014790: f8 00 02 e8 calli 8015330 <_Chain_Append> <== NOT EXECUTED
}
}
8014794: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8014798: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
801479c: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
80147a0: c3 a0 00 00 ret <== NOT EXECUTED
80147a4: 78 01 08 04 mvhi r1,0x804
80147a8: 38 21 0d 10 ori r1,r1,0xd10
80147ac: 28 22 00 00 lw r2,(r1+0)
80147b0: 34 42 00 01 addi r2,r2,1
80147b4: 58 22 00 00 sw (r1+0),r2
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
80147b8: 28 61 00 38 lw r1,(r3+56)
80147bc: 34 02 00 01 mvi r2,1
80147c0: 44 22 00 28 be r1,r2,8014860 <_Timer_server_Schedule_operation_method+0xf0>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
if ( !ts->active ) {
_Timer_server_Reset_interval_system_watchdog( ts );
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
80147c4: 34 02 00 03 mvi r2,3
80147c8: 44 22 00 06 be r1,r2,80147e0 <_Timer_server_Schedule_operation_method+0x70>
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
80147cc: f8 00 10 11 calli 8018810 <_Thread_Enable_dispatch>
* 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 );
}
}
80147d0: 2b 9d 00 04 lw ra,(sp+4)
80147d4: 2b 8b 00 08 lw r11,(sp+8)
80147d8: 37 9c 00 08 addi sp,sp,8
80147dc: c3 a0 00 00 ret
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
80147e0: 90 00 38 00 rcsr r7,IE
80147e4: 34 01 ff fe mvi r1,-2
80147e8: a0 e1 08 00 and r1,r7,r1
80147ec: d0 01 00 00 wcsr IE,r1
initialized = false;
}
#endif
return status;
}
80147f0: 29 62 00 68 lw r2,(r11+104)
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
80147f4: 78 01 08 04 mvhi r1,0x804
last_snapshot = ts->TOD_watchdogs.last_snapshot;
80147f8: 29 64 00 74 lw r4,(r11+116)
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
80147fc: 38 21 0d 98 ori r1,r1,0xd98
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8014800: 35 65 00 6c addi r5,r11,108
8014804: 28 21 00 00 lw r1,(r1+0)
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
8014808: 44 45 00 0a be r2,r5,8014830 <_Timer_server_Schedule_operation_method+0xc0>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
801480c: 28 46 00 10 lw r6,(r2+16)
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
8014810: b4 c4 28 00 add r5,r6,r4
delta_interval += delta;
8014814: c8 a1 28 00 sub r5,r5,r1
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
if ( snapshot > last_snapshot ) {
8014818: 50 81 00 05 bgeu r4,r1,801482c <_Timer_server_Schedule_operation_method+0xbc>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
801481c: c8 24 20 00 sub r4,r1,r4
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
8014820: 34 05 00 00 mvi r5,0
if ( snapshot > last_snapshot ) {
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
8014824: 50 86 00 02 bgeu r4,r6,801482c <_Timer_server_Schedule_operation_method+0xbc><== NEVER TAKEN
delta_interval -= delta;
8014828: c8 c4 28 00 sub r5,r6,r4
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
801482c: 58 45 00 10 sw (r2+16),r5
}
ts->TOD_watchdogs.last_snapshot = snapshot;
8014830: 59 61 00 74 sw (r11+116),r1
_ISR_Enable( level );
8014834: d0 07 00 00 wcsr IE,r7
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
8014838: 35 61 00 68 addi r1,r11,104
801483c: 34 62 00 10 addi r2,r3,16
8014840: f8 00 15 48 calli 8019d60 <_Watchdog_Insert>
if ( !ts->active ) {
8014844: 41 61 00 7c lbu r1,(r11+124)
8014848: 20 21 00 ff andi r1,r1,0xff
801484c: 5c 20 ff e0 bne r1,r0,80147cc <_Timer_server_Schedule_operation_method+0x5c><== NEVER TAKEN
_Timer_server_Reset_tod_system_watchdog( ts );
8014850: b9 60 08 00 mv r1,r11
8014854: fb ff ff 25 calli 80144e8 <_Timer_server_Reset_tod_system_watchdog>
}
}
_Thread_Enable_dispatch();
8014858: f8 00 0f ee calli 8018810 <_Thread_Enable_dispatch>
801485c: e3 ff ff dd bi 80147d0 <_Timer_server_Schedule_operation_method+0x60>
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
8014860: 90 00 20 00 rcsr r4,IE
8014864: 34 01 ff fe mvi r1,-2
8014868: a0 81 08 00 and r1,r4,r1
801486c: d0 01 00 00 wcsr IE,r1
snapshot = _Watchdog_Ticks_since_boot;
8014870: 78 01 08 04 mvhi r1,0x804
8014874: 38 21 0e 20 ori r1,r1,0xe20
initialized = false;
}
#endif
return status;
}
8014878: 29 62 00 30 lw r2,(r11+48)
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
801487c: 28 21 00 00 lw r1,(r1+0)
last_snapshot = ts->Interval_watchdogs.last_snapshot;
8014880: 29 66 00 3c lw r6,(r11+60)
8014884: 35 65 00 34 addi r5,r11,52
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
8014888: 44 45 00 07 be r2,r5,80148a4 <_Timer_server_Schedule_operation_method+0x134>
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
801488c: 28 47 00 10 lw r7,(r2+16)
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
8014890: c8 26 30 00 sub r6,r1,r6
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
8014894: 34 05 00 00 mvi r5,0
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
8014898: 50 c7 00 02 bgeu r6,r7,80148a0 <_Timer_server_Schedule_operation_method+0x130>
delta_interval -= delta;
801489c: c8 e6 28 00 sub r5,r7,r6
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
80148a0: 58 45 00 10 sw (r2+16),r5
}
ts->Interval_watchdogs.last_snapshot = snapshot;
80148a4: 59 61 00 3c sw (r11+60),r1
_ISR_Enable( level );
80148a8: d0 04 00 00 wcsr IE,r4
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
80148ac: 35 61 00 30 addi r1,r11,48
80148b0: 34 62 00 10 addi r2,r3,16
80148b4: f8 00 15 2b calli 8019d60 <_Watchdog_Insert>
if ( !ts->active ) {
80148b8: 41 61 00 7c lbu r1,(r11+124)
80148bc: 20 21 00 ff andi r1,r1,0xff
80148c0: 5c 20 ff c3 bne r1,r0,80147cc <_Timer_server_Schedule_operation_method+0x5c>
_Timer_server_Reset_interval_system_watchdog( ts );
80148c4: b9 60 08 00 mv r1,r11
80148c8: fb ff fe e7 calli 8014464 <_Timer_server_Reset_interval_system_watchdog>
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
80148cc: f8 00 0f d1 calli 8018810 <_Thread_Enable_dispatch>
80148d0: e3 ff ff c0 bi 80147d0 <_Timer_server_Schedule_operation_method+0x60>
08006a40 <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
8006a40: 37 9c ff e8 addi sp,sp,-24
8006a44: 5b 8b 00 18 sw (sp+24),r11
8006a48: 5b 8c 00 14 sw (sp+20),r12
8006a4c: 5b 8d 00 10 sw (sp+16),r13
8006a50: 5b 8e 00 0c sw (sp+12),r14
8006a54: 5b 8f 00 08 sw (sp+8),r15
8006a58: 5b 9d 00 04 sw (sp+4),ra
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
8006a5c: 78 0c 08 01 mvhi r12,0x801
8006a60: 39 8c 4a 64 ori r12,r12,0x4a64
8006a64: 29 8b 00 08 lw r11,(r12+8)
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
8006a68: b8 20 78 00 mv r15,r1
8006a6c: b8 60 70 00 mv r14,r3
8006a70: 20 4d 00 ff andi r13,r2,0xff
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006a74: 45 6c 00 09 be r11,r12,8006a98 <_User_extensions_Fatal+0x58><== NEVER TAKEN
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
8006a78: 29 64 00 30 lw r4,(r11+48)
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
8006a7c: b9 e0 08 00 mv r1,r15
8006a80: b9 a0 10 00 mv r2,r13
8006a84: b9 c0 18 00 mv r3,r14
!_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 )
8006a88: 44 80 00 02 be r4,r0,8006a90 <_User_extensions_Fatal+0x50>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
8006a8c: d8 80 00 00 call r4
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 ) {
8006a90: 29 6b 00 04 lw r11,(r11+4)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006a94: 5d 6c ff f9 bne r11,r12,8006a78 <_User_extensions_Fatal+0x38>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
8006a98: 2b 9d 00 04 lw ra,(sp+4)
8006a9c: 2b 8b 00 18 lw r11,(sp+24)
8006aa0: 2b 8c 00 14 lw r12,(sp+20)
8006aa4: 2b 8d 00 10 lw r13,(sp+16)
8006aa8: 2b 8e 00 0c lw r14,(sp+12)
8006aac: 2b 8f 00 08 lw r15,(sp+8)
8006ab0: 37 9c 00 18 addi sp,sp,24
8006ab4: c3 a0 00 00 ret
08006874 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
8006874: 37 9c ff ec addi sp,sp,-20
8006878: 5b 8b 00 14 sw (sp+20),r11
800687c: 5b 8c 00 10 sw (sp+16),r12
8006880: 5b 8d 00 0c sw (sp+12),r13
8006884: 5b 8e 00 08 sw (sp+8),r14
8006888: 5b 9d 00 04 sw (sp+4),ra
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;
800688c: 78 03 08 01 mvhi r3,0x801
8006890: 38 63 40 f4 ori r3,r3,0x40f4
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8006894: 78 02 08 01 mvhi r2,0x801
8006898: 78 05 08 01 mvhi r5,0x801
800689c: 78 01 08 01 mvhi r1,0x801
80068a0: 78 04 08 01 mvhi r4,0x801
initial_extensions = Configuration.User_extension_table;
80068a4: 28 6b 00 3c lw r11,(r3+60)
80068a8: 38 42 4a 64 ori r2,r2,0x4a64
80068ac: 38 21 49 0c ori r1,r1,0x490c
80068b0: 38 a5 4a 68 ori r5,r5,0x4a68
80068b4: 38 84 49 10 ori r4,r4,0x4910
80068b8: 58 45 00 00 sw (r2+0),r5
head->previous = NULL;
80068bc: 58 40 00 04 sw (r2+4),r0
tail->previous = head;
80068c0: 58 42 00 08 sw (r2+8),r2
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80068c4: 58 24 00 00 sw (r1+0),r4
head->previous = NULL;
80068c8: 58 20 00 04 sw (r1+4),r0
tail->previous = head;
80068cc: 58 21 00 08 sw (r1+8),r1
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;
80068d0: 28 6e 00 38 lw r14,(r3+56)
initial_extensions = Configuration.User_extension_table;
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
80068d4: 45 60 00 26 be r11,r0,800696c <_User_extensions_Handler_initialization+0xf8><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
80068d8: b5 ce 68 00 add r13,r14,r14
80068dc: b5 ae 68 00 add r13,r13,r14
80068e0: b5 ad 68 00 add r13,r13,r13
80068e4: b5 ad 68 00 add r13,r13,r13
80068e8: b5 ae 68 00 add r13,r13,r14
80068ec: b5 ad 68 00 add r13,r13,r13
80068f0: b5 ad 68 00 add r13,r13,r13
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
80068f4: b9 a0 08 00 mv r1,r13
80068f8: f8 00 01 f9 calli 80070dc <_Workspace_Allocate_or_fatal_error>
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
80068fc: 34 02 00 00 mvi r2,0
8006900: b9 a0 18 00 mv r3,r13
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
8006904: b8 20 60 00 mv r12,r1
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
8006908: f8 00 1c 14 calli 800d958 <memset>
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
800690c: 45 c0 00 18 be r14,r0,800696c <_User_extensions_Handler_initialization+0xf8><== NEVER TAKEN
8006910: 34 0d 00 00 mvi r13,0
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
8006914: 29 62 00 00 lw r2,(r11+0)
_User_extensions_Add_set( extension );
8006918: b9 80 08 00 mv r1,r12
800691c: 35 ad 00 01 addi r13,r13,1
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
8006920: 59 82 00 14 sw (r12+20),r2
8006924: 29 62 00 04 lw r2,(r11+4)
8006928: 59 82 00 18 sw (r12+24),r2
800692c: 29 62 00 08 lw r2,(r11+8)
8006930: 59 82 00 1c sw (r12+28),r2
8006934: 29 62 00 0c lw r2,(r11+12)
8006938: 59 82 00 20 sw (r12+32),r2
800693c: 29 62 00 10 lw r2,(r11+16)
8006940: 59 82 00 24 sw (r12+36),r2
8006944: 29 62 00 14 lw r2,(r11+20)
8006948: 59 82 00 28 sw (r12+40),r2
800694c: 29 62 00 18 lw r2,(r11+24)
8006950: 59 82 00 2c sw (r12+44),r2
8006954: 29 62 00 1c lw r2,(r11+28)
8006958: 35 6b 00 20 addi r11,r11,32
800695c: 59 82 00 30 sw (r12+48),r2
_User_extensions_Add_set( extension );
8006960: f8 00 10 81 calli 800ab64 <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
8006964: 35 8c 00 34 addi r12,r12,52
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
8006968: 55 cd ff eb bgu r14,r13,8006914 <_User_extensions_Handler_initialization+0xa0>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
800696c: 2b 9d 00 04 lw ra,(sp+4)
8006970: 2b 8b 00 14 lw r11,(sp+20)
8006974: 2b 8c 00 10 lw r12,(sp+16)
8006978: 2b 8d 00 0c lw r13,(sp+12)
800697c: 2b 8e 00 08 lw r14,(sp+8)
8006980: 37 9c 00 14 addi sp,sp,20
8006984: c3 a0 00 00 ret
08006988 <_User_extensions_Thread_begin>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
8006988: 37 9c ff f0 addi sp,sp,-16
800698c: 5b 8b 00 10 sw (sp+16),r11
8006990: 5b 8c 00 0c sw (sp+12),r12
8006994: 5b 8d 00 08 sw (sp+8),r13
8006998: 5b 9d 00 04 sw (sp+4),ra
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
800699c: 78 02 08 01 mvhi r2,0x801
80069a0: 38 42 4a 64 ori r2,r2,0x4a64
80069a4: 28 4b 00 00 lw r11,(r2+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
80069a8: 78 0c 08 01 mvhi r12,0x801
80069ac: 39 8c 4a 68 ori r12,r12,0x4a68
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
80069b0: b8 20 68 00 mv r13,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
80069b4: 45 6c 00 07 be r11,r12,80069d0 <_User_extensions_Thread_begin+0x48><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
80069b8: 29 62 00 28 lw r2,(r11+40)
(*the_extension->Callouts.thread_begin)( executing );
80069bc: b9 a0 08 00 mv r1,r13
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
80069c0: 44 40 00 02 be r2,r0,80069c8 <_User_extensions_Thread_begin+0x40>
(*the_extension->Callouts.thread_begin)( executing );
80069c4: d8 40 00 00 call r2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
80069c8: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
80069cc: 5d 6c ff fb bne r11,r12,80069b8 <_User_extensions_Thread_begin+0x30>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
(*the_extension->Callouts.thread_begin)( executing );
}
}
80069d0: 2b 9d 00 04 lw ra,(sp+4)
80069d4: 2b 8b 00 10 lw r11,(sp+16)
80069d8: 2b 8c 00 0c lw r12,(sp+12)
80069dc: 2b 8d 00 08 lw r13,(sp+8)
80069e0: 37 9c 00 10 addi sp,sp,16
80069e4: c3 a0 00 00 ret
08006ab8 <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
8006ab8: 37 9c ff ec addi sp,sp,-20
8006abc: 5b 8b 00 14 sw (sp+20),r11
8006ac0: 5b 8c 00 10 sw (sp+16),r12
8006ac4: 5b 8d 00 0c sw (sp+12),r13
8006ac8: 5b 8e 00 08 sw (sp+8),r14
8006acc: 5b 9d 00 04 sw (sp+4),ra
return false;
}
}
return true;
}
8006ad0: 78 02 08 01 mvhi r2,0x801
8006ad4: 38 42 4a 64 ori r2,r2,0x4a64
8006ad8: 28 4b 00 00 lw r11,(r2+0)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
8006adc: 78 0c 08 01 mvhi r12,0x801
8006ae0: 39 8c 4a 68 ori r12,r12,0x4a68
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
8006ae4: b8 20 70 00 mv r14,r1
if ( !status )
return false;
}
}
return true;
8006ae8: 34 01 00 01 mvi r1,1
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
8006aec: 45 6c 00 0c be r11,r12,8006b1c <_User_extensions_Thread_create+0x64><== NEVER TAKEN
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
status = (*the_extension->Callouts.thread_create)(
8006af0: 78 0d 08 01 mvhi r13,0x801
8006af4: 39 ad 4d b4 ori r13,r13,0x4db4
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
8006af8: 29 63 00 14 lw r3,(r11+20)
status = (*the_extension->Callouts.thread_create)(
8006afc: b9 c0 10 00 mv r2,r14
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
8006b00: 44 60 00 04 be r3,r0,8006b10 <_User_extensions_Thread_create+0x58>
status = (*the_extension->Callouts.thread_create)(
8006b04: 29 a1 00 0c lw r1,(r13+12)
8006b08: d8 60 00 00 call r3
_Thread_Executing,
the_thread
);
if ( !status )
8006b0c: 44 20 00 0b be r1,r0,8006b38 <_User_extensions_Thread_create+0x80>
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
8006b10: 29 6b 00 00 lw r11,(r11+0)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
8006b14: 5d 6c ff f9 bne r11,r12,8006af8 <_User_extensions_Thread_create+0x40>
if ( !status )
return false;
}
}
return true;
8006b18: 34 01 00 01 mvi r1,1
}
8006b1c: 2b 9d 00 04 lw ra,(sp+4)
8006b20: 2b 8b 00 14 lw r11,(sp+20)
8006b24: 2b 8c 00 10 lw r12,(sp+16)
8006b28: 2b 8d 00 0c lw r13,(sp+12)
8006b2c: 2b 8e 00 08 lw r14,(sp+8)
8006b30: 37 9c 00 14 addi sp,sp,20
8006b34: c3 a0 00 00 ret
status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
if ( !status )
return false;
8006b38: 34 01 00 00 mvi r1,0
}
}
return true;
}
8006b3c: 2b 9d 00 04 lw ra,(sp+4)
8006b40: 2b 8b 00 14 lw r11,(sp+20)
8006b44: 2b 8c 00 10 lw r12,(sp+16)
8006b48: 2b 8d 00 0c lw r13,(sp+12)
8006b4c: 2b 8e 00 08 lw r14,(sp+8)
8006b50: 37 9c 00 14 addi sp,sp,20
8006b54: c3 a0 00 00 ret
08006b58 <_User_extensions_Thread_delete>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
8006b58: 37 9c ff ec addi sp,sp,-20
8006b5c: 5b 8b 00 14 sw (sp+20),r11
8006b60: 5b 8c 00 10 sw (sp+16),r12
8006b64: 5b 8d 00 0c sw (sp+12),r13
8006b68: 5b 8e 00 08 sw (sp+8),r14
8006b6c: 5b 9d 00 04 sw (sp+4),ra
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
8006b70: 78 0c 08 01 mvhi r12,0x801
8006b74: 39 8c 4a 64 ori r12,r12,0x4a64
8006b78: 29 8b 00 08 lw r11,(r12+8)
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
8006b7c: b8 20 70 00 mv r14,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006b80: 45 6c 00 0a be r11,r12,8006ba8 <_User_extensions_Thread_delete+0x50><== NEVER TAKEN
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
(*the_extension->Callouts.thread_delete)(
8006b84: 78 0d 08 01 mvhi r13,0x801
8006b88: 39 ad 4d b4 ori r13,r13,0x4db4
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
8006b8c: 29 63 00 20 lw r3,(r11+32)
(*the_extension->Callouts.thread_delete)(
8006b90: b9 c0 10 00 mv r2,r14
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
8006b94: 44 60 00 03 be r3,r0,8006ba0 <_User_extensions_Thread_delete+0x48>
(*the_extension->Callouts.thread_delete)(
8006b98: 29 a1 00 0c lw r1,(r13+12)
8006b9c: d8 60 00 00 call r3
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 ) {
8006ba0: 29 6b 00 04 lw r11,(r11+4)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006ba4: 5d 6c ff fa bne r11,r12,8006b8c <_User_extensions_Thread_delete+0x34>
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
8006ba8: 2b 9d 00 04 lw ra,(sp+4)
8006bac: 2b 8b 00 14 lw r11,(sp+20)
8006bb0: 2b 8c 00 10 lw r12,(sp+16)
8006bb4: 2b 8d 00 0c lw r13,(sp+12)
8006bb8: 2b 8e 00 08 lw r14,(sp+8)
8006bbc: 37 9c 00 14 addi sp,sp,20
8006bc0: c3 a0 00 00 ret
080069e8 <_User_extensions_Thread_exitted>:
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
80069e8: 37 9c ff f0 addi sp,sp,-16
80069ec: 5b 8b 00 10 sw (sp+16),r11
80069f0: 5b 8c 00 0c sw (sp+12),r12
80069f4: 5b 8d 00 08 sw (sp+8),r13
80069f8: 5b 9d 00 04 sw (sp+4),ra
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
80069fc: 78 0c 08 01 mvhi r12,0x801
8006a00: 39 8c 4a 64 ori r12,r12,0x4a64
8006a04: 29 8b 00 08 lw r11,(r12+8)
}
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
8006a08: b8 20 68 00 mv r13,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006a0c: 45 6c 00 07 be r11,r12,8006a28 <_User_extensions_Thread_exitted+0x40><== NEVER TAKEN
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
8006a10: 29 62 00 2c lw r2,(r11+44)
(*the_extension->Callouts.thread_exitted)( executing );
8006a14: b9 a0 08 00 mv r1,r13
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
8006a18: 44 40 00 02 be r2,r0,8006a20 <_User_extensions_Thread_exitted+0x38>
(*the_extension->Callouts.thread_exitted)( executing );
8006a1c: d8 40 00 00 call r2
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 ) {
8006a20: 29 6b 00 04 lw r11,(r11+4)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006a24: 5d 6c ff fb bne r11,r12,8006a10 <_User_extensions_Thread_exitted+0x28>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
(*the_extension->Callouts.thread_exitted)( executing );
}
}
8006a28: 2b 9d 00 04 lw ra,(sp+4)
8006a2c: 2b 8b 00 10 lw r11,(sp+16)
8006a30: 2b 8c 00 0c lw r12,(sp+12)
8006a34: 2b 8d 00 08 lw r13,(sp+8)
8006a38: 37 9c 00 10 addi sp,sp,16
8006a3c: c3 a0 00 00 ret
08007bb0 <_User_extensions_Thread_restart>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
8007bb0: 37 9c ff ec addi sp,sp,-20
8007bb4: 5b 8b 00 14 sw (sp+20),r11
8007bb8: 5b 8c 00 10 sw (sp+16),r12
8007bbc: 5b 8d 00 0c sw (sp+12),r13
8007bc0: 5b 8e 00 08 sw (sp+8),r14
8007bc4: 5b 9d 00 04 sw (sp+4),ra
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
8007bc8: 78 02 08 02 mvhi r2,0x802
8007bcc: 38 42 0a bc ori r2,r2,0xabc
8007bd0: 28 4b 00 00 lw r11,(r2+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8007bd4: 78 0c 08 02 mvhi r12,0x802
8007bd8: 39 8c 0a c0 ori r12,r12,0xac0
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
8007bdc: b8 20 70 00 mv r14,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8007be0: 45 6c 00 0a be r11,r12,8007c08 <_User_extensions_Thread_restart+0x58><== NEVER TAKEN
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
(*the_extension->Callouts.thread_restart)(
8007be4: 78 0d 08 02 mvhi r13,0x802
8007be8: 39 ad 0e 0c ori r13,r13,0xe0c
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
8007bec: 29 63 00 1c lw r3,(r11+28)
(*the_extension->Callouts.thread_restart)(
8007bf0: b9 c0 10 00 mv r2,r14
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
8007bf4: 44 60 00 03 be r3,r0,8007c00 <_User_extensions_Thread_restart+0x50>
(*the_extension->Callouts.thread_restart)(
8007bf8: 29 a1 00 0c lw r1,(r13+12)
8007bfc: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
8007c00: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8007c04: 5d 6c ff fa bne r11,r12,8007bec <_User_extensions_Thread_restart+0x3c>
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
8007c08: 2b 9d 00 04 lw ra,(sp+4)
8007c0c: 2b 8b 00 14 lw r11,(sp+20)
8007c10: 2b 8c 00 10 lw r12,(sp+16)
8007c14: 2b 8d 00 0c lw r13,(sp+12)
8007c18: 2b 8e 00 08 lw r14,(sp+8)
8007c1c: 37 9c 00 14 addi sp,sp,20
8007c20: c3 a0 00 00 ret
08006bc4 <_User_extensions_Thread_start>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
8006bc4: 37 9c ff ec addi sp,sp,-20
8006bc8: 5b 8b 00 14 sw (sp+20),r11
8006bcc: 5b 8c 00 10 sw (sp+16),r12
8006bd0: 5b 8d 00 0c sw (sp+12),r13
8006bd4: 5b 8e 00 08 sw (sp+8),r14
8006bd8: 5b 9d 00 04 sw (sp+4),ra
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
8006bdc: 78 02 08 01 mvhi r2,0x801
8006be0: 38 42 4a 64 ori r2,r2,0x4a64
8006be4: 28 4b 00 00 lw r11,(r2+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006be8: 78 0c 08 01 mvhi r12,0x801
8006bec: 39 8c 4a 68 ori r12,r12,0x4a68
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
8006bf0: b8 20 70 00 mv r14,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006bf4: 45 6c 00 0a be r11,r12,8006c1c <_User_extensions_Thread_start+0x58><== NEVER TAKEN
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
(*the_extension->Callouts.thread_start)(
8006bf8: 78 0d 08 01 mvhi r13,0x801
8006bfc: 39 ad 4d b4 ori r13,r13,0x4db4
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
8006c00: 29 63 00 18 lw r3,(r11+24)
(*the_extension->Callouts.thread_start)(
8006c04: b9 c0 10 00 mv r2,r14
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
8006c08: 44 60 00 03 be r3,r0,8006c14 <_User_extensions_Thread_start+0x50>
(*the_extension->Callouts.thread_start)(
8006c0c: 29 a1 00 0c lw r1,(r13+12)
8006c10: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
8006c14: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006c18: 5d 6c ff fa bne r11,r12,8006c00 <_User_extensions_Thread_start+0x3c>
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
8006c1c: 2b 9d 00 04 lw ra,(sp+4)
8006c20: 2b 8b 00 14 lw r11,(sp+20)
8006c24: 2b 8c 00 10 lw r12,(sp+16)
8006c28: 2b 8d 00 0c lw r13,(sp+12)
8006c2c: 2b 8e 00 08 lw r14,(sp+8)
8006c30: 37 9c 00 14 addi sp,sp,20
8006c34: c3 a0 00 00 ret
08006c38 <_User_extensions_Thread_switch>:
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
8006c38: 37 9c ff ec addi sp,sp,-20
8006c3c: 5b 8b 00 14 sw (sp+20),r11
8006c40: 5b 8c 00 10 sw (sp+16),r12
8006c44: 5b 8d 00 0c sw (sp+12),r13
8006c48: 5b 8e 00 08 sw (sp+8),r14
8006c4c: 5b 9d 00 04 sw (sp+4),ra
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
8006c50: 78 03 08 01 mvhi r3,0x801
8006c54: 38 63 49 0c ori r3,r3,0x490c
8006c58: 28 6b 00 00 lw r11,(r3+0)
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
8006c5c: 78 0c 08 01 mvhi r12,0x801
8006c60: 39 8c 49 10 ori r12,r12,0x4910
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
8006c64: b8 20 70 00 mv r14,r1
8006c68: b8 40 68 00 mv r13,r2
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
8006c6c: 45 6c 00 07 be r11,r12,8006c88 <_User_extensions_Thread_switch+0x50><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
8006c70: 29 63 00 08 lw r3,(r11+8)
8006c74: b9 c0 08 00 mv r1,r14
8006c78: b9 a0 10 00 mv r2,r13
8006c7c: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
8006c80: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
8006c84: 5d 6c ff fb bne r11,r12,8006c70 <_User_extensions_Thread_switch+0x38>
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
8006c88: 2b 9d 00 04 lw ra,(sp+4)
8006c8c: 2b 8b 00 14 lw r11,(sp+20)
8006c90: 2b 8c 00 10 lw r12,(sp+16)
8006c94: 2b 8d 00 0c lw r13,(sp+12)
8006c98: 2b 8e 00 08 lw r14,(sp+8)
8006c9c: 37 9c 00 14 addi sp,sp,20
8006ca0: c3 a0 00 00 ret
08009344 <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
8009344: 37 9c ff e4 addi sp,sp,-28
8009348: 5b 8b 00 1c sw (sp+28),r11
800934c: 5b 8c 00 18 sw (sp+24),r12
8009350: 5b 8d 00 14 sw (sp+20),r13
8009354: 5b 8e 00 10 sw (sp+16),r14
8009358: 5b 8f 00 0c sw (sp+12),r15
800935c: 5b 90 00 08 sw (sp+8),r16
8009360: 5b 9d 00 04 sw (sp+4),ra
8009364: b8 20 60 00 mv r12,r1
8009368: b8 60 58 00 mv r11,r3
ISR_Level level;
_ISR_Disable( level );
800936c: 90 00 18 00 rcsr r3,IE
8009370: 34 01 ff fe mvi r1,-2
8009374: a0 61 08 00 and r1,r3,r1
8009378: d0 01 00 00 wcsr IE,r1
}
}
_ISR_Enable( level );
}
800937c: 29 81 00 00 lw r1,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8009380: 35 8e 00 04 addi r14,r12,4
Watchdog_Interval units
)
{
ISR_Level level;
_ISR_Disable( level );
8009384: b8 60 20 00 mv r4,r3
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
8009388: 44 2e 00 04 be r1,r14,8009398 <_Watchdog_Adjust+0x54>
switch ( direction ) {
800938c: 44 40 00 11 be r2,r0,80093d0 <_Watchdog_Adjust+0x8c>
8009390: 34 03 00 01 mvi r3,1
8009394: 44 43 00 0b be r2,r3,80093c0 <_Watchdog_Adjust+0x7c> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
8009398: d0 04 00 00 wcsr IE,r4
}
800939c: 2b 9d 00 04 lw ra,(sp+4)
80093a0: 2b 8b 00 1c lw r11,(sp+28)
80093a4: 2b 8c 00 18 lw r12,(sp+24)
80093a8: 2b 8d 00 14 lw r13,(sp+20)
80093ac: 2b 8e 00 10 lw r14,(sp+16)
80093b0: 2b 8f 00 0c lw r15,(sp+12)
80093b4: 2b 90 00 08 lw r16,(sp+8)
80093b8: 37 9c 00 1c addi sp,sp,28
80093bc: c3 a0 00 00 ret
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
80093c0: 28 22 00 10 lw r2,(r1+16)
80093c4: b4 4b 58 00 add r11,r2,r11
80093c8: 58 2b 00 10 sw (r1+16),r11
break;
80093cc: e3 ff ff f3 bi 8009398 <_Watchdog_Adjust+0x54>
case WATCHDOG_FORWARD:
while ( units ) {
80093d0: b8 60 20 00 mv r4,r3
80093d4: 45 62 ff f1 be r11,r2,8009398 <_Watchdog_Adjust+0x54> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
80093d8: 28 2d 00 10 lw r13,(r1+16)
80093dc: 55 ab 00 13 bgu r13,r11,8009428 <_Watchdog_Adjust+0xe4> <== NEVER TAKEN
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
80093e0: 34 10 00 01 mvi r16,1
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
80093e4: 34 0f ff fe mvi r15,-2
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
80093e8: 58 30 00 10 sw (r1+16),r16
_ISR_Enable( level );
80093ec: d0 03 00 00 wcsr IE,r3
_Watchdog_Tickle( header );
80093f0: b9 80 08 00 mv r1,r12
80093f4: f8 00 00 b2 calli 80096bc <_Watchdog_Tickle>
_ISR_Disable( level );
80093f8: 90 00 10 00 rcsr r2,IE
80093fc: a0 4f 08 00 and r1,r2,r15
8009400: d0 01 00 00 wcsr IE,r1
}
}
_ISR_Enable( level );
}
8009404: 29 84 00 00 lw r4,(r12+0)
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
8009408: c9 6d 58 00 sub r11,r11,r13
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
800940c: b8 40 18 00 mv r3,r2
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
8009410: b8 80 08 00 mv r1,r4
if ( _Chain_Is_empty( header ) )
8009414: 45 c4 00 08 be r14,r4,8009434 <_Watchdog_Adjust+0xf0>
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
8009418: 45 60 00 07 be r11,r0,8009434 <_Watchdog_Adjust+0xf0> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
800941c: 28 2d 00 10 lw r13,(r1+16)
8009420: 51 6d ff f2 bgeu r11,r13,80093e8 <_Watchdog_Adjust+0xa4>
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
8009424: b8 40 20 00 mv r4,r2
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
8009428: c9 ab 58 00 sub r11,r13,r11
800942c: 58 2b 00 10 sw (r1+16),r11
break;
8009430: e3 ff ff da bi 8009398 <_Watchdog_Adjust+0x54>
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
8009434: b8 40 20 00 mv r4,r2
8009438: e3 ff ff d8 bi 8009398 <_Watchdog_Adjust+0x54>
08006ca4 <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
8006ca4: 37 9c ff f8 addi sp,sp,-8
8006ca8: 5b 8b 00 08 sw (sp+8),r11
8006cac: 5b 8c 00 04 sw (sp+4),r12
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
8006cb0: 78 03 08 01 mvhi r3,0x801
8006cb4: 38 63 4d b4 ori r3,r3,0x4db4
8006cb8: 28 69 00 08 lw r9,(r3+8)
_ISR_Disable( level );
8006cbc: 90 00 30 00 rcsr r6,IE
8006cc0: 34 08 ff fe mvi r8,-2
8006cc4: a0 c8 40 00 and r8,r6,r8
8006cc8: d0 08 00 00 wcsr IE,r8
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
8006ccc: 28 43 00 08 lw r3,(r2+8)
8006cd0: 5c 60 00 3f bne r3,r0,8006dcc <_Watchdog_Insert+0x128>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
8006cd4: 78 0c 08 01 mvhi r12,0x801
8006cd8: 39 8c 4a 14 ori r12,r12,0x4a14
8006cdc: 29 83 00 00 lw r3,(r12+0)
8006ce0: 78 07 08 01 mvhi r7,0x801
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
8006ce4: 34 04 00 01 mvi r4,1
_Watchdog_Sync_count++;
8006ce8: 34 63 00 01 addi r3,r3,1
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
8006cec: 58 44 00 08 sw (r2+8),r4
_Watchdog_Sync_count++;
8006cf0: 59 83 00 00 sw (r12+0),r3
8006cf4: 38 e7 49 ac ori r7,r7,0x49ac
delta_interval -= after->delta_interval;
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006cf8: 34 0a 00 01 mvi r10,1
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
restart:
delta_interval = the_watchdog->initial;
8006cfc: 28 44 00 0c lw r4,(r2+12)
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
8006d00: 28 23 00 00 lw r3,(r1+0)
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
8006d04: 44 80 00 14 be r4,r0,8006d54 <_Watchdog_Insert+0xb0>
8006d08: 28 65 00 00 lw r5,(r3+0)
8006d0c: 44 a0 00 12 be r5,r0,8006d54 <_Watchdog_Insert+0xb0>
break;
if ( delta_interval < after->delta_interval ) {
8006d10: 28 65 00 10 lw r5,(r3+16)
8006d14: 54 a4 00 0e bgu r5,r4,8006d4c <_Watchdog_Insert+0xa8>
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
8006d18: d0 06 00 00 wcsr IE,r6
8006d1c: d0 08 00 00 wcsr IE,r8
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006d20: 28 4b 00 08 lw r11,(r2+8)
8006d24: 5d 6a 00 19 bne r11,r10,8006d88 <_Watchdog_Insert+0xe4>
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
8006d28: 28 eb 00 00 lw r11,(r7+0)
8006d2c: 55 69 00 2d bgu r11,r9,8006de0 <_Watchdog_Insert+0x13c>
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
8006d30: c8 85 20 00 sub r4,r4,r5
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
8006d34: 28 63 00 00 lw r3,(r3+0)
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
8006d38: 44 80 00 07 be r4,r0,8006d54 <_Watchdog_Insert+0xb0>
8006d3c: 28 65 00 00 lw r5,(r3+0)
8006d40: 44 a0 00 05 be r5,r0,8006d54 <_Watchdog_Insert+0xb0>
break;
if ( delta_interval < after->delta_interval ) {
8006d44: 28 65 00 10 lw r5,(r3+16)
8006d48: 50 85 00 19 bgeu r4,r5,8006dac <_Watchdog_Insert+0x108>
after->delta_interval -= delta_interval;
8006d4c: c8 a4 28 00 sub r5,r5,r4
8006d50: 58 65 00 10 sw (r3+16),r5
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
8006d54: 28 63 00 04 lw r3,(r3+4)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
8006d58: 78 01 08 01 mvhi r1,0x801
8006d5c: 38 21 4a 18 ori r1,r1,0x4a18
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
8006d60: 28 65 00 00 lw r5,(r3+0)
8006d64: 28 28 00 00 lw r8,(r1+0)
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
8006d68: 34 01 00 02 mvi r1,2
8006d6c: 58 41 00 08 sw (r2+8),r1
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
8006d70: 58 44 00 10 sw (r2+16),r4
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
8006d74: 58 43 00 04 sw (r2+4),r3
before_node = after_node->next;
after_node->next = the_node;
8006d78: 58 62 00 00 sw (r3+0),r2
the_node->next = before_node;
before_node->previous = the_node;
8006d7c: 58 a2 00 04 sw (r5+4),r2
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
8006d80: 58 45 00 00 sw (r2+0),r5
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
8006d84: 58 48 00 14 sw (r2+20),r8
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
8006d88: 58 e9 00 00 sw (r7+0),r9
_Watchdog_Sync_count--;
8006d8c: 29 81 00 00 lw r1,(r12+0)
8006d90: 34 21 ff ff addi r1,r1,-1
8006d94: 59 81 00 00 sw (r12+0),r1
_ISR_Enable( level );
8006d98: d0 06 00 00 wcsr IE,r6
}
8006d9c: 2b 8b 00 08 lw r11,(sp+8)
8006da0: 2b 8c 00 04 lw r12,(sp+4)
8006da4: 37 9c 00 08 addi sp,sp,8
8006da8: c3 a0 00 00 ret
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
8006dac: d0 06 00 00 wcsr IE,r6
8006db0: d0 08 00 00 wcsr IE,r8
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006db4: 28 4b 00 08 lw r11,(r2+8)
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
8006db8: c8 85 20 00 sub r4,r4,r5
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006dbc: 5d 6a ff f3 bne r11,r10,8006d88 <_Watchdog_Insert+0xe4> <== NEVER TAKEN
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
8006dc0: 28 e5 00 00 lw r5,(r7+0)
8006dc4: 54 a9 00 07 bgu r5,r9,8006de0 <_Watchdog_Insert+0x13c> <== NEVER TAKEN
8006dc8: e3 ff ff db bi 8006d34 <_Watchdog_Insert+0x90>
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
8006dcc: d0 06 00 00 wcsr IE,r6
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
8006dd0: 2b 8b 00 08 lw r11,(sp+8)
8006dd4: 2b 8c 00 04 lw r12,(sp+4)
8006dd8: 37 9c 00 08 addi sp,sp,8
8006ddc: c3 a0 00 00 ret
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
_Watchdog_Sync_level = insert_isr_nest_level;
8006de0: 58 e9 00 00 sw (r7+0),r9
goto restart;
8006de4: e3 ff ff c6 bi 8006cfc <_Watchdog_Insert+0x58>
08006e50 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
8006e50: 90 00 20 00 rcsr r4,IE
8006e54: 34 02 ff fe mvi r2,-2
8006e58: a0 82 10 00 and r2,r4,r2
8006e5c: d0 02 00 00 wcsr IE,r2
previous_state = the_watchdog->state;
8006e60: 28 22 00 08 lw r2,(r1+8)
switch ( previous_state ) {
8006e64: 34 03 00 01 mvi r3,1
8006e68: 44 43 00 27 be r2,r3,8006f04 <_Watchdog_Remove+0xb4>
8006e6c: 5c 40 00 08 bne r2,r0,8006e8c <_Watchdog_Remove+0x3c>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006e70: 78 03 08 01 mvhi r3,0x801
8006e74: 38 63 4a 18 ori r3,r3,0x4a18
8006e78: 28 63 00 00 lw r3,(r3+0)
8006e7c: 58 23 00 18 sw (r1+24),r3
_ISR_Enable( level );
8006e80: d0 04 00 00 wcsr IE,r4
return( previous_state );
}
8006e84: b8 40 08 00 mv r1,r2
8006e88: c3 a0 00 00 ret
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
8006e8c: 34 03 00 03 mvi r3,3
8006e90: 54 43 ff f8 bgu r2,r3,8006e70 <_Watchdog_Remove+0x20> <== NEVER TAKEN
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
8006e94: 28 23 00 00 lw r3,(r1+0)
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
8006e98: 58 20 00 08 sw (r1+8),r0
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
8006e9c: 28 65 00 00 lw r5,(r3+0)
8006ea0: 44 a0 00 05 be r5,r0,8006eb4 <_Watchdog_Remove+0x64>
next_watchdog->delta_interval += the_watchdog->delta_interval;
8006ea4: 28 66 00 10 lw r6,(r3+16)
8006ea8: 28 25 00 10 lw r5,(r1+16)
8006eac: b4 c5 28 00 add r5,r6,r5
8006eb0: 58 65 00 10 sw (r3+16),r5
if ( _Watchdog_Sync_count )
8006eb4: 78 05 08 01 mvhi r5,0x801
8006eb8: 38 a5 4a 14 ori r5,r5,0x4a14
8006ebc: 28 a5 00 00 lw r5,(r5+0)
8006ec0: 44 a0 00 07 be r5,r0,8006edc <_Watchdog_Remove+0x8c>
_Watchdog_Sync_level = _ISR_Nest_level;
8006ec4: 78 05 08 01 mvhi r5,0x801
8006ec8: 38 a5 4d b4 ori r5,r5,0x4db4
8006ecc: 28 a6 00 08 lw r6,(r5+8)
8006ed0: 78 05 08 01 mvhi r5,0x801
8006ed4: 38 a5 49 ac ori r5,r5,0x49ac
8006ed8: 58 a6 00 00 sw (r5+0),r6
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
8006edc: 28 25 00 04 lw r5,(r1+4)
next->previous = previous;
8006ee0: 58 65 00 04 sw (r3+4),r5
previous->next = next;
8006ee4: 58 a3 00 00 sw (r5+0),r3
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006ee8: 78 03 08 01 mvhi r3,0x801
8006eec: 38 63 4a 18 ori r3,r3,0x4a18
8006ef0: 28 63 00 00 lw r3,(r3+0)
8006ef4: 58 23 00 18 sw (r1+24),r3
_ISR_Enable( level );
8006ef8: d0 04 00 00 wcsr IE,r4
return( previous_state );
}
8006efc: b8 40 08 00 mv r1,r2
8006f00: c3 a0 00 00 ret
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006f04: 78 03 08 01 mvhi r3,0x801
8006f08: 38 63 4a 18 ori r3,r3,0x4a18
8006f0c: 28 63 00 00 lw r3,(r3+0)
/*
* 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;
8006f10: 58 20 00 08 sw (r1+8),r0
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006f14: 58 23 00 18 sw (r1+24),r3
_ISR_Enable( level );
8006f18: d0 04 00 00 wcsr IE,r4
return( previous_state );
}
8006f1c: b8 40 08 00 mv r1,r2
8006f20: c3 a0 00 00 ret
08008a90 <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
8008a90: 37 9c ff ec addi sp,sp,-20
8008a94: 5b 8b 00 14 sw (sp+20),r11
8008a98: 5b 8c 00 10 sw (sp+16),r12
8008a9c: 5b 8d 00 0c sw (sp+12),r13
8008aa0: 5b 8e 00 08 sw (sp+8),r14
8008aa4: 5b 9d 00 04 sw (sp+4),ra
8008aa8: b8 20 70 00 mv r14,r1
8008aac: b8 40 60 00 mv r12,r2
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
8008ab0: 90 00 68 00 rcsr r13,IE
8008ab4: 34 01 ff fe mvi r1,-2
8008ab8: a1 a1 08 00 and r1,r13,r1
8008abc: d0 01 00 00 wcsr IE,r1
printk( "Watchdog Chain: %s %p\n", name, header );
8008ac0: 78 01 08 01 mvhi r1,0x801
8008ac4: b9 80 18 00 mv r3,r12
8008ac8: 38 21 f4 d8 ori r1,r1,0xf4d8
8008acc: b9 c0 10 00 mv r2,r14
8008ad0: fb ff ea b0 calli 8003590 <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
8008ad4: 29 8b 00 00 lw r11,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8008ad8: 35 8c 00 04 addi r12,r12,4
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
8008adc: 45 6c 00 12 be r11,r12,8008b24 <_Watchdog_Report_chain+0x94>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
8008ae0: b9 60 10 00 mv r2,r11
8008ae4: 34 01 00 00 mvi r1,0
8008ae8: f8 00 00 13 calli 8008b34 <_Watchdog_Report>
_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 )
8008aec: 29 6b 00 00 lw r11,(r11+0)
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
8008af0: 5d 6c ff fc bne r11,r12,8008ae0 <_Watchdog_Report_chain+0x50><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
8008af4: 78 01 08 01 mvhi r1,0x801
8008af8: 38 21 f4 f0 ori r1,r1,0xf4f0
8008afc: b9 c0 10 00 mv r2,r14
8008b00: fb ff ea a4 calli 8003590 <printk>
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
8008b04: d0 0d 00 00 wcsr IE,r13
}
8008b08: 2b 9d 00 04 lw ra,(sp+4)
8008b0c: 2b 8b 00 14 lw r11,(sp+20)
8008b10: 2b 8c 00 10 lw r12,(sp+16)
8008b14: 2b 8d 00 0c lw r13,(sp+12)
8008b18: 2b 8e 00 08 lw r14,(sp+8)
8008b1c: 37 9c 00 14 addi sp,sp,20
8008b20: c3 a0 00 00 ret
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
8008b24: 78 01 08 01 mvhi r1,0x801
8008b28: 38 21 f5 00 ori r1,r1,0xf500
8008b2c: fb ff ea 99 calli 8003590 <printk>
8008b30: e3 ff ff f5 bi 8008b04 <_Watchdog_Report_chain+0x74>
08006f24 <_Watchdog_Tickle>:
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
8006f24: 37 9c ff e4 addi sp,sp,-28
8006f28: 5b 8b 00 1c sw (sp+28),r11
8006f2c: 5b 8c 00 18 sw (sp+24),r12
8006f30: 5b 8d 00 14 sw (sp+20),r13
8006f34: 5b 8e 00 10 sw (sp+16),r14
8006f38: 5b 8f 00 0c sw (sp+12),r15
8006f3c: 5b 90 00 08 sw (sp+8),r16
8006f40: 5b 9d 00 04 sw (sp+4),ra
8006f44: b8 20 60 00 mv r12,r1
* 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 );
8006f48: 90 00 68 00 rcsr r13,IE
8006f4c: 34 01 ff fe mvi r1,-2
8006f50: a1 a1 08 00 and r1,r13,r1
8006f54: d0 01 00 00 wcsr IE,r1
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
8006f58: 29 8b 00 00 lw r11,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8006f5c: 35 8e 00 04 addi r14,r12,4
* 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 );
8006f60: b9 a0 10 00 mv r2,r13
if ( _Chain_Is_empty( header ) )
8006f64: 45 6e 00 1e be r11,r14,8006fdc <_Watchdog_Tickle+0xb8>
* 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) {
8006f68: 29 61 00 10 lw r1,(r11+16)
8006f6c: 5c 20 00 26 bne r1,r0,8007004 <_Watchdog_Tickle+0xe0>
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
_ISR_Enable( level );
switch( watchdog_state ) {
8006f70: 34 10 00 02 mvi r16,2
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006f74: 34 0f ff fe mvi r15,-2
8006f78: e0 00 00 0a bi 8006fa0 <_Watchdog_Tickle+0x7c>
8006f7c: 90 00 10 00 rcsr r2,IE <== NOT EXECUTED
8006f80: a0 4f 08 00 and r1,r2,r15 <== NOT EXECUTED
8006f84: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
8006f88: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006f8c: b8 40 68 00 mv r13,r2 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
8006f90: b8 20 58 00 mv r11,r1 <== NOT EXECUTED
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
8006f94: 44 2e 00 12 be r1,r14,8006fdc <_Watchdog_Tickle+0xb8> <== NOT EXECUTED
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
8006f98: 28 21 00 10 lw r1,(r1+16)
8006f9c: 5c 20 00 10 bne r1,r0,8006fdc <_Watchdog_Tickle+0xb8>
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
8006fa0: b9 60 08 00 mv r1,r11
8006fa4: fb ff ff ab calli 8006e50 <_Watchdog_Remove>
_ISR_Enable( level );
8006fa8: d0 0d 00 00 wcsr IE,r13
switch( watchdog_state ) {
8006fac: 5c 30 ff f4 bne r1,r16,8006f7c <_Watchdog_Tickle+0x58> <== NEVER TAKEN
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
8006fb0: 29 63 00 1c lw r3,(r11+28)
8006fb4: 29 61 00 20 lw r1,(r11+32)
8006fb8: 29 62 00 24 lw r2,(r11+36)
8006fbc: d8 60 00 00 call r3
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006fc0: 90 00 10 00 rcsr r2,IE
8006fc4: a0 4f 08 00 and r1,r2,r15
8006fc8: d0 01 00 00 wcsr IE,r1
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
8006fcc: 29 81 00 00 lw r1,(r12+0)
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006fd0: b8 40 68 00 mv r13,r2
8006fd4: b8 20 58 00 mv r11,r1
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
8006fd8: 5c 2e ff f0 bne r1,r14,8006f98 <_Watchdog_Tickle+0x74>
leave:
_ISR_Enable(level);
8006fdc: d0 02 00 00 wcsr IE,r2
}
8006fe0: 2b 9d 00 04 lw ra,(sp+4)
8006fe4: 2b 8b 00 1c lw r11,(sp+28)
8006fe8: 2b 8c 00 18 lw r12,(sp+24)
8006fec: 2b 8d 00 14 lw r13,(sp+20)
8006ff0: 2b 8e 00 10 lw r14,(sp+16)
8006ff4: 2b 8f 00 0c lw r15,(sp+12)
8006ff8: 2b 90 00 08 lw r16,(sp+8)
8006ffc: 37 9c 00 1c addi sp,sp,28
8007000: c3 a0 00 00 ret
* 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) {
the_watchdog->delta_interval--;
8007004: 34 21 ff ff addi r1,r1,-1
8007008: 59 61 00 10 sw (r11+16),r1
if ( the_watchdog->delta_interval != 0 )
800700c: 44 20 ff d9 be r1,r0,8006f70 <_Watchdog_Tickle+0x4c>
8007010: e3 ff ff f3 bi 8006fdc <_Watchdog_Tickle+0xb8>
08003308 <adjtime>:
int adjtime(
struct timeval *delta,
struct timeval *olddelta
)
{
8003308: 37 9c ff e8 addi sp,sp,-24
800330c: 5b 8b 00 10 sw (sp+16),r11
8003310: 5b 8c 00 0c sw (sp+12),r12
8003314: 5b 8d 00 08 sw (sp+8),r13
8003318: 5b 9d 00 04 sw (sp+4),ra
800331c: b8 20 58 00 mv r11,r1
8003320: b8 40 60 00 mv r12,r2
long adjustment;
/*
* Simple validations
*/
if ( !delta )
8003324: 44 20 00 06 be r1,r0,800333c <adjtime+0x34>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
8003328: 78 03 08 01 mvhi r3,0x801
800332c: 38 63 e6 bc ori r3,r3,0xe6bc
8003330: 28 22 00 04 lw r2,(r1+4)
8003334: 28 61 00 00 lw r1,(r3+0)
8003338: 50 22 00 0b bgeu r1,r2,8003364 <adjtime+0x5c>
rtems_set_errno_and_return_minus_one( EINVAL );
800333c: f8 00 2a ac calli 800ddec <__errno>
8003340: 34 02 00 16 mvi r2,22
8003344: 58 22 00 00 sw (r1+0),r2
8003348: 34 01 ff ff mvi r1,-1
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
}
800334c: 2b 9d 00 04 lw ra,(sp+4)
8003350: 2b 8b 00 10 lw r11,(sp+16)
8003354: 2b 8c 00 0c lw r12,(sp+12)
8003358: 2b 8d 00 08 lw r13,(sp+8)
800335c: 37 9c 00 18 addi sp,sp,24
8003360: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
8003364: 45 80 00 04 be r12,r0,8003374 <adjtime+0x6c>
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
8003368: 59 80 00 04 sw (r12+4),r0
800336c: 29 62 00 04 lw r2,(r11+4)
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
olddelta->tv_sec = 0;
8003370: 59 80 00 00 sw (r12+0),r0
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
8003374: 29 63 00 00 lw r3,(r11+0)
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
8003378: 78 01 08 02 mvhi r1,0x802
800337c: 38 21 00 f4 ori r1,r1,0xf4
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
8003380: b4 63 20 00 add r4,r3,r3
8003384: b4 84 20 00 add r4,r4,r4
8003388: b4 84 20 00 add r4,r4,r4
800338c: b4 84 28 00 add r5,r4,r4
8003390: b4 a5 28 00 add r5,r5,r5
8003394: b4 a5 28 00 add r5,r5,r5
8003398: b4 a5 28 00 add r5,r5,r5
800339c: b4 a5 28 00 add r5,r5,r5
80033a0: c8 a4 28 00 sub r5,r5,r4
80033a4: b4 a5 20 00 add r4,r5,r5
80033a8: b4 84 20 00 add r4,r4,r4
80033ac: b4 84 20 00 add r4,r4,r4
80033b0: b4 84 20 00 add r4,r4,r4
80033b4: b4 84 20 00 add r4,r4,r4
80033b8: b4 84 20 00 add r4,r4,r4
80033bc: c8 85 20 00 sub r4,r4,r5
80033c0: b4 83 18 00 add r3,r4,r3
80033c4: b4 63 18 00 add r3,r3,r3
80033c8: b4 63 18 00 add r3,r3,r3
80033cc: b4 63 18 00 add r3,r3,r3
80033d0: b4 63 18 00 add r3,r3,r3
80033d4: b4 63 18 00 add r3,r3,r3
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
80033d8: 28 24 00 0c lw r4,(r1+12)
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
80033dc: b4 63 18 00 add r3,r3,r3
adjustment += delta->tv_usec;
80033e0: b4 43 18 00 add r3,r2,r3
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
return 0;
80033e4: 34 01 00 00 mvi r1,0
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
80033e8: 54 83 ff d9 bgu r4,r3,800334c <adjtime+0x44>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80033ec: 78 01 08 02 mvhi r1,0x802
80033f0: 38 21 0a 00 ori r1,r1,0xa00
80033f4: 28 22 00 00 lw r2,(r1+0)
80033f8: 34 42 00 01 addi r2,r2,1
80033fc: 58 22 00 00 sw (r1+0),r2
* This prevents context switches while we are adjusting the TOD
*/
_Thread_Disable_dispatch();
_TOD_Get( &ts );
8003400: 37 8d 00 14 addi r13,sp,20
8003404: b9 a0 08 00 mv r1,r13
8003408: f8 00 05 82 calli 8004a10 <_TOD_Get>
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
800340c: 29 63 00 04 lw r3,(r11+4)
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
8003410: 78 04 08 01 mvhi r4,0x801
8003414: 38 84 e8 38 ori r4,r4,0xe838
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
8003418: b4 63 18 00 add r3,r3,r3
800341c: b4 63 18 00 add r3,r3,r3
8003420: b4 63 18 00 add r3,r3,r3
8003424: b4 63 10 00 add r2,r3,r3
8003428: b4 42 10 00 add r2,r2,r2
800342c: b4 62 18 00 add r3,r3,r2
8003430: b4 63 10 00 add r2,r3,r3
8003434: b4 42 10 00 add r2,r2,r2
8003438: b4 62 18 00 add r3,r3,r2
800343c: b4 63 10 00 add r2,r3,r3
8003440: b4 42 10 00 add r2,r2,r2
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
8003444: 29 61 00 00 lw r1,(r11+0)
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
8003448: b4 62 18 00 add r3,r3,r2
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
800344c: 28 82 00 00 lw r2,(r4+0)
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
8003450: 2b 84 00 14 lw r4,(sp+20)
8003454: b4 81 20 00 add r4,r4,r1
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
8003458: 2b 81 00 18 lw r1,(sp+24)
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
800345c: 5b 84 00 14 sw (sp+20),r4
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
8003460: b4 61 18 00 add r3,r3,r1
8003464: 5b 83 00 18 sw (sp+24),r3
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
8003468: 50 43 00 09 bgeu r2,r3,800348c <adjtime+0x184>
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
800346c: 78 01 08 01 mvhi r1,0x801
8003470: 38 21 e8 3c ori r1,r1,0xe83c
8003474: 28 25 00 00 lw r5,(r1+0)
8003478: b4 65 18 00 add r3,r3,r5
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
800347c: 34 84 00 01 addi r4,r4,1
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
8003480: 54 62 ff fe bgu r3,r2,8003478 <adjtime+0x170> <== NEVER TAKEN
8003484: 5b 83 00 18 sw (sp+24),r3
8003488: 5b 84 00 14 sw (sp+20),r4
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
800348c: 78 04 08 01 mvhi r4,0x801
8003490: 38 84 e8 3c ori r4,r4,0xe83c
8003494: 28 82 00 00 lw r2,(r4+0)
8003498: 54 62 00 0a bgu r3,r2,80034c0 <adjtime+0x1b8> <== NEVER TAKEN
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
800349c: 78 01 08 01 mvhi r1,0x801
80034a0: 38 21 e6 b8 ori r1,r1,0xe6b8
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
80034a4: 2b 84 00 14 lw r4,(sp+20)
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
80034a8: 28 25 00 00 lw r5,(r1+0)
80034ac: b4 65 18 00 add r3,r3,r5
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
80034b0: 34 84 ff ff addi r4,r4,-1
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
80034b4: 50 43 ff fe bgeu r2,r3,80034ac <adjtime+0x1a4>
80034b8: 5b 83 00 18 sw (sp+24),r3
80034bc: 5b 84 00 14 sw (sp+20),r4
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec--;
}
_TOD_Set( &ts );
80034c0: b9 a0 08 00 mv r1,r13
80034c4: f8 00 05 85 calli 8004ad8 <_TOD_Set>
_Thread_Enable_dispatch();
80034c8: f8 00 0c 34 calli 8006598 <_Thread_Enable_dispatch>
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
80034cc: 34 01 00 00 mvi r1,0
_TOD_Set( &ts );
_Thread_Enable_dispatch();
/* set the user's output */
if ( olddelta )
80034d0: 45 80 ff 9f be r12,r0,800334c <adjtime+0x44>
*olddelta = *delta;
80034d4: 29 62 00 00 lw r2,(r11+0)
80034d8: 59 82 00 00 sw (r12+0),r2
80034dc: 29 62 00 04 lw r2,(r11+4)
80034e0: 59 82 00 04 sw (r12+4),r2
return 0;
}
80034e4: 2b 9d 00 04 lw ra,(sp+4)
80034e8: 2b 8b 00 10 lw r11,(sp+16)
80034ec: 2b 8c 00 0c lw r12,(sp+12)
80034f0: 2b 8d 00 08 lw r13,(sp+8)
80034f4: 37 9c 00 18 addi sp,sp,24
80034f8: c3 a0 00 00 ret
08003d6c <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003d6c: 37 9c ff ec addi sp,sp,-20
8003d70: 5b 8b 00 14 sw (sp+20),r11
8003d74: 5b 8c 00 10 sw (sp+16),r12
8003d78: 5b 8d 00 0c sw (sp+12),r13
8003d7c: 5b 8e 00 08 sw (sp+8),r14
8003d80: 5b 9d 00 04 sw (sp+4),ra
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
8003d84: 78 0b 08 01 mvhi r11,0x801
8003d88: 39 6b 88 68 ori r11,r11,0x8868
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003d8c: b8 20 68 00 mv r13,r1
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
8003d90: b9 60 08 00 mv r1,r11
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003d94: b8 40 60 00 mv r12,r2
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
8003d98: f8 00 05 1f calli 8005214 <pthread_mutex_lock>
if (fcntl (fildes, F_GETFD) < 0) {
8003d9c: b9 a0 08 00 mv r1,r13
8003da0: 34 02 00 01 mvi r2,1
8003da4: f8 00 1f 73 calli 800bb70 <fcntl>
8003da8: 4c 20 00 08 bge r1,r0,8003dc8 <aio_cancel+0x5c>
pthread_mutex_unlock(&aio_request_queue.mutex);
8003dac: b9 60 08 00 mv r1,r11
8003db0: f8 00 05 49 calli 80052d4 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
8003db4: f8 00 30 5a calli 800ff1c <__errno>
8003db8: 34 02 00 09 mvi r2,9
8003dbc: 58 22 00 00 sw (r1+0),r2
8003dc0: 34 0c ff ff mvi r12,-1
8003dc4: e0 00 00 16 bi 8003e1c <aio_cancel+0xb0>
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
8003dc8: 45 80 00 40 be r12,r0,8003ec8 <aio_cancel+0x15c>
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
8003dcc: 29 8e 00 00 lw r14,(r12+0)
8003dd0: 5d cd 00 37 bne r14,r13,8003eac <aio_cancel+0x140>
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);
8003dd4: 78 01 08 01 mvhi r1,0x801
8003dd8: 38 21 88 b0 ori r1,r1,0x88b0
8003ddc: b9 c0 10 00 mv r2,r14
8003de0: 34 03 00 00 mvi r3,0
8003de4: f8 00 00 e0 calli 8004164 <rtems_aio_search_fd>
8003de8: b8 20 68 00 mv r13,r1
if (r_chain == NULL) {
8003dec: 44 20 00 14 be r1,r0,8003e3c <aio_cancel+0xd0>
return AIO_ALLDONE;
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
8003df0: 34 2e 00 1c addi r14,r1,28
8003df4: b9 c0 08 00 mv r1,r14
8003df8: f8 00 05 07 calli 8005214 <pthread_mutex_lock>
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
8003dfc: b9 80 10 00 mv r2,r12
8003e00: 35 a1 00 08 addi r1,r13,8
8003e04: f8 00 02 10 calli 8004644 <rtems_aio_remove_req>
8003e08: b8 20 60 00 mv r12,r1
pthread_mutex_unlock (&r_chain->mutex);
8003e0c: b9 c0 08 00 mv r1,r14
8003e10: f8 00 05 31 calli 80052d4 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
8003e14: b9 60 08 00 mv r1,r11
8003e18: f8 00 05 2f calli 80052d4 <pthread_mutex_unlock>
return result;
}
return AIO_ALLDONE;
}
8003e1c: b9 80 08 00 mv r1,r12
8003e20: 2b 9d 00 04 lw ra,(sp+4)
8003e24: 2b 8b 00 14 lw r11,(sp+20)
8003e28: 2b 8c 00 10 lw r12,(sp+16)
8003e2c: 2b 8d 00 0c lw r13,(sp+12)
8003e30: 2b 8e 00 08 lw r14,(sp+8)
8003e34: 37 9c 00 14 addi sp,sp,20
8003e38: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
8003e3c: 29 62 00 54 lw r2,(r11+84)
8003e40: 78 01 08 01 mvhi r1,0x801
8003e44: 38 21 88 c0 ori r1,r1,0x88c0
8003e48: 44 41 00 15 be r2,r1,8003e9c <aio_cancel+0x130> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
8003e4c: 78 01 08 01 mvhi r1,0x801
8003e50: 38 21 88 bc ori r1,r1,0x88bc
8003e54: b9 c0 10 00 mv r2,r14
8003e58: 34 03 00 00 mvi r3,0
8003e5c: f8 00 00 c2 calli 8004164 <rtems_aio_search_fd>
if (r_chain == NULL) {
8003e60: 44 20 00 13 be r1,r0,8003eac <aio_cancel+0x140>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
8003e64: b9 80 10 00 mv r2,r12
8003e68: 34 21 00 08 addi r1,r1,8
8003e6c: f8 00 01 f6 calli 8004644 <rtems_aio_remove_req>
8003e70: b8 20 60 00 mv r12,r1
pthread_mutex_unlock (&aio_request_queue.mutex);
8003e74: b9 60 08 00 mv r1,r11
8003e78: f8 00 05 17 calli 80052d4 <pthread_mutex_unlock>
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
return AIO_ALLDONE;
}
8003e7c: b9 80 08 00 mv r1,r12
8003e80: 2b 9d 00 04 lw ra,(sp+4)
8003e84: 2b 8b 00 14 lw r11,(sp+20)
8003e88: 2b 8c 00 10 lw r12,(sp+16)
8003e8c: 2b 8d 00 0c lw r13,(sp+12)
8003e90: 2b 8e 00 08 lw r14,(sp+8)
8003e94: 37 9c 00 14 addi sp,sp,20
8003e98: c3 a0 00 00 ret
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);
8003e9c: b9 60 08 00 mv r1,r11
8003ea0: f8 00 05 0d calli 80052d4 <pthread_mutex_unlock>
return AIO_ALLDONE;
8003ea4: 34 0c 00 02 mvi r12,2
8003ea8: e3 ff ff dd bi 8003e1c <aio_cancel+0xb0>
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
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);
8003eac: b9 60 08 00 mv r1,r11
8003eb0: f8 00 05 09 calli 80052d4 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
8003eb4: f8 00 30 1a calli 800ff1c <__errno>
8003eb8: 34 02 00 16 mvi r2,22
8003ebc: 58 22 00 00 sw (r1+0),r2
8003ec0: 34 0c ff ff mvi r12,-1
8003ec4: e3 ff ff d6 bi 8003e1c <aio_cancel+0xb0>
/* 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);
8003ec8: 78 01 08 01 mvhi r1,0x801
8003ecc: 38 21 88 b0 ori r1,r1,0x88b0
8003ed0: b9 a0 10 00 mv r2,r13
8003ed4: 34 03 00 00 mvi r3,0
8003ed8: f8 00 00 a3 calli 8004164 <rtems_aio_search_fd>
8003edc: b8 20 70 00 mv r14,r1
if (r_chain == NULL) {
8003ee0: 44 2c 00 0e be r1,r12,8003f18 <aio_cancel+0x1ac>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
8003ee4: 34 2c 00 1c addi r12,r1,28
8003ee8: b9 80 08 00 mv r1,r12
8003eec: f8 00 04 ca calli 8005214 <pthread_mutex_lock>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8003ef0: b9 c0 08 00 mv r1,r14
8003ef4: f8 00 0b 00 calli 8006af4 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003ef8: b9 c0 08 00 mv r1,r14
8003efc: f8 00 01 b3 calli 80045c8 <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
8003f00: b9 80 08 00 mv r1,r12
8003f04: f8 00 04 f4 calli 80052d4 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
8003f08: b9 60 08 00 mv r1,r11
8003f0c: f8 00 04 f2 calli 80052d4 <pthread_mutex_unlock>
return AIO_CANCELED;
8003f10: 34 0c 00 00 mvi r12,0
8003f14: e3 ff ff c2 bi 8003e1c <aio_cancel+0xb0>
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)) {
8003f18: 29 62 00 54 lw r2,(r11+84)
8003f1c: 78 01 08 01 mvhi r1,0x801
8003f20: 38 21 88 c0 ori r1,r1,0x88c0
8003f24: 44 41 ff de be r2,r1,8003e9c <aio_cancel+0x130> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
8003f28: 78 01 08 01 mvhi r1,0x801
8003f2c: 38 21 88 bc ori r1,r1,0x88bc
8003f30: b9 a0 10 00 mv r2,r13
8003f34: 34 03 00 00 mvi r3,0
8003f38: f8 00 00 8b calli 8004164 <rtems_aio_search_fd>
8003f3c: b8 20 60 00 mv r12,r1
if (r_chain == NULL) {
8003f40: 44 2e ff d7 be r1,r14,8003e9c <aio_cancel+0x130>
8003f44: f8 00 0a ec calli 8006af4 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003f48: b9 80 08 00 mv r1,r12
pthread_mutex_destroy (&r_chain->mutex);
8003f4c: 35 8d 00 1c addi r13,r12,28
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003f50: f8 00 01 9e calli 80045c8 <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
8003f54: b9 a0 08 00 mv r1,r13
8003f58: f8 00 03 e7 calli 8004ef4 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
8003f5c: b9 a0 08 00 mv r1,r13
8003f60: f8 00 02 d4 calli 8004ab0 <pthread_cond_destroy>
free (r_chain);
8003f64: b9 80 08 00 mv r1,r12
8003f68: fb ff f8 f0 calli 8002328 <free>
pthread_mutex_unlock (&aio_request_queue.mutex);
8003f6c: b9 60 08 00 mv r1,r11
8003f70: f8 00 04 d9 calli 80052d4 <pthread_mutex_unlock>
return AIO_CANCELED;
8003f74: 34 0c 00 00 mvi r12,0
8003f78: e3 ff ff a9 bi 8003e1c <aio_cancel+0xb0>
08003f84 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
8003f84: 37 9c ff f4 addi sp,sp,-12
8003f88: 5b 8b 00 0c sw (sp+12),r11
8003f8c: 5b 8c 00 08 sw (sp+8),r12
8003f90: 5b 9d 00 04 sw (sp+4),ra
8003f94: b8 40 58 00 mv r11,r2
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
8003f98: 34 02 20 00 mvi r2,8192
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8003f9c: 34 0c 00 16 mvi r12,22
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
8003fa0: 5c 22 00 09 bne r1,r2,8003fc4 <aio_fsync+0x40>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8003fa4: 29 61 00 00 lw r1,(r11+0)
8003fa8: 34 02 00 03 mvi r2,3
8003fac: f8 00 1e f1 calli 800bb70 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8003fb0: 20 21 00 03 andi r1,r1,0x3
8003fb4: 34 21 ff ff addi r1,r1,-1
8003fb8: 34 02 00 01 mvi r2,1
8003fbc: 50 41 00 0d bgeu r2,r1,8003ff0 <aio_fsync+0x6c> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
8003fc0: 34 0c 00 09 mvi r12,9
8003fc4: 34 01 ff ff mvi r1,-1
8003fc8: 59 6c 00 2c sw (r11+44),r12
8003fcc: 59 61 00 30 sw (r11+48),r1
8003fd0: f8 00 2f d3 calli 800ff1c <__errno>
8003fd4: 58 2c 00 00 sw (r1+0),r12
8003fd8: 34 01 ff ff mvi r1,-1
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
8003fdc: 2b 9d 00 04 lw ra,(sp+4)
8003fe0: 2b 8b 00 0c lw r11,(sp+12)
8003fe4: 2b 8c 00 08 lw r12,(sp+8)
8003fe8: 37 9c 00 0c addi sp,sp,12
8003fec: c3 a0 00 00 ret
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
8003ff0: 34 01 00 18 mvi r1,24
8003ff4: fb ff fa a6 calli 8002a8c <malloc>
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
8003ff8: 34 0c 00 0b mvi r12,11
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
8003ffc: 44 20 ff f2 be r1,r0,8003fc4 <aio_fsync+0x40> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
8004000: 34 03 00 03 mvi r3,3
8004004: 59 63 00 28 sw (r11+40),r3
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
8004008: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
800400c: f8 00 01 b1 calli 80046d0 <rtems_aio_enqueue>
}
8004010: 2b 9d 00 04 lw ra,(sp+4)
8004014: 2b 8b 00 0c lw r11,(sp+12)
8004018: 2b 8c 00 08 lw r12,(sp+8)
800401c: 37 9c 00 0c addi sp,sp,12
8004020: c3 a0 00 00 ret
080048e0 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
80048e0: 37 9c ff f4 addi sp,sp,-12
80048e4: 5b 8b 00 0c sw (sp+12),r11
80048e8: 5b 8c 00 08 sw (sp+8),r12
80048ec: 5b 9d 00 04 sw (sp+4),ra
80048f0: b8 20 58 00 mv r11,r1
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
80048f4: 28 21 00 00 lw r1,(r1+0)
80048f8: 34 02 00 03 mvi r2,3
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
80048fc: 34 0c 00 09 mvi r12,9
aio_read (struct aiocb *aiocbp)
{
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8004900: f8 00 1c 9c calli 800bb70 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8004904: 20 21 00 03 andi r1,r1,0x3
8004908: 7c 22 00 02 cmpnei r2,r1,2
800490c: 7c 21 00 00 cmpnei r1,r1,0
8004910: a0 41 08 00 and r1,r2,r1
8004914: 5c 20 00 06 bne r1,r0,800492c <aio_read+0x4c>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
8004918: 29 6c 00 10 lw r12,(r11+16)
800491c: 5d 81 00 03 bne r12,r1,8004928 <aio_read+0x48>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
8004920: 29 61 00 04 lw r1,(r11+4)
8004924: 4c 2c 00 09 bge r1,r12,8004948 <aio_read+0x68>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8004928: 34 0c 00 16 mvi r12,22
800492c: 34 01 ff ff mvi r1,-1
8004930: 59 6c 00 2c sw (r11+44),r12
8004934: 59 61 00 30 sw (r11+48),r1
8004938: f8 00 2d 79 calli 800ff1c <__errno>
800493c: 58 2c 00 00 sw (r1+0),r12
8004940: 34 01 ff ff mvi r1,-1
8004944: e0 00 00 08 bi 8004964 <aio_read+0x84>
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
8004948: 34 01 00 18 mvi r1,24
800494c: fb ff f8 50 calli 8002a8c <malloc>
if (req == NULL)
8004950: 44 2c 00 0a be r1,r12,8004978 <aio_read+0x98> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
8004954: 34 03 00 01 mvi r3,1
8004958: 59 63 00 28 sw (r11+40),r3
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
800495c: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
8004960: fb ff ff 5c calli 80046d0 <rtems_aio_enqueue>
}
8004964: 2b 9d 00 04 lw ra,(sp+4)
8004968: 2b 8b 00 0c lw r11,(sp+12)
800496c: 2b 8c 00 08 lw r12,(sp+8)
8004970: 37 9c 00 0c addi sp,sp,12
8004974: c3 a0 00 00 ret
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
8004978: 34 0c 00 0b mvi r12,11 <== NOT EXECUTED
800497c: e3 ff ff ec bi 800492c <aio_read+0x4c> <== NOT EXECUTED
08004988 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
8004988: 37 9c ff f4 addi sp,sp,-12
800498c: 5b 8b 00 0c sw (sp+12),r11
8004990: 5b 8c 00 08 sw (sp+8),r12
8004994: 5b 9d 00 04 sw (sp+4),ra
8004998: b8 20 58 00 mv r11,r1
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
800499c: 28 21 00 00 lw r1,(r1+0)
80049a0: 34 02 00 03 mvi r2,3
80049a4: f8 00 1c 73 calli 800bb70 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
80049a8: 20 21 00 03 andi r1,r1,0x3
80049ac: 34 21 ff ff addi r1,r1,-1
80049b0: 34 02 00 01 mvi r2,1
80049b4: 50 41 00 09 bgeu r2,r1,80049d8 <aio_write+0x50>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
80049b8: 34 0c 00 09 mvi r12,9
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
80049bc: 34 01 ff ff mvi r1,-1
80049c0: 59 6c 00 2c sw (r11+44),r12
80049c4: 59 61 00 30 sw (r11+48),r1
80049c8: f8 00 2d 55 calli 800ff1c <__errno>
80049cc: 58 2c 00 00 sw (r1+0),r12
80049d0: 34 01 ff ff mvi r1,-1
80049d4: e0 00 00 0f bi 8004a10 <aio_write+0x88>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
80049d8: 29 61 00 10 lw r1,(r11+16)
80049dc: 5c 20 00 03 bne r1,r0,80049e8 <aio_write+0x60>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
80049e0: 29 62 00 04 lw r2,(r11+4)
80049e4: 4c 41 00 03 bge r2,r1,80049f0 <aio_write+0x68>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
80049e8: 34 0c 00 16 mvi r12,22
80049ec: e3 ff ff f4 bi 80049bc <aio_write+0x34>
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
80049f0: 34 01 00 18 mvi r1,24
80049f4: fb ff f8 26 calli 8002a8c <malloc>
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
80049f8: 34 0c 00 0b mvi r12,11
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
80049fc: 44 20 ff f0 be r1,r0,80049bc <aio_write+0x34> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
8004a00: 34 03 00 02 mvi r3,2
8004a04: 59 63 00 28 sw (r11+40),r3
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
8004a08: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
8004a0c: fb ff ff 31 calli 80046d0 <rtems_aio_enqueue>
}
8004a10: 2b 9d 00 04 lw ra,(sp+4)
8004a14: 2b 8b 00 0c lw r11,(sp+12)
8004a18: 2b 8c 00 08 lw r12,(sp+8)
8004a1c: 37 9c 00 0c addi sp,sp,12
8004a20: c3 a0 00 00 ret
08003114 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
8003114: 37 9c ff fc addi sp,sp,-4
8003118: 5b 9d 00 04 sw (sp+4),ra
if ( !tp )
800311c: 44 40 00 09 be r2,r0,8003140 <clock_gettime+0x2c>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
8003120: 34 03 00 01 mvi r3,1
8003124: 44 23 00 1b be r1,r3,8003190 <clock_gettime+0x7c>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
8003128: 34 03 00 04 mvi r3,4
800312c: 44 23 00 13 be r1,r3,8003178 <clock_gettime+0x64> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
8003130: 34 03 00 02 mvi r3,2
8003134: 44 23 00 11 be r1,r3,8003178 <clock_gettime+0x64>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
8003138: 34 02 00 03 mvi r2,3
800313c: 44 22 00 08 be r1,r2,800315c <clock_gettime+0x48>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
8003140: f8 00 2c 2c calli 800e1f0 <__errno>
8003144: 34 02 00 16 mvi r2,22
8003148: 58 22 00 00 sw (r1+0),r2
800314c: 34 01 ff ff mvi r1,-1
return 0;
}
8003150: 2b 9d 00 04 lw ra,(sp+4)
8003154: 37 9c 00 04 addi sp,sp,4
8003158: c3 a0 00 00 ret
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
800315c: f8 00 2c 25 calli 800e1f0 <__errno>
8003160: 34 02 00 58 mvi r2,88
8003164: 58 22 00 00 sw (r1+0),r2
8003168: 34 01 ff ff mvi r1,-1
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
800316c: 2b 9d 00 04 lw ra,(sp+4)
8003170: 37 9c 00 04 addi sp,sp,4
8003174: c3 a0 00 00 ret
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
_TOD_Get_uptime_as_timespec( tp );
8003178: b8 40 08 00 mv r1,r2
800317c: f8 00 07 5d calli 8004ef0 <_TOD_Get_uptime_as_timespec>
return 0;
8003180: 34 01 00 00 mvi r1,0
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
8003184: 2b 9d 00 04 lw ra,(sp+4)
8003188: 37 9c 00 04 addi sp,sp,4
800318c: c3 a0 00 00 ret
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
_TOD_Get(tp);
8003190: b8 40 08 00 mv r1,r2
8003194: f8 00 07 34 calli 8004e64 <_TOD_Get>
return 0;
8003198: 34 01 00 00 mvi r1,0
800319c: e3 ff ff ed bi 8003150 <clock_gettime+0x3c>
080031a0 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
80031a0: 37 9c ff fc addi sp,sp,-4
80031a4: 5b 9d 00 04 sw (sp+4),ra
if ( !tp )
80031a8: 44 40 00 07 be r2,r0,80031c4 <clock_settime+0x24> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
80031ac: 34 03 00 01 mvi r3,1
80031b0: 44 23 00 0c be r1,r3,80031e0 <clock_settime+0x40>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
80031b4: 34 02 00 02 mvi r2,2
80031b8: 44 22 00 1c be r1,r2,8003228 <clock_settime+0x88>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
80031bc: 34 02 00 03 mvi r2,3
80031c0: 44 22 00 1a be r1,r2,8003228 <clock_settime+0x88>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
80031c4: f8 00 2c 0b calli 800e1f0 <__errno>
80031c8: 34 02 00 16 mvi r2,22
80031cc: 58 22 00 00 sw (r1+0),r2
80031d0: 34 01 ff ff mvi r1,-1
return 0;
}
80031d4: 2b 9d 00 04 lw ra,(sp+4)
80031d8: 37 9c 00 04 addi sp,sp,4
80031dc: c3 a0 00 00 ret
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
80031e0: 78 04 08 01 mvhi r4,0x801
80031e4: 38 84 f2 e4 ori r4,r4,0xf2e4
80031e8: 28 43 00 00 lw r3,(r2+0)
80031ec: 28 81 00 00 lw r1,(r4+0)
80031f0: 54 61 00 02 bgu r3,r1,80031f8 <clock_settime+0x58>
80031f4: e3 ff ff f4 bi 80031c4 <clock_settime+0x24>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80031f8: 78 01 08 02 mvhi r1,0x802
80031fc: 38 21 19 18 ori r1,r1,0x1918
8003200: 28 23 00 00 lw r3,(r1+0)
8003204: 34 63 00 01 addi r3,r3,1
8003208: 58 23 00 00 sw (r1+0),r3
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
800320c: b8 40 08 00 mv r1,r2
8003210: f8 00 07 55 calli 8004f64 <_TOD_Set>
_Thread_Enable_dispatch();
8003214: f8 00 0e 04 calli 8006a24 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
8003218: 34 01 00 00 mvi r1,0
}
800321c: 2b 9d 00 04 lw ra,(sp+4)
8003220: 37 9c 00 04 addi sp,sp,4
8003224: c3 a0 00 00 ret
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
8003228: f8 00 2b f2 calli 800e1f0 <__errno>
800322c: 34 02 00 58 mvi r2,88
8003230: 58 22 00 00 sw (r1+0),r2
8003234: 34 01 ff ff mvi r1,-1
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
8003238: 2b 9d 00 04 lw ra,(sp+4)
800323c: 37 9c 00 04 addi sp,sp,4
8003240: c3 a0 00 00 ret
08026a60 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
8026a60: 37 9c ff d8 addi sp,sp,-40
8026a64: 5b 8b 00 1c sw (sp+28),r11
8026a68: 5b 8c 00 18 sw (sp+24),r12
8026a6c: 5b 8d 00 14 sw (sp+20),r13
8026a70: 5b 8e 00 10 sw (sp+16),r14
8026a74: 5b 8f 00 0c sw (sp+12),r15
8026a78: 5b 90 00 08 sw (sp+8),r16
8026a7c: 5b 9d 00 04 sw (sp+4),ra
8026a80: b8 20 58 00 mv r11,r1
8026a84: b8 40 60 00 mv r12,r2
8026a88: b8 60 70 00 mv r14,r3
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
8026a8c: fb ff fe e3 calli 8026618 <getpid>
8026a90: 5c 2b 00 a5 bne r1,r11,8026d24 <killinfo+0x2c4>
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
8026a94: 45 80 00 04 be r12,r0,8026aa4 <killinfo+0x44>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8026a98: 35 82 ff ff addi r2,r12,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
8026a9c: 34 01 00 1f mvi r1,31
8026aa0: 50 22 00 0e bgeu r1,r2,8026ad8 <killinfo+0x78>
rtems_set_errno_and_return_minus_one( EINVAL );
8026aa4: fb ff b4 cf calli 8013de0 <__errno>
8026aa8: 34 02 00 16 mvi r2,22
8026aac: 58 22 00 00 sw (r1+0),r2
8026ab0: 34 01 ff ff mvi r1,-1
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
8026ab4: 2b 9d 00 04 lw ra,(sp+4)
8026ab8: 2b 8b 00 1c lw r11,(sp+28)
8026abc: 2b 8c 00 18 lw r12,(sp+24)
8026ac0: 2b 8d 00 14 lw r13,(sp+20)
8026ac4: 2b 8e 00 10 lw r14,(sp+16)
8026ac8: 2b 8f 00 0c lw r15,(sp+12)
8026acc: 2b 90 00 08 lw r16,(sp+8)
8026ad0: 37 9c 00 28 addi sp,sp,40
8026ad4: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
8026ad8: b5 8c 80 00 add r16,r12,r12
8026adc: b6 0c 08 00 add r1,r16,r12
8026ae0: 78 0d 08 02 mvhi r13,0x802
8026ae4: b4 21 08 00 add r1,r1,r1
8026ae8: 39 ad af 78 ori r13,r13,0xaf78
8026aec: b4 21 08 00 add r1,r1,r1
8026af0: b5 a1 08 00 add r1,r13,r1
8026af4: 28 23 00 08 lw r3,(r1+8)
8026af8: 34 0f 00 01 mvi r15,1
return 0;
8026afc: 34 01 00 00 mvi r1,0
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
8026b00: 44 6f ff ed be r3,r15,8026ab4 <killinfo+0x54>
/*
* 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 ) )
8026b04: 65 83 00 04 cmpei r3,r12,4
8026b08: 65 81 00 08 cmpei r1,r12,8
8026b0c: b8 61 08 00 or r1,r3,r1
8026b10: 5c 20 00 3f bne r1,r0,8026c0c <killinfo+0x1ac>
8026b14: 34 01 00 0b mvi r1,11
8026b18: 45 81 00 3d be r12,r1,8026c0c <killinfo+0x1ac>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
8026b1c: 34 01 00 01 mvi r1,1
8026b20: fb ff 6d 92 calli 8002168 <__ashlsi3>
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
8026b24: 5b 8c 00 20 sw (sp+32),r12
siginfo->si_code = SI_USER;
8026b28: 5b 8f 00 24 sw (sp+36),r15
8026b2c: b8 20 58 00 mv r11,r1
if ( !value ) {
8026b30: 45 c0 00 3b be r14,r0,8026c1c <killinfo+0x1bc>
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
8026b34: 29 c1 00 00 lw r1,(r14+0)
8026b38: 5b 81 00 28 sw (sp+40),r1
8026b3c: 78 01 08 02 mvhi r1,0x802
8026b40: 38 21 aa 80 ori r1,r1,0xaa80
8026b44: 28 22 00 00 lw r2,(r1+0)
8026b48: 34 42 00 01 addi r2,r2,1
8026b4c: 58 22 00 00 sw (r1+0),r2
/*
* 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;
8026b50: 78 01 08 02 mvhi r1,0x802
8026b54: 38 21 af 2c ori r1,r1,0xaf2c
8026b58: 28 21 00 0c lw r1,(r1+12)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
8026b5c: 28 22 01 20 lw r2,(r1+288)
8026b60: 28 42 00 d0 lw r2,(r2+208)
8026b64: a4 40 10 00 not r2,r2
8026b68: a1 62 10 00 and r2,r11,r2
8026b6c: 5c 40 00 18 bne r2,r0,8026bcc <killinfo+0x16c>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
8026b70: 78 01 08 02 mvhi r1,0x802
8026b74: 38 21 b1 04 ori r1,r1,0xb104
8026b78: 28 23 00 00 lw r3,(r1+0)
/* 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 );
8026b7c: 78 04 08 02 mvhi r4,0x802
8026b80: 38 84 b1 08 ori r4,r4,0xb108
8026b84: 44 64 00 28 be r3,r4,8026c24 <killinfo+0x1c4>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026b88: 28 62 00 30 lw r2,(r3+48)
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;
8026b8c: b8 60 08 00 mv r1,r3
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8026b90: 28 65 01 20 lw r5,(r3+288)
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026b94: a1 62 10 00 and r2,r11,r2
8026b98: 44 40 00 09 be r2,r0,8026bbc <killinfo+0x15c>
8026b9c: e0 00 00 0c bi 8026bcc <killinfo+0x16c>
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 ) {
8026ba0: 28 63 00 00 lw r3,(r3+0)
/* 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 );
8026ba4: 44 64 00 20 be r3,r4,8026c24 <killinfo+0x1c4> <== ALWAYS TAKEN
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026ba8: 28 62 00 30 lw r2,(r3+48) <== NOT EXECUTED
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 ];
8026bac: 28 65 01 20 lw r5,(r3+288) <== NOT EXECUTED
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;
8026bb0: b8 60 08 00 mv r1,r3 <== NOT EXECUTED
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026bb4: a1 62 10 00 and r2,r11,r2 <== NOT EXECUTED
8026bb8: 5c 40 00 05 bne r2,r0,8026bcc <killinfo+0x16c> <== NOT EXECUTED
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
8026bbc: 28 a5 00 d0 lw r5,(r5+208)
8026bc0: a4 a0 28 00 not r5,r5
8026bc4: a1 65 28 00 and r5,r11,r5
8026bc8: 44 a2 ff f6 be r5,r2,8026ba0 <killinfo+0x140>
/*
* 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 ) ) {
8026bcc: b9 80 10 00 mv r2,r12
8026bd0: 37 83 00 20 addi r3,sp,32
8026bd4: f8 00 00 6a calli 8026d7c <_POSIX_signals_Unblock_thread>
8026bd8: 5c 20 00 0a bne r1,r0,8026c00 <killinfo+0x1a0>
/*
* 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 );
8026bdc: b9 60 08 00 mv r1,r11
8026be0: f8 00 00 5c calli 8026d50 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
8026be4: b6 0c 60 00 add r12,r16,r12
8026be8: b5 8c 08 00 add r1,r12,r12
8026bec: b4 21 08 00 add r1,r1,r1
8026bf0: b5 a1 68 00 add r13,r13,r1
8026bf4: 29 a2 00 00 lw r2,(r13+0)
8026bf8: 34 01 00 02 mvi r1,2
8026bfc: 44 41 00 38 be r2,r1,8026cdc <killinfo+0x27c>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
8026c00: fb ff 97 f3 calli 800cbcc <_Thread_Enable_dispatch>
return 0;
8026c04: 34 01 00 00 mvi r1,0
8026c08: e3 ff ff ab bi 8026ab4 <killinfo+0x54>
* 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 ) )
return pthread_kill( pthread_self(), sig );
8026c0c: f8 00 01 08 calli 802702c <pthread_self>
8026c10: b9 80 10 00 mv r2,r12
8026c14: f8 00 00 bd calli 8026f08 <pthread_kill>
8026c18: e3 ff ff a7 bi 8026ab4 <killinfo+0x54>
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
siginfo->si_value.sival_int = 0;
8026c1c: 5b 80 00 28 sw (sp+40),r0
8026c20: e3 ff ff c7 bi 8026b3c <killinfo+0xdc>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
8026c24: 78 01 08 02 mvhi r1,0x802
8026c28: 38 21 a0 f0 ori r1,r1,0xa0f0
8026c2c: 40 26 00 00 lbu r6,(r1+0)
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
8026c30: 78 01 08 02 mvhi r1,0x802
8026c34: 38 21 aa 1c ori r1,r1,0xaa1c
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
8026c38: 78 08 08 02 mvhi r8,0x802
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
8026c3c: 34 2a 00 10 addi r10,r1,16
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
8026c40: 34 c6 00 01 addi r6,r6,1
8026c44: 39 08 aa 24 ori r8,r8,0xaa24
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
8026c48: 34 01 00 00 mvi r1,0
*/
RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal (
States_Control the_states
)
{
return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL);
8026c4c: 78 0f 10 00 mvhi r15,0x1000
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 ] )
8026c50: 29 02 00 00 lw r2,(r8+0)
8026c54: 44 40 00 1e be r2,r0,8026ccc <killinfo+0x26c> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
8026c58: 28 42 00 04 lw r2,(r2+4)
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
8026c5c: 2c 47 00 10 lhu r7,(r2+16)
object_table = the_info->local_table;
8026c60: 28 44 00 1c lw r4,(r2+28)
for ( index = 1 ; index <= maximum ; index++ ) {
8026c64: 44 e0 00 1a be r7,r0,8026ccc <killinfo+0x26c>
8026c68: 34 03 00 01 mvi r3,1
the_thread = (Thread_Control *) object_table[ index ];
8026c6c: 28 82 00 04 lw r2,(r4+4)
if ( !the_thread )
8026c70: 44 40 00 14 be r2,r0,8026cc0 <killinfo+0x260>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
8026c74: 28 45 00 14 lw r5,(r2+20)
8026c78: 54 a6 00 12 bgu r5,r6,8026cc0 <killinfo+0x260>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
8026c7c: 28 49 01 20 lw r9,(r2+288)
8026c80: 29 29 00 d0 lw r9,(r9+208)
8026c84: a5 20 48 00 not r9,r9
8026c88: a1 69 48 00 and r9,r11,r9
8026c8c: 45 20 00 0d be r9,r0,8026cc0 <killinfo+0x260>
*
* 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 ) {
8026c90: 54 c5 00 0a bgu r6,r5,8026cb8 <killinfo+0x258>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
8026c94: 44 20 00 0b be r1,r0,8026cc0 <killinfo+0x260> <== NEVER TAKEN
8026c98: 28 29 00 10 lw r9,(r1+16)
8026c9c: 45 20 00 09 be r9,r0,8026cc0 <killinfo+0x260> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
8026ca0: 28 4e 00 10 lw r14,(r2+16)
8026ca4: 45 c0 00 05 be r14,r0,8026cb8 <killinfo+0x258>
8026ca8: a1 2f 48 00 and r9,r9,r15
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
8026cac: 5d 20 00 05 bne r9,r0,8026cc0 <killinfo+0x260>
8026cb0: a1 cf 70 00 and r14,r14,r15
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
8026cb4: 45 c9 00 03 be r14,r9,8026cc0 <killinfo+0x260>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
8026cb8: b8 a0 30 00 mv r6,r5
8026cbc: b8 40 08 00 mv r1,r2
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
8026cc0: 34 63 00 01 addi r3,r3,1
8026cc4: 34 84 00 04 addi r4,r4,4
8026cc8: 50 e3 ff e9 bgeu r7,r3,8026c6c <killinfo+0x20c>
8026ccc: 35 08 00 04 addi r8,r8,4
* + 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++) {
8026cd0: 5d 0a ff e0 bne r8,r10,8026c50 <killinfo+0x1f0>
}
}
}
}
if ( interested ) {
8026cd4: 5c 20 ff be bne r1,r0,8026bcc <killinfo+0x16c>
8026cd8: e3 ff ff c1 bi 8026bdc <killinfo+0x17c>
_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 );
8026cdc: 78 01 08 02 mvhi r1,0x802
8026ce0: 38 21 b0 f8 ori r1,r1,0xb0f8
8026ce4: fb ff 8e d7 calli 800a840 <_Chain_Get>
8026ce8: b8 20 10 00 mv r2,r1
if ( !psiginfo ) {
8026cec: 44 20 00 13 be r1,r0,8026d38 <killinfo+0x2d8>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
8026cf0: 2b 83 00 20 lw r3,(sp+32)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
8026cf4: b5 8c 60 00 add r12,r12,r12
8026cf8: 78 01 08 02 mvhi r1,0x802
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
8026cfc: 58 43 00 08 sw (r2+8),r3
8026d00: 2b 83 00 24 lw r3,(sp+36)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
8026d04: b5 8c 60 00 add r12,r12,r12
8026d08: 38 21 b1 70 ori r1,r1,0xb170
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
8026d0c: 58 43 00 0c sw (r2+12),r3
8026d10: 2b 83 00 28 lw r3,(sp+40)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
8026d14: b5 81 08 00 add r1,r12,r1
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
8026d18: 58 43 00 10 sw (r2+16),r3
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
8026d1c: fb ff 8e b3 calli 800a7e8 <_Chain_Append>
8026d20: e3 ff ff b8 bi 8026c00 <killinfo+0x1a0>
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
rtems_set_errno_and_return_minus_one( ESRCH );
8026d24: fb ff b4 2f calli 8013de0 <__errno>
8026d28: 34 02 00 03 mvi r2,3
8026d2c: 58 22 00 00 sw (r1+0),r2
8026d30: 34 01 ff ff mvi r1,-1
8026d34: e3 ff ff 60 bi 8026ab4 <killinfo+0x54>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
_Thread_Enable_dispatch();
8026d38: fb ff 97 a5 calli 800cbcc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
8026d3c: fb ff b4 29 calli 8013de0 <__errno>
8026d40: 34 02 00 0b mvi r2,11
8026d44: 58 22 00 00 sw (r1+0),r2
8026d48: 34 01 ff ff mvi r1,-1
8026d4c: e3 ff ff 5a bi 8026ab4 <killinfo+0x54>
08008e20 <mq_open>:
int oflag,
...
/* mode_t mode, */
/* struct mq_attr attr */
)
{
8008e20: 37 9c ff b8 addi sp,sp,-72
8008e24: 5b 8b 00 20 sw (sp+32),r11
8008e28: 5b 8c 00 1c sw (sp+28),r12
8008e2c: 5b 8d 00 18 sw (sp+24),r13
8008e30: 5b 8e 00 14 sw (sp+20),r14
8008e34: 5b 8f 00 10 sw (sp+16),r15
8008e38: 5b 90 00 0c sw (sp+12),r16
8008e3c: 5b 91 00 08 sw (sp+8),r17
8008e40: 5b 9d 00 04 sw (sp+4),ra
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8008e44: 78 09 08 02 mvhi r9,0x802
8008e48: 39 29 9e 18 ori r9,r9,0x9e18
8008e4c: 29 2a 00 00 lw r10,(r9+0)
8008e50: b8 20 80 00 mv r16,r1
8008e54: 5b 82 00 30 sw (sp+48),r2
8008e58: 35 4a 00 01 addi r10,r10,1
8008e5c: 5b 83 00 34 sw (sp+52),r3
8008e60: 5b 84 00 38 sw (sp+56),r4
8008e64: 5b 85 00 3c sw (sp+60),r5
8008e68: 5b 86 00 40 sw (sp+64),r6
8008e6c: 5b 87 00 44 sw (sp+68),r7
8008e70: 5b 88 00 48 sw (sp+72),r8
8008e74: b8 40 68 00 mv r13,r2
8008e78: 59 2a 00 00 sw (r9+0),r10
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8008e7c: 20 4f 02 00 andi r15,r2,0x200
/* struct mq_attr attr */
)
{
va_list arg;
mode_t mode;
struct mq_attr *attr = NULL;
8008e80: 34 11 00 00 mvi r17,0
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8008e84: 5d e0 00 38 bne r15,r0,8008f64 <mq_open+0x144>
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
_Objects_Allocate( &_POSIX_Message_queue_Information_fds );
8008e88: 78 0c 08 02 mvhi r12,0x802
8008e8c: 39 8c a2 58 ori r12,r12,0xa258
8008e90: b9 80 08 00 mv r1,r12
8008e94: f8 00 0c 1e calli 800bf0c <_Objects_Allocate>
8008e98: b8 20 58 00 mv r11,r1
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
8008e9c: 44 20 00 39 be r1,r0,8008f80 <mq_open+0x160> <== NEVER TAKEN
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq_fd->oflag = oflag;
8008ea0: 58 2d 00 14 sw (r1+20),r13
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
8008ea4: 37 82 00 2c addi r2,sp,44
8008ea8: ba 00 08 00 mv r1,r16
8008eac: f8 00 1f cd calli 8010de0 <_POSIX_Message_queue_Name_to_id>
8008eb0: b8 20 70 00 mv r14,r1
* If the name to id translation worked, then the message queue exists
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "message queue does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
8008eb4: 5c 20 00 22 bne r1,r0,8008f3c <mq_open+0x11c>
} else { /* name -> ID translation succeeded */
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
8008eb8: 21 ad 0a 00 andi r13,r13,0xa00
8008ebc: 34 01 0a 00 mvi r1,2560
8008ec0: 45 a1 00 36 be r13,r1,8008f98 <mq_open+0x178>
Objects_Id id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control *)
_Objects_Get( &_POSIX_Message_queue_Information, id, location );
8008ec4: 2b 82 00 2c lw r2,(sp+44)
8008ec8: 78 01 08 02 mvhi r1,0x802
8008ecc: 37 83 00 24 addi r3,sp,36
8008ed0: 38 21 a0 cc ori r1,r1,0xa0cc
8008ed4: f8 00 0d 96 calli 800c52c <_Objects_Get>
/*
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
the_mq->open_count += 1;
8008ed8: 28 24 00 18 lw r4,(r1+24)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
8008edc: 2d 62 00 0a lhu r2,(r11+10)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8008ee0: 29 83 00 1c lw r3,(r12+28)
8008ee4: 34 84 00 01 addi r4,r4,1
8008ee8: b4 42 10 00 add r2,r2,r2
8008eec: 58 24 00 18 sw (r1+24),r4
8008ef0: b4 42 10 00 add r2,r2,r2
/*
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
8008ef4: 5b 81 00 28 sw (sp+40),r1
the_mq->open_count += 1;
the_mq_fd->Queue = the_mq;
8008ef8: 59 61 00 10 sw (r11+16),r1
8008efc: b4 62 10 00 add r2,r3,r2
8008f00: 58 4b 00 00 sw (r2+0),r11
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
8008f04: 59 60 00 0c sw (r11+12),r0
_Objects_Open_string(
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
8008f08: f8 00 11 89 calli 800d52c <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
8008f0c: f8 00 11 88 calli 800d52c <_Thread_Enable_dispatch>
return (mqd_t)the_mq_fd->Object.id;
8008f10: 29 61 00 08 lw r1,(r11+8)
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
8008f14: 2b 9d 00 04 lw ra,(sp+4)
8008f18: 2b 8b 00 20 lw r11,(sp+32)
8008f1c: 2b 8c 00 1c lw r12,(sp+28)
8008f20: 2b 8d 00 18 lw r13,(sp+24)
8008f24: 2b 8e 00 14 lw r14,(sp+20)
8008f28: 2b 8f 00 10 lw r15,(sp+16)
8008f2c: 2b 90 00 0c lw r16,(sp+12)
8008f30: 2b 91 00 08 lw r17,(sp+8)
8008f34: 37 9c 00 48 addi sp,sp,72
8008f38: c3 a0 00 00 ret
if ( status ) {
/*
* 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) ) ) {
8008f3c: 34 01 00 02 mvi r1,2
8008f40: 45 c1 00 1f be r14,r1,8008fbc <mq_open+0x19c>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
POSIX_Message_queue_Control_fd *the_mq_fd
)
{
_Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
8008f44: b9 80 08 00 mv r1,r12
8008f48: b9 60 10 00 mv r2,r11
8008f4c: f8 00 0c ff calli 800c348 <_Objects_Free>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
8008f50: f8 00 11 77 calli 800d52c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
8008f54: f8 00 30 bc calli 8015244 <__errno>
8008f58: 58 2e 00 00 sw (r1+0),r14
8008f5c: 34 01 ff ff mvi r1,-1
8008f60: e3 ff ff ed bi 8008f14 <mq_open+0xf4>
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
_Objects_Allocate( &_POSIX_Message_queue_Information_fds );
8008f64: 78 0c 08 02 mvhi r12,0x802
8008f68: 39 8c a2 58 ori r12,r12,0xa258
8008f6c: b9 80 08 00 mv r1,r12
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
8008f70: 2b 91 00 38 lw r17,(sp+56)
8008f74: f8 00 0b e6 calli 800bf0c <_Objects_Allocate>
8008f78: b8 20 58 00 mv r11,r1
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
8008f7c: 5c 20 ff c9 bne r1,r0,8008ea0 <mq_open+0x80>
_Thread_Enable_dispatch();
8008f80: f8 00 11 6b calli 800d52c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
8008f84: f8 00 30 b0 calli 8015244 <__errno>
8008f88: 34 02 00 17 mvi r2,23
8008f8c: 58 22 00 00 sw (r1+0),r2
8008f90: 34 01 ff ff mvi r1,-1
8008f94: e3 ff ff e0 bi 8008f14 <mq_open+0xf4>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
POSIX_Message_queue_Control_fd *the_mq_fd
)
{
_Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
8008f98: b9 60 10 00 mv r2,r11
8008f9c: b9 80 08 00 mv r1,r12
8008fa0: f8 00 0c ea calli 800c348 <_Objects_Free>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
8008fa4: f8 00 11 62 calli 800d52c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
8008fa8: f8 00 30 a7 calli 8015244 <__errno>
8008fac: 34 02 00 11 mvi r2,17
8008fb0: 58 22 00 00 sw (r1+0),r2
8008fb4: 34 01 ff ff mvi r1,-1
8008fb8: e3 ff ff d7 bi 8008f14 <mq_open+0xf4>
if ( status ) {
/*
* 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) ) ) {
8008fbc: 45 e0 ff e2 be r15,r0,8008f44 <mq_open+0x124>
/*
* At this point, the message queue does not exist and everything has been
* checked. We should go ahead and create a message queue.
*/
status = _POSIX_Message_queue_Create_support(
8008fc0: 34 02 00 01 mvi r2,1
8008fc4: ba 00 08 00 mv r1,r16
8008fc8: ba 20 18 00 mv r3,r17
8008fcc: 37 84 00 28 addi r4,sp,40
8008fd0: f8 00 1f 16 calli 8010c28 <_POSIX_Message_queue_Create_support>
);
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
8008fd4: 34 02 ff ff mvi r2,-1
8008fd8: 44 22 00 0d be r1,r2,800900c <mq_open+0x1ec>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
8008fdc: 2d 61 00 0a lhu r1,(r11+10)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8008fe0: 29 82 00 1c lw r2,(r12+28)
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
return (mqd_t) -1;
}
the_mq_fd->Queue = the_mq;
8008fe4: 2b 83 00 28 lw r3,(sp+40)
8008fe8: b4 21 08 00 add r1,r1,r1
8008fec: b4 21 08 00 add r1,r1,r1
8008ff0: b4 41 08 00 add r1,r2,r1
8008ff4: 59 63 00 10 sw (r11+16),r3
8008ff8: 58 2b 00 00 sw (r1+0),r11
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
8008ffc: 59 60 00 0c sw (r11+12),r0
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
8009000: f8 00 11 4b calli 800d52c <_Thread_Enable_dispatch>
return (mqd_t) the_mq_fd->Object.id;
8009004: 29 61 00 08 lw r1,(r11+8)
8009008: e3 ff ff c3 bi 8008f14 <mq_open+0xf4>
800900c: b9 80 08 00 mv r1,r12
8009010: b9 60 10 00 mv r2,r11
8009014: f8 00 0c cd calli 800c348 <_Objects_Free>
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
8009018: f8 00 11 45 calli 800d52c <_Thread_Enable_dispatch>
return (mqd_t) -1;
800901c: 34 01 ff ff mvi r1,-1
8009020: e3 ff ff bd bi 8008f14 <mq_open+0xf4>
08008590 <pthread_attr_setschedpolicy>:
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
8008590: 34 03 00 16 mvi r3,22
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
8008594: 44 20 00 09 be r1,r0,80085b8 <pthread_attr_setschedpolicy+0x28>
8008598: 28 24 00 00 lw r4,(r1+0)
800859c: 44 80 00 07 be r4,r0,80085b8 <pthread_attr_setschedpolicy+0x28>
return EINVAL;
switch ( policy ) {
80085a0: 48 02 00 05 bg r0,r2,80085b4 <pthread_attr_setschedpolicy+0x24>
80085a4: 34 03 00 02 mvi r3,2
80085a8: 4c 62 00 06 bge r3,r2,80085c0 <pthread_attr_setschedpolicy+0x30>
80085ac: 34 03 00 04 mvi r3,4
80085b0: 44 43 00 04 be r2,r3,80085c0 <pthread_attr_setschedpolicy+0x30><== ALWAYS TAKEN
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
80085b4: 34 03 00 86 mvi r3,134
}
}
80085b8: b8 60 08 00 mv r1,r3
80085bc: c3 a0 00 00 ret
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
80085c0: 34 03 00 00 mvi r3,0
switch ( policy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
80085c4: 58 22 00 14 sw (r1+20),r2
return 0;
default:
return ENOTSUP;
}
}
80085c8: b8 60 08 00 mv r1,r3
80085cc: c3 a0 00 00 ret
08003780 <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
8003780: 37 9c ff d8 addi sp,sp,-40
8003784: 5b 8b 00 14 sw (sp+20),r11
8003788: 5b 8c 00 10 sw (sp+16),r12
800378c: 5b 8d 00 0c sw (sp+12),r13
8003790: 5b 8e 00 08 sw (sp+8),r14
8003794: 5b 9d 00 04 sw (sp+4),ra
/*
* Error check parameters
*/
if ( !barrier )
return EINVAL;
8003798: 34 04 00 16 mvi r4,22
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
800379c: b8 20 58 00 mv r11,r1
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
80037a0: 44 20 00 08 be r1,r0,80037c0 <pthread_barrier_init+0x40>
return EINVAL;
if ( count == 0 )
80037a4: 44 60 00 07 be r3,r0,80037c0 <pthread_barrier_init+0x40>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
80037a8: 44 40 00 34 be r2,r0,8003878 <pthread_barrier_init+0xf8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
80037ac: 28 41 00 00 lw r1,(r2+0)
return EINVAL;
80037b0: 34 04 00 16 mvi r4,22
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
80037b4: 44 20 00 03 be r1,r0,80037c0 <pthread_barrier_init+0x40>
return EINVAL;
switch ( the_attr->process_shared ) {
80037b8: 28 4e 00 04 lw r14,(r2+4)
80037bc: 45 c0 00 09 be r14,r0,80037e0 <pthread_barrier_init+0x60> <== ALWAYS TAKEN
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
_Thread_Enable_dispatch();
return 0;
}
80037c0: b8 80 08 00 mv r1,r4
80037c4: 2b 9d 00 04 lw ra,(sp+4)
80037c8: 2b 8b 00 14 lw r11,(sp+20)
80037cc: 2b 8c 00 10 lw r12,(sp+16)
80037d0: 2b 8d 00 0c lw r13,(sp+12)
80037d4: 2b 8e 00 08 lw r14,(sp+8)
80037d8: 37 9c 00 28 addi sp,sp,40
80037dc: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80037e0: 78 01 08 01 mvhi r1,0x801
80037e4: 38 21 68 d8 ori r1,r1,0x68d8
80037e8: 28 22 00 00 lw r2,(r1+0)
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
80037ec: 5b 80 00 24 sw (sp+36),r0
the_attributes.maximum_count = count;
80037f0: 5b 83 00 28 sw (sp+40),r3
80037f4: 34 42 00 01 addi r2,r2,1
80037f8: 58 22 00 00 sw (r1+0),r2
* 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 );
80037fc: 78 0d 08 01 mvhi r13,0x801
8003800: 39 ad 6c 0c ori r13,r13,0x6c0c
8003804: b9 a0 08 00 mv r1,r13
8003808: f8 00 08 41 calli 800590c <_Objects_Allocate>
800380c: b8 20 60 00 mv r12,r1
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
8003810: 44 2e 00 17 be r1,r14,800386c <pthread_barrier_init+0xec>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
8003814: 37 82 00 24 addi r2,sp,36
8003818: 34 21 00 10 addi r1,r1,16
800381c: f8 00 05 2a calli 8004cc4 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8003820: 29 82 00 08 lw r2,(r12+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003824: 29 a3 00 1c lw r3,(r13+28)
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
8003828: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
800382c: b4 21 08 00 add r1,r1,r1
8003830: b4 21 08 00 add r1,r1,r1
8003834: b4 61 08 00 add r1,r3,r1
8003838: 58 2c 00 00 sw (r1+0),r12
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
800383c: 59 80 00 0c sw (r12+12),r0
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
8003840: 59 62 00 00 sw (r11+0),r2
_Thread_Enable_dispatch();
8003844: f8 00 0d 1e calli 8006cbc <_Thread_Enable_dispatch>
return 0;
8003848: 34 04 00 00 mvi r4,0
}
800384c: b8 80 08 00 mv r1,r4
8003850: 2b 9d 00 04 lw ra,(sp+4)
8003854: 2b 8b 00 14 lw r11,(sp+20)
8003858: 2b 8c 00 10 lw r12,(sp+16)
800385c: 2b 8d 00 0c lw r13,(sp+12)
8003860: 2b 8e 00 08 lw r14,(sp+8)
8003864: 37 9c 00 28 addi sp,sp,40
8003868: c3 a0 00 00 ret
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
800386c: f8 00 0d 14 calli 8006cbc <_Thread_Enable_dispatch>
return EAGAIN;
8003870: 34 04 00 0b mvi r4,11
8003874: e3 ff ff d3 bi 80037c0 <pthread_barrier_init+0x40>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
8003878: 37 8c 00 1c addi r12,sp,28
800387c: b9 80 08 00 mv r1,r12
8003880: 5b 83 00 18 sw (sp+24),r3
8003884: fb ff ff 7c calli 8003674 <pthread_barrierattr_init>
the_attr = &my_attr;
8003888: b9 80 10 00 mv r2,r12
800388c: 2b 83 00 18 lw r3,(sp+24)
8003890: e3 ff ff c7 bi 80037ac <pthread_barrier_init+0x2c>
08002f8c <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
8002f8c: 37 9c ff f4 addi sp,sp,-12
8002f90: 5b 8b 00 0c sw (sp+12),r11
8002f94: 5b 8c 00 08 sw (sp+8),r12
8002f98: 5b 9d 00 04 sw (sp+4),ra
8002f9c: b8 20 58 00 mv r11,r1
8002fa0: b8 40 60 00 mv r12,r2
/*
* 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 )
8002fa4: 44 20 00 14 be r1,r0,8002ff4 <pthread_cleanup_push+0x68>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8002fa8: 78 03 08 01 mvhi r3,0x801
8002fac: 38 63 68 c0 ori r3,r3,0x68c0
8002fb0: 28 61 00 00 lw r1,(r3+0)
8002fb4: 34 21 00 01 addi r1,r1,1
8002fb8: 58 61 00 00 sw (r3+0),r1
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
8002fbc: 34 01 00 10 mvi r1,16
8002fc0: f8 00 12 a6 calli 8007a58 <_Workspace_Allocate>
8002fc4: b8 20 18 00 mv r3,r1
if ( handler ) {
8002fc8: 44 20 00 0a be r1,r0,8002ff0 <pthread_cleanup_push+0x64> <== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
8002fcc: 78 04 08 01 mvhi r4,0x801
8002fd0: 38 84 6d 6c ori r4,r4,0x6d6c
8002fd4: 28 81 00 0c lw r1,(r4+12)
handler_stack = &thread_support->Cancellation_Handlers;
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
8002fd8: b8 60 10 00 mv r2,r3
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;
8002fdc: 28 21 01 20 lw r1,(r1+288)
handler->routine = routine;
8002fe0: 58 6b 00 08 sw (r3+8),r11
handler->arg = arg;
8002fe4: 58 6c 00 0c sw (r3+12),r12
_Chain_Append( handler_stack, &handler->Node );
8002fe8: 34 21 00 e4 addi r1,r1,228
8002fec: f8 00 05 26 calli 8004484 <_Chain_Append>
}
_Thread_Enable_dispatch();
8002ff0: f8 00 0d 00 calli 80063f0 <_Thread_Enable_dispatch>
}
8002ff4: 2b 9d 00 04 lw ra,(sp+4)
8002ff8: 2b 8b 00 0c lw r11,(sp+12)
8002ffc: 2b 8c 00 08 lw r12,(sp+8)
8003000: 37 9c 00 0c addi sp,sp,12
8003004: c3 a0 00 00 ret
08004098 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
8004098: 37 9c ff ec addi sp,sp,-20
800409c: 5b 8b 00 10 sw (sp+16),r11
80040a0: 5b 8c 00 0c sw (sp+12),r12
80040a4: 5b 8d 00 08 sw (sp+8),r13
80040a8: 5b 9d 00 04 sw (sp+4),ra
80040ac: b8 20 68 00 mv r13,r1
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
80040b0: 44 40 00 35 be r2,r0,8004184 <pthread_cond_init+0xec>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
80040b4: 28 44 00 04 lw r4,(r2+4)
80040b8: 34 03 00 01 mvi r3,1
return EINVAL;
80040bc: 34 01 00 16 mvi r1,22
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
80040c0: 44 83 00 03 be r4,r3,80040cc <pthread_cond_init+0x34> <== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
80040c4: 28 43 00 00 lw r3,(r2+0)
80040c8: 5c 60 00 07 bne r3,r0,80040e4 <pthread_cond_init+0x4c>
*cond = the_cond->Object.id;
_Thread_Enable_dispatch();
return 0;
}
80040cc: 2b 9d 00 04 lw ra,(sp+4)
80040d0: 2b 8b 00 10 lw r11,(sp+16)
80040d4: 2b 8c 00 0c lw r12,(sp+12)
80040d8: 2b 8d 00 08 lw r13,(sp+8)
80040dc: 37 9c 00 14 addi sp,sp,20
80040e0: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80040e4: 78 03 08 01 mvhi r3,0x801
80040e8: 38 63 78 d8 ori r3,r3,0x78d8
80040ec: 28 61 00 00 lw r1,(r3+0)
80040f0: 34 21 00 01 addi r1,r1,1
80040f4: 58 61 00 00 sw (r3+0),r1
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
80040f8: 78 0c 08 01 mvhi r12,0x801
80040fc: 39 8c 7c a4 ori r12,r12,0x7ca4
8004100: b9 80 08 00 mv r1,r12
8004104: 5b 82 00 14 sw (sp+20),r2
8004108: f8 00 09 e5 calli 800689c <_Objects_Allocate>
800410c: b8 20 58 00 mv r11,r1
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
8004110: 2b 82 00 14 lw r2,(sp+20)
8004114: 44 20 00 1f be r1,r0,8004190 <pthread_cond_init+0xf8>
the_cond->process_shared = the_attr->process_shared;
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8004118: 78 01 08 01 mvhi r1,0x801
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
800411c: 28 45 00 04 lw r5,(r2+4)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8004120: 38 21 62 68 ori r1,r1,0x6268
8004124: 28 23 00 00 lw r3,(r1+0)
8004128: 34 04 00 74 mvi r4,116
800412c: 35 61 00 18 addi r1,r11,24
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
8004130: 59 65 00 10 sw (r11+16),r5
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8004134: 34 02 00 00 mvi r2,0
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
8004138: 59 60 00 14 sw (r11+20),r0
_Thread_queue_Initialize(
800413c: f8 00 11 5d calli 80086b0 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8004140: 29 61 00 08 lw r1,(r11+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8004144: 29 83 00 1c lw r3,(r12+28)
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
8004148: 20 22 ff ff andi r2,r1,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
800414c: b4 42 10 00 add r2,r2,r2
8004150: b4 42 10 00 add r2,r2,r2
8004154: b4 62 10 00 add r2,r3,r2
8004158: 58 4b 00 00 sw (r2+0),r11
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
800415c: 59 60 00 0c sw (r11+12),r0
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
8004160: 59 a1 00 00 sw (r13+0),r1
_Thread_Enable_dispatch();
8004164: f8 00 0f 28 calli 8007e04 <_Thread_Enable_dispatch>
return 0;
8004168: 34 01 00 00 mvi r1,0
}
800416c: 2b 9d 00 04 lw ra,(sp+4)
8004170: 2b 8b 00 10 lw r11,(sp+16)
8004174: 2b 8c 00 0c lw r12,(sp+12)
8004178: 2b 8d 00 08 lw r13,(sp+8)
800417c: 37 9c 00 14 addi sp,sp,20
8004180: c3 a0 00 00 ret
{
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
else the_attr = &_POSIX_Condition_variables_Default_attributes;
8004184: 78 02 08 01 mvhi r2,0x801
8004188: 38 42 62 60 ori r2,r2,0x6260
800418c: e3 ff ff ca bi 80040b4 <pthread_cond_init+0x1c>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
_Thread_Enable_dispatch();
8004190: f8 00 0f 1d calli 8007e04 <_Thread_Enable_dispatch>
return ENOMEM;
8004194: 34 01 00 0c mvi r1,12
8004198: e3 ff ff cd bi 80040cc <pthread_cond_init+0x34>
08003ef4 <pthread_condattr_destroy>:
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
8003ef4: 34 02 00 16 mvi r2,22
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
8003ef8: 44 20 00 05 be r1,r0,8003f0c <pthread_condattr_destroy+0x18>
8003efc: 28 23 00 00 lw r3,(r1+0)
8003f00: 44 60 00 03 be r3,r0,8003f0c <pthread_condattr_destroy+0x18><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
8003f04: 58 20 00 00 sw (r1+0),r0
return 0;
8003f08: 34 02 00 00 mvi r2,0
}
8003f0c: b8 40 08 00 mv r1,r2
8003f10: c3 a0 00 00 ret
08003414 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
8003414: 37 9c ff a0 addi sp,sp,-96
8003418: 5b 8b 00 3c sw (sp+60),r11
800341c: 5b 8c 00 38 sw (sp+56),r12
8003420: 5b 8d 00 34 sw (sp+52),r13
8003424: 5b 8e 00 30 sw (sp+48),r14
8003428: 5b 8f 00 2c sw (sp+44),r15
800342c: 5b 90 00 28 sw (sp+40),r16
8003430: 5b 91 00 24 sw (sp+36),r17
8003434: 5b 92 00 20 sw (sp+32),r18
8003438: 5b 93 00 1c sw (sp+28),r19
800343c: 5b 94 00 18 sw (sp+24),r20
8003440: 5b 95 00 14 sw (sp+20),r21
8003444: 5b 9d 00 10 sw (sp+16),ra
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
8003448: 34 0c 00 0e mvi r12,14
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
800344c: b8 60 68 00 mv r13,r3
8003450: b8 20 78 00 mv r15,r1
8003454: b8 80 70 00 mv r14,r4
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
8003458: 44 60 00 13 be r3,r0,80034a4 <pthread_create+0x90> <== NEVER TAKEN
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
800345c: b8 40 58 00 mv r11,r2
8003460: 44 40 00 66 be r2,r0,80035f8 <pthread_create+0x1e4>
if ( !the_attr->is_initialized )
8003464: 29 61 00 00 lw r1,(r11+0)
return EINVAL;
8003468: 34 0c 00 16 mvi r12,22
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
if ( !the_attr->is_initialized )
800346c: 44 20 00 0e be r1,r0,80034a4 <pthread_create+0x90>
* stack space if it is allowed to allocate it itself.
*
* NOTE: If the user provides the stack we will let it drop below
* twice the minimum.
*/
if ( the_attr->stackaddr && !_Stack_Is_enough(the_attr->stacksize) )
8003470: 29 61 00 04 lw r1,(r11+4)
8003474: 44 20 00 06 be r1,r0,800348c <pthread_create+0x78>
8003478: 78 02 08 02 mvhi r2,0x802
800347c: 38 42 01 10 ori r2,r2,0x110
8003480: 29 63 00 08 lw r3,(r11+8)
8003484: 28 41 00 00 lw r1,(r2+0)
8003488: 54 23 00 07 bgu r1,r3,80034a4 <pthread_create+0x90>
* If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
* inherits scheduling attributes from the creating thread. If it is
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
800348c: 29 61 00 10 lw r1,(r11+16)
8003490: 34 02 00 01 mvi r2,1
8003494: 44 22 00 5c be r1,r2,8003604 <pthread_create+0x1f0>
8003498: 34 02 00 02 mvi r2,2
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
break;
default:
return EINVAL;
800349c: 34 0c 00 16 mvi r12,22
* If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
* inherits scheduling attributes from the creating thread. If it is
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
80034a0: 44 22 00 10 be r1,r2,80034e0 <pthread_create+0xcc>
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
80034a4: b9 80 08 00 mv r1,r12
80034a8: 2b 9d 00 10 lw ra,(sp+16)
80034ac: 2b 8b 00 3c lw r11,(sp+60)
80034b0: 2b 8c 00 38 lw r12,(sp+56)
80034b4: 2b 8d 00 34 lw r13,(sp+52)
80034b8: 2b 8e 00 30 lw r14,(sp+48)
80034bc: 2b 8f 00 2c lw r15,(sp+44)
80034c0: 2b 90 00 28 lw r16,(sp+40)
80034c4: 2b 91 00 24 lw r17,(sp+36)
80034c8: 2b 92 00 20 lw r18,(sp+32)
80034cc: 2b 93 00 1c lw r19,(sp+28)
80034d0: 2b 94 00 18 lw r20,(sp+24)
80034d4: 2b 95 00 14 lw r21,(sp+20)
80034d8: 37 9c 00 60 addi sp,sp,96
80034dc: c3 a0 00 00 ret
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
80034e0: 29 67 00 18 lw r7,(r11+24)
80034e4: 29 66 00 1c lw r6,(r11+28)
80034e8: 29 65 00 20 lw r5,(r11+32)
80034ec: 29 64 00 24 lw r4,(r11+36)
80034f0: 29 63 00 28 lw r3,(r11+40)
80034f4: 29 62 00 2c lw r2,(r11+44)
80034f8: 29 61 00 30 lw r1,(r11+48)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
80034fc: 29 71 00 14 lw r17,(r11+20)
schedparam = the_attr->schedparam;
8003500: 5b 87 00 40 sw (sp+64),r7
8003504: 5b 86 00 44 sw (sp+68),r6
8003508: 5b 85 00 48 sw (sp+72),r5
800350c: 5b 84 00 4c sw (sp+76),r4
8003510: 5b 83 00 50 sw (sp+80),r3
8003514: 5b 82 00 54 sw (sp+84),r2
8003518: 5b 81 00 58 sw (sp+88),r1
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
800351c: 29 70 00 0c lw r16,(r11+12)
return ENOTSUP;
8003520: 34 0c 00 86 mvi r12,134
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
8003524: 5e 00 ff e0 bne r16,r0,80034a4 <pthread_create+0x90>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
8003528: 2b 81 00 40 lw r1,(sp+64)
return EINVAL;
800352c: 34 0c 00 16 mvi r12,22
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
8003530: f8 00 1c ad calli 800a7e4 <_POSIX_Priority_Is_valid>
8003534: 44 30 ff dc be r1,r16,80034a4 <pthread_create+0x90> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
8003538: 78 05 08 02 mvhi r5,0x802
800353c: 38 a5 01 14 ori r5,r5,0x114
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
8003540: ba 20 08 00 mv r1,r17
8003544: 37 82 00 40 addi r2,sp,64
8003548: 37 83 00 60 addi r3,sp,96
800354c: 37 84 00 5c addi r4,sp,92
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
8003550: 2b 94 00 40 lw r20,(sp+64)
8003554: 40 b5 00 00 lbu r21,(r5+0)
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
8003558: f8 00 1c ab calli 800a804 <_POSIX_Thread_Translate_sched_param>
800355c: b8 20 60 00 mv r12,r1
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
8003560: 5c 20 ff d1 bne r1,r0,80034a4 <pthread_create+0x90>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
8003564: 78 12 08 02 mvhi r18,0x802
8003568: 3a 52 09 68 ori r18,r18,0x968
800356c: 2a 41 00 00 lw r1,(r18+0)
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
8003570: 78 10 08 02 mvhi r16,0x802
8003574: 3a 10 0a 7c ori r16,r16,0xa7c
8003578: f8 00 05 38 calli 8004a58 <_API_Mutex_Lock>
800357c: ba 00 08 00 mv r1,r16
8003580: f8 00 08 68 calli 8005720 <_Objects_Allocate>
8003584: b8 20 98 00 mv r19,r1
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
8003588: 44 2c 00 18 be r1,r12,80035e8 <pthread_create+0x1d4>
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
800358c: 78 01 08 02 mvhi r1,0x802
8003590: 38 21 01 10 ori r1,r1,0x110
8003594: 28 24 00 00 lw r4,(r1+0)
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
8003598: 29 61 00 08 lw r1,(r11+8)
800359c: 29 63 00 04 lw r3,(r11+4)
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
80035a0: b4 84 20 00 add r4,r4,r4
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
80035a4: 50 81 00 02 bgeu r4,r1,80035ac <pthread_create+0x198>
80035a8: b8 20 20 00 mv r4,r1
80035ac: 2b 89 00 5c lw r9,(sp+92)
80035b0: 2b 88 00 60 lw r8,(sp+96)
80035b4: ba 00 08 00 mv r1,r16
80035b8: ba 60 10 00 mv r2,r19
80035bc: 34 05 00 00 mvi r5,0
80035c0: ca b4 30 00 sub r6,r21,r20
80035c4: 34 07 00 01 mvi r7,1
80035c8: 5b 89 00 04 sw (sp+4),r9
80035cc: 5b 80 00 08 sw (sp+8),r0
80035d0: 5b 80 00 0c sw (sp+12),r0
80035d4: f8 00 0d a2 calli 8006c5c <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
80035d8: 5c 20 00 1f bne r1,r0,8003654 <pthread_create+0x240> <== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
80035dc: ba 00 08 00 mv r1,r16 <== NOT EXECUTED
80035e0: ba 60 10 00 mv r2,r19 <== NOT EXECUTED
80035e4: f8 00 09 52 calli 8005b2c <_Objects_Free> <== NOT EXECUTED
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
80035e8: 2a 41 00 00 lw r1,(r18+0)
return EAGAIN;
80035ec: 34 0c 00 0b mvi r12,11
name /* posix threads don't have a name */
);
if ( !status ) {
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
80035f0: f8 00 05 36 calli 8004ac8 <_API_Mutex_Unlock>
return EAGAIN;
80035f4: e3 ff ff ac bi 80034a4 <pthread_create+0x90>
int rc;
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
80035f8: 78 0b 08 01 mvhi r11,0x801
80035fc: 39 6b e1 84 ori r11,r11,0xe184
8003600: e3 ff ff 99 bi 8003464 <pthread_create+0x50>
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
8003604: 78 01 08 02 mvhi r1,0x802
8003608: 38 21 0d 74 ori r1,r1,0xd74
800360c: 28 21 00 0c lw r1,(r1+12)
8003610: 28 22 01 20 lw r2,(r1+288)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
8003614: 28 48 00 88 lw r8,(r2+136)
8003618: 28 47 00 8c lw r7,(r2+140)
800361c: 28 46 00 90 lw r6,(r2+144)
8003620: 28 45 00 94 lw r5,(r2+148)
8003624: 28 44 00 98 lw r4,(r2+152)
8003628: 28 43 00 9c lw r3,(r2+156)
800362c: 28 41 00 a0 lw r1,(r2+160)
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
schedpolicy = api->schedpolicy;
8003630: 28 51 00 84 lw r17,(r2+132)
schedparam = api->schedparam;
8003634: 5b 88 00 40 sw (sp+64),r8
8003638: 5b 87 00 44 sw (sp+68),r7
800363c: 5b 86 00 48 sw (sp+72),r6
8003640: 5b 85 00 4c sw (sp+76),r5
8003644: 5b 84 00 50 sw (sp+80),r4
8003648: 5b 83 00 54 sw (sp+84),r3
800364c: 5b 81 00 58 sw (sp+88),r1
break;
8003650: e3 ff ff b3 bi 800351c <pthread_create+0x108>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8003654: 2a 70 01 20 lw r16,(r19+288)
api->Attributes = *the_attr;
8003658: 29 63 00 00 lw r3,(r11+0)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
800365c: ba 60 08 00 mv r1,r19
8003660: 34 02 00 01 mvi r2,1
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
8003664: 5a 03 00 00 sw (r16+0),r3
8003668: 29 65 00 04 lw r5,(r11+4)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
800366c: b9 a0 18 00 mv r3,r13
8003670: b9 c0 20 00 mv r4,r14
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
8003674: 5a 05 00 04 sw (r16+4),r5
8003678: 29 66 00 08 lw r6,(r11+8)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
800367c: 34 05 00 00 mvi r5,0
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
8003680: 5a 06 00 08 sw (r16+8),r6
8003684: 29 66 00 0c lw r6,(r11+12)
8003688: 5a 06 00 0c sw (r16+12),r6
800368c: 29 66 00 10 lw r6,(r11+16)
8003690: 5a 06 00 10 sw (r16+16),r6
8003694: 29 66 00 14 lw r6,(r11+20)
8003698: 5a 06 00 14 sw (r16+20),r6
800369c: 29 66 00 18 lw r6,(r11+24)
80036a0: 5a 06 00 18 sw (r16+24),r6
80036a4: 29 66 00 1c lw r6,(r11+28)
80036a8: 5a 06 00 1c sw (r16+28),r6
80036ac: 29 66 00 20 lw r6,(r11+32)
80036b0: 5a 06 00 20 sw (r16+32),r6
80036b4: 29 66 00 24 lw r6,(r11+36)
80036b8: 5a 06 00 24 sw (r16+36),r6
80036bc: 29 66 00 28 lw r6,(r11+40)
80036c0: 5a 06 00 28 sw (r16+40),r6
80036c4: 29 66 00 2c lw r6,(r11+44)
80036c8: 5a 06 00 2c sw (r16+44),r6
80036cc: 29 66 00 30 lw r6,(r11+48)
80036d0: 5a 06 00 30 sw (r16+48),r6
80036d4: 29 66 00 34 lw r6,(r11+52)
80036d8: 5a 06 00 34 sw (r16+52),r6
80036dc: 29 66 00 38 lw r6,(r11+56)
80036e0: 5a 06 00 38 sw (r16+56),r6
80036e4: 29 66 00 3c lw r6,(r11+60)
80036e8: 5a 06 00 3c sw (r16+60),r6
api->detachstate = the_attr->detachstate;
80036ec: 29 66 00 3c lw r6,(r11+60)
80036f0: 5a 06 00 40 sw (r16+64),r6
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
80036f4: 2b 86 00 40 lw r6,(sp+64)
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
80036f8: 5a 11 00 84 sw (r16+132),r17
api->schedparam = schedparam;
80036fc: 5a 06 00 88 sw (r16+136),r6
8003700: 2b 86 00 44 lw r6,(sp+68)
8003704: 5a 06 00 8c sw (r16+140),r6
8003708: 2b 86 00 48 lw r6,(sp+72)
800370c: 5a 06 00 90 sw (r16+144),r6
8003710: 2b 86 00 4c lw r6,(sp+76)
8003714: 5a 06 00 94 sw (r16+148),r6
8003718: 2b 86 00 50 lw r6,(sp+80)
800371c: 5a 06 00 98 sw (r16+152),r6
8003720: 2b 86 00 54 lw r6,(sp+84)
8003724: 5a 06 00 9c sw (r16+156),r6
8003728: 2b 86 00 58 lw r6,(sp+88)
800372c: 5a 06 00 a0 sw (r16+160),r6
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003730: f8 00 10 0a calli 8007758 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
8003734: 34 01 00 04 mvi r1,4
8003738: 46 21 00 06 be r17,r1,8003750 <pthread_create+0x33c>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
800373c: 2a 62 00 08 lw r2,(r19+8)
_RTEMS_Unlock_allocator();
8003740: 2a 41 00 00 lw r1,(r18+0)
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
8003744: 59 e2 00 00 sw (r15+0),r2
_RTEMS_Unlock_allocator();
8003748: f8 00 04 e0 calli 8004ac8 <_API_Mutex_Unlock>
return 0;
800374c: e3 ff ff 56 bi 80034a4 <pthread_create+0x90>
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
8003750: 36 01 00 90 addi r1,r16,144
8003754: f8 00 10 93 calli 80079a0 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8003758: 5a 01 00 b4 sw (r16+180),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800375c: 78 01 08 02 mvhi r1,0x802
8003760: 36 02 00 a8 addi r2,r16,168
8003764: 38 21 09 88 ori r1,r1,0x988
8003768: f8 00 11 d9 calli 8007ecc <_Watchdog_Insert>
800376c: e3 ff ff f4 bi 800373c <pthread_create+0x328>
0800c6d4 <pthread_exit>:
void pthread_exit(
void *value_ptr
)
{
800c6d4: 37 9c ff fc addi sp,sp,-4
800c6d8: 5b 9d 00 04 sw (sp+4),ra
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
800c6dc: 78 03 08 01 mvhi r3,0x801
800c6e0: 38 63 4d b4 ori r3,r3,0x4db4
}
void pthread_exit(
void *value_ptr
)
{
800c6e4: b8 20 10 00 mv r2,r1
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
800c6e8: 28 61 00 0c lw r1,(r3+12)
800c6ec: fb ff ff d4 calli 800c63c <_POSIX_Thread_Exit>
}
800c6f0: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800c6f4: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED
800c6f8: c3 a0 00 00 ret <== NOT EXECUTED
08026f08 <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
8026f08: 37 9c ff e4 addi sp,sp,-28
8026f0c: 5b 8b 00 18 sw (sp+24),r11
8026f10: 5b 8c 00 14 sw (sp+20),r12
8026f14: 5b 8d 00 10 sw (sp+16),r13
8026f18: 5b 8e 00 0c sw (sp+12),r14
8026f1c: 5b 8f 00 08 sw (sp+8),r15
8026f20: 5b 9d 00 04 sw (sp+4),ra
8026f24: b8 40 58 00 mv r11,r2
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
8026f28: 44 40 00 04 be r2,r0,8026f38 <pthread_kill+0x30>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8026f2c: 34 4e ff ff addi r14,r2,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
8026f30: 34 02 00 1f mvi r2,31
8026f34: 50 4e 00 0d bgeu r2,r14,8026f68 <pthread_kill+0x60>
rtems_set_errno_and_return_minus_one( EINVAL );
8026f38: fb ff b3 aa calli 8013de0 <__errno>
8026f3c: 34 02 00 16 mvi r2,22
8026f40: 58 22 00 00 sw (r1+0),r2
8026f44: 34 01 ff ff mvi r1,-1
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
}
8026f48: 2b 9d 00 04 lw ra,(sp+4)
8026f4c: 2b 8b 00 18 lw r11,(sp+24)
8026f50: 2b 8c 00 14 lw r12,(sp+20)
8026f54: 2b 8d 00 10 lw r13,(sp+16)
8026f58: 2b 8e 00 0c lw r14,(sp+12)
8026f5c: 2b 8f 00 08 lw r15,(sp+8)
8026f60: 37 9c 00 1c addi sp,sp,28
8026f64: c3 a0 00 00 ret
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 );
8026f68: 37 82 00 1c addi r2,sp,28
8026f6c: fb ff 97 25 calli 800cc00 <_Thread_Get>
8026f70: b8 20 60 00 mv r12,r1
switch ( location ) {
8026f74: 2b 81 00 1c lw r1,(sp+28)
8026f78: 44 20 00 06 be r1,r0,8026f90 <pthread_kill+0x88> <== ALWAYS TAKEN
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
8026f7c: fb ff b3 99 calli 8013de0 <__errno> <== NOT EXECUTED
8026f80: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
8026f84: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8026f88: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8026f8c: e3 ff ff ef bi 8026f48 <pthread_kill+0x40> <== NOT EXECUTED
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
8026f90: b5 6b 18 00 add r3,r11,r11
8026f94: b4 6b 18 00 add r3,r3,r11
8026f98: 78 04 08 02 mvhi r4,0x802
8026f9c: b4 63 18 00 add r3,r3,r3
8026fa0: 38 84 af 78 ori r4,r4,0xaf78
8026fa4: b4 63 18 00 add r3,r3,r3
8026fa8: b4 83 18 00 add r3,r4,r3
8026fac: 28 61 00 08 lw r1,(r3+8)
8026fb0: 34 0f 00 01 mvi r15,1
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8026fb4: 29 8d 01 20 lw r13,(r12+288)
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
8026fb8: 44 2f 00 11 be r1,r15,8026ffc <pthread_kill+0xf4>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
8026fbc: b9 c0 10 00 mv r2,r14
8026fc0: 34 01 00 01 mvi r1,1
8026fc4: fb ff 6c 69 calli 8002168 <__ashlsi3>
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
8026fc8: 29 a4 00 d4 lw r4,(r13+212)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
8026fcc: b9 60 10 00 mv r2,r11
8026fd0: 34 03 00 00 mvi r3,0
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
8026fd4: b8 81 08 00 or r1,r4,r1
8026fd8: 59 a1 00 d4 sw (r13+212),r1
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
8026fdc: b9 80 08 00 mv r1,r12
8026fe0: fb ff ff 67 calli 8026d7c <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
8026fe4: 78 02 08 02 mvhi r2,0x802
8026fe8: 38 42 af 2c ori r2,r2,0xaf2c
8026fec: 28 41 00 08 lw r1,(r2+8)
8026ff0: 44 20 00 03 be r1,r0,8026ffc <pthread_kill+0xf4>
8026ff4: 28 41 00 0c lw r1,(r2+12)
8026ff8: 45 81 00 0b be r12,r1,8027024 <pthread_kill+0x11c>
_Thread_Dispatch_necessary = true;
}
_Thread_Enable_dispatch();
8026ffc: fb ff 96 f4 calli 800cbcc <_Thread_Enable_dispatch>
return 0;
8027000: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
}
8027004: 2b 9d 00 04 lw ra,(sp+4)
8027008: 2b 8b 00 18 lw r11,(sp+24)
802700c: 2b 8c 00 14 lw r12,(sp+20)
8027010: 2b 8d 00 10 lw r13,(sp+16)
8027014: 2b 8e 00 0c lw r14,(sp+12)
8027018: 2b 8f 00 08 lw r15,(sp+8)
802701c: 37 9c 00 1c addi sp,sp,28
8027020: c3 a0 00 00 ret
api->signals_pending |= signo_to_mask( sig );
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
8027024: 30 4f 00 18 sb (r2+24),r15
8027028: e3 ff ff f5 bi 8026ffc <pthread_kill+0xf4>
08005980 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
8005980: 37 9c ff f0 addi sp,sp,-16
8005984: 5b 8b 00 0c sw (sp+12),r11
8005988: 5b 8c 00 08 sw (sp+8),r12
800598c: 5b 9d 00 04 sw (sp+4),ra
8005990: b8 20 60 00 mv r12,r1
*
* 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 );
8005994: b8 40 08 00 mv r1,r2
8005998: 37 82 00 10 addi r2,sp,16
800599c: f8 00 00 49 calli 8005ac0 <_POSIX_Absolute_timeout_to_ticks>
80059a0: b8 20 58 00 mv r11,r1
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
80059a4: 34 01 00 03 mvi r1,3
80059a8: 45 61 00 15 be r11,r1,80059fc <pthread_mutex_timedlock+0x7c>
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
80059ac: 2b 83 00 10 lw r3,(sp+16)
80059b0: 34 02 00 00 mvi r2,0
80059b4: b9 80 08 00 mv r1,r12
80059b8: fb ff ff 9f calli 8005834 <_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) ) {
80059bc: 34 02 00 10 mvi r2,16
80059c0: 44 22 00 06 be r1,r2,80059d8 <pthread_mutex_timedlock+0x58><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
80059c4: 2b 9d 00 04 lw ra,(sp+4)
80059c8: 2b 8b 00 0c lw r11,(sp+12)
80059cc: 2b 8c 00 08 lw r12,(sp+8)
80059d0: 37 9c 00 10 addi sp,sp,16
80059d4: c3 a0 00 00 ret
* 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) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
80059d8: 45 60 00 12 be r11,r0,8005a20 <pthread_mutex_timedlock+0xa0><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
80059dc: 35 6b ff ff addi r11,r11,-1
80059e0: 34 02 00 01 mvi r2,1
80059e4: 50 4b 00 11 bgeu r2,r11,8005a28 <pthread_mutex_timedlock+0xa8><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
80059e8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80059ec: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
80059f0: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
80059f4: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
80059f8: c3 a0 00 00 ret <== NOT EXECUTED
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
80059fc: 2b 83 00 10 lw r3,(sp+16)
8005a00: b9 80 08 00 mv r1,r12
8005a04: 34 02 00 01 mvi r2,1
8005a08: fb ff ff 8b calli 8005834 <_POSIX_Mutex_Lock_support>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
8005a0c: 2b 9d 00 04 lw ra,(sp+4)
8005a10: 2b 8b 00 0c lw r11,(sp+12)
8005a14: 2b 8c 00 08 lw r12,(sp+8)
8005a18: 37 9c 00 10 addi sp,sp,16
8005a1c: c3 a0 00 00 ret
* 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;
8005a20: 34 01 00 16 mvi r1,22 <== NOT EXECUTED
8005a24: e3 ff ff e8 bi 80059c4 <pthread_mutex_timedlock+0x44> <== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
8005a28: 34 01 00 74 mvi r1,116
8005a2c: e3 ff ff e6 bi 80059c4 <pthread_mutex_timedlock+0x44>
08002bb4 <pthread_mutexattr_gettype>:
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
return EINVAL;
8002bb4: 34 03 00 16 mvi r3,22
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
8002bb8: 44 20 00 07 be r1,r0,8002bd4 <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !attr->is_initialized )
8002bbc: 28 24 00 00 lw r4,(r1+0)
8002bc0: 44 80 00 05 be r4,r0,8002bd4 <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !type )
8002bc4: 44 40 00 04 be r2,r0,8002bd4 <pthread_mutexattr_gettype+0x20><== NEVER TAKEN
return EINVAL;
*type = attr->type;
8002bc8: 28 21 00 10 lw r1,(r1+16)
return 0;
8002bcc: 34 03 00 00 mvi r3,0
return EINVAL;
if ( !type )
return EINVAL;
*type = attr->type;
8002bd0: 58 41 00 00 sw (r2+0),r1
return 0;
}
8002bd4: b8 60 08 00 mv r1,r3
8002bd8: c3 a0 00 00 ret
08005468 <pthread_mutexattr_setpshared>:
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
8005468: 34 03 00 16 mvi r3,22
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
800546c: 44 20 00 07 be r1,r0,8005488 <pthread_mutexattr_setpshared+0x20>
8005470: 28 24 00 00 lw r4,(r1+0)
8005474: 44 80 00 05 be r4,r0,8005488 <pthread_mutexattr_setpshared+0x20>
return EINVAL;
switch ( pshared ) {
8005478: 34 04 00 01 mvi r4,1
800547c: 54 44 00 03 bgu r2,r4,8005488 <pthread_mutexattr_setpshared+0x20><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
8005480: 58 22 00 04 sw (r1+4),r2
return 0;
8005484: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
8005488: b8 60 08 00 mv r1,r3
800548c: c3 a0 00 00 ret
08002c28 <pthread_mutexattr_settype>:
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
8002c28: 34 03 00 16 mvi r3,22
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
8002c2c: 44 20 00 07 be r1,r0,8002c48 <pthread_mutexattr_settype+0x20>
8002c30: 28 24 00 00 lw r4,(r1+0)
8002c34: 44 80 00 05 be r4,r0,8002c48 <pthread_mutexattr_settype+0x20><== NEVER TAKEN
return EINVAL;
switch ( type ) {
8002c38: 34 04 00 03 mvi r4,3
8002c3c: 54 44 00 03 bgu r2,r4,8002c48 <pthread_mutexattr_settype+0x20>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
8002c40: 58 22 00 10 sw (r1+16),r2
return 0;
8002c44: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
8002c48: b8 60 08 00 mv r1,r3
8002c4c: c3 a0 00 00 ret
08003c88 <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
8003c88: 37 9c ff ec addi sp,sp,-20
8003c8c: 5b 8b 00 10 sw (sp+16),r11
8003c90: 5b 8c 00 0c sw (sp+12),r12
8003c94: 5b 8d 00 08 sw (sp+8),r13
8003c98: 5b 9d 00 04 sw (sp+4),ra
if ( !once_control || !init_routine )
8003c9c: 64 43 00 00 cmpei r3,r2,0
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
8003ca0: b8 40 60 00 mv r12,r2
if ( !once_control || !init_routine )
8003ca4: 64 22 00 00 cmpei r2,r1,0
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
8003ca8: b8 20 58 00 mv r11,r1
if ( !once_control || !init_routine )
8003cac: b8 62 18 00 or r3,r3,r2
return EINVAL;
8003cb0: 34 01 00 16 mvi r1,22
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
8003cb4: 5c 60 00 04 bne r3,r0,8003cc4 <pthread_once+0x3c>
return EINVAL;
if ( !once_control->init_executed ) {
8003cb8: 29 6d 00 04 lw r13,(r11+4)
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
8003cbc: 34 01 00 00 mvi r1,0
)
{
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
8003cc0: 45 a3 00 07 be r13,r3,8003cdc <pthread_once+0x54>
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
8003cc4: 2b 9d 00 04 lw ra,(sp+4)
8003cc8: 2b 8b 00 10 lw r11,(sp+16)
8003ccc: 2b 8c 00 0c lw r12,(sp+12)
8003cd0: 2b 8d 00 08 lw r13,(sp+8)
8003cd4: 37 9c 00 14 addi sp,sp,20
8003cd8: c3 a0 00 00 ret
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
8003cdc: 34 01 01 00 mvi r1,256
8003ce0: 34 02 01 00 mvi r2,256
8003ce4: 37 83 00 14 addi r3,sp,20
8003ce8: f8 00 01 ab calli 8004394 <rtems_task_mode>
if ( !once_control->init_executed ) {
8003cec: 29 61 00 04 lw r1,(r11+4)
8003cf0: 44 2d 00 0c be r1,r13,8003d20 <pthread_once+0x98> <== ALWAYS TAKEN
once_control->is_initialized = true;
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
8003cf4: 2b 81 00 14 lw r1,(sp+20)
8003cf8: 34 02 01 00 mvi r2,256
8003cfc: 37 83 00 14 addi r3,sp,20
8003d00: f8 00 01 a5 calli 8004394 <rtems_task_mode>
}
return 0;
8003d04: 34 01 00 00 mvi r1,0
}
8003d08: 2b 9d 00 04 lw ra,(sp+4)
8003d0c: 2b 8b 00 10 lw r11,(sp+16)
8003d10: 2b 8c 00 0c lw r12,(sp+12)
8003d14: 2b 8d 00 08 lw r13,(sp+8)
8003d18: 37 9c 00 14 addi sp,sp,20
8003d1c: c3 a0 00 00 ret
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( !once_control->init_executed ) {
once_control->is_initialized = true;
8003d20: 34 01 00 01 mvi r1,1
8003d24: 59 61 00 00 sw (r11+0),r1
once_control->init_executed = true;
8003d28: 59 61 00 04 sw (r11+4),r1
(*init_routine)();
8003d2c: d9 80 00 00 call r12
8003d30: e3 ff ff f1 bi 8003cf4 <pthread_once+0x6c>
08004558 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
8004558: 37 9c ff e0 addi sp,sp,-32
800455c: 5b 8b 00 14 sw (sp+20),r11
8004560: 5b 8c 00 10 sw (sp+16),r12
8004564: 5b 8d 00 0c sw (sp+12),r13
8004568: 5b 8e 00 08 sw (sp+8),r14
800456c: 5b 9d 00 04 sw (sp+4),ra
8004570: b8 20 58 00 mv r11,r1
/*
* Error check parameters
*/
if ( !rwlock )
return EINVAL;
8004574: 34 01 00 16 mvi r1,22
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
8004578: 45 60 00 07 be r11,r0,8004594 <pthread_rwlock_init+0x3c>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
800457c: 44 40 00 31 be r2,r0,8004640 <pthread_rwlock_init+0xe8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8004580: 28 43 00 00 lw r3,(r2+0)
return EINVAL;
8004584: 34 01 00 16 mvi r1,22
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8004588: 44 60 00 03 be r3,r0,8004594 <pthread_rwlock_init+0x3c> <== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
800458c: 28 4e 00 04 lw r14,(r2+4)
8004590: 45 c0 00 08 be r14,r0,80045b0 <pthread_rwlock_init+0x58> <== ALWAYS TAKEN
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
8004594: 2b 9d 00 04 lw ra,(sp+4)
8004598: 2b 8b 00 14 lw r11,(sp+20)
800459c: 2b 8c 00 10 lw r12,(sp+16)
80045a0: 2b 8d 00 0c lw r13,(sp+12)
80045a4: 2b 8e 00 08 lw r14,(sp+8)
80045a8: 37 9c 00 20 addi sp,sp,32
80045ac: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80045b0: 78 01 08 01 mvhi r1,0x801
80045b4: 38 21 98 d8 ori r1,r1,0x98d8
80045b8: 28 22 00 00 lw r2,(r1+0)
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
80045bc: 5b 80 00 20 sw (sp+32),r0
80045c0: 34 42 00 01 addi r2,r2,1
80045c4: 58 22 00 00 sw (r1+0),r2
* 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 );
80045c8: 78 0d 08 01 mvhi r13,0x801
80045cc: 39 ad 9a 4c ori r13,r13,0x9a4c
80045d0: b9 a0 08 00 mv r1,r13
80045d4: f8 00 0a 12 calli 8006e1c <_Objects_Allocate>
80045d8: b8 20 60 00 mv r12,r1
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
80045dc: 44 2e 00 16 be r1,r14,8004634 <pthread_rwlock_init+0xdc>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
80045e0: 37 82 00 20 addi r2,sp,32
80045e4: 34 21 00 10 addi r1,r1,16
80045e8: f8 00 07 27 calli 8006284 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
80045ec: 29 82 00 08 lw r2,(r12+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80045f0: 29 a3 00 1c lw r3,(r13+28)
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
80045f4: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80045f8: b4 21 08 00 add r1,r1,r1
80045fc: b4 21 08 00 add r1,r1,r1
8004600: b4 61 08 00 add r1,r3,r1
8004604: 58 2c 00 00 sw (r1+0),r12
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8004608: 59 80 00 0c sw (r12+12),r0
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
800460c: 59 62 00 00 sw (r11+0),r2
_Thread_Enable_dispatch();
8004610: f8 00 0e ef calli 80081cc <_Thread_Enable_dispatch>
return 0;
8004614: 34 01 00 00 mvi r1,0
}
8004618: 2b 9d 00 04 lw ra,(sp+4)
800461c: 2b 8b 00 14 lw r11,(sp+20)
8004620: 2b 8c 00 10 lw r12,(sp+16)
8004624: 2b 8d 00 0c lw r13,(sp+12)
8004628: 2b 8e 00 08 lw r14,(sp+8)
800462c: 37 9c 00 20 addi sp,sp,32
8004630: c3 a0 00 00 ret
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
_Thread_Enable_dispatch();
8004634: f8 00 0e e6 calli 80081cc <_Thread_Enable_dispatch>
return EAGAIN;
8004638: 34 01 00 0b mvi r1,11
800463c: e3 ff ff d6 bi 8004594 <pthread_rwlock_init+0x3c>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
8004640: 37 8c 00 18 addi r12,sp,24
8004644: b9 80 08 00 mv r1,r12
8004648: f8 00 02 ee calli 8005200 <pthread_rwlockattr_init>
the_attr = &default_attr;
800464c: b9 80 10 00 mv r2,r12
8004650: e3 ff ff cc bi 8004580 <pthread_rwlock_init+0x28>
080046d8 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80046d8: 37 9c ff e0 addi sp,sp,-32
80046dc: 5b 8b 00 18 sw (sp+24),r11
80046e0: 5b 8c 00 14 sw (sp+20),r12
80046e4: 5b 8d 00 10 sw (sp+16),r13
80046e8: 5b 8e 00 0c sw (sp+12),r14
80046ec: 5b 8f 00 08 sw (sp+8),r15
80046f0: 5b 9d 00 04 sw (sp+4),ra
80046f4: b8 20 58 00 mv r11,r1
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
80046f8: 34 0c 00 16 mvi r12,22
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80046fc: b8 40 08 00 mv r1,r2
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
8004700: 45 60 00 0c be r11,r0,8004730 <pthread_rwlock_timedrdlock+0x58>
*
* 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 );
8004704: 37 82 00 1c addi r2,sp,28
8004708: f8 00 1d 33 calli 800bbd4 <_POSIX_Absolute_timeout_to_ticks>
800470c: 78 03 08 01 mvhi r3,0x801
8004710: 29 62 00 00 lw r2,(r11+0)
8004714: b8 20 70 00 mv r14,r1
8004718: b8 60 08 00 mv r1,r3
800471c: 38 21 9a 4c ori r1,r1,0x9a4c
8004720: 37 83 00 20 addi r3,sp,32
8004724: f8 00 0b 0f calli 8007360 <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
8004728: 2b 8d 00 20 lw r13,(sp+32)
800472c: 45 a0 00 0a be r13,r0,8004754 <pthread_rwlock_timedrdlock+0x7c>
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
8004730: b9 80 08 00 mv r1,r12
8004734: 2b 9d 00 04 lw ra,(sp+4)
8004738: 2b 8b 00 18 lw r11,(sp+24)
800473c: 2b 8c 00 14 lw r12,(sp+20)
8004740: 2b 8d 00 10 lw r13,(sp+16)
8004744: 2b 8e 00 0c lw r14,(sp+12)
8004748: 2b 8f 00 08 lw r15,(sp+8)
800474c: 37 9c 00 20 addi sp,sp,32
8004750: c3 a0 00 00 ret
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,
8004754: 65 cf 00 03 cmpei r15,r14,3
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
8004758: 29 62 00 00 lw r2,(r11+0)
800475c: 2b 84 00 1c lw r4,(sp+28)
8004760: 34 21 00 10 addi r1,r1,16
8004764: b9 e0 18 00 mv r3,r15
8004768: 34 05 00 00 mvi r5,0
800476c: f8 00 06 d3 calli 80062b8 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
8004770: f8 00 0e 97 calli 80081cc <_Thread_Enable_dispatch>
if ( !do_wait ) {
8004774: 5d ed 00 10 bne r15,r13,80047b4 <pthread_rwlock_timedrdlock+0xdc>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
8004778: 78 01 08 01 mvhi r1,0x801
800477c: 38 21 9d 84 ori r1,r1,0x9d84
8004780: 28 21 00 0c lw r1,(r1+12)
8004784: 34 02 00 02 mvi r2,2
8004788: 28 21 00 34 lw r1,(r1+52)
800478c: 44 22 00 04 be r1,r2,800479c <pthread_rwlock_timedrdlock+0xc4>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
8004790: f8 00 00 4a calli 80048b8 <_POSIX_RWLock_Translate_core_RWLock_return_code>
8004794: b8 20 60 00 mv r12,r1
8004798: e3 ff ff e6 bi 8004730 <pthread_rwlock_timedrdlock+0x58>
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
800479c: 45 cf ff e5 be r14,r15,8004730 <pthread_rwlock_timedrdlock+0x58><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
80047a0: 35 ce ff ff addi r14,r14,-1
80047a4: 34 02 00 01 mvi r2,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
80047a8: 34 0c 00 74 mvi r12,116
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
80047ac: 50 4e ff e1 bgeu r2,r14,8004730 <pthread_rwlock_timedrdlock+0x58><== ALWAYS TAKEN
80047b0: e3 ff ff f8 bi 8004790 <pthread_rwlock_timedrdlock+0xb8> <== NOT EXECUTED
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
80047b4: 78 01 08 01 mvhi r1,0x801
80047b8: 38 21 9d 84 ori r1,r1,0x9d84
80047bc: 28 21 00 0c lw r1,(r1+12)
80047c0: 28 21 00 34 lw r1,(r1+52)
80047c4: e3 ff ff f3 bi 8004790 <pthread_rwlock_timedrdlock+0xb8>
080047c8 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80047c8: 37 9c ff e0 addi sp,sp,-32
80047cc: 5b 8b 00 18 sw (sp+24),r11
80047d0: 5b 8c 00 14 sw (sp+20),r12
80047d4: 5b 8d 00 10 sw (sp+16),r13
80047d8: 5b 8e 00 0c sw (sp+12),r14
80047dc: 5b 8f 00 08 sw (sp+8),r15
80047e0: 5b 9d 00 04 sw (sp+4),ra
80047e4: b8 20 58 00 mv r11,r1
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
80047e8: 34 0c 00 16 mvi r12,22
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80047ec: b8 40 08 00 mv r1,r2
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
80047f0: 45 60 00 0c be r11,r0,8004820 <pthread_rwlock_timedwrlock+0x58>
*
* 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 );
80047f4: 37 82 00 1c addi r2,sp,28
80047f8: f8 00 1c f7 calli 800bbd4 <_POSIX_Absolute_timeout_to_ticks>
80047fc: 78 03 08 01 mvhi r3,0x801
8004800: 29 62 00 00 lw r2,(r11+0)
8004804: b8 20 70 00 mv r14,r1
8004808: b8 60 08 00 mv r1,r3
800480c: 38 21 9a 4c ori r1,r1,0x9a4c
8004810: 37 83 00 20 addi r3,sp,32
8004814: f8 00 0a d3 calli 8007360 <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
8004818: 2b 8d 00 20 lw r13,(sp+32)
800481c: 45 a0 00 0a be r13,r0,8004844 <pthread_rwlock_timedwrlock+0x7c>
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
8004820: b9 80 08 00 mv r1,r12
8004824: 2b 9d 00 04 lw ra,(sp+4)
8004828: 2b 8b 00 18 lw r11,(sp+24)
800482c: 2b 8c 00 14 lw r12,(sp+20)
8004830: 2b 8d 00 10 lw r13,(sp+16)
8004834: 2b 8e 00 0c lw r14,(sp+12)
8004838: 2b 8f 00 08 lw r15,(sp+8)
800483c: 37 9c 00 20 addi sp,sp,32
8004840: c3 a0 00 00 ret
(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,
8004844: 65 cf 00 03 cmpei r15,r14,3
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
8004848: 29 62 00 00 lw r2,(r11+0)
800484c: 2b 84 00 1c lw r4,(sp+28)
8004850: 34 21 00 10 addi r1,r1,16
8004854: b9 e0 18 00 mv r3,r15
8004858: 34 05 00 00 mvi r5,0
800485c: f8 00 06 e3 calli 80063e8 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
8004860: f8 00 0e 5b calli 80081cc <_Thread_Enable_dispatch>
if ( !do_wait &&
8004864: 5d ed 00 10 bne r15,r13,80048a4 <pthread_rwlock_timedwrlock+0xdc>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
8004868: 78 01 08 01 mvhi r1,0x801
800486c: 38 21 9d 84 ori r1,r1,0x9d84
8004870: 28 21 00 0c lw r1,(r1+12)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
8004874: 34 02 00 02 mvi r2,2
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
8004878: 28 21 00 34 lw r1,(r1+52)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
800487c: 44 22 00 04 be r1,r2,800488c <pthread_rwlock_timedwrlock+0xc4>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
8004880: f8 00 00 0e calli 80048b8 <_POSIX_RWLock_Translate_core_RWLock_return_code>
8004884: b8 20 60 00 mv r12,r1
8004888: e3 ff ff e6 bi 8004820 <pthread_rwlock_timedwrlock+0x58>
);
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
800488c: 45 cf ff e5 be r14,r15,8004820 <pthread_rwlock_timedwrlock+0x58><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004890: 35 ce ff ff addi r14,r14,-1
8004894: 34 02 00 01 mvi r2,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
8004898: 34 0c 00 74 mvi r12,116
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
800489c: 50 4e ff e1 bgeu r2,r14,8004820 <pthread_rwlock_timedwrlock+0x58><== ALWAYS TAKEN
80048a0: e3 ff ff f8 bi 8004880 <pthread_rwlock_timedwrlock+0xb8> <== NOT EXECUTED
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
80048a4: 78 01 08 01 mvhi r1,0x801
80048a8: 38 21 9d 84 ori r1,r1,0x9d84
80048ac: 28 21 00 0c lw r1,(r1+12)
80048b0: 28 21 00 34 lw r1,(r1+52)
80048b4: e3 ff ff f3 bi 8004880 <pthread_rwlock_timedwrlock+0xb8>
08005220 <pthread_rwlockattr_setpshared>:
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
return EINVAL;
8005220: 34 03 00 16 mvi r3,22
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
8005224: 44 20 00 07 be r1,r0,8005240 <pthread_rwlockattr_setpshared+0x20>
return EINVAL;
if ( !attr->is_initialized )
8005228: 28 24 00 00 lw r4,(r1+0)
800522c: 44 80 00 05 be r4,r0,8005240 <pthread_rwlockattr_setpshared+0x20>
return EINVAL;
switch ( pshared ) {
8005230: 34 04 00 01 mvi r4,1
8005234: 54 44 00 03 bgu r2,r4,8005240 <pthread_rwlockattr_setpshared+0x20><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
8005238: 58 22 00 04 sw (r1+4),r2
return 0;
800523c: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
8005240: b8 60 08 00 mv r1,r3
8005244: c3 a0 00 00 ret
080064e0 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
80064e0: 37 9c ff dc addi sp,sp,-36
80064e4: 5b 8b 00 18 sw (sp+24),r11
80064e8: 5b 8c 00 14 sw (sp+20),r12
80064ec: 5b 8d 00 10 sw (sp+16),r13
80064f0: 5b 8e 00 0c sw (sp+12),r14
80064f4: 5b 8f 00 08 sw (sp+8),r15
80064f8: 5b 9d 00 04 sw (sp+4),ra
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
80064fc: 34 0c 00 16 mvi r12,22
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
8006500: b8 60 58 00 mv r11,r3
8006504: b8 20 68 00 mv r13,r1
8006508: b8 40 70 00 mv r14,r2
int rc;
/*
* Check all the parameters
*/
if ( !param )
800650c: 44 60 00 08 be r3,r0,800652c <pthread_setschedparam+0x4c>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
8006510: b8 40 08 00 mv r1,r2
8006514: 37 84 00 20 addi r4,sp,32
8006518: b8 60 10 00 mv r2,r3
800651c: 37 83 00 24 addi r3,sp,36
8006520: f8 00 1b 11 calli 800d164 <_POSIX_Thread_Translate_sched_param>
8006524: b8 20 60 00 mv r12,r1
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
8006528: 44 20 00 0a be r1,r0,8006550 <pthread_setschedparam+0x70>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
800652c: b9 80 08 00 mv r1,r12
8006530: 2b 9d 00 04 lw ra,(sp+4)
8006534: 2b 8b 00 18 lw r11,(sp+24)
8006538: 2b 8c 00 14 lw r12,(sp+20)
800653c: 2b 8d 00 10 lw r13,(sp+16)
8006540: 2b 8e 00 0c lw r14,(sp+12)
8006544: 2b 8f 00 08 lw r15,(sp+8)
8006548: 37 9c 00 24 addi sp,sp,36
800654c: c3 a0 00 00 ret
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
8006550: b9 a0 08 00 mv r1,r13
8006554: 37 82 00 1c addi r2,sp,28
8006558: f8 00 0b 9a calli 80093c0 <_Thread_Get>
800655c: b8 20 78 00 mv r15,r1
switch ( location ) {
8006560: 2b 81 00 1c lw r1,(sp+28)
8006564: 44 2c 00 03 be r1,r12,8006570 <pthread_setschedparam+0x90>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
8006568: 34 0c 00 03 mvi r12,3
800656c: e3 ff ff f0 bi 800652c <pthread_setschedparam+0x4c>
*/
the_thread = _Thread_Get( thread, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8006570: 29 ed 01 20 lw r13,(r15+288)
if ( api->schedpolicy == SCHED_SPORADIC )
8006574: 34 01 00 04 mvi r1,4
8006578: 29 a2 00 84 lw r2,(r13+132)
800657c: 44 41 00 31 be r2,r1,8006640 <pthread_setschedparam+0x160>
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
8006580: 59 ae 00 84 sw (r13+132),r14
api->schedparam = *param;
8006584: 29 62 00 00 lw r2,(r11+0)
8006588: 59 a2 00 88 sw (r13+136),r2
800658c: 29 61 00 04 lw r1,(r11+4)
8006590: 59 a1 00 8c sw (r13+140),r1
8006594: 29 61 00 08 lw r1,(r11+8)
8006598: 59 a1 00 90 sw (r13+144),r1
800659c: 29 61 00 0c lw r1,(r11+12)
80065a0: 59 a1 00 94 sw (r13+148),r1
80065a4: 29 61 00 10 lw r1,(r11+16)
80065a8: 59 a1 00 98 sw (r13+152),r1
80065ac: 29 61 00 14 lw r1,(r11+20)
80065b0: 59 a1 00 9c sw (r13+156),r1
80065b4: 29 61 00 18 lw r1,(r11+24)
80065b8: 59 a1 00 a0 sw (r13+160),r1
the_thread->budget_algorithm = budget_algorithm;
80065bc: 2b 81 00 24 lw r1,(sp+36)
80065c0: 59 e1 00 7c sw (r15+124),r1
the_thread->budget_callout = budget_callout;
80065c4: 2b 81 00 20 lw r1,(sp+32)
80065c8: 59 e1 00 80 sw (r15+128),r1
switch ( api->schedpolicy ) {
80065cc: 48 0e 00 05 bg r0,r14,80065e0 <pthread_setschedparam+0x100><== NEVER TAKEN
80065d0: 34 01 00 02 mvi r1,2
80065d4: 4c 2e 00 0d bge r1,r14,8006608 <pthread_setschedparam+0x128>
80065d8: 34 01 00 04 mvi r1,4
80065dc: 45 c1 00 03 be r14,r1,80065e8 <pthread_setschedparam+0x108><== ALWAYS TAKEN
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
80065e0: f8 00 0b 6b calli 800938c <_Thread_Enable_dispatch> <== NOT EXECUTED
return 0;
80065e4: e3 ff ff d2 bi 800652c <pthread_setschedparam+0x4c> <== NOT EXECUTED
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
80065e8: 59 a2 00 a4 sw (r13+164),r2
_Watchdog_Remove( &api->Sporadic_timer );
80065ec: 35 a1 00 a8 addi r1,r13,168
80065f0: f8 00 11 02 calli 800a9f8 <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
80065f4: 34 01 00 00 mvi r1,0
80065f8: b9 e0 10 00 mv r2,r15
80065fc: fb ff ff 68 calli 800639c <_POSIX_Threads_Sporadic_budget_TSR>
break;
}
_Thread_Enable_dispatch();
8006600: f8 00 0b 63 calli 800938c <_Thread_Enable_dispatch>
8006604: e3 ff ff ca bi 800652c <pthread_setschedparam+0x4c>
8006608: 78 03 08 01 mvhi r3,0x801
800660c: 38 63 a1 14 ori r3,r3,0xa114
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006610: 78 01 08 01 mvhi r1,0x801
8006614: 38 21 a8 c0 ori r1,r1,0xa8c0
8006618: 40 63 00 00 lbu r3,(r3+0)
800661c: 28 24 00 00 lw r4,(r1+0)
the_thread->real_priority =
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
8006620: b9 e0 08 00 mv r1,r15
8006624: c8 62 10 00 sub r2,r3,r2
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006628: 59 e4 00 78 sw (r15+120),r4
the_thread->real_priority =
800662c: 59 e2 00 18 sw (r15+24),r2
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
8006630: 34 03 00 01 mvi r3,1
8006634: f8 00 0a 21 calli 8008eb8 <_Thread_Change_priority>
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
8006638: f8 00 0b 55 calli 800938c <_Thread_Enable_dispatch>
800663c: e3 ff ff bc bi 800652c <pthread_setschedparam+0x4c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
8006640: 35 a1 00 a8 addi r1,r13,168
8006644: f8 00 10 ed calli 800a9f8 <_Watchdog_Remove>
8006648: e3 ff ff ce bi 8006580 <pthread_setschedparam+0xa0>
08003950 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
8003950: 37 9c ff f8 addi sp,sp,-8
8003954: 5b 8b 00 08 sw (sp+8),r11
8003958: 5b 9d 00 04 sw (sp+4),ra
* 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() )
800395c: 78 0b 08 01 mvhi r11,0x801
8003960: 39 6b 6d 6c ori r11,r11,0x6d6c
8003964: 29 62 00 08 lw r2,(r11+8)
8003968: 5c 40 00 10 bne r2,r0,80039a8 <pthread_testcancel+0x58> <== NEVER TAKEN
800396c: 78 01 08 01 mvhi r1,0x801
8003970: 38 21 68 c0 ori r1,r1,0x68c0
8003974: 28 24 00 00 lw r4,(r1+0)
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
8003978: 29 63 00 0c lw r3,(r11+12)
800397c: 34 84 00 01 addi r4,r4,1
8003980: 28 63 01 20 lw r3,(r3+288)
8003984: 58 24 00 00 sw (r1+0),r4
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
8003988: 28 61 00 d8 lw r1,(r3+216)
800398c: 5c 22 00 0b bne r1,r2,80039b8 <pthread_testcancel+0x68> <== NEVER TAKEN
8003990: 28 62 00 e0 lw r2,(r3+224)
8003994: 44 41 00 09 be r2,r1,80039b8 <pthread_testcancel+0x68>
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
8003998: f8 00 0a 96 calli 80063f0 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
800399c: 29 61 00 0c lw r1,(r11+12)
80039a0: 34 02 ff ff mvi r2,-1
80039a4: f8 00 1a 2e calli 800a25c <_POSIX_Thread_Exit>
}
80039a8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80039ac: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80039b0: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
80039b4: c3 a0 00 00 ret <== NOT EXECUTED
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
80039b8: f8 00 0a 8e calli 80063f0 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
}
80039bc: 2b 9d 00 04 lw ra,(sp+4)
80039c0: 2b 8b 00 08 lw r11,(sp+8)
80039c4: 37 9c 00 08 addi sp,sp,8
80039c8: c3 a0 00 00 ret
080046d0 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
80046d0: 37 9c ff c4 addi sp,sp,-60
80046d4: 5b 8b 00 18 sw (sp+24),r11
80046d8: 5b 8c 00 14 sw (sp+20),r12
80046dc: 5b 8d 00 10 sw (sp+16),r13
80046e0: 5b 8e 00 0c sw (sp+12),r14
80046e4: 5b 8f 00 08 sw (sp+8),r15
80046e8: 5b 9d 00 04 sw (sp+4),ra
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);
80046ec: 78 0b 08 01 mvhi r11,0x801
80046f0: 39 6b 88 68 ori r11,r11,0x8868
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
80046f4: b8 20 60 00 mv r12,r1
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);
80046f8: b9 60 08 00 mv r1,r11
80046fc: f8 00 02 c6 calli 8005214 <pthread_mutex_lock>
8004700: b8 20 68 00 mv r13,r1
if (result != 0) {
8004704: 5c 20 00 52 bne r1,r0,800484c <rtems_aio_enqueue+0x17c> <== NEVER TAKEN
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);
8004708: f8 00 05 a4 calli 8005d98 <pthread_self>
800470c: 37 82 00 38 addi r2,sp,56
8004710: 37 83 00 1c addi r3,sp,28
8004714: f8 00 04 57 calli 8005870 <pthread_getschedparam>
req->caller_thread = pthread_self ();
8004718: f8 00 05 a0 calli 8005d98 <pthread_self>
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
800471c: 29 82 00 14 lw r2,(r12+20)
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
8004720: 29 63 00 68 lw r3,(r11+104)
/* _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;
8004724: 28 44 00 10 lw r4,(r2+16)
/* _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 ();
8004728: 59 81 00 10 sw (r12+16),r1
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
800472c: 2b 81 00 1c lw r1,(sp+28)
8004730: c8 24 08 00 sub r1,r1,r4
8004734: 59 81 00 0c sw (r12+12),r1
req->policy = policy;
8004738: 2b 81 00 38 lw r1,(sp+56)
800473c: 59 81 00 08 sw (r12+8),r1
req->aiocbp->error_code = EINPROGRESS;
8004740: 34 01 00 77 mvi r1,119
8004744: 58 41 00 2c sw (r2+44),r1
req->aiocbp->return_value = 0;
8004748: 58 40 00 30 sw (r2+48),r0
if ((aio_request_queue.idle_threads == 0) &&
800474c: 5c 6d 00 24 bne r3,r13,80047dc <rtems_aio_enqueue+0x10c> <== NEVER TAKEN
8004750: 29 63 00 64 lw r3,(r11+100)
8004754: 34 01 00 04 mvi r1,4
8004758: 48 61 00 21 bg r3,r1,80047dc <rtems_aio_enqueue+0x10c>
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);
800475c: 28 42 00 00 lw r2,(r2+0)
8004760: 78 01 08 01 mvhi r1,0x801
8004764: 38 21 88 b0 ori r1,r1,0x88b0
8004768: 34 03 00 01 mvi r3,1
800476c: fb ff fe 7e calli 8004164 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
8004770: 28 22 00 18 lw r2,(r1+24)
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);
8004774: b8 20 70 00 mv r14,r1
if (r_chain->new_fd == 1) {
8004778: 34 01 00 01 mvi r1,1
800477c: 5c 41 00 1f bne r2,r1,80047f8 <rtems_aio_enqueue+0x128>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
8004780: b9 80 10 00 mv r2,r12
8004784: 35 c1 00 08 addi r1,r14,8
8004788: f8 00 08 f6 calli 8006b60 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
800478c: 34 02 00 00 mvi r2,0
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
if (r_chain->new_fd == 1) {
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
8004790: 59 c0 00 18 sw (r14+24),r0
pthread_mutex_init (&r_chain->mutex, NULL);
8004794: 35 c1 00 1c addi r1,r14,28
8004798: f8 00 02 3e calli 8005090 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
800479c: 34 02 00 00 mvi r2,0
80047a0: 35 c1 00 20 addi r1,r14,32
80047a4: f8 00 01 03 calli 8004bb0 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
80047a8: 78 02 08 01 mvhi r2,0x801
80047ac: 78 03 08 00 mvhi r3,0x800
80047b0: 37 81 00 3c addi r1,sp,60
80047b4: 38 42 88 70 ori r2,r2,0x8870
80047b8: 38 63 42 a4 ori r3,r3,0x42a4
80047bc: b9 c0 20 00 mv r4,r14
80047c0: f8 00 03 55 calli 8005514 <pthread_create>
80047c4: b8 20 60 00 mv r12,r1
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
80047c8: 5c 20 00 42 bne r1,r0,80048d0 <rtems_aio_enqueue+0x200> <== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
80047cc: 29 61 00 64 lw r1,(r11+100)
80047d0: 34 21 00 01 addi r1,r1,1
80047d4: 59 61 00 64 sw (r11+100),r1
80047d8: e0 00 00 12 bi 8004820 <rtems_aio_enqueue+0x150>
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,
80047dc: 28 42 00 00 lw r2,(r2+0)
80047e0: 78 01 08 01 mvhi r1,0x801
80047e4: 38 21 88 b0 ori r1,r1,0x88b0
80047e8: 34 03 00 00 mvi r3,0
80047ec: fb ff fe 5e calli 8004164 <rtems_aio_search_fd>
80047f0: b8 20 70 00 mv r14,r1
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
80047f4: 44 20 00 19 be r1,r0,8004858 <rtems_aio_enqueue+0x188>
{
pthread_mutex_lock (&r_chain->mutex);
80047f8: 35 cf 00 1c addi r15,r14,28
80047fc: b9 e0 08 00 mv r1,r15
8004800: f8 00 02 85 calli 8005214 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
8004804: 35 c1 00 08 addi r1,r14,8
8004808: b9 80 10 00 mv r2,r12
800480c: fb ff ff 56 calli 8004564 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
8004810: 35 c1 00 20 addi r1,r14,32
8004814: f8 00 01 28 calli 8004cb4 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
8004818: b9 e0 08 00 mv r1,r15
800481c: f8 00 02 ae calli 80052d4 <pthread_mutex_unlock>
if (aio_request_queue.idle_threads > 0)
pthread_cond_signal (&aio_request_queue.new_req);
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
8004820: b9 60 08 00 mv r1,r11
8004824: f8 00 02 ac calli 80052d4 <pthread_mutex_unlock>
return 0;
}
8004828: b9 a0 08 00 mv r1,r13
800482c: 2b 9d 00 04 lw ra,(sp+4)
8004830: 2b 8b 00 18 lw r11,(sp+24)
8004834: 2b 8c 00 14 lw r12,(sp+20)
8004838: 2b 8d 00 10 lw r13,(sp+16)
800483c: 2b 8e 00 0c lw r14,(sp+12)
8004840: 2b 8f 00 08 lw r15,(sp+8)
8004844: 37 9c 00 3c addi sp,sp,60
8004848: c3 a0 00 00 ret
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
if (result != 0) {
free (req);
800484c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8004850: fb ff f6 b6 calli 8002328 <free> <== NOT EXECUTED
return result;
8004854: e3 ff ff f5 bi 8004828 <rtems_aio_enqueue+0x158> <== NOT EXECUTED
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
8004858: 29 82 00 14 lw r2,(r12+20)
800485c: 78 01 08 01 mvhi r1,0x801
8004860: 38 21 88 bc ori r1,r1,0x88bc
8004864: 28 42 00 00 lw r2,(r2+0)
8004868: 34 03 00 01 mvi r3,1
800486c: fb ff fe 3e calli 8004164 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
8004870: 28 22 00 18 lw r2,(r1+24)
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
8004874: b8 20 70 00 mv r14,r1
if (r_chain->new_fd == 1) {
8004878: 34 01 00 01 mvi r1,1
800487c: 44 41 00 0a be r2,r1,80048a4 <rtems_aio_enqueue+0x1d4>
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
pthread_cond_init (&r_chain->cond, NULL);
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
8004880: 35 c1 00 08 addi r1,r14,8
8004884: b9 80 10 00 mv r2,r12
8004888: fb ff ff 37 calli 8004564 <rtems_aio_insert_prio>
if (aio_request_queue.idle_threads > 0)
800488c: 29 61 00 68 lw r1,(r11+104)
8004890: 4c 01 ff e4 bge r0,r1,8004820 <rtems_aio_enqueue+0x150> <== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
8004894: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8004898: 38 21 88 6c ori r1,r1,0x886c <== NOT EXECUTED
800489c: f8 00 01 06 calli 8004cb4 <pthread_cond_signal> <== NOT EXECUTED
80048a0: e3 ff ff e0 bi 8004820 <rtems_aio_enqueue+0x150> <== NOT EXECUTED
80048a4: 35 c1 00 08 addi r1,r14,8
80048a8: b9 80 10 00 mv r2,r12
80048ac: f8 00 08 ad calli 8006b60 <_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;
pthread_mutex_init (&r_chain->mutex, NULL);
80048b0: 35 c1 00 1c addi r1,r14,28
if (r_chain->new_fd == 1) {
/* 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;
80048b4: 59 c0 00 18 sw (r14+24),r0
pthread_mutex_init (&r_chain->mutex, NULL);
80048b8: 34 02 00 00 mvi r2,0
80048bc: f8 00 01 f5 calli 8005090 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
80048c0: 35 c1 00 20 addi r1,r14,32
80048c4: 34 02 00 00 mvi r2,0
80048c8: f8 00 00 ba calli 8004bb0 <pthread_cond_init>
80048cc: e3 ff ff f0 bi 800488c <rtems_aio_enqueue+0x1bc>
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);
80048d0: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80048d4: f8 00 02 80 calli 80052d4 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
80048d8: b9 80 68 00 mv r13,r12 <== NOT EXECUTED
80048dc: e3 ff ff d3 bi 8004828 <rtems_aio_enqueue+0x158> <== NOT EXECUTED
080042a4 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
80042a4: 37 9c ff 9c addi sp,sp,-100
80042a8: 5b 8b 00 3c sw (sp+60),r11
80042ac: 5b 8c 00 38 sw (sp+56),r12
80042b0: 5b 8d 00 34 sw (sp+52),r13
80042b4: 5b 8e 00 30 sw (sp+48),r14
80042b8: 5b 8f 00 2c sw (sp+44),r15
80042bc: 5b 90 00 28 sw (sp+40),r16
80042c0: 5b 91 00 24 sw (sp+36),r17
80042c4: 5b 92 00 20 sw (sp+32),r18
80042c8: 5b 93 00 1c sw (sp+28),r19
80042cc: 5b 94 00 18 sw (sp+24),r20
80042d0: 5b 95 00 14 sw (sp+20),r21
80042d4: 5b 96 00 10 sw (sp+16),r22
80042d8: 5b 97 00 0c sw (sp+12),r23
80042dc: 5b 98 00 08 sw (sp+8),r24
80042e0: 5b 9d 00 04 sw (sp+4),ra
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
80042e4: 78 14 08 01 mvhi r20,0x801
80042e8: 3a 94 88 68 ori r20,r20,0x8868
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* 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)) {
80042ec: 78 15 08 01 mvhi r21,0x801
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
80042f0: 78 16 08 01 mvhi r22,0x801
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
80042f4: b8 20 68 00 mv r13,r1
80042f8: 34 2e 00 1c addi r14,r1,28
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
80042fc: ba 80 90 00 mv r18,r20
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
8004300: 37 97 00 5c addi r23,sp,92
&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) {
8004304: 34 18 00 74 mvi r24,116
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* 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)) {
8004308: 3a b5 88 c0 ori r21,r21,0x88c0
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
800430c: 3a d6 88 6c ori r22,r22,0x886c
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);
8004310: 37 8f 00 40 addi r15,sp,64
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
8004314: 34 10 00 02 mvi r16,2
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
8004318: 34 11 ff ff mvi r17,-1
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
800431c: 34 13 00 03 mvi r19,3
/* 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);
8004320: b9 c0 08 00 mv r1,r14
8004324: f8 00 03 bc calli 8005214 <pthread_mutex_lock>
if (result != 0)
8004328: 5c 20 00 1f bne r1,r0,80043a4 <rtems_aio_handle+0x100> <== NEVER TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
800432c: 29 ab 00 08 lw r11,(r13+8)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8004330: 35 a4 00 0c addi r4,r13,12
/* 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)) {
8004334: 45 64 00 44 be r11,r4,8004444 <rtems_aio_handle+0x1a0>
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);
8004338: f8 00 06 98 calli 8005d98 <pthread_self>
800433c: 37 82 00 64 addi r2,sp,100
8004340: b9 e0 18 00 mv r3,r15
8004344: f8 00 05 4b calli 8005870 <pthread_getschedparam>
param.sched_priority = req->priority;
8004348: 29 64 00 0c lw r4,(r11+12)
800434c: 5b 84 00 40 sw (sp+64),r4
pthread_setschedparam (pthread_self(), req->policy, ¶m);
8004350: f8 00 06 92 calli 8005d98 <pthread_self>
8004354: 29 62 00 08 lw r2,(r11+8)
8004358: b9 e0 18 00 mv r3,r15
800435c: f8 00 06 94 calli 8005dac <pthread_setschedparam>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8004360: b9 60 08 00 mv r1,r11
8004364: f8 00 09 e4 calli 8006af4 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
8004368: b9 c0 08 00 mv r1,r14
800436c: f8 00 03 da calli 80052d4 <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
8004370: 29 6c 00 14 lw r12,(r11+20)
8004374: 29 84 00 28 lw r4,(r12+40)
8004378: 44 90 00 2c be r4,r16,8004428 <rtems_aio_handle+0x184>
800437c: 44 93 00 27 be r4,r19,8004418 <rtems_aio_handle+0x174> <== NEVER TAKEN
8004380: 34 05 00 01 mvi r5,1
8004384: 44 85 00 1a be r4,r5,80043ec <rtems_aio_handle+0x148> <== ALWAYS TAKEN
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
8004388: 59 91 00 30 sw (r12+48),r17 <== NOT EXECUTED
req->aiocbp->error_code = errno;
800438c: f8 00 2e e4 calli 800ff1c <__errno> <== NOT EXECUTED
8004390: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED
8004394: 59 81 00 2c sw (r12+44),r1 <== NOT EXECUTED
/* 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);
8004398: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
800439c: f8 00 03 9e calli 8005214 <pthread_mutex_lock> <== NOT EXECUTED
if (result != 0)
80043a0: 44 20 ff e3 be r1,r0,800432c <rtems_aio_handle+0x88> <== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
80043a4: 34 01 00 00 mvi r1,0
80043a8: 2b 9d 00 04 lw ra,(sp+4)
80043ac: 2b 8b 00 3c lw r11,(sp+60)
80043b0: 2b 8c 00 38 lw r12,(sp+56)
80043b4: 2b 8d 00 34 lw r13,(sp+52)
80043b8: 2b 8e 00 30 lw r14,(sp+48)
80043bc: 2b 8f 00 2c lw r15,(sp+44)
80043c0: 2b 90 00 28 lw r16,(sp+40)
80043c4: 2b 91 00 24 lw r17,(sp+36)
80043c8: 2b 92 00 20 lw r18,(sp+32)
80043cc: 2b 93 00 1c lw r19,(sp+28)
80043d0: 2b 94 00 18 lw r20,(sp+24)
80043d4: 2b 95 00 14 lw r21,(sp+20)
80043d8: 2b 96 00 10 lw r22,(sp+16)
80043dc: 2b 97 00 0c lw r23,(sp+12)
80043e0: 2b 98 00 08 lw r24,(sp+8)
80043e4: 37 9c 00 64 addi sp,sp,100
80043e8: c3 a0 00 00 ret
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
80043ec: 29 84 00 04 lw r4,(r12+4)
80043f0: 29 81 00 00 lw r1,(r12+0)
80043f4: 29 82 00 08 lw r2,(r12+8)
80043f8: 29 83 00 0c lw r3,(r12+12)
80043fc: f8 00 32 77 calli 8010dd8 <pread>
8004400: b8 20 20 00 mv r4,r1
break;
default:
result = -1;
}
if (result == -1) {
8004404: 44 91 00 50 be r4,r17,8004544 <rtems_aio_handle+0x2a0> <== NEVER TAKEN
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
8004408: 29 65 00 14 lw r5,(r11+20)
800440c: 58 a4 00 30 sw (r5+48),r4
req->aiocbp->error_code = 0;
8004410: 58 a0 00 2c sw (r5+44),r0
8004414: e3 ff ff c3 bi 8004320 <rtems_aio_handle+0x7c>
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
8004418: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
800441c: f8 00 1e 6c calli 800bdcc <fsync> <== NOT EXECUTED
8004420: b8 20 20 00 mv r4,r1 <== NOT EXECUTED
break;
8004424: e3 ff ff f8 bi 8004404 <rtems_aio_handle+0x160> <== NOT EXECUTED
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
8004428: 29 84 00 04 lw r4,(r12+4)
800442c: 29 81 00 00 lw r1,(r12+0)
8004430: 29 82 00 08 lw r2,(r12+8)
8004434: 29 83 00 0c lw r3,(r12+12)
8004438: f8 00 32 ac calli 8010ee8 <pwrite>
800443c: b8 20 20 00 mv r4,r1
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
8004440: e3 ff ff f1 bi 8004404 <rtems_aio_handle+0x160>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
8004444: b9 c0 08 00 mv r1,r14
8004448: f8 00 03 a3 calli 80052d4 <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
800444c: ba 40 08 00 mv r1,r18
8004450: f8 00 03 71 calli 8005214 <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
8004454: 29 a1 00 08 lw r1,(r13+8)
8004458: 45 61 00 04 be r11,r1,8004468 <rtems_aio_handle+0x1c4> <== ALWAYS TAKEN
}
}
/* 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);
800445c: ba 40 08 00 mv r1,r18
8004460: f8 00 03 9d calli 80052d4 <pthread_mutex_unlock>
8004464: e3 ff ff af bi 8004320 <rtems_aio_handle+0x7c>
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
8004468: ba e0 10 00 mv r2,r23
800446c: 34 01 00 01 mvi r1,1
8004470: f8 00 01 6d calli 8004a24 <clock_gettime>
timeout.tv_sec += 3;
8004474: 2b 84 00 5c lw r4,(sp+92)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
8004478: 35 ab 00 20 addi r11,r13,32
800447c: b9 60 08 00 mv r1,r11
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
8004480: 34 84 00 03 addi r4,r4,3
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
8004484: ba 40 10 00 mv r2,r18
8004488: ba e0 18 00 mv r3,r23
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
800448c: 5b 84 00 5c sw (sp+92),r4
timeout.tv_nsec = 0;
8004490: 5b 80 00 60 sw (sp+96),r0
result = pthread_cond_timedwait (&r_chain->cond,
8004494: f8 00 02 31 calli 8004d58 <pthread_cond_timedwait>
&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) {
8004498: 5c 38 ff f1 bne r1,r24,800445c <rtems_aio_handle+0x1b8> <== NEVER TAKEN
800449c: b9 a0 08 00 mv r1,r13
80044a0: f8 00 09 95 calli 8006af4 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
80044a4: b9 c0 08 00 mv r1,r14
80044a8: f8 00 02 93 calli 8004ef4 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
80044ac: b9 60 08 00 mv r1,r11
80044b0: f8 00 01 80 calli 8004ab0 <pthread_cond_destroy>
free (r_chain);
80044b4: b9 a0 08 00 mv r1,r13
80044b8: fb ff f7 9c calli 8002328 <free>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
80044bc: 2a 4d 00 54 lw r13,(r18+84)
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* 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)) {
80044c0: 45 b5 00 0d be r13,r21,80044f4 <rtems_aio_handle+0x250>
}
}
/* 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;
80044c4: 2a 83 00 68 lw r3,(r20+104)
++aio_request_queue.active_threads;
80044c8: 2a 82 00 64 lw r2,(r20+100)
80044cc: b9 a0 08 00 mv r1,r13
}
}
/* 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;
80044d0: 34 63 ff ff addi r3,r3,-1
++aio_request_queue.active_threads;
80044d4: 34 42 00 01 addi r2,r2,1
}
}
/* 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;
80044d8: 5a 83 00 68 sw (r20+104),r3
++aio_request_queue.active_threads;
80044dc: 5a 82 00 64 sw (r20+100),r2
80044e0: f8 00 09 85 calli 8006af4 <_Chain_Extract>
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = (rtems_aio_request_chain *) node;
rtems_aio_move_to_work (r_chain);
80044e4: b9 a0 08 00 mv r1,r13
80044e8: fb ff ff 57 calli 8004244 <rtems_aio_move_to_work>
80044ec: 35 ae 00 1c addi r14,r13,28
80044f0: e3 ff ff db bi 800445c <rtems_aio_handle+0x1b8>
/* 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;
80044f4: 2a 44 00 68 lw r4,(r18+104)
--aio_request_queue.active_threads;
80044f8: 2a 43 00 64 lw r3,(r18+100)
clock_gettime (CLOCK_REALTIME, &timeout);
80044fc: ba e0 10 00 mv r2,r23
/* 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;
8004500: 34 84 00 01 addi r4,r4,1
--aio_request_queue.active_threads;
8004504: 34 63 ff ff addi r3,r3,-1
/* 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;
8004508: 5a 44 00 68 sw (r18+104),r4
--aio_request_queue.active_threads;
800450c: 5a 43 00 64 sw (r18+100),r3
clock_gettime (CLOCK_REALTIME, &timeout);
8004510: 34 01 00 01 mvi r1,1
8004514: f8 00 01 44 calli 8004a24 <clock_gettime>
timeout.tv_sec += 3;
8004518: 2b 84 00 5c lw r4,(sp+92)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
800451c: ba c0 08 00 mv r1,r22
8004520: ba 40 10 00 mv r2,r18
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);
timeout.tv_sec += 3;
8004524: 34 84 00 03 addi r4,r4,3
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8004528: ba e0 18 00 mv r3,r23
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);
timeout.tv_sec += 3;
800452c: 5b 84 00 5c sw (sp+92),r4
timeout.tv_nsec = 0;
8004530: 5b 80 00 60 sw (sp+96),r0
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8004534: f8 00 02 09 calli 8004d58 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
8004538: 44 38 00 05 be r1,r24,800454c <rtems_aio_handle+0x2a8> <== ALWAYS TAKEN
800453c: 2a 4d 00 54 lw r13,(r18+84) <== NOT EXECUTED
8004540: e3 ff ff e1 bi 80044c4 <rtems_aio_handle+0x220> <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
8004544: 29 6c 00 14 lw r12,(r11+20) <== NOT EXECUTED
8004548: e3 ff ff 90 bi 8004388 <rtems_aio_handle+0xe4> <== NOT EXECUTED
/* 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;
800454c: 2a 42 00 68 lw r2,(r18+104)
pthread_mutex_unlock (&aio_request_queue.mutex);
8004550: ba 40 08 00 mv r1,r18
/* 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;
8004554: 34 42 ff ff addi r2,r2,-1
8004558: 5a 42 00 68 sw (r18+104),r2
pthread_mutex_unlock (&aio_request_queue.mutex);
800455c: f8 00 03 5e calli 80052d4 <pthread_mutex_unlock>
return NULL;
8004560: e3 ff ff 91 bi 80043a4 <rtems_aio_handle+0x100>
08004024 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
8004024: 37 9c ff f0 addi sp,sp,-16
8004028: 5b 8b 00 10 sw (sp+16),r11
800402c: 5b 8c 00 0c sw (sp+12),r12
8004030: 5b 8d 00 08 sw (sp+8),r13
8004034: 5b 9d 00 04 sw (sp+4),ra
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
8004038: 78 0c 08 01 mvhi r12,0x801
800403c: 39 8c 88 70 ori r12,r12,0x8870
8004040: b9 80 08 00 mv r1,r12
8004044: f8 00 04 f3 calli 8005410 <pthread_attr_init>
8004048: b8 20 68 00 mv r13,r1
if (result != 0)
800404c: 44 20 00 08 be r1,r0,800406c <rtems_aio_init+0x48> <== ALWAYS TAKEN
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
8004050: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8004054: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8004058: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
800405c: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8004060: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
8004064: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
8004068: c3 a0 00 00 ret <== NOT EXECUTED
result = pthread_attr_init (&aio_request_queue.attr);
if (result != 0)
return result;
result =
800406c: b9 80 08 00 mv r1,r12
8004070: 34 02 00 00 mvi r2,0
8004074: f8 00 05 1e calli 80054ec <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
8004078: 5c 2d 00 26 bne r1,r13,8004110 <rtems_aio_init+0xec> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
800407c: 78 0b 08 01 mvhi r11,0x801
8004080: 39 6b 88 68 ori r11,r11,0x8868
8004084: b9 60 08 00 mv r1,r11
8004088: 34 02 00 00 mvi r2,0
800408c: f8 00 04 01 calli 8005090 <pthread_mutex_init>
if (result != 0)
8004090: 5c 20 00 28 bne r1,r0,8004130 <rtems_aio_init+0x10c> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
8004094: 78 01 08 01 mvhi r1,0x801
8004098: 38 21 88 6c ori r1,r1,0x886c
800409c: 34 02 00 00 mvi r2,0
80040a0: f8 00 02 c4 calli 8004bb0 <pthread_cond_init>
80040a4: b8 20 68 00 mv r13,r1
if (result != 0) {
80040a8: 5c 20 00 2a bne r1,r0,8004150 <rtems_aio_init+0x12c> <== NEVER TAKEN
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
80040ac: 78 01 08 01 mvhi r1,0x801
80040b0: 38 21 88 bc ori r1,r1,0x88bc
80040b4: 59 61 00 5c sw (r11+92),r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80040b8: 78 04 08 01 mvhi r4,0x801
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;
80040bc: 38 01 b0 0b mvu r1,0xb00b
head->previous = NULL;
tail->previous = head;
80040c0: 78 03 08 01 mvhi r3,0x801
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80040c4: 78 02 08 01 mvhi r2,0x801
80040c8: 38 84 88 b4 ori r4,r4,0x88b4
head->previous = NULL;
tail->previous = head;
80040cc: 38 63 88 b0 ori r3,r3,0x88b0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80040d0: 38 42 88 c0 ori r2,r2,0x88c0
80040d4: 59 61 00 60 sw (r11+96),r1
return result;
}
80040d8: b9 a0 08 00 mv r1,r13
80040dc: 59 64 00 48 sw (r11+72),r4
head->previous = NULL;
80040e0: 59 60 00 4c sw (r11+76),r0
tail->previous = head;
80040e4: 59 63 00 50 sw (r11+80),r3
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80040e8: 59 62 00 54 sw (r11+84),r2
head->previous = NULL;
80040ec: 59 60 00 58 sw (r11+88),r0
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
80040f0: 59 60 00 64 sw (r11+100),r0
aio_request_queue.idle_threads = 0;
80040f4: 59 60 00 68 sw (r11+104),r0
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
80040f8: 2b 9d 00 04 lw ra,(sp+4)
80040fc: 2b 8b 00 10 lw r11,(sp+16)
8004100: 2b 8c 00 0c lw r12,(sp+12)
8004104: 2b 8d 00 08 lw r13,(sp+8)
8004108: 37 9c 00 10 addi sp,sp,16
800410c: c3 a0 00 00 ret
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
8004110: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
8004114: 78 0b 08 01 mvhi r11,0x801 <== NOT EXECUTED
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
8004118: f8 00 04 b6 calli 80053f0 <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
800411c: 39 6b 88 68 ori r11,r11,0x8868 <== NOT EXECUTED
8004120: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004124: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
8004128: f8 00 03 da calli 8005090 <pthread_mutex_init> <== NOT EXECUTED
if (result != 0)
800412c: 44 20 ff da be r1,r0,8004094 <rtems_aio_init+0x70> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
8004130: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8004134: f8 00 04 af calli 80053f0 <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
8004138: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
800413c: 38 21 88 6c ori r1,r1,0x886c <== NOT EXECUTED
8004140: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
8004144: f8 00 02 9b calli 8004bb0 <pthread_cond_init> <== NOT EXECUTED
8004148: b8 20 68 00 mv r13,r1 <== NOT EXECUTED
if (result != 0) {
800414c: 44 20 ff d8 be r1,r0,80040ac <rtems_aio_init+0x88> <== NOT EXECUTED
pthread_mutex_destroy (&aio_request_queue.mutex);
8004150: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004154: f8 00 03 68 calli 8004ef4 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
8004158: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
800415c: f8 00 04 a5 calli 80053f0 <pthread_attr_destroy> <== NOT EXECUTED
8004160: e3 ff ff d3 bi 80040ac <rtems_aio_init+0x88> <== NOT EXECUTED
08004564 <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
8004564: 37 9c ff fc addi sp,sp,-4
8004568: 5b 9d 00 04 sw (sp+4),ra
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
800456c: 28 24 00 00 lw r4,(r1+0)
8004570: 34 26 00 04 addi r6,r1,4
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
8004574: b8 40 38 00 mv r7,r2
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
8004578: 44 86 00 10 be r4,r6,80045b8 <rtems_aio_insert_prio+0x54> <== NEVER TAKEN
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 &&
800457c: 28 41 00 14 lw r1,(r2+20)
if (rtems_chain_is_empty (chain)) {
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;
8004580: 28 82 00 14 lw r2,(r4+20)
while (req->aiocbp->aio_reqprio > prio &&
8004584: b8 80 18 00 mv r3,r4
8004588: 28 21 00 10 lw r1,(r1+16)
800458c: 28 42 00 10 lw r2,(r2+16)
8004590: 4c 41 00 08 bge r2,r1,80045b0 <rtems_aio_insert_prio+0x4c> <== ALWAYS TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004594: 28 83 00 00 lw r3,(r4+0) <== 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;
8004598: 28 65 00 14 lw r5,(r3+20) <== 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 &&
800459c: b8 60 20 00 mv r4,r3 <== NOT EXECUTED
80045a0: 28 a5 00 10 lw r5,(r5+16) <== NOT EXECUTED
80045a4: 4c a1 00 03 bge r5,r1,80045b0 <rtems_aio_insert_prio+0x4c> <== NOT EXECUTED
80045a8: 5c 66 ff fb bne r3,r6,8004594 <rtems_aio_insert_prio+0x30> <== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
80045ac: b8 c0 18 00 mv r3,r6 <== 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 );
80045b0: 28 61 00 04 lw r1,(r3+4)
80045b4: b8 e0 10 00 mv r2,r7
80045b8: f8 00 09 6a calli 8006b60 <_Chain_Insert>
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
80045bc: 2b 9d 00 04 lw ra,(sp+4)
80045c0: 37 9c 00 04 addi sp,sp,4
80045c4: c3 a0 00 00 ret
08004244 <rtems_aio_move_to_work>:
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
8004244: 37 9c ff fc addi sp,sp,-4
8004248: 5b 9d 00 04 sw (sp+4),ra
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
800424c: 78 02 08 01 mvhi r2,0x801
8004250: 38 42 88 68 ori r2,r2,0x8868
8004254: 28 44 00 48 lw r4,(r2+72)
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 &&
8004258: 28 26 00 14 lw r6,(r1+20)
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
800425c: b8 20 10 00 mv r2,r1
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 &&
8004260: 28 81 00 14 lw r1,(r4+20)
8004264: b8 80 18 00 mv r3,r4
8004268: 4c 26 00 0a bge r1,r6,8004290 <rtems_aio_move_to_work+0x4c><== NEVER TAKEN
800426c: 78 05 08 01 mvhi r5,0x801
8004270: 38 a5 88 b4 ori r5,r5,0x88b4
8004274: 44 85 00 07 be r4,r5,8004290 <rtems_aio_move_to_work+0x4c> <== NEVER TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004278: 28 83 00 00 lw r3,(r4+0)
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 &&
800427c: 28 67 00 14 lw r7,(r3+20)
8004280: b8 60 20 00 mv r4,r3
8004284: 4c e6 00 03 bge r7,r6,8004290 <rtems_aio_move_to_work+0x4c>
8004288: 5c 65 ff fc bne r3,r5,8004278 <rtems_aio_move_to_work+0x34><== ALWAYS TAKEN
800428c: b8 a0 18 00 mv r3,r5 <== NOT EXECUTED
8004290: 28 61 00 04 lw r1,(r3+4)
8004294: f8 00 0a 33 calli 8006b60 <_Chain_Insert>
node = rtems_chain_next (node);
temp = (rtems_aio_request_chain *) node;
}
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
}
8004298: 2b 9d 00 04 lw ra,(sp+4)
800429c: 37 9c 00 04 addi sp,sp,4
80042a0: c3 a0 00 00 ret
080045c8 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
80045c8: 37 9c ff e8 addi sp,sp,-24
80045cc: 5b 8b 00 18 sw (sp+24),r11
80045d0: 5b 8c 00 14 sw (sp+20),r12
80045d4: 5b 8d 00 10 sw (sp+16),r13
80045d8: 5b 8e 00 0c sw (sp+12),r14
80045dc: 5b 8f 00 08 sw (sp+8),r15
80045e0: 5b 9d 00 04 sw (sp+4),ra
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
80045e4: 28 2b 00 08 lw r11,(r1+8)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
80045e8: 34 2d 00 0c addi r13,r1,12
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
80045ec: 34 0f 00 8c mvi r15,140
req->aiocbp->return_value = -1;
80045f0: 34 0e ff ff mvi r14,-1
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
80045f4: 5d 6d 00 03 bne r11,r13,8004600 <rtems_aio_remove_fd+0x38> <== ALWAYS TAKEN
80045f8: e0 00 00 0b bi 8004624 <rtems_aio_remove_fd+0x5c> <== NOT EXECUTED
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
80045fc: b9 80 58 00 mv r11,r12
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8004600: b9 60 08 00 mv r1,r11
8004604: f8 00 09 3c calli 8006af4 <_Chain_Extract>
req->aiocbp->error_code = ECANCELED;
8004608: 29 62 00 14 lw r2,(r11+20)
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
800460c: 29 6c 00 00 lw r12,(r11+0)
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
free (req);
8004610: b9 60 08 00 mv r1,r11
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
8004614: 58 4f 00 2c sw (r2+44),r15
req->aiocbp->return_value = -1;
8004618: 58 4e 00 30 sw (r2+48),r14
free (req);
800461c: fb ff f7 43 calli 8002328 <free>
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
8004620: 5d 8d ff f7 bne r12,r13,80045fc <rtems_aio_remove_fd+0x34>
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
free (req);
}
}
8004624: 2b 9d 00 04 lw ra,(sp+4)
8004628: 2b 8b 00 18 lw r11,(sp+24)
800462c: 2b 8c 00 14 lw r12,(sp+20)
8004630: 2b 8d 00 10 lw r13,(sp+16)
8004634: 2b 8e 00 0c lw r14,(sp+12)
8004638: 2b 8f 00 08 lw r15,(sp+8)
800463c: 37 9c 00 18 addi sp,sp,24
8004640: c3 a0 00 00 ret
08004644 <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)
{
8004644: 37 9c ff f8 addi sp,sp,-8
8004648: 5b 8b 00 08 sw (sp+8),r11
800464c: 5b 9d 00 04 sw (sp+4),ra
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004650: 28 23 00 00 lw r3,(r1+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8004654: 34 25 00 04 addi r5,r1,4
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
8004658: 34 01 00 02 mvi r1,2
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
800465c: 44 65 00 0b be r3,r5,8004688 <rtems_aio_remove_req+0x44>
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) {
8004660: 28 61 00 14 lw r1,(r3+20)
return AIO_ALLDONE;
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
8004664: b8 60 58 00 mv r11,r3
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
8004668: 5c 22 00 05 bne r1,r2,800467c <rtems_aio_remove_req+0x38> <== NEVER TAKEN
800466c: e0 00 00 0b bi 8004698 <rtems_aio_remove_req+0x54>
8004670: 28 64 00 14 lw r4,(r3+20) <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
8004674: b8 60 58 00 mv r11,r3 <== 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) {
8004678: 44 82 00 08 be r4,r2,8004698 <rtems_aio_remove_req+0x54> <== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
800467c: 28 63 00 00 lw r3,(r3+0) <== 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) {
8004680: 5c 65 ff fc bne r3,r5,8004670 <rtems_aio_remove_req+0x2c> <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
8004684: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
8004688: 2b 9d 00 04 lw ra,(sp+4)
800468c: 2b 8b 00 08 lw r11,(sp+8)
8004690: 37 9c 00 08 addi sp,sp,8
8004694: c3 a0 00 00 ret
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) {
8004698: b9 60 08 00 mv r1,r11
800469c: f8 00 09 16 calli 8006af4 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
80046a0: 29 61 00 14 lw r1,(r11+20)
80046a4: 34 02 00 8c mvi r2,140
80046a8: 58 22 00 2c sw (r1+44),r2
current->aiocbp->return_value = -1;
80046ac: 34 02 ff ff mvi r2,-1
80046b0: 58 22 00 30 sw (r1+48),r2
free (current);
80046b4: b9 60 08 00 mv r1,r11
80046b8: fb ff f7 1c calli 8002328 <free>
}
return AIO_CANCELED;
80046bc: 34 01 00 00 mvi r1,0
}
80046c0: 2b 9d 00 04 lw ra,(sp+4)
80046c4: 2b 8b 00 08 lw r11,(sp+8)
80046c8: 37 9c 00 08 addi sp,sp,8
80046cc: c3 a0 00 00 ret
08003c80 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
8003c80: 37 9c ff e4 addi sp,sp,-28
8003c84: 5b 8b 00 18 sw (sp+24),r11
8003c88: 5b 8c 00 14 sw (sp+20),r12
8003c8c: 5b 8d 00 10 sw (sp+16),r13
8003c90: 5b 8e 00 0c sw (sp+12),r14
8003c94: 5b 8f 00 08 sw (sp+8),r15
8003c98: 5b 9d 00 04 sw (sp+4),ra
8003c9c: b8 20 70 00 mv r14,r1
8003ca0: b8 40 68 00 mv r13,r2
8003ca4: b8 60 60 00 mv r12,r3
8003ca8: b8 80 78 00 mv r15,r4
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
8003cac: b9 c0 08 00 mv r1,r14
8003cb0: f8 00 01 ad calli 8004364 <_Chain_Get>
8003cb4: b8 20 58 00 mv r11,r1
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
8003cb8: 34 02 00 00 mvi r2,0
8003cbc: b9 a0 08 00 mv r1,r13
8003cc0: b9 80 18 00 mv r3,r12
8003cc4: 37 84 00 1c addi r4,sp,28
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
8003cc8: 5d 60 00 0e bne r11,r0,8003d00 <rtems_chain_get_with_wait+0x80>
) {
rtems_event_set out;
sc = rtems_event_receive(
8003ccc: fb ff fd 9e calli 8003344 <rtems_event_receive>
8003cd0: b8 20 28 00 mv r5,r1
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
8003cd4: 44 2b ff f6 be r1,r11,8003cac <rtems_chain_get_with_wait+0x2c><== NEVER TAKEN
}
*node_ptr = node;
return sc;
}
8003cd8: b8 a0 08 00 mv r1,r5
timeout,
&out
);
}
*node_ptr = node;
8003cdc: 59 eb 00 00 sw (r15+0),r11
return sc;
}
8003ce0: 2b 9d 00 04 lw ra,(sp+4)
8003ce4: 2b 8b 00 18 lw r11,(sp+24)
8003ce8: 2b 8c 00 14 lw r12,(sp+20)
8003cec: 2b 8d 00 10 lw r13,(sp+16)
8003cf0: 2b 8e 00 0c lw r14,(sp+12)
8003cf4: 2b 8f 00 08 lw r15,(sp+8)
8003cf8: 37 9c 00 1c addi sp,sp,28
8003cfc: c3 a0 00 00 ret
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
8003d00: 34 05 00 00 mvi r5,0
8003d04: e3 ff ff f5 bi 8003cd8 <rtems_chain_get_with_wait+0x58>
080103c0 <rtems_clock_set_nanoseconds_extension>:
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_set_nanoseconds_extension(
rtems_nanoseconds_extension_routine routine
)
{
80103c0: b8 20 18 00 mv r3,r1
if ( !routine )
return RTEMS_INVALID_ADDRESS;
80103c4: 34 01 00 09 mvi r1,9
*/
rtems_status_code rtems_clock_set_nanoseconds_extension(
rtems_nanoseconds_extension_routine routine
)
{
if ( !routine )
80103c8: 44 60 00 05 be r3,r0,80103dc <rtems_clock_set_nanoseconds_extension+0x1c><== ALWAYS TAKEN
return RTEMS_INVALID_ADDRESS;
_Watchdog_Nanoseconds_since_tick_handler = routine;
80103cc: 78 02 08 03 mvhi r2,0x803 <== NOT EXECUTED
80103d0: 38 42 c1 6c ori r2,r2,0xc16c <== NOT EXECUTED
80103d4: 58 43 00 00 sw (r2+0),r3 <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
80103d8: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
}
80103dc: c3 a0 00 00 ret
08004988 <rtems_io_register_driver>:
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
8004988: 37 9c ff f8 addi sp,sp,-8
800498c: 5b 8b 00 08 sw (sp+8),r11
8004990: 5b 9d 00 04 sw (sp+4),ra
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
8004994: 78 04 08 01 mvhi r4,0x801
8004998: 38 84 ae 3c ori r4,r4,0xae3c
800499c: 28 85 00 08 lw r5,(r4+8)
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
80049a0: 78 04 08 01 mvhi r4,0x801
80049a4: 38 84 b2 a8 ori r4,r4,0xb2a8
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
80049a8: b8 20 58 00 mv r11,r1
rtems_device_major_number major_limit = _IO_Number_of_drivers;
80049ac: 28 86 00 00 lw r6,(r4+0)
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
80049b0: 34 01 00 12 mvi r1,18
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
80049b4: 5c a0 00 33 bne r5,r0,8004a80 <rtems_io_register_driver+0xf8>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
return RTEMS_INVALID_ADDRESS;
80049b8: 34 01 00 09 mvi r1,9
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
80049bc: 44 65 00 31 be r3,r5,8004a80 <rtems_io_register_driver+0xf8>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
80049c0: 58 66 00 00 sw (r3+0),r6
if ( driver_table == NULL )
80049c4: 44 40 00 2f be r2,r0,8004a80 <rtems_io_register_driver+0xf8>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
80049c8: 28 45 00 00 lw r5,(r2+0)
80049cc: 44 a0 00 42 be r5,r0,8004ad4 <rtems_io_register_driver+0x14c>
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
80049d0: 34 01 00 0a mvi r1,10
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
80049d4: 51 66 00 2b bgeu r11,r6,8004a80 <rtems_io_register_driver+0xf8>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80049d8: 78 01 08 01 mvhi r1,0x801
80049dc: 38 21 a9 90 ori r1,r1,0xa990
80049e0: 28 25 00 00 lw r5,(r1+0)
80049e4: 34 a5 00 01 addi r5,r5,1
80049e8: 58 25 00 00 sw (r1+0),r5
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
80049ec: 5d 60 00 29 bne r11,r0,8004a90 <rtems_io_register_driver+0x108>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
80049f0: 28 85 00 00 lw r5,(r4+0)
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
80049f4: 44 ab 00 3e be r5,r11,8004aec <rtems_io_register_driver+0x164><== NEVER TAKEN
80049f8: 78 06 08 01 mvhi r6,0x801
80049fc: 38 c6 b2 ac ori r6,r6,0xb2ac
8004a00: 28 c1 00 00 lw r1,(r6+0)
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004a04: 28 24 00 00 lw r4,(r1+0)
8004a08: 44 80 00 36 be r4,r0,8004ae0 <rtems_io_register_driver+0x158>
rtems_device_major_number n = _IO_Number_of_drivers;
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
8004a0c: 35 6b 00 01 addi r11,r11,1
8004a10: 34 21 00 18 addi r1,r1,24
8004a14: 54 ab ff fc bgu r5,r11,8004a04 <rtems_io_register_driver+0x7c>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
8004a18: 58 6b 00 00 sw (r3+0),r11
if ( m != n )
8004a1c: 44 ab 00 35 be r5,r11,8004af0 <rtems_io_register_driver+0x168>
8004a20: b5 6b 08 00 add r1,r11,r11
8004a24: b4 2b 08 00 add r1,r1,r11
8004a28: b4 21 08 00 add r1,r1,r1
8004a2c: b4 21 08 00 add r1,r1,r1
8004a30: b4 21 08 00 add r1,r1,r1
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
8004a34: 28 c3 00 00 lw r3,(r6+0)
8004a38: 28 44 00 00 lw r4,(r2+0)
8004a3c: b4 61 08 00 add r1,r3,r1
8004a40: 58 24 00 00 sw (r1+0),r4
8004a44: 28 43 00 04 lw r3,(r2+4)
8004a48: 58 23 00 04 sw (r1+4),r3
8004a4c: 28 43 00 08 lw r3,(r2+8)
8004a50: 58 23 00 08 sw (r1+8),r3
8004a54: 28 43 00 0c lw r3,(r2+12)
8004a58: 58 23 00 0c sw (r1+12),r3
8004a5c: 28 43 00 10 lw r3,(r2+16)
8004a60: 58 23 00 10 sw (r1+16),r3
8004a64: 28 42 00 14 lw r2,(r2+20)
8004a68: 58 22 00 14 sw (r1+20),r2
_Thread_Enable_dispatch();
8004a6c: f8 00 08 e3 calli 8006df8 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
8004a70: b9 60 08 00 mv r1,r11
8004a74: 34 02 00 00 mvi r2,0
8004a78: 34 03 00 00 mvi r3,0
8004a7c: f8 00 28 aa calli 800ed24 <rtems_io_initialize>
}
8004a80: 2b 9d 00 04 lw ra,(sp+4)
8004a84: 2b 8b 00 08 lw r11,(sp+8)
8004a88: 37 9c 00 08 addi sp,sp,8
8004a8c: c3 a0 00 00 ret
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
8004a90: b5 6b 08 00 add r1,r11,r11
8004a94: 78 06 08 01 mvhi r6,0x801
8004a98: b4 2b 08 00 add r1,r1,r11
8004a9c: 38 c6 b2 ac ori r6,r6,0xb2ac
8004aa0: b4 21 08 00 add r1,r1,r1
8004aa4: 28 c5 00 00 lw r5,(r6+0)
8004aa8: b4 21 08 00 add r1,r1,r1
8004aac: b4 21 08 00 add r1,r1,r1
8004ab0: b4 a1 28 00 add r5,r5,r1
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004ab4: 28 a4 00 00 lw r4,(r5+0)
8004ab8: 44 80 00 11 be r4,r0,8004afc <rtems_io_register_driver+0x174>
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
8004abc: f8 00 08 cf calli 8006df8 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
8004ac0: 34 01 00 0c mvi r1,12
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
8004ac4: 2b 9d 00 04 lw ra,(sp+4)
8004ac8: 2b 8b 00 08 lw r11,(sp+8)
8004acc: 37 9c 00 08 addi sp,sp,8
8004ad0: c3 a0 00 00 ret
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004ad4: 28 47 00 04 lw r7,(r2+4)
8004ad8: 5c e5 ff be bne r7,r5,80049d0 <rtems_io_register_driver+0x48>
8004adc: e3 ff ff e9 bi 8004a80 <rtems_io_register_driver+0xf8>
8004ae0: 28 27 00 04 lw r7,(r1+4)
8004ae4: 5c e4 ff ca bne r7,r4,8004a0c <rtems_io_register_driver+0x84>
8004ae8: e3 ff ff cc bi 8004a18 <rtems_io_register_driver+0x90>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
8004aec: 58 60 00 00 sw (r3+0),r0 <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
8004af0: f8 00 08 c2 calli 8006df8 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
8004af4: 34 01 00 05 mvi r1,5
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
8004af8: e3 ff ff e2 bi 8004a80 <rtems_io_register_driver+0xf8>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004afc: 28 a5 00 04 lw r5,(r5+4)
8004b00: 5c a4 ff ef bne r5,r4,8004abc <rtems_io_register_driver+0x134>
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
8004b04: 58 6b 00 00 sw (r3+0),r11
8004b08: e3 ff ff cb bi 8004a34 <rtems_io_register_driver+0xac>
08004b0c <rtems_io_unregister_driver>:
*/
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
8004b0c: 37 9c ff fc addi sp,sp,-4
8004b10: 5b 9d 00 04 sw (sp+4),ra
if ( rtems_interrupt_is_in_progress() )
8004b14: 78 02 08 01 mvhi r2,0x801
8004b18: 38 42 ae 3c ori r2,r2,0xae3c
8004b1c: 28 43 00 08 lw r3,(r2+8)
return RTEMS_CALLED_FROM_ISR;
8004b20: 34 02 00 12 mvi r2,18
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
if ( rtems_interrupt_is_in_progress() )
8004b24: 5c 60 00 19 bne r3,r0,8004b88 <rtems_io_unregister_driver+0x7c><== NEVER TAKEN
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
8004b28: 78 02 08 01 mvhi r2,0x801
8004b2c: 38 42 b2 a8 ori r2,r2,0xb2a8
8004b30: 28 43 00 00 lw r3,(r2+0)
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
8004b34: 34 02 00 0d mvi r2,13
)
{
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
8004b38: 50 23 00 14 bgeu r1,r3,8004b88 <rtems_io_unregister_driver+0x7c><== NEVER TAKEN
8004b3c: 78 02 08 01 mvhi r2,0x801
8004b40: 38 42 a9 90 ori r2,r2,0xa990
8004b44: 28 43 00 00 lw r3,(r2+0)
8004b48: 34 63 00 01 addi r3,r3,1
8004b4c: 58 43 00 00 sw (r2+0),r3
_Thread_Disable_dispatch();
memset(
8004b50: 78 02 08 01 mvhi r2,0x801
&_IO_Driver_address_table[major],
8004b54: b4 21 18 00 add r3,r1,r1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
8004b58: 38 42 b2 ac ori r2,r2,0xb2ac
&_IO_Driver_address_table[major],
8004b5c: b4 61 08 00 add r1,r3,r1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
8004b60: 28 44 00 00 lw r4,(r2+0)
&_IO_Driver_address_table[major],
8004b64: b4 21 08 00 add r1,r1,r1
8004b68: b4 21 08 00 add r1,r1,r1
8004b6c: b4 21 08 00 add r1,r1,r1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
8004b70: 34 02 00 00 mvi r2,0
8004b74: 34 03 00 18 mvi r3,24
8004b78: b4 81 08 00 add r1,r4,r1
8004b7c: f8 00 37 9e calli 80129f4 <memset>
&_IO_Driver_address_table[major],
0,
sizeof( rtems_driver_address_table )
);
_Thread_Enable_dispatch();
8004b80: f8 00 08 9e calli 8006df8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8004b84: 34 02 00 00 mvi r2,0
}
return RTEMS_UNSATISFIED;
}
8004b88: b8 40 08 00 mv r1,r2
8004b8c: 2b 9d 00 04 lw ra,(sp+4)
8004b90: 37 9c 00 04 addi sp,sp,4
8004b94: c3 a0 00 00 ret
080063bc <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)
{
80063bc: 37 9c ff e4 addi sp,sp,-28
80063c0: 5b 8b 00 1c sw (sp+28),r11
80063c4: 5b 8c 00 18 sw (sp+24),r12
80063c8: 5b 8d 00 14 sw (sp+20),r13
80063cc: 5b 8e 00 10 sw (sp+16),r14
80063d0: 5b 8f 00 0c sw (sp+12),r15
80063d4: 5b 90 00 08 sw (sp+8),r16
80063d8: 5b 9d 00 04 sw (sp+4),ra
80063dc: b8 20 78 00 mv r15,r1
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
80063e0: 44 20 00 19 be r1,r0,8006444 <rtems_iterate_over_all_threads+0x88><== NEVER TAKEN
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
80063e4: 78 01 08 02 mvhi r1,0x802
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
80063e8: 78 0e 08 02 mvhi r14,0x802
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
80063ec: 38 21 2c c4 ori r1,r1,0x2cc4
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
80063f0: 39 ce 2c c8 ori r14,r14,0x2cc8
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
80063f4: 34 30 00 10 addi r16,r1,16
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
80063f8: 29 c1 00 00 lw r1,(r14+0)
80063fc: 28 2d 00 04 lw r13,(r1+4)
if ( !information )
8006400: 45 a0 00 0f be r13,r0,800643c <rtems_iterate_over_all_threads+0x80>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
8006404: 2d a3 00 10 lhu r3,(r13+16)
8006408: 44 60 00 0d be r3,r0,800643c <rtems_iterate_over_all_threads+0x80>
800640c: 34 0c 00 04 mvi r12,4
8006410: 34 0b 00 01 mvi r11,1
the_thread = (Thread_Control *)information->local_table[ i ];
8006414: 29 a2 00 1c lw r2,(r13+28)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
8006418: 35 6b 00 01 addi r11,r11,1
the_thread = (Thread_Control *)information->local_table[ i ];
800641c: b4 4c 10 00 add r2,r2,r12
8006420: 28 42 00 00 lw r2,(r2+0)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
8006424: 35 8c 00 04 addi r12,r12,4
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
continue;
(*routine)(the_thread);
8006428: b8 40 08 00 mv r1,r2
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
800642c: 44 40 00 03 be r2,r0,8006438 <rtems_iterate_over_all_threads+0x7c>
continue;
(*routine)(the_thread);
8006430: d9 e0 00 00 call r15
8006434: 2d a3 00 10 lhu r3,(r13+16)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
8006438: 50 6b ff f7 bgeu r3,r11,8006414 <rtems_iterate_over_all_threads+0x58>
800643c: 35 ce 00 04 addi r14,r14,4
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
8006440: 5d d0 ff ee bne r14,r16,80063f8 <rtems_iterate_over_all_threads+0x3c>
(*routine)(the_thread);
}
}
}
8006444: 2b 9d 00 04 lw ra,(sp+4)
8006448: 2b 8b 00 1c lw r11,(sp+28)
800644c: 2b 8c 00 18 lw r12,(sp+24)
8006450: 2b 8d 00 14 lw r13,(sp+20)
8006454: 2b 8e 00 10 lw r14,(sp+16)
8006458: 2b 8f 00 0c lw r15,(sp+12)
800645c: 2b 90 00 08 lw r16,(sp+8)
8006460: 37 9c 00 1c addi sp,sp,28
8006464: c3 a0 00 00 ret
0800d6f4 <rtems_message_queue_create>:
uint32_t count,
size_t max_message_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
800d6f4: 37 9c ff e0 addi sp,sp,-32
800d6f8: 5b 8b 00 14 sw (sp+20),r11
800d6fc: 5b 8c 00 10 sw (sp+16),r12
800d700: 5b 8d 00 0c sw (sp+12),r13
800d704: 5b 8e 00 08 sw (sp+8),r14
800d708: 5b 9d 00 04 sw (sp+4),ra
800d70c: b8 20 58 00 mv r11,r1
800d710: b8 40 60 00 mv r12,r2
800d714: b8 60 68 00 mv r13,r3
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
800d718: 34 01 00 03 mvi r1,3
CORE_message_queue_Attributes the_msgq_attributes;
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
800d71c: 45 60 00 07 be r11,r0,800d738 <rtems_message_queue_create+0x44>
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
800d720: 34 01 00 09 mvi r1,9
#endif
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
800d724: 44 a0 00 05 be r5,r0,800d738 <rtems_message_queue_create+0x44>
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
return RTEMS_INVALID_NUMBER;
800d728: 34 01 00 0a mvi r1,10
if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
800d72c: 44 40 00 03 be r2,r0,800d738 <rtems_message_queue_create+0x44>
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
return RTEMS_INVALID_SIZE;
800d730: 34 01 00 08 mvi r1,8
#endif
if ( count == 0 )
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
800d734: 5c 60 00 08 bne r3,r0,800d754 <rtems_message_queue_create+0x60>
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
800d738: 2b 9d 00 04 lw ra,(sp+4)
800d73c: 2b 8b 00 14 lw r11,(sp+20)
800d740: 2b 8c 00 10 lw r12,(sp+16)
800d744: 2b 8d 00 0c lw r13,(sp+12)
800d748: 2b 8e 00 08 lw r14,(sp+8)
800d74c: 37 9c 00 20 addi sp,sp,32
800d750: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
800d754: 78 01 08 02 mvhi r1,0x802
800d758: 38 21 aa a0 ori r1,r1,0xaaa0
800d75c: 28 22 00 00 lw r2,(r1+0)
800d760: 34 42 00 01 addi r2,r2,1
800d764: 58 22 00 00 sw (r1+0),r2
#endif
#endif
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
800d768: 5b 84 00 1c sw (sp+28),r4
800d76c: 5b 85 00 18 sw (sp+24),r5
800d770: f8 00 1f 1d calli 80153e4 <_Message_queue_Allocate>
800d774: b8 20 70 00 mv r14,r1
if ( !the_message_queue ) {
800d778: 2b 84 00 1c lw r4,(sp+28)
800d77c: 2b 85 00 18 lw r5,(sp+24)
800d780: 44 20 00 25 be r1,r0,800d814 <rtems_message_queue_create+0x120><== NEVER TAKEN
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_message_queue->attribute_set = attribute_set;
800d784: 58 24 00 10 sw (r1+16),r4
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_priority(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_PRIORITY ) ? true : false;
800d788: 20 84 00 04 andi r4,r4,0x4
if (_Attributes_Is_priority( attribute_set ) )
800d78c: 44 80 00 12 be r4,r0,800d7d4 <rtems_message_queue_create+0xe0>
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
800d790: 34 01 00 01 mvi r1,1
800d794: 5b 81 00 20 sw (sp+32),r1
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( ! _CORE_message_queue_Initialize(
800d798: 35 c1 00 14 addi r1,r14,20
800d79c: 37 82 00 20 addi r2,sp,32
800d7a0: b9 80 18 00 mv r3,r12
800d7a4: b9 a0 20 00 mv r4,r13
800d7a8: 5b 85 00 18 sw (sp+24),r5
800d7ac: f8 00 05 7a calli 800ed94 <_CORE_message_queue_Initialize>
800d7b0: 2b 85 00 18 lw r5,(sp+24)
800d7b4: 5c 20 00 0a bne r1,r0,800d7dc <rtems_message_queue_create+0xe8>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
800d7b8: 78 01 08 02 mvhi r1,0x802
800d7bc: 38 21 b3 3c ori r1,r1,0xb33c
800d7c0: b9 c0 10 00 mv r2,r14
800d7c4: f8 00 0a 67 calli 8010160 <_Objects_Free>
_Objects_MP_Close(
&_Message_queue_Information, the_message_queue->Object.id);
#endif
_Message_queue_Free( the_message_queue );
_Thread_Enable_dispatch();
800d7c8: f8 00 0f 36 calli 80114a0 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
800d7cc: 34 01 00 0d mvi r1,13
800d7d0: e3 ff ff da bi 800d738 <rtems_message_queue_create+0x44>
the_message_queue->attribute_set = attribute_set;
if (_Attributes_Is_priority( attribute_set ) )
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
800d7d4: 5b 80 00 20 sw (sp+32),r0
800d7d8: e3 ff ff f0 bi 800d798 <rtems_message_queue_create+0xa4>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
800d7dc: 29 c2 00 08 lw r2,(r14+8)
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
800d7e0: 78 01 08 02 mvhi r1,0x802
800d7e4: 38 21 b3 3c ori r1,r1,0xb33c
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
800d7e8: 28 23 00 1c lw r3,(r1+28)
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
800d7ec: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
800d7f0: b4 21 08 00 add r1,r1,r1
800d7f4: b4 21 08 00 add r1,r1,r1
800d7f8: b4 61 08 00 add r1,r3,r1
800d7fc: 58 2e 00 00 sw (r1+0),r14
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
800d800: 59 cb 00 0c sw (r14+12),r11
&_Message_queue_Information,
&the_message_queue->Object,
(Objects_Name) name
);
*id = the_message_queue->Object.id;
800d804: 58 a2 00 00 sw (r5+0),r2
name,
0
);
#endif
_Thread_Enable_dispatch();
800d808: f8 00 0f 26 calli 80114a0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
800d80c: 34 01 00 00 mvi r1,0
800d810: e3 ff ff ca bi 800d738 <rtems_message_queue_create+0x44>
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
if ( !the_message_queue ) {
_Thread_Enable_dispatch();
800d814: f8 00 0f 23 calli 80114a0 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
800d818: 34 01 00 05 mvi r1,5
800d81c: e3 ff ff c7 bi 800d738 <rtems_message_queue_create+0x44>
08004f2c <rtems_object_get_class_information>:
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
8004f2c: 37 9c ff f8 addi sp,sp,-8
8004f30: 5b 8b 00 08 sw (sp+8),r11
8004f34: 5b 9d 00 04 sw (sp+4),ra
8004f38: b8 60 58 00 mv r11,r3
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
8004f3c: 34 03 00 09 mvi r3,9
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
8004f40: 45 60 00 1e be r11,r0,8004fb8 <rtems_object_get_class_information+0x8c>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
8004f44: 20 42 ff ff andi r2,r2,0xffff
8004f48: f8 00 07 c0 calli 8006e48 <_Objects_Get_information>
8004f4c: b8 20 10 00 mv r2,r1
if ( !obj_info )
return RTEMS_INVALID_NUMBER;
8004f50: 34 03 00 0a mvi r3,10
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
8004f54: 44 20 00 19 be r1,r0,8004fb8 <rtems_object_get_class_information+0x8c>
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
8004f58: 28 24 00 08 lw r4,(r1+8)
info->maximum_id = obj_info->maximum_id;
8004f5c: 28 23 00 0c lw r3,(r1+12)
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
8004f60: 2c 46 00 10 lhu r6,(r2+16)
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
8004f64: 40 21 00 12 lbu r1,(r1+18)
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
8004f68: 59 64 00 00 sw (r11+0),r4
info->maximum_id = obj_info->maximum_id;
8004f6c: 59 63 00 04 sw (r11+4),r3
info->auto_extend = obj_info->auto_extend;
8004f70: 31 61 00 0c sb (r11+12),r1
info->maximum = obj_info->maximum;
8004f74: 59 66 00 08 sw (r11+8),r6
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
8004f78: 34 04 00 00 mvi r4,0
8004f7c: 44 c0 00 0d be r6,r0,8004fb0 <rtems_object_get_class_information+0x84><== NEVER TAKEN
8004f80: 28 43 00 1c lw r3,(r2+28)
8004f84: 34 01 00 01 mvi r1,1
8004f88: 34 02 00 01 mvi r2,1
if ( !obj_info->local_table[i] )
8004f8c: b4 21 08 00 add r1,r1,r1
8004f90: b4 21 08 00 add r1,r1,r1
8004f94: b4 61 08 00 add r1,r3,r1
8004f98: 28 25 00 00 lw r5,(r1+0)
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
8004f9c: 34 42 00 01 addi r2,r2,1
8004fa0: b8 40 08 00 mv r1,r2
if ( !obj_info->local_table[i] )
unallocated++;
8004fa4: 64 a5 00 00 cmpei r5,r5,0
8004fa8: b4 85 20 00 add r4,r4,r5
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
8004fac: 50 c2 ff f8 bgeu r6,r2,8004f8c <rtems_object_get_class_information+0x60>
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
8004fb0: 59 64 00 10 sw (r11+16),r4
return RTEMS_SUCCESSFUL;
8004fb4: 34 03 00 00 mvi r3,0
}
8004fb8: b8 60 08 00 mv r1,r3
8004fbc: 2b 9d 00 04 lw ra,(sp+4)
8004fc0: 2b 8b 00 08 lw r11,(sp+8)
8004fc4: 37 9c 00 08 addi sp,sp,8
8004fc8: c3 a0 00 00 ret
08011480 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
8011480: 37 9c ff d8 addi sp,sp,-40
8011484: 5b 8b 00 18 sw (sp+24),r11
8011488: 5b 8c 00 14 sw (sp+20),r12
801148c: 5b 8d 00 10 sw (sp+16),r13
8011490: 5b 8e 00 0c sw (sp+12),r14
8011494: 5b 8f 00 08 sw (sp+8),r15
8011498: 5b 9d 00 04 sw (sp+4),ra
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
801149c: 34 07 00 03 mvi r7,3
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
80114a0: b8 20 60 00 mv r12,r1
80114a4: b8 40 58 00 mv r11,r2
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
80114a8: 44 20 00 3e be r1,r0,80115a0 <rtems_partition_create+0x120>
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
80114ac: 34 07 00 09 mvi r7,9
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
80114b0: 44 40 00 3c be r2,r0,80115a0 <rtems_partition_create+0x120>
return RTEMS_INVALID_ADDRESS;
if ( !id )
80114b4: 44 c0 00 3b be r6,r0,80115a0 <rtems_partition_create+0x120><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
80114b8: 64 82 00 00 cmpei r2,r4,0
80114bc: 64 61 00 00 cmpei r1,r3,0
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
80114c0: 34 07 00 08 mvi r7,8
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
80114c4: b8 41 08 00 or r1,r2,r1
80114c8: 5c 20 00 36 bne r1,r0,80115a0 <rtems_partition_create+0x120>
80114cc: 54 83 00 35 bgu r4,r3,80115a0 <rtems_partition_create+0x120>
*/
RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned (
uint32_t buffer_size
)
{
return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
80114d0: 20 81 00 07 andi r1,r4,0x7
80114d4: 5c 20 00 33 bne r1,r0,80115a0 <rtems_partition_create+0x120>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
80114d8: 21 6f 00 07 andi r15,r11,0x7
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
80114dc: 34 07 00 09 mvi r7,9
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
80114e0: 5d e1 00 30 bne r15,r1,80115a0 <rtems_partition_create+0x120>
80114e4: 78 01 08 04 mvhi r1,0x804
80114e8: 38 21 0d 10 ori r1,r1,0xd10
80114ec: 28 22 00 00 lw r2,(r1+0)
80114f0: 34 42 00 01 addi r2,r2,1
80114f4: 58 22 00 00 sw (r1+0),r2
* This function allocates a partition control block from
* the inactive chain of free partition control blocks.
*/
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
{
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
80114f8: 78 0e 08 04 mvhi r14,0x804
80114fc: 39 ce 0b 68 ori r14,r14,0xb68
8011500: b9 c0 08 00 mv r1,r14
8011504: 5b 83 00 28 sw (sp+40),r3
8011508: 5b 84 00 20 sw (sp+32),r4
801150c: 5b 85 00 24 sw (sp+36),r5
8011510: 5b 86 00 1c sw (sp+28),r6
8011514: f8 00 16 ef calli 80170d0 <_Objects_Allocate>
8011518: b8 20 68 00 mv r13,r1
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
801151c: 2b 83 00 28 lw r3,(sp+40)
8011520: 2b 84 00 20 lw r4,(sp+32)
8011524: 2b 85 00 24 lw r5,(sp+36)
8011528: 2b 86 00 1c lw r6,(sp+28)
801152c: 44 2f 00 26 be r1,r15,80115c4 <rtems_partition_create+0x144>
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
8011530: 58 25 00 1c sw (r1+28),r5
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
8011534: 58 23 00 14 sw (r1+20),r3
the_partition->buffer_size = buffer_size;
8011538: 58 24 00 18 sw (r1+24),r4
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
801153c: 58 2b 00 10 sw (r1+16),r11
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
8011540: 58 20 00 20 sw (r1+32),r0
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
8011544: b8 80 10 00 mv r2,r4
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
8011548: 34 2f 00 24 addi r15,r1,36
length / buffer_size, buffer_size );
801154c: b8 60 08 00 mv r1,r3
8011550: 5b 86 00 1c sw (sp+28),r6
8011554: 5b 84 00 20 sw (sp+32),r4
8011558: f8 00 81 4d calli 8031a8c <__udivsi3>
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
801155c: 2b 84 00 20 lw r4,(sp+32)
length / buffer_size, buffer_size );
8011560: b8 20 18 00 mv r3,r1
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
8011564: b9 60 10 00 mv r2,r11
8011568: b9 e0 08 00 mv r1,r15
801156c: f8 00 0f 98 calli 80153cc <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8011570: 29 a2 00 08 lw r2,(r13+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8011574: 29 c3 00 1c lw r3,(r14+28)
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
8011578: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
801157c: b4 21 08 00 add r1,r1,r1
8011580: b4 21 08 00 add r1,r1,r1
8011584: b4 61 08 00 add r1,r3,r1
8011588: 58 2d 00 00 sw (r1+0),r13
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
801158c: 59 ac 00 0c sw (r13+12),r12
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
8011590: 2b 86 00 1c lw r6,(sp+28)
8011594: 58 c2 00 00 sw (r6+0),r2
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
8011598: f8 00 1c 9e calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
801159c: 34 07 00 00 mvi r7,0
}
80115a0: b8 e0 08 00 mv r1,r7
80115a4: 2b 9d 00 04 lw ra,(sp+4)
80115a8: 2b 8b 00 18 lw r11,(sp+24)
80115ac: 2b 8c 00 14 lw r12,(sp+20)
80115b0: 2b 8d 00 10 lw r13,(sp+16)
80115b4: 2b 8e 00 0c lw r14,(sp+12)
80115b8: 2b 8f 00 08 lw r15,(sp+8)
80115bc: 37 9c 00 28 addi sp,sp,40
80115c0: c3 a0 00 00 ret
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
80115c4: f8 00 1c 93 calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
80115c8: 34 07 00 05 mvi r7,5
80115cc: e3 ff ff f5 bi 80115a0 <rtems_partition_create+0x120>
08004318 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
8004318: 37 9c ff e0 addi sp,sp,-32
800431c: 5b 8b 00 18 sw (sp+24),r11
8004320: 5b 8c 00 14 sw (sp+20),r12
8004324: 5b 8d 00 10 sw (sp+16),r13
8004328: 5b 8e 00 0c sw (sp+12),r14
800432c: 5b 8f 00 08 sw (sp+8),r15
8004330: 5b 9d 00 04 sw (sp+4),ra
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
8004334: 78 03 08 02 mvhi r3,0x802
8004338: b8 20 68 00 mv r13,r1
800433c: b8 60 08 00 mv r1,r3
8004340: b8 40 70 00 mv r14,r2
8004344: 38 21 19 00 ori r1,r1,0x1900
8004348: b9 a0 10 00 mv r2,r13
800434c: 37 83 00 20 addi r3,sp,32
8004350: f8 00 0a 88 calli 8006d70 <_Objects_Get>
8004354: b8 20 58 00 mv r11,r1
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
8004358: 2b 81 00 20 lw r1,(sp+32)
800435c: 44 20 00 0a be r1,r0,8004384 <rtems_rate_monotonic_period+0x6c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8004360: 34 01 00 04 mvi r1,4
}
8004364: 2b 9d 00 04 lw ra,(sp+4)
8004368: 2b 8b 00 18 lw r11,(sp+24)
800436c: 2b 8c 00 14 lw r12,(sp+20)
8004370: 2b 8d 00 10 lw r13,(sp+16)
8004374: 2b 8e 00 0c lw r14,(sp+12)
8004378: 2b 8f 00 08 lw r15,(sp+8)
800437c: 37 9c 00 20 addi sp,sp,32
8004380: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
8004384: 78 0c 08 02 mvhi r12,0x802
8004388: 39 8c 1e d4 ori r12,r12,0x1ed4
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
800438c: 29 62 00 40 lw r2,(r11+64)
8004390: 29 81 00 0c lw r1,(r12+12)
8004394: 44 41 00 0b be r2,r1,80043c0 <rtems_rate_monotonic_period+0xa8>
_Thread_Enable_dispatch();
8004398: f8 00 0e 52 calli 8007ce0 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
800439c: 34 01 00 17 mvi r1,23
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80043a0: 2b 9d 00 04 lw ra,(sp+4)
80043a4: 2b 8b 00 18 lw r11,(sp+24)
80043a8: 2b 8c 00 14 lw r12,(sp+20)
80043ac: 2b 8d 00 10 lw r13,(sp+16)
80043b0: 2b 8e 00 0c lw r14,(sp+12)
80043b4: 2b 8f 00 08 lw r15,(sp+8)
80043b8: 37 9c 00 20 addi sp,sp,32
80043bc: c3 a0 00 00 ret
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
80043c0: 5d c0 00 0f bne r14,r0,80043fc <rtems_rate_monotonic_period+0xe4>
switch ( the_period->state ) {
80043c4: 29 62 00 38 lw r2,(r11+56)
80043c8: 34 03 00 04 mvi r3,4
80043cc: 34 01 00 00 mvi r1,0
80043d0: 54 43 00 07 bgu r2,r3,80043ec <rtems_rate_monotonic_period+0xd4><== NEVER TAKEN
80043d4: 78 01 08 01 mvhi r1,0x801
80043d8: b4 42 10 00 add r2,r2,r2
80043dc: 38 21 f4 18 ori r1,r1,0xf418
80043e0: b4 42 10 00 add r2,r2,r2
80043e4: b4 22 10 00 add r2,r1,r2
80043e8: 28 41 00 00 lw r1,(r2+0)
);
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
80043ec: 5b 81 00 1c sw (sp+28),r1
80043f0: f8 00 0e 3c calli 8007ce0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80043f4: 2b 81 00 1c lw r1,(sp+28)
80043f8: e3 ff ff db bi 8004364 <rtems_rate_monotonic_period+0x4c>
}
_Thread_Enable_dispatch();
return( return_value );
}
_ISR_Disable( level );
80043fc: 90 00 78 00 rcsr r15,IE
8004400: 34 01 ff fe mvi r1,-2
8004404: a1 e1 08 00 and r1,r15,r1
8004408: d0 01 00 00 wcsr IE,r1
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
800440c: 29 62 00 38 lw r2,(r11+56)
8004410: 44 40 00 15 be r2,r0,8004464 <rtems_rate_monotonic_period+0x14c>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
8004414: 34 01 00 02 mvi r1,2
8004418: 44 41 00 26 be r2,r1,80044b0 <rtems_rate_monotonic_period+0x198>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
800441c: 34 01 00 04 mvi r1,4
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
8004420: 5c 41 ff d1 bne r2,r1,8004364 <rtems_rate_monotonic_period+0x4c><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
8004424: b9 60 08 00 mv r1,r11
8004428: fb ff ff 72 calli 80041f0 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
800442c: d0 0f 00 00 wcsr IE,r15
the_period->state = RATE_MONOTONIC_ACTIVE;
8004430: 34 03 00 02 mvi r3,2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004434: 78 01 08 02 mvhi r1,0x802
8004438: 38 21 1a e8 ori r1,r1,0x1ae8
800443c: 35 62 00 10 addi r2,r11,16
8004440: 59 63 00 38 sw (r11+56),r3
the_period->next_length = length;
8004444: 59 6e 00 3c sw (r11+60),r14
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004448: 59 6e 00 1c sw (r11+28),r14
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800444c: f8 00 13 66 calli 80091e4 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
8004450: 34 01 00 06 mvi r1,6
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
8004454: 5b 81 00 1c sw (sp+28),r1
8004458: f8 00 0e 22 calli 8007ce0 <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
800445c: 2b 81 00 1c lw r1,(sp+28)
8004460: e3 ff ff c1 bi 8004364 <rtems_rate_monotonic_period+0x4c>
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
8004464: d0 0f 00 00 wcsr IE,r15
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
8004468: b9 60 08 00 mv r1,r11
800446c: fb ff ff 36 calli 8004144 <_Rate_monotonic_Initiate_statistics>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8004470: 78 03 08 00 mvhi r3,0x800
8004474: 38 63 48 a8 ori r3,r3,0x48a8
the_period->state = RATE_MONOTONIC_ACTIVE;
8004478: 34 04 00 02 mvi r4,2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800447c: 78 01 08 02 mvhi r1,0x802
8004480: 38 21 1a e8 ori r1,r1,0x1ae8
8004484: 35 62 00 10 addi r2,r11,16
8004488: 59 64 00 38 sw (r11+56),r4
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
800448c: 59 60 00 18 sw (r11+24),r0
the_watchdog->routine = routine;
8004490: 59 63 00 2c sw (r11+44),r3
the_watchdog->id = id;
8004494: 59 6d 00 30 sw (r11+48),r13
the_watchdog->user_data = user_data;
8004498: 59 60 00 34 sw (r11+52),r0
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
800449c: 59 6e 00 3c sw (r11+60),r14
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
80044a0: 59 6e 00 1c sw (r11+28),r14
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
80044a4: f8 00 13 50 calli 80091e4 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
80044a8: 34 01 00 00 mvi r1,0
80044ac: e3 ff ff d0 bi 80043ec <rtems_rate_monotonic_period+0xd4>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
80044b0: b9 60 08 00 mv r1,r11
80044b4: fb ff ff 4f calli 80041f0 <_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;
80044b8: 34 01 00 01 mvi r1,1
80044bc: 59 61 00 38 sw (r11+56),r1
the_period->next_length = length;
80044c0: 59 6e 00 3c sw (r11+60),r14
_ISR_Enable( level );
80044c4: d0 0f 00 00 wcsr IE,r15
_Thread_Executing->Wait.id = the_period->Object.id;
80044c8: 29 83 00 0c lw r3,(r12+12)
80044cc: 29 64 00 08 lw r4,(r11+8)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
80044d0: 34 02 40 00 mvi r2,16384
80044d4: b8 60 08 00 mv r1,r3
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
the_period->next_length = length;
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
80044d8: 58 64 00 20 sw (r3+32),r4
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
80044dc: f8 00 10 93 calli 8008728 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
80044e0: 90 00 08 00 rcsr r1,IE
80044e4: 34 02 ff fe mvi r2,-2
80044e8: a0 22 10 00 and r2,r1,r2
80044ec: d0 02 00 00 wcsr IE,r2
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
80044f0: 34 03 00 02 mvi r3,2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
80044f4: 29 62 00 38 lw r2,(r11+56)
the_period->state = RATE_MONOTONIC_ACTIVE;
80044f8: 59 63 00 38 sw (r11+56),r3
_ISR_Enable( level );
80044fc: d0 01 00 00 wcsr IE,r1
/*
* 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 )
8004500: 34 01 00 03 mvi r1,3
8004504: 44 41 00 04 be r2,r1,8004514 <rtems_rate_monotonic_period+0x1fc><== NEVER TAKEN
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
8004508: f8 00 0d f6 calli 8007ce0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
800450c: 34 01 00 00 mvi r1,0
8004510: e3 ff ff 95 bi 8004364 <rtems_rate_monotonic_period+0x4c>
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
8004514: 29 81 00 0c lw r1,(r12+12) <== NOT EXECUTED
8004518: 34 02 40 00 mvi r2,16384 <== NOT EXECUTED
800451c: f8 00 0d 18 calli 800797c <_Thread_Clear_state> <== NOT EXECUTED
8004520: e3 ff ff fa bi 8004508 <rtems_rate_monotonic_period+0x1f0> <== NOT EXECUTED
08004524 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
8004524: 37 9c ff 5c addi sp,sp,-164
8004528: 5b 8b 00 44 sw (sp+68),r11
800452c: 5b 8c 00 40 sw (sp+64),r12
8004530: 5b 8d 00 3c sw (sp+60),r13
8004534: 5b 8e 00 38 sw (sp+56),r14
8004538: 5b 8f 00 34 sw (sp+52),r15
800453c: 5b 90 00 30 sw (sp+48),r16
8004540: 5b 91 00 2c sw (sp+44),r17
8004544: 5b 92 00 28 sw (sp+40),r18
8004548: 5b 93 00 24 sw (sp+36),r19
800454c: 5b 94 00 20 sw (sp+32),r20
8004550: 5b 95 00 1c sw (sp+28),r21
8004554: 5b 96 00 18 sw (sp+24),r22
8004558: 5b 97 00 14 sw (sp+20),r23
800455c: 5b 98 00 10 sw (sp+16),r24
8004560: 5b 99 00 0c sw (sp+12),r25
8004564: 5b 9b 00 08 sw (sp+8),fp
8004568: 5b 9d 00 04 sw (sp+4),ra
800456c: b8 40 68 00 mv r13,r2
8004570: b8 20 78 00 mv r15,r1
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
8004574: 44 40 00 2f be r2,r0,8004630 <rtems_rate_monotonic_report_statistics_with_plugin+0x10c><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
8004578: 78 02 08 01 mvhi r2,0x801
800457c: 38 42 f4 2c ori r2,r2,0xf42c
8004580: d9 a0 00 00 call r13
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
8004584: 78 02 08 01 mvhi r2,0x801
8004588: 38 42 f4 4c ori r2,r2,0xf44c
800458c: b9 e0 08 00 mv r1,r15
8004590: d9 a0 00 00 call r13
(*print)( context, "--- Wall times are in seconds ---\n" );
8004594: 78 02 08 01 mvhi r2,0x801
8004598: 38 42 f4 70 ori r2,r2,0xf470
800459c: b9 e0 08 00 mv r1,r15
80045a0: d9 a0 00 00 call r13
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
80045a4: 78 02 08 01 mvhi r2,0x801
80045a8: 38 42 f4 94 ori r2,r2,0xf494
80045ac: b9 e0 08 00 mv r1,r15
80045b0: d9 a0 00 00 call r13
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
80045b4: 78 02 08 01 mvhi r2,0x801
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80045b8: 78 0c 08 02 mvhi r12,0x802
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
80045bc: b9 e0 08 00 mv r1,r15
80045c0: 38 42 f4 e0 ori r2,r2,0xf4e0
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80045c4: 39 8c 19 00 ori r12,r12,0x1900
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
80045c8: d9 a0 00 00 call r13
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80045cc: 29 81 00 0c lw r1,(r12+12)
80045d0: 29 8b 00 08 lw r11,(r12+8)
80045d4: 55 61 00 17 bgu r11,r1,8004630 <rtems_rate_monotonic_report_statistics_with_plugin+0x10c><== NEVER TAKEN
rtems_object_get_name( the_status.owner, sizeof(name), name );
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
80045d8: 78 12 08 01 mvhi r18,0x801
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
(*print)( context,
80045dc: 78 15 08 01 mvhi r21,0x801
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
80045e0: 78 14 08 01 mvhi r20,0x801
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
80045e4: 78 11 08 01 mvhi r17,0x801
80045e8: 37 90 00 48 addi r16,sp,72
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
80045ec: 37 98 00 80 addi r24,sp,128
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
80045f0: 37 93 00 a0 addi r19,sp,160
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
80045f4: 3a 52 f5 2c ori r18,r18,0xf52c
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
80045f8: 37 97 00 60 addi r23,sp,96
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
80045fc: 37 96 00 98 addi r22,sp,152
(*print)( context,
8004600: 3a b5 f5 44 ori r21,r21,0xf544
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
8004604: 37 9b 00 78 addi fp,sp,120
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
8004608: 3a 94 f5 64 ori r20,r20,0xf564
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
800460c: 3a 31 ea 70 ori r17,r17,0xea70
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
8004610: b9 60 08 00 mv r1,r11
8004614: ba 00 10 00 mv r2,r16
8004618: f8 00 1e 86 calli 800c030 <rtems_rate_monotonic_get_statistics>
800461c: b8 20 70 00 mv r14,r1
if ( status != RTEMS_SUCCESSFUL )
8004620: 44 20 00 17 be r1,r0,800467c <rtems_rate_monotonic_report_statistics_with_plugin+0x158>
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
8004624: 29 85 00 0c lw r5,(r12+12)
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
8004628: 35 6b 00 01 addi r11,r11,1
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
800462c: 50 ab ff f9 bgeu r5,r11,8004610 <rtems_rate_monotonic_report_statistics_with_plugin+0xec>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
8004630: 2b 9d 00 04 lw ra,(sp+4)
8004634: 2b 8b 00 44 lw r11,(sp+68)
8004638: 2b 8c 00 40 lw r12,(sp+64)
800463c: 2b 8d 00 3c lw r13,(sp+60)
8004640: 2b 8e 00 38 lw r14,(sp+56)
8004644: 2b 8f 00 34 lw r15,(sp+52)
8004648: 2b 90 00 30 lw r16,(sp+48)
800464c: 2b 91 00 2c lw r17,(sp+44)
8004650: 2b 92 00 28 lw r18,(sp+40)
8004654: 2b 93 00 24 lw r19,(sp+36)
8004658: 2b 94 00 20 lw r20,(sp+32)
800465c: 2b 95 00 1c lw r21,(sp+28)
8004660: 2b 96 00 18 lw r22,(sp+24)
8004664: 2b 97 00 14 lw r23,(sp+20)
8004668: 2b 98 00 10 lw r24,(sp+16)
800466c: 2b 99 00 0c lw r25,(sp+12)
8004670: 2b 9b 00 08 lw fp,(sp+8)
8004674: 37 9c 00 a4 addi sp,sp,164
8004678: c3 a0 00 00 ret
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
800467c: bb 00 10 00 mv r2,r24
8004680: b9 60 08 00 mv r1,r11
8004684: f8 00 1e ab calli 800c130 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
8004688: 2b 81 00 80 lw r1,(sp+128)
800468c: ba 60 18 00 mv r3,r19
8004690: 34 02 00 05 mvi r2,5
8004694: f8 00 00 ba calli 800497c <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
8004698: 2b 85 00 48 lw r5,(sp+72)
800469c: 2b 86 00 4c lw r6,(sp+76)
80046a0: ba 40 10 00 mv r2,r18
80046a4: b9 60 18 00 mv r3,r11
80046a8: b9 e0 08 00 mv r1,r15
80046ac: ba 60 20 00 mv r4,r19
80046b0: d9 a0 00 00 call r13
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
80046b4: 2b 85 00 48 lw r5,(sp+72)
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
80046b8: ba c0 18 00 mv r3,r22
80046bc: ba e0 08 00 mv r1,r23
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
80046c0: ba 20 10 00 mv r2,r17
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
80046c4: 5c ae 00 04 bne r5,r14,80046d4 <rtems_rate_monotonic_report_statistics_with_plugin+0x1b0>
(*print)( context, "\n" );
80046c8: b9 e0 08 00 mv r1,r15
80046cc: d9 a0 00 00 call r13
continue;
80046d0: e3 ff ff d5 bi 8004624 <rtems_rate_monotonic_report_statistics_with_plugin+0x100>
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
80046d4: b8 a0 10 00 mv r2,r5
80046d8: f8 00 10 dc calli 8008a48 <_Timespec_Divide_by_integer>
(*print)( context,
80046dc: 2b 81 00 54 lw r1,(sp+84)
80046e0: 34 02 03 e8 mvi r2,1000
80046e4: f8 00 63 ca calli 801d60c <__divsi3>
80046e8: b8 20 c8 00 mv r25,r1
80046ec: 2b 81 00 5c lw r1,(sp+92)
80046f0: 34 02 03 e8 mvi r2,1000
80046f4: f8 00 63 c6 calli 801d60c <__divsi3>
80046f8: b8 20 70 00 mv r14,r1
80046fc: 2b 81 00 9c lw r1,(sp+156)
8004700: 34 02 03 e8 mvi r2,1000
8004704: f8 00 63 c2 calli 801d60c <__divsi3>
8004708: 2b 85 00 58 lw r5,(sp+88)
800470c: 2b 87 00 98 lw r7,(sp+152)
8004710: 2b 83 00 50 lw r3,(sp+80)
8004714: b8 20 40 00 mv r8,r1
8004718: bb 20 20 00 mv r4,r25
800471c: b9 c0 30 00 mv r6,r14
8004720: ba a0 10 00 mv r2,r21
8004724: b9 e0 08 00 mv r1,r15
8004728: d9 a0 00 00 call r13
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
800472c: 2b 82 00 48 lw r2,(sp+72)
8004730: ba c0 18 00 mv r3,r22
8004734: bb 60 08 00 mv r1,fp
8004738: f8 00 10 c4 calli 8008a48 <_Timespec_Divide_by_integer>
(*print)( context,
800473c: 2b 81 00 6c lw r1,(sp+108)
8004740: 34 02 03 e8 mvi r2,1000
8004744: f8 00 63 b2 calli 801d60c <__divsi3>
8004748: b8 20 c8 00 mv r25,r1
800474c: 2b 81 00 74 lw r1,(sp+116)
8004750: 34 02 03 e8 mvi r2,1000
8004754: f8 00 63 ae calli 801d60c <__divsi3>
8004758: b8 20 70 00 mv r14,r1
800475c: 2b 81 00 9c lw r1,(sp+156)
8004760: 34 02 03 e8 mvi r2,1000
8004764: f8 00 63 aa calli 801d60c <__divsi3>
8004768: 2b 83 00 68 lw r3,(sp+104)
800476c: 2b 85 00 70 lw r5,(sp+112)
8004770: 2b 87 00 98 lw r7,(sp+152)
8004774: b8 20 40 00 mv r8,r1
8004778: ba 80 10 00 mv r2,r20
800477c: b9 e0 08 00 mv r1,r15
8004780: bb 20 20 00 mv r4,r25
8004784: b9 c0 30 00 mv r6,r14
8004788: d9 a0 00 00 call r13
800478c: e3 ff ff a6 bi 8004624 <rtems_rate_monotonic_report_statistics_with_plugin+0x100>
080047b4 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
80047b4: 37 9c ff f4 addi sp,sp,-12
80047b8: 5b 8b 00 0c sw (sp+12),r11
80047bc: 5b 8c 00 08 sw (sp+8),r12
80047c0: 5b 9d 00 04 sw (sp+4),ra
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80047c4: 78 01 08 02 mvhi r1,0x802
80047c8: 38 21 1a 28 ori r1,r1,0x1a28
80047cc: 28 22 00 00 lw r2,(r1+0)
80047d0: 34 42 00 01 addi r2,r2,1
80047d4: 58 22 00 00 sw (r1+0),r2
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80047d8: 78 0c 08 02 mvhi r12,0x802
80047dc: 39 8c 19 00 ori r12,r12,0x1900
80047e0: 29 8b 00 08 lw r11,(r12+8)
80047e4: 29 81 00 0c lw r1,(r12+12)
80047e8: 55 61 00 06 bgu r11,r1,8004800 <rtems_rate_monotonic_reset_all_statistics+0x4c><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
80047ec: b9 60 08 00 mv r1,r11
80047f0: f8 00 00 0a calli 8004818 <rtems_rate_monotonic_reset_statistics>
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80047f4: 29 81 00 0c lw r1,(r12+12)
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
80047f8: 35 6b 00 01 addi r11,r11,1
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80047fc: 50 2b ff fc bgeu r1,r11,80047ec <rtems_rate_monotonic_reset_all_statistics+0x38>
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
8004800: f8 00 0d 38 calli 8007ce0 <_Thread_Enable_dispatch>
}
8004804: 2b 9d 00 04 lw ra,(sp+4)
8004808: 2b 8b 00 0c lw r11,(sp+12)
800480c: 2b 8c 00 08 lw r12,(sp+8)
8004810: 37 9c 00 0c addi sp,sp,12
8004814: c3 a0 00 00 ret
08002af0 <rtems_semaphore_create>:
uint32_t count,
rtems_attribute attribute_set,
rtems_task_priority priority_ceiling,
rtems_id *id
)
{
8002af0: 37 9c ff c4 addi sp,sp,-60
8002af4: 5b 8b 00 18 sw (sp+24),r11
8002af8: 5b 8c 00 14 sw (sp+20),r12
8002afc: 5b 8d 00 10 sw (sp+16),r13
8002b00: 5b 8e 00 0c sw (sp+12),r14
8002b04: 5b 8f 00 08 sw (sp+8),r15
8002b08: 5b 9d 00 04 sw (sp+4),ra
8002b0c: b8 20 60 00 mv r12,r1
8002b10: b8 40 58 00 mv r11,r2
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
8002b14: 34 01 00 03 mvi r1,3
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
8002b18: 45 80 00 09 be r12,r0,8002b3c <rtems_semaphore_create+0x4c>
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
8002b1c: 34 01 00 09 mvi r1,9
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
8002b20: 44 a0 00 07 be r5,r0,8002b3c <rtems_semaphore_create+0x4c>
* id - semaphore id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_semaphore_create(
8002b24: 20 62 00 c0 andi r2,r3,0xc0
return RTEMS_NOT_DEFINED;
} else
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
8002b28: 44 40 00 45 be r2,r0,8002c3c <rtems_semaphore_create+0x14c>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_binary_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_BINARY_SEMAPHORE);
8002b2c: 20 67 00 30 andi r7,r3,0x30
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
8002b30: 34 06 00 10 mvi r6,16
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
8002b34: 34 01 00 0b mvi r1,11
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
8002b38: 44 e6 00 09 be r7,r6,8002b5c <rtems_semaphore_create+0x6c>
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
8002b3c: 2b 9d 00 04 lw ra,(sp+4)
8002b40: 2b 8b 00 18 lw r11,(sp+24)
8002b44: 2b 8c 00 14 lw r12,(sp+20)
8002b48: 2b 8d 00 10 lw r13,(sp+16)
8002b4c: 2b 8e 00 0c lw r14,(sp+12)
8002b50: 2b 8f 00 08 lw r15,(sp+8)
8002b54: 37 9c 00 3c addi sp,sp,60
8002b58: c3 a0 00 00 ret
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_priority(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_PRIORITY ) ? true : false;
8002b5c: 20 66 00 04 andi r6,r3,0x4
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
8002b60: 44 c0 ff f7 be r6,r0,8002b3c <rtems_semaphore_create+0x4c>
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
8002b64: 34 06 00 c0 mvi r6,192
8002b68: 34 0f 00 10 mvi r15,16
8002b6c: 44 46 ff f4 be r2,r6,8002b3c <rtems_semaphore_create+0x4c>
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
8002b70: 34 02 00 01 mvi r2,1
return RTEMS_INVALID_NUMBER;
8002b74: 34 01 00 0a mvi r1,10
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
8002b78: 55 62 ff f1 bgu r11,r2,8002b3c <rtems_semaphore_create+0x4c>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8002b7c: 78 01 08 01 mvhi r1,0x801
8002b80: 38 21 49 08 ori r1,r1,0x4908
8002b84: 28 22 00 00 lw r2,(r1+0)
8002b88: 34 42 00 01 addi r2,r2,1
8002b8c: 58 22 00 00 sw (r1+0),r2
* This function allocates a semaphore control block from
* the inactive chain of free semaphore control blocks.
*/
RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
{
return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
8002b90: 78 0e 08 01 mvhi r14,0x801
8002b94: 39 ce 48 20 ori r14,r14,0x4820
8002b98: b9 c0 08 00 mv r1,r14
8002b9c: 5b 83 00 24 sw (sp+36),r3
8002ba0: 5b 84 00 20 sw (sp+32),r4
8002ba4: 5b 85 00 1c sw (sp+28),r5
8002ba8: f8 00 06 52 calli 80044f0 <_Objects_Allocate>
8002bac: b8 20 68 00 mv r13,r1
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
8002bb0: 2b 83 00 24 lw r3,(sp+36)
8002bb4: 2b 84 00 20 lw r4,(sp+32)
8002bb8: 2b 85 00 1c lw r5,(sp+28)
8002bbc: 44 20 00 36 be r1,r0,8002c94 <rtems_semaphore_create+0x1a4>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_semaphore->attribute_set = attribute_set;
8002bc0: 58 23 00 10 sw (r1+16),r3
/*
* Initialize it as a counting semaphore.
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
8002bc4: 45 e0 00 21 be r15,r0,8002c48 <rtems_semaphore_create+0x158>
8002bc8: 20 61 00 04 andi r1,r3,0x4
} else {
/*
* It is either simple binary semaphore or a more powerful mutex
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
8002bcc: 44 20 00 2e be r1,r0,8002c84 <rtems_semaphore_create+0x194>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
8002bd0: 34 01 00 01 mvi r1,1
8002bd4: 5b 81 00 30 sw (sp+48),r1
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
8002bd8: 34 01 00 10 mvi r1,16
8002bdc: 45 e1 00 31 be r15,r1,8002ca0 <rtems_semaphore_create+0x1b0>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
the_mutex_attr.only_owner_release = true;
}
}
} else /* must be simple binary semaphore */ {
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
8002be0: 34 01 00 02 mvi r1,2
8002be4: 5b 81 00 28 sw (sp+40),r1
the_mutex_attr.only_owner_release = false;
8002be8: 33 80 00 2c sb (sp+44),r0
}
mutex_status = _CORE_mutex_Initialize(
8002bec: 65 63 00 01 cmpei r3,r11,1
8002bf0: 37 82 00 28 addi r2,sp,40
8002bf4: 35 a1 00 14 addi r1,r13,20
8002bf8: 5b 85 00 1c sw (sp+28),r5
8002bfc: f8 00 03 5d calli 8003970 <_CORE_mutex_Initialize>
&the_semaphore->Core_control.mutex,
&the_mutex_attr,
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
8002c00: 34 02 00 06 mvi r2,6
8002c04: 2b 85 00 1c lw r5,(sp+28)
8002c08: 44 22 00 32 be r1,r2,8002cd0 <rtems_semaphore_create+0x1e0><== NEVER TAKEN
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8002c0c: 29 a2 00 08 lw r2,(r13+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8002c10: 29 c3 00 1c lw r3,(r14+28)
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
8002c14: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8002c18: b4 21 08 00 add r1,r1,r1
8002c1c: b4 21 08 00 add r1,r1,r1
8002c20: b4 61 08 00 add r1,r3,r1
8002c24: 58 2d 00 00 sw (r1+0),r13
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
8002c28: 59 ac 00 0c sw (r13+12),r12
&_Semaphore_Information,
&the_semaphore->Object,
(Objects_Name) name
);
*id = the_semaphore->Object.id;
8002c2c: 58 a2 00 00 sw (r5+0),r2
the_semaphore->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
8002c30: f8 00 0b 91 calli 8005a74 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8002c34: 34 01 00 00 mvi r1,0
8002c38: e3 ff ff c1 bi 8002b3c <rtems_semaphore_create+0x4c>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_counting_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE);
8002c3c: 20 6f 00 30 andi r15,r3,0x30
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
8002c40: 5d e2 ff cc bne r15,r2,8002b70 <rtems_semaphore_create+0x80>
8002c44: e3 ff ff ce bi 8002b7c <rtems_semaphore_create+0x8c>
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
8002c48: 34 01 ff ff mvi r1,-1
8002c4c: 5b 81 00 38 sw (sp+56),r1
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_priority(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_PRIORITY ) ? true : false;
8002c50: 20 63 00 04 andi r3,r3,0x4
if ( _Attributes_Is_priority( attribute_set ) )
8002c54: 44 6f 00 0e be r3,r15,8002c8c <rtems_semaphore_create+0x19c>
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
8002c58: 34 01 00 01 mvi r1,1
8002c5c: 5b 81 00 3c sw (sp+60),r1
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
_CORE_semaphore_Initialize(
8002c60: 35 a1 00 14 addi r1,r13,20
8002c64: 37 82 00 38 addi r2,sp,56
8002c68: b9 60 18 00 mv r3,r11
8002c6c: 5b 85 00 1c sw (sp+28),r5
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
8002c70: 5b 80 00 28 sw (sp+40),r0
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
8002c74: 5b 80 00 34 sw (sp+52),r0
_CORE_semaphore_Initialize(
8002c78: f8 00 04 1e calli 8003cf0 <_CORE_semaphore_Initialize>
8002c7c: 2b 85 00 1c lw r5,(sp+28)
8002c80: e3 ff ff e3 bi 8002c0c <rtems_semaphore_create+0x11c>
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
8002c84: 5b 80 00 30 sw (sp+48),r0
8002c88: e3 ff ff d4 bi 8002bd8 <rtems_semaphore_create+0xe8>
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
else
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
8002c8c: 5b 80 00 3c sw (sp+60),r0
8002c90: e3 ff ff f4 bi 8002c60 <rtems_semaphore_create+0x170>
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
8002c94: f8 00 0b 78 calli 8005a74 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
8002c98: 34 01 00 05 mvi r1,5
8002c9c: e3 ff ff a8 bi 8002b3c <rtems_semaphore_create+0x4c>
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.only_owner_release = false;
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
8002ca0: 2b 81 00 30 lw r1,(sp+48)
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
8002ca4: 5b 84 00 34 sw (sp+52),r4
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
8002ca8: 5b 80 00 28 sw (sp+40),r0
the_mutex_attr.only_owner_release = false;
8002cac: 33 80 00 2c sb (sp+44),r0
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
8002cb0: 34 02 00 01 mvi r2,1
8002cb4: 5c 22 ff ce bne r1,r2,8002bec <rtems_semaphore_create+0xfc>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_inherit_priority(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_INHERIT_PRIORITY ) ? true : false;
8002cb8: 20 62 00 40 andi r2,r3,0x40
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
8002cbc: 44 40 00 0b be r2,r0,8002ce8 <rtems_semaphore_create+0x1f8>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
8002cc0: 34 02 00 02 mvi r2,2
8002cc4: 5b 82 00 30 sw (sp+48),r2
the_mutex_attr.only_owner_release = true;
8002cc8: 33 81 00 2c sb (sp+44),r1
8002ccc: e3 ff ff c8 bi 8002bec <rtems_semaphore_create+0xfc>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
8002cd0: b9 c0 08 00 mv r1,r14
8002cd4: b9 a0 10 00 mv r2,r13
8002cd8: f8 00 07 09 calli 80048fc <_Objects_Free>
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
8002cdc: f8 00 0b 66 calli 8005a74 <_Thread_Enable_dispatch>
return RTEMS_INVALID_PRIORITY;
8002ce0: 34 01 00 13 mvi r1,19
8002ce4: e3 ff ff 96 bi 8002b3c <rtems_semaphore_create+0x4c>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_priority_ceiling(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_PRIORITY_CEILING ) ? true : false;
8002ce8: 20 63 00 80 andi r3,r3,0x80
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
the_mutex_attr.only_owner_release = true;
} else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
8002cec: 44 62 ff c0 be r3,r2,8002bec <rtems_semaphore_create+0xfc>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
8002cf0: 34 02 00 03 mvi r2,3
8002cf4: 5b 82 00 30 sw (sp+48),r2
the_mutex_attr.only_owner_release = true;
8002cf8: 33 81 00 2c sb (sp+44),r1
8002cfc: e3 ff ff bc bi 8002bec <rtems_semaphore_create+0xfc>
08013068 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
8013068: 37 9c ff f4 addi sp,sp,-12
801306c: 5b 8b 00 08 sw (sp+8),r11
8013070: 5b 9d 00 04 sw (sp+4),ra
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
8013074: 34 03 00 0a mvi r3,10
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
8013078: b8 40 58 00 mv r11,r2
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
801307c: 5c 40 00 06 bne r2,r0,8013094 <rtems_signal_send+0x2c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8013080: b8 60 08 00 mv r1,r3
8013084: 2b 9d 00 04 lw ra,(sp+4)
8013088: 2b 8b 00 08 lw r11,(sp+8)
801308c: 37 9c 00 0c addi sp,sp,12
8013090: c3 a0 00 00 ret
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
8013094: 37 82 00 0c addi r2,sp,12
8013098: f8 00 15 eb calli 8018844 <_Thread_Get>
switch ( location ) {
801309c: 2b 83 00 0c lw r3,(sp+12)
80130a0: 44 60 00 07 be r3,r0,80130bc <rtems_signal_send+0x54>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
80130a4: 34 03 00 04 mvi r3,4
}
80130a8: b8 60 08 00 mv r1,r3
80130ac: 2b 9d 00 04 lw ra,(sp+4)
80130b0: 2b 8b 00 08 lw r11,(sp+8)
80130b4: 37 9c 00 0c addi sp,sp,12
80130b8: c3 a0 00 00 ret
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
80130bc: 28 22 01 1c lw r2,(r1+284)
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
80130c0: 28 44 00 0c lw r4,(r2+12)
80130c4: 44 83 00 23 be r4,r3,8013150 <rtems_signal_send+0xe8>
if ( asr->is_enabled ) {
80130c8: 40 43 00 08 lbu r3,(r2+8)
80130cc: 44 60 00 12 be r3,r0,8013114 <rtems_signal_send+0xac>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
80130d0: 90 00 18 00 rcsr r3,IE
80130d4: 34 04 ff fe mvi r4,-2
80130d8: a0 64 20 00 and r4,r3,r4
80130dc: d0 04 00 00 wcsr IE,r4
*signal_set |= signals;
80130e0: 28 44 00 14 lw r4,(r2+20)
80130e4: b8 8b 58 00 or r11,r4,r11
80130e8: 58 4b 00 14 sw (r2+20),r11
_ISR_Enable( _level );
80130ec: d0 03 00 00 wcsr IE,r3
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
80130f0: 78 02 08 04 mvhi r2,0x804
80130f4: 38 42 11 c4 ori r2,r2,0x11c4
80130f8: 28 43 00 08 lw r3,(r2+8)
80130fc: 44 60 00 0e be r3,r0,8013134 <rtems_signal_send+0xcc>
8013100: 28 43 00 0c lw r3,(r2+12)
8013104: 5c 23 00 0c bne r1,r3,8013134 <rtems_signal_send+0xcc> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
8013108: 34 01 00 01 mvi r1,1
801310c: 30 41 00 18 sb (r2+24),r1
8013110: e0 00 00 09 bi 8013134 <rtems_signal_send+0xcc>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
8013114: 90 00 08 00 rcsr r1,IE
8013118: 34 03 ff fe mvi r3,-2
801311c: a0 23 18 00 and r3,r1,r3
8013120: d0 03 00 00 wcsr IE,r3
*signal_set |= signals;
8013124: 28 43 00 18 lw r3,(r2+24)
8013128: b8 6b 58 00 or r11,r3,r11
801312c: 58 4b 00 18 sw (r2+24),r11
_ISR_Enable( _level );
8013130: d0 01 00 00 wcsr IE,r1
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
8013134: f8 00 15 b7 calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8013138: 34 03 00 00 mvi r3,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
801313c: b8 60 08 00 mv r1,r3
8013140: 2b 9d 00 04 lw ra,(sp+4)
8013144: 2b 8b 00 08 lw r11,(sp+8)
8013148: 37 9c 00 0c addi sp,sp,12
801314c: c3 a0 00 00 ret
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
8013150: f8 00 15 b0 calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
8013154: 34 03 00 0b mvi r3,11
8013158: e3 ff ff ca bi 8013080 <rtems_signal_send+0x18>
0800c6fc <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
800c6fc: 37 9c ff dc addi sp,sp,-36
800c700: 5b 8b 00 24 sw (sp+36),r11
800c704: 5b 8c 00 20 sw (sp+32),r12
800c708: 5b 8d 00 1c sw (sp+28),r13
800c70c: 5b 8e 00 18 sw (sp+24),r14
800c710: 5b 8f 00 14 sw (sp+20),r15
800c714: 5b 90 00 10 sw (sp+16),r16
800c718: 5b 91 00 0c sw (sp+12),r17
800c71c: 5b 92 00 08 sw (sp+8),r18
800c720: 5b 9d 00 04 sw (sp+4),ra
800c724: b8 40 70 00 mv r14,r2
800c728: b8 60 88 00 mv r17,r3
800c72c: b8 20 80 00 mv r16,r1
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
800c730: 34 02 00 09 mvi r2,9
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
800c734: 44 60 00 46 be r3,r0,800c84c <rtems_task_mode+0x150>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
800c738: 78 0f 08 01 mvhi r15,0x801
800c73c: 39 ef 4d b4 ori r15,r15,0x4db4
800c740: 29 eb 00 0c lw r11,(r15+12)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
800c744: 41 6d 00 74 lbu r13,(r11+116)
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
800c748: 29 61 00 7c lw r1,(r11+124)
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
800c74c: 29 6c 01 1c lw r12,(r11+284)
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
800c750: 65 ad 00 00 cmpei r13,r13,0
800c754: b5 ad 20 00 add r4,r13,r13
800c758: b4 84 20 00 add r4,r4,r4
800c75c: b4 84 20 00 add r4,r4,r4
800c760: b4 84 20 00 add r4,r4,r4
800c764: b4 84 20 00 add r4,r4,r4
800c768: b4 84 20 00 add r4,r4,r4
800c76c: b4 84 20 00 add r4,r4,r4
800c770: b4 84 68 00 add r13,r4,r4
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
800c774: 5c 20 00 42 bne r1,r0,800c87c <rtems_task_mode+0x180>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
800c778: 41 92 00 08 lbu r18,(r12+8)
old_mode |= _ISR_Get_level();
800c77c: fb ff ea cc calli 80072ac <_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;
800c780: 66 52 00 00 cmpei r18,r18,0
800c784: c8 12 90 00 sub r18,r0,r18
800c788: 22 52 04 00 andi r18,r18,0x400
800c78c: ba 41 08 00 or r1,r18,r1
old_mode |= _ISR_Get_level();
800c790: b8 2d 68 00 or r13,r1,r13
*previous_mode_set = old_mode;
800c794: 5a 2d 00 00 sw (r17+0),r13
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
800c798: 21 c1 01 00 andi r1,r14,0x100
800c79c: 44 20 00 04 be r1,r0,800c7ac <rtems_task_mode+0xb0>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
800c7a0: 22 01 01 00 andi r1,r16,0x100
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
800c7a4: 64 21 00 00 cmpei r1,r1,0
800c7a8: 31 61 00 74 sb (r11+116),r1
if ( mask & RTEMS_TIMESLICE_MASK ) {
800c7ac: 21 c1 02 00 andi r1,r14,0x200
800c7b0: 44 20 00 09 be r1,r0,800c7d4 <rtems_task_mode+0xd8>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_timeslice (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
800c7b4: 22 01 02 00 andi r1,r16,0x200
if ( _Modes_Is_timeslice(mode_set) ) {
800c7b8: 44 20 00 3e be r1,r0,800c8b0 <rtems_task_mode+0x1b4>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
800c7bc: 78 01 08 01 mvhi r1,0x801
800c7c0: 38 21 48 a0 ori r1,r1,0x48a0
800c7c4: 28 22 00 00 lw r2,(r1+0)
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;
800c7c8: 34 01 00 01 mvi r1,1
800c7cc: 59 61 00 7c sw (r11+124),r1
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
800c7d0: 59 62 00 78 sw (r11+120),r2
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
800c7d4: 21 c1 00 01 andi r1,r14,0x1
800c7d8: 44 20 00 04 be r1,r0,800c7e8 <rtems_task_mode+0xec>
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
800c7dc: 22 01 00 01 andi r1,r16,0x1
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
800c7e0: 64 21 00 00 cmpei r1,r1,0
800c7e4: d0 01 00 00 wcsr IE,r1
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
800c7e8: 21 ce 04 00 andi r14,r14,0x400
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
800c7ec: 34 04 00 00 mvi r4,0
if ( mask & RTEMS_ASR_MASK ) {
800c7f0: 45 c0 00 11 be r14,r0,800c834 <rtems_task_mode+0x138>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_asr_disabled (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
800c7f4: 22 10 04 00 andi r16,r16,0x400
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
800c7f8: 41 81 00 08 lbu r1,(r12+8)
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
800c7fc: 66 10 00 00 cmpei r16,r16,0
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 ) {
800c800: 44 30 00 0d be r1,r16,800c834 <rtems_task_mode+0x138>
asr->is_enabled = is_asr_enabled;
800c804: 31 90 00 08 sb (r12+8),r16
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
800c808: 90 00 08 00 rcsr r1,IE
800c80c: 34 02 ff fe mvi r2,-2
800c810: a0 22 10 00 and r2,r1,r2
800c814: d0 02 00 00 wcsr IE,r2
_signals = information->signals_pending;
800c818: 29 83 00 18 lw r3,(r12+24)
information->signals_pending = information->signals_posted;
800c81c: 29 82 00 14 lw r2,(r12+20)
information->signals_posted = _signals;
800c820: 59 83 00 14 sw (r12+20),r3
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
information->signals_pending = information->signals_posted;
800c824: 59 82 00 18 sw (r12+24),r2
information->signals_posted = _signals;
_ISR_Enable( _level );
800c828: d0 01 00 00 wcsr IE,r1
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
800c82c: 29 84 00 14 lw r4,(r12+20)
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
800c830: 7c 84 00 00 cmpnei r4,r4,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
800c834: 78 01 08 01 mvhi r1,0x801
800c838: 38 21 4a 60 ori r1,r1,0x4a60
800c83c: 28 23 00 00 lw r3,(r1+0)
800c840: 34 01 00 03 mvi r1,3
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
800c844: 34 02 00 00 mvi r2,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
800c848: 44 61 00 0f be r3,r1,800c884 <rtems_task_mode+0x188>
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
800c84c: b8 40 08 00 mv r1,r2
800c850: 2b 9d 00 04 lw ra,(sp+4)
800c854: 2b 8b 00 24 lw r11,(sp+36)
800c858: 2b 8c 00 20 lw r12,(sp+32)
800c85c: 2b 8d 00 1c lw r13,(sp+28)
800c860: 2b 8e 00 18 lw r14,(sp+24)
800c864: 2b 8f 00 14 lw r15,(sp+20)
800c868: 2b 90 00 10 lw r16,(sp+16)
800c86c: 2b 91 00 0c lw r17,(sp+12)
800c870: 2b 92 00 08 lw r18,(sp+8)
800c874: 37 9c 00 24 addi sp,sp,36
800c878: c3 a0 00 00 ret
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
800c87c: 39 ad 02 00 ori r13,r13,0x200
800c880: e3 ff ff be bi 800c778 <rtems_task_mode+0x7c>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
800c884: 29 e1 00 0c lw r1,(r15+12)
if ( are_signals_pending ||
800c888: 5c 80 00 05 bne r4,r0,800c89c <rtems_task_mode+0x1a0>
800c88c: 29 e3 00 10 lw r3,(r15+16)
800c890: 44 23 ff ef be r1,r3,800c84c <rtems_task_mode+0x150>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
800c894: 40 21 00 74 lbu r1,(r1+116)
800c898: 44 20 ff ed be r1,r0,800c84c <rtems_task_mode+0x150> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
800c89c: 34 01 00 01 mvi r1,1
800c8a0: 31 e1 00 18 sb (r15+24),r1
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
800c8a4: fb ff e4 06 calli 80058bc <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
800c8a8: 34 02 00 00 mvi r2,0
800c8ac: e3 ff ff e8 bi 800c84c <rtems_task_mode+0x150>
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
800c8b0: 59 60 00 7c sw (r11+124),r0
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
800c8b4: 21 c1 00 01 andi r1,r14,0x1
800c8b8: 44 20 ff cc be r1,r0,800c7e8 <rtems_task_mode+0xec>
800c8bc: e3 ff ff c8 bi 800c7dc <rtems_task_mode+0xe0>
08008c08 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
8008c08: 37 9c ff f0 addi sp,sp,-16
8008c0c: 5b 8b 00 0c sw (sp+12),r11
8008c10: 5b 8c 00 08 sw (sp+8),r12
8008c14: 5b 9d 00 04 sw (sp+4),ra
8008c18: b8 40 58 00 mv r11,r2
8008c1c: b8 60 60 00 mv r12,r3
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
8008c20: 44 40 00 06 be r2,r0,8008c38 <rtems_task_set_priority+0x30>
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 ) );
8008c24: 78 02 08 01 mvhi r2,0x801
8008c28: 38 42 b0 f0 ori r2,r2,0xb0f0
8008c2c: 40 42 00 00 lbu r2,(r2+0)
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
8008c30: 34 04 00 13 mvi r4,19
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
8008c34: 55 62 00 08 bgu r11,r2,8008c54 <rtems_task_set_priority+0x4c>
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
8008c38: 34 04 00 09 mvi r4,9
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
8008c3c: 45 80 00 06 be r12,r0,8008c54 <rtems_task_set_priority+0x4c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
8008c40: 37 82 00 10 addi r2,sp,16
8008c44: f8 00 0b 1a calli 800b8ac <_Thread_Get>
switch ( location ) {
8008c48: 2b 82 00 10 lw r2,(sp+16)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8008c4c: 34 04 00 04 mvi r4,4
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
8008c50: 44 40 00 07 be r2,r0,8008c6c <rtems_task_set_priority+0x64>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8008c54: b8 80 08 00 mv r1,r4
8008c58: 2b 9d 00 04 lw ra,(sp+4)
8008c5c: 2b 8b 00 0c lw r11,(sp+12)
8008c60: 2b 8c 00 08 lw r12,(sp+8)
8008c64: 37 9c 00 10 addi sp,sp,16
8008c68: c3 a0 00 00 ret
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
8008c6c: 28 23 00 14 lw r3,(r1+20)
8008c70: 59 83 00 00 sw (r12+0),r3
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
8008c74: 45 62 00 09 be r11,r2,8008c98 <rtems_task_set_priority+0x90>
the_thread->real_priority = new_priority;
if ( the_thread->resource_count == 0 ||
8008c78: 28 22 00 1c lw r2,(r1+28)
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
the_thread->real_priority = new_priority;
8008c7c: 58 2b 00 18 sw (r1+24),r11
if ( the_thread->resource_count == 0 ||
8008c80: 44 40 00 03 be r2,r0,8008c8c <rtems_task_set_priority+0x84>
8008c84: 28 22 00 14 lw r2,(r1+20)
8008c88: 51 62 00 04 bgeu r11,r2,8008c98 <rtems_task_set_priority+0x90><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
8008c8c: b9 60 10 00 mv r2,r11
8008c90: 34 03 00 00 mvi r3,0
8008c94: f8 00 09 a8 calli 800b334 <_Thread_Change_priority>
}
_Thread_Enable_dispatch();
8008c98: f8 00 0a f8 calli 800b878 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8008c9c: 34 04 00 00 mvi r4,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8008ca0: b8 80 08 00 mv r1,r4
8008ca4: 2b 9d 00 04 lw ra,(sp+4)
8008ca8: 2b 8b 00 0c lw r11,(sp+12)
8008cac: 2b 8c 00 08 lw r12,(sp+8)
8008cb0: 37 9c 00 10 addi sp,sp,16
8008cb4: c3 a0 00 00 ret
08003274 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
8003274: 37 9c ff ec addi sp,sp,-20
8003278: 5b 8b 00 10 sw (sp+16),r11
800327c: 5b 8c 00 0c sw (sp+12),r12
8003280: 5b 8d 00 08 sw (sp+8),r13
8003284: 5b 9d 00 04 sw (sp+4),ra
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
8003288: 34 04 00 09 mvi r4,9
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
800328c: b8 40 58 00 mv r11,r2
8003290: b8 60 68 00 mv r13,r3
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
8003294: 44 40 00 06 be r2,r0,80032ac <rtems_task_start+0x38> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
8003298: 37 82 00 14 addi r2,sp,20
800329c: f8 00 0a 03 calli 8005aa8 <_Thread_Get>
switch ( location ) {
80032a0: 2b 8c 00 14 lw r12,(sp+20)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
80032a4: 34 04 00 04 mvi r4,4
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
80032a8: 45 80 00 08 be r12,r0,80032c8 <rtems_task_start+0x54>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80032ac: b8 80 08 00 mv r1,r4
80032b0: 2b 9d 00 04 lw ra,(sp+4)
80032b4: 2b 8b 00 10 lw r11,(sp+16)
80032b8: 2b 8c 00 0c lw r12,(sp+12)
80032bc: 2b 8d 00 08 lw r13,(sp+8)
80032c0: 37 9c 00 14 addi sp,sp,20
80032c4: c3 a0 00 00 ret
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
80032c8: 34 02 00 00 mvi r2,0
80032cc: b9 60 18 00 mv r3,r11
80032d0: 34 04 00 00 mvi r4,0
80032d4: b9 a0 28 00 mv r5,r13
80032d8: f8 00 0c fb calli 80066c4 <_Thread_Start>
80032dc: 5c 2c 00 0a bne r1,r12,8003304 <rtems_task_start+0x90>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
80032e0: f8 00 09 e5 calli 8005a74 <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
80032e4: 34 04 00 0e mvi r4,14
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80032e8: b8 80 08 00 mv r1,r4
80032ec: 2b 9d 00 04 lw ra,(sp+4)
80032f0: 2b 8b 00 10 lw r11,(sp+16)
80032f4: 2b 8c 00 0c lw r12,(sp+12)
80032f8: 2b 8d 00 08 lw r13,(sp+8)
80032fc: 37 9c 00 14 addi sp,sp,20
8003300: c3 a0 00 00 ret
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
8003304: f8 00 09 dc calli 8005a74 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8003308: 34 04 00 00 mvi r4,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
800330c: b8 80 08 00 mv r1,r4
8003310: 2b 9d 00 04 lw ra,(sp+4)
8003314: 2b 8b 00 10 lw r11,(sp+16)
8003318: 2b 8c 00 0c lw r12,(sp+12)
800331c: 2b 8d 00 08 lw r13,(sp+8)
8003320: 37 9c 00 14 addi sp,sp,20
8003324: c3 a0 00 00 ret
08004144 <rtems_task_variable_add>:
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **ptr,
void (*dtor)(void *)
)
{
8004144: 37 9c ff ec addi sp,sp,-20
8004148: 5b 8b 00 10 sw (sp+16),r11
800414c: 5b 8c 00 0c sw (sp+12),r12
8004150: 5b 8d 00 08 sw (sp+8),r13
8004154: 5b 9d 00 04 sw (sp+4),ra
8004158: b8 40 58 00 mv r11,r2
800415c: b8 60 68 00 mv r13,r3
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
8004160: 34 02 00 09 mvi r2,9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
8004164: 45 60 00 07 be r11,r0,8004180 <rtems_task_variable_add+0x3c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
8004168: 37 82 00 14 addi r2,sp,20
800416c: f8 00 0a 03 calli 8006978 <_Thread_Get>
8004170: b8 20 60 00 mv r12,r1
switch (location) {
8004174: 2b 81 00 14 lw r1,(sp+20)
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8004178: 34 02 00 04 mvi r2,4
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
switch (location) {
800417c: 44 20 00 08 be r1,r0,800419c <rtems_task_variable_add+0x58>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004180: b8 40 08 00 mv r1,r2
8004184: 2b 9d 00 04 lw ra,(sp+4)
8004188: 2b 8b 00 10 lw r11,(sp+16)
800418c: 2b 8c 00 0c lw r12,(sp+12)
8004190: 2b 8d 00 08 lw r13,(sp+8)
8004194: 37 9c 00 14 addi sp,sp,20
8004198: c3 a0 00 00 ret
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
800419c: 29 84 01 28 lw r4,(r12+296)
while (tvp) {
80041a0: 44 81 00 08 be r4,r1,80041c0 <rtems_task_variable_add+0x7c>
if (tvp->ptr == ptr) {
80041a4: 28 81 00 04 lw r1,(r4+4)
80041a8: 5c 2b 00 04 bne r1,r11,80041b8 <rtems_task_variable_add+0x74>
80041ac: e0 00 00 18 bi 800420c <rtems_task_variable_add+0xc8>
80041b0: 28 82 00 04 lw r2,(r4+4)
80041b4: 44 4b 00 16 be r2,r11,800420c <rtems_task_variable_add+0xc8><== NEVER TAKEN
tvp->dtor = dtor;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
80041b8: 28 84 00 00 lw r4,(r4+0)
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
80041bc: 5c 80 ff fd bne r4,r0,80041b0 <rtems_task_variable_add+0x6c>
/*
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
80041c0: 34 01 00 14 mvi r1,20
80041c4: f8 00 0f 4b calli 8007ef0 <_Workspace_Allocate>
if (new == NULL) {
80041c8: 44 20 00 1b be r1,r0,8004234 <rtems_task_variable_add+0xf0>
}
new->gval = *ptr;
new->ptr = ptr;
new->dtor = dtor;
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
80041cc: 29 82 01 28 lw r2,(r12+296)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
80041d0: 29 63 00 00 lw r3,(r11+0)
new->ptr = ptr;
80041d4: 58 2b 00 04 sw (r1+4),r11
new->dtor = dtor;
80041d8: 58 2d 00 10 sw (r1+16),r13
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
80041dc: 58 23 00 08 sw (r1+8),r3
new->ptr = ptr;
new->dtor = dtor;
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
80041e0: 58 22 00 00 sw (r1+0),r2
the_thread->task_variables = new;
80041e4: 59 81 01 28 sw (r12+296),r1
_Thread_Enable_dispatch();
80041e8: f8 00 09 d7 calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80041ec: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80041f0: b8 40 08 00 mv r1,r2
80041f4: 2b 9d 00 04 lw ra,(sp+4)
80041f8: 2b 8b 00 10 lw r11,(sp+16)
80041fc: 2b 8c 00 0c lw r12,(sp+12)
8004200: 2b 8d 00 08 lw r13,(sp+8)
8004204: 37 9c 00 14 addi sp,sp,20
8004208: c3 a0 00 00 ret
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
tvp->dtor = dtor;
800420c: 58 8d 00 10 sw (r4+16),r13
_Thread_Enable_dispatch();
8004210: f8 00 09 cd calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8004214: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004218: b8 40 08 00 mv r1,r2
800421c: 2b 9d 00 04 lw ra,(sp+4)
8004220: 2b 8b 00 10 lw r11,(sp+16)
8004224: 2b 8c 00 0c lw r12,(sp+12)
8004228: 2b 8d 00 08 lw r13,(sp+8)
800422c: 37 9c 00 14 addi sp,sp,20
8004230: c3 a0 00 00 ret
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
8004234: f8 00 09 c4 calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_NO_MEMORY;
8004238: 34 02 00 1a mvi r2,26
800423c: e3 ff ff d1 bi 8004180 <rtems_task_variable_add+0x3c>
08004240 <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
8004240: 37 9c ff f4 addi sp,sp,-12
8004244: 5b 8b 00 08 sw (sp+8),r11
8004248: 5b 9d 00 04 sw (sp+4),ra
800424c: b8 40 58 00 mv r11,r2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
8004250: 34 02 00 09 mvi r2,9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
8004254: 45 60 00 06 be r11,r0,800426c <rtems_task_variable_delete+0x2c>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
8004258: 37 82 00 0c addi r2,sp,12
800425c: f8 00 09 c7 calli 8006978 <_Thread_Get>
switch (location) {
8004260: 2b 82 00 0c lw r2,(sp+12)
8004264: 44 40 00 07 be r2,r0,8004280 <rtems_task_variable_delete+0x40>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8004268: 34 02 00 04 mvi r2,4
}
800426c: b8 40 08 00 mv r1,r2
8004270: 2b 9d 00 04 lw ra,(sp+4)
8004274: 2b 8b 00 08 lw r11,(sp+8)
8004278: 37 9c 00 0c addi sp,sp,12
800427c: c3 a0 00 00 ret
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
8004280: 28 24 01 28 lw r4,(r1+296)
while (tvp) {
8004284: 44 82 00 09 be r4,r2,80042a8 <rtems_task_variable_delete+0x68>
if (tvp->ptr == ptr) {
8004288: 28 82 00 04 lw r2,(r4+4)
800428c: 5c 4b 00 05 bne r2,r11,80042a0 <rtems_task_variable_delete+0x60>
8004290: e0 00 00 18 bi 80042f0 <rtems_task_variable_delete+0xb0>
8004294: 28 62 00 04 lw r2,(r3+4)
8004298: 44 4b 00 0b be r2,r11,80042c4 <rtems_task_variable_delete+0x84>
800429c: b8 60 20 00 mv r4,r3
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
80042a0: 28 83 00 00 lw r3,(r4+0)
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
80042a4: 5c 60 ff fc bne r3,r0,8004294 <rtems_task_variable_delete+0x54><== ALWAYS TAKEN
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
80042a8: f8 00 09 a7 calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
80042ac: 34 02 00 09 mvi r2,9
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80042b0: b8 40 08 00 mv r1,r2
80042b4: 2b 9d 00 04 lw ra,(sp+4)
80042b8: 2b 8b 00 08 lw r11,(sp+8)
80042bc: 37 9c 00 0c addi sp,sp,12
80042c0: c3 a0 00 00 ret
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
80042c4: 28 62 00 00 lw r2,(r3+0)
80042c8: 58 82 00 00 sw (r4+0),r2
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
80042cc: b8 60 10 00 mv r2,r3
80042d0: f8 00 00 39 calli 80043b4 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
80042d4: f8 00 09 9c calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80042d8: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80042dc: b8 40 08 00 mv r1,r2
80042e0: 2b 9d 00 04 lw ra,(sp+4)
80042e4: 2b 8b 00 08 lw r11,(sp+8)
80042e8: 37 9c 00 0c addi sp,sp,12
80042ec: c3 a0 00 00 ret
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
80042f0: 28 82 00 00 lw r2,(r4+0)
80042f4: b8 80 18 00 mv r3,r4
80042f8: 58 22 01 28 sw (r1+296),r2
80042fc: e3 ff ff f4 bi 80042cc <rtems_task_variable_delete+0x8c>
08004300 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
8004300: 37 9c ff f0 addi sp,sp,-16
8004304: 5b 8b 00 0c sw (sp+12),r11
8004308: 5b 8c 00 08 sw (sp+8),r12
800430c: 5b 9d 00 04 sw (sp+4),ra
8004310: b8 40 58 00 mv r11,r2
8004314: b8 60 60 00 mv r12,r3
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
8004318: 34 02 00 09 mvi r2,9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
800431c: 45 60 00 07 be r11,r0,8004338 <rtems_task_variable_get+0x38>
return RTEMS_INVALID_ADDRESS;
if ( !result )
8004320: 44 60 00 06 be r3,r0,8004338 <rtems_task_variable_get+0x38>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
8004324: 37 82 00 10 addi r2,sp,16
8004328: f8 00 09 94 calli 8006978 <_Thread_Get>
switch (location) {
800432c: 2b 82 00 10 lw r2,(sp+16)
8004330: 44 40 00 08 be r2,r0,8004350 <rtems_task_variable_get+0x50>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8004334: 34 02 00 04 mvi r2,4
}
8004338: b8 40 08 00 mv r1,r2
800433c: 2b 9d 00 04 lw ra,(sp+4)
8004340: 2b 8b 00 0c lw r11,(sp+12)
8004344: 2b 8c 00 08 lw r12,(sp+8)
8004348: 37 9c 00 10 addi sp,sp,16
800434c: c3 a0 00 00 ret
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
8004350: 28 21 01 28 lw r1,(r1+296)
while (tvp) {
8004354: 5c 22 00 04 bne r1,r2,8004364 <rtems_task_variable_get+0x64>
8004358: e0 00 00 0f bi 8004394 <rtems_task_variable_get+0x94>
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
800435c: 28 21 00 00 lw r1,(r1+0)
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
8004360: 44 20 00 0d be r1,r0,8004394 <rtems_task_variable_get+0x94><== NEVER TAKEN
if (tvp->ptr == ptr) {
8004364: 28 22 00 04 lw r2,(r1+4)
8004368: 5c 4b ff fd bne r2,r11,800435c <rtems_task_variable_get+0x5c>
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
800436c: 28 21 00 0c lw r1,(r1+12)
8004370: 59 81 00 00 sw (r12+0),r1
_Thread_Enable_dispatch();
8004374: f8 00 09 74 calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8004378: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
800437c: b8 40 08 00 mv r1,r2
8004380: 2b 9d 00 04 lw ra,(sp+4)
8004384: 2b 8b 00 0c lw r11,(sp+12)
8004388: 2b 8c 00 08 lw r12,(sp+8)
800438c: 37 9c 00 10 addi sp,sp,16
8004390: c3 a0 00 00 ret
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
8004394: f8 00 09 6c calli 8006944 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
8004398: 34 02 00 09 mvi r2,9
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
800439c: b8 40 08 00 mv r1,r2
80043a0: 2b 9d 00 04 lw ra,(sp+4)
80043a4: 2b 8b 00 0c lw r11,(sp+12)
80043a8: 2b 8c 00 08 lw r12,(sp+8)
80043ac: 37 9c 00 10 addi sp,sp,16
80043b0: c3 a0 00 00 ret
08013cbc <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
8013cbc: 37 9c ff f8 addi sp,sp,-8
8013cc0: 5b 9d 00 04 sw (sp+4),ra
8013cc4: b8 20 10 00 mv r2,r1
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
8013cc8: 78 01 08 04 mvhi r1,0x804
8013ccc: 38 21 15 f4 ori r1,r1,0x15f4
8013cd0: 37 83 00 08 addi r3,sp,8
8013cd4: f8 00 0e 98 calli 8017734 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8013cd8: 2b 82 00 08 lw r2,(sp+8)
8013cdc: 44 40 00 05 be r2,r0,8013cf0 <rtems_timer_cancel+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8013ce0: 34 01 00 04 mvi r1,4
}
8013ce4: 2b 9d 00 04 lw ra,(sp+4)
8013ce8: 37 9c 00 08 addi sp,sp,8
8013cec: c3 a0 00 00 ret
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
8013cf0: 28 23 00 38 lw r3,(r1+56)
8013cf4: 34 02 00 04 mvi r2,4
8013cf8: 44 62 00 03 be r3,r2,8013d04 <rtems_timer_cancel+0x48> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
8013cfc: 34 21 00 10 addi r1,r1,16
8013d00: f8 00 18 83 calli 8019f0c <_Watchdog_Remove>
_Thread_Enable_dispatch();
8013d04: f8 00 12 c3 calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8013d08: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8013d0c: 2b 9d 00 04 lw ra,(sp+4)
8013d10: 37 9c 00 08 addi sp,sp,8
8013d14: c3 a0 00 00 ret
08013f68 <rtems_timer_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
8013f68: 37 9c ff d8 addi sp,sp,-40
8013f6c: 5b 8b 00 20 sw (sp+32),r11
8013f70: 5b 8c 00 1c sw (sp+28),r12
8013f74: 5b 8d 00 18 sw (sp+24),r13
8013f78: 5b 8e 00 14 sw (sp+20),r14
8013f7c: 5b 8f 00 10 sw (sp+16),r15
8013f80: 5b 90 00 0c sw (sp+12),r16
8013f84: 5b 91 00 08 sw (sp+8),r17
8013f88: 5b 9d 00 04 sw (sp+4),ra
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
8013f8c: 78 05 08 04 mvhi r5,0x804
8013f90: 38 a5 0d 20 ori r5,r5,0xd20
8013f94: 40 a6 00 00 lbu r6,(r5+0)
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
8013f98: b8 20 68 00 mv r13,r1
8013f9c: b8 60 60 00 mv r12,r3
8013fa0: b8 80 70 00 mv r14,r4
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
8013fa4: 34 05 00 0b mvi r5,11
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
8013fa8: 5c c0 00 0c bne r6,r0,8013fd8 <rtems_timer_fire_when+0x70>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8013fac: b8 a0 08 00 mv r1,r5
8013fb0: 2b 9d 00 04 lw ra,(sp+4)
8013fb4: 2b 8b 00 20 lw r11,(sp+32)
8013fb8: 2b 8c 00 1c lw r12,(sp+28)
8013fbc: 2b 8d 00 18 lw r13,(sp+24)
8013fc0: 2b 8e 00 14 lw r14,(sp+20)
8013fc4: 2b 8f 00 10 lw r15,(sp+16)
8013fc8: 2b 90 00 0c lw r16,(sp+12)
8013fcc: 2b 91 00 08 lw r17,(sp+8)
8013fd0: 37 9c 00 28 addi sp,sp,40
8013fd4: c3 a0 00 00 ret
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
8013fd8: b8 40 08 00 mv r1,r2
8013fdc: 5b 82 00 24 sw (sp+36),r2
8013fe0: fb ff f1 9e calli 8010658 <_TOD_Validate>
return RTEMS_INVALID_CLOCK;
8013fe4: 34 05 00 14 mvi r5,20
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
8013fe8: 2b 82 00 24 lw r2,(sp+36)
8013fec: 44 20 ff f0 be r1,r0,8013fac <rtems_timer_fire_when+0x44>
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
8013ff0: 34 05 00 09 mvi r5,9
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
if ( !routine )
8013ff4: 45 80 ff ee be r12,r0,8013fac <rtems_timer_fire_when+0x44>
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
8013ff8: 78 0b 08 04 mvhi r11,0x804
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
8013ffc: b8 40 08 00 mv r1,r2
8014000: fb ff f1 3d calli 80104f4 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
8014004: 39 6b 0d 98 ori r11,r11,0xd98
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
8014008: b8 20 80 00 mv r16,r1
if ( seconds <= _TOD_Seconds_since_epoch() )
801400c: 29 61 00 00 lw r1,(r11+0)
return RTEMS_INVALID_CLOCK;
8014010: 34 05 00 14 mvi r5,20
if ( !routine )
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
8014014: 50 30 ff e6 bgeu r1,r16,8013fac <rtems_timer_fire_when+0x44><== NEVER TAKEN
8014018: 78 01 08 04 mvhi r1,0x804
801401c: 38 21 15 f4 ori r1,r1,0x15f4
8014020: b9 a0 10 00 mv r2,r13
8014024: 37 83 00 28 addi r3,sp,40
8014028: f8 00 0d c3 calli 8017734 <_Objects_Get>
801402c: b8 20 78 00 mv r15,r1
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8014030: 2b 81 00 28 lw r1,(sp+40)
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8014034: 34 05 00 04 mvi r5,4
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8014038: 5c 20 ff dd bne r1,r0,8013fac <rtems_timer_fire_when+0x44> <== NEVER TAKEN
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
801403c: 35 f1 00 10 addi r17,r15,16
8014040: ba 20 08 00 mv r1,r17
8014044: f8 00 17 b2 calli 8019f0c <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
8014048: 29 61 00 00 lw r1,(r11+0)
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;
801404c: 34 03 00 02 mvi r3,2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
8014050: ba 20 10 00 mv r2,r17
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
8014054: ca 01 80 00 sub r16,r16,r1
8014058: 78 01 08 04 mvhi r1,0x804
801405c: 38 21 0d c4 ori r1,r1,0xdc4
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;
8014060: 59 e3 00 38 sw (r15+56),r3
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8014064: 59 e0 00 18 sw (r15+24),r0
the_watchdog->routine = routine;
8014068: 59 ec 00 2c sw (r15+44),r12
the_watchdog->id = id;
801406c: 59 ed 00 30 sw (r15+48),r13
the_watchdog->user_data = user_data;
8014070: 59 ee 00 34 sw (r15+52),r14
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8014074: 59 f0 00 1c sw (r15+28),r16
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
8014078: f8 00 17 3a calli 8019d60 <_Watchdog_Insert>
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
&the_timer->Ticker,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
801407c: f8 00 11 e5 calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8014080: 34 05 00 00 mvi r5,0
8014084: e3 ff ff ca bi 8013fac <rtems_timer_fire_when+0x44>
08014338 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
8014338: 37 9c ff dc addi sp,sp,-36
801433c: 5b 8b 00 20 sw (sp+32),r11
8014340: 5b 8c 00 1c sw (sp+28),r12
8014344: 5b 8d 00 18 sw (sp+24),r13
8014348: 5b 8e 00 14 sw (sp+20),r14
801434c: 5b 8f 00 10 sw (sp+16),r15
8014350: 5b 90 00 0c sw (sp+12),r16
8014354: 5b 91 00 08 sw (sp+8),r17
8014358: 5b 9d 00 04 sw (sp+4),ra
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
801435c: 78 05 08 04 mvhi r5,0x804
8014360: 38 a5 16 34 ori r5,r5,0x1634
8014364: 28 ac 00 00 lw r12,(r5+0)
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
8014368: b8 20 80 00 mv r16,r1
801436c: b8 40 70 00 mv r14,r2
8014370: b8 60 78 00 mv r15,r3
8014374: b8 80 88 00 mv r17,r4
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
8014378: 34 0b 00 0e mvi r11,14
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
801437c: 45 80 00 0c be r12,r0,80143ac <rtems_timer_server_fire_when+0x74>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
8014380: 78 05 08 04 mvhi r5,0x804
8014384: 38 a5 0d 20 ori r5,r5,0xd20
8014388: 40 a5 00 00 lbu r5,(r5+0)
return RTEMS_NOT_DEFINED;
801438c: 34 0b 00 0b mvi r11,11
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
8014390: 44 a0 00 07 be r5,r0,80143ac <rtems_timer_server_fire_when+0x74><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
8014394: 34 0b 00 09 mvi r11,9
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
8014398: 44 60 00 05 be r3,r0,80143ac <rtems_timer_server_fire_when+0x74>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
801439c: b8 40 08 00 mv r1,r2
80143a0: fb ff f0 ae calli 8010658 <_TOD_Validate>
return RTEMS_INVALID_CLOCK;
80143a4: 34 0b 00 14 mvi r11,20
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
80143a8: 5c 20 00 0c bne r1,r0,80143d8 <rtems_timer_server_fire_when+0xa0>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80143ac: b9 60 08 00 mv r1,r11
80143b0: 2b 9d 00 04 lw ra,(sp+4)
80143b4: 2b 8b 00 20 lw r11,(sp+32)
80143b8: 2b 8c 00 1c lw r12,(sp+28)
80143bc: 2b 8d 00 18 lw r13,(sp+24)
80143c0: 2b 8e 00 14 lw r14,(sp+20)
80143c4: 2b 8f 00 10 lw r15,(sp+16)
80143c8: 2b 90 00 0c lw r16,(sp+12)
80143cc: 2b 91 00 08 lw r17,(sp+8)
80143d0: 37 9c 00 24 addi sp,sp,36
80143d4: c3 a0 00 00 ret
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
80143d8: b9 c0 08 00 mv r1,r14
if ( seconds <= _TOD_Seconds_since_epoch() )
80143dc: 78 0d 08 04 mvhi r13,0x804
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
80143e0: fb ff f0 45 calli 80104f4 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
80143e4: 39 ad 0d 98 ori r13,r13,0xd98
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
80143e8: b8 20 70 00 mv r14,r1
if ( seconds <= _TOD_Seconds_since_epoch() )
80143ec: 29 a1 00 00 lw r1,(r13+0)
80143f0: 50 2e ff ef bgeu r1,r14,80143ac <rtems_timer_server_fire_when+0x74>
80143f4: 78 01 08 04 mvhi r1,0x804
80143f8: 38 21 15 f4 ori r1,r1,0x15f4
80143fc: ba 00 10 00 mv r2,r16
8014400: 37 83 00 24 addi r3,sp,36
8014404: f8 00 0c cc calli 8017734 <_Objects_Get>
8014408: b8 20 58 00 mv r11,r1
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
801440c: 2b 81 00 24 lw r1,(sp+36)
8014410: 44 20 00 03 be r1,r0,801441c <rtems_timer_server_fire_when+0xe4>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8014414: 34 0b 00 04 mvi r11,4
8014418: e3 ff ff e5 bi 80143ac <rtems_timer_server_fire_when+0x74>
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
801441c: 35 61 00 10 addi r1,r11,16
8014420: f8 00 16 bb calli 8019f0c <_Watchdog_Remove>
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();
8014424: 29 a1 00 00 lw r1,(r13+0)
(*timer_server->schedule_operation)( timer_server, the_timer );
8014428: 29 83 00 04 lw r3,(r12+4)
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;
801442c: 34 04 00 03 mvi r4,3
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
8014430: c9 c1 70 00 sub r14,r14,r1
(*timer_server->schedule_operation)( timer_server, the_timer );
8014434: b9 60 10 00 mv r2,r11
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;
8014438: 59 64 00 38 sw (r11+56),r4
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
801443c: 59 6f 00 2c sw (r11+44),r15
the_watchdog->id = id;
8014440: 59 70 00 30 sw (r11+48),r16
the_watchdog->user_data = user_data;
8014444: 59 71 00 34 sw (r11+52),r17
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
8014448: 59 6e 00 1c sw (r11+28),r14
(*timer_server->schedule_operation)( timer_server, the_timer );
801444c: b9 80 08 00 mv r1,r12
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8014450: 59 60 00 18 sw (r11+24),r0
8014454: d8 60 00 00 call r3
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
8014458: 34 0b 00 00 mvi r11,0
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
(*timer_server->schedule_operation)( timer_server, the_timer );
_Thread_Enable_dispatch();
801445c: f8 00 10 ed calli 8018810 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8014460: e3 ff ff d3 bi 80143ac <rtems_timer_server_fire_when+0x74>
08003d48 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
8003d48: 37 9c ff fc addi sp,sp,-4
8003d4c: 5b 9d 00 04 sw (sp+4),ra
switch ( policy ) {
8003d50: 48 01 00 05 bg r0,r1,8003d64 <sched_get_priority_max+0x1c>
8003d54: 34 02 00 02 mvi r2,2
8003d58: 4c 41 00 08 bge r2,r1,8003d78 <sched_get_priority_max+0x30>
8003d5c: 34 02 00 04 mvi r2,4
8003d60: 44 22 00 06 be r1,r2,8003d78 <sched_get_priority_max+0x30> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8003d64: f8 00 27 af calli 800dc20 <__errno>
8003d68: 34 02 00 16 mvi r2,22
8003d6c: 58 22 00 00 sw (r1+0),r2
8003d70: 34 01 ff ff mvi r1,-1
8003d74: e0 00 00 05 bi 8003d88 <sched_get_priority_max+0x40>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
8003d78: 78 01 08 02 mvhi r1,0x802
8003d7c: 38 21 01 14 ori r1,r1,0x114
8003d80: 40 21 00 00 lbu r1,(r1+0)
8003d84: 34 21 ff ff addi r1,r1,-1
}
8003d88: 2b 9d 00 04 lw ra,(sp+4)
8003d8c: 37 9c 00 04 addi sp,sp,4
8003d90: c3 a0 00 00 ret
08003d94 <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
8003d94: 37 9c ff fc addi sp,sp,-4
8003d98: 5b 9d 00 04 sw (sp+4),ra
switch ( policy ) {
8003d9c: 48 01 00 05 bg r0,r1,8003db0 <sched_get_priority_min+0x1c>
8003da0: 34 02 00 02 mvi r2,2
8003da4: 4c 41 00 08 bge r2,r1,8003dc4 <sched_get_priority_min+0x30><== ALWAYS TAKEN
8003da8: 34 02 00 04 mvi r2,4 <== NOT EXECUTED
8003dac: 44 22 00 06 be r1,r2,8003dc4 <sched_get_priority_min+0x30> <== NOT EXECUTED
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8003db0: f8 00 27 9c calli 800dc20 <__errno>
8003db4: 34 02 00 16 mvi r2,22
8003db8: 58 22 00 00 sw (r1+0),r2
8003dbc: 34 01 ff ff mvi r1,-1
8003dc0: e0 00 00 02 bi 8003dc8 <sched_get_priority_min+0x34>
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
8003dc4: 34 01 00 01 mvi r1,1
}
8003dc8: 2b 9d 00 04 lw ra,(sp+4)
8003dcc: 37 9c 00 04 addi sp,sp,4
8003dd0: c3 a0 00 00 ret
08003dd4 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
8003dd4: 37 9c ff f4 addi sp,sp,-12
8003dd8: 5b 8b 00 08 sw (sp+8),r11
8003ddc: 5b 9d 00 04 sw (sp+4),ra
8003de0: b8 20 58 00 mv r11,r1
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
8003de4: 5c 20 00 0b bne r1,r0,8003e10 <sched_rr_get_interval+0x3c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
8003de8: 44 40 00 13 be r2,r0,8003e34 <sched_rr_get_interval+0x60>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
8003dec: 78 01 08 02 mvhi r1,0x802
8003df0: 38 21 08 60 ori r1,r1,0x860
8003df4: 28 21 00 00 lw r1,(r1+0)
8003df8: f8 00 0e ae calli 80078b0 <_Timespec_From_ticks>
return 0;
8003dfc: 34 01 00 00 mvi r1,0
}
8003e00: 2b 9d 00 04 lw ra,(sp+4)
8003e04: 2b 8b 00 08 lw r11,(sp+8)
8003e08: 37 9c 00 0c addi sp,sp,12
8003e0c: c3 a0 00 00 ret
{
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
8003e10: 5b 82 00 0c sw (sp+12),r2
8003e14: fb ff f8 16 calli 8001e6c <getpid>
8003e18: 2b 82 00 0c lw r2,(sp+12)
8003e1c: 44 2b ff f3 be r1,r11,8003de8 <sched_rr_get_interval+0x14>
rtems_set_errno_and_return_minus_one( ESRCH );
8003e20: f8 00 27 80 calli 800dc20 <__errno>
8003e24: 34 02 00 03 mvi r2,3
8003e28: 58 22 00 00 sw (r1+0),r2
8003e2c: 34 01 ff ff mvi r1,-1
8003e30: e3 ff ff f4 bi 8003e00 <sched_rr_get_interval+0x2c>
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
8003e34: f8 00 27 7b calli 800dc20 <__errno>
8003e38: 34 02 00 16 mvi r2,22
8003e3c: 58 22 00 00 sw (r1+0),r2
8003e40: 34 01 ff ff mvi r1,-1
8003e44: e3 ff ff ef bi 8003e00 <sched_rr_get_interval+0x2c>
080061bc <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
80061bc: 37 9c ff c0 addi sp,sp,-64
80061c0: 5b 8b 00 18 sw (sp+24),r11
80061c4: 5b 8c 00 14 sw (sp+20),r12
80061c8: 5b 8d 00 10 sw (sp+16),r13
80061cc: 5b 8e 00 0c sw (sp+12),r14
80061d0: 5b 8f 00 08 sw (sp+8),r15
80061d4: 5b 9d 00 04 sw (sp+4),ra
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80061d8: 78 09 08 02 mvhi r9,0x802
80061dc: 39 29 4a c0 ori r9,r9,0x4ac0
80061e0: 29 2a 00 00 lw r10,(r9+0)
80061e4: b8 20 70 00 mv r14,r1
80061e8: 5b 82 00 28 sw (sp+40),r2
80061ec: 35 41 00 01 addi r1,r10,1
80061f0: 5b 83 00 2c sw (sp+44),r3
80061f4: 5b 84 00 30 sw (sp+48),r4
80061f8: 5b 85 00 34 sw (sp+52),r5
80061fc: 5b 86 00 38 sw (sp+56),r6
8006200: 5b 87 00 3c sw (sp+60),r7
8006204: 5b 88 00 40 sw (sp+64),r8
8006208: b8 40 60 00 mv r12,r2
800620c: 59 21 00 00 sw (r9+0),r1
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8006210: 20 4d 02 00 andi r13,r2,0x200
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
8006214: 34 0f 00 00 mvi r15,0
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8006218: 5d a0 00 2d bne r13,r0,80062cc <sem_open+0x110>
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 );
800621c: b9 c0 08 00 mv r1,r14
8006220: 37 82 00 24 addi r2,sp,36
8006224: f8 00 1c 3a calli 800d30c <_POSIX_Semaphore_Name_to_id>
8006228: b8 20 58 00 mv r11,r1
* 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 ) {
800622c: 44 20 00 10 be r1,r0,800626c <sem_open+0xb0>
/*
* 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) ) ) {
8006230: 34 01 00 02 mvi r1,2
8006234: 5d 61 00 02 bne r11,r1,800623c <sem_open+0x80> <== NEVER TAKEN
8006238: 5d a0 00 27 bne r13,r0,80062d4 <sem_open+0x118>
_Thread_Enable_dispatch();
800623c: f8 00 0b 74 calli 800900c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
8006240: f8 00 2b ac calli 80110f0 <__errno>
8006244: 58 2b 00 00 sw (r1+0),r11
8006248: 34 01 ff ff mvi r1,-1
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
800624c: 2b 9d 00 04 lw ra,(sp+4)
8006250: 2b 8b 00 18 lw r11,(sp+24)
8006254: 2b 8c 00 14 lw r12,(sp+20)
8006258: 2b 8d 00 10 lw r13,(sp+16)
800625c: 2b 8e 00 0c lw r14,(sp+12)
8006260: 2b 8f 00 08 lw r15,(sp+8)
8006264: 37 9c 00 40 addi sp,sp,64
8006268: c3 a0 00 00 ret
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
800626c: 21 8c 0a 00 andi r12,r12,0xa00
8006270: 34 01 0a 00 mvi r1,2560
8006274: 45 81 00 22 be r12,r1,80062fc <sem_open+0x140>
8006278: 2b 82 00 24 lw r2,(sp+36)
800627c: 78 01 08 02 mvhi r1,0x802
8006280: 37 83 00 1c addi r3,sp,28
8006284: 38 21 4c f4 ori r1,r1,0x4cf4
8006288: f8 00 07 98 calli 80080e8 <_Objects_Get>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
the_semaphore->open_count += 1;
800628c: 28 22 00 18 lw r2,(r1+24)
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 );
8006290: 5b 81 00 20 sw (sp+32),r1
the_semaphore->open_count += 1;
8006294: 34 42 00 01 addi r2,r2,1
8006298: 58 22 00 18 sw (r1+24),r2
_Thread_Enable_dispatch();
800629c: f8 00 0b 5c calli 800900c <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
80062a0: f8 00 0b 5b calli 800900c <_Thread_Enable_dispatch>
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;
80062a4: 2b 81 00 20 lw r1,(sp+32)
80062a8: 34 21 00 08 addi r1,r1,8
#endif
return id;
}
80062ac: 2b 9d 00 04 lw ra,(sp+4)
80062b0: 2b 8b 00 18 lw r11,(sp+24)
80062b4: 2b 8c 00 14 lw r12,(sp+20)
80062b8: 2b 8d 00 10 lw r13,(sp+16)
80062bc: 2b 8e 00 0c lw r14,(sp+12)
80062c0: 2b 8f 00 08 lw r15,(sp+8)
80062c4: 37 9c 00 40 addi sp,sp,64
80062c8: c3 a0 00 00 ret
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
80062cc: 2b 8f 00 30 lw r15,(sp+48)
80062d0: e3 ff ff d3 bi 800621c <sem_open+0x60>
/*
* 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(
80062d4: 34 02 00 00 mvi r2,0
80062d8: b9 e0 18 00 mv r3,r15
80062dc: 37 84 00 20 addi r4,sp,32
80062e0: b9 c0 08 00 mv r1,r14
80062e4: f8 00 1b 9c calli 800d154 <_POSIX_Semaphore_Create_support>
80062e8: b8 20 58 00 mv r11,r1
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
80062ec: f8 00 0b 48 calli 800900c <_Thread_Enable_dispatch>
if ( status == -1 )
return SEM_FAILED;
80062f0: 34 01 ff ff mvi r1,-1
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
if ( status == -1 )
80062f4: 5d 61 ff ec bne r11,r1,80062a4 <sem_open+0xe8>
80062f8: e3 ff ff ed bi 80062ac <sem_open+0xf0>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
80062fc: f8 00 0b 44 calli 800900c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
8006300: f8 00 2b 7c calli 80110f0 <__errno>
8006304: 34 02 00 11 mvi r2,17
8006308: 58 22 00 00 sw (r1+0),r2
800630c: 34 01 ff ff mvi r1,-1
8006310: e3 ff ff e7 bi 80062ac <sem_open+0xf0>
08006378 <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
8006378: 37 9c ff f4 addi sp,sp,-12
800637c: 5b 8b 00 08 sw (sp+8),r11
8006380: 5b 9d 00 04 sw (sp+4),ra
8006384: b8 20 58 00 mv r11,r1
*
* 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 );
8006388: b8 40 08 00 mv r1,r2
800638c: 37 82 00 0c addi r2,sp,12
8006390: f8 00 18 31 calli 800c454 <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
8006394: 34 02 00 03 mvi r2,3
8006398: 44 22 00 09 be r1,r2,80063bc <sem_timedwait+0x44> <== ALWAYS TAKEN
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
800639c: 2b 83 00 0c lw r3,(sp+12) <== NOT EXECUTED
80063a0: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80063a4: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
80063a8: f8 00 1b ff calli 800d3a4 <_POSIX_Semaphore_Wait_support> <== NOT EXECUTED
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
80063ac: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80063b0: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80063b4: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
80063b8: c3 a0 00 00 ret <== NOT EXECUTED
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
80063bc: 2b 83 00 0c lw r3,(sp+12)
80063c0: b9 60 08 00 mv r1,r11
80063c4: 34 02 00 01 mvi r2,1
80063c8: f8 00 1b f7 calli 800d3a4 <_POSIX_Semaphore_Wait_support>
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
80063cc: 2b 9d 00 04 lw ra,(sp+4)
80063d0: 2b 8b 00 08 lw r11,(sp+8)
80063d4: 37 9c 00 0c addi sp,sp,12
80063d8: c3 a0 00 00 ret
08003c94 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
8003c94: 37 9c ff f0 addi sp,sp,-16
8003c98: 5b 8b 00 10 sw (sp+16),r11
8003c9c: 5b 8c 00 0c sw (sp+12),r12
8003ca0: 5b 8d 00 08 sw (sp+8),r13
8003ca4: 5b 9d 00 04 sw (sp+4),ra
8003ca8: b8 20 58 00 mv r11,r1
8003cac: b8 40 60 00 mv r12,r2
ISR_Level level;
if ( oact )
8003cb0: 44 60 00 0e be r3,r0,8003ce8 <sigaction+0x54>
*oact = _POSIX_signals_Vectors[ sig ];
8003cb4: b4 21 08 00 add r1,r1,r1
8003cb8: b4 2b 08 00 add r1,r1,r11
8003cbc: 78 02 08 02 mvhi r2,0x802
8003cc0: b4 21 08 00 add r1,r1,r1
8003cc4: 38 42 1e 10 ori r2,r2,0x1e10
8003cc8: b4 21 08 00 add r1,r1,r1
8003ccc: b4 41 08 00 add r1,r2,r1
8003cd0: 28 22 00 00 lw r2,(r1+0)
8003cd4: 58 62 00 00 sw (r3+0),r2
8003cd8: 28 22 00 04 lw r2,(r1+4)
8003cdc: 58 62 00 04 sw (r3+4),r2
8003ce0: 28 21 00 08 lw r1,(r1+8)
8003ce4: 58 61 00 08 sw (r3+8),r1
if ( !sig )
8003ce8: 45 60 00 04 be r11,r0,8003cf8 <sigaction+0x64>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8003cec: 35 61 ff ff addi r1,r11,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
8003cf0: 34 02 00 1f mvi r2,31
8003cf4: 50 41 00 06 bgeu r2,r1,8003d0c <sigaction+0x78>
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
rtems_set_errno_and_return_minus_one( EINVAL );
8003cf8: f8 00 29 3e calli 800e1f0 <__errno>
8003cfc: 34 02 00 16 mvi r2,22
8003d00: 58 22 00 00 sw (r1+0),r2
8003d04: 34 01 ff ff mvi r1,-1
8003d08: e0 00 00 1c bi 8003d78 <sigaction+0xe4>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
8003d0c: 34 01 00 09 mvi r1,9
8003d10: 45 61 ff fa be r11,r1,8003cf8 <sigaction+0x64>
* 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;
8003d14: 34 01 00 00 mvi r1,0
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
8003d18: 45 80 00 18 be r12,r0,8003d78 <sigaction+0xe4> <== 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 );
8003d1c: 90 00 68 00 rcsr r13,IE
8003d20: 34 01 ff fe mvi r1,-2
8003d24: a1 a1 08 00 and r1,r13,r1
8003d28: d0 01 00 00 wcsr IE,r1
if ( act->sa_handler == SIG_DFL ) {
8003d2c: 29 81 00 08 lw r1,(r12+8)
8003d30: 44 20 00 18 be r1,r0,8003d90 <sigaction+0xfc>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
8003d34: b9 60 08 00 mv r1,r11
8003d38: f8 00 19 ae calli 800a3f0 <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
8003d3c: b5 6b 08 00 add r1,r11,r11
8003d40: b4 2b 58 00 add r11,r1,r11
8003d44: 29 82 00 00 lw r2,(r12+0)
8003d48: 78 01 08 02 mvhi r1,0x802
8003d4c: b5 6b 58 00 add r11,r11,r11
8003d50: 38 21 1e 10 ori r1,r1,0x1e10
8003d54: b5 6b 58 00 add r11,r11,r11
8003d58: b4 2b 58 00 add r11,r1,r11
8003d5c: 59 62 00 00 sw (r11+0),r2
8003d60: 29 81 00 04 lw r1,(r12+4)
8003d64: 59 61 00 04 sw (r11+4),r1
8003d68: 29 81 00 08 lw r1,(r12+8)
8003d6c: 59 61 00 08 sw (r11+8),r1
}
_ISR_Enable( level );
8003d70: d0 0d 00 00 wcsr IE,r13
* 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;
8003d74: 34 01 00 00 mvi r1,0
}
8003d78: 2b 9d 00 04 lw ra,(sp+4)
8003d7c: 2b 8b 00 10 lw r11,(sp+16)
8003d80: 2b 8c 00 0c lw r12,(sp+12)
8003d84: 2b 8d 00 08 lw r13,(sp+8)
8003d88: 37 9c 00 10 addi sp,sp,16
8003d8c: c3 a0 00 00 ret
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
8003d90: b5 6b 08 00 add r1,r11,r11
8003d94: b4 2b 58 00 add r11,r1,r11
8003d98: b5 6b 58 00 add r11,r11,r11
8003d9c: 78 02 08 01 mvhi r2,0x801
8003da0: b5 6b 58 00 add r11,r11,r11
8003da4: 38 42 f7 18 ori r2,r2,0xf718
8003da8: b4 4b 10 00 add r2,r2,r11
8003dac: 28 44 00 00 lw r4,(r2+0)
8003db0: 28 43 00 04 lw r3,(r2+4)
8003db4: 78 01 08 02 mvhi r1,0x802
8003db8: 28 42 00 08 lw r2,(r2+8)
8003dbc: 38 21 1e 10 ori r1,r1,0x1e10
8003dc0: b4 2b 58 00 add r11,r1,r11
8003dc4: 59 64 00 00 sw (r11+0),r4
8003dc8: 59 63 00 04 sw (r11+4),r3
8003dcc: 59 62 00 08 sw (r11+8),r2
8003dd0: e3 ff ff e8 bi 8003d70 <sigaction+0xdc>
0800423c <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
800423c: 37 9c ff d8 addi sp,sp,-40
8004240: 5b 8b 00 1c sw (sp+28),r11
8004244: 5b 8c 00 18 sw (sp+24),r12
8004248: 5b 8d 00 14 sw (sp+20),r13
800424c: 5b 8e 00 10 sw (sp+16),r14
8004250: 5b 8f 00 0c sw (sp+12),r15
8004254: 5b 90 00 08 sw (sp+8),r16
8004258: 5b 9d 00 04 sw (sp+4),ra
800425c: b8 20 68 00 mv r13,r1
8004260: b8 40 58 00 mv r11,r2
8004264: b8 60 60 00 mv r12,r3
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
8004268: 44 20 00 70 be r1,r0,8004428 <sigtimedwait+0x1ec>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
800426c: 44 60 00 5c be r3,r0,80043dc <sigtimedwait+0x1a0>
if ( !_Timespec_Is_valid( timeout ) )
8004270: b8 60 08 00 mv r1,r3
8004274: f8 00 0f 0f calli 8007eb0 <_Timespec_Is_valid>
8004278: 44 20 00 6c be r1,r0,8004428 <sigtimedwait+0x1ec>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
800427c: b9 80 08 00 mv r1,r12
8004280: f8 00 0f 2e calli 8007f38 <_Timespec_To_ticks>
if ( !interval )
8004284: 44 20 00 69 be r1,r0,8004428 <sigtimedwait+0x1ec> <== NEVER TAKEN
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
8004288: 45 60 00 57 be r11,r0,80043e4 <sigtimedwait+0x1a8> <== NEVER TAKEN
the_thread = _Thread_Executing;
800428c: 78 0c 08 02 mvhi r12,0x802
8004290: 39 8c 1d c4 ori r12,r12,0x1dc4
8004294: 29 83 00 0c lw r3,(r12+12)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8004298: 28 6f 01 20 lw r15,(r3+288)
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
800429c: 90 00 80 00 rcsr r16,IE
80042a0: 34 02 ff fe mvi r2,-2
80042a4: a2 02 10 00 and r2,r16,r2
80042a8: d0 02 00 00 wcsr IE,r2
if ( *set & api->signals_pending ) {
80042ac: 29 a5 00 00 lw r5,(r13+0)
80042b0: 29 e4 00 d4 lw r4,(r15+212)
80042b4: a0 a4 10 00 and r2,r5,r4
80042b8: 5c 40 00 4d bne r2,r0,80043ec <sigtimedwait+0x1b0>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
80042bc: 78 04 08 02 mvhi r4,0x802
80042c0: 38 84 20 04 ori r4,r4,0x2004
80042c4: 28 84 00 00 lw r4,(r4+0)
80042c8: a0 a4 28 00 and r5,r5,r4
80042cc: 5c a2 00 35 bne r5,r2,80043a0 <sigtimedwait+0x164>
80042d0: 78 02 08 02 mvhi r2,0x802
80042d4: 38 42 19 18 ori r2,r2,0x1918
80042d8: 28 44 00 00 lw r4,(r2+0)
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
80042dc: 34 05 ff ff mvi r5,-1
80042e0: 59 65 00 00 sw (r11+0),r5
80042e4: 34 84 00 01 addi r4,r4,1
80042e8: 58 44 00 00 sw (r2+0),r4
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
80042ec: 34 02 00 04 mvi r2,4
80042f0: 58 62 00 34 sw (r3+52),r2
the_thread->Wait.option = *set;
80042f4: 29 a4 00 00 lw r4,(r13+0)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
80042f8: 78 02 08 02 mvhi r2,0x802
80042fc: 38 42 1f 9c ori r2,r2,0x1f9c
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
8004300: 58 64 00 30 sw (r3+48),r4
the_thread->Wait.return_argument = the_info;
8004304: 58 6b 00 28 sw (r3+40),r11
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
8004308: 58 62 00 44 sw (r3+68),r2
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;
800430c: 34 03 00 01 mvi r3,1
8004310: 58 43 00 30 sw (r2+48),r3
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 );
8004314: d0 10 00 00 wcsr IE,r16
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
8004318: 78 03 08 00 mvhi r3,0x800
800431c: b8 20 10 00 mv r2,r1
8004320: 78 01 08 02 mvhi r1,0x802
8004324: 38 63 7b 2c ori r3,r3,0x7b2c
8004328: 38 21 1f 9c ori r1,r1,0x1f9c
800432c: f8 00 0c f3 calli 80076f8 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
8004330: f8 00 0b 76 calli 8007108 <_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 );
8004334: 29 62 00 00 lw r2,(r11+0)
8004338: b9 e0 08 00 mv r1,r15
800433c: b9 60 18 00 mv r3,r11
8004340: 34 04 00 00 mvi r4,0
8004344: 34 05 00 00 mvi r5,0
8004348: f8 00 1a d4 calli 800ae98 <_POSIX_signals_Clear_signals>
/* Set errno only if return code is not EINTR or
* if EINTR was caused by a signal being caught, which
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
800434c: 29 81 00 0c lw r1,(r12+12)
8004350: 28 22 00 34 lw r2,(r1+52)
8004354: 34 01 00 04 mvi r1,4
8004358: 5c 41 00 39 bne r2,r1,800443c <sigtimedwait+0x200>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
800435c: 29 6e 00 00 lw r14,(r11+0)
8004360: 34 01 00 01 mvi r1,1
8004364: 35 c2 ff ff addi r2,r14,-1
8004368: f8 00 68 09 calli 801e38c <__ashlsi3>
800436c: 29 a2 00 00 lw r2,(r13+0)
8004370: a0 22 08 00 and r1,r1,r2
8004374: 44 20 00 32 be r1,r0,800443c <sigtimedwait+0x200> <== NEVER TAKEN
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
8004378: b9 c0 08 00 mv r1,r14
800437c: 2b 9d 00 04 lw ra,(sp+4)
8004380: 2b 8b 00 1c lw r11,(sp+28)
8004384: 2b 8c 00 18 lw r12,(sp+24)
8004388: 2b 8d 00 14 lw r13,(sp+20)
800438c: 2b 8e 00 10 lw r14,(sp+16)
8004390: 2b 8f 00 0c lw r15,(sp+12)
8004394: 2b 90 00 08 lw r16,(sp+8)
8004398: 37 9c 00 28 addi sp,sp,40
800439c: c3 a0 00 00 ret
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
80043a0: b8 80 08 00 mv r1,r4
80043a4: fb ff ff 86 calli 80041bc <_POSIX_signals_Get_lowest>
80043a8: b8 20 70 00 mv r14,r1
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
80043ac: b9 c0 10 00 mv r2,r14
80043b0: b9 e0 08 00 mv r1,r15
80043b4: b9 60 18 00 mv r3,r11
80043b8: 34 04 00 01 mvi r4,1
80043bc: 34 05 00 00 mvi r5,0
80043c0: f8 00 1a b6 calli 800ae98 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
80043c4: d0 10 00 00 wcsr IE,r16
the_info->si_signo = signo;
the_info->si_code = SI_USER;
80043c8: 34 01 00 01 mvi r1,1
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;
80043cc: 59 6e 00 00 sw (r11+0),r14
the_info->si_code = SI_USER;
80043d0: 59 61 00 04 sw (r11+4),r1
the_info->si_value.sival_int = 0;
80043d4: 59 60 00 08 sw (r11+8),r0
return signo;
80043d8: e3 ff ff e8 bi 8004378 <sigtimedwait+0x13c>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
80043dc: 34 01 00 00 mvi r1,0
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
80043e0: 5d 60 ff ab bne r11,r0,800428c <sigtimedwait+0x50>
80043e4: 37 8b 00 20 addi r11,sp,32
80043e8: e3 ff ff a9 bi 800428c <sigtimedwait+0x50>
/* API signals pending? */
_ISR_Disable( level );
if ( *set & api->signals_pending ) {
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
80043ec: b8 80 08 00 mv r1,r4
80043f0: fb ff ff 73 calli 80041bc <_POSIX_signals_Get_lowest>
80043f4: b8 20 10 00 mv r2,r1
80043f8: 59 61 00 00 sw (r11+0),r1
_POSIX_signals_Clear_signals(
80043fc: b9 60 18 00 mv r3,r11
8004400: b9 e0 08 00 mv r1,r15
8004404: 34 04 00 00 mvi r4,0
8004408: 34 05 00 00 mvi r5,0
800440c: f8 00 1a a3 calli 800ae98 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
8004410: d0 10 00 00 wcsr IE,r16
the_info->si_code = SI_USER;
8004414: 34 01 00 01 mvi r1,1
8004418: 59 61 00 04 sw (r11+4),r1
the_info->si_value.sival_int = 0;
800441c: 59 60 00 08 sw (r11+8),r0
return the_info->si_signo;
8004420: 29 6e 00 00 lw r14,(r11+0)
8004424: e3 ff ff d5 bi 8004378 <sigtimedwait+0x13c>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
8004428: f8 00 29 2e calli 800e8e0 <__errno>
800442c: 34 02 00 16 mvi r2,22
8004430: 58 22 00 00 sw (r1+0),r2
8004434: 34 0e ff ff mvi r14,-1
8004438: e3 ff ff d0 bi 8004378 <sigtimedwait+0x13c>
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
800443c: f8 00 29 29 calli 800e8e0 <__errno>
8004440: 29 82 00 0c lw r2,(r12+12)
return -1;
8004444: 34 0e ff ff mvi r14,-1
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
8004448: 28 42 00 34 lw r2,(r2+52)
800444c: 58 22 00 00 sw (r1+0),r2
return -1;
8004450: e3 ff ff ca bi 8004378 <sigtimedwait+0x13c>
08006488 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
8006488: 37 9c ff f8 addi sp,sp,-8
800648c: 5b 8b 00 08 sw (sp+8),r11
8006490: 5b 9d 00 04 sw (sp+4),ra
int status;
status = sigtimedwait( set, NULL, NULL );
8006494: 34 03 00 00 mvi r3,0
int sigwait(
const sigset_t *set,
int *sig
)
{
8006498: b8 40 58 00 mv r11,r2
int status;
status = sigtimedwait( set, NULL, NULL );
800649c: 34 02 00 00 mvi r2,0
80064a0: fb ff ff 6d calli 8006254 <sigtimedwait>
if ( status != -1 ) {
80064a4: 34 02 ff ff mvi r2,-1
80064a8: 44 22 00 09 be r1,r2,80064cc <sigwait+0x44>
if ( sig )
*sig = status;
return 0;
80064ac: 34 03 00 00 mvi r3,0
int status;
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
80064b0: 45 60 00 02 be r11,r0,80064b8 <sigwait+0x30> <== NEVER TAKEN
*sig = status;
80064b4: 59 61 00 00 sw (r11+0),r1
return 0;
}
return errno;
}
80064b8: b8 60 08 00 mv r1,r3
80064bc: 2b 9d 00 04 lw ra,(sp+4)
80064c0: 2b 8b 00 08 lw r11,(sp+8)
80064c4: 37 9c 00 08 addi sp,sp,8
80064c8: c3 a0 00 00 ret
if ( sig )
*sig = status;
return 0;
}
return errno;
80064cc: f8 00 28 03 calli 80104d8 <__errno>
80064d0: 28 23 00 00 lw r3,(r1+0)
}
80064d4: b8 60 08 00 mv r1,r3
80064d8: 2b 9d 00 04 lw ra,(sp+4)
80064dc: 2b 8b 00 08 lw r11,(sp+8)
80064e0: 37 9c 00 08 addi sp,sp,8
80064e4: c3 a0 00 00 ret
0800315c <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
800315c: 37 9c ff f0 addi sp,sp,-16
8003160: 5b 8b 00 10 sw (sp+16),r11
8003164: 5b 8c 00 0c sw (sp+12),r12
8003168: 5b 8d 00 08 sw (sp+8),r13
800316c: 5b 9d 00 04 sw (sp+4),ra
8003170: b8 40 58 00 mv r11,r2
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
8003174: 34 02 00 01 mvi r2,1
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
8003178: b8 60 68 00 mv r13,r3
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
800317c: 5c 22 00 06 bne r1,r2,8003194 <timer_create+0x38>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
8003180: 44 60 00 05 be r3,r0,8003194 <timer_create+0x38>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
8003184: 45 60 00 14 be r11,r0,80031d4 <timer_create+0x78>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
8003188: 29 62 00 00 lw r2,(r11+0)
800318c: 34 42 ff ff addi r2,r2,-1
8003190: 50 22 00 0b bgeu r1,r2,80031bc <timer_create+0x60> <== ALWAYS TAKEN
if ( !evp->sigev_signo )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
rtems_set_errno_and_return_minus_one( EINVAL );
8003194: f8 00 2b 23 calli 800de20 <__errno>
8003198: 34 02 00 16 mvi r2,22
800319c: 58 22 00 00 sw (r1+0),r2
80031a0: 34 01 ff ff mvi r1,-1
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
80031a4: 2b 9d 00 04 lw ra,(sp+4)
80031a8: 2b 8b 00 10 lw r11,(sp+16)
80031ac: 2b 8c 00 0c lw r12,(sp+12)
80031b0: 2b 8d 00 08 lw r13,(sp+8)
80031b4: 37 9c 00 10 addi sp,sp,16
80031b8: c3 a0 00 00 ret
( 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 )
80031bc: 29 61 00 04 lw r1,(r11+4)
80031c0: 44 20 ff f5 be r1,r0,8003194 <timer_create+0x38> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
80031c4: 34 21 ff ff addi r1,r1,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
80031c8: 34 02 00 1f mvi r2,31
80031cc: 50 41 00 02 bgeu r2,r1,80031d4 <timer_create+0x78> <== ALWAYS TAKEN
80031d0: e3 ff ff f1 bi 8003194 <timer_create+0x38> <== NOT EXECUTED
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80031d4: 78 01 08 02 mvhi r1,0x802
80031d8: 38 21 09 18 ori r1,r1,0x918
80031dc: 28 22 00 00 lw r2,(r1+0)
80031e0: 34 42 00 01 addi r2,r2,1
80031e4: 58 22 00 00 sw (r1+0),r2
* 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 );
80031e8: 78 0c 08 02 mvhi r12,0x802
80031ec: 39 8c 0b 8c ori r12,r12,0xb8c
80031f0: b9 80 08 00 mv r1,r12
80031f4: f8 00 07 60 calli 8004f74 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
80031f8: 44 20 00 29 be r1,r0,800329c <timer_create+0x140>
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
ptimer->thread_id = _Thread_Executing->Object.id;
80031fc: 78 02 08 02 mvhi r2,0x802
rtems_set_errno_and_return_minus_one( EAGAIN );
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
8003200: 34 03 00 02 mvi r3,2
8003204: 30 23 00 3c sb (r1+60),r3
ptimer->thread_id = _Thread_Executing->Object.id;
8003208: 38 42 0d c4 ori r2,r2,0xdc4
800320c: 28 42 00 0c lw r2,(r2+12)
8003210: 28 42 00 08 lw r2,(r2+8)
8003214: 58 22 00 38 sw (r1+56),r2
if ( evp != NULL ) {
8003218: 45 60 00 07 be r11,r0,8003234 <timer_create+0xd8>
ptimer->inf.sigev_notify = evp->sigev_notify;
800321c: 29 64 00 00 lw r4,(r11+0)
ptimer->inf.sigev_signo = evp->sigev_signo;
8003220: 29 63 00 04 lw r3,(r11+4)
ptimer->inf.sigev_value = evp->sigev_value;
8003224: 29 62 00 08 lw r2,(r11+8)
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
ptimer->thread_id = _Thread_Executing->Object.id;
if ( evp != NULL ) {
ptimer->inf.sigev_notify = evp->sigev_notify;
8003228: 58 24 00 40 sw (r1+64),r4
ptimer->inf.sigev_signo = evp->sigev_signo;
800322c: 58 23 00 44 sw (r1+68),r3
ptimer->inf.sigev_value = evp->sigev_value;
8003230: 58 22 00 48 sw (r1+72),r2
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8003234: 28 23 00 08 lw r3,(r1+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003238: 29 84 00 1c lw r4,(r12+28)
}
ptimer->overrun = 0;
800323c: 58 20 00 68 sw (r1+104),r0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
8003240: 20 62 ff ff andi r2,r3,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003244: b4 42 10 00 add r2,r2,r2
8003248: b4 42 10 00 add r2,r2,r2
ptimer->timer_data.it_value.tv_sec = 0;
800324c: 58 20 00 5c sw (r1+92),r0
ptimer->timer_data.it_value.tv_nsec = 0;
8003250: 58 20 00 60 sw (r1+96),r0
ptimer->timer_data.it_interval.tv_sec = 0;
8003254: 58 20 00 54 sw (r1+84),r0
ptimer->timer_data.it_interval.tv_nsec = 0;
8003258: 58 20 00 58 sw (r1+88),r0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
800325c: 58 20 00 18 sw (r1+24),r0
the_watchdog->routine = routine;
8003260: 58 20 00 2c sw (r1+44),r0
the_watchdog->id = id;
8003264: 58 20 00 30 sw (r1+48),r0
the_watchdog->user_data = user_data;
8003268: 58 20 00 34 sw (r1+52),r0
800326c: b4 82 10 00 add r2,r4,r2
8003270: 58 41 00 00 sw (r2+0),r1
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8003274: 58 20 00 0c sw (r1+12),r0
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
8003278: 59 a3 00 00 sw (r13+0),r3
_Thread_Enable_dispatch();
800327c: f8 00 0c 12 calli 80062c4 <_Thread_Enable_dispatch>
return 0;
8003280: 34 01 00 00 mvi r1,0
}
8003284: 2b 9d 00 04 lw ra,(sp+4)
8003288: 2b 8b 00 10 lw r11,(sp+16)
800328c: 2b 8c 00 0c lw r12,(sp+12)
8003290: 2b 8d 00 08 lw r13,(sp+8)
8003294: 37 9c 00 10 addi sp,sp,16
8003298: c3 a0 00 00 ret
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
_Thread_Enable_dispatch();
800329c: f8 00 0c 0a calli 80062c4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
80032a0: f8 00 2a e0 calli 800de20 <__errno>
80032a4: 34 02 00 0b mvi r2,11
80032a8: 58 22 00 00 sw (r1+0),r2
80032ac: 34 01 ff ff mvi r1,-1
80032b0: e3 ff ff f5 bi 8003284 <timer_create+0x128>
080032b4 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
80032b4: 37 9c ff cc addi sp,sp,-52
80032b8: 5b 8b 00 18 sw (sp+24),r11
80032bc: 5b 8c 00 14 sw (sp+20),r12
80032c0: 5b 8d 00 10 sw (sp+16),r13
80032c4: 5b 8e 00 0c sw (sp+12),r14
80032c8: 5b 8f 00 08 sw (sp+8),r15
80032cc: 5b 9d 00 04 sw (sp+4),ra
80032d0: b8 60 60 00 mv r12,r3
80032d4: b8 20 70 00 mv r14,r1
80032d8: b8 40 58 00 mv r11,r2
80032dc: b8 80 68 00 mv r13,r4
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
80032e0: 44 60 00 1e be r3,r0,8003358 <timer_settime+0xa4> <== NEVER TAKEN
/*
* First, it verifies if the structure "value" is correct
* if the number of nanoseconds is not correct return EINVAL
*/
if ( !_Timespec_Is_valid( &(value->it_value) ) ) {
80032e4: 34 61 00 08 addi r1,r3,8
80032e8: f8 00 0f 5c calli 8007058 <_Timespec_Is_valid>
80032ec: 44 20 00 1b be r1,r0,8003358 <timer_settime+0xa4>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
80032f0: b9 80 08 00 mv r1,r12
80032f4: f8 00 0f 59 calli 8007058 <_Timespec_Is_valid>
80032f8: 44 20 00 18 be r1,r0,8003358 <timer_settime+0xa4> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
80032fc: 7d 62 00 00 cmpnei r2,r11,0
8003300: 7d 61 00 04 cmpnei r1,r11,4
8003304: a0 41 08 00 and r1,r2,r1
8003308: 5c 20 00 14 bne r1,r0,8003358 <timer_settime+0xa4>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
800330c: 29 81 00 0c lw r1,(r12+12)
8003310: 29 84 00 00 lw r4,(r12+0)
8003314: 29 83 00 04 lw r3,(r12+4)
8003318: 29 82 00 08 lw r2,(r12+8)
800331c: 5b 81 00 28 sw (sp+40),r1
8003320: 5b 84 00 1c sw (sp+28),r4
8003324: 5b 83 00 20 sw (sp+32),r3
8003328: 5b 82 00 24 sw (sp+36),r2
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
800332c: 34 01 00 04 mvi r1,4
8003330: 45 61 00 46 be r11,r1,8003448 <timer_settime+0x194>
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
8003334: 78 03 08 02 mvhi r3,0x802
8003338: b8 60 08 00 mv r1,r3
800333c: 38 21 0b 8c ori r1,r1,0xb8c
8003340: b9 c0 10 00 mv r2,r14
8003344: 37 83 00 34 addi r3,sp,52
8003348: f8 00 08 50 calli 8005488 <_Objects_Get>
800334c: b8 20 58 00 mv r11,r1
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
8003350: 2b 81 00 34 lw r1,(sp+52)
8003354: 44 20 00 0d be r1,r0,8003388 <timer_settime+0xd4>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
8003358: f8 00 2a b2 calli 800de20 <__errno>
800335c: 34 02 00 16 mvi r2,22
8003360: 58 22 00 00 sw (r1+0),r2
8003364: 34 01 ff ff mvi r1,-1
}
8003368: 2b 9d 00 04 lw ra,(sp+4)
800336c: 2b 8b 00 18 lw r11,(sp+24)
8003370: 2b 8c 00 14 lw r12,(sp+20)
8003374: 2b 8d 00 10 lw r13,(sp+16)
8003378: 2b 8e 00 0c lw r14,(sp+12)
800337c: 2b 8f 00 08 lw r15,(sp+8)
8003380: 37 9c 00 34 addi sp,sp,52
8003384: c3 a0 00 00 ret
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
8003388: 2b 82 00 24 lw r2,(sp+36)
800338c: 5c 41 00 03 bne r2,r1,8003398 <timer_settime+0xe4>
8003390: 2b 8e 00 28 lw r14,(sp+40)
8003394: 45 c2 00 3a be r14,r2,800347c <timer_settime+0x1c8>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
8003398: b9 80 08 00 mv r1,r12
800339c: f8 00 0f 51 calli 80070e0 <_Timespec_To_ticks>
80033a0: 59 61 00 64 sw (r11+100),r1
initial_period = _Timespec_To_ticks( &normalize.it_value );
80033a4: 37 81 00 24 addi r1,sp,36
80033a8: f8 00 0f 4e calli 80070e0 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
80033ac: 29 63 00 08 lw r3,(r11+8)
80033b0: 78 04 08 00 mvhi r4,0x800
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
initial_period = _Timespec_To_ticks( &normalize.it_value );
80033b4: b8 20 10 00 mv r2,r1
activated = _POSIX_Timer_Insert_helper(
80033b8: 38 84 34 f8 ori r4,r4,0x34f8
80033bc: 35 61 00 10 addi r1,r11,16
80033c0: b9 60 28 00 mv r5,r11
80033c4: f8 00 1b ec calli 800a374 <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
80033c8: 44 20 00 16 be r1,r0,8003420 <timer_settime+0x16c>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
80033cc: 45 a0 00 09 be r13,r0,80033f0 <timer_settime+0x13c>
*ovalue = ptimer->timer_data;
80033d0: 29 61 00 54 lw r1,(r11+84)
80033d4: 59 a1 00 00 sw (r13+0),r1
80033d8: 29 61 00 58 lw r1,(r11+88)
80033dc: 59 a1 00 04 sw (r13+4),r1
80033e0: 29 61 00 5c lw r1,(r11+92)
80033e4: 59 a1 00 08 sw (r13+8),r1
80033e8: 29 61 00 60 lw r1,(r11+96)
80033ec: 59 a1 00 0c sw (r13+12),r1
ptimer->timer_data = normalize;
80033f0: 2b 82 00 1c lw r2,(sp+28)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
_TOD_Get( &ptimer->time );
80033f4: 35 61 00 6c addi r1,r11,108
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
*ovalue = ptimer->timer_data;
ptimer->timer_data = normalize;
80033f8: 59 62 00 54 sw (r11+84),r2
80033fc: 2b 82 00 20 lw r2,(sp+32)
8003400: 59 62 00 58 sw (r11+88),r2
8003404: 2b 82 00 24 lw r2,(sp+36)
8003408: 59 62 00 5c sw (r11+92),r2
800340c: 2b 82 00 28 lw r2,(sp+40)
8003410: 59 62 00 60 sw (r11+96),r2
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
8003414: 34 02 00 03 mvi r2,3
8003418: 31 62 00 3c sb (r11+60),r2
_TOD_Get( &ptimer->time );
800341c: f8 00 05 02 calli 8004824 <_TOD_Get>
_Thread_Enable_dispatch();
8003420: f8 00 0b a9 calli 80062c4 <_Thread_Enable_dispatch>
return 0;
8003424: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
8003428: 2b 9d 00 04 lw ra,(sp+4)
800342c: 2b 8b 00 18 lw r11,(sp+24)
8003430: 2b 8c 00 14 lw r12,(sp+20)
8003434: 2b 8d 00 10 lw r13,(sp+16)
8003438: 2b 8e 00 0c lw r14,(sp+12)
800343c: 2b 8f 00 08 lw r15,(sp+8)
8003440: 37 9c 00 34 addi sp,sp,52
8003444: c3 a0 00 00 ret
normalize = *value;
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
_TOD_Get( &now );
8003448: 37 8b 00 2c addi r11,sp,44
800344c: b9 60 08 00 mv r1,r11
8003450: f8 00 04 f5 calli 8004824 <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
8003454: 37 8f 00 24 addi r15,sp,36
8003458: b9 60 08 00 mv r1,r11
800345c: b9 e0 10 00 mv r2,r15
8003460: f8 00 0e f3 calli 800702c <_Timespec_Greater_than>
8003464: 5c 20 ff bd bne r1,r0,8003358 <timer_settime+0xa4>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
8003468: b9 e0 10 00 mv r2,r15
800346c: b9 60 08 00 mv r1,r11
8003470: b9 e0 18 00 mv r3,r15
8003474: f8 00 0f 05 calli 8007088 <_Timespec_Subtract>
8003478: e3 ff ff af bi 8003334 <timer_settime+0x80>
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
800347c: 35 61 00 10 addi r1,r11,16
8003480: f8 00 10 a0 calli 8007700 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
8003484: 45 ae 00 09 be r13,r14,80034a8 <timer_settime+0x1f4>
*ovalue = ptimer->timer_data;
8003488: 29 61 00 54 lw r1,(r11+84)
800348c: 59 a1 00 00 sw (r13+0),r1
8003490: 29 61 00 58 lw r1,(r11+88)
8003494: 59 a1 00 04 sw (r13+4),r1
8003498: 29 61 00 5c lw r1,(r11+92)
800349c: 59 a1 00 08 sw (r13+8),r1
80034a0: 29 61 00 60 lw r1,(r11+96)
80034a4: 59 a1 00 0c sw (r13+12),r1
/* The new data are set */
ptimer->timer_data = normalize;
80034a8: 2b 81 00 1c lw r1,(sp+28)
80034ac: 59 61 00 54 sw (r11+84),r1
80034b0: 2b 81 00 20 lw r1,(sp+32)
80034b4: 59 61 00 58 sw (r11+88),r1
80034b8: 2b 81 00 24 lw r1,(sp+36)
80034bc: 59 61 00 5c sw (r11+92),r1
80034c0: 2b 81 00 28 lw r1,(sp+40)
80034c4: 59 61 00 60 sw (r11+96),r1
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
80034c8: 34 01 00 04 mvi r1,4
80034cc: 31 61 00 3c sb (r11+60),r1
/* Returns with success */
_Thread_Enable_dispatch();
80034d0: f8 00 0b 7d calli 80062c4 <_Thread_Enable_dispatch>
return 0;
80034d4: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
80034d8: 2b 9d 00 04 lw ra,(sp+4)
80034dc: 2b 8b 00 18 lw r11,(sp+24)
80034e0: 2b 8c 00 14 lw r12,(sp+20)
80034e4: 2b 8d 00 10 lw r13,(sp+16)
80034e8: 2b 8e 00 0c lw r14,(sp+12)
80034ec: 2b 8f 00 08 lw r15,(sp+8)
80034f0: 37 9c 00 34 addi sp,sp,52
80034f4: c3 a0 00 00 ret
08003080 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
8003080: 37 9c ff e4 addi sp,sp,-28
8003084: 5b 8b 00 14 sw (sp+20),r11
8003088: 5b 8c 00 10 sw (sp+16),r12
800308c: 5b 8d 00 0c sw (sp+12),r13
8003090: 5b 8e 00 08 sw (sp+8),r14
8003094: 5b 9d 00 04 sw (sp+4),ra
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
8003098: 78 0b 08 01 mvhi r11,0x801
800309c: 39 6b 81 98 ori r11,r11,0x8198
80030a0: 29 62 00 1c lw r2,(r11+28)
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
80030a4: b8 20 60 00 mv r12,r1
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
80030a8: 44 40 00 55 be r2,r0,80031fc <ualarm+0x17c>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
80030ac: b9 60 08 00 mv r1,r11
80030b0: f8 00 10 03 calli 80070bc <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
80030b4: 34 21 ff fe addi r1,r1,-2
80030b8: 34 02 00 01 mvi r2,1
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
80030bc: 34 0d 00 00 mvi r13,0
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
80030c0: 54 22 00 24 bgu r1,r2,8003150 <ualarm+0xd0> <== 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);
80030c4: 29 64 00 14 lw r4,(r11+20)
80030c8: 29 61 00 0c lw r1,(r11+12)
80030cc: 29 63 00 18 lw r3,(r11+24)
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
80030d0: 37 82 00 18 addi r2,sp,24
* 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);
80030d4: b4 81 08 00 add r1,r4,r1
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
80030d8: c8 23 08 00 sub r1,r1,r3
80030dc: f8 00 0d f6 calli 80068b4 <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
80030e0: 2b 85 00 18 lw r5,(sp+24)
remaining += tp.tv_nsec / 1000;
80030e4: 2b 81 00 1c lw r1,(sp+28)
80030e8: 34 02 03 e8 mvi r2,1000
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
80030ec: b4 a5 18 00 add r3,r5,r5
80030f0: b4 63 18 00 add r3,r3,r3
80030f4: b4 63 18 00 add r3,r3,r3
80030f8: b4 63 20 00 add r4,r3,r3
80030fc: b4 84 20 00 add r4,r4,r4
8003100: b4 84 20 00 add r4,r4,r4
8003104: b4 84 20 00 add r4,r4,r4
8003108: b4 84 20 00 add r4,r4,r4
800310c: c8 83 20 00 sub r4,r4,r3
8003110: b4 84 18 00 add r3,r4,r4
8003114: b4 63 18 00 add r3,r3,r3
8003118: b4 63 18 00 add r3,r3,r3
800311c: b4 63 18 00 add r3,r3,r3
8003120: b4 63 18 00 add r3,r3,r3
8003124: b4 63 18 00 add r3,r3,r3
8003128: c8 64 18 00 sub r3,r3,r4
800312c: b4 65 68 00 add r13,r3,r5
8003130: b5 ad 68 00 add r13,r13,r13
8003134: b5 ad 68 00 add r13,r13,r13
8003138: b5 ad 68 00 add r13,r13,r13
800313c: b5 ad 68 00 add r13,r13,r13
8003140: b5 ad 68 00 add r13,r13,r13
8003144: b5 ad 68 00 add r13,r13,r13
remaining += tp.tv_nsec / 1000;
8003148: f8 00 44 9a calli 80143b0 <__divsi3>
800314c: b4 2d 68 00 add r13,r1,r13
/*
* 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 ) {
8003150: 45 80 00 23 be r12,r0,80031dc <ualarm+0x15c>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
8003154: 78 01 08 01 mvhi r1,0x801
8003158: 38 21 56 a4 ori r1,r1,0x56a4
800315c: 28 22 00 00 lw r2,(r1+0)
8003160: b9 80 08 00 mv r1,r12
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
ticks = _Timespec_To_ticks( &tp );
8003164: 37 8e 00 18 addi r14,sp,24
* 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;
8003168: f8 00 44 eb calli 8014514 <__udivsi3>
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
800316c: 78 03 08 01 mvhi r3,0x801
8003170: 38 63 56 a4 ori r3,r3,0x56a4
8003174: 28 62 00 00 lw r2,(r3+0)
* 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;
8003178: 5b 81 00 18 sw (sp+24),r1
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
800317c: b9 80 08 00 mv r1,r12
8003180: f8 00 44 f5 calli 8014554 <__umodsi3>
8003184: b4 21 10 00 add r2,r1,r1
8003188: b4 42 10 00 add r2,r2,r2
800318c: b4 42 10 00 add r2,r2,r2
8003190: b4 42 18 00 add r3,r2,r2
8003194: b4 63 18 00 add r3,r3,r3
8003198: b4 43 10 00 add r2,r2,r3
800319c: b4 42 18 00 add r3,r2,r2
80031a0: b4 63 18 00 add r3,r3,r3
80031a4: b4 43 10 00 add r2,r2,r3
80031a8: b4 42 18 00 add r3,r2,r2
80031ac: b4 63 18 00 add r3,r3,r3
80031b0: b4 43 18 00 add r3,r2,r3
ticks = _Timespec_To_ticks( &tp );
80031b4: b9 c0 08 00 mv r1,r14
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
80031b8: 5b 83 00 1c sw (sp+28),r3
ticks = _Timespec_To_ticks( &tp );
80031bc: f8 00 0d fa calli 80069a4 <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
80031c0: b9 c0 08 00 mv r1,r14
80031c4: f8 00 0d f8 calli 80069a4 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
80031c8: 59 61 00 0c sw (r11+12),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
80031cc: 78 01 08 01 mvhi r1,0x801
80031d0: b9 60 10 00 mv r2,r11
80031d4: 38 21 79 e8 ori r1,r1,0x79e8
80031d8: f8 00 0f 4e calli 8006f10 <_Watchdog_Insert>
}
return remaining;
}
80031dc: b9 a0 08 00 mv r1,r13
80031e0: 2b 9d 00 04 lw ra,(sp+4)
80031e4: 2b 8b 00 14 lw r11,(sp+20)
80031e8: 2b 8c 00 10 lw r12,(sp+16)
80031ec: 2b 8d 00 0c lw r13,(sp+12)
80031f0: 2b 8e 00 08 lw r14,(sp+8)
80031f4: 37 9c 00 1c addi sp,sp,28
80031f8: c3 a0 00 00 ret
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
80031fc: 78 01 08 00 mvhi r1,0x800
8003200: 38 21 30 38 ori r1,r1,0x3038
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8003204: 59 60 00 08 sw (r11+8),r0
the_watchdog->routine = routine;
8003208: 59 61 00 1c sw (r11+28),r1
the_watchdog->id = id;
800320c: 59 60 00 20 sw (r11+32),r0
the_watchdog->user_data = user_data;
8003210: 59 60 00 24 sw (r11+36),r0
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
8003214: 34 0d 00 00 mvi r13,0
8003218: e3 ff ff ce bi 8003150 <ualarm+0xd0>