=============================================================================== ffc116ec : /** * 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 <== 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 : /** * 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 <== 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 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 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 #include #include #include 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 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 } 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 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 } 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 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 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 #include 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 #include 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 #include 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 #include 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 _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 #include #include 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 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 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 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 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 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 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 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 #include #include #include 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 #include #include 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 #include #include 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 #include #include 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 #include #include 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 #include #include 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 (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 (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 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 &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 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 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 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 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 } /* 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 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 * 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 #include #include #include 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 #include #include #include 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 #include #include #include 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 #include #include 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 #include #include 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 (*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 } 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 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 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 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 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 #include #include 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 #include #include 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 #include #include 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 #include #include #include 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 #include #include #include 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 #include #include #include 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 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 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 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 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 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 #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 #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 #endif void _Thread_Handler_initialization(void) { uint32_t ticks_per_timeslice = ffc0ce0c: 3d 20 ff c2 lis r9,-62 #if defined(RTEMS_SMP) #include #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 #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 #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 #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 #include #include #include 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 #include #include #include 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 */ 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 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 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 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 : */ 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 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 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 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 /* 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 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 <== 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 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 *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 */ 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 =============================================================================== ffc096d4 : #include #include #include 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 #include #include 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 #include #include 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 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 ffc09718: 2f 83 00 00 cmpwi cr7,r3,0 ffc0971c: 41 9c 01 bc blt- cr7,ffc098d8 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 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 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 if (r_chain == NULL) { ffc09744: 7c 7d 1b 79 mr. r29,r3 ffc09748: 41 82 00 54 beq- ffc0979c 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 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 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 (&aio_request_queue.mutex); ffc09770: 7f e3 fb 78 mr r3,r31 ffc09774: 48 00 17 1d bl ffc0ae90 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 <== 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 if (r_chain == NULL) { ffc097bc: 2c 03 00 00 cmpwi r3,0 ffc097c0: 41 82 00 50 beq- ffc09810 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 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 (&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 return AIO_ALLDONE; ffc09808: 3b c0 00 02 li r30,2 ffc0980c: 4b ff ff 6c b ffc09778 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 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 /* 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 if (r_chain == NULL) { ffc0983c: 7c 7e 1b 79 mr. r30,r3 ffc09840: 41 82 00 38 beq- ffc09878 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 */ 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 pthread_mutex_unlock (&r_chain->mutex); ffc09860: 7f a3 eb 78 mr r3,r29 ffc09864: 48 00 16 2d bl ffc0ae90 pthread_mutex_unlock (&aio_request_queue.mutex); ffc09868: 7f e3 fb 78 mr r3,r31 ffc0986c: 48 00 16 25 bl ffc0ae90 return AIO_CANCELED; ffc09870: 3b c0 00 00 li r30,0 ffc09874: 4b ff ff 04 b ffc09778 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 <== 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 if (r_chain == NULL) { ffc09898: 7c 7e 1b 79 mr. r30,r3 ffc0989c: 41 a2 ff 64 beq- ffc09800 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 pthread_mutex_destroy (&r_chain->mutex); ffc098b0: 7f a3 eb 78 mr r3,r29 ffc098b4: 48 00 11 85 bl ffc0aa38 pthread_cond_destroy (&r_chain->mutex); ffc098b8: 7f a3 eb 78 mr r3,r29 ffc098bc: 48 00 0c c1 bl ffc0a57c free (r_chain); ffc098c0: 7f c3 f3 78 mr r3,r30 ffc098c4: 4b ff b5 81 bl ffc04e44 pthread_mutex_unlock (&aio_request_queue.mutex); ffc098c8: 7f e3 fb 78 mr r3,r31 ffc098cc: 48 00 15 c5 bl ffc0ae90 return AIO_CANCELED; ffc098d0: 3b c0 00 00 li r30,0 ffc098d4: 4b ff fe a4 b ffc09778 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 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 =============================================================================== ffc098fc : ) { 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 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 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 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 if (req == NULL) ffc0994c: 7c 69 1b 79 mr. r9,r3 ffc09950: 41 82 00 28 beq- ffc09978 <== 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 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 : * 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 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 <== 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 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 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 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 if (req == NULL) ffc0a364: 7c 69 1b 79 mr. r9,r3 ffc0a368: 41 82 00 28 beq- ffc0a390 <== 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 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 <== NOT EXECUTED =============================================================================== ffc0a3a0 : * 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 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 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 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 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 if (req == NULL) ffc0a430: 7c 69 1b 79 mr. r9,r3 ffc0a434: 41 82 00 28 beq- ffc0a45c <== 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 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 <== NOT EXECUTED =============================================================================== ffc0a958 : 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 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 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 <== NEVER TAKEN ffc0a9d8: 4e 80 00 20 blr =============================================================================== ffc0925c : 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 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 _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 <== 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 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 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 =============================================================================== ffc2eb68 : 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 <== 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 _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 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 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 * * 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 : 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 ffc1e098: 7f 83 f8 00 cmpw cr7,r3,r31 ffc1e09c: 40 9e 02 ac bne- cr7,ffc1e348 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 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 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 /* * 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 ffc1e0d8: 2f 9e 00 04 cmpwi cr7,r30,4 ffc1e0dc: 41 9e 01 c8 beq- cr7,ffc1e2a4 ffc1e0e0: 2f 9e 00 0b cmpwi cr7,r30,11 ffc1e0e4: 41 9e 01 c0 beq- cr7,ffc1e2a4 * 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 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 */ 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 #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 /* * 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 ffc1e170: 48 00 01 68 b ffc1e2d8 #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 <== 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 <== 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 <== 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 <== 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 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 /* * 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 #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 * * 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 * 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 <== 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 <== 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 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 * + 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 } } } } if ( interested ) { ffc1e244: 2f 83 00 00 cmpwi cr7,r3,0 ffc1e248: 41 9e 00 18 beq- cr7,ffc1e260 /* * 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 /* * 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 /* * 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 ffc1e2a8: 7f c4 f3 78 mr r4,r30 ffc1e2ac: 48 00 02 61 bl ffc1e50c } 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 */ _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 _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 /* * 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 */ 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 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 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 ffc1e344: 4b ff fe e4 b ffc1e228 /* * 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 */ 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 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 =============================================================================== ffc09ca0 : * * 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 */ 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 <== 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 } 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 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 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 _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 /* * 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 _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 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 =============================================================================== ffc0e97c : 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 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 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 <== 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 : 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 return EINVAL; if ( count == 0 ) ffc098ec: 2f 85 00 00 cmpwi cr7,r5,0 ffc098f0: 40 9e 00 28 bne- cr7,ffc09918 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 } /* * 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 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 <== 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 _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 * 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 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 _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 =============================================================================== ffc09078 : 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 * * 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 <== 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 : */ 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 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 <== 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 *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 _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 { 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 _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 =============================================================================== ffc0954c : 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 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 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 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 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 * 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 ffc09628: 2f 89 00 02 cmpwi cr7,r9,2 ffc0962c: 40 9e ff 88 bne+ cr7,ffc095b4 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 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 <== 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 #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 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 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 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 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_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 } /* * 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 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 } /* * 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 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 =============================================================================== ffc1e50c : 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 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 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 <== 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 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 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 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 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 #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 <== NOT EXECUTED =============================================================================== ffc0ba9c : */ 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 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 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 <== ALWAYS TAKEN return EINVAL; ffc0bb2c: 38 60 00 16 li r3,22 <== NOT EXECUTED ffc0bb30: 4b ff ff b4 b ffc0bae4 <== 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 <== 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 =============================================================================== ffc09df8 : 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 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 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 (*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 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 <== 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 } 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 =============================================================================== ffc0a1dc : 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 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 } /* * 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 <== 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 <== 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 _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 * 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 the_attr = &default_attr; ffc0a2ac: 39 21 00 08 addi r9,r1,8 ffc0a2b0: 4b ff ff 5c b ffc0a20c _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 =============================================================================== ffc0a80c : 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 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 * 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 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 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 #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 <== 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 <== NEVER TAKEN ffc0a8e4: 4b ff ff cc b ffc0a8b0 =============================================================================== ffc0a8e8 : 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 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 * 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 ffc0a974: 2f 89 00 02 cmpwi cr7,r9,2 ffc0a978: 41 9e 00 30 beq- cr7,ffc0a9a8 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 #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 <== 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 <== NEVER TAKEN ffc0a9c0: 4b ff ff cc b ffc0a98c =============================================================================== ffc0c66c : 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 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 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 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 (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 <== NEVER TAKEN ffc0c764: 2f 9d 00 02 cmpwi cr7,r29,2 ffc0c768: 40 9d 00 58 ble- cr7,ffc0c7c0 ffc0c76c: 2f 9d 00 04 cmpwi cr7,r29,4 ffc0c770: 40 be 00 1c bne+ cr7,ffc0c78c <== 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 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 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 =============================================================================== ffc09b20 : /* * 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 <== 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 <== 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 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 : * 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 if (result != 0) { ffc0a0d8: 7c 7d 1b 79 mr. r29,r3 ffc0a0dc: 40 82 00 d4 bne- ffc0a1b0 <== 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 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 req->caller_thread = pthread_self (); ffc0a0f0: 48 00 18 15 bl ffc0b904 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 <== 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 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 req->aiocbp->aio_fildes, 0); if (r_chain != NULL) ffc0a150: 7c 7c 1b 79 mr. r28,r3 ffc0a154: 41 82 01 04 beq- ffc0a258 { 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 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 pthread_cond_signal (&r_chain->cond); ffc0a170: 38 7c 00 20 addi r3,r28,32 ffc0a174: 48 00 06 39 bl ffc0a7ac pthread_mutex_unlock (&r_chain->mutex); ffc0a178: 7f 63 db 78 mr r3,r27 ffc0a17c: 48 00 0d 15 bl ffc0ae90 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 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 <== 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 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_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_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 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 rtems_aio_handle, (void *) r_chain); if (result != 0) { ffc0a240: 7c 7f 1b 79 mr. r31,r3 ffc0a244: 40 82 00 80 bne- ffc0a2c4 <== 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 } 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 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 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 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 <== 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 <== NOT EXECUTED ffc0a29c: 4b ff fe e4 b ffc0a180 <== 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_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 ffc0a2c0: 4b ff ff c8 b ffc0a288 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 <== NOT EXECUTED ffc0a2cc: 7f fd fb 78 mr r29,r31 <== NOT EXECUTED ffc0a2d0: 4b ff fe b8 b ffc0a188 <== NOT EXECUTED =============================================================================== ffc099ac : * 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 if (result != 0) ffc09a14: 7c 7e 1b 79 mr. r30,r3 ffc09a18: 40 82 00 8c bne- ffc09aa4 <== 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 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 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 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 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 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 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 ffc09a74: 2f 89 00 03 cmpwi cr7,r9,3 ffc09a78: 41 9e 00 9c beq- cr7,ffc09b14 <== NEVER TAKEN ffc09a7c: 2f 89 00 01 cmpwi cr7,r9,1 ffc09a80: 41 9e 00 64 beq- cr7,ffc09ae4 <== 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 <== NOT EXECUTED if (result != 0) ffc09a9c: 7c 7e 1b 79 mr. r30,r3 <== NOT EXECUTED ffc09aa0: 41 82 ff 7c beq+ ffc09a1c <== 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 break; default: result = -1; } if (result == -1) { ffc09afc: 2f 83 ff ff cmpwi cr7,r3,-1 ffc09b00: 41 9e 01 80 beq- cr7,ffc09c80 <== 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 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 <== NOT EXECUTED break; ffc09b1c: 4b ff ff e0 b ffc09afc <== 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 (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; ffc09b38: 4b ff ff c4 b ffc09afc 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_lock (&aio_request_queue.mutex); ffc09b44: 7f 43 d3 78 mr r3,r26 ffc09b48: 48 00 12 99 bl ffc0ade0 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 <== 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 ffc09b60: 4b ff fe ac b ffc09a0c 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 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 &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 <== 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_cond_destroy (&r_chain->cond); ffc09bac: 7f e3 fb 78 mr r3,r31 ffc09bb0: 48 00 09 cd bl ffc0a57c free (r_chain); ffc09bb4: 7f a3 eb 78 mr r3,r29 ffc09bb8: 4b ff b2 8d bl ffc04e44 */ 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 } } /* 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 <== NEVER TAKEN ffc09bfc: 7f 89 b8 00 cmpw cr7,r9,r23 ffc09c00: 41 9e 00 18 beq- cr7,ffc09c18 <== 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_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 /* 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 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 &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 <== ALWAYS TAKEN ffc09c78: 83 ba 00 54 lwz r29,84(r26) <== NOT EXECUTED ffc09c7c: 4b ff ff 4c b ffc09bc8 <== NOT EXECUTED ffc09c80: 83 df 00 14 lwz r30,20(r31) <== NOT EXECUTED ffc09c84: 4b ff fe 00 b ffc09a84 <== 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 ffc09c9c: 4b ff fe 08 b ffc09aa4 =============================================================================== ffc09cf8 : * 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 if (result != 0) ffc09d20: 7c 7d 1b 79 mr. r29,r3 ffc09d24: 41 82 00 24 beq- ffc09d48 <== 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 (&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 <== 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 if (result != 0) ffc09d70: 2f 83 00 00 cmpwi cr7,r3,0 ffc09d74: 40 9e 00 9c bne- cr7,ffc09e10 <== 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 if (result != 0) { ffc09d88: 7c 7d 1b 79 mr. r29,r3 ffc09d8c: 40 82 00 a4 bne- ffc09e30 <== 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 <== 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 <== NOT EXECUTED if (result != 0) ffc09e08: 2f 83 00 00 cmpwi cr7,r3,0 <== NOT EXECUTED ffc09e0c: 41 9e ff 6c beq+ cr7,ffc09d78 <== 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 <== 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 <== NOT EXECUTED if (result != 0) { ffc09e28: 7c 7d 1b 79 mr. r29,r3 <== NOT EXECUTED ffc09e2c: 41 82 ff 64 beq+ ffc09d90 <== 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 <== 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 <== NOT EXECUTED ffc09e40: 4b ff ff 50 b ffc09d90 <== NOT EXECUTED =============================================================================== ffc09ca0 : 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 <== 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 <== NEVER TAKEN ffc09ccc: 48 00 00 20 b ffc09cec ffc09cd0: 41 9e 00 1c beq- cr7,ffc09cec <== 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 <== 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 : * 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 <== 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 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 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 : * 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 ffc0a01c: 48 00 00 70 b ffc0a08c } } 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 <== 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 <== 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 } 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_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_event_set out; sc = rtems_event_receive( ffc0a5d8: 4b ff f0 11 bl ffc095e8 ) { 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 <== 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_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 <== 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 <== 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_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 <== 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_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 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 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_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 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 _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 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 * * 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 _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 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 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 <== 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 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 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 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 } /* 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 <== 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 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 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 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 =============================================================================== ffc0d020 : #include #include 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 #include 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 <== NEVER TAKEN ffc0d048: 3f 80 00 00 lis r28,0 ffc0d04c: 3b 9c 30 78 addi r28,r28,12408 #endif #include #include 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 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 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 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 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 (*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_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 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 * 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 <== 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 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 <== NOT EXECUTED =============================================================================== ffc0b374 : 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 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 return RTEMS_INVALID_ADDRESS; if ( !id ) ffc0b3d0: 2f 88 00 00 cmpwi cr7,r8,0 ffc0b3d4: 41 be ff cc beq- cr7,ffc0b3a0 <== 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 ffc0b3e8: 2f 86 00 00 cmpwi cr7,r6,0 ffc0b3ec: 41 9e ff b4 beq+ cr7,ffc0b3a0 ffc0b3f0: 7f 85 30 40 cmplw cr7,r5,r6 ffc0b3f4: 41 9c ff ac blt+ cr7,ffc0b3a0 ffc0b3f8: 70 c9 00 07 andi. r9,r6,7 ffc0b3fc: 40 82 ff a4 bne+ ffc0b3a0 !_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 * * 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 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 _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 =============================================================================== ffc1a1a0 : 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 ) { 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_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 <== 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_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 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_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_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 _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 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 _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 _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 <== 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 _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 <== 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 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 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 <== 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 /* * 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 <== NOT EXECUTED =============================================================================== ffc2f6d4 : 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 <== 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 <== 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 /* * 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 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 if ( status != RTEMS_SUCCESSFUL ) ffc2f7e4: 2f 83 00 00 cmpwi cr7,r3,0 ffc2f7e8: 40 9e ff e0 bne+ cr7,ffc2f7c8 #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 #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 /* * 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 (*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 <== 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 =============================================================================== ffc2f97c : * * 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 <== 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 /* * 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 /* * 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 : 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 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 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 <== 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_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_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_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 <== 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 } } } 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 <== NOT EXECUTED ffc0ac18: 7f 84 f0 40 cmplw cr7,r4,r30 <== NOT EXECUTED ffc0ac1c: 40 9d ff 50 ble+ cr7,ffc0ab6c <== 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 <== 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 if (new_chunk != NULL) { ffc0ac30: 7c 7b 1b 79 mr. r27,r3 ffc0ac34: 41 a2 ff 60 beq- ffc0ab94 <== 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 : /* 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 <== NOT EXECUTED if (chunk != NULL) { ffc0ae24: 2c 03 00 00 cmpwi r3,0 <== NOT EXECUTED ffc0ae28: 41 82 00 1c beq- ffc0ae44 <== 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_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 _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 <== 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 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 <== 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 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_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 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_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 <== 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 ) { 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 } } 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 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 <== NOT EXECUTED =============================================================================== ffc0a9dc : 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 } } 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 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 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 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 } 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 <== 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 { 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 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 ) { 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 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 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 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 =============================================================================== ffc1be94 : 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 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 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 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 ) { 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 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 <== 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 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 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 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 =============================================================================== ffc153b8 : 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 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 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 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 if ( _Modes_Is_timeslice(mode_set) ) { ffc15440: 70 68 02 00 andi. r8,r3,512 ffc15444: 41 82 01 4c beq- ffc15590 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 } 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 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 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 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 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 ffc15534: 4b ff fe f8 b ffc1542c { 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 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 (!_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 <== 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 ffc1559c: 4b ff fe c8 b ffc15464 _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 =============================================================================== ffc0f188 : 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_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 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 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 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 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 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 <== 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_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 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 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 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 ffc08790: 48 00 00 74 b ffc08804 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 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 <== 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 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 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 =============================================================================== ffc08814 : 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 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 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 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 ffc08864: 48 00 00 60 b ffc088c4 */ *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 <== 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 /* * 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 =============================================================================== ffc1cc7c : */ 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 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 <== 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_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 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 <== 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 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 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 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 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 =============================================================================== ffc09ed8 : int sched_get_priority_max( int policy ) { switch ( policy ) { ffc09ed8: 2b 83 00 04 cmplwi cr7,r3,4 #include 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 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 <== 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 : */ 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 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 <== 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 : 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 <== 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 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 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 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 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 =============================================================================== ffc0ab64 : * * 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 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 /* * 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 ffc0abe8: 40 92 00 c8 bne- cr4,ffc0acb0 _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 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 /* * 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 <== ALWAYS TAKEN return SEM_FAILED; ffc0acd8: 38 60 ff ff li r3,-1 <== NOT EXECUTED ffc0acdc: 4b ff ff 88 b ffc0ac64 <== 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 =============================================================================== ffc0cc08 : 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 <== 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 : 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 *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 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 * * 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 /* * 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 <== 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 _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 * 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 <== 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 =============================================================================== ffc0a454 : 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 /* 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 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 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 <== 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 <== 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 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 * * 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 || !(*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 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 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 /* 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 * 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 =============================================================================== ffc0c694 : 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 if ( status != -1 ) { ffc0c6b4: 2f 83 ff ff cmpwi cr7,r3,-1 ffc0c6b8: 41 9e 00 28 beq- cr7,ffc0c6e0 if ( sig ) ffc0c6bc: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0c6c0: 41 9e 00 3c beq- cr7,ffc0c6fc <== 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 : 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 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 /* * 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 /* 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 <== 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 <== 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 <== 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 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 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 =============================================================================== ffc0949c : 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 <== 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 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 <== 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 ffc094f8: 2f 9f 00 00 cmpwi cr7,r31,0 ffc094fc: 40 9e 02 1c bne- cr7,ffc09718 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 <== 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 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 _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 /* * 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 *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 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 #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 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 *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 : 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 _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 <== 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 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 * 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