RTEMS 4.11Annotated Report
Fri Sep 28 12:54:51 2012
0010c774 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
10c774: 55 push %ebp
10c775: 89 e5 mov %esp,%ebp
10c777: 53 push %ebx
10c778: 51 push %ecx
10c779: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10c77c: 8b 15 e4 18 13 00 mov 0x1318e4,%edx
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
10c782: 9c pushf
10c783: fa cli
10c784: 58 pop %eax
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
10c785: 8b 4b 44 mov 0x44(%ebx),%ecx
10c788: 85 c9 test %ecx,%ecx
10c78a: 75 0b jne 10c797 <_CORE_RWLock_Release+0x23>
_ISR_Enable( level );
10c78c: 50 push %eax
10c78d: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10c78e: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
return CORE_RWLOCK_SUCCESSFUL;
10c795: eb 6c jmp 10c803 <_CORE_RWLock_Release+0x8f>
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
10c797: 49 dec %ecx
10c798: 75 09 jne 10c7a3 <_CORE_RWLock_Release+0x2f>
the_rwlock->number_of_readers -= 1;
if ( the_rwlock->number_of_readers != 0 ) {
10c79a: ff 4b 48 decl 0x48(%ebx)
10c79d: 74 04 je 10c7a3 <_CORE_RWLock_Release+0x2f>
/* must be unlocked again */
_ISR_Enable( level );
10c79f: 50 push %eax
10c7a0: 9d popf
return CORE_RWLOCK_SUCCESSFUL;
10c7a1: eb 60 jmp 10c803 <_CORE_RWLock_Release+0x8f>
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10c7a3: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
10c7aa: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
_ISR_Enable( level );
10c7b1: 50 push %eax
10c7b2: 9d popf
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
10c7b3: 83 ec 0c sub $0xc,%esp
10c7b6: 53 push %ebx
10c7b7: e8 80 18 00 00 call 10e03c <_Thread_queue_Dequeue>
if ( next ) {
10c7bc: 83 c4 10 add $0x10,%esp
10c7bf: 85 c0 test %eax,%eax
10c7c1: 74 40 je 10c803 <_CORE_RWLock_Release+0x8f>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
10c7c3: 83 78 30 01 cmpl $0x1,0x30(%eax)
10c7c7: 75 09 jne 10c7d2 <_CORE_RWLock_Release+0x5e>
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10c7c9: c7 43 44 02 00 00 00 movl $0x2,0x44(%ebx)
return CORE_RWLOCK_SUCCESSFUL;
10c7d0: eb 31 jmp 10c803 <_CORE_RWLock_Release+0x8f>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
10c7d2: ff 43 48 incl 0x48(%ebx)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10c7d5: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
10c7dc: 83 ec 0c sub $0xc,%esp
10c7df: 53 push %ebx
10c7e0: e8 1b 1c 00 00 call 10e400 <_Thread_queue_First>
if ( !next ||
10c7e5: 83 c4 10 add $0x10,%esp
10c7e8: 85 c0 test %eax,%eax
10c7ea: 74 17 je 10c803 <_CORE_RWLock_Release+0x8f>
10c7ec: 83 78 30 01 cmpl $0x1,0x30(%eax)
10c7f0: 74 11 je 10c803 <_CORE_RWLock_Release+0x8f><== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
10c7f2: ff 43 48 incl 0x48(%ebx)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
10c7f5: 52 push %edx
10c7f6: 52 push %edx
10c7f7: 50 push %eax
10c7f8: 53 push %ebx
10c7f9: e8 fa 1a 00 00 call 10e2f8 <_Thread_queue_Extract>
}
10c7fe: 83 c4 10 add $0x10,%esp
10c801: eb d9 jmp 10c7dc <_CORE_RWLock_Release+0x68>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10c803: 31 c0 xor %eax,%eax
10c805: 8b 5d fc mov -0x4(%ebp),%ebx
10c808: c9 leave
10c809: c3 ret
0010c80c <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
10c80c: 55 push %ebp
10c80d: 89 e5 mov %esp,%ebp
10c80f: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10c812: 8d 45 f4 lea -0xc(%ebp),%eax
10c815: 50 push %eax
10c816: ff 75 08 pushl 0x8(%ebp)
10c819: e8 d6 14 00 00 call 10dcf4 <_Thread_Get>
switch ( location ) {
10c81e: 83 c4 10 add $0x10,%esp
10c821: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10c825: 75 1c jne 10c843 <_CORE_RWLock_Timeout+0x37><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10c827: 83 ec 0c sub $0xc,%esp
10c82a: 50 push %eax
10c82b: e8 84 1c 00 00 call 10e4b4 <_Thread_queue_Process_timeout>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
10c830: a1 dc 13 13 00 mov 0x1313dc,%eax
10c835: 48 dec %eax
10c836: a3 dc 13 13 00 mov %eax,0x1313dc
return _Thread_Dispatch_disable_level;
10c83b: a1 dc 13 13 00 mov 0x1313dc,%eax
10c840: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10c843: c9 leave
10c844: c3 ret
0010a9a4 <_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
)
{
10a9a4: 55 push %ebp
10a9a5: 89 e5 mov %esp,%ebp
10a9a7: 53 push %ebx
10a9a8: 83 ec 10 sub $0x10,%esp
10a9ab: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
10a9ae: 53 push %ebx
10a9af: e8 c0 17 00 00 call 10c174 <_Thread_queue_Dequeue>
10a9b4: 83 c4 10 add $0x10,%esp
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10a9b7: 31 d2 xor %edx,%edx
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
10a9b9: 85 c0 test %eax,%eax
10a9bb: 75 15 jne 10a9d2 <_CORE_semaphore_Surrender+0x2e>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
10a9bd: 9c pushf
10a9be: fa cli
10a9bf: 59 pop %ecx
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10a9c0: 8b 43 48 mov 0x48(%ebx),%eax
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
10a9c3: b2 04 mov $0x4,%dl
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10a9c5: 3b 43 40 cmp 0x40(%ebx),%eax
10a9c8: 73 06 jae 10a9d0 <_CORE_semaphore_Surrender+0x2c><== NEVER TAKEN
the_semaphore->count += 1;
10a9ca: 40 inc %eax
10a9cb: 89 43 48 mov %eax,0x48(%ebx)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10a9ce: 30 d2 xor %dl,%dl
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
10a9d0: 51 push %ecx
10a9d1: 9d popf
}
return status;
}
10a9d2: 89 d0 mov %edx,%eax
10a9d4: 8b 5d fc mov -0x4(%ebp),%ebx
10a9d7: c9 leave
10a9d8: c3 ret
00109a10 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
109a10: 55 push %ebp
109a11: 89 e5 mov %esp,%ebp
109a13: 57 push %edi
109a14: 56 push %esi
109a15: 53 push %ebx
109a16: 83 ec 1c sub $0x1c,%esp
109a19: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
109a1c: 8b b3 e4 00 00 00 mov 0xe4(%ebx),%esi
option_set = (rtems_option) the_thread->Wait.option;
109a22: 8b 43 30 mov 0x30(%ebx),%eax
109a25: 89 45 e0 mov %eax,-0x20(%ebp)
_ISR_Disable( level );
109a28: 9c pushf
109a29: fa cli
109a2a: 58 pop %eax
pending_events = api->pending_events;
109a2b: 8b 16 mov (%esi),%edx
109a2d: 89 55 e4 mov %edx,-0x1c(%ebp)
event_condition = (rtems_event_set) the_thread->Wait.count;
109a30: 8b 4b 24 mov 0x24(%ebx),%ecx
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
109a33: 21 ca and %ecx,%edx
109a35: 75 05 jne 109a3c <_Event_Surrender+0x2c>
109a37: e9 ab 00 00 00 jmp 109ae7 <_Event_Surrender+0xd7>
/*
* 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() &&
109a3c: 83 3d e8 e8 12 00 00 cmpl $0x0,0x12e8e8
109a43: 74 47 je 109a8c <_Event_Surrender+0x7c>
109a45: 3b 1d ec e8 12 00 cmp 0x12e8ec,%ebx
109a4b: 75 3f jne 109a8c <_Event_Surrender+0x7c>
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
109a4d: 8b 3d c8 ec 12 00 mov 0x12ecc8,%edi
/*
* 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 ) &&
109a53: 83 ff 02 cmp $0x2,%edi
109a56: 74 09 je 109a61 <_Event_Surrender+0x51> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
109a58: 8b 3d c8 ec 12 00 mov 0x12ecc8,%edi
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
109a5e: 4f dec %edi
109a5f: 75 2b jne 109a8c <_Event_Surrender+0x7c>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
109a61: 39 ca cmp %ecx,%edx
109a63: 74 06 je 109a6b <_Event_Surrender+0x5b>
109a65: f6 45 e0 02 testb $0x2,-0x20(%ebp)
109a69: 74 7c je 109ae7 <_Event_Surrender+0xd7> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
109a6b: 89 d1 mov %edx,%ecx
109a6d: f7 d1 not %ecx
109a6f: 23 4d e4 and -0x1c(%ebp),%ecx
109a72: 89 0e mov %ecx,(%esi)
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
109a74: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
109a7b: 8b 4b 28 mov 0x28(%ebx),%ecx
109a7e: 89 11 mov %edx,(%ecx)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
109a80: c7 05 c8 ec 12 00 03 movl $0x3,0x12ecc8
109a87: 00 00 00
109a8a: eb 5b jmp 109ae7 <_Event_Surrender+0xd7>
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
109a8c: f6 43 11 01 testb $0x1,0x11(%ebx)
109a90: 74 55 je 109ae7 <_Event_Surrender+0xd7>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
109a92: 39 ca cmp %ecx,%edx
109a94: 74 06 je 109a9c <_Event_Surrender+0x8c>
109a96: f6 45 e0 02 testb $0x2,-0x20(%ebp)
109a9a: 74 4b je 109ae7 <_Event_Surrender+0xd7> <== NEVER TAKEN
109a9c: 89 d1 mov %edx,%ecx
109a9e: f7 d1 not %ecx
109aa0: 23 4d e4 and -0x1c(%ebp),%ecx
109aa3: 89 0e mov %ecx,(%esi)
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
109aa5: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
109aac: 8b 4b 28 mov 0x28(%ebx),%ecx
109aaf: 89 11 mov %edx,(%ecx)
_ISR_Flash( level );
109ab1: 50 push %eax
109ab2: 9d popf
109ab3: fa cli
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
109ab4: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
109ab8: 74 06 je 109ac0 <_Event_Surrender+0xb0>
_ISR_Enable( level );
109aba: 50 push %eax
109abb: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
109abc: 51 push %ecx
109abd: 51 push %ecx
109abe: eb 17 jmp 109ad7 <_Event_Surrender+0xc7>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
109ac0: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
109ac7: 50 push %eax
109ac8: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
109ac9: 83 ec 0c sub $0xc,%esp
109acc: 8d 43 48 lea 0x48(%ebx),%eax
109acf: 50 push %eax
109ad0: e8 43 2f 00 00 call 10ca18 <_Watchdog_Remove>
109ad5: 58 pop %eax
109ad6: 5a pop %edx
109ad7: 68 f8 ff 03 10 push $0x1003fff8
109adc: 53 push %ebx
109add: e8 fa 1f 00 00 call 10badc <_Thread_Clear_state>
109ae2: 83 c4 10 add $0x10,%esp
109ae5: eb 02 jmp 109ae9 <_Event_Surrender+0xd9>
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
109ae7: 50 push %eax
109ae8: 9d popf
}
109ae9: 8d 65 f4 lea -0xc(%ebp),%esp
109aec: 5b pop %ebx
109aed: 5e pop %esi
109aee: 5f pop %edi
109aef: 5d pop %ebp
109af0: c3 ret
00109af4 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
109af4: 55 push %ebp
109af5: 89 e5 mov %esp,%ebp
109af7: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
109afa: 8d 45 f4 lea -0xc(%ebp),%eax
109afd: 50 push %eax
109afe: ff 75 08 pushl 0x8(%ebp)
109b01: e8 26 23 00 00 call 10be2c <_Thread_Get>
switch ( location ) {
109b06: 83 c4 10 add $0x10,%esp
109b09: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
109b0d: 75 4e jne 109b5d <_Event_Timeout+0x69> <== NEVER TAKEN
*
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
_ISR_Disable( level );
109b0f: 9c pushf
109b10: fa cli
109b11: 5a pop %edx
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
109b12: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
if ( _Thread_Is_executing( the_thread ) ) {
109b19: 3b 05 ec e8 12 00 cmp 0x12e8ec,%eax
109b1f: 75 13 jne 109b34 <_Event_Timeout+0x40>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
109b21: 8b 0d c8 ec 12 00 mov 0x12ecc8,%ecx
109b27: 49 dec %ecx
109b28: 75 0a jne 109b34 <_Event_Timeout+0x40>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
109b2a: c7 05 c8 ec 12 00 02 movl $0x2,0x12ecc8
109b31: 00 00 00
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
109b34: c7 40 34 06 00 00 00 movl $0x6,0x34(%eax)
_ISR_Enable( level );
109b3b: 52 push %edx
109b3c: 9d popf
109b3d: 52 push %edx
109b3e: 52 push %edx
109b3f: 68 f8 ff 03 10 push $0x1003fff8
109b44: 50 push %eax
109b45: e8 92 1f 00 00 call 10badc <_Thread_Clear_state>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
109b4a: a1 e4 e3 12 00 mov 0x12e3e4,%eax
109b4f: 48 dec %eax
109b50: a3 e4 e3 12 00 mov %eax,0x12e3e4
return _Thread_Dispatch_disable_level;
109b55: a1 e4 e3 12 00 mov 0x12e3e4,%eax
109b5a: 83 c4 10 add $0x10,%esp
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
109b5d: c9 leave
109b5e: c3 ret
0010f33f <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
10f33f: 55 push %ebp
10f340: 89 e5 mov %esp,%ebp
10f342: 57 push %edi
10f343: 56 push %esi
10f344: 53 push %ebx
10f345: 83 ec 4c sub $0x4c,%esp
10f348: 8b 5d 08 mov 0x8(%ebp),%ebx
10f34b: 8b 45 10 mov 0x10(%ebp),%eax
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
10f34e: 8b 4b 20 mov 0x20(%ebx),%ecx
10f351: 89 4d b8 mov %ecx,-0x48(%ebp)
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;
10f354: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
Heap_Block *extend_last_block = NULL;
10f35b: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
uintptr_t const page_size = heap->page_size;
10f362: 8b 73 10 mov 0x10(%ebx),%esi
10f365: 89 75 bc mov %esi,-0x44(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10f368: 8b 53 14 mov 0x14(%ebx),%edx
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;
10f36b: 8b 4b 30 mov 0x30(%ebx),%ecx
10f36e: 89 4d b4 mov %ecx,-0x4c(%ebp)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
10f371: 8b 75 0c mov 0xc(%ebp),%esi
10f374: 01 c6 add %eax,%esi
10f376: 89 75 d4 mov %esi,-0x2c(%ebp)
10f379: 73 07 jae 10f382 <_Heap_Extend+0x43>
return false;
10f37b: 31 c0 xor %eax,%eax
10f37d: e9 cb 01 00 00 jmp 10f54d <_Heap_Extend+0x20e>
}
extend_area_ok = _Heap_Get_first_and_last_block(
10f382: 51 push %ecx
10f383: 51 push %ecx
10f384: 8d 4d e4 lea -0x1c(%ebp),%ecx
10f387: 51 push %ecx
10f388: 8d 4d e0 lea -0x20(%ebp),%ecx
10f38b: 51 push %ecx
10f38c: 52 push %edx
10f38d: ff 75 bc pushl -0x44(%ebp)
10f390: 50 push %eax
10f391: ff 75 0c pushl 0xc(%ebp)
10f394: e8 89 b8 ff ff call 10ac22 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
10f399: 83 c4 20 add $0x20,%esp
10f39c: 84 c0 test %al,%al
10f39e: 74 db je 10f37b <_Heap_Extend+0x3c>
10f3a0: 8b 4d b8 mov -0x48(%ebp),%ecx
10f3a3: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
10f3aa: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
10f3b1: 31 ff xor %edi,%edi
10f3b3: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp)
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
10f3ba: 8b 73 18 mov 0x18(%ebx),%esi
10f3bd: 89 75 c0 mov %esi,-0x40(%ebp)
10f3c0: eb 03 jmp 10f3c5 <_Heap_Extend+0x86>
10f3c2: 89 4d c0 mov %ecx,-0x40(%ebp)
uintptr_t const sub_area_end = start_block->prev_size;
10f3c5: 8b 01 mov (%ecx),%eax
10f3c7: 89 45 d0 mov %eax,-0x30(%ebp)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10f3ca: 89 c6 mov %eax,%esi
10f3cc: 83 ee 08 sub $0x8,%esi
10f3cf: 31 d2 xor %edx,%edx
10f3d1: f7 75 bc divl -0x44(%ebp)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
10f3d4: 29 d6 sub %edx,%esi
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
10f3d6: 8b 55 c0 mov -0x40(%ebp),%edx
10f3d9: 39 55 d4 cmp %edx,-0x2c(%ebp)
10f3dc: 76 08 jbe 10f3e6 <_Heap_Extend+0xa7>
10f3de: 8b 45 d0 mov -0x30(%ebp),%eax
10f3e1: 39 45 0c cmp %eax,0xc(%ebp)
10f3e4: 72 95 jb 10f37b <_Heap_Extend+0x3c>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
10f3e6: 8b 55 c0 mov -0x40(%ebp),%edx
10f3e9: 39 55 d4 cmp %edx,-0x2c(%ebp)
10f3ec: 74 0a je 10f3f8 <_Heap_Extend+0xb9>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
10f3ee: 8b 45 d0 mov -0x30(%ebp),%eax
10f3f1: 39 45 d4 cmp %eax,-0x2c(%ebp)
10f3f4: 72 07 jb 10f3fd <_Heap_Extend+0xbe>
10f3f6: eb 08 jmp 10f400 <_Heap_Extend+0xc1>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
10f3f8: 89 4d cc mov %ecx,-0x34(%ebp)
10f3fb: eb 03 jmp 10f400 <_Heap_Extend+0xc1>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
10f3fd: 89 4d c4 mov %ecx,-0x3c(%ebp)
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
10f400: 8b 55 0c mov 0xc(%ebp),%edx
10f403: 39 55 d0 cmp %edx,-0x30(%ebp)
10f406: 75 09 jne 10f411 <_Heap_Extend+0xd2>
start_block->prev_size = extend_area_end;
10f408: 8b 45 d4 mov -0x2c(%ebp),%eax
10f40b: 89 01 mov %eax,(%ecx)
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 )
10f40d: 89 f7 mov %esi,%edi
10f40f: eb 05 jmp 10f416 <_Heap_Extend+0xd7>
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
10f411: 73 03 jae 10f416 <_Heap_Extend+0xd7>
10f413: 89 75 c8 mov %esi,-0x38(%ebp)
- 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;
10f416: 8b 4e 04 mov 0x4(%esi),%ecx
10f419: 83 e1 fe and $0xfffffffe,%ecx
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10f41c: 01 f1 add %esi,%ecx
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
10f41e: 3b 4d b8 cmp -0x48(%ebp),%ecx
10f421: 75 9f jne 10f3c2 <_Heap_Extend+0x83>
if ( extend_area_begin < heap->area_begin ) {
10f423: 8b 4d 0c mov 0xc(%ebp),%ecx
10f426: 3b 4b 18 cmp 0x18(%ebx),%ecx
10f429: 73 05 jae 10f430 <_Heap_Extend+0xf1>
heap->area_begin = extend_area_begin;
10f42b: 89 4b 18 mov %ecx,0x18(%ebx)
10f42e: eb 0b jmp 10f43b <_Heap_Extend+0xfc>
} else if ( heap->area_end < extend_area_end ) {
10f430: 8b 75 d4 mov -0x2c(%ebp),%esi
10f433: 39 73 1c cmp %esi,0x1c(%ebx)
10f436: 73 03 jae 10f43b <_Heap_Extend+0xfc>
heap->area_end = extend_area_end;
10f438: 89 73 1c mov %esi,0x1c(%ebx)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
10f43b: 8b 45 e4 mov -0x1c(%ebp),%eax
10f43e: 8b 55 e0 mov -0x20(%ebp),%edx
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
10f441: 89 c1 mov %eax,%ecx
10f443: 29 d1 sub %edx,%ecx
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
10f445: 8b 75 d4 mov -0x2c(%ebp),%esi
10f448: 89 32 mov %esi,(%edx)
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
10f44a: 89 ce mov %ecx,%esi
10f44c: 83 ce 01 or $0x1,%esi
10f44f: 89 72 04 mov %esi,0x4(%edx)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
10f452: 89 08 mov %ecx,(%eax)
extend_last_block->size_and_flag = 0;
10f454: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
10f45b: 39 53 20 cmp %edx,0x20(%ebx)
10f45e: 76 05 jbe 10f465 <_Heap_Extend+0x126>
heap->first_block = extend_first_block;
10f460: 89 53 20 mov %edx,0x20(%ebx)
10f463: eb 08 jmp 10f46d <_Heap_Extend+0x12e>
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
10f465: 39 43 24 cmp %eax,0x24(%ebx)
10f468: 73 03 jae 10f46d <_Heap_Extend+0x12e>
heap->last_block = extend_last_block;
10f46a: 89 43 24 mov %eax,0x24(%ebx)
}
if ( merge_below_block != NULL ) {
10f46d: 83 7d cc 00 cmpl $0x0,-0x34(%ebp)
10f471: 74 35 je 10f4a8 <_Heap_Extend+0x169>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
10f473: 8b 73 10 mov 0x10(%ebx),%esi
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
10f476: 8b 4d 0c mov 0xc(%ebp),%ecx
10f479: 83 c1 08 add $0x8,%ecx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
10f47c: 89 c8 mov %ecx,%eax
10f47e: 31 d2 xor %edx,%edx
10f480: f7 f6 div %esi
if ( remainder != 0 ) {
10f482: 85 d2 test %edx,%edx
10f484: 74 04 je 10f48a <_Heap_Extend+0x14b>
return value - remainder + alignment;
10f486: 01 f1 add %esi,%ecx
10f488: 29 d1 sub %edx,%ecx
uintptr_t const new_first_block_begin =
10f48a: 8d 51 f8 lea -0x8(%ecx),%edx
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;
10f48d: 8b 75 cc mov -0x34(%ebp),%esi
10f490: 8b 06 mov (%esi),%eax
10f492: 89 41 f8 mov %eax,-0x8(%ecx)
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 =
10f495: 89 f0 mov %esi,%eax
10f497: 29 d0 sub %edx,%eax
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;
10f499: 83 c8 01 or $0x1,%eax
10f49c: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, new_first_block );
10f49f: 89 d8 mov %ebx,%eax
10f4a1: e8 7e fe ff ff call 10f324 <_Heap_Free_block>
10f4a6: eb 11 jmp 10f4b9 <_Heap_Extend+0x17a>
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
10f4a8: 83 7d c4 00 cmpl $0x0,-0x3c(%ebp)
10f4ac: 74 0b je 10f4b9 <_Heap_Extend+0x17a>
{
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;
10f4ae: 8b 55 c4 mov -0x3c(%ebp),%edx
10f4b1: 29 c2 sub %eax,%edx
10f4b3: 83 ca 01 or $0x1,%edx
10f4b6: 89 50 04 mov %edx,0x4(%eax)
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
10f4b9: 85 ff test %edi,%edi
10f4bb: 74 33 je 10f4f0 <_Heap_Extend+0x1b1>
)
{
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,
10f4bd: 8b 4d d4 mov -0x2c(%ebp),%ecx
10f4c0: 83 e9 08 sub $0x8,%ecx
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(
10f4c3: 29 f9 sub %edi,%ecx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10f4c5: 89 c8 mov %ecx,%eax
10f4c7: 31 d2 xor %edx,%edx
10f4c9: f7 73 10 divl 0x10(%ebx)
10f4cc: 29 d1 sub %edx,%ecx
);
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)
10f4ce: 8b 47 04 mov 0x4(%edi),%eax
10f4d1: 29 c8 sub %ecx,%eax
| HEAP_PREV_BLOCK_USED;
10f4d3: 83 c8 01 or $0x1,%eax
10f4d6: 89 44 39 04 mov %eax,0x4(%ecx,%edi,1)
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;
10f4da: 8b 47 04 mov 0x4(%edi),%eax
10f4dd: 83 e0 01 and $0x1,%eax
block->size_and_flag = size | flag;
10f4e0: 09 c8 or %ecx,%eax
10f4e2: 89 47 04 mov %eax,0x4(%edi)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
10f4e5: 89 fa mov %edi,%edx
10f4e7: 89 d8 mov %ebx,%eax
10f4e9: e8 36 fe ff ff call 10f324 <_Heap_Free_block>
10f4ee: eb 20 jmp 10f510 <_Heap_Extend+0x1d1>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
10f4f0: 83 7d c8 00 cmpl $0x0,-0x38(%ebp)
10f4f4: 74 1a je 10f510 <_Heap_Extend+0x1d1>
_Heap_Link_above(
10f4f6: 8b 4d e4 mov -0x1c(%ebp),%ecx
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;
10f4f9: 8b 75 c8 mov -0x38(%ebp),%esi
10f4fc: 8b 46 04 mov 0x4(%esi),%eax
10f4ff: 83 e0 01 and $0x1,%eax
)
{
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 );
10f502: 8b 55 e0 mov -0x20(%ebp),%edx
10f505: 29 f2 sub %esi,%edx
block->size_and_flag = size | flag;
10f507: 09 d0 or %edx,%eax
10f509: 89 46 04 mov %eax,0x4(%esi)
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
10f50c: 83 49 04 01 orl $0x1,0x4(%ecx)
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
10f510: 85 ff test %edi,%edi
10f512: 75 10 jne 10f524 <_Heap_Extend+0x1e5>
10f514: 83 7d cc 00 cmpl $0x0,-0x34(%ebp)
10f518: 75 0a jne 10f524 <_Heap_Extend+0x1e5>
_Heap_Free_block( heap, extend_first_block );
10f51a: 8b 55 e0 mov -0x20(%ebp),%edx
10f51d: 89 d8 mov %ebx,%eax
10f51f: e8 00 fe ff ff call 10f324 <_Heap_Free_block>
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
heap->last_block,
(uintptr_t) heap->first_block - (uintptr_t) heap->last_block
10f524: 8b 53 24 mov 0x24(%ebx),%edx
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;
10f527: 8b 42 04 mov 0x4(%edx),%eax
10f52a: 83 e0 01 and $0x1,%eax
* 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(
10f52d: 8b 4b 20 mov 0x20(%ebx),%ecx
10f530: 29 d1 sub %edx,%ecx
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
block->size_and_flag = size | flag;
10f532: 09 c8 or %ecx,%eax
10f534: 89 42 04 mov %eax,0x4(%edx)
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
10f537: 8b 43 30 mov 0x30(%ebx),%eax
10f53a: 2b 45 b4 sub -0x4c(%ebp),%eax
/* Statistics */
stats->size += extended_size;
10f53d: 01 43 2c add %eax,0x2c(%ebx)
if ( extended_size_ptr != NULL )
10f540: 83 7d 14 00 cmpl $0x0,0x14(%ebp)
10f544: 74 05 je 10f54b <_Heap_Extend+0x20c> <== NEVER TAKEN
*extended_size_ptr = extended_size;
10f546: 8b 4d 14 mov 0x14(%ebp),%ecx
10f549: 89 01 mov %eax,(%ecx)
return true;
10f54b: b0 01 mov $0x1,%al
}
10f54d: 8d 65 f4 lea -0xc(%ebp),%esp
10f550: 5b pop %ebx
10f551: 5e pop %esi
10f552: 5f pop %edi
10f553: 5d pop %ebp
10f554: c3 ret
0010f2d4 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
10f2d4: 55 push %ebp
10f2d5: 89 e5 mov %esp,%ebp
10f2d7: 57 push %edi
10f2d8: 56 push %esi
10f2d9: 53 push %ebx
10f2da: 83 ec 14 sub $0x14,%esp
10f2dd: 8b 4d 08 mov 0x8(%ebp),%ecx
10f2e0: 8b 45 0c mov 0xc(%ebp),%eax
/*
* 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 ) {
10f2e3: 85 c0 test %eax,%eax
10f2e5: 0f 84 46 01 00 00 je 10f431 <_Heap_Free+0x15d>
10f2eb: 8d 58 f8 lea -0x8(%eax),%ebx
10f2ee: 31 d2 xor %edx,%edx
10f2f0: f7 71 10 divl 0x10(%ecx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
10f2f3: 29 d3 sub %edx,%ebx
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
10f2f5: 8b 41 20 mov 0x20(%ecx),%eax
10f2f8: 89 45 e8 mov %eax,-0x18(%ebp)
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10f2fb: 31 d2 xor %edx,%edx
10f2fd: 39 c3 cmp %eax,%ebx
10f2ff: 72 08 jb 10f309 <_Heap_Free+0x35>
10f301: 31 d2 xor %edx,%edx
10f303: 39 59 24 cmp %ebx,0x24(%ecx)
10f306: 0f 93 c2 setae %dl
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;
10f309: 31 c0 xor %eax,%eax
}
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 ) ) {
10f30b: 85 d2 test %edx,%edx
10f30d: 0f 84 20 01 00 00 je 10f433 <_Heap_Free+0x15f>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
10f313: 8b 43 04 mov 0x4(%ebx),%eax
10f316: 89 45 ec mov %eax,-0x14(%ebp)
- 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;
10f319: 89 c7 mov %eax,%edi
10f31b: 83 e7 fe and $0xfffffffe,%edi
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10f31e: 8d 14 1f lea (%edi,%ebx,1),%edx
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;
10f321: 31 f6 xor %esi,%esi
10f323: 3b 55 e8 cmp -0x18(%ebp),%edx
10f326: 72 0a jb 10f332 <_Heap_Free+0x5e> <== NEVER TAKEN
10f328: 31 c0 xor %eax,%eax
10f32a: 39 51 24 cmp %edx,0x24(%ecx)
10f32d: 0f 93 c0 setae %al
10f330: 89 c6 mov %eax,%esi
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;
10f332: 31 c0 xor %eax,%eax
_Heap_Protection_block_check( heap, block );
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
10f334: 85 f6 test %esi,%esi
10f336: 0f 84 f7 00 00 00 je 10f433 <_Heap_Free+0x15f> <== NEVER TAKEN
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
10f33c: 8b 72 04 mov 0x4(%edx),%esi
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
10f33f: f7 c6 01 00 00 00 test $0x1,%esi
10f345: 0f 84 e8 00 00 00 je 10f433 <_Heap_Free+0x15f> <== 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;
10f34b: 83 e6 fe and $0xfffffffe,%esi
10f34e: 89 75 f0 mov %esi,-0x10(%ebp)
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
10f351: 8b 41 24 mov 0x24(%ecx),%eax
10f354: 89 45 e0 mov %eax,-0x20(%ebp)
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
10f357: 39 c2 cmp %eax,%edx
10f359: 74 0c je 10f367 <_Heap_Free+0x93>
10f35b: 8b 74 32 04 mov 0x4(%edx,%esi,1),%esi
10f35f: 83 f6 01 xor $0x1,%esi
10f362: 83 e6 01 and $0x1,%esi
10f365: eb 02 jmp 10f369 <_Heap_Free+0x95>
10f367: 31 f6 xor %esi,%esi
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
10f369: 89 f0 mov %esi,%eax
10f36b: 88 45 e7 mov %al,-0x19(%ebp)
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
10f36e: f6 45 ec 01 testb $0x1,-0x14(%ebp)
10f372: 75 5e jne 10f3d2 <_Heap_Free+0xfe>
uintptr_t const prev_size = block->prev_size;
10f374: 8b 33 mov (%ebx),%esi
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10f376: 29 f3 sub %esi,%ebx
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;
10f378: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp)
10f37f: 3b 5d e8 cmp -0x18(%ebp),%ebx
10f382: 72 0b jb 10f38f <_Heap_Free+0xbb> <== NEVER TAKEN
10f384: 31 c0 xor %eax,%eax
10f386: 39 5d e0 cmp %ebx,-0x20(%ebp)
10f389: 0f 93 c0 setae %al
10f38c: 89 45 ec mov %eax,-0x14(%ebp)
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;
10f38f: 31 c0 xor %eax,%eax
if ( !_Heap_Is_prev_used( block ) ) {
uintptr_t const prev_size = block->prev_size;
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
10f391: 83 7d ec 00 cmpl $0x0,-0x14(%ebp)
10f395: 0f 84 98 00 00 00 je 10f433 <_Heap_Free+0x15f> <== NEVER TAKEN
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) ) {
10f39b: f6 43 04 01 testb $0x1,0x4(%ebx)
10f39f: 0f 84 8e 00 00 00 je 10f433 <_Heap_Free+0x15f> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
10f3a5: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10f3a9: 8d 34 37 lea (%edi,%esi,1),%esi
10f3ac: 74 14 je 10f3c2 <_Heap_Free+0xee>
uintptr_t const size = block_size + prev_size + next_block_size;
10f3ae: 03 75 f0 add -0x10(%ebp),%esi
return _Heap_Free_list_tail(heap)->prev;
}
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
10f3b1: 8b 42 08 mov 0x8(%edx),%eax
Heap_Block *prev = block->prev;
10f3b4: 8b 52 0c mov 0xc(%edx),%edx
prev->next = next;
10f3b7: 89 42 08 mov %eax,0x8(%edx)
next->prev = prev;
10f3ba: 89 50 0c mov %edx,0xc(%eax)
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
10f3bd: ff 49 38 decl 0x38(%ecx)
10f3c0: eb 2d jmp 10f3ef <_Heap_Free+0x11b>
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;
10f3c2: 89 f0 mov %esi,%eax
10f3c4: 83 c8 01 or $0x1,%eax
10f3c7: 89 43 04 mov %eax,0x4(%ebx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
10f3ca: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = size;
10f3ce: 89 32 mov %esi,(%edx)
10f3d0: eb 56 jmp 10f428 <_Heap_Free+0x154>
}
} else if ( next_is_free ) { /* coalesce next */
10f3d2: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10f3d6: 74 24 je 10f3fc <_Heap_Free+0x128>
uintptr_t const size = block_size + next_block_size;
10f3d8: 8b 75 f0 mov -0x10(%ebp),%esi
10f3db: 01 fe add %edi,%esi
RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
Heap_Block *old_block,
Heap_Block *new_block
)
{
Heap_Block *next = old_block->next;
10f3dd: 8b 42 08 mov 0x8(%edx),%eax
Heap_Block *prev = old_block->prev;
10f3e0: 8b 52 0c mov 0xc(%edx),%edx
new_block->next = next;
10f3e3: 89 43 08 mov %eax,0x8(%ebx)
new_block->prev = prev;
10f3e6: 89 53 0c mov %edx,0xc(%ebx)
next->prev = new_block;
10f3e9: 89 58 0c mov %ebx,0xc(%eax)
prev->next = new_block;
10f3ec: 89 5a 08 mov %ebx,0x8(%edx)
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
10f3ef: 89 f0 mov %esi,%eax
10f3f1: 83 c8 01 or $0x1,%eax
10f3f4: 89 43 04 mov %eax,0x4(%ebx)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
10f3f7: 89 34 1e mov %esi,(%esi,%ebx,1)
10f3fa: eb 2c jmp 10f428 <_Heap_Free+0x154>
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
10f3fc: 8b 41 08 mov 0x8(%ecx),%eax
new_block->next = next;
10f3ff: 89 43 08 mov %eax,0x8(%ebx)
new_block->prev = block_before;
10f402: 89 4b 0c mov %ecx,0xc(%ebx)
block_before->next = new_block;
10f405: 89 59 08 mov %ebx,0x8(%ecx)
next->prev = new_block;
10f408: 89 58 0c mov %ebx,0xc(%eax)
} 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;
10f40b: 89 f8 mov %edi,%eax
10f40d: 83 c8 01 or $0x1,%eax
10f410: 89 43 04 mov %eax,0x4(%ebx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
10f413: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = block_size;
10f417: 89 3a mov %edi,(%edx)
/* Statistics */
++stats->free_blocks;
10f419: 8b 41 38 mov 0x38(%ecx),%eax
10f41c: 40 inc %eax
10f41d: 89 41 38 mov %eax,0x38(%ecx)
if ( stats->max_free_blocks < stats->free_blocks ) {
10f420: 39 41 3c cmp %eax,0x3c(%ecx)
10f423: 73 03 jae 10f428 <_Heap_Free+0x154>
stats->max_free_blocks = stats->free_blocks;
10f425: 89 41 3c mov %eax,0x3c(%ecx)
}
}
/* Statistics */
--stats->used_blocks;
10f428: ff 49 40 decl 0x40(%ecx)
++stats->frees;
10f42b: ff 41 50 incl 0x50(%ecx)
stats->free_size += block_size;
10f42e: 01 79 30 add %edi,0x30(%ecx)
* 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;
10f431: b0 01 mov $0x1,%al
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
10f433: 83 c4 14 add $0x14,%esp
10f436: 5b pop %ebx
10f437: 5e pop %esi
10f438: 5f pop %edi
10f439: 5d pop %ebp
10f43a: c3 ret
0010c528 <_Heap_Greedy_allocate>:
Heap_Block *_Heap_Greedy_allocate(
Heap_Control *heap,
const uintptr_t *block_sizes,
size_t block_count
)
{
10c528: 55 push %ebp
10c529: 89 e5 mov %esp,%ebp
10c52b: 57 push %edi
10c52c: 56 push %esi
10c52d: 53 push %ebx
10c52e: 83 ec 1c sub $0x1c,%esp
10c531: 8b 5d 08 mov 0x8(%ebp),%ebx
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
10c534: 31 f6 xor %esi,%esi
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;
10c536: 31 c9 xor %ecx,%ecx
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
10c538: eb 2d jmp 10c567 <_Heap_Greedy_allocate+0x3f>
* @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 );
10c53a: 6a 00 push $0x0
10c53c: 6a 00 push $0x0
10c53e: 8b 45 0c mov 0xc(%ebp),%eax
10c541: ff 34 b0 pushl (%eax,%esi,4)
10c544: 53 push %ebx
10c545: 89 4d e4 mov %ecx,-0x1c(%ebp)
10c548: e8 bb 67 00 00 call 112d08 <_Heap_Allocate_aligned_with_boundary>
void *next = _Heap_Allocate( heap, block_sizes [i] );
if ( next != NULL ) {
10c54d: 83 c4 10 add $0x10,%esp
10c550: 85 c0 test %eax,%eax
10c552: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c555: 74 0f je 10c566 <_Heap_Greedy_allocate+0x3e><== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10c557: 8d 78 f8 lea -0x8(%eax),%edi
10c55a: 31 d2 xor %edx,%edx
10c55c: f7 73 10 divl 0x10(%ebx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
10c55f: 29 d7 sub %edx,%edi
Heap_Block *next_block = _Heap_Block_of_alloc_area(
(uintptr_t) next,
heap->page_size
);
next_block->next = allocated_blocks;
10c561: 89 4f 08 mov %ecx,0x8(%edi)
10c564: 89 f9 mov %edi,%ecx
Heap_Block *allocated_blocks = NULL;
Heap_Block *blocks = NULL;
Heap_Block *current;
size_t i;
for (i = 0; i < block_count; ++i) {
10c566: 46 inc %esi
10c567: 3b 75 10 cmp 0x10(%ebp),%esi
10c56a: 75 ce jne 10c53a <_Heap_Greedy_allocate+0x12>
10c56c: 31 f6 xor %esi,%esi
10c56e: eb 23 jmp 10c593 <_Heap_Greedy_allocate+0x6b>
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
10c570: 8b 47 04 mov 0x4(%edi),%eax
10c573: 83 e0 fe and $0xfffffffe,%eax
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
_Heap_Block_allocate(
10c576: 83 e8 08 sub $0x8,%eax
10c579: 50 push %eax
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10c57a: 8d 47 08 lea 0x8(%edi),%eax
10c57d: 50 push %eax
10c57e: 57 push %edi
10c57f: 53 push %ebx
10c580: 89 4d e4 mov %ecx,-0x1c(%ebp)
10c583: e8 8e 02 00 00 call 10c816 <_Heap_Block_allocate>
current,
_Heap_Alloc_area_of_block( current ),
_Heap_Block_size( current ) - HEAP_BLOCK_HEADER_SIZE
);
current->next = blocks;
10c588: 89 77 08 mov %esi,0x8(%edi)
10c58b: 89 fe mov %edi,%esi
10c58d: 83 c4 10 add $0x10,%esp
10c590: 8b 4d e4 mov -0x1c(%ebp),%ecx
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
10c593: 8b 7b 08 mov 0x8(%ebx),%edi
next_block->next = allocated_blocks;
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
10c596: 39 df cmp %ebx,%edi
10c598: 75 d6 jne 10c570 <_Heap_Greedy_allocate+0x48>
10c59a: eb 14 jmp 10c5b0 <_Heap_Greedy_allocate+0x88>
blocks = current;
}
while ( allocated_blocks != NULL ) {
current = allocated_blocks;
allocated_blocks = allocated_blocks->next;
10c59c: 8b 79 08 mov 0x8(%ecx),%edi
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
10c59f: 50 push %eax
10c5a0: 50 push %eax
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10c5a1: 83 c1 08 add $0x8,%ecx
10c5a4: 51 push %ecx
10c5a5: 53 push %ebx
10c5a6: e8 b5 68 00 00 call 112e60 <_Heap_Free>
10c5ab: 83 c4 10 add $0x10,%esp
blocks = current;
}
while ( allocated_blocks != NULL ) {
current = allocated_blocks;
allocated_blocks = allocated_blocks->next;
10c5ae: 89 f9 mov %edi,%ecx
current->next = blocks;
blocks = current;
}
while ( allocated_blocks != NULL ) {
10c5b0: 85 c9 test %ecx,%ecx
10c5b2: 75 e8 jne 10c59c <_Heap_Greedy_allocate+0x74>
allocated_blocks = allocated_blocks->next;
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
}
return blocks;
}
10c5b4: 89 f0 mov %esi,%eax
10c5b6: 8d 65 f4 lea -0xc(%ebp),%esp
10c5b9: 5b pop %ebx
10c5ba: 5e pop %esi
10c5bb: 5f pop %edi
10c5bc: 5d pop %ebp
10c5bd: c3 ret
00112620 <_Heap_Iterate>:
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
112620: 55 push %ebp
112621: 89 e5 mov %esp,%ebp
112623: 56 push %esi
112624: 53 push %ebx
112625: 8b 45 08 mov 0x8(%ebp),%eax
Heap_Block *current = heap->first_block;
112628: 8b 50 20 mov 0x20(%eax),%edx
Heap_Block *end = heap->last_block;
11262b: 8b 58 24 mov 0x24(%eax),%ebx
bool stop = false;
11262e: 31 c0 xor %eax,%eax
while ( !stop && current != end ) {
112630: eb 1f jmp 112651 <_Heap_Iterate+0x31>
112632: 8b 42 04 mov 0x4(%edx),%eax
112635: 83 e0 fe and $0xfffffffe,%eax
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
112638: 8d 34 02 lea (%edx,%eax,1),%esi
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 );
11263b: ff 75 10 pushl 0x10(%ebp)
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;
11263e: 8b 4e 04 mov 0x4(%esi),%ecx
112641: 83 e1 01 and $0x1,%ecx
112644: 51 push %ecx
112645: 50 push %eax
112646: 52 push %edx
112647: 8b 55 0c mov 0xc(%ebp),%edx
11264a: ff d2 call *%edx
11264c: 89 f2 mov %esi,%edx
11264e: 83 c4 10 add $0x10,%esp
{
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
bool stop = false;
while ( !stop && current != end ) {
112651: 39 da cmp %ebx,%edx
112653: 74 04 je 112659 <_Heap_Iterate+0x39>
112655: fe c8 dec %al
112657: 75 d9 jne 112632 <_Heap_Iterate+0x12> <== ALWAYS TAKEN
stop = (*visitor)( current, size, used, visitor_arg );
current = next;
}
}
112659: 8d 65 f8 lea -0x8(%ebp),%esp
11265c: 5b pop %ebx
11265d: 5e pop %esi
11265e: 5d pop %ebp
11265f: c3 ret
0010f534 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
10f534: 55 push %ebp
10f535: 89 e5 mov %esp,%ebp
10f537: 57 push %edi
10f538: 56 push %esi
10f539: 53 push %ebx
10f53a: 8b 5d 08 mov 0x8(%ebp),%ebx
10f53d: 8b 75 0c mov 0xc(%ebp),%esi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10f540: 8d 4e f8 lea -0x8(%esi),%ecx
10f543: 89 f0 mov %esi,%eax
10f545: 31 d2 xor %edx,%edx
10f547: f7 73 10 divl 0x10(%ebx)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
10f54a: 29 d1 sub %edx,%ecx
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
10f54c: 8b 53 20 mov 0x20(%ebx),%edx
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
10f54f: 31 ff xor %edi,%edi
10f551: 39 d1 cmp %edx,%ecx
10f553: 72 0a jb 10f55f <_Heap_Size_of_alloc_area+0x2b>
10f555: 31 c0 xor %eax,%eax
10f557: 39 4b 24 cmp %ecx,0x24(%ebx)
10f55a: 0f 93 c0 setae %al
10f55d: 89 c7 mov %eax,%edi
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;
10f55f: 31 c0 xor %eax,%eax
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
10f561: 85 ff test %edi,%edi
10f563: 74 30 je 10f595 <_Heap_Size_of_alloc_area+0x61>
- 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;
10f565: 8b 41 04 mov 0x4(%ecx),%eax
10f568: 83 e0 fe and $0xfffffffe,%eax
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10f56b: 01 c1 add %eax,%ecx
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;
10f56d: 31 ff xor %edi,%edi
10f56f: 39 d1 cmp %edx,%ecx
10f571: 72 0a jb 10f57d <_Heap_Size_of_alloc_area+0x49><== NEVER TAKEN
10f573: 31 c0 xor %eax,%eax
10f575: 39 4b 24 cmp %ecx,0x24(%ebx)
10f578: 0f 93 c0 setae %al
10f57b: 89 c7 mov %eax,%edi
return false;
10f57d: 31 c0 xor %eax,%eax
}
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
10f57f: 85 ff test %edi,%edi
10f581: 74 12 je 10f595 <_Heap_Size_of_alloc_area+0x61><== NEVER TAKEN
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
10f583: f6 41 04 01 testb $0x1,0x4(%ecx)
10f587: 74 0c je 10f595 <_Heap_Size_of_alloc_area+0x61><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
10f589: 29 f1 sub %esi,%ecx
10f58b: 8d 51 04 lea 0x4(%ecx),%edx
10f58e: 8b 45 10 mov 0x10(%ebp),%eax
10f591: 89 10 mov %edx,(%eax)
return true;
10f593: b0 01 mov $0x1,%al
}
10f595: 5b pop %ebx
10f596: 5e pop %esi
10f597: 5f pop %edi
10f598: 5d pop %ebp
10f599: c3 ret
0010b5d2 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
10b5d2: 55 push %ebp
10b5d3: 89 e5 mov %esp,%ebp
10b5d5: 57 push %edi
10b5d6: 56 push %esi
10b5d7: 53 push %ebx
10b5d8: 83 ec 3c sub $0x3c,%esp
10b5db: 8b 7d 0c mov 0xc(%ebp),%edi
uintptr_t const page_size = heap->page_size;
10b5de: 8b 4d 08 mov 0x8(%ebp),%ecx
10b5e1: 8b 49 10 mov 0x10(%ecx),%ecx
10b5e4: 89 4d e0 mov %ecx,-0x20(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10b5e7: 8b 4d 08 mov 0x8(%ebp),%ecx
10b5ea: 8b 49 14 mov 0x14(%ecx),%ecx
10b5ed: 89 4d d8 mov %ecx,-0x28(%ebp)
Heap_Block *const first_block = heap->first_block;
10b5f0: 8b 4d 08 mov 0x8(%ebp),%ecx
10b5f3: 8b 71 20 mov 0x20(%ecx),%esi
Heap_Block *const last_block = heap->last_block;
10b5f6: 8b 49 24 mov 0x24(%ecx),%ecx
10b5f9: 89 4d d4 mov %ecx,-0x2c(%ebp)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10b5fc: bb 94 b5 10 00 mov $0x10b594,%ebx
10b601: 80 7d 10 00 cmpb $0x0,0x10(%ebp)
10b605: 74 05 je 10b60c <_Heap_Walk+0x3a>
10b607: bb 99 b5 10 00 mov $0x10b599,%ebx
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10b60c: 83 3d a8 05 13 00 03 cmpl $0x3,0x1305a8
10b613: 74 07 je 10b61c <_Heap_Walk+0x4a>
return true;
10b615: b0 01 mov $0x1,%al
10b617: e9 ec 02 00 00 jmp 10b908 <_Heap_Walk+0x336>
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)(
10b61c: 50 push %eax
10b61d: 8b 4d 08 mov 0x8(%ebp),%ecx
10b620: ff 71 0c pushl 0xc(%ecx)
10b623: ff 71 08 pushl 0x8(%ecx)
10b626: ff 75 d4 pushl -0x2c(%ebp)
10b629: 56 push %esi
10b62a: ff 71 1c pushl 0x1c(%ecx)
10b62d: ff 71 18 pushl 0x18(%ecx)
10b630: ff 75 d8 pushl -0x28(%ebp)
10b633: ff 75 e0 pushl -0x20(%ebp)
10b636: 68 e4 07 12 00 push $0x1207e4
10b63b: 6a 00 push $0x0
10b63d: 57 push %edi
10b63e: ff d3 call *%ebx
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
10b640: 83 c4 30 add $0x30,%esp
10b643: 83 7d e0 00 cmpl $0x0,-0x20(%ebp)
10b647: 75 0b jne 10b654 <_Heap_Walk+0x82>
(*printer)( source, true, "page size is zero\n" );
10b649: 50 push %eax
10b64a: 68 75 08 12 00 push $0x120875
10b64f: e9 d5 00 00 00 jmp 10b729 <_Heap_Walk+0x157>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
10b654: f6 45 e0 03 testb $0x3,-0x20(%ebp)
10b658: 74 0d je 10b667 <_Heap_Walk+0x95>
(*printer)(
10b65a: ff 75 e0 pushl -0x20(%ebp)
10b65d: 68 88 08 12 00 push $0x120888
10b662: e9 c2 00 00 00 jmp 10b729 <_Heap_Walk+0x157>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10b667: 8b 45 d8 mov -0x28(%ebp),%eax
10b66a: 31 d2 xor %edx,%edx
10b66c: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
10b66f: 85 d2 test %edx,%edx
10b671: 74 0d je 10b680 <_Heap_Walk+0xae>
(*printer)(
10b673: ff 75 d8 pushl -0x28(%ebp)
10b676: 68 a6 08 12 00 push $0x1208a6
10b67b: e9 a9 00 00 00 jmp 10b729 <_Heap_Walk+0x157>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10b680: 8d 46 08 lea 0x8(%esi),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10b683: 31 d2 xor %edx,%edx
10b685: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if (
10b688: 85 d2 test %edx,%edx
10b68a: 74 0b je 10b697 <_Heap_Walk+0xc5>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
10b68c: 56 push %esi
10b68d: 68 ca 08 12 00 push $0x1208ca
10b692: e9 92 00 00 00 jmp 10b729 <_Heap_Walk+0x157>
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
10b697: f6 46 04 01 testb $0x1,0x4(%esi)
10b69b: 75 0b jne 10b6a8 <_Heap_Walk+0xd6>
(*printer)(
10b69d: 50 push %eax
10b69e: 68 fb 08 12 00 push $0x1208fb
10b6a3: e9 81 00 00 00 jmp 10b729 <_Heap_Walk+0x157>
- 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;
10b6a8: 8b 4d d4 mov -0x2c(%ebp),%ecx
10b6ab: 8b 41 04 mov 0x4(%ecx),%eax
10b6ae: 83 e0 fe and $0xfffffffe,%eax
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10b6b1: 01 c8 add %ecx,%eax
10b6b3: 89 45 d0 mov %eax,-0x30(%ebp)
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
10b6b6: f6 40 04 01 testb $0x1,0x4(%eax)
10b6ba: 75 08 jne 10b6c4 <_Heap_Walk+0xf2>
(*printer)(
10b6bc: 50 push %eax
10b6bd: 68 29 09 12 00 push $0x120929
10b6c2: eb 65 jmp 10b729 <_Heap_Walk+0x157>
);
return false;
}
if (
10b6c4: 39 75 d0 cmp %esi,-0x30(%ebp)
10b6c7: 74 08 je 10b6d1 <_Heap_Walk+0xff>
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
10b6c9: 56 push %esi
10b6ca: 68 3e 09 12 00 push $0x12093e
10b6cf: eb 58 jmp 10b729 <_Heap_Walk+0x157>
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
10b6d1: 8b 4d 08 mov 0x8(%ebp),%ecx
10b6d4: 8b 49 10 mov 0x10(%ecx),%ecx
10b6d7: 89 4d e4 mov %ecx,-0x1c(%ebp)
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
10b6da: 8b 45 08 mov 0x8(%ebp),%eax
10b6dd: 8b 48 08 mov 0x8(%eax),%ecx
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
10b6e0: 89 c6 mov %eax,%esi
10b6e2: eb 6d jmp 10b751 <_Heap_Walk+0x17f>
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;
10b6e4: 31 c0 xor %eax,%eax
10b6e6: 8b 55 08 mov 0x8(%ebp),%edx
10b6e9: 39 4a 20 cmp %ecx,0x20(%edx)
10b6ec: 77 08 ja 10b6f6 <_Heap_Walk+0x124>
10b6ee: 31 c0 xor %eax,%eax
10b6f0: 39 4a 24 cmp %ecx,0x24(%edx)
10b6f3: 0f 93 c0 setae %al
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
10b6f6: 85 c0 test %eax,%eax
10b6f8: 75 08 jne 10b702 <_Heap_Walk+0x130>
(*printer)(
10b6fa: 51 push %ecx
10b6fb: 68 6d 09 12 00 push $0x12096d
10b700: eb 27 jmp 10b729 <_Heap_Walk+0x157>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10b702: 8d 41 08 lea 0x8(%ecx),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10b705: 31 d2 xor %edx,%edx
10b707: f7 75 e4 divl -0x1c(%ebp)
);
return false;
}
if (
10b70a: 85 d2 test %edx,%edx
10b70c: 74 08 je 10b716 <_Heap_Walk+0x144>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
10b70e: 51 push %ecx
10b70f: 68 8d 09 12 00 push $0x12098d
10b714: eb 13 jmp 10b729 <_Heap_Walk+0x157>
- 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;
10b716: 8b 41 04 mov 0x4(%ecx),%eax
10b719: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10b71c: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1)
10b721: 74 13 je 10b736 <_Heap_Walk+0x164>
(*printer)(
10b723: 51 push %ecx
10b724: 68 bd 09 12 00 push $0x1209bd
10b729: 6a 01 push $0x1
10b72b: 57 push %edi
10b72c: ff d3 call *%ebx
10b72e: 83 c4 10 add $0x10,%esp
10b731: e9 c3 01 00 00 jmp 10b8f9 <_Heap_Walk+0x327>
);
return false;
}
if ( free_block->prev != prev_block ) {
10b736: 8b 41 0c mov 0xc(%ecx),%eax
10b739: 39 f0 cmp %esi,%eax
10b73b: 74 0f je 10b74c <_Heap_Walk+0x17a>
(*printer)(
10b73d: 83 ec 0c sub $0xc,%esp
10b740: 50 push %eax
10b741: 51 push %ecx
10b742: 68 d9 09 12 00 push $0x1209d9
10b747: e9 42 01 00 00 jmp 10b88e <_Heap_Walk+0x2bc>
return false;
}
prev_block = free_block;
free_block = free_block->next;
10b74c: 89 ce mov %ecx,%esi
10b74e: 8b 49 08 mov 0x8(%ecx),%ecx
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 ) {
10b751: 3b 4d 08 cmp 0x8(%ebp),%ecx
10b754: 75 8e jne 10b6e4 <_Heap_Walk+0x112>
10b756: 8b 75 d0 mov -0x30(%ebp),%esi
block = next_block;
} while ( block != first_block );
return true;
}
10b759: 8b 46 04 mov 0x4(%esi),%eax
10b75c: 89 c1 mov %eax,%ecx
10b75e: 83 e1 fe and $0xfffffffe,%ecx
10b761: 89 4d e4 mov %ecx,-0x1c(%ebp)
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;
10b764: 83 e0 01 and $0x1,%eax
10b767: 89 45 c8 mov %eax,-0x38(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10b76a: 01 f1 add %esi,%ecx
10b76c: 89 4d dc mov %ecx,-0x24(%ebp)
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;
10b76f: 3b 75 d4 cmp -0x2c(%ebp),%esi
10b772: 0f 95 c1 setne %cl
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;
10b775: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp)
10b77c: 8b 55 dc mov -0x24(%ebp),%edx
10b77f: 8b 45 08 mov 0x8(%ebp),%eax
10b782: 39 50 20 cmp %edx,0x20(%eax)
10b785: 77 0c ja 10b793 <_Heap_Walk+0x1c1> <== NEVER TAKEN
10b787: 39 50 24 cmp %edx,0x24(%eax)
10b78a: 0f 93 c0 setae %al
10b78d: 0f b6 c0 movzbl %al,%eax
10b790: 89 45 cc mov %eax,-0x34(%ebp)
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
10b793: 83 7d cc 00 cmpl $0x0,-0x34(%ebp)
10b797: 75 11 jne 10b7aa <_Heap_Walk+0x1d8>
(*printer)(
10b799: 83 ec 0c sub $0xc,%esp
10b79c: ff 75 dc pushl -0x24(%ebp)
10b79f: 56 push %esi
10b7a0: 68 0b 0a 12 00 push $0x120a0b
10b7a5: e9 e4 00 00 00 jmp 10b88e <_Heap_Walk+0x2bc>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10b7aa: 8b 45 e4 mov -0x1c(%ebp),%eax
10b7ad: 31 d2 xor %edx,%edx
10b7af: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
10b7b2: 85 d2 test %edx,%edx
10b7b4: 74 15 je 10b7cb <_Heap_Walk+0x1f9>
10b7b6: 84 c9 test %cl,%cl
10b7b8: 74 11 je 10b7cb <_Heap_Walk+0x1f9>
(*printer)(
10b7ba: 83 ec 0c sub $0xc,%esp
10b7bd: ff 75 e4 pushl -0x1c(%ebp)
10b7c0: 56 push %esi
10b7c1: 68 38 0a 12 00 push $0x120a38
10b7c6: e9 c3 00 00 00 jmp 10b88e <_Heap_Walk+0x2bc>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
10b7cb: 8b 45 d8 mov -0x28(%ebp),%eax
10b7ce: 39 45 e4 cmp %eax,-0x1c(%ebp)
10b7d1: 73 15 jae 10b7e8 <_Heap_Walk+0x216>
10b7d3: 84 c9 test %cl,%cl
10b7d5: 74 11 je 10b7e8 <_Heap_Walk+0x216> <== NEVER TAKEN
(*printer)(
10b7d7: 51 push %ecx
10b7d8: 51 push %ecx
10b7d9: 50 push %eax
10b7da: ff 75 e4 pushl -0x1c(%ebp)
10b7dd: 56 push %esi
10b7de: 68 66 0a 12 00 push $0x120a66
10b7e3: e9 a6 00 00 00 jmp 10b88e <_Heap_Walk+0x2bc>
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
10b7e8: 3b 75 dc cmp -0x24(%ebp),%esi
10b7eb: 72 15 jb 10b802 <_Heap_Walk+0x230>
10b7ed: 84 c9 test %cl,%cl
10b7ef: 74 11 je 10b802 <_Heap_Walk+0x230>
(*printer)(
10b7f1: 83 ec 0c sub $0xc,%esp
10b7f4: ff 75 dc pushl -0x24(%ebp)
10b7f7: 56 push %esi
10b7f8: 68 91 0a 12 00 push $0x120a91
10b7fd: e9 8c 00 00 00 jmp 10b88e <_Heap_Walk+0x2bc>
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
10b802: 8b 4d dc mov -0x24(%ebp),%ecx
10b805: f6 41 04 01 testb $0x1,0x4(%ecx)
10b809: 0f 85 b0 00 00 00 jne 10b8bf <_Heap_Walk+0x2ed>
return &heap->free_list;
}
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
10b80f: 8b 45 08 mov 0x8(%ebp),%eax
10b812: 8b 48 08 mov 0x8(%eax),%ecx
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
10b815: 8b 56 08 mov 0x8(%esi),%edx
10b818: 89 55 c4 mov %edx,-0x3c(%ebp)
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)(
10b81b: 3b 50 0c cmp 0xc(%eax),%edx
10b81e: 74 14 je 10b834 <_Heap_Walk+0x262>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10b820: b8 89 06 12 00 mov $0x120689,%eax
10b825: 8b 55 08 mov 0x8(%ebp),%edx
10b828: 39 55 c4 cmp %edx,-0x3c(%ebp)
10b82b: 75 0c jne 10b839 <_Heap_Walk+0x267>
10b82d: b8 c0 07 12 00 mov $0x1207c0,%eax
10b832: eb 05 jmp 10b839 <_Heap_Walk+0x267>
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)(
10b834: b8 b1 07 12 00 mov $0x1207b1,%eax
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 ?
10b839: 8b 56 0c mov 0xc(%esi),%edx
10b83c: 89 55 cc mov %edx,-0x34(%ebp)
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)(
10b83f: 39 ca cmp %ecx,%edx
10b841: 74 14 je 10b857 <_Heap_Walk+0x285>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10b843: ba 89 06 12 00 mov $0x120689,%edx
10b848: 8b 4d 08 mov 0x8(%ebp),%ecx
10b84b: 39 4d cc cmp %ecx,-0x34(%ebp)
10b84e: 75 0c jne 10b85c <_Heap_Walk+0x28a>
10b850: ba da 07 12 00 mov $0x1207da,%edx
10b855: eb 05 jmp 10b85c <_Heap_Walk+0x28a>
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)(
10b857: ba ca 07 12 00 mov $0x1207ca,%edx
10b85c: 83 ec 0c sub $0xc,%esp
10b85f: 50 push %eax
10b860: ff 75 c4 pushl -0x3c(%ebp)
10b863: 52 push %edx
10b864: ff 75 cc pushl -0x34(%ebp)
10b867: ff 75 e4 pushl -0x1c(%ebp)
10b86a: 56 push %esi
10b86b: 68 c5 0a 12 00 push $0x120ac5
10b870: 6a 00 push $0x0
10b872: 57 push %edi
10b873: ff d3 call *%ebx
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
10b875: 8b 4d dc mov -0x24(%ebp),%ecx
10b878: 8b 01 mov (%ecx),%eax
10b87a: 83 c4 30 add $0x30,%esp
10b87d: 39 45 e4 cmp %eax,-0x1c(%ebp)
10b880: 74 16 je 10b898 <_Heap_Walk+0x2c6>
(*printer)(
10b882: 52 push %edx
10b883: 51 push %ecx
10b884: 50 push %eax
10b885: ff 75 e4 pushl -0x1c(%ebp)
10b888: 56 push %esi
10b889: 68 fa 0a 12 00 push $0x120afa
10b88e: 6a 01 push $0x1
10b890: 57 push %edi
10b891: ff d3 call *%ebx
10b893: 83 c4 20 add $0x20,%esp
10b896: eb 61 jmp 10b8f9 <_Heap_Walk+0x327>
);
return false;
}
if ( !prev_used ) {
10b898: 83 7d c8 00 cmpl $0x0,-0x38(%ebp)
10b89c: 75 0b jne 10b8a9 <_Heap_Walk+0x2d7>
(*printer)(
10b89e: 56 push %esi
10b89f: 68 33 0b 12 00 push $0x120b33
10b8a4: e9 80 fe ff ff jmp 10b729 <_Heap_Walk+0x157>
10b8a9: 8b 4d 08 mov 0x8(%ebp),%ecx
10b8ac: 8b 41 08 mov 0x8(%ecx),%eax
10b8af: eb 07 jmp 10b8b8 <_Heap_Walk+0x2e6>
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
if ( free_block == block ) {
10b8b1: 39 f0 cmp %esi,%eax
10b8b3: 74 33 je 10b8e8 <_Heap_Walk+0x316>
return true;
}
free_block = free_block->next;
10b8b5: 8b 40 08 mov 0x8(%eax),%eax
)
{
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 ) {
10b8b8: 3b 45 08 cmp 0x8(%ebp),%eax
10b8bb: 75 f4 jne 10b8b1 <_Heap_Walk+0x2df>
10b8bd: eb 3e jmp 10b8fd <_Heap_Walk+0x32b>
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
10b8bf: 83 7d c8 00 cmpl $0x0,-0x38(%ebp)
10b8c3: 74 0e je 10b8d3 <_Heap_Walk+0x301>
(*printer)(
10b8c5: 83 ec 0c sub $0xc,%esp
10b8c8: ff 75 e4 pushl -0x1c(%ebp)
10b8cb: 56 push %esi
10b8cc: 68 62 0b 12 00 push $0x120b62
10b8d1: eb 0d jmp 10b8e0 <_Heap_Walk+0x30e>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
10b8d3: 50 push %eax
10b8d4: 50 push %eax
10b8d5: ff 36 pushl (%esi)
10b8d7: ff 75 e4 pushl -0x1c(%ebp)
10b8da: 56 push %esi
10b8db: 68 79 0b 12 00 push $0x120b79
10b8e0: 6a 00 push $0x0
10b8e2: 57 push %edi
10b8e3: ff d3 call *%ebx
10b8e5: 83 c4 20 add $0x20,%esp
10b8e8: 8b 75 dc mov -0x24(%ebp),%esi
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
10b8eb: 3b 75 d0 cmp -0x30(%ebp),%esi
10b8ee: 0f 85 65 fe ff ff jne 10b759 <_Heap_Walk+0x187>
10b8f4: e9 1c fd ff ff jmp 10b615 <_Heap_Walk+0x43>
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
10b8f9: 31 c0 xor %eax,%eax
10b8fb: eb 0b jmp 10b908 <_Heap_Walk+0x336>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10b8fd: 56 push %esi
10b8fe: 68 9e 0b 12 00 push $0x120b9e
10b903: e9 21 fe ff ff jmp 10b729 <_Heap_Walk+0x157>
block = next_block;
} while ( block != first_block );
return true;
}
10b908: 8d 65 f4 lea -0xc(%ebp),%esp
10b90b: 5b pop %ebx
10b90c: 5e pop %esi
10b90d: 5f pop %edi
10b90e: 5d pop %ebp
10b90f: c3 ret
0010adcc <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10adcc: 55 push %ebp
10adcd: 89 e5 mov %esp,%ebp
10adcf: 53 push %ebx
10add0: 83 ec 08 sub $0x8,%esp
10add3: 8b 55 08 mov 0x8(%ebp),%edx
10add6: 8b 45 0c mov 0xc(%ebp),%eax
10add9: 8b 5d 10 mov 0x10(%ebp),%ebx
_Internal_errors_What_happened.the_source = the_source;
10addc: 89 15 64 e4 12 00 mov %edx,0x12e464
_Internal_errors_What_happened.is_internal = is_internal;
10ade2: a2 68 e4 12 00 mov %al,0x12e468
_Internal_errors_What_happened.the_error = the_error;
10ade7: 89 1d 6c e4 12 00 mov %ebx,0x12e46c
_User_extensions_Fatal( the_source, is_internal, the_error );
10aded: 53 push %ebx
10adee: 0f b6 c0 movzbl %al,%eax
10adf1: 50 push %eax
10adf2: 52 push %edx
10adf3: e8 01 1a 00 00 call 10c7f9 <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
10adf8: c7 05 20 e5 12 00 05 movl $0x5,0x12e520 <== NOT EXECUTED
10adff: 00 00 00
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
10ae02: fa cli <== NOT EXECUTED
10ae03: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10ae05: f4 hlt <== NOT EXECUTED
10ae06: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10ae09: eb fe jmp 10ae09 <_Internal_error_Occurred+0x3d><== NOT EXECUTED
0010ae5c <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
10ae5c: 55 push %ebp
10ae5d: 89 e5 mov %esp,%ebp
10ae5f: 56 push %esi
10ae60: 53 push %ebx
10ae61: 8b 5d 08 mov 0x8(%ebp),%ebx
* 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 )
10ae64: 83 7b 18 00 cmpl $0x0,0x18(%ebx)
10ae68: 75 04 jne 10ae6e <_Objects_Allocate+0x12><== ALWAYS TAKEN
return NULL;
10ae6a: 31 c9 xor %ecx,%ecx
10ae6c: eb 51 jmp 10aebf <_Objects_Allocate+0x63>
/*
* 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 );
10ae6e: 8d 73 20 lea 0x20(%ebx),%esi
10ae71: 83 ec 0c sub $0xc,%esp
10ae74: 56 push %esi
10ae75: e8 06 f8 ff ff call 10a680 <_Chain_Get>
10ae7a: 89 c1 mov %eax,%ecx
if ( information->auto_extend ) {
10ae7c: 83 c4 10 add $0x10,%esp
10ae7f: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10ae83: 74 3a je 10aebf <_Objects_Allocate+0x63>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
10ae85: 85 c0 test %eax,%eax
10ae87: 75 1a jne 10aea3 <_Objects_Allocate+0x47>
_Objects_Extend_information( information );
10ae89: 83 ec 0c sub $0xc,%esp
10ae8c: 53 push %ebx
10ae8d: e8 56 00 00 00 call 10aee8 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
10ae92: 89 34 24 mov %esi,(%esp)
10ae95: e8 e6 f7 ff ff call 10a680 <_Chain_Get>
10ae9a: 89 c1 mov %eax,%ecx
}
if ( the_object ) {
10ae9c: 83 c4 10 add $0x10,%esp
10ae9f: 85 c0 test %eax,%eax
10aea1: 74 c7 je 10ae6a <_Objects_Allocate+0xe>
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
10aea3: 0f b7 41 08 movzwl 0x8(%ecx),%eax
10aea7: 0f b7 53 08 movzwl 0x8(%ebx),%edx
10aeab: 29 d0 sub %edx,%eax
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
10aead: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10aeb1: 31 d2 xor %edx,%edx
10aeb3: f7 f6 div %esi
information->inactive_per_block[ block ]--;
10aeb5: 8b 53 30 mov 0x30(%ebx),%edx
10aeb8: ff 0c 82 decl (%edx,%eax,4)
information->inactive--;
10aebb: 66 ff 4b 2c decw 0x2c(%ebx)
);
}
#endif
return the_object;
}
10aebf: 89 c8 mov %ecx,%eax
10aec1: 8d 65 f8 lea -0x8(%ebp),%esp
10aec4: 5b pop %ebx
10aec5: 5e pop %esi
10aec6: 5d pop %ebp
10aec7: c3 ret
0010aee8 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
10aee8: 55 push %ebp
10aee9: 89 e5 mov %esp,%ebp
10aeeb: 57 push %edi
10aeec: 56 push %esi
10aeed: 53 push %ebx
10aeee: 83 ec 3c sub $0x3c,%esp
10aef1: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* 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 );
10aef4: 0f b7 43 08 movzwl 0x8(%ebx),%eax
10aef8: 89 45 c8 mov %eax,-0x38(%ebp)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
10aefb: 8b 73 34 mov 0x34(%ebx),%esi
10aefe: 85 f6 test %esi,%esi
10af00: 74 40 je 10af42 <_Objects_Extend_information+0x5a>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
10af02: 0f b7 4b 14 movzwl 0x14(%ebx),%ecx
10af06: 8b 43 10 mov 0x10(%ebx),%eax
10af09: 31 d2 xor %edx,%edx
10af0b: 66 f7 f1 div %cx
10af0e: 0f b7 c0 movzwl %ax,%eax
10af11: 89 45 d0 mov %eax,-0x30(%ebp)
/*
* 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 );
10af14: 8b 55 c8 mov -0x38(%ebp),%edx
10af17: 89 55 cc mov %edx,-0x34(%ebp)
index_base = minimum_index;
block = 0;
10af1a: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10af21: eb 10 jmp 10af33 <_Objects_Extend_information+0x4b>
if ( information->object_blocks[ block ] == NULL ) {
10af23: 8b 55 d4 mov -0x2c(%ebp),%edx
10af26: 83 3c 96 00 cmpl $0x0,(%esi,%edx,4)
10af2a: 74 31 je 10af5d <_Objects_Extend_information+0x75>
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
10af2c: 01 4d cc add %ecx,-0x34(%ebp)
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10af2f: 42 inc %edx
10af30: 89 55 d4 mov %edx,-0x2c(%ebp)
10af33: 8b 55 d0 mov -0x30(%ebp),%edx
10af36: 39 55 d4 cmp %edx,-0x2c(%ebp)
10af39: 72 e8 jb 10af23 <_Objects_Extend_information+0x3b>
/*
* 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;
10af3b: be 01 00 00 00 mov $0x1,%esi
10af40: eb 1d jmp 10af5f <_Objects_Extend_information+0x77>
minimum_index = _Objects_Get_index( information->minimum_id );
10af42: 8b 4d c8 mov -0x38(%ebp),%ecx
10af45: 89 4d cc mov %ecx,-0x34(%ebp)
/*
* 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;
10af48: be 01 00 00 00 mov $0x1,%esi
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10af4d: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
10af54: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
10af5b: eb 02 jmp 10af5f <_Objects_Extend_information+0x77>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
10af5d: 31 f6 xor %esi,%esi
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
10af5f: 0f b7 43 14 movzwl 0x14(%ebx),%eax
10af63: 0f b7 53 10 movzwl 0x10(%ebx),%edx
10af67: 01 c2 add %eax,%edx
10af69: 89 55 bc mov %edx,-0x44(%ebp)
/*
* 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 ) {
10af6c: 81 fa ff ff 00 00 cmp $0xffff,%edx
10af72: 0f 87 bb 01 00 00 ja 10b133 <_Objects_Extend_information+0x24b><== NEVER TAKEN
/*
* 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;
10af78: 0f af 43 18 imul 0x18(%ebx),%eax
if ( information->auto_extend ) {
10af7c: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10af80: 74 18 je 10af9a <_Objects_Extend_information+0xb2>
new_object_block = _Workspace_Allocate( block_size );
10af82: 83 ec 0c sub $0xc,%esp
10af85: 50 push %eax
10af86: e8 b9 1b 00 00 call 10cb44 <_Workspace_Allocate>
10af8b: 89 45 c0 mov %eax,-0x40(%ebp)
if ( !new_object_block )
10af8e: 83 c4 10 add $0x10,%esp
10af91: 85 c0 test %eax,%eax
10af93: 75 14 jne 10afa9 <_Objects_Extend_information+0xc1>
10af95: e9 99 01 00 00 jmp 10b133 <_Objects_Extend_information+0x24b>
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
10af9a: 83 ec 0c sub $0xc,%esp
10af9d: 50 push %eax
10af9e: e8 d2 1b 00 00 call 10cb75 <_Workspace_Allocate_or_fatal_error>
10afa3: 89 45 c0 mov %eax,-0x40(%ebp)
10afa6: 83 c4 10 add $0x10,%esp
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
10afa9: 89 f0 mov %esi,%eax
10afab: 84 c0 test %al,%al
10afad: 0f 84 fd 00 00 00 je 10b0b0 <_Objects_Extend_information+0x1c8>
*/
/*
* Up the block count and maximum
*/
block_count++;
10afb3: 8b 75 d0 mov -0x30(%ebp),%esi
10afb6: 46 inc %esi
* 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 *));
object_blocks = (void**) _Workspace_Allocate( block_size );
10afb7: 83 ec 0c sub $0xc,%esp
/*
* 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 *));
10afba: 8b 55 bc mov -0x44(%ebp),%edx
10afbd: 03 55 c8 add -0x38(%ebp),%edx
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
10afc0: 8d 04 76 lea (%esi,%esi,2),%eax
10afc3: 01 d0 add %edx,%eax
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
10afc5: c1 e0 02 shl $0x2,%eax
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
10afc8: 50 push %eax
10afc9: e8 76 1b 00 00 call 10cb44 <_Workspace_Allocate>
10afce: 89 c2 mov %eax,%edx
if ( !object_blocks ) {
10afd0: 83 c4 10 add $0x10,%esp
10afd3: 85 c0 test %eax,%eax
10afd5: 75 13 jne 10afea <_Objects_Extend_information+0x102>
_Workspace_Free( new_object_block );
10afd7: 83 ec 0c sub $0xc,%esp
10afda: ff 75 c0 pushl -0x40(%ebp)
10afdd: e8 7b 1b 00 00 call 10cb5d <_Workspace_Free>
10afe2: 83 c4 10 add $0x10,%esp
10afe5: e9 49 01 00 00 jmp 10b133 <_Objects_Extend_information+0x24b>
10afea: 8d 0c b0 lea (%eax,%esi,4),%ecx
10afed: 89 4d b8 mov %ecx,-0x48(%ebp)
10aff0: 8d 34 f0 lea (%eax,%esi,8),%esi
10aff3: 89 75 c4 mov %esi,-0x3c(%ebp)
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
10aff6: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10affa: 31 c0 xor %eax,%eax
10affc: 3b 4d c8 cmp -0x38(%ebp),%ecx
10afff: 76 38 jbe 10b039 <_Objects_Extend_information+0x151>
/*
* 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,
10b001: 8b 45 d0 mov -0x30(%ebp),%eax
10b004: c1 e0 02 shl $0x2,%eax
10b007: 8b 73 34 mov 0x34(%ebx),%esi
10b00a: 89 d7 mov %edx,%edi
10b00c: 89 c1 mov %eax,%ecx
10b00e: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
10b010: 8b 73 30 mov 0x30(%ebx),%esi
10b013: 8b 7d b8 mov -0x48(%ebp),%edi
10b016: 89 c1 mov %eax,%ecx
10b018: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
10b01a: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10b01e: 03 4d c8 add -0x38(%ebp),%ecx
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
10b021: c1 e1 02 shl $0x2,%ecx
10b024: 8b 73 1c mov 0x1c(%ebx),%esi
10b027: 8b 7d c4 mov -0x3c(%ebp),%edi
10b02a: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
10b02c: eb 10 jmp 10b03e <_Objects_Extend_information+0x156>
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
local_table[ index ] = NULL;
10b02e: 8b 75 c4 mov -0x3c(%ebp),%esi
10b031: c7 04 86 00 00 00 00 movl $0x0,(%esi,%eax,4)
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
10b038: 40 inc %eax
10b039: 3b 45 c8 cmp -0x38(%ebp),%eax
10b03c: 75 f0 jne 10b02e <_Objects_Extend_information+0x146>
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
10b03e: 8b 45 d0 mov -0x30(%ebp),%eax
10b041: c7 04 82 00 00 00 00 movl $0x0,(%edx,%eax,4)
inactive_per_block[block_count] = 0;
10b048: 8b 4d b8 mov -0x48(%ebp),%ecx
10b04b: c7 04 81 00 00 00 00 movl $0x0,(%ecx,%eax,4)
for ( index=index_base ;
index < ( information->allocation_size + index_base );
10b052: 0f b7 4b 14 movzwl 0x14(%ebx),%ecx
10b056: 03 4d cc add -0x34(%ebp),%ecx
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
10b059: 8b 45 cc mov -0x34(%ebp),%eax
10b05c: eb 0b jmp 10b069 <_Objects_Extend_information+0x181>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
10b05e: 8b 75 c4 mov -0x3c(%ebp),%esi
10b061: c7 04 86 00 00 00 00 movl $0x0,(%esi,%eax,4)
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
10b068: 40 inc %eax
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
10b069: 39 c8 cmp %ecx,%eax
10b06b: 72 f1 jb 10b05e <_Objects_Extend_information+0x176>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
10b06d: 9c pushf
10b06e: fa cli
10b06f: 5e pop %esi
old_tables = information->object_blocks;
10b070: 8b 4b 34 mov 0x34(%ebx),%ecx
information->object_blocks = object_blocks;
10b073: 89 53 34 mov %edx,0x34(%ebx)
information->inactive_per_block = inactive_per_block;
10b076: 8b 45 b8 mov -0x48(%ebp),%eax
10b079: 89 43 30 mov %eax,0x30(%ebx)
information->local_table = local_table;
10b07c: 8b 55 c4 mov -0x3c(%ebp),%edx
10b07f: 89 53 1c mov %edx,0x1c(%ebx)
information->maximum = (Objects_Maximum) maximum;
10b082: 8b 45 bc mov -0x44(%ebp),%eax
10b085: 66 89 43 10 mov %ax,0x10(%ebx)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10b089: 8b 03 mov (%ebx),%eax
10b08b: c1 e0 18 shl $0x18,%eax
10b08e: 0d 00 00 01 00 or $0x10000,%eax
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10b093: 0b 45 bc or -0x44(%ebp),%eax
information->maximum_id = _Objects_Build_id(
10b096: 0f b7 53 04 movzwl 0x4(%ebx),%edx
10b09a: c1 e2 1b shl $0x1b,%edx
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10b09d: 09 d0 or %edx,%eax
10b09f: 89 43 0c mov %eax,0xc(%ebx)
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
10b0a2: 56 push %esi
10b0a3: 9d popf
_Workspace_Free( old_tables );
10b0a4: 83 ec 0c sub $0xc,%esp
10b0a7: 51 push %ecx
10b0a8: e8 b0 1a 00 00 call 10cb5d <_Workspace_Free>
10b0ad: 83 c4 10 add $0x10,%esp
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
10b0b0: 8b 55 d4 mov -0x2c(%ebp),%edx
10b0b3: c1 e2 02 shl $0x2,%edx
10b0b6: 89 55 d0 mov %edx,-0x30(%ebp)
10b0b9: 8b 43 34 mov 0x34(%ebx),%eax
10b0bc: 8b 4d c0 mov -0x40(%ebp),%ecx
10b0bf: 8b 55 d4 mov -0x2c(%ebp),%edx
10b0c2: 89 0c 90 mov %ecx,(%eax,%edx,4)
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
10b0c5: ff 73 18 pushl 0x18(%ebx)
10b0c8: 0f b7 43 14 movzwl 0x14(%ebx),%eax
10b0cc: 50 push %eax
10b0cd: 8b 43 34 mov 0x34(%ebx),%eax
10b0d0: ff 34 90 pushl (%eax,%edx,4)
10b0d3: 8d 7d dc lea -0x24(%ebp),%edi
10b0d6: 57 push %edi
10b0d7: e8 c8 f5 ff ff call 10a6a4 <_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 ) {
10b0dc: 83 c4 10 add $0x10,%esp
);
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
10b0df: 8b 75 cc mov -0x34(%ebp),%esi
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10b0e2: 8d 7b 20 lea 0x20(%ebx),%edi
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
10b0e5: eb 26 jmp 10b10d <_Objects_Extend_information+0x225>
10b0e7: 8b 13 mov (%ebx),%edx
10b0e9: c1 e2 18 shl $0x18,%edx
10b0ec: 81 ca 00 00 01 00 or $0x10000,%edx
the_object->id = _Objects_Build_id(
10b0f2: 0f b7 4b 04 movzwl 0x4(%ebx),%ecx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10b0f6: c1 e1 1b shl $0x1b,%ecx
10b0f9: 09 ca or %ecx,%edx
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10b0fb: 09 f2 or %esi,%edx
10b0fd: 89 50 08 mov %edx,0x8(%eax)
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10b100: 52 push %edx
10b101: 52 push %edx
10b102: 50 push %eax
10b103: 57 push %edi
10b104: e8 53 f5 ff ff call 10a65c <_Chain_Append>
index++;
10b109: 46 inc %esi
10b10a: 83 c4 10 add $0x10,%esp
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
10b10d: 83 ec 0c sub $0xc,%esp
10b110: 8d 45 dc lea -0x24(%ebp),%eax
10b113: 50 push %eax
10b114: e8 67 f5 ff ff call 10a680 <_Chain_Get>
10b119: 83 c4 10 add $0x10,%esp
10b11c: 85 c0 test %eax,%eax
10b11e: 75 c7 jne 10b0e7 <_Objects_Extend_information+0x1ff>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
10b120: 8b 43 14 mov 0x14(%ebx),%eax
10b123: 8b 53 30 mov 0x30(%ebx),%edx
10b126: 0f b7 c8 movzwl %ax,%ecx
10b129: 8b 75 d0 mov -0x30(%ebp),%esi
10b12c: 89 0c 32 mov %ecx,(%edx,%esi,1)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
10b12f: 66 01 43 2c add %ax,0x2c(%ebx)
}
10b133: 8d 65 f4 lea -0xc(%ebp),%esp
10b136: 5b pop %ebx
10b137: 5e pop %esi
10b138: 5f pop %edi
10b139: 5d pop %ebp
10b13a: c3 ret
0010b1cc <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
10b1cc: 55 push %ebp
10b1cd: 89 e5 mov %esp,%ebp
10b1cf: 56 push %esi
10b1d0: 53 push %ebx
10b1d1: 8b 5d 08 mov 0x8(%ebp),%ebx
10b1d4: 0f b7 75 0c movzwl 0xc(%ebp),%esi
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
10b1d8: 66 85 f6 test %si,%si
10b1db: 75 04 jne 10b1e1 <_Objects_Get_information+0x15>
return NULL;
10b1dd: 31 c0 xor %eax,%eax
10b1df: eb 2d jmp 10b20e <_Objects_Get_information+0x42>
/*
* 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 );
10b1e1: 83 ec 0c sub $0xc,%esp
10b1e4: 53 push %ebx
10b1e5: e8 b2 43 00 00 call 10f59c <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
10b1ea: 83 c4 10 add $0x10,%esp
10b1ed: 85 c0 test %eax,%eax
10b1ef: 74 ec je 10b1dd <_Objects_Get_information+0x11>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
10b1f1: 39 c6 cmp %eax,%esi
10b1f3: 77 e8 ja 10b1dd <_Objects_Get_information+0x11>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10b1f5: 8b 04 9d bc e3 12 00 mov 0x12e3bc(,%ebx,4),%eax
10b1fc: 85 c0 test %eax,%eax
10b1fe: 74 dd je 10b1dd <_Objects_Get_information+0x11><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
10b200: 8b 04 b0 mov (%eax,%esi,4),%eax
if ( !info )
10b203: 85 c0 test %eax,%eax
10b205: 74 d6 je 10b1dd <_Objects_Get_information+0x11><== 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 )
10b207: 66 83 78 10 00 cmpw $0x0,0x10(%eax)
10b20c: 74 cf je 10b1dd <_Objects_Get_information+0x11>
return NULL;
#endif
return info;
}
10b20e: 8d 65 f8 lea -0x8(%ebp),%esp
10b211: 5b pop %ebx
10b212: 5e pop %esi
10b213: 5d pop %ebp
10b214: c3 ret
001187b4 <_Objects_Get_no_protection>:
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
1187b4: 55 push %ebp
1187b5: 89 e5 mov %esp,%ebp
1187b7: 53 push %ebx
1187b8: 8b 55 08 mov 0x8(%ebp),%edx
1187bb: 8b 4d 10 mov 0x10(%ebp),%ecx
/*
* 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;
1187be: b8 01 00 00 00 mov $0x1,%eax
1187c3: 2b 42 08 sub 0x8(%edx),%eax
1187c6: 03 45 0c add 0xc(%ebp),%eax
if ( information->maximum >= index ) {
1187c9: 0f b7 5a 10 movzwl 0x10(%edx),%ebx
1187cd: 39 c3 cmp %eax,%ebx
1187cf: 72 12 jb 1187e3 <_Objects_Get_no_protection+0x2f>
if ( (the_object = information->local_table[ index ]) != NULL ) {
1187d1: 8b 52 1c mov 0x1c(%edx),%edx
1187d4: 8b 04 82 mov (%edx,%eax,4),%eax
1187d7: 85 c0 test %eax,%eax
1187d9: 74 08 je 1187e3 <_Objects_Get_no_protection+0x2f><== NEVER TAKEN
*location = OBJECTS_LOCAL;
1187db: c7 01 00 00 00 00 movl $0x0,(%ecx)
return the_object;
1187e1: eb 08 jmp 1187eb <_Objects_Get_no_protection+0x37>
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
1187e3: c7 01 01 00 00 00 movl $0x1,(%ecx)
return NULL;
1187e9: 31 c0 xor %eax,%eax
}
1187eb: 5b pop %ebx
1187ec: 5d pop %ebp
1187ed: c3 ret
0010e310 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
10e310: 55 push %ebp
10e311: 89 e5 mov %esp,%ebp
10e313: 83 ec 18 sub $0x18,%esp
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e316: 8b 45 08 mov 0x8(%ebp),%eax
10e319: 85 c0 test %eax,%eax
10e31b: 75 08 jne 10e325 <_Objects_Id_to_name+0x15>
10e31d: a1 ec a1 13 00 mov 0x13a1ec,%eax
10e322: 8b 40 08 mov 0x8(%eax),%eax
10e325: 89 c2 mov %eax,%edx
10e327: c1 ea 18 shr $0x18,%edx
10e32a: 83 e2 07 and $0x7,%edx
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
10e32d: 8d 4a ff lea -0x1(%edx),%ecx
10e330: 83 f9 02 cmp $0x2,%ecx
10e333: 76 3d jbe 10e372 <_Objects_Id_to_name+0x62>
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
10e335: b8 03 00 00 00 mov $0x3,%eax
10e33a: eb 43 jmp 10e37f <_Objects_Id_to_name+0x6f>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10e33c: 89 c1 mov %eax,%ecx
10e33e: c1 e9 1b shr $0x1b,%ecx
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
10e341: 8b 14 8a mov (%edx,%ecx,4),%edx
if ( !information )
10e344: 85 d2 test %edx,%edx
10e346: 74 ed je 10e335 <_Objects_Id_to_name+0x25><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
10e348: 80 7a 38 00 cmpb $0x0,0x38(%edx)
10e34c: 75 e7 jne 10e335 <_Objects_Id_to_name+0x25><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
10e34e: 51 push %ecx
10e34f: 8d 4d f4 lea -0xc(%ebp),%ecx
10e352: 51 push %ecx
10e353: 50 push %eax
10e354: 52 push %edx
10e355: e8 56 ff ff ff call 10e2b0 <_Objects_Get>
if ( !the_object )
10e35a: 83 c4 10 add $0x10,%esp
10e35d: 85 c0 test %eax,%eax
10e35f: 74 d4 je 10e335 <_Objects_Id_to_name+0x25>
return OBJECTS_INVALID_ID;
*name = the_object->name;
10e361: 8b 50 0c mov 0xc(%eax),%edx
10e364: 8b 45 0c mov 0xc(%ebp),%eax
10e367: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e369: e8 5a 0b 00 00 call 10eec8 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10e36e: 31 c0 xor %eax,%eax
10e370: eb 0d jmp 10e37f <_Objects_Id_to_name+0x6f>
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
10e372: 8b 14 95 7c 9c 13 00 mov 0x139c7c(,%edx,4),%edx
10e379: 85 d2 test %edx,%edx
10e37b: 75 bf jne 10e33c <_Objects_Id_to_name+0x2c>
10e37d: eb b6 jmp 10e335 <_Objects_Id_to_name+0x25>
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
10e37f: c9 leave
10e380: c3 ret
00110704 <_POSIX_Keys_Run_destructors>:
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
110704: 55 push %ebp
110705: 89 e5 mov %esp,%ebp
110707: 57 push %edi
110708: 56 push %esi
110709: 53 push %ebx
11070a: 83 ec 1c sub $0x1c,%esp
Objects_Maximum thread_index = _Objects_Get_index( thread->Object.id );
11070d: 8b 45 08 mov 0x8(%ebp),%eax
110710: 8b 40 08 mov 0x8(%eax),%eax
110713: 89 c6 mov %eax,%esi
110715: c1 ee 18 shr $0x18,%esi
110718: 83 e6 07 and $0x7,%esi
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 ];
11071b: 25 ff ff 00 00 and $0xffff,%eax
110720: c1 e0 02 shl $0x2,%eax
110723: 89 45 e0 mov %eax,-0x20(%ebp)
*
* 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;
110726: a1 d0 e7 12 00 mov 0x12e7d0,%eax
11072b: 66 89 45 e6 mov %ax,-0x1a(%ebp)
done = true;
for ( index = 1 ; index <= max ; ++index ) {
11072f: bb 01 00 00 00 mov $0x1,%ebx
*/
while ( !done ) {
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
110734: b2 01 mov $0x1,%dl
for ( index = 1 ; index <= max ; ++index ) {
110736: eb 35 jmp 11076d <_POSIX_Keys_Run_destructors+0x69>
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
110738: 0f b7 cb movzwl %bx,%ecx
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
11073b: a1 dc e7 12 00 mov 0x12e7dc,%eax
110740: 8b 04 88 mov (%eax,%ecx,4),%eax
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
110743: 85 c0 test %eax,%eax
110745: 74 25 je 11076c <_POSIX_Keys_Run_destructors+0x68>
110747: 83 78 10 00 cmpl $0x0,0x10(%eax)
11074b: 74 1f je 11076c <_POSIX_Keys_Run_destructors+0x68>
void *value = key->Values [ thread_api ][ thread_index ];
11074d: 8b 7d e0 mov -0x20(%ebp),%edi
110750: 03 7c b0 14 add 0x14(%eax,%esi,4),%edi
110754: 8b 0f mov (%edi),%ecx
if ( value != NULL ) {
110756: 85 c9 test %ecx,%ecx
110758: 74 12 je 11076c <_POSIX_Keys_Run_destructors+0x68><== ALWAYS TAKEN
key->Values [ thread_api ][ thread_index ] = NULL;
11075a: c7 07 00 00 00 00 movl $0x0,(%edi) <== NOT EXECUTED
(*key->destructor)( value );
110760: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
110763: 51 push %ecx <== NOT EXECUTED
110764: ff 50 10 call *0x10(%eax) <== NOT EXECUTED
110767: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
done = false;
11076a: 31 d2 xor %edx,%edx <== NOT EXECUTED
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
11076c: 43 inc %ebx
11076d: 66 3b 5d e6 cmp -0x1a(%ebp),%bx
110771: 76 c5 jbe 110738 <_POSIX_Keys_Run_destructors+0x34>
* 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 ) {
110773: 84 d2 test %dl,%dl
110775: 74 af je 110726 <_POSIX_Keys_Run_destructors+0x22><== NEVER TAKEN
done = false;
}
}
}
}
}
110777: 8d 65 f4 lea -0xc(%ebp),%esp
11077a: 5b pop %ebx
11077b: 5e pop %esi
11077c: 5f pop %edi
11077d: 5d pop %ebp
11077e: c3 ret
0010dd3c <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10dd3c: 55 push %ebp
10dd3d: 89 e5 mov %esp,%ebp
10dd3f: 57 push %edi
10dd40: 56 push %esi
10dd41: 53 push %ebx
10dd42: 83 ec 30 sub $0x30,%esp
10dd45: 8b 75 08 mov 0x8(%ebp),%esi
10dd48: 8b 5d 14 mov 0x14(%ebp),%ebx
10dd4b: 8a 4d 18 mov 0x18(%ebp),%cl
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
10dd4e: 8d 45 e0 lea -0x20(%ebp),%eax
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(
10dd51: 50 push %eax
10dd52: 56 push %esi
10dd53: 68 b4 5d 13 00 push $0x135db4
10dd58: 88 4d d4 mov %cl,-0x2c(%ebp)
10dd5b: e8 34 2b 00 00 call 110894 <_Objects_Get>
switch ( location ) {
10dd60: 83 c4 10 add $0x10,%esp
10dd63: 83 7d e0 00 cmpl $0x0,-0x20(%ebp)
10dd67: 8a 4d d4 mov -0x2c(%ebp),%cl
10dd6a: 0f 85 b6 00 00 00 jne 10de26 <_POSIX_Message_queue_Receive_support+0xea>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
10dd70: 8b 78 14 mov 0x14(%eax),%edi
10dd73: 89 fa mov %edi,%edx
10dd75: 83 e2 03 and $0x3,%edx
10dd78: 4a dec %edx
10dd79: 75 0a jne 10dd85 <_POSIX_Message_queue_Receive_support+0x49>
_Thread_Enable_dispatch();
10dd7b: e8 c4 36 00 00 call 111444 <_Thread_Enable_dispatch>
10dd80: e9 a1 00 00 00 jmp 10de26 <_POSIX_Message_queue_Receive_support+0xea>
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10dd85: 8b 50 10 mov 0x10(%eax),%edx
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
10dd88: 8b 42 68 mov 0x68(%edx),%eax
10dd8b: 39 45 10 cmp %eax,0x10(%ebp)
10dd8e: 73 15 jae 10dda5 <_POSIX_Message_queue_Receive_support+0x69>
_Thread_Enable_dispatch();
10dd90: e8 af 36 00 00 call 111444 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
10dd95: e8 a6 88 00 00 call 116640 <__errno>
10dd9a: c7 00 7a 00 00 00 movl $0x7a,(%eax)
10dda0: e9 8c 00 00 00 jmp 10de31 <_POSIX_Message_queue_Receive_support+0xf5>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
10dda5: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10ddac: 31 c0 xor %eax,%eax
10ddae: 84 c9 test %cl,%cl
10ddb0: 74 0b je 10ddbd <_POSIX_Message_queue_Receive_support+0x81>
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
10ddb2: 89 f8 mov %edi,%eax
10ddb4: c1 e8 0e shr $0xe,%eax
10ddb7: 83 f0 01 xor $0x1,%eax
10ddba: 83 e0 01 and $0x1,%eax
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
10ddbd: 51 push %ecx
10ddbe: 51 push %ecx
10ddbf: ff 75 1c pushl 0x1c(%ebp)
10ddc2: 0f b6 c0 movzbl %al,%eax
10ddc5: 50 push %eax
10ddc6: 8d 45 e4 lea -0x1c(%ebp),%eax
10ddc9: 50 push %eax
10ddca: ff 75 0c pushl 0xc(%ebp)
10ddcd: 56 push %esi
10ddce: 83 c2 1c add $0x1c,%edx
10ddd1: 52 push %edx
10ddd2: e8 dd 1c 00 00 call 10fab4 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
10ddd7: 83 c4 20 add $0x20,%esp
10ddda: e8 65 36 00 00 call 111444 <_Thread_Enable_dispatch>
if (msg_prio) {
10dddf: 85 db test %ebx,%ebx
10dde1: 74 15 je 10ddf8 <_POSIX_Message_queue_Receive_support+0xbc><== NEVER TAKEN
*msg_prio = _POSIX_Message_queue_Priority_from_core(
_Thread_Executing->Wait.count
10dde3: 8b 15 2c 5e 13 00 mov 0x135e2c,%edx
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);
10dde9: 8b 42 24 mov 0x24(%edx),%eax
10ddec: c1 f8 1f sar $0x1f,%eax
10ddef: 8b 52 24 mov 0x24(%edx),%edx
10ddf2: 31 c2 xor %eax,%edx
10ddf4: 89 13 mov %edx,(%ebx)
10ddf6: 29 03 sub %eax,(%ebx)
);
}
if ( !_Thread_Executing->Wait.return_code )
10ddf8: a1 2c 5e 13 00 mov 0x135e2c,%eax
10ddfd: 83 78 34 00 cmpl $0x0,0x34(%eax)
10de01: 75 05 jne 10de08 <_POSIX_Message_queue_Receive_support+0xcc>
return length_out;
10de03: 8b 45 e4 mov -0x1c(%ebp),%eax
10de06: eb 2c jmp 10de34 <_POSIX_Message_queue_Receive_support+0xf8>
rtems_set_errno_and_return_minus_one(
10de08: e8 33 88 00 00 call 116640 <__errno>
10de0d: 89 c3 mov %eax,%ebx
10de0f: 83 ec 0c sub $0xc,%esp
10de12: a1 2c 5e 13 00 mov 0x135e2c,%eax
10de17: ff 70 34 pushl 0x34(%eax)
10de1a: e8 f1 01 00 00 call 10e010 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10de1f: 89 03 mov %eax,(%ebx)
10de21: 83 c4 10 add $0x10,%esp
10de24: eb 0b jmp 10de31 <_POSIX_Message_queue_Receive_support+0xf5>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10de26: e8 15 88 00 00 call 116640 <__errno>
10de2b: c7 00 09 00 00 00 movl $0x9,(%eax)
10de31: 83 c8 ff or $0xffffffff,%eax
}
10de34: 8d 65 f4 lea -0xc(%ebp),%esp
10de37: 5b pop %ebx
10de38: 5e pop %esi
10de39: 5f pop %edi
10de3a: 5d pop %ebp
10de3b: c3 ret
001100d8 <_POSIX_Semaphore_Create_support>:
size_t name_len,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
1100d8: 55 push %ebp
1100d9: 89 e5 mov %esp,%ebp
1100db: 56 push %esi
1100dc: 53 push %ebx
1100dd: 8b 75 08 mov 0x8(%ebp),%esi
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
1100e0: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
1100e4: 74 0d je 1100f3 <_POSIX_Semaphore_Create_support+0x1b>
rtems_set_errno_and_return_minus_one( ENOSYS );
1100e6: e8 ad 27 00 00 call 112898 <__errno>
1100eb: c7 00 58 00 00 00 movl $0x58,(%eax)
1100f1: eb 36 jmp 110129 <_POSIX_Semaphore_Create_support+0x51>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
1100f3: a1 b4 31 13 00 mov 0x1331b4,%eax
1100f8: 40 inc %eax
1100f9: a3 b4 31 13 00 mov %eax,0x1331b4
return _Thread_Dispatch_disable_level;
1100fe: a1 b4 31 13 00 mov 0x1331b4,%eax
* _POSIX_Semaphore_Allocate
*/
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
{
return (POSIX_Semaphore_Control *)
110103: 83 ec 0c sub $0xc,%esp
110106: 68 78 34 13 00 push $0x133478
11010b: e8 a8 c5 ff ff call 10c6b8 <_Objects_Allocate>
110110: 89 c3 mov %eax,%ebx
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
110112: 83 c4 10 add $0x10,%esp
110115: 85 c0 test %eax,%eax
110117: 75 18 jne 110131 <_POSIX_Semaphore_Create_support+0x59>
_Thread_Enable_dispatch();
110119: e8 9e d5 ff ff call 10d6bc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
11011e: e8 75 27 00 00 call 112898 <__errno>
110123: c7 00 1c 00 00 00 movl $0x1c,(%eax)
110129: 83 c8 ff or $0xffffffff,%eax
11012c: e9 a4 00 00 00 jmp 1101d5 <_POSIX_Semaphore_Create_support+0xfd>
/*
* Make a copy of the user's string for name just in case it was
* dynamically constructed.
*/
if ( name_arg != NULL ) {
110131: 85 f6 test %esi,%esi
110133: 74 36 je 11016b <_POSIX_Semaphore_Create_support+0x93>
name = _Workspace_String_duplicate( name_arg, name_len );
110135: 51 push %ecx
110136: 51 push %ecx
110137: ff 75 0c pushl 0xc(%ebp)
11013a: 56 push %esi
11013b: e8 d4 12 00 00 call 111414 <_Workspace_String_duplicate>
110140: 89 c6 mov %eax,%esi
if ( !name ) {
110142: 83 c4 10 add $0x10,%esp
110145: 85 c0 test %eax,%eax
110147: 75 24 jne 11016d <_POSIX_Semaphore_Create_support+0x95><== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
POSIX_Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
110149: 52 push %edx <== NOT EXECUTED
11014a: 52 push %edx <== NOT EXECUTED
11014b: 53 push %ebx <== NOT EXECUTED
11014c: 68 78 34 13 00 push $0x133478 <== NOT EXECUTED
110151: e8 42 c8 ff ff call 10c998 <_Objects_Free> <== NOT EXECUTED
_POSIX_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
110156: e8 61 d5 ff ff call 10d6bc <_Thread_Enable_dispatch><== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOMEM );
11015b: e8 38 27 00 00 call 112898 <__errno> <== NOT EXECUTED
110160: c7 00 0c 00 00 00 movl $0xc,(%eax) <== NOT EXECUTED
110166: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
110169: eb be jmp 110129 <_POSIX_Semaphore_Create_support+0x51><== NOT EXECUTED
}
} else {
name = NULL;
11016b: 31 f6 xor %esi,%esi
}
the_semaphore->process_shared = pshared;
11016d: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
if ( name ) {
110174: 85 f6 test %esi,%esi
110176: 74 11 je 110189 <_POSIX_Semaphore_Create_support+0xb1>
the_semaphore->named = true;
110178: c6 43 14 01 movb $0x1,0x14(%ebx)
the_semaphore->open_count = 1;
11017c: c7 43 18 01 00 00 00 movl $0x1,0x18(%ebx)
the_semaphore->linked = true;
110183: c6 43 15 01 movb $0x1,0x15(%ebx)
110187: eb 0f jmp 110198 <_POSIX_Semaphore_Create_support+0xc0>
} else {
the_semaphore->named = false;
110189: c6 43 14 00 movb $0x0,0x14(%ebx)
the_semaphore->open_count = 0;
11018d: c7 43 18 00 00 00 00 movl $0x0,0x18(%ebx)
the_semaphore->linked = false;
110194: c6 43 15 00 movb $0x0,0x15(%ebx)
* 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;
110198: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
11019f: c7 43 5c ff ff ff ff movl $0xffffffff,0x5c(%ebx)
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1101a6: 50 push %eax
1101a7: ff 75 14 pushl 0x14(%ebp)
the_semaphore->named = false;
the_semaphore->open_count = 0;
the_semaphore->linked = false;
}
the_sem_attr = &the_semaphore->Semaphore.Attributes;
1101aa: 8d 43 5c lea 0x5c(%ebx),%eax
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1101ad: 50 push %eax
1101ae: 8d 43 1c lea 0x1c(%ebx),%eax
1101b1: 50 push %eax
1101b2: e8 e9 bf ff ff call 10c1a0 <_CORE_semaphore_Initialize>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
1101b7: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1101bb: a1 94 34 13 00 mov 0x133494,%eax
1101c0: 89 1c 90 mov %ebx,(%eax,%edx,4)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
1101c3: 89 73 0c mov %esi,0xc(%ebx)
&_POSIX_Semaphore_Information,
&the_semaphore->Object,
name
);
*the_sem = the_semaphore;
1101c6: 8b 45 18 mov 0x18(%ebp),%eax
1101c9: 89 18 mov %ebx,(%eax)
_Thread_Enable_dispatch();
1101cb: e8 ec d4 ff ff call 10d6bc <_Thread_Enable_dispatch>
return 0;
1101d0: 83 c4 10 add $0x10,%esp
1101d3: 31 c0 xor %eax,%eax
}
1101d5: 8d 65 f8 lea -0x8(%ebp),%esp
1101d8: 5b pop %ebx
1101d9: 5e pop %esi
1101da: 5d pop %ebp
1101db: c3 ret
0010e1a8 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
10e1a8: 55 push %ebp
10e1a9: 89 e5 mov %esp,%ebp
10e1ab: 83 ec 08 sub $0x8,%esp
10e1ae: 8b 55 08 mov 0x8(%ebp),%edx
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
10e1b1: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
10e1b7: 83 b8 d8 00 00 00 00 cmpl $0x0,0xd8(%eax)
10e1be: 75 31 jne 10e1f1 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x49><== NEVER TAKEN
10e1c0: 83 b8 dc 00 00 00 01 cmpl $0x1,0xdc(%eax)
10e1c7: 75 28 jne 10e1f1 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x49>
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
10e1c9: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax)
10e1d0: 74 1f je 10e1f1 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x49>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
10e1d2: a1 dc e3 12 00 mov 0x12e3dc,%eax
10e1d7: 48 dec %eax
10e1d8: a3 dc e3 12 00 mov %eax,0x12e3dc
return _Thread_Dispatch_disable_level;
10e1dd: a1 dc e3 12 00 mov 0x12e3dc,%eax
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
10e1e2: 50 push %eax
10e1e3: 50 push %eax
10e1e4: 6a ff push $0xffffffff
10e1e6: 52 push %edx
10e1e7: e8 e4 05 00 00 call 10e7d0 <_POSIX_Thread_Exit>
10e1ec: 83 c4 10 add $0x10,%esp
10e1ef: eb 06 jmp 10e1f7 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x4f>
} else
_Thread_Enable_dispatch();
}
10e1f1: c9 leave
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();
10e1f2: e9 61 dd ff ff jmp 10bf58 <_Thread_Enable_dispatch>
}
10e1f7: c9 leave
10e1f8: c3 ret
0010f20c <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
10f20c: 55 push %ebp
10f20d: 89 e5 mov %esp,%ebp
10f20f: 57 push %edi
10f210: 56 push %esi
10f211: 53 push %ebx
10f212: 83 ec 18 sub $0x18,%esp
10f215: 8b 75 08 mov 0x8(%ebp),%esi
10f218: 8b 7d 0c mov 0xc(%ebp),%edi
10f21b: 8b 5d 10 mov 0x10(%ebp),%ebx
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
10f21e: ff 37 pushl (%edi)
10f220: e8 c7 ff ff ff call 10f1ec <_POSIX_Priority_Is_valid>
10f225: 83 c4 10 add $0x10,%esp
10f228: 84 c0 test %al,%al
10f22a: 75 0a jne 10f236 <_POSIX_Thread_Translate_sched_param+0x2a><== ALWAYS TAKEN
return EINVAL;
10f22c: b8 16 00 00 00 mov $0x16,%eax
10f231: e9 91 00 00 00 jmp 10f2c7 <_POSIX_Thread_Translate_sched_param+0xbb>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
10f236: c7 03 00 00 00 00 movl $0x0,(%ebx)
*budget_callout = NULL;
10f23c: 8b 45 14 mov 0x14(%ebp),%eax
10f23f: c7 00 00 00 00 00 movl $0x0,(%eax)
if ( policy == SCHED_OTHER ) {
10f245: 85 f6 test %esi,%esi
10f247: 75 08 jne 10f251 <_POSIX_Thread_Translate_sched_param+0x45>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
10f249: c7 03 01 00 00 00 movl $0x1,(%ebx)
10f24f: eb 74 jmp 10f2c5 <_POSIX_Thread_Translate_sched_param+0xb9>
return 0;
}
if ( policy == SCHED_FIFO ) {
10f251: 83 fe 01 cmp $0x1,%esi
10f254: 74 6f je 10f2c5 <_POSIX_Thread_Translate_sched_param+0xb9>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
10f256: 83 fe 02 cmp $0x2,%esi
10f259: 75 08 jne 10f263 <_POSIX_Thread_Translate_sched_param+0x57>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
10f25b: c7 03 02 00 00 00 movl $0x2,(%ebx)
10f261: eb 62 jmp 10f2c5 <_POSIX_Thread_Translate_sched_param+0xb9>
return 0;
}
if ( policy == SCHED_SPORADIC ) {
10f263: 83 fe 04 cmp $0x4,%esi
10f266: 75 c4 jne 10f22c <_POSIX_Thread_Translate_sched_param+0x20>
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
10f268: 83 7f 08 00 cmpl $0x0,0x8(%edi)
10f26c: 75 06 jne 10f274 <_POSIX_Thread_Translate_sched_param+0x68>
10f26e: 83 7f 0c 00 cmpl $0x0,0xc(%edi)
10f272: 74 b8 je 10f22c <_POSIX_Thread_Translate_sched_param+0x20>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
10f274: 83 7f 10 00 cmpl $0x0,0x10(%edi)
10f278: 75 06 jne 10f280 <_POSIX_Thread_Translate_sched_param+0x74>
10f27a: 83 7f 14 00 cmpl $0x0,0x14(%edi)
10f27e: 74 ac je 10f22c <_POSIX_Thread_Translate_sched_param+0x20>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
10f280: 83 ec 0c sub $0xc,%esp
10f283: 8d 47 08 lea 0x8(%edi),%eax
10f286: 50 push %eax
10f287: e8 74 e1 ff ff call 10d400 <_Timespec_To_ticks>
10f28c: 89 c6 mov %eax,%esi
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
10f28e: 8d 47 10 lea 0x10(%edi),%eax
10f291: 89 04 24 mov %eax,(%esp)
10f294: e8 67 e1 ff ff call 10d400 <_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 ) <
10f299: 83 c4 10 add $0x10,%esp
10f29c: 39 c6 cmp %eax,%esi
10f29e: 72 8c jb 10f22c <_POSIX_Thread_Translate_sched_param+0x20>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
10f2a0: 83 ec 0c sub $0xc,%esp
10f2a3: ff 77 04 pushl 0x4(%edi)
10f2a6: e8 41 ff ff ff call 10f1ec <_POSIX_Priority_Is_valid>
10f2ab: 83 c4 10 add $0x10,%esp
10f2ae: 84 c0 test %al,%al
10f2b0: 0f 84 76 ff ff ff je 10f22c <_POSIX_Thread_Translate_sched_param+0x20>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
10f2b6: c7 03 03 00 00 00 movl $0x3,(%ebx)
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
10f2bc: 8b 45 14 mov 0x14(%ebp),%eax
10f2bf: c7 00 fb a2 10 00 movl $0x10a2fb,(%eax)
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
10f2c5: 31 c0 xor %eax,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
10f2c7: 8d 65 f4 lea -0xc(%ebp),%esp
10f2ca: 5b pop %ebx
10f2cb: 5e pop %esi
10f2cc: 5f pop %edi
10f2cd: 5d pop %ebp
10f2ce: c3 ret
0010e3c1 <_POSIX_Threads_Delete_extension>:
*/
static void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
10e3c1: 55 push %ebp
10e3c2: 89 e5 mov %esp,%ebp
10e3c4: 57 push %edi
10e3c5: 56 push %esi
10e3c6: 53 push %ebx
10e3c7: 83 ec 28 sub $0x28,%esp
10e3ca: 8b 5d 0c mov 0xc(%ebp),%ebx
Thread_Control *the_thread;
POSIX_API_Control *api;
void **value_ptr;
api = deleted->API_Extensions[ THREAD_API_POSIX ];
10e3cd: 8b b3 e8 00 00 00 mov 0xe8(%ebx),%esi
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
10e3d3: 53 push %ebx
10e3d4: e8 cb 22 00 00 call 1106a4 <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
10e3d9: 89 1c 24 mov %ebx,(%esp)
10e3dc: e8 23 23 00 00 call 110704 <_POSIX_Keys_Run_destructors>
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
10e3e1: 8b 53 28 mov 0x28(%ebx),%edx
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
10e3e4: 83 c4 10 add $0x10,%esp
10e3e7: 8d 7e 44 lea 0x44(%esi),%edi
10e3ea: eb 05 jmp 10e3f1 <_POSIX_Threads_Delete_extension+0x30>
*(void **)the_thread->Wait.return_argument = value_ptr;
10e3ec: 8b 40 28 mov 0x28(%eax),%eax <== NOT EXECUTED
10e3ef: 89 10 mov %edx,(%eax) <== 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 )) )
10e3f1: 83 ec 0c sub $0xc,%esp
10e3f4: 57 push %edi
10e3f5: 89 55 e4 mov %edx,-0x1c(%ebp)
10e3f8: e8 77 dd ff ff call 10c174 <_Thread_queue_Dequeue>
10e3fd: 83 c4 10 add $0x10,%esp
10e400: 85 c0 test %eax,%eax
10e402: 8b 55 e4 mov -0x1c(%ebp),%edx
10e405: 75 e5 jne 10e3ec <_POSIX_Threads_Delete_extension+0x2b><== NEVER TAKEN
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
10e407: 83 be 84 00 00 00 04 cmpl $0x4,0x84(%esi)
10e40e: 75 12 jne 10e422 <_POSIX_Threads_Delete_extension+0x61>
(void) _Watchdog_Remove( &api->Sporadic_timer );
10e410: 83 ec 0c sub $0xc,%esp
10e413: 8d 86 a8 00 00 00 lea 0xa8(%esi),%eax
10e419: 50 push %eax
10e41a: e8 f9 e5 ff ff call 10ca18 <_Watchdog_Remove>
10e41f: 83 c4 10 add $0x10,%esp
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
10e422: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
10e429: 00 00 00
_Workspace_Free( api );
10e42c: 89 75 08 mov %esi,0x8(%ebp)
}
10e42f: 8d 65 f4 lea -0xc(%ebp),%esp
10e432: 5b pop %ebx
10e433: 5e pop %esi
10e434: 5f pop %edi
10e435: 5d pop %ebp
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
10e436: e9 22 e7 ff ff jmp 10cb5d <_Workspace_Free>
0010a028 <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
10a028: 55 push %ebp
10a029: 89 e5 mov %esp,%ebp
10a02b: 57 push %edi
10a02c: 56 push %esi
10a02d: 53 push %ebx
10a02e: 83 ec 6c sub $0x6c,%esp
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;
10a031: 8b 3d c4 b1 12 00 mov 0x12b1c4,%edi
maximum = Configuration_POSIX_API.number_of_initialization_threads;
10a037: 8b 15 c0 b1 12 00 mov 0x12b1c0,%edx
if ( !user_threads || maximum == 0 )
10a03d: 85 d2 test %edx,%edx
10a03f: 74 54 je 10a095 <_POSIX_Threads_Initialize_user_threads_body+0x6d><== NEVER TAKEN
10a041: 85 ff test %edi,%edi
10a043: 74 50 je 10a095 <_POSIX_Threads_Initialize_user_threads_body+0x6d><== NEVER TAKEN
10a045: 31 db xor %ebx,%ebx
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
10a047: 8d 75 a8 lea -0x58(%ebp),%esi
10a04a: 83 ec 0c sub $0xc,%esp
10a04d: 56 push %esi
10a04e: 89 55 94 mov %edx,-0x6c(%ebp)
10a051: e8 7a 52 00 00 call 10f2d0 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
10a056: 59 pop %ecx
10a057: 58 pop %eax
10a058: 6a 02 push $0x2
10a05a: 56 push %esi
10a05b: e8 98 52 00 00 call 10f2f8 <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
10a060: 58 pop %eax
10a061: 5a pop %edx
10a062: ff 74 df 04 pushl 0x4(%edi,%ebx,8)
10a066: 56 push %esi
10a067: e8 b8 52 00 00 call 10f324 <pthread_attr_setstacksize>
status = pthread_create(
10a06c: 6a 00 push $0x0
10a06e: ff 34 df pushl (%edi,%ebx,8)
10a071: 56 push %esi
10a072: 8d 45 a4 lea -0x5c(%ebp),%eax
10a075: 50 push %eax
10a076: e8 75 fc ff ff call 109cf0 <pthread_create>
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
10a07b: 83 c4 20 add $0x20,%esp
10a07e: 85 c0 test %eax,%eax
10a080: 8b 55 94 mov -0x6c(%ebp),%edx
10a083: 74 0b je 10a090 <_POSIX_Threads_Initialize_user_threads_body+0x68>
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
10a085: 52 push %edx
10a086: 50 push %eax
10a087: 6a 01 push $0x1
10a089: 6a 02 push $0x2
10a08b: e8 98 1a 00 00 call 10bb28 <_Internal_error_Occurred>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
10a090: 43 inc %ebx
10a091: 39 d3 cmp %edx,%ebx
10a093: 75 b5 jne 10a04a <_POSIX_Threads_Initialize_user_threads_body+0x22><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
10a095: 8d 65 f4 lea -0xc(%ebp),%esp
10a098: 5b pop %ebx
10a099: 5e pop %esi
10a09a: 5f pop %edi
10a09b: 5d pop %ebp
10a09c: c3 ret
0010e56d <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
10e56d: 55 push %ebp
10e56e: 89 e5 mov %esp,%ebp
10e570: 56 push %esi
10e571: 53 push %ebx
10e572: 8b 5d 0c mov 0xc(%ebp),%ebx
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10e575: 8b b3 e8 00 00 00 mov 0xe8(%ebx),%esi
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
10e57b: 83 ec 0c sub $0xc,%esp
10e57e: 8d 86 98 00 00 00 lea 0x98(%esi),%eax
10e584: 50 push %eax
10e585: e8 a2 12 00 00 call 10f82c <_Timespec_To_ticks>
the_thread->cpu_time_budget = ticks;
10e58a: 89 43 74 mov %eax,0x74(%ebx)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10e58d: 0f b6 05 88 a1 12 00 movzbl 0x12a188,%eax
10e594: 2b 86 88 00 00 00 sub 0x88(%esi),%eax
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
10e59a: 89 43 18 mov %eax,0x18(%ebx)
*/
#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 ) {
10e59d: 83 c4 10 add $0x10,%esp
10e5a0: 83 7b 1c 00 cmpl $0x0,0x1c(%ebx)
10e5a4: 75 12 jne 10e5b8 <_POSIX_Threads_Sporadic_budget_TSR+0x4b><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
10e5a6: 39 43 14 cmp %eax,0x14(%ebx)
10e5a9: 76 0d jbe 10e5b8 <_POSIX_Threads_Sporadic_budget_TSR+0x4b>
_Thread_Change_priority( the_thread, new_priority, true );
10e5ab: 52 push %edx
10e5ac: 6a 01 push $0x1
10e5ae: 50 push %eax
10e5af: 53 push %ebx
10e5b0: e8 67 d4 ff ff call 10ba1c <_Thread_Change_priority>
10e5b5: 83 c4 10 add $0x10,%esp
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
10e5b8: 83 ec 0c sub $0xc,%esp
10e5bb: 8d 86 90 00 00 00 lea 0x90(%esi),%eax
10e5c1: 50 push %eax
10e5c2: e8 65 12 00 00 call 10f82c <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10e5c7: 89 86 b4 00 00 00 mov %eax,0xb4(%esi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10e5cd: 83 c4 10 add $0x10,%esp
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
10e5d0: 81 c6 a8 00 00 00 add $0xa8,%esi
10e5d6: 89 75 0c mov %esi,0xc(%ebp)
10e5d9: c7 45 08 88 e4 12 00 movl $0x12e488,0x8(%ebp)
}
10e5e0: 8d 65 f8 lea -0x8(%ebp),%esp
10e5e3: 5b pop %ebx
10e5e4: 5e pop %esi
10e5e5: 5d pop %ebp
10e5e6: e9 19 e3 ff ff jmp 10c904 <_Watchdog_Insert>
0010e5eb <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
10e5eb: 55 push %ebp
10e5ec: 89 e5 mov %esp,%ebp
10e5ee: 83 ec 08 sub $0x8,%esp
10e5f1: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10e5f4: 8b 88 e8 00 00 00 mov 0xe8(%eax),%ecx
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
10e5fa: c7 40 74 ff ff ff ff movl $0xffffffff,0x74(%eax)
10e601: 0f b6 15 88 a1 12 00 movzbl 0x12a188,%edx
10e608: 2b 91 8c 00 00 00 sub 0x8c(%ecx),%edx
new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority);
the_thread->real_priority = new_priority;
10e60e: 89 50 18 mov %edx,0x18(%eax)
*/
#if 0
printk( "callout %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
10e611: 83 78 1c 00 cmpl $0x0,0x1c(%eax)
10e615: 75 12 jne 10e629 <_POSIX_Threads_Sporadic_budget_callout+0x3e><== NEVER TAKEN
/*
* Make sure we are actually lowering it. If they have lowered it
* to logically lower than sched_ss_low_priority, then we do not want to
* change it.
*/
if ( the_thread->current_priority < new_priority ) {
10e617: 39 50 14 cmp %edx,0x14(%eax)
10e61a: 73 0d jae 10e629 <_POSIX_Threads_Sporadic_budget_callout+0x3e><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
10e61c: 51 push %ecx
10e61d: 6a 01 push $0x1
10e61f: 52 push %edx
10e620: 50 push %eax
10e621: e8 f6 d3 ff ff call 10ba1c <_Thread_Change_priority>
10e626: 83 c4 10 add $0x10,%esp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
10e629: c9 leave
10e62a: c3 ret
00109bb8 <_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)
{
109bb8: 55 push %ebp
109bb9: 89 e5 mov %esp,%ebp
109bbb: 57 push %edi
109bbc: 56 push %esi
109bbd: 53 push %ebx
109bbe: 83 ec 1c sub $0x1c,%esp
109bc1: 8b 5d 0c mov 0xc(%ebp),%ebx
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
109bc4: ff 43 68 incl 0x68(%ebx)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
109bc7: 83 7b 54 00 cmpl $0x0,0x54(%ebx)
109bcb: 75 06 jne 109bd3 <_POSIX_Timer_TSR+0x1b>
109bcd: 83 7b 58 00 cmpl $0x0,0x58(%ebx)
109bd1: 74 5f je 109c32 <_POSIX_Timer_TSR+0x7a> <== NEVER TAKEN
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
109bd3: 83 ec 0c sub $0xc,%esp
109bd6: 53 push %ebx
109bd7: 68 b8 9b 10 00 push $0x109bb8
109bdc: ff 73 08 pushl 0x8(%ebx)
109bdf: ff 73 64 pushl 0x64(%ebx)
109be2: 8d 43 10 lea 0x10(%ebx),%eax
109be5: 50 push %eax
109be6: e8 65 51 00 00 call 10ed50 <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
109beb: 83 c4 20 add $0x20,%esp
109bee: 84 c0 test %al,%al
109bf0: 74 5b je 109c4d <_POSIX_Timer_TSR+0x95> <== NEVER TAKEN
struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_TOD_Get_as_timestamp( &tod_as_timestamp );
109bf2: 83 ec 0c sub $0xc,%esp
109bf5: 8d 45 e0 lea -0x20(%ebp),%eax
109bf8: 50 push %eax
109bf9: e8 5e 13 00 00 call 10af5c <_TOD_Get_as_timestamp>
_Timestamp_To_timespec( &tod_as_timestamp, tod_as_timespec );
109bfe: 8b 75 e0 mov -0x20(%ebp),%esi
109c01: 8b 7d e4 mov -0x1c(%ebp),%edi
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
109c04: 6a 00 push $0x0
109c06: 68 00 ca 9a 3b push $0x3b9aca00
109c0b: 57 push %edi
109c0c: 56 push %esi
109c0d: e8 d2 3f 01 00 call 11dbe4 <__divdi3>
109c12: 83 c4 10 add $0x10,%esp
109c15: 89 43 6c mov %eax,0x6c(%ebx)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
109c18: 6a 00 push $0x0
109c1a: 68 00 ca 9a 3b push $0x3b9aca00
109c1f: 57 push %edi
109c20: 56 push %esi
109c21: e8 12 41 01 00 call 11dd38 <__moddi3>
109c26: 89 43 70 mov %eax,0x70(%ebx)
/* 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;
109c29: c6 43 3c 03 movb $0x3,0x3c(%ebx)
109c2d: 83 c4 20 add $0x20,%esp
109c30: eb 04 jmp 109c36 <_POSIX_Timer_TSR+0x7e>
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
109c32: c6 43 3c 04 movb $0x4,0x3c(%ebx) <== 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 ) ) {
109c36: 50 push %eax
109c37: 50 push %eax
109c38: ff 73 44 pushl 0x44(%ebx)
109c3b: ff 73 38 pushl 0x38(%ebx)
109c3e: e8 0d 4d 00 00 call 10e950 <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
109c43: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
109c4a: 83 c4 10 add $0x10,%esp
}
109c4d: 8d 65 f4 lea -0xc(%ebp),%esp
109c50: 5b pop %ebx
109c51: 5e pop %esi
109c52: 5f pop %edi
109c53: 5d pop %ebp
109c54: c3 ret
00110780 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
110780: 55 push %ebp
110781: 89 e5 mov %esp,%ebp
110783: 57 push %edi
110784: 56 push %esi
110785: 53 push %ebx
110786: 83 ec 68 sub $0x68,%esp
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,
110789: 6a 01 push $0x1
11078b: 0f b6 45 10 movzbl 0x10(%ebp),%eax
11078f: 50 push %eax
110790: 8d 45 b4 lea -0x4c(%ebp),%eax
110793: 50 push %eax
110794: ff 75 0c pushl 0xc(%ebp)
110797: ff 75 08 pushl 0x8(%ebp)
11079a: e8 91 00 00 00 call 110830 <_POSIX_signals_Clear_signals>
11079f: 83 c4 20 add $0x20,%esp
is_global, true ) )
return false;
1107a2: 31 c9 xor %ecx,%ecx
{
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,
1107a4: 84 c0 test %al,%al
1107a6: 74 7d je 110825 <_POSIX_signals_Check_signal+0xa5>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
1107a8: 6b 55 0c 0c imul $0xc,0xc(%ebp),%edx
1107ac: 8b 9a 30 e9 12 00 mov 0x12e930(%edx),%ebx
1107b2: 83 fb 01 cmp $0x1,%ebx
1107b5: 74 6e je 110825 <_POSIX_signals_Check_signal+0xa5><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
1107b7: 8b 4d 08 mov 0x8(%ebp),%ecx
1107ba: 8b 89 d0 00 00 00 mov 0xd0(%ecx),%ecx
1107c0: 89 4d a4 mov %ecx,-0x5c(%ebp)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
1107c3: 8b 82 2c e9 12 00 mov 0x12e92c(%edx),%eax
1107c9: 09 c8 or %ecx,%eax
1107cb: 8b 4d 08 mov 0x8(%ebp),%ecx
1107ce: 89 81 d0 00 00 00 mov %eax,0xd0(%ecx)
/*
* 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,
1107d4: 8d 7d c0 lea -0x40(%ebp),%edi
1107d7: 8b 35 ec e8 12 00 mov 0x12e8ec,%esi
1107dd: 83 c6 20 add $0x20,%esi
1107e0: b9 0a 00 00 00 mov $0xa,%ecx
1107e5: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
1107e7: 83 ba 28 e9 12 00 02 cmpl $0x2,0x12e928(%edx)
1107ee: 75 09 jne 1107f9 <_POSIX_signals_Check_signal+0x79>
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
1107f0: 50 push %eax
1107f1: 6a 00 push $0x0
1107f3: 8d 45 b4 lea -0x4c(%ebp),%eax
1107f6: 50 push %eax
1107f7: eb 03 jmp 1107fc <_POSIX_signals_Check_signal+0x7c>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
1107f9: 83 ec 0c sub $0xc,%esp
1107fc: ff 75 0c pushl 0xc(%ebp)
1107ff: ff d3 call *%ebx
break;
110801: 83 c4 10 add $0x10,%esp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
110804: 8b 3d ec e8 12 00 mov 0x12e8ec,%edi
11080a: 83 c7 20 add $0x20,%edi
11080d: 8d 75 c0 lea -0x40(%ebp),%esi
110810: b9 0a 00 00 00 mov $0xa,%ecx
110815: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
110817: 8b 45 a4 mov -0x5c(%ebp),%eax
11081a: 8b 55 08 mov 0x8(%ebp),%edx
11081d: 89 82 d0 00 00 00 mov %eax,0xd0(%edx)
return true;
110823: b1 01 mov $0x1,%cl
}
110825: 88 c8 mov %cl,%al
110827: 8d 65 f4 lea -0xc(%ebp),%esp
11082a: 5b pop %ebx
11082b: 5e pop %esi
11082c: 5f pop %edi
11082d: 5d pop %ebp
11082e: c3 ret
00110e54 <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
110e54: 55 push %ebp
110e55: 89 e5 mov %esp,%ebp
110e57: 53 push %ebx
110e58: 8b 55 08 mov 0x8(%ebp),%edx
110e5b: 8d 4a ff lea -0x1(%edx),%ecx
110e5e: b8 01 00 00 00 mov $0x1,%eax
110e63: d3 e0 shl %cl,%eax
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
110e65: 9c pushf
110e66: fa cli
110e67: 59 pop %ecx
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
110e68: 6b d2 0c imul $0xc,%edx,%edx
110e6b: 83 ba 28 e9 12 00 02 cmpl $0x2,0x12e928(%edx)
110e72: 75 12 jne 110e86 <_POSIX_signals_Clear_process_signals+0x32>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
110e74: 8d 9a 24 eb 12 00 lea 0x12eb24(%edx),%ebx
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
110e7a: 39 9a 20 eb 12 00 cmp %ebx,0x12eb20(%edx)
110e80: 74 04 je 110e86 <_POSIX_signals_Clear_process_signals+0x32><== ALWAYS TAKEN
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
}
_ISR_Enable( level );
110e82: 51 push %ecx
110e83: 9d popf
110e84: eb 0a jmp 110e90 <_POSIX_signals_Clear_process_signals+0x3c>
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
110e86: f7 d0 not %eax
110e88: 21 05 1c eb 12 00 and %eax,0x12eb1c
110e8e: eb f2 jmp 110e82 <_POSIX_signals_Clear_process_signals+0x2e>
}
_ISR_Enable( level );
}
110e90: 5b pop %ebx
110e91: 5d pop %ebp
110e92: c3 ret
0010a6c4 <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
static int _POSIX_signals_Get_lowest(
sigset_t set
)
{
10a6c4: 55 push %ebp
10a6c5: 89 e5 mov %esp,%ebp
10a6c7: 56 push %esi
10a6c8: 53 push %ebx
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10a6c9: ba 1b 00 00 00 mov $0x1b,%edx
10a6ce: bb 01 00 00 00 mov $0x1,%ebx
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
static int _POSIX_signals_Get_lowest(
10a6d3: 8d 4a ff lea -0x1(%edx),%ecx
10a6d6: 89 de mov %ebx,%esi
10a6d8: d3 e6 shl %cl,%esi
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10a6da: 85 c6 test %eax,%esi
10a6dc: 75 1e jne 10a6fc <_POSIX_signals_Get_lowest+0x38><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10a6de: 42 inc %edx
10a6df: 83 fa 20 cmp $0x20,%edx
10a6e2: 75 ef jne 10a6d3 <_POSIX_signals_Get_lowest+0xf>
10a6e4: b2 01 mov $0x1,%dl
10a6e6: bb 01 00 00 00 mov $0x1,%ebx
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
static int _POSIX_signals_Get_lowest(
10a6eb: 8d 4a ff lea -0x1(%edx),%ecx
10a6ee: 89 de mov %ebx,%esi
10a6f0: d3 e6 shl %cl,%esi
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10a6f2: 85 c6 test %eax,%esi
10a6f4: 75 06 jne 10a6fc <_POSIX_signals_Get_lowest+0x38>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
10a6f6: 42 inc %edx
10a6f7: 83 fa 1b cmp $0x1b,%edx
10a6fa: 75 ef jne 10a6eb <_POSIX_signals_Get_lowest+0x27><== ALWAYS TAKEN
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
10a6fc: 89 d0 mov %edx,%eax
10a6fe: 5b pop %ebx
10a6ff: 5e pop %esi
10a700: 5d pop %ebp
10a701: c3 ret
0011dbf0 <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
11dbf0: 55 push %ebp
11dbf1: 89 e5 mov %esp,%ebp
11dbf3: 57 push %edi
11dbf4: 56 push %esi
11dbf5: 53 push %ebx
11dbf6: 83 ec 0c sub $0xc,%esp
11dbf9: 8b 5d 08 mov 0x8(%ebp),%ebx
11dbfc: 8b 75 0c mov 0xc(%ebp),%esi
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
11dbff: 8b bb e8 00 00 00 mov 0xe8(%ebx),%edi
11dc05: 8d 4e ff lea -0x1(%esi),%ecx
11dc08: b8 01 00 00 00 mov $0x1,%eax
11dc0d: d3 e0 shl %cl,%eax
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
11dc0f: 8b 53 10 mov 0x10(%ebx),%edx
11dc12: 89 d1 mov %edx,%ecx
11dc14: 81 e1 00 80 00 10 and $0x10008000,%ecx
11dc1a: 81 f9 00 80 00 10 cmp $0x10008000,%ecx
11dc20: 75 54 jne 11dc76 <_POSIX_signals_Unblock_thread+0x86>
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
11dc22: 85 43 30 test %eax,0x30(%ebx)
11dc25: 75 11 jne 11dc38 <_POSIX_signals_Unblock_thread+0x48>
11dc27: 8b 97 d0 00 00 00 mov 0xd0(%edi),%edx
11dc2d: f7 d2 not %edx
11dc2f: 85 d0 test %edx,%eax
11dc31: 75 05 jne 11dc38 <_POSIX_signals_Unblock_thread+0x48>
11dc33: e9 ab 00 00 00 jmp 11dce3 <_POSIX_signals_Unblock_thread+0xf3>
the_thread->Wait.return_code = EINTR;
11dc38: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
11dc3f: 8b 43 28 mov 0x28(%ebx),%eax
if ( !info ) {
11dc42: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
11dc46: 75 12 jne 11dc5a <_POSIX_signals_Unblock_thread+0x6a>
the_info->si_signo = signo;
11dc48: 89 30 mov %esi,(%eax)
the_info->si_code = SI_USER;
11dc4a: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
the_info->si_value.sival_int = 0;
11dc51: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
11dc58: eb 0c jmp 11dc66 <_POSIX_signals_Unblock_thread+0x76>
} else {
*the_info = *info;
11dc5a: b9 03 00 00 00 mov $0x3,%ecx
11dc5f: 89 c7 mov %eax,%edi
11dc61: 8b 75 10 mov 0x10(%ebp),%esi
11dc64: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
_Thread_queue_Extract_with_proxy( the_thread );
11dc66: 83 ec 0c sub $0xc,%esp
11dc69: 53 push %ebx
11dc6a: e8 c1 e7 fe ff call 10c430 <_Thread_queue_Extract_with_proxy>
return true;
11dc6f: 83 c4 10 add $0x10,%esp
11dc72: b0 01 mov $0x1,%al
11dc74: eb 6f jmp 11dce5 <_POSIX_signals_Unblock_thread+0xf5>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
11dc76: 8b 8f d0 00 00 00 mov 0xd0(%edi),%ecx
11dc7c: f7 d1 not %ecx
11dc7e: 85 c8 test %ecx,%eax
11dc80: 74 61 je 11dce3 <_POSIX_signals_Unblock_thread+0xf3>
* 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 ) ) {
11dc82: f7 c2 00 00 00 10 test $0x10000000,%edx
11dc88: 74 3d je 11dcc7 <_POSIX_signals_Unblock_thread+0xd7>
the_thread->Wait.return_code = EINTR;
11dc8a: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
/*
* 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) )
11dc91: f7 c2 e0 be 03 00 test $0x3bee0,%edx
11dc97: 74 0b je 11dca4 <_POSIX_signals_Unblock_thread+0xb4>
_Thread_queue_Extract_with_proxy( the_thread );
11dc99: 83 ec 0c sub $0xc,%esp
11dc9c: 53 push %ebx
11dc9d: e8 8e e7 fe ff call 10c430 <_Thread_queue_Extract_with_proxy>
11dca2: eb 1e jmp 11dcc2 <_POSIX_signals_Unblock_thread+0xd2>
else if ( _States_Is_delaying(the_thread->current_state) ) {
11dca4: 80 e2 08 and $0x8,%dl
11dca7: 74 3a je 11dce3 <_POSIX_signals_Unblock_thread+0xf3><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
11dca9: 83 ec 0c sub $0xc,%esp
11dcac: 8d 43 48 lea 0x48(%ebx),%eax
11dcaf: 50 push %eax
11dcb0: e8 63 ed fe ff call 10ca18 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
11dcb5: 58 pop %eax
11dcb6: 5a pop %edx
11dcb7: 68 f8 ff 03 10 push $0x1003fff8
11dcbc: 53 push %ebx
11dcbd: e8 1a de fe ff call 10badc <_Thread_Clear_state>
11dcc2: 83 c4 10 add $0x10,%esp
11dcc5: eb 1c jmp 11dce3 <_POSIX_signals_Unblock_thread+0xf3>
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
11dcc7: 85 d2 test %edx,%edx
11dcc9: 75 18 jne 11dce3 <_POSIX_signals_Unblock_thread+0xf3><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
11dccb: 83 3d e8 e8 12 00 00 cmpl $0x0,0x12e8e8
11dcd2: 74 0f je 11dce3 <_POSIX_signals_Unblock_thread+0xf3>
11dcd4: 3b 1d ec e8 12 00 cmp 0x12e8ec,%ebx
11dcda: 75 07 jne 11dce3 <_POSIX_signals_Unblock_thread+0xf3><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
11dcdc: c6 05 f8 e8 12 00 01 movb $0x1,0x12e8f8
}
}
return false;
11dce3: 31 c0 xor %eax,%eax
}
11dce5: 8d 65 f4 lea -0xc(%ebp),%esp
11dce8: 5b pop %ebx
11dce9: 5e pop %esi
11dcea: 5f pop %edi
11dceb: 5d pop %ebp
11dcec: c3 ret
0010c004 <_RBTree_Extract_unprotected>:
*/
void _RBTree_Extract_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
10c004: 55 push %ebp
10c005: 89 e5 mov %esp,%ebp
10c007: 57 push %edi
10c008: 56 push %esi
10c009: 53 push %ebx
10c00a: 83 ec 1c sub $0x1c,%esp
10c00d: 8b 7d 08 mov 0x8(%ebp),%edi
10c010: 8b 5d 0c mov 0xc(%ebp),%ebx
RBTree_Node *leaf, *target;
RBTree_Color victim_color;
RBTree_Direction dir;
if (!the_node) return;
10c013: 85 db test %ebx,%ebx
10c015: 0f 84 0d 01 00 00 je 10c128 <_RBTree_Extract_unprotected+0x124>
/* check if min needs to be updated */
if (the_node == the_rbtree->first[RBT_LEFT]) {
10c01b: 3b 5f 08 cmp 0x8(%edi),%ebx
10c01e: 75 10 jne 10c030 <_RBTree_Extract_unprotected+0x2c>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Successor_unprotected(
const RBTree_Node *node
)
{
return _RBTree_Next_unprotected( node, RBT_RIGHT );
10c020: 50 push %eax
10c021: 50 push %eax
10c022: 6a 01 push $0x1
10c024: 53 push %ebx
10c025: e8 5a 03 00 00 call 10c384 <_RBTree_Next_unprotected>
RBTree_Node *next;
next = _RBTree_Successor_unprotected(the_node);
the_rbtree->first[RBT_LEFT] = next;
10c02a: 89 47 08 mov %eax,0x8(%edi)
10c02d: 83 c4 10 add $0x10,%esp
}
/* 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]) {
10c030: 3b 5f 0c cmp 0xc(%edi),%ebx
10c033: 75 10 jne 10c045 <_RBTree_Extract_unprotected+0x41>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Predecessor_unprotected(
const RBTree_Node *node
)
{
return _RBTree_Next_unprotected( node, RBT_LEFT );
10c035: 56 push %esi
10c036: 56 push %esi
10c037: 6a 00 push $0x0
10c039: 53 push %ebx
10c03a: e8 45 03 00 00 call 10c384 <_RBTree_Next_unprotected>
RBTree_Node *previous;
previous = _RBTree_Predecessor_unprotected(the_node);
the_rbtree->first[RBT_RIGHT] = previous;
10c03f: 89 47 0c mov %eax,0xc(%edi)
10c042: 83 c4 10 add $0x10,%esp
* 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]) {
10c045: 8b 73 04 mov 0x4(%ebx),%esi
10c048: 85 f6 test %esi,%esi
10c04a: 74 77 je 10c0c3 <_RBTree_Extract_unprotected+0xbf>
10c04c: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10c050: 75 04 jne 10c056 <_RBTree_Extract_unprotected+0x52>
10c052: eb 78 jmp 10c0cc <_RBTree_Extract_unprotected+0xc8>
target = the_node->child[RBT_LEFT]; /* find max in node->child[RBT_LEFT] */
while (target->child[RBT_RIGHT]) target = target->child[RBT_RIGHT];
10c054: 89 c6 mov %eax,%esi
10c056: 8b 46 08 mov 0x8(%esi),%eax
10c059: 85 c0 test %eax,%eax
10c05b: 75 f7 jne 10c054 <_RBTree_Extract_unprotected+0x50>
* 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];
10c05d: 8b 56 04 mov 0x4(%esi),%edx
if(leaf) {
10c060: 85 d2 test %edx,%edx
10c062: 74 06 je 10c06a <_RBTree_Extract_unprotected+0x66>
leaf->parent = target->parent;
10c064: 8b 06 mov (%esi),%eax
10c066: 89 02 mov %eax,(%edx)
10c068: eb 0d jmp 10c077 <_RBTree_Extract_unprotected+0x73>
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(target);
10c06a: 89 f0 mov %esi,%eax
10c06c: 89 55 e0 mov %edx,-0x20(%ebp)
10c06f: e8 53 fe ff ff call 10bec7 <_RBTree_Extract_validate_unprotected>
10c074: 8b 55 e0 mov -0x20(%ebp),%edx
}
victim_color = target->color;
10c077: 8b 46 0c mov 0xc(%esi),%eax
10c07a: 89 45 e4 mov %eax,-0x1c(%ebp)
dir = target != target->parent->child[0];
10c07d: 8b 06 mov (%esi),%eax
10c07f: 31 c9 xor %ecx,%ecx
10c081: 3b 70 04 cmp 0x4(%eax),%esi
10c084: 0f 95 c1 setne %cl
target->parent->child[dir] = leaf;
10c087: 89 54 88 04 mov %edx,0x4(%eax,%ecx,4)
/* now replace the_node with target */
dir = the_node != the_node->parent->child[0];
10c08b: 8b 03 mov (%ebx),%eax
10c08d: 31 c9 xor %ecx,%ecx
10c08f: 3b 58 04 cmp 0x4(%eax),%ebx
10c092: 0f 95 c1 setne %cl
the_node->parent->child[dir] = target;
10c095: 89 74 88 04 mov %esi,0x4(%eax,%ecx,4)
/* set target's new children to the original node's children */
target->child[RBT_RIGHT] = the_node->child[RBT_RIGHT];
10c099: 8b 43 08 mov 0x8(%ebx),%eax
10c09c: 89 46 08 mov %eax,0x8(%esi)
if (the_node->child[RBT_RIGHT])
10c09f: 8b 43 08 mov 0x8(%ebx),%eax
10c0a2: 85 c0 test %eax,%eax
10c0a4: 74 02 je 10c0a8 <_RBTree_Extract_unprotected+0xa4><== NEVER TAKEN
the_node->child[RBT_RIGHT]->parent = target;
10c0a6: 89 30 mov %esi,(%eax)
target->child[RBT_LEFT] = the_node->child[RBT_LEFT];
10c0a8: 8b 43 04 mov 0x4(%ebx),%eax
10c0ab: 89 46 04 mov %eax,0x4(%esi)
if (the_node->child[RBT_LEFT])
10c0ae: 8b 43 04 mov 0x4(%ebx),%eax
10c0b1: 85 c0 test %eax,%eax
10c0b3: 74 02 je 10c0b7 <_RBTree_Extract_unprotected+0xb3>
the_node->child[RBT_LEFT]->parent = target;
10c0b5: 89 30 mov %esi,(%eax)
/* 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;
10c0b7: 8b 03 mov (%ebx),%eax
10c0b9: 89 06 mov %eax,(%esi)
target->color = the_node->color;
10c0bb: 8b 43 0c mov 0xc(%ebx),%eax
10c0be: 89 46 0c mov %eax,0xc(%esi)
10c0c1: eb 32 jmp 10c0f5 <_RBTree_Extract_unprotected+0xf1>
* 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];
10c0c3: 8b 53 08 mov 0x8(%ebx),%edx
if( leaf ) {
10c0c6: 85 d2 test %edx,%edx
10c0c8: 75 04 jne 10c0ce <_RBTree_Extract_unprotected+0xca>
10c0ca: eb 08 jmp 10c0d4 <_RBTree_Extract_unprotected+0xd0>
* 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]) {
10c0cc: 89 f2 mov %esi,%edx
* 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;
10c0ce: 8b 03 mov (%ebx),%eax
10c0d0: 89 02 mov %eax,(%edx)
10c0d2: eb 0d jmp 10c0e1 <_RBTree_Extract_unprotected+0xdd>
} else {
/* fix the tree here if the child is a null leaf. */
_RBTree_Extract_validate_unprotected(the_node);
10c0d4: 89 d8 mov %ebx,%eax
10c0d6: 89 55 e0 mov %edx,-0x20(%ebp)
10c0d9: e8 e9 fd ff ff call 10bec7 <_RBTree_Extract_validate_unprotected>
10c0de: 8b 55 e0 mov -0x20(%ebp),%edx
}
victim_color = the_node->color;
10c0e1: 8b 43 0c mov 0xc(%ebx),%eax
10c0e4: 89 45 e4 mov %eax,-0x1c(%ebp)
/* remove the_node from the tree */
dir = the_node != the_node->parent->child[0];
10c0e7: 8b 03 mov (%ebx),%eax
10c0e9: 31 c9 xor %ecx,%ecx
10c0eb: 3b 58 04 cmp 0x4(%eax),%ebx
10c0ee: 0f 95 c1 setne %cl
the_node->parent->child[dir] = leaf;
10c0f1: 89 54 88 04 mov %edx,0x4(%eax,%ecx,4)
/* fix coloring. leaf has moved up the tree. The color of the deleted
* node is in victim_color. There are two cases:
* 1. Deleted a red node, its child must be black. Nothing must be done.
* 2. Deleted a black node, its child must be red. Paint child black.
*/
if (victim_color == RBT_BLACK) { /* eliminate case 1 */
10c0f5: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10c0f9: 75 0b jne 10c106 <_RBTree_Extract_unprotected+0x102>
if (leaf) {
10c0fb: 85 d2 test %edx,%edx
10c0fd: 74 07 je 10c106 <_RBTree_Extract_unprotected+0x102>
leaf->color = RBT_BLACK; /* case 2 */
10c0ff: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx)
*/
RTEMS_INLINE_ROUTINE void _RBTree_Set_off_rbtree(
RBTree_Node *node
)
{
node->parent = node->child[RBT_LEFT] = node->child[RBT_RIGHT] = NULL;
10c106: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
10c10d: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
10c114: c7 03 00 00 00 00 movl $0x0,(%ebx)
/* 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;
10c11a: 8b 47 04 mov 0x4(%edi),%eax
10c11d: 85 c0 test %eax,%eax
10c11f: 74 07 je 10c128 <_RBTree_Extract_unprotected+0x124>
10c121: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
}
10c128: 8d 65 f4 lea -0xc(%ebp),%esp
10c12b: 5b pop %ebx
10c12c: 5e pop %esi
10c12d: 5f pop %edi
10c12e: 5d pop %ebp
10c12f: c3 ret
0010cb1c <_RBTree_Initialize>:
void *starting_address,
size_t number_nodes,
size_t node_size,
bool is_unique
)
{
10cb1c: 55 push %ebp
10cb1d: 89 e5 mov %esp,%ebp
10cb1f: 57 push %edi
10cb20: 56 push %esi
10cb21: 53 push %ebx
10cb22: 83 ec 0c sub $0xc,%esp
10cb25: 8b 5d 08 mov 0x8(%ebp),%ebx
10cb28: 8b 75 14 mov 0x14(%ebp),%esi
10cb2b: 8b 45 1c mov 0x1c(%ebp),%eax
size_t count;
RBTree_Node *next;
/* TODO: Error message? */
if (!the_rbtree) return;
10cb2e: 85 db test %ebx,%ebx
10cb30: 74 3d je 10cb6f <_RBTree_Initialize+0x53><== NEVER TAKEN
RBTree_Control *the_rbtree,
RBTree_Compare_function compare_function,
bool is_unique
)
{
the_rbtree->permanent_null = NULL;
10cb32: c7 03 00 00 00 00 movl $0x0,(%ebx)
the_rbtree->root = NULL;
10cb38: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
the_rbtree->first[0] = NULL;
10cb3f: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
the_rbtree->first[1] = NULL;
10cb46: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
the_rbtree->compare_function = compare_function;
10cb4d: 8b 55 0c mov 0xc(%ebp),%edx
10cb50: 89 53 10 mov %edx,0x10(%ebx)
the_rbtree->is_unique = is_unique;
10cb53: 88 43 14 mov %al,0x14(%ebx)
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
10cb56: 8b 7d 10 mov 0x10(%ebp),%edi
while ( count-- ) {
10cb59: eb 10 jmp 10cb6b <_RBTree_Initialize+0x4f>
_RBTree_Insert_unprotected(the_rbtree, next);
10cb5b: 50 push %eax
10cb5c: 50 push %eax
10cb5d: 57 push %edi
10cb5e: 53 push %ebx
10cb5f: e8 a8 fd ff ff call 10c90c <_RBTree_Insert_unprotected>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _RBTree_Initialize(
10cb64: 03 7d 18 add 0x18(%ebp),%edi
10cb67: 4e dec %esi
10cb68: 83 c4 10 add $0x10,%esp
/* could do sanity checks here */
_RBTree_Initialize_empty(the_rbtree, compare_function, is_unique);
count = number_nodes;
next = starting_address;
while ( count-- ) {
10cb6b: 85 f6 test %esi,%esi
10cb6d: 75 ec jne 10cb5b <_RBTree_Initialize+0x3f>
_RBTree_Insert_unprotected(the_rbtree, next);
next = (RBTree_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
}
10cb6f: 8d 65 f4 lea -0xc(%ebp),%esp
10cb72: 5b pop %ebx
10cb73: 5e pop %esi
10cb74: 5f pop %edi
10cb75: 5d pop %ebp
10cb76: c3 ret
0010c194 <_RBTree_Insert_unprotected>:
*/
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
10c194: 55 push %ebp
10c195: 89 e5 mov %esp,%ebp
10c197: 57 push %edi
10c198: 56 push %esi
10c199: 53 push %ebx
10c19a: 83 ec 1c sub $0x1c,%esp
10c19d: 8b 75 08 mov 0x8(%ebp),%esi
10c1a0: 8b 5d 0c mov 0xc(%ebp),%ebx
if(!the_node) return (RBTree_Node*)-1;
10c1a3: 85 db test %ebx,%ebx
10c1a5: 0f 84 55 01 00 00 je 10c300 <_RBTree_Insert_unprotected+0x16c>
RBTree_Node *iter_node = the_rbtree->root;
10c1ab: 8b 7e 04 mov 0x4(%esi),%edi
int compare_result;
if (!iter_node) { /* special case: first node inserted */
10c1ae: 89 f9 mov %edi,%ecx
10c1b0: 85 ff test %edi,%edi
10c1b2: 75 27 jne 10c1db <_RBTree_Insert_unprotected+0x47>
the_node->color = RBT_BLACK;
10c1b4: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
the_rbtree->root = the_node;
10c1bb: 89 5e 04 mov %ebx,0x4(%esi)
the_rbtree->first[0] = the_rbtree->first[1] = the_node;
10c1be: 89 5e 0c mov %ebx,0xc(%esi)
10c1c1: 89 5e 08 mov %ebx,0x8(%esi)
the_node->parent = (RBTree_Node *) the_rbtree;
10c1c4: 89 33 mov %esi,(%ebx)
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
10c1c6: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
10c1cd: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
10c1d4: e9 37 01 00 00 jmp 10c310 <_RBTree_Insert_unprotected+0x17c>
(dir && _RBTree_Is_greater(compare_result)) ) {
the_rbtree->first[dir] = the_node;
}
break;
} else {
iter_node = iter_node->child[dir];
10c1d9: 89 f9 mov %edi,%ecx
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);
10c1db: 52 push %edx
10c1dc: 52 push %edx
10c1dd: 57 push %edi
10c1de: 53 push %ebx
10c1df: 89 4d e4 mov %ecx,-0x1c(%ebp)
10c1e2: ff 56 10 call *0x10(%esi)
if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
10c1e5: 83 c4 10 add $0x10,%esp
10c1e8: 80 7e 14 00 cmpb $0x0,0x14(%esi)
10c1ec: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c1ef: 74 08 je 10c1f9 <_RBTree_Insert_unprotected+0x65>
10c1f1: 85 c0 test %eax,%eax
10c1f3: 0f 84 17 01 00 00 je 10c310 <_RBTree_Insert_unprotected+0x17c>
return iter_node;
RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
10c1f9: 89 c2 mov %eax,%edx
10c1fb: f7 d2 not %edx
10c1fd: c1 ea 1f shr $0x1f,%edx
if (!iter_node->child[dir]) {
10c200: 8b 7c 97 04 mov 0x4(%edi,%edx,4),%edi
10c204: 85 ff test %edi,%edi
10c206: 75 d1 jne 10c1d9 <_RBTree_Insert_unprotected+0x45>
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
10c208: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
10c20f: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
the_node->color = RBT_RED;
10c216: c7 43 0c 01 00 00 00 movl $0x1,0xc(%ebx)
iter_node->child[dir] = the_node;
10c21d: 89 5c 91 04 mov %ebx,0x4(%ecx,%edx,4)
the_node->parent = iter_node;
10c221: 89 0b mov %ecx,(%ebx)
/* update min/max */
compare_result = the_rbtree->compare_function(
10c223: 50 push %eax
10c224: 50 push %eax
10c225: ff 74 96 08 pushl 0x8(%esi,%edx,4)
10c229: 53 push %ebx
10c22a: 89 55 e4 mov %edx,-0x1c(%ebp)
10c22d: ff 56 10 call *0x10(%esi)
the_node,
_RBTree_First(the_rbtree, dir)
);
if ( (!dir && _RBTree_Is_lesser(compare_result)) ||
10c230: 83 c4 10 add $0x10,%esp
10c233: 8b 55 e4 mov -0x1c(%ebp),%edx
10c236: 85 d2 test %edx,%edx
10c238: 75 0a jne 10c244 <_RBTree_Insert_unprotected+0xb0>
10c23a: 85 c0 test %eax,%eax
10c23c: 0f 89 9f 00 00 00 jns 10c2e1 <_RBTree_Insert_unprotected+0x14d>
10c242: eb 08 jmp 10c24c <_RBTree_Insert_unprotected+0xb8>
(dir && _RBTree_Is_greater(compare_result)) ) {
10c244: 85 c0 test %eax,%eax
10c246: 0f 8e 95 00 00 00 jle 10c2e1 <_RBTree_Insert_unprotected+0x14d>
the_rbtree->first[dir] = the_node;
10c24c: 89 5c 96 08 mov %ebx,0x8(%esi,%edx,4)
10c250: e9 8c 00 00 00 jmp 10c2e1 <_RBTree_Insert_unprotected+0x14d>
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
if(!(the_node->parent->parent)) return NULL;
10c255: 85 f6 test %esi,%esi
10c257: 74 1b je 10c274 <_RBTree_Insert_unprotected+0xe0><== NEVER TAKEN
if(!(the_node->parent->parent->parent)) return NULL;
10c259: 83 3e 00 cmpl $0x0,(%esi)
10c25c: 74 16 je 10c274 <_RBTree_Insert_unprotected+0xe0><== 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])
10c25e: 8b 56 04 mov 0x4(%esi),%edx
10c261: 39 d0 cmp %edx,%eax
10c263: 75 03 jne 10c268 <_RBTree_Insert_unprotected+0xd4>
return the_node->parent->child[RBT_RIGHT];
10c265: 8b 56 08 mov 0x8(%esi),%edx
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
10c268: 85 d2 test %edx,%edx
10c26a: 74 0a je 10c276 <_RBTree_Insert_unprotected+0xe2>
10c26c: 83 7a 0c 01 cmpl $0x1,0xc(%edx)
10c270: 75 04 jne 10c276 <_RBTree_Insert_unprotected+0xe2>
10c272: eb 06 jmp 10c27a <_RBTree_Insert_unprotected+0xe6>
)
{
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;
10c274: 31 d2 xor %edx,%edx <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
10c276: 31 c9 xor %ecx,%ecx
10c278: eb 05 jmp 10c27f <_RBTree_Insert_unprotected+0xeb>
10c27a: b9 01 00 00 00 mov $0x1,%ecx
while (_RBTree_Is_red(_RBTree_Parent(the_node))) {
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)) {
10c27f: 85 c9 test %ecx,%ecx
10c281: 74 17 je 10c29a <_RBTree_Insert_unprotected+0x106>
the_node->parent->color = RBT_BLACK;
10c283: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
u->color = RBT_BLACK;
10c28a: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx)
g->color = RBT_RED;
10c291: c7 46 0c 01 00 00 00 movl $0x1,0xc(%esi)
10c298: eb 45 jmp 10c2df <_RBTree_Insert_unprotected+0x14b>
the_node = g;
} else { /* if uncle is black */
RBTree_Direction dir = the_node != the_node->parent->child[0];
RBTree_Direction pdir = the_node->parent != g->child[0];
10c29a: 31 c9 xor %ecx,%ecx
10c29c: 3b 46 04 cmp 0x4(%esi),%eax
10c29f: 0f 95 c1 setne %cl
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];
10c2a2: 31 d2 xor %edx,%edx
10c2a4: 3b 58 04 cmp 0x4(%eax),%ebx
10c2a7: 0f 95 c2 setne %dl
RBTree_Direction pdir = the_node->parent != g->child[0];
/* ensure node is on the same branch direction as parent */
if (dir != pdir) {
10c2aa: 39 ca cmp %ecx,%edx
10c2ac: 74 11 je 10c2bf <_RBTree_Insert_unprotected+0x12b>
_RBTree_Rotate(the_node->parent, pdir);
10c2ae: 89 ca mov %ecx,%edx
10c2b0: 89 4d e4 mov %ecx,-0x1c(%ebp)
10c2b3: e8 98 fe ff ff call 10c150 <_RBTree_Rotate>
the_node = the_node->child[pdir];
10c2b8: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c2bb: 8b 5c 8b 04 mov 0x4(%ebx,%ecx,4),%ebx
}
the_node->parent->color = RBT_BLACK;
10c2bf: 8b 03 mov (%ebx),%eax
10c2c1: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
g->color = RBT_RED;
10c2c8: c7 46 0c 01 00 00 00 movl $0x1,0xc(%esi)
/* now rotate grandparent in the other branch direction (toward uncle) */
_RBTree_Rotate(g, (1-pdir));
10c2cf: ba 01 00 00 00 mov $0x1,%edx
10c2d4: 29 ca sub %ecx,%edx
10c2d6: 89 f0 mov %esi,%eax
10c2d8: e8 73 fe ff ff call 10c150 <_RBTree_Rotate>
10c2dd: 89 de mov %ebx,%esi
10c2df: 89 f3 mov %esi,%ebx
_ISR_Disable( level );
return_node = _RBTree_Insert_unprotected( tree, node );
_ISR_Enable( level );
return return_node;
}
10c2e1: 8b 03 mov (%ebx),%eax
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
const RBTree_Node *the_node
)
{
if (!the_node->parent->parent) return NULL;
10c2e3: 8b 30 mov (%eax),%esi
10c2e5: 85 f6 test %esi,%esi
10c2e7: 75 1c jne 10c305 <_RBTree_Insert_unprotected+0x171>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_red(
const RBTree_Node *the_node
)
{
return (the_node && the_node->color == RBT_RED);
10c2e9: 31 d2 xor %edx,%edx
RBTree_Node *u,*g;
/* note: the insert root case is handled already */
/* if the parent is black, nothing needs to be done
* otherwise may need to loop a few times */
while (_RBTree_Is_red(_RBTree_Parent(the_node))) {
10c2eb: 85 d2 test %edx,%edx
10c2ed: 0f 85 62 ff ff ff jne 10c255 <_RBTree_Insert_unprotected+0xc1>
/* 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;
10c2f3: 85 f6 test %esi,%esi
10c2f5: 75 19 jne 10c310 <_RBTree_Insert_unprotected+0x17c>
10c2f7: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
10c2fe: eb 10 jmp 10c310 <_RBTree_Insert_unprotected+0x17c>
RBTree_Node *_RBTree_Insert_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
if(!the_node) return (RBTree_Node*)-1;
10c300: 83 cf ff or $0xffffffff,%edi
10c303: eb 0b jmp 10c310 <_RBTree_Insert_unprotected+0x17c>
10c305: 31 d2 xor %edx,%edx
10c307: 83 78 0c 01 cmpl $0x1,0xc(%eax)
10c30b: 0f 94 c2 sete %dl
10c30e: eb db jmp 10c2eb <_RBTree_Insert_unprotected+0x157>
/* verify red-black properties */
_RBTree_Validate_insert_unprotected(the_node);
}
return (RBTree_Node*)0;
}
10c310: 89 f8 mov %edi,%eax
10c312: 8d 65 f4 lea -0xc(%ebp),%esp
10c315: 5b pop %ebx
10c316: 5e pop %esi
10c317: 5f pop %edi
10c318: 5d pop %ebp
10c319: c3 ret
0010c338 <_RBTree_Iterate_unprotected>:
const RBTree_Control *rbtree,
RBTree_Direction dir,
RBTree_Visitor visitor,
void *visitor_arg
)
{
10c338: 55 push %ebp
10c339: 89 e5 mov %esp,%ebp
10c33b: 57 push %edi
10c33c: 56 push %esi
10c33d: 53 push %ebx
10c33e: 83 ec 0c sub $0xc,%esp
10c341: 8b 5d 0c mov 0xc(%ebp),%ebx
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
10c344: 31 d2 xor %edx,%edx
10c346: 85 db test %ebx,%ebx
10c348: 0f 94 c2 sete %dl
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_First(
const RBTree_Control *the_rbtree,
RBTree_Direction dir
)
{
return the_rbtree->first[dir];
10c34b: 8b 45 08 mov 0x8(%ebp),%eax
10c34e: 8b 74 90 08 mov 0x8(%eax,%edx,4),%esi
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
10c352: 31 ff xor %edi,%edi
while ( !stop && current != NULL ) {
10c354: eb 1b jmp 10c371 <_RBTree_Iterate_unprotected+0x39>
stop = (*visitor)( current, dir, visitor_arg );
10c356: 50 push %eax
10c357: ff 75 14 pushl 0x14(%ebp)
10c35a: 53 push %ebx
10c35b: 56 push %esi
10c35c: 8b 55 10 mov 0x10(%ebp),%edx
10c35f: ff d2 call *%edx
10c361: 89 c7 mov %eax,%edi
current = _RBTree_Next_unprotected( current, dir );
10c363: 5a pop %edx
10c364: 59 pop %ecx
10c365: 53 push %ebx
10c366: 56 push %esi
10c367: e8 18 00 00 00 call 10c384 <_RBTree_Next_unprotected>
10c36c: 89 c6 mov %eax,%esi
10c36e: 83 c4 10 add $0x10,%esp
{
RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
bool stop = false;
while ( !stop && current != NULL ) {
10c371: 85 f6 test %esi,%esi
10c373: 74 06 je 10c37b <_RBTree_Iterate_unprotected+0x43>
10c375: 89 f8 mov %edi,%eax
10c377: fe c8 dec %al
10c379: 75 db jne 10c356 <_RBTree_Iterate_unprotected+0x1e><== ALWAYS TAKEN
stop = (*visitor)( current, dir, visitor_arg );
current = _RBTree_Next_unprotected( current, dir );
}
}
10c37b: 8d 65 f4 lea -0xc(%ebp),%esp
10c37e: 5b pop %ebx
10c37f: 5e pop %esi
10c380: 5f pop %edi
10c381: 5d pop %ebp
10c382: c3 ret
0010be83 <_RBTree_Rotate>:
RBTree_Node *the_node,
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
10be83: 85 c0 test %eax,%eax
10be85: 74 3f je 10bec6 <_RBTree_Rotate+0x43> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void _RBTree_Rotate(
RBTree_Node *the_node,
RBTree_Direction dir
)
{
10be87: 55 push %ebp
10be88: 89 e5 mov %esp,%ebp
10be8a: 56 push %esi
10be8b: 53 push %ebx
*/
RTEMS_INLINE_ROUTINE RBTree_Direction _RBTree_Opposite_direction(
RBTree_Direction the_dir
)
{
return (RBTree_Direction) !((int) the_dir);
10be8c: 31 db xor %ebx,%ebx
10be8e: 85 d2 test %edx,%edx
10be90: 0f 94 c3 sete %bl
RBTree_Direction dir
)
{
RBTree_Node *c;
if (the_node == NULL) return;
if (the_node->child[_RBTree_Opposite_direction(dir)] == NULL) return;
10be93: 8b 4c 98 04 mov 0x4(%eax,%ebx,4),%ecx
10be97: 85 c9 test %ecx,%ecx
10be99: 74 28 je 10bec3 <_RBTree_Rotate+0x40> <== NEVER TAKEN
c = the_node->child[_RBTree_Opposite_direction(dir)];
the_node->child[_RBTree_Opposite_direction(dir)] = c->child[dir];
10be9b: 8b 74 91 04 mov 0x4(%ecx,%edx,4),%esi
10be9f: 89 74 98 04 mov %esi,0x4(%eax,%ebx,4)
if (c->child[dir])
10bea3: 8b 5c 91 04 mov 0x4(%ecx,%edx,4),%ebx
10bea7: 85 db test %ebx,%ebx
10bea9: 74 02 je 10bead <_RBTree_Rotate+0x2a>
c->child[dir]->parent = the_node;
10beab: 89 03 mov %eax,(%ebx)
c->child[dir] = the_node;
10bead: 89 44 91 04 mov %eax,0x4(%ecx,%edx,4)
the_node->parent->child[the_node != the_node->parent->child[0]] = c;
10beb1: 8b 10 mov (%eax),%edx
10beb3: 31 db xor %ebx,%ebx
10beb5: 3b 42 04 cmp 0x4(%edx),%eax
10beb8: 0f 95 c3 setne %bl
10bebb: 89 4c 9a 04 mov %ecx,0x4(%edx,%ebx,4)
c->parent = the_node->parent;
10bebf: 89 11 mov %edx,(%ecx)
the_node->parent = c;
10bec1: 89 08 mov %ecx,(%eax)
}
10bec3: 5b pop %ebx
10bec4: 5e pop %esi
10bec5: 5d pop %ebp
10bec6: c3 ret
0010be5f <_RBTree_Sibling>:
* exists, and NULL if not.
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
10be5f: 55 push %ebp
10be60: 89 e5 mov %esp,%ebp
if(!the_node) return NULL;
10be62: 85 c0 test %eax,%eax
10be64: 74 17 je 10be7d <_RBTree_Sibling+0x1e> <== NEVER TAKEN
if(!(the_node->parent)) return NULL;
10be66: 8b 08 mov (%eax),%ecx
10be68: 85 c9 test %ecx,%ecx
10be6a: 74 11 je 10be7d <_RBTree_Sibling+0x1e> <== NEVER TAKEN
if(!(the_node->parent->parent)) return NULL;
10be6c: 83 39 00 cmpl $0x0,(%ecx)
10be6f: 74 0c je 10be7d <_RBTree_Sibling+0x1e>
if(the_node == the_node->parent->child[RBT_LEFT])
10be71: 8b 51 04 mov 0x4(%ecx),%edx
10be74: 39 d0 cmp %edx,%eax
10be76: 75 07 jne 10be7f <_RBTree_Sibling+0x20>
return the_node->parent->child[RBT_RIGHT];
10be78: 8b 51 08 mov 0x8(%ecx),%edx
10be7b: eb 02 jmp 10be7f <_RBTree_Sibling+0x20>
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
10be7d: 31 d2 xor %edx,%edx
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
else
return the_node->parent->child[RBT_LEFT];
}
10be7f: 89 d0 mov %edx,%eax
10be81: 5d pop %ebp
10be82: c3 ret
0012dbb8 <_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
)
{
12dbb8: 55 push %ebp
12dbb9: 89 e5 mov %esp,%ebp
12dbbb: 57 push %edi
12dbbc: 56 push %esi
12dbbd: 53 push %ebx
12dbbe: 83 ec 28 sub $0x28,%esp
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
Timestamp_Control uptime;
#endif
Thread_Control *owning_thread = the_period->owner;
12dbc1: 8b 45 08 mov 0x8(%ebp),%eax
12dbc4: 8b 78 40 mov 0x40(%eax),%edi
/*
* Determine elapsed wall time since period initiated.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_TOD_Get_uptime( &uptime );
12dbc7: 8d 45 e0 lea -0x20(%ebp),%eax
12dbca: 50 push %eax
12dbcb: e8 e4 30 fe ff call 110cb4 <_TOD_Get_uptime>
_Timestamp_Subtract(
12dbd0: 8b 45 e0 mov -0x20(%ebp),%eax
12dbd3: 8b 55 e4 mov -0x1c(%ebp),%edx
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
12dbd6: 89 c1 mov %eax,%ecx
12dbd8: 89 d3 mov %edx,%ebx
12dbda: 8b 75 08 mov 0x8(%ebp),%esi
12dbdd: 2b 4e 4c sub 0x4c(%esi),%ecx
12dbe0: 1b 5e 50 sbb 0x50(%esi),%ebx
12dbe3: 8b 75 0c mov 0xc(%ebp),%esi
12dbe6: 89 0e mov %ecx,(%esi)
12dbe8: 89 5e 04 mov %ebx,0x4(%esi)
#endif
/*
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
12dbeb: 8b 8f 80 00 00 00 mov 0x80(%edi),%ecx
12dbf1: 8b 9f 84 00 00 00 mov 0x84(%edi),%ebx
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
12dbf7: 83 c4 10 add $0x10,%esp
if (used < the_period->cpu_usage_period_initiated)
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
12dbfa: be 01 00 00 00 mov $0x1,%esi
* Determine cpu usage since period initiated.
*/
used = owning_thread->cpu_time_used;
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
12dbff: 3b 3d 04 e7 16 00 cmp 0x16e704,%edi
12dc05: 75 38 jne 12dc3f <_Rate_monotonic_Get_status+0x87>
12dc07: 2b 05 14 e7 16 00 sub 0x16e714,%eax
12dc0d: 1b 15 18 e7 16 00 sbb 0x16e718,%edx
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
12dc13: 01 c8 add %ecx,%eax
12dc15: 11 da adc %ebx,%edx
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
12dc17: 8b 75 08 mov 0x8(%ebp),%esi
12dc1a: 8b 4e 44 mov 0x44(%esi),%ecx
12dc1d: 8b 5e 48 mov 0x48(%esi),%ebx
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
12dc20: 39 da cmp %ebx,%edx
12dc22: 7c 19 jl 12dc3d <_Rate_monotonic_Get_status+0x85><== NEVER TAKEN
12dc24: 7f 04 jg 12dc2a <_Rate_monotonic_Get_status+0x72>
12dc26: 39 c8 cmp %ecx,%eax
12dc28: 72 13 jb 12dc3d <_Rate_monotonic_Get_status+0x85>
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
12dc2a: 29 c8 sub %ecx,%eax
12dc2c: 19 da sbb %ebx,%edx
12dc2e: 8b 4d 10 mov 0x10(%ebp),%ecx
12dc31: 89 01 mov %eax,(%ecx)
12dc33: 89 51 04 mov %edx,0x4(%ecx)
if (used < the_period->cpu_usage_period_initiated)
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
12dc36: be 01 00 00 00 mov $0x1,%esi
12dc3b: eb 02 jmp 12dc3f <_Rate_monotonic_Get_status+0x87>
/*
* The cpu usage info was reset while executing. Can't
* determine a status.
*/
if (_Timestamp_Less_than(&used, &the_period->cpu_usage_period_initiated))
return false;
12dc3d: 31 f6 xor %esi,%esi
return false;
*cpu_since_last_period = used - the_period->cpu_usage_period_initiated;
#endif
return true;
}
12dc3f: 89 f0 mov %esi,%eax
12dc41: 8d 65 f4 lea -0xc(%ebp),%esp
12dc44: 5b pop %ebx
12dc45: 5e pop %esi
12dc46: 5f pop %edi
12dc47: 5d pop %ebp
12dc48: c3 ret
0012dedc <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
12dedc: 55 push %ebp
12dedd: 89 e5 mov %esp,%ebp
12dedf: 53 push %ebx
12dee0: 83 ec 18 sub $0x18,%esp
/*
* 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 );
12dee3: 8d 45 f4 lea -0xc(%ebp),%eax
12dee6: 50 push %eax
12dee7: ff 75 08 pushl 0x8(%ebp)
12deea: 68 a0 ec 16 00 push $0x16eca0
12deef: e8 4c d1 fd ff call 10b040 <_Objects_Get>
switch ( location ) {
12def4: 83 c4 10 add $0x10,%esp
12def7: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
12defb: 75 6b jne 12df68 <_Rate_monotonic_Timeout+0x8c><== NEVER TAKEN
12defd: 89 c3 mov %eax,%ebx
case OBJECTS_LOCAL:
the_thread = the_period->owner;
12deff: 8b 40 40 mov 0x40(%eax),%eax
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
12df02: f6 40 11 40 testb $0x40,0x11(%eax)
12df06: 74 18 je 12df20 <_Rate_monotonic_Timeout+0x44>
12df08: 8b 53 08 mov 0x8(%ebx),%edx
12df0b: 39 50 20 cmp %edx,0x20(%eax)
12df0e: 75 10 jne 12df20 <_Rate_monotonic_Timeout+0x44>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
12df10: 51 push %ecx
12df11: 51 push %ecx
12df12: 68 f8 ff 03 10 push $0x1003fff8
12df17: 50 push %eax
12df18: e8 27 d9 fd ff call 10b844 <_Thread_Clear_state>
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
12df1d: 58 pop %eax
12df1e: eb 10 jmp 12df30 <_Rate_monotonic_Timeout+0x54>
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
12df20: 83 7b 38 01 cmpl $0x1,0x38(%ebx)
12df24: 75 2b jne 12df51 <_Rate_monotonic_Timeout+0x75>
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
12df26: c7 43 38 03 00 00 00 movl $0x3,0x38(%ebx)
_Rate_monotonic_Initiate_statistics( the_period );
12df2d: 83 ec 0c sub $0xc,%esp
12df30: 53 push %ebx
12df31: e8 b2 fd ff ff call 12dce8 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
12df36: 8b 43 3c mov 0x3c(%ebx),%eax
12df39: 89 43 1c mov %eax,0x1c(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
12df3c: 58 pop %eax
12df3d: 5a pop %edx
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
12df3e: 83 c3 10 add $0x10,%ebx
12df41: 53 push %ebx
12df42: 68 a0 e2 16 00 push $0x16e2a0
12df47: e8 20 e7 fd ff call 10c66c <_Watchdog_Insert>
12df4c: 83 c4 10 add $0x10,%esp
12df4f: eb 07 jmp 12df58 <_Rate_monotonic_Timeout+0x7c>
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
12df51: c7 43 38 04 00 00 00 movl $0x4,0x38(%ebx)
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
12df58: a1 fc e1 16 00 mov 0x16e1fc,%eax
12df5d: 48 dec %eax
12df5e: a3 fc e1 16 00 mov %eax,0x16e1fc
return _Thread_Dispatch_disable_level;
12df63: a1 fc e1 16 00 mov 0x16e1fc,%eax
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
12df68: 8b 5d fc mov -0x4(%ebp),%ebx
12df6b: c9 leave
12df6c: c3 ret
0012dc49 <_Rate_monotonic_Update_statistics>:
}
static void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
12dc49: 55 push %ebp
12dc4a: 89 e5 mov %esp,%ebp
12dc4c: 56 push %esi
12dc4d: 53 push %ebx
12dc4e: 83 ec 10 sub $0x10,%esp
12dc51: 89 c6 mov %eax,%esi
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
12dc53: ff 40 54 incl 0x54(%eax)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
12dc56: 83 78 38 04 cmpl $0x4,0x38(%eax)
12dc5a: 75 03 jne 12dc5f <_Rate_monotonic_Update_statistics+0x16>
stats->missed_count++;
12dc5c: ff 40 58 incl 0x58(%eax)
/*
* Grab status for time statistics.
*/
valid_status =
12dc5f: 50 push %eax
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
12dc60: 8d 45 e8 lea -0x18(%ebp),%eax
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
12dc63: 50 push %eax
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
12dc64: 8d 45 f0 lea -0x10(%ebp),%eax
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
12dc67: 50 push %eax
12dc68: 56 push %esi
12dc69: e8 4a ff ff ff call 12dbb8 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
12dc6e: 83 c4 10 add $0x10,%esp
12dc71: 84 c0 test %al,%al
12dc73: 74 6c je 12dce1 <_Rate_monotonic_Update_statistics+0x98>
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
12dc75: 8b 4d e8 mov -0x18(%ebp),%ecx
12dc78: 8b 5d ec mov -0x14(%ebp),%ebx
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
12dc7b: 01 4e 6c add %ecx,0x6c(%esi)
12dc7e: 11 5e 70 adc %ebx,0x70(%esi)
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
12dc81: 3b 5e 60 cmp 0x60(%esi),%ebx
12dc84: 7f 0d jg 12dc93 <_Rate_monotonic_Update_statistics+0x4a><== NEVER TAKEN
12dc86: 7c 05 jl 12dc8d <_Rate_monotonic_Update_statistics+0x44>
12dc88: 3b 4e 5c cmp 0x5c(%esi),%ecx
12dc8b: 73 06 jae 12dc93 <_Rate_monotonic_Update_statistics+0x4a>
stats->min_cpu_time = executed;
12dc8d: 89 4e 5c mov %ecx,0x5c(%esi)
12dc90: 89 5e 60 mov %ebx,0x60(%esi)
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
12dc93: 39 5e 68 cmp %ebx,0x68(%esi)
12dc96: 7f 0d jg 12dca5 <_Rate_monotonic_Update_statistics+0x5c><== NEVER TAKEN
12dc98: 7c 05 jl 12dc9f <_Rate_monotonic_Update_statistics+0x56><== NEVER TAKEN
12dc9a: 39 4e 64 cmp %ecx,0x64(%esi)
12dc9d: 73 06 jae 12dca5 <_Rate_monotonic_Update_statistics+0x5c>
stats->max_cpu_time = executed;
12dc9f: 89 4e 64 mov %ecx,0x64(%esi)
12dca2: 89 5e 68 mov %ebx,0x68(%esi)
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
12dca5: 8b 4d f0 mov -0x10(%ebp),%ecx
12dca8: 8b 5d f4 mov -0xc(%ebp),%ebx
12dcab: 01 8e 84 00 00 00 add %ecx,0x84(%esi)
12dcb1: 11 9e 88 00 00 00 adc %ebx,0x88(%esi)
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
12dcb7: 3b 5e 78 cmp 0x78(%esi),%ebx
12dcba: 7f 0d jg 12dcc9 <_Rate_monotonic_Update_statistics+0x80><== NEVER TAKEN
12dcbc: 7c 05 jl 12dcc3 <_Rate_monotonic_Update_statistics+0x7a>
12dcbe: 3b 4e 74 cmp 0x74(%esi),%ecx
12dcc1: 73 06 jae 12dcc9 <_Rate_monotonic_Update_statistics+0x80>
stats->min_wall_time = since_last_period;
12dcc3: 89 4e 74 mov %ecx,0x74(%esi)
12dcc6: 89 5e 78 mov %ebx,0x78(%esi)
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
12dcc9: 39 9e 80 00 00 00 cmp %ebx,0x80(%esi)
12dccf: 7f 10 jg 12dce1 <_Rate_monotonic_Update_statistics+0x98>
12dcd1: 7c 05 jl 12dcd8 <_Rate_monotonic_Update_statistics+0x8f><== NEVER TAKEN
12dcd3: 39 4e 7c cmp %ecx,0x7c(%esi)
12dcd6: 73 09 jae 12dce1 <_Rate_monotonic_Update_statistics+0x98>
stats->max_wall_time = since_last_period;
12dcd8: 89 4e 7c mov %ecx,0x7c(%esi)
12dcdb: 89 9e 80 00 00 00 mov %ebx,0x80(%esi)
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
12dce1: 8d 65 f8 lea -0x8(%ebp),%esp
12dce4: 5b pop %ebx
12dce5: 5e pop %esi
12dce6: 5d pop %ebp
12dce7: c3 ret
0010bcd8 <_Scheduler_CBS_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_CBS_Allocate(
Thread_Control *the_thread
)
{
10bcd8: 55 push %ebp
10bcd9: 89 e5 mov %esp,%ebp
10bcdb: 53 push %ebx
10bcdc: 83 ec 10 sub $0x10,%esp
10bcdf: 8b 5d 08 mov 0x8(%ebp),%ebx
void *sched;
Scheduler_CBS_Per_thread *schinfo;
sched = _Workspace_Allocate(sizeof(Scheduler_CBS_Per_thread));
10bce2: 6a 1c push $0x1c
10bce4: e8 a7 15 00 00 call 10d290 <_Workspace_Allocate>
if ( sched ) {
10bce9: 83 c4 10 add $0x10,%esp
10bcec: 85 c0 test %eax,%eax
10bcee: 74 16 je 10bd06 <_Scheduler_CBS_Allocate+0x2e><== NEVER TAKEN
the_thread->scheduler_info = sched;
10bcf0: 89 83 88 00 00 00 mov %eax,0x88(%ebx)
schinfo = (Scheduler_CBS_Per_thread *)(the_thread->scheduler_info);
schinfo->edf_per_thread.thread = the_thread;
10bcf6: 89 18 mov %ebx,(%eax)
schinfo->edf_per_thread.queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
10bcf8: c7 40 14 02 00 00 00 movl $0x2,0x14(%eax)
schinfo->cbs_server = NULL;
10bcff: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
}
return sched;
}
10bd06: 8b 5d fc mov -0x4(%ebp),%ebx
10bd09: c9 leave
10bd0a: c3 ret
0010d104 <_Scheduler_CBS_Budget_callout>:
Scheduler_CBS_Server **_Scheduler_CBS_Server_list;
void _Scheduler_CBS_Budget_callout(
Thread_Control *the_thread
)
{
10d104: 55 push %ebp
10d105: 89 e5 mov %esp,%ebp
10d107: 53 push %ebx
10d108: 83 ec 14 sub $0x14,%esp
10d10b: 8b 5d 08 mov 0x8(%ebp),%ebx
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;
10d10e: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax
if ( the_thread->real_priority != new_priority )
10d114: 39 43 18 cmp %eax,0x18(%ebx)
10d117: 74 03 je 10d11c <_Scheduler_CBS_Budget_callout+0x18><== NEVER TAKEN
the_thread->real_priority = new_priority;
10d119: 89 43 18 mov %eax,0x18(%ebx)
if ( the_thread->current_priority != new_priority )
10d11c: 39 43 14 cmp %eax,0x14(%ebx)
10d11f: 74 0d je 10d12e <_Scheduler_CBS_Budget_callout+0x2a><== NEVER TAKEN
_Thread_Change_priority(the_thread, new_priority, true);
10d121: 52 push %edx
10d122: 6a 01 push $0x1
10d124: 50 push %eax
10d125: 53 push %ebx
10d126: e8 b5 04 00 00 call 10d5e0 <_Thread_Change_priority>
10d12b: 83 c4 10 add $0x10,%esp
/* Invoke callback function if any. */
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
10d12e: 8b 9b 88 00 00 00 mov 0x88(%ebx),%ebx
if ( sched_info->cbs_server->cbs_budget_overrun ) {
10d134: 8b 43 18 mov 0x18(%ebx),%eax
10d137: 83 78 0c 00 cmpl $0x0,0xc(%eax)
10d13b: 74 1a je 10d157 <_Scheduler_CBS_Budget_callout+0x53>
_Scheduler_CBS_Get_server_id(
10d13d: 52 push %edx
10d13e: 52 push %edx
10d13f: 8d 55 f4 lea -0xc(%ebp),%edx
10d142: 52 push %edx
10d143: ff 30 pushl (%eax)
10d145: e8 7e ff ff ff call 10d0c8 <_Scheduler_CBS_Get_server_id>
sched_info->cbs_server->task_id,
&server_id
);
sched_info->cbs_server->cbs_budget_overrun( server_id );
10d14a: 59 pop %ecx
10d14b: 8b 43 18 mov 0x18(%ebx),%eax
10d14e: ff 75 f4 pushl -0xc(%ebp)
10d151: ff 50 0c call *0xc(%eax)
10d154: 83 c4 10 add $0x10,%esp
}
}
10d157: 8b 5d fc mov -0x4(%ebp),%ebx
10d15a: c9 leave
10d15b: c3 ret
0010cdcc <_Scheduler_CBS_Create_server>:
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
10cdcc: 55 push %ebp
10cdcd: 89 e5 mov %esp,%ebp
10cdcf: 57 push %edi
10cdd0: 56 push %esi
10cdd1: 53 push %ebx
10cdd2: 83 ec 0c sub $0xc,%esp
10cdd5: 8b 5d 08 mov 0x8(%ebp),%ebx
10cdd8: 8b 75 10 mov 0x10(%ebp),%esi
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
10cddb: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
10cddf: 7e 42 jle 10ce23 <_Scheduler_CBS_Create_server+0x57>
10cde1: 83 3b 00 cmpl $0x0,(%ebx)
10cde4: 7e 3d jle 10ce23 <_Scheduler_CBS_Create_server+0x57>
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++ ) {
10cde6: 8b 15 6c d2 12 00 mov 0x12d26c,%edx
if ( !_Scheduler_CBS_Server_list[i] )
10cdec: 8b 0d ac 19 13 00 mov 0x1319ac,%ecx
10cdf2: 31 c0 xor %eax,%eax
10cdf4: eb 07 jmp 10cdfd <_Scheduler_CBS_Create_server+0x31>
10cdf6: 83 3c 81 00 cmpl $0x0,(%ecx,%eax,4)
10cdfa: 74 35 je 10ce31 <_Scheduler_CBS_Create_server+0x65>
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++ ) {
10cdfc: 40 inc %eax
10cdfd: 39 d0 cmp %edx,%eax
10cdff: 75 f5 jne 10cdf6 <_Scheduler_CBS_Create_server+0x2a>
if ( !_Scheduler_CBS_Server_list[i] )
break;
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
10ce01: b8 e6 ff ff ff mov $0xffffffe6,%eax
10ce06: eb 53 jmp 10ce5b <_Scheduler_CBS_Create_server+0x8f>
_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;
10ce08: 8b 03 mov (%ebx),%eax
10ce0a: 8b 53 04 mov 0x4(%ebx),%edx
10ce0d: 89 41 04 mov %eax,0x4(%ecx)
10ce10: 89 51 08 mov %edx,0x8(%ecx)
the_server->task_id = -1;
10ce13: c7 01 ff ff ff ff movl $0xffffffff,(%ecx)
the_server->cbs_budget_overrun = budget_overrun_callback;
10ce19: 8b 45 0c mov 0xc(%ebp),%eax
10ce1c: 89 41 0c mov %eax,0xc(%ecx)
return SCHEDULER_CBS_OK;
10ce1f: 31 c0 xor %eax,%eax
10ce21: eb 38 jmp 10ce5b <_Scheduler_CBS_Create_server+0x8f>
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;
10ce23: b8 ee ff ff ff mov $0xffffffee,%eax
10ce28: eb 31 jmp 10ce5b <_Scheduler_CBS_Create_server+0x8f>
*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;
10ce2a: b8 ef ff ff ff mov $0xffffffef,%eax <== NOT EXECUTED
10ce2f: eb 2a jmp 10ce5b <_Scheduler_CBS_Create_server+0x8f><== NOT EXECUTED
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
10ce31: 89 06 mov %eax,(%esi)
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
10ce33: 8b 15 ac 19 13 00 mov 0x1319ac,%edx
10ce39: 8d 3c 82 lea (%edx,%eax,4),%edi
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
10ce3c: 83 ec 0c sub $0xc,%esp
10ce3f: 6a 10 push $0x10
10ce41: e8 c2 18 00 00 call 10e708 <_Workspace_Allocate>
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
10ce46: 89 07 mov %eax,(%edi)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
10ce48: 8b 16 mov (%esi),%edx
10ce4a: a1 ac 19 13 00 mov 0x1319ac,%eax
10ce4f: 8b 0c 90 mov (%eax,%edx,4),%ecx
if ( !the_server )
10ce52: 83 c4 10 add $0x10,%esp
10ce55: 85 c9 test %ecx,%ecx
10ce57: 75 af jne 10ce08 <_Scheduler_CBS_Create_server+0x3c><== ALWAYS TAKEN
10ce59: eb cf jmp 10ce2a <_Scheduler_CBS_Create_server+0x5e><== NOT EXECUTED
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
10ce5b: 8d 65 f4 lea -0xc(%ebp),%esp
10ce5e: 5b pop %ebx
10ce5f: 5e pop %esi
10ce60: 5f pop %edi
10ce61: 5d pop %ebp
10ce62: c3 ret
0010ced4 <_Scheduler_CBS_Detach_thread>:
int _Scheduler_CBS_Detach_thread (
Scheduler_CBS_Server_id server_id,
rtems_id task_id
)
{
10ced4: 55 push %ebp
10ced5: 89 e5 mov %esp,%ebp
10ced7: 57 push %edi
10ced8: 56 push %esi
10ced9: 53 push %ebx
10ceda: 83 ec 24 sub $0x24,%esp
10cedd: 8b 7d 08 mov 0x8(%ebp),%edi
10cee0: 8b 75 0c mov 0xc(%ebp),%esi
Objects_Locations location;
Thread_Control *the_thread;
Scheduler_CBS_Per_thread *sched_info;
the_thread = _Thread_Get(task_id, &location);
10cee3: 8d 45 e4 lea -0x1c(%ebp),%eax
10cee6: 50 push %eax
10cee7: 56 push %esi
10cee8: e8 03 0b 00 00 call 10d9f0 <_Thread_Get>
10ceed: 89 c3 mov %eax,%ebx
/* The routine _Thread_Get may disable dispatch and not enable again. */
if ( the_thread ) {
10ceef: 83 c4 10 add $0x10,%esp
10cef2: 85 c0 test %eax,%eax
10cef4: 74 05 je 10cefb <_Scheduler_CBS_Detach_thread+0x27>
_Thread_Enable_dispatch();
10cef6: e8 d5 0a 00 00 call 10d9d0 <_Thread_Enable_dispatch>
}
if ( server_id >= _Scheduler_CBS_Maximum_servers )
10cefb: 3b 3d 6c d2 12 00 cmp 0x12d26c,%edi
10cf01: 73 4d jae 10cf50 <_Scheduler_CBS_Detach_thread+0x7c>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !the_thread )
10cf03: 85 db test %ebx,%ebx
10cf05: 74 49 je 10cf50 <_Scheduler_CBS_Detach_thread+0x7c>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
/* Server is not valid. */
if ( !_Scheduler_CBS_Server_list[server_id] )
10cf07: a1 ac 19 13 00 mov 0x1319ac,%eax
10cf0c: 8b 04 b8 mov (%eax,%edi,4),%eax
10cf0f: 85 c0 test %eax,%eax
10cf11: 74 36 je 10cf49 <_Scheduler_CBS_Detach_thread+0x75>
return SCHEDULER_CBS_ERROR_NOSERVER;
/* Thread and server are not attached. */
if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
10cf13: 39 30 cmp %esi,(%eax)
10cf15: 75 39 jne 10cf50 <_Scheduler_CBS_Detach_thread+0x7c><== NEVER TAKEN
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
_Scheduler_CBS_Server_list[server_id]->task_id = -1;
10cf17: c7 00 ff ff ff ff movl $0xffffffff,(%eax)
sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
sched_info->cbs_server = NULL;
10cf1d: 8b 83 88 00 00 00 mov 0x88(%ebx),%eax
10cf23: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
10cf2a: 8b 83 a0 00 00 00 mov 0xa0(%ebx),%eax
10cf30: 89 43 78 mov %eax,0x78(%ebx)
the_thread->budget_callout = the_thread->Start.budget_callout;
10cf33: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax
10cf39: 89 43 7c mov %eax,0x7c(%ebx)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
10cf3c: 8a 83 9c 00 00 00 mov 0x9c(%ebx),%al
10cf42: 88 43 70 mov %al,0x70(%ebx)
return SCHEDULER_CBS_OK;
10cf45: 31 c0 xor %eax,%eax
10cf47: eb 0c jmp 10cf55 <_Scheduler_CBS_Detach_thread+0x81>
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;
10cf49: b8 e7 ff ff ff mov $0xffffffe7,%eax
10cf4e: eb 05 jmp 10cf55 <_Scheduler_CBS_Detach_thread+0x81>
if ( the_thread ) {
_Thread_Enable_dispatch();
}
if ( server_id >= _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
10cf50: b8 ee ff ff ff mov $0xffffffee,%eax
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;
}
10cf55: 8d 65 f4 lea -0xc(%ebp),%esp
10cf58: 5b pop %ebx
10cf59: 5e pop %esi
10cf5a: 5f pop %edi
10cf5b: 5d pop %ebp
10cf5c: c3 ret
0010cf98 <_Scheduler_CBS_Get_execution_time>:
int _Scheduler_CBS_Get_execution_time (
Scheduler_CBS_Server_id server_id,
time_t *exec_time,
time_t *abs_time
)
{
10cf98: 55 push %ebp
10cf99: 89 e5 mov %esp,%ebp
10cf9b: 57 push %edi
10cf9c: 56 push %esi
10cf9d: 53 push %ebx
10cf9e: 83 ec 1c sub $0x1c,%esp
10cfa1: 8b 5d 08 mov 0x8(%ebp),%ebx
10cfa4: 8b 75 0c mov 0xc(%ebp),%esi
Objects_Locations location;
Thread_Control *the_thread;
if ( server_id >= _Scheduler_CBS_Maximum_servers )
10cfa7: 3b 1d 6c d2 12 00 cmp 0x12d26c,%ebx
10cfad: 73 58 jae 10d007 <_Scheduler_CBS_Get_execution_time+0x6f>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !_Scheduler_CBS_Server_list[server_id] )
10cfaf: a1 ac 19 13 00 mov 0x1319ac,%eax
10cfb4: 8b 04 98 mov (%eax,%ebx,4),%eax
10cfb7: 85 c0 test %eax,%eax
10cfb9: 74 53 je 10d00e <_Scheduler_CBS_Get_execution_time+0x76>
return SCHEDULER_CBS_ERROR_NOSERVER;
if ( _Scheduler_CBS_Server_list[server_id]->task_id == -1 ) {
10cfbb: 8b 00 mov (%eax),%eax
10cfbd: 83 f8 ff cmp $0xffffffff,%eax
10cfc0: 75 08 jne 10cfca <_Scheduler_CBS_Get_execution_time+0x32>
*exec_time = 0;
10cfc2: c7 06 00 00 00 00 movl $0x0,(%esi)
10cfc8: eb 39 jmp 10d003 <_Scheduler_CBS_Get_execution_time+0x6b>
return SCHEDULER_CBS_OK;
}
the_thread = _Thread_Get(
10cfca: 52 push %edx
10cfcb: 52 push %edx
10cfcc: 8d 55 e4 lea -0x1c(%ebp),%edx
10cfcf: 52 push %edx
10cfd0: 50 push %eax
10cfd1: e8 1a 0a 00 00 call 10d9f0 <_Thread_Get>
10cfd6: 89 c7 mov %eax,%edi
_Scheduler_CBS_Server_list[server_id]->task_id,
&location
);
/* The routine _Thread_Get may disable dispatch and not enable again. */
if ( the_thread ) {
10cfd8: 83 c4 10 add $0x10,%esp
10cfdb: 85 c0 test %eax,%eax
10cfdd: 74 17 je 10cff6 <_Scheduler_CBS_Get_execution_time+0x5e><== NEVER TAKEN
_Thread_Enable_dispatch();
10cfdf: e8 ec 09 00 00 call 10d9d0 <_Thread_Enable_dispatch>
*exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget -
10cfe4: a1 ac 19 13 00 mov 0x1319ac,%eax
10cfe9: 8b 04 98 mov (%eax,%ebx,4),%eax
10cfec: 8b 50 08 mov 0x8(%eax),%edx
10cfef: 2b 57 74 sub 0x74(%edi),%edx
10cff2: 89 16 mov %edx,(%esi)
10cff4: eb 0d jmp 10d003 <_Scheduler_CBS_Get_execution_time+0x6b>
the_thread->cpu_time_budget;
}
else {
*exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
10cff6: a1 ac 19 13 00 mov 0x1319ac,%eax <== NOT EXECUTED
10cffb: 8b 04 98 mov (%eax,%ebx,4),%eax <== NOT EXECUTED
10cffe: 8b 40 08 mov 0x8(%eax),%eax <== NOT EXECUTED
10d001: 89 06 mov %eax,(%esi) <== NOT EXECUTED
}
return SCHEDULER_CBS_OK;
10d003: 31 c0 xor %eax,%eax
10d005: eb 0c jmp 10d013 <_Scheduler_CBS_Get_execution_time+0x7b>
{
Objects_Locations location;
Thread_Control *the_thread;
if ( server_id >= _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
10d007: b8 ee ff ff ff mov $0xffffffee,%eax
10d00c: eb 05 jmp 10d013 <_Scheduler_CBS_Get_execution_time+0x7b>
if ( !_Scheduler_CBS_Server_list[server_id] )
return SCHEDULER_CBS_ERROR_NOSERVER;
10d00e: b8 e7 ff ff ff mov $0xffffffe7,%eax
}
else {
*exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
}
return SCHEDULER_CBS_OK;
}
10d013: 8d 65 f4 lea -0xc(%ebp),%esp
10d016: 5b pop %ebx
10d017: 5e pop %esi
10d018: 5f pop %edi
10d019: 5d pop %ebp
10d01a: c3 ret
0010d058 <_Scheduler_CBS_Get_remaining_budget>:
int _Scheduler_CBS_Get_remaining_budget (
Scheduler_CBS_Server_id server_id,
time_t *remaining_budget
)
{
10d058: 55 push %ebp
10d059: 89 e5 mov %esp,%ebp
10d05b: 56 push %esi
10d05c: 53 push %ebx
10d05d: 83 ec 10 sub $0x10,%esp
10d060: 8b 45 08 mov 0x8(%ebp),%eax
10d063: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
Thread_Control *the_thread;
if ( server_id >= _Scheduler_CBS_Maximum_servers )
10d066: 3b 05 6c d2 12 00 cmp 0x12d26c,%eax
10d06c: 73 44 jae 10d0b2 <_Scheduler_CBS_Get_remaining_budget+0x5a>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
if ( !_Scheduler_CBS_Server_list[server_id] )
10d06e: 8b 15 ac 19 13 00 mov 0x1319ac,%edx
10d074: 8b 04 82 mov (%edx,%eax,4),%eax
10d077: 85 c0 test %eax,%eax
10d079: 74 3e je 10d0b9 <_Scheduler_CBS_Get_remaining_budget+0x61>
return SCHEDULER_CBS_ERROR_NOSERVER;
if ( _Scheduler_CBS_Server_list[server_id]->task_id == -1 ) {
10d07b: 8b 10 mov (%eax),%edx
10d07d: 83 fa ff cmp $0xffffffff,%edx
10d080: 75 05 jne 10d087 <_Scheduler_CBS_Get_remaining_budget+0x2f>
*remaining_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
10d082: 8b 40 08 mov 0x8(%eax),%eax
10d085: eb 1d jmp 10d0a4 <_Scheduler_CBS_Get_remaining_budget+0x4c>
return SCHEDULER_CBS_OK;
}
the_thread = _Thread_Get(
10d087: 50 push %eax
10d088: 50 push %eax
10d089: 8d 45 f4 lea -0xc(%ebp),%eax
10d08c: 50 push %eax
10d08d: 52 push %edx
10d08e: e8 5d 09 00 00 call 10d9f0 <_Thread_Get>
10d093: 89 c6 mov %eax,%esi
_Scheduler_CBS_Server_list[server_id]->task_id,
&location
);
/* The routine _Thread_Get may disable dispatch and not enable again. */
if ( the_thread ) {
10d095: 83 c4 10 add $0x10,%esp
10d098: 85 c0 test %eax,%eax
10d09a: 74 0c je 10d0a8 <_Scheduler_CBS_Get_remaining_budget+0x50><== NEVER TAKEN
_Thread_Enable_dispatch();
10d09c: e8 2f 09 00 00 call 10d9d0 <_Thread_Enable_dispatch>
*remaining_budget = the_thread->cpu_time_budget;
10d0a1: 8b 46 74 mov 0x74(%esi),%eax
10d0a4: 89 03 mov %eax,(%ebx)
10d0a6: eb 06 jmp 10d0ae <_Scheduler_CBS_Get_remaining_budget+0x56>
}
else {
*remaining_budget = 0;
10d0a8: c7 03 00 00 00 00 movl $0x0,(%ebx) <== NOT EXECUTED
}
return SCHEDULER_CBS_OK;
10d0ae: 31 c0 xor %eax,%eax
10d0b0: eb 0c jmp 10d0be <_Scheduler_CBS_Get_remaining_budget+0x66>
{
Objects_Locations location;
Thread_Control *the_thread;
if ( server_id >= _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
10d0b2: b8 ee ff ff ff mov $0xffffffee,%eax
10d0b7: eb 05 jmp 10d0be <_Scheduler_CBS_Get_remaining_budget+0x66>
if ( !_Scheduler_CBS_Server_list[server_id] )
return SCHEDULER_CBS_ERROR_NOSERVER;
10d0b9: b8 e7 ff ff ff mov $0xffffffe7,%eax
else {
*remaining_budget = 0;
}
return SCHEDULER_CBS_OK;
}
10d0be: 8d 65 f8 lea -0x8(%ebp),%esp
10d0c1: 5b pop %ebx
10d0c2: 5e pop %esi
10d0c3: 5d pop %ebp
10d0c4: c3 ret
0010d15c <_Scheduler_CBS_Initialize>:
int _Scheduler_CBS_Initialize(void)
{
10d15c: 55 push %ebp
10d15d: 89 e5 mov %esp,%ebp
10d15f: 83 ec 14 sub $0x14,%esp
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
10d162: a1 6c d2 12 00 mov 0x12d26c,%eax
10d167: c1 e0 02 shl $0x2,%eax
10d16a: 50 push %eax
10d16b: e8 98 15 00 00 call 10e708 <_Workspace_Allocate>
10d170: a3 ac 19 13 00 mov %eax,0x1319ac
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
10d175: 83 c4 10 add $0x10,%esp
10d178: 85 c0 test %eax,%eax
10d17a: 74 20 je 10d19c <_Scheduler_CBS_Initialize+0x40><== NEVER TAKEN
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
10d17c: 8b 15 6c d2 12 00 mov 0x12d26c,%edx
10d182: 31 c0 xor %eax,%eax
10d184: eb 0e jmp 10d194 <_Scheduler_CBS_Initialize+0x38>
_Scheduler_CBS_Server_list[i] = NULL;
10d186: 8b 0d ac 19 13 00 mov 0x1319ac,%ecx
10d18c: c7 04 81 00 00 00 00 movl $0x0,(%ecx,%eax,4)
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++) {
10d193: 40 inc %eax
10d194: 39 d0 cmp %edx,%eax
10d196: 75 ee jne 10d186 <_Scheduler_CBS_Initialize+0x2a>
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
10d198: 31 c0 xor %eax,%eax
10d19a: eb 05 jmp 10d1a1 <_Scheduler_CBS_Initialize+0x45>
{
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;
10d19c: b8 ef ff ff ff mov $0xffffffef,%eax <== NOT EXECUTED
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
}
10d1a1: c9 leave
10d1a2: c3 ret
0010bd0c <_Scheduler_CBS_Release_job>:
void _Scheduler_CBS_Release_job(
Thread_Control *the_thread,
uint32_t deadline
)
{
10bd0c: 55 push %ebp
10bd0d: 89 e5 mov %esp,%ebp
10bd0f: 83 ec 08 sub $0x8,%esp
10bd12: 8b 55 08 mov 0x8(%ebp),%edx
10bd15: 8b 45 0c mov 0xc(%ebp),%eax
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;
10bd18: 8b 8a 88 00 00 00 mov 0x88(%edx),%ecx
)
{
Priority_Control new_priority;
Scheduler_CBS_Per_thread *sched_info =
(Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
Scheduler_CBS_Server *serv_info =
10bd1e: 8b 49 18 mov 0x18(%ecx),%ecx
(Scheduler_CBS_Server *) sched_info->cbs_server;
if (deadline) {
10bd21: 85 c0 test %eax,%eax
10bd23: 74 22 je 10bd47 <_Scheduler_CBS_Release_job+0x3b>
/* Initializing or shifting deadline. */
if (serv_info)
10bd25: 85 c9 test %ecx,%ecx
10bd27: 74 0f je 10bd38 <_Scheduler_CBS_Release_job+0x2c>
new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
10bd29: a1 40 f5 12 00 mov 0x12f540,%eax
10bd2e: 03 41 04 add 0x4(%ecx),%eax
10bd31: 25 ff ff ff 7f and $0x7fffffff,%eax
10bd36: eb 19 jmp 10bd51 <_Scheduler_CBS_Release_job+0x45>
& ~SCHEDULER_EDF_PRIO_MSB;
else
new_priority = (_Watchdog_Ticks_since_boot + deadline)
10bd38: 8b 0d 40 f5 12 00 mov 0x12f540,%ecx
10bd3e: 01 c8 add %ecx,%eax
10bd40: 25 ff ff ff 7f and $0x7fffffff,%eax
10bd45: eb 10 jmp 10bd57 <_Scheduler_CBS_Release_job+0x4b>
& ~SCHEDULER_EDF_PRIO_MSB;
}
else {
/* Switch back to background priority. */
new_priority = the_thread->Start.initial_priority;
10bd47: 8b 82 ac 00 00 00 mov 0xac(%edx),%eax
}
/* Budget replenishment for the next job. */
if (serv_info)
10bd4d: 85 c9 test %ecx,%ecx
10bd4f: 74 06 je 10bd57 <_Scheduler_CBS_Release_job+0x4b><== NEVER TAKEN
the_thread->cpu_time_budget = serv_info->parameters.budget;
10bd51: 8b 49 08 mov 0x8(%ecx),%ecx
10bd54: 89 4a 74 mov %ecx,0x74(%edx)
the_thread->real_priority = new_priority;
10bd57: 89 42 18 mov %eax,0x18(%edx)
_Thread_Change_priority(the_thread, new_priority, true);
10bd5a: 51 push %ecx
10bd5b: 6a 01 push $0x1
10bd5d: 50 push %eax
10bd5e: 52 push %edx
10bd5f: e8 9c 03 00 00 call 10c100 <_Thread_Change_priority>
10bd64: 83 c4 10 add $0x10,%esp
}
10bd67: c9 leave
10bd68: c3 ret
0010bd6c <_Scheduler_CBS_Unblock>:
#include <rtems/score/schedulercbs.h>
void _Scheduler_CBS_Unblock(
Thread_Control *the_thread
)
{
10bd6c: 55 push %ebp
10bd6d: 89 e5 mov %esp,%ebp
10bd6f: 56 push %esi
10bd70: 53 push %ebx
10bd71: 8b 5d 08 mov 0x8(%ebp),%ebx
Scheduler_CBS_Per_thread *sched_info;
Scheduler_CBS_Server *serv_info;
Priority_Control new_priority;
_Scheduler_EDF_Enqueue(the_thread);
10bd74: 83 ec 0c sub $0xc,%esp
10bd77: 53 push %ebx
10bd78: e8 cf 00 00 00 call 10be4c <_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;
10bd7d: 8b 83 88 00 00 00 mov 0x88(%ebx),%eax
10bd83: 8b 40 18 mov 0x18(%eax),%eax
* 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) {
10bd86: 83 c4 10 add $0x10,%esp
10bd89: 85 c0 test %eax,%eax
10bd8b: 74 3d je 10bdca <_Scheduler_CBS_Unblock+0x5e>
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 -
10bd8d: 8b 4b 18 mov 0x18(%ebx),%ecx
10bd90: 8b 15 40 f5 12 00 mov 0x12f540,%edx
10bd96: 89 ce mov %ecx,%esi
10bd98: 29 d6 sub %edx,%esi
_Watchdog_Ticks_since_boot;
if ( deadline*budget_left > budget*deadline_left ) {
10bd9a: 8b 50 04 mov 0x4(%eax),%edx
10bd9d: 0f af d6 imul %esi,%edx
10bda0: 8b 40 08 mov 0x8(%eax),%eax
10bda3: 0f af 43 74 imul 0x74(%ebx),%eax
10bda7: 39 c2 cmp %eax,%edx
10bda9: 7e 1f jle 10bdca <_Scheduler_CBS_Unblock+0x5e>
/* Put late unblocked task to background until the end of period. */
new_priority = the_thread->Start.initial_priority;
10bdab: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax
if ( the_thread->real_priority != new_priority )
10bdb1: 39 c1 cmp %eax,%ecx
10bdb3: 74 03 je 10bdb8 <_Scheduler_CBS_Unblock+0x4c>
the_thread->real_priority = new_priority;
10bdb5: 89 43 18 mov %eax,0x18(%ebx)
if ( the_thread->current_priority != new_priority )
10bdb8: 39 43 14 cmp %eax,0x14(%ebx)
10bdbb: 74 0d je 10bdca <_Scheduler_CBS_Unblock+0x5e>
_Thread_Change_priority(the_thread, new_priority, true);
10bdbd: 52 push %edx
10bdbe: 6a 01 push $0x1
10bdc0: 50 push %eax
10bdc1: 53 push %ebx
10bdc2: e8 39 03 00 00 call 10c100 <_Thread_Change_priority>
10bdc7: 83 c4 10 add $0x10,%esp
10bdca: 50 push %eax
10bdcb: 50 push %eax
* 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,
10bdcc: a1 58 f9 12 00 mov 0x12f958,%eax
10bdd1: ff 70 14 pushl 0x14(%eax)
10bdd4: ff 73 14 pushl 0x14(%ebx)
10bdd7: ff 15 60 b2 12 00 call *0x12b260
10bddd: 83 c4 10 add $0x10,%esp
10bde0: 85 c0 test %eax,%eax
10bde2: 7e 1e jle 10be02 <_Scheduler_CBS_Unblock+0x96>
_Thread_Heir->current_priority)) {
_Thread_Heir = the_thread;
10bde4: 89 1d 58 f9 12 00 mov %ebx,0x12f958
if ( _Thread_Executing->is_preemptible ||
10bdea: a1 54 f9 12 00 mov 0x12f954,%eax
10bdef: 80 78 70 00 cmpb $0x0,0x70(%eax)
10bdf3: 75 06 jne 10bdfb <_Scheduler_CBS_Unblock+0x8f>
10bdf5: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10bdf9: 75 07 jne 10be02 <_Scheduler_CBS_Unblock+0x96><== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
10bdfb: c6 05 60 f9 12 00 01 movb $0x1,0x12f960
}
}
10be02: 8d 65 f8 lea -0x8(%ebp),%esp
10be05: 5b pop %ebx
10be06: 5e pop %esi
10be07: 5d pop %ebp
10be08: c3 ret
0010bcd8 <_Scheduler_EDF_Allocate>:
#include <rtems/score/wkspace.h>
void *_Scheduler_EDF_Allocate(
Thread_Control *the_thread
)
{
10bcd8: 55 push %ebp
10bcd9: 89 e5 mov %esp,%ebp
10bcdb: 53 push %ebx
10bcdc: 83 ec 10 sub $0x10,%esp
10bcdf: 8b 5d 08 mov 0x8(%ebp),%ebx
void *sched;
Scheduler_EDF_Per_thread *schinfo;
sched = _Workspace_Allocate( sizeof(Scheduler_EDF_Per_thread) );
10bce2: 6a 18 push $0x18
10bce4: e8 27 15 00 00 call 10d210 <_Workspace_Allocate>
if ( sched ) {
10bce9: 83 c4 10 add $0x10,%esp
10bcec: 85 c0 test %eax,%eax
10bcee: 74 0f je 10bcff <_Scheduler_EDF_Allocate+0x27><== NEVER TAKEN
the_thread->scheduler_info = sched;
10bcf0: 89 83 88 00 00 00 mov %eax,0x88(%ebx)
schinfo = (Scheduler_EDF_Per_thread *)(the_thread->scheduler_info);
schinfo->thread = the_thread;
10bcf6: 89 18 mov %ebx,(%eax)
schinfo->queue_state = SCHEDULER_EDF_QUEUE_STATE_NEVER_HAS_BEEN;
10bcf8: c7 40 14 02 00 00 00 movl $0x2,0x14(%eax)
}
return sched;
}
10bcff: 8b 5d fc mov -0x4(%ebp),%ebx
10bd02: c9 leave
10bd03: c3 ret
0010bea0 <_Scheduler_EDF_Unblock>:
#include <rtems/score/scheduleredf.h>
void _Scheduler_EDF_Unblock(
Thread_Control *the_thread
)
{
10bea0: 55 push %ebp
10bea1: 89 e5 mov %esp,%ebp
10bea3: 53 push %ebx
10bea4: 83 ec 10 sub $0x10,%esp
10bea7: 8b 5d 08 mov 0x8(%ebp),%ebx
_Scheduler_EDF_Enqueue(the_thread);
10beaa: 53 push %ebx
10beab: e8 94 fe ff ff call 10bd44 <_Scheduler_EDF_Enqueue>
10beb0: 58 pop %eax
10beb1: 5a pop %edx
10beb2: ff 73 14 pushl 0x14(%ebx)
* 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(
10beb5: a1 58 f9 12 00 mov 0x12f958,%eax
10beba: ff 70 14 pushl 0x14(%eax)
10bebd: ff 15 60 b2 12 00 call *0x12b260
10bec3: 83 c4 10 add $0x10,%esp
10bec6: 85 c0 test %eax,%eax
10bec8: 79 1e jns 10bee8 <_Scheduler_EDF_Unblock+0x48>
_Thread_Heir->current_priority,
the_thread->current_priority )) {
_Thread_Heir = the_thread;
10beca: 89 1d 58 f9 12 00 mov %ebx,0x12f958
if ( _Thread_Executing->is_preemptible ||
10bed0: a1 54 f9 12 00 mov 0x12f954,%eax
10bed5: 80 78 70 00 cmpb $0x0,0x70(%eax)
10bed9: 75 06 jne 10bee1 <_Scheduler_EDF_Unblock+0x41>
10bedb: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10bedf: 75 07 jne 10bee8 <_Scheduler_EDF_Unblock+0x48><== ALWAYS TAKEN
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
10bee1: c6 05 60 f9 12 00 01 movb $0x1,0x12f960
}
}
10bee8: 8b 5d fc mov -0x4(%ebp),%ebx
10beeb: c9 leave
10beec: c3 ret
0010b854 <_Scheduler_priority_Tick>:
#include <rtems/system.h>
#include <rtems/score/schedulerpriority.h>
void _Scheduler_priority_Tick( void )
{
10b854: 55 push %ebp
10b855: 89 e5 mov %esp,%ebp
10b857: 53 push %ebx
10b858: 50 push %eax
Thread_Control *executing;
executing = _Thread_Executing;
10b859: 8b 1d ec e8 12 00 mov 0x12e8ec,%ebx
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
10b85f: 80 7b 70 00 cmpb $0x0,0x70(%ebx)
10b863: 74 44 je 10b8a9 <_Scheduler_priority_Tick+0x55>
return;
if ( !_States_Is_ready( executing->current_state ) )
10b865: 83 7b 10 00 cmpl $0x0,0x10(%ebx)
10b869: 75 3e jne 10b8a9 <_Scheduler_priority_Tick+0x55>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
10b86b: 8b 43 78 mov 0x78(%ebx),%eax
10b86e: 83 f8 01 cmp $0x1,%eax
10b871: 72 36 jb 10b8a9 <_Scheduler_priority_Tick+0x55>
10b873: 83 f8 02 cmp $0x2,%eax
10b876: 76 07 jbe 10b87f <_Scheduler_priority_Tick+0x2b>
10b878: 83 f8 03 cmp $0x3,%eax
10b87b: 75 2c jne 10b8a9 <_Scheduler_priority_Tick+0x55><== NEVER TAKEN
10b87d: eb 1b jmp 10b89a <_Scheduler_priority_Tick+0x46>
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
#endif
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
10b87f: 8b 43 74 mov 0x74(%ebx),%eax
10b882: 48 dec %eax
10b883: 89 43 74 mov %eax,0x74(%ebx)
10b886: 85 c0 test %eax,%eax
10b888: 7f 1f jg 10b8a9 <_Scheduler_priority_Tick+0x55>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
10b88a: ff 15 3c a2 12 00 call *0x12a23c
* executing thread's timeslice is reset. Otherwise, the
* currently executing thread is placed at the rear of the
* FIFO for this priority and a new heir is selected.
*/
_Scheduler_Yield();
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
10b890: a1 b8 e3 12 00 mov 0x12e3b8,%eax
10b895: 89 43 74 mov %eax,0x74(%ebx)
10b898: eb 0f jmp 10b8a9 <_Scheduler_priority_Tick+0x55>
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
10b89a: ff 4b 74 decl 0x74(%ebx)
10b89d: 75 0a jne 10b8a9 <_Scheduler_priority_Tick+0x55>
(*executing->budget_callout)( executing );
10b89f: 83 ec 0c sub $0xc,%esp
10b8a2: 53 push %ebx
10b8a3: ff 53 7c call *0x7c(%ebx)
10b8a6: 83 c4 10 add $0x10,%esp
break;
#endif
}
}
10b8a9: 8b 5d fc mov -0x4(%ebp),%ebx
10b8ac: c9 leave
10b8ad: c3 ret
0010a6b8 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
10a6b8: 55 push %ebp
10a6b9: 89 e5 mov %esp,%ebp
10a6bb: 53 push %ebx
10a6bc: 8b 4d 08 mov 0x8(%ebp),%ecx
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
10a6bf: b8 40 42 0f 00 mov $0xf4240,%eax
10a6c4: 31 d2 xor %edx,%edx
10a6c6: f7 35 0c c8 12 00 divl 0x12c80c
(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;
10a6cc: 31 db xor %ebx,%ebx
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) ||
10a6ce: 85 c9 test %ecx,%ecx
10a6d0: 74 4c je 10a71e <_TOD_Validate+0x66> <== NEVER TAKEN
10a6d2: 39 41 18 cmp %eax,0x18(%ecx)
10a6d5: 73 47 jae 10a71e <_TOD_Validate+0x66>
(the_tod->ticks >= ticks_per_second) ||
10a6d7: 83 79 14 3b cmpl $0x3b,0x14(%ecx)
10a6db: 77 41 ja 10a71e <_TOD_Validate+0x66>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
10a6dd: 83 79 10 3b cmpl $0x3b,0x10(%ecx)
10a6e1: 77 3b ja 10a71e <_TOD_Validate+0x66>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
10a6e3: 83 79 0c 17 cmpl $0x17,0xc(%ecx)
10a6e7: 77 35 ja 10a71e <_TOD_Validate+0x66>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
10a6e9: 8b 51 04 mov 0x4(%ecx),%edx
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) ||
10a6ec: 85 d2 test %edx,%edx
10a6ee: 74 2e je 10a71e <_TOD_Validate+0x66> <== NEVER TAKEN
(the_tod->month == 0) ||
10a6f0: 83 fa 0c cmp $0xc,%edx
10a6f3: 77 29 ja 10a71e <_TOD_Validate+0x66>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
10a6f5: 8b 01 mov (%ecx),%eax
(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) ||
10a6f7: 3d c3 07 00 00 cmp $0x7c3,%eax
10a6fc: 76 20 jbe 10a71e <_TOD_Validate+0x66>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
10a6fe: 8b 49 08 mov 0x8(%ecx),%ecx
(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) ||
10a701: 85 c9 test %ecx,%ecx
10a703: 74 19 je 10a71e <_TOD_Validate+0x66> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
10a705: a8 03 test $0x3,%al
10a707: 75 09 jne 10a712 <_TOD_Validate+0x5a>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
10a709: 8b 04 95 b8 18 12 00 mov 0x1218b8(,%edx,4),%eax
10a710: eb 07 jmp 10a719 <_TOD_Validate+0x61>
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
10a712: 8b 04 95 84 18 12 00 mov 0x121884(,%edx,4),%eax
if ( the_tod->day > days_in_month )
10a719: 39 c1 cmp %eax,%ecx
10a71b: 0f 96 c3 setbe %bl
return false;
return true;
}
10a71e: 88 d8 mov %bl,%al
10a720: 5b pop %ebx
10a721: 5d pop %ebp
10a722: c3 ret
0010ba1c <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
10ba1c: 55 push %ebp
10ba1d: 89 e5 mov %esp,%ebp
10ba1f: 57 push %edi
10ba20: 56 push %esi
10ba21: 53 push %ebx
10ba22: 83 ec 28 sub $0x28,%esp
10ba25: 8b 7d 08 mov 0x8(%ebp),%edi
10ba28: 8b 5d 0c mov 0xc(%ebp),%ebx
10ba2b: 8a 45 10 mov 0x10(%ebp),%al
10ba2e: 88 45 e7 mov %al,-0x19(%ebp)
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
10ba31: 8b 77 10 mov 0x10(%edi),%esi
/*
* 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 );
10ba34: 57 push %edi
10ba35: e8 72 0b 00 00 call 10c5ac <_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 )
10ba3a: 83 c4 10 add $0x10,%esp
10ba3d: 39 5f 14 cmp %ebx,0x14(%edi)
10ba40: 74 0c je 10ba4e <_Thread_Change_priority+0x32>
_Thread_Set_priority( the_thread, new_priority );
10ba42: 50 push %eax
10ba43: 50 push %eax
10ba44: 53 push %ebx
10ba45: 57 push %edi
10ba46: e8 15 0b 00 00 call 10c560 <_Thread_Set_priority>
10ba4b: 83 c4 10 add $0x10,%esp
_ISR_Disable( level );
10ba4e: 9c pushf
10ba4f: fa cli
10ba50: 5b pop %ebx
/*
* 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;
10ba51: 8b 47 10 mov 0x10(%edi),%eax
if ( state != STATES_TRANSIENT ) {
10ba54: 83 f8 04 cmp $0x4,%eax
10ba57: 74 2b je 10ba84 <_Thread_Change_priority+0x68>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
10ba59: 83 e6 04 and $0x4,%esi
10ba5c: 75 08 jne 10ba66 <_Thread_Change_priority+0x4a><== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
10ba5e: 89 c2 mov %eax,%edx
10ba60: 83 e2 fb and $0xfffffffb,%edx
10ba63: 89 57 10 mov %edx,0x10(%edi)
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
10ba66: 53 push %ebx
10ba67: 9d popf
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10ba68: a9 e0 be 03 00 test $0x3bee0,%eax
10ba6d: 74 65 je 10bad4 <_Thread_Change_priority+0xb8>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
10ba6f: 89 7d 0c mov %edi,0xc(%ebp)
10ba72: 8b 47 44 mov 0x44(%edi),%eax
10ba75: 89 45 08 mov %eax,0x8(%ebp)
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
10ba78: 8d 65 f4 lea -0xc(%ebp),%esp
10ba7b: 5b pop %ebx
10ba7c: 5e pop %esi
10ba7d: 5f pop %edi
10ba7e: 5d pop %ebp
/* 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 );
10ba7f: e9 4c 0a 00 00 jmp 10c4d0 <_Thread_queue_Requeue>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
10ba84: 83 e6 04 and $0x4,%esi
10ba87: 75 26 jne 10baaf <_Thread_Change_priority+0x93><== NEVER TAKEN
* Interrupts are STILL disabled.
* We now know the thread will be in the READY state when we remove
* the TRANSIENT state. So we have to place it on the appropriate
* Ready Queue with interrupts off.
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
10ba89: c7 47 10 00 00 00 00 movl $0x0,0x10(%edi)
if ( prepend_it )
10ba90: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10ba94: 74 0c je 10baa2 <_Thread_Change_priority+0x86>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
10ba96: 83 ec 0c sub $0xc,%esp
10ba99: 57 push %edi
10ba9a: ff 15 58 a2 12 00 call *0x12a258
10baa0: eb 0a jmp 10baac <_Thread_Change_priority+0x90>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
10baa2: 83 ec 0c sub $0xc,%esp
10baa5: 57 push %edi
10baa6: ff 15 54 a2 12 00 call *0x12a254
10baac: 83 c4 10 add $0x10,%esp
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
10baaf: 53 push %ebx
10bab0: 9d popf
10bab1: fa cli
* 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();
10bab2: ff 15 38 a2 12 00 call *0x12a238
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
10bab8: a1 ec e8 12 00 mov 0x12e8ec,%eax
* 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() &&
10babd: 3b 05 f0 e8 12 00 cmp 0x12e8f0,%eax
10bac3: 74 0d je 10bad2 <_Thread_Change_priority+0xb6>
10bac5: 80 78 70 00 cmpb $0x0,0x70(%eax)
10bac9: 74 07 je 10bad2 <_Thread_Change_priority+0xb6>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
10bacb: c6 05 f8 e8 12 00 01 movb $0x1,0x12e8f8
_ISR_Enable( level );
10bad2: 53 push %ebx
10bad3: 9d popf
}
10bad4: 8d 65 f4 lea -0xc(%ebp),%esp
10bad7: 5b pop %ebx
10bad8: 5e pop %esi
10bad9: 5f pop %edi
10bada: 5d pop %ebp
10badb: c3 ret
0010bc90 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10bc90: 55 push %ebp
10bc91: 89 e5 mov %esp,%ebp
10bc93: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10bc96: 8d 45 f4 lea -0xc(%ebp),%eax
10bc99: 50 push %eax
10bc9a: ff 75 08 pushl 0x8(%ebp)
10bc9d: e8 8a 01 00 00 call 10be2c <_Thread_Get>
switch ( location ) {
10bca2: 83 c4 10 add $0x10,%esp
10bca5: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10bca9: 75 20 jne 10bccb <_Thread_Delay_ended+0x3b><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
10bcab: 52 push %edx
10bcac: 52 push %edx
10bcad: 68 18 00 00 10 push $0x10000018
10bcb2: 50 push %eax
10bcb3: e8 24 fe ff ff call 10badc <_Thread_Clear_state>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
10bcb8: a1 e4 e3 12 00 mov 0x12e3e4,%eax
10bcbd: 48 dec %eax
10bcbe: a3 e4 e3 12 00 mov %eax,0x12e3e4
return _Thread_Dispatch_disable_level;
10bcc3: a1 e4 e3 12 00 mov 0x12e3e4,%eax
10bcc8: 83 c4 10 add $0x10,%esp
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
10bccb: c9 leave
10bccc: c3 ret
0010bcd0 <_Thread_Dispatch>:
* INTERRUPT LATENCY:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
10bcd0: 55 push %ebp
10bcd1: 89 e5 mov %esp,%ebp
10bcd3: 57 push %edi
10bcd4: 56 push %esi
10bcd5: 53 push %ebx
10bcd6: 83 ec 1c sub $0x1c,%esp
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10bcd9: a1 e4 e3 12 00 mov 0x12e3e4,%eax
10bcde: 40 inc %eax
10bcdf: a3 e4 e3 12 00 mov %eax,0x12e3e4
return _Thread_Dispatch_disable_level;
10bce4: a1 e4 e3 12 00 mov 0x12e3e4,%eax
void _Thread_Disable_dispatch( void );
#else
RTEMS_INLINE_ROUTINE void _Thread_Disable_dispatch( void )
{
_Thread_Dispatch_increment_disable_level();
RTEMS_COMPILER_MEMORY_BARRIER();
10bce9: e9 f9 00 00 00 jmp 10bde7 <_Thread_Dispatch+0x117>
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
10bcee: 8b 35 f0 e8 12 00 mov 0x12e8f0,%esi
_Thread_Dispatch_necessary = false;
10bcf4: c6 05 f8 e8 12 00 00 movb $0x0,0x12e8f8
_Thread_Executing = heir;
10bcfb: 89 35 ec e8 12 00 mov %esi,0x12e8ec
/*
* 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 )
10bd01: 39 fe cmp %edi,%esi
10bd03: 75 1c jne 10bd21 <_Thread_Dispatch+0x51>
_ISR_Disable( level );
}
post_switch:
_ISR_Enable( level );
10bd05: 50 push %eax
10bd06: 9d popf
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
10bd07: a1 e4 e3 12 00 mov 0x12e3e4,%eax
10bd0c: 48 dec %eax
10bd0d: a3 e4 e3 12 00 mov %eax,0x12e3e4
return _Thread_Dispatch_disable_level;
10bd12: a1 e4 e3 12 00 mov 0x12e3e4,%eax
_Thread_Unnest_dispatch();
_API_extensions_Run_postswitch();
10bd17: e8 39 e8 ff ff call 10a555 <_API_extensions_Run_postswitch>
10bd1c: e9 e2 00 00 00 jmp 10be03 <_Thread_Dispatch+0x133>
*/
#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 )
10bd21: 83 7e 78 01 cmpl $0x1,0x78(%esi)
10bd25: 75 09 jne 10bd30 <_Thread_Dispatch+0x60>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
10bd27: 8b 15 b8 e3 12 00 mov 0x12e3b8,%edx
10bd2d: 89 56 74 mov %edx,0x74(%esi)
_ISR_Enable( level );
10bd30: 50 push %eax
10bd31: 9d popf
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
10bd32: 83 ec 0c sub $0xc,%esp
10bd35: 8d 45 e0 lea -0x20(%ebp),%eax
10bd38: 50 push %eax
10bd39: e8 06 34 00 00 call 10f144 <_TOD_Get_uptime>
_Timestamp_Subtract(
10bd3e: 8b 45 e0 mov -0x20(%ebp),%eax
10bd41: 8b 55 e4 mov -0x1c(%ebp),%edx
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
10bd44: 89 c1 mov %eax,%ecx
10bd46: 89 d3 mov %edx,%ebx
10bd48: 2b 0d fc e8 12 00 sub 0x12e8fc,%ecx
10bd4e: 1b 1d 00 e9 12 00 sbb 0x12e900,%ebx
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
10bd54: 01 8f 80 00 00 00 add %ecx,0x80(%edi)
10bd5a: 11 9f 84 00 00 00 adc %ebx,0x84(%edi)
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
10bd60: a3 fc e8 12 00 mov %eax,0x12e8fc
10bd65: 89 15 00 e9 12 00 mov %edx,0x12e900
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
10bd6b: a1 5c e4 12 00 mov 0x12e45c,%eax
10bd70: 83 c4 10 add $0x10,%esp
10bd73: 85 c0 test %eax,%eax
10bd75: 74 10 je 10bd87 <_Thread_Dispatch+0xb7> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
10bd77: 8b 10 mov (%eax),%edx
10bd79: 89 97 e0 00 00 00 mov %edx,0xe0(%edi)
*_Thread_libc_reent = heir->libc_reent;
10bd7f: 8b 96 e0 00 00 00 mov 0xe0(%esi),%edx
10bd85: 89 10 mov %edx,(%eax)
}
_User_extensions_Thread_switch( executing, heir );
10bd87: 50 push %eax
10bd88: 50 push %eax
10bd89: 56 push %esi
10bd8a: 57 push %edi
10bd8b: e8 48 0b 00 00 call 10c8d8 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
10bd90: 5a pop %edx
10bd91: 59 pop %ecx
10bd92: 8d 86 c4 00 00 00 lea 0xc4(%esi),%eax
10bd98: 50 push %eax
10bd99: 8d 87 c4 00 00 00 lea 0xc4(%edi),%eax
10bd9f: 50 push %eax
10bda0: e8 0b 0e 00 00 call 10cbb0 <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
10bda5: 83 c4 10 add $0x10,%esp
10bda8: 83 bf dc 00 00 00 00 cmpl $0x0,0xdc(%edi)
10bdaf: 74 36 je 10bde7 <_Thread_Dispatch+0x117>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Allocated_fp );
10bdb1: a1 58 e4 12 00 mov 0x12e458,%eax
10bdb6: 39 c7 cmp %eax,%edi
10bdb8: 74 2d je 10bde7 <_Thread_Dispatch+0x117>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
10bdba: 85 c0 test %eax,%eax
10bdbc: 74 11 je 10bdcf <_Thread_Dispatch+0xff>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
10bdbe: 83 ec 0c sub $0xc,%esp
10bdc1: 05 dc 00 00 00 add $0xdc,%eax
10bdc6: 50 push %eax
10bdc7: e8 18 0e 00 00 call 10cbe4 <_CPU_Context_save_fp>
10bdcc: 83 c4 10 add $0x10,%esp
_Context_Restore_fp( &executing->fp_context );
10bdcf: 83 ec 0c sub $0xc,%esp
10bdd2: 8d 87 dc 00 00 00 lea 0xdc(%edi),%eax
10bdd8: 50 push %eax
10bdd9: e8 10 0e 00 00 call 10cbee <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
10bdde: 89 3d 58 e4 12 00 mov %edi,0x12e458
10bde4: 83 c4 10 add $0x10,%esp
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
10bde7: 8b 3d ec e8 12 00 mov 0x12e8ec,%edi
_ISR_Disable( level );
10bded: 9c pushf
10bdee: fa cli
10bdef: 58 pop %eax
/*
* Now determine if we need to perform a dispatch on the current CPU.
*/
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
10bdf0: 8a 15 f8 e8 12 00 mov 0x12e8f8,%dl
10bdf6: 84 d2 test %dl,%dl
10bdf8: 0f 85 f0 fe ff ff jne 10bcee <_Thread_Dispatch+0x1e>
10bdfe: e9 02 ff ff ff jmp 10bd05 <_Thread_Dispatch+0x35>
_ISR_Enable( level );
_Thread_Unnest_dispatch();
_API_extensions_Run_postswitch();
}
10be03: 8d 65 f4 lea -0xc(%ebp),%esp
10be06: 5b pop %ebx
10be07: 5e pop %esi
10be08: 5f pop %edi
10be09: 5d pop %ebp
10be0a: c3 ret
00110d08 <_Thread_Handler>:
* Input parameters: NONE
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
110d08: 55 push %ebp
110d09: 89 e5 mov %esp,%ebp
110d0b: 53 push %ebx
110d0c: 83 ec 14 sub $0x14,%esp
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static bool doneConstructors;
bool doCons;
#endif
executing = _Thread_Executing;
110d0f: 8b 1d ec e8 12 00 mov 0x12e8ec,%ebx
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
110d15: 8b 83 a8 00 00 00 mov 0xa8(%ebx),%eax
_ISR_Set_level(level);
110d1b: 85 c0 test %eax,%eax
110d1d: 74 03 je 110d22 <_Thread_Handler+0x1a>
110d1f: fa cli
110d20: eb 01 jmp 110d23 <_Thread_Handler+0x1b>
110d22: fb sti
doCons = !doneConstructors
&& _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
if (doCons)
doneConstructors = true;
#else
doCons = !doneConstructors;
110d23: a0 d4 e0 12 00 mov 0x12e0d4,%al
110d28: 88 45 f7 mov %al,-0x9(%ebp)
doneConstructors = true;
110d2b: c6 05 d4 e0 12 00 01 movb $0x1,0x12e0d4
#endif
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
110d32: 83 bb dc 00 00 00 00 cmpl $0x0,0xdc(%ebx)
110d39: 74 24 je 110d5f <_Thread_Handler+0x57>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Allocated_fp );
110d3b: a1 58 e4 12 00 mov 0x12e458,%eax
110d40: 39 c3 cmp %eax,%ebx
110d42: 74 1b je 110d5f <_Thread_Handler+0x57>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
110d44: 85 c0 test %eax,%eax
110d46: 74 11 je 110d59 <_Thread_Handler+0x51>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
110d48: 83 ec 0c sub $0xc,%esp
110d4b: 05 dc 00 00 00 add $0xdc,%eax
110d50: 50 push %eax
110d51: e8 8e be ff ff call 10cbe4 <_CPU_Context_save_fp>
110d56: 83 c4 10 add $0x10,%esp
_Thread_Allocated_fp = executing;
110d59: 89 1d 58 e4 12 00 mov %ebx,0x12e458
/*
* Take care that 'begin' extensions get to complete before
* 'switch' extensions can run. This means must keep dispatch
* disabled until all 'begin' extensions complete.
*/
_User_extensions_Thread_begin( executing );
110d5f: 83 ec 0c sub $0xc,%esp
110d62: 53 push %ebx
110d63: e8 34 ba ff ff call 10c79c <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
110d68: e8 9f b0 ff ff call 10be0c <_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) */ {
110d6d: 83 c4 10 add $0x10,%esp
110d70: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
110d74: 75 05 jne 110d7b <_Thread_Handler+0x73>
INIT_NAME ();
110d76: e8 b1 d0 00 00 call 11de2c <__start_set_sysctl_set>
_Thread_Enable_dispatch();
#endif
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
110d7b: 8b 83 90 00 00 00 mov 0x90(%ebx),%eax
110d81: 85 c0 test %eax,%eax
110d83: 75 0b jne 110d90 <_Thread_Handler+0x88>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
110d85: 83 ec 0c sub $0xc,%esp
110d88: ff b3 98 00 00 00 pushl 0x98(%ebx)
110d8e: eb 0c jmp 110d9c <_Thread_Handler+0x94>
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
110d90: 48 dec %eax
110d91: 75 15 jne 110da8 <_Thread_Handler+0xa0> <== NEVER TAKEN
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
110d93: 83 ec 0c sub $0xc,%esp
110d96: ff b3 94 00 00 00 pushl 0x94(%ebx)
110d9c: ff 93 8c 00 00 00 call *0x8c(%ebx)
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
110da2: 89 43 28 mov %eax,0x28(%ebx)
110da5: 83 c4 10 add $0x10,%esp
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
110da8: 83 ec 0c sub $0xc,%esp
110dab: 53 push %ebx
110dac: e8 19 ba ff ff call 10c7ca <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
110db1: 83 c4 0c add $0xc,%esp
110db4: 6a 05 push $0x5
110db6: 6a 01 push $0x1
110db8: 6a 00 push $0x0
110dba: e8 0d a0 ff ff call 10adcc <_Internal_error_Occurred>
0010c0d8 <_Thread_Handler_initialization>:
*
* Output parameters: NONE
*/
void _Thread_Handler_initialization(void)
{
10c0d8: 55 push %ebp
10c0d9: 89 e5 mov %esp,%ebp
10c0db: 56 push %esi
10c0dc: 53 push %ebx
uint32_t ticks_per_timeslice =
10c0dd: 8b 1d 54 a1 12 00 mov 0x12a154,%ebx
rtems_configuration_get_ticks_per_timeslice();
uint32_t maximum_extensions =
10c0e3: 8b 35 48 a1 12 00 mov 0x12a148,%esi
rtems_configuration_get_maximum_extensions();
rtems_stack_allocate_init_hook stack_allocate_init_hook =
10c0e9: a1 64 a1 12 00 mov 0x12a164,%eax
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
_Configuration_MP_table->maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
10c0ee: 83 3d 68 a1 12 00 00 cmpl $0x0,0x12a168
10c0f5: 74 09 je 10c100 <_Thread_Handler_initialization+0x28>
10c0f7: 83 3d 6c a1 12 00 00 cmpl $0x0,0x12a16c
10c0fe: 75 0c jne 10c10c <_Thread_Handler_initialization+0x34><== ALWAYS TAKEN
rtems_configuration_get_stack_free_hook() == NULL)
_Internal_error_Occurred(
10c100: 52 push %edx
10c101: 6a 0e push $0xe
10c103: 6a 01 push $0x1
10c105: 6a 00 push $0x0
10c107: e8 c0 ec ff ff call 10adcc <_Internal_error_Occurred>
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_BAD_STACK_HOOK
);
if ( stack_allocate_init_hook != NULL )
10c10c: 85 c0 test %eax,%eax
10c10e: 74 0e je 10c11e <_Thread_Handler_initialization+0x46>
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
10c110: 83 ec 0c sub $0xc,%esp
10c113: ff 35 44 a1 12 00 pushl 0x12a144
10c119: ff d0 call *%eax
10c11b: 83 c4 10 add $0x10,%esp
_Thread_Dispatch_necessary = false;
10c11e: c6 05 f8 e8 12 00 00 movb $0x0,0x12e8f8
_Thread_Executing = NULL;
10c125: c7 05 ec e8 12 00 00 movl $0x0,0x12e8ec
10c12c: 00 00 00
_Thread_Heir = NULL;
10c12f: c7 05 f0 e8 12 00 00 movl $0x0,0x12e8f0
10c136: 00 00 00
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
10c139: c7 05 58 e4 12 00 00 movl $0x0,0x12e458
10c140: 00 00 00
#endif
_Thread_Maximum_extensions = maximum_extensions;
10c143: 89 35 60 e4 12 00 mov %esi,0x12e460
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
10c149: 89 1d b8 e3 12 00 mov %ebx,0x12e3b8
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing )
maximum_internal_threads += 1;
#endif
_Objects_Initialize_information(
10c14f: 50 push %eax
10c150: 6a 08 push $0x8
10c152: 6a 00 push $0x0
10c154: 68 f4 00 00 00 push $0xf4
10c159: 6a 01 push $0x1
10c15b: 6a 01 push $0x1
10c15d: 6a 01 push $0x1
10c15f: 68 e0 e4 12 00 push $0x12e4e0
10c164: e8 5f f1 ff ff call 10b2c8 <_Objects_Initialize_information>
10c169: 83 c4 20 add $0x20,%esp
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
10c16c: 8d 65 f8 lea -0x8(%ebp),%esp
10c16f: 5b pop %ebx
10c170: 5e pop %esi
10c171: 5d pop %ebp
10c172: c3 ret
0010beac <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
10beac: 55 push %ebp
10bead: 89 e5 mov %esp,%ebp
10beaf: 57 push %edi
10beb0: 56 push %esi
10beb1: 53 push %ebx
10beb2: 83 ec 1c sub $0x1c,%esp
10beb5: 8b 5d 0c mov 0xc(%ebp),%ebx
10beb8: 8b 4d 10 mov 0x10(%ebp),%ecx
10bebb: 8b 75 14 mov 0x14(%ebp),%esi
10bebe: 8a 55 18 mov 0x18(%ebp),%dl
10bec1: 8a 45 20 mov 0x20(%ebp),%al
10bec4: 88 45 e7 mov %al,-0x19(%ebp)
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
10bec7: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10bece: 00 00 00
10bed1: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
10bed8: 00 00 00
extensions_area = NULL;
the_thread->libc_reent = NULL;
10bedb: c7 83 e0 00 00 00 00 movl $0x0,0xe0(%ebx)
10bee2: 00 00 00
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
10bee5: 85 c9 test %ecx,%ecx
10bee7: 75 31 jne 10bf1a <_Thread_Initialize+0x6e>
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
10bee9: 57 push %edi
10beea: 57 push %edi
10beeb: 56 push %esi
10beec: 53 push %ebx
10beed: 88 55 e0 mov %dl,-0x20(%ebp)
10bef0: e8 e7 06 00 00 call 10c5dc <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
10bef5: 83 c4 10 add $0x10,%esp
10bef8: 39 f0 cmp %esi,%eax
10befa: 8a 55 e0 mov -0x20(%ebp),%dl
10befd: 0f 82 c7 01 00 00 jb 10c0ca <_Thread_Initialize+0x21e>
10bf03: 85 c0 test %eax,%eax
10bf05: 0f 84 bf 01 00 00 je 10c0ca <_Thread_Initialize+0x21e><== NEVER TAKEN
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
10bf0b: 8b 8b c0 00 00 00 mov 0xc0(%ebx),%ecx
the_thread->Start.core_allocated_stack = true;
10bf11: c6 83 b0 00 00 00 01 movb $0x1,0xb0(%ebx)
10bf18: eb 09 jmp 10bf23 <_Thread_Initialize+0x77>
} else {
stack = stack_area;
actual_stack_size = stack_size;
the_thread->Start.core_allocated_stack = false;
10bf1a: c6 83 b0 00 00 00 00 movb $0x0,0xb0(%ebx)
10bf21: 89 f0 mov %esi,%eax
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
10bf23: 89 8b b8 00 00 00 mov %ecx,0xb8(%ebx)
the_stack->size = size;
10bf29: 89 83 b4 00 00 00 mov %eax,0xb4(%ebx)
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
10bf2f: 31 ff xor %edi,%edi
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
10bf31: 84 d2 test %dl,%dl
10bf33: 74 17 je 10bf4c <_Thread_Initialize+0xa0>
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
10bf35: 83 ec 0c sub $0xc,%esp
10bf38: 6a 6c push $0x6c
10bf3a: e8 05 0c 00 00 call 10cb44 <_Workspace_Allocate>
10bf3f: 89 c7 mov %eax,%edi
if ( !fp_area )
10bf41: 83 c4 10 add $0x10,%esp
10bf44: 85 c0 test %eax,%eax
10bf46: 0f 84 2b 01 00 00 je 10c077 <_Thread_Initialize+0x1cb><== NEVER TAKEN
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
10bf4c: 89 bb dc 00 00 00 mov %edi,0xdc(%ebx)
the_thread->Start.fp_context = fp_area;
10bf52: 89 bb bc 00 00 00 mov %edi,0xbc(%ebx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10bf58: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10bf5f: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
the_watchdog->id = id;
10bf66: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
the_watchdog->user_data = user_data;
10bf6d: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10bf74: a1 60 e4 12 00 mov 0x12e460,%eax
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10bf79: 31 f6 xor %esi,%esi
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10bf7b: 85 c0 test %eax,%eax
10bf7d: 74 1d je 10bf9c <_Thread_Initialize+0xf0>
extensions_area = _Workspace_Allocate(
10bf7f: 83 ec 0c sub $0xc,%esp
10bf82: 8d 04 85 04 00 00 00 lea 0x4(,%eax,4),%eax
10bf89: 50 push %eax
10bf8a: e8 b5 0b 00 00 call 10cb44 <_Workspace_Allocate>
10bf8f: 89 c6 mov %eax,%esi
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
10bf91: 83 c4 10 add $0x10,%esp
10bf94: 85 c0 test %eax,%eax
10bf96: 0f 84 dd 00 00 00 je 10c079 <_Thread_Initialize+0x1cd><== NEVER TAKEN
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10bf9c: 89 b3 ec 00 00 00 mov %esi,0xec(%ebx)
* if they are linked to the thread. An extension user may
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
10bfa2: 85 f6 test %esi,%esi
10bfa4: 75 23 jne 10bfc9 <_Thread_Initialize+0x11d>
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
10bfa6: 8a 45 e7 mov -0x19(%ebp),%al
10bfa9: 88 83 9c 00 00 00 mov %al,0x9c(%ebx)
the_thread->Start.budget_algorithm = budget_algorithm;
10bfaf: 8b 45 24 mov 0x24(%ebp),%eax
10bfb2: 89 83 a0 00 00 00 mov %eax,0xa0(%ebx)
the_thread->Start.budget_callout = budget_callout;
10bfb8: 8b 45 28 mov 0x28(%ebp),%eax
10bfbb: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
switch ( budget_algorithm ) {
10bfc1: 83 7d 24 02 cmpl $0x2,0x24(%ebp)
10bfc5: 75 28 jne 10bfef <_Thread_Initialize+0x143>
10bfc7: eb 1e jmp 10bfe7 <_Thread_Initialize+0x13b>
* 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++ )
10bfc9: 8b 15 60 e4 12 00 mov 0x12e460,%edx
10bfcf: 31 c0 xor %eax,%eax
10bfd1: eb 0e jmp 10bfe1 <_Thread_Initialize+0x135>
the_thread->extensions[i] = NULL;
10bfd3: 8b 8b ec 00 00 00 mov 0xec(%ebx),%ecx
10bfd9: c7 04 81 00 00 00 00 movl $0x0,(%ecx,%eax,4)
* create the extension long after tasks have been created
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
10bfe0: 40 inc %eax
10bfe1: 39 d0 cmp %edx,%eax
10bfe3: 76 ee jbe 10bfd3 <_Thread_Initialize+0x127>
10bfe5: eb bf jmp 10bfa6 <_Thread_Initialize+0xfa>
case THREAD_CPU_BUDGET_ALGORITHM_NONE:
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10bfe7: a1 b8 e3 12 00 mov 0x12e3b8,%eax
10bfec: 89 43 74 mov %eax,0x74(%ebx)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
10bfef: 8b 45 2c mov 0x2c(%ebp),%eax
10bff2: 89 83 a8 00 00 00 mov %eax,0xa8(%ebx)
the_thread->current_state = STATES_DORMANT;
10bff8: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
the_thread->Wait.queue = NULL;
10bfff: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
the_thread->resource_count = 0;
10c006: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->real_priority = priority;
10c00d: 8b 45 1c mov 0x1c(%ebp),%eax
10c010: 89 43 18 mov %eax,0x18(%ebx)
the_thread->Start.initial_priority = priority;
10c013: 89 83 ac 00 00 00 mov %eax,0xac(%ebx)
*/
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.allocate( the_thread );
10c019: 83 ec 0c sub $0xc,%esp
10c01c: 53 push %ebx
10c01d: ff 15 48 a2 12 00 call *0x12a248
10c023: 89 c2 mov %eax,%edx
sched =_Scheduler_Allocate( the_thread );
if ( !sched )
10c025: 83 c4 10 add $0x10,%esp
10c028: 85 c0 test %eax,%eax
10c02a: 74 4f je 10c07b <_Thread_Initialize+0x1cf>
goto failed;
_Thread_Set_priority( the_thread, priority );
10c02c: 51 push %ecx
10c02d: 51 push %ecx
10c02e: ff 75 1c pushl 0x1c(%ebp)
10c031: 53 push %ebx
10c032: 89 45 e0 mov %eax,-0x20(%ebp)
10c035: e8 26 05 00 00 call 10c560 <_Thread_Set_priority>
static inline void _Timestamp64_implementation_Set_to_zero(
Timestamp64_Control *_time
)
{
*_time = 0;
10c03a: c7 83 80 00 00 00 00 movl $0x0,0x80(%ebx)
10c041: 00 00 00
10c044: c7 83 84 00 00 00 00 movl $0x0,0x84(%ebx)
10c04b: 00 00 00
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c04e: 0f b7 4b 08 movzwl 0x8(%ebx),%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c052: 8b 45 08 mov 0x8(%ebp),%eax
10c055: 8b 40 1c mov 0x1c(%eax),%eax
10c058: 89 1c 88 mov %ebx,(%eax,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c05b: 8b 45 30 mov 0x30(%ebp),%eax
10c05e: 89 43 0c mov %eax,0xc(%ebx)
* enabled when we get here. We want to be able to run the
* user extensions with dispatching enabled. The Allocator
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
10c061: 89 1c 24 mov %ebx,(%esp)
10c064: e8 c7 07 00 00 call 10c830 <_User_extensions_Thread_create>
if ( extension_status )
10c069: 83 c4 10 add $0x10,%esp
return true;
10c06c: b1 01 mov $0x1,%cl
* 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 )
10c06e: 84 c0 test %al,%al
10c070: 8b 55 e0 mov -0x20(%ebp),%edx
10c073: 74 06 je 10c07b <_Thread_Initialize+0x1cf>
10c075: eb 55 jmp 10c0cc <_Thread_Initialize+0x220>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10c077: 31 f6 xor %esi,%esi
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;
10c079: 31 d2 xor %edx,%edx
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
failed:
_Workspace_Free( the_thread->libc_reent );
10c07b: 83 ec 0c sub $0xc,%esp
10c07e: ff b3 e0 00 00 00 pushl 0xe0(%ebx)
10c084: 89 55 e0 mov %edx,-0x20(%ebp)
10c087: e8 d1 0a 00 00 call 10cb5d <_Workspace_Free>
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
_Workspace_Free( the_thread->API_Extensions[i] );
10c08c: 58 pop %eax
10c08d: ff b3 e4 00 00 00 pushl 0xe4(%ebx)
10c093: e8 c5 0a 00 00 call 10cb5d <_Workspace_Free>
10c098: 5a pop %edx
10c099: ff b3 e8 00 00 00 pushl 0xe8(%ebx)
10c09f: e8 b9 0a 00 00 call 10cb5d <_Workspace_Free>
_Workspace_Free( extensions_area );
10c0a4: 89 34 24 mov %esi,(%esp)
10c0a7: e8 b1 0a 00 00 call 10cb5d <_Workspace_Free>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Workspace_Free( fp_area );
10c0ac: 89 3c 24 mov %edi,(%esp)
10c0af: e8 a9 0a 00 00 call 10cb5d <_Workspace_Free>
#endif
_Workspace_Free( sched );
10c0b4: 8b 55 e0 mov -0x20(%ebp),%edx
10c0b7: 89 14 24 mov %edx,(%esp)
10c0ba: e8 9e 0a 00 00 call 10cb5d <_Workspace_Free>
_Thread_Stack_Free( the_thread );
10c0bf: 89 1c 24 mov %ebx,(%esp)
10c0c2: e8 51 05 00 00 call 10c618 <_Thread_Stack_Free>
return false;
10c0c7: 83 c4 10 add $0x10,%esp
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < stack_size )
return false; /* stack allocation failed */
10c0ca: 31 c9 xor %ecx,%ecx
_Workspace_Free( sched );
_Thread_Stack_Free( the_thread );
return false;
}
10c0cc: 88 c8 mov %cl,%al
10c0ce: 8d 65 f4 lea -0xc(%ebp),%esp
10c0d1: 5b pop %ebx
10c0d2: 5e pop %esi
10c0d3: 5f pop %edi
10c0d4: 5d pop %ebp
10c0d5: c3 ret
0010c618 <_Thread_Stack_Free>:
*/
void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
10c618: 55 push %ebp
10c619: 89 e5 mov %esp,%ebp
10c61b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_stack_free_hook stack_free_hook =
10c61e: 8b 15 6c a1 12 00 mov 0x12a16c,%edx
#if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
/*
* If the API provided the stack space, then don't free it.
*/
if ( !the_thread->Start.core_allocated_stack )
10c624: 80 b8 b0 00 00 00 00 cmpb $0x0,0xb0(%eax)
10c62b: 74 0c je 10c639 <_Thread_Stack_Free+0x21><== NEVER TAKEN
* Call ONLY the CPU table stack free hook, or the
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
(*stack_free_hook)( the_thread->Start.Initial_stack.area );
10c62d: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax
10c633: 89 45 08 mov %eax,0x8(%ebp)
}
10c636: 5d pop %ebp
* Call ONLY the CPU table stack free hook, or the
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
(*stack_free_hook)( the_thread->Start.Initial_stack.area );
10c637: ff e2 jmp *%edx
}
10c639: 5d pop %ebp <== NOT EXECUTED
10c63a: c3 ret <== NOT EXECUTED
0010c4d0 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
10c4d0: 55 push %ebp
10c4d1: 89 e5 mov %esp,%ebp
10c4d3: 57 push %edi
10c4d4: 56 push %esi
10c4d5: 53 push %ebx
10c4d6: 83 ec 1c sub $0x1c,%esp
10c4d9: 8b 5d 08 mov 0x8(%ebp),%ebx
10c4dc: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
10c4df: 85 db test %ebx,%ebx
10c4e1: 74 36 je 10c519 <_Thread_queue_Requeue+0x49><== 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 ) {
10c4e3: 83 7b 34 01 cmpl $0x1,0x34(%ebx)
10c4e7: 75 30 jne 10c519 <_Thread_queue_Requeue+0x49><== NEVER TAKEN
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
10c4e9: 9c pushf
10c4ea: fa cli
10c4eb: 5f pop %edi
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
10c4ec: f7 46 10 e0 be 03 00 testl $0x3bee0,0x10(%esi)
10c4f3: 74 22 je 10c517 <_Thread_queue_Requeue+0x47><== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10c4f5: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
10c4fc: 50 push %eax
10c4fd: 6a 01 push $0x1
10c4ff: 56 push %esi
10c500: 53 push %ebx
10c501: e8 0a 32 00 00 call 10f710 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
10c506: 83 c4 0c add $0xc,%esp
10c509: 8d 45 e4 lea -0x1c(%ebp),%eax
10c50c: 50 push %eax
10c50d: 56 push %esi
10c50e: 53 push %ebx
10c50f: e8 e4 fd ff ff call 10c2f8 <_Thread_queue_Enqueue_priority>
10c514: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10c517: 57 push %edi
10c518: 9d popf
}
}
10c519: 8d 65 f4 lea -0xc(%ebp),%esp
10c51c: 5b pop %ebx
10c51d: 5e pop %esi
10c51e: 5f pop %edi
10c51f: 5d pop %ebp
10c520: c3 ret
0010c524 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10c524: 55 push %ebp
10c525: 89 e5 mov %esp,%ebp
10c527: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10c52a: 8d 45 f4 lea -0xc(%ebp),%eax
10c52d: 50 push %eax
10c52e: ff 75 08 pushl 0x8(%ebp)
10c531: e8 f6 f8 ff ff call 10be2c <_Thread_Get>
switch ( location ) {
10c536: 83 c4 10 add $0x10,%esp
10c539: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10c53d: 75 1c jne 10c55b <_Thread_queue_Timeout+0x37><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10c53f: 83 ec 0c sub $0xc,%esp
10c542: 50 push %eax
10c543: e8 78 32 00 00 call 10f7c0 <_Thread_queue_Process_timeout>
*
* This routine decrements the thread dispatch level.
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_decrement_disable_level(void)
{
_Thread_Dispatch_disable_level--;
10c548: a1 e4 e3 12 00 mov 0x12e3e4,%eax
10c54d: 48 dec %eax
10c54e: a3 e4 e3 12 00 mov %eax,0x12e3e4
return _Thread_Dispatch_disable_level;
10c553: a1 e4 e3 12 00 mov 0x12e3e4,%eax
10c558: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10c55b: c9 leave
10c55c: c3 ret
00116732 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
116732: 55 push %ebp
116733: 89 e5 mov %esp,%ebp
116735: 57 push %edi
116736: 56 push %esi
116737: 53 push %ebx
116738: 83 ec 3c sub $0x3c,%esp
11673b: 8b 5d 08 mov 0x8(%ebp),%ebx
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
11673e: 8d 45 d0 lea -0x30(%ebp),%eax
116741: 8d 55 d4 lea -0x2c(%ebp),%edx
116744: 89 55 d0 mov %edx,-0x30(%ebp)
head->previous = NULL;
116747: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
tail->previous = head;
11674e: 89 45 d8 mov %eax,-0x28(%ebp)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
116751: 8d 75 dc lea -0x24(%ebp),%esi
116754: 8d 55 e0 lea -0x20(%ebp),%edx
116757: 89 55 dc mov %edx,-0x24(%ebp)
head->previous = NULL;
11675a: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
tail->previous = head;
116761: 89 75 e4 mov %esi,-0x1c(%ebp)
{
/*
* 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;
116764: 8d 45 d0 lea -0x30(%ebp),%eax
116767: 89 43 78 mov %eax,0x78(%ebx)
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
11676a: 8d 7b 30 lea 0x30(%ebx),%edi
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
11676d: a1 48 7f 14 00 mov 0x147f48,%eax
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
116772: 8b 53 3c mov 0x3c(%ebx),%edx
watchdogs->last_snapshot = snapshot;
116775: 89 43 3c mov %eax,0x3c(%ebx)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
116778: 51 push %ecx
116779: 56 push %esi
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
11677a: 29 d0 sub %edx,%eax
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
11677c: 50 push %eax
11677d: 57 push %edi
11677e: e8 25 38 00 00 call 119fa8 <_Watchdog_Adjust_to_chain>
116783: 6a 00 push $0x0
116785: 68 00 ca 9a 3b push $0x3b9aca00
11678a: ff 35 14 7e 14 00 pushl 0x147e14
116790: ff 35 10 7e 14 00 pushl 0x147e10
116796: e8 59 3e 01 00 call 12a5f4 <__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;
11679b: 8b 53 74 mov 0x74(%ebx),%edx
/*
* 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 ) {
11679e: 83 c4 20 add $0x20,%esp
1167a1: 39 d0 cmp %edx,%eax
1167a3: 76 15 jbe 1167ba <_Timer_server_Body+0x88>
/*
* 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 );
1167a5: 51 push %ecx
1167a6: 56 push %esi
if ( snapshot > last_snapshot ) {
/*
* This path is for normal forward movement and cases where the
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
1167a7: 89 c1 mov %eax,%ecx
1167a9: 29 d1 sub %edx,%ecx
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
1167ab: 51 push %ecx
1167ac: 8d 53 68 lea 0x68(%ebx),%edx
1167af: 52 push %edx
1167b0: 89 45 c0 mov %eax,-0x40(%ebp)
1167b3: e8 f0 37 00 00 call 119fa8 <_Watchdog_Adjust_to_chain>
1167b8: eb 14 jmp 1167ce <_Timer_server_Body+0x9c>
} else if ( snapshot < last_snapshot ) {
1167ba: 73 18 jae 1167d4 <_Timer_server_Body+0xa2>
/*
* 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 );
1167bc: 51 push %ecx
} else if ( snapshot < last_snapshot ) {
/*
* The current TOD is before the last TOD which indicates that
* TOD has been set backwards.
*/
delta = last_snapshot - snapshot;
1167bd: 29 c2 sub %eax,%edx
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
1167bf: 52 push %edx
1167c0: 6a 01 push $0x1
1167c2: 8d 53 68 lea 0x68(%ebx),%edx
1167c5: 52 push %edx
1167c6: 89 45 c0 mov %eax,-0x40(%ebp)
1167c9: e8 72 37 00 00 call 119f40 <_Watchdog_Adjust>
1167ce: 83 c4 10 add $0x10,%esp
1167d1: 8b 45 c0 mov -0x40(%ebp),%eax
}
watchdogs->last_snapshot = snapshot;
1167d4: 89 43 74 mov %eax,0x74(%ebx)
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
1167d7: 8d 4b 68 lea 0x68(%ebx),%ecx
1167da: 89 4d c4 mov %ecx,-0x3c(%ebp)
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
1167dd: 8b 43 78 mov 0x78(%ebx),%eax
1167e0: 83 ec 0c sub $0xc,%esp
1167e3: 50 push %eax
1167e4: e8 cf 07 00 00 call 116fb8 <_Chain_Get>
if ( timer == NULL ) {
1167e9: 83 c4 10 add $0x10,%esp
1167ec: 85 c0 test %eax,%eax
1167ee: 74 29 je 116819 <_Timer_server_Body+0xe7><== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
1167f0: 8b 50 38 mov 0x38(%eax),%edx <== NOT EXECUTED
1167f3: 83 fa 01 cmp $0x1,%edx <== NOT EXECUTED
1167f6: 75 09 jne 116801 <_Timer_server_Body+0xcf><== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
1167f8: 52 push %edx <== NOT EXECUTED
1167f9: 52 push %edx <== NOT EXECUTED
1167fa: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
1167fd: 50 push %eax <== NOT EXECUTED
1167fe: 57 push %edi <== NOT EXECUTED
1167ff: eb 0e jmp 11680f <_Timer_server_Body+0xdd><== NOT EXECUTED
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
116801: 83 fa 03 cmp $0x3,%edx <== NOT EXECUTED
116804: 75 d7 jne 1167dd <_Timer_server_Body+0xab><== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
116806: 51 push %ecx <== NOT EXECUTED
116807: 51 push %ecx <== NOT EXECUTED
116808: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
11680b: 50 push %eax <== NOT EXECUTED
11680c: ff 75 c4 pushl -0x3c(%ebp) <== NOT EXECUTED
11680f: e8 18 38 00 00 call 11a02c <_Watchdog_Insert> <== NOT EXECUTED
116814: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
116817: eb c4 jmp 1167dd <_Timer_server_Body+0xab><== NOT EXECUTED
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
116819: 9c pushf
11681a: fa cli
11681b: 58 pop %eax
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
11681c: 8d 55 d4 lea -0x2c(%ebp),%edx
if ( _Chain_Is_empty( insert_chain ) ) {
11681f: 39 55 d0 cmp %edx,-0x30(%ebp)
116822: 75 13 jne 116837 <_Timer_server_Body+0x105><== NEVER TAKEN
ts->insert_chain = NULL;
116824: c7 43 78 00 00 00 00 movl $0x0,0x78(%ebx)
_ISR_Enable( level );
11682b: 50 push %eax
11682c: 9d popf
11682d: 8d 7d e0 lea -0x20(%ebp),%edi
_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 ) ) {
116830: 39 7d dc cmp %edi,-0x24(%ebp)
116833: 75 09 jne 11683e <_Timer_server_Body+0x10c>
116835: eb 39 jmp 116870 <_Timer_server_Body+0x13e>
ts->insert_chain = NULL;
_ISR_Enable( level );
break;
} else {
_ISR_Enable( level );
116837: 50 push %eax <== NOT EXECUTED
116838: 9d popf <== NOT EXECUTED
116839: e9 2f ff ff ff jmp 11676d <_Timer_server_Body+0x3b><== NOT EXECUTED
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
11683e: 9c pushf
11683f: fa cli
116840: 5a pop %edx
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
116841: 8b 45 dc mov -0x24(%ebp),%eax
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
116844: 39 f8 cmp %edi,%eax
116846: 74 21 je 116869 <_Timer_server_Body+0x137>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
116848: 8b 08 mov (%eax),%ecx
head->next = new_first;
11684a: 89 4d dc mov %ecx,-0x24(%ebp)
new_first->previous = head;
11684d: 89 71 04 mov %esi,0x4(%ecx)
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
116850: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
_ISR_Enable( level );
116857: 52 push %edx
116858: 9d popf
/*
* 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 );
116859: 52 push %edx
11685a: 52 push %edx
11685b: ff 70 24 pushl 0x24(%eax)
11685e: ff 70 20 pushl 0x20(%eax)
116861: ff 50 1c call *0x1c(%eax)
}
116864: 83 c4 10 add $0x10,%esp
116867: eb d5 jmp 11683e <_Timer_server_Body+0x10c>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
116869: 52 push %edx
11686a: 9d popf
11686b: e9 f4 fe ff ff jmp 116764 <_Timer_server_Body+0x32>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
116870: c6 43 7c 00 movb $0x0,0x7c(%ebx)
116874: e8 ef fc ff ff call 116568 <_Thread_Dispatch_increment_disable_level>
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
116879: 57 push %edi
11687a: 57 push %edi
11687b: 6a 08 push $0x8
11687d: ff 33 pushl (%ebx)
11687f: e8 f8 32 00 00 call 119b7c <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
116884: 89 d8 mov %ebx,%eax
116886: e8 f2 fc ff ff call 11657d <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
11688b: 89 d8 mov %ebx,%eax
11688d: e8 31 fd ff ff call 1165c3 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
116892: e8 fd 2a 00 00 call 119394 <_Thread_Enable_dispatch>
ts->active = true;
116897: c6 43 7c 01 movb $0x1,0x7c(%ebx)
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
11689b: 8d 43 08 lea 0x8(%ebx),%eax
11689e: 89 04 24 mov %eax,(%esp)
1168a1: e8 9a 38 00 00 call 11a140 <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
1168a6: 8d 43 40 lea 0x40(%ebx),%eax
1168a9: 89 04 24 mov %eax,(%esp)
1168ac: e8 8f 38 00 00 call 11a140 <_Watchdog_Remove>
1168b1: 83 c4 10 add $0x10,%esp
1168b4: e9 ab fe ff ff jmp 116764 <_Timer_server_Body+0x32>
00116609 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
116609: 55 push %ebp
11660a: 89 e5 mov %esp,%ebp
11660c: 57 push %edi
11660d: 56 push %esi
11660e: 53 push %ebx
11660f: 83 ec 1c sub $0x1c,%esp
116612: 8b 5d 08 mov 0x8(%ebp),%ebx
116615: 8b 7d 0c mov 0xc(%ebp),%edi
if ( ts->insert_chain == NULL ) {
116618: 8b 43 78 mov 0x78(%ebx),%eax
11661b: 85 c0 test %eax,%eax
11661d: 0f 85 fa 00 00 00 jne 11671d <_Timer_server_Schedule_operation_method+0x114><== NEVER TAKEN
#if defined ( __THREAD_DO_NOT_INLINE_DISABLE_DISPATCH__ )
void _Thread_Disable_dispatch( void );
#else
RTEMS_INLINE_ROUTINE void _Thread_Disable_dispatch( void )
{
_Thread_Dispatch_increment_disable_level();
116623: e8 40 ff ff ff call 116568 <_Thread_Dispatch_increment_disable_level>
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
116628: 8b 47 38 mov 0x38(%edi),%eax
11662b: 83 f8 01 cmp $0x1,%eax
11662e: 75 61 jne 116691 <_Timer_server_Schedule_operation_method+0x88>
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
116630: 9c pushf
116631: fa cli
116632: 8f 45 e0 popl -0x20(%ebp)
snapshot = _Watchdog_Ticks_since_boot;
116635: 8b 15 48 7f 14 00 mov 0x147f48,%edx
last_snapshot = ts->Interval_watchdogs.last_snapshot;
11663b: 8b 4b 3c mov 0x3c(%ebx),%ecx
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
11663e: 8b 43 30 mov 0x30(%ebx),%eax
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
116641: 8d 73 34 lea 0x34(%ebx),%esi
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
116644: 39 f0 cmp %esi,%eax
116646: 74 19 je 116661 <_Timer_server_Schedule_operation_method+0x58>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
116648: 89 d6 mov %edx,%esi
11664a: 29 ce sub %ecx,%esi
11664c: 89 75 e4 mov %esi,-0x1c(%ebp)
delta_interval = first_watchdog->delta_interval;
11664f: 8b 70 10 mov 0x10(%eax),%esi
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
116652: 31 c9 xor %ecx,%ecx
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
116654: 3b 75 e4 cmp -0x1c(%ebp),%esi
116657: 76 05 jbe 11665e <_Timer_server_Schedule_operation_method+0x55>
delta_interval -= delta;
116659: 89 f1 mov %esi,%ecx
11665b: 2b 4d e4 sub -0x1c(%ebp),%ecx
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
11665e: 89 48 10 mov %ecx,0x10(%eax)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
116661: 89 53 3c mov %edx,0x3c(%ebx)
_ISR_Enable( level );
116664: ff 75 e0 pushl -0x20(%ebp)
116667: 9d popf
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
116668: 56 push %esi
116669: 56 push %esi
11666a: 8d 47 10 lea 0x10(%edi),%eax
11666d: 50 push %eax
11666e: 8d 43 30 lea 0x30(%ebx),%eax
116671: 50 push %eax
116672: e8 b5 39 00 00 call 11a02c <_Watchdog_Insert>
if ( !ts->active ) {
116677: 8a 43 7c mov 0x7c(%ebx),%al
11667a: 83 c4 10 add $0x10,%esp
11667d: 84 c0 test %al,%al
11667f: 0f 85 8c 00 00 00 jne 116711 <_Timer_server_Schedule_operation_method+0x108>
_Timer_server_Reset_interval_system_watchdog( ts );
116685: 89 d8 mov %ebx,%eax
116687: e8 f1 fe ff ff call 11657d <_Timer_server_Reset_interval_system_watchdog>
11668c: e9 80 00 00 00 jmp 116711 <_Timer_server_Schedule_operation_method+0x108>
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
116691: 83 f8 03 cmp $0x3,%eax
116694: 75 7b jne 116711 <_Timer_server_Schedule_operation_method+0x108>
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
116696: 9c pushf
116697: fa cli
116698: 8f 45 e0 popl -0x20(%ebp)
11669b: 6a 00 push $0x0
11669d: 68 00 ca 9a 3b push $0x3b9aca00
1166a2: ff 35 14 7e 14 00 pushl 0x147e14
1166a8: ff 35 10 7e 14 00 pushl 0x147e10
1166ae: e8 41 3f 01 00 call 12a5f4 <__divdi3>
1166b3: 83 c4 10 add $0x10,%esp
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
1166b6: 8b 53 74 mov 0x74(%ebx),%edx
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
1166b9: 8b 4b 68 mov 0x68(%ebx),%ecx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
1166bc: 8d 73 6c lea 0x6c(%ebx),%esi
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
1166bf: 39 f1 cmp %esi,%ecx
1166c1: 74 27 je 1166ea <_Timer_server_Schedule_operation_method+0xe1>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
1166c3: 8b 71 10 mov 0x10(%ecx),%esi
1166c6: 89 75 dc mov %esi,-0x24(%ebp)
if ( snapshot > last_snapshot ) {
1166c9: 39 d0 cmp %edx,%eax
1166cb: 76 15 jbe 1166e2 <_Timer_server_Schedule_operation_method+0xd9>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
1166cd: 89 c6 mov %eax,%esi
1166cf: 29 d6 sub %edx,%esi
1166d1: 89 75 e4 mov %esi,-0x1c(%ebp)
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
1166d4: 31 d2 xor %edx,%edx
if ( snapshot > last_snapshot ) {
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
1166d6: 39 75 dc cmp %esi,-0x24(%ebp)
1166d9: 76 0c jbe 1166e7 <_Timer_server_Schedule_operation_method+0xde><== NEVER TAKEN
delta_interval -= delta;
1166db: 8b 55 dc mov -0x24(%ebp),%edx
1166de: 29 f2 sub %esi,%edx
1166e0: eb 05 jmp 1166e7 <_Timer_server_Schedule_operation_method+0xde>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
1166e2: 03 55 dc add -0x24(%ebp),%edx
delta_interval += delta;
1166e5: 29 c2 sub %eax,%edx
}
first_watchdog->delta_interval = delta_interval;
1166e7: 89 51 10 mov %edx,0x10(%ecx)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
1166ea: 89 43 74 mov %eax,0x74(%ebx)
_ISR_Enable( level );
1166ed: ff 75 e0 pushl -0x20(%ebp)
1166f0: 9d popf
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
1166f1: 51 push %ecx
1166f2: 51 push %ecx
1166f3: 8d 47 10 lea 0x10(%edi),%eax
1166f6: 50 push %eax
1166f7: 8d 43 68 lea 0x68(%ebx),%eax
1166fa: 50 push %eax
1166fb: e8 2c 39 00 00 call 11a02c <_Watchdog_Insert>
if ( !ts->active ) {
116700: 8a 43 7c mov 0x7c(%ebx),%al
116703: 83 c4 10 add $0x10,%esp
116706: 84 c0 test %al,%al
116708: 75 07 jne 116711 <_Timer_server_Schedule_operation_method+0x108>
_Timer_server_Reset_tod_system_watchdog( ts );
11670a: 89 d8 mov %ebx,%eax
11670c: e8 b2 fe ff ff call 1165c3 <_Timer_server_Reset_tod_system_watchdog>
* 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 );
}
}
116711: 8d 65 f4 lea -0xc(%ebp),%esp
116714: 5b pop %ebx
116715: 5e pop %esi
116716: 5f pop %edi
116717: 5d pop %ebp
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
116718: e9 77 2c 00 00 jmp 119394 <_Thread_Enable_dispatch>
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
11671d: 8b 43 78 mov 0x78(%ebx),%eax <== NOT EXECUTED
116720: 89 7d 0c mov %edi,0xc(%ebp) <== NOT EXECUTED
116723: 89 45 08 mov %eax,0x8(%ebp) <== NOT EXECUTED
}
}
116726: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
116729: 5b pop %ebx <== NOT EXECUTED
11672a: 5e pop %esi <== NOT EXECUTED
11672b: 5f pop %edi <== NOT EXECUTED
11672c: 5d pop %ebp <== NOT EXECUTED
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
11672d: e9 62 08 00 00 jmp 116f94 <_Chain_Append> <== NOT EXECUTED
0010d974 <_Timestamp64_Divide>:
const Timestamp64_Control *_lhs,
const Timestamp64_Control *_rhs,
uint32_t *_ival_percentage,
uint32_t *_fval_percentage
)
{
10d974: 55 push %ebp
10d975: 89 e5 mov %esp,%ebp
10d977: 57 push %edi
10d978: 56 push %esi
10d979: 53 push %ebx
10d97a: 83 ec 0c sub $0xc,%esp
10d97d: 8b 55 08 mov 0x8(%ebp),%edx
Timestamp64_Control answer;
if ( *_rhs == 0 ) {
10d980: 8b 45 0c mov 0xc(%ebp),%eax
10d983: 8b 08 mov (%eax),%ecx
10d985: 8b 58 04 mov 0x4(%eax),%ebx
10d988: 89 d8 mov %ebx,%eax
10d98a: 09 c8 or %ecx,%eax
10d98c: 75 14 jne 10d9a2 <_Timestamp64_Divide+0x2e><== ALWAYS TAKEN
*_ival_percentage = 0;
10d98e: 8b 55 10 mov 0x10(%ebp),%edx <== NOT EXECUTED
10d991: c7 02 00 00 00 00 movl $0x0,(%edx) <== NOT EXECUTED
*_fval_percentage = 0;
10d997: 8b 45 14 mov 0x14(%ebp),%eax <== NOT EXECUTED
10d99a: c7 00 00 00 00 00 movl $0x0,(%eax) <== NOT EXECUTED
return;
10d9a0: eb 4c jmp 10d9ee <_Timestamp64_Divide+0x7a><== NOT EXECUTED
* This looks odd but gives the results the proper precision.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (*_lhs * 100000) / *_rhs;
10d9a2: 69 72 04 a0 86 01 00 imul $0x186a0,0x4(%edx),%esi
10d9a9: b8 a0 86 01 00 mov $0x186a0,%eax
10d9ae: f7 22 mull (%edx)
10d9b0: 01 f2 add %esi,%edx
10d9b2: 53 push %ebx
10d9b3: 51 push %ecx
10d9b4: 52 push %edx
10d9b5: 50 push %eax
10d9b6: e8 5d 10 01 00 call 11ea18 <__divdi3>
10d9bb: 83 c4 10 add $0x10,%esp
10d9be: 89 c6 mov %eax,%esi
10d9c0: 89 d7 mov %edx,%edi
*_ival_percentage = answer / 1000;
10d9c2: 6a 00 push $0x0
10d9c4: 68 e8 03 00 00 push $0x3e8
10d9c9: 52 push %edx
10d9ca: 50 push %eax
10d9cb: e8 48 10 01 00 call 11ea18 <__divdi3>
10d9d0: 83 c4 10 add $0x10,%esp
10d9d3: 8b 55 10 mov 0x10(%ebp),%edx
10d9d6: 89 02 mov %eax,(%edx)
*_fval_percentage = answer % 1000;
10d9d8: 6a 00 push $0x0
10d9da: 68 e8 03 00 00 push $0x3e8
10d9df: 57 push %edi
10d9e0: 56 push %esi
10d9e1: e8 86 11 01 00 call 11eb6c <__moddi3>
10d9e6: 83 c4 10 add $0x10,%esp
10d9e9: 8b 55 14 mov 0x14(%ebp),%edx
10d9ec: 89 02 mov %eax,(%edx)
}
10d9ee: 8d 65 f4 lea -0xc(%ebp),%esp
10d9f1: 5b pop %ebx
10d9f2: 5e pop %esi
10d9f3: 5f pop %edi
10d9f4: 5d pop %ebp
10d9f5: c3 ret
0010c6ec <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
10c6ec: 55 push %ebp
10c6ed: 89 e5 mov %esp,%ebp
10c6ef: 57 push %edi
10c6f0: 56 push %esi
10c6f1: 53 push %ebx
10c6f2: 83 ec 1c sub $0x1c,%esp
User_extensions_Control *extension;
uint32_t i;
uint32_t number_of_extensions;
User_extensions_Table *initial_extensions;
number_of_extensions = Configuration.number_of_initial_extensions;
10c6f5: a1 80 a1 12 00 mov 0x12a180,%eax
10c6fa: 89 45 e4 mov %eax,-0x1c(%ebp)
initial_extensions = Configuration.User_extension_table;
10c6fd: 8b 1d 84 a1 12 00 mov 0x12a184,%ebx
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c703: c7 05 90 e5 12 00 94 movl $0x12e594,0x12e590
10c70a: e5 12 00
head->previous = NULL;
10c70d: c7 05 94 e5 12 00 00 movl $0x0,0x12e594
10c714: 00 00 00
tail->previous = head;
10c717: c7 05 98 e5 12 00 90 movl $0x12e590,0x12e598
10c71e: e5 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c721: c7 05 e8 e3 12 00 ec movl $0x12e3ec,0x12e3e8
10c728: e3 12 00
head->previous = NULL;
10c72b: c7 05 ec e3 12 00 00 movl $0x0,0x12e3ec
10c732: 00 00 00
tail->previous = head;
10c735: c7 05 f0 e3 12 00 e8 movl $0x12e3e8,0x12e3f0
10c73c: e3 12 00
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
10c73f: 85 db test %ebx,%ebx
10c741: 74 4f je 10c792 <_User_extensions_Handler_initialization+0xa6><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
10c743: 6b f0 34 imul $0x34,%eax,%esi
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
10c746: 83 ec 0c sub $0xc,%esp
10c749: 56 push %esi
10c74a: e8 26 04 00 00 call 10cb75 <_Workspace_Allocate_or_fatal_error>
10c74f: 89 c2 mov %eax,%edx
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
10c751: 31 c0 xor %eax,%eax
10c753: 89 d7 mov %edx,%edi
10c755: 89 f1 mov %esi,%ecx
10c757: f3 aa rep stos %al,%es:(%edi)
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10c759: 83 c4 10 add $0x10,%esp
10c75c: 31 c0 xor %eax,%eax
10c75e: eb 2d jmp 10c78d <_User_extensions_Handler_initialization+0xa1>
#include <rtems/config.h>
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
10c760: 89 c6 mov %eax,%esi
10c762: c1 e6 05 shl $0x5,%esi
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
10c765: 8d 7a 14 lea 0x14(%edx),%edi
10c768: 01 de add %ebx,%esi
10c76a: b9 08 00 00 00 mov $0x8,%ecx
10c76f: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_User_extensions_Add_set( extension );
10c771: 83 ec 0c sub $0xc,%esp
10c774: 52 push %edx
10c775: 89 45 dc mov %eax,-0x24(%ebp)
10c778: 89 55 e0 mov %edx,-0x20(%ebp)
10c77b: e8 e4 30 00 00 call 10f864 <_User_extensions_Add_set>
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
10c780: 8b 55 e0 mov -0x20(%ebp),%edx
10c783: 83 c2 34 add $0x34,%edx
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10c786: 8b 45 dc mov -0x24(%ebp),%eax
10c789: 40 inc %eax
10c78a: 83 c4 10 add $0x10,%esp
10c78d: 3b 45 e4 cmp -0x1c(%ebp),%eax
10c790: 75 ce jne 10c760 <_User_extensions_Handler_initialization+0x74>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
10c792: 8d 65 f4 lea -0xc(%ebp),%esp
10c795: 5b pop %ebx
10c796: 5e pop %esi
10c797: 5f pop %edi
10c798: 5d pop %ebp
10c799: c3 ret
0010dc4c <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
10dc4c: 55 push %ebp
10dc4d: 89 e5 mov %esp,%ebp
10dc4f: 57 push %edi
10dc50: 56 push %esi
10dc51: 53 push %ebx
10dc52: 83 ec 0c sub $0xc,%esp
10dc55: 8b 75 08 mov 0x8(%ebp),%esi
10dc58: 8b 4d 0c mov 0xc(%ebp),%ecx
10dc5b: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
10dc5e: 9c pushf
10dc5f: fa cli
10dc60: 58 pop %eax
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
10dc61: 8b 16 mov (%esi),%edx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10dc63: 8d 7e 04 lea 0x4(%esi),%edi
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
10dc66: 39 fa cmp %edi,%edx
10dc68: 74 3e je 10dca8 <_Watchdog_Adjust+0x5c>
switch ( direction ) {
10dc6a: 85 c9 test %ecx,%ecx
10dc6c: 74 36 je 10dca4 <_Watchdog_Adjust+0x58>
10dc6e: 49 dec %ecx
10dc6f: 75 37 jne 10dca8 <_Watchdog_Adjust+0x5c> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
10dc71: 01 5a 10 add %ebx,0x10(%edx)
break;
10dc74: eb 32 jmp 10dca8 <_Watchdog_Adjust+0x5c>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
10dc76: 8b 16 mov (%esi),%edx
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
10dc78: 8b 4a 10 mov 0x10(%edx),%ecx
10dc7b: 39 cb cmp %ecx,%ebx
10dc7d: 73 07 jae 10dc86 <_Watchdog_Adjust+0x3a>
_Watchdog_First( header )->delta_interval -= units;
10dc7f: 29 d9 sub %ebx,%ecx
10dc81: 89 4a 10 mov %ecx,0x10(%edx)
break;
10dc84: eb 22 jmp 10dca8 <_Watchdog_Adjust+0x5c>
} else {
units -= _Watchdog_First( header )->delta_interval;
10dc86: 29 cb sub %ecx,%ebx
_Watchdog_First( header )->delta_interval = 1;
10dc88: c7 42 10 01 00 00 00 movl $0x1,0x10(%edx)
_ISR_Enable( level );
10dc8f: 50 push %eax
10dc90: 9d popf
_Watchdog_Tickle( header );
10dc91: 83 ec 0c sub $0xc,%esp
10dc94: 56 push %esi
10dc95: e8 96 01 00 00 call 10de30 <_Watchdog_Tickle>
_ISR_Disable( level );
10dc9a: 9c pushf
10dc9b: fa cli
10dc9c: 58 pop %eax
if ( _Chain_Is_empty( header ) )
10dc9d: 83 c4 10 add $0x10,%esp
10dca0: 39 3e cmp %edi,(%esi)
10dca2: 74 04 je 10dca8 <_Watchdog_Adjust+0x5c>
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
10dca4: 85 db test %ebx,%ebx
10dca6: 75 ce jne 10dc76 <_Watchdog_Adjust+0x2a> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
10dca8: 50 push %eax
10dca9: 9d popf
}
10dcaa: 8d 65 f4 lea -0xc(%ebp),%esp
10dcad: 5b pop %ebx
10dcae: 5e pop %esi
10dcaf: 5f pop %edi
10dcb0: 5d pop %ebp
10dcb1: c3 ret
0010ca18 <_Watchdog_Remove>:
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
10ca18: 55 push %ebp
10ca19: 89 e5 mov %esp,%ebp
10ca1b: 56 push %esi
10ca1c: 53 push %ebx
10ca1d: 8b 55 08 mov 0x8(%ebp),%edx
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
10ca20: 9c pushf
10ca21: fa cli
10ca22: 5e pop %esi
previous_state = the_watchdog->state;
10ca23: 8b 42 08 mov 0x8(%edx),%eax
switch ( previous_state ) {
10ca26: 83 f8 01 cmp $0x1,%eax
10ca29: 74 09 je 10ca34 <_Watchdog_Remove+0x1c>
10ca2b: 72 42 jb 10ca6f <_Watchdog_Remove+0x57>
10ca2d: 83 f8 03 cmp $0x3,%eax
10ca30: 77 3d ja 10ca6f <_Watchdog_Remove+0x57> <== NEVER TAKEN
10ca32: eb 09 jmp 10ca3d <_Watchdog_Remove+0x25>
/*
* 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;
10ca34: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
break;
10ca3b: eb 32 jmp 10ca6f <_Watchdog_Remove+0x57>
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
10ca3d: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
10ca44: 8b 0a mov (%edx),%ecx
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
10ca46: 83 39 00 cmpl $0x0,(%ecx)
10ca49: 74 06 je 10ca51 <_Watchdog_Remove+0x39>
next_watchdog->delta_interval += the_watchdog->delta_interval;
10ca4b: 8b 5a 10 mov 0x10(%edx),%ebx
10ca4e: 01 59 10 add %ebx,0x10(%ecx)
if ( _Watchdog_Sync_count )
10ca51: 8b 1d d4 e4 12 00 mov 0x12e4d4,%ebx
10ca57: 85 db test %ebx,%ebx
10ca59: 74 0c je 10ca67 <_Watchdog_Remove+0x4f>
_Watchdog_Sync_level = _ISR_Nest_level;
10ca5b: 8b 1d e8 e8 12 00 mov 0x12e8e8,%ebx
10ca61: 89 1d 74 e4 12 00 mov %ebx,0x12e474
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
10ca67: 8b 5a 04 mov 0x4(%edx),%ebx
next->previous = previous;
10ca6a: 89 59 04 mov %ebx,0x4(%ecx)
previous->next = next;
10ca6d: 89 0b mov %ecx,(%ebx)
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
10ca6f: 8b 0d d8 e4 12 00 mov 0x12e4d8,%ecx
10ca75: 89 4a 18 mov %ecx,0x18(%edx)
_ISR_Enable( level );
10ca78: 56 push %esi
10ca79: 9d popf
return( previous_state );
}
10ca7a: 5b pop %ebx
10ca7b: 5e pop %esi
10ca7c: 5d pop %ebp
10ca7d: c3 ret
00109dc4 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
109dc4: 55 push %ebp
109dc5: 89 e5 mov %esp,%ebp
109dc7: 57 push %edi
109dc8: 56 push %esi
109dc9: 53 push %ebx
109dca: 83 ec 18 sub $0x18,%esp
109dcd: 8b 75 08 mov 0x8(%ebp),%esi
109dd0: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
109dd3: 68 08 03 13 00 push $0x130308
109dd8: e8 2b 10 00 00 call 10ae08 <pthread_mutex_lock>
if (fcntl (fildes, F_GETFD) < 0) {
109ddd: 58 pop %eax
109dde: 5a pop %edx
109ddf: 6a 01 push $0x1
109de1: 56 push %esi
109de2: e8 a9 5b 00 00 call 10f990 <fcntl>
109de7: 83 c4 10 add $0x10,%esp
109dea: 85 c0 test %eax,%eax
109dec: 79 1d jns 109e0b <aio_cancel+0x47>
pthread_mutex_unlock(&aio_request_queue.mutex);
109dee: 83 ec 0c sub $0xc,%esp
109df1: 68 08 03 13 00 push $0x130308
109df6: e8 8d 10 00 00 call 10ae88 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
109dfb: e8 1c 8f 00 00 call 112d1c <__errno>
109e00: c7 00 09 00 00 00 movl $0x9,(%eax)
109e06: e9 20 01 00 00 jmp 109f2b <aio_cancel+0x167>
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
109e0b: 85 db test %ebx,%ebx
109e0d: 0f 85 bc 00 00 00 jne 109ecf <aio_cancel+0x10b>
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
109e13: 50 push %eax
109e14: 6a 00 push $0x0
109e16: 56 push %esi
109e17: 68 50 03 13 00 push $0x130350
109e1c: e8 9e 05 00 00 call 10a3bf <rtems_aio_search_fd>
109e21: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
109e23: 83 c4 10 add $0x10,%esp
109e26: 85 c0 test %eax,%eax
109e28: 75 6b jne 109e95 <aio_cancel+0xd1>
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
109e2a: 81 3d 5c 03 13 00 60 cmpl $0x130360,0x13035c
109e31: 03 13 00
109e34: 74 17 je 109e4d <aio_cancel+0x89> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
109e36: 50 push %eax
109e37: 6a 00 push $0x0
109e39: 56 push %esi
109e3a: 68 5c 03 13 00 push $0x13035c
109e3f: e8 7b 05 00 00 call 10a3bf <rtems_aio_search_fd>
109e44: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
109e46: 83 c4 10 add $0x10,%esp
109e49: 85 c0 test %eax,%eax
109e4b: 75 1a jne 109e67 <aio_cancel+0xa3>
pthread_mutex_unlock(&aio_request_queue.mutex);
109e4d: 83 ec 0c sub $0xc,%esp
109e50: 68 08 03 13 00 push $0x130308
109e55: e8 2e 10 00 00 call 10ae88 <pthread_mutex_unlock>
return AIO_ALLDONE;
109e5a: 83 c4 10 add $0x10,%esp
109e5d: bb 02 00 00 00 mov $0x2,%ebx
109e62: e9 0d 01 00 00 jmp 109f74 <aio_cancel+0x1b0>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
109e67: 83 ec 0c sub $0xc,%esp
109e6a: 50 push %eax
109e6b: e8 94 26 00 00 call 10c504 <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
109e70: 89 1c 24 mov %ebx,(%esp)
109e73: e8 d5 05 00 00 call 10a44d <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
109e78: 8d 73 1c lea 0x1c(%ebx),%esi
109e7b: 89 34 24 mov %esi,(%esp)
109e7e: e8 59 0d 00 00 call 10abdc <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
109e83: 89 34 24 mov %esi,(%esp)
109e86: e8 4d 0a 00 00 call 10a8d8 <pthread_cond_destroy>
free (r_chain);
109e8b: 89 1c 24 mov %ebx,(%esp)
109e8e: e8 c5 cc ff ff call 106b58 <free>
109e93: eb 24 jmp 109eb9 <aio_cancel+0xf5>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
109e95: 8d 70 1c lea 0x1c(%eax),%esi
109e98: 83 ec 0c sub $0xc,%esp
109e9b: 56 push %esi
109e9c: e8 67 0f 00 00 call 10ae08 <pthread_mutex_lock>
109ea1: 89 1c 24 mov %ebx,(%esp)
109ea4: e8 5b 26 00 00 call 10c504 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
109ea9: 89 1c 24 mov %ebx,(%esp)
109eac: e8 9c 05 00 00 call 10a44d <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
109eb1: 89 34 24 mov %esi,(%esp)
109eb4: e8 cf 0f 00 00 call 10ae88 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
109eb9: c7 04 24 08 03 13 00 movl $0x130308,(%esp)
109ec0: e8 c3 0f 00 00 call 10ae88 <pthread_mutex_unlock>
return AIO_CANCELED;
109ec5: 83 c4 10 add $0x10,%esp
109ec8: 31 db xor %ebx,%ebx
109eca: e9 a5 00 00 00 jmp 109f74 <aio_cancel+0x1b0>
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
109ecf: 8b 3b mov (%ebx),%edi
109ed1: 39 f7 cmp %esi,%edi
109ed3: 74 02 je 109ed7 <aio_cancel+0x113>
109ed5: eb 3c jmp 109f13 <aio_cancel+0x14f>
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);
109ed7: 50 push %eax
109ed8: 6a 00 push $0x0
109eda: 57 push %edi
109edb: 68 50 03 13 00 push $0x130350
109ee0: e8 da 04 00 00 call 10a3bf <rtems_aio_search_fd>
109ee5: 89 c6 mov %eax,%esi
if (r_chain == NULL) {
109ee7: 83 c4 10 add $0x10,%esp
109eea: 85 c0 test %eax,%eax
109eec: 75 55 jne 109f43 <aio_cancel+0x17f>
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
109eee: 81 3d 5c 03 13 00 60 cmpl $0x130360,0x13035c
109ef5: 03 13 00
109ef8: 0f 84 4f ff ff ff je 109e4d <aio_cancel+0x89> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
109efe: 56 push %esi
109eff: 6a 00 push $0x0
109f01: 57 push %edi
109f02: 68 5c 03 13 00 push $0x13035c
109f07: e8 b3 04 00 00 call 10a3bf <rtems_aio_search_fd>
if (r_chain == NULL) {
109f0c: 83 c4 10 add $0x10,%esp
109f0f: 85 c0 test %eax,%eax
109f11: 75 20 jne 109f33 <aio_cancel+0x16f>
pthread_mutex_unlock (&aio_request_queue.mutex);
109f13: 83 ec 0c sub $0xc,%esp
109f16: 68 08 03 13 00 push $0x130308
109f1b: e8 68 0f 00 00 call 10ae88 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
109f20: e8 f7 8d 00 00 call 112d1c <__errno>
109f25: c7 00 16 00 00 00 movl $0x16,(%eax)
109f2b: 83 c4 10 add $0x10,%esp
109f2e: 83 cb ff or $0xffffffff,%ebx
109f31: eb 41 jmp 109f74 <aio_cancel+0x1b0>
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
109f33: 51 push %ecx
109f34: 51 push %ecx
109f35: 53 push %ebx
109f36: 83 c0 08 add $0x8,%eax
109f39: 50 push %eax
109f3a: e8 57 05 00 00 call 10a496 <rtems_aio_remove_req>
109f3f: 89 c3 mov %eax,%ebx
109f41: eb 22 jmp 109f65 <aio_cancel+0x1a1>
return AIO_ALLDONE;
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
109f43: 8d 78 1c lea 0x1c(%eax),%edi
109f46: 83 ec 0c sub $0xc,%esp
109f49: 57 push %edi
109f4a: e8 b9 0e 00 00 call 10ae08 <pthread_mutex_lock>
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
109f4f: 58 pop %eax
109f50: 5a pop %edx
109f51: 53 push %ebx
109f52: 83 c6 08 add $0x8,%esi
109f55: 56 push %esi
109f56: e8 3b 05 00 00 call 10a496 <rtems_aio_remove_req>
109f5b: 89 c3 mov %eax,%ebx
pthread_mutex_unlock (&r_chain->mutex);
109f5d: 89 3c 24 mov %edi,(%esp)
109f60: e8 23 0f 00 00 call 10ae88 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
109f65: c7 04 24 08 03 13 00 movl $0x130308,(%esp)
109f6c: e8 17 0f 00 00 call 10ae88 <pthread_mutex_unlock>
return result;
109f71: 83 c4 10 add $0x10,%esp
}
return AIO_ALLDONE;
}
109f74: 89 d8 mov %ebx,%eax
109f76: 8d 65 f4 lea -0xc(%ebp),%esp
109f79: 5b pop %ebx
109f7a: 5e pop %esi
109f7b: 5f pop %edi
109f7c: 5d pop %ebp
109f7d: c3 ret
00109f8c <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
109f8c: 55 push %ebp
109f8d: 89 e5 mov %esp,%ebp
109f8f: 53 push %ebx
109f90: 52 push %edx
109f91: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
109f94: 81 7d 08 00 20 00 00 cmpl $0x2000,0x8(%ebp)
109f9b: 74 1b je 109fb8 <aio_fsync+0x2c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
109f9d: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
109fa4: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
109fab: e8 6c 8d 00 00 call 112d1c <__errno>
109fb0: c7 00 16 00 00 00 movl $0x16,(%eax)
109fb6: eb 74 jmp 10a02c <aio_fsync+0xa0>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
109fb8: 50 push %eax
109fb9: 50 push %eax
109fba: 6a 03 push $0x3
109fbc: ff 33 pushl (%ebx)
109fbe: e8 cd 59 00 00 call 10f990 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
109fc3: 83 e0 03 and $0x3,%eax
109fc6: 48 dec %eax
109fc7: 83 c4 10 add $0x10,%esp
109fca: 83 f8 01 cmp $0x1,%eax
109fcd: 76 1b jbe 109fea <aio_fsync+0x5e>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
109fcf: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
109fd6: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
109fdd: e8 3a 8d 00 00 call 112d1c <__errno>
109fe2: c7 00 09 00 00 00 movl $0x9,(%eax)
109fe8: eb 42 jmp 10a02c <aio_fsync+0xa0>
req = malloc (sizeof (rtems_aio_request));
109fea: 83 ec 0c sub $0xc,%esp
109fed: 6a 18 push $0x18
109fef: e8 3c cf ff ff call 106f30 <malloc>
if (req == NULL)
109ff4: 83 c4 10 add $0x10,%esp
109ff7: 85 c0 test %eax,%eax
109ff9: 75 1b jne 10a016 <aio_fsync+0x8a> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
109ffb: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10a002: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10a009: e8 0e 8d 00 00 call 112d1c <__errno> <== NOT EXECUTED
10a00e: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10a014: eb 16 jmp 10a02c <aio_fsync+0xa0> <== NOT EXECUTED
req->aiocbp = aiocbp;
10a016: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
10a019: c7 43 2c 03 00 00 00 movl $0x3,0x2c(%ebx)
return rtems_aio_enqueue (req);
10a020: 89 45 08 mov %eax,0x8(%ebp)
}
10a023: 8b 5d fc mov -0x4(%ebp),%ebx
10a026: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
10a027: e9 ce 04 00 00 jmp 10a4fa <rtems_aio_enqueue>
}
10a02c: 83 c8 ff or $0xffffffff,%eax
10a02f: 8b 5d fc mov -0x4(%ebp),%ebx
10a032: c9 leave
10a033: c3 ret
0010a6dc <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
10a6dc: 55 push %ebp
10a6dd: 89 e5 mov %esp,%ebp
10a6df: 53 push %ebx
10a6e0: 83 ec 0c sub $0xc,%esp
10a6e3: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10a6e6: 6a 03 push $0x3
10a6e8: ff 33 pushl (%ebx)
10a6ea: e8 a1 52 00 00 call 10f990 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10a6ef: 83 c4 10 add $0x10,%esp
10a6f2: a8 01 test $0x1,%al
10a6f4: 74 1b je 10a711 <aio_read+0x35>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10a6f6: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10a6fd: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10a704: e8 13 86 00 00 call 112d1c <__errno>
10a709: c7 00 09 00 00 00 movl $0x9,(%eax)
10a70f: eb 6b jmp 10a77c <aio_read+0xa0>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10a711: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10a715: 74 02 je 10a719 <aio_read+0x3d>
10a717: eb 06 jmp 10a71f <aio_read+0x43>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10a719: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10a71d: 79 1b jns 10a73a <aio_read+0x5e>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10a71f: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10a726: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10a72d: e8 ea 85 00 00 call 112d1c <__errno>
10a732: c7 00 16 00 00 00 movl $0x16,(%eax)
10a738: eb 42 jmp 10a77c <aio_read+0xa0>
req = malloc (sizeof (rtems_aio_request));
10a73a: 83 ec 0c sub $0xc,%esp
10a73d: 6a 18 push $0x18
10a73f: e8 ec c7 ff ff call 106f30 <malloc>
if (req == NULL)
10a744: 83 c4 10 add $0x10,%esp
10a747: 85 c0 test %eax,%eax
10a749: 75 1b jne 10a766 <aio_read+0x8a> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10a74b: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10a752: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10a759: e8 be 85 00 00 call 112d1c <__errno> <== NOT EXECUTED
10a75e: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10a764: eb 16 jmp 10a77c <aio_read+0xa0> <== NOT EXECUTED
req->aiocbp = aiocbp;
10a766: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_READ;
10a769: c7 43 2c 01 00 00 00 movl $0x1,0x2c(%ebx)
return rtems_aio_enqueue (req);
10a770: 89 45 08 mov %eax,0x8(%ebp)
}
10a773: 8b 5d fc mov -0x4(%ebp),%ebx
10a776: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
10a777: e9 7e fd ff ff jmp 10a4fa <rtems_aio_enqueue>
}
10a77c: 83 c8 ff or $0xffffffff,%eax
10a77f: 8b 5d fc mov -0x4(%ebp),%ebx
10a782: c9 leave
10a783: c3 ret
0010a790 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
10a790: 55 push %ebp
10a791: 89 e5 mov %esp,%ebp
10a793: 53 push %ebx
10a794: 83 ec 0c sub $0xc,%esp
10a797: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10a79a: 6a 03 push $0x3
10a79c: ff 33 pushl (%ebx)
10a79e: e8 ed 51 00 00 call 10f990 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10a7a3: 83 e0 03 and $0x3,%eax
10a7a6: 48 dec %eax
10a7a7: 83 c4 10 add $0x10,%esp
10a7aa: 83 f8 01 cmp $0x1,%eax
10a7ad: 76 1b jbe 10a7ca <aio_write+0x3a>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10a7af: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10a7b6: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10a7bd: e8 5a 85 00 00 call 112d1c <__errno>
10a7c2: c7 00 09 00 00 00 movl $0x9,(%eax)
10a7c8: eb 6b jmp 10a835 <aio_write+0xa5>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10a7ca: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10a7ce: 74 02 je 10a7d2 <aio_write+0x42>
10a7d0: eb 06 jmp 10a7d8 <aio_write+0x48>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10a7d2: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10a7d6: 79 1b jns 10a7f3 <aio_write+0x63>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10a7d8: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10a7df: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10a7e6: e8 31 85 00 00 call 112d1c <__errno>
10a7eb: c7 00 16 00 00 00 movl $0x16,(%eax)
10a7f1: eb 42 jmp 10a835 <aio_write+0xa5>
req = malloc (sizeof (rtems_aio_request));
10a7f3: 83 ec 0c sub $0xc,%esp
10a7f6: 6a 18 push $0x18
10a7f8: e8 33 c7 ff ff call 106f30 <malloc>
if (req == NULL)
10a7fd: 83 c4 10 add $0x10,%esp
10a800: 85 c0 test %eax,%eax
10a802: 75 1b jne 10a81f <aio_write+0x8f> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10a804: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10a80b: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10a812: e8 05 85 00 00 call 112d1c <__errno> <== NOT EXECUTED
10a817: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10a81d: eb 16 jmp 10a835 <aio_write+0xa5> <== NOT EXECUTED
req->aiocbp = aiocbp;
10a81f: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
10a822: c7 43 2c 02 00 00 00 movl $0x2,0x2c(%ebx)
return rtems_aio_enqueue (req);
10a829: 89 45 08 mov %eax,0x8(%ebp)
}
10a82c: 8b 5d fc mov -0x4(%ebp),%ebx
10a82f: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
10a830: e9 c5 fc ff ff jmp 10a4fa <rtems_aio_enqueue>
}
10a835: 83 c8 ff or $0xffffffff,%eax
10a838: 8b 5d fc mov -0x4(%ebp),%ebx
10a83b: c9 leave
10a83c: c3 ret
00109a54 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
109a54: 55 push %ebp
109a55: 89 e5 mov %esp,%ebp
109a57: 57 push %edi
109a58: 56 push %esi
109a59: 53 push %ebx
109a5a: 83 ec 1c sub $0x1c,%esp
109a5d: 8b 45 08 mov 0x8(%ebp),%eax
109a60: 8b 5d 0c mov 0xc(%ebp),%ebx
if ( !tp )
109a63: 85 db test %ebx,%ebx
109a65: 75 02 jne 109a69 <clock_gettime+0x15>
109a67: eb 6c jmp 109ad5 <clock_gettime+0x81>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
109a69: 83 f8 01 cmp $0x1,%eax
109a6c: 75 3b jne 109aa9 <clock_gettime+0x55>
struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_TOD_Get_as_timestamp( &tod_as_timestamp );
109a6e: 83 ec 0c sub $0xc,%esp
109a71: 8d 45 e0 lea -0x20(%ebp),%eax
109a74: 50 push %eax
109a75: e8 ba 1a 00 00 call 10b534 <_TOD_Get_as_timestamp>
_Timestamp_To_timespec( &tod_as_timestamp, tod_as_timespec );
109a7a: 8b 75 e0 mov -0x20(%ebp),%esi
109a7d: 8b 7d e4 mov -0x1c(%ebp),%edi
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
109a80: 6a 00 push $0x0
109a82: 68 00 ca 9a 3b push $0x3b9aca00
109a87: 57 push %edi
109a88: 56 push %esi
109a89: e8 86 52 01 00 call 11ed14 <__divdi3>
109a8e: 83 c4 10 add $0x10,%esp
109a91: 89 03 mov %eax,(%ebx)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
109a93: 6a 00 push $0x0
109a95: 68 00 ca 9a 3b push $0x3b9aca00
109a9a: 57 push %edi
109a9b: 56 push %esi
109a9c: e8 c7 53 01 00 call 11ee68 <__moddi3>
109aa1: 83 c4 10 add $0x10,%esp
109aa4: 89 43 04 mov %eax,0x4(%ebx)
109aa7: eb 0e jmp 109ab7 <clock_gettime+0x63>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
109aa9: 83 f8 04 cmp $0x4,%eax
109aac: 75 10 jne 109abe <clock_gettime+0x6a> <== ALWAYS TAKEN
_TOD_Get_uptime_as_timespec( tp );
109aae: 83 ec 0c sub $0xc,%esp
109ab1: 53 push %ebx
109ab2: e8 b5 1a 00 00 call 10b56c <_TOD_Get_uptime_as_timespec>
return 0;
109ab7: 83 c4 10 add $0x10,%esp
109aba: 31 c0 xor %eax,%eax
109abc: eb 25 jmp 109ae3 <clock_gettime+0x8f>
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME_ID ) {
109abe: 83 f8 02 cmp $0x2,%eax
109ac1: 74 eb je 109aae <clock_gettime+0x5a>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
109ac3: 83 f8 03 cmp $0x3,%eax
109ac6: 75 0d jne 109ad5 <clock_gettime+0x81>
rtems_set_errno_and_return_minus_one( ENOSYS );
109ac8: e8 cf 80 00 00 call 111b9c <__errno>
109acd: c7 00 58 00 00 00 movl $0x58,(%eax)
109ad3: eb 0b jmp 109ae0 <clock_gettime+0x8c>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
109ad5: e8 c2 80 00 00 call 111b9c <__errno>
109ada: c7 00 16 00 00 00 movl $0x16,(%eax)
109ae0: 83 c8 ff or $0xffffffff,%eax
return 0;
}
109ae3: 8d 65 f4 lea -0xc(%ebp),%esp
109ae6: 5b pop %ebx
109ae7: 5e pop %esi
109ae8: 5f pop %edi
109ae9: 5d pop %ebp
109aea: c3 ret
001233a0 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
1233a0: 55 push %ebp
1233a1: 89 e5 mov %esp,%ebp
1233a3: 53 push %ebx
1233a4: 83 ec 14 sub $0x14,%esp
1233a7: 8b 45 08 mov 0x8(%ebp),%eax
1233aa: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !tp )
1233ad: 85 c9 test %ecx,%ecx
1233af: 75 02 jne 1233b3 <clock_settime+0x13> <== ALWAYS TAKEN
1233b1: eb 69 jmp 12341c <clock_settime+0x7c> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
1233b3: 83 f8 01 cmp $0x1,%eax
1233b6: 75 4b jne 123403 <clock_settime+0x63>
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
1233b8: 81 39 ff e4 da 21 cmpl $0x21dae4ff,(%ecx)
1233be: 77 02 ja 1233c2 <clock_settime+0x22>
1233c0: eb 5a jmp 12341c <clock_settime+0x7c>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
1233c2: a1 fc e1 16 00 mov 0x16e1fc,%eax
1233c7: 40 inc %eax
1233c8: a3 fc e1 16 00 mov %eax,0x16e1fc
return _Thread_Dispatch_disable_level;
1233cd: a1 fc e1 16 00 mov 0x16e1fc,%eax
Timestamp64_Control *_time,
Timestamp64_Control _seconds,
Timestamp64_Control _nanoseconds
)
{
*_time = _seconds * 1000000000L + _nanoseconds;
1233d2: b8 00 ca 9a 3b mov $0x3b9aca00,%eax
1233d7: f7 29 imull (%ecx)
const struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_Timestamp_Set(
1233d9: 8b 49 04 mov 0x4(%ecx),%ecx
1233dc: 89 cb mov %ecx,%ebx
1233de: c1 fb 1f sar $0x1f,%ebx
1233e1: 01 c8 add %ecx,%eax
1233e3: 11 da adc %ebx,%edx
1233e5: 89 45 f0 mov %eax,-0x10(%ebp)
1233e8: 89 55 f4 mov %edx,-0xc(%ebp)
&tod_as_timestamp,
tod_as_timespec->tv_sec,
tod_as_timespec->tv_nsec
);
_TOD_Set_with_timestamp( &tod_as_timestamp );
1233eb: 83 ec 0c sub $0xc,%esp
1233ee: 8d 45 f0 lea -0x10(%ebp),%eax
1233f1: 50 push %eax
1233f2: e8 0d 0e 00 00 call 124204 <_TOD_Set_with_timestamp>
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
1233f7: e8 78 87 fe ff call 10bb74 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
1233fc: 83 c4 10 add $0x10,%esp
1233ff: 31 c0 xor %eax,%eax
123401: eb 27 jmp 12342a <clock_settime+0x8a>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
123403: 83 f8 02 cmp $0x2,%eax
123406: 75 02 jne 12340a <clock_settime+0x6a>
123408: eb 05 jmp 12340f <clock_settime+0x6f>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
12340a: 83 f8 03 cmp $0x3,%eax
12340d: 75 0d jne 12341c <clock_settime+0x7c>
rtems_set_errno_and_return_minus_one( ENOSYS );
12340f: e8 74 da 00 00 call 130e88 <__errno>
123414: c7 00 58 00 00 00 movl $0x58,(%eax)
12341a: eb 0b jmp 123427 <clock_settime+0x87>
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
12341c: e8 67 da 00 00 call 130e88 <__errno>
123421: c7 00 16 00 00 00 movl $0x16,(%eax)
123427: 83 c8 ff or $0xffffffff,%eax
return 0;
}
12342a: 8b 5d fc mov -0x4(%ebp),%ebx
12342d: c9 leave
12342e: c3 ret
0011d990 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
11d990: 55 push %ebp
11d991: 89 e5 mov %esp,%ebp
11d993: 57 push %edi
11d994: 56 push %esi
11d995: 53 push %ebx
11d996: 83 ec 3c sub $0x3c,%esp
11d999: 8b 5d 0c mov 0xc(%ebp),%ebx
11d99c: 8b 75 10 mov 0x10(%ebp),%esi
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
11d99f: e8 f0 fd ff ff call 11d794 <getpid>
11d9a4: 39 45 08 cmp %eax,0x8(%ebp)
11d9a7: 74 10 je 11d9b9 <killinfo+0x29>
rtems_set_errno_and_return_minus_one( ESRCH );
11d9a9: e8 2e 35 ff ff call 110edc <__errno>
11d9ae: c7 00 03 00 00 00 movl $0x3,(%eax)
11d9b4: e9 f1 01 00 00 jmp 11dbaa <killinfo+0x21a>
/*
* Validate the signal passed.
*/
if ( !sig )
11d9b9: 85 db test %ebx,%ebx
11d9bb: 75 02 jne 11d9bf <killinfo+0x2f>
11d9bd: eb 08 jmp 11d9c7 <killinfo+0x37>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
11d9bf: 8d 4b ff lea -0x1(%ebx),%ecx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
11d9c2: 83 f9 1f cmp $0x1f,%ecx
11d9c5: 76 10 jbe 11d9d7 <killinfo+0x47>
rtems_set_errno_and_return_minus_one( EINVAL );
11d9c7: e8 10 35 ff ff call 110edc <__errno>
11d9cc: c7 00 16 00 00 00 movl $0x16,(%eax)
11d9d2: e9 d3 01 00 00 jmp 11dbaa <killinfo+0x21a>
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
11d9d7: 6b c3 0c imul $0xc,%ebx,%eax
11d9da: 83 b8 30 e9 12 00 01 cmpl $0x1,0x12e930(%eax)
11d9e1: 0f 84 e9 01 00 00 je 11dbd0 <killinfo+0x240>
/*
* 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 ) )
11d9e7: 83 fb 04 cmp $0x4,%ebx
11d9ea: 74 0a je 11d9f6 <killinfo+0x66>
11d9ec: 83 fb 08 cmp $0x8,%ebx
11d9ef: 74 05 je 11d9f6 <killinfo+0x66>
11d9f1: 83 fb 0b cmp $0xb,%ebx
11d9f4: 75 16 jne 11da0c <killinfo+0x7c>
return pthread_kill( pthread_self(), sig );
11d9f6: e8 9d 03 00 00 call 11dd98 <pthread_self>
11d9fb: 56 push %esi
11d9fc: 56 push %esi
11d9fd: 53 push %ebx
11d9fe: 50 push %eax
11d9ff: e8 ec 02 00 00 call 11dcf0 <pthread_kill>
11da04: 83 c4 10 add $0x10,%esp
11da07: e9 c6 01 00 00 jmp 11dbd2 <killinfo+0x242>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
11da0c: bf 01 00 00 00 mov $0x1,%edi
11da11: d3 e7 shl %cl,%edi
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
11da13: 89 5d dc mov %ebx,-0x24(%ebp)
siginfo->si_code = SI_USER;
11da16: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
if ( !value ) {
11da1d: 85 f6 test %esi,%esi
11da1f: 75 09 jne 11da2a <killinfo+0x9a>
siginfo->si_value.sival_int = 0;
11da21: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
11da28: eb 05 jmp 11da2f <killinfo+0x9f>
} else {
siginfo->si_value = *value;
11da2a: 8b 06 mov (%esi),%eax
11da2c: 89 45 e4 mov %eax,-0x1c(%ebp)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
11da2f: a1 e4 e3 12 00 mov 0x12e3e4,%eax
11da34: 40 inc %eax
11da35: a3 e4 e3 12 00 mov %eax,0x12e3e4
return _Thread_Dispatch_disable_level;
11da3a: a1 e4 e3 12 00 mov 0x12e3e4,%eax
/*
* 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;
11da3f: a1 ec e8 12 00 mov 0x12e8ec,%eax
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
11da44: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
11da4a: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx
11da50: f7 d2 not %edx
11da52: 85 d7 test %edx,%edi
11da54: 0f 85 fa 00 00 00 jne 11db54 <killinfo+0x1c4>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
11da5a: a1 b4 ea 12 00 mov 0x12eab4,%eax
/* 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 );
11da5f: eb 21 jmp 11da82 <killinfo+0xf2>
!_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 ];
11da61: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
11da67: 85 78 30 test %edi,0x30(%eax)
11da6a: 0f 85 e4 00 00 00 jne 11db54 <killinfo+0x1c4>
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
11da70: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx
11da76: f7 d2 not %edx
11da78: 85 d7 test %edx,%edi
11da7a: 0f 85 d4 00 00 00 jne 11db54 <killinfo+0x1c4>
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 ) {
11da80: 8b 00 mov (%eax),%eax
/* 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 );
11da82: 3d b8 ea 12 00 cmp $0x12eab8,%eax
11da87: 75 d8 jne 11da61 <killinfo+0xd1>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
11da89: 0f b6 05 88 a1 12 00 movzbl 0x12a188,%eax
11da90: 40 inc %eax
11da91: 89 45 bc mov %eax,-0x44(%ebp)
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
11da94: 31 c0 xor %eax,%eax
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
11da96: c7 45 cc 02 00 00 00 movl $0x2,-0x34(%ebp)
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
11da9d: 8b 4d cc mov -0x34(%ebp),%ecx
11daa0: 8b 14 8d bc e3 12 00 mov 0x12e3bc(,%ecx,4),%edx
11daa7: 85 d2 test %edx,%edx
11daa9: 0f 84 94 00 00 00 je 11db43 <killinfo+0x1b3> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
11daaf: 8b 52 04 mov 0x4(%edx),%edx
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
11dab2: 0f b7 72 10 movzwl 0x10(%edx),%esi
11dab6: 89 75 c4 mov %esi,-0x3c(%ebp)
object_table = the_info->local_table;
11dab9: 8b 52 1c mov 0x1c(%edx),%edx
11dabc: 89 55 c0 mov %edx,-0x40(%ebp)
for ( index = 1 ; index <= maximum ; index++ ) {
11dabf: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp)
11dac6: eb 73 jmp 11db3b <killinfo+0x1ab>
the_thread = (Thread_Control *) object_table[ index ];
11dac8: 8b 4d d0 mov -0x30(%ebp),%ecx
11dacb: 8b 75 c0 mov -0x40(%ebp),%esi
11dace: 8b 14 8e mov (%esi,%ecx,4),%edx
if ( !the_thread )
11dad1: 85 d2 test %edx,%edx
11dad3: 74 63 je 11db38 <killinfo+0x1a8>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
11dad5: 8b 4a 14 mov 0x14(%edx),%ecx
11dad8: 89 4d d4 mov %ecx,-0x2c(%ebp)
11dadb: 8b 75 bc mov -0x44(%ebp),%esi
11dade: 39 f1 cmp %esi,%ecx
11dae0: 77 56 ja 11db38 <killinfo+0x1a8>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
11dae2: 8b b2 e8 00 00 00 mov 0xe8(%edx),%esi
11dae8: 8b b6 d0 00 00 00 mov 0xd0(%esi),%esi
11daee: f7 d6 not %esi
11daf0: 85 f7 test %esi,%edi
11daf2: 74 44 je 11db38 <killinfo+0x1a8>
*
* 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 ) {
11daf4: 8b 75 bc mov -0x44(%ebp),%esi
11daf7: 39 f1 cmp %esi,%ecx
11daf9: 72 2d jb 11db28 <killinfo+0x198>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
11dafb: 85 c0 test %eax,%eax
11dafd: 74 39 je 11db38 <killinfo+0x1a8> <== NEVER TAKEN
11daff: 8b 48 10 mov 0x10(%eax),%ecx
11db02: 89 4d c8 mov %ecx,-0x38(%ebp)
11db05: 85 c9 test %ecx,%ecx
11db07: 74 2f je 11db38 <killinfo+0x1a8> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
11db09: 8b 72 10 mov 0x10(%edx),%esi
11db0c: 85 f6 test %esi,%esi
11db0e: 74 20 je 11db30 <killinfo+0x1a0>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
11db10: 81 e1 00 00 00 10 and $0x10000000,%ecx
11db16: 75 20 jne 11db38 <killinfo+0x1a8>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
11db18: 81 e6 00 00 00 10 and $0x10000000,%esi
11db1e: 74 18 je 11db38 <killinfo+0x1a8>
11db20: 8b 75 d4 mov -0x2c(%ebp),%esi
11db23: 89 75 bc mov %esi,-0x44(%ebp)
11db26: eb 0e jmp 11db36 <killinfo+0x1a6>
*
* 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 ) {
11db28: 8b 45 d4 mov -0x2c(%ebp),%eax
11db2b: 89 45 bc mov %eax,-0x44(%ebp)
11db2e: eb 06 jmp 11db36 <killinfo+0x1a6>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
11db30: 8b 4d d4 mov -0x2c(%ebp),%ecx
11db33: 89 4d bc mov %ecx,-0x44(%ebp)
11db36: 89 d0 mov %edx,%eax
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
11db38: ff 45 d0 incl -0x30(%ebp)
11db3b: 8b 75 c4 mov -0x3c(%ebp),%esi
11db3e: 39 75 d0 cmp %esi,-0x30(%ebp)
11db41: 76 85 jbe 11dac8 <killinfo+0x138>
* + 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++) {
11db43: ff 45 cc incl -0x34(%ebp)
11db46: 83 7d cc 04 cmpl $0x4,-0x34(%ebp)
11db4a: 0f 85 4d ff ff ff jne 11da9d <killinfo+0x10d>
}
}
}
}
if ( interested ) {
11db50: 85 c0 test %eax,%eax
11db52: 74 1a je 11db6e <killinfo+0x1de>
/*
* 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 ) ) {
11db54: 51 push %ecx
mask = signo_to_mask( sig );
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
11db55: 8d 55 dc lea -0x24(%ebp),%edx
/*
* 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 ) ) {
11db58: 52 push %edx
11db59: 53 push %ebx
11db5a: 50 push %eax
11db5b: e8 90 00 00 00 call 11dbf0 <_POSIX_signals_Unblock_thread>
11db60: 83 c4 10 add $0x10,%esp
11db63: 84 c0 test %al,%al
11db65: 74 07 je 11db6e <killinfo+0x1de>
_Thread_Enable_dispatch();
11db67: e8 a0 e2 fe ff call 10be0c <_Thread_Enable_dispatch>
11db6c: eb 62 jmp 11dbd0 <killinfo+0x240>
/*
* 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 );
11db6e: 83 ec 0c sub $0xc,%esp
11db71: 57 push %edi
11db72: e8 65 00 00 00 call 11dbdc <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
11db77: 6b db 0c imul $0xc,%ebx,%ebx
11db7a: 83 c4 10 add $0x10,%esp
11db7d: 83 bb 28 e9 12 00 02 cmpl $0x2,0x12e928(%ebx)
11db84: 75 e1 jne 11db67 <killinfo+0x1d7>
psiginfo = (POSIX_signals_Siginfo_node *)
11db86: 83 ec 0c sub $0xc,%esp
11db89: 68 a8 ea 12 00 push $0x12eaa8
11db8e: e8 ed ca fe ff call 10a680 <_Chain_Get>
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
11db93: 83 c4 10 add $0x10,%esp
11db96: 85 c0 test %eax,%eax
11db98: 75 15 jne 11dbaf <killinfo+0x21f>
_Thread_Enable_dispatch();
11db9a: e8 6d e2 fe ff call 10be0c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
11db9f: e8 38 33 ff ff call 110edc <__errno>
11dba4: c7 00 0b 00 00 00 movl $0xb,(%eax)
11dbaa: 83 c8 ff or $0xffffffff,%eax
11dbad: eb 23 jmp 11dbd2 <killinfo+0x242>
}
psiginfo->Info = *siginfo;
11dbaf: 8d 78 08 lea 0x8(%eax),%edi
11dbb2: 8d 75 dc lea -0x24(%ebp),%esi
11dbb5: b9 03 00 00 00 mov $0x3,%ecx
11dbba: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
11dbbc: 52 push %edx
11dbbd: 52 push %edx
11dbbe: 50 push %eax
11dbbf: 81 c3 20 eb 12 00 add $0x12eb20,%ebx
11dbc5: 53 push %ebx
11dbc6: e8 91 ca fe ff call 10a65c <_Chain_Append>
11dbcb: 83 c4 10 add $0x10,%esp
11dbce: eb 97 jmp 11db67 <killinfo+0x1d7>
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
return 0;
11dbd0: 31 c0 xor %eax,%eax
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
11dbd2: 8d 65 f4 lea -0xc(%ebp),%esp
11dbd5: 5b pop %ebx
11dbd6: 5e pop %esi
11dbd7: 5f pop %edi
11dbd8: 5d pop %ebp
11dbd9: c3 ret
0010e4d4 <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
10e4d4: 55 push %ebp
10e4d5: 89 e5 mov %esp,%ebp
10e4d7: 8b 55 08 mov 0x8(%ebp),%edx
10e4da: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized )
return EINVAL;
10e4dd: b8 16 00 00 00 mov $0x16,%eax
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
10e4e2: 85 d2 test %edx,%edx
10e4e4: 74 1e je 10e504 <pthread_attr_setschedpolicy+0x30>
10e4e6: 83 3a 00 cmpl $0x0,(%edx)
10e4e9: 74 19 je 10e504 <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
10e4eb: 83 f9 04 cmp $0x4,%ecx
10e4ee: 77 0f ja 10e4ff <pthread_attr_setschedpolicy+0x2b>
10e4f0: b0 01 mov $0x1,%al
10e4f2: d3 e0 shl %cl,%eax
10e4f4: a8 17 test $0x17,%al
10e4f6: 74 07 je 10e4ff <pthread_attr_setschedpolicy+0x2b><== NEVER TAKEN
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
10e4f8: 89 4a 14 mov %ecx,0x14(%edx)
return 0;
10e4fb: 31 c0 xor %eax,%eax
10e4fd: eb 05 jmp 10e504 <pthread_attr_setschedpolicy+0x30>
default:
return ENOTSUP;
10e4ff: b8 86 00 00 00 mov $0x86,%eax
}
}
10e504: 5d pop %ebp
10e505: c3 ret
00109fd8 <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
109fd8: 55 push %ebp
109fd9: 89 e5 mov %esp,%ebp
109fdb: 57 push %edi
109fdc: 56 push %esi
109fdd: 53 push %ebx
109fde: 83 ec 1c sub $0x1c,%esp
109fe1: 8b 75 08 mov 0x8(%ebp),%esi
109fe4: 8b 5d 10 mov 0x10(%ebp),%ebx
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
109fe7: 85 f6 test %esi,%esi
109fe9: 75 05 jne 109ff0 <pthread_barrier_init+0x18>
109feb: e9 9a 00 00 00 jmp 10a08a <pthread_barrier_init+0xb2>
return EINVAL;
if ( count == 0 )
109ff0: 85 db test %ebx,%ebx
109ff2: 0f 84 92 00 00 00 je 10a08a <pthread_barrier_init+0xb2><== NEVER TAKEN
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
109ff8: 8b 45 0c mov 0xc(%ebp),%eax
109ffb: 85 c0 test %eax,%eax
109ffd: 75 11 jne 10a010 <pthread_barrier_init+0x38>
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
109fff: 83 ec 0c sub $0xc,%esp
10a002: 8d 7d e0 lea -0x20(%ebp),%edi
10a005: 57 push %edi
10a006: e8 19 ff ff ff call 109f24 <pthread_barrierattr_init>
10a00b: 83 c4 10 add $0x10,%esp
the_attr = &my_attr;
10a00e: 89 f8 mov %edi,%eax
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10a010: 83 38 00 cmpl $0x0,(%eax)
10a013: 74 75 je 10a08a <pthread_barrier_init+0xb2>
return EINVAL;
switch ( the_attr->process_shared ) {
10a015: 83 78 04 00 cmpl $0x0,0x4(%eax)
10a019: 75 6f jne 10a08a <pthread_barrier_init+0xb2><== NEVER TAKEN
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
10a01b: c7 45 d8 00 00 00 00 movl $0x0,-0x28(%ebp)
the_attributes.maximum_count = count;
10a022: 89 5d dc mov %ebx,-0x24(%ebp)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10a025: a1 dc f3 12 00 mov 0x12f3dc,%eax
10a02a: 40 inc %eax
10a02b: a3 dc f3 12 00 mov %eax,0x12f3dc
return _Thread_Dispatch_disable_level;
10a030: a1 dc f3 12 00 mov 0x12f3dc,%eax
* 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 *)
10a035: 83 ec 0c sub $0xc,%esp
10a038: 68 60 f7 12 00 push $0x12f760
10a03d: e8 ae 1c 00 00 call 10bcf0 <_Objects_Allocate>
10a042: 89 c3 mov %eax,%ebx
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
10a044: 83 c4 10 add $0x10,%esp
10a047: 85 c0 test %eax,%eax
10a049: 75 0c jne 10a057 <pthread_barrier_init+0x7f>
_Thread_Enable_dispatch();
10a04b: e8 e0 2b 00 00 call 10cc30 <_Thread_Enable_dispatch>
return EAGAIN;
10a050: b8 0b 00 00 00 mov $0xb,%eax
10a055: eb 38 jmp 10a08f <pthread_barrier_init+0xb7>
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
10a057: 50 push %eax
10a058: 50 push %eax
10a059: 8d 45 d8 lea -0x28(%ebp),%eax
10a05c: 50 push %eax
10a05d: 8d 43 10 lea 0x10(%ebx),%eax
10a060: 50 push %eax
10a061: e8 56 14 00 00 call 10b4bc <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10a066: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10a069: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10a06c: 8b 15 7c f7 12 00 mov 0x12f77c,%edx
10a072: 89 1c 8a mov %ebx,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10a075: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
10a07c: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10a07e: e8 ad 2b 00 00 call 10cc30 <_Thread_Enable_dispatch>
10a083: 83 c4 10 add $0x10,%esp
return 0;
10a086: 31 c0 xor %eax,%eax
10a088: eb 05 jmp 10a08f <pthread_barrier_init+0xb7>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10a08a: b8 16 00 00 00 mov $0x16,%eax
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10a08f: 8d 65 f4 lea -0xc(%ebp),%esp
10a092: 5b pop %ebx
10a093: 5e pop %esi
10a094: 5f pop %edi
10a095: 5d pop %ebp
10a096: c3 ret
001099a4 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
1099a4: 55 push %ebp
1099a5: 89 e5 mov %esp,%ebp
1099a7: 56 push %esi
1099a8: 53 push %ebx
1099a9: 8b 5d 08 mov 0x8(%ebp),%ebx
1099ac: 8b 75 0c mov 0xc(%ebp),%esi
/*
* 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 )
1099af: 85 db test %ebx,%ebx
1099b1: 74 50 je 109a03 <pthread_cleanup_push+0x5f>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
1099b3: a1 d4 f3 12 00 mov 0x12f3d4,%eax
1099b8: 40 inc %eax
1099b9: a3 d4 f3 12 00 mov %eax,0x12f3d4
return _Thread_Dispatch_disable_level;
1099be: a1 d4 f3 12 00 mov 0x12f3d4,%eax
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
1099c3: 83 ec 0c sub $0xc,%esp
1099c6: 6a 10 push $0x10
1099c8: e8 6b 3a 00 00 call 10d438 <_Workspace_Allocate>
if ( handler ) {
1099cd: 83 c4 10 add $0x10,%esp
1099d0: 85 c0 test %eax,%eax
1099d2: 74 24 je 1099f8 <pthread_cleanup_push+0x54><== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
1099d4: 8b 15 dc f8 12 00 mov 0x12f8dc,%edx
handler_stack = &thread_support->Cancellation_Handlers;
1099da: 8b 92 e8 00 00 00 mov 0xe8(%edx),%edx
1099e0: 81 c2 e4 00 00 00 add $0xe4,%edx
handler->routine = routine;
1099e6: 89 58 08 mov %ebx,0x8(%eax)
handler->arg = arg;
1099e9: 89 70 0c mov %esi,0xc(%eax)
_Chain_Append( handler_stack, &handler->Node );
1099ec: 51 push %ecx
1099ed: 51 push %ecx
1099ee: 50 push %eax
1099ef: 52 push %edx
1099f0: e8 57 15 00 00 call 10af4c <_Chain_Append>
1099f5: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
}
1099f8: 8d 65 f8 lea -0x8(%ebp),%esp
1099fb: 5b pop %ebx
1099fc: 5e pop %esi
1099fd: 5d pop %ebp
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
1099fe: e9 89 2c 00 00 jmp 10c68c <_Thread_Enable_dispatch>
}
109a03: 8d 65 f8 lea -0x8(%ebp),%esp
109a06: 5b pop %ebx
109a07: 5e pop %esi
109a08: 5d pop %ebp
109a09: c3 ret
0010a7c4 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
10a7c4: 55 push %ebp
10a7c5: 89 e5 mov %esp,%ebp
10a7c7: 56 push %esi
10a7c8: 53 push %ebx
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
10a7c9: 8b 75 0c mov 0xc(%ebp),%esi
10a7cc: 85 f6 test %esi,%esi
10a7ce: 75 05 jne 10a7d5 <pthread_cond_init+0x11>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
10a7d0: be f0 1d 12 00 mov $0x121df0,%esi
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
return EINVAL;
10a7d5: b8 16 00 00 00 mov $0x16,%eax
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10a7da: 83 7e 04 01 cmpl $0x1,0x4(%esi)
10a7de: 74 7b je 10a85b <pthread_cond_init+0x97><== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
10a7e0: 83 3e 00 cmpl $0x0,(%esi)
10a7e3: 74 76 je 10a85b <pthread_cond_init+0x97>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10a7e5: a1 e4 03 13 00 mov 0x1303e4,%eax
10a7ea: 40 inc %eax
10a7eb: a3 e4 03 13 00 mov %eax,0x1303e4
return _Thread_Dispatch_disable_level;
10a7f0: a1 e4 03 13 00 mov 0x1303e4,%eax
*/
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
10a7f5: 83 ec 0c sub $0xc,%esp
10a7f8: 68 00 08 13 00 push $0x130800
10a7fd: e8 6e 22 00 00 call 10ca70 <_Objects_Allocate>
10a802: 89 c3 mov %eax,%ebx
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
10a804: 83 c4 10 add $0x10,%esp
10a807: 85 c0 test %eax,%eax
10a809: 75 0c jne 10a817 <pthread_cond_init+0x53>
_Thread_Enable_dispatch();
10a80b: e8 a0 31 00 00 call 10d9b0 <_Thread_Enable_dispatch>
return ENOMEM;
10a810: b8 0c 00 00 00 mov $0xc,%eax
10a815: eb 44 jmp 10a85b <pthread_cond_init+0x97>
}
the_cond->process_shared = the_attr->process_shared;
10a817: 8b 46 04 mov 0x4(%esi),%eax
10a81a: 89 43 10 mov %eax,0x10(%ebx)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
10a81d: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx)
_Thread_queue_Initialize(
10a824: 6a 74 push $0x74
10a826: 68 00 08 00 10 push $0x10000800
10a82b: 6a 00 push $0x0
10a82d: 8d 43 18 lea 0x18(%ebx),%eax
10a830: 50 push %eax
10a831: e8 26 38 00 00 call 10e05c <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10a836: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10a839: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10a83c: 8b 15 1c 08 13 00 mov 0x13081c,%edx
10a842: 89 1c 8a mov %ebx,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10a845: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
10a84c: 8b 55 08 mov 0x8(%ebp),%edx
10a84f: 89 02 mov %eax,(%edx)
_Thread_Enable_dispatch();
10a851: e8 5a 31 00 00 call 10d9b0 <_Thread_Enable_dispatch>
return 0;
10a856: 83 c4 10 add $0x10,%esp
10a859: 31 c0 xor %eax,%eax
}
10a85b: 8d 65 f8 lea -0x8(%ebp),%esp
10a85e: 5b pop %ebx
10a85f: 5e pop %esi
10a860: 5d pop %ebp
10a861: c3 ret
0010a66c <pthread_condattr_destroy>:
*/
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
10a66c: 55 push %ebp
10a66d: 89 e5 mov %esp,%ebp
10a66f: 8b 55 08 mov 0x8(%ebp),%edx
if ( !attr || attr->is_initialized == false )
return EINVAL;
10a672: b8 16 00 00 00 mov $0x16,%eax
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
10a677: 85 d2 test %edx,%edx
10a679: 74 0d je 10a688 <pthread_condattr_destroy+0x1c>
10a67b: 83 3a 00 cmpl $0x0,(%edx)
10a67e: 74 08 je 10a688 <pthread_condattr_destroy+0x1c><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
10a680: c7 02 00 00 00 00 movl $0x0,(%edx)
return 0;
10a686: 30 c0 xor %al,%al
}
10a688: 5d pop %ebp
10a689: c3 ret
00109cf0 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
109cf0: 55 push %ebp
109cf1: 89 e5 mov %esp,%ebp
109cf3: 57 push %edi
109cf4: 56 push %esi
109cf5: 53 push %ebx
109cf6: 83 ec 4c sub $0x4c,%esp
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
109cf9: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
109cfd: 0f 84 f8 01 00 00 je 109efb <pthread_create+0x20b>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
109d03: 8b 55 0c mov 0xc(%ebp),%edx
109d06: 85 d2 test %edx,%edx
109d08: 75 05 jne 109d0f <pthread_create+0x1f>
109d0a: ba 60 09 12 00 mov $0x120960,%edx
if ( !the_attr->is_initialized )
109d0f: 83 3a 00 cmpl $0x0,(%edx)
109d12: 75 05 jne 109d19 <pthread_create+0x29>
109d14: e9 eb 01 00 00 jmp 109f04 <pthread_create+0x214>
* 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) )
109d19: 83 7a 04 00 cmpl $0x0,0x4(%edx)
109d1d: 74 0e je 109d2d <pthread_create+0x3d>
109d1f: a1 8c b1 12 00 mov 0x12b18c,%eax
109d24: 39 42 08 cmp %eax,0x8(%edx)
109d27: 0f 82 d7 01 00 00 jb 109f04 <pthread_create+0x214>
* 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 ) {
109d2d: 8b 42 10 mov 0x10(%edx),%eax
109d30: 83 f8 01 cmp $0x1,%eax
109d33: 74 0b je 109d40 <pthread_create+0x50>
109d35: 83 f8 02 cmp $0x2,%eax
109d38: 0f 85 c6 01 00 00 jne 109f04 <pthread_create+0x214>
109d3e: eb 1f jmp 109d5f <pthread_create+0x6f>
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
109d40: a1 dc f8 12 00 mov 0x12f8dc,%eax
109d45: 8b b0 e8 00 00 00 mov 0xe8(%eax),%esi
schedpolicy = api->schedpolicy;
109d4b: 8b 86 84 00 00 00 mov 0x84(%esi),%eax
109d51: 89 45 ac mov %eax,-0x54(%ebp)
schedparam = api->schedparam;
109d54: 8d 7d cc lea -0x34(%ebp),%edi
109d57: 81 c6 88 00 00 00 add $0x88,%esi
109d5d: eb 0c jmp 109d6b <pthread_create+0x7b>
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
109d5f: 8b 42 14 mov 0x14(%edx),%eax
109d62: 89 45 ac mov %eax,-0x54(%ebp)
schedparam = the_attr->schedparam;
109d65: 8d 7d cc lea -0x34(%ebp),%edi
109d68: 8d 72 18 lea 0x18(%edx),%esi
109d6b: b9 07 00 00 00 mov $0x7,%ecx
109d70: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
return ENOTSUP;
109d72: c7 45 b4 86 00 00 00 movl $0x86,-0x4c(%ebp)
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
109d79: 83 7a 0c 00 cmpl $0x0,0xc(%edx)
109d7d: 0f 85 88 01 00 00 jne 109f0b <pthread_create+0x21b>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
109d83: 83 ec 0c sub $0xc,%esp
109d86: ff 75 cc pushl -0x34(%ebp)
109d89: 89 55 a8 mov %edx,-0x58(%ebp)
109d8c: e8 5b 54 00 00 call 10f1ec <_POSIX_Priority_Is_valid>
109d91: 83 c4 10 add $0x10,%esp
109d94: 84 c0 test %al,%al
109d96: 0f 84 68 01 00 00 je 109f04 <pthread_create+0x214> <== NEVER TAKEN
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
109d9c: 8b 5d cc mov -0x34(%ebp),%ebx
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
109d9f: 0f b6 35 88 b1 12 00 movzbl 0x12b188,%esi
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
109da6: 8d 45 c8 lea -0x38(%ebp),%eax
109da9: 50 push %eax
109daa: 8d 45 c4 lea -0x3c(%ebp),%eax
109dad: 50 push %eax
109dae: 8d 45 cc lea -0x34(%ebp),%eax
109db1: 50 push %eax
109db2: ff 75 ac pushl -0x54(%ebp)
109db5: e8 52 54 00 00 call 10f20c <_POSIX_Thread_Translate_sched_param>
109dba: 89 45 b4 mov %eax,-0x4c(%ebp)
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
109dbd: 83 c4 10 add $0x10,%esp
109dc0: 85 c0 test %eax,%eax
109dc2: 0f 85 43 01 00 00 jne 109f0b <pthread_create+0x21b>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
109dc8: 83 ec 0c sub $0xc,%esp
109dcb: ff 35 60 f4 12 00 pushl 0x12f460
109dd1: e8 66 15 00 00 call 10b33c <_API_Mutex_Lock>
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
109dd6: c7 04 24 d8 f5 12 00 movl $0x12f5d8,(%esp)
109ddd: e8 d6 1d 00 00 call 10bbb8 <_Objects_Allocate>
109de2: 89 45 b0 mov %eax,-0x50(%ebp)
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
109de5: 83 c4 10 add $0x10,%esp
109de8: 85 c0 test %eax,%eax
109dea: 8b 55 a8 mov -0x58(%ebp),%edx
109ded: 75 05 jne 109df4 <pthread_create+0x104>
_RTEMS_Unlock_allocator();
109def: 83 ec 0c sub $0xc,%esp
109df2: eb 56 jmp 109e4a <pthread_create+0x15a>
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
109df4: 8b 4a 08 mov 0x8(%edx),%ecx
109df7: 57 push %edi
109df8: 6a 00 push $0x0
109dfa: 6a 00 push $0x0
109dfc: ff 75 c8 pushl -0x38(%ebp)
109dff: ff 75 c4 pushl -0x3c(%ebp)
109e02: 6a 01 push $0x1
109e04: 81 e6 ff 00 00 00 and $0xff,%esi
109e0a: 29 de sub %ebx,%esi
109e0c: 56 push %esi
109e0d: 6a 01 push $0x1
109e0f: a1 8c b1 12 00 mov 0x12b18c,%eax
109e14: d1 e0 shl %eax
109e16: 39 c8 cmp %ecx,%eax
109e18: 73 02 jae 109e1c <pthread_create+0x12c>
109e1a: 89 c8 mov %ecx,%eax
109e1c: 50 push %eax
109e1d: ff 72 04 pushl 0x4(%edx)
109e20: ff 75 b0 pushl -0x50(%ebp)
109e23: 68 d8 f5 12 00 push $0x12f5d8
109e28: 89 55 a8 mov %edx,-0x58(%ebp)
109e2b: e8 68 2d 00 00 call 10cb98 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
109e30: 83 c4 30 add $0x30,%esp
109e33: 84 c0 test %al,%al
109e35: 8b 55 a8 mov -0x58(%ebp),%edx
109e38: 75 2a jne 109e64 <pthread_create+0x174>
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
109e3a: 51 push %ecx
109e3b: 51 push %ecx
109e3c: ff 75 b0 pushl -0x50(%ebp)
109e3f: 68 d8 f5 12 00 push $0x12f5d8
109e44: e8 4f 20 00 00 call 10be98 <_Objects_Free>
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
109e49: 5b pop %ebx
109e4a: ff 35 60 f4 12 00 pushl 0x12f460
109e50: e8 2f 15 00 00 call 10b384 <_API_Mutex_Unlock>
109e55: 83 c4 10 add $0x10,%esp
return EAGAIN;
109e58: c7 45 b4 0b 00 00 00 movl $0xb,-0x4c(%ebp)
109e5f: e9 a7 00 00 00 jmp 109f0b <pthread_create+0x21b>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
109e64: 8b 45 b0 mov -0x50(%ebp),%eax
109e67: 8b 98 e8 00 00 00 mov 0xe8(%eax),%ebx
api->Attributes = *the_attr;
109e6d: b9 10 00 00 00 mov $0x10,%ecx
109e72: 89 df mov %ebx,%edi
109e74: 89 d6 mov %edx,%esi
109e76: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
api->detachstate = the_attr->detachstate;
109e78: 8b 42 3c mov 0x3c(%edx),%eax
109e7b: 89 43 40 mov %eax,0x40(%ebx)
api->schedpolicy = schedpolicy;
109e7e: 8b 45 ac mov -0x54(%ebp),%eax
109e81: 89 83 84 00 00 00 mov %eax,0x84(%ebx)
api->schedparam = schedparam;
109e87: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi
109e8d: 8d 75 cc lea -0x34(%ebp),%esi
109e90: b1 07 mov $0x7,%cl
109e92: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
109e94: 83 ec 0c sub $0xc,%esp
109e97: 6a 00 push $0x0
109e99: ff 75 14 pushl 0x14(%ebp)
109e9c: ff 75 10 pushl 0x10(%ebp)
109e9f: 6a 01 push $0x1
109ea1: ff 75 b0 pushl -0x50(%ebp)
109ea4: e8 d7 34 00 00 call 10d380 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
109ea9: 83 c4 20 add $0x20,%esp
109eac: 83 7d ac 04 cmpl $0x4,-0x54(%ebp)
109eb0: 75 2b jne 109edd <pthread_create+0x1ed>
_Watchdog_Insert_ticks(
109eb2: 83 ec 0c sub $0xc,%esp
&api->Sporadic_timer,
_Timespec_To_ticks( &api->schedparam.sched_ss_repl_period )
109eb5: 8d 83 90 00 00 00 lea 0x90(%ebx),%eax
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
109ebb: 50 push %eax
109ebc: e8 3f 35 00 00 call 10d400 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
109ec1: 89 83 b4 00 00 00 mov %eax,0xb4(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
109ec7: 58 pop %eax
109ec8: 5a pop %edx
109ec9: 81 c3 a8 00 00 00 add $0xa8,%ebx
109ecf: 53 push %ebx
109ed0: 68 78 f4 12 00 push $0x12f478
109ed5: e8 b2 37 00 00 call 10d68c <_Watchdog_Insert>
109eda: 83 c4 10 add $0x10,%esp
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
109edd: 8b 45 b0 mov -0x50(%ebp),%eax
109ee0: 8b 50 08 mov 0x8(%eax),%edx
109ee3: 8b 45 08 mov 0x8(%ebp),%eax
109ee6: 89 10 mov %edx,(%eax)
_RTEMS_Unlock_allocator();
109ee8: 83 ec 0c sub $0xc,%esp
109eeb: ff 35 60 f4 12 00 pushl 0x12f460
109ef1: e8 8e 14 00 00 call 10b384 <_API_Mutex_Unlock>
109ef6: 83 c4 10 add $0x10,%esp
109ef9: eb 10 jmp 109f0b <pthread_create+0x21b>
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
109efb: c7 45 b4 0e 00 00 00 movl $0xe,-0x4c(%ebp)
109f02: eb 07 jmp 109f0b <pthread_create+0x21b>
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
break;
default:
return EINVAL;
109f04: c7 45 b4 16 00 00 00 movl $0x16,-0x4c(%ebp)
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
109f0b: 8b 45 b4 mov -0x4c(%ebp),%eax
109f0e: 8d 65 f4 lea -0xc(%ebp),%esp
109f11: 5b pop %ebx
109f12: 5e pop %esi
109f13: 5f pop %edi
109f14: 5d pop %ebp
109f15: c3 ret
001109fe <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
1109fe: 55 push %ebp
1109ff: 89 e5 mov %esp,%ebp
110a01: 83 ec 10 sub $0x10,%esp
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
110a04: ff 75 08 pushl 0x8(%ebp)
110a07: ff 35 ec e8 12 00 pushl 0x12e8ec
110a0d: e8 0a ff ff ff call 11091c <_POSIX_Thread_Exit>
110a12: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
110a15: c9 leave <== NOT EXECUTED
110a16: c3 ret <== NOT EXECUTED
0011dcf0 <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
11dcf0: 55 push %ebp
11dcf1: 89 e5 mov %esp,%ebp
11dcf3: 57 push %edi
11dcf4: 56 push %esi
11dcf5: 53 push %ebx
11dcf6: 83 ec 1c sub $0x1c,%esp
11dcf9: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
11dcfc: 85 db test %ebx,%ebx
11dcfe: 75 02 jne 11dd02 <pthread_kill+0x12>
11dd00: eb 08 jmp 11dd0a <pthread_kill+0x1a>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
11dd02: 8d 7b ff lea -0x1(%ebx),%edi
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
11dd05: 83 ff 1f cmp $0x1f,%edi
11dd08: 76 0d jbe 11dd17 <pthread_kill+0x27>
rtems_set_errno_and_return_minus_one( EINVAL );
11dd0a: e8 cd 31 ff ff call 110edc <__errno>
11dd0f: c7 00 16 00 00 00 movl $0x16,(%eax)
11dd15: eb 75 jmp 11dd8c <pthread_kill+0x9c>
the_thread = _Thread_Get( thread, &location );
11dd17: 52 push %edx
11dd18: 52 push %edx
11dd19: 8d 45 e4 lea -0x1c(%ebp),%eax
11dd1c: 50 push %eax
11dd1d: ff 75 08 pushl 0x8(%ebp)
11dd20: e8 07 e1 fe ff call 10be2c <_Thread_Get>
11dd25: 89 c6 mov %eax,%esi
switch ( location ) {
11dd27: 83 c4 10 add $0x10,%esp
11dd2a: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
11dd2e: 75 51 jne 11dd81 <pthread_kill+0x91> <== NEVER TAKEN
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
11dd30: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
11dd36: 6b c3 0c imul $0xc,%ebx,%eax
11dd39: 83 b8 30 e9 12 00 01 cmpl $0x1,0x12e930(%eax)
11dd40: 75 09 jne 11dd4b <pthread_kill+0x5b>
_Thread_Enable_dispatch();
11dd42: e8 c5 e0 fe ff call 10be0c <_Thread_Enable_dispatch>
return 0;
11dd47: 31 c0 xor %eax,%eax
11dd49: eb 44 jmp 11dd8f <pthread_kill+0x9f>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
11dd4b: b8 01 00 00 00 mov $0x1,%eax
11dd50: 89 f9 mov %edi,%ecx
11dd52: d3 e0 shl %cl,%eax
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
11dd54: 09 82 d4 00 00 00 or %eax,0xd4(%edx)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
11dd5a: 50 push %eax
11dd5b: 6a 00 push $0x0
11dd5d: 53 push %ebx
11dd5e: 56 push %esi
11dd5f: e8 8c fe ff ff call 11dbf0 <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
11dd64: 83 c4 10 add $0x10,%esp
11dd67: 83 3d e8 e8 12 00 00 cmpl $0x0,0x12e8e8
11dd6e: 74 d2 je 11dd42 <pthread_kill+0x52>
11dd70: 3b 35 ec e8 12 00 cmp 0x12e8ec,%esi
11dd76: 75 ca jne 11dd42 <pthread_kill+0x52>
_Thread_Dispatch_necessary = true;
11dd78: c6 05 f8 e8 12 00 01 movb $0x1,0x12e8f8
11dd7f: eb c1 jmp 11dd42 <pthread_kill+0x52>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
11dd81: e8 56 31 ff ff call 110edc <__errno> <== NOT EXECUTED
11dd86: c7 00 03 00 00 00 movl $0x3,(%eax) <== NOT EXECUTED
11dd8c: 83 c8 ff or $0xffffffff,%eax
}
11dd8f: 8d 65 f4 lea -0xc(%ebp),%esp
11dd92: 5b pop %ebx
11dd93: 5e pop %esi
11dd94: 5f pop %edi
11dd95: 5d pop %ebp
11dd96: c3 ret
0010ba38 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
10ba38: 55 push %ebp
10ba39: 89 e5 mov %esp,%ebp
10ba3b: 53 push %ebx
10ba3c: 83 ec 2c sub $0x2c,%esp
*
* 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 );
10ba3f: 8d 45 f4 lea -0xc(%ebp),%eax
10ba42: 50 push %eax
10ba43: ff 75 0c pushl 0xc(%ebp)
10ba46: e8 b5 00 00 00 call 10bb00 <_POSIX_Absolute_timeout_to_ticks>
10ba4b: 89 c3 mov %eax,%ebx
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10ba4d: 83 c4 0c add $0xc,%esp
10ba50: 83 f8 03 cmp $0x3,%eax
10ba53: 0f 94 c1 sete %cl
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10ba56: ff 75 f4 pushl -0xc(%ebp)
10ba59: 0f b6 c1 movzbl %cl,%eax
10ba5c: 50 push %eax
10ba5d: ff 75 08 pushl 0x8(%ebp)
10ba60: 88 4d e4 mov %cl,-0x1c(%ebp)
10ba63: e8 e8 fe ff ff call 10b950 <_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) ) {
10ba68: 83 c4 10 add $0x10,%esp
10ba6b: 8a 4d e4 mov -0x1c(%ebp),%cl
10ba6e: 84 c9 test %cl,%cl
10ba70: 75 17 jne 10ba89 <pthread_mutex_timedlock+0x51>
10ba72: 83 f8 10 cmp $0x10,%eax
10ba75: 75 12 jne 10ba89 <pthread_mutex_timedlock+0x51>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10ba77: b0 16 mov $0x16,%al
* 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 )
10ba79: 85 db test %ebx,%ebx
10ba7b: 74 0c je 10ba89 <pthread_mutex_timedlock+0x51><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10ba7d: 4b dec %ebx
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10ba7e: 83 fb 02 cmp $0x2,%ebx
10ba81: 19 c0 sbb %eax,%eax
10ba83: 83 e0 64 and $0x64,%eax
10ba86: 83 c0 10 add $0x10,%eax
}
return lock_status;
}
10ba89: 8b 5d fc mov -0x4(%ebp),%ebx
10ba8c: c9 leave
10ba8d: c3 ret
0010b6a4 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
10b6a4: 55 push %ebp
10b6a5: 89 e5 mov %esp,%ebp
10b6a7: 8b 55 08 mov 0x8(%ebp),%edx
10b6aa: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized )
return EINVAL;
10b6ad: b8 16 00 00 00 mov $0x16,%eax
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
10b6b2: 85 d2 test %edx,%edx
10b6b4: 74 0f je 10b6c5 <pthread_mutexattr_setpshared+0x21>
10b6b6: 83 3a 00 cmpl $0x0,(%edx)
10b6b9: 74 0a je 10b6c5 <pthread_mutexattr_setpshared+0x21>
return EINVAL;
switch ( pshared ) {
10b6bb: 83 f9 01 cmp $0x1,%ecx
10b6be: 77 05 ja 10b6c5 <pthread_mutexattr_setpshared+0x21><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10b6c0: 89 4a 04 mov %ecx,0x4(%edx)
return 0;
10b6c3: 30 c0 xor %al,%al
default:
return EINVAL;
}
}
10b6c5: 5d pop %ebp
10b6c6: c3 ret
00109870 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
109870: 55 push %ebp
109871: 89 e5 mov %esp,%ebp
109873: 8b 55 08 mov 0x8(%ebp),%edx
109876: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr || !attr->is_initialized )
return EINVAL;
109879: b8 16 00 00 00 mov $0x16,%eax
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
10987e: 85 d2 test %edx,%edx
109880: 74 0f je 109891 <pthread_mutexattr_settype+0x21>
109882: 83 3a 00 cmpl $0x0,(%edx)
109885: 74 0a je 109891 <pthread_mutexattr_settype+0x21><== NEVER TAKEN
return EINVAL;
switch ( type ) {
109887: 83 f9 03 cmp $0x3,%ecx
10988a: 77 05 ja 109891 <pthread_mutexattr_settype+0x21>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
10988c: 89 4a 10 mov %ecx,0x10(%edx)
return 0;
10988f: 30 c0 xor %al,%al
default:
return EINVAL;
}
}
109891: 5d pop %ebp
109892: c3 ret
0010a380 <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
10a380: 55 push %ebp
10a381: 89 e5 mov %esp,%ebp
10a383: 56 push %esi
10a384: 53 push %ebx
10a385: 83 ec 10 sub $0x10,%esp
10a388: 8b 5d 08 mov 0x8(%ebp),%ebx
10a38b: 8b 75 0c mov 0xc(%ebp),%esi
if ( !once_control || !init_routine )
10a38e: 85 f6 test %esi,%esi
10a390: 74 51 je 10a3e3 <pthread_once+0x63>
10a392: 85 db test %ebx,%ebx
10a394: 74 4d je 10a3e3 <pthread_once+0x63>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
10a396: 31 c0 xor %eax,%eax
)
{
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
10a398: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
10a39c: 75 4a jne 10a3e8 <pthread_once+0x68>
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
10a39e: 52 push %edx
10a39f: 8d 45 f4 lea -0xc(%ebp),%eax
10a3a2: 50 push %eax
10a3a3: 68 00 01 00 00 push $0x100
10a3a8: 68 00 01 00 00 push $0x100
10a3ad: e8 16 0a 00 00 call 10adc8 <rtems_task_mode>
if ( !once_control->init_executed ) {
10a3b2: 83 c4 10 add $0x10,%esp
10a3b5: 83 7b 04 00 cmpl $0x0,0x4(%ebx)
10a3b9: 75 0f jne 10a3ca <pthread_once+0x4a> <== NEVER TAKEN
once_control->is_initialized = true;
10a3bb: c7 03 01 00 00 00 movl $0x1,(%ebx)
once_control->init_executed = true;
10a3c1: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
(*init_routine)();
10a3c8: ff d6 call *%esi
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
10a3ca: 50 push %eax
10a3cb: 8d 45 f4 lea -0xc(%ebp),%eax
10a3ce: 50 push %eax
10a3cf: 68 00 01 00 00 push $0x100
10a3d4: ff 75 f4 pushl -0xc(%ebp)
10a3d7: e8 ec 09 00 00 call 10adc8 <rtems_task_mode>
10a3dc: 83 c4 10 add $0x10,%esp
}
return 0;
10a3df: 31 c0 xor %eax,%eax
10a3e1: eb 05 jmp 10a3e8 <pthread_once+0x68>
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
10a3e3: b8 16 00 00 00 mov $0x16,%eax
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
10a3e8: 8d 65 f8 lea -0x8(%ebp),%esp
10a3eb: 5b pop %ebx
10a3ec: 5e pop %esi
10a3ed: 5d pop %ebp
10a3ee: c3 ret
0010a220 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
10a220: 55 push %ebp
10a221: 89 e5 mov %esp,%ebp
10a223: 56 push %esi
10a224: 53 push %ebx
10a225: 83 ec 10 sub $0x10,%esp
10a228: 8b 75 08 mov 0x8(%ebp),%esi
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
10a22b: 85 f6 test %esi,%esi
10a22d: 75 05 jne 10a234 <pthread_rwlock_init+0x14>
10a22f: e9 8f 00 00 00 jmp 10a2c3 <pthread_rwlock_init+0xa3>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10a234: 8b 45 0c mov 0xc(%ebp),%eax
10a237: 85 c0 test %eax,%eax
10a239: 75 11 jne 10a24c <pthread_rwlock_init+0x2c>
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
10a23b: 83 ec 0c sub $0xc,%esp
10a23e: 8d 5d f0 lea -0x10(%ebp),%ebx
10a241: 53 push %ebx
10a242: e8 a1 06 00 00 call 10a8e8 <pthread_rwlockattr_init>
10a247: 83 c4 10 add $0x10,%esp
the_attr = &default_attr;
10a24a: 89 d8 mov %ebx,%eax
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10a24c: 83 38 00 cmpl $0x0,(%eax)
10a24f: 74 72 je 10a2c3 <pthread_rwlock_init+0xa3><== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
10a251: 83 78 04 00 cmpl $0x0,0x4(%eax)
10a255: 75 6c jne 10a2c3 <pthread_rwlock_init+0xa3><== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
10a257: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10a25e: a1 b4 31 13 00 mov 0x1331b4,%eax
10a263: 40 inc %eax
10a264: a3 b4 31 13 00 mov %eax,0x1331b4
return _Thread_Dispatch_disable_level;
10a269: a1 b4 31 13 00 mov 0x1331b4,%eax
* 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 *)
10a26e: 83 ec 0c sub $0xc,%esp
10a271: 68 b8 33 13 00 push $0x1333b8
10a276: e8 3d 24 00 00 call 10c6b8 <_Objects_Allocate>
10a27b: 89 c3 mov %eax,%ebx
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
10a27d: 83 c4 10 add $0x10,%esp
10a280: 85 c0 test %eax,%eax
10a282: 75 0c jne 10a290 <pthread_rwlock_init+0x70>
_Thread_Enable_dispatch();
10a284: e8 33 34 00 00 call 10d6bc <_Thread_Enable_dispatch>
return EAGAIN;
10a289: b8 0b 00 00 00 mov $0xb,%eax
10a28e: eb 38 jmp 10a2c8 <pthread_rwlock_init+0xa8>
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
10a290: 50 push %eax
10a291: 50 push %eax
10a292: 8d 45 ec lea -0x14(%ebp),%eax
10a295: 50 push %eax
10a296: 8d 43 10 lea 0x10(%ebx),%eax
10a299: 50 push %eax
10a29a: e8 c1 1e 00 00 call 10c160 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10a29f: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10a2a2: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10a2a5: 8b 15 d4 33 13 00 mov 0x1333d4,%edx
10a2ab: 89 1c 8a mov %ebx,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10a2ae: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
10a2b5: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10a2b7: e8 00 34 00 00 call 10d6bc <_Thread_Enable_dispatch>
10a2bc: 83 c4 10 add $0x10,%esp
return 0;
10a2bf: 31 c0 xor %eax,%eax
10a2c1: eb 05 jmp 10a2c8 <pthread_rwlock_init+0xa8>
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10a2c3: b8 16 00 00 00 mov $0x16,%eax
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10a2c8: 8d 65 f8 lea -0x8(%ebp),%esp
10a2cb: 5b pop %ebx
10a2cc: 5e pop %esi
10a2cd: 5d pop %ebp
10a2ce: c3 ret
0010ac10 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10ac10: 55 push %ebp
10ac11: 89 e5 mov %esp,%ebp
10ac13: 56 push %esi
10ac14: 53 push %ebx
10ac15: 83 ec 20 sub $0x20,%esp
10ac18: 8b 75 08 mov 0x8(%ebp),%esi
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10ac1b: 85 f6 test %esi,%esi
10ac1d: 75 05 jne 10ac24 <pthread_rwlock_timedrdlock+0x14>
10ac1f: e9 8a 00 00 00 jmp 10acae <pthread_rwlock_timedrdlock+0x9e>
*
* 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 );
10ac24: 50 push %eax
10ac25: 50 push %eax
10ac26: 8d 45 f4 lea -0xc(%ebp),%eax
10ac29: 50 push %eax
10ac2a: ff 75 0c pushl 0xc(%ebp)
10ac2d: e8 ce 56 00 00 call 110300 <_POSIX_Absolute_timeout_to_ticks>
10ac32: 89 c3 mov %eax,%ebx
10ac34: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10ac37: 8d 45 f0 lea -0x10(%ebp),%eax
10ac3a: 50 push %eax
10ac3b: ff 36 pushl (%esi)
10ac3d: 68 a0 15 13 00 push $0x1315a0
10ac42: e8 59 25 00 00 call 10d1a0 <_Objects_Get>
switch ( location ) {
10ac47: 83 c4 10 add $0x10,%esp
10ac4a: 83 7d f0 00 cmpl $0x0,-0x10(%ebp)
10ac4e: 75 5e jne 10acae <pthread_rwlock_timedrdlock+0x9e>
* 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 )
10ac50: 83 fb 03 cmp $0x3,%ebx
10ac53: 0f 94 c2 sete %dl
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
10ac56: 83 ec 0c sub $0xc,%esp
10ac59: 6a 00 push $0x0
10ac5b: ff 75 f4 pushl -0xc(%ebp)
10ac5e: 0f b6 ca movzbl %dl,%ecx
10ac61: 51 push %ecx
10ac62: ff 36 pushl (%esi)
10ac64: 83 c0 10 add $0x10,%eax
10ac67: 50 push %eax
10ac68: 88 55 e4 mov %dl,-0x1c(%ebp)
10ac6b: e8 d0 19 00 00 call 10c640 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10ac70: 83 c4 20 add $0x20,%esp
10ac73: e8 5c 30 00 00 call 10dcd4 <_Thread_Enable_dispatch>
if ( !do_wait ) {
10ac78: 8a 55 e4 mov -0x1c(%ebp),%dl
10ac7b: 84 d2 test %dl,%dl
10ac7d: 75 1a jne 10ac99 <pthread_rwlock_timedrdlock+0x89>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
10ac7f: a1 e4 18 13 00 mov 0x1318e4,%eax
10ac84: 83 78 34 02 cmpl $0x2,0x34(%eax)
10ac88: 75 0f jne 10ac99 <pthread_rwlock_timedrdlock+0x89>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10ac8a: 85 db test %ebx,%ebx
10ac8c: 74 20 je 10acae <pthread_rwlock_timedrdlock+0x9e><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10ac8e: 4b dec %ebx
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10ac8f: b8 74 00 00 00 mov $0x74,%eax
_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 ||
10ac94: 83 fb 01 cmp $0x1,%ebx
10ac97: 76 1a jbe 10acb3 <pthread_rwlock_timedrdlock+0xa3><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10ac99: 83 ec 0c sub $0xc,%esp
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
10ac9c: a1 e4 18 13 00 mov 0x1318e4,%eax
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10aca1: ff 70 34 pushl 0x34(%eax)
10aca4: e8 bf 00 00 00 call 10ad68 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10aca9: 83 c4 10 add $0x10,%esp
10acac: eb 05 jmp 10acb3 <pthread_rwlock_timedrdlock+0xa3>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10acae: b8 16 00 00 00 mov $0x16,%eax
}
10acb3: 8d 65 f8 lea -0x8(%ebp),%esp
10acb6: 5b pop %ebx
10acb7: 5e pop %esi
10acb8: 5d pop %ebp
10acb9: c3 ret
0010acbc <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10acbc: 55 push %ebp
10acbd: 89 e5 mov %esp,%ebp
10acbf: 56 push %esi
10acc0: 53 push %ebx
10acc1: 83 ec 20 sub $0x20,%esp
10acc4: 8b 75 08 mov 0x8(%ebp),%esi
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10acc7: 85 f6 test %esi,%esi
10acc9: 75 05 jne 10acd0 <pthread_rwlock_timedwrlock+0x14>
10accb: e9 8a 00 00 00 jmp 10ad5a <pthread_rwlock_timedwrlock+0x9e>
*
* 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 );
10acd0: 50 push %eax
10acd1: 50 push %eax
10acd2: 8d 45 f4 lea -0xc(%ebp),%eax
10acd5: 50 push %eax
10acd6: ff 75 0c pushl 0xc(%ebp)
10acd9: e8 22 56 00 00 call 110300 <_POSIX_Absolute_timeout_to_ticks>
10acde: 89 c3 mov %eax,%ebx
10ace0: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10ace3: 8d 45 f0 lea -0x10(%ebp),%eax
10ace6: 50 push %eax
10ace7: ff 36 pushl (%esi)
10ace9: 68 a0 15 13 00 push $0x1315a0
10acee: e8 ad 24 00 00 call 10d1a0 <_Objects_Get>
switch ( location ) {
10acf3: 83 c4 10 add $0x10,%esp
10acf6: 83 7d f0 00 cmpl $0x0,-0x10(%ebp)
10acfa: 75 5e jne 10ad5a <pthread_rwlock_timedwrlock+0x9e>
* 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 )
10acfc: 83 fb 03 cmp $0x3,%ebx
10acff: 0f 94 c2 sete %dl
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
10ad02: 83 ec 0c sub $0xc,%esp
10ad05: 6a 00 push $0x0
10ad07: ff 75 f4 pushl -0xc(%ebp)
10ad0a: 0f b6 ca movzbl %dl,%ecx
10ad0d: 51 push %ecx
10ad0e: ff 36 pushl (%esi)
10ad10: 83 c0 10 add $0x10,%eax
10ad13: 50 push %eax
10ad14: 88 55 e4 mov %dl,-0x1c(%ebp)
10ad17: e8 d4 19 00 00 call 10c6f0 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10ad1c: 83 c4 20 add $0x20,%esp
10ad1f: e8 b0 2f 00 00 call 10dcd4 <_Thread_Enable_dispatch>
if ( !do_wait &&
10ad24: 8a 55 e4 mov -0x1c(%ebp),%dl
10ad27: 84 d2 test %dl,%dl
10ad29: 75 1a jne 10ad45 <pthread_rwlock_timedwrlock+0x89>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
10ad2b: a1 e4 18 13 00 mov 0x1318e4,%eax
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10ad30: 83 78 34 02 cmpl $0x2,0x34(%eax)
10ad34: 75 0f jne 10ad45 <pthread_rwlock_timedwrlock+0x89>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10ad36: 85 db test %ebx,%ebx
10ad38: 74 20 je 10ad5a <pthread_rwlock_timedwrlock+0x9e><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10ad3a: 4b dec %ebx
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10ad3b: b8 74 00 00 00 mov $0x74,%eax
_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 ||
10ad40: 83 fb 01 cmp $0x1,%ebx
10ad43: 76 1a jbe 10ad5f <pthread_rwlock_timedwrlock+0xa3><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10ad45: 83 ec 0c sub $0xc,%esp
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
10ad48: a1 e4 18 13 00 mov 0x1318e4,%eax
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10ad4d: ff 70 34 pushl 0x34(%eax)
10ad50: e8 13 00 00 00 call 10ad68 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10ad55: 83 c4 10 add $0x10,%esp
10ad58: eb 05 jmp 10ad5f <pthread_rwlock_timedwrlock+0xa3>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10ad5a: b8 16 00 00 00 mov $0x16,%eax
}
10ad5f: 8d 65 f8 lea -0x8(%ebp),%esp
10ad62: 5b pop %ebx
10ad63: 5e pop %esi
10ad64: 5d pop %ebp
10ad65: c3 ret
0010b4b8 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
10b4b8: 55 push %ebp
10b4b9: 89 e5 mov %esp,%ebp
10b4bb: 8b 55 08 mov 0x8(%ebp),%edx
10b4be: 8b 4d 0c mov 0xc(%ebp),%ecx
if ( !attr )
return EINVAL;
10b4c1: b8 16 00 00 00 mov $0x16,%eax
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
10b4c6: 85 d2 test %edx,%edx
10b4c8: 74 0f je 10b4d9 <pthread_rwlockattr_setpshared+0x21>
return EINVAL;
if ( !attr->is_initialized )
10b4ca: 83 3a 00 cmpl $0x0,(%edx)
10b4cd: 74 0a je 10b4d9 <pthread_rwlockattr_setpshared+0x21>
return EINVAL;
switch ( pshared ) {
10b4cf: 83 f9 01 cmp $0x1,%ecx
10b4d2: 77 05 ja 10b4d9 <pthread_rwlockattr_setpshared+0x21><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10b4d4: 89 4a 04 mov %ecx,0x4(%edx)
return 0;
10b4d7: 30 c0 xor %al,%al
default:
return EINVAL;
}
}
10b4d9: 5d pop %ebp
10b4da: c3 ret
0010c2c4 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
10c2c4: 55 push %ebp
10c2c5: 89 e5 mov %esp,%ebp
10c2c7: 57 push %edi
10c2c8: 56 push %esi
10c2c9: 53 push %ebx
10c2ca: 83 ec 2c sub $0x2c,%esp
10c2cd: 8b 75 10 mov 0x10(%ebp),%esi
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
10c2d0: c7 45 d4 16 00 00 00 movl $0x16,-0x2c(%ebp)
int rc;
/*
* Check all the parameters
*/
if ( !param )
10c2d7: 85 f6 test %esi,%esi
10c2d9: 0f 84 f9 00 00 00 je 10c3d8 <pthread_setschedparam+0x114>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
10c2df: 8d 45 e0 lea -0x20(%ebp),%eax
10c2e2: 50 push %eax
10c2e3: 8d 45 dc lea -0x24(%ebp),%eax
10c2e6: 50 push %eax
10c2e7: 56 push %esi
10c2e8: ff 75 0c pushl 0xc(%ebp)
10c2eb: e8 8c 4e 00 00 call 11117c <_POSIX_Thread_Translate_sched_param>
10c2f0: 89 45 d4 mov %eax,-0x2c(%ebp)
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
10c2f3: 83 c4 10 add $0x10,%esp
10c2f6: 85 c0 test %eax,%eax
10c2f8: 0f 85 da 00 00 00 jne 10c3d8 <pthread_setschedparam+0x114>
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _Thread_Get( thread, &location );
10c2fe: 53 push %ebx
10c2ff: 53 push %ebx
10c300: 8d 45 e4 lea -0x1c(%ebp),%eax
10c303: 50 push %eax
10c304: ff 75 08 pushl 0x8(%ebp)
10c307: e8 d4 26 00 00 call 10e9e0 <_Thread_Get>
10c30c: 89 c2 mov %eax,%edx
switch ( location ) {
10c30e: 83 c4 10 add $0x10,%esp
10c311: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
10c315: 0f 85 b6 00 00 00 jne 10c3d1 <pthread_setschedparam+0x10d>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10c31b: 8b 98 e8 00 00 00 mov 0xe8(%eax),%ebx
if ( api->schedpolicy == SCHED_SPORADIC )
10c321: 83 bb 84 00 00 00 04 cmpl $0x4,0x84(%ebx)
10c328: 75 18 jne 10c342 <pthread_setschedparam+0x7e>
(void) _Watchdog_Remove( &api->Sporadic_timer );
10c32a: 83 ec 0c sub $0xc,%esp
10c32d: 8d 83 a8 00 00 00 lea 0xa8(%ebx),%eax
10c333: 50 push %eax
10c334: 89 55 d0 mov %edx,-0x30(%ebp)
10c337: e8 ec 33 00 00 call 10f728 <_Watchdog_Remove>
10c33c: 83 c4 10 add $0x10,%esp
10c33f: 8b 55 d0 mov -0x30(%ebp),%edx
api->schedpolicy = policy;
10c342: 8b 45 0c mov 0xc(%ebp),%eax
10c345: 89 83 84 00 00 00 mov %eax,0x84(%ebx)
api->schedparam = *param;
10c34b: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi
10c351: b9 07 00 00 00 mov $0x7,%ecx
10c356: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_thread->budget_algorithm = budget_algorithm;
10c358: 8b 45 dc mov -0x24(%ebp),%eax
10c35b: 89 42 78 mov %eax,0x78(%edx)
the_thread->budget_callout = budget_callout;
10c35e: 8b 45 e0 mov -0x20(%ebp),%eax
10c361: 89 42 7c mov %eax,0x7c(%edx)
switch ( api->schedpolicy ) {
10c364: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)
10c368: 78 60 js 10c3ca <pthread_setschedparam+0x106><== NEVER TAKEN
10c36a: 83 7d 0c 02 cmpl $0x2,0xc(%ebp)
10c36e: 7e 08 jle 10c378 <pthread_setschedparam+0xb4>
10c370: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10c374: 75 54 jne 10c3ca <pthread_setschedparam+0x106><== NEVER TAKEN
10c376: eb 24 jmp 10c39c <pthread_setschedparam+0xd8>
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10c378: a1 08 34 13 00 mov 0x133408,%eax
10c37d: 89 42 74 mov %eax,0x74(%edx)
10c380: 0f b6 05 88 f1 12 00 movzbl 0x12f188,%eax
10c387: 2b 83 88 00 00 00 sub 0x88(%ebx),%eax
the_thread->real_priority =
10c38d: 89 42 18 mov %eax,0x18(%edx)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
10c390: 51 push %ecx
10c391: 6a 01 push $0x1
10c393: 50 push %eax
10c394: 52 push %edx
10c395: e8 36 22 00 00 call 10e5d0 <_Thread_Change_priority>
10c39a: eb 2b jmp 10c3c7 <pthread_setschedparam+0x103>
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
10c39c: 8b 83 88 00 00 00 mov 0x88(%ebx),%eax
10c3a2: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
_Watchdog_Remove( &api->Sporadic_timer );
10c3a8: 83 ec 0c sub $0xc,%esp
10c3ab: 81 c3 a8 00 00 00 add $0xa8,%ebx
10c3b1: 53 push %ebx
10c3b2: 89 55 d0 mov %edx,-0x30(%ebp)
10c3b5: e8 6e 33 00 00 call 10f728 <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
10c3ba: 58 pop %eax
10c3bb: 5a pop %edx
10c3bc: 8b 55 d0 mov -0x30(%ebp),%edx
10c3bf: 52 push %edx
10c3c0: 6a 00 push $0x0
10c3c2: e8 ea fd ff ff call 10c1b1 <_POSIX_Threads_Sporadic_budget_TSR>
break;
10c3c7: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10c3ca: e8 f1 25 00 00 call 10e9c0 <_Thread_Enable_dispatch>
10c3cf: eb 07 jmp 10c3d8 <pthread_setschedparam+0x114>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10c3d1: c7 45 d4 03 00 00 00 movl $0x3,-0x2c(%ebp)
}
10c3d8: 8b 45 d4 mov -0x2c(%ebp),%eax
10c3db: 8d 65 f4 lea -0xc(%ebp),%esp
10c3de: 5b pop %ebx
10c3df: 5e pop %esi
10c3e0: 5f pop %edi
10c3e1: 5d pop %ebp
10c3e2: c3 ret
0010a130 <pthread_testcancel>:
* 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() )
10a130: 83 3d d8 f8 12 00 00 cmpl $0x0,0x12f8d8
10a137: 75 57 jne 10a190 <pthread_testcancel+0x60><== NEVER TAKEN
/*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
10a139: 55 push %ebp
10a13a: 89 e5 mov %esp,%ebp
10a13c: 53 push %ebx
10a13d: 52 push %edx
*/
if ( _ISR_Is_in_progress() )
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10a13e: a1 dc f8 12 00 mov 0x12f8dc,%eax
10a143: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10a149: 8b 15 d4 f3 12 00 mov 0x12f3d4,%edx
10a14f: 42 inc %edx
10a150: 89 15 d4 f3 12 00 mov %edx,0x12f3d4
return _Thread_Dispatch_disable_level;
10a156: 8b 15 d4 f3 12 00 mov 0x12f3d4,%edx
*/
void pthread_testcancel( void )
{
POSIX_API_Control *thread_support;
bool cancel = false;
10a15c: 31 db xor %ebx,%ebx
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
10a15e: 83 b8 d8 00 00 00 00 cmpl $0x0,0xd8(%eax)
10a165: 75 0a jne 10a171 <pthread_testcancel+0x41><== NEVER TAKEN
10a167: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax)
10a16e: 0f 95 c3 setne %bl
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
10a171: e8 16 25 00 00 call 10c68c <_Thread_Enable_dispatch>
if ( cancel )
10a176: 84 db test %bl,%bl
10a178: 74 12 je 10a18c <pthread_testcancel+0x5c>
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
10a17a: 50 push %eax
10a17b: 50 push %eax
10a17c: 6a ff push $0xffffffff
10a17e: ff 35 dc f8 12 00 pushl 0x12f8dc
10a184: e8 8f 4d 00 00 call 10ef18 <_POSIX_Thread_Exit>
10a189: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
10a18c: 8b 5d fc mov -0x4(%ebp),%ebx
10a18f: c9 leave
10a190: c3 ret
0010a4fa <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
10a4fa: 55 push %ebp
10a4fb: 89 e5 mov %esp,%ebp
10a4fd: 57 push %edi
10a4fe: 56 push %esi
10a4ff: 53 push %ebx
10a500: 83 ec 58 sub $0x58,%esp
10a503: 8b 5d 08 mov 0x8(%ebp),%ebx
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);
10a506: 68 08 03 13 00 push $0x130308
10a50b: e8 f8 08 00 00 call 10ae08 <pthread_mutex_lock>
10a510: 89 c7 mov %eax,%edi
if (result != 0) {
10a512: 83 c4 10 add $0x10,%esp
10a515: 85 c0 test %eax,%eax
10a517: 74 0e je 10a527 <rtems_aio_enqueue+0x2d><== ALWAYS TAKEN
free (req);
10a519: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a51c: 53 push %ebx <== NOT EXECUTED
10a51d: e8 36 c6 ff ff call 106b58 <free> <== NOT EXECUTED
10a522: e9 a8 01 00 00 jmp 10a6cf <rtems_aio_enqueue+0x1d5><== NOT EXECUTED
return result;
}
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
10a527: e8 cc 10 00 00 call 10b5f8 <pthread_self>
10a52c: 52 push %edx
10a52d: 8d 55 cc lea -0x34(%ebp),%edx
10a530: 52 push %edx
10a531: 8d 55 c8 lea -0x38(%ebp),%edx
10a534: 52 push %edx
10a535: 50 push %eax
10a536: e8 f1 0c 00 00 call 10b22c <pthread_getschedparam>
req->caller_thread = pthread_self ();
10a53b: e8 b8 10 00 00 call 10b5f8 <pthread_self>
10a540: 89 43 10 mov %eax,0x10(%ebx)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
10a543: 8b 43 14 mov 0x14(%ebx),%eax
10a546: 8b 55 cc mov -0x34(%ebp),%edx
10a549: 2b 50 14 sub 0x14(%eax),%edx
10a54c: 89 53 0c mov %edx,0xc(%ebx)
req->policy = policy;
10a54f: 8b 55 c8 mov -0x38(%ebp),%edx
10a552: 89 53 08 mov %edx,0x8(%ebx)
req->aiocbp->error_code = EINPROGRESS;
10a555: c7 40 30 77 00 00 00 movl $0x77,0x30(%eax)
req->aiocbp->return_value = 0;
10a55c: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
if ((aio_request_queue.idle_threads == 0) &&
10a563: 83 c4 10 add $0x10,%esp
10a566: 83 3d 70 03 13 00 00 cmpl $0x0,0x130370
10a56d: 0f 85 97 00 00 00 jne 10a60a <rtems_aio_enqueue+0x110><== NEVER TAKEN
10a573: 83 3d 6c 03 13 00 04 cmpl $0x4,0x13036c
10a57a: 0f 8f 8a 00 00 00 jg 10a60a <rtems_aio_enqueue+0x110>
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);
10a580: 56 push %esi
10a581: 6a 01 push $0x1
10a583: ff 30 pushl (%eax)
10a585: 68 50 03 13 00 push $0x130350
10a58a: e8 30 fe ff ff call 10a3bf <rtems_aio_search_fd>
10a58f: 89 c6 mov %eax,%esi
if (r_chain->new_fd == 1) {
10a591: 83 c4 10 add $0x10,%esp
10a594: 83 78 18 01 cmpl $0x1,0x18(%eax)
10a598: 0f 85 84 00 00 00 jne 10a622 <rtems_aio_enqueue+0x128>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10a59e: 50 push %eax
10a59f: 50 push %eax
10a5a0: 53 push %ebx
10a5a1: 8d 46 08 lea 0x8(%esi),%eax
10a5a4: 50 push %eax
10a5a5: e8 96 1f 00 00 call 10c540 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10a5aa: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi)
pthread_mutex_init (&r_chain->mutex, NULL);
10a5b1: 58 pop %eax
10a5b2: 5a pop %edx
10a5b3: 6a 00 push $0x0
10a5b5: 8d 46 1c lea 0x1c(%esi),%eax
10a5b8: 50 push %eax
10a5b9: e8 22 07 00 00 call 10ace0 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10a5be: 59 pop %ecx
10a5bf: 5b pop %ebx
10a5c0: 6a 00 push $0x0
10a5c2: 8d 46 20 lea 0x20(%esi),%eax
10a5c5: 50 push %eax
10a5c6: e8 c9 03 00 00 call 10a994 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
10a5cb: 56 push %esi
10a5cc: 68 34 a0 10 00 push $0x10a034
10a5d1: 68 10 03 13 00 push $0x130310
10a5d6: 8d 45 c4 lea -0x3c(%ebp),%eax
10a5d9: 50 push %eax
10a5da: e8 25 0a 00 00 call 10b004 <pthread_create>
10a5df: 89 c3 mov %eax,%ebx
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
10a5e1: 83 c4 20 add $0x20,%esp
10a5e4: 85 c0 test %eax,%eax
10a5e6: 74 17 je 10a5ff <rtems_aio_enqueue+0x105><== ALWAYS TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
10a5e8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a5eb: 68 08 03 13 00 push $0x130308 <== NOT EXECUTED
10a5f0: e8 93 08 00 00 call 10ae88 <pthread_mutex_unlock> <== NOT EXECUTED
10a5f5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10a5f8: 89 df mov %ebx,%edi <== NOT EXECUTED
10a5fa: e9 d3 00 00 00 jmp 10a6d2 <rtems_aio_enqueue+0x1d8><== NOT EXECUTED
return result;
}
++aio_request_queue.active_threads;
10a5ff: ff 05 6c 03 13 00 incl 0x13036c
10a605: e9 b8 00 00 00 jmp 10a6c2 <rtems_aio_enqueue+0x1c8>
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,
10a60a: 56 push %esi
10a60b: 6a 00 push $0x0
10a60d: ff 30 pushl (%eax)
10a60f: 68 50 03 13 00 push $0x130350
10a614: e8 a6 fd ff ff call 10a3bf <rtems_aio_search_fd>
10a619: 89 c6 mov %eax,%esi
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
10a61b: 83 c4 10 add $0x10,%esp
10a61e: 85 c0 test %eax,%eax
10a620: 74 31 je 10a653 <rtems_aio_enqueue+0x159>
{
pthread_mutex_lock (&r_chain->mutex);
10a622: 8d 4e 1c lea 0x1c(%esi),%ecx
10a625: 83 ec 0c sub $0xc,%esp
10a628: 51 push %ecx
10a629: 89 4d b4 mov %ecx,-0x4c(%ebp)
10a62c: e8 d7 07 00 00 call 10ae08 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
10a631: 8d 46 08 lea 0x8(%esi),%eax
10a634: 89 da mov %ebx,%edx
10a636: e8 3d fc ff ff call 10a278 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
10a63b: 83 c6 20 add $0x20,%esi
10a63e: 89 34 24 mov %esi,(%esp)
10a641: e8 ee 03 00 00 call 10aa34 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
10a646: 8b 4d b4 mov -0x4c(%ebp),%ecx
10a649: 89 0c 24 mov %ecx,(%esp)
10a64c: e8 37 08 00 00 call 10ae88 <pthread_mutex_unlock>
10a651: eb 6c jmp 10a6bf <rtems_aio_enqueue+0x1c5>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
10a653: 51 push %ecx
10a654: 6a 01 push $0x1
10a656: 8b 43 14 mov 0x14(%ebx),%eax
10a659: ff 30 pushl (%eax)
10a65b: 68 5c 03 13 00 push $0x13035c
10a660: e8 5a fd ff ff call 10a3bf <rtems_aio_search_fd>
10a665: 89 c6 mov %eax,%esi
if (r_chain->new_fd == 1) {
10a667: 83 c4 10 add $0x10,%esp
10a66a: 83 78 18 01 cmpl $0x1,0x18(%eax)
10a66e: 8d 40 08 lea 0x8(%eax),%eax
10a671: 75 2f jne 10a6a2 <rtems_aio_enqueue+0x1a8>
10a673: 52 push %edx
10a674: 52 push %edx
10a675: 53 push %ebx
10a676: 50 push %eax
10a677: e8 c4 1e 00 00 call 10c540 <_Chain_Insert>
/* If this is a new fd chain we signal the idle threads that
might be waiting for requests */
AIO_printf (" New chain on waiting queue \n ");
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10a67c: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi)
pthread_mutex_init (&r_chain->mutex, NULL);
10a683: 59 pop %ecx
10a684: 5b pop %ebx
10a685: 6a 00 push $0x0
10a687: 8d 46 1c lea 0x1c(%esi),%eax
10a68a: 50 push %eax
10a68b: e8 50 06 00 00 call 10ace0 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10a690: 58 pop %eax
10a691: 5a pop %edx
10a692: 6a 00 push $0x0
10a694: 83 c6 20 add $0x20,%esi
10a697: 56 push %esi
10a698: e8 f7 02 00 00 call 10a994 <pthread_cond_init>
10a69d: 83 c4 10 add $0x10,%esp
10a6a0: eb 07 jmp 10a6a9 <rtems_aio_enqueue+0x1af>
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
10a6a2: 89 da mov %ebx,%edx
10a6a4: e8 cf fb ff ff call 10a278 <rtems_aio_insert_prio>
if (aio_request_queue.idle_threads > 0)
10a6a9: 83 3d 70 03 13 00 00 cmpl $0x0,0x130370
10a6b0: 7e 10 jle 10a6c2 <rtems_aio_enqueue+0x1c8><== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
10a6b2: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a6b5: 68 0c 03 13 00 push $0x13030c <== NOT EXECUTED
10a6ba: e8 75 03 00 00 call 10aa34 <pthread_cond_signal> <== NOT EXECUTED
10a6bf: 83 c4 10 add $0x10,%esp
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
10a6c2: 83 ec 0c sub $0xc,%esp
10a6c5: 68 08 03 13 00 push $0x130308
10a6ca: e8 b9 07 00 00 call 10ae88 <pthread_mutex_unlock>
10a6cf: 83 c4 10 add $0x10,%esp
return 0;
}
10a6d2: 89 f8 mov %edi,%eax
10a6d4: 8d 65 f4 lea -0xc(%ebp),%esp
10a6d7: 5b pop %ebx
10a6d8: 5e pop %esi
10a6d9: 5f pop %edi
10a6da: 5d pop %ebp
10a6db: c3 ret
0010a034 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
10a034: 55 push %ebp
10a035: 89 e5 mov %esp,%ebp
10a037: 57 push %edi
10a038: 56 push %esi
10a039: 53 push %ebx
10a03a: 83 ec 4c sub $0x4c,%esp
rtems_aio_request_chain *r_chain = arg;
10a03d: 8b 5d 08 mov 0x8(%ebp),%ebx
/* 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);
10a040: 8d 7b 1c lea 0x1c(%ebx),%edi
10a043: 83 ec 0c sub $0xc,%esp
10a046: 57 push %edi
10a047: e8 bc 0d 00 00 call 10ae08 <pthread_mutex_lock>
if (result != 0)
10a04c: 83 c4 10 add $0x10,%esp
10a04f: 85 c0 test %eax,%eax
10a051: 0f 85 17 02 00 00 jne 10a26e <rtems_aio_handle+0x23a><== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
10a057: 8b 73 08 mov 0x8(%ebx),%esi
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10a05a: 8d 43 0c lea 0xc(%ebx),%eax
/* 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)) {
10a05d: 39 c6 cmp %eax,%esi
10a05f: 0f 84 cc 00 00 00 je 10a131 <rtems_aio_handle+0xfd>
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);
10a065: e8 8e 15 00 00 call 10b5f8 <pthread_self>
10a06a: 52 push %edx
10a06b: 8d 55 cc lea -0x34(%ebp),%edx
10a06e: 52 push %edx
10a06f: 8d 55 c0 lea -0x40(%ebp),%edx
10a072: 52 push %edx
10a073: 50 push %eax
10a074: e8 b3 11 00 00 call 10b22c <pthread_getschedparam>
param.sched_priority = req->priority;
10a079: 8b 46 0c mov 0xc(%esi),%eax
10a07c: 89 45 cc mov %eax,-0x34(%ebp)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
10a07f: 8b 56 08 mov 0x8(%esi),%edx
10a082: 89 55 b4 mov %edx,-0x4c(%ebp)
10a085: e8 6e 15 00 00 call 10b5f8 <pthread_self>
10a08a: 83 c4 0c add $0xc,%esp
10a08d: 8d 4d cc lea -0x34(%ebp),%ecx
10a090: 51 push %ecx
10a091: 8b 55 b4 mov -0x4c(%ebp),%edx
10a094: 52 push %edx
10a095: 50 push %eax
10a096: e8 6d 15 00 00 call 10b608 <pthread_setschedparam>
10a09b: 89 34 24 mov %esi,(%esp)
10a09e: e8 61 24 00 00 call 10c504 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
10a0a3: 89 3c 24 mov %edi,(%esp)
10a0a6: e8 dd 0d 00 00 call 10ae88 <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
10a0ab: 8b 46 14 mov 0x14(%esi),%eax
10a0ae: 83 c4 10 add $0x10,%esp
10a0b1: 8b 50 2c mov 0x2c(%eax),%edx
10a0b4: 83 fa 02 cmp $0x2,%edx
10a0b7: 74 20 je 10a0d9 <rtems_aio_handle+0xa5>
10a0b9: 83 fa 03 cmp $0x3,%edx
10a0bc: 74 36 je 10a0f4 <rtems_aio_handle+0xc0> <== NEVER TAKEN
10a0be: 4a dec %edx
10a0bf: 75 45 jne 10a106 <rtems_aio_handle+0xd2> <== NEVER TAKEN
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
10a0c1: 83 ec 0c sub $0xc,%esp
10a0c4: ff 70 08 pushl 0x8(%eax)
10a0c7: ff 70 04 pushl 0x4(%eax)
10a0ca: ff 70 10 pushl 0x10(%eax)
10a0cd: ff 70 0c pushl 0xc(%eax)
10a0d0: ff 30 pushl (%eax)
10a0d2: e8 09 96 00 00 call 1136e0 <pread>
10a0d7: eb 16 jmp 10a0ef <rtems_aio_handle+0xbb>
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
10a0d9: 83 ec 0c sub $0xc,%esp
10a0dc: ff 70 08 pushl 0x8(%eax)
10a0df: ff 70 04 pushl 0x4(%eax)
10a0e2: ff 70 10 pushl 0x10(%eax)
10a0e5: ff 70 0c pushl 0xc(%eax)
10a0e8: ff 30 pushl (%eax)
10a0ea: e8 f1 96 00 00 call 1137e0 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10a0ef: 83 c4 20 add $0x20,%esp
10a0f2: eb 0d jmp 10a101 <rtems_aio_handle+0xcd>
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
10a0f4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a0f7: ff 30 pushl (%eax) <== NOT EXECUTED
10a0f9: e8 56 5a 00 00 call 10fb54 <fsync> <== NOT EXECUTED
break;
10a0fe: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
10a101: 83 f8 ff cmp $0xffffffff,%eax
10a104: 75 19 jne 10a11f <rtems_aio_handle+0xeb> <== ALWAYS TAKEN
req->aiocbp->return_value = -1;
10a106: 8b 76 14 mov 0x14(%esi),%esi <== NOT EXECUTED
10a109: c7 46 34 ff ff ff ff movl $0xffffffff,0x34(%esi) <== NOT EXECUTED
req->aiocbp->error_code = errno;
10a110: e8 07 8c 00 00 call 112d1c <__errno> <== NOT EXECUTED
10a115: 8b 00 mov (%eax),%eax <== NOT EXECUTED
10a117: 89 46 30 mov %eax,0x30(%esi) <== NOT EXECUTED
10a11a: e9 21 ff ff ff jmp 10a040 <rtems_aio_handle+0xc> <== NOT EXECUTED
} else {
req->aiocbp->return_value = result;
10a11f: 8b 56 14 mov 0x14(%esi),%edx
10a122: 89 42 34 mov %eax,0x34(%edx)
req->aiocbp->error_code = 0;
10a125: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
10a12c: e9 0f ff ff ff jmp 10a040 <rtems_aio_handle+0xc>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
10a131: 83 ec 0c sub $0xc,%esp
10a134: 57 push %edi
10a135: e8 4e 0d 00 00 call 10ae88 <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
10a13a: c7 04 24 08 03 13 00 movl $0x130308,(%esp)
10a141: e8 c2 0c 00 00 call 10ae08 <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
10a146: 83 c4 10 add $0x10,%esp
10a149: 39 73 08 cmp %esi,0x8(%ebx)
10a14c: 0f 85 07 01 00 00 jne 10a259 <rtems_aio_handle+0x225><== NEVER TAKEN
{
clock_gettime (CLOCK_REALTIME, &timeout);
10a152: 56 push %esi
10a153: 56 push %esi
10a154: 8d 45 c4 lea -0x3c(%ebp),%eax
10a157: 50 push %eax
10a158: 6a 01 push $0x1
10a15a: e8 e1 06 00 00 call 10a840 <clock_gettime>
timeout.tv_sec += 3;
10a15f: 83 45 c4 03 addl $0x3,-0x3c(%ebp)
timeout.tv_nsec = 0;
10a163: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
result = pthread_cond_timedwait (&r_chain->cond,
10a16a: 8d 73 20 lea 0x20(%ebx),%esi
10a16d: 83 c4 0c add $0xc,%esp
10a170: 8d 55 c4 lea -0x3c(%ebp),%edx
10a173: 52 push %edx
10a174: 68 08 03 13 00 push $0x130308
10a179: 56 push %esi
10a17a: e8 29 09 00 00 call 10aaa8 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no requests were added to the chain we delete the fd chain from
the queue and start working with idle fd chains */
if (result == ETIMEDOUT) {
10a17f: 83 c4 10 add $0x10,%esp
10a182: 83 f8 74 cmp $0x74,%eax
10a185: 0f 85 ce 00 00 00 jne 10a259 <rtems_aio_handle+0x225><== NEVER TAKEN
10a18b: 83 ec 0c sub $0xc,%esp
10a18e: 53 push %ebx
10a18f: e8 70 23 00 00 call 10c504 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
10a194: 89 3c 24 mov %edi,(%esp)
10a197: e8 40 0a 00 00 call 10abdc <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
10a19c: 89 34 24 mov %esi,(%esp)
10a19f: e8 34 07 00 00 call 10a8d8 <pthread_cond_destroy>
free (r_chain);
10a1a4: 89 1c 24 mov %ebx,(%esp)
10a1a7: e8 ac c9 ff ff call 106b58 <free>
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10a1ac: 83 c4 10 add $0x10,%esp
10a1af: 81 3d 5c 03 13 00 60 cmpl $0x130360,0x13035c
10a1b6: 03 13 00
10a1b9: 75 5a jne 10a215 <rtems_aio_handle+0x1e1>
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
10a1bb: ff 05 70 03 13 00 incl 0x130370
--aio_request_queue.active_threads;
10a1c1: ff 0d 6c 03 13 00 decl 0x13036c
clock_gettime (CLOCK_REALTIME, &timeout);
10a1c7: 51 push %ecx
10a1c8: 51 push %ecx
10a1c9: 8d 4d c4 lea -0x3c(%ebp),%ecx
10a1cc: 51 push %ecx
10a1cd: 6a 01 push $0x1
10a1cf: e8 6c 06 00 00 call 10a840 <clock_gettime>
timeout.tv_sec += 3;
10a1d4: 83 45 c4 03 addl $0x3,-0x3c(%ebp)
timeout.tv_nsec = 0;
10a1d8: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
result = pthread_cond_timedwait (&aio_request_queue.new_req,
10a1df: 83 c4 0c add $0xc,%esp
10a1e2: 8d 45 c4 lea -0x3c(%ebp),%eax
10a1e5: 50 push %eax
10a1e6: 68 08 03 13 00 push $0x130308
10a1eb: 68 0c 03 13 00 push $0x13030c
10a1f0: e8 b3 08 00 00 call 10aaa8 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
10a1f5: 83 c4 10 add $0x10,%esp
10a1f8: 83 f8 74 cmp $0x74,%eax
10a1fb: 75 18 jne 10a215 <rtems_aio_handle+0x1e1><== NEVER TAKEN
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
10a1fd: ff 0d 70 03 13 00 decl 0x130370
pthread_mutex_unlock (&aio_request_queue.mutex);
10a203: 83 ec 0c sub $0xc,%esp
10a206: 68 08 03 13 00 push $0x130308
10a20b: e8 78 0c 00 00 call 10ae88 <pthread_mutex_unlock>
10a210: 83 c4 10 add $0x10,%esp
10a213: eb 59 jmp 10a26e <rtems_aio_handle+0x23a>
}
}
/* 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;
10a215: ff 0d 70 03 13 00 decl 0x130370
++aio_request_queue.active_threads;
10a21b: ff 05 6c 03 13 00 incl 0x13036c
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
10a221: 8b 1d 5c 03 13 00 mov 0x13035c,%ebx
10a227: 83 ec 0c sub $0xc,%esp
10a22a: 53 push %ebx
10a22b: e8 d4 22 00 00 call 10c504 <_Chain_Extract>
10a230: a1 50 03 13 00 mov 0x130350,%eax
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 &&
10a235: 8b 53 14 mov 0x14(%ebx),%edx
10a238: 83 c4 10 add $0x10,%esp
10a23b: eb 02 jmp 10a23f <rtems_aio_handle+0x20b>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10a23d: 8b 00 mov (%eax),%eax
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 &&
10a23f: 39 50 14 cmp %edx,0x14(%eax)
10a242: 7d 07 jge 10a24b <rtems_aio_handle+0x217>
10a244: 3d 54 03 13 00 cmp $0x130354,%eax
10a249: 75 f2 jne 10a23d <rtems_aio_handle+0x209><== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
10a24b: 52 push %edx
10a24c: 52 push %edx
10a24d: 53 push %ebx
10a24e: ff 70 04 pushl 0x4(%eax)
10a251: e8 ea 22 00 00 call 10c540 <_Chain_Insert>
10a256: 83 c4 10 add $0x10,%esp
}
}
/* 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);
10a259: 83 ec 0c sub $0xc,%esp
10a25c: 68 08 03 13 00 push $0x130308
10a261: e8 22 0c 00 00 call 10ae88 <pthread_mutex_unlock>
10a266: 83 c4 10 add $0x10,%esp
10a269: e9 d2 fd ff ff jmp 10a040 <rtems_aio_handle+0xc>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10a26e: 31 c0 xor %eax,%eax
10a270: 8d 65 f4 lea -0xc(%ebp),%esp
10a273: 5b pop %ebx
10a274: 5e pop %esi
10a275: 5f pop %edi
10a276: 5d pop %ebp
10a277: c3 ret
0010a2c3 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
10a2c3: 55 push %ebp
10a2c4: 89 e5 mov %esp,%ebp
10a2c6: 53 push %ebx
10a2c7: 83 ec 10 sub $0x10,%esp
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
10a2ca: 68 10 03 13 00 push $0x130310
10a2cf: e8 e4 0c 00 00 call 10afb8 <pthread_attr_init>
10a2d4: 89 c3 mov %eax,%ebx
if (result != 0)
10a2d6: 83 c4 10 add $0x10,%esp
10a2d9: 85 c0 test %eax,%eax
10a2db: 0f 85 d7 00 00 00 jne 10a3b8 <rtems_aio_init+0xf5> <== NEVER TAKEN
return result;
result =
10a2e1: 50 push %eax
10a2e2: 50 push %eax
10a2e3: 6a 00 push $0x0
10a2e5: 68 10 03 13 00 push $0x130310
10a2ea: e8 f1 0c 00 00 call 10afe0 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
10a2ef: 83 c4 10 add $0x10,%esp
10a2f2: 85 c0 test %eax,%eax
10a2f4: 74 10 je 10a306 <rtems_aio_init+0x43> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
10a2f6: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a2f9: 68 10 03 13 00 push $0x130310 <== NOT EXECUTED
10a2fe: e8 95 0c 00 00 call 10af98 <pthread_attr_destroy> <== NOT EXECUTED
10a303: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
10a306: 50 push %eax
10a307: 50 push %eax
10a308: 6a 00 push $0x0
10a30a: 68 08 03 13 00 push $0x130308
10a30f: e8 cc 09 00 00 call 10ace0 <pthread_mutex_init>
if (result != 0)
10a314: 83 c4 10 add $0x10,%esp
10a317: 85 c0 test %eax,%eax
10a319: 74 10 je 10a32b <rtems_aio_init+0x68> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
10a31b: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a31e: 68 10 03 13 00 push $0x130310 <== NOT EXECUTED
10a323: e8 70 0c 00 00 call 10af98 <pthread_attr_destroy> <== NOT EXECUTED
10a328: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
10a32b: 50 push %eax
10a32c: 50 push %eax
10a32d: 6a 00 push $0x0
10a32f: 68 0c 03 13 00 push $0x13030c
10a334: e8 5b 06 00 00 call 10a994 <pthread_cond_init>
10a339: 89 c3 mov %eax,%ebx
if (result != 0) {
10a33b: 83 c4 10 add $0x10,%esp
10a33e: 85 c0 test %eax,%eax
10a340: 74 1c je 10a35e <rtems_aio_init+0x9b> <== ALWAYS TAKEN
pthread_mutex_destroy (&aio_request_queue.mutex);
10a342: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10a345: 68 08 03 13 00 push $0x130308 <== NOT EXECUTED
10a34a: e8 8d 08 00 00 call 10abdc <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
10a34f: c7 04 24 10 03 13 00 movl $0x130310,(%esp) <== NOT EXECUTED
10a356: e8 3d 0c 00 00 call 10af98 <pthread_attr_destroy> <== NOT EXECUTED
10a35b: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10a35e: c7 05 50 03 13 00 54 movl $0x130354,0x130350
10a365: 03 13 00
head->previous = NULL;
10a368: c7 05 54 03 13 00 00 movl $0x0,0x130354
10a36f: 00 00 00
tail->previous = head;
10a372: c7 05 58 03 13 00 50 movl $0x130350,0x130358
10a379: 03 13 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10a37c: c7 05 5c 03 13 00 60 movl $0x130360,0x13035c
10a383: 03 13 00
head->previous = NULL;
10a386: c7 05 60 03 13 00 00 movl $0x0,0x130360
10a38d: 00 00 00
tail->previous = head;
10a390: c7 05 64 03 13 00 5c movl $0x13035c,0x130364
10a397: 03 13 00
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
10a39a: c7 05 6c 03 13 00 00 movl $0x0,0x13036c
10a3a1: 00 00 00
aio_request_queue.idle_threads = 0;
10a3a4: c7 05 70 03 13 00 00 movl $0x0,0x130370
10a3ab: 00 00 00
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
10a3ae: c7 05 68 03 13 00 0b movl $0xb00b,0x130368
10a3b5: b0 00 00
return result;
}
10a3b8: 89 d8 mov %ebx,%eax
10a3ba: 8b 5d fc mov -0x4(%ebp),%ebx
10a3bd: c9 leave
10a3be: c3 ret
0010a278 <rtems_aio_insert_prio>:
* NONE
*/
static void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
10a278: 55 push %ebp
10a279: 89 e5 mov %esp,%ebp
10a27b: 56 push %esi
10a27c: 53 push %ebx
10a27d: 8b 08 mov (%eax),%ecx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10a27f: 8d 58 04 lea 0x4(%eax),%ebx
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
10a282: 39 d9 cmp %ebx,%ecx
10a284: 75 06 jne 10a28c <rtems_aio_insert_prio+0x14><== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10a286: 56 push %esi <== NOT EXECUTED
10a287: 56 push %esi <== NOT EXECUTED
10a288: 52 push %edx <== NOT EXECUTED
10a289: 50 push %eax <== NOT EXECUTED
10a28a: eb 20 jmp 10a2ac <rtems_aio_insert_prio+0x34><== NOT EXECUTED
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;
10a28c: 8b 41 14 mov 0x14(%ecx),%eax
10a28f: 8b 40 14 mov 0x14(%eax),%eax
while (req->aiocbp->aio_reqprio > prio &&
10a292: 8b 72 14 mov 0x14(%edx),%esi
10a295: 8b 76 14 mov 0x14(%esi),%esi
10a298: eb 08 jmp 10a2a2 <rtems_aio_insert_prio+0x2a>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10a29a: 8b 09 mov (%ecx),%ecx <== 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;
10a29c: 8b 41 14 mov 0x14(%ecx),%eax <== NOT EXECUTED
10a29f: 8b 40 14 mov 0x14(%eax),%eax <== 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 &&
10a2a2: 39 c6 cmp %eax,%esi
10a2a4: 7f 10 jg 10a2b6 <rtems_aio_insert_prio+0x3e><== NEVER TAKEN
10a2a6: 53 push %ebx
10a2a7: 53 push %ebx
10a2a8: 52 push %edx
10a2a9: ff 71 04 pushl 0x4(%ecx)
10a2ac: e8 8f 22 00 00 call 10c540 <_Chain_Insert>
10a2b1: 83 c4 10 add $0x10,%esp
10a2b4: eb 06 jmp 10a2bc <rtems_aio_insert_prio+0x44>
10a2b6: 39 d9 cmp %ebx,%ecx <== NOT EXECUTED
10a2b8: 75 e0 jne 10a29a <rtems_aio_insert_prio+0x22><== NOT EXECUTED
10a2ba: eb ea jmp 10a2a6 <rtems_aio_insert_prio+0x2e><== NOT EXECUTED
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
10a2bc: 8d 65 f8 lea -0x8(%ebp),%esp
10a2bf: 5b pop %ebx
10a2c0: 5e pop %esi
10a2c1: 5d pop %ebp
10a2c2: c3 ret
0010a496 <rtems_aio_remove_req>:
* AIO_NOTCANCELED - if request was not canceled
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
10a496: 55 push %ebp
10a497: 89 e5 mov %esp,%ebp
10a499: 53 push %ebx
10a49a: 50 push %eax
10a49b: 8b 55 08 mov 0x8(%ebp),%edx
10a49e: 8b 45 0c mov 0xc(%ebp),%eax
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
10a4a1: 8b 1a mov (%edx),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10a4a3: 83 c2 04 add $0x4,%edx
if (rtems_chain_is_empty (chain))
10a4a6: 39 d3 cmp %edx,%ebx
10a4a8: 75 0f jne 10a4b9 <rtems_aio_remove_req+0x23>
10a4aa: eb 44 jmp 10a4f0 <rtems_aio_remove_req+0x5a>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10a4ac: 8b 1b mov (%ebx),%ebx <== 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) {
10a4ae: 39 d3 cmp %edx,%ebx <== NOT EXECUTED
10a4b0: 75 07 jne 10a4b9 <rtems_aio_remove_req+0x23><== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
10a4b2: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
10a4b7: eb 3c jmp 10a4f5 <rtems_aio_remove_req+0x5f><== 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) {
10a4b9: 39 43 14 cmp %eax,0x14(%ebx)
10a4bc: 75 ee jne 10a4ac <rtems_aio_remove_req+0x16><== NEVER TAKEN
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
10a4be: b8 01 00 00 00 mov $0x1,%eax
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
10a4c3: 39 d3 cmp %edx,%ebx
10a4c5: 74 2e je 10a4f5 <rtems_aio_remove_req+0x5f><== NEVER TAKEN
10a4c7: 83 ec 0c sub $0xc,%esp
10a4ca: 53 push %ebx
10a4cb: e8 34 20 00 00 call 10c504 <_Chain_Extract>
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
10a4d0: 8b 43 14 mov 0x14(%ebx),%eax
10a4d3: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax)
current->aiocbp->return_value = -1;
10a4da: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax)
free (current);
10a4e1: 89 1c 24 mov %ebx,(%esp)
10a4e4: e8 6f c6 ff ff call 106b58 <free>
}
return AIO_CANCELED;
10a4e9: 83 c4 10 add $0x10,%esp
10a4ec: 31 c0 xor %eax,%eax
10a4ee: eb 05 jmp 10a4f5 <rtems_aio_remove_req+0x5f>
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
10a4f0: b8 02 00 00 00 mov $0x2,%eax
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10a4f5: 8b 5d fc mov -0x4(%ebp),%ebx
10a4f8: c9 leave
10a4f9: c3 ret
0010a718 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
10a718: 55 push %ebp
10a719: 89 e5 mov %esp,%ebp
10a71b: 56 push %esi
10a71c: 53 push %ebx
10a71d: 83 ec 10 sub $0x10,%esp
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
10a720: 8d 5d f4 lea -0xc(%ebp),%ebx
10a723: eb 15 jmp 10a73a <rtems_chain_get_with_wait+0x22>
10a725: 53 push %ebx
10a726: ff 75 10 pushl 0x10(%ebp)
10a729: 6a 00 push $0x0
10a72b: ff 75 0c pushl 0xc(%ebp)
10a72e: e8 99 f5 ff ff call 109ccc <rtems_event_receive>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
10a733: 83 c4 10 add $0x10,%esp
10a736: 85 c0 test %eax,%eax
10a738: 75 16 jne 10a750 <rtems_chain_get_with_wait+0x38><== ALWAYS TAKEN
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
10a73a: 83 ec 0c sub $0xc,%esp
10a73d: ff 75 08 pushl 0x8(%ebp)
10a740: e8 cf 04 00 00 call 10ac14 <_Chain_Get>
10a745: 89 c6 mov %eax,%esi
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10a747: 83 c4 10 add $0x10,%esp
10a74a: 85 c0 test %eax,%eax
10a74c: 74 d7 je 10a725 <rtems_chain_get_with_wait+0xd>
10a74e: 31 c0 xor %eax,%eax
timeout,
&out
);
}
*node_ptr = node;
10a750: 8b 55 14 mov 0x14(%ebp),%edx
10a753: 89 32 mov %esi,(%edx)
return sc;
}
10a755: 8d 65 f8 lea -0x8(%ebp),%esp
10a758: 5b pop %ebx
10a759: 5e pop %esi
10a75a: 5d pop %ebp
10a75b: c3 ret
0010c020 <rtems_iterate_over_all_threads>:
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
{
10c020: 55 push %ebp
10c021: 89 e5 mov %esp,%ebp
10c023: 57 push %edi
10c024: 56 push %esi
10c025: 53 push %ebx
10c026: 83 ec 0c sub $0xc,%esp
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
10c029: bb 01 00 00 00 mov $0x1,%ebx
10c02e: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
10c032: 74 3a je 10c06e <rtems_iterate_over_all_threads+0x4e>
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
10c034: 8b 04 9d 3c 0e 13 00 mov 0x130e3c(,%ebx,4),%eax
10c03b: 8b 78 04 mov 0x4(%eax),%edi
if ( !information )
10c03e: be 01 00 00 00 mov $0x1,%esi
10c043: 85 ff test %edi,%edi
10c045: 75 1d jne 10c064 <rtems_iterate_over_all_threads+0x44>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
10c047: 43 inc %ebx
10c048: 83 fb 04 cmp $0x4,%ebx
10c04b: eb e5 jmp 10c032 <rtems_iterate_over_all_threads+0x12>
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
10c04d: 8b 57 1c mov 0x1c(%edi),%edx
10c050: 8b 14 b2 mov (%edx,%esi,4),%edx
if ( !the_thread )
10c053: 85 d2 test %edx,%edx
10c055: 74 0c je 10c063 <rtems_iterate_over_all_threads+0x43><== NEVER TAKEN
continue;
(*routine)(the_thread);
10c057: 83 ec 0c sub $0xc,%esp
10c05a: 52 push %edx
10c05b: 8b 45 08 mov 0x8(%ebp),%eax
10c05e: ff d0 call *%eax
10c060: 83 c4 10 add $0x10,%esp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10c063: 46 inc %esi
10c064: 0f b7 57 10 movzwl 0x10(%edi),%edx
10c068: 39 d6 cmp %edx,%esi
10c06a: 76 e1 jbe 10c04d <rtems_iterate_over_all_threads+0x2d>
10c06c: eb d9 jmp 10c047 <rtems_iterate_over_all_threads+0x27>
(*routine)(the_thread);
}
}
}
10c06e: 8d 65 f4 lea -0xc(%ebp),%esp
10c071: 5b pop %ebx
10c072: 5e pop %esi
10c073: 5f pop %edi
10c074: 5d pop %ebp
10c075: c3 ret
0010e848 <rtems_message_queue_delete>:
*/
rtems_status_code rtems_message_queue_delete(
rtems_id id
)
{
10e848: 55 push %ebp
10e849: 89 e5 mov %esp,%ebp
10e84b: 53 push %ebx
10e84c: 83 ec 18 sub $0x18,%esp
register Message_queue_Control *the_message_queue;
Objects_Locations location;
the_message_queue = _Message_queue_Get( id, &location );
10e84f: 8d 45 f4 lea -0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
10e852: 50 push %eax
10e853: ff 75 08 pushl 0x8(%ebp)
10e856: 68 94 ed 12 00 push $0x12ed94
10e85b: e8 08 ca ff ff call 10b268 <_Objects_Get>
switch ( location ) {
10e860: 83 c4 10 add $0x10,%esp
10e863: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10e867: 75 38 jne 10e8a1 <rtems_message_queue_delete+0x59><== NEVER TAKEN
10e869: 89 c3 mov %eax,%ebx
case OBJECTS_LOCAL:
_Objects_Close( &_Message_queue_Information,
10e86b: 50 push %eax
10e86c: 50 push %eax
10e86d: 53 push %ebx
10e86e: 68 94 ed 12 00 push $0x12ed94
10e873: e8 50 c6 ff ff call 10aec8 <_Objects_Close>
&the_message_queue->Object );
_CORE_message_queue_Close(
10e878: 83 c4 0c add $0xc,%esp
10e87b: 6a 05 push $0x5
10e87d: 6a 00 push $0x0
10e87f: 8d 43 14 lea 0x14(%ebx),%eax
10e882: 50 push %eax
10e883: e8 a0 04 00 00 call 10ed28 <_CORE_message_queue_Close>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
10e888: 5a pop %edx
10e889: 59 pop %ecx
10e88a: 53 push %ebx
10e88b: 68 94 ed 12 00 push $0x12ed94
10e890: e8 a7 c8 ff ff call 10b13c <_Objects_Free>
0, /* Not used */
0
);
}
#endif
_Thread_Enable_dispatch();
10e895: e8 72 d5 ff ff call 10be0c <_Thread_Enable_dispatch>
10e89a: 83 c4 10 add $0x10,%esp
return RTEMS_SUCCESSFUL;
10e89d: 31 c0 xor %eax,%eax
10e89f: eb 05 jmp 10e8a6 <rtems_message_queue_delete+0x5e>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10e8a1: b8 04 00 00 00 mov $0x4,%eax
}
10e8a6: 8b 5d fc mov -0x4(%ebp),%ebx
10e8a9: c9 leave
10e8aa: c3 ret
0010ae70 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
10ae70: 55 push %ebp
10ae71: 89 e5 mov %esp,%ebp
10ae73: 57 push %edi
10ae74: 56 push %esi
10ae75: 53 push %ebx
10ae76: 83 ec 0c sub $0xc,%esp
10ae79: 8b 7d 0c mov 0xc(%ebp),%edi
10ae7c: 8b 75 14 mov 0x14(%ebp),%esi
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10ae7f: b8 03 00 00 00 mov $0x3,%eax
rtems_id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
10ae84: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
10ae88: 0f 84 d9 00 00 00 je 10af67 <rtems_partition_create+0xf7>
return RTEMS_INVALID_NAME;
if ( !starting_address )
10ae8e: 85 ff test %edi,%edi
10ae90: 0f 84 c5 00 00 00 je 10af5b <rtems_partition_create+0xeb>
return RTEMS_INVALID_ADDRESS;
if ( !id )
10ae96: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp)
10ae9a: 0f 84 bb 00 00 00 je 10af5b <rtems_partition_create+0xeb><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
10aea0: 85 f6 test %esi,%esi
10aea2: 0f 84 ba 00 00 00 je 10af62 <rtems_partition_create+0xf2>
10aea8: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
10aeac: 0f 84 b0 00 00 00 je 10af62 <rtems_partition_create+0xf2>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
10aeb2: b0 08 mov $0x8,%al
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
10aeb4: 39 75 10 cmp %esi,0x10(%ebp)
10aeb7: 0f 82 aa 00 00 00 jb 10af67 <rtems_partition_create+0xf7>
10aebd: f7 c6 03 00 00 00 test $0x3,%esi
10aec3: 0f 85 9e 00 00 00 jne 10af67 <rtems_partition_create+0xf7>
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
10aec9: b0 09 mov $0x9,%al
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 ) )
10aecb: f7 c7 03 00 00 00 test $0x3,%edi
10aed1: 0f 85 90 00 00 00 jne 10af67 <rtems_partition_create+0xf7>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10aed7: a1 b4 31 13 00 mov 0x1331b4,%eax
10aedc: 40 inc %eax
10aedd: a3 b4 31 13 00 mov %eax,0x1331b4
return _Thread_Dispatch_disable_level;
10aee2: a1 b4 31 13 00 mov 0x1331b4,%eax
* 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 );
10aee7: 83 ec 0c sub $0xc,%esp
10aeea: 68 30 30 13 00 push $0x133030
10aeef: e8 c4 17 00 00 call 10c6b8 <_Objects_Allocate>
10aef4: 89 c3 mov %eax,%ebx
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
10aef6: 83 c4 10 add $0x10,%esp
10aef9: 85 c0 test %eax,%eax
10aefb: 75 0c jne 10af09 <rtems_partition_create+0x99>
_Thread_Enable_dispatch();
10aefd: e8 ba 27 00 00 call 10d6bc <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10af02: b8 05 00 00 00 mov $0x5,%eax
10af07: eb 5e jmp 10af67 <rtems_partition_create+0xf7>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
10af09: 89 78 10 mov %edi,0x10(%eax)
the_partition->length = length;
10af0c: 8b 45 10 mov 0x10(%ebp),%eax
10af0f: 89 43 14 mov %eax,0x14(%ebx)
the_partition->buffer_size = buffer_size;
10af12: 89 73 18 mov %esi,0x18(%ebx)
the_partition->attribute_set = attribute_set;
10af15: 8b 45 18 mov 0x18(%ebp),%eax
10af18: 89 43 1c mov %eax,0x1c(%ebx)
the_partition->number_of_used_blocks = 0;
10af1b: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx)
_Chain_Initialize( &the_partition->Memory, starting_address,
10af22: 56 push %esi
10af23: 8b 45 10 mov 0x10(%ebp),%eax
10af26: 31 d2 xor %edx,%edx
10af28: f7 f6 div %esi
10af2a: 50 push %eax
10af2b: 57 push %edi
10af2c: 8d 43 24 lea 0x24(%ebx),%eax
10af2f: 50 push %eax
10af30: e8 3f 0f 00 00 call 10be74 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10af35: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10af38: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10af3b: 8b 15 4c 30 13 00 mov 0x13304c,%edx
10af41: 89 1c 8a mov %ebx,(%edx,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10af44: 8b 55 08 mov 0x8(%ebp),%edx
10af47: 89 53 0c mov %edx,0xc(%ebx)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
10af4a: 8b 55 1c mov 0x1c(%ebp),%edx
10af4d: 89 02 mov %eax,(%edx)
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
10af4f: e8 68 27 00 00 call 10d6bc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10af54: 83 c4 10 add $0x10,%esp
10af57: 31 c0 xor %eax,%eax
10af59: eb 0c jmp 10af67 <rtems_partition_create+0xf7>
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
10af5b: b8 09 00 00 00 mov $0x9,%eax
10af60: eb 05 jmp 10af67 <rtems_partition_create+0xf7>
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
10af62: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10af67: 8d 65 f4 lea -0xc(%ebp),%esp
10af6a: 5b pop %ebx
10af6b: 5e pop %esi
10af6c: 5f pop %edi
10af6d: 5d pop %ebp
10af6e: c3 ret
0011445c <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
11445c: 55 push %ebp
11445d: 89 e5 mov %esp,%ebp
11445f: 56 push %esi
114460: 53 push %ebx
114461: 83 ec 14 sub $0x14,%esp
114464: 8b 75 0c mov 0xc(%ebp),%esi
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
114467: 8d 45 f4 lea -0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
11446a: 50 push %eax
11446b: ff 75 08 pushl 0x8(%ebp)
11446e: 68 d0 7c 14 00 push $0x147cd0
114473: e8 78 43 00 00 call 1187f0 <_Objects_Get>
switch ( location ) {
114478: 83 c4 10 add $0x10,%esp
11447b: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
11447f: 75 53 jne 1144d4 <rtems_partition_return_buffer+0x78>
114481: 89 c3 mov %eax,%ebx
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
114483: 8b 40 10 mov 0x10(%eax),%eax
114486: 8b 53 14 mov 0x14(%ebx),%edx
114489: 01 c2 add %eax,%edx
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
11448b: 39 d6 cmp %edx,%esi
11448d: 77 18 ja 1144a7 <rtems_partition_return_buffer+0x4b><== NEVER TAKEN
11448f: 39 c6 cmp %eax,%esi
114491: 72 14 jb 1144a7 <rtems_partition_return_buffer+0x4b>
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
114493: 89 f2 mov %esi,%edx
114495: 29 c2 sub %eax,%edx
114497: 89 d0 mov %edx,%eax
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
114499: 31 d2 xor %edx,%edx
11449b: f7 73 18 divl 0x18(%ebx)
starting = the_partition->starting_address;
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
11449e: 31 c0 xor %eax,%eax
1144a0: 85 d2 test %edx,%edx
1144a2: 0f 94 c0 sete %al
1144a5: eb 02 jmp 1144a9 <rtems_partition_return_buffer+0x4d>
1144a7: 31 c0 xor %eax,%eax
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
1144a9: 85 c0 test %eax,%eax
1144ab: 74 1b je 1144c8 <rtems_partition_return_buffer+0x6c>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
1144ad: 50 push %eax
1144ae: 50 push %eax
1144af: 56 push %esi
1144b0: 8d 43 24 lea 0x24(%ebx),%eax
1144b3: 50 push %eax
1144b4: e8 db 2a 00 00 call 116f94 <_Chain_Append>
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
1144b9: ff 4b 20 decl 0x20(%ebx)
_Thread_Enable_dispatch();
1144bc: e8 d3 4e 00 00 call 119394 <_Thread_Enable_dispatch>
1144c1: 83 c4 10 add $0x10,%esp
return RTEMS_SUCCESSFUL;
1144c4: 31 c0 xor %eax,%eax
1144c6: eb 11 jmp 1144d9 <rtems_partition_return_buffer+0x7d>
}
_Thread_Enable_dispatch();
1144c8: e8 c7 4e 00 00 call 119394 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
1144cd: b8 09 00 00 00 mov $0x9,%eax
1144d2: eb 05 jmp 1144d9 <rtems_partition_return_buffer+0x7d>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1144d4: b8 04 00 00 00 mov $0x4,%eax
}
1144d9: 8d 65 f8 lea -0x8(%ebp),%esp
1144dc: 5b pop %ebx
1144dd: 5e pop %esi
1144de: 5d pop %ebp
1144df: c3 ret
0012dd58 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
12dd58: 55 push %ebp
12dd59: 89 e5 mov %esp,%ebp
12dd5b: 57 push %edi
12dd5c: 56 push %esi
12dd5d: 53 push %ebx
12dd5e: 83 ec 30 sub $0x30,%esp
12dd61: 8b 7d 08 mov 0x8(%ebp),%edi
12dd64: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_value;
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
12dd67: 8d 45 e4 lea -0x1c(%ebp),%eax
12dd6a: 50 push %eax
12dd6b: 57 push %edi
12dd6c: 68 a0 ec 16 00 push $0x16eca0
12dd71: e8 ca d2 fd ff call 10b040 <_Objects_Get>
switch ( location ) {
12dd76: 83 c4 10 add $0x10,%esp
12dd79: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
12dd7d: 0f 85 47 01 00 00 jne 12deca <rtems_rate_monotonic_period+0x172>
12dd83: 89 c6 mov %eax,%esi
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
12dd85: a1 04 e7 16 00 mov 0x16e704,%eax
12dd8a: 39 46 40 cmp %eax,0x40(%esi)
12dd8d: 74 0f je 12dd9e <rtems_rate_monotonic_period+0x46>
_Thread_Enable_dispatch();
12dd8f: e8 e0 dd fd ff call 10bb74 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
12dd94: bf 17 00 00 00 mov $0x17,%edi
12dd99: e9 31 01 00 00 jmp 12decf <rtems_rate_monotonic_period+0x177>
}
if ( length == RTEMS_PERIOD_STATUS ) {
12dd9e: 85 db test %ebx,%ebx
12dda0: 75 1b jne 12ddbd <rtems_rate_monotonic_period+0x65>
switch ( the_period->state ) {
12dda2: 8b 46 38 mov 0x38(%esi),%eax
12dda5: 31 ff xor %edi,%edi
12dda7: 83 f8 04 cmp $0x4,%eax
12ddaa: 77 07 ja 12ddb3 <rtems_rate_monotonic_period+0x5b><== NEVER TAKEN
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
12ddac: 0f b6 b8 08 31 15 00 movzbl 0x153108(%eax),%edi
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
12ddb3: e8 bc dd fd ff call 10bb74 <_Thread_Enable_dispatch>
12ddb8: e9 12 01 00 00 jmp 12decf <rtems_rate_monotonic_period+0x177>
return( return_value );
}
_ISR_Disable( level );
12ddbd: 9c pushf
12ddbe: fa cli
12ddbf: 8f 45 d4 popl -0x2c(%ebp)
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
12ddc2: 8b 46 38 mov 0x38(%esi),%eax
12ddc5: 85 c0 test %eax,%eax
12ddc7: 75 4c jne 12de15 <rtems_rate_monotonic_period+0xbd>
_ISR_Enable( level );
12ddc9: ff 75 d4 pushl -0x2c(%ebp)
12ddcc: 9d popf
the_period->next_length = length;
12ddcd: 89 5e 3c mov %ebx,0x3c(%esi)
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
12ddd0: 83 ec 0c sub $0xc,%esp
12ddd3: 56 push %esi
12ddd4: e8 0f ff ff ff call 12dce8 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
12ddd9: c7 46 38 02 00 00 00 movl $0x2,0x38(%esi)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
12dde0: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi)
the_watchdog->routine = routine;
12dde7: c7 46 2c dc de 12 00 movl $0x12dedc,0x2c(%esi)
the_watchdog->id = id;
12ddee: 89 7e 30 mov %edi,0x30(%esi)
the_watchdog->user_data = user_data;
12ddf1: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
12ddf8: 89 5e 1c mov %ebx,0x1c(%esi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
12ddfb: 59 pop %ecx
12ddfc: 5b pop %ebx
_Rate_monotonic_Timeout,
id,
NULL
);
_Watchdog_Insert_ticks( &the_period->Timer, length );
12ddfd: 8d 56 10 lea 0x10(%esi),%edx
12de00: 52 push %edx
12de01: 68 a0 e2 16 00 push $0x16e2a0
12de06: e8 61 e8 fd ff call 10c66c <_Watchdog_Insert>
_Thread_Enable_dispatch();
12de0b: e8 64 dd fd ff call 10bb74 <_Thread_Enable_dispatch>
12de10: 83 c4 10 add $0x10,%esp
12de13: eb 63 jmp 12de78 <rtems_rate_monotonic_period+0x120>
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
12de15: 83 f8 02 cmp $0x2,%eax
12de18: 75 62 jne 12de7c <rtems_rate_monotonic_period+0x124>
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
12de1a: 89 f0 mov %esi,%eax
12de1c: e8 28 fe ff ff call 12dc49 <_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;
12de21: c7 46 38 01 00 00 00 movl $0x1,0x38(%esi)
the_period->next_length = length;
12de28: 89 5e 3c mov %ebx,0x3c(%esi)
_ISR_Enable( level );
12de2b: ff 75 d4 pushl -0x2c(%ebp)
12de2e: 9d popf
_Thread_Executing->Wait.id = the_period->Object.id;
12de2f: a1 04 e7 16 00 mov 0x16e704,%eax
12de34: 8b 4e 08 mov 0x8(%esi),%ecx
12de37: 89 48 20 mov %ecx,0x20(%eax)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
12de3a: 52 push %edx
12de3b: 52 push %edx
12de3c: 68 00 40 00 00 push $0x4000
12de41: 50 push %eax
12de42: e8 95 e4 fd ff call 10c2dc <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
12de47: 9c pushf
12de48: fa cli
12de49: 59 pop %ecx
local_state = the_period->state;
12de4a: 8b 46 38 mov 0x38(%esi),%eax
the_period->state = RATE_MONOTONIC_ACTIVE;
12de4d: c7 46 38 02 00 00 00 movl $0x2,0x38(%esi)
_ISR_Enable( level );
12de54: 51 push %ecx
12de55: 9d popf
/*
* 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 )
12de56: 83 c4 10 add $0x10,%esp
12de59: 83 f8 03 cmp $0x3,%eax
12de5c: 75 15 jne 12de73 <rtems_rate_monotonic_period+0x11b>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
12de5e: 50 push %eax
12de5f: 50 push %eax
12de60: 68 00 40 00 00 push $0x4000
12de65: ff 35 04 e7 16 00 pushl 0x16e704
12de6b: e8 d4 d9 fd ff call 10b844 <_Thread_Clear_state>
12de70: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
12de73: e8 fc dc fd ff call 10bb74 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
12de78: 31 ff xor %edi,%edi
12de7a: eb 53 jmp 12decf <rtems_rate_monotonic_period+0x177>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
12de7c: bf 04 00 00 00 mov $0x4,%edi
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
12de81: 83 f8 04 cmp $0x4,%eax
12de84: 75 49 jne 12decf <rtems_rate_monotonic_period+0x177><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
12de86: 89 f0 mov %esi,%eax
12de88: e8 bc fd ff ff call 12dc49 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
12de8d: ff 75 d4 pushl -0x2c(%ebp)
12de90: 9d popf
the_period->state = RATE_MONOTONIC_ACTIVE;
12de91: c7 46 38 02 00 00 00 movl $0x2,0x38(%esi)
the_period->next_length = length;
12de98: 89 5e 3c mov %ebx,0x3c(%esi)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
12de9b: 89 5e 1c mov %ebx,0x1c(%esi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
12de9e: 51 push %ecx
12de9f: 51 push %ecx
_Watchdog_Insert_ticks( &the_period->Timer, length );
12dea0: 8d 46 10 lea 0x10(%esi),%eax
12dea3: 50 push %eax
12dea4: 68 a0 e2 16 00 push $0x16e2a0
12dea9: e8 be e7 fd ff call 10c66c <_Watchdog_Insert>
12deae: 5b pop %ebx
12deaf: 58 pop %eax
12deb0: ff 76 3c pushl 0x3c(%esi)
12deb3: ff 76 40 pushl 0x40(%esi)
12deb6: ff 15 10 69 16 00 call *0x166910
_Scheduler_Release_job(the_period->owner, the_period->next_length);
_Thread_Enable_dispatch();
12debc: e8 b3 dc fd ff call 10bb74 <_Thread_Enable_dispatch>
12dec1: 83 c4 10 add $0x10,%esp
return RTEMS_TIMEOUT;
12dec4: 66 bf 06 00 mov $0x6,%di
12dec8: eb 05 jmp 12decf <rtems_rate_monotonic_period+0x177>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
12deca: bf 04 00 00 00 mov $0x4,%edi
}
12decf: 89 f8 mov %edi,%eax
12ded1: 8d 65 f4 lea -0xc(%ebp),%esp
12ded4: 5b pop %ebx
12ded5: 5e pop %esi
12ded6: 5f pop %edi
12ded7: 5d pop %ebp
12ded8: c3 ret
00123b14 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
123b14: 55 push %ebp
123b15: 89 e5 mov %esp,%ebp
123b17: 57 push %edi
123b18: 56 push %esi
123b19: 53 push %ebx
123b1a: 83 ec 7c sub $0x7c,%esp
123b1d: 8b 75 08 mov 0x8(%ebp),%esi
123b20: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
123b23: 85 db test %ebx,%ebx
123b25: 0f 84 2e 01 00 00 je 123c59 <rtems_rate_monotonic_report_statistics_with_plugin+0x145><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
123b2b: 57 push %edi
123b2c: 57 push %edi
123b2d: 68 4c 05 15 00 push $0x15054c
123b32: 56 push %esi
123b33: ff d3 call *%ebx
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
123b35: 58 pop %eax
123b36: 5a pop %edx
123b37: 68 6a 05 15 00 push $0x15056a
123b3c: 56 push %esi
123b3d: ff d3 call *%ebx
(*print)( context, "--- Wall times are in seconds ---\n" );
123b3f: 59 pop %ecx
123b40: 5f pop %edi
123b41: 68 8c 05 15 00 push $0x15058c
123b46: 56 push %esi
123b47: ff d3 call *%ebx
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
123b49: 58 pop %eax
123b4a: 5a pop %edx
123b4b: 68 af 05 15 00 push $0x1505af
123b50: 56 push %esi
123b51: ff d3 call *%ebx
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
123b53: 59 pop %ecx
123b54: 5f pop %edi
123b55: 68 fa 05 15 00 push $0x1505fa
123b5a: 56 push %esi
123b5b: ff d3 call *%ebx
/*
* 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 ;
123b5d: 8b 3d a8 ec 16 00 mov 0x16eca8,%edi
123b63: 83 c4 10 add $0x10,%esp
123b66: e9 e2 00 00 00 jmp 123c4d <rtems_rate_monotonic_report_statistics_with_plugin+0x139>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
123b6b: 51 push %ecx
123b6c: 51 push %ecx
123b6d: 8d 45 b0 lea -0x50(%ebp),%eax
123b70: 50 push %eax
123b71: 57 push %edi
123b72: e8 b9 9d 00 00 call 12d930 <rtems_rate_monotonic_get_statistics>
if ( status != RTEMS_SUCCESSFUL )
123b77: 83 c4 10 add $0x10,%esp
123b7a: 85 c0 test %eax,%eax
123b7c: 0f 85 ca 00 00 00 jne 123c4c <rtems_rate_monotonic_report_statistics_with_plugin+0x138>
#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 );
123b82: 50 push %eax
123b83: 50 push %eax
123b84: 8d 55 98 lea -0x68(%ebp),%edx
123b87: 52 push %edx
123b88: 57 push %edi
123b89: e8 2e 9f 00 00 call 12dabc <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
123b8e: 83 c4 0c add $0xc,%esp
123b91: 8d 55 8b lea -0x75(%ebp),%edx
123b94: 52 push %edx
123b95: 6a 05 push $0x5
123b97: ff 75 98 pushl -0x68(%ebp)
123b9a: 89 55 84 mov %edx,-0x7c(%ebp)
123b9d: e8 e2 c9 fe ff call 110584 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
123ba2: 58 pop %eax
123ba3: 5a pop %edx
123ba4: ff 75 b4 pushl -0x4c(%ebp)
123ba7: ff 75 b0 pushl -0x50(%ebp)
123baa: 8b 55 84 mov -0x7c(%ebp),%edx
123bad: 52 push %edx
123bae: 57 push %edi
123baf: 68 46 06 15 00 push $0x150646
123bb4: 56 push %esi
123bb5: ff d3 call *%ebx
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
123bb7: 8b 45 b0 mov -0x50(%ebp),%eax
123bba: 83 c4 20 add $0x20,%esp
123bbd: 85 c0 test %eax,%eax
123bbf: 75 0f jne 123bd0 <rtems_rate_monotonic_report_statistics_with_plugin+0xbc>
(*print)( context, "\n" );
123bc1: 51 push %ecx
123bc2: 51 push %ecx
123bc3: 68 29 b1 14 00 push $0x14b129
123bc8: 56 push %esi
123bc9: ff d3 call *%ebx
continue;
123bcb: 83 c4 10 add $0x10,%esp
123bce: eb 7c jmp 123c4c <rtems_rate_monotonic_report_statistics_with_plugin+0x138>
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 );
123bd0: 52 push %edx
123bd1: 8d 55 90 lea -0x70(%ebp),%edx
123bd4: 52 push %edx
123bd5: 50 push %eax
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
123bd6: 8d 45 c8 lea -0x38(%ebp),%eax
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
123bd9: 50 push %eax
123bda: e8 79 09 00 00 call 124558 <_Timespec_Divide_by_integer>
(*print)( context,
123bdf: 8b 45 94 mov -0x6c(%ebp),%eax
123be2: b9 e8 03 00 00 mov $0x3e8,%ecx
123be7: 99 cltd
123be8: f7 f9 idiv %ecx
123bea: 50 push %eax
123beb: ff 75 90 pushl -0x70(%ebp)
123bee: 8b 45 c4 mov -0x3c(%ebp),%eax
123bf1: 99 cltd
123bf2: f7 f9 idiv %ecx
123bf4: 50 push %eax
123bf5: ff 75 c0 pushl -0x40(%ebp)
123bf8: 8b 45 bc mov -0x44(%ebp),%eax
123bfb: 99 cltd
123bfc: f7 f9 idiv %ecx
123bfe: 50 push %eax
123bff: ff 75 b8 pushl -0x48(%ebp)
123c02: 68 5d 06 15 00 push $0x15065d
123c07: 56 push %esi
123c08: 89 4d 84 mov %ecx,-0x7c(%ebp)
123c0b: ff d3 call *%ebx
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);
123c0d: 83 c4 2c add $0x2c,%esp
123c10: 8d 45 90 lea -0x70(%ebp),%eax
123c13: 50 push %eax
123c14: ff 75 b0 pushl -0x50(%ebp)
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
123c17: 8d 45 e0 lea -0x20(%ebp),%eax
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
123c1a: 50 push %eax
123c1b: e8 38 09 00 00 call 124558 <_Timespec_Divide_by_integer>
(*print)( context,
123c20: 8b 45 94 mov -0x6c(%ebp),%eax
123c23: 8b 4d 84 mov -0x7c(%ebp),%ecx
123c26: 99 cltd
123c27: f7 f9 idiv %ecx
123c29: 50 push %eax
123c2a: ff 75 90 pushl -0x70(%ebp)
123c2d: 8b 45 dc mov -0x24(%ebp),%eax
123c30: 99 cltd
123c31: f7 f9 idiv %ecx
123c33: 50 push %eax
123c34: ff 75 d8 pushl -0x28(%ebp)
123c37: 8b 45 d4 mov -0x2c(%ebp),%eax
123c3a: 99 cltd
123c3b: f7 f9 idiv %ecx
123c3d: 50 push %eax
123c3e: ff 75 d0 pushl -0x30(%ebp)
123c41: 68 7c 06 15 00 push $0x15067c
123c46: 56 push %esi
123c47: ff d3 call *%ebx
123c49: 83 c4 30 add $0x30,%esp
* 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++ ) {
123c4c: 47 inc %edi
/*
* 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 ;
123c4d: 3b 3d ac ec 16 00 cmp 0x16ecac,%edi
123c53: 0f 86 12 ff ff ff jbe 123b6b <rtems_rate_monotonic_report_statistics_with_plugin+0x57>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
123c59: 8d 65 f4 lea -0xc(%ebp),%esp
123c5c: 5b pop %ebx
123c5d: 5e pop %esi
123c5e: 5f pop %edi
123c5f: 5d pop %ebp
123c60: c3 ret
0010abb5 <rtems_rbheap_allocate>:
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
10abb5: 55 push %ebp
10abb6: 89 e5 mov %esp,%ebp
10abb8: 57 push %edi
10abb9: 56 push %esi
10abba: 53 push %ebx
10abbb: 83 ec 1c sub $0x1c,%esp
10abbe: 8b 4d 08 mov 0x8(%ebp),%ecx
10abc1: 8b 5d 0c mov 0xc(%ebp),%ebx
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;
10abc4: 8b 79 30 mov 0x30(%ecx),%edi
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
10abc7: 89 d8 mov %ebx,%eax
10abc9: 31 d2 xor %edx,%edx
10abcb: f7 f7 div %edi
if (excess > 0) {
10abcd: 89 de mov %ebx,%esi
10abcf: 85 d2 test %edx,%edx
10abd1: 74 05 je 10abd8 <rtems_rbheap_allocate+0x23><== ALWAYS TAKEN
value += alignment - excess;
10abd3: 8d 34 3b lea (%ebx,%edi,1),%esi <== NOT EXECUTED
10abd6: 29 d6 sub %edx,%esi <== 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) {
10abd8: 39 f3 cmp %esi,%ebx
10abda: 77 04 ja 10abe0 <rtems_rbheap_allocate+0x2b><== NEVER TAKEN
10abdc: 85 db test %ebx,%ebx
10abde: 75 07 jne 10abe7 <rtems_rbheap_allocate+0x32>
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
10abe0: 31 c0 xor %eax,%eax
10abe2: e9 8f 00 00 00 jmp 10ac76 <rtems_rbheap_allocate+0xc1>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
10abe7: 8b 01 mov (%ecx),%eax
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);
10abe9: 8d 51 04 lea 0x4(%ecx),%edx
rtems_rbheap_chunk *big_enough = NULL;
10abec: 31 db xor %ebx,%ebx
10abee: eb 0e jmp 10abfe <rtems_rbheap_allocate+0x49>
while (current != tail && big_enough == NULL) {
rtems_rbheap_chunk *free_chunk = (rtems_rbheap_chunk *) current;
if (free_chunk->size >= size) {
10abf0: 31 db xor %ebx,%ebx
10abf2: 39 70 1c cmp %esi,0x1c(%eax)
10abf5: 0f 93 c3 setae %bl
10abf8: f7 db neg %ebx
10abfa: 21 c3 and %eax,%ebx
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
if (chunk != NULL) {
rtems_rbheap_add_to_spare_descriptor_chain(control, chunk);
}
}
10abfc: 8b 00 mov (%eax),%eax
{
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) {
10abfe: 85 db test %ebx,%ebx
10ac00: 75 04 jne 10ac06 <rtems_rbheap_allocate+0x51>
10ac02: 39 d0 cmp %edx,%eax
10ac04: 75 ea jne 10abf0 <rtems_rbheap_allocate+0x3b>
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
rtems_rbheap_chunk *free_chunk = search_free_chunk(free_chain, aligned_size);
if (free_chunk != NULL) {
10ac06: 85 db test %ebx,%ebx
10ac08: 74 d6 je 10abe0 <rtems_rbheap_allocate+0x2b>
uintptr_t free_size = free_chunk->size;
10ac0a: 8b 53 1c mov 0x1c(%ebx),%edx
if (free_size > aligned_size) {
10ac0d: 39 f2 cmp %esi,%edx
10ac0f: 76 4b jbe 10ac5c <rtems_rbheap_allocate+0xa7>
rtems_rbheap_chunk *new_chunk = get_chunk(control);
10ac11: 89 c8 mov %ecx,%eax
10ac13: 89 55 e4 mov %edx,-0x1c(%ebp)
10ac16: 89 4d e0 mov %ecx,-0x20(%ebp)
10ac19: e8 49 fe ff ff call 10aa67 <get_chunk>
10ac1e: 89 c7 mov %eax,%edi
if (new_chunk != NULL) {
10ac20: 85 c0 test %eax,%eax
10ac22: 8b 55 e4 mov -0x1c(%ebp),%edx
10ac25: 8b 4d e0 mov -0x20(%ebp),%ecx
10ac28: 74 b6 je 10abe0 <rtems_rbheap_allocate+0x2b><== NEVER TAKEN
uintptr_t new_free_size = free_size - aligned_size;
10ac2a: 29 f2 sub %esi,%edx
free_chunk->size = new_free_size;
10ac2c: 89 53 1c mov %edx,0x1c(%ebx)
new_chunk->begin = free_chunk->begin + new_free_size;
10ac2f: 03 53 18 add 0x18(%ebx),%edx
10ac32: 89 50 18 mov %edx,0x18(%eax)
new_chunk->size = aligned_size;
10ac35: 89 70 1c mov %esi,0x1c(%eax)
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
10ac38: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
10ac3f: c7 00 00 00 00 00 movl $0x0,(%eax)
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
10ac45: 53 push %ebx
10ac46: 53 push %ebx
10ac47: 8d 40 08 lea 0x8(%eax),%eax
10ac4a: 50 push %eax
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
10ac4b: 83 c1 18 add $0x18,%ecx
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
10ac4e: 51 push %ecx
10ac4f: e8 40 15 00 00 call 10c194 <_RBTree_Insert_unprotected>
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;
10ac54: 8b 47 18 mov 0x18(%edi),%eax
10ac57: 83 c4 10 add $0x10,%esp
10ac5a: eb 1a jmp 10ac76 <rtems_rbheap_allocate+0xc1>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10ac5c: 8b 13 mov (%ebx),%edx
previous = the_node->previous;
10ac5e: 8b 43 04 mov 0x4(%ebx),%eax
next->previous = previous;
10ac61: 89 42 04 mov %eax,0x4(%edx)
previous->next = next;
10ac64: 89 10 mov %edx,(%eax)
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
10ac66: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
10ac6d: c7 03 00 00 00 00 movl $0x0,(%ebx)
}
} else {
rtems_chain_extract_unprotected(&free_chunk->chain_node);
rtems_chain_set_off_chain(&free_chunk->chain_node);
ptr = (void *) free_chunk->begin;
10ac73: 8b 43 18 mov 0x18(%ebx),%eax
}
}
}
return ptr;
}
10ac76: 8d 65 f4 lea -0xc(%ebp),%esp
10ac79: 5b pop %ebx
10ac7a: 5e pop %esi
10ac7b: 5f pop %edi
10ac7c: 5d pop %ebp
10ac7d: c3 ret
0010ad71 <rtems_rbheap_extend_descriptors_with_malloc>:
void rtems_rbheap_extend_descriptors_with_malloc(rtems_rbheap_control *control)
{
10ad71: 55 push %ebp <== NOT EXECUTED
10ad72: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10ad74: 53 push %ebx <== NOT EXECUTED
10ad75: 83 ec 10 sub $0x10,%esp <== NOT EXECUTED
10ad78: 8b 5d 08 mov 0x8(%ebp),%ebx <== NOT EXECUTED
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
10ad7b: 6a 20 push $0x20 <== NOT EXECUTED
10ad7d: e8 f2 c1 ff ff call 106f74 <malloc> <== NOT EXECUTED
if (chunk != NULL) {
10ad82: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10ad85: 85 c0 test %eax,%eax <== NOT EXECUTED
10ad87: 74 11 je 10ad9a <rtems_rbheap_extend_descriptors_with_malloc+0x29><== 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);
10ad89: 8d 53 0c lea 0xc(%ebx),%edx <== NOT EXECUTED
10ad8c: 89 50 04 mov %edx,0x4(%eax) <== NOT EXECUTED
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
10ad8f: 8b 53 0c mov 0xc(%ebx),%edx <== NOT EXECUTED
after_node->next = the_node;
10ad92: 89 43 0c mov %eax,0xc(%ebx) <== NOT EXECUTED
the_node->next = before_node;
10ad95: 89 10 mov %edx,(%eax) <== NOT EXECUTED
before_node->previous = the_node;
10ad97: 89 42 04 mov %eax,0x4(%edx) <== NOT EXECUTED
rtems_rbheap_add_to_spare_descriptor_chain(control, chunk);
}
}
10ad9a: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10ad9d: c9 leave <== NOT EXECUTED
10ad9e: c3 ret <== NOT EXECUTED
0010ac7e <rtems_rbheap_free>:
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
10ac7e: 55 push %ebp
10ac7f: 89 e5 mov %esp,%ebp
10ac81: 57 push %edi
10ac82: 56 push %esi
10ac83: 53 push %ebx
10ac84: 83 ec 3c sub $0x3c,%esp
10ac87: 8b 5d 08 mov 0x8(%ebp),%ebx
10ac8a: 8b 55 0c mov 0xc(%ebp),%edx
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
10ac8d: 85 d2 test %edx,%edx
10ac8f: 0f 84 c6 00 00 00 je 10ad5b <rtems_rbheap_free+0xdd>
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
10ac95: 8d 73 18 lea 0x18(%ebx),%esi
#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 };
10ac98: 8d 7d c8 lea -0x38(%ebp),%edi
10ac9b: b9 08 00 00 00 mov $0x8,%ecx
10aca0: 31 c0 xor %eax,%eax
10aca2: f3 ab rep stos %eax,%es:(%edi)
10aca4: 89 55 e0 mov %edx,-0x20(%ebp)
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
10aca7: 8b 53 1c mov 0x1c(%ebx),%edx
RBTree_Node* found = NULL;
10acaa: 31 ff xor %edi,%edi
return rtems_rbheap_chunk_of_node(
10acac: 8d 4d d0 lea -0x30(%ebp),%ecx
10acaf: eb 2e jmp 10acdf <rtems_rbheap_free+0x61>
int compare_result;
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
10acb1: 50 push %eax
10acb2: 50 push %eax
10acb3: 52 push %edx
10acb4: 51 push %ecx
10acb5: 89 55 c0 mov %edx,-0x40(%ebp)
10acb8: 89 4d bc mov %ecx,-0x44(%ebp)
10acbb: ff 56 10 call *0x10(%esi)
if ( _RBTree_Is_equal( compare_result ) ) {
10acbe: 83 c4 10 add $0x10,%esp
10acc1: 85 c0 test %eax,%eax
10acc3: 8b 55 c0 mov -0x40(%ebp),%edx
10acc6: 8b 4d bc mov -0x44(%ebp),%ecx
10acc9: 75 08 jne 10acd3 <rtems_rbheap_free+0x55>
found = iter_node;
if ( the_rbtree->is_unique )
10accb: 80 7e 14 00 cmpb $0x0,0x14(%esi)
10accf: 75 14 jne 10ace5 <rtems_rbheap_free+0x67><== ALWAYS TAKEN
10acd1: 89 d7 mov %edx,%edi <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
int compare_result
)
{
return compare_result > 0;
10acd3: 85 c0 test %eax,%eax
10acd5: 0f 9f c0 setg %al
10acd8: 0f b6 c0 movzbl %al,%eax
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
10acdb: 8b 54 82 04 mov 0x4(%edx,%eax,4),%edx
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
10acdf: 85 d2 test %edx,%edx
10ace1: 75 ce jne 10acb1 <rtems_rbheap_free+0x33>
10ace3: 89 fa mov %edi,%edx
10ace5: 8d 7a f8 lea -0x8(%edx),%edi
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) {
10ace8: 83 ff f8 cmp $0xfffffff8,%edi
10aceb: 74 72 je 10ad5f <rtems_rbheap_free+0xe1>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
10aced: 31 c9 xor %ecx,%ecx
10acef: 83 7a f8 00 cmpl $0x0,-0x8(%edx)
10acf3: 75 09 jne 10acfe <rtems_rbheap_free+0x80>
10acf5: 31 c9 xor %ecx,%ecx
10acf7: 83 7f 04 00 cmpl $0x0,0x4(%edi)
10acfb: 0f 94 c1 sete %cl
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;
10acfe: b8 0e 00 00 00 mov $0xe,%eax
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) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
10ad03: 85 c9 test %ecx,%ecx
10ad05: 74 5d je 10ad64 <rtems_rbheap_free+0xe6>
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
10ad07: 8d 57 08 lea 0x8(%edi),%edx
10ad0a: 50 push %eax
10ad0b: 50 push %eax
10ad0c: 6a 00 push $0x0
10ad0e: 52 push %edx
10ad0f: 89 55 c0 mov %edx,-0x40(%ebp)
10ad12: e8 6d 16 00 00 call 10c384 <_RBTree_Next_unprotected>
10ad17: 89 45 c4 mov %eax,-0x3c(%ebp)
10ad1a: 58 pop %eax
10ad1b: 5a pop %edx
10ad1c: 6a 01 push $0x1
10ad1e: 8b 55 c0 mov -0x40(%ebp),%edx
10ad21: 52 push %edx
10ad22: e8 5d 16 00 00 call 10c384 <_RBTree_Next_unprotected>
10ad27: 83 e8 08 sub $0x8,%eax
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);
10ad2a: 89 04 24 mov %eax,(%esp)
10ad2d: 89 f9 mov %edi,%ecx
10ad2f: 89 f2 mov %esi,%edx
10ad31: 89 d8 mov %ebx,%eax
10ad33: e8 c5 fc ff ff call 10a9fd <check_and_merge>
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
10ad38: 89 5f 04 mov %ebx,0x4(%edi)
before_node = after_node->next;
10ad3b: 8b 03 mov (%ebx),%eax
after_node->next = the_node;
10ad3d: 89 3b mov %edi,(%ebx)
the_node->next = before_node;
10ad3f: 89 07 mov %eax,(%edi)
before_node->previous = the_node;
10ad41: 89 78 04 mov %edi,0x4(%eax)
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
10ad44: 8b 45 c4 mov -0x3c(%ebp),%eax
10ad47: 83 e8 08 sub $0x8,%eax
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);
add_to_chain(free_chain, chunk);
check_and_merge(free_chain, chunk_tree, chunk, pred);
10ad4a: 89 04 24 mov %eax,(%esp)
10ad4d: 89 f9 mov %edi,%ecx
10ad4f: 89 f2 mov %esi,%edx
10ad51: 89 d8 mov %ebx,%eax
10ad53: e8 a5 fc ff ff call 10a9fd <check_and_merge>
10ad58: 83 c4 10 add $0x10,%esp
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
10ad5b: 31 c0 xor %eax,%eax
10ad5d: eb 05 jmp 10ad64 <rtems_rbheap_free+0xe6>
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
}
} else {
sc = RTEMS_INVALID_ID;
10ad5f: b8 04 00 00 00 mov $0x4,%eax
}
}
return sc;
}
10ad64: 8d 65 f4 lea -0xc(%ebp),%esp
10ad67: 5b pop %ebx
10ad68: 5e pop %esi
10ad69: 5f pop %edi
10ad6a: 5d pop %ebp
10ad6b: c3 ret
00115724 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
115724: 55 push %ebp
115725: 89 e5 mov %esp,%ebp
115727: 53 push %ebx
115728: 83 ec 14 sub $0x14,%esp
11572b: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
11572e: b8 0a 00 00 00 mov $0xa,%eax
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
115733: 85 db test %ebx,%ebx
115735: 74 6d je 1157a4 <rtems_signal_send+0x80>
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
115737: 50 push %eax
115738: 50 push %eax
115739: 8d 45 f4 lea -0xc(%ebp),%eax
11573c: 50 push %eax
11573d: ff 75 08 pushl 0x8(%ebp)
115740: e8 6f 3c 00 00 call 1193b4 <_Thread_Get>
switch ( location ) {
115745: 83 c4 10 add $0x10,%esp
115748: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
11574c: 75 51 jne 11579f <rtems_signal_send+0x7b>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
11574e: 8b 90 e4 00 00 00 mov 0xe4(%eax),%edx
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
115754: 83 7a 0c 00 cmpl $0x0,0xc(%edx)
115758: 74 39 je 115793 <rtems_signal_send+0x6f>
if ( asr->is_enabled ) {
11575a: 80 7a 08 00 cmpb $0x0,0x8(%edx)
11575e: 74 22 je 115782 <rtems_signal_send+0x5e>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
115760: 9c pushf
115761: fa cli
115762: 59 pop %ecx
*signal_set |= signals;
115763: 09 5a 14 or %ebx,0x14(%edx)
_ISR_Enable( _level );
115766: 51 push %ecx
115767: 9d popf
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
115768: 83 3d 60 83 14 00 00 cmpl $0x0,0x148360
11576f: 74 19 je 11578a <rtems_signal_send+0x66>
115771: 3b 05 64 83 14 00 cmp 0x148364,%eax
115777: 75 11 jne 11578a <rtems_signal_send+0x66><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
115779: c6 05 70 83 14 00 01 movb $0x1,0x148370
115780: eb 08 jmp 11578a <rtems_signal_send+0x66>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
115782: 9c pushf
115783: fa cli
115784: 58 pop %eax
*signal_set |= signals;
115785: 09 5a 18 or %ebx,0x18(%edx)
_ISR_Enable( _level );
115788: 50 push %eax
115789: 9d popf
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
11578a: e8 05 3c 00 00 call 119394 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11578f: 31 c0 xor %eax,%eax
115791: eb 11 jmp 1157a4 <rtems_signal_send+0x80>
}
_Thread_Enable_dispatch();
115793: e8 fc 3b 00 00 call 119394 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
115798: b8 0b 00 00 00 mov $0xb,%eax
11579d: eb 05 jmp 1157a4 <rtems_signal_send+0x80>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11579f: b8 04 00 00 00 mov $0x4,%eax
}
1157a4: 8b 5d fc mov -0x4(%ebp),%ebx
1157a7: c9 leave
1157a8: c3 ret
0010b68c <rtems_task_get_note>:
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
10b68c: 55 push %ebp
10b68d: 89 e5 mov %esp,%ebp
10b68f: 56 push %esi
10b690: 53 push %ebx
10b691: 83 ec 10 sub $0x10,%esp
10b694: 8b 55 08 mov 0x8(%ebp),%edx
10b697: 8b 75 0c mov 0xc(%ebp),%esi
10b69a: 8b 5d 10 mov 0x10(%ebp),%ebx
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
10b69d: b8 16 00 00 00 mov $0x16,%eax
{
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
10b6a2: 80 3d 54 cf 12 00 00 cmpb $0x0,0x12cf54
10b6a9: 74 5d je 10b708 <rtems_task_get_note+0x7c><== NEVER TAKEN
return RTEMS_NOT_CONFIGURED;
if ( !note )
10b6ab: 85 db test %ebx,%ebx
10b6ad: 74 4d je 10b6fc <rtems_task_get_note+0x70>
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
return RTEMS_INVALID_NUMBER;
10b6af: b0 0a mov $0xa,%al
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
10b6b1: 83 fe 0f cmp $0xf,%esi
10b6b4: 77 52 ja 10b708 <rtems_task_get_note+0x7c>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10b6b6: 85 d2 test %edx,%edx
10b6b8: a1 3c 19 13 00 mov 0x13193c,%eax
10b6bd: 74 05 je 10b6c4 <rtems_task_get_note+0x38>
10b6bf: 3b 50 08 cmp 0x8(%eax),%edx
10b6c2: 75 0e jne 10b6d2 <rtems_task_get_note+0x46>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10b6c4: 8b 80 e4 00 00 00 mov 0xe4(%eax),%eax
10b6ca: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10b6ce: 89 03 mov %eax,(%ebx)
10b6d0: eb 26 jmp 10b6f8 <rtems_task_get_note+0x6c>
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
10b6d2: 50 push %eax
10b6d3: 50 push %eax
10b6d4: 8d 45 f4 lea -0xc(%ebp),%eax
10b6d7: 50 push %eax
10b6d8: 52 push %edx
10b6d9: e8 fe 1f 00 00 call 10d6dc <_Thread_Get>
switch ( location ) {
10b6de: 83 c4 10 add $0x10,%esp
10b6e1: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10b6e5: 75 1c jne 10b703 <rtems_task_get_note+0x77>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10b6e7: 8b 80 e4 00 00 00 mov 0xe4(%eax),%eax
10b6ed: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10b6f1: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
10b6f3: e8 c4 1f 00 00 call 10d6bc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b6f8: 31 c0 xor %eax,%eax
10b6fa: eb 0c jmp 10b708 <rtems_task_get_note+0x7c>
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
if ( !note )
return RTEMS_INVALID_ADDRESS;
10b6fc: b8 09 00 00 00 mov $0x9,%eax
10b701: eb 05 jmp 10b708 <rtems_task_get_note+0x7c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b703: b8 04 00 00 00 mov $0x4,%eax
}
10b708: 8d 65 f8 lea -0x8(%ebp),%esp
10b70b: 5b pop %ebx
10b70c: 5e pop %esi
10b70d: 5d pop %ebp
10b70e: c3 ret
00110a2c <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
110a2c: 55 push %ebp
110a2d: 89 e5 mov %esp,%ebp
110a2f: 57 push %edi
110a30: 56 push %esi
110a31: 53 push %ebx
110a32: 83 ec 1c sub $0x1c,%esp
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
110a35: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
110a39: 0f 84 00 01 00 00 je 110b3f <rtems_task_mode+0x113>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
110a3f: 8b 35 ec e8 12 00 mov 0x12e8ec,%esi
api = executing->API_Extensions[ THREAD_API_RTEMS ];
110a45: 8b 9e e4 00 00 00 mov 0xe4(%esi),%ebx
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
110a4b: 80 7e 70 01 cmpb $0x1,0x70(%esi)
110a4f: 19 ff sbb %edi,%edi
110a51: 81 e7 00 01 00 00 and $0x100,%edi
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
110a57: 83 7e 78 00 cmpl $0x0,0x78(%esi)
110a5b: 74 06 je 110a63 <rtems_task_mode+0x37>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
110a5d: 81 cf 00 02 00 00 or $0x200,%edi
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
110a63: 80 7b 08 01 cmpb $0x1,0x8(%ebx)
110a67: 19 c9 sbb %ecx,%ecx
110a69: 81 e1 00 04 00 00 and $0x400,%ecx
old_mode |= _ISR_Get_level();
110a6f: 89 4d e4 mov %ecx,-0x1c(%ebp)
110a72: e8 89 c4 ff ff call 10cf00 <_CPU_ISR_Get_level>
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
110a77: 8b 4d e4 mov -0x1c(%ebp),%ecx
110a7a: 09 c8 or %ecx,%eax
old_mode |= _ISR_Get_level();
110a7c: 09 f8 or %edi,%eax
110a7e: 8b 55 10 mov 0x10(%ebp),%edx
110a81: 89 02 mov %eax,(%edx)
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
110a83: f7 45 0c 00 01 00 00 testl $0x100,0xc(%ebp)
110a8a: 74 0f je 110a9b <rtems_task_mode+0x6f>
110a8c: 8b 45 08 mov 0x8(%ebp),%eax
110a8f: c1 e8 08 shr $0x8,%eax
110a92: 83 f0 01 xor $0x1,%eax
110a95: 83 e0 01 and $0x1,%eax
110a98: 88 46 70 mov %al,0x70(%esi)
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
if ( mask & RTEMS_TIMESLICE_MASK ) {
110a9b: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
110aa2: 74 21 je 110ac5 <rtems_task_mode+0x99>
if ( _Modes_Is_timeslice(mode_set) ) {
110aa4: f7 45 08 00 02 00 00 testl $0x200,0x8(%ebp)
110aab: 74 11 je 110abe <rtems_task_mode+0x92>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
110aad: c7 46 78 01 00 00 00 movl $0x1,0x78(%esi)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
110ab4: a1 b8 e3 12 00 mov 0x12e3b8,%eax
110ab9: 89 46 74 mov %eax,0x74(%esi)
110abc: eb 07 jmp 110ac5 <rtems_task_mode+0x99>
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
110abe: c7 46 78 00 00 00 00 movl $0x0,0x78(%esi)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
110ac5: f6 45 0c 01 testb $0x1,0xc(%ebp)
110ac9: 74 0a je 110ad5 <rtems_task_mode+0xa9>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
110acb: f6 45 08 01 testb $0x1,0x8(%ebp)
110acf: 74 03 je 110ad4 <rtems_task_mode+0xa8>
110ad1: fa cli
110ad2: eb 01 jmp 110ad5 <rtems_task_mode+0xa9>
110ad4: fb sti
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
110ad5: 31 d2 xor %edx,%edx
if ( mask & RTEMS_ASR_MASK ) {
110ad7: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
110ade: 74 2c je 110b0c <rtems_task_mode+0xe0>
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
110ae0: 8b 45 08 mov 0x8(%ebp),%eax
110ae3: c1 e8 0a shr $0xa,%eax
110ae6: 83 f0 01 xor $0x1,%eax
110ae9: 83 e0 01 and $0x1,%eax
if ( is_asr_enabled != asr->is_enabled ) {
110aec: 3a 43 08 cmp 0x8(%ebx),%al
110aef: 74 1b je 110b0c <rtems_task_mode+0xe0>
asr->is_enabled = is_asr_enabled;
110af1: 88 43 08 mov %al,0x8(%ebx)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
110af4: 9c pushf
110af5: fa cli
110af6: 58 pop %eax
_signals = information->signals_pending;
110af7: 8b 53 18 mov 0x18(%ebx),%edx
information->signals_pending = information->signals_posted;
110afa: 8b 4b 14 mov 0x14(%ebx),%ecx
110afd: 89 4b 18 mov %ecx,0x18(%ebx)
information->signals_posted = _signals;
110b00: 89 53 14 mov %edx,0x14(%ebx)
_ISR_Enable( _level );
110b03: 50 push %eax
110b04: 9d popf
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
110b05: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
110b09: 0f 95 c2 setne %dl
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
110b0c: 31 c0 xor %eax,%eax
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
110b0e: 83 3d 20 e5 12 00 03 cmpl $0x3,0x12e520
110b15: 75 2d jne 110b44 <rtems_task_mode+0x118>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
110b17: 8b 0d ec e8 12 00 mov 0x12e8ec,%ecx
if ( are_signals_pending ||
110b1d: 84 d2 test %dl,%dl
110b1f: 75 0e jne 110b2f <rtems_task_mode+0x103>
110b21: 3b 0d f0 e8 12 00 cmp 0x12e8f0,%ecx
110b27: 74 1b je 110b44 <rtems_task_mode+0x118>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
110b29: 80 79 70 00 cmpb $0x0,0x70(%ecx)
110b2d: 74 15 je 110b44 <rtems_task_mode+0x118> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
110b2f: c6 05 f8 e8 12 00 01 movb $0x1,0x12e8f8
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
110b36: e8 95 b1 ff ff call 10bcd0 <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
110b3b: 31 c0 xor %eax,%eax
110b3d: eb 05 jmp 110b44 <rtems_task_mode+0x118>
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
110b3f: b8 09 00 00 00 mov $0x9,%eax
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
110b44: 83 c4 1c add $0x1c,%esp
110b47: 5b pop %ebx
110b48: 5e pop %esi
110b49: 5f pop %edi
110b4a: 5d pop %ebp
110b4b: c3 ret
0010d48c <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
10d48c: 55 push %ebp
10d48d: 89 e5 mov %esp,%ebp
10d48f: 56 push %esi
10d490: 53 push %ebx
10d491: 83 ec 10 sub $0x10,%esp
10d494: 8b 5d 0c mov 0xc(%ebp),%ebx
10d497: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10d49a: 85 db test %ebx,%ebx
10d49c: 74 10 je 10d4ae <rtems_task_set_priority+0x22>
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 ) );
10d49e: 0f b6 15 88 e1 12 00 movzbl 0x12e188,%edx
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
10d4a5: b8 13 00 00 00 mov $0x13,%eax
)
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10d4aa: 39 d3 cmp %edx,%ebx
10d4ac: 77 52 ja 10d500 <rtems_task_set_priority+0x74>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
10d4ae: b8 09 00 00 00 mov $0x9,%eax
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
10d4b3: 85 f6 test %esi,%esi
10d4b5: 74 49 je 10d500 <rtems_task_set_priority+0x74>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10d4b7: 51 push %ecx
10d4b8: 51 push %ecx
10d4b9: 8d 45 f4 lea -0xc(%ebp),%eax
10d4bc: 50 push %eax
10d4bd: ff 75 08 pushl 0x8(%ebp)
10d4c0: e8 d7 1d 00 00 call 10f29c <_Thread_Get>
switch ( location ) {
10d4c5: 83 c4 10 add $0x10,%esp
10d4c8: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
10d4cc: 75 2d jne 10d4fb <rtems_task_set_priority+0x6f>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
10d4ce: 8b 50 14 mov 0x14(%eax),%edx
10d4d1: 89 16 mov %edx,(%esi)
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
10d4d3: 85 db test %ebx,%ebx
10d4d5: 74 1b je 10d4f2 <rtems_task_set_priority+0x66>
the_thread->real_priority = new_priority;
10d4d7: 89 58 18 mov %ebx,0x18(%eax)
if ( the_thread->resource_count == 0 ||
10d4da: 83 78 1c 00 cmpl $0x0,0x1c(%eax)
10d4de: 74 05 je 10d4e5 <rtems_task_set_priority+0x59>
10d4e0: 39 58 14 cmp %ebx,0x14(%eax)
10d4e3: 76 0d jbe 10d4f2 <rtems_task_set_priority+0x66><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
10d4e5: 52 push %edx
10d4e6: 6a 00 push $0x0
10d4e8: 53 push %ebx
10d4e9: 50 push %eax
10d4ea: e8 9d 19 00 00 call 10ee8c <_Thread_Change_priority>
10d4ef: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10d4f2: e8 85 1d 00 00 call 10f27c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d4f7: 31 c0 xor %eax,%eax
10d4f9: eb 05 jmp 10d500 <rtems_task_set_priority+0x74>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d4fb: b8 04 00 00 00 mov $0x4,%eax
}
10d500: 8d 65 f8 lea -0x8(%ebp),%esp
10d503: 5b pop %ebx
10d504: 5e pop %esi
10d505: 5d pop %ebp
10d506: c3 ret
00115fac <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
115fac: 55 push %ebp
115fad: 89 e5 mov %esp,%ebp
115faf: 83 ec 1c sub $0x1c,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
115fb2: 8d 45 f4 lea -0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
115fb5: 50 push %eax
115fb6: ff 75 08 pushl 0x8(%ebp)
115fb9: 68 84 87 14 00 push $0x148784
115fbe: e8 2d 28 00 00 call 1187f0 <_Objects_Get>
switch ( location ) {
115fc3: 83 c4 10 add $0x10,%esp
115fc6: 83 7d f4 00 cmpl $0x0,-0xc(%ebp)
115fca: 75 1e jne 115fea <rtems_timer_cancel+0x3e>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
115fcc: 83 78 38 04 cmpl $0x4,0x38(%eax)
115fd0: 74 0f je 115fe1 <rtems_timer_cancel+0x35><== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
115fd2: 83 ec 0c sub $0xc,%esp
115fd5: 83 c0 10 add $0x10,%eax
115fd8: 50 push %eax
115fd9: e8 62 41 00 00 call 11a140 <_Watchdog_Remove>
115fde: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
115fe1: e8 ae 33 00 00 call 119394 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115fe6: 31 c0 xor %eax,%eax
115fe8: eb 05 jmp 115fef <rtems_timer_cancel+0x43>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115fea: b8 04 00 00 00 mov $0x4,%eax
}
115fef: c9 leave
115ff0: c3 ret
001168b9 <rtems_timer_initiate_server>:
rtems_status_code rtems_timer_initiate_server(
uint32_t priority,
uint32_t stack_size,
rtems_attribute attribute_set
)
{
1168b9: 55 push %ebp
1168ba: 89 e5 mov %esp,%ebp
1168bc: 53 push %ebx
1168bd: 83 ec 24 sub $0x24,%esp
1168c0: 8b 55 08 mov 0x8(%ebp),%edx
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
1168c3: 31 c0 xor %eax,%eax
1168c5: 85 d2 test %edx,%edx
1168c7: 74 0f je 1168d8 <rtems_timer_initiate_server+0x1f>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
1168c9: 0f b6 05 48 f8 13 00 movzbl 0x13f848,%eax
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
1168d0: 39 c2 cmp %eax,%edx
1168d2: 0f 96 c0 setbe %al
1168d5: 0f b6 c0 movzbl %al,%eax
* Make sure the requested priority is valid. The if is
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
1168d8: 85 c0 test %eax,%eax
1168da: 75 0d jne 1168e9 <rtems_timer_initiate_server+0x30>
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
return RTEMS_INVALID_PRIORITY;
1168dc: b0 13 mov $0x13,%al
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
1168de: 42 inc %edx
1168df: 0f 85 5c 01 00 00 jne 116a41 <rtems_timer_initiate_server+0x188>
return RTEMS_INVALID_PRIORITY;
_priority = 0;
1168e5: 31 db xor %ebx,%ebx
1168e7: eb 02 jmp 1168eb <rtems_timer_initiate_server+0x32>
* Make sure the requested priority is valid. The if is
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
1168e9: 89 d3 mov %edx,%ebx
1168eb: e8 78 fc ff ff call 116568 <_Thread_Dispatch_increment_disable_level>
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
1168f0: 8a 15 c0 37 14 00 mov 0x1437c0,%dl
initialized = true;
1168f6: c6 05 c0 37 14 00 01 movb $0x1,0x1437c0
_Thread_Enable_dispatch();
1168fd: 88 55 e4 mov %dl,-0x1c(%ebp)
116900: e8 8f 2a 00 00 call 119394 <_Thread_Enable_dispatch>
if ( tmpInitialized )
return RTEMS_INCORRECT_STATE;
116905: b8 0e 00 00 00 mov $0xe,%eax
_Thread_Disable_dispatch();
tmpInitialized = initialized;
initialized = true;
_Thread_Enable_dispatch();
if ( tmpInitialized )
11690a: 8a 55 e4 mov -0x1c(%ebp),%dl
11690d: 84 d2 test %dl,%dl
11690f: 0f 85 2c 01 00 00 jne 116a41 <rtems_timer_initiate_server+0x188><== NEVER TAKEN
* other library rules. For example, if using a TSR written in Ada the
* Server should run at the same priority as the priority Ada task.
* Otherwise, the priority ceiling for the mutex used to protect the
* GNAT run-time is violated.
*/
status = rtems_task_create(
116915: 50 push %eax
116916: 50 push %eax
116917: 8d 45 f4 lea -0xc(%ebp),%eax
11691a: 50 push %eax
11691b: 8b 45 10 mov 0x10(%ebp),%eax
11691e: 80 cc 80 or $0x80,%ah
116921: 50 push %eax
116922: 68 00 01 00 00 push $0x100
116927: ff 75 0c pushl 0xc(%ebp)
11692a: 53 push %ebx
11692b: 68 45 4d 49 54 push $0x54494d45
116930: e8 77 ee ff ff call 1157ac <rtems_task_create>
/* user may want floating point but we need */
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
116935: 83 c4 20 add $0x20,%esp
116938: 85 c0 test %eax,%eax
11693a: 74 0c je 116948 <rtems_timer_initiate_server+0x8f>
initialized = false;
11693c: c6 05 c0 37 14 00 00 movb $0x0,0x1437c0
116943: e9 f9 00 00 00 jmp 116a41 <rtems_timer_initiate_server+0x188>
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
&_RTEMS_tasks_Information,
_Objects_Get_index(id)
116948: 8b 5d f4 mov -0xc(%ebp),%ebx
*/
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return NULL;
#endif
return information->local_table[ index ];
11694b: 0f b7 d3 movzwl %bx,%edx
11694e: a1 ec 7d 14 00 mov 0x147dec,%eax
116953: 8b 04 90 mov (%eax,%edx,4),%eax
/*
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
116956: a3 c4 37 14 00 mov %eax,0x1437c4
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
11695b: c7 05 f4 37 14 00 f8 movl $0x1437f8,0x1437f4
116962: 37 14 00
head->previous = NULL;
116965: c7 05 f8 37 14 00 00 movl $0x0,0x1437f8
11696c: 00 00 00
tail->previous = head;
11696f: c7 05 fc 37 14 00 f4 movl $0x1437f4,0x1437fc
116976: 37 14 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
116979: c7 05 2c 38 14 00 30 movl $0x143830,0x14382c
116980: 38 14 00
head->previous = NULL;
116983: c7 05 30 38 14 00 00 movl $0x0,0x143830
11698a: 00 00 00
tail->previous = head;
11698d: c7 05 34 38 14 00 2c movl $0x14382c,0x143834
116994: 38 14 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
116997: c7 05 d4 37 14 00 00 movl $0x0,0x1437d4
11699e: 00 00 00
the_watchdog->routine = routine;
1169a1: c7 05 e8 37 14 00 18 movl $0x119218,0x1437e8
1169a8: 92 11 00
the_watchdog->id = id;
1169ab: 89 1d ec 37 14 00 mov %ebx,0x1437ec
the_watchdog->user_data = user_data;
1169b1: c7 05 f0 37 14 00 00 movl $0x0,0x1437f0
1169b8: 00 00 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1169bb: c7 05 0c 38 14 00 00 movl $0x0,0x14380c
1169c2: 00 00 00
the_watchdog->routine = routine;
1169c5: c7 05 20 38 14 00 18 movl $0x119218,0x143820
1169cc: 92 11 00
the_watchdog->id = id;
1169cf: 89 1d 24 38 14 00 mov %ebx,0x143824
the_watchdog->user_data = user_data;
1169d5: c7 05 28 38 14 00 00 movl $0x0,0x143828
1169dc: 00 00 00
/*
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
1169df: c7 05 c8 37 14 00 09 movl $0x116609,0x1437c8
1169e6: 66 11 00
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
1169e9: a1 48 7f 14 00 mov 0x147f48,%eax
1169ee: a3 00 38 14 00 mov %eax,0x143800
1169f3: 6a 00 push $0x0
1169f5: 68 00 ca 9a 3b push $0x3b9aca00
1169fa: ff 35 14 7e 14 00 pushl 0x147e14
116a00: ff 35 10 7e 14 00 pushl 0x147e10
116a06: e8 e9 3b 01 00 call 12a5f4 <__divdi3>
116a0b: 83 c4 0c add $0xc,%esp
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
116a0e: a3 38 38 14 00 mov %eax,0x143838
ts->insert_chain = NULL;
116a13: c7 05 3c 38 14 00 00 movl $0x0,0x14383c
116a1a: 00 00 00
ts->active = false;
116a1d: c6 05 40 38 14 00 00 movb $0x0,0x143840
/*
* The default timer server is now available.
*/
_Timer_server = ts;
116a24: c7 05 c4 87 14 00 c4 movl $0x1437c4,0x1487c4
116a2b: 37 14 00
/*
* Start the timer server
*/
status = rtems_task_start(
116a2e: 68 c4 37 14 00 push $0x1437c4
116a33: 68 32 67 11 00 push $0x116732
116a38: 53 push %ebx
116a39: e8 56 f3 ff ff call 115d94 <rtems_task_start>
116a3e: 83 c4 10 add $0x10,%esp
initialized = false;
}
#endif
return status;
}
116a41: 8b 5d fc mov -0x4(%ebp),%ebx
116a44: c9 leave
116a45: c3 ret
0011645c <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
11645c: 55 push %ebp
11645d: 89 e5 mov %esp,%ebp
11645f: 57 push %edi
116460: 56 push %esi
116461: 53 push %ebx
116462: 83 ec 1c sub $0x1c,%esp
116465: 8b 75 0c mov 0xc(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
116468: 8b 1d c4 87 14 00 mov 0x1487c4,%ebx
if ( !timer_server )
11646e: 85 db test %ebx,%ebx
116470: 0f 84 e1 00 00 00 je 116557 <rtems_timer_server_fire_when+0xfb>
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
return RTEMS_NOT_DEFINED;
116476: b8 0b 00 00 00 mov $0xb,%eax
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
11647b: 80 3d 24 7e 14 00 00 cmpb $0x0,0x147e24
116482: 0f 84 d6 00 00 00 je 11655e <rtems_timer_server_fire_when+0x102><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
116488: b0 09 mov $0x9,%al
return RTEMS_INCORRECT_STATE;
if ( !_TOD.is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
11648a: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
11648e: 0f 84 ca 00 00 00 je 11655e <rtems_timer_server_fire_when+0x102>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
116494: 83 ec 0c sub $0xc,%esp
116497: 56 push %esi
116498: e8 b3 d4 ff ff call 113950 <_TOD_Validate>
11649d: 83 c4 10 add $0x10,%esp
1164a0: 84 c0 test %al,%al
1164a2: 75 0a jne 1164ae <rtems_timer_server_fire_when+0x52>
return RTEMS_INVALID_CLOCK;
1164a4: b8 14 00 00 00 mov $0x14,%eax
1164a9: e9 b0 00 00 00 jmp 11655e <rtems_timer_server_fire_when+0x102>
seconds = _TOD_To_seconds( wall_time );
1164ae: 83 ec 0c sub $0xc,%esp
1164b1: 56 push %esi
1164b2: e8 25 d4 ff ff call 1138dc <_TOD_To_seconds>
1164b7: 89 c6 mov %eax,%esi
1164b9: 6a 00 push $0x0
1164bb: 68 00 ca 9a 3b push $0x3b9aca00
1164c0: ff 35 14 7e 14 00 pushl 0x147e14
1164c6: ff 35 10 7e 14 00 pushl 0x147e10
1164cc: e8 23 41 01 00 call 12a5f4 <__divdi3>
if ( seconds <= _TOD_Seconds_since_epoch() )
1164d1: 83 c4 20 add $0x20,%esp
1164d4: 39 c6 cmp %eax,%esi
1164d6: 76 cc jbe 1164a4 <rtems_timer_server_fire_when+0x48>
1164d8: 50 push %eax
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
1164d9: 8d 45 e4 lea -0x1c(%ebp),%eax
1164dc: 50 push %eax
1164dd: ff 75 08 pushl 0x8(%ebp)
1164e0: 68 84 87 14 00 push $0x148784
1164e5: e8 06 23 00 00 call 1187f0 <_Objects_Get>
1164ea: 89 c7 mov %eax,%edi
switch ( location ) {
1164ec: 83 c4 10 add $0x10,%esp
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1164ef: b8 04 00 00 00 mov $0x4,%eax
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
1164f4: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
1164f8: 75 64 jne 11655e <rtems_timer_server_fire_when+0x102>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
1164fa: 83 ec 0c sub $0xc,%esp
1164fd: 8d 47 10 lea 0x10(%edi),%eax
116500: 50 push %eax
116501: e8 3a 3c 00 00 call 11a140 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
116506: c7 47 38 03 00 00 00 movl $0x3,0x38(%edi)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
11650d: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
the_watchdog->routine = routine;
116514: 8b 45 10 mov 0x10(%ebp),%eax
116517: 89 47 2c mov %eax,0x2c(%edi)
the_watchdog->id = id;
11651a: 8b 45 08 mov 0x8(%ebp),%eax
11651d: 89 47 30 mov %eax,0x30(%edi)
the_watchdog->user_data = user_data;
116520: 8b 45 14 mov 0x14(%ebp),%eax
116523: 89 47 34 mov %eax,0x34(%edi)
116526: 6a 00 push $0x0
116528: 68 00 ca 9a 3b push $0x3b9aca00
11652d: ff 35 14 7e 14 00 pushl 0x147e14
116533: ff 35 10 7e 14 00 pushl 0x147e10
116539: e8 b6 40 01 00 call 12a5f4 <__divdi3>
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
11653e: 29 c6 sub %eax,%esi
116540: 89 77 1c mov %esi,0x1c(%edi)
(*timer_server->schedule_operation)( timer_server, the_timer );
116543: 83 c4 18 add $0x18,%esp
116546: 57 push %edi
116547: 53 push %ebx
116548: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
11654b: e8 44 2e 00 00 call 119394 <_Thread_Enable_dispatch>
116550: 83 c4 10 add $0x10,%esp
return RTEMS_SUCCESSFUL;
116553: 31 c0 xor %eax,%eax
116555: eb 07 jmp 11655e <rtems_timer_server_fire_when+0x102>
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
116557: b8 0e 00 00 00 mov $0xe,%eax
11655c: eb 00 jmp 11655e <rtems_timer_server_fire_when+0x102>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11655e: 8d 65 f4 lea -0xc(%ebp),%esp
116561: 5b pop %ebx
116562: 5e pop %esi
116563: 5f pop %edi
116564: 5d pop %ebp
116565: c3 ret
0010a400 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
10a400: 55 push %ebp
10a401: 89 e5 mov %esp,%ebp
10a403: 83 ec 08 sub $0x8,%esp
10a406: 8b 4d 08 mov 0x8(%ebp),%ecx
switch ( policy ) {
10a409: 83 f9 04 cmp $0x4,%ecx
10a40c: 77 0b ja 10a419 <sched_get_priority_max+0x19>
10a40e: b8 01 00 00 00 mov $0x1,%eax
10a413: d3 e0 shl %cl,%eax
10a415: a8 17 test $0x17,%al
10a417: 75 10 jne 10a429 <sched_get_priority_max+0x29><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10a419: e8 36 74 00 00 call 111854 <__errno>
10a41e: c7 00 16 00 00 00 movl $0x16,(%eax)
10a424: 83 c8 ff or $0xffffffff,%eax
10a427: eb 08 jmp 10a431 <sched_get_priority_max+0x31>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
10a429: 0f b6 05 88 b1 12 00 movzbl 0x12b188,%eax
10a430: 48 dec %eax
}
10a431: c9 leave
10a432: c3 ret
0010a434 <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
10a434: 55 push %ebp
10a435: 89 e5 mov %esp,%ebp
10a437: 83 ec 08 sub $0x8,%esp
10a43a: 8b 4d 08 mov 0x8(%ebp),%ecx
switch ( policy ) {
10a43d: 83 f9 04 cmp $0x4,%ecx
10a440: 77 11 ja 10a453 <sched_get_priority_min+0x1f>
10a442: ba 01 00 00 00 mov $0x1,%edx
10a447: d3 e2 shl %cl,%edx
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
10a449: b8 01 00 00 00 mov $0x1,%eax
int sched_get_priority_min(
int policy
)
{
switch ( policy ) {
10a44e: 80 e2 17 and $0x17,%dl
10a451: 75 0e jne 10a461 <sched_get_priority_min+0x2d><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10a453: e8 fc 73 00 00 call 111854 <__errno>
10a458: c7 00 16 00 00 00 movl $0x16,(%eax)
10a45e: 83 c8 ff or $0xffffffff,%eax
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
10a461: c9 leave
10a462: c3 ret
0010a464 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
10a464: 55 push %ebp
10a465: 89 e5 mov %esp,%ebp
10a467: 56 push %esi
10a468: 53 push %ebx
10a469: 8b 75 08 mov 0x8(%ebp),%esi
10a46c: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10a46f: 85 f6 test %esi,%esi
10a471: 74 16 je 10a489 <sched_rr_get_interval+0x25><== NEVER TAKEN
10a473: e8 a4 c7 ff ff call 106c1c <getpid>
10a478: 39 c6 cmp %eax,%esi
10a47a: 74 0d je 10a489 <sched_rr_get_interval+0x25>
rtems_set_errno_and_return_minus_one( ESRCH );
10a47c: e8 d3 73 00 00 call 111854 <__errno>
10a481: c7 00 03 00 00 00 movl $0x3,(%eax)
10a487: eb 0f jmp 10a498 <sched_rr_get_interval+0x34>
if ( !interval )
10a489: 85 db test %ebx,%ebx
10a48b: 75 10 jne 10a49d <sched_rr_get_interval+0x39>
rtems_set_errno_and_return_minus_one( EINVAL );
10a48d: e8 c2 73 00 00 call 111854 <__errno>
10a492: c7 00 16 00 00 00 movl $0x16,(%eax)
10a498: 83 c8 ff or $0xffffffff,%eax
10a49b: eb 13 jmp 10a4b0 <sched_rr_get_interval+0x4c>
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
10a49d: 50 push %eax
10a49e: 50 push %eax
10a49f: 53 push %ebx
10a4a0: ff 35 a8 f3 12 00 pushl 0x12f3a8
10a4a6: e8 2d 2f 00 00 call 10d3d8 <_Timespec_From_ticks>
return 0;
10a4ab: 83 c4 10 add $0x10,%esp
10a4ae: 31 c0 xor %eax,%eax
}
10a4b0: 8d 65 f8 lea -0x8(%ebp),%esp
10a4b3: 5b pop %ebx
10a4b4: 5e pop %esi
10a4b5: 5d pop %ebp
10a4b6: c3 ret
0010a90c <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
10a90c: 55 push %ebp
10a90d: 89 e5 mov %esp,%ebp
10a90f: 57 push %edi
10a910: 56 push %esi
10a911: 53 push %ebx
10a912: 83 ec 1c sub $0x1c,%esp
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10a915: a1 b4 31 13 00 mov 0x1331b4,%eax
10a91a: 40 inc %eax
10a91b: a3 b4 31 13 00 mov %eax,0x1331b4
return _Thread_Dispatch_disable_level;
10a920: a1 b4 31 13 00 mov 0x1331b4,%eax
va_list arg;
mode_t mode;
unsigned int value = 0;
10a925: 31 db xor %ebx,%ebx
Objects_Locations location;
size_t name_len;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10a927: 8b 75 0c mov 0xc(%ebp),%esi
10a92a: 81 e6 00 02 00 00 and $0x200,%esi
10a930: 74 03 je 10a935 <sem_open+0x29>
va_start(arg, oflag);
mode = va_arg( arg, mode_t );
value = va_arg( arg, unsigned int );
10a932: 8b 5d 14 mov 0x14(%ebp),%ebx
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id, &name_len );
10a935: 8d 45 e4 lea -0x1c(%ebp),%eax
const char *name,
Objects_Id *id,
size_t *len
)
{
return _POSIX_Name_to_id( &_POSIX_Semaphore_Information, name, id, len );
10a938: 50 push %eax
10a939: 8d 45 d8 lea -0x28(%ebp),%eax
10a93c: 50 push %eax
10a93d: ff 75 08 pushl 0x8(%ebp)
10a940: 68 78 34 13 00 push $0x133478
10a945: e8 16 fa ff ff call 10a360 <_POSIX_Name_to_id>
10a94a: 89 c7 mov %eax,%edi
* 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 ) {
10a94c: 83 c4 10 add $0x10,%esp
10a94f: 85 c0 test %eax,%eax
10a951: 74 17 je 10a96a <sem_open+0x5e>
/*
* 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) ) ) {
10a953: 83 f8 02 cmp $0x2,%eax
10a956: 75 04 jne 10a95c <sem_open+0x50>
10a958: 85 f6 test %esi,%esi
10a95a: 75 56 jne 10a9b2 <sem_open+0xa6>
_Thread_Enable_dispatch();
10a95c: e8 5b 2d 00 00 call 10d6bc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
10a961: e8 32 7f 00 00 call 112898 <__errno>
10a966: 89 38 mov %edi,(%eax)
10a968: eb 72 jmp 10a9dc <sem_open+0xd0>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10a96a: 8b 45 0c mov 0xc(%ebp),%eax
10a96d: 25 00 0a 00 00 and $0xa00,%eax
10a972: 3d 00 0a 00 00 cmp $0xa00,%eax
10a977: 75 12 jne 10a98b <sem_open+0x7f>
_Thread_Enable_dispatch();
10a979: e8 3e 2d 00 00 call 10d6bc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
10a97e: e8 15 7f 00 00 call 112898 <__errno>
10a983: c7 00 11 00 00 00 movl $0x11,(%eax)
10a989: eb 51 jmp 10a9dc <sem_open+0xd0>
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
sem_t *id,
Objects_Locations *location
)
{
return (POSIX_Semaphore_Control *)
10a98b: 50 push %eax
}
the_semaphore = _POSIX_Semaphore_Get( (sem_t *) &the_semaphore_id, &location );
10a98c: 8d 45 e0 lea -0x20(%ebp),%eax
10a98f: 50 push %eax
10a990: ff 75 d8 pushl -0x28(%ebp)
10a993: 68 78 34 13 00 push $0x133478
10a998: e8 27 21 00 00 call 10cac4 <_Objects_Get>
10a99d: 89 45 dc mov %eax,-0x24(%ebp)
the_semaphore->open_count += 1;
10a9a0: ff 40 18 incl 0x18(%eax)
_Thread_Enable_dispatch();
10a9a3: e8 14 2d 00 00 call 10d6bc <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10a9a8: e8 0f 2d 00 00 call 10d6bc <_Thread_Enable_dispatch>
goto return_id;
10a9ad: 83 c4 10 add $0x10,%esp
10a9b0: eb 22 jmp 10a9d4 <sem_open+0xc8>
/*
* 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(
10a9b2: 83 ec 0c sub $0xc,%esp
10a9b5: 8d 45 dc lea -0x24(%ebp),%eax
10a9b8: 50 push %eax
10a9b9: 53 push %ebx
10a9ba: 6a 00 push $0x0
10a9bc: ff 75 e4 pushl -0x1c(%ebp)
10a9bf: ff 75 08 pushl 0x8(%ebp)
10a9c2: e8 11 57 00 00 call 1100d8 <_POSIX_Semaphore_Create_support>
10a9c7: 89 c3 mov %eax,%ebx
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
10a9c9: 83 c4 20 add $0x20,%esp
10a9cc: e8 eb 2c 00 00 call 10d6bc <_Thread_Enable_dispatch>
if ( status == -1 )
10a9d1: 43 inc %ebx
10a9d2: 74 08 je 10a9dc <sem_open+0xd0> <== NEVER TAKEN
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;
10a9d4: 8b 45 dc mov -0x24(%ebp),%eax
10a9d7: 83 c0 08 add $0x8,%eax
10a9da: eb 03 jmp 10a9df <sem_open+0xd3>
*/
_Thread_Enable_dispatch();
if ( status == -1 )
return SEM_FAILED;
10a9dc: 83 c8 ff or $0xffffffff,%eax
the_semaphore->Semaphore_id = the_semaphore->Object.id;
return &the_semaphore->Semaphore_id;
#else
return (sem_t *)&the_semaphore->Object.id;
#endif
}
10a9df: 8d 65 f4 lea -0xc(%ebp),%esp
10a9e2: 5b pop %ebx
10a9e3: 5e pop %esi
10a9e4: 5f pop %edi
10a9e5: 5d pop %ebp
10a9e6: c3 ret
0010cc08 <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
10cc08: 55 push %ebp
10cc09: 89 e5 mov %esp,%ebp
10cc0b: 53 push %ebx
10cc0c: 83 ec 1c sub $0x1c,%esp
*
* 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 );
10cc0f: 8d 45 f4 lea -0xc(%ebp),%eax
10cc12: 50 push %eax
10cc13: ff 75 0c pushl 0xc(%ebp)
10cc16: e8 49 49 00 00 call 111564 <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10cc1b: 83 c4 0c add $0xc,%esp
10cc1e: 83 f8 03 cmp $0x3,%eax
10cc21: 0f 94 c3 sete %bl
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
10cc24: ff 75 f4 pushl -0xc(%ebp)
10cc27: 0f b6 c3 movzbl %bl,%eax
10cc2a: 50 push %eax
10cc2b: ff 75 08 pushl 0x8(%ebp)
10cc2e: e8 59 53 00 00 call 111f8c <_POSIX_Semaphore_Wait_support>
* This service only gives us the option to block. We used a polling
* attempt to obtain if the abstime was not in the future. If we did
* not obtain the semaphore, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
10cc33: 83 c4 10 add $0x10,%esp
10cc36: 84 db test %bl,%bl
10cc38: 75 00 jne 10cc3a <sem_timedwait+0x32> <== ALWAYS TAKEN
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
10cc3a: 8b 5d fc mov -0x4(%ebp),%ebx
10cc3d: c9 leave
10cc3e: c3 ret
0010a2a8 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
10a2a8: 55 push %ebp
10a2a9: 89 e5 mov %esp,%ebp
10a2ab: 57 push %edi
10a2ac: 56 push %esi
10a2ad: 53 push %ebx
10a2ae: 83 ec 1c sub $0x1c,%esp
10a2b1: 8b 5d 08 mov 0x8(%ebp),%ebx
10a2b4: 8b 45 10 mov 0x10(%ebp),%eax
ISR_Level level;
if ( oact )
10a2b7: 85 c0 test %eax,%eax
10a2b9: 74 12 je 10a2cd <sigaction+0x25>
*oact = _POSIX_signals_Vectors[ sig ];
10a2bb: 6b f3 0c imul $0xc,%ebx,%esi
10a2be: 81 c6 68 09 13 00 add $0x130968,%esi
10a2c4: b9 03 00 00 00 mov $0x3,%ecx
10a2c9: 89 c7 mov %eax,%edi
10a2cb: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( !sig )
10a2cd: 85 db test %ebx,%ebx
10a2cf: 75 02 jne 10a2d3 <sigaction+0x2b>
10a2d1: eb 0f jmp 10a2e2 <sigaction+0x3a>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10a2d3: 8d 43 ff lea -0x1(%ebx),%eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
10a2d6: 83 f8 1f cmp $0x1f,%eax
10a2d9: 76 02 jbe 10a2dd <sigaction+0x35>
10a2db: eb 05 jmp 10a2e2 <sigaction+0x3a>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
10a2dd: 83 fb 09 cmp $0x9,%ebx
10a2e0: 75 10 jne 10a2f2 <sigaction+0x4a>
rtems_set_errno_and_return_minus_one( EINVAL );
10a2e2: e8 b5 78 00 00 call 111b9c <__errno>
10a2e7: c7 00 16 00 00 00 movl $0x16,(%eax)
10a2ed: 83 c8 ff or $0xffffffff,%eax
10a2f0: eb 55 jmp 10a347 <sigaction+0x9f>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
10a2f2: 83 7d 0c 00 cmpl $0x0,0xc(%ebp)
10a2f6: 74 4d je 10a345 <sigaction+0x9d> <== NEVER TAKEN
/*
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
10a2f8: 9c pushf
10a2f9: fa cli
10a2fa: 8f 45 e4 popl -0x1c(%ebp)
if ( act->sa_handler == SIG_DFL ) {
10a2fd: 8b 45 0c mov 0xc(%ebp),%eax
10a300: 83 78 08 00 cmpl $0x0,0x8(%eax)
10a304: 75 1a jne 10a320 <sigaction+0x78>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
10a306: 6b f3 0c imul $0xc,%ebx,%esi
10a309: 8d 86 68 09 13 00 lea 0x130968(%esi),%eax
10a30f: 81 c6 a8 19 12 00 add $0x1219a8,%esi
10a315: b9 03 00 00 00 mov $0x3,%ecx
10a31a: 89 c7 mov %eax,%edi
10a31c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10a31e: eb 21 jmp 10a341 <sigaction+0x99>
} else {
_POSIX_signals_Clear_process_signals( sig );
10a320: 83 ec 0c sub $0xc,%esp
10a323: 53 push %ebx
10a324: e8 6f 4c 00 00 call 10ef98 <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
10a329: 6b db 0c imul $0xc,%ebx,%ebx
10a32c: 81 c3 68 09 13 00 add $0x130968,%ebx
10a332: b9 03 00 00 00 mov $0x3,%ecx
10a337: 89 df mov %ebx,%edi
10a339: 8b 75 0c mov 0xc(%ebp),%esi
10a33c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10a33e: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10a341: ff 75 e4 pushl -0x1c(%ebp)
10a344: 9d popf
* 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;
10a345: 31 c0 xor %eax,%eax
}
10a347: 8d 65 f4 lea -0xc(%ebp),%esp
10a34a: 5b pop %ebx
10a34b: 5e pop %esi
10a34c: 5f pop %edi
10a34d: 5d pop %ebp
10a34e: c3 ret
0010a702 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
10a702: 55 push %ebp
10a703: 89 e5 mov %esp,%ebp
10a705: 57 push %edi
10a706: 56 push %esi
10a707: 53 push %ebx
10a708: 83 ec 2c sub $0x2c,%esp
10a70b: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
10a70e: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
10a712: 75 02 jne 10a716 <sigtimedwait+0x14>
10a714: eb 28 jmp 10a73e <sigtimedwait+0x3c>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
10a716: 85 db test %ebx,%ebx
10a718: 74 34 je 10a74e <sigtimedwait+0x4c>
if ( !_Timespec_Is_valid( timeout ) )
10a71a: 83 ec 0c sub $0xc,%esp
10a71d: 53 push %ebx
10a71e: e8 35 30 00 00 call 10d758 <_Timespec_Is_valid>
10a723: 83 c4 10 add $0x10,%esp
10a726: 84 c0 test %al,%al
10a728: 75 02 jne 10a72c <sigtimedwait+0x2a>
10a72a: eb 12 jmp 10a73e <sigtimedwait+0x3c>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
10a72c: 83 ec 0c sub $0xc,%esp
10a72f: 53 push %ebx
10a730: e8 47 30 00 00 call 10d77c <_Timespec_To_ticks>
10a735: 89 c1 mov %eax,%ecx
if ( !interval )
10a737: 83 c4 10 add $0x10,%esp
10a73a: 85 c0 test %eax,%eax
10a73c: 75 12 jne 10a750 <sigtimedwait+0x4e> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
10a73e: e8 1d 7a 00 00 call 112160 <__errno>
10a743: c7 00 16 00 00 00 movl $0x16,(%eax)
10a749: e9 29 01 00 00 jmp 10a877 <sigtimedwait+0x175>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
10a74e: 31 c9 xor %ecx,%ecx
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10a750: 8b 5d 0c mov 0xc(%ebp),%ebx
10a753: 85 db test %ebx,%ebx
10a755: 75 03 jne 10a75a <sigtimedwait+0x58>
10a757: 8d 5d dc lea -0x24(%ebp),%ebx
the_thread = _Thread_Executing;
10a75a: 8b 15 2c 09 13 00 mov 0x13092c,%edx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10a760: 8b b2 e8 00 00 00 mov 0xe8(%edx),%esi
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
10a766: 9c pushf
10a767: fa cli
10a768: 8f 45 d4 popl -0x2c(%ebp)
if ( *set & api->signals_pending ) {
10a76b: 8b 45 08 mov 0x8(%ebp),%eax
10a76e: 8b 38 mov (%eax),%edi
10a770: 8b 86 d4 00 00 00 mov 0xd4(%esi),%eax
10a776: 85 c7 test %eax,%edi
10a778: 74 2c je 10a7a6 <sigtimedwait+0xa4>
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
10a77a: e8 45 ff ff ff call 10a6c4 <_POSIX_signals_Get_lowest>
10a77f: 89 03 mov %eax,(%ebx)
_POSIX_signals_Clear_signals(
10a781: 83 ec 0c sub $0xc,%esp
10a784: 6a 00 push $0x0
10a786: 6a 00 push $0x0
10a788: 53 push %ebx
10a789: 50 push %eax
10a78a: 56 push %esi
10a78b: e8 f4 4e 00 00 call 10f684 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
10a790: ff 75 d4 pushl -0x2c(%ebp)
10a793: 9d popf
the_info->si_code = SI_USER;
10a794: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
the_info->si_value.sival_int = 0;
10a79b: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
return the_info->si_signo;
10a7a2: 8b 3b mov (%ebx),%edi
10a7a4: eb 33 jmp 10a7d9 <sigtimedwait+0xd7>
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
10a7a6: a1 5c 0b 13 00 mov 0x130b5c,%eax
10a7ab: 85 c7 test %eax,%edi
10a7ad: 74 32 je 10a7e1 <sigtimedwait+0xdf>
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
10a7af: e8 10 ff ff ff call 10a6c4 <_POSIX_signals_Get_lowest>
10a7b4: 89 c7 mov %eax,%edi
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
10a7b6: 83 ec 0c sub $0xc,%esp
10a7b9: 6a 00 push $0x0
10a7bb: 6a 01 push $0x1
10a7bd: 53 push %ebx
10a7be: 50 push %eax
10a7bf: 56 push %esi
10a7c0: e8 bf 4e 00 00 call 10f684 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
10a7c5: ff 75 d4 pushl -0x2c(%ebp)
10a7c8: 9d popf
the_info->si_signo = signo;
10a7c9: 89 3b mov %edi,(%ebx)
the_info->si_code = SI_USER;
10a7cb: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
the_info->si_value.sival_int = 0;
10a7d2: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
10a7d9: 83 c4 20 add $0x20,%esp
10a7dc: e9 99 00 00 00 jmp 10a87a <sigtimedwait+0x178>
return signo;
}
the_info->si_signo = -1;
10a7e1: c7 03 ff ff ff ff movl $0xffffffff,(%ebx)
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10a7e7: a1 24 04 13 00 mov 0x130424,%eax
10a7ec: 40 inc %eax
10a7ed: a3 24 04 13 00 mov %eax,0x130424
return _Thread_Dispatch_disable_level;
10a7f2: a1 24 04 13 00 mov 0x130424,%eax
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
10a7f7: c7 42 44 f4 0a 13 00 movl $0x130af4,0x44(%edx)
the_thread->Wait.return_code = EINTR;
10a7fe: c7 42 34 04 00 00 00 movl $0x4,0x34(%edx)
the_thread->Wait.option = *set;
10a805: 8b 7d 08 mov 0x8(%ebp),%edi
10a808: 8b 07 mov (%edi),%eax
10a80a: 89 42 30 mov %eax,0x30(%edx)
the_thread->Wait.return_argument = the_info;
10a80d: 89 5a 28 mov %ebx,0x28(%edx)
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;
10a810: c7 05 24 0b 13 00 01 movl $0x1,0x130b24
10a817: 00 00 00
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
10a81a: ff 75 d4 pushl -0x2c(%ebp)
10a81d: 9d popf
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
10a81e: 50 push %eax
10a81f: 68 90 d5 10 00 push $0x10d590
10a824: 51 push %ecx
10a825: 68 f4 0a 13 00 push $0x130af4
10a82a: e8 a9 2a 00 00 call 10d2d8 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10a82f: e8 44 26 00 00 call 10ce78 <_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 );
10a834: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10a83b: 6a 00 push $0x0
10a83d: 53 push %ebx
10a83e: ff 33 pushl (%ebx)
10a840: 56 push %esi
10a841: e8 3e 4e 00 00 call 10f684 <_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)
10a846: 83 c4 20 add $0x20,%esp
10a849: a1 2c 09 13 00 mov 0x13092c,%eax
10a84e: 83 78 34 04 cmpl $0x4,0x34(%eax)
10a852: 75 13 jne 10a867 <sigtimedwait+0x165>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
10a854: 8b 3b mov (%ebx),%edi
10a856: 8d 4f ff lea -0x1(%edi),%ecx
10a859: b8 01 00 00 00 mov $0x1,%eax
10a85e: d3 e0 shl %cl,%eax
10a860: 8b 55 08 mov 0x8(%ebp),%edx
10a863: 85 02 test %eax,(%edx)
10a865: 75 13 jne 10a87a <sigtimedwait+0x178>
errno = _Thread_Executing->Wait.return_code;
10a867: e8 f4 78 00 00 call 112160 <__errno>
10a86c: 8b 15 2c 09 13 00 mov 0x13092c,%edx
10a872: 8b 52 34 mov 0x34(%edx),%edx
10a875: 89 10 mov %edx,(%eax)
return -1;
10a877: 83 cf ff or $0xffffffff,%edi
}
return the_info->si_signo;
}
10a87a: 89 f8 mov %edi,%eax
10a87c: 8d 65 f4 lea -0xc(%ebp),%esp
10a87f: 5b pop %ebx
10a880: 5e pop %esi
10a881: 5f pop %edi
10a882: 5d pop %ebp
10a883: c3 ret
0010c244 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
10c244: 55 push %ebp
10c245: 89 e5 mov %esp,%ebp
10c247: 53 push %ebx
10c248: 83 ec 08 sub $0x8,%esp
10c24b: 8b 5d 0c mov 0xc(%ebp),%ebx
int status;
status = sigtimedwait( set, NULL, NULL );
10c24e: 6a 00 push $0x0
10c250: 6a 00 push $0x0
10c252: ff 75 08 pushl 0x8(%ebp)
10c255: e8 50 fe ff ff call 10c0aa <sigtimedwait>
if ( status != -1 ) {
10c25a: 83 c4 10 add $0x10,%esp
10c25d: 83 f8 ff cmp $0xffffffff,%eax
10c260: 74 08 je 10c26a <sigwait+0x26>
if ( sig )
10c262: 85 db test %ebx,%ebx
10c264: 74 0d je 10c273 <sigwait+0x2f> <== NEVER TAKEN
*sig = status;
10c266: 89 03 mov %eax,(%ebx)
10c268: eb 09 jmp 10c273 <sigwait+0x2f>
return 0;
}
return errno;
10c26a: e8 1d 76 00 00 call 11388c <__errno>
10c26f: 8b 00 mov (%eax),%eax
10c271: eb 02 jmp 10c275 <sigwait+0x31>
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
10c273: 31 c0 xor %eax,%eax
}
return errno;
}
10c275: 8b 5d fc mov -0x4(%ebp),%ebx
10c278: c9 leave
10c279: c3 ret
00109808 <sysconf>:
*/
long sysconf(
int name
)
{
109808: 55 push %ebp
109809: 89 e5 mov %esp,%ebp
10980b: 83 ec 08 sub $0x8,%esp
10980e: 8b 55 08 mov 0x8(%ebp),%edx
if ( name == _SC_CLK_TCK )
109811: 83 fa 02 cmp $0x2,%edx
109814: 75 0f jne 109825 <sysconf+0x1d>
return (TOD_MICROSECONDS_PER_SECOND /
109816: b8 40 42 0f 00 mov $0xf4240,%eax
10981b: 31 d2 xor %edx,%edx
10981d: f7 35 4c a1 12 00 divl 0x12a14c
109823: eb 34 jmp 109859 <sysconf+0x51>
rtems_configuration_get_microseconds_per_tick());
if ( name == _SC_OPEN_MAX )
return rtems_libio_number_iops;
109825: a1 94 a2 12 00 mov 0x12a294,%eax
{
if ( name == _SC_CLK_TCK )
return (TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick());
if ( name == _SC_OPEN_MAX )
10982a: 83 fa 04 cmp $0x4,%edx
10982d: 74 2a je 109859 <sysconf+0x51>
return rtems_libio_number_iops;
if ( name == _SC_GETPW_R_SIZE_MAX )
return 1024;
10982f: b8 00 04 00 00 mov $0x400,%eax
rtems_configuration_get_microseconds_per_tick());
if ( name == _SC_OPEN_MAX )
return rtems_libio_number_iops;
if ( name == _SC_GETPW_R_SIZE_MAX )
109834: 83 fa 33 cmp $0x33,%edx
109837: 74 20 je 109859 <sysconf+0x51>
return 1024;
if ( name == _SC_PAGESIZE )
return PAGE_SIZE;
109839: 66 b8 00 10 mov $0x1000,%ax
return rtems_libio_number_iops;
if ( name == _SC_GETPW_R_SIZE_MAX )
return 1024;
if ( name == _SC_PAGESIZE )
10983d: 83 fa 08 cmp $0x8,%edx
109840: 74 17 je 109859 <sysconf+0x51>
return PAGE_SIZE;
if ( name == _SC_SYMLOOP_MAX )
return RTEMS_FILESYSTEM_SYMLOOP_MAX;
109842: 66 b8 20 00 mov $0x20,%ax
return 1024;
if ( name == _SC_PAGESIZE )
return PAGE_SIZE;
if ( name == _SC_SYMLOOP_MAX )
109846: 83 fa 4f cmp $0x4f,%edx
109849: 74 0e je 109859 <sysconf+0x51> <== NEVER TAKEN
#if defined(__sparc__)
if ( name == 515 ) /* Solaris _SC_STACK_PROT */
return 0;
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
10984b: e8 5c 79 00 00 call 1111ac <__errno>
109850: c7 00 16 00 00 00 movl $0x16,(%eax)
109856: 83 c8 ff or $0xffffffff,%eax
}
109859: c9 leave
10985a: c3 ret
0010a9e8 <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
10a9e8: 55 push %ebp
10a9e9: 89 e5 mov %esp,%ebp
10a9eb: 56 push %esi
10a9ec: 53 push %ebx
10a9ed: 8b 5d 0c mov 0xc(%ebp),%ebx
10a9f0: 8b 75 10 mov 0x10(%ebp),%esi
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
10a9f3: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
10a9f7: 74 02 je 10a9fb <timer_create+0x13>
10a9f9: eb 23 jmp 10aa1e <timer_create+0x36>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
10a9fb: 85 f6 test %esi,%esi
10a9fd: 75 02 jne 10aa01 <timer_create+0x19>
10a9ff: eb 1d jmp 10aa1e <timer_create+0x36>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
10aa01: 85 db test %ebx,%ebx
10aa03: 74 26 je 10aa2b <timer_create+0x43>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
10aa05: 8b 03 mov (%ebx),%eax
10aa07: 48 dec %eax
10aa08: 83 f8 01 cmp $0x1,%eax
10aa0b: 76 02 jbe 10aa0f <timer_create+0x27> <== ALWAYS TAKEN
10aa0d: eb 0f jmp 10aa1e <timer_create+0x36> <== NOT EXECUTED
( 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 )
10aa0f: 8b 43 04 mov 0x4(%ebx),%eax
10aa12: 85 c0 test %eax,%eax
10aa14: 75 02 jne 10aa18 <timer_create+0x30> <== ALWAYS TAKEN
10aa16: eb 06 jmp 10aa1e <timer_create+0x36> <== NOT EXECUTED
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10aa18: 48 dec %eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
10aa19: 83 f8 1f cmp $0x1f,%eax
10aa1c: 76 0d jbe 10aa2b <timer_create+0x43> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
10aa1e: e8 75 7e 00 00 call 112898 <__errno>
10aa23: c7 00 16 00 00 00 movl $0x16,(%eax)
10aa29: eb 34 jmp 10aa5f <timer_create+0x77>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
_Thread_Dispatch_disable_level++;
10aa2b: a1 b4 31 13 00 mov 0x1331b4,%eax
10aa30: 40 inc %eax
10aa31: a3 b4 31 13 00 mov %eax,0x1331b4
return _Thread_Dispatch_disable_level;
10aa36: a1 b4 31 13 00 mov 0x1331b4,%eax
* 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 );
10aa3b: 83 ec 0c sub $0xc,%esp
10aa3e: 68 b8 34 13 00 push $0x1334b8
10aa43: e8 70 1c 00 00 call 10c6b8 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
10aa48: 83 c4 10 add $0x10,%esp
10aa4b: 85 c0 test %eax,%eax
10aa4d: 75 18 jne 10aa67 <timer_create+0x7f>
_Thread_Enable_dispatch();
10aa4f: e8 68 2c 00 00 call 10d6bc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
10aa54: e8 3f 7e 00 00 call 112898 <__errno>
10aa59: c7 00 0b 00 00 00 movl $0xb,(%eax)
10aa5f: 83 c8 ff or $0xffffffff,%eax
10aa62: e9 83 00 00 00 jmp 10aaea <timer_create+0x102>
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
10aa67: c6 40 3c 02 movb $0x2,0x3c(%eax)
ptimer->thread_id = _Thread_Executing->Object.id;
10aa6b: 8b 15 fc 36 13 00 mov 0x1336fc,%edx
10aa71: 8b 52 08 mov 0x8(%edx),%edx
10aa74: 89 50 38 mov %edx,0x38(%eax)
if ( evp != NULL ) {
10aa77: 85 db test %ebx,%ebx
10aa79: 74 11 je 10aa8c <timer_create+0xa4>
ptimer->inf.sigev_notify = evp->sigev_notify;
10aa7b: 8b 13 mov (%ebx),%edx
10aa7d: 89 50 40 mov %edx,0x40(%eax)
ptimer->inf.sigev_signo = evp->sigev_signo;
10aa80: 8b 53 04 mov 0x4(%ebx),%edx
10aa83: 89 50 44 mov %edx,0x44(%eax)
ptimer->inf.sigev_value = evp->sigev_value;
10aa86: 8b 53 08 mov 0x8(%ebx),%edx
10aa89: 89 50 48 mov %edx,0x48(%eax)
}
ptimer->overrun = 0;
10aa8c: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
ptimer->timer_data.it_value.tv_sec = 0;
10aa93: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
ptimer->timer_data.it_value.tv_nsec = 0;
10aa9a: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
ptimer->timer_data.it_interval.tv_sec = 0;
10aaa1: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
ptimer->timer_data.it_interval.tv_nsec = 0;
10aaa8: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10aaaf: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10aab6: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10aabd: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10aac4: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10aacb: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10aace: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10aad1: 8b 0d d4 34 13 00 mov 0x1334d4,%ecx
10aad7: 89 04 99 mov %eax,(%ecx,%ebx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10aada: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
10aae1: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10aae3: e8 d4 2b 00 00 call 10d6bc <_Thread_Enable_dispatch>
return 0;
10aae8: 31 c0 xor %eax,%eax
}
10aaea: 8d 65 f8 lea -0x8(%ebp),%esp
10aaed: 5b pop %ebx
10aaee: 5e pop %esi
10aaef: 5d pop %ebp
10aaf0: c3 ret
001099d0 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
1099d0: 55 push %ebp
1099d1: 89 e5 mov %esp,%ebp
1099d3: 57 push %edi
1099d4: 56 push %esi
1099d5: 53 push %ebx
1099d6: 83 ec 3c sub $0x3c,%esp
1099d9: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
1099dc: 83 7d 10 00 cmpl $0x0,0x10(%ebp)
1099e0: 75 05 jne 1099e7 <timer_settime+0x17> <== ALWAYS TAKEN
1099e2: e9 ba 01 00 00 jmp 109ba1 <timer_settime+0x1d1> <== NOT EXECUTED
/*
* 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) ) ) {
1099e7: 83 ec 0c sub $0xc,%esp
1099ea: 8b 45 10 mov 0x10(%ebp),%eax
1099ed: 83 c0 08 add $0x8,%eax
1099f0: 50 push %eax
1099f1: e8 06 32 00 00 call 10cbfc <_Timespec_Is_valid>
1099f6: 83 c4 10 add $0x10,%esp
1099f9: 84 c0 test %al,%al
1099fb: 75 05 jne 109a02 <timer_settime+0x32>
1099fd: e9 9f 01 00 00 jmp 109ba1 <timer_settime+0x1d1>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
109a02: 83 ec 0c sub $0xc,%esp
109a05: ff 75 10 pushl 0x10(%ebp)
109a08: e8 ef 31 00 00 call 10cbfc <_Timespec_Is_valid>
109a0d: 83 c4 10 add $0x10,%esp
109a10: 84 c0 test %al,%al
109a12: 75 05 jne 109a19 <timer_settime+0x49> <== ALWAYS TAKEN
109a14: e9 88 01 00 00 jmp 109ba1 <timer_settime+0x1d1> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
109a19: f7 c3 fb ff ff ff test $0xfffffffb,%ebx
109a1f: 74 05 je 109a26 <timer_settime+0x56>
109a21: e9 7b 01 00 00 jmp 109ba1 <timer_settime+0x1d1>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
109a26: 8d 7d d8 lea -0x28(%ebp),%edi
109a29: b9 04 00 00 00 mov $0x4,%ecx
109a2e: 8b 75 10 mov 0x10(%ebp),%esi
109a31: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
109a33: 83 fb 04 cmp $0x4,%ebx
109a36: 75 5f jne 109a97 <timer_settime+0xc7>
struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_TOD_Get_as_timestamp( &tod_as_timestamp );
109a38: 83 ec 0c sub $0xc,%esp
109a3b: 8d 45 c8 lea -0x38(%ebp),%eax
109a3e: 50 push %eax
109a3f: e8 18 15 00 00 call 10af5c <_TOD_Get_as_timestamp>
_Timestamp_To_timespec( &tod_as_timestamp, tod_as_timespec );
109a44: 8b 75 c8 mov -0x38(%ebp),%esi
109a47: 8b 7d cc mov -0x34(%ebp),%edi
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
109a4a: 6a 00 push $0x0
109a4c: 68 00 ca 9a 3b push $0x3b9aca00
109a51: 57 push %edi
109a52: 56 push %esi
109a53: e8 8c 41 01 00 call 11dbe4 <__divdi3>
109a58: 83 c4 10 add $0x10,%esp
109a5b: 89 45 d0 mov %eax,-0x30(%ebp)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
109a5e: 6a 00 push $0x0
109a60: 68 00 ca 9a 3b push $0x3b9aca00
109a65: 57 push %edi
109a66: 56 push %esi
109a67: e8 cc 42 01 00 call 11dd38 <__moddi3>
109a6c: 89 45 d4 mov %eax,-0x2c(%ebp)
struct timespec now;
_TOD_Get( &now );
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
109a6f: 83 c4 18 add $0x18,%esp
109a72: 8d 75 d0 lea -0x30(%ebp),%esi
109a75: 56 push %esi
109a76: 8d 5d e0 lea -0x20(%ebp),%ebx
109a79: 53 push %ebx
109a7a: e8 a1 31 00 00 call 10cc20 <_Timespec_Less_than>
109a7f: 83 c4 10 add $0x10,%esp
109a82: 84 c0 test %al,%al
109a84: 74 05 je 109a8b <timer_settime+0xbb>
109a86: e9 16 01 00 00 jmp 109ba1 <timer_settime+0x1d1>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
109a8b: 52 push %edx
109a8c: 53 push %ebx
109a8d: 53 push %ebx
109a8e: 56 push %esi
109a8f: e8 b0 31 00 00 call 10cc44 <_Timespec_Subtract>
109a94: 83 c4 10 add $0x10,%esp
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Get (
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
109a97: 50 push %eax
/* If the function reaches this point, then it will be necessary to do
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
109a98: 8d 45 c4 lea -0x3c(%ebp),%eax
109a9b: 50 push %eax
109a9c: ff 75 08 pushl 0x8(%ebp)
109a9f: 68 b8 e6 12 00 push $0x12e6b8
109aa4: e8 3f 1d 00 00 call 10b7e8 <_Objects_Get>
109aa9: 89 c3 mov %eax,%ebx
switch ( location ) {
109aab: 83 c4 10 add $0x10,%esp
109aae: 83 7d c4 00 cmpl $0x0,-0x3c(%ebp)
109ab2: 0f 85 e9 00 00 00 jne 109ba1 <timer_settime+0x1d1>
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 ) {
109ab8: 83 7d e0 00 cmpl $0x0,-0x20(%ebp)
109abc: 75 3c jne 109afa <timer_settime+0x12a>
109abe: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp)
109ac2: 75 36 jne 109afa <timer_settime+0x12a>
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
109ac4: 83 ec 0c sub $0xc,%esp
109ac7: 8d 40 10 lea 0x10(%eax),%eax
109aca: 50 push %eax
109acb: e8 10 35 00 00 call 10cfe0 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
109ad0: 83 c4 10 add $0x10,%esp
109ad3: 83 7d 14 00 cmpl $0x0,0x14(%ebp)
109ad7: 8d 43 54 lea 0x54(%ebx),%eax
109ada: 74 0c je 109ae8 <timer_settime+0x118>
*ovalue = ptimer->timer_data;
109adc: b9 04 00 00 00 mov $0x4,%ecx
109ae1: 8b 7d 14 mov 0x14(%ebp),%edi
109ae4: 89 c6 mov %eax,%esi
109ae6: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* The new data are set */
ptimer->timer_data = normalize;
109ae8: 8d 75 d8 lea -0x28(%ebp),%esi
109aeb: b9 04 00 00 00 mov $0x4,%ecx
109af0: 89 c7 mov %eax,%edi
109af2: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
109af4: c6 43 3c 04 movb $0x4,0x3c(%ebx)
109af8: eb 35 jmp 109b2f <timer_settime+0x15f>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
109afa: 83 ec 0c sub $0xc,%esp
109afd: ff 75 10 pushl 0x10(%ebp)
109b00: e8 77 31 00 00 call 10cc7c <_Timespec_To_ticks>
109b05: 89 43 64 mov %eax,0x64(%ebx)
initial_period = _Timespec_To_ticks( &normalize.it_value );
109b08: 8d 45 e0 lea -0x20(%ebp),%eax
109b0b: 89 04 24 mov %eax,(%esp)
109b0e: e8 69 31 00 00 call 10cc7c <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
109b13: 89 1c 24 mov %ebx,(%esp)
109b16: 68 b8 9b 10 00 push $0x109bb8
109b1b: ff 73 08 pushl 0x8(%ebx)
109b1e: 50 push %eax
109b1f: 8d 43 10 lea 0x10(%ebx),%eax
109b22: 50 push %eax
109b23: e8 28 52 00 00 call 10ed50 <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
109b28: 83 c4 20 add $0x20,%esp
109b2b: 84 c0 test %al,%al
109b2d: 75 07 jne 109b36 <timer_settime+0x166>
_Thread_Enable_dispatch();
109b2f: e8 e8 27 00 00 call 10c31c <_Thread_Enable_dispatch>
109b34: eb 67 jmp 109b9d <timer_settime+0x1cd>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
109b36: 83 7d 14 00 cmpl $0x0,0x14(%ebp)
109b3a: 8d 43 54 lea 0x54(%ebx),%eax
109b3d: 74 0c je 109b4b <timer_settime+0x17b>
*ovalue = ptimer->timer_data;
109b3f: b9 04 00 00 00 mov $0x4,%ecx
109b44: 8b 7d 14 mov 0x14(%ebp),%edi
109b47: 89 c6 mov %eax,%esi
109b49: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ptimer->timer_data = normalize;
109b4b: 8d 75 d8 lea -0x28(%ebp),%esi
109b4e: b9 04 00 00 00 mov $0x4,%ecx
109b53: 89 c7 mov %eax,%edi
109b55: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
109b57: c6 43 3c 03 movb $0x3,0x3c(%ebx)
struct timespec *tod_as_timespec
)
{
Timestamp_Control tod_as_timestamp;
_TOD_Get_as_timestamp( &tod_as_timestamp );
109b5b: 83 ec 0c sub $0xc,%esp
109b5e: 8d 45 c8 lea -0x38(%ebp),%eax
109b61: 50 push %eax
109b62: e8 f5 13 00 00 call 10af5c <_TOD_Get_as_timestamp>
_Timestamp_To_timespec( &tod_as_timestamp, tod_as_timespec );
109b67: 8b 75 c8 mov -0x38(%ebp),%esi
109b6a: 8b 7d cc mov -0x34(%ebp),%edi
static inline void _Timestamp64_implementation_To_timespec(
const Timestamp64_Control *_timestamp,
struct timespec *_timespec
)
{
_timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
109b6d: 6a 00 push $0x0
109b6f: 68 00 ca 9a 3b push $0x3b9aca00
109b74: 57 push %edi
109b75: 56 push %esi
109b76: e8 69 40 01 00 call 11dbe4 <__divdi3>
109b7b: 83 c4 10 add $0x10,%esp
109b7e: 89 43 6c mov %eax,0x6c(%ebx)
_timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
109b81: 6a 00 push $0x0
109b83: 68 00 ca 9a 3b push $0x3b9aca00
109b88: 57 push %edi
109b89: 56 push %esi
109b8a: e8 a9 41 01 00 call 11dd38 <__moddi3>
109b8f: 83 c4 10 add $0x10,%esp
109b92: 89 43 70 mov %eax,0x70(%ebx)
_TOD_Get( &ptimer->time );
_Thread_Enable_dispatch();
109b95: e8 82 27 00 00 call 10c31c <_Thread_Enable_dispatch>
109b9a: 83 c4 10 add $0x10,%esp
return 0;
109b9d: 31 c0 xor %eax,%eax
109b9f: eb 0e jmp 109baf <timer_settime+0x1df>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
109ba1: e8 c6 7a 00 00 call 11166c <__errno>
109ba6: c7 00 16 00 00 00 movl $0x16,(%eax)
109bac: 83 c8 ff or $0xffffffff,%eax
}
109baf: 8d 65 f4 lea -0xc(%ebp),%esp
109bb2: 5b pop %ebx
109bb3: 5e pop %esi
109bb4: 5f pop %edi
109bb5: 5d pop %ebp
109bb6: c3 ret
00109aa8 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
109aa8: 55 push %ebp
109aa9: 89 e5 mov %esp,%ebp
109aab: 56 push %esi
109aac: 53 push %ebx
109aad: 83 ec 10 sub $0x10,%esp
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
109ab0: 83 3d 0c fd 12 00 00 cmpl $0x0,0x12fd0c
109ab7: 75 2c jne 109ae5 <ualarm+0x3d>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
109ab9: c7 05 f8 fc 12 00 00 movl $0x0,0x12fcf8
109ac0: 00 00 00
the_watchdog->routine = routine;
109ac3: c7 05 0c fd 12 00 70 movl $0x109a70,0x12fd0c
109aca: 9a 10 00
the_watchdog->id = id;
109acd: c7 05 10 fd 12 00 00 movl $0x0,0x12fd10
109ad4: 00 00 00
the_watchdog->user_data = user_data;
109ad7: c7 05 14 fd 12 00 00 movl $0x0,0x12fd14
109ade: 00 00 00
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
109ae1: 31 db xor %ebx,%ebx
109ae3: eb 4f jmp 109b34 <ualarm+0x8c>
if ( !the_timer->routine ) {
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
109ae5: 83 ec 0c sub $0xc,%esp
109ae8: 68 f0 fc 12 00 push $0x12fcf0
109aed: e8 12 33 00 00 call 10ce04 <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
109af2: 83 e8 02 sub $0x2,%eax
109af5: 83 c4 10 add $0x10,%esp
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
109af8: 31 db xor %ebx,%ebx
_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) ) {
109afa: 83 f8 01 cmp $0x1,%eax
109afd: 77 35 ja 109b34 <ualarm+0x8c> <== NEVER TAKEN
* boot. Since alarm() is dealing in seconds, we must account for
* this.
*/
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
109aff: 8b 0d 04 fd 12 00 mov 0x12fd04,%ecx
109b05: 03 0d fc fc 12 00 add 0x12fcfc,%ecx
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
109b0b: 50 push %eax
109b0c: 50 push %eax
109b0d: 8d 45 f0 lea -0x10(%ebp),%eax
109b10: 50 push %eax
* 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);
109b11: 2b 0d 08 fd 12 00 sub 0x12fd08,%ecx
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
109b17: 51 push %ecx
109b18: e8 f3 2e 00 00 call 10ca10 <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
109b1d: 69 5d f0 40 42 0f 00 imul $0xf4240,-0x10(%ebp),%ebx
remaining += tp.tv_nsec / 1000;
109b24: 8b 45 f4 mov -0xc(%ebp),%eax
109b27: b9 e8 03 00 00 mov $0x3e8,%ecx
109b2c: 99 cltd
109b2d: f7 f9 idiv %ecx
109b2f: 01 c3 add %eax,%ebx
109b31: 83 c4 10 add $0x10,%esp
/*
* 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 ) {
109b34: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
109b38: 74 45 je 109b7f <ualarm+0xd7>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
109b3a: b9 40 42 0f 00 mov $0xf4240,%ecx
109b3f: 8b 45 08 mov 0x8(%ebp),%eax
109b42: 31 d2 xor %edx,%edx
109b44: f7 f1 div %ecx
109b46: 89 45 f0 mov %eax,-0x10(%ebp)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
109b49: 69 d2 e8 03 00 00 imul $0x3e8,%edx,%edx
109b4f: 89 55 f4 mov %edx,-0xc(%ebp)
ticks = _Timespec_To_ticks( &tp );
109b52: 83 ec 0c sub $0xc,%esp
109b55: 8d 75 f0 lea -0x10(%ebp),%esi
109b58: 56 push %esi
109b59: e8 da 2e 00 00 call 10ca38 <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
109b5e: 89 34 24 mov %esi,(%esp)
109b61: e8 d2 2e 00 00 call 10ca38 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
109b66: a3 fc fc 12 00 mov %eax,0x12fcfc
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
109b6b: 59 pop %ecx
109b6c: 5e pop %esi
109b6d: 68 f0 fc 12 00 push $0x12fcf0
109b72: 68 d8 f4 12 00 push $0x12f4d8
109b77: e8 74 31 00 00 call 10ccf0 <_Watchdog_Insert>
109b7c: 83 c4 10 add $0x10,%esp
}
return remaining;
}
109b7f: 89 d8 mov %ebx,%eax
109b81: 8d 65 f8 lea -0x8(%ebp),%esp
109b84: 5b pop %ebx
109b85: 5e pop %esi
109b86: 5d pop %ebp
109b87: c3 ret