RTEMS 4.11Annotated Report
Sun Dec 23 00:48:04 2012
ffc116ec <TOD_MICROSECONDS_TO_TICKS>:
/**
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
microseconds_per_tick = rtems_configuration_get_microseconds_per_tick();
ffc116ec: 3d 20 ff c3 lis r9,-61
ffc116f0: 81 49 97 b4 lwz r10,-26700(r9)
ticks = microseconds / microseconds_per_tick;
ffc116f4: 7d 23 53 96 divwu r9,r3,r10
if ( (microseconds % microseconds_per_tick) != 0 )
ffc116f8: 7d 49 51 d6 mullw r10,r9,r10
ffc116fc: 7f 83 50 00 cmpw cr7,r3,r10
ffc11700: 41 9e 00 08 beq- cr7,ffc11708 <TOD_MICROSECONDS_TO_TICKS+0x1c><== ALWAYS TAKEN
ticks += 1;
ffc11704: 39 29 00 01 addi r9,r9,1 <== NOT EXECUTED
return ticks;
}
ffc11708: 7d 23 4b 78 mr r3,r9
ffc1170c: 4e 80 00 20 blr
ffc0b7a8 <TOD_MILLISECONDS_TO_TICKS>:
/**
* We should ensure the ticks not be truncated by integer division. We
* need to have it be greater than or equal to the requested time. It
* should not be shorter.
*/
milliseconds_per_tick = rtems_configuration_get_milliseconds_per_tick();
ffc0b7a8: 3d 20 ff c2 lis r9,-62
ffc0b7ac: 81 29 ff a4 lwz r9,-92(r9)
ffc0b7b0: 3d 40 10 62 lis r10,4194
ffc0b7b4: 61 4a 4d d3 ori r10,r10,19923
ffc0b7b8: 7d 49 50 16 mulhwu r10,r9,r10
ffc0b7bc: 55 4a d1 be rlwinm r10,r10,26,6,31
ticks = milliseconds / milliseconds_per_tick;
ffc0b7c0: 7d 23 53 96 divwu r9,r3,r10
if ( (milliseconds % milliseconds_per_tick) != 0 )
ffc0b7c4: 7d 49 51 d6 mullw r10,r9,r10
ffc0b7c8: 7f 83 50 00 cmpw cr7,r3,r10
ffc0b7cc: 41 9e 00 08 beq- cr7,ffc0b7d4 <TOD_MILLISECONDS_TO_TICKS+0x2c><== ALWAYS TAKEN
ticks += 1;
ffc0b7d0: 39 29 00 01 addi r9,r9,1 <== NOT EXECUTED
return ticks;
}
ffc0b7d4: 7d 23 4b 78 mr r3,r9
ffc0b7d8: 4e 80 00 20 blr
ffc0a65c <_API_extensions_Run_postdriver>:
}
}
#endif
void _API_extensions_Run_postdriver( void )
{
ffc0a65c: 94 21 ff f0 stwu r1,-16(r1)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc0a660: 3d 20 00 00 lis r9,0
ffc0a664: 7c 08 02 a6 mflr r0
ffc0a668: 93 c1 00 08 stw r30,8(r1)
ffc0a66c: 3b c9 2e 34 addi r30,r9,11828
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
ffc0a670: 3b de 00 04 addi r30,r30,4
}
}
#endif
void _API_extensions_Run_postdriver( void )
{
ffc0a674: 93 e1 00 0c stw r31,12(r1)
ffc0a678: 83 e9 2e 34 lwz r31,11828(r9)
ffc0a67c: 90 01 00 14 stw r0,20(r1)
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
ffc0a680: 7f 9f f0 00 cmpw cr7,r31,r30
ffc0a684: 41 9e 00 1c beq- cr7,ffc0a6a0 <_API_extensions_Run_postdriver+0x44><== 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)();
ffc0a688: 81 3f 00 08 lwz r9,8(r31)
ffc0a68c: 7d 29 03 a6 mtctr r9
ffc0a690: 4e 80 04 21 bctrl
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 ) {
ffc0a694: 83 ff 00 00 lwz r31,0(r31)
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
ffc0a698: 7f 9f f0 00 cmpw cr7,r31,r30
ffc0a69c: 40 9e ff ec bne+ cr7,ffc0a688 <_API_extensions_Run_postdriver+0x2c>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
ffc0a6a0: 80 01 00 14 lwz r0,20(r1)
ffc0a6a4: 83 c1 00 08 lwz r30,8(r1)
ffc0a6a8: 7c 08 03 a6 mtlr r0
ffc0a6ac: 83 e1 00 0c lwz r31,12(r1)
ffc0a6b0: 38 21 00 10 addi r1,r1,16
ffc0a6b4: 4e 80 00 20 blr
ffc0cf98 <_CORE_RWLock_Release>:
#include <rtems/score/watchdog.h>
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
ffc0cf98: 94 21 ff f0 stwu r1,-16(r1)
ffc0cf9c: 7c 08 02 a6 mflr r0
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
ffc0cfa0: 3d 20 00 00 lis r9,0
#include <rtems/score/watchdog.h>
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
ffc0cfa4: 90 01 00 14 stw r0,20(r1)
ffc0cfa8: 93 e1 00 0c stw r31,12(r1)
ffc0cfac: 7c 7f 1b 78 mr r31,r3
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
ffc0cfb0: 81 09 31 b0 lwz r8,12720(r9)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0cfb4: 7d 40 00 a6 mfmsr r10
ffc0cfb8: 7d 30 42 a6 mfsprg r9,0
ffc0cfbc: 7d 49 48 78 andc r9,r10,r9
ffc0cfc0: 7d 20 01 24 mtmsr r9
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
ffc0cfc4: 81 23 00 44 lwz r9,68(r3)
ffc0cfc8: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cfcc: 41 9e 00 cc beq- cr7,ffc0d098 <_CORE_RWLock_Release+0x100>
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
ffc0cfd0: 2f 89 00 01 cmpwi cr7,r9,1
ffc0cfd4: 41 9e 00 94 beq- cr7,ffc0d068 <_CORE_RWLock_Release+0xd0>
return CORE_RWLOCK_SUCCESSFUL;
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
ffc0cfd8: 39 20 00 00 li r9,0
ffc0cfdc: 91 28 00 34 stw r9,52(r8)
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
ffc0cfe0: 91 3f 00 44 stw r9,68(r31)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0cfe4: 7d 40 01 24 mtmsr r10
_ISR_Enable( level );
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
ffc0cfe8: 7f e3 fb 78 mr r3,r31
ffc0cfec: 48 00 23 0d bl ffc0f2f8 <_Thread_queue_Dequeue>
if ( next ) {
ffc0cff0: 2c 03 00 00 cmpwi r3,0
ffc0cff4: 41 82 00 5c beq- ffc0d050 <_CORE_RWLock_Release+0xb8>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
ffc0cff8: 81 23 00 30 lwz r9,48(r3)
ffc0cffc: 2f 89 00 01 cmpwi cr7,r9,1
ffc0d000: 41 9e 00 bc beq- cr7,ffc0d0bc <_CORE_RWLock_Release+0x124>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
ffc0d004: 81 3f 00 48 lwz r9,72(r31)
ffc0d008: 39 29 00 01 addi r9,r9,1
ffc0d00c: 91 3f 00 48 stw r9,72(r31)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
ffc0d010: 39 20 00 01 li r9,1
ffc0d014: 91 3f 00 44 stw r9,68(r31)
ffc0d018: 48 00 00 20 b ffc0d038 <_CORE_RWLock_Release+0xa0>
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
ffc0d01c: 81 29 00 30 lwz r9,48(r9)
ffc0d020: 2f 89 00 01 cmpwi cr7,r9,1
ffc0d024: 41 9e 00 2c beq- cr7,ffc0d050 <_CORE_RWLock_Release+0xb8><== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
ffc0d028: 81 3f 00 48 lwz r9,72(r31)
ffc0d02c: 39 29 00 01 addi r9,r9,1
ffc0d030: 91 3f 00 48 stw r9,72(r31)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
ffc0d034: 48 00 27 8d bl ffc0f7c0 <_Thread_queue_Extract>
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
ffc0d038: 7f e3 fb 78 mr r3,r31
ffc0d03c: 48 00 28 e1 bl ffc0f91c <_Thread_queue_First>
if ( !next ||
ffc0d040: 7c 69 1b 79 mr. r9,r3
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 );
ffc0d044: 7f e3 fb 78 mr r3,r31
ffc0d048: 7d 24 4b 78 mr r4,r9
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
ffc0d04c: 40 82 ff d0 bne+ ffc0d01c <_CORE_RWLock_Release+0x84>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
ffc0d050: 80 01 00 14 lwz r0,20(r1)
ffc0d054: 38 60 00 00 li r3,0
ffc0d058: 83 e1 00 0c lwz r31,12(r1)
ffc0d05c: 7c 08 03 a6 mtlr r0
ffc0d060: 38 21 00 10 addi r1,r1,16
ffc0d064: 4e 80 00 20 blr
_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;
ffc0d068: 81 23 00 48 lwz r9,72(r3)
ffc0d06c: 39 29 ff ff addi r9,r9,-1
if ( the_rwlock->number_of_readers != 0 ) {
ffc0d070: 2f 89 00 00 cmpwi cr7,r9,0
_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;
ffc0d074: 91 23 00 48 stw r9,72(r3)
if ( the_rwlock->number_of_readers != 0 ) {
ffc0d078: 41 9e ff 60 beq+ cr7,ffc0cfd8 <_CORE_RWLock_Release+0x40>
ffc0d07c: 7d 40 01 24 mtmsr r10
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
ffc0d080: 80 01 00 14 lwz r0,20(r1)
ffc0d084: 38 60 00 00 li r3,0
ffc0d088: 83 e1 00 0c lwz r31,12(r1)
ffc0d08c: 7c 08 03 a6 mtlr r0
ffc0d090: 38 21 00 10 addi r1,r1,16
ffc0d094: 4e 80 00 20 blr
ffc0d098: 7d 40 01 24 mtmsr r10
ffc0d09c: 80 01 00 14 lwz r0,20(r1)
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
ffc0d0a0: 39 20 00 02 li r9,2
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
ffc0d0a4: 83 e1 00 0c lwz r31,12(r1)
ffc0d0a8: 38 60 00 00 li r3,0
ffc0d0ac: 7c 08 03 a6 mtlr r0
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
ffc0d0b0: 91 28 00 34 stw r9,52(r8)
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
ffc0d0b4: 38 21 00 10 addi r1,r1,16
ffc0d0b8: 4e 80 00 20 blr
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;
ffc0d0bc: 39 20 00 02 li r9,2
ffc0d0c0: 91 3f 00 44 stw r9,68(r31)
return CORE_RWLOCK_SUCCESSFUL;
ffc0d0c4: 4b ff ff 8c b ffc0d050 <_CORE_RWLock_Release+0xb8>
ffc0d0c8 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
ffc0d0c8: 94 21 ff e8 stwu r1,-24(r1)
ffc0d0cc: 7c 08 02 a6 mflr r0
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
ffc0d0d0: 38 81 00 08 addi r4,r1,8
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
ffc0d0d4: 90 01 00 1c stw r0,28(r1)
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
ffc0d0d8: 48 00 1e 21 bl ffc0eef8 <_Thread_Get>
switch ( location ) {
ffc0d0dc: 81 21 00 08 lwz r9,8(r1)
ffc0d0e0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0d0e4: 40 9e 00 18 bne- cr7,ffc0d0fc <_CORE_RWLock_Timeout+0x34><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
ffc0d0e8: 48 00 29 49 bl ffc0fa30 <_Thread_queue_Process_timeout>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0d0ec: 3d 20 00 00 lis r9,0
ffc0d0f0: 81 49 28 90 lwz r10,10384(r9)
--level;
ffc0d0f4: 39 4a ff ff addi r10,r10,-1
_Thread_Dispatch_disable_level = level;
ffc0d0f8: 91 49 28 90 stw r10,10384(r9)
_Thread_Unnest_dispatch();
break;
}
}
ffc0d0fc: 80 01 00 1c lwz r0,28(r1)
ffc0d100: 38 21 00 18 addi r1,r1,24
ffc0d104: 7c 08 03 a6 mtlr r0
ffc0d108: 4e 80 00 20 blr
ffc0aa44 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
ffc0aa44: 94 21 ff d8 stwu r1,-40(r1)
ffc0aa48: 7c 08 02 a6 mflr r0
ffc0aa4c: 93 e1 00 24 stw r31,36(r1)
* This routine returns true if thread dispatch indicates
* that we are in a critical section.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Dispatch_in_critical_section(void)
{
if ( _Thread_Dispatch_disable_level == 0 )
ffc0aa50: 3f e0 00 00 lis r31,0
ffc0aa54: 81 3f 28 68 lwz r9,10344(r31)
ffc0aa58: 93 61 00 14 stw r27,20(r1)
ffc0aa5c: 7c db 33 78 mr r27,r6
ffc0aa60: 2f 89 00 00 cmpwi cr7,r9,0
ffc0aa64: 93 81 00 18 stw r28,24(r1)
ffc0aa68: 7c 9c 23 78 mr r28,r4
ffc0aa6c: 93 a1 00 1c stw r29,28(r1)
ffc0aa70: 7c 7d 1b 78 mr r29,r3
ffc0aa74: 93 c1 00 20 stw r30,32(r1)
ffc0aa78: 7c be 2b 78 mr r30,r5
ffc0aa7c: 90 01 00 2c stw r0,44(r1)
ffc0aa80: 90 e1 00 08 stw r7,8(r1)
ffc0aa84: 41 9e 00 88 beq- cr7,ffc0ab0c <_CORE_mutex_Seize+0xc8>
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
ffc0aa88: 2f 85 00 00 cmpwi cr7,r5,0
ffc0aa8c: 41 9e 00 d4 beq- cr7,ffc0ab60 <_CORE_mutex_Seize+0x11c>
ffc0aa90: 3d 20 00 00 lis r9,0
ffc0aa94: 81 29 28 90 lwz r9,10384(r9)
ffc0aa98: 2b 89 00 01 cmplwi cr7,r9,1
ffc0aa9c: 41 9d 00 d8 bgt- cr7,ffc0ab74 <_CORE_mutex_Seize+0x130>
ffc0aaa0: 38 81 00 08 addi r4,r1,8
ffc0aaa4: 48 00 5b 75 bl ffc10618 <_CORE_mutex_Seize_interrupt_trylock>
ffc0aaa8: 2f 83 00 00 cmpwi cr7,r3,0
ffc0aaac: 41 9e 00 3c beq- cr7,ffc0aae8 <_CORE_mutex_Seize+0xa4> <== ALWAYS TAKEN
ffc0aab0: 3d 20 00 00 lis r9,0
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0aab4: 81 5f 28 68 lwz r10,10344(r31)
ffc0aab8: 81 29 31 b0 lwz r9,12720(r9)
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;
ffc0aabc: 39 00 00 01 li r8,1
ffc0aac0: 91 1d 00 30 stw r8,48(r29)
++level;
ffc0aac4: 39 4a 00 01 addi r10,r10,1
ffc0aac8: 93 a9 00 44 stw r29,68(r9)
ffc0aacc: 93 89 00 20 stw r28,32(r9)
_Thread_Dispatch_disable_level = level;
ffc0aad0: 91 5f 28 68 stw r10,10344(r31)
ffc0aad4: 81 21 00 08 lwz r9,8(r1)
ffc0aad8: 7d 20 01 24 mtmsr r9
ffc0aadc: 7f a3 eb 78 mr r3,r29
ffc0aae0: 7f 64 db 78 mr r4,r27
ffc0aae4: 4b ff fe 81 bl ffc0a964 <_CORE_mutex_Seize_interrupt_blocking>
}
ffc0aae8: 80 01 00 2c lwz r0,44(r1)
ffc0aaec: 83 61 00 14 lwz r27,20(r1)
ffc0aaf0: 7c 08 03 a6 mtlr r0
ffc0aaf4: 83 81 00 18 lwz r28,24(r1)
ffc0aaf8: 83 a1 00 1c lwz r29,28(r1)
ffc0aafc: 83 c1 00 20 lwz r30,32(r1)
ffc0ab00: 83 e1 00 24 lwz r31,36(r1)
ffc0ab04: 38 21 00 28 addi r1,r1,40
ffc0ab08: 4e 80 00 20 blr
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
ffc0ab0c: 38 81 00 08 addi r4,r1,8
ffc0ab10: 48 00 5b 09 bl ffc10618 <_CORE_mutex_Seize_interrupt_trylock>
ffc0ab14: 2f 83 00 00 cmpwi cr7,r3,0
ffc0ab18: 41 be ff d0 beq- cr7,ffc0aae8 <_CORE_mutex_Seize+0xa4>
ffc0ab1c: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0ab20: 40 be ff 90 bne- cr7,ffc0aab0 <_CORE_mutex_Seize+0x6c>
ffc0ab24: 81 21 00 08 lwz r9,8(r1)
ffc0ab28: 7d 20 01 24 mtmsr r9
}
ffc0ab2c: 80 01 00 2c lwz r0,44(r1)
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
ffc0ab30: 3d 20 00 00 lis r9,0
ffc0ab34: 81 29 31 b0 lwz r9,12720(r9)
ffc0ab38: 39 40 00 01 li r10,1
}
ffc0ab3c: 7c 08 03 a6 mtlr r0
ffc0ab40: 83 61 00 14 lwz r27,20(r1)
ffc0ab44: 83 81 00 18 lwz r28,24(r1)
ffc0ab48: 83 a1 00 1c lwz r29,28(r1)
ffc0ab4c: 83 c1 00 20 lwz r30,32(r1)
ffc0ab50: 83 e1 00 24 lwz r31,36(r1)
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
ffc0ab54: 91 49 00 34 stw r10,52(r9)
}
ffc0ab58: 38 21 00 28 addi r1,r1,40
ffc0ab5c: 4e 80 00 20 blr
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
ffc0ab60: 38 81 00 08 addi r4,r1,8
ffc0ab64: 48 00 5a b5 bl ffc10618 <_CORE_mutex_Seize_interrupt_trylock>
ffc0ab68: 2f 83 00 00 cmpwi cr7,r3,0
ffc0ab6c: 40 9e ff b8 bne+ cr7,ffc0ab24 <_CORE_mutex_Seize+0xe0> <== NEVER TAKEN
ffc0ab70: 4b ff ff 78 b ffc0aae8 <_CORE_mutex_Seize+0xa4>
ffc0ab74: 38 60 00 00 li r3,0
ffc0ab78: 38 80 00 00 li r4,0
ffc0ab7c: 38 a0 00 12 li r5,18
ffc0ab80: 48 00 07 f1 bl ffc0b370 <_Internal_error_Occurred>
ffc0ad14 <_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
)
{
ffc0ad14: 94 21 ff f0 stwu r1,-16(r1)
ffc0ad18: 7c 08 02 a6 mflr r0
ffc0ad1c: 93 e1 00 0c stw r31,12(r1)
ffc0ad20: 7c 7f 1b 78 mr r31,r3
ffc0ad24: 90 01 00 14 stw r0,20(r1)
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
ffc0ad28: 48 00 21 b5 bl ffc0cedc <_Thread_queue_Dequeue>
ffc0ad2c: 2f 83 00 00 cmpwi cr7,r3,0
ffc0ad30: 41 9e 00 1c beq- cr7,ffc0ad4c <_CORE_semaphore_Surrender+0x38>
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
ffc0ad34: 80 01 00 14 lwz r0,20(r1)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
ffc0ad38: 38 60 00 00 li r3,0
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
ffc0ad3c: 83 e1 00 0c lwz r31,12(r1)
ffc0ad40: 7c 08 03 a6 mtlr r0
ffc0ad44: 38 21 00 10 addi r1,r1,16
ffc0ad48: 4e 80 00 20 blr
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0ad4c: 7d 00 00 a6 mfmsr r8
ffc0ad50: 7d 30 42 a6 mfsprg r9,0
ffc0ad54: 7d 09 48 78 andc r9,r8,r9
ffc0ad58: 7d 20 01 24 mtmsr r9
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
ffc0ad5c: 81 3f 00 48 lwz r9,72(r31)
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
ffc0ad60: 38 60 00 04 li r3,4
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
ffc0ad64: 81 5f 00 40 lwz r10,64(r31)
ffc0ad68: 7f 89 50 40 cmplw cr7,r9,r10
ffc0ad6c: 40 9c 00 10 bge- cr7,ffc0ad7c <_CORE_semaphore_Surrender+0x68><== NEVER TAKEN
the_semaphore->count += 1;
ffc0ad70: 39 29 00 01 addi r9,r9,1
ffc0ad74: 91 3f 00 48 stw r9,72(r31)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
ffc0ad78: 38 60 00 00 li r3,0
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0ad7c: 7d 00 01 24 mtmsr r8
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
ffc0ad80: 80 01 00 14 lwz r0,20(r1)
ffc0ad84: 83 e1 00 0c lwz r31,12(r1)
ffc0ad88: 7c 08 03 a6 mtlr r0
ffc0ad8c: 38 21 00 10 addi r1,r1,16
ffc0ad90: 4e 80 00 20 blr
ffc0a83c <_Chain_Initialize>:
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
ffc0a83c: 2f 85 00 00 cmpwi cr7,r5,0
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;
ffc0a840: 39 20 00 00 li r9,0
size_t node_size
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
ffc0a844: 39 03 00 04 addi r8,r3,4
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
ffc0a848: 91 23 00 04 stw r9,4(r3)
while ( count-- ) {
ffc0a84c: 38 e5 ff ff addi r7,r5,-1
ffc0a850: 41 9e 00 38 beq- cr7,ffc0a888 <_Chain_Initialize+0x4c> <== NEVER TAKEN
ffc0a854: 7c a9 03 a6 mtctr r5
ffc0a858: 7c 89 23 78 mr r9,r4
ffc0a85c: 7c 6a 1b 78 mr r10,r3
current->next = next;
ffc0a860: 91 2a 00 00 stw r9,0(r10)
next->previous = current;
ffc0a864: 91 49 00 04 stw r10,4(r9)
ffc0a868: 7d 2a 4b 78 mr r10,r9
current = next;
next = (Chain_Node *)
ffc0a86c: 7d 29 32 14 add r9,r9,r6
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
ffc0a870: 42 00 ff f0 bdnz+ ffc0a860 <_Chain_Initialize+0x24>
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/isr.h>
void _Chain_Initialize(
ffc0a874: 7c c6 39 d6 mullw r6,r6,r7
ffc0a878: 7c c4 32 14 add r6,r4,r6
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
ffc0a87c: 91 06 00 00 stw r8,0(r6)
tail->previous = current;
ffc0a880: 90 c3 00 08 stw r6,8(r3)
ffc0a884: 4e 80 00 20 blr
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
ffc0a888: 7c 66 1b 78 mr r6,r3 <== NOT EXECUTED
ffc0a88c: 4b ff ff f0 b ffc0a87c <_Chain_Initialize+0x40> <== NOT EXECUTED
ffc0952c <_Event_Surrender>:
rtems_event_set event_in,
Event_Control *event,
Thread_blocking_operation_States *sync_state,
States_Control wait_state
)
{
ffc0952c: 94 21 ff f0 stwu r1,-16(r1)
ffc09530: 7c 08 02 a6 mflr r0
ffc09534: 90 01 00 14 stw r0,20(r1)
ffc09538: 93 e1 00 0c stw r31,12(r1)
ffc0953c: 7c 7f 1b 78 mr r31,r3
rtems_event_set pending_events;
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
option_set = the_thread->Wait.option;
ffc09540: 81 63 00 30 lwz r11,48(r3)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc09544: 7d 40 00 a6 mfmsr r10
ffc09548: 7d 30 42 a6 mfsprg r9,0
ffc0954c: 7d 49 48 78 andc r9,r10,r9
ffc09550: 7d 20 01 24 mtmsr r9
RTEMS_INLINE_ROUTINE void _Event_sets_Post(
rtems_event_set the_new_events,
rtems_event_set *the_event_set
)
{
*the_event_set |= the_new_events;
ffc09554: 81 25 00 00 lwz r9,0(r5)
ffc09558: 7c 84 4b 78 or r4,r4,r9
ffc0955c: 90 85 00 00 stw r4,0(r5)
_ISR_Disable( level );
_Event_sets_Post( event_in, &event->pending_events );
pending_events = event->pending_events;
event_condition = the_thread->Wait.count;
ffc09560: 81 23 00 24 lwz r9,36(r3)
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
ffc09564: 7c 88 48 39 and. r8,r4,r9
ffc09568: 41 82 00 d4 beq- ffc0963c <_Event_Surrender+0x110>
/*
* 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() &&
ffc0956c: 3c 60 00 00 lis r3,0
ffc09570: 38 63 31 a0 addi r3,r3,12704
ffc09574: 80 03 00 08 lwz r0,8(r3)
ffc09578: 2f 80 00 00 cmpwi cr7,r0,0
ffc0957c: 41 9e 00 10 beq- cr7,ffc0958c <_Event_Surrender+0x60>
ffc09580: 80 63 00 10 lwz r3,16(r3)
ffc09584: 7f 9f 18 00 cmpw cr7,r31,r3
ffc09588: 41 9e 00 74 beq- cr7,ffc095fc <_Event_Surrender+0xd0>
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
ffc0958c: 80 df 00 10 lwz r6,16(r31)
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Are_set( the_thread->current_state, wait_state ) ) {
ffc09590: 7c e3 30 39 and. r3,r7,r6
ffc09594: 41 82 00 a8 beq- ffc0963c <_Event_Surrender+0x110>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
ffc09598: 7f 89 40 00 cmpw cr7,r9,r8
ffc0959c: 41 9e 00 0c beq- cr7,ffc095a8 <_Event_Surrender+0x7c>
ffc095a0: 71 69 00 02 andi. r9,r11,2
ffc095a4: 41 82 00 98 beq- ffc0963c <_Event_Surrender+0x110> <== NEVER TAKEN
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
ffc095a8: 81 3f 00 28 lwz r9,40(r31)
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) );
ffc095ac: 7c 84 40 78 andc r4,r4,r8
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
ffc095b0: 38 e0 00 00 li r7,0
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Are_set( the_thread->current_state, wait_state ) ) {
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
event->pending_events = _Event_sets_Clear(
ffc095b4: 90 85 00 00 stw r4,0(r5)
pending_events,
seized_events
);
the_thread->Wait.count = 0;
ffc095b8: 90 ff 00 24 stw r7,36(r31)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
ffc095bc: 91 09 00 00 stw r8,0(r9)
static inline void ppc_interrupt_flash( uint32_t level )
{
uint32_t current_level;
__asm__ volatile (
ffc095c0: 7d 20 00 a6 mfmsr r9
ffc095c4: 7d 40 01 24 mtmsr r10
ffc095c8: 7d 20 01 24 mtmsr r9
_ISR_Flash( level );
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
ffc095cc: 81 3f 00 50 lwz r9,80(r31)
ffc095d0: 2f 89 00 02 cmpwi cr7,r9,2
ffc095d4: 41 9e 00 80 beq- cr7,ffc09654 <_Event_Surrender+0x128>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc095d8: 7d 40 01 24 mtmsr r10
}
return;
}
}
_ISR_Enable( level );
}
ffc095dc: 80 01 00 14 lwz r0,20(r1)
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
ffc095e0: 7f e3 fb 78 mr r3,r31
ffc095e4: 3c 80 10 07 lis r4,4103
ffc095e8: 83 e1 00 0c lwz r31,12(r1)
ffc095ec: 7c 08 03 a6 mtlr r0
ffc095f0: 60 84 ff f8 ori r4,r4,65528
ffc095f4: 38 21 00 10 addi r1,r1,16
ffc095f8: 48 00 2f c8 b ffc0c5c0 <_Thread_Clear_state>
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
ffc095fc: 80 66 00 00 lwz r3,0(r6)
ffc09600: 38 63 ff ff addi r3,r3,-1
/*
* 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 ) &&
ffc09604: 2b 83 00 01 cmplwi cr7,r3,1
ffc09608: 41 9d ff 84 bgt+ cr7,ffc0958c <_Event_Surrender+0x60>
((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(*sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
ffc0960c: 7f 89 40 00 cmpw cr7,r9,r8
ffc09610: 41 9e 00 0c beq- cr7,ffc0961c <_Event_Surrender+0xf0>
ffc09614: 71 63 00 02 andi. r3,r11,2
ffc09618: 41 82 00 24 beq- ffc0963c <_Event_Surrender+0x110> <== NEVER TAKEN
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
ffc0961c: 81 3f 00 28 lwz r9,40(r31)
ffc09620: 7c 84 40 78 andc r4,r4,r8
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
event->pending_events = _Event_sets_Clear(
pending_events,
seized_events
);
the_thread->Wait.count = 0;
ffc09624: 38 e0 00 00 li r7,0
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((*sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(*sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
event->pending_events = _Event_sets_Clear(
ffc09628: 90 85 00 00 stw r4,0(r5)
pending_events,
seized_events
);
the_thread->Wait.count = 0;
ffc0962c: 90 ff 00 24 stw r7,36(r31)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
ffc09630: 91 09 00 00 stw r8,0(r9)
*sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
ffc09634: 39 20 00 03 li r9,3
ffc09638: 91 26 00 00 stw r9,0(r6)
ffc0963c: 7d 40 01 24 mtmsr r10
}
return;
}
}
_ISR_Enable( level );
}
ffc09640: 80 01 00 14 lwz r0,20(r1)
ffc09644: 83 e1 00 0c lwz r31,12(r1)
ffc09648: 7c 08 03 a6 mtlr r0
ffc0964c: 38 21 00 10 addi r1,r1,16
ffc09650: 4e 80 00 20 blr
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
ffc09654: 39 20 00 03 li r9,3
ffc09658: 91 3f 00 50 stw r9,80(r31)
ffc0965c: 7d 40 01 24 mtmsr r10
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
ffc09660: 38 7f 00 48 addi r3,r31,72
ffc09664: 48 00 45 c9 bl ffc0dc2c <_Watchdog_Remove>
ffc09668: 4b ff ff 74 b ffc095dc <_Event_Surrender+0xb0>
ffc0966c <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *arg
)
{
ffc0966c: 94 21 ff e0 stwu r1,-32(r1)
ffc09670: 7c 08 02 a6 mflr r0
ffc09674: 93 e1 00 1c stw r31,28(r1)
ffc09678: 7c 9f 23 78 mr r31,r4
ISR_Level level;
Thread_blocking_operation_States *sync_state;
sync_state = arg;
the_thread = _Thread_Get( id, &location );
ffc0967c: 38 81 00 08 addi r4,r1,8
void _Event_Timeout(
Objects_Id id,
void *arg
)
{
ffc09680: 90 01 00 24 stw r0,36(r1)
ISR_Level level;
Thread_blocking_operation_States *sync_state;
sync_state = arg;
the_thread = _Thread_Get( id, &location );
ffc09684: 48 00 34 59 bl ffc0cadc <_Thread_Get>
switch ( location ) {
ffc09688: 81 21 00 08 lwz r9,8(r1)
ffc0968c: 2f 89 00 00 cmpwi cr7,r9,0
ffc09690: 40 9e 00 50 bne- cr7,ffc096e0 <_Event_Timeout+0x74> <== NEVER TAKEN
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc09694: 7d 40 00 a6 mfmsr r10
ffc09698: 7d 10 42 a6 mfsprg r8,0
ffc0969c: 7d 48 40 78 andc r8,r10,r8
ffc096a0: 7d 00 01 24 mtmsr r8
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
ffc096a4: 3d 00 00 00 lis r8,0
return;
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
ffc096a8: 81 08 31 b0 lwz r8,12720(r8)
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
ffc096ac: 91 23 00 24 stw r9,36(r3)
if ( _Thread_Is_executing( the_thread ) ) {
ffc096b0: 7f 83 40 00 cmpw cr7,r3,r8
ffc096b4: 41 9e 00 40 beq- cr7,ffc096f4 <_Event_Timeout+0x88>
if ( *sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
*sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
ffc096b8: 39 20 00 06 li r9,6
ffc096bc: 91 23 00 34 stw r9,52(r3)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc096c0: 7d 40 01 24 mtmsr r10
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
ffc096c4: 3c 80 10 07 lis r4,4103
ffc096c8: 60 84 ff f8 ori r4,r4,65528
ffc096cc: 48 00 2e f5 bl ffc0c5c0 <_Thread_Clear_state>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc096d0: 3d 20 00 00 lis r9,0
ffc096d4: 81 49 28 68 lwz r10,10344(r9)
--level;
ffc096d8: 39 4a ff ff addi r10,r10,-1
_Thread_Dispatch_disable_level = level;
ffc096dc: 91 49 28 68 stw r10,10344(r9)
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
ffc096e0: 80 01 00 24 lwz r0,36(r1)
ffc096e4: 83 e1 00 1c lwz r31,28(r1)
ffc096e8: 7c 08 03 a6 mtlr r0
ffc096ec: 38 21 00 20 addi r1,r1,32
ffc096f0: 4e 80 00 20 blr
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( *sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
ffc096f4: 81 3f 00 00 lwz r9,0(r31)
ffc096f8: 2f 89 00 01 cmpwi cr7,r9,1
ffc096fc: 40 9e ff bc bne+ cr7,ffc096b8 <_Event_Timeout+0x4c>
*sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
ffc09700: 39 20 00 02 li r9,2
ffc09704: 91 3f 00 00 stw r9,0(r31)
ffc09708: 4b ff ff b0 b ffc096b8 <_Event_Timeout+0x4c>
ffc10768 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
ffc10768: 7c 87 23 78 mr r7,r4
ffc1076c: 7d 80 00 26 mfcr r12
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
ffc10770: 38 84 00 04 addi r4,r4,4
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
ffc10774: 94 21 ff e0 stwu r1,-32(r1)
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
ffc10778: 7f 87 20 40 cmplw cr7,r7,r4
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
ffc1077c: 7c 08 02 a6 mflr r0
ffc10780: 93 a1 00 14 stw r29,20(r1)
ffc10784: 7c 7d 1b 78 mr r29,r3
ffc10788: 90 01 00 24 stw r0,36(r1)
ffc1078c: 93 61 00 0c stw r27,12(r1)
ffc10790: 93 81 00 10 stw r28,16(r1)
ffc10794: 93 c1 00 18 stw r30,24(r1)
ffc10798: 93 e1 00 1c stw r31,28(r1)
ffc1079c: 91 81 00 08 stw r12,8(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;
ffc107a0: 81 63 00 10 lwz r11,16(r3)
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
ffc107a4: 41 9d 01 c8 bgt- cr7,ffc1096c <_Heap_Allocate_aligned_with_boundary+0x204>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
ffc107a8: 2c 06 00 00 cmpwi r6,0
ffc107ac: 40 82 01 a8 bne- ffc10954 <_Heap_Allocate_aligned_with_boundary+0x1ec>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
ffc107b0: 81 3d 00 08 lwz r9,8(r29)
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
ffc107b4: 7f 9d 48 00 cmpw cr7,r29,r9
ffc107b8: 41 9e 01 e4 beq- cr7,ffc1099c <_Heap_Allocate_aligned_with_boundary+0x234>
* 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 ) {
if ( alignment == 0 ) {
ffc107bc: 2c 85 00 00 cmpwi cr1,r5,0
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
ffc107c0: 3b c0 00 00 li r30,0
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
ffc107c4: 3b 6b 00 07 addi r27,r11,7
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
ffc107c8: 23 87 00 04 subfic r28,r7,4
ffc107cc: 48 00 00 24 b ffc107f0 <_Heap_Allocate_aligned_with_boundary+0x88>
* 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 ) {
if ( alignment == 0 ) {
ffc107d0: 40 86 00 7c bne- cr1,ffc1084c <_Heap_Allocate_aligned_with_boundary+0xe4>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
ffc107d4: 3b e9 00 08 addi r31,r9,8
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
ffc107d8: 2f 9f 00 00 cmpwi cr7,r31,0
);
}
}
/* Statistics */
++search_count;
ffc107dc: 3b de 00 01 addi r30,r30,1
if ( alloc_begin != 0 ) {
ffc107e0: 40 9e 01 38 bne- cr7,ffc10918 <_Heap_Allocate_aligned_with_boundary+0x1b0>
break;
}
block = block->next;
ffc107e4: 81 29 00 08 lwz r9,8(r9)
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
ffc107e8: 7f 9d 48 00 cmpw cr7,r29,r9
ffc107ec: 41 9e 00 20 beq- cr7,ffc1080c <_Heap_Allocate_aligned_with_boundary+0xa4>
/*
* 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 ) {
ffc107f0: 81 49 00 04 lwz r10,4(r9)
ffc107f4: 7f 84 50 40 cmplw cr7,r4,r10
ffc107f8: 41 bc ff d8 blt- cr7,ffc107d0 <_Heap_Allocate_aligned_with_boundary+0x68>
if ( alloc_begin != 0 ) {
break;
}
block = block->next;
ffc107fc: 81 29 00 08 lwz r9,8(r9)
);
}
}
/* Statistics */
++search_count;
ffc10800: 3b de 00 01 addi r30,r30,1
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
ffc10804: 7f 9d 48 00 cmpw cr7,r29,r9
ffc10808: 40 9e ff e8 bne+ cr7,ffc107f0 <_Heap_Allocate_aligned_with_boundary+0x88>
);
}
}
/* Statistics */
++search_count;
ffc1080c: 38 60 00 00 li r3,0
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
ffc10810: 81 3d 00 44 lwz r9,68(r29)
ffc10814: 7f 89 f0 40 cmplw cr7,r9,r30
ffc10818: 40 9c 00 08 bge- cr7,ffc10820 <_Heap_Allocate_aligned_with_boundary+0xb8>
stats->max_search = search_count;
ffc1081c: 93 dd 00 44 stw r30,68(r29)
}
return (void *) alloc_begin;
}
ffc10820: 80 01 00 24 lwz r0,36(r1)
ffc10824: 81 81 00 08 lwz r12,8(r1)
ffc10828: 7c 08 03 a6 mtlr r0
ffc1082c: 83 61 00 0c lwz r27,12(r1)
ffc10830: 83 81 00 10 lwz r28,16(r1)
ffc10834: 7d 80 81 20 mtcrf 8,r12
ffc10838: 83 a1 00 14 lwz r29,20(r1)
ffc1083c: 83 c1 00 18 lwz r30,24(r1)
ffc10840: 83 e1 00 1c lwz r31,28(r1)
ffc10844: 38 21 00 20 addi r1,r1,32
ffc10848: 4e 80 00 20 blr
- 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;
ffc1084c: 55 4a 00 3c rlwinm r10,r10,0,0,30
ffc10850: 80 1d 00 14 lwz r0,20(r29)
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;
ffc10854: 7d 49 52 14 add r10,r9,r10
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;
ffc10858: 7f fc 52 14 add r31,r28,r10
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc1085c: 7f ff 2b 96 divwu r31,r31,r5
ffc10860: 7f ff 29 d6 mullw r31,r31,r5
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;
ffc10864: 7d 00 d8 50 subf r8,r0,r27
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
ffc10868: 7d 48 52 14 add r10,r8,r10
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 ) {
ffc1086c: 7f 8a f8 40 cmplw cr7,r10,r31
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
ffc10870: 39 89 00 08 addi r12,r9,8
ffc10874: 40 9c 00 0c bge- cr7,ffc10880 <_Heap_Allocate_aligned_with_boundary+0x118>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc10878: 7d 4a 2b 96 divwu r10,r10,r5
ffc1087c: 7f ea 29 d6 mullw r31,r10,r5
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
ffc10880: 41 82 00 60 beq- ffc108e0 <_Heap_Allocate_aligned_with_boundary+0x178>
/* 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;
ffc10884: 7d 1f 3a 14 add r8,r31,r7
ffc10888: 7d 48 33 96 divwu r10,r8,r6
ffc1088c: 7d 4a 31 d6 mullw r10,r10,r6
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
ffc10890: 7c 6c 3a 14 add r3,r12,r7
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
ffc10894: 7f 9f 50 40 cmplw cr7,r31,r10
ffc10898: 40 9c 00 48 bge- cr7,ffc108e0 <_Heap_Allocate_aligned_with_boundary+0x178>
ffc1089c: 7f 88 50 40 cmplw cr7,r8,r10
ffc108a0: 40 9d 00 40 ble- cr7,ffc108e0 <_Heap_Allocate_aligned_with_boundary+0x178>
if ( boundary_line < boundary_floor ) {
ffc108a4: 7f 83 50 40 cmplw cr7,r3,r10
ffc108a8: 40 bd 00 10 ble+ cr7,ffc108b8 <_Heap_Allocate_aligned_with_boundary+0x150>
ffc108ac: 48 00 00 a0 b ffc1094c <_Heap_Allocate_aligned_with_boundary+0x1e4>
/* 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 ) {
ffc108b0: 40 91 00 30 ble- cr4,ffc108e0 <_Heap_Allocate_aligned_with_boundary+0x178>
if ( boundary_line < boundary_floor ) {
ffc108b4: 41 99 00 98 bgt- cr6,ffc1094c <_Heap_Allocate_aligned_with_boundary+0x1e4><== NEVER TAKEN
return 0;
}
alloc_begin = boundary_line - alloc_size;
ffc108b8: 7f e7 50 50 subf r31,r7,r10
ffc108bc: 7f ff 2b 96 divwu r31,r31,r5
ffc108c0: 7f ff 29 d6 mullw r31,r31,r5
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
ffc108c4: 7d 1f 3a 14 add r8,r31,r7
ffc108c8: 7d 48 33 96 divwu r10,r8,r6
ffc108cc: 7d 4a 31 d6 mullw r10,r10,r6
/* 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 ) {
ffc108d0: 7f 9f 50 40 cmplw cr7,r31,r10
ffc108d4: 7e 08 50 40 cmplw cr4,r8,r10
if ( boundary_line < boundary_floor ) {
ffc108d8: 7f 03 50 40 cmplw cr6,r3,r10
/* 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 ) {
ffc108dc: 41 9c ff d4 blt+ cr7,ffc108b0 <_Heap_Allocate_aligned_with_boundary+0x148>
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 ) {
ffc108e0: 7f 8c f8 40 cmplw cr7,r12,r31
ffc108e4: 41 9d 00 68 bgt- cr7,ffc1094c <_Heap_Allocate_aligned_with_boundary+0x1e4>
ffc108e8: 7d 5f 5b 96 divwu r10,r31,r11
ffc108ec: 7d 4a 59 d6 mullw r10,r10,r11
ffc108f0: 21 09 ff f8 subfic r8,r9,-8
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;
ffc108f4: 7d 48 52 14 add r10,r8,r10
if ( free_size >= min_block_size || free_size == 0 ) {
ffc108f8: 7f 80 50 40 cmplw cr7,r0,r10
ffc108fc: 40 bd fe dc ble- cr7,ffc107d8 <_Heap_Allocate_aligned_with_boundary+0x70>
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
return 0;
ffc10900: 31 4a ff ff addic r10,r10,-1
ffc10904: 7d 4a 51 10 subfe r10,r10,r10
ffc10908: 7f ff 50 38 and r31,r31,r10
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
ffc1090c: 2f 9f 00 00 cmpwi cr7,r31,0
);
}
}
/* Statistics */
++search_count;
ffc10910: 3b de 00 01 addi r30,r30,1
if ( alloc_begin != 0 ) {
ffc10914: 41 9e fe d0 beq+ cr7,ffc107e4 <_Heap_Allocate_aligned_with_boundary+0x7c>
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
ffc10918: 81 5d 00 48 lwz r10,72(r29)
stats->searches += search_count;
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
ffc1091c: 7f a3 eb 78 mr r3,r29
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
stats->searches += search_count;
ffc10920: 81 1d 00 4c lwz r8,76(r29)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
ffc10924: 7d 24 4b 78 mr r4,r9
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
ffc10928: 39 4a 00 01 addi r10,r10,1
stats->searches += search_count;
ffc1092c: 7d 08 f2 14 add r8,r8,r30
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
ffc10930: 91 5d 00 48 stw r10,72(r29)
stats->searches += search_count;
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
ffc10934: 7f e5 fb 78 mr r5,r31
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
stats->searches += search_count;
ffc10938: 91 1d 00 4c stw r8,76(r29)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
ffc1093c: 7c e6 3b 78 mr r6,r7
ffc10940: 4b ff a8 c5 bl ffc0b204 <_Heap_Block_allocate>
ffc10944: 7f e3 fb 78 mr r3,r31
ffc10948: 4b ff fe c8 b ffc10810 <_Heap_Allocate_aligned_with_boundary+0xa8>
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
return 0;
ffc1094c: 3b e0 00 00 li r31,0
ffc10950: 4b ff fe 88 b ffc107d8 <_Heap_Allocate_aligned_with_boundary+0x70>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
ffc10954: 7f 87 30 40 cmplw cr7,r7,r6
ffc10958: 41 9d 00 14 bgt- cr7,ffc1096c <_Heap_Allocate_aligned_with_boundary+0x204>
return NULL;
}
if ( alignment == 0 ) {
ffc1095c: 2f 85 00 00 cmpwi cr7,r5,0
ffc10960: 40 be fe 50 bne- cr7,ffc107b0 <_Heap_Allocate_aligned_with_boundary+0x48>
alignment = page_size;
ffc10964: 7d 65 5b 78 mr r5,r11
ffc10968: 4b ff fe 48 b ffc107b0 <_Heap_Allocate_aligned_with_boundary+0x48>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
ffc1096c: 80 01 00 24 lwz r0,36(r1)
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
/* Integer overflow occured */
return NULL;
ffc10970: 38 60 00 00 li r3,0
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
ffc10974: 81 81 00 08 lwz r12,8(r1)
ffc10978: 7c 08 03 a6 mtlr r0
ffc1097c: 83 61 00 0c lwz r27,12(r1)
ffc10980: 83 81 00 10 lwz r28,16(r1)
ffc10984: 7d 80 81 20 mtcrf 8,r12
ffc10988: 83 a1 00 14 lwz r29,20(r1)
ffc1098c: 83 c1 00 18 lwz r30,24(r1)
ffc10990: 83 e1 00 1c lwz r31,28(r1)
ffc10994: 38 21 00 20 addi r1,r1,32
ffc10998: 4e 80 00 20 blr
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
ffc1099c: 3b c0 00 00 li r30,0
ffc109a0: 4b ff fe 6c b ffc1080c <_Heap_Allocate_aligned_with_boundary+0xa4>
ffc104fc <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t unused __attribute__((unused))
)
{
ffc104fc: 94 21 ff c0 stwu r1,-64(r1)
ffc10500: 7d 80 00 26 mfcr r12
ffc10504: 7c 08 02 a6 mflr r0
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;
ffc10508: 39 20 00 00 li r9,0
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t unused __attribute__((unused))
)
{
ffc1050c: 93 a1 00 34 stw r29,52(r1)
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
ffc10510: 7f a4 2a 14 add r29,r4,r5
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 ) {
ffc10514: 7f 84 e8 40 cmplw cr7,r4,r29
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t unused __attribute__((unused))
)
{
ffc10518: 90 01 00 44 stw r0,68(r1)
ffc1051c: 93 41 00 28 stw r26,40(r1)
ffc10520: 93 61 00 2c stw r27,44(r1)
ffc10524: 93 81 00 30 stw r28,48(r1)
ffc10528: 93 c1 00 38 stw r30,56(r1)
ffc1052c: 7c 7e 1b 78 mr r30,r3
ffc10530: 93 e1 00 3c stw r31,60(r1)
ffc10534: 7c 9f 23 78 mr r31,r4
ffc10538: 93 01 00 20 stw r24,32(r1)
ffc1053c: 93 21 00 24 stw r25,36(r1)
ffc10540: 91 81 00 1c stw r12,28(r1)
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
ffc10544: 83 63 00 20 lwz r27,32(r3)
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;
ffc10548: 91 21 00 0c stw r9,12(r1)
Heap_Block *extend_last_block = NULL;
ffc1054c: 91 21 00 08 stw r9,8(r1)
uintptr_t const page_size = heap->page_size;
ffc10550: 83 83 00 10 lwz r28,16(r3)
uintptr_t const min_block_size = heap->min_block_size;
ffc10554: 80 c3 00 14 lwz r6,20(r3)
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;
ffc10558: 83 43 00 30 lwz r26,48(r3)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
ffc1055c: 40 9d 00 40 ble- cr7,ffc1059c <_Heap_Extend+0xa0>
/* Statistics */
stats->size += extended_size;
return extended_size;
}
ffc10560: 80 01 00 44 lwz r0,68(r1)
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 0;
ffc10564: 38 60 00 00 li r3,0
/* Statistics */
stats->size += extended_size;
return extended_size;
}
ffc10568: 81 81 00 1c lwz r12,28(r1)
ffc1056c: 7c 08 03 a6 mtlr r0
ffc10570: 83 01 00 20 lwz r24,32(r1)
ffc10574: 83 21 00 24 lwz r25,36(r1)
ffc10578: 7d 80 81 20 mtcrf 8,r12
ffc1057c: 83 41 00 28 lwz r26,40(r1)
ffc10580: 83 61 00 2c lwz r27,44(r1)
ffc10584: 83 81 00 30 lwz r28,48(r1)
ffc10588: 83 a1 00 34 lwz r29,52(r1)
ffc1058c: 83 c1 00 38 lwz r30,56(r1)
ffc10590: 83 e1 00 3c lwz r31,60(r1)
ffc10594: 38 21 00 40 addi r1,r1,64
ffc10598: 4e 80 00 20 blr
if ( extend_area_end < extend_area_begin ) {
return 0;
}
extend_area_ok = _Heap_Get_first_and_last_block(
ffc1059c: 7c 83 23 78 mr r3,r4
ffc105a0: 38 e1 00 0c addi r7,r1,12
ffc105a4: 7c a4 2b 78 mr r4,r5
ffc105a8: 39 01 00 08 addi r8,r1,8
ffc105ac: 7f 85 e3 78 mr r5,r28
ffc105b0: 4b ff a6 7d bl ffc0ac2c <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
ffc105b4: 2f 83 00 00 cmpwi cr7,r3,0
ffc105b8: 41 be ff a8 beq- cr7,ffc10560 <_Heap_Extend+0x64>
ffc105bc: 7f 69 db 78 mr r9,r27
ffc105c0: 3b 00 00 00 li r24,0
ffc105c4: 38 a0 00 00 li r5,0
ffc105c8: 3b 20 00 00 li r25,0
ffc105cc: 38 c0 00 00 li r6,0
ffc105d0: 48 00 00 38 b ffc10608 <_Heap_Extend+0x10c>
return 0;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
ffc105d4: 7f 9d 50 40 cmplw cr7,r29,r10
ffc105d8: 40 9c 00 08 bge- cr7,ffc105e0 <_Heap_Extend+0xe4>
ffc105dc: 7d 25 4b 78 mr r5,r9
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
ffc105e0: 7f 8a f8 00 cmpw cr7,r10,r31
ffc105e4: 41 9e 00 64 beq- cr7,ffc10648 <_Heap_Extend+0x14c>
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
ffc105e8: 7f 9f 50 40 cmplw cr7,r31,r10
ffc105ec: 40 9d 00 08 ble- cr7,ffc105f4 <_Heap_Extend+0xf8>
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 )
ffc105f0: 7d 18 43 78 mr r24,r8
- 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;
ffc105f4: 81 28 00 04 lwz r9,4(r8)
ffc105f8: 55 29 00 3c rlwinm r9,r9,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc105fc: 7d 29 42 14 add r9,r9,r8
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
ffc10600: 7f 9b 48 00 cmpw cr7,r27,r9
ffc10604: 41 9e 00 60 beq- cr7,ffc10664 <_Heap_Extend+0x168>
return 0;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
ffc10608: 7f 89 d8 00 cmpw cr7,r9,r27
ffc1060c: 41 9e 01 a4 beq- cr7,ffc107b0 <_Heap_Extend+0x2b4>
ffc10610: 7d 27 4b 78 mr r7,r9
uintptr_t const sub_area_end = start_block->prev_size;
ffc10614: 81 49 00 00 lwz r10,0(r9)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc10618: 7d 0a e3 96 divwu r8,r10,r28
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
ffc1061c: 7f 9f 50 40 cmplw cr7,r31,r10
ffc10620: 7d 08 e1 d6 mullw r8,r8,r28
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
ffc10624: 39 08 ff f8 addi r8,r8,-8
ffc10628: 40 9c 00 0c bge- cr7,ffc10634 <_Heap_Extend+0x138>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
ffc1062c: 7f 87 e8 40 cmplw cr7,r7,r29
ffc10630: 41 bc ff 30 blt- cr7,ffc10560 <_Heap_Extend+0x64>
) {
return 0;
}
if ( extend_area_end == sub_area_begin ) {
ffc10634: 7f 87 e8 00 cmpw cr7,r7,r29
ffc10638: 40 9e ff 9c bne+ cr7,ffc105d4 <_Heap_Extend+0xd8>
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 ) {
ffc1063c: 7f 8a f8 00 cmpw cr7,r10,r31
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return 0;
}
if ( extend_area_end == sub_area_begin ) {
ffc10640: 7d 26 4b 78 mr r6,r9
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 ) {
ffc10644: 40 9e ff a4 bne+ cr7,ffc105e8 <_Heap_Extend+0xec> <== ALWAYS TAKEN
start_block->prev_size = extend_area_end;
ffc10648: 93 a9 00 00 stw r29,0(r9)
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 )
ffc1064c: 7d 19 43 78 mr r25,r8
- 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;
ffc10650: 81 28 00 04 lwz r9,4(r8)
ffc10654: 55 29 00 3c rlwinm r9,r9,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc10658: 7d 29 42 14 add r9,r9,r8
} 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 );
ffc1065c: 7f 9b 48 00 cmpw cr7,r27,r9
ffc10660: 40 9e ff a8 bne+ cr7,ffc10608 <_Heap_Extend+0x10c> <== NEVER TAKEN
if ( extend_area_begin < heap->area_begin ) {
ffc10664: 81 3e 00 18 lwz r9,24(r30)
ffc10668: 7f 9f 48 40 cmplw cr7,r31,r9
ffc1066c: 41 9c 01 4c blt- cr7,ffc107b8 <_Heap_Extend+0x2bc>
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
ffc10670: 81 3e 00 1c lwz r9,28(r30)
ffc10674: 7f 9d 48 40 cmplw cr7,r29,r9
ffc10678: 40 9d 00 08 ble- cr7,ffc10680 <_Heap_Extend+0x184>
heap->area_end = extend_area_end;
ffc1067c: 93 be 00 1c stw r29,28(r30)
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 ) {
ffc10680: 81 1e 00 20 lwz r8,32(r30)
} 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;
ffc10684: 81 21 00 0c lwz r9,12(r1)
ffc10688: 81 41 00 08 lwz r10,8(r1)
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 ) {
ffc1068c: 7f 88 48 40 cmplw cr7,r8,r9
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
ffc10690: 93 a9 00 00 stw r29,0(r9)
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
ffc10694: 7d 09 50 50 subf r8,r9,r10
(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;
ffc10698: 61 07 00 01 ori r7,r8,1
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
ffc1069c: 91 0a 00 00 stw r8,0(r10)
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
ffc106a0: 90 e9 00 04 stw r7,4(r9)
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;
extend_last_block->size_and_flag = 0;
ffc106a4: 38 e0 00 00 li r7,0
ffc106a8: 90 ea 00 04 stw r7,4(r10)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
ffc106ac: 40 9d 01 40 ble- cr7,ffc107ec <_Heap_Extend+0x2f0> <== ALWAYS TAKEN
heap->first_block = extend_first_block;
ffc106b0: 91 3e 00 20 stw r9,32(r30)
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
ffc106b4: 2e 06 00 00 cmpwi cr4,r6,0
ffc106b8: 41 92 01 48 beq- cr4,ffc10800 <_Heap_Extend+0x304>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
ffc106bc: 81 3e 00 10 lwz r9,16(r30)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
ffc106c0: 3b ff 00 08 addi r31,r31,8
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
ffc106c4: 7d 5f 4b 96 divwu r10,r31,r9
ffc106c8: 7d 4a 49 d6 mullw r10,r10,r9
if ( remainder != 0 ) {
ffc106cc: 7d 0a f8 51 subf. r8,r10,r31
ffc106d0: 41 82 00 0c beq- ffc106dc <_Heap_Extend+0x1e0> <== NEVER TAKEN
return value - remainder + alignment;
ffc106d4: 7f ff 4a 14 add r31,r31,r9
ffc106d8: 7f e8 f8 50 subf r31,r8,r31
uintptr_t const new_first_block_begin =
ffc106dc: 38 9f ff f8 addi r4,r31,-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;
ffc106e0: 81 26 00 00 lwz r9,0(r6)
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 =
ffc106e4: 7c c4 30 50 subf r6,r4,r6
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;
ffc106e8: 60 c6 00 01 ori r6,r6,1
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;
ffc106ec: 91 3f ff f8 stw r9,-8(r31)
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Free_block( heap, new_first_block );
ffc106f0: 7f c3 f3 78 mr r3,r30
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;
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
ffc106f4: 90 c4 00 04 stw r6,4(r4)
_Heap_Free_block( heap, new_first_block );
ffc106f8: 4b ff fd 95 bl ffc1048c <_Heap_Free_block>
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
ffc106fc: 2f 99 00 00 cmpwi cr7,r25,0
ffc10700: 41 9e 01 18 beq- cr7,ffc10818 <_Heap_Extend+0x31c>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc10704: 81 5e 00 10 lwz r10,16(r30)
)
{
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,
ffc10708: 39 3d ff f8 addi r9,r29,-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(
ffc1070c: 7d 39 48 50 subf r9,r25,r9
);
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)
ffc10710: 81 19 00 04 lwz r8,4(r25)
ffc10714: 7d 29 53 96 divwu r9,r9,r10
ffc10718: 7d 29 51 d6 mullw r9,r9,r10
| HEAP_PREV_BLOCK_USED;
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
ffc1071c: 7f c3 f3 78 mr r3,r30
);
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)
ffc10720: 7d 09 40 50 subf r8,r9,r8
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
ffc10724: 7d 49 ca 14 add r10,r9,r25
(last_block->size_and_flag - last_block_new_size)
| HEAP_PREV_BLOCK_USED;
ffc10728: 61 08 00 01 ori r8,r8,1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
ffc1072c: 91 0a 00 04 stw r8,4(r10)
(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 );
ffc10730: 7f 24 cb 78 mr r4,r25
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;
ffc10734: 81 59 00 04 lwz r10,4(r25)
ffc10738: 55 4a 07 fe clrlwi r10,r10,31
block->size_and_flag = size | flag;
ffc1073c: 7d 29 53 78 or r9,r9,r10
ffc10740: 91 39 00 04 stw r9,4(r25)
ffc10744: 4b ff fd 49 bl ffc1048c <_Heap_Free_block>
/* Statistics */
stats->size += extended_size;
return extended_size;
}
ffc10748: 81 3e 00 24 lwz r9,36(r30)
* 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(
ffc1074c: 81 1e 00 20 lwz r8,32(r30)
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;
ffc10750: 81 49 00 04 lwz r10,4(r9)
* 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(
ffc10754: 7d 09 40 50 subf r8,r9,r8
ffc10758: 80 01 00 44 lwz r0,68(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;
ffc1075c: 55 4a 07 fe clrlwi r10,r10,31
ffc10760: 81 81 00 1c lwz r12,28(r1)
block->size_and_flag = size | flag;
ffc10764: 7d 4a 43 78 or r10,r10,r8
ffc10768: 7c 08 03 a6 mtlr r0
ffc1076c: 91 49 00 04 stw r10,4(r9)
ffc10770: 7d 80 81 20 mtcrf 8,r12
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
ffc10774: 80 7e 00 30 lwz r3,48(r30)
/* Statistics */
stats->size += extended_size;
ffc10778: 81 3e 00 2c lwz r9,44(r30)
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
ffc1077c: 7c 7a 18 50 subf r3,r26,r3
/* Statistics */
stats->size += extended_size;
return extended_size;
}
ffc10780: 83 01 00 20 lwz r24,32(r1)
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
ffc10784: 7d 29 1a 14 add r9,r9,r3
return extended_size;
}
ffc10788: 83 21 00 24 lwz r25,36(r1)
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
ffc1078c: 91 3e 00 2c stw r9,44(r30)
return extended_size;
}
ffc10790: 83 41 00 28 lwz r26,40(r1)
ffc10794: 83 61 00 2c lwz r27,44(r1)
ffc10798: 83 81 00 30 lwz r28,48(r1)
ffc1079c: 83 a1 00 34 lwz r29,52(r1)
ffc107a0: 83 c1 00 38 lwz r30,56(r1)
ffc107a4: 83 e1 00 3c lwz r31,60(r1)
ffc107a8: 38 21 00 40 addi r1,r1,64
ffc107ac: 4e 80 00 20 blr
return 0;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
ffc107b0: 80 fe 00 18 lwz r7,24(r30)
ffc107b4: 4b ff fe 60 b ffc10614 <_Heap_Extend+0x118>
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 ) {
ffc107b8: 81 1e 00 20 lwz r8,32(r30)
} 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;
ffc107bc: 81 21 00 0c lwz r9,12(r1)
ffc107c0: 81 41 00 08 lwz r10,8(r1)
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 ) {
ffc107c4: 7f 88 48 40 cmplw cr7,r8,r9
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;
ffc107c8: 93 fe 00 18 stw r31,24(r30)
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
ffc107cc: 7d 09 50 50 subf r8,r9,r10
(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;
ffc107d0: 61 07 00 01 ori r7,r8,1
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
ffc107d4: 93 a9 00 00 stw r29,0(r9)
extend_first_block->size_and_flag =
ffc107d8: 90 e9 00 04 stw r7,4(r9)
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;
extend_last_block->size_and_flag = 0;
ffc107dc: 38 e0 00 00 li r7,0
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
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;
ffc107e0: 91 0a 00 00 stw r8,0(r10)
extend_last_block->size_and_flag = 0;
ffc107e4: 90 ea 00 04 stw r7,4(r10)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
ffc107e8: 41 bd fe c8 bgt- cr7,ffc106b0 <_Heap_Extend+0x1b4> <== ALWAYS TAKEN
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
ffc107ec: 81 3e 00 24 lwz r9,36(r30)
ffc107f0: 7f 89 50 40 cmplw cr7,r9,r10
ffc107f4: 40 bc fe c0 bge- cr7,ffc106b4 <_Heap_Extend+0x1b8>
heap->last_block = extend_last_block;
ffc107f8: 91 5e 00 24 stw r10,36(r30)
ffc107fc: 4b ff fe b8 b ffc106b4 <_Heap_Extend+0x1b8>
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
ffc10800: 2f 85 00 00 cmpwi cr7,r5,0
ffc10804: 41 be fe f8 beq- cr7,ffc106fc <_Heap_Extend+0x200>
{
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;
ffc10808: 7c aa 28 50 subf r5,r10,r5
ffc1080c: 60 a5 00 01 ori r5,r5,1
)
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
ffc10810: 90 aa 00 04 stw r5,4(r10)
ffc10814: 4b ff fe e8 b ffc106fc <_Heap_Extend+0x200>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
ffc10818: 2f 98 00 00 cmpwi cr7,r24,0
ffc1081c: 41 9e 00 2c beq- cr7,ffc10848 <_Heap_Extend+0x34c>
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;
ffc10820: 81 38 00 04 lwz r9,4(r24)
ffc10824: 55 2a 07 fe clrlwi r10,r9,31
)
{
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 );
ffc10828: 81 21 00 0c lwz r9,12(r1)
ffc1082c: 7d 38 48 50 subf r9,r24,r9
block->size_and_flag = size | flag;
ffc10830: 7d 4a 4b 78 or r10,r10,r9
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
ffc10834: 81 21 00 08 lwz r9,8(r1)
ffc10838: 91 58 00 04 stw r10,4(r24)
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
ffc1083c: 81 49 00 04 lwz r10,4(r9)
ffc10840: 61 4a 00 01 ori r10,r10,1
ffc10844: 91 49 00 04 stw r10,4(r9)
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
ffc10848: 40 92 ff 00 bne+ cr4,ffc10748 <_Heap_Extend+0x24c>
_Heap_Free_block( heap, extend_first_block );
ffc1084c: 80 81 00 0c lwz r4,12(r1)
ffc10850: 7f c3 f3 78 mr r3,r30
ffc10854: 4b ff fc 39 bl ffc1048c <_Heap_Free_block>
ffc10858: 4b ff fe f0 b ffc10748 <_Heap_Extend+0x24c>
ffc109a4 <_Heap_Free>:
/*
* 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 ) {
ffc109a4: 2c 04 00 00 cmpwi r4,0
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
ffc109a8: 7c 69 1b 78 mr r9,r3
/*
* 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 ) {
ffc109ac: 41 82 00 dc beq- ffc10a88 <_Heap_Free+0xe4>
ffc109b0: 81 03 00 10 lwz r8,16(r3)
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
ffc109b4: 80 e3 00 20 lwz r7,32(r3)
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;
ffc109b8: 38 60 00 00 li r3,0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc109bc: 7d 44 43 96 divwu r10,r4,r8
ffc109c0: 7d 4a 41 d6 mullw r10,r10,r8
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
ffc109c4: 39 4a ff f8 addi r10,r10,-8
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;
ffc109c8: 7f 8a 38 40 cmplw cr7,r10,r7
ffc109cc: 4d 9c 00 20 bltlr cr7
ffc109d0: 80 c9 00 24 lwz r6,36(r9)
ffc109d4: 7f 8a 30 40 cmplw cr7,r10,r6
ffc109d8: 40 9d 00 08 ble- cr7,ffc109e0 <_Heap_Free+0x3c> <== ALWAYS TAKEN
ffc109dc: 4e 80 00 20 blr <== NOT EXECUTED
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
ffc109e0: 81 6a 00 04 lwz r11,4(r10)
- 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;
ffc109e4: 55 65 00 3c rlwinm r5,r11,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc109e8: 7d 05 52 14 add r8,r5,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;
ffc109ec: 7f 87 40 40 cmplw cr7,r7,r8
ffc109f0: 41 9d 00 94 bgt- cr7,ffc10a84 <_Heap_Free+0xe0> <== NEVER TAKEN
ffc109f4: 7f 86 40 40 cmplw cr7,r6,r8
ffc109f8: 41 9c 00 88 blt- cr7,ffc10a80 <_Heap_Free+0xdc> <== NEVER TAKEN
ffc109fc: 80 88 00 04 lwz r4,4(r8)
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
ffc10a00: 70 80 00 01 andi. r0,r4,1
ffc10a04: 41 82 00 8c beq- ffc10a90 <_Heap_Free+0xec>
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 ));
ffc10a08: 7f 86 40 00 cmpw cr7,r6,r8
- 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;
ffc10a0c: 54 84 00 3c rlwinm r4,r4,0,0,30
ffc10a10: 41 9e 00 84 beq- cr7,ffc10a94 <_Heap_Free+0xf0>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
ffc10a14: 7c 68 22 14 add r3,r8,r4
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;
ffc10a18: 80 63 00 04 lwz r3,4(r3)
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 ));
ffc10a1c: 70 60 00 01 andi. r0,r3,1
ffc10a20: 40 82 00 74 bne- ffc10a94 <_Heap_Free+0xf0>
if ( !_Heap_Is_prev_used( block ) ) {
ffc10a24: 71 60 00 01 andi. r0,r11,1
ffc10a28: 41 82 01 50 beq- ffc10b78 <_Heap_Free+0x1d4>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
ffc10a2c: 80 e8 00 08 lwz r7,8(r8)
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;
ffc10a30: 7c 84 2a 14 add r4,r4,r5
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
ffc10a34: 81 08 00 0c lwz r8,12(r8)
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;
ffc10a38: 60 86 00 01 ori r6,r4,1
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
ffc10a3c: 90 ea 00 08 stw r7,8(r10)
new_block->prev = prev;
ffc10a40: 91 0a 00 0c stw r8,12(r10)
next->prev = new_block;
prev->next = new_block;
ffc10a44: 91 48 00 08 stw r10,8(r8)
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
next->prev = new_block;
ffc10a48: 91 47 00 0c stw r10,12(r7)
ffc10a4c: 90 ca 00 04 stw r6,4(r10)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
ffc10a50: 7c 84 51 2e stwx r4,r4,r10
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
ffc10a54: 81 09 00 40 lwz r8,64(r9)
++stats->frees;
stats->free_size += block_size;
return( true );
ffc10a58: 38 60 00 01 li r3,1
}
}
/* Statistics */
--stats->used_blocks;
++stats->frees;
ffc10a5c: 81 49 00 50 lwz r10,80(r9)
stats->free_size += block_size;
ffc10a60: 80 e9 00 30 lwz r7,48(r9)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
ffc10a64: 39 08 ff ff addi r8,r8,-1
++stats->frees;
ffc10a68: 39 4a 00 01 addi r10,r10,1
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
ffc10a6c: 91 09 00 40 stw r8,64(r9)
++stats->frees;
stats->free_size += block_size;
ffc10a70: 7c a7 2a 14 add r5,r7,r5
}
}
/* Statistics */
--stats->used_blocks;
++stats->frees;
ffc10a74: 91 49 00 50 stw r10,80(r9)
stats->free_size += block_size;
ffc10a78: 90 a9 00 30 stw r5,48(r9)
return( true );
ffc10a7c: 4e 80 00 20 blr
ffc10a80: 4e 80 00 20 blr <== NOT EXECUTED
ffc10a84: 4e 80 00 20 blr <== NOT EXECUTED
* 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;
ffc10a88: 38 60 00 01 li r3,1
ffc10a8c: 4e 80 00 20 blr
ffc10a90: 4e 80 00 20 blr
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 ) ) {
ffc10a94: 71 63 00 01 andi. r3,r11,1
ffc10a98: 40 82 00 28 bne- ffc10ac0 <_Heap_Free+0x11c>
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
ffc10a9c: 39 80 00 00 li r12,0
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
uintptr_t const prev_size = block->prev_size;
ffc10aa0: 80 0a 00 00 lwz r0,0(r10)
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;
ffc10aa4: 38 60 00 00 li r3,0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc10aa8: 7d 60 50 50 subf r11,r0,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;
ffc10aac: 7f 87 58 40 cmplw cr7,r7,r11
ffc10ab0: 4d 9d 00 20 bgtlr cr7
ffc10ab4: 7f 86 58 40 cmplw cr7,r6,r11
ffc10ab8: 40 9c 00 54 bge- cr7,ffc10b0c <_Heap_Free+0x168> <== ALWAYS TAKEN
ffc10abc: 4e 80 00 20 blr <== NOT EXECUTED
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;
ffc10ac0: 80 e9 00 38 lwz r7,56(r9)
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;
ffc10ac4: 60 a4 00 01 ori r4,r5,1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
if ( stats->max_free_blocks < stats->free_blocks ) {
ffc10ac8: 80 c9 00 3c lwz r6,60(r9)
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;
ffc10acc: 38 e7 00 01 addi r7,r7,1
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;
ffc10ad0: 90 8a 00 04 stw r4,4(r10)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
if ( stats->max_free_blocks < stats->free_blocks ) {
ffc10ad4: 7f 87 30 40 cmplw cr7,r7,r6
} 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;
ffc10ad8: 80 88 00 04 lwz r4,4(r8)
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
ffc10adc: 80 c9 00 08 lwz r6,8(r9)
ffc10ae0: 54 84 00 3c rlwinm r4,r4,0,0,30
new_block->next = next;
new_block->prev = block_before;
ffc10ae4: 91 2a 00 0c stw r9,12(r10)
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
ffc10ae8: 90 ca 00 08 stw r6,8(r10)
ffc10aec: 90 88 00 04 stw r4,4(r8)
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
ffc10af0: 91 46 00 0c stw r10,12(r6)
next_block->prev_size = block_size;
ffc10af4: 7c a5 51 2e stwx r5,r5,r10
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
ffc10af8: 91 49 00 08 stw r10,8(r9)
/* Statistics */
++stats->free_blocks;
ffc10afc: 90 e9 00 38 stw r7,56(r9)
if ( stats->max_free_blocks < stats->free_blocks ) {
ffc10b00: 40 bd ff 54 ble- cr7,ffc10a54 <_Heap_Free+0xb0>
stats->max_free_blocks = stats->free_blocks;
ffc10b04: 90 e9 00 3c stw r7,60(r9)
ffc10b08: 4b ff ff 4c b ffc10a54 <_Heap_Free+0xb0>
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;
ffc10b0c: 80 eb 00 04 lwz r7,4(r11)
return( false );
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
ffc10b10: 70 e6 00 01 andi. r6,r7,1
ffc10b14: 41 82 00 60 beq- ffc10b74 <_Heap_Free+0x1d0> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
ffc10b18: 2f 8c 00 00 cmpwi cr7,r12,0
ffc10b1c: 41 9e 00 38 beq- cr7,ffc10b54 <_Heap_Free+0x1b0>
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
ffc10b20: 80 c9 00 38 lwz r6,56(r9)
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
ffc10b24: 7c 05 02 14 add r0,r5,r0
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
ffc10b28: 80 e8 00 08 lwz r7,8(r8)
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
ffc10b2c: 7c 80 22 14 add r4,r0,r4
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
ffc10b30: 81 48 00 0c lwz r10,12(r8)
}
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;
ffc10b34: 38 c6 ff ff addi r6,r6,-1
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
ffc10b38: 60 88 00 01 ori r8,r4,1
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
ffc10b3c: 90 ea 00 08 stw r7,8(r10)
next->prev = prev;
ffc10b40: 91 47 00 0c stw r10,12(r7)
}
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;
ffc10b44: 90 c9 00 38 stw r6,56(r9)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
ffc10b48: 91 0b 00 04 stw r8,4(r11)
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
ffc10b4c: 7c 84 59 2e stwx r4,r4,r11
ffc10b50: 4b ff ff 04 b ffc10a54 <_Heap_Free+0xb0>
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
ffc10b54: 7c 05 02 14 add r0,r5,r0
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
ffc10b58: 60 07 00 01 ori r7,r0,1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
ffc10b5c: 7c 05 51 2e stwx r0,r5,r10
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
ffc10b60: 90 eb 00 04 stw r7,4(r11)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
ffc10b64: 80 e8 00 04 lwz r7,4(r8)
ffc10b68: 54 e7 00 3c rlwinm r7,r7,0,0,30
ffc10b6c: 90 e8 00 04 stw r7,4(r8)
ffc10b70: 4b ff fe e4 b ffc10a54 <_Heap_Free+0xb0>
ffc10b74: 4e 80 00 20 blr <== NOT EXECUTED
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
ffc10b78: 39 80 00 01 li r12,1
ffc10b7c: 4b ff ff 24 b ffc10aa0 <_Heap_Free+0xfc>
ffc15dc0 <_Heap_Get_free_information>:
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
ffc15dc0: 81 23 00 08 lwz r9,8(r3)
)
{
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
ffc15dc4: 39 40 00 00 li r10,0
ffc15dc8: 91 44 00 00 stw r10,0(r4)
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
ffc15dcc: 38 e0 00 01 li r7,1
ffc15dd0: 7f 83 48 00 cmpw cr7,r3,r9
{
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
info->largest = 0;
ffc15dd4: 91 44 00 04 stw r10,4(r4)
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
ffc15dd8: 38 c0 00 00 li r6,0
ffc15ddc: 39 00 00 00 li r8,0
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
info->largest = 0;
info->total = 0;
ffc15de0: 91 44 00 08 stw r10,8(r4)
for(the_block = _Heap_Free_list_first(the_heap);
ffc15de4: 40 be 00 10 bne+ cr7,ffc15df4 <_Heap_Get_free_information+0x34><== ALWAYS TAKEN
ffc15de8: 4e 80 00 20 blr <== NOT EXECUTED
ffc15dec: 80 c4 00 04 lwz r6,4(r4)
ffc15df0: 7c a7 2b 78 mr r7,r5
- 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;
ffc15df4: 81 49 00 04 lwz r10,4(r9)
ffc15df8: 38 a7 00 01 addi r5,r7,1
ffc15dfc: 55 4a 00 3c rlwinm r10,r10,0,0,30
/* As we always coalesce free blocks, prev block must have been used. */
_HAssert(_Heap_Is_prev_used(the_block));
info->number++;
info->total += the_size;
if ( info->largest < the_size )
ffc15e00: 7f 8a 30 40 cmplw cr7,r10,r6
/* As we always coalesce free blocks, prev block must have been used. */
_HAssert(_Heap_Is_prev_used(the_block));
info->number++;
info->total += the_size;
ffc15e04: 7d 08 52 14 add r8,r8,r10
if ( info->largest < the_size )
ffc15e08: 40 9d 00 08 ble- cr7,ffc15e10 <_Heap_Get_free_information+0x50>
info->largest = the_size;
ffc15e0c: 91 44 00 04 stw r10,4(r4)
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
the_block != tail;
the_block = the_block->next)
ffc15e10: 81 29 00 08 lwz r9,8(r9)
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
ffc15e14: 7f 83 48 00 cmpw cr7,r3,r9
ffc15e18: 40 9e ff d4 bne+ cr7,ffc15dec <_Heap_Get_free_information+0x2c>
ffc15e1c: 90 e4 00 00 stw r7,0(r4)
ffc15e20: 91 04 00 08 stw r8,8(r4)
ffc15e24: 4e 80 00 20 blr
ffc0d448 <_Heap_Greedy_allocate>:
Heap_Block *_Heap_Greedy_allocate(
Heap_Control *heap,
const uintptr_t *block_sizes,
size_t block_count
)
{
ffc0d448: 94 21 ff e0 stwu r1,-32(r1)
ffc0d44c: 7c 08 02 a6 mflr r0
ffc0d450: 93 61 00 0c stw r27,12(r1)
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
ffc0d454: 7c bb 2b 79 mr. r27,r5
Heap_Block *_Heap_Greedy_allocate(
Heap_Control *heap,
const uintptr_t *block_sizes,
size_t block_count
)
{
ffc0d458: 93 c1 00 18 stw r30,24(r1)
ffc0d45c: 7c 7e 1b 78 mr r30,r3
ffc0d460: 90 01 00 24 stw r0,36(r1)
ffc0d464: 93 81 00 10 stw r28,16(r1)
ffc0d468: 93 a1 00 14 stw r29,20(r1)
ffc0d46c: 93 e1 00 1c stw r31,28(r1)
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
ffc0d470: 41 82 00 e0 beq- ffc0d550 <_Heap_Greedy_allocate+0x108>
#include "config.h"
#endif
#include <rtems/score/heap.h>
Heap_Block *_Heap_Greedy_allocate(
ffc0d474: 3b 84 ff fc addi r28,r4,-4
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
ffc0d478: 3b e0 00 00 li r31,0
const uintptr_t *block_sizes,
size_t block_count
)
{
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
Heap_Block *allocated_blocks = NULL;
ffc0d47c: 3b a0 00 00 li r29,0
* @brief See _Heap_Allocate_aligned_with_boundary() with alignment and
* boundary equals zero.
*/
RTEMS_INLINE_ROUTINE void *_Heap_Allocate( Heap_Control *heap, uintptr_t size )
{
return _Heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
ffc0d480: 84 9c 00 04 lwzu r4,4(r28)
ffc0d484: 7f c3 f3 78 mr r3,r30
ffc0d488: 38 a0 00 00 li r5,0
ffc0d48c: 38 c0 00 00 li r6,0
ffc0d490: 48 00 8f 19 bl ffc163a8 <_Heap_Allocate_aligned_with_boundary>
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
ffc0d494: 3b ff 00 01 addi r31,r31,1
void *next = _Heap_Allocate( heap, block_sizes [i] );
if ( next != NULL ) {
ffc0d498: 2c 03 00 00 cmpwi r3,0
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
ffc0d49c: 7f 9f d8 00 cmpw cr7,r31,r27
void *next = _Heap_Allocate( heap, block_sizes [i] );
if ( next != NULL ) {
ffc0d4a0: 41 82 00 1c beq- ffc0d4bc <_Heap_Greedy_allocate+0x74> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc0d4a4: 81 3e 00 10 lwz r9,16(r30)
ffc0d4a8: 7c 63 4b 96 divwu r3,r3,r9
ffc0d4ac: 7d 23 49 d6 mullw r9,r3,r9
Heap_Block *next_block = _Heap_Block_of_alloc_area(
(uintptr_t) next,
heap->page_size
);
next_block->next = allocated_blocks;
ffc0d4b0: 93 a9 00 00 stw r29,0(r9)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
ffc0d4b4: 39 29 ff f8 addi r9,r9,-8
ffc0d4b8: 7d 3d 4b 78 mr r29,r9
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
ffc0d4bc: 40 9e ff c4 bne+ cr7,ffc0d480 <_Heap_Greedy_allocate+0x38>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
ffc0d4c0: 83 fe 00 08 lwz r31,8(r30)
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
ffc0d4c4: 7f 9e f8 00 cmpw cr7,r30,r31
ffc0d4c8: 41 9e 00 90 beq- cr7,ffc0d558 <_Heap_Greedy_allocate+0x110><== NEVER TAKEN
ffc0d4cc: 3b 80 00 00 li r28,0
ffc0d4d0: 48 00 00 08 b ffc0d4d8 <_Heap_Greedy_allocate+0x90>
ffc0d4d4: 7d 3f 4b 78 mr r31,r9
- 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;
ffc0d4d8: 80 df 00 04 lwz r6,4(r31)
_Heap_Block_allocate(
ffc0d4dc: 7f e4 fb 78 mr r4,r31
ffc0d4e0: 38 bf 00 08 addi r5,r31,8
ffc0d4e4: 54 c6 00 3c rlwinm r6,r6,0,0,30
ffc0d4e8: 7f c3 f3 78 mr r3,r30
ffc0d4ec: 38 c6 ff f8 addi r6,r6,-8
ffc0d4f0: 48 00 03 e5 bl ffc0d8d4 <_Heap_Block_allocate>
current,
_Heap_Alloc_area_of_block( current ),
_Heap_Block_size( current ) - HEAP_BLOCK_HEADER_SIZE
);
current->next = blocks;
ffc0d4f4: 93 9f 00 08 stw r28,8(r31)
ffc0d4f8: 7f fc fb 78 mr r28,r31
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
ffc0d4fc: 81 3e 00 08 lwz r9,8(r30)
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
ffc0d500: 7f 9e 48 00 cmpw cr7,r30,r9
ffc0d504: 40 9e ff d0 bne+ cr7,ffc0d4d4 <_Heap_Greedy_allocate+0x8c>
current->next = blocks;
blocks = current;
}
while ( allocated_blocks != NULL ) {
ffc0d508: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0d50c: 41 9e 00 1c beq- cr7,ffc0d528 <_Heap_Greedy_allocate+0xe0>
current = allocated_blocks;
allocated_blocks = allocated_blocks->next;
ffc0d510: 7f a4 eb 78 mr r4,r29
ffc0d514: 87 a4 00 08 lwzu r29,8(r4)
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
ffc0d518: 7f c3 f3 78 mr r3,r30
ffc0d51c: 48 00 90 c9 bl ffc165e4 <_Heap_Free>
current->next = blocks;
blocks = current;
}
while ( allocated_blocks != NULL ) {
ffc0d520: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0d524: 40 9e ff ec bne+ cr7,ffc0d510 <_Heap_Greedy_allocate+0xc8>
allocated_blocks = allocated_blocks->next;
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
}
return blocks;
}
ffc0d528: 80 01 00 24 lwz r0,36(r1)
ffc0d52c: 7f e3 fb 78 mr r3,r31
ffc0d530: 83 61 00 0c lwz r27,12(r1)
ffc0d534: 7c 08 03 a6 mtlr r0
ffc0d538: 83 81 00 10 lwz r28,16(r1)
ffc0d53c: 83 a1 00 14 lwz r29,20(r1)
ffc0d540: 83 c1 00 18 lwz r30,24(r1)
ffc0d544: 83 e1 00 1c lwz r31,28(r1)
ffc0d548: 38 21 00 20 addi r1,r1,32
ffc0d54c: 4e 80 00 20 blr
const uintptr_t *block_sizes,
size_t block_count
)
{
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
Heap_Block *allocated_blocks = NULL;
ffc0d550: 3b a0 00 00 li r29,0
ffc0d554: 4b ff ff 6c b ffc0d4c0 <_Heap_Greedy_allocate+0x78>
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
ffc0d558: 3b e0 00 00 li r31,0 <== NOT EXECUTED
ffc0d55c: 4b ff ff c4 b ffc0d520 <_Heap_Greedy_allocate+0xd8> <== NOT EXECUTED
ffc0d560 <_Heap_Greedy_free>:
void _Heap_Greedy_free(
Heap_Control *heap,
Heap_Block *blocks
)
{
while ( blocks != NULL ) {
ffc0d560: 2c 04 00 00 cmpwi r4,0
void _Heap_Greedy_free(
Heap_Control *heap,
Heap_Block *blocks
)
{
ffc0d564: 94 21 ff f0 stwu r1,-16(r1)
ffc0d568: 7c 08 02 a6 mflr r0
ffc0d56c: 93 c1 00 08 stw r30,8(r1)
ffc0d570: 7c 7e 1b 78 mr r30,r3
ffc0d574: 90 01 00 14 stw r0,20(r1)
ffc0d578: 93 e1 00 0c stw r31,12(r1)
while ( blocks != NULL ) {
ffc0d57c: 41 82 00 1c beq- ffc0d598 <_Heap_Greedy_free+0x38> <== NEVER TAKEN
Heap_Block *current = blocks;
blocks = blocks->next;
ffc0d580: 87 e4 00 08 lwzu r31,8(r4)
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
ffc0d584: 7f c3 f3 78 mr r3,r30
ffc0d588: 48 00 90 5d bl ffc165e4 <_Heap_Free>
void _Heap_Greedy_free(
Heap_Control *heap,
Heap_Block *blocks
)
{
while ( blocks != NULL ) {
ffc0d58c: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0d590: 7f e4 fb 78 mr r4,r31
ffc0d594: 40 9e ff ec bne+ cr7,ffc0d580 <_Heap_Greedy_free+0x20>
Heap_Block *current = blocks;
blocks = blocks->next;
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
}
}
ffc0d598: 80 01 00 14 lwz r0,20(r1)
ffc0d59c: 83 c1 00 08 lwz r30,8(r1)
ffc0d5a0: 7c 08 03 a6 mtlr r0
ffc0d5a4: 83 e1 00 0c lwz r31,12(r1)
ffc0d5a8: 38 21 00 10 addi r1,r1,16
ffc0d5ac: 4e 80 00 20 blr
ffc15e94 <_Heap_Iterate>:
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
ffc15e94: 94 21 ff e8 stwu r1,-24(r1)
ffc15e98: 7c 08 02 a6 mflr r0
ffc15e9c: 90 01 00 1c stw r0,28(r1)
ffc15ea0: 93 c1 00 10 stw r30,16(r1)
Heap_Block *current = heap->first_block;
ffc15ea4: 81 23 00 20 lwz r9,32(r3)
Heap_Block *end = heap->last_block;
ffc15ea8: 83 c3 00 24 lwz r30,36(r3)
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
ffc15eac: 93 81 00 08 stw r28,8(r1)
ffc15eb0: 7c 9c 23 78 mr r28,r4
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
bool stop = false;
while ( !stop && current != end ) {
ffc15eb4: 7f 89 f0 00 cmpw cr7,r9,r30
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
ffc15eb8: 93 a1 00 0c stw r29,12(r1)
ffc15ebc: 7c bd 2b 78 mr r29,r5
ffc15ec0: 93 e1 00 14 stw r31,20(r1)
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
bool stop = false;
while ( !stop && current != end ) {
ffc15ec4: 40 be 00 0c bne+ cr7,ffc15ed0 <_Heap_Iterate+0x3c> <== ALWAYS TAKEN
ffc15ec8: 48 00 00 3c b ffc15f04 <_Heap_Iterate+0x70> <== NOT EXECUTED
ffc15ecc: 41 9a 00 38 beq- cr6,ffc15f04 <_Heap_Iterate+0x70>
ffc15ed0: 81 49 00 04 lwz r10,4(r9)
uintptr_t size = _Heap_Block_size( current );
Heap_Block *next = _Heap_Block_at( current, size );
bool used = _Heap_Is_prev_used( next );
stop = (*visitor)( current, size, used, visitor_arg );
ffc15ed4: 7d 23 4b 78 mr r3,r9
ffc15ed8: 7f a6 eb 78 mr r6,r29
ffc15edc: 7f 89 03 a6 mtctr r28
ffc15ee0: 55 44 00 3c rlwinm r4,r10,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc15ee4: 7f e9 22 14 add r31,r9,r4
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;
ffc15ee8: 80 bf 00 04 lwz r5,4(r31)
ffc15eec: 54 a5 07 fe clrlwi r5,r5,31
ffc15ef0: 4e 80 04 21 bctrl
ffc15ef4: 7f e9 fb 78 mr r9,r31
{
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
bool stop = false;
while ( !stop && current != end ) {
ffc15ef8: 2f 83 00 00 cmpwi cr7,r3,0
ffc15efc: 7f 1e f8 00 cmpw cr6,r30,r31
ffc15f00: 41 9e ff cc beq+ cr7,ffc15ecc <_Heap_Iterate+0x38> <== ALWAYS TAKEN
stop = (*visitor)( current, size, used, visitor_arg );
current = next;
}
}
ffc15f04: 80 01 00 1c lwz r0,28(r1)
ffc15f08: 83 81 00 08 lwz r28,8(r1)
ffc15f0c: 7c 08 03 a6 mtlr r0
ffc15f10: 83 a1 00 0c lwz r29,12(r1)
ffc15f14: 83 c1 00 10 lwz r30,16(r1)
ffc15f18: 83 e1 00 14 lwz r31,20(r1)
ffc15f1c: 38 21 00 18 addi r1,r1,24
ffc15f20: 4e 80 00 20 blr
ffc1e864 <_Heap_Size_of_alloc_area>:
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc1e864: 81 23 00 10 lwz r9,16(r3)
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
ffc1e868: 81 43 00 20 lwz r10,32(r3)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
ffc1e86c: 7d 04 4b 96 divwu r8,r4,r9
ffc1e870: 7d 28 49 d6 mullw r9,r8,r9
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
ffc1e874: 39 29 ff f8 addi r9,r9,-8
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;
ffc1e878: 7f 89 50 40 cmplw cr7,r9,r10
ffc1e87c: 41 9c 00 50 blt- cr7,ffc1e8cc <_Heap_Size_of_alloc_area+0x68>
ffc1e880: 81 03 00 24 lwz r8,36(r3)
ffc1e884: 7f 89 40 40 cmplw cr7,r9,r8
ffc1e888: 41 9d 00 44 bgt- cr7,ffc1e8cc <_Heap_Size_of_alloc_area+0x68>
- 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;
ffc1e88c: 80 e9 00 04 lwz r7,4(r9)
ffc1e890: 54 e7 00 3c rlwinm r7,r7,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc1e894: 7d 27 4a 14 add r9,r7,r9
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;
ffc1e898: 7f 8a 48 40 cmplw cr7,r10,r9
ffc1e89c: 41 9d 00 30 bgt- cr7,ffc1e8cc <_Heap_Size_of_alloc_area+0x68><== NEVER TAKEN
ffc1e8a0: 7f 88 48 40 cmplw cr7,r8,r9
ffc1e8a4: 41 9c 00 28 blt- cr7,ffc1e8cc <_Heap_Size_of_alloc_area+0x68><== 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;
ffc1e8a8: 81 49 00 04 lwz r10,4(r9)
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;
ffc1e8ac: 38 60 00 00 li r3,0
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 )
ffc1e8b0: 71 48 00 01 andi. r8,r10,1
ffc1e8b4: 41 82 00 20 beq- ffc1e8d4 <_Heap_Size_of_alloc_area+0x70><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
ffc1e8b8: 20 84 00 04 subfic r4,r4,4
ffc1e8bc: 7d 24 4a 14 add r9,r4,r9
ffc1e8c0: 91 25 00 00 stw r9,0(r5)
return true;
ffc1e8c4: 38 60 00 01 li r3,1
ffc1e8c8: 4e 80 00 20 blr
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;
ffc1e8cc: 38 60 00 00 li r3,0
ffc1e8d0: 4e 80 00 20 blr
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
ffc1e8d4: 4e 80 00 20 blr <== NOT EXECUTED
ffc0b974 <_Heap_Walk>:
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;
ffc0b974: 2f 85 00 00 cmpwi cr7,r5,0
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
ffc0b978: 94 21 ff a0 stwu r1,-96(r1)
ffc0b97c: 7c 08 02 a6 mflr r0
ffc0b980: 91 c1 00 18 stw r14,24(r1)
ffc0b984: 90 01 00 64 stw r0,100(r1)
ffc0b988: 92 e1 00 3c stw r23,60(r1)
ffc0b98c: 93 01 00 40 stw r24,64(r1)
ffc0b990: 7c 98 23 78 mr r24,r4
ffc0b994: 93 41 00 48 stw r26,72(r1)
ffc0b998: 93 61 00 4c stw r27,76(r1)
ffc0b99c: 93 e1 00 5c stw r31,92(r1)
ffc0b9a0: 7c 7f 1b 78 mr r31,r3
ffc0b9a4: 91 e1 00 1c stw r15,28(r1)
ffc0b9a8: 92 01 00 20 stw r16,32(r1)
ffc0b9ac: 92 21 00 24 stw r17,36(r1)
ffc0b9b0: 92 41 00 28 stw r18,40(r1)
ffc0b9b4: 92 61 00 2c stw r19,44(r1)
ffc0b9b8: 92 81 00 30 stw r20,48(r1)
ffc0b9bc: 92 a1 00 34 stw r21,52(r1)
ffc0b9c0: 92 c1 00 38 stw r22,56(r1)
ffc0b9c4: 93 21 00 44 stw r25,68(r1)
ffc0b9c8: 93 81 00 50 stw r28,80(r1)
ffc0b9cc: 93 a1 00 54 stw r29,84(r1)
ffc0b9d0: 93 c1 00 58 stw r30,88(r1)
uintptr_t const page_size = heap->page_size;
ffc0b9d4: 83 63 00 10 lwz r27,16(r3)
uintptr_t const min_block_size = heap->min_block_size;
ffc0b9d8: 81 c3 00 14 lwz r14,20(r3)
Heap_Block *const first_block = heap->first_block;
ffc0b9dc: 83 43 00 20 lwz r26,32(r3)
Heap_Block *const last_block = heap->last_block;
ffc0b9e0: 82 e3 00 24 lwz r23,36(r3)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
ffc0b9e4: 41 9e 00 78 beq- cr7,ffc0ba5c <_Heap_Walk+0xe8>
if ( !_System_state_Is_up( _System_state_Get() ) ) {
ffc0b9e8: 3d 20 00 00 lis r9,0
ffc0b9ec: 81 29 28 6c lwz r9,10348(r9)
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;
ffc0b9f0: 3f 20 ff c1 lis r25,-63
ffc0b9f4: 3b 39 b8 74 addi r25,r25,-18316
if ( !_System_state_Is_up( _System_state_Get() ) ) {
ffc0b9f8: 2f 89 00 03 cmpwi cr7,r9,3
return true;
ffc0b9fc: 38 60 00 01 li 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() ) ) {
ffc0ba00: 41 9e 00 78 beq- cr7,ffc0ba78 <_Heap_Walk+0x104> <== ALWAYS TAKEN
block = next_block;
} while ( block != first_block );
return true;
}
ffc0ba04: 80 01 00 64 lwz r0,100(r1)
ffc0ba08: 81 c1 00 18 lwz r14,24(r1)
ffc0ba0c: 7c 08 03 a6 mtlr r0
ffc0ba10: 81 e1 00 1c lwz r15,28(r1)
ffc0ba14: 82 01 00 20 lwz r16,32(r1)
ffc0ba18: 82 21 00 24 lwz r17,36(r1)
ffc0ba1c: 82 41 00 28 lwz r18,40(r1)
ffc0ba20: 82 61 00 2c lwz r19,44(r1)
ffc0ba24: 82 81 00 30 lwz r20,48(r1)
ffc0ba28: 82 a1 00 34 lwz r21,52(r1)
ffc0ba2c: 82 c1 00 38 lwz r22,56(r1)
ffc0ba30: 82 e1 00 3c lwz r23,60(r1)
ffc0ba34: 83 01 00 40 lwz r24,64(r1)
ffc0ba38: 83 21 00 44 lwz r25,68(r1)
ffc0ba3c: 83 41 00 48 lwz r26,72(r1)
ffc0ba40: 83 61 00 4c lwz r27,76(r1)
ffc0ba44: 83 81 00 50 lwz r28,80(r1)
ffc0ba48: 83 a1 00 54 lwz r29,84(r1)
ffc0ba4c: 83 c1 00 58 lwz r30,88(r1)
ffc0ba50: 83 e1 00 5c lwz r31,92(r1)
ffc0ba54: 38 21 00 60 addi r1,r1,96
ffc0ba58: 4e 80 00 20 blr
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() ) ) {
ffc0ba5c: 3d 20 00 00 lis r9,0
ffc0ba60: 81 29 28 6c lwz r9,10348(r9)
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;
ffc0ba64: 3f 20 ff c1 lis r25,-63
ffc0ba68: 3b 39 b8 70 addi r25,r25,-18320
if ( !_System_state_Is_up( _System_state_Get() ) ) {
ffc0ba6c: 2f 89 00 03 cmpwi cr7,r9,3
return true;
ffc0ba70: 38 60 00 01 li 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() ) ) {
ffc0ba74: 40 9e ff 90 bne+ cr7,ffc0ba04 <_Heap_Walk+0x90>
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)(
ffc0ba78: 80 ff 00 08 lwz r7,8(r31)
ffc0ba7c: 3c a0 ff c2 lis r5,-62
ffc0ba80: 81 5f 00 0c lwz r10,12(r31)
ffc0ba84: 7f 03 c3 78 mr r3,r24
ffc0ba88: 81 1f 00 18 lwz r8,24(r31)
ffc0ba8c: 38 80 00 00 li r4,0
ffc0ba90: 81 3f 00 1c lwz r9,28(r31)
ffc0ba94: 38 a5 a8 b0 addi r5,r5,-22352
ffc0ba98: 90 e1 00 0c stw r7,12(r1)
ffc0ba9c: 7f 66 db 78 mr r6,r27
ffc0baa0: 7d c7 73 78 mr r7,r14
ffc0baa4: 7f 29 03 a6 mtctr r25
ffc0baa8: 91 41 00 10 stw r10,16(r1)
ffc0baac: 7f 4a d3 78 mr r10,r26
ffc0bab0: 92 e1 00 08 stw r23,8(r1)
ffc0bab4: 4c c6 31 82 crclr 4*cr1+eq
ffc0bab8: 4e 80 04 21 bctrl
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
ffc0babc: 2f 9b 00 00 cmpwi cr7,r27,0
ffc0bac0: 41 9e 00 a4 beq- cr7,ffc0bb64 <_Heap_Walk+0x1f0>
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
ffc0bac4: 73 67 00 07 andi. r7,r27,7
ffc0bac8: 40 82 00 c0 bne- ffc0bb88 <_Heap_Walk+0x214>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
ffc0bacc: 7d 2e db 96 divwu r9,r14,r27
ffc0bad0: 7d 29 d9 d6 mullw r9,r9,r27
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
ffc0bad4: 7f 8e 48 00 cmpw cr7,r14,r9
ffc0bad8: 40 9e 00 d8 bne- cr7,ffc0bbb0 <_Heap_Walk+0x23c>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
ffc0badc: 39 3a 00 08 addi r9,r26,8
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
ffc0bae0: 7d 49 db 96 divwu r10,r9,r27
ffc0bae4: 7d 4a d9 d6 mullw r10,r10,r27
);
return false;
}
if (
ffc0bae8: 7f 89 50 00 cmpw cr7,r9,r10
ffc0baec: 40 9e 00 ec bne- cr7,ffc0bbd8 <_Heap_Walk+0x264>
block = next_block;
} while ( block != first_block );
return true;
}
ffc0baf0: 83 9a 00 04 lwz r28,4(r26)
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
ffc0baf4: 73 90 00 01 andi. r16,r28,1
ffc0baf8: 41 82 01 08 beq- ffc0bc00 <_Heap_Walk+0x28c>
- 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;
ffc0bafc: 81 37 00 04 lwz r9,4(r23)
ffc0bb00: 55 29 00 3c rlwinm r9,r9,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc0bb04: 7d 37 4a 14 add r9,r23,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;
ffc0bb08: 81 49 00 04 lwz r10,4(r9)
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
ffc0bb0c: 71 47 00 01 andi. r7,r10,1
ffc0bb10: 41 82 00 30 beq- ffc0bb40 <_Heap_Walk+0x1cc>
);
return false;
}
if (
ffc0bb14: 7f 9a 48 00 cmpw cr7,r26,r9
ffc0bb18: 41 9e 01 0c beq- cr7,ffc0bc24 <_Heap_Walk+0x2b0>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
ffc0bb1c: 3c a0 ff c2 lis r5,-62
ffc0bb20: 7f 29 03 a6 mtctr r25
ffc0bb24: 7f 03 c3 78 mr r3,r24
ffc0bb28: 38 80 00 01 li r4,1
ffc0bb2c: 38 a5 aa 18 addi r5,r5,-21992
ffc0bb30: 4c c6 31 82 crclr 4*cr1+eq
ffc0bb34: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bb38: 38 60 00 00 li r3,0
ffc0bb3c: 4b ff fe c8 b ffc0ba04 <_Heap_Walk+0x90>
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
ffc0bb40: 3c a0 ff c2 lis r5,-62
ffc0bb44: 7f 29 03 a6 mtctr r25
ffc0bb48: 7f 03 c3 78 mr r3,r24
ffc0bb4c: 38 80 00 01 li r4,1
ffc0bb50: 38 a5 aa 00 addi r5,r5,-22016
ffc0bb54: 4c c6 31 82 crclr 4*cr1+eq
ffc0bb58: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bb5c: 38 60 00 00 li r3,0
ffc0bb60: 4b ff fe a4 b ffc0ba04 <_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" );
ffc0bb64: 3c a0 ff c2 lis r5,-62
ffc0bb68: 7f 29 03 a6 mtctr r25
ffc0bb6c: 7f 03 c3 78 mr r3,r24
ffc0bb70: 38 80 00 01 li r4,1
ffc0bb74: 38 a5 a9 44 addi r5,r5,-22204
ffc0bb78: 4c c6 31 82 crclr 4*cr1+eq
ffc0bb7c: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bb80: 38 60 00 00 li r3,0
ffc0bb84: 4b ff fe 80 b ffc0ba04 <_Heap_Walk+0x90>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
ffc0bb88: 3c a0 ff c2 lis r5,-62
ffc0bb8c: 7f 29 03 a6 mtctr r25
ffc0bb90: 7f 03 c3 78 mr r3,r24
ffc0bb94: 38 80 00 01 li r4,1
ffc0bb98: 38 a5 a9 58 addi r5,r5,-22184
ffc0bb9c: 7f 66 db 78 mr r6,r27
ffc0bba0: 4c c6 31 82 crclr 4*cr1+eq
ffc0bba4: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bba8: 38 60 00 00 li r3,0
ffc0bbac: 4b ff fe 58 b ffc0ba04 <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
ffc0bbb0: 3c a0 ff c2 lis r5,-62
ffc0bbb4: 7f 29 03 a6 mtctr r25
ffc0bbb8: 7f 03 c3 78 mr r3,r24
ffc0bbbc: 38 80 00 01 li r4,1
ffc0bbc0: 38 a5 a9 78 addi r5,r5,-22152
ffc0bbc4: 7d c6 73 78 mr r6,r14
ffc0bbc8: 4c c6 31 82 crclr 4*cr1+eq
ffc0bbcc: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bbd0: 38 60 00 00 li r3,0
ffc0bbd4: 4b ff fe 30 b ffc0ba04 <_Heap_Walk+0x90>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
ffc0bbd8: 3c a0 ff c2 lis r5,-62
ffc0bbdc: 7f 29 03 a6 mtctr r25
ffc0bbe0: 7f 03 c3 78 mr r3,r24
ffc0bbe4: 38 80 00 01 li r4,1
ffc0bbe8: 38 a5 a9 9c addi r5,r5,-22116
ffc0bbec: 7f 46 d3 78 mr r6,r26
ffc0bbf0: 4c c6 31 82 crclr 4*cr1+eq
ffc0bbf4: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bbf8: 38 60 00 00 li r3,0
ffc0bbfc: 4b ff fe 08 b ffc0ba04 <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
ffc0bc00: 3c a0 ff c2 lis r5,-62
ffc0bc04: 7f 29 03 a6 mtctr r25
ffc0bc08: 7f 03 c3 78 mr r3,r24
ffc0bc0c: 38 80 00 01 li r4,1
ffc0bc10: 38 a5 a9 d0 addi r5,r5,-22064
ffc0bc14: 4c c6 31 82 crclr 4*cr1+eq
ffc0bc18: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bc1c: 38 60 00 00 li r3,0
ffc0bc20: 4b ff fd e4 b ffc0ba04 <_Heap_Walk+0x90>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
ffc0bc24: 80 df 00 08 lwz r6,8(r31)
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
ffc0bc28: 80 9f 00 10 lwz r4,16(r31)
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 ) {
ffc0bc2c: 7f 9f 30 00 cmpw cr7,r31,r6
block = next_block;
} while ( block != first_block );
return true;
}
ffc0bc30: 81 3f 00 20 lwz r9,32(r31)
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 ) {
ffc0bc34: 41 9e 00 30 beq- cr7,ffc0bc64 <_Heap_Walk+0x2f0>
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;
ffc0bc38: 7f 89 30 40 cmplw cr7,r9,r6
ffc0bc3c: 40 9d 03 14 ble- cr7,ffc0bf50 <_Heap_Walk+0x5dc> <== ALWAYS TAKEN
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
ffc0bc40: 3c a0 ff c2 lis r5,-62
ffc0bc44: 7f 29 03 a6 mtctr r25
ffc0bc48: 7f 03 c3 78 mr r3,r24
ffc0bc4c: 38 80 00 01 li r4,1
ffc0bc50: 38 a5 aa 48 addi r5,r5,-21944
ffc0bc54: 4c c6 31 82 crclr 4*cr1+eq
ffc0bc58: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bc5c: 38 60 00 00 li r3,0
ffc0bc60: 4b ff fd a4 b ffc0ba04 <_Heap_Walk+0x90>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
ffc0bc64: 3e 80 ff c2 lis r20,-62
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
ffc0bc68: 3e a0 ff c2 lis r21,-62
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)(
ffc0bc6c: 3e 60 ff c2 lis r19,-62
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
ffc0bc70: 7f 5d d3 78 mr r29,r26
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
ffc0bc74: 3a 94 ac 64 addi r20,r20,-21404
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
ffc0bc78: 3a b5 ac 4c addi r21,r21,-21428
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)(
ffc0bc7c: 3a 73 ab a8 addi r19,r19,-21592
ffc0bc80: 3e 20 ff c2 lis r17,-62
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
ffc0bc84: 3e c0 ff c2 lis r22,-62
ffc0bc88: 3d e0 ff c2 lis r15,-62
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)(
ffc0bc8c: 3e 40 ff c2 lis r18,-62
- 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;
ffc0bc90: 57 9c 00 3c rlwinm r28,r28,0,0,30
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
ffc0bc94: 7f dc ea 14 add r30,r28,r29
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;
ffc0bc98: 7f 89 f0 40 cmplw cr7,r9,r30
ffc0bc9c: 40 9d 00 30 ble- cr7,ffc0bccc <_Heap_Walk+0x358> <== ALWAYS TAKEN
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
ffc0bca0: 3c a0 ff c2 lis r5,-62
ffc0bca4: 7f 03 c3 78 mr r3,r24
ffc0bca8: 38 80 00 01 li r4,1
ffc0bcac: 38 a5 aa e8 addi r5,r5,-21784
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
ffc0bcb0: 7f a6 eb 78 mr r6,r29
ffc0bcb4: 7f 29 03 a6 mtctr r25
ffc0bcb8: 7f c7 f3 78 mr r7,r30
ffc0bcbc: 4c c6 31 82 crclr 4*cr1+eq
ffc0bcc0: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bcc4: 38 60 00 00 li r3,0
ffc0bcc8: 4b ff fd 3c b ffc0ba04 <_Heap_Walk+0x90>
ffc0bccc: 81 3f 00 24 lwz r9,36(r31)
ffc0bcd0: 7f 89 f0 40 cmplw cr7,r9,r30
ffc0bcd4: 41 bc ff cc blt- cr7,ffc0bca0 <_Heap_Walk+0x32c>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
ffc0bcd8: 7d 5c db 96 divwu r10,r28,r27
ffc0bcdc: 7d 4a d9 d6 mullw r10,r10,r27
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;
ffc0bce0: 7f a9 ba 78 xor r9,r29,r23
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
ffc0bce4: 7f 9c 50 00 cmpw cr7,r28,r10
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;
ffc0bce8: 7d 29 00 34 cntlzw r9,r9
ffc0bcec: 55 29 d9 7e rlwinm r9,r9,27,5,31
ffc0bcf0: 69 29 00 01 xori r9,r9,1
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
ffc0bcf4: 41 9e 00 5c beq- cr7,ffc0bd50 <_Heap_Walk+0x3dc>
ffc0bcf8: 2f 89 00 00 cmpwi cr7,r9,0
ffc0bcfc: 40 9e 02 28 bne- cr7,ffc0bf24 <_Heap_Walk+0x5b0>
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;
ffc0bd00: 81 3e 00 04 lwz r9,4(r30)
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
ffc0bd04: 71 27 00 01 andi. r7,r9,1
ffc0bd08: 41 82 00 d4 beq- ffc0bddc <_Heap_Walk+0x468>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
ffc0bd0c: 2f 90 00 00 cmpwi cr7,r16,0
ffc0bd10: 41 9e 00 a4 beq- cr7,ffc0bdb4 <_Heap_Walk+0x440>
(*printer)(
ffc0bd14: 7f 03 c3 78 mr r3,r24
ffc0bd18: 7f 29 03 a6 mtctr r25
ffc0bd1c: 38 80 00 00 li r4,0
ffc0bd20: 7e a5 ab 78 mr r5,r21
ffc0bd24: 7f a6 eb 78 mr r6,r29
ffc0bd28: 7f 87 e3 78 mr r7,r28
ffc0bd2c: 4c c6 31 82 crclr 4*cr1+eq
ffc0bd30: 4e 80 04 21 bctrl
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
ffc0bd34: 7f 9a f0 00 cmpw cr7,r26,r30
ffc0bd38: 41 9e 01 68 beq- cr7,ffc0bea0 <_Heap_Walk+0x52c>
ffc0bd3c: 83 9e 00 04 lwz r28,4(r30)
ffc0bd40: 7f dd f3 78 mr r29,r30
ffc0bd44: 81 3f 00 20 lwz r9,32(r31)
ffc0bd48: 57 90 07 fe clrlwi r16,r28,31
ffc0bd4c: 4b ff ff 44 b ffc0bc90 <_Heap_Walk+0x31c>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
ffc0bd50: 7f 8e e0 40 cmplw cr7,r14,r28
ffc0bd54: 40 9d 00 3c ble- cr7,ffc0bd90 <_Heap_Walk+0x41c>
ffc0bd58: 2f 89 00 00 cmpwi cr7,r9,0
ffc0bd5c: 41 9e ff a4 beq+ cr7,ffc0bd00 <_Heap_Walk+0x38c> <== NEVER TAKEN
(*printer)(
ffc0bd60: 3c a0 ff c2 lis r5,-62
ffc0bd64: 7f 29 03 a6 mtctr r25
ffc0bd68: 7f 03 c3 78 mr r3,r24
ffc0bd6c: 38 80 00 01 li r4,1
ffc0bd70: 38 a5 ab 48 addi r5,r5,-21688
ffc0bd74: 7f a6 eb 78 mr r6,r29
ffc0bd78: 7f 87 e3 78 mr r7,r28
ffc0bd7c: 7d c8 73 78 mr r8,r14
ffc0bd80: 4c c6 31 82 crclr 4*cr1+eq
ffc0bd84: 4e 80 04 21 bctrl
block,
block_size,
min_block_size
);
return false;
ffc0bd88: 38 60 00 00 li r3,0
ffc0bd8c: 4b ff fc 78 b ffc0ba04 <_Heap_Walk+0x90>
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
ffc0bd90: 7f 9d f0 40 cmplw cr7,r29,r30
ffc0bd94: 41 bc ff 6c blt- cr7,ffc0bd00 <_Heap_Walk+0x38c>
ffc0bd98: 2f 89 00 00 cmpwi cr7,r9,0
ffc0bd9c: 41 9e ff 64 beq+ cr7,ffc0bd00 <_Heap_Walk+0x38c>
(*printer)(
ffc0bda0: 3c a0 ff c2 lis r5,-62
ffc0bda4: 7f 03 c3 78 mr r3,r24
ffc0bda8: 38 80 00 01 li r4,1
ffc0bdac: 38 a5 ab 74 addi r5,r5,-21644
ffc0bdb0: 4b ff ff 00 b ffc0bcb0 <_Heap_Walk+0x33c>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
ffc0bdb4: 7f a6 eb 78 mr r6,r29
ffc0bdb8: 81 1d 00 00 lwz r8,0(r29)
ffc0bdbc: 7f 03 c3 78 mr r3,r24
ffc0bdc0: 7f 29 03 a6 mtctr r25
ffc0bdc4: 38 80 00 00 li r4,0
ffc0bdc8: 7e 85 a3 78 mr r5,r20
ffc0bdcc: 7f 87 e3 78 mr r7,r28
ffc0bdd0: 4c c6 31 82 crclr 4*cr1+eq
ffc0bdd4: 4e 80 04 21 bctrl
ffc0bdd8: 4b ff ff 5c b ffc0bd34 <_Heap_Walk+0x3c0>
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 ?
ffc0bddc: 81 1d 00 0c lwz r8,12(r29)
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)(
ffc0bde0: 81 3f 00 08 lwz r9,8(r31)
return _Heap_Free_list_head(heap)->next;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_last( Heap_Control *heap )
{
return _Heap_Free_list_tail(heap)->prev;
ffc0bde4: 80 ff 00 0c lwz r7,12(r31)
ffc0bde8: 7f 89 40 00 cmpw cr7,r9,r8
ffc0bdec: 41 9e 00 f4 beq- cr7,ffc0bee0 <_Heap_Walk+0x56c>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
ffc0bdf0: 7f 9f 40 00 cmpw cr7,r31,r8
ffc0bdf4: 41 9e 00 fc beq- cr7,ffc0bef0 <_Heap_Walk+0x57c>
ffc0bdf8: 39 36 ac 18 addi r9,r22,-21480
block->next,
block->next == last_free_block ?
ffc0bdfc: 81 5d 00 08 lwz r10,8(r29)
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)(
ffc0be00: 7f 87 50 00 cmpw cr7,r7,r10
ffc0be04: 41 9e 00 d4 beq- cr7,ffc0bed8 <_Heap_Walk+0x564>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
ffc0be08: 7f 9f 50 00 cmpw cr7,r31,r10
ffc0be0c: 41 9e 00 dc beq- cr7,ffc0bee8 <_Heap_Walk+0x574>
ffc0be10: 38 f6 ac 18 addi r7,r22,-21480
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)(
ffc0be14: 90 e1 00 08 stw r7,8(r1)
ffc0be18: 7f 03 c3 78 mr r3,r24
ffc0be1c: 38 80 00 00 li r4,0
ffc0be20: 7f 29 03 a6 mtctr r25
ffc0be24: 7e 65 9b 78 mr r5,r19
ffc0be28: 7f a6 eb 78 mr r6,r29
ffc0be2c: 7f 87 e3 78 mr r7,r28
ffc0be30: 4c c6 31 82 crclr 4*cr1+eq
ffc0be34: 4e 80 04 21 bctrl
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
ffc0be38: 81 1e 00 00 lwz r8,0(r30)
ffc0be3c: 7f 9c 40 00 cmpw cr7,r28,r8
ffc0be40: 40 9e 00 68 bne- cr7,ffc0bea8 <_Heap_Walk+0x534>
);
return false;
}
if ( !prev_used ) {
ffc0be44: 2f 90 00 00 cmpwi cr7,r16,0
ffc0be48: 41 9e 00 b4 beq- cr7,ffc0befc <_Heap_Walk+0x588>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
ffc0be4c: 81 3f 00 08 lwz r9,8(r31)
)
{
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 ) {
ffc0be50: 7f 9f 48 00 cmpw cr7,r31,r9
ffc0be54: 41 9e 00 24 beq- cr7,ffc0be78 <_Heap_Walk+0x504> <== NEVER TAKEN
if ( free_block == block ) {
ffc0be58: 7f 9d 48 00 cmpw cr7,r29,r9
ffc0be5c: 40 be 00 0c bne+ cr7,ffc0be68 <_Heap_Walk+0x4f4>
ffc0be60: 4b ff fe d4 b ffc0bd34 <_Heap_Walk+0x3c0>
ffc0be64: 41 ba fe d0 beq- cr6,ffc0bd34 <_Heap_Walk+0x3c0>
return true;
}
free_block = free_block->next;
ffc0be68: 81 29 00 08 lwz r9,8(r9)
)
{
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 ) {
ffc0be6c: 7f 9f 48 00 cmpw cr7,r31,r9
if ( free_block == block ) {
ffc0be70: 7f 1d 48 00 cmpw cr6,r29,r9
)
{
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 ) {
ffc0be74: 40 9e ff f0 bne+ cr7,ffc0be64 <_Heap_Walk+0x4f0>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
ffc0be78: 3c a0 ff c2 lis r5,-62
ffc0be7c: 7f 29 03 a6 mtctr r25
ffc0be80: 7f 03 c3 78 mr r3,r24
ffc0be84: 38 80 00 01 li r4,1
ffc0be88: 38 a5 ac 8c addi r5,r5,-21364
ffc0be8c: 7f a6 eb 78 mr r6,r29
ffc0be90: 4c c6 31 82 crclr 4*cr1+eq
ffc0be94: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0be98: 38 60 00 00 li r3,0
ffc0be9c: 4b ff fb 68 b ffc0ba04 <_Heap_Walk+0x90>
}
block = next_block;
} while ( block != first_block );
return true;
ffc0bea0: 38 60 00 01 li r3,1
ffc0bea4: 4b ff fb 60 b ffc0ba04 <_Heap_Walk+0x90>
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
ffc0bea8: 3c a0 ff c2 lis r5,-62
ffc0beac: 7f 29 03 a6 mtctr r25
ffc0beb0: 7f 03 c3 78 mr r3,r24
ffc0beb4: 38 80 00 01 li r4,1
ffc0beb8: 38 a5 ab e0 addi r5,r5,-21536
ffc0bebc: 7f a6 eb 78 mr r6,r29
ffc0bec0: 7f 87 e3 78 mr r7,r28
ffc0bec4: 7f c9 f3 78 mr r9,r30
ffc0bec8: 4c c6 31 82 crclr 4*cr1+eq
ffc0becc: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bed0: 38 60 00 00 li r3,0
ffc0bed4: 4b ff fb 30 b ffc0ba04 <_Heap_Walk+0x90>
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)(
ffc0bed8: 38 f1 a8 94 addi r7,r17,-22380
ffc0bedc: 4b ff ff 38 b ffc0be14 <_Heap_Walk+0x4a0>
ffc0bee0: 39 32 a8 78 addi r9,r18,-22408
ffc0bee4: 4b ff ff 18 b ffc0bdfc <_Heap_Walk+0x488>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
ffc0bee8: 38 ef a8 a4 addi r7,r15,-22364
ffc0beec: 4b ff ff 28 b ffc0be14 <_Heap_Walk+0x4a0>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
ffc0bef0: 3d 40 ff c2 lis r10,-62
ffc0bef4: 39 2a a8 88 addi r9,r10,-22392
ffc0bef8: 4b ff ff 04 b ffc0bdfc <_Heap_Walk+0x488>
return false;
}
if ( !prev_used ) {
(*printer)(
ffc0befc: 3c a0 ff c2 lis r5,-62
ffc0bf00: 7f 29 03 a6 mtctr r25
ffc0bf04: 7f 03 c3 78 mr r3,r24
ffc0bf08: 38 80 00 01 li r4,1
ffc0bf0c: 38 a5 ac 1c addi r5,r5,-21476
ffc0bf10: 7f a6 eb 78 mr r6,r29
ffc0bf14: 4c c6 31 82 crclr 4*cr1+eq
ffc0bf18: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0bf1c: 38 60 00 00 li r3,0
ffc0bf20: 4b ff fa e4 b ffc0ba04 <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
ffc0bf24: 3c a0 ff c2 lis r5,-62
ffc0bf28: 7f 29 03 a6 mtctr r25
ffc0bf2c: 7f 03 c3 78 mr r3,r24
ffc0bf30: 38 80 00 01 li r4,1
ffc0bf34: 38 a5 ab 18 addi r5,r5,-21736
ffc0bf38: 7f a6 eb 78 mr r6,r29
ffc0bf3c: 7f 87 e3 78 mr r7,r28
ffc0bf40: 4c c6 31 82 crclr 4*cr1+eq
ffc0bf44: 4e 80 04 21 bctrl
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
ffc0bf48: 38 60 00 00 li r3,0
ffc0bf4c: 4b ff fa b8 b ffc0ba04 <_Heap_Walk+0x90>
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;
ffc0bf50: 80 bf 00 24 lwz r5,36(r31)
ffc0bf54: 7f 85 30 40 cmplw cr7,r5,r6
ffc0bf58: 41 bc fc e8 blt- cr7,ffc0bc40 <_Heap_Walk+0x2cc> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
ffc0bf5c: 39 46 00 08 addi r10,r6,8
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
ffc0bf60: 7d 0a 23 96 divwu r8,r10,r4
ffc0bf64: 7d 08 21 d6 mullw r8,r8,r4
);
return false;
}
if (
ffc0bf68: 7f 8a 40 00 cmpw cr7,r10,r8
ffc0bf6c: 40 9e 00 cc bne- cr7,ffc0c038 <_Heap_Walk+0x6c4> <== 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;
ffc0bf70: 81 46 00 04 lwz r10,4(r6)
ffc0bf74: 55 4a 00 3c rlwinm r10,r10,0,0,30
block = next_block;
} while ( block != first_block );
return true;
}
ffc0bf78: 7d 46 52 14 add r10,r6,r10
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;
ffc0bf7c: 81 4a 00 04 lwz r10,4(r10)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
ffc0bf80: 71 47 00 01 andi. r7,r10,1
ffc0bf84: 40 82 00 90 bne- ffc0c014 <_Heap_Walk+0x6a0> <== NEVER TAKEN
ffc0bf88: 7f e8 fb 78 mr r8,r31
ffc0bf8c: 7c c3 33 78 mr r3,r6
ffc0bf90: 48 00 00 54 b ffc0bfe4 <_Heap_Walk+0x670>
return false;
}
prev_block = free_block;
free_block = free_block->next;
ffc0bf94: 80 c6 00 08 lwz r6,8(r6)
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 ) {
ffc0bf98: 7f 9f 30 00 cmpw cr7,r31,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;
ffc0bf9c: 7f 06 48 40 cmplw cr6,r6,r9
ffc0bfa0: 7c 86 28 40 cmplw cr1,r6,r5
ffc0bfa4: 41 be fc c0 beq- cr7,ffc0bc64 <_Heap_Walk+0x2f0>
ffc0bfa8: 41 b8 fc 98 blt- cr6,ffc0bc40 <_Heap_Walk+0x2cc>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
ffc0bfac: 39 46 00 08 addi r10,r6,8
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;
ffc0bfb0: 41 a5 fc 90 bgt- cr1,ffc0bc40 <_Heap_Walk+0x2cc> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
ffc0bfb4: 7c ea 23 96 divwu r7,r10,r4
ffc0bfb8: 7c e7 21 d6 mullw r7,r7,r4
ffc0bfbc: 7c 68 1b 78 mr r8,r3
);
return false;
}
if (
ffc0bfc0: 7f 8a 38 00 cmpw cr7,r10,r7
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
ffc0bfc4: 7c c3 33 78 mr r3,r6
);
return false;
}
if (
ffc0bfc8: 40 9e 00 70 bne- cr7,ffc0c038 <_Heap_Walk+0x6c4>
- 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;
ffc0bfcc: 81 46 00 04 lwz r10,4(r6)
ffc0bfd0: 55 4a 00 3c rlwinm r10,r10,0,0,30
block = next_block;
} while ( block != first_block );
return true;
}
ffc0bfd4: 7d 46 52 14 add r10,r6,r10
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;
ffc0bfd8: 81 4a 00 04 lwz r10,4(r10)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
ffc0bfdc: 71 47 00 01 andi. r7,r10,1
ffc0bfe0: 40 82 00 34 bne- ffc0c014 <_Heap_Walk+0x6a0>
);
return false;
}
if ( free_block->prev != prev_block ) {
ffc0bfe4: 80 e6 00 0c lwz r7,12(r6)
ffc0bfe8: 7f 87 40 00 cmpw cr7,r7,r8
ffc0bfec: 41 9e ff a8 beq+ cr7,ffc0bf94 <_Heap_Walk+0x620>
(*printer)(
ffc0bff0: 3c a0 ff c2 lis r5,-62
ffc0bff4: 7f 29 03 a6 mtctr r25
ffc0bff8: 7f 03 c3 78 mr r3,r24
ffc0bffc: 38 80 00 01 li r4,1
ffc0c000: 38 a5 aa b4 addi r5,r5,-21836
ffc0c004: 4c c6 31 82 crclr 4*cr1+eq
ffc0c008: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0c00c: 38 60 00 00 li r3,0
ffc0c010: 4b ff f9 f4 b ffc0ba04 <_Heap_Walk+0x90>
return false;
}
if ( _Heap_Is_used( free_block ) ) {
(*printer)(
ffc0c014: 3c a0 ff c2 lis r5,-62
ffc0c018: 7f 29 03 a6 mtctr r25
ffc0c01c: 7f 03 c3 78 mr r3,r24
ffc0c020: 38 80 00 01 li r4,1
ffc0c024: 38 a5 aa 98 addi r5,r5,-21864
ffc0c028: 4c c6 31 82 crclr 4*cr1+eq
ffc0c02c: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0c030: 38 60 00 00 li r3,0
ffc0c034: 4b ff f9 d0 b ffc0ba04 <_Heap_Walk+0x90>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
ffc0c038: 3c a0 ff c2 lis r5,-62
ffc0c03c: 7f 29 03 a6 mtctr r25
ffc0c040: 7f 03 c3 78 mr r3,r24
ffc0c044: 38 80 00 01 li r4,1
ffc0c048: 38 a5 aa 68 addi r5,r5,-21912
ffc0c04c: 4c c6 31 82 crclr 4*cr1+eq
ffc0c050: 4e 80 04 21 bctrl
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
ffc0c054: 38 60 00 00 li r3,0
ffc0c058: 4b ff f9 ac b ffc0ba04 <_Heap_Walk+0x90>
ffc0b874 <_Heap_Walk_print>:
/* Do nothing */
}
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
ffc0b874: 94 21 ff 88 stwu r1,-120(r1)
ffc0b878: 7c 08 02 a6 mflr r0
ffc0b87c: 7c 6b 1b 78 mr r11,r3
ffc0b880: 90 01 00 7c stw r0,124(r1)
ffc0b884: 93 e1 00 74 stw r31,116(r1)
ffc0b888: 90 c1 00 1c stw r6,28(r1)
ffc0b88c: 90 e1 00 20 stw r7,32(r1)
ffc0b890: 91 01 00 24 stw r8,36(r1)
ffc0b894: 91 21 00 28 stw r9,40(r1)
ffc0b898: 91 41 00 2c stw r10,44(r1)
ffc0b89c: 40 86 00 24 bne- cr1,ffc0b8c0 <_Heap_Walk_print+0x4c> <== ALWAYS TAKEN
ffc0b8a0: d8 21 00 30 stfd f1,48(r1) <== NOT EXECUTED
ffc0b8a4: d8 41 00 38 stfd f2,56(r1) <== NOT EXECUTED
ffc0b8a8: d8 61 00 40 stfd f3,64(r1) <== NOT EXECUTED
ffc0b8ac: d8 81 00 48 stfd f4,72(r1) <== NOT EXECUTED
ffc0b8b0: d8 a1 00 50 stfd f5,80(r1) <== NOT EXECUTED
ffc0b8b4: d8 c1 00 58 stfd f6,88(r1) <== NOT EXECUTED
ffc0b8b8: d8 e1 00 60 stfd f7,96(r1) <== NOT EXECUTED
ffc0b8bc: d9 01 00 68 stfd f8,104(r1) <== NOT EXECUTED
va_list ap;
if ( error ) {
ffc0b8c0: 2f 84 00 00 cmpwi cr7,r4,0
{
/* Do nothing */
}
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
ffc0b8c4: 7c bf 2b 78 mr r31,r5
va_list ap;
if ( error ) {
ffc0b8c8: 40 9e 00 58 bne- cr7,ffc0b920 <_Heap_Walk_print+0xac>
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
ffc0b8cc: 3c 60 ff c2 lis r3,-62
ffc0b8d0: 7d 64 5b 78 mr r4,r11
ffc0b8d4: 38 63 a8 6c addi r3,r3,-22420
ffc0b8d8: 4c c6 31 82 crclr 4*cr1+eq
ffc0b8dc: 4b ff a5 95 bl ffc05e70 <printk>
}
va_start( ap, fmt );
ffc0b8e0: 39 20 00 03 li r9,3
ffc0b8e4: 99 21 00 08 stb r9,8(r1)
ffc0b8e8: 39 20 00 00 li r9,0
vprintk( fmt, ap );
ffc0b8ec: 7f e3 fb 78 mr r3,r31
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
}
va_start( ap, fmt );
ffc0b8f0: 99 21 00 09 stb r9,9(r1)
ffc0b8f4: 39 21 00 80 addi r9,r1,128
vprintk( fmt, ap );
ffc0b8f8: 38 81 00 08 addi r4,r1,8
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
}
va_start( ap, fmt );
ffc0b8fc: 91 21 00 0c stw r9,12(r1)
ffc0b900: 39 21 00 10 addi r9,r1,16
ffc0b904: 91 21 00 10 stw r9,16(r1)
vprintk( fmt, ap );
ffc0b908: 4b ff d6 91 bl ffc08f98 <vprintk>
va_end( ap );
}
ffc0b90c: 80 01 00 7c lwz r0,124(r1)
ffc0b910: 83 e1 00 74 lwz r31,116(r1)
ffc0b914: 7c 08 03 a6 mtlr r0
ffc0b918: 38 21 00 78 addi r1,r1,120
ffc0b91c: 4e 80 00 20 blr
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
va_list ap;
if ( error ) {
printk( "FAIL[%d]: ", source );
ffc0b920: 3c 60 ff c2 lis r3,-62
ffc0b924: 7d 64 5b 78 mr r4,r11
ffc0b928: 38 63 a8 60 addi r3,r3,-22432
ffc0b92c: 4c c6 31 82 crclr 4*cr1+eq
ffc0b930: 4b ff a5 41 bl ffc05e70 <printk>
} else {
printk( "PASS[%d]: ", source );
}
va_start( ap, fmt );
ffc0b934: 39 20 00 03 li r9,3
ffc0b938: 99 21 00 08 stb r9,8(r1)
ffc0b93c: 39 20 00 00 li r9,0
vprintk( fmt, ap );
ffc0b940: 7f e3 fb 78 mr r3,r31
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
}
va_start( ap, fmt );
ffc0b944: 99 21 00 09 stb r9,9(r1)
ffc0b948: 39 21 00 80 addi r9,r1,128
vprintk( fmt, ap );
ffc0b94c: 38 81 00 08 addi r4,r1,8
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
}
va_start( ap, fmt );
ffc0b950: 91 21 00 0c stw r9,12(r1)
ffc0b954: 39 21 00 10 addi r9,r1,16
ffc0b958: 91 21 00 10 stw r9,16(r1)
vprintk( fmt, ap );
ffc0b95c: 4b ff d6 3d bl ffc08f98 <vprintk>
va_end( ap );
}
ffc0b960: 80 01 00 7c lwz r0,124(r1)
ffc0b964: 83 e1 00 74 lwz r31,116(r1)
ffc0b968: 7c 08 03 a6 mtlr r0
ffc0b96c: 38 21 00 78 addi r1,r1,120
ffc0b970: 4e 80 00 20 blr
ffc0a4cc <_IO_Initialize_all_drivers>:
void _IO_Initialize_all_drivers( void )
{
ffc0a4cc: 94 21 ff f0 stwu r1,-16(r1)
ffc0a4d0: 7c 08 02 a6 mflr r0
ffc0a4d4: 93 c1 00 08 stw r30,8(r1)
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
ffc0a4d8: 3f c0 00 00 lis r30,0
ffc0a4dc: 81 3e 28 a4 lwz r9,10404(r30)
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
void _IO_Initialize_all_drivers( void )
{
ffc0a4e0: 90 01 00 14 stw r0,20(r1)
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
ffc0a4e4: 2f 89 00 00 cmpwi cr7,r9,0
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
void _IO_Initialize_all_drivers( void )
{
ffc0a4e8: 93 e1 00 0c stw r31,12(r1)
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
ffc0a4ec: 41 9e 00 2c beq- cr7,ffc0a518 <_IO_Initialize_all_drivers+0x4c><== NEVER TAKEN
ffc0a4f0: 3b e0 00 00 li r31,0
ffc0a4f4: 3b de 28 a4 addi r30,r30,10404
(void) rtems_io_initialize( major, 0, NULL );
ffc0a4f8: 7f e3 fb 78 mr r3,r31
ffc0a4fc: 38 80 00 00 li r4,0
ffc0a500: 38 a0 00 00 li r5,0
ffc0a504: 48 00 60 ad bl ffc105b0 <rtems_io_initialize>
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
ffc0a508: 81 3e 00 00 lwz r9,0(r30)
ffc0a50c: 3b ff 00 01 addi r31,r31,1
ffc0a510: 7f 89 f8 40 cmplw cr7,r9,r31
ffc0a514: 41 9d ff e4 bgt+ cr7,ffc0a4f8 <_IO_Initialize_all_drivers+0x2c>
(void) rtems_io_initialize( major, 0, NULL );
}
ffc0a518: 80 01 00 14 lwz r0,20(r1)
ffc0a51c: 83 c1 00 08 lwz r30,8(r1)
ffc0a520: 7c 08 03 a6 mtlr r0
ffc0a524: 83 e1 00 0c lwz r31,12(r1)
ffc0a528: 38 21 00 10 addi r1,r1,16
ffc0a52c: 4e 80 00 20 blr
ffc0a3b8 <_IO_Manager_initialization>:
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
{
ffc0a3b8: 94 21 ff e0 stwu r1,-32(r1)
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = rtems_configuration_get_device_driver_table();
ffc0a3bc: 3d 20 ff c2 lis r9,-62
ffc0a3c0: 39 29 ea f8 addi r9,r9,-5384
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
{
ffc0a3c4: 7c 08 02 a6 mflr r0
ffc0a3c8: 93 a1 00 14 stw r29,20(r1)
ffc0a3cc: 93 c1 00 18 stw r30,24(r1)
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = rtems_configuration_get_device_driver_table();
drivers_in_table = rtems_configuration_get_number_of_device_drivers();
number_of_drivers = rtems_configuration_get_maximum_drivers();
ffc0a3d0: 83 a9 00 34 lwz r29,52(r9)
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = rtems_configuration_get_device_driver_table();
drivers_in_table = rtems_configuration_get_number_of_device_drivers();
ffc0a3d4: 83 c9 00 38 lwz r30,56(r9)
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
{
ffc0a3d8: 93 e1 00 1c stw r31,28(r1)
/*
* 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 )
ffc0a3dc: 7f 9e e8 40 cmplw cr7,r30,r29
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
{
ffc0a3e0: 90 01 00 24 stw r0,36(r1)
ffc0a3e4: 93 61 00 0c stw r27,12(r1)
ffc0a3e8: 93 81 00 10 stw r28,16(r1)
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = rtems_configuration_get_device_driver_table();
ffc0a3ec: 83 e9 00 3c lwz r31,60(r9)
/*
* 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 )
ffc0a3f0: 40 9c 00 a8 bge- cr7,ffc0a498 <_IO_Manager_initialization+0xe0>
* 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 )
ffc0a3f4: 1f 7d 00 18 mulli r27,r29,24
* 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(
ffc0a3f8: 7f 63 db 78 mr r3,r27
ffc0a3fc: 48 00 3b 99 bl ffc0df94 <_Workspace_Allocate_or_fatal_error>
/*
* 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 *)
ffc0a400: 3f 80 00 00 lis r28,0
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
ffc0a404: 3d 20 00 00 lis r9,0
/*
* 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 *)
ffc0a408: 90 7c 28 a8 stw r3,10408(r28)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
ffc0a40c: 38 80 00 00 li r4,0
ffc0a410: 7f 65 db 78 mr r5,r27
_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;
ffc0a414: 93 a9 28 a4 stw r29,10404(r9)
memset(
ffc0a418: 48 00 9a 59 bl ffc13e70 <memset>
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
ffc0a41c: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0a420: 41 9e 00 54 beq- cr7,ffc0a474 <_IO_Manager_initialization+0xbc><== NEVER TAKEN
ffc0a424: 80 fc 28 a8 lwz r7,10408(r28)
#include <rtems/score/thread.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _IO_Manager_initialization(void)
ffc0a428: 1d 7e 00 18 mulli r11,r30,24
ffc0a42c: 39 00 00 00 li r8,0
_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];
ffc0a430: 7f e9 fb 78 mr r9,r31
ffc0a434: 7c 69 40 6e lwzux r3,r9,r8
ffc0a438: 7d 47 42 14 add r10,r7,r8
ffc0a43c: 80 c9 00 0c lwz r6,12(r9)
ffc0a440: 80 89 00 04 lwz r4,4(r9)
ffc0a444: 80 a9 00 08 lwz r5,8(r9)
ffc0a448: 7c 67 41 2e stwx r3,r7,r8
ffc0a44c: 39 08 00 18 addi r8,r8,24
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
ffc0a450: 7f 88 58 00 cmpw cr7,r8,r11
_IO_Driver_address_table[index] = driver_table[index];
ffc0a454: 90 8a 00 04 stw r4,4(r10)
ffc0a458: 90 aa 00 08 stw r5,8(r10)
ffc0a45c: 90 ca 00 0c stw r6,12(r10)
ffc0a460: 80 c9 00 10 lwz r6,16(r9)
ffc0a464: 81 29 00 14 lwz r9,20(r9)
ffc0a468: 90 ca 00 10 stw r6,16(r10)
ffc0a46c: 91 2a 00 14 stw r9,20(r10)
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
ffc0a470: 40 9e ff c0 bne+ cr7,ffc0a430 <_IO_Manager_initialization+0x78>
_IO_Driver_address_table[index] = driver_table[index];
}
ffc0a474: 80 01 00 24 lwz r0,36(r1)
ffc0a478: 83 61 00 0c lwz r27,12(r1)
ffc0a47c: 7c 08 03 a6 mtlr r0
ffc0a480: 83 81 00 10 lwz r28,16(r1)
ffc0a484: 83 a1 00 14 lwz r29,20(r1)
ffc0a488: 83 c1 00 18 lwz r30,24(r1)
ffc0a48c: 83 e1 00 1c lwz r31,28(r1)
ffc0a490: 38 21 00 20 addi r1,r1,32
ffc0a494: 4e 80 00 20 blr
ffc0a498: 80 01 00 24 lwz r0,36(r1)
* 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;
ffc0a49c: 3d 20 00 00 lis r9,0
ffc0a4a0: 93 e9 28 a8 stw r31,10408(r9)
_IO_Number_of_drivers = number_of_drivers;
ffc0a4a4: 3d 20 00 00 lis r9,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];
}
ffc0a4a8: 7c 08 03 a6 mtlr r0
ffc0a4ac: 83 61 00 0c lwz r27,12(r1)
ffc0a4b0: 83 81 00 10 lwz r28,16(r1)
ffc0a4b4: 83 a1 00 14 lwz r29,20(r1)
ffc0a4b8: 83 e1 00 1c lwz r31,28(r1)
* 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;
_IO_Number_of_drivers = number_of_drivers;
ffc0a4bc: 93 c9 28 a4 stw r30,10404(r9)
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
ffc0a4c0: 83 c1 00 18 lwz r30,24(r1)
ffc0a4c4: 38 21 00 20 addi r1,r1,32
ffc0a4c8: 4e 80 00 20 blr
ffc0b370 <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
ffc0b370: 94 21 ff d8 stwu r1,-40(r1)
ffc0b374: 7c 08 02 a6 mflr r0
ffc0b378: 93 e1 00 24 stw r31,36(r1)
ffc0b37c: 7c 9f 23 78 mr r31,r4
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, is_internal, error };
_User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor );
ffc0b380: 3c 80 ff c1 lis r4,-63
ffc0b384: 93 c1 00 20 stw r30,32(r1)
ffc0b388: 38 84 d8 e8 addi r4,r4,-10008
ffc0b38c: 7c 7e 1b 78 mr r30,r3
ffc0b390: 38 61 00 08 addi r3,r1,8
ffc0b394: 93 a1 00 1c stw r29,28(r1)
ffc0b398: 7c bd 2b 78 mr r29,r5
ffc0b39c: 90 01 00 2c stw r0,44(r1)
Internal_errors_Source source,
bool is_internal,
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, is_internal, error };
ffc0b3a0: 93 c1 00 08 stw r30,8(r1)
ffc0b3a4: 9b e1 00 0c stb r31,12(r1)
ffc0b3a8: 90 a1 00 10 stw r5,16(r1)
_User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor );
ffc0b3ac: 48 00 25 61 bl ffc0d90c <_User_extensions_Iterate>
_User_extensions_Fatal( the_source, is_internal, the_error );
_Internal_errors_What_happened.the_source = the_source;
ffc0b3b0: 3d 40 00 00 lis r10,0
ffc0b3b4: 39 2a 31 78 addi r9,r10,12664
ffc0b3b8: 93 ca 31 78 stw r30,12664(r10)
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
ffc0b3bc: 7f a3 eb 78 mr r3,r29
)
{
_User_extensions_Fatal( the_source, is_internal, the_error );
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
ffc0b3c0: 9b e9 00 04 stb r31,4(r9)
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
ffc0b3c4: 39 40 00 05 li r10,5
_Internal_errors_What_happened.the_error = the_error;
ffc0b3c8: 93 a9 00 08 stw r29,8(r9)
ffc0b3cc: 3d 20 00 00 lis r9,0
ffc0b3d0: 91 49 28 90 stw r10,10384(r9)
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
ffc0b3d4: 4b ff 88 35 bl ffc03c08 <_BSP_Fatal_error>
ffc0b3d8: 48 00 00 00 b ffc0b3d8 <_Internal_error_Occurred+0x68><== NOT EXECUTED
ffc0b3f0 <_Objects_Allocate>:
#endif
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
ffc0b3f0: 94 21 ff f0 stwu r1,-16(r1)
ffc0b3f4: 7c 08 02 a6 mflr r0
ffc0b3f8: 90 01 00 14 stw r0,20(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 )
ffc0b3fc: 81 23 00 18 lwz r9,24(r3)
#endif
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
ffc0b400: 93 e1 00 0c stw r31,12(r1)
ffc0b404: 7c 7f 1b 78 mr r31,r3
* 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 )
ffc0b408: 2f 89 00 00 cmpwi cr7,r9,0
#endif
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
ffc0b40c: 93 c1 00 08 stw r30,8(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 )
ffc0b410: 41 9e 00 88 beq- cr7,ffc0b498 <_Objects_Allocate+0xa8> <== NEVER TAKEN
/*
* OK. The manager should be initialized and configured to have objects.
* With any luck, it is safe to attempt to allocate an object.
*/
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
ffc0b414: 3b c3 00 20 addi r30,r3,32
ffc0b418: 7f c3 f3 78 mr r3,r30
ffc0b41c: 4b ff f3 e1 bl ffc0a7fc <_Chain_Get>
if ( information->auto_extend ) {
ffc0b420: 89 3f 00 12 lbz r9,18(r31)
ffc0b424: 2f 89 00 00 cmpwi cr7,r9,0
ffc0b428: 41 9e 00 40 beq- cr7,ffc0b468 <_Objects_Allocate+0x78>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
ffc0b42c: 2f 83 00 00 cmpwi cr7,r3,0
ffc0b430: 41 9e 00 50 beq- cr7,ffc0b480 <_Objects_Allocate+0x90>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
ffc0b434: a1 03 00 0a lhz r8,10(r3)
ffc0b438: a1 3f 00 0a lhz r9,10(r31)
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
ffc0b43c: a1 5f 00 14 lhz r10,20(r31)
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
ffc0b440: 7d 29 40 50 subf r9,r9,r8
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
information->inactive--;
ffc0b444: a0 ff 00 2c lhz r7,44(r31)
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
ffc0b448: 7d 29 53 96 divwu r9,r9,r10
information->inactive_per_block[ block ]--;
ffc0b44c: 81 5f 00 30 lwz r10,48(r31)
ffc0b450: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0b454: 7d 0a 48 2e lwzx r8,r10,r9
information->inactive--;
ffc0b458: 38 e7 ff ff addi r7,r7,-1
block = (uint32_t) _Objects_Get_index( the_object->id ) -
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
ffc0b45c: 39 08 ff ff addi r8,r8,-1
ffc0b460: 7d 0a 49 2e stwx r8,r10,r9
information->inactive--;
ffc0b464: b0 ff 00 2c sth r7,44(r31)
);
}
#endif
return the_object;
}
ffc0b468: 80 01 00 14 lwz r0,20(r1)
ffc0b46c: 83 c1 00 08 lwz r30,8(r1)
ffc0b470: 7c 08 03 a6 mtlr r0
ffc0b474: 83 e1 00 0c lwz r31,12(r1)
ffc0b478: 38 21 00 10 addi r1,r1,16
ffc0b47c: 4e 80 00 20 blr
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
_Objects_Extend_information( information );
ffc0b480: 7f e3 fb 78 mr r3,r31
ffc0b484: 48 00 00 49 bl ffc0b4cc <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
ffc0b488: 7f c3 f3 78 mr r3,r30
ffc0b48c: 4b ff f3 71 bl ffc0a7fc <_Chain_Get>
}
if ( the_object ) {
ffc0b490: 2c 03 00 00 cmpwi r3,0
ffc0b494: 40 a2 ff a0 bne- ffc0b434 <_Objects_Allocate+0x44>
);
}
#endif
return the_object;
}
ffc0b498: 80 01 00 14 lwz r0,20(r1)
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
return NULL;
ffc0b49c: 38 60 00 00 li r3,0
);
}
#endif
return the_object;
}
ffc0b4a0: 83 c1 00 08 lwz r30,8(r1)
ffc0b4a4: 7c 08 03 a6 mtlr r0
ffc0b4a8: 83 e1 00 0c lwz r31,12(r1)
ffc0b4ac: 38 21 00 10 addi r1,r1,16
ffc0b4b0: 4e 80 00 20 blr
ffc0b4cc <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
ffc0b4cc: 94 21 ff c0 stwu r1,-64(r1)
ffc0b4d0: 7c 08 02 a6 mflr r0
ffc0b4d4: 90 01 00 44 stw r0,68(r1)
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
ffc0b4d8: 81 23 00 34 lwz r9,52(r3)
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
ffc0b4dc: 93 41 00 28 stw r26,40(r1)
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
ffc0b4e0: 2f 89 00 00 cmpwi cr7,r9,0
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
ffc0b4e4: 93 61 00 2c stw r27,44(r1)
ffc0b4e8: 93 e1 00 3c stw r31,60(r1)
ffc0b4ec: 7c 7f 1b 78 mr r31,r3
ffc0b4f0: 92 c1 00 18 stw r22,24(r1)
ffc0b4f4: 92 e1 00 1c stw r23,28(r1)
ffc0b4f8: 93 01 00 20 stw r24,32(r1)
ffc0b4fc: 93 21 00 24 stw r25,36(r1)
ffc0b500: 93 81 00 30 stw r28,48(r1)
ffc0b504: 93 a1 00 34 stw r29,52(r1)
ffc0b508: 93 c1 00 38 stw r30,56(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 );
ffc0b50c: a3 63 00 0a lhz r27,10(r3)
ffc0b510: a3 43 00 10 lhz r26,16(r3)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
ffc0b514: 41 9e 02 74 beq- cr7,ffc0b788 <_Objects_Extend_information+0x2bc>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
ffc0b518: a1 03 00 14 lhz r8,20(r3)
ffc0b51c: 7f 9a 43 96 divwu r28,r26,r8
for ( ; block < block_count; block++ ) {
ffc0b520: 2f 9c 00 00 cmpwi cr7,r28,0
ffc0b524: 41 9e 02 bc beq- cr7,ffc0b7e0 <_Objects_Extend_information+0x314><== NEVER TAKEN
if ( information->object_blocks[ block ] == NULL ) {
ffc0b528: 81 49 00 00 lwz r10,0(r9)
ffc0b52c: 7d 07 43 78 mr r7,r8
/*
* 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 );
ffc0b530: 7f 7e db 78 mr r30,r27
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
ffc0b534: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0b538: 41 9e 02 bc beq- cr7,ffc0b7f4 <_Objects_Extend_information+0x328><== NEVER TAKEN
* 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;
ffc0b53c: 3b a0 00 00 li r29,0
ffc0b540: 7f 89 03 a6 mtctr r28
ffc0b544: 48 00 00 10 b ffc0b554 <_Objects_Extend_information+0x88>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
ffc0b548: 85 49 00 04 lwzu r10,4(r9)
ffc0b54c: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0b550: 41 9e 02 0c beq- cr7,ffc0b75c <_Objects_Extend_information+0x290>
do_extend = false;
break;
} else
index_base += information->allocation_size;
ffc0b554: 7f de 42 14 add r30,r30,r8
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
ffc0b558: 3b bd 00 01 addi r29,r29,1
ffc0b55c: 42 00 ff ec bdnz+ ffc0b548 <_Objects_Extend_information+0x7c>
/*
* 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;
ffc0b560: 3b 20 00 01 li r25,1
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
ffc0b564: 7f 5a 3a 14 add r26,r26,r7
/*
* 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 ) {
ffc0b568: 2b 9a ff ff cmplwi cr7,r26,65535
ffc0b56c: 41 9d 01 b8 bgt- cr7,ffc0b724 <_Objects_Extend_information+0x258>
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
if ( information->auto_extend ) {
ffc0b570: 89 3f 00 12 lbz r9,18(r31)
/*
* 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;
ffc0b574: 80 7f 00 18 lwz r3,24(r31)
if ( information->auto_extend ) {
ffc0b578: 2f 89 00 00 cmpwi cr7,r9,0
/*
* 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;
ffc0b57c: 7c 67 19 d6 mullw r3,r7,r3
if ( information->auto_extend ) {
ffc0b580: 41 9e 01 e4 beq- cr7,ffc0b764 <_Objects_Extend_information+0x298>
new_object_block = _Workspace_Allocate( block_size );
ffc0b584: 48 00 29 e9 bl ffc0df6c <_Workspace_Allocate>
if ( !new_object_block )
ffc0b588: 7c 77 1b 79 mr. r23,r3
ffc0b58c: 41 82 01 98 beq- ffc0b724 <_Objects_Extend_information+0x258>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
ffc0b590: 2f 99 00 00 cmpwi cr7,r25,0
ffc0b594: 41 9e 01 0c beq- cr7,ffc0b6a0 <_Objects_Extend_information+0x1d4>
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
ffc0b598: 89 3f 00 12 lbz r9,18(r31)
*/
/*
* Up the block count and maximum
*/
block_count++;
ffc0b59c: 3a dc 00 01 addi r22,r28,1
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
ffc0b5a0: 1c 76 00 03 mulli r3,r22,3
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
ffc0b5a4: 2f 89 00 00 cmpwi cr7,r9,0
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
ffc0b5a8: 7c 7a 1a 14 add r3,r26,r3
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
ffc0b5ac: 7c 63 da 14 add r3,r3,r27
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
ffc0b5b0: 54 63 10 3a rlwinm r3,r3,2,0,29
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
ffc0b5b4: 40 9e 01 bc bne- cr7,ffc0b770 <_Objects_Extend_information+0x2a4>
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
return;
}
} else {
object_blocks = _Workspace_Allocate_or_fatal_error( block_size );
ffc0b5b8: 48 00 29 dd bl ffc0df94 <_Workspace_Allocate_or_fatal_error>
ffc0b5bc: 7c 79 1b 78 mr r25,r3
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
ffc0b5c0: a1 3f 00 10 lhz r9,16(r31)
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
object_blocks, block_count * sizeof(void*) );
ffc0b5c4: 56 d6 10 3a rlwinm r22,r22,2,0,29
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
ffc0b5c8: 7f 19 b2 14 add r24,r25,r22
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
ffc0b5cc: 7f 9b 48 40 cmplw cr7,r27,r9
ffc0b5d0: 7e d8 b2 14 add r22,r24,r22
ffc0b5d4: 41 9c 01 cc blt- cr7,ffc0b7a0 <_Objects_Extend_information+0x2d4>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
ffc0b5d8: 2f 9b 00 00 cmpwi cr7,r27,0
ffc0b5dc: 41 9e 00 28 beq- cr7,ffc0b604 <_Objects_Extend_information+0x138><== NEVER TAKEN
local_table[ index ] = NULL;
ffc0b5e0: 57 68 10 3a rlwinm r8,r27,2,0,29
ffc0b5e4: 39 08 ff fc addi r8,r8,-4
ffc0b5e8: 55 08 f0 be rlwinm r8,r8,30,2,31
ffc0b5ec: 39 08 00 01 addi r8,r8,1
ffc0b5f0: 7d 09 03 a6 mtctr r8
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
ffc0b5f4: 39 36 ff fc addi r9,r22,-4
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
local_table[ index ] = NULL;
ffc0b5f8: 39 40 00 00 li r10,0
ffc0b5fc: 95 49 00 04 stwu r10,4(r9)
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
ffc0b600: 42 00 ff fc bdnz+ ffc0b5fc <_Objects_Extend_information+0x130>
ffc0b604: 57 9c 10 3a rlwinm r28,r28,2,0,29
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
ffc0b608: a1 5f 00 14 lhz r10,20(r31)
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
ffc0b60c: 39 20 00 00 li r9,0
ffc0b610: 7d 39 e1 2e stwx r9,r25,r28
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
ffc0b614: 7d 1e 52 14 add r8,r30,r10
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
ffc0b618: 7f 9e 40 40 cmplw cr7,r30,r8
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
ffc0b61c: 7d 38 e1 2e stwx r9,r24,r28
for ( index=index_base ;
ffc0b620: 40 9c 00 34 bge- cr7,ffc0b654 <_Objects_Extend_information+0x188><== NEVER TAKEN
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
ffc0b624: 55 47 10 3a rlwinm r7,r10,2,0,29
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
ffc0b628: 38 e7 ff fc addi r7,r7,-4
ffc0b62c: 54 e7 f0 be rlwinm r7,r7,30,2,31
ffc0b630: 38 e7 00 01 addi r7,r7,1
ffc0b634: 7c e9 03 a6 mtctr r7
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
ffc0b638: 57 c8 10 3a rlwinm r8,r30,2,0,29
ffc0b63c: 7d 16 42 14 add r8,r22,r8
ffc0b640: 39 20 00 00 li r9,0
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
ffc0b644: 39 40 00 00 li r10,0
ffc0b648: 7d 48 49 2e stwx r10,r8,r9
ffc0b64c: 39 29 00 04 addi r9,r9,4
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
ffc0b650: 42 00 ff f8 bdnz+ ffc0b648 <_Objects_Extend_information+0x17c>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0b654: 7d 40 00 a6 mfmsr r10
ffc0b658: 7d 30 42 a6 mfsprg r9,0
ffc0b65c: 7d 49 48 78 andc r9,r10,r9
ffc0b660: 7d 20 01 24 mtmsr r9
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
ffc0b664: 81 3f 00 00 lwz r9,0(r31)
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
information->maximum_id = _Objects_Build_id(
ffc0b668: a1 1f 00 04 lhz r8,4(r31)
ffc0b66c: 55 29 c0 0e rlwinm r9,r9,24,0,7
local_table[ index ] = NULL;
}
_ISR_Disable( level );
old_tables = information->object_blocks;
ffc0b670: 80 7f 00 34 lwz r3,52(r31)
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
ffc0b674: 55 08 d8 08 rlwinm r8,r8,27,0,4
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
ffc0b678: 93 1f 00 30 stw r24,48(r31)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
ffc0b67c: 65 29 00 01 oris r9,r9,1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
ffc0b680: 7d 29 43 78 or r9,r9,r8
_ISR_Disable( level );
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
ffc0b684: 93 3f 00 34 stw r25,52(r31)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
ffc0b688: 7d 29 d3 78 or r9,r9,r26
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
ffc0b68c: 92 df 00 1c stw r22,28(r31)
information->maximum = (Objects_Maximum) maximum;
ffc0b690: b3 5f 00 10 sth r26,16(r31)
information->maximum_id = _Objects_Build_id(
ffc0b694: 91 3f 00 0c stw r9,12(r31)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0b698: 7d 40 01 24 mtmsr r10
information->maximum
);
_ISR_Enable( level );
_Workspace_Free( old_tables );
ffc0b69c: 48 00 28 e9 bl ffc0df84 <_Workspace_Free>
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
ffc0b6a0: 81 3f 00 34 lwz r9,52(r31)
ffc0b6a4: 57 bd 10 3a rlwinm r29,r29,2,0,29
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
ffc0b6a8: a0 bf 00 14 lhz r5,20(r31)
ffc0b6ac: 38 61 00 08 addi r3,r1,8
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
ffc0b6b0: 7e e9 e9 2e stwx r23,r9,r29
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
ffc0b6b4: 3b 9f 00 20 addi r28,r31,32
information->object_blocks[ block ] = new_object_block;
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
ffc0b6b8: 81 3f 00 34 lwz r9,52(r31)
ffc0b6bc: 80 df 00 18 lwz r6,24(r31)
ffc0b6c0: 7c 89 e8 2e lwzx r4,r9,r29
ffc0b6c4: 4b ff f1 79 bl ffc0a83c <_Chain_Initialize>
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
ffc0b6c8: 48 00 00 2c b ffc0b6f4 <_Objects_Extend_information+0x228>
ffc0b6cc: 81 5f 00 00 lwz r10,0(r31)
the_object->id = _Objects_Build_id(
ffc0b6d0: a1 1f 00 04 lhz r8,4(r31)
ffc0b6d4: 55 4a c0 0e rlwinm r10,r10,24,0,7
ffc0b6d8: 65 4a 00 01 oris r10,r10,1
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
ffc0b6dc: 55 08 d8 08 rlwinm r8,r8,27,0,4
ffc0b6e0: 7d 4a 43 78 or r10,r10,r8
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
ffc0b6e4: 7d 4a f3 78 or r10,r10,r30
ffc0b6e8: 91 49 00 08 stw r10,8(r9)
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
ffc0b6ec: 3b de 00 01 addi r30,r30,1
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
ffc0b6f0: 4b ff f0 dd bl ffc0a7cc <_Chain_Append>
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
ffc0b6f4: 38 61 00 08 addi r3,r1,8
ffc0b6f8: 4b ff f1 05 bl ffc0a7fc <_Chain_Get>
ffc0b6fc: 7c 69 1b 79 mr. r9,r3
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
ffc0b700: 7f 83 e3 78 mr r3,r28
ffc0b704: 7d 24 4b 78 mr r4,r9
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
ffc0b708: 40 82 ff c4 bne+ ffc0b6cc <_Objects_Extend_information+0x200>
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
ffc0b70c: a1 1f 00 2c lhz r8,44(r31)
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
ffc0b710: a1 3f 00 14 lhz r9,20(r31)
ffc0b714: 81 5f 00 30 lwz r10,48(r31)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
ffc0b718: 7d 09 42 14 add r8,r9,r8
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
ffc0b71c: 7d 2a e9 2e stwx r9,r10,r29
information->inactive =
ffc0b720: b1 1f 00 2c sth r8,44(r31)
(Objects_Maximum)(information->inactive + information->allocation_size);
}
ffc0b724: 80 01 00 44 lwz r0,68(r1)
ffc0b728: 82 c1 00 18 lwz r22,24(r1)
ffc0b72c: 7c 08 03 a6 mtlr r0
ffc0b730: 82 e1 00 1c lwz r23,28(r1)
ffc0b734: 83 01 00 20 lwz r24,32(r1)
ffc0b738: 83 21 00 24 lwz r25,36(r1)
ffc0b73c: 83 41 00 28 lwz r26,40(r1)
ffc0b740: 83 61 00 2c lwz r27,44(r1)
ffc0b744: 83 81 00 30 lwz r28,48(r1)
ffc0b748: 83 a1 00 34 lwz r29,52(r1)
ffc0b74c: 83 c1 00 38 lwz r30,56(r1)
ffc0b750: 83 e1 00 3c lwz r31,60(r1)
ffc0b754: 38 21 00 40 addi r1,r1,64
ffc0b758: 4e 80 00 20 blr
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
ffc0b75c: 3b 20 00 00 li r25,0
ffc0b760: 4b ff fe 04 b ffc0b564 <_Objects_Extend_information+0x98>
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 );
ffc0b764: 48 00 28 31 bl ffc0df94 <_Workspace_Allocate_or_fatal_error>
ffc0b768: 7c 77 1b 78 mr r23,r3
ffc0b76c: 4b ff fe 24 b ffc0b590 <_Objects_Extend_information+0xc4>
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
if ( information->auto_extend ) {
object_blocks = _Workspace_Allocate( block_size );
ffc0b770: 48 00 27 fd bl ffc0df6c <_Workspace_Allocate>
if ( !object_blocks ) {
ffc0b774: 7c 79 1b 79 mr. r25,r3
ffc0b778: 40 82 fe 48 bne+ ffc0b5c0 <_Objects_Extend_information+0xf4>
_Workspace_Free( new_object_block );
ffc0b77c: 7e e3 bb 78 mr r3,r23
ffc0b780: 48 00 28 05 bl ffc0df84 <_Workspace_Free>
ffc0b784: 4b ff ff a0 b ffc0b724 <_Objects_Extend_information+0x258>
ffc0b788: a0 e3 00 14 lhz r7,20(r3)
/*
* 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 );
ffc0b78c: 7f 7e db 78 mr r30,r27
/*
* 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;
ffc0b790: 3b 20 00 01 li r25,1
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
ffc0b794: 3b a0 00 00 li r29,0
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
ffc0b798: 3b 80 00 00 li r28,0
ffc0b79c: 4b ff fd c8 b ffc0b564 <_Objects_Extend_information+0x98>
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
information->object_blocks,
block_count * sizeof(void*) );
ffc0b7a0: 57 9c 10 3a rlwinm r28,r28,2,0,29
/*
* 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,
ffc0b7a4: 80 9f 00 34 lwz r4,52(r31)
ffc0b7a8: 7f 85 e3 78 mr r5,r28
ffc0b7ac: 7f 23 cb 78 mr r3,r25
ffc0b7b0: 48 00 85 cd bl ffc13d7c <memcpy>
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
ffc0b7b4: 80 9f 00 30 lwz r4,48(r31)
ffc0b7b8: 7f 85 e3 78 mr r5,r28
ffc0b7bc: 7f 03 c3 78 mr r3,r24
ffc0b7c0: 48 00 85 bd bl ffc13d7c <memcpy>
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
ffc0b7c4: a0 bf 00 10 lhz r5,16(r31)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
ffc0b7c8: 80 9f 00 1c lwz r4,28(r31)
ffc0b7cc: 7e c3 b3 78 mr r3,r22
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
ffc0b7d0: 7c a5 da 14 add r5,r5,r27
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
ffc0b7d4: 54 a5 10 3a rlwinm r5,r5,2,0,29
ffc0b7d8: 48 00 85 a5 bl ffc13d7c <memcpy>
ffc0b7dc: 4b ff fe 2c b ffc0b608 <_Objects_Extend_information+0x13c>
ffc0b7e0: 7d 07 43 78 mr r7,r8 <== 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 );
ffc0b7e4: 7f 7e db 78 mr r30,r27 <== 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;
ffc0b7e8: 3b 20 00 01 li r25,1 <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
ffc0b7ec: 3b a0 00 00 li r29,0 <== NOT EXECUTED
ffc0b7f0: 4b ff fd 74 b ffc0b564 <_Objects_Extend_information+0x98><== NOT EXECUTED
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
ffc0b7f4: 3b 20 00 00 li r25,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;
ffc0b7f8: 3b a0 00 00 li r29,0 <== NOT EXECUTED
ffc0b7fc: 4b ff fd 68 b ffc0b564 <_Objects_Extend_information+0x98><== NOT EXECUTED
ffc0b8cc <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
ffc0b8cc: 94 21 ff f0 stwu r1,-16(r1)
ffc0b8d0: 7c 08 02 a6 mflr r0
ffc0b8d4: 93 e1 00 0c stw r31,12(r1)
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
ffc0b8d8: 7c 9f 23 79 mr. r31,r4
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
ffc0b8dc: 90 01 00 14 stw r0,20(r1)
ffc0b8e0: 93 c1 00 08 stw r30,8(r1)
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
ffc0b8e4: 41 82 00 68 beq- ffc0b94c <_Objects_Get_information+0x80>
ffc0b8e8: 7c 7e 1b 78 mr r30,r3
/*
* 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 );
ffc0b8ec: 48 00 52 95 bl ffc10b80 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
ffc0b8f0: 2c 03 00 00 cmpwi r3,0
ffc0b8f4: 41 82 00 58 beq- ffc0b94c <_Objects_Get_information+0x80>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
ffc0b8f8: 7f 83 f8 40 cmplw cr7,r3,r31
ffc0b8fc: 41 9c 00 50 blt- cr7,ffc0b94c <_Objects_Get_information+0x80>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
ffc0b900: 3d 20 00 00 lis r9,0
ffc0b904: 57 de 10 3a rlwinm r30,r30,2,0,29
ffc0b908: 39 29 2c 78 addi r9,r9,11384
ffc0b90c: 7d 29 f0 2e lwzx r9,r9,r30
ffc0b910: 2f 89 00 00 cmpwi cr7,r9,0
ffc0b914: 41 9e 00 38 beq- cr7,ffc0b94c <_Objects_Get_information+0x80><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
ffc0b918: 57 ff 10 3a rlwinm r31,r31,2,0,29
ffc0b91c: 7c 69 f8 2e lwzx r3,r9,r31
if ( !info )
ffc0b920: 2f 83 00 00 cmpwi cr7,r3,0
ffc0b924: 41 9e 00 28 beq- cr7,ffc0b94c <_Objects_Get_information+0x80><== 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 )
ffc0b928: a1 23 00 10 lhz r9,16(r3)
ffc0b92c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0b930: 41 9e 00 1c beq- cr7,ffc0b94c <_Objects_Get_information+0x80>
return NULL;
#endif
return info;
}
ffc0b934: 80 01 00 14 lwz r0,20(r1)
ffc0b938: 83 c1 00 08 lwz r30,8(r1)
ffc0b93c: 7c 08 03 a6 mtlr r0
ffc0b940: 83 e1 00 0c lwz r31,12(r1)
ffc0b944: 38 21 00 10 addi r1,r1,16
ffc0b948: 4e 80 00 20 blr
ffc0b94c: 80 01 00 14 lwz r0,20(r1)
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
ffc0b950: 38 60 00 00 li r3,0
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
ffc0b954: 83 c1 00 08 lwz r30,8(r1)
ffc0b958: 7c 08 03 a6 mtlr r0
ffc0b95c: 83 e1 00 0c lwz r31,12(r1)
ffc0b960: 38 21 00 10 addi r1,r1,16
ffc0b964: 4e 80 00 20 blr
ffc1b7f0 <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
ffc1b7f0: 94 21 ff d8 stwu r1,-40(r1)
ffc1b7f4: 7c 08 02 a6 mflr r0
ffc1b7f8: 93 a1 00 1c stw r29,28(r1)
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
ffc1b7fc: 7c 9d 23 79 mr. r29,r4
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
ffc1b800: 90 01 00 2c stw r0,44(r1)
ffc1b804: 93 81 00 18 stw r28,24(r1)
ffc1b808: 93 c1 00 20 stw r30,32(r1)
ffc1b80c: 93 e1 00 24 stw r31,36(r1)
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
ffc1b810: 41 82 00 44 beq- ffc1b854 <_Objects_Get_name_as_string+0x64>
return NULL;
if ( name == NULL )
ffc1b814: 2f 85 00 00 cmpwi cr7,r5,0
ffc1b818: 7c bf 2b 78 mr r31,r5
ffc1b81c: 41 9e 00 38 beq- cr7,ffc1b854 <_Objects_Get_name_as_string+0x64>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
ffc1b820: 2f 83 00 00 cmpwi cr7,r3,0
ffc1b824: 7c 7e 1b 78 mr r30,r3
ffc1b828: 41 9e 01 18 beq- cr7,ffc1b940 <_Objects_Get_name_as_string+0x150>
information = _Objects_Get_information_id( tmpId );
ffc1b82c: 7f c3 f3 78 mr r3,r30
ffc1b830: 4b ff 6e 41 bl ffc12670 <_Objects_Get_information_id>
if ( !information )
ffc1b834: 7c 7c 1b 79 mr. r28,r3
ffc1b838: 41 82 00 1c beq- ffc1b854 <_Objects_Get_name_as_string+0x64>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
ffc1b83c: 7f c4 f3 78 mr r4,r30
ffc1b840: 38 a1 00 10 addi r5,r1,16
ffc1b844: 4b ff 6f 49 bl ffc1278c <_Objects_Get>
switch ( location ) {
ffc1b848: 81 21 00 10 lwz r9,16(r1)
ffc1b84c: 2f 89 00 00 cmpwi cr7,r9,0
ffc1b850: 41 9e 00 2c beq- cr7,ffc1b87c <_Objects_Get_name_as_string+0x8c>
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
ffc1b854: 80 01 00 2c lwz r0,44(r1)
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
ffc1b858: 3b e0 00 00 li r31,0
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
ffc1b85c: 7f e3 fb 78 mr r3,r31
ffc1b860: 83 81 00 18 lwz r28,24(r1)
ffc1b864: 7c 08 03 a6 mtlr r0
ffc1b868: 83 a1 00 1c lwz r29,28(r1)
ffc1b86c: 83 c1 00 20 lwz r30,32(r1)
ffc1b870: 83 e1 00 24 lwz r31,36(r1)
ffc1b874: 38 21 00 28 addi r1,r1,40
ffc1b878: 4e 80 00 20 blr
return NULL;
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
ffc1b87c: 89 3c 00 38 lbz r9,56(r28)
ffc1b880: 2f 89 00 00 cmpwi cr7,r9,0
ffc1b884: 40 9e 00 cc bne- cr7,ffc1b950 <_Objects_Get_name_as_string+0x160>
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
ffc1b888: 81 43 00 0c lwz r10,12(r3)
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
ffc1b88c: 99 21 00 0c stb r9,12(r1)
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
ffc1b890: 55 48 84 3e rlwinm r8,r10,16,16,31
lname[ 2 ] = (u32_name >> 8) & 0xff;
ffc1b894: 55 49 c2 3e rlwinm r9,r10,24,8,31
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
ffc1b898: 99 01 00 09 stb r8,9(r1)
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
ffc1b89c: 55 47 46 3e rlwinm r7,r10,8,24,31
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
ffc1b8a0: 99 21 00 0a stb r9,10(r1)
lname[ 3 ] = (u32_name >> 0) & 0xff;
ffc1b8a4: 99 41 00 0b stb r10,11(r1)
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
ffc1b8a8: 98 e1 00 08 stb r7,8(r1)
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
s = lname;
ffc1b8ac: 38 e1 00 08 addi r7,r1,8
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
ffc1b8b0: 2f 9d 00 01 cmpwi cr7,r29,1
ffc1b8b4: 41 9e 00 a8 beq- cr7,ffc1b95c <_Objects_Get_name_as_string+0x16c><== NEVER TAKEN
ffc1b8b8: 89 27 00 00 lbz r9,0(r7)
ffc1b8bc: 2f 89 00 00 cmpwi cr7,r9,0
ffc1b8c0: 41 9e 00 9c beq- cr7,ffc1b95c <_Objects_Get_name_as_string+0x16c>
ffc1b8c4: 3d 60 00 00 lis r11,0
*d = (isprint((unsigned char)*s)) ? *s : '*';
ffc1b8c8: 3b bd ff ff addi r29,r29,-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(
ffc1b8cc: 7f ea fb 78 mr r10,r31
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
*d = (isprint((unsigned char)*s)) ? *s : '*';
ffc1b8d0: 7f a9 03 a6 mtctr r29
ffc1b8d4: 39 6b 29 c4 addi r11,r11,10692
ffc1b8d8: 38 c0 ff 97 li r6,-105
ffc1b8dc: 48 00 00 10 b ffc1b8ec <_Objects_Get_name_as_string+0xfc>
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
ffc1b8e0: 8d 27 00 01 lbzu r9,1(r7)
ffc1b8e4: 2f 89 00 00 cmpwi cr7,r9,0
ffc1b8e8: 41 9e 00 28 beq- cr7,ffc1b910 <_Objects_Get_name_as_string+0x120>
*d = (isprint((unsigned char)*s)) ? *s : '*';
ffc1b8ec: 81 0b 00 00 lwz r8,0(r11)
ffc1b8f0: 7d 08 4a 14 add r8,r8,r9
ffc1b8f4: 89 08 00 01 lbz r8,1(r8)
ffc1b8f8: 7d 05 30 39 and. r5,r8,r6
ffc1b8fc: 40 82 00 08 bne- ffc1b904 <_Objects_Get_name_as_string+0x114>
ffc1b900: 39 20 00 2a li r9,42
ffc1b904: 99 2a 00 00 stb r9,0(r10)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
ffc1b908: 39 4a 00 01 addi r10,r10,1
ffc1b90c: 42 00 ff d4 bdnz+ ffc1b8e0 <_Objects_Get_name_as_string+0xf0>
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
ffc1b910: 39 20 00 00 li r9,0
ffc1b914: 99 2a 00 00 stb r9,0(r10)
_Thread_Enable_dispatch();
ffc1b918: 4b ff 80 09 bl ffc13920 <_Thread_Enable_dispatch>
return name;
}
return NULL; /* unreachable path */
}
ffc1b91c: 80 01 00 2c lwz r0,44(r1)
ffc1b920: 7f e3 fb 78 mr r3,r31
ffc1b924: 83 81 00 18 lwz r28,24(r1)
ffc1b928: 7c 08 03 a6 mtlr r0
ffc1b92c: 83 a1 00 1c lwz r29,28(r1)
ffc1b930: 83 c1 00 20 lwz r30,32(r1)
ffc1b934: 83 e1 00 24 lwz r31,36(r1)
ffc1b938: 38 21 00 28 addi r1,r1,40
ffc1b93c: 4e 80 00 20 blr
return NULL;
if ( name == NULL )
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
ffc1b940: 3d 20 00 00 lis r9,0
ffc1b944: 81 29 3a f0 lwz r9,15088(r9)
ffc1b948: 83 c9 00 08 lwz r30,8(r9)
ffc1b94c: 4b ff fe e0 b ffc1b82c <_Objects_Get_name_as_string+0x3c>
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
s = the_object->name.name_p;
ffc1b950: 80 e3 00 0c lwz r7,12(r3)
lname[ 4 ] = '\0';
s = lname;
}
d = name;
if ( s ) {
ffc1b954: 2f 87 00 00 cmpwi cr7,r7,0
ffc1b958: 40 9e ff 58 bne+ cr7,ffc1b8b0 <_Objects_Get_name_as_string+0xc0>
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
*d = (isprint((unsigned char)*s)) ? *s : '*';
ffc1b95c: 7f ea fb 78 mr r10,r31
}
}
*d = '\0';
ffc1b960: 39 20 00 00 li r9,0
ffc1b964: 99 2a 00 00 stb r9,0(r10)
_Thread_Enable_dispatch();
ffc1b968: 4b ff 7f b9 bl ffc13920 <_Thread_Enable_dispatch>
ffc1b96c: 4b ff ff b0 b ffc1b91c <_Objects_Get_name_as_string+0x12c>
ffc1f050 <_Objects_Get_next>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location_p,
Objects_Id *next_id_p
)
{
ffc1f050: 94 21 ff e8 stwu r1,-24(r1)
ffc1f054: 7c 08 02 a6 mflr r0
ffc1f058: 93 a1 00 0c stw r29,12(r1)
Objects_Control *object;
Objects_Id next_id;
if ( !information )
ffc1f05c: 7c 7d 1b 79 mr. r29,r3
Objects_Information *information,
Objects_Id id,
Objects_Locations *location_p,
Objects_Id *next_id_p
)
{
ffc1f060: 90 01 00 1c stw r0,28(r1)
ffc1f064: 93 81 00 08 stw r28,8(r1)
ffc1f068: 93 c1 00 10 stw r30,16(r1)
ffc1f06c: 93 e1 00 14 stw r31,20(r1)
Objects_Control *object;
Objects_Id next_id;
if ( !information )
ffc1f070: 41 82 00 d8 beq- ffc1f148 <_Objects_Get_next+0xf8>
return NULL;
if ( !location_p )
ffc1f074: 2f 85 00 00 cmpwi cr7,r5,0
ffc1f078: 7c be 2b 78 mr r30,r5
ffc1f07c: 41 9e 00 cc beq- cr7,ffc1f148 <_Objects_Get_next+0xf8>
return NULL;
if ( !next_id_p )
ffc1f080: 2f 86 00 00 cmpwi cr7,r6,0
ffc1f084: 7c dc 33 78 mr r28,r6
ffc1f088: 41 9e 00 c0 beq- cr7,ffc1f148 <_Objects_Get_next+0xf8>
return NULL;
if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
ffc1f08c: 54 89 04 3e clrlwi r9,r4,16
ffc1f090: 2f 89 00 00 cmpwi cr7,r9,0
next_id = information->minimum_id;
else
next_id = id;
ffc1f094: 7c 9f 23 78 mr r31,r4
return NULL;
if ( !next_id_p )
return NULL;
if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
ffc1f098: 41 9e 00 58 beq- cr7,ffc1f0f0 <_Objects_Get_next+0xa0>
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
ffc1f09c: a1 5d 00 10 lhz r10,16(r29)
ffc1f0a0: 57 e9 04 3e clrlwi r9,r31,16
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
ffc1f0a4: 7f e4 fb 78 mr r4,r31
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
ffc1f0a8: 7f 8a 48 40 cmplw cr7,r10,r9
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
ffc1f0ac: 7f a3 eb 78 mr r3,r29
ffc1f0b0: 7f c5 f3 78 mr r5,r30
next_id++;
ffc1f0b4: 3b ff 00 01 addi r31,r31,1
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
ffc1f0b8: 41 9c 00 5c blt- cr7,ffc1f114 <_Objects_Get_next+0xc4>
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
ffc1f0bc: 4b ff 36 d1 bl ffc1278c <_Objects_Get>
next_id++;
} while (*location_p != OBJECTS_LOCAL);
ffc1f0c0: 81 3e 00 00 lwz r9,0(r30)
ffc1f0c4: 2f 89 00 00 cmpwi cr7,r9,0
ffc1f0c8: 40 9e ff d4 bne+ cr7,ffc1f09c <_Objects_Get_next+0x4c>
*next_id_p = next_id;
ffc1f0cc: 93 fc 00 00 stw r31,0(r28)
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
ffc1f0d0: 80 01 00 1c lwz r0,28(r1)
ffc1f0d4: 83 81 00 08 lwz r28,8(r1)
ffc1f0d8: 7c 08 03 a6 mtlr r0
ffc1f0dc: 83 a1 00 0c lwz r29,12(r1)
ffc1f0e0: 83 c1 00 10 lwz r30,16(r1)
ffc1f0e4: 83 e1 00 14 lwz r31,20(r1)
ffc1f0e8: 38 21 00 18 addi r1,r1,24
ffc1f0ec: 4e 80 00 20 blr
if ( !next_id_p )
return NULL;
if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
next_id = information->minimum_id;
ffc1f0f0: 83 fd 00 08 lwz r31,8(r29)
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
ffc1f0f4: 7f a3 eb 78 mr r3,r29
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
ffc1f0f8: a1 5d 00 10 lhz r10,16(r29)
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
ffc1f0fc: 7f c5 f3 78 mr r5,r30
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
ffc1f100: 57 e9 04 3e clrlwi r9,r31,16
ffc1f104: 7f 8a 48 40 cmplw cr7,r10,r9
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
ffc1f108: 7f e4 fb 78 mr r4,r31
next_id++;
ffc1f10c: 3b ff 00 01 addi r31,r31,1
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
ffc1f110: 40 9c ff ac bge+ cr7,ffc1f0bc <_Objects_Get_next+0x6c> <== ALWAYS TAKEN
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
ffc1f114: 80 01 00 1c lwz r0,28(r1)
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
{
*location_p = OBJECTS_ERROR;
ffc1f118: 39 20 00 01 li r9,1
ffc1f11c: 91 3e 00 00 stw r9,0(r30)
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
ffc1f120: 39 20 ff ff li r9,-1
return 0;
}
ffc1f124: 7c 08 03 a6 mtlr r0
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
ffc1f128: 38 60 00 00 li r3,0
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
ffc1f12c: 91 3c 00 00 stw r9,0(r28)
return 0;
}
ffc1f130: 83 81 00 08 lwz r28,8(r1)
ffc1f134: 83 a1 00 0c lwz r29,12(r1)
ffc1f138: 83 c1 00 10 lwz r30,16(r1)
ffc1f13c: 83 e1 00 14 lwz r31,20(r1)
ffc1f140: 38 21 00 18 addi r1,r1,24
ffc1f144: 4e 80 00 20 blr
{
Objects_Control *object;
Objects_Id next_id;
if ( !information )
return NULL;
ffc1f148: 38 60 00 00 li r3,0
ffc1f14c: 4b ff ff 84 b ffc1f0d0 <_Objects_Get_next+0x80>
ffc20960 <_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;
ffc20960: 81 23 00 08 lwz r9,8(r3)
if ( information->maximum >= index ) {
ffc20964: a1 43 00 10 lhz r10,16(r3)
/*
* 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;
ffc20968: 21 29 00 01 subfic r9,r9,1
ffc2096c: 7c 89 22 14 add r4,r9,r4
if ( information->maximum >= index ) {
ffc20970: 7f 84 50 40 cmplw cr7,r4,r10
ffc20974: 41 9d 00 24 bgt- cr7,ffc20998 <_Objects_Get_no_protection+0x38>
if ( (the_object = information->local_table[ index ]) != NULL ) {
ffc20978: 81 23 00 1c lwz r9,28(r3)
ffc2097c: 54 84 10 3a rlwinm r4,r4,2,0,29
ffc20980: 7c 69 20 2e lwzx r3,r9,r4
ffc20984: 2f 83 00 00 cmpwi cr7,r3,0
ffc20988: 41 9e 00 10 beq- cr7,ffc20998 <_Objects_Get_no_protection+0x38><== NEVER TAKEN
*location = OBJECTS_LOCAL;
ffc2098c: 39 20 00 00 li r9,0
ffc20990: 91 25 00 00 stw r9,0(r5)
return the_object;
ffc20994: 4e 80 00 20 blr
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
ffc20998: 39 20 00 01 li r9,1
ffc2099c: 91 25 00 00 stw r9,0(r5)
return NULL;
ffc209a0: 38 60 00 00 li r3,0
}
ffc209a4: 4e 80 00 20 blr
ffc1281c <_Objects_Id_to_name>:
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
ffc1281c: 7c 69 1b 79 mr. r9,r3
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
ffc12820: 94 21 ff e0 stwu r1,-32(r1)
ffc12824: 7c 08 02 a6 mflr r0
ffc12828: 93 e1 00 1c stw r31,28(r1)
ffc1282c: 7c 9f 23 78 mr r31,r4
ffc12830: 90 01 00 24 stw r0,36(r1)
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
ffc12834: 40 82 00 10 bne- ffc12844 <_Objects_Id_to_name+0x28>
ffc12838: 3d 20 00 00 lis r9,0
ffc1283c: 81 29 3a f0 lwz r9,15088(r9)
ffc12840: 81 29 00 08 lwz r9,8(r9)
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
ffc12844: 55 2a 47 7e rlwinm r10,r9,8,29,31
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
ffc12848: 39 0a ff ff addi r8,r10,-1
ffc1284c: 2b 88 00 02 cmplwi cr7,r8,2
ffc12850: 41 9d 00 38 bgt- cr7,ffc12888 <_Objects_Id_to_name+0x6c>
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
ffc12854: 3d 00 00 00 lis r8,0
ffc12858: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc1285c: 39 08 35 78 addi r8,r8,13688
ffc12860: 7d 48 50 2e lwzx r10,r8,r10
ffc12864: 2f 8a 00 00 cmpwi cr7,r10,0
ffc12868: 41 9e 00 20 beq- cr7,ffc12888 <_Objects_Id_to_name+0x6c>
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
ffc1286c: 55 28 3e 7a rlwinm r8,r9,7,25,29
ffc12870: 7c 6a 40 2e lwzx r3,r10,r8
if ( !information )
ffc12874: 2f 83 00 00 cmpwi cr7,r3,0
ffc12878: 41 9e 00 10 beq- cr7,ffc12888 <_Objects_Id_to_name+0x6c><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
ffc1287c: 89 43 00 38 lbz r10,56(r3)
ffc12880: 2f 8a 00 00 cmpwi cr7,r10,0
ffc12884: 41 9e 00 1c beq- cr7,ffc128a0 <_Objects_Id_to_name+0x84><== ALWAYS TAKEN
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
ffc12888: 38 60 00 03 li r3,3
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
ffc1288c: 80 01 00 24 lwz r0,36(r1)
ffc12890: 83 e1 00 1c lwz r31,28(r1)
ffc12894: 7c 08 03 a6 mtlr r0
ffc12898: 38 21 00 20 addi r1,r1,32
ffc1289c: 4e 80 00 20 blr
#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 );
ffc128a0: 7d 24 4b 78 mr r4,r9
ffc128a4: 38 a1 00 08 addi r5,r1,8
ffc128a8: 4b ff fe e5 bl ffc1278c <_Objects_Get>
if ( !the_object )
ffc128ac: 2c 03 00 00 cmpwi r3,0
ffc128b0: 41 a2 ff d8 beq- ffc12888 <_Objects_Id_to_name+0x6c>
return OBJECTS_INVALID_ID;
*name = the_object->name;
ffc128b4: 81 23 00 0c lwz r9,12(r3)
ffc128b8: 91 3f 00 00 stw r9,0(r31)
_Thread_Enable_dispatch();
ffc128bc: 48 00 10 65 bl ffc13920 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
ffc128c0: 38 60 00 00 li r3,0
ffc128c4: 4b ff ff c8 b ffc1288c <_Objects_Id_to_name+0x70>
ffc0bc1c <_Objects_Shrink_information>:
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
Objects_Information *information
)
{
ffc0bc1c: 94 21 ff e8 stwu r1,-24(r1)
ffc0bc20: 7c 08 02 a6 mflr r0
ffc0bc24: 90 01 00 1c stw r0,28(r1)
ffc0bc28: 93 e1 00 14 stw r31,20(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) /
ffc0bc2c: a0 e3 00 10 lhz r7,16(r3)
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
ffc0bc30: a3 e3 00 0a lhz r31,10(r3)
block_count = (information->maximum - index_base) /
ffc0bc34: a1 43 00 14 lhz r10,20(r3)
ffc0bc38: 7c ff 38 50 subf r7,r31,r7
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
Objects_Information *information
)
{
ffc0bc3c: 93 81 00 08 stw r28,8(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) /
ffc0bc40: 7c e7 53 96 divwu r7,r7,r10
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
Objects_Information *information
)
{
ffc0bc44: 93 a1 00 0c stw r29,12(r1)
ffc0bc48: 93 c1 00 10 stw r30,16(r1)
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
ffc0bc4c: 2f 87 00 00 cmpwi cr7,r7,0
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
Objects_Information *information
)
{
ffc0bc50: 7c 7c 1b 78 mr r28,r3
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
ffc0bc54: 41 9e 00 3c beq- cr7,ffc0bc90 <_Objects_Shrink_information+0x74><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
ffc0bc58: 81 03 00 30 lwz r8,48(r3)
ffc0bc5c: 81 28 00 00 lwz r9,0(r8)
ffc0bc60: 7f 8a 48 00 cmpw cr7,r10,r9
ffc0bc64: 41 9e 00 4c beq- cr7,ffc0bcb0 <_Objects_Shrink_information+0x94><== 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++ ) {
ffc0bc68: 39 20 00 00 li r9,0
ffc0bc6c: 7c e9 03 a6 mtctr r7
ffc0bc70: 48 00 00 14 b ffc0bc84 <_Objects_Shrink_information+0x68>
if ( information->inactive_per_block[ block ] ==
ffc0bc74: 84 e8 00 04 lwzu r7,4(r8)
#include <rtems/score/thread.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/isr.h>
void _Objects_Shrink_information(
ffc0bc78: 55 3d 10 3a rlwinm r29,r9,2,0,29
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 ] ==
ffc0bc7c: 7f 8a 38 00 cmpw cr7,r10,r7
ffc0bc80: 41 9e 00 34 beq- cr7,ffc0bcb4 <_Objects_Shrink_information+0x98>
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
ffc0bc84: 39 29 00 01 addi r9,r9,1
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
ffc0bc88: 7f ff 52 14 add r31,r31,r10
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
ffc0bc8c: 42 00 ff e8 bdnz+ ffc0bc74 <_Objects_Shrink_information+0x58>
return;
}
index_base += information->allocation_size;
}
}
ffc0bc90: 80 01 00 1c lwz r0,28(r1)
ffc0bc94: 83 81 00 08 lwz r28,8(r1)
ffc0bc98: 7c 08 03 a6 mtlr r0
ffc0bc9c: 83 a1 00 0c lwz r29,12(r1)
ffc0bca0: 83 c1 00 10 lwz r30,16(r1)
ffc0bca4: 83 e1 00 14 lwz r31,20(r1)
ffc0bca8: 38 21 00 18 addi r1,r1,24
ffc0bcac: 4e 80 00 20 blr
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 ] ==
ffc0bcb0: 3b a0 00 00 li r29,0 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc0bcb4: 80 7c 00 20 lwz r3,32(r28)
ffc0bcb8: 48 00 00 10 b ffc0bcc8 <_Objects_Shrink_information+0xac>
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
ffc0bcbc: 2f 9e 00 00 cmpwi cr7,r30,0
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;
ffc0bcc0: 7f c3 f3 78 mr r3,r30
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
ffc0bcc4: 41 9e 00 34 beq- cr7,ffc0bcf8 <_Objects_Shrink_information+0xdc>
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
do {
index = _Objects_Get_index( the_object->id );
ffc0bcc8: a1 43 00 0a lhz r10,10(r3)
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
ffc0bccc: 83 c3 00 00 lwz r30,0(r3)
if ((index >= index_base) &&
ffc0bcd0: 7f 8a f8 40 cmplw cr7,r10,r31
ffc0bcd4: 41 bc ff e8 blt- cr7,ffc0bcbc <_Objects_Shrink_information+0xa0>
(index < (index_base + information->allocation_size))) {
ffc0bcd8: a1 1c 00 14 lhz r8,20(r28)
ffc0bcdc: 7d 1f 42 14 add r8,r31,r8
/*
* 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) &&
ffc0bce0: 7f 8a 40 40 cmplw cr7,r10,r8
ffc0bce4: 40 9c ff d8 bge+ cr7,ffc0bcbc <_Objects_Shrink_information+0xa0>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
ffc0bce8: 48 00 49 09 bl ffc105f0 <_Chain_Extract>
}
}
while ( the_object );
ffc0bcec: 2f 9e 00 00 cmpwi cr7,r30,0
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;
ffc0bcf0: 7f c3 f3 78 mr r3,r30
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
ffc0bcf4: 40 9e ff d4 bne+ cr7,ffc0bcc8 <_Objects_Shrink_information+0xac><== ALWAYS TAKEN
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
ffc0bcf8: 81 3c 00 34 lwz r9,52(r28)
ffc0bcfc: 7c 69 e8 2e lwzx r3,r9,r29
ffc0bd00: 48 00 22 85 bl ffc0df84 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
ffc0bd04: 81 3c 00 34 lwz r9,52(r28)
return;
}
index_base += information->allocation_size;
}
}
ffc0bd08: 80 01 00 1c lwz r0,28(r1)
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
information->inactive_per_block[ block ] = 0;
information->inactive -= information->allocation_size;
ffc0bd0c: a1 1c 00 2c lhz r8,44(r28)
return;
}
index_base += information->allocation_size;
}
}
ffc0bd10: 7c 08 03 a6 mtlr r0
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
ffc0bd14: 7f c9 e9 2e stwx r30,r9,r29
information->inactive_per_block[ block ] = 0;
information->inactive -= information->allocation_size;
ffc0bd18: a1 5c 00 14 lhz r10,20(r28)
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
information->inactive_per_block[ block ] = 0;
ffc0bd1c: 81 3c 00 30 lwz r9,48(r28)
information->inactive -= information->allocation_size;
ffc0bd20: 7d 4a 40 50 subf r10,r10,r8
return;
}
index_base += information->allocation_size;
}
}
ffc0bd24: 83 e1 00 14 lwz r31,20(r1)
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
information->inactive_per_block[ block ] = 0;
ffc0bd28: 7f c9 e9 2e stwx r30,r9,r29
information->inactive -= information->allocation_size;
ffc0bd2c: b1 5c 00 2c sth r10,44(r28)
return;
}
index_base += information->allocation_size;
}
}
ffc0bd30: 83 a1 00 0c lwz r29,12(r1)
ffc0bd34: 83 81 00 08 lwz r28,8(r1)
ffc0bd38: 83 c1 00 10 lwz r30,16(r1)
ffc0bd3c: 38 21 00 18 addi r1,r1,24
ffc0bd40: 4e 80 00 20 blr
ffc0bbcc <_POSIX_Absolute_timeout_to_ticks>:
*/
POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks(
const struct timespec *abstime,
Watchdog_Interval *ticks_out
)
{
ffc0bbcc: 94 21 ff c8 stwu r1,-56(r1)
ffc0bbd0: 7c 08 02 a6 mflr r0
/*
* Make sure there is always a value returned.
*/
*ticks_out = 0;
ffc0bbd4: 39 20 00 00 li r9,0
*/
POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks(
const struct timespec *abstime,
Watchdog_Interval *ticks_out
)
{
ffc0bbd8: 93 81 00 28 stw r28,40(r1)
ffc0bbdc: 7c 7c 1b 78 mr r28,r3
ffc0bbe0: 93 a1 00 2c stw r29,44(r1)
ffc0bbe4: 7c 9d 23 78 mr r29,r4
ffc0bbe8: 90 01 00 3c stw r0,60(r1)
ffc0bbec: 93 c1 00 30 stw r30,48(r1)
ffc0bbf0: 93 e1 00 34 stw r31,52(r1)
/*
* Make sure there is always a value returned.
*/
*ticks_out = 0;
ffc0bbf4: 91 24 00 00 stw r9,0(r4)
/*
* Is the absolute time even valid?
*/
if ( !_Timespec_Is_valid(abstime) )
ffc0bbf8: 48 00 51 99 bl ffc10d90 <_Timespec_Is_valid>
ffc0bbfc: 2f 83 00 00 cmpwi cr7,r3,0
ffc0bc00: 40 9e 00 28 bne- cr7,ffc0bc28 <_POSIX_Absolute_timeout_to_ticks+0x5c>
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
ffc0bc04: 38 60 00 00 li r3,0
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
ffc0bc08: 80 01 00 3c lwz r0,60(r1)
ffc0bc0c: 83 81 00 28 lwz r28,40(r1)
ffc0bc10: 7c 08 03 a6 mtlr r0
ffc0bc14: 83 a1 00 2c lwz r29,44(r1)
ffc0bc18: 83 c1 00 30 lwz r30,48(r1)
ffc0bc1c: 83 e1 00 34 lwz r31,52(r1)
ffc0bc20: 38 21 00 38 addi r1,r1,56
ffc0bc24: 4e 80 00 20 blr
)
{
Timestamp_Control tod_as_timestamp;
Timestamp_Control *tod_as_timestamp_ptr;
tod_as_timestamp_ptr =
ffc0bc28: 3c 80 00 00 lis r4,0
ffc0bc2c: 38 84 2c c0 addi r4,r4,11456
ffc0bc30: 38 61 00 18 addi r3,r1,24
ffc0bc34: 48 00 26 41 bl ffc0e274 <_TOD_Get_with_nanoseconds>
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc0bc38: 3c c0 3b 9a lis r6,15258
ffc0bc3c: 83 c3 00 00 lwz r30,0(r3)
ffc0bc40: 38 a0 00 00 li r5,0
ffc0bc44: 83 e3 00 04 lwz r31,4(r3)
ffc0bc48: 60 c6 ca 00 ori r6,r6,51712
ffc0bc4c: 7f c3 f3 78 mr r3,r30
ffc0bc50: 7f e4 fb 78 mr r4,r31
ffc0bc54: 48 00 f7 01 bl ffc1b354 <__divdi3>
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc0bc58: 3c c0 3b 9a lis r6,15258
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc0bc5c: 90 81 00 10 stw r4,16(r1)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc0bc60: 38 a0 00 00 li r5,0
ffc0bc64: 60 c6 ca 00 ori r6,r6,51712
ffc0bc68: 7f c3 f3 78 mr r3,r30
ffc0bc6c: 7f e4 fb 78 mr r4,r31
ffc0bc70: 48 00 fb 09 bl ffc1b778 <__moddi3>
/*
* Is the absolute time in the past?
*/
_TOD_Get( ¤t_time );
if ( _Timespec_Less_than( abstime, ¤t_time ) )
ffc0bc74: 7f 83 e3 78 mr r3,r28
ffc0bc78: 90 81 00 14 stw r4,20(r1)
ffc0bc7c: 38 81 00 10 addi r4,r1,16
ffc0bc80: 48 00 51 51 bl ffc10dd0 <_Timespec_Less_than>
ffc0bc84: 2f 83 00 00 cmpwi cr7,r3,0
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
ffc0bc88: 38 60 00 01 li r3,1
/*
* Is the absolute time in the past?
*/
_TOD_Get( ¤t_time );
if ( _Timespec_Less_than( abstime, ¤t_time ) )
ffc0bc8c: 40 9e ff 7c bne+ cr7,ffc0bc08 <_POSIX_Absolute_timeout_to_ticks+0x3c>
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
/*
* How long until the requested absolute time?
*/
_Timespec_Subtract( ¤t_time, abstime, &difference );
ffc0bc90: 7f 84 e3 78 mr r4,r28
ffc0bc94: 38 a1 00 08 addi r5,r1,8
ffc0bc98: 38 61 00 10 addi r3,r1,16
ffc0bc9c: 48 00 51 71 bl ffc10e0c <_Timespec_Subtract>
/*
* Internally the SuperCore uses ticks, so convert to them.
*/
*ticks_out = _Timespec_To_ticks( &difference );
ffc0bca0: 38 61 00 08 addi r3,r1,8
ffc0bca4: 48 00 51 b5 bl ffc10e58 <_Timespec_To_ticks>
/*
* If the difference was 0, then the future is now. It is so bright
* we better wear shades.
*/
if ( !*ticks_out )
ffc0bca8: 2f 83 00 00 cmpwi cr7,r3,0
_Timespec_Subtract( ¤t_time, abstime, &difference );
/*
* Internally the SuperCore uses ticks, so convert to them.
*/
*ticks_out = _Timespec_To_ticks( &difference );
ffc0bcac: 90 7d 00 00 stw r3,0(r29)
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
ffc0bcb0: 38 60 00 03 li r3,3
/*
* If the difference was 0, then the future is now. It is so bright
* we better wear shades.
*/
if ( !*ticks_out )
ffc0bcb4: 40 be ff 54 bne- cr7,ffc0bc08 <_POSIX_Absolute_timeout_to_ticks+0x3c><== ALWAYS TAKEN
return POSIX_ABSOLUTE_TIMEOUT_IS_NOW;
ffc0bcb8: 38 60 00 02 li r3,2 <== NOT EXECUTED
ffc0bcbc: 4b ff ff 4c b ffc0bc08 <_POSIX_Absolute_timeout_to_ticks+0x3c><== NOT EXECUTED
ffc127f4 <_POSIX_Keys_Run_destructors>:
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
ffc127f4: 94 21 ff e0 stwu r1,-32(r1)
ffc127f8: 7c 08 02 a6 mflr r0
ffc127fc: 90 01 00 24 stw r0,36(r1)
ffc12800: 93 81 00 10 stw r28,16(r1)
Objects_Maximum thread_index = _Objects_Get_index( thread->Object.id );
ffc12804: 83 83 00 08 lwz r28,8(r3)
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
ffc12808: 93 61 00 0c stw r27,12(r1)
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
ffc1280c: 57 9b 56 fa rlwinm r27,r28,10,27,29
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
ffc12810: 93 c1 00 18 stw r30,24(r1)
ffc12814: 3f c0 00 00 lis r30,0
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
ffc12818: 57 9c 13 ba rlwinm r28,r28,2,14,29
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
ffc1281c: 93 a1 00 14 stw r29,20(r1)
ffc12820: 3b de 30 58 addi r30,r30,12376
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
ffc12824: 3b 7b 00 10 addi r27,r27,16
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
ffc12828: 93 e1 00 1c stw r31,28(r1)
ffc1282c: 93 41 00 08 stw r26,8(r1)
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
if ( value != NULL ) {
key->Values [ thread_api ][ thread_index ] = NULL;
ffc12830: 3b 40 00 00 li r26,0
*
* Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
*/
while ( !done ) {
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
ffc12834: a3 fe 00 10 lhz r31,16(r30)
done = true;
for ( index = 1 ; index <= max ; ++index ) {
ffc12838: 2f 9f 00 00 cmpwi cr7,r31,0
ffc1283c: 40 9e 00 2c bne- cr7,ffc12868 <_POSIX_Keys_Run_destructors+0x74>
done = false;
}
}
}
}
}
ffc12840: 80 01 00 24 lwz r0,36(r1)
ffc12844: 83 41 00 08 lwz r26,8(r1)
ffc12848: 7c 08 03 a6 mtlr r0
ffc1284c: 83 61 00 0c lwz r27,12(r1)
ffc12850: 83 81 00 10 lwz r28,16(r1)
ffc12854: 83 a1 00 14 lwz r29,20(r1)
ffc12858: 83 c1 00 18 lwz r30,24(r1)
ffc1285c: 83 e1 00 1c lwz r31,28(r1)
ffc12860: 38 21 00 20 addi r1,r1,32
ffc12864: 4e 80 00 20 blr
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
ffc12868: 3b a0 00 01 li r29,1
ffc1286c: 39 40 00 01 li r10,1
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
ffc12870: 81 3e 00 1c lwz r9,28(r30)
ffc12874: 57 a8 10 3a rlwinm r8,r29,2,0,29
ffc12878: 7d 29 40 2e lwzx r9,r9,r8
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
ffc1287c: 2f 89 00 00 cmpwi cr7,r9,0
void *value = key->Values [ thread_api ][ thread_index ];
ffc12880: 7d 09 da 14 add r8,r9,r27
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
ffc12884: 41 9e 00 34 beq- cr7,ffc128b8 <_POSIX_Keys_Run_destructors+0xc4>
ffc12888: 80 e9 00 10 lwz r7,16(r9)
ffc1288c: 2f 87 00 00 cmpwi cr7,r7,0
ffc12890: 41 9e 00 28 beq- cr7,ffc128b8 <_POSIX_Keys_Run_destructors+0xc4>
void *value = key->Values [ thread_api ][ thread_index ];
ffc12894: 81 08 00 04 lwz r8,4(r8)
ffc12898: 7c 68 e0 2e lwzx r3,r8,r28
if ( value != NULL ) {
ffc1289c: 2f 83 00 00 cmpwi cr7,r3,0
ffc128a0: 41 9e 00 18 beq- cr7,ffc128b8 <_POSIX_Keys_Run_destructors+0xc4><== ALWAYS TAKEN
key->Values [ thread_api ][ thread_index ] = NULL;
ffc128a4: 7f 48 e1 2e stwx r26,r8,r28 <== NOT EXECUTED
(*key->destructor)( value );
ffc128a8: 81 29 00 10 lwz r9,16(r9) <== NOT EXECUTED
ffc128ac: 7d 29 03 a6 mtctr r9 <== NOT EXECUTED
ffc128b0: 4e 80 04 21 bctrl <== NOT EXECUTED
done = false;
ffc128b4: 39 40 00 00 li r10,0 <== NOT EXECUTED
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
ffc128b8: 3b bd 00 01 addi r29,r29,1
ffc128bc: 57 bd 04 3e clrlwi r29,r29,16
ffc128c0: 7f 9f e8 40 cmplw cr7,r31,r29
ffc128c4: 40 bc ff ac bge- cr7,ffc12870 <_POSIX_Keys_Run_destructors+0x7c>
* number of iterations. An infinite loop may happen if destructors set
* thread specific data. This can be considered dubious.
*
* Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
*/
while ( !done ) {
ffc128c8: 2f 8a 00 00 cmpwi cr7,r10,0
ffc128cc: 41 9e ff 68 beq+ cr7,ffc12834 <_POSIX_Keys_Run_destructors+0x40><== NEVER TAKEN
ffc128d0: 4b ff ff 70 b ffc12840 <_POSIX_Keys_Run_destructors+0x4c>
ffc0f758 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
ffc0f758: 94 21 ff d0 stwu r1,-48(r1)
ffc0f75c: 7c 08 02 a6 mflr r0
ffc0f760: 93 e1 00 2c stw r31,44(r1)
ffc0f764: 7c 7f 1b 78 mr r31,r3
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(
ffc0f768: 3c 60 00 00 lis r3,0
ffc0f76c: 93 81 00 20 stw r28,32(r1)
ffc0f770: 38 63 36 4c addi r3,r3,13900
ffc0f774: 7c 9c 23 78 mr r28,r4
ffc0f778: 93 a1 00 24 stw r29,36(r1)
ffc0f77c: 7f e4 fb 78 mr r4,r31
ffc0f780: 7c bd 2b 78 mr r29,r5
ffc0f784: 38 a1 00 0c addi r5,r1,12
ffc0f788: 93 41 00 18 stw r26,24(r1)
ffc0f78c: 7c fa 3b 78 mr r26,r7
ffc0f790: 93 61 00 1c stw r27,28(r1)
ffc0f794: 7d 1b 43 78 mr r27,r8
ffc0f798: 93 c1 00 28 stw r30,40(r1)
ffc0f79c: 7c de 33 78 mr r30,r6
ffc0f7a0: 90 01 00 34 stw r0,52(r1)
ffc0f7a4: 48 00 40 85 bl ffc13828 <_Objects_Get>
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
ffc0f7a8: 81 21 00 0c lwz r9,12(r1)
ffc0f7ac: 2f 89 00 00 cmpwi cr7,r9,0
ffc0f7b0: 41 9e 00 3c beq- cr7,ffc0f7ec <_POSIX_Message_queue_Receive_support+0x94>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
ffc0f7b4: 48 00 be b1 bl ffc1b664 <__errno>
ffc0f7b8: 39 20 00 09 li r9,9
ffc0f7bc: 91 23 00 00 stw r9,0(r3)
ffc0f7c0: 38 60 ff ff li r3,-1
}
ffc0f7c4: 80 01 00 34 lwz r0,52(r1)
ffc0f7c8: 83 41 00 18 lwz r26,24(r1)
ffc0f7cc: 7c 08 03 a6 mtlr r0
ffc0f7d0: 83 61 00 1c lwz r27,28(r1)
ffc0f7d4: 83 81 00 20 lwz r28,32(r1)
ffc0f7d8: 83 a1 00 24 lwz r29,36(r1)
ffc0f7dc: 83 c1 00 28 lwz r30,40(r1)
ffc0f7e0: 83 e1 00 2c lwz r31,44(r1)
ffc0f7e4: 38 21 00 30 addi r1,r1,48
ffc0f7e8: 4e 80 00 20 blr
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
ffc0f7ec: 81 23 00 14 lwz r9,20(r3)
ffc0f7f0: 55 2a 07 be clrlwi r10,r9,30
ffc0f7f4: 2f 8a 00 01 cmpwi cr7,r10,1
ffc0f7f8: 41 9e 00 e8 beq- cr7,ffc0f8e0 <_POSIX_Message_queue_Receive_support+0x188>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
ffc0f7fc: 80 63 00 10 lwz r3,16(r3)
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
ffc0f800: 81 43 00 68 lwz r10,104(r3)
ffc0f804: 7f 8a e8 40 cmplw cr7,r10,r29
ffc0f808: 41 9d 00 a0 bgt- cr7,ffc0f8a8 <_POSIX_Message_queue_Receive_support+0x150>
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
ffc0f80c: 2f 9a 00 00 cmpwi cr7,r26,0
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
ffc0f810: 39 40 ff ff li r10,-1
ffc0f814: 91 41 00 08 stw r10,8(r1)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
ffc0f818: 38 e0 00 00 li r7,0
ffc0f81c: 40 9e 00 80 bne- cr7,ffc0f89c <_POSIX_Message_queue_Receive_support+0x144>
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
ffc0f820: 7f e4 fb 78 mr r4,r31
ffc0f824: 38 63 00 1c addi r3,r3,28
ffc0f828: 7f 85 e3 78 mr r5,r28
ffc0f82c: 38 c1 00 08 addi r6,r1,8
ffc0f830: 7f 68 db 78 mr r8,r27
ffc0f834: 48 00 2a cd bl ffc12300 <_CORE_message_queue_Seize>
);
_Thread_Enable_dispatch();
if (msg_prio) {
*msg_prio = _POSIX_Message_queue_Priority_from_core(
_Thread_Executing->Wait.count
ffc0f838: 3f e0 00 00 lis r31,0
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
ffc0f83c: 48 00 51 65 bl ffc149a0 <_Thread_Enable_dispatch>
if (msg_prio) {
ffc0f840: 2f 9e 00 00 cmpwi cr7,r30,0
*msg_prio = _POSIX_Message_queue_Priority_from_core(
_Thread_Executing->Wait.count
ffc0f844: 3b ff 36 e0 addi r31,r31,14048
ffc0f848: 81 3f 00 10 lwz r9,16(r31)
do_wait,
timeout
);
_Thread_Enable_dispatch();
if (msg_prio) {
ffc0f84c: 41 9e 00 18 beq- cr7,ffc0f864 <_POSIX_Message_queue_Receive_support+0x10c><== NEVER TAKEN
RTEMS_INLINE_ROUTINE unsigned int _POSIX_Message_queue_Priority_from_core(
CORE_message_queue_Submit_types priority
)
{
/* absolute value without a library dependency */
return (unsigned int) ((priority >= 0) ? priority : -priority);
ffc0f850: 81 49 00 24 lwz r10,36(r9)
ffc0f854: 7d 48 fe 70 srawi r8,r10,31
ffc0f858: 7d 0a 52 78 xor r10,r8,r10
ffc0f85c: 7d 48 50 50 subf r10,r8,r10
*msg_prio = _POSIX_Message_queue_Priority_from_core(
ffc0f860: 91 5e 00 00 stw r10,0(r30)
_Thread_Executing->Wait.count
);
}
if ( !_Thread_Executing->Wait.return_code )
ffc0f864: 81 29 00 34 lwz r9,52(r9)
ffc0f868: 2f 89 00 00 cmpwi cr7,r9,0
ffc0f86c: 40 9e 00 54 bne- cr7,ffc0f8c0 <_POSIX_Message_queue_Receive_support+0x168>
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
ffc0f870: 80 01 00 34 lwz r0,52(r1)
_Thread_Executing->Wait.count
);
}
if ( !_Thread_Executing->Wait.return_code )
return length_out;
ffc0f874: 80 61 00 08 lwz r3,8(r1)
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
ffc0f878: 7c 08 03 a6 mtlr r0
ffc0f87c: 83 41 00 18 lwz r26,24(r1)
ffc0f880: 83 61 00 1c lwz r27,28(r1)
ffc0f884: 83 81 00 20 lwz r28,32(r1)
ffc0f888: 83 a1 00 24 lwz r29,36(r1)
ffc0f88c: 83 c1 00 28 lwz r30,40(r1)
ffc0f890: 83 e1 00 2c lwz r31,44(r1)
ffc0f894: 38 21 00 30 addi r1,r1,48
ffc0f898: 4e 80 00 20 blr
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
ffc0f89c: 69 29 40 00 xori r9,r9,16384
ffc0f8a0: 55 27 97 fe rlwinm r7,r9,18,31,31
ffc0f8a4: 4b ff ff 7c b ffc0f820 <_POSIX_Message_queue_Receive_support+0xc8>
}
the_mq = the_mq_fd->Queue;
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
_Thread_Enable_dispatch();
ffc0f8a8: 48 00 50 f9 bl ffc149a0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
ffc0f8ac: 48 00 bd b9 bl ffc1b664 <__errno>
ffc0f8b0: 39 20 00 7a li r9,122
ffc0f8b4: 91 23 00 00 stw r9,0(r3)
ffc0f8b8: 38 60 ff ff li r3,-1
ffc0f8bc: 4b ff ff 08 b ffc0f7c4 <_POSIX_Message_queue_Receive_support+0x6c>
}
if ( !_Thread_Executing->Wait.return_code )
return length_out;
rtems_set_errno_and_return_minus_one(
ffc0f8c0: 48 00 bd a5 bl ffc1b664 <__errno>
ffc0f8c4: 81 3f 00 10 lwz r9,16(r31)
ffc0f8c8: 7c 7e 1b 78 mr r30,r3
ffc0f8cc: 80 69 00 34 lwz r3,52(r9)
ffc0f8d0: 48 00 03 51 bl ffc0fc20 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
ffc0f8d4: 90 7e 00 00 stw r3,0(r30)
ffc0f8d8: 38 60 ff ff li r3,-1
ffc0f8dc: 4b ff fe e8 b ffc0f7c4 <_POSIX_Message_queue_Receive_support+0x6c>
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();
ffc0f8e0: 48 00 50 c1 bl ffc149a0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
ffc0f8e4: 48 00 bd 81 bl ffc1b664 <__errno>
ffc0f8e8: 39 20 00 09 li r9,9
ffc0f8ec: 91 23 00 00 stw r9,0(r3)
ffc0f8f0: 38 60 ff ff li r3,-1
ffc0f8f4: 4b ff fe d0 b ffc0f7c4 <_POSIX_Message_queue_Receive_support+0x6c>
ffc0f904 <_POSIX_Message_queue_Send_support>:
/*
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
ffc0f904: 2b 86 00 20 cmplwi cr7,r6,32
size_t msg_len,
unsigned int msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
ffc0f908: 94 21 ff d0 stwu r1,-48(r1)
ffc0f90c: 7c 08 02 a6 mflr r0
ffc0f910: 93 e1 00 2c stw r31,44(r1)
ffc0f914: 7c df 33 78 mr r31,r6
ffc0f918: 90 01 00 34 stw r0,52(r1)
ffc0f91c: 93 41 00 18 stw r26,24(r1)
ffc0f920: 93 61 00 1c stw r27,28(r1)
ffc0f924: 93 81 00 20 stw r28,32(r1)
ffc0f928: 93 a1 00 24 stw r29,36(r1)
ffc0f92c: 93 c1 00 28 stw r30,40(r1)
/*
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
ffc0f930: 41 9d 01 14 bgt- cr7,ffc0fa44 <_POSIX_Message_queue_Send_support+0x140>
ffc0f934: 7c 7e 1b 78 mr r30,r3
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(
ffc0f938: 3c 60 00 00 lis r3,0
ffc0f93c: 7c 9b 23 78 mr r27,r4
ffc0f940: 7c bc 2b 78 mr r28,r5
ffc0f944: 38 63 36 4c addi r3,r3,13900
ffc0f948: 7f c4 f3 78 mr r4,r30
ffc0f94c: 38 a1 00 08 addi r5,r1,8
ffc0f950: 7c fa 3b 78 mr r26,r7
ffc0f954: 7d 1d 43 78 mr r29,r8
ffc0f958: 48 00 3e d1 bl ffc13828 <_Objects_Get>
rtems_set_errno_and_return_minus_one( EINVAL );
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
ffc0f95c: 81 21 00 08 lwz r9,8(r1)
ffc0f960: 2f 89 00 00 cmpwi cr7,r9,0
ffc0f964: 40 9e 00 cc bne- cr7,ffc0fa30 <_POSIX_Message_queue_Send_support+0x12c>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
ffc0f968: 80 c3 00 14 lwz r6,20(r3)
ffc0f96c: 70 c9 00 03 andi. r9,r6,3
ffc0f970: 41 82 00 e8 beq- ffc0fa58 <_POSIX_Message_queue_Send_support+0x154>
the_mq = the_mq_fd->Queue;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
ffc0f974: 2f 9a 00 00 cmpwi cr7,r26,0
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
ffc0f978: 80 63 00 10 lwz r3,16(r3)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
ffc0f97c: 39 20 00 00 li r9,0
ffc0f980: 40 9e 00 68 bne- cr7,ffc0f9e8 <_POSIX_Message_queue_Send_support+0xe4>
do_wait = wait;
/*
* Now perform the actual message receive
*/
msg_status = _CORE_message_queue_Submit(
ffc0f984: 7d 1f 00 d0 neg r8,r31
ffc0f988: 7f 64 db 78 mr r4,r27
ffc0f98c: 7f 85 e3 78 mr r5,r28
ffc0f990: 7f c6 f3 78 mr r6,r30
ffc0f994: 38 e0 00 00 li r7,0
ffc0f998: 7f aa eb 78 mr r10,r29
ffc0f99c: 38 63 00 1c addi r3,r3,28
ffc0f9a0: 48 00 2a e9 bl ffc12488 <_CORE_message_queue_Submit>
ffc0f9a4: 7c 7f 1b 78 mr r31,r3
_POSIX_Message_queue_Priority_to_core( msg_prio ),
do_wait,
timeout /* no timeout */
);
_Thread_Enable_dispatch();
ffc0f9a8: 48 00 4f f9 bl ffc149a0 <_Thread_Enable_dispatch>
* after it wakes up. The returned status is correct for
* non-blocking operations but if we blocked, then we need
* to look at the status in our TCB.
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
ffc0f9ac: 2f 9f 00 07 cmpwi cr7,r31,7
ffc0f9b0: 41 9e 00 70 beq- cr7,ffc0fa20 <_POSIX_Message_queue_Send_support+0x11c><== NEVER TAKEN
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
ffc0f9b4: 2f 9f 00 00 cmpwi cr7,r31,0
return msg_status;
ffc0f9b8: 38 60 00 00 li r3,0
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
ffc0f9bc: 40 9e 00 b4 bne- cr7,ffc0fa70 <_POSIX_Message_queue_Send_support+0x16c>
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
ffc0f9c0: 80 01 00 34 lwz r0,52(r1)
ffc0f9c4: 83 41 00 18 lwz r26,24(r1)
ffc0f9c8: 7c 08 03 a6 mtlr r0
ffc0f9cc: 83 61 00 1c lwz r27,28(r1)
ffc0f9d0: 83 81 00 20 lwz r28,32(r1)
ffc0f9d4: 83 a1 00 24 lwz r29,36(r1)
ffc0f9d8: 83 c1 00 28 lwz r30,40(r1)
ffc0f9dc: 83 e1 00 2c lwz r31,44(r1)
ffc0f9e0: 38 21 00 30 addi r1,r1,48
ffc0f9e4: 4e 80 00 20 blr
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
ffc0f9e8: 68 c6 40 00 xori r6,r6,16384
ffc0f9ec: 54 c9 97 fe rlwinm r9,r6,18,31,31
do_wait = wait;
/*
* Now perform the actual message receive
*/
msg_status = _CORE_message_queue_Submit(
ffc0f9f0: 7d 1f 00 d0 neg r8,r31
ffc0f9f4: 7f 64 db 78 mr r4,r27
ffc0f9f8: 7f 85 e3 78 mr r5,r28
ffc0f9fc: 7f c6 f3 78 mr r6,r30
ffc0fa00: 38 e0 00 00 li r7,0
ffc0fa04: 7f aa eb 78 mr r10,r29
ffc0fa08: 38 63 00 1c addi r3,r3,28
ffc0fa0c: 48 00 2a 7d bl ffc12488 <_CORE_message_queue_Submit>
ffc0fa10: 7c 7f 1b 78 mr r31,r3
_POSIX_Message_queue_Priority_to_core( msg_prio ),
do_wait,
timeout /* no timeout */
);
_Thread_Enable_dispatch();
ffc0fa14: 48 00 4f 8d bl ffc149a0 <_Thread_Enable_dispatch>
* after it wakes up. The returned status is correct for
* non-blocking operations but if we blocked, then we need
* to look at the status in our TCB.
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
ffc0fa18: 2f 9f 00 07 cmpwi cr7,r31,7
ffc0fa1c: 40 9e ff 98 bne+ cr7,ffc0f9b4 <_POSIX_Message_queue_Send_support+0xb0>
msg_status = _Thread_Executing->Wait.return_code;
ffc0fa20: 3d 20 00 00 lis r9,0
ffc0fa24: 81 29 36 f0 lwz r9,14064(r9)
ffc0fa28: 83 e9 00 34 lwz r31,52(r9)
ffc0fa2c: 4b ff ff 88 b ffc0f9b4 <_POSIX_Message_queue_Send_support+0xb0>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
ffc0fa30: 48 00 bc 35 bl ffc1b664 <__errno>
ffc0fa34: 39 20 00 09 li r9,9
ffc0fa38: 91 23 00 00 stw r9,0(r3)
ffc0fa3c: 38 60 ff ff li r3,-1
ffc0fa40: 4b ff ff 80 b ffc0f9c0 <_POSIX_Message_queue_Send_support+0xbc>
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc0fa44: 48 00 bc 21 bl ffc1b664 <__errno>
ffc0fa48: 39 20 00 16 li r9,22
ffc0fa4c: 91 23 00 00 stw r9,0(r3)
ffc0fa50: 38 60 ff ff li r3,-1
ffc0fa54: 4b ff ff 6c b ffc0f9c0 <_POSIX_Message_queue_Send_support+0xbc>
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
_Thread_Enable_dispatch();
ffc0fa58: 48 00 4f 49 bl ffc149a0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
ffc0fa5c: 48 00 bc 09 bl ffc1b664 <__errno>
ffc0fa60: 39 20 00 09 li r9,9
ffc0fa64: 91 23 00 00 stw r9,0(r3)
ffc0fa68: 38 60 ff ff li r3,-1
ffc0fa6c: 4b ff ff 54 b ffc0f9c0 <_POSIX_Message_queue_Send_support+0xbc>
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
return msg_status;
rtems_set_errno_and_return_minus_one(
ffc0fa70: 48 00 bb f5 bl ffc1b664 <__errno>
ffc0fa74: 7c 7e 1b 78 mr r30,r3
ffc0fa78: 7f e3 fb 78 mr r3,r31
ffc0fa7c: 48 00 01 a5 bl ffc0fc20 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
ffc0fa80: 90 7e 00 00 stw r3,0(r30)
ffc0fa84: 38 60 ff ff li r3,-1
ffc0fa88: 4b ff ff 38 b ffc0f9c0 <_POSIX_Message_queue_Send_support+0xbc>
ffc12890 <_POSIX_Semaphore_Create_support>:
size_t name_len,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
ffc12890: 94 21 ff d8 stwu r1,-40(r1)
ffc12894: 7c 08 02 a6 mflr r0
ffc12898: 93 21 00 0c stw r25,12(r1)
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
ffc1289c: 7c b9 2b 79 mr. r25,r5
size_t name_len,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
ffc128a0: 90 01 00 2c stw r0,44(r1)
ffc128a4: 93 41 00 10 stw r26,16(r1)
ffc128a8: 93 61 00 14 stw r27,20(r1)
ffc128ac: 93 81 00 18 stw r28,24(r1)
ffc128b0: 93 a1 00 1c stw r29,28(r1)
ffc128b4: 93 c1 00 20 stw r30,32(r1)
ffc128b8: 93 e1 00 24 stw r31,36(r1)
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
ffc128bc: 40 82 00 f4 bne- ffc129b0 <_POSIX_Semaphore_Create_support+0x120>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc128c0: 3d 20 00 00 lis r9,0
ffc128c4: 81 49 28 a8 lwz r10,10408(r9)
ffc128c8: 7c 7e 1b 78 mr r30,r3
ffc128cc: 7c 9a 23 78 mr r26,r4
++level;
ffc128d0: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc128d4: 91 49 28 a8 stw r10,10408(r9)
ffc128d8: 7c dc 33 78 mr r28,r6
ffc128dc: 7c fb 3b 78 mr r27,r7
* _POSIX_Semaphore_Allocate
*/
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
{
return (POSIX_Semaphore_Control *)
ffc128e0: 3f a0 00 00 lis r29,0
ffc128e4: 3b bd 59 00 addi r29,r29,22784
ffc128e8: 7f a3 eb 78 mr r3,r29
ffc128ec: 4b ff ae bd bl ffc0d7a8 <_Objects_Allocate>
rtems_set_errno_and_return_minus_one( ENOSYS );
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
ffc128f0: 7c 7f 1b 79 mr. r31,r3
ffc128f4: 41 82 00 d0 beq- ffc129c4 <_POSIX_Semaphore_Create_support+0x134>
/*
* Make a copy of the user's string for name just in case it was
* dynamically constructed.
*/
if ( name_arg != NULL ) {
ffc128f8: 2f 9e 00 00 cmpwi cr7,r30,0
ffc128fc: 41 9e 00 9c beq- cr7,ffc12998 <_POSIX_Semaphore_Create_support+0x108>
name = _Workspace_String_duplicate( name_arg, name_len );
ffc12900: 7f 44 d3 78 mr r4,r26
ffc12904: 7f c3 f3 78 mr r3,r30
ffc12908: 48 00 11 1d bl ffc13a24 <_Workspace_String_duplicate>
if ( !name ) {
ffc1290c: 7c 7a 1b 79 mr. r26,r3
ffc12910: 41 82 00 cc beq- ffc129dc <_POSIX_Semaphore_Create_support+0x14c><== NEVER TAKEN
the_semaphore->process_shared = pshared;
if ( name ) {
the_semaphore->named = true;
the_semaphore->open_count = 1;
ffc12914: 39 20 00 01 li r9,1
}
} else {
name = NULL;
}
the_semaphore->process_shared = pshared;
ffc12918: 93 3f 00 10 stw r25,16(r31)
if ( name ) {
the_semaphore->named = true;
ffc1291c: 39 40 00 01 li r10,1
ffc12920: 99 5f 00 14 stb r10,20(r31)
the_semaphore->open_count = 1;
ffc12924: 91 3f 00 18 stw r9,24(r31)
the_semaphore->linked = true;
ffc12928: 99 3f 00 15 stb r9,21(r31)
* blocking tasks on this semaphore should be. It could somehow
* be derived from the current scheduling policy. One
* thing is certain, no matter what we decide, it won't be
* the same as all other POSIX implementations. :)
*/
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
ffc1292c: 39 20 00 00 li r9,0
ffc12930: 91 3f 00 60 stw r9,96(r31)
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
ffc12934: 39 20 ff ff li r9,-1
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
ffc12938: 38 7f 00 1c addi r3,r31,28
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
ffc1293c: 91 3f 00 5c stw r9,92(r31)
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
ffc12940: 38 9f 00 5c addi r4,r31,92
ffc12944: 7f 85 e3 78 mr r5,r28
ffc12948: 4b ff a7 39 bl ffc0d080 <_CORE_semaphore_Initialize>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
ffc1294c: a1 3f 00 0a lhz r9,10(r31)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc12950: 81 5d 00 1c lwz r10,28(r29)
ffc12954: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc12958: 7f ea 49 2e stwx r31,r10,r9
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
ffc1295c: 93 5f 00 0c stw r26,12(r31)
&_POSIX_Semaphore_Information,
&the_semaphore->Object,
name
);
*the_sem = the_semaphore;
ffc12960: 93 fb 00 00 stw r31,0(r27)
_Thread_Enable_dispatch();
ffc12964: 4b ff c6 29 bl ffc0ef8c <_Thread_Enable_dispatch>
return 0;
ffc12968: 38 60 00 00 li r3,0
}
ffc1296c: 80 01 00 2c lwz r0,44(r1)
ffc12970: 83 21 00 0c lwz r25,12(r1)
ffc12974: 7c 08 03 a6 mtlr r0
ffc12978: 83 41 00 10 lwz r26,16(r1)
ffc1297c: 83 61 00 14 lwz r27,20(r1)
ffc12980: 83 81 00 18 lwz r28,24(r1)
ffc12984: 83 a1 00 1c lwz r29,28(r1)
ffc12988: 83 c1 00 20 lwz r30,32(r1)
ffc1298c: 83 e1 00 24 lwz r31,36(r1)
ffc12990: 38 21 00 28 addi r1,r1,40
ffc12994: 4e 80 00 20 blr
}
} else {
name = NULL;
}
the_semaphore->process_shared = pshared;
ffc12998: 93 df 00 10 stw r30,16(r31)
_POSIX_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENOMEM );
}
} else {
name = NULL;
ffc1299c: 3b 40 00 00 li r26,0
if ( name ) {
the_semaphore->named = true;
the_semaphore->open_count = 1;
the_semaphore->linked = true;
} else {
the_semaphore->named = false;
ffc129a0: 9b df 00 14 stb r30,20(r31)
the_semaphore->open_count = 0;
ffc129a4: 93 df 00 18 stw r30,24(r31)
the_semaphore->linked = false;
ffc129a8: 9b df 00 15 stb r30,21(r31)
ffc129ac: 4b ff ff 80 b ffc1292c <_POSIX_Semaphore_Create_support+0x9c>
CORE_semaphore_Attributes *the_sem_attr;
char *name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc129b0: 48 00 2e cd bl ffc1587c <__errno>
ffc129b4: 39 20 00 58 li r9,88
ffc129b8: 91 23 00 00 stw r9,0(r3)
ffc129bc: 38 60 ff ff li r3,-1
ffc129c0: 4b ff ff ac b ffc1296c <_POSIX_Semaphore_Create_support+0xdc>
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
ffc129c4: 4b ff c5 c9 bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
ffc129c8: 48 00 2e b5 bl ffc1587c <__errno>
ffc129cc: 39 20 00 1c li r9,28
ffc129d0: 91 23 00 00 stw r9,0(r3)
ffc129d4: 38 60 ff ff li r3,-1
ffc129d8: 4b ff ff 94 b ffc1296c <_POSIX_Semaphore_Create_support+0xdc>
RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
POSIX_Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
ffc129dc: 7f a3 eb 78 mr r3,r29 <== NOT EXECUTED
ffc129e0: 7f e4 fb 78 mr r4,r31 <== NOT EXECUTED
ffc129e4: 4b ff b1 d5 bl ffc0dbb8 <_Objects_Free> <== NOT EXECUTED
*/
if ( name_arg != NULL ) {
name = _Workspace_String_duplicate( name_arg, name_len );
if ( !name ) {
_POSIX_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
ffc129e8: 4b ff c5 a5 bl ffc0ef8c <_Thread_Enable_dispatch> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOMEM );
ffc129ec: 48 00 2e 91 bl ffc1587c <__errno> <== NOT EXECUTED
ffc129f0: 39 20 00 0c li r9,12 <== NOT EXECUTED
ffc129f4: 91 23 00 00 stw r9,0(r3) <== NOT EXECUTED
ffc129f8: 38 60 ff ff li r3,-1 <== NOT EXECUTED
ffc129fc: 4b ff ff 70 b ffc1296c <_POSIX_Semaphore_Create_support+0xdc><== NOT EXECUTED
ffc0f5a0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
Thread_Control *the_thread
)
{
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc0f5a0: 81 23 01 50 lwz r9,336(r3)
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
ffc0f5a4: 81 49 00 d8 lwz r10,216(r9)
ffc0f5a8: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0f5ac: 40 9e 00 10 bne- cr7,ffc0f5bc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x1c><== NEVER TAKEN
ffc0f5b0: 81 49 00 dc lwz r10,220(r9)
ffc0f5b4: 2f 8a 00 01 cmpwi cr7,r10,1
ffc0f5b8: 41 9e 00 08 beq- cr7,ffc0f5c0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20>
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();
ffc0f5bc: 4b ff d2 c0 b ffc0c87c <_Thread_Enable_dispatch>
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 &&
ffc0f5c0: 81 29 00 e0 lwz r9,224(r9)
ffc0f5c4: 2f 89 00 00 cmpwi cr7,r9,0
ffc0f5c8: 41 9e ff f4 beq+ cr7,ffc0f5bc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x1c>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0f5cc: 3d 20 00 00 lis r9,0
ffc0f5d0: 81 49 28 70 lwz r10,10352(r9)
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
ffc0f5d4: 38 80 ff ff li r4,-1
--level;
ffc0f5d8: 39 4a ff ff addi r10,r10,-1
_Thread_Dispatch_disable_level = level;
ffc0f5dc: 91 49 28 70 stw r10,10352(r9)
ffc0f5e0: 48 00 07 dc b ffc0fdbc <_POSIX_Thread_Exit>
ffc10cf0 <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
ffc10cf0: 94 21 ff e8 stwu r1,-24(r1)
ffc10cf4: 7c 08 02 a6 mflr r0
ffc10cf8: 93 c1 00 10 stw r30,16(r1)
ffc10cfc: 7c 7e 1b 78 mr r30,r3
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
ffc10d00: 80 64 00 00 lwz r3,0(r4)
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
ffc10d04: 93 81 00 08 stw r28,8(r1)
ffc10d08: 7c dc 33 78 mr r28,r6
ffc10d0c: 93 a1 00 0c stw r29,12(r1)
ffc10d10: 7c bd 2b 78 mr r29,r5
ffc10d14: 93 e1 00 14 stw r31,20(r1)
ffc10d18: 7c 9f 23 78 mr r31,r4
ffc10d1c: 90 01 00 1c stw r0,28(r1)
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
ffc10d20: 4b ff ff a9 bl ffc10cc8 <_POSIX_Priority_Is_valid>
ffc10d24: 2f 83 00 00 cmpwi cr7,r3,0
ffc10d28: 40 9e 00 28 bne- cr7,ffc10d50 <_POSIX_Thread_Translate_sched_param+0x60><== ALWAYS TAKEN
return EINVAL;
ffc10d2c: 38 60 00 16 li r3,22
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
ffc10d30: 80 01 00 1c lwz r0,28(r1)
ffc10d34: 83 81 00 08 lwz r28,8(r1)
ffc10d38: 7c 08 03 a6 mtlr r0
ffc10d3c: 83 a1 00 0c lwz r29,12(r1)
ffc10d40: 83 c1 00 10 lwz r30,16(r1)
ffc10d44: 83 e1 00 14 lwz r31,20(r1)
ffc10d48: 38 21 00 18 addi r1,r1,24
ffc10d4c: 4e 80 00 20 blr
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
ffc10d50: 2f 9e 00 00 cmpwi cr7,r30,0
)
{
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
ffc10d54: 39 20 00 00 li r9,0
ffc10d58: 91 3d 00 00 stw r9,0(r29)
*budget_callout = NULL;
ffc10d5c: 91 3c 00 00 stw r9,0(r28)
if ( policy == SCHED_OTHER ) {
ffc10d60: 41 9e 00 94 beq- cr7,ffc10df4 <_POSIX_Thread_Translate_sched_param+0x104>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
ffc10d64: 2f 9e 00 01 cmpwi cr7,r30,1
ffc10d68: 41 9e 00 b8 beq- cr7,ffc10e20 <_POSIX_Thread_Translate_sched_param+0x130>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
ffc10d6c: 2f 9e 00 02 cmpwi cr7,r30,2
ffc10d70: 41 9e 00 b8 beq- cr7,ffc10e28 <_POSIX_Thread_Translate_sched_param+0x138>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
ffc10d74: 2f 9e 00 04 cmpwi cr7,r30,4
ffc10d78: 40 9e ff b4 bne+ cr7,ffc10d2c <_POSIX_Thread_Translate_sched_param+0x3c>
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
ffc10d7c: 81 3f 00 08 lwz r9,8(r31)
ffc10d80: 2f 89 00 00 cmpwi cr7,r9,0
ffc10d84: 40 9e 00 10 bne- cr7,ffc10d94 <_POSIX_Thread_Translate_sched_param+0xa4>
ffc10d88: 81 3f 00 0c lwz r9,12(r31)
ffc10d8c: 2f 89 00 00 cmpwi cr7,r9,0
ffc10d90: 41 9e ff 9c beq+ cr7,ffc10d2c <_POSIX_Thread_Translate_sched_param+0x3c>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
ffc10d94: 81 3f 00 10 lwz r9,16(r31)
ffc10d98: 2f 89 00 00 cmpwi cr7,r9,0
ffc10d9c: 40 9e 00 10 bne- cr7,ffc10dac <_POSIX_Thread_Translate_sched_param+0xbc>
ffc10da0: 81 3f 00 14 lwz r9,20(r31)
ffc10da4: 2f 89 00 00 cmpwi cr7,r9,0
ffc10da8: 41 9e ff 84 beq+ cr7,ffc10d2c <_POSIX_Thread_Translate_sched_param+0x3c>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
ffc10dac: 38 7f 00 08 addi r3,r31,8
ffc10db0: 4b ff d8 ed bl ffc0e69c <_Timespec_To_ticks>
ffc10db4: 7c 7e 1b 78 mr r30,r3
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
ffc10db8: 38 7f 00 10 addi r3,r31,16
ffc10dbc: 4b ff d8 e1 bl ffc0e69c <_Timespec_To_ticks>
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 ) <
ffc10dc0: 7f 9e 18 40 cmplw cr7,r30,r3
ffc10dc4: 41 9c ff 68 blt+ cr7,ffc10d2c <_POSIX_Thread_Translate_sched_param+0x3c>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
ffc10dc8: 80 7f 00 04 lwz r3,4(r31)
ffc10dcc: 4b ff fe fd bl ffc10cc8 <_POSIX_Priority_Is_valid>
ffc10dd0: 2f 83 00 00 cmpwi cr7,r3,0
ffc10dd4: 41 9e ff 58 beq+ cr7,ffc10d2c <_POSIX_Thread_Translate_sched_param+0x3c>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
ffc10dd8: 39 20 00 03 li r9,3
ffc10ddc: 91 3d 00 00 stw r9,0(r29)
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
ffc10de0: 3d 20 ff c1 lis r9,-63
ffc10de4: 39 29 9d 58 addi r9,r9,-25256
return 0;
ffc10de8: 38 60 00 00 li r3,0
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
ffc10dec: 91 3c 00 00 stw r9,0(r28)
return 0;
ffc10df0: 4b ff ff 40 b ffc10d30 <_POSIX_Thread_Translate_sched_param+0x40>
}
return EINVAL;
}
ffc10df4: 80 01 00 1c lwz r0,28(r1)
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
ffc10df8: 39 20 00 01 li r9,1
ffc10dfc: 91 3d 00 00 stw r9,0(r29)
return 0;
ffc10e00: 38 60 00 00 li r3,0
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
ffc10e04: 7c 08 03 a6 mtlr r0
ffc10e08: 83 81 00 08 lwz r28,8(r1)
ffc10e0c: 83 a1 00 0c lwz r29,12(r1)
ffc10e10: 83 c1 00 10 lwz r30,16(r1)
ffc10e14: 83 e1 00 14 lwz r31,20(r1)
ffc10e18: 38 21 00 18 addi r1,r1,24
ffc10e1c: 4e 80 00 20 blr
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
ffc10e20: 38 60 00 00 li r3,0
ffc10e24: 4b ff ff 0c b ffc10d30 <_POSIX_Thread_Translate_sched_param+0x40>
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
ffc10e28: 93 dd 00 00 stw r30,0(r29)
return 0;
ffc10e2c: 38 60 00 00 li r3,0
ffc10e30: 4b ff ff 00 b ffc10d30 <_POSIX_Thread_Translate_sched_param+0x40>
ffc0fd38 <_POSIX_Threads_Delete_extension>:
*/
static void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
ffc0fd38: 94 21 ff e8 stwu r1,-24(r1)
ffc0fd3c: 7c 08 02 a6 mflr r0
api = deleted->API_Extensions[ THREAD_API_POSIX ];
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
ffc0fd40: 7c 83 23 78 mr r3,r4
*/
static void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
ffc0fd44: 93 81 00 08 stw r28,8(r1)
ffc0fd48: 93 a1 00 0c stw r29,12(r1)
ffc0fd4c: 7c 9d 23 78 mr r29,r4
Thread_Control *the_thread;
POSIX_API_Control *api;
void **value_ptr;
api = deleted->API_Extensions[ THREAD_API_POSIX ];
ffc0fd50: 83 84 01 50 lwz r28,336(r4)
*/
static void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
ffc0fd54: 90 01 00 1c stw r0,28(r1)
ffc0fd58: 93 c1 00 10 stw r30,16(r1)
ffc0fd5c: 93 e1 00 14 stw r31,20(r1)
api = deleted->API_Extensions[ THREAD_API_POSIX ];
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
ffc0fd60: 48 00 29 f9 bl ffc12758 <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
ffc0fd64: 7f a3 eb 78 mr r3,r29
ffc0fd68: 48 00 2a 8d bl ffc127f4 <_POSIX_Keys_Run_destructors>
ffc0fd6c: 3b fc 00 44 addi r31,r28,68
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
ffc0fd70: 83 dd 00 28 lwz r30,40(r29)
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
ffc0fd74: 48 00 00 0c b ffc0fd80 <_POSIX_Threads_Delete_extension+0x48>
*(void **)the_thread->Wait.return_argument = value_ptr;
ffc0fd78: 81 23 00 28 lwz r9,40(r3) <== NOT EXECUTED
ffc0fd7c: 93 c9 00 00 stw r30,0(r9) <== NOT EXECUTED
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
ffc0fd80: 7f e3 fb 78 mr r3,r31
ffc0fd84: 4b ff d1 59 bl ffc0cedc <_Thread_queue_Dequeue>
ffc0fd88: 2c 03 00 00 cmpwi r3,0
ffc0fd8c: 40 82 ff ec bne+ ffc0fd78 <_POSIX_Threads_Delete_extension+0x40><== NEVER TAKEN
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
ffc0fd90: 81 3c 00 84 lwz r9,132(r28)
ffc0fd94: 2f 89 00 04 cmpwi cr7,r9,4
ffc0fd98: 41 9e 00 30 beq- cr7,ffc0fdc8 <_POSIX_Threads_Delete_extension+0x90>
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
}
ffc0fd9c: 80 01 00 1c lwz r0,28(r1)
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
ffc0fda0: 39 20 00 00 li r9,0
ffc0fda4: 91 3d 01 50 stw r9,336(r29)
_Workspace_Free( api );
ffc0fda8: 7f 83 e3 78 mr r3,r28
}
ffc0fdac: 7c 08 03 a6 mtlr r0
ffc0fdb0: 83 81 00 08 lwz r28,8(r1)
ffc0fdb4: 83 a1 00 0c lwz r29,12(r1)
ffc0fdb8: 83 c1 00 10 lwz r30,16(r1)
ffc0fdbc: 83 e1 00 14 lwz r31,20(r1)
ffc0fdc0: 38 21 00 18 addi r1,r1,24
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
ffc0fdc4: 4b ff e1 c0 b ffc0df84 <_Workspace_Free>
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
ffc0fdc8: 38 7c 00 a8 addi r3,r28,168
ffc0fdcc: 4b ff de 61 bl ffc0dc2c <_Watchdog_Remove>
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
}
ffc0fdd0: 80 01 00 1c lwz r0,28(r1)
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
ffc0fdd4: 39 20 00 00 li r9,0
_Workspace_Free( api );
}
ffc0fdd8: 83 c1 00 10 lwz r30,16(r1)
ffc0fddc: 7c 08 03 a6 mtlr r0
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
ffc0fde0: 91 3d 01 50 stw r9,336(r29)
_Workspace_Free( api );
ffc0fde4: 7f 83 e3 78 mr r3,r28
}
ffc0fde8: 83 a1 00 0c lwz r29,12(r1)
ffc0fdec: 83 81 00 08 lwz r28,8(r1)
ffc0fdf0: 83 e1 00 14 lwz r31,20(r1)
ffc0fdf4: 38 21 00 18 addi r1,r1,24
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
ffc0fdf8: 4b ff e1 8c b ffc0df84 <_Workspace_Free>
ffc09990 <_POSIX_Threads_Initialize_user_threads_body>:
#include <rtems/posix/config.h>
#include <rtems/posix/key.h>
#include <rtems/posix/time.h>
void _POSIX_Threads_Initialize_user_threads_body(void)
{
ffc09990: 94 21 ff 98 stwu r1,-104(r1)
ffc09994: 7c 08 02 a6 mflr r0
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;
ffc09998: 3d 20 00 00 lis r9,0
#include <rtems/posix/config.h>
#include <rtems/posix/key.h>
#include <rtems/posix/time.h>
void _POSIX_Threads_Initialize_user_threads_body(void)
{
ffc0999c: 90 01 00 6c stw r0,108(r1)
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;
ffc099a0: 39 29 20 04 addi r9,r9,8196
#include <rtems/posix/config.h>
#include <rtems/posix/key.h>
#include <rtems/posix/time.h>
void _POSIX_Threads_Initialize_user_threads_body(void)
{
ffc099a4: 93 e1 00 64 stw r31,100(r1)
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;
ffc099a8: 83 e9 00 34 lwz r31,52(r9)
#include <rtems/posix/config.h>
#include <rtems/posix/key.h>
#include <rtems/posix/time.h>
void _POSIX_Threads_Initialize_user_threads_body(void)
{
ffc099ac: 93 a1 00 5c stw r29,92(r1)
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
maximum = Configuration_POSIX_API.number_of_initialization_threads;
if ( !user_threads || maximum == 0 )
ffc099b0: 2f 9f 00 00 cmpwi cr7,r31,0
#include <rtems/posix/config.h>
#include <rtems/posix/key.h>
#include <rtems/posix/time.h>
void _POSIX_Threads_Initialize_user_threads_body(void)
{
ffc099b4: 93 c1 00 60 stw r30,96(r1)
posix_initialization_threads_table *user_threads;
pthread_t thread_id;
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
maximum = Configuration_POSIX_API.number_of_initialization_threads;
ffc099b8: 83 a9 00 30 lwz r29,48(r9)
if ( !user_threads || maximum == 0 )
ffc099bc: 41 9e 00 5c beq- cr7,ffc09a18 <_POSIX_Threads_Initialize_user_threads_body+0x88><== NEVER TAKEN
ffc099c0: 2f 9d 00 00 cmpwi cr7,r29,0
ffc099c4: 41 9e 00 54 beq- cr7,ffc09a18 <_POSIX_Threads_Initialize_user_threads_body+0x88><== NEVER TAKEN
ffc099c8: 3b c0 00 00 li r30,0
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
ffc099cc: 38 61 00 08 addi r3,r1,8
ffc099d0: 48 00 74 65 bl ffc10e34 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
ffc099d4: 38 80 00 02 li r4,2
ffc099d8: 38 61 00 08 addi r3,r1,8
ffc099dc: 48 00 74 99 bl ffc10e74 <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
ffc099e0: 80 9f 00 04 lwz r4,4(r31)
ffc099e4: 38 61 00 08 addi r3,r1,8
ffc099e8: 48 00 74 c9 bl ffc10eb0 <pthread_attr_setstacksize>
status = pthread_create(
ffc099ec: 80 bf 00 00 lwz r5,0(r31)
ffc099f0: 38 61 00 48 addi r3,r1,72
ffc099f4: 38 81 00 08 addi r4,r1,8
ffc099f8: 38 c0 00 00 li r6,0
ffc099fc: 4b ff fb 51 bl ffc0954c <pthread_create>
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
ffc09a00: 7c 65 1b 79 mr. r5,r3
ffc09a04: 40 82 00 30 bne- ffc09a34 <_POSIX_Threads_Initialize_user_threads_body+0xa4>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
ffc09a08: 3b de 00 01 addi r30,r30,1
ffc09a0c: 7f 9e e8 00 cmpw cr7,r30,r29
ffc09a10: 3b ff 00 08 addi r31,r31,8
ffc09a14: 40 9e ff b8 bne+ cr7,ffc099cc <_POSIX_Threads_Initialize_user_threads_body+0x3c><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
ffc09a18: 80 01 00 6c lwz r0,108(r1)
ffc09a1c: 83 a1 00 5c lwz r29,92(r1)
ffc09a20: 7c 08 03 a6 mtlr r0
ffc09a24: 83 c1 00 60 lwz r30,96(r1)
ffc09a28: 83 e1 00 64 lwz r31,100(r1)
ffc09a2c: 38 21 00 68 addi r1,r1,104
ffc09a30: 4e 80 00 20 blr
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
ffc09a34: 38 60 00 02 li r3,2
ffc09a38: 38 80 00 01 li r4,1
ffc09a3c: 48 00 28 09 bl ffc0c244 <_Internal_error_Occurred>
ffc0ff60 <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
ffc0ff60: 94 21 ff f0 stwu r1,-16(r1)
ffc0ff64: 7c 08 02 a6 mflr r0
ffc0ff68: 90 01 00 14 stw r0,20(r1)
ffc0ff6c: 93 e1 00 0c stw r31,12(r1)
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc0ff70: 83 e4 01 50 lwz r31,336(r4)
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
ffc0ff74: 93 c1 00 08 stw r30,8(r1)
ffc0ff78: 7c 9e 23 78 mr r30,r4
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 );
ffc0ff7c: 38 7f 00 98 addi r3,r31,152
ffc0ff80: 48 00 0f 6d bl ffc10eec <_Timespec_To_ticks>
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
ffc0ff84: 81 3e 00 1c lwz r9,28(r30)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
ffc0ff88: 3d 40 00 00 lis r10,0
ffc0ff8c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ff90: 88 8a 27 84 lbz r4,10116(r10)
ffc0ff94: 81 3f 00 88 lwz r9,136(r31)
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;
ffc0ff98: 90 7e 00 74 stw r3,116(r30)
ffc0ff9c: 7c 89 20 50 subf r4,r9,r4
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
ffc0ffa0: 90 9e 00 18 stw r4,24(r30)
*/
#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 ) {
ffc0ffa4: 40 9e 00 10 bne- cr7,ffc0ffb4 <_POSIX_Threads_Sporadic_budget_TSR+0x54><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
ffc0ffa8: 81 3e 00 14 lwz r9,20(r30)
ffc0ffac: 7f 89 20 40 cmplw cr7,r9,r4
ffc0ffb0: 41 9d 00 34 bgt- cr7,ffc0ffe4 <_POSIX_Threads_Sporadic_budget_TSR+0x84>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
ffc0ffb4: 38 7f 00 90 addi r3,r31,144
ffc0ffb8: 48 00 0f 35 bl ffc10eec <_Timespec_To_ticks>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
ffc0ffbc: 80 01 00 14 lwz r0,20(r1)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc0ffc0: 90 7f 00 b4 stw r3,180(r31)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc0ffc4: 38 9f 00 a8 addi r4,r31,168
ffc0ffc8: 7c 08 03 a6 mtlr r0
ffc0ffcc: 3c 60 00 00 lis r3,0
ffc0ffd0: 83 c1 00 08 lwz r30,8(r1)
ffc0ffd4: 38 63 2d a8 addi r3,r3,11688
ffc0ffd8: 83 e1 00 0c lwz r31,12(r1)
ffc0ffdc: 38 21 00 10 addi r1,r1,16
ffc0ffe0: 4b ff da 84 b ffc0da64 <_Watchdog_Insert>
if ( the_thread->resource_count == 0 ) {
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
_Thread_Change_priority( the_thread, new_priority, true );
ffc0ffe4: 7f c3 f3 78 mr r3,r30
ffc0ffe8: 38 a0 00 01 li r5,1
ffc0ffec: 4b ff c4 49 bl ffc0c434 <_Thread_Change_priority>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
ffc0fff0: 38 7f 00 90 addi r3,r31,144
ffc0fff4: 48 00 0e f9 bl ffc10eec <_Timespec_To_ticks>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
ffc0fff8: 80 01 00 14 lwz r0,20(r1)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc0fffc: 90 7f 00 b4 stw r3,180(r31)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc10000: 38 9f 00 a8 addi r4,r31,168
ffc10004: 7c 08 03 a6 mtlr r0
ffc10008: 3c 60 00 00 lis r3,0
ffc1000c: 83 c1 00 08 lwz r30,8(r1)
ffc10010: 38 63 2d a8 addi r3,r3,11688
ffc10014: 83 e1 00 0c lwz r31,12(r1)
ffc10018: 38 21 00 10 addi r1,r1,16
ffc1001c: 4b ff da 48 b ffc0da64 <_Watchdog_Insert>
ffc12758 <_POSIX_Threads_cancel_run>:
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
ffc12758: 94 21 ff e8 stwu r1,-24(r1)
ffc1275c: 7c 08 02 a6 mflr r0
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
ffc12760: 39 40 00 01 li r10,1
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
ffc12764: 90 01 00 1c stw r0,28(r1)
ffc12768: 93 c1 00 10 stw r30,16(r1)
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 ];
ffc1276c: 83 c3 01 50 lwz r30,336(r3)
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
ffc12770: 93 a1 00 0c stw r29,12(r1)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc12774: 3b be 00 e8 addi r29,r30,232
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
ffc12778: 81 3e 00 e4 lwz r9,228(r30)
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
ffc1277c: 93 e1 00 14 stw r31,20(r1)
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
ffc12780: 7f 89 e8 00 cmpw cr7,r9,r29
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
ffc12784: 91 5e 00 d8 stw r10,216(r30)
while ( !_Chain_Is_empty( handler_stack ) ) {
ffc12788: 41 9e 00 50 beq- cr7,ffc127d8 <_POSIX_Threads_cancel_run+0x80>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc1278c: 7d 00 00 a6 mfmsr r8
ffc12790: 7d 30 42 a6 mfsprg r9,0
ffc12794: 7d 09 48 78 andc r9,r8,r9
ffc12798: 7d 20 01 24 mtmsr r9
_ISR_Disable( level );
handler = (POSIX_Cancel_Handler_control *)
ffc1279c: 83 fe 00 ec lwz r31,236(r30)
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
ffc127a0: 81 3f 00 00 lwz r9,0(r31)
previous = the_node->previous;
ffc127a4: 81 5f 00 04 lwz r10,4(r31)
next->previous = previous;
ffc127a8: 91 49 00 04 stw r10,4(r9)
previous->next = next;
ffc127ac: 91 2a 00 00 stw r9,0(r10)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc127b0: 7d 00 01 24 mtmsr r8
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
(*handler->routine)( handler->arg );
ffc127b4: 81 3f 00 08 lwz r9,8(r31)
ffc127b8: 80 7f 00 0c lwz r3,12(r31)
ffc127bc: 7d 29 03 a6 mtctr r9
ffc127c0: 4e 80 04 21 bctrl
_Workspace_Free( handler );
ffc127c4: 7f e3 fb 78 mr r3,r31
ffc127c8: 4b ff b7 bd bl ffc0df84 <_Workspace_Free>
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
ffc127cc: 81 3e 00 e4 lwz r9,228(r30)
ffc127d0: 7f 89 e8 00 cmpw cr7,r9,r29
ffc127d4: 40 9e ff b8 bne+ cr7,ffc1278c <_POSIX_Threads_cancel_run+0x34><== NEVER TAKEN
(*handler->routine)( handler->arg );
_Workspace_Free( handler );
}
}
ffc127d8: 80 01 00 1c lwz r0,28(r1)
ffc127dc: 83 a1 00 0c lwz r29,12(r1)
ffc127e0: 7c 08 03 a6 mtlr r0
ffc127e4: 83 c1 00 10 lwz r30,16(r1)
ffc127e8: 83 e1 00 14 lwz r31,20(r1)
ffc127ec: 38 21 00 18 addi r1,r1,24
ffc127f0: 4e 80 00 20 blr
ffc097b0 <_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)
{
ffc097b0: 94 21 ff d8 stwu r1,-40(r1)
ffc097b4: 7c 08 02 a6 mflr r0
ffc097b8: 90 01 00 2c stw r0,44(r1)
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
ffc097bc: 81 44 00 54 lwz r10,84(r4)
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
ffc097c0: 81 24 00 68 lwz r9,104(r4)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
ffc097c4: 2f 8a 00 00 cmpwi cr7,r10,0
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR(
Objects_Id timer __attribute__((unused)),
void *data)
{
ffc097c8: 93 a1 00 1c stw r29,28(r1)
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
ffc097cc: 39 29 00 01 addi r9,r9,1
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR(
Objects_Id timer __attribute__((unused)),
void *data)
{
ffc097d0: 93 c1 00 20 stw r30,32(r1)
ffc097d4: 7c 9d 23 78 mr r29,r4
ffc097d8: 93 e1 00 24 stw r31,36(r1)
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
ffc097dc: 91 24 00 68 stw r9,104(r4)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
ffc097e0: 40 9e 00 48 bne- cr7,ffc09828 <_POSIX_Timer_TSR+0x78>
ffc097e4: 81 24 00 58 lwz r9,88(r4)
ffc097e8: 2f 89 00 00 cmpwi cr7,r9,0
ffc097ec: 40 9e 00 3c bne- cr7,ffc09828 <_POSIX_Timer_TSR+0x78> <== 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;
ffc097f0: 39 20 00 04 li r9,4 <== NOT EXECUTED
ffc097f4: 99 24 00 3c stb r9,60(r4) <== 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 ) ) {
ffc097f8: 80 7d 00 38 lwz r3,56(r29)
ffc097fc: 80 9d 00 44 lwz r4,68(r29)
ffc09800: 48 00 6d c1 bl ffc105c0 <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
ffc09804: 39 20 00 00 li r9,0
ffc09808: 91 3d 00 68 stw r9,104(r29)
}
ffc0980c: 80 01 00 2c lwz r0,44(r1)
ffc09810: 83 a1 00 1c lwz r29,28(r1)
ffc09814: 7c 08 03 a6 mtlr r0
ffc09818: 83 c1 00 20 lwz r30,32(r1)
ffc0981c: 83 e1 00 24 lwz r31,36(r1)
ffc09820: 38 21 00 28 addi r1,r1,40
ffc09824: 4e 80 00 20 blr
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(
ffc09828: 80 9d 00 64 lwz r4,100(r29)
ffc0982c: 3c c0 ff c1 lis r6,-63
ffc09830: 80 bd 00 08 lwz r5,8(r29)
ffc09834: 38 7d 00 10 addi r3,r29,16
ffc09838: 38 c6 97 b0 addi r6,r6,-26704
ffc0983c: 7f a7 eb 78 mr r7,r29
ffc09840: 48 00 72 dd bl ffc10b1c <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
ffc09844: 2f 83 00 00 cmpwi cr7,r3,0
ffc09848: 41 9e ff c4 beq+ cr7,ffc0980c <_POSIX_Timer_TSR+0x5c> <== NEVER TAKEN
ffc0984c: 3c 80 00 00 lis r4,0
ffc09850: 38 84 2c a0 addi r4,r4,11424
ffc09854: 38 61 00 08 addi r3,r1,8
ffc09858: 48 00 1d 4d bl ffc0b5a4 <_TOD_Get_with_nanoseconds>
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc0985c: 3c c0 3b 9a lis r6,15258
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
}
ffc09860: 83 e3 00 04 lwz r31,4(r3)
ffc09864: 38 a0 00 00 li r5,0
ffc09868: 83 c3 00 00 lwz r30,0(r3)
ffc0986c: 60 c6 ca 00 ori r6,r6,51712
ffc09870: 7f e4 fb 78 mr r4,r31
ffc09874: 7f c3 f3 78 mr r3,r30
ffc09878: 48 01 3f a9 bl ffc1d820 <__divdi3>
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc0987c: 3c c0 3b 9a lis r6,15258
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc09880: 90 9d 00 6c stw r4,108(r29)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc09884: 38 a0 00 00 li r5,0
ffc09888: 60 c6 ca 00 ori r6,r6,51712
ffc0988c: 7f c3 f3 78 mr r3,r30
ffc09890: 7f e4 fb 78 mr r4,r31
ffc09894: 48 01 43 b1 bl ffc1dc44 <__moddi3>
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
ffc09898: 39 20 00 03 li r9,3
ffc0989c: 90 9d 00 70 stw r4,112(r29)
ffc098a0: 99 3d 00 3c stb r9,60(r29)
ffc098a4: 4b ff ff 54 b ffc097f8 <_POSIX_Timer_TSR+0x48>
ffc128d4 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
ffc128d4: 94 21 ff 98 stwu r1,-104(r1)
ffc128d8: 7c 08 02 a6 mflr r0
ffc128dc: 7c a6 2b 78 mr r6,r5
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,
ffc128e0: 38 e0 00 01 li r7,1
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
ffc128e4: 93 c1 00 60 stw r30,96(r1)
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,
ffc128e8: 38 a1 00 30 addi r5,r1,48
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
ffc128ec: 93 e1 00 64 stw r31,100(r1)
ffc128f0: 7c 9e 23 78 mr r30,r4
ffc128f4: 7c 7f 1b 78 mr r31,r3
ffc128f8: 90 01 00 6c stw r0,108(r1)
ffc128fc: 93 21 00 4c stw r25,76(r1)
ffc12900: 93 41 00 50 stw r26,80(r1)
ffc12904: 93 61 00 54 stw r27,84(r1)
ffc12908: 93 81 00 58 stw r28,88(r1)
ffc1290c: 93 a1 00 5c stw r29,92(r1)
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,
ffc12910: 48 00 00 f9 bl ffc12a08 <_POSIX_signals_Clear_signals>
ffc12914: 2f 83 00 00 cmpwi cr7,r3,0
ffc12918: 41 9e 00 c0 beq- cr7,ffc129d8 <_POSIX_signals_Check_signal+0x104>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
ffc1291c: 1f 9e 00 0c mulli r28,r30,12
ffc12920: 3f 60 00 00 lis r27,0
ffc12924: 3b 7b 32 20 addi r27,r27,12832
ffc12928: 7d 3b e2 14 add r9,r27,r28
ffc1292c: 83 a9 00 08 lwz r29,8(r9)
ffc12930: 2f 9d 00 01 cmpwi cr7,r29,1
ffc12934: 41 9e 00 a4 beq- cr7,ffc129d8 <_POSIX_signals_Check_signal+0x104><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
ffc12938: 83 5f 00 d0 lwz r26,208(r31)
/*
* 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,
ffc1293c: 3f 20 00 00 lis r25,0
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
ffc12940: 81 29 00 04 lwz r9,4(r9)
/*
* 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,
ffc12944: 3b 39 31 a0 addi r25,r25,12704
ffc12948: 80 99 00 10 lwz r4,16(r25)
ffc1294c: 38 61 00 08 addi r3,r1,8
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
ffc12950: 7d 29 d3 78 or r9,r9,r26
ffc12954: 91 3f 00 d0 stw r9,208(r31)
/*
* 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,
ffc12958: 38 84 00 20 addi r4,r4,32
ffc1295c: 38 a0 00 28 li r5,40
ffc12960: 48 00 14 1d bl ffc13d7c <memcpy>
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
ffc12964: 7d 3b e0 2e lwzx r9,r27,r28
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
ffc12968: 7f c3 f3 78 mr r3,r30
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
ffc1296c: 2f 89 00 02 cmpwi cr7,r9,2
ffc12970: 41 9e 00 54 beq- cr7,ffc129c4 <_POSIX_signals_Check_signal+0xf0>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
ffc12974: 7f a9 03 a6 mtctr r29
ffc12978: 4e 80 04 21 bctrl
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
ffc1297c: 80 79 00 10 lwz r3,16(r25)
ffc12980: 38 81 00 08 addi r4,r1,8
ffc12984: 38 a0 00 28 li r5,40
ffc12988: 38 63 00 20 addi r3,r3,32
ffc1298c: 48 00 13 f1 bl ffc13d7c <memcpy>
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
ffc12990: 80 01 00 6c lwz r0,108(r1)
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
ffc12994: 93 5f 00 d0 stw r26,208(r31)
return true;
ffc12998: 38 60 00 01 li r3,1
}
ffc1299c: 7c 08 03 a6 mtlr r0
ffc129a0: 83 21 00 4c lwz r25,76(r1)
ffc129a4: 83 41 00 50 lwz r26,80(r1)
ffc129a8: 83 61 00 54 lwz r27,84(r1)
ffc129ac: 83 81 00 58 lwz r28,88(r1)
ffc129b0: 83 a1 00 5c lwz r29,92(r1)
ffc129b4: 83 c1 00 60 lwz r30,96(r1)
ffc129b8: 83 e1 00 64 lwz r31,100(r1)
ffc129bc: 38 21 00 68 addi r1,r1,104
ffc129c0: 4e 80 00 20 blr
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
ffc129c4: 38 81 00 30 addi r4,r1,48
ffc129c8: 7f a9 03 a6 mtctr r29
ffc129cc: 38 a0 00 00 li r5,0
ffc129d0: 4e 80 04 21 bctrl
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
ffc129d4: 4b ff ff a8 b ffc1297c <_POSIX_signals_Check_signal+0xa8>
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
ffc129d8: 80 01 00 6c lwz r0,108(r1)
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
is_global, true ) )
return false;
ffc129dc: 38 60 00 00 li r3,0
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
ffc129e0: 83 21 00 4c lwz r25,76(r1)
ffc129e4: 7c 08 03 a6 mtlr r0
ffc129e8: 83 41 00 50 lwz r26,80(r1)
ffc129ec: 83 61 00 54 lwz r27,84(r1)
ffc129f0: 83 81 00 58 lwz r28,88(r1)
ffc129f4: 83 a1 00 5c lwz r29,92(r1)
ffc129f8: 83 c1 00 60 lwz r30,96(r1)
ffc129fc: 83 e1 00 64 lwz r31,100(r1)
ffc12a00: 38 21 00 68 addi r1,r1,104
ffc12a04: 4e 80 00 20 blr
ffc12fec <_POSIX_signals_Clear_process_signals>:
ffc12fec: 39 23 ff ff addi r9,r3,-1
ffc12ff0: 39 40 00 01 li r10,1
ffc12ff4: 7d 48 48 30 slw r8,r10,r9
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc12ff8: 7d 40 00 a6 mfmsr r10
ffc12ffc: 7d 30 42 a6 mfsprg r9,0
ffc13000: 7d 49 48 78 andc r9,r10,r9
ffc13004: 7d 20 01 24 mtmsr r9
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
ffc13008: 3d 20 00 00 lis r9,0
ffc1300c: 1c 63 00 0c mulli r3,r3,12
ffc13010: 39 29 32 20 addi r9,r9,12832
ffc13014: 7d 29 18 2e lwzx r9,r9,r3
ffc13018: 2f 89 00 02 cmpwi cr7,r9,2
ffc1301c: 41 9e 00 1c beq- cr7,ffc13038 <_POSIX_signals_Clear_process_signals+0x4c>
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
ffc13020: 3d 20 00 00 lis r9,0
ffc13024: 80 e9 28 98 lwz r7,10392(r9)
ffc13028: 7c e8 40 78 andc r8,r7,r8
ffc1302c: 91 09 28 98 stw r8,10392(r9)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc13030: 7d 40 01 24 mtmsr r10
ffc13034: 4e 80 00 20 blr
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
ffc13038: 3d 20 00 00 lis r9,0
ffc1303c: 39 29 34 14 addi r9,r9,13332
ffc13040: 7c e3 48 2e lwzx r7,r3,r9
ffc13044: 7c c3 4a 14 add r6,r3,r9
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc13048: 39 26 00 04 addi r9,r6,4
ffc1304c: 7f 87 48 00 cmpw cr7,r7,r9
ffc13050: 41 be ff d0 beq- cr7,ffc13020 <_POSIX_signals_Clear_process_signals+0x34><== ALWAYS TAKEN
ffc13054: 7d 40 01 24 mtmsr r10 <== NOT EXECUTED
ffc13058: 4e 80 00 20 blr <== NOT EXECUTED
ffc0a3f8 <_POSIX_signals_Get_lowest>:
ffc0a3f8: 38 e0 00 05 li r7,5
ffc0a3fc: 7c e9 03 a6 mtctr r7
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
ffc0a400: 39 20 00 1b li r9,27
ffc0a404: 39 00 00 01 li r8,1
#include <rtems/posix/psignalimpl.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
static int _POSIX_signals_Get_lowest(
ffc0a408: 39 49 ff ff addi r10,r9,-1
ffc0a40c: 7d 0a 50 30 slw r10,r8,r10
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
ffc0a410: 7d 47 18 39 and. r7,r10,r3
ffc0a414: 40 82 00 38 bne- ffc0a44c <_POSIX_signals_Get_lowest+0x54><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
ffc0a418: 39 29 00 01 addi r9,r9,1
ffc0a41c: 42 00 ff ec bdnz+ ffc0a408 <_POSIX_signals_Get_lowest+0x10>
ffc0a420: 39 40 00 1a li r10,26
ffc0a424: 39 20 00 01 li r9,1
ffc0a428: 7d 49 03 a6 mtctr r10
ffc0a42c: 39 00 00 01 li r8,1
ffc0a430: 48 00 00 0c b ffc0a43c <_POSIX_signals_Get_lowest+0x44>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
ffc0a434: 39 29 00 01 addi r9,r9,1
ffc0a438: 42 40 00 14 bdz- ffc0a44c <_POSIX_signals_Get_lowest+0x54>
#include <rtems/posix/psignalimpl.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
static int _POSIX_signals_Get_lowest(
ffc0a43c: 39 49 ff ff addi r10,r9,-1
ffc0a440: 7d 0a 50 30 slw r10,r8,r10
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
ffc0a444: 7d 47 18 39 and. r7,r10,r3
ffc0a448: 41 82 ff ec beq+ ffc0a434 <_POSIX_signals_Get_lowest+0x3c>
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
ffc0a44c: 7d 23 4b 78 mr r3,r9
ffc0a450: 4e 80 00 20 blr
ffc0fa88 <_POSIX_signals_Post_switch_hook>:
*/
static void _POSIX_signals_Post_switch_hook(
Thread_Control *the_thread
)
{
ffc0fa88: 94 21 ff e0 stwu r1,-32(r1)
ffc0fa8c: 7c 08 02 a6 mflr r0
ffc0fa90: 90 01 00 24 stw r0,36(r1)
ffc0fa94: 93 c1 00 18 stw r30,24(r1)
POSIX_API_Control *api;
int signo;
ISR_Level level;
int hold_errno;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc0fa98: 83 c3 01 50 lwz r30,336(r3)
*/
static void _POSIX_signals_Post_switch_hook(
Thread_Control *the_thread
)
{
ffc0fa9c: 93 81 00 10 stw r28,16(r1)
/*
* We need to ensure that if the signal handler executes a call
* which overwrites the unblocking status, we restore it.
*/
hold_errno = _Thread_Executing->Wait.return_code;
ffc0faa0: 3f 80 00 00 lis r28,0
/*
* api may be NULL in case of a thread close in progress
*/
if ( !api )
ffc0faa4: 2f 9e 00 00 cmpwi cr7,r30,0
/*
* We need to ensure that if the signal handler executes a call
* which overwrites the unblocking status, we restore it.
*/
hold_errno = _Thread_Executing->Wait.return_code;
ffc0faa8: 3b 9c 31 a0 addi r28,r28,12704
*/
static void _POSIX_signals_Post_switch_hook(
Thread_Control *the_thread
)
{
ffc0faac: 93 61 00 0c stw r27,12(r1)
/*
* We need to ensure that if the signal handler executes a call
* which overwrites the unblocking status, we restore it.
*/
hold_errno = _Thread_Executing->Wait.return_code;
ffc0fab0: 81 3c 00 10 lwz r9,16(r28)
*/
static void _POSIX_signals_Post_switch_hook(
Thread_Control *the_thread
)
{
ffc0fab4: 93 a1 00 14 stw r29,20(r1)
ffc0fab8: 93 e1 00 1c stw r31,28(r1)
/*
* We need to ensure that if the signal handler executes a call
* which overwrites the unblocking status, we restore it.
*/
hold_errno = _Thread_Executing->Wait.return_code;
ffc0fabc: 83 69 00 34 lwz r27,52(r9)
/*
* api may be NULL in case of a thread close in progress
*/
if ( !api )
ffc0fac0: 41 9e 00 cc beq- cr7,ffc0fb8c <_POSIX_signals_Post_switch_hook+0x104><== NEVER TAKEN
ffc0fac4: 3f a0 00 00 lis r29,0
ffc0fac8: 3b bd 28 98 addi r29,r29,10392
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0facc: 7c e0 00 a6 mfmsr r7
ffc0fad0: 7d 30 42 a6 mfsprg r9,0
ffc0fad4: 7c e9 48 78 andc r9,r7,r9
ffc0fad8: 7d 20 01 24 mtmsr r9
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending)) ) {
ffc0fadc: 81 1d 00 00 lwz r8,0(r29)
ffc0fae0: 81 5e 00 d4 lwz r10,212(r30)
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
ffc0fae4: 81 3e 00 d0 lwz r9,208(r30)
(api->signals_pending | _POSIX_signals_Pending)) ) {
ffc0fae8: 7d 0a 53 78 or r10,r8,r10
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0faec: 7c e0 01 24 mtmsr r7
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
ffc0faf0: 7d 48 48 79 andc. r8,r10,r9
ffc0faf4: 41 82 00 90 beq- ffc0fb84 <_POSIX_signals_Post_switch_hook+0xfc>
_ISR_Enable( level );
break;
}
_ISR_Enable( level );
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
ffc0faf8: 3b e0 00 1b li r31,27
_POSIX_signals_Check_signal( api, signo, false );
ffc0fafc: 7f e4 fb 78 mr r4,r31
ffc0fb00: 38 a0 00 00 li r5,0
ffc0fb04: 7f c3 f3 78 mr r3,r30
ffc0fb08: 48 00 2d cd bl ffc128d4 <_POSIX_signals_Check_signal>
_POSIX_signals_Check_signal( api, signo, true );
ffc0fb0c: 7f e4 fb 78 mr r4,r31
ffc0fb10: 7f c3 f3 78 mr r3,r30
ffc0fb14: 38 a0 00 01 li r5,1
ffc0fb18: 48 00 2d bd bl ffc128d4 <_POSIX_signals_Check_signal>
_ISR_Enable( level );
break;
}
_ISR_Enable( level );
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
ffc0fb1c: 2f 9f 00 1f cmpwi cr7,r31,31
ffc0fb20: 3b ff 00 01 addi r31,r31,1
ffc0fb24: 40 9e ff d8 bne+ cr7,ffc0fafc <_POSIX_signals_Post_switch_hook+0x74>
ffc0fb28: 3b e0 00 01 li r31,1
_POSIX_signals_Check_signal( api, signo, true );
}
/* Unfortunately - nothing like __SIGFIRSTNOTRT in newlib signal .h */
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
_POSIX_signals_Check_signal( api, signo, false );
ffc0fb2c: 7f e4 fb 78 mr r4,r31
ffc0fb30: 38 a0 00 00 li r5,0
ffc0fb34: 7f c3 f3 78 mr r3,r30
ffc0fb38: 48 00 2d 9d bl ffc128d4 <_POSIX_signals_Check_signal>
_POSIX_signals_Check_signal( api, signo, true );
ffc0fb3c: 7f e4 fb 78 mr r4,r31
ffc0fb40: 7f c3 f3 78 mr r3,r30
ffc0fb44: 38 a0 00 01 li r5,1
ffc0fb48: 48 00 2d 8d bl ffc128d4 <_POSIX_signals_Check_signal>
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
}
/* Unfortunately - nothing like __SIGFIRSTNOTRT in newlib signal .h */
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
ffc0fb4c: 2f 9f 00 1a cmpwi cr7,r31,26
ffc0fb50: 3b ff 00 01 addi r31,r31,1
ffc0fb54: 40 9e ff d8 bne+ cr7,ffc0fb2c <_POSIX_signals_Post_switch_hook+0xa4>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0fb58: 7c e0 00 a6 mfmsr r7
ffc0fb5c: 7d 30 42 a6 mfsprg r9,0
ffc0fb60: 7c e9 48 78 andc r9,r7,r9
ffc0fb64: 7d 20 01 24 mtmsr r9
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending)) ) {
ffc0fb68: 81 1d 00 00 lwz r8,0(r29)
ffc0fb6c: 81 5e 00 d4 lwz r10,212(r30)
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
ffc0fb70: 81 3e 00 d0 lwz r9,208(r30)
(api->signals_pending | _POSIX_signals_Pending)) ) {
ffc0fb74: 7d 0a 53 78 or r10,r8,r10
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0fb78: 7c e0 01 24 mtmsr r7
* The first thing done is to check there are any signals to be
* processed at all. No point in doing this loop otherwise.
*/
while (1) {
_ISR_Disable( level );
if ( !(~api->signals_blocked &
ffc0fb7c: 7d 48 48 79 andc. r8,r10,r9
ffc0fb80: 40 82 ff 78 bne+ ffc0faf8 <_POSIX_signals_Post_switch_hook+0x70><== NEVER TAKEN
_POSIX_signals_Check_signal( api, signo, false );
_POSIX_signals_Check_signal( api, signo, true );
}
}
_Thread_Executing->Wait.return_code = hold_errno;
ffc0fb84: 81 3c 00 10 lwz r9,16(r28)
ffc0fb88: 93 69 00 34 stw r27,52(r9)
}
ffc0fb8c: 80 01 00 24 lwz r0,36(r1)
ffc0fb90: 83 61 00 0c lwz r27,12(r1)
ffc0fb94: 7c 08 03 a6 mtlr r0
ffc0fb98: 83 81 00 10 lwz r28,16(r1)
ffc0fb9c: 83 a1 00 14 lwz r29,20(r1)
ffc0fba0: 83 c1 00 18 lwz r30,24(r1)
ffc0fba4: 83 e1 00 1c lwz r31,28(r1)
ffc0fba8: 38 21 00 20 addi r1,r1,32
ffc0fbac: 4e 80 00 20 blr
ffc1e3b0 <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
ffc1e3b0: 94 21 ff f0 stwu r1,-16(r1)
ffc1e3b4: 7c 08 02 a6 mflr r0
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
ffc1e3b8: 3d 40 10 00 lis r10,4096
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
ffc1e3bc: 90 01 00 14 stw r0,20(r1)
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
ffc1e3c0: 61 4a 80 00 ori r10,r10,32768
ffc1e3c4: 38 c4 ff ff addi r6,r4,-1
ffc1e3c8: 81 23 00 10 lwz r9,16(r3)
ffc1e3cc: 38 e0 00 01 li r7,1
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
ffc1e3d0: 93 e1 00 0c stw r31,12(r1)
ffc1e3d4: 7c 7f 1b 78 mr r31,r3
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
ffc1e3d8: 7d 28 50 38 and r8,r9,r10
ffc1e3dc: 7f 88 50 00 cmpw cr7,r8,r10
{
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc1e3e0: 81 63 01 50 lwz r11,336(r3)
ffc1e3e4: 7c e8 30 30 slw r8,r7,r6
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
ffc1e3e8: 41 9e 00 9c beq- cr7,ffc1e484 <_POSIX_signals_Unblock_thread+0xd4>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
ffc1e3ec: 81 4b 00 d0 lwz r10,208(r11)
ffc1e3f0: 7d 06 50 79 andc. r6,r8,r10
ffc1e3f4: 41 82 00 78 beq- ffc1e46c <_POSIX_signals_Unblock_thread+0xbc>
* 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 ) ) {
ffc1e3f8: 75 28 10 00 andis. r8,r9,4096
ffc1e3fc: 41 82 00 44 beq- ffc1e440 <_POSIX_signals_Unblock_thread+0x90>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
ffc1e400: 3d 40 00 03 lis r10,3
ffc1e404: 61 4a be e0 ori r10,r10,48864
the_thread->Wait.return_code = EINTR;
/*
* 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) )
ffc1e408: 7d 26 50 39 and. r6,r9,r10
* 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 ) ) {
the_thread->Wait.return_code = EINTR;
ffc1e40c: 39 40 00 04 li r10,4
ffc1e410: 91 43 00 34 stw r10,52(r3)
/*
* 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) )
ffc1e414: 40 82 00 d8 bne- ffc1e4ec <_POSIX_signals_Unblock_thread+0x13c>
_Thread_queue_Extract_with_proxy( the_thread );
else if ( _States_Is_delaying(the_thread->current_state) ) {
ffc1e418: 71 28 00 08 andi. r8,r9,8
ffc1e41c: 41 a2 00 50 beq+ ffc1e46c <_POSIX_signals_Unblock_thread+0xbc><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
ffc1e420: 38 63 00 48 addi r3,r3,72
ffc1e424: 4b fe f8 09 bl ffc0dc2c <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
ffc1e428: 3c 80 10 07 lis r4,4103
ffc1e42c: 7f e3 fb 78 mr r3,r31
ffc1e430: 60 84 ff f8 ori r4,r4,65528
ffc1e434: 4b fe e1 8d bl ffc0c5c0 <_Thread_Clear_state>
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
ffc1e438: 38 60 00 00 li r3,0
ffc1e43c: 48 00 00 34 b ffc1e470 <_POSIX_signals_Unblock_thread+0xc0>
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 ) {
ffc1e440: 2f 89 00 00 cmpwi cr7,r9,0
ffc1e444: 40 9e 00 28 bne- cr7,ffc1e46c <_POSIX_signals_Unblock_thread+0xbc><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
ffc1e448: 3d 20 00 00 lis r9,0
ffc1e44c: 39 29 31 a0 addi r9,r9,12704
ffc1e450: 81 49 00 08 lwz r10,8(r9)
ffc1e454: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1e458: 41 9e 00 14 beq- cr7,ffc1e46c <_POSIX_signals_Unblock_thread+0xbc>
ffc1e45c: 81 49 00 10 lwz r10,16(r9)
ffc1e460: 7f 83 50 00 cmpw cr7,r3,r10
ffc1e464: 40 be 00 08 bne+ cr7,ffc1e46c <_POSIX_signals_Unblock_thread+0xbc><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
ffc1e468: 98 e9 00 0c stb r7,12(r9)
}
}
return false;
ffc1e46c: 38 60 00 00 li r3,0
}
ffc1e470: 80 01 00 14 lwz r0,20(r1)
ffc1e474: 83 e1 00 0c lwz r31,12(r1)
ffc1e478: 7c 08 03 a6 mtlr r0
ffc1e47c: 38 21 00 10 addi r1,r1,16
ffc1e480: 4e 80 00 20 blr
* 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) ) {
ffc1e484: 81 23 00 30 lwz r9,48(r3)
ffc1e488: 7d 06 48 39 and. r6,r8,r9
ffc1e48c: 41 82 00 50 beq- ffc1e4dc <_POSIX_signals_Unblock_thread+0x12c>
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
ffc1e490: 2f 85 00 00 cmpwi cr7,r5,0
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
the_thread->Wait.return_code = EINTR;
ffc1e494: 39 20 00 04 li r9,4
ffc1e498: 91 3f 00 34 stw r9,52(r31)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
ffc1e49c: 81 3f 00 28 lwz r9,40(r31)
if ( !info ) {
ffc1e4a0: 41 9e 00 58 beq- cr7,ffc1e4f8 <_POSIX_signals_Unblock_thread+0x148>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
} else {
*the_info = *info;
ffc1e4a4: 80 e5 00 00 lwz r7,0(r5)
ffc1e4a8: 81 05 00 04 lwz r8,4(r5)
ffc1e4ac: 81 45 00 08 lwz r10,8(r5)
ffc1e4b0: 90 e9 00 00 stw r7,0(r9)
ffc1e4b4: 91 09 00 04 stw r8,4(r9)
ffc1e4b8: 91 49 00 08 stw r10,8(r9)
}
_Thread_queue_Extract_with_proxy( the_thread );
ffc1e4bc: 7f e3 fb 78 mr r3,r31
ffc1e4c0: 4b fe ee e5 bl ffc0d3a4 <_Thread_queue_Extract_with_proxy>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
ffc1e4c4: 80 01 00 14 lwz r0,20(r1)
ffc1e4c8: 83 e1 00 0c lwz r31,12(r1)
} else {
*the_info = *info;
}
_Thread_queue_Extract_with_proxy( the_thread );
return true;
ffc1e4cc: 38 60 00 01 li r3,1
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
ffc1e4d0: 7c 08 03 a6 mtlr r0
ffc1e4d4: 38 21 00 10 addi r1,r1,16
ffc1e4d8: 4e 80 00 20 blr
* 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) ) {
ffc1e4dc: 81 2b 00 d0 lwz r9,208(r11)
ffc1e4e0: 7d 0a 48 79 andc. r10,r8,r9
ffc1e4e4: 40 82 ff ac bne+ ffc1e490 <_POSIX_signals_Unblock_thread+0xe0>
ffc1e4e8: 4b ff ff 84 b ffc1e46c <_POSIX_signals_Unblock_thread+0xbc>
/*
* 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 );
ffc1e4ec: 4b fe ee b9 bl ffc0d3a4 <_Thread_queue_Extract_with_proxy>
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
ffc1e4f0: 38 60 00 00 li r3,0
ffc1e4f4: 4b ff ff 7c b ffc1e470 <_POSIX_signals_Unblock_thread+0xc0>
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
the_info->si_code = SI_USER;
ffc1e4f8: 39 40 00 01 li r10,1
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
ffc1e4fc: 90 89 00 00 stw r4,0(r9)
the_info->si_code = SI_USER;
ffc1e500: 91 49 00 04 stw r10,4(r9)
the_info->si_value.sival_int = 0;
ffc1e504: 90 a9 00 08 stw r5,8(r9)
ffc1e508: 4b ff ff b4 b ffc1e4bc <_POSIX_signals_Unblock_thread+0x10c>
ffc0c95c <_RBTree_Extract_unprotected>:
*/
void _RBTree_Extract_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
ffc0c95c: 94 21 ff e8 stwu r1,-24(r1)
ffc0c960: 7c 08 02 a6 mflr r0
ffc0c964: 93 c1 00 10 stw r30,16(r1)
RBTree_Node *leaf, *target;
RBTree_Color victim_color;
RBTree_Direction dir;
if (!the_node) return;
ffc0c968: 7c 9e 23 79 mr. r30,r4
*/
void _RBTree_Extract_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
ffc0c96c: 90 01 00 1c stw r0,28(r1)
ffc0c970: 93 81 00 08 stw r28,8(r1)
ffc0c974: 93 a1 00 0c stw r29,12(r1)
ffc0c978: 93 e1 00 14 stw r31,20(r1)
RBTree_Node *leaf, *target;
RBTree_Color victim_color;
RBTree_Direction dir;
if (!the_node) return;
ffc0c97c: 41 82 01 14 beq- ffc0ca90 <_RBTree_Extract_unprotected+0x134>
/* check if min needs to be updated */
if (the_node == the_rbtree->first[RBT_LEFT]) {
ffc0c980: 81 23 00 08 lwz r9,8(r3)
ffc0c984: 7c 7c 1b 78 mr r28,r3
ffc0c988: 7f 89 f0 00 cmpw cr7,r9,r30
ffc0c98c: 41 9e 01 6c beq- cr7,ffc0caf8 <_RBTree_Extract_unprotected+0x19c>
the_rbtree->first[RBT_LEFT] = next;
}
/* Check if max needs to be updated. min=max for 1 element trees so
* do not use else if here. */
if (the_node == the_rbtree->first[RBT_RIGHT]) {
ffc0c990: 81 3c 00 0c lwz r9,12(r28)
ffc0c994: 7f 89 f0 00 cmpw cr7,r9,r30
ffc0c998: 41 9e 01 74 beq- cr7,ffc0cb0c <_RBTree_Extract_unprotected+0x1b0>
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
ffc0c99c: 83 fe 00 04 lwz r31,4(r30)
ffc0c9a0: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0c9a4: 41 9e 01 88 beq- cr7,ffc0cb2c <_RBTree_Extract_unprotected+0x1d0>
ffc0c9a8: 81 3e 00 08 lwz r9,8(r30)
ffc0c9ac: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c9b0: 40 be 00 0c bne+ cr7,ffc0c9bc <_RBTree_Extract_unprotected+0x60>
ffc0c9b4: 48 00 01 0c b ffc0cac0 <_RBTree_Extract_unprotected+0x164>
target = the_node->child[RBT_LEFT]; /* find max in node->child[RBT_LEFT] */
while (target->child[RBT_RIGHT]) target = target->child[RBT_RIGHT];
ffc0c9b8: 7d 3f 4b 78 mr r31,r9
ffc0c9bc: 81 3f 00 08 lwz r9,8(r31)
ffc0c9c0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c9c4: 40 9e ff f4 bne+ cr7,ffc0c9b8 <_RBTree_Extract_unprotected+0x5c>
* target's position (target is the right child of target->parent)
* when target vacates it. if there is no child, then target->parent
* should become NULL. This may cause the coloring to be violated.
* For now we store the color of the node being deleted in victim_color.
*/
leaf = target->child[RBT_LEFT];
ffc0c9c8: 83 bf 00 04 lwz r29,4(r31)
if(leaf) {
ffc0c9cc: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0c9d0: 41 9e 01 50 beq- cr7,ffc0cb20 <_RBTree_Extract_unprotected+0x1c4>
leaf->parent = target->parent;
ffc0c9d4: 81 3f 00 00 lwz r9,0(r31)
ffc0c9d8: 91 3d 00 00 stw r9,0(r29)
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
dir = target != target->parent->child[0];
ffc0c9dc: 80 ff 00 00 lwz r7,0(r31)
target->parent->child[dir] = leaf;
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
ffc0c9e0: 81 1e 00 00 lwz r8,0(r30)
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
dir = target != target->parent->child[0];
ffc0c9e4: 81 27 00 04 lwz r9,4(r7)
leaf->parent = target->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
}
victim_color = target->color;
ffc0c9e8: 81 5f 00 0c lwz r10,12(r31)
dir = target != target->parent->child[0];
ffc0c9ec: 7f e9 4a 78 xor r9,r31,r9
ffc0c9f0: 7d 29 00 34 cntlzw r9,r9
ffc0c9f4: 55 29 d9 7e rlwinm r9,r9,27,5,31
ffc0c9f8: 69 29 00 01 xori r9,r9,1
target->parent->child[dir] = leaf;
ffc0c9fc: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0ca00: 7c e7 4a 14 add r7,r7,r9
ffc0ca04: 93 a7 00 04 stw r29,4(r7)
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
ffc0ca08: 81 28 00 04 lwz r9,4(r8)
ffc0ca0c: 7f c9 4a 78 xor r9,r30,r9
ffc0ca10: 7d 29 00 34 cntlzw r9,r9
ffc0ca14: 55 29 d9 7e rlwinm r9,r9,27,5,31
ffc0ca18: 69 29 00 01 xori r9,r9,1
the_node->parent->child[dir] = target;
ffc0ca1c: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0ca20: 7d 08 4a 14 add r8,r8,r9
ffc0ca24: 93 e8 00 04 stw r31,4(r8)
/* set target's new children to the original node's children */
target->child[RBT_RIGHT] = the_node->child[RBT_RIGHT];
ffc0ca28: 81 3e 00 08 lwz r9,8(r30)
ffc0ca2c: 91 3f 00 08 stw r9,8(r31)
if (the_node->child[RBT_RIGHT])
ffc0ca30: 81 3e 00 08 lwz r9,8(r30)
ffc0ca34: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ca38: 41 9e 00 08 beq- cr7,ffc0ca40 <_RBTree_Extract_unprotected+0xe4><== NEVER TAKEN
the_node->child[RBT_RIGHT]->parent = target;
ffc0ca3c: 93 e9 00 00 stw r31,0(r9)
target->child[RBT_LEFT] = the_node->child[RBT_LEFT];
ffc0ca40: 81 3e 00 04 lwz r9,4(r30)
ffc0ca44: 91 3f 00 04 stw r9,4(r31)
if (the_node->child[RBT_LEFT])
ffc0ca48: 81 3e 00 04 lwz r9,4(r30)
ffc0ca4c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ca50: 41 9e 00 08 beq- cr7,ffc0ca58 <_RBTree_Extract_unprotected+0xfc>
the_node->child[RBT_LEFT]->parent = target;
ffc0ca54: 93 e9 00 00 stw r31,0(r9)
/* finally, update the parent node and recolor. target has completely
* replaced the_node, and target's child has moved up the tree if needed.
* the_node is no longer part of the tree, although it has valid pointers
* still.
*/
target->parent = the_node->parent;
ffc0ca58: 81 1e 00 00 lwz r8,0(r30)
target->color = the_node->color;
ffc0ca5c: 81 3e 00 0c lwz r9,12(r30)
/* finally, update the parent node and recolor. target has completely
* replaced the_node, and target's child has moved up the tree if needed.
* the_node is no longer part of the tree, although it has valid pointers
* still.
*/
target->parent = the_node->parent;
ffc0ca60: 91 1f 00 00 stw r8,0(r31)
target->color = the_node->color;
ffc0ca64: 91 3f 00 0c stw r9,12(r31)
/* fix coloring. leaf has moved up the tree. The color of the deleted
* node is in victim_color. There are two cases:
* 1. Deleted a red node, its child must be black. Nothing must be done.
* 2. Deleted a black node, its child must be red. Paint child black.
*/
if (victim_color == RBT_BLACK) { /* eliminate case 1 */
ffc0ca68: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ca6c: 41 9e 00 44 beq- cr7,ffc0cab0 <_RBTree_Extract_unprotected+0x154>
/* Wipe the_node */
_RBTree_Set_off_rbtree(the_node);
/* set root to black, if it exists */
if (the_rbtree->root) the_rbtree->root->color = RBT_BLACK;
ffc0ca70: 81 5c 00 04 lwz r10,4(r28)
*/
RTEMS_INLINE_ROUTINE void _RBTree_Set_off_rbtree(
RBTree_Node *node
)
{
node->parent = node->child[RBT_LEFT] = node->child[RBT_RIGHT] = NULL;
ffc0ca74: 39 20 00 00 li r9,0
ffc0ca78: 91 3e 00 08 stw r9,8(r30)
ffc0ca7c: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ca80: 91 3e 00 04 stw r9,4(r30)
ffc0ca84: 91 3e 00 00 stw r9,0(r30)
ffc0ca88: 41 9e 00 08 beq- cr7,ffc0ca90 <_RBTree_Extract_unprotected+0x134>
ffc0ca8c: 91 2a 00 0c stw r9,12(r10)
}
ffc0ca90: 80 01 00 1c lwz r0,28(r1)
ffc0ca94: 83 81 00 08 lwz r28,8(r1)
ffc0ca98: 7c 08 03 a6 mtlr r0
ffc0ca9c: 83 a1 00 0c lwz r29,12(r1)
ffc0caa0: 83 c1 00 10 lwz r30,16(r1)
ffc0caa4: 83 e1 00 14 lwz r31,20(r1)
ffc0caa8: 38 21 00 18 addi r1,r1,24
ffc0caac: 4e 80 00 20 blr
* node is in victim_color. There are two cases:
* 1. Deleted a red node, its child must be black. Nothing must be done.
* 2. Deleted a black node, its child must be red. Paint child black.
*/
if (victim_color == RBT_BLACK) { /* eliminate case 1 */
if (leaf) {
ffc0cab0: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0cab4: 41 be ff bc beq- cr7,ffc0ca70 <_RBTree_Extract_unprotected+0x114>
leaf->color = RBT_BLACK; /* case 2 */
ffc0cab8: 91 5d 00 0c stw r10,12(r29)
ffc0cabc: 4b ff ff b4 b ffc0ca70 <_RBTree_Extract_unprotected+0x114>
* either max in node->child[RBT_LEFT] or min in node->child[RBT_RIGHT],
* and replace the_node with the target node. This maintains the binary
* search tree property, but may violate the red-black properties.
*/
if (the_node->child[RBT_LEFT] && the_node->child[RBT_RIGHT]) {
ffc0cac0: 7f fd fb 78 mr r29,r31
* For now we store the color of the node being deleted in victim_color.
*/
leaf = the_node->child[RBT_LEFT] ?
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
if( leaf ) {
leaf->parent = the_node->parent;
ffc0cac4: 81 3e 00 00 lwz r9,0(r30)
ffc0cac8: 91 3d 00 00 stw r9,0(r29)
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
ffc0cacc: 81 1e 00 00 lwz r8,0(r30)
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
}
victim_color = the_node->color;
ffc0cad0: 81 5e 00 0c lwz r10,12(r30)
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
ffc0cad4: 81 28 00 04 lwz r9,4(r8)
ffc0cad8: 7f c9 4a 78 xor r9,r30,r9
ffc0cadc: 7d 29 00 34 cntlzw r9,r9
ffc0cae0: 55 29 d9 7e rlwinm r9,r9,27,5,31
ffc0cae4: 69 29 00 01 xori r9,r9,1
the_node->parent->child[dir] = leaf;
ffc0cae8: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0caec: 7d 08 4a 14 add r8,r8,r9
ffc0caf0: 93 a8 00 04 stw r29,4(r8)
ffc0caf4: 4b ff ff 74 b ffc0ca68 <_RBTree_Extract_unprotected+0x10c>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Successor_unprotected(
const RBTree_Node *node
)
{
return _RBTree_Next_unprotected( node, RBT_RIGHT );
ffc0caf8: 7f c3 f3 78 mr r3,r30
ffc0cafc: 38 80 00 01 li r4,1
ffc0cb00: 48 00 04 99 bl ffc0cf98 <_RBTree_Next_unprotected>
/* check if min needs to be updated */
if (the_node == the_rbtree->first[RBT_LEFT]) {
RBTree_Node *next;
next = _RBTree_Successor_unprotected(the_node);
the_rbtree->first[RBT_LEFT] = next;
ffc0cb04: 90 7c 00 08 stw r3,8(r28)
ffc0cb08: 4b ff fe 88 b ffc0c990 <_RBTree_Extract_unprotected+0x34>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Predecessor_unprotected(
const RBTree_Node *node
)
{
return _RBTree_Next_unprotected( node, RBT_LEFT );
ffc0cb0c: 7f c3 f3 78 mr r3,r30
ffc0cb10: 38 80 00 00 li r4,0
ffc0cb14: 48 00 04 85 bl ffc0cf98 <_RBTree_Next_unprotected>
/* Check if max needs to be updated. min=max for 1 element trees so
* do not use else if here. */
if (the_node == the_rbtree->first[RBT_RIGHT]) {
RBTree_Node *previous;
previous = _RBTree_Predecessor_unprotected(the_node);
the_rbtree->first[RBT_RIGHT] = previous;
ffc0cb18: 90 7c 00 0c stw r3,12(r28)
ffc0cb1c: 4b ff fe 80 b ffc0c99c <_RBTree_Extract_unprotected+0x40>
leaf = target->child[RBT_LEFT];
if(leaf) {
leaf->parent = target->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
ffc0cb20: 7f e3 fb 78 mr r3,r31
ffc0cb24: 4b ff fb 2d bl ffc0c650 <_RBTree_Extract_validate_unprotected>
ffc0cb28: 4b ff fe b4 b ffc0c9dc <_RBTree_Extract_unprotected+0x80>
* the_node's location in the tree. This may cause the coloring to be
* violated. We will fix it later.
* For now we store the color of the node being deleted in victim_color.
*/
leaf = the_node->child[RBT_LEFT] ?
the_node->child[RBT_LEFT] : the_node->child[RBT_RIGHT];
ffc0cb2c: 83 be 00 08 lwz r29,8(r30)
if( leaf ) {
ffc0cb30: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0cb34: 40 9e ff 90 bne+ cr7,ffc0cac4 <_RBTree_Extract_unprotected+0x168>
leaf->parent = the_node->parent;
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
ffc0cb38: 7f c3 f3 78 mr r3,r30
ffc0cb3c: 4b ff fb 15 bl ffc0c650 <_RBTree_Extract_validate_unprotected>
ffc0cb40: 4b ff ff 8c b ffc0cacc <_RBTree_Extract_unprotected+0x170>
ffc0c650 <_RBTree_Extract_validate_unprotected>:
)
{
RBTree_Node *parent, *sibling;
RBTree_Direction dir;
parent = the_node->parent;
ffc0c650: 81 23 00 00 lwz r9,0(r3)
if(!parent->parent) return;
ffc0c654: 81 49 00 00 lwz r10,0(r9)
ffc0c658: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c65c: 4d 9e 00 20 beqlr cr7
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
ffc0c660: 81 49 00 04 lwz r10,4(r9)
ffc0c664: 7f 83 50 00 cmpw cr7,r3,r10
ffc0c668: 41 9e 02 d0 beq- cr7,ffc0c938 <_RBTree_Extract_validate_unprotected+0x2e8>
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
ffc0c66c: 38 80 00 00 li r4,0
}
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
sibling->color = RBT_RED;
ffc0c670: 38 c0 00 01 li r6,1
ffc0c674: 48 00 00 90 b ffc0c704 <_RBTree_Extract_validate_unprotected+0xb4>
if(!parent->parent) return;
sibling = _RBTree_Sibling(the_node);
/* continue to correct tree as long as the_node is black and not the root */
while (!_RBTree_Is_red(the_node) && parent->parent) {
ffc0c678: 81 09 00 00 lwz r8,0(r9)
ffc0c67c: 2f 88 00 00 cmpwi cr7,r8,0
ffc0c680: 41 9e 00 90 beq- cr7,ffc0c710 <_RBTree_Extract_validate_unprotected+0xc0>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
ffc0c684: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c688: 41 9e 00 10 beq- cr7,ffc0c698 <_RBTree_Extract_validate_unprotected+0x48><== NEVER TAKEN
ffc0c68c: 80 ea 00 0c lwz r7,12(r10)
ffc0c690: 2f 87 00 01 cmpwi cr7,r7,1
ffc0c694: 41 9e 01 68 beq- cr7,ffc0c7fc <_RBTree_Extract_validate_unprotected+0x1ac>
_RBTree_Rotate(parent, dir);
sibling = parent->child[_RBTree_Opposite_direction(dir)];
}
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
ffc0c698: 81 0a 00 08 lwz r8,8(r10)
ffc0c69c: 2f 88 00 00 cmpwi cr7,r8,0
ffc0c6a0: 41 9e 00 10 beq- cr7,ffc0c6b0 <_RBTree_Extract_validate_unprotected+0x60>
ffc0c6a4: 81 08 00 0c lwz r8,12(r8)
ffc0c6a8: 2f 88 00 01 cmpwi cr7,r8,1
ffc0c6ac: 41 9e 00 7c beq- cr7,ffc0c728 <_RBTree_Extract_validate_unprotected+0xd8>
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
ffc0c6b0: 81 0a 00 04 lwz r8,4(r10)
ffc0c6b4: 2f 88 00 00 cmpwi cr7,r8,0
ffc0c6b8: 41 9e 00 10 beq- cr7,ffc0c6c8 <_RBTree_Extract_validate_unprotected+0x78>
ffc0c6bc: 81 08 00 0c lwz r8,12(r8)
ffc0c6c0: 2f 88 00 01 cmpwi cr7,r8,1
ffc0c6c4: 41 9e 00 64 beq- cr7,ffc0c728 <_RBTree_Extract_validate_unprotected+0xd8>
sibling->color = RBT_RED;
ffc0c6c8: 90 ca 00 0c stw r6,12(r10)
ffc0c6cc: 81 49 00 0c lwz r10,12(r9)
ffc0c6d0: 2f 8a 00 01 cmpwi cr7,r10,1
ffc0c6d4: 41 9e 02 6c beq- cr7,ffc0c940 <_RBTree_Extract_validate_unprotected+0x2f0>
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
break;
}
the_node = parent; /* done if parent is red */
parent = the_node->parent;
ffc0c6d8: 81 09 00 00 lwz r8,0(r9)
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
ffc0c6dc: 2f 88 00 00 cmpwi cr7,r8,0
ffc0c6e0: 41 9e 01 b0 beq- cr7,ffc0c890 <_RBTree_Extract_validate_unprotected+0x240><== NEVER TAKEN
if(!(the_node->parent->parent)) return NULL;
ffc0c6e4: 81 48 00 00 lwz r10,0(r8)
ffc0c6e8: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c6ec: 41 9e 01 a4 beq- cr7,ffc0c890 <_RBTree_Extract_validate_unprotected+0x240>
if(the_node == the_node->parent->child[RBT_LEFT])
ffc0c6f0: 81 48 00 04 lwz r10,4(r8)
ffc0c6f4: 7f 89 50 00 cmpw cr7,r9,r10
ffc0c6f8: 41 9e 01 a0 beq- cr7,ffc0c898 <_RBTree_Extract_validate_unprotected+0x248>
ffc0c6fc: 7d 23 4b 78 mr r3,r9
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
ffc0c700: 7d 09 43 78 mr r9,r8
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
ffc0c704: 81 03 00 0c lwz r8,12(r3)
ffc0c708: 2f 88 00 01 cmpwi cr7,r8,1
ffc0c70c: 40 9e ff 6c bne+ cr7,ffc0c678 <_RBTree_Extract_validate_unprotected+0x28>
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
ffc0c710: 81 23 00 00 lwz r9,0(r3)
ffc0c714: 81 29 00 00 lwz r9,0(r9)
ffc0c718: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c71c: 4c be 00 20 bnelr+ cr7
ffc0c720: 91 23 00 0c stw r9,12(r3)
ffc0c724: 4e 80 00 20 blr
* cases, either the_node is to the left or the right of the parent.
* In both cases, first check if one of sibling's children is black,
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
ffc0c728: 81 09 00 04 lwz r8,4(r9)
ffc0c72c: 7c 68 42 78 xor r8,r3,r8
ffc0c730: 7d 08 00 34 cntlzw r8,r8
ffc0c734: 55 08 d9 7e rlwinm r8,r8,27,5,31
ffc0c738: 69 08 00 01 xori r8,r8,1
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
ffc0c73c: 69 07 00 01 xori r7,r8,1
if (!_RBTree_Is_red(sibling->child[_RBTree_Opposite_direction(dir)])) {
ffc0c740: 54 e7 10 3a rlwinm r7,r7,2,0,29
ffc0c744: 7c ca 3a 14 add r6,r10,r7
ffc0c748: 80 c6 00 04 lwz r6,4(r6)
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
ffc0c74c: 2f 86 00 00 cmpwi cr7,r6,0
ffc0c750: 41 9e 00 10 beq- cr7,ffc0c760 <_RBTree_Extract_validate_unprotected+0x110>
ffc0c754: 80 a6 00 0c lwz r5,12(r6)
ffc0c758: 2f 85 00 01 cmpwi cr7,r5,1
ffc0c75c: 41 9e 01 4c beq- cr7,ffc0c8a8 <_RBTree_Extract_validate_unprotected+0x258>
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
ffc0c760: 55 08 10 3a rlwinm r8,r8,2,0,29
ffc0c764: 7c aa 42 14 add r5,r10,r8
ffc0c768: 80 c5 00 04 lwz r6,4(r5)
* and if so rotate in the proper direction and update sibling pointer.
* Then switch the sibling and parent colors, and rotate through parent.
*/
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[_RBTree_Opposite_direction(dir)])) {
sibling->color = RBT_RED;
ffc0c76c: 38 80 00 01 li r4,1
ffc0c770: 90 8a 00 0c stw r4,12(r10)
sibling->child[dir]->color = RBT_BLACK;
ffc0c774: 38 80 00 00 li r4,0
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
ffc0c778: 2f 86 00 00 cmpwi cr7,r6,0
ffc0c77c: 90 86 00 0c stw r4,12(r6)
ffc0c780: 41 9e 00 54 beq- cr7,ffc0c7d4 <_RBTree_Extract_validate_unprotected+0x184><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
ffc0c784: 7c 86 3a 14 add r4,r6,r7
ffc0c788: 81 64 00 04 lwz r11,4(r4)
ffc0c78c: 91 65 00 04 stw r11,4(r5)
if (c->child[dir])
ffc0c790: 80 a4 00 04 lwz r5,4(r4)
ffc0c794: 2f 85 00 00 cmpwi cr7,r5,0
ffc0c798: 41 9e 00 08 beq- cr7,ffc0c7a0 <_RBTree_Extract_validate_unprotected+0x150>
c->child[dir]->parent = the_node;
ffc0c79c: 91 45 00 00 stw r10,0(r5)
c->child[dir] = the_node;
ffc0c7a0: 7c a6 3a 14 add r5,r6,r7
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c7a4: 80 8a 00 00 lwz r4,0(r10)
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
ffc0c7a8: 91 45 00 04 stw r10,4(r5)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c7ac: 80 a4 00 04 lwz r5,4(r4)
c->parent = the_node->parent;
ffc0c7b0: 90 86 00 00 stw r4,0(r6)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c7b4: 7d 45 2a 78 xor r5,r10,r5
ffc0c7b8: 7c a5 00 34 cntlzw r5,r5
c->parent = the_node->parent;
the_node->parent = c;
ffc0c7bc: 90 ca 00 00 stw r6,0(r10)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c7c0: 54 a5 d9 7e rlwinm r5,r5,27,5,31
ffc0c7c4: 68 a5 00 01 xori r5,r5,1
ffc0c7c8: 54 a5 10 3a rlwinm r5,r5,2,0,29
ffc0c7cc: 7c 84 2a 14 add r4,r4,r5
ffc0c7d0: 90 c4 00 04 stw r6,4(r4)
_RBTree_Rotate(sibling, _RBTree_Opposite_direction(dir));
sibling = parent->child[_RBTree_Opposite_direction(dir)];
ffc0c7d4: 7d 49 3a 14 add r10,r9,r7
}
sibling->color = parent->color;
ffc0c7d8: 80 c9 00 0c lwz r6,12(r9)
dir = the_node != parent->child[0];
if (!_RBTree_Is_red(sibling->child[_RBTree_Opposite_direction(dir)])) {
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, _RBTree_Opposite_direction(dir));
sibling = parent->child[_RBTree_Opposite_direction(dir)];
ffc0c7dc: 80 aa 00 04 lwz r5,4(r10)
ffc0c7e0: 7d 45 3a 14 add r10,r5,r7
}
sibling->color = parent->color;
ffc0c7e4: 90 c5 00 0c stw r6,12(r5)
ffc0c7e8: 80 8a 00 04 lwz r4,4(r10)
parent->color = RBT_BLACK;
ffc0c7ec: 39 40 00 00 li r10,0
ffc0c7f0: 91 49 00 0c stw r10,12(r9)
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
ffc0c7f4: 91 44 00 0c stw r10,12(r4)
ffc0c7f8: 48 00 00 d8 b ffc0c8d0 <_RBTree_Extract_validate_unprotected+0x280>
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
ffc0c7fc: 80 a9 00 04 lwz r5,4(r9)
* then rotate parent left, making the sibling be the_node's grandparent.
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
ffc0c800: 90 e9 00 0c stw r7,12(r9)
sibling->color = RBT_BLACK;
dir = the_node != parent->child[0];
ffc0c804: 7c 67 2a 78 xor r7,r3,r5
ffc0c808: 7c e7 00 34 cntlzw r7,r7
* Now the_node has a black sibling and red parent. After rotation,
* update sibling pointer.
*/
if (_RBTree_Is_red(sibling)) {
parent->color = RBT_RED;
sibling->color = RBT_BLACK;
ffc0c80c: 90 8a 00 0c stw r4,12(r10)
dir = the_node != parent->child[0];
ffc0c810: 54 e7 d9 7e rlwinm r7,r7,27,5,31
ffc0c814: 68 e0 00 01 xori r0,r7,1
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
ffc0c818: 68 0b 00 01 xori r11,r0,1
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
ffc0c81c: 55 6b 10 3a rlwinm r11,r11,2,0,29
ffc0c820: 7c a9 5a 14 add r5,r9,r11
ffc0c824: 80 e5 00 04 lwz r7,4(r5)
ffc0c828: 2f 87 00 00 cmpwi cr7,r7,0
ffc0c82c: 41 9e 00 74 beq- cr7,ffc0c8a0 <_RBTree_Extract_validate_unprotected+0x250><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
ffc0c830: 54 00 10 3a rlwinm r0,r0,2,0,29
ffc0c834: 7d 47 02 14 add r10,r7,r0
ffc0c838: 81 8a 00 04 lwz r12,4(r10)
ffc0c83c: 91 85 00 04 stw r12,4(r5)
if (c->child[dir])
ffc0c840: 81 4a 00 04 lwz r10,4(r10)
ffc0c844: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c848: 41 9e 00 0c beq- cr7,ffc0c854 <_RBTree_Extract_validate_unprotected+0x204><== NEVER TAKEN
c->child[dir]->parent = the_node;
ffc0c84c: 91 2a 00 00 stw r9,0(r10)
ffc0c850: 81 09 00 00 lwz r8,0(r9)
c->child[dir] = the_node;
ffc0c854: 7d 47 02 14 add r10,r7,r0
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
c->parent = the_node->parent;
ffc0c858: 91 07 00 00 stw r8,0(r7)
ffc0c85c: 7d 69 5a 14 add r11,r9,r11
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
ffc0c860: 91 2a 00 04 stw r9,4(r10)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c864: 81 48 00 04 lwz r10,4(r8)
c->parent = the_node->parent;
the_node->parent = c;
ffc0c868: 90 e9 00 00 stw r7,0(r9)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c86c: 7d 2a 52 78 xor r10,r9,r10
ffc0c870: 7d 4a 00 34 cntlzw r10,r10
ffc0c874: 55 4a d9 7e rlwinm r10,r10,27,5,31
ffc0c878: 69 4a 00 01 xori r10,r10,1
ffc0c87c: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc0c880: 7d 08 52 14 add r8,r8,r10
ffc0c884: 90 e8 00 04 stw r7,4(r8)
ffc0c888: 81 4b 00 04 lwz r10,4(r11)
ffc0c88c: 4b ff fe 0c b ffc0c698 <_RBTree_Extract_validate_unprotected+0x48>
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
ffc0c890: 39 40 00 00 li r10,0
ffc0c894: 4b ff fe 68 b ffc0c6fc <_RBTree_Extract_validate_unprotected+0xac>
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
ffc0c898: 81 48 00 08 lwz r10,8(r8)
ffc0c89c: 4b ff fe 60 b ffc0c6fc <_RBTree_Extract_validate_unprotected+0xac>
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
ffc0c8a0: 39 40 00 00 li r10,0 <== NOT EXECUTED
ffc0c8a4: 4b ff fd f4 b ffc0c698 <_RBTree_Extract_validate_unprotected+0x48><== NOT EXECUTED
ffc0c8a8: 7c a9 3a 14 add r5,r9,r7
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, _RBTree_Opposite_direction(dir));
sibling = parent->child[_RBTree_Opposite_direction(dir)];
}
sibling->color = parent->color;
ffc0c8ac: 81 69 00 0c lwz r11,12(r9)
ffc0c8b0: 80 a5 00 04 lwz r5,4(r5)
parent->color = RBT_BLACK;
ffc0c8b4: 38 80 00 00 li r4,0
sibling->color = RBT_RED;
sibling->child[dir]->color = RBT_BLACK;
_RBTree_Rotate(sibling, _RBTree_Opposite_direction(dir));
sibling = parent->child[_RBTree_Opposite_direction(dir)];
}
sibling->color = parent->color;
ffc0c8b8: 91 6a 00 0c stw r11,12(r10)
ffc0c8bc: 2f 85 00 00 cmpwi cr7,r5,0
parent->color = RBT_BLACK;
ffc0c8c0: 90 89 00 0c stw r4,12(r9)
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
ffc0c8c4: 90 86 00 0c stw r4,12(r6)
ffc0c8c8: 41 be fe 48 beq- cr7,ffc0c710 <_RBTree_Extract_validate_unprotected+0xc0><== NEVER TAKEN
ffc0c8cc: 55 08 10 3a rlwinm r8,r8,2,0,29
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
ffc0c8d0: 7d 45 42 14 add r10,r5,r8
ffc0c8d4: 80 ca 00 04 lwz r6,4(r10)
ffc0c8d8: 7c e9 3a 14 add r7,r9,r7
ffc0c8dc: 90 c7 00 04 stw r6,4(r7)
if (c->child[dir])
ffc0c8e0: 81 4a 00 04 lwz r10,4(r10)
ffc0c8e4: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c8e8: 41 9e 00 08 beq- cr7,ffc0c8f0 <_RBTree_Extract_validate_unprotected+0x2a0>
c->child[dir]->parent = the_node;
ffc0c8ec: 91 2a 00 00 stw r9,0(r10)
c->child[dir] = the_node;
ffc0c8f0: 7d 05 42 14 add r8,r5,r8
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c8f4: 80 e9 00 00 lwz r7,0(r9)
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
ffc0c8f8: 91 28 00 04 stw r9,4(r8)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
c->parent = the_node->parent;
ffc0c8fc: 90 e5 00 00 stw r7,0(r5)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c900: 81 47 00 04 lwz r10,4(r7)
c->parent = the_node->parent;
the_node->parent = c;
ffc0c904: 90 a9 00 00 stw r5,0(r9)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0c908: 7d 2a 52 78 xor r10,r9,r10
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
ffc0c90c: 81 23 00 00 lwz r9,0(r3)
ffc0c910: 7d 4a 00 34 cntlzw r10,r10
ffc0c914: 55 4a d9 7e rlwinm r10,r10,27,5,31
ffc0c918: 81 29 00 00 lwz r9,0(r9)
ffc0c91c: 69 4a 00 01 xori r10,r10,1
ffc0c920: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc0c924: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c928: 7c e7 52 14 add r7,r7,r10
ffc0c92c: 90 a7 00 04 stw r5,4(r7)
ffc0c930: 4c be 00 20 bnelr+ cr7
ffc0c934: 4b ff fd ec b ffc0c720 <_RBTree_Extract_validate_unprotected+0xd0><== NOT EXECUTED
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
ffc0c938: 81 49 00 08 lwz r10,8(r9)
ffc0c93c: 4b ff fd 30 b ffc0c66c <_RBTree_Extract_validate_unprotected+0x1c>
/* sibling is black, see if both of its children are also black. */
if (!_RBTree_Is_red(sibling->child[RBT_RIGHT]) &&
!_RBTree_Is_red(sibling->child[RBT_LEFT])) {
sibling->color = RBT_RED;
if (_RBTree_Is_red(parent)) {
parent->color = RBT_BLACK;
ffc0c940: 39 40 00 00 li r10,0
ffc0c944: 91 49 00 0c stw r10,12(r9)
sibling->child[_RBTree_Opposite_direction(dir)]->color = RBT_BLACK;
_RBTree_Rotate(parent, dir);
break; /* done */
}
} /* while */
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
ffc0c948: 81 23 00 00 lwz r9,0(r3)
ffc0c94c: 81 29 00 00 lwz r9,0(r9)
ffc0c950: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c954: 4c be 00 20 bnelr+ cr7
ffc0c958: 4b ff fd c8 b ffc0c720 <_RBTree_Extract_validate_unprotected+0xd0><== NOT EXECUTED
ffc0cd00 <_RBTree_Find>:
RBTree_Node *_RBTree_Find(
RBTree_Control *the_rbtree,
RBTree_Node *search_node
)
{
ffc0cd00: 94 21 ff e0 stwu r1,-32(r1)
ffc0cd04: 7c 08 02 a6 mflr r0
ffc0cd08: 90 01 00 24 stw r0,36(r1)
ffc0cd0c: 93 c1 00 18 stw r30,24(r1)
ffc0cd10: 7c 7e 1b 78 mr r30,r3
ffc0cd14: 93 61 00 0c stw r27,12(r1)
ffc0cd18: 93 81 00 10 stw r28,16(r1)
ffc0cd1c: 93 a1 00 14 stw r29,20(r1)
ffc0cd20: 93 e1 00 1c stw r31,28(r1)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0cd24: 7f 60 00 a6 mfmsr r27
ffc0cd28: 7d 30 42 a6 mfsprg r9,0
ffc0cd2c: 7f 69 48 78 andc r9,r27,r9
ffc0cd30: 7d 20 01 24 mtmsr r9
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
ffc0cd34: 83 e3 00 04 lwz r31,4(r3)
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
ffc0cd38: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0cd3c: 41 9e 00 b0 beq- cr7,ffc0cdec <_RBTree_Find+0xec> <== NEVER TAKEN
ffc0cd40: 7c 9d 23 78 mr r29,r4
ffc0cd44: 3b 80 00 00 li r28,0
compare_result = the_rbtree->compare_function(the_node, iter_node);
ffc0cd48: 81 3e 00 10 lwz r9,16(r30)
ffc0cd4c: 7f e4 fb 78 mr r4,r31
ffc0cd50: 7f a3 eb 78 mr r3,r29
ffc0cd54: 7d 29 03 a6 mtctr r9
ffc0cd58: 4e 80 04 21 bctrl
if ( _RBTree_Is_equal( compare_result ) ) {
ffc0cd5c: 2c 03 00 00 cmpwi r3,0
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
ffc0cd60: 7c 6a fe 70 srawi r10,r3,31
ffc0cd64: 7d 23 50 50 subf r9,r3,r10
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
ffc0cd68: 55 29 1f 7a rlwinm r9,r9,3,29,29
ffc0cd6c: 7d 3f 4a 14 add r9,r31,r9
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( _RBTree_Is_equal( compare_result ) ) {
ffc0cd70: 40 82 00 14 bne- ffc0cd84 <_RBTree_Find+0x84>
found = iter_node;
if ( the_rbtree->is_unique )
ffc0cd74: 89 5e 00 14 lbz r10,20(r30)
ffc0cd78: 7f fc fb 78 mr r28,r31
ffc0cd7c: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0cd80: 40 9e 00 3c bne- cr7,ffc0cdbc <_RBTree_Find+0xbc>
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
ffc0cd84: 83 e9 00 04 lwz r31,4(r9)
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
ffc0cd88: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0cd8c: 40 9e ff bc bne+ cr7,ffc0cd48 <_RBTree_Find+0x48>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0cd90: 7f 60 01 24 mtmsr r27
return_node = NULL;
_ISR_Disable( level );
return_node = _RBTree_Find_unprotected( the_rbtree, search_node );
_ISR_Enable( level );
return return_node;
}
ffc0cd94: 80 01 00 24 lwz r0,36(r1)
ffc0cd98: 7f 83 e3 78 mr r3,r28
ffc0cd9c: 83 61 00 0c lwz r27,12(r1)
ffc0cda0: 7c 08 03 a6 mtlr r0
ffc0cda4: 83 81 00 10 lwz r28,16(r1)
ffc0cda8: 83 a1 00 14 lwz r29,20(r1)
ffc0cdac: 83 c1 00 18 lwz r30,24(r1)
ffc0cdb0: 83 e1 00 1c lwz r31,28(r1)
ffc0cdb4: 38 21 00 20 addi r1,r1,32
ffc0cdb8: 4e 80 00 20 blr
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( _RBTree_Is_equal( compare_result ) ) {
found = iter_node;
if ( the_rbtree->is_unique )
ffc0cdbc: 7f fc fb 78 mr r28,r31
ffc0cdc0: 7f 60 01 24 mtmsr r27
ffc0cdc4: 80 01 00 24 lwz r0,36(r1)
ffc0cdc8: 7f 83 e3 78 mr r3,r28
ffc0cdcc: 83 61 00 0c lwz r27,12(r1)
ffc0cdd0: 7c 08 03 a6 mtlr r0
ffc0cdd4: 83 81 00 10 lwz r28,16(r1)
ffc0cdd8: 83 a1 00 14 lwz r29,20(r1)
ffc0cddc: 83 c1 00 18 lwz r30,24(r1)
ffc0cde0: 83 e1 00 1c lwz r31,28(r1)
ffc0cde4: 38 21 00 20 addi r1,r1,32
ffc0cde8: 4e 80 00 20 blr
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
ffc0cdec: 3b 80 00 00 li r28,0 <== NOT EXECUTED
ffc0cdf0: 4b ff ff a0 b ffc0cd90 <_RBTree_Find+0x90> <== NOT EXECUTED
ffc0d29c <_RBTree_Initialize>:
void *starting_address,
size_t number_nodes,
size_t node_size,
bool is_unique
)
{
ffc0d29c: 94 21 ff e8 stwu r1,-24(r1)
ffc0d2a0: 7c 08 02 a6 mflr r0
ffc0d2a4: 93 a1 00 0c stw r29,12(r1)
size_t count;
RBTree_Node *next;
/* TODO: Error message? */
if (!the_rbtree) return;
ffc0d2a8: 7c 7d 1b 79 mr. r29,r3
void *starting_address,
size_t number_nodes,
size_t node_size,
bool is_unique
)
{
ffc0d2ac: 90 01 00 1c stw r0,28(r1)
ffc0d2b0: 93 81 00 08 stw r28,8(r1)
ffc0d2b4: 93 c1 00 10 stw r30,16(r1)
ffc0d2b8: 93 e1 00 14 stw r31,20(r1)
size_t count;
RBTree_Node *next;
/* TODO: Error message? */
if (!the_rbtree) return;
ffc0d2bc: 41 82 00 4c beq- ffc0d308 <_RBTree_Initialize+0x6c> <== NEVER TAKEN
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
ffc0d2c0: 2f 86 00 00 cmpwi cr7,r6,0
{
the_rbtree->permanent_null = NULL;
the_rbtree->root = NULL;
the_rbtree->first[0] = NULL;
the_rbtree->first[1] = NULL;
the_rbtree->compare_function = compare_function;
ffc0d2c4: 90 9d 00 10 stw r4,16(r29)
RBTree_Control *the_rbtree,
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
ffc0d2c8: 39 20 00 00 li r9,0
ffc0d2cc: 7c df 33 78 mr r31,r6
ffc0d2d0: 91 3d 00 00 stw r9,0(r29)
the_rbtree->root = NULL;
ffc0d2d4: 91 3d 00 04 stw r9,4(r29)
the_rbtree->first[0] = NULL;
ffc0d2d8: 91 3d 00 08 stw r9,8(r29)
the_rbtree->first[1] = NULL;
ffc0d2dc: 91 3d 00 0c stw r9,12(r29)
the_rbtree->compare_function = compare_function;
the_rbtree->is_unique = is_unique;
ffc0d2e0: 99 1d 00 14 stb r8,20(r29)
ffc0d2e4: 41 9e 00 24 beq- cr7,ffc0d308 <_RBTree_Initialize+0x6c> <== NEVER TAKEN
ffc0d2e8: 7c fc 3b 78 mr r28,r7
ffc0d2ec: 7c be 2b 78 mr r30,r5
_RBTree_Insert_unprotected(the_rbtree, next);
ffc0d2f0: 7f c4 f3 78 mr r4,r30
ffc0d2f4: 7f a3 eb 78 mr r3,r29
ffc0d2f8: 4b ff fb 55 bl ffc0ce4c <_RBTree_Insert_unprotected>
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
ffc0d2fc: 37 ff ff ff addic. r31,r31,-1
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/rbtree.h>
#include <rtems/score/isr.h>
void _RBTree_Initialize(
ffc0d300: 7f de e2 14 add r30,r30,r28
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
ffc0d304: 40 82 ff ec bne+ ffc0d2f0 <_RBTree_Initialize+0x54>
_RBTree_Insert_unprotected(the_rbtree, next);
next = (RBTree_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
}
ffc0d308: 80 01 00 1c lwz r0,28(r1)
ffc0d30c: 83 81 00 08 lwz r28,8(r1)
ffc0d310: 7c 08 03 a6 mtlr r0
ffc0d314: 83 a1 00 0c lwz r29,12(r1)
ffc0d318: 83 c1 00 10 lwz r30,16(r1)
ffc0d31c: 83 e1 00 14 lwz r31,20(r1)
ffc0d320: 38 21 00 18 addi r1,r1,24
ffc0d324: 4e 80 00 20 blr
ffc0cb80 <_RBTree_Insert_unprotected>:
*/
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
ffc0cb80: 94 21 ff e0 stwu r1,-32(r1)
ffc0cb84: 7c 08 02 a6 mflr r0
ffc0cb88: 93 e1 00 1c stw r31,28(r1)
if(!the_node) return (RBTree_Node*)-1;
ffc0cb8c: 7c 9f 23 79 mr. r31,r4
*/
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
ffc0cb90: 90 01 00 24 stw r0,36(r1)
ffc0cb94: 93 41 00 08 stw r26,8(r1)
ffc0cb98: 93 61 00 0c stw r27,12(r1)
ffc0cb9c: 93 81 00 10 stw r28,16(r1)
ffc0cba0: 93 a1 00 14 stw r29,20(r1)
ffc0cba4: 93 c1 00 18 stw r30,24(r1)
if(!the_node) return (RBTree_Node*)-1;
ffc0cba8: 41 82 02 b8 beq- ffc0ce60 <_RBTree_Insert_unprotected+0x2e0>
RBTree_Node *iter_node = the_rbtree->root;
ffc0cbac: 83 a3 00 04 lwz r29,4(r3)
ffc0cbb0: 7c 7c 1b 78 mr r28,r3
int compare_result;
if (!iter_node) { /* special case: first node inserted */
ffc0cbb4: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0cbb8: 40 be 00 0c bne+ cr7,ffc0cbc4 <_RBTree_Insert_unprotected+0x44>
ffc0cbbc: 48 00 02 dc b ffc0ce98 <_RBTree_Insert_unprotected+0x318>
(dir && _RBTree_Is_greater(compare_result)) ) {
the_rbtree->first[dir] = the_node;
}
break;
} else {
iter_node = iter_node->child[dir];
ffc0cbc0: 7f dd f3 78 mr r29,r30
the_node->parent = (RBTree_Node *) the_rbtree;
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
ffc0cbc4: 81 3c 00 10 lwz r9,16(r28)
ffc0cbc8: 7f a4 eb 78 mr r4,r29
ffc0cbcc: 7f e3 fb 78 mr r3,r31
ffc0cbd0: 7d 29 03 a6 mtctr r9
ffc0cbd4: 4e 80 04 21 bctrl
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
ffc0cbd8: 89 5c 00 14 lbz r10,20(r28)
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
ffc0cbdc: 7c 7a 18 f8 not r26,r3
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
ffc0cbe0: 2f 0a 00 00 cmpwi cr6,r10,0
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
ffc0cbe4: 57 5a 0f fe rlwinm r26,r26,1,31,31
if (!iter_node->child[dir]) {
ffc0cbe8: 57 5b 10 3a rlwinm r27,r26,2,0,29
ffc0cbec: 7d 3d da 14 add r9,r29,r27
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
ffc0cbf0: 2f 83 00 00 cmpwi cr7,r3,0
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
ffc0cbf4: 39 09 00 04 addi r8,r9,4
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
ffc0cbf8: 41 9a 00 08 beq- cr6,ffc0cc00 <_RBTree_Insert_unprotected+0x80>
ffc0cbfc: 41 9e 02 94 beq- cr7,ffc0ce90 <_RBTree_Insert_unprotected+0x310>
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
ffc0cc00: 83 c9 00 04 lwz r30,4(r9)
ffc0cc04: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0cc08: 40 9e ff b8 bne+ cr7,ffc0cbc0 <_RBTree_Insert_unprotected+0x40>
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
the_node->color = RBT_RED;
ffc0cc0c: 39 20 00 01 li r9,1
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
ffc0cc10: 93 df 00 08 stw r30,8(r31)
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_First(
const RBTree_Control *the_rbtree,
RBTree_Direction dir
)
{
return the_rbtree->first[dir];
ffc0cc14: 7d 5c da 14 add r10,r28,r27
the_node->color = RBT_RED;
ffc0cc18: 91 3f 00 0c stw r9,12(r31)
iter_node->child[dir] = the_node;
the_node->parent = iter_node;
/* update min/max */
compare_result = the_rbtree->compare_function(
ffc0cc1c: 7f e3 fb 78 mr r3,r31
ffc0cc20: 81 3c 00 10 lwz r9,16(r28)
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
ffc0cc24: 93 df 00 04 stw r30,4(r31)
the_node->color = RBT_RED;
iter_node->child[dir] = the_node;
the_node->parent = iter_node;
/* update min/max */
compare_result = the_rbtree->compare_function(
ffc0cc28: 7d 29 03 a6 mtctr r9
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
the_node->color = RBT_RED;
iter_node->child[dir] = the_node;
ffc0cc2c: 93 e8 00 00 stw r31,0(r8)
the_node->parent = iter_node;
ffc0cc30: 93 bf 00 00 stw r29,0(r31)
/* update min/max */
compare_result = the_rbtree->compare_function(
ffc0cc34: 80 8a 00 08 lwz r4,8(r10)
ffc0cc38: 4e 80 04 21 bctrl
the_node,
_RBTree_First(the_rbtree, dir)
);
if ( (!dir && _RBTree_Is_lesser(compare_result)) ||
ffc0cc3c: 2f 9a 00 00 cmpwi cr7,r26,0
ffc0cc40: 40 9e 00 60 bne- cr7,ffc0cca0 <_RBTree_Insert_unprotected+0x120>
ffc0cc44: 2f 83 00 00 cmpwi cr7,r3,0
ffc0cc48: 41 9c 00 60 blt- cr7,ffc0cca8 <_RBTree_Insert_unprotected+0x128>
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
}
the_node->parent->color = RBT_BLACK;
ffc0cc4c: 38 80 00 00 li r4,0
g->color = RBT_RED;
ffc0cc50: 38 60 00 01 li r3,1
_ISR_Disable( level );
return_node = _RBTree_Insert_unprotected( tree, node );
_ISR_Enable( level );
return return_node;
}
ffc0cc54: 81 3f 00 00 lwz r9,0(r31)
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
const RBTree_Node *the_node
)
{
if (!the_node->parent->parent) return NULL;
ffc0cc58: 81 49 00 00 lwz r10,0(r9)
ffc0cc5c: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0cc60: 7d 46 53 78 mr r6,r10
ffc0cc64: 41 9e 01 b0 beq- cr7,ffc0ce14 <_RBTree_Insert_unprotected+0x294>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
ffc0cc68: 81 09 00 0c lwz r8,12(r9)
ffc0cc6c: 2f 88 00 01 cmpwi cr7,r8,1
ffc0cc70: 41 9e 00 44 beq- cr7,ffc0ccb4 <_RBTree_Insert_unprotected+0x134>
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
ffc0cc74: 80 01 00 24 lwz r0,36(r1)
ffc0cc78: 7f c3 f3 78 mr r3,r30
ffc0cc7c: 83 41 00 08 lwz r26,8(r1)
ffc0cc80: 7c 08 03 a6 mtlr r0
ffc0cc84: 83 61 00 0c lwz r27,12(r1)
ffc0cc88: 83 81 00 10 lwz r28,16(r1)
ffc0cc8c: 83 a1 00 14 lwz r29,20(r1)
ffc0cc90: 83 c1 00 18 lwz r30,24(r1)
ffc0cc94: 83 e1 00 1c lwz r31,28(r1)
ffc0cc98: 38 21 00 20 addi r1,r1,32
ffc0cc9c: 4e 80 00 20 blr
compare_result = the_rbtree->compare_function(
the_node,
_RBTree_First(the_rbtree, dir)
);
if ( (!dir && _RBTree_Is_lesser(compare_result)) ||
(dir && _RBTree_Is_greater(compare_result)) ) {
ffc0cca0: 2f 83 00 00 cmpwi cr7,r3,0
ffc0cca4: 40 bd ff a8 ble- cr7,ffc0cc4c <_RBTree_Insert_unprotected+0xcc>
the_rbtree->first[dir] = the_node;
ffc0cca8: 7f 9c da 14 add r28,r28,r27
ffc0ccac: 93 fc 00 08 stw r31,8(r28)
ffc0ccb0: 4b ff ff 9c b ffc0cc4c <_RBTree_Insert_unprotected+0xcc>
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(!(the_node->parent->parent->parent)) return NULL;
ffc0ccb4: 81 0a 00 00 lwz r8,0(r10)
ffc0ccb8: 80 ea 00 04 lwz r7,4(r10)
ffc0ccbc: 2f 88 00 00 cmpwi cr7,r8,0
ffc0ccc0: 41 9e 00 24 beq- cr7,ffc0cce4 <_RBTree_Insert_unprotected+0x164><== NEVER TAKEN
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
ffc0ccc4: 7f 89 38 00 cmpw cr7,r9,r7
ffc0ccc8: 7c e8 3b 78 mr r8,r7
ffc0cccc: 41 9e 01 8c beq- cr7,ffc0ce58 <_RBTree_Insert_unprotected+0x2d8>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
ffc0ccd0: 2f 88 00 00 cmpwi cr7,r8,0
ffc0ccd4: 41 9e 00 10 beq- cr7,ffc0cce4 <_RBTree_Insert_unprotected+0x164>
ffc0ccd8: 80 a8 00 0c lwz r5,12(r8)
ffc0ccdc: 2f 85 00 01 cmpwi cr7,r5,1
ffc0cce0: 41 9e 01 64 beq- cr7,ffc0ce44 <_RBTree_Insert_unprotected+0x2c4>
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
ffc0cce4: 81 09 00 04 lwz r8,4(r9)
RBTree_Direction pdir = the_node->parent != g->child[0];
ffc0cce8: 7d 27 3a 78 xor r7,r9,r7
ffc0ccec: 7c e7 00 34 cntlzw r7,r7
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
ffc0ccf0: 7f e8 42 78 xor r8,r31,r8
ffc0ccf4: 7d 08 00 34 cntlzw r8,r8
RBTree_Direction pdir = the_node->parent != g->child[0];
ffc0ccf8: 54 e7 d9 7e rlwinm r7,r7,27,5,31
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
ffc0ccfc: 55 08 d9 7e rlwinm r8,r8,27,5,31
RBTree_Direction pdir = the_node->parent != g->child[0];
ffc0cd00: 68 e7 00 01 xori r7,r7,1
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
g->color = RBT_RED;
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
ffc0cd04: 69 08 00 01 xori r8,r8,1
RBTree_Direction pdir = the_node->parent != g->child[0];
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
ffc0cd08: 7f 88 38 00 cmpw cr7,r8,r7
ffc0cd0c: 41 9e 00 7c beq- cr7,ffc0cd88 <_RBTree_Insert_unprotected+0x208>
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
ffc0cd10: 68 e5 00 01 xori r5,r7,1
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
ffc0cd14: 54 a5 10 3a rlwinm r5,r5,2,0,29
ffc0cd18: 7c a9 2a 14 add r5,r9,r5
ffc0cd1c: 81 05 00 04 lwz r8,4(r5)
ffc0cd20: 54 eb 10 3a rlwinm r11,r7,2,0,29
ffc0cd24: 2f 88 00 00 cmpwi cr7,r8,0
ffc0cd28: 41 9e 00 54 beq- cr7,ffc0cd7c <_RBTree_Insert_unprotected+0x1fc><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
ffc0cd2c: 7f a8 5a 14 add r29,r8,r11
ffc0cd30: 80 1d 00 04 lwz r0,4(r29)
ffc0cd34: 90 05 00 04 stw r0,4(r5)
if (c->child[dir])
ffc0cd38: 80 bd 00 04 lwz r5,4(r29)
ffc0cd3c: 2f 85 00 00 cmpwi cr7,r5,0
ffc0cd40: 41 9e 00 0c beq- cr7,ffc0cd4c <_RBTree_Insert_unprotected+0x1cc>
c->child[dir]->parent = the_node;
ffc0cd44: 91 25 00 00 stw r9,0(r5)
ffc0cd48: 81 49 00 00 lwz r10,0(r9)
c->child[dir] = the_node;
ffc0cd4c: 7c a8 5a 14 add r5,r8,r11
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
c->parent = the_node->parent;
ffc0cd50: 91 48 00 00 stw r10,0(r8)
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
ffc0cd54: 91 25 00 04 stw r9,4(r5)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0cd58: 80 aa 00 04 lwz r5,4(r10)
c->parent = the_node->parent;
the_node->parent = c;
ffc0cd5c: 91 09 00 00 stw r8,0(r9)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0cd60: 7d 25 2a 78 xor r5,r9,r5
ffc0cd64: 7c a5 00 34 cntlzw r5,r5
ffc0cd68: 54 a5 d9 7e rlwinm r5,r5,27,5,31
ffc0cd6c: 68 a5 00 01 xori r5,r5,1
ffc0cd70: 54 a5 10 3a rlwinm r5,r5,2,0,29
ffc0cd74: 7d 4a 2a 14 add r10,r10,r5
ffc0cd78: 91 0a 00 04 stw r8,4(r10)
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
ffc0cd7c: 7f ff 5a 14 add r31,r31,r11
ffc0cd80: 83 ff 00 04 lwz r31,4(r31)
ffc0cd84: 81 3f 00 00 lwz r9,0(r31)
}
the_node->parent->color = RBT_BLACK;
g->color = RBT_RED;
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
ffc0cd88: 20 e7 00 01 subfic r7,r7,1
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
_RBTree_Rotate(the_node->parent, pdir);
the_node = the_node->child[pdir];
}
the_node->parent->color = RBT_BLACK;
ffc0cd8c: 90 89 00 0c stw r4,12(r9)
ffc0cd90: 68 e8 00 01 xori r8,r7,1
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
ffc0cd94: 55 08 10 3a rlwinm r8,r8,2,0,29
g->color = RBT_RED;
ffc0cd98: 90 66 00 0c stw r3,12(r6)
ffc0cd9c: 7d 06 42 14 add r8,r6,r8
ffc0cda0: 81 48 00 04 lwz r10,4(r8)
ffc0cda4: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0cda8: 41 be fe ac beq- cr7,ffc0cc54 <_RBTree_Insert_unprotected+0xd4><== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
ffc0cdac: 54 e7 10 3a rlwinm r7,r7,2,0,29
ffc0cdb0: 7d 2a 3a 14 add r9,r10,r7
ffc0cdb4: 80 a9 00 04 lwz r5,4(r9)
ffc0cdb8: 90 a8 00 04 stw r5,4(r8)
if (c->child[dir])
ffc0cdbc: 81 29 00 04 lwz r9,4(r9)
ffc0cdc0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cdc4: 41 9e 00 08 beq- cr7,ffc0cdcc <_RBTree_Insert_unprotected+0x24c>
c->child[dir]->parent = the_node;
ffc0cdc8: 90 c9 00 00 stw r6,0(r9)
c->child[dir] = the_node;
ffc0cdcc: 7c ea 3a 14 add r7,r10,r7
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0cdd0: 81 06 00 00 lwz r8,0(r6)
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
ffc0cdd4: 90 c7 00 04 stw r6,4(r7)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0cdd8: 81 28 00 04 lwz r9,4(r8)
c->parent = the_node->parent;
ffc0cddc: 91 0a 00 00 stw r8,0(r10)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0cde0: 7c c9 4a 78 xor r9,r6,r9
ffc0cde4: 7d 29 00 34 cntlzw r9,r9
c->parent = the_node->parent;
the_node->parent = c;
ffc0cde8: 91 46 00 00 stw r10,0(r6)
if (c->child[dir])
c->child[dir]->parent = the_node;
c->child[dir] = the_node;
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
ffc0cdec: 55 29 d9 7e rlwinm r9,r9,27,5,31
ffc0cdf0: 69 29 00 01 xori r9,r9,1
ffc0cdf4: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0cdf8: 7d 08 4a 14 add r8,r8,r9
ffc0cdfc: 91 48 00 04 stw r10,4(r8)
_ISR_Disable( level );
return_node = _RBTree_Insert_unprotected( tree, node );
_ISR_Enable( level );
return return_node;
}
ffc0ce00: 81 3f 00 00 lwz r9,0(r31)
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
const RBTree_Node *the_node
)
{
if (!the_node->parent->parent) return NULL;
ffc0ce04: 81 49 00 00 lwz r10,0(r9)
ffc0ce08: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ce0c: 7d 46 53 78 mr r6,r10
ffc0ce10: 40 9e fe 58 bne+ cr7,ffc0cc68 <_RBTree_Insert_unprotected+0xe8><== ALWAYS TAKEN
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
ffc0ce14: 80 01 00 24 lwz r0,36(r1)
ffc0ce18: 7f c3 f3 78 mr r3,r30
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
}
}
if(!the_node->parent->parent) the_node->color = RBT_BLACK;
ffc0ce1c: 91 5f 00 0c stw r10,12(r31)
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
ffc0ce20: 7c 08 03 a6 mtlr r0
ffc0ce24: 83 41 00 08 lwz r26,8(r1)
ffc0ce28: 83 61 00 0c lwz r27,12(r1)
ffc0ce2c: 83 81 00 10 lwz r28,16(r1)
ffc0ce30: 83 a1 00 14 lwz r29,20(r1)
ffc0ce34: 83 c1 00 18 lwz r30,24(r1)
ffc0ce38: 83 e1 00 1c lwz r31,28(r1)
ffc0ce3c: 38 21 00 20 addi r1,r1,32
ffc0ce40: 4e 80 00 20 blr
u = _RBTree_Parent_sibling(the_node);
g = the_node->parent->parent;
/* if uncle is red, repaint uncle/parent black and grandparent red */
if(_RBTree_Is_red(u)) {
the_node->parent->color = RBT_BLACK;
ffc0ce44: 90 89 00 0c stw r4,12(r9)
u->color = RBT_BLACK;
g->color = RBT_RED;
ffc0ce48: 7d 5f 53 78 mr r31,r10
g = the_node->parent->parent;
/* if uncle is red, repaint uncle/parent black and grandparent red */
if(_RBTree_Is_red(u)) {
the_node->parent->color = RBT_BLACK;
u->color = RBT_BLACK;
ffc0ce4c: 90 88 00 0c stw r4,12(r8)
g->color = RBT_RED;
ffc0ce50: 90 aa 00 0c stw r5,12(r10)
ffc0ce54: 4b ff fe 00 b ffc0cc54 <_RBTree_Insert_unprotected+0xd4>
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
ffc0ce58: 81 0a 00 08 lwz r8,8(r10)
ffc0ce5c: 4b ff fe 74 b ffc0ccd0 <_RBTree_Insert_unprotected+0x150>
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
ffc0ce60: 80 01 00 24 lwz r0,36(r1)
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
if(!the_node) return (RBTree_Node*)-1;
ffc0ce64: 3b c0 ff ff li r30,-1
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
ffc0ce68: 7f c3 f3 78 mr r3,r30
ffc0ce6c: 83 41 00 08 lwz r26,8(r1)
ffc0ce70: 7c 08 03 a6 mtlr r0
ffc0ce74: 83 61 00 0c lwz r27,12(r1)
ffc0ce78: 83 81 00 10 lwz r28,16(r1)
ffc0ce7c: 83 a1 00 14 lwz r29,20(r1)
ffc0ce80: 83 c1 00 18 lwz r30,24(r1)
ffc0ce84: 83 e1 00 1c lwz r31,28(r1)
ffc0ce88: 38 21 00 20 addi r1,r1,32
ffc0ce8c: 4e 80 00 20 blr
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
} else {
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
ffc0ce90: 7f be eb 78 mr r30,r29
ffc0ce94: 4b ff fd e0 b ffc0cc74 <_RBTree_Insert_unprotected+0xf4>
RBTree_Node *iter_node = the_rbtree->root;
int compare_result;
if (!iter_node) { /* special case: first node inserted */
the_node->color = RBT_BLACK;
ffc0ce98: 93 bf 00 0c stw r29,12(r31)
} /* while(iter_node) */
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
ffc0ce9c: 3b c0 00 00 li r30,0
RBTree_Node *iter_node = the_rbtree->root;
int compare_result;
if (!iter_node) { /* special case: first node inserted */
the_node->color = RBT_BLACK;
the_rbtree->root = the_node;
ffc0cea0: 93 e3 00 04 stw r31,4(r3)
the_rbtree->first[0] = the_rbtree->first[1] = the_node;
ffc0cea4: 93 e3 00 0c stw r31,12(r3)
ffc0cea8: 93 e3 00 08 stw r31,8(r3)
the_node->parent = (RBTree_Node *) the_rbtree;
ffc0ceac: 90 7f 00 00 stw r3,0(r31)
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
ffc0ceb0: 93 bf 00 08 stw r29,8(r31)
ffc0ceb4: 93 bf 00 04 stw r29,4(r31)
ffc0ceb8: 4b ff fd bc b ffc0cc74 <_RBTree_Insert_unprotected+0xf4>
ffc0cef8 <_RBTree_Iterate_unprotected>:
const RBTree_Control *rbtree,
RBTree_Direction dir,
RBTree_Visitor visitor,
void *visitor_arg
)
{
ffc0cef8: 94 21 ff e0 stwu r1,-32(r1)
ffc0cefc: 7c 08 02 a6 mflr r0
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
ffc0cf00: 7c 89 00 34 cntlzw r9,r4
ffc0cf04: 55 29 d9 7e rlwinm r9,r9,27,5,31
ffc0cf08: 90 01 00 24 stw r0,36(r1)
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_First(
const RBTree_Control *the_rbtree,
RBTree_Direction dir
)
{
return the_rbtree->first[dir];
ffc0cf0c: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0cf10: 7c 63 4a 14 add r3,r3,r9
ffc0cf14: 93 e1 00 1c stw r31,28(r1)
ffc0cf18: 83 e3 00 08 lwz r31,8(r3)
ffc0cf1c: 93 a1 00 14 stw r29,20(r1)
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
ffc0cf20: 2f 9f 00 00 cmpwi cr7,r31,0
const RBTree_Control *rbtree,
RBTree_Direction dir,
RBTree_Visitor visitor,
void *visitor_arg
)
{
ffc0cf24: 93 61 00 0c stw r27,12(r1)
ffc0cf28: 7c bb 2b 78 mr r27,r5
ffc0cf2c: 93 81 00 10 stw r28,16(r1)
ffc0cf30: 7c dc 33 78 mr r28,r6
ffc0cf34: 93 c1 00 18 stw r30,24(r1)
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
ffc0cf38: 7c 9e 23 78 mr r30,r4
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
ffc0cf3c: 41 9e 00 38 beq- cr7,ffc0cf74 <_RBTree_Iterate_unprotected+0x7c>
stop = (*visitor)( current, dir, visitor_arg );
ffc0cf40: 7f e3 fb 78 mr r3,r31
ffc0cf44: 7f 69 03 a6 mtctr r27
ffc0cf48: 7f 85 e3 78 mr r5,r28
ffc0cf4c: 7f c4 f3 78 mr r4,r30
ffc0cf50: 4e 80 04 21 bctrl
current = _RBTree_Next_unprotected( current, dir );
ffc0cf54: 7f c4 f3 78 mr r4,r30
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
stop = (*visitor)( current, dir, visitor_arg );
ffc0cf58: 7c 7d 1b 78 mr r29,r3
current = _RBTree_Next_unprotected( current, dir );
ffc0cf5c: 7f e3 fb 78 mr r3,r31
ffc0cf60: 48 00 00 39 bl ffc0cf98 <_RBTree_Next_unprotected>
{
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
ffc0cf64: 2f 1d 00 00 cmpwi cr6,r29,0
stop = (*visitor)( current, dir, visitor_arg );
current = _RBTree_Next_unprotected( current, dir );
ffc0cf68: 7c 7f 1b 78 mr r31,r3
{
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
ffc0cf6c: 2f 83 00 00 cmpwi cr7,r3,0
ffc0cf70: 41 9a ff cc beq+ cr6,ffc0cf3c <_RBTree_Iterate_unprotected+0x44><== ALWAYS TAKEN
stop = (*visitor)( current, dir, visitor_arg );
current = _RBTree_Next_unprotected( current, dir );
}
}
ffc0cf74: 80 01 00 24 lwz r0,36(r1)
ffc0cf78: 83 61 00 0c lwz r27,12(r1)
ffc0cf7c: 7c 08 03 a6 mtlr r0
ffc0cf80: 83 81 00 10 lwz r28,16(r1)
ffc0cf84: 83 a1 00 14 lwz r29,20(r1)
ffc0cf88: 83 c1 00 18 lwz r30,24(r1)
ffc0cf8c: 83 e1 00 1c lwz r31,28(r1)
ffc0cf90: 38 21 00 20 addi r1,r1,32
ffc0cf94: 4e 80 00 20 blr
ffc0ae30 <_RTEMS_signal_Post_switch_hook>:
#include <rtems/score/thread.h>
#include <rtems/score/apiext.h>
#include <rtems/rtems/tasks.h>
static void _RTEMS_signal_Post_switch_hook( Thread_Control *executing )
{
ffc0ae30: 94 21 ff e0 stwu r1,-32(r1)
ffc0ae34: 7c 08 02 a6 mflr r0
ffc0ae38: 90 01 00 24 stw r0,36(r1)
ffc0ae3c: 93 e1 00 1c stw r31,28(r1)
RTEMS_API_Control *api;
ASR_Information *asr;
rtems_signal_set signal_set;
Modes_Control prev_mode;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
ffc0ae40: 83 e3 01 4c lwz r31,332(r3)
#include <rtems/score/thread.h>
#include <rtems/score/apiext.h>
#include <rtems/rtems/tasks.h>
static void _RTEMS_signal_Post_switch_hook( Thread_Control *executing )
{
ffc0ae44: 93 c1 00 18 stw r30,24(r1)
ASR_Information *asr;
rtems_signal_set signal_set;
Modes_Control prev_mode;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
if ( !api )
ffc0ae48: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0ae4c: 41 9e 00 2c beq- cr7,ffc0ae78 <_RTEMS_signal_Post_switch_hook+0x48><== NEVER TAKEN
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0ae50: 7d 20 00 a6 mfmsr r9
ffc0ae54: 7d 50 42 a6 mfsprg r10,0
ffc0ae58: 7d 2a 50 78 andc r10,r9,r10
ffc0ae5c: 7d 40 01 24 mtmsr r10
asr = &api->Signal;
_ISR_Disable( level );
signal_set = asr->signals_posted;
asr->signals_posted = 0;
ffc0ae60: 39 40 00 00 li r10,0
*/
asr = &api->Signal;
_ISR_Disable( level );
signal_set = asr->signals_posted;
ffc0ae64: 83 df 00 14 lwz r30,20(r31)
asr->signals_posted = 0;
ffc0ae68: 91 5f 00 14 stw r10,20(r31)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0ae6c: 7d 20 01 24 mtmsr r9
_ISR_Enable( level );
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
ffc0ae70: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0ae74: 40 9e 00 1c bne- cr7,ffc0ae90 <_RTEMS_signal_Post_switch_hook+0x60>
(*asr->handler)( signal_set );
asr->nest_level -= 1;
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
}
ffc0ae78: 80 01 00 24 lwz r0,36(r1)
ffc0ae7c: 83 c1 00 18 lwz r30,24(r1)
ffc0ae80: 7c 08 03 a6 mtlr r0
ffc0ae84: 83 e1 00 1c lwz r31,28(r1)
ffc0ae88: 38 21 00 20 addi r1,r1,32
ffc0ae8c: 4e 80 00 20 blr
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
return;
asr->nest_level += 1;
ffc0ae90: 81 3f 00 1c lwz r9,28(r31)
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
ffc0ae94: 38 80 00 00 li r4,0
ffc0ae98: 80 7f 00 10 lwz r3,16(r31)
ffc0ae9c: 38 a1 00 08 addi r5,r1,8
if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
return;
asr->nest_level += 1;
ffc0aea0: 39 29 00 01 addi r9,r9,1
ffc0aea4: 91 3f 00 1c stw r9,28(r31)
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
ffc0aea8: 60 84 ff ff ori r4,r4,65535
ffc0aeac: 48 00 05 69 bl ffc0b414 <rtems_task_mode>
(*asr->handler)( signal_set );
ffc0aeb0: 81 3f 00 0c lwz r9,12(r31)
ffc0aeb4: 7f c3 f3 78 mr r3,r30
ffc0aeb8: 7d 29 03 a6 mtctr r9
ffc0aebc: 4e 80 04 21 bctrl
asr->nest_level -= 1;
ffc0aec0: 81 3f 00 1c lwz r9,28(r31)
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
ffc0aec4: 80 61 00 08 lwz r3,8(r1)
ffc0aec8: 38 80 00 00 li r4,0
asr->nest_level += 1;
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
(*asr->handler)( signal_set );
asr->nest_level -= 1;
ffc0aecc: 39 29 ff ff addi r9,r9,-1
ffc0aed0: 91 3f 00 1c stw r9,28(r31)
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
ffc0aed4: 38 a1 00 08 addi r5,r1,8
ffc0aed8: 60 84 ff ff ori r4,r4,65535
ffc0aedc: 48 00 05 39 bl ffc0b414 <rtems_task_mode>
}
ffc0aee0: 80 01 00 24 lwz r0,36(r1)
ffc0aee4: 83 c1 00 18 lwz r30,24(r1)
ffc0aee8: 7c 08 03 a6 mtlr r0
ffc0aeec: 83 e1 00 1c lwz r31,28(r1)
ffc0aef0: 38 21 00 20 addi r1,r1,32
ffc0aef4: 4e 80 00 20 blr
ffc09fd8 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
ffc09fd8: 94 21 ff d8 stwu r1,-40(r1)
ffc09fdc: 7c 08 02 a6 mflr r0
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
ffc09fe0: 3d 20 00 00 lis r9,0
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
ffc09fe4: 90 01 00 2c stw r0,44(r1)
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
ffc09fe8: 39 29 20 04 addi r9,r9,8196
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
ffc09fec: 93 e1 00 24 stw r31,36(r1)
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
ffc09ff0: 83 e9 00 2c lwz r31,44(r9)
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
ffc09ff4: 93 a1 00 1c stw r29,28(r1)
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
ffc09ff8: 2f 9f 00 00 cmpwi cr7,r31,0
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
ffc09ffc: 93 c1 00 20 stw r30,32(r1)
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
ffc0a000: 83 a9 00 28 lwz r29,40(r9)
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
ffc0a004: 41 9e 00 5c beq- cr7,ffc0a060 <_RTEMS_tasks_Initialize_user_tasks_body+0x88>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
ffc0a008: 2f 9d 00 00 cmpwi cr7,r29,0
ffc0a00c: 3b c0 00 00 li r30,0
ffc0a010: 41 9e 00 50 beq- cr7,ffc0a060 <_RTEMS_tasks_Initialize_user_tasks_body+0x88><== NEVER TAKEN
return_value = rtems_task_create(
ffc0a014: 80 bf 00 04 lwz r5,4(r31)
ffc0a018: 39 01 00 08 addi r8,r1,8
ffc0a01c: 80 7f 00 00 lwz r3,0(r31)
ffc0a020: 80 9f 00 08 lwz r4,8(r31)
ffc0a024: 80 df 00 14 lwz r6,20(r31)
ffc0a028: 80 ff 00 0c lwz r7,12(r31)
ffc0a02c: 4b ff fc ed bl ffc09d18 <rtems_task_create>
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
ffc0a030: 7c 65 1b 79 mr. r5,r3
ffc0a034: 40 82 00 48 bne- ffc0a07c <_RTEMS_tasks_Initialize_user_tasks_body+0xa4>
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
ffc0a038: 80 bf 00 18 lwz r5,24(r31)
ffc0a03c: 80 61 00 08 lwz r3,8(r1)
ffc0a040: 80 9f 00 10 lwz r4,16(r31)
ffc0a044: 48 00 00 45 bl ffc0a088 <rtems_task_start>
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
ffc0a048: 7c 65 1b 79 mr. r5,r3
ffc0a04c: 40 82 00 30 bne- ffc0a07c <_RTEMS_tasks_Initialize_user_tasks_body+0xa4>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
ffc0a050: 3b de 00 01 addi r30,r30,1
ffc0a054: 7f 9e e8 00 cmpw cr7,r30,r29
ffc0a058: 3b ff 00 1c addi r31,r31,28
ffc0a05c: 40 9e ff b8 bne+ cr7,ffc0a014 <_RTEMS_tasks_Initialize_user_tasks_body+0x3c><== NEVER TAKEN
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
ffc0a060: 80 01 00 2c lwz r0,44(r1)
ffc0a064: 83 a1 00 1c lwz r29,28(r1)
ffc0a068: 7c 08 03 a6 mtlr r0
ffc0a06c: 83 c1 00 20 lwz r30,32(r1)
ffc0a070: 83 e1 00 24 lwz r31,36(r1)
ffc0a074: 38 21 00 28 addi r1,r1,40
ffc0a078: 4e 80 00 20 blr
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 );
ffc0a07c: 38 60 00 01 li r3,1
ffc0a080: 38 80 00 01 li r4,1
ffc0a084: 48 00 12 ed bl ffc0b370 <_Internal_error_Occurred>
ffc102ec <_RTEMS_tasks_Switch_extension>:
/*
* Per Task Variables
*/
tvp = executing->task_variables;
ffc102ec: 81 23 01 58 lwz r9,344(r3)
while (tvp) {
ffc102f0: 2f 89 00 00 cmpwi cr7,r9,0
ffc102f4: 41 9e 00 24 beq- cr7,ffc10318 <_RTEMS_tasks_Switch_extension+0x2c>
tvp->tval = *tvp->ptr;
ffc102f8: 81 49 00 04 lwz r10,4(r9)
*tvp->ptr = tvp->gval;
ffc102fc: 81 09 00 08 lwz r8,8(r9)
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
ffc10300: 80 ea 00 00 lwz r7,0(r10)
ffc10304: 90 e9 00 0c stw r7,12(r9)
*tvp->ptr = tvp->gval;
ffc10308: 91 0a 00 00 stw r8,0(r10)
tvp = (rtems_task_variable_t *)tvp->next;
ffc1030c: 81 29 00 00 lwz r9,0(r9)
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
ffc10310: 2f 89 00 00 cmpwi cr7,r9,0
ffc10314: 40 9e ff e4 bne+ cr7,ffc102f8 <_RTEMS_tasks_Switch_extension+0xc><== NEVER TAKEN
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
ffc10318: 81 24 01 58 lwz r9,344(r4)
while (tvp) {
ffc1031c: 2f 89 00 00 cmpwi cr7,r9,0
ffc10320: 4d 9e 00 20 beqlr cr7
tvp->gval = *tvp->ptr;
ffc10324: 81 49 00 04 lwz r10,4(r9)
*tvp->ptr = tvp->tval;
ffc10328: 81 09 00 0c lwz r8,12(r9)
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
ffc1032c: 80 ea 00 00 lwz r7,0(r10)
ffc10330: 90 e9 00 08 stw r7,8(r9)
*tvp->ptr = tvp->tval;
ffc10334: 91 0a 00 00 stw r8,0(r10)
tvp = (rtems_task_variable_t *)tvp->next;
ffc10338: 81 29 00 00 lwz r9,0(r9)
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
ffc1033c: 2f 89 00 00 cmpwi cr7,r9,0
ffc10340: 40 9e ff e4 bne+ cr7,ffc10324 <_RTEMS_tasks_Switch_extension+0x38><== NEVER TAKEN
ffc10344: 4e 80 00 20 blr
ffc3f0b4 <_Rate_monotonic_Get_status>:
bool _Rate_monotonic_Get_status(
Rate_monotonic_Control *the_period,
Rate_monotonic_Period_time_t *wall_since_last_period,
Thread_CPU_usage_t *cpu_since_last_period
)
{
ffc3f0b4: 94 21 ff d8 stwu r1,-40(r1)
ffc3f0b8: 7c 08 02 a6 mflr r0
ffc3f0bc: 93 81 00 18 stw r28,24(r1)
ffc3f0c0: 7c 9c 23 78 mr r28,r4
*/
static inline void _TOD_Get_uptime(
Timestamp_Control *time
)
{
_TOD_Get_with_nanoseconds( time, &_TOD.uptime );
ffc3f0c4: 3c 80 00 00 lis r4,0
ffc3f0c8: 90 01 00 2c stw r0,44(r1)
ffc3f0cc: 38 84 63 e8 addi r4,r4,25576
ffc3f0d0: 93 c1 00 20 stw r30,32(r1)
ffc3f0d4: 7c 7e 1b 78 mr r30,r3
ffc3f0d8: 38 61 00 08 addi r3,r1,8
ffc3f0dc: 93 a1 00 1c stw r29,28(r1)
ffc3f0e0: 93 e1 00 24 stw r31,36(r1)
ffc3f0e4: 7c bf 2b 78 mr r31,r5
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
Timestamp_Control uptime;
#endif
Thread_Control *owning_thread = the_period->owner;
ffc3f0e8: 83 be 00 40 lwz r29,64(r30)
ffc3f0ec: 4b fc b5 65 bl ffc0a650 <_TOD_Get_with_nanoseconds>
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
ffc3f0f0: 3c e0 00 00 lis r7,0
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
ffc3f0f4: 81 1e 00 50 lwz r8,80(r30)
ffc3f0f8: 38 e7 69 20 addi r7,r7,26912
ffc3f0fc: 81 3e 00 54 lwz r9,84(r30)
ffc3f100: 81 47 00 10 lwz r10,16(r7)
/*
* Determine elapsed wall time since period initiated.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_TOD_Get_uptime( &uptime );
_Timestamp_Subtract(
ffc3f104: 81 61 00 0c lwz r11,12(r1)
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
ffc3f108: 7f 8a e8 00 cmpw cr7,r10,r29
/*
* Determine elapsed wall time since period initiated.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_TOD_Get_uptime( &uptime );
_Timestamp_Subtract(
ffc3f10c: 81 41 00 08 lwz r10,8(r1)
ffc3f110: 7d 29 58 10 subfc r9,r9,r11
ffc3f114: 7d 08 51 10 subfe r8,r8,r10
ffc3f118: 91 1c 00 00 stw r8,0(r28)
ffc3f11c: 91 3c 00 04 stw r9,4(r28)
#endif
/*
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
ffc3f120: 81 1d 00 80 lwz r8,128(r29)
ffc3f124: 81 3d 00 84 lwz r9,132(r29)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
ffc3f128: 41 9e 00 28 beq- cr7,ffc3f150 <_Rate_monotonic_Get_status+0x9c>
if (used < the_period->cpu_usage_period_initiated)
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
ffc3f12c: 38 60 00 01 li r3,1
}
ffc3f130: 80 01 00 2c lwz r0,44(r1)
ffc3f134: 83 81 00 18 lwz r28,24(r1)
ffc3f138: 7c 08 03 a6 mtlr r0
ffc3f13c: 83 a1 00 1c lwz r29,28(r1)
ffc3f140: 83 c1 00 20 lwz r30,32(r1)
ffc3f144: 83 e1 00 24 lwz r31,36(r1)
ffc3f148: 38 21 00 28 addi r1,r1,40
ffc3f14c: 4e 80 00 20 blr
ffc3f150: 80 87 00 20 lwz r4,32(r7)
ffc3f154: 80 a7 00 24 lwz r5,36(r7)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc3f158: 80 de 00 48 lwz r6,72(r30)
ffc3f15c: 7d 65 58 10 subfc r11,r5,r11
ffc3f160: 7d 44 51 10 subfe r10,r4,r10
ffc3f164: 80 fe 00 4c lwz r7,76(r30)
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
ffc3f168: 7d 29 58 14 addc r9,r9,r11
ffc3f16c: 7d 08 51 14 adde r8,r8,r10
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
ffc3f170: 7f 86 40 00 cmpw cr7,r6,r8
ffc3f174: 41 9d 00 44 bgt- cr7,ffc3f1b8 <_Rate_monotonic_Get_status+0x104><== NEVER TAKEN
ffc3f178: 41 9e 00 38 beq- cr7,ffc3f1b0 <_Rate_monotonic_Get_status+0xfc>
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
}
ffc3f17c: 80 01 00 2c lwz r0,44(r1)
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
ffc3f180: 7d 27 48 10 subfc r9,r7,r9
ffc3f184: 7d 06 41 10 subfe r8,r6,r8
ffc3f188: 91 1f 00 00 stw r8,0(r31)
ffc3f18c: 7c 08 03 a6 mtlr r0
if (used < the_period->cpu_usage_period_initiated)
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
ffc3f190: 38 60 00 01 li r3,1
ffc3f194: 91 3f 00 04 stw r9,4(r31)
}
ffc3f198: 83 81 00 18 lwz r28,24(r1)
ffc3f19c: 83 a1 00 1c lwz r29,28(r1)
ffc3f1a0: 83 c1 00 20 lwz r30,32(r1)
ffc3f1a4: 83 e1 00 24 lwz r31,36(r1)
ffc3f1a8: 38 21 00 28 addi r1,r1,40
ffc3f1ac: 4e 80 00 20 blr
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
ffc3f1b0: 7f 87 48 40 cmplw cr7,r7,r9
ffc3f1b4: 40 9d ff c8 ble+ cr7,ffc3f17c <_Rate_monotonic_Get_status+0xc8>
return false;
ffc3f1b8: 38 60 00 00 li r3,0
ffc3f1bc: 4b ff ff 74 b ffc3f130 <_Rate_monotonic_Get_status+0x7c>
ffc3f61c <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
ffc3f61c: 94 21 ff e0 stwu r1,-32(r1)
ffc3f620: 7c 08 02 a6 mflr r0
ffc3f624: 7c 64 1b 78 mr r4,r3
ffc3f628: 3c 60 00 00 lis r3,0
ffc3f62c: 90 01 00 24 stw r0,36(r1)
ffc3f630: 38 63 6f 3c addi r3,r3,28476
ffc3f634: 38 a1 00 08 addi r5,r1,8
ffc3f638: 93 e1 00 1c stw r31,28(r1)
ffc3f63c: 4b fc bc 59 bl ffc0b294 <_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 ) {
ffc3f640: 81 21 00 08 lwz r9,8(r1)
ffc3f644: 2f 89 00 00 cmpwi cr7,r9,0
ffc3f648: 40 9e 00 4c bne- cr7,ffc3f694 <_Rate_monotonic_Timeout+0x78><== NEVER TAKEN
ffc3f64c: 7c 7f 1b 78 mr r31,r3
case OBJECTS_LOCAL:
the_thread = the_period->owner;
ffc3f650: 80 63 00 40 lwz r3,64(r3)
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_PERIOD);
ffc3f654: 81 23 00 10 lwz r9,16(r3)
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
ffc3f658: 71 2a 40 00 andi. r10,r9,16384
ffc3f65c: 41 82 00 14 beq- ffc3f670 <_Rate_monotonic_Timeout+0x54>
ffc3f660: 81 43 00 20 lwz r10,32(r3)
ffc3f664: 81 3f 00 08 lwz r9,8(r31)
ffc3f668: 7f 8a 48 00 cmpw cr7,r10,r9
ffc3f66c: 41 9e 00 68 beq- cr7,ffc3f6d4 <_Rate_monotonic_Timeout+0xb8>
_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 ) {
ffc3f670: 81 3f 00 38 lwz r9,56(r31)
ffc3f674: 2f 89 00 01 cmpwi cr7,r9,1
ffc3f678: 41 9e 00 30 beq- cr7,ffc3f6a8 <_Rate_monotonic_Timeout+0x8c>
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
ffc3f67c: 39 20 00 04 li r9,4
ffc3f680: 91 3f 00 38 stw r9,56(r31)
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc3f684: 3d 20 00 00 lis r9,0
ffc3f688: 81 49 34 e4 lwz r10,13540(r9)
--level;
ffc3f68c: 39 4a ff ff addi r10,r10,-1
_Thread_Dispatch_disable_level = level;
ffc3f690: 91 49 34 e4 stw r10,13540(r9)
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
ffc3f694: 80 01 00 24 lwz r0,36(r1)
ffc3f698: 83 e1 00 1c lwz r31,28(r1)
ffc3f69c: 7c 08 03 a6 mtlr r0
ffc3f6a0: 38 21 00 20 addi r1,r1,32
ffc3f6a4: 4e 80 00 20 blr
_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;
ffc3f6a8: 39 20 00 03 li r9,3
ffc3f6ac: 91 3f 00 38 stw r9,56(r31)
_Rate_monotonic_Initiate_statistics( the_period );
ffc3f6b0: 7f e3 fb 78 mr r3,r31
ffc3f6b4: 4b ff fc 5d bl ffc3f310 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc3f6b8: 81 3f 00 3c lwz r9,60(r31)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc3f6bc: 3c 60 00 00 lis r3,0
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc3f6c0: 91 3f 00 1c stw r9,28(r31)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc3f6c4: 38 63 65 28 addi r3,r3,25896
ffc3f6c8: 38 9f 00 10 addi r4,r31,16
ffc3f6cc: 4b fc db bd bl ffc0d288 <_Watchdog_Insert>
ffc3f6d0: 4b ff ff b4 b ffc3f684 <_Rate_monotonic_Timeout+0x68>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
ffc3f6d4: 3c 80 10 07 lis r4,4103
ffc3f6d8: 60 84 ff f8 ori r4,r4,65528
ffc3f6dc: 4b fc c7 09 bl ffc0bde4 <_Thread_Clear_state>
ffc3f6e0: 4b ff ff d0 b ffc3f6b0 <_Rate_monotonic_Timeout+0x94>
ffc3f1c0 <_Rate_monotonic_Update_statistics>:
}
static void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
ffc3f1c0: 94 21 ff e0 stwu r1,-32(r1)
ffc3f1c4: 7c 08 02 a6 mflr r0
ffc3f1c8: 90 01 00 24 stw r0,36(r1)
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
ffc3f1cc: 81 43 00 38 lwz r10,56(r3)
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
ffc3f1d0: 81 23 00 58 lwz r9,88(r3)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
ffc3f1d4: 2f 8a 00 04 cmpwi cr7,r10,4
}
static void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
ffc3f1d8: 93 e1 00 1c stw r31,28(r1)
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
ffc3f1dc: 39 29 00 01 addi r9,r9,1
}
static void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
ffc3f1e0: 7c 7f 1b 78 mr r31,r3
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
ffc3f1e4: 91 23 00 58 stw r9,88(r3)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
ffc3f1e8: 41 9e 00 cc beq- cr7,ffc3f2b4 <_Rate_monotonic_Update_statistics+0xf4>
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
ffc3f1ec: 7f e3 fb 78 mr r3,r31
ffc3f1f0: 38 81 00 08 addi r4,r1,8
ffc3f1f4: 38 a1 00 10 addi r5,r1,16
ffc3f1f8: 4b ff fe bd bl ffc3f0b4 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
ffc3f1fc: 2f 83 00 00 cmpwi cr7,r3,0
ffc3f200: 41 9e 00 8c beq- cr7,ffc3f28c <_Rate_monotonic_Update_statistics+0xcc>
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
ffc3f204: 81 41 00 10 lwz r10,16(r1)
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
ffc3f208: 80 ff 00 60 lwz r7,96(r31)
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
ffc3f20c: 81 1f 00 70 lwz r8,112(r31)
ffc3f210: 7f 87 50 00 cmpw cr7,r7,r10
ffc3f214: 81 3f 00 74 lwz r9,116(r31)
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
ffc3f218: 81 61 00 14 lwz r11,20(r1)
ffc3f21c: 7d 29 58 14 addc r9,r9,r11
ffc3f220: 7d 08 51 14 adde r8,r8,r10
ffc3f224: 91 1f 00 70 stw r8,112(r31)
ffc3f228: 91 3f 00 74 stw r9,116(r31)
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
ffc3f22c: 40 9d 00 74 ble- cr7,ffc3f2a0 <_Rate_monotonic_Update_statistics+0xe0>
stats->min_cpu_time = executed;
ffc3f230: 91 5f 00 60 stw r10,96(r31)
ffc3f234: 91 7f 00 64 stw r11,100(r31)
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
ffc3f238: 81 3f 00 68 lwz r9,104(r31)
ffc3f23c: 7f 89 50 00 cmpw cr7,r9,r10
ffc3f240: 41 9c 00 c4 blt- cr7,ffc3f304 <_Rate_monotonic_Update_statistics+0x144><== NEVER TAKEN
ffc3f244: 41 9e 00 b4 beq- cr7,ffc3f2f8 <_Rate_monotonic_Update_statistics+0x138><== ALWAYS TAKEN
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
ffc3f248: 81 41 00 08 lwz r10,8(r1)
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
ffc3f24c: 80 ff 00 78 lwz r7,120(r31)
ffc3f250: 81 1f 00 88 lwz r8,136(r31)
ffc3f254: 7f 87 50 00 cmpw cr7,r7,r10
ffc3f258: 81 3f 00 8c lwz r9,140(r31)
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
ffc3f25c: 81 61 00 0c lwz r11,12(r1)
ffc3f260: 7d 29 58 14 addc r9,r9,r11
ffc3f264: 7d 08 51 14 adde r8,r8,r10
ffc3f268: 91 1f 00 88 stw r8,136(r31)
ffc3f26c: 91 3f 00 8c stw r9,140(r31)
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
ffc3f270: 41 9d 00 60 bgt- cr7,ffc3f2d0 <_Rate_monotonic_Update_statistics+0x110>
ffc3f274: 41 9e 00 50 beq- cr7,ffc3f2c4 <_Rate_monotonic_Update_statistics+0x104><== ALWAYS TAKEN
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
ffc3f278: 81 3f 00 80 lwz r9,128(r31)
ffc3f27c: 7f 89 50 00 cmpw cr7,r9,r10
ffc3f280: 40 9c 00 64 bge- cr7,ffc3f2e4 <_Rate_monotonic_Update_statistics+0x124><== ALWAYS TAKEN
stats->max_wall_time = since_last_period;
ffc3f284: 91 5f 00 80 stw r10,128(r31)
ffc3f288: 91 7f 00 84 stw r11,132(r31)
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
ffc3f28c: 80 01 00 24 lwz r0,36(r1)
ffc3f290: 83 e1 00 1c lwz r31,28(r1)
ffc3f294: 7c 08 03 a6 mtlr r0
ffc3f298: 38 21 00 20 addi r1,r1,32
ffc3f29c: 4e 80 00 20 blr
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
ffc3f2a0: 40 be ff 98 bne- cr7,ffc3f238 <_Rate_monotonic_Update_statistics+0x78><== NEVER TAKEN
ffc3f2a4: 81 3f 00 64 lwz r9,100(r31)
ffc3f2a8: 7f 89 58 40 cmplw cr7,r9,r11
ffc3f2ac: 40 bd ff 8c ble- cr7,ffc3f238 <_Rate_monotonic_Update_statistics+0x78>
ffc3f2b0: 4b ff ff 80 b ffc3f230 <_Rate_monotonic_Update_statistics+0x70>
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
stats->missed_count++;
ffc3f2b4: 81 23 00 5c lwz r9,92(r3)
ffc3f2b8: 39 29 00 01 addi r9,r9,1
ffc3f2bc: 91 23 00 5c stw r9,92(r3)
ffc3f2c0: 4b ff ff 2c b ffc3f1ec <_Rate_monotonic_Update_statistics+0x2c>
* Update Wall time
*/
#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 ) )
ffc3f2c4: 81 3f 00 7c lwz r9,124(r31)
ffc3f2c8: 7f 89 58 40 cmplw cr7,r9,r11
ffc3f2cc: 40 bd ff ac ble- cr7,ffc3f278 <_Rate_monotonic_Update_statistics+0xb8>
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
ffc3f2d0: 81 3f 00 80 lwz r9,128(r31)
*/
#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;
ffc3f2d4: 91 5f 00 78 stw r10,120(r31)
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
ffc3f2d8: 7f 89 50 00 cmpw cr7,r9,r10
*/
#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;
ffc3f2dc: 91 7f 00 7c stw r11,124(r31)
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
ffc3f2e0: 41 9c ff a4 blt+ cr7,ffc3f284 <_Rate_monotonic_Update_statistics+0xc4><== NEVER TAKEN
ffc3f2e4: 40 be ff a8 bne- cr7,ffc3f28c <_Rate_monotonic_Update_statistics+0xcc>
ffc3f2e8: 81 3f 00 84 lwz r9,132(r31)
ffc3f2ec: 7f 89 58 40 cmplw cr7,r9,r11
ffc3f2f0: 41 9c ff 94 blt+ cr7,ffc3f284 <_Rate_monotonic_Update_statistics+0xc4>
ffc3f2f4: 4b ff ff 98 b ffc3f28c <_Rate_monotonic_Update_statistics+0xcc>
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
stats->min_cpu_time = executed;
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
ffc3f2f8: 81 3f 00 6c lwz r9,108(r31)
ffc3f2fc: 7f 89 58 40 cmplw cr7,r9,r11
ffc3f300: 40 bc ff 48 bge- cr7,ffc3f248 <_Rate_monotonic_Update_statistics+0x88>
stats->max_cpu_time = executed;
ffc3f304: 91 5f 00 68 stw r10,104(r31)
ffc3f308: 91 7f 00 6c stw r11,108(r31)
ffc3f30c: 4b ff ff 3c b ffc3f248 <_Rate_monotonic_Update_statistics+0x88>
ffc0c974 <_Scheduler_CBS_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_CBS_Allocate(
Thread_Control *the_thread
)
{
ffc0c974: 94 21 ff f0 stwu r1,-16(r1)
ffc0c978: 7c 08 02 a6 mflr r0
ffc0c97c: 93 e1 00 0c stw r31,12(r1)
ffc0c980: 7c 7f 1b 78 mr r31,r3
void *sched;
Scheduler_CBS_Per_thread *schinfo;
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
ffc0c984: 38 60 00 1c li r3,28
#include <rtems/score/wkspace.h>
void *_Scheduler_CBS_Allocate(
Thread_Control *the_thread
)
{
ffc0c988: 90 01 00 14 stw r0,20(r1)
void *sched;
Scheduler_CBS_Per_thread *schinfo;
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
ffc0c98c: 48 00 22 55 bl ffc0ebe0 <_Workspace_Allocate>
if ( sched ) {
ffc0c990: 2c 03 00 00 cmpwi r3,0
ffc0c994: 41 82 00 1c beq- ffc0c9b0 <_Scheduler_CBS_Allocate+0x3c><== NEVER TAKEN
the_thread->scheduler_info = sched;
schinfo = (Scheduler_CBS_Per_thread *)(the_thread->scheduler_info);
schinfo->edf_per_thread.thread = the_thread;
schinfo->edf_per_thread.queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
ffc0c998: 39 40 00 02 li r10,2
void *sched;
Scheduler_CBS_Per_thread *schinfo;
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
if ( sched ) {
the_thread->scheduler_info = sched;
ffc0c99c: 90 7f 00 88 stw r3,136(r31)
schinfo = (Scheduler_CBS_Per_thread *)(the_thread->scheduler_info);
schinfo->edf_per_thread.thread = the_thread;
schinfo->edf_per_thread.queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
ffc0c9a0: 91 43 00 14 stw r10,20(r3)
schinfo->cbs_server = NULL;
ffc0c9a4: 39 40 00 00 li r10,0
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
if ( sched ) {
the_thread->scheduler_info = sched;
schinfo = (Scheduler_CBS_Per_thread *)(the_thread->scheduler_info);
schinfo->edf_per_thread.thread = the_thread;
ffc0c9a8: 93 e3 00 00 stw r31,0(r3)
schinfo->edf_per_thread.queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
schinfo->cbs_server = NULL;
ffc0c9ac: 91 43 00 18 stw r10,24(r3)
}
return sched;
}
ffc0c9b0: 80 01 00 14 lwz r0,20(r1)
ffc0c9b4: 83 e1 00 0c lwz r31,12(r1)
ffc0c9b8: 7c 08 03 a6 mtlr r0
ffc0c9bc: 38 21 00 10 addi r1,r1,16
ffc0c9c0: 4e 80 00 20 blr
ffc0e3dc <_Scheduler_CBS_Budget_callout>:
Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
void _Scheduler_CBS_Budget_callout(
Thread_Control *the_thread
)
{
ffc0e3dc: 94 21 ff e0 stwu r1,-32(r1)
ffc0e3e0: 7c 08 02 a6 mflr r0
ffc0e3e4: 90 01 00 24 stw r0,36(r1)
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info;
Scheduler_CBS_Server_id server_id;
/* Put violating task to background until the end of period. */
new_priority = the_thread->Start.initial_priority;
ffc0e3e8: 80 83 00 ac lwz r4,172(r3)
if ( the_thread->real_priority != new_priority )
ffc0e3ec: 81 23 00 18 lwz r9,24(r3)
Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
void _Scheduler_CBS_Budget_callout(
Thread_Control *the_thread
)
{
ffc0e3f0: 93 e1 00 1c stw r31,28(r1)
ffc0e3f4: 7c 7f 1b 78 mr r31,r3
Scheduler_CBS_Per_thread *sched_info;
Scheduler_CBS_Server_id server_id;
/* Put violating task to background until the end of period. */
new_priority = the_thread->Start.initial_priority;
if ( the_thread->real_priority != new_priority )
ffc0e3f8: 7f 89 20 00 cmpw cr7,r9,r4
ffc0e3fc: 41 9e 00 08 beq- cr7,ffc0e404 <_Scheduler_CBS_Budget_callout+0x28><== NEVER TAKEN
the_thread->real_priority = new_priority;
ffc0e400: 90 83 00 18 stw r4,24(r3)
if ( the_thread->current_priority != new_priority )
ffc0e404: 81 3f 00 14 lwz r9,20(r31)
ffc0e408: 7f 89 20 00 cmpw cr7,r9,r4
ffc0e40c: 41 9e 00 10 beq- cr7,ffc0e41c <_Scheduler_CBS_Budget_callout+0x40><== NEVER TAKEN
_Thread_Change_priority(the_thread, new_priority, true);
ffc0e410: 7f e3 fb 78 mr r3,r31
ffc0e414: 38 a0 00 01 li r5,1
ffc0e418: 48 00 07 05 bl ffc0eb1c <_Thread_Change_priority>
/* Invoke callback function if any. */
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
ffc0e41c: 83 ff 00 88 lwz r31,136(r31)
if ( sched_info->cbs_server->cbs_budget_overrun ) {
ffc0e420: 81 3f 00 18 lwz r9,24(r31)
ffc0e424: 81 49 00 0c lwz r10,12(r9)
ffc0e428: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0e42c: 41 9e 00 24 beq- cr7,ffc0e450 <_Scheduler_CBS_Budget_callout+0x74><== NEVER TAKEN
_Scheduler_CBS_Get_server_id(
ffc0e430: 80 69 00 00 lwz r3,0(r9)
ffc0e434: 38 81 00 08 addi r4,r1,8
ffc0e438: 4b ff ff 4d bl ffc0e384 <_Scheduler_CBS_Get_server_id>
sched_info->cbs_server->task_id,
&server_id
);
sched_info->cbs_server->cbs_budget_overrun( server_id );
ffc0e43c: 81 3f 00 18 lwz r9,24(r31)
ffc0e440: 80 61 00 08 lwz r3,8(r1)
ffc0e444: 81 29 00 0c lwz r9,12(r9)
ffc0e448: 7d 29 03 a6 mtctr r9
ffc0e44c: 4e 80 04 21 bctrl
}
}
ffc0e450: 80 01 00 24 lwz r0,36(r1)
ffc0e454: 83 e1 00 1c lwz r31,28(r1)
ffc0e458: 7c 08 03 a6 mtlr r0
ffc0e45c: 38 21 00 20 addi r1,r1,32
ffc0e460: 4e 80 00 20 blr
ffc0dd98 <_Scheduler_CBS_Cleanup>:
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Cleanup (void)
{
ffc0dd98: 94 21 ff e8 stwu r1,-24(r1)
ffc0dd9c: 7c 08 02 a6 mflr r0
ffc0dda0: 93 c1 00 10 stw r30,16(r1)
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0dda4: 3f c0 00 00 lis r30,0
ffc0dda8: 81 3e 27 d4 lwz r9,10196(r30)
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Cleanup (void)
{
ffc0ddac: 90 01 00 1c stw r0,28(r1)
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0ddb0: 2f 89 00 00 cmpwi cr7,r9,0
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Cleanup (void)
{
ffc0ddb4: 93 a1 00 0c stw r29,12(r1)
ffc0ddb8: 93 e1 00 14 stw r31,20(r1)
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0ddbc: 41 9e 00 68 beq- cr7,ffc0de24 <_Scheduler_CBS_Cleanup+0x8c><== NEVER TAKEN
ffc0ddc0: 3f a0 00 00 lis r29,0
ffc0ddc4: 81 5d 28 f4 lwz r10,10484(r29)
ffc0ddc8: 3b e0 00 00 li r31,0
ffc0ddcc: 3b de 27 d4 addi r30,r30,10196
if ( _Scheduler_CBS_Server_list[ i ] )
ffc0ddd0: 57 e9 10 3a rlwinm r9,r31,2,0,29
ffc0ddd4: 7d 2a 48 2e lwzx r9,r10,r9
_Scheduler_CBS_Destroy_server( i );
ffc0ddd8: 7f e3 fb 78 mr r3,r31
int _Scheduler_CBS_Cleanup (void)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0dddc: 3b ff 00 01 addi r31,r31,1
if ( _Scheduler_CBS_Server_list[ i ] )
ffc0dde0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0dde4: 41 9e 00 0c beq- cr7,ffc0ddf0 <_Scheduler_CBS_Cleanup+0x58>
_Scheduler_CBS_Destroy_server( i );
ffc0dde8: 48 00 01 95 bl ffc0df7c <_Scheduler_CBS_Destroy_server>
ffc0ddec: 81 5d 28 f4 lwz r10,10484(r29)
int _Scheduler_CBS_Cleanup (void)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0ddf0: 81 3e 00 00 lwz r9,0(r30)
ffc0ddf4: 7f 89 f8 40 cmplw cr7,r9,r31
ffc0ddf8: 41 9d ff d8 bgt+ cr7,ffc0ddd0 <_Scheduler_CBS_Cleanup+0x38>
if ( _Scheduler_CBS_Server_list[ i ] )
_Scheduler_CBS_Destroy_server( i );
}
_Workspace_Free( _Scheduler_CBS_Server_list );
ffc0ddfc: 7d 43 53 78 mr r3,r10
ffc0de00: 48 00 28 6d bl ffc1066c <_Workspace_Free>
return SCHEDULER_CBS_OK;
}
ffc0de04: 80 01 00 1c lwz r0,28(r1)
ffc0de08: 83 a1 00 0c lwz r29,12(r1)
ffc0de0c: 38 60 00 00 li r3,0
ffc0de10: 7c 08 03 a6 mtlr r0
ffc0de14: 83 c1 00 10 lwz r30,16(r1)
ffc0de18: 83 e1 00 14 lwz r31,20(r1)
ffc0de1c: 38 21 00 18 addi r1,r1,24
ffc0de20: 4e 80 00 20 blr
ffc0de24: 3d 20 00 00 lis r9,0 <== NOT EXECUTED
ffc0de28: 81 49 28 f4 lwz r10,10484(r9) <== NOT EXECUTED
ffc0de2c: 4b ff ff d0 b ffc0ddfc <_Scheduler_CBS_Cleanup+0x64> <== NOT EXECUTED
ffc0de30 <_Scheduler_CBS_Create_server>:
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
ffc0de30: 94 21 ff e0 stwu r1,-32(r1)
ffc0de34: 7c 08 02 a6 mflr r0
ffc0de38: 90 01 00 24 stw r0,36(r1)
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
ffc0de3c: 81 23 00 04 lwz r9,4(r3)
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
ffc0de40: 93 e1 00 1c stw r31,28(r1)
ffc0de44: 7c 7f 1b 78 mr r31,r3
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
ffc0de48: 2f 89 00 00 cmpwi cr7,r9,0
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
ffc0de4c: 93 41 00 08 stw r26,8(r1)
ffc0de50: 93 61 00 0c stw r27,12(r1)
ffc0de54: 93 81 00 10 stw r28,16(r1)
ffc0de58: 93 a1 00 14 stw r29,20(r1)
ffc0de5c: 93 c1 00 18 stw r30,24(r1)
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
ffc0de60: 40 9d 01 0c ble- cr7,ffc0df6c <_Scheduler_CBS_Create_server+0x13c>
ffc0de64: 81 23 00 00 lwz r9,0(r3)
ffc0de68: 2f 89 00 00 cmpwi cr7,r9,0
ffc0de6c: 40 9d 01 00 ble- cr7,ffc0df6c <_Scheduler_CBS_Create_server+0x13c>
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0de70: 3d 20 00 00 lis r9,0
ffc0de74: 81 09 27 d4 lwz r8,10196(r9)
ffc0de78: 2f 88 00 00 cmpwi cr7,r8,0
ffc0de7c: 41 9e 00 44 beq- cr7,ffc0dec0 <_Scheduler_CBS_Create_server+0x90><== NEVER TAKEN
if ( !_Scheduler_CBS_Server_list[i] )
ffc0de80: 3f 80 00 00 lis r28,0
ffc0de84: 83 dc 28 f4 lwz r30,10484(r28)
ffc0de88: 7c 9b 23 78 mr r27,r4
ffc0de8c: 7c bd 2b 78 mr r29,r5
ffc0de90: 81 3e 00 00 lwz r9,0(r30)
ffc0de94: 2f 89 00 00 cmpwi cr7,r9,0
ffc0de98: 41 9e 00 c8 beq- cr7,ffc0df60 <_Scheduler_CBS_Create_server+0x130>
ffc0de9c: 7f ca f3 78 mr r10,r30
ffc0dea0: 7d 09 03 a6 mtctr r8
ffc0dea4: 39 20 00 00 li r9,0
ffc0dea8: 48 00 00 10 b ffc0deb8 <_Scheduler_CBS_Create_server+0x88>
ffc0deac: 85 0a 00 04 lwzu r8,4(r10)
ffc0deb0: 2f 88 00 00 cmpwi cr7,r8,0
ffc0deb4: 41 9e 00 38 beq- cr7,ffc0deec <_Scheduler_CBS_Create_server+0xbc>
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0deb8: 39 29 00 01 addi r9,r9,1
ffc0debc: 42 00 ff f0 bdnz+ ffc0deac <_Scheduler_CBS_Create_server+0x7c>
if ( !_Scheduler_CBS_Server_list[i] )
break;
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
ffc0dec0: 38 60 ff e6 li r3,-26
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
ffc0dec4: 80 01 00 24 lwz r0,36(r1)
ffc0dec8: 83 41 00 08 lwz r26,8(r1)
ffc0decc: 7c 08 03 a6 mtlr r0
ffc0ded0: 83 61 00 0c lwz r27,12(r1)
ffc0ded4: 83 81 00 10 lwz r28,16(r1)
ffc0ded8: 83 a1 00 14 lwz r29,20(r1)
ffc0dedc: 83 c1 00 18 lwz r30,24(r1)
ffc0dee0: 83 e1 00 1c lwz r31,28(r1)
ffc0dee4: 38 21 00 20 addi r1,r1,32
ffc0dee8: 4e 80 00 20 blr
ffc0deec: 55 3a 10 3a rlwinm r26,r9,2,0,29
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
ffc0def0: 91 3d 00 00 stw r9,0(r29)
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
ffc0def4: 38 60 00 10 li r3,16
ffc0def8: 48 00 27 5d bl ffc10654 <_Workspace_Allocate>
the_server = _Scheduler_CBS_Server_list[*server_id];
ffc0defc: 81 3d 00 00 lwz r9,0(r29)
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
ffc0df00: 7c 7e d1 2e stwx r3,r30,r26
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
ffc0df04: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0df08: 81 5c 28 f4 lwz r10,10484(r28)
ffc0df0c: 7d 2a 48 2e lwzx r9,r10,r9
if ( !the_server )
ffc0df10: 2f 89 00 00 cmpwi cr7,r9,0
ffc0df14: 41 9e 00 60 beq- cr7,ffc0df74 <_Scheduler_CBS_Create_server+0x144><== NEVER TAKEN
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
ffc0df18: 80 01 00 24 lwz r0,36(r1)
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
ffc0df1c: 38 60 00 00 li r3,0
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
ffc0df20: 81 5f 00 00 lwz r10,0(r31)
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
ffc0df24: 7c 08 03 a6 mtlr r0
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
ffc0df28: 81 7f 00 04 lwz r11,4(r31)
ffc0df2c: 91 49 00 04 stw r10,4(r9)
the_server->task_id = -1;
ffc0df30: 39 40 ff ff li r10,-1
the_server->cbs_budget_overrun = budget_overrun_callback;
ffc0df34: 93 69 00 0c stw r27,12(r9)
return SCHEDULER_CBS_OK;
}
ffc0df38: 83 41 00 08 lwz r26,8(r1)
ffc0df3c: 83 61 00 0c lwz r27,12(r1)
ffc0df40: 83 81 00 10 lwz r28,16(r1)
ffc0df44: 83 a1 00 14 lwz r29,20(r1)
ffc0df48: 83 c1 00 18 lwz r30,24(r1)
ffc0df4c: 83 e1 00 1c lwz r31,28(r1)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
ffc0df50: 91 69 00 08 stw r11,8(r9)
the_server->task_id = -1;
ffc0df54: 91 49 00 00 stw r10,0(r9)
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
ffc0df58: 38 21 00 20 addi r1,r1,32
ffc0df5c: 4e 80 00 20 blr
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( !_Scheduler_CBS_Server_list[i] )
ffc0df60: 3b 40 00 00 li r26,0
ffc0df64: 39 20 00 00 li r9,0
ffc0df68: 4b ff ff 88 b ffc0def0 <_Scheduler_CBS_Create_server+0xc0>
if ( params->budget <= 0 ||
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
ffc0df6c: 38 60 ff ee li r3,-18
ffc0df70: 4b ff ff 54 b ffc0dec4 <_Scheduler_CBS_Create_server+0x94>
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
ffc0df74: 38 60 ff ef li r3,-17 <== NOT EXECUTED
ffc0df78: 4b ff ff 4c b ffc0dec4 <_Scheduler_CBS_Create_server+0x94><== NOT EXECUTED
ffc0e020 <_Scheduler_CBS_Detach_thread>:
int _Scheduler_CBS_Detach_thread (
Scheduler_CBS_Server_id server_id,
rtems_id task_id
)
{
ffc0e020: 94 21 ff d8 stwu r1,-40(r1)
ffc0e024: 7c 08 02 a6 mflr r0
ffc0e028: 93 c1 00 20 stw r30,32(r1)
ffc0e02c: 7c 9e 23 78 mr r30,r4
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
ffc0e030: 38 81 00 08 addi r4,r1,8
int _Scheduler_CBS_Detach_thread (
Scheduler_CBS_Server_id server_id,
rtems_id task_id
)
{
ffc0e034: 93 a1 00 1c stw r29,28(r1)
ffc0e038: 7c 7d 1b 78 mr r29,r3
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
ffc0e03c: 7f c3 f3 78 mr r3,r30
int _Scheduler_CBS_Detach_thread (
Scheduler_CBS_Server_id server_id,
rtems_id task_id
)
{
ffc0e040: 93 e1 00 24 stw r31,36(r1)
ffc0e044: 90 01 00 2c stw r0,44(r1)
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
ffc0e048: 48 00 11 7d bl ffc0f1c4 <_Thread_Get>
/* The routine _Thread_Get may disable dispatch and not enable again. */
if ( the_thread ) {
ffc0e04c: 7c 7f 1b 79 mr. r31,r3
ffc0e050: 41 82 00 88 beq- ffc0e0d8 <_Scheduler_CBS_Detach_thread+0xb8>
_Thread_Enable_dispatch();
ffc0e054: 48 00 11 55 bl ffc0f1a8 <_Thread_Enable_dispatch>
}
if ( server_id >= _Scheduler_CBS_Maximum_servers )
ffc0e058: 3d 20 00 00 lis r9,0
ffc0e05c: 81 29 27 d4 lwz r9,10196(r9)
ffc0e060: 7f 9d 48 40 cmplw cr7,r29,r9
ffc0e064: 40 9c 00 74 bge- cr7,ffc0e0d8 <_Scheduler_CBS_Detach_thread+0xb8>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !the_thread )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
/* Server is not valid. */
if ( !_Scheduler_CBS_Server_list[server_id] )
ffc0e068: 3d 20 00 00 lis r9,0
ffc0e06c: 81 29 28 f4 lwz r9,10484(r9)
ffc0e070: 57 bd 10 3a rlwinm r29,r29,2,0,29
ffc0e074: 7d 29 e8 2e lwzx r9,r9,r29
ffc0e078: 2f 89 00 00 cmpwi cr7,r9,0
ffc0e07c: 41 9e 00 7c beq- cr7,ffc0e0f8 <_Scheduler_CBS_Detach_thread+0xd8>
return SCHEDULER_CBS_ERROR_NOSERVER;
/* Thread and server are not attached. */
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
ffc0e080: 81 49 00 00 lwz r10,0(r9)
ffc0e084: 7f 8a f0 00 cmpw cr7,r10,r30
ffc0e088: 40 9e 00 50 bne- cr7,ffc0e0d8 <_Scheduler_CBS_Detach_thread+0xb8><== NEVER TAKEN
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
ffc0e08c: 80 df 00 a0 lwz r6,160(r31)
return SCHEDULER_CBS_ERROR_NOSERVER;
/* Thread and server are not attached. */
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
ffc0e090: 38 a0 ff ff li r5,-1
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
ffc0e094: 80 ff 00 a4 lwz r7,164(r31)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
return SCHEDULER_CBS_OK;
ffc0e098: 38 60 00 00 li r3,0
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
ffc0e09c: 89 1f 00 9c lbz r8,156(r31)
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
ffc0e0a0: 81 5f 00 88 lwz r10,136(r31)
return SCHEDULER_CBS_ERROR_NOSERVER;
/* Thread and server are not attached. */
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
ffc0e0a4: 90 a9 00 00 stw r5,0(r9)
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
ffc0e0a8: 39 20 00 00 li r9,0
ffc0e0ac: 91 2a 00 18 stw r9,24(r10)
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
ffc0e0b0: 90 df 00 78 stw r6,120(r31)
the_thread->budget_callout = the_thread->Start.budget_callout;
ffc0e0b4: 90 ff 00 7c stw r7,124(r31)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
ffc0e0b8: 99 1f 00 70 stb r8,112(r31)
return SCHEDULER_CBS_OK;
}
ffc0e0bc: 80 01 00 2c lwz r0,44(r1)
ffc0e0c0: 83 a1 00 1c lwz r29,28(r1)
ffc0e0c4: 7c 08 03 a6 mtlr r0
ffc0e0c8: 83 c1 00 20 lwz r30,32(r1)
ffc0e0cc: 83 e1 00 24 lwz r31,36(r1)
ffc0e0d0: 38 21 00 28 addi r1,r1,40
ffc0e0d4: 4e 80 00 20 blr
ffc0e0d8: 80 01 00 2c lwz r0,44(r1)
if ( the_thread ) {
_Thread_Enable_dispatch();
}
if ( server_id >= _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
ffc0e0dc: 38 60 ff ee li r3,-18
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
return SCHEDULER_CBS_OK;
}
ffc0e0e0: 83 a1 00 1c lwz r29,28(r1)
ffc0e0e4: 7c 08 03 a6 mtlr r0
ffc0e0e8: 83 c1 00 20 lwz r30,32(r1)
ffc0e0ec: 83 e1 00 24 lwz r31,36(r1)
ffc0e0f0: 38 21 00 28 addi r1,r1,40
ffc0e0f4: 4e 80 00 20 blr
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !the_thread )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
/* Server is not valid. */
if ( !_Scheduler_CBS_Server_list[server_id] )
return SCHEDULER_CBS_ERROR_NOSERVER;
ffc0e0f8: 38 60 ff e7 li r3,-25
ffc0e0fc: 4b ff ff c0 b ffc0e0bc <_Scheduler_CBS_Detach_thread+0x9c>
ffc0e384 <_Scheduler_CBS_Get_server_id>:
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0e384: 3d 20 00 00 lis r9,0
ffc0e388: 81 29 27 d4 lwz r9,10196(r9)
ffc0e38c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0e390: 41 9e 00 38 beq- cr7,ffc0e3c8 <_Scheduler_CBS_Get_server_id+0x44><== NEVER TAKEN
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Get_server_id (
ffc0e394: 3d 40 00 00 lis r10,0
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0e398: 7d 29 03 a6 mtctr r9
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Get_server_id (
ffc0e39c: 81 4a 28 f4 lwz r10,10484(r10)
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0e3a0: 39 00 00 00 li r8,0
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulercbs.h>
int _Scheduler_CBS_Get_server_id (
ffc0e3a4: 39 4a ff fc addi r10,r10,-4
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( _Scheduler_CBS_Server_list[i] &&
ffc0e3a8: 85 2a 00 04 lwzu r9,4(r10)
ffc0e3ac: 2f 89 00 00 cmpwi cr7,r9,0
ffc0e3b0: 41 9e 00 10 beq- cr7,ffc0e3c0 <_Scheduler_CBS_Get_server_id+0x3c>
ffc0e3b4: 81 29 00 00 lwz r9,0(r9)
ffc0e3b8: 7f 89 18 00 cmpw cr7,r9,r3
ffc0e3bc: 41 9e 00 14 beq- cr7,ffc0e3d0 <_Scheduler_CBS_Get_server_id+0x4c>
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
ffc0e3c0: 39 08 00 01 addi r8,r8,1
ffc0e3c4: 42 00 ff e4 bdnz+ ffc0e3a8 <_Scheduler_CBS_Get_server_id+0x24>
_Scheduler_CBS_Server_list[i]->task_id == task_id ) {
*server_id = i;
return SCHEDULER_CBS_OK;
}
}
return SCHEDULER_CBS_ERROR_NOSERVER;
ffc0e3c8: 38 60 ff e7 li r3,-25
}
ffc0e3cc: 4e 80 00 20 blr
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
if ( _Scheduler_CBS_Server_list[i] &&
_Scheduler_CBS_Server_list[i]->task_id == task_id ) {
*server_id = i;
ffc0e3d0: 91 04 00 00 stw r8,0(r4)
return SCHEDULER_CBS_OK;
ffc0e3d4: 38 60 00 00 li r3,0
ffc0e3d8: 4e 80 00 20 blr
ffc0e464 <_Scheduler_CBS_Initialize>:
int _Scheduler_CBS_Initialize(void)
{
ffc0e464: 94 21 ff f0 stwu r1,-16(r1)
ffc0e468: 7c 08 02 a6 mflr r0
ffc0e46c: 93 e1 00 0c stw r31,12(r1)
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
ffc0e470: 3f e0 00 00 lis r31,0
ffc0e474: 80 7f 27 d4 lwz r3,10196(r31)
sched_info->cbs_server->cbs_budget_overrun( server_id );
}
}
int _Scheduler_CBS_Initialize(void)
{
ffc0e478: 90 01 00 14 stw r0,20(r1)
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
ffc0e47c: 54 63 10 3a rlwinm r3,r3,2,0,29
ffc0e480: 48 00 21 d5 bl ffc10654 <_Workspace_Allocate>
ffc0e484: 3d 00 00 00 lis r8,0
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
ffc0e488: 2f 83 00 00 cmpwi cr7,r3,0
}
int _Scheduler_CBS_Initialize(void)
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
ffc0e48c: 90 68 28 f4 stw r3,10484(r8)
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
ffc0e490: 41 9e 00 4c beq- cr7,ffc0e4dc <_Scheduler_CBS_Initialize+0x78><== NEVER TAKEN
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
ffc0e494: 81 5f 27 d4 lwz r10,10196(r31)
ffc0e498: 39 20 00 00 li r9,0
_Scheduler_CBS_Server_list[i] = NULL;
ffc0e49c: 38 e0 00 00 li r7,0
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
ffc0e4a0: 2f 8a 00 00 cmpwi cr7,r10,0
_Scheduler_CBS_Server_list[i] = NULL;
ffc0e4a4: 7d 49 03 a6 mtctr r10
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
ffc0e4a8: 40 be 00 0c bne+ cr7,ffc0e4b4 <_Scheduler_CBS_Initialize+0x50><== ALWAYS TAKEN
ffc0e4ac: 48 00 00 18 b ffc0e4c4 <_Scheduler_CBS_Initialize+0x60><== NOT EXECUTED
ffc0e4b0: 80 68 28 f4 lwz r3,10484(r8)
_Scheduler_CBS_Server_list[i] = NULL;
ffc0e4b4: 55 2a 10 3a rlwinm r10,r9,2,0,29
ffc0e4b8: 7c e3 51 2e stwx r7,r3,r10
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
ffc0e4bc: 39 29 00 01 addi r9,r9,1
ffc0e4c0: 42 00 ff f0 bdnz+ ffc0e4b0 <_Scheduler_CBS_Initialize+0x4c>
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
ffc0e4c4: 38 60 00 00 li r3,0
}
ffc0e4c8: 80 01 00 14 lwz r0,20(r1)
ffc0e4cc: 83 e1 00 0c lwz r31,12(r1)
ffc0e4d0: 7c 08 03 a6 mtlr r0
ffc0e4d4: 38 21 00 10 addi r1,r1,16
ffc0e4d8: 4e 80 00 20 blr
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
ffc0e4dc: 38 60 ff ef li r3,-17 <== NOT EXECUTED
ffc0e4e0: 4b ff ff e8 b ffc0e4c8 <_Scheduler_CBS_Initialize+0x64><== NOT EXECUTED
ffc0c9c4 <_Scheduler_CBS_Release_job>:
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
(Scheduler_CBS_Server *) sched_info->cbs_server;
if (deadline) {
ffc0c9c4: 2c 04 00 00 cmpwi r4,0
{
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
(Scheduler_CBS_Server *) sched_info->cbs_server;
ffc0c9c8: 81 23 00 88 lwz r9,136(r3)
)
{
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
ffc0c9cc: 81 29 00 18 lwz r9,24(r9)
(Scheduler_CBS_Server *) sched_info->cbs_server;
if (deadline) {
/* Initializing or shifting deadline. */
if (serv_info)
ffc0c9d0: 2f 89 00 00 cmpwi cr7,r9,0
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
(Scheduler_CBS_Server *) sched_info->cbs_server;
if (deadline) {
ffc0c9d4: 41 82 00 30 beq- ffc0ca04 <_Scheduler_CBS_Release_job+0x40>
/* Initializing or shifting deadline. */
if (serv_info)
ffc0c9d8: 41 9e 00 38 beq- cr7,ffc0ca10 <_Scheduler_CBS_Release_job+0x4c>
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
ffc0c9dc: 3d 40 00 00 lis r10,0
ffc0c9e0: 80 8a 28 e8 lwz r4,10472(r10)
ffc0c9e4: 81 49 00 04 lwz r10,4(r9)
ffc0c9e8: 7c 84 52 14 add r4,r4,r10
ffc0c9ec: 54 84 00 7e clrlwi r4,r4,1
new_priority = the_thread->Start.initial_priority;
}
/* Budget replenishment for the next job. */
if (serv_info)
the_thread->cpu_time_budget = serv_info->parameters.budget;
ffc0c9f0: 81 29 00 08 lwz r9,8(r9)
ffc0c9f4: 91 23 00 74 stw r9,116(r3)
the_thread->real_priority = new_priority;
ffc0c9f8: 90 83 00 18 stw r4,24(r3)
_Thread_Change_priority(the_thread, new_priority, true);
ffc0c9fc: 38 a0 00 01 li r5,1
ffc0ca00: 48 00 05 94 b ffc0cf94 <_Thread_Change_priority>
new_priority = (_Watchdog_Ticks_since_boot + deadline)
& ~SCHEDULER_EDF_PRIO_MSB;
}
else {
/* Switch back to background priority. */
new_priority = the_thread->Start.initial_priority;
ffc0ca04: 80 83 00 ac lwz r4,172(r3)
}
/* Budget replenishment for the next job. */
if (serv_info)
ffc0ca08: 40 9e ff e8 bne+ cr7,ffc0c9f0 <_Scheduler_CBS_Release_job+0x2c><== ALWAYS TAKEN
ffc0ca0c: 4b ff ff ec b ffc0c9f8 <_Scheduler_CBS_Release_job+0x34><== NOT EXECUTED
/* Initializing or shifting deadline. */
if (serv_info)
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
& ~SCHEDULER_EDF_PRIO_MSB;
else
new_priority = (_Watchdog_Ticks_since_boot + deadline)
ffc0ca10: 3d 20 00 00 lis r9,0
ffc0ca14: 81 29 28 e8 lwz r9,10472(r9)
ffc0ca18: 7c 84 4a 14 add r4,r4,r9
ffc0ca1c: 54 84 00 7e clrlwi r4,r4,1
ffc0ca20: 4b ff ff d8 b ffc0c9f8 <_Scheduler_CBS_Release_job+0x34>
ffc0ca24 <_Scheduler_CBS_Unblock>:
#include <rtems/score/schedulercbs.h>
void _Scheduler_CBS_Unblock(
Thread_Control *the_thread
)
{
ffc0ca24: 94 21 ff f0 stwu r1,-16(r1)
ffc0ca28: 7c 08 02 a6 mflr r0
ffc0ca2c: 93 e1 00 0c stw r31,12(r1)
ffc0ca30: 7c 7f 1b 78 mr r31,r3
ffc0ca34: 90 01 00 14 stw r0,20(r1)
ffc0ca38: 93 c1 00 08 stw r30,8(r1)
Scheduler_CBS_Per_thread *sched_info;
Scheduler_CBS_Server *serv_info;
Priority_Control new_priority;
_Scheduler_EDF_Enqueue(the_thread);
ffc0ca3c: 48 00 01 6d bl ffc0cba8 <_Scheduler_EDF_Enqueue>
/* TODO: flash critical section? */
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
serv_info = (Scheduler_CBS_Server *) sched_info->cbs_server;
ffc0ca40: 81 3f 00 88 lwz r9,136(r31)
ffc0ca44: 81 29 00 18 lwz r9,24(r9)
* Late unblock rule for deadline-driven tasks. The remaining time to
* deadline must be sufficient to serve the remaining computation time
* without increased utilization of this task. It might cause a deadline
* miss of another task.
*/
if (serv_info) {
ffc0ca48: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ca4c: 41 9e 00 58 beq- cr7,ffc0caa4 <_Scheduler_CBS_Unblock+0x80>
time_t deadline = serv_info->parameters.deadline;
time_t budget = serv_info->parameters.budget;
time_t deadline_left = the_thread->cpu_time_budget;
time_t budget_left = the_thread->real_priority -
ffc0ca50: 3d 00 00 00 lis r8,0
ffc0ca54: 81 5f 00 18 lwz r10,24(r31)
ffc0ca58: 81 08 28 e8 lwz r8,10472(r8)
_Watchdog_Ticks_since_boot;
if ( deadline*budget_left > budget*deadline_left ) {
ffc0ca5c: 80 c9 00 04 lwz r6,4(r9)
ffc0ca60: 80 e9 00 08 lwz r7,8(r9)
*/
if (serv_info) {
time_t deadline = serv_info->parameters.deadline;
time_t budget = serv_info->parameters.budget;
time_t deadline_left = the_thread->cpu_time_budget;
time_t budget_left = the_thread->real_priority -
ffc0ca64: 7d 08 50 50 subf r8,r8,r10
_Watchdog_Ticks_since_boot;
if ( deadline*budget_left > budget*deadline_left ) {
ffc0ca68: 81 3f 00 74 lwz r9,116(r31)
ffc0ca6c: 7d 08 31 d6 mullw r8,r8,r6
ffc0ca70: 7d 27 49 d6 mullw r9,r7,r9
ffc0ca74: 7f 88 48 00 cmpw cr7,r8,r9
ffc0ca78: 40 9d 00 2c ble- cr7,ffc0caa4 <_Scheduler_CBS_Unblock+0x80>
/* Put late unblocked task to background until the end of period. */
new_priority = the_thread->Start.initial_priority;
ffc0ca7c: 80 9f 00 ac lwz r4,172(r31)
if ( the_thread->real_priority != new_priority )
ffc0ca80: 7f 8a 20 00 cmpw cr7,r10,r4
ffc0ca84: 41 9e 00 08 beq- cr7,ffc0ca8c <_Scheduler_CBS_Unblock+0x68>
the_thread->real_priority = new_priority;
ffc0ca88: 90 9f 00 18 stw r4,24(r31)
if ( the_thread->current_priority != new_priority )
ffc0ca8c: 80 7f 00 14 lwz r3,20(r31)
ffc0ca90: 7f 83 20 00 cmpw cr7,r3,r4
ffc0ca94: 41 9e 00 14 beq- cr7,ffc0caa8 <_Scheduler_CBS_Unblock+0x84>
_Thread_Change_priority(the_thread, new_priority, true);
ffc0ca98: 7f e3 fb 78 mr r3,r31
ffc0ca9c: 38 a0 00 01 li r5,1
ffc0caa0: 48 00 04 f5 bl ffc0cf94 <_Thread_Change_priority>
ffc0caa4: 80 7f 00 14 lwz r3,20(r31)
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
ffc0caa8: 3f c0 00 00 lis r30,0
ffc0caac: 3b de 32 40 addi r30,r30,12864
ffc0cab0: 3d 40 00 00 lis r10,0
ffc0cab4: 81 3e 00 14 lwz r9,20(r30)
ffc0cab8: 81 4a 20 b0 lwz r10,8368(r10)
ffc0cabc: 80 89 00 14 lwz r4,20(r9)
ffc0cac0: 7d 49 03 a6 mtctr r10
ffc0cac4: 4e 80 04 21 bctrl
ffc0cac8: 2f 83 00 00 cmpwi cr7,r3,0
ffc0cacc: 40 9d 00 20 ble- cr7,ffc0caec <_Scheduler_CBS_Unblock+0xc8>
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
ffc0cad0: 81 3e 00 10 lwz r9,16(r30)
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
ffc0cad4: 93 fe 00 14 stw r31,20(r30)
if ( _Thread_Executing->is_preemptible ||
ffc0cad8: 89 29 00 70 lbz r9,112(r9)
ffc0cadc: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cae0: 41 9e 00 24 beq- cr7,ffc0cb04 <_Scheduler_CBS_Unblock+0xe0>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
ffc0cae4: 39 20 00 01 li r9,1
ffc0cae8: 99 3e 00 0c stb r9,12(r30)
}
}
ffc0caec: 80 01 00 14 lwz r0,20(r1)
ffc0caf0: 83 c1 00 08 lwz r30,8(r1)
ffc0caf4: 7c 08 03 a6 mtlr r0
ffc0caf8: 83 e1 00 0c lwz r31,12(r1)
ffc0cafc: 38 21 00 10 addi r1,r1,16
ffc0cb00: 4e 80 00 20 blr
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
ffc0cb04: 81 3f 00 14 lwz r9,20(r31)
ffc0cb08: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cb0c: 41 9e ff d8 beq+ cr7,ffc0cae4 <_Scheduler_CBS_Unblock+0xc0><== NEVER TAKEN
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
}
}
ffc0cb10: 80 01 00 14 lwz r0,20(r1)
ffc0cb14: 83 c1 00 08 lwz r30,8(r1)
ffc0cb18: 7c 08 03 a6 mtlr r0
ffc0cb1c: 83 e1 00 0c lwz r31,12(r1)
ffc0cb20: 38 21 00 10 addi r1,r1,16
ffc0cb24: 4e 80 00 20 blr
ffc0c974 <_Scheduler_EDF_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
ffc0c974: 94 21 ff f0 stwu r1,-16(r1)
ffc0c978: 7c 08 02 a6 mflr r0
ffc0c97c: 93 e1 00 0c stw r31,12(r1)
ffc0c980: 7c 7f 1b 78 mr r31,r3
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
ffc0c984: 38 60 00 18 li r3,24
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
ffc0c988: 90 01 00 14 stw r0,20(r1)
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
ffc0c98c: 48 00 21 c9 bl ffc0eb54 <_Workspace_Allocate>
if ( sched ) {
ffc0c990: 2c 03 00 00 cmpwi r3,0
ffc0c994: 41 82 00 14 beq- ffc0c9a8 <_Scheduler_EDF_Allocate+0x34><== NEVER TAKEN
the_thread->scheduler_info = sched;
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
ffc0c998: 39 40 00 02 li r10,2
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
if ( sched ) {
the_thread->scheduler_info = sched;
ffc0c99c: 90 7f 00 88 stw r3,136(r31)
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
ffc0c9a0: 93 e3 00 00 stw r31,0(r3)
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
ffc0c9a4: 91 43 00 14 stw r10,20(r3)
}
return sched;
}
ffc0c9a8: 80 01 00 14 lwz r0,20(r1)
ffc0c9ac: 83 e1 00 0c lwz r31,12(r1)
ffc0c9b0: 7c 08 03 a6 mtlr r0
ffc0c9b4: 38 21 00 10 addi r1,r1,16
ffc0c9b8: 4e 80 00 20 blr
ffc0cbc4 <_Scheduler_EDF_Unblock>:
#include <rtems/score/scheduleredf.h>
void _Scheduler_EDF_Unblock(
Thread_Control *the_thread
)
{
ffc0cbc4: 94 21 ff f0 stwu r1,-16(r1)
ffc0cbc8: 7c 08 02 a6 mflr r0
ffc0cbcc: 93 e1 00 0c stw r31,12(r1)
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_lower_than(
ffc0cbd0: 3f e0 00 00 lis r31,0
ffc0cbd4: 3b ff 32 40 addi r31,r31,12864
#include <rtems/score/scheduleredf.h>
void _Scheduler_EDF_Unblock(
Thread_Control *the_thread
)
{
ffc0cbd8: 90 01 00 14 stw r0,20(r1)
ffc0cbdc: 93 c1 00 08 stw r30,8(r1)
ffc0cbe0: 7c 7e 1b 78 mr r30,r3
_Scheduler_EDF_Enqueue(the_thread);
ffc0cbe4: 4b ff fe 59 bl ffc0ca3c <_Scheduler_EDF_Enqueue>
ffc0cbe8: 3d 20 00 00 lis r9,0
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_lower_than(
ffc0cbec: 81 5f 00 14 lwz r10,20(r31)
ffc0cbf0: 81 29 20 b0 lwz r9,8368(r9)
ffc0cbf4: 80 6a 00 14 lwz r3,20(r10)
ffc0cbf8: 80 9e 00 14 lwz r4,20(r30)
ffc0cbfc: 7d 29 03 a6 mtctr r9
ffc0cc00: 4e 80 04 21 bctrl
ffc0cc04: 2f 83 00 00 cmpwi cr7,r3,0
ffc0cc08: 41 9c 00 1c blt- cr7,ffc0cc24 <_Scheduler_EDF_Unblock+0x60>
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
}
}
ffc0cc0c: 80 01 00 14 lwz r0,20(r1)
ffc0cc10: 83 c1 00 08 lwz r30,8(r1)
ffc0cc14: 7c 08 03 a6 mtlr r0
ffc0cc18: 83 e1 00 0c lwz r31,12(r1)
ffc0cc1c: 38 21 00 10 addi r1,r1,16
ffc0cc20: 4e 80 00 20 blr
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
ffc0cc24: 81 3f 00 10 lwz r9,16(r31)
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
ffc0cc28: 93 df 00 14 stw r30,20(r31)
if ( _Thread_Executing->is_preemptible ||
ffc0cc2c: 89 29 00 70 lbz r9,112(r9)
ffc0cc30: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cc34: 41 9e 00 24 beq- cr7,ffc0cc58 <_Scheduler_EDF_Unblock+0x94>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
ffc0cc38: 39 20 00 01 li r9,1
ffc0cc3c: 99 3f 00 0c stb r9,12(r31)
}
}
ffc0cc40: 80 01 00 14 lwz r0,20(r1)
ffc0cc44: 83 c1 00 08 lwz r30,8(r1)
ffc0cc48: 7c 08 03 a6 mtlr r0
ffc0cc4c: 83 e1 00 0c lwz r31,12(r1)
ffc0cc50: 38 21 00 10 addi r1,r1,16
ffc0cc54: 4e 80 00 20 blr
*/
if ( _Scheduler_Is_priority_lower_than(
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
ffc0cc58: 81 3e 00 14 lwz r9,20(r30)
ffc0cc5c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cc60: 40 be ff ac bne- cr7,ffc0cc0c <_Scheduler_EDF_Unblock+0x48><== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
ffc0cc64: 39 20 00 01 li r9,1 <== NOT EXECUTED
ffc0cc68: 99 3f 00 0c stb r9,12(r31) <== NOT EXECUTED
ffc0cc6c: 4b ff ff d4 b ffc0cc40 <_Scheduler_EDF_Unblock+0x7c> <== NOT EXECUTED
ffc0be58 <_Scheduler_priority_Block>:
)
{
Scheduler_priority_Per_thread *sched_info;
Chain_Control *ready;
sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info;
ffc0be58: 81 43 00 88 lwz r10,136(r3)
ready = sched_info->ready_chain;
ffc0be5c: 81 2a 00 00 lwz r9,0(r10)
if ( _Chain_Has_only_one_node( ready ) ) {
ffc0be60: 80 e9 00 00 lwz r7,0(r9)
ffc0be64: 81 09 00 08 lwz r8,8(r9)
ffc0be68: 7f 87 40 00 cmpw cr7,r7,r8
ffc0be6c: 41 9e 00 40 beq- cr7,ffc0beac <_Scheduler_priority_Block+0x54>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
ffc0be70: 81 23 00 00 lwz r9,0(r3)
previous = the_node->previous;
ffc0be74: 81 43 00 04 lwz r10,4(r3)
next->previous = previous;
ffc0be78: 91 49 00 04 stw r10,4(r9)
previous->next = next;
ffc0be7c: 91 2a 00 00 stw r9,0(r10)
RTEMS_INLINE_ROUTINE bool _Thread_Is_heir (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Heir );
ffc0be80: 3d 20 00 00 lis r9,0
ffc0be84: 39 29 31 a0 addi r9,r9,12704
{
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
ffc0be88: 81 49 00 14 lwz r10,20(r9)
ffc0be8c: 7f 83 50 00 cmpw cr7,r3,r10
ffc0be90: 41 9e 00 64 beq- cr7,ffc0bef4 <_Scheduler_priority_Block+0x9c>
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
ffc0be94: 81 49 00 10 lwz r10,16(r9)
ffc0be98: 7f 83 50 00 cmpw cr7,r3,r10
ffc0be9c: 4c be 00 20 bnelr+ cr7
_Thread_Dispatch_necessary = true;
ffc0bea0: 39 40 00 01 li r10,1
ffc0bea4: 99 49 00 0c stb r10,12(r9)
ffc0bea8: 4e 80 00 20 blr
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
ffc0beac: 81 0a 00 04 lwz r8,4(r10)
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 );
ffc0beb0: 38 a9 00 04 addi r5,r9,4
ffc0beb4: 80 ea 00 14 lwz r7,20(r10)
ffc0beb8: 80 c8 00 00 lwz r6,0(r8)
head->next = tail;
ffc0bebc: 90 a9 00 00 stw r5,0(r9)
ffc0bec0: 7c c7 38 38 and r7,r6,r7
if ( *the_priority_map->minor == 0 )
ffc0bec4: 2f 87 00 00 cmpwi cr7,r7,0
head->previous = NULL;
tail->previous = head;
ffc0bec8: 91 29 00 08 stw r9,8(r9)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
ffc0becc: 38 c0 00 00 li r6,0
ffc0bed0: 90 c9 00 04 stw r6,4(r9)
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
ffc0bed4: 90 e8 00 00 stw r7,0(r8)
if ( *the_priority_map->minor == 0 )
ffc0bed8: 40 be ff a8 bne- cr7,ffc0be80 <_Scheduler_priority_Block+0x28>
_Priority_Major_bit_map &= the_priority_map->block_major;
ffc0bedc: 3d 20 00 00 lis r9,0
ffc0bee0: 81 4a 00 10 lwz r10,16(r10)
ffc0bee4: 81 09 28 94 lwz r8,10388(r9)
ffc0bee8: 7d 0a 50 38 and r10,r8,r10
ffc0beec: 91 49 28 94 stw r10,10388(r9)
ffc0bef0: 4b ff ff 90 b ffc0be80 <_Scheduler_priority_Block+0x28>
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 );
ffc0bef4: 3d 60 00 00 lis r11,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
ffc0bef8: 3d 40 00 00 lis r10,0
ffc0befc: 81 0b 28 94 lwz r8,10388(r11)
ffc0bf00: 80 ea 20 80 lwz r7,8320(r10)
ffc0bf04: 7d 04 00 34 cntlzw r4,r8
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
ffc0bf08: 3c a0 00 00 lis r5,0
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
ffc0bf0c: 91 0b 28 94 stw r8,10388(r11)
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
ffc0bf10: 38 a5 31 e0 addi r5,r5,12768
ffc0bf14: 54 86 10 3a rlwinm r6,r4,2,0,29
ffc0bf18: 7d 45 30 2e lwzx r10,r5,r6
ffc0bf1c: 7d 48 00 34 cntlzw r8,r10
return (_Priority_Bits_index( major ) << 4) +
ffc0bf20: 54 84 20 36 rlwinm r4,r4,4,0,27
{
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 );
ffc0bf24: 7d 45 31 2e stwx r10,r5,r6
return (_Priority_Bits_index( major ) << 4) +
ffc0bf28: 7d 04 42 14 add r8,r4,r8
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
ffc0bf2c: 1d 08 00 0c mulli r8,r8,12
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0bf30: 7d 47 40 2e lwzx r10,r7,r8
ffc0bf34: 7c c7 42 14 add r6,r7,r8
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc0bf38: 39 06 00 04 addi r8,r6,4
ffc0bf3c: 7f 8a 40 00 cmpw cr7,r10,r8
ffc0bf40: 41 9e 00 0c beq- cr7,ffc0bf4c <_Scheduler_priority_Block+0xf4><== NEVER TAKEN
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
ffc0bf44: 91 49 00 14 stw r10,20(r9)
ffc0bf48: 4b ff ff 4c b ffc0be94 <_Scheduler_priority_Block+0x3c>
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
ffc0bf4c: 39 40 00 00 li r10,0 <== NOT EXECUTED
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
ffc0bf50: 91 49 00 14 stw r10,20(r9) <== NOT EXECUTED
ffc0bf54: 4b ff ff 40 b ffc0be94 <_Scheduler_priority_Block+0x3c><== NOT EXECUTED
ffc0c114 <_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 );
ffc0c114: 3c 80 00 00 lis r4,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
ffc0c118: 3d 20 00 00 lis r9,0
ffc0c11c: 81 44 28 94 lwz r10,10388(r4)
ffc0c120: 81 09 20 80 lwz r8,8320(r9)
ffc0c124: 7d 45 00 34 cntlzw r5,r10
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
ffc0c128: 3c c0 00 00 lis r6,0
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
ffc0c12c: 91 44 28 94 stw r10,10388(r4)
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
ffc0c130: 38 c6 31 e0 addi r6,r6,12768
ffc0c134: 54 a7 10 3a rlwinm r7,r5,2,0,29
ffc0c138: 7d 26 38 2e lwzx r9,r6,r7
ffc0c13c: 7d 24 00 34 cntlzw r4,r9
return (_Priority_Bits_index( major ) << 4) +
ffc0c140: 54 aa 20 36 rlwinm r10,r5,4,0,27
{
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 );
ffc0c144: 7d 26 39 2e stwx r9,r6,r7
return (_Priority_Bits_index( major ) << 4) +
ffc0c148: 7d 4a 22 14 add r10,r10,r4
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
ffc0c14c: 1d 4a 00 0c mulli r10,r10,12
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0c150: 7d 28 50 2e lwzx r9,r8,r10
ffc0c154: 7c e8 52 14 add r7,r8,r10
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc0c158: 39 47 00 04 addi r10,r7,4
ffc0c15c: 7f 89 50 00 cmpw cr7,r9,r10
ffc0c160: 41 9e 00 10 beq- cr7,ffc0c170 <_Scheduler_priority_Schedule+0x5c><== NEVER TAKEN
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
ffc0c164: 3d 40 00 00 lis r10,0
ffc0c168: 91 2a 31 b4 stw r9,12724(r10)
ffc0c16c: 4e 80 00 20 blr
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
ffc0c170: 39 20 00 00 li r9,0 <== NOT EXECUTED
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
ffc0c174: 3d 40 00 00 lis r10,0 <== NOT EXECUTED
ffc0c178: 91 2a 31 b4 stw r9,12724(r10) <== NOT EXECUTED
ffc0c17c: 4e 80 00 20 blr <== NOT EXECUTED
ffc0cb0c <_Scheduler_simple_Ready_queue_enqueue_first>:
{
Chain_Control *ready;
Chain_Node *the_node;
Thread_Control *current;
ready = (Chain_Control *)_Scheduler.information;
ffc0cb0c: 3d 20 00 00 lis r9,0
*/
for ( the_node = _Chain_First(ready) ; ; the_node = the_node->next ) {
current = (Thread_Control *) the_node;
/* break when AT HEAD OF (or PAST) our priority */
if ( the_thread->current_priority <= current->current_priority ) {
ffc0cb10: 81 03 00 14 lwz r8,20(r3)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc0cb14: 81 29 20 80 lwz r9,8320(r9)
ffc0cb18: 81 29 00 00 lwz r9,0(r9)
ffc0cb1c: 81 49 00 14 lwz r10,20(r9)
ffc0cb20: 7f 8a 40 40 cmplw cr7,r10,r8
ffc0cb24: 40 9c 00 14 bge- cr7,ffc0cb38 <_Scheduler_simple_Ready_queue_enqueue_first+0x2c>
* Do NOT need to check for end of chain because there is always
* at least one task on the ready chain -- the IDLE task. It can
* never block, should never attempt to obtain a semaphore or mutex,
* and thus will always be there.
*/
for ( the_node = _Chain_First(ready) ; ; the_node = the_node->next ) {
ffc0cb28: 81 29 00 00 lwz r9,0(r9)
current = (Thread_Control *) the_node;
/* break when AT HEAD OF (or PAST) our priority */
if ( the_thread->current_priority <= current->current_priority ) {
ffc0cb2c: 81 49 00 14 lwz r10,20(r9)
ffc0cb30: 7f 8a 40 40 cmplw cr7,r10,r8
ffc0cb34: 41 9c ff f4 blt+ cr7,ffc0cb28 <_Scheduler_simple_Ready_queue_enqueue_first+0x1c><== NEVER TAKEN
current = (Thread_Control *)current->Object.Node.previous;
ffc0cb38: 81 29 00 04 lwz r9,4(r9)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0cb3c: 81 49 00 00 lwz r10,0(r9)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0cb40: 91 23 00 04 stw r9,4(r3)
before_node = after_node->next;
after_node->next = the_node;
ffc0cb44: 90 69 00 00 stw r3,0(r9)
the_node->next = before_node;
before_node->previous = the_node;
ffc0cb48: 90 6a 00 04 stw r3,4(r10)
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
ffc0cb4c: 91 43 00 00 stw r10,0(r3)
ffc0cb50: 4e 80 00 20 blr
ffc0a958 <_TOD_Validate>:
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) ||
ffc0a958: 7c 69 1b 79 mr. r9,r3
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
ffc0a95c: 3d 40 ff c2 lis r10,-62
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
ffc0a960: 81 4a 13 44 lwz r10,4932(r10)
ffc0a964: 3d 00 00 0f lis r8,15
ffc0a968: 61 08 42 40 ori r8,r8,16960
ffc0a96c: 7c e8 53 96 divwu r7,r8,r10
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
ffc0a970: 41 82 00 90 beq- ffc0aa00 <_TOD_Validate+0xa8> <== NEVER TAKEN
ffc0a974: 81 49 00 18 lwz r10,24(r9)
(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;
ffc0a978: 38 60 00 00 li r3,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) ||
ffc0a97c: 7f 87 50 40 cmplw cr7,r7,r10
ffc0a980: 4c 9d 00 20 blelr cr7
(the_tod->ticks >= ticks_per_second) ||
ffc0a984: 81 49 00 14 lwz r10,20(r9)
ffc0a988: 2b 8a 00 3b cmplwi cr7,r10,59
ffc0a98c: 4d 9d 00 20 bgtlr cr7
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
ffc0a990: 81 49 00 10 lwz r10,16(r9)
ffc0a994: 2b 8a 00 3b cmplwi cr7,r10,59
ffc0a998: 4d 9d 00 20 bgtlr cr7
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
ffc0a99c: 81 49 00 0c lwz r10,12(r9)
ffc0a9a0: 2b 8a 00 17 cmplwi cr7,r10,23
ffc0a9a4: 4d 9d 00 20 bgtlr cr7
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
ffc0a9a8: 81 49 00 04 lwz r10,4(r9)
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) ||
ffc0a9ac: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0a9b0: 4d 9e 00 20 beqlr cr7
(the_tod->month == 0) ||
ffc0a9b4: 2b 8a 00 0c cmplwi cr7,r10,12
ffc0a9b8: 4d 9d 00 20 bgtlr cr7
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
ffc0a9bc: 81 09 00 00 lwz r8,0(r9)
(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) ||
ffc0a9c0: 2b 88 07 c3 cmplwi cr7,r8,1987
ffc0a9c4: 4c 9d 00 20 blelr cr7
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
ffc0a9c8: 81 29 00 08 lwz r9,8(r9)
(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) ||
ffc0a9cc: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a9d0: 4d 9e 00 20 beqlr cr7
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
ffc0a9d4: 71 07 00 03 andi. r7,r8,3
ffc0a9d8: 40 82 00 30 bne- ffc0aa08 <_TOD_Validate+0xb0>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
ffc0a9dc: 39 4a 00 0d addi r10,r10,13
ffc0a9e0: 3d 00 ff c2 lis r8,-62
ffc0a9e4: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc0a9e8: 39 08 2b 90 addi r8,r8,11152
ffc0a9ec: 7c 68 50 2e lwzx r3,r8,r10
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
if ( the_tod->day > days_in_month )
ffc0a9f0: 7c 69 18 10 subfc r3,r9,r3
ffc0a9f4: 38 60 00 00 li r3,0
ffc0a9f8: 7c 63 19 14 adde r3,r3,r3
ffc0a9fc: 4e 80 00 20 blr
(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;
ffc0aa00: 38 60 00 00 li r3,0 <== NOT EXECUTED
if ( the_tod->day > days_in_month )
return false;
return true;
}
ffc0aa04: 4e 80 00 20 blr <== NOT EXECUTED
return false;
if ( (the_tod->year % 4) == 0 )
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
ffc0aa08: 3d 00 ff c2 lis r8,-62
ffc0aa0c: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc0aa10: 39 08 2b 90 addi r8,r8,11152
ffc0aa14: 7c 68 50 2e lwzx r3,r8,r10
ffc0aa18: 4b ff ff d8 b ffc0a9f0 <_TOD_Validate+0x98>
ffc0c434 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
ffc0c434: 94 21 ff e8 stwu r1,-24(r1)
ffc0c438: 7c 08 02 a6 mflr r0
ffc0c43c: 90 01 00 1c stw r0,28(r1)
ffc0c440: 93 e1 00 14 stw r31,20(r1)
ffc0c444: 7c 7f 1b 78 mr r31,r3
ffc0c448: 93 81 00 08 stw r28,8(r1)
ffc0c44c: 7c bc 2b 78 mr r28,r5
ffc0c450: 93 a1 00 0c stw r29,12(r1)
ffc0c454: 93 c1 00 10 stw r30,16(r1)
ffc0c458: 7c 9e 23 78 mr r30,r4
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
ffc0c45c: 83 a3 00 10 lwz r29,16(r3)
/*
* 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 );
ffc0c460: 48 00 11 c1 bl ffc0d620 <_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 )
ffc0c464: 81 3f 00 14 lwz r9,20(r31)
ffc0c468: 7f 89 f0 00 cmpw cr7,r9,r30
ffc0c46c: 41 9e 00 10 beq- cr7,ffc0c47c <_Thread_Change_priority+0x48>
_Thread_Set_priority( the_thread, new_priority );
ffc0c470: 7f e3 fb 78 mr r3,r31
ffc0c474: 7f c4 f3 78 mr r4,r30
ffc0c478: 48 00 11 1d bl ffc0d594 <_Thread_Set_priority>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0c47c: 7f c0 00 a6 mfmsr r30
ffc0c480: 7d 30 42 a6 mfsprg r9,0
ffc0c484: 7f c9 48 78 andc r9,r30,r9
ffc0c488: 7d 20 01 24 mtmsr r9
/*
* 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;
ffc0c48c: 81 3f 00 10 lwz r9,16(r31)
if ( state != STATES_TRANSIENT ) {
ffc0c490: 2f 89 00 04 cmpwi cr7,r9,4
ffc0c494: 41 9e 00 84 beq- cr7,ffc0c518 <_Thread_Change_priority+0xe4>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
ffc0c498: 73 a8 00 04 andi. r8,r29,4
ffc0c49c: 41 82 00 38 beq- ffc0c4d4 <_Thread_Change_priority+0xa0><== ALWAYS TAKEN
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0c4a0: 7f c0 01 24 mtmsr r30 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
ffc0c4a4: 3d 40 00 03 lis r10,3 <== NOT EXECUTED
ffc0c4a8: 61 4a be e0 ori r10,r10,48864 <== NOT EXECUTED
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
ffc0c4ac: 7d 28 50 39 and. r8,r9,r10 <== NOT EXECUTED
ffc0c4b0: 40 82 00 40 bne- ffc0c4f0 <_Thread_Change_priority+0xbc><== NOT EXECUTED
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
ffc0c4b4: 80 01 00 1c lwz r0,28(r1)
ffc0c4b8: 83 81 00 08 lwz r28,8(r1)
ffc0c4bc: 7c 08 03 a6 mtlr r0
ffc0c4c0: 83 a1 00 0c lwz r29,12(r1)
ffc0c4c4: 83 c1 00 10 lwz r30,16(r1)
ffc0c4c8: 83 e1 00 14 lwz r31,20(r1)
ffc0c4cc: 38 21 00 18 addi r1,r1,24
ffc0c4d0: 4e 80 00 20 blr
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
ffc0c4d4: 55 2a 07 b8 rlwinm r10,r9,0,30,28
*/
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 );
ffc0c4d8: 91 5f 00 10 stw r10,16(r31)
ffc0c4dc: 7f c0 01 24 mtmsr r30
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
ffc0c4e0: 3d 40 00 03 lis r10,3
ffc0c4e4: 61 4a be e0 ori r10,r10,48864
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
ffc0c4e8: 7d 28 50 39 and. r8,r9,r10
ffc0c4ec: 41 82 ff c8 beq+ ffc0c4b4 <_Thread_Change_priority+0x80>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
ffc0c4f0: 80 01 00 1c lwz r0,28(r1)
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
ffc0c4f4: 7f e4 fb 78 mr r4,r31
ffc0c4f8: 80 7f 00 44 lwz r3,68(r31)
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
ffc0c4fc: 7c 08 03 a6 mtlr r0
ffc0c500: 83 81 00 08 lwz r28,8(r1)
ffc0c504: 83 a1 00 0c lwz r29,12(r1)
ffc0c508: 83 c1 00 10 lwz r30,16(r1)
ffc0c50c: 83 e1 00 14 lwz r31,20(r1)
ffc0c510: 38 21 00 18 addi r1,r1,24
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
ffc0c514: 48 00 0f 88 b ffc0d49c <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
ffc0c518: 73 a9 00 04 andi. r9,r29,4
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
ffc0c51c: 3f a0 00 00 lis r29,0
ffc0c520: 3b bd 20 80 addi r29,r29,8320
ffc0c524: 40 82 00 20 bne- ffc0c544 <_Thread_Change_priority+0x110><== NEVER TAKEN
* 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 );
if ( prepend_it )
ffc0c528: 2f 9c 00 00 cmpwi cr7,r28,0
* 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 );
ffc0c52c: 91 3f 00 10 stw r9,16(r31)
if ( prepend_it )
ffc0c530: 41 9e 00 7c beq- cr7,ffc0c5ac <_Thread_Change_priority+0x178>
ffc0c534: 81 3d 00 28 lwz r9,40(r29)
ffc0c538: 7f e3 fb 78 mr r3,r31
ffc0c53c: 7d 29 03 a6 mtctr r9
ffc0c540: 4e 80 04 21 bctrl
static inline void ppc_interrupt_flash( uint32_t level )
{
uint32_t current_level;
__asm__ volatile (
ffc0c544: 7d 20 00 a6 mfmsr r9
ffc0c548: 7f c0 01 24 mtmsr r30
ffc0c54c: 7d 20 01 24 mtmsr r9
* 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();
ffc0c550: 81 3d 00 08 lwz r9,8(r29)
ffc0c554: 7d 29 03 a6 mtctr r9
ffc0c558: 4e 80 04 21 bctrl
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
ffc0c55c: 3d 20 00 00 lis r9,0
ffc0c560: 39 29 31 a0 addi r9,r9,12704
ffc0c564: 81 49 00 10 lwz r10,16(r9)
* 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() &&
ffc0c568: 81 09 00 14 lwz r8,20(r9)
ffc0c56c: 7f 8a 40 00 cmpw cr7,r10,r8
ffc0c570: 41 9e 00 18 beq- cr7,ffc0c588 <_Thread_Change_priority+0x154>
ffc0c574: 89 4a 00 70 lbz r10,112(r10)
ffc0c578: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c57c: 41 9e 00 0c beq- cr7,ffc0c588 <_Thread_Change_priority+0x154>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
ffc0c580: 39 40 00 01 li r10,1
ffc0c584: 99 49 00 0c stb r10,12(r9)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0c588: 7f c0 01 24 mtmsr r30
_ISR_Enable( level );
}
ffc0c58c: 80 01 00 1c lwz r0,28(r1)
ffc0c590: 83 81 00 08 lwz r28,8(r1)
ffc0c594: 7c 08 03 a6 mtlr r0
ffc0c598: 83 a1 00 0c lwz r29,12(r1)
ffc0c59c: 83 c1 00 10 lwz r30,16(r1)
ffc0c5a0: 83 e1 00 14 lwz r31,20(r1)
ffc0c5a4: 38 21 00 18 addi r1,r1,24
ffc0c5a8: 4e 80 00 20 blr
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
ffc0c5ac: 81 3d 00 24 lwz r9,36(r29)
ffc0c5b0: 7f e3 fb 78 mr r3,r31
ffc0c5b4: 7d 29 03 a6 mtctr r9
ffc0c5b8: 4e 80 04 21 bctrl
ffc0c5bc: 4b ff ff 88 b ffc0c544 <_Thread_Change_priority+0x110>
ffc0c82c <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
ffc0c82c: 94 21 ff e8 stwu r1,-24(r1)
ffc0c830: 7c 08 02 a6 mflr r0
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
ffc0c834: 38 81 00 08 addi r4,r1,8
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
ffc0c838: 90 01 00 1c stw r0,28(r1)
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
ffc0c83c: 48 00 02 a1 bl ffc0cadc <_Thread_Get>
switch ( location ) {
ffc0c840: 81 21 00 08 lwz r9,8(r1)
ffc0c844: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c848: 40 9e 00 20 bne- cr7,ffc0c868 <_Thread_Delay_ended+0x3c><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
ffc0c84c: 3c 80 10 00 lis r4,4096
ffc0c850: 60 84 00 18 ori r4,r4,24
ffc0c854: 4b ff fd 6d bl ffc0c5c0 <_Thread_Clear_state>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0c858: 3d 20 00 00 lis r9,0
ffc0c85c: 81 49 28 68 lwz r10,10344(r9)
--level;
ffc0c860: 39 4a ff ff addi r10,r10,-1
_Thread_Dispatch_disable_level = level;
ffc0c864: 91 49 28 68 stw r10,10344(r9)
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
ffc0c868: 80 01 00 1c lwz r0,28(r1)
ffc0c86c: 38 21 00 18 addi r1,r1,24
ffc0c870: 7c 08 03 a6 mtlr r0
ffc0c874: 4e 80 00 20 blr
ffc0c878 <_Thread_Dispatch>:
#if defined(RTEMS_SMP)
#include <rtems/score/smp.h>
#endif
void _Thread_Dispatch( void )
{
ffc0c878: 94 21 ff b8 stwu r1,-72(r1)
ffc0c87c: 7c 08 02 a6 mflr r0
ffc0c880: 93 81 00 38 stw r28,56(r1)
#endif
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
ffc0c884: 3f 80 00 00 lis r28,0
ffc0c888: 3b 9c 31 a0 addi r28,r28,12704
#if defined(RTEMS_SMP)
#include <rtems/score/smp.h>
#endif
void _Thread_Dispatch( void )
{
ffc0c88c: 93 e1 00 44 stw r31,68(r1)
ffc0c890: 90 01 00 4c stw r0,76(r1)
ffc0c894: 92 81 00 18 stw r20,24(r1)
ffc0c898: 92 a1 00 1c stw r21,28(r1)
ffc0c89c: 92 c1 00 20 stw r22,32(r1)
ffc0c8a0: 92 e1 00 24 stw r23,36(r1)
ffc0c8a4: 93 01 00 28 stw r24,40(r1)
ffc0c8a8: 93 21 00 2c stw r25,44(r1)
ffc0c8ac: 93 41 00 30 stw r26,48(r1)
ffc0c8b0: 93 61 00 34 stw r27,52(r1)
ffc0c8b4: 93 a1 00 3c stw r29,60(r1)
ffc0c8b8: 93 c1 00 40 stw r30,64(r1)
#endif
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
ffc0c8bc: 83 fc 00 10 lwz r31,16(r28)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0c8c0: 7d 20 00 a6 mfmsr r9
ffc0c8c4: 7d 50 42 a6 mfsprg r10,0
ffc0c8c8: 7d 2a 50 78 andc r10,r9,r10
ffc0c8cc: 7d 40 01 24 mtmsr r10
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
ffc0c8d0: 89 5c 00 0c lbz r10,12(r28)
ffc0c8d4: 3f 60 00 00 lis r27,0
ffc0c8d8: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0c8dc: 41 9e 01 58 beq- cr7,ffc0ca34 <_Thread_Dispatch+0x1bc>
heir = _Thread_Heir;
ffc0c8e0: 83 dc 00 14 lwz r30,20(r28)
* This routine sets thread dispatch level to the
* value passed in.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_set_disable_level(uint32_t value)
{
_Thread_Dispatch_disable_level = value;
ffc0c8e4: 39 40 00 01 li r10,1
ffc0c8e8: 3f 60 00 00 lis r27,0
/*
* 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 )
ffc0c8ec: 7f 9f f0 00 cmpw cr7,r31,r30
ffc0c8f0: 91 5b 28 68 stw r10,10344(r27)
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
ffc0c8f4: 39 40 00 00 li r10,0
_Thread_Executing = heir;
ffc0c8f8: 93 dc 00 10 stw r30,16(r28)
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
ffc0c8fc: 99 5c 00 0c stb r10,12(r28)
/*
* 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 )
ffc0c900: 41 9e 01 34 beq- cr7,ffc0ca34 <_Thread_Dispatch+0x1bc>
ffc0c904: 3f 40 00 00 lis r26,0
ffc0c908: 3b 5a 22 08 addi r26,r26,8712
ffc0c90c: 3f 00 00 00 lis r24,0
ffc0c910: 3f 20 00 00 lis r25,0
ffc0c914: 3b 18 2c 68 addi r24,r24,11368
ffc0c918: 3b 39 28 70 addi r25,r25,10352
ffc0c91c: 3b ba 00 04 addi r29,r26,4
#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;
ffc0c920: 3e a0 00 00 lis r21,0
ffc0c924: 3a c0 00 01 li r22,1
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
ffc0c928: 3a e0 00 00 li r23,0
*/
#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 )
ffc0c92c: 81 5e 00 78 lwz r10,120(r30)
ffc0c930: 2f 8a 00 01 cmpwi cr7,r10,1
ffc0c934: 41 9e 01 80 beq- cr7,ffc0cab4 <_Thread_Dispatch+0x23c>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0c938: 7d 20 01 24 mtmsr r9
*/
static inline void _TOD_Get_uptime(
Timestamp_Control *time
)
{
_TOD_Get_with_nanoseconds( time, &_TOD.uptime );
ffc0c93c: 38 61 00 08 addi r3,r1,8
ffc0c940: 7f 04 c3 78 mr r4,r24
ffc0c944: 4b ff e4 51 bl ffc0ad94 <_TOD_Get_with_nanoseconds>
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
ffc0c948: 80 b9 00 00 lwz r5,0(r25)
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
ffc0c94c: 80 dc 00 20 lwz r6,32(r28)
ffc0c950: 2f 85 00 00 cmpwi cr7,r5,0
ffc0c954: 80 fc 00 24 lwz r7,36(r28)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
_Timestamp_Subtract(
ffc0c958: 81 41 00 08 lwz r10,8(r1)
ffc0c95c: 81 61 00 0c lwz r11,12(r1)
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
ffc0c960: 81 1f 00 80 lwz r8,128(r31)
ffc0c964: 81 3f 00 84 lwz r9,132(r31)
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
ffc0c968: 7c e7 58 10 subfc r7,r7,r11
ffc0c96c: 7c c6 51 10 subfe r6,r6,r10
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
ffc0c970: 7d 29 38 14 addc r9,r9,r7
ffc0c974: 7d 08 31 14 adde r8,r8,r6
ffc0c978: 91 1f 00 80 stw r8,128(r31)
ffc0c97c: 91 3f 00 84 stw r9,132(r31)
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
ffc0c980: 91 5c 00 20 stw r10,32(r28)
ffc0c984: 91 7c 00 24 stw r11,36(r28)
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
ffc0c988: 41 9e 00 14 beq- cr7,ffc0c99c <_Thread_Dispatch+0x124> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
ffc0c98c: 81 25 00 00 lwz r9,0(r5)
ffc0c990: 91 3f 01 48 stw r9,328(r31)
*_Thread_libc_reent = heir->libc_reent;
ffc0c994: 81 3e 01 48 lwz r9,328(r30)
ffc0c998: 91 25 00 00 stw r9,0(r5)
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0c99c: 82 9a 00 00 lwz r20,0(r26)
{
const Chain_Control *chain = &_User_extensions_Switches_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
ffc0c9a0: 7f 94 e8 00 cmpw cr7,r20,r29
ffc0c9a4: 41 9e 00 24 beq- cr7,ffc0c9c8 <_Thread_Dispatch+0x150> <== NEVER TAKEN
const User_extensions_Switch_control *extension =
(const User_extensions_Switch_control *) node;
(*extension->thread_switch)( executing, heir );
ffc0c9a8: 81 34 00 08 lwz r9,8(r20)
ffc0c9ac: 7f e3 fb 78 mr r3,r31
ffc0c9b0: 7f c4 f3 78 mr r4,r30
ffc0c9b4: 7d 29 03 a6 mtctr r9
ffc0c9b8: 4e 80 04 21 bctrl
#ifdef RTEMS_SMP
_Thread_Unnest_dispatch();
#endif
_API_extensions_Run_post_switch( executing );
}
ffc0c9bc: 82 94 00 00 lwz r20,0(r20)
{
const Chain_Control *chain = &_User_extensions_Switches_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
ffc0c9c0: 7f 94 e8 00 cmpw cr7,r20,r29
ffc0c9c4: 40 9e ff e4 bne+ cr7,ffc0c9a8 <_Thread_Dispatch+0x130>
* operations.
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH != TRUE )
if ( executing->fp_context != NULL )
ffc0c9c8: 81 3f 01 44 lwz r9,324(r31)
ffc0c9cc: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c9d0: 41 9e 00 0c beq- cr7,ffc0c9dc <_Thread_Dispatch+0x164>
_Context_Save_fp( &executing->fp_context );
ffc0c9d4: 38 7f 01 44 addi r3,r31,324
ffc0c9d8: 48 01 0e c9 bl ffc1d8a0 <_CPU_Context_save_fp>
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
ffc0c9dc: 38 7f 00 c4 addi r3,r31,196
ffc0c9e0: 38 9e 00 c4 addi r4,r30,196
ffc0c9e4: 48 01 10 3d bl ffc1da20 <_CPU_Context_switch>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
_Context_Restore_fp( &executing->fp_context );
_Thread_Allocated_fp = executing;
}
#else
if ( executing->fp_context != NULL )
ffc0c9e8: 81 3f 01 44 lwz r9,324(r31)
ffc0c9ec: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c9f0: 41 9e 00 0c beq- cr7,ffc0c9fc <_Thread_Dispatch+0x184>
_Context_Restore_fp( &executing->fp_context );
ffc0c9f4: 38 7f 01 44 addi r3,r31,324
ffc0c9f8: 48 01 0f 69 bl ffc1d960 <_CPU_Context_restore_fp>
#endif
#endif
executing = _Thread_Executing;
ffc0c9fc: 83 fc 00 10 lwz r31,16(r28)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0ca00: 7d 20 00 a6 mfmsr r9
ffc0ca04: 7d 50 42 a6 mfsprg r10,0
ffc0ca08: 7d 2a 50 78 andc r10,r9,r10
ffc0ca0c: 7d 40 01 24 mtmsr r10
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
ffc0ca10: 89 5c 00 0c lbz r10,12(r28)
ffc0ca14: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ca18: 41 9e 00 1c beq- cr7,ffc0ca34 <_Thread_Dispatch+0x1bc>
heir = _Thread_Heir;
ffc0ca1c: 83 dc 00 14 lwz r30,20(r28)
ffc0ca20: 92 db 28 68 stw r22,10344(r27)
/*
* 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 )
ffc0ca24: 7f 9e f8 00 cmpw cr7,r30,r31
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
#ifndef RTEMS_SMP
_Thread_Dispatch_set_disable_level( 1 );
#endif
_Thread_Dispatch_necessary = false;
ffc0ca28: 9a fc 00 0c stb r23,12(r28)
_Thread_Executing = heir;
ffc0ca2c: 93 dc 00 10 stw r30,16(r28)
/*
* 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 )
ffc0ca30: 40 9e fe fc bne+ cr7,ffc0c92c <_Thread_Dispatch+0xb4> <== ALWAYS TAKEN
ffc0ca34: 39 40 00 00 li r10,0
ffc0ca38: 91 5b 28 68 stw r10,10344(r27)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0ca3c: 7d 20 01 24 mtmsr r9
ffc0ca40: 3d 20 00 00 lis r9,0
ffc0ca44: 3b a9 2d 90 addi r29,r9,11664
ffc0ca48: 83 c9 2d 90 lwz r30,11664(r9)
{
const Chain_Control *chain = &_API_extensions_Post_switch_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
ffc0ca4c: 3b bd 00 04 addi r29,r29,4
ffc0ca50: 7f 9e e8 00 cmpw cr7,r30,r29
ffc0ca54: 41 9e 00 20 beq- cr7,ffc0ca74 <_Thread_Dispatch+0x1fc>
const API_extensions_Post_switch_control *post_switch =
(const API_extensions_Post_switch_control *) node;
(*post_switch->hook)( executing );
ffc0ca58: 81 3e 00 08 lwz r9,8(r30)
ffc0ca5c: 7f e3 fb 78 mr r3,r31
ffc0ca60: 7d 29 03 a6 mtctr r9
ffc0ca64: 4e 80 04 21 bctrl
#ifdef RTEMS_SMP
_Thread_Unnest_dispatch();
#endif
_API_extensions_Run_post_switch( executing );
}
ffc0ca68: 83 de 00 00 lwz r30,0(r30)
{
const Chain_Control *chain = &_API_extensions_Post_switch_list;
const Chain_Node *tail = _Chain_Immutable_tail( chain );
const Chain_Node *node = _Chain_Immutable_first( chain );
while ( node != tail ) {
ffc0ca6c: 7f 9e e8 00 cmpw cr7,r30,r29
ffc0ca70: 40 9e ff e8 bne+ cr7,ffc0ca58 <_Thread_Dispatch+0x1e0> <== NEVER TAKEN
ffc0ca74: 80 01 00 4c lwz r0,76(r1)
ffc0ca78: 82 81 00 18 lwz r20,24(r1)
ffc0ca7c: 7c 08 03 a6 mtlr r0
ffc0ca80: 82 a1 00 1c lwz r21,28(r1)
ffc0ca84: 82 c1 00 20 lwz r22,32(r1)
ffc0ca88: 82 e1 00 24 lwz r23,36(r1)
ffc0ca8c: 83 01 00 28 lwz r24,40(r1)
ffc0ca90: 83 21 00 2c lwz r25,44(r1)
ffc0ca94: 83 41 00 30 lwz r26,48(r1)
ffc0ca98: 83 61 00 34 lwz r27,52(r1)
ffc0ca9c: 83 81 00 38 lwz r28,56(r1)
ffc0caa0: 83 a1 00 3c lwz r29,60(r1)
ffc0caa4: 83 c1 00 40 lwz r30,64(r1)
ffc0caa8: 83 e1 00 44 lwz r31,68(r1)
ffc0caac: 38 21 00 48 addi r1,r1,72
ffc0cab0: 4e 80 00 20 blr
#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;
ffc0cab4: 81 55 28 64 lwz r10,10340(r21)
ffc0cab8: 91 5e 00 74 stw r10,116(r30)
ffc0cabc: 4b ff fe 7c b ffc0c938 <_Thread_Dispatch+0xc0>
ffc12e0c <_Thread_Handler>:
#define INIT_NAME __main
#define EXECUTE_GLOBAL_CONSTRUCTORS
#endif
void _Thread_Handler( void )
{
ffc12e0c: 94 21 ff f0 stwu r1,-16(r1)
ffc12e10: 7c 08 02 a6 mflr r0
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static bool doneConstructors;
bool doCons;
#endif
executing = _Thread_Executing;
ffc12e14: 3d 20 00 00 lis r9,0
#define INIT_NAME __main
#define EXECUTE_GLOBAL_CONSTRUCTORS
#endif
void _Thread_Handler( void )
{
ffc12e18: 90 01 00 14 stw r0,20(r1)
ffc12e1c: 93 e1 00 0c stw r31,12(r1)
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static bool doneConstructors;
bool doCons;
#endif
executing = _Thread_Executing;
ffc12e20: 83 e9 31 b0 lwz r31,12720(r9)
#define INIT_NAME __main
#define EXECUTE_GLOBAL_CONSTRUCTORS
#endif
void _Thread_Handler( void )
{
ffc12e24: 93 c1 00 08 stw r30,8(r1)
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
ffc12e28: 81 5f 00 a8 lwz r10,168(r31)
}
static inline void _CPU_ISR_Set_level( uint32_t level )
{
register unsigned int msr;
_CPU_MSR_GET(msr);
ffc12e2c: 39 20 00 00 li r9,0
ffc12e30: 7d 20 00 a6 mfmsr r9
if (!(level & CPU_MODES_INTERRUPT_MASK)) {
ffc12e34: 71 48 00 01 andi. r8,r10,1
static inline uint32_t ppc_interrupt_get_disable_mask( void )
{
uint32_t mask;
__asm__ volatile (
ffc12e38: 7d 50 42 a6 mfsprg r10,0
ffc12e3c: 40 82 00 6c bne- ffc12ea8 <_Thread_Handler+0x9c>
msr |= ppc_interrupt_get_disable_mask();
ffc12e40: 7d 49 4b 78 or r9,r10,r9
}
else {
msr &= ~ppc_interrupt_get_disable_mask();
}
_CPU_MSR_SET(msr);
ffc12e44: 7d 20 01 24 mtmsr r9
doCons = !doneConstructors
&& _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
if (doCons)
doneConstructors = true;
#else
doCons = !doneConstructors;
ffc12e48: 3d 20 00 00 lis r9,0
ffc12e4c: 8b c9 2a 40 lbz r30,10816(r9)
);
}
static inline void _User_extensions_Thread_begin( Thread_Control *executing )
{
_User_extensions_Iterate(
ffc12e50: 3c 80 ff c1 lis r4,-63
doneConstructors = true;
ffc12e54: 39 40 00 01 li r10,1
ffc12e58: 7f e3 fb 78 mr r3,r31
ffc12e5c: 99 49 2a 40 stb r10,10816(r9)
ffc12e60: 38 84 d8 c0 addi r4,r4,-10048
ffc12e64: 4b ff aa a9 bl ffc0d90c <_User_extensions_Iterate>
_User_extensions_Thread_begin( executing );
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
ffc12e68: 4b ff 9c 59 bl ffc0cac0 <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (doCons) /* && (volatile void *)_init) */ {
ffc12e6c: 2f 9e 00 00 cmpwi cr7,r30,0
ffc12e70: 41 9e 00 40 beq- cr7,ffc12eb0 <_Thread_Handler+0xa4>
_Thread_Enable_dispatch();
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
ffc12e74: 81 3f 00 90 lwz r9,144(r31)
ffc12e78: 2f 89 00 00 cmpwi cr7,r9,0
ffc12e7c: 41 9e 00 3c beq- cr7,ffc12eb8 <_Thread_Handler+0xac>
(*(Thread_Entry_numeric) executing->Start.entry_point)(
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
ffc12e80: 2f 89 00 01 cmpwi cr7,r9,1
ffc12e84: 41 9e 00 4c beq- cr7,ffc12ed0 <_Thread_Handler+0xc4> <== ALWAYS TAKEN
}
}
static inline void _User_extensions_Thread_exitted( Thread_Control *executing )
{
_User_extensions_Iterate(
ffc12e88: 3c 80 ff c1 lis r4,-63
ffc12e8c: 7f e3 fb 78 mr r3,r31
ffc12e90: 38 84 d8 d4 addi r4,r4,-10028
ffc12e94: 4b ff aa 79 bl ffc0d90c <_User_extensions_Iterate>
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
_Internal_error_Occurred(
ffc12e98: 38 60 00 00 li r3,0
ffc12e9c: 38 80 00 01 li r4,1
ffc12ea0: 38 a0 00 05 li r5,5
ffc12ea4: 4b ff 84 cd bl ffc0b370 <_Internal_error_Occurred>
_CPU_MSR_GET(msr);
if (!(level & CPU_MODES_INTERRUPT_MASK)) {
msr |= ppc_interrupt_get_disable_mask();
}
else {
msr &= ~ppc_interrupt_get_disable_mask();
ffc12ea8: 7d 29 50 78 andc r9,r9,r10
ffc12eac: 4b ff ff 98 b ffc12e44 <_Thread_Handler+0x38>
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (doCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
ffc12eb0: 48 00 bb ed bl ffc1ea9c <_init>
ffc12eb4: 4b ff ff c0 b ffc12e74 <_Thread_Handler+0x68>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
ffc12eb8: 81 3f 00 8c lwz r9,140(r31)
ffc12ebc: 80 7f 00 98 lwz r3,152(r31)
ffc12ec0: 7d 29 03 a6 mtctr r9
ffc12ec4: 4e 80 04 21 bctrl
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
ffc12ec8: 90 7f 00 28 stw r3,40(r31)
ffc12ecc: 4b ff ff bc b ffc12e88 <_Thread_Handler+0x7c>
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
ffc12ed0: 81 3f 00 8c lwz r9,140(r31)
ffc12ed4: 80 7f 00 94 lwz r3,148(r31)
ffc12ed8: 7d 29 03 a6 mtctr r9
ffc12edc: 4e 80 04 21 bctrl
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
ffc12ee0: 90 7f 00 28 stw r3,40(r31)
ffc12ee4: 4b ff ff a4 b ffc12e88 <_Thread_Handler+0x7c>
ffc0ce0c <_Thread_Handler_initialization>:
#include <rtems/bspsmp.h>
#endif
void _Thread_Handler_initialization(void)
{
uint32_t ticks_per_timeslice =
ffc0ce0c: 3d 20 ff c2 lis r9,-62
#if defined(RTEMS_SMP)
#include <rtems/bspsmp.h>
#endif
void _Thread_Handler_initialization(void)
{
ffc0ce10: 94 21 ff f0 stwu r1,-16(r1)
uint32_t ticks_per_timeslice =
ffc0ce14: 39 29 ea f8 addi r9,r9,-5384
#if defined(RTEMS_SMP)
#include <rtems/bspsmp.h>
#endif
void _Thread_Handler_initialization(void)
{
ffc0ce18: 7c 08 02 a6 mflr r0
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
ffc0ce1c: 81 49 00 28 lwz r10,40(r9)
#if defined(RTEMS_SMP)
#include <rtems/bspsmp.h>
#endif
void _Thread_Handler_initialization(void)
{
ffc0ce20: 93 c1 00 08 stw r30,8(r1)
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
ffc0ce24: 2f 8a 00 00 cmpwi cr7,r10,0
#if defined(RTEMS_SMP)
#include <rtems/bspsmp.h>
#endif
void _Thread_Handler_initialization(void)
{
ffc0ce28: 93 e1 00 0c stw r31,12(r1)
ffc0ce2c: 90 01 00 14 stw r0,20(r1)
uint32_t ticks_per_timeslice =
ffc0ce30: 83 e9 00 14 lwz r31,20(r9)
rtems_configuration_get_ticks_per_timeslice();
uint32_t maximum_extensions =
ffc0ce34: 83 c9 00 08 lwz r30,8(r9)
rtems_configuration_get_maximum_extensions();
rtems_stack_allocate_init_hook stack_allocate_init_hook =
ffc0ce38: 81 49 00 24 lwz r10,36(r9)
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
ffc0ce3c: 41 9e 00 90 beq- cr7,ffc0cecc <_Thread_Handler_initialization+0xc0><== NEVER TAKEN
ffc0ce40: 81 09 00 2c lwz r8,44(r9)
ffc0ce44: 2f 88 00 00 cmpwi cr7,r8,0
ffc0ce48: 41 9e 00 84 beq- cr7,ffc0cecc <_Thread_Handler_initialization+0xc0>
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_BAD_STACK_HOOK
);
if ( stack_allocate_init_hook != NULL )
ffc0ce4c: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ce50: 41 9e 00 10 beq- cr7,ffc0ce60 <_Thread_Handler_initialization+0x54>
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
ffc0ce54: 80 69 00 04 lwz r3,4(r9)
ffc0ce58: 7d 49 03 a6 mtctr r10
ffc0ce5c: 4e 80 04 21 bctrl
_Thread_Dispatch_necessary = false;
ffc0ce60: 3d 60 00 00 lis r11,0
ffc0ce64: 39 6b 31 a0 addi r11,r11,12704
ffc0ce68: 38 00 00 00 li r0,0
ffc0ce6c: 98 0b 00 0c stb r0,12(r11)
_Thread_Executing = NULL;
ffc0ce70: 39 40 00 00 li r10,0
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ce74: 3c 60 00 00 lis r3,0
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
ffc0ce78: 80 01 00 14 lwz r0,20(r1)
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ce7c: 38 63 2d f4 addi r3,r3,11764
if ( stack_allocate_init_hook != NULL )
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
_Thread_Dispatch_necessary = false;
_Thread_Executing = NULL;
ffc0ce80: 91 4b 00 10 stw r10,16(r11)
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ce84: 38 80 00 01 li r4,1
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
ffc0ce88: 7c 08 03 a6 mtlr r0
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ce8c: 38 a0 00 01 li r5,1
if ( stack_allocate_init_hook != NULL )
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
_Thread_Dispatch_necessary = false;
_Thread_Executing = NULL;
_Thread_Heir = NULL;
ffc0ce90: 91 4b 00 14 stw r10,20(r11)
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
ffc0ce94: 3d 60 00 00 lis r11,0
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ce98: 38 c0 00 01 li r6,1
_Thread_Dispatch_necessary = false;
_Thread_Executing = NULL;
_Thread_Heir = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
ffc0ce9c: 91 4b 28 6c stw r10,10348(r11)
#endif
_Thread_Maximum_extensions = maximum_extensions;
ffc0cea0: 3d 40 00 00 lis r10,0
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0cea4: 38 e0 01 60 li r7,352
_Thread_Heir = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
#endif
_Thread_Maximum_extensions = maximum_extensions;
ffc0cea8: 93 ca 28 74 stw r30,10356(r10)
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
ffc0ceac: 3d 40 00 00 lis r10,0
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ceb0: 39 00 00 00 li r8,0
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
ffc0ceb4: 83 c1 00 08 lwz r30,8(r1)
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0ceb8: 39 20 00 08 li r9,8
_Thread_Allocated_fp = NULL;
#endif
_Thread_Maximum_extensions = maximum_extensions;
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
ffc0cebc: 93 ea 28 64 stw r31,10340(r10)
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
ffc0cec0: 83 e1 00 0c lwz r31,12(r1)
ffc0cec4: 38 21 00 10 addi r1,r1,16
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
ffc0cec8: 4b ff eb a0 b ffc0ba68 <_Objects_Initialize_information>
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
rtems_configuration_get_stack_free_hook() == NULL)
_Internal_error_Occurred(
ffc0cecc: 38 60 00 00 li r3,0
ffc0ced0: 38 80 00 01 li r4,1
ffc0ced4: 38 a0 00 0e li r5,14
ffc0ced8: 4b ff e4 99 bl ffc0b370 <_Internal_error_Occurred>
ffc0cb74 <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
ffc0cb74: 94 21 ff b8 stwu r1,-72(r1)
ffc0cb78: 7c 08 02 a6 mflr r0
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
ffc0cb7c: 39 60 00 00 li r11,0
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
ffc0cb80: 93 c1 00 40 stw r30,64(r1)
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
ffc0cb84: 7c be 2b 79 mr. r30,r5
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
ffc0cb88: 90 01 00 4c stw r0,76(r1)
ffc0cb8c: 93 81 00 38 stw r28,56(r1)
ffc0cb90: 7d 5c 53 78 mr r28,r10
ffc0cb94: 81 41 00 58 lwz r10,88(r1)
ffc0cb98: 92 e1 00 24 stw r23,36(r1)
ffc0cb9c: 7d 37 4b 78 mr r23,r9
ffc0cba0: 93 41 00 30 stw r26,48(r1)
ffc0cba4: 7c 7a 1b 78 mr r26,r3
ffc0cba8: 93 61 00 34 stw r27,52(r1)
ffc0cbac: 93 a1 00 3c stw r29,60(r1)
ffc0cbb0: 7d 1d 43 78 mr r29,r8
ffc0cbb4: 93 e1 00 44 stw r31,68(r1)
ffc0cbb8: 7c 9f 23 78 mr r31,r4
ffc0cbbc: 93 01 00 28 stw r24,40(r1)
ffc0cbc0: 93 21 00 2c stw r25,44(r1)
ffc0cbc4: 83 6a 00 00 lwz r27,0(r10)
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
ffc0cbc8: 91 64 01 4c stw r11,332(r4)
ffc0cbcc: 91 64 01 50 stw r11,336(r4)
extensions_area = NULL;
the_thread->libc_reent = NULL;
ffc0cbd0: 91 64 01 48 stw r11,328(r4)
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
ffc0cbd4: 41 82 01 ec beq- ffc0cdc0 <_Thread_Initialize+0x24c>
stack = the_thread->Start.stack;
the_thread->Start.core_allocated_stack = true;
} else {
stack = stack_area;
actual_stack_size = stack_size;
the_thread->Start.core_allocated_stack = false;
ffc0cbd8: 99 64 00 b0 stb r11,176(r4)
ffc0cbdc: 7c ca 33 78 mr r10,r6
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
ffc0cbe0: 2f 87 00 00 cmpwi cr7,r7,0
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
ffc0cbe4: 93 df 00 b8 stw r30,184(r31)
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
ffc0cbe8: 3b c0 00 00 li r30,0
the_stack->size = size;
ffc0cbec: 91 5f 00 b4 stw r10,180(r31)
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
ffc0cbf0: 40 9e 01 64 bne- cr7,ffc0cd54 <_Thread_Initialize+0x1e0>
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
ffc0cbf4: 3f 00 00 00 lis r24,0
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area )
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
ffc0cbf8: 93 df 01 44 stw r30,324(r31)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
ffc0cbfc: 38 e0 00 00 li r7,0
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
ffc0cc00: 81 58 28 74 lwz r10,10356(r24)
if ( !fp_area )
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
the_thread->Start.fp_context = fp_area;
ffc0cc04: 93 df 00 bc stw r30,188(r31)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
ffc0cc08: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0cc0c: 90 ff 00 50 stw r7,80(r31)
the_watchdog->routine = routine;
ffc0cc10: 90 ff 00 64 stw r7,100(r31)
the_watchdog->id = id;
ffc0cc14: 90 ff 00 68 stw r7,104(r31)
the_watchdog->user_data = user_data;
ffc0cc18: 90 ff 00 6c stw r7,108(r31)
ffc0cc1c: 40 9e 01 54 bne- cr7,ffc0cd70 <_Thread_Initialize+0x1fc>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
ffc0cc20: 91 5f 01 54 stw r10,340(r31)
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
ffc0cc24: 3b 20 00 00 li r25,0
the_thread->Start.is_preemptible = is_preemptible;
the_thread->Start.budget_algorithm = budget_algorithm;
the_thread->Start.budget_callout = budget_callout;
switch ( budget_algorithm ) {
ffc0cc28: 2f 9c 00 02 cmpwi cr7,r28,2
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
the_thread->Start.budget_algorithm = budget_algorithm;
the_thread->Start.budget_callout = budget_callout;
ffc0cc2c: 81 21 00 50 lwz r9,80(r1)
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
ffc0cc30: 9a ff 00 9c stb r23,156(r31)
the_thread->Start.budget_algorithm = budget_algorithm;
ffc0cc34: 93 9f 00 a0 stw r28,160(r31)
the_thread->Start.budget_callout = budget_callout;
ffc0cc38: 91 3f 00 a4 stw r9,164(r31)
switch ( budget_algorithm ) {
ffc0cc3c: 40 be 00 10 bne+ cr7,ffc0cc4c <_Thread_Initialize+0xd8>
case THREAD_CPU_BUDGET_ALGORITHM_NONE:
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
ffc0cc40: 3d 20 00 00 lis r9,0
ffc0cc44: 81 29 28 64 lwz r9,10340(r9)
ffc0cc48: 91 3f 00 74 stw r9,116(r31)
}
the_thread->Start.isr_level = isr_level;
the_thread->current_state = STATES_DORMANT;
the_thread->Wait.queue = NULL;
ffc0cc4c: 39 20 00 00 li r9,0
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
ffc0cc50: 81 41 00 54 lwz r10,84(r1)
the_thread->current_state = STATES_DORMANT;
the_thread->Wait.queue = NULL;
ffc0cc54: 91 3f 00 44 stw r9,68(r31)
#endif
}
the_thread->Start.isr_level = isr_level;
the_thread->current_state = STATES_DORMANT;
ffc0cc58: 3b 80 00 01 li r28,1
*/
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.allocate( the_thread );
ffc0cc5c: 7f e3 fb 78 mr r3,r31
the_thread->Wait.queue = NULL;
the_thread->resource_count = 0;
ffc0cc60: 91 3f 00 1c stw r9,28(r31)
ffc0cc64: 3d 20 00 00 lis r9,0
ffc0cc68: 81 29 20 98 lwz r9,8344(r9)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
ffc0cc6c: 91 5f 00 a8 stw r10,168(r31)
ffc0cc70: 7d 29 03 a6 mtctr r9
the_thread->current_state = STATES_DORMANT;
ffc0cc74: 93 9f 00 10 stw r28,16(r31)
the_thread->Wait.queue = NULL;
the_thread->resource_count = 0;
the_thread->real_priority = priority;
ffc0cc78: 93 bf 00 18 stw r29,24(r31)
the_thread->Start.initial_priority = priority;
ffc0cc7c: 93 bf 00 ac stw r29,172(r31)
ffc0cc80: 4e 80 04 21 bctrl
sched =_Scheduler_Allocate( the_thread );
if ( !sched )
ffc0cc84: 7c 78 1b 79 mr. r24,r3
ffc0cc88: 41 82 00 5c beq- ffc0cce4 <_Thread_Initialize+0x170>
goto failed;
_Thread_Set_priority( the_thread, priority );
ffc0cc8c: 7f e3 fb 78 mr r3,r31
ffc0cc90: 7f a4 eb 78 mr r4,r29
ffc0cc94: 48 00 09 01 bl ffc0d594 <_Thread_Set_priority>
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
ffc0cc98: a1 3f 00 0a lhz r9,10(r31)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc0cc9c: 81 1a 00 1c lwz r8,28(r26)
static inline void _Timestamp64_implementation_Set_to_zero(
Timestamp64_Control *_time
)
{
*_time = 0;
ffc0cca0: 39 40 00 00 li r10,0
ffc0cca4: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc0cca8: 91 5f 00 80 stw r10,128(r31)
ffc0ccac: 39 60 00 00 li r11,0
ffc0ccb0: 91 7f 00 84 stw r11,132(r31)
static inline bool _User_extensions_Thread_create( Thread_Control *created )
{
User_extensions_Thread_create_context ctx = { created, true };
_User_extensions_Iterate( &ctx, _User_extensions_Thread_create_visitor );
ffc0ccb4: 3c 80 ff c1 lis r4,-63
ffc0ccb8: 38 61 00 08 addi r3,r1,8
ffc0ccbc: 7f e8 49 2e stwx r31,r8,r9
ffc0ccc0: 38 84 d8 14 addi r4,r4,-10220
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
ffc0ccc4: 93 7f 00 0c stw r27,12(r31)
* @{
*/
static inline bool _User_extensions_Thread_create( Thread_Control *created )
{
User_extensions_Thread_create_context ctx = { created, true };
ffc0ccc8: 93 e1 00 08 stw r31,8(r1)
ffc0cccc: 9b 81 00 0c stb r28,12(r1)
_User_extensions_Iterate( &ctx, _User_extensions_Thread_create_visitor );
ffc0ccd0: 48 00 0c 3d bl ffc0d90c <_User_extensions_Iterate>
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
ffc0ccd4: 38 60 00 01 li r3,1
return ctx.ok;
ffc0ccd8: 89 21 00 0c lbz r9,12(r1)
* user extensions with dispatching enabled. The Allocator
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
ffc0ccdc: 2f 89 00 00 cmpwi cr7,r9,0
ffc0cce0: 40 9e 00 40 bne- cr7,ffc0cd20 <_Thread_Initialize+0x1ac>
return true;
failed:
_Workspace_Free( the_thread->libc_reent );
ffc0cce4: 80 7f 01 48 lwz r3,328(r31)
ffc0cce8: 48 00 12 9d bl ffc0df84 <_Workspace_Free>
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
_Workspace_Free( the_thread->API_Extensions[i] );
ffc0ccec: 80 7f 01 4c lwz r3,332(r31)
ffc0ccf0: 48 00 12 95 bl ffc0df84 <_Workspace_Free>
ffc0ccf4: 80 7f 01 50 lwz r3,336(r31)
ffc0ccf8: 48 00 12 8d bl ffc0df84 <_Workspace_Free>
_Workspace_Free( extensions_area );
ffc0ccfc: 7f 23 cb 78 mr r3,r25
ffc0cd00: 48 00 12 85 bl ffc0df84 <_Workspace_Free>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Workspace_Free( fp_area );
ffc0cd04: 7f c3 f3 78 mr r3,r30
ffc0cd08: 48 00 12 7d bl ffc0df84 <_Workspace_Free>
#endif
_Workspace_Free( sched );
ffc0cd0c: 7f 03 c3 78 mr r3,r24
ffc0cd10: 48 00 12 75 bl ffc0df84 <_Workspace_Free>
_Thread_Stack_Free( the_thread );
ffc0cd14: 7f e3 fb 78 mr r3,r31
ffc0cd18: 48 00 09 f5 bl ffc0d70c <_Thread_Stack_Free>
return false;
ffc0cd1c: 38 60 00 00 li r3,0
}
ffc0cd20: 80 01 00 4c lwz r0,76(r1)
ffc0cd24: 82 e1 00 24 lwz r23,36(r1)
ffc0cd28: 7c 08 03 a6 mtlr r0
ffc0cd2c: 83 01 00 28 lwz r24,40(r1)
ffc0cd30: 83 21 00 2c lwz r25,44(r1)
ffc0cd34: 83 41 00 30 lwz r26,48(r1)
ffc0cd38: 83 61 00 34 lwz r27,52(r1)
ffc0cd3c: 83 81 00 38 lwz r28,56(r1)
ffc0cd40: 83 a1 00 3c lwz r29,60(r1)
ffc0cd44: 83 c1 00 40 lwz r30,64(r1)
ffc0cd48: 83 e1 00 44 lwz r31,68(r1)
ffc0cd4c: 38 21 00 48 addi r1,r1,72
ffc0cd50: 4e 80 00 20 blr
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
ffc0cd54: 38 60 01 08 li r3,264
ffc0cd58: 48 00 12 15 bl ffc0df6c <_Workspace_Allocate>
if ( !fp_area )
ffc0cd5c: 7c 7e 1b 79 mr. r30,r3
ffc0cd60: 40 82 fe 94 bne+ ffc0cbf4 <_Thread_Initialize+0x80>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
ffc0cd64: 3b 20 00 00 li r25,0
size_t actual_stack_size = 0;
void *stack = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
void *fp_area;
#endif
void *sched = NULL;
ffc0cd68: 3b 00 00 00 li r24,0
ffc0cd6c: 4b ff ff 78 b ffc0cce4 <_Thread_Initialize+0x170>
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
ffc0cd70: 38 6a 00 01 addi r3,r10,1
ffc0cd74: 54 63 10 3a rlwinm r3,r3,2,0,29
ffc0cd78: 48 00 11 f5 bl ffc0df6c <_Workspace_Allocate>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
ffc0cd7c: 7c 79 1b 79 mr. r25,r3
ffc0cd80: 41 82 00 84 beq- ffc0ce04 <_Thread_Initialize+0x290>
goto failed;
}
the_thread->extensions = (void **) extensions_area;
ffc0cd84: 93 3f 01 54 stw r25,340(r31)
ffc0cd88: 7f 25 cb 78 mr r5,r25
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
ffc0cd8c: 38 c0 00 00 li r6,0
ffc0cd90: 80 18 28 74 lwz r0,10356(r24)
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
ffc0cd94: 38 e0 00 00 li r7,0
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
the_thread->extensions[i] = NULL;
ffc0cd98: 39 60 00 00 li r11,0
ffc0cd9c: 48 00 00 08 b ffc0cda4 <_Thread_Initialize+0x230>
ffc0cda0: 80 bf 01 54 lwz r5,340(r31)
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
ffc0cda4: 38 e7 00 01 addi r7,r7,1
ffc0cda8: 7f 87 00 40 cmplw cr7,r7,r0
the_thread->extensions[i] = NULL;
ffc0cdac: 54 c6 10 3a rlwinm r6,r6,2,0,29
ffc0cdb0: 7d 65 31 2e stwx r11,r5,r6
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
ffc0cdb4: 7c e6 3b 78 mr r6,r7
ffc0cdb8: 40 9d ff e8 ble+ cr7,ffc0cda0 <_Thread_Initialize+0x22c>
ffc0cdbc: 4b ff fe 6c b ffc0cc28 <_Thread_Initialize+0xb4>
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
ffc0cdc0: 7c 83 23 78 mr r3,r4
ffc0cdc4: 90 c1 00 18 stw r6,24(r1)
ffc0cdc8: 7c c4 33 78 mr r4,r6
ffc0cdcc: 90 e1 00 1c stw r7,28(r1)
ffc0cdd0: 48 00 08 ad bl ffc0d67c <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
ffc0cdd4: 7c 6a 1b 79 mr. r10,r3
ffc0cdd8: 80 c1 00 18 lwz r6,24(r1)
return false; /* stack allocation failed */
ffc0cddc: 38 60 00 00 li r3,0
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
ffc0cde0: 80 e1 00 1c lwz r7,28(r1)
ffc0cde4: 41 a2 ff 3c beq- ffc0cd20 <_Thread_Initialize+0x1ac>
ffc0cde8: 7f 86 50 40 cmplw cr7,r6,r10
return false; /* stack allocation failed */
ffc0cdec: 7f c3 f3 78 mr r3,r30
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
ffc0cdf0: 41 bd ff 30 bgt- cr7,ffc0cd20 <_Thread_Initialize+0x1ac><== NEVER TAKEN
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
the_thread->Start.core_allocated_stack = true;
ffc0cdf4: 39 20 00 01 li r9,1
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
ffc0cdf8: 83 df 00 c0 lwz r30,192(r31)
the_thread->Start.core_allocated_stack = true;
ffc0cdfc: 99 3f 00 b0 stb r9,176(r31)
ffc0ce00: 4b ff fd e0 b ffc0cbe0 <_Thread_Initialize+0x6c>
size_t actual_stack_size = 0;
void *stack = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
void *fp_area;
#endif
void *sched = NULL;
ffc0ce04: 3b 00 00 00 li r24,0
ffc0ce08: 4b ff fe dc b ffc0cce4 <_Thread_Initialize+0x170>
ffc0df58 <_Thread_Restart>:
bool _Thread_Restart(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
ffc0df58: 94 21 ff e8 stwu r1,-24(r1)
ffc0df5c: 7c 08 02 a6 mflr r0
ffc0df60: 90 01 00 1c stw r0,28(r1)
*/
RTEMS_INLINE_ROUTINE bool _States_Is_dormant (
States_Control the_states
)
{
return (the_states & STATES_DORMANT);
ffc0df64: 81 23 00 10 lwz r9,16(r3)
ffc0df68: 93 e1 00 14 stw r31,20(r1)
ffc0df6c: 7c 7f 1b 78 mr r31,r3
if ( !_States_Is_dormant( the_thread->current_state ) ) {
ffc0df70: 71 2a 00 01 andi. r10,r9,1
bool _Thread_Restart(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
ffc0df74: 93 c1 00 10 stw r30,16(r1)
if ( !_States_Is_dormant( the_thread->current_state ) ) {
ffc0df78: 41 82 00 20 beq- ffc0df98 <_Thread_Restart+0x40>
_Thread_Restart_self();
return true;
}
return false;
ffc0df7c: 38 60 00 00 li r3,0
}
ffc0df80: 80 01 00 1c lwz r0,28(r1)
ffc0df84: 83 c1 00 10 lwz r30,16(r1)
ffc0df88: 7c 08 03 a6 mtlr r0
ffc0df8c: 83 e1 00 14 lwz r31,20(r1)
ffc0df90: 38 21 00 18 addi r1,r1,24
ffc0df94: 4e 80 00 20 blr
Thread_Entry_numeric_type numeric_argument
)
{
if ( !_States_Is_dormant( the_thread->current_state ) ) {
_Thread_Set_transient( the_thread );
ffc0df98: 90 81 00 08 stw r4,8(r1)
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
ffc0df9c: 3f c0 00 00 lis r30,0
ffc0dfa0: 3b de 31 e0 addi r30,r30,12768
ffc0dfa4: 90 a1 00 0c stw r5,12(r1)
ffc0dfa8: 48 00 00 f1 bl ffc0e098 <_Thread_Set_transient>
_Thread_Reset( the_thread, pointer_argument, numeric_argument );
ffc0dfac: 7f e3 fb 78 mr r3,r31
ffc0dfb0: 80 81 00 08 lwz r4,8(r1)
ffc0dfb4: 80 a1 00 0c lwz r5,12(r1)
ffc0dfb8: 48 00 39 ad bl ffc11964 <_Thread_Reset>
_Thread_Load_environment( the_thread );
ffc0dfbc: 7f e3 fb 78 mr r3,r31
ffc0dfc0: 48 00 36 61 bl ffc11620 <_Thread_Load_environment>
_Thread_Ready( the_thread );
ffc0dfc4: 7f e3 fb 78 mr r3,r31
ffc0dfc8: 48 00 39 4d bl ffc11914 <_Thread_Ready>
);
}
static inline void _User_extensions_Thread_restart( Thread_Control *restarted )
{
_User_extensions_Iterate(
ffc0dfcc: 3c 80 ff c1 lis r4,-63
ffc0dfd0: 7f e3 fb 78 mr r3,r31
ffc0dfd4: 38 84 e3 24 addi r4,r4,-7388
ffc0dfd8: 48 00 03 ad bl ffc0e384 <_User_extensions_Iterate>
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
ffc0dfdc: 81 3e 00 10 lwz r9,16(r30)
_Thread_Restart_self();
return true;
ffc0dfe0: 38 60 00 01 li r3,1
_Thread_Ready( the_thread );
_User_extensions_Thread_restart( the_thread );
if ( _Thread_Is_executing ( the_thread ) )
ffc0dfe4: 7f 9f 48 00 cmpw cr7,r31,r9
ffc0dfe8: 40 9e ff 98 bne+ cr7,ffc0df80 <_Thread_Restart+0x28>
*/
RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
{
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( _Thread_Executing->fp_context != NULL )
ffc0dfec: 81 3f 01 44 lwz r9,324(r31)
ffc0dff0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0dff4: 41 9e 00 0c beq- cr7,ffc0e000 <_Thread_Restart+0xa8> <== NEVER TAKEN
_Context_Restore_fp( &_Thread_Executing->fp_context );
ffc0dff8: 38 7f 01 44 addi r3,r31,324
ffc0dffc: 48 01 04 85 bl ffc1e480 <_CPU_Context_restore_fp>
#endif
_CPU_Context_Restart_self( &_Thread_Executing->Registers );
ffc0e000: 80 7e 00 10 lwz r3,16(r30)
ffc0e004: 38 63 00 c4 addi r3,r3,196
ffc0e008: 48 01 06 0d bl ffc1e614 <_CPU_Context_restore>
ffc0d49c <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
ffc0d49c: 94 21 ff d8 stwu r1,-40(r1)
ffc0d4a0: 7c 08 02 a6 mflr r0
ffc0d4a4: 93 e1 00 24 stw r31,36(r1)
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
ffc0d4a8: 7c 7f 1b 79 mr. r31,r3
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
ffc0d4ac: 90 01 00 2c stw r0,44(r1)
ffc0d4b0: 93 a1 00 1c stw r29,28(r1)
ffc0d4b4: 93 c1 00 20 stw r30,32(r1)
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
ffc0d4b8: 41 82 00 10 beq- ffc0d4c8 <_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 ) {
ffc0d4bc: 81 3f 00 34 lwz r9,52(r31)
ffc0d4c0: 2f 89 00 01 cmpwi cr7,r9,1
ffc0d4c4: 41 9e 00 20 beq- cr7,ffc0d4e4 <_Thread_queue_Requeue+0x48><== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
ffc0d4c8: 80 01 00 2c lwz r0,44(r1) <== NOT EXECUTED
ffc0d4cc: 83 a1 00 1c lwz r29,28(r1) <== NOT EXECUTED
ffc0d4d0: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0d4d4: 83 c1 00 20 lwz r30,32(r1) <== NOT EXECUTED
ffc0d4d8: 83 e1 00 24 lwz r31,36(r1) <== NOT EXECUTED
ffc0d4dc: 38 21 00 28 addi r1,r1,40 <== NOT EXECUTED
ffc0d4e0: 4e 80 00 20 blr <== NOT EXECUTED
ffc0d4e4: 7c 9e 23 78 mr r30,r4
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0d4e8: 7f a0 00 a6 mfmsr r29
ffc0d4ec: 7d 50 42 a6 mfsprg r10,0
ffc0d4f0: 7f aa 50 78 andc r10,r29,r10
ffc0d4f4: 7d 40 01 24 mtmsr r10
ffc0d4f8: 3d 00 00 03 lis r8,3
ffc0d4fc: 81 44 00 10 lwz r10,16(r4)
ffc0d500: 61 08 be e0 ori r8,r8,48864
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
ffc0d504: 7d 07 50 39 and. r7,r8,r10
ffc0d508: 40 82 00 24 bne- ffc0d52c <_Thread_queue_Requeue+0x90> <== ALWAYS TAKEN
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0d50c: 7f a0 01 24 mtmsr r29 <== NOT EXECUTED
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
ffc0d510: 80 01 00 2c lwz r0,44(r1)
ffc0d514: 83 a1 00 1c lwz r29,28(r1)
ffc0d518: 7c 08 03 a6 mtlr r0
ffc0d51c: 83 c1 00 20 lwz r30,32(r1)
ffc0d520: 83 e1 00 24 lwz r31,36(r1)
ffc0d524: 38 21 00 28 addi r1,r1,40
ffc0d528: 4e 80 00 20 blr
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;
ffc0d52c: 91 3f 00 30 stw r9,48(r31)
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 );
ffc0d530: 38 a0 00 01 li r5,1
ffc0d534: 48 00 38 21 bl ffc10d54 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
ffc0d538: 7f e3 fb 78 mr r3,r31
ffc0d53c: 7f c4 f3 78 mr r4,r30
ffc0d540: 38 a1 00 08 addi r5,r1,8
ffc0d544: 4b ff fc 69 bl ffc0d1ac <_Thread_queue_Enqueue_priority>
ffc0d548: 7f a0 01 24 mtmsr r29
ffc0d54c: 4b ff ff c4 b ffc0d510 <_Thread_queue_Requeue+0x74>
ffc0d550 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
ffc0d550: 94 21 ff e8 stwu r1,-24(r1)
ffc0d554: 7c 08 02 a6 mflr r0
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
ffc0d558: 38 81 00 08 addi r4,r1,8
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
ffc0d55c: 90 01 00 1c stw r0,28(r1)
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
ffc0d560: 4b ff f5 7d bl ffc0cadc <_Thread_Get>
switch ( location ) {
ffc0d564: 81 21 00 08 lwz r9,8(r1)
ffc0d568: 2f 89 00 00 cmpwi cr7,r9,0
ffc0d56c: 40 9e 00 18 bne- cr7,ffc0d584 <_Thread_queue_Timeout+0x34><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
ffc0d570: 48 00 38 e1 bl ffc10e50 <_Thread_queue_Process_timeout>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0d574: 3d 20 00 00 lis r9,0
ffc0d578: 81 49 28 68 lwz r10,10344(r9)
--level;
ffc0d57c: 39 4a ff ff addi r10,r10,-1
_Thread_Dispatch_disable_level = level;
ffc0d580: 91 49 28 68 stw r10,10344(r9)
_Thread_Unnest_dispatch();
break;
}
}
ffc0d584: 80 01 00 1c lwz r0,28(r1)
ffc0d588: 38 21 00 18 addi r1,r1,24
ffc0d58c: 7c 08 03 a6 mtlr r0
ffc0d590: 4e 80 00 20 blr
ffc1d878 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
ffc1d878: 94 21 ff 98 stwu r1,-104(r1)
ffc1d87c: 7c 08 02 a6 mflr r0
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
ffc1d880: 39 20 00 00 li r9,0
ffc1d884: 92 c1 00 40 stw r22,64(r1)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc1d888: 3a c1 00 14 addi r22,r1,20
ffc1d88c: 93 01 00 48 stw r24,72(r1)
ffc1d890: 3b 01 00 0c addi r24,r1,12
ffc1d894: 93 61 00 54 stw r27,84(r1)
ffc1d898: 3b 61 00 18 addi r27,r1,24
ffc1d89c: 93 a1 00 5c stw r29,92(r1)
head->previous = NULL;
tail->previous = head;
ffc1d8a0: 3b a1 00 08 addi r29,r1,8
ffc1d8a4: 92 a1 00 3c stw r21,60(r1)
ffc1d8a8: 3e a0 00 00 lis r21,0
ffc1d8ac: 3a b5 29 3c addi r21,r21,10556
ffc1d8b0: 93 21 00 4c stw r25,76(r1)
ffc1d8b4: 3f 20 00 00 lis r25,0
ffc1d8b8: 3b 39 29 5c addi r25,r25,10588
ffc1d8bc: 93 41 00 50 stw r26,80(r1)
ffc1d8c0: 3f 40 00 00 lis r26,0
ffc1d8c4: 3b 5a 70 80 addi r26,r26,28800
ffc1d8c8: 90 01 00 6c stw r0,108(r1)
ffc1d8cc: 92 01 00 28 stw r16,40(r1)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc1d8d0: 93 61 00 14 stw r27,20(r1)
head->previous = NULL;
ffc1d8d4: 91 21 00 18 stw r9,24(r1)
tail->previous = head;
ffc1d8d8: 92 c1 00 1c stw r22,28(r1)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc1d8dc: 93 01 00 08 stw r24,8(r1)
head->previous = NULL;
ffc1d8e0: 91 21 00 0c stw r9,12(r1)
tail->previous = head;
ffc1d8e4: 93 a1 00 10 stw r29,16(r1)
ffc1d8e8: 92 21 00 2c stw r17,44(r1)
ffc1d8ec: 3a 23 00 08 addi r17,r3,8
ffc1d8f0: 92 41 00 30 stw r18,48(r1)
ffc1d8f4: 3a 43 00 40 addi r18,r3,64
ffc1d8f8: 92 61 00 34 stw r19,52(r1)
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
ffc1d8fc: 3a 60 00 00 li r19,0
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
ffc1d900: 92 81 00 38 stw r20,56(r1)
_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;
ffc1d904: 3a 80 00 01 li r20,1
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
ffc1d908: 92 e1 00 44 stw r23,68(r1)
* 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;
ffc1d90c: 3a e0 00 00 li r23,0
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
ffc1d910: 93 81 00 58 stw r28,88(r1)
ffc1d914: 3b 83 00 30 addi r28,r3,48
ffc1d918: 93 c1 00 60 stw r30,96(r1)
ffc1d91c: 3b c3 00 68 addi r30,r3,104
ffc1d920: 93 e1 00 64 stw r31,100(r1)
ffc1d924: 7c 7f 1b 78 mr r31,r3
{
/*
* 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;
ffc1d928: 92 df 00 78 stw r22,120(r31)
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
ffc1d92c: 81 39 00 00 lwz r9,0(r25)
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
ffc1d930: 7f 83 e3 78 mr r3,r28
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
ffc1d934: 80 9f 00 3c lwz r4,60(r31)
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
ffc1d938: 7f a5 eb 78 mr r5,r29
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
ffc1d93c: 91 3f 00 3c stw r9,60(r31)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
ffc1d940: 7c 84 48 50 subf r4,r4,r9
ffc1d944: 48 00 52 b9 bl ffc22bfc <_Watchdog_Adjust_to_chain>
ffc1d948: 80 7a 00 00 lwz r3,0(r26)
ffc1d94c: 80 9a 00 04 lwz r4,4(r26)
ffc1d950: 3c c0 3b 9a lis r6,15258
ffc1d954: 38 a0 00 00 li r5,0
ffc1d958: 60 c6 ca 00 ori r6,r6,51712
ffc1d95c: 48 01 60 69 bl ffc339c4 <__divdi3>
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
ffc1d960: 80 bf 00 74 lwz r5,116(r31)
ffc1d964: 7c 90 23 78 mr r16,r4
/*
* 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 ) {
ffc1d968: 7f 84 28 40 cmplw cr7,r4,r5
ffc1d96c: 41 9d 00 94 bgt- cr7,ffc1da00 <_Timer_server_Body+0x188>
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
ffc1d970: 41 9c 00 6c blt- cr7,ffc1d9dc <_Timer_server_Body+0x164>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
ffc1d974: 92 1f 00 74 stw r16,116(r31)
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
ffc1d978: 80 7f 00 78 lwz r3,120(r31)
ffc1d97c: 48 00 0b 31 bl ffc1e4ac <_Chain_Get>
if ( timer == NULL ) {
ffc1d980: 7c 64 1b 79 mr. r4,r3
ffc1d984: 41 82 00 34 beq- ffc1d9b8 <_Timer_server_Body+0x140>
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
ffc1d988: 81 24 00 38 lwz r9,56(r4)
ffc1d98c: 2f 89 00 01 cmpwi cr7,r9,1
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
ffc1d990: 2f 09 00 03 cmpwi cr6,r9,3
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
ffc1d994: 41 9e 00 5c beq- cr7,ffc1d9f0 <_Timer_server_Body+0x178>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
ffc1d998: 40 9a ff e0 bne+ cr6,ffc1d978 <_Timer_server_Body+0x100><== NEVER TAKEN
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
ffc1d99c: 38 84 00 10 addi r4,r4,16
ffc1d9a0: 7f c3 f3 78 mr r3,r30
ffc1d9a4: 48 00 52 fd bl ffc22ca0 <_Watchdog_Insert>
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
ffc1d9a8: 80 7f 00 78 lwz r3,120(r31)
ffc1d9ac: 48 00 0b 01 bl ffc1e4ac <_Chain_Get>
if ( timer == NULL ) {
ffc1d9b0: 7c 64 1b 79 mr. r4,r3
ffc1d9b4: 40 82 ff d4 bne+ ffc1d988 <_Timer_server_Body+0x110> <== NEVER TAKEN
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc1d9b8: 7d 40 00 a6 mfmsr r10
ffc1d9bc: 7d 30 42 a6 mfsprg r9,0
ffc1d9c0: 7d 49 48 78 andc r9,r10,r9
ffc1d9c4: 7d 20 01 24 mtmsr r9
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
if ( _Chain_Is_empty( insert_chain ) ) {
ffc1d9c8: 81 21 00 14 lwz r9,20(r1)
ffc1d9cc: 7f 89 d8 00 cmpw cr7,r9,r27
ffc1d9d0: 41 9e 00 44 beq- cr7,ffc1da14 <_Timer_server_Body+0x19c><== ALWAYS TAKEN
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc1d9d4: 7d 40 01 24 mtmsr r10 <== NOT EXECUTED
ffc1d9d8: 4b ff ff 54 b ffc1d92c <_Timer_server_Body+0xb4> <== NOT EXECUTED
/*
* 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 );
ffc1d9dc: 7f c3 f3 78 mr r3,r30
ffc1d9e0: 38 80 00 01 li r4,1
ffc1d9e4: 7c b0 28 50 subf r5,r16,r5
ffc1d9e8: 48 00 51 01 bl ffc22ae8 <_Watchdog_Adjust>
ffc1d9ec: 4b ff ff 88 b ffc1d974 <_Timer_server_Body+0xfc>
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
ffc1d9f0: 7f 83 e3 78 mr r3,r28
ffc1d9f4: 38 84 00 10 addi r4,r4,16
ffc1d9f8: 48 00 52 a9 bl ffc22ca0 <_Watchdog_Insert>
ffc1d9fc: 4b ff ff 7c b ffc1d978 <_Timer_server_Body+0x100>
/*
* 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 );
ffc1da00: 7c 85 20 50 subf r4,r5,r4
ffc1da04: 7f c3 f3 78 mr r3,r30
ffc1da08: 7f a5 eb 78 mr r5,r29
ffc1da0c: 48 00 51 f1 bl ffc22bfc <_Watchdog_Adjust_to_chain>
ffc1da10: 4b ff ff 64 b ffc1d974 <_Timer_server_Body+0xfc>
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
ffc1da14: 90 9f 00 78 stw r4,120(r31)
ffc1da18: 7d 40 01 24 mtmsr r10
_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 ) ) {
ffc1da1c: 81 21 00 08 lwz r9,8(r1)
ffc1da20: 7f 89 c0 00 cmpw cr7,r9,r24
ffc1da24: 40 be 00 30 bne+ cr7,ffc1da54 <_Timer_server_Body+0x1dc>
ffc1da28: 48 00 00 50 b ffc1da78 <_Timer_server_Body+0x200>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
ffc1da2c: 81 49 00 00 lwz r10,0(r9)
head->next = new_first;
new_first->previous = head;
ffc1da30: 93 aa 00 04 stw r29,4(r10)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
ffc1da34: 91 41 00 08 stw r10,8(r1)
* 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;
ffc1da38: 92 e9 00 08 stw r23,8(r9)
ffc1da3c: 7d 00 01 24 mtmsr r8
/*
* 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 );
ffc1da40: 81 49 00 1c lwz r10,28(r9)
ffc1da44: 80 69 00 20 lwz r3,32(r9)
ffc1da48: 80 89 00 24 lwz r4,36(r9)
ffc1da4c: 7d 49 03 a6 mtctr r10
ffc1da50: 4e 80 04 21 bctrl
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc1da54: 7d 00 00 a6 mfmsr r8
ffc1da58: 7d 30 42 a6 mfsprg r9,0
ffc1da5c: 7d 09 48 78 andc r9,r8,r9
ffc1da60: 7d 20 01 24 mtmsr r9
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc1da64: 81 21 00 08 lwz r9,8(r1)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
ffc1da68: 7f 89 c0 00 cmpw cr7,r9,r24
ffc1da6c: 40 9e ff c0 bne+ cr7,ffc1da2c <_Timer_server_Body+0x1b4>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc1da70: 7d 00 01 24 mtmsr r8
ffc1da74: 4b ff fe b4 b ffc1d928 <_Timer_server_Body+0xb0>
}
} else {
ts->active = false;
ffc1da78: 9a 7f 00 7c stb r19,124(r31)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc1da7c: 81 35 00 00 lwz r9,0(r21)
++level;
ffc1da80: 39 29 00 01 addi r9,r9,1
_Thread_Dispatch_disable_level = level;
ffc1da84: 91 35 00 00 stw r9,0(r21)
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
ffc1da88: 80 7f 00 00 lwz r3,0(r31)
ffc1da8c: 38 80 00 08 li r4,8
ffc1da90: 48 00 4b 9d bl ffc2262c <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
ffc1da94: 7f e3 fb 78 mr r3,r31
ffc1da98: 4b ff fb 21 bl ffc1d5b8 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
ffc1da9c: 7f e3 fb 78 mr r3,r31
ffc1daa0: 4b ff fb a9 bl ffc1d648 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
ffc1daa4: 48 00 3f ed bl ffc21a90 <_Thread_Enable_dispatch>
ts->active = true;
ffc1daa8: 9a 9f 00 7c stb r20,124(r31)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
ffc1daac: 7e 23 8b 78 mr r3,r17
ffc1dab0: 48 00 53 b9 bl ffc22e68 <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
ffc1dab4: 7e 43 93 78 mr r3,r18
ffc1dab8: 48 00 53 b1 bl ffc22e68 <_Watchdog_Remove>
ffc1dabc: 4b ff fe 6c b ffc1d928 <_Timer_server_Body+0xb0>
ffc1d6d8 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
ffc1d6d8: 94 21 ff e8 stwu r1,-24(r1)
ffc1d6dc: 7c 08 02 a6 mflr r0
ffc1d6e0: 90 01 00 1c stw r0,28(r1)
if ( ts->insert_chain == NULL ) {
ffc1d6e4: 81 23 00 78 lwz r9,120(r3)
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
ffc1d6e8: 93 e1 00 14 stw r31,20(r1)
ffc1d6ec: 7c 7f 1b 78 mr r31,r3
if ( ts->insert_chain == NULL ) {
ffc1d6f0: 2f 89 00 00 cmpwi cr7,r9,0
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
ffc1d6f4: 93 a1 00 0c stw r29,12(r1)
ffc1d6f8: 93 c1 00 10 stw r30,16(r1)
if ( ts->insert_chain == NULL ) {
ffc1d6fc: 41 9e 00 24 beq- cr7,ffc1d720 <_Timer_server_Schedule_operation_method+0x48>
* 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 );
}
}
ffc1d700: 80 01 00 1c lwz r0,28(r1)
ffc1d704: 83 a1 00 0c lwz r29,12(r1)
ffc1d708: 7c 08 03 a6 mtlr r0
ffc1d70c: 83 c1 00 10 lwz r30,16(r1)
ffc1d710: 83 e1 00 14 lwz r31,20(r1)
* 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 );
ffc1d714: 80 63 00 78 lwz r3,120(r3)
}
}
ffc1d718: 38 21 00 18 addi r1,r1,24
* 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 );
ffc1d71c: 48 00 0d 60 b ffc1e47c <_Chain_Append>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc1d720: 3d 20 00 00 lis r9,0
ffc1d724: 81 49 29 3c lwz r10,10556(r9)
ffc1d728: 7c 9e 23 78 mr r30,r4
++level;
ffc1d72c: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc1d730: 91 49 29 3c stw r10,10556(r9)
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
ffc1d734: 81 24 00 38 lwz r9,56(r4)
ffc1d738: 2f 89 00 01 cmpwi cr7,r9,1
ffc1d73c: 41 9e 00 bc beq- cr7,ffc1d7f8 <_Timer_server_Schedule_operation_method+0x120>
_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 ) {
ffc1d740: 2f 89 00 03 cmpwi cr7,r9,3
ffc1d744: 41 9e 00 20 beq- cr7,ffc1d764 <_Timer_server_Schedule_operation_method+0x8c>
* 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 );
}
}
ffc1d748: 80 01 00 1c lwz r0,28(r1)
ffc1d74c: 83 a1 00 0c lwz r29,12(r1)
ffc1d750: 7c 08 03 a6 mtlr r0
ffc1d754: 83 c1 00 10 lwz r30,16(r1)
ffc1d758: 83 e1 00 14 lwz r31,20(r1)
ffc1d75c: 38 21 00 18 addi r1,r1,24
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
ffc1d760: 48 00 43 30 b ffc21a90 <_Thread_Enable_dispatch>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc1d764: 7f a0 00 a6 mfmsr r29
ffc1d768: 7d 30 42 a6 mfsprg r9,0
ffc1d76c: 7f a9 48 78 andc r9,r29,r9
ffc1d770: 7d 20 01 24 mtmsr r9
/*
* 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();
ffc1d774: 3d 20 00 00 lis r9,0
ffc1d778: 39 29 70 80 addi r9,r9,28800
ffc1d77c: 80 69 00 00 lwz r3,0(r9)
ffc1d780: 3c c0 3b 9a lis r6,15258
ffc1d784: 80 89 00 04 lwz r4,4(r9)
ffc1d788: 38 a0 00 00 li r5,0
ffc1d78c: 60 c6 ca 00 ori r6,r6,51712
ffc1d790: 48 01 62 35 bl ffc339c4 <__divdi3>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc1d794: 81 3f 00 68 lwz r9,104(r31)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc1d798: 39 5f 00 6c addi r10,r31,108
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
ffc1d79c: 7f 89 50 00 cmpw cr7,r9,r10
* 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();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
ffc1d7a0: 81 5f 00 74 lwz r10,116(r31)
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
ffc1d7a4: 41 9e 00 28 beq- cr7,ffc1d7cc <_Timer_server_Schedule_operation_method+0xf4>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
if ( snapshot > last_snapshot ) {
ffc1d7a8: 7f 84 50 40 cmplw cr7,r4,r10
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
ffc1d7ac: 80 e9 00 10 lwz r7,16(r9)
if ( snapshot > last_snapshot ) {
ffc1d7b0: 40 9d 00 bc ble- cr7,ffc1d86c <_Timer_server_Schedule_operation_method+0x194>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
ffc1d7b4: 7d 4a 20 50 subf r10,r10,r4
if (delta_interval > delta) {
ffc1d7b8: 7f 87 50 40 cmplw cr7,r7,r10
delta_interval -= delta;
} else {
delta_interval = 0;
ffc1d7bc: 39 00 00 00 li r8,0
if ( snapshot > last_snapshot ) {
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
ffc1d7c0: 40 9d 00 08 ble- cr7,ffc1d7c8 <_Timer_server_Schedule_operation_method+0xf0><== NEVER TAKEN
delta_interval -= delta;
ffc1d7c4: 7d 0a 38 50 subf r8,r10,r7
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
ffc1d7c8: 91 09 00 10 stw r8,16(r9)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
ffc1d7cc: 90 9f 00 74 stw r4,116(r31)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc1d7d0: 7f a0 01 24 mtmsr r29
_ISR_Enable( level );
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
ffc1d7d4: 38 7f 00 68 addi r3,r31,104
ffc1d7d8: 38 9e 00 10 addi r4,r30,16
ffc1d7dc: 48 00 54 c5 bl ffc22ca0 <_Watchdog_Insert>
if ( !ts->active ) {
ffc1d7e0: 89 3f 00 7c lbz r9,124(r31)
ffc1d7e4: 2f 89 00 00 cmpwi cr7,r9,0
ffc1d7e8: 40 9e ff 60 bne+ cr7,ffc1d748 <_Timer_server_Schedule_operation_method+0x70><== NEVER TAKEN
_Timer_server_Reset_tod_system_watchdog( ts );
ffc1d7ec: 7f e3 fb 78 mr r3,r31
ffc1d7f0: 4b ff fe 59 bl ffc1d648 <_Timer_server_Reset_tod_system_watchdog>
ffc1d7f4: 4b ff ff 54 b ffc1d748 <_Timer_server_Schedule_operation_method+0x70>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc1d7f8: 7c a0 00 a6 mfmsr r5
ffc1d7fc: 7d 30 42 a6 mfsprg r9,0
ffc1d800: 7c a9 48 78 andc r9,r5,r9
ffc1d804: 7d 20 01 24 mtmsr r9
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc1d808: 81 23 00 30 lwz r9,48(r3)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc1d80c: 39 43 00 34 addi r10,r3,52
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
last_snapshot = ts->Interval_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
ffc1d810: 7f 89 50 00 cmpw cr7,r9,r10
/*
* 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;
ffc1d814: 3d 40 00 00 lis r10,0
ffc1d818: 81 4a 29 5c lwz r10,10588(r10)
last_snapshot = ts->Interval_watchdogs.last_snapshot;
ffc1d81c: 80 e3 00 3c lwz r7,60(r3)
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
ffc1d820: 41 9e 00 20 beq- cr7,ffc1d840 <_Timer_server_Schedule_operation_method+0x168>
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
ffc1d824: 80 c9 00 10 lwz r6,16(r9)
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
ffc1d828: 7c e7 50 50 subf r7,r7,r10
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
ffc1d82c: 39 00 00 00 li r8,0
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
ffc1d830: 7f 87 30 40 cmplw cr7,r7,r6
ffc1d834: 40 9c 00 08 bge- cr7,ffc1d83c <_Timer_server_Schedule_operation_method+0x164>
delta_interval -= delta;
ffc1d838: 7d 07 30 50 subf r8,r7,r6
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
ffc1d83c: 91 09 00 10 stw r8,16(r9)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
ffc1d840: 91 5f 00 3c stw r10,60(r31)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc1d844: 7c a0 01 24 mtmsr r5
_ISR_Enable( level );
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
ffc1d848: 38 7f 00 30 addi r3,r31,48
ffc1d84c: 38 9e 00 10 addi r4,r30,16
ffc1d850: 48 00 54 51 bl ffc22ca0 <_Watchdog_Insert>
if ( !ts->active ) {
ffc1d854: 89 3f 00 7c lbz r9,124(r31)
ffc1d858: 2f 89 00 00 cmpwi cr7,r9,0
ffc1d85c: 40 9e fe ec bne+ cr7,ffc1d748 <_Timer_server_Schedule_operation_method+0x70>
_Timer_server_Reset_interval_system_watchdog( ts );
ffc1d860: 7f e3 fb 78 mr r3,r31
ffc1d864: 4b ff fd 55 bl ffc1d5b8 <_Timer_server_Reset_interval_system_watchdog>
ffc1d868: 4b ff fe e0 b ffc1d748 <_Timer_server_Schedule_operation_method+0x70>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
ffc1d86c: 7d 47 52 14 add r10,r7,r10
delta_interval += delta;
ffc1d870: 7d 04 50 50 subf r8,r4,r10
ffc1d874: 4b ff ff 54 b ffc1d7c8 <_Timer_server_Schedule_operation_method+0xf0>
ffc0f468 <_Timespec_Add_to>:
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
ffc0f468: 81 24 00 04 lwz r9,4(r4)
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f46c: 3c e0 3b 9a lis r7,15258
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
ffc0f470: 81 03 00 04 lwz r8,4(r3)
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f474: 60 e7 c9 ff ori r7,r7,51711
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
uint32_t seconds = add->tv_sec;
ffc0f478: 81 44 00 00 lwz r10,0(r4)
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
ffc0f47c: 7d 08 4a 14 add r8,r8,r9
)
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
ffc0f480: 80 c3 00 00 lwz r6,0(r3)
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f484: 7f 88 38 40 cmplw cr7,r8,r7
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
ffc0f488: 91 03 00 04 stw r8,4(r3)
)
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
ffc0f48c: 7c c6 52 14 add r6,r6,r10
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f490: 7d 09 43 78 mr r9,r8
)
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
ffc0f494: 90 c3 00 00 stw r6,0(r3)
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f498: 40 9d 00 2c ble- cr7,ffc0f4c4 <_Timespec_Add_to+0x5c>
ffc0f49c: 38 c6 00 01 addi r6,r6,1
#include <sys/types.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
uint32_t _Timespec_Add_to(
ffc0f4a0: 7c ca 30 50 subf r6,r10,r6
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ffc0f4a4: 3d 29 c4 65 addis r9,r9,-15259
ffc0f4a8: 39 29 36 00 addi r9,r9,13824
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f4ac: 7f 89 38 40 cmplw cr7,r9,r7
#include <sys/types.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
uint32_t _Timespec_Add_to(
ffc0f4b0: 7d 06 52 14 add r8,r6,r10
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
time->tv_sec++;
seconds++;
ffc0f4b4: 39 4a 00 01 addi r10,r10,1
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc0f4b8: 41 9d ff ec bgt+ cr7,ffc0f4a4 <_Timespec_Add_to+0x3c> <== NEVER TAKEN
ffc0f4bc: 91 23 00 04 stw r9,4(r3)
ffc0f4c0: 91 03 00 00 stw r8,0(r3)
time->tv_sec++;
seconds++;
}
return seconds;
}
ffc0f4c4: 7d 43 53 78 mr r3,r10
ffc0f4c8: 4e 80 00 20 blr
ffc0f5dc <_Timestamp64_Divide>:
const Timestamp64_Control *_lhs,
const Timestamp64_Control *_rhs,
uint32_t *_ival_percentage,
uint32_t *_fval_percentage
)
{
ffc0f5dc: 94 21 ff e8 stwu r1,-24(r1)
ffc0f5e0: 7c 08 02 a6 mflr r0
ffc0f5e4: 90 01 00 1c stw r0,28(r1)
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
ffc0f5e8: 81 44 00 00 lwz r10,0(r4)
ffc0f5ec: 81 24 00 04 lwz r9,4(r4)
const Timestamp64_Control *_lhs,
const Timestamp64_Control *_rhs,
uint32_t *_ival_percentage,
uint32_t *_fval_percentage
)
{
ffc0f5f0: 93 c1 00 10 stw r30,16(r1)
ffc0f5f4: 7c be 2b 78 mr r30,r5
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
ffc0f5f8: 7d 48 4b 79 or. r8,r10,r9
const Timestamp64_Control *_lhs,
const Timestamp64_Control *_rhs,
uint32_t *_ival_percentage,
uint32_t *_fval_percentage
)
{
ffc0f5fc: 93 e1 00 14 stw r31,20(r1)
ffc0f600: 7c df 33 78 mr r31,r6
ffc0f604: 93 81 00 08 stw r28,8(r1)
ffc0f608: 93 a1 00 0c stw r29,12(r1)
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
ffc0f60c: 41 82 00 80 beq- ffc0f68c <_Timestamp64_Divide+0xb0> <== NEVER TAKEN
* This looks odd but gives the results the proper precision.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
ffc0f610: 80 c3 00 04 lwz r6,4(r3)
ffc0f614: 3d 00 00 01 lis r8,1
ffc0f618: 80 e3 00 00 lwz r7,0(r3)
ffc0f61c: 61 08 86 a0 ori r8,r8,34464
ffc0f620: 7c 68 30 16 mulhwu r3,r8,r6
ffc0f624: 7c e8 39 d6 mullw r7,r8,r7
ffc0f628: 7c 88 31 d6 mullw r4,r8,r6
ffc0f62c: 7d 45 53 78 mr r5,r10
ffc0f630: 7d 26 4b 78 mr r6,r9
ffc0f634: 7c 67 1a 14 add r3,r7,r3
ffc0f638: 48 00 fa 8d bl ffc1f0c4 <__divdi3>
*_ival_percentage = answer / 1000;
ffc0f63c: 38 a0 00 00 li r5,0
ffc0f640: 38 c0 03 e8 li r6,1000
* This looks odd but gives the results the proper precision.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
ffc0f644: 7c 7c 1b 78 mr r28,r3
ffc0f648: 7c 9d 23 78 mr r29,r4
*_ival_percentage = answer / 1000;
ffc0f64c: 48 00 fa 79 bl ffc1f0c4 <__divdi3>
ffc0f650: 90 9e 00 00 stw r4,0(r30)
*_fval_percentage = answer % 1000;
ffc0f654: 7f 83 e3 78 mr r3,r28
ffc0f658: 7f a4 eb 78 mr r4,r29
ffc0f65c: 38 a0 00 00 li r5,0
ffc0f660: 38 c0 03 e8 li r6,1000
ffc0f664: 48 00 fe 85 bl ffc1f4e8 <__moddi3>
}
ffc0f668: 80 01 00 1c lwz r0,28(r1)
*/
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
*_fval_percentage = answer % 1000;
ffc0f66c: 90 9f 00 00 stw r4,0(r31)
}
ffc0f670: 7c 08 03 a6 mtlr r0
ffc0f674: 83 81 00 08 lwz r28,8(r1)
ffc0f678: 83 a1 00 0c lwz r29,12(r1)
ffc0f67c: 83 c1 00 10 lwz r30,16(r1)
ffc0f680: 83 e1 00 14 lwz r31,20(r1)
ffc0f684: 38 21 00 18 addi r1,r1,24
ffc0f688: 4e 80 00 20 blr
ffc0f68c: 80 01 00 1c lwz r0,28(r1) <== NOT EXECUTED
)
{
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
*_ival_percentage = 0;
ffc0f690: 91 05 00 00 stw r8,0(r5) <== NOT EXECUTED
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
*_fval_percentage = answer % 1000;
}
ffc0f694: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0f698: 83 81 00 08 lwz r28,8(r1) <== NOT EXECUTED
ffc0f69c: 83 a1 00 0c lwz r29,12(r1) <== NOT EXECUTED
ffc0f6a0: 83 c1 00 10 lwz r30,16(r1) <== NOT EXECUTED
ffc0f6a4: 83 e1 00 14 lwz r31,20(r1) <== NOT EXECUTED
{
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
*_ival_percentage = 0;
*_fval_percentage = 0;
ffc0f6a8: 91 06 00 00 stw r8,0(r6) <== NOT EXECUTED
answer = (*_lhs * 100000) / *_rhs;
*_ival_percentage = answer / 1000;
*_fval_percentage = answer % 1000;
}
ffc0f6ac: 38 21 00 18 addi r1,r1,24 <== NOT EXECUTED
ffc0f6b0: 4e 80 00 20 blr <== NOT EXECUTED
ffc0d90c <_User_extensions_Iterate>:
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
ffc0d90c: 94 21 ff e0 stwu r1,-32(r1)
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
ffc0d910: 3d 20 ff c2 lis r9,-62
ffc0d914: 39 29 ea f8 addi r9,r9,-5384
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
ffc0d918: 7c 08 02 a6 mflr r0
ffc0d91c: 93 61 00 0c stw r27,12(r1)
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
rtems_configuration_get_user_extension_table();
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
ffc0d920: 83 69 00 40 lwz r27,64(r9)
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
ffc0d924: 93 e1 00 1c stw r31,28(r1)
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
rtems_configuration_get_user_extension_table();
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
ffc0d928: 57 7b 28 34 rlwinm r27,r27,5,0,26
void *arg,
User_extensions_Visitor visitor
)
{
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
ffc0d92c: 83 e9 00 44 lwz r31,68(r9)
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
Thread_Control *executing = _Thread_Executing;
ffc0d930: 3d 20 00 00 lis r9,0
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
ffc0d934: 93 81 00 10 stw r28,16(r1)
ffc0d938: 7c 9c 23 78 mr r28,r4
Thread_Control *executing = _Thread_Executing;
const User_extensions_Table *callouts_current =
rtems_configuration_get_user_extension_table();
const User_extensions_Table *callouts_end =
ffc0d93c: 7f 7f da 14 add r27,r31,r27
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
ffc0d940: 7f 9f d8 00 cmpw cr7,r31,r27
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor
)
{
ffc0d944: 93 a1 00 14 stw r29,20(r1)
ffc0d948: 7c 7d 1b 78 mr r29,r3
ffc0d94c: 93 c1 00 18 stw r30,24(r1)
ffc0d950: 90 01 00 24 stw r0,36(r1)
Thread_Control *executing = _Thread_Executing;
ffc0d954: 83 c9 31 b0 lwz r30,12720(r9)
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
ffc0d958: 41 9e 00 24 beq- cr7,ffc0d97c <_User_extensions_Iterate+0x70><== NEVER TAKEN
(*visitor)( executing, arg, callouts_current );
ffc0d95c: 7f e5 fb 78 mr r5,r31
ffc0d960: 7f 89 03 a6 mtctr r28
ffc0d964: 7f c3 f3 78 mr r3,r30
ffc0d968: 7f a4 eb 78 mr r4,r29
++callouts_current;
ffc0d96c: 3b ff 00 20 addi r31,r31,32
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
(*visitor)( executing, arg, callouts_current );
ffc0d970: 4e 80 04 21 bctrl
const User_extensions_Table *callouts_end =
callouts_current + rtems_configuration_get_number_of_initial_extensions();
const Chain_Node *node;
const Chain_Node *tail;
while ( callouts_current != callouts_end ) {
ffc0d974: 7f 9b f8 00 cmpw cr7,r27,r31
ffc0d978: 40 9e ff e4 bne+ cr7,ffc0d95c <_User_extensions_Iterate+0x50>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0d97c: 3d 20 00 00 lis r9,0
ffc0d980: 3b 69 21 fc addi r27,r9,8700
ffc0d984: 83 e9 21 fc lwz r31,8700(r9)
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
ffc0d988: 3b 7b 00 04 addi r27,r27,4
++callouts_current;
}
node = _Chain_Immutable_first( &_User_extensions_List );
tail = _Chain_Immutable_tail( &_User_extensions_List );
while ( node != tail ) {
ffc0d98c: 7f 9f d8 00 cmpw cr7,r31,r27
ffc0d990: 41 9e 00 24 beq- cr7,ffc0d9b4 <_User_extensions_Iterate+0xa8>
const User_extensions_Control *extension =
(const User_extensions_Control *) node;
(*visitor)( executing, arg, &extension->Callouts );
ffc0d994: 38 bf 00 14 addi r5,r31,20
ffc0d998: 7f 89 03 a6 mtctr r28
ffc0d99c: 7f c3 f3 78 mr r3,r30
ffc0d9a0: 7f a4 eb 78 mr r4,r29
ffc0d9a4: 4e 80 04 21 bctrl
node = _Chain_Immutable_next( node );
}
}
ffc0d9a8: 83 ff 00 00 lwz r31,0(r31)
++callouts_current;
}
node = _Chain_Immutable_first( &_User_extensions_List );
tail = _Chain_Immutable_tail( &_User_extensions_List );
while ( node != tail ) {
ffc0d9ac: 7f 9f d8 00 cmpw cr7,r31,r27
ffc0d9b0: 40 9e ff e4 bne+ cr7,ffc0d994 <_User_extensions_Iterate+0x88>
(*visitor)( executing, arg, &extension->Callouts );
node = _Chain_Immutable_next( node );
}
}
ffc0d9b4: 80 01 00 24 lwz r0,36(r1)
ffc0d9b8: 83 61 00 0c lwz r27,12(r1)
ffc0d9bc: 7c 08 03 a6 mtlr r0
ffc0d9c0: 83 81 00 10 lwz r28,16(r1)
ffc0d9c4: 83 a1 00 14 lwz r29,20(r1)
ffc0d9c8: 83 c1 00 18 lwz r30,24(r1)
ffc0d9cc: 83 e1 00 1c lwz r31,28(r1)
ffc0d9d0: 38 21 00 20 addi r1,r1,32
ffc0d9d4: 4e 80 00 20 blr
ffc0f96c <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
ffc0f96c: 94 21 ff e8 stwu r1,-24(r1)
ffc0f970: 7c 08 02 a6 mflr r0
ffc0f974: 90 01 00 1c stw r0,28(r1)
ffc0f978: 93 c1 00 10 stw r30,16(r1)
ffc0f97c: 7c 7e 1b 78 mr r30,r3
ffc0f980: 93 81 00 08 stw r28,8(r1)
ffc0f984: 93 a1 00 0c stw r29,12(r1)
ffc0f988: 93 e1 00 14 stw r31,20(r1)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0f98c: 7d 40 00 a6 mfmsr r10
ffc0f990: 7d 30 42 a6 mfsprg r9,0
ffc0f994: 7d 49 48 78 andc r9,r10,r9
ffc0f998: 7d 20 01 24 mtmsr r9
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0f99c: 81 23 00 00 lwz r9,0(r3)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc0f9a0: 3b a3 00 04 addi r29,r3,4
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
ffc0f9a4: 7f 89 e8 00 cmpw cr7,r9,r29
ffc0f9a8: 41 9e 00 70 beq- cr7,ffc0fa18 <_Watchdog_Adjust+0xac>
switch ( direction ) {
ffc0f9ac: 2f 84 00 00 cmpwi cr7,r4,0
ffc0f9b0: 7c bf 2b 78 mr r31,r5
ffc0f9b4: 40 9e 00 88 bne- cr7,ffc0fa3c <_Watchdog_Adjust+0xd0>
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
ffc0f9b8: 2f 85 00 00 cmpwi cr7,r5,0
ffc0f9bc: 41 9e 00 5c beq- cr7,ffc0fa18 <_Watchdog_Adjust+0xac> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
ffc0f9c0: 81 09 00 10 lwz r8,16(r9)
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
ffc0f9c4: 3b 80 00 01 li r28,1
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
ffc0f9c8: 7f 85 40 40 cmplw cr7,r5,r8
ffc0f9cc: 40 bc 00 18 bge+ cr7,ffc0f9e4 <_Watchdog_Adjust+0x78> <== ALWAYS TAKEN
ffc0f9d0: 48 00 00 a4 b ffc0fa74 <_Watchdog_Adjust+0x108> <== NOT EXECUTED
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
ffc0f9d4: 41 9a 00 44 beq- cr6,ffc0fa18 <_Watchdog_Adjust+0xac> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
ffc0f9d8: 81 09 00 10 lwz r8,16(r9)
ffc0f9dc: 7f 88 f8 40 cmplw cr7,r8,r31
ffc0f9e0: 41 9d 00 94 bgt- cr7,ffc0fa74 <_Watchdog_Adjust+0x108>
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
ffc0f9e4: 93 89 00 10 stw r28,16(r9)
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
ffc0f9e8: 7f e8 f8 50 subf r31,r8,r31
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0f9ec: 7d 40 01 24 mtmsr r10
_Watchdog_First( header )->delta_interval = 1;
_ISR_Enable( level );
_Watchdog_Tickle( header );
ffc0f9f0: 7f c3 f3 78 mr r3,r30
ffc0f9f4: 48 00 03 25 bl ffc0fd18 <_Watchdog_Tickle>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0f9f8: 7d 40 00 a6 mfmsr r10
ffc0f9fc: 7d 30 42 a6 mfsprg r9,0
ffc0fa00: 7d 49 48 78 andc r9,r10,r9
ffc0fa04: 7d 20 01 24 mtmsr r9
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0fa08: 81 3e 00 00 lwz r9,0(r30)
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
ffc0fa0c: 2f 1f 00 00 cmpwi cr6,r31,0
_Watchdog_Tickle( header );
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
ffc0fa10: 7f 9d 48 00 cmpw cr7,r29,r9
ffc0fa14: 40 9e ff c0 bne+ cr7,ffc0f9d4 <_Watchdog_Adjust+0x68>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0fa18: 7d 40 01 24 mtmsr r10
}
}
_ISR_Enable( level );
}
ffc0fa1c: 80 01 00 1c lwz r0,28(r1)
ffc0fa20: 83 81 00 08 lwz r28,8(r1)
ffc0fa24: 7c 08 03 a6 mtlr r0
ffc0fa28: 83 a1 00 0c lwz r29,12(r1)
ffc0fa2c: 83 c1 00 10 lwz r30,16(r1)
ffc0fa30: 83 e1 00 14 lwz r31,20(r1)
ffc0fa34: 38 21 00 18 addi r1,r1,24
ffc0fa38: 4e 80 00 20 blr
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
ffc0fa3c: 2f 84 00 01 cmpwi cr7,r4,1
ffc0fa40: 40 9e ff d8 bne+ cr7,ffc0fa18 <_Watchdog_Adjust+0xac> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
ffc0fa44: 81 09 00 10 lwz r8,16(r9)
ffc0fa48: 7f e8 2a 14 add r31,r8,r5
ffc0fa4c: 93 e9 00 10 stw r31,16(r9)
ffc0fa50: 7d 40 01 24 mtmsr r10
}
}
_ISR_Enable( level );
}
ffc0fa54: 80 01 00 1c lwz r0,28(r1)
ffc0fa58: 83 81 00 08 lwz r28,8(r1)
ffc0fa5c: 7c 08 03 a6 mtlr r0
ffc0fa60: 83 a1 00 0c lwz r29,12(r1)
ffc0fa64: 83 c1 00 10 lwz r30,16(r1)
ffc0fa68: 83 e1 00 14 lwz r31,20(r1)
ffc0fa6c: 38 21 00 18 addi r1,r1,24
ffc0fa70: 4e 80 00 20 blr
_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;
ffc0fa74: 7d 1f 40 50 subf r8,r31,r8
ffc0fa78: 91 09 00 10 stw r8,16(r9)
break;
ffc0fa7c: 4b ff ff 9c b ffc0fa18 <_Watchdog_Adjust+0xac>
ffc22bfc <_Watchdog_Adjust_to_chain>:
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc22bfc: 7d 60 00 a6 mfmsr r11
ffc22c00: 7d 30 42 a6 mfsprg r9,0
ffc22c04: 7d 69 48 78 andc r9,r11,r9
ffc22c08: 7d 20 01 24 mtmsr r9
{
Watchdog_Interval units = units_arg;
ISR_Level level;
Watchdog_Control *first;
_ISR_Disable( level );
ffc22c0c: 81 23 00 00 lwz r9,0(r3)
ffc22c10: 38 c3 00 04 addi r6,r3,4
/*
* The first set happens in less than units, so take all of them
* off the chain and adjust units to reflect this.
*/
units -= first->delta_interval;
first->delta_interval = 0;
ffc22c14: 39 80 00 00 li r12,0
ffc22c18: 38 05 00 04 addi r0,r5,4
Watchdog_Control *first;
_ISR_Disable( level );
while ( 1 ) {
if ( _Chain_Is_empty( header ) ) {
ffc22c1c: 7f 86 48 00 cmpw cr7,r6,r9
ffc22c20: 41 9e 00 68 beq- cr7,ffc22c88 <_Watchdog_Adjust_to_chain+0x8c>
/*
* If it is longer than "units" until the first element on the chain
* fires, then bump it and quit.
*/
if ( units < first->delta_interval ) {
ffc22c24: 81 49 00 10 lwz r10,16(r9)
ffc22c28: 7f 84 50 40 cmplw cr7,r4,r10
ffc22c2c: 41 9c 00 64 blt- cr7,ffc22c90 <_Watchdog_Adjust_to_chain+0x94>
/*
* The first set happens in less than units, so take all of them
* off the chain and adjust units to reflect this.
*/
units -= first->delta_interval;
first->delta_interval = 0;
ffc22c30: 91 89 00 10 stw r12,16(r9)
/*
* The first set happens in less than units, so take all of them
* off the chain and adjust units to reflect this.
*/
units -= first->delta_interval;
ffc22c34: 7c 8a 20 50 subf r4,r10,r4
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
ffc22c38: 81 49 00 00 lwz r10,0(r9)
previous = the_node->previous;
ffc22c3c: 80 e9 00 04 lwz r7,4(r9)
next->previous = previous;
ffc22c40: 90 ea 00 04 stw r7,4(r10)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
ffc22c44: 81 05 00 08 lwz r8,8(r5)
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
next->previous = previous;
previous->next = next;
ffc22c48: 91 47 00 00 stw r10,0(r7)
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
ffc22c4c: 90 09 00 00 stw r0,0(r9)
tail->previous = the_node;
old_last->next = the_node;
ffc22c50: 91 28 00 00 stw r9,0(r8)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
ffc22c54: 91 25 00 08 stw r9,8(r5)
old_last->next = the_node;
the_node->previous = old_last;
ffc22c58: 91 09 00 04 stw r8,4(r9)
static inline void ppc_interrupt_flash( uint32_t level )
{
uint32_t current_level;
__asm__ volatile (
ffc22c5c: 7d 20 00 a6 mfmsr r9
ffc22c60: 7d 60 01 24 mtmsr r11
ffc22c64: 7d 20 01 24 mtmsr r9
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc22c68: 81 23 00 00 lwz r9,0(r3)
_Chain_Extract_unprotected( &first->Node );
_Chain_Append_unprotected( to_fire, &first->Node );
_ISR_Flash( level );
if ( _Chain_Is_empty( header ) )
ffc22c6c: 7f 86 48 00 cmpw cr7,r6,r9
ffc22c70: 41 be ff ac beq- cr7,ffc22c1c <_Watchdog_Adjust_to_chain+0x20>
break;
first = _Watchdog_First( header );
if ( first->delta_interval != 0 )
ffc22c74: 81 49 00 10 lwz r10,16(r9)
ffc22c78: 2f 8a 00 00 cmpwi cr7,r10,0
ffc22c7c: 41 9e ff bc beq+ cr7,ffc22c38 <_Watchdog_Adjust_to_chain+0x3c>
Watchdog_Control *first;
_ISR_Disable( level );
while ( 1 ) {
if ( _Chain_Is_empty( header ) ) {
ffc22c80: 7f 86 48 00 cmpw cr7,r6,r9
ffc22c84: 40 9e ff a0 bne+ cr7,ffc22c24 <_Watchdog_Adjust_to_chain+0x28><== ALWAYS TAKEN
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc22c88: 7d 60 01 24 mtmsr r11
ffc22c8c: 4e 80 00 20 blr
/*
* If it is longer than "units" until the first element on the chain
* fires, then bump it and quit.
*/
if ( units < first->delta_interval ) {
first->delta_interval -= units;
ffc22c90: 7d 44 50 50 subf r10,r4,r10
ffc22c94: 91 49 00 10 stw r10,16(r9)
ffc22c98: 7d 60 01 24 mtmsr r11
ffc22c9c: 4e 80 00 20 blr
ffc0da64 <_Watchdog_Insert>:
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
ffc0da64: 3d 20 00 00 lis r9,0
ffc0da68: 80 c9 31 a8 lwz r6,12712(r9)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0da6c: 7c e0 00 a6 mfmsr r7
ffc0da70: 7d 30 42 a6 mfsprg r9,0
ffc0da74: 7c e9 48 78 andc r9,r7,r9
ffc0da78: 7d 20 01 24 mtmsr r9
/*
* 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 ) {
ffc0da7c: 81 24 00 08 lwz r9,8(r4)
ffc0da80: 2f 89 00 00 cmpwi cr7,r9,0
ffc0da84: 40 9e 01 04 bne- cr7,ffc0db88 <_Watchdog_Insert+0x124>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
ffc0da88: 3d 60 00 00 lis r11,0
ffc0da8c: 81 2b 28 84 lwz r9,10372(r11)
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
ffc0da90: 39 40 00 01 li r10,1
ffc0da94: 91 44 00 08 stw r10,8(r4)
ffc0da98: 3d 80 00 00 lis r12,0
_Watchdog_Sync_count++;
ffc0da9c: 39 29 00 01 addi r9,r9,1
ffc0daa0: 91 2b 28 84 stw r9,10372(r11)
restart:
delta_interval = the_watchdog->initial;
ffc0daa4: 81 24 00 0c lwz r9,12(r4)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc0daa8: 81 43 00 00 lwz r10,0(r3)
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
ffc0daac: 2f 89 00 00 cmpwi cr7,r9,0
ffc0dab0: 41 9e 00 98 beq- cr7,ffc0db48 <_Watchdog_Insert+0xe4>
ffc0dab4: 81 0a 00 00 lwz r8,0(r10)
ffc0dab8: 2f 88 00 00 cmpwi cr7,r8,0
ffc0dabc: 41 9e 00 8c beq- cr7,ffc0db48 <_Watchdog_Insert+0xe4>
break;
if ( delta_interval < after->delta_interval ) {
ffc0dac0: 81 0a 00 10 lwz r8,16(r10)
ffc0dac4: 7f 89 40 40 cmplw cr7,r9,r8
ffc0dac8: 41 9c 00 c8 blt- cr7,ffc0db90 <_Watchdog_Insert+0x12c>
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
ffc0dacc: 7d 28 48 50 subf r9,r8,r9
static inline void ppc_interrupt_flash( uint32_t level )
{
uint32_t current_level;
__asm__ volatile (
ffc0dad0: 7d 00 00 a6 mfmsr r8
ffc0dad4: 7c e0 01 24 mtmsr r7
ffc0dad8: 7d 00 01 24 mtmsr r8
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
ffc0dadc: 81 04 00 08 lwz r8,8(r4)
ffc0dae0: 2f 88 00 01 cmpwi cr7,r8,1
ffc0dae4: 40 9e 00 94 bne- cr7,ffc0db78 <_Watchdog_Insert+0x114>
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
ffc0dae8: 81 0c 28 7c lwz r8,10364(r12)
ffc0daec: 38 ac 28 7c addi r5,r12,10364
ffc0daf0: 7f 86 40 40 cmplw cr7,r6,r8
ffc0daf4: 40 bc 00 48 bge+ cr7,ffc0db3c <_Watchdog_Insert+0xd8>
ffc0daf8: 48 00 00 d4 b ffc0dbcc <_Watchdog_Insert+0x168>
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
ffc0dafc: 81 0a 00 00 lwz r8,0(r10)
ffc0db00: 2f 88 00 00 cmpwi cr7,r8,0
ffc0db04: 41 9e 00 44 beq- cr7,ffc0db48 <_Watchdog_Insert+0xe4>
break;
if ( delta_interval < after->delta_interval ) {
ffc0db08: 81 0a 00 10 lwz r8,16(r10)
ffc0db0c: 7f 88 48 40 cmplw cr7,r8,r9
ffc0db10: 41 9d 00 80 bgt- cr7,ffc0db90 <_Watchdog_Insert+0x12c>
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
ffc0db14: 7d 28 48 50 subf r9,r8,r9
ffc0db18: 7d 00 00 a6 mfmsr r8
ffc0db1c: 7c e0 01 24 mtmsr r7
ffc0db20: 7d 00 01 24 mtmsr r8
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
ffc0db24: 81 04 00 08 lwz r8,8(r4)
ffc0db28: 2f 88 00 01 cmpwi cr7,r8,1
ffc0db2c: 40 9e 00 4c bne- cr7,ffc0db78 <_Watchdog_Insert+0x114> <== NEVER TAKEN
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
ffc0db30: 81 05 00 00 lwz r8,0(r5)
ffc0db34: 7f 86 40 40 cmplw cr7,r6,r8
ffc0db38: 41 9c 00 94 blt- cr7,ffc0dbcc <_Watchdog_Insert+0x168> <== NEVER TAKEN
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
ffc0db3c: 2f 89 00 00 cmpwi cr7,r9,0
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
ffc0db40: 81 4a 00 00 lwz r10,0(r10)
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
ffc0db44: 40 9e ff b8 bne+ cr7,ffc0dafc <_Watchdog_Insert+0x98>
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
ffc0db48: 81 4a 00 04 lwz r10,4(r10)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
ffc0db4c: 3c a0 00 00 lis r5,0
ffc0db50: 80 a5 28 88 lwz r5,10376(r5)
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
ffc0db54: 38 60 00 02 li r3,2
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0db58: 81 0a 00 00 lwz r8,0(r10)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0db5c: 91 44 00 04 stw r10,4(r4)
ffc0db60: 90 64 00 08 stw r3,8(r4)
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
ffc0db64: 91 24 00 10 stw r9,16(r4)
before_node = after_node->next;
after_node->next = the_node;
ffc0db68: 90 8a 00 00 stw r4,0(r10)
the_node->next = before_node;
before_node->previous = the_node;
ffc0db6c: 90 88 00 04 stw r4,4(r8)
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
ffc0db70: 91 04 00 00 stw r8,0(r4)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
ffc0db74: 90 a4 00 14 stw r5,20(r4)
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
ffc0db78: 90 cc 28 7c stw r6,10364(r12)
_Watchdog_Sync_count--;
ffc0db7c: 81 2b 28 84 lwz r9,10372(r11)
ffc0db80: 39 29 ff ff addi r9,r9,-1
ffc0db84: 91 2b 28 84 stw r9,10372(r11)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0db88: 7c e0 01 24 mtmsr r7
ffc0db8c: 4e 80 00 20 blr
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
break;
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
ffc0db90: 7d 09 40 50 subf r8,r9,r8
ffc0db94: 91 0a 00 10 stw r8,16(r10)
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
ffc0db98: 3c a0 00 00 lis r5,0
ffc0db9c: 38 60 00 02 li r3,2
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
ffc0dba0: 81 4a 00 04 lwz r10,4(r10)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
ffc0dba4: 80 a5 28 88 lwz r5,10376(r5)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0dba8: 81 0a 00 00 lwz r8,0(r10)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0dbac: 91 44 00 04 stw r10,4(r4)
ffc0dbb0: 90 64 00 08 stw r3,8(r4)
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
ffc0dbb4: 91 24 00 10 stw r9,16(r4)
before_node = after_node->next;
after_node->next = the_node;
ffc0dbb8: 90 8a 00 00 stw r4,0(r10)
the_node->next = before_node;
before_node->previous = the_node;
ffc0dbbc: 90 88 00 04 stw r4,4(r8)
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
ffc0dbc0: 91 04 00 00 stw r8,0(r4)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
ffc0dbc4: 90 a4 00 14 stw r5,20(r4)
ffc0dbc8: 4b ff ff b0 b ffc0db78 <_Watchdog_Insert+0x114>
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;
ffc0dbcc: 90 cc 28 7c stw r6,10364(r12)
goto restart;
ffc0dbd0: 4b ff fe d4 b ffc0daa4 <_Watchdog_Insert+0x40>
ffc0dc2c <_Watchdog_Remove>:
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0dc2c: 7d 40 00 a6 mfmsr r10
ffc0dc30: 7d 30 42 a6 mfsprg r9,0
ffc0dc34: 7d 49 48 78 andc r9,r10,r9
ffc0dc38: 7d 20 01 24 mtmsr r9
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
ffc0dc3c: 81 23 00 08 lwz r9,8(r3)
switch ( previous_state ) {
ffc0dc40: 2f 89 00 01 cmpwi cr7,r9,1
ffc0dc44: 41 9e 00 98 beq- cr7,ffc0dcdc <_Watchdog_Remove+0xb0>
ffc0dc48: 2b 89 00 01 cmplwi cr7,r9,1
ffc0dc4c: 40 9c 00 1c bge- cr7,ffc0dc68 <_Watchdog_Remove+0x3c>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
ffc0dc50: 3d 00 00 00 lis r8,0
ffc0dc54: 81 08 28 88 lwz r8,10376(r8)
ffc0dc58: 91 03 00 18 stw r8,24(r3)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0dc5c: 7d 40 01 24 mtmsr r10
_ISR_Enable( level );
return( previous_state );
}
ffc0dc60: 7d 23 4b 78 mr r3,r9
ffc0dc64: 4e 80 00 20 blr
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
ffc0dc68: 2b 89 00 03 cmplwi cr7,r9,3
ffc0dc6c: 41 bd ff e4 bgt- cr7,ffc0dc50 <_Watchdog_Remove+0x24> <== NEVER TAKEN
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
ffc0dc70: 39 00 00 00 li r8,0
ffc0dc74: 91 03 00 08 stw r8,8(r3)
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
ffc0dc78: 81 03 00 00 lwz r8,0(r3)
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
ffc0dc7c: 80 e8 00 00 lwz r7,0(r8)
ffc0dc80: 2f 87 00 00 cmpwi cr7,r7,0
ffc0dc84: 41 9e 00 14 beq- cr7,ffc0dc98 <_Watchdog_Remove+0x6c>
next_watchdog->delta_interval += the_watchdog->delta_interval;
ffc0dc88: 80 c8 00 10 lwz r6,16(r8)
ffc0dc8c: 80 e3 00 10 lwz r7,16(r3)
ffc0dc90: 7c e6 3a 14 add r7,r6,r7
ffc0dc94: 90 e8 00 10 stw r7,16(r8)
if ( _Watchdog_Sync_count )
ffc0dc98: 3c e0 00 00 lis r7,0
ffc0dc9c: 80 e7 28 84 lwz r7,10372(r7)
ffc0dca0: 2f 87 00 00 cmpwi cr7,r7,0
ffc0dca4: 41 9e 00 14 beq- cr7,ffc0dcb8 <_Watchdog_Remove+0x8c>
_Watchdog_Sync_level = _ISR_Nest_level;
ffc0dca8: 3c e0 00 00 lis r7,0
ffc0dcac: 80 c7 31 a8 lwz r6,12712(r7)
ffc0dcb0: 3c e0 00 00 lis r7,0
ffc0dcb4: 90 c7 28 7c stw r6,10364(r7)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
ffc0dcb8: 80 e3 00 04 lwz r7,4(r3)
next->previous = previous;
ffc0dcbc: 90 e8 00 04 stw r7,4(r8)
previous->next = next;
ffc0dcc0: 91 07 00 00 stw r8,0(r7)
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
ffc0dcc4: 3d 00 00 00 lis r8,0
ffc0dcc8: 81 08 28 88 lwz r8,10376(r8)
ffc0dccc: 91 03 00 18 stw r8,24(r3)
ffc0dcd0: 7d 40 01 24 mtmsr r10
_ISR_Enable( level );
return( previous_state );
}
ffc0dcd4: 7d 23 4b 78 mr r3,r9
ffc0dcd8: 4e 80 00 20 blr
/*
* 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;
ffc0dcdc: 39 00 00 00 li r8,0
ffc0dce0: 91 03 00 08 stw r8,8(r3)
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
ffc0dce4: 3d 00 00 00 lis r8,0
ffc0dce8: 81 08 28 88 lwz r8,10376(r8)
ffc0dcec: 91 03 00 18 stw r8,24(r3)
ffc0dcf0: 7d 40 01 24 mtmsr r10
_ISR_Enable( level );
return( previous_state );
}
ffc0dcf4: 7d 23 4b 78 mr r3,r9
ffc0dcf8: 4e 80 00 20 blr
ffc0f1a4 <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
ffc0f1a4: 94 21 ff e8 stwu r1,-24(r1)
ffc0f1a8: 7c 08 02 a6 mflr r0
ffc0f1ac: 93 a1 00 0c stw r29,12(r1)
ffc0f1b0: 7c 7d 1b 78 mr r29,r3
ffc0f1b4: 93 c1 00 10 stw r30,16(r1)
ffc0f1b8: 7c 9e 23 78 mr r30,r4
ffc0f1bc: 90 01 00 1c stw r0,28(r1)
ffc0f1c0: 93 81 00 08 stw r28,8(r1)
ffc0f1c4: 93 e1 00 14 stw r31,20(r1)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0f1c8: 7f 80 00 a6 mfmsr r28
ffc0f1cc: 7d 30 42 a6 mfsprg r9,0
ffc0f1d0: 7f 89 48 78 andc r9,r28,r9
ffc0f1d4: 7d 20 01 24 mtmsr r9
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
ffc0f1d8: 3c 60 ff c2 lis r3,-62
ffc0f1dc: 7f c5 f3 78 mr r5,r30
ffc0f1e0: 38 63 21 24 addi r3,r3,8484
ffc0f1e4: 7f a4 eb 78 mr r4,r29
ffc0f1e8: 4c c6 31 82 crclr 4*cr1+eq
ffc0f1ec: 4b ff 75 b9 bl ffc067a4 <printk>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0f1f0: 83 fe 00 00 lwz r31,0(r30)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc0f1f4: 3b de 00 04 addi r30,r30,4
if ( !_Chain_Is_empty( header ) ) {
ffc0f1f8: 7f 9f f0 00 cmpw cr7,r31,r30
ffc0f1fc: 41 9e 00 54 beq- cr7,ffc0f250 <_Watchdog_Report_chain+0xac>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
ffc0f200: 7f e4 fb 78 mr r4,r31
ffc0f204: 38 60 00 00 li r3,0
ffc0f208: 48 00 00 5d bl ffc0f264 <_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 )
ffc0f20c: 83 ff 00 00 lwz r31,0(r31)
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
ffc0f210: 7f 9f f0 00 cmpw cr7,r31,r30
ffc0f214: 40 9e ff ec bne+ cr7,ffc0f200 <_Watchdog_Report_chain+0x5c><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
ffc0f218: 3c 60 ff c2 lis r3,-62
ffc0f21c: 38 63 21 3c addi r3,r3,8508
ffc0f220: 7f a4 eb 78 mr r4,r29
ffc0f224: 4c c6 31 82 crclr 4*cr1+eq
ffc0f228: 4b ff 75 7d bl ffc067a4 <printk>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0f22c: 7f 80 01 24 mtmsr r28
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
ffc0f230: 80 01 00 1c lwz r0,28(r1)
ffc0f234: 83 81 00 08 lwz r28,8(r1)
ffc0f238: 7c 08 03 a6 mtlr r0
ffc0f23c: 83 a1 00 0c lwz r29,12(r1)
ffc0f240: 83 c1 00 10 lwz r30,16(r1)
ffc0f244: 83 e1 00 14 lwz r31,20(r1)
ffc0f248: 38 21 00 18 addi r1,r1,24
ffc0f24c: 4e 80 00 20 blr
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
ffc0f250: 3c 60 ff c2 lis r3,-62
ffc0f254: 38 63 21 4c addi r3,r3,8524
ffc0f258: 4c c6 31 82 crclr 4*cr1+eq
ffc0f25c: 4b ff 75 49 bl ffc067a4 <printk>
ffc0f260: 4b ff ff cc b ffc0f22c <_Watchdog_Report_chain+0x88>
ffc0ddd0 <_Workspace_Handler_initialization>:
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0ddd0: 3d 40 ff c2 lis r10,-62
void _Workspace_Handler_initialization(
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
ffc0ddd4: 7d 80 00 26 mfcr r12
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0ddd8: 39 2a ea f8 addi r9,r10,-5384
void _Workspace_Handler_initialization(
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
ffc0dddc: 94 21 ff d0 stwu r1,-48(r1)
ffc0dde0: 7c 08 02 a6 mflr r0
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0dde4: 89 09 00 32 lbz r8,50(r9)
void _Workspace_Handler_initialization(
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
ffc0dde8: 93 21 00 14 stw r25,20(r1)
ffc0ddec: 7c b9 2b 78 mr r25,r5
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0ddf0: 2f 88 00 00 cmpwi cr7,r8,0
void _Workspace_Handler_initialization(
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
ffc0ddf4: 93 61 00 1c stw r27,28(r1)
ffc0ddf8: 7c 9b 23 78 mr r27,r4
ffc0ddfc: 93 81 00 20 stw r28,32(r1)
ffc0de00: 90 01 00 34 stw r0,52(r1)
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0de04: 83 8a ea f8 lwz r28,-5384(r10)
ffc0de08: 39 40 00 00 li r10,0
void _Workspace_Handler_initialization(
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
ffc0de0c: 93 01 00 10 stw r24,16(r1)
ffc0de10: 93 41 00 18 stw r26,24(r1)
ffc0de14: 93 a1 00 24 stw r29,36(r1)
ffc0de18: 93 c1 00 28 stw r30,40(r1)
ffc0de1c: 93 e1 00 2c stw r31,44(r1)
ffc0de20: 91 81 00 0c stw r12,12(r1)
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0de24: 40 9e 00 08 bne- cr7,ffc0de2c <_Workspace_Handler_initialization+0x5c>
ffc0de28: 81 49 00 04 lwz r10,4(r9)
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
ffc0de2c: 2f 9b 00 00 cmpwi cr7,r27,0
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
uintptr_t remaining = rtems_configuration_get_work_space_size();
ffc0de30: 7f 8a e2 14 add r28,r10,r28
bool do_zero = rtems_configuration_get_do_zero_of_workspace();
ffc0de34: 89 49 00 30 lbz r10,48(r9)
bool unified = rtems_configuration_get_unified_work_area();
ffc0de38: 89 29 00 31 lbz r9,49(r9)
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
ffc0de3c: 41 9e 00 a0 beq- cr7,ffc0dedc <_Workspace_Handler_initialization+0x10c><== NEVER TAKEN
ffc0de40: 2e 0a 00 00 cmpwi cr4,r10,0
if ( area->size > overhead ) {
uintptr_t space_available;
uintptr_t size;
if ( unified ) {
ffc0de44: 2d 89 00 00 cmpwi cr3,r9,0
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
ffc0de48: 3f 40 ff c1 lis r26,-63
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
ffc0de4c: 3f 00 00 00 lis r24,0
ffc0de50: 7c 7f 1b 78 mr r31,r3
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
ffc0de54: 3b a0 00 00 li r29,0
Heap_Area *areas,
size_t area_count,
Heap_Initialization_or_extend_handler extend
)
{
Heap_Initialization_or_extend_handler init_or_extend = _Heap_Initialize;
ffc0de58: 3b 5a b0 60 addi r26,r26,-20384
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
ffc0de5c: 3b 18 2d 14 addi r24,r24,11540
size_t i;
for (i = 0; i < area_count; ++i) {
Heap_Area *area = &areas [i];
if ( do_zero ) {
ffc0de60: 40 92 00 bc bne- cr4,ffc0df1c <_Workspace_Handler_initialization+0x14c>
memset( area->begin, 0, area->size );
}
if ( area->size > overhead ) {
ffc0de64: 83 df 00 04 lwz r30,4(r31)
ffc0de68: 2b 9e 00 16 cmplwi cr7,r30,22
ffc0de6c: 40 9d 00 60 ble- cr7,ffc0decc <_Workspace_Handler_initialization+0xfc>
uintptr_t space_available;
uintptr_t size;
if ( unified ) {
ffc0de70: 40 8e 00 1c bne- cr3,ffc0de8c <_Workspace_Handler_initialization+0xbc>
size = area->size;
} else {
if ( remaining > 0 ) {
ffc0de74: 2f 9c 00 00 cmpwi cr7,r28,0
ffc0de78: 41 9e 00 b8 beq- cr7,ffc0df30 <_Workspace_Handler_initialization+0x160><== NEVER TAKEN
size = remaining < area->size - overhead ?
ffc0de7c: 39 3e ff ea addi r9,r30,-22
remaining + overhead : area->size;
ffc0de80: 7f 89 e0 40 cmplw cr7,r9,r28
ffc0de84: 40 9d 00 08 ble- cr7,ffc0de8c <_Workspace_Handler_initialization+0xbc><== NEVER TAKEN
ffc0de88: 3b dc 00 16 addi r30,r28,22
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
ffc0de8c: 7f c5 f3 78 mr r5,r30
ffc0de90: 80 9f 00 00 lwz r4,0(r31)
ffc0de94: 7f 03 c3 78 mr r3,r24
ffc0de98: 7f 49 03 a6 mtctr r26
ffc0de9c: 38 c0 00 08 li r6,8
ffc0dea0: 4e 80 04 21 bctrl
area->begin,
size,
page_size
);
area->begin = (char *) area->begin + size;
ffc0dea4: 81 5f 00 00 lwz r10,0(r31)
area->size -= size;
if ( space_available < remaining ) {
ffc0dea8: 7f 83 e0 40 cmplw cr7,r3,r28
size,
page_size
);
area->begin = (char *) area->begin + size;
area->size -= size;
ffc0deac: 81 3f 00 04 lwz r9,4(r31)
area->begin,
size,
page_size
);
area->begin = (char *) area->begin + size;
ffc0deb0: 7d 4a f2 14 add r10,r10,r30
area->size -= size;
ffc0deb4: 7f de 48 50 subf r30,r30,r9
area->begin,
size,
page_size
);
area->begin = (char *) area->begin + size;
ffc0deb8: 91 5f 00 00 stw r10,0(r31)
area->size -= size;
ffc0debc: 93 df 00 04 stw r30,4(r31)
if ( space_available < remaining ) {
ffc0dec0: 40 9c 00 90 bge- cr7,ffc0df50 <_Workspace_Handler_initialization+0x180><== ALWAYS TAKEN
remaining -= space_available;
ffc0dec4: 7f 83 e0 50 subf r28,r3,r28 <== NOT EXECUTED
} else {
remaining = 0;
}
init_or_extend = extend;
ffc0dec8: 7f 3a cb 78 mr r26,r25 <== NOT EXECUTED
bool unified = rtems_configuration_get_unified_work_area();
uintptr_t page_size = CPU_HEAP_ALIGNMENT;
uintptr_t overhead = _Heap_Area_overhead( page_size );
size_t i;
for (i = 0; i < area_count; ++i) {
ffc0decc: 3b bd 00 01 addi r29,r29,1
ffc0ded0: 7f 9d d8 00 cmpw cr7,r29,r27
ffc0ded4: 3b ff 00 08 addi r31,r31,8
ffc0ded8: 40 9e ff 88 bne+ cr7,ffc0de60 <_Workspace_Handler_initialization+0x90><== NEVER TAKEN
init_or_extend = extend;
}
}
if ( remaining > 0 ) {
ffc0dedc: 2f 9c 00 00 cmpwi cr7,r28,0
ffc0dee0: 40 9e 00 7c bne- cr7,ffc0df5c <_Workspace_Handler_initialization+0x18c>
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
);
}
}
ffc0dee4: 80 01 00 34 lwz r0,52(r1)
ffc0dee8: 81 81 00 0c lwz r12,12(r1)
ffc0deec: 7c 08 03 a6 mtlr r0
ffc0def0: 83 01 00 10 lwz r24,16(r1)
ffc0def4: 83 21 00 14 lwz r25,20(r1)
ffc0def8: 7d 81 81 20 mtcrf 24,r12
ffc0defc: 83 41 00 18 lwz r26,24(r1)
ffc0df00: 83 61 00 1c lwz r27,28(r1)
ffc0df04: 83 81 00 20 lwz r28,32(r1)
ffc0df08: 83 a1 00 24 lwz r29,36(r1)
ffc0df0c: 83 c1 00 28 lwz r30,40(r1)
ffc0df10: 83 e1 00 2c lwz r31,44(r1)
ffc0df14: 38 21 00 30 addi r1,r1,48
ffc0df18: 4e 80 00 20 blr
for (i = 0; i < area_count; ++i) {
Heap_Area *area = &areas [i];
if ( do_zero ) {
memset( area->begin, 0, area->size );
ffc0df1c: 80 7f 00 00 lwz r3,0(r31)
ffc0df20: 38 80 00 00 li r4,0
ffc0df24: 80 bf 00 04 lwz r5,4(r31)
ffc0df28: 48 00 5f 49 bl ffc13e70 <memset>
ffc0df2c: 4b ff ff 38 b ffc0de64 <_Workspace_Handler_initialization+0x94>
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
ffc0df30: 7f 49 03 a6 mtctr r26 <== NOT EXECUTED
ffc0df34: 7f 03 c3 78 mr r3,r24 <== NOT EXECUTED
ffc0df38: 80 9f 00 00 lwz r4,0(r31) <== NOT EXECUTED
ffc0df3c: 38 a0 00 00 li r5,0 <== NOT EXECUTED
ffc0df40: 38 c0 00 08 li r6,8 <== NOT EXECUTED
remaining -= space_available;
} else {
remaining = 0;
}
init_or_extend = extend;
ffc0df44: 7f 3a cb 78 mr r26,r25 <== NOT EXECUTED
} else {
size = 0;
}
}
space_available = (*init_or_extend)(
ffc0df48: 4e 80 04 21 bctrl <== NOT EXECUTED
ffc0df4c: 4b ff ff 80 b ffc0decc <_Workspace_Handler_initialization+0xfc><== NOT EXECUTED
remaining -= space_available;
} else {
remaining = 0;
}
init_or_extend = extend;
ffc0df50: 7f 3a cb 78 mr r26,r25
area->size -= size;
if ( space_available < remaining ) {
remaining -= space_available;
} else {
remaining = 0;
ffc0df54: 3b 80 00 00 li r28,0
ffc0df58: 4b ff ff 74 b ffc0decc <_Workspace_Handler_initialization+0xfc>
init_or_extend = extend;
}
}
if ( remaining > 0 ) {
_Internal_error_Occurred(
ffc0df5c: 38 60 00 00 li r3,0
ffc0df60: 38 80 00 01 li r4,1
ffc0df64: 38 a0 00 02 li r5,2
ffc0df68: 4b ff d4 09 bl ffc0b370 <_Internal_error_Occurred>
ffc09418 <adjtime>:
*/
int adjtime(
const struct timeval *delta,
struct timeval *olddelta
)
{
ffc09418: 94 21 ff d0 stwu r1,-48(r1)
ffc0941c: 7d 80 00 26 mfcr r12
ffc09420: 7c 08 02 a6 mflr r0
ffc09424: 93 81 00 20 stw r28,32(r1)
long adjustment;
/*
* Simple validations
*/
if ( !delta )
ffc09428: 7c 7c 1b 79 mr. r28,r3
*/
int adjtime(
const struct timeval *delta,
struct timeval *olddelta
)
{
ffc0942c: 90 01 00 34 stw r0,52(r1)
ffc09430: 93 61 00 1c stw r27,28(r1)
ffc09434: 93 a1 00 24 stw r29,36(r1)
ffc09438: 93 c1 00 28 stw r30,40(r1)
ffc0943c: 93 e1 00 2c stw r31,44(r1)
ffc09440: 91 81 00 18 stw r12,24(r1)
long adjustment;
/*
* Simple validations
*/
if ( !delta )
ffc09444: 41 82 01 a4 beq- ffc095e8 <adjtime+0x1d0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
ffc09448: 81 5c 00 04 lwz r10,4(r28)
ffc0944c: 3d 20 00 0f lis r9,15
ffc09450: 61 29 42 3f ori r9,r9,16959
ffc09454: 7f 8a 48 40 cmplw cr7,r10,r9
ffc09458: 41 9d 01 90 bgt- cr7,ffc095e8 <adjtime+0x1d0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
ffc0945c: 2e 04 00 00 cmpwi cr4,r4,0
ffc09460: 7c 9b 23 78 mr r27,r4
ffc09464: 41 92 00 14 beq- cr4,ffc09478 <adjtime+0x60>
olddelta->tv_sec = 0;
ffc09468: 39 20 00 00 li r9,0
olddelta->tv_usec = 0;
ffc0946c: 91 24 00 04 stw r9,4(r4)
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
olddelta->tv_sec = 0;
ffc09470: 91 24 00 00 stw r9,0(r4)
ffc09474: 81 5c 00 04 lwz r10,4(r28)
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
ffc09478: 81 3c 00 00 lwz r9,0(r28)
ffc0947c: 55 27 40 2e rlwinm r7,r9,8,0,23
ffc09480: 55 28 18 38 rlwinm r8,r9,3,0,28
ffc09484: 7d 08 38 50 subf r8,r8,r7
ffc09488: 55 07 30 32 rlwinm r7,r8,6,0,25
ffc0948c: 7d 08 38 50 subf r8,r8,r7
ffc09490: 7d 28 4a 14 add r9,r8,r9
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
ffc09494: 3d 00 ff c2 lis r8,-62
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
ffc09498: 55 29 30 32 rlwinm r9,r9,6,0,25
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
ffc0949c: 80 e8 b7 00 lwz r7,-18688(r8)
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
adjustment += delta->tv_usec;
ffc094a0: 7d 49 52 14 add r10,r9,r10
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
ffc094a4: 7f 8a 38 40 cmplw cr7,r10,r7
ffc094a8: 40 9c 00 34 bge- cr7,ffc094dc <adjtime+0xc4>
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
ffc094ac: 38 60 00 00 li r3,0
}
ffc094b0: 80 01 00 34 lwz r0,52(r1)
ffc094b4: 81 81 00 18 lwz r12,24(r1)
ffc094b8: 7c 08 03 a6 mtlr r0
ffc094bc: 83 61 00 1c lwz r27,28(r1)
ffc094c0: 83 81 00 20 lwz r28,32(r1)
ffc094c4: 7d 80 81 20 mtcrf 8,r12
ffc094c8: 83 a1 00 24 lwz r29,36(r1)
ffc094cc: 83 c1 00 28 lwz r30,40(r1)
ffc094d0: 83 e1 00 2c lwz r31,44(r1)
ffc094d4: 38 21 00 30 addi r1,r1,48
ffc094d8: 4e 80 00 20 blr
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc094dc: 3d 20 00 00 lis r9,0
ffc094e0: 81 49 29 84 lwz r10,10628(r9)
++level;
ffc094e4: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc094e8: 91 49 29 84 stw r10,10628(r9)
)
{
Timestamp_Control tod_as_timestamp;
Timestamp_Control *tod_as_timestamp_ptr;
tod_as_timestamp_ptr =
ffc094ec: 3c 80 00 00 lis r4,0
ffc094f0: 38 84 2d a0 addi r4,r4,11680
ffc094f4: 38 61 00 08 addi r3,r1,8
ffc094f8: 48 00 1f 39 bl ffc0b430 <_TOD_Get_with_nanoseconds>
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc094fc: 3c c0 3b 9a lis r6,15258
ffc09500: 83 e3 00 04 lwz r31,4(r3)
ffc09504: 38 a0 00 00 li r5,0
ffc09508: 83 c3 00 00 lwz r30,0(r3)
ffc0950c: 60 c6 ca 00 ori r6,r6,51712
ffc09510: 7f e4 fb 78 mr r4,r31
ffc09514: 7f c3 f3 78 mr r3,r30
ffc09518: 48 01 02 2d bl ffc19744 <__divdi3>
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
ffc0951c: 83 bc 00 00 lwz r29,0(r28)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc09520: 3c c0 3b 9a lis r6,15258
ffc09524: 7f bd 22 14 add r29,r29,r4
ffc09528: 38 a0 00 00 li r5,0
ffc0952c: 60 c6 ca 00 ori r6,r6,51712
ffc09530: 7f c3 f3 78 mr r3,r30
ffc09534: 7f e4 fb 78 mr r4,r31
ffc09538: 48 01 06 31 bl ffc19b68 <__moddi3>
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
ffc0953c: 81 3c 00 04 lwz r9,4(r28)
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc09540: 3d 40 3b 9a lis r10,15258
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
ffc09544: 1d 29 03 e8 mulli r9,r9,1000
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc09548: 61 4a c9 ff ori r10,r10,51711
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
ffc0954c: 7c 84 4a 14 add r4,r4,r9
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
ffc09550: 7f 84 50 40 cmplw cr7,r4,r10
int _EXFUN(setitimer, (int __which, const struct itimerval *__value,
struct itimerval *__ovalue));
#if defined(__rtems__)
/* BSD function used by RTEMS code */
int _EXFUN(adjtime,(const struct timeval *, struct timeval *));
ffc09554: 39 1d 00 01 addi r8,r29,1
ffc09558: 40 9d 00 1c ble- cr7,ffc09574 <adjtime+0x15c>
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ffc0955c: 3d 24 c4 65 addis r9,r4,-15259
ffc09560: 38 89 36 00 addi r4,r9,13824
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 ) {
ffc09564: 7f 84 50 40 cmplw cr7,r4,r10
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
ffc09568: 7d 1d 43 78 mr r29,r8
ffc0956c: 39 08 00 01 addi r8,r8,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 ) {
ffc09570: 41 9d ff ec bgt+ cr7,ffc0955c <adjtime+0x144> <== NEVER TAKEN
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) ) {
ffc09574: 3d 20 c4 65 lis r9,-15259
ffc09578: 7c 87 23 78 mr r7,r4
ffc0957c: 39 5d ff ff addi r10,r29,-1
ffc09580: 61 29 36 00 ori r9,r9,13824
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
ffc09584: 3c e7 3b 9b addis r7,r7,15259
ffc09588: 38 e7 ca 00 addi r7,r7,-13824
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) ) {
ffc0958c: 7f 87 48 40 cmplw cr7,r7,r9
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec--;
ffc09590: 7d 46 53 78 mr r6,r10
ffc09594: 39 4a ff ff addi r10,r10,-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) ) {
ffc09598: 40 9d ff ec ble+ cr7,ffc09584 <adjtime+0x16c>
Timestamp64_Control *_time,
Timestamp64_Control _seconds,
Timestamp64_Control _nanoseconds
)
{
*_time = _seconds * 1000000000L + _nanoseconds;
ffc0959c: 3c a0 3b 9a lis r5,15258
ffc095a0: 60 a5 ca 00 ori r5,r5,51712
ffc095a4: 7d 06 28 96 mulhw r8,r6,r5
ffc095a8: 7d 26 29 d6 mullw r9,r6,r5
const struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_Timestamp_Set(
ffc095ac: 7c eb 3b 78 mr r11,r7
ffc095b0: 7c ea fe 70 srawi r10,r7,31
ffc095b4: 7d 6b 48 14 addc r11,r11,r9
ffc095b8: 7d 4a 41 14 adde r10,r10,r8
ffc095bc: 91 41 00 08 stw r10,8(r1)
&tod_as_timestamp,
tod_as_timespec->tv_sec,
tod_as_timespec->tv_nsec
);
_TOD_Set_with_timestamp( &tod_as_timestamp );
ffc095c0: 38 61 00 08 addi r3,r1,8
ffc095c4: 91 61 00 0c stw r11,12(r1)
ffc095c8: 48 00 1f 25 bl ffc0b4ec <_TOD_Set_with_timestamp>
ts.tv_sec--;
}
_TOD_Set( &ts );
_Thread_Enable_dispatch();
ffc095cc: 48 00 3c 2d bl ffc0d1f8 <_Thread_Enable_dispatch>
/* set the user's output */
if ( olddelta )
ffc095d0: 41 b2 fe dc beq- cr4,ffc094ac <adjtime+0x94>
*olddelta = *delta;
ffc095d4: 81 3c 00 00 lwz r9,0(r28)
ffc095d8: 81 5c 00 04 lwz r10,4(r28)
ffc095dc: 91 3b 00 00 stw r9,0(r27)
ffc095e0: 91 5b 00 04 stw r10,4(r27)
ffc095e4: 4b ff fe c8 b ffc094ac <adjtime+0x94>
*/
if ( !delta )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc095e8: 48 00 a2 41 bl ffc13828 <__errno>
ffc095ec: 39 20 00 16 li r9,22
ffc095f0: 91 23 00 00 stw r9,0(r3)
ffc095f4: 38 60 ff ff li r3,-1
ffc095f8: 4b ff fe b8 b ffc094b0 <adjtime+0x98>
ffc096d4 <aio_cancel>:
#include <stdlib.h>
#include <rtems/system.h>
#include <rtems/seterr.h>
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
ffc096d4: 94 21 ff e8 stwu r1,-24(r1)
ffc096d8: 7c 08 02 a6 mflr r0
ffc096dc: 93 e1 00 14 stw r31,20(r1)
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
ffc096e0: 3f e0 00 00 lis r31,0
ffc096e4: 3b ff 2b b8 addi r31,r31,11192
#include <stdlib.h>
#include <rtems/system.h>
#include <rtems/seterr.h>
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
ffc096e8: 93 a1 00 0c stw r29,12(r1)
ffc096ec: 7c 7d 1b 78 mr r29,r3
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
ffc096f0: 7f e3 fb 78 mr r3,r31
#include <stdlib.h>
#include <rtems/system.h>
#include <rtems/seterr.h>
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
ffc096f4: 90 01 00 1c stw r0,28(r1)
ffc096f8: 93 c1 00 10 stw r30,16(r1)
ffc096fc: 7c 9e 23 78 mr r30,r4
ffc09700: 93 81 00 08 stw r28,8(r1)
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
ffc09704: 48 00 16 dd bl ffc0ade0 <pthread_mutex_lock>
if (fcntl (fildes, F_GETFD) < 0) {
ffc09708: 7f a3 eb 78 mr r3,r29
ffc0970c: 38 80 00 01 li r4,1
ffc09710: 4c c6 31 82 crclr 4*cr1+eq
ffc09714: 48 00 7f d1 bl ffc116e4 <fcntl>
ffc09718: 2f 83 00 00 cmpwi cr7,r3,0
ffc0971c: 41 9c 01 bc blt- cr7,ffc098d8 <aio_cancel+0x204>
pthread_mutex_unlock(&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EBADF);
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
ffc09720: 2f 9e 00 00 cmpwi cr7,r30,0
ffc09724: 41 9e 01 08 beq- cr7,ffc0982c <aio_cancel+0x158>
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
ffc09728: 83 9e 00 00 lwz r28,0(r30)
ffc0972c: 7f 9c e8 00 cmpw cr7,r28,r29
ffc09730: 40 9e 00 e0 bne- cr7,ffc09810 <aio_cancel+0x13c>
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);
ffc09734: 38 7f 00 48 addi r3,r31,72
ffc09738: 7f 84 e3 78 mr r4,r28
ffc0973c: 38 a0 00 00 li r5,0
ffc09740: 48 00 07 05 bl ffc09e44 <rtems_aio_search_fd>
if (r_chain == NULL) {
ffc09744: 7c 7d 1b 79 mr. r29,r3
ffc09748: 41 82 00 54 beq- ffc0979c <aio_cancel+0xc8>
return AIO_ALLDONE;
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
ffc0974c: 3b 9d 00 1c addi r28,r29,28
ffc09750: 7f 83 e3 78 mr r3,r28
ffc09754: 48 00 16 8d bl ffc0ade0 <pthread_mutex_lock>
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
ffc09758: 7f c4 f3 78 mr r4,r30
ffc0975c: 38 7d 00 08 addi r3,r29,8
ffc09760: 48 00 08 9d bl ffc09ffc <rtems_aio_remove_req>
ffc09764: 7c 7e 1b 78 mr r30,r3
pthread_mutex_unlock (&r_chain->mutex);
ffc09768: 7f 83 e3 78 mr r3,r28
ffc0976c: 48 00 17 25 bl ffc0ae90 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
ffc09770: 7f e3 fb 78 mr r3,r31
ffc09774: 48 00 17 1d bl ffc0ae90 <pthread_mutex_unlock>
return result;
}
return AIO_ALLDONE;
}
ffc09778: 80 01 00 1c lwz r0,28(r1)
ffc0977c: 7f c3 f3 78 mr r3,r30
ffc09780: 83 81 00 08 lwz r28,8(r1)
ffc09784: 7c 08 03 a6 mtlr r0
ffc09788: 83 a1 00 0c lwz r29,12(r1)
ffc0978c: 83 c1 00 10 lwz r30,16(r1)
ffc09790: 83 e1 00 14 lwz r31,20(r1)
ffc09794: 38 21 00 18 addi r1,r1,24
ffc09798: 4e 80 00 20 blr
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)) {
ffc0979c: 81 3f 00 54 lwz r9,84(r31)
ffc097a0: 39 5f 00 58 addi r10,r31,88
ffc097a4: 7f 89 50 00 cmpw cr7,r9,r10
ffc097a8: 41 9e 00 58 beq- cr7,ffc09800 <aio_cancel+0x12c> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
ffc097ac: 38 7f 00 54 addi r3,r31,84
ffc097b0: 7f 84 e3 78 mr r4,r28
ffc097b4: 38 a0 00 00 li r5,0
ffc097b8: 48 00 06 8d bl ffc09e44 <rtems_aio_search_fd>
if (r_chain == NULL) {
ffc097bc: 2c 03 00 00 cmpwi r3,0
ffc097c0: 41 82 00 50 beq- ffc09810 <aio_cancel+0x13c>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
ffc097c4: 7f c4 f3 78 mr r4,r30
ffc097c8: 38 63 00 08 addi r3,r3,8
ffc097cc: 48 00 08 31 bl ffc09ffc <rtems_aio_remove_req>
ffc097d0: 7c 7e 1b 78 mr r30,r3
pthread_mutex_unlock (&aio_request_queue.mutex);
ffc097d4: 7f e3 fb 78 mr r3,r31
ffc097d8: 48 00 16 b9 bl ffc0ae90 <pthread_mutex_unlock>
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
return AIO_ALLDONE;
}
ffc097dc: 80 01 00 1c lwz r0,28(r1)
ffc097e0: 7f c3 f3 78 mr r3,r30
ffc097e4: 83 81 00 08 lwz r28,8(r1)
ffc097e8: 7c 08 03 a6 mtlr r0
ffc097ec: 83 a1 00 0c lwz r29,12(r1)
ffc097f0: 83 c1 00 10 lwz r30,16(r1)
ffc097f4: 83 e1 00 14 lwz r31,20(r1)
ffc097f8: 38 21 00 18 addi r1,r1,24
ffc097fc: 4e 80 00 20 blr
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
if (r_chain == NULL) {
pthread_mutex_unlock(&aio_request_queue.mutex);
ffc09800: 7f e3 fb 78 mr r3,r31
ffc09804: 48 00 16 8d bl ffc0ae90 <pthread_mutex_unlock>
return AIO_ALLDONE;
ffc09808: 3b c0 00 02 li r30,2
ffc0980c: 4b ff ff 6c b ffc09778 <aio_cancel+0xa4>
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);
ffc09810: 7f e3 fb 78 mr r3,r31
ffc09814: 48 00 16 7d bl ffc0ae90 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
ffc09818: 3b c0 ff ff li r30,-1
ffc0981c: 48 00 c0 95 bl ffc158b0 <__errno>
ffc09820: 39 20 00 16 li r9,22
ffc09824: 91 23 00 00 stw r9,0(r3)
ffc09828: 4b ff ff 50 b ffc09778 <aio_cancel+0xa4>
/* 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);
ffc0982c: 38 7f 00 48 addi r3,r31,72
ffc09830: 7f a4 eb 78 mr r4,r29
ffc09834: 38 a0 00 00 li r5,0
ffc09838: 48 00 06 0d bl ffc09e44 <rtems_aio_search_fd>
if (r_chain == NULL) {
ffc0983c: 7c 7e 1b 79 mr. r30,r3
ffc09840: 41 82 00 38 beq- ffc09878 <aio_cancel+0x1a4>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
ffc09844: 3b be 00 1c addi r29,r30,28
ffc09848: 7f a3 eb 78 mr r3,r29
ffc0984c: 48 00 15 95 bl ffc0ade0 <pthread_mutex_lock>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
ffc09850: 7f c3 f3 78 mr r3,r30
ffc09854: 48 00 36 d1 bl ffc0cf24 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
ffc09858: 7f c3 f3 78 mr r3,r30
ffc0985c: 48 00 07 19 bl ffc09f74 <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
ffc09860: 7f a3 eb 78 mr r3,r29
ffc09864: 48 00 16 2d bl ffc0ae90 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
ffc09868: 7f e3 fb 78 mr r3,r31
ffc0986c: 48 00 16 25 bl ffc0ae90 <pthread_mutex_unlock>
return AIO_CANCELED;
ffc09870: 3b c0 00 00 li r30,0
ffc09874: 4b ff ff 04 b ffc09778 <aio_cancel+0xa4>
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)) {
ffc09878: 81 3f 00 54 lwz r9,84(r31)
ffc0987c: 39 5f 00 58 addi r10,r31,88
ffc09880: 7f 89 50 00 cmpw cr7,r9,r10
ffc09884: 41 be ff 7c beq- cr7,ffc09800 <aio_cancel+0x12c> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
ffc09888: 38 7f 00 54 addi r3,r31,84
ffc0988c: 7f a4 eb 78 mr r4,r29
ffc09890: 38 a0 00 00 li r5,0
ffc09894: 48 00 05 b1 bl ffc09e44 <rtems_aio_search_fd>
if (r_chain == NULL) {
ffc09898: 7c 7e 1b 79 mr. r30,r3
ffc0989c: 41 a2 ff 64 beq- ffc09800 <aio_cancel+0x12c>
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
pthread_mutex_destroy (&r_chain->mutex);
ffc098a0: 3b be 00 1c addi r29,r30,28
ffc098a4: 48 00 36 81 bl ffc0cf24 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
ffc098a8: 7f c3 f3 78 mr r3,r30
ffc098ac: 48 00 06 c9 bl ffc09f74 <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
ffc098b0: 7f a3 eb 78 mr r3,r29
ffc098b4: 48 00 11 85 bl ffc0aa38 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
ffc098b8: 7f a3 eb 78 mr r3,r29
ffc098bc: 48 00 0c c1 bl ffc0a57c <pthread_cond_destroy>
free (r_chain);
ffc098c0: 7f c3 f3 78 mr r3,r30
ffc098c4: 4b ff b5 81 bl ffc04e44 <free>
pthread_mutex_unlock (&aio_request_queue.mutex);
ffc098c8: 7f e3 fb 78 mr r3,r31
ffc098cc: 48 00 15 c5 bl ffc0ae90 <pthread_mutex_unlock>
return AIO_CANCELED;
ffc098d0: 3b c0 00 00 li r30,0
ffc098d4: 4b ff fe a4 b ffc09778 <aio_cancel+0xa4>
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
if (fcntl (fildes, F_GETFD) < 0) {
pthread_mutex_unlock(&aio_request_queue.mutex);
ffc098d8: 7f e3 fb 78 mr r3,r31
ffc098dc: 48 00 15 b5 bl ffc0ae90 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
ffc098e0: 3b c0 ff ff li r30,-1
ffc098e4: 48 00 bf cd bl ffc158b0 <__errno>
ffc098e8: 39 20 00 09 li r9,9
ffc098ec: 91 23 00 00 stw r9,0(r3)
ffc098f0: 4b ff fe 88 b ffc09778 <aio_cancel+0xa4>
ffc098fc <aio_fsync>:
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
ffc098fc: 2f 83 20 00 cmpwi cr7,r3,8192
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
ffc09900: 94 21 ff f0 stwu r1,-16(r1)
ffc09904: 7c 08 02 a6 mflr r0
ffc09908: 93 c1 00 08 stw r30,8(r1)
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
ffc0990c: 3b c0 00 16 li r30,22
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
ffc09910: 93 e1 00 0c stw r31,12(r1)
ffc09914: 7c 9f 23 78 mr r31,r4
ffc09918: 90 01 00 14 stw r0,20(r1)
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
ffc0991c: 40 9e 00 60 bne- cr7,ffc0997c <aio_fsync+0x80>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc09920: 80 64 00 00 lwz r3,0(r4)
ffc09924: 38 80 00 03 li r4,3
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
ffc09928: 3b c0 00 09 li r30,9
int mode;
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0992c: 4c c6 31 82 crclr 4*cr1+eq
ffc09930: 48 00 7d b5 bl ffc116e4 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
ffc09934: 54 63 07 be clrlwi r3,r3,30
ffc09938: 38 63 ff ff addi r3,r3,-1
ffc0993c: 2b 83 00 01 cmplwi cr7,r3,1
ffc09940: 41 9d 00 3c bgt- cr7,ffc0997c <aio_fsync+0x80>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
ffc09944: 38 60 00 18 li r3,24
ffc09948: 4b ff ba c1 bl ffc05408 <malloc>
if (req == NULL)
ffc0994c: 7c 69 1b 79 mr. r9,r3
ffc09950: 41 82 00 28 beq- ffc09978 <aio_fsync+0x7c> <== NEVER TAKEN
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
ffc09954: 80 01 00 14 lwz r0,20(r1)
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
ffc09958: 93 e9 00 14 stw r31,20(r9)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
ffc0995c: 39 20 00 03 li r9,3
return rtems_aio_enqueue (req);
}
ffc09960: 7c 08 03 a6 mtlr r0
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
ffc09964: 91 3f 00 30 stw r9,48(r31)
return rtems_aio_enqueue (req);
}
ffc09968: 83 c1 00 08 lwz r30,8(r1)
ffc0996c: 83 e1 00 0c lwz r31,12(r1)
ffc09970: 38 21 00 10 addi r1,r1,16
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
ffc09974: 48 00 07 30 b ffc0a0a4 <rtems_aio_enqueue>
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)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
ffc09978: 3b c0 00 0b li r30,11 <== NOT EXECUTED
ffc0997c: 39 20 ff ff li r9,-1
ffc09980: 93 df 00 34 stw r30,52(r31)
ffc09984: 91 3f 00 38 stw r9,56(r31)
ffc09988: 48 00 bf 29 bl ffc158b0 <__errno>
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
ffc0998c: 80 01 00 14 lwz r0,20(r1)
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)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
ffc09990: 93 c3 00 00 stw r30,0(r3)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
ffc09994: 38 60 ff ff li r3,-1
ffc09998: 7c 08 03 a6 mtlr r0
ffc0999c: 83 c1 00 08 lwz r30,8(r1)
ffc099a0: 83 e1 00 0c lwz r31,12(r1)
ffc099a4: 38 21 00 10 addi r1,r1,16
ffc099a8: 4e 80 00 20 blr
ffc0a2d4 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
ffc0a2d4: 94 21 ff f0 stwu r1,-16(r1)
ffc0a2d8: 7c 08 02 a6 mflr r0
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0a2dc: 38 80 00 03 li r4,3
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
ffc0a2e0: 90 01 00 14 stw r0,20(r1)
ffc0a2e4: 93 e1 00 0c stw r31,12(r1)
ffc0a2e8: 7c 7f 1b 78 mr r31,r3
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0a2ec: 80 63 00 00 lwz r3,0(r3)
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
ffc0a2f0: 93 c1 00 08 stw r30,8(r1)
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0a2f4: 4c c6 31 82 crclr 4*cr1+eq
ffc0a2f8: 48 00 73 ed bl ffc116e4 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
ffc0a2fc: 70 63 00 03 andi. r3,r3,3
ffc0a300: 41 82 00 10 beq- ffc0a310 <aio_read+0x3c> <== NEVER TAKEN
ffc0a304: 2f 83 00 02 cmpwi cr7,r3,2
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
ffc0a308: 3b c0 00 09 li r30,9
{
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
ffc0a30c: 40 9e 00 20 bne- cr7,ffc0a32c <aio_read+0x58>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
ffc0a310: 81 3f 00 18 lwz r9,24(r31)
ffc0a314: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a318: 40 9e 00 10 bne- cr7,ffc0a328 <aio_read+0x54>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
ffc0a31c: 81 3f 00 08 lwz r9,8(r31)
ffc0a320: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a324: 40 9c 00 38 bge- cr7,ffc0a35c <aio_read+0x88>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
ffc0a328: 3b c0 00 16 li r30,22
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
ffc0a32c: 39 20 ff ff li r9,-1
ffc0a330: 93 df 00 34 stw r30,52(r31)
ffc0a334: 91 3f 00 38 stw r9,56(r31)
ffc0a338: 48 00 b5 79 bl ffc158b0 <__errno>
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
ffc0a33c: 80 01 00 14 lwz r0,20(r1)
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);
ffc0a340: 93 c3 00 00 stw r30,0(r3)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
ffc0a344: 38 60 ff ff li r3,-1
ffc0a348: 7c 08 03 a6 mtlr r0
ffc0a34c: 83 c1 00 08 lwz r30,8(r1)
ffc0a350: 83 e1 00 0c lwz r31,12(r1)
ffc0a354: 38 21 00 10 addi r1,r1,16
ffc0a358: 4e 80 00 20 blr
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
ffc0a35c: 38 60 00 18 li r3,24
ffc0a360: 4b ff b0 a9 bl ffc05408 <malloc>
if (req == NULL)
ffc0a364: 7c 69 1b 79 mr. r9,r3
ffc0a368: 41 82 00 28 beq- ffc0a390 <aio_read+0xbc> <== NEVER TAKEN
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
ffc0a36c: 80 01 00 14 lwz r0,20(r1)
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
ffc0a370: 93 e9 00 14 stw r31,20(r9)
req->aiocbp->aio_lio_opcode = LIO_READ;
ffc0a374: 39 20 00 01 li r9,1
return rtems_aio_enqueue (req);
}
ffc0a378: 7c 08 03 a6 mtlr r0
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
ffc0a37c: 91 3f 00 30 stw r9,48(r31)
return rtems_aio_enqueue (req);
}
ffc0a380: 83 c1 00 08 lwz r30,8(r1)
ffc0a384: 83 e1 00 0c lwz r31,12(r1)
ffc0a388: 38 21 00 10 addi r1,r1,16
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
ffc0a38c: 4b ff fd 18 b ffc0a0a4 <rtems_aio_enqueue>
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);
ffc0a390: 3b c0 00 0b li r30,11 <== NOT EXECUTED
ffc0a394: 4b ff ff 98 b ffc0a32c <aio_read+0x58> <== NOT EXECUTED
ffc0a3a0 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
ffc0a3a0: 94 21 ff f0 stwu r1,-16(r1)
ffc0a3a4: 7c 08 02 a6 mflr r0
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0a3a8: 38 80 00 03 li r4,3
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
ffc0a3ac: 90 01 00 14 stw r0,20(r1)
ffc0a3b0: 93 e1 00 0c stw r31,12(r1)
ffc0a3b4: 7c 7f 1b 78 mr r31,r3
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0a3b8: 80 63 00 00 lwz r3,0(r3)
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
ffc0a3bc: 93 c1 00 08 stw r30,8(r1)
rtems_aio_request *req;
int mode;
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);
ffc0a3c0: 3b c0 00 09 li r30,9
aio_write (struct aiocb *aiocbp)
{
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
ffc0a3c4: 4c c6 31 82 crclr 4*cr1+eq
ffc0a3c8: 48 00 73 1d bl ffc116e4 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
ffc0a3cc: 54 63 07 be clrlwi r3,r3,30
ffc0a3d0: 38 63 ff ff addi r3,r3,-1
ffc0a3d4: 2b 83 00 01 cmplwi cr7,r3,1
ffc0a3d8: 41 9d 00 20 bgt- cr7,ffc0a3f8 <aio_write+0x58>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
ffc0a3dc: 81 3f 00 18 lwz r9,24(r31)
ffc0a3e0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a3e4: 40 9e 00 10 bne- cr7,ffc0a3f4 <aio_write+0x54>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
ffc0a3e8: 81 3f 00 08 lwz r9,8(r31)
ffc0a3ec: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a3f0: 40 9c 00 38 bge- cr7,ffc0a428 <aio_write+0x88>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
ffc0a3f4: 3b c0 00 16 li r30,22
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
ffc0a3f8: 39 20 ff ff li r9,-1
ffc0a3fc: 93 df 00 34 stw r30,52(r31)
ffc0a400: 91 3f 00 38 stw r9,56(r31)
ffc0a404: 48 00 b4 ad bl ffc158b0 <__errno>
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
ffc0a408: 80 01 00 14 lwz r0,20(r1)
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);
ffc0a40c: 93 c3 00 00 stw r30,0(r3)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
ffc0a410: 38 60 ff ff li r3,-1
ffc0a414: 7c 08 03 a6 mtlr r0
ffc0a418: 83 c1 00 08 lwz r30,8(r1)
ffc0a41c: 83 e1 00 0c lwz r31,12(r1)
ffc0a420: 38 21 00 10 addi r1,r1,16
ffc0a424: 4e 80 00 20 blr
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
ffc0a428: 38 60 00 18 li r3,24
ffc0a42c: 4b ff af dd bl ffc05408 <malloc>
if (req == NULL)
ffc0a430: 7c 69 1b 79 mr. r9,r3
ffc0a434: 41 82 00 28 beq- ffc0a45c <aio_write+0xbc> <== NEVER TAKEN
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
ffc0a438: 80 01 00 14 lwz r0,20(r1)
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
ffc0a43c: 93 e9 00 14 stw r31,20(r9)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
ffc0a440: 39 20 00 02 li r9,2
return rtems_aio_enqueue (req);
}
ffc0a444: 7c 08 03 a6 mtlr r0
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
ffc0a448: 91 3f 00 30 stw r9,48(r31)
return rtems_aio_enqueue (req);
}
ffc0a44c: 83 c1 00 08 lwz r30,8(r1)
ffc0a450: 83 e1 00 0c lwz r31,12(r1)
ffc0a454: 38 21 00 10 addi r1,r1,16
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
ffc0a458: 4b ff fc 4c b ffc0a0a4 <rtems_aio_enqueue>
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);
ffc0a45c: 3b c0 00 0b li r30,11 <== NOT EXECUTED
ffc0a460: 4b ff ff 98 b ffc0a3f8 <aio_write+0x58> <== NOT EXECUTED
ffc0a958 <check_and_merge>:
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
ffc0a958: 2f 86 ff f8 cmpwi cr7,r6,-8
rtems_chain_control *free_chain,
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
ffc0a95c: 7c 6a 1b 78 mr r10,r3
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
ffc0a960: 4d 9e 00 20 beqlr cr7
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
ffc0a964: 81 26 00 00 lwz r9,0(r6)
ffc0a968: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a96c: 41 9e 00 60 beq- cr7,ffc0a9cc <check_and_merge+0x74>
if (b->begin < a->begin) {
ffc0a970: 80 e6 00 18 lwz r7,24(r6)
ffc0a974: 81 05 00 18 lwz r8,24(r5)
ffc0a978: 7f 87 40 40 cmplw cr7,r7,r8
ffc0a97c: 40 9c 00 14 bge- cr7,ffc0a990 <check_and_merge+0x38>
ffc0a980: 7c a8 2b 78 mr r8,r5
ffc0a984: 81 25 00 00 lwz r9,0(r5)
ffc0a988: 7c c5 33 78 mr r5,r6
ffc0a98c: 7d 06 43 78 mr r6,r8
a = b;
b = t;
}
a->size += b->size;
ffc0a990: 80 65 00 1c lwz r3,28(r5)
ffc0a994: 80 e6 00 1c lwz r7,28(r6)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
ffc0a998: 81 06 00 04 lwz r8,4(r6)
ffc0a99c: 7c e3 3a 14 add r7,r3,r7
ffc0a9a0: 90 e5 00 1c stw r7,28(r5)
rtems_chain_extract_unprotected(&b->chain_node);
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
ffc0a9a4: 7c 83 23 78 mr r3,r4
ffc0a9a8: 38 86 00 08 addi r4,r6,8
next->previous = previous;
previous->next = next;
ffc0a9ac: 91 28 00 00 stw r9,0(r8)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0a9b0: 80 ea 00 00 lwz r7,0(r10)
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
next->previous = previous;
ffc0a9b4: 91 09 00 04 stw r8,4(r9)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
ffc0a9b8: 90 ca 00 00 stw r6,0(r10)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0a9bc: 91 46 00 04 stw r10,4(r6)
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
ffc0a9c0: 90 e6 00 00 stw r7,0(r6)
before_node->previous = the_node;
ffc0a9c4: 90 c7 00 04 stw r6,4(r7)
ffc0a9c8: 48 00 1f 94 b ffc0c95c <_RBTree_Extract_unprotected>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
ffc0a9cc: 81 06 00 04 lwz r8,4(r6)
ffc0a9d0: 2f 88 00 00 cmpwi cr7,r8,0
ffc0a9d4: 40 9e ff 9c bne+ cr7,ffc0a970 <check_and_merge+0x18> <== NEVER TAKEN
ffc0a9d8: 4e 80 00 20 blr
ffc0925c <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
ffc0925c: 94 21 ff d8 stwu r1,-40(r1)
ffc09260: 7c 08 02 a6 mflr r0
ffc09264: 93 a1 00 1c stw r29,28(r1)
if ( !tp )
ffc09268: 7c 9d 23 79 mr. r29,r4
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
ffc0926c: 90 01 00 2c stw r0,44(r1)
ffc09270: 93 c1 00 20 stw r30,32(r1)
ffc09274: 93 e1 00 24 stw r31,36(r1)
if ( !tp )
ffc09278: 41 82 00 24 beq- ffc0929c <clock_gettime+0x40>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
ffc0927c: 2f 83 00 01 cmpwi cr7,r3,1
ffc09280: 41 9e 00 9c beq- cr7,ffc0931c <clock_gettime+0xc0>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
ffc09284: 2f 83 00 04 cmpwi cr7,r3,4
ffc09288: 41 9e 00 6c beq- cr7,ffc092f4 <clock_gettime+0x98> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME_ID ) {
ffc0928c: 2f 83 00 02 cmpwi cr7,r3,2
ffc09290: 41 9e 00 64 beq- cr7,ffc092f4 <clock_gettime+0x98>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
ffc09294: 2f 83 00 03 cmpwi cr7,r3,3
ffc09298: 41 9e 00 30 beq- cr7,ffc092c8 <clock_gettime+0x6c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
ffc0929c: 48 00 ad 11 bl ffc13fac <__errno>
ffc092a0: 39 20 00 16 li r9,22
ffc092a4: 91 23 00 00 stw r9,0(r3)
ffc092a8: 38 60 ff ff li r3,-1
return 0;
}
ffc092ac: 80 01 00 2c lwz r0,44(r1)
ffc092b0: 83 a1 00 1c lwz r29,28(r1)
ffc092b4: 7c 08 03 a6 mtlr r0
ffc092b8: 83 c1 00 20 lwz r30,32(r1)
ffc092bc: 83 e1 00 24 lwz r31,36(r1)
ffc092c0: 38 21 00 28 addi r1,r1,40
ffc092c4: 4e 80 00 20 blr
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc092c8: 48 00 ac e5 bl ffc13fac <__errno>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc092cc: 80 01 00 2c lwz r0,44(r1)
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc092d0: 39 20 00 58 li r9,88
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc092d4: 83 a1 00 1c lwz r29,28(r1)
ffc092d8: 7c 08 03 a6 mtlr r0
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc092dc: 91 23 00 00 stw r9,0(r3)
ffc092e0: 38 60 ff ff li r3,-1
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc092e4: 83 c1 00 20 lwz r30,32(r1)
ffc092e8: 83 e1 00 24 lwz r31,36(r1)
ffc092ec: 38 21 00 28 addi r1,r1,40
ffc092f0: 4e 80 00 20 blr
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
_TOD_Get_uptime_as_timespec( tp );
ffc092f4: 7f a3 eb 78 mr r3,r29
ffc092f8: 48 00 28 29 bl ffc0bb20 <_TOD_Get_uptime_as_timespec>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc092fc: 80 01 00 2c lwz r0,44(r1)
ffc09300: 83 a1 00 1c lwz r29,28(r1)
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
_TOD_Get_uptime_as_timespec( tp );
return 0;
ffc09304: 38 60 00 00 li r3,0
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc09308: 7c 08 03 a6 mtlr r0
ffc0930c: 83 c1 00 20 lwz r30,32(r1)
ffc09310: 83 e1 00 24 lwz r31,36(r1)
ffc09314: 38 21 00 28 addi r1,r1,40
ffc09318: 4e 80 00 20 blr
)
{
Timestamp_Control tod_as_timestamp;
Timestamp_Control *tod_as_timestamp_ptr;
tod_as_timestamp_ptr =
ffc0931c: 3c 80 00 00 lis r4,0
ffc09320: 38 84 2c a0 addi r4,r4,11424
ffc09324: 38 61 00 08 addi r3,r1,8
ffc09328: 48 00 27 75 bl ffc0ba9c <_TOD_Get_with_nanoseconds>
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc0932c: 3c c0 3b 9a lis r6,15258
ffc09330: 83 e3 00 04 lwz r31,4(r3)
ffc09334: 38 a0 00 00 li r5,0
ffc09338: 83 c3 00 00 lwz r30,0(r3)
ffc0933c: 60 c6 ca 00 ori r6,r6,51712
ffc09340: 7f e4 fb 78 mr r4,r31
ffc09344: 7f c3 f3 78 mr r3,r30
ffc09348: 48 01 15 05 bl ffc1a84c <__divdi3>
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc0934c: 3c c0 3b 9a lis r6,15258
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc09350: 90 9d 00 00 stw r4,0(r29)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc09354: 38 a0 00 00 li r5,0
ffc09358: 60 c6 ca 00 ori r6,r6,51712
ffc0935c: 7f c3 f3 78 mr r3,r30
ffc09360: 7f e4 fb 78 mr r4,r31
ffc09364: 48 01 19 0d bl ffc1ac70 <__moddi3>
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
_TOD_Get(tp);
return 0;
ffc09368: 38 60 00 00 li r3,0
ffc0936c: 90 9d 00 04 stw r4,4(r29)
ffc09370: 4b ff ff 3c b ffc092ac <clock_gettime+0x50>
ffc2eb68 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
if ( !tp )
ffc2eb68: 2c 04 00 00 cmpwi r4,0
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
ffc2eb6c: 94 21 ff e8 stwu r1,-24(r1)
ffc2eb70: 7c 08 02 a6 mflr r0
ffc2eb74: 90 01 00 1c stw r0,28(r1)
if ( !tp )
ffc2eb78: 41 82 00 1c beq- ffc2eb94 <clock_settime+0x2c> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
ffc2eb7c: 2f 83 00 01 cmpwi cr7,r3,1
ffc2eb80: 41 9e 00 34 beq- cr7,ffc2ebb4 <clock_settime+0x4c>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
ffc2eb84: 2f 83 00 02 cmpwi cr7,r3,2
ffc2eb88: 41 9e 00 9c beq- cr7,ffc2ec24 <clock_settime+0xbc>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
ffc2eb8c: 2f 83 00 03 cmpwi cr7,r3,3
ffc2eb90: 41 9e 00 94 beq- cr7,ffc2ec24 <clock_settime+0xbc>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
ffc2eb94: 48 01 4e 85 bl ffc43a18 <__errno>
return 0;
}
ffc2eb98: 80 01 00 1c lwz r0,28(r1)
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
ffc2eb9c: 39 20 00 16 li r9,22
return 0;
}
ffc2eba0: 7c 08 03 a6 mtlr r0
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
ffc2eba4: 91 23 00 00 stw r9,0(r3)
ffc2eba8: 38 60 ff ff li r3,-1
return 0;
}
ffc2ebac: 38 21 00 18 addi r1,r1,24
ffc2ebb0: 4e 80 00 20 blr
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
ffc2ebb4: 81 24 00 00 lwz r9,0(r4)
ffc2ebb8: 3d 40 21 da lis r10,8666
ffc2ebbc: 61 4a e4 ff ori r10,r10,58623
ffc2ebc0: 7f 89 50 40 cmplw cr7,r9,r10
ffc2ebc4: 40 bd ff d0 ble- cr7,ffc2eb94 <clock_settime+0x2c>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc2ebc8: 3d 20 00 00 lis r9,0
ffc2ebcc: 81 49 34 e4 lwz r10,13540(r9)
++level;
ffc2ebd0: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc2ebd4: 91 49 34 e4 stw r10,13540(r9)
Timestamp64_Control *_time,
Timestamp64_Control _seconds,
Timestamp64_Control _nanoseconds
)
{
*_time = _seconds * 1000000000L + _nanoseconds;
ffc2ebd8: 3c e0 3b 9a lis r7,15258
const struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_Timestamp_Set(
ffc2ebdc: 80 c4 00 00 lwz r6,0(r4)
ffc2ebe0: 60 e7 ca 00 ori r7,r7,51712
ffc2ebe4: 81 64 00 04 lwz r11,4(r4)
ffc2ebe8: 7d 06 38 96 mulhw r8,r6,r7
ffc2ebec: 7d 26 39 d6 mullw r9,r6,r7
ffc2ebf0: 7d 6a fe 70 srawi r10,r11,31
ffc2ebf4: 7d 6b 48 14 addc r11,r11,r9
ffc2ebf8: 7d 4a 41 14 adde r10,r10,r8
ffc2ebfc: 7c 23 0b 78 mr r3,r1
ffc2ec00: 95 43 00 08 stwu r10,8(r3)
ffc2ec04: 91 63 00 04 stw r11,4(r3)
&tod_as_timestamp,
tod_as_timespec->tv_sec,
tod_as_timespec->tv_nsec
);
_TOD_Set_with_timestamp( &tod_as_timestamp );
ffc2ec08: 48 00 14 35 bl ffc3003c <_TOD_Set_with_timestamp>
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
ffc2ec0c: 4b fd d6 d9 bl ffc0c2e4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
ffc2ec10: 38 60 00 00 li r3,0
}
ffc2ec14: 80 01 00 1c lwz r0,28(r1)
ffc2ec18: 38 21 00 18 addi r1,r1,24
ffc2ec1c: 7c 08 03 a6 mtlr r0
ffc2ec20: 4e 80 00 20 blr
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc2ec24: 48 01 4d f5 bl ffc43a18 <__errno>
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc2ec28: 80 01 00 1c lwz r0,28(r1)
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc2ec2c: 39 20 00 58 li r9,88
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc2ec30: 7c 08 03 a6 mtlr r0
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
rtems_set_errno_and_return_minus_one( ENOSYS );
ffc2ec34: 91 23 00 00 stw r9,0(r3)
ffc2ec38: 38 60 ff ff li r3,-1
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
ffc2ec3c: 38 21 00 18 addi r1,r1,24
ffc2ec40: 4e 80 00 20 blr
ffc1e064 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
ffc1e064: 94 21 ff d0 stwu r1,-48(r1)
ffc1e068: 7c 08 02 a6 mflr r0
ffc1e06c: 93 61 00 1c stw r27,28(r1)
ffc1e070: 7c bb 2b 78 mr r27,r5
ffc1e074: 93 c1 00 28 stw r30,40(r1)
ffc1e078: 7c 9e 23 78 mr r30,r4
ffc1e07c: 93 e1 00 2c stw r31,44(r1)
ffc1e080: 7c 7f 1b 78 mr r31,r3
ffc1e084: 90 01 00 34 stw r0,52(r1)
ffc1e088: 93 41 00 18 stw r26,24(r1)
ffc1e08c: 93 81 00 20 stw r28,32(r1)
ffc1e090: 93 a1 00 24 stw r29,36(r1)
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
ffc1e094: 4b ff fb dd bl ffc1dc70 <getpid>
ffc1e098: 7f 83 f8 00 cmpw cr7,r3,r31
ffc1e09c: 40 9e 02 ac bne- cr7,ffc1e348 <killinfo+0x2e4>
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
ffc1e0a0: 2f 9e 00 00 cmpwi cr7,r30,0
ffc1e0a4: 41 9e 02 b8 beq- cr7,ffc1e35c <killinfo+0x2f8>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
ffc1e0a8: 3b fe ff ff addi r31,r30,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
ffc1e0ac: 2b 9f 00 1f cmplwi cr7,r31,31
ffc1e0b0: 41 9d 02 ac bgt- cr7,ffc1e35c <killinfo+0x2f8>
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 )
ffc1e0b4: 1f be 00 0c mulli r29,r30,12
ffc1e0b8: 3f 80 00 00 lis r28,0
ffc1e0bc: 3b 9c 32 20 addi r28,r28,12832
ffc1e0c0: 7d 3c ea 14 add r9,r28,r29
ffc1e0c4: 81 29 00 08 lwz r9,8(r9)
ffc1e0c8: 2f 89 00 01 cmpwi cr7,r9,1
ffc1e0cc: 41 9e 02 58 beq- cr7,ffc1e324 <killinfo+0x2c0>
/*
* 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 ) )
ffc1e0d0: 2f 9e 00 08 cmpwi cr7,r30,8
ffc1e0d4: 41 9e 01 d0 beq- cr7,ffc1e2a4 <killinfo+0x240>
ffc1e0d8: 2f 9e 00 04 cmpwi cr7,r30,4
ffc1e0dc: 41 9e 01 c8 beq- cr7,ffc1e2a4 <killinfo+0x240>
ffc1e0e0: 2f 9e 00 0b cmpwi cr7,r30,11
ffc1e0e4: 41 9e 01 c0 beq- cr7,ffc1e2a4 <killinfo+0x240>
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
ffc1e0e8: 2f 9b 00 00 cmpwi cr7,r27,0
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
ffc1e0ec: 93 c1 00 08 stw r30,8(r1)
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
ffc1e0f0: 39 20 00 01 li r9,1
ffc1e0f4: 7d 3f f8 30 slw r31,r9,r31
siginfo->si_code = SI_USER;
ffc1e0f8: 91 21 00 0c stw r9,12(r1)
if ( !value ) {
ffc1e0fc: 41 9e 02 30 beq- cr7,ffc1e32c <killinfo+0x2c8>
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
ffc1e100: 81 3b 00 00 lwz r9,0(r27)
ffc1e104: 91 21 00 10 stw r9,16(r1)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc1e108: 3d 20 00 00 lis r9,0
ffc1e10c: 81 49 28 68 lwz r10,10344(r9)
++level;
ffc1e110: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc1e114: 91 49 28 68 stw r10,10344(r9)
*/
void _POSIX_signals_Manager_Initialization(void);
static inline void _POSIX_signals_Add_post_switch_extension(void)
{
_API_extensions_Add_post_switch( &_POSIX_signals_Post_switch );
ffc1e118: 3c 60 00 00 lis r3,0
ffc1e11c: 38 63 22 20 addi r3,r3,8736
ffc1e120: 4b fe c5 01 bl ffc0a620 <_API_extensions_Add_post_switch>
/*
* 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;
ffc1e124: 3d 20 00 00 lis r9,0
ffc1e128: 80 69 31 b0 lwz r3,12720(r9)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
ffc1e12c: 81 23 01 50 lwz r9,336(r3)
ffc1e130: 81 29 00 d0 lwz r9,208(r9)
ffc1e134: 7f e6 48 79 andc. r6,r31,r9
ffc1e138: 40 82 01 14 bne- ffc1e24c <killinfo+0x1e8>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc1e13c: 3d 20 00 00 lis r9,0
ffc1e140: 38 e9 33 ac addi r7,r9,13228
ffc1e144: 81 29 33 ac lwz r9,13228(r9)
/* 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 );
ffc1e148: 38 e7 00 04 addi r7,r7,4
ffc1e14c: 7f 89 38 00 cmpw cr7,r9,r7
ffc1e150: 41 9e 00 4c beq- cr7,ffc1e19c <killinfo+0x138>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
ffc1e154: 81 49 00 30 lwz r10,48(r9)
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 ];
ffc1e158: 81 09 01 50 lwz r8,336(r9)
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
ffc1e15c: 7f eb 50 39 and. r11,r31,r10
ffc1e160: 40 82 01 78 bne- ffc1e2d8 <killinfo+0x274>
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
ffc1e164: 81 48 00 d0 lwz r10,208(r8)
ffc1e168: 7f fa 50 79 andc. r26,r31,r10
ffc1e16c: 41 a2 00 24 beq+ ffc1e190 <killinfo+0x12c>
ffc1e170: 48 00 01 68 b ffc1e2d8 <killinfo+0x274>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
ffc1e174: 81 49 00 30 lwz r10,48(r9) <== 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 ];
ffc1e178: 81 09 01 50 lwz r8,336(r9) <== NOT EXECUTED
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
ffc1e17c: 7f fb 50 39 and. r27,r31,r10 <== NOT EXECUTED
ffc1e180: 40 82 01 58 bne- ffc1e2d8 <killinfo+0x274> <== NOT EXECUTED
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
ffc1e184: 81 48 00 d0 lwz r10,208(r8) <== NOT EXECUTED
ffc1e188: 7f e6 50 79 andc. r6,r31,r10 <== NOT EXECUTED
ffc1e18c: 40 82 01 4c bne- ffc1e2d8 <killinfo+0x274> <== NOT EXECUTED
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 ) {
ffc1e190: 81 29 00 00 lwz r9,0(r9)
/* 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 );
ffc1e194: 7f 89 38 00 cmpw cr7,r9,r7
ffc1e198: 40 9e ff dc bne+ cr7,ffc1e174 <killinfo+0x110> <== NEVER TAKEN
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
ffc1e19c: 3d 20 00 00 lis r9,0
ffc1e1a0: 88 89 27 84 lbz r4,10116(r9)
ffc1e1a4: 3d 20 00 00 lis r9,0
ffc1e1a8: 39 29 2c 7c addi r9,r9,11388
ffc1e1ac: 38 84 00 01 addi r4,r4,1
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
ffc1e1b0: 38 09 00 08 addi r0,r9,8
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
ffc1e1b4: 38 60 00 00 li r3,0
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 ] )
ffc1e1b8: 85 49 00 04 lwzu r10,4(r9)
ffc1e1bc: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1e1c0: 41 9e 00 7c beq- cr7,ffc1e23c <killinfo+0x1d8> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
ffc1e1c4: 81 4a 00 04 lwz r10,4(r10)
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
ffc1e1c8: a0 aa 00 10 lhz r5,16(r10)
object_table = the_info->local_table;
ffc1e1cc: 80 ea 00 1c lwz r7,28(r10)
for ( index = 1 ; index <= maximum ; index++ ) {
ffc1e1d0: 2f 85 00 00 cmpwi cr7,r5,0
ffc1e1d4: 41 9e 00 68 beq- cr7,ffc1e23c <killinfo+0x1d8>
ffc1e1d8: 39 00 00 01 li r8,1
the_thread = (Thread_Control *) object_table[ index ];
ffc1e1dc: 85 47 00 04 lwzu r10,4(r7)
if ( !the_thread )
ffc1e1e0: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1e1e4: 41 9e 00 4c beq- cr7,ffc1e230 <killinfo+0x1cc>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
ffc1e1e8: 80 ca 00 14 lwz r6,20(r10)
ffc1e1ec: 7f 86 20 40 cmplw cr7,r6,r4
ffc1e1f0: 41 9d 00 40 bgt- cr7,ffc1e230 <killinfo+0x1cc>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
ffc1e1f4: 81 6a 01 50 lwz r11,336(r10)
ffc1e1f8: 81 6b 00 d0 lwz r11,208(r11)
ffc1e1fc: 7f fa 58 79 andc. r26,r31,r11
ffc1e200: 41 82 00 30 beq- ffc1e230 <killinfo+0x1cc>
*
* 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 ) {
ffc1e204: 41 9c 00 24 blt- cr7,ffc1e228 <killinfo+0x1c4>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
ffc1e208: 2f 83 00 00 cmpwi cr7,r3,0
ffc1e20c: 41 9e 00 24 beq- cr7,ffc1e230 <killinfo+0x1cc> <== NEVER TAKEN
ffc1e210: 81 63 00 10 lwz r11,16(r3)
ffc1e214: 2f 8b 00 00 cmpwi cr7,r11,0
ffc1e218: 41 9e 00 18 beq- cr7,ffc1e230 <killinfo+0x1cc> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
ffc1e21c: 83 6a 00 10 lwz r27,16(r10)
ffc1e220: 2f 9b 00 00 cmpwi cr7,r27,0
ffc1e224: 40 9e 01 10 bne- cr7,ffc1e334 <killinfo+0x2d0>
ffc1e228: 7c c4 33 78 mr r4,r6
ffc1e22c: 7d 43 53 78 mr r3,r10
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
ffc1e230: 39 08 00 01 addi r8,r8,1
ffc1e234: 7f 85 40 40 cmplw cr7,r5,r8
ffc1e238: 40 9c ff a4 bge+ cr7,ffc1e1dc <killinfo+0x178>
* + 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++) {
ffc1e23c: 7f 89 00 00 cmpw cr7,r9,r0
ffc1e240: 40 be ff 78 bne- cr7,ffc1e1b8 <killinfo+0x154>
}
}
}
}
if ( interested ) {
ffc1e244: 2f 83 00 00 cmpwi cr7,r3,0
ffc1e248: 41 9e 00 18 beq- cr7,ffc1e260 <killinfo+0x1fc>
/*
* 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 ) ) {
ffc1e24c: 7f c4 f3 78 mr r4,r30
ffc1e250: 38 a1 00 08 addi r5,r1,8
ffc1e254: 48 00 01 5d bl ffc1e3b0 <_POSIX_signals_Unblock_thread>
ffc1e258: 2f 83 00 00 cmpwi cr7,r3,0
ffc1e25c: 40 9e 00 18 bne- cr7,ffc1e274 <killinfo+0x210>
/*
* 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 );
ffc1e260: 7f e3 fb 78 mr r3,r31
ffc1e264: 48 00 01 25 bl ffc1e388 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
ffc1e268: 7d 3c e8 2e lwzx r9,r28,r29
ffc1e26c: 2f 89 00 02 cmpwi cr7,r9,2
ffc1e270: 41 9e 00 70 beq- cr7,ffc1e2e0 <killinfo+0x27c>
/*
* 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 ) ) {
_Thread_Enable_dispatch();
ffc1e274: 4b fe e8 4d bl ffc0cac0 <_Thread_Enable_dispatch>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
ffc1e278: 80 01 00 34 lwz r0,52(r1)
ffc1e27c: 83 41 00 18 lwz r26,24(r1)
* 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 ) ) {
_Thread_Enable_dispatch();
return 0;
ffc1e280: 38 60 00 00 li r3,0
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
ffc1e284: 7c 08 03 a6 mtlr r0
ffc1e288: 83 61 00 1c lwz r27,28(r1)
ffc1e28c: 83 81 00 20 lwz r28,32(r1)
ffc1e290: 83 a1 00 24 lwz r29,36(r1)
ffc1e294: 83 c1 00 28 lwz r30,40(r1)
ffc1e298: 83 e1 00 2c lwz r31,44(r1)
ffc1e29c: 38 21 00 30 addi r1,r1,48
ffc1e2a0: 4e 80 00 20 blr
* 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 );
ffc1e2a4: 48 00 03 79 bl ffc1e61c <pthread_self>
ffc1e2a8: 7f c4 f3 78 mr r4,r30
ffc1e2ac: 48 00 02 61 bl ffc1e50c <pthread_kill>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
ffc1e2b0: 80 01 00 34 lwz r0,52(r1)
ffc1e2b4: 83 41 00 18 lwz r26,24(r1)
ffc1e2b8: 7c 08 03 a6 mtlr r0
ffc1e2bc: 83 61 00 1c lwz r27,28(r1)
ffc1e2c0: 83 81 00 20 lwz r28,32(r1)
ffc1e2c4: 83 a1 00 24 lwz r29,36(r1)
ffc1e2c8: 83 c1 00 28 lwz r30,40(r1)
ffc1e2cc: 83 e1 00 2c lwz r31,44(r1)
ffc1e2d0: 38 21 00 30 addi r1,r1,48
ffc1e2d4: 4e 80 00 20 blr
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 ) {
ffc1e2d8: 7d 23 4b 78 mr r3,r9
ffc1e2dc: 4b ff ff 70 b ffc1e24c <killinfo+0x1e8>
*/
_POSIX_signals_Set_process_signals( mask );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
ffc1e2e0: 3c 60 00 00 lis r3,0
ffc1e2e4: 38 63 33 a0 addi r3,r3,13216
ffc1e2e8: 4b fe c5 15 bl ffc0a7fc <_Chain_Get>
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
ffc1e2ec: 7c 69 1b 79 mr. r9,r3
ffc1e2f0: 41 82 00 80 beq- ffc1e370 <killinfo+0x30c>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
ffc1e2f4: 81 41 00 08 lwz r10,8(r1)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
ffc1e2f8: 3c 60 00 00 lis r3,0
ffc1e2fc: 38 63 34 14 addi r3,r3,13332
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
ffc1e300: 91 49 00 08 stw r10,8(r9)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
ffc1e304: 7c 63 ea 14 add r3,r3,r29
ffc1e308: 7d 24 4b 78 mr r4,r9
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
ffc1e30c: 81 41 00 0c lwz r10,12(r1)
ffc1e310: 91 49 00 0c stw r10,12(r9)
ffc1e314: 81 41 00 10 lwz r10,16(r1)
ffc1e318: 91 49 00 10 stw r10,16(r9)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
ffc1e31c: 4b fe c4 b1 bl ffc0a7cc <_Chain_Append>
ffc1e320: 4b ff ff 54 b ffc1e274 <killinfo+0x210>
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
return 0;
ffc1e324: 38 60 00 00 li r3,0
ffc1e328: 4b ff ff 88 b ffc1e2b0 <killinfo+0x24c>
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
siginfo->si_value.sival_int = 0;
ffc1e32c: 93 61 00 10 stw r27,16(r1)
ffc1e330: 4b ff fd d8 b ffc1e108 <killinfo+0xa4>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
ffc1e334: 75 7a 10 00 andis. r26,r11,4096
ffc1e338: 40 a2 fe f8 bne- ffc1e230 <killinfo+0x1cc>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
ffc1e33c: 77 6b 10 00 andis. r11,r27,4096
ffc1e340: 41 a2 fe f0 beq- ffc1e230 <killinfo+0x1cc>
ffc1e344: 4b ff fe e4 b ffc1e228 <killinfo+0x1c4>
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
rtems_set_errno_and_return_minus_one( ESRCH );
ffc1e348: 4b ff 4d 31 bl ffc13078 <__errno>
ffc1e34c: 39 20 00 03 li r9,3
ffc1e350: 91 23 00 00 stw r9,0(r3)
ffc1e354: 38 60 ff ff li r3,-1
ffc1e358: 4b ff ff 58 b ffc1e2b0 <killinfo+0x24c>
*/
if ( !sig )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc1e35c: 4b ff 4d 1d bl ffc13078 <__errno>
ffc1e360: 39 20 00 16 li r9,22
ffc1e364: 91 23 00 00 stw r9,0(r3)
ffc1e368: 38 60 ff ff li r3,-1
ffc1e36c: 4b ff ff 44 b ffc1e2b0 <killinfo+0x24c>
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();
ffc1e370: 4b fe e7 51 bl ffc0cac0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
ffc1e374: 4b ff 4d 05 bl ffc13078 <__errno>
ffc1e378: 39 20 00 0b li r9,11
ffc1e37c: 91 23 00 00 stw r9,0(r3)
ffc1e380: 38 60 ff ff li r3,-1
ffc1e384: 4b ff ff 2c b ffc1e2b0 <killinfo+0x24c>
ffc09ca0 <mq_open>:
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc09ca0: 3d 20 00 00 lis r9,0
int oflag,
...
/* mode_t mode, */
/* struct mq_attr attr */
)
{
ffc09ca4: 94 21 ff b0 stwu r1,-80(r1)
ffc09ca8: 7c 08 02 a6 mflr r0
ffc09cac: 81 49 28 a8 lwz r10,10408(r9)
ffc09cb0: 7d 80 00 26 mfcr r12
ffc09cb4: 93 81 00 40 stw r28,64(r1)
ffc09cb8: 7c 7c 1b 78 mr r28,r3
++level;
ffc09cbc: 39 4a 00 01 addi r10,r10,1
ffc09cc0: 93 c1 00 48 stw r30,72(r1)
ffc09cc4: 7c 9e 23 78 mr r30,r4
ffc09cc8: 90 01 00 54 stw r0,84(r1)
ffc09ccc: 93 21 00 34 stw r25,52(r1)
ffc09cd0: 93 41 00 38 stw r26,56(r1)
ffc09cd4: 93 61 00 3c stw r27,60(r1)
ffc09cd8: 93 a1 00 44 stw r29,68(r1)
ffc09cdc: 93 e1 00 4c stw r31,76(r1)
ffc09ce0: 91 81 00 30 stw r12,48(r1)
ffc09ce4: 90 a1 00 28 stw r5,40(r1)
ffc09ce8: 90 c1 00 2c stw r6,44(r1)
_Thread_Dispatch_disable_level = level;
ffc09cec: 91 49 28 a8 stw r10,10408(r9)
Objects_Locations location;
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
ffc09cf0: 54 89 bf fe rlwinm r9,r4,23,31,31
ffc09cf4: 2e 09 00 00 cmpwi cr4,r9,0
/* struct mq_attr attr */
)
{
va_list arg;
mode_t mode;
struct mq_attr *attr = NULL;
ffc09cf8: 3b 20 00 00 li r25,0
Objects_Locations location;
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
ffc09cfc: 40 92 01 20 bne- cr4,ffc09e1c <mq_open+0x17c>
*/
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
ffc09d00: 3f a0 00 00 lis r29,0
ffc09d04: 3b bd 5b 0c addi r29,r29,23308
ffc09d08: 7f a3 eb 78 mr r3,r29
ffc09d0c: 48 00 3a 9d bl ffc0d7a8 <_Objects_Allocate>
attr = va_arg( arg, struct mq_attr * );
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
ffc09d10: 7c 7f 1b 79 mr. r31,r3
ffc09d14: 41 82 01 3c beq- ffc09e50 <mq_open+0x1b0> <== NEVER TAKEN
const char *name,
Objects_Id *id,
size_t *len
)
{
return _POSIX_Name_to_id( &_POSIX_Message_queue_Information, name, id, len );
ffc09d18: 3f 60 00 00 lis r27,0
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq_fd->oflag = oflag;
ffc09d1c: 93 df 00 14 stw r30,20(r31)
ffc09d20: 3b 7b 59 80 addi r27,r27,22912
ffc09d24: 7f 63 db 78 mr r3,r27
ffc09d28: 7f 84 e3 78 mr r4,r28
ffc09d2c: 38 a1 00 20 addi r5,r1,32
ffc09d30: 38 c1 00 14 addi r6,r1,20
ffc09d34: 48 00 06 49 bl ffc0a37c <_POSIX_Name_to_id>
* 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 ) {
ffc09d38: 7c 7a 1b 79 mr. r26,r3
ffc09d3c: 40 82 00 88 bne- ffc09dc4 <mq_open+0x124>
} else { /* name -> ID translation succeeded */
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
ffc09d40: 73 de 0a 00 andi. r30,r30,2560
ffc09d44: 2f 9e 0a 00 cmpwi cr7,r30,2560
ffc09d48: 41 9e 01 50 beq- cr7,ffc09e98 <mq_open+0x1f8>
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control *)
ffc09d4c: 80 81 00 20 lwz r4,32(r1)
ffc09d50: 38 a1 00 18 addi r5,r1,24
ffc09d54: 7f 63 db 78 mr r3,r27
ffc09d58: 48 00 40 39 bl ffc0dd90 <_Objects_Get>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
ffc09d5c: a1 5f 00 0a lhz r10,10(r31)
/*
* 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;
ffc09d60: 81 23 00 18 lwz r9,24(r3)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc09d64: 81 1d 00 1c lwz r8,28(r29)
ffc09d68: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc09d6c: 39 29 00 01 addi r9,r9,1
/*
* 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 );
ffc09d70: 90 61 00 1c stw r3,28(r1)
the_mq->open_count += 1;
ffc09d74: 91 23 00 18 stw r9,24(r3)
the_mq_fd->Queue = the_mq;
ffc09d78: 90 7f 00 10 stw r3,16(r31)
ffc09d7c: 7f e8 51 2e stwx r31,r8,r10
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
ffc09d80: 93 5f 00 0c stw r26,12(r31)
_Objects_Open_string(
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
ffc09d84: 48 00 52 09 bl ffc0ef8c <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
ffc09d88: 48 00 52 05 bl ffc0ef8c <_Thread_Enable_dispatch>
return (mqd_t)the_mq_fd->Object.id;
ffc09d8c: 80 7f 00 08 lwz r3,8(r31)
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09d90: 80 01 00 54 lwz r0,84(r1)
ffc09d94: 81 81 00 30 lwz r12,48(r1)
ffc09d98: 7c 08 03 a6 mtlr r0
ffc09d9c: 83 21 00 34 lwz r25,52(r1)
ffc09da0: 83 41 00 38 lwz r26,56(r1)
ffc09da4: 7d 80 81 20 mtcrf 8,r12
ffc09da8: 83 61 00 3c lwz r27,60(r1)
ffc09dac: 83 81 00 40 lwz r28,64(r1)
ffc09db0: 83 a1 00 44 lwz r29,68(r1)
ffc09db4: 83 c1 00 48 lwz r30,72(r1)
ffc09db8: 83 e1 00 4c lwz r31,76(r1)
ffc09dbc: 38 21 00 50 addi r1,r1,80
ffc09dc0: 4e 80 00 20 blr
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) ) ) {
ffc09dc4: 2f 9a 00 02 cmpwi cr7,r26,2
ffc09dc8: 41 9e 01 24 beq- cr7,ffc09eec <mq_open+0x24c>
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 );
ffc09dcc: 7f a3 eb 78 mr r3,r29
ffc09dd0: 7f e4 fb 78 mr r4,r31
ffc09dd4: 48 00 3d e5 bl ffc0dbb8 <_Objects_Free>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
ffc09dd8: 48 00 51 b5 bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
ffc09ddc: 48 00 ba a1 bl ffc1587c <__errno>
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09de0: 80 01 00 54 lwz r0,84(r1)
ffc09de4: 81 81 00 30 lwz r12,48(r1)
ffc09de8: 7c 08 03 a6 mtlr r0
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
ffc09dec: 93 43 00 00 stw r26,0(r3)
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09df0: 7d 80 81 20 mtcrf 8,r12
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
ffc09df4: 38 60 ff ff li r3,-1
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09df8: 83 21 00 34 lwz r25,52(r1)
ffc09dfc: 83 41 00 38 lwz r26,56(r1)
ffc09e00: 83 61 00 3c lwz r27,60(r1)
ffc09e04: 83 81 00 40 lwz r28,64(r1)
ffc09e08: 83 a1 00 44 lwz r29,68(r1)
ffc09e0c: 83 c1 00 48 lwz r30,72(r1)
ffc09e10: 83 e1 00 4c lwz r31,76(r1)
ffc09e14: 38 21 00 50 addi r1,r1,80
ffc09e18: 4e 80 00 20 blr
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
ffc09e1c: 39 21 00 58 addi r9,r1,88
mode = va_arg( arg, mode_t );
attr = va_arg( arg, struct mq_attr * );
ffc09e20: 83 21 00 2c lwz r25,44(r1)
*/
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
ffc09e24: 3f a0 00 00 lis r29,0
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
ffc09e28: 91 21 00 0c stw r9,12(r1)
ffc09e2c: 3b bd 5b 0c addi r29,r29,23308
ffc09e30: 39 21 00 20 addi r9,r1,32
ffc09e34: 91 21 00 10 stw r9,16(r1)
ffc09e38: 7f a3 eb 78 mr r3,r29
mode = va_arg( arg, mode_t );
ffc09e3c: 39 20 00 03 li r9,3
ffc09e40: 99 21 00 08 stb r9,8(r1)
ffc09e44: 48 00 39 65 bl ffc0d7a8 <_Objects_Allocate>
attr = va_arg( arg, struct mq_attr * );
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
ffc09e48: 7c 7f 1b 79 mr. r31,r3
ffc09e4c: 40 82 fe cc bne+ ffc09d18 <mq_open+0x78>
_Thread_Enable_dispatch();
ffc09e50: 48 00 51 3d bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
ffc09e54: 48 00 ba 29 bl ffc1587c <__errno>
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09e58: 80 01 00 54 lwz r0,84(r1)
ffc09e5c: 81 81 00 30 lwz r12,48(r1)
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
ffc09e60: 39 20 00 17 li r9,23
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09e64: 7c 08 03 a6 mtlr r0
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
ffc09e68: 91 23 00 00 stw r9,0(r3)
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09e6c: 7d 80 81 20 mtcrf 8,r12
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
ffc09e70: 38 60 ff ff li r3,-1
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09e74: 83 21 00 34 lwz r25,52(r1)
ffc09e78: 83 41 00 38 lwz r26,56(r1)
ffc09e7c: 83 61 00 3c lwz r27,60(r1)
ffc09e80: 83 81 00 40 lwz r28,64(r1)
ffc09e84: 83 a1 00 44 lwz r29,68(r1)
ffc09e88: 83 c1 00 48 lwz r30,72(r1)
ffc09e8c: 83 e1 00 4c lwz r31,76(r1)
ffc09e90: 38 21 00 50 addi r1,r1,80
ffc09e94: 4e 80 00 20 blr
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 );
ffc09e98: 7f a3 eb 78 mr r3,r29
ffc09e9c: 7f e4 fb 78 mr r4,r31
ffc09ea0: 48 00 3d 19 bl ffc0dbb8 <_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();
ffc09ea4: 48 00 50 e9 bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
ffc09ea8: 48 00 b9 d5 bl ffc1587c <__errno>
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09eac: 80 01 00 54 lwz r0,84(r1)
ffc09eb0: 81 81 00 30 lwz r12,48(r1)
* 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();
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
ffc09eb4: 39 20 00 11 li r9,17
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09eb8: 7c 08 03 a6 mtlr r0
* 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();
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
ffc09ebc: 91 23 00 00 stw r9,0(r3)
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09ec0: 7d 80 81 20 mtcrf 8,r12
* 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();
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
ffc09ec4: 38 60 ff ff li r3,-1
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
ffc09ec8: 83 21 00 34 lwz r25,52(r1)
ffc09ecc: 83 41 00 38 lwz r26,56(r1)
ffc09ed0: 83 61 00 3c lwz r27,60(r1)
ffc09ed4: 83 81 00 40 lwz r28,64(r1)
ffc09ed8: 83 a1 00 44 lwz r29,68(r1)
ffc09edc: 83 c1 00 48 lwz r30,72(r1)
ffc09ee0: 83 e1 00 4c lwz r31,76(r1)
ffc09ee4: 38 21 00 50 addi r1,r1,80
ffc09ee8: 4e 80 00 20 blr
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) ) ) {
ffc09eec: 41 92 fe e0 beq+ cr4,ffc09dcc <mq_open+0x12c>
/*
* 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(
ffc09ef0: 80 81 00 14 lwz r4,20(r1)
ffc09ef4: 7f 83 e3 78 mr r3,r28
ffc09ef8: 38 a0 00 01 li r5,1
ffc09efc: 7f 26 cb 78 mr r6,r25
ffc09f00: 38 e1 00 1c addi r7,r1,28
ffc09f04: 48 00 81 a5 bl ffc120a8 <_POSIX_Message_queue_Create_support>
);
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
ffc09f08: 2f 83 ff ff cmpwi cr7,r3,-1
ffc09f0c: 41 9e 00 30 beq- cr7,ffc09f3c <mq_open+0x29c>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
return (mqd_t) -1;
}
the_mq_fd->Queue = the_mq;
ffc09f10: 81 21 00 1c lwz r9,28(r1)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
ffc09f14: a1 5f 00 0a lhz r10,10(r31)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc09f18: 81 1d 00 1c lwz r8,28(r29)
ffc09f1c: 55 4a 10 3a rlwinm r10,r10,2,0,29
ffc09f20: 91 3f 00 10 stw r9,16(r31)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
ffc09f24: 39 20 00 00 li r9,0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc09f28: 7f e8 51 2e stwx r31,r8,r10
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
ffc09f2c: 91 3f 00 0c stw r9,12(r31)
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
ffc09f30: 48 00 50 5d bl ffc0ef8c <_Thread_Enable_dispatch>
return (mqd_t) the_mq_fd->Object.id;
ffc09f34: 80 7f 00 08 lwz r3,8(r31)
ffc09f38: 4b ff fe 58 b ffc09d90 <mq_open+0xf0>
ffc09f3c: 7f a3 eb 78 mr r3,r29
ffc09f40: 7f e4 fb 78 mr r4,r31
ffc09f44: 48 00 3c 75 bl ffc0dbb8 <_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();
ffc09f48: 48 00 50 45 bl ffc0ef8c <_Thread_Enable_dispatch>
return (mqd_t) -1;
ffc09f4c: 38 60 ff ff li r3,-1
ffc09f50: 4b ff fe 40 b ffc09d90 <mq_open+0xf0>
ffc0e97c <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
ffc0e97c: 7c 69 1b 79 mr. r9,r3
ffc0e980: 41 82 00 38 beq- ffc0e9b8 <pthread_attr_setschedpolicy+0x3c>
ffc0e984: 81 49 00 00 lwz r10,0(r9)
return EINVAL;
ffc0e988: 38 60 00 16 li r3,22
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
ffc0e98c: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0e990: 4d be 00 20 beqlr+ cr7
return EINVAL;
switch ( policy ) {
ffc0e994: 2b 84 00 04 cmplwi cr7,r4,4
ffc0e998: 41 9d 00 28 bgt- cr7,ffc0e9c0 <pthread_attr_setschedpolicy+0x44>
ffc0e99c: 39 40 00 01 li r10,1
ffc0e9a0: 7d 4a 20 30 slw r10,r10,r4
ffc0e9a4: 71 48 00 17 andi. r8,r10,23
ffc0e9a8: 41 82 00 18 beq- ffc0e9c0 <pthread_attr_setschedpolicy+0x44><== NEVER TAKEN
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
ffc0e9ac: 90 89 00 14 stw r4,20(r9)
return 0;
ffc0e9b0: 38 60 00 00 li r3,0
ffc0e9b4: 4e 80 00 20 blr
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
ffc0e9b8: 38 60 00 16 li r3,22
ffc0e9bc: 4e 80 00 20 blr
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
ffc0e9c0: 38 60 00 86 li r3,134
}
}
ffc0e9c4: 4e 80 00 20 blr
ffc098c8 <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
ffc098c8: 94 21 ff d0 stwu r1,-48(r1)
ffc098cc: 7c 08 02 a6 mflr r0
ffc098d0: 93 e1 00 2c stw r31,44(r1)
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
ffc098d4: 7c 7f 1b 79 mr. r31,r3
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
ffc098d8: 90 01 00 34 stw r0,52(r1)
ffc098dc: 93 81 00 20 stw r28,32(r1)
ffc098e0: 93 a1 00 24 stw r29,36(r1)
ffc098e4: 93 c1 00 28 stw r30,40(r1)
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
ffc098e8: 41 82 00 0c beq- ffc098f4 <pthread_barrier_init+0x2c>
return EINVAL;
if ( count == 0 )
ffc098ec: 2f 85 00 00 cmpwi cr7,r5,0
ffc098f0: 40 9e 00 28 bne- cr7,ffc09918 <pthread_barrier_init+0x50>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
ffc098f4: 38 60 00 16 li r3,22
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc098f8: 80 01 00 34 lwz r0,52(r1)
ffc098fc: 83 81 00 20 lwz r28,32(r1)
ffc09900: 7c 08 03 a6 mtlr r0
ffc09904: 83 a1 00 24 lwz r29,36(r1)
ffc09908: 83 c1 00 28 lwz r30,40(r1)
ffc0990c: 83 e1 00 2c lwz r31,44(r1)
ffc09910: 38 21 00 30 addi r1,r1,48
ffc09914: 4e 80 00 20 blr
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
ffc09918: 2f 84 00 00 cmpwi cr7,r4,0
ffc0991c: 7c 89 23 78 mr r9,r4
ffc09920: 41 9e 00 7c beq- cr7,ffc0999c <pthread_barrier_init+0xd4>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
ffc09924: 81 49 00 00 lwz r10,0(r9)
ffc09928: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0992c: 41 9e ff c8 beq+ cr7,ffc098f4 <pthread_barrier_init+0x2c>
return EINVAL;
switch ( the_attr->process_shared ) {
ffc09930: 83 c9 00 04 lwz r30,4(r9)
ffc09934: 2f 9e 00 00 cmpwi cr7,r30,0
ffc09938: 40 be ff bc bne- cr7,ffc098f4 <pthread_barrier_init+0x2c><== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0993c: 3d 20 00 00 lis r9,0
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
ffc09940: 93 c1 00 10 stw r30,16(r1)
ffc09944: 81 49 28 90 lwz r10,10384(r9)
the_attributes.maximum_count = count;
ffc09948: 90 a1 00 14 stw r5,20(r1)
++level;
ffc0994c: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc09950: 91 49 28 90 stw r10,10384(r9)
* This function allocates a barrier control block from
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
ffc09954: 3f 80 00 00 lis r28,0
ffc09958: 3b 9c 30 00 addi r28,r28,12288
ffc0995c: 7f 83 e3 78 mr r3,r28
ffc09960: 48 00 29 71 bl ffc0c2d0 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
ffc09964: 7c 7d 1b 79 mr. r29,r3
ffc09968: 41 82 00 4c beq- ffc099b4 <pthread_barrier_init+0xec>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
ffc0996c: 38 7d 00 10 addi r3,r29,16
ffc09970: 38 81 00 10 addi r4,r1,16
ffc09974: 48 00 1d 59 bl ffc0b6cc <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
ffc09978: 81 3d 00 08 lwz r9,8(r29)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc0997c: 81 1c 00 1c lwz r8,28(r28)
ffc09980: 55 2a 13 ba rlwinm r10,r9,2,14,29
ffc09984: 7f a8 51 2e stwx r29,r8,r10
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
ffc09988: 93 dd 00 0c stw r30,12(r29)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
ffc0998c: 91 3f 00 00 stw r9,0(r31)
_Thread_Enable_dispatch();
ffc09990: 48 00 3f 79 bl ffc0d908 <_Thread_Enable_dispatch>
return 0;
ffc09994: 38 60 00 00 li r3,0
ffc09998: 4b ff ff 60 b ffc098f8 <pthread_barrier_init+0x30>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
ffc0999c: 38 61 00 08 addi r3,r1,8
ffc099a0: 90 a1 00 18 stw r5,24(r1)
ffc099a4: 4b ff fe 29 bl ffc097cc <pthread_barrierattr_init>
the_attr = &my_attr;
ffc099a8: 39 21 00 08 addi r9,r1,8
ffc099ac: 80 a1 00 18 lwz r5,24(r1)
ffc099b0: 4b ff ff 74 b ffc09924 <pthread_barrier_init+0x5c>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
ffc099b4: 48 00 3f 55 bl ffc0d908 <_Thread_Enable_dispatch>
return EAGAIN;
ffc099b8: 38 60 00 0b li r3,11
ffc099bc: 4b ff ff 3c b ffc098f8 <pthread_barrier_init+0x30>
ffc09078 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
ffc09078: 94 21 ff f0 stwu r1,-16(r1)
ffc0907c: 7c 08 02 a6 mflr r0
ffc09080: 93 c1 00 08 stw r30,8(r1)
/*
* 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 )
ffc09084: 7c 7e 1b 79 mr. r30,r3
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
ffc09088: 90 01 00 14 stw r0,20(r1)
ffc0908c: 93 e1 00 0c stw r31,12(r1)
/*
* 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 )
ffc09090: 41 82 00 60 beq- ffc090f0 <pthread_cleanup_push+0x78>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc09094: 3d 20 00 00 lis r9,0
ffc09098: 81 49 28 68 lwz r10,10344(r9)
ffc0909c: 7c 9f 23 78 mr r31,r4
++level;
ffc090a0: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc090a4: 91 49 28 68 stw r10,10344(r9)
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
ffc090a8: 38 60 00 10 li r3,16
ffc090ac: 48 00 57 49 bl ffc0e7f4 <_Workspace_Allocate>
if ( handler ) {
ffc090b0: 7c 69 1b 79 mr. r9,r3
ffc090b4: 41 82 00 24 beq- ffc090d8 <pthread_cleanup_push+0x60> <== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
ffc090b8: 3d 40 00 00 lis r10,0
ffc090bc: 81 4a 31 70 lwz r10,12656(r10)
handler_stack = &thread_support->Cancellation_Handlers;
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
ffc090c0: 7d 24 4b 78 mr r4,r9
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;
ffc090c4: 80 6a 01 50 lwz r3,336(r10)
handler->routine = routine;
ffc090c8: 93 c9 00 08 stw r30,8(r9)
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
ffc090cc: 38 63 00 e4 addi r3,r3,228
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
handler->routine = routine;
handler->arg = arg;
ffc090d0: 93 e9 00 0c stw r31,12(r9)
_Chain_Append( handler_stack, &handler->Node );
ffc090d4: 48 00 1f 39 bl ffc0b00c <_Chain_Append>
}
_Thread_Enable_dispatch();
}
ffc090d8: 80 01 00 14 lwz r0,20(r1)
ffc090dc: 83 c1 00 08 lwz r30,8(r1)
ffc090e0: 7c 08 03 a6 mtlr r0
ffc090e4: 83 e1 00 0c lwz r31,12(r1)
ffc090e8: 38 21 00 10 addi r1,r1,16
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
ffc090ec: 48 00 41 7c b ffc0d268 <_Thread_Enable_dispatch>
}
ffc090f0: 80 01 00 14 lwz r0,20(r1)
ffc090f4: 83 c1 00 08 lwz r30,8(r1)
ffc090f8: 7c 08 03 a6 mtlr r0
ffc090fc: 83 e1 00 0c lwz r31,12(r1)
ffc09100: 38 21 00 10 addi r1,r1,16
ffc09104: 4e 80 00 20 blr
ffc0a304 <pthread_cond_init>:
*/
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
ffc0a304: 94 21 ff e8 stwu r1,-24(r1)
ffc0a308: 7c 08 02 a6 mflr r0
ffc0a30c: 93 e1 00 14 stw r31,20(r1)
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
ffc0a310: 7c 9f 23 79 mr. r31,r4
*/
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
ffc0a314: 93 c1 00 10 stw r30,16(r1)
ffc0a318: 7c 7e 1b 78 mr r30,r3
ffc0a31c: 90 01 00 1c stw r0,28(r1)
ffc0a320: 93 81 00 08 stw r28,8(r1)
ffc0a324: 93 a1 00 0c stw r29,12(r1)
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
ffc0a328: 41 82 00 b4 beq- ffc0a3dc <pthread_cond_init+0xd8>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
ffc0a32c: 81 5f 00 04 lwz r10,4(r31)
return EINVAL;
ffc0a330: 38 60 00 16 li r3,22
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
ffc0a334: 2f 8a 00 01 cmpwi cr7,r10,1
ffc0a338: 41 9e 00 10 beq- cr7,ffc0a348 <pthread_cond_init+0x44> <== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
ffc0a33c: 81 5f 00 00 lwz r10,0(r31)
ffc0a340: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0a344: 40 9e 00 24 bne- cr7,ffc0a368 <pthread_cond_init+0x64>
*cond = the_cond->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc0a348: 80 01 00 1c lwz r0,28(r1)
ffc0a34c: 83 81 00 08 lwz r28,8(r1)
ffc0a350: 7c 08 03 a6 mtlr r0
ffc0a354: 83 a1 00 0c lwz r29,12(r1)
ffc0a358: 83 c1 00 10 lwz r30,16(r1)
ffc0a35c: 83 e1 00 14 lwz r31,20(r1)
ffc0a360: 38 21 00 18 addi r1,r1,24
ffc0a364: 4e 80 00 20 blr
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0a368: 3d 20 00 00 lis r9,0
ffc0a36c: 81 49 28 9c lwz r10,10396(r9)
++level;
ffc0a370: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc0a374: 91 49 28 9c stw r10,10396(r9)
*/
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
ffc0a378: 3f 80 00 00 lis r28,0
ffc0a37c: 3b 9c 30 98 addi r28,r28,12440
ffc0a380: 7f 83 e3 78 mr r3,r28
ffc0a384: 48 00 32 89 bl ffc0d60c <_Objects_Allocate>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
ffc0a388: 7c 7d 1b 79 mr. r29,r3
ffc0a38c: 41 82 00 5c beq- ffc0a3e8 <pthread_cond_init+0xe4>
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
ffc0a390: 81 3f 00 04 lwz r9,4(r31)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
ffc0a394: 3b e0 00 00 li r31,0
ffc0a398: 93 fd 00 14 stw r31,20(r29)
_Thread_queue_Initialize(
ffc0a39c: 3c a0 10 00 lis r5,4096
ffc0a3a0: 38 7d 00 18 addi r3,r29,24
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
ffc0a3a4: 91 3d 00 10 stw r9,16(r29)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
ffc0a3a8: 38 80 00 00 li r4,0
ffc0a3ac: 60 a5 08 00 ori r5,r5,2048
ffc0a3b0: 38 c0 00 74 li r6,116
ffc0a3b4: 48 00 52 6d bl ffc0f620 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
ffc0a3b8: 81 3d 00 08 lwz r9,8(r29)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc0a3bc: 81 1c 00 1c lwz r8,28(r28)
ffc0a3c0: 55 2a 13 ba rlwinm r10,r9,2,14,29
ffc0a3c4: 7f a8 51 2e stwx r29,r8,r10
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
ffc0a3c8: 93 fd 00 0c stw r31,12(r29)
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
ffc0a3cc: 91 3e 00 00 stw r9,0(r30)
_Thread_Enable_dispatch();
ffc0a3d0: 48 00 48 75 bl ffc0ec44 <_Thread_Enable_dispatch>
return 0;
ffc0a3d4: 38 60 00 00 li r3,0
ffc0a3d8: 4b ff ff 70 b ffc0a348 <pthread_cond_init+0x44>
{
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;
ffc0a3dc: 3f e0 00 00 lis r31,0
ffc0a3e0: 3b ff 27 e4 addi r31,r31,10212
ffc0a3e4: 4b ff ff 48 b ffc0a32c <pthread_cond_init+0x28>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
_Thread_Enable_dispatch();
ffc0a3e8: 48 00 48 5d bl ffc0ec44 <_Thread_Enable_dispatch>
return ENOMEM;
ffc0a3ec: 38 60 00 0c li r3,12
ffc0a3f0: 4b ff ff 58 b ffc0a348 <pthread_cond_init+0x44>
ffc0954c <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
ffc0954c: 94 21 ff 80 stwu r1,-128(r1)
ffc09550: 7c 08 02 a6 mflr r0
ffc09554: 93 61 00 6c stw r27,108(r1)
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
ffc09558: 7c bb 2b 79 mr. r27,r5
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
ffc0955c: 93 c1 00 78 stw r30,120(r1)
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
ffc09560: 3b c0 00 0e li r30,14
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
ffc09564: 90 01 00 84 stw r0,132(r1)
ffc09568: 92 81 00 50 stw r20,80(r1)
ffc0956c: 92 a1 00 54 stw r21,84(r1)
ffc09570: 92 c1 00 58 stw r22,88(r1)
ffc09574: 92 e1 00 5c stw r23,92(r1)
ffc09578: 93 01 00 60 stw r24,96(r1)
ffc0957c: 93 21 00 64 stw r25,100(r1)
ffc09580: 93 41 00 68 stw r26,104(r1)
ffc09584: 93 81 00 70 stw r28,112(r1)
ffc09588: 93 a1 00 74 stw r29,116(r1)
ffc0958c: 93 e1 00 7c stw r31,124(r1)
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
ffc09590: 41 82 00 28 beq- ffc095b8 <pthread_create+0x6c>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
ffc09594: 2f 84 00 00 cmpwi cr7,r4,0
ffc09598: 7c 7d 1b 78 mr r29,r3
ffc0959c: 7c dc 33 78 mr r28,r6
ffc095a0: 7c 9f 23 78 mr r31,r4
ffc095a4: 41 9e 01 b4 beq- cr7,ffc09758 <pthread_create+0x20c>
if ( !the_attr->is_initialized )
ffc095a8: 81 3f 00 00 lwz r9,0(r31)
ffc095ac: 2f 89 00 00 cmpwi cr7,r9,0
ffc095b0: 40 9e 00 4c bne- cr7,ffc095fc <pthread_create+0xb0>
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
break;
default:
return EINVAL;
ffc095b4: 3b c0 00 16 li r30,22
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
ffc095b8: 80 01 00 84 lwz r0,132(r1)
ffc095bc: 7f c3 f3 78 mr r3,r30
ffc095c0: 82 81 00 50 lwz r20,80(r1)
ffc095c4: 7c 08 03 a6 mtlr r0
ffc095c8: 82 a1 00 54 lwz r21,84(r1)
ffc095cc: 82 c1 00 58 lwz r22,88(r1)
ffc095d0: 82 e1 00 5c lwz r23,92(r1)
ffc095d4: 83 01 00 60 lwz r24,96(r1)
ffc095d8: 83 21 00 64 lwz r25,100(r1)
ffc095dc: 83 41 00 68 lwz r26,104(r1)
ffc095e0: 83 61 00 6c lwz r27,108(r1)
ffc095e4: 83 81 00 70 lwz r28,112(r1)
ffc095e8: 83 a1 00 74 lwz r29,116(r1)
ffc095ec: 83 c1 00 78 lwz r30,120(r1)
ffc095f0: 83 e1 00 7c lwz r31,124(r1)
ffc095f4: 38 21 00 80 addi r1,r1,128
ffc095f8: 4e 80 00 20 blr
* 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) )
ffc095fc: 81 3f 00 04 lwz r9,4(r31)
ffc09600: 2f 89 00 00 cmpwi cr7,r9,0
ffc09604: 41 9e 00 18 beq- cr7,ffc0961c <pthread_create+0xd0>
ffc09608: 3d 40 00 00 lis r10,0
ffc0960c: 81 3f 00 08 lwz r9,8(r31)
ffc09610: 81 4a 27 88 lwz r10,10120(r10)
ffc09614: 7f 89 50 40 cmplw cr7,r9,r10
ffc09618: 41 9c ff 9c blt+ cr7,ffc095b4 <pthread_create+0x68>
* 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 ) {
ffc0961c: 81 3f 00 10 lwz r9,16(r31)
ffc09620: 2f 89 00 01 cmpwi cr7,r9,1
ffc09624: 41 9e 01 40 beq- cr7,ffc09764 <pthread_create+0x218>
ffc09628: 2f 89 00 02 cmpwi cr7,r9,2
ffc0962c: 40 9e ff 88 bne+ cr7,ffc095b4 <pthread_create+0x68>
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
ffc09630: 80 9f 00 18 lwz r4,24(r31)
ffc09634: 80 bf 00 1c lwz r5,28(r31)
ffc09638: 80 df 00 20 lwz r6,32(r31)
ffc0963c: 80 ff 00 24 lwz r7,36(r31)
ffc09640: 81 1f 00 28 lwz r8,40(r31)
ffc09644: 81 5f 00 2c lwz r10,44(r31)
ffc09648: 81 3f 00 30 lwz r9,48(r31)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
ffc0964c: 83 5f 00 14 lwz r26,20(r31)
schedparam = the_attr->schedparam;
ffc09650: 90 81 00 18 stw r4,24(r1)
ffc09654: 90 a1 00 1c stw r5,28(r1)
ffc09658: 90 c1 00 20 stw r6,32(r1)
ffc0965c: 90 e1 00 24 stw r7,36(r1)
ffc09660: 91 01 00 28 stw r8,40(r1)
ffc09664: 91 41 00 2c stw r10,44(r1)
ffc09668: 91 21 00 30 stw r9,48(r1)
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
ffc0966c: 81 3f 00 0c lwz r9,12(r31)
return ENOTSUP;
ffc09670: 3b c0 00 86 li r30,134
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
ffc09674: 2f 89 00 00 cmpwi cr7,r9,0
ffc09678: 40 9e ff 40 bne+ cr7,ffc095b8 <pthread_create+0x6c>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
ffc0967c: 80 61 00 18 lwz r3,24(r1)
ffc09680: 48 00 76 49 bl ffc10cc8 <_POSIX_Priority_Is_valid>
ffc09684: 2f 83 00 00 cmpwi cr7,r3,0
ffc09688: 41 9e ff 2c beq+ cr7,ffc095b4 <pthread_create+0x68> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
ffc0968c: 3d 20 00 00 lis r9,0
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
ffc09690: 82 c1 00 18 lwz r22,24(r1)
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
ffc09694: 7f 43 d3 78 mr r3,r26
ffc09698: 8a a9 27 84 lbz r21,10116(r9)
ffc0969c: 38 81 00 18 addi r4,r1,24
ffc096a0: 38 a1 00 38 addi r5,r1,56
ffc096a4: 38 c1 00 34 addi r6,r1,52
ffc096a8: 48 00 76 49 bl ffc10cf0 <_POSIX_Thread_Translate_sched_param>
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
ffc096ac: 7c 7e 1b 79 mr. r30,r3
ffc096b0: 40 82 ff 08 bne+ ffc095b8 <pthread_create+0x6c>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
ffc096b4: 3e e0 00 00 lis r23,0
ffc096b8: 80 77 28 7c lwz r3,10364(r23)
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
ffc096bc: 3f 20 00 00 lis r25,0
ffc096c0: 3b 39 2e 60 addi r25,r25,11872
ffc096c4: 48 00 1f 59 bl ffc0b61c <_API_Mutex_Lock>
ffc096c8: 7f 23 cb 78 mr r3,r25
ffc096cc: 48 00 2b f9 bl ffc0c2c4 <_Objects_Allocate>
ffc096d0: 7f 34 cb 78 mr r20,r25
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
ffc096d4: 7c 78 1b 79 mr. r24,r3
ffc096d8: 41 82 00 70 beq- ffc09748 <pthread_create+0x1fc>
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
ffc096dc: 3d 20 00 00 lis r9,0
ffc096e0: 80 c9 27 88 lwz r6,10120(r9)
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
ffc096e4: 81 3f 00 08 lwz r9,8(r31)
ffc096e8: 54 c6 08 3c rlwinm r6,r6,1,0,30
ffc096ec: 93 c1 00 48 stw r30,72(r1)
ffc096f0: 7f 86 48 40 cmplw cr7,r6,r9
ffc096f4: 80 bf 00 04 lwz r5,4(r31)
ffc096f8: 40 9c 00 08 bge- cr7,ffc09700 <pthread_create+0x1b4>
ffc096fc: 7d 26 4b 78 mr r6,r9
ffc09700: 81 21 00 34 lwz r9,52(r1)
ffc09704: 7e 83 a3 78 mr r3,r20
ffc09708: 81 41 00 38 lwz r10,56(r1)
ffc0970c: 7f 04 c3 78 mr r4,r24
ffc09710: 91 21 00 08 stw r9,8(r1)
ffc09714: 39 20 00 00 li r9,0
ffc09718: 38 e0 00 01 li r7,1
ffc0971c: 91 21 00 0c stw r9,12(r1)
ffc09720: 39 21 00 48 addi r9,r1,72
ffc09724: 7d 16 a8 50 subf r8,r22,r21
ffc09728: 91 21 00 10 stw r9,16(r1)
ffc0972c: 39 20 00 01 li r9,1
ffc09730: 48 00 42 81 bl ffc0d9b0 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
ffc09734: 2f 83 00 00 cmpwi cr7,r3,0
ffc09738: 40 9e 00 78 bne- cr7,ffc097b0 <pthread_create+0x264>
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
ffc0973c: 7f 23 cb 78 mr r3,r25
ffc09740: 7f 04 c3 78 mr r4,r24
ffc09744: 48 00 2f 91 bl ffc0c6d4 <_Objects_Free>
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
ffc09748: 80 77 28 7c lwz r3,10364(r23)
return EAGAIN;
ffc0974c: 3b c0 00 0b li r30,11
name /* posix threads don't have a name */
);
if ( !status ) {
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
ffc09750: 48 00 1f 15 bl ffc0b664 <_API_Mutex_Unlock>
ffc09754: 4b ff fe 64 b ffc095b8 <pthread_create+0x6c>
int rc;
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
ffc09758: 3f e0 ff c2 lis r31,-62
ffc0975c: 3b ff 16 1c addi r31,r31,5660
ffc09760: 4b ff fe 48 b ffc095a8 <pthread_create+0x5c>
* 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 ];
ffc09764: 3d 20 00 00 lis r9,0
ffc09768: 81 29 31 90 lwz r9,12688(r9)
ffc0976c: 81 29 01 50 lwz r9,336(r9)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
ffc09770: 80 69 00 88 lwz r3,136(r9)
ffc09774: 80 89 00 8c lwz r4,140(r9)
ffc09778: 80 a9 00 90 lwz r5,144(r9)
ffc0977c: 80 c9 00 94 lwz r6,148(r9)
ffc09780: 80 e9 00 98 lwz r7,152(r9)
ffc09784: 81 09 00 9c lwz r8,156(r9)
ffc09788: 81 49 00 a0 lwz r10,160(r9)
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
schedpolicy = api->schedpolicy;
ffc0978c: 83 49 00 84 lwz r26,132(r9)
schedparam = api->schedparam;
ffc09790: 90 61 00 18 stw r3,24(r1)
ffc09794: 90 81 00 1c stw r4,28(r1)
ffc09798: 90 a1 00 20 stw r5,32(r1)
ffc0979c: 90 c1 00 24 stw r6,36(r1)
ffc097a0: 90 e1 00 28 stw r7,40(r1)
ffc097a4: 91 01 00 2c stw r8,44(r1)
ffc097a8: 91 41 00 30 stw r10,48(r1)
break;
ffc097ac: 4b ff fe c0 b ffc0966c <pthread_create+0x120>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc097b0: 83 38 01 50 lwz r25,336(r24)
api->Attributes = *the_attr;
ffc097b4: 7f e4 fb 78 mr r4,r31
ffc097b8: 38 a0 00 40 li r5,64
ffc097bc: 7f 23 cb 78 mr r3,r25
ffc097c0: 48 00 af 41 bl ffc14700 <memcpy>
api->detachstate = the_attr->detachstate;
ffc097c4: 81 3f 00 3c lwz r9,60(r31)
api->schedpolicy = schedpolicy;
ffc097c8: 93 59 00 84 stw r26,132(r25)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
ffc097cc: 7f 03 c3 78 mr r3,r24
ffc097d0: 38 80 00 01 li r4,1
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
ffc097d4: 91 39 00 40 stw r9,64(r25)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
ffc097d8: 7f 65 db 78 mr r5,r27
ffc097dc: 7f 86 e3 78 mr r6,r28
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
ffc097e0: 81 21 00 18 lwz r9,24(r1)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
ffc097e4: 38 e0 00 00 li r7,0
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
ffc097e8: 91 39 00 88 stw r9,136(r25)
ffc097ec: 81 21 00 1c lwz r9,28(r1)
ffc097f0: 91 39 00 8c stw r9,140(r25)
ffc097f4: 81 21 00 20 lwz r9,32(r1)
ffc097f8: 91 39 00 90 stw r9,144(r25)
ffc097fc: 81 21 00 24 lwz r9,36(r1)
ffc09800: 91 39 00 94 stw r9,148(r25)
ffc09804: 81 21 00 28 lwz r9,40(r1)
ffc09808: 91 39 00 98 stw r9,152(r25)
ffc0980c: 81 21 00 2c lwz r9,44(r1)
ffc09810: 91 39 00 9c stw r9,156(r25)
ffc09814: 81 21 00 30 lwz r9,48(r1)
ffc09818: 91 39 00 a0 stw r9,160(r25)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
ffc0981c: 48 00 4d b9 bl ffc0e5d4 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
ffc09820: 2f 9a 00 04 cmpwi cr7,r26,4
ffc09824: 41 9e 00 18 beq- cr7,ffc0983c <pthread_create+0x2f0>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
ffc09828: 81 38 00 08 lwz r9,8(r24)
_RTEMS_Unlock_allocator();
ffc0982c: 80 77 28 7c lwz r3,10364(r23)
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
ffc09830: 91 3d 00 00 stw r9,0(r29)
_RTEMS_Unlock_allocator();
ffc09834: 48 00 1e 31 bl ffc0b664 <_API_Mutex_Unlock>
ffc09838: 4b ff fd 80 b ffc095b8 <pthread_create+0x6c>
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
ffc0983c: 38 79 00 90 addi r3,r25,144
ffc09840: 48 00 4e 5d bl ffc0e69c <_Timespec_To_ticks>
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc09844: 38 99 00 a8 addi r4,r25,168
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc09848: 90 79 00 b4 stw r3,180(r25)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc0984c: 3c 60 00 00 lis r3,0
ffc09850: 38 63 2d 88 addi r3,r3,11656
ffc09854: 48 00 51 79 bl ffc0e9cc <_Watchdog_Insert>
ffc09858: 4b ff ff d0 b ffc09828 <pthread_create+0x2dc>
ffc1e50c <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
ffc1e50c: 94 21 ff d8 stwu r1,-40(r1)
ffc1e510: 7c 08 02 a6 mflr r0
ffc1e514: 93 e1 00 24 stw r31,36(r1)
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
ffc1e518: 7c 9f 23 79 mr. r31,r4
int pthread_kill(
pthread_t thread,
int sig
)
{
ffc1e51c: 90 01 00 2c stw r0,44(r1)
ffc1e520: 93 81 00 18 stw r28,24(r1)
ffc1e524: 93 a1 00 1c stw r29,28(r1)
ffc1e528: 93 c1 00 20 stw r30,32(r1)
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
ffc1e52c: 41 82 00 c8 beq- ffc1e5f4 <pthread_kill+0xe8>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
ffc1e530: 3b bf ff ff addi r29,r31,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
ffc1e534: 2b 9d 00 1f cmplwi cr7,r29,31
ffc1e538: 41 9d 00 bc bgt- cr7,ffc1e5f4 <pthread_kill+0xe8>
rtems_set_errno_and_return_minus_one( EINVAL );
the_thread = _Thread_Get( thread, &location );
ffc1e53c: 38 81 00 08 addi r4,r1,8
ffc1e540: 4b fe e5 9d bl ffc0cadc <_Thread_Get>
switch ( location ) {
ffc1e544: 81 21 00 08 lwz r9,8(r1)
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 );
ffc1e548: 7c 7e 1b 78 mr r30,r3
switch ( location ) {
ffc1e54c: 2f 89 00 00 cmpwi cr7,r9,0
ffc1e550: 40 9e 00 b8 bne- cr7,ffc1e608 <pthread_kill+0xfc> <== NEVER TAKEN
ffc1e554: 3c 60 00 00 lis r3,0
ffc1e558: 38 63 22 20 addi r3,r3,8736
ffc1e55c: 4b fe c0 c5 bl ffc0a620 <_API_extensions_Add_post_switch>
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
ffc1e560: 1d 1f 00 0c mulli r8,r31,12
* If sig == 0 then just validate arguments
*/
_POSIX_signals_Add_post_switch_extension();
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc1e564: 81 3e 01 50 lwz r9,336(r30)
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
ffc1e568: 3d 40 00 00 lis r10,0
ffc1e56c: 39 4a 32 20 addi r10,r10,12832
ffc1e570: 7d 4a 42 14 add r10,r10,r8
ffc1e574: 81 4a 00 08 lwz r10,8(r10)
ffc1e578: 2f 8a 00 01 cmpwi cr7,r10,1
ffc1e57c: 41 9e 00 48 beq- cr7,ffc1e5c4 <pthread_kill+0xb8>
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
ffc1e580: 81 49 00 d4 lwz r10,212(r9)
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
ffc1e584: 3b 80 00 01 li r28,1
ffc1e588: 7f 9d e8 30 slw r29,r28,r29
ffc1e58c: 7d 4a eb 78 or r10,r10,r29
ffc1e590: 91 49 00 d4 stw r10,212(r9)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
ffc1e594: 7f c3 f3 78 mr r3,r30
ffc1e598: 7f e4 fb 78 mr r4,r31
ffc1e59c: 38 a0 00 00 li r5,0
ffc1e5a0: 4b ff fe 11 bl ffc1e3b0 <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
ffc1e5a4: 3d 20 00 00 lis r9,0
ffc1e5a8: 39 29 31 a0 addi r9,r9,12704
ffc1e5ac: 81 49 00 08 lwz r10,8(r9)
ffc1e5b0: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1e5b4: 41 9e 00 10 beq- cr7,ffc1e5c4 <pthread_kill+0xb8>
ffc1e5b8: 81 49 00 10 lwz r10,16(r9)
ffc1e5bc: 7f 9e 50 00 cmpw cr7,r30,r10
ffc1e5c0: 41 9e 00 2c beq- cr7,ffc1e5ec <pthread_kill+0xe0>
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
_Thread_Enable_dispatch();
ffc1e5c4: 4b fe e4 fd bl ffc0cac0 <_Thread_Enable_dispatch>
return 0;
ffc1e5c8: 38 60 00 00 li r3,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
}
ffc1e5cc: 80 01 00 2c lwz r0,44(r1)
ffc1e5d0: 83 81 00 18 lwz r28,24(r1)
ffc1e5d4: 7c 08 03 a6 mtlr r0
ffc1e5d8: 83 a1 00 1c lwz r29,28(r1)
ffc1e5dc: 83 c1 00 20 lwz r30,32(r1)
ffc1e5e0: 83 e1 00 24 lwz r31,36(r1)
ffc1e5e4: 38 21 00 28 addi r1,r1,40
ffc1e5e8: 4e 80 00 20 blr
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;
ffc1e5ec: 9b 89 00 0c stb r28,12(r9)
ffc1e5f0: 4b ff ff d4 b ffc1e5c4 <pthread_kill+0xb8>
if ( !sig )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc1e5f4: 4b ff 4a 85 bl ffc13078 <__errno>
ffc1e5f8: 39 20 00 16 li r9,22
ffc1e5fc: 91 23 00 00 stw r9,0(r3)
ffc1e600: 38 60 ff ff li r3,-1
ffc1e604: 4b ff ff c8 b ffc1e5cc <pthread_kill+0xc0>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
ffc1e608: 4b ff 4a 71 bl ffc13078 <__errno> <== NOT EXECUTED
ffc1e60c: 39 20 00 03 li r9,3 <== NOT EXECUTED
ffc1e610: 91 23 00 00 stw r9,0(r3) <== NOT EXECUTED
ffc1e614: 38 60 ff ff li r3,-1 <== NOT EXECUTED
ffc1e618: 4b ff ff b4 b ffc1e5cc <pthread_kill+0xc0> <== NOT EXECUTED
ffc0ba9c <pthread_mutex_timedlock>:
*/
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
ffc0ba9c: 94 21 ff e0 stwu r1,-32(r1)
ffc0baa0: 7c 08 02 a6 mflr r0
ffc0baa4: 93 c1 00 18 stw r30,24(r1)
ffc0baa8: 7c 7e 1b 78 mr r30,r3
*
* 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 );
ffc0baac: 7c 83 23 78 mr r3,r4
ffc0bab0: 38 81 00 08 addi r4,r1,8
*/
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
ffc0bab4: 93 e1 00 1c stw r31,28(r1)
ffc0bab8: 90 01 00 24 stw r0,36(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 );
ffc0babc: 48 00 01 11 bl ffc0bbcc <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0bac0: 2f 83 00 03 cmpwi cr7,r3,3
*
* 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 );
ffc0bac4: 7c 7f 1b 78 mr r31,r3
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0bac8: 41 9e 00 34 beq- cr7,ffc0bafc <pthread_mutex_timedlock+0x60>
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
ffc0bacc: 80 a1 00 08 lwz r5,8(r1)
ffc0bad0: 7f c3 f3 78 mr r3,r30
ffc0bad4: 38 80 00 00 li r4,0
ffc0bad8: 4b ff fe 71 bl ffc0b948 <_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) ) {
ffc0badc: 2f 83 00 10 cmpwi cr7,r3,16
ffc0bae0: 41 9e 00 44 beq- cr7,ffc0bb24 <pthread_mutex_timedlock+0x88>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
ffc0bae4: 80 01 00 24 lwz r0,36(r1)
ffc0bae8: 83 c1 00 18 lwz r30,24(r1)
ffc0baec: 7c 08 03 a6 mtlr r0
ffc0baf0: 83 e1 00 1c lwz r31,28(r1)
ffc0baf4: 38 21 00 20 addi r1,r1,32
ffc0baf8: 4e 80 00 20 blr
*/
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 );
ffc0bafc: 80 a1 00 08 lwz r5,8(r1)
ffc0bb00: 7f c3 f3 78 mr r3,r30
ffc0bb04: 38 80 00 01 li r4,1
ffc0bb08: 4b ff fe 41 bl ffc0b948 <_POSIX_Mutex_Lock_support>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
ffc0bb0c: 80 01 00 24 lwz r0,36(r1)
ffc0bb10: 83 c1 00 18 lwz r30,24(r1)
ffc0bb14: 7c 08 03 a6 mtlr r0
ffc0bb18: 83 e1 00 1c lwz r31,28(r1)
ffc0bb1c: 38 21 00 20 addi r1,r1,32
ffc0bb20: 4e 80 00 20 blr
* 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 )
ffc0bb24: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0bb28: 40 9e 00 0c bne- cr7,ffc0bb34 <pthread_mutex_timedlock+0x98><== ALWAYS TAKEN
return EINVAL;
ffc0bb2c: 38 60 00 16 li r3,22 <== NOT EXECUTED
ffc0bb30: 4b ff ff b4 b ffc0bae4 <pthread_mutex_timedlock+0x48><== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
ffc0bb34: 3b ff ff ff addi r31,r31,-1
ffc0bb38: 2b 9f 00 01 cmplwi cr7,r31,1
ffc0bb3c: 41 9d ff a8 bgt+ cr7,ffc0bae4 <pthread_mutex_timedlock+0x48><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
ffc0bb40: 38 60 00 74 li r3,116
ffc0bb44: 4b ff ff a0 b ffc0bae4 <pthread_mutex_timedlock+0x48>
ffc09df8 <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
ffc09df8: 94 21 ff e0 stwu r1,-32(r1)
ffc09dfc: 7c 08 02 a6 mflr r0
ffc09e00: 93 e1 00 1c stw r31,28(r1)
if ( !once_control || !init_routine )
ffc09e04: 7c 7f 1b 79 mr. r31,r3
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
ffc09e08: 90 01 00 24 stw r0,36(r1)
ffc09e0c: 93 c1 00 18 stw r30,24(r1)
if ( !once_control || !init_routine )
ffc09e10: 41 82 00 84 beq- ffc09e94 <pthread_once+0x9c>
ffc09e14: 2f 84 00 00 cmpwi cr7,r4,0
ffc09e18: 7c 9e 23 78 mr r30,r4
return EINVAL;
ffc09e1c: 38 60 00 16 li r3,22
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
ffc09e20: 41 9e 00 14 beq- cr7,ffc09e34 <pthread_once+0x3c>
return EINVAL;
if ( !once_control->init_executed ) {
ffc09e24: 81 3f 00 04 lwz r9,4(r31)
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
ffc09e28: 38 60 00 00 li r3,0
)
{
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
ffc09e2c: 2f 89 00 00 cmpwi cr7,r9,0
ffc09e30: 41 9e 00 1c beq- cr7,ffc09e4c <pthread_once+0x54>
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
ffc09e34: 80 01 00 24 lwz r0,36(r1)
ffc09e38: 83 c1 00 18 lwz r30,24(r1)
ffc09e3c: 7c 08 03 a6 mtlr r0
ffc09e40: 83 e1 00 1c lwz r31,28(r1)
ffc09e44: 38 21 00 20 addi r1,r1,32
ffc09e48: 4e 80 00 20 blr
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);
ffc09e4c: 38 60 01 00 li r3,256
ffc09e50: 38 80 01 00 li r4,256
ffc09e54: 38 a1 00 08 addi r5,r1,8
ffc09e58: 48 00 0f 5d bl ffc0adb4 <rtems_task_mode>
if ( !once_control->init_executed ) {
ffc09e5c: 81 3f 00 04 lwz r9,4(r31)
ffc09e60: 2f 89 00 00 cmpwi cr7,r9,0
ffc09e64: 41 9e 00 4c beq- cr7,ffc09eb0 <pthread_once+0xb8> <== ALWAYS TAKEN
once_control->is_initialized = true;
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
ffc09e68: 80 61 00 08 lwz r3,8(r1)
ffc09e6c: 38 a1 00 08 addi r5,r1,8
ffc09e70: 38 80 01 00 li r4,256
ffc09e74: 48 00 0f 41 bl ffc0adb4 <rtems_task_mode>
}
return 0;
}
ffc09e78: 80 01 00 24 lwz r0,36(r1)
ffc09e7c: 83 c1 00 18 lwz r30,24(r1)
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
ffc09e80: 38 60 00 00 li r3,0
}
ffc09e84: 7c 08 03 a6 mtlr r0
ffc09e88: 83 e1 00 1c lwz r31,28(r1)
ffc09e8c: 38 21 00 20 addi r1,r1,32
ffc09e90: 4e 80 00 20 blr
ffc09e94: 80 01 00 24 lwz r0,36(r1)
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
ffc09e98: 38 60 00 16 li r3,22
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
ffc09e9c: 83 c1 00 18 lwz r30,24(r1)
ffc09ea0: 7c 08 03 a6 mtlr r0
ffc09ea4: 83 e1 00 1c lwz r31,28(r1)
ffc09ea8: 38 21 00 20 addi r1,r1,32
ffc09eac: 4e 80 00 20 blr
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;
ffc09eb0: 39 20 00 01 li r9,1
once_control->init_executed = true;
(*init_routine)();
ffc09eb4: 7f c9 03 a6 mtctr r30
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;
ffc09eb8: 91 3f 00 00 stw r9,0(r31)
once_control->init_executed = true;
ffc09ebc: 91 3f 00 04 stw r9,4(r31)
(*init_routine)();
ffc09ec0: 4e 80 04 21 bctrl
ffc09ec4: 4b ff ff a4 b ffc09e68 <pthread_once+0x70>
ffc0a1dc <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
ffc0a1dc: 94 21 ff d8 stwu r1,-40(r1)
ffc0a1e0: 7c 08 02 a6 mflr r0
ffc0a1e4: 93 e1 00 24 stw r31,36(r1)
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
ffc0a1e8: 7c 7f 1b 79 mr. r31,r3
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
ffc0a1ec: 90 01 00 2c stw r0,44(r1)
ffc0a1f0: 93 81 00 18 stw r28,24(r1)
ffc0a1f4: 93 a1 00 1c stw r29,28(r1)
ffc0a1f8: 93 c1 00 20 stw r30,32(r1)
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
ffc0a1fc: 41 82 00 1c beq- ffc0a218 <pthread_rwlock_init+0x3c>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
ffc0a200: 2f 84 00 00 cmpwi cr7,r4,0
ffc0a204: 7c 89 23 78 mr r9,r4
ffc0a208: 41 9e 00 9c beq- cr7,ffc0a2a4 <pthread_rwlock_init+0xc8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
ffc0a20c: 81 49 00 00 lwz r10,0(r9)
ffc0a210: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0a214: 40 9e 00 28 bne- cr7,ffc0a23c <pthread_rwlock_init+0x60><== ALWAYS TAKEN
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
ffc0a218: 38 60 00 16 li r3,22
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc0a21c: 80 01 00 2c lwz r0,44(r1)
ffc0a220: 83 81 00 18 lwz r28,24(r1)
ffc0a224: 7c 08 03 a6 mtlr r0
ffc0a228: 83 a1 00 1c lwz r29,28(r1)
ffc0a22c: 83 c1 00 20 lwz r30,32(r1)
ffc0a230: 83 e1 00 24 lwz r31,36(r1)
ffc0a234: 38 21 00 28 addi r1,r1,40
ffc0a238: 4e 80 00 20 blr
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
return EINVAL;
switch ( the_attr->process_shared ) {
ffc0a23c: 83 c9 00 04 lwz r30,4(r9)
ffc0a240: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0a244: 40 be ff d4 bne- cr7,ffc0a218 <pthread_rwlock_init+0x3c><== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0a248: 3d 20 00 00 lis r9,0
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
ffc0a24c: 93 c1 00 10 stw r30,16(r1)
ffc0a250: 81 49 28 a8 lwz r10,10408(r9)
++level;
ffc0a254: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc0a258: 91 49 28 a8 stw r10,10408(r9)
* This function allocates a RWLock control block from
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
ffc0a25c: 3f 80 00 00 lis r28,0
ffc0a260: 3b 9c 58 40 addi r28,r28,22592
ffc0a264: 7f 83 e3 78 mr r3,r28
ffc0a268: 48 00 35 41 bl ffc0d7a8 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
ffc0a26c: 7c 7d 1b 79 mr. r29,r3
ffc0a270: 41 82 00 44 beq- ffc0a2b4 <pthread_rwlock_init+0xd8>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
ffc0a274: 38 7d 00 10 addi r3,r29,16
ffc0a278: 38 81 00 10 addi r4,r1,16
ffc0a27c: 48 00 2d dd bl ffc0d058 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
ffc0a280: 81 3d 00 08 lwz r9,8(r29)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc0a284: 81 1c 00 1c lwz r8,28(r28)
ffc0a288: 55 2a 13 ba rlwinm r10,r9,2,14,29
ffc0a28c: 7f a8 51 2e stwx r29,r8,r10
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
ffc0a290: 93 dd 00 0c stw r30,12(r29)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
ffc0a294: 91 3f 00 00 stw r9,0(r31)
_Thread_Enable_dispatch();
ffc0a298: 48 00 4c f5 bl ffc0ef8c <_Thread_Enable_dispatch>
return 0;
ffc0a29c: 38 60 00 00 li r3,0
ffc0a2a0: 4b ff ff 7c b ffc0a21c <pthread_rwlock_init+0x40>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
ffc0a2a4: 38 61 00 08 addi r3,r1,8
ffc0a2a8: 48 00 08 95 bl ffc0ab3c <pthread_rwlockattr_init>
the_attr = &default_attr;
ffc0a2ac: 39 21 00 08 addi r9,r1,8
ffc0a2b0: 4b ff ff 5c b ffc0a20c <pthread_rwlock_init+0x30>
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
_Thread_Enable_dispatch();
ffc0a2b4: 48 00 4c d9 bl ffc0ef8c <_Thread_Enable_dispatch>
return EAGAIN;
ffc0a2b8: 38 60 00 0b li r3,11
ffc0a2bc: 4b ff ff 60 b ffc0a21c <pthread_rwlock_init+0x40>
ffc0a80c <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
ffc0a80c: 94 21 ff d8 stwu r1,-40(r1)
ffc0a810: 7c 08 02 a6 mflr r0
ffc0a814: 93 e1 00 24 stw r31,36(r1)
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
ffc0a818: 7c 7f 1b 79 mr. r31,r3
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
ffc0a81c: 90 01 00 2c stw r0,44(r1)
ffc0a820: 93 a1 00 1c stw r29,28(r1)
ffc0a824: 93 c1 00 20 stw r30,32(r1)
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
ffc0a828: 41 82 00 84 beq- ffc0a8ac <pthread_rwlock_timedrdlock+0xa0>
ffc0a82c: 7c 83 23 78 mr r3,r4
*
* 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 );
ffc0a830: 38 81 00 08 addi r4,r1,8
ffc0a834: 48 00 79 45 bl ffc12178 <_POSIX_Absolute_timeout_to_ticks>
ffc0a838: 80 9f 00 00 lwz r4,0(r31)
ffc0a83c: 7c 7e 1b 78 mr r30,r3
ffc0a840: 3c 60 00 00 lis r3,0
ffc0a844: 38 63 2e 40 addi r3,r3,11840
ffc0a848: 38 a1 00 0c addi r5,r1,12
ffc0a84c: 48 00 36 41 bl ffc0de8c <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
ffc0a850: 81 21 00 0c lwz r9,12(r1)
ffc0a854: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a858: 40 9e 00 54 bne- cr7,ffc0a8ac <pthread_rwlock_timedrdlock+0xa0>
* 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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0a85c: 6b dd 00 03 xori r29,r30,3
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
ffc0a860: 80 9f 00 00 lwz r4,0(r31)
* 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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0a864: 7f bd 00 34 cntlzw r29,r29
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
ffc0a868: 80 c1 00 08 lwz r6,8(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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0a86c: 57 bd d9 7e rlwinm r29,r29,27,5,31
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
ffc0a870: 38 63 00 10 addi r3,r3,16
ffc0a874: 7f a5 eb 78 mr r5,r29
ffc0a878: 38 e0 00 00 li r7,0
ffc0a87c: 48 00 25 69 bl ffc0cde4 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
ffc0a880: 48 00 46 5d bl ffc0eedc <_Thread_Enable_dispatch>
if ( !do_wait ) {
ffc0a884: 2f 9d 00 00 cmpwi cr7,r29,0
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
ffc0a888: 3d 20 00 00 lis r9,0
ffc0a88c: 81 29 31 b0 lwz r9,12720(r9)
ffc0a890: 81 29 00 34 lwz r9,52(r9)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
ffc0a894: 40 9e 00 0c bne- cr7,ffc0a8a0 <pthread_rwlock_timedrdlock+0x94>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
ffc0a898: 2f 89 00 02 cmpwi cr7,r9,2
ffc0a89c: 41 9e 00 30 beq- cr7,ffc0a8cc <pthread_rwlock_timedrdlock+0xc0>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
ffc0a8a0: 7d 23 4b 78 mr r3,r9
ffc0a8a4: 48 00 01 21 bl ffc0a9c4 <_POSIX_RWLock_Translate_core_RWLock_return_code>
ffc0a8a8: 48 00 00 08 b ffc0a8b0 <pthread_rwlock_timedrdlock+0xa4>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
ffc0a8ac: 38 60 00 16 li r3,22
}
ffc0a8b0: 80 01 00 2c lwz r0,44(r1)
ffc0a8b4: 83 a1 00 1c lwz r29,28(r1)
ffc0a8b8: 7c 08 03 a6 mtlr r0
ffc0a8bc: 83 c1 00 20 lwz r30,32(r1)
ffc0a8c0: 83 e1 00 24 lwz r31,36(r1)
ffc0a8c4: 38 21 00 28 addi r1,r1,40
ffc0a8c8: 4e 80 00 20 blr
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
ffc0a8cc: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0a8d0: 41 9e ff dc beq+ cr7,ffc0a8ac <pthread_rwlock_timedrdlock+0xa0><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
ffc0a8d4: 3b de ff ff addi r30,r30,-1
ffc0a8d8: 2b 9e 00 01 cmplwi cr7,r30,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
ffc0a8dc: 38 60 00 74 li r3,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 ||
ffc0a8e0: 41 9d ff c0 bgt+ cr7,ffc0a8a0 <pthread_rwlock_timedrdlock+0x94><== NEVER TAKEN
ffc0a8e4: 4b ff ff cc b ffc0a8b0 <pthread_rwlock_timedrdlock+0xa4>
ffc0a8e8 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
ffc0a8e8: 94 21 ff d8 stwu r1,-40(r1)
ffc0a8ec: 7c 08 02 a6 mflr r0
ffc0a8f0: 93 e1 00 24 stw r31,36(r1)
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
ffc0a8f4: 7c 7f 1b 79 mr. r31,r3
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
ffc0a8f8: 90 01 00 2c stw r0,44(r1)
ffc0a8fc: 93 a1 00 1c stw r29,28(r1)
ffc0a900: 93 c1 00 20 stw r30,32(r1)
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
ffc0a904: 41 82 00 84 beq- ffc0a988 <pthread_rwlock_timedwrlock+0xa0>
ffc0a908: 7c 83 23 78 mr r3,r4
*
* 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 );
ffc0a90c: 38 81 00 08 addi r4,r1,8
ffc0a910: 48 00 78 69 bl ffc12178 <_POSIX_Absolute_timeout_to_ticks>
ffc0a914: 80 9f 00 00 lwz r4,0(r31)
ffc0a918: 7c 7e 1b 78 mr r30,r3
ffc0a91c: 3c 60 00 00 lis r3,0
ffc0a920: 38 63 2e 40 addi r3,r3,11840
ffc0a924: 38 a1 00 0c addi r5,r1,12
ffc0a928: 48 00 35 65 bl ffc0de8c <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
ffc0a92c: 81 21 00 0c lwz r9,12(r1)
ffc0a930: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a934: 40 9e 00 54 bne- cr7,ffc0a988 <pthread_rwlock_timedwrlock+0xa0>
* 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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0a938: 6b dd 00 03 xori r29,r30,3
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
ffc0a93c: 80 9f 00 00 lwz r4,0(r31)
* 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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0a940: 7f bd 00 34 cntlzw r29,r29
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
ffc0a944: 80 c1 00 08 lwz r6,8(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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0a948: 57 bd d9 7e rlwinm r29,r29,27,5,31
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
ffc0a94c: 38 63 00 10 addi r3,r3,16
ffc0a950: 7f a5 eb 78 mr r5,r29
ffc0a954: 38 e0 00 00 li r7,0
ffc0a958: 48 00 25 bd bl ffc0cf14 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
ffc0a95c: 48 00 45 81 bl ffc0eedc <_Thread_Enable_dispatch>
if ( !do_wait &&
ffc0a960: 2f 9d 00 00 cmpwi cr7,r29,0
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
ffc0a964: 3d 20 00 00 lis r9,0
ffc0a968: 81 29 31 b0 lwz r9,12720(r9)
ffc0a96c: 81 29 00 34 lwz r9,52(r9)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
ffc0a970: 40 9e 00 0c bne- cr7,ffc0a97c <pthread_rwlock_timedwrlock+0x94>
ffc0a974: 2f 89 00 02 cmpwi cr7,r9,2
ffc0a978: 41 9e 00 30 beq- cr7,ffc0a9a8 <pthread_rwlock_timedwrlock+0xc0>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
ffc0a97c: 7d 23 4b 78 mr r3,r9
ffc0a980: 48 00 00 45 bl ffc0a9c4 <_POSIX_RWLock_Translate_core_RWLock_return_code>
ffc0a984: 48 00 00 08 b ffc0a98c <pthread_rwlock_timedwrlock+0xa4>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
ffc0a988: 38 60 00 16 li r3,22
}
ffc0a98c: 80 01 00 2c lwz r0,44(r1)
ffc0a990: 83 a1 00 1c lwz r29,28(r1)
ffc0a994: 7c 08 03 a6 mtlr r0
ffc0a998: 83 c1 00 20 lwz r30,32(r1)
ffc0a99c: 83 e1 00 24 lwz r31,36(r1)
ffc0a9a0: 38 21 00 28 addi r1,r1,40
ffc0a9a4: 4e 80 00 20 blr
);
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
ffc0a9a8: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0a9ac: 41 9e ff dc beq+ cr7,ffc0a988 <pthread_rwlock_timedwrlock+0xa0><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
ffc0a9b0: 3b de ff ff addi r30,r30,-1
ffc0a9b4: 2b 9e 00 01 cmplwi cr7,r30,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
ffc0a9b8: 38 60 00 74 li r3,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 ||
ffc0a9bc: 41 9d ff c0 bgt+ cr7,ffc0a97c <pthread_rwlock_timedwrlock+0x94><== NEVER TAKEN
ffc0a9c0: 4b ff ff cc b ffc0a98c <pthread_rwlock_timedwrlock+0xa4>
ffc0c66c <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
ffc0c66c: 94 21 ff d0 stwu r1,-48(r1)
ffc0c670: 7c 08 02 a6 mflr r0
ffc0c674: 93 c1 00 28 stw r30,40(r1)
int rc;
/*
* Check all the parameters
*/
if ( !param )
ffc0c678: 7c be 2b 79 mr. r30,r5
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
ffc0c67c: 93 e1 00 2c stw r31,44(r1)
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
ffc0c680: 3b e0 00 16 li r31,22
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
ffc0c684: 90 01 00 34 stw r0,52(r1)
ffc0c688: 93 61 00 1c stw r27,28(r1)
ffc0c68c: 93 81 00 20 stw r28,32(r1)
ffc0c690: 93 a1 00 24 stw r29,36(r1)
int rc;
/*
* Check all the parameters
*/
if ( !param )
ffc0c694: 41 82 00 28 beq- ffc0c6bc <pthread_setschedparam+0x50>
ffc0c698: 7c 7c 1b 78 mr r28,r3
ffc0c69c: 7c 9d 23 78 mr r29,r4
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
ffc0c6a0: 7c 83 23 78 mr r3,r4
ffc0c6a4: 38 a1 00 10 addi r5,r1,16
ffc0c6a8: 7f c4 f3 78 mr r4,r30
ffc0c6ac: 38 c1 00 0c addi r6,r1,12
ffc0c6b0: 48 00 6e e9 bl ffc13598 <_POSIX_Thread_Translate_sched_param>
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
ffc0c6b4: 7c 7f 1b 79 mr. r31,r3
ffc0c6b8: 41 82 00 2c beq- ffc0c6e4 <pthread_setschedparam+0x78>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
ffc0c6bc: 80 01 00 34 lwz r0,52(r1)
ffc0c6c0: 7f e3 fb 78 mr r3,r31
ffc0c6c4: 83 61 00 1c lwz r27,28(r1)
ffc0c6c8: 7c 08 03 a6 mtlr r0
ffc0c6cc: 83 81 00 20 lwz r28,32(r1)
ffc0c6d0: 83 a1 00 24 lwz r29,36(r1)
ffc0c6d4: 83 c1 00 28 lwz r30,40(r1)
ffc0c6d8: 83 e1 00 2c lwz r31,44(r1)
ffc0c6dc: 38 21 00 30 addi r1,r1,48
ffc0c6e0: 4e 80 00 20 blr
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
ffc0c6e4: 7f 83 e3 78 mr r3,r28
ffc0c6e8: 38 81 00 08 addi r4,r1,8
ffc0c6ec: 48 00 39 6d bl ffc10058 <_Thread_Get>
switch ( location ) {
ffc0c6f0: 81 21 00 08 lwz r9,8(r1)
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
ffc0c6f4: 7c 7b 1b 78 mr r27,r3
switch ( location ) {
ffc0c6f8: 2f 89 00 00 cmpwi cr7,r9,0
ffc0c6fc: 40 9e 00 98 bne- cr7,ffc0c794 <pthread_setschedparam+0x128>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc0c700: 83 83 01 50 lwz r28,336(r3)
if ( api->schedpolicy == SCHED_SPORADIC )
ffc0c704: 81 3c 00 84 lwz r9,132(r28)
ffc0c708: 2f 89 00 04 cmpwi cr7,r9,4
ffc0c70c: 41 9e 00 e4 beq- cr7,ffc0c7f0 <pthread_setschedparam+0x184>
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
api->schedparam = *param;
ffc0c710: 80 fe 00 04 lwz r7,4(r30)
the_thread->budget_algorithm = budget_algorithm;
the_thread->budget_callout = budget_callout;
switch ( api->schedpolicy ) {
ffc0c714: 2f 9d 00 00 cmpwi cr7,r29,0
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
api->schedparam = *param;
ffc0c718: 81 1e 00 08 lwz r8,8(r30)
ffc0c71c: 81 5e 00 0c lwz r10,12(r30)
ffc0c720: 81 3e 00 00 lwz r9,0(r30)
ffc0c724: 90 fc 00 8c stw r7,140(r28)
ffc0c728: 91 3c 00 88 stw r9,136(r28)
ffc0c72c: 91 1c 00 90 stw r8,144(r28)
ffc0c730: 91 5c 00 94 stw r10,148(r28)
ffc0c734: 81 5e 00 18 lwz r10,24(r30)
ffc0c738: 80 fe 00 10 lwz r7,16(r30)
ffc0c73c: 81 1e 00 14 lwz r8,20(r30)
ffc0c740: 91 5c 00 a0 stw r10,160(r28)
the_thread->budget_algorithm = budget_algorithm;
ffc0c744: 81 41 00 10 lwz r10,16(r1)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
ffc0c748: 93 bc 00 84 stw r29,132(r28)
api->schedparam = *param;
ffc0c74c: 90 fc 00 98 stw r7,152(r28)
ffc0c750: 91 1c 00 9c stw r8,156(r28)
the_thread->budget_algorithm = budget_algorithm;
ffc0c754: 91 5b 00 78 stw r10,120(r27)
the_thread->budget_callout = budget_callout;
ffc0c758: 81 41 00 0c lwz r10,12(r1)
ffc0c75c: 91 5b 00 7c stw r10,124(r27)
switch ( api->schedpolicy ) {
ffc0c760: 41 9c 00 2c blt- cr7,ffc0c78c <pthread_setschedparam+0x120><== NEVER TAKEN
ffc0c764: 2f 9d 00 02 cmpwi cr7,r29,2
ffc0c768: 40 9d 00 58 ble- cr7,ffc0c7c0 <pthread_setschedparam+0x154>
ffc0c76c: 2f 9d 00 04 cmpwi cr7,r29,4
ffc0c770: 40 be 00 1c bne+ cr7,ffc0c78c <pthread_setschedparam+0x120><== NEVER TAKEN
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
ffc0c774: 91 3c 00 a4 stw r9,164(r28)
_Watchdog_Remove( &api->Sporadic_timer );
ffc0c778: 38 7c 00 a8 addi r3,r28,168
ffc0c77c: 48 00 4c e9 bl ffc11464 <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
ffc0c780: 38 60 00 00 li r3,0
ffc0c784: 7f 64 db 78 mr r4,r27
ffc0c788: 4b ff fd 75 bl ffc0c4fc <_POSIX_Threads_Sporadic_budget_TSR>
break;
}
_Thread_Enable_dispatch();
ffc0c78c: 48 00 38 b1 bl ffc1003c <_Thread_Enable_dispatch>
ffc0c790: 4b ff ff 2c b ffc0c6bc <pthread_setschedparam+0x50>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
ffc0c794: 80 01 00 34 lwz r0,52(r1)
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
ffc0c798: 3b e0 00 03 li r31,3
}
ffc0c79c: 7f e3 fb 78 mr r3,r31
ffc0c7a0: 83 61 00 1c lwz r27,28(r1)
ffc0c7a4: 7c 08 03 a6 mtlr r0
ffc0c7a8: 83 81 00 20 lwz r28,32(r1)
ffc0c7ac: 83 a1 00 24 lwz r29,36(r1)
ffc0c7b0: 83 c1 00 28 lwz r30,40(r1)
ffc0c7b4: 83 e1 00 2c lwz r31,44(r1)
ffc0c7b8: 38 21 00 30 addi r1,r1,48
ffc0c7bc: 4e 80 00 20 blr
ffc0c7c0: 3d 40 00 00 lis r10,0
ffc0c7c4: 88 8a 27 c4 lbz r4,10180(r10)
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
ffc0c7c8: 3d 40 00 00 lis r10,0
ffc0c7cc: 81 4a 28 e0 lwz r10,10464(r10)
the_thread->real_priority =
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
ffc0c7d0: 7f 63 db 78 mr r3,r27
ffc0c7d4: 7c 89 20 50 subf r4,r9,r4
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
ffc0c7d8: 91 5b 00 74 stw r10,116(r27)
the_thread->real_priority =
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
ffc0c7dc: 38 a0 00 01 li r5,1
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
the_thread->real_priority =
ffc0c7e0: 90 9b 00 18 stw r4,24(r27)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
ffc0c7e4: 48 00 31 cd bl ffc0f9b0 <_Thread_Change_priority>
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
ffc0c7e8: 48 00 38 55 bl ffc1003c <_Thread_Enable_dispatch>
ffc0c7ec: 4b ff fe d0 b ffc0c6bc <pthread_setschedparam+0x50>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
ffc0c7f0: 38 7c 00 a8 addi r3,r28,168
ffc0c7f4: 48 00 4c 71 bl ffc11464 <_Watchdog_Remove>
ffc0c7f8: 4b ff ff 18 b ffc0c710 <pthread_setschedparam+0xa4>
ffc09b20 <pthread_testcancel>:
/*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
ffc09b20: 94 21 ff f0 stwu r1,-16(r1)
ffc09b24: 7c 08 02 a6 mflr r0
ffc09b28: 93 e1 00 0c stw r31,12(r1)
* 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() )
ffc09b2c: 3f e0 00 00 lis r31,0
ffc09b30: 3b ff 31 60 addi r31,r31,12640
/*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
ffc09b34: 90 01 00 14 stw r0,20(r1)
* 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() )
ffc09b38: 81 3f 00 08 lwz r9,8(r31)
ffc09b3c: 2f 89 00 00 cmpwi cr7,r9,0
ffc09b40: 40 9e 00 68 bne- cr7,ffc09ba8 <pthread_testcancel+0x88> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc09b44: 3d 20 00 00 lis r9,0
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
ffc09b48: 81 5f 00 10 lwz r10,16(r31)
ffc09b4c: 81 09 28 68 lwz r8,10344(r9)
ffc09b50: 81 4a 01 50 lwz r10,336(r10)
++level;
ffc09b54: 39 08 00 01 addi r8,r8,1
_Thread_Dispatch_disable_level = level;
ffc09b58: 91 09 28 68 stw r8,10344(r9)
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
ffc09b5c: 81 2a 00 d8 lwz r9,216(r10)
ffc09b60: 2f 89 00 00 cmpwi cr7,r9,0
ffc09b64: 40 9e 00 30 bne- cr7,ffc09b94 <pthread_testcancel+0x74> <== NEVER TAKEN
ffc09b68: 81 2a 00 e0 lwz r9,224(r10)
ffc09b6c: 2f 89 00 00 cmpwi cr7,r9,0
ffc09b70: 41 9e 00 24 beq- cr7,ffc09b94 <pthread_testcancel+0x74>
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
ffc09b74: 48 00 36 f5 bl ffc0d268 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
}
ffc09b78: 80 01 00 14 lwz r0,20(r1)
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
ffc09b7c: 80 7f 00 10 lwz r3,16(r31)
ffc09b80: 38 80 ff ff li r4,-1
}
ffc09b84: 7c 08 03 a6 mtlr r0
ffc09b88: 83 e1 00 0c lwz r31,12(r1)
ffc09b8c: 38 21 00 10 addi r1,r1,16
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
ffc09b90: 48 00 6c d0 b ffc10860 <_POSIX_Thread_Exit>
}
ffc09b94: 80 01 00 14 lwz r0,20(r1)
ffc09b98: 83 e1 00 0c lwz r31,12(r1)
ffc09b9c: 7c 08 03 a6 mtlr r0
ffc09ba0: 38 21 00 10 addi r1,r1,16
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
ffc09ba4: 48 00 36 c4 b ffc0d268 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
}
ffc09ba8: 80 01 00 14 lwz r0,20(r1) <== NOT EXECUTED
ffc09bac: 83 e1 00 0c lwz r31,12(r1) <== NOT EXECUTED
ffc09bb0: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc09bb4: 38 21 00 10 addi r1,r1,16 <== NOT EXECUTED
ffc09bb8: 4e 80 00 20 blr <== NOT EXECUTED
ffc0a0a4 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
ffc0a0a4: 94 21 ff b0 stwu r1,-80(r1)
ffc0a0a8: 7c 08 02 a6 mflr r0
ffc0a0ac: 93 c1 00 48 stw r30,72(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);
ffc0a0b0: 3f c0 00 00 lis r30,0
ffc0a0b4: 3b de 2b b8 addi r30,r30,11192
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
ffc0a0b8: 93 e1 00 4c stw r31,76(r1)
ffc0a0bc: 7c 7f 1b 78 mr r31,r3
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);
ffc0a0c0: 7f c3 f3 78 mr r3,r30
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
ffc0a0c4: 93 a1 00 44 stw r29,68(r1)
ffc0a0c8: 90 01 00 54 stw r0,84(r1)
ffc0a0cc: 93 61 00 3c stw r27,60(r1)
ffc0a0d0: 93 81 00 40 stw r28,64(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);
ffc0a0d4: 48 00 0d 0d bl ffc0ade0 <pthread_mutex_lock>
if (result != 0) {
ffc0a0d8: 7c 7d 1b 79 mr. r29,r3
ffc0a0dc: 40 82 00 d4 bne- ffc0a1b0 <rtems_aio_enqueue+0x10c> <== 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);
ffc0a0e0: 48 00 18 25 bl ffc0b904 <pthread_self>
ffc0a0e4: 38 81 00 24 addi r4,r1,36
ffc0a0e8: 38 a1 00 08 addi r5,r1,8
ffc0a0ec: 48 00 12 d9 bl ffc0b3c4 <pthread_getschedparam>
req->caller_thread = pthread_self ();
ffc0a0f0: 48 00 18 15 bl ffc0b904 <pthread_self>
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
ffc0a0f4: 81 5e 00 68 lwz r10,104(r30)
/* _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;
ffc0a0f8: 81 3f 00 14 lwz r9,20(r31)
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
ffc0a0fc: 2f 8a 00 00 cmpwi cr7,r10,0
/* _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;
ffc0a100: 81 01 00 08 lwz r8,8(r1)
ffc0a104: 81 49 00 18 lwz r10,24(r9)
/* _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 ();
ffc0a108: 90 7f 00 10 stw r3,16(r31)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
ffc0a10c: 7d 0a 40 50 subf r8,r10,r8
ffc0a110: 91 1f 00 0c stw r8,12(r31)
req->policy = policy;
ffc0a114: 81 01 00 24 lwz r8,36(r1)
ffc0a118: 91 1f 00 08 stw r8,8(r31)
req->aiocbp->error_code = EINPROGRESS;
ffc0a11c: 39 00 00 77 li r8,119
ffc0a120: 91 09 00 34 stw r8,52(r9)
req->aiocbp->return_value = 0;
ffc0a124: 93 a9 00 38 stw r29,56(r9)
if ((aio_request_queue.idle_threads == 0) &&
ffc0a128: 40 9e 00 10 bne- cr7,ffc0a138 <rtems_aio_enqueue+0x94> <== NEVER TAKEN
ffc0a12c: 81 5e 00 64 lwz r10,100(r30)
ffc0a130: 2f 8a 00 04 cmpwi cr7,r10,4
ffc0a134: 40 9d 00 ac ble- cr7,ffc0a1e0 <rtems_aio_enqueue+0x13c>
else
{
/* the maximum number of threads has been already created
even though some of them might be idle.
The request belongs to one of the active fd chain */
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
ffc0a138: 3f 60 00 00 lis r27,0
ffc0a13c: 80 89 00 00 lwz r4,0(r9)
ffc0a140: 3b 7b 2c 00 addi r27,r27,11264
ffc0a144: 7f 63 db 78 mr r3,r27
ffc0a148: 38 a0 00 00 li r5,0
ffc0a14c: 4b ff fc f9 bl ffc09e44 <rtems_aio_search_fd>
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
ffc0a150: 7c 7c 1b 79 mr. r28,r3
ffc0a154: 41 82 01 04 beq- ffc0a258 <rtems_aio_enqueue+0x1b4>
{
pthread_mutex_lock (&r_chain->mutex);
ffc0a158: 3b 7c 00 1c addi r27,r28,28
ffc0a15c: 7f 63 db 78 mr r3,r27
ffc0a160: 48 00 0c 81 bl ffc0ade0 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
ffc0a164: 38 7c 00 08 addi r3,r28,8
ffc0a168: 7f e4 fb 78 mr r4,r31
ffc0a16c: 4b ff fb 35 bl ffc09ca0 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
ffc0a170: 38 7c 00 20 addi r3,r28,32
ffc0a174: 48 00 06 39 bl ffc0a7ac <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
ffc0a178: 7f 63 db 78 mr r3,r27
ffc0a17c: 48 00 0d 15 bl ffc0ae90 <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);
ffc0a180: 7f c3 f3 78 mr r3,r30
ffc0a184: 48 00 0d 0d bl ffc0ae90 <pthread_mutex_unlock>
return 0;
}
ffc0a188: 80 01 00 54 lwz r0,84(r1)
ffc0a18c: 7f a3 eb 78 mr r3,r29
ffc0a190: 83 61 00 3c lwz r27,60(r1)
ffc0a194: 7c 08 03 a6 mtlr r0
ffc0a198: 83 81 00 40 lwz r28,64(r1)
ffc0a19c: 83 a1 00 44 lwz r29,68(r1)
ffc0a1a0: 83 c1 00 48 lwz r30,72(r1)
ffc0a1a4: 83 e1 00 4c lwz r31,76(r1)
ffc0a1a8: 38 21 00 50 addi r1,r1,80
ffc0a1ac: 4e 80 00 20 blr
/* 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);
ffc0a1b0: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED
ffc0a1b4: 4b ff ac 91 bl ffc04e44 <free> <== NOT EXECUTED
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
return 0;
}
ffc0a1b8: 80 01 00 54 lwz r0,84(r1) <== NOT EXECUTED
ffc0a1bc: 7f a3 eb 78 mr r3,r29 <== NOT EXECUTED
ffc0a1c0: 83 61 00 3c lwz r27,60(r1) <== NOT EXECUTED
ffc0a1c4: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0a1c8: 83 81 00 40 lwz r28,64(r1) <== NOT EXECUTED
ffc0a1cc: 83 a1 00 44 lwz r29,68(r1) <== NOT EXECUTED
ffc0a1d0: 83 c1 00 48 lwz r30,72(r1) <== NOT EXECUTED
ffc0a1d4: 83 e1 00 4c lwz r31,76(r1) <== NOT EXECUTED
ffc0a1d8: 38 21 00 50 addi r1,r1,80 <== NOT EXECUTED
ffc0a1dc: 4e 80 00 20 blr <== NOT EXECUTED
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);
ffc0a1e0: 80 89 00 00 lwz r4,0(r9)
ffc0a1e4: 38 7e 00 48 addi r3,r30,72
ffc0a1e8: 38 a0 00 01 li r5,1
ffc0a1ec: 4b ff fc 59 bl ffc09e44 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
ffc0a1f0: 81 23 00 18 lwz r9,24(r3)
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);
ffc0a1f4: 7c 7c 1b 78 mr r28,r3
if (r_chain->new_fd == 1) {
ffc0a1f8: 2f 89 00 01 cmpwi cr7,r9,1
ffc0a1fc: 40 9e ff 5c bne+ cr7,ffc0a158 <rtems_aio_enqueue+0xb4>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
ffc0a200: 7f e4 fb 78 mr r4,r31
ffc0a204: 38 63 00 08 addi r3,r3,8
ffc0a208: 48 00 2d 85 bl ffc0cf8c <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
ffc0a20c: 93 bc 00 18 stw r29,24(r28)
pthread_mutex_init (&r_chain->mutex, NULL);
ffc0a210: 38 80 00 00 li r4,0
ffc0a214: 38 7c 00 1c addi r3,r28,28
ffc0a218: 48 00 0a 39 bl ffc0ac50 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
ffc0a21c: 38 80 00 00 li r4,0
ffc0a220: 38 7c 00 20 addi r3,r28,32
ffc0a224: 48 00 04 99 bl ffc0a6bc <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
ffc0a228: 3c a0 ff c1 lis r5,-63
ffc0a22c: 38 61 00 28 addi r3,r1,40
ffc0a230: 38 9e 00 08 addi r4,r30,8
ffc0a234: 38 a5 99 ac addi r5,r5,-26196
ffc0a238: 7f 86 e3 78 mr r6,r28
ffc0a23c: 48 00 0e 79 bl ffc0b0b4 <pthread_create>
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
ffc0a240: 7c 7f 1b 79 mr. r31,r3
ffc0a244: 40 82 00 80 bne- ffc0a2c4 <rtems_aio_enqueue+0x220> <== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
ffc0a248: 81 3e 00 64 lwz r9,100(r30)
ffc0a24c: 39 29 00 01 addi r9,r9,1
ffc0a250: 91 3e 00 64 stw r9,100(r30)
ffc0a254: 4b ff ff 2c b ffc0a180 <rtems_aio_enqueue+0xdc>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
ffc0a258: 81 3f 00 14 lwz r9,20(r31)
ffc0a25c: 38 7b 00 0c addi r3,r27,12
ffc0a260: 38 a0 00 01 li r5,1
ffc0a264: 80 89 00 00 lwz r4,0(r9)
ffc0a268: 4b ff fb dd bl ffc09e44 <rtems_aio_search_fd>
ffc0a26c: 7f e4 fb 78 mr r4,r31
if (r_chain->new_fd == 1) {
ffc0a270: 81 23 00 18 lwz r9,24(r3)
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
ffc0a274: 7c 7b 1b 78 mr r27,r3
ffc0a278: 38 63 00 08 addi r3,r3,8
if (r_chain->new_fd == 1) {
ffc0a27c: 2f 89 00 01 cmpwi cr7,r9,1
ffc0a280: 41 9e 00 20 beq- cr7,ffc0a2a0 <rtems_aio_enqueue+0x1fc>
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);
ffc0a284: 4b ff fa 1d bl ffc09ca0 <rtems_aio_insert_prio>
if (aio_request_queue.idle_threads > 0)
ffc0a288: 81 3e 00 68 lwz r9,104(r30)
ffc0a28c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0a290: 40 bd fe f0 ble- cr7,ffc0a180 <rtems_aio_enqueue+0xdc> <== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
ffc0a294: 38 7e 00 04 addi r3,r30,4 <== NOT EXECUTED
ffc0a298: 48 00 05 15 bl ffc0a7ac <pthread_cond_signal> <== NOT EXECUTED
ffc0a29c: 4b ff fe e4 b ffc0a180 <rtems_aio_enqueue+0xdc> <== NOT EXECUTED
ffc0a2a0: 48 00 2c ed bl ffc0cf8c <_Chain_Insert>
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;
ffc0a2a4: 93 9b 00 18 stw r28,24(r27)
pthread_mutex_init (&r_chain->mutex, NULL);
ffc0a2a8: 38 7b 00 1c addi r3,r27,28
ffc0a2ac: 38 80 00 00 li r4,0
ffc0a2b0: 48 00 09 a1 bl ffc0ac50 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
ffc0a2b4: 38 7b 00 20 addi r3,r27,32
ffc0a2b8: 38 80 00 00 li r4,0
ffc0a2bc: 48 00 04 01 bl ffc0a6bc <pthread_cond_init>
ffc0a2c0: 4b ff ff c8 b ffc0a288 <rtems_aio_enqueue+0x1e4>
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);
ffc0a2c4: 7f c3 f3 78 mr r3,r30 <== NOT EXECUTED
ffc0a2c8: 48 00 0b c9 bl ffc0ae90 <pthread_mutex_unlock> <== NOT EXECUTED
ffc0a2cc: 7f fd fb 78 mr r29,r31 <== NOT EXECUTED
ffc0a2d0: 4b ff fe b8 b ffc0a188 <rtems_aio_enqueue+0xe4> <== NOT EXECUTED
ffc099ac <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099ac: 94 21 ff 98 stwu r1,-104(r1)
ffc099b0: 7c 08 02 a6 mflr r0
ffc099b4: 93 21 00 4c stw r25,76(r1)
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);
ffc099b8: 3f 20 00 00 lis r25,0
ffc099bc: 3b 39 2b b8 addi r25,r25,11192
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099c0: 90 01 00 6c stw r0,108(r1)
ffc099c4: 93 c1 00 60 stw r30,96(r1)
ffc099c8: 93 e1 00 64 stw r31,100(r1)
ffc099cc: 92 a1 00 3c stw r21,60(r1)
--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,
ffc099d0: 3a b9 00 04 addi r21,r25,4
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099d4: 92 c1 00 40 stw r22,64(r1)
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)) {
ffc099d8: 3a d9 00 58 addi r22,r25,88
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099dc: 92 e1 00 44 stw r23,68(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 &&
ffc099e0: 3a f9 00 4c addi r23,r25,76
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099e4: 93 01 00 48 stw r24,72(r1)
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
ffc099e8: 3b 00 ff ff li r24,-1
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099ec: 93 41 00 50 stw r26,80(r1)
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);
ffc099f0: 7f 3a cb 78 mr r26,r25
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099f4: 93 61 00 54 stw r27,84(r1)
if (result == -1) {
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
req->aiocbp->error_code = 0;
ffc099f8: 3b 60 00 00 li r27,0
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
ffc099fc: 93 81 00 58 stw r28,88(r1)
ffc09a00: 3b 83 00 1c addi r28,r3,28
ffc09a04: 93 a1 00 5c stw r29,92(r1)
ffc09a08: 7c 7d 1b 78 mr r29,r3
/* 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);
ffc09a0c: 7f 83 e3 78 mr r3,r28
ffc09a10: 48 00 13 d1 bl ffc0ade0 <pthread_mutex_lock>
if (result != 0)
ffc09a14: 7c 7e 1b 79 mr. r30,r3
ffc09a18: 40 82 00 8c bne- ffc09aa4 <rtems_aio_handle+0xf8> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc09a1c: 83 fd 00 08 lwz r31,8(r29)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc09a20: 39 3d 00 0c addi r9,r29,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)) {
ffc09a24: 7f 9f 48 00 cmpw cr7,r31,r9
ffc09a28: 41 9e 01 14 beq- cr7,ffc09b3c <rtems_aio_handle+0x190>
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);
ffc09a2c: 48 00 1e d9 bl ffc0b904 <pthread_self>
ffc09a30: 38 81 00 2c addi r4,r1,44
ffc09a34: 38 a1 00 08 addi r5,r1,8
ffc09a38: 48 00 19 8d bl ffc0b3c4 <pthread_getschedparam>
param.sched_priority = req->priority;
ffc09a3c: 81 3f 00 0c lwz r9,12(r31)
ffc09a40: 91 21 00 08 stw r9,8(r1)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
ffc09a44: 48 00 1e c1 bl ffc0b904 <pthread_self>
ffc09a48: 38 a1 00 08 addi r5,r1,8
ffc09a4c: 80 9f 00 08 lwz r4,8(r31)
ffc09a50: 48 00 1e c5 bl ffc0b914 <pthread_setschedparam>
ffc09a54: 7f e3 fb 78 mr r3,r31
ffc09a58: 48 00 34 cd bl ffc0cf24 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
ffc09a5c: 7f 83 e3 78 mr r3,r28
ffc09a60: 48 00 14 31 bl ffc0ae90 <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
ffc09a64: 83 df 00 14 lwz r30,20(r31)
ffc09a68: 81 3e 00 30 lwz r9,48(r30)
ffc09a6c: 2f 89 00 02 cmpwi cr7,r9,2
ffc09a70: 41 9e 00 b0 beq- cr7,ffc09b20 <rtems_aio_handle+0x174>
ffc09a74: 2f 89 00 03 cmpwi cr7,r9,3
ffc09a78: 41 9e 00 9c beq- cr7,ffc09b14 <rtems_aio_handle+0x168> <== NEVER TAKEN
ffc09a7c: 2f 89 00 01 cmpwi cr7,r9,1
ffc09a80: 41 9e 00 64 beq- cr7,ffc09ae4 <rtems_aio_handle+0x138> <== ALWAYS TAKEN
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
ffc09a84: 93 1e 00 38 stw r24,56(r30) <== NOT EXECUTED
req->aiocbp->error_code = errno;
ffc09a88: 48 00 be 29 bl ffc158b0 <__errno> <== NOT EXECUTED
ffc09a8c: 81 23 00 00 lwz r9,0(r3) <== 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);
ffc09a90: 7f 83 e3 78 mr r3,r28 <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
ffc09a94: 91 3e 00 34 stw r9,52(r30) <== 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);
ffc09a98: 48 00 13 49 bl ffc0ade0 <pthread_mutex_lock> <== NOT EXECUTED
if (result != 0)
ffc09a9c: 7c 7e 1b 79 mr. r30,r3 <== NOT EXECUTED
ffc09aa0: 41 82 ff 7c beq+ ffc09a1c <rtems_aio_handle+0x70> <== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
ffc09aa4: 80 01 00 6c lwz r0,108(r1)
ffc09aa8: 38 60 00 00 li r3,0
ffc09aac: 82 a1 00 3c lwz r21,60(r1)
ffc09ab0: 7c 08 03 a6 mtlr r0
ffc09ab4: 82 c1 00 40 lwz r22,64(r1)
ffc09ab8: 82 e1 00 44 lwz r23,68(r1)
ffc09abc: 83 01 00 48 lwz r24,72(r1)
ffc09ac0: 83 21 00 4c lwz r25,76(r1)
ffc09ac4: 83 41 00 50 lwz r26,80(r1)
ffc09ac8: 83 61 00 54 lwz r27,84(r1)
ffc09acc: 83 81 00 58 lwz r28,88(r1)
ffc09ad0: 83 a1 00 5c lwz r29,92(r1)
ffc09ad4: 83 c1 00 60 lwz r30,96(r1)
ffc09ad8: 83 e1 00 64 lwz r31,100(r1)
ffc09adc: 38 21 00 68 addi r1,r1,104
ffc09ae0: 4e 80 00 20 blr
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,
ffc09ae4: 80 7e 00 00 lwz r3,0(r30)
ffc09ae8: 80 9e 00 10 lwz r4,16(r30)
ffc09aec: 80 be 00 14 lwz r5,20(r30)
ffc09af0: 80 fe 00 08 lwz r7,8(r30)
ffc09af4: 81 1e 00 0c lwz r8,12(r30)
ffc09af8: 48 00 cc d5 bl ffc167cc <pread>
break;
default:
result = -1;
}
if (result == -1) {
ffc09afc: 2f 83 ff ff cmpwi cr7,r3,-1
ffc09b00: 41 9e 01 80 beq- cr7,ffc09c80 <rtems_aio_handle+0x2d4> <== NEVER TAKEN
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
ffc09b04: 81 3f 00 14 lwz r9,20(r31)
ffc09b08: 90 69 00 38 stw r3,56(r9)
req->aiocbp->error_code = 0;
ffc09b0c: 93 69 00 34 stw r27,52(r9)
ffc09b10: 4b ff fe fc b ffc09a0c <rtems_aio_handle+0x60>
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
ffc09b14: 80 7e 00 00 lwz r3,0(r30) <== NOT EXECUTED
ffc09b18: 48 00 7f 65 bl ffc11a7c <fsync> <== NOT EXECUTED
break;
ffc09b1c: 4b ff ff e0 b ffc09afc <rtems_aio_handle+0x150> <== NOT EXECUTED
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
ffc09b20: 80 7e 00 00 lwz r3,0(r30)
ffc09b24: 80 9e 00 10 lwz r4,16(r30)
ffc09b28: 80 be 00 14 lwz r5,20(r30)
ffc09b2c: 80 fe 00 08 lwz r7,8(r30)
ffc09b30: 81 1e 00 0c lwz r8,12(r30)
ffc09b34: 48 00 cd d5 bl ffc16908 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
ffc09b38: 4b ff ff c4 b ffc09afc <rtems_aio_handle+0x150>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
ffc09b3c: 7f 83 e3 78 mr r3,r28
ffc09b40: 48 00 13 51 bl ffc0ae90 <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
ffc09b44: 7f 43 d3 78 mr r3,r26
ffc09b48: 48 00 12 99 bl ffc0ade0 <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
ffc09b4c: 81 3d 00 08 lwz r9,8(r29)
ffc09b50: 7f 9f 48 00 cmpw cr7,r31,r9
ffc09b54: 41 9e 00 10 beq- cr7,ffc09b64 <rtems_aio_handle+0x1b8> <== 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);
ffc09b58: 7f 43 d3 78 mr r3,r26
ffc09b5c: 48 00 13 35 bl ffc0ae90 <pthread_mutex_unlock>
ffc09b60: 4b ff fe ac b ffc09a0c <rtems_aio_handle+0x60>
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
ffc09b64: 38 81 00 24 addi r4,r1,36
ffc09b68: 38 60 00 01 li r3,1
ffc09b6c: 48 00 08 f9 bl ffc0a464 <clock_gettime>
timeout.tv_sec += 3;
ffc09b70: 81 21 00 24 lwz r9,36(r1)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
ffc09b74: 3b fd 00 20 addi r31,r29,32
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
ffc09b78: 93 c1 00 28 stw r30,40(r1)
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
ffc09b7c: 39 29 00 03 addi r9,r9,3
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
ffc09b80: 7f e3 fb 78 mr r3,r31
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
ffc09b84: 91 21 00 24 stw r9,36(r1)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
ffc09b88: 7f 44 d3 78 mr r4,r26
ffc09b8c: 38 a1 00 24 addi r5,r1,36
ffc09b90: 48 00 0c d5 bl ffc0a864 <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) {
ffc09b94: 2f 83 00 74 cmpwi cr7,r3,116
ffc09b98: 40 9e ff c0 bne+ cr7,ffc09b58 <rtems_aio_handle+0x1ac> <== NEVER TAKEN
ffc09b9c: 7f a3 eb 78 mr r3,r29
ffc09ba0: 48 00 33 85 bl ffc0cf24 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
ffc09ba4: 7f 83 e3 78 mr r3,r28
ffc09ba8: 48 00 0e 91 bl ffc0aa38 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
ffc09bac: 7f e3 fb 78 mr r3,r31
ffc09bb0: 48 00 09 cd bl ffc0a57c <pthread_cond_destroy>
free (r_chain);
ffc09bb4: 7f a3 eb 78 mr r3,r29
ffc09bb8: 4b ff b2 8d bl ffc04e44 <free>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc09bbc: 83 ba 00 54 lwz r29,84(r26)
/* 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)) {
ffc09bc0: 7f 9d b0 00 cmpw cr7,r29,r22
ffc09bc4: 41 9e 00 68 beq- cr7,ffc09c2c <rtems_aio_handle+0x280>
}
}
/* 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;
ffc09bc8: 81 59 00 68 lwz r10,104(r25)
ffc09bcc: 7f a3 eb 78 mr r3,r29
++aio_request_queue.active_threads;
ffc09bd0: 81 39 00 64 lwz r9,100(r25)
}
}
/* 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;
ffc09bd4: 39 4a ff ff addi r10,r10,-1
++aio_request_queue.active_threads;
ffc09bd8: 39 29 00 01 addi r9,r9,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;
ffc09bdc: 91 59 00 68 stw r10,104(r25)
++aio_request_queue.active_threads;
ffc09be0: 91 39 00 64 stw r9,100(r25)
ffc09be4: 48 00 33 41 bl ffc0cf24 <_Chain_Extract>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc09be8: 81 39 00 48 lwz r9,72(r25)
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 &&
ffc09bec: 81 1d 00 14 lwz r8,20(r29)
ffc09bf0: 81 49 00 14 lwz r10,20(r9)
ffc09bf4: 7f 88 50 00 cmpw cr7,r8,r10
ffc09bf8: 40 9d 00 20 ble- cr7,ffc09c18 <rtems_aio_handle+0x26c> <== NEVER TAKEN
ffc09bfc: 7f 89 b8 00 cmpw cr7,r9,r23
ffc09c00: 41 9e 00 18 beq- cr7,ffc09c18 <rtems_aio_handle+0x26c> <== NEVER TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
ffc09c04: 81 29 00 00 lwz r9,0(r9)
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 &&
ffc09c08: 81 49 00 14 lwz r10,20(r9)
ffc09c0c: 7f 89 b8 00 cmpw cr7,r9,r23
ffc09c10: 7f 0a 40 00 cmpw cr6,r10,r8
ffc09c14: 41 98 ff ec blt+ cr6,ffc09c00 <rtems_aio_handle+0x254>
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
ffc09c18: 80 69 00 04 lwz r3,4(r9)
ffc09c1c: 7f a4 eb 78 mr r4,r29
ffc09c20: 3b 9d 00 1c addi r28,r29,28
ffc09c24: 48 00 33 69 bl ffc0cf8c <_Chain_Insert>
ffc09c28: 4b ff ff 30 b ffc09b58 <rtems_aio_handle+0x1ac>
/* 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;
ffc09c2c: 81 5a 00 68 lwz r10,104(r26)
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
ffc09c30: 38 81 00 24 addi r4,r1,36
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
ffc09c34: 81 3a 00 64 lwz r9,100(r26)
clock_gettime (CLOCK_REALTIME, &timeout);
ffc09c38: 38 60 00 01 li 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;
ffc09c3c: 39 4a 00 01 addi r10,r10,1
--aio_request_queue.active_threads;
ffc09c40: 39 29 ff ff addi r9,r9,-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;
ffc09c44: 91 5a 00 68 stw r10,104(r26)
--aio_request_queue.active_threads;
ffc09c48: 91 3a 00 64 stw r9,100(r26)
clock_gettime (CLOCK_REALTIME, &timeout);
ffc09c4c: 48 00 08 19 bl ffc0a464 <clock_gettime>
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
ffc09c50: 7e a3 ab 78 mr r3,r21
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;
ffc09c54: 81 21 00 24 lwz r9,36(r1)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
ffc09c58: 7f 44 d3 78 mr r4,r26
ffc09c5c: 38 a1 00 24 addi r5,r1,36
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
ffc09c60: 93 c1 00 28 stw r30,40(r1)
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;
ffc09c64: 39 29 00 03 addi r9,r9,3
ffc09c68: 91 21 00 24 stw r9,36(r1)
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
ffc09c6c: 48 00 0b f9 bl ffc0a864 <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) {
ffc09c70: 2f 83 00 74 cmpwi cr7,r3,116
ffc09c74: 41 9e 00 14 beq- cr7,ffc09c88 <rtems_aio_handle+0x2dc> <== ALWAYS TAKEN
ffc09c78: 83 ba 00 54 lwz r29,84(r26) <== NOT EXECUTED
ffc09c7c: 4b ff ff 4c b ffc09bc8 <rtems_aio_handle+0x21c> <== NOT EXECUTED
ffc09c80: 83 df 00 14 lwz r30,20(r31) <== NOT EXECUTED
ffc09c84: 4b ff fe 00 b ffc09a84 <rtems_aio_handle+0xd8> <== NOT EXECUTED
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
ffc09c88: 81 3a 00 68 lwz r9,104(r26)
pthread_mutex_unlock (&aio_request_queue.mutex);
ffc09c8c: 7f 43 d3 78 mr r3,r26
/* 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;
ffc09c90: 39 29 ff ff addi r9,r9,-1
ffc09c94: 91 3a 00 68 stw r9,104(r26)
pthread_mutex_unlock (&aio_request_queue.mutex);
ffc09c98: 48 00 11 f9 bl ffc0ae90 <pthread_mutex_unlock>
ffc09c9c: 4b ff fe 08 b ffc09aa4 <rtems_aio_handle+0xf8>
ffc09cf8 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
ffc09cf8: 94 21 ff e8 stwu r1,-24(r1)
ffc09cfc: 7c 08 02 a6 mflr r0
ffc09d00: 93 c1 00 10 stw r30,16(r1)
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
ffc09d04: 3f c0 00 00 lis r30,0
ffc09d08: 3b de 2b c0 addi r30,r30,11200
ffc09d0c: 7f c3 f3 78 mr r3,r30
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
ffc09d10: 93 a1 00 0c stw r29,12(r1)
ffc09d14: 90 01 00 1c stw r0,28(r1)
ffc09d18: 93 e1 00 14 stw r31,20(r1)
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
ffc09d1c: 48 00 13 25 bl ffc0b040 <pthread_attr_init>
if (result != 0)
ffc09d20: 7c 7d 1b 79 mr. r29,r3
ffc09d24: 41 82 00 24 beq- ffc09d48 <rtems_aio_init+0x50> <== ALWAYS TAKEN
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
ffc09d28: 80 01 00 1c lwz r0,28(r1) <== NOT EXECUTED
ffc09d2c: 7f a3 eb 78 mr r3,r29 <== NOT EXECUTED
ffc09d30: 83 c1 00 10 lwz r30,16(r1) <== NOT EXECUTED
ffc09d34: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc09d38: 83 a1 00 0c lwz r29,12(r1) <== NOT EXECUTED
ffc09d3c: 83 e1 00 14 lwz r31,20(r1) <== NOT EXECUTED
ffc09d40: 38 21 00 18 addi r1,r1,24 <== NOT EXECUTED
ffc09d44: 4e 80 00 20 blr <== NOT EXECUTED
result = pthread_attr_init (&aio_request_queue.attr);
if (result != 0)
return result;
result =
ffc09d48: 7f c3 f3 78 mr r3,r30
ffc09d4c: 38 80 00 00 li r4,0
ffc09d50: 48 00 13 31 bl ffc0b080 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
ffc09d54: 2f 83 00 00 cmpwi cr7,r3,0
ffc09d58: 40 9e 00 94 bne- cr7,ffc09dec <rtems_aio_init+0xf4> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
ffc09d5c: 3f e0 00 00 lis r31,0
ffc09d60: 3b ff 2b b8 addi r31,r31,11192
ffc09d64: 7f e3 fb 78 mr r3,r31
ffc09d68: 38 80 00 00 li r4,0
ffc09d6c: 48 00 0e e5 bl ffc0ac50 <pthread_mutex_init>
if (result != 0)
ffc09d70: 2f 83 00 00 cmpwi cr7,r3,0
ffc09d74: 40 9e 00 9c bne- cr7,ffc09e10 <rtems_aio_init+0x118> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
ffc09d78: 3c 60 00 00 lis r3,0
ffc09d7c: 38 63 2b bc addi r3,r3,11196
ffc09d80: 38 80 00 00 li r4,0
ffc09d84: 48 00 09 39 bl ffc0a6bc <pthread_cond_init>
if (result != 0) {
ffc09d88: 7c 7d 1b 79 mr. r29,r3
ffc09d8c: 40 82 00 a4 bne- ffc09e30 <rtems_aio_init+0x138> <== NEVER TAKEN
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
ffc09d90: 80 01 00 1c lwz r0,28(r1)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
ffc09d94: 39 20 00 00 li r9,0
ffc09d98: 91 3f 00 4c stw r9,76(r31)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc09d9c: 38 df 00 4c addi r6,r31,76
ffc09da0: 7c 08 03 a6 mtlr r0
head->previous = NULL;
tail->previous = head;
ffc09da4: 38 ff 00 48 addi r7,r31,72
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
ffc09da8: 91 3f 00 58 stw r9,88(r31)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc09dac: 39 1f 00 58 addi r8,r31,88
head->previous = NULL;
tail->previous = head;
ffc09db0: 39 5f 00 54 addi r10,r31,84
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
ffc09db4: 91 3f 00 64 stw r9,100(r31)
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
ffc09db8: 7f a3 eb 78 mr r3,r29
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;
ffc09dbc: 91 3f 00 68 stw r9,104(r31)
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
ffc09dc0: 61 29 b0 0b ori r9,r9,45067
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc09dc4: 90 df 00 48 stw r6,72(r31)
head->previous = NULL;
tail->previous = head;
ffc09dc8: 90 ff 00 50 stw r7,80(r31)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc09dcc: 91 1f 00 54 stw r8,84(r31)
head->previous = NULL;
tail->previous = head;
ffc09dd0: 91 5f 00 5c stw r10,92(r31)
ffc09dd4: 91 3f 00 60 stw r9,96(r31)
return result;
}
ffc09dd8: 83 a1 00 0c lwz r29,12(r1)
ffc09ddc: 83 c1 00 10 lwz r30,16(r1)
ffc09de0: 83 e1 00 14 lwz r31,20(r1)
ffc09de4: 38 21 00 18 addi r1,r1,24
ffc09de8: 4e 80 00 20 blr
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
ffc09dec: 3f e0 00 00 lis r31,0 <== NOT EXECUTED
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
ffc09df0: 7f c3 f3 78 mr r3,r30 <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
ffc09df4: 3b ff 2b b8 addi r31,r31,11192 <== NOT EXECUTED
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
ffc09df8: 48 00 12 19 bl ffc0b010 <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
ffc09dfc: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED
ffc09e00: 38 80 00 00 li r4,0 <== NOT EXECUTED
ffc09e04: 48 00 0e 4d bl ffc0ac50 <pthread_mutex_init> <== NOT EXECUTED
if (result != 0)
ffc09e08: 2f 83 00 00 cmpwi cr7,r3,0 <== NOT EXECUTED
ffc09e0c: 41 9e ff 6c beq+ cr7,ffc09d78 <rtems_aio_init+0x80> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
ffc09e10: 7f c3 f3 78 mr r3,r30 <== NOT EXECUTED
ffc09e14: 48 00 11 fd bl ffc0b010 <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
ffc09e18: 3c 60 00 00 lis r3,0 <== NOT EXECUTED
ffc09e1c: 38 63 2b bc addi r3,r3,11196 <== NOT EXECUTED
ffc09e20: 38 80 00 00 li r4,0 <== NOT EXECUTED
ffc09e24: 48 00 08 99 bl ffc0a6bc <pthread_cond_init> <== NOT EXECUTED
if (result != 0) {
ffc09e28: 7c 7d 1b 79 mr. r29,r3 <== NOT EXECUTED
ffc09e2c: 41 82 ff 64 beq+ ffc09d90 <rtems_aio_init+0x98> <== NOT EXECUTED
pthread_mutex_destroy (&aio_request_queue.mutex);
ffc09e30: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED
ffc09e34: 48 00 0c 05 bl ffc0aa38 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
ffc09e38: 7f c3 f3 78 mr r3,r30 <== NOT EXECUTED
ffc09e3c: 48 00 11 d5 bl ffc0b010 <pthread_attr_destroy> <== NOT EXECUTED
ffc09e40: 4b ff ff 50 b ffc09d90 <rtems_aio_init+0x98> <== NOT EXECUTED
ffc09ca0 <rtems_aio_insert_prio>:
ffc09ca0: 81 23 00 00 lwz r9,0(r3)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc09ca4: 39 03 00 04 addi r8,r3,4
* NONE
*/
static void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
ffc09ca8: 7c 86 23 78 mr r6,r4
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
ffc09cac: 7f 89 40 00 cmpw cr7,r9,r8
ffc09cb0: 41 9e 00 44 beq- cr7,ffc09cf4 <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 &&
ffc09cb4: 80 e4 00 14 lwz r7,20(r4)
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;
ffc09cb8: 81 49 00 14 lwz r10,20(r9)
while (req->aiocbp->aio_reqprio > prio &&
ffc09cbc: 80 e7 00 18 lwz r7,24(r7)
ffc09cc0: 81 4a 00 18 lwz r10,24(r10)
ffc09cc4: 7f 8a 38 00 cmpw cr7,r10,r7
ffc09cc8: 41 bc 00 0c blt+ cr7,ffc09cd4 <rtems_aio_insert_prio+0x34><== NEVER TAKEN
ffc09ccc: 48 00 00 20 b ffc09cec <rtems_aio_insert_prio+0x4c>
ffc09cd0: 41 9e 00 1c beq- cr7,ffc09cec <rtems_aio_insert_prio+0x4c><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
ffc09cd4: 81 29 00 00 lwz r9,0(r9) <== 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;
ffc09cd8: 81 49 00 14 lwz r10,20(r9) <== 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 &&
ffc09cdc: 7f 88 48 00 cmpw cr7,r8,r9 <== NOT EXECUTED
ffc09ce0: 81 4a 00 18 lwz r10,24(r10) <== NOT EXECUTED
ffc09ce4: 7f 0a 38 00 cmpw cr6,r10,r7 <== NOT EXECUTED
ffc09ce8: 41 98 ff e8 blt+ cr6,ffc09cd0 <rtems_aio_insert_prio+0x30><== NOT EXECUTED
ffc09cec: 80 69 00 04 lwz r3,4(r9)
ffc09cf0: 7c c4 33 78 mr r4,r6
ffc09cf4: 48 00 32 98 b ffc0cf8c <_Chain_Insert>
ffc09f74 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
ffc09f74: 94 21 ff e0 stwu r1,-32(r1)
ffc09f78: 7c 08 02 a6 mflr r0
ffc09f7c: 90 01 00 24 stw r0,36(r1)
ffc09f80: 93 e1 00 1c stw r31,28(r1)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc09f84: 83 e3 00 08 lwz r31,8(r3)
ffc09f88: 93 a1 00 14 stw r29,20(r1)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
const Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Immutable_tail( the_chain ));
ffc09f8c: 3b a3 00 0c addi r29,r3,12
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
ffc09f90: 7f 9f e8 00 cmpw cr7,r31,r29
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
ffc09f94: 93 61 00 0c stw r27,12(r1)
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;
ffc09f98: 3b 60 00 8c li r27,140
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
ffc09f9c: 93 81 00 10 stw r28,16(r1)
{
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;
ffc09fa0: 3b 80 ff ff li r28,-1
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
ffc09fa4: 93 c1 00 18 stw r30,24(r1)
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
ffc09fa8: 41 9e 00 30 beq- cr7,ffc09fd8 <rtems_aio_remove_fd+0x64><== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
ffc09fac: 7f e3 fb 78 mr r3,r31
ffc09fb0: 48 00 2f 75 bl ffc0cf24 <_Chain_Extract>
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
ffc09fb4: 81 3f 00 14 lwz r9,20(r31)
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
ffc09fb8: 83 df 00 00 lwz r30,0(r31)
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);
ffc09fbc: 7f e3 fb 78 mr r3,r31
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;
ffc09fc0: 93 69 00 34 stw r27,52(r9)
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
ffc09fc4: 7f df f3 78 mr r31,r30
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
ffc09fc8: 93 89 00 38 stw r28,56(r9)
free (req);
ffc09fcc: 4b ff ae 79 bl ffc04e44 <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))
ffc09fd0: 7f 9e e8 00 cmpw cr7,r30,r29
ffc09fd4: 40 9e ff d8 bne+ cr7,ffc09fac <rtems_aio_remove_fd+0x38>
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
free (req);
}
}
ffc09fd8: 80 01 00 24 lwz r0,36(r1)
ffc09fdc: 83 61 00 0c lwz r27,12(r1)
ffc09fe0: 7c 08 03 a6 mtlr r0
ffc09fe4: 83 81 00 10 lwz r28,16(r1)
ffc09fe8: 83 a1 00 14 lwz r29,20(r1)
ffc09fec: 83 c1 00 18 lwz r30,24(r1)
ffc09ff0: 83 e1 00 1c lwz r31,28(r1)
ffc09ff4: 38 21 00 20 addi r1,r1,32
ffc09ff8: 4e 80 00 20 blr
ffc09ffc <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)
{
ffc09ffc: 94 21 ff f0 stwu r1,-16(r1)
ffc0a000: 7c 08 02 a6 mflr r0
ffc0a004: 90 01 00 14 stw r0,20(r1)
ffc0a008: 93 e1 00 0c stw r31,12(r1)
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
ffc0a00c: 83 e3 00 00 lwz r31,0(r3)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
ffc0a010: 38 63 00 04 addi r3,r3,4
if (rtems_chain_is_empty (chain))
ffc0a014: 7f 9f 18 00 cmpw cr7,r31,r3
ffc0a018: 40 be 00 14 bne+ cr7,ffc0a02c <rtems_aio_remove_req+0x30>
ffc0a01c: 48 00 00 70 b ffc0a08c <rtems_aio_remove_req+0x90>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
ffc0a020: 83 ff 00 00 lwz r31,0(r31) <== 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) {
ffc0a024: 7f 83 f8 00 cmpw cr7,r3,r31 <== NOT EXECUTED
ffc0a028: 41 9e 00 4c beq- cr7,ffc0a074 <rtems_aio_remove_req+0x78><== NOT EXECUTED
ffc0a02c: 81 3f 00 14 lwz r9,20(r31)
ffc0a030: 7f 89 20 00 cmpw cr7,r9,r4
ffc0a034: 40 9e ff ec bne+ cr7,ffc0a020 <rtems_aio_remove_req+0x24><== NEVER TAKEN
ffc0a038: 7f e3 fb 78 mr r3,r31
ffc0a03c: 48 00 2e e9 bl ffc0cf24 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
ffc0a040: 81 3f 00 14 lwz r9,20(r31)
ffc0a044: 39 40 00 8c li r10,140
ffc0a048: 91 49 00 34 stw r10,52(r9)
current->aiocbp->return_value = -1;
ffc0a04c: 39 40 ff ff li r10,-1
free (current);
ffc0a050: 7f e3 fb 78 mr r3,r31
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
current->aiocbp->return_value = -1;
ffc0a054: 91 49 00 38 stw r10,56(r9)
free (current);
ffc0a058: 4b ff ad ed bl ffc04e44 <free>
}
return AIO_CANCELED;
}
ffc0a05c: 80 01 00 14 lwz r0,20(r1)
ffc0a060: 83 e1 00 0c lwz r31,12(r1)
current->aiocbp->error_code = ECANCELED;
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
ffc0a064: 38 60 00 00 li r3,0
}
ffc0a068: 7c 08 03 a6 mtlr r0
ffc0a06c: 38 21 00 10 addi r1,r1,16
ffc0a070: 4e 80 00 20 blr
ffc0a074: 80 01 00 14 lwz r0,20(r1) <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
ffc0a078: 38 60 00 01 li r3,1 <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
ffc0a07c: 83 e1 00 0c lwz r31,12(r1) <== NOT EXECUTED
ffc0a080: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0a084: 38 21 00 10 addi r1,r1,16 <== NOT EXECUTED
ffc0a088: 4e 80 00 20 blr <== NOT EXECUTED
ffc0a08c: 80 01 00 14 lwz r0,20(r1)
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
ffc0a090: 38 60 00 02 li r3,2
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
ffc0a094: 83 e1 00 0c lwz r31,12(r1)
ffc0a098: 7c 08 03 a6 mtlr r0
ffc0a09c: 38 21 00 10 addi r1,r1,16
ffc0a0a0: 4e 80 00 20 blr
ffc0a588 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
ffc0a588: 94 21 ff d0 stwu r1,-48(r1)
ffc0a58c: 7c 08 02 a6 mflr r0
ffc0a590: 93 e1 00 2c stw r31,44(r1)
ffc0a594: 90 01 00 34 stw r0,52(r1)
ffc0a598: 93 61 00 1c stw r27,28(r1)
ffc0a59c: 7c db 33 78 mr r27,r6
ffc0a5a0: 93 81 00 20 stw r28,32(r1)
ffc0a5a4: 7c 7c 1b 78 mr r28,r3
ffc0a5a8: 93 a1 00 24 stw r29,36(r1)
ffc0a5ac: 7c 9d 23 78 mr r29,r4
ffc0a5b0: 93 c1 00 28 stw r30,40(r1)
ffc0a5b4: 7c be 2b 78 mr r30,r5
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
ffc0a5b8: 7f 83 e3 78 mr r3,r28
ffc0a5bc: 48 00 07 39 bl ffc0acf4 <_Chain_Get>
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
ffc0a5c0: 38 80 00 00 li r4,0
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
ffc0a5c4: 7c 7f 1b 79 mr. r31,r3
) {
rtems_event_set out;
sc = rtems_event_receive(
ffc0a5c8: 7f c5 f3 78 mr r5,r30
ffc0a5cc: 38 c1 00 08 addi r6,r1,8
ffc0a5d0: 7f a3 eb 78 mr r3,r29
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
ffc0a5d4: 40 82 00 38 bne- ffc0a60c <rtems_chain_get_with_wait+0x84>
) {
rtems_event_set out;
sc = rtems_event_receive(
ffc0a5d8: 4b ff f0 11 bl ffc095e8 <rtems_event_receive>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
ffc0a5dc: 2c 03 00 00 cmpwi r3,0
ffc0a5e0: 41 82 ff d8 beq+ ffc0a5b8 <rtems_chain_get_with_wait+0x30><== NEVER TAKEN
}
*node_ptr = node;
return sc;
}
ffc0a5e4: 80 01 00 34 lwz r0,52(r1)
timeout,
&out
);
}
*node_ptr = node;
ffc0a5e8: 93 fb 00 00 stw r31,0(r27)
return sc;
}
ffc0a5ec: 7c 08 03 a6 mtlr r0
ffc0a5f0: 83 61 00 1c lwz r27,28(r1)
ffc0a5f4: 83 81 00 20 lwz r28,32(r1)
ffc0a5f8: 83 a1 00 24 lwz r29,36(r1)
ffc0a5fc: 83 c1 00 28 lwz r30,40(r1)
ffc0a600: 83 e1 00 2c lwz r31,44(r1)
ffc0a604: 38 21 00 30 addi r1,r1,48
ffc0a608: 4e 80 00 20 blr
ffc0a60c: 80 01 00 34 lwz r0,52(r1)
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
ffc0a610: 38 60 00 00 li r3,0
timeout,
&out
);
}
*node_ptr = node;
ffc0a614: 93 fb 00 00 stw r31,0(r27)
return sc;
}
ffc0a618: 7c 08 03 a6 mtlr r0
ffc0a61c: 83 61 00 1c lwz r27,28(r1)
ffc0a620: 83 81 00 20 lwz r28,32(r1)
ffc0a624: 83 a1 00 24 lwz r29,36(r1)
ffc0a628: 83 c1 00 28 lwz r30,40(r1)
ffc0a62c: 83 e1 00 2c lwz r31,44(r1)
ffc0a630: 38 21 00 30 addi r1,r1,48
ffc0a634: 4e 80 00 20 blr
ffc15320 <rtems_event_system_receive>:
rtems_event_set *event_out
)
{
rtems_status_code sc;
if ( event_out != NULL ) {
ffc15320: 7c ca 33 79 mr. r10,r6
ffc15324: 41 82 00 48 beq- ffc1536c <rtems_event_system_receive+0x4c><== NEVER TAKEN
Thread_Control *executing = _Thread_Executing;
RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ];
Event_Control *event = &api->System_event;
if ( !_Event_sets_Is_empty( event_in ) ) {
ffc15328: 2f 83 00 00 cmpwi cr7,r3,0
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
ffc1532c: 94 21 ff f0 stwu r1,-16(r1)
ffc15330: 7c 08 02 a6 mflr r0
rtems_status_code sc;
if ( event_out != NULL ) {
Thread_Control *executing = _Thread_Executing;
ffc15334: 3d 00 00 00 lis r8,0
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
ffc15338: 93 e1 00 0c stw r31,12(r1)
ffc1533c: 90 01 00 14 stw r0,20(r1)
rtems_status_code sc;
if ( event_out != NULL ) {
Thread_Control *executing = _Thread_Executing;
ffc15340: 83 e8 32 10 lwz r31,12816(r8)
RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ];
ffc15344: 81 1f 01 4c lwz r8,332(r31)
Event_Control *event = &api->System_event;
if ( !_Event_sets_Is_empty( event_in ) ) {
ffc15348: 40 9e 00 2c bne- cr7,ffc15374 <rtems_event_system_receive+0x54><== ALWAYS TAKEN
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
ffc1534c: 80 01 00 14 lwz r0,20(r1) <== NOT EXECUTED
_Thread_Enable_dispatch();
sc = executing->Wait.return_code;
} else {
*event_out = event->pending_events;
sc = RTEMS_SUCCESSFUL;
ffc15350: 38 60 00 00 li r3,0 <== NOT EXECUTED
);
_Thread_Enable_dispatch();
sc = executing->Wait.return_code;
} else {
*event_out = event->pending_events;
ffc15354: 81 28 00 04 lwz r9,4(r8) <== NOT EXECUTED
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
ffc15358: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc1535c: 83 e1 00 0c lwz r31,12(r1) <== NOT EXECUTED
);
_Thread_Enable_dispatch();
sc = executing->Wait.return_code;
} else {
*event_out = event->pending_events;
ffc15360: 91 2a 00 00 stw r9,0(r10) <== NOT EXECUTED
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
ffc15364: 38 21 00 10 addi r1,r1,16 <== NOT EXECUTED
ffc15368: 4e 80 00 20 blr <== NOT EXECUTED
} else {
*event_out = event->pending_events;
sc = RTEMS_SUCCESSFUL;
}
} else {
sc = RTEMS_INVALID_ADDRESS;
ffc1536c: 38 60 00 09 li r3,9 <== NOT EXECUTED
ffc15370: 4e 80 00 20 blr <== NOT EXECUTED
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc15374: 3d 20 00 00 lis r9,0
ffc15378: 81 49 28 20 lwz r10,10272(r9)
++level;
ffc1537c: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc15380: 91 49 28 20 stw r10,10272(r9)
RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ];
Event_Control *event = &api->System_event;
if ( !_Event_sets_Is_empty( event_in ) ) {
_Thread_Disable_dispatch();
_Event_Seize(
ffc15384: 3d 20 00 00 lis r9,0
ffc15388: 7f e7 fb 78 mr r7,r31
ffc1538c: 39 08 00 04 addi r8,r8,4
ffc15390: 39 29 28 54 addi r9,r9,10324
ffc15394: 3d 40 00 04 lis r10,4
ffc15398: 4b ff 54 d9 bl ffc0a870 <_Event_Seize>
executing,
event,
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
ffc1539c: 4b ff 8d 69 bl ffc0e104 <_Thread_Enable_dispatch>
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
ffc153a0: 80 01 00 14 lwz r0,20(r1)
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
sc = executing->Wait.return_code;
ffc153a4: 80 7f 00 34 lwz r3,52(r31)
} else {
sc = RTEMS_INVALID_ADDRESS;
}
return sc;
}
ffc153a8: 7c 08 03 a6 mtlr r0
ffc153ac: 83 e1 00 0c lwz r31,12(r1)
ffc153b0: 38 21 00 10 addi r1,r1,16
ffc153b4: 4e 80 00 20 blr
ffc09ca0 <rtems_event_system_send>:
rtems_status_code rtems_event_system_send(
rtems_id id,
rtems_event_set event_in
)
{
ffc09ca0: 94 21 ff e0 stwu r1,-32(r1)
ffc09ca4: 7c 08 02 a6 mflr r0
ffc09ca8: 93 e1 00 1c stw r31,28(r1)
ffc09cac: 7c 9f 23 78 mr r31,r4
rtems_status_code sc;
Thread_Control *thread;
Objects_Locations location;
RTEMS_API_Control *api;
thread = _Thread_Get( id, &location );
ffc09cb0: 38 81 00 08 addi r4,r1,8
rtems_status_code rtems_event_system_send(
rtems_id id,
rtems_event_set event_in
)
{
ffc09cb4: 90 01 00 24 stw r0,36(r1)
rtems_status_code sc;
Thread_Control *thread;
Objects_Locations location;
RTEMS_API_Control *api;
thread = _Thread_Get( id, &location );
ffc09cb8: 48 00 2e 25 bl ffc0cadc <_Thread_Get>
switch ( location ) {
ffc09cbc: 81 21 00 08 lwz r9,8(r1)
ffc09cc0: 2f 89 00 00 cmpwi cr7,r9,0
ffc09cc4: 40 9e 00 3c bne- cr7,ffc09d00 <rtems_event_system_send+0x60><== NEVER TAKEN
case OBJECTS_LOCAL:
api = thread->API_Extensions[ THREAD_API_RTEMS ];
_Event_Surrender(
ffc09cc8: 80 a3 01 4c lwz r5,332(r3)
ffc09ccc: 3c c0 00 00 lis r6,0
ffc09cd0: 7f e4 fb 78 mr r4,r31
ffc09cd4: 38 a5 00 04 addi r5,r5,4
ffc09cd8: 38 c6 28 9c addi r6,r6,10396
ffc09cdc: 3c e0 00 04 lis r7,4
ffc09ce0: 4b ff f8 4d bl ffc0952c <_Event_Surrender>
event_in,
&api->System_event,
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
ffc09ce4: 48 00 2d dd bl ffc0cac0 <_Thread_Enable_dispatch>
sc = RTEMS_INVALID_ID;
break;
}
return sc;
}
ffc09ce8: 80 01 00 24 lwz r0,36(r1)
ffc09cec: 83 e1 00 1c lwz r31,28(r1)
&api->System_event,
&_System_event_Sync_state,
STATES_WAITING_FOR_SYSTEM_EVENT
);
_Thread_Enable_dispatch();
sc = RTEMS_SUCCESSFUL;
ffc09cf0: 38 60 00 00 li r3,0
sc = RTEMS_INVALID_ID;
break;
}
return sc;
}
ffc09cf4: 7c 08 03 a6 mtlr r0
ffc09cf8: 38 21 00 20 addi r1,r1,32
ffc09cfc: 4e 80 00 20 blr
ffc09d00: 80 01 00 24 lwz r0,36(r1) <== NOT EXECUTED
case OBJECTS_REMOTE:
sc = RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
break;
#endif
default:
sc = RTEMS_INVALID_ID;
ffc09d04: 38 60 00 04 li r3,4 <== NOT EXECUTED
break;
}
return sc;
}
ffc09d08: 83 e1 00 1c lwz r31,28(r1) <== NOT EXECUTED
ffc09d0c: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc09d10: 38 21 00 20 addi r1,r1,32 <== NOT EXECUTED
ffc09d14: 4e 80 00 20 blr <== NOT EXECUTED
ffc0b998 <rtems_io_register_driver>:
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
ffc0b998: 3d 20 00 00 lis r9,0
ffc0b99c: 81 49 32 08 lwz r10,12808(r9)
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;
ffc0b9a0: 3d 20 00 00 lis r9,0
ffc0b9a4: 81 09 28 5c lwz r8,10332(r9)
if ( rtems_interrupt_is_in_progress() )
ffc0b9a8: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0b9ac: 41 9e 00 0c beq- cr7,ffc0b9b8 <rtems_io_register_driver+0x20>
return RTEMS_CALLED_FROM_ISR;
ffc0b9b0: 38 60 00 12 li r3,18
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
ffc0b9b4: 4e 80 00 20 blr
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 )
ffc0b9b8: 2f 85 00 00 cmpwi cr7,r5,0
ffc0b9bc: 41 9e 00 50 beq- cr7,ffc0ba0c <rtems_io_register_driver+0x74>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
if ( driver_table == NULL )
ffc0b9c0: 2f 84 00 00 cmpwi cr7,r4,0
if ( registered_major == NULL )
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
ffc0b9c4: 91 05 00 00 stw r8,0(r5)
if ( driver_table == NULL )
ffc0b9c8: 41 9e 00 44 beq- cr7,ffc0ba0c <rtems_io_register_driver+0x74>
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
)
{
ffc0b9cc: 94 21 ff f0 stwu r1,-16(r1)
ffc0b9d0: 7c 08 02 a6 mflr r0
ffc0b9d4: 90 01 00 14 stw r0,20(r1)
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0b9d8: 81 44 00 00 lwz r10,0(r4)
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
)
{
ffc0b9dc: 93 e1 00 0c stw r31,12(r1)
ffc0b9e0: 7c 7f 1b 78 mr r31,r3
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0b9e4: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0b9e8: 41 9e 00 2c beq- cr7,ffc0ba14 <rtems_io_register_driver+0x7c>
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
ffc0b9ec: 7f 88 f8 40 cmplw cr7,r8,r31
return RTEMS_INVALID_NUMBER;
ffc0b9f0: 38 60 00 0a li r3,10
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
ffc0b9f4: 41 9d 00 34 bgt- cr7,ffc0ba28 <rtems_io_register_driver+0x90>
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
ffc0b9f8: 80 01 00 14 lwz r0,20(r1)
ffc0b9fc: 83 e1 00 0c lwz r31,12(r1)
ffc0ba00: 7c 08 03 a6 mtlr r0
ffc0ba04: 38 21 00 10 addi r1,r1,16
ffc0ba08: 4e 80 00 20 blr
/* Set it to an invalid value */
*registered_major = major_limit;
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
ffc0ba0c: 38 60 00 09 li r3,9
ffc0ba10: 4e 80 00 20 blr
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0ba14: 81 44 00 04 lwz r10,4(r4)
ffc0ba18: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ba1c: 40 9e ff d0 bne+ cr7,ffc0b9ec <rtems_io_register_driver+0x54>
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
ffc0ba20: 38 60 00 09 li r3,9
ffc0ba24: 4b ff ff d4 b ffc0b9f8 <rtems_io_register_driver+0x60>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0ba28: 3d 40 00 00 lis r10,0
ffc0ba2c: 81 0a 28 20 lwz r8,10272(r10)
++level;
ffc0ba30: 39 08 00 01 addi r8,r8,1
_Thread_Dispatch_disable_level = level;
ffc0ba34: 91 0a 28 20 stw r8,10272(r10)
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
ffc0ba38: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0ba3c: 41 9e 00 2c beq- cr7,ffc0ba68 <rtems_io_register_driver+0xd0>
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
ffc0ba40: 3d 00 00 00 lis r8,0
ffc0ba44: 1d 5f 00 18 mulli r10,r31,24
ffc0ba48: 81 28 28 60 lwz r9,10336(r8)
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0ba4c: 7c e9 50 2e lwzx r7,r9,r10
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
ffc0ba50: 7d 29 52 14 add r9,r9,r10
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0ba54: 2f 87 00 00 cmpwi cr7,r7,0
ffc0ba58: 41 9e 00 cc beq- cr7,ffc0bb24 <rtems_io_register_driver+0x18c>
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();
ffc0ba5c: 48 00 26 a9 bl ffc0e104 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
ffc0ba60: 38 60 00 0c li r3,12
ffc0ba64: 4b ff ff 94 b ffc0b9f8 <rtems_io_register_driver+0x60>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
ffc0ba68: 80 e9 28 5c lwz r7,10332(r9)
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
ffc0ba6c: 2f 87 00 00 cmpwi cr7,r7,0
ffc0ba70: 41 9e 00 a4 beq- cr7,ffc0bb14 <rtems_io_register_driver+0x17c><== NEVER TAKEN
ffc0ba74: 3d 00 00 00 lis r8,0
ffc0ba78: 7c e9 03 a6 mtctr r7
ffc0ba7c: 81 28 28 60 lwz r9,10336(r8)
ffc0ba80: 48 00 00 10 b ffc0ba90 <rtems_io_register_driver+0xf8>
ffc0ba84: 3b ff 00 01 addi r31,r31,1
ffc0ba88: 39 29 00 18 addi r9,r9,24
ffc0ba8c: 42 40 00 88 bdz- ffc0bb14 <rtems_io_register_driver+0x17c>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0ba90: 81 49 00 00 lwz r10,0(r9)
ffc0ba94: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ba98: 40 9e ff ec bne+ cr7,ffc0ba84 <rtems_io_register_driver+0xec>
ffc0ba9c: 81 49 00 04 lwz r10,4(r9)
ffc0baa0: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0baa4: 40 9e ff e0 bne+ cr7,ffc0ba84 <rtems_io_register_driver+0xec>
}
/* Assigns invalid value in case of failure */
*major = m;
if ( m != n )
ffc0baa8: 7f 87 f8 00 cmpw cr7,r7,r31
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
ffc0baac: 93 e5 00 00 stw r31,0(r5)
ffc0bab0: 1d 5f 00 18 mulli r10,r31,24
if ( m != n )
ffc0bab4: 41 9e 00 64 beq- cr7,ffc0bb18 <rtems_io_register_driver+0x180><== NEVER TAKEN
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
ffc0bab8: 81 08 28 60 lwz r8,10336(r8)
ffc0babc: 80 64 00 04 lwz r3,4(r4)
ffc0bac0: 80 a4 00 08 lwz r5,8(r4)
ffc0bac4: 7d 28 52 14 add r9,r8,r10
ffc0bac8: 80 e4 00 00 lwz r7,0(r4)
ffc0bacc: 80 c4 00 0c lwz r6,12(r4)
ffc0bad0: 7c e8 51 2e stwx r7,r8,r10
ffc0bad4: 90 69 00 04 stw r3,4(r9)
ffc0bad8: 90 a9 00 08 stw r5,8(r9)
ffc0badc: 90 c9 00 0c stw r6,12(r9)
ffc0bae0: 81 04 00 10 lwz r8,16(r4)
ffc0bae4: 81 44 00 14 lwz r10,20(r4)
ffc0bae8: 91 09 00 10 stw r8,16(r9)
ffc0baec: 91 49 00 14 stw r10,20(r9)
_Thread_Enable_dispatch();
ffc0baf0: 48 00 26 15 bl ffc0e104 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
}
ffc0baf4: 80 01 00 14 lwz r0,20(r1)
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
ffc0baf8: 7f e3 fb 78 mr r3,r31
}
ffc0bafc: 83 e1 00 0c lwz r31,12(r1)
ffc0bb00: 7c 08 03 a6 mtlr r0
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
ffc0bb04: 38 80 00 00 li r4,0
ffc0bb08: 38 a0 00 00 li r5,0
}
ffc0bb0c: 38 21 00 10 addi r1,r1,16
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
ffc0bb10: 48 00 9d 84 b ffc15894 <rtems_io_initialize>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
ffc0bb14: 93 e5 00 00 stw r31,0(r5)
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
ffc0bb18: 48 00 25 ed bl ffc0e104 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
ffc0bb1c: 38 60 00 05 li r3,5
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
ffc0bb20: 4b ff fe d8 b ffc0b9f8 <rtems_io_register_driver+0x60>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
ffc0bb24: 81 29 00 04 lwz r9,4(r9)
ffc0bb28: 2f 89 00 00 cmpwi cr7,r9,0
ffc0bb2c: 40 9e ff 30 bne+ cr7,ffc0ba5c <rtems_io_register_driver+0xc4>
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
ffc0bb30: 93 e5 00 00 stw r31,0(r5)
ffc0bb34: 4b ff ff 84 b ffc0bab8 <rtems_io_register_driver+0x120>
ffc0d020 <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)
{
ffc0d020: 94 21 ff e0 stwu r1,-32(r1)
ffc0d024: 7c 08 02 a6 mflr r0
ffc0d028: 93 a1 00 14 stw r29,20(r1)
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
ffc0d02c: 7c 7d 1b 79 mr. r29,r3
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
{
ffc0d030: 90 01 00 24 stw r0,36(r1)
ffc0d034: 93 61 00 0c stw r27,12(r1)
ffc0d038: 93 81 00 10 stw r28,16(r1)
ffc0d03c: 93 c1 00 18 stw r30,24(r1)
ffc0d040: 93 e1 00 1c stw r31,28(r1)
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
ffc0d044: 41 82 00 68 beq- ffc0d0ac <rtems_iterate_over_all_threads+0x8c><== NEVER TAKEN
ffc0d048: 3f 80 00 00 lis r28,0
ffc0d04c: 3b 9c 30 78 addi r28,r28,12408
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
ffc0d050: 3b 7c 00 0c addi r27,r28,12
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
ffc0d054: 85 3c 00 04 lwzu r9,4(r28)
ffc0d058: 83 c9 00 04 lwz r30,4(r9)
if ( !information )
ffc0d05c: 2f 9e 00 00 cmpwi cr7,r30,0
ffc0d060: 41 9e 00 44 beq- cr7,ffc0d0a4 <rtems_iterate_over_all_threads+0x84>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
ffc0d064: a1 1e 00 10 lhz r8,16(r30)
ffc0d068: 71 09 ff ff andi. r9,r8,65535
ffc0d06c: 41 82 00 38 beq- ffc0d0a4 <rtems_iterate_over_all_threads+0x84>
ffc0d070: 3b e0 00 01 li r31,1
the_thread = (Thread_Control *)information->local_table[ i ];
ffc0d074: 81 3e 00 1c lwz r9,28(r30)
ffc0d078: 57 ea 10 3a rlwinm r10,r31,2,0,29
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
ffc0d07c: 3b ff 00 01 addi r31,r31,1
the_thread = (Thread_Control *)information->local_table[ i ];
ffc0d080: 7c 69 50 2e lwzx r3,r9,r10
if ( !the_thread )
ffc0d084: 2f 83 00 00 cmpwi cr7,r3,0
ffc0d088: 41 9e 00 10 beq- cr7,ffc0d098 <rtems_iterate_over_all_threads+0x78>
continue;
(*routine)(the_thread);
ffc0d08c: 7f a9 03 a6 mtctr r29
ffc0d090: 4e 80 04 21 bctrl
ffc0d094: a1 1e 00 10 lhz r8,16(r30)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
ffc0d098: 55 09 04 3e clrlwi r9,r8,16
ffc0d09c: 7f 89 f8 40 cmplw cr7,r9,r31
ffc0d0a0: 40 9c ff d4 bge+ cr7,ffc0d074 <rtems_iterate_over_all_threads+0x54>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
ffc0d0a4: 7f 9c d8 00 cmpw cr7,r28,r27
ffc0d0a8: 40 9e ff ac bne+ cr7,ffc0d054 <rtems_iterate_over_all_threads+0x34>
(*routine)(the_thread);
}
}
}
ffc0d0ac: 80 01 00 24 lwz r0,36(r1)
ffc0d0b0: 83 61 00 0c lwz r27,12(r1)
ffc0d0b4: 7c 08 03 a6 mtlr r0
ffc0d0b8: 83 81 00 10 lwz r28,16(r1)
ffc0d0bc: 83 a1 00 14 lwz r29,20(r1)
ffc0d0c0: 83 c1 00 18 lwz r30,24(r1)
ffc0d0c4: 83 e1 00 1c lwz r31,28(r1)
ffc0d0c8: 38 21 00 20 addi r1,r1,32
ffc0d0cc: 4e 80 00 20 blr
ffc0b7c8 <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
)
{
ffc0b7c8: 94 21 ff f0 stwu r1,-16(r1)
ffc0b7cc: 7c 08 02 a6 mflr r0
ffc0b7d0: 93 e1 00 0c stw r31,12(r1)
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
ffc0b7d4: 7c bf 2b 79 mr. r31,r5
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
ffc0b7d8: 90 01 00 14 stw r0,20(r1)
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
ffc0b7dc: 41 82 00 90 beq- ffc0b86c <rtems_object_get_class_information+0xa4>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
ffc0b7e0: 54 84 04 3e clrlwi r4,r4,16
ffc0b7e4: 48 00 23 f5 bl ffc0dbd8 <_Objects_Get_information>
if ( !obj_info )
ffc0b7e8: 7c 69 1b 79 mr. r9,r3
return RTEMS_INVALID_NUMBER;
ffc0b7ec: 38 60 00 0a li r3,10
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
ffc0b7f0: 41 82 00 68 beq- ffc0b858 <rtems_object_get_class_information+0x90>
* 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;
info->maximum = obj_info->maximum;
ffc0b7f4: a0 c9 00 10 lhz r6,16(r9)
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
ffc0b7f8: 80 e9 00 08 lwz r7,8(r9)
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++ )
ffc0b7fc: 2f 86 00 00 cmpwi cr7,r6,0
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
ffc0b800: 81 09 00 0c lwz r8,12(r9)
info->auto_extend = obj_info->auto_extend;
ffc0b804: 89 49 00 12 lbz r10,18(r9)
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
ffc0b808: 90 ff 00 00 stw r7,0(r31)
info->maximum_id = obj_info->maximum_id;
ffc0b80c: 91 1f 00 04 stw r8,4(r31)
info->auto_extend = obj_info->auto_extend;
ffc0b810: 99 5f 00 0c stb r10,12(r31)
info->maximum = obj_info->maximum;
ffc0b814: 90 df 00 08 stw r6,8(r31)
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
ffc0b818: 41 9e 00 6c beq- cr7,ffc0b884 <rtems_object_get_class_information+0xbc><== NEVER TAKEN
ffc0b81c: 80 89 00 1c lwz r4,28(r9)
ffc0b820: 39 00 00 01 li r8,1
ffc0b824: 39 20 00 01 li r9,1
ffc0b828: 39 40 00 00 li r10,0
ffc0b82c: 39 29 00 01 addi r9,r9,1
ffc0b830: 7f 86 48 40 cmplw cr7,r6,r9
if ( !obj_info->local_table[i] )
ffc0b834: 55 08 10 3a rlwinm r8,r8,2,0,29
ffc0b838: 7c e4 40 2e lwzx r7,r4,r8
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++ )
ffc0b83c: 7d 28 4b 78 mr r8,r9
if ( !obj_info->local_table[i] )
unallocated++;
ffc0b840: 20 a7 00 00 subfic r5,r7,0
ffc0b844: 7c aa 01 94 addze r5,r10
ffc0b848: 7c aa 2b 78 mr r10,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++ )
ffc0b84c: 40 9c ff e0 bge+ cr7,ffc0b82c <rtems_object_get_class_information+0x64>
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
ffc0b850: 91 5f 00 10 stw r10,16(r31)
return RTEMS_SUCCESSFUL;
ffc0b854: 38 60 00 00 li r3,0
}
ffc0b858: 80 01 00 14 lwz r0,20(r1)
ffc0b85c: 83 e1 00 0c lwz r31,12(r1)
ffc0b860: 7c 08 03 a6 mtlr r0
ffc0b864: 38 21 00 10 addi r1,r1,16
ffc0b868: 4e 80 00 20 blr
ffc0b86c: 80 01 00 14 lwz r0,20(r1)
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
ffc0b870: 38 60 00 09 li r3,9
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
ffc0b874: 83 e1 00 0c lwz r31,12(r1)
ffc0b878: 7c 08 03 a6 mtlr r0
ffc0b87c: 38 21 00 10 addi r1,r1,16
ffc0b880: 4e 80 00 20 blr
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++ )
ffc0b884: 39 40 00 00 li r10,0 <== NOT EXECUTED
ffc0b888: 4b ff ff c8 b ffc0b850 <rtems_object_get_class_information+0x88><== NOT EXECUTED
ffc0b374 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
ffc0b374: 94 21 ff d0 stwu r1,-48(r1)
ffc0b378: 7c 08 02 a6 mflr r0
ffc0b37c: 93 c1 00 28 stw r30,40(r1)
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
ffc0b380: 7c 7e 1b 79 mr. r30,r3
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
ffc0b384: 90 01 00 34 stw r0,52(r1)
ffc0b388: 93 61 00 1c stw r27,28(r1)
ffc0b38c: 93 81 00 20 stw r28,32(r1)
ffc0b390: 93 a1 00 24 stw r29,36(r1)
ffc0b394: 93 e1 00 2c stw r31,44(r1)
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
ffc0b398: 40 82 00 2c bne- ffc0b3c4 <rtems_partition_create+0x50>
return RTEMS_INVALID_NAME;
ffc0b39c: 38 60 00 03 li r3,3
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
ffc0b3a0: 80 01 00 34 lwz r0,52(r1)
ffc0b3a4: 83 61 00 1c lwz r27,28(r1)
ffc0b3a8: 7c 08 03 a6 mtlr r0
ffc0b3ac: 83 81 00 20 lwz r28,32(r1)
ffc0b3b0: 83 a1 00 24 lwz r29,36(r1)
ffc0b3b4: 83 c1 00 28 lwz r30,40(r1)
ffc0b3b8: 83 e1 00 2c lwz r31,44(r1)
ffc0b3bc: 38 21 00 30 addi r1,r1,48
ffc0b3c0: 4e 80 00 20 blr
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
ffc0b3c4: 2f 84 00 00 cmpwi cr7,r4,0
return RTEMS_INVALID_ADDRESS;
ffc0b3c8: 38 60 00 09 li r3,9
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
ffc0b3cc: 41 be ff d4 beq- cr7,ffc0b3a0 <rtems_partition_create+0x2c>
return RTEMS_INVALID_ADDRESS;
if ( !id )
ffc0b3d0: 2f 88 00 00 cmpwi cr7,r8,0
ffc0b3d4: 41 be ff cc beq- cr7,ffc0b3a0 <rtems_partition_create+0x2c><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
ffc0b3d8: 2f 85 00 00 cmpwi cr7,r5,0
ffc0b3dc: 7c bf 2b 78 mr r31,r5
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
ffc0b3e0: 38 60 00 08 li r3,8
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
ffc0b3e4: 41 9e ff bc beq+ cr7,ffc0b3a0 <rtems_partition_create+0x2c>
ffc0b3e8: 2f 86 00 00 cmpwi cr7,r6,0
ffc0b3ec: 41 9e ff b4 beq+ cr7,ffc0b3a0 <rtems_partition_create+0x2c>
ffc0b3f0: 7f 85 30 40 cmplw cr7,r5,r6
ffc0b3f4: 41 9c ff ac blt+ cr7,ffc0b3a0 <rtems_partition_create+0x2c>
ffc0b3f8: 70 c9 00 07 andi. r9,r6,7
ffc0b3fc: 40 82 ff a4 bne+ ffc0b3a0 <rtems_partition_create+0x2c>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
ffc0b400: 70 9b 00 07 andi. r27,r4,7
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
ffc0b404: 38 60 00 09 li r3,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 ) )
ffc0b408: 40 82 ff 98 bne+ ffc0b3a0 <rtems_partition_create+0x2c>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0b40c: 3d 20 00 00 lis r9,0
ffc0b410: 81 49 28 a8 lwz r10,10408(r9)
++level;
ffc0b414: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc0b418: 91 49 28 a8 stw r10,10408(r9)
* 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 );
ffc0b41c: 3f 80 00 00 lis r28,0
ffc0b420: 90 81 00 08 stw r4,8(r1)
ffc0b424: 3b 9c 54 e0 addi r28,r28,21728
ffc0b428: 7f 83 e3 78 mr r3,r28
ffc0b42c: 90 c1 00 0c stw r6,12(r1)
ffc0b430: 90 e1 00 10 stw r7,16(r1)
ffc0b434: 91 01 00 14 stw r8,20(r1)
ffc0b438: 48 00 23 71 bl ffc0d7a8 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
ffc0b43c: 7c 7d 1b 79 mr. r29,r3
ffc0b440: 80 81 00 08 lwz r4,8(r1)
ffc0b444: 80 c1 00 0c lwz r6,12(r1)
ffc0b448: 80 e1 00 10 lwz r7,16(r1)
ffc0b44c: 81 01 00 14 lwz r8,20(r1)
ffc0b450: 41 82 00 50 beq- ffc0b4a0 <rtems_partition_create+0x12c>
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,
ffc0b454: 7c bf 33 96 divwu r5,r31,r6
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
ffc0b458: 90 9d 00 10 stw r4,16(r29)
the_partition->length = length;
the_partition->buffer_size = buffer_size;
ffc0b45c: 90 dd 00 18 stw r6,24(r29)
the_partition->attribute_set = attribute_set;
ffc0b460: 90 fd 00 1c stw r7,28(r29)
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
ffc0b464: 93 fd 00 14 stw r31,20(r29)
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
ffc0b468: 93 7d 00 20 stw r27,32(r29)
_Chain_Initialize( &the_partition->Memory, starting_address,
ffc0b46c: 91 01 00 14 stw r8,20(r1)
ffc0b470: 38 7d 00 24 addi r3,r29,36
ffc0b474: 48 00 17 19 bl ffc0cb8c <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
ffc0b478: 81 3d 00 08 lwz r9,8(r29)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc0b47c: 80 fc 00 1c lwz r7,28(r28)
ffc0b480: 55 2a 13 ba rlwinm r10,r9,2,14,29
ffc0b484: 7f a7 51 2e stwx r29,r7,r10
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
ffc0b488: 93 dd 00 0c stw r30,12(r29)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
ffc0b48c: 81 01 00 14 lwz r8,20(r1)
ffc0b490: 91 28 00 00 stw r9,0(r8)
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
ffc0b494: 48 00 3a f9 bl ffc0ef8c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc0b498: 38 60 00 00 li r3,0
ffc0b49c: 4b ff ff 04 b ffc0b3a0 <rtems_partition_create+0x2c>
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
ffc0b4a0: 48 00 3a ed bl ffc0ef8c <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
ffc0b4a4: 38 60 00 05 li r3,5
ffc0b4a8: 4b ff fe f8 b ffc0b3a0 <rtems_partition_create+0x2c>
ffc1a1a0 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
ffc1a1a0: 94 21 ff e0 stwu r1,-32(r1)
ffc1a1a4: 7c 69 1b 78 mr r9,r3
ffc1a1a8: 7c 08 02 a6 mflr r0
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
ffc1a1ac: 3c 60 00 00 lis r3,0
ffc1a1b0: 93 c1 00 18 stw r30,24(r1)
ffc1a1b4: 38 63 6f 30 addi r3,r3,28464
ffc1a1b8: 7c 9e 23 78 mr r30,r4
ffc1a1bc: 38 a1 00 08 addi r5,r1,8
ffc1a1c0: 90 01 00 24 stw r0,36(r1)
ffc1a1c4: 7d 24 4b 78 mr r4,r9
ffc1a1c8: 93 e1 00 1c stw r31,28(r1)
ffc1a1cc: 48 00 67 dd bl ffc209a8 <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
ffc1a1d0: 81 21 00 08 lwz r9,8(r1)
ffc1a1d4: 2f 89 00 00 cmpwi cr7,r9,0
ffc1a1d8: 40 9e 00 60 bne- cr7,ffc1a238 <rtems_partition_return_buffer+0x98>
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
ffc1a1dc: 81 23 00 10 lwz r9,16(r3)
ffc1a1e0: 7c 7f 1b 78 mr r31,r3
ending = _Addresses_Add_offset( starting, the_partition->length );
ffc1a1e4: 81 43 00 14 lwz r10,20(r3)
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
ffc1a1e8: 7f 9e 48 40 cmplw cr7,r30,r9
ffc1a1ec: 41 9c 00 68 blt- cr7,ffc1a254 <rtems_partition_return_buffer+0xb4>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
ffc1a1f0: 7d 49 52 14 add r10,r9,r10
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
ffc1a1f4: 7f 9e 50 40 cmplw cr7,r30,r10
ffc1a1f8: 41 9d 00 5c bgt- cr7,ffc1a254 <rtems_partition_return_buffer+0xb4><== NEVER TAKEN
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
ffc1a1fc: 81 43 00 18 lwz r10,24(r3)
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
ffc1a200: 7d 29 f0 50 subf r9,r9,r30
ffc1a204: 7d 09 53 96 divwu r8,r9,r10
ffc1a208: 7d 48 51 d6 mullw r10,r8,r10
starting = the_partition->starting_address;
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
ffc1a20c: 7f 89 50 00 cmpw cr7,r9,r10
ffc1a210: 40 9e 00 44 bne- cr7,ffc1a254 <rtems_partition_return_buffer+0xb4>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
ffc1a214: 38 63 00 24 addi r3,r3,36
ffc1a218: 7f c4 f3 78 mr r4,r30
ffc1a21c: 48 00 42 61 bl ffc1e47c <_Chain_Append>
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
ffc1a220: 81 3f 00 20 lwz r9,32(r31)
ffc1a224: 39 29 ff ff addi r9,r9,-1
ffc1a228: 91 3f 00 20 stw r9,32(r31)
_Thread_Enable_dispatch();
ffc1a22c: 48 00 78 65 bl ffc21a90 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc1a230: 38 60 00 00 li r3,0
ffc1a234: 48 00 00 08 b ffc1a23c <rtems_partition_return_buffer+0x9c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc1a238: 38 60 00 04 li r3,4
}
ffc1a23c: 80 01 00 24 lwz r0,36(r1)
ffc1a240: 83 c1 00 18 lwz r30,24(r1)
ffc1a244: 7c 08 03 a6 mtlr r0
ffc1a248: 83 e1 00 1c lwz r31,28(r1)
ffc1a24c: 38 21 00 20 addi r1,r1,32
ffc1a250: 4e 80 00 20 blr
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
ffc1a254: 48 00 78 3d bl ffc21a90 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1a258: 80 01 00 24 lwz r0,36(r1)
ffc1a25c: 83 c1 00 18 lwz r30,24(r1)
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
ffc1a260: 38 60 00 09 li r3,9
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1a264: 7c 08 03 a6 mtlr r0
ffc1a268: 83 e1 00 1c lwz r31,28(r1)
ffc1a26c: 38 21 00 20 addi r1,r1,32
ffc1a270: 4e 80 00 20 blr
ffc3f3f0 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
ffc3f3f0: 94 21 ff d0 stwu r1,-48(r1)
ffc3f3f4: 7c 08 02 a6 mflr r0
ffc3f3f8: 93 e1 00 2c stw r31,44(r1)
ffc3f3fc: 7c 7f 1b 78 mr r31,r3
ffc3f400: 3c 60 00 00 lis r3,0
ffc3f404: 93 a1 00 24 stw r29,36(r1)
ffc3f408: 38 63 6f 3c addi r3,r3,28476
ffc3f40c: 7c 9d 23 78 mr r29,r4
ffc3f410: 38 a1 00 08 addi r5,r1,8
ffc3f414: 90 01 00 34 stw r0,52(r1)
ffc3f418: 7f e4 fb 78 mr r4,r31
ffc3f41c: 93 61 00 1c stw r27,28(r1)
ffc3f420: 93 81 00 20 stw r28,32(r1)
ffc3f424: 93 c1 00 28 stw r30,40(r1)
ffc3f428: 4b fc be 6d bl ffc0b294 <_Objects_Get>
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
ffc3f42c: 81 21 00 08 lwz r9,8(r1)
ffc3f430: 2f 89 00 00 cmpwi cr7,r9,0
ffc3f434: 40 9e 00 50 bne- cr7,ffc3f484 <rtems_rate_monotonic_period+0x94>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
ffc3f438: 3f 80 00 00 lis r28,0
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
ffc3f43c: 81 43 00 40 lwz r10,64(r3)
ffc3f440: 3b 9c 69 20 addi r28,r28,26912
ffc3f444: 81 3c 00 10 lwz r9,16(r28)
ffc3f448: 7c 7e 1b 78 mr r30,r3
ffc3f44c: 7f 8a 48 00 cmpw cr7,r10,r9
ffc3f450: 41 9e 00 60 beq- cr7,ffc3f4b0 <rtems_rate_monotonic_period+0xc0>
_Thread_Enable_dispatch();
ffc3f454: 4b fc ce 91 bl ffc0c2e4 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc3f458: 80 01 00 34 lwz r0,52(r1)
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
ffc3f45c: 3b e0 00 17 li r31,23
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc3f460: 83 61 00 1c lwz r27,28(r1)
ffc3f464: 7c 08 03 a6 mtlr r0
ffc3f468: 7f e3 fb 78 mr r3,r31
ffc3f46c: 83 81 00 20 lwz r28,32(r1)
ffc3f470: 83 a1 00 24 lwz r29,36(r1)
ffc3f474: 83 c1 00 28 lwz r30,40(r1)
ffc3f478: 83 e1 00 2c lwz r31,44(r1)
ffc3f47c: 38 21 00 30 addi r1,r1,48
ffc3f480: 4e 80 00 20 blr
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc3f484: 3b e0 00 04 li r31,4
}
ffc3f488: 80 01 00 34 lwz r0,52(r1)
ffc3f48c: 7f e3 fb 78 mr r3,r31
ffc3f490: 83 61 00 1c lwz r27,28(r1)
ffc3f494: 7c 08 03 a6 mtlr r0
ffc3f498: 83 81 00 20 lwz r28,32(r1)
ffc3f49c: 83 a1 00 24 lwz r29,36(r1)
ffc3f4a0: 83 c1 00 28 lwz r30,40(r1)
ffc3f4a4: 83 e1 00 2c lwz r31,44(r1)
ffc3f4a8: 38 21 00 30 addi r1,r1,48
ffc3f4ac: 4e 80 00 20 blr
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
ffc3f4b0: 2f 9d 00 00 cmpwi cr7,r29,0
ffc3f4b4: 41 9e 00 80 beq- cr7,ffc3f534 <rtems_rate_monotonic_period+0x144>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc3f4b8: 7f 60 00 a6 mfmsr r27
ffc3f4bc: 7d 30 42 a6 mfsprg r9,0
ffc3f4c0: 7f 69 48 78 andc r9,r27,r9
ffc3f4c4: 7d 20 01 24 mtmsr r9
_Thread_Enable_dispatch();
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
ffc3f4c8: 81 23 00 38 lwz r9,56(r3)
ffc3f4cc: 2f 89 00 00 cmpwi cr7,r9,0
ffc3f4d0: 41 9e 00 8c beq- cr7,ffc3f55c <rtems_rate_monotonic_period+0x16c>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
ffc3f4d4: 2f 89 00 02 cmpwi cr7,r9,2
ffc3f4d8: 41 9e 00 d4 beq- cr7,ffc3f5ac <rtems_rate_monotonic_period+0x1bc>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
ffc3f4dc: 2f 89 00 04 cmpwi cr7,r9,4
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc3f4e0: 3b e0 00 04 li r31,4
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
ffc3f4e4: 40 9e ff a4 bne+ cr7,ffc3f488 <rtems_rate_monotonic_period+0x98><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
ffc3f4e8: 4b ff fc d9 bl ffc3f1c0 <_Rate_monotonic_Update_statistics>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc3f4ec: 7f 60 01 24 mtmsr r27
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
ffc3f4f0: 39 20 00 02 li r9,2
the_period->next_length = length;
ffc3f4f4: 93 be 00 3c stw r29,60(r30)
ffc3f4f8: 3c 60 00 00 lis r3,0
*/
_Rate_monotonic_Update_statistics( the_period );
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
ffc3f4fc: 91 3e 00 38 stw r9,56(r30)
ffc3f500: 38 63 65 28 addi r3,r3,25896
ffc3f504: 38 9e 00 10 addi r4,r30,16
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc3f508: 93 be 00 1c stw r29,28(r30)
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
ffc3f50c: 3b e0 00 06 li r31,6
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc3f510: 4b fc dd 79 bl ffc0d288 <_Watchdog_Insert>
ffc3f514: 3d 20 00 00 lis r9,0
ffc3f518: 81 29 20 c0 lwz r9,8384(r9)
ffc3f51c: 80 7e 00 40 lwz r3,64(r30)
ffc3f520: 80 9e 00 3c lwz r4,60(r30)
ffc3f524: 7d 29 03 a6 mtctr r9
ffc3f528: 4e 80 04 21 bctrl
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
ffc3f52c: 4b fc cd b9 bl ffc0c2e4 <_Thread_Enable_dispatch>
ffc3f530: 4b ff ff 58 b ffc3f488 <rtems_rate_monotonic_period+0x98>
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
ffc3f534: 81 23 00 38 lwz r9,56(r3)
ffc3f538: 3b e0 00 00 li r31,0
ffc3f53c: 2b 89 00 04 cmplwi cr7,r9,4
ffc3f540: 41 9d 00 14 bgt- cr7,ffc3f554 <rtems_rate_monotonic_period+0x164><== NEVER TAKEN
ffc3f544: 3d 40 ff c7 lis r10,-57
ffc3f548: 55 29 10 3a rlwinm r9,r9,2,0,29
ffc3f54c: 39 4a b1 50 addi r10,r10,-20144
ffc3f550: 7f ea 48 2e lwzx r31,r10,r9
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
ffc3f554: 4b fc cd 91 bl ffc0c2e4 <_Thread_Enable_dispatch>
ffc3f558: 4b ff ff 30 b ffc3f488 <rtems_rate_monotonic_period+0x98>
ffc3f55c: 7f 60 01 24 mtmsr r27
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
the_period->next_length = length;
ffc3f560: 93 a3 00 3c stw r29,60(r3)
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
ffc3f564: 4b ff fd ad bl ffc3f310 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
ffc3f568: 39 40 00 02 li r10,2
ffc3f56c: 91 5e 00 38 stw r10,56(r30)
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
ffc3f570: 3d 40 ff c4 lis r10,-60
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
ffc3f574: 39 20 00 00 li r9,0
the_watchdog->routine = routine;
ffc3f578: 39 4a f6 1c addi r10,r10,-2532
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
ffc3f57c: 91 3e 00 18 stw r9,24(r30)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc3f580: 3c 60 00 00 lis r3,0
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
ffc3f584: 91 5e 00 2c stw r10,44(r30)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc3f588: 38 63 65 28 addi r3,r3,25896
ffc3f58c: 38 9e 00 10 addi r4,r30,16
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
the_watchdog->id = id;
ffc3f590: 93 fe 00 30 stw r31,48(r30)
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
ffc3f594: 3b e0 00 00 li r31,0
the_watchdog->user_data = user_data;
ffc3f598: 91 3e 00 34 stw r9,52(r30)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc3f59c: 93 be 00 1c stw r29,28(r30)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc3f5a0: 4b fc dc e9 bl ffc0d288 <_Watchdog_Insert>
id,
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
ffc3f5a4: 4b fc cd 41 bl ffc0c2e4 <_Thread_Enable_dispatch>
ffc3f5a8: 4b ff fe e0 b ffc3f488 <rtems_rate_monotonic_period+0x98>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
ffc3f5ac: 4b ff fc 15 bl ffc3f1c0 <_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;
ffc3f5b0: 39 20 00 01 li r9,1
ffc3f5b4: 91 3e 00 38 stw r9,56(r30)
the_period->next_length = length;
ffc3f5b8: 93 be 00 3c stw r29,60(r30)
ffc3f5bc: 7f 60 01 24 mtmsr r27
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
ffc3f5c0: 81 3c 00 10 lwz r9,16(r28)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
ffc3f5c4: 38 80 40 00 li r4,16384
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
the_period->next_length = length;
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
ffc3f5c8: 81 5e 00 08 lwz r10,8(r30)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
ffc3f5cc: 7d 23 4b 78 mr r3,r9
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
the_period->next_length = length;
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
ffc3f5d0: 91 49 00 20 stw r10,32(r9)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
ffc3f5d4: 4b fc d7 f9 bl ffc0cdcc <_Thread_Set_state>
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc3f5d8: 7d 40 00 a6 mfmsr r10
ffc3f5dc: 7d 30 42 a6 mfsprg r9,0
ffc3f5e0: 7d 49 48 78 andc r9,r10,r9
ffc3f5e4: 7d 20 01 24 mtmsr r9
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
ffc3f5e8: 39 00 00 02 li r8,2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
ffc3f5ec: 81 3e 00 38 lwz r9,56(r30)
the_period->state = RATE_MONOTONIC_ACTIVE;
ffc3f5f0: 91 1e 00 38 stw r8,56(r30)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc3f5f4: 7d 40 01 24 mtmsr r10
/*
* 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 )
ffc3f5f8: 2f 89 00 03 cmpwi cr7,r9,3
ffc3f5fc: 41 9e 00 10 beq- cr7,ffc3f60c <rtems_rate_monotonic_period+0x21c><== NEVER TAKEN
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
ffc3f600: 4b fc cc e5 bl ffc0c2e4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc3f604: 3b e0 00 00 li r31,0
ffc3f608: 4b ff fe 80 b ffc3f488 <rtems_rate_monotonic_period+0x98>
/*
* 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 );
ffc3f60c: 80 7c 00 10 lwz r3,16(r28) <== NOT EXECUTED
ffc3f610: 38 80 40 00 li r4,16384 <== NOT EXECUTED
ffc3f614: 4b fc c7 d1 bl ffc0bde4 <_Thread_Clear_state> <== NOT EXECUTED
ffc3f618: 4b ff ff e8 b ffc3f600 <rtems_rate_monotonic_period+0x210><== NOT EXECUTED
ffc2f6d4 <rtems_rate_monotonic_report_statistics_with_plugin>:
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
ffc2f6d4: 94 21 ff 70 stwu r1,-144(r1)
ffc2f6d8: 7c 08 02 a6 mflr r0
ffc2f6dc: 93 c1 00 88 stw r30,136(r1)
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
ffc2f6e0: 7c 9e 23 79 mr. r30,r4
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
ffc2f6e4: 90 01 00 94 stw r0,148(r1)
ffc2f6e8: 92 e1 00 6c stw r23,108(r1)
ffc2f6ec: 93 01 00 70 stw r24,112(r1)
ffc2f6f0: 93 21 00 74 stw r25,116(r1)
ffc2f6f4: 93 41 00 78 stw r26,120(r1)
ffc2f6f8: 93 61 00 7c stw r27,124(r1)
ffc2f6fc: 93 81 00 80 stw r28,128(r1)
ffc2f700: 93 a1 00 84 stw r29,132(r1)
ffc2f704: 93 e1 00 8c stw r31,140(r1)
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
ffc2f708: 41 82 01 5c beq- ffc2f864 <rtems_rate_monotonic_report_statistics_with_plugin+0x190><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
ffc2f70c: 3c 80 ff c7 lis r4,-57
ffc2f710: 7f c9 03 a6 mtctr r30
ffc2f714: 38 84 81 6c addi r4,r4,-32404
ffc2f718: 7c 7c 1b 78 mr r28,r3
/*
* 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 ;
ffc2f71c: 3f a0 00 00 lis r29,0
ffc2f720: 3b bd 6f 3c addi r29,r29,28476
char name[5];
if ( !print )
return;
(*print)( context, "Period information by period\n" );
ffc2f724: 4c c6 31 82 crclr 4*cr1+eq
ffc2f728: 4e 80 04 21 bctrl
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
ffc2f72c: 3c 80 ff c7 lis r4,-57
ffc2f730: 38 84 81 8c addi r4,r4,-32372
ffc2f734: 7f c9 03 a6 mtctr r30
ffc2f738: 7f 83 e3 78 mr r3,r28
ffc2f73c: 4c c6 31 82 crclr 4*cr1+eq
ffc2f740: 4e 80 04 21 bctrl
(*print)( context, "--- Wall times are in seconds ---\n" );
ffc2f744: 3c 80 ff c7 lis r4,-57
ffc2f748: 38 84 81 b0 addi r4,r4,-32336
ffc2f74c: 7f c9 03 a6 mtctr r30
ffc2f750: 7f 83 e3 78 mr r3,r28
ffc2f754: 4c c6 31 82 crclr 4*cr1+eq
ffc2f758: 4e 80 04 21 bctrl
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
ffc2f75c: 3c 80 ff c7 lis r4,-57
ffc2f760: 38 84 81 d4 addi r4,r4,-32300
ffc2f764: 7f c9 03 a6 mtctr r30
ffc2f768: 7f 83 e3 78 mr r3,r28
ffc2f76c: 4c c6 31 82 crclr 4*cr1+eq
ffc2f770: 4e 80 04 21 bctrl
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
ffc2f774: 3c 80 ff c7 lis r4,-57
ffc2f778: 7f 83 e3 78 mr r3,r28
ffc2f77c: 7f c9 03 a6 mtctr r30
ffc2f780: 38 84 82 20 addi r4,r4,-32224
ffc2f784: 4c c6 31 82 crclr 4*cr1+eq
ffc2f788: 4e 80 04 21 bctrl
/*
* 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 ;
ffc2f78c: 83 fd 00 08 lwz r31,8(r29)
ffc2f790: 81 3d 00 0c lwz r9,12(r29)
ffc2f794: 7f 9f 48 40 cmplw cr7,r31,r9
ffc2f798: 41 9d 00 cc bgt- cr7,ffc2f864 <rtems_rate_monotonic_report_statistics_with_plugin+0x190><== 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,
ffc2f79c: 3f 20 ff c7 lis r25,-57
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,
ffc2f7a0: 3e e0 ff c7 lis r23,-57
ffc2f7a4: 3f 60 10 62 lis r27,4194
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,
ffc2f7a8: 3f 00 ff c7 lis r24,-57
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
ffc2f7ac: 3f 40 ff c7 lis r26,-57
rtems_object_get_name( the_status.owner, sizeof(name), name );
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
ffc2f7b0: 3b 39 82 6c addi r25,r25,-32148
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,
ffc2f7b4: 3a f7 82 84 addi r23,r23,-32124
ffc2f7b8: 63 7b 4d d3 ori r27,r27,19923
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,
ffc2f7bc: 3b 18 82 a4 addi r24,r24,-32092
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
ffc2f7c0: 3b 5a 9a 34 addi r26,r26,-26060
ffc2f7c4: 48 00 00 14 b ffc2f7d8 <rtems_rate_monotonic_report_statistics_with_plugin+0x104>
/*
* 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 ;
ffc2f7c8: 81 3d 00 0c lwz r9,12(r29)
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
ffc2f7cc: 3b ff 00 01 addi r31,r31,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 ;
ffc2f7d0: 7f 89 f8 40 cmplw cr7,r9,r31
ffc2f7d4: 41 9c 00 90 blt- cr7,ffc2f864 <rtems_rate_monotonic_report_statistics_with_plugin+0x190>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
ffc2f7d8: 7f e3 fb 78 mr r3,r31
ffc2f7dc: 38 81 00 08 addi r4,r1,8
ffc2f7e0: 48 00 f5 39 bl ffc3ed18 <rtems_rate_monotonic_get_statistics>
if ( status != RTEMS_SUCCESSFUL )
ffc2f7e4: 2f 83 00 00 cmpwi cr7,r3,0
ffc2f7e8: 40 9e ff e0 bne+ cr7,ffc2f7c8 <rtems_rate_monotonic_report_statistics_with_plugin+0xf4>
#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 );
ffc2f7ec: 38 81 00 40 addi r4,r1,64
ffc2f7f0: 7f e3 fb 78 mr r3,r31
ffc2f7f4: 48 00 f7 4d bl ffc3ef40 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
ffc2f7f8: 80 61 00 40 lwz r3,64(r1)
ffc2f7fc: 38 a1 00 60 addi r5,r1,96
ffc2f800: 38 80 00 05 li r4,5
ffc2f804: 4b fe 35 a1 bl ffc12da4 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
ffc2f808: 7f 24 cb 78 mr r4,r25
ffc2f80c: 7f e5 fb 78 mr r5,r31
ffc2f810: 80 e1 00 08 lwz r7,8(r1)
ffc2f814: 7f 83 e3 78 mr r3,r28
ffc2f818: 81 01 00 0c lwz r8,12(r1)
ffc2f81c: 38 c1 00 60 addi r6,r1,96
ffc2f820: 7f c9 03 a6 mtctr r30
ffc2f824: 4c c6 31 82 crclr 4*cr1+eq
ffc2f828: 4e 80 04 21 bctrl
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
ffc2f82c: 81 21 00 08 lwz r9,8(r1)
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 );
ffc2f830: 38 61 00 20 addi r3,r1,32
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
ffc2f834: 2f 89 00 00 cmpwi cr7,r9,0
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 );
ffc2f838: 38 a1 00 58 addi r5,r1,88
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
ffc2f83c: 7f 44 d3 78 mr r4,r26
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
ffc2f840: 40 9e 00 58 bne- cr7,ffc2f898 <rtems_rate_monotonic_report_statistics_with_plugin+0x1c4>
(*print)( context, "\n" );
ffc2f844: 7f 83 e3 78 mr r3,r28
ffc2f848: 7f c9 03 a6 mtctr r30
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
ffc2f84c: 3b ff 00 01 addi r31,r31,1
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
ffc2f850: 4c c6 31 82 crclr 4*cr1+eq
ffc2f854: 4e 80 04 21 bctrl
/*
* 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 ;
ffc2f858: 81 3d 00 0c lwz r9,12(r29)
ffc2f85c: 7f 89 f8 40 cmplw cr7,r9,r31
ffc2f860: 40 9c ff 78 bge+ cr7,ffc2f7d8 <rtems_rate_monotonic_report_statistics_with_plugin+0x104><== ALWAYS TAKEN
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
ffc2f864: 80 01 00 94 lwz r0,148(r1)
ffc2f868: 82 e1 00 6c lwz r23,108(r1)
ffc2f86c: 7c 08 03 a6 mtlr r0
ffc2f870: 83 01 00 70 lwz r24,112(r1)
ffc2f874: 83 21 00 74 lwz r25,116(r1)
ffc2f878: 83 41 00 78 lwz r26,120(r1)
ffc2f87c: 83 61 00 7c lwz r27,124(r1)
ffc2f880: 83 81 00 80 lwz r28,128(r1)
ffc2f884: 83 a1 00 84 lwz r29,132(r1)
ffc2f888: 83 c1 00 88 lwz r30,136(r1)
ffc2f88c: 83 e1 00 8c lwz r31,140(r1)
ffc2f890: 38 21 00 90 addi r1,r1,144
ffc2f894: 4e 80 00 20 blr
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 );
ffc2f898: 7d 24 4b 78 mr r4,r9
ffc2f89c: 48 00 0f 15 bl ffc307b0 <_Timespec_Divide_by_integer>
(*print)( context,
ffc2f8a0: 81 01 00 14 lwz r8,20(r1)
ffc2f8a4: 81 41 00 1c lwz r10,28(r1)
ffc2f8a8: 7f c9 03 a6 mtctr r30
ffc2f8ac: 80 61 00 5c lwz r3,92(r1)
ffc2f8b0: 7d 68 d8 96 mulhw r11,r8,r27
ffc2f8b4: 80 e1 00 18 lwz r7,24(r1)
ffc2f8b8: 7c 03 d8 96 mulhw r0,r3,r27
ffc2f8bc: 81 21 00 58 lwz r9,88(r1)
ffc2f8c0: 80 a1 00 10 lwz r5,16(r1)
ffc2f8c4: 7c 8a d8 96 mulhw r4,r10,r27
ffc2f8c8: 7d 6b 36 70 srawi r11,r11,6
ffc2f8cc: 7d 06 fe 70 srawi r6,r8,31
ffc2f8d0: 7c 63 fe 70 srawi r3,r3,31
ffc2f8d4: 7c 88 36 70 srawi r8,r4,6
ffc2f8d8: 7d 44 fe 70 srawi r4,r10,31
ffc2f8dc: 7c 0a 36 70 srawi r10,r0,6
ffc2f8e0: 7c c6 58 50 subf r6,r6,r11
ffc2f8e4: 7d 04 40 50 subf r8,r4,r8
ffc2f8e8: 7d 43 50 50 subf r10,r3,r10
ffc2f8ec: 7e e4 bb 78 mr r4,r23
ffc2f8f0: 7f 83 e3 78 mr r3,r28
ffc2f8f4: 4c c6 31 82 crclr 4*cr1+eq
ffc2f8f8: 4e 80 04 21 bctrl
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);
ffc2f8fc: 80 81 00 08 lwz r4,8(r1)
ffc2f900: 38 61 00 38 addi r3,r1,56
ffc2f904: 38 a1 00 58 addi r5,r1,88
ffc2f908: 48 00 0e a9 bl ffc307b0 <_Timespec_Divide_by_integer>
(*print)( context,
ffc2f90c: 81 01 00 2c lwz r8,44(r1)
ffc2f910: 81 41 00 34 lwz r10,52(r1)
ffc2f914: 7f c9 03 a6 mtctr r30
ffc2f918: 80 61 00 5c lwz r3,92(r1)
ffc2f91c: 7d 88 d8 96 mulhw r12,r8,r27
ffc2f920: 80 a1 00 28 lwz r5,40(r1)
ffc2f924: 7d 6a d8 96 mulhw r11,r10,r27
ffc2f928: 80 e1 00 30 lwz r7,48(r1)
ffc2f92c: 81 21 00 58 lwz r9,88(r1)
ffc2f930: 7c 83 d8 96 mulhw r4,r3,r27
ffc2f934: 7d 40 fe 70 srawi r0,r10,31
ffc2f938: 7d 8c 36 70 srawi r12,r12,6
ffc2f93c: 7d 06 fe 70 srawi r6,r8,31
ffc2f940: 7c 8a 36 70 srawi r10,r4,6
ffc2f944: 7d 68 36 70 srawi r8,r11,6
ffc2f948: 7c 6b fe 70 srawi r11,r3,31
ffc2f94c: 7f 04 c3 78 mr r4,r24
ffc2f950: 7f 83 e3 78 mr r3,r28
ffc2f954: 7c c6 60 50 subf r6,r6,r12
ffc2f958: 7d 00 40 50 subf r8,r0,r8
ffc2f95c: 7d 4b 50 50 subf r10,r11,r10
ffc2f960: 4c c6 31 82 crclr 4*cr1+eq
ffc2f964: 4e 80 04 21 bctrl
ffc2f968: 4b ff fe 60 b ffc2f7c8 <rtems_rate_monotonic_report_statistics_with_plugin+0xf4>
ffc2f97c <rtems_rate_monotonic_reset_all_statistics>:
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc2f97c: 3d 20 00 00 lis r9,0
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
ffc2f980: 94 21 ff f0 stwu r1,-16(r1)
ffc2f984: 7c 08 02 a6 mflr r0
ffc2f988: 81 49 34 e4 lwz r10,13540(r9)
ffc2f98c: 90 01 00 14 stw r0,20(r1)
++level;
ffc2f990: 39 4a 00 01 addi r10,r10,1
ffc2f994: 93 c1 00 08 stw r30,8(r1)
ffc2f998: 93 e1 00 0c stw r31,12(r1)
_Thread_Dispatch_disable_level = level;
ffc2f99c: 91 49 34 e4 stw r10,13540(r9)
/*
* 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 ;
ffc2f9a0: 3f c0 00 00 lis r30,0
ffc2f9a4: 3b de 6f 3c addi r30,r30,28476
ffc2f9a8: 83 fe 00 08 lwz r31,8(r30)
ffc2f9ac: 81 3e 00 0c lwz r9,12(r30)
ffc2f9b0: 7f 9f 48 40 cmplw cr7,r31,r9
ffc2f9b4: 41 9d 00 1c bgt- cr7,ffc2f9d0 <rtems_rate_monotonic_reset_all_statistics+0x54><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
ffc2f9b8: 7f e3 fb 78 mr r3,r31
ffc2f9bc: 48 00 00 2d bl ffc2f9e8 <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 ;
ffc2f9c0: 81 3e 00 0c lwz r9,12(r30)
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
ffc2f9c4: 3b ff 00 01 addi r31,r31,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 ;
ffc2f9c8: 7f 89 f8 40 cmplw cr7,r9,r31
ffc2f9cc: 40 9c ff ec bge+ cr7,ffc2f9b8 <rtems_rate_monotonic_reset_all_statistics+0x3c>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
ffc2f9d0: 80 01 00 14 lwz r0,20(r1)
ffc2f9d4: 83 c1 00 08 lwz r30,8(r1)
ffc2f9d8: 7c 08 03 a6 mtlr r0
ffc2f9dc: 83 e1 00 0c lwz r31,12(r1)
ffc2f9e0: 38 21 00 10 addi r1,r1,16
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
ffc2f9e4: 4b fd c9 00 b ffc0c2e4 <_Thread_Enable_dispatch>
ffc0ab28 <rtems_rbheap_allocate>:
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
ffc0ab28: 94 21 ff e0 stwu r1,-32(r1)
ffc0ab2c: 7c 08 02 a6 mflr r0
ffc0ab30: 90 01 00 24 stw r0,36(r1)
void *ptr = NULL;
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
ffc0ab34: 81 23 00 30 lwz r9,48(r3)
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
ffc0ab38: 93 c1 00 18 stw r30,24(r1)
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
ffc0ab3c: 7f c4 4b 96 divwu r30,r4,r9
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
ffc0ab40: 93 81 00 10 stw r28,16(r1)
ffc0ab44: 93 61 00 0c stw r27,12(r1)
ffc0ab48: 93 a1 00 14 stw r29,20(r1)
ffc0ab4c: 93 e1 00 1c stw r31,28(r1)
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
ffc0ab50: 7f de 49 d6 mullw r30,r30,r9
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
ffc0ab54: 7c 7c 1b 78 mr r28,r3
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
ffc0ab58: 7d 5e 20 51 subf. r10,r30,r4
ffc0ab5c: 40 82 00 ac bne- ffc0ac08 <rtems_rbheap_allocate+0xe0> <== NEVER TAKEN
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
ffc0ab60: 2f 84 00 00 cmpwi cr7,r4,0
ffc0ab64: 7c 9e 23 78 mr r30,r4
ffc0ab68: 41 9e 00 2c beq- cr7,ffc0ab94 <rtems_rbheap_allocate+0x6c>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
ffc0ab6c: 83 bc 00 00 lwz r29,0(r28)
rtems_chain_control *free_chain,
size_t size
)
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
ffc0ab70: 39 3c 00 04 addi r9,r28,4
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
ffc0ab74: 7f 9d 48 00 cmpw cr7,r29,r9
ffc0ab78: 41 9e 00 1c beq- cr7,ffc0ab94 <rtems_rbheap_allocate+0x6c>
rtems_rbheap_chunk *free_chunk = (rtems_rbheap_chunk *) current;
if (free_chunk->size >= size) {
ffc0ab7c: 83 fd 00 1c lwz r31,28(r29)
ffc0ab80: 7f 9f f0 40 cmplw cr7,r31,r30
ffc0ab84: 40 9c 00 38 bge- cr7,ffc0abbc <rtems_rbheap_allocate+0x94>
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
if (chunk != NULL) {
rtems_rbheap_add_to_spare_descriptor_chain(control, chunk);
}
}
ffc0ab88: 83 bd 00 00 lwz r29,0(r29)
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
ffc0ab8c: 7f 89 e8 00 cmpw cr7,r9,r29
ffc0ab90: 40 9e ff ec bne+ cr7,ffc0ab7c <rtems_rbheap_allocate+0x54><== NEVER TAKEN
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
ffc0ab94: 38 60 00 00 li r3,0
}
}
}
return ptr;
}
ffc0ab98: 80 01 00 24 lwz r0,36(r1)
ffc0ab9c: 83 61 00 0c lwz r27,12(r1)
ffc0aba0: 7c 08 03 a6 mtlr r0
ffc0aba4: 83 81 00 10 lwz r28,16(r1)
ffc0aba8: 83 a1 00 14 lwz r29,20(r1)
ffc0abac: 83 c1 00 18 lwz r30,24(r1)
ffc0abb0: 83 e1 00 1c lwz r31,28(r1)
ffc0abb4: 38 21 00 20 addi r1,r1,32
ffc0abb8: 4e 80 00 20 blr
rtems_rbheap_chunk *free_chunk = search_free_chunk(free_chain, aligned_size);
if (free_chunk != NULL) {
uintptr_t free_size = free_chunk->size;
if (free_size > aligned_size) {
ffc0abbc: 7f 9e f8 40 cmplw cr7,r30,r31
ffc0abc0: 41 9c 00 68 blt- cr7,ffc0ac28 <rtems_rbheap_allocate+0x100>
}
}
}
return ptr;
}
ffc0abc4: 80 01 00 24 lwz r0,36(r1)
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
ffc0abc8: 39 40 00 00 li r10,0
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
ffc0abcc: 81 3d 00 00 lwz r9,0(r29)
ffc0abd0: 7c 08 03 a6 mtlr r0
previous = the_node->previous;
ffc0abd4: 81 1d 00 04 lwz r8,4(r29)
ptr = (void *) new_chunk->begin;
}
} else {
rtems_chain_extract_unprotected(&free_chunk->chain_node);
rtems_chain_set_off_chain(&free_chunk->chain_node);
ptr = (void *) free_chunk->begin;
ffc0abd8: 80 7d 00 18 lwz r3,24(r29)
next->previous = previous;
ffc0abdc: 91 09 00 04 stw r8,4(r9)
previous->next = next;
ffc0abe0: 91 28 00 00 stw r9,0(r8)
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
ffc0abe4: 91 5d 00 04 stw r10,4(r29)
ffc0abe8: 91 5d 00 00 stw r10,0(r29)
}
}
}
return ptr;
}
ffc0abec: 83 61 00 0c lwz r27,12(r1)
ffc0abf0: 83 81 00 10 lwz r28,16(r1)
ffc0abf4: 83 a1 00 14 lwz r29,20(r1)
ffc0abf8: 83 c1 00 18 lwz r30,24(r1)
ffc0abfc: 83 e1 00 1c lwz r31,28(r1)
ffc0ac00: 38 21 00 20 addi r1,r1,32
ffc0ac04: 4e 80 00 20 blr
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
ffc0ac08: 2f 84 00 00 cmpwi cr7,r4,0 <== NOT EXECUTED
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
value += alignment - excess;
ffc0ac0c: 7d 24 4a 14 add r9,r4,r9 <== NOT EXECUTED
ffc0ac10: 7f ca 48 50 subf r30,r10,r9 <== NOT EXECUTED
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
ffc0ac14: 41 be ff 80 beq- cr7,ffc0ab94 <rtems_rbheap_allocate+0x6c><== NOT EXECUTED
ffc0ac18: 7f 84 f0 40 cmplw cr7,r4,r30 <== NOT EXECUTED
ffc0ac1c: 40 9d ff 50 ble+ cr7,ffc0ab6c <rtems_rbheap_allocate+0x44><== NOT EXECUTED
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
ffc0ac20: 38 60 00 00 li r3,0 <== NOT EXECUTED
ffc0ac24: 4b ff ff 74 b ffc0ab98 <rtems_rbheap_allocate+0x70> <== NOT EXECUTED
if (free_chunk != NULL) {
uintptr_t free_size = free_chunk->size;
if (free_size > aligned_size) {
rtems_rbheap_chunk *new_chunk = get_chunk(control);
ffc0ac28: 7f 83 e3 78 mr r3,r28
ffc0ac2c: 4b ff fc 9d bl ffc0a8c8 <get_chunk>
if (new_chunk != NULL) {
ffc0ac30: 7c 7b 1b 79 mr. r27,r3
ffc0ac34: 41 a2 ff 60 beq- ffc0ab94 <rtems_rbheap_allocate+0x6c> <== NEVER TAKEN
uintptr_t new_free_size = free_size - aligned_size;
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
ffc0ac38: 81 5d 00 18 lwz r10,24(r29)
if (free_size > aligned_size) {
rtems_rbheap_chunk *new_chunk = get_chunk(control);
if (new_chunk != NULL) {
uintptr_t new_free_size = free_size - aligned_size;
ffc0ac3c: 7f fe f8 50 subf r31,r30,r31
ffc0ac40: 39 20 00 00 li r9,0
free_chunk->size = new_free_size;
ffc0ac44: 93 fd 00 1c stw r31,28(r29)
new_chunk->begin = free_chunk->begin + new_free_size;
ffc0ac48: 7d 5f 52 14 add r10,r31,r10
new_chunk->size = aligned_size;
ffc0ac4c: 93 db 00 1c stw r30,28(r27)
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
ffc0ac50: 38 7c 00 18 addi r3,r28,24
ffc0ac54: 38 9b 00 08 addi r4,r27,8
if (new_chunk != NULL) {
uintptr_t new_free_size = free_size - aligned_size;
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
ffc0ac58: 91 5b 00 18 stw r10,24(r27)
ffc0ac5c: 91 3b 00 04 stw r9,4(r27)
ffc0ac60: 91 3b 00 00 stw r9,0(r27)
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
ffc0ac64: 48 00 1f 1d bl ffc0cb80 <_RBTree_Insert_unprotected>
}
}
}
return ptr;
}
ffc0ac68: 80 01 00 24 lwz r0,36(r1)
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
new_chunk->size = aligned_size;
rtems_chain_set_off_chain(&new_chunk->chain_node);
insert_into_tree(chunk_tree, new_chunk);
ptr = (void *) new_chunk->begin;
ffc0ac6c: 80 7b 00 18 lwz r3,24(r27)
}
}
}
return ptr;
}
ffc0ac70: 7c 08 03 a6 mtlr r0
ffc0ac74: 83 61 00 0c lwz r27,12(r1)
ffc0ac78: 83 81 00 10 lwz r28,16(r1)
ffc0ac7c: 83 a1 00 14 lwz r29,20(r1)
ffc0ac80: 83 c1 00 18 lwz r30,24(r1)
ffc0ac84: 83 e1 00 1c lwz r31,28(r1)
ffc0ac88: 38 21 00 20 addi r1,r1,32
ffc0ac8c: 4e 80 00 20 blr
ffc0ae08 <rtems_rbheap_extend_descriptors_with_malloc>:
/* Do nothing */
}
void rtems_rbheap_extend_descriptors_with_malloc(rtems_rbheap_control *control)
{
ffc0ae08: 94 21 ff f0 stwu r1,-16(r1) <== NOT EXECUTED
ffc0ae0c: 7c 08 02 a6 mflr r0 <== NOT EXECUTED
ffc0ae10: 93 e1 00 0c stw r31,12(r1) <== NOT EXECUTED
ffc0ae14: 7c 7f 1b 78 mr r31,r3 <== NOT EXECUTED
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
ffc0ae18: 38 60 00 20 li r3,32 <== NOT EXECUTED
{
/* Do nothing */
}
void rtems_rbheap_extend_descriptors_with_malloc(rtems_rbheap_control *control)
{
ffc0ae1c: 90 01 00 14 stw r0,20(r1) <== NOT EXECUTED
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
ffc0ae20: 4b ff a6 05 bl ffc05424 <malloc> <== NOT EXECUTED
if (chunk != NULL) {
ffc0ae24: 2c 03 00 00 cmpwi r3,0 <== NOT EXECUTED
ffc0ae28: 41 82 00 1c beq- ffc0ae44 <rtems_rbheap_extend_descriptors_with_malloc+0x3c><== NOT EXECUTED
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0ae2c: 81 5f 00 0c lwz r10,12(r31) <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert_unprotected(_Chain_Head(the_chain), the_node);
ffc0ae30: 39 1f 00 0c addi r8,r31,12 <== NOT EXECUTED
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0ae34: 91 03 00 04 stw r8,4(r3) <== NOT EXECUTED
before_node = after_node->next;
after_node->next = the_node;
ffc0ae38: 90 7f 00 0c stw r3,12(r31) <== NOT EXECUTED
the_node->next = before_node;
before_node->previous = the_node;
ffc0ae3c: 90 6a 00 04 stw r3,4(r10) <== NOT EXECUTED
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
ffc0ae40: 91 43 00 00 stw r10,0(r3) <== NOT EXECUTED
rtems_rbheap_add_to_spare_descriptor_chain(control, chunk);
}
}
ffc0ae44: 80 01 00 14 lwz r0,20(r1) <== NOT EXECUTED
ffc0ae48: 83 e1 00 0c lwz r31,12(r1) <== NOT EXECUTED
ffc0ae4c: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0ae50: 38 21 00 10 addi r1,r1,16 <== NOT EXECUTED
ffc0ae54: 4e 80 00 20 blr <== NOT EXECUTED
ffc0ac90 <rtems_rbheap_free>:
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
ffc0ac90: 2c 04 00 00 cmpwi r4,0
ffc0ac94: 41 82 00 f4 beq- ffc0ad88 <rtems_rbheap_free+0xf8>
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
ffc0ac98: 94 21 ff c0 stwu r1,-64(r1)
ffc0ac9c: 7c 08 02 a6 mflr r0
#define NULL_PAGE rtems_rbheap_chunk_of_node(NULL)
static rtems_rbheap_chunk *find(rtems_rbtree_control *chunk_tree, uintptr_t key)
{
rtems_rbheap_chunk chunk = { .begin = key };
ffc0aca0: 39 20 00 00 li r9,0
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
ffc0aca4: 90 01 00 44 stw r0,68(r1)
ffc0aca8: 93 e1 00 3c stw r31,60(r1)
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
ffc0acac: 83 e3 00 1c lwz r31,28(r3)
ffc0acb0: 93 81 00 30 stw r28,48(r1)
ffc0acb4: 7c 7c 1b 78 mr r28,r3
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
ffc0acb8: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0acbc: 93 c1 00 38 stw r30,56(r1)
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
ffc0acc0: 3b c3 00 18 addi r30,r3,24
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
ffc0acc4: 93 61 00 2c stw r27,44(r1)
ffc0acc8: 93 a1 00 34 stw r29,52(r1)
#define NULL_PAGE rtems_rbheap_chunk_of_node(NULL)
static rtems_rbheap_chunk *find(rtems_rbtree_control *chunk_tree, uintptr_t key)
{
rtems_rbheap_chunk chunk = { .begin = key };
ffc0accc: 91 21 00 08 stw r9,8(r1)
ffc0acd0: 91 21 00 0c stw r9,12(r1)
ffc0acd4: 91 21 00 10 stw r9,16(r1)
ffc0acd8: 91 21 00 14 stw r9,20(r1)
ffc0acdc: 91 21 00 18 stw r9,24(r1)
ffc0ace0: 91 21 00 1c stw r9,28(r1)
ffc0ace4: 91 21 00 24 stw r9,36(r1)
ffc0ace8: 90 81 00 20 stw r4,32(r1)
ffc0acec: 41 9e 01 10 beq- cr7,ffc0adfc <rtems_rbheap_free+0x16c> <== NEVER TAKEN
ffc0acf0: 3b a0 00 00 li r29,0
compare_result = the_rbtree->compare_function(the_node, iter_node);
ffc0acf4: 81 3e 00 10 lwz r9,16(r30)
ffc0acf8: 7f e4 fb 78 mr r4,r31
ffc0acfc: 38 61 00 10 addi r3,r1,16
ffc0ad00: 7d 29 03 a6 mtctr r9
ffc0ad04: 4e 80 04 21 bctrl
if ( _RBTree_Is_equal( compare_result ) ) {
ffc0ad08: 2c 03 00 00 cmpwi r3,0
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
ffc0ad0c: 7c 6a fe 70 srawi r10,r3,31
ffc0ad10: 7d 23 50 50 subf r9,r3,r10
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
ffc0ad14: 55 29 1f 7a rlwinm r9,r9,3,29,29
ffc0ad18: 7d 3f 4a 14 add r9,r31,r9
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( _RBTree_Is_equal( compare_result ) ) {
ffc0ad1c: 40 82 00 14 bne- ffc0ad30 <rtems_rbheap_free+0xa0>
found = iter_node;
if ( the_rbtree->is_unique )
ffc0ad20: 89 5e 00 14 lbz r10,20(r30)
ffc0ad24: 7f fd fb 78 mr r29,r31
ffc0ad28: 2f 8a 00 00 cmpwi cr7,r10,0
ffc0ad2c: 40 9e 00 54 bne- cr7,ffc0ad80 <rtems_rbheap_free+0xf0> <== ALWAYS TAKEN
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
ffc0ad30: 83 e9 00 04 lwz r31,4(r9)
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
ffc0ad34: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0ad38: 40 9e ff bc bne+ cr7,ffc0acf4 <rtems_rbheap_free+0x64>
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
ffc0ad3c: 2f 9d 00 00 cmpwi cr7,r29,0
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
}
} else {
sc = RTEMS_INVALID_ID;
ffc0ad40: 38 60 00 04 li r3,4
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
ffc0ad44: 3b fd ff f8 addi r31,r29,-8
ffc0ad48: 41 9e 00 14 beq- cr7,ffc0ad5c <rtems_rbheap_free+0xcc>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
ffc0ad4c: 81 3d ff f8 lwz r9,-8(r29)
check_and_merge(free_chain, chunk_tree, chunk, succ);
add_to_chain(free_chain, chunk);
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
ffc0ad50: 38 60 00 0e li r3,14
ffc0ad54: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ad58: 41 9e 00 38 beq- cr7,ffc0ad90 <rtems_rbheap_free+0x100>
sc = RTEMS_INVALID_ID;
}
}
return sc;
}
ffc0ad5c: 80 01 00 44 lwz r0,68(r1)
ffc0ad60: 83 61 00 2c lwz r27,44(r1)
ffc0ad64: 7c 08 03 a6 mtlr r0
ffc0ad68: 83 81 00 30 lwz r28,48(r1)
ffc0ad6c: 83 a1 00 34 lwz r29,52(r1)
ffc0ad70: 83 c1 00 38 lwz r30,56(r1)
ffc0ad74: 83 e1 00 3c lwz r31,60(r1)
ffc0ad78: 38 21 00 40 addi r1,r1,64
ffc0ad7c: 4e 80 00 20 blr
compare_result = the_rbtree->compare_function(the_node, iter_node);
if ( _RBTree_Is_equal( compare_result ) ) {
found = iter_node;
if ( the_rbtree->is_unique )
ffc0ad80: 7f fd fb 78 mr r29,r31
ffc0ad84: 4b ff ff b8 b ffc0ad3c <rtems_rbheap_free+0xac>
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
ffc0ad88: 38 60 00 00 li r3,0
sc = RTEMS_INVALID_ID;
}
}
return sc;
}
ffc0ad8c: 4e 80 00 20 blr
ffc0ad90: 81 3f 00 04 lwz r9,4(r31)
ffc0ad94: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ad98: 40 9e ff c4 bne+ cr7,ffc0ad5c <rtems_rbheap_free+0xcc> <== NEVER TAKEN
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
ffc0ad9c: 38 80 00 00 li r4,0
ffc0ada0: 7f a3 eb 78 mr r3,r29
ffc0ada4: 48 00 21 f5 bl ffc0cf98 <_RBTree_Next_unprotected>
ffc0ada8: 38 80 00 01 li r4,1
ffc0adac: 7c 7b 1b 78 mr r27,r3
ffc0adb0: 7f a3 eb 78 mr r3,r29
ffc0adb4: 48 00 21 e5 bl ffc0cf98 <_RBTree_Next_unprotected>
if (chunk != NULL_PAGE) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
rtems_rbheap_chunk *pred = get_next(chunk, RBT_LEFT);
rtems_rbheap_chunk *succ = get_next(chunk, RBT_RIGHT);
check_and_merge(free_chain, chunk_tree, chunk, succ);
ffc0adb8: 7f c4 f3 78 mr r4,r30
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
ffc0adbc: 38 c3 ff f8 addi r6,r3,-8
if (chunk != NULL_PAGE) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
rtems_rbheap_chunk *pred = get_next(chunk, RBT_LEFT);
rtems_rbheap_chunk *succ = get_next(chunk, RBT_RIGHT);
check_and_merge(free_chain, chunk_tree, chunk, succ);
ffc0adc0: 7f e5 fb 78 mr r5,r31
ffc0adc4: 7f 83 e3 78 mr r3,r28
ffc0adc8: 4b ff fb 91 bl ffc0a958 <check_and_merge>
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0adcc: 81 3c 00 00 lwz r9,0(r28)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0add0: 93 9f 00 04 stw r28,4(r31)
add_to_chain(free_chain, chunk);
check_and_merge(free_chain, chunk_tree, chunk, pred);
ffc0add4: 7f 83 e3 78 mr r3,r28
ffc0add8: 7f c4 f3 78 mr r4,r30
before_node = after_node->next;
after_node->next = the_node;
ffc0addc: 93 fc 00 00 stw r31,0(r28)
ffc0ade0: 7f e5 fb 78 mr r5,r31
ffc0ade4: 38 db ff f8 addi r6,r27,-8
the_node->next = before_node;
ffc0ade8: 91 3f 00 00 stw r9,0(r31)
before_node->previous = the_node;
ffc0adec: 93 e9 00 04 stw r31,4(r9)
ffc0adf0: 4b ff fb 69 bl ffc0a958 <check_and_merge>
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
ffc0adf4: 38 60 00 00 li r3,0
ffc0adf8: 4b ff ff 64 b ffc0ad5c <rtems_rbheap_free+0xcc>
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
}
} else {
sc = RTEMS_INVALID_ID;
ffc0adfc: 38 60 00 04 li r3,4 <== NOT EXECUTED
ffc0ae00: 4b ff ff 5c b ffc0ad5c <rtems_rbheap_free+0xcc> <== NOT EXECUTED
ffc0a9dc <rtems_rbheap_initialize>:
void *handler_arg
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (alignment > 0) {
ffc0a9dc: 2c 06 00 00 cmpwi r6,0
ffc0a9e0: 40 82 00 0c bne- ffc0a9ec <rtems_rbheap_initialize+0x10>
}
} else {
sc = RTEMS_INVALID_ADDRESS;
}
} else {
sc = RTEMS_INVALID_NUMBER;
ffc0a9e4: 38 60 00 0a li r3,10
}
return sc;
}
ffc0a9e8: 4e 80 00 20 blr
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
ffc0a9ec: 7d 24 33 96 divwu r9,r4,r6
uintptr_t area_size,
uintptr_t alignment,
rtems_rbheap_extend_descriptors extend_descriptors,
void *handler_arg
)
{
ffc0a9f0: 94 21 ff e8 stwu r1,-24(r1)
ffc0a9f4: 7c 08 02 a6 mflr r0
ffc0a9f8: 93 e1 00 14 stw r31,20(r1)
ffc0a9fc: 90 01 00 1c stw r0,28(r1)
ffc0aa00: 93 a1 00 0c stw r29,12(r1)
ffc0aa04: 93 c1 00 10 stw r30,16(r1)
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
ffc0aa08: 7d 29 31 d6 mullw r9,r9,r6
ffc0aa0c: 7c 7f 1b 78 mr r31,r3
if (excess > 0) {
ffc0aa10: 7d 49 20 51 subf. r10,r9,r4
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (alignment > 0) {
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
ffc0aa14: 7c a5 22 14 add r5,r5,r4
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
ffc0aa18: 41 82 00 f0 beq- ffc0ab08 <rtems_rbheap_initialize+0x12c>
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0aa1c: 7f 84 28 40 cmplw cr7,r4,r5
insert_into_tree(chunk_tree, first);
} else {
sc = RTEMS_NO_MEMORY;
}
} else {
sc = RTEMS_INVALID_ADDRESS;
ffc0aa20: 38 60 00 09 li r3,9
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0aa24: 41 9c 00 20 blt- cr7,ffc0aa44 <rtems_rbheap_initialize+0x68>
} else {
sc = RTEMS_INVALID_NUMBER;
}
return sc;
}
ffc0aa28: 80 01 00 1c lwz r0,28(r1)
ffc0aa2c: 83 a1 00 0c lwz r29,12(r1)
ffc0aa30: 7c 08 03 a6 mtlr r0
ffc0aa34: 83 c1 00 10 lwz r30,16(r1)
ffc0aa38: 83 e1 00 14 lwz r31,20(r1)
ffc0aa3c: 38 21 00 18 addi r1,r1,24
ffc0aa40: 4e 80 00 20 blr
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
value += alignment - excess;
ffc0aa44: 7f c6 22 14 add r30,r6,r4
ffc0aa48: 7f ca f0 50 subf r30,r10,r30
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0aa4c: 7f 84 f0 40 cmplw cr7,r4,r30
ffc0aa50: 41 9d ff d8 bgt+ cr7,ffc0aa28 <rtems_rbheap_initialize+0x4c><== NEVER TAKEN
return value;
}
static uintptr_t align_down(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
ffc0aa54: 7c a5 33 96 divwu r5,r5,r6
return value - excess;
ffc0aa58: 7f a5 31 d6 mullw r29,r5,r6
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0aa5c: 7f 9d f0 40 cmplw cr7,r29,r30
insert_into_tree(chunk_tree, first);
} else {
sc = RTEMS_NO_MEMORY;
}
} else {
sc = RTEMS_INVALID_ADDRESS;
ffc0aa60: 38 60 00 09 li r3,9
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0aa64: 40 9d ff c4 ble+ cr7,ffc0aa28 <rtems_rbheap_initialize+0x4c>
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
ffc0aa68: 39 20 00 00 li r9,0
tail->previous = head;
ffc0aa6c: 93 ff 00 08 stw r31,8(r31)
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 );
ffc0aa70: 38 9f 00 04 addi r4,r31,4
head->next = tail;
head->previous = NULL;
ffc0aa74: 91 3f 00 04 stw r9,4(r31)
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 );
ffc0aa78: 39 5f 00 0c addi r10,r31,12
ffc0aa7c: 38 bf 00 10 addi r5,r31,16
head->next = tail;
head->previous = NULL;
ffc0aa80: 91 3f 00 10 stw r9,16(r31)
rtems_rbtree_initialize_empty(chunk_tree, chunk_compare, true);
control->alignment = alignment;
control->handler_arg = handler_arg;
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
ffc0aa84: 7f e3 fb 78 mr r3,r31
RBTree_Control *the_rbtree,
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
ffc0aa88: 91 3f 00 18 stw r9,24(r31)
the_rbtree->root = NULL;
ffc0aa8c: 91 3f 00 1c stw r9,28(r31)
the_rbtree->first[0] = NULL;
ffc0aa90: 91 3f 00 20 stw r9,32(r31)
the_rbtree->first[1] = NULL;
ffc0aa94: 91 3f 00 24 stw r9,36(r31)
the_rbtree->compare_function = compare_function;
ffc0aa98: 3d 20 ff c1 lis r9,-63
ffc0aa9c: 39 29 a8 b8 addi r9,r9,-22344
ffc0aaa0: 91 3f 00 28 stw r9,40(r31)
the_rbtree->is_unique = is_unique;
ffc0aaa4: 39 20 00 01 li r9,1
ffc0aaa8: 99 3f 00 2c stb r9,44(r31)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ffc0aaac: 90 9f 00 00 stw r4,0(r31)
ffc0aab0: 90 bf 00 0c stw r5,12(r31)
head->previous = NULL;
tail->previous = head;
ffc0aab4: 91 5f 00 14 stw r10,20(r31)
rtems_rbheap_chunk *first = NULL;
rtems_chain_initialize_empty(free_chain);
rtems_chain_initialize_empty(&control->spare_descriptor_chain);
rtems_rbtree_initialize_empty(chunk_tree, chunk_compare, true);
control->alignment = alignment;
ffc0aab8: 90 df 00 30 stw r6,48(r31)
control->handler_arg = handler_arg;
ffc0aabc: 91 1f 00 38 stw r8,56(r31)
control->extend_descriptors = extend_descriptors;
ffc0aac0: 90 ff 00 34 stw r7,52(r31)
first = get_chunk(control);
ffc0aac4: 4b ff fe 05 bl ffc0a8c8 <get_chunk>
if (first != NULL) {
ffc0aac8: 7c 69 1b 79 mr. r9,r3
first->begin = aligned_begin;
first->size = aligned_end - aligned_begin;
add_to_chain(free_chain, first);
insert_into_tree(chunk_tree, first);
} else {
sc = RTEMS_NO_MEMORY;
ffc0aacc: 38 60 00 1a li r3,26
control->alignment = alignment;
control->handler_arg = handler_arg;
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
if (first != NULL) {
ffc0aad0: 41 a2 ff 58 beq- ffc0aa28 <rtems_rbheap_initialize+0x4c>
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
ffc0aad4: 81 5f 00 00 lwz r10,0(r31)
first->begin = aligned_begin;
first->size = aligned_end - aligned_begin;
ffc0aad8: 7f be e8 50 subf r29,r30,r29
control->handler_arg = handler_arg;
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
if (first != NULL) {
first->begin = aligned_begin;
ffc0aadc: 93 c9 00 18 stw r30,24(r9)
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
ffc0aae0: 38 7f 00 18 addi r3,r31,24
ffc0aae4: 38 89 00 08 addi r4,r9,8
control->extend_descriptors = extend_descriptors;
first = get_chunk(control);
if (first != NULL) {
first->begin = aligned_begin;
first->size = aligned_end - aligned_begin;
ffc0aae8: 93 a9 00 1c stw r29,28(r9)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
ffc0aaec: 93 e9 00 04 stw r31,4(r9)
before_node = after_node->next;
after_node->next = the_node;
ffc0aaf0: 91 3f 00 00 stw r9,0(r31)
the_node->next = before_node;
before_node->previous = the_node;
ffc0aaf4: 91 2a 00 04 stw r9,4(r10)
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
ffc0aaf8: 91 49 00 00 stw r10,0(r9)
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
ffc0aafc: 48 00 20 85 bl ffc0cb80 <_RBTree_Insert_unprotected>
uintptr_t alignment,
rtems_rbheap_extend_descriptors extend_descriptors,
void *handler_arg
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
ffc0ab00: 38 60 00 00 li r3,0
ffc0ab04: 4b ff ff 24 b ffc0aa28 <rtems_rbheap_initialize+0x4c>
return value;
}
static uintptr_t align_down(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
ffc0ab08: 7f a5 33 96 divwu r29,r5,r6
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0ab0c: 7f 84 28 40 cmplw cr7,r4,r5
static uintptr_t align_down(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
return value - excess;
ffc0ab10: 7f bd 31 d6 mullw r29,r29,r6
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0ab14: 41 9c 00 0c blt- cr7,ffc0ab20 <rtems_rbheap_initialize+0x144>
insert_into_tree(chunk_tree, first);
} else {
sc = RTEMS_NO_MEMORY;
}
} else {
sc = RTEMS_INVALID_ADDRESS;
ffc0ab18: 38 60 00 09 li r3,9
ffc0ab1c: 4b ff ff 0c b ffc0aa28 <rtems_rbheap_initialize+0x4c>
uintptr_t begin = (uintptr_t) area_begin;
uintptr_t end = begin + area_size;
uintptr_t aligned_begin = align_up(alignment, begin);
uintptr_t aligned_end = align_down(alignment, end);
if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) {
ffc0ab20: 7c 9e 23 78 mr r30,r4
ffc0ab24: 4b ff ff 38 b ffc0aa5c <rtems_rbheap_initialize+0x80>
ffc1be94 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
ffc1be94: 94 21 ff e0 stwu r1,-32(r1)
ffc1be98: 7c 08 02 a6 mflr r0
ffc1be9c: 93 e1 00 1c stw r31,28(r1)
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
ffc1bea0: 7c 9f 23 79 mr. r31,r4
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
ffc1bea4: 90 01 00 24 stw r0,36(r1)
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
ffc1bea8: 40 82 00 1c bne- ffc1bec4 <rtems_signal_send+0x30>
return RTEMS_INVALID_NUMBER;
ffc1beac: 38 60 00 0a li r3,10
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1beb0: 80 01 00 24 lwz r0,36(r1)
ffc1beb4: 83 e1 00 1c lwz r31,28(r1)
ffc1beb8: 7c 08 03 a6 mtlr r0
ffc1bebc: 38 21 00 20 addi r1,r1,32
ffc1bec0: 4e 80 00 20 blr
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
ffc1bec4: 38 81 00 08 addi r4,r1,8
ffc1bec8: 48 00 5b e5 bl ffc21aac <_Thread_Get>
switch ( location ) {
ffc1becc: 81 21 00 08 lwz r9,8(r1)
ffc1bed0: 2f 89 00 00 cmpwi cr7,r9,0
ffc1bed4: 40 9e 00 6c bne- cr7,ffc1bf40 <rtems_signal_send+0xac>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
ffc1bed8: 81 23 01 4c lwz r9,332(r3)
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
ffc1bedc: 81 49 00 0c lwz r10,12(r9)
ffc1bee0: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1bee4: 41 9e 00 74 beq- cr7,ffc1bf58 <rtems_signal_send+0xc4>
if ( asr->is_enabled ) {
ffc1bee8: 89 49 00 08 lbz r10,8(r9)
ffc1beec: 2f 8a 00 00 cmpwi cr7,r10,0
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc1bef0: 7d 00 00 a6 mfmsr r8
ffc1bef4: 7d 50 42 a6 mfsprg r10,0
ffc1bef8: 7d 0a 50 78 andc r10,r8,r10
ffc1befc: 7d 40 01 24 mtmsr r10
ffc1bf00: 41 9e 00 64 beq- cr7,ffc1bf64 <rtems_signal_send+0xd0>
)
{
ISR_Level _level;
_ISR_Disable( _level );
*signal_set |= signals;
ffc1bf04: 81 49 00 14 lwz r10,20(r9)
ffc1bf08: 7d 4a fb 78 or r10,r10,r31
ffc1bf0c: 91 49 00 14 stw r10,20(r9)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc1bf10: 7d 00 01 24 mtmsr r8
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
ffc1bf14: 3d 20 00 00 lis r9,0
ffc1bf18: 39 29 75 c0 addi r9,r9,30144
ffc1bf1c: 81 49 00 08 lwz r10,8(r9)
ffc1bf20: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1bf24: 41 9e 00 10 beq- cr7,ffc1bf34 <rtems_signal_send+0xa0>
ffc1bf28: 81 49 00 10 lwz r10,16(r9)
ffc1bf2c: 7f 83 50 00 cmpw cr7,r3,r10
ffc1bf30: 41 9e 00 48 beq- cr7,ffc1bf78 <rtems_signal_send+0xe4> <== ALWAYS TAKEN
_Thread_Dispatch_necessary = true;
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
ffc1bf34: 48 00 5b 5d bl ffc21a90 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc1bf38: 38 60 00 00 li r3,0
ffc1bf3c: 4b ff ff 74 b ffc1beb0 <rtems_signal_send+0x1c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1bf40: 80 01 00 24 lwz r0,36(r1)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc1bf44: 38 60 00 04 li r3,4
}
ffc1bf48: 83 e1 00 1c lwz r31,28(r1)
ffc1bf4c: 7c 08 03 a6 mtlr r0
ffc1bf50: 38 21 00 20 addi r1,r1,32
ffc1bf54: 4e 80 00 20 blr
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
ffc1bf58: 48 00 5b 39 bl ffc21a90 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
ffc1bf5c: 38 60 00 0b li r3,11
ffc1bf60: 4b ff ff 50 b ffc1beb0 <rtems_signal_send+0x1c>
ffc1bf64: 81 49 00 18 lwz r10,24(r9)
ffc1bf68: 7d 4a fb 78 or r10,r10,r31
ffc1bf6c: 91 49 00 18 stw r10,24(r9)
ffc1bf70: 7d 00 01 24 mtmsr r8
ffc1bf74: 4b ff ff c0 b ffc1bf34 <rtems_signal_send+0xa0>
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
if ( asr->is_enabled ) {
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
ffc1bf78: 39 40 00 01 li r10,1
ffc1bf7c: 99 49 00 0c stb r10,12(r9)
ffc1bf80: 4b ff ff b4 b ffc1bf34 <rtems_signal_send+0xa0>
ffc153b8 <rtems_task_mode>:
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
ffc153b8: 2c 05 00 00 cmpwi r5,0
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
ffc153bc: 94 21 ff f8 stwu r1,-8(r1)
ffc153c0: 7c 08 02 a6 mflr r0
ffc153c4: 90 01 00 0c stw r0,12(r1)
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
ffc153c8: 41 82 01 b4 beq- ffc1557c <rtems_task_mode+0x1c4>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
ffc153cc: 3d 60 00 00 lis r11,0
ffc153d0: 39 6b 32 00 addi r11,r11,12800
ffc153d4: 81 2b 00 10 lwz r9,16(r11)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
ffc153d8: 81 49 00 78 lwz r10,120(r9)
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
ffc153dc: 88 e9 00 70 lbz r7,112(r9)
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
ffc153e0: 2f 8a 00 00 cmpwi cr7,r10,0
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
ffc153e4: 81 49 01 4c lwz r10,332(r9)
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
ffc153e8: 7c e7 00 34 cntlzw r7,r7
ffc153ec: 54 e7 d9 7e rlwinm r7,r7,27,5,31
ffc153f0: 54 e6 40 2e rlwinm r6,r7,8,0,23
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
ffc153f4: 40 9e 01 08 bne- cr7,ffc154fc <rtems_task_mode+0x144>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
ffc153f8: 88 ea 00 08 lbz r7,8(r10)
#ifndef ASM
static inline uint32_t _CPU_ISR_Get_level( void )
{
register unsigned int msr;
_CPU_MSR_GET(msr);
ffc153fc: 39 00 00 00 li r8,0
ffc15400: 7c e7 00 34 cntlzw r7,r7
ffc15404: 54 e7 d9 7e rlwinm r7,r7,27,5,31
ffc15408: 54 e7 50 2a rlwinm r7,r7,10,0,21
ffc1540c: 7c e6 33 78 or r6,r7,r6
ffc15410: 7d 00 00 a6 mfmsr r8
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
ffc15414: 70 87 01 00 andi. r7,r4,256
if (msr & MSR_EE) return 0;
ffc15418: 69 08 80 00 xori r8,r8,32768
ffc1541c: 55 08 8f fe rlwinm r8,r8,17,31,31
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
old_mode |= _ISR_Get_level();
ffc15420: 7c c6 43 78 or r6,r6,r8
*previous_mode_set = old_mode;
ffc15424: 90 c5 00 00 stw r6,0(r5)
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
ffc15428: 41 82 00 10 beq- ffc15438 <rtems_task_mode+0x80>
ffc1542c: 68 68 01 00 xori r8,r3,256
ffc15430: 55 08 c7 fe rlwinm r8,r8,24,31,31
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
ffc15434: 99 09 00 70 stb r8,112(r9)
if ( mask & RTEMS_TIMESLICE_MASK ) {
ffc15438: 70 88 02 00 andi. r8,r4,512
ffc1543c: 41 82 00 20 beq- ffc1545c <rtems_task_mode+0xa4>
if ( _Modes_Is_timeslice(mode_set) ) {
ffc15440: 70 68 02 00 andi. r8,r3,512
ffc15444: 41 82 01 4c beq- ffc15590 <rtems_task_mode+0x1d8>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
ffc15448: 3d 00 00 00 lis r8,0
ffc1544c: 81 08 28 1c lwz r8,10268(r8)
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;
ffc15450: 38 e0 00 01 li r7,1
ffc15454: 90 e9 00 78 stw r7,120(r9)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
ffc15458: 91 09 00 74 stw r8,116(r9)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
ffc1545c: 70 89 00 01 andi. r9,r4,1
ffc15460: 41 82 00 20 beq- ffc15480 <rtems_task_mode+0xc8>
}
static inline void _CPU_ISR_Set_level( uint32_t level )
{
register unsigned int msr;
_CPU_MSR_GET(msr);
ffc15464: 39 20 00 00 li r9,0
ffc15468: 7d 20 00 a6 mfmsr r9
static inline uint32_t ppc_interrupt_get_disable_mask( void )
{
uint32_t mask;
__asm__ volatile (
ffc1546c: 7d 10 42 a6 mfsprg r8,0
if (!(level & CPU_MODES_INTERRUPT_MASK)) {
ffc15470: 70 67 00 01 andi. r7,r3,1
ffc15474: 40 82 01 2c bne- ffc155a0 <rtems_task_mode+0x1e8>
msr |= ppc_interrupt_get_disable_mask();
ffc15478: 7d 09 4b 78 or r9,r8,r9
}
else {
msr &= ~ppc_interrupt_get_disable_mask();
}
_CPU_MSR_SET(msr);
ffc1547c: 7d 20 01 24 mtmsr r9
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
ffc15480: 70 88 04 00 andi. r8,r4,1024
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
ffc15484: 39 00 00 00 li r8,0
if ( mask & RTEMS_ASR_MASK ) {
ffc15488: 41 82 00 50 beq- ffc154d8 <rtems_task_mode+0x120>
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
ffc1548c: 68 63 04 00 xori r3,r3,1024
if ( is_asr_enabled != asr->is_enabled ) {
ffc15490: 89 2a 00 08 lbz r9,8(r10)
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
ffc15494: 54 63 b7 fe rlwinm r3,r3,22,31,31
if ( is_asr_enabled != asr->is_enabled ) {
ffc15498: 7f 89 18 00 cmpw cr7,r9,r3
ffc1549c: 41 9e 00 3c beq- cr7,ffc154d8 <rtems_task_mode+0x120>
asr->is_enabled = is_asr_enabled;
ffc154a0: 98 6a 00 08 stb r3,8(r10)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc154a4: 7d 00 00 a6 mfmsr r8
ffc154a8: 7d 30 42 a6 mfsprg r9,0
ffc154ac: 7d 09 48 78 andc r9,r8,r9
ffc154b0: 7d 20 01 24 mtmsr r9
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
ffc154b4: 81 2a 00 18 lwz r9,24(r10)
information->signals_pending = information->signals_posted;
ffc154b8: 80 ea 00 14 lwz r7,20(r10)
information->signals_posted = _signals;
ffc154bc: 91 2a 00 14 stw r9,20(r10)
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
information->signals_pending = information->signals_posted;
ffc154c0: 90 ea 00 18 stw r7,24(r10)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc154c4: 7d 00 01 24 mtmsr r8
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
ffc154c8: 81 0a 00 14 lwz r8,20(r10)
ffc154cc: 7d 08 00 34 cntlzw r8,r8
ffc154d0: 55 08 d9 7e rlwinm r8,r8,27,5,31
ffc154d4: 69 08 00 01 xori r8,r8,1
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
ffc154d8: 3d 20 00 00 lis r9,0
ffc154dc: 81 29 28 48 lwz r9,10312(r9)
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
ffc154e0: 38 60 00 00 li r3,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
ffc154e4: 2f 89 00 03 cmpwi cr7,r9,3
ffc154e8: 41 9e 00 50 beq- cr7,ffc15538 <rtems_task_mode+0x180>
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
ffc154ec: 80 01 00 0c lwz r0,12(r1)
ffc154f0: 38 21 00 08 addi r1,r1,8
ffc154f4: 7c 08 03 a6 mtlr r0
ffc154f8: 4e 80 00 20 blr
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;
ffc154fc: 88 ea 00 08 lbz r7,8(r10)
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;
ffc15500: 60 c6 02 00 ori r6,r6,512
#ifndef ASM
static inline uint32_t _CPU_ISR_Get_level( void )
{
register unsigned int msr;
_CPU_MSR_GET(msr);
ffc15504: 39 00 00 00 li r8,0
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
ffc15508: 7c e7 00 34 cntlzw r7,r7
ffc1550c: 54 e7 d9 7e rlwinm r7,r7,27,5,31
ffc15510: 54 e7 50 2a rlwinm r7,r7,10,0,21
ffc15514: 7c e6 33 78 or r6,r7,r6
ffc15518: 7d 00 00 a6 mfmsr r8
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
ffc1551c: 70 87 01 00 andi. r7,r4,256
if (msr & MSR_EE) return 0;
ffc15520: 69 08 80 00 xori r8,r8,32768
ffc15524: 55 08 8f fe rlwinm r8,r8,17,31,31
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
old_mode |= _ISR_Get_level();
ffc15528: 7c c6 43 78 or r6,r6,r8
*previous_mode_set = old_mode;
ffc1552c: 90 c5 00 00 stw r6,0(r5)
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
ffc15530: 41 a2 ff 08 beq- ffc15438 <rtems_task_mode+0x80>
ffc15534: 4b ff fe f8 b ffc1542c <rtems_task_mode+0x74>
{
Thread_Control *executing;
executing = _Thread_Executing;
if ( are_signals_pending ||
ffc15538: 2f 88 00 00 cmpwi cr7,r8,0
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
ffc1553c: 81 2b 00 10 lwz r9,16(r11)
if ( are_signals_pending ||
ffc15540: 40 9e 00 1c bne- cr7,ffc1555c <rtems_task_mode+0x1a4>
ffc15544: 81 4b 00 14 lwz r10,20(r11)
ffc15548: 7f 89 50 00 cmpw cr7,r9,r10
ffc1554c: 41 be ff a0 beq- cr7,ffc154ec <rtems_task_mode+0x134>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
ffc15550: 89 29 00 70 lbz r9,112(r9)
ffc15554: 2f 89 00 00 cmpwi cr7,r9,0
ffc15558: 41 be ff 94 beq- cr7,ffc154ec <rtems_task_mode+0x134> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
ffc1555c: 39 20 00 01 li r9,1
ffc15560: 99 2b 00 0c stb r9,12(r11)
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
ffc15564: 4b ff 89 59 bl ffc0debc <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
ffc15568: 38 60 00 00 li r3,0
}
ffc1556c: 80 01 00 0c lwz r0,12(r1)
ffc15570: 38 21 00 08 addi r1,r1,8
ffc15574: 7c 08 03 a6 mtlr r0
ffc15578: 4e 80 00 20 blr
ffc1557c: 80 01 00 0c lwz r0,12(r1)
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
ffc15580: 38 60 00 09 li r3,9
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
ffc15584: 7c 08 03 a6 mtlr r0
ffc15588: 38 21 00 08 addi r1,r1,8
ffc1558c: 4e 80 00 20 blr
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;
ffc15590: 91 09 00 78 stw r8,120(r9)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
ffc15594: 70 89 00 01 andi. r9,r4,1
ffc15598: 41 a2 fe e8 beq- ffc15480 <rtems_task_mode+0xc8>
ffc1559c: 4b ff fe c8 b ffc15464 <rtems_task_mode+0xac>
_CPU_MSR_GET(msr);
if (!(level & CPU_MODES_INTERRUPT_MASK)) {
msr |= ppc_interrupt_get_disable_mask();
}
else {
msr &= ~ppc_interrupt_get_disable_mask();
ffc155a0: 7d 29 40 78 andc r9,r9,r8
}
_CPU_MSR_SET(msr);
ffc155a4: 7d 20 01 24 mtmsr r9
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
ffc155a8: 4b ff fe d8 b ffc15480 <rtems_task_mode+0xc8>
ffc0f188 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
ffc0f188: 7d 80 00 26 mfcr r12
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
ffc0f18c: 2e 04 00 00 cmpwi cr4,r4,0
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
ffc0f190: 94 21 ff d8 stwu r1,-40(r1)
ffc0f194: 7c 08 02 a6 mflr r0
ffc0f198: 93 e1 00 24 stw r31,36(r1)
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
ffc0f19c: 7c 9f 23 78 mr r31,r4
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
ffc0f1a0: 90 01 00 2c stw r0,44(r1)
ffc0f1a4: 91 81 00 20 stw r12,32(r1)
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
ffc0f1a8: 41 92 00 18 beq- cr4,ffc0f1c0 <rtems_task_set_priority+0x38>
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 ) );
ffc0f1ac: 3d 20 00 00 lis r9,0
ffc0f1b0: 89 49 27 64 lbz r10,10084(r9)
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
ffc0f1b4: 39 20 00 13 li r9,19
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
ffc0f1b8: 7f 84 50 40 cmplw cr7,r4,r10
ffc0f1bc: 41 9d 00 68 bgt- cr7,ffc0f224 <rtems_task_set_priority+0x9c>
if ( !old_priority )
ffc0f1c0: 2f 85 00 00 cmpwi cr7,r5,0
return RTEMS_INVALID_ADDRESS;
ffc0f1c4: 39 20 00 09 li r9,9
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
ffc0f1c8: 41 9e 00 5c beq- cr7,ffc0f224 <rtems_task_set_priority+0x9c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
ffc0f1cc: 38 81 00 08 addi r4,r1,8
ffc0f1d0: 90 a1 00 18 stw r5,24(r1)
ffc0f1d4: 48 00 2c f1 bl ffc11ec4 <_Thread_Get>
switch ( location ) {
ffc0f1d8: 81 21 00 08 lwz r9,8(r1)
ffc0f1dc: 80 a1 00 18 lwz r5,24(r1)
ffc0f1e0: 2f 89 00 00 cmpwi cr7,r9,0
ffc0f1e4: 40 9e 00 60 bne- cr7,ffc0f244 <rtems_task_set_priority+0xbc>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
ffc0f1e8: 81 23 00 14 lwz r9,20(r3)
ffc0f1ec: 91 25 00 00 stw r9,0(r5)
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
ffc0f1f0: 41 92 00 2c beq- cr4,ffc0f21c <rtems_task_set_priority+0x94>
the_thread->real_priority = new_priority;
if ( the_thread->resource_count == 0 ||
ffc0f1f4: 81 23 00 1c lwz r9,28(r3)
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;
ffc0f1f8: 93 e3 00 18 stw r31,24(r3)
if ( the_thread->resource_count == 0 ||
ffc0f1fc: 2f 89 00 00 cmpwi cr7,r9,0
ffc0f200: 41 9e 00 10 beq- cr7,ffc0f210 <rtems_task_set_priority+0x88>
ffc0f204: 81 23 00 14 lwz r9,20(r3)
ffc0f208: 7f 9f 48 40 cmplw cr7,r31,r9
ffc0f20c: 40 9c 00 10 bge- cr7,ffc0f21c <rtems_task_set_priority+0x94><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
ffc0f210: 7f e4 fb 78 mr r4,r31
ffc0f214: 38 a0 00 00 li r5,0
ffc0f218: 48 00 26 05 bl ffc1181c <_Thread_Change_priority>
}
_Thread_Enable_dispatch();
ffc0f21c: 48 00 2c 8d bl ffc11ea8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc0f220: 39 20 00 00 li r9,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc0f224: 80 01 00 2c lwz r0,44(r1)
ffc0f228: 7d 23 4b 78 mr r3,r9
ffc0f22c: 81 81 00 20 lwz r12,32(r1)
ffc0f230: 7c 08 03 a6 mtlr r0
ffc0f234: 83 e1 00 24 lwz r31,36(r1)
ffc0f238: 7d 80 81 20 mtcrf 8,r12
ffc0f23c: 38 21 00 28 addi r1,r1,40
ffc0f240: 4e 80 00 20 blr
ffc0f244: 80 01 00 2c lwz r0,44(r1)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc0f248: 39 20 00 04 li r9,4
}
ffc0f24c: 81 81 00 20 lwz r12,32(r1)
ffc0f250: 7d 23 4b 78 mr r3,r9
ffc0f254: 7c 08 03 a6 mtlr r0
ffc0f258: 83 e1 00 24 lwz r31,36(r1)
ffc0f25c: 7d 80 81 20 mtcrf 8,r12
ffc0f260: 38 21 00 28 addi r1,r1,40
ffc0f264: 4e 80 00 20 blr
ffc0874c <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
ffc0874c: 94 21 ff e0 stwu r1,-32(r1)
ffc08750: 7c 08 02 a6 mflr r0
ffc08754: 93 e1 00 1c stw r31,28(r1)
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
ffc08758: 7c 9f 23 79 mr. r31,r4
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
ffc0875c: 90 01 00 24 stw r0,36(r1)
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
ffc08760: 41 82 00 74 beq- ffc087d4 <rtems_task_variable_delete+0x88>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
ffc08764: 38 81 00 08 addi r4,r1,8
ffc08768: 48 00 25 b9 bl ffc0ad20 <_Thread_Get>
switch (location) {
ffc0876c: 81 21 00 08 lwz r9,8(r1)
ffc08770: 2f 89 00 00 cmpwi cr7,r9,0
ffc08774: 40 9e 00 48 bne- cr7,ffc087bc <rtems_task_variable_delete+0x70>
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
ffc08778: 81 23 01 58 lwz r9,344(r3)
while (tvp) {
ffc0877c: 2f 89 00 00 cmpwi cr7,r9,0
ffc08780: 41 9e 00 30 beq- cr7,ffc087b0 <rtems_task_variable_delete+0x64>
if (tvp->ptr == ptr) {
ffc08784: 81 49 00 04 lwz r10,4(r9)
ffc08788: 7f 8a f8 00 cmpw cr7,r10,r31
ffc0878c: 40 be 00 18 bne+ cr7,ffc087a4 <rtems_task_variable_delete+0x58>
ffc08790: 48 00 00 74 b ffc08804 <rtems_task_variable_delete+0xb8>
ffc08794: 81 44 00 04 lwz r10,4(r4)
ffc08798: 7f 8a f8 00 cmpw cr7,r10,r31
ffc0879c: 41 9e 00 50 beq- cr7,ffc087ec <rtems_task_variable_delete+0xa0>
ffc087a0: 7c 89 23 78 mr r9,r4
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
ffc087a4: 80 89 00 00 lwz r4,0(r9)
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
ffc087a8: 2f 84 00 00 cmpwi cr7,r4,0
ffc087ac: 40 9e ff e8 bne+ cr7,ffc08794 <rtems_task_variable_delete+0x48><== ALWAYS TAKEN
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
ffc087b0: 48 00 25 55 bl ffc0ad04 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
ffc087b4: 38 60 00 09 li r3,9
ffc087b8: 48 00 00 08 b ffc087c0 <rtems_task_variable_delete+0x74>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc087bc: 38 60 00 04 li r3,4
}
ffc087c0: 80 01 00 24 lwz r0,36(r1)
ffc087c4: 83 e1 00 1c lwz r31,28(r1)
ffc087c8: 7c 08 03 a6 mtlr r0
ffc087cc: 38 21 00 20 addi r1,r1,32
ffc087d0: 4e 80 00 20 blr
ffc087d4: 80 01 00 24 lwz r0,36(r1)
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
ffc087d8: 38 60 00 09 li r3,9
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc087dc: 83 e1 00 1c lwz r31,28(r1)
ffc087e0: 7c 08 03 a6 mtlr r0
ffc087e4: 38 21 00 20 addi r1,r1,32
ffc087e8: 4e 80 00 20 blr
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
ffc087ec: 81 44 00 00 lwz r10,0(r4)
ffc087f0: 91 49 00 00 stw r10,0(r9)
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
ffc087f4: 48 00 00 dd bl ffc088d0 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
ffc087f8: 48 00 25 0d bl ffc0ad04 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc087fc: 38 60 00 00 li r3,0
ffc08800: 4b ff ff c0 b ffc087c0 <rtems_task_variable_delete+0x74>
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
ffc08804: 81 49 00 00 lwz r10,0(r9)
ffc08808: 7d 24 4b 78 mr r4,r9
ffc0880c: 91 43 01 58 stw r10,344(r3)
ffc08810: 4b ff ff e4 b ffc087f4 <rtems_task_variable_delete+0xa8>
ffc08814 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
ffc08814: 94 21 ff d8 stwu r1,-40(r1)
ffc08818: 7c 08 02 a6 mflr r0
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
ffc0881c: 39 20 00 09 li r9,9
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
ffc08820: 93 e1 00 24 stw r31,36(r1)
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
ffc08824: 7c 9f 23 79 mr. r31,r4
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
ffc08828: 90 01 00 2c stw r0,44(r1)
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
ffc0882c: 41 82 00 64 beq- ffc08890 <rtems_task_variable_get+0x7c>
return RTEMS_INVALID_ADDRESS;
if ( !result )
ffc08830: 2f 85 00 00 cmpwi cr7,r5,0
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
ffc08834: 39 20 00 09 li r9,9
if ( !result )
ffc08838: 41 9e 00 58 beq- cr7,ffc08890 <rtems_task_variable_get+0x7c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
ffc0883c: 38 81 00 08 addi r4,r1,8
ffc08840: 90 a1 00 18 stw r5,24(r1)
ffc08844: 48 00 24 dd bl ffc0ad20 <_Thread_Get>
switch (location) {
ffc08848: 81 21 00 08 lwz r9,8(r1)
ffc0884c: 80 a1 00 18 lwz r5,24(r1)
ffc08850: 2f 89 00 00 cmpwi cr7,r9,0
ffc08854: 40 9e 00 54 bne- cr7,ffc088a8 <rtems_task_variable_get+0x94>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
ffc08858: 81 23 01 58 lwz r9,344(r3)
while (tvp) {
ffc0885c: 2f 89 00 00 cmpwi cr7,r9,0
ffc08860: 40 be 00 14 bne+ cr7,ffc08874 <rtems_task_variable_get+0x60>
ffc08864: 48 00 00 60 b ffc088c4 <rtems_task_variable_get+0xb0>
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
ffc08868: 81 29 00 00 lwz r9,0(r9)
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
ffc0886c: 2f 89 00 00 cmpwi cr7,r9,0
ffc08870: 41 9e 00 54 beq- cr7,ffc088c4 <rtems_task_variable_get+0xb0><== NEVER TAKEN
if (tvp->ptr == ptr) {
ffc08874: 81 49 00 04 lwz r10,4(r9)
ffc08878: 7f 8a f8 00 cmpw cr7,r10,r31
ffc0887c: 40 9e ff ec bne+ cr7,ffc08868 <rtems_task_variable_get+0x54>
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
ffc08880: 81 29 00 0c lwz r9,12(r9)
ffc08884: 91 25 00 00 stw r9,0(r5)
_Thread_Enable_dispatch();
ffc08888: 48 00 24 7d bl ffc0ad04 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc0888c: 39 20 00 00 li r9,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc08890: 80 01 00 2c lwz r0,44(r1)
ffc08894: 7d 23 4b 78 mr r3,r9
ffc08898: 83 e1 00 24 lwz r31,36(r1)
ffc0889c: 7c 08 03 a6 mtlr r0
ffc088a0: 38 21 00 28 addi r1,r1,40
ffc088a4: 4e 80 00 20 blr
ffc088a8: 80 01 00 2c lwz r0,44(r1)
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc088ac: 39 20 00 04 li r9,4
}
ffc088b0: 83 e1 00 24 lwz r31,36(r1)
ffc088b4: 7d 23 4b 78 mr r3,r9
ffc088b8: 7c 08 03 a6 mtlr r0
ffc088bc: 38 21 00 28 addi r1,r1,40
ffc088c0: 4e 80 00 20 blr
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
ffc088c4: 48 00 24 41 bl ffc0ad04 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
ffc088c8: 39 20 00 09 li r9,9
ffc088cc: 4b ff ff c4 b ffc08890 <rtems_task_variable_get+0x7c>
ffc1cc7c <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
ffc1cc7c: 94 21 ff e8 stwu r1,-24(r1)
ffc1cc80: 7c 08 02 a6 mflr r0
ffc1cc84: 7c 64 1b 78 mr r4,r3
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
ffc1cc88: 3c 60 00 00 lis r3,0
ffc1cc8c: 90 01 00 1c stw r0,28(r1)
ffc1cc90: 38 63 7a 1c addi r3,r3,31260
ffc1cc94: 38 a1 00 08 addi r5,r1,8
ffc1cc98: 48 00 3d 11 bl ffc209a8 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
ffc1cc9c: 81 21 00 08 lwz r9,8(r1)
ffc1cca0: 2f 89 00 00 cmpwi cr7,r9,0
ffc1cca4: 40 9e 00 30 bne- cr7,ffc1ccd4 <rtems_timer_cancel+0x58>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
ffc1cca8: 81 23 00 38 lwz r9,56(r3)
ffc1ccac: 2f 89 00 04 cmpwi cr7,r9,4
ffc1ccb0: 41 9e 00 0c beq- cr7,ffc1ccbc <rtems_timer_cancel+0x40> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
ffc1ccb4: 38 63 00 10 addi r3,r3,16
ffc1ccb8: 48 00 61 b1 bl ffc22e68 <_Watchdog_Remove>
_Thread_Enable_dispatch();
ffc1ccbc: 48 00 4d d5 bl ffc21a90 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1ccc0: 80 01 00 1c lwz r0,28(r1)
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
(void) _Watchdog_Remove( &the_timer->Ticker );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
ffc1ccc4: 38 60 00 00 li r3,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1ccc8: 7c 08 03 a6 mtlr r0
ffc1cccc: 38 21 00 18 addi r1,r1,24
ffc1ccd0: 4e 80 00 20 blr
ffc1ccd4: 80 01 00 1c lwz r0,28(r1)
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc1ccd8: 38 60 00 04 li r3,4
}
ffc1ccdc: 7c 08 03 a6 mtlr r0
ffc1cce0: 38 21 00 18 addi r1,r1,24
ffc1cce4: 4e 80 00 20 blr
ffc1d3e8 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
ffc1d3e8: 94 21 ff c0 stwu r1,-64(r1)
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
ffc1d3ec: 3d 20 00 00 lis r9,0
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
ffc1d3f0: 7c 08 02 a6 mflr r0
ffc1d3f4: 93 e1 00 3c stw r31,60(r1)
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
ffc1d3f8: 83 e9 29 80 lwz r31,10624(r9)
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
ffc1d3fc: 90 01 00 44 stw r0,68(r1)
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
ffc1d400: 2f 9f 00 00 cmpwi cr7,r31,0
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
ffc1d404: 93 01 00 20 stw r24,32(r1)
ffc1d408: 93 21 00 24 stw r25,36(r1)
ffc1d40c: 93 41 00 28 stw r26,40(r1)
ffc1d410: 93 61 00 2c stw r27,44(r1)
ffc1d414: 93 81 00 30 stw r28,48(r1)
ffc1d418: 93 a1 00 34 stw r29,52(r1)
ffc1d41c: 93 c1 00 38 stw r30,56(r1)
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
ffc1d420: 41 9e 00 b0 beq- cr7,ffc1d4d0 <rtems_timer_server_fire_when+0xe8>
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
ffc1d424: 3f c0 00 00 lis r30,0
ffc1d428: 3b de 70 80 addi r30,r30,28800
ffc1d42c: 89 5e 00 14 lbz r10,20(r30)
ffc1d430: 7c 7c 1b 78 mr r28,r3
return RTEMS_NOT_DEFINED;
ffc1d434: 38 60 00 0b li r3,11
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
ffc1d438: 2f 8a 00 00 cmpwi cr7,r10,0
ffc1d43c: 40 9e 00 34 bne- cr7,ffc1d470 <rtems_timer_server_fire_when+0x88><== ALWAYS TAKEN
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1d440: 80 01 00 44 lwz r0,68(r1)
ffc1d444: 83 01 00 20 lwz r24,32(r1)
ffc1d448: 7c 08 03 a6 mtlr r0
ffc1d44c: 83 21 00 24 lwz r25,36(r1)
ffc1d450: 83 41 00 28 lwz r26,40(r1)
ffc1d454: 83 61 00 2c lwz r27,44(r1)
ffc1d458: 83 81 00 30 lwz r28,48(r1)
ffc1d45c: 83 a1 00 34 lwz r29,52(r1)
ffc1d460: 83 c1 00 38 lwz r30,56(r1)
ffc1d464: 83 e1 00 3c lwz r31,60(r1)
ffc1d468: 38 21 00 40 addi r1,r1,64
ffc1d46c: 4e 80 00 20 blr
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
ffc1d470: 2f 85 00 00 cmpwi cr7,r5,0
ffc1d474: 7c bd 2b 78 mr r29,r5
return RTEMS_INVALID_ADDRESS;
ffc1d478: 38 60 00 09 li r3,9
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
ffc1d47c: 41 be ff c4 beq- cr7,ffc1d440 <rtems_timer_server_fire_when+0x58>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
ffc1d480: 7c 83 23 78 mr r3,r4
ffc1d484: 90 81 00 18 stw r4,24(r1)
ffc1d488: 7c db 33 78 mr r27,r6
ffc1d48c: 4b ff bb 45 bl ffc18fd0 <_TOD_Validate>
ffc1d490: 2f 83 00 00 cmpwi cr7,r3,0
ffc1d494: 80 81 00 18 lwz r4,24(r1)
ffc1d498: 40 9e 00 6c bne- cr7,ffc1d504 <rtems_timer_server_fire_when+0x11c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1d49c: 80 01 00 44 lwz r0,68(r1)
if ( !routine )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
ffc1d4a0: 38 60 00 14 li r3,20
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1d4a4: 83 01 00 20 lwz r24,32(r1)
ffc1d4a8: 7c 08 03 a6 mtlr r0
ffc1d4ac: 83 21 00 24 lwz r25,36(r1)
ffc1d4b0: 83 41 00 28 lwz r26,40(r1)
ffc1d4b4: 83 61 00 2c lwz r27,44(r1)
ffc1d4b8: 83 81 00 30 lwz r28,48(r1)
ffc1d4bc: 83 a1 00 34 lwz r29,52(r1)
ffc1d4c0: 83 c1 00 38 lwz r30,56(r1)
ffc1d4c4: 83 e1 00 3c lwz r31,60(r1)
ffc1d4c8: 38 21 00 40 addi r1,r1,64
ffc1d4cc: 4e 80 00 20 blr
ffc1d4d0: 80 01 00 44 lwz r0,68(r1)
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
ffc1d4d4: 38 60 00 0e li r3,14
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
ffc1d4d8: 83 01 00 20 lwz r24,32(r1)
ffc1d4dc: 7c 08 03 a6 mtlr r0
ffc1d4e0: 83 21 00 24 lwz r25,36(r1)
ffc1d4e4: 83 41 00 28 lwz r26,40(r1)
ffc1d4e8: 83 61 00 2c lwz r27,44(r1)
ffc1d4ec: 83 81 00 30 lwz r28,48(r1)
ffc1d4f0: 83 a1 00 34 lwz r29,52(r1)
ffc1d4f4: 83 c1 00 38 lwz r30,56(r1)
ffc1d4f8: 83 e1 00 3c lwz r31,60(r1)
ffc1d4fc: 38 21 00 40 addi r1,r1,64
ffc1d500: 4e 80 00 20 blr
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
ffc1d504: 7c 83 23 78 mr r3,r4
ffc1d508: 4b ff ba 15 bl ffc18f1c <_TOD_To_seconds>
ffc1d50c: 80 9e 00 04 lwz r4,4(r30)
ffc1d510: 7c 7a 1b 78 mr r26,r3
ffc1d514: 80 7e 00 00 lwz r3,0(r30)
ffc1d518: 3c c0 3b 9a lis r6,15258
ffc1d51c: 38 a0 00 00 li r5,0
ffc1d520: 60 c6 ca 00 ori r6,r6,51712
ffc1d524: 48 01 64 a1 bl ffc339c4 <__divdi3>
if ( seconds <= _TOD_Seconds_since_epoch() )
ffc1d528: 7f 9a 20 40 cmplw cr7,r26,r4
ffc1d52c: 40 9d ff 70 ble+ cr7,ffc1d49c <rtems_timer_server_fire_when+0xb4>
ffc1d530: 3c 60 00 00 lis r3,0
ffc1d534: 38 63 7a 1c addi r3,r3,31260
ffc1d538: 7f 84 e3 78 mr r4,r28
ffc1d53c: 38 a1 00 08 addi r5,r1,8
ffc1d540: 48 00 34 69 bl ffc209a8 <_Objects_Get>
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
ffc1d544: 83 01 00 08 lwz r24,8(r1)
ffc1d548: 7c 79 1b 78 mr r25,r3
ffc1d54c: 2f 98 00 00 cmpwi cr7,r24,0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
ffc1d550: 38 60 00 04 li r3,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 ) {
ffc1d554: 40 be fe ec bne- cr7,ffc1d440 <rtems_timer_server_fire_when+0x58>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
ffc1d558: 38 79 00 10 addi r3,r25,16
ffc1d55c: 48 00 59 0d bl ffc22e68 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
ffc1d560: 39 20 00 03 li r9,3
ffc1d564: 80 7e 00 00 lwz r3,0(r30)
ffc1d568: 3c c0 3b 9a lis r6,15258
ffc1d56c: 80 9e 00 04 lwz r4,4(r30)
ffc1d570: 38 a0 00 00 li r5,0
ffc1d574: 91 39 00 38 stw r9,56(r25)
ffc1d578: 60 c6 ca 00 ori r6,r6,51712
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
ffc1d57c: 93 19 00 18 stw r24,24(r25)
the_watchdog->routine = routine;
ffc1d580: 93 b9 00 2c stw r29,44(r25)
the_watchdog->id = id;
ffc1d584: 93 99 00 30 stw r28,48(r25)
the_watchdog->user_data = user_data;
ffc1d588: 93 79 00 34 stw r27,52(r25)
ffc1d58c: 48 01 64 39 bl ffc339c4 <__divdi3>
_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 );
ffc1d590: 81 3f 00 04 lwz r9,4(r31)
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
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();
ffc1d594: 7f 44 d0 50 subf r26,r4,r26
(*timer_server->schedule_operation)( timer_server, the_timer );
ffc1d598: 7f e3 fb 78 mr r3,r31
ffc1d59c: 7d 29 03 a6 mtctr r9
ffc1d5a0: 7f 24 cb 78 mr r4,r25
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
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();
ffc1d5a4: 93 59 00 1c stw r26,28(r25)
(*timer_server->schedule_operation)( timer_server, the_timer );
ffc1d5a8: 4e 80 04 21 bctrl
_Thread_Enable_dispatch();
ffc1d5ac: 48 00 44 e5 bl ffc21a90 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
ffc1d5b0: 38 60 00 00 li r3,0
ffc1d5b4: 4b ff fe 8c b ffc1d440 <rtems_timer_server_fire_when+0x58>
ffc09ed8 <sched_get_priority_max>:
int sched_get_priority_max(
int policy
)
{
switch ( policy ) {
ffc09ed8: 2b 83 00 04 cmplwi cr7,r3,4
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
ffc09edc: 94 21 ff f8 stwu r1,-8(r1)
ffc09ee0: 7c 08 02 a6 mflr r0
ffc09ee4: 90 01 00 0c stw r0,12(r1)
switch ( policy ) {
ffc09ee8: 40 9d 00 24 ble- cr7,ffc09f0c <sched_get_priority_max+0x34>
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09eec: 48 00 9c 21 bl ffc13b0c <__errno>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
ffc09ef0: 80 01 00 0c lwz r0,12(r1)
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09ef4: 39 20 00 16 li r9,22
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
ffc09ef8: 7c 08 03 a6 mtlr r0
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09efc: 91 23 00 00 stw r9,0(r3)
ffc09f00: 38 60 ff ff li r3,-1
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
ffc09f04: 38 21 00 08 addi r1,r1,8
ffc09f08: 4e 80 00 20 blr
int sched_get_priority_max(
int policy
)
{
switch ( policy ) {
ffc09f0c: 39 20 00 01 li r9,1
ffc09f10: 7d 23 18 30 slw r3,r9,r3
ffc09f14: 70 69 00 17 andi. r9,r3,23
ffc09f18: 41 a2 ff d4 beq- ffc09eec <sched_get_priority_max+0x14> <== NEVER TAKEN
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
ffc09f1c: 80 01 00 0c lwz r0,12(r1)
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
ffc09f20: 3d 20 00 00 lis r9,0
ffc09f24: 88 69 27 84 lbz r3,10116(r9)
}
ffc09f28: 7c 08 03 a6 mtlr r0
ffc09f2c: 38 21 00 08 addi r1,r1,8
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
ffc09f30: 38 63 ff ff addi r3,r3,-1
}
ffc09f34: 4e 80 00 20 blr
ffc09f38 <sched_get_priority_min>:
*/
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
ffc09f38: 2b 83 00 04 cmplwi cr7,r3,4
* 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
*/
int sched_get_priority_min(
int policy
)
{
ffc09f3c: 94 21 ff f8 stwu r1,-8(r1)
ffc09f40: 7c 08 02 a6 mflr r0
ffc09f44: 90 01 00 0c stw r0,12(r1)
switch ( policy ) {
ffc09f48: 40 9d 00 28 ble- cr7,ffc09f70 <sched_get_priority_min+0x38>
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09f4c: 48 00 9b c1 bl ffc13b0c <__errno>
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
ffc09f50: 80 01 00 0c lwz r0,12(r1)
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09f54: 39 20 00 16 li r9,22
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
ffc09f58: 7c 08 03 a6 mtlr r0
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09f5c: 91 23 00 00 stw r9,0(r3)
ffc09f60: 39 20 ff ff li r9,-1
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
ffc09f64: 7d 23 4b 78 mr r3,r9
ffc09f68: 38 21 00 08 addi r1,r1,8
ffc09f6c: 4e 80 00 20 blr
*/
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
ffc09f70: 39 20 00 01 li r9,1
ffc09f74: 7d 23 18 30 slw r3,r9,r3
ffc09f78: 70 69 00 17 andi. r9,r3,23
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
ffc09f7c: 39 20 00 01 li r9,1
*/
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
ffc09f80: 41 a2 ff cc beq- ffc09f4c <sched_get_priority_min+0x14> <== NEVER TAKEN
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
ffc09f84: 80 01 00 0c lwz r0,12(r1)
ffc09f88: 7d 23 4b 78 mr r3,r9
ffc09f8c: 7c 08 03 a6 mtlr r0
ffc09f90: 38 21 00 08 addi r1,r1,8
ffc09f94: 4e 80 00 20 blr
ffc09f98 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
ffc09f98: 94 21 ff e8 stwu r1,-24(r1)
ffc09f9c: 7c 08 02 a6 mflr r0
ffc09fa0: 93 e1 00 14 stw r31,20(r1)
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
ffc09fa4: 7c 7f 1b 79 mr. r31,r3
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
ffc09fa8: 90 01 00 1c stw r0,28(r1)
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
ffc09fac: 40 82 00 30 bne- ffc09fdc <sched_rr_get_interval+0x44> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
ffc09fb0: 2f 84 00 00 cmpwi cr7,r4,0
ffc09fb4: 41 9e 00 50 beq- cr7,ffc0a004 <sched_rr_get_interval+0x6c>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
ffc09fb8: 3d 20 00 00 lis r9,0
ffc09fbc: 80 69 28 68 lwz r3,10344(r9)
ffc09fc0: 48 00 46 91 bl ffc0e650 <_Timespec_From_ticks>
return 0;
ffc09fc4: 38 60 00 00 li r3,0
}
ffc09fc8: 80 01 00 1c lwz r0,28(r1)
ffc09fcc: 83 e1 00 14 lwz r31,20(r1)
ffc09fd0: 7c 08 03 a6 mtlr r0
ffc09fd4: 38 21 00 18 addi r1,r1,24
ffc09fd8: 4e 80 00 20 blr
{
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
ffc09fdc: 90 81 00 08 stw r4,8(r1)
ffc09fe0: 4b ff af 81 bl ffc04f60 <getpid>
ffc09fe4: 7f 83 f8 00 cmpw cr7,r3,r31
ffc09fe8: 80 81 00 08 lwz r4,8(r1)
ffc09fec: 41 9e ff c4 beq+ cr7,ffc09fb0 <sched_rr_get_interval+0x18>
rtems_set_errno_and_return_minus_one( ESRCH );
ffc09ff0: 48 00 9b 1d bl ffc13b0c <__errno>
ffc09ff4: 39 20 00 03 li r9,3
ffc09ff8: 91 23 00 00 stw r9,0(r3)
ffc09ffc: 38 60 ff ff li r3,-1
ffc0a000: 4b ff ff c8 b ffc09fc8 <sched_rr_get_interval+0x30>
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc0a004: 48 00 9b 09 bl ffc13b0c <__errno>
ffc0a008: 39 20 00 16 li r9,22
ffc0a00c: 91 23 00 00 stw r9,0(r3)
ffc0a010: 38 60 ff ff li r3,-1
ffc0a014: 4b ff ff b4 b ffc09fc8 <sched_rr_get_interval+0x30>
ffc0ab64 <sem_open>:
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0ab64: 3d 20 00 00 lis r9,0
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
ffc0ab68: 94 21 ff b8 stwu r1,-72(r1)
ffc0ab6c: 7c 08 02 a6 mflr r0
ffc0ab70: 81 49 28 a8 lwz r10,10408(r9)
ffc0ab74: 7d 80 00 26 mfcr r12
ffc0ab78: 93 a1 00 3c stw r29,60(r1)
ffc0ab7c: 7c 7d 1b 78 mr r29,r3
++level;
ffc0ab80: 39 4a 00 01 addi r10,r10,1
ffc0ab84: 93 e1 00 44 stw r31,68(r1)
ffc0ab88: 7c 9f 23 78 mr r31,r4
ffc0ab8c: 90 01 00 4c stw r0,76(r1)
ffc0ab90: 93 61 00 34 stw r27,52(r1)
ffc0ab94: 93 81 00 38 stw r28,56(r1)
ffc0ab98: 93 c1 00 40 stw r30,64(r1)
ffc0ab9c: 91 81 00 30 stw r12,48(r1)
ffc0aba0: 90 a1 00 28 stw r5,40(r1)
ffc0aba4: 90 c1 00 2c stw r6,44(r1)
_Thread_Dispatch_disable_level = level;
ffc0aba8: 91 49 28 a8 stw r10,10408(r9)
Objects_Locations location;
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
ffc0abac: 54 89 bf fe rlwinm r9,r4,23,31,31
ffc0abb0: 2e 09 00 00 cmpwi cr4,r9,0
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
ffc0abb4: 3b 60 00 00 li r27,0
Objects_Locations location;
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
ffc0abb8: 40 92 00 d8 bne- cr4,ffc0ac90 <sem_open+0x12c>
const char *name,
Objects_Id *id,
size_t *len
)
{
return _POSIX_Name_to_id( &_POSIX_Semaphore_Information, name, id, len );
ffc0abbc: 3f c0 00 00 lis r30,0
ffc0abc0: 3b de 59 00 addi r30,r30,22784
ffc0abc4: 7f c3 f3 78 mr r3,r30
ffc0abc8: 7f a4 eb 78 mr r4,r29
ffc0abcc: 38 a1 00 20 addi r5,r1,32
ffc0abd0: 38 c1 00 14 addi r6,r1,20
ffc0abd4: 4b ff f7 a9 bl ffc0a37c <_POSIX_Name_to_id>
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "semaphore does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
ffc0abd8: 7c 7c 1b 79 mr. r28,r3
ffc0abdc: 41 82 00 4c beq- ffc0ac28 <sem_open+0xc4>
/*
* 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) ) ) {
ffc0abe0: 2f 9c 00 02 cmpwi cr7,r28,2
ffc0abe4: 40 9e 00 08 bne- cr7,ffc0abec <sem_open+0x88>
ffc0abe8: 40 92 00 c8 bne- cr4,ffc0acb0 <sem_open+0x14c>
_Thread_Enable_dispatch();
ffc0abec: 48 00 43 a1 bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
ffc0abf0: 48 00 ac 8d bl ffc1587c <__errno>
the_semaphore->Semaphore_id = the_semaphore->Object.id;
return &the_semaphore->Semaphore_id;
#else
return (sem_t *)&the_semaphore->Object.id;
#endif
}
ffc0abf4: 80 01 00 4c lwz r0,76(r1)
ffc0abf8: 81 81 00 30 lwz r12,48(r1)
ffc0abfc: 7c 08 03 a6 mtlr r0
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
ffc0ac00: 93 83 00 00 stw r28,0(r3)
the_semaphore->Semaphore_id = the_semaphore->Object.id;
return &the_semaphore->Semaphore_id;
#else
return (sem_t *)&the_semaphore->Object.id;
#endif
}
ffc0ac04: 7d 80 81 20 mtcrf 8,r12
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
ffc0ac08: 38 60 ff ff li r3,-1
the_semaphore->Semaphore_id = the_semaphore->Object.id;
return &the_semaphore->Semaphore_id;
#else
return (sem_t *)&the_semaphore->Object.id;
#endif
}
ffc0ac0c: 83 61 00 34 lwz r27,52(r1)
ffc0ac10: 83 81 00 38 lwz r28,56(r1)
ffc0ac14: 83 a1 00 3c lwz r29,60(r1)
ffc0ac18: 83 c1 00 40 lwz r30,64(r1)
ffc0ac1c: 83 e1 00 44 lwz r31,68(r1)
ffc0ac20: 38 21 00 48 addi r1,r1,72
ffc0ac24: 4e 80 00 20 blr
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
ffc0ac28: 73 ff 0a 00 andi. r31,r31,2560
ffc0ac2c: 2f 9f 0a 00 cmpwi cr7,r31,2560
ffc0ac30: 41 9e 00 b0 beq- cr7,ffc0ace0 <sem_open+0x17c>
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
sem_t *id,
Objects_Locations *location
)
{
return (POSIX_Semaphore_Control *)
ffc0ac34: 80 81 00 20 lwz r4,32(r1)
ffc0ac38: 38 a1 00 18 addi r5,r1,24
ffc0ac3c: 7f c3 f3 78 mr r3,r30
ffc0ac40: 48 00 31 51 bl ffc0dd90 <_Objects_Get>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( (sem_t *) &the_semaphore_id, &location );
the_semaphore->open_count += 1;
ffc0ac44: 81 23 00 18 lwz r9,24(r3)
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( (sem_t *) &the_semaphore_id, &location );
ffc0ac48: 90 61 00 1c stw r3,28(r1)
the_semaphore->open_count += 1;
ffc0ac4c: 39 29 00 01 addi r9,r9,1
ffc0ac50: 91 23 00 18 stw r9,24(r3)
_Thread_Enable_dispatch();
ffc0ac54: 48 00 43 39 bl ffc0ef8c <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
ffc0ac58: 48 00 43 35 bl ffc0ef8c <_Thread_Enable_dispatch>
return_id:
#if defined(RTEMS_USE_16_BIT_OBJECT)
the_semaphore->Semaphore_id = the_semaphore->Object.id;
return &the_semaphore->Semaphore_id;
#else
return (sem_t *)&the_semaphore->Object.id;
ffc0ac5c: 80 61 00 1c lwz r3,28(r1)
ffc0ac60: 38 63 00 08 addi r3,r3,8
#endif
}
ffc0ac64: 80 01 00 4c lwz r0,76(r1)
ffc0ac68: 81 81 00 30 lwz r12,48(r1)
ffc0ac6c: 7c 08 03 a6 mtlr r0
ffc0ac70: 83 61 00 34 lwz r27,52(r1)
ffc0ac74: 83 81 00 38 lwz r28,56(r1)
ffc0ac78: 7d 80 81 20 mtcrf 8,r12
ffc0ac7c: 83 a1 00 3c lwz r29,60(r1)
ffc0ac80: 83 c1 00 40 lwz r30,64(r1)
ffc0ac84: 83 e1 00 44 lwz r31,68(r1)
ffc0ac88: 38 21 00 48 addi r1,r1,72
ffc0ac8c: 4e 80 00 20 blr
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
ffc0ac90: 39 21 00 50 addi r9,r1,80
mode = va_arg( arg, mode_t );
value = va_arg( arg, unsigned int );
ffc0ac94: 83 61 00 2c lwz r27,44(r1)
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
ffc0ac98: 91 21 00 0c stw r9,12(r1)
ffc0ac9c: 39 21 00 20 addi r9,r1,32
ffc0aca0: 91 21 00 10 stw r9,16(r1)
mode = va_arg( arg, mode_t );
ffc0aca4: 39 20 00 03 li r9,3
ffc0aca8: 99 21 00 08 stb r9,8(r1)
ffc0acac: 4b ff ff 10 b ffc0abbc <sem_open+0x58>
/*
* 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(
ffc0acb0: 80 81 00 14 lwz r4,20(r1)
ffc0acb4: 38 a0 00 00 li r5,0
ffc0acb8: 7f 66 db 78 mr r6,r27
ffc0acbc: 38 e1 00 1c addi r7,r1,28
ffc0acc0: 7f a3 eb 78 mr r3,r29
ffc0acc4: 48 00 7b cd bl ffc12890 <_POSIX_Semaphore_Create_support>
ffc0acc8: 7c 7f 1b 78 mr r31,r3
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
ffc0accc: 48 00 42 c1 bl ffc0ef8c <_Thread_Enable_dispatch>
if ( status == -1 )
ffc0acd0: 2f 9f ff ff cmpwi cr7,r31,-1
ffc0acd4: 40 9e ff 88 bne+ cr7,ffc0ac5c <sem_open+0xf8> <== ALWAYS TAKEN
return SEM_FAILED;
ffc0acd8: 38 60 ff ff li r3,-1 <== NOT EXECUTED
ffc0acdc: 4b ff ff 88 b ffc0ac64 <sem_open+0x100> <== NOT EXECUTED
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
ffc0ace0: 48 00 42 ad bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
ffc0ace4: 48 00 ab 99 bl ffc1587c <__errno>
ffc0ace8: 39 20 00 11 li r9,17
ffc0acec: 91 23 00 00 stw r9,0(r3)
ffc0acf0: 38 60 ff ff li r3,-1
ffc0acf4: 4b ff ff 70 b ffc0ac64 <sem_open+0x100>
ffc0cc08 <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
ffc0cc08: 94 21 ff e0 stwu r1,-32(r1)
ffc0cc0c: 7c 08 02 a6 mflr r0
ffc0cc10: 93 e1 00 1c stw r31,28(r1)
ffc0cc14: 7c 7f 1b 78 mr r31,r3
*
* 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 );
ffc0cc18: 7c 83 23 78 mr r3,r4
ffc0cc1c: 38 81 00 08 addi r4,r1,8
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
ffc0cc20: 90 01 00 24 stw r0,36(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 );
ffc0cc24: 48 00 66 39 bl ffc1325c <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0cc28: 2f 83 00 03 cmpwi cr7,r3,3
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
ffc0cc2c: 80 a1 00 08 lwz r5,8(r1)
ffc0cc30: 7f e3 fb 78 mr r3,r31
* 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 );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
ffc0cc34: 41 9e 00 20 beq- cr7,ffc0cc54 <sem_timedwait+0x4c> <== ALWAYS TAKEN
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
ffc0cc38: 38 80 00 00 li r4,0 <== NOT EXECUTED
ffc0cc3c: 48 00 74 69 bl ffc140a4 <_POSIX_Semaphore_Wait_support><== NOT EXECUTED
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
ffc0cc40: 80 01 00 24 lwz r0,36(r1) <== NOT EXECUTED
ffc0cc44: 83 e1 00 1c lwz r31,28(r1) <== NOT EXECUTED
ffc0cc48: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0cc4c: 38 21 00 20 addi r1,r1,32 <== NOT EXECUTED
ffc0cc50: 4e 80 00 20 blr <== 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 );
ffc0cc54: 38 80 00 01 li r4,1
ffc0cc58: 48 00 74 4d bl ffc140a4 <_POSIX_Semaphore_Wait_support>
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
ffc0cc5c: 80 01 00 24 lwz r0,36(r1)
ffc0cc60: 83 e1 00 1c lwz r31,28(r1)
ffc0cc64: 7c 08 03 a6 mtlr r0
ffc0cc68: 38 21 00 20 addi r1,r1,32
ffc0cc6c: 4e 80 00 20 blr
ffc09e44 <sigaction>:
struct sigaction *oact
)
{
ISR_Level level;
if ( oact )
ffc09e44: 2c 05 00 00 cmpwi r5,0
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
ffc09e48: 94 21 ff e8 stwu r1,-24(r1)
ffc09e4c: 7c 08 02 a6 mflr r0
ffc09e50: 93 c1 00 10 stw r30,16(r1)
ffc09e54: 7c 9e 23 78 mr r30,r4
ffc09e58: 93 e1 00 14 stw r31,20(r1)
ffc09e5c: 7c 7f 1b 78 mr r31,r3
ffc09e60: 90 01 00 1c stw r0,28(r1)
ffc09e64: 93 a1 00 0c stw r29,12(r1)
ISR_Level level;
if ( oact )
ffc09e68: 41 82 00 2c beq- ffc09e94 <sigaction+0x50>
*oact = _POSIX_signals_Vectors[ sig ];
ffc09e6c: 1d 03 00 0c mulli r8,r3,12
ffc09e70: 3c e0 00 00 lis r7,0
ffc09e74: 38 e7 32 60 addi r7,r7,12896
ffc09e78: 7d 47 42 14 add r10,r7,r8
ffc09e7c: 7c e7 40 2e lwzx r7,r7,r8
ffc09e80: 81 0a 00 04 lwz r8,4(r10)
ffc09e84: 81 4a 00 08 lwz r10,8(r10)
ffc09e88: 90 e5 00 00 stw r7,0(r5)
ffc09e8c: 91 05 00 04 stw r8,4(r5)
ffc09e90: 91 45 00 08 stw r10,8(r5)
if ( !sig )
ffc09e94: 2f 9f 00 00 cmpwi cr7,r31,0
ffc09e98: 41 9e 00 d0 beq- cr7,ffc09f68 <sigaction+0x124>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
ffc09e9c: 39 3f ff ff addi r9,r31,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
ffc09ea0: 2b 89 00 1f cmplwi cr7,r9,31
ffc09ea4: 41 9d 00 c4 bgt- cr7,ffc09f68 <sigaction+0x124>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
ffc09ea8: 2f 9f 00 09 cmpwi cr7,r31,9
ffc09eac: 41 9e 00 bc beq- cr7,ffc09f68 <sigaction+0x124>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
ffc09eb0: 2f 9e 00 00 cmpwi cr7,r30,0
ffc09eb4: 41 9e 00 ac beq- cr7,ffc09f60 <sigaction+0x11c> <== NEVER TAKEN
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc09eb8: 7f a0 00 a6 mfmsr r29
ffc09ebc: 7d 30 42 a6 mfsprg r9,0
ffc09ec0: 7f a9 48 78 andc r9,r29,r9
ffc09ec4: 7d 20 01 24 mtmsr r9
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
ffc09ec8: 81 3e 00 08 lwz r9,8(r30)
ffc09ecc: 2f 89 00 00 cmpwi cr7,r9,0
ffc09ed0: 41 9e 00 58 beq- cr7,ffc09f28 <sigaction+0xe4>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
ffc09ed4: 7f e3 fb 78 mr r3,r31
ffc09ed8: 48 00 6c b5 bl ffc10b8c <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
ffc09edc: 1f ff 00 0c mulli r31,r31,12
ffc09ee0: 80 de 00 00 lwz r6,0(r30)
ffc09ee4: 3d 40 00 00 lis r10,0
ffc09ee8: 80 fe 00 04 lwz r7,4(r30)
ffc09eec: 81 1e 00 08 lwz r8,8(r30)
ffc09ef0: 39 4a 32 60 addi r10,r10,12896
ffc09ef4: 7d 2a fa 14 add r9,r10,r31
ffc09ef8: 7c ca f9 2e stwx r6,r10,r31
ffc09efc: 90 e9 00 04 stw r7,4(r9)
ffc09f00: 91 09 00 08 stw r8,8(r9)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc09f04: 7f a0 01 24 mtmsr r29
* 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;
ffc09f08: 38 60 00 00 li r3,0
}
ffc09f0c: 80 01 00 1c lwz r0,28(r1)
ffc09f10: 83 a1 00 0c lwz r29,12(r1)
ffc09f14: 7c 08 03 a6 mtlr r0
ffc09f18: 83 c1 00 10 lwz r30,16(r1)
ffc09f1c: 83 e1 00 14 lwz r31,20(r1)
ffc09f20: 38 21 00 18 addi r1,r1,24
ffc09f24: 4e 80 00 20 blr
* 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 ];
ffc09f28: 1f ff 00 0c mulli r31,r31,12
ffc09f2c: 3d 00 ff c2 lis r8,-62
ffc09f30: 39 08 d9 4c addi r8,r8,-9908
ffc09f34: 7d 28 fa 14 add r9,r8,r31
ffc09f38: 7d 08 f8 2e lwzx r8,r8,r31
ffc09f3c: 3d 40 00 00 lis r10,0
ffc09f40: 80 c9 00 04 lwz r6,4(r9)
ffc09f44: 39 4a 32 60 addi r10,r10,12896
ffc09f48: 80 e9 00 08 lwz r7,8(r9)
ffc09f4c: 7d 2a fa 14 add r9,r10,r31
ffc09f50: 7d 0a f9 2e stwx r8,r10,r31
ffc09f54: 90 c9 00 04 stw r6,4(r9)
ffc09f58: 90 e9 00 08 stw r7,8(r9)
ffc09f5c: 4b ff ff a8 b ffc09f04 <sigaction+0xc0>
* 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;
ffc09f60: 38 60 00 00 li r3,0 <== NOT EXECUTED
ffc09f64: 4b ff ff a8 b ffc09f0c <sigaction+0xc8> <== NOT EXECUTED
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09f68: 48 00 a0 45 bl ffc13fac <__errno>
ffc09f6c: 39 20 00 16 li r9,22
ffc09f70: 91 23 00 00 stw r9,0(r3)
ffc09f74: 38 60 ff ff li r3,-1
ffc09f78: 4b ff ff 94 b ffc09f0c <sigaction+0xc8>
ffc0a454 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
ffc0a454: 94 21 ff d0 stwu r1,-48(r1)
ffc0a458: 7c 08 02 a6 mflr r0
ffc0a45c: 93 81 00 20 stw r28,32(r1)
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
ffc0a460: 7c 7c 1b 79 mr. r28,r3
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
ffc0a464: 90 01 00 34 stw r0,52(r1)
ffc0a468: 93 41 00 18 stw r26,24(r1)
ffc0a46c: 93 61 00 1c stw r27,28(r1)
ffc0a470: 93 a1 00 24 stw r29,36(r1)
ffc0a474: 93 c1 00 28 stw r30,40(r1)
ffc0a478: 93 e1 00 2c stw r31,44(r1)
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
ffc0a47c: 41 82 02 50 beq- ffc0a6cc <sigtimedwait+0x278>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
ffc0a480: 2f 85 00 00 cmpwi cr7,r5,0
ffc0a484: 7c 9f 23 78 mr r31,r4
ffc0a488: 7c be 2b 78 mr r30,r5
ffc0a48c: 41 9e 01 9c beq- cr7,ffc0a628 <sigtimedwait+0x1d4>
if ( !_Timespec_Is_valid( timeout ) )
ffc0a490: 7c a3 2b 78 mr r3,r5
ffc0a494: 48 00 48 21 bl ffc0ecb4 <_Timespec_Is_valid>
ffc0a498: 2f 83 00 00 cmpwi cr7,r3,0
ffc0a49c: 41 9e 02 30 beq- cr7,ffc0a6cc <sigtimedwait+0x278>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
ffc0a4a0: 7f c3 f3 78 mr r3,r30
ffc0a4a4: 48 00 48 51 bl ffc0ecf4 <_Timespec_To_ticks>
if ( !interval )
ffc0a4a8: 7c 64 1b 79 mr. r4,r3
ffc0a4ac: 41 82 02 20 beq- ffc0a6cc <sigtimedwait+0x278> <== NEVER TAKEN
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
ffc0a4b0: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0a4b4: 41 9e 01 80 beq- cr7,ffc0a634 <sigtimedwait+0x1e0> <== NEVER TAKEN
the_thread = _Thread_Executing;
ffc0a4b8: 3f 60 00 00 lis r27,0
ffc0a4bc: 3b 7b 31 e0 addi r27,r27,12768
ffc0a4c0: 81 3b 00 10 lwz r9,16(r27)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc0a4c4: 83 a9 01 50 lwz r29,336(r9)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0a4c8: 7f 40 00 a6 mfmsr r26
ffc0a4cc: 7d 50 42 a6 mfsprg r10,0
ffc0a4d0: 7f 4a 50 78 andc r10,r26,r10
ffc0a4d4: 7d 40 01 24 mtmsr r10
*/
/* API signals pending? */
_ISR_Disable( level );
if ( *set & api->signals_pending ) {
ffc0a4d8: 81 5c 00 00 lwz r10,0(r28)
ffc0a4dc: 80 7d 00 d4 lwz r3,212(r29)
ffc0a4e0: 7d 48 18 39 and. r8,r10,r3
ffc0a4e4: 40 82 01 84 bne- ffc0a668 <sigtimedwait+0x214>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
ffc0a4e8: 3d 00 00 00 lis r8,0
ffc0a4ec: 80 68 29 04 lwz r3,10500(r8)
ffc0a4f0: 7d 48 18 39 and. r8,r10,r3
ffc0a4f4: 40 82 00 d0 bne- ffc0a5c4 <sigtimedwait+0x170>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0a4f8: 3d 40 00 00 lis r10,0
ffc0a4fc: 81 0a 28 d4 lwz r8,10452(r10)
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
ffc0a500: 38 e0 ff ff li r7,-1
ffc0a504: 90 ff 00 00 stw r7,0(r31)
++level;
ffc0a508: 39 08 00 01 addi r8,r8,1
_Thread_Dispatch_disable_level = level;
ffc0a50c: 91 0a 28 d4 stw r8,10452(r10)
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
ffc0a510: 39 40 00 04 li r10,4
ffc0a514: 91 49 00 34 stw r10,52(r9)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
ffc0a518: 3d 40 00 00 lis r10,0
ffc0a51c: 39 4a 33 ec addi r10,r10,13292
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
ffc0a520: 81 1c 00 00 lwz r8,0(r28)
the_thread->Wait.return_argument = the_info;
ffc0a524: 93 e9 00 28 stw r31,40(r9)
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
ffc0a528: 91 09 00 30 stw r8,48(r9)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
ffc0a52c: 91 49 00 44 stw r10,68(r9)
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;
ffc0a530: 39 20 00 01 li r9,1
ffc0a534: 91 2a 00 30 stw r9,48(r10)
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0a538: 7f 40 01 24 mtmsr r26
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 );
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
ffc0a53c: 3c a0 ff c1 lis r5,-63
ffc0a540: 3c 60 00 00 lis r3,0
ffc0a544: 38 a5 e9 f0 addi r5,r5,-5648
ffc0a548: 38 63 33 ec addi r3,r3,13292
ffc0a54c: 48 00 40 1d bl ffc0e568 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
ffc0a550: 48 00 3a 11 bl ffc0df60 <_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 );
ffc0a554: 80 9f 00 00 lwz r4,0(r31)
ffc0a558: 7f a3 eb 78 mr r3,r29
ffc0a55c: 7f e5 fb 78 mr r5,r31
ffc0a560: 38 c0 00 00 li r6,0
ffc0a564: 38 e0 00 00 li r7,0
ffc0a568: 48 00 6f e1 bl ffc11548 <_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)
ffc0a56c: 81 3b 00 10 lwz r9,16(r27)
ffc0a570: 81 29 00 34 lwz r9,52(r9)
ffc0a574: 2f 89 00 04 cmpwi cr7,r9,4
ffc0a578: 40 9e 01 68 bne- cr7,ffc0a6e0 <sigtimedwait+0x28c>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
ffc0a57c: 83 df 00 00 lwz r30,0(r31)
ffc0a580: 39 00 00 01 li r8,1
ffc0a584: 81 3c 00 00 lwz r9,0(r28)
ffc0a588: 39 5e ff ff addi r10,r30,-1
ffc0a58c: 7d 0a 50 30 slw r10,r8,r10
ffc0a590: 7d 48 48 39 and. r8,r10,r9
ffc0a594: 41 82 01 4c beq- ffc0a6e0 <sigtimedwait+0x28c>
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
ffc0a598: 80 01 00 34 lwz r0,52(r1)
ffc0a59c: 7f c3 f3 78 mr r3,r30
ffc0a5a0: 83 41 00 18 lwz r26,24(r1)
ffc0a5a4: 7c 08 03 a6 mtlr r0
ffc0a5a8: 83 61 00 1c lwz r27,28(r1)
ffc0a5ac: 83 81 00 20 lwz r28,32(r1)
ffc0a5b0: 83 a1 00 24 lwz r29,36(r1)
ffc0a5b4: 83 c1 00 28 lwz r30,40(r1)
ffc0a5b8: 83 e1 00 2c lwz r31,44(r1)
ffc0a5bc: 38 21 00 30 addi r1,r1,48
ffc0a5c0: 4e 80 00 20 blr
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
ffc0a5c4: 4b ff fe 35 bl ffc0a3f8 <_POSIX_signals_Get_lowest>
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
ffc0a5c8: 7f e5 fb 78 mr r5,r31
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
ffc0a5cc: 7c 7e 1b 78 mr r30,r3
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
ffc0a5d0: 7f c4 f3 78 mr r4,r30
ffc0a5d4: 7f a3 eb 78 mr r3,r29
ffc0a5d8: 38 c0 00 01 li r6,1
ffc0a5dc: 38 e0 00 00 li r7,0
ffc0a5e0: 48 00 6f 69 bl ffc11548 <_POSIX_signals_Clear_signals>
ffc0a5e4: 7f 40 01 24 mtmsr r26
_ISR_Enable( level );
the_info->si_signo = signo;
the_info->si_code = SI_USER;
ffc0a5e8: 39 20 00 01 li r9,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;
ffc0a5ec: 93 df 00 00 stw r30,0(r31)
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
ffc0a5f0: 7f c3 f3 78 mr r3,r30
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;
the_info->si_code = SI_USER;
ffc0a5f4: 91 3f 00 04 stw r9,4(r31)
the_info->si_value.sival_int = 0;
ffc0a5f8: 39 20 00 00 li r9,0
ffc0a5fc: 91 3f 00 08 stw r9,8(r31)
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
ffc0a600: 80 01 00 34 lwz r0,52(r1)
ffc0a604: 83 41 00 18 lwz r26,24(r1)
ffc0a608: 7c 08 03 a6 mtlr r0
ffc0a60c: 83 61 00 1c lwz r27,28(r1)
ffc0a610: 83 81 00 20 lwz r28,32(r1)
ffc0a614: 83 a1 00 24 lwz r29,36(r1)
ffc0a618: 83 c1 00 28 lwz r30,40(r1)
ffc0a61c: 83 e1 00 2c lwz r31,44(r1)
ffc0a620: 38 21 00 30 addi r1,r1,48
ffc0a624: 4e 80 00 20 blr
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
ffc0a628: 2f 9f 00 00 cmpwi cr7,r31,0
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
ffc0a62c: 38 80 00 00 li r4,0
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
ffc0a630: 40 9e fe 88 bne+ cr7,ffc0a4b8 <sigtimedwait+0x64>
the_thread = _Thread_Executing;
ffc0a634: 3f 60 00 00 lis r27,0
ffc0a638: 3b 7b 31 e0 addi r27,r27,12768
ffc0a63c: 81 3b 00 10 lwz r9,16(r27)
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
ffc0a640: 3b e1 00 08 addi r31,r1,8
the_thread = _Thread_Executing;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
ffc0a644: 83 a9 01 50 lwz r29,336(r9)
static inline uint32_t ppc_interrupt_disable( void )
{
uint32_t level;
uint32_t mask;
__asm__ volatile (
ffc0a648: 7f 40 00 a6 mfmsr r26
ffc0a64c: 7d 50 42 a6 mfsprg r10,0
ffc0a650: 7f 4a 50 78 andc r10,r26,r10
ffc0a654: 7d 40 01 24 mtmsr r10
*/
/* API signals pending? */
_ISR_Disable( level );
if ( *set & api->signals_pending ) {
ffc0a658: 81 5c 00 00 lwz r10,0(r28)
ffc0a65c: 80 7d 00 d4 lwz r3,212(r29)
ffc0a660: 7d 48 18 39 and. r8,r10,r3
ffc0a664: 41 82 fe 84 beq+ ffc0a4e8 <sigtimedwait+0x94>
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
ffc0a668: 4b ff fd 91 bl ffc0a3f8 <_POSIX_signals_Get_lowest>
_POSIX_signals_Clear_signals(
ffc0a66c: 7f e5 fb 78 mr r5,r31
/* 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 );
ffc0a670: 90 7f 00 00 stw r3,0(r31)
ffc0a674: 7c 64 1b 78 mr r4,r3
_POSIX_signals_Clear_signals(
ffc0a678: 38 c0 00 00 li r6,0
ffc0a67c: 7f a3 eb 78 mr r3,r29
ffc0a680: 38 e0 00 00 li r7,0
ffc0a684: 48 00 6e c5 bl ffc11548 <_POSIX_signals_Clear_signals>
return level;
}
static inline void ppc_interrupt_enable( uint32_t level )
{
__asm__ volatile (
ffc0a688: 7f 40 01 24 mtmsr r26
false,
false
);
_ISR_Enable( level );
the_info->si_code = SI_USER;
ffc0a68c: 39 20 00 01 li r9,1
the_info->si_value.sival_int = 0;
return the_info->si_signo;
ffc0a690: 83 df 00 00 lwz r30,0(r31)
false,
false
);
_ISR_Enable( level );
the_info->si_code = SI_USER;
ffc0a694: 91 3f 00 04 stw r9,4(r31)
the_info->si_value.sival_int = 0;
ffc0a698: 39 20 00 00 li r9,0
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
ffc0a69c: 7f c3 f3 78 mr r3,r30
false
);
_ISR_Enable( level );
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
ffc0a6a0: 91 3f 00 08 stw r9,8(r31)
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
ffc0a6a4: 80 01 00 34 lwz r0,52(r1)
ffc0a6a8: 83 41 00 18 lwz r26,24(r1)
ffc0a6ac: 7c 08 03 a6 mtlr r0
ffc0a6b0: 83 61 00 1c lwz r27,28(r1)
ffc0a6b4: 83 81 00 20 lwz r28,32(r1)
ffc0a6b8: 83 a1 00 24 lwz r29,36(r1)
ffc0a6bc: 83 c1 00 28 lwz r30,40(r1)
ffc0a6c0: 83 e1 00 2c lwz r31,44(r1)
ffc0a6c4: 38 21 00 30 addi r1,r1,48
ffc0a6c8: 4e 80 00 20 blr
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
ffc0a6cc: 48 00 a1 31 bl ffc147fc <__errno>
ffc0a6d0: 39 20 00 16 li r9,22
ffc0a6d4: 91 23 00 00 stw r9,0(r3)
ffc0a6d8: 3b c0 ff ff li r30,-1
ffc0a6dc: 4b ff fe bc b ffc0a598 <sigtimedwait+0x144>
* 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;
ffc0a6e0: 48 00 a1 1d bl ffc147fc <__errno>
ffc0a6e4: 81 3b 00 10 lwz r9,16(r27)
return -1;
ffc0a6e8: 3b c0 ff ff li r30,-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;
ffc0a6ec: 81 29 00 34 lwz r9,52(r9)
ffc0a6f0: 91 23 00 00 stw r9,0(r3)
ffc0a6f4: 4b ff fe a4 b ffc0a598 <sigtimedwait+0x144>
ffc0c694 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
ffc0c694: 94 21 ff f0 stwu r1,-16(r1)
ffc0c698: 7c 08 02 a6 mflr r0
int status;
status = sigtimedwait( set, NULL, NULL );
ffc0c69c: 38 a0 00 00 li r5,0
int sigwait(
const sigset_t *set,
int *sig
)
{
ffc0c6a0: 93 e1 00 0c stw r31,12(r1)
ffc0c6a4: 7c 9f 23 78 mr r31,r4
int status;
status = sigtimedwait( set, NULL, NULL );
ffc0c6a8: 38 80 00 00 li r4,0
int sigwait(
const sigset_t *set,
int *sig
)
{
ffc0c6ac: 90 01 00 14 stw r0,20(r1)
int status;
status = sigtimedwait( set, NULL, NULL );
ffc0c6b0: 4b ff fd 39 bl ffc0c3e8 <sigtimedwait>
if ( status != -1 ) {
ffc0c6b4: 2f 83 ff ff cmpwi cr7,r3,-1
ffc0c6b8: 41 9e 00 28 beq- cr7,ffc0c6e0 <sigwait+0x4c>
if ( sig )
ffc0c6bc: 2f 9f 00 00 cmpwi cr7,r31,0
ffc0c6c0: 41 9e 00 3c beq- cr7,ffc0c6fc <sigwait+0x68> <== NEVER TAKEN
*sig = status;
return 0;
}
return errno;
}
ffc0c6c4: 80 01 00 14 lwz r0,20(r1)
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
ffc0c6c8: 90 7f 00 00 stw r3,0(r31)
return 0;
ffc0c6cc: 38 60 00 00 li r3,0
}
return errno;
}
ffc0c6d0: 7c 08 03 a6 mtlr r0
ffc0c6d4: 83 e1 00 0c lwz r31,12(r1)
ffc0c6d8: 38 21 00 10 addi r1,r1,16
ffc0c6dc: 4e 80 00 20 blr
if ( sig )
*sig = status;
return 0;
}
return errno;
ffc0c6e0: 48 00 9d 39 bl ffc16418 <__errno>
}
ffc0c6e4: 80 01 00 14 lwz r0,20(r1)
if ( sig )
*sig = status;
return 0;
}
return errno;
ffc0c6e8: 80 63 00 00 lwz r3,0(r3)
}
ffc0c6ec: 7c 08 03 a6 mtlr r0
ffc0c6f0: 83 e1 00 0c lwz r31,12(r1)
ffc0c6f4: 38 21 00 10 addi r1,r1,16
ffc0c6f8: 4e 80 00 20 blr
ffc0c6fc: 80 01 00 14 lwz r0,20(r1) <== NOT EXECUTED
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
ffc0c700: 38 60 00 00 li r3,0 <== NOT EXECUTED
}
return errno;
}
ffc0c704: 83 e1 00 0c lwz r31,12(r1) <== NOT EXECUTED
ffc0c708: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED
ffc0c70c: 38 21 00 10 addi r1,r1,16 <== NOT EXECUTED
ffc0c710: 4e 80 00 20 blr <== NOT EXECUTED
ffc0acf8 <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
ffc0acf8: 7d 80 00 26 mfcr r12
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
ffc0acfc: 2f 83 00 01 cmpwi cr7,r3,1
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
ffc0ad00: 94 21 ff e8 stwu r1,-24(r1)
ffc0ad04: 7c 08 02 a6 mflr r0
ffc0ad08: 93 a1 00 0c stw r29,12(r1)
ffc0ad0c: 90 01 00 1c stw r0,28(r1)
ffc0ad10: 93 c1 00 10 stw r30,16(r1)
ffc0ad14: 93 e1 00 14 stw r31,20(r1)
ffc0ad18: 91 81 00 08 stw r12,8(r1)
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
ffc0ad1c: 40 9e 01 0c bne- cr7,ffc0ae28 <timer_create+0x130>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
ffc0ad20: 2f 85 00 00 cmpwi cr7,r5,0
ffc0ad24: 7c be 2b 78 mr r30,r5
ffc0ad28: 41 9e 01 00 beq- cr7,ffc0ae28 <timer_create+0x130>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
ffc0ad2c: 2e 04 00 00 cmpwi cr4,r4,0
ffc0ad30: 7c 9f 23 78 mr r31,r4
ffc0ad34: 41 92 00 2c beq- cr4,ffc0ad60 <timer_create+0x68>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
ffc0ad38: 81 24 00 00 lwz r9,0(r4)
ffc0ad3c: 39 29 ff ff addi r9,r9,-1
ffc0ad40: 2b 89 00 01 cmplwi cr7,r9,1
ffc0ad44: 41 9d 00 e4 bgt- cr7,ffc0ae28 <timer_create+0x130> <== NEVER TAKEN
( evp->sigev_notify != SIGEV_SIGNAL ) ) {
/* The value of the field sigev_notify is not valid */
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !evp->sigev_signo )
ffc0ad48: 81 24 00 04 lwz r9,4(r4)
ffc0ad4c: 2f 89 00 00 cmpwi cr7,r9,0
ffc0ad50: 41 9e 00 d8 beq- cr7,ffc0ae28 <timer_create+0x130> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
ffc0ad54: 39 29 ff ff addi r9,r9,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
ffc0ad58: 2b 89 00 1f cmplwi cr7,r9,31
ffc0ad5c: 41 9d 00 cc bgt- cr7,ffc0ae28 <timer_create+0x130> <== NEVER TAKEN
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ffc0ad60: 3d 20 00 00 lis r9,0
ffc0ad64: 81 49 28 a8 lwz r10,10408(r9)
++level;
ffc0ad68: 39 4a 00 01 addi r10,r10,1
_Thread_Dispatch_disable_level = level;
ffc0ad6c: 91 49 28 a8 stw r10,10408(r9)
* 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 );
ffc0ad70: 3f a0 00 00 lis r29,0
ffc0ad74: 3b bd 59 40 addi r29,r29,22848
ffc0ad78: 7f a3 eb 78 mr r3,r29
ffc0ad7c: 48 00 2a 2d bl ffc0d7a8 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
ffc0ad80: 2c 03 00 00 cmpwi r3,0
ffc0ad84: 41 82 00 d8 beq- ffc0ae5c <timer_create+0x164>
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;
ffc0ad88: 39 40 00 02 li r10,2
ffc0ad8c: 99 43 00 3c stb r10,60(r3)
ptimer->thread_id = _Thread_Executing->Object.id;
ffc0ad90: 3d 40 00 00 lis r10,0
ffc0ad94: 81 4a 5b b0 lwz r10,23472(r10)
ffc0ad98: 81 4a 00 08 lwz r10,8(r10)
ffc0ad9c: 91 43 00 38 stw r10,56(r3)
if ( evp != NULL ) {
ffc0ada0: 41 92 00 1c beq- cr4,ffc0adbc <timer_create+0xc4>
ptimer->inf.sigev_notify = evp->sigev_notify;
ffc0ada4: 80 ff 00 00 lwz r7,0(r31)
ptimer->inf.sigev_signo = evp->sigev_signo;
ffc0ada8: 81 1f 00 04 lwz r8,4(r31)
ptimer->inf.sigev_value = evp->sigev_value;
ffc0adac: 81 5f 00 08 lwz r10,8(r31)
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
ptimer->thread_id = _Thread_Executing->Object.id;
if ( evp != NULL ) {
ptimer->inf.sigev_notify = evp->sigev_notify;
ffc0adb0: 90 e3 00 40 stw r7,64(r3)
ptimer->inf.sigev_signo = evp->sigev_signo;
ffc0adb4: 91 03 00 44 stw r8,68(r3)
ptimer->inf.sigev_value = evp->sigev_value;
ffc0adb8: 91 43 00 48 stw r10,72(r3)
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
ffc0adbc: 81 03 00 08 lwz r8,8(r3)
}
ptimer->overrun = 0;
ffc0adc0: 39 40 00 00 li r10,0
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
ffc0adc4: 80 dd 00 1c lwz r6,28(r29)
ffc0adc8: 55 07 13 ba rlwinm r7,r8,2,14,29
ffc0adcc: 91 43 00 68 stw r10,104(r3)
ptimer->timer_data.it_value.tv_sec = 0;
ffc0add0: 91 43 00 5c stw r10,92(r3)
ptimer->timer_data.it_value.tv_nsec = 0;
ffc0add4: 91 43 00 60 stw r10,96(r3)
ptimer->timer_data.it_interval.tv_sec = 0;
ffc0add8: 91 43 00 54 stw r10,84(r3)
ptimer->timer_data.it_interval.tv_nsec = 0;
ffc0addc: 91 43 00 58 stw r10,88(r3)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
ffc0ade0: 91 43 00 18 stw r10,24(r3)
the_watchdog->routine = routine;
ffc0ade4: 91 43 00 2c stw r10,44(r3)
the_watchdog->id = id;
ffc0ade8: 91 43 00 30 stw r10,48(r3)
the_watchdog->user_data = user_data;
ffc0adec: 91 43 00 34 stw r10,52(r3)
ffc0adf0: 7c 66 39 2e stwx r3,r6,r7
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
ffc0adf4: 91 43 00 0c stw r10,12(r3)
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
ffc0adf8: 91 1e 00 00 stw r8,0(r30)
_Thread_Enable_dispatch();
ffc0adfc: 48 00 41 91 bl ffc0ef8c <_Thread_Enable_dispatch>
return 0;
ffc0ae00: 38 60 00 00 li r3,0
}
ffc0ae04: 80 01 00 1c lwz r0,28(r1)
ffc0ae08: 81 81 00 08 lwz r12,8(r1)
ffc0ae0c: 7c 08 03 a6 mtlr r0
ffc0ae10: 83 a1 00 0c lwz r29,12(r1)
ffc0ae14: 83 c1 00 10 lwz r30,16(r1)
ffc0ae18: 7d 80 81 20 mtcrf 8,r12
ffc0ae1c: 83 e1 00 14 lwz r31,20(r1)
ffc0ae20: 38 21 00 18 addi r1,r1,24
ffc0ae24: 4e 80 00 20 blr
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 );
ffc0ae28: 48 00 aa 55 bl ffc1587c <__errno>
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc0ae2c: 80 01 00 1c lwz r0,28(r1)
ffc0ae30: 81 81 00 08 lwz r12,8(r1)
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 );
ffc0ae34: 39 20 00 16 li r9,22
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc0ae38: 7c 08 03 a6 mtlr r0
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 );
ffc0ae3c: 91 23 00 00 stw r9,0(r3)
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc0ae40: 7d 80 81 20 mtcrf 8,r12
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 );
ffc0ae44: 38 60 ff ff li r3,-1
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
ffc0ae48: 83 a1 00 0c lwz r29,12(r1)
ffc0ae4c: 83 c1 00 10 lwz r30,16(r1)
ffc0ae50: 83 e1 00 14 lwz r31,20(r1)
ffc0ae54: 38 21 00 18 addi r1,r1,24
ffc0ae58: 4e 80 00 20 blr
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
_Thread_Enable_dispatch();
ffc0ae5c: 48 00 41 31 bl ffc0ef8c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
ffc0ae60: 48 00 aa 1d bl ffc1587c <__errno>
ffc0ae64: 39 20 00 0b li r9,11
ffc0ae68: 91 23 00 00 stw r9,0(r3)
ffc0ae6c: 38 60 ff ff li r3,-1
ffc0ae70: 4b ff ff 94 b ffc0ae04 <timer_create+0x10c>
ffc0949c <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
ffc0949c: 94 21 ff b0 stwu r1,-80(r1)
ffc094a0: 7c 08 02 a6 mflr r0
ffc094a4: 93 81 00 40 stw r28,64(r1)
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
ffc094a8: 7c bc 2b 79 mr. r28,r5
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
ffc094ac: 90 01 00 54 stw r0,84(r1)
ffc094b0: 93 61 00 3c stw r27,60(r1)
ffc094b4: 93 a1 00 44 stw r29,68(r1)
ffc094b8: 93 c1 00 48 stw r30,72(r1)
ffc094bc: 93 e1 00 4c stw r31,76(r1)
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
ffc094c0: 41 82 02 58 beq- ffc09718 <timer_settime+0x27c> <== NEVER TAKEN
ffc094c4: 7c 7d 1b 78 mr r29,r3
/*
* 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) ) ) {
ffc094c8: 38 7c 00 08 addi r3,r28,8
ffc094cc: 7c 9f 23 78 mr r31,r4
ffc094d0: 7c db 33 78 mr r27,r6
ffc094d4: 48 00 4a b9 bl ffc0df8c <_Timespec_Is_valid>
ffc094d8: 2f 83 00 00 cmpwi cr7,r3,0
ffc094dc: 41 9e 02 3c beq- cr7,ffc09718 <timer_settime+0x27c>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
ffc094e0: 7f 83 e3 78 mr r3,r28
ffc094e4: 48 00 4a a9 bl ffc0df8c <_Timespec_Is_valid>
ffc094e8: 2f 83 00 00 cmpwi cr7,r3,0
ffc094ec: 41 9e 02 2c beq- cr7,ffc09718 <timer_settime+0x27c> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
ffc094f0: 2f 9f 00 04 cmpwi cr7,r31,4
ffc094f4: 41 9e 01 6c beq- cr7,ffc09660 <timer_settime+0x1c4>
ffc094f8: 2f 9f 00 00 cmpwi cr7,r31,0
ffc094fc: 40 9e 02 1c bne- cr7,ffc09718 <timer_settime+0x27c>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
ffc09500: 81 3c 00 0c lwz r9,12(r28)
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Get (
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
ffc09504: 3c 60 00 00 lis r3,0
ffc09508: 80 fc 00 00 lwz r7,0(r28)
ffc0950c: 7f a4 eb 78 mr r4,r29
ffc09510: 81 1c 00 04 lwz r8,4(r28)
ffc09514: 38 63 2f 80 addi r3,r3,12160
ffc09518: 81 5c 00 08 lwz r10,8(r28)
ffc0951c: 38 a1 00 28 addi r5,r1,40
ffc09520: 91 21 00 14 stw r9,20(r1)
ffc09524: 90 e1 00 08 stw r7,8(r1)
ffc09528: 91 01 00 0c stw r8,12(r1)
ffc0952c: 91 41 00 10 stw r10,16(r1)
ffc09530: 48 00 2c b9 bl ffc0c1e8 <_Objects_Get>
ffc09534: 7c 7d 1b 78 mr r29,r3
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
ffc09538: 81 21 00 28 lwz r9,40(r1)
ffc0953c: 2f 89 00 00 cmpwi cr7,r9,0
ffc09540: 40 9e 01 d8 bne- cr7,ffc09718 <timer_settime+0x27c> <== NEVER TAKEN
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 ) {
ffc09544: 81 21 00 10 lwz r9,16(r1)
ffc09548: 2f 89 00 00 cmpwi cr7,r9,0
ffc0954c: 40 9e 00 10 bne- cr7,ffc0955c <timer_settime+0xc0>
ffc09550: 81 21 00 14 lwz r9,20(r1)
ffc09554: 2f 89 00 00 cmpwi cr7,r9,0
ffc09558: 41 9e 01 d4 beq- cr7,ffc0972c <timer_settime+0x290>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
ffc0955c: 7f 83 e3 78 mr r3,r28
ffc09560: 48 00 4a f5 bl ffc0e054 <_Timespec_To_ticks>
ffc09564: 90 7d 00 64 stw r3,100(r29)
initial_period = _Timespec_To_ticks( &normalize.it_value );
ffc09568: 38 61 00 10 addi r3,r1,16
ffc0956c: 48 00 4a e9 bl ffc0e054 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
ffc09570: 80 bd 00 08 lwz r5,8(r29)
ffc09574: 3c c0 ff c1 lis r6,-63
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 );
ffc09578: 7c 64 1b 78 mr r4,r3
activated = _POSIX_Timer_Insert_helper(
ffc0957c: 38 c6 97 b0 addi r6,r6,-26704
ffc09580: 38 7d 00 10 addi r3,r29,16
ffc09584: 7f a7 eb 78 mr r7,r29
ffc09588: 48 00 75 95 bl ffc10b1c <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
ffc0958c: 2f 83 00 00 cmpwi cr7,r3,0
ffc09590: 41 9e 00 a4 beq- cr7,ffc09634 <timer_settime+0x198>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
ffc09594: 2f 9b 00 00 cmpwi cr7,r27,0
ffc09598: 41 9e 00 24 beq- cr7,ffc095bc <timer_settime+0x120>
*ovalue = ptimer->timer_data;
ffc0959c: 81 3d 00 54 lwz r9,84(r29)
ffc095a0: 80 fd 00 58 lwz r7,88(r29)
ffc095a4: 81 1d 00 5c lwz r8,92(r29)
ffc095a8: 81 5d 00 60 lwz r10,96(r29)
ffc095ac: 91 3b 00 00 stw r9,0(r27)
ffc095b0: 90 fb 00 04 stw r7,4(r27)
ffc095b4: 91 1b 00 08 stw r8,8(r27)
ffc095b8: 91 5b 00 0c stw r10,12(r27)
ptimer->timer_data = normalize;
ffc095bc: 81 21 00 08 lwz r9,8(r1)
)
{
Timestamp_Control tod_as_timestamp;
Timestamp_Control *tod_as_timestamp_ptr;
tod_as_timestamp_ptr =
ffc095c0: 3c 80 00 00 lis r4,0
ffc095c4: 38 84 2c a0 addi r4,r4,11424
ffc095c8: 91 3d 00 54 stw r9,84(r29)
ffc095cc: 38 61 00 20 addi r3,r1,32
ffc095d0: 81 21 00 0c lwz r9,12(r1)
ffc095d4: 91 3d 00 58 stw r9,88(r29)
ffc095d8: 81 21 00 10 lwz r9,16(r1)
ffc095dc: 91 3d 00 5c stw r9,92(r29)
ffc095e0: 81 21 00 14 lwz r9,20(r1)
ffc095e4: 91 3d 00 60 stw r9,96(r29)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
ffc095e8: 39 20 00 03 li r9,3
ffc095ec: 99 3d 00 3c stb r9,60(r29)
ffc095f0: 48 00 1f b5 bl ffc0b5a4 <_TOD_Get_with_nanoseconds>
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc095f4: 3c c0 3b 9a lis r6,15258
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
ffc095f8: 83 e3 00 04 lwz r31,4(r3)
ffc095fc: 38 a0 00 00 li r5,0
ffc09600: 83 c3 00 00 lwz r30,0(r3)
ffc09604: 60 c6 ca 00 ori r6,r6,51712
ffc09608: 7f e4 fb 78 mr r4,r31
ffc0960c: 7f c3 f3 78 mr r3,r30
ffc09610: 48 01 42 11 bl ffc1d820 <__divdi3>
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc09614: 3c c0 3b 9a lis r6,15258
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc09618: 90 9d 00 6c stw r4,108(r29)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc0961c: 38 a0 00 00 li r5,0
ffc09620: 60 c6 ca 00 ori r6,r6,51712
ffc09624: 7f c3 f3 78 mr r3,r30
ffc09628: 7f e4 fb 78 mr r4,r31
ffc0962c: 48 01 46 19 bl ffc1dc44 <__moddi3>
ffc09630: 90 9d 00 70 stw r4,112(r29)
ptimer->timer_data = normalize;
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
_TOD_Get( &ptimer->time );
_Thread_Enable_dispatch();
ffc09634: 48 00 3c 05 bl ffc0d238 <_Thread_Enable_dispatch>
return 0;
ffc09638: 38 60 00 00 li r3,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
ffc0963c: 80 01 00 54 lwz r0,84(r1)
ffc09640: 83 61 00 3c lwz r27,60(r1)
ffc09644: 7c 08 03 a6 mtlr r0
ffc09648: 83 81 00 40 lwz r28,64(r1)
ffc0964c: 83 a1 00 44 lwz r29,68(r1)
ffc09650: 83 c1 00 48 lwz r30,72(r1)
ffc09654: 83 e1 00 4c lwz r31,76(r1)
ffc09658: 38 21 00 50 addi r1,r1,80
ffc0965c: 4e 80 00 20 blr
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
ffc09660: 80 fc 00 00 lwz r7,0(r28)
ffc09664: 3c 80 00 00 lis r4,0
ffc09668: 81 1c 00 04 lwz r8,4(r28)
ffc0966c: 38 84 2c a0 addi r4,r4,11424
ffc09670: 81 5c 00 08 lwz r10,8(r28)
ffc09674: 38 61 00 20 addi r3,r1,32
ffc09678: 81 3c 00 0c lwz r9,12(r28)
ffc0967c: 90 e1 00 08 stw r7,8(r1)
ffc09680: 91 01 00 0c stw r8,12(r1)
ffc09684: 91 41 00 10 stw r10,16(r1)
ffc09688: 91 21 00 14 stw r9,20(r1)
ffc0968c: 48 00 1f 19 bl ffc0b5a4 <_TOD_Get_with_nanoseconds>
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc09690: 3c c0 3b 9a lis r6,15258
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
ffc09694: 83 c3 00 00 lwz r30,0(r3)
ffc09698: 38 a0 00 00 li r5,0
ffc0969c: 83 e3 00 04 lwz r31,4(r3)
ffc096a0: 60 c6 ca 00 ori r6,r6,51712
ffc096a4: 7f c3 f3 78 mr r3,r30
ffc096a8: 7f e4 fb 78 mr r4,r31
ffc096ac: 48 01 41 75 bl ffc1d820 <__divdi3>
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc096b0: 3c c0 3b 9a lis r6,15258
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
ffc096b4: 90 81 00 18 stw r4,24(r1)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
ffc096b8: 38 a0 00 00 li r5,0
ffc096bc: 60 c6 ca 00 ori r6,r6,51712
ffc096c0: 7f c3 f3 78 mr r3,r30
ffc096c4: 7f e4 fb 78 mr r4,r31
ffc096c8: 48 01 45 7d bl ffc1dc44 <__moddi3>
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
_TOD_Get( &now );
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
ffc096cc: 38 61 00 10 addi r3,r1,16
ffc096d0: 90 81 00 1c stw r4,28(r1)
ffc096d4: 38 81 00 18 addi r4,r1,24
ffc096d8: 48 00 48 f5 bl ffc0dfcc <_Timespec_Less_than>
ffc096dc: 2f 83 00 00 cmpwi cr7,r3,0
ffc096e0: 40 9e 00 38 bne- cr7,ffc09718 <timer_settime+0x27c>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
ffc096e4: 38 81 00 10 addi r4,r1,16
ffc096e8: 7c 85 23 78 mr r5,r4
ffc096ec: 38 61 00 18 addi r3,r1,24
ffc096f0: 48 00 49 19 bl ffc0e008 <_Timespec_Subtract>
ffc096f4: 3c 60 00 00 lis r3,0
ffc096f8: 7f a4 eb 78 mr r4,r29
ffc096fc: 38 63 2f 80 addi r3,r3,12160
ffc09700: 38 a1 00 28 addi r5,r1,40
ffc09704: 48 00 2a e5 bl ffc0c1e8 <_Objects_Get>
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
ffc09708: 81 21 00 28 lwz r9,40(r1)
ffc0970c: 7c 7d 1b 78 mr r29,r3
ffc09710: 2f 89 00 00 cmpwi cr7,r9,0
ffc09714: 41 be fe 30 beq- cr7,ffc09544 <timer_settime+0xa8>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
ffc09718: 48 00 a4 e9 bl ffc13c00 <__errno>
ffc0971c: 39 20 00 16 li r9,22
ffc09720: 91 23 00 00 stw r9,0(r3)
ffc09724: 38 60 ff ff li r3,-1
ffc09728: 4b ff ff 14 b ffc0963c <timer_settime+0x1a0>
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 );
ffc0972c: 38 63 00 10 addi r3,r3,16
ffc09730: 48 00 4d b5 bl ffc0e4e4 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
ffc09734: 2f 9b 00 00 cmpwi cr7,r27,0
ffc09738: 41 9e 00 24 beq- cr7,ffc0975c <timer_settime+0x2c0>
*ovalue = ptimer->timer_data;
ffc0973c: 81 3d 00 54 lwz r9,84(r29)
ffc09740: 80 fd 00 58 lwz r7,88(r29)
ffc09744: 81 1d 00 5c lwz r8,92(r29)
ffc09748: 81 5d 00 60 lwz r10,96(r29)
ffc0974c: 91 3b 00 00 stw r9,0(r27)
ffc09750: 90 fb 00 04 stw r7,4(r27)
ffc09754: 91 1b 00 08 stw r8,8(r27)
ffc09758: 91 5b 00 0c stw r10,12(r27)
/* The new data are set */
ptimer->timer_data = normalize;
ffc0975c: 81 21 00 08 lwz r9,8(r1)
ffc09760: 91 3d 00 54 stw r9,84(r29)
ffc09764: 81 21 00 0c lwz r9,12(r1)
ffc09768: 91 3d 00 58 stw r9,88(r29)
ffc0976c: 81 21 00 10 lwz r9,16(r1)
ffc09770: 91 3d 00 5c stw r9,92(r29)
ffc09774: 81 21 00 14 lwz r9,20(r1)
ffc09778: 91 3d 00 60 stw r9,96(r29)
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
ffc0977c: 39 20 00 04 li r9,4
ffc09780: 99 3d 00 3c stb r9,60(r29)
/* Returns with success */
_Thread_Enable_dispatch();
ffc09784: 48 00 3a b5 bl ffc0d238 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
ffc09788: 80 01 00 54 lwz r0,84(r1)
ffc0978c: 83 61 00 3c lwz r27,60(r1)
ptimer->timer_data = normalize;
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
/* Returns with success */
_Thread_Enable_dispatch();
return 0;
ffc09790: 38 60 00 00 li r3,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
ffc09794: 7c 08 03 a6 mtlr r0
ffc09798: 83 81 00 40 lwz r28,64(r1)
ffc0979c: 83 a1 00 44 lwz r29,68(r1)
ffc097a0: 83 c1 00 48 lwz r30,72(r1)
ffc097a4: 83 e1 00 4c lwz r31,76(r1)
ffc097a8: 38 21 00 50 addi r1,r1,80
ffc097ac: 4e 80 00 20 blr
ffc0928c <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
ffc0928c: 94 21 ff d8 stwu r1,-40(r1)
ffc09290: 7c 08 02 a6 mflr r0
ffc09294: 93 e1 00 24 stw r31,36(r1)
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
ffc09298: 3f e0 00 00 lis r31,0
ffc0929c: 3b ff 35 f4 addi r31,r31,13812
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
ffc092a0: 90 01 00 2c stw r0,44(r1)
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
ffc092a4: 81 3f 00 1c lwz r9,28(r31)
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
ffc092a8: 93 c1 00 20 stw r30,32(r1)
ffc092ac: 7c 7e 1b 78 mr r30,r3
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
ffc092b0: 2f 89 00 00 cmpwi cr7,r9,0
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
ffc092b4: 93 a1 00 1c stw r29,28(r1)
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
ffc092b8: 41 9e 00 a4 beq- cr7,ffc0935c <ualarm+0xd0>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
ffc092bc: 7f e3 fb 78 mr r3,r31
ffc092c0: 48 00 4c 41 bl ffc0df00 <_Watchdog_Remove>
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
ffc092c4: 3b a0 00 00 li r29,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) ) {
ffc092c8: 38 63 ff fe addi r3,r3,-2
ffc092cc: 2b 83 00 01 cmplwi cr7,r3,1
ffc092d0: 40 9d 00 ac ble- cr7,ffc0937c <ualarm+0xf0> <== ALWAYS TAKEN
/*
* 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 ) {
ffc092d4: 2f 9e 00 00 cmpwi cr7,r30,0
ffc092d8: 41 be 00 64 beq+ cr7,ffc0933c <ualarm+0xb0>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
ffc092dc: 3d 20 43 1b lis r9,17179
ffc092e0: 61 29 de 83 ori r9,r9,56963
ffc092e4: 7d 3e 48 16 mulhwu r9,r30,r9
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
ticks = _Timespec_To_ticks( &tp );
ffc092e8: 38 61 00 08 addi r3,r1,8
* 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;
ffc092ec: 55 29 74 be rlwinm r9,r9,14,18,31
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
ffc092f0: 55 28 40 2e rlwinm r8,r9,8,0,23
* 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;
ffc092f4: 91 21 00 08 stw r9,8(r1)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
ffc092f8: 55 2a 18 38 rlwinm r10,r9,3,0,28
ffc092fc: 7d 4a 40 50 subf r10,r10,r8
ffc09300: 55 48 30 32 rlwinm r8,r10,6,0,25
ffc09304: 7d 4a 40 50 subf r10,r10,r8
ffc09308: 7d 4a 4a 14 add r10,r10,r9
ffc0930c: 55 4a 30 32 rlwinm r10,r10,6,0,25
ffc09310: 7f ca f0 50 subf r30,r10,r30
ffc09314: 1f de 03 e8 mulli r30,r30,1000
ffc09318: 93 c1 00 0c stw r30,12(r1)
ticks = _Timespec_To_ticks( &tp );
ffc0931c: 48 00 46 41 bl ffc0d95c <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
ffc09320: 38 61 00 08 addi r3,r1,8
ffc09324: 48 00 46 39 bl ffc0d95c <_Timespec_To_ticks>
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc09328: 7f e4 fb 78 mr r4,r31
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
ffc0932c: 90 7f 00 0c stw r3,12(r31)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
ffc09330: 3c 60 00 00 lis r3,0
ffc09334: 38 63 2e 08 addi r3,r3,11784
ffc09338: 48 00 4a 01 bl ffc0dd38 <_Watchdog_Insert>
}
return remaining;
}
ffc0933c: 80 01 00 2c lwz r0,44(r1)
ffc09340: 7f a3 eb 78 mr r3,r29
ffc09344: 83 c1 00 20 lwz r30,32(r1)
ffc09348: 7c 08 03 a6 mtlr r0
ffc0934c: 83 a1 00 1c lwz r29,28(r1)
ffc09350: 83 e1 00 24 lwz r31,36(r1)
ffc09354: 38 21 00 28 addi r1,r1,40
ffc09358: 4e 80 00 20 blr
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
ffc0935c: 3d 40 ff c1 lis r10,-63
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
ffc09360: 91 3f 00 08 stw r9,8(r31)
the_watchdog->routine = routine;
ffc09364: 39 4a 92 40 addi r10,r10,-28096
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
ffc09368: 3b a0 00 00 li r29,0
ffc0936c: 91 5f 00 1c stw r10,28(r31)
the_watchdog->id = id;
ffc09370: 91 3f 00 20 stw r9,32(r31)
the_watchdog->user_data = user_data;
ffc09374: 91 3f 00 24 stw r9,36(r31)
ffc09378: 4b ff ff 5c b ffc092d4 <ualarm+0x48>
* 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);
ffc0937c: 81 1f 00 14 lwz r8,20(r31)
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
ffc09380: 38 81 00 08 addi r4,r1,8
* 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);
ffc09384: 81 5f 00 0c lwz r10,12(r31)
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
remaining += tp.tv_nsec / 1000;
ffc09388: 3f a0 10 62 lis r29,4194
* 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);
ffc0938c: 80 7f 00 18 lwz r3,24(r31)
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
remaining += tp.tv_nsec / 1000;
ffc09390: 63 bd 4d d3 ori r29,r29,19923
* 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);
ffc09394: 7d 48 52 14 add r10,r8,r10
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
ffc09398: 7c 63 50 50 subf r3,r3,r10
ffc0939c: 48 00 45 75 bl ffc0d910 <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
ffc093a0: 81 21 00 08 lwz r9,8(r1)
remaining += tp.tv_nsec / 1000;
ffc093a4: 81 41 00 0c lwz r10,12(r1)
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;
ffc093a8: 55 27 40 2e rlwinm r7,r9,8,0,23
ffc093ac: 55 28 18 38 rlwinm r8,r9,3,0,28
ffc093b0: 7d 08 38 50 subf r8,r8,r7
remaining += tp.tv_nsec / 1000;
ffc093b4: 7f aa e8 96 mulhw r29,r10,r29
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;
ffc093b8: 55 07 30 32 rlwinm r7,r8,6,0,25
ffc093bc: 7d 08 38 50 subf r8,r8,r7
ffc093c0: 7d 28 4a 14 add r9,r8,r9
remaining += tp.tv_nsec / 1000;
ffc093c4: 7f bd 36 70 srawi r29,r29,6
ffc093c8: 7d 4a fe 70 srawi r10,r10,31
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;
ffc093cc: 55 29 30 32 rlwinm r9,r9,6,0,25
remaining += tp.tv_nsec / 1000;
ffc093d0: 7f aa e8 50 subf r29,r10,r29
ffc093d4: 7f bd 4a 14 add r29,r29,r9
ffc093d8: 4b ff fe fc b ffc092d4 <ualarm+0x48>