RTEMS 4.11Annotated Report
Sat Nov 27 20:30:19 2010
0010bea8 <_API_extensions_Run_postdriver>:
*
* _API_extensions_Run_postdriver
*/
void _API_extensions_Run_postdriver( void )
{
10bea8: 55 push %ebp
10bea9: 89 e5 mov %esp,%ebp
10beab: 53 push %ebx
10beac: 83 ec 04 sub $0x4,%esp
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10beaf: 8b 1d b8 77 12 00 mov 0x1277b8,%ebx
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10beb5: 81 fb bc 77 12 00 cmp $0x1277bc,%ebx
10bebb: 74 10 je 10becd <_API_extensions_Run_postdriver+0x25><== NEVER TAKEN
10bebd: 8d 76 00 lea 0x0(%esi),%esi
* Currently all APIs configure this hook so it is always non-NULL.
*/
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
10bec0: ff 53 08 call *0x8(%ebx)
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
10bec3: 8b 1b mov (%ebx),%ebx
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10bec5: 81 fb bc 77 12 00 cmp $0x1277bc,%ebx
10becb: 75 f3 jne 10bec0 <_API_extensions_Run_postdriver+0x18>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
10becd: 58 pop %eax
10bece: 5b pop %ebx
10becf: c9 leave
10bed0: c3 ret
0010bed4 <_API_extensions_Run_postswitch>:
*
* _API_extensions_Run_postswitch
*/
void _API_extensions_Run_postswitch( void )
{
10bed4: 55 push %ebp
10bed5: 89 e5 mov %esp,%ebp
10bed7: 53 push %ebx
10bed8: 83 ec 04 sub $0x4,%esp
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10bedb: 8b 1d b8 77 12 00 mov 0x1277b8,%ebx
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10bee1: 81 fb bc 77 12 00 cmp $0x1277bc,%ebx
10bee7: 74 1c je 10bf05 <_API_extensions_Run_postswitch+0x31><== NEVER TAKEN
10bee9: 8d 76 00 lea 0x0(%esi),%esi
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
10beec: 83 ec 0c sub $0xc,%esp
10beef: ff 35 38 7b 12 00 pushl 0x127b38
10bef5: ff 53 0c call *0xc(%ebx)
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
10bef8: 8b 1b mov (%ebx),%ebx
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10befa: 83 c4 10 add $0x10,%esp
10befd: 81 fb bc 77 12 00 cmp $0x1277bc,%ebx
10bf03: 75 e7 jne 10beec <_API_extensions_Run_postswitch+0x18>
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10bf05: 8b 5d fc mov -0x4(%ebp),%ebx
10bf08: c9 leave
10bf09: c3 ret
0010e3d4 <_CORE_RWLock_Obtain_for_reading>:
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
10e3d4: 55 push %ebp
10e3d5: 89 e5 mov %esp,%ebp
10e3d7: 57 push %edi
10e3d8: 56 push %esi
10e3d9: 53 push %ebx
10e3da: 83 ec 1c sub $0x1c,%esp
10e3dd: 8b 5d 08 mov 0x8(%ebp),%ebx
10e3e0: 8b 7d 0c mov 0xc(%ebp),%edi
10e3e3: 8b 4d 14 mov 0x14(%ebp),%ecx
10e3e6: 8a 55 10 mov 0x10(%ebp),%dl
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e3e9: 8b 35 b8 b4 12 00 mov 0x12b4b8,%esi
* If unlocked, then OK to read.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
10e3ef: 9c pushf
10e3f0: fa cli
10e3f1: 8f 45 e4 popl -0x1c(%ebp)
switch ( the_rwlock->current_state ) {
10e3f4: 8b 43 44 mov 0x44(%ebx),%eax
10e3f7: 85 c0 test %eax,%eax
10e3f9: 75 1d jne 10e418 <_CORE_RWLock_Obtain_for_reading+0x44>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10e3fb: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
the_rwlock->number_of_readers += 1;
10e402: ff 43 48 incl 0x48(%ebx)
_ISR_Enable( level );
10e405: ff 75 e4 pushl -0x1c(%ebp)
10e408: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e409: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e410: 8d 65 f4 lea -0xc(%ebp),%esp
10e413: 5b pop %ebx
10e414: 5e pop %esi
10e415: 5f pop %edi
10e416: c9 leave
10e417: c3 ret
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
switch ( the_rwlock->current_state ) {
10e418: 48 dec %eax
10e419: 74 51 je 10e46c <_CORE_RWLock_Obtain_for_reading+0x98>
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
10e41b: 84 d2 test %dl,%dl
10e41d: 75 15 jne 10e434 <_CORE_RWLock_Obtain_for_reading+0x60>
_ISR_Enable( level );
10e41f: ff 75 e4 pushl -0x1c(%ebp)
10e422: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e423: c7 46 34 02 00 00 00 movl $0x2,0x34(%esi)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e42a: 8d 65 f4 lea -0xc(%ebp),%esp
10e42d: 5b pop %ebx
10e42e: 5e pop %esi
10e42f: 5f pop %edi
10e430: c9 leave
10e431: c3 ret
10e432: 66 90 xchg %ax,%ax
10e434: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
/*
* We need to wait to enter this critical section
*/
_Thread_queue_Enter_critical_section( &the_rwlock->Wait_queue );
executing->Wait.queue = &the_rwlock->Wait_queue;
10e43b: 89 5e 44 mov %ebx,0x44(%esi)
executing->Wait.id = id;
10e43e: 89 7e 20 mov %edi,0x20(%esi)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
10e441: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e448: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
_ISR_Enable( level );
10e44f: ff 75 e4 pushl -0x1c(%ebp)
10e452: 9d popf
_Thread_queue_Enqueue_with_handler(
10e453: c7 45 10 d8 e5 10 00 movl $0x10e5d8,0x10(%ebp)
10e45a: 89 4d 0c mov %ecx,0xc(%ebp)
10e45d: 89 5d 08 mov %ebx,0x8(%ebp)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e460: 8d 65 f4 lea -0xc(%ebp),%esp
10e463: 5b pop %ebx
10e464: 5e pop %esi
10e465: 5f pop %edi
10e466: c9 leave
executing->Wait.id = id;
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
_ISR_Enable( level );
_Thread_queue_Enqueue_with_handler(
10e467: e9 9c 1b 00 00 jmp 110008 <_Thread_queue_Enqueue_with_handler>
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
return;
case CORE_RWLOCK_LOCKED_FOR_READING: {
Thread_Control *waiter;
waiter = _Thread_queue_First( &the_rwlock->Wait_queue );
10e46c: 83 ec 0c sub $0xc,%esp
10e46f: 53 push %ebx
10e470: 88 55 e0 mov %dl,-0x20(%ebp)
10e473: 89 4d dc mov %ecx,-0x24(%ebp)
10e476: e8 b5 1e 00 00 call 110330 <_Thread_queue_First>
if ( !waiter ) {
10e47b: 83 c4 10 add $0x10,%esp
10e47e: 85 c0 test %eax,%eax
10e480: 8a 55 e0 mov -0x20(%ebp),%dl
10e483: 8b 4d dc mov -0x24(%ebp),%ecx
10e486: 75 93 jne 10e41b <_CORE_RWLock_Obtain_for_reading+0x47>
the_rwlock->number_of_readers += 1;
10e488: ff 43 48 incl 0x48(%ebx)
_ISR_Enable( level );
10e48b: ff 75 e4 pushl -0x1c(%ebp)
10e48e: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e48f: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
return;
10e496: e9 75 ff ff ff jmp 10e410 <_CORE_RWLock_Obtain_for_reading+0x3c>
0010e49c <_CORE_RWLock_Obtain_for_writing>:
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
10e49c: 55 push %ebp
10e49d: 89 e5 mov %esp,%ebp
10e49f: 57 push %edi
10e4a0: 56 push %esi
10e4a1: 53 push %ebx
10e4a2: 83 ec 0c sub $0xc,%esp
10e4a5: 8b 45 08 mov 0x8(%ebp),%eax
10e4a8: 8b 7d 0c mov 0xc(%ebp),%edi
10e4ab: 8b 75 14 mov 0x14(%ebp),%esi
10e4ae: 8a 5d 10 mov 0x10(%ebp),%bl
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e4b1: 8b 15 b8 b4 12 00 mov 0x12b4b8,%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 );
10e4b7: 9c pushf
10e4b8: fa cli
10e4b9: 59 pop %ecx
switch ( the_rwlock->current_state ) {
10e4ba: 83 78 44 00 cmpl $0x0,0x44(%eax)
10e4be: 75 18 jne 10e4d8 <_CORE_RWLock_Obtain_for_writing+0x3c>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10e4c0: c7 40 44 02 00 00 00 movl $0x2,0x44(%eax)
_ISR_Enable( level );
10e4c7: 51 push %ecx
10e4c8: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e4c9: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e4d0: 83 c4 0c add $0xc,%esp
10e4d3: 5b pop %ebx
10e4d4: 5e pop %esi
10e4d5: 5f pop %edi
10e4d6: c9 leave
10e4d7: c3 ret
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
10e4d8: 84 db test %bl,%bl
10e4da: 75 14 jne 10e4f0 <_CORE_RWLock_Obtain_for_writing+0x54>
_ISR_Enable( level );
10e4dc: 51 push %ecx
10e4dd: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e4de: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e4e5: 83 c4 0c add $0xc,%esp
10e4e8: 5b pop %ebx
10e4e9: 5e pop %esi
10e4ea: 5f pop %edi
10e4eb: c9 leave
10e4ec: c3 ret
10e4ed: 8d 76 00 lea 0x0(%esi),%esi
10e4f0: c7 40 30 01 00 00 00 movl $0x1,0x30(%eax)
/*
* We need to wait to enter this critical section
*/
_Thread_queue_Enter_critical_section( &the_rwlock->Wait_queue );
executing->Wait.queue = &the_rwlock->Wait_queue;
10e4f7: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
10e4fa: 89 7a 20 mov %edi,0x20(%edx)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_WRITE;
10e4fd: c7 42 30 01 00 00 00 movl $0x1,0x30(%edx)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e504: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_ISR_Enable( level );
10e50b: 51 push %ecx
10e50c: 9d popf
_Thread_queue_Enqueue_with_handler(
10e50d: c7 45 10 d8 e5 10 00 movl $0x10e5d8,0x10(%ebp)
10e514: 89 75 0c mov %esi,0xc(%ebp)
10e517: 89 45 08 mov %eax,0x8(%ebp)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e51a: 83 c4 0c add $0xc,%esp
10e51d: 5b pop %ebx
10e51e: 5e pop %esi
10e51f: 5f pop %edi
10e520: c9 leave
executing->Wait.id = id;
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_WRITE;
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
_ISR_Enable( level );
_Thread_queue_Enqueue_with_handler(
10e521: e9 e2 1a 00 00 jmp 110008 <_Thread_queue_Enqueue_with_handler>
0010e528 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
10e528: 55 push %ebp
10e529: 89 e5 mov %esp,%ebp
10e52b: 53 push %ebx
10e52c: 83 ec 04 sub $0x4,%esp
10e52f: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e532: 8b 0d b8 b4 12 00 mov 0x12b4b8,%ecx
* 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 );
10e538: 9c pushf
10e539: fa cli
10e53a: 5a pop %edx
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
10e53b: 8b 43 44 mov 0x44(%ebx),%eax
10e53e: 85 c0 test %eax,%eax
10e540: 74 7a je 10e5bc <_CORE_RWLock_Release+0x94>
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
10e542: 48 dec %eax
10e543: 74 63 je 10e5a8 <_CORE_RWLock_Release+0x80>
return CORE_RWLOCK_SUCCESSFUL;
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e545: c7 41 34 00 00 00 00 movl $0x0,0x34(%ecx)
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
10e54c: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
_ISR_Enable( level );
10e553: 52 push %edx
10e554: 9d popf
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
10e555: 83 ec 0c sub $0xc,%esp
10e558: 53 push %ebx
10e559: e8 82 19 00 00 call 10fee0 <_Thread_queue_Dequeue>
if ( next ) {
10e55e: 83 c4 10 add $0x10,%esp
10e561: 85 c0 test %eax,%eax
10e563: 74 39 je 10e59e <_CORE_RWLock_Release+0x76>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
10e565: 83 78 30 01 cmpl $0x1,0x30(%eax)
10e569: 74 61 je 10e5cc <_CORE_RWLock_Release+0xa4>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
10e56b: ff 43 48 incl 0x48(%ebx)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10e56e: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
10e575: eb 17 jmp 10e58e <_CORE_RWLock_Release+0x66>
10e577: 90 nop
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
10e578: 83 78 30 01 cmpl $0x1,0x30(%eax)
10e57c: 74 20 je 10e59e <_CORE_RWLock_Release+0x76><== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
10e57e: ff 43 48 incl 0x48(%ebx)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
10e581: 83 ec 08 sub $0x8,%esp
10e584: 50 push %eax
10e585: 53 push %ebx
10e586: e8 8d 1c 00 00 call 110218 <_Thread_queue_Extract>
}
10e58b: 83 c4 10 add $0x10,%esp
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
10e58e: 83 ec 0c sub $0xc,%esp
10e591: 53 push %ebx
10e592: e8 99 1d 00 00 call 110330 <_Thread_queue_First>
if ( !next ||
10e597: 83 c4 10 add $0x10,%esp
10e59a: 85 c0 test %eax,%eax
10e59c: 75 da jne 10e578 <_CORE_RWLock_Release+0x50>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e59e: 31 c0 xor %eax,%eax
10e5a0: 8b 5d fc mov -0x4(%ebp),%ebx
10e5a3: c9 leave
10e5a4: c3 ret
10e5a5: 8d 76 00 lea 0x0(%esi),%esi
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
the_rwlock->number_of_readers -= 1;
10e5a8: 8b 43 48 mov 0x48(%ebx),%eax
10e5ab: 48 dec %eax
10e5ac: 89 43 48 mov %eax,0x48(%ebx)
if ( the_rwlock->number_of_readers != 0 ) {
10e5af: 85 c0 test %eax,%eax
10e5b1: 74 92 je 10e545 <_CORE_RWLock_Release+0x1d>
/* must be unlocked again */
_ISR_Enable( level );
10e5b3: 52 push %edx
10e5b4: 9d popf
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5b5: 31 c0 xor %eax,%eax
10e5b7: 8b 5d fc mov -0x4(%ebp),%ebx
10e5ba: c9 leave
10e5bb: c3 ret
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
10e5bc: 52 push %edx
10e5bd: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e5be: c7 41 34 02 00 00 00 movl $0x2,0x34(%ecx)
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5c5: 31 c0 xor %eax,%eax
10e5c7: 8b 5d fc mov -0x4(%ebp),%ebx
10e5ca: c9 leave
10e5cb: c3 ret
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
if ( next ) {
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10e5cc: c7 43 44 02 00 00 00 movl $0x2,0x44(%ebx)
return CORE_RWLOCK_SUCCESSFUL;
10e5d3: eb c9 jmp 10e59e <_CORE_RWLock_Release+0x76>
0010e5d8 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
10e5d8: 55 push %ebp
10e5d9: 89 e5 mov %esp,%ebp
10e5db: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10e5de: 8d 45 f4 lea -0xc(%ebp),%eax
10e5e1: 50 push %eax
10e5e2: ff 75 08 pushl 0x8(%ebp)
10e5e5: e8 66 15 00 00 call 10fb50 <_Thread_Get>
switch ( location ) {
10e5ea: 83 c4 10 add $0x10,%esp
10e5ed: 8b 55 f4 mov -0xc(%ebp),%edx
10e5f0: 85 d2 test %edx,%edx
10e5f2: 75 17 jne 10e60b <_CORE_RWLock_Timeout+0x33><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10e5f4: 83 ec 0c sub $0xc,%esp
10e5f7: 50 push %eax
10e5f8: e8 13 1e 00 00 call 110410 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10e5fd: a1 d0 ae 12 00 mov 0x12aed0,%eax
10e602: 48 dec %eax
10e603: a3 d0 ae 12 00 mov %eax,0x12aed0
10e608: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10e60b: c9 leave
10e60c: c3 ret
001198cc <_CORE_message_queue_Broadcast>:
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
1198cc: 55 push %ebp
1198cd: 89 e5 mov %esp,%ebp
1198cf: 57 push %edi
1198d0: 56 push %esi
1198d1: 53 push %ebx
1198d2: 83 ec 1c sub $0x1c,%esp
1198d5: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
1198d8: 8b 45 10 mov 0x10(%ebp),%eax
1198db: 39 43 4c cmp %eax,0x4c(%ebx)
1198de: 72 60 jb 119940 <_CORE_message_queue_Broadcast+0x74><== NEVER TAKEN
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
1198e0: 8b 43 48 mov 0x48(%ebx),%eax
1198e3: 85 c0 test %eax,%eax
1198e5: 75 45 jne 11992c <_CORE_message_queue_Broadcast+0x60>
1198e7: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
1198ee: eb 18 jmp 119908 <_CORE_message_queue_Broadcast+0x3c>
*/
number_broadcasted = 0;
while ((the_thread =
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
1198f0: ff 45 e4 incl -0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
1198f3: 8b 42 2c mov 0x2c(%edx),%eax
1198f6: 89 c7 mov %eax,%edi
1198f8: 8b 75 0c mov 0xc(%ebp),%esi
1198fb: 8b 4d 10 mov 0x10(%ebp),%ecx
1198fe: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
119900: 8b 42 28 mov 0x28(%edx),%eax
119903: 8b 55 10 mov 0x10(%ebp),%edx
119906: 89 10 mov %edx,(%eax)
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
119908: 83 ec 0c sub $0xc,%esp
11990b: 53 push %ebx
11990c: e8 1f 28 00 00 call 11c130 <_Thread_queue_Dequeue>
119911: 89 c2 mov %eax,%edx
119913: 83 c4 10 add $0x10,%esp
119916: 85 c0 test %eax,%eax
119918: 75 d6 jne 1198f0 <_CORE_message_queue_Broadcast+0x24>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
11991a: 8b 55 e4 mov -0x1c(%ebp),%edx
11991d: 8b 45 1c mov 0x1c(%ebp),%eax
119920: 89 10 mov %edx,(%eax)
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
119922: 31 c0 xor %eax,%eax
}
119924: 8d 65 f4 lea -0xc(%ebp),%esp
119927: 5b pop %ebx
119928: 5e pop %esi
119929: 5f pop %edi
11992a: c9 leave
11992b: c3 ret
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
*count = 0;
11992c: 8b 55 1c mov 0x1c(%ebp),%edx
11992f: c7 02 00 00 00 00 movl $0x0,(%edx)
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
119935: 31 c0 xor %eax,%eax
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
119937: 8d 65 f4 lea -0xc(%ebp),%esp
11993a: 5b pop %ebx
11993b: 5e pop %esi
11993c: 5f pop %edi
11993d: c9 leave
11993e: c3 ret
11993f: 90 nop
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
119940: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
119945: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
119948: 5b pop %ebx <== NOT EXECUTED
119949: 5e pop %esi <== NOT EXECUTED
11994a: 5f pop %edi <== NOT EXECUTED
11994b: c9 leave <== NOT EXECUTED
11994c: c3 ret <== NOT EXECUTED
00114a0c <_CORE_message_queue_Initialize>:
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
114a0c: 55 push %ebp
114a0d: 89 e5 mov %esp,%ebp
114a0f: 57 push %edi
114a10: 56 push %esi
114a11: 53 push %ebx
114a12: 83 ec 0c sub $0xc,%esp
114a15: 8b 5d 08 mov 0x8(%ebp),%ebx
114a18: 8b 75 10 mov 0x10(%ebp),%esi
114a1b: 8b 45 14 mov 0x14(%ebp),%eax
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
114a1e: 89 73 44 mov %esi,0x44(%ebx)
the_message_queue->number_of_pending_messages = 0;
114a21: c7 43 48 00 00 00 00 movl $0x0,0x48(%ebx)
the_message_queue->maximum_message_size = maximum_message_size;
114a28: 89 43 4c mov %eax,0x4c(%ebx)
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Notify_Handler the_handler,
void *the_argument
)
{
the_message_queue->notify_handler = the_handler;
114a2b: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
the_message_queue->notify_argument = the_argument;
114a32: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
114a39: a8 03 test $0x3,%al
114a3b: 74 17 je 114a54 <_CORE_message_queue_Initialize+0x48>
allocated_message_size += sizeof(uint32_t);
114a3d: 8d 50 04 lea 0x4(%eax),%edx
allocated_message_size &= ~(sizeof(uint32_t) - 1);
114a40: 83 e2 fc and $0xfffffffc,%edx
}
if (allocated_message_size < maximum_message_size)
114a43: 39 d0 cmp %edx,%eax
114a45: 76 0f jbe 114a56 <_CORE_message_queue_Initialize+0x4a><== ALWAYS TAKEN
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
return false;
114a47: 31 c0 xor %eax,%eax
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
114a49: 8d 65 f4 lea -0xc(%ebp),%esp
114a4c: 5b pop %ebx
114a4d: 5e pop %esi
114a4e: 5f pop %edi
114a4f: c9 leave
114a50: c3 ret
114a51: 8d 76 00 lea 0x0(%esi),%esi
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
114a54: 89 c2 mov %eax,%edx
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
114a56: 8d 7a 14 lea 0x14(%edx),%edi
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
114a59: 89 f8 mov %edi,%eax
114a5b: 0f af c6 imul %esi,%eax
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
114a5e: 39 d0 cmp %edx,%eax
114a60: 72 e5 jb 114a47 <_CORE_message_queue_Initialize+0x3b><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
114a62: 83 ec 0c sub $0xc,%esp
114a65: 50 push %eax
114a66: e8 21 2b 00 00 call 11758c <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
114a6b: 89 43 5c mov %eax,0x5c(%ebx)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
114a6e: 83 c4 10 add $0x10,%esp
114a71: 85 c0 test %eax,%eax
114a73: 74 d2 je 114a47 <_CORE_message_queue_Initialize+0x3b>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
114a75: 57 push %edi
114a76: 56 push %esi
114a77: 50 push %eax
114a78: 8d 43 68 lea 0x68(%ebx),%eax
114a7b: 50 push %eax
114a7c: e8 17 52 00 00 call 119c98 <_Chain_Initialize>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
114a81: 8d 43 54 lea 0x54(%ebx),%eax
114a84: 89 43 50 mov %eax,0x50(%ebx)
head->next = tail;
head->previous = NULL;
114a87: c7 43 54 00 00 00 00 movl $0x0,0x54(%ebx)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
114a8e: 8d 43 50 lea 0x50(%ebx),%eax
114a91: 89 43 58 mov %eax,0x58(%ebx)
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
114a94: 6a 06 push $0x6
114a96: 68 80 00 00 00 push $0x80
114a9b: 8b 45 0c mov 0xc(%ebp),%eax
114a9e: 83 38 01 cmpl $0x1,(%eax)
114aa1: 0f 94 c0 sete %al
114aa4: 0f b6 c0 movzbl %al,%eax
114aa7: 50 push %eax
114aa8: 53 push %ebx
114aa9: e8 be 21 00 00 call 116c6c <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
114aae: 83 c4 20 add $0x20,%esp
114ab1: b0 01 mov $0x1,%al
}
114ab3: 8d 65 f4 lea -0xc(%ebp),%esp
114ab6: 5b pop %ebx
114ab7: 5e pop %esi
114ab8: 5f pop %edi
114ab9: c9 leave
114aba: c3 ret
001110b0 <_CORE_message_queue_Insert_message>:
void _CORE_message_queue_Insert_message(
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message,
CORE_message_queue_Submit_types submit_type
)
{
1110b0: 55 push %ebp
1110b1: 89 e5 mov %esp,%ebp
1110b3: 56 push %esi
1110b4: 53 push %ebx
1110b5: 83 ec 10 sub $0x10,%esp
1110b8: 8b 45 08 mov 0x8(%ebp),%eax
1110bb: 8b 55 0c mov 0xc(%ebp),%edx
1110be: 8b 4d 10 mov 0x10(%ebp),%ecx
1110c1: 89 4a 08 mov %ecx,0x8(%edx)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
else
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
#else
if ( submit_type == CORE_MESSAGE_QUEUE_SEND_REQUEST ) {
1110c4: 81 f9 ff ff ff 7f cmp $0x7fffffff,%ecx
1110ca: 74 70 je 11113c <_CORE_message_queue_Insert_message+0x8c>
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
1110cc: 81 f9 00 00 00 80 cmp $0x80000000,%ecx
1110d2: 0f 84 88 00 00 00 je 111160 <_CORE_message_queue_Insert_message+0xb0>
* the message is actually in the queue at this point.
*/
if ( notify && the_message_queue->notify_handler )
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
#endif
}
1110d8: 8b 58 50 mov 0x50(%eax),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
1110db: 8d 70 54 lea 0x54(%eax),%esi
int the_priority;
the_priority = _CORE_message_queue_Get_message_priority(the_message);
the_header = &the_message_queue->Pending_messages;
the_node = _Chain_First( the_header );
while ( !_Chain_Is_tail( the_header, the_node ) ) {
1110de: 39 de cmp %ebx,%esi
1110e0: 74 05 je 1110e7 <_CORE_message_queue_Insert_message+0x37>
this_message = (CORE_message_queue_Buffer_control *) the_node;
this_priority = _CORE_message_queue_Get_message_priority(this_message);
if ( this_priority <= the_priority ) {
1110e2: 3b 4b 08 cmp 0x8(%ebx),%ecx
1110e5: 7d 45 jge 11112c <_CORE_message_queue_Insert_message+0x7c>
the_node = the_node->next;
continue;
}
break;
}
_ISR_Disable( level );
1110e7: 9c pushf
1110e8: fa cli
1110e9: 5e pop %esi
SET_NOTIFY();
1110ea: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
1110ed: 85 c9 test %ecx,%ecx
1110ef: 0f 94 45 f7 sete -0x9(%ebp)
}
break;
}
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
1110f3: 41 inc %ecx
1110f4: 89 48 48 mov %ecx,0x48(%eax)
_Chain_Insert_unprotected( the_node->previous, &the_message->Node );
1110f7: 8b 4b 04 mov 0x4(%ebx),%ecx
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
1110fa: 89 4a 04 mov %ecx,0x4(%edx)
before_node = after_node->next;
1110fd: 8b 19 mov (%ecx),%ebx
after_node->next = the_node;
1110ff: 89 11 mov %edx,(%ecx)
the_node->next = before_node;
111101: 89 1a mov %ebx,(%edx)
before_node->previous = the_node;
111103: 89 53 04 mov %edx,0x4(%ebx)
_ISR_Enable( level );
111106: 56 push %esi
111107: 9d popf
/*
* According to POSIX, does this happen before or after the message
* is actually enqueued. It is logical to think afterwards, because
* the message is actually in the queue at this point.
*/
if ( notify && the_message_queue->notify_handler )
111108: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
11110c: 74 16 je 111124 <_CORE_message_queue_Insert_message+0x74>
11110e: 8b 50 60 mov 0x60(%eax),%edx
111111: 85 d2 test %edx,%edx
111113: 74 0f je 111124 <_CORE_message_queue_Insert_message+0x74>
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
111115: 8b 40 64 mov 0x64(%eax),%eax
111118: 89 45 08 mov %eax,0x8(%ebp)
#endif
}
11111b: 83 c4 10 add $0x10,%esp
11111e: 5b pop %ebx
11111f: 5e pop %esi
111120: c9 leave
* According to POSIX, does this happen before or after the message
* is actually enqueued. It is logical to think afterwards, because
* the message is actually in the queue at this point.
*/
if ( notify && the_message_queue->notify_handler )
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
111121: ff e2 jmp *%edx
111123: 90 nop
#endif
}
111124: 83 c4 10 add $0x10,%esp
111127: 5b pop %ebx
111128: 5e pop %esi
111129: c9 leave
11112a: c3 ret
11112b: 90 nop
this_message = (CORE_message_queue_Buffer_control *) the_node;
this_priority = _CORE_message_queue_Get_message_priority(this_message);
if ( this_priority <= the_priority ) {
the_node = the_node->next;
11112c: 8b 1b mov (%ebx),%ebx
int the_priority;
the_priority = _CORE_message_queue_Get_message_priority(the_message);
the_header = &the_message_queue->Pending_messages;
the_node = _Chain_First( the_header );
while ( !_Chain_Is_tail( the_header, the_node ) ) {
11112e: 39 de cmp %ebx,%esi
111130: 74 b5 je 1110e7 <_CORE_message_queue_Insert_message+0x37>
this_message = (CORE_message_queue_Buffer_control *) the_node;
this_priority = _CORE_message_queue_Get_message_priority(this_message);
if ( this_priority <= the_priority ) {
111132: 3b 4b 08 cmp 0x8(%ebx),%ecx
111135: 7c b0 jl 1110e7 <_CORE_message_queue_Insert_message+0x37>
111137: eb f3 jmp 11112c <_CORE_message_queue_Insert_message+0x7c>
111139: 8d 76 00 lea 0x0(%esi),%esi
else
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
#else
if ( submit_type == CORE_MESSAGE_QUEUE_SEND_REQUEST ) {
_ISR_Disable( level );
11113c: 9c pushf
11113d: fa cli
11113e: 5b pop %ebx
SET_NOTIFY();
11113f: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
111142: 85 c9 test %ecx,%ecx
111144: 0f 94 45 f7 sete -0x9(%ebp)
_ISR_Enable( level );
#else
if ( submit_type == CORE_MESSAGE_QUEUE_SEND_REQUEST ) {
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
111148: 41 inc %ecx
111149: 89 48 48 mov %ecx,0x48(%eax)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
11114c: 8b 48 58 mov 0x58(%eax),%ecx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
11114f: 8d 70 54 lea 0x54(%eax),%esi
111152: 89 32 mov %esi,(%edx)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
111154: 89 50 58 mov %edx,0x58(%eax)
old_last->next = the_node;
111157: 89 11 mov %edx,(%ecx)
the_node->previous = old_last;
111159: 89 4a 04 mov %ecx,0x4(%edx)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
11115c: 53 push %ebx
11115d: 9d popf
11115e: eb a8 jmp 111108 <_CORE_message_queue_Insert_message+0x58>
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
_ISR_Disable( level );
111160: 9c pushf
111161: fa cli
111162: 5b pop %ebx
SET_NOTIFY();
111163: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
111166: 85 c9 test %ecx,%ecx
111168: 0f 94 45 f7 sete -0x9(%ebp)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
11116c: 41 inc %ecx
11116d: 89 48 48 mov %ecx,0x48(%eax)
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert_unprotected(_Chain_Head(the_chain), the_node);
111170: 8d 48 50 lea 0x50(%eax),%ecx
111173: 89 4a 04 mov %ecx,0x4(%edx)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
111176: 8b 48 50 mov 0x50(%eax),%ecx
after_node->next = the_node;
111179: 89 50 50 mov %edx,0x50(%eax)
the_node->next = before_node;
11117c: 89 0a mov %ecx,(%edx)
before_node->previous = the_node;
11117e: 89 51 04 mov %edx,0x4(%ecx)
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
111181: 53 push %ebx
111182: 9d popf
111183: eb 83 jmp 111108 <_CORE_message_queue_Insert_message+0x58>
00114abc <_CORE_message_queue_Seize>:
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
114abc: 55 push %ebp
114abd: 89 e5 mov %esp,%ebp
114abf: 57 push %edi
114ac0: 56 push %esi
114ac1: 53 push %ebx
114ac2: 83 ec 2c sub $0x2c,%esp
114ac5: 8b 55 08 mov 0x8(%ebp),%edx
114ac8: 8b 45 0c mov 0xc(%ebp),%eax
114acb: 89 45 dc mov %eax,-0x24(%ebp)
114ace: 8b 4d 10 mov 0x10(%ebp),%ecx
114ad1: 89 4d e0 mov %ecx,-0x20(%ebp)
114ad4: 8b 45 14 mov 0x14(%ebp),%eax
114ad7: 8b 5d 1c mov 0x1c(%ebp),%ebx
114ada: 89 5d d8 mov %ebx,-0x28(%ebp)
114add: 0f b6 7d 18 movzbl 0x18(%ebp),%edi
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
114ae1: 8b 0d d8 11 13 00 mov 0x1311d8,%ecx
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
114ae7: c7 41 34 00 00 00 00 movl $0x0,0x34(%ecx)
_ISR_Disable( level );
114aee: 9c pushf
114aef: fa cli
114af0: 8f 45 e4 popl -0x1c(%ebp)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
114af3: 8b 5a 50 mov 0x50(%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 );
114af6: 8d 72 54 lea 0x54(%edx),%esi
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
114af9: 39 f3 cmp %esi,%ebx
114afb: 74 7b je 114b78 <_CORE_message_queue_Seize+0xbc>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
114afd: 8b 0b mov (%ebx),%ecx
head->next = new_first;
114aff: 89 4a 50 mov %ecx,0x50(%edx)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
114b02: 8d 72 50 lea 0x50(%edx),%esi
114b05: 89 71 04 mov %esi,0x4(%ecx)
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
114b08: ff 4a 48 decl 0x48(%edx)
_ISR_Enable( level );
114b0b: ff 75 e4 pushl -0x1c(%ebp)
114b0e: 9d popf
*size_p = the_message->Contents.size;
114b0f: 8b 4b 0c mov 0xc(%ebx),%ecx
114b12: 89 08 mov %ecx,(%eax)
_Thread_Executing->Wait.count =
114b14: 8b 73 08 mov 0x8(%ebx),%esi
114b17: 8b 0d d8 11 13 00 mov 0x1311d8,%ecx
114b1d: 89 71 24 mov %esi,0x24(%ecx)
_CORE_message_queue_Get_message_priority( the_message );
_CORE_message_queue_Copy_buffer(
the_message->Contents.buffer,
114b20: 8d 4b 10 lea 0x10(%ebx),%ecx
114b23: 89 4d e4 mov %ecx,-0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
114b26: 8b 08 mov (%eax),%ecx
114b28: 8b 7d e0 mov -0x20(%ebp),%edi
114b2b: 8b 75 e4 mov -0x1c(%ebp),%esi
114b2e: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
* is not, then we can go ahead and free the buffer.
*
* NOTE: If we note that the queue was not full before this receive,
* then we can avoid this dequeue.
*/
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
114b30: 83 ec 0c sub $0xc,%esp
114b33: 52 push %edx
114b34: 89 55 d4 mov %edx,-0x2c(%ebp)
114b37: e8 a0 1d 00 00 call 1168dc <_Thread_queue_Dequeue>
if ( !the_thread ) {
114b3c: 83 c4 10 add $0x10,%esp
114b3f: 85 c0 test %eax,%eax
114b41: 8b 55 d4 mov -0x2c(%ebp),%edx
114b44: 0f 84 86 00 00 00 je 114bd0 <_CORE_message_queue_Seize+0x114>
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
114b4a: 8b 48 24 mov 0x24(%eax),%ecx
114b4d: 89 4b 08 mov %ecx,0x8(%ebx)
*/
_CORE_message_queue_Set_message_priority(
the_message,
the_thread->Wait.count
);
the_message->Contents.size = (size_t) the_thread->Wait.option;
114b50: 8b 48 30 mov 0x30(%eax),%ecx
114b53: 89 4b 0c mov %ecx,0xc(%ebx)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
114b56: 8b 70 2c mov 0x2c(%eax),%esi
114b59: 8b 7d e4 mov -0x1c(%ebp),%edi
114b5c: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
114b5e: 8b 43 08 mov 0x8(%ebx),%eax
114b61: 89 45 10 mov %eax,0x10(%ebp)
114b64: 89 5d 0c mov %ebx,0xc(%ebp)
114b67: 89 55 08 mov %edx,0x8(%ebp)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
114b6a: 8d 65 f4 lea -0xc(%ebp),%esp
114b6d: 5b pop %ebx
114b6e: 5e pop %esi
114b6f: 5f pop %edi
114b70: c9 leave
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
114b71: e9 7e 51 00 00 jmp 119cf4 <_CORE_message_queue_Insert_message>
114b76: 66 90 xchg %ax,%ax
return;
}
#endif
}
if ( !wait ) {
114b78: 89 fb mov %edi,%ebx
114b7a: 84 db test %bl,%bl
114b7c: 75 16 jne 114b94 <_CORE_message_queue_Seize+0xd8>
_ISR_Enable( level );
114b7e: ff 75 e4 pushl -0x1c(%ebp)
114b81: 9d popf
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
114b82: c7 41 34 04 00 00 00 movl $0x4,0x34(%ecx)
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
114b89: 8d 65 f4 lea -0xc(%ebp),%esp
114b8c: 5b pop %ebx
114b8d: 5e pop %esi
114b8e: 5f pop %edi
114b8f: c9 leave
114b90: c3 ret
114b91: 8d 76 00 lea 0x0(%esi),%esi
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;
114b94: c7 42 30 01 00 00 00 movl $0x1,0x30(%edx)
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
return;
}
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
114b9b: 89 51 44 mov %edx,0x44(%ecx)
executing->Wait.id = id;
114b9e: 8b 5d dc mov -0x24(%ebp),%ebx
114ba1: 89 59 20 mov %ebx,0x20(%ecx)
executing->Wait.return_argument_second.mutable_object = buffer;
114ba4: 8b 5d e0 mov -0x20(%ebp),%ebx
114ba7: 89 59 2c mov %ebx,0x2c(%ecx)
executing->Wait.return_argument = size_p;
114baa: 89 41 28 mov %eax,0x28(%ecx)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
114bad: ff 75 e4 pushl -0x1c(%ebp)
114bb0: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
114bb1: c7 45 10 30 6d 11 00 movl $0x116d30,0x10(%ebp)
114bb8: 8b 45 d8 mov -0x28(%ebp),%eax
114bbb: 89 45 0c mov %eax,0xc(%ebp)
114bbe: 89 55 08 mov %edx,0x8(%ebp)
}
114bc1: 8d 65 f4 lea -0xc(%ebp),%esp
114bc4: 5b pop %ebx
114bc5: 5e pop %esi
114bc6: 5f pop %edi
114bc7: c9 leave
executing->Wait.return_argument_second.mutable_object = buffer;
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
114bc8: e9 37 1e 00 00 jmp 116a04 <_Thread_queue_Enqueue_with_handler>
114bcd: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
_Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
114bd0: 89 5d 0c mov %ebx,0xc(%ebp)
114bd3: 83 c2 68 add $0x68,%edx
114bd6: 89 55 08 mov %edx,0x8(%ebp)
}
114bd9: 8d 65 f4 lea -0xc(%ebp),%esp
114bdc: 5b pop %ebx
114bdd: 5e pop %esi
114bde: 5f pop %edi
114bdf: c9 leave
114be0: e9 a7 fd ff ff jmp 11498c <_Chain_Append>
0010c03c <_CORE_message_queue_Submit>:
#endif
CORE_message_queue_Submit_types submit_type,
bool wait,
Watchdog_Interval timeout
)
{
10c03c: 55 push %ebp
10c03d: 89 e5 mov %esp,%ebp
10c03f: 57 push %edi
10c040: 56 push %esi
10c041: 53 push %ebx
10c042: 83 ec 1c sub $0x1c,%esp
10c045: 8b 5d 08 mov 0x8(%ebp),%ebx
10c048: 8b 75 0c mov 0xc(%ebp),%esi
10c04b: 8a 4d 20 mov 0x20(%ebp),%cl
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
10c04e: 8b 45 10 mov 0x10(%ebp),%eax
10c051: 39 43 4c cmp %eax,0x4c(%ebx)
10c054: 72 32 jb 10c088 <_CORE_message_queue_Submit+0x4c>
}
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
10c056: 8b 43 48 mov 0x48(%ebx),%eax
10c059: 85 c0 test %eax,%eax
10c05b: 74 3b je 10c098 <_CORE_message_queue_Submit+0x5c>
/*
* No one waiting on the message queue at this time, so attempt to
* queue the message up for a future receive.
*/
if ( the_message_queue->number_of_pending_messages <
10c05d: 39 43 44 cmp %eax,0x44(%ebx)
10c060: 0f 87 ba 00 00 00 ja 10c120 <_CORE_message_queue_Submit+0xe4>
/*
* No message buffers were available so we may need to return an
* overflow error or block the sender until the message is placed
* on the queue.
*/
if ( !wait ) {
10c066: 84 c9 test %cl,%cl
10c068: 0f 84 ee 00 00 00 je 10c15c <_CORE_message_queue_Submit+0x120>
/*
* Do NOT block on a send if the caller is in an ISR. It is
* deadly to block in an ISR.
*/
if ( _ISR_Is_in_progress() ) {
10c06e: 8b 15 34 7b 12 00 mov 0x127b34,%edx
10c074: 85 d2 test %edx,%edx
10c076: 74 60 je 10c0d8 <_CORE_message_queue_Submit+0x9c>
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
10c078: b8 03 00 00 00 mov $0x3,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c07d: 8d 65 f4 lea -0xc(%ebp),%esp
10c080: 5b pop %ebx
10c081: 5e pop %esi
10c082: 5f pop %edi
10c083: c9 leave
10c084: c3 ret
10c085: 8d 76 00 lea 0x0(%esi),%esi
{
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
10c088: b8 01 00 00 00 mov $0x1,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c08d: 8d 65 f4 lea -0xc(%ebp),%esp
10c090: 5b pop %ebx
10c091: 5e pop %esi
10c092: 5f pop %edi
10c093: c9 leave
10c094: c3 ret
10c095: 8d 76 00 lea 0x0(%esi),%esi
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
10c098: 83 ec 0c sub $0xc,%esp
10c09b: 53 push %ebx
10c09c: 88 4d e4 mov %cl,-0x1c(%ebp)
10c09f: e8 0c 1c 00 00 call 10dcb0 <_Thread_queue_Dequeue>
10c0a4: 89 c2 mov %eax,%edx
if ( the_thread ) {
10c0a6: 83 c4 10 add $0x10,%esp
10c0a9: 85 c0 test %eax,%eax
10c0ab: 8a 4d e4 mov -0x1c(%ebp),%cl
10c0ae: 0f 84 b8 00 00 00 je 10c16c <_CORE_message_queue_Submit+0x130>
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
10c0b4: 8b 40 2c mov 0x2c(%eax),%eax
10c0b7: 89 c7 mov %eax,%edi
10c0b9: 8b 4d 10 mov 0x10(%ebp),%ecx
10c0bc: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
_CORE_message_queue_Copy_buffer(
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
10c0be: 8b 42 28 mov 0x28(%edx),%eax
10c0c1: 8b 4d 10 mov 0x10(%ebp),%ecx
10c0c4: 89 08 mov %ecx,(%eax)
the_thread->Wait.count = (uint32_t) submit_type;
10c0c6: 8b 45 1c mov 0x1c(%ebp),%eax
10c0c9: 89 42 24 mov %eax,0x24(%edx)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
10c0cc: 31 c0 xor %eax,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c0ce: 8d 65 f4 lea -0xc(%ebp),%esp
10c0d1: 5b pop %ebx
10c0d2: 5e pop %esi
10c0d3: 5f pop %edi
10c0d4: c9 leave
10c0d5: c3 ret
10c0d6: 66 90 xchg %ax,%ax
* Thus the unusual choice to open a new scope and declare
* it as a variable. Doing this emphasizes how dangerous it
* would be to use this variable prior to here.
*/
{
Thread_Control *executing = _Thread_Executing;
10c0d8: a1 38 7b 12 00 mov 0x127b38,%eax
ISR_Level level;
_ISR_Disable( level );
10c0dd: 9c pushf
10c0de: fa cli
10c0df: 59 pop %ecx
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;
10c0e0: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
10c0e7: 89 58 44 mov %ebx,0x44(%eax)
executing->Wait.id = id;
10c0ea: 8b 55 14 mov 0x14(%ebp),%edx
10c0ed: 89 50 20 mov %edx,0x20(%eax)
executing->Wait.return_argument_second.immutable_object = buffer;
10c0f0: 89 70 2c mov %esi,0x2c(%eax)
executing->Wait.option = (uint32_t) size;
10c0f3: 8b 55 10 mov 0x10(%ebp),%edx
10c0f6: 89 50 30 mov %edx,0x30(%eax)
executing->Wait.count = submit_type;
10c0f9: 8b 55 1c mov 0x1c(%ebp),%edx
10c0fc: 89 50 24 mov %edx,0x24(%eax)
_ISR_Enable( level );
10c0ff: 51 push %ecx
10c100: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
10c101: 50 push %eax
10c102: 68 04 e1 10 00 push $0x10e104
10c107: ff 75 24 pushl 0x24(%ebp)
10c10a: 53 push %ebx
10c10b: e8 c8 1c 00 00 call 10ddd8 <_Thread_queue_Enqueue_with_handler>
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
10c110: 83 c4 10 add $0x10,%esp
10c113: b8 07 00 00 00 mov $0x7,%eax
#endif
}
10c118: 8d 65 f4 lea -0xc(%ebp),%esp
10c11b: 5b pop %ebx
10c11c: 5e pop %esi
10c11d: 5f pop %edi
10c11e: c9 leave
10c11f: c3 ret
_CORE_message_queue_Allocate_message_buffer (
CORE_message_queue_Control *the_message_queue
)
{
return (CORE_message_queue_Buffer_control *)
_Chain_Get( &the_message_queue->Inactive_messages );
10c120: 83 ec 0c sub $0xc,%esp
10c123: 8d 43 68 lea 0x68(%ebx),%eax
10c126: 50 push %eax
10c127: e8 ec fe ff ff call 10c018 <_Chain_Get>
10c12c: 89 c2 mov %eax,%edx
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
#endif
_CORE_message_queue_Copy_buffer(
buffer,
the_message->Contents.buffer,
10c12e: 8d 40 10 lea 0x10(%eax),%eax
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
10c131: 89 c7 mov %eax,%edi
10c133: 8b 4d 10 mov 0x10(%ebp),%ecx
10c136: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
size
);
the_message->Contents.size = size;
10c138: 8b 4d 10 mov 0x10(%ebp),%ecx
10c13b: 89 4a 0c mov %ecx,0xc(%edx)
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
10c13e: 8b 45 1c mov 0x1c(%ebp),%eax
10c141: 89 42 08 mov %eax,0x8(%edx)
_CORE_message_queue_Set_message_priority( the_message, submit_type );
_CORE_message_queue_Insert_message(
10c144: 83 c4 0c add $0xc,%esp
10c147: 50 push %eax
10c148: 52 push %edx
10c149: 53 push %ebx
10c14a: e8 61 4f 00 00 call 1110b0 <_CORE_message_queue_Insert_message>
the_message_queue,
the_message,
submit_type
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
10c14f: 83 c4 10 add $0x10,%esp
10c152: 31 c0 xor %eax,%eax
10c154: e9 34 ff ff ff jmp 10c08d <_CORE_message_queue_Submit+0x51>
10c159: 8d 76 00 lea 0x0(%esi),%esi
* No message buffers were available so we may need to return an
* overflow error or block the sender until the message is placed
* on the queue.
*/
if ( !wait ) {
return CORE_MESSAGE_QUEUE_STATUS_TOO_MANY;
10c15c: b8 02 00 00 00 mov $0x2,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c161: 8d 65 f4 lea -0xc(%ebp),%esp
10c164: 5b pop %ebx
10c165: 5e pop %esi
10c166: 5f pop %edi
10c167: c9 leave
10c168: c3 ret
10c169: 8d 76 00 lea 0x0(%esi),%esi
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
if ( the_thread ) {
10c16c: 8b 43 48 mov 0x48(%ebx),%eax
10c16f: e9 e9 fe ff ff jmp 10c05d <_CORE_message_queue_Submit+0x21>
0010c180 <_CORE_mutex_Initialize>:
CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex,
CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock
)
{
10c180: 55 push %ebp
10c181: 89 e5 mov %esp,%ebp
10c183: 57 push %edi
10c184: 56 push %esi
10c185: 53 push %ebx
10c186: 83 ec 0c sub $0xc,%esp
10c189: 8b 45 08 mov 0x8(%ebp),%eax
10c18c: 8b 5d 0c mov 0xc(%ebp),%ebx
10c18f: 8b 55 10 mov 0x10(%ebp),%edx
/* Add this to the RTEMS environment later ?????????
rtems_assert( initial_lock == CORE_MUTEX_LOCKED ||
initial_lock == CORE_MUTEX_UNLOCKED );
*/
the_mutex->Attributes = *the_mutex_attributes;
10c192: 8d 78 40 lea 0x40(%eax),%edi
10c195: b9 04 00 00 00 mov $0x4,%ecx
10c19a: 89 de mov %ebx,%esi
10c19c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_mutex->lock = initial_lock;
10c19e: 89 50 50 mov %edx,0x50(%eax)
the_mutex->blocked_count = 0;
10c1a1: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
if ( initial_lock == CORE_MUTEX_LOCKED ) {
10c1a8: 85 d2 test %edx,%edx
10c1aa: 75 30 jne 10c1dc <_CORE_mutex_Initialize+0x5c>
the_mutex->nest_count = 1;
10c1ac: c7 40 54 01 00 00 00 movl $0x1,0x54(%eax)
the_mutex->holder = _Thread_Executing;
10c1b3: 8b 15 38 7b 12 00 mov 0x127b38,%edx
10c1b9: 89 50 5c mov %edx,0x5c(%eax)
the_mutex->holder_id = _Thread_Executing->Object.id;
10c1bc: 8b 4a 08 mov 0x8(%edx),%ecx
10c1bf: 89 48 60 mov %ecx,0x60(%eax)
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c1c2: 8b 48 48 mov 0x48(%eax),%ecx
if ( initial_lock == CORE_MUTEX_LOCKED ) {
the_mutex->nest_count = 1;
the_mutex->holder = _Thread_Executing;
the_mutex->holder_id = _Thread_Executing->Object.id;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
10c1c5: 83 f9 02 cmp $0x2,%ecx
10c1c8: 74 05 je 10c1cf <_CORE_mutex_Initialize+0x4f>
10c1ca: 83 f9 03 cmp $0x3,%ecx
10c1cd: 75 22 jne 10c1f1 <_CORE_mutex_Initialize+0x71>
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
10c1cf: 8b 48 4c mov 0x4c(%eax),%ecx
10c1d2: 39 4a 14 cmp %ecx,0x14(%edx)
10c1d5: 72 41 jb 10c218 <_CORE_mutex_Initialize+0x98>
_Chain_Prepend_unprotected( &_Thread_Executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = _Thread_Executing->current_priority;
#endif
_Thread_Executing->resource_count++;
10c1d7: ff 42 1c incl 0x1c(%edx)
10c1da: eb 15 jmp 10c1f1 <_CORE_mutex_Initialize+0x71>
}
} else {
the_mutex->nest_count = 0;
10c1dc: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
the_mutex->holder = NULL;
10c1e3: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
the_mutex->holder_id = 0;
10c1ea: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
}
_Thread_queue_Initialize(
10c1f1: 6a 05 push $0x5
10c1f3: 68 00 04 00 00 push $0x400
10c1f8: 31 d2 xor %edx,%edx
10c1fa: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10c1fe: 0f 95 c2 setne %dl
10c201: 52 push %edx
10c202: 50 push %eax
10c203: e8 38 1e 00 00 call 10e040 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c208: 83 c4 10 add $0x10,%esp
10c20b: 31 c0 xor %eax,%eax
}
10c20d: 8d 65 f4 lea -0xc(%ebp),%esp
10c210: 5b pop %ebx
10c211: 5e pop %esi
10c212: 5f pop %edi
10c213: c9 leave
10c214: c3 ret
10c215: 8d 76 00 lea 0x0(%esi),%esi
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
the_mutex->Attributes.priority_ceiling )
return CORE_MUTEX_STATUS_CEILING_VIOLATED;
10c218: b8 06 00 00 00 mov $0x6,%eax
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c21d: 8d 65 f4 lea -0xc(%ebp),%esp
10c220: 5b pop %ebx
10c221: 5e pop %esi
10c222: 5f pop %edi
10c223: c9 leave
10c224: c3 ret
0010c278 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
10c278: 55 push %ebp
10c279: 89 e5 mov %esp,%ebp
10c27b: 53 push %ebx
10c27c: 83 ec 14 sub $0x14,%esp
10c27f: 8b 5d 08 mov 0x8(%ebp),%ebx
10c282: 8a 55 10 mov 0x10(%ebp),%dl
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
10c285: a1 50 75 12 00 mov 0x127550,%eax
10c28a: 85 c0 test %eax,%eax
10c28c: 74 04 je 10c292 <_CORE_mutex_Seize+0x1a>
10c28e: 84 d2 test %dl,%dl
10c290: 75 36 jne 10c2c8 <_CORE_mutex_Seize+0x50><== ALWAYS TAKEN
10c292: 83 ec 08 sub $0x8,%esp
10c295: 8d 45 18 lea 0x18(%ebp),%eax
10c298: 50 push %eax
10c299: 53 push %ebx
10c29a: 88 55 f4 mov %dl,-0xc(%ebp)
10c29d: e8 e6 4e 00 00 call 111188 <_CORE_mutex_Seize_interrupt_trylock>
10c2a2: 83 c4 10 add $0x10,%esp
10c2a5: 85 c0 test %eax,%eax
10c2a7: 8a 55 f4 mov -0xc(%ebp),%dl
10c2aa: 74 14 je 10c2c0 <_CORE_mutex_Seize+0x48>
10c2ac: 84 d2 test %dl,%dl
10c2ae: 75 30 jne 10c2e0 <_CORE_mutex_Seize+0x68>
10c2b0: ff 75 18 pushl 0x18(%ebp)
10c2b3: 9d popf
10c2b4: a1 38 7b 12 00 mov 0x127b38,%eax
10c2b9: c7 40 34 01 00 00 00 movl $0x1,0x34(%eax)
}
10c2c0: 8b 5d fc mov -0x4(%ebp),%ebx
10c2c3: c9 leave
10c2c4: c3 ret
10c2c5: 8d 76 00 lea 0x0(%esi),%esi
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
10c2c8: 83 3d 20 77 12 00 01 cmpl $0x1,0x127720
10c2cf: 76 c1 jbe 10c292 <_CORE_mutex_Seize+0x1a>
10c2d1: 53 push %ebx
10c2d2: 6a 12 push $0x12
10c2d4: 6a 00 push $0x0
10c2d6: 6a 00 push $0x0
10c2d8: e8 23 06 00 00 call 10c900 <_Internal_error_Occurred>
10c2dd: 8d 76 00 lea 0x0(%esi),%esi
10c2e0: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
10c2e7: a1 38 7b 12 00 mov 0x127b38,%eax
10c2ec: 89 58 44 mov %ebx,0x44(%eax)
10c2ef: 8b 55 0c mov 0xc(%ebp),%edx
10c2f2: 89 50 20 mov %edx,0x20(%eax)
10c2f5: a1 50 75 12 00 mov 0x127550,%eax
10c2fa: 40 inc %eax
10c2fb: a3 50 75 12 00 mov %eax,0x127550
10c300: ff 75 18 pushl 0x18(%ebp)
10c303: 9d popf
10c304: 83 ec 08 sub $0x8,%esp
10c307: ff 75 14 pushl 0x14(%ebp)
10c30a: 53 push %ebx
10c30b: e8 18 ff ff ff call 10c228 <_CORE_mutex_Seize_interrupt_blocking>
10c310: 83 c4 10 add $0x10,%esp
}
10c313: 8b 5d fc mov -0x4(%ebp),%ebx
10c316: c9 leave
10c317: c3 ret
00111188 <_CORE_mutex_Seize_interrupt_trylock>:
#if defined(__RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__)
int _CORE_mutex_Seize_interrupt_trylock(
CORE_mutex_Control *the_mutex,
ISR_Level *level_p
)
{
111188: 55 push %ebp
111189: 89 e5 mov %esp,%ebp
11118b: 56 push %esi
11118c: 53 push %ebx
11118d: 8b 45 08 mov 0x8(%ebp),%eax
111190: 8b 4d 0c mov 0xc(%ebp),%ecx
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
111193: 8b 15 38 7b 12 00 mov 0x127b38,%edx
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
111199: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
1111a0: 8b 58 50 mov 0x50(%eax),%ebx
1111a3: 85 db test %ebx,%ebx
1111a5: 74 31 je 1111d8 <_CORE_mutex_Seize_interrupt_trylock+0x50>
the_mutex->lock = CORE_MUTEX_LOCKED;
1111a7: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
the_mutex->holder = executing;
1111ae: 89 50 5c mov %edx,0x5c(%eax)
the_mutex->holder_id = executing->Object.id;
1111b1: 8b 5a 08 mov 0x8(%edx),%ebx
1111b4: 89 58 60 mov %ebx,0x60(%eax)
the_mutex->nest_count = 1;
1111b7: c7 40 54 01 00 00 00 movl $0x1,0x54(%eax)
return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p );
}
1111be: 8b 58 48 mov 0x48(%eax),%ebx
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
1111c1: 83 fb 02 cmp $0x2,%ebx
1111c4: 74 26 je 1111ec <_CORE_mutex_Seize_interrupt_trylock+0x64>
1111c6: 83 fb 03 cmp $0x3,%ebx
1111c9: 74 3d je 111208 <_CORE_mutex_Seize_interrupt_trylock+0x80>
executing->resource_count++;
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
1111cb: ff 31 pushl (%ecx)
1111cd: 9d popf
return 0;
1111ce: 31 c0 xor %eax,%eax
1111d0: 8d 65 f8 lea -0x8(%ebp),%esp
1111d3: 5b pop %ebx
1111d4: 5e pop %esi
1111d5: c9 leave
1111d6: c3 ret
1111d7: 90 nop
/*
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
1111d8: 3b 50 5c cmp 0x5c(%eax),%edx
1111db: 74 17 je 1111f4 <_CORE_mutex_Seize_interrupt_trylock+0x6c>
/*
* The mutex is not available and the caller must deal with the possibility
* of blocking.
*/
return 1;
1111dd: b8 01 00 00 00 mov $0x1,%eax
1111e2: 8d 65 f8 lea -0x8(%ebp),%esp
1111e5: 5b pop %ebx
1111e6: 5e pop %esi
1111e7: c9 leave
1111e8: c3 ret
1111e9: 8d 76 00 lea 0x0(%esi),%esi
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
1111ec: ff 42 1c incl 0x1c(%edx)
1111ef: eb da jmp 1111cb <_CORE_mutex_Seize_interrupt_trylock+0x43>
1111f1: 8d 76 00 lea 0x0(%esi),%esi
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
1111f4: 8b 58 40 mov 0x40(%eax),%ebx
1111f7: 85 db test %ebx,%ebx
1111f9: 75 45 jne 111240 <_CORE_mutex_Seize_interrupt_trylock+0xb8>
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
1111fb: ff 40 54 incl 0x54(%eax)
_ISR_Enable( *level_p );
1111fe: ff 31 pushl (%ecx)
111200: 9d popf
return 0;
111201: 31 c0 xor %eax,%eax
111203: eb dd jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111205: 8d 76 00 lea 0x0(%esi),%esi
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
111208: 8b 5a 1c mov 0x1c(%edx),%ebx
11120b: 8d 73 01 lea 0x1(%ebx),%esi
11120e: 89 72 1c mov %esi,0x1c(%edx)
Priority_Control ceiling;
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
111211: 8b 72 14 mov 0x14(%edx),%esi
111214: 39 70 4c cmp %esi,0x4c(%eax)
111217: 74 6b je 111284 <_CORE_mutex_Seize_interrupt_trylock+0xfc>
_ISR_Enable( *level_p );
return 0;
}
if ( current > ceiling ) {
111219: 72 39 jb 111254 <_CORE_mutex_Seize_interrupt_trylock+0xcc>
);
_Thread_Enable_dispatch();
return 0;
}
/* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
11121b: c7 42 34 06 00 00 00 movl $0x6,0x34(%edx)
the_mutex->lock = CORE_MUTEX_UNLOCKED;
111222: c7 40 50 01 00 00 00 movl $0x1,0x50(%eax)
the_mutex->nest_count = 0; /* undo locking above */
111229: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
executing->resource_count--; /* undo locking above */
111230: 89 5a 1c mov %ebx,0x1c(%edx)
_ISR_Enable( *level_p );
111233: ff 31 pushl (%ecx)
111235: 9d popf
return 0;
111236: 31 c0 xor %eax,%eax
111238: 8d 65 f8 lea -0x8(%ebp),%esp
11123b: 5b pop %ebx
11123c: 5e pop %esi
11123d: c9 leave
11123e: c3 ret
11123f: 90 nop
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
111240: 4b dec %ebx
111241: 75 9a jne 1111dd <_CORE_mutex_Seize_interrupt_trylock+0x55>
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
_ISR_Enable( *level_p );
return 0;
case CORE_MUTEX_NESTING_IS_ERROR:
executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
111243: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
_ISR_Enable( *level_p );
11124a: ff 31 pushl (%ecx)
11124c: 9d popf
return 0;
11124d: 31 c0 xor %eax,%eax
11124f: eb 91 jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111251: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
111254: 8b 15 50 75 12 00 mov 0x127550,%edx
11125a: 42 inc %edx
11125b: 89 15 50 75 12 00 mov %edx,0x127550
return 0;
}
if ( current > ceiling ) {
_Thread_Disable_dispatch();
_ISR_Enable( *level_p );
111261: ff 31 pushl (%ecx)
111263: 9d popf
_Thread_Change_priority(
111264: 52 push %edx
111265: 6a 00 push $0x0
111267: ff 70 4c pushl 0x4c(%eax)
11126a: ff 70 5c pushl 0x5c(%eax)
11126d: e8 d6 c1 ff ff call 10d448 <_Thread_Change_priority>
the_mutex->holder,
the_mutex->Attributes.priority_ceiling,
false
);
_Thread_Enable_dispatch();
111272: e8 85 c6 ff ff call 10d8fc <_Thread_Enable_dispatch>
111277: 83 c4 10 add $0x10,%esp
return 0;
11127a: 31 c0 xor %eax,%eax
11127c: e9 61 ff ff ff jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111281: 8d 76 00 lea 0x0(%esi),%esi
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
_ISR_Enable( *level_p );
111284: ff 31 pushl (%ecx)
111286: 9d popf
return 0;
111287: 31 c0 xor %eax,%eax
111289: e9 54 ff ff ff jmp 1111e2 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
0010c318 <_CORE_mutex_Surrender>:
#else
Objects_Id id __attribute__((unused)),
CORE_mutex_API_mp_support_callout api_mutex_mp_support __attribute__((unused))
#endif
)
{
10c318: 55 push %ebp
10c319: 89 e5 mov %esp,%ebp
10c31b: 53 push %ebx
10c31c: 83 ec 04 sub $0x4,%esp
10c31f: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *the_thread;
Thread_Control *holder;
holder = the_mutex->holder;
10c322: 8b 43 5c mov 0x5c(%ebx),%eax
* allowed when the mutex in quetion is FIFO or simple Priority
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
10c325: 80 7b 44 00 cmpb $0x0,0x44(%ebx)
10c329: 74 15 je 10c340 <_CORE_mutex_Surrender+0x28>
if ( !_Thread_Is_executing( holder ) )
10c32b: 3b 05 38 7b 12 00 cmp 0x127b38,%eax
10c331: 74 0d je 10c340 <_CORE_mutex_Surrender+0x28>
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
10c333: b8 03 00 00 00 mov $0x3,%eax
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c338: 8b 5d fc mov -0x4(%ebp),%ebx
10c33b: c9 leave
10c33c: c3 ret
10c33d: 8d 76 00 lea 0x0(%esi),%esi
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
}
/* XXX already unlocked -- not right status */
if ( !the_mutex->nest_count )
10c340: 8b 53 54 mov 0x54(%ebx),%edx
10c343: 85 d2 test %edx,%edx
10c345: 74 51 je 10c398 <_CORE_mutex_Surrender+0x80>
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
10c347: 4a dec %edx
10c348: 89 53 54 mov %edx,0x54(%ebx)
if ( the_mutex->nest_count != 0 ) {
10c34b: 85 d2 test %edx,%edx
10c34d: 75 49 jne 10c398 <_CORE_mutex_Surrender+0x80>
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c34f: 8b 53 48 mov 0x48(%ebx),%edx
/*
* Formally release the mutex before possibly transferring it to a
* blocked thread.
*/
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
10c352: 83 fa 02 cmp $0x2,%edx
10c355: 74 69 je 10c3c0 <_CORE_mutex_Surrender+0xa8>
10c357: 83 fa 03 cmp $0x3,%edx
10c35a: 74 64 je 10c3c0 <_CORE_mutex_Surrender+0xa8>
if ( holder->resource_count == 0 &&
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
}
}
the_mutex->holder = NULL;
10c35c: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx)
the_mutex->holder_id = 0;
10c363: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
/*
* Now we check if another thread was waiting for this mutex. If so,
* transfer the mutex to that thread.
*/
if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) {
10c36a: 83 ec 0c sub $0xc,%esp
10c36d: 53 push %ebx
10c36e: e8 3d 19 00 00 call 10dcb0 <_Thread_queue_Dequeue>
10c373: 83 c4 10 add $0x10,%esp
10c376: 85 c0 test %eax,%eax
10c378: 74 7a je 10c3f4 <_CORE_mutex_Surrender+0xdc>
} else
#endif
{
the_mutex->holder = the_thread;
10c37a: 89 43 5c mov %eax,0x5c(%ebx)
the_mutex->holder_id = the_thread->Object.id;
10c37d: 8b 50 08 mov 0x8(%eax),%edx
10c380: 89 53 60 mov %edx,0x60(%ebx)
the_mutex->nest_count = 1;
10c383: c7 43 54 01 00 00 00 movl $0x1,0x54(%ebx)
switch ( the_mutex->Attributes.discipline ) {
10c38a: 8b 53 48 mov 0x48(%ebx),%edx
10c38d: 83 fa 02 cmp $0x2,%edx
10c390: 74 56 je 10c3e8 <_CORE_mutex_Surrender+0xd0>
10c392: 83 fa 03 cmp $0x3,%edx
10c395: 74 09 je 10c3a0 <_CORE_mutex_Surrender+0x88>
10c397: 90 nop
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c398: 31 c0 xor %eax,%eax
}
10c39a: 8b 5d fc mov -0x4(%ebp),%ebx
10c39d: c9 leave
10c39e: c3 ret
10c39f: 90 nop
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
10c3a0: ff 40 1c incl 0x1c(%eax)
if (the_mutex->Attributes.priority_ceiling <
10c3a3: 8b 53 4c mov 0x4c(%ebx),%edx
10c3a6: 3b 50 14 cmp 0x14(%eax),%edx
10c3a9: 73 ed jae 10c398 <_CORE_mutex_Surrender+0x80>
the_thread->current_priority){
_Thread_Change_priority(
10c3ab: 51 push %ecx
10c3ac: 6a 00 push $0x0
10c3ae: 52 push %edx
10c3af: 50 push %eax
10c3b0: e8 93 10 00 00 call 10d448 <_Thread_Change_priority>
10c3b5: 83 c4 10 add $0x10,%esp
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3b8: 31 c0 xor %eax,%eax
10c3ba: e9 79 ff ff ff jmp 10c338 <_CORE_mutex_Surrender+0x20>
10c3bf: 90 nop
_CORE_mutex_Pop_priority( the_mutex, holder );
if ( pop_status != CORE_MUTEX_STATUS_SUCCESSFUL )
return pop_status;
holder->resource_count--;
10c3c0: 8b 50 1c mov 0x1c(%eax),%edx
10c3c3: 4a dec %edx
10c3c4: 89 50 1c mov %edx,0x1c(%eax)
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
10c3c7: 85 d2 test %edx,%edx
10c3c9: 75 91 jne 10c35c <_CORE_mutex_Surrender+0x44>
holder->real_priority != holder->current_priority ) {
10c3cb: 8b 50 18 mov 0x18(%eax),%edx
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
10c3ce: 3b 50 14 cmp 0x14(%eax),%edx
10c3d1: 74 89 je 10c35c <_CORE_mutex_Surrender+0x44>
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
10c3d3: 51 push %ecx
10c3d4: 6a 01 push $0x1
10c3d6: 52 push %edx
10c3d7: 50 push %eax
10c3d8: e8 6b 10 00 00 call 10d448 <_Thread_Change_priority>
10c3dd: 83 c4 10 add $0x10,%esp
10c3e0: e9 77 ff ff ff jmp 10c35c <_CORE_mutex_Surrender+0x44>
10c3e5: 8d 76 00 lea 0x0(%esi),%esi
case CORE_MUTEX_DISCIPLINES_FIFO:
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
10c3e8: ff 40 1c incl 0x1c(%eax)
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3eb: 31 c0 xor %eax,%eax
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
10c3ed: e9 46 ff ff ff jmp 10c338 <_CORE_mutex_Surrender+0x20>
10c3f2: 66 90 xchg %ax,%ax
}
break;
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
10c3f4: c7 43 50 01 00 00 00 movl $0x1,0x50(%ebx)
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3fb: 31 c0 xor %eax,%eax
10c3fd: e9 36 ff ff ff jmp 10c338 <_CORE_mutex_Surrender+0x20>
00115288 <_CORE_semaphore_Seize>:
CORE_semaphore_Control *the_semaphore,
Objects_Id id,
bool wait,
Watchdog_Interval timeout
)
{
115288: 55 push %ebp
115289: 89 e5 mov %esp,%ebp
11528b: 57 push %edi
11528c: 56 push %esi
11528d: 53 push %ebx
11528e: 83 ec 1c sub $0x1c,%esp
115291: 8b 45 08 mov 0x8(%ebp),%eax
115294: 8b 7d 0c mov 0xc(%ebp),%edi
115297: 8b 75 14 mov 0x14(%ebp),%esi
11529a: 8a 5d 10 mov 0x10(%ebp),%bl
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
11529d: 8b 15 b8 d8 12 00 mov 0x12d8b8,%edx
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
1152a3: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_ISR_Disable( level );
1152aa: 9c pushf
1152ab: fa cli
1152ac: 8f 45 e4 popl -0x1c(%ebp)
if ( the_semaphore->count != 0 ) {
1152af: 8b 48 48 mov 0x48(%eax),%ecx
1152b2: 85 c9 test %ecx,%ecx
1152b4: 75 46 jne 1152fc <_CORE_semaphore_Seize+0x74>
/*
* If the semaphore was not available and the caller was not willing
* to block, then return immediately with a status indicating that
* the semaphore was not available and the caller never blocked.
*/
if ( !wait ) {
1152b6: 84 db test %bl,%bl
1152b8: 75 16 jne 1152d0 <_CORE_semaphore_Seize+0x48>
_ISR_Enable( level );
1152ba: ff 75 e4 pushl -0x1c(%ebp)
1152bd: 9d popf
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
1152be: c7 42 34 01 00 00 00 movl $0x1,0x34(%edx)
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
}
1152c5: 83 c4 1c add $0x1c,%esp
1152c8: 5b pop %ebx
1152c9: 5e pop %esi
1152ca: 5f pop %edi
1152cb: c9 leave
1152cc: c3 ret
1152cd: 8d 76 00 lea 0x0(%esi),%esi
1152d0: c7 40 30 01 00 00 00 movl $0x1,0x30(%eax)
/*
* If the semaphore is not available and the caller is willing to
* block, then we now block the caller with optional timeout.
*/
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
1152d7: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
1152da: 89 7a 20 mov %edi,0x20(%edx)
_ISR_Enable( level );
1152dd: ff 75 e4 pushl -0x1c(%ebp)
1152e0: 9d popf
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
1152e1: c7 45 10 18 1b 11 00 movl $0x111b18,0x10(%ebp)
1152e8: 89 75 0c mov %esi,0xc(%ebp)
1152eb: 89 45 08 mov %eax,0x8(%ebp)
}
1152ee: 83 c4 1c add $0x1c,%esp
1152f1: 5b pop %ebx
1152f2: 5e pop %esi
1152f3: 5f pop %edi
1152f4: c9 leave
*/
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
1152f5: e9 f2 c4 ff ff jmp 1117ec <_Thread_queue_Enqueue_with_handler>
1152fa: 66 90 xchg %ax,%ax
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
if ( the_semaphore->count != 0 ) {
the_semaphore->count -= 1;
1152fc: 49 dec %ecx
1152fd: 89 48 48 mov %ecx,0x48(%eax)
_ISR_Enable( level );
115300: ff 75 e4 pushl -0x1c(%ebp)
115303: 9d popf
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
}
115304: 83 c4 1c add $0x1c,%esp
115307: 5b pop %ebx
115308: 5e pop %esi
115309: 5f pop %edi
11530a: c9 leave
11530b: c3 ret
0010c450 <_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
)
{
10c450: 55 push %ebp
10c451: 89 e5 mov %esp,%ebp
10c453: 53 push %ebx
10c454: 83 ec 10 sub $0x10,%esp
10c457: 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)) ) {
10c45a: 53 push %ebx
10c45b: e8 50 18 00 00 call 10dcb0 <_Thread_queue_Dequeue>
10c460: 83 c4 10 add $0x10,%esp
10c463: 85 c0 test %eax,%eax
10c465: 74 09 je 10c470 <_CORE_semaphore_Surrender+0x20>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10c467: 31 c0 xor %eax,%eax
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
10c469: 8b 5d fc mov -0x4(%ebp),%ebx
10c46c: c9 leave
10c46d: c3 ret
10c46e: 66 90 xchg %ax,%ax
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
10c470: 9c pushf
10c471: fa cli
10c472: 5a pop %edx
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10c473: 8b 43 48 mov 0x48(%ebx),%eax
10c476: 3b 43 40 cmp 0x40(%ebx),%eax
10c479: 72 0d jb 10c488 <_CORE_semaphore_Surrender+0x38><== ALWAYS TAKEN
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
10c47b: b8 04 00 00 00 mov $0x4,%eax <== NOT EXECUTED
_ISR_Enable( level );
10c480: 52 push %edx
10c481: 9d popf
}
return status;
}
10c482: 8b 5d fc mov -0x4(%ebp),%ebx
10c485: c9 leave
10c486: c3 ret
10c487: 90 nop
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
10c488: 40 inc %eax
10c489: 89 43 48 mov %eax,0x48(%ebx)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10c48c: 31 c0 xor %eax,%eax
10c48e: eb f0 jmp 10c480 <_CORE_semaphore_Surrender+0x30>
0010c6a0 <_Chain_Get_with_empty_check>:
bool _Chain_Get_with_empty_check(
Chain_Control *chain,
Chain_Node **node
)
{
10c6a0: 55 push %ebp
10c6a1: 89 e5 mov %esp,%ebp
10c6a3: 57 push %edi
10c6a4: 56 push %esi
10c6a5: 53 push %ebx
10c6a6: 8b 45 08 mov 0x8(%ebp),%eax
10c6a9: 8b 7d 0c mov 0xc(%ebp),%edi
ISR_Level level;
bool is_empty_now;
_ISR_Disable( level );
10c6ac: 9c pushf
10c6ad: fa cli
10c6ae: 5e pop %esi
Chain_Node **the_node
)
{
bool is_empty_now = true;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10c6af: 8d 58 04 lea 0x4(%eax),%ebx
Chain_Node *old_first = head->next;
10c6b2: 8b 10 mov (%eax),%edx
if ( old_first != tail ) {
10c6b4: 39 d3 cmp %edx,%ebx
10c6b6: 74 18 je 10c6d0 <_Chain_Get_with_empty_check+0x30>
Chain_Node *new_first = old_first->next;
10c6b8: 8b 0a mov (%edx),%ecx
head->next = new_first;
10c6ba: 89 08 mov %ecx,(%eax)
new_first->previous = head;
10c6bc: 89 41 04 mov %eax,0x4(%ecx)
*the_node = old_first;
10c6bf: 89 17 mov %edx,(%edi)
is_empty_now = new_first == tail;
10c6c1: 39 cb cmp %ecx,%ebx
10c6c3: 0f 94 c0 sete %al
is_empty_now = _Chain_Get_with_empty_check_unprotected( chain, node );
_ISR_Enable( level );
10c6c6: 56 push %esi
10c6c7: 9d popf
return is_empty_now;
}
10c6c8: 5b pop %ebx
10c6c9: 5e pop %esi
10c6ca: 5f pop %edi
10c6cb: c9 leave
10c6cc: c3 ret
10c6cd: 8d 76 00 lea 0x0(%esi),%esi
} else
*the_node = NULL;
10c6d0: c7 07 00 00 00 00 movl $0x0,(%edi)
RTEMS_INLINE_ROUTINE bool _Chain_Get_with_empty_check_unprotected(
Chain_Control *the_chain,
Chain_Node **the_node
)
{
bool is_empty_now = true;
10c6d6: b0 01 mov $0x1,%al
10c6d8: eb ec jmp 10c6c6 <_Chain_Get_with_empty_check+0x26>
00111054 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
111054: 55 push %ebp
111055: 89 e5 mov %esp,%ebp
111057: 57 push %edi
111058: 56 push %esi
111059: 53 push %ebx
11105a: 83 ec 08 sub $0x8,%esp
11105d: 8b 7d 08 mov 0x8(%ebp),%edi
111060: 8b 4d 10 mov 0x10(%ebp),%ecx
111063: 8b 75 14 mov 0x14(%ebp),%esi
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
111066: 8d 47 04 lea 0x4(%edi),%eax
111069: 89 45 f0 mov %eax,-0x10(%ebp)
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
11106c: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
while ( count-- ) {
111073: 85 c9 test %ecx,%ecx
111075: 74 35 je 1110ac <_Chain_Initialize+0x58><== NEVER TAKEN
111077: 49 dec %ecx
111078: 89 4d ec mov %ecx,-0x14(%ebp)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
11107b: 8b 45 0c mov 0xc(%ebp),%eax
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
11107e: 89 fa mov %edi,%edx
111080: eb 07 jmp 111089 <_Chain_Initialize+0x35>
111082: 66 90 xchg %ax,%ax
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
111084: 89 c2 mov %eax,%edx
current->next = next;
next->previous = current;
current = next;
next = (Chain_Node *)
111086: 89 d8 mov %ebx,%eax
111088: 49 dec %ecx
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
current->next = next;
111089: 89 02 mov %eax,(%edx)
next->previous = current;
11108b: 89 50 04 mov %edx,0x4(%eax)
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
11108e: 8d 1c 30 lea (%eax,%esi,1),%ebx
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
111091: 85 c9 test %ecx,%ecx
111093: 75 ef jne 111084 <_Chain_Initialize+0x30>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
111095: 0f af 75 ec imul -0x14(%ebp),%esi
111099: 03 75 0c add 0xc(%ebp),%esi
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
11109c: 8b 45 f0 mov -0x10(%ebp),%eax
11109f: 89 06 mov %eax,(%esi)
tail->previous = current;
1110a1: 89 77 08 mov %esi,0x8(%edi)
}
1110a4: 83 c4 08 add $0x8,%esp
1110a7: 5b pop %ebx
1110a8: 5e pop %esi
1110a9: 5f pop %edi
1110aa: c9 leave
1110ab: c3 ret
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
1110ac: 89 fe mov %edi,%esi <== NOT EXECUTED
1110ae: eb ec jmp 11109c <_Chain_Initialize+0x48><== NOT EXECUTED
0010b070 <_Event_Seize>:
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
10b070: 55 push %ebp
10b071: 89 e5 mov %esp,%ebp
10b073: 57 push %edi
10b074: 56 push %esi
10b075: 53 push %ebx
10b076: 83 ec 2c sub $0x2c,%esp
10b079: 8b 45 08 mov 0x8(%ebp),%eax
10b07c: 8b 4d 0c mov 0xc(%ebp),%ecx
10b07f: 8b 55 10 mov 0x10(%ebp),%edx
10b082: 89 55 dc mov %edx,-0x24(%ebp)
10b085: 8b 7d 14 mov 0x14(%ebp),%edi
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
10b088: 8b 1d 38 7b 12 00 mov 0x127b38,%ebx
executing->Wait.return_code = RTEMS_SUCCESSFUL;
10b08e: c7 43 34 00 00 00 00 movl $0x0,0x34(%ebx)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
10b095: 8b b3 e8 00 00 00 mov 0xe8(%ebx),%esi
_ISR_Disable( level );
10b09b: 9c pushf
10b09c: fa cli
10b09d: 8f 45 e0 popl -0x20(%ebp)
pending_events = api->pending_events;
10b0a0: 8b 16 mov (%esi),%edx
10b0a2: 89 55 d4 mov %edx,-0x2c(%ebp)
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
10b0a5: 21 c2 and %eax,%edx
10b0a7: 89 55 e4 mov %edx,-0x1c(%ebp)
10b0aa: 74 0d je 10b0b9 <_Event_Seize+0x49>
10b0ac: 39 d0 cmp %edx,%eax
10b0ae: 0f 84 84 00 00 00 je 10b138 <_Event_Seize+0xc8>
(seized_events == event_in || _Options_Is_any( option_set )) ) {
10b0b4: f6 c1 02 test $0x2,%cl
10b0b7: 75 7f jne 10b138 <_Event_Seize+0xc8>
_ISR_Enable( level );
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
10b0b9: f6 c1 01 test $0x1,%cl
10b0bc: 75 62 jne 10b120 <_Event_Seize+0xb0>
* set properly when we are marked as in the event critical section.
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
10b0be: 89 4b 30 mov %ecx,0x30(%ebx)
executing->Wait.count = (uint32_t) event_in;
10b0c1: 89 43 24 mov %eax,0x24(%ebx)
executing->Wait.return_argument = event_out;
10b0c4: 89 7b 28 mov %edi,0x28(%ebx)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10b0c7: c7 05 68 7f 12 00 01 movl $0x1,0x127f68
10b0ce: 00 00 00
_ISR_Enable( level );
10b0d1: ff 75 e0 pushl -0x20(%ebp)
10b0d4: 9d popf
if ( ticks ) {
10b0d5: 8b 45 dc mov -0x24(%ebp),%eax
10b0d8: 85 c0 test %eax,%eax
10b0da: 0f 85 80 00 00 00 jne 10b160 <_Event_Seize+0xf0>
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
10b0e0: 83 ec 08 sub $0x8,%esp
10b0e3: 68 00 01 00 00 push $0x100
10b0e8: 53 push %ebx
10b0e9: e8 72 30 00 00 call 10e160 <_Thread_Set_state>
_ISR_Disable( level );
10b0ee: 9c pushf
10b0ef: fa cli
10b0f0: 5a pop %edx
sync_state = _Event_Sync_state;
10b0f1: a1 68 7f 12 00 mov 0x127f68,%eax
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10b0f6: c7 05 68 7f 12 00 00 movl $0x0,0x127f68
10b0fd: 00 00 00
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
10b100: 83 c4 10 add $0x10,%esp
10b103: 83 f8 01 cmp $0x1,%eax
10b106: 74 4c je 10b154 <_Event_Seize+0xe4>
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
10b108: 89 55 10 mov %edx,0x10(%ebp)
10b10b: 89 5d 0c mov %ebx,0xc(%ebp)
10b10e: 89 45 08 mov %eax,0x8(%ebp)
}
10b111: 8d 65 f4 lea -0xc(%ebp),%esp
10b114: 5b pop %ebx
10b115: 5e pop %esi
10b116: 5f pop %edi
10b117: c9 leave
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
10b118: e9 df 22 00 00 jmp 10d3fc <_Thread_blocking_operation_Cancel>
10b11d: 8d 76 00 lea 0x0(%esi),%esi
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
10b120: ff 75 e0 pushl -0x20(%ebp)
10b123: 9d popf
executing->Wait.return_code = RTEMS_UNSATISFIED;
10b124: c7 43 34 0d 00 00 00 movl $0xd,0x34(%ebx)
*event_out = seized_events;
10b12b: 8b 55 e4 mov -0x1c(%ebp),%edx
10b12e: 89 17 mov %edx,(%edi)
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
10b130: 8d 65 f4 lea -0xc(%ebp),%esp
10b133: 5b pop %ebx
10b134: 5e pop %esi
10b135: 5f pop %edi
10b136: c9 leave
10b137: c3 ret
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
10b138: 8b 45 e4 mov -0x1c(%ebp),%eax
10b13b: f7 d0 not %eax
10b13d: 23 45 d4 and -0x2c(%ebp),%eax
10b140: 89 06 mov %eax,(%esi)
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
api->pending_events =
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
10b142: ff 75 e0 pushl -0x20(%ebp)
10b145: 9d popf
*event_out = seized_events;
10b146: 8b 45 e4 mov -0x1c(%ebp),%eax
10b149: 89 07 mov %eax,(%edi)
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
10b14b: 8d 65 f4 lea -0xc(%ebp),%esp
10b14e: 5b pop %ebx
10b14f: 5e pop %esi
10b150: 5f pop %edi
10b151: c9 leave
10b152: c3 ret
10b153: 90 nop
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
_ISR_Enable( level );
10b154: 52 push %edx
10b155: 9d popf
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
10b156: 8d 65 f4 lea -0xc(%ebp),%esp
10b159: 5b pop %ebx
10b15a: 5e pop %esi
10b15b: 5f pop %edi
10b15c: c9 leave
10b15d: c3 ret
10b15e: 66 90 xchg %ax,%ax
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
if ( ticks ) {
_Watchdog_Initialize(
10b160: 8b 43 08 mov 0x8(%ebx),%eax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10b163: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10b16a: c7 43 64 14 b3 10 00 movl $0x10b314,0x64(%ebx)
the_watchdog->id = id;
10b171: 89 43 68 mov %eax,0x68(%ebx)
the_watchdog->user_data = user_data;
10b174: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b17b: 8b 45 dc mov -0x24(%ebp),%eax
10b17e: 89 43 54 mov %eax,0x54(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b181: 83 ec 08 sub $0x8,%esp
&executing->Timer,
_Event_Timeout,
executing->Object.id,
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
10b184: 8d 43 48 lea 0x48(%ebx),%eax
10b187: 50 push %eax
10b188: 68 5c 76 12 00 push $0x12765c
10b18d: e8 6e 35 00 00 call 10e700 <_Watchdog_Insert>
10b192: 83 c4 10 add $0x10,%esp
10b195: e9 46 ff ff ff jmp 10b0e0 <_Event_Seize+0x70>
0010b1f0 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
10b1f0: 55 push %ebp
10b1f1: 89 e5 mov %esp,%ebp
10b1f3: 57 push %edi
10b1f4: 56 push %esi
10b1f5: 53 push %ebx
10b1f6: 83 ec 2c sub $0x2c,%esp
10b1f9: 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 ];
10b1fc: 8b 8b e8 00 00 00 mov 0xe8(%ebx),%ecx
option_set = (rtems_option) the_thread->Wait.option;
10b202: 8b 7b 30 mov 0x30(%ebx),%edi
_ISR_Disable( level );
10b205: 9c pushf
10b206: fa cli
10b207: 8f 45 d4 popl -0x2c(%ebp)
pending_events = api->pending_events;
10b20a: 8b 11 mov (%ecx),%edx
event_condition = (rtems_event_set) the_thread->Wait.count;
10b20c: 8b 43 24 mov 0x24(%ebx),%eax
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
10b20f: 89 c6 mov %eax,%esi
10b211: 21 d6 and %edx,%esi
10b213: 89 75 e4 mov %esi,-0x1c(%ebp)
10b216: 74 74 je 10b28c <_Event_Surrender+0x9c>
/*
* 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() &&
10b218: 8b 35 34 7b 12 00 mov 0x127b34,%esi
10b21e: 85 f6 test %esi,%esi
10b220: 74 0c je 10b22e <_Event_Surrender+0x3e>
10b222: 3b 1d 38 7b 12 00 cmp 0x127b38,%ebx
10b228: 0f 84 96 00 00 00 je 10b2c4 <_Event_Surrender+0xd4>
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
10b22e: f6 43 11 01 testb $0x1,0x11(%ebx)
10b232: 74 4c je 10b280 <_Event_Surrender+0x90>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
10b234: 3b 45 e4 cmp -0x1c(%ebp),%eax
10b237: 74 05 je 10b23e <_Event_Surrender+0x4e>
10b239: 83 e7 02 and $0x2,%edi
10b23c: 74 42 je 10b280 <_Event_Surrender+0x90> <== 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) );
10b23e: 8b 45 e4 mov -0x1c(%ebp),%eax
10b241: f7 d0 not %eax
10b243: 21 d0 and %edx,%eax
10b245: 89 01 mov %eax,(%ecx)
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
10b247: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
10b24e: 8b 43 28 mov 0x28(%ebx),%eax
10b251: 8b 75 e4 mov -0x1c(%ebp),%esi
10b254: 89 30 mov %esi,(%eax)
_ISR_Flash( level );
10b256: ff 75 d4 pushl -0x2c(%ebp)
10b259: 9d popf
10b25a: fa cli
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
10b25b: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
10b25f: 74 37 je 10b298 <_Event_Surrender+0xa8>
_ISR_Enable( level );
10b261: ff 75 d4 pushl -0x2c(%ebp)
10b264: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10b265: 83 ec 08 sub $0x8,%esp
10b268: 68 f8 ff 03 10 push $0x1003fff8
10b26d: 53 push %ebx
10b26e: e8 09 23 00 00 call 10d57c <_Thread_Clear_state>
10b273: 83 c4 10 add $0x10,%esp
}
return;
}
}
_ISR_Enable( level );
}
10b276: 8d 65 f4 lea -0xc(%ebp),%esp
10b279: 5b pop %ebx
10b27a: 5e pop %esi
10b27b: 5f pop %edi
10b27c: c9 leave
10b27d: c3 ret
10b27e: 66 90 xchg %ax,%ax
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
10b280: ff 75 d4 pushl -0x2c(%ebp)
10b283: 9d popf
}
10b284: 8d 65 f4 lea -0xc(%ebp),%esp
10b287: 5b pop %ebx
10b288: 5e pop %esi
10b289: 5f pop %edi
10b28a: c9 leave
10b28b: c3 ret
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
_ISR_Enable( level );
10b28c: ff 75 d4 pushl -0x2c(%ebp)
10b28f: 9d popf
}
return;
}
}
_ISR_Enable( level );
}
10b290: 8d 65 f4 lea -0xc(%ebp),%esp
10b293: 5b pop %ebx
10b294: 5e pop %esi
10b295: 5f pop %edi
10b296: c9 leave
10b297: c3 ret
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
10b298: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
10b29f: ff 75 d4 pushl -0x2c(%ebp)
10b2a2: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
10b2a3: 83 ec 0c sub $0xc,%esp
10b2a6: 8d 43 48 lea 0x48(%ebx),%eax
10b2a9: 50 push %eax
10b2aa: e8 89 35 00 00 call 10e838 <_Watchdog_Remove>
10b2af: 58 pop %eax
10b2b0: 5a pop %edx
10b2b1: 68 f8 ff 03 10 push $0x1003fff8
10b2b6: 53 push %ebx
10b2b7: e8 c0 22 00 00 call 10d57c <_Thread_Clear_state>
10b2bc: 83 c4 10 add $0x10,%esp
10b2bf: eb c3 jmp 10b284 <_Event_Surrender+0x94>
10b2c1: 8d 76 00 lea 0x0(%esi),%esi
* 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) ||
10b2c4: 8b 35 68 7f 12 00 mov 0x127f68,%esi
/*
* 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 ) &&
10b2ca: 83 fe 02 cmp $0x2,%esi
10b2cd: 74 0d je 10b2dc <_Event_Surrender+0xec> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
10b2cf: 8b 35 68 7f 12 00 mov 0x127f68,%esi
* 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) ||
10b2d5: 4e dec %esi
10b2d6: 0f 85 52 ff ff ff jne 10b22e <_Event_Surrender+0x3e>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
10b2dc: 3b 45 e4 cmp -0x1c(%ebp),%eax
10b2df: 74 05 je 10b2e6 <_Event_Surrender+0xf6>
10b2e1: 83 e7 02 and $0x2,%edi
10b2e4: 74 22 je 10b308 <_Event_Surrender+0x118><== NEVER TAKEN
10b2e6: 8b 45 e4 mov -0x1c(%ebp),%eax
10b2e9: f7 d0 not %eax
10b2eb: 21 d0 and %edx,%eax
10b2ed: 89 01 mov %eax,(%ecx)
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
10b2ef: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx)
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
10b2f6: 8b 43 28 mov 0x28(%ebx),%eax
10b2f9: 8b 55 e4 mov -0x1c(%ebp),%edx
10b2fc: 89 10 mov %edx,(%eax)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
10b2fe: c7 05 68 7f 12 00 03 movl $0x3,0x127f68
10b305: 00 00 00
}
_ISR_Enable( level );
10b308: ff 75 d4 pushl -0x2c(%ebp)
10b30b: 9d popf
return;
10b30c: e9 73 ff ff ff jmp 10b284 <_Event_Surrender+0x94>
0010b314 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
10b314: 55 push %ebp
10b315: 89 e5 mov %esp,%ebp
10b317: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
10b31a: 8d 45 f4 lea -0xc(%ebp),%eax
10b31d: 50 push %eax
10b31e: ff 75 08 pushl 0x8(%ebp)
10b321: e8 fa 25 00 00 call 10d920 <_Thread_Get>
switch ( location ) {
10b326: 83 c4 10 add $0x10,%esp
10b329: 8b 55 f4 mov -0xc(%ebp),%edx
10b32c: 85 d2 test %edx,%edx
10b32e: 75 37 jne 10b367 <_Event_Timeout+0x53> <== 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 );
10b330: 9c pushf
10b331: fa cli
10b332: 5a pop %edx
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
10b333: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
if ( _Thread_Is_executing( the_thread ) ) {
10b33a: 3b 05 38 7b 12 00 cmp 0x127b38,%eax
10b340: 74 2a je 10b36c <_Event_Timeout+0x58>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
10b342: c7 40 34 06 00 00 00 movl $0x6,0x34(%eax)
_ISR_Enable( level );
10b349: 52 push %edx
10b34a: 9d popf
10b34b: 83 ec 08 sub $0x8,%esp
10b34e: 68 f8 ff 03 10 push $0x1003fff8
10b353: 50 push %eax
10b354: e8 23 22 00 00 call 10d57c <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10b359: a1 50 75 12 00 mov 0x127550,%eax
10b35e: 48 dec %eax
10b35f: a3 50 75 12 00 mov %eax,0x127550
_Thread_Unblock( the_thread );
_Thread_Unnest_dispatch();
break;
10b364: 83 c4 10 add $0x10,%esp
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
10b367: c9 leave
10b368: c3 ret
10b369: 8d 76 00 lea 0x0(%esi),%esi
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
10b36c: 8b 0d 68 7f 12 00 mov 0x127f68,%ecx
10b372: 49 dec %ecx
10b373: 75 cd jne 10b342 <_Event_Timeout+0x2e>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
10b375: c7 05 68 7f 12 00 02 movl $0x2,0x127f68
10b37c: 00 00 00
10b37f: eb c1 jmp 10b342 <_Event_Timeout+0x2e>
001112ec <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
1112ec: 55 push %ebp
1112ed: 89 e5 mov %esp,%ebp
1112ef: 57 push %edi
1112f0: 56 push %esi
1112f1: 53 push %ebx
1112f2: 83 ec 2c sub $0x2c,%esp
1112f5: 8b 7d 0c mov 0xc(%ebp),%edi
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
1112f8: 8d 47 04 lea 0x4(%edi),%eax
1112fb: 89 45 dc mov %eax,-0x24(%ebp)
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
1112fe: 8b 55 08 mov 0x8(%ebp),%edx
111301: 8b 52 10 mov 0x10(%edx),%edx
111304: 89 55 cc mov %edx,-0x34(%ebp)
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
111307: 39 c7 cmp %eax,%edi
111309: 0f 87 69 01 00 00 ja 111478 <_Heap_Allocate_aligned_with_boundary+0x18c>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
11130f: 8b 5d 14 mov 0x14(%ebp),%ebx
111312: 85 db test %ebx,%ebx
111314: 0f 85 56 01 00 00 jne 111470 <_Heap_Allocate_aligned_with_boundary+0x184>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
11131a: 8b 45 08 mov 0x8(%ebp),%eax
11131d: 8b 48 08 mov 0x8(%eax),%ecx
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
111320: 39 c8 cmp %ecx,%eax
111322: 0f 84 50 01 00 00 je 111478 <_Heap_Allocate_aligned_with_boundary+0x18c>
111328: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%ebp)
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
11132f: 8b 55 cc mov -0x34(%ebp),%edx
111332: 83 c2 07 add $0x7,%edx
111335: 89 55 c8 mov %edx,-0x38(%ebp)
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
111338: c7 45 d0 04 00 00 00 movl $0x4,-0x30(%ebp)
11133f: 29 7d d0 sub %edi,-0x30(%ebp)
111342: eb 1e jmp 111362 <_Heap_Allocate_aligned_with_boundary+0x76>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
111344: 8d 59 08 lea 0x8(%ecx),%ebx
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
111347: 85 db test %ebx,%ebx
111349: 0f 85 f1 00 00 00 jne 111440 <_Heap_Allocate_aligned_with_boundary+0x154><== ALWAYS TAKEN
break;
}
block = block->next;
11134f: 8b 49 08 mov 0x8(%ecx),%ecx
111352: 8b 45 e4 mov -0x1c(%ebp),%eax
111355: 40 inc %eax
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
111356: 39 4d 08 cmp %ecx,0x8(%ebp)
111359: 0f 84 25 01 00 00 je 111484 <_Heap_Allocate_aligned_with_boundary+0x198>
11135f: 89 45 e4 mov %eax,-0x1c(%ebp)
/*
* The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag
* field. Thus the value is about one unit larger than the real block
* size. The greater than operator takes this into account.
*/
if ( block->size_and_flag > block_size_floor ) {
111362: 8b 59 04 mov 0x4(%ecx),%ebx
111365: 39 5d dc cmp %ebx,-0x24(%ebp)
111368: 73 e5 jae 11134f <_Heap_Allocate_aligned_with_boundary+0x63>
if ( alignment == 0 ) {
11136a: 8b 55 10 mov 0x10(%ebp),%edx
11136d: 85 d2 test %edx,%edx
11136f: 74 d3 je 111344 <_Heap_Allocate_aligned_with_boundary+0x58>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
111371: 8b 45 08 mov 0x8(%ebp),%eax
111374: 8b 40 14 mov 0x14(%eax),%eax
111377: 89 45 d8 mov %eax,-0x28(%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;
11137a: 83 e3 fe and $0xfffffffe,%ebx
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
11137d: 8d 1c 19 lea (%ecx,%ebx,1),%ebx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
111380: 8d 51 08 lea 0x8(%ecx),%edx
111383: 89 55 d4 mov %edx,-0x2c(%ebp)
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
111386: 8b 75 c8 mov -0x38(%ebp),%esi
111389: 29 c6 sub %eax,%esi
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
11138b: 01 de add %ebx,%esi
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
11138d: 03 5d d0 add -0x30(%ebp),%ebx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111390: 89 d8 mov %ebx,%eax
111392: 31 d2 xor %edx,%edx
111394: f7 75 10 divl 0x10(%ebp)
111397: 29 d3 sub %edx,%ebx
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
111399: 39 de cmp %ebx,%esi
11139b: 73 0b jae 1113a8 <_Heap_Allocate_aligned_with_boundary+0xbc>
11139d: 89 f0 mov %esi,%eax
11139f: 31 d2 xor %edx,%edx
1113a1: f7 75 10 divl 0x10(%ebp)
1113a4: 89 f3 mov %esi,%ebx
1113a6: 29 d3 sub %edx,%ebx
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
1113a8: 8b 45 14 mov 0x14(%ebp),%eax
1113ab: 85 c0 test %eax,%eax
1113ad: 74 5b je 11140a <_Heap_Allocate_aligned_with_boundary+0x11e>
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment );
}
alloc_end = alloc_begin + alloc_size;
1113af: 8d 34 3b lea (%ebx,%edi,1),%esi
1113b2: 89 f0 mov %esi,%eax
1113b4: 31 d2 xor %edx,%edx
1113b6: f7 75 14 divl 0x14(%ebp)
1113b9: 89 f0 mov %esi,%eax
1113bb: 29 d0 sub %edx,%eax
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
1113bd: 39 c3 cmp %eax,%ebx
1113bf: 73 49 jae 11140a <_Heap_Allocate_aligned_with_boundary+0x11e>
1113c1: 39 c6 cmp %eax,%esi
1113c3: 76 45 jbe 11140a <_Heap_Allocate_aligned_with_boundary+0x11e>
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
1113c5: 8b 55 d4 mov -0x2c(%ebp),%edx
1113c8: 01 fa add %edi,%edx
1113ca: 89 55 e0 mov %edx,-0x20(%ebp)
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
1113cd: 39 c2 cmp %eax,%edx
1113cf: 0f 87 7a ff ff ff ja 11134f <_Heap_Allocate_aligned_with_boundary+0x63>
1113d5: 89 ce mov %ecx,%esi
1113d7: eb 10 jmp 1113e9 <_Heap_Allocate_aligned_with_boundary+0xfd>
1113d9: 8d 76 00 lea 0x0(%esi),%esi
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
1113dc: 39 c1 cmp %eax,%ecx
1113de: 76 28 jbe 111408 <_Heap_Allocate_aligned_with_boundary+0x11c>
if ( boundary_line < boundary_floor ) {
1113e0: 39 45 e0 cmp %eax,-0x20(%ebp)
1113e3: 0f 87 9f 00 00 00 ja 111488 <_Heap_Allocate_aligned_with_boundary+0x19c><== NEVER TAKEN
return 0;
}
alloc_begin = boundary_line - alloc_size;
1113e9: 89 c3 mov %eax,%ebx
1113eb: 29 fb sub %edi,%ebx
1113ed: 89 d8 mov %ebx,%eax
1113ef: 31 d2 xor %edx,%edx
1113f1: f7 75 10 divl 0x10(%ebp)
1113f4: 29 d3 sub %edx,%ebx
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
1113f6: 8d 0c 3b lea (%ebx,%edi,1),%ecx
1113f9: 89 c8 mov %ecx,%eax
1113fb: 31 d2 xor %edx,%edx
1113fd: f7 75 14 divl 0x14(%ebp)
111400: 89 c8 mov %ecx,%eax
111402: 29 d0 sub %edx,%eax
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
111404: 39 c3 cmp %eax,%ebx
111406: 72 d4 jb 1113dc <_Heap_Allocate_aligned_with_boundary+0xf0>
111408: 89 f1 mov %esi,%ecx
boundary_line = _Heap_Align_down( alloc_end, boundary );
}
}
/* Ensure that the we have a valid new block at the beginning */
if ( alloc_begin >= alloc_begin_floor ) {
11140a: 39 5d d4 cmp %ebx,-0x2c(%ebp)
11140d: 0f 87 3c ff ff ff ja 11134f <_Heap_Allocate_aligned_with_boundary+0x63>
111413: be f8 ff ff ff mov $0xfffffff8,%esi
111418: 29 ce sub %ecx,%esi
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
11141a: 01 de add %ebx,%esi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
11141c: 89 d8 mov %ebx,%eax
11141e: 31 d2 xor %edx,%edx
111420: f7 75 cc divl -0x34(%ebp)
uintptr_t const alloc_block_begin =
(uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size );
uintptr_t const free_size = alloc_block_begin - block_begin;
111423: 29 d6 sub %edx,%esi
if ( free_size >= min_block_size || free_size == 0 ) {
111425: 39 75 d8 cmp %esi,-0x28(%ebp)
111428: 0f 86 19 ff ff ff jbe 111347 <_Heap_Allocate_aligned_with_boundary+0x5b>
11142e: 85 f6 test %esi,%esi
111430: 0f 85 19 ff ff ff jne 11134f <_Heap_Allocate_aligned_with_boundary+0x63>
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
111436: 85 db test %ebx,%ebx
111438: 0f 84 11 ff ff ff je 11134f <_Heap_Allocate_aligned_with_boundary+0x63><== NEVER TAKEN
11143e: 66 90 xchg %ax,%ax
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
111440: 8b 45 08 mov 0x8(%ebp),%eax
111443: ff 40 48 incl 0x48(%eax)
stats->searches += search_count;
111446: 8b 55 e4 mov -0x1c(%ebp),%edx
111449: 01 50 4c add %edx,0x4c(%eax)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
11144c: 57 push %edi
11144d: 53 push %ebx
11144e: 51 push %ecx
11144f: 50 push %eax
111450: e8 b7 b3 ff ff call 10c80c <_Heap_Block_allocate>
111455: 89 d8 mov %ebx,%eax
111457: 83 c4 10 add $0x10,%esp
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
11145a: 8b 55 e4 mov -0x1c(%ebp),%edx
11145d: 8b 4d 08 mov 0x8(%ebp),%ecx
111460: 39 51 44 cmp %edx,0x44(%ecx)
111463: 73 15 jae 11147a <_Heap_Allocate_aligned_with_boundary+0x18e>
stats->max_search = search_count;
111465: 89 51 44 mov %edx,0x44(%ecx)
}
return (void *) alloc_begin;
}
111468: 8d 65 f4 lea -0xc(%ebp),%esp
11146b: 5b pop %ebx
11146c: 5e pop %esi
11146d: 5f pop %edi
11146e: c9 leave
11146f: c3 ret
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
111470: 3b 7d 14 cmp 0x14(%ebp),%edi
111473: 76 1a jbe 11148f <_Heap_Allocate_aligned_with_boundary+0x1a3>
111475: 8d 76 00 lea 0x0(%esi),%esi
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
111478: 31 c0 xor %eax,%eax
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
11147a: 8d 65 f4 lea -0xc(%ebp),%esp
11147d: 5b pop %ebx
11147e: 5e pop %esi
11147f: 5f pop %edi
111480: c9 leave
111481: c3 ret
111482: 66 90 xchg %ax,%ax
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
111484: 31 c0 xor %eax,%eax
111486: eb d2 jmp 11145a <_Heap_Allocate_aligned_with_boundary+0x16e>
111488: 89 f1 mov %esi,%ecx <== NOT EXECUTED
11148a: e9 c0 fe ff ff jmp 11134f <_Heap_Allocate_aligned_with_boundary+0x63><== NOT EXECUTED
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
return NULL;
}
if ( alignment == 0 ) {
11148f: 8b 4d 10 mov 0x10(%ebp),%ecx
111492: 85 c9 test %ecx,%ecx
111494: 0f 85 80 fe ff ff jne 11131a <_Heap_Allocate_aligned_with_boundary+0x2e>
alignment = page_size;
11149a: 89 55 10 mov %edx,0x10(%ebp)
11149d: e9 78 fe ff ff jmp 11131a <_Heap_Allocate_aligned_with_boundary+0x2e>
00111880 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
111880: 55 push %ebp
111881: 89 e5 mov %esp,%ebp
111883: 57 push %edi
111884: 56 push %esi
111885: 53 push %ebx
111886: 83 ec 4c sub $0x4c,%esp
111889: 8b 5d 08 mov 0x8(%ebp),%ebx
11188c: 8b 4d 10 mov 0x10(%ebp),%ecx
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
11188f: 8b 43 20 mov 0x20(%ebx),%eax
111892: 89 45 d0 mov %eax,-0x30(%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;
111895: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
Heap_Block *extend_last_block = NULL;
11189c: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
uintptr_t const page_size = heap->page_size;
1118a3: 8b 53 10 mov 0x10(%ebx),%edx
1118a6: 89 55 d4 mov %edx,-0x2c(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
1118a9: 8b 43 14 mov 0x14(%ebx),%eax
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;
1118ac: 8b 73 30 mov 0x30(%ebx),%esi
1118af: 89 75 c0 mov %esi,-0x40(%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 ) {
1118b2: 8b 55 0c mov 0xc(%ebp),%edx
1118b5: 01 ca add %ecx,%edx
1118b7: 89 55 cc mov %edx,-0x34(%ebp)
1118ba: 73 0c jae 1118c8 <_Heap_Extend+0x48>
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
1118bc: 31 c0 xor %eax,%eax
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
1118be: 8d 65 f4 lea -0xc(%ebp),%esp
1118c1: 5b pop %ebx
1118c2: 5e pop %esi
1118c3: 5f pop %edi
1118c4: c9 leave
1118c5: c3 ret
1118c6: 66 90 xchg %ax,%ax
if ( extend_area_end < extend_area_begin ) {
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
1118c8: 83 ec 08 sub $0x8,%esp
1118cb: 8d 55 e0 lea -0x20(%ebp),%edx
1118ce: 52 push %edx
1118cf: 8d 55 e4 lea -0x1c(%ebp),%edx
1118d2: 52 push %edx
1118d3: 50 push %eax
1118d4: ff 75 d4 pushl -0x2c(%ebp)
1118d7: 51 push %ecx
1118d8: ff 75 0c pushl 0xc(%ebp)
1118db: e8 38 b1 ff ff call 10ca18 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
1118e0: 83 c4 20 add $0x20,%esp
1118e3: 84 c0 test %al,%al
1118e5: 74 d5 je 1118bc <_Heap_Extend+0x3c>
1118e7: 8b 7d d0 mov -0x30(%ebp),%edi
1118ea: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp)
1118f1: c7 45 b8 00 00 00 00 movl $0x0,-0x48(%ebp)
1118f8: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
1118ff: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
111906: 8b 75 cc mov -0x34(%ebp),%esi
111909: 89 5d b4 mov %ebx,-0x4c(%ebp)
11190c: eb 30 jmp 11193e <_Heap_Extend+0xbe>
11190e: 66 90 xchg %ax,%ax
return false;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
111910: 39 ce cmp %ecx,%esi
111912: 73 03 jae 111917 <_Heap_Extend+0x97>
111914: 89 7d b8 mov %edi,-0x48(%ebp)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111917: 8d 59 f8 lea -0x8(%ecx),%ebx
11191a: 89 c8 mov %ecx,%eax
11191c: 31 d2 xor %edx,%edx
11191e: f7 75 d4 divl -0x2c(%ebp)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
111921: 29 d3 sub %edx,%ebx
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
111923: 3b 4d 0c cmp 0xc(%ebp),%ecx
111926: 74 3c je 111964 <_Heap_Extend+0xe4>
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
111928: 39 4d 0c cmp %ecx,0xc(%ebp)
11192b: 76 03 jbe 111930 <_Heap_Extend+0xb0>
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 )
11192d: 89 5d bc mov %ebx,-0x44(%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;
111930: 8b 7b 04 mov 0x4(%ebx),%edi
111933: 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);
111936: 8d 3c 3b lea (%ebx,%edi,1),%edi
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
111939: 39 7d d0 cmp %edi,-0x30(%ebp)
11193c: 74 39 je 111977 <_Heap_Extend+0xf7>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
11193e: 3b 7d d0 cmp -0x30(%ebp),%edi
111941: 0f 84 35 01 00 00 je 111a7c <_Heap_Extend+0x1fc>
111947: 89 f8 mov %edi,%eax
uintptr_t const sub_area_end = start_block->prev_size;
111949: 8b 0f mov (%edi),%ecx
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
11194b: 39 4d 0c cmp %ecx,0xc(%ebp)
11194e: 73 08 jae 111958 <_Heap_Extend+0xd8>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
111950: 39 f0 cmp %esi,%eax
111952: 0f 82 64 ff ff ff jb 1118bc <_Heap_Extend+0x3c>
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
111958: 39 f0 cmp %esi,%eax
11195a: 75 b4 jne 111910 <_Heap_Extend+0x90>
11195c: 89 7d c4 mov %edi,-0x3c(%ebp)
11195f: eb b6 jmp 111917 <_Heap_Extend+0x97>
111961: 8d 76 00 lea 0x0(%esi),%esi
} else if ( extend_area_end < sub_area_end ) {
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
start_block->prev_size = extend_area_end;
111964: 89 37 mov %esi,(%edi)
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 )
111966: 89 5d c8 mov %ebx,-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;
111969: 8b 7b 04 mov 0x4(%ebx),%edi
11196c: 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);
11196f: 8d 3c 3b lea (%ebx,%edi,1),%edi
} else if ( sub_area_end < extend_area_begin ) {
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
111972: 39 7d d0 cmp %edi,-0x30(%ebp)
111975: 75 c7 jne 11193e <_Heap_Extend+0xbe> <== NEVER TAKEN
111977: 8b 5d b4 mov -0x4c(%ebp),%ebx
if ( extend_area_begin < heap->area_begin ) {
11197a: 8b 75 0c mov 0xc(%ebp),%esi
11197d: 3b 73 18 cmp 0x18(%ebx),%esi
111980: 0f 82 02 01 00 00 jb 111a88 <_Heap_Extend+0x208>
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
111986: 8b 45 cc mov -0x34(%ebp),%eax
111989: 3b 43 1c cmp 0x1c(%ebx),%eax
11198c: 76 03 jbe 111991 <_Heap_Extend+0x111> <== NEVER TAKEN
heap->area_end = extend_area_end;
11198e: 89 43 1c mov %eax,0x1c(%ebx)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
111991: 8b 55 e0 mov -0x20(%ebp),%edx
111994: 8b 45 e4 mov -0x1c(%ebp),%eax
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
111997: 89 d1 mov %edx,%ecx
111999: 29 c1 sub %eax,%ecx
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
11199b: 8b 75 cc mov -0x34(%ebp),%esi
11199e: 89 30 mov %esi,(%eax)
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
1119a0: 89 ce mov %ecx,%esi
1119a2: 83 ce 01 or $0x1,%esi
1119a5: 89 70 04 mov %esi,0x4(%eax)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
1119a8: 89 0a mov %ecx,(%edx)
extend_last_block->size_and_flag = 0;
1119aa: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx)
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
1119b1: 39 43 20 cmp %eax,0x20(%ebx)
1119b4: 0f 86 d6 00 00 00 jbe 111a90 <_Heap_Extend+0x210>
heap->first_block = extend_first_block;
1119ba: 89 43 20 mov %eax,0x20(%ebx)
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
1119bd: 8b 75 c4 mov -0x3c(%ebp),%esi
1119c0: 85 f6 test %esi,%esi
1119c2: 0f 84 04 01 00 00 je 111acc <_Heap_Extend+0x24c>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
1119c8: 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 );
1119cb: 8b 4d 0c mov 0xc(%ebp),%ecx
1119ce: 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;
1119d1: 89 c8 mov %ecx,%eax
1119d3: 31 d2 xor %edx,%edx
1119d5: f7 f6 div %esi
if ( remainder != 0 ) {
1119d7: 85 d2 test %edx,%edx
1119d9: 74 04 je 1119df <_Heap_Extend+0x15f> <== ALWAYS TAKEN
return value - remainder + alignment;
1119db: 01 f1 add %esi,%ecx <== NOT EXECUTED
1119dd: 29 d1 sub %edx,%ecx <== NOT EXECUTED
uintptr_t const new_first_block_begin =
1119df: 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;
1119e2: 8b 75 c4 mov -0x3c(%ebp),%esi
1119e5: 8b 06 mov (%esi),%eax
1119e7: 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 =
1119ea: 89 f0 mov %esi,%eax
1119ec: 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;
1119ee: 83 c8 01 or $0x1,%eax
1119f1: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, new_first_block );
1119f4: 89 d8 mov %ebx,%eax
1119f6: e8 69 fe ff ff call 111864 <_Heap_Free_block>
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
1119fb: 8b 45 c8 mov -0x38(%ebp),%eax
1119fe: 85 c0 test %eax,%eax
111a00: 0f 84 9e 00 00 00 je 111aa4 <_Heap_Extend+0x224>
)
{
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,
111a06: 8b 4d cc mov -0x34(%ebp),%ecx
111a09: 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(
111a0c: 2b 4d c8 sub -0x38(%ebp),%ecx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111a0f: 89 c8 mov %ecx,%eax
111a11: 31 d2 xor %edx,%edx
111a13: f7 73 10 divl 0x10(%ebx)
111a16: 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)
111a18: 8b 55 c8 mov -0x38(%ebp),%edx
111a1b: 8b 42 04 mov 0x4(%edx),%eax
111a1e: 29 c8 sub %ecx,%eax
| HEAP_PREV_BLOCK_USED;
111a20: 83 c8 01 or $0x1,%eax
111a23: 89 44 11 04 mov %eax,0x4(%ecx,%edx,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;
111a27: 8b 42 04 mov 0x4(%edx),%eax
111a2a: 83 e0 01 and $0x1,%eax
block->size_and_flag = size | flag;
111a2d: 09 c8 or %ecx,%eax
111a2f: 89 42 04 mov %eax,0x4(%edx)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
111a32: 89 d8 mov %ebx,%eax
111a34: e8 2b fe ff ff call 111864 <_Heap_Free_block>
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
111a39: 8b 75 c4 mov -0x3c(%ebp),%esi
111a3c: 85 f6 test %esi,%esi
111a3e: 0f 84 a4 00 00 00 je 111ae8 <_Heap_Extend+0x268>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
111a44: 8b 53 24 mov 0x24(%ebx),%edx
* 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(
111a47: 8b 43 20 mov 0x20(%ebx),%eax
111a4a: 29 d0 sub %edx,%eax
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;
111a4c: 8b 4a 04 mov 0x4(%edx),%ecx
111a4f: 83 e1 01 and $0x1,%ecx
block->size_and_flag = size | flag;
111a52: 09 c8 or %ecx,%eax
111a54: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
111a57: 8b 43 30 mov 0x30(%ebx),%eax
111a5a: 2b 45 c0 sub -0x40(%ebp),%eax
/* Statistics */
stats->size += extended_size;
111a5d: 01 43 2c add %eax,0x2c(%ebx)
if ( extended_size_ptr != NULL )
111a60: 8b 55 14 mov 0x14(%ebp),%edx
111a63: 85 d2 test %edx,%edx
111a65: 0f 84 99 00 00 00 je 111b04 <_Heap_Extend+0x284> <== NEVER TAKEN
*extended_size_ptr = extended_size;
111a6b: 8b 55 14 mov 0x14(%ebp),%edx
111a6e: 89 02 mov %eax,(%edx)
return true;
111a70: b0 01 mov $0x1,%al
}
111a72: 8d 65 f4 lea -0xc(%ebp),%esp
111a75: 5b pop %ebx
111a76: 5e pop %esi
111a77: 5f pop %edi
111a78: c9 leave
111a79: c3 ret
111a7a: 66 90 xchg %ax,%ax
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
111a7c: 8b 55 b4 mov -0x4c(%ebp),%edx
111a7f: 8b 42 18 mov 0x18(%edx),%eax
111a82: e9 c2 fe ff ff jmp 111949 <_Heap_Extend+0xc9>
111a87: 90 nop
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
if ( extend_area_begin < heap->area_begin ) {
heap->area_begin = extend_area_begin;
111a88: 89 73 18 mov %esi,0x18(%ebx)
111a8b: e9 01 ff ff ff jmp 111991 <_Heap_Extend+0x111>
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
111a90: 39 53 24 cmp %edx,0x24(%ebx)
111a93: 0f 83 24 ff ff ff jae 1119bd <_Heap_Extend+0x13d>
heap->last_block = extend_last_block;
111a99: 89 53 24 mov %edx,0x24(%ebx)
111a9c: e9 1c ff ff ff jmp 1119bd <_Heap_Extend+0x13d>
111aa1: 8d 76 00 lea 0x0(%esi),%esi
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
111aa4: 8b 7d bc mov -0x44(%ebp),%edi
111aa7: 85 ff test %edi,%edi
111aa9: 74 8e je 111a39 <_Heap_Extend+0x1b9>
_Heap_Link_above(
111aab: 8b 4d e0 mov -0x20(%ebp),%ecx
)
{
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 );
111aae: 8b 45 e4 mov -0x1c(%ebp),%eax
111ab1: 2b 45 bc sub -0x44(%ebp),%eax
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;
111ab4: 8b 75 bc mov -0x44(%ebp),%esi
111ab7: 8b 56 04 mov 0x4(%esi),%edx
111aba: 83 e2 01 and $0x1,%edx
block->size_and_flag = size | flag;
111abd: 09 d0 or %edx,%eax
111abf: 89 46 04 mov %eax,0x4(%esi)
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
111ac2: 83 49 04 01 orl $0x1,0x4(%ecx)
111ac6: e9 6e ff ff ff jmp 111a39 <_Heap_Extend+0x1b9>
111acb: 90 nop
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 ) {
111acc: 8b 4d b8 mov -0x48(%ebp),%ecx
111acf: 85 c9 test %ecx,%ecx
111ad1: 0f 84 24 ff ff ff je 1119fb <_Heap_Extend+0x17b>
{
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;
111ad7: 8b 45 b8 mov -0x48(%ebp),%eax
111ada: 29 d0 sub %edx,%eax
111adc: 83 c8 01 or $0x1,%eax
111adf: 89 42 04 mov %eax,0x4(%edx)
111ae2: e9 14 ff ff ff jmp 1119fb <_Heap_Extend+0x17b>
111ae7: 90 nop
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
111ae8: 8b 4d c8 mov -0x38(%ebp),%ecx
111aeb: 85 c9 test %ecx,%ecx
111aed: 0f 85 51 ff ff ff jne 111a44 <_Heap_Extend+0x1c4>
_Heap_Free_block( heap, extend_first_block );
111af3: 8b 55 e4 mov -0x1c(%ebp),%edx
111af6: 89 d8 mov %ebx,%eax
111af8: e8 67 fd ff ff call 111864 <_Heap_Free_block>
111afd: e9 42 ff ff ff jmp 111a44 <_Heap_Extend+0x1c4>
111b02: 66 90 xchg %ax,%ax
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
111b04: b0 01 mov $0x1,%al <== NOT EXECUTED
111b06: e9 b3 fd ff ff jmp 1118be <_Heap_Extend+0x3e> <== NOT EXECUTED
001114a4 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
1114a4: 55 push %ebp
1114a5: 89 e5 mov %esp,%ebp
1114a7: 57 push %edi
1114a8: 56 push %esi
1114a9: 53 push %ebx
1114aa: 83 ec 10 sub $0x10,%esp
1114ad: 8b 5d 08 mov 0x8(%ebp),%ebx
1114b0: 8b 45 0c mov 0xc(%ebp),%eax
1114b3: 8d 48 f8 lea -0x8(%eax),%ecx
1114b6: 31 d2 xor %edx,%edx
1114b8: 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);
1114bb: 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
1114bd: 8b 43 20 mov 0x20(%ebx),%eax
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
1114c0: 39 c1 cmp %eax,%ecx
1114c2: 72 07 jb 1114cb <_Heap_Free+0x27>
1114c4: 8b 73 24 mov 0x24(%ebx),%esi
1114c7: 39 f1 cmp %esi,%ecx
1114c9: 76 0d jbe 1114d8 <_Heap_Free+0x34>
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
_HAssert( false );
return( false );
1114cb: 31 c0 xor %eax,%eax
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
1114cd: 83 c4 10 add $0x10,%esp
1114d0: 5b pop %ebx
1114d1: 5e pop %esi
1114d2: 5f pop %edi
1114d3: c9 leave
1114d4: c3 ret
1114d5: 8d 76 00 lea 0x0(%esi),%esi
1114d8: 8b 51 04 mov 0x4(%ecx),%edx
1114db: 89 55 f0 mov %edx,-0x10(%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;
1114de: 83 e2 fe and $0xfffffffe,%edx
1114e1: 89 55 ec mov %edx,-0x14(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
1114e4: 8d 14 11 lea (%ecx,%edx,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;
1114e7: 39 d0 cmp %edx,%eax
1114e9: 77 e0 ja 1114cb <_Heap_Free+0x27> <== NEVER TAKEN
1114eb: 39 d6 cmp %edx,%esi
1114ed: 72 dc jb 1114cb <_Heap_Free+0x27> <== NEVER TAKEN
1114ef: 8b 7a 04 mov 0x4(%edx),%edi
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
_HAssert( false );
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
1114f2: f7 c7 01 00 00 00 test $0x1,%edi
1114f8: 74 d1 je 1114cb <_Heap_Free+0x27> <== 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;
1114fa: 83 e7 fe and $0xfffffffe,%edi
1114fd: 89 7d e4 mov %edi,-0x1c(%ebp)
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
111500: 39 d6 cmp %edx,%esi
111502: 0f 84 c8 00 00 00 je 1115d0 <_Heap_Free+0x12c>
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
111508: f6 44 3a 04 01 testb $0x1,0x4(%edx,%edi,1)
11150d: 0f 94 45 eb sete -0x15(%ebp)
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
111511: f6 45 f0 01 testb $0x1,-0x10(%ebp)
111515: 75 45 jne 11155c <_Heap_Free+0xb8>
uintptr_t const prev_size = block->prev_size;
111517: 8b 39 mov (%ecx),%edi
111519: 89 7d f0 mov %edi,-0x10(%ebp)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
11151c: 29 f9 sub %edi,%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;
11151e: 39 c8 cmp %ecx,%eax
111520: 77 a9 ja 1114cb <_Heap_Free+0x27> <== NEVER TAKEN
111522: 39 ce cmp %ecx,%esi
111524: 72 a5 jb 1114cb <_Heap_Free+0x27> <== 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) ) {
111526: f6 41 04 01 testb $0x1,0x4(%ecx)
11152a: 74 9f je 1114cb <_Heap_Free+0x27> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
11152c: 80 7d eb 00 cmpb $0x0,-0x15(%ebp)
111530: 0f 84 a6 00 00 00 je 1115dc <_Heap_Free+0x138>
uintptr_t const size = block_size + prev_size + next_block_size;
111536: 8b 7d e4 mov -0x1c(%ebp),%edi
111539: 03 7d ec add -0x14(%ebp),%edi
11153c: 03 7d f0 add -0x10(%ebp),%edi
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
11153f: 8b 42 08 mov 0x8(%edx),%eax
111542: 8b 52 0c mov 0xc(%edx),%edx
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
111545: 89 42 08 mov %eax,0x8(%edx)
next->prev = prev;
111548: 89 50 0c mov %edx,0xc(%eax)
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
11154b: ff 4b 38 decl 0x38(%ebx)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
11154e: 89 f8 mov %edi,%eax
111550: 83 c8 01 or $0x1,%eax
111553: 89 41 04 mov %eax,0x4(%ecx)
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
111556: 89 3c 39 mov %edi,(%ecx,%edi,1)
111559: eb 2a jmp 111585 <_Heap_Free+0xe1>
11155b: 90 nop
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
11155c: 80 7d eb 00 cmpb $0x0,-0x15(%ebp)
111560: 74 3a je 11159c <_Heap_Free+0xf8>
uintptr_t const size = block_size + next_block_size;
111562: 8b 7d e4 mov -0x1c(%ebp),%edi
111565: 03 7d ec add -0x14(%ebp),%edi
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
111568: 8b 42 08 mov 0x8(%edx),%eax
11156b: 8b 52 0c mov 0xc(%edx),%edx
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
11156e: 89 41 08 mov %eax,0x8(%ecx)
new_block->prev = prev;
111571: 89 51 0c mov %edx,0xc(%ecx)
next->prev = new_block;
111574: 89 48 0c mov %ecx,0xc(%eax)
prev->next = new_block;
111577: 89 4a 08 mov %ecx,0x8(%edx)
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
11157a: 89 f8 mov %edi,%eax
11157c: 83 c8 01 or $0x1,%eax
11157f: 89 41 04 mov %eax,0x4(%ecx)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
111582: 89 3c 39 mov %edi,(%ecx,%edi,1)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
111585: ff 4b 40 decl 0x40(%ebx)
++stats->frees;
111588: ff 43 50 incl 0x50(%ebx)
stats->free_size += block_size;
11158b: 8b 55 ec mov -0x14(%ebp),%edx
11158e: 01 53 30 add %edx,0x30(%ebx)
return( true );
111591: b0 01 mov $0x1,%al
}
111593: 83 c4 10 add $0x10,%esp
111596: 5b pop %ebx
111597: 5e pop %esi
111598: 5f pop %edi
111599: c9 leave
11159a: c3 ret
11159b: 90 nop
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
11159c: 8b 43 08 mov 0x8(%ebx),%eax
new_block->next = next;
11159f: 89 41 08 mov %eax,0x8(%ecx)
new_block->prev = block_before;
1115a2: 89 59 0c mov %ebx,0xc(%ecx)
block_before->next = new_block;
1115a5: 89 4b 08 mov %ecx,0x8(%ebx)
next->prev = new_block;
1115a8: 89 48 0c mov %ecx,0xc(%eax)
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
1115ab: 8b 45 ec mov -0x14(%ebp),%eax
1115ae: 83 c8 01 or $0x1,%eax
1115b1: 89 41 04 mov %eax,0x4(%ecx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
1115b4: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = block_size;
1115b8: 8b 45 ec mov -0x14(%ebp),%eax
1115bb: 89 02 mov %eax,(%edx)
/* Statistics */
++stats->free_blocks;
1115bd: 8b 43 38 mov 0x38(%ebx),%eax
1115c0: 40 inc %eax
1115c1: 89 43 38 mov %eax,0x38(%ebx)
if ( stats->max_free_blocks < stats->free_blocks ) {
1115c4: 3b 43 3c cmp 0x3c(%ebx),%eax
1115c7: 76 bc jbe 111585 <_Heap_Free+0xe1>
stats->max_free_blocks = stats->free_blocks;
1115c9: 89 43 3c mov %eax,0x3c(%ebx)
1115cc: eb b7 jmp 111585 <_Heap_Free+0xe1>
1115ce: 66 90 xchg %ax,%ax
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
1115d0: c6 45 eb 00 movb $0x0,-0x15(%ebp)
1115d4: e9 38 ff ff ff jmp 111511 <_Heap_Free+0x6d>
1115d9: 8d 76 00 lea 0x0(%esi),%esi
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
1115dc: 8b 45 ec mov -0x14(%ebp),%eax
1115df: 03 45 f0 add -0x10(%ebp),%eax
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
1115e2: 89 c6 mov %eax,%esi
1115e4: 83 ce 01 or $0x1,%esi
1115e7: 89 71 04 mov %esi,0x4(%ecx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
1115ea: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = size;
1115ee: 89 02 mov %eax,(%edx)
1115f0: eb 93 jmp 111585 <_Heap_Free+0xe1>
0010c69c <_Heap_Get_first_and_last_block>:
uintptr_t page_size,
uintptr_t min_block_size,
Heap_Block **first_block_ptr,
Heap_Block **last_block_ptr
)
{
10c69c: 55 push %ebp
10c69d: 89 e5 mov %esp,%ebp
10c69f: 57 push %edi
10c6a0: 56 push %esi
10c6a1: 53 push %ebx
10c6a2: 8b 5d 08 mov 0x8(%ebp),%ebx
10c6a5: 8b 7d 0c mov 0xc(%ebp),%edi
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
10c6a8: 8d 34 1f lea (%edi,%ebx,1),%esi
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
10c6ab: 8d 4b 08 lea 0x8(%ebx),%ecx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
10c6ae: 89 c8 mov %ecx,%eax
10c6b0: 31 d2 xor %edx,%edx
10c6b2: f7 75 10 divl 0x10(%ebp)
if ( remainder != 0 ) {
10c6b5: 85 d2 test %edx,%edx
10c6b7: 74 05 je 10c6be <_Heap_Get_first_and_last_block+0x22>
return value - remainder + alignment;
10c6b9: 03 4d 10 add 0x10(%ebp),%ecx
10c6bc: 29 d1 sub %edx,%ecx
_Heap_Align_down( heap_area_size - overhead, page_size );
Heap_Block *const first_block = (Heap_Block *) first_block_begin;
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
10c6be: 39 f3 cmp %esi,%ebx
10c6c0: 77 2e ja 10c6f0 <_Heap_Get_first_and_last_block+0x54>
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin);
10c6c2: 8d 71 f8 lea -0x8(%ecx),%esi
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
10c6c5: 29 d9 sub %ebx,%ecx
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
10c6c7: 39 cf cmp %ecx,%edi
10c6c9: 76 25 jbe 10c6f0 <_Heap_Get_first_and_last_block+0x54>
uintptr_t const first_block_begin =
alloc_area_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const overhead =
HEAP_BLOCK_HEADER_SIZE + (first_block_begin - heap_area_begin);
uintptr_t const first_block_size =
_Heap_Align_down( heap_area_size - overhead, page_size );
10c6cb: 29 cf sub %ecx,%edi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10c6cd: 89 f8 mov %edi,%eax
10c6cf: 31 d2 xor %edx,%edx
10c6d1: f7 75 10 divl 0x10(%ebp)
10c6d4: 29 d7 sub %edx,%edi
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
|| first_block_size < min_block_size
10c6d6: 39 7d 14 cmp %edi,0x14(%ebp)
10c6d9: 77 15 ja 10c6f0 <_Heap_Get_first_and_last_block+0x54>
) {
/* Invalid area or area too small */
return false;
}
*first_block_ptr = first_block;
10c6db: 8b 45 18 mov 0x18(%ebp),%eax
10c6de: 89 30 mov %esi,(%eax)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
10c6e0: 01 f7 add %esi,%edi
10c6e2: 8b 45 1c mov 0x1c(%ebp),%eax
10c6e5: 89 38 mov %edi,(%eax)
*last_block_ptr = last_block;
return true;
10c6e7: b0 01 mov $0x1,%al
}
10c6e9: 5b pop %ebx
10c6ea: 5e pop %esi
10c6eb: 5f pop %edi
10c6ec: c9 leave
10c6ed: c3 ret
10c6ee: 66 90 xchg %ax,%ax
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
|| first_block_size < min_block_size
) {
/* Invalid area or area too small */
return false;
10c6f0: 31 c0 xor %eax,%eax
*first_block_ptr = first_block;
*last_block_ptr = last_block;
return true;
}
10c6f2: 5b pop %ebx
10c6f3: 5e pop %esi
10c6f4: 5f pop %edi
10c6f5: c9 leave
10c6f6: c3 ret
0011517c <_Heap_Get_free_information>:
void _Heap_Get_free_information(
Heap_Control *the_heap,
Heap_Information *info
)
{
11517c: 55 push %ebp
11517d: 89 e5 mov %esp,%ebp
11517f: 57 push %edi
115180: 56 push %esi
115181: 53 push %ebx
115182: 8b 7d 0c mov 0xc(%ebp),%edi
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
115185: c7 07 00 00 00 00 movl $0x0,(%edi)
info->largest = 0;
11518b: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
info->total = 0;
115192: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
}
}
115199: 8b 45 08 mov 0x8(%ebp),%eax
11519c: 8b 50 08 mov 0x8(%eax),%edx
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
11519f: 39 d0 cmp %edx,%eax
1151a1: 74 31 je 1151d4 <_Heap_Get_free_information+0x58>
1151a3: bb 01 00 00 00 mov $0x1,%ebx
1151a8: 31 f6 xor %esi,%esi
1151aa: 31 c9 xor %ecx,%ecx
1151ac: eb 07 jmp 1151b5 <_Heap_Get_free_information+0x39>
1151ae: 66 90 xchg %ax,%ax
1151b0: 8b 77 04 mov 0x4(%edi),%esi
1151b3: 89 c3 mov %eax,%ebx
- 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;
1151b5: 8b 42 04 mov 0x4(%edx),%eax
1151b8: 83 e0 fe and $0xfffffffe,%eax
/* As we always coalesce free blocks, prev block must have been used. */
_HAssert(_Heap_Is_prev_used(the_block));
info->number++;
info->total += the_size;
1151bb: 01 c1 add %eax,%ecx
if ( info->largest < the_size )
1151bd: 39 f0 cmp %esi,%eax
1151bf: 76 03 jbe 1151c4 <_Heap_Get_free_information+0x48>
info->largest = the_size;
1151c1: 89 47 04 mov %eax,0x4(%edi)
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
the_block != tail;
the_block = the_block->next)
1151c4: 8b 52 08 mov 0x8(%edx),%edx
1151c7: 8d 43 01 lea 0x1(%ebx),%eax
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
1151ca: 39 55 08 cmp %edx,0x8(%ebp)
1151cd: 75 e1 jne 1151b0 <_Heap_Get_free_information+0x34>
1151cf: 89 1f mov %ebx,(%edi)
1151d1: 89 4f 08 mov %ecx,0x8(%edi)
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
}
}
1151d4: 5b pop %ebx
1151d5: 5e pop %esi
1151d6: 5f pop %edi
1151d7: c9 leave
1151d8: c3 ret
0011201c <_Heap_Get_information>:
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
11201c: 55 push %ebp
11201d: 89 e5 mov %esp,%ebp
11201f: 57 push %edi
112020: 56 push %esi
112021: 53 push %ebx
112022: 8b 45 08 mov 0x8(%ebp),%eax
112025: 8b 5d 0c mov 0xc(%ebp),%ebx
Heap_Block *the_block = the_heap->first_block;
112028: 8b 50 20 mov 0x20(%eax),%edx
Heap_Block *const end = the_heap->last_block;
11202b: 8b 70 24 mov 0x24(%eax),%esi
memset(the_info, 0, sizeof(*the_info));
11202e: b9 18 00 00 00 mov $0x18,%ecx
112033: 31 c0 xor %eax,%eax
112035: 89 df mov %ebx,%edi
112037: f3 aa rep stos %al,%es:(%edi)
while ( the_block != end ) {
112039: 39 f2 cmp %esi,%edx
11203b: 74 33 je 112070 <_Heap_Get_information+0x54><== NEVER TAKEN
11203d: 8b 7a 04 mov 0x4(%edx),%edi
112040: eb 16 jmp 112058 <_Heap_Get_information+0x3c>
112042: 66 90 xchg %ax,%ax
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
112044: 8d 43 0c lea 0xc(%ebx),%eax
else
info = &the_info->Free;
info->number++;
112047: ff 00 incl (%eax)
info->total += the_size;
112049: 01 48 08 add %ecx,0x8(%eax)
if ( info->largest < the_size )
11204c: 39 48 04 cmp %ecx,0x4(%eax)
11204f: 73 03 jae 112054 <_Heap_Get_information+0x38>
info->largest = the_size;
112051: 89 48 04 mov %ecx,0x4(%eax)
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
112054: 39 d6 cmp %edx,%esi
112056: 74 18 je 112070 <_Heap_Get_information+0x54>
- 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;
112058: 89 f9 mov %edi,%ecx
11205a: 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);
11205d: 01 ca add %ecx,%edx
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
11205f: 8b 7a 04 mov 0x4(%edx),%edi
while ( the_block != end ) {
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
112062: f7 c7 01 00 00 00 test $0x1,%edi
112068: 75 da jne 112044 <_Heap_Get_information+0x28>
info = &the_info->Used;
else
info = &the_info->Free;
11206a: 89 d8 mov %ebx,%eax
11206c: eb d9 jmp 112047 <_Heap_Get_information+0x2b>
11206e: 66 90 xchg %ax,%ax
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
112070: 5b pop %ebx
112071: 5e pop %esi
112072: 5f pop %edi
112073: c9 leave
112074: c3 ret
0011ed24 <_Heap_Resize_block>:
void *alloc_begin_ptr,
uintptr_t new_alloc_size,
uintptr_t *old_size,
uintptr_t *new_size
)
{
11ed24: 55 push %ebp
11ed25: 89 e5 mov %esp,%ebp
11ed27: 57 push %edi
11ed28: 56 push %esi
11ed29: 53 push %ebx
11ed2a: 83 ec 2c sub $0x2c,%esp
11ed2d: 8b 5d 08 mov 0x8(%ebp),%ebx
11ed30: 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);
11ed33: 8d 4e f8 lea -0x8(%esi),%ecx
11ed36: 89 f0 mov %esi,%eax
11ed38: 31 d2 xor %edx,%edx
11ed3a: 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);
11ed3d: 29 d1 sub %edx,%ecx
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *const block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
*old_size = 0;
11ed3f: 8b 45 14 mov 0x14(%ebp),%eax
11ed42: c7 00 00 00 00 00 movl $0x0,(%eax)
*new_size = 0;
11ed48: 8b 55 18 mov 0x18(%ebp),%edx
11ed4b: c7 02 00 00 00 00 movl $0x0,(%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;
11ed51: 39 4b 20 cmp %ecx,0x20(%ebx)
11ed54: 77 05 ja 11ed5b <_Heap_Resize_block+0x37>
11ed56: 39 4b 24 cmp %ecx,0x24(%ebx)
11ed59: 73 0d jae 11ed68 <_Heap_Resize_block+0x44>
new_alloc_size,
old_size,
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
11ed5b: b8 02 00 00 00 mov $0x2,%eax
}
}
11ed60: 8d 65 f4 lea -0xc(%ebp),%esp
11ed63: 5b pop %ebx
11ed64: 5e pop %esi
11ed65: 5f pop %edi
11ed66: c9 leave
11ed67: c3 ret
- 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;
11ed68: 8b 41 04 mov 0x4(%ecx),%eax
11ed6b: 83 e0 fe and $0xfffffffe,%eax
{
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t block_size = _Heap_Block_size( block );
uintptr_t block_end = block_begin + block_size;
11ed6e: 8d 3c 01 lea (%ecx,%eax,1),%edi
11ed71: 89 7d d4 mov %edi,-0x2c(%ebp)
uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS;
11ed74: 89 fa mov %edi,%edx
11ed76: 29 f2 sub %esi,%edx
11ed78: 83 c2 04 add $0x4,%edx
11ed7b: 89 55 e0 mov %edx,-0x20(%ebp)
11ed7e: 8b 57 04 mov 0x4(%edi),%edx
11ed81: 83 e2 fe and $0xfffffffe,%edx
11ed84: 89 55 d0 mov %edx,-0x30(%ebp)
RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
const Heap_Block *block
)
{
return !_Heap_Is_used( block );
11ed87: f6 44 17 04 01 testb $0x1,0x4(%edi,%edx,1)
11ed8c: 0f 94 45 df sete -0x21(%ebp)
bool next_block_is_free = _Heap_Is_free( next_block );;
_HAssert( _Heap_Is_block_in_heap( heap, next_block ) );
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
11ed90: 8b 55 e0 mov -0x20(%ebp),%edx
11ed93: 8b 7d 14 mov 0x14(%ebp),%edi
11ed96: 89 17 mov %edx,(%edi)
if ( next_block_is_free ) {
11ed98: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
11ed9c: 75 6e jne 11ee0c <_Heap_Resize_block+0xe8>
block_size += next_block_size;
alloc_size += next_block_size;
}
if ( new_alloc_size > alloc_size ) {
11ed9e: 8b 55 e0 mov -0x20(%ebp),%edx
11eda1: 39 55 10 cmp %edx,0x10(%ebp)
11eda4: 77 79 ja 11ee1f <_Heap_Resize_block+0xfb>
return HEAP_RESIZE_UNSATISFIED;
}
if ( next_block_is_free ) {
11eda6: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
11edaa: 74 31 je 11eddd <_Heap_Resize_block+0xb9>
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;
11edac: 8b 79 04 mov 0x4(%ecx),%edi
11edaf: 83 e7 01 and $0x1,%edi
block->size_and_flag = size | flag;
11edb2: 09 c7 or %eax,%edi
11edb4: 89 79 04 mov %edi,0x4(%ecx)
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11edb7: 8b 7d d4 mov -0x2c(%ebp),%edi
11edba: 8b 7f 08 mov 0x8(%edi),%edi
11edbd: 89 7d e4 mov %edi,-0x1c(%ebp)
11edc0: 8b 55 d4 mov -0x2c(%ebp),%edx
11edc3: 8b 7a 0c mov 0xc(%edx),%edi
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
11edc6: 8b 55 e4 mov -0x1c(%ebp),%edx
11edc9: 89 57 08 mov %edx,0x8(%edi)
next->prev = prev;
11edcc: 89 7a 0c mov %edi,0xc(%edx)
_Heap_Block_set_size( block, block_size );
_Heap_Free_list_remove( next_block );
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
11edcf: 83 4c 01 04 01 orl $0x1,0x4(%ecx,%eax,1)
/* Statistics */
--stats->free_blocks;
11edd4: ff 4b 38 decl 0x38(%ebx)
stats->free_size -= next_block_size;
11edd7: 8b 7d d0 mov -0x30(%ebp),%edi
11edda: 29 7b 30 sub %edi,0x30(%ebx)
}
block = _Heap_Block_allocate( heap, block, alloc_begin, new_alloc_size );
11eddd: ff 75 10 pushl 0x10(%ebp)
11ede0: 56 push %esi
11ede1: 51 push %ecx
11ede2: 53 push %ebx
11ede3: e8 24 da fe ff call 10c80c <_Heap_Block_allocate>
- 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;
11ede8: 8b 50 04 mov 0x4(%eax),%edx
11edeb: 83 e2 fe and $0xfffffffe,%edx
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
*new_size = (uintptr_t) next_block - alloc_begin + HEAP_ALLOC_BONUS;
11edee: 29 f0 sub %esi,%eax
11edf0: 8d 44 10 04 lea 0x4(%eax,%edx,1),%eax
11edf4: 8b 55 18 mov 0x18(%ebp),%edx
11edf7: 89 02 mov %eax,(%edx)
/* Statistics */
++stats->resizes;
11edf9: ff 43 54 incl 0x54(%ebx)
11edfc: 83 c4 10 add $0x10,%esp
return HEAP_RESIZE_SUCCESSFUL;
11edff: 31 c0 xor %eax,%eax
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11ee01: 8d 65 f4 lea -0xc(%ebp),%esp
11ee04: 5b pop %ebx
11ee05: 5e pop %esi
11ee06: 5f pop %edi
11ee07: c9 leave
11ee08: c3 ret
11ee09: 8d 76 00 lea 0x0(%esi),%esi
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
if ( next_block_is_free ) {
block_size += next_block_size;
11ee0c: 03 45 d0 add -0x30(%ebp),%eax
alloc_size += next_block_size;
11ee0f: 8b 7d d0 mov -0x30(%ebp),%edi
11ee12: 01 fa add %edi,%edx
11ee14: 89 55 e0 mov %edx,-0x20(%ebp)
}
if ( new_alloc_size > alloc_size ) {
11ee17: 8b 55 e0 mov -0x20(%ebp),%edx
11ee1a: 39 55 10 cmp %edx,0x10(%ebp)
11ee1d: 76 87 jbe 11eda6 <_Heap_Resize_block+0x82>
return HEAP_RESIZE_UNSATISFIED;
11ee1f: b8 01 00 00 00 mov $0x1,%eax
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11ee24: 8d 65 f4 lea -0xc(%ebp),%esp
11ee27: 5b pop %ebx
11ee28: 5e pop %esi
11ee29: 5f pop %edi
11ee2a: c9 leave
11ee2b: c3 ret
0011ee2c <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
11ee2c: 55 push %ebp
11ee2d: 89 e5 mov %esp,%ebp
11ee2f: 56 push %esi
11ee30: 53 push %ebx
11ee31: 8b 5d 08 mov 0x8(%ebp),%ebx
11ee34: 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);
11ee37: 8d 4e f8 lea -0x8(%esi),%ecx
11ee3a: 89 f0 mov %esi,%eax
11ee3c: 31 d2 xor %edx,%edx
11ee3e: 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);
11ee41: 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
11ee43: 8b 43 20 mov 0x20(%ebx),%eax
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
11ee46: 39 c1 cmp %eax,%ecx
11ee48: 72 07 jb 11ee51 <_Heap_Size_of_alloc_area+0x25>
11ee4a: 8b 53 24 mov 0x24(%ebx),%edx
11ee4d: 39 d1 cmp %edx,%ecx
11ee4f: 76 07 jbe 11ee58 <_Heap_Size_of_alloc_area+0x2c><== ALWAYS TAKEN
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
11ee51: 31 c0 xor %eax,%eax
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
11ee53: 5b pop %ebx
11ee54: 5e pop %esi
11ee55: c9 leave
11ee56: c3 ret
11ee57: 90 nop
- 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;
11ee58: 8b 59 04 mov 0x4(%ecx),%ebx
11ee5b: 83 e3 fe and $0xfffffffe,%ebx
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
11ee5e: 01 d9 add %ebx,%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;
11ee60: 39 c8 cmp %ecx,%eax
11ee62: 77 ed ja 11ee51 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
11ee64: 39 ca cmp %ecx,%edx
11ee66: 72 e9 jb 11ee51 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
11ee68: f6 41 04 01 testb $0x1,0x4(%ecx)
11ee6c: 74 e3 je 11ee51 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
11ee6e: 29 f1 sub %esi,%ecx
11ee70: 8d 51 04 lea 0x4(%ecx),%edx
11ee73: 8b 45 10 mov 0x10(%ebp),%eax
11ee76: 89 10 mov %edx,(%eax)
return true;
11ee78: b0 01 mov $0x1,%al
}
11ee7a: 5b pop %ebx
11ee7b: 5e pop %esi
11ee7c: c9 leave
11ee7d: c3 ret
0010d330 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
10d330: 55 push %ebp
10d331: 89 e5 mov %esp,%ebp
10d333: 57 push %edi
10d334: 56 push %esi
10d335: 53 push %ebx
10d336: 83 ec 4c sub $0x4c,%esp
10d339: 8b 5d 08 mov 0x8(%ebp),%ebx
uintptr_t const page_size = heap->page_size;
10d33c: 8b 43 10 mov 0x10(%ebx),%eax
10d33f: 89 45 e0 mov %eax,-0x20(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10d342: 8b 53 14 mov 0x14(%ebx),%edx
10d345: 89 55 d0 mov %edx,-0x30(%ebp)
Heap_Block *const first_block = heap->first_block;
10d348: 8b 43 20 mov 0x20(%ebx),%eax
10d34b: 89 45 dc mov %eax,-0x24(%ebp)
Heap_Block *const last_block = heap->last_block;
10d34e: 8b 53 24 mov 0x24(%ebx),%edx
10d351: 89 55 cc mov %edx,-0x34(%ebp)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10d354: 80 7d 10 00 cmpb $0x0,0x10(%ebp)
10d358: 74 1a je 10d374 <_Heap_Walk+0x44>
10d35a: c7 45 d8 e8 d2 10 00 movl $0x10d2e8,-0x28(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10d361: 83 3d 00 9c 12 00 03 cmpl $0x3,0x129c00
10d368: 74 1a je 10d384 <_Heap_Walk+0x54> <== ALWAYS TAKEN
}
block = next_block;
} while ( block != first_block );
return true;
10d36a: b0 01 mov $0x1,%al
}
10d36c: 8d 65 f4 lea -0xc(%ebp),%esp
10d36f: 5b pop %ebx
10d370: 5e pop %esi
10d371: 5f pop %edi
10d372: c9 leave
10d373: c3 ret
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10d374: c7 45 d8 e0 d2 10 00 movl $0x10d2e0,-0x28(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10d37b: 83 3d 00 9c 12 00 03 cmpl $0x3,0x129c00
10d382: 75 e6 jne 10d36a <_Heap_Walk+0x3a>
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)(
10d384: 52 push %edx
10d385: ff 73 0c pushl 0xc(%ebx)
10d388: ff 73 08 pushl 0x8(%ebx)
10d38b: ff 75 cc pushl -0x34(%ebp)
10d38e: ff 75 dc pushl -0x24(%ebp)
10d391: ff 73 1c pushl 0x1c(%ebx)
10d394: ff 73 18 pushl 0x18(%ebx)
10d397: ff 75 d0 pushl -0x30(%ebp)
10d39a: ff 75 e0 pushl -0x20(%ebp)
10d39d: 68 74 1d 12 00 push $0x121d74
10d3a2: 6a 00 push $0x0
10d3a4: ff 75 0c pushl 0xc(%ebp)
10d3a7: ff 55 d8 call *-0x28(%ebp)
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
10d3aa: 83 c4 30 add $0x30,%esp
10d3ad: 8b 45 e0 mov -0x20(%ebp),%eax
10d3b0: 85 c0 test %eax,%eax
10d3b2: 74 70 je 10d424 <_Heap_Walk+0xf4>
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
10d3b4: f6 45 e0 03 testb $0x3,-0x20(%ebp)
10d3b8: 75 72 jne 10d42c <_Heap_Walk+0xfc>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d3ba: 8b 45 d0 mov -0x30(%ebp),%eax
10d3bd: 31 d2 xor %edx,%edx
10d3bf: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
10d3c2: 85 d2 test %edx,%edx
10d3c4: 75 72 jne 10d438 <_Heap_Walk+0x108>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d3c6: 8b 45 dc mov -0x24(%ebp),%eax
10d3c9: 83 c0 08 add $0x8,%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d3cc: 31 d2 xor %edx,%edx
10d3ce: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if (
10d3d1: 85 d2 test %edx,%edx
10d3d3: 75 6f jne 10d444 <_Heap_Walk+0x114>
block = next_block;
} while ( block != first_block );
return true;
}
10d3d5: 8b 45 dc mov -0x24(%ebp),%eax
10d3d8: 8b 40 04 mov 0x4(%eax),%eax
10d3db: 89 45 e4 mov %eax,-0x1c(%ebp)
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
10d3de: a8 01 test $0x1,%al
10d3e0: 0f 84 8e 00 00 00 je 10d474 <_Heap_Walk+0x144>
- 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;
10d3e6: 8b 55 cc mov -0x34(%ebp),%edx
10d3e9: 8b 42 04 mov 0x4(%edx),%eax
10d3ec: 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);
10d3ef: 01 d0 add %edx,%eax
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
10d3f1: f6 40 04 01 testb $0x1,0x4(%eax)
10d3f5: 74 25 je 10d41c <_Heap_Walk+0xec>
);
return false;
}
if (
10d3f7: 39 45 dc cmp %eax,-0x24(%ebp)
10d3fa: 74 54 je 10d450 <_Heap_Walk+0x120> <== ALWAYS TAKEN
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
10d3fc: 51 push %ecx <== NOT EXECUTED
10d3fd: 68 90 1e 12 00 push $0x121e90 <== NOT EXECUTED
10d402: 66 90 xchg %ax,%ax <== NOT EXECUTED
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10d404: 6a 01 push $0x1
10d406: ff 75 0c pushl 0xc(%ebp)
10d409: ff 55 d8 call *-0x28(%ebp)
10d40c: 83 c4 10 add $0x10,%esp
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
10d40f: 31 c0 xor %eax,%eax
block = next_block;
} while ( block != first_block );
return true;
}
10d411: 8d 65 f4 lea -0xc(%ebp),%esp
10d414: 5b pop %ebx
10d415: 5e pop %esi
10d416: 5f pop %edi
10d417: c9 leave
10d418: c3 ret
10d419: 8d 76 00 lea 0x0(%esi),%esi
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
10d41c: 53 push %ebx
10d41d: 68 2a 1d 12 00 push $0x121d2a
10d422: eb e0 jmp 10d404 <_Heap_Walk+0xd4>
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
10d424: 57 push %edi
10d425: 68 f9 1c 12 00 push $0x121cf9
10d42a: eb d8 jmp 10d404 <_Heap_Walk+0xd4>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
10d42c: ff 75 e0 pushl -0x20(%ebp)
10d42f: 68 0c 1d 12 00 push $0x121d0c
10d434: eb ce jmp 10d404 <_Heap_Walk+0xd4>
10d436: 66 90 xchg %ax,%ax
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
10d438: ff 75 d0 pushl -0x30(%ebp)
10d43b: 68 08 1e 12 00 push $0x121e08
10d440: eb c2 jmp 10d404 <_Heap_Walk+0xd4>
10d442: 66 90 xchg %ax,%ax
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
10d444: ff 75 dc pushl -0x24(%ebp)
10d447: 68 2c 1e 12 00 push $0x121e2c
10d44c: eb b6 jmp 10d404 <_Heap_Walk+0xd4>
10d44e: 66 90 xchg %ax,%ax
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
10d450: 8b 43 10 mov 0x10(%ebx),%eax
10d453: 89 45 c8 mov %eax,-0x38(%ebp)
block = next_block;
} while ( block != first_block );
return true;
}
10d456: 8b 4b 08 mov 0x8(%ebx),%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 ) {
10d459: 39 cb cmp %ecx,%ebx
10d45b: 0f 84 a8 00 00 00 je 10d509 <_Heap_Walk+0x1d9>
block = next_block;
} while ( block != first_block );
return true;
}
10d461: 8b 43 20 mov 0x20(%ebx),%eax
10d464: 89 45 d4 mov %eax,-0x2c(%ebp)
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;
10d467: 39 c8 cmp %ecx,%eax
10d469: 76 11 jbe 10d47c <_Heap_Walk+0x14c> <== ALWAYS TAKEN
10d46b: 90 nop
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
10d46c: 51 push %ecx
10d46d: 68 c0 1e 12 00 push $0x121ec0
10d472: eb 90 jmp 10d404 <_Heap_Walk+0xd4>
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
10d474: 56 push %esi
10d475: 68 60 1e 12 00 push $0x121e60
10d47a: eb 88 jmp 10d404 <_Heap_Walk+0xd4>
10d47c: 8b 7b 24 mov 0x24(%ebx),%edi
10d47f: 39 cf cmp %ecx,%edi
10d481: 72 e9 jb 10d46c <_Heap_Walk+0x13c> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d483: 8d 41 08 lea 0x8(%ecx),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d486: 31 d2 xor %edx,%edx
10d488: f7 75 c8 divl -0x38(%ebp)
);
return false;
}
if (
10d48b: 85 d2 test %edx,%edx
10d48d: 0f 85 44 02 00 00 jne 10d6d7 <_Heap_Walk+0x3a7> <== 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;
10d493: 8b 41 04 mov 0x4(%ecx),%eax
10d496: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d499: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1)
10d49e: 0f 85 3e 02 00 00 jne 10d6e2 <_Heap_Walk+0x3b2> <== NEVER TAKEN
10d4a4: 89 da mov %ebx,%edx
10d4a6: 89 ce mov %ecx,%esi
10d4a8: eb 37 jmp 10d4e1 <_Heap_Walk+0x1b1>
10d4aa: 66 90 xchg %ax,%ax
return false;
}
prev_block = free_block;
free_block = free_block->next;
10d4ac: 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 ) {
10d4af: 39 cb cmp %ecx,%ebx
10d4b1: 74 5c je 10d50f <_Heap_Walk+0x1df>
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;
10d4b3: 39 4d d4 cmp %ecx,-0x2c(%ebp)
10d4b6: 77 b4 ja 10d46c <_Heap_Walk+0x13c>
10d4b8: 39 f9 cmp %edi,%ecx
10d4ba: 77 b0 ja 10d46c <_Heap_Walk+0x13c> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d4bc: 8d 41 08 lea 0x8(%ecx),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d4bf: 31 d2 xor %edx,%edx
10d4c1: f7 75 c8 divl -0x38(%ebp)
);
return false;
}
if (
10d4c4: 85 d2 test %edx,%edx
10d4c6: 0f 85 0b 02 00 00 jne 10d6d7 <_Heap_Walk+0x3a7>
- 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;
10d4cc: 8b 41 04 mov 0x4(%ecx),%eax
10d4cf: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d4d2: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1)
10d4d7: 0f 85 05 02 00 00 jne 10d6e2 <_Heap_Walk+0x3b2>
10d4dd: 89 f2 mov %esi,%edx
10d4df: 89 ce mov %ecx,%esi
);
return false;
}
if ( free_block->prev != prev_block ) {
10d4e1: 8b 41 0c mov 0xc(%ecx),%eax
10d4e4: 39 d0 cmp %edx,%eax
10d4e6: 74 c4 je 10d4ac <_Heap_Walk+0x17c>
(*printer)(
10d4e8: 83 ec 0c sub $0xc,%esp
10d4eb: 50 push %eax
10d4ec: 51 push %ecx
10d4ed: 68 10 1f 12 00 push $0x121f10
10d4f2: 66 90 xchg %ax,%ax
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
10d4f4: 6a 01 push $0x1
10d4f6: ff 75 0c pushl 0xc(%ebp)
10d4f9: ff 55 d8 call *-0x28(%ebp)
"block 0x%08x: next block 0x%08x not in heap\n",
block,
next_block
);
return false;
10d4fc: 83 c4 20 add $0x20,%esp
10d4ff: 31 c0 xor %eax,%eax
block = next_block;
} while ( block != first_block );
return true;
}
10d501: 8d 65 f4 lea -0xc(%ebp),%esp
10d504: 5b pop %ebx
10d505: 5e pop %esi
10d506: 5f pop %edi
10d507: c9 leave
10d508: c3 ret
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 ) {
10d509: 8b 53 20 mov 0x20(%ebx),%edx
10d50c: 89 55 d4 mov %edx,-0x2c(%ebp)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d50f: 8b 7d dc mov -0x24(%ebp),%edi
10d512: 8b 45 d4 mov -0x2c(%ebp),%eax
10d515: 8d 76 00 lea 0x0(%esi),%esi
10d518: 8b 4d e4 mov -0x1c(%ebp),%ecx
10d51b: 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);
10d51e: 8d 34 39 lea (%ecx,%edi,1),%esi
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;
10d521: 39 f0 cmp %esi,%eax
10d523: 76 0f jbe 10d534 <_Heap_Walk+0x204> <== ALWAYS TAKEN
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
10d525: 83 ec 0c sub $0xc,%esp
10d528: 56 push %esi
10d529: 57 push %edi
10d52a: 68 44 1f 12 00 push $0x121f44
10d52f: eb c3 jmp 10d4f4 <_Heap_Walk+0x1c4>
10d531: 8d 76 00 lea 0x0(%esi),%esi
10d534: 39 73 24 cmp %esi,0x24(%ebx)
10d537: 72 ec jb 10d525 <_Heap_Walk+0x1f5>
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;
10d539: 3b 7d cc cmp -0x34(%ebp),%edi
10d53c: 0f 95 45 d4 setne -0x2c(%ebp)
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d540: 89 c8 mov %ecx,%eax
10d542: 31 d2 xor %edx,%edx
10d544: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
10d547: 85 d2 test %edx,%edx
10d549: 74 0a je 10d555 <_Heap_Walk+0x225>
10d54b: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d54f: 0f 85 52 01 00 00 jne 10d6a7 <_Heap_Walk+0x377>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
10d555: 39 4d d0 cmp %ecx,-0x30(%ebp)
10d558: 76 0a jbe 10d564 <_Heap_Walk+0x234>
10d55a: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d55e: 0f 85 52 01 00 00 jne 10d6b6 <_Heap_Walk+0x386> <== ALWAYS TAKEN
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
10d564: 39 f7 cmp %esi,%edi
10d566: 72 0a jb 10d572 <_Heap_Walk+0x242>
10d568: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d56c: 0f 85 56 01 00 00 jne 10d6c8 <_Heap_Walk+0x398>
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;
10d572: 8b 55 e4 mov -0x1c(%ebp),%edx
10d575: 83 e2 01 and $0x1,%edx
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
10d578: f6 46 04 01 testb $0x1,0x4(%esi)
10d57c: 74 4e je 10d5cc <_Heap_Walk+0x29c>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
10d57e: 85 d2 test %edx,%edx
10d580: 74 2e je 10d5b0 <_Heap_Walk+0x280>
(*printer)(
10d582: 83 ec 0c sub $0xc,%esp
10d585: 51 push %ecx
10d586: 57 push %edi
10d587: 68 5b 1d 12 00 push $0x121d5b
10d58c: 6a 00 push $0x0
10d58e: ff 75 0c pushl 0xc(%ebp)
10d591: ff 55 d8 call *-0x28(%ebp)
10d594: 83 c4 20 add $0x20,%esp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
10d597: 39 75 dc cmp %esi,-0x24(%ebp)
10d59a: 0f 84 ca fd ff ff je 10d36a <_Heap_Walk+0x3a>
10d5a0: 8b 56 04 mov 0x4(%esi),%edx
10d5a3: 89 55 e4 mov %edx,-0x1c(%ebp)
10d5a6: 8b 43 20 mov 0x20(%ebx),%eax
10d5a9: 89 f7 mov %esi,%edi
10d5ab: e9 68 ff ff ff jmp 10d518 <_Heap_Walk+0x1e8>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
10d5b0: 83 ec 08 sub $0x8,%esp
10d5b3: ff 37 pushl (%edi)
10d5b5: 51 push %ecx
10d5b6: 57 push %edi
10d5b7: 68 a8 20 12 00 push $0x1220a8
10d5bc: 6a 00 push $0x0
10d5be: ff 75 0c pushl 0xc(%ebp)
10d5c1: ff 55 d8 call *-0x28(%ebp)
10d5c4: 83 c4 20 add $0x20,%esp
10d5c7: eb ce jmp 10d597 <_Heap_Walk+0x267>
10d5c9: 8d 76 00 lea 0x0(%esi),%esi
block = next_block;
} while ( block != first_block );
return true;
}
10d5cc: 8b 43 08 mov 0x8(%ebx),%eax
10d5cf: 89 45 b4 mov %eax,-0x4c(%ebp)
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
10d5d2: 8b 47 08 mov 0x8(%edi),%eax
10d5d5: 89 45 e4 mov %eax,-0x1c(%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)(
10d5d8: 39 43 0c cmp %eax,0xc(%ebx)
10d5db: 0f 84 97 00 00 00 je 10d678 <_Heap_Walk+0x348>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10d5e1: 39 c3 cmp %eax,%ebx
10d5e3: 0f 84 9b 00 00 00 je 10d684 <_Heap_Walk+0x354>
10d5e9: c7 45 c8 e9 1b 12 00 movl $0x121be9,-0x38(%ebp)
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 ?
10d5f0: 8b 47 0c mov 0xc(%edi),%eax
10d5f3: 89 45 d4 mov %eax,-0x2c(%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)(
10d5f6: 39 45 b4 cmp %eax,-0x4c(%ebp)
10d5f9: 74 75 je 10d670 <_Heap_Walk+0x340>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10d5fb: 39 c3 cmp %eax,%ebx
10d5fd: 0f 84 8d 00 00 00 je 10d690 <_Heap_Walk+0x360>
10d603: b8 e9 1b 12 00 mov $0x121be9,%eax
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)(
10d608: 83 ec 0c sub $0xc,%esp
10d60b: ff 75 c8 pushl -0x38(%ebp)
10d60e: ff 75 e4 pushl -0x1c(%ebp)
10d611: 50 push %eax
10d612: ff 75 d4 pushl -0x2c(%ebp)
10d615: 51 push %ecx
10d616: 57 push %edi
10d617: 68 04 20 12 00 push $0x122004
10d61c: 6a 00 push $0x0
10d61e: ff 75 0c pushl 0xc(%ebp)
10d621: 89 55 c4 mov %edx,-0x3c(%ebp)
10d624: 89 4d c0 mov %ecx,-0x40(%ebp)
10d627: ff 55 d8 call *-0x28(%ebp)
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
10d62a: 8b 06 mov (%esi),%eax
10d62c: 83 c4 30 add $0x30,%esp
10d62f: 8b 4d c0 mov -0x40(%ebp),%ecx
10d632: 39 c1 cmp %eax,%ecx
10d634: 8b 55 c4 mov -0x3c(%ebp),%edx
10d637: 75 27 jne 10d660 <_Heap_Walk+0x330>
);
return false;
}
if ( !prev_used ) {
10d639: 85 d2 test %edx,%edx
10d63b: 74 5f je 10d69c <_Heap_Walk+0x36c>
block = next_block;
} while ( block != first_block );
return true;
}
10d63d: 8b 43 08 mov 0x8(%ebx),%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 ) {
10d640: 39 c3 cmp %eax,%ebx
10d642: 74 0f je 10d653 <_Heap_Walk+0x323> <== NEVER TAKEN
if ( free_block == block ) {
10d644: 39 c7 cmp %eax,%edi
10d646: 0f 84 4b ff ff ff je 10d597 <_Heap_Walk+0x267>
return true;
}
free_block = free_block->next;
10d64c: 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 ) {
10d64f: 39 c3 cmp %eax,%ebx
10d651: 75 f1 jne 10d644 <_Heap_Walk+0x314>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10d653: 57 push %edi
10d654: 68 d0 20 12 00 push $0x1220d0
10d659: e9 a6 fd ff ff jmp 10d404 <_Heap_Walk+0xd4>
10d65e: 66 90 xchg %ax,%ax
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
10d660: 52 push %edx
10d661: 56 push %esi
10d662: 50 push %eax
10d663: 51 push %ecx
10d664: 57 push %edi
10d665: 68 3c 20 12 00 push $0x12203c
10d66a: e9 85 fe ff ff jmp 10d4f4 <_Heap_Walk+0x1c4>
10d66f: 90 nop
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)(
10d670: b8 df 1c 12 00 mov $0x121cdf,%eax
10d675: eb 91 jmp 10d608 <_Heap_Walk+0x2d8>
10d677: 90 nop
10d678: c7 45 c8 c6 1c 12 00 movl $0x121cc6,-0x38(%ebp)
10d67f: e9 6c ff ff ff jmp 10d5f0 <_Heap_Walk+0x2c0>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10d684: c7 45 c8 d5 1c 12 00 movl $0x121cd5,-0x38(%ebp)
10d68b: e9 60 ff ff ff jmp 10d5f0 <_Heap_Walk+0x2c0>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10d690: b8 ef 1c 12 00 mov $0x121cef,%eax
10d695: e9 6e ff ff ff jmp 10d608 <_Heap_Walk+0x2d8>
10d69a: 66 90 xchg %ax,%ax
return false;
}
if ( !prev_used ) {
(*printer)(
10d69c: 57 push %edi
10d69d: 68 78 20 12 00 push $0x122078
10d6a2: e9 5d fd ff ff jmp 10d404 <_Heap_Walk+0xd4>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
10d6a7: 83 ec 0c sub $0xc,%esp
10d6aa: 51 push %ecx
10d6ab: 57 push %edi
10d6ac: 68 74 1f 12 00 push $0x121f74
10d6b1: e9 3e fe ff ff jmp 10d4f4 <_Heap_Walk+0x1c4>
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
10d6b6: 83 ec 08 sub $0x8,%esp
10d6b9: ff 75 d0 pushl -0x30(%ebp)
10d6bc: 51 push %ecx
10d6bd: 57 push %edi
10d6be: 68 a4 1f 12 00 push $0x121fa4
10d6c3: e9 2c fe ff ff jmp 10d4f4 <_Heap_Walk+0x1c4>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
10d6c8: 83 ec 0c sub $0xc,%esp
10d6cb: 56 push %esi
10d6cc: 57 push %edi
10d6cd: 68 d0 1f 12 00 push $0x121fd0
10d6d2: e9 1d fe ff ff jmp 10d4f4 <_Heap_Walk+0x1c4>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
10d6d7: 51 push %ecx
10d6d8: 68 e0 1e 12 00 push $0x121ee0
10d6dd: e9 22 fd ff ff jmp 10d404 <_Heap_Walk+0xd4>
return false;
}
if ( _Heap_Is_used( free_block ) ) {
(*printer)(
10d6e2: 51 push %ecx
10d6e3: 68 3f 1d 12 00 push $0x121d3f
10d6e8: e9 17 fd ff ff jmp 10d404 <_Heap_Walk+0xd4>
0010bdac <_IO_Initialize_all_drivers>:
*
* Output Parameters: NONE
*/
void _IO_Initialize_all_drivers( void )
{
10bdac: 55 push %ebp
10bdad: 89 e5 mov %esp,%ebp
10bdaf: 53 push %ebx
10bdb0: 83 ec 04 sub $0x4,%esp
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
10bdb3: 8b 0d 00 80 12 00 mov 0x128000,%ecx
10bdb9: 85 c9 test %ecx,%ecx
10bdbb: 74 1a je 10bdd7 <_IO_Initialize_all_drivers+0x2b><== NEVER TAKEN
10bdbd: 31 db xor %ebx,%ebx
10bdbf: 90 nop
(void) rtems_io_initialize( major, 0, NULL );
10bdc0: 52 push %edx
10bdc1: 6a 00 push $0x0
10bdc3: 6a 00 push $0x0
10bdc5: 53 push %ebx
10bdc6: e8 49 52 00 00 call 111014 <rtems_io_initialize>
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
10bdcb: 43 inc %ebx
10bdcc: 83 c4 10 add $0x10,%esp
10bdcf: 39 1d 00 80 12 00 cmp %ebx,0x128000
10bdd5: 77 e9 ja 10bdc0 <_IO_Initialize_all_drivers+0x14>
(void) rtems_io_initialize( major, 0, NULL );
}
10bdd7: 8b 5d fc mov -0x4(%ebp),%ebx
10bdda: c9 leave
10bddb: c3 ret
0010bd14 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
10bd14: 55 push %ebp
10bd15: 89 e5 mov %esp,%ebp
10bd17: 57 push %edi
10bd18: 56 push %esi
10bd19: 53 push %ebx
10bd1a: 83 ec 1c sub $0x1c,%esp
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
10bd1d: 8b 1d b8 32 12 00 mov 0x1232b8,%ebx
drivers_in_table = Configuration.number_of_device_drivers;
10bd23: a1 b4 32 12 00 mov 0x1232b4,%eax
10bd28: 89 45 e4 mov %eax,-0x1c(%ebp)
number_of_drivers = Configuration.maximum_drivers;
10bd2b: 8b 35 b0 32 12 00 mov 0x1232b0,%esi
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
10bd31: 39 f0 cmp %esi,%eax
10bd33: 73 5f jae 10bd94 <_IO_Manager_initialization+0x80>
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
10bd35: 8d 0c 76 lea (%esi,%esi,2),%ecx
10bd38: c1 e1 03 shl $0x3,%ecx
10bd3b: 83 ec 0c sub $0xc,%esp
10bd3e: 51 push %ecx
10bd3f: 89 4d dc mov %ecx,-0x24(%ebp)
10bd42: e8 4d 2c 00 00 call 10e994 <_Workspace_Allocate_or_fatal_error>
10bd47: 89 c2 mov %eax,%edx
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
10bd49: a3 04 80 12 00 mov %eax,0x128004
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
10bd4e: 89 35 00 80 12 00 mov %esi,0x128000
memset(
10bd54: 31 c0 xor %eax,%eax
10bd56: 8b 4d dc mov -0x24(%ebp),%ecx
10bd59: 89 d7 mov %edx,%edi
10bd5b: f3 aa rep stos %al,%es:(%edi)
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
10bd5d: 83 c4 10 add $0x10,%esp
10bd60: 8b 45 e4 mov -0x1c(%ebp),%eax
10bd63: 85 c0 test %eax,%eax
10bd65: 74 25 je 10bd8c <_IO_Manager_initialization+0x78><== NEVER TAKEN
10bd67: a1 04 80 12 00 mov 0x128004,%eax
10bd6c: 89 45 e0 mov %eax,-0x20(%ebp)
10bd6f: 31 c0 xor %eax,%eax
10bd71: 31 d2 xor %edx,%edx
10bd73: 90 nop
_IO_Driver_address_table[index] = driver_table[index];
10bd74: 8b 7d e0 mov -0x20(%ebp),%edi
10bd77: 01 c7 add %eax,%edi
10bd79: 8d 34 03 lea (%ebx,%eax,1),%esi
10bd7c: b9 06 00 00 00 mov $0x6,%ecx
10bd81: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
10bd83: 42 inc %edx
10bd84: 83 c0 18 add $0x18,%eax
10bd87: 39 55 e4 cmp %edx,-0x1c(%ebp)
10bd8a: 77 e8 ja 10bd74 <_IO_Manager_initialization+0x60>
_IO_Driver_address_table[index] = driver_table[index];
}
10bd8c: 8d 65 f4 lea -0xc(%ebp),%esp
10bd8f: 5b pop %ebx
10bd90: 5e pop %esi
10bd91: 5f pop %edi
10bd92: c9 leave
10bd93: c3 ret
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
10bd94: 89 1d 04 80 12 00 mov %ebx,0x128004
_IO_Number_of_drivers = number_of_drivers;
10bd9a: 8b 45 e4 mov -0x1c(%ebp),%eax
10bd9d: a3 00 80 12 00 mov %eax,0x128000
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
10bda2: 8d 65 f4 lea -0xc(%ebp),%esp
10bda5: 5b pop %ebx
10bda6: 5e pop %esi
10bda7: 5f pop %edi
10bda8: c9 leave
10bda9: c3 ret
0010c900 <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10c900: 55 push %ebp
10c901: 89 e5 mov %esp,%ebp
10c903: 53 push %ebx
10c904: 83 ec 08 sub $0x8,%esp
10c907: 8b 45 08 mov 0x8(%ebp),%eax
10c90a: 8b 55 0c mov 0xc(%ebp),%edx
10c90d: 8b 5d 10 mov 0x10(%ebp),%ebx
_Internal_errors_What_happened.the_source = the_source;
10c910: a3 30 76 12 00 mov %eax,0x127630
_Internal_errors_What_happened.is_internal = is_internal;
10c915: 88 15 34 76 12 00 mov %dl,0x127634
_Internal_errors_What_happened.the_error = the_error;
10c91b: 89 1d 38 76 12 00 mov %ebx,0x127638
_User_extensions_Fatal( the_source, is_internal, the_error );
10c921: 53 push %ebx
10c922: 0f b6 d2 movzbl %dl,%edx
10c925: 52 push %edx
10c926: 50 push %eax
10c927: e8 70 1c 00 00 call 10e59c <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
10c92c: c7 05 20 77 12 00 05 movl $0x5,0x127720 <== NOT EXECUTED
10c933: 00 00 00
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
10c936: fa cli <== NOT EXECUTED
10c937: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10c939: f4 hlt <== NOT EXECUTED
10c93a: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c93d: eb fe jmp 10c93d <_Internal_error_Occurred+0x3d><== NOT EXECUTED
001115f4 <_Objects_API_maximum_class>:
#include <rtems/score/object.h>
unsigned int _Objects_API_maximum_class(
uint32_t api
)
{
1115f4: 55 push %ebp
1115f5: 89 e5 mov %esp,%ebp
1115f7: 8b 45 08 mov 0x8(%ebp),%eax
1115fa: 48 dec %eax
1115fb: 83 f8 02 cmp $0x2,%eax
1115fe: 77 0c ja 11160c <_Objects_API_maximum_class+0x18>
111600: 8b 04 85 a0 13 12 00 mov 0x1213a0(,%eax,4),%eax
case OBJECTS_NO_API:
default:
break;
}
return 0;
}
111607: c9 leave
111608: c3 ret
111609: 8d 76 00 lea 0x0(%esi),%esi
#include <rtems/score/object.h>
unsigned int _Objects_API_maximum_class(
uint32_t api
)
{
11160c: 31 c0 xor %eax,%eax
case OBJECTS_NO_API:
default:
break;
}
return 0;
}
11160e: c9 leave
11160f: c3 ret
0010c990 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
10c990: 55 push %ebp
10c991: 89 e5 mov %esp,%ebp
10c993: 56 push %esi
10c994: 53 push %ebx
10c995: 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 )
10c998: 8b 43 18 mov 0x18(%ebx),%eax
10c99b: 85 c0 test %eax,%eax
10c99d: 75 0d jne 10c9ac <_Objects_Allocate+0x1c><== ALWAYS TAKEN
return NULL;
10c99f: 31 c9 xor %ecx,%ecx
);
}
#endif
return the_object;
}
10c9a1: 89 c8 mov %ecx,%eax
10c9a3: 8d 65 f8 lea -0x8(%ebp),%esp
10c9a6: 5b pop %ebx
10c9a7: 5e pop %esi
10c9a8: c9 leave
10c9a9: c3 ret
10c9aa: 66 90 xchg %ax,%ax
/*
* 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 );
10c9ac: 8d 73 20 lea 0x20(%ebx),%esi
10c9af: 83 ec 0c sub $0xc,%esp
10c9b2: 56 push %esi
10c9b3: e8 60 f6 ff ff call 10c018 <_Chain_Get>
10c9b8: 89 c1 mov %eax,%ecx
if ( information->auto_extend ) {
10c9ba: 83 c4 10 add $0x10,%esp
10c9bd: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10c9c1: 74 de je 10c9a1 <_Objects_Allocate+0x11>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
10c9c3: 85 c0 test %eax,%eax
10c9c5: 74 29 je 10c9f0 <_Objects_Allocate+0x60>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
10c9c7: 0f b7 41 08 movzwl 0x8(%ecx),%eax
10c9cb: 0f b7 53 08 movzwl 0x8(%ebx),%edx
10c9cf: 29 d0 sub %edx,%eax
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
10c9d1: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10c9d5: 31 d2 xor %edx,%edx
10c9d7: f7 f6 div %esi
information->inactive_per_block[ block ]--;
10c9d9: c1 e0 02 shl $0x2,%eax
10c9dc: 03 43 30 add 0x30(%ebx),%eax
10c9df: ff 08 decl (%eax)
information->inactive--;
10c9e1: 66 ff 4b 2c decw 0x2c(%ebx)
);
}
#endif
return the_object;
}
10c9e5: 89 c8 mov %ecx,%eax
10c9e7: 8d 65 f8 lea -0x8(%ebp),%esp
10c9ea: 5b pop %ebx
10c9eb: 5e pop %esi
10c9ec: c9 leave
10c9ed: c3 ret
10c9ee: 66 90 xchg %ax,%ax
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
_Objects_Extend_information( information );
10c9f0: 83 ec 0c sub $0xc,%esp
10c9f3: 53 push %ebx
10c9f4: e8 3b 00 00 00 call 10ca34 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
10c9f9: 89 34 24 mov %esi,(%esp)
10c9fc: e8 17 f6 ff ff call 10c018 <_Chain_Get>
10ca01: 89 c1 mov %eax,%ecx
}
if ( the_object ) {
10ca03: 83 c4 10 add $0x10,%esp
10ca06: 85 c0 test %eax,%eax
10ca08: 74 97 je 10c9a1 <_Objects_Allocate+0x11>
10ca0a: eb bb jmp 10c9c7 <_Objects_Allocate+0x37>
0010ca34 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
10ca34: 55 push %ebp
10ca35: 89 e5 mov %esp,%ebp
10ca37: 57 push %edi
10ca38: 56 push %esi
10ca39: 53 push %ebx
10ca3a: 83 ec 4c sub $0x4c,%esp
10ca3d: 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 );
10ca40: 0f b7 43 08 movzwl 0x8(%ebx),%eax
10ca44: 89 45 cc mov %eax,-0x34(%ebp)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
10ca47: 8b 4b 34 mov 0x34(%ebx),%ecx
10ca4a: 85 c9 test %ecx,%ecx
10ca4c: 0f 84 66 02 00 00 je 10ccb8 <_Objects_Extend_information+0x284>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
10ca52: 8b 73 10 mov 0x10(%ebx),%esi
10ca55: 66 89 75 d0 mov %si,-0x30(%ebp)
10ca59: 8b 7b 14 mov 0x14(%ebx),%edi
10ca5c: 89 f0 mov %esi,%eax
10ca5e: 31 d2 xor %edx,%edx
10ca60: 66 f7 f7 div %di
10ca63: 0f b7 f0 movzwl %ax,%esi
for ( ; block < block_count; block++ ) {
10ca66: 85 f6 test %esi,%esi
10ca68: 0f 84 63 02 00 00 je 10ccd1 <_Objects_Extend_information+0x29d><== NEVER TAKEN
if ( information->object_blocks[ block ] == NULL ) {
10ca6e: 8b 01 mov (%ecx),%eax
10ca70: 85 c0 test %eax,%eax
10ca72: 0f 84 6b 02 00 00 je 10cce3 <_Objects_Extend_information+0x2af><== NEVER TAKEN
10ca78: 0f b7 ff movzwl %di,%edi
/*
* 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 );
10ca7b: 8b 55 cc mov -0x34(%ebp),%edx
10ca7e: 89 55 d4 mov %edx,-0x2c(%ebp)
index_base = minimum_index;
block = 0;
10ca81: 31 d2 xor %edx,%edx
10ca83: 8b 45 d4 mov -0x2c(%ebp),%eax
10ca86: eb 0a jmp 10ca92 <_Objects_Extend_information+0x5e>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
10ca88: 83 3c 91 00 cmpl $0x0,(%ecx,%edx,4)
10ca8c: 0f 84 c6 01 00 00 je 10cc58 <_Objects_Extend_information+0x224>
do_extend = false;
break;
} else
index_base += information->allocation_size;
10ca92: 01 f8 add %edi,%eax
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10ca94: 42 inc %edx
10ca95: 39 d6 cmp %edx,%esi
10ca97: 77 ef ja 10ca88 <_Objects_Extend_information+0x54>
10ca99: 89 45 d4 mov %eax,-0x2c(%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;
10ca9c: b1 01 mov $0x1,%cl
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
10ca9e: 0f b7 45 d0 movzwl -0x30(%ebp),%eax
10caa2: 01 f8 add %edi,%eax
10caa4: 89 45 d0 mov %eax,-0x30(%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 ) {
10caa7: 3d ff ff 00 00 cmp $0xffff,%eax
10caac: 0f 87 9e 01 00 00 ja 10cc50 <_Objects_Extend_information+0x21c><== 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;
10cab2: 0f af 7b 18 imul 0x18(%ebx),%edi
if ( information->auto_extend ) {
10cab6: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10caba: 0f 84 a4 01 00 00 je 10cc64 <_Objects_Extend_information+0x230>
new_object_block = _Workspace_Allocate( block_size );
10cac0: 83 ec 0c sub $0xc,%esp
10cac3: 57 push %edi
10cac4: 89 55 b8 mov %edx,-0x48(%ebp)
10cac7: 88 4d b4 mov %cl,-0x4c(%ebp)
10caca: e8 91 1e 00 00 call 10e960 <_Workspace_Allocate>
10cacf: 89 45 c8 mov %eax,-0x38(%ebp)
if ( !new_object_block )
10cad2: 83 c4 10 add $0x10,%esp
10cad5: 85 c0 test %eax,%eax
10cad7: 8b 55 b8 mov -0x48(%ebp),%edx
10cada: 8a 4d b4 mov -0x4c(%ebp),%cl
10cadd: 0f 84 6d 01 00 00 je 10cc50 <_Objects_Extend_information+0x21c>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
10cae3: 84 c9 test %cl,%cl
10cae5: 0f 84 ea 00 00 00 je 10cbd5 <_Objects_Extend_information+0x1a1>
*/
/*
* Up the block count and maximum
*/
block_count++;
10caeb: 8d 7e 01 lea 0x1(%esi),%edi
* 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 );
10caee: 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 *)) +
10caf1: 8d 04 7f lea (%edi,%edi,2),%eax
((maximum + minimum_index) * sizeof(Objects_Control *));
10caf4: 03 45 d0 add -0x30(%ebp),%eax
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
10caf7: 03 45 cc add -0x34(%ebp),%eax
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
10cafa: 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 );
10cafd: 50 push %eax
10cafe: 89 55 b8 mov %edx,-0x48(%ebp)
10cb01: e8 5a 1e 00 00 call 10e960 <_Workspace_Allocate>
10cb06: 89 45 c4 mov %eax,-0x3c(%ebp)
if ( !object_blocks ) {
10cb09: 83 c4 10 add $0x10,%esp
10cb0c: 85 c0 test %eax,%eax
10cb0e: 8b 55 b8 mov -0x48(%ebp),%edx
10cb11: 0f 84 de 01 00 00 je 10ccf5 <_Objects_Extend_information+0x2c1>
10cb17: 8b 45 c4 mov -0x3c(%ebp),%eax
10cb1a: 8d 04 b8 lea (%eax,%edi,4),%eax
10cb1d: 89 45 bc mov %eax,-0x44(%ebp)
10cb20: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb23: 8d 04 f9 lea (%ecx,%edi,8),%eax
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
10cb26: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10cb2a: 39 4d cc cmp %ecx,-0x34(%ebp)
10cb2d: 0f 82 51 01 00 00 jb 10cc84 <_Objects_Extend_information+0x250>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
10cb33: 8b 4d cc mov -0x34(%ebp),%ecx
10cb36: 85 c9 test %ecx,%ecx
10cb38: 74 12 je 10cb4c <_Objects_Extend_information+0x118><== NEVER TAKEN
10cb3a: 31 c9 xor %ecx,%ecx
10cb3c: 8b 7d cc mov -0x34(%ebp),%edi
10cb3f: 90 nop
local_table[ index ] = NULL;
10cb40: c7 04 88 00 00 00 00 movl $0x0,(%eax,%ecx,4)
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
10cb47: 41 inc %ecx
10cb48: 39 cf cmp %ecx,%edi
10cb4a: 77 f4 ja 10cb40 <_Objects_Extend_information+0x10c><== NEVER TAKEN
10cb4c: c1 e6 02 shl $0x2,%esi
10cb4f: 89 75 c0 mov %esi,-0x40(%ebp)
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
10cb52: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb55: 8b 75 c0 mov -0x40(%ebp),%esi
10cb58: c7 04 31 00 00 00 00 movl $0x0,(%ecx,%esi,1)
inactive_per_block[block_count] = 0;
10cb5f: 8b 4d bc mov -0x44(%ebp),%ecx
10cb62: c7 04 31 00 00 00 00 movl $0x0,(%ecx,%esi,1)
for ( index=index_base ;
index < ( information->allocation_size + index_base );
10cb69: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10cb6d: 03 75 d4 add -0x2c(%ebp),%esi
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
10cb70: 39 75 d4 cmp %esi,-0x2c(%ebp)
10cb73: 73 0f jae 10cb84 <_Objects_Extend_information+0x150><== NEVER TAKEN
10cb75: 8b 4d d4 mov -0x2c(%ebp),%ecx
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
10cb78: c7 04 88 00 00 00 00 movl $0x0,(%eax,%ecx,4)
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
10cb7f: 41 inc %ecx
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
10cb80: 39 f1 cmp %esi,%ecx
10cb82: 72 f4 jb 10cb78 <_Objects_Extend_information+0x144>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
10cb84: 9c pushf
10cb85: fa cli
10cb86: 5f pop %edi
old_tables = information->object_blocks;
10cb87: 8b 4b 34 mov 0x34(%ebx),%ecx
information->object_blocks = object_blocks;
10cb8a: 8b 75 c4 mov -0x3c(%ebp),%esi
10cb8d: 89 73 34 mov %esi,0x34(%ebx)
information->inactive_per_block = inactive_per_block;
10cb90: 8b 75 bc mov -0x44(%ebp),%esi
10cb93: 89 73 30 mov %esi,0x30(%ebx)
information->local_table = local_table;
10cb96: 89 43 1c mov %eax,0x1c(%ebx)
information->maximum = (Objects_Maximum) maximum;
10cb99: 8b 45 d0 mov -0x30(%ebp),%eax
10cb9c: 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) |
10cba0: 8b 33 mov (%ebx),%esi
10cba2: c1 e6 18 shl $0x18,%esi
10cba5: 81 ce 00 00 01 00 or $0x10000,%esi
information->maximum_id = _Objects_Build_id(
10cbab: 0f b7 43 04 movzwl 0x4(%ebx),%eax
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cbaf: c1 e0 1b shl $0x1b,%eax
10cbb2: 09 c6 or %eax,%esi
10cbb4: 0f b7 45 d0 movzwl -0x30(%ebp),%eax
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cbb8: 09 c6 or %eax,%esi
10cbba: 89 73 0c mov %esi,0xc(%ebx)
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
10cbbd: 57 push %edi
10cbbe: 9d popf
if ( old_tables )
10cbbf: 85 c9 test %ecx,%ecx
10cbc1: 74 12 je 10cbd5 <_Objects_Extend_information+0x1a1>
_Workspace_Free( old_tables );
10cbc3: 83 ec 0c sub $0xc,%esp
10cbc6: 51 push %ecx
10cbc7: 89 55 b8 mov %edx,-0x48(%ebp)
10cbca: e8 ad 1d 00 00 call 10e97c <_Workspace_Free>
10cbcf: 83 c4 10 add $0x10,%esp
10cbd2: 8b 55 b8 mov -0x48(%ebp),%edx
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
10cbd5: c1 e2 02 shl $0x2,%edx
10cbd8: 89 55 d0 mov %edx,-0x30(%ebp)
10cbdb: 8b 43 34 mov 0x34(%ebx),%eax
10cbde: 8b 4d c8 mov -0x38(%ebp),%ecx
10cbe1: 89 0c 10 mov %ecx,(%eax,%edx,1)
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
10cbe4: ff 73 18 pushl 0x18(%ebx)
10cbe7: 0f b7 43 14 movzwl 0x14(%ebx),%eax
10cbeb: 50 push %eax
10cbec: 51 push %ecx
10cbed: 8d 7d dc lea -0x24(%ebp),%edi
10cbf0: 57 push %edi
10cbf1: e8 5e 44 00 00 call 111054 <_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 ) {
10cbf6: 83 c4 10 add $0x10,%esp
10cbf9: 8b 75 d4 mov -0x2c(%ebp),%esi
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10cbfc: 8d 43 20 lea 0x20(%ebx),%eax
10cbff: 89 45 d4 mov %eax,-0x2c(%ebp)
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
10cc02: eb 29 jmp 10cc2d <_Objects_Extend_information+0x1f9>
10cc04: 8b 13 mov (%ebx),%edx
10cc06: c1 e2 18 shl $0x18,%edx
10cc09: 81 ca 00 00 01 00 or $0x10000,%edx
the_object->id = _Objects_Build_id(
10cc0f: 0f b7 4b 04 movzwl 0x4(%ebx),%ecx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cc13: c1 e1 1b shl $0x1b,%ecx
10cc16: 09 ca or %ecx,%edx
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cc18: 09 f2 or %esi,%edx
10cc1a: 89 50 08 mov %edx,0x8(%eax)
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10cc1d: 83 ec 08 sub $0x8,%esp
10cc20: 50 push %eax
10cc21: ff 75 d4 pushl -0x2c(%ebp)
10cc24: e8 b3 f3 ff ff call 10bfdc <_Chain_Append>
index++;
10cc29: 46 inc %esi
10cc2a: 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 ) {
10cc2d: 83 ec 0c sub $0xc,%esp
10cc30: 57 push %edi
10cc31: e8 e2 f3 ff ff call 10c018 <_Chain_Get>
10cc36: 83 c4 10 add $0x10,%esp
10cc39: 85 c0 test %eax,%eax
10cc3b: 75 c7 jne 10cc04 <_Objects_Extend_information+0x1d0>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
10cc3d: 8b 43 14 mov 0x14(%ebx),%eax
10cc40: 8b 53 30 mov 0x30(%ebx),%edx
10cc43: 0f b7 c8 movzwl %ax,%ecx
10cc46: 8b 75 d0 mov -0x30(%ebp),%esi
10cc49: 89 0c 32 mov %ecx,(%edx,%esi,1)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
10cc4c: 66 01 43 2c add %ax,0x2c(%ebx)
}
10cc50: 8d 65 f4 lea -0xc(%ebp),%esp
10cc53: 5b pop %ebx
10cc54: 5e pop %esi
10cc55: 5f pop %edi
10cc56: c9 leave
10cc57: c3 ret
10cc58: 89 45 d4 mov %eax,-0x2c(%ebp)
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
10cc5b: 31 c9 xor %ecx,%ecx
10cc5d: e9 3c fe ff ff jmp 10ca9e <_Objects_Extend_information+0x6a>
10cc62: 66 90 xchg %ax,%ax
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
if ( !new_object_block )
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
10cc64: 83 ec 0c sub $0xc,%esp
10cc67: 57 push %edi
10cc68: 89 55 b8 mov %edx,-0x48(%ebp)
10cc6b: 88 4d b4 mov %cl,-0x4c(%ebp)
10cc6e: e8 21 1d 00 00 call 10e994 <_Workspace_Allocate_or_fatal_error>
10cc73: 89 45 c8 mov %eax,-0x38(%ebp)
10cc76: 83 c4 10 add $0x10,%esp
10cc79: 8a 4d b4 mov -0x4c(%ebp),%cl
10cc7c: 8b 55 b8 mov -0x48(%ebp),%edx
10cc7f: e9 5f fe ff ff jmp 10cae3 <_Objects_Extend_information+0xaf>
/*
* 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,
10cc84: c1 e6 02 shl $0x2,%esi
10cc87: 89 75 c0 mov %esi,-0x40(%ebp)
10cc8a: 8b 73 34 mov 0x34(%ebx),%esi
10cc8d: 8b 7d c4 mov -0x3c(%ebp),%edi
10cc90: 8b 4d c0 mov -0x40(%ebp),%ecx
10cc93: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
10cc95: 8b 73 30 mov 0x30(%ebx),%esi
10cc98: 8b 7d bc mov -0x44(%ebp),%edi
10cc9b: 8b 4d c0 mov -0x40(%ebp),%ecx
10cc9e: 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 *) );
10cca0: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10cca4: 03 4d cc add -0x34(%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,
10cca7: c1 e1 02 shl $0x2,%ecx
10ccaa: 8b 73 1c mov 0x1c(%ebx),%esi
10ccad: 89 c7 mov %eax,%edi
10ccaf: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
10ccb1: e9 9c fe ff ff jmp 10cb52 <_Objects_Extend_information+0x11e>
10ccb6: 66 90 xchg %ax,%ax
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
10ccb8: 8b 53 10 mov 0x10(%ebx),%edx
10ccbb: 66 89 55 d0 mov %dx,-0x30(%ebp)
10ccbf: 0f b7 7b 14 movzwl 0x14(%ebx),%edi
/*
* 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 );
10ccc3: 89 45 d4 mov %eax,-0x2c(%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;
10ccc6: b1 01 mov $0x1,%cl
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10ccc8: 31 d2 xor %edx,%edx
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
10ccca: 31 f6 xor %esi,%esi
10cccc: e9 cd fd ff ff jmp 10ca9e <_Objects_Extend_information+0x6a>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10ccd1: 0f b7 ff movzwl %di,%edi <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10ccd4: 8b 45 cc mov -0x34(%ebp),%eax <== NOT EXECUTED
10ccd7: 89 45 d4 mov %eax,-0x2c(%ebp) <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
10ccda: b1 01 mov $0x1,%cl <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10ccdc: 31 d2 xor %edx,%edx <== NOT EXECUTED
10ccde: e9 bb fd ff ff jmp 10ca9e <_Objects_Extend_information+0x6a><== NOT EXECUTED
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
10cce3: 0f b7 ff movzwl %di,%edi <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
10cce6: 8b 4d cc mov -0x34(%ebp),%ecx <== NOT EXECUTED
10cce9: 89 4d d4 mov %ecx,-0x2c(%ebp) <== NOT EXECUTED
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
10ccec: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10ccee: 31 d2 xor %edx,%edx <== NOT EXECUTED
10ccf0: e9 a9 fd ff ff jmp 10ca9e <_Objects_Extend_information+0x6a><== NOT EXECUTED
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
10ccf5: 83 ec 0c sub $0xc,%esp
10ccf8: ff 75 c8 pushl -0x38(%ebp)
10ccfb: e8 7c 1c 00 00 call 10e97c <_Workspace_Free>
return;
10cd00: 83 c4 10 add $0x10,%esp
10cd03: e9 48 ff ff ff jmp 10cc50 <_Objects_Extend_information+0x21c>
0010cd98 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
10cd98: 55 push %ebp
10cd99: 89 e5 mov %esp,%ebp
10cd9b: 56 push %esi
10cd9c: 53 push %ebx
10cd9d: 8b 75 08 mov 0x8(%ebp),%esi
10cda0: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
10cda3: 66 85 db test %bx,%bx
10cda6: 75 0c jne 10cdb4 <_Objects_Get_information+0x1c>
the_class_api_maximum = _Objects_API_maximum_class( the_api );
if ( the_class_api_maximum == 0 )
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
10cda8: 31 c0 xor %eax,%eax
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
10cdaa: 8d 65 f8 lea -0x8(%ebp),%esp
10cdad: 5b pop %ebx
10cdae: 5e pop %esi
10cdaf: c9 leave
10cdb0: c3 ret
10cdb1: 8d 76 00 lea 0x0(%esi),%esi
/*
* 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 );
10cdb4: 83 ec 0c sub $0xc,%esp
10cdb7: 56 push %esi
10cdb8: e8 37 48 00 00 call 1115f4 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
10cdbd: 83 c4 10 add $0x10,%esp
10cdc0: 85 c0 test %eax,%eax
10cdc2: 74 e4 je 10cda8 <_Objects_Get_information+0x10>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
10cdc4: 0f b7 db movzwl %bx,%ebx
10cdc7: 39 d8 cmp %ebx,%eax
10cdc9: 72 dd jb 10cda8 <_Objects_Get_information+0x10>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10cdcb: 8b 14 b5 28 75 12 00 mov 0x127528(,%esi,4),%edx
return NULL;
10cdd2: 31 c0 xor %eax,%eax
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10cdd4: 85 d2 test %edx,%edx
10cdd6: 74 d2 je 10cdaa <_Objects_Get_information+0x12><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
10cdd8: 8b 04 9a mov (%edx,%ebx,4),%eax
if ( !info )
10cddb: 85 c0 test %eax,%eax
10cddd: 74 cb je 10cdaa <_Objects_Get_information+0x12><== NEVER TAKEN
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
return NULL;
10cddf: 31 d2 xor %edx,%edx
10cde1: 66 83 78 10 00 cmpw $0x0,0x10(%eax)
10cde6: 0f 95 c2 setne %dl
10cde9: f7 da neg %edx
10cdeb: 21 d0 and %edx,%eax
10cded: eb bb jmp 10cdaa <_Objects_Get_information+0x12>
0010cdf0 <_Objects_Get_isr_disable>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location,
ISR_Level *level_p
)
{
10cdf0: 55 push %ebp
10cdf1: 89 e5 mov %esp,%ebp
10cdf3: 56 push %esi
10cdf4: 53 push %ebx
10cdf5: 8b 55 08 mov 0x8(%ebp),%edx
10cdf8: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Control *the_object;
uint32_t index;
ISR_Level level;
index = id - information->minimum_id + 1;
10cdfb: b8 01 00 00 00 mov $0x1,%eax
10ce00: 2b 42 08 sub 0x8(%edx),%eax
10ce03: 03 45 0c add 0xc(%ebp),%eax
_ISR_Disable( level );
10ce06: 9c pushf
10ce07: fa cli
10ce08: 5e pop %esi
if ( information->maximum >= index ) {
10ce09: 0f b7 4a 10 movzwl 0x10(%edx),%ecx
10ce0d: 39 c8 cmp %ecx,%eax
10ce0f: 77 1b ja 10ce2c <_Objects_Get_isr_disable+0x3c>
if ( (the_object = information->local_table[ index ]) != NULL ) {
10ce11: 8b 52 1c mov 0x1c(%edx),%edx
10ce14: 8b 04 82 mov (%edx,%eax,4),%eax
10ce17: 85 c0 test %eax,%eax
10ce19: 74 21 je 10ce3c <_Objects_Get_isr_disable+0x4c>
*location = OBJECTS_LOCAL;
10ce1b: c7 03 00 00 00 00 movl $0x0,(%ebx)
*level_p = level;
10ce21: 8b 55 14 mov 0x14(%ebp),%edx
10ce24: 89 32 mov %esi,(%edx)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
#endif
}
10ce26: 5b pop %ebx
10ce27: 5e pop %esi
10ce28: c9 leave
10ce29: c3 ret
10ce2a: 66 90 xchg %ax,%ax
}
_ISR_Enable( level );
*location = OBJECTS_ERROR;
return NULL;
}
_ISR_Enable( level );
10ce2c: 56 push %esi
10ce2d: 9d popf
*location = OBJECTS_ERROR;
10ce2e: c7 03 01 00 00 00 movl $0x1,(%ebx)
#if defined(RTEMS_MULTIPROCESSING)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
10ce34: 31 c0 xor %eax,%eax
#endif
}
10ce36: 5b pop %ebx
10ce37: 5e pop %esi
10ce38: c9 leave
10ce39: c3 ret
10ce3a: 66 90 xchg %ax,%ax
if ( (the_object = information->local_table[ index ]) != NULL ) {
*location = OBJECTS_LOCAL;
*level_p = level;
return the_object;
}
_ISR_Enable( level );
10ce3c: 56 push %esi
10ce3d: 9d popf
*location = OBJECTS_ERROR;
10ce3e: c7 03 01 00 00 00 movl $0x1,(%ebx)
return NULL;
10ce44: eb e0 jmp 10ce26 <_Objects_Get_isr_disable+0x36>
0010e4bc <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
10e4bc: 55 push %ebp
10e4bd: 89 e5 mov %esp,%ebp
10e4bf: 57 push %edi
10e4c0: 56 push %esi
10e4c1: 53 push %ebx
10e4c2: 83 ec 2c sub $0x2c,%esp
10e4c5: 8b 55 08 mov 0x8(%ebp),%edx
10e4c8: 8b 75 0c mov 0xc(%ebp),%esi
10e4cb: 8b 5d 10 mov 0x10(%ebp),%ebx
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
10e4ce: 85 f6 test %esi,%esi
10e4d0: 75 0e jne 10e4e0 <_Objects_Get_name_as_string+0x24>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
10e4d2: 31 db xor %ebx,%ebx
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
10e4d4: 89 d8 mov %ebx,%eax
10e4d6: 8d 65 f4 lea -0xc(%ebp),%esp
10e4d9: 5b pop %ebx
10e4da: 5e pop %esi
10e4db: 5f pop %edi
10e4dc: c9 leave
10e4dd: c3 ret
10e4de: 66 90 xchg %ax,%ax
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
10e4e0: 85 db test %ebx,%ebx
10e4e2: 74 f0 je 10e4d4 <_Objects_Get_name_as_string+0x18>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e4e4: 85 d2 test %edx,%edx
10e4e6: 75 08 jne 10e4f0 <_Objects_Get_name_as_string+0x34>
10e4e8: a1 78 29 13 00 mov 0x132978,%eax
10e4ed: 8b 50 08 mov 0x8(%eax),%edx
information = _Objects_Get_information_id( tmpId );
10e4f0: 83 ec 0c sub $0xc,%esp
10e4f3: 52 push %edx
10e4f4: 89 55 cc mov %edx,-0x34(%ebp)
10e4f7: e8 f0 fe ff ff call 10e3ec <_Objects_Get_information_id>
10e4fc: 89 c7 mov %eax,%edi
if ( !information )
10e4fe: 83 c4 10 add $0x10,%esp
10e501: 85 c0 test %eax,%eax
10e503: 8b 55 cc mov -0x34(%ebp),%edx
10e506: 74 ca je 10e4d2 <_Objects_Get_name_as_string+0x16>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
10e508: 51 push %ecx
10e509: 8d 45 e4 lea -0x1c(%ebp),%eax
10e50c: 50 push %eax
10e50d: 52 push %edx
10e50e: 57 push %edi
10e50f: e8 90 00 00 00 call 10e5a4 <_Objects_Get>
switch ( location ) {
10e514: 83 c4 10 add $0x10,%esp
10e517: 8b 55 e4 mov -0x1c(%ebp),%edx
10e51a: 85 d2 test %edx,%edx
10e51c: 75 b4 jne 10e4d2 <_Objects_Get_name_as_string+0x16>
return NULL;
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
10e51e: 80 7f 38 00 cmpb $0x0,0x38(%edi)
10e522: 74 54 je 10e578 <_Objects_Get_name_as_string+0xbc>
s = the_object->name.name_p;
10e524: 8b 78 0c mov 0xc(%eax),%edi
lname[ 4 ] = '\0';
s = lname;
}
d = name;
if ( s ) {
10e527: 85 ff test %edi,%edi
10e529: 74 74 je 10e59f <_Objects_Get_name_as_string+0xe3>
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e52b: 4e dec %esi
10e52c: 89 75 d4 mov %esi,-0x2c(%ebp)
10e52f: 74 6e je 10e59f <_Objects_Get_name_as_string+0xe3><== NEVER TAKEN
10e531: 8a 07 mov (%edi),%al
10e533: 84 c0 test %al,%al
10e535: 74 68 je 10e59f <_Objects_Get_name_as_string+0xe3>
10e537: 89 d9 mov %ebx,%ecx
10e539: 31 d2 xor %edx,%edx
10e53b: 89 5d d0 mov %ebx,-0x30(%ebp)
10e53e: eb 07 jmp 10e547 <_Objects_Get_name_as_string+0x8b>
10e540: 8a 04 17 mov (%edi,%edx,1),%al
10e543: 84 c0 test %al,%al
10e545: 74 21 je 10e568 <_Objects_Get_name_as_string+0xac>
*d = (isprint((unsigned char)*s)) ? *s : '*';
10e547: 0f b6 d8 movzbl %al,%ebx
10e54a: 8b 35 88 82 12 00 mov 0x128288,%esi
10e550: 0f be 5c 1e 01 movsbl 0x1(%esi,%ebx,1),%ebx
10e555: 81 e3 97 00 00 00 and $0x97,%ebx
10e55b: 75 02 jne 10e55f <_Objects_Get_name_as_string+0xa3>
10e55d: b0 2a mov $0x2a,%al
10e55f: 88 01 mov %al,(%ecx)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e561: 42 inc %edx
10e562: 41 inc %ecx
10e563: 3b 55 d4 cmp -0x2c(%ebp),%edx
10e566: 72 d8 jb 10e540 <_Objects_Get_name_as_string+0x84>
10e568: 8b 5d d0 mov -0x30(%ebp),%ebx
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
10e56b: c6 01 00 movb $0x0,(%ecx)
_Thread_Enable_dispatch();
10e56e: e8 e5 0a 00 00 call 10f058 <_Thread_Enable_dispatch>
return name;
10e573: e9 5c ff ff ff jmp 10e4d4 <_Objects_Get_name_as_string+0x18>
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
10e578: 8b 40 0c mov 0xc(%eax),%eax
lname[ 0 ] = (u32_name >> 24) & 0xff;
10e57b: 89 c2 mov %eax,%edx
10e57d: c1 ea 18 shr $0x18,%edx
10e580: 88 55 df mov %dl,-0x21(%ebp)
lname[ 1 ] = (u32_name >> 16) & 0xff;
10e583: 89 c2 mov %eax,%edx
10e585: c1 ea 10 shr $0x10,%edx
10e588: 88 55 e0 mov %dl,-0x20(%ebp)
lname[ 2 ] = (u32_name >> 8) & 0xff;
10e58b: 89 c2 mov %eax,%edx
10e58d: c1 ea 08 shr $0x8,%edx
10e590: 88 55 e1 mov %dl,-0x1f(%ebp)
lname[ 3 ] = (u32_name >> 0) & 0xff;
10e593: 88 45 e2 mov %al,-0x1e(%ebp)
lname[ 4 ] = '\0';
10e596: c6 45 e3 00 movb $0x0,-0x1d(%ebp)
s = lname;
10e59a: 8d 7d df lea -0x21(%ebp),%edi
10e59d: eb 8c jmp 10e52b <_Objects_Get_name_as_string+0x6f>
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e59f: 89 d9 mov %ebx,%ecx
10e5a1: eb c8 jmp 10e56b <_Objects_Get_name_as_string+0xaf>
0010cf90 <_Objects_Get_next>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location_p,
Objects_Id *next_id_p
)
{
10cf90: 55 push %ebp
10cf91: 89 e5 mov %esp,%ebp
10cf93: 57 push %edi
10cf94: 56 push %esi
10cf95: 53 push %ebx
10cf96: 83 ec 0c sub $0xc,%esp
10cf99: 8b 5d 08 mov 0x8(%ebp),%ebx
10cf9c: 8b 75 0c mov 0xc(%ebp),%esi
10cf9f: 8b 7d 10 mov 0x10(%ebp),%edi
Objects_Control *object;
Objects_Id next_id;
if ( !information )
10cfa2: 85 db test %ebx,%ebx
10cfa4: 75 0a jne 10cfb0 <_Objects_Get_next+0x20>
if ( !location_p )
return NULL;
if ( !next_id_p )
return NULL;
10cfa6: 31 c0 xor %eax,%eax
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
10cfa8: 8d 65 f4 lea -0xc(%ebp),%esp
10cfab: 5b pop %ebx
10cfac: 5e pop %esi
10cfad: 5f pop %edi
10cfae: c9 leave
10cfaf: c3 ret
Objects_Id next_id;
if ( !information )
return NULL;
if ( !location_p )
10cfb0: 85 ff test %edi,%edi
10cfb2: 74 f2 je 10cfa6 <_Objects_Get_next+0x16>
return NULL;
if ( !next_id_p )
10cfb4: 8b 45 14 mov 0x14(%ebp),%eax
10cfb7: 85 c0 test %eax,%eax
10cfb9: 74 eb je 10cfa6 <_Objects_Get_next+0x16>
return NULL;
if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
10cfbb: 66 85 f6 test %si,%si
10cfbe: 75 04 jne 10cfc4 <_Objects_Get_next+0x34>
next_id = information->minimum_id;
10cfc0: 8b 73 08 mov 0x8(%ebx),%esi
10cfc3: 90 nop
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
10cfc4: 66 39 73 10 cmp %si,0x10(%ebx)
10cfc8: 72 22 jb 10cfec <_Objects_Get_next+0x5c>
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
10cfca: 51 push %ecx
10cfcb: 57 push %edi
10cfcc: 56 push %esi
10cfcd: 53 push %ebx
10cfce: e8 2d 00 00 00 call 10d000 <_Objects_Get>
next_id++;
10cfd3: 46 inc %esi
} while (*location_p != OBJECTS_LOCAL);
10cfd4: 83 c4 10 add $0x10,%esp
10cfd7: 8b 17 mov (%edi),%edx
10cfd9: 85 d2 test %edx,%edx
10cfdb: 75 e7 jne 10cfc4 <_Objects_Get_next+0x34>
*next_id_p = next_id;
10cfdd: 8b 55 14 mov 0x14(%ebp),%edx
10cfe0: 89 32 mov %esi,(%edx)
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
10cfe2: 8d 65 f4 lea -0xc(%ebp),%esp
10cfe5: 5b pop %ebx
10cfe6: 5e pop %esi
10cfe7: 5f pop %edi
10cfe8: c9 leave
10cfe9: c3 ret
10cfea: 66 90 xchg %ax,%ax
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
{
*location_p = OBJECTS_ERROR;
10cfec: c7 07 01 00 00 00 movl $0x1,(%edi)
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
10cff2: 8b 45 14 mov 0x14(%ebp),%eax
10cff5: c7 00 ff ff ff ff movl $0xffffffff,(%eax)
return 0;
10cffb: 31 c0 xor %eax,%eax
10cffd: eb a9 jmp 10cfa8 <_Objects_Get_next+0x18>
0011b28c <_Objects_Get_no_protection>:
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
11b28c: 55 push %ebp
11b28d: 89 e5 mov %esp,%ebp
11b28f: 53 push %ebx
11b290: 8b 55 08 mov 0x8(%ebp),%edx
11b293: 8b 5d 10 mov 0x10(%ebp),%ebx
/*
* 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;
11b296: b8 01 00 00 00 mov $0x1,%eax
11b29b: 2b 42 08 sub 0x8(%edx),%eax
11b29e: 03 45 0c add 0xc(%ebp),%eax
if ( information->maximum >= index ) {
11b2a1: 0f b7 4a 10 movzwl 0x10(%edx),%ecx
11b2a5: 39 c8 cmp %ecx,%eax
11b2a7: 77 13 ja 11b2bc <_Objects_Get_no_protection+0x30>
if ( (the_object = information->local_table[ index ]) != NULL ) {
11b2a9: 8b 52 1c mov 0x1c(%edx),%edx
11b2ac: 8b 04 82 mov (%edx,%eax,4),%eax
11b2af: 85 c0 test %eax,%eax
11b2b1: 74 09 je 11b2bc <_Objects_Get_no_protection+0x30><== NEVER TAKEN
*location = OBJECTS_LOCAL;
11b2b3: c7 03 00 00 00 00 movl $0x0,(%ebx)
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
return NULL;
}
11b2b9: 5b pop %ebx
11b2ba: c9 leave
11b2bb: c3 ret
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
11b2bc: c7 03 01 00 00 00 movl $0x1,(%ebx)
return NULL;
11b2c2: 31 c0 xor %eax,%eax
}
11b2c4: 5b pop %ebx
11b2c5: c9 leave
11b2c6: c3 ret
0010e0e0 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
10e0e0: 55 push %ebp
10e0e1: 89 e5 mov %esp,%ebp
10e0e3: 83 ec 18 sub $0x18,%esp
10e0e6: 8b 55 08 mov 0x8(%ebp),%edx
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e0e9: 85 d2 test %edx,%edx
10e0eb: 75 08 jne 10e0f5 <_Objects_Id_to_name+0x15>
10e0ed: a1 58 a7 12 00 mov 0x12a758,%eax
10e0f2: 8b 50 08 mov 0x8(%eax),%edx
10e0f5: 89 d0 mov %edx,%eax
10e0f7: c1 e8 18 shr $0x18,%eax
10e0fa: 83 e0 07 and $0x7,%eax
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
10e0fd: 8d 48 ff lea -0x1(%eax),%ecx
10e100: 83 f9 02 cmp $0x2,%ecx
10e103: 77 1d ja 10e122 <_Objects_Id_to_name+0x42>
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
10e105: 8b 04 85 48 a1 12 00 mov 0x12a148(,%eax,4),%eax
10e10c: 85 c0 test %eax,%eax
10e10e: 74 12 je 10e122 <_Objects_Id_to_name+0x42>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10e110: 89 d1 mov %edx,%ecx
10e112: c1 e9 1b shr $0x1b,%ecx
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
10e115: 8b 04 88 mov (%eax,%ecx,4),%eax
if ( !information )
10e118: 85 c0 test %eax,%eax
10e11a: 74 06 je 10e122 <_Objects_Id_to_name+0x42><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
10e11c: 80 78 38 00 cmpb $0x0,0x38(%eax)
10e120: 74 0a je 10e12c <_Objects_Id_to_name+0x4c><== ALWAYS TAKEN
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
10e122: b8 03 00 00 00 mov $0x3,%eax
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
10e127: c9 leave
10e128: c3 ret
10e129: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
10e12c: 51 push %ecx
10e12d: 8d 4d f4 lea -0xc(%ebp),%ecx
10e130: 51 push %ecx
10e131: 52 push %edx
10e132: 50 push %eax
10e133: e8 40 ff ff ff call 10e078 <_Objects_Get>
if ( !the_object )
10e138: 83 c4 10 add $0x10,%esp
10e13b: 85 c0 test %eax,%eax
10e13d: 74 e3 je 10e122 <_Objects_Id_to_name+0x42>
return OBJECTS_INVALID_ID;
*name = the_object->name;
10e13f: 8b 50 0c mov 0xc(%eax),%edx
10e142: 8b 45 0c mov 0xc(%ebp),%eax
10e145: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e147: e8 50 0a 00 00 call 10eb9c <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10e14c: 31 c0 xor %eax,%eax
}
10e14e: c9 leave
10e14f: c3 ret
0010ceb0 <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
10ceb0: 55 push %ebp
10ceb1: 89 e5 mov %esp,%ebp
10ceb3: 57 push %edi
10ceb4: 56 push %esi
10ceb5: 53 push %ebx
10ceb6: 83 ec 0c sub $0xc,%esp
10ceb9: 8b 45 08 mov 0x8(%ebp),%eax
10cebc: 8b 55 0c mov 0xc(%ebp),%edx
10cebf: 8b 5d 10 mov 0x10(%ebp),%ebx
10cec2: 8b 75 20 mov 0x20(%ebp),%esi
10cec5: 0f b7 7d 18 movzwl 0x18(%ebp),%edi
uint32_t maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
10cec9: 89 10 mov %edx,(%eax)
information->the_class = the_class;
10cecb: 66 89 58 04 mov %bx,0x4(%eax)
information->size = size;
10cecf: 89 78 18 mov %edi,0x18(%eax)
information->local_table = 0;
10ced2: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
information->inactive_per_block = 0;
10ced9: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
information->object_blocks = 0;
10cee0: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
information->inactive = 0;
10cee7: 66 c7 40 2c 00 00 movw $0x0,0x2c(%eax)
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
information->is_string = is_string;
10ceed: 8b 7d 1c mov 0x1c(%ebp),%edi
10cef0: 89 f9 mov %edi,%ecx
10cef2: 88 48 38 mov %cl,0x38(%eax)
/*
* Set the maximum value to 0. It will be updated when objects are
* added to the inactive set from _Objects_Extend_information()
*/
information->maximum = 0;
10cef5: 66 c7 40 10 00 00 movw $0x0,0x10(%eax)
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
10cefb: 0f b7 db movzwl %bx,%ebx
10cefe: 8b 3c 95 28 75 12 00 mov 0x127528(,%edx,4),%edi
10cf05: 89 04 9f mov %eax,(%edi,%ebx,4)
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
10cf08: 8b 7d 14 mov 0x14(%ebp),%edi
10cf0b: c1 ef 1f shr $0x1f,%edi
_Objects_Information_table[ the_api ][ the_class ] = information;
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
10cf0e: 89 f9 mov %edi,%ecx
10cf10: 88 48 12 mov %cl,0x12(%eax)
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
10cf13: 8b 4d 14 mov 0x14(%ebp),%ecx
10cf16: 81 e1 ff ff ff 7f and $0x7fffffff,%ecx
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
10cf1c: 85 ff test %edi,%edi
10cf1e: 74 04 je 10cf24 <_Objects_Initialize_information+0x74>
10cf20: 85 c9 test %ecx,%ecx
10cf22: 74 67 je 10cf8b <_Objects_Initialize_information+0xdb><== NEVER TAKEN
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
10cf24: 66 89 48 14 mov %cx,0x14(%eax)
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
10cf28: c7 40 1c c4 71 12 00 movl $0x1271c4,0x1c(%eax)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cf2f: c1 e2 18 shl $0x18,%edx
10cf32: 81 ca 00 00 01 00 or $0x10000,%edx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cf38: c1 e3 1b shl $0x1b,%ebx
10cf3b: 09 da or %ebx,%edx
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
10cf3d: 31 db xor %ebx,%ebx
10cf3f: 85 c9 test %ecx,%ecx
10cf41: 0f 95 c3 setne %bl
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cf44: 09 da or %ebx,%edx
10cf46: 89 50 08 mov %edx,0x8(%eax)
/*
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
10cf49: f7 c6 03 00 00 00 test $0x3,%esi
10cf4f: 75 23 jne 10cf74 <_Objects_Initialize_information+0xc4>
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
10cf51: 66 89 70 3a mov %si,0x3a(%eax)
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10cf55: 8d 50 24 lea 0x24(%eax),%edx
10cf58: 89 50 20 mov %edx,0x20(%eax)
head->next = tail;
head->previous = NULL;
10cf5b: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10cf62: 8d 50 20 lea 0x20(%eax),%edx
10cf65: 89 50 28 mov %edx,0x28(%eax)
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
10cf68: 85 c9 test %ecx,%ecx
10cf6a: 75 10 jne 10cf7c <_Objects_Initialize_information+0xcc>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
10cf6c: 8d 65 f4 lea -0xc(%ebp),%esp
10cf6f: 5b pop %ebx
10cf70: 5e pop %esi
10cf71: 5f pop %edi
10cf72: c9 leave
10cf73: c3 ret
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
10cf74: 83 c6 04 add $0x4,%esi
10cf77: 83 e6 fc and $0xfffffffc,%esi
10cf7a: eb d5 jmp 10cf51 <_Objects_Initialize_information+0xa1>
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
10cf7c: 89 45 08 mov %eax,0x8(%ebp)
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
10cf7f: 8d 65 f4 lea -0xc(%ebp),%esp
10cf82: 5b pop %ebx
10cf83: 5e pop %esi
10cf84: 5f pop %edi
10cf85: c9 leave
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
10cf86: e9 a9 fa ff ff jmp 10ca34 <_Objects_Extend_information>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
10cf8b: 50 push %eax
10cf8c: 6a 13 push $0x13
10cf8e: 6a 01 push $0x1
10cf90: 6a 00 push $0x0
10cf92: e8 69 f9 ff ff call 10c900 <_Internal_error_Occurred>
00117950 <_Objects_Name_to_id_string>:
Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string(
Objects_Information *information,
const char *name,
Objects_Id *id
)
{
117950: 55 push %ebp
117951: 89 e5 mov %esp,%ebp
117953: 57 push %edi
117954: 56 push %esi
117955: 53 push %ebx
117956: 83 ec 1c sub $0x1c,%esp
117959: 8b 7d 08 mov 0x8(%ebp),%edi
Objects_Control *the_object;
uint32_t index;
/* ASSERT: information->is_string == true */
if ( !id )
11795c: 8b 5d 10 mov 0x10(%ebp),%ebx
11795f: 85 db test %ebx,%ebx
117961: 74 75 je 1179d8 <_Objects_Name_to_id_string+0x88>
return OBJECTS_INVALID_ADDRESS;
if ( !name )
117963: 8b 4d 0c mov 0xc(%ebp),%ecx
117966: 85 c9 test %ecx,%ecx
117968: 74 4b je 1179b5 <_Objects_Name_to_id_string+0x65>
return OBJECTS_INVALID_NAME;
if ( information->maximum != 0 ) {
11796a: 8b 47 10 mov 0x10(%edi),%eax
11796d: 66 85 c0 test %ax,%ax
117970: 74 43 je 1179b5 <_Objects_Name_to_id_string+0x65>
for ( index = 1; index <= information->maximum; index++ ) {
117972: 0f b7 c0 movzwl %ax,%eax
117975: 89 45 e4 mov %eax,-0x1c(%ebp)
117978: 8b 47 1c mov 0x1c(%edi),%eax
11797b: bb 01 00 00 00 mov $0x1,%ebx
117980: 89 7d e0 mov %edi,-0x20(%ebp)
117983: 89 c7 mov %eax,%edi
117985: 8d 76 00 lea 0x0(%esi),%esi
the_object = information->local_table[ index ];
117988: 8b 34 9f mov (%edi,%ebx,4),%esi
if ( !the_object )
11798b: 85 f6 test %esi,%esi
11798d: 74 20 je 1179af <_Objects_Name_to_id_string+0x5f>
continue;
if ( !the_object->name.name_p )
11798f: 8b 46 0c mov 0xc(%esi),%eax
117992: 85 c0 test %eax,%eax
117994: 74 19 je 1179af <_Objects_Name_to_id_string+0x5f>
continue;
if (!strncmp( name, the_object->name.name_p, information->name_length)) {
117996: 52 push %edx
117997: 8b 4d e0 mov -0x20(%ebp),%ecx
11799a: 0f b7 51 3a movzwl 0x3a(%ecx),%edx
11799e: 52 push %edx
11799f: 50 push %eax
1179a0: ff 75 0c pushl 0xc(%ebp)
1179a3: e8 84 35 00 00 call 11af2c <strncmp>
1179a8: 83 c4 10 add $0x10,%esp
1179ab: 85 c0 test %eax,%eax
1179ad: 74 15 je 1179c4 <_Objects_Name_to_id_string+0x74>
if ( !name )
return OBJECTS_INVALID_NAME;
if ( information->maximum != 0 ) {
for ( index = 1; index <= information->maximum; index++ ) {
1179af: 43 inc %ebx
1179b0: 3b 5d e4 cmp -0x1c(%ebp),%ebx
1179b3: 76 d3 jbe 117988 <_Objects_Name_to_id_string+0x38>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
}
}
return OBJECTS_INVALID_NAME;
1179b5: b8 01 00 00 00 mov $0x1,%eax
}
1179ba: 8d 65 f4 lea -0xc(%ebp),%esp
1179bd: 5b pop %ebx
1179be: 5e pop %esi
1179bf: 5f pop %edi
1179c0: c9 leave
1179c1: c3 ret
1179c2: 66 90 xchg %ax,%ax
if ( !the_object->name.name_p )
continue;
if (!strncmp( name, the_object->name.name_p, information->name_length)) {
*id = the_object->id;
1179c4: 8b 46 08 mov 0x8(%esi),%eax
1179c7: 8b 55 10 mov 0x10(%ebp),%edx
1179ca: 89 02 mov %eax,(%edx)
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
1179cc: 31 c0 xor %eax,%eax
}
}
}
return OBJECTS_INVALID_NAME;
}
1179ce: 8d 65 f4 lea -0xc(%ebp),%esp
1179d1: 5b pop %ebx
1179d2: 5e pop %esi
1179d3: 5f pop %edi
1179d4: c9 leave
1179d5: c3 ret
1179d6: 66 90 xchg %ax,%ax
uint32_t index;
/* ASSERT: information->is_string == true */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
1179d8: b8 02 00 00 00 mov $0x2,%eax
}
}
}
return OBJECTS_INVALID_NAME;
}
1179dd: 8d 65 f4 lea -0xc(%ebp),%esp
1179e0: 5b pop %ebx
1179e1: 5e pop %esi
1179e2: 5f pop %edi
1179e3: c9 leave
1179e4: c3 ret
0010cfcc <_Objects_Name_to_id_u32>:
Objects_Information *information,
uint32_t name,
uint32_t node,
Objects_Id *id
)
{
10cfcc: 55 push %ebp
10cfcd: 89 e5 mov %esp,%ebp
10cfcf: 57 push %edi
10cfd0: 56 push %esi
10cfd1: 53 push %ebx
10cfd2: 8b 45 08 mov 0x8(%ebp),%eax
10cfd5: 8b 4d 0c mov 0xc(%ebp),%ecx
10cfd8: 8b 55 10 mov 0x10(%ebp),%edx
10cfdb: 8b 7d 14 mov 0x14(%ebp),%edi
Objects_Name name_for_mp;
#endif
/* ASSERT: information->is_string == false */
if ( !id )
10cfde: 85 ff test %edi,%edi
10cfe0: 74 56 je 10d038 <_Objects_Name_to_id_u32+0x6c>
return OBJECTS_INVALID_ADDRESS;
if ( name == 0 )
10cfe2: 85 c9 test %ecx,%ecx
10cfe4: 74 08 je 10cfee <_Objects_Name_to_id_u32+0x22>
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
10cfe6: 8b 70 10 mov 0x10(%eax),%esi
10cfe9: 66 85 f6 test %si,%si
10cfec: 75 0a jne 10cff8 <_Objects_Name_to_id_u32+0x2c>
return OBJECTS_INVALID_NAME;
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
10cfee: b8 01 00 00 00 mov $0x1,%eax
#endif
}
10cff3: 5b pop %ebx
10cff4: 5e pop %esi
10cff5: 5f pop %edi
10cff6: c9 leave
10cff7: c3 ret
if ( name == 0 )
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
10cff8: 85 d2 test %edx,%edx
10cffa: 75 20 jne 10d01c <_Objects_Name_to_id_u32+0x50>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
10cffc: 0f b7 f6 movzwl %si,%esi
10cfff: 8b 58 1c mov 0x1c(%eax),%ebx
10d002: b8 01 00 00 00 mov $0x1,%eax
10d007: 90 nop
the_object = information->local_table[ index ];
10d008: 8b 14 83 mov (%ebx,%eax,4),%edx
if ( !the_object )
10d00b: 85 d2 test %edx,%edx
10d00d: 74 05 je 10d014 <_Objects_Name_to_id_u32+0x48>
continue;
if ( name == the_object->name.name_u32 ) {
10d00f: 39 4a 0c cmp %ecx,0xc(%edx)
10d012: 74 18 je 10d02c <_Objects_Name_to_id_u32+0x60>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
10d014: 40 inc %eax
10d015: 39 c6 cmp %eax,%esi
10d017: 73 ef jae 10d008 <_Objects_Name_to_id_u32+0x3c>
10d019: eb d3 jmp 10cfee <_Objects_Name_to_id_u32+0x22>
10d01b: 90 nop
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
(node == OBJECTS_SEARCH_ALL_NODES ||
10d01c: 81 fa ff ff ff 7f cmp $0x7fffffff,%edx
10d022: 74 d8 je 10cffc <_Objects_Name_to_id_u32+0x30>
node == OBJECTS_SEARCH_LOCAL_NODE ||
10d024: 4a dec %edx
10d025: 75 c7 jne 10cfee <_Objects_Name_to_id_u32+0x22>
10d027: eb d3 jmp 10cffc <_Objects_Name_to_id_u32+0x30>
10d029: 8d 76 00 lea 0x0(%esi),%esi
the_object = information->local_table[ index ];
if ( !the_object )
continue;
if ( name == the_object->name.name_u32 ) {
*id = the_object->id;
10d02c: 8b 42 08 mov 0x8(%edx),%eax
10d02f: 89 07 mov %eax,(%edi)
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10d031: 31 c0 xor %eax,%eax
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
#endif
}
10d033: 5b pop %ebx
10d034: 5e pop %esi
10d035: 5f pop %edi
10d036: c9 leave
10d037: c3 ret
#endif
/* ASSERT: information->is_string == false */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
10d038: b8 02 00 00 00 mov $0x2,%eax
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
#endif
}
10d03d: 5b pop %ebx
10d03e: 5e pop %esi
10d03f: 5f pop %edi
10d040: c9 leave
10d041: c3 ret
0010d6b0 <_Objects_Set_name>:
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
10d6b0: 55 push %ebp
10d6b1: 89 e5 mov %esp,%ebp
10d6b3: 57 push %edi
10d6b4: 56 push %esi
10d6b5: 53 push %ebx
10d6b6: 83 ec 14 sub $0x14,%esp
10d6b9: 8b 7d 08 mov 0x8(%ebp),%edi
10d6bc: 8b 5d 10 mov 0x10(%ebp),%ebx
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
10d6bf: 0f b7 47 3a movzwl 0x3a(%edi),%eax
10d6c3: 50 push %eax
10d6c4: 53 push %ebx
10d6c5: e8 2e 7a 00 00 call 1150f8 <strnlen>
10d6ca: 89 c6 mov %eax,%esi
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
10d6cc: 83 c4 10 add $0x10,%esp
10d6cf: 80 7f 38 00 cmpb $0x0,0x38(%edi)
10d6d3: 75 57 jne 10d72c <_Objects_Set_name+0x7c>
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d6d5: 0f be 13 movsbl (%ebx),%edx
10d6d8: c1 e2 18 shl $0x18,%edx
10d6db: 83 f8 01 cmp $0x1,%eax
10d6de: 76 38 jbe 10d718 <_Objects_Set_name+0x68>
10d6e0: 0f be 43 01 movsbl 0x1(%ebx),%eax
10d6e4: c1 e0 10 shl $0x10,%eax
10d6e7: 09 d0 or %edx,%eax
10d6e9: 83 fe 02 cmp $0x2,%esi
10d6ec: 74 31 je 10d71f <_Objects_Set_name+0x6f>
10d6ee: 0f be 53 02 movsbl 0x2(%ebx),%edx
10d6f2: c1 e2 08 shl $0x8,%edx
10d6f5: 09 c2 or %eax,%edx
10d6f7: 83 fe 03 cmp $0x3,%esi
10d6fa: 0f 84 88 00 00 00 je 10d788 <_Objects_Set_name+0xd8>
10d700: 0f be 43 03 movsbl 0x3(%ebx),%eax
10d704: 09 c2 or %eax,%edx
10d706: 8b 45 0c mov 0xc(%ebp),%eax
10d709: 89 50 0c mov %edx,0xc(%eax)
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
10d70c: b0 01 mov $0x1,%al
}
10d70e: 8d 65 f4 lea -0xc(%ebp),%esp
10d711: 5b pop %ebx
10d712: 5e pop %esi
10d713: 5f pop %edi
10d714: c9 leave
10d715: c3 ret
10d716: 66 90 xchg %ax,%ax
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d718: 89 d0 mov %edx,%eax
10d71a: 0d 00 00 20 00 or $0x200000,%eax
10d71f: 89 c2 mov %eax,%edx
10d721: 80 ce 20 or $0x20,%dh
10d724: b8 20 00 00 00 mov $0x20,%eax
10d729: eb d9 jmp 10d704 <_Objects_Set_name+0x54>
10d72b: 90 nop
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
10d72c: 83 ec 0c sub $0xc,%esp
10d72f: 8d 40 01 lea 0x1(%eax),%eax
10d732: 50 push %eax
10d733: e8 78 19 00 00 call 10f0b0 <_Workspace_Allocate>
10d738: 89 c7 mov %eax,%edi
if ( !d )
10d73a: 83 c4 10 add $0x10,%esp
10d73d: 85 c0 test %eax,%eax
10d73f: 74 43 je 10d784 <_Objects_Set_name+0xd4>
return false;
if ( the_object->name.name_p ) {
10d741: 8b 55 0c mov 0xc(%ebp),%edx
10d744: 8b 42 0c mov 0xc(%edx),%eax
10d747: 85 c0 test %eax,%eax
10d749: 74 16 je 10d761 <_Objects_Set_name+0xb1>
_Workspace_Free( (void *)the_object->name.name_p );
10d74b: 83 ec 0c sub $0xc,%esp
10d74e: 50 push %eax
10d74f: e8 78 19 00 00 call 10f0cc <_Workspace_Free>
the_object->name.name_p = NULL;
10d754: 8b 45 0c mov 0xc(%ebp),%eax
10d757: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
10d75e: 83 c4 10 add $0x10,%esp
}
strncpy( d, name, length );
10d761: 50 push %eax
10d762: 56 push %esi
10d763: 53 push %ebx
10d764: 57 push %edi
10d765: e8 12 79 00 00 call 11507c <strncpy>
d[length] = '\0';
10d76a: c6 04 37 00 movb $0x0,(%edi,%esi,1)
the_object->name.name_p = d;
10d76e: 8b 55 0c mov 0xc(%ebp),%edx
10d771: 89 7a 0c mov %edi,0xc(%edx)
10d774: 83 c4 10 add $0x10,%esp
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
10d777: b0 01 mov $0x1,%al
}
10d779: 8d 65 f4 lea -0xc(%ebp),%esp
10d77c: 5b pop %ebx
10d77d: 5e pop %esi
10d77e: 5f pop %edi
10d77f: c9 leave
10d780: c3 ret
10d781: 8d 76 00 lea 0x0(%esi),%esi
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
if ( !d )
return false;
10d784: 31 c0 xor %eax,%eax
10d786: eb 86 jmp 10d70e <_Objects_Set_name+0x5e>
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d788: b8 20 00 00 00 mov $0x20,%eax
10d78d: e9 72 ff ff ff jmp 10d704 <_Objects_Set_name+0x54>
0010d044 <_Objects_Shrink_information>:
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
10d044: 55 push %ebp
10d045: 89 e5 mov %esp,%ebp
10d047: 57 push %edi
10d048: 56 push %esi
10d049: 53 push %ebx
10d04a: 83 ec 1c sub $0x1c,%esp
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
10d04d: 8b 45 08 mov 0x8(%ebp),%eax
10d050: 0f b7 58 08 movzwl 0x8(%eax),%ebx
block_count = (information->maximum - index_base) /
10d054: 0f b7 48 14 movzwl 0x14(%eax),%ecx
10d058: 0f b7 40 10 movzwl 0x10(%eax),%eax
10d05c: 29 d8 sub %ebx,%eax
10d05e: 31 d2 xor %edx,%edx
10d060: f7 f1 div %ecx
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
10d062: 85 c0 test %eax,%eax
10d064: 74 21 je 10d087 <_Objects_Shrink_information+0x43><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
10d066: 8b 55 08 mov 0x8(%ebp),%edx
10d069: 8b 7a 30 mov 0x30(%edx),%edi
10d06c: 3b 0f cmp (%edi),%ecx
10d06e: 74 1f je 10d08f <_Objects_Shrink_information+0x4b><== NEVER TAKEN
10d070: 31 d2 xor %edx,%edx
10d072: eb 0e jmp 10d082 <_Objects_Shrink_information+0x3e>
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
10d074: 01 cb add %ecx,%ebx
10d076: 8d 34 95 00 00 00 00 lea 0x0(,%edx,4),%esi
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
10d07d: 3b 0c 97 cmp (%edi,%edx,4),%ecx
10d080: 74 12 je 10d094 <_Objects_Shrink_information+0x50>
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
10d082: 42 inc %edx
10d083: 39 d0 cmp %edx,%eax
10d085: 77 ed ja 10d074 <_Objects_Shrink_information+0x30>
return;
}
index_base += information->allocation_size;
}
}
10d087: 8d 65 f4 lea -0xc(%ebp),%esp
10d08a: 5b pop %ebx
10d08b: 5e pop %esi
10d08c: 5f pop %edi
10d08d: c9 leave
10d08e: c3 ret
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
10d08f: 31 f6 xor %esi,%esi
10d091: 8d 76 00 lea 0x0(%esi),%esi
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
10d094: 8b 55 08 mov 0x8(%ebp),%edx
10d097: 8b 42 20 mov 0x20(%edx),%eax
10d09a: 89 75 e4 mov %esi,-0x1c(%ebp)
10d09d: eb 07 jmp 10d0a6 <_Objects_Shrink_information+0x62>
10d09f: 90 nop
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
10d0a0: 85 ff test %edi,%edi
10d0a2: 74 2c je 10d0d0 <_Objects_Shrink_information+0x8c>
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
10d0a4: 89 f8 mov %edi,%eax
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
do {
index = _Objects_Get_index( the_object->id );
10d0a6: 0f b7 50 08 movzwl 0x8(%eax),%edx
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
10d0aa: 8b 38 mov (%eax),%edi
if ((index >= index_base) &&
10d0ac: 39 da cmp %ebx,%edx
10d0ae: 72 f0 jb 10d0a0 <_Objects_Shrink_information+0x5c>
(index < (index_base + information->allocation_size))) {
10d0b0: 8b 75 08 mov 0x8(%ebp),%esi
10d0b3: 0f b7 4e 14 movzwl 0x14(%esi),%ecx
10d0b7: 8d 0c 0b lea (%ebx,%ecx,1),%ecx
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
10d0ba: 39 ca cmp %ecx,%edx
10d0bc: 73 e2 jae 10d0a0 <_Objects_Shrink_information+0x5c>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
10d0be: 83 ec 0c sub $0xc,%esp
10d0c1: 50 push %eax
10d0c2: e8 39 ef ff ff call 10c000 <_Chain_Extract>
10d0c7: 83 c4 10 add $0x10,%esp
}
}
while ( the_object );
10d0ca: 85 ff test %edi,%edi
10d0cc: 75 d6 jne 10d0a4 <_Objects_Shrink_information+0x60>
10d0ce: 66 90 xchg %ax,%ax
10d0d0: 8b 75 e4 mov -0x1c(%ebp),%esi
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
10d0d3: 83 ec 0c sub $0xc,%esp
10d0d6: 8b 55 08 mov 0x8(%ebp),%edx
10d0d9: 8b 42 34 mov 0x34(%edx),%eax
10d0dc: ff 34 30 pushl (%eax,%esi,1)
10d0df: e8 98 18 00 00 call 10e97c <_Workspace_Free>
information->object_blocks[ block ] = NULL;
10d0e4: 8b 55 08 mov 0x8(%ebp),%edx
10d0e7: 8b 42 34 mov 0x34(%edx),%eax
10d0ea: c7 04 30 00 00 00 00 movl $0x0,(%eax,%esi,1)
information->inactive_per_block[ block ] = 0;
10d0f1: 8b 42 30 mov 0x30(%edx),%eax
10d0f4: c7 04 30 00 00 00 00 movl $0x0,(%eax,%esi,1)
information->inactive -= information->allocation_size;
10d0fb: 8b 42 14 mov 0x14(%edx),%eax
10d0fe: 66 29 42 2c sub %ax,0x2c(%edx)
return;
10d102: 83 c4 10 add $0x10,%esp
}
index_base += information->allocation_size;
}
}
10d105: 8d 65 f4 lea -0xc(%ebp),%esp
10d108: 5b pop %ebx
10d109: 5e pop %esi
10d10a: 5f pop %edi
10d10b: c9 leave
10d10c: c3 ret
0010d514 <_POSIX_Absolute_timeout_to_ticks>:
*/
POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks(
const struct timespec *abstime,
Watchdog_Interval *ticks_out
)
{
10d514: 55 push %ebp
10d515: 89 e5 mov %esp,%ebp
10d517: 57 push %edi
10d518: 56 push %esi
10d519: 53 push %ebx
10d51a: 83 ec 38 sub $0x38,%esp
10d51d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d520: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Make sure there is always a value returned.
*/
*ticks_out = 0;
10d523: c7 06 00 00 00 00 movl $0x0,(%esi)
/*
* Is the absolute time even valid?
*/
if ( !_Timespec_Is_valid(abstime) )
10d529: 53 push %ebx
10d52a: e8 a1 3d 00 00 call 1112d0 <_Timespec_Is_valid>
10d52f: 83 c4 10 add $0x10,%esp
10d532: 84 c0 test %al,%al
10d534: 75 0a jne 10d540 <_POSIX_Absolute_timeout_to_ticks+0x2c>
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
10d536: 31 c0 xor %eax,%eax
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
10d538: 8d 65 f4 lea -0xc(%ebp),%esp
10d53b: 5b pop %ebx
10d53c: 5e pop %esi
10d53d: 5f pop %edi
10d53e: c9 leave
10d53f: c3 ret
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
/*
* Is the absolute time in the past?
*/
_TOD_Get( ¤t_time );
10d540: 83 ec 0c sub $0xc,%esp
10d543: 8d 7d e0 lea -0x20(%ebp),%edi
10d546: 57 push %edi
10d547: e8 88 1d 00 00 call 10f2d4 <_TOD_Get>
if ( _Timespec_Less_than( abstime, ¤t_time ) )
10d54c: 5a pop %edx
10d54d: 59 pop %ecx
10d54e: 57 push %edi
10d54f: 53 push %ebx
10d550: e8 a3 3d 00 00 call 1112f8 <_Timespec_Less_than>
10d555: 83 c4 10 add $0x10,%esp
10d558: 84 c0 test %al,%al
10d55a: 74 10 je 10d56c <_POSIX_Absolute_timeout_to_ticks+0x58>
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
10d55c: b8 01 00 00 00 mov $0x1,%eax
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
10d561: 8d 65 f4 lea -0xc(%ebp),%esp
10d564: 5b pop %ebx
10d565: 5e pop %esi
10d566: 5f pop %edi
10d567: c9 leave
10d568: c3 ret
10d569: 8d 76 00 lea 0x0(%esi),%esi
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
/*
* How long until the requested absolute time?
*/
_Timespec_Subtract( ¤t_time, abstime, &difference );
10d56c: 50 push %eax
10d56d: 8d 45 d8 lea -0x28(%ebp),%eax
10d570: 50 push %eax
10d571: 53 push %ebx
10d572: 57 push %edi
10d573: 89 45 d4 mov %eax,-0x2c(%ebp)
10d576: e8 a1 3d 00 00 call 11131c <_Timespec_Subtract>
/*
* Internally the SuperCore uses ticks, so convert to them.
*/
*ticks_out = _Timespec_To_ticks( &difference );
10d57b: 8b 45 d4 mov -0x2c(%ebp),%eax
10d57e: 89 04 24 mov %eax,(%esp)
10d581: e8 d6 3d 00 00 call 11135c <_Timespec_To_ticks>
10d586: 89 06 mov %eax,(%esi)
/*
* If the difference was 0, then the future is now. It is so bright
* we better wear shades.
*/
if ( !*ticks_out )
10d588: 83 c4 10 add $0x10,%esp
return POSIX_ABSOLUTE_TIMEOUT_IS_NOW;
10d58b: 83 f8 01 cmp $0x1,%eax
10d58e: 19 c0 sbb %eax,%eax
10d590: 83 c0 03 add $0x3,%eax
/*
* This is the case we were expecting and it took this long to
* get here.
*/
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE;
}
10d593: 8d 65 f4 lea -0xc(%ebp),%esp
10d596: 5b pop %ebx
10d597: 5e pop %esi
10d598: 5f pop %edi
10d599: c9 leave
10d59a: c3 ret
0010c0cc <_POSIX_Condition_variables_Get>:
POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
pthread_cond_t *cond,
Objects_Locations *location
)
{
10c0cc: 55 push %ebp
10c0cd: 89 e5 mov %esp,%ebp
10c0cf: 56 push %esi
10c0d0: 53 push %ebx
10c0d1: 8b 5d 08 mov 0x8(%ebp),%ebx
10c0d4: 8b 75 0c mov 0xc(%ebp),%esi
int status;
if ( !cond ) {
10c0d7: 85 db test %ebx,%ebx
10c0d9: 74 39 je 10c114 <_POSIX_Condition_variables_Get+0x48>
*location = OBJECTS_ERROR;
return (POSIX_Condition_variables_Control *) 0;
}
if ( *cond == PTHREAD_COND_INITIALIZER ) {
10c0db: 8b 03 mov (%ebx),%eax
10c0dd: 83 f8 ff cmp $0xffffffff,%eax
10c0e0: 74 1a je 10c0fc <_POSIX_Condition_variables_Get+0x30>
}
/*
* Now call Objects_Get()
*/
return (POSIX_Condition_variables_Control *)_Objects_Get(
10c0e2: 52 push %edx
10c0e3: 56 push %esi
10c0e4: 50 push %eax
10c0e5: 68 a0 a1 12 00 push $0x12a1a0
10c0ea: e8 85 2b 00 00 call 10ec74 <_Objects_Get>
10c0ef: 83 c4 10 add $0x10,%esp
&_POSIX_Condition_variables_Information,
(Objects_Id) *cond,
location
);
}
10c0f2: 8d 65 f8 lea -0x8(%ebp),%esp
10c0f5: 5b pop %ebx
10c0f6: 5e pop %esi
10c0f7: c9 leave
10c0f8: c3 ret
10c0f9: 8d 76 00 lea 0x0(%esi),%esi
if ( *cond == PTHREAD_COND_INITIALIZER ) {
/*
* Do an "auto-create" here.
*/
status = pthread_cond_init( cond, 0 );
10c0fc: 83 ec 08 sub $0x8,%esp
10c0ff: 6a 00 push $0x0
10c101: 53 push %ebx
10c102: e8 19 00 00 00 call 10c120 <pthread_cond_init>
if ( status ) {
10c107: 83 c4 10 add $0x10,%esp
10c10a: 85 c0 test %eax,%eax
10c10c: 75 06 jne 10c114 <_POSIX_Condition_variables_Get+0x48>
10c10e: 8b 03 mov (%ebx),%eax
10c110: eb d0 jmp 10c0e2 <_POSIX_Condition_variables_Get+0x16>
10c112: 66 90 xchg %ax,%ax
*location = OBJECTS_ERROR;
10c114: c7 06 01 00 00 00 movl $0x1,(%esi)
return (POSIX_Condition_variables_Control *) 0;
10c11a: 31 c0 xor %eax,%eax
10c11c: eb d4 jmp 10c0f2 <_POSIX_Condition_variables_Get+0x26>
0010c1e8 <_POSIX_Condition_variables_Signal_support>:
int _POSIX_Condition_variables_Signal_support(
pthread_cond_t *cond,
bool is_broadcast
)
{
10c1e8: 55 push %ebp
10c1e9: 89 e5 mov %esp,%ebp
10c1eb: 57 push %edi
10c1ec: 56 push %esi
10c1ed: 53 push %ebx
10c1ee: 83 ec 24 sub $0x24,%esp
10c1f1: 8a 5d 0c mov 0xc(%ebp),%bl
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
Thread_Control *the_thread;
the_cond = _POSIX_Condition_variables_Get( cond, &location );
10c1f4: 8d 45 e4 lea -0x1c(%ebp),%eax
10c1f7: 50 push %eax
10c1f8: ff 75 08 pushl 0x8(%ebp)
10c1fb: e8 cc fe ff ff call 10c0cc <_POSIX_Condition_variables_Get>
10c200: 89 c7 mov %eax,%edi
switch ( location ) {
10c202: 83 c4 10 add $0x10,%esp
10c205: 8b 45 e4 mov -0x1c(%ebp),%eax
10c208: 85 c0 test %eax,%eax
10c20a: 74 10 je 10c21c <_POSIX_Condition_variables_Signal_support+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c20c: b8 16 00 00 00 mov $0x16,%eax
}
10c211: 8d 65 f4 lea -0xc(%ebp),%esp
10c214: 5b pop %ebx
10c215: 5e pop %esi
10c216: 5f pop %edi
10c217: c9 leave
10c218: c3 ret
10c219: 8d 76 00 lea 0x0(%esi),%esi
10c21c: 8d 77 18 lea 0x18(%edi),%esi
10c21f: eb 0b jmp 10c22c <_POSIX_Condition_variables_Signal_support+0x44>
10c221: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
do {
the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue );
if ( !the_thread )
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
} while ( is_broadcast && the_thread );
10c224: 84 db test %bl,%bl
10c226: 74 20 je 10c248 <_POSIX_Condition_variables_Signal_support+0x60>
10c228: 85 c0 test %eax,%eax
10c22a: 74 1c je 10c248 <_POSIX_Condition_variables_Signal_support+0x60>
the_cond = _POSIX_Condition_variables_Get( cond, &location );
switch ( location ) {
case OBJECTS_LOCAL:
do {
the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue );
10c22c: 83 ec 0c sub $0xc,%esp
10c22f: 56 push %esi
10c230: e8 a7 38 00 00 call 10fadc <_Thread_queue_Dequeue>
if ( !the_thread )
10c235: 83 c4 10 add $0x10,%esp
10c238: 85 c0 test %eax,%eax
10c23a: 75 e8 jne 10c224 <_POSIX_Condition_variables_Signal_support+0x3c>
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
10c23c: c7 47 14 00 00 00 00 movl $0x0,0x14(%edi)
} while ( is_broadcast && the_thread );
10c243: 84 db test %bl,%bl
10c245: 75 e1 jne 10c228 <_POSIX_Condition_variables_Signal_support+0x40>
10c247: 90 nop
_Thread_Enable_dispatch();
10c248: e8 db 34 00 00 call 10f728 <_Thread_Enable_dispatch>
return 0;
10c24d: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c24f: 8d 65 f4 lea -0xc(%ebp),%esp
10c252: 5b pop %ebx
10c253: 5e pop %esi
10c254: 5f pop %edi
10c255: c9 leave
10c256: c3 ret
0010c2b0 <_POSIX_Condition_variables_Wait_support>:
pthread_cond_t *cond,
pthread_mutex_t *mutex,
Watchdog_Interval timeout,
bool already_timedout
)
{
10c2b0: 55 push %ebp
10c2b1: 89 e5 mov %esp,%ebp
10c2b3: 57 push %edi
10c2b4: 56 push %esi
10c2b5: 53 push %ebx
10c2b6: 83 ec 34 sub $0x34,%esp
10c2b9: 8b 7d 08 mov 0x8(%ebp),%edi
10c2bc: 8b 5d 0c mov 0xc(%ebp),%ebx
10c2bf: 8a 45 14 mov 0x14(%ebp),%al
10c2c2: 88 45 d7 mov %al,-0x29(%ebp)
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
int status;
int mutex_status;
if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
10c2c5: 8d 75 e4 lea -0x1c(%ebp),%esi
10c2c8: 56 push %esi
10c2c9: 53 push %ebx
10c2ca: e8 59 01 00 00 call 10c428 <_POSIX_Mutex_Get>
10c2cf: 83 c4 10 add $0x10,%esp
10c2d2: 85 c0 test %eax,%eax
10c2d4: 74 21 je 10c2f7 <_POSIX_Condition_variables_Wait_support+0x47>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10c2d6: a1 b0 9c 12 00 mov 0x129cb0,%eax
10c2db: 48 dec %eax
10c2dc: a3 b0 9c 12 00 mov %eax,0x129cb0
return EINVAL;
}
_Thread_Unnest_dispatch();
the_cond = _POSIX_Condition_variables_Get( cond, &location );
10c2e1: 83 ec 08 sub $0x8,%esp
10c2e4: 56 push %esi
10c2e5: 57 push %edi
10c2e6: e8 e1 fd ff ff call 10c0cc <_POSIX_Condition_variables_Get>
10c2eb: 89 c6 mov %eax,%esi
switch ( location ) {
10c2ed: 83 c4 10 add $0x10,%esp
10c2f0: 8b 55 e4 mov -0x1c(%ebp),%edx
10c2f3: 85 d2 test %edx,%edx
10c2f5: 74 11 je 10c308 <_POSIX_Condition_variables_Wait_support+0x58>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c2f7: be 16 00 00 00 mov $0x16,%esi
}
10c2fc: 89 f0 mov %esi,%eax
10c2fe: 8d 65 f4 lea -0xc(%ebp),%esp
10c301: 5b pop %ebx
10c302: 5e pop %esi
10c303: 5f pop %edi
10c304: c9 leave
10c305: c3 ret
10c306: 66 90 xchg %ax,%ax
the_cond = _POSIX_Condition_variables_Get( cond, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
10c308: 8b 40 14 mov 0x14(%eax),%eax
10c30b: 85 c0 test %eax,%eax
10c30d: 74 19 je 10c328 <_POSIX_Condition_variables_Wait_support+0x78>
10c30f: 3b 03 cmp (%ebx),%eax
10c311: 74 15 je 10c328 <_POSIX_Condition_variables_Wait_support+0x78>
_Thread_Enable_dispatch();
10c313: e8 10 34 00 00 call 10f728 <_Thread_Enable_dispatch>
return EINVAL;
10c318: be 16 00 00 00 mov $0x16,%esi
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c31d: 89 f0 mov %esi,%eax
10c31f: 8d 65 f4 lea -0xc(%ebp),%esp
10c322: 5b pop %ebx
10c323: 5e pop %esi
10c324: 5f pop %edi
10c325: c9 leave
10c326: c3 ret
10c327: 90 nop
if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
_Thread_Enable_dispatch();
return EINVAL;
}
(void) pthread_mutex_unlock( mutex );
10c328: 83 ec 0c sub $0xc,%esp
10c32b: 53 push %ebx
10c32c: e8 73 03 00 00 call 10c6a4 <pthread_mutex_unlock>
_Thread_Enable_dispatch();
return EINVAL;
}
*/
if ( !already_timedout ) {
10c331: 83 c4 10 add $0x10,%esp
10c334: 80 7d d7 00 cmpb $0x0,-0x29(%ebp)
10c338: 75 4e jne 10c388 <_POSIX_Condition_variables_Wait_support+0xd8>
the_cond->Mutex = *mutex;
10c33a: 8b 03 mov (%ebx),%eax
10c33c: 89 46 14 mov %eax,0x14(%esi)
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;
10c33f: c7 46 48 01 00 00 00 movl $0x1,0x48(%esi)
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
10c346: a1 98 a2 12 00 mov 0x12a298,%eax
10c34b: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
_Thread_Executing->Wait.queue = &the_cond->Wait_queue;
10c352: 83 c6 18 add $0x18,%esi
10c355: 89 70 44 mov %esi,0x44(%eax)
_Thread_Executing->Wait.id = *cond;
10c358: 8b 17 mov (%edi),%edx
10c35a: 89 50 20 mov %edx,0x20(%eax)
_Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
10c35d: 50 push %eax
10c35e: 68 80 ff 10 00 push $0x10ff80
10c363: ff 75 10 pushl 0x10(%ebp)
10c366: 56 push %esi
10c367: e8 98 38 00 00 call 10fc04 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10c36c: e8 b7 33 00 00 call 10f728 <_Thread_Enable_dispatch>
* a POSIX signal, then pthread_cond_wait returns spuriously,
* according to the POSIX standard. It means that pthread_cond_wait
* returns a success status, except for the fact that it was not
* woken up a pthread_cond_signal or a pthread_cond_broadcast.
*/
status = _Thread_Executing->Wait.return_code;
10c371: a1 98 a2 12 00 mov 0x12a298,%eax
10c376: 8b 70 34 mov 0x34(%eax),%esi
if ( status == EINTR )
10c379: 83 c4 10 add $0x10,%esp
10c37c: 83 fe 04 cmp $0x4,%esi
10c37f: 75 11 jne 10c392 <_POSIX_Condition_variables_Wait_support+0xe2>
status = 0;
10c381: 31 f6 xor %esi,%esi
10c383: eb 0d jmp 10c392 <_POSIX_Condition_variables_Wait_support+0xe2>
10c385: 8d 76 00 lea 0x0(%esi),%esi
} else {
_Thread_Enable_dispatch();
10c388: e8 9b 33 00 00 call 10f728 <_Thread_Enable_dispatch>
status = ETIMEDOUT;
10c38d: be 74 00 00 00 mov $0x74,%esi
/*
* When we get here the dispatch disable level is 0.
*/
mutex_status = pthread_mutex_lock( mutex );
10c392: 83 ec 0c sub $0xc,%esp
10c395: 53 push %ebx
10c396: e8 81 02 00 00 call 10c61c <pthread_mutex_lock>
if ( mutex_status )
10c39b: 83 c4 10 add $0x10,%esp
10c39e: 85 c0 test %eax,%eax
10c3a0: 0f 85 51 ff ff ff jne 10c2f7 <_POSIX_Condition_variables_Wait_support+0x47>
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c3a6: 89 f0 mov %esi,%eax
10c3a8: 8d 65 f4 lea -0xc(%ebp),%esp
10c3ab: 5b pop %ebx
10c3ac: 5e pop %esi
10c3ad: 5f pop %edi
10c3ae: c9 leave
10c3af: c3 ret
00116368 <_POSIX_Message_queue_Create_support>:
const char *name_arg,
int pshared,
struct mq_attr *attr_ptr,
POSIX_Message_queue_Control **message_queue
)
{
116368: 55 push %ebp
116369: 89 e5 mov %esp,%ebp
11636b: 57 push %edi
11636c: 56 push %esi
11636d: 53 push %ebx
11636e: 83 ec 24 sub $0x24,%esp
116371: 8b 5d 10 mov 0x10(%ebp),%ebx
CORE_message_queue_Attributes *the_mq_attr;
struct mq_attr attr;
char *name;
size_t n;
n = strnlen( name_arg, NAME_MAX );
116374: 68 ff 00 00 00 push $0xff
116379: ff 75 08 pushl 0x8(%ebp)
11637c: e8 b7 4c 00 00 call 11b038 <strnlen>
116381: 89 c6 mov %eax,%esi
116383: a1 90 fa 12 00 mov 0x12fa90,%eax
116388: 40 inc %eax
116389: a3 90 fa 12 00 mov %eax,0x12fa90
* There is no real basis for the default values. They will work
* but were not compared against any existing implementation for
* compatibility. See README.mqueue for an example program we
* think will print out the defaults. Report anything you find with it.
*/
if ( attr_ptr == NULL ) {
11638e: 83 c4 10 add $0x10,%esp
116391: 85 db test %ebx,%ebx
116393: 0f 84 b7 00 00 00 je 116450 <_POSIX_Message_queue_Create_support+0xe8>
attr.mq_maxmsg = 10;
attr.mq_msgsize = 16;
} else {
if ( attr_ptr->mq_maxmsg <= 0 ){
116399: 8b 7b 04 mov 0x4(%ebx),%edi
11639c: 85 ff test %edi,%edi
11639e: 0f 8e f0 00 00 00 jle 116494 <_POSIX_Message_queue_Create_support+0x12c>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( attr_ptr->mq_msgsize <= 0 ){
1163a4: 8b 5b 08 mov 0x8(%ebx),%ebx
1163a7: 89 5d e4 mov %ebx,-0x1c(%ebp)
1163aa: 85 db test %ebx,%ebx
1163ac: 0f 8e e2 00 00 00 jle 116494 <_POSIX_Message_queue_Create_support+0x12c>
RTEMS_INLINE_ROUTINE
POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void )
{
return (POSIX_Message_queue_Control *)
_Objects_Allocate( &_POSIX_Message_queue_Information );
1163b2: 83 ec 0c sub $0xc,%esp
1163b5: 68 60 fe 12 00 push $0x12fe60
1163ba: e8 e1 c3 ff ff call 1127a0 <_Objects_Allocate>
1163bf: 89 c3 mov %eax,%ebx
attr = *attr_ptr;
}
the_mq = _POSIX_Message_queue_Allocate();
if ( !the_mq ) {
1163c1: 83 c4 10 add $0x10,%esp
1163c4: 85 c0 test %eax,%eax
1163c6: 0f 84 0a 01 00 00 je 1164d6 <_POSIX_Message_queue_Create_support+0x16e>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq->process_shared = pshared;
1163cc: 8b 45 0c mov 0xc(%ebp),%eax
1163cf: 89 43 10 mov %eax,0x10(%ebx)
the_mq->named = true;
1163d2: c6 43 14 01 movb $0x1,0x14(%ebx)
the_mq->open_count = 1;
1163d6: c7 43 18 01 00 00 00 movl $0x1,0x18(%ebx)
the_mq->linked = true;
1163dd: c6 43 15 01 movb $0x1,0x15(%ebx)
/*
* Make a copy of the user's string for name just in case it was
* dynamically constructed.
*/
name = _Workspace_Allocate(n+1);
1163e1: 8d 56 01 lea 0x1(%esi),%edx
1163e4: 83 ec 0c sub $0xc,%esp
1163e7: 52 push %edx
1163e8: 89 55 e0 mov %edx,-0x20(%ebp)
1163eb: e8 dc e4 ff ff call 1148cc <_Workspace_Allocate>
1163f0: 89 c6 mov %eax,%esi
if (!name) {
1163f2: 83 c4 10 add $0x10,%esp
1163f5: 85 c0 test %eax,%eax
1163f7: 8b 55 e0 mov -0x20(%ebp),%edx
1163fa: 0f 84 ab 00 00 00 je 1164ab <_POSIX_Message_queue_Create_support+0x143>
_POSIX_Message_queue_Free( the_mq );
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENOMEM );
}
strncpy( name, name_arg, n+1 );
116400: 50 push %eax
116401: 52 push %edx
116402: ff 75 08 pushl 0x8(%ebp)
116405: 56 push %esi
116406: e8 b1 4b 00 00 call 11afbc <strncpy>
*
* Joel: Cite POSIX or OpenGroup on above statement so we can determine
* if it is a real requirement.
*/
the_mq_attr = &the_mq->Message_queue.Attributes;
the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
11640b: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx)
if ( !_CORE_message_queue_Initialize(
116412: ff 75 e4 pushl -0x1c(%ebp)
116415: 57 push %edi
* current scheduling policy.
*
* Joel: Cite POSIX or OpenGroup on above statement so we can determine
* if it is a real requirement.
*/
the_mq_attr = &the_mq->Message_queue.Attributes;
116416: 8d 43 5c lea 0x5c(%ebx),%eax
the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( !_CORE_message_queue_Initialize(
116419: 50 push %eax
11641a: 8d 43 1c lea 0x1c(%ebx),%eax
11641d: 50 push %eax
11641e: e8 25 0f 00 00 call 117348 <_CORE_message_queue_Initialize>
116423: 83 c4 20 add $0x20,%esp
116426: 84 c0 test %al,%al
116428: 74 3a je 116464 <_POSIX_Message_queue_Create_support+0xfc>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
11642a: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
11642e: a1 7c fe 12 00 mov 0x12fe7c,%eax
116433: 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;
116436: 89 73 0c mov %esi,0xc(%ebx)
&_POSIX_Message_queue_Information,
&the_mq->Object,
name
);
*message_queue = the_mq;
116439: 8b 45 14 mov 0x14(%ebp),%eax
11643c: 89 18 mov %ebx,(%eax)
_Thread_Enable_dispatch();
11643e: e8 49 d3 ff ff call 11378c <_Thread_Enable_dispatch>
return 0;
116443: 31 c0 xor %eax,%eax
}
116445: 8d 65 f4 lea -0xc(%ebp),%esp
116448: 5b pop %ebx
116449: 5e pop %esi
11644a: 5f pop %edi
11644b: c9 leave
11644c: c3 ret
11644d: 8d 76 00 lea 0x0(%esi),%esi
* compatibility. See README.mqueue for an example program we
* think will print out the defaults. Report anything you find with it.
*/
if ( attr_ptr == NULL ) {
attr.mq_maxmsg = 10;
attr.mq_msgsize = 16;
116450: c7 45 e4 10 00 00 00 movl $0x10,-0x1c(%ebp)
* but were not compared against any existing implementation for
* compatibility. See README.mqueue for an example program we
* think will print out the defaults. Report anything you find with it.
*/
if ( attr_ptr == NULL ) {
attr.mq_maxmsg = 10;
116457: bf 0a 00 00 00 mov $0xa,%edi
11645c: e9 51 ff ff ff jmp 1163b2 <_POSIX_Message_queue_Create_support+0x4a>
116461: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
POSIX_Message_queue_Control *the_mq
)
{
_Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
116464: 83 ec 08 sub $0x8,%esp
116467: 53 push %ebx
116468: 68 60 fe 12 00 push $0x12fe60
11646d: e8 a6 c6 ff ff call 112b18 <_Objects_Free>
attr.mq_maxmsg,
attr.mq_msgsize
) ) {
_POSIX_Message_queue_Free( the_mq );
_Workspace_Free(name);
116472: 89 34 24 mov %esi,(%esp)
116475: e8 6e e4 ff ff call 1148e8 <_Workspace_Free>
_Thread_Enable_dispatch();
11647a: e8 0d d3 ff ff call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
11647f: e8 38 34 00 00 call 1198bc <__errno>
116484: c7 00 1c 00 00 00 movl $0x1c,(%eax)
11648a: 83 c4 10 add $0x10,%esp
11648d: b8 ff ff ff ff mov $0xffffffff,%eax
116492: eb b1 jmp 116445 <_POSIX_Message_queue_Create_support+0xdd>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( attr_ptr->mq_msgsize <= 0 ){
_Thread_Enable_dispatch();
116494: e8 f3 d2 ff ff call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EINVAL );
116499: e8 1e 34 00 00 call 1198bc <__errno>
11649e: c7 00 16 00 00 00 movl $0x16,(%eax)
1164a4: b8 ff ff ff ff mov $0xffffffff,%eax
1164a9: eb 9a jmp 116445 <_POSIX_Message_queue_Create_support+0xdd>
1164ab: 83 ec 08 sub $0x8,%esp
1164ae: 53 push %ebx
1164af: 68 60 fe 12 00 push $0x12fe60
1164b4: e8 5f c6 ff ff call 112b18 <_Objects_Free>
* dynamically constructed.
*/
name = _Workspace_Allocate(n+1);
if (!name) {
_POSIX_Message_queue_Free( the_mq );
_Thread_Enable_dispatch();
1164b9: e8 ce d2 ff ff call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOMEM );
1164be: e8 f9 33 00 00 call 1198bc <__errno>
1164c3: c7 00 0c 00 00 00 movl $0xc,(%eax)
1164c9: 83 c4 10 add $0x10,%esp
1164cc: b8 ff ff ff ff mov $0xffffffff,%eax
1164d1: e9 6f ff ff ff jmp 116445 <_POSIX_Message_queue_Create_support+0xdd>
attr = *attr_ptr;
}
the_mq = _POSIX_Message_queue_Allocate();
if ( !the_mq ) {
_Thread_Enable_dispatch();
1164d6: e8 b1 d2 ff ff call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
1164db: e8 dc 33 00 00 call 1198bc <__errno>
1164e0: c7 00 17 00 00 00 movl $0x17,(%eax)
1164e6: b8 ff ff ff ff mov $0xffffffff,%eax
1164eb: e9 55 ff ff ff jmp 116445 <_POSIX_Message_queue_Create_support+0xdd>
001164f0 <_POSIX_Message_queue_Name_to_id>:
*/
int _POSIX_Message_queue_Name_to_id(
const char *name,
Objects_Id *id
)
{
1164f0: 55 push %ebp
1164f1: 89 e5 mov %esp,%ebp
1164f3: 53 push %ebx
1164f4: 83 ec 14 sub $0x14,%esp
1164f7: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Name_or_id_lookup_errors status;
Objects_Id the_id;
if ( !name )
1164fa: 85 db test %ebx,%ebx
1164fc: 74 05 je 116503 <_POSIX_Message_queue_Name_to_id+0x13>
return EINVAL;
if ( !name[0] )
1164fe: 80 3b 00 cmpb $0x0,(%ebx)
116501: 75 0d jne 116510 <_POSIX_Message_queue_Name_to_id+0x20>
return EINVAL;
116503: b8 16 00 00 00 mov $0x16,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
116508: 8b 5d fc mov -0x4(%ebp),%ebx
11650b: c9 leave
11650c: c3 ret
11650d: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
if ( !name[0] )
return EINVAL;
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
116510: 83 ec 08 sub $0x8,%esp
116513: 68 ff 00 00 00 push $0xff
116518: 53 push %ebx
116519: e8 1a 4b 00 00 call 11b038 <strnlen>
11651e: 83 c4 10 add $0x10,%esp
116521: 3d fe 00 00 00 cmp $0xfe,%eax
116526: 76 0c jbe 116534 <_POSIX_Message_queue_Name_to_id+0x44>
return ENAMETOOLONG;
116528: b8 5b 00 00 00 mov $0x5b,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
11652d: 8b 5d fc mov -0x4(%ebp),%ebx
116530: c9 leave
116531: c3 ret
116532: 66 90 xchg %ax,%ax
return EINVAL;
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
return ENAMETOOLONG;
status = _Objects_Name_to_id_string(
116534: 50 push %eax
116535: 8d 45 f4 lea -0xc(%ebp),%eax
116538: 50 push %eax
116539: 53 push %ebx
11653a: 68 60 fe 12 00 push $0x12fe60
11653f: e8 0c 14 00 00 call 117950 <_Objects_Name_to_id_string>
&_POSIX_Message_queue_Information,
name,
&the_id
);
*id = the_id;
116544: 8b 4d f4 mov -0xc(%ebp),%ecx
116547: 8b 55 0c mov 0xc(%ebp),%edx
11654a: 89 0a mov %ecx,(%edx)
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
11654c: 83 c4 10 add $0x10,%esp
return 0;
11654f: 83 f8 01 cmp $0x1,%eax
116552: 19 c0 sbb %eax,%eax
116554: f7 d0 not %eax
116556: 83 e0 02 and $0x2,%eax
return ENOENT;
}
116559: 8b 5d fc mov -0x4(%ebp),%ebx
11655c: c9 leave
11655d: c3 ret
0010fcd8 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10fcd8: 55 push %ebp
10fcd9: 89 e5 mov %esp,%ebp
10fcdb: 53 push %ebx
10fcdc: 83 ec 28 sub $0x28,%esp
10fcdf: 8b 5d 08 mov 0x8(%ebp),%ebx
10fce2: 8a 45 18 mov 0x18(%ebp),%al
10fce5: 88 45 e7 mov %al,-0x19(%ebp)
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 );
10fce8: 8d 45 f4 lea -0xc(%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(
10fceb: 50 push %eax
10fcec: 53 push %ebx
10fced: 68 00 00 13 00 push $0x130000
10fcf2: e8 61 2f 00 00 call 112c58 <_Objects_Get>
switch ( location ) {
10fcf7: 83 c4 10 add $0x10,%esp
10fcfa: 8b 55 f4 mov -0xc(%ebp),%edx
10fcfd: 85 d2 test %edx,%edx
10fcff: 74 17 je 10fd18 <_POSIX_Message_queue_Receive_support+0x40>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10fd01: e8 b6 9b 00 00 call 1198bc <__errno>
10fd06: c7 00 09 00 00 00 movl $0x9,(%eax)
10fd0c: b8 ff ff ff ff mov $0xffffffff,%eax
}
10fd11: 8b 5d fc mov -0x4(%ebp),%ebx
10fd14: c9 leave
10fd15: c3 ret
10fd16: 66 90 xchg %ax,%ax
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
10fd18: 8b 50 14 mov 0x14(%eax),%edx
10fd1b: 89 d1 mov %edx,%ecx
10fd1d: 83 e1 03 and $0x3,%ecx
10fd20: 49 dec %ecx
10fd21: 0f 84 af 00 00 00 je 10fdd6 <_POSIX_Message_queue_Receive_support+0xfe>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10fd27: 8b 40 10 mov 0x10(%eax),%eax
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
10fd2a: 8b 4d 10 mov 0x10(%ebp),%ecx
10fd2d: 39 48 68 cmp %ecx,0x68(%eax)
10fd30: 77 62 ja 10fd94 <_POSIX_Message_queue_Receive_support+0xbc>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
10fd32: c7 45 f0 ff ff ff ff movl $0xffffffff,-0x10(%ebp)
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fd39: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10fd3d: 75 45 jne 10fd84 <_POSIX_Message_queue_Receive_support+0xac><== ALWAYS TAKEN
10fd3f: 31 d2 xor %edx,%edx <== NOT EXECUTED
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
10fd41: 83 ec 08 sub $0x8,%esp
10fd44: ff 75 1c pushl 0x1c(%ebp)
10fd47: 52 push %edx
10fd48: 8d 55 f0 lea -0x10(%ebp),%edx
10fd4b: 52 push %edx
10fd4c: ff 75 0c pushl 0xc(%ebp)
10fd4f: 53 push %ebx
10fd50: 83 c0 1c add $0x1c,%eax
10fd53: 50 push %eax
10fd54: e8 a3 1f 00 00 call 111cfc <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
10fd59: 83 c4 20 add $0x20,%esp
10fd5c: e8 2b 3a 00 00 call 11378c <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
10fd61: 8b 15 78 00 13 00 mov 0x130078,%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 ((priority >= 0) ? priority : -priority);
10fd67: 8b 42 24 mov 0x24(%edx),%eax
10fd6a: 85 c0 test %eax,%eax
10fd6c: 78 22 js 10fd90 <_POSIX_Message_queue_Receive_support+0xb8>
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
10fd6e: 8b 4d 14 mov 0x14(%ebp),%ecx
10fd71: 89 01 mov %eax,(%ecx)
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
10fd73: 8b 42 34 mov 0x34(%edx),%eax
10fd76: 85 c0 test %eax,%eax
10fd78: 75 36 jne 10fdb0 <_POSIX_Message_queue_Receive_support+0xd8>
return length_out;
10fd7a: 8b 45 f0 mov -0x10(%ebp),%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
10fd7d: 8b 5d fc mov -0x4(%ebp),%ebx
10fd80: c9 leave
10fd81: c3 ret
10fd82: 66 90 xchg %ax,%ax
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fd84: 80 e6 40 and $0x40,%dh
10fd87: 0f 94 c2 sete %dl
10fd8a: 0f b6 d2 movzbl %dl,%edx
10fd8d: eb b2 jmp 10fd41 <_POSIX_Message_queue_Receive_support+0x69>
10fd8f: 90 nop
10fd90: f7 d8 neg %eax
10fd92: eb da jmp 10fd6e <_POSIX_Message_queue_Receive_support+0x96>
}
the_mq = the_mq_fd->Queue;
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
_Thread_Enable_dispatch();
10fd94: e8 f3 39 00 00 call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
10fd99: e8 1e 9b 00 00 call 1198bc <__errno>
10fd9e: c7 00 7a 00 00 00 movl $0x7a,(%eax)
10fda4: b8 ff ff ff ff mov $0xffffffff,%eax
10fda9: e9 63 ff ff ff jmp 10fd11 <_POSIX_Message_queue_Receive_support+0x39>
10fdae: 66 90 xchg %ax,%ax
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
return length_out;
rtems_set_errno_and_return_minus_one(
10fdb0: e8 07 9b 00 00 call 1198bc <__errno>
10fdb5: 89 c3 mov %eax,%ebx
10fdb7: 83 ec 0c sub $0xc,%esp
10fdba: a1 78 00 13 00 mov 0x130078,%eax
10fdbf: ff 70 34 pushl 0x34(%eax)
10fdc2: e8 29 02 00 00 call 10fff0 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10fdc7: 89 03 mov %eax,(%ebx)
10fdc9: 83 c4 10 add $0x10,%esp
10fdcc: b8 ff ff ff ff mov $0xffffffff,%eax
10fdd1: e9 3b ff ff ff jmp 10fd11 <_POSIX_Message_queue_Receive_support+0x39>
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
_Thread_Enable_dispatch();
10fdd6: e8 b1 39 00 00 call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
10fddb: e8 dc 9a 00 00 call 1198bc <__errno>
10fde0: c7 00 09 00 00 00 movl $0x9,(%eax)
10fde6: b8 ff ff ff ff mov $0xffffffff,%eax
10fdeb: e9 21 ff ff ff jmp 10fd11 <_POSIX_Message_queue_Receive_support+0x39>
0010fe10 <_POSIX_Message_queue_Send_support>:
size_t msg_len,
uint32_t msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10fe10: 55 push %ebp
10fe11: 89 e5 mov %esp,%ebp
10fe13: 56 push %esi
10fe14: 53 push %ebx
10fe15: 83 ec 20 sub $0x20,%esp
10fe18: 8b 75 08 mov 0x8(%ebp),%esi
10fe1b: 8b 5d 14 mov 0x14(%ebp),%ebx
10fe1e: 8a 55 18 mov 0x18(%ebp),%dl
/*
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
10fe21: 83 fb 20 cmp $0x20,%ebx
10fe24: 0f 87 92 00 00 00 ja 10febc <_POSIX_Message_queue_Send_support+0xac>
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(
10fe2a: 51 push %ecx
rtems_set_errno_and_return_minus_one( EINVAL );
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
10fe2b: 8d 45 f4 lea -0xc(%ebp),%eax
10fe2e: 50 push %eax
10fe2f: 56 push %esi
10fe30: 68 00 00 13 00 push $0x130000
10fe35: 88 55 e4 mov %dl,-0x1c(%ebp)
10fe38: e8 1b 2e 00 00 call 112c58 <_Objects_Get>
switch ( location ) {
10fe3d: 83 c4 10 add $0x10,%esp
10fe40: 8b 55 f4 mov -0xc(%ebp),%edx
10fe43: 85 d2 test %edx,%edx
10fe45: 8a 55 e4 mov -0x1c(%ebp),%dl
10fe48: 75 5e jne 10fea8 <_POSIX_Message_queue_Send_support+0x98>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
10fe4a: 8b 48 14 mov 0x14(%eax),%ecx
10fe4d: f6 c1 03 test $0x3,%cl
10fe50: 74 7e je 10fed0 <_POSIX_Message_queue_Send_support+0xc0>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10fe52: 8b 40 10 mov 0x10(%eax),%eax
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fe55: 84 d2 test %dl,%dl
10fe57: 75 37 jne 10fe90 <_POSIX_Message_queue_Send_support+0x80>
10fe59: 31 d2 xor %edx,%edx
do_wait = wait;
/*
* Now perform the actual message receive
*/
msg_status = _CORE_message_queue_Submit(
10fe5b: ff 75 1c pushl 0x1c(%ebp)
10fe5e: 52 push %edx
RTEMS_INLINE_ROUTINE CORE_message_queue_Submit_types _POSIX_Message_queue_Priority_to_core(
unsigned int priority
)
{
return priority * -1;
10fe5f: f7 db neg %ebx
10fe61: 53 push %ebx
10fe62: 6a 00 push $0x0
10fe64: 56 push %esi
10fe65: ff 75 10 pushl 0x10(%ebp)
10fe68: ff 75 0c pushl 0xc(%ebp)
10fe6b: 83 c0 1c add $0x1c,%eax
10fe6e: 50 push %eax
10fe6f: e8 b4 1f 00 00 call 111e28 <_CORE_message_queue_Submit>
10fe74: 89 c3 mov %eax,%ebx
_POSIX_Message_queue_Priority_to_core( msg_prio ),
do_wait,
timeout /* no timeout */
);
_Thread_Enable_dispatch();
10fe76: 83 c4 20 add $0x20,%esp
10fe79: e8 0e 39 00 00 call 11378c <_Thread_Enable_dispatch>
* after it wakes up. The returned status is correct for
* non-blocking operations but if we blocked, then we need
* to look at the status in our TCB.
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
10fe7e: 83 fb 07 cmp $0x7,%ebx
10fe81: 74 19 je 10fe9c <_POSIX_Message_queue_Send_support+0x8c>
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
10fe83: 85 db test %ebx,%ebx
10fe85: 75 61 jne 10fee8 <_POSIX_Message_queue_Send_support+0xd8>
return msg_status;
10fe87: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
10fe89: 8d 65 f8 lea -0x8(%ebp),%esp
10fe8c: 5b pop %ebx
10fe8d: 5e pop %esi
10fe8e: c9 leave
10fe8f: c3 ret
the_mq = the_mq_fd->Queue;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fe90: 31 d2 xor %edx,%edx
10fe92: f6 c5 40 test $0x40,%ch
10fe95: 0f 94 c2 sete %dl
10fe98: eb c1 jmp 10fe5b <_POSIX_Message_queue_Send_support+0x4b>
10fe9a: 66 90 xchg %ax,%ax
* non-blocking operations but if we blocked, then we need
* to look at the status in our TCB.
*/
if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT )
msg_status = _Thread_Executing->Wait.return_code;
10fe9c: a1 78 00 13 00 mov 0x130078,%eax
10fea1: 8b 58 34 mov 0x34(%eax),%ebx
10fea4: eb dd jmp 10fe83 <_POSIX_Message_queue_Send_support+0x73>
10fea6: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10fea8: e8 0f 9a 00 00 call 1198bc <__errno>
10fead: c7 00 09 00 00 00 movl $0x9,(%eax)
10feb3: b8 ff ff ff ff mov $0xffffffff,%eax
10feb8: eb cf jmp 10fe89 <_POSIX_Message_queue_Send_support+0x79>
10feba: 66 90 xchg %ax,%ax
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX )
rtems_set_errno_and_return_minus_one( EINVAL );
10febc: e8 fb 99 00 00 call 1198bc <__errno>
10fec1: c7 00 16 00 00 00 movl $0x16,(%eax)
10fec7: b8 ff ff ff ff mov $0xffffffff,%eax
10fecc: eb bb jmp 10fe89 <_POSIX_Message_queue_Send_support+0x79>
10fece: 66 90 xchg %ax,%ax
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
_Thread_Enable_dispatch();
10fed0: e8 b7 38 00 00 call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
10fed5: e8 e2 99 00 00 call 1198bc <__errno>
10feda: c7 00 09 00 00 00 movl $0x9,(%eax)
10fee0: b8 ff ff ff ff mov $0xffffffff,%eax
10fee5: eb a2 jmp 10fe89 <_POSIX_Message_queue_Send_support+0x79>
10fee7: 90 nop
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
return msg_status;
rtems_set_errno_and_return_minus_one(
10fee8: e8 cf 99 00 00 call 1198bc <__errno>
10feed: 89 c6 mov %eax,%esi
10feef: 83 ec 0c sub $0xc,%esp
10fef2: 53 push %ebx
10fef3: e8 f8 00 00 00 call 10fff0 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10fef8: 89 06 mov %eax,(%esi)
10fefa: 83 c4 10 add $0x10,%esp
10fefd: b8 ff ff ff ff mov $0xffffffff,%eax
10ff02: eb 85 jmp 10fe89 <_POSIX_Message_queue_Send_support+0x79>
0010d0e4 <_POSIX_Mutex_Get>:
POSIX_Mutex_Control *_POSIX_Mutex_Get (
pthread_mutex_t *mutex,
Objects_Locations *location
)
{
10d0e4: 55 push %ebp
10d0e5: 89 e5 mov %esp,%ebp
10d0e7: 56 push %esi
10d0e8: 53 push %ebx
10d0e9: 8b 5d 08 mov 0x8(%ebp),%ebx
10d0ec: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10d0ef: 85 db test %ebx,%ebx
10d0f1: 74 39 je 10d12c <_POSIX_Mutex_Get+0x48>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d0f3: 8b 03 mov (%ebx),%eax
10d0f5: 83 f8 ff cmp $0xffffffff,%eax
10d0f8: 74 1a je 10d114 <_POSIX_Mutex_Get+0x30>
return (POSIX_Mutex_Control *)
_Objects_Get( &_POSIX_Mutex_Information, (Objects_Id) *mutex, location );
10d0fa: 52 push %edx
10d0fb: 56 push %esi
10d0fc: 50 push %eax
10d0fd: 68 80 b9 12 00 push $0x12b980
10d102: e8 f1 2b 00 00 call 10fcf8 <_Objects_Get>
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
return (POSIX_Mutex_Control *)
10d107: 83 c4 10 add $0x10,%esp
_Objects_Get( &_POSIX_Mutex_Information, (Objects_Id) *mutex, location );
}
10d10a: 8d 65 f8 lea -0x8(%ebp),%esp
10d10d: 5b pop %ebx
10d10e: 5e pop %esi
10d10f: c9 leave
10d110: c3 ret
10d111: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations *location
)
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d114: 83 ec 08 sub $0x8,%esp
10d117: 6a 00 push $0x0
10d119: 53 push %ebx
10d11a: e8 b9 00 00 00 call 10d1d8 <pthread_mutex_init>
10d11f: 83 c4 10 add $0x10,%esp
10d122: 85 c0 test %eax,%eax
10d124: 75 06 jne 10d12c <_POSIX_Mutex_Get+0x48>
10d126: 8b 03 mov (%ebx),%eax
10d128: eb d0 jmp 10d0fa <_POSIX_Mutex_Get+0x16>
10d12a: 66 90 xchg %ax,%ax
10d12c: c7 06 01 00 00 00 movl $0x1,(%esi)
10d132: 31 c0 xor %eax,%eax
10d134: eb d4 jmp 10d10a <_POSIX_Mutex_Get+0x26>
0010d138 <_POSIX_Mutex_Get_interrupt_disable>:
POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
)
{
10d138: 55 push %ebp
10d139: 89 e5 mov %esp,%ebp
10d13b: 56 push %esi
10d13c: 53 push %ebx
10d13d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d140: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10d143: 85 db test %ebx,%ebx
10d145: 74 39 je 10d180 <_POSIX_Mutex_Get_interrupt_disable+0x48>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d147: 8b 03 mov (%ebx),%eax
10d149: 83 f8 ff cmp $0xffffffff,%eax
10d14c: 74 1a je 10d168 <_POSIX_Mutex_Get_interrupt_disable+0x30>
return (POSIX_Mutex_Control *) _Objects_Get_isr_disable(
10d14e: ff 75 10 pushl 0x10(%ebp)
10d151: 56 push %esi
10d152: 50 push %eax
10d153: 68 80 b9 12 00 push $0x12b980
10d158: e8 43 2b 00 00 call 10fca0 <_Objects_Get_isr_disable>
10d15d: 83 c4 10 add $0x10,%esp
&_POSIX_Mutex_Information,
(Objects_Id) *mutex,
location,
level
);
}
10d160: 8d 65 f8 lea -0x8(%ebp),%esp
10d163: 5b pop %ebx
10d164: 5e pop %esi
10d165: c9 leave
10d166: c3 ret
10d167: 90 nop
ISR_Level *level
)
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d168: 83 ec 08 sub $0x8,%esp
10d16b: 6a 00 push $0x0
10d16d: 53 push %ebx
10d16e: e8 65 00 00 00 call 10d1d8 <pthread_mutex_init>
10d173: 83 c4 10 add $0x10,%esp
10d176: 85 c0 test %eax,%eax
10d178: 75 06 jne 10d180 <_POSIX_Mutex_Get_interrupt_disable+0x48>
10d17a: 8b 03 mov (%ebx),%eax
10d17c: eb d0 jmp 10d14e <_POSIX_Mutex_Get_interrupt_disable+0x16>
10d17e: 66 90 xchg %ax,%ax
10d180: c7 06 01 00 00 00 movl $0x1,(%esi)
10d186: 31 c0 xor %eax,%eax
10d188: eb d6 jmp 10d160 <_POSIX_Mutex_Get_interrupt_disable+0x28>
0010d338 <_POSIX_Mutex_Lock_support>:
int _POSIX_Mutex_Lock_support(
pthread_mutex_t *mutex,
bool blocking,
Watchdog_Interval timeout
)
{
10d338: 55 push %ebp
10d339: 89 e5 mov %esp,%ebp
10d33b: 53 push %ebx
10d33c: 83 ec 18 sub $0x18,%esp
10d33f: 8a 5d 0c mov 0xc(%ebp),%bl
register POSIX_Mutex_Control *the_mutex;
Objects_Locations location;
ISR_Level level;
the_mutex = _POSIX_Mutex_Get_interrupt_disable( mutex, &location, &level );
10d342: 8d 45 f0 lea -0x10(%ebp),%eax
10d345: 50 push %eax
10d346: 8d 45 f4 lea -0xc(%ebp),%eax
10d349: 50 push %eax
10d34a: ff 75 08 pushl 0x8(%ebp)
10d34d: e8 e6 fd ff ff call 10d138 <_POSIX_Mutex_Get_interrupt_disable>
switch ( location ) {
10d352: 83 c4 10 add $0x10,%esp
10d355: 8b 55 f4 mov -0xc(%ebp),%edx
10d358: 85 d2 test %edx,%edx
10d35a: 75 34 jne 10d390 <_POSIX_Mutex_Lock_support+0x58>
case OBJECTS_LOCAL:
_CORE_mutex_Seize(
10d35c: 83 ec 0c sub $0xc,%esp
10d35f: ff 75 f0 pushl -0x10(%ebp)
10d362: ff 75 10 pushl 0x10(%ebp)
10d365: 0f b6 db movzbl %bl,%ebx
10d368: 53 push %ebx
10d369: ff 70 08 pushl 0x8(%eax)
10d36c: 83 c0 14 add $0x14,%eax
10d36f: 50 push %eax
10d370: e8 47 1d 00 00 call 10f0bc <_CORE_mutex_Seize>
the_mutex->Object.id,
blocking,
timeout,
level
);
return _POSIX_Mutex_Translate_core_mutex_return_code(
10d375: 83 c4 14 add $0x14,%esp
(CORE_mutex_Status) _Thread_Executing->Wait.return_code
10d378: a1 58 bb 12 00 mov 0x12bb58,%eax
the_mutex->Object.id,
blocking,
timeout,
level
);
return _POSIX_Mutex_Translate_core_mutex_return_code(
10d37d: ff 70 34 pushl 0x34(%eax)
10d380: e8 1b 01 00 00 call 10d4a0 <_POSIX_Mutex_Translate_core_mutex_return_code>
10d385: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10d388: 8b 5d fc mov -0x4(%ebp),%ebx
10d38b: c9 leave
10d38c: c3 ret
10d38d: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10d390: b8 16 00 00 00 mov $0x16,%eax
}
10d395: 8b 5d fc mov -0x4(%ebp),%ebx
10d398: c9 leave
10d399: c3 ret
00114948 <_POSIX_Semaphore_Create_support>:
const char *name,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
114948: 55 push %ebp
114949: 89 e5 mov %esp,%ebp
11494b: 56 push %esi
11494c: 53 push %ebx
11494d: 8b 5d 08 mov 0x8(%ebp),%ebx
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name_p = (char *)name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
114950: 8b 55 0c mov 0xc(%ebp),%edx
114953: 85 d2 test %edx,%edx
114955: 0f 85 b9 00 00 00 jne 114a14 <_POSIX_Semaphore_Create_support+0xcc>
rtems_set_errno_and_return_minus_one( ENOSYS );
if ( name ) {
11495b: 85 db test %ebx,%ebx
11495d: 74 1c je 11497b <_POSIX_Semaphore_Create_support+0x33>
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
11495f: 83 ec 08 sub $0x8,%esp
114962: 68 ff 00 00 00 push $0xff
114967: 53 push %ebx
114968: e8 2b 3e 00 00 call 118798 <strnlen>
11496d: 83 c4 10 add $0x10,%esp
114970: 3d fe 00 00 00 cmp $0xfe,%eax
114975: 0f 87 ad 00 00 00 ja 114a28 <_POSIX_Semaphore_Create_support+0xe0>
11497b: a1 d0 d2 12 00 mov 0x12d2d0,%eax
114980: 40 inc %eax
114981: a3 d0 d2 12 00 mov %eax,0x12d2d0
*/
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
{
return (POSIX_Semaphore_Control *)
_Objects_Allocate( &_POSIX_Semaphore_Information );
114986: 83 ec 0c sub $0xc,%esp
114989: 68 20 d6 12 00 push $0x12d620
11498e: e8 91 b9 ff ff call 110324 <_Objects_Allocate>
114993: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
114995: 83 c4 10 add $0x10,%esp
114998: 85 c0 test %eax,%eax
11499a: 0f 84 9a 00 00 00 je 114a3a <_POSIX_Semaphore_Create_support+0xf2>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENOSPC );
}
the_semaphore->process_shared = pshared;
1149a0: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
if ( name ) {
1149a7: 85 db test %ebx,%ebx
1149a9: 74 55 je 114a00 <_POSIX_Semaphore_Create_support+0xb8>
the_semaphore->named = true;
1149ab: c6 40 14 01 movb $0x1,0x14(%eax)
the_semaphore->open_count = 1;
1149af: c7 40 18 01 00 00 00 movl $0x1,0x18(%eax)
the_semaphore->linked = true;
1149b6: c6 40 15 01 movb $0x1,0x15(%eax)
* 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;
1149ba: c7 46 60 00 00 00 00 movl $0x0,0x60(%esi)
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
1149c1: c7 46 5c ff ff ff ff movl $0xffffffff,0x5c(%esi)
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1149c8: 50 push %eax
1149c9: ff 75 10 pushl 0x10(%ebp)
the_semaphore->named = false;
the_semaphore->open_count = 0;
the_semaphore->linked = false;
}
the_sem_attr = &the_semaphore->Semaphore.Attributes;
1149cc: 8d 46 5c lea 0x5c(%esi),%eax
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1149cf: 50 push %eax
1149d0: 8d 46 1c lea 0x1c(%esi),%eax
1149d3: 50 push %eax
1149d4: e8 cb b3 ff ff call 10fda4 <_CORE_semaphore_Initialize>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
1149d9: 0f b7 56 08 movzwl 0x8(%esi),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1149dd: a1 3c d6 12 00 mov 0x12d63c,%eax
1149e2: 89 34 90 mov %esi,(%eax,%edx,4)
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
1149e5: 89 5e 0c mov %ebx,0xc(%esi)
&_POSIX_Semaphore_Information,
&the_semaphore->Object,
name_p
);
*the_sem = the_semaphore;
1149e8: 8b 45 14 mov 0x14(%ebp),%eax
1149eb: 89 30 mov %esi,(%eax)
_Thread_Enable_dispatch();
1149ed: e8 1e c9 ff ff call 111310 <_Thread_Enable_dispatch>
return 0;
1149f2: 83 c4 10 add $0x10,%esp
1149f5: 31 c0 xor %eax,%eax
}
1149f7: 8d 65 f8 lea -0x8(%ebp),%esp
1149fa: 5b pop %ebx
1149fb: 5e pop %esi
1149fc: c9 leave
1149fd: c3 ret
1149fe: 66 90 xchg %ax,%ax
if ( name ) {
the_semaphore->named = true;
the_semaphore->open_count = 1;
the_semaphore->linked = true;
} else {
the_semaphore->named = false;
114a00: c6 40 14 00 movb $0x0,0x14(%eax)
the_semaphore->open_count = 0;
114a04: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_semaphore->linked = false;
114a0b: c6 40 15 00 movb $0x0,0x15(%eax)
114a0f: eb a9 jmp 1149ba <_POSIX_Semaphore_Create_support+0x72>
114a11: 8d 76 00 lea 0x0(%esi),%esi
CORE_semaphore_Attributes *the_sem_attr;
char *name_p = (char *)name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
rtems_set_errno_and_return_minus_one( ENOSYS );
114a14: e8 47 2c 00 00 call 117660 <__errno>
114a19: c7 00 58 00 00 00 movl $0x58,(%eax)
114a1f: b8 ff ff ff ff mov $0xffffffff,%eax
114a24: eb d1 jmp 1149f7 <_POSIX_Semaphore_Create_support+0xaf>
114a26: 66 90 xchg %ax,%ax
if ( name ) {
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
114a28: e8 33 2c 00 00 call 117660 <__errno>
114a2d: c7 00 5b 00 00 00 movl $0x5b,(%eax)
114a33: b8 ff ff ff ff mov $0xffffffff,%eax
114a38: eb bd jmp 1149f7 <_POSIX_Semaphore_Create_support+0xaf>
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
114a3a: e8 d1 c8 ff ff call 111310 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
114a3f: e8 1c 2c 00 00 call 117660 <__errno>
114a44: c7 00 1c 00 00 00 movl $0x1c,(%eax)
114a4a: b8 ff ff ff ff mov $0xffffffff,%eax
114a4f: eb a6 jmp 1149f7 <_POSIX_Semaphore_Create_support+0xaf>
00114aa4 <_POSIX_Semaphore_Name_to_id>:
int _POSIX_Semaphore_Name_to_id(
const char *name,
sem_t *id
)
{
114aa4: 55 push %ebp
114aa5: 89 e5 mov %esp,%ebp
114aa7: 83 ec 18 sub $0x18,%esp
114aaa: 8b 45 08 mov 0x8(%ebp),%eax
Objects_Name_or_id_lookup_errors status;
Objects_Id the_id;
if ( !name )
114aad: 85 c0 test %eax,%eax
114aaf: 74 05 je 114ab6 <_POSIX_Semaphore_Name_to_id+0x12>
return EINVAL;
if ( !name[0] )
114ab1: 80 38 00 cmpb $0x0,(%eax)
114ab4: 75 0a jne 114ac0 <_POSIX_Semaphore_Name_to_id+0x1c>
return EINVAL;
114ab6: b8 16 00 00 00 mov $0x16,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
114abb: c9 leave
114abc: c3 ret
114abd: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
if ( !name[0] )
return EINVAL;
status = _Objects_Name_to_id_string(
114ac0: 52 push %edx
114ac1: 8d 55 f4 lea -0xc(%ebp),%edx
114ac4: 52 push %edx
114ac5: 50 push %eax
114ac6: 68 20 d6 12 00 push $0x12d620
114acb: e8 78 0c 00 00 call 115748 <_Objects_Name_to_id_string>
&_POSIX_Semaphore_Information,
name,
&the_id
);
*id = the_id;
114ad0: 8b 4d f4 mov -0xc(%ebp),%ecx
114ad3: 8b 55 0c mov 0xc(%ebp),%edx
114ad6: 89 0a mov %ecx,(%edx)
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
114ad8: 83 c4 10 add $0x10,%esp
return 0;
114adb: 83 f8 01 cmp $0x1,%eax
114ade: 19 c0 sbb %eax,%eax
114ae0: f7 d0 not %eax
114ae2: 83 e0 02 and $0x2,%eax
return ENOENT;
}
114ae5: c9 leave
114ae6: c3 ret
00114b10 <_POSIX_Semaphore_Wait_support>:
int _POSIX_Semaphore_Wait_support(
sem_t *sem,
bool blocking,
Watchdog_Interval timeout
)
{
114b10: 55 push %ebp
114b11: 89 e5 mov %esp,%ebp
114b13: 53 push %ebx
114b14: 83 ec 18 sub $0x18,%esp
114b17: 8a 5d 0c mov 0xc(%ebp),%bl
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
114b1a: 8d 45 f4 lea -0xc(%ebp),%eax
sem_t *id,
Objects_Locations *location
)
{
return (POSIX_Semaphore_Control *)
_Objects_Get( &_POSIX_Semaphore_Information, (Objects_Id)*id, location );
114b1d: 50 push %eax
114b1e: 8b 45 08 mov 0x8(%ebp),%eax
114b21: ff 30 pushl (%eax)
114b23: 68 20 d6 12 00 push $0x12d620
114b28: e8 af bc ff ff call 1107dc <_Objects_Get>
switch ( location ) {
114b2d: 83 c4 10 add $0x10,%esp
114b30: 8b 55 f4 mov -0xc(%ebp),%edx
114b33: 85 d2 test %edx,%edx
114b35: 74 15 je 114b4c <_POSIX_Semaphore_Wait_support+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
114b37: e8 24 2b 00 00 call 117660 <__errno>
114b3c: c7 00 16 00 00 00 movl $0x16,(%eax)
114b42: b8 ff ff ff ff mov $0xffffffff,%eax
}
114b47: 8b 5d fc mov -0x4(%ebp),%ebx
114b4a: c9 leave
114b4b: c3 ret
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_semaphore_Seize(
114b4c: ff 75 10 pushl 0x10(%ebp)
114b4f: 0f b6 db movzbl %bl,%ebx
114b52: 53 push %ebx
114b53: ff 70 08 pushl 0x8(%eax)
114b56: 83 c0 1c add $0x1c,%eax
114b59: 50 push %eax
114b5a: e8 29 07 00 00 call 115288 <_CORE_semaphore_Seize>
&the_semaphore->Semaphore,
the_semaphore->Object.id,
blocking,
timeout
);
_Thread_Enable_dispatch();
114b5f: e8 ac c7 ff ff call 111310 <_Thread_Enable_dispatch>
if ( !_Thread_Executing->Wait.return_code )
114b64: 83 c4 10 add $0x10,%esp
114b67: a1 b8 d8 12 00 mov 0x12d8b8,%eax
114b6c: 8b 40 34 mov 0x34(%eax),%eax
114b6f: 85 c0 test %eax,%eax
114b71: 75 09 jne 114b7c <_POSIX_Semaphore_Wait_support+0x6c>
return 0;
114b73: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
114b75: 8b 5d fc mov -0x4(%ebp),%ebx
114b78: c9 leave
114b79: c3 ret
114b7a: 66 90 xchg %ax,%ax
_Thread_Enable_dispatch();
if ( !_Thread_Executing->Wait.return_code )
return 0;
rtems_set_errno_and_return_minus_one(
114b7c: e8 df 2a 00 00 call 117660 <__errno>
114b81: 89 c3 mov %eax,%ebx
114b83: 83 ec 0c sub $0xc,%esp
114b86: a1 b8 d8 12 00 mov 0x12d8b8,%eax
114b8b: ff 70 34 pushl 0x34(%eax)
114b8e: e8 3d 26 00 00 call 1171d0 <_POSIX_Semaphore_Translate_core_semaphore_return_code>
114b93: 89 03 mov %eax,(%ebx)
114b95: 83 c4 10 add $0x10,%esp
114b98: b8 ff ff ff ff mov $0xffffffff,%eax
114b9d: eb a8 jmp 114b47 <_POSIX_Semaphore_Wait_support+0x37>
001106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
1106dc: 55 push %ebp
1106dd: 89 e5 mov %esp,%ebp
1106df: 83 ec 08 sub $0x8,%esp
1106e2: 8b 55 08 mov 0x8(%ebp),%edx
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
1106e5: 8b 82 ec 00 00 00 mov 0xec(%edx),%eax
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
1106eb: 8b 88 d8 00 00 00 mov 0xd8(%eax),%ecx
1106f1: 85 c9 test %ecx,%ecx
1106f3: 75 09 jne 1106fe <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x22><== NEVER TAKEN
1106f5: 83 b8 dc 00 00 00 01 cmpl $0x1,0xdc(%eax)
1106fc: 74 06 je 110704 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x28>
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
} else
_Thread_Enable_dispatch();
}
1106fe: 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();
1106ff: e9 40 d6 ff ff jmp 10dd44 <_Thread_Enable_dispatch>
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
110704: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax
11070a: 85 c0 test %eax,%eax
11070c: 74 f0 je 1106fe <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x22>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
11070e: a1 70 88 12 00 mov 0x128870,%eax
110713: 48 dec %eax
110714: a3 70 88 12 00 mov %eax,0x128870
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
110719: 83 ec 08 sub $0x8,%esp
11071c: 6a ff push $0xffffffff
11071e: 52 push %edx
11071f: e8 c0 08 00 00 call 110fe4 <_POSIX_Thread_Exit>
110724: 83 c4 10 add $0x10,%esp
} else
_Thread_Enable_dispatch();
}
110727: c9 leave
110728: c3 ret
00111a3c <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
111a3c: 55 push %ebp
111a3d: 89 e5 mov %esp,%ebp
111a3f: 57 push %edi
111a40: 56 push %esi
111a41: 53 push %ebx
111a42: 83 ec 18 sub $0x18,%esp
111a45: 8b 5d 08 mov 0x8(%ebp),%ebx
111a48: 8b 75 0c mov 0xc(%ebp),%esi
111a4b: 8b 7d 10 mov 0x10(%ebp),%edi
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
111a4e: ff 36 pushl (%esi)
111a50: e8 cb ff ff ff call 111a20 <_POSIX_Priority_Is_valid>
111a55: 83 c4 10 add $0x10,%esp
111a58: 84 c0 test %al,%al
111a5a: 74 2a je 111a86 <_POSIX_Thread_Translate_sched_param+0x4a><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
111a5c: c7 07 00 00 00 00 movl $0x0,(%edi)
*budget_callout = NULL;
111a62: 8b 45 14 mov 0x14(%ebp),%eax
111a65: c7 00 00 00 00 00 movl $0x0,(%eax)
if ( policy == SCHED_OTHER ) {
111a6b: 85 db test %ebx,%ebx
111a6d: 74 25 je 111a94 <_POSIX_Thread_Translate_sched_param+0x58>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
111a6f: 83 fb 01 cmp $0x1,%ebx
111a72: 0f 84 90 00 00 00 je 111b08 <_POSIX_Thread_Translate_sched_param+0xcc>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
111a78: 83 fb 02 cmp $0x2,%ebx
111a7b: 0f 84 8f 00 00 00 je 111b10 <_POSIX_Thread_Translate_sched_param+0xd4>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
111a81: 83 fb 04 cmp $0x4,%ebx
111a84: 74 1e je 111aa4 <_POSIX_Thread_Translate_sched_param+0x68>
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
return EINVAL;
111a86: b8 16 00 00 00 mov $0x16,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
111a8b: 8d 65 f4 lea -0xc(%ebp),%esp
111a8e: 5b pop %ebx
111a8f: 5e pop %esi
111a90: 5f pop %edi
111a91: c9 leave
111a92: c3 ret
111a93: 90 nop
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
111a94: c7 07 01 00 00 00 movl $0x1,(%edi)
return 0;
111a9a: 31 c0 xor %eax,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
111a9c: 8d 65 f4 lea -0xc(%ebp),%esp
111a9f: 5b pop %ebx
111aa0: 5e pop %esi
111aa1: 5f pop %edi
111aa2: c9 leave
111aa3: c3 ret
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
111aa4: 8b 5e 08 mov 0x8(%esi),%ebx
111aa7: 85 db test %ebx,%ebx
111aa9: 75 07 jne 111ab2 <_POSIX_Thread_Translate_sched_param+0x76>
111aab: 8b 4e 0c mov 0xc(%esi),%ecx
111aae: 85 c9 test %ecx,%ecx
111ab0: 74 d4 je 111a86 <_POSIX_Thread_Translate_sched_param+0x4a>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
111ab2: 8b 56 10 mov 0x10(%esi),%edx
111ab5: 85 d2 test %edx,%edx
111ab7: 75 07 jne 111ac0 <_POSIX_Thread_Translate_sched_param+0x84>
111ab9: 8b 46 14 mov 0x14(%esi),%eax
111abc: 85 c0 test %eax,%eax
111abe: 74 c6 je 111a86 <_POSIX_Thread_Translate_sched_param+0x4a>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
111ac0: 83 ec 0c sub $0xc,%esp
111ac3: 8d 46 08 lea 0x8(%esi),%eax
111ac6: 50 push %eax
111ac7: e8 08 da ff ff call 10f4d4 <_Timespec_To_ticks>
111acc: 89 c3 mov %eax,%ebx
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
111ace: 8d 46 10 lea 0x10(%esi),%eax
111ad1: 89 04 24 mov %eax,(%esp)
111ad4: e8 fb d9 ff ff call 10f4d4 <_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 ) <
111ad9: 83 c4 10 add $0x10,%esp
111adc: 39 c3 cmp %eax,%ebx
111ade: 72 a6 jb 111a86 <_POSIX_Thread_Translate_sched_param+0x4a>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
111ae0: 83 ec 0c sub $0xc,%esp
111ae3: ff 76 04 pushl 0x4(%esi)
111ae6: e8 35 ff ff ff call 111a20 <_POSIX_Priority_Is_valid>
111aeb: 83 c4 10 add $0x10,%esp
111aee: 84 c0 test %al,%al
111af0: 74 94 je 111a86 <_POSIX_Thread_Translate_sched_param+0x4a>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
111af2: c7 07 03 00 00 00 movl $0x3,(%edi)
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
111af8: 8b 45 14 mov 0x14(%ebp),%eax
111afb: c7 00 04 bd 10 00 movl $0x10bd04,(%eax)
return 0;
111b01: 31 c0 xor %eax,%eax
111b03: eb 86 jmp 111a8b <_POSIX_Thread_Translate_sched_param+0x4f>
111b05: 8d 76 00 lea 0x0(%esi),%esi
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
111b08: 31 c0 xor %eax,%eax
111b0a: e9 7c ff ff ff jmp 111a8b <_POSIX_Thread_Translate_sched_param+0x4f>
111b0f: 90 nop
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
111b10: c7 07 02 00 00 00 movl $0x2,(%edi)
return 0;
111b16: 31 c0 xor %eax,%eax
111b18: e9 6e ff ff ff jmp 111a8b <_POSIX_Thread_Translate_sched_param+0x4f>
001108e8 <_POSIX_Threads_Create_extension>:
bool _POSIX_Threads_Create_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *created
)
{
1108e8: 55 push %ebp
1108e9: 89 e5 mov %esp,%ebp
1108eb: 57 push %edi
1108ec: 56 push %esi
1108ed: 53 push %ebx
1108ee: 83 ec 28 sub $0x28,%esp
1108f1: 8b 55 0c mov 0xc(%ebp),%edx
POSIX_API_Control *api;
POSIX_API_Control *executing_api;
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
1108f4: 68 f0 00 00 00 push $0xf0
1108f9: 89 55 e4 mov %edx,-0x1c(%ebp)
1108fc: e8 5f e0 ff ff call 10e960 <_Workspace_Allocate>
110901: 89 c3 mov %eax,%ebx
if ( !api )
110903: 83 c4 10 add $0x10,%esp
110906: 85 c0 test %eax,%eax
110908: 8b 55 e4 mov -0x1c(%ebp),%edx
11090b: 0f 84 2f 01 00 00 je 110a40 <_POSIX_Threads_Create_extension+0x158><== NEVER TAKEN
return false;
created->API_Extensions[ THREAD_API_POSIX ] = api;
110911: 89 82 ec 00 00 00 mov %eax,0xec(%edx)
/* XXX check all fields are touched */
api->Attributes = _POSIX_Threads_Default_attributes;
110917: b9 40 00 00 00 mov $0x40,%ecx
11091c: 31 c0 xor %eax,%eax
11091e: 89 df mov %ebx,%edi
110920: f3 aa rep stos %al,%es:(%edi)
110922: c7 03 01 00 00 00 movl $0x1,(%ebx)
110928: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
11092f: c7 43 14 01 00 00 00 movl $0x1,0x14(%ebx)
110936: c7 43 18 02 00 00 00 movl $0x2,0x18(%ebx)
11093d: c7 43 38 01 00 00 00 movl $0x1,0x38(%ebx)
110944: c7 43 3c 01 00 00 00 movl $0x1,0x3c(%ebx)
api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
11094b: c7 43 40 01 00 00 00 movl $0x1,0x40(%ebx)
api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
110952: c7 83 84 00 00 00 01 movl $0x1,0x84(%ebx)
110959: 00 00 00
api->schedparam = _POSIX_Threads_Default_attributes.schedparam;
11095c: be 78 13 12 00 mov $0x121378,%esi
110961: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi
110967: b1 07 mov $0x7,%cl
110969: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
Priority_Control priority
)
{
return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
11096b: 0f b6 05 74 32 12 00 movzbl 0x123274,%eax
110972: 2b 42 14 sub 0x14(%edx),%eax
110975: 89 83 88 00 00 00 mov %eax,0x88(%ebx)
_POSIX_Priority_From_core( created->current_priority );
/*
* POSIX 1003.1 1996, 18.2.2.2
*/
api->cancelation_requested = 0;
11097b: c7 83 e0 00 00 00 00 movl $0x0,0xe0(%ebx)
110982: 00 00 00
api->cancelability_state = PTHREAD_CANCEL_ENABLE;
110985: c7 83 d8 00 00 00 00 movl $0x0,0xd8(%ebx)
11098c: 00 00 00
api->cancelability_type = PTHREAD_CANCEL_DEFERRED;
11098f: c7 83 dc 00 00 00 00 movl $0x0,0xdc(%ebx)
110996: 00 00 00
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
110999: 8d 83 e8 00 00 00 lea 0xe8(%ebx),%eax
11099f: 89 83 e4 00 00 00 mov %eax,0xe4(%ebx)
head->next = tail;
head->previous = NULL;
1109a5: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
1109ac: 00 00 00
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
1109af: 8d 83 e4 00 00 00 lea 0xe4(%ebx),%eax
1109b5: 89 83 ec 00 00 00 mov %eax,0xec(%ebx)
*
* The check for class == 1 is debug. Should never really happen.
*/
/* XXX use signal constants */
api->signals_pending = 0;
1109bb: c7 83 d4 00 00 00 00 movl $0x0,0xd4(%ebx)
1109c2: 00 00 00
1109c5: 0f b6 42 0b movzbl 0xb(%edx),%eax
1109c9: 83 e0 07 and $0x7,%eax
if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API
1109cc: 83 f8 03 cmp $0x3,%eax
1109cf: 74 53 je 110a24 <_POSIX_Threads_Create_extension+0x13c>
#endif
) {
executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
api->signals_blocked = executing_api->signals_blocked;
} else {
api->signals_blocked = 0xffffffff;
1109d1: c7 83 d0 00 00 00 ff movl $0xffffffff,0xd0(%ebx)
1109d8: ff ff ff
}
_Thread_queue_Initialize(
1109db: 6a 00 push $0x0
1109dd: 68 00 10 00 00 push $0x1000
1109e2: 6a 00 push $0x0
1109e4: 8d 43 44 lea 0x44(%ebx),%eax
1109e7: 50 push %eax
1109e8: 89 55 e4 mov %edx,-0x1c(%ebp)
1109eb: e8 50 d6 ff ff call 10e040 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_JOIN_AT_EXIT,
0
);
_Watchdog_Initialize(
1109f0: 8b 55 e4 mov -0x1c(%ebp),%edx
1109f3: 8b 42 08 mov 0x8(%edx),%eax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1109f6: c7 83 b0 00 00 00 00 movl $0x0,0xb0(%ebx)
1109fd: 00 00 00
the_watchdog->routine = routine;
110a00: c7 83 c4 00 00 00 4c movl $0x110a4c,0xc4(%ebx)
110a07: 0a 11 00
the_watchdog->id = id;
110a0a: 89 83 c8 00 00 00 mov %eax,0xc8(%ebx)
the_watchdog->user_data = user_data;
110a10: 89 93 cc 00 00 00 mov %edx,0xcc(%ebx)
_POSIX_Threads_Sporadic_budget_TSR,
created->Object.id,
created
);
return true;
110a16: 83 c4 10 add $0x10,%esp
110a19: b0 01 mov $0x1,%al
}
110a1b: 8d 65 f4 lea -0xc(%ebp),%esp
110a1e: 5b pop %ebx
110a1f: 5e pop %esi
110a20: 5f pop %edi
110a21: c9 leave
110a22: c3 ret
110a23: 90 nop
if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API
#if defined(RTEMS_DEBUG)
&& _Objects_Get_class( created->Object.id ) == 1
#endif
) {
executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
110a24: a1 38 7b 12 00 mov 0x127b38,%eax
api->signals_blocked = executing_api->signals_blocked;
110a29: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
110a2f: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
110a35: 89 83 d0 00 00 00 mov %eax,0xd0(%ebx)
110a3b: eb 9e jmp 1109db <_POSIX_Threads_Create_extension+0xf3>
110a3d: 8d 76 00 lea 0x0(%esi),%esi
POSIX_API_Control *executing_api;
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
if ( !api )
return false;
110a40: 31 c0 xor %eax,%eax
created->Object.id,
created
);
return true;
}
110a42: 8d 65 f4 lea -0xc(%ebp),%esp
110a45: 5b pop %ebx
110a46: 5e pop %esi
110a47: 5f pop %edi
110a48: c9 leave
110a49: c3 ret
00110860 <_POSIX_Threads_Delete_extension>:
*/
void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
110860: 55 push %ebp
110861: 89 e5 mov %esp,%ebp
110863: 57 push %edi
110864: 56 push %esi
110865: 53 push %ebx
110866: 83 ec 28 sub $0x28,%esp
110869: 8b 7d 0c mov 0xc(%ebp),%edi
Thread_Control *the_thread;
POSIX_API_Control *api;
void **value_ptr;
api = deleted->API_Extensions[ THREAD_API_POSIX ];
11086c: 8b 87 ec 00 00 00 mov 0xec(%edi),%eax
110872: 89 45 e4 mov %eax,-0x1c(%ebp)
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
110875: 57 push %edi
110876: e8 f1 22 00 00 call 112b6c <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
11087b: 89 3c 24 mov %edi,(%esp)
11087e: e8 51 23 00 00 call 112bd4 <_POSIX_Keys_Run_destructors>
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
110883: 8b 77 28 mov 0x28(%edi),%esi
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
110886: 83 c4 10 add $0x10,%esp
110889: 8b 45 e4 mov -0x1c(%ebp),%eax
11088c: 8d 58 44 lea 0x44(%eax),%ebx
11088f: eb 08 jmp 110899 <_POSIX_Threads_Delete_extension+0x39>
110891: 8d 76 00 lea 0x0(%esi),%esi
*(void **)the_thread->Wait.return_argument = value_ptr;
110894: 8b 40 28 mov 0x28(%eax),%eax
110897: 89 30 mov %esi,(%eax)
/*
* 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 )) )
110899: 83 ec 0c sub $0xc,%esp
11089c: 53 push %ebx
11089d: e8 0e d4 ff ff call 10dcb0 <_Thread_queue_Dequeue>
1108a2: 83 c4 10 add $0x10,%esp
1108a5: 85 c0 test %eax,%eax
1108a7: 75 eb jne 110894 <_POSIX_Threads_Delete_extension+0x34>
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
1108a9: 8b 45 e4 mov -0x1c(%ebp),%eax
1108ac: 83 b8 84 00 00 00 04 cmpl $0x4,0x84(%eax)
1108b3: 74 1f je 1108d4 <_POSIX_Threads_Delete_extension+0x74>
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
1108b5: c7 87 ec 00 00 00 00 movl $0x0,0xec(%edi)
1108bc: 00 00 00
(void) _Workspace_Free( api );
1108bf: 8b 45 e4 mov -0x1c(%ebp),%eax
1108c2: 89 45 08 mov %eax,0x8(%ebp)
}
1108c5: 8d 65 f4 lea -0xc(%ebp),%esp
1108c8: 5b pop %ebx
1108c9: 5e pop %esi
1108ca: 5f pop %edi
1108cb: c9 leave
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
(void) _Workspace_Free( api );
1108cc: e9 ab e0 ff ff jmp 10e97c <_Workspace_Free>
1108d1: 8d 76 00 lea 0x0(%esi),%esi
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
1108d4: 83 ec 0c sub $0xc,%esp
1108d7: 05 a8 00 00 00 add $0xa8,%eax
1108dc: 50 push %eax
1108dd: e8 56 df ff ff call 10e838 <_Watchdog_Remove>
1108e2: 83 c4 10 add $0x10,%esp
1108e5: eb ce jmp 1108b5 <_POSIX_Threads_Delete_extension+0x55>
00110824 <_POSIX_Threads_Initialize_user_threads>:
*
* This routine creates and starts all configured user
* initialzation threads.
*/
void _POSIX_Threads_Initialize_user_threads( void )
{
110824: 55 push %ebp
110825: 89 e5 mov %esp,%ebp
110827: 83 ec 08 sub $0x8,%esp
if ( _POSIX_Threads_Initialize_user_threads_p )
11082a: a1 f8 57 12 00 mov 0x1257f8,%eax
11082f: 85 c0 test %eax,%eax
110831: 74 05 je 110838 <_POSIX_Threads_Initialize_user_threads+0x14>
(*_POSIX_Threads_Initialize_user_threads_p)();
}
110833: c9 leave
* initialzation threads.
*/
void _POSIX_Threads_Initialize_user_threads( void )
{
if ( _POSIX_Threads_Initialize_user_threads_p )
(*_POSIX_Threads_Initialize_user_threads_p)();
110834: ff e0 jmp *%eax
110836: 66 90 xchg %ax,%ax
}
110838: c9 leave
110839: c3 ret
0010b9e4 <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
10b9e4: 55 push %ebp
10b9e5: 89 e5 mov %esp,%ebp
10b9e7: 57 push %edi
10b9e8: 56 push %esi
10b9e9: 53 push %ebx
10b9ea: 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;
10b9ed: 8b 3d 74 45 12 00 mov 0x124574,%edi
maximum = Configuration_POSIX_API.number_of_initialization_threads;
10b9f3: a1 70 45 12 00 mov 0x124570,%eax
10b9f8: 89 45 94 mov %eax,-0x6c(%ebp)
if ( !user_threads || maximum == 0 )
10b9fb: 85 ff test %edi,%edi
10b9fd: 74 44 je 10ba43 <_POSIX_Threads_Initialize_user_threads_body+0x5f><== NEVER TAKEN
10b9ff: 85 c0 test %eax,%eax
10ba01: 74 40 je 10ba43 <_POSIX_Threads_Initialize_user_threads_body+0x5f><== NEVER TAKEN
10ba03: 31 db xor %ebx,%ebx
10ba05: 8d 75 a4 lea -0x5c(%ebp),%esi
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
10ba08: 83 ec 0c sub $0xc,%esp
10ba0b: 56 push %esi
10ba0c: e8 0f 61 00 00 call 111b20 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
10ba11: 5a pop %edx
10ba12: 59 pop %ecx
10ba13: 6a 02 push $0x2
10ba15: 56 push %esi
10ba16: e8 31 61 00 00 call 111b4c <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
10ba1b: 59 pop %ecx
10ba1c: 58 pop %eax
10ba1d: ff 74 df 04 pushl 0x4(%edi,%ebx,8)
10ba21: 56 push %esi
10ba22: e8 59 61 00 00 call 111b80 <pthread_attr_setstacksize>
status = pthread_create(
10ba27: 6a 00 push $0x0
10ba29: ff 34 df pushl (%edi,%ebx,8)
10ba2c: 56 push %esi
10ba2d: 8d 45 e4 lea -0x1c(%ebp),%eax
10ba30: 50 push %eax
10ba31: e8 92 fc ff ff call 10b6c8 <pthread_create>
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
10ba36: 83 c4 20 add $0x20,%esp
10ba39: 85 c0 test %eax,%eax
10ba3b: 75 0e jne 10ba4b <_POSIX_Threads_Initialize_user_threads_body+0x67>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
10ba3d: 43 inc %ebx
10ba3e: 39 5d 94 cmp %ebx,-0x6c(%ebp)
10ba41: 77 c5 ja 10ba08 <_POSIX_Threads_Initialize_user_threads_body+0x24><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
10ba43: 8d 65 f4 lea -0xc(%ebp),%esp
10ba46: 5b pop %ebx
10ba47: 5e pop %esi
10ba48: 5f pop %edi
10ba49: c9 leave
10ba4a: c3 ret
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
10ba4b: 52 push %edx
10ba4c: 50 push %eax
10ba4d: 6a 01 push $0x1
10ba4f: 6a 02 push $0x2
10ba51: e8 d6 1e 00 00 call 10d92c <_Internal_error_Occurred>
00110a4c <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
110a4c: 55 push %ebp
110a4d: 89 e5 mov %esp,%ebp
110a4f: 56 push %esi
110a50: 53 push %ebx
110a51: 8b 75 0c mov 0xc(%ebp),%esi
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
110a54: 8b 9e ec 00 00 00 mov 0xec(%esi),%ebx
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
110a5a: 83 ec 0c sub $0xc,%esp
110a5d: 8d 83 98 00 00 00 lea 0x98(%ebx),%eax
110a63: 50 push %eax
110a64: e8 5b 0f 00 00 call 1119c4 <_Timespec_To_ticks>
the_thread->cpu_time_budget = ticks;
110a69: 89 46 78 mov %eax,0x78(%esi)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
110a6c: 0f b6 05 74 32 12 00 movzbl 0x123274,%eax
110a73: 2b 83 88 00 00 00 sub 0x88(%ebx),%eax
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
110a79: 89 46 18 mov %eax,0x18(%esi)
*/
#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 ) {
110a7c: 83 c4 10 add $0x10,%esp
110a7f: 8b 4e 1c mov 0x1c(%esi),%ecx
110a82: 85 c9 test %ecx,%ecx
110a84: 75 05 jne 110a8b <_POSIX_Threads_Sporadic_budget_TSR+0x3f><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
110a86: 39 46 14 cmp %eax,0x14(%esi)
110a89: 77 35 ja 110ac0 <_POSIX_Threads_Sporadic_budget_TSR+0x74>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
110a8b: 83 ec 0c sub $0xc,%esp
110a8e: 8d 83 90 00 00 00 lea 0x90(%ebx),%eax
110a94: 50 push %eax
110a95: e8 2a 0f 00 00 call 1119c4 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
110a9a: 89 83 b4 00 00 00 mov %eax,0xb4(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
110aa0: 83 c4 10 add $0x10,%esp
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
110aa3: 81 c3 a8 00 00 00 add $0xa8,%ebx
110aa9: 89 5d 0c mov %ebx,0xc(%ebp)
110aac: c7 45 08 5c 76 12 00 movl $0x12765c,0x8(%ebp)
}
110ab3: 8d 65 f8 lea -0x8(%ebp),%esp
110ab6: 5b pop %ebx
110ab7: 5e pop %esi
110ab8: c9 leave
110ab9: e9 42 dc ff ff jmp 10e700 <_Watchdog_Insert>
110abe: 66 90 xchg %ax,%ax
if ( the_thread->resource_count == 0 ) {
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
_Thread_Change_priority( the_thread, new_priority, true );
110ac0: 52 push %edx
110ac1: 6a 01 push $0x1
110ac3: 50 push %eax
110ac4: 56 push %esi
110ac5: e8 7e c9 ff ff call 10d448 <_Thread_Change_priority>
110aca: 83 c4 10 add $0x10,%esp
110acd: eb bc jmp 110a8b <_POSIX_Threads_Sporadic_budget_TSR+0x3f>
00110ad0 <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
110ad0: 55 push %ebp
110ad1: 89 e5 mov %esp,%ebp
110ad3: 83 ec 08 sub $0x8,%esp
110ad6: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
110ad9: 8b 88 ec 00 00 00 mov 0xec(%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 */
110adf: c7 40 78 ff ff ff ff movl $0xffffffff,0x78(%eax)
110ae6: 0f b6 15 74 32 12 00 movzbl 0x123274,%edx
110aed: 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;
110af3: 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 ) {
110af6: 8b 48 1c mov 0x1c(%eax),%ecx
110af9: 85 c9 test %ecx,%ecx
110afb: 75 05 jne 110b02 <_POSIX_Threads_Sporadic_budget_callout+0x32><== 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 ) {
110afd: 39 50 14 cmp %edx,0x14(%eax)
110b00: 72 02 jb 110b04 <_POSIX_Threads_Sporadic_budget_callout+0x34><== ALWAYS TAKEN
#if 0
printk( "lower priority\n" );
#endif
}
}
}
110b02: c9 leave <== NOT EXECUTED
110b03: c3 ret <== NOT EXECUTED
* 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 ) {
_Thread_Change_priority( the_thread, new_priority, true );
110b04: 51 push %ecx
110b05: 6a 01 push $0x1
110b07: 52 push %edx
110b08: 50 push %eax
110b09: e8 3a c9 ff ff call 10d448 <_Thread_Change_priority>
110b0e: 83 c4 10 add $0x10,%esp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
110b11: c9 leave
110b12: c3 ret
00112b6c <_POSIX_Threads_cancel_run>:
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
112b6c: 55 push %ebp
112b6d: 89 e5 mov %esp,%ebp
112b6f: 57 push %edi
112b70: 56 push %esi
112b71: 53 push %ebx
112b72: 83 ec 0c sub $0xc,%esp
POSIX_Cancel_Handler_control *handler;
Chain_Control *handler_stack;
POSIX_API_Control *thread_support;
ISR_Level level;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
112b75: 8b 45 08 mov 0x8(%ebp),%eax
112b78: 8b 98 ec 00 00 00 mov 0xec(%eax),%ebx
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
112b7e: c7 83 d8 00 00 00 01 movl $0x1,0xd8(%ebx)
112b85: 00 00 00
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
112b88: 8d b3 e8 00 00 00 lea 0xe8(%ebx),%esi
while ( !_Chain_Is_empty( handler_stack ) ) {
112b8e: 39 b3 e4 00 00 00 cmp %esi,0xe4(%ebx)
112b94: 74 33 je 112bc9 <_POSIX_Threads_cancel_run+0x5d>
112b96: 66 90 xchg %ax,%ax
_ISR_Disable( level );
112b98: 9c pushf
112b99: fa cli
112b9a: 59 pop %ecx
handler = (POSIX_Cancel_Handler_control *)
112b9b: 8b bb ec 00 00 00 mov 0xec(%ebx),%edi
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
112ba1: 8b 17 mov (%edi),%edx
previous = the_node->previous;
112ba3: 8b 47 04 mov 0x4(%edi),%eax
next->previous = previous;
112ba6: 89 42 04 mov %eax,0x4(%edx)
previous->next = next;
112ba9: 89 10 mov %edx,(%eax)
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
112bab: 51 push %ecx
112bac: 9d popf
(*handler->routine)( handler->arg );
112bad: 83 ec 0c sub $0xc,%esp
112bb0: ff 77 0c pushl 0xc(%edi)
112bb3: ff 57 08 call *0x8(%edi)
_Workspace_Free( handler );
112bb6: 89 3c 24 mov %edi,(%esp)
112bb9: e8 be bd ff ff call 10e97c <_Workspace_Free>
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
112bbe: 83 c4 10 add $0x10,%esp
112bc1: 39 b3 e4 00 00 00 cmp %esi,0xe4(%ebx)
112bc7: 75 cf jne 112b98 <_POSIX_Threads_cancel_run+0x2c><== NEVER TAKEN
(*handler->routine)( handler->arg );
_Workspace_Free( handler );
}
}
112bc9: 8d 65 f4 lea -0xc(%ebp),%esp
112bcc: 5b pop %ebx
112bcd: 5e pop %esi
112bce: 5f pop %edi
112bcf: c9 leave
112bd0: c3 ret
0011181c <_POSIX_Timer_Insert_helper>:
Watchdog_Interval ticks,
Objects_Id id,
Watchdog_Service_routine_entry TSR,
void *arg
)
{
11181c: 55 push %ebp
11181d: 89 e5 mov %esp,%ebp
11181f: 56 push %esi
111820: 53 push %ebx
111821: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
(void) _Watchdog_Remove( timer );
111824: 83 ec 0c sub $0xc,%esp
111827: 53 push %ebx
111828: e8 07 db ff ff call 10f334 <_Watchdog_Remove>
_ISR_Disable( level );
11182d: 9c pushf
11182e: fa cli
11182f: 5e pop %esi
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( timer->state != WATCHDOG_INACTIVE ) {
111830: 83 c4 10 add $0x10,%esp
111833: 8b 43 08 mov 0x8(%ebx),%eax
111836: 85 c0 test %eax,%eax
111838: 74 0e je 111848 <_POSIX_Timer_Insert_helper+0x2c>
_ISR_Enable( level );
11183a: 56 push %esi
11183b: 9d popf
return false;
11183c: 31 c0 xor %eax,%eax
*/
_Watchdog_Initialize( timer, TSR, id, arg );
_Watchdog_Insert_ticks( timer, ticks );
_ISR_Enable( level );
return true;
}
11183e: 8d 65 f8 lea -0x8(%ebp),%esp
111841: 5b pop %ebx
111842: 5e pop %esi
111843: c9 leave
111844: c3 ret
111845: 8d 76 00 lea 0x0(%esi),%esi
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
111848: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
the_watchdog->routine = routine;
11184f: 8b 45 14 mov 0x14(%ebp),%eax
111852: 89 43 1c mov %eax,0x1c(%ebx)
the_watchdog->id = id;
111855: 8b 45 10 mov 0x10(%ebp),%eax
111858: 89 43 20 mov %eax,0x20(%ebx)
the_watchdog->user_data = user_data;
11185b: 8b 45 18 mov 0x18(%ebp),%eax
11185e: 89 43 24 mov %eax,0x24(%ebx)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
111861: 8b 45 0c mov 0xc(%ebp),%eax
111864: 89 43 0c mov %eax,0xc(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
111867: 83 ec 08 sub $0x8,%esp
11186a: 53 push %ebx
11186b: 68 7c 99 12 00 push $0x12997c
111870: e8 87 d9 ff ff call 10f1fc <_Watchdog_Insert>
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
_Watchdog_Initialize( timer, TSR, id, arg );
_Watchdog_Insert_ticks( timer, ticks );
_ISR_Enable( level );
111875: 56 push %esi
111876: 9d popf
return true;
111877: 83 c4 10 add $0x10,%esp
11187a: b0 01 mov $0x1,%al
}
11187c: 8d 65 f8 lea -0x8(%ebp),%esp
11187f: 5b pop %ebx
111880: 5e pop %esi
111881: c9 leave
111882: c3 ret
0010b7f0 <_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)
{
10b7f0: 55 push %ebp
10b7f1: 89 e5 mov %esp,%ebp
10b7f3: 53 push %ebx
10b7f4: 83 ec 04 sub $0x4,%esp
10b7f7: 8b 5d 0c mov 0xc(%ebp),%ebx
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
10b7fa: ff 43 68 incl 0x68(%ebx)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
10b7fd: 8b 53 54 mov 0x54(%ebx),%edx
10b800: 85 d2 test %edx,%edx
10b802: 75 28 jne 10b82c <_POSIX_Timer_TSR+0x3c>
10b804: 8b 43 58 mov 0x58(%ebx),%eax
10b807: 85 c0 test %eax,%eax
10b809: 75 21 jne 10b82c <_POSIX_Timer_TSR+0x3c> <== ALWAYS TAKEN
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10b80b: 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 ) ) {
10b80f: 83 ec 08 sub $0x8,%esp
10b812: ff 73 44 pushl 0x44(%ebx)
10b815: ff 73 38 pushl 0x38(%ebx)
10b818: e8 8f 5b 00 00 call 1113ac <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
10b81d: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
10b824: 83 c4 10 add $0x10,%esp
}
10b827: 8b 5d fc mov -0x4(%ebp),%ebx
10b82a: c9 leave
10b82b: c3 ret
ptimer->overrun = ptimer->overrun + 1;
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
10b82c: 83 ec 0c sub $0xc,%esp
10b82f: 53 push %ebx
10b830: 68 f0 b7 10 00 push $0x10b7f0
10b835: ff 73 08 pushl 0x8(%ebx)
10b838: ff 73 64 pushl 0x64(%ebx)
10b83b: 8d 43 10 lea 0x10(%ebx),%eax
10b83e: 50 push %eax
10b83f: e8 d8 5f 00 00 call 11181c <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
10b844: 83 c4 20 add $0x20,%esp
10b847: 84 c0 test %al,%al
10b849: 74 dc je 10b827 <_POSIX_Timer_TSR+0x37> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
10b84b: 83 ec 0c sub $0xc,%esp
10b84e: 8d 43 6c lea 0x6c(%ebx),%eax
10b851: 50 push %eax
10b852: e8 95 16 00 00 call 10ceec <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10b857: c6 43 3c 03 movb $0x3,0x3c(%ebx)
10b85b: 83 c4 10 add $0x10,%esp
10b85e: eb af jmp 10b80f <_POSIX_Timer_TSR+0x1f>
00112c58 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
112c58: 55 push %ebp
112c59: 89 e5 mov %esp,%ebp
112c5b: 57 push %edi
112c5c: 56 push %esi
112c5d: 53 push %ebx
112c5e: 83 ec 78 sub $0x78,%esp
112c61: 8b 5d 0c mov 0xc(%ebp),%ebx
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,
112c64: 6a 01 push $0x1
112c66: 0f b6 45 10 movzbl 0x10(%ebp),%eax
112c6a: 50 push %eax
112c6b: 8d 55 dc lea -0x24(%ebp),%edx
112c6e: 52 push %edx
112c6f: 53 push %ebx
112c70: ff 75 08 pushl 0x8(%ebp)
112c73: 89 55 9c mov %edx,-0x64(%ebp)
112c76: e8 b5 00 00 00 call 112d30 <_POSIX_signals_Clear_signals>
112c7b: 83 c4 20 add $0x20,%esp
112c7e: 84 c0 test %al,%al
112c80: 8b 55 9c mov -0x64(%ebp),%edx
112c83: 0f 84 9b 00 00 00 je 112d24 <_POSIX_signals_Check_signal+0xcc>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
112c89: 8d 04 5b lea (%ebx,%ebx,2),%eax
112c8c: c1 e0 02 shl $0x2,%eax
112c8f: 8b 88 a8 7b 12 00 mov 0x127ba8(%eax),%ecx
112c95: 89 4d a4 mov %ecx,-0x5c(%ebp)
112c98: 49 dec %ecx
112c99: 0f 84 85 00 00 00 je 112d24 <_POSIX_signals_Check_signal+0xcc><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
112c9f: 8b 75 08 mov 0x8(%ebp),%esi
112ca2: 8b b6 d0 00 00 00 mov 0xd0(%esi),%esi
112ca8: 89 75 a0 mov %esi,-0x60(%ebp)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
112cab: 8b 88 a4 7b 12 00 mov 0x127ba4(%eax),%ecx
112cb1: 09 f1 or %esi,%ecx
112cb3: 8b 75 08 mov 0x8(%ebp),%esi
112cb6: 89 8e d0 00 00 00 mov %ecx,0xd0(%esi)
/*
* 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,
112cbc: 8d 75 b4 lea -0x4c(%ebp),%esi
112cbf: 89 75 94 mov %esi,-0x6c(%ebp)
112cc2: 8b 35 38 7b 12 00 mov 0x127b38,%esi
112cc8: 83 c6 20 add $0x20,%esi
112ccb: b9 0a 00 00 00 mov $0xa,%ecx
112cd0: 8b 7d 94 mov -0x6c(%ebp),%edi
112cd3: 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 ) {
112cd5: 83 b8 a0 7b 12 00 02 cmpl $0x2,0x127ba0(%eax)
112cdc: 74 36 je 112d14 <_POSIX_signals_Check_signal+0xbc>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
112cde: 83 ec 0c sub $0xc,%esp
112ce1: 53 push %ebx
112ce2: ff 55 a4 call *-0x5c(%ebp)
break;
112ce5: 83 c4 10 add $0x10,%esp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
112ce8: 8b 3d 38 7b 12 00 mov 0x127b38,%edi
112cee: 83 c7 20 add $0x20,%edi
112cf1: b9 0a 00 00 00 mov $0xa,%ecx
112cf6: 8b 75 94 mov -0x6c(%ebp),%esi
112cf9: 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;
112cfb: 8b 55 a0 mov -0x60(%ebp),%edx
112cfe: 8b 45 08 mov 0x8(%ebp),%eax
112d01: 89 90 d0 00 00 00 mov %edx,0xd0(%eax)
return true;
112d07: b0 01 mov $0x1,%al
}
112d09: 8d 65 f4 lea -0xc(%ebp),%esp
112d0c: 5b pop %ebx
112d0d: 5e pop %esi
112d0e: 5f pop %edi
112d0f: c9 leave
112d10: c3 ret
112d11: 8d 76 00 lea 0x0(%esi),%esi
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
112d14: 50 push %eax
112d15: 6a 00 push $0x0
112d17: 52 push %edx
112d18: 53 push %ebx
112d19: ff 55 a4 call *-0x5c(%ebp)
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
112d1c: 83 c4 10 add $0x10,%esp
112d1f: eb c7 jmp 112ce8 <_POSIX_signals_Check_signal+0x90>
112d21: 8d 76 00 lea 0x0(%esi),%esi
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
return false;
112d24: 31 c0 xor %eax,%eax
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
112d26: 8d 65 f4 lea -0xc(%ebp),%esp
112d29: 5b pop %ebx
112d2a: 5e pop %esi
112d2b: 5f pop %edi
112d2c: c9 leave
112d2d: c3 ret
001132e0 <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
1132e0: 55 push %ebp
1132e1: 89 e5 mov %esp,%ebp
1132e3: 53 push %ebx
1132e4: 8b 4d 08 mov 0x8(%ebp),%ecx
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
1132e7: 9c pushf
1132e8: fa cli
1132e9: 5a pop %edx
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
1132ea: 8d 04 49 lea (%ecx,%ecx,2),%eax
1132ed: c1 e0 02 shl $0x2,%eax
1132f0: 83 b8 a0 7b 12 00 02 cmpl $0x2,0x127ba0(%eax)
1132f7: 74 13 je 11330c <_POSIX_signals_Clear_process_signals+0x2c>
1132f9: 49 dec %ecx
1132fa: b8 fe ff ff ff mov $0xfffffffe,%eax
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
1132ff: d3 c0 rol %cl,%eax
113301: 21 05 a8 7d 12 00 and %eax,0x127da8
}
_ISR_Enable( level );
113307: 52 push %edx
113308: 9d popf
}
113309: 5b pop %ebx
11330a: c9 leave
11330b: c3 ret
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
11330c: 8d 98 c4 7d 12 00 lea 0x127dc4(%eax),%ebx
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
113312: 39 98 c0 7d 12 00 cmp %ebx,0x127dc0(%eax)
113318: 75 ed jne 113307 <_POSIX_signals_Clear_process_signals+0x27><== NEVER TAKEN
11331a: eb dd jmp 1132f9 <_POSIX_signals_Clear_process_signals+0x19>
00112d30 <_POSIX_signals_Clear_signals>:
int signo,
siginfo_t *info,
bool is_global,
bool check_blocked
)
{
112d30: 55 push %ebp
112d31: 89 e5 mov %esp,%ebp
112d33: 57 push %edi
112d34: 56 push %esi
112d35: 53 push %ebx
112d36: 83 ec 1c sub $0x1c,%esp
112d39: 8b 5d 0c mov 0xc(%ebp),%ebx
112d3c: 0f b6 7d 14 movzbl 0x14(%ebp),%edi
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
112d40: 8d 4b ff lea -0x1(%ebx),%ecx
112d43: b8 01 00 00 00 mov $0x1,%eax
112d48: d3 e0 shl %cl,%eax
/* set blocked signals based on if checking for them, SIGNAL_ALL_MASK
* insures that no signals are blocked and all are checked.
*/
if ( check_blocked )
112d4a: 80 7d 18 00 cmpb $0x0,0x18(%ebp)
112d4e: 74 40 je 112d90 <_POSIX_signals_Clear_signals+0x60>
signals_blocked = ~api->signals_blocked;
112d50: 8b 55 08 mov 0x8(%ebp),%edx
112d53: 8b 8a d0 00 00 00 mov 0xd0(%edx),%ecx
112d59: f7 d1 not %ecx
signals_blocked = SIGNAL_ALL_MASK;
/* XXX is this right for siginfo type signals? */
/* XXX are we sure they can be cleared the same way? */
_ISR_Disable( level );
112d5b: 9c pushf
112d5c: fa cli
112d5d: 8f 45 e4 popl -0x1c(%ebp)
if ( is_global ) {
112d60: 89 fa mov %edi,%edx
112d62: 84 d2 test %dl,%dl
112d64: 74 32 je 112d98 <_POSIX_signals_Clear_signals+0x68>
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
112d66: 23 05 a8 7d 12 00 and 0x127da8,%eax
112d6c: 85 c8 test %ecx,%eax
112d6e: 74 54 je 112dc4 <_POSIX_signals_Clear_signals+0x94>
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
112d70: 8d 14 5b lea (%ebx,%ebx,2),%edx
112d73: c1 e2 02 shl $0x2,%edx
112d76: 83 ba a0 7b 12 00 02 cmpl $0x2,0x127ba0(%edx)
112d7d: 74 49 je 112dc8 <_POSIX_signals_Clear_signals+0x98>
&psiginfo->Node
);
} else
do_callout = false;
}
_POSIX_signals_Clear_process_signals( signo );
112d7f: 83 ec 0c sub $0xc,%esp
112d82: 53 push %ebx
112d83: e8 58 05 00 00 call 1132e0 <_POSIX_signals_Clear_process_signals>
112d88: 83 c4 10 add $0x10,%esp
do_callout = true;
112d8b: b0 01 mov $0x1,%al
112d8d: eb 26 jmp 112db5 <_POSIX_signals_Clear_signals+0x85>
112d8f: 90 nop
*/
if ( check_blocked )
signals_blocked = ~api->signals_blocked;
else
signals_blocked = SIGNAL_ALL_MASK;
112d90: b9 ff ff ff ff mov $0xffffffff,%ecx
112d95: eb c4 jmp 112d5b <_POSIX_signals_Clear_signals+0x2b>
112d97: 90 nop
}
_POSIX_signals_Clear_process_signals( signo );
do_callout = true;
}
} else {
if ( mask & (api->signals_pending & signals_blocked) ) {
112d98: 8b 55 08 mov 0x8(%ebp),%edx
112d9b: 8b 9a d4 00 00 00 mov 0xd4(%edx),%ebx
112da1: 89 c6 mov %eax,%esi
112da3: 21 de and %ebx,%esi
112da5: 85 ce test %ecx,%esi
112da7: 74 1b je 112dc4 <_POSIX_signals_Clear_signals+0x94>
api->signals_pending &= ~mask;
112da9: f7 d0 not %eax
112dab: 21 d8 and %ebx,%eax
112dad: 89 82 d4 00 00 00 mov %eax,0xd4(%edx)
do_callout = true;
112db3: b0 01 mov $0x1,%al
}
}
_ISR_Enable( level );
112db5: ff 75 e4 pushl -0x1c(%ebp)
112db8: 9d popf
return do_callout;
}
112db9: 8d 65 f4 lea -0xc(%ebp),%esp
112dbc: 5b pop %ebx
112dbd: 5e pop %esi
112dbe: 5f pop %edi
112dbf: c9 leave
112dc0: c3 ret
112dc1: 8d 76 00 lea 0x0(%esi),%esi
bool do_callout;
POSIX_signals_Siginfo_node *psiginfo;
mask = signo_to_mask( signo );
do_callout = false;
112dc4: 31 c0 xor %eax,%eax
112dc6: eb ed jmp 112db5 <_POSIX_signals_Clear_signals+0x85>
do_callout = true;
}
}
_ISR_Enable( level );
return do_callout;
}
112dc8: 8d 8a c0 7d 12 00 lea 0x127dc0(%edx),%ecx
112dce: 8b 82 c0 7d 12 00 mov 0x127dc0(%edx),%eax
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
112dd4: 8d 71 04 lea 0x4(%ecx),%esi
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
112dd7: 39 f0 cmp %esi,%eax
112dd9: 74 45 je 112e20 <_POSIX_signals_Clear_signals+0xf0>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
112ddb: 8b 30 mov (%eax),%esi
head->next = new_first;
112ddd: 89 b2 c0 7d 12 00 mov %esi,0x127dc0(%edx)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
112de3: 89 4e 04 mov %ecx,0x4(%esi)
if ( is_global ) {
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
_POSIX_signals_Clear_process_signals( signo );
112de6: 83 ec 0c sub $0xc,%esp
112de9: 53 push %ebx
112dea: 89 45 e0 mov %eax,-0x20(%ebp)
112ded: e8 ee 04 00 00 call 1132e0 <_POSIX_signals_Clear_process_signals>
* It may be impossible to get here with an empty chain
* BUT until that is proven we need to be defensive and
* protect against it.
*/
if ( psiginfo ) {
*info = psiginfo->Info;
112df2: 8b 45 e0 mov -0x20(%ebp),%eax
112df5: 8d 70 08 lea 0x8(%eax),%esi
112df8: b9 03 00 00 00 mov $0x3,%ecx
112dfd: 8b 7d 10 mov 0x10(%ebp),%edi
112e00: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
112e02: 8b 15 28 7d 12 00 mov 0x127d28,%edx
the_node->next = tail;
112e08: c7 00 24 7d 12 00 movl $0x127d24,(%eax)
tail->previous = the_node;
112e0e: a3 28 7d 12 00 mov %eax,0x127d28
old_last->next = the_node;
112e13: 89 02 mov %eax,(%edx)
the_node->previous = old_last;
112e15: 89 50 04 mov %edx,0x4(%eax)
112e18: 83 c4 10 add $0x10,%esp
112e1b: e9 5f ff ff ff jmp 112d7f <_POSIX_signals_Clear_signals+0x4f>
if ( is_global ) {
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
_POSIX_signals_Clear_process_signals( signo );
112e20: 83 ec 0c sub $0xc,%esp
112e23: 53 push %ebx
112e24: e8 b7 04 00 00 call 1132e0 <_POSIX_signals_Clear_process_signals>
112e29: 83 c4 10 add $0x10,%esp
112e2c: e9 4e ff ff ff jmp 112d7f <_POSIX_signals_Clear_signals+0x4f>
0010c0cc <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
10c0cc: 55 push %ebp
10c0cd: 89 e5 mov %esp,%ebp
10c0cf: 56 push %esi
10c0d0: 53 push %ebx
10c0d1: 8b 55 08 mov 0x8(%ebp),%edx
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10c0d4: b8 1b 00 00 00 mov $0x1b,%eax
10c0d9: 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>
int _POSIX_signals_Get_lowest(
10c0de: 8d 48 ff lea -0x1(%eax),%ecx
10c0e1: 89 de mov %ebx,%esi
10c0e3: d3 e6 shl %cl,%esi
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10c0e5: 85 d6 test %edx,%esi
10c0e7: 75 20 jne 10c109 <_POSIX_signals_Get_lowest+0x3d><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10c0e9: 40 inc %eax
10c0ea: 83 f8 20 cmp $0x20,%eax
10c0ed: 75 ef jne 10c0de <_POSIX_signals_Get_lowest+0x12>
10c0ef: b0 01 mov $0x1,%al
10c0f1: bb 01 00 00 00 mov $0x1,%ebx
10c0f6: eb 06 jmp 10c0fe <_POSIX_signals_Get_lowest+0x32>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
10c0f8: 40 inc %eax
10c0f9: 83 f8 1b cmp $0x1b,%eax
10c0fc: 74 0b je 10c109 <_POSIX_signals_Get_lowest+0x3d><== NEVER TAKEN
#include <rtems/posix/psignal.h>
#include <rtems/seterr.h>
#include <rtems/posix/time.h>
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
10c0fe: 8d 48 ff lea -0x1(%eax),%ecx
10c101: 89 de mov %ebx,%esi
10c103: 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 ) ) {
10c105: 85 d6 test %edx,%esi
10c107: 74 ef je 10c0f8 <_POSIX_signals_Get_lowest+0x2c>
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
10c109: 5b pop %ebx
10c10a: 5e pop %esi
10c10b: c9 leave
10c10c: c3 ret
00124444 <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
124444: 55 push %ebp
124445: 89 e5 mov %esp,%ebp
124447: 57 push %edi
124448: 56 push %esi
124449: 53 push %ebx
12444a: 83 ec 0c sub $0xc,%esp
12444d: 8b 5d 08 mov 0x8(%ebp),%ebx
124450: 8b 55 0c mov 0xc(%ebp),%edx
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124453: 8b b3 ec 00 00 00 mov 0xec(%ebx),%esi
124459: 8d 4a ff lea -0x1(%edx),%ecx
12445c: b8 01 00 00 00 mov $0x1,%eax
124461: d3 e0 shl %cl,%eax
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
124463: 8b 4b 10 mov 0x10(%ebx),%ecx
124466: 89 cf mov %ecx,%edi
124468: 81 e7 00 80 00 10 and $0x10008000,%edi
12446e: 81 ff 00 80 00 10 cmp $0x10008000,%edi
124474: 74 72 je 1244e8 <_POSIX_signals_Unblock_thread+0xa4>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
124476: 8b 96 d0 00 00 00 mov 0xd0(%esi),%edx
12447c: f7 d2 not %edx
12447e: 85 d0 test %edx,%eax
124480: 74 5a je 1244dc <_POSIX_signals_Unblock_thread+0x98>
* 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 ) ) {
124482: f7 c1 00 00 00 10 test $0x10000000,%ecx
124488: 74 3a je 1244c4 <_POSIX_signals_Unblock_thread+0x80>
the_thread->Wait.return_code = EINTR;
12448a: 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) )
124491: f7 c1 e0 be 03 00 test $0x3bee0,%ecx
124497: 0f 85 93 00 00 00 jne 124530 <_POSIX_signals_Unblock_thread+0xec>
_Thread_queue_Extract_with_proxy( the_thread );
else if ( _States_Is_delaying(the_thread->current_state) ) {
12449d: 83 e1 08 and $0x8,%ecx
1244a0: 74 3a je 1244dc <_POSIX_signals_Unblock_thread+0x98><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
1244a2: 83 ec 0c sub $0xc,%esp
1244a5: 8d 43 48 lea 0x48(%ebx),%eax
1244a8: 50 push %eax
1244a9: e8 8a f4 fe ff call 113938 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
1244ae: 5a pop %edx
1244af: 59 pop %ecx
1244b0: 68 f8 ff 03 10 push $0x1003fff8
1244b5: 53 push %ebx
1244b6: e8 c1 e1 fe ff call 11267c <_Thread_Clear_state>
1244bb: 83 c4 10 add $0x10,%esp
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
1244be: 31 c0 xor %eax,%eax
1244c0: eb 1c jmp 1244de <_POSIX_signals_Unblock_thread+0x9a>
1244c2: 66 90 xchg %ax,%ax
else if ( _States_Is_delaying(the_thread->current_state) ) {
(void) _Watchdog_Remove( &the_thread->Timer );
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
1244c4: 85 c9 test %ecx,%ecx
1244c6: 75 14 jne 1244dc <_POSIX_signals_Unblock_thread+0x98><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
1244c8: a1 74 e8 12 00 mov 0x12e874,%eax
1244cd: 85 c0 test %eax,%eax
1244cf: 74 0b je 1244dc <_POSIX_signals_Unblock_thread+0x98>
1244d1: 3b 1d 78 e8 12 00 cmp 0x12e878,%ebx
1244d7: 74 7b je 124554 <_POSIX_signals_Unblock_thread+0x110><== ALWAYS TAKEN
1244d9: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Dispatch_necessary = true;
}
}
return false;
1244dc: 31 c0 xor %eax,%eax
}
1244de: 8d 65 f4 lea -0xc(%ebp),%esp
1244e1: 5b pop %ebx
1244e2: 5e pop %esi
1244e3: 5f pop %edi
1244e4: c9 leave
1244e5: c3 ret
1244e6: 66 90 xchg %ax,%ax
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
1244e8: 85 43 30 test %eax,0x30(%ebx)
1244eb: 74 33 je 124520 <_POSIX_signals_Unblock_thread+0xdc>
the_thread->Wait.return_code = EINTR;
1244ed: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
1244f4: 8b 43 28 mov 0x28(%ebx),%eax
if ( !info ) {
1244f7: 8b 75 10 mov 0x10(%ebp),%esi
1244fa: 85 f6 test %esi,%esi
1244fc: 74 42 je 124540 <_POSIX_signals_Unblock_thread+0xfc>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
} else {
*the_info = *info;
1244fe: b9 03 00 00 00 mov $0x3,%ecx
124503: 89 c7 mov %eax,%edi
124505: 8b 75 10 mov 0x10(%ebp),%esi
124508: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
_Thread_queue_Extract_with_proxy( the_thread );
12450a: 83 ec 0c sub $0xc,%esp
12450d: 53 push %ebx
12450e: e8 d5 eb fe ff call 1130e8 <_Thread_queue_Extract_with_proxy>
return true;
124513: 83 c4 10 add $0x10,%esp
124516: b0 01 mov $0x1,%al
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
124518: 8d 65 f4 lea -0xc(%ebp),%esp
12451b: 5b pop %ebx
12451c: 5e pop %esi
12451d: 5f pop %edi
12451e: c9 leave
12451f: c3 ret
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
124520: 8b 8e d0 00 00 00 mov 0xd0(%esi),%ecx
124526: f7 d1 not %ecx
124528: 85 c8 test %ecx,%eax
12452a: 75 c1 jne 1244ed <_POSIX_signals_Unblock_thread+0xa9>
12452c: eb ae jmp 1244dc <_POSIX_signals_Unblock_thread+0x98>
12452e: 66 90 xchg %ax,%ax
/*
* In pthread_cond_wait, a thread will be blocking on a thread
* queue, but is also interruptible by a POSIX signal.
*/
if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
_Thread_queue_Extract_with_proxy( the_thread );
124530: 83 ec 0c sub $0xc,%esp
124533: 53 push %ebx
124534: e8 af eb fe ff call 1130e8 <_Thread_queue_Extract_with_proxy>
124539: 83 c4 10 add $0x10,%esp
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
12453c: 31 c0 xor %eax,%eax
12453e: eb 9e jmp 1244de <_POSIX_signals_Unblock_thread+0x9a>
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
124540: 89 10 mov %edx,(%eax)
the_info->si_code = SI_USER;
124542: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
the_info->si_value.sival_int = 0;
124549: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
124550: eb b8 jmp 12450a <_POSIX_signals_Unblock_thread+0xc6>
124552: 66 90 xchg %ax,%ax
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
124554: c6 05 84 e8 12 00 01 movb $0x1,0x12e884
}
}
return false;
12455b: 31 c0 xor %eax,%eax
12455d: e9 7c ff ff ff jmp 1244de <_POSIX_signals_Unblock_thread+0x9a>
0010d86c <_Protected_heap_Get_information>:
bool _Protected_heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
10d86c: 55 push %ebp
10d86d: 89 e5 mov %esp,%ebp
10d86f: 56 push %esi
10d870: 53 push %ebx
10d871: 8b 5d 08 mov 0x8(%ebp),%ebx
10d874: 8b 75 0c mov 0xc(%ebp),%esi
if ( !the_heap )
10d877: 85 db test %ebx,%ebx
10d879: 74 35 je 10d8b0 <_Protected_heap_Get_information+0x44>
return false;
if ( !the_info )
10d87b: 85 f6 test %esi,%esi
10d87d: 74 31 je 10d8b0 <_Protected_heap_Get_information+0x44>
return false;
_RTEMS_Lock_allocator();
10d87f: 83 ec 0c sub $0xc,%esp
10d882: ff 35 1c 80 12 00 pushl 0x12801c
10d888: e8 c7 ed ff ff call 10c654 <_API_Mutex_Lock>
_Heap_Get_information( the_heap, the_info );
10d88d: 5a pop %edx
10d88e: 59 pop %ecx
10d88f: 56 push %esi
10d890: 53 push %ebx
10d891: e8 86 47 00 00 call 11201c <_Heap_Get_information>
_RTEMS_Unlock_allocator();
10d896: 58 pop %eax
10d897: ff 35 1c 80 12 00 pushl 0x12801c
10d89d: e8 fa ed ff ff call 10c69c <_API_Mutex_Unlock>
return true;
10d8a2: 83 c4 10 add $0x10,%esp
10d8a5: b0 01 mov $0x1,%al
}
10d8a7: 8d 65 f8 lea -0x8(%ebp),%esp
10d8aa: 5b pop %ebx
10d8ab: 5e pop %esi
10d8ac: c9 leave
10d8ad: c3 ret
10d8ae: 66 90 xchg %ax,%ax
{
if ( !the_heap )
return false;
if ( !the_info )
return false;
10d8b0: 31 c0 xor %eax,%eax
_RTEMS_Lock_allocator();
_Heap_Get_information( the_heap, the_info );
_RTEMS_Unlock_allocator();
return true;
}
10d8b2: 8d 65 f8 lea -0x8(%ebp),%esp
10d8b5: 5b pop %ebx
10d8b6: 5e pop %esi
10d8b7: c9 leave
10d8b8: c3 ret
00110bf4 <_Protected_heap_Walk>:
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
110bf4: 55 push %ebp
110bf5: 89 e5 mov %esp,%ebp
110bf7: 56 push %esi
110bf8: 53 push %ebx
110bf9: 83 ec 10 sub $0x10,%esp
110bfc: 8b 5d 08 mov 0x8(%ebp),%ebx
110bff: 8b 75 0c mov 0xc(%ebp),%esi
110c02: 8a 45 10 mov 0x10(%ebp),%al
* then it is forbidden to lock a mutex. But since we are inside
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
110c05: 8b 15 30 de 12 00 mov 0x12de30,%edx
110c0b: 85 d2 test %edx,%edx
110c0d: 74 19 je 110c28 <_Protected_heap_Walk+0x34>
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
110c0f: 0f b6 c0 movzbl %al,%eax
110c12: 89 45 10 mov %eax,0x10(%ebp)
110c15: 89 75 0c mov %esi,0xc(%ebp)
110c18: 89 5d 08 mov %ebx,0x8(%ebp)
}
return status;
}
110c1b: 8d 65 f8 lea -0x8(%ebp),%esp
110c1e: 5b pop %ebx
110c1f: 5e pop %esi
110c20: c9 leave
if ( !_Thread_Dispatch_disable_level ) {
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
110c21: e9 4a f2 ff ff jmp 10fe70 <_Heap_Walk>
110c26: 66 90 xchg %ax,%ax
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
_RTEMS_Lock_allocator();
110c28: 83 ec 0c sub $0xc,%esp
110c2b: ff 35 1c df 12 00 pushl 0x12df1c
110c31: 88 45 f4 mov %al,-0xc(%ebp)
110c34: e8 cf e3 ff ff call 10f008 <_API_Mutex_Lock>
status = _Heap_Walk( the_heap, source, do_dump );
110c39: 83 c4 0c add $0xc,%esp
110c3c: 8a 45 f4 mov -0xc(%ebp),%al
110c3f: 0f b6 c0 movzbl %al,%eax
110c42: 50 push %eax
110c43: 56 push %esi
110c44: 53 push %ebx
110c45: e8 26 f2 ff ff call 10fe70 <_Heap_Walk>
_RTEMS_Unlock_allocator();
110c4a: 5a pop %edx
110c4b: ff 35 1c df 12 00 pushl 0x12df1c
110c51: 88 45 f4 mov %al,-0xc(%ebp)
110c54: e8 f7 e3 ff ff call 10f050 <_API_Mutex_Unlock>
110c59: 83 c4 10 add $0x10,%esp
} else {
status = _Heap_Walk( the_heap, source, do_dump );
}
return status;
}
110c5c: 8a 45 f4 mov -0xc(%ebp),%al
110c5f: 8d 65 f8 lea -0x8(%ebp),%esp
110c62: 5b pop %ebx
110c63: 5e pop %esi
110c64: c9 leave
110c65: c3 ret
00110e64 <_RTEMS_tasks_Create_extension>:
bool _RTEMS_tasks_Create_extension(
Thread_Control *executing,
Thread_Control *created
)
{
110e64: 55 push %ebp
110e65: 89 e5 mov %esp,%ebp
110e67: 53 push %ebx
110e68: 83 ec 10 sub $0x10,%esp
110e6b: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Notepads must be the last entry in the structure and they
* can be left off if disabled in the configuration.
*/
to_allocate = sizeof( RTEMS_API_Control );
110e6e: 80 3d 44 32 12 00 01 cmpb $0x1,0x123244
110e75: 19 c0 sbb %eax,%eax
110e77: 83 e0 c0 and $0xffffffc0,%eax
110e7a: 83 c0 60 add $0x60,%eax
if ( !rtems_configuration_get_notepads_enabled() )
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
110e7d: 50 push %eax
110e7e: e8 dd da ff ff call 10e960 <_Workspace_Allocate>
if ( !api )
110e83: 83 c4 10 add $0x10,%esp
110e86: 85 c0 test %eax,%eax
110e88: 74 6a je 110ef4 <_RTEMS_tasks_Create_extension+0x90>
return false;
created->API_Extensions[ THREAD_API_RTEMS ] = api;
110e8a: 89 83 e8 00 00 00 mov %eax,0xe8(%ebx)
api->pending_events = EVENT_SETS_NONE_PENDING;
110e90: c7 00 00 00 00 00 movl $0x0,(%eax)
api->event_condition = 0;
110e96: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
*/
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
ASR_Information *information
)
{
information->is_enabled = false;
110e9d: c6 40 08 00 movb $0x0,0x8(%eax)
information->handler = NULL;
110ea1: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
information->mode_set = RTEMS_DEFAULT_MODES;
110ea8: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
information->signals_posted = 0;
110eaf: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)
information->signals_pending = 0;
110eb6: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
information->nest_level = 0;
110ebd: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
110ec4: c7 83 f4 00 00 00 00 movl $0x0,0xf4(%ebx)
110ecb: 00 00 00
if ( rtems_configuration_get_notepads_enabled() ) {
110ece: 80 3d 44 32 12 00 00 cmpb $0x0,0x123244
110ed5: 74 13 je 110eea <_RTEMS_tasks_Create_extension+0x86>
110ed7: 31 d2 xor %edx,%edx
110ed9: 8d 76 00 lea 0x0(%esi),%esi
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
110edc: c7 44 90 20 00 00 00 movl $0x0,0x20(%eax,%edx,4)
110ee3: 00
api->event_condition = 0;
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
if ( rtems_configuration_get_notepads_enabled() ) {
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
110ee4: 42 inc %edx
110ee5: 83 fa 10 cmp $0x10,%edx
110ee8: 75 f2 jne 110edc <_RTEMS_tasks_Create_extension+0x78>
api->Notepads[i] = 0;
}
return true;
110eea: b0 01 mov $0x1,%al
}
110eec: 8b 5d fc mov -0x4(%ebp),%ebx
110eef: c9 leave
110ef0: c3 ret
110ef1: 8d 76 00 lea 0x0(%esi),%esi
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
if ( !api )
return false;
110ef4: 31 c0 xor %eax,%eax
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
110ef6: 8b 5d fc mov -0x4(%ebp),%ebx
110ef9: c9 leave
110efa: c3 ret
00110e0c <_RTEMS_tasks_Delete_extension>:
void _RTEMS_tasks_Delete_extension(
Thread_Control *executing,
Thread_Control *deleted
)
{
110e0c: 55 push %ebp
110e0d: 89 e5 mov %esp,%ebp
110e0f: 56 push %esi
110e10: 53 push %ebx
110e11: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Free per task variable memory
*/
tvp = deleted->task_variables;
110e14: 8b 83 f4 00 00 00 mov 0xf4(%ebx),%eax
deleted->task_variables = NULL;
110e1a: c7 83 f4 00 00 00 00 movl $0x0,0xf4(%ebx)
110e21: 00 00 00
while (tvp) {
110e24: 85 c0 test %eax,%eax
110e26: 75 06 jne 110e2e <_RTEMS_tasks_Delete_extension+0x22>
110e28: eb 17 jmp 110e41 <_RTEMS_tasks_Delete_extension+0x35>
110e2a: 66 90 xchg %ax,%ax
next = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
tvp = next;
110e2c: 89 f0 mov %esi,%eax
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = (rtems_task_variable_t *)tvp->next;
110e2e: 8b 30 mov (%eax),%esi
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
110e30: 83 ec 08 sub $0x8,%esp
110e33: 50 push %eax
110e34: 53 push %ebx
110e35: e8 56 01 00 00 call 110f90 <_RTEMS_Tasks_Invoke_task_variable_dtor>
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
110e3a: 83 c4 10 add $0x10,%esp
110e3d: 85 f6 test %esi,%esi
110e3f: 75 eb jne 110e2c <_RTEMS_tasks_Delete_extension+0x20>
/*
* Free API specific memory
*/
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
110e41: 83 ec 0c sub $0xc,%esp
110e44: ff b3 e8 00 00 00 pushl 0xe8(%ebx)
110e4a: e8 2d db ff ff call 10e97c <_Workspace_Free>
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
110e4f: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
110e56: 00 00 00
110e59: 83 c4 10 add $0x10,%esp
}
110e5c: 8d 65 f8 lea -0x8(%ebp),%esp
110e5f: 5b pop %ebx
110e60: 5e pop %esi
110e61: c9 leave
110e62: c3 ret
00110d90 <_RTEMS_tasks_Initialize_user_tasks>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks( void )
{
110d90: 55 push %ebp
110d91: 89 e5 mov %esp,%ebp
110d93: 83 ec 08 sub $0x8,%esp
if ( _RTEMS_tasks_Initialize_user_tasks_p )
110d96: a1 c4 32 12 00 mov 0x1232c4,%eax
110d9b: 85 c0 test %eax,%eax
110d9d: 74 05 je 110da4 <_RTEMS_tasks_Initialize_user_tasks+0x14>
(*_RTEMS_tasks_Initialize_user_tasks_p)();
}
110d9f: c9 leave
*/
void _RTEMS_tasks_Initialize_user_tasks( void )
{
if ( _RTEMS_tasks_Initialize_user_tasks_p )
(*_RTEMS_tasks_Initialize_user_tasks_p)();
110da0: ff e0 jmp *%eax
110da2: 66 90 xchg %ax,%ax
}
110da4: c9 leave
110da5: c3 ret
0010ba80 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
10ba80: 55 push %ebp
10ba81: 89 e5 mov %esp,%ebp
10ba83: 57 push %edi
10ba84: 56 push %esi
10ba85: 53 push %ebx
10ba86: 83 ec 1c sub $0x1c,%esp
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
10ba89: 8b 1d 6c 32 12 00 mov 0x12326c,%ebx
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
10ba8f: 8b 3d 68 32 12 00 mov 0x123268,%edi
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
10ba95: 85 db test %ebx,%ebx
10ba97: 74 46 je 10badf <_RTEMS_tasks_Initialize_user_tasks_body+0x5f>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
10ba99: 85 ff test %edi,%edi
10ba9b: 74 42 je 10badf <_RTEMS_tasks_Initialize_user_tasks_body+0x5f><== NEVER TAKEN
10ba9d: 31 f6 xor %esi,%esi
10ba9f: 90 nop
return_value = rtems_task_create(
10baa0: 83 ec 08 sub $0x8,%esp
10baa3: 8d 45 e4 lea -0x1c(%ebp),%eax
10baa6: 50 push %eax
10baa7: ff 73 0c pushl 0xc(%ebx)
10baaa: ff 73 14 pushl 0x14(%ebx)
10baad: ff 73 04 pushl 0x4(%ebx)
10bab0: ff 73 08 pushl 0x8(%ebx)
10bab3: ff 33 pushl (%ebx)
10bab5: e8 92 fd ff ff call 10b84c <rtems_task_create>
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
10baba: 83 c4 20 add $0x20,%esp
10babd: 85 c0 test %eax,%eax
10babf: 75 26 jne 10bae7 <_RTEMS_tasks_Initialize_user_tasks_body+0x67>
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
10bac1: 51 push %ecx
10bac2: ff 73 18 pushl 0x18(%ebx)
10bac5: ff 73 10 pushl 0x10(%ebx)
10bac8: ff 75 e4 pushl -0x1c(%ebp)
10bacb: e8 24 00 00 00 call 10baf4 <rtems_task_start>
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
10bad0: 83 c4 10 add $0x10,%esp
10bad3: 85 c0 test %eax,%eax
10bad5: 75 10 jne 10bae7 <_RTEMS_tasks_Initialize_user_tasks_body+0x67>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
10bad7: 46 inc %esi
10bad8: 83 c3 1c add $0x1c,%ebx
10badb: 39 f7 cmp %esi,%edi
10badd: 77 c1 ja 10baa0 <_RTEMS_tasks_Initialize_user_tasks_body+0x20><== NEVER TAKEN
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
10badf: 8d 65 f4 lea -0xc(%ebp),%esp
10bae2: 5b pop %ebx
10bae3: 5e pop %esi
10bae4: 5f pop %edi
10bae5: c9 leave
10bae6: c3 ret
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
10bae7: 52 push %edx
10bae8: 50 push %eax
10bae9: 6a 01 push $0x1
10baeb: 6a 01 push $0x1
10baed: e8 0e 0e 00 00 call 10c900 <_Internal_error_Occurred>
00110d48 <_RTEMS_tasks_Switch_extension>:
void _RTEMS_tasks_Switch_extension(
Thread_Control *executing,
Thread_Control *heir
)
{
110d48: 55 push %ebp
110d49: 89 e5 mov %esp,%ebp
/*
* Per Task Variables
*/
tvp = executing->task_variables;
110d4b: 8b 45 08 mov 0x8(%ebp),%eax
110d4e: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
110d54: 85 c0 test %eax,%eax
110d56: 74 13 je 110d6b <_RTEMS_tasks_Switch_extension+0x23>
tvp->tval = *tvp->ptr;
110d58: 8b 50 04 mov 0x4(%eax),%edx
110d5b: 8b 0a mov (%edx),%ecx
110d5d: 89 48 0c mov %ecx,0xc(%eax)
*tvp->ptr = tvp->gval;
110d60: 8b 48 08 mov 0x8(%eax),%ecx
110d63: 89 0a mov %ecx,(%edx)
tvp = (rtems_task_variable_t *)tvp->next;
110d65: 8b 00 mov (%eax),%eax
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
110d67: 85 c0 test %eax,%eax
110d69: 75 ed jne 110d58 <_RTEMS_tasks_Switch_extension+0x10><== NEVER TAKEN
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
110d6b: 8b 45 0c mov 0xc(%ebp),%eax
110d6e: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
110d74: 85 c0 test %eax,%eax
110d76: 74 13 je 110d8b <_RTEMS_tasks_Switch_extension+0x43>
tvp->gval = *tvp->ptr;
110d78: 8b 50 04 mov 0x4(%eax),%edx
110d7b: 8b 0a mov (%edx),%ecx
110d7d: 89 48 08 mov %ecx,0x8(%eax)
*tvp->ptr = tvp->tval;
110d80: 8b 48 0c mov 0xc(%eax),%ecx
110d83: 89 0a mov %ecx,(%edx)
tvp = (rtems_task_variable_t *)tvp->next;
110d85: 8b 00 mov (%eax),%eax
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
110d87: 85 c0 test %eax,%eax
110d89: 75 ed jne 110d78 <_RTEMS_tasks_Switch_extension+0x30><== NEVER TAKEN
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
}
}
110d8b: c9 leave
110d8c: c3 ret
0010c4dc <_Rate_monotonic_Initiate_statistics>:
}
void _Rate_monotonic_Initiate_statistics(
Rate_monotonic_Control *the_period
)
{
10c4dc: 55 push %ebp
10c4dd: 89 e5 mov %esp,%ebp
10c4df: 57 push %edi
10c4e0: 56 push %esi
10c4e1: 53 push %ebx
10c4e2: 83 ec 28 sub $0x28,%esp
10c4e5: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *owning_thread = the_period->owner;
10c4e8: 8b 73 40 mov 0x40(%ebx),%esi
* If using nanosecond statistics, we need to obtain the uptime.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
Timestamp_Control uptime;
_TOD_Get_uptime( &uptime );
10c4eb: 8d 7d e0 lea -0x20(%ebp),%edi
10c4ee: 57 push %edi
10c4ef: e8 a4 18 00 00 call 10dd98 <_TOD_Get_uptime>
/*
* Set the starting point and the CPU time used for the statistics.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
the_period->time_period_initiated = uptime;
10c4f4: 8b 45 e0 mov -0x20(%ebp),%eax
10c4f7: 8b 55 e4 mov -0x1c(%ebp),%edx
10c4fa: 89 43 4c mov %eax,0x4c(%ebx)
10c4fd: 89 53 50 mov %edx,0x50(%ebx)
#else
the_period->time_period_initiated = _Watchdog_Ticks_since_boot;
#endif
the_period->cpu_usage_period_initiated = owning_thread->cpu_time_used;
10c500: 8b 86 84 00 00 00 mov 0x84(%esi),%eax
10c506: 8b 96 88 00 00 00 mov 0x88(%esi),%edx
10c50c: 89 43 44 mov %eax,0x44(%ebx)
10c50f: 89 53 48 mov %edx,0x48(%ebx)
* routine is invoked from rtems_rate_monotonic_period, the owner will
* be the executing thread. When this routine is invoked from
* _Rate_monotonic_Timeout, it will not.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
if (owning_thread == _Thread_Executing) {
10c512: 83 c4 10 add $0x10,%esp
10c515: 39 35 b8 ae 12 00 cmp %esi,0x12aeb8
10c51b: 74 0b je 10c528 <_Rate_monotonic_Initiate_statistics+0x4c>
);
_Timespec_Add_to( &the_period->cpu_usage_period_initiated, &ran );
}
#endif
}
10c51d: 8d 65 f4 lea -0xc(%ebp),%esp
10c520: 5b pop %ebx
10c521: 5e pop %esi
10c522: 5f pop %edi
10c523: c9 leave
10c524: c3 ret
10c525: 8d 76 00 lea 0x0(%esi),%esi
/*
* Adjust the CPU time used to account for the time since last
* context switch.
*/
_Timespec_Subtract(
10c528: 50 push %eax
&_Thread_Time_of_last_context_switch, &uptime, &ran
10c529: 8d 75 d8 lea -0x28(%ebp),%esi
/*
* Adjust the CPU time used to account for the time since last
* context switch.
*/
_Timespec_Subtract(
10c52c: 56 push %esi
10c52d: 57 push %edi
10c52e: 68 c8 a9 12 00 push $0x12a9c8
10c533: e8 dc 39 00 00 call 10ff14 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch, &uptime, &ran
);
_Timespec_Add_to( &the_period->cpu_usage_period_initiated, &ran );
10c538: 59 pop %ecx
10c539: 5f pop %edi
10c53a: 56 push %esi
10c53b: 83 c3 44 add $0x44,%ebx
10c53e: 53 push %ebx
10c53f: e8 d4 38 00 00 call 10fe18 <_Timespec_Add_to>
10c544: 83 c4 10 add $0x10,%esp
}
#endif
}
10c547: 8d 65 f4 lea -0xc(%ebp),%esp
10c54a: 5b pop %ebx
10c54b: 5e pop %esi
10c54c: 5f pop %edi
10c54d: c9 leave
10c54e: c3 ret
0010ca98 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
10ca98: 55 push %ebp
10ca99: 89 e5 mov %esp,%ebp
10ca9b: 83 ec 2c sub $0x2c,%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 );
10ca9e: 8d 45 f4 lea -0xc(%ebp),%eax
10caa1: 50 push %eax
10caa2: ff 75 08 pushl 0x8(%ebp)
10caa5: 68 e0 a7 12 00 push $0x12a7e0
10caaa: e8 89 1d 00 00 call 10e838 <_Objects_Get>
switch ( location ) {
10caaf: 83 c4 10 add $0x10,%esp
10cab2: 8b 55 f4 mov -0xc(%ebp),%edx
10cab5: 85 d2 test %edx,%edx
10cab7: 75 29 jne 10cae2 <_Rate_monotonic_Timeout+0x4a><== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
10cab9: 8b 50 40 mov 0x40(%eax),%edx
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
10cabc: f6 42 11 40 testb $0x40,0x11(%edx)
10cac0: 74 08 je 10caca <_Rate_monotonic_Timeout+0x32>
10cac2: 8b 48 08 mov 0x8(%eax),%ecx
10cac5: 39 4a 20 cmp %ecx,0x20(%edx)
10cac8: 74 4e je 10cb18 <_Rate_monotonic_Timeout+0x80>
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
10caca: 83 78 38 01 cmpl $0x1,0x38(%eax)
10cace: 74 14 je 10cae4 <_Rate_monotonic_Timeout+0x4c>
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
10cad0: c7 40 38 04 00 00 00 movl $0x4,0x38(%eax)
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10cad7: a1 d0 a8 12 00 mov 0x12a8d0,%eax
10cadc: 48 dec %eax
10cadd: a3 d0 a8 12 00 mov %eax,0x12a8d0
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
10cae2: c9 leave
10cae3: c3 ret
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
10cae4: c7 40 38 03 00 00 00 movl $0x3,0x38(%eax)
_Rate_monotonic_Initiate_statistics( the_period );
10caeb: 83 ec 0c sub $0xc,%esp
10caee: 50 push %eax
10caef: 89 45 e4 mov %eax,-0x1c(%ebp)
10caf2: e8 e5 f9 ff ff call 10c4dc <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10caf7: 8b 45 e4 mov -0x1c(%ebp),%eax
10cafa: 8b 50 3c mov 0x3c(%eax),%edx
10cafd: 89 50 1c mov %edx,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10cb00: 5a pop %edx
10cb01: 59 pop %ecx
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
10cb02: 83 c0 10 add $0x10,%eax
10cb05: 50 push %eax
10cb06: 68 dc a9 12 00 push $0x12a9dc
10cb0b: e8 e4 36 00 00 call 1101f4 <_Watchdog_Insert>
10cb10: 83 c4 10 add $0x10,%esp
10cb13: eb c2 jmp 10cad7 <_Rate_monotonic_Timeout+0x3f>
10cb15: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10cb18: 83 ec 08 sub $0x8,%esp
10cb1b: 68 f8 ff 03 10 push $0x1003fff8
10cb20: 52 push %edx
10cb21: 89 45 e4 mov %eax,-0x1c(%ebp)
10cb24: e8 43 24 00 00 call 10ef6c <_Thread_Clear_state>
the_thread = the_period->owner;
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
10cb29: 8b 45 e4 mov -0x1c(%ebp),%eax
10cb2c: 89 04 24 mov %eax,(%esp)
10cb2f: eb c1 jmp 10caf2 <_Rate_monotonic_Timeout+0x5a>
0010c550 <_Rate_monotonic_Update_statistics>:
void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
10c550: 55 push %ebp
10c551: 89 e5 mov %esp,%ebp
10c553: 57 push %edi
10c554: 56 push %esi
10c555: 53 push %ebx
10c556: 83 ec 1c sub $0x1c,%esp
10c559: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
10c55c: ff 43 54 incl 0x54(%ebx)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
10c55f: 83 7b 38 04 cmpl $0x4,0x38(%ebx)
10c563: 0f 84 bf 00 00 00 je 10c628 <_Rate_monotonic_Update_statistics+0xd8>
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c569: 51 push %ecx
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
10c56a: 8d 7d e0 lea -0x20(%ebp),%edi
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c56d: 57 push %edi
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
10c56e: 8d 75 d8 lea -0x28(%ebp),%esi
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c571: 56 push %esi
10c572: 53 push %ebx
10c573: e8 cc fe ff ff call 10c444 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
10c578: 83 c4 10 add $0x10,%esp
10c57b: 84 c0 test %al,%al
10c57d: 75 09 jne 10c588 <_Rate_monotonic_Update_statistics+0x38>
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
10c57f: 8d 65 f4 lea -0xc(%ebp),%esp
10c582: 5b pop %ebx
10c583: 5e pop %esi
10c584: 5f pop %edi
10c585: c9 leave
10c586: c3 ret
10c587: 90 nop
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
10c588: 83 ec 08 sub $0x8,%esp
10c58b: 57 push %edi
10c58c: 8d 43 6c lea 0x6c(%ebx),%eax
10c58f: 50 push %eax
10c590: e8 83 38 00 00 call 10fe18 <_Timespec_Add_to>
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
10c595: 58 pop %eax
10c596: 5a pop %edx
10c597: 8d 43 5c lea 0x5c(%ebx),%eax
10c59a: 50 push %eax
10c59b: 57 push %edi
10c59c: e8 4f 39 00 00 call 10fef0 <_Timespec_Less_than>
10c5a1: 83 c4 10 add $0x10,%esp
10c5a4: 84 c0 test %al,%al
10c5a6: 74 0c je 10c5b4 <_Rate_monotonic_Update_statistics+0x64>
stats->min_cpu_time = executed;
10c5a8: 8b 45 e0 mov -0x20(%ebp),%eax
10c5ab: 8b 55 e4 mov -0x1c(%ebp),%edx
10c5ae: 89 43 5c mov %eax,0x5c(%ebx)
10c5b1: 89 53 60 mov %edx,0x60(%ebx)
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
10c5b4: 83 ec 08 sub $0x8,%esp
10c5b7: 8d 43 64 lea 0x64(%ebx),%eax
10c5ba: 50 push %eax
10c5bb: 57 push %edi
10c5bc: e8 0b 39 00 00 call 10fecc <_Timespec_Greater_than>
10c5c1: 83 c4 10 add $0x10,%esp
10c5c4: 84 c0 test %al,%al
10c5c6: 74 0c je 10c5d4 <_Rate_monotonic_Update_statistics+0x84>
stats->max_cpu_time = executed;
10c5c8: 8b 45 e0 mov -0x20(%ebp),%eax
10c5cb: 8b 55 e4 mov -0x1c(%ebp),%edx
10c5ce: 89 43 64 mov %eax,0x64(%ebx)
10c5d1: 89 53 68 mov %edx,0x68(%ebx)
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
10c5d4: 83 ec 08 sub $0x8,%esp
10c5d7: 56 push %esi
10c5d8: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10c5de: 50 push %eax
10c5df: e8 34 38 00 00 call 10fe18 <_Timespec_Add_to>
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
10c5e4: 5a pop %edx
10c5e5: 59 pop %ecx
10c5e6: 8d 43 74 lea 0x74(%ebx),%eax
10c5e9: 50 push %eax
10c5ea: 56 push %esi
10c5eb: e8 00 39 00 00 call 10fef0 <_Timespec_Less_than>
10c5f0: 83 c4 10 add $0x10,%esp
10c5f3: 84 c0 test %al,%al
10c5f5: 75 39 jne 10c630 <_Rate_monotonic_Update_statistics+0xe0>
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
10c5f7: 83 ec 08 sub $0x8,%esp
10c5fa: 8d 43 7c lea 0x7c(%ebx),%eax
10c5fd: 50 push %eax
10c5fe: 56 push %esi
10c5ff: e8 c8 38 00 00 call 10fecc <_Timespec_Greater_than>
10c604: 83 c4 10 add $0x10,%esp
10c607: 84 c0 test %al,%al
10c609: 0f 84 70 ff ff ff je 10c57f <_Rate_monotonic_Update_statistics+0x2f>
stats->max_wall_time = since_last_period;
10c60f: 8b 45 d8 mov -0x28(%ebp),%eax
10c612: 8b 55 dc mov -0x24(%ebp),%edx
10c615: 89 43 7c mov %eax,0x7c(%ebx)
10c618: 89 93 80 00 00 00 mov %edx,0x80(%ebx)
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
10c61e: 8d 65 f4 lea -0xc(%ebp),%esp
10c621: 5b pop %ebx
10c622: 5e pop %esi
10c623: 5f pop %edi
10c624: c9 leave
10c625: c3 ret
10c626: 66 90 xchg %ax,%ax
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
stats->missed_count++;
10c628: ff 43 58 incl 0x58(%ebx)
10c62b: e9 39 ff ff ff jmp 10c569 <_Rate_monotonic_Update_statistics+0x19>
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
stats->min_wall_time = since_last_period;
10c630: 8b 45 d8 mov -0x28(%ebp),%eax
10c633: 8b 55 dc mov -0x24(%ebp),%edx
10c636: 89 43 74 mov %eax,0x74(%ebx)
10c639: 89 53 78 mov %edx,0x78(%ebx)
10c63c: eb b9 jmp 10c5f7 <_Rate_monotonic_Update_statistics+0xa7>
00111610 <_Scheduler_priority_Block>:
void _Scheduler_priority_Block(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
111610: 55 push %ebp
111611: 89 e5 mov %esp,%ebp
111613: 53 push %ebx
111614: 8b 45 0c mov 0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract(
Thread_Control *the_thread
)
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
111617: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
11161d: 8b 12 mov (%edx),%edx
if ( _Chain_Has_only_one_node( ready ) ) {
11161f: 8b 4a 08 mov 0x8(%edx),%ecx
111622: 39 0a cmp %ecx,(%edx)
111624: 74 6e je 111694 <_Scheduler_priority_Block+0x84>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
111626: 8b 08 mov (%eax),%ecx
previous = the_node->previous;
111628: 8b 50 04 mov 0x4(%eax),%edx
next->previous = previous;
11162b: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
11162e: 89 0a mov %ecx,(%edx)
{
_Scheduler_priority_Ready_queue_extract(the_thread);
/* TODO: flash critical section */
if ( _Thread_Is_heir( the_thread ) )
111630: 3b 05 3c 7b 12 00 cmp 0x127b3c,%eax
111636: 74 18 je 111650 <_Scheduler_priority_Block+0x40>
_Scheduler_priority_Schedule_body(the_scheduler);
if ( _Thread_Is_executing( the_thread ) )
111638: 3b 05 38 7b 12 00 cmp 0x127b38,%eax
11163e: 74 04 je 111644 <_Scheduler_priority_Block+0x34>
_Scheduler_priority_Block_body(the_scheduler, the_thread);
}
111640: 5b pop %ebx
111641: c9 leave
111642: c3 ret
111643: 90 nop
_Thread_Dispatch_necessary = true;
111644: c6 05 44 7b 12 00 01 movb $0x1,0x127b44
11164b: 5b pop %ebx
11164c: c9 leave
11164d: c3 ret
11164e: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
111650: 66 8b 1d 60 7b 12 00 mov 0x127b60,%bx
111657: 31 d2 xor %edx,%edx
111659: 89 d1 mov %edx,%ecx
11165b: 66 0f bc cb bsf %bx,%cx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
11165f: 0f b7 c9 movzwl %cx,%ecx
111662: 66 8b 9c 09 80 7b 12 mov 0x127b80(%ecx,%ecx,1),%bx
111669: 00
11166a: 66 0f bc d3 bsf %bx,%dx
return (_Priority_Bits_index( major ) << 4) +
11166e: c1 e1 04 shl $0x4,%ecx
111671: 0f b7 d2 movzwl %dx,%edx
111674: 8d 14 11 lea (%ecx,%edx,1),%edx
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
111677: 8d 14 52 lea (%edx,%edx,2),%edx
11167a: c1 e2 02 shl $0x2,%edx
11167d: 8b 4d 08 mov 0x8(%ebp),%ecx
111680: 03 11 add (%ecx),%edx
111682: 8b 0a mov (%edx),%ecx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
111684: 83 c2 04 add $0x4,%edx
111687: 39 d1 cmp %edx,%ecx
111689: 74 4d je 1116d8 <_Scheduler_priority_Block+0xc8><== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
11168b: 89 0d 3c 7b 12 00 mov %ecx,0x127b3c
111691: eb a5 jmp 111638 <_Scheduler_priority_Block+0x28>
111693: 90 nop
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
111694: 8d 4a 04 lea 0x4(%edx),%ecx
111697: 89 0a mov %ecx,(%edx)
head->next = tail;
head->previous = NULL;
111699: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx)
tail->previous = head;
1116a0: 89 52 08 mov %edx,0x8(%edx)
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
if ( _Chain_Has_only_one_node( ready ) ) {
_Chain_Initialize_empty( ready );
_Priority_bit_map_Remove( &the_thread->scheduler.priority->Priority_map );
1116a3: 8b 88 8c 00 00 00 mov 0x8c(%eax),%ecx
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
1116a9: 8b 59 04 mov 0x4(%ecx),%ebx
1116ac: 66 8b 13 mov (%ebx),%dx
1116af: 66 23 51 0e and 0xe(%ecx),%dx
1116b3: 66 89 13 mov %dx,(%ebx)
if ( *the_priority_map->minor == 0 )
1116b6: 66 85 d2 test %dx,%dx
1116b9: 0f 85 71 ff ff ff jne 111630 <_Scheduler_priority_Block+0x20>
_Priority_Major_bit_map &= the_priority_map->block_major;
1116bf: 66 8b 15 60 7b 12 00 mov 0x127b60,%dx
1116c6: 23 51 0c and 0xc(%ecx),%edx
1116c9: 66 89 15 60 7b 12 00 mov %dx,0x127b60
1116d0: e9 5b ff ff ff jmp 111630 <_Scheduler_priority_Block+0x20>
1116d5: 8d 76 00 lea 0x0(%esi),%esi
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
1116d8: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
1116da: eb af jmp 11168b <_Scheduler_priority_Block+0x7b><== NOT EXECUTED
0010d240 <_Scheduler_priority_Schedule>:
*/
void _Scheduler_priority_Schedule(
Scheduler_Control *the_scheduler
)
{
10d240: 55 push %ebp
10d241: 89 e5 mov %esp,%ebp
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
10d243: 66 8b 0d 60 7b 12 00 mov 0x127b60,%cx
10d24a: 31 c0 xor %eax,%eax
10d24c: 89 c2 mov %eax,%edx
10d24e: 66 0f bc d1 bsf %cx,%dx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
10d252: 0f b7 d2 movzwl %dx,%edx
10d255: 66 8b 8c 12 80 7b 12 mov 0x127b80(%edx,%edx,1),%cx
10d25c: 00
10d25d: 66 0f bc c1 bsf %cx,%ax
return (_Priority_Bits_index( major ) << 4) +
10d261: c1 e2 04 shl $0x4,%edx
10d264: 0f b7 c0 movzwl %ax,%eax
10d267: 8d 04 02 lea (%edx,%eax,1),%eax
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
10d26a: 8d 04 40 lea (%eax,%eax,2),%eax
10d26d: c1 e0 02 shl $0x2,%eax
10d270: 8b 55 08 mov 0x8(%ebp),%edx
10d273: 03 02 add (%edx),%eax
_Scheduler_priority_Schedule_body( the_scheduler );
}
10d275: 8b 10 mov (%eax),%edx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10d277: 83 c0 04 add $0x4,%eax
10d27a: 39 c2 cmp %eax,%edx
10d27c: 74 0a je 10d288 <_Scheduler_priority_Schedule+0x48><== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d27e: 89 15 3c 7b 12 00 mov %edx,0x127b3c
10d284: c9 leave
10d285: c3 ret
10d286: 66 90 xchg %ax,%ax
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
10d288: 31 d2 xor %edx,%edx <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d28a: 89 15 3c 7b 12 00 mov %edx,0x127b3c <== NOT EXECUTED
10d290: c9 leave <== NOT EXECUTED
10d291: c3 ret <== NOT EXECUTED
0010d320 <_Scheduler_priority_Unblock>:
void _Scheduler_priority_Unblock (
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
10d320: 55 push %ebp
10d321: 89 e5 mov %esp,%ebp
10d323: 53 push %ebx
10d324: 8b 45 0c mov 0xc(%ebp),%eax
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
10d327: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
10d32d: 8b 4a 04 mov 0x4(%edx),%ecx
10d330: 66 8b 5a 0a mov 0xa(%edx),%bx
10d334: 66 09 19 or %bx,(%ecx)
_Priority_Major_bit_map |= the_priority_map->ready_major;
10d337: 66 8b 0d 60 7b 12 00 mov 0x127b60,%cx
10d33e: 0b 4a 08 or 0x8(%edx),%ecx
10d341: 66 89 0d 60 7b 12 00 mov %cx,0x127b60
_Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain,
10d348: 8b 12 mov (%edx),%edx
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
10d34a: 8b 4a 08 mov 0x8(%edx),%ecx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
10d34d: 8d 5a 04 lea 0x4(%edx),%ebx
10d350: 89 18 mov %ebx,(%eax)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d352: 89 42 08 mov %eax,0x8(%edx)
old_last->next = the_node;
10d355: 89 01 mov %eax,(%ecx)
the_node->previous = old_last;
10d357: 89 48 04 mov %ecx,0x4(%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 ( the_thread->current_priority < _Thread_Heir->current_priority ) {
10d35a: 8b 50 14 mov 0x14(%eax),%edx
10d35d: 8b 0d 3c 7b 12 00 mov 0x127b3c,%ecx
10d363: 3b 51 14 cmp 0x14(%ecx),%edx
10d366: 73 17 jae 10d37f <_Scheduler_priority_Unblock+0x5f>
_Thread_Heir = the_thread;
10d368: a3 3c 7b 12 00 mov %eax,0x127b3c
if ( _Thread_Executing->is_preemptible ||
10d36d: a1 38 7b 12 00 mov 0x127b38,%eax
10d372: 80 78 74 00 cmpb $0x0,0x74(%eax)
10d376: 74 0c je 10d384 <_Scheduler_priority_Unblock+0x64>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
10d378: c6 05 44 7b 12 00 01 movb $0x1,0x127b44
_Scheduler_priority_Unblock_body(the_scheduler, the_thread);
}
10d37f: 5b pop %ebx
10d380: c9 leave
10d381: c3 ret
10d382: 66 90 xchg %ax,%ax
* 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 ( the_thread->current_priority < _Thread_Heir->current_priority ) {
_Thread_Heir = the_thread;
if ( _Thread_Executing->is_preemptible ||
10d384: 85 d2 test %edx,%edx
10d386: 75 f7 jne 10d37f <_Scheduler_priority_Unblock+0x5f>
the_thread->current_priority == 0 )
_Thread_Dispatch_necessary = true;
10d388: c6 05 44 7b 12 00 01 movb $0x1,0x127b44
10d38f: eb ee jmp 10d37f <_Scheduler_priority_Unblock+0x5f>
0010d394 <_Scheduler_priority_Yield>:
*/
void _Scheduler_priority_Yield(
Scheduler_Control *the_scheduler __attribute__((unused))
)
{
10d394: 55 push %ebp
10d395: 89 e5 mov %esp,%ebp
10d397: 56 push %esi
10d398: 53 push %ebx
ISR_Level level;
Thread_Control *executing;
Chain_Control *ready;
executing = _Thread_Executing;
10d399: a1 38 7b 12 00 mov 0x127b38,%eax
ready = executing->scheduler.priority->ready_chain;
10d39e: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
10d3a4: 8b 12 mov (%edx),%edx
_ISR_Disable( level );
10d3a6: 9c pushf
10d3a7: fa cli
10d3a8: 59 pop %ecx
if ( !_Chain_Has_only_one_node( ready ) ) {
10d3a9: 8b 5a 08 mov 0x8(%edx),%ebx
10d3ac: 39 1a cmp %ebx,(%edx)
10d3ae: 74 40 je 10d3f0 <_Scheduler_priority_Yield+0x5c>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10d3b0: 8b 30 mov (%eax),%esi
previous = the_node->previous;
10d3b2: 8b 58 04 mov 0x4(%eax),%ebx
next->previous = previous;
10d3b5: 89 5e 04 mov %ebx,0x4(%esi)
previous->next = next;
10d3b8: 89 33 mov %esi,(%ebx)
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
10d3ba: 8b 5a 08 mov 0x8(%edx),%ebx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
10d3bd: 8d 72 04 lea 0x4(%edx),%esi
10d3c0: 89 30 mov %esi,(%eax)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d3c2: 89 42 08 mov %eax,0x8(%edx)
old_last->next = the_node;
10d3c5: 89 03 mov %eax,(%ebx)
the_node->previous = old_last;
10d3c7: 89 58 04 mov %ebx,0x4(%eax)
_Chain_Extract_unprotected( &executing->Object.Node );
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
10d3ca: 51 push %ecx
10d3cb: 9d popf
10d3cc: fa cli
if ( _Thread_Is_heir( executing ) )
10d3cd: 3b 05 3c 7b 12 00 cmp 0x127b3c,%eax
10d3d3: 74 0f je 10d3e4 <_Scheduler_priority_Yield+0x50>
_Thread_Heir = (Thread_Control *) _Chain_First( ready );
_Thread_Dispatch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
_Thread_Dispatch_necessary = true;
10d3d5: c6 05 44 7b 12 00 01 movb $0x1,0x127b44
_ISR_Enable( level );
10d3dc: 51 push %ecx
10d3dd: 9d popf
}
10d3de: 5b pop %ebx
10d3df: 5e pop %esi
10d3e0: c9 leave
10d3e1: c3 ret
10d3e2: 66 90 xchg %ax,%ax
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
if ( _Thread_Is_heir( executing ) )
_Thread_Heir = (Thread_Control *) _Chain_First( ready );
10d3e4: 8b 02 mov (%edx),%eax
10d3e6: a3 3c 7b 12 00 mov %eax,0x127b3c
10d3eb: eb e8 jmp 10d3d5 <_Scheduler_priority_Yield+0x41>
10d3ed: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Dispatch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
10d3f0: 3b 05 3c 7b 12 00 cmp 0x127b3c,%eax
10d3f6: 75 dd jne 10d3d5 <_Scheduler_priority_Yield+0x41>
10d3f8: eb e2 jmp 10d3dc <_Scheduler_priority_Yield+0x48>
0010dac4 <_TOD_Set>:
*/
void _TOD_Set(
const struct timespec *time
)
{
10dac4: 55 push %ebp
10dac5: 89 e5 mov %esp,%ebp
10dac7: 53 push %ebx
10dac8: 83 ec 04 sub $0x4,%esp
10dacb: 8b 5d 08 mov 0x8(%ebp),%ebx
10dace: a1 50 23 13 00 mov 0x132350,%eax
10dad3: 40 inc %eax
10dad4: a3 50 23 13 00 mov %eax,0x132350
long seconds;
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
10dad9: a1 24 24 13 00 mov 0x132424,%eax
if ( time->tv_sec < seconds )
10dade: 8b 13 mov (%ebx),%edx
10dae0: 39 d0 cmp %edx,%eax
10dae2: 7f 34 jg 10db18 <_TOD_Set+0x54>
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
_Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
10dae4: 51 push %ecx
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
10dae5: 29 c2 sub %eax,%edx
10dae7: 52 push %edx
10dae8: 6a 00 push $0x0
10daea: 68 50 24 13 00 push $0x132450
10daef: e8 e8 24 00 00 call 10ffdc <_Watchdog_Adjust>
10daf4: 83 c4 10 add $0x10,%esp
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
10daf7: 8b 03 mov (%ebx),%eax
10daf9: a3 24 24 13 00 mov %eax,0x132424
10dafe: 8b 43 04 mov 0x4(%ebx),%eax
10db01: a3 28 24 13 00 mov %eax,0x132428
_TOD_Is_set = true;
10db06: c6 05 64 23 13 00 01 movb $0x1,0x132364
_TOD_Activate();
_Thread_Enable_dispatch();
}
10db0d: 8b 5d fc mov -0x4(%ebp),%ebx
10db10: c9 leave
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
_TOD_Is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
10db11: e9 42 15 00 00 jmp 10f058 <_Thread_Enable_dispatch>
10db16: 66 90 xchg %ax,%ax
10db18: 51 push %ecx
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
if ( time->tv_sec < seconds )
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
10db19: 29 d0 sub %edx,%eax
10db1b: 50 push %eax
10db1c: 6a 01 push $0x1
10db1e: 68 50 24 13 00 push $0x132450
10db23: e8 b4 24 00 00 call 10ffdc <_Watchdog_Adjust>
10db28: 83 c4 10 add $0x10,%esp
10db2b: eb ca jmp 10daf7 <_TOD_Set+0x33>
0010c1bc <_TOD_To_seconds>:
*/
uint32_t _TOD_To_seconds(
const rtems_time_of_day *the_tod
)
{
10c1bc: 55 push %ebp
10c1bd: 89 e5 mov %esp,%ebp
10c1bf: 56 push %esi
10c1c0: 53 push %ebx
10c1c1: 8b 55 08 mov 0x8(%ebp),%edx
uint32_t time;
uint32_t year_mod_4;
time = the_tod->day - 1;
10c1c4: 8b 72 08 mov 0x8(%edx),%esi
10c1c7: 4e dec %esi
year_mod_4 = the_tod->year & 3;
10c1c8: 8b 02 mov (%edx),%eax
if ( year_mod_4 == 0 )
10c1ca: 89 c3 mov %eax,%ebx
10c1cc: 83 e3 03 and $0x3,%ebx
10c1cf: 74 67 je 10c238 <_TOD_To_seconds+0x7c>
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
else
time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
10c1d1: 8b 4a 04 mov 0x4(%edx),%ecx
10c1d4: 0f b7 8c 09 c0 3a 12 movzwl 0x123ac0(%ecx,%ecx,1),%ecx
10c1db: 00
10c1dc: 8d 34 31 lea (%ecx,%esi,1),%esi
time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
( (TOD_DAYS_PER_YEAR * 4) + 1);
time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
10c1df: 0f b7 8c 1b f4 3a 12 movzwl 0x123af4(%ebx,%ebx,1),%ecx
10c1e6: 00
if ( year_mod_4 == 0 )
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
else
time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
10c1e7: 2d c4 07 00 00 sub $0x7c4,%eax
10c1ec: c1 e8 02 shr $0x2,%eax
10c1ef: 8d 1c c0 lea (%eax,%eax,8),%ebx
10c1f2: 8d 1c d8 lea (%eax,%ebx,8),%ebx
10c1f5: 8d 1c 9b lea (%ebx,%ebx,4),%ebx
10c1f8: 8d 04 98 lea (%eax,%ebx,4),%eax
10c1fb: 01 c1 add %eax,%ecx
( (TOD_DAYS_PER_YEAR * 4) + 1);
time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
10c1fd: 01 f1 add %esi,%ecx
time *= TOD_SECONDS_PER_DAY;
10c1ff: 8d 04 89 lea (%ecx,%ecx,4),%eax
10c202: 8d 04 81 lea (%ecx,%eax,4),%eax
10c205: 8d 04 c1 lea (%ecx,%eax,8),%eax
10c208: c1 e0 02 shl $0x2,%eax
10c20b: 29 c8 sub %ecx,%eax
10c20d: c1 e0 07 shl $0x7,%eax
time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
10c210: 8b 5a 14 mov 0x14(%edx),%ebx
10c213: 8b 4a 0c mov 0xc(%edx),%ecx
10c216: 8d 0c 49 lea (%ecx,%ecx,2),%ecx
10c219: 8d 0c 89 lea (%ecx,%ecx,4),%ecx
10c21c: c1 e1 02 shl $0x2,%ecx
10c21f: 03 4a 10 add 0x10(%edx),%ecx
* TOD_SECONDS_PER_MINUTE;
10c222: 8d 14 49 lea (%ecx,%ecx,2),%edx
10c225: 8d 14 92 lea (%edx,%edx,4),%edx
time += the_tod->second;
10c228: 8d 94 93 00 e5 da 21 lea 0x21dae500(%ebx,%edx,4),%edx
time += TOD_SECONDS_1970_THROUGH_1988;
10c22f: 8d 04 02 lea (%edx,%eax,1),%eax
return( time );
}
10c232: 5b pop %ebx
10c233: 5e pop %esi
10c234: c9 leave
10c235: c3 ret
10c236: 66 90 xchg %ax,%ax
time = the_tod->day - 1;
year_mod_4 = the_tod->year & 3;
if ( year_mod_4 == 0 )
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
10c238: 8b 4a 04 mov 0x4(%edx),%ecx
10c23b: 0f b7 8c 09 da 3a 12 movzwl 0x123ada(%ecx,%ecx,1),%ecx
10c242: 00
10c243: 8d 34 31 lea (%ecx,%esi,1),%esi
10c246: eb 97 jmp 10c1df <_TOD_To_seconds+0x23>
0010c248 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
10c248: 55 push %ebp
10c249: 89 e5 mov %esp,%ebp
10c24b: 53 push %ebx
10c24c: 8b 4d 08 mov 0x8(%ebp),%ecx
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
10c24f: 8b 1d 2c 62 12 00 mov 0x12622c,%ebx
if ((!the_tod) ||
10c255: 85 c9 test %ecx,%ecx
10c257: 74 53 je 10c2ac <_TOD_Validate+0x64> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
10c259: b8 40 42 0f 00 mov $0xf4240,%eax
10c25e: 31 d2 xor %edx,%edx
10c260: f7 f3 div %ebx
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
10c262: 3b 41 18 cmp 0x18(%ecx),%eax
10c265: 76 45 jbe 10c2ac <_TOD_Validate+0x64>
(the_tod->ticks >= ticks_per_second) ||
10c267: 83 79 14 3b cmpl $0x3b,0x14(%ecx)
10c26b: 77 3f ja 10c2ac <_TOD_Validate+0x64>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
10c26d: 83 79 10 3b cmpl $0x3b,0x10(%ecx)
10c271: 77 39 ja 10c2ac <_TOD_Validate+0x64>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
10c273: 83 79 0c 17 cmpl $0x17,0xc(%ecx)
10c277: 77 33 ja 10c2ac <_TOD_Validate+0x64>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
10c279: 8b 41 04 mov 0x4(%ecx),%eax
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) ||
10c27c: 85 c0 test %eax,%eax
10c27e: 74 2c je 10c2ac <_TOD_Validate+0x64> <== NEVER TAKEN
(the_tod->month == 0) ||
10c280: 83 f8 0c cmp $0xc,%eax
10c283: 77 27 ja 10c2ac <_TOD_Validate+0x64>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
10c285: 8b 11 mov (%ecx),%edx
(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) ||
10c287: 81 fa c3 07 00 00 cmp $0x7c3,%edx
10c28d: 76 1d jbe 10c2ac <_TOD_Validate+0x64>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
10c28f: 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) ||
10c292: 85 c9 test %ecx,%ecx
10c294: 74 16 je 10c2ac <_TOD_Validate+0x64> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
10c296: 83 e2 03 and $0x3,%edx
10c299: 75 16 jne 10c2b1 <_TOD_Validate+0x69>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
10c29b: 8b 04 85 34 3b 12 00 mov 0x123b34(,%eax,4),%eax
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
10c2a2: 39 c8 cmp %ecx,%eax
10c2a4: 0f 93 c0 setae %al
10c2a7: eb 05 jmp 10c2ae <_TOD_Validate+0x66>
10c2a9: 8d 76 00 lea 0x0(%esi),%esi
(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;
10c2ac: 31 c0 xor %eax,%eax
if ( the_tod->day > days_in_month )
return false;
return true;
}
10c2ae: 5b pop %ebx
10c2af: c9 leave
10c2b0: c3 ret
return false;
if ( (the_tod->year % 4) == 0 )
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
10c2b1: 8b 04 85 00 3b 12 00 mov 0x123b00(,%eax,4),%eax
10c2b8: eb e8 jmp 10c2a2 <_TOD_Validate+0x5a>
0010d448 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
10d448: 55 push %ebp
10d449: 89 e5 mov %esp,%ebp
10d44b: 57 push %edi
10d44c: 56 push %esi
10d44d: 53 push %ebx
10d44e: 83 ec 28 sub $0x28,%esp
10d451: 8b 5d 08 mov 0x8(%ebp),%ebx
10d454: 8b 75 0c mov 0xc(%ebp),%esi
10d457: 8a 45 10 mov 0x10(%ebp),%al
10d45a: 88 45 e7 mov %al,-0x19(%ebp)
*/
/*
* Save original state
*/
original_state = the_thread->current_state;
10d45d: 8b 7b 10 mov 0x10(%ebx),%edi
/*
* 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 );
10d460: 53 push %ebx
10d461: e8 3a 0d 00 00 call 10e1a0 <_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 )
10d466: 83 c4 10 add $0x10,%esp
10d469: 39 73 14 cmp %esi,0x14(%ebx)
10d46c: 74 0d je 10d47b <_Thread_Change_priority+0x33>
_Thread_Set_priority( the_thread, new_priority );
10d46e: 83 ec 08 sub $0x8,%esp
10d471: 56 push %esi
10d472: 53 push %ebx
10d473: e8 c4 0c 00 00 call 10e13c <_Thread_Set_priority>
10d478: 83 c4 10 add $0x10,%esp
_ISR_Disable( level );
10d47b: 9c pushf
10d47c: fa cli
10d47d: 5e pop %esi
/*
* 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;
10d47e: 8b 43 10 mov 0x10(%ebx),%eax
if ( state != STATES_TRANSIENT ) {
10d481: 83 f8 04 cmp $0x4,%eax
10d484: 74 26 je 10d4ac <_Thread_Change_priority+0x64>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
10d486: 83 e7 04 and $0x4,%edi
10d489: 74 15 je 10d4a0 <_Thread_Change_priority+0x58><== ALWAYS TAKEN
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
10d48b: 56 push %esi
10d48c: 9d popf
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10d48d: a9 e0 be 03 00 test $0x3bee0,%eax
10d492: 0f 85 94 00 00 00 jne 10d52c <_Thread_Change_priority+0xe4>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
10d498: 8d 65 f4 lea -0xc(%ebp),%esp
10d49b: 5b pop %ebx
10d49c: 5e pop %esi
10d49d: 5f pop %edi
10d49e: c9 leave
10d49f: c3 ret
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
10d4a0: 89 c2 mov %eax,%edx
10d4a2: 83 e2 fb and $0xfffffffb,%edx
10d4a5: 89 53 10 mov %edx,0x10(%ebx)
10d4a8: eb e1 jmp 10d48b <_Thread_Change_priority+0x43>
10d4aa: 66 90 xchg %ax,%ax
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
10d4ac: 83 e7 04 and $0x4,%edi
10d4af: 75 40 jne 10d4f1 <_Thread_Change_priority+0xa9><== NEVER TAKEN
* Ready Queue with interrupts off.
*
* FIXME: hard-coded for priority scheduling. Might be ok since this
* function is specific to priority scheduling?
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
10d4b1: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
if ( prepend_it )
10d4b8: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10d4bc: 0f 84 82 00 00 00 je 10d544 <_Thread_Change_priority+0xfc>
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue_first(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
10d4c2: 8b 83 8c 00 00 00 mov 0x8c(%ebx),%eax
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
10d4c8: 8b 50 04 mov 0x4(%eax),%edx
10d4cb: 66 8b 48 0a mov 0xa(%eax),%cx
10d4cf: 66 09 0a or %cx,(%edx)
_Priority_Major_bit_map |= the_priority_map->ready_major;
10d4d2: 66 8b 15 60 7b 12 00 mov 0x127b60,%dx
10d4d9: 0b 50 08 or 0x8(%eax),%edx
10d4dc: 66 89 15 60 7b 12 00 mov %dx,0x127b60
_Chain_Prepend_unprotected( the_thread->scheduler.priority->ready_chain,
10d4e3: 8b 00 mov (%eax),%eax
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
10d4e5: 89 43 04 mov %eax,0x4(%ebx)
before_node = after_node->next;
10d4e8: 8b 10 mov (%eax),%edx
after_node->next = the_node;
10d4ea: 89 18 mov %ebx,(%eax)
the_node->next = before_node;
10d4ec: 89 13 mov %edx,(%ebx)
before_node->previous = the_node;
10d4ee: 89 5a 04 mov %ebx,0x4(%edx)
_Scheduler_priority_Ready_queue_enqueue_first( the_thread );
else
_Scheduler_priority_Ready_queue_enqueue( the_thread );
}
_ISR_Flash( level );
10d4f1: 56 push %esi
10d4f2: 9d popf
10d4f3: fa cli
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(
Scheduler_Control *the_scheduler
)
{
the_scheduler->Operations.schedule( the_scheduler );
10d4f4: 83 ec 0c sub $0xc,%esp
10d4f7: 68 00 76 12 00 push $0x127600
10d4fc: ff 15 04 76 12 00 call *0x127604
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
10d502: a1 38 7b 12 00 mov 0x127b38,%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(&_Scheduler);
if ( !_Thread_Is_executing_also_the_heir() &&
10d507: 83 c4 10 add $0x10,%esp
10d50a: 3b 05 3c 7b 12 00 cmp 0x127b3c,%eax
10d510: 74 0d je 10d51f <_Thread_Change_priority+0xd7>
10d512: 80 78 74 00 cmpb $0x0,0x74(%eax)
10d516: 74 07 je 10d51f <_Thread_Change_priority+0xd7>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
10d518: c6 05 44 7b 12 00 01 movb $0x1,0x127b44
_ISR_Enable( level );
10d51f: 56 push %esi
10d520: 9d popf
}
10d521: 8d 65 f4 lea -0xc(%ebp),%esp
10d524: 5b pop %ebx
10d525: 5e pop %esi
10d526: 5f pop %edi
10d527: c9 leave
10d528: c3 ret
10d529: 8d 76 00 lea 0x0(%esi),%esi
/* 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 );
10d52c: 89 5d 0c mov %ebx,0xc(%ebp)
10d52f: 8b 43 44 mov 0x44(%ebx),%eax
10d532: 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 );
}
10d535: 8d 65 f4 lea -0xc(%ebp),%esp
10d538: 5b pop %ebx
10d539: 5e pop %esi
10d53a: 5f pop %edi
10d53b: c9 leave
/* 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 );
10d53c: e9 63 0b 00 00 jmp 10e0a4 <_Thread_queue_Requeue>
10d541: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
10d544: 8b 83 8c 00 00 00 mov 0x8c(%ebx),%eax
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
10d54a: 8b 50 04 mov 0x4(%eax),%edx
10d54d: 66 8b 48 0a mov 0xa(%eax),%cx
10d551: 66 09 0a or %cx,(%edx)
_Priority_Major_bit_map |= the_priority_map->ready_major;
10d554: 66 8b 15 60 7b 12 00 mov 0x127b60,%dx
10d55b: 0b 50 08 or 0x8(%eax),%edx
10d55e: 66 89 15 60 7b 12 00 mov %dx,0x127b60
_Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain,
10d565: 8b 00 mov (%eax),%eax
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
10d567: 8b 50 08 mov 0x8(%eax),%edx
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
10d56a: 8d 48 04 lea 0x4(%eax),%ecx
10d56d: 89 0b mov %ecx,(%ebx)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d56f: 89 58 08 mov %ebx,0x8(%eax)
old_last->next = the_node;
10d572: 89 1a mov %ebx,(%edx)
the_node->previous = old_last;
10d574: 89 53 04 mov %edx,0x4(%ebx)
10d577: e9 75 ff ff ff jmp 10d4f1 <_Thread_Change_priority+0xa9>
0010d57c <_Thread_Clear_state>:
void _Thread_Clear_state(
Thread_Control *the_thread,
States_Control state
)
{
10d57c: 55 push %ebp
10d57d: 89 e5 mov %esp,%ebp
10d57f: 53 push %ebx
10d580: 83 ec 04 sub $0x4,%esp
10d583: 8b 55 08 mov 0x8(%ebp),%edx
10d586: 8b 45 0c mov 0xc(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
10d589: 9c pushf
10d58a: fa cli
10d58b: 5b pop %ebx
current_state = the_thread->current_state;
10d58c: 8b 4a 10 mov 0x10(%edx),%ecx
if ( current_state & state ) {
10d58f: 85 c8 test %ecx,%eax
10d591: 74 0b je 10d59e <_Thread_Clear_state+0x22>
10d593: f7 d0 not %eax
10d595: 21 c8 and %ecx,%eax
current_state =
the_thread->current_state = _States_Clear( state, current_state );
10d597: 89 42 10 mov %eax,0x10(%edx)
if ( _States_Is_ready( current_state ) ) {
10d59a: 85 c0 test %eax,%eax
10d59c: 74 0a je 10d5a8 <_Thread_Clear_state+0x2c>
_Scheduler_Unblock( &_Scheduler, the_thread);
}
}
_ISR_Enable( level );
10d59e: 53 push %ebx
10d59f: 9d popf
}
10d5a0: 8b 5d fc mov -0x4(%ebp),%ebx
10d5a3: c9 leave
10d5a4: c3 ret
10d5a5: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.unblock( the_scheduler, the_thread );
10d5a8: 83 ec 08 sub $0x8,%esp
10d5ab: 52 push %edx
10d5ac: 68 00 76 12 00 push $0x127600
10d5b1: ff 15 10 76 12 00 call *0x127610
10d5b7: 83 c4 10 add $0x10,%esp
10d5ba: eb e2 jmp 10d59e <_Thread_Clear_state+0x22>
0010d748 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10d748: 55 push %ebp
10d749: 89 e5 mov %esp,%ebp
10d74b: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10d74e: 8d 45 f4 lea -0xc(%ebp),%eax
10d751: 50 push %eax
10d752: ff 75 08 pushl 0x8(%ebp)
10d755: e8 c6 01 00 00 call 10d920 <_Thread_Get>
switch ( location ) {
10d75a: 83 c4 10 add $0x10,%esp
10d75d: 8b 55 f4 mov -0xc(%ebp),%edx
10d760: 85 d2 test %edx,%edx
10d762: 75 1c jne 10d780 <_Thread_Delay_ended+0x38><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
10d764: 83 ec 08 sub $0x8,%esp
10d767: 68 18 00 00 10 push $0x10000018
10d76c: 50 push %eax
10d76d: e8 0a fe ff ff call 10d57c <_Thread_Clear_state>
10d772: a1 50 75 12 00 mov 0x127550,%eax
10d777: 48 dec %eax
10d778: a3 50 75 12 00 mov %eax,0x127550
10d77d: 83 c4 10 add $0x10,%esp
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
10d780: c9 leave
10d781: c3 ret
0010d784 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
10d784: 55 push %ebp
10d785: 89 e5 mov %esp,%ebp
10d787: 57 push %edi
10d788: 56 push %esi
10d789: 53 push %ebx
10d78a: 83 ec 1c sub $0x1c,%esp
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
10d78d: 8b 1d 38 7b 12 00 mov 0x127b38,%ebx
_ISR_Disable( level );
10d793: 9c pushf
10d794: fa cli
10d795: 58 pop %eax
while ( _Thread_Dispatch_necessary == true ) {
10d796: 8a 15 44 7b 12 00 mov 0x127b44,%dl
10d79c: 84 d2 test %dl,%dl
10d79e: 0f 84 3c 01 00 00 je 10d8e0 <_Thread_Dispatch+0x15c>
heir = _Thread_Heir;
10d7a4: 8b 35 3c 7b 12 00 mov 0x127b3c,%esi
_Thread_Dispatch_disable_level = 1;
10d7aa: c7 05 50 75 12 00 01 movl $0x1,0x127550
10d7b1: 00 00 00
_Thread_Dispatch_necessary = false;
10d7b4: c6 05 44 7b 12 00 00 movb $0x0,0x127b44
_Thread_Executing = heir;
10d7bb: 89 35 38 7b 12 00 mov %esi,0x127b38
/*
* 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 )
10d7c1: 39 f3 cmp %esi,%ebx
10d7c3: 0f 84 17 01 00 00 je 10d8e0 <_Thread_Dispatch+0x15c>
10d7c9: 8d 7d d8 lea -0x28(%ebp),%edi
10d7cc: e9 f5 00 00 00 jmp 10d8c6 <_Thread_Dispatch+0x142>
10d7d1: 8d 76 00 lea 0x0(%esi),%esi
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
_ISR_Enable( level );
10d7d4: 50 push %eax
10d7d5: 9d popf
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
10d7d6: 83 ec 0c sub $0xc,%esp
10d7d9: 8d 45 e0 lea -0x20(%ebp),%eax
10d7dc: 50 push %eax
10d7dd: e8 ae 3a 00 00 call 111290 <_TOD_Get_uptime>
_Timestamp_Subtract(
10d7e2: 83 c4 0c add $0xc,%esp
10d7e5: 57 push %edi
10d7e6: 8d 45 e0 lea -0x20(%ebp),%eax
10d7e9: 50 push %eax
10d7ea: 68 48 76 12 00 push $0x127648
10d7ef: e8 2c 0c 00 00 call 10e420 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
10d7f4: 58 pop %eax
10d7f5: 5a pop %edx
10d7f6: 57 push %edi
10d7f7: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10d7fd: 50 push %eax
10d7fe: e8 e1 0b 00 00 call 10e3e4 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
10d803: 8b 45 e0 mov -0x20(%ebp),%eax
10d806: 8b 55 e4 mov -0x1c(%ebp),%edx
10d809: a3 48 76 12 00 mov %eax,0x127648
10d80e: 89 15 4c 76 12 00 mov %edx,0x12764c
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
10d814: a1 20 76 12 00 mov 0x127620,%eax
10d819: 83 c4 10 add $0x10,%esp
10d81c: 85 c0 test %eax,%eax
10d81e: 74 10 je 10d830 <_Thread_Dispatch+0xac> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
10d820: 8b 10 mov (%eax),%edx
10d822: 89 93 e4 00 00 00 mov %edx,0xe4(%ebx)
*_Thread_libc_reent = heir->libc_reent;
10d828: 8b 96 e4 00 00 00 mov 0xe4(%esi),%edx
10d82e: 89 10 mov %edx,(%eax)
}
_User_extensions_Thread_switch( executing, heir );
10d830: 83 ec 08 sub $0x8,%esp
10d833: 56 push %esi
10d834: 53 push %ebx
10d835: e8 86 0e 00 00 call 10e6c0 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
10d83a: 5a pop %edx
10d83b: 59 pop %ecx
10d83c: 81 c6 c8 00 00 00 add $0xc8,%esi
10d842: 56 push %esi
10d843: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax
10d849: 50 push %eax
10d84a: e8 71 11 00 00 call 10e9c0 <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
10d84f: 83 c4 10 add $0x10,%esp
10d852: 8b 83 e0 00 00 00 mov 0xe0(%ebx),%eax
10d858: 85 c0 test %eax,%eax
10d85a: 74 36 je 10d892 <_Thread_Dispatch+0x10e>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
RTEMS_INLINE_ROUTINE bool _Thread_Is_allocated_fp (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Allocated_fp );
10d85c: a1 e0 75 12 00 mov 0x1275e0,%eax
10d861: 39 c3 cmp %eax,%ebx
10d863: 74 2d je 10d892 <_Thread_Dispatch+0x10e>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
10d865: 85 c0 test %eax,%eax
10d867: 74 11 je 10d87a <_Thread_Dispatch+0xf6>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
10d869: 83 ec 0c sub $0xc,%esp
10d86c: 05 e0 00 00 00 add $0xe0,%eax
10d871: 50 push %eax
10d872: e8 7d 11 00 00 call 10e9f4 <_CPU_Context_save_fp>
10d877: 83 c4 10 add $0x10,%esp
_Context_Restore_fp( &executing->fp_context );
10d87a: 83 ec 0c sub $0xc,%esp
10d87d: 8d 83 e0 00 00 00 lea 0xe0(%ebx),%eax
10d883: 50 push %eax
10d884: e8 75 11 00 00 call 10e9fe <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
10d889: 89 1d e0 75 12 00 mov %ebx,0x1275e0
10d88f: 83 c4 10 add $0x10,%esp
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
10d892: 8b 1d 38 7b 12 00 mov 0x127b38,%ebx
_ISR_Disable( level );
10d898: 9c pushf
10d899: fa cli
10d89a: 58 pop %eax
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
10d89b: 8a 15 44 7b 12 00 mov 0x127b44,%dl
10d8a1: 84 d2 test %dl,%dl
10d8a3: 74 3b je 10d8e0 <_Thread_Dispatch+0x15c>
heir = _Thread_Heir;
10d8a5: 8b 35 3c 7b 12 00 mov 0x127b3c,%esi
_Thread_Dispatch_disable_level = 1;
10d8ab: c7 05 50 75 12 00 01 movl $0x1,0x127550
10d8b2: 00 00 00
_Thread_Dispatch_necessary = false;
10d8b5: c6 05 44 7b 12 00 00 movb $0x0,0x127b44
_Thread_Executing = heir;
10d8bc: 89 35 38 7b 12 00 mov %esi,0x127b38
/*
* 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 )
10d8c2: 39 de cmp %ebx,%esi
10d8c4: 74 1a je 10d8e0 <_Thread_Dispatch+0x15c><== NEVER TAKEN
*/
#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 )
10d8c6: 83 7e 7c 01 cmpl $0x1,0x7c(%esi)
10d8ca: 0f 85 04 ff ff ff jne 10d7d4 <_Thread_Dispatch+0x50>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
10d8d0: 8b 15 20 75 12 00 mov 0x127520,%edx
10d8d6: 89 56 78 mov %edx,0x78(%esi)
10d8d9: e9 f6 fe ff ff jmp 10d7d4 <_Thread_Dispatch+0x50>
10d8de: 66 90 xchg %ax,%ax
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
10d8e0: c7 05 50 75 12 00 00 movl $0x0,0x127550
10d8e7: 00 00 00
_ISR_Enable( level );
10d8ea: 50 push %eax
10d8eb: 9d popf
_API_extensions_Run_postswitch();
10d8ec: e8 e3 e5 ff ff call 10bed4 <_API_extensions_Run_postswitch>
}
10d8f1: 8d 65 f4 lea -0xc(%ebp),%esp
10d8f4: 5b pop %ebx
10d8f5: 5e pop %esi
10d8f6: 5f pop %edi
10d8f7: c9 leave
10d8f8: c3 ret
0010d920 <_Thread_Get>:
*/
Thread_Control *_Thread_Get (
Objects_Id id,
Objects_Locations *location
)
{
10d920: 55 push %ebp
10d921: 89 e5 mov %esp,%ebp
10d923: 53 push %ebx
10d924: 83 ec 04 sub $0x4,%esp
10d927: 8b 45 08 mov 0x8(%ebp),%eax
10d92a: 8b 4d 0c mov 0xc(%ebp),%ecx
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
10d92d: 85 c0 test %eax,%eax
10d92f: 74 47 je 10d978 <_Thread_Get+0x58>
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
10d931: 89 c2 mov %eax,%edx
10d933: c1 ea 18 shr $0x18,%edx
10d936: 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 )
10d939: 8d 5a ff lea -0x1(%edx),%ebx
10d93c: 83 fb 02 cmp $0x2,%ebx
10d93f: 77 27 ja 10d968 <_Thread_Get+0x48>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10d941: 89 c3 mov %eax,%ebx
10d943: c1 eb 1b shr $0x1b,%ebx
*location = OBJECTS_ERROR;
goto done;
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
10d946: 4b dec %ebx
10d947: 75 1f jne 10d968 <_Thread_Get+0x48>
*location = OBJECTS_ERROR;
goto done;
}
#endif
information = api_information[ the_class ];
10d949: 8b 14 95 28 75 12 00 mov 0x127528(,%edx,4),%edx
10d950: 8b 52 04 mov 0x4(%edx),%edx
if ( !information ) {
10d953: 85 d2 test %edx,%edx
10d955: 74 11 je 10d968 <_Thread_Get+0x48>
*location = OBJECTS_ERROR;
goto done;
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
10d957: 53 push %ebx
10d958: 51 push %ecx
10d959: 50 push %eax
10d95a: 52 push %edx
10d95b: e8 e8 f4 ff ff call 10ce48 <_Objects_Get>
10d960: 83 c4 10 add $0x10,%esp
done:
return tp;
}
10d963: 8b 5d fc mov -0x4(%ebp),%ebx
10d966: c9 leave
10d967: c3 ret
}
#endif
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
10d968: c7 01 01 00 00 00 movl $0x1,(%ecx)
{
uint32_t the_api;
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
10d96e: 31 c0 xor %eax,%eax
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
10d970: 8b 5d fc mov -0x4(%ebp),%ebx
10d973: c9 leave
10d974: c3 ret
10d975: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10d978: a1 50 75 12 00 mov 0x127550,%eax
10d97d: 40 inc %eax
10d97e: a3 50 75 12 00 mov %eax,0x127550
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
_Thread_Disable_dispatch();
*location = OBJECTS_LOCAL;
10d983: c7 01 00 00 00 00 movl $0x0,(%ecx)
tp = _Thread_Executing;
10d989: a1 38 7b 12 00 mov 0x127b38,%eax
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
10d98e: 8b 5d fc mov -0x4(%ebp),%ebx
10d991: c9 leave
10d992: c3 ret
0011316c <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
11316c: 55 push %ebp
11316d: 89 e5 mov %esp,%ebp
11316f: 53 push %ebx
113170: 83 ec 14 sub $0x14,%esp
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
113173: 8b 1d 38 7b 12 00 mov 0x127b38,%ebx
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
113179: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax
_ISR_Set_level(level);
11317f: 85 c0 test %eax,%eax
113181: 74 79 je 1131fc <_Thread_Handler+0x90>
113183: fa cli
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
113184: a0 cc 71 12 00 mov 0x1271cc,%al
113189: 88 45 f7 mov %al,-0x9(%ebp)
doneConstructors = 1;
11318c: c6 05 cc 71 12 00 01 movb $0x1,0x1271cc
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
113193: 8b 83 e0 00 00 00 mov 0xe0(%ebx),%eax
113199: 85 c0 test %eax,%eax
11319b: 74 24 je 1131c1 <_Thread_Handler+0x55>
#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 );
11319d: a1 e0 75 12 00 mov 0x1275e0,%eax
1131a2: 39 c3 cmp %eax,%ebx
1131a4: 74 1b je 1131c1 <_Thread_Handler+0x55>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
1131a6: 85 c0 test %eax,%eax
1131a8: 74 11 je 1131bb <_Thread_Handler+0x4f>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
1131aa: 83 ec 0c sub $0xc,%esp
1131ad: 05 e0 00 00 00 add $0xe0,%eax
1131b2: 50 push %eax
1131b3: e8 3c b8 ff ff call 10e9f4 <_CPU_Context_save_fp>
1131b8: 83 c4 10 add $0x10,%esp
_Thread_Allocated_fp = executing;
1131bb: 89 1d e0 75 12 00 mov %ebx,0x1275e0
/*
* 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 );
1131c1: 83 ec 0c sub $0xc,%esp
1131c4: 53 push %ebx
1131c5: e8 5a b3 ff ff call 10e524 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
1131ca: e8 2d a7 ff ff call 10d8fc <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
1131cf: 83 c4 10 add $0x10,%esp
1131d2: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
1131d6: 74 28 je 113200 <_Thread_Handler+0x94>
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
1131d8: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
1131de: 85 c0 test %eax,%eax
1131e0: 74 2d je 11320f <_Thread_Handler+0xa3>
(*(Thread_Entry_numeric) executing->Start.entry_point)(
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
1131e2: 48 dec %eax
1131e3: 74 43 je 113228 <_Thread_Handler+0xbc> <== ALWAYS TAKEN
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
1131e5: 83 ec 0c sub $0xc,%esp
1131e8: 53 push %ebx
1131e9: e8 72 b3 ff ff call 10e560 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
1131ee: 83 c4 0c add $0xc,%esp
1131f1: 6a 05 push $0x5
1131f3: 6a 01 push $0x1
1131f5: 6a 00 push $0x0
1131f7: e8 04 97 ff ff call 10c900 <_Internal_error_Occurred>
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
_ISR_Set_level(level);
1131fc: fb sti
1131fd: eb 85 jmp 113184 <_Thread_Handler+0x18>
1131ff: 90 nop
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
113200: e8 7b be 00 00 call 11f080 <__start_set_sysctl_set>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
113205: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
11320b: 85 c0 test %eax,%eax
11320d: 75 d3 jne 1131e2 <_Thread_Handler+0x76>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
11320f: 83 ec 0c sub $0xc,%esp
113212: ff b3 9c 00 00 00 pushl 0x9c(%ebx)
113218: ff 93 90 00 00 00 call *0x90(%ebx)
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
11321e: 89 43 28 mov %eax,0x28(%ebx)
113221: 83 c4 10 add $0x10,%esp
113224: eb bf jmp 1131e5 <_Thread_Handler+0x79>
113226: 66 90 xchg %ax,%ax
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
113228: 83 ec 0c sub $0xc,%esp
11322b: ff b3 98 00 00 00 pushl 0x98(%ebx)
113231: ff 93 90 00 00 00 call *0x90(%ebx)
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
113237: 89 43 28 mov %eax,0x28(%ebx)
11323a: 83 c4 10 add $0x10,%esp
11323d: eb a6 jmp 1131e5 <_Thread_Handler+0x79>
0010d994 <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
10d994: 55 push %ebp
10d995: 89 e5 mov %esp,%ebp
10d997: 57 push %edi
10d998: 56 push %esi
10d999: 53 push %ebx
10d99a: 83 ec 1c sub $0x1c,%esp
10d99d: 8b 5d 0c mov 0xc(%ebp),%ebx
10d9a0: 8b 4d 10 mov 0x10(%ebp),%ecx
10d9a3: 8b 75 14 mov 0x14(%ebp),%esi
10d9a6: 8a 55 18 mov 0x18(%ebp),%dl
10d9a9: 0f b6 7d 20 movzbl 0x20(%ebp),%edi
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
10d9ad: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
10d9b4: 00 00 00
10d9b7: c7 83 ec 00 00 00 00 movl $0x0,0xec(%ebx)
10d9be: 00 00 00
extensions_area = NULL;
the_thread->libc_reent = NULL;
10d9c1: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10d9c8: 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 ) {
10d9cb: 85 c9 test %ecx,%ecx
10d9cd: 0f 84 14 02 00 00 je 10dbe7 <_Thread_Initialize+0x253>
stack = the_thread->Start.stack;
the_thread->Start.core_allocated_stack = true;
} else {
stack = stack_area;
actual_stack_size = stack_size;
the_thread->Start.core_allocated_stack = false;
10d9d3: c6 83 b4 00 00 00 00 movb $0x0,0xb4(%ebx)
10d9da: 89 f0 mov %esi,%eax
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
10d9dc: 89 8b bc 00 00 00 mov %ecx,0xbc(%ebx)
the_stack->size = size;
10d9e2: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx)
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
10d9e8: 84 d2 test %dl,%dl
10d9ea: 0f 85 94 01 00 00 jne 10db84 <_Thread_Initialize+0x1f0>
10d9f0: 31 c0 xor %eax,%eax
extensions_area = NULL;
the_thread->libc_reent = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
fp_area = NULL;
10d9f2: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
if ( !fp_area )
goto failed;
fp_area = _Context_Fp_start( fp_area, 0 );
}
the_thread->fp_context = fp_area;
10d9f9: 89 83 e0 00 00 00 mov %eax,0xe0(%ebx)
the_thread->Start.fp_context = fp_area;
10d9ff: 89 83 c0 00 00 00 mov %eax,0xc0(%ebx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10da05: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10da0c: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
the_watchdog->id = id;
10da13: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
the_watchdog->user_data = user_data;
10da1a: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10da21: a1 2c 76 12 00 mov 0x12762c,%eax
10da26: 85 c0 test %eax,%eax
10da28: 0f 85 7a 01 00 00 jne 10dba8 <_Thread_Initialize+0x214>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10da2e: c7 83 f0 00 00 00 00 movl $0x0,0xf0(%ebx)
10da35: 00 00 00
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10da38: 31 f6 xor %esi,%esi
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
10da3a: 89 f8 mov %edi,%eax
10da3c: 88 83 a0 00 00 00 mov %al,0xa0(%ebx)
the_thread->Start.budget_algorithm = budget_algorithm;
10da42: 8b 45 24 mov 0x24(%ebp),%eax
10da45: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
the_thread->Start.budget_callout = budget_callout;
10da4b: 8b 45 28 mov 0x28(%ebp),%eax
10da4e: 89 83 a8 00 00 00 mov %eax,0xa8(%ebx)
switch ( budget_algorithm ) {
10da54: 83 7d 24 02 cmpl $0x2,0x24(%ebp)
10da58: 75 08 jne 10da62 <_Thread_Initialize+0xce>
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;
10da5a: a1 20 75 12 00 mov 0x127520,%eax
10da5f: 89 43 78 mov %eax,0x78(%ebx)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
10da62: 8b 45 2c mov 0x2c(%ebp),%eax
10da65: 89 83 ac 00 00 00 mov %eax,0xac(%ebx)
the_thread->current_state = STATES_DORMANT;
10da6b: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
the_thread->Wait.queue = NULL;
10da72: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
the_thread->resource_count = 0;
10da79: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->real_priority = priority;
10da80: 8b 45 1c mov 0x1c(%ebp),%eax
10da83: 89 43 18 mov %eax,0x18(%ebx)
the_thread->Start.initial_priority = priority;
10da86: 89 83 b0 00 00 00 mov %eax,0xb0(%ebx)
RTEMS_INLINE_ROUTINE void* _Scheduler_Thread_scheduler_allocate(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
return
10da8c: 83 ec 08 sub $0x8,%esp
10da8f: 53 push %ebx
10da90: 68 00 76 12 00 push $0x127600
10da95: ff 15 14 76 12 00 call *0x127614
10da9b: 89 c7 mov %eax,%edi
sched =_Scheduler_Thread_scheduler_allocate( &_Scheduler, the_thread );
if ( !sched )
10da9d: 83 c4 10 add $0x10,%esp
10daa0: 85 c0 test %eax,%eax
10daa2: 74 46 je 10daea <_Thread_Initialize+0x156>
goto failed;
_Thread_Set_priority( the_thread, priority );
10daa4: 83 ec 08 sub $0x8,%esp
10daa7: ff 75 1c pushl 0x1c(%ebp)
10daaa: 53 push %ebx
10daab: e8 8c 06 00 00 call 10e13c <_Thread_Set_priority>
/*
* Initialize the CPU usage statistics
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Set_to_zero( &the_thread->cpu_time_used );
10dab0: c7 83 84 00 00 00 00 movl $0x0,0x84(%ebx)
10dab7: 00 00 00
10daba: c7 83 88 00 00 00 00 movl $0x0,0x88(%ebx)
10dac1: 00 00 00
_Thread_Stack_Free( the_thread );
return false;
}
10dac4: 8b 45 08 mov 0x8(%ebp),%eax
10dac7: 8b 40 1c mov 0x1c(%eax),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10daca: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10dace: 89 1c 90 mov %ebx,(%eax,%edx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10dad1: 8b 45 30 mov 0x30(%ebp),%eax
10dad4: 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 );
10dad7: 89 1c 24 mov %ebx,(%esp)
10dada: e8 0d 0b 00 00 call 10e5ec <_User_extensions_Thread_create>
if ( extension_status )
10dadf: 83 c4 10 add $0x10,%esp
10dae2: 84 c0 test %al,%al
10dae4: 0f 85 8e 00 00 00 jne 10db78 <_Thread_Initialize+0x1e4>
return true;
failed:
if ( the_thread->libc_reent )
10daea: 8b 83 e4 00 00 00 mov 0xe4(%ebx),%eax
10daf0: 85 c0 test %eax,%eax
10daf2: 74 0c je 10db00 <_Thread_Initialize+0x16c>
_Workspace_Free( the_thread->libc_reent );
10daf4: 83 ec 0c sub $0xc,%esp
10daf7: 50 push %eax
10daf8: e8 7f 0e 00 00 call 10e97c <_Workspace_Free>
10dafd: 83 c4 10 add $0x10,%esp
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
if ( the_thread->API_Extensions[i] )
10db00: 8b 83 e8 00 00 00 mov 0xe8(%ebx),%eax
10db06: 85 c0 test %eax,%eax
10db08: 74 0c je 10db16 <_Thread_Initialize+0x182>
_Workspace_Free( the_thread->API_Extensions[i] );
10db0a: 83 ec 0c sub $0xc,%esp
10db0d: 50 push %eax
10db0e: e8 69 0e 00 00 call 10e97c <_Workspace_Free>
10db13: 83 c4 10 add $0x10,%esp
failed:
if ( the_thread->libc_reent )
_Workspace_Free( the_thread->libc_reent );
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
if ( the_thread->API_Extensions[i] )
10db16: 8b 83 ec 00 00 00 mov 0xec(%ebx),%eax
10db1c: 85 c0 test %eax,%eax
10db1e: 74 0c je 10db2c <_Thread_Initialize+0x198>
_Workspace_Free( the_thread->API_Extensions[i] );
10db20: 83 ec 0c sub $0xc,%esp
10db23: 50 push %eax
10db24: e8 53 0e 00 00 call 10e97c <_Workspace_Free>
10db29: 83 c4 10 add $0x10,%esp
if ( extensions_area )
10db2c: 85 f6 test %esi,%esi
10db2e: 74 0c je 10db3c <_Thread_Initialize+0x1a8>
(void) _Workspace_Free( extensions_area );
10db30: 83 ec 0c sub $0xc,%esp
10db33: 56 push %esi
10db34: e8 43 0e 00 00 call 10e97c <_Workspace_Free>
10db39: 83 c4 10 add $0x10,%esp
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( fp_area )
10db3c: 8b 45 e4 mov -0x1c(%ebp),%eax
10db3f: 85 c0 test %eax,%eax
10db41: 74 0e je 10db51 <_Thread_Initialize+0x1bd>
(void) _Workspace_Free( fp_area );
10db43: 83 ec 0c sub $0xc,%esp
10db46: ff 75 e4 pushl -0x1c(%ebp)
10db49: e8 2e 0e 00 00 call 10e97c <_Workspace_Free>
10db4e: 83 c4 10 add $0x10,%esp
#endif
if ( sched )
10db51: 85 ff test %edi,%edi
10db53: 74 0c je 10db61 <_Thread_Initialize+0x1cd>
(void) _Workspace_Free( sched );
10db55: 83 ec 0c sub $0xc,%esp
10db58: 57 push %edi
10db59: e8 1e 0e 00 00 call 10e97c <_Workspace_Free>
10db5e: 83 c4 10 add $0x10,%esp
_Thread_Stack_Free( the_thread );
10db61: 83 ec 0c sub $0xc,%esp
10db64: 53 push %ebx
10db65: e8 0a 07 00 00 call 10e274 <_Thread_Stack_Free>
return false;
10db6a: 83 c4 10 add $0x10,%esp
10db6d: 31 c0 xor %eax,%eax
}
10db6f: 8d 65 f4 lea -0xc(%ebp),%esp
10db72: 5b pop %ebx
10db73: 5e pop %esi
10db74: 5f pop %edi
10db75: c9 leave
10db76: c3 ret
10db77: 90 nop
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
10db78: b0 01 mov $0x1,%al
_Thread_Stack_Free( the_thread );
return false;
}
10db7a: 8d 65 f4 lea -0xc(%ebp),%esp
10db7d: 5b pop %ebx
10db7e: 5e pop %esi
10db7f: 5f pop %edi
10db80: c9 leave
10db81: c3 ret
10db82: 66 90 xchg %ax,%ax
/*
* Allocate the floating point area for this thread
*/
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
if ( is_fp ) {
fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
10db84: 83 ec 0c sub $0xc,%esp
10db87: 6a 6c push $0x6c
10db89: e8 d2 0d 00 00 call 10e960 <_Workspace_Allocate>
10db8e: 89 45 e4 mov %eax,-0x1c(%ebp)
if ( !fp_area )
10db91: 83 c4 10 add $0x10,%esp
10db94: 85 c0 test %eax,%eax
10db96: 0f 85 5d fe ff ff jne 10d9f9 <_Thread_Initialize+0x65>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10db9c: 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;
10db9e: 31 ff xor %edi,%edi
10dba0: e9 45 ff ff ff jmp 10daea <_Thread_Initialize+0x156>
10dba5: 8d 76 00 lea 0x0(%esi),%esi
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
10dba8: 83 ec 0c sub $0xc,%esp
10dbab: 8d 04 85 04 00 00 00 lea 0x4(,%eax,4),%eax
10dbb2: 50 push %eax
10dbb3: e8 a8 0d 00 00 call 10e960 <_Workspace_Allocate>
10dbb8: 89 c6 mov %eax,%esi
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
10dbba: 83 c4 10 add $0x10,%esp
10dbbd: 85 c0 test %eax,%eax
10dbbf: 74 5a je 10dc1b <_Thread_Initialize+0x287>
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dbc1: 89 83 f0 00 00 00 mov %eax,0xf0(%ebx)
10dbc7: 8b 0d 2c 76 12 00 mov 0x12762c,%ecx
* 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++ )
10dbcd: 31 d2 xor %edx,%edx
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dbcf: 31 c0 xor %eax,%eax
10dbd1: 8d 76 00 lea 0x0(%esi),%esi
* so they cannot rely on the thread create user extension
* call.
*/
if ( the_thread->extensions ) {
for ( i = 0; i <= _Thread_Maximum_extensions ; i++ )
the_thread->extensions[i] = NULL;
10dbd4: c7 04 96 00 00 00 00 movl $0x0,(%esi,%edx,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++ )
10dbdb: 40 inc %eax
10dbdc: 89 c2 mov %eax,%edx
10dbde: 39 c1 cmp %eax,%ecx
10dbe0: 73 f2 jae 10dbd4 <_Thread_Initialize+0x240>
10dbe2: e9 53 fe ff ff jmp 10da3a <_Thread_Initialize+0xa6>
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
10dbe7: 83 ec 08 sub $0x8,%esp
10dbea: 56 push %esi
10dbeb: 53 push %ebx
10dbec: 88 55 e0 mov %dl,-0x20(%ebp)
10dbef: e8 1c 06 00 00 call 10e210 <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
10dbf4: 83 c4 10 add $0x10,%esp
10dbf7: 85 c0 test %eax,%eax
10dbf9: 8a 55 e0 mov -0x20(%ebp),%dl
10dbfc: 74 16 je 10dc14 <_Thread_Initialize+0x280>
10dbfe: 39 c6 cmp %eax,%esi
10dc00: 77 12 ja 10dc14 <_Thread_Initialize+0x280><== NEVER TAKEN
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
10dc02: 8b 8b c4 00 00 00 mov 0xc4(%ebx),%ecx
the_thread->Start.core_allocated_stack = true;
10dc08: c6 83 b4 00 00 00 01 movb $0x1,0xb4(%ebx)
10dc0f: e9 c8 fd ff ff jmp 10d9dc <_Thread_Initialize+0x48>
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 */
10dc14: 31 c0 xor %eax,%eax
10dc16: e9 54 ff ff ff jmp 10db6f <_Thread_Initialize+0x1db>
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;
10dc1b: 31 ff xor %edi,%edi
10dc1d: e9 c8 fe ff ff jmp 10daea <_Thread_Initialize+0x156>
001125f8 <_Thread_Reset>:
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
1125f8: 55 push %ebp
1125f9: 89 e5 mov %esp,%ebp
1125fb: 53 push %ebx
1125fc: 83 ec 10 sub $0x10,%esp
1125ff: 8b 5d 08 mov 0x8(%ebp),%ebx
the_thread->resource_count = 0;
112602: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
112609: 8a 83 a0 00 00 00 mov 0xa0(%ebx),%al
11260f: 88 43 74 mov %al,0x74(%ebx)
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
112612: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax
112618: 89 43 7c mov %eax,0x7c(%ebx)
the_thread->budget_callout = the_thread->Start.budget_callout;
11261b: 8b 83 a8 00 00 00 mov 0xa8(%ebx),%eax
112621: 89 83 80 00 00 00 mov %eax,0x80(%ebx)
the_thread->Start.pointer_argument = pointer_argument;
112627: 8b 45 0c mov 0xc(%ebp),%eax
11262a: 89 83 98 00 00 00 mov %eax,0x98(%ebx)
the_thread->Start.numeric_argument = numeric_argument;
112630: 8b 45 10 mov 0x10(%ebp),%eax
112633: 89 83 9c 00 00 00 mov %eax,0x9c(%ebx)
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
112639: 53 push %ebx
11263a: e8 d1 c4 ff ff call 10eb10 <_Thread_queue_Extract_with_proxy>
11263f: 83 c4 10 add $0x10,%esp
112642: 84 c0 test %al,%al
112644: 75 06 jne 11264c <_Thread_Reset+0x54>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
112646: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
11264a: 74 28 je 112674 <_Thread_Reset+0x7c>
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
11264c: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax
112652: 39 43 14 cmp %eax,0x14(%ebx)
112655: 74 15 je 11266c <_Thread_Reset+0x74>
the_thread->real_priority = the_thread->Start.initial_priority;
112657: 89 43 18 mov %eax,0x18(%ebx)
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
11265a: 89 45 0c mov %eax,0xc(%ebp)
11265d: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
112660: 8b 5d fc mov -0x4(%ebp),%ebx
112663: c9 leave
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
the_thread->real_priority = the_thread->Start.initial_priority;
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
112664: e9 83 c6 ff ff jmp 10ecec <_Thread_Set_priority>
112669: 8d 76 00 lea 0x0(%esi),%esi
}
}
11266c: 8b 5d fc mov -0x4(%ebp),%ebx
11266f: c9 leave
112670: c3 ret
112671: 8d 76 00 lea 0x0(%esi),%esi
the_thread->Start.numeric_argument = numeric_argument;
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
112674: 83 ec 0c sub $0xc,%esp
112677: 8d 43 48 lea 0x48(%ebx),%eax
11267a: 50 push %eax
11267b: e8 a8 cd ff ff call 10f428 <_Watchdog_Remove>
112680: 83 c4 10 add $0x10,%esp
112683: eb c7 jmp 11264c <_Thread_Reset+0x54>
00111450 <_Thread_Resume>:
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
111450: 55 push %ebp
111451: 89 e5 mov %esp,%ebp
111453: 53 push %ebx
111454: 83 ec 04 sub $0x4,%esp
111457: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
11145a: 9c pushf
11145b: fa cli
11145c: 5b pop %ebx
current_state = the_thread->current_state;
11145d: 8b 50 10 mov 0x10(%eax),%edx
if ( current_state & STATES_SUSPENDED ) {
111460: f6 c2 02 test $0x2,%dl
111463: 74 0a je 11146f <_Thread_Resume+0x1f> <== NEVER TAKEN
111465: 83 e2 fd and $0xfffffffd,%edx
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
111468: 89 50 10 mov %edx,0x10(%eax)
if ( _States_Is_ready( current_state ) ) {
11146b: 85 d2 test %edx,%edx
11146d: 74 09 je 111478 <_Thread_Resume+0x28>
_Scheduler_Unblock( &_Scheduler, the_thread );
}
}
_ISR_Enable( level );
11146f: 53 push %ebx
111470: 9d popf
}
111471: 8b 5d fc mov -0x4(%ebp),%ebx
111474: c9 leave
111475: c3 ret
111476: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.unblock( the_scheduler, the_thread );
111478: 83 ec 08 sub $0x8,%esp
11147b: 50 push %eax
11147c: 68 a0 af 12 00 push $0x12afa0
111481: ff 15 b0 af 12 00 call *0x12afb0
111487: 83 c4 10 add $0x10,%esp
11148a: eb e3 jmp 11146f <_Thread_Resume+0x1f>
0010e210 <_Thread_Stack_Allocate>:
size_t _Thread_Stack_Allocate(
Thread_Control *the_thread,
size_t stack_size
)
{
10e210: 55 push %ebp
10e211: 89 e5 mov %esp,%ebp
10e213: 53 push %ebx
10e214: 83 ec 04 sub $0x4,%esp
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
}
if ( !stack_addr )
the_stack_size = 0;
10e217: a1 70 32 12 00 mov 0x123270,%eax
10e21c: 8b 5d 0c mov 0xc(%ebp),%ebx
10e21f: 39 c3 cmp %eax,%ebx
10e221: 73 02 jae 10e225 <_Thread_Stack_Allocate+0x15>
10e223: 89 c3 mov %eax,%ebx
* Call ONLY the CPU table stack allocate hook, _or_ the
* the RTEMS workspace allocate. This is so the stack free
* routine can call the correct deallocation routine.
*/
if ( Configuration.stack_allocate_hook ) {
10e225: a1 a4 32 12 00 mov 0x1232a4,%eax
10e22a: 85 c0 test %eax,%eax
10e22c: 74 32 je 10e260 <_Thread_Stack_Allocate+0x50>
stack_addr = (*Configuration.stack_allocate_hook)( the_stack_size );
10e22e: 83 ec 0c sub $0xc,%esp
10e231: 53 push %ebx
10e232: ff d0 call *%eax
10e234: 83 c4 10 add $0x10,%esp
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
}
if ( !stack_addr )
10e237: 85 c0 test %eax,%eax
10e239: 74 11 je 10e24c <_Thread_Stack_Allocate+0x3c>
the_stack_size = 0;
the_thread->Start.stack = stack_addr;
10e23b: 8b 55 08 mov 0x8(%ebp),%edx
10e23e: 89 82 c4 00 00 00 mov %eax,0xc4(%edx)
return the_stack_size;
}
10e244: 89 d8 mov %ebx,%eax
10e246: 8b 5d fc mov -0x4(%ebp),%ebx
10e249: c9 leave
10e24a: c3 ret
10e24b: 90 nop
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
}
if ( !stack_addr )
the_stack_size = 0;
10e24c: 31 db xor %ebx,%ebx
the_thread->Start.stack = stack_addr;
10e24e: 8b 55 08 mov 0x8(%ebp),%edx
10e251: 89 82 c4 00 00 00 mov %eax,0xc4(%edx)
return the_stack_size;
}
10e257: 89 d8 mov %ebx,%eax
10e259: 8b 5d fc mov -0x4(%ebp),%ebx
10e25c: c9 leave
10e25d: c3 ret
10e25e: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE uint32_t _Stack_Adjust_size (
size_t size
)
{
return size + CPU_STACK_ALIGNMENT;
10e260: 83 c3 10 add $0x10,%ebx
* get and keep the stack adjust factor, the stack alignment, and
* the context initialization sequence in sync.
*/
the_stack_size = _Stack_Adjust_size( the_stack_size );
stack_addr = _Workspace_Allocate( the_stack_size );
10e263: 83 ec 0c sub $0xc,%esp
10e266: 53 push %ebx
10e267: e8 f4 06 00 00 call 10e960 <_Workspace_Allocate>
10e26c: 83 c4 10 add $0x10,%esp
10e26f: eb c6 jmp 10e237 <_Thread_Stack_Allocate+0x27>
0010e274 <_Thread_Stack_Free>:
*/
void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
10e274: 55 push %ebp
10e275: 89 e5 mov %esp,%ebp
10e277: 83 ec 08 sub $0x8,%esp
10e27a: 8b 45 08 mov 0x8(%ebp),%eax
#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 )
10e27d: 80 b8 b4 00 00 00 00 cmpb $0x0,0xb4(%eax)
10e284: 74 16 je 10e29c <_Thread_Stack_Free+0x28>
* 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.
*/
if ( Configuration.stack_free_hook )
10e286: 8b 15 a8 32 12 00 mov 0x1232a8,%edx
10e28c: 85 d2 test %edx,%edx
10e28e: 74 10 je 10e2a0 <_Thread_Stack_Free+0x2c>
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
10e290: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax
10e296: 89 45 08 mov %eax,0x8(%ebp)
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
10e299: c9 leave
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
10e29a: ff e2 jmp *%edx
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
10e29c: c9 leave
10e29d: c3 ret
10e29e: 66 90 xchg %ax,%ax
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
10e2a0: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax
10e2a6: 89 45 08 mov %eax,0x8(%ebp)
}
10e2a9: c9 leave
*/
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
10e2aa: e9 cd 06 00 00 jmp 10e97c <_Workspace_Free>
00111980 <_Thread_Suspend>:
*/
void _Thread_Suspend(
Thread_Control *the_thread
)
{
111980: 55 push %ebp
111981: 89 e5 mov %esp,%ebp
111983: 53 push %ebx
111984: 83 ec 04 sub $0x4,%esp
111987: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
_ISR_Disable( level );
11198a: 9c pushf
11198b: fa cli
11198c: 5b pop %ebx
if ( !_States_Is_ready( the_thread->current_state ) ) {
11198d: 8b 50 10 mov 0x10(%eax),%edx
111990: 85 d2 test %edx,%edx
111992: 74 10 je 1119a4 <_Thread_Suspend+0x24>
111994: 83 ca 02 or $0x2,%edx
111997: 89 50 10 mov %edx,0x10(%eax)
the_thread->current_state =
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
11199a: 53 push %ebx
11199b: 9d popf
the_thread->current_state = STATES_SUSPENDED;
_Scheduler_Block(&_Scheduler, the_thread);
_ISR_Enable( level );
}
11199c: 8b 5d fc mov -0x4(%ebp),%ebx
11199f: c9 leave
1119a0: c3 ret
1119a1: 8d 76 00 lea 0x0(%esi),%esi
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
return;
}
the_thread->current_state = STATES_SUSPENDED;
1119a4: c7 40 10 02 00 00 00 movl $0x2,0x10(%eax)
RTEMS_INLINE_ROUTINE void _Scheduler_Block(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.block( the_scheduler, the_thread );
1119ab: 83 ec 08 sub $0x8,%esp
1119ae: 50 push %eax
1119af: 68 00 76 12 00 push $0x127600
1119b4: ff 15 0c 76 12 00 call *0x12760c
_Scheduler_Block(&_Scheduler, the_thread);
_ISR_Enable( level );
1119ba: 53 push %ebx
1119bb: 9d popf
1119bc: 83 c4 10 add $0x10,%esp
}
1119bf: 8b 5d fc mov -0x4(%ebp),%ebx
1119c2: c9 leave
1119c3: c3 ret
0010e36c <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
10e36c: 55 push %ebp
10e36d: 89 e5 mov %esp,%ebp
10e36f: 53 push %ebx
10e370: 83 ec 04 sub $0x4,%esp
Thread_Control *executing;
executing = _Thread_Executing;
10e373: 8b 1d 38 7b 12 00 mov 0x127b38,%ebx
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
10e379: 80 7b 74 00 cmpb $0x0,0x74(%ebx)
10e37d: 74 19 je 10e398 <_Thread_Tickle_timeslice+0x2c>
return;
if ( !_States_Is_ready( executing->current_state ) )
10e37f: 8b 43 10 mov 0x10(%ebx),%eax
10e382: 85 c0 test %eax,%eax
10e384: 75 12 jne 10e398 <_Thread_Tickle_timeslice+0x2c>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
10e386: 8b 43 7c mov 0x7c(%ebx),%eax
10e389: 83 f8 01 cmp $0x1,%eax
10e38c: 72 0a jb 10e398 <_Thread_Tickle_timeslice+0x2c>
10e38e: 83 f8 02 cmp $0x2,%eax
10e391: 76 29 jbe 10e3bc <_Thread_Tickle_timeslice+0x50>
10e393: 83 f8 03 cmp $0x3,%eax
10e396: 74 08 je 10e3a0 <_Thread_Tickle_timeslice+0x34><== ALWAYS TAKEN
if ( --executing->cpu_time_budget == 0 )
(*executing->budget_callout)( executing );
break;
#endif
}
}
10e398: 8b 5d fc mov -0x4(%ebp),%ebx
10e39b: c9 leave
10e39c: c3 ret
10e39d: 8d 76 00 lea 0x0(%esi),%esi
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
10e3a0: 8b 43 78 mov 0x78(%ebx),%eax
10e3a3: 48 dec %eax
10e3a4: 89 43 78 mov %eax,0x78(%ebx)
10e3a7: 85 c0 test %eax,%eax
10e3a9: 75 ed jne 10e398 <_Thread_Tickle_timeslice+0x2c>
(*executing->budget_callout)( executing );
10e3ab: 83 ec 0c sub $0xc,%esp
10e3ae: 53 push %ebx
10e3af: ff 93 80 00 00 00 call *0x80(%ebx)
10e3b5: 83 c4 10 add $0x10,%esp
10e3b8: eb de jmp 10e398 <_Thread_Tickle_timeslice+0x2c>
10e3ba: 66 90 xchg %ax,%ax
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 ) {
10e3bc: 8b 43 78 mov 0x78(%ebx),%eax
10e3bf: 48 dec %eax
10e3c0: 89 43 78 mov %eax,0x78(%ebx)
10e3c3: 85 c0 test %eax,%eax
10e3c5: 7f d1 jg 10e398 <_Thread_Tickle_timeslice+0x2c>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield( &_Scheduler );
10e3c7: 83 ec 0c sub $0xc,%esp
10e3ca: 68 00 76 12 00 push $0x127600
10e3cf: ff 15 08 76 12 00 call *0x127608
* 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;
10e3d5: a1 20 75 12 00 mov 0x127520,%eax
10e3da: 89 43 78 mov %eax,0x78(%ebx)
10e3dd: 83 c4 10 add $0x10,%esp
10e3e0: eb b6 jmp 10e398 <_Thread_Tickle_timeslice+0x2c>
0010dcfc <_Thread_queue_Dequeue_priority>:
*/
Thread_Control *_Thread_queue_Dequeue_priority(
Thread_queue_Control *the_thread_queue
)
{
10dcfc: 55 push %ebp
10dcfd: 89 e5 mov %esp,%ebp
10dcff: 57 push %edi
10dd00: 56 push %esi
10dd01: 53 push %ebx
10dd02: 83 ec 2c sub $0x2c,%esp
10dd05: 8b 7d 08 mov 0x8(%ebp),%edi
Chain_Node *new_second_node;
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
10dd08: 9c pushf
10dd09: fa cli
10dd0a: 58 pop %eax
10dd0b: 89 f9 mov %edi,%ecx
for( index=0 ;
10dd0d: 31 d2 xor %edx,%edx
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd0f: 8b 19 mov (%ecx),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10dd11: 8d 34 52 lea (%edx,%edx,2),%esi
10dd14: 8d 74 b7 04 lea 0x4(%edi,%esi,4),%esi
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
10dd18: 39 f3 cmp %esi,%ebx
10dd1a: 75 18 jne 10dd34 <_Thread_queue_Dequeue_priority+0x38>
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
10dd1c: 42 inc %edx
10dd1d: 83 c1 0c add $0xc,%ecx
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
10dd20: 83 fa 04 cmp $0x4,%edx
10dd23: 75 ea jne 10dd0f <_Thread_queue_Dequeue_priority+0x13>
}
/*
* We did not find a thread to unblock.
*/
_ISR_Enable( level );
10dd25: 50 push %eax
10dd26: 9d popf
return NULL;
10dd27: 31 f6 xor %esi,%esi
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd29: 89 f0 mov %esi,%eax
10dd2b: 8d 65 f4 lea -0xc(%ebp),%esp
10dd2e: 5b pop %ebx
10dd2f: 5e pop %esi
10dd30: 5f pop %edi
10dd31: c9 leave
10dd32: c3 ret
10dd33: 90 nop
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
the_thread = (Thread_Control *) _Chain_First(
10dd34: 89 de mov %ebx,%esi
*/
_ISR_Enable( level );
return NULL;
dequeue:
the_thread->Wait.queue = NULL;
10dd36: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd3d: 8b 53 38 mov 0x38(%ebx),%edx
dequeue:
the_thread->Wait.queue = NULL;
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
next_node = the_thread->Object.Node.next;
10dd40: 8b 0b mov (%ebx),%ecx
previous_node = the_thread->Object.Node.previous;
10dd42: 8b 7b 04 mov 0x4(%ebx),%edi
10dd45: 89 7d d4 mov %edi,-0x2c(%ebp)
10dd48: 8d 7b 3c lea 0x3c(%ebx),%edi
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
10dd4b: 39 fa cmp %edi,%edx
10dd4d: 74 7f je 10ddce <_Thread_queue_Dequeue_priority+0xd2>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
10dd4f: 8b 7b 40 mov 0x40(%ebx),%edi
10dd52: 89 7d e4 mov %edi,-0x1c(%ebp)
next_node = the_thread->Object.Node.next;
previous_node = the_thread->Object.Node.previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
10dd55: 8b 3a mov (%edx),%edi
10dd57: 89 7d e0 mov %edi,-0x20(%ebp)
previous_node->next = new_first_node;
10dd5a: 8b 7d d4 mov -0x2c(%ebp),%edi
10dd5d: 89 17 mov %edx,(%edi)
next_node->previous = new_first_node;
10dd5f: 89 51 04 mov %edx,0x4(%ecx)
new_first_node->next = next_node;
10dd62: 89 0a mov %ecx,(%edx)
new_first_node->previous = previous_node;
10dd64: 89 7a 04 mov %edi,0x4(%edx)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
10dd67: 8b 4b 40 mov 0x40(%ebx),%ecx
10dd6a: 39 4b 38 cmp %ecx,0x38(%ebx)
10dd6d: 74 17 je 10dd86 <_Thread_queue_Dequeue_priority+0x8a>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
10dd6f: 8d 4a 38 lea 0x38(%edx),%ecx
10dd72: 8b 7d e0 mov -0x20(%ebp),%edi
10dd75: 89 4f 04 mov %ecx,0x4(%edi)
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
10dd78: 89 7a 38 mov %edi,0x38(%edx)
tail->previous = last_node;
10dd7b: 8b 4d e4 mov -0x1c(%ebp),%ecx
10dd7e: 89 4a 40 mov %ecx,0x40(%edx)
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
10dd81: 83 c2 3c add $0x3c,%edx
10dd84: 89 11 mov %edx,(%ecx)
} else {
previous_node->next = next_node;
next_node->previous = previous_node;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
10dd86: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
10dd8a: 74 18 je 10dda4 <_Thread_queue_Dequeue_priority+0xa8>
_ISR_Enable( level );
10dd8c: 50 push %eax
10dd8d: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10dd8e: 83 ec 08 sub $0x8,%esp
10dd91: 68 f8 ff 03 10 push $0x1003fff8
10dd96: 53 push %ebx
10dd97: e8 e0 f7 ff ff call 10d57c <_Thread_Clear_state>
10dd9c: 83 c4 10 add $0x10,%esp
10dd9f: eb 88 jmp 10dd29 <_Thread_queue_Dequeue_priority+0x2d>
10dda1: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
10dda4: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
10ddab: 50 push %eax
10ddac: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
10ddad: 83 ec 0c sub $0xc,%esp
10ddb0: 8d 43 48 lea 0x48(%ebx),%eax
10ddb3: 50 push %eax
10ddb4: e8 7f 0a 00 00 call 10e838 <_Watchdog_Remove>
10ddb9: 58 pop %eax
10ddba: 5a pop %edx
10ddbb: 68 f8 ff 03 10 push $0x1003fff8
10ddc0: 53 push %ebx
10ddc1: e8 b6 f7 ff ff call 10d57c <_Thread_Clear_state>
10ddc6: 83 c4 10 add $0x10,%esp
10ddc9: e9 5b ff ff ff jmp 10dd29 <_Thread_queue_Dequeue_priority+0x2d>
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
10ddce: 8b 7d d4 mov -0x2c(%ebp),%edi
10ddd1: 89 0f mov %ecx,(%edi)
next_node->previous = previous_node;
10ddd3: 89 79 04 mov %edi,0x4(%ecx)
10ddd6: eb ae jmp 10dd86 <_Thread_queue_Dequeue_priority+0x8a>
0010de70 <_Thread_queue_Enqueue_priority>:
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
10de70: 55 push %ebp
10de71: 89 e5 mov %esp,%ebp
10de73: 57 push %edi
10de74: 56 push %esi
10de75: 53 push %ebx
10de76: 83 ec 0c sub $0xc,%esp
10de79: 8b 7d 0c mov 0xc(%ebp),%edi
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10de7c: 8d 47 3c lea 0x3c(%edi),%eax
10de7f: 89 47 38 mov %eax,0x38(%edi)
head->next = tail;
head->previous = NULL;
10de82: c7 47 3c 00 00 00 00 movl $0x0,0x3c(%edi)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10de89: 8d 47 38 lea 0x38(%edi),%eax
10de8c: 89 47 40 mov %eax,0x40(%edi)
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
10de8f: 8b 57 14 mov 0x14(%edi),%edx
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
10de92: 89 d0 mov %edx,%eax
10de94: c1 e8 06 shr $0x6,%eax
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
10de97: 8b 4d 08 mov 0x8(%ebp),%ecx
10de9a: 8b 59 38 mov 0x38(%ecx),%ebx
if ( _Thread_queue_Is_reverse_search( priority ) )
10de9d: f6 c2 20 test $0x20,%dl
10dea0: 75 66 jne 10df08 <_Thread_queue_Enqueue_priority+0x98>
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10dea2: 8d 04 40 lea (%eax,%eax,2),%eax
10dea5: 8d 04 81 lea (%ecx,%eax,4),%eax
10dea8: 89 45 f0 mov %eax,-0x10(%ebp)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10deab: 83 c0 04 add $0x4,%eax
10deae: 89 7d e8 mov %edi,-0x18(%ebp)
10deb1: 89 c7 mov %eax,%edi
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
10deb3: 9c pushf
10deb4: fa cli
10deb5: 5e pop %esi
10deb6: 89 75 ec mov %esi,-0x14(%ebp)
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10deb9: 8b 4d f0 mov -0x10(%ebp),%ecx
10debc: 8b 01 mov (%ecx),%eax
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
10debe: 39 f8 cmp %edi,%eax
10dec0: 75 18 jne 10deda <_Thread_queue_Enqueue_priority+0x6a>
10dec2: e9 0e 01 00 00 jmp 10dfd5 <_Thread_queue_Enqueue_priority+0x165>
10dec7: 90 nop
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
10dec8: 56 push %esi
10dec9: 9d popf
10deca: fa cli
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
10decb: 85 58 10 test %ebx,0x10(%eax)
10dece: 0f 84 ac 00 00 00 je 10df80 <_Thread_queue_Enqueue_priority+0x110><== NEVER TAKEN
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
10ded4: 8b 00 mov (%eax),%eax
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
10ded6: 39 f8 cmp %edi,%eax
10ded8: 74 07 je 10dee1 <_Thread_queue_Enqueue_priority+0x71>
search_priority = search_thread->current_priority;
10deda: 8b 48 14 mov 0x14(%eax),%ecx
if ( priority <= search_priority )
10dedd: 39 ca cmp %ecx,%edx
10dedf: 77 e7 ja 10dec8 <_Thread_queue_Enqueue_priority+0x58>
10dee1: 8b 7d e8 mov -0x18(%ebp),%edi
10dee4: 89 75 f0 mov %esi,-0x10(%ebp)
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
10dee7: 8b 75 08 mov 0x8(%ebp),%esi
10deea: 8b 5e 30 mov 0x30(%esi),%ebx
10deed: 83 fb 01 cmp $0x1,%ebx
10def0: 0f 84 92 00 00 00 je 10df88 <_Thread_queue_Enqueue_priority+0x118>
* For example, the blocking thread could have been given
* the mutex by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
10def6: 8b 45 10 mov 0x10(%ebp),%eax
10def9: 8b 55 ec mov -0x14(%ebp),%edx
10defc: 89 10 mov %edx,(%eax)
return the_thread_queue->sync_state;
}
10defe: 89 d8 mov %ebx,%eax
10df00: 83 c4 0c add $0xc,%esp
10df03: 5b pop %ebx
10df04: 5e pop %esi
10df05: 5f pop %edi
10df06: c9 leave
10df07: c3 ret
10df08: 8d 04 40 lea (%eax,%eax,2),%eax
10df0b: 8b 4d 08 mov 0x8(%ebp),%ecx
10df0e: 8d 34 81 lea (%ecx,%eax,4),%esi
10df11: 89 7d f0 mov %edi,-0x10(%ebp)
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
10df14: 0f b6 0d 74 32 12 00 movzbl 0x123274,%ecx
10df1b: 41 inc %ecx
_ISR_Disable( level );
10df1c: 9c pushf
10df1d: fa cli
10df1e: 5f pop %edi
10df1f: 89 7d ec mov %edi,-0x14(%ebp)
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10df22: 8b 46 08 mov 0x8(%esi),%eax
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
10df25: 39 f0 cmp %esi,%eax
10df27: 75 12 jne 10df3b <_Thread_queue_Enqueue_priority+0xcb>
10df29: eb 17 jmp 10df42 <_Thread_queue_Enqueue_priority+0xd2>
10df2b: 90 nop
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
10df2c: 57 push %edi
10df2d: 9d popf
10df2e: fa cli
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
10df2f: 85 58 10 test %ebx,0x10(%eax)
10df32: 74 48 je 10df7c <_Thread_queue_Enqueue_priority+0x10c>
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
10df34: 8b 40 04 mov 0x4(%eax),%eax
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
10df37: 39 f0 cmp %esi,%eax
10df39: 74 07 je 10df42 <_Thread_queue_Enqueue_priority+0xd2>
search_priority = search_thread->current_priority;
10df3b: 8b 48 14 mov 0x14(%eax),%ecx
if ( priority >= search_priority )
10df3e: 39 ca cmp %ecx,%edx
10df40: 72 ea jb 10df2c <_Thread_queue_Enqueue_priority+0xbc>
10df42: 89 7d e8 mov %edi,-0x18(%ebp)
10df45: 8b 7d f0 mov -0x10(%ebp),%edi
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
10df48: 8b 75 08 mov 0x8(%ebp),%esi
10df4b: 8b 5e 30 mov 0x30(%esi),%ebx
10df4e: 83 fb 01 cmp $0x1,%ebx
10df51: 75 a3 jne 10def6 <_Thread_queue_Enqueue_priority+0x86>
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10df53: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
if ( priority == search_priority )
10df5a: 39 ca cmp %ecx,%edx
10df5c: 74 53 je 10dfb1 <_Thread_queue_Enqueue_priority+0x141>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
10df5e: 8b 10 mov (%eax),%edx
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
10df60: 89 17 mov %edx,(%edi)
the_node->previous = search_node;
10df62: 89 47 04 mov %eax,0x4(%edi)
search_node->next = the_node;
10df65: 89 38 mov %edi,(%eax)
next_node->previous = the_node;
10df67: 89 7a 04 mov %edi,0x4(%edx)
the_thread->Wait.queue = the_thread_queue;
10df6a: 89 77 44 mov %esi,0x44(%edi)
_ISR_Enable( level );
10df6d: ff 75 e8 pushl -0x18(%ebp)
10df70: 9d popf
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10df71: 89 d8 mov %ebx,%eax
10df73: 83 c4 0c add $0xc,%esp
10df76: 5b pop %ebx
10df77: 5e pop %esi
10df78: 5f pop %edi
10df79: c9 leave
10df7a: c3 ret
10df7b: 90 nop
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
10df7c: 57 push %edi
10df7d: 9d popf
goto restart_reverse_search;
10df7e: eb 94 jmp 10df14 <_Thread_queue_Enqueue_priority+0xa4>
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
10df80: 56 push %esi <== NOT EXECUTED
10df81: 9d popf <== NOT EXECUTED
goto restart_forward_search;
10df82: e9 2c ff ff ff jmp 10deb3 <_Thread_queue_Enqueue_priority+0x43><== NOT EXECUTED
10df87: 90 nop <== NOT EXECUTED
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10df88: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
if ( priority == search_priority )
10df8f: 39 ca cmp %ecx,%edx
10df91: 74 1e je 10dfb1 <_Thread_queue_Enqueue_priority+0x141>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
10df93: 8b 50 04 mov 0x4(%eax),%edx
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
10df96: 89 07 mov %eax,(%edi)
the_node->previous = previous_node;
10df98: 89 57 04 mov %edx,0x4(%edi)
previous_node->next = the_node;
10df9b: 89 3a mov %edi,(%edx)
search_node->previous = the_node;
10df9d: 89 78 04 mov %edi,0x4(%eax)
the_thread->Wait.queue = the_thread_queue;
10dfa0: 89 77 44 mov %esi,0x44(%edi)
_ISR_Enable( level );
10dfa3: ff 75 f0 pushl -0x10(%ebp)
10dfa6: 9d popf
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10dfa7: 89 d8 mov %ebx,%eax
10dfa9: 83 c4 0c add $0xc,%esp
10dfac: 5b pop %ebx
10dfad: 5e pop %esi
10dfae: 5f pop %edi
10dfaf: c9 leave
10dfb0: c3 ret
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
previous_node = search_node->previous;
10dfb1: 8b 50 40 mov 0x40(%eax),%edx
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
10dfb4: 8d 48 3c lea 0x3c(%eax),%ecx
10dfb7: 89 0f mov %ecx,(%edi)
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
the_node->previous = previous_node;
10dfb9: 89 57 04 mov %edx,0x4(%edi)
previous_node->next = the_node;
10dfbc: 89 3a mov %edi,(%edx)
search_node->previous = the_node;
10dfbe: 89 78 40 mov %edi,0x40(%eax)
the_thread->Wait.queue = the_thread_queue;
10dfc1: 8b 45 08 mov 0x8(%ebp),%eax
10dfc4: 89 47 44 mov %eax,0x44(%edi)
_ISR_Enable( level );
10dfc7: ff 75 ec pushl -0x14(%ebp)
10dfca: 9d popf
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10dfcb: bb 01 00 00 00 mov $0x1,%ebx
10dfd0: e9 29 ff ff ff jmp 10defe <_Thread_queue_Enqueue_priority+0x8e>
10dfd5: 8b 7d e8 mov -0x18(%ebp),%edi
10dfd8: 89 75 f0 mov %esi,-0x10(%ebp)
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
10dfdb: b9 ff ff ff ff mov $0xffffffff,%ecx
10dfe0: e9 02 ff ff ff jmp 10dee7 <_Thread_queue_Enqueue_priority+0x77>
00111824 <_Thread_queue_Extract>:
void _Thread_queue_Extract(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
111824: 55 push %ebp
111825: 89 e5 mov %esp,%ebp
111827: 83 ec 08 sub $0x8,%esp
11182a: 8b 45 08 mov 0x8(%ebp),%eax
11182d: 8b 55 0c mov 0xc(%ebp),%edx
/*
* Can not use indirect function pointer here since Extract priority
* is a macro and the underlying methods do not have the same signature.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
111830: 83 78 34 01 cmpl $0x1,0x34(%eax)
111834: 74 0e je 111844 <_Thread_queue_Extract+0x20>
_Thread_queue_Extract_priority( the_thread_queue, the_thread );
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
111836: 89 55 0c mov %edx,0xc(%ebp)
111839: 89 45 08 mov %eax,0x8(%ebp)
}
11183c: c9 leave
* is a macro and the underlying methods do not have the same signature.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
_Thread_queue_Extract_priority( the_thread_queue, the_thread );
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
11183d: e9 fe 19 00 00 jmp 113240 <_Thread_queue_Extract_fifo>
111842: 66 90 xchg %ax,%ax
/*
* Can not use indirect function pointer here since Extract priority
* is a macro and the underlying methods do not have the same signature.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
_Thread_queue_Extract_priority( the_thread_queue, the_thread );
111844: 51 push %ecx
111845: 6a 00 push $0x0
111847: 52 push %edx
111848: 50 push %eax
111849: e8 06 00 00 00 call 111854 <_Thread_queue_Extract_priority_helper>
11184e: 83 c4 10 add $0x10,%esp
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
}
111851: c9 leave
111852: c3 ret
00113240 <_Thread_queue_Extract_fifo>:
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
113240: 55 push %ebp
113241: 89 e5 mov %esp,%ebp
113243: 53 push %ebx
113244: 83 ec 04 sub $0x4,%esp
113247: 8b 5d 0c mov 0xc(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
11324a: 9c pushf
11324b: fa cli
11324c: 58 pop %eax
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
11324d: f7 43 10 e0 be 03 00 testl $0x3bee0,0x10(%ebx)
113254: 74 2e je 113284 <_Thread_queue_Extract_fifo+0x44>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
113256: 8b 0b mov (%ebx),%ecx
previous = the_node->previous;
113258: 8b 53 04 mov 0x4(%ebx),%edx
next->previous = previous;
11325b: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
11325e: 89 0a mov %ecx,(%edx)
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
113260: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
113267: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
11326b: 74 1f je 11328c <_Thread_queue_Extract_fifo+0x4c>
_ISR_Enable( level );
11326d: 50 push %eax
11326e: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
11326f: c7 45 0c f8 ff 03 10 movl $0x1003fff8,0xc(%ebp)
113276: 89 5d 08 mov %ebx,0x8(%ebp)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
113279: 8b 5d fc mov -0x4(%ebp),%ebx
11327c: c9 leave
11327d: e9 fa a2 ff ff jmp 10d57c <_Thread_Clear_state>
113282: 66 90 xchg %ax,%ax
ISR_Level level;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
113284: 50 push %eax
113285: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
113286: 8b 5d fc mov -0x4(%ebp),%ebx
113289: c9 leave
11328a: c3 ret
11328b: 90 nop
11328c: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
113293: 50 push %eax
113294: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
113295: 83 ec 0c sub $0xc,%esp
113298: 8d 43 48 lea 0x48(%ebx),%eax
11329b: 50 push %eax
11329c: e8 97 b5 ff ff call 10e838 <_Watchdog_Remove>
1132a1: 83 c4 10 add $0x10,%esp
1132a4: eb c9 jmp 11326f <_Thread_queue_Extract_fifo+0x2f>
00111854 <_Thread_queue_Extract_priority_helper>:
void _Thread_queue_Extract_priority_helper(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread,
bool requeuing
)
{
111854: 55 push %ebp
111855: 89 e5 mov %esp,%ebp
111857: 57 push %edi
111858: 56 push %esi
111859: 53 push %ebx
11185a: 83 ec 1c sub $0x1c,%esp
11185d: 8b 5d 0c mov 0xc(%ebp),%ebx
111860: 8a 45 10 mov 0x10(%ebp),%al
111863: 88 45 e3 mov %al,-0x1d(%ebp)
Chain_Node *new_first_node;
Chain_Node *new_second_node;
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
111866: 9c pushf
111867: fa cli
111868: 8f 45 e4 popl -0x1c(%ebp)
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
11186b: f7 43 10 e0 be 03 00 testl $0x3bee0,0x10(%ebx)
111872: 74 6c je 1118e0 <_Thread_queue_Extract_priority_helper+0x8c><== NEVER TAKEN
/*
* The thread was actually waiting on a thread queue so let's remove it.
*/
next_node = the_node->next;
111874: 8b 13 mov (%ebx),%edx
previous_node = the_node->previous;
111876: 8b 4b 04 mov 0x4(%ebx),%ecx
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
111879: 8b 43 38 mov 0x38(%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 );
11187c: 8d 73 3c lea 0x3c(%ebx),%esi
*/
next_node = the_node->next;
previous_node = the_node->previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
11187f: 39 f0 cmp %esi,%eax
111881: 74 69 je 1118ec <_Thread_queue_Extract_priority_helper+0x98>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
111883: 8b 7b 40 mov 0x40(%ebx),%edi
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
111886: 8b 30 mov (%eax),%esi
previous_node->next = new_first_node;
111888: 89 01 mov %eax,(%ecx)
next_node->previous = new_first_node;
11188a: 89 42 04 mov %eax,0x4(%edx)
new_first_node->next = next_node;
11188d: 89 10 mov %edx,(%eax)
new_first_node->previous = previous_node;
11188f: 89 48 04 mov %ecx,0x4(%eax)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
111892: 8b 53 40 mov 0x40(%ebx),%edx
111895: 39 53 38 cmp %edx,0x38(%ebx)
111898: 74 11 je 1118ab <_Thread_queue_Extract_priority_helper+0x57>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
11189a: 8d 50 38 lea 0x38(%eax),%edx
11189d: 89 56 04 mov %edx,0x4(%esi)
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
new_second_node->previous = head;
head->next = new_second_node;
1118a0: 89 70 38 mov %esi,0x38(%eax)
tail->previous = last_node;
1118a3: 89 78 40 mov %edi,0x40(%eax)
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
1118a6: 83 c0 3c add $0x3c,%eax
1118a9: 89 07 mov %eax,(%edi)
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
1118ab: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp)
1118af: 75 23 jne 1118d4 <_Thread_queue_Extract_priority_helper+0x80>
_ISR_Enable( level );
return;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
1118b1: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
1118b5: 74 3d je 1118f4 <_Thread_queue_Extract_priority_helper+0xa0>
_ISR_Enable( level );
1118b7: ff 75 e4 pushl -0x1c(%ebp)
1118ba: 9d popf
1118bb: c7 45 0c f8 ff 03 10 movl $0x1003fff8,0xc(%ebp)
1118c2: 89 5d 08 mov %ebx,0x8(%ebp)
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1118c5: 8d 65 f4 lea -0xc(%ebp),%esp
1118c8: 5b pop %ebx
1118c9: 5e pop %esi
1118ca: 5f pop %edi
1118cb: c9 leave
1118cc: e9 ab bc ff ff jmp 10d57c <_Thread_Clear_state>
1118d1: 8d 76 00 lea 0x0(%esi),%esi
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
_ISR_Enable( level );
1118d4: ff 75 e4 pushl -0x1c(%ebp)
1118d7: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1118d8: 8d 65 f4 lea -0xc(%ebp),%esp
1118db: 5b pop %ebx
1118dc: 5e pop %esi
1118dd: 5f pop %edi
1118de: c9 leave
1118df: c3 ret
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_ISR_Enable( level );
1118e0: ff 75 e4 pushl -0x1c(%ebp)
1118e3: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1118e4: 8d 65 f4 lea -0xc(%ebp),%esp
1118e7: 5b pop %ebx
1118e8: 5e pop %esi
1118e9: 5f pop %edi
1118ea: c9 leave
1118eb: c3 ret
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
1118ec: 89 11 mov %edx,(%ecx)
next_node->previous = previous_node;
1118ee: 89 4a 04 mov %ecx,0x4(%edx)
1118f1: eb b8 jmp 1118ab <_Thread_queue_Extract_priority_helper+0x57>
1118f3: 90 nop
1118f4: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
1118fb: ff 75 e4 pushl -0x1c(%ebp)
1118fe: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
1118ff: 83 ec 0c sub $0xc,%esp
111902: 8d 43 48 lea 0x48(%ebx),%eax
111905: 50 push %eax
111906: e8 2d cf ff ff call 10e838 <_Watchdog_Remove>
11190b: 83 c4 10 add $0x10,%esp
11190e: eb ab jmp 1118bb <_Thread_queue_Extract_priority_helper+0x67>
0010dfe8 <_Thread_queue_Extract_with_proxy>:
*/
bool _Thread_queue_Extract_with_proxy(
Thread_Control *the_thread
)
{
10dfe8: 55 push %ebp
10dfe9: 89 e5 mov %esp,%ebp
10dfeb: 83 ec 08 sub $0x8,%esp
10dfee: 8b 45 08 mov 0x8(%ebp),%eax
States_Control state;
state = the_thread->current_state;
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10dff1: f7 40 10 e0 be 03 00 testl $0x3bee0,0x10(%eax)
10dff8: 75 06 jne 10e000 <_Thread_queue_Extract_with_proxy+0x18>
#endif
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
return true;
}
return false;
10dffa: 31 c0 xor %eax,%eax
}
10dffc: c9 leave
10dffd: c3 ret
10dffe: 66 90 xchg %ax,%ax
if ( proxy_extract_callout )
(*proxy_extract_callout)( the_thread );
}
#endif
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
10e000: 83 ec 08 sub $0x8,%esp
10e003: 50 push %eax
10e004: ff 70 44 pushl 0x44(%eax)
10e007: e8 18 38 00 00 call 111824 <_Thread_queue_Extract>
return true;
10e00c: 83 c4 10 add $0x10,%esp
10e00f: b0 01 mov $0x1,%al
}
return false;
}
10e011: c9 leave
10e012: c3 ret
0010fe40 <_Thread_queue_First>:
*/
Thread_Control *_Thread_queue_First(
Thread_queue_Control *the_thread_queue
)
{
10fe40: 55 push %ebp
10fe41: 89 e5 mov %esp,%ebp
10fe43: 83 ec 08 sub $0x8,%esp
10fe46: 8b 45 08 mov 0x8(%ebp),%eax
Thread_Control * (*first_p)(Thread_queue_Control *);
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
10fe49: 83 78 34 01 cmpl $0x1,0x34(%eax)
10fe4d: 74 0d je 10fe5c <_Thread_queue_First+0x1c>
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
10fe4f: ba b8 37 11 00 mov $0x1137b8,%edx
return (*first_p)( the_thread_queue );
10fe54: 89 45 08 mov %eax,0x8(%ebp)
}
10fe57: c9 leave
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fe58: ff e2 jmp *%edx
10fe5a: 66 90 xchg %ax,%ax
)
{
Thread_Control * (*first_p)(Thread_queue_Control *);
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
first_p = _Thread_queue_First_priority;
10fe5c: ba 68 fe 10 00 mov $0x10fe68,%edx
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fe61: 89 45 08 mov %eax,0x8(%ebp)
}
10fe64: c9 leave
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fe65: ff e2 jmp *%edx
001137b8 <_Thread_queue_First_fifo>:
*/
Thread_Control *_Thread_queue_First_fifo(
Thread_queue_Control *the_thread_queue
)
{
1137b8: 55 push %ebp
1137b9: 89 e5 mov %esp,%ebp
1137bb: 8b 55 08 mov 0x8(%ebp),%edx
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
}
1137be: 8b 02 mov (%edx),%eax
1137c0: 83 c2 04 add $0x4,%edx
Thread_Control *_Thread_queue_First_fifo(
Thread_queue_Control *the_thread_queue
)
{
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
1137c3: 39 d0 cmp %edx,%eax
1137c5: 74 05 je 1137cc <_Thread_queue_First_fifo+0x14>
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
}
1137c7: c9 leave
1137c8: c3 ret
1137c9: 8d 76 00 lea 0x0(%esi),%esi
)
{
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
1137cc: 31 c0 xor %eax,%eax
}
1137ce: c9 leave
1137cf: c3 ret
0010e014 <_Thread_queue_Flush>:
#else
Thread_queue_Flush_callout remote_extract_callout __attribute__((unused)),
#endif
uint32_t status
)
{
10e014: 55 push %ebp
10e015: 89 e5 mov %esp,%ebp
10e017: 56 push %esi
10e018: 53 push %ebx
10e019: 8b 5d 08 mov 0x8(%ebp),%ebx
10e01c: 8b 75 10 mov 0x10(%ebp),%esi
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
10e01f: eb 06 jmp 10e027 <_Thread_queue_Flush+0x13>
10e021: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
( *remote_extract_callout )( the_thread );
else
#endif
the_thread->Wait.return_code = status;
10e024: 89 70 34 mov %esi,0x34(%eax)
uint32_t status
)
{
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
10e027: 83 ec 0c sub $0xc,%esp
10e02a: 53 push %ebx
10e02b: e8 80 fc ff ff call 10dcb0 <_Thread_queue_Dequeue>
10e030: 83 c4 10 add $0x10,%esp
10e033: 85 c0 test %eax,%eax
10e035: 75 ed jne 10e024 <_Thread_queue_Flush+0x10>
( *remote_extract_callout )( the_thread );
else
#endif
the_thread->Wait.return_code = status;
}
}
10e037: 8d 65 f8 lea -0x8(%ebp),%esp
10e03a: 5b pop %ebx
10e03b: 5e pop %esi
10e03c: c9 leave
10e03d: c3 ret
0010e040 <_Thread_queue_Initialize>:
Thread_queue_Control *the_thread_queue,
Thread_queue_Disciplines the_discipline,
States_Control state,
uint32_t timeout_status
)
{
10e040: 55 push %ebp
10e041: 89 e5 mov %esp,%ebp
10e043: 56 push %esi
10e044: 53 push %ebx
10e045: 8b 45 08 mov 0x8(%ebp),%eax
10e048: 8b 55 0c mov 0xc(%ebp),%edx
the_thread_queue->state = state;
10e04b: 8b 4d 10 mov 0x10(%ebp),%ecx
10e04e: 89 48 38 mov %ecx,0x38(%eax)
the_thread_queue->discipline = the_discipline;
10e051: 89 50 34 mov %edx,0x34(%eax)
the_thread_queue->timeout_status = timeout_status;
10e054: 8b 4d 14 mov 0x14(%ebp),%ecx
10e057: 89 48 3c mov %ecx,0x3c(%eax)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10e05a: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
10e061: 83 fa 01 cmp $0x1,%edx
10e064: 74 16 je 10e07c <_Thread_queue_Initialize+0x3c>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10e066: 8d 50 04 lea 0x4(%eax),%edx
10e069: 89 10 mov %edx,(%eax)
head->next = tail;
head->previous = NULL;
10e06b: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
tail->previous = head;
10e072: 89 40 08 mov %eax,0x8(%eax)
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
} else { /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
}
}
10e075: 5b pop %ebx
10e076: 5e pop %esi
10e077: c9 leave
10e078: c3 ret
10e079: 8d 76 00 lea 0x0(%esi),%esi
the_thread_queue->state = state;
the_thread_queue->discipline = the_discipline;
the_thread_queue->timeout_status = timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
10e07c: 89 c1 mov %eax,%ecx
10e07e: 30 d2 xor %dl,%dl
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
10e080: 8d 1c 52 lea (%edx,%edx,2),%ebx
10e083: 8d 1c 98 lea (%eax,%ebx,4),%ebx
10e086: 8d 73 04 lea 0x4(%ebx),%esi
10e089: 89 31 mov %esi,(%ecx)
head->next = tail;
head->previous = NULL;
10e08b: c7 41 04 00 00 00 00 movl $0x0,0x4(%ecx)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10e092: 89 59 08 mov %ebx,0x8(%ecx)
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
10e095: 42 inc %edx
10e096: 83 c1 0c add $0xc,%ecx
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
uint32_t index;
for( index=0 ;
10e099: 83 fa 04 cmp $0x4,%edx
10e09c: 75 e2 jne 10e080 <_Thread_queue_Initialize+0x40>
_Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
} else { /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
}
}
10e09e: 5b pop %ebx
10e09f: 5e pop %esi
10e0a0: c9 leave
10e0a1: c3 ret
0010e0a4 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
10e0a4: 55 push %ebp
10e0a5: 89 e5 mov %esp,%ebp
10e0a7: 57 push %edi
10e0a8: 56 push %esi
10e0a9: 53 push %ebx
10e0aa: 83 ec 1c sub $0x1c,%esp
10e0ad: 8b 75 08 mov 0x8(%ebp),%esi
10e0b0: 8b 7d 0c mov 0xc(%ebp),%edi
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
10e0b3: 85 f6 test %esi,%esi
10e0b5: 74 06 je 10e0bd <_Thread_queue_Requeue+0x19><== 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 ) {
10e0b7: 83 7e 34 01 cmpl $0x1,0x34(%esi)
10e0bb: 74 0b je 10e0c8 <_Thread_queue_Requeue+0x24><== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
10e0bd: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10e0c0: 5b pop %ebx <== NOT EXECUTED
10e0c1: 5e pop %esi <== NOT EXECUTED
10e0c2: 5f pop %edi <== NOT EXECUTED
10e0c3: c9 leave <== NOT EXECUTED
10e0c4: c3 ret <== NOT EXECUTED
10e0c5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
10e0c8: 9c pushf
10e0c9: fa cli
10e0ca: 5b pop %ebx
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
10e0cb: f7 47 10 e0 be 03 00 testl $0x3bee0,0x10(%edi)
10e0d2: 75 0c jne 10e0e0 <_Thread_queue_Requeue+0x3c><== ALWAYS TAKEN
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
10e0d4: 53 push %ebx
10e0d5: 9d popf
}
}
10e0d6: 8d 65 f4 lea -0xc(%ebp),%esp
10e0d9: 5b pop %ebx
10e0da: 5e pop %esi
10e0db: 5f pop %edi
10e0dc: c9 leave
10e0dd: c3 ret
10e0de: 66 90 xchg %ax,%ax
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;
10e0e0: c7 46 30 01 00 00 00 movl $0x1,0x30(%esi)
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
10e0e7: 50 push %eax
10e0e8: 6a 01 push $0x1
10e0ea: 57 push %edi
10e0eb: 56 push %esi
10e0ec: e8 63 37 00 00 call 111854 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
10e0f1: 83 c4 0c add $0xc,%esp
10e0f4: 8d 45 e4 lea -0x1c(%ebp),%eax
10e0f7: 50 push %eax
10e0f8: 57 push %edi
10e0f9: 56 push %esi
10e0fa: e8 71 fd ff ff call 10de70 <_Thread_queue_Enqueue_priority>
10e0ff: 83 c4 10 add $0x10,%esp
10e102: eb d0 jmp 10e0d4 <_Thread_queue_Requeue+0x30>
0010e104 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10e104: 55 push %ebp
10e105: 89 e5 mov %esp,%ebp
10e107: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10e10a: 8d 45 f4 lea -0xc(%ebp),%eax
10e10d: 50 push %eax
10e10e: ff 75 08 pushl 0x8(%ebp)
10e111: e8 0a f8 ff ff call 10d920 <_Thread_Get>
switch ( location ) {
10e116: 83 c4 10 add $0x10,%esp
10e119: 8b 55 f4 mov -0xc(%ebp),%edx
10e11c: 85 d2 test %edx,%edx
10e11e: 75 17 jne 10e137 <_Thread_queue_Timeout+0x33><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
10e120: 83 ec 0c sub $0xc,%esp
10e123: 50 push %eax
10e124: e8 e7 37 00 00 call 111910 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10e129: a1 50 75 12 00 mov 0x127550,%eax
10e12e: 48 dec %eax
10e12f: a3 50 75 12 00 mov %eax,0x127550
10e134: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10e137: c9 leave
10e138: c3 ret
00118db0 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
118db0: 55 push %ebp
118db1: 89 e5 mov %esp,%ebp
118db3: 57 push %edi
118db4: 56 push %esi
118db5: 53 push %ebx
118db6: 83 ec 4c sub $0x4c,%esp
118db9: 8b 5d 08 mov 0x8(%ebp),%ebx
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
118dbc: 8d 45 e0 lea -0x20(%ebp),%eax
118dbf: 89 45 b4 mov %eax,-0x4c(%ebp)
118dc2: 89 45 dc mov %eax,-0x24(%ebp)
head->previous = NULL;
118dc5: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
tail->previous = head;
118dcc: 8d 4d dc lea -0x24(%ebp),%ecx
118dcf: 89 4d e4 mov %ecx,-0x1c(%ebp)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
118dd2: 8d 7d d0 lea -0x30(%ebp),%edi
118dd5: 8d 45 d4 lea -0x2c(%ebp),%eax
118dd8: 89 45 b0 mov %eax,-0x50(%ebp)
118ddb: 89 45 d0 mov %eax,-0x30(%ebp)
head->previous = NULL;
118dde: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
tail->previous = head;
118de5: 89 7d d8 mov %edi,-0x28(%ebp)
118de8: 8d 73 30 lea 0x30(%ebx),%esi
118deb: 8d 4b 68 lea 0x68(%ebx),%ecx
118dee: 89 4d c4 mov %ecx,-0x3c(%ebp)
118df1: 8d 43 08 lea 0x8(%ebx),%eax
118df4: 89 45 bc mov %eax,-0x44(%ebp)
118df7: 8d 53 40 lea 0x40(%ebx),%edx
118dfa: 89 55 c0 mov %edx,-0x40(%ebp)
118dfd: 8d 76 00 lea 0x0(%esi),%esi
Chain_Control *tmp;
/*
* 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;
118e00: 8d 4d dc lea -0x24(%ebp),%ecx
118e03: 89 4b 78 mov %ecx,0x78(%ebx)
118e06: 66 90 xchg %ax,%ax
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
118e08: a1 44 23 14 00 mov 0x142344,%eax
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
118e0d: 8b 53 3c mov 0x3c(%ebx),%edx
watchdogs->last_snapshot = snapshot;
118e10: 89 43 3c mov %eax,0x3c(%ebx)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118e13: 51 push %ecx
118e14: 57 push %edi
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
118e15: 29 d0 sub %edx,%eax
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118e17: 50 push %eax
118e18: 56 push %esi
118e19: e8 6a 3f 00 00 call 11cd88 <_Watchdog_Adjust_to_chain>
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
118e1e: a1 a4 22 14 00 mov 0x1422a4,%eax
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
118e23: 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 ) {
118e26: 83 c4 10 add $0x10,%esp
118e29: 39 d0 cmp %edx,%eax
118e2b: 0f 87 af 00 00 00 ja 118ee0 <_Timer_server_Body+0x130>
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
118e31: 0f 82 c9 00 00 00 jb 118f00 <_Timer_server_Body+0x150>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
118e37: 89 43 74 mov %eax,0x74(%ebx)
118e3a: 66 90 xchg %ax,%ax
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
118e3c: 8b 43 78 mov 0x78(%ebx),%eax
118e3f: 83 ec 0c sub $0xc,%esp
118e42: 50 push %eax
118e43: e8 04 0a 00 00 call 11984c <_Chain_Get>
if ( timer == NULL ) {
118e48: 83 c4 10 add $0x10,%esp
118e4b: 85 c0 test %eax,%eax
118e4d: 74 35 je 118e84 <_Timer_server_Body+0xd4><== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118e4f: 8b 50 38 mov 0x38(%eax),%edx <== NOT EXECUTED
118e52: 83 fa 01 cmp $0x1,%edx <== NOT EXECUTED
118e55: 74 19 je 118e70 <_Timer_server_Body+0xc0><== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
118e57: 83 fa 03 cmp $0x3,%edx <== NOT EXECUTED
118e5a: 75 e0 jne 118e3c <_Timer_server_Body+0x8c><== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
118e5c: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
118e5f: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
118e62: 50 push %eax <== NOT EXECUTED
118e63: ff 75 c4 pushl -0x3c(%ebp) <== NOT EXECUTED
118e66: e8 a9 3f 00 00 call 11ce14 <_Watchdog_Insert> <== NOT EXECUTED
118e6b: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
118e6e: eb cc jmp 118e3c <_Timer_server_Body+0x8c><== NOT EXECUTED
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
118e70: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
118e73: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
118e76: 50 push %eax <== NOT EXECUTED
118e77: 56 push %esi <== NOT EXECUTED
118e78: e8 97 3f 00 00 call 11ce14 <_Watchdog_Insert> <== NOT EXECUTED
118e7d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
118e80: eb ba jmp 118e3c <_Timer_server_Body+0x8c><== NOT EXECUTED
118e82: 66 90 xchg %ax,%ax <== 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 );
118e84: 9c pushf
118e85: fa cli
118e86: 58 pop %eax
tmp = ts->insert_chain;
118e87: 8b 53 78 mov 0x78(%ebx),%edx
if ( _Chain_Is_empty( insert_chain ) ) {
118e8a: 8b 55 b4 mov -0x4c(%ebp),%edx
118e8d: 39 55 dc cmp %edx,-0x24(%ebp)
118e90: 0f 84 86 00 00 00 je 118f1c <_Timer_server_Body+0x16c><== ALWAYS TAKEN
118e96: b2 01 mov $0x1,%dl <== NOT EXECUTED
ts->insert_chain = NULL;
do_loop = false;
}
_ISR_Enable( level );
118e98: 50 push %eax
118e99: 9d popf
* 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;
while ( do_loop ) {
118e9a: 84 d2 test %dl,%dl
118e9c: 0f 85 66 ff ff ff jne 118e08 <_Timer_server_Body+0x58><== NEVER TAKEN
_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 ) ) {
118ea2: 8b 4d b0 mov -0x50(%ebp),%ecx
118ea5: 39 4d d0 cmp %ecx,-0x30(%ebp)
118ea8: 75 22 jne 118ecc <_Timer_server_Body+0x11c>
118eaa: eb 7e jmp 118f2a <_Timer_server_Body+0x17a>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
118eac: 8b 10 mov (%eax),%edx
head->next = new_first;
118eae: 89 55 d0 mov %edx,-0x30(%ebp)
new_first->previous = head;
118eb1: 89 7a 04 mov %edi,0x4(%edx)
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
118eb4: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
_ISR_Enable( level );
118ebb: 51 push %ecx
118ebc: 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 );
118ebd: 83 ec 08 sub $0x8,%esp
118ec0: ff 70 24 pushl 0x24(%eax)
118ec3: ff 70 20 pushl 0x20(%eax)
118ec6: ff 50 1c call *0x1c(%eax)
}
118ec9: 83 c4 10 add $0x10,%esp
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
118ecc: 9c pushf
118ecd: fa cli
118ece: 59 pop %ecx
initialized = false;
}
#endif
return status;
}
118ecf: 8b 45 d0 mov -0x30(%ebp),%eax
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
118ed2: 3b 45 b0 cmp -0x50(%ebp),%eax
118ed5: 75 d5 jne 118eac <_Timer_server_Body+0xfc>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
118ed7: 51 push %ecx
118ed8: 9d popf
118ed9: e9 22 ff ff ff jmp 118e00 <_Timer_server_Body+0x50>
118ede: 66 90 xchg %ax,%ax
/*
* 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 );
118ee0: 51 push %ecx
118ee1: 57 push %edi
if ( snapshot > last_snapshot ) {
/*
* This path is for normal forward movement and cases where the
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
118ee2: 89 c1 mov %eax,%ecx
118ee4: 29 d1 sub %edx,%ecx
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118ee6: 51 push %ecx
118ee7: ff 75 c4 pushl -0x3c(%ebp)
118eea: 89 45 b8 mov %eax,-0x48(%ebp)
118eed: e8 96 3e 00 00 call 11cd88 <_Watchdog_Adjust_to_chain>
118ef2: 83 c4 10 add $0x10,%esp
118ef5: 8b 45 b8 mov -0x48(%ebp),%eax
118ef8: e9 3a ff ff ff jmp 118e37 <_Timer_server_Body+0x87>
118efd: 8d 76 00 lea 0x0(%esi),%esi
/*
* 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 );
118f00: 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;
118f01: 29 c2 sub %eax,%edx
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
118f03: 52 push %edx
118f04: 6a 01 push $0x1
118f06: ff 75 c4 pushl -0x3c(%ebp)
118f09: 89 45 b8 mov %eax,-0x48(%ebp)
118f0c: e8 ff 3d 00 00 call 11cd10 <_Watchdog_Adjust>
118f11: 83 c4 10 add $0x10,%esp
118f14: 8b 45 b8 mov -0x48(%ebp),%eax
118f17: e9 1b ff ff ff jmp 118e37 <_Timer_server_Body+0x87>
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
tmp = ts->insert_chain;
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
118f1c: c7 43 78 00 00 00 00 movl $0x0,0x78(%ebx)
do_loop = false;
118f23: 31 d2 xor %edx,%edx
118f25: e9 6e ff ff ff jmp 118e98 <_Timer_server_Body+0xe8>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
118f2a: c6 43 7c 00 movb $0x0,0x7c(%ebx)
118f2e: a1 d0 21 14 00 mov 0x1421d0,%eax
118f33: 40 inc %eax
118f34: a3 d0 21 14 00 mov %eax,0x1421d0
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
118f39: 83 ec 08 sub $0x8,%esp
118f3c: 6a 08 push $0x8
118f3e: ff 33 pushl (%ebx)
118f40: e8 5f 37 00 00 call 11c6a4 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
118f45: 89 d8 mov %ebx,%eax
118f47: e8 c4 fd ff ff call 118d10 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
118f4c: 89 d8 mov %ebx,%eax
118f4e: e8 0d fe ff ff call 118d60 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
118f53: e8 24 2e 00 00 call 11bd7c <_Thread_Enable_dispatch>
ts->active = true;
118f58: 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 );
118f5c: 5a pop %edx
118f5d: ff 75 bc pushl -0x44(%ebp)
118f60: e8 e7 3f 00 00 call 11cf4c <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
118f65: 58 pop %eax
118f66: ff 75 c0 pushl -0x40(%ebp)
118f69: e8 de 3f 00 00 call 11cf4c <_Watchdog_Remove>
118f6e: 83 c4 10 add $0x10,%esp
118f71: e9 8a fe ff ff jmp 118e00 <_Timer_server_Body+0x50>
00118f78 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
118f78: 55 push %ebp
118f79: 89 e5 mov %esp,%ebp
118f7b: 57 push %edi
118f7c: 56 push %esi
118f7d: 53 push %ebx
118f7e: 83 ec 2c sub $0x2c,%esp
118f81: 8b 5d 08 mov 0x8(%ebp),%ebx
118f84: 8b 45 0c mov 0xc(%ebp),%eax
if ( ts->insert_chain == NULL ) {
118f87: 8b 53 78 mov 0x78(%ebx),%edx
118f8a: 85 d2 test %edx,%edx
118f8c: 74 16 je 118fa4 <_Timer_server_Schedule_operation_method+0x2c><== ALWAYS TAKEN
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
118f8e: 8b 53 78 mov 0x78(%ebx),%edx <== NOT EXECUTED
118f91: 89 45 0c mov %eax,0xc(%ebp) <== NOT EXECUTED
118f94: 89 55 08 mov %edx,0x8(%ebp) <== NOT EXECUTED
}
}
118f97: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
118f9a: 5b pop %ebx <== NOT EXECUTED
118f9b: 5e pop %esi <== NOT EXECUTED
118f9c: 5f pop %edi <== NOT EXECUTED
118f9d: c9 leave <== 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 );
118f9e: e9 6d 08 00 00 jmp 119810 <_Chain_Append> <== NOT EXECUTED
118fa3: 90 nop <== NOT EXECUTED
118fa4: 8b 15 d0 21 14 00 mov 0x1421d0,%edx
118faa: 42 inc %edx
118fab: 89 15 d0 21 14 00 mov %edx,0x1421d0
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118fb1: 8b 50 38 mov 0x38(%eax),%edx
118fb4: 83 fa 01 cmp $0x1,%edx
118fb7: 74 7b je 119034 <_Timer_server_Schedule_operation_method+0xbc>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
if ( !ts->active ) {
_Timer_server_Reset_interval_system_watchdog( ts );
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
118fb9: 83 fa 03 cmp $0x3,%edx
118fbc: 74 0e je 118fcc <_Timer_server_Schedule_operation_method+0x54>
* 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 );
}
}
118fbe: 8d 65 f4 lea -0xc(%ebp),%esp
118fc1: 5b pop %ebx
118fc2: 5e pop %esi
118fc3: 5f pop %edi
118fc4: c9 leave
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
118fc5: e9 b2 2d 00 00 jmp 11bd7c <_Thread_Enable_dispatch>
118fca: 66 90 xchg %ax,%ax
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
118fcc: 9c pushf
118fcd: fa cli
118fce: 8f 45 e4 popl -0x1c(%ebp)
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
118fd1: 8b 0d a4 22 14 00 mov 0x1422a4,%ecx
last_snapshot = ts->TOD_watchdogs.last_snapshot;
118fd7: 8b 53 74 mov 0x74(%ebx),%edx
118fda: 89 55 d4 mov %edx,-0x2c(%ebp)
initialized = false;
}
#endif
return status;
}
118fdd: 8b 53 68 mov 0x68(%ebx),%edx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
118fe0: 8d 7b 6c lea 0x6c(%ebx),%edi
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
118fe3: 39 fa cmp %edi,%edx
118fe5: 74 21 je 119008 <_Timer_server_Schedule_operation_method+0x90>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
118fe7: 8b 7a 10 mov 0x10(%edx),%edi
if ( snapshot > last_snapshot ) {
118fea: 3b 4d d4 cmp -0x2c(%ebp),%ecx
118fed: 0f 86 a1 00 00 00 jbe 119094 <_Timer_server_Schedule_operation_method+0x11c>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
118ff3: 89 ce mov %ecx,%esi
118ff5: 2b 75 d4 sub -0x2c(%ebp),%esi
118ff8: 89 75 d4 mov %esi,-0x2c(%ebp)
if (delta_interval > delta) {
118ffb: 39 f7 cmp %esi,%edi
118ffd: 0f 86 9b 00 00 00 jbe 11909e <_Timer_server_Schedule_operation_method+0x126><== NEVER TAKEN
delta_interval -= delta;
119003: 29 f7 sub %esi,%edi
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
119005: 89 7a 10 mov %edi,0x10(%edx)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
119008: 89 4b 74 mov %ecx,0x74(%ebx)
_ISR_Enable( level );
11900b: ff 75 e4 pushl -0x1c(%ebp)
11900e: 9d popf
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
11900f: 83 ec 08 sub $0x8,%esp
119012: 83 c0 10 add $0x10,%eax
119015: 50 push %eax
119016: 8d 43 68 lea 0x68(%ebx),%eax
119019: 50 push %eax
11901a: e8 f5 3d 00 00 call 11ce14 <_Watchdog_Insert>
if ( !ts->active ) {
11901f: 8a 43 7c mov 0x7c(%ebx),%al
119022: 83 c4 10 add $0x10,%esp
119025: 84 c0 test %al,%al
119027: 75 95 jne 118fbe <_Timer_server_Schedule_operation_method+0x46>
_Timer_server_Reset_tod_system_watchdog( ts );
119029: 89 d8 mov %ebx,%eax
11902b: e8 30 fd ff ff call 118d60 <_Timer_server_Reset_tod_system_watchdog>
119030: eb 8c jmp 118fbe <_Timer_server_Schedule_operation_method+0x46>
119032: 66 90 xchg %ax,%ax
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
119034: 9c pushf
119035: fa cli
119036: 8f 45 e4 popl -0x1c(%ebp)
snapshot = _Watchdog_Ticks_since_boot;
119039: 8b 0d 44 23 14 00 mov 0x142344,%ecx
last_snapshot = ts->Interval_watchdogs.last_snapshot;
11903f: 8b 7b 3c mov 0x3c(%ebx),%edi
initialized = false;
}
#endif
return status;
}
119042: 8b 53 30 mov 0x30(%ebx),%edx
119045: 8d 73 34 lea 0x34(%ebx),%esi
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
last_snapshot = ts->Interval_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
119048: 39 f2 cmp %esi,%edx
11904a: 74 10 je 11905c <_Timer_server_Schedule_operation_method+0xe4>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
11904c: 89 ce mov %ecx,%esi
11904e: 29 fe sub %edi,%esi
delta_interval = first_watchdog->delta_interval;
119050: 8b 7a 10 mov 0x10(%edx),%edi
if (delta_interval > delta) {
119053: 39 fe cmp %edi,%esi
119055: 73 39 jae 119090 <_Timer_server_Schedule_operation_method+0x118>
delta_interval -= delta;
119057: 29 f7 sub %esi,%edi
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
119059: 89 7a 10 mov %edi,0x10(%edx)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
11905c: 89 4b 3c mov %ecx,0x3c(%ebx)
_ISR_Enable( level );
11905f: ff 75 e4 pushl -0x1c(%ebp)
119062: 9d popf
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
119063: 83 ec 08 sub $0x8,%esp
119066: 83 c0 10 add $0x10,%eax
119069: 50 push %eax
11906a: 8d 43 30 lea 0x30(%ebx),%eax
11906d: 50 push %eax
11906e: e8 a1 3d 00 00 call 11ce14 <_Watchdog_Insert>
if ( !ts->active ) {
119073: 8a 43 7c mov 0x7c(%ebx),%al
119076: 83 c4 10 add $0x10,%esp
119079: 84 c0 test %al,%al
11907b: 0f 85 3d ff ff ff jne 118fbe <_Timer_server_Schedule_operation_method+0x46>
_Timer_server_Reset_interval_system_watchdog( ts );
119081: 89 d8 mov %ebx,%eax
119083: e8 88 fc ff ff call 118d10 <_Timer_server_Reset_interval_system_watchdog>
119088: e9 31 ff ff ff jmp 118fbe <_Timer_server_Schedule_operation_method+0x46>
11908d: 8d 76 00 lea 0x0(%esi),%esi
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
119090: 31 ff xor %edi,%edi
119092: eb c5 jmp 119059 <_Timer_server_Schedule_operation_method+0xe1>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
119094: 03 7d d4 add -0x2c(%ebp),%edi
delta_interval += delta;
119097: 29 cf sub %ecx,%edi
119099: e9 67 ff ff ff jmp 119005 <_Timer_server_Schedule_operation_method+0x8d>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
11909e: 31 ff xor %edi,%edi <== NOT EXECUTED
1190a0: e9 60 ff ff ff jmp 119005 <_Timer_server_Schedule_operation_method+0x8d><== NOT EXECUTED
0010fbfc <_Timespec_Divide>:
const struct timespec *lhs,
const struct timespec *rhs,
uint32_t *ival_percentage,
uint32_t *fval_percentage
)
{
10fbfc: 55 push %ebp
10fbfd: 89 e5 mov %esp,%ebp
10fbff: 57 push %edi
10fc00: 56 push %esi
10fc01: 53 push %ebx
10fc02: 83 ec 2c sub $0x2c,%esp
10fc05: 8b 45 08 mov 0x8(%ebp),%eax
10fc08: 8b 4d 0c mov 0xc(%ebp),%ecx
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc0b: 8b 38 mov (%eax),%edi
left += lhs->tv_nsec;
10fc0d: 8b 70 04 mov 0x4(%eax),%esi
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc10: bb 00 ca 9a 3b mov $0x3b9aca00,%ebx
10fc15: 8b 01 mov (%ecx),%eax
10fc17: f7 eb imul %ebx
10fc19: 89 45 e0 mov %eax,-0x20(%ebp)
10fc1c: 89 55 e4 mov %edx,-0x1c(%ebp)
right += rhs->tv_nsec;
10fc1f: 8b 41 04 mov 0x4(%ecx),%eax
10fc22: 99 cltd
10fc23: 01 45 e0 add %eax,-0x20(%ebp)
10fc26: 11 55 e4 adc %edx,-0x1c(%ebp)
if ( right == 0 ) {
10fc29: 8b 55 e4 mov -0x1c(%ebp),%edx
10fc2c: 0b 55 e0 or -0x20(%ebp),%edx
10fc2f: 74 73 je 10fca4 <_Timespec_Divide+0xa8>
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc31: 89 f8 mov %edi,%eax
10fc33: f7 eb imul %ebx
10fc35: 89 45 d0 mov %eax,-0x30(%ebp)
10fc38: 89 55 d4 mov %edx,-0x2c(%ebp)
left += lhs->tv_nsec;
10fc3b: 89 f7 mov %esi,%edi
10fc3d: c1 ff 1f sar $0x1f,%edi
10fc40: 01 75 d0 add %esi,-0x30(%ebp)
10fc43: 11 7d d4 adc %edi,-0x2c(%ebp)
* Put it back in the timespec result.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (left * 100000) / right;
10fc46: 69 4d d4 a0 86 01 00 imul $0x186a0,-0x2c(%ebp),%ecx
10fc4d: bb a0 86 01 00 mov $0x186a0,%ebx
10fc52: 8b 45 d0 mov -0x30(%ebp),%eax
10fc55: f7 e3 mul %ebx
10fc57: 8d 34 11 lea (%ecx,%edx,1),%esi
10fc5a: ff 75 e4 pushl -0x1c(%ebp)
10fc5d: ff 75 e0 pushl -0x20(%ebp)
10fc60: 56 push %esi
10fc61: 50 push %eax
10fc62: e8 45 0a 01 00 call 1206ac <__udivdi3>
10fc67: 83 c4 10 add $0x10,%esp
10fc6a: 89 c3 mov %eax,%ebx
10fc6c: 89 d6 mov %edx,%esi
*ival_percentage = answer / 1000;
10fc6e: 6a 00 push $0x0
10fc70: 68 e8 03 00 00 push $0x3e8
10fc75: 52 push %edx
10fc76: 50 push %eax
10fc77: e8 30 0a 01 00 call 1206ac <__udivdi3>
10fc7c: 83 c4 10 add $0x10,%esp
10fc7f: 8b 55 10 mov 0x10(%ebp),%edx
10fc82: 89 02 mov %eax,(%edx)
*fval_percentage = answer % 1000;
10fc84: 6a 00 push $0x0
10fc86: 68 e8 03 00 00 push $0x3e8
10fc8b: 56 push %esi
10fc8c: 53 push %ebx
10fc8d: e8 2a 0b 01 00 call 1207bc <__umoddi3>
10fc92: 83 c4 10 add $0x10,%esp
10fc95: 8b 55 14 mov 0x14(%ebp),%edx
10fc98: 89 02 mov %eax,(%edx)
}
10fc9a: 8d 65 f4 lea -0xc(%ebp),%esp
10fc9d: 5b pop %ebx
10fc9e: 5e pop %esi
10fc9f: 5f pop %edi
10fca0: c9 leave
10fca1: c3 ret
10fca2: 66 90 xchg %ax,%ax
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
right += rhs->tv_nsec;
if ( right == 0 ) {
*ival_percentage = 0;
10fca4: 8b 45 10 mov 0x10(%ebp),%eax
10fca7: c7 00 00 00 00 00 movl $0x0,(%eax)
*fval_percentage = 0;
10fcad: 8b 55 14 mov 0x14(%ebp),%edx
10fcb0: c7 02 00 00 00 00 movl $0x0,(%edx)
answer = (left * 100000) / right;
*ival_percentage = answer / 1000;
*fval_percentage = answer % 1000;
}
10fcb6: 8d 65 f4 lea -0xc(%ebp),%esp
10fcb9: 5b pop %ebx
10fcba: 5e pop %esi
10fcbb: 5f pop %edi
10fcbc: c9 leave
10fcbd: c3 ret
0011f79c <_Timespec_Is_valid>:
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
const struct timespec *time
)
{
11f79c: 55 push %ebp
11f79d: 89 e5 mov %esp,%ebp
11f79f: 8b 45 08 mov 0x8(%ebp),%eax
if ( !time )
11f7a2: 85 c0 test %eax,%eax
11f7a4: 74 1a je 11f7c0 <_Timespec_Is_valid+0x24>
return false;
if ( time->tv_sec < 0 )
11f7a6: 8b 10 mov (%eax),%edx
11f7a8: 85 d2 test %edx,%edx
11f7aa: 78 14 js 11f7c0 <_Timespec_Is_valid+0x24>
return false;
if ( time->tv_nsec < 0 )
11f7ac: 8b 40 04 mov 0x4(%eax),%eax
11f7af: 85 c0 test %eax,%eax
11f7b1: 78 0d js 11f7c0 <_Timespec_Is_valid+0x24>
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
11f7b3: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
11f7b8: 0f 96 c0 setbe %al
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
11f7bb: c9 leave
11f7bc: c3 ret
11f7bd: 8d 76 00 lea 0x0(%esi),%esi
if ( time->tv_sec < 0 )
return false;
if ( time->tv_nsec < 0 )
return false;
11f7c0: 31 c0 xor %eax,%eax
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
11f7c2: c9 leave
11f7c3: c3 ret
001119c4 <_Timespec_To_ticks>:
*/
uint32_t _Timespec_To_ticks(
const struct timespec *time
)
{
1119c4: 55 push %ebp
1119c5: 89 e5 mov %esp,%ebp
1119c7: 56 push %esi
1119c8: 53 push %ebx
1119c9: 8b 5d 08 mov 0x8(%ebp),%ebx
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
1119cc: 8b 33 mov (%ebx),%esi
1119ce: 85 f6 test %esi,%esi
1119d0: 75 07 jne 1119d9 <_Timespec_To_ticks+0x15>
1119d2: 8b 43 04 mov 0x4(%ebx),%eax
1119d5: 85 c0 test %eax,%eax
1119d7: 74 37 je 111a10 <_Timespec_To_ticks+0x4c>
return 0;
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
1119d9: e8 7a 17 00 00 call 113158 <TOD_TICKS_PER_SECOND_method>
1119de: 89 c1 mov %eax,%ecx
1119e0: 0f af ce imul %esi,%ecx
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
1119e3: a1 8c 32 12 00 mov 0x12328c,%eax
1119e8: 8d 04 80 lea (%eax,%eax,4),%eax
1119eb: 8d 04 80 lea (%eax,%eax,4),%eax
1119ee: 8d 34 80 lea (%eax,%eax,4),%esi
1119f1: c1 e6 03 shl $0x3,%esi
1119f4: 8b 43 04 mov 0x4(%ebx),%eax
1119f7: 31 d2 xor %edx,%edx
1119f9: f7 f6 div %esi
if (ticks)
1119fb: 01 c8 add %ecx,%eax
1119fd: 74 05 je 111a04 <_Timespec_To_ticks+0x40>
return ticks;
return 1;
}
1119ff: 5b pop %ebx
111a00: 5e pop %esi
111a01: c9 leave
111a02: c3 ret
111a03: 90 nop
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
if (ticks)
return ticks;
return 1;
111a04: b8 01 00 00 00 mov $0x1,%eax
}
111a09: 5b pop %ebx
111a0a: 5e pop %esi
111a0b: c9 leave
111a0c: c3 ret
111a0d: 8d 76 00 lea 0x0(%esi),%esi
)
{
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
return 0;
111a10: 31 c0 xor %eax,%eax
if (ticks)
return ticks;
return 1;
}
111a12: 5b pop %ebx
111a13: 5e pop %esi
111a14: c9 leave
111a15: c3 ret
0010e59c <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10e59c: 55 push %ebp
10e59d: 89 e5 mov %esp,%ebp
10e59f: 57 push %edi
10e5a0: 56 push %esi
10e5a1: 53 push %ebx
10e5a2: 83 ec 1c sub $0x1c,%esp
10e5a5: 8b 75 08 mov 0x8(%ebp),%esi
10e5a8: 8b 7d 10 mov 0x10(%ebp),%edi
10e5ab: 8a 45 0c mov 0xc(%ebp),%al
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e5ae: 8b 1d b4 77 12 00 mov 0x1277b4,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5b4: 81 fb ac 77 12 00 cmp $0x1277ac,%ebx
10e5ba: 74 25 je 10e5e1 <_User_extensions_Fatal+0x45><== NEVER TAKEN
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
10e5bc: 0f b6 c0 movzbl %al,%eax
10e5bf: 89 45 e4 mov %eax,-0x1c(%ebp)
10e5c2: 66 90 xchg %ax,%ax
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
10e5c4: 8b 43 30 mov 0x30(%ebx),%eax
10e5c7: 85 c0 test %eax,%eax
10e5c9: 74 0b je 10e5d6 <_User_extensions_Fatal+0x3a>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
10e5cb: 52 push %edx
10e5cc: 57 push %edi
10e5cd: ff 75 e4 pushl -0x1c(%ebp)
10e5d0: 56 push %esi
10e5d1: ff d0 call *%eax
10e5d3: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
10e5d6: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5d9: 81 fb ac 77 12 00 cmp $0x1277ac,%ebx
10e5df: 75 e3 jne 10e5c4 <_User_extensions_Fatal+0x28><== ALWAYS TAKEN
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e5e1: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10e5e4: 5b pop %ebx <== NOT EXECUTED
10e5e5: 5e pop %esi <== NOT EXECUTED
10e5e6: 5f pop %edi <== NOT EXECUTED
10e5e7: c9 leave <== NOT EXECUTED
10e5e8: c3 ret <== NOT EXECUTED
0010e460 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
10e460: 55 push %ebp
10e461: 89 e5 mov %esp,%ebp
10e463: 57 push %edi
10e464: 56 push %esi
10e465: 53 push %ebx
10e466: 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;
10e469: a1 bc 32 12 00 mov 0x1232bc,%eax
10e46e: 89 45 dc mov %eax,-0x24(%ebp)
initial_extensions = Configuration.User_extension_table;
10e471: 8b 35 c0 32 12 00 mov 0x1232c0,%esi
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10e477: c7 05 ac 77 12 00 b0 movl $0x1277b0,0x1277ac
10e47e: 77 12 00
head->previous = NULL;
10e481: c7 05 b0 77 12 00 00 movl $0x0,0x1277b0
10e488: 00 00 00
tail->previous = head;
10e48b: c7 05 b4 77 12 00 ac movl $0x1277ac,0x1277b4
10e492: 77 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10e495: c7 05 54 75 12 00 58 movl $0x127558,0x127554
10e49c: 75 12 00
head->previous = NULL;
10e49f: c7 05 58 75 12 00 00 movl $0x0,0x127558
10e4a6: 00 00 00
tail->previous = head;
10e4a9: c7 05 5c 75 12 00 54 movl $0x127554,0x12755c
10e4b0: 75 12 00
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
10e4b3: 85 f6 test %esi,%esi
10e4b5: 74 64 je 10e51b <_User_extensions_Handler_initialization+0xbb><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
10e4b7: 89 c2 mov %eax,%edx
10e4b9: 8d 04 40 lea (%eax,%eax,2),%eax
10e4bc: 8d 0c 82 lea (%edx,%eax,4),%ecx
10e4bf: c1 e1 02 shl $0x2,%ecx
10e4c2: 83 ec 0c sub $0xc,%esp
10e4c5: 51 push %ecx
10e4c6: 89 4d d8 mov %ecx,-0x28(%ebp)
10e4c9: e8 c6 04 00 00 call 10e994 <_Workspace_Allocate_or_fatal_error>
10e4ce: 89 c3 mov %eax,%ebx
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
10e4d0: 31 c0 xor %eax,%eax
10e4d2: 8b 4d d8 mov -0x28(%ebp),%ecx
10e4d5: 89 df mov %ebx,%edi
10e4d7: f3 aa rep stos %al,%es:(%edi)
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10e4d9: 83 c4 10 add $0x10,%esp
10e4dc: 8b 45 dc mov -0x24(%ebp),%eax
10e4df: 85 c0 test %eax,%eax
10e4e1: 74 38 je 10e51b <_User_extensions_Handler_initialization+0xbb><== NEVER TAKEN
10e4e3: 89 75 e4 mov %esi,-0x1c(%ebp)
10e4e6: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
10e4ed: 8d 76 00 lea 0x0(%esi),%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;
10e4f0: 8d 7b 14 lea 0x14(%ebx),%edi
10e4f3: 8b 75 e4 mov -0x1c(%ebp),%esi
10e4f6: b9 08 00 00 00 mov $0x8,%ecx
10e4fb: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_User_extensions_Add_set( extension );
10e4fd: 83 ec 0c sub $0xc,%esp
10e500: 53 push %ebx
10e501: e8 12 35 00 00 call 111a18 <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
10e506: 83 c3 34 add $0x34,%ebx
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10e509: ff 45 e0 incl -0x20(%ebp)
10e50c: 83 45 e4 20 addl $0x20,-0x1c(%ebp)
10e510: 83 c4 10 add $0x10,%esp
10e513: 8b 45 e0 mov -0x20(%ebp),%eax
10e516: 39 45 dc cmp %eax,-0x24(%ebp)
10e519: 77 d5 ja 10e4f0 <_User_extensions_Handler_initialization+0x90>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
10e51b: 8d 65 f4 lea -0xc(%ebp),%esp
10e51e: 5b pop %ebx
10e51f: 5e pop %esi
10e520: 5f pop %edi
10e521: c9 leave
10e522: c3 ret
0010f9e4 <_User_extensions_Remove_set>:
#include <rtems/score/userext.h>
void _User_extensions_Remove_set (
User_extensions_Control *the_extension
)
{
10f9e4: 55 push %ebp
10f9e5: 89 e5 mov %esp,%ebp
10f9e7: 53 push %ebx
10f9e8: 83 ec 10 sub $0x10,%esp
10f9eb: 8b 5d 08 mov 0x8(%ebp),%ebx
_Chain_Extract( &the_extension->Node );
10f9ee: 53 push %ebx
10f9ef: e8 a4 d9 ff ff call 10d398 <_Chain_Extract>
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
10f9f4: 83 c4 10 add $0x10,%esp
10f9f7: 8b 43 24 mov 0x24(%ebx),%eax
10f9fa: 85 c0 test %eax,%eax
10f9fc: 74 12 je 10fa10 <_User_extensions_Remove_set+0x2c>
_Chain_Extract( &the_extension->Switch.Node );
10f9fe: 83 c3 08 add $0x8,%ebx
10fa01: 89 5d 08 mov %ebx,0x8(%ebp)
}
10fa04: 8b 5d fc mov -0x4(%ebp),%ebx
10fa07: c9 leave
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
_Chain_Extract( &the_extension->Switch.Node );
10fa08: e9 8b d9 ff ff jmp 10d398 <_Chain_Extract>
10fa0d: 8d 76 00 lea 0x0(%esi),%esi
}
10fa10: 8b 5d fc mov -0x4(%ebp),%ebx
10fa13: c9 leave
10fa14: c3 ret
0010e524 <_User_extensions_Thread_begin>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
10e524: 55 push %ebp
10e525: 89 e5 mov %esp,%ebp
10e527: 56 push %esi
10e528: 53 push %ebx
10e529: 8b 75 08 mov 0x8(%ebp),%esi
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e52c: 8b 1d ac 77 12 00 mov 0x1277ac,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e532: 81 fb b0 77 12 00 cmp $0x1277b0,%ebx
10e538: 74 1c je 10e556 <_User_extensions_Thread_begin+0x32><== NEVER TAKEN
10e53a: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
10e53c: 8b 43 28 mov 0x28(%ebx),%eax
10e53f: 85 c0 test %eax,%eax
10e541: 74 09 je 10e54c <_User_extensions_Thread_begin+0x28>
(*the_extension->Callouts.thread_begin)( executing );
10e543: 83 ec 0c sub $0xc,%esp
10e546: 56 push %esi
10e547: ff d0 call *%eax
10e549: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10e54c: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e54e: 81 fb b0 77 12 00 cmp $0x1277b0,%ebx
10e554: 75 e6 jne 10e53c <_User_extensions_Thread_begin+0x18>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
(*the_extension->Callouts.thread_begin)( executing );
}
}
10e556: 8d 65 f8 lea -0x8(%ebp),%esp
10e559: 5b pop %ebx
10e55a: 5e pop %esi
10e55b: c9 leave
10e55c: c3 ret
0010e5ec <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
10e5ec: 55 push %ebp
10e5ed: 89 e5 mov %esp,%ebp
10e5ef: 56 push %esi
10e5f0: 53 push %ebx
10e5f1: 8b 75 08 mov 0x8(%ebp),%esi
return false;
}
}
return true;
}
10e5f4: 8b 1d ac 77 12 00 mov 0x1277ac,%ebx
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
10e5fa: 81 fb b0 77 12 00 cmp $0x1277b0,%ebx
10e600: 74 26 je 10e628 <_User_extensions_Thread_create+0x3c><== NEVER TAKEN
10e602: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
10e604: 8b 43 14 mov 0x14(%ebx),%eax
10e607: 85 c0 test %eax,%eax
10e609: 74 13 je 10e61e <_User_extensions_Thread_create+0x32>
status = (*the_extension->Callouts.thread_create)(
10e60b: 83 ec 08 sub $0x8,%esp
10e60e: 56 push %esi
10e60f: ff 35 38 7b 12 00 pushl 0x127b38
10e615: ff d0 call *%eax
_Thread_Executing,
the_thread
);
if ( !status )
10e617: 83 c4 10 add $0x10,%esp
10e61a: 84 c0 test %al,%al
10e61c: 74 16 je 10e634 <_User_extensions_Thread_create+0x48>
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10e61e: 8b 1b mov (%ebx),%ebx
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
10e620: 81 fb b0 77 12 00 cmp $0x1277b0,%ebx
10e626: 75 dc jne 10e604 <_User_extensions_Thread_create+0x18>
if ( !status )
return false;
}
}
return true;
10e628: b0 01 mov $0x1,%al
}
10e62a: 8d 65 f8 lea -0x8(%ebp),%esp
10e62d: 5b pop %ebx
10e62e: 5e pop %esi
10e62f: c9 leave
10e630: c3 ret
10e631: 8d 76 00 lea 0x0(%esi),%esi
status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
if ( !status )
return false;
10e634: 31 c0 xor %eax,%eax
}
}
return true;
}
10e636: 8d 65 f8 lea -0x8(%ebp),%esp
10e639: 5b pop %ebx
10e63a: 5e pop %esi
10e63b: c9 leave
10e63c: c3 ret
0010e640 <_User_extensions_Thread_delete>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
10e640: 55 push %ebp
10e641: 89 e5 mov %esp,%ebp
10e643: 56 push %esi
10e644: 53 push %ebx
10e645: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
10e648: 8b 1d b4 77 12 00 mov 0x1277b4,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e64e: 81 fb ac 77 12 00 cmp $0x1277ac,%ebx
10e654: 74 23 je 10e679 <_User_extensions_Thread_delete+0x39><== NEVER TAKEN
10e656: 66 90 xchg %ax,%ax
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
10e658: 8b 43 20 mov 0x20(%ebx),%eax
10e65b: 85 c0 test %eax,%eax
10e65d: 74 0f je 10e66e <_User_extensions_Thread_delete+0x2e>
(*the_extension->Callouts.thread_delete)(
10e65f: 83 ec 08 sub $0x8,%esp
10e662: 56 push %esi
10e663: ff 35 38 7b 12 00 pushl 0x127b38
10e669: ff d0 call *%eax
10e66b: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
10e66e: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e671: 81 fb ac 77 12 00 cmp $0x1277ac,%ebx
10e677: 75 df jne 10e658 <_User_extensions_Thread_delete+0x18>
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
10e679: 8d 65 f8 lea -0x8(%ebp),%esp
10e67c: 5b pop %ebx
10e67d: 5e pop %esi
10e67e: c9 leave
10e67f: c3 ret
0010e560 <_User_extensions_Thread_exitted>:
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
10e560: 55 push %ebp
10e561: 89 e5 mov %esp,%ebp
10e563: 56 push %esi
10e564: 53 push %ebx
10e565: 8b 75 08 mov 0x8(%ebp),%esi
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
10e568: 8b 1d b4 77 12 00 mov 0x1277b4,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e56e: 81 fb ac 77 12 00 cmp $0x1277ac,%ebx
10e574: 74 1d je 10e593 <_User_extensions_Thread_exitted+0x33><== NEVER TAKEN
10e576: 66 90 xchg %ax,%ax
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
10e578: 8b 43 2c mov 0x2c(%ebx),%eax
10e57b: 85 c0 test %eax,%eax
10e57d: 74 09 je 10e588 <_User_extensions_Thread_exitted+0x28>
(*the_extension->Callouts.thread_exitted)( executing );
10e57f: 83 ec 0c sub $0xc,%esp
10e582: 56 push %esi
10e583: ff d0 call *%eax
10e585: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
10e588: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e58b: 81 fb ac 77 12 00 cmp $0x1277ac,%ebx
10e591: 75 e5 jne 10e578 <_User_extensions_Thread_exitted+0x18>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
(*the_extension->Callouts.thread_exitted)( executing );
}
}
10e593: 8d 65 f8 lea -0x8(%ebp),%esp
10e596: 5b pop %ebx
10e597: 5e pop %esi
10e598: c9 leave
10e599: c3 ret
0010f230 <_User_extensions_Thread_restart>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
10f230: 55 push %ebp
10f231: 89 e5 mov %esp,%ebp
10f233: 56 push %esi
10f234: 53 push %ebx
10f235: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
10f238: 8b 1d ac 9a 12 00 mov 0x129aac,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10f23e: 81 fb b0 9a 12 00 cmp $0x129ab0,%ebx
10f244: 74 22 je 10f268 <_User_extensions_Thread_restart+0x38><== NEVER TAKEN
10f246: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
10f248: 8b 43 1c mov 0x1c(%ebx),%eax
10f24b: 85 c0 test %eax,%eax
10f24d: 74 0f je 10f25e <_User_extensions_Thread_restart+0x2e>
(*the_extension->Callouts.thread_restart)(
10f24f: 83 ec 08 sub $0x8,%esp
10f252: 56 push %esi
10f253: ff 35 38 9e 12 00 pushl 0x129e38
10f259: ff d0 call *%eax
10f25b: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10f25e: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10f260: 81 fb b0 9a 12 00 cmp $0x129ab0,%ebx
10f266: 75 e0 jne 10f248 <_User_extensions_Thread_restart+0x18>
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
10f268: 8d 65 f8 lea -0x8(%ebp),%esp
10f26b: 5b pop %ebx
10f26c: 5e pop %esi
10f26d: c9 leave
10f26e: c3 ret
0010e680 <_User_extensions_Thread_start>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
10e680: 55 push %ebp
10e681: 89 e5 mov %esp,%ebp
10e683: 56 push %esi
10e684: 53 push %ebx
10e685: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
10e688: 8b 1d ac 77 12 00 mov 0x1277ac,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e68e: 81 fb b0 77 12 00 cmp $0x1277b0,%ebx
10e694: 74 22 je 10e6b8 <_User_extensions_Thread_start+0x38><== NEVER TAKEN
10e696: 66 90 xchg %ax,%ax
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
10e698: 8b 43 18 mov 0x18(%ebx),%eax
10e69b: 85 c0 test %eax,%eax
10e69d: 74 0f je 10e6ae <_User_extensions_Thread_start+0x2e>
(*the_extension->Callouts.thread_start)(
10e69f: 83 ec 08 sub $0x8,%esp
10e6a2: 56 push %esi
10e6a3: ff 35 38 7b 12 00 pushl 0x127b38
10e6a9: ff d0 call *%eax
10e6ab: 83 c4 10 add $0x10,%esp
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
10e6ae: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e6b0: 81 fb b0 77 12 00 cmp $0x1277b0,%ebx
10e6b6: 75 e0 jne 10e698 <_User_extensions_Thread_start+0x18>
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
10e6b8: 8d 65 f8 lea -0x8(%ebp),%esp
10e6bb: 5b pop %ebx
10e6bc: 5e pop %esi
10e6bd: c9 leave
10e6be: c3 ret
0010e6c0 <_User_extensions_Thread_switch>:
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
10e6c0: 55 push %ebp
10e6c1: 89 e5 mov %esp,%ebp
10e6c3: 57 push %edi
10e6c4: 56 push %esi
10e6c5: 53 push %ebx
10e6c6: 83 ec 0c sub $0xc,%esp
10e6c9: 8b 7d 08 mov 0x8(%ebp),%edi
10e6cc: 8b 75 0c mov 0xc(%ebp),%esi
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
10e6cf: 8b 1d 54 75 12 00 mov 0x127554,%ebx
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
10e6d5: 81 fb 58 75 12 00 cmp $0x127558,%ebx
10e6db: 74 18 je 10e6f5 <_User_extensions_Thread_switch+0x35><== NEVER TAKEN
10e6dd: 8d 76 00 lea 0x0(%esi),%esi
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
10e6e0: 83 ec 08 sub $0x8,%esp
10e6e3: 56 push %esi
10e6e4: 57 push %edi
10e6e5: ff 53 08 call *0x8(%ebx)
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
10e6e8: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
10e6ea: 83 c4 10 add $0x10,%esp
10e6ed: 81 fb 58 75 12 00 cmp $0x127558,%ebx
10e6f3: 75 eb jne 10e6e0 <_User_extensions_Thread_switch+0x20>
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
10e6f5: 8d 65 f4 lea -0xc(%ebp),%esp
10e6f8: 5b pop %ebx
10e6f9: 5e pop %esi
10e6fa: 5f pop %edi
10e6fb: c9 leave
10e6fc: c3 ret
0010ffdc <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
10ffdc: 55 push %ebp
10ffdd: 89 e5 mov %esp,%ebp
10ffdf: 57 push %edi
10ffe0: 56 push %esi
10ffe1: 53 push %ebx
10ffe2: 83 ec 1c sub $0x1c,%esp
10ffe5: 8b 75 08 mov 0x8(%ebp),%esi
10ffe8: 8b 4d 0c mov 0xc(%ebp),%ecx
10ffeb: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
10ffee: 9c pushf
10ffef: fa cli
10fff0: 58 pop %eax
}
}
_ISR_Enable( level );
}
10fff1: 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 );
10fff3: 8d 7e 04 lea 0x4(%esi),%edi
10fff6: 89 7d e4 mov %edi,-0x1c(%ebp)
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
10fff9: 39 fa cmp %edi,%edx
10fffb: 74 3d je 11003a <_Watchdog_Adjust+0x5e>
switch ( direction ) {
10fffd: 85 c9 test %ecx,%ecx
10ffff: 75 43 jne 110044 <_Watchdog_Adjust+0x68>
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
110001: 85 db test %ebx,%ebx
110003: 74 35 je 11003a <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
110005: 8b 7a 10 mov 0x10(%edx),%edi
110008: 39 fb cmp %edi,%ebx
11000a: 73 0f jae 11001b <_Watchdog_Adjust+0x3f> <== ALWAYS TAKEN
11000c: eb 3e jmp 11004c <_Watchdog_Adjust+0x70> <== NOT EXECUTED
11000e: 66 90 xchg %ax,%ax <== NOT EXECUTED
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
110010: 29 fb sub %edi,%ebx
110012: 74 26 je 11003a <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
110014: 8b 7a 10 mov 0x10(%edx),%edi
110017: 39 df cmp %ebx,%edi
110019: 77 31 ja 11004c <_Watchdog_Adjust+0x70>
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
11001b: c7 42 10 01 00 00 00 movl $0x1,0x10(%edx)
_ISR_Enable( level );
110022: 50 push %eax
110023: 9d popf
_Watchdog_Tickle( header );
110024: 83 ec 0c sub $0xc,%esp
110027: 56 push %esi
110028: e8 cb 01 00 00 call 1101f8 <_Watchdog_Tickle>
_ISR_Disable( level );
11002d: 9c pushf
11002e: fa cli
11002f: 58 pop %eax
}
}
_ISR_Enable( level );
}
110030: 8b 16 mov (%esi),%edx
_Watchdog_Tickle( header );
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
110032: 83 c4 10 add $0x10,%esp
110035: 39 55 e4 cmp %edx,-0x1c(%ebp)
110038: 75 d6 jne 110010 <_Watchdog_Adjust+0x34>
}
break;
}
}
_ISR_Enable( level );
11003a: 50 push %eax
11003b: 9d popf
}
11003c: 8d 65 f4 lea -0xc(%ebp),%esp
11003f: 5b pop %ebx
110040: 5e pop %esi
110041: 5f pop %edi
110042: c9 leave
110043: c3 ret
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
110044: 49 dec %ecx
110045: 75 f3 jne 11003a <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
110047: 01 5a 10 add %ebx,0x10(%edx)
break;
11004a: eb ee jmp 11003a <_Watchdog_Adjust+0x5e>
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
11004c: 29 df sub %ebx,%edi
11004e: 89 7a 10 mov %edi,0x10(%edx)
break;
110051: eb e7 jmp 11003a <_Watchdog_Adjust+0x5e>
0010e700 <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
10e700: 55 push %ebp
10e701: 89 e5 mov %esp,%ebp
10e703: 57 push %edi
10e704: 56 push %esi
10e705: 53 push %ebx
10e706: 83 ec 04 sub $0x4,%esp
10e709: 8b 5d 0c mov 0xc(%ebp),%ebx
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
10e70c: 8b 3d 34 7b 12 00 mov 0x127b34,%edi
_ISR_Disable( level );
10e712: 9c pushf
10e713: fa cli
10e714: 8f 45 f0 popl -0x10(%ebp)
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
10e717: 8b 43 08 mov 0x8(%ebx),%eax
10e71a: 85 c0 test %eax,%eax
10e71c: 0f 85 9e 00 00 00 jne 10e7c0 <_Watchdog_Insert+0xc0>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
10e722: c7 43 08 01 00 00 00 movl $0x1,0x8(%ebx)
_Watchdog_Sync_count++;
10e729: a1 c0 76 12 00 mov 0x1276c0,%eax
10e72e: 40 inc %eax
10e72f: a3 c0 76 12 00 mov %eax,0x1276c0
restart:
delta_interval = the_watchdog->initial;
10e734: 8b 43 0c mov 0xc(%ebx),%eax
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
10e737: 8b 4d 08 mov 0x8(%ebp),%ecx
10e73a: 8b 11 mov (%ecx),%edx
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
10e73c: 85 c0 test %eax,%eax
10e73e: 74 5d je 10e79d <_Watchdog_Insert+0x9d>
10e740: 8b 32 mov (%edx),%esi
10e742: 85 f6 test %esi,%esi
10e744: 74 57 je 10e79d <_Watchdog_Insert+0x9d>
break;
if ( delta_interval < after->delta_interval ) {
10e746: 8b 4a 10 mov 0x10(%edx),%ecx
10e749: 39 c8 cmp %ecx,%eax
10e74b: 73 22 jae 10e76f <_Watchdog_Insert+0x6f>
10e74d: eb 49 jmp 10e798 <_Watchdog_Insert+0x98>
10e74f: 90 nop
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
10e750: 8b 35 40 76 12 00 mov 0x127640,%esi
10e756: 39 f7 cmp %esi,%edi
10e758: 72 72 jb 10e7cc <_Watchdog_Insert+0xcc>
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
10e75a: 29 c8 sub %ecx,%eax
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
10e75c: 8b 12 mov (%edx),%edx
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
10e75e: 85 c0 test %eax,%eax
10e760: 74 3b je 10e79d <_Watchdog_Insert+0x9d>
10e762: 8b 0a mov (%edx),%ecx
10e764: 85 c9 test %ecx,%ecx
10e766: 74 35 je 10e79d <_Watchdog_Insert+0x9d>
break;
if ( delta_interval < after->delta_interval ) {
10e768: 8b 4a 10 mov 0x10(%edx),%ecx
10e76b: 39 c1 cmp %eax,%ecx
10e76d: 77 29 ja 10e798 <_Watchdog_Insert+0x98>
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
10e76f: ff 75 f0 pushl -0x10(%ebp)
10e772: 9d popf
10e773: fa cli
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
10e774: 83 7b 08 01 cmpl $0x1,0x8(%ebx)
10e778: 74 d6 je 10e750 <_Watchdog_Insert+0x50>
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
10e77a: 89 3d 40 76 12 00 mov %edi,0x127640
_Watchdog_Sync_count--;
10e780: a1 c0 76 12 00 mov 0x1276c0,%eax
10e785: 48 dec %eax
10e786: a3 c0 76 12 00 mov %eax,0x1276c0
_ISR_Enable( level );
10e78b: ff 75 f0 pushl -0x10(%ebp)
10e78e: 9d popf
}
10e78f: 58 pop %eax
10e790: 5b pop %ebx
10e791: 5e pop %esi
10e792: 5f pop %edi
10e793: c9 leave
10e794: c3 ret
10e795: 8d 76 00 lea 0x0(%esi),%esi
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
break;
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
10e798: 29 c1 sub %eax,%ecx
10e79a: 89 4a 10 mov %ecx,0x10(%edx)
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
10e79d: c7 43 08 02 00 00 00 movl $0x2,0x8(%ebx)
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
10e7a4: 89 43 10 mov %eax,0x10(%ebx)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
10e7a7: 8b 42 04 mov 0x4(%edx),%eax
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
10e7aa: 89 43 04 mov %eax,0x4(%ebx)
before_node = after_node->next;
10e7ad: 8b 10 mov (%eax),%edx
after_node->next = the_node;
10e7af: 89 18 mov %ebx,(%eax)
the_node->next = before_node;
10e7b1: 89 13 mov %edx,(%ebx)
before_node->previous = the_node;
10e7b3: 89 5a 04 mov %ebx,0x4(%edx)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
10e7b6: a1 c4 76 12 00 mov 0x1276c4,%eax
10e7bb: 89 43 14 mov %eax,0x14(%ebx)
10e7be: eb ba jmp 10e77a <_Watchdog_Insert+0x7a>
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
10e7c0: ff 75 f0 pushl -0x10(%ebp)
10e7c3: 9d popf
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
10e7c4: 58 pop %eax
10e7c5: 5b pop %ebx
10e7c6: 5e pop %esi
10e7c7: 5f pop %edi
10e7c8: c9 leave
10e7c9: c3 ret
10e7ca: 66 90 xchg %ax,%ax
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
_Watchdog_Sync_level = insert_isr_nest_level;
10e7cc: 89 3d 40 76 12 00 mov %edi,0x127640
goto restart;
10e7d2: e9 5d ff ff ff jmp 10e734 <_Watchdog_Insert+0x34>
0010e838 <_Watchdog_Remove>:
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
10e838: 55 push %ebp
10e839: 89 e5 mov %esp,%ebp
10e83b: 56 push %esi
10e83c: 53 push %ebx
10e83d: 8b 55 08 mov 0x8(%ebp),%edx
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
10e840: 9c pushf
10e841: fa cli
10e842: 59 pop %ecx
previous_state = the_watchdog->state;
10e843: 8b 42 08 mov 0x8(%edx),%eax
switch ( previous_state ) {
10e846: 83 f8 01 cmp $0x1,%eax
10e849: 74 4d je 10e898 <_Watchdog_Remove+0x60>
10e84b: 73 0f jae 10e85c <_Watchdog_Remove+0x24>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
10e84d: 8b 1d c4 76 12 00 mov 0x1276c4,%ebx
10e853: 89 5a 18 mov %ebx,0x18(%edx)
_ISR_Enable( level );
10e856: 51 push %ecx
10e857: 9d popf
return( previous_state );
}
10e858: 5b pop %ebx
10e859: 5e pop %esi
10e85a: c9 leave
10e85b: c3 ret
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
10e85c: 83 f8 03 cmp $0x3,%eax
10e85f: 77 ec ja 10e84d <_Watchdog_Remove+0x15> <== NEVER TAKEN
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
10e861: 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 );
}
10e868: 8b 1a mov (%edx),%ebx
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
10e86a: 8b 33 mov (%ebx),%esi
10e86c: 85 f6 test %esi,%esi
10e86e: 74 06 je 10e876 <_Watchdog_Remove+0x3e>
next_watchdog->delta_interval += the_watchdog->delta_interval;
10e870: 8b 72 10 mov 0x10(%edx),%esi
10e873: 01 73 10 add %esi,0x10(%ebx)
if ( _Watchdog_Sync_count )
10e876: 8b 35 c0 76 12 00 mov 0x1276c0,%esi
10e87c: 85 f6 test %esi,%esi
10e87e: 74 0c je 10e88c <_Watchdog_Remove+0x54>
_Watchdog_Sync_level = _ISR_Nest_level;
10e880: 8b 35 34 7b 12 00 mov 0x127b34,%esi
10e886: 89 35 40 76 12 00 mov %esi,0x127640
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
10e88c: 8b 72 04 mov 0x4(%edx),%esi
next->previous = previous;
10e88f: 89 73 04 mov %esi,0x4(%ebx)
previous->next = next;
10e892: 89 1e mov %ebx,(%esi)
10e894: eb b7 jmp 10e84d <_Watchdog_Remove+0x15>
10e896: 66 90 xchg %ax,%ax
/*
* 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;
10e898: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
break;
10e89f: eb ac jmp 10e84d <_Watchdog_Remove+0x15>
0010fbd8 <_Watchdog_Report>:
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
10fbd8: 55 push %ebp
10fbd9: 89 e5 mov %esp,%ebp
10fbdb: 57 push %edi
10fbdc: 56 push %esi
10fbdd: 53 push %ebx
10fbde: 83 ec 2c sub $0x2c,%esp
10fbe1: 8b 55 08 mov 0x8(%ebp),%edx
10fbe4: 8b 45 0c mov 0xc(%ebp),%eax
printk(
10fbe7: 8b 78 24 mov 0x24(%eax),%edi
10fbea: 8b 70 20 mov 0x20(%eax),%esi
10fbed: 8b 58 1c mov 0x1c(%eax),%ebx
10fbf0: 8b 48 0c mov 0xc(%eax),%ecx
10fbf3: 89 4d d4 mov %ecx,-0x2c(%ebp)
10fbf6: 8b 48 10 mov 0x10(%eax),%ecx
10fbf9: 89 4d e4 mov %ecx,-0x1c(%ebp)
10fbfc: 85 d2 test %edx,%edx
10fbfe: 74 2c je 10fc2c <_Watchdog_Report+0x54>
10fc00: b9 a3 2c 12 00 mov $0x122ca3,%ecx
10fc05: 83 ec 0c sub $0xc,%esp
10fc08: 57 push %edi
10fc09: 56 push %esi
10fc0a: 53 push %ebx
10fc0b: 50 push %eax
10fc0c: ff 75 d4 pushl -0x2c(%ebp)
10fc0f: ff 75 e4 pushl -0x1c(%ebp)
10fc12: 51 push %ecx
10fc13: 52 push %edx
10fc14: 68 06 37 12 00 push $0x123706
10fc19: e8 66 9e ff ff call 109a84 <printk>
10fc1e: 83 c4 30 add $0x30,%esp
watch,
watch->routine,
watch->id,
watch->user_data
);
}
10fc21: 8d 65 f4 lea -0xc(%ebp),%esp
10fc24: 5b pop %ebx
10fc25: 5e pop %esi
10fc26: 5f pop %edi
10fc27: c9 leave
10fc28: c3 ret
10fc29: 8d 76 00 lea 0x0(%esi),%esi
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
printk(
10fc2c: b9 69 35 12 00 mov $0x123569,%ecx
10fc31: 89 ca mov %ecx,%edx
10fc33: eb d0 jmp 10fc05 <_Watchdog_Report+0x2d>
0010fb68 <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
10fb68: 55 push %ebp
10fb69: 89 e5 mov %esp,%ebp
10fb6b: 57 push %edi
10fb6c: 56 push %esi
10fb6d: 53 push %ebx
10fb6e: 83 ec 20 sub $0x20,%esp
10fb71: 8b 7d 08 mov 0x8(%ebp),%edi
10fb74: 8b 75 0c mov 0xc(%ebp),%esi
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
10fb77: 9c pushf
10fb78: fa cli
10fb79: 8f 45 e4 popl -0x1c(%ebp)
printk( "Watchdog Chain: %s %p\n", name, header );
10fb7c: 56 push %esi
10fb7d: 57 push %edi
10fb7e: 68 d0 36 12 00 push $0x1236d0
10fb83: e8 fc 9e ff ff call 109a84 <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
10fb88: 8b 1e mov (%esi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10fb8a: 83 c6 04 add $0x4,%esi
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
10fb8d: 83 c4 10 add $0x10,%esp
10fb90: 39 f3 cmp %esi,%ebx
10fb92: 74 31 je 10fbc5 <_Watchdog_Report_chain+0x5d>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
10fb94: 83 ec 08 sub $0x8,%esp
10fb97: 53 push %ebx
10fb98: 6a 00 push $0x0
10fb9a: e8 39 00 00 00 call 10fbd8 <_Watchdog_Report>
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
node != _Chain_Tail(header) ;
node = node->next )
10fb9f: 8b 1b mov (%ebx),%ebx
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
10fba1: 83 c4 10 add $0x10,%esp
10fba4: 39 f3 cmp %esi,%ebx
10fba6: 75 ec jne 10fb94 <_Watchdog_Report_chain+0x2c><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
10fba8: 83 ec 08 sub $0x8,%esp
10fbab: 57 push %edi
10fbac: 68 e7 36 12 00 push $0x1236e7
10fbb1: e8 ce 9e ff ff call 109a84 <printk>
10fbb6: 83 c4 10 add $0x10,%esp
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
10fbb9: ff 75 e4 pushl -0x1c(%ebp)
10fbbc: 9d popf
}
10fbbd: 8d 65 f4 lea -0xc(%ebp),%esp
10fbc0: 5b pop %ebx
10fbc1: 5e pop %esi
10fbc2: 5f pop %edi
10fbc3: c9 leave
10fbc4: c3 ret
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
10fbc5: 83 ec 0c sub $0xc,%esp
10fbc8: 68 f6 36 12 00 push $0x1236f6
10fbcd: e8 b2 9e ff ff call 109a84 <printk>
10fbd2: 83 c4 10 add $0x10,%esp
10fbd5: eb e2 jmp 10fbb9 <_Watchdog_Report_chain+0x51>
0010e910 <_Workspace_Handler_initialization>:
/*
* _Workspace_Handler_initialization
*/
void _Workspace_Handler_initialization(void)
{
10e910: 55 push %ebp
10e911: 89 e5 mov %esp,%ebp
10e913: 57 push %edi
10e914: 53 push %ebx
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
10e915: 8b 1d 80 32 12 00 mov 0x123280,%ebx
uintptr_t size = Configuration.work_space_size;
10e91b: 8b 15 84 32 12 00 mov 0x123284,%edx
if ( Configuration.do_zero_of_workspace )
10e921: 80 3d ac 32 12 00 00 cmpb $0x0,0x1232ac
10e928: 75 1e jne 10e948 <_Workspace_Handler_initialization+0x38>
memset( starting_address, 0, size );
memory_available = _Heap_Initialize(
10e92a: 6a 04 push $0x4
10e92c: 52 push %edx
10e92d: 53 push %ebx
10e92e: 68 80 75 12 00 push $0x127580
10e933: e8 c0 dd ff ff call 10c6f8 <_Heap_Initialize>
starting_address,
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
10e938: 83 c4 10 add $0x10,%esp
10e93b: 85 c0 test %eax,%eax
10e93d: 74 13 je 10e952 <_Workspace_Handler_initialization+0x42>
_Internal_error_Occurred(
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
);
}
10e93f: 8d 65 f8 lea -0x8(%ebp),%esp
10e942: 5b pop %ebx
10e943: 5f pop %edi
10e944: c9 leave
10e945: c3 ret
10e946: 66 90 xchg %ax,%ax
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
uintptr_t size = Configuration.work_space_size;
if ( Configuration.do_zero_of_workspace )
memset( starting_address, 0, size );
10e948: 31 c0 xor %eax,%eax
10e94a: 89 df mov %ebx,%edi
10e94c: 89 d1 mov %edx,%ecx
10e94e: f3 aa rep stos %al,%es:(%edi)
10e950: eb d8 jmp 10e92a <_Workspace_Handler_initialization+0x1a>
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
_Internal_error_Occurred(
10e952: 50 push %eax
10e953: 6a 02 push $0x2
10e955: 6a 01 push $0x1
10e957: 6a 00 push $0x0
10e959: e8 a2 df ff ff call 10c900 <_Internal_error_Occurred>
0010b5d4 <adjtime>:
int adjtime(
struct timeval *delta,
struct timeval *olddelta
)
{
10b5d4: 55 push %ebp
10b5d5: 89 e5 mov %esp,%ebp
10b5d7: 57 push %edi
10b5d8: 56 push %esi
10b5d9: 53 push %ebx
10b5da: 83 ec 1c sub $0x1c,%esp
10b5dd: 8b 5d 08 mov 0x8(%ebp),%ebx
10b5e0: 8b 75 0c mov 0xc(%ebp),%esi
long adjustment;
/*
* Simple validations
*/
if ( !delta )
10b5e3: 85 db test %ebx,%ebx
10b5e5: 0f 84 f1 00 00 00 je 10b6dc <adjtime+0x108>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
10b5eb: 8b 53 04 mov 0x4(%ebx),%edx
10b5ee: 81 fa 3f 42 0f 00 cmp $0xf423f,%edx
10b5f4: 0f 87 e2 00 00 00 ja 10b6dc <adjtime+0x108>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
10b5fa: 85 f6 test %esi,%esi
10b5fc: 74 10 je 10b60e <adjtime+0x3a>
olddelta->tv_sec = 0;
10b5fe: c7 06 00 00 00 00 movl $0x0,(%esi)
olddelta->tv_usec = 0;
10b604: c7 46 04 00 00 00 00 movl $0x0,0x4(%esi)
10b60b: 8b 53 04 mov 0x4(%ebx),%edx
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
10b60e: 8b 03 mov (%ebx),%eax
10b610: 8d 04 80 lea (%eax,%eax,4),%eax
10b613: 8d 04 80 lea (%eax,%eax,4),%eax
10b616: 8d 04 80 lea (%eax,%eax,4),%eax
10b619: 8d 04 80 lea (%eax,%eax,4),%eax
10b61c: 8d 04 80 lea (%eax,%eax,4),%eax
10b61f: 8d 04 80 lea (%eax,%eax,4),%eax
10b622: c1 e0 06 shl $0x6,%eax
adjustment += delta->tv_usec;
10b625: 8d 04 02 lea (%edx,%eax,1),%eax
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
10b628: 3b 05 8c 47 12 00 cmp 0x12478c,%eax
10b62e: 73 0c jae 10b63c <adjtime+0x68>
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
10b630: 31 c0 xor %eax,%eax
}
10b632: 8d 65 f4 lea -0xc(%ebp),%esp
10b635: 5b pop %ebx
10b636: 5e pop %esi
10b637: 5f pop %edi
10b638: c9 leave
10b639: c3 ret
10b63a: 66 90 xchg %ax,%ax
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b63c: a1 90 8b 12 00 mov 0x128b90,%eax
10b641: 40 inc %eax
10b642: a3 90 8b 12 00 mov %eax,0x128b90
* This prevents context switches while we are adjusting the TOD
*/
_Thread_Disable_dispatch();
_TOD_Get( &ts );
10b647: 83 ec 0c sub $0xc,%esp
10b64a: 8d 7d e0 lea -0x20(%ebp),%edi
10b64d: 57 push %edi
10b64e: e8 89 17 00 00 call 10cddc <_TOD_Get>
ts.tv_sec += delta->tv_sec;
10b653: 8b 03 mov (%ebx),%eax
10b655: 01 45 e0 add %eax,-0x20(%ebp)
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
10b658: 8b 43 04 mov 0x4(%ebx),%eax
10b65b: 8d 04 80 lea (%eax,%eax,4),%eax
10b65e: 8d 04 80 lea (%eax,%eax,4),%eax
10b661: 8d 04 80 lea (%eax,%eax,4),%eax
10b664: c1 e0 03 shl $0x3,%eax
10b667: 03 45 e4 add -0x1c(%ebp),%eax
10b66a: 89 45 e4 mov %eax,-0x1c(%ebp)
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
10b66d: 83 c4 10 add $0x10,%esp
10b670: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
10b675: 76 18 jbe 10b68f <adjtime+0xbb>
10b677: 8b 55 e0 mov -0x20(%ebp),%edx
10b67a: 66 90 xchg %ax,%ax
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
10b67c: 2d 00 ca 9a 3b sub $0x3b9aca00,%eax
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
10b681: 42 inc %edx
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
10b682: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
10b687: 77 f3 ja 10b67c <adjtime+0xa8> <== NEVER TAKEN
10b689: 89 45 e4 mov %eax,-0x1c(%ebp)
10b68c: 89 55 e0 mov %edx,-0x20(%ebp)
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
10b68f: 3d 00 36 65 c4 cmp $0xc4653600,%eax
10b694: 77 19 ja 10b6af <adjtime+0xdb> <== NEVER TAKEN
10b696: 8b 55 e0 mov -0x20(%ebp),%edx
10b699: 8d 76 00 lea 0x0(%esi),%esi
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
10b69c: 05 00 ca 9a 3b add $0x3b9aca00,%eax
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
10b6a1: 4a dec %edx
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
10b6a2: 3d 00 36 65 c4 cmp $0xc4653600,%eax
10b6a7: 76 f3 jbe 10b69c <adjtime+0xc8>
10b6a9: 89 45 e4 mov %eax,-0x1c(%ebp)
10b6ac: 89 55 e0 mov %edx,-0x20(%ebp)
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec--;
}
_TOD_Set( &ts );
10b6af: 83 ec 0c sub $0xc,%esp
10b6b2: 57 push %edi
10b6b3: e8 b4 17 00 00 call 10ce6c <_TOD_Set>
_Thread_Enable_dispatch();
10b6b8: e8 f7 2b 00 00 call 10e2b4 <_Thread_Enable_dispatch>
/* set the user's output */
if ( olddelta )
10b6bd: 83 c4 10 add $0x10,%esp
10b6c0: 85 f6 test %esi,%esi
10b6c2: 0f 84 68 ff ff ff je 10b630 <adjtime+0x5c>
*olddelta = *delta;
10b6c8: 8b 03 mov (%ebx),%eax
10b6ca: 8b 53 04 mov 0x4(%ebx),%edx
10b6cd: 89 06 mov %eax,(%esi)
10b6cf: 89 56 04 mov %edx,0x4(%esi)
return 0;
10b6d2: 31 c0 xor %eax,%eax
}
10b6d4: 8d 65 f4 lea -0xc(%ebp),%esp
10b6d7: 5b pop %ebx
10b6d8: 5e pop %esi
10b6d9: 5f pop %edi
10b6da: c9 leave
10b6db: c3 ret
*/
if ( !delta )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
10b6dc: e8 07 87 00 00 call 113de8 <__errno>
10b6e1: c7 00 16 00 00 00 movl $0x16,(%eax)
10b6e7: b8 ff ff ff ff mov $0xffffffff,%eax
10b6ec: e9 41 ff ff ff jmp 10b632 <adjtime+0x5e>
0010bd04 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
10bd04: 55 push %ebp
10bd05: 89 e5 mov %esp,%ebp
10bd07: 57 push %edi
10bd08: 56 push %esi
10bd09: 53 push %ebx
10bd0a: 83 ec 18 sub $0x18,%esp
10bd0d: 8b 75 08 mov 0x8(%ebp),%esi
10bd10: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
10bd13: 68 60 a1 12 00 push $0x12a160
10bd18: e8 67 11 00 00 call 10ce84 <pthread_mutex_lock>
if (aiocbp == NULL)
10bd1d: 83 c4 10 add $0x10,%esp
10bd20: 85 db test %ebx,%ebx
10bd22: 0f 84 c8 00 00 00 je 10bdf0 <aio_cancel+0xec>
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
}
else
{
if (aiocbp->aio_fildes != fildes) {
10bd28: 8b 3b mov (%ebx),%edi
10bd2a: 39 f7 cmp %esi,%edi
10bd2c: 0f 85 9a 00 00 00 jne 10bdcc <aio_cancel+0xc8> <== ALWAYS TAKEN
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,
10bd32: 56 push %esi <== NOT EXECUTED
10bd33: 6a 00 push $0x0 <== NOT EXECUTED
10bd35: 57 push %edi <== NOT EXECUTED
10bd36: 68 a8 a1 12 00 push $0x12a1a8 <== NOT EXECUTED
10bd3b: e8 a4 03 00 00 call 10c0e4 <rtems_aio_search_fd> <== NOT EXECUTED
10bd40: 89 c6 mov %eax,%esi <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
10bd42: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10bd45: 85 c0 test %eax,%eax <== NOT EXECUTED
10bd47: 74 3b je 10bd84 <aio_cancel+0x80> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
pthread_mutex_lock (&r_chain->mutex);
10bd49: 8d 7e 1c lea 0x1c(%esi),%edi <== NOT EXECUTED
10bd4c: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bd4f: 57 push %edi <== NOT EXECUTED
10bd50: e8 2f 11 00 00 call 10ce84 <pthread_mutex_lock> <== NOT EXECUTED
result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp);
10bd55: 58 pop %eax <== NOT EXECUTED
10bd56: 5a pop %edx <== NOT EXECUTED
10bd57: 53 push %ebx <== NOT EXECUTED
10bd58: 56 push %esi <== NOT EXECUTED
10bd59: e8 36 07 00 00 call 10c494 <rtems_aio_remove_req> <== NOT EXECUTED
10bd5e: 89 c3 mov %eax,%ebx <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
10bd60: 89 3c 24 mov %edi,(%esp) <== NOT EXECUTED
10bd63: e8 a4 11 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
10bd68: c7 04 24 60 a1 12 00 movl $0x12a160,(%esp) <== NOT EXECUTED
10bd6f: e8 98 11 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return result;
10bd74: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
return AIO_ALLDONE;
}
10bd77: 89 d8 mov %ebx,%eax
10bd79: 8d 65 f4 lea -0xc(%ebp),%esp
10bd7c: 5b pop %ebx
10bd7d: 5e pop %esi
10bd7e: 5f pop %edi
10bd7f: c9 leave
10bd80: c3 ret
10bd81: 8d 76 00 lea 0x0(%esi),%esi
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
fildes,
0);
if (r_chain == NULL)
if (!rtems_chain_is_empty (&aio_request_queue.idle_req))
10bd84: 81 3d b4 a1 12 00 b8 cmpl $0x12a1b8,0x12a1b4 <== NOT EXECUTED
10bd8b: a1 12 00
10bd8e: 74 b9 je 10bd49 <aio_cancel+0x45> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
10bd90: 51 push %ecx <== NOT EXECUTED
10bd91: 6a 00 push $0x0 <== NOT EXECUTED
10bd93: 57 push %edi <== NOT EXECUTED
10bd94: 68 b4 a1 12 00 push $0x12a1b4 <== NOT EXECUTED
10bd99: e8 46 03 00 00 call 10c0e4 <rtems_aio_search_fd> <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
10bd9e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10bda1: 85 c0 test %eax,%eax <== NOT EXECUTED
10bda3: 74 27 je 10bdcc <aio_cancel+0xc8> <== NOT EXECUTED
{
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp);
10bda5: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
10bda8: 53 push %ebx <== NOT EXECUTED
10bda9: 50 push %eax <== NOT EXECUTED
10bdaa: e8 e5 06 00 00 call 10c494 <rtems_aio_remove_req> <== NOT EXECUTED
10bdaf: 89 c3 mov %eax,%ebx <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
10bdb1: c7 04 24 60 a1 12 00 movl $0x12a160,(%esp) <== NOT EXECUTED
10bdb8: e8 4f 11 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return result;
10bdbd: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
return result;
}
return AIO_ALLDONE;
}
10bdc0: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10bdc2: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10bdc5: 5b pop %ebx <== NOT EXECUTED
10bdc6: 5e pop %esi <== NOT EXECUTED
10bdc7: 5f pop %edi <== NOT EXECUTED
10bdc8: c9 leave <== NOT EXECUTED
10bdc9: c3 ret <== NOT EXECUTED
10bdca: 66 90 xchg %ax,%ax <== NOT EXECUTED
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
fildes,
0);
if (r_chain == NULL)
{
pthread_mutex_unlock (&aio_request_queue.mutex);
10bdcc: 83 ec 0c sub $0xc,%esp
10bdcf: 68 60 a1 12 00 push $0x12a160
10bdd4: e8 33 11 00 00 call 10cf0c <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
10bdd9: e8 1e 9e 00 00 call 115bfc <__errno>
10bdde: c7 00 16 00 00 00 movl $0x16,(%eax)
10bde4: 83 c4 10 add $0x10,%esp
10bde7: bb ff ff ff ff mov $0xffffffff,%ebx
10bdec: eb 89 jmp 10bd77 <aio_cancel+0x73>
10bdee: 66 90 xchg %ax,%ax
pthread_mutex_lock (&aio_request_queue.mutex);
if (aiocbp == NULL)
{
if (fcntl (fildes, F_GETFL) < 0) {
10bdf0: 83 ec 08 sub $0x8,%esp
10bdf3: 6a 03 push $0x3
10bdf5: 56 push %esi
10bdf6: e8 ad 69 00 00 call 1127a8 <fcntl>
10bdfb: 83 c4 10 add $0x10,%esp
10bdfe: 85 c0 test %eax,%eax
10be00: 0f 88 d4 00 00 00 js 10beda <aio_cancel+0x1d6> <== ALWAYS TAKEN
pthread_mutex_unlock(&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EBADF);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
10be06: 50 push %eax <== NOT EXECUTED
10be07: 6a 00 push $0x0 <== NOT EXECUTED
10be09: 56 push %esi <== NOT EXECUTED
10be0a: 68 a8 a1 12 00 push $0x12a1a8 <== NOT EXECUTED
10be0f: e8 d0 02 00 00 call 10c0e4 <rtems_aio_search_fd> <== NOT EXECUTED
10be14: 89 c3 mov %eax,%ebx <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
10be16: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10be19: 85 c0 test %eax,%eax <== NOT EXECUTED
10be1b: 74 3b je 10be58 <aio_cancel+0x154> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_ALLDONE;
}
pthread_mutex_lock (&r_chain->mutex);
10be1d: 8d 70 1c lea 0x1c(%eax),%esi <== NOT EXECUTED
10be20: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10be23: 56 push %esi <== NOT EXECUTED
10be24: e8 5b 10 00 00 call 10ce84 <pthread_mutex_lock> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10be29: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10be2c: e8 27 2a 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10be31: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10be34: e8 1b 06 00 00 call 10c454 <rtems_aio_remove_fd> <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
10be39: 89 34 24 mov %esi,(%esp) <== NOT EXECUTED
10be3c: e8 cb 10 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
10be41: c7 04 24 60 a1 12 00 movl $0x12a160,(%esp) <== NOT EXECUTED
10be48: e8 bf 10 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_CANCELED;
10be4d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10be50: 31 db xor %ebx,%ebx <== NOT EXECUTED
10be52: e9 20 ff ff ff jmp 10bd77 <aio_cancel+0x73> <== NOT EXECUTED
10be57: 90 nop <== NOT EXECUTED
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
fildes,
0);
if (r_chain == NULL)
{
if (!rtems_chain_is_empty (&aio_request_queue.idle_req))
10be58: 81 3d b4 a1 12 00 b8 cmpl $0x12a1b8,0x12a1b4 <== NOT EXECUTED
10be5f: a1 12 00
10be62: 74 45 je 10bea9 <aio_cancel+0x1a5> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
10be64: 57 push %edi <== NOT EXECUTED
10be65: 6a 00 push $0x0 <== NOT EXECUTED
10be67: 56 push %esi <== NOT EXECUTED
10be68: 68 b4 a1 12 00 push $0x12a1b4 <== NOT EXECUTED
10be6d: e8 72 02 00 00 call 10c0e4 <rtems_aio_search_fd> <== NOT EXECUTED
10be72: 89 c3 mov %eax,%ebx <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL) {
10be74: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10be77: 85 c0 test %eax,%eax <== NOT EXECUTED
10be79: 74 48 je 10bec3 <aio_cancel+0x1bf> <== NOT EXECUTED
10be7b: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10be7e: 50 push %eax <== NOT EXECUTED
10be7f: e8 d4 29 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
pthread_mutex_unlock(&aio_request_queue.mutex);
return AIO_ALLDONE;
}
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10be84: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10be87: e8 c8 05 00 00 call 10c454 <rtems_aio_remove_fd> <== NOT EXECUTED
pthread_mutex_destroy (&r_chain->mutex);
10be8c: 8d 73 1c lea 0x1c(%ebx),%esi <== NOT EXECUTED
10be8f: 89 34 24 mov %esi,(%esp) <== NOT EXECUTED
10be92: e8 81 0d 00 00 call 10cc18 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_cond_destroy (&r_chain->mutex);
10be97: 89 34 24 mov %esi,(%esp) <== NOT EXECUTED
10be9a: e8 35 0a 00 00 call 10c8d4 <pthread_cond_destroy> <== NOT EXECUTED
free (r_chain);
10be9f: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10bea2: e8 7d cc ff ff call 108b24 <free> <== NOT EXECUTED
10bea7: eb 98 jmp 10be41 <aio_cancel+0x13d> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
}
pthread_mutex_unlock (&aio_request_queue.mutex);
10bea9: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10beac: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10beb1: e8 56 10 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
10beb6: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10beb9: bb 02 00 00 00 mov $0x2,%ebx <== NOT EXECUTED
10bebe: e9 b4 fe ff ff jmp 10bd77 <aio_cancel+0x73> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
fildes,
0);
if (r_chain == NULL) {
pthread_mutex_unlock(&aio_request_queue.mutex);
10bec3: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bec6: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10becb: e8 3c 10 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
10bed0: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10bed3: b3 02 mov $0x2,%bl <== NOT EXECUTED
10bed5: e9 9d fe ff ff jmp 10bd77 <aio_cancel+0x73> <== NOT EXECUTED
pthread_mutex_lock (&aio_request_queue.mutex);
if (aiocbp == NULL)
{
if (fcntl (fildes, F_GETFL) < 0) {
pthread_mutex_unlock(&aio_request_queue.mutex);
10beda: 83 ec 0c sub $0xc,%esp
10bedd: 68 60 a1 12 00 push $0x12a160
10bee2: e8 25 10 00 00 call 10cf0c <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
10bee7: e8 10 9d 00 00 call 115bfc <__errno>
10beec: c7 00 09 00 00 00 movl $0x9,(%eax)
10bef2: 83 c4 10 add $0x10,%esp
10bef5: bb ff ff ff ff mov $0xffffffff,%ebx
10befa: e9 78 fe ff ff jmp 10bd77 <aio_cancel+0x73>
0010bf0c <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
10bf0c: 55 push %ebp
10bf0d: 89 e5 mov %esp,%ebp
10bf0f: 53 push %ebx
10bf10: 83 ec 04 sub $0x4,%esp
10bf13: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
10bf16: 81 7d 08 00 20 00 00 cmpl $0x2000,0x8(%ebp)
10bf1d: 75 41 jne 10bf60 <aio_fsync+0x54>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10bf1f: 83 ec 08 sub $0x8,%esp
10bf22: 6a 03 push $0x3
10bf24: ff 33 pushl (%ebx)
10bf26: e8 7d 68 00 00 call 1127a8 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10bf2b: 83 e0 03 and $0x3,%eax
10bf2e: 48 dec %eax
10bf2f: 83 c4 10 add $0x10,%esp
10bf32: 83 f8 01 cmp $0x1,%eax
10bf35: 77 4d ja 10bf84 <aio_fsync+0x78> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10bf37: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bf3a: 6a 18 push $0x18 <== NOT EXECUTED
10bf3c: e8 f7 d0 ff ff call 109038 <malloc> <== NOT EXECUTED
if (req == NULL)
10bf41: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10bf44: 85 c0 test %eax,%eax <== NOT EXECUTED
10bf46: 74 57 je 10bf9f <aio_fsync+0x93> <== NOT EXECUTED
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10bf48: 89 58 14 mov %ebx,0x14(%eax) <== NOT EXECUTED
req->aiocbp->aio_lio_opcode = LIO_SYNC;
10bf4b: c7 43 2c 03 00 00 00 movl $0x3,0x2c(%ebx) <== NOT EXECUTED
return rtems_aio_enqueue (req);
10bf52: 89 45 08 mov %eax,0x8(%ebp) <== NOT EXECUTED
}
10bf55: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10bf58: c9 leave <== NOT EXECUTED
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
10bf59: e9 92 05 00 00 jmp 10c4f0 <rtems_aio_enqueue> <== NOT EXECUTED
10bf5e: 66 90 xchg %ax,%ax <== NOT EXECUTED
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10bf60: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10bf67: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10bf6e: e8 89 9c 00 00 call 115bfc <__errno>
10bf73: c7 00 16 00 00 00 movl $0x16,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
10bf79: b8 ff ff ff ff mov $0xffffffff,%eax
10bf7e: 8b 5d fc mov -0x4(%ebp),%ebx
10bf81: c9 leave
10bf82: c3 ret
10bf83: 90 nop
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10bf84: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10bf8b: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10bf92: e8 65 9c 00 00 call 115bfc <__errno>
10bf97: c7 00 09 00 00 00 movl $0x9,(%eax)
10bf9d: eb da jmp 10bf79 <aio_fsync+0x6d>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10bf9f: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx)
10bfa6: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10bfad: e8 4a 9c 00 00 call 115bfc <__errno> <== NOT EXECUTED
10bfb2: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10bfb8: eb bf jmp 10bf79 <aio_fsync+0x6d> <== NOT EXECUTED
0010c6f8 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
10c6f8: 55 push %ebp
10c6f9: 89 e5 mov %esp,%ebp
10c6fb: 53 push %ebx
10c6fc: 83 ec 0c sub $0xc,%esp
10c6ff: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10c702: 6a 03 push $0x3
10c704: ff 33 pushl (%ebx)
10c706: e8 9d 60 00 00 call 1127a8 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10c70b: 83 c4 10 add $0x10,%esp
10c70e: 83 e0 03 and $0x3,%eax
10c711: 74 05 je 10c718 <aio_read+0x20> <== NEVER TAKEN
10c713: 83 f8 02 cmp $0x2,%eax
10c716: 75 38 jne 10c750 <aio_read+0x58>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10c718: 8b 53 14 mov 0x14(%ebx),%edx
10c71b: 85 d2 test %edx,%edx
10c71d: 75 55 jne 10c774 <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10c71f: 8b 43 08 mov 0x8(%ebx),%eax
10c722: 85 c0 test %eax,%eax
10c724: 78 4e js 10c774 <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10c726: 83 ec 0c sub $0xc,%esp
10c729: 6a 18 push $0x18
10c72b: e8 08 c9 ff ff call 109038 <malloc>
if (req == NULL)
10c730: 83 c4 10 add $0x10,%esp
10c733: 85 c0 test %eax,%eax
10c735: 74 58 je 10c78f <aio_read+0x97> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10c737: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_READ;
10c73a: c7 43 2c 01 00 00 00 movl $0x1,0x2c(%ebx)
return rtems_aio_enqueue (req);
10c741: 89 45 08 mov %eax,0x8(%ebp)
}
10c744: 8b 5d fc mov -0x4(%ebp),%ebx
10c747: 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);
10c748: e9 a3 fd ff ff jmp 10c4f0 <rtems_aio_enqueue>
10c74d: 8d 76 00 lea 0x0(%esi),%esi
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10c750: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10c757: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c75e: e8 99 94 00 00 call 115bfc <__errno>
10c763: c7 00 09 00 00 00 movl $0x9,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
10c769: b8 ff ff ff ff mov $0xffffffff,%eax
10c76e: 8b 5d fc mov -0x4(%ebp),%ebx
10c771: c9 leave
10c772: c3 ret
10c773: 90 nop
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10c774: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10c77b: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c782: e8 75 94 00 00 call 115bfc <__errno>
10c787: c7 00 16 00 00 00 movl $0x16,(%eax)
10c78d: eb da jmp 10c769 <aio_read+0x71>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10c78f: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10c796: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10c79d: e8 5a 94 00 00 call 115bfc <__errno> <== NOT EXECUTED
10c7a2: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10c7a8: eb bf jmp 10c769 <aio_read+0x71> <== NOT EXECUTED
0010c7b8 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
10c7b8: 55 push %ebp
10c7b9: 89 e5 mov %esp,%ebp
10c7bb: 53 push %ebx
10c7bc: 83 ec 0c sub $0xc,%esp
10c7bf: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10c7c2: 6a 03 push $0x3
10c7c4: ff 33 pushl (%ebx)
10c7c6: e8 dd 5f 00 00 call 1127a8 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10c7cb: 83 e0 03 and $0x3,%eax
10c7ce: 48 dec %eax
10c7cf: 83 c4 10 add $0x10,%esp
10c7d2: 83 f8 01 cmp $0x1,%eax
10c7d5: 77 35 ja 10c80c <aio_write+0x54>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10c7d7: 8b 53 14 mov 0x14(%ebx),%edx
10c7da: 85 d2 test %edx,%edx
10c7dc: 75 52 jne 10c830 <aio_write+0x78>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10c7de: 8b 43 08 mov 0x8(%ebx),%eax
10c7e1: 85 c0 test %eax,%eax
10c7e3: 78 4b js 10c830 <aio_write+0x78>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10c7e5: 83 ec 0c sub $0xc,%esp
10c7e8: 6a 18 push $0x18
10c7ea: e8 49 c8 ff ff call 109038 <malloc>
if (req == NULL)
10c7ef: 83 c4 10 add $0x10,%esp
10c7f2: 85 c0 test %eax,%eax
10c7f4: 74 55 je 10c84b <aio_write+0x93> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10c7f6: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
10c7f9: c7 43 2c 02 00 00 00 movl $0x2,0x2c(%ebx)
return rtems_aio_enqueue (req);
10c800: 89 45 08 mov %eax,0x8(%ebp)
}
10c803: 8b 5d fc mov -0x4(%ebp),%ebx
10c806: 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);
10c807: e9 e4 fc ff ff jmp 10c4f0 <rtems_aio_enqueue>
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
10c80c: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10c813: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c81a: e8 dd 93 00 00 call 115bfc <__errno>
10c81f: c7 00 09 00 00 00 movl $0x9,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
10c825: b8 ff ff ff ff mov $0xffffffff,%eax
10c82a: 8b 5d fc mov -0x4(%ebp),%ebx
10c82d: c9 leave
10c82e: c3 ret
10c82f: 90 nop
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10c830: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10c837: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c83e: e8 b9 93 00 00 call 115bfc <__errno>
10c843: c7 00 16 00 00 00 movl $0x16,(%eax)
10c849: eb da jmp 10c825 <aio_write+0x6d>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10c84b: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10c852: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10c859: e8 9e 93 00 00 call 115bfc <__errno> <== NOT EXECUTED
10c85e: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10c864: eb bf jmp 10c825 <aio_write+0x6d> <== NOT EXECUTED
0010b444 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
10b444: 55 push %ebp
10b445: 89 e5 mov %esp,%ebp
10b447: 83 ec 08 sub $0x8,%esp
10b44a: 8b 45 08 mov 0x8(%ebp),%eax
10b44d: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10b450: 85 d2 test %edx,%edx
10b452: 74 14 je 10b468 <clock_gettime+0x24>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10b454: 83 f8 01 cmp $0x1,%eax
10b457: 74 47 je 10b4a0 <clock_gettime+0x5c>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
10b459: 83 f8 04 cmp $0x4,%eax
10b45c: 74 32 je 10b490 <clock_gettime+0x4c> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
10b45e: 83 f8 02 cmp $0x2,%eax
10b461: 74 2d je 10b490 <clock_gettime+0x4c>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
10b463: 83 f8 03 cmp $0x3,%eax
10b466: 74 14 je 10b47c <clock_gettime+0x38>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
10b468: e8 c3 8e 00 00 call 114330 <__errno>
10b46d: c7 00 16 00 00 00 movl $0x16,(%eax)
10b473: b8 ff ff ff ff mov $0xffffffff,%eax
return 0;
}
10b478: c9 leave
10b479: c3 ret
10b47a: 66 90 xchg %ax,%ax
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
10b47c: e8 af 8e 00 00 call 114330 <__errno>
10b481: c7 00 58 00 00 00 movl $0x58,(%eax)
10b487: b8 ff ff ff ff mov $0xffffffff,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b48c: c9 leave
10b48d: c3 ret
10b48e: 66 90 xchg %ax,%ax
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
_TOD_Get_uptime_as_timespec( tp );
10b490: 83 ec 0c sub $0xc,%esp
10b493: 52 push %edx
10b494: e8 ab 1e 00 00 call 10d344 <_TOD_Get_uptime_as_timespec>
return 0;
10b499: 83 c4 10 add $0x10,%esp
10b49c: 31 c0 xor %eax,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b49e: c9 leave
10b49f: c3 ret
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
_TOD_Get(tp);
10b4a0: 83 ec 0c sub $0xc,%esp
10b4a3: 52 push %edx
10b4a4: e8 3f 1e 00 00 call 10d2e8 <_TOD_Get>
return 0;
10b4a9: 83 c4 10 add $0x10,%esp
10b4ac: 31 c0 xor %eax,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b4ae: c9 leave
10b4af: c3 ret
0010b4b0 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
10b4b0: 55 push %ebp
10b4b1: 89 e5 mov %esp,%ebp
10b4b3: 83 ec 08 sub $0x8,%esp
10b4b6: 8b 45 08 mov 0x8(%ebp),%eax
10b4b9: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10b4bc: 85 d2 test %edx,%edx
10b4be: 74 0f je 10b4cf <clock_settime+0x1f> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10b4c0: 83 f8 01 cmp $0x1,%eax
10b4c3: 74 1f je 10b4e4 <clock_settime+0x34>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
10b4c5: 83 f8 02 cmp $0x2,%eax
10b4c8: 74 42 je 10b50c <clock_settime+0x5c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
10b4ca: 83 f8 03 cmp $0x3,%eax
10b4cd: 74 3d je 10b50c <clock_settime+0x5c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
10b4cf: e8 5c 8e 00 00 call 114330 <__errno>
10b4d4: c7 00 16 00 00 00 movl $0x16,(%eax)
10b4da: b8 ff ff ff ff mov $0xffffffff,%eax
return 0;
}
10b4df: c9 leave
10b4e0: c3 ret
10b4e1: 8d 76 00 lea 0x0(%esi),%esi
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
10b4e4: 81 3a ff e4 da 21 cmpl $0x21dae4ff,(%edx)
10b4ea: 76 e3 jbe 10b4cf <clock_settime+0x1f>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b4ec: a1 70 95 12 00 mov 0x129570,%eax
10b4f1: 40 inc %eax
10b4f2: a3 70 95 12 00 mov %eax,0x129570
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
10b4f7: 83 ec 0c sub $0xc,%esp
10b4fa: 52 push %edx
10b4fb: e8 9c 1e 00 00 call 10d39c <_TOD_Set>
_Thread_Enable_dispatch();
10b500: e8 df 32 00 00 call 10e7e4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
10b505: 83 c4 10 add $0x10,%esp
10b508: 31 c0 xor %eax,%eax
}
10b50a: c9 leave
10b50b: c3 ret
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
10b50c: e8 1f 8e 00 00 call 114330 <__errno>
10b511: c7 00 58 00 00 00 movl $0x58,(%eax)
10b517: b8 ff ff ff ff mov $0xffffffff,%eax
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b51c: c9 leave
10b51d: c3 ret
0010b234 <getitimer>:
int getitimer(
int which,
struct itimerval *value
)
{
10b234: 55 push %ebp
10b235: 89 e5 mov %esp,%ebp
10b237: 83 ec 08 sub $0x8,%esp
if ( !value )
10b23a: 8b 45 0c mov 0xc(%ebp),%eax
10b23d: 85 c0 test %eax,%eax
10b23f: 74 2f je 10b270 <getitimer+0x3c>
rtems_set_errno_and_return_minus_one( EFAULT );
switch ( which ) {
10b241: 83 7d 08 02 cmpl $0x2,0x8(%ebp)
10b245: 76 15 jbe 10b25c <getitimer+0x28>
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b247: e8 08 88 00 00 call 113a54 <__errno>
10b24c: c7 00 16 00 00 00 movl $0x16,(%eax)
}
10b252: b8 ff ff ff ff mov $0xffffffff,%eax
10b257: c9 leave
10b258: c3 ret
10b259: 8d 76 00 lea 0x0(%esi),%esi
switch ( which ) {
case ITIMER_REAL:
case ITIMER_VIRTUAL:
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
10b25c: e8 f3 87 00 00 call 113a54 <__errno>
10b261: c7 00 58 00 00 00 movl $0x58,(%eax)
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b267: b8 ff ff ff ff mov $0xffffffff,%eax
10b26c: c9 leave
10b26d: c3 ret
10b26e: 66 90 xchg %ax,%ax
int which,
struct itimerval *value
)
{
if ( !value )
rtems_set_errno_and_return_minus_one( EFAULT );
10b270: e8 df 87 00 00 call 113a54 <__errno>
10b275: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b27b: eb d5 jmp 10b252 <getitimer+0x1e>
00124190 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
124190: 55 push %ebp
124191: 89 e5 mov %esp,%ebp
124193: 57 push %edi
124194: 56 push %esi
124195: 53 push %ebx
124196: 83 ec 3c sub $0x3c,%esp
124199: 8b 75 0c mov 0xc(%ebp),%esi
12419c: 8b 7d 10 mov 0x10(%ebp),%edi
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
12419f: e8 00 fd ff ff call 123ea4 <getpid>
1241a4: 3b 45 08 cmp 0x8(%ebp),%eax
1241a7: 0f 85 3f 02 00 00 jne 1243ec <killinfo+0x25c>
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
1241ad: 85 f6 test %esi,%esi
1241af: 0f 84 4c 02 00 00 je 124401 <killinfo+0x271>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
1241b5: 8d 4e ff lea -0x1(%esi),%ecx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
1241b8: 83 f9 1f cmp $0x1f,%ecx
1241bb: 0f 87 40 02 00 00 ja 124401 <killinfo+0x271>
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
1241c1: 8d 04 76 lea (%esi,%esi,2),%eax
1241c4: 83 3c 85 e8 e8 12 00 cmpl $0x1,0x12e8e8(,%eax,4)
1241cb: 01
1241cc: 0f 84 e6 01 00 00 je 1243b8 <killinfo+0x228>
/*
* 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 ) )
1241d2: 83 fe 08 cmp $0x8,%esi
1241d5: 0f 84 c9 00 00 00 je 1242a4 <killinfo+0x114>
1241db: 83 fe 04 cmp $0x4,%esi
1241de: 0f 84 c0 00 00 00 je 1242a4 <killinfo+0x114>
1241e4: 83 fe 0b cmp $0xb,%esi
1241e7: 0f 84 b7 00 00 00 je 1242a4 <killinfo+0x114>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
1241ed: bb 01 00 00 00 mov $0x1,%ebx
1241f2: d3 e3 shl %cl,%ebx
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
1241f4: 89 75 dc mov %esi,-0x24(%ebp)
siginfo->si_code = SI_USER;
1241f7: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
if ( !value ) {
1241fe: 85 ff test %edi,%edi
124200: 0f 84 ba 01 00 00 je 1243c0 <killinfo+0x230>
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
124206: 8b 07 mov (%edi),%eax
124208: 89 45 e4 mov %eax,-0x1c(%ebp)
12420b: a1 90 e2 12 00 mov 0x12e290,%eax
124210: 40 inc %eax
124211: a3 90 e2 12 00 mov %eax,0x12e290
/*
* 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;
124216: 8b 0d 78 e8 12 00 mov 0x12e878,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
12421c: 8b 81 ec 00 00 00 mov 0xec(%ecx),%eax
124222: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
124228: f7 d0 not %eax
12422a: 85 c3 test %eax,%ebx
12422c: 75 34 jne 124262 <killinfo+0xd2>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
12422e: a1 80 ea 12 00 mov 0x12ea80,%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 );
124233: 3d 84 ea 12 00 cmp $0x12ea84,%eax
124238: 75 1b jne 124255 <killinfo+0xc5>
12423a: e9 81 00 00 00 jmp 1242c0 <killinfo+0x130>
12423f: 90 nop
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
124240: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx
124246: f7 d2 not %edx
124248: 85 d3 test %edx,%ebx
12424a: 75 16 jne 124262 <killinfo+0xd2>
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 ) {
12424c: 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 );
12424e: 3d 84 ea 12 00 cmp $0x12ea84,%eax
124253: 74 6b je 1242c0 <killinfo+0x130> <== ALWAYS TAKEN
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
124255: 89 c1 mov %eax,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124257: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
12425d: 85 58 30 test %ebx,0x30(%eax)
124260: 74 de je 124240 <killinfo+0xb0>
/*
* 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 ) ) {
124262: 50 push %eax
mask = signo_to_mask( sig );
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
124263: 8d 45 dc lea -0x24(%ebp),%eax
/*
* 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 ) ) {
124266: 50 push %eax
124267: 56 push %esi
124268: 51 push %ecx
124269: e8 d6 01 00 00 call 124444 <_POSIX_signals_Unblock_thread>
12426e: 83 c4 10 add $0x10,%esp
124271: 84 c0 test %al,%al
124273: 75 1f jne 124294 <killinfo+0x104>
/*
* 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 );
124275: 83 ec 0c sub $0xc,%esp
124278: 53 push %ebx
124279: e8 b2 01 00 00 call 124430 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
12427e: 8d 1c 76 lea (%esi,%esi,2),%ebx
124281: c1 e3 02 shl $0x2,%ebx
124284: 83 c4 10 add $0x10,%esp
124287: 83 bb e0 e8 12 00 02 cmpl $0x2,0x12e8e0(%ebx)
12428e: 0f 84 e4 00 00 00 je 124378 <killinfo+0x1e8>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
124294: e8 63 e7 fe ff call 1129fc <_Thread_Enable_dispatch>
return 0;
124299: 31 c0 xor %eax,%eax
}
12429b: 8d 65 f4 lea -0xc(%ebp),%esp
12429e: 5b pop %ebx
12429f: 5e pop %esi
1242a0: 5f pop %edi
1242a1: c9 leave
1242a2: c3 ret
1242a3: 90 nop
* P1003.1c/Draft 10, p. 33 says that certain signals should always
* be directed to the executing thread such as those caused by hardware
* faults.
*/
if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
return pthread_kill( pthread_self(), sig );
1242a4: e8 7b 03 00 00 call 124624 <pthread_self>
1242a9: 83 ec 08 sub $0x8,%esp
1242ac: 56 push %esi
1242ad: 50 push %eax
1242ae: e8 b1 02 00 00 call 124564 <pthread_kill>
1242b3: 83 c4 10 add $0x10,%esp
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
1242b6: 8d 65 f4 lea -0xc(%ebp),%esp
1242b9: 5b pop %ebx
1242ba: 5e pop %esi
1242bb: 5f pop %edi
1242bc: c9 leave
1242bd: c3 ret
1242be: 66 90 xchg %ax,%ax
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
1242c0: 0f b6 05 34 9e 12 00 movzbl 0x129e34,%eax
1242c7: 40 inc %eax
1242c8: 89 45 d4 mov %eax,-0x2c(%ebp)
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
1242cb: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
1242d2: c7 45 cc 02 00 00 00 movl $0x2,-0x34(%ebp)
1242d9: 89 5d d0 mov %ebx,-0x30(%ebp)
1242dc: 89 75 c0 mov %esi,-0x40(%ebp)
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
1242df: 8b 55 cc mov -0x34(%ebp),%edx
1242e2: 8b 04 95 68 e2 12 00 mov 0x12e268(,%edx,4),%eax
1242e9: 85 c0 test %eax,%eax
1242eb: 74 68 je 124355 <killinfo+0x1c5> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
1242ed: 8b 40 04 mov 0x4(%eax),%eax
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
1242f0: 0f b7 70 10 movzwl 0x10(%eax),%esi
object_table = the_info->local_table;
1242f4: 8b 78 1c mov 0x1c(%eax),%edi
for ( index = 1 ; index <= maximum ; index++ ) {
1242f7: 85 f6 test %esi,%esi
1242f9: 74 5a je 124355 <killinfo+0x1c5>
1242fb: b8 01 00 00 00 mov $0x1,%eax
the_thread = (Thread_Control *) object_table[ index ];
124300: 8b 14 87 mov (%edi,%eax,4),%edx
if ( !the_thread )
124303: 85 d2 test %edx,%edx
124305: 74 49 je 124350 <killinfo+0x1c0>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
124307: 8b 4a 14 mov 0x14(%edx),%ecx
12430a: 3b 4d d4 cmp -0x2c(%ebp),%ecx
12430d: 77 41 ja 124350 <killinfo+0x1c0>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
12430f: 8b 9a ec 00 00 00 mov 0xec(%edx),%ebx
124315: 8b 9b d0 00 00 00 mov 0xd0(%ebx),%ebx
12431b: f7 d3 not %ebx
12431d: 85 5d d0 test %ebx,-0x30(%ebp)
124320: 74 2e je 124350 <killinfo+0x1c0>
*
* 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 ) {
124322: 3b 4d d4 cmp -0x2c(%ebp),%ecx
124325: 72 21 jb 124348 <killinfo+0x1b8>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
124327: 8b 5d c8 mov -0x38(%ebp),%ebx
12432a: 85 db test %ebx,%ebx
12432c: 74 22 je 124350 <killinfo+0x1c0> <== NEVER TAKEN
12432e: 8b 5d c8 mov -0x38(%ebp),%ebx
124331: 8b 5b 10 mov 0x10(%ebx),%ebx
124334: 89 5d c4 mov %ebx,-0x3c(%ebp)
124337: 85 db test %ebx,%ebx
124339: 74 15 je 124350 <killinfo+0x1c0> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
12433b: 8b 5a 10 mov 0x10(%edx),%ebx
12433e: 85 db test %ebx,%ebx
124340: 0f 85 86 00 00 00 jne 1243cc <killinfo+0x23c>
124346: 66 90 xchg %ax,%ax
124348: 89 4d d4 mov %ecx,-0x2c(%ebp)
12434b: 89 55 c8 mov %edx,-0x38(%ebp)
12434e: 66 90 xchg %ax,%ax
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
124350: 40 inc %eax
124351: 39 c6 cmp %eax,%esi
124353: 73 ab jae 124300 <killinfo+0x170>
* + 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++) {
124355: ff 45 cc incl -0x34(%ebp)
124358: 83 7d cc 04 cmpl $0x4,-0x34(%ebp)
12435c: 75 81 jne 1242df <killinfo+0x14f>
12435e: 8b 5d d0 mov -0x30(%ebp),%ebx
124361: 8b 75 c0 mov -0x40(%ebp),%esi
}
}
}
}
if ( interested ) {
124364: 8b 55 c8 mov -0x38(%ebp),%edx
124367: 85 d2 test %edx,%edx
124369: 0f 84 06 ff ff ff je 124275 <killinfo+0xe5>
12436f: 8b 4d c8 mov -0x38(%ebp),%ecx
124372: e9 eb fe ff ff jmp 124262 <killinfo+0xd2>
124377: 90 nop
_POSIX_signals_Set_process_signals( mask );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
124378: 83 ec 0c sub $0xc,%esp
12437b: 68 60 ea 12 00 push $0x12ea60
124380: e8 f3 cc fe ff call 111078 <_Chain_Get>
if ( !psiginfo ) {
124385: 83 c4 10 add $0x10,%esp
124388: 85 c0 test %eax,%eax
12438a: 0f 84 86 00 00 00 je 124416 <killinfo+0x286>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
124390: 8d 78 08 lea 0x8(%eax),%edi
124393: 8d 75 dc lea -0x24(%ebp),%esi
124396: b9 03 00 00 00 mov $0x3,%ecx
12439b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
12439d: 83 ec 08 sub $0x8,%esp
1243a0: 50 push %eax
1243a1: 81 c3 00 eb 12 00 add $0x12eb00,%ebx
1243a7: 53 push %ebx
1243a8: e8 8f cc fe ff call 11103c <_Chain_Append>
1243ad: 83 c4 10 add $0x10,%esp
1243b0: e9 df fe ff ff jmp 124294 <killinfo+0x104>
1243b5: 8d 76 00 lea 0x0(%esi),%esi
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
return 0;
1243b8: 31 c0 xor %eax,%eax
1243ba: e9 f7 fe ff ff jmp 1242b6 <killinfo+0x126>
1243bf: 90 nop
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
siginfo->si_value.sival_int = 0;
1243c0: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
1243c7: e9 3f fe ff ff jmp 12420b <killinfo+0x7b>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
1243cc: f7 45 c4 00 00 00 10 testl $0x10000000,-0x3c(%ebp)
1243d3: 0f 85 77 ff ff ff jne 124350 <killinfo+0x1c0>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
1243d9: 81 e3 00 00 00 10 and $0x10000000,%ebx
1243df: 0f 84 6b ff ff ff je 124350 <killinfo+0x1c0>
1243e5: e9 5e ff ff ff jmp 124348 <killinfo+0x1b8>
1243ea: 66 90 xchg %ax,%ax
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
rtems_set_errno_and_return_minus_one( ESRCH );
1243ec: e8 eb 40 ff ff call 1184dc <__errno>
1243f1: c7 00 03 00 00 00 movl $0x3,(%eax)
1243f7: b8 ff ff ff ff mov $0xffffffff,%eax
1243fc: e9 b5 fe ff ff jmp 1242b6 <killinfo+0x126>
*/
if ( !sig )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
124401: e8 d6 40 ff ff call 1184dc <__errno>
124406: c7 00 16 00 00 00 movl $0x16,(%eax)
12440c: b8 ff ff ff ff mov $0xffffffff,%eax
124411: e9 a0 fe ff ff jmp 1242b6 <killinfo+0x126>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
_Thread_Enable_dispatch();
124416: e8 e1 e5 fe ff call 1129fc <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
12441b: e8 bc 40 ff ff call 1184dc <__errno>
124420: c7 00 0b 00 00 00 movl $0xb,(%eax)
124426: 83 c8 ff or $0xffffffff,%eax
124429: e9 88 fe ff ff jmp 1242b6 <killinfo+0x126>
0010fb04 <mq_open>:
int oflag,
...
/* mode_t mode, */
/* struct mq_attr attr */
)
{
10fb04: 55 push %ebp
10fb05: 89 e5 mov %esp,%ebp
10fb07: 57 push %edi
10fb08: 56 push %esi
10fb09: 53 push %ebx
10fb0a: 83 ec 2c sub $0x2c,%esp
10fb0d: 8b 75 0c mov 0xc(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10fb10: a1 90 fa 12 00 mov 0x12fa90,%eax
10fb15: 40 inc %eax
10fb16: a3 90 fa 12 00 mov %eax,0x12fa90
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10fb1b: 89 f0 mov %esi,%eax
10fb1d: 25 00 02 00 00 and $0x200,%eax
10fb22: 89 45 d4 mov %eax,-0x2c(%ebp)
10fb25: 0f 85 c9 00 00 00 jne 10fbf4 <mq_open+0xf0>
/* struct mq_attr attr */
)
{
va_list arg;
mode_t mode;
struct mq_attr *attr = NULL;
10fb2b: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
_Objects_Allocate( &_POSIX_Message_queue_Information_fds );
10fb32: 83 ec 0c sub $0xc,%esp
10fb35: 68 00 00 13 00 push $0x130000
10fb3a: e8 61 2c 00 00 call 1127a0 <_Objects_Allocate>
10fb3f: 89 c3 mov %eax,%ebx
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
10fb41: 83 c4 10 add $0x10,%esp
10fb44: 85 c0 test %eax,%eax
10fb46: 0f 84 b4 00 00 00 je 10fc00 <mq_open+0xfc>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq_fd->oflag = oflag;
10fb4c: 89 70 14 mov %esi,0x14(%eax)
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
10fb4f: 83 ec 08 sub $0x8,%esp
10fb52: 8d 45 e4 lea -0x1c(%ebp),%eax
10fb55: 50 push %eax
10fb56: ff 75 08 pushl 0x8(%ebp)
10fb59: e8 92 69 00 00 call 1164f0 <_POSIX_Message_queue_Name_to_id>
10fb5e: 89 c7 mov %eax,%edi
* If the name to id translation worked, then the message queue exists
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "message queue does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
10fb60: 83 c4 10 add $0x10,%esp
10fb63: 85 c0 test %eax,%eax
10fb65: 75 59 jne 10fbc0 <mq_open+0xbc>
} else { /* name -> ID translation succeeded */
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10fb67: 81 e6 00 0a 00 00 and $0xa00,%esi
10fb6d: 81 fe 00 0a 00 00 cmp $0xa00,%esi
10fb73: 0f 84 a7 00 00 00 je 10fc20 <mq_open+0x11c>
Objects_Id id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control *)
_Objects_Get( &_POSIX_Message_queue_Information, id, location );
10fb79: 50 push %eax
/*
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
10fb7a: 8d 45 dc lea -0x24(%ebp),%eax
10fb7d: 50 push %eax
10fb7e: ff 75 e4 pushl -0x1c(%ebp)
10fb81: 68 60 fe 12 00 push $0x12fe60
10fb86: e8 cd 30 00 00 call 112c58 <_Objects_Get>
10fb8b: 89 45 e0 mov %eax,-0x20(%ebp)
the_mq->open_count += 1;
10fb8e: ff 40 18 incl 0x18(%eax)
the_mq_fd->Queue = the_mq;
10fb91: 89 43 10 mov %eax,0x10(%ebx)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
10fb94: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10fb98: a1 1c 00 13 00 mov 0x13001c,%eax
10fb9d: 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;
10fba0: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
_Objects_Open_string(
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
10fba7: e8 e0 3b 00 00 call 11378c <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10fbac: e8 db 3b 00 00 call 11378c <_Thread_Enable_dispatch>
return (mqd_t)the_mq_fd->Object.id;
10fbb1: 8b 43 08 mov 0x8(%ebx),%eax
10fbb4: 83 c4 10 add $0x10,%esp
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fbb7: 8d 65 f4 lea -0xc(%ebp),%esp
10fbba: 5b pop %ebx
10fbbb: 5e pop %esi
10fbbc: 5f pop %edi
10fbbd: c9 leave
10fbbe: c3 ret
10fbbf: 90 nop
if ( status ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
10fbc0: 83 f8 02 cmp $0x2,%eax
10fbc3: 0f 84 87 00 00 00 je 10fc50 <mq_open+0x14c>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
POSIX_Message_queue_Control_fd *the_mq_fd
)
{
_Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
10fbc9: 83 ec 08 sub $0x8,%esp
10fbcc: 53 push %ebx
10fbcd: 68 00 00 13 00 push $0x130000
10fbd2: e8 41 2f 00 00 call 112b18 <_Objects_Free>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fbd7: e8 b0 3b 00 00 call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
10fbdc: e8 db 9c 00 00 call 1198bc <__errno>
10fbe1: 89 38 mov %edi,(%eax)
10fbe3: 83 c4 10 add $0x10,%esp
10fbe6: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fbeb: 8d 65 f4 lea -0xc(%ebp),%esp
10fbee: 5b pop %ebx
10fbef: 5e pop %esi
10fbf0: 5f pop %edi
10fbf1: c9 leave
10fbf2: c3 ret
10fbf3: 90 nop
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
10fbf4: 8b 45 14 mov 0x14(%ebp),%eax
10fbf7: 89 45 d0 mov %eax,-0x30(%ebp)
10fbfa: e9 33 ff ff ff jmp 10fb32 <mq_open+0x2e>
10fbff: 90 nop
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
_Thread_Enable_dispatch();
10fc00: e8 87 3b 00 00 call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
10fc05: e8 b2 9c 00 00 call 1198bc <__errno>
10fc0a: c7 00 17 00 00 00 movl $0x17,(%eax)
10fc10: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fc15: 8d 65 f4 lea -0xc(%ebp),%esp
10fc18: 5b pop %ebx
10fc19: 5e pop %esi
10fc1a: 5f pop %edi
10fc1b: c9 leave
10fc1c: c3 ret
10fc1d: 8d 76 00 lea 0x0(%esi),%esi
10fc20: 83 ec 08 sub $0x8,%esp
10fc23: 53 push %ebx
10fc24: 68 00 00 13 00 push $0x130000
10fc29: e8 ea 2e 00 00 call 112b18 <_Objects_Free>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fc2e: e8 59 3b 00 00 call 11378c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
10fc33: e8 84 9c 00 00 call 1198bc <__errno>
10fc38: c7 00 11 00 00 00 movl $0x11,(%eax)
10fc3e: 83 c4 10 add $0x10,%esp
10fc41: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fc46: 8d 65 f4 lea -0xc(%ebp),%esp
10fc49: 5b pop %ebx
10fc4a: 5e pop %esi
10fc4b: 5f pop %edi
10fc4c: c9 leave
10fc4d: c3 ret
10fc4e: 66 90 xchg %ax,%ax
if ( status ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
10fc50: 8b 55 d4 mov -0x2c(%ebp),%edx
10fc53: 85 d2 test %edx,%edx
10fc55: 0f 84 6e ff ff ff je 10fbc9 <mq_open+0xc5>
/*
* At this point, the message queue does not exist and everything has been
* checked. We should go ahead and create a message queue.
*/
status = _POSIX_Message_queue_Create_support(
10fc5b: 8d 45 e0 lea -0x20(%ebp),%eax
10fc5e: 50 push %eax
10fc5f: ff 75 d0 pushl -0x30(%ebp)
10fc62: 6a 01 push $0x1
10fc64: ff 75 08 pushl 0x8(%ebp)
10fc67: e8 fc 66 00 00 call 116368 <_POSIX_Message_queue_Create_support>
);
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
10fc6c: 83 c4 10 add $0x10,%esp
10fc6f: 40 inc %eax
10fc70: 74 26 je 10fc98 <mq_open+0x194>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
return (mqd_t) -1;
}
the_mq_fd->Queue = the_mq;
10fc72: 8b 45 e0 mov -0x20(%ebp),%eax
10fc75: 89 43 10 mov %eax,0x10(%ebx)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
10fc78: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10fc7c: a1 1c 00 13 00 mov 0x13001c,%eax
10fc81: 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;
10fc84: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
10fc8b: e8 fc 3a 00 00 call 11378c <_Thread_Enable_dispatch>
return (mqd_t) the_mq_fd->Object.id;
10fc90: 8b 43 08 mov 0x8(%ebx),%eax
10fc93: e9 1f ff ff ff jmp 10fbb7 <mq_open+0xb3>
10fc98: 83 ec 08 sub $0x8,%esp
10fc9b: 53 push %ebx
10fc9c: 68 00 00 13 00 push $0x130000
10fca1: e8 72 2e 00 00 call 112b18 <_Objects_Free>
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fca6: e8 e1 3a 00 00 call 11378c <_Thread_Enable_dispatch>
return (mqd_t) -1;
10fcab: 83 c4 10 add $0x10,%esp
10fcae: b8 ff ff ff ff mov $0xffffffff,%eax
10fcb3: e9 ff fe ff ff jmp 10fbb7 <mq_open+0xb3>
0011093c <pthread_attr_destroy>:
#include <rtems/system.h>
int pthread_attr_destroy(
pthread_attr_t *attr
)
{
11093c: 55 push %ebp
11093d: 89 e5 mov %esp,%ebp
11093f: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110942: 85 c0 test %eax,%eax
110944: 74 12 je 110958 <pthread_attr_destroy+0x1c>
110946: 8b 10 mov (%eax),%edx
110948: 85 d2 test %edx,%edx
11094a: 74 0c je 110958 <pthread_attr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
11094c: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
110952: 31 c0 xor %eax,%eax
}
110954: c9 leave
110955: c3 ret
110956: 66 90 xchg %ax,%ax
int pthread_attr_destroy(
pthread_attr_t *attr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110958: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
11095d: c9 leave
11095e: c3 ret
00110a88 <pthread_attr_getstack>:
int pthread_attr_getstack(
const pthread_attr_t *attr,
void **stackaddr,
size_t *stacksize
)
{
110a88: 55 push %ebp
110a89: 89 e5 mov %esp,%ebp
110a8b: 53 push %ebx
110a8c: 8b 45 08 mov 0x8(%ebp),%eax
110a8f: 8b 55 0c mov 0xc(%ebp),%edx
110a92: 8b 4d 10 mov 0x10(%ebp),%ecx
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
110a95: 85 c0 test %eax,%eax
110a97: 74 1f je 110ab8 <pthread_attr_getstack+0x30>
110a99: 8b 18 mov (%eax),%ebx
110a9b: 85 db test %ebx,%ebx
110a9d: 74 19 je 110ab8 <pthread_attr_getstack+0x30>
110a9f: 85 d2 test %edx,%edx
110aa1: 74 15 je 110ab8 <pthread_attr_getstack+0x30>
110aa3: 85 c9 test %ecx,%ecx
110aa5: 74 11 je 110ab8 <pthread_attr_getstack+0x30>
return EINVAL;
*stackaddr = attr->stackaddr;
110aa7: 8b 58 04 mov 0x4(%eax),%ebx
110aaa: 89 1a mov %ebx,(%edx)
*stacksize = attr->stacksize;
110aac: 8b 40 08 mov 0x8(%eax),%eax
110aaf: 89 01 mov %eax,(%ecx)
return 0;
110ab1: 31 c0 xor %eax,%eax
}
110ab3: 5b pop %ebx
110ab4: c9 leave
110ab5: c3 ret
110ab6: 66 90 xchg %ax,%ax
void **stackaddr,
size_t *stacksize
)
{
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
return EINVAL;
110ab8: b8 16 00 00 00 mov $0x16,%eax
*stackaddr = attr->stackaddr;
*stacksize = attr->stacksize;
return 0;
}
110abd: 5b pop %ebx
110abe: c9 leave
110abf: c3 ret
00110b3c <pthread_attr_setguardsize>:
int pthread_attr_setguardsize(
pthread_attr_t *attr,
size_t guardsize
)
{
110b3c: 55 push %ebp
110b3d: 89 e5 mov %esp,%ebp
110b3f: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110b42: 85 c0 test %eax,%eax
110b44: 74 12 je 110b58 <pthread_attr_setguardsize+0x1c>
110b46: 8b 10 mov (%eax),%edx
110b48: 85 d2 test %edx,%edx
110b4a: 74 0c je 110b58 <pthread_attr_setguardsize+0x1c>
return EINVAL;
attr->guardsize = guardsize;
110b4c: 8b 55 0c mov 0xc(%ebp),%edx
110b4f: 89 50 34 mov %edx,0x34(%eax)
return 0;
110b52: 31 c0 xor %eax,%eax
}
110b54: c9 leave
110b55: c3 ret
110b56: 66 90 xchg %ax,%ax
pthread_attr_t *attr,
size_t guardsize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110b58: b8 16 00 00 00 mov $0x16,%eax
attr->guardsize = guardsize;
return 0;
}
110b5d: c9 leave
110b5e: c3 ret
00111b4c <pthread_attr_setinheritsched>:
int pthread_attr_setinheritsched(
pthread_attr_t *attr,
int inheritsched
)
{
111b4c: 55 push %ebp
111b4d: 89 e5 mov %esp,%ebp
111b4f: 8b 45 08 mov 0x8(%ebp),%eax
111b52: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
111b55: 85 c0 test %eax,%eax
111b57: 74 1f je 111b78 <pthread_attr_setinheritsched+0x2c>
111b59: 8b 08 mov (%eax),%ecx
111b5b: 85 c9 test %ecx,%ecx
111b5d: 74 19 je 111b78 <pthread_attr_setinheritsched+0x2c>
return EINVAL;
switch ( inheritsched ) {
111b5f: 8d 4a ff lea -0x1(%edx),%ecx
111b62: 83 f9 01 cmp $0x1,%ecx
111b65: 76 09 jbe 111b70 <pthread_attr_setinheritsched+0x24>
case PTHREAD_EXPLICIT_SCHED:
attr->inheritsched = inheritsched;
return 0;
default:
return ENOTSUP;
111b67: b8 86 00 00 00 mov $0x86,%eax
}
}
111b6c: c9 leave
111b6d: c3 ret
111b6e: 66 90 xchg %ax,%ax
return EINVAL;
switch ( inheritsched ) {
case PTHREAD_INHERIT_SCHED:
case PTHREAD_EXPLICIT_SCHED:
attr->inheritsched = inheritsched;
111b70: 89 50 10 mov %edx,0x10(%eax)
return 0;
111b73: 31 c0 xor %eax,%eax
default:
return ENOTSUP;
}
}
111b75: c9 leave
111b76: c3 ret
111b77: 90 nop
pthread_attr_t *attr,
int inheritsched
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
111b78: b8 16 00 00 00 mov $0x16,%eax
return 0;
default:
return ENOTSUP;
}
}
111b7d: c9 leave
111b7e: c3 ret
00110b94 <pthread_attr_setschedparam>:
int pthread_attr_setschedparam(
pthread_attr_t *attr,
const struct sched_param *param
)
{
110b94: 55 push %ebp
110b95: 89 e5 mov %esp,%ebp
110b97: 57 push %edi
110b98: 56 push %esi
110b99: 8b 7d 08 mov 0x8(%ebp),%edi
110b9c: 8b 75 0c mov 0xc(%ebp),%esi
if ( !attr || !attr->is_initialized || !param )
110b9f: 85 ff test %edi,%edi
110ba1: 74 1d je 110bc0 <pthread_attr_setschedparam+0x2c>
110ba3: 8b 07 mov (%edi),%eax
110ba5: 85 c0 test %eax,%eax
110ba7: 74 17 je 110bc0 <pthread_attr_setschedparam+0x2c>
110ba9: 85 f6 test %esi,%esi
110bab: 74 13 je 110bc0 <pthread_attr_setschedparam+0x2c>
return EINVAL;
attr->schedparam = *param;
110bad: 83 c7 18 add $0x18,%edi
110bb0: b9 07 00 00 00 mov $0x7,%ecx
110bb5: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
110bb7: 31 c0 xor %eax,%eax
}
110bb9: 5e pop %esi
110bba: 5f pop %edi
110bbb: c9 leave
110bbc: c3 ret
110bbd: 8d 76 00 lea 0x0(%esi),%esi
pthread_attr_t *attr,
const struct sched_param *param
)
{
if ( !attr || !attr->is_initialized || !param )
return EINVAL;
110bc0: b8 16 00 00 00 mov $0x16,%eax
attr->schedparam = *param;
return 0;
}
110bc5: 5e pop %esi
110bc6: 5f pop %edi
110bc7: c9 leave
110bc8: c3 ret
00110bcc <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
110bcc: 55 push %ebp
110bcd: 89 e5 mov %esp,%ebp
110bcf: 8b 45 08 mov 0x8(%ebp),%eax
110bd2: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
110bd5: 85 c0 test %eax,%eax
110bd7: 74 23 je 110bfc <pthread_attr_setschedpolicy+0x30>
110bd9: 8b 08 mov (%eax),%ecx
110bdb: 85 c9 test %ecx,%ecx
110bdd: 74 1d je 110bfc <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
110bdf: 85 d2 test %edx,%edx
110be1: 78 0a js 110bed <pthread_attr_setschedpolicy+0x21>
110be3: 83 fa 02 cmp $0x2,%edx
110be6: 7e 0c jle 110bf4 <pthread_attr_setschedpolicy+0x28>
110be8: 83 fa 04 cmp $0x4,%edx
110beb: 74 07 je 110bf4 <pthread_attr_setschedpolicy+0x28><== ALWAYS TAKEN
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
110bed: b8 86 00 00 00 mov $0x86,%eax
}
}
110bf2: c9 leave
110bf3: c3 ret
switch ( policy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
110bf4: 89 50 14 mov %edx,0x14(%eax)
return 0;
110bf7: 31 c0 xor %eax,%eax
default:
return ENOTSUP;
}
}
110bf9: c9 leave
110bfa: c3 ret
110bfb: 90 nop
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110bfc: b8 16 00 00 00 mov $0x16,%eax
return 0;
default:
return ENOTSUP;
}
}
110c01: c9 leave
110c02: c3 ret
00110c04 <pthread_attr_setscope>:
int pthread_attr_setscope(
pthread_attr_t *attr,
int contentionscope
)
{
110c04: 55 push %ebp
110c05: 89 e5 mov %esp,%ebp
110c07: 8b 45 08 mov 0x8(%ebp),%eax
110c0a: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
110c0d: 85 c0 test %eax,%eax
110c0f: 74 1a je 110c2b <pthread_attr_setscope+0x27>
110c11: 8b 08 mov (%eax),%ecx
110c13: 85 c9 test %ecx,%ecx
110c15: 74 14 je 110c2b <pthread_attr_setscope+0x27>
return EINVAL;
switch ( contentionscope ) {
110c17: 85 d2 test %edx,%edx
110c19: 75 0d jne 110c28 <pthread_attr_setscope+0x24>
case PTHREAD_SCOPE_PROCESS:
attr->contentionscope = contentionscope;
110c1b: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
return 0;
110c22: 31 c0 xor %eax,%eax
return ENOTSUP;
default:
return EINVAL;
}
}
110c24: c9 leave
110c25: c3 ret
110c26: 66 90 xchg %ax,%ax
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
switch ( contentionscope ) {
110c28: 4a dec %edx
110c29: 74 09 je 110c34 <pthread_attr_setscope+0x30>
case PTHREAD_SCOPE_SYSTEM:
return ENOTSUP;
default:
return EINVAL;
110c2b: b8 16 00 00 00 mov $0x16,%eax
}
}
110c30: c9 leave
110c31: c3 ret
110c32: 66 90 xchg %ax,%ax
case PTHREAD_SCOPE_PROCESS:
attr->contentionscope = contentionscope;
return 0;
case PTHREAD_SCOPE_SYSTEM:
return ENOTSUP;
110c34: b8 86 00 00 00 mov $0x86,%eax
default:
return EINVAL;
}
}
110c39: c9 leave
110c3a: c3 ret
00110c60 <pthread_attr_setstack>:
int pthread_attr_setstack(
pthread_attr_t *attr,
void *stackaddr,
size_t stacksize
)
{
110c60: 55 push %ebp
110c61: 89 e5 mov %esp,%ebp
110c63: 8b 45 08 mov 0x8(%ebp),%eax
110c66: 8b 55 10 mov 0x10(%ebp),%edx
if ( !attr || !attr->is_initialized )
110c69: 85 c0 test %eax,%eax
110c6b: 74 27 je 110c94 <pthread_attr_setstack+0x34>
110c6d: 8b 08 mov (%eax),%ecx
110c6f: 85 c9 test %ecx,%ecx
110c71: 74 21 je 110c94 <pthread_attr_setstack+0x34>
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
110c73: 8b 0d f8 db 12 00 mov 0x12dbf8,%ecx
110c79: d1 e1 shl %ecx
110c7b: 39 d1 cmp %edx,%ecx
110c7d: 77 0d ja 110c8c <pthread_attr_setstack+0x2c>
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
110c7f: 89 50 08 mov %edx,0x8(%eax)
attr->stackaddr = stackaddr;
110c82: 8b 55 0c mov 0xc(%ebp),%edx
110c85: 89 50 04 mov %edx,0x4(%eax)
return 0;
110c88: 31 c0 xor %eax,%eax
}
110c8a: c9 leave
110c8b: c3 ret
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
110c8c: 89 48 08 mov %ecx,0x8(%eax)
110c8f: eb f1 jmp 110c82 <pthread_attr_setstack+0x22>
110c91: 8d 76 00 lea 0x0(%esi),%esi
void *stackaddr,
size_t stacksize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110c94: b8 16 00 00 00 mov $0x16,%eax
else
attr->stacksize = stacksize;
attr->stackaddr = stackaddr;
return 0;
}
110c99: c9 leave
110c9a: c3 ret
00110c3c <pthread_attr_setstackaddr>:
int pthread_attr_setstackaddr(
pthread_attr_t *attr,
void *stackaddr
)
{
110c3c: 55 push %ebp
110c3d: 89 e5 mov %esp,%ebp
110c3f: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110c42: 85 c0 test %eax,%eax
110c44: 74 12 je 110c58 <pthread_attr_setstackaddr+0x1c>
110c46: 8b 10 mov (%eax),%edx
110c48: 85 d2 test %edx,%edx
110c4a: 74 0c je 110c58 <pthread_attr_setstackaddr+0x1c>
return EINVAL;
attr->stackaddr = stackaddr;
110c4c: 8b 55 0c mov 0xc(%ebp),%edx
110c4f: 89 50 04 mov %edx,0x4(%eax)
return 0;
110c52: 31 c0 xor %eax,%eax
}
110c54: c9 leave
110c55: c3 ret
110c56: 66 90 xchg %ax,%ax
pthread_attr_t *attr,
void *stackaddr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110c58: b8 16 00 00 00 mov $0x16,%eax
attr->stackaddr = stackaddr;
return 0;
}
110c5d: c9 leave
110c5e: c3 ret
00111b80 <pthread_attr_setstacksize>:
int pthread_attr_setstacksize(
pthread_attr_t *attr,
size_t stacksize
)
{
111b80: 55 push %ebp
111b81: 89 e5 mov %esp,%ebp
111b83: 8b 45 08 mov 0x8(%ebp),%eax
111b86: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
111b89: 85 c0 test %eax,%eax
111b8b: 74 23 je 111bb0 <pthread_attr_setstacksize+0x30>
111b8d: 8b 08 mov (%eax),%ecx
111b8f: 85 c9 test %ecx,%ecx
111b91: 74 1d je 111bb0 <pthread_attr_setstacksize+0x30>
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
111b93: 8b 0d 78 45 12 00 mov 0x124578,%ecx
111b99: d1 e1 shl %ecx
111b9b: 39 d1 cmp %edx,%ecx
111b9d: 77 09 ja 111ba8 <pthread_attr_setstacksize+0x28>
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
111b9f: 89 50 08 mov %edx,0x8(%eax)
return 0;
111ba2: 31 c0 xor %eax,%eax
}
111ba4: c9 leave
111ba5: c3 ret
111ba6: 66 90 xchg %ax,%ax
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
111ba8: 89 48 08 mov %ecx,0x8(%eax)
else
attr->stacksize = stacksize;
return 0;
111bab: 31 c0 xor %eax,%eax
}
111bad: c9 leave
111bae: c3 ret
111baf: 90 nop
pthread_attr_t *attr,
size_t stacksize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
111bb0: b8 16 00 00 00 mov $0x16,%eax
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
return 0;
}
111bb5: c9 leave
111bb6: c3 ret
0010b98c <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
10b98c: 55 push %ebp
10b98d: 89 e5 mov %esp,%ebp
10b98f: 57 push %edi
10b990: 56 push %esi
10b991: 53 push %ebx
10b992: 83 ec 2c sub $0x2c,%esp
10b995: 8b 5d 08 mov 0x8(%ebp),%ebx
10b998: 8b 7d 0c mov 0xc(%ebp),%edi
10b99b: 8b 75 10 mov 0x10(%ebp),%esi
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
10b99e: 85 db test %ebx,%ebx
10b9a0: 0f 84 82 00 00 00 je 10ba28 <pthread_barrier_init+0x9c>
return EINVAL;
if ( count == 0 )
10b9a6: 85 f6 test %esi,%esi
10b9a8: 74 7e je 10ba28 <pthread_barrier_init+0x9c>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10b9aa: 85 ff test %edi,%edi
10b9ac: 0f 84 92 00 00 00 je 10ba44 <pthread_barrier_init+0xb8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10b9b2: 8b 17 mov (%edi),%edx
10b9b4: 85 d2 test %edx,%edx
10b9b6: 74 70 je 10ba28 <pthread_barrier_init+0x9c>
return EINVAL;
switch ( the_attr->process_shared ) {
10b9b8: 8b 47 04 mov 0x4(%edi),%eax
10b9bb: 85 c0 test %eax,%eax
10b9bd: 75 69 jne 10ba28 <pthread_barrier_init+0x9c><== NEVER TAKEN
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
10b9bf: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
the_attributes.maximum_count = count;
10b9c6: 89 75 e4 mov %esi,-0x1c(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b9c9: a1 d0 8c 12 00 mov 0x128cd0,%eax
10b9ce: 40 inc %eax
10b9cf: a3 d0 8c 12 00 mov %eax,0x128cd0
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
_Objects_Allocate( &_POSIX_Barrier_Information );
10b9d4: 83 ec 0c sub $0xc,%esp
10b9d7: 68 20 91 12 00 push $0x129120
10b9dc: e8 03 21 00 00 call 10dae4 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
10b9e1: 83 c4 10 add $0x10,%esp
10b9e4: 85 c0 test %eax,%eax
10b9e6: 74 50 je 10ba38 <pthread_barrier_init+0xac>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
10b9e8: 83 ec 08 sub $0x8,%esp
10b9eb: 8d 55 e0 lea -0x20(%ebp),%edx
10b9ee: 52 push %edx
10b9ef: 8d 50 10 lea 0x10(%eax),%edx
10b9f2: 52 push %edx
10b9f3: 89 45 d4 mov %eax,-0x2c(%ebp)
10b9f6: e8 dd 16 00 00 call 10d0d8 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b9fb: 8b 45 d4 mov -0x2c(%ebp),%eax
10b9fe: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10ba01: 0f b7 f2 movzwl %dx,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10ba04: 8b 0d 3c 91 12 00 mov 0x12913c,%ecx
10ba0a: 89 04 b1 mov %eax,(%ecx,%esi,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10ba0d: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
10ba14: 89 13 mov %edx,(%ebx)
_Thread_Enable_dispatch();
10ba16: e8 35 30 00 00 call 10ea50 <_Thread_Enable_dispatch>
return 0;
10ba1b: 83 c4 10 add $0x10,%esp
10ba1e: 31 c0 xor %eax,%eax
}
10ba20: 8d 65 f4 lea -0xc(%ebp),%esp
10ba23: 5b pop %ebx
10ba24: 5e pop %esi
10ba25: 5f pop %edi
10ba26: c9 leave
10ba27: c3 ret
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10ba28: 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;
}
10ba2d: 8d 65 f4 lea -0xc(%ebp),%esp
10ba30: 5b pop %ebx
10ba31: 5e pop %esi
10ba32: 5f pop %edi
10ba33: c9 leave
10ba34: c3 ret
10ba35: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
10ba38: e8 13 30 00 00 call 10ea50 <_Thread_Enable_dispatch>
return EAGAIN;
10ba3d: b8 0b 00 00 00 mov $0xb,%eax
10ba42: eb e9 jmp 10ba2d <pthread_barrier_init+0xa1>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
10ba44: 83 ec 0c sub $0xc,%esp
10ba47: 8d 7d d8 lea -0x28(%ebp),%edi
10ba4a: 57 push %edi
10ba4b: e8 7c fe ff ff call 10b8cc <pthread_barrierattr_init>
10ba50: 83 c4 10 add $0x10,%esp
10ba53: e9 5a ff ff ff jmp 10b9b2 <pthread_barrier_init+0x26>
0010ba58 <pthread_barrier_wait>:
*/
int pthread_barrier_wait(
pthread_barrier_t *barrier
)
{
10ba58: 55 push %ebp
10ba59: 89 e5 mov %esp,%ebp
10ba5b: 83 ec 18 sub $0x18,%esp
10ba5e: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_Barrier_Control *the_barrier = NULL;
Objects_Locations location;
if ( !barrier )
10ba61: 85 c0 test %eax,%eax
10ba63: 74 4f je 10bab4 <pthread_barrier_wait+0x5c>
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Get (
pthread_barrier_t *barrier,
Objects_Locations *location
)
{
return (POSIX_Barrier_Control *) _Objects_Get(
10ba65: 51 push %ecx
return EINVAL;
the_barrier = _POSIX_Barrier_Get( barrier, &location );
10ba66: 8d 55 f4 lea -0xc(%ebp),%edx
10ba69: 52 push %edx
10ba6a: ff 30 pushl (%eax)
10ba6c: 68 20 91 12 00 push $0x129120
10ba71: e8 26 25 00 00 call 10df9c <_Objects_Get>
switch ( location ) {
10ba76: 83 c4 10 add $0x10,%esp
10ba79: 8b 55 f4 mov -0xc(%ebp),%edx
10ba7c: 85 d2 test %edx,%edx
10ba7e: 75 34 jne 10bab4 <pthread_barrier_wait+0x5c>
case OBJECTS_LOCAL:
_CORE_barrier_Wait(
10ba80: 83 ec 0c sub $0xc,%esp
10ba83: 6a 00 push $0x0
10ba85: 6a 00 push $0x0
10ba87: 6a 01 push $0x1
10ba89: ff 70 08 pushl 0x8(%eax)
10ba8c: 83 c0 10 add $0x10,%eax
10ba8f: 50 push %eax
10ba90: e8 77 16 00 00 call 10d10c <_CORE_barrier_Wait>
the_barrier->Object.id,
true,
0,
NULL
);
_Thread_Enable_dispatch();
10ba95: 83 c4 20 add $0x20,%esp
10ba98: e8 b3 2f 00 00 call 10ea50 <_Thread_Enable_dispatch>
return _POSIX_Barrier_Translate_core_barrier_return_code(
10ba9d: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code );
10baa0: a1 b8 92 12 00 mov 0x1292b8,%eax
true,
0,
NULL
);
_Thread_Enable_dispatch();
return _POSIX_Barrier_Translate_core_barrier_return_code(
10baa5: ff 70 34 pushl 0x34(%eax)
10baa8: e8 e7 5b 00 00 call 111694 <_POSIX_Barrier_Translate_core_barrier_return_code>
10baad: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10bab0: c9 leave
10bab1: c3 ret
10bab2: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10bab4: b8 16 00 00 00 mov $0x16,%eax
}
10bab9: c9 leave
10baba: c3 ret
0010b884 <pthread_barrierattr_destroy>:
*/
int pthread_barrierattr_destroy(
pthread_barrierattr_t *attr
)
{
10b884: 55 push %ebp
10b885: 89 e5 mov %esp,%ebp
10b887: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10b88a: 85 c0 test %eax,%eax
10b88c: 74 12 je 10b8a0 <pthread_barrierattr_destroy+0x1c>
10b88e: 8b 10 mov (%eax),%edx
10b890: 85 d2 test %edx,%edx
10b892: 74 0c je 10b8a0 <pthread_barrierattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10b894: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10b89a: 31 c0 xor %eax,%eax
}
10b89c: c9 leave
10b89d: c3 ret
10b89e: 66 90 xchg %ax,%ax
int pthread_barrierattr_destroy(
pthread_barrierattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10b8a0: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10b8a5: c9 leave
10b8a6: c3 ret
0010b134 <pthread_cancel>:
*/
int pthread_cancel(
pthread_t thread
)
{
10b134: 55 push %ebp
10b135: 89 e5 mov %esp,%ebp
10b137: 83 ec 18 sub $0x18,%esp
/*
* Don't even think about deleting a resource from an ISR.
*/
if ( _ISR_Is_in_progress() )
10b13a: a1 54 8e 12 00 mov 0x128e54,%eax
10b13f: 85 c0 test %eax,%eax
10b141: 74 09 je 10b14c <pthread_cancel+0x18>
return EPROTO;
10b143: b8 47 00 00 00 mov $0x47,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b148: c9 leave
10b149: c3 ret
10b14a: 66 90 xchg %ax,%ax
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
10b14c: 51 push %ecx
*/
if ( _ISR_Is_in_progress() )
return EPROTO;
the_thread = _POSIX_Threads_Get( thread, &location );
10b14d: 8d 45 f4 lea -0xc(%ebp),%eax
10b150: 50 push %eax
10b151: ff 75 08 pushl 0x8(%ebp)
10b154: 68 40 8b 12 00 push $0x128b40
10b159: e8 32 21 00 00 call 10d290 <_Objects_Get>
switch ( location ) {
10b15e: 83 c4 10 add $0x10,%esp
10b161: 8b 55 f4 mov -0xc(%ebp),%edx
10b164: 85 d2 test %edx,%edx
10b166: 75 20 jne 10b188 <pthread_cancel+0x54>
case OBJECTS_LOCAL:
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
thread_support->cancelation_requested = 1;
10b168: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
10b16e: c7 82 e0 00 00 00 01 movl $0x1,0xe0(%edx)
10b175: 00 00 00
/* This enables dispatch implicitly */
_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( the_thread );
10b178: 83 ec 0c sub $0xc,%esp
10b17b: 50 push %eax
10b17c: e8 5b 55 00 00 call 1106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>
return 0;
10b181: 83 c4 10 add $0x10,%esp
10b184: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b186: c9 leave
10b187: c3 ret
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10b188: b8 16 00 00 00 mov $0x16,%eax
}
10b18d: c9 leave
10b18e: c3 ret
0010af94 <pthread_cleanup_pop>:
*/
void pthread_cleanup_pop(
int execute
)
{
10af94: 55 push %ebp
10af95: 89 e5 mov %esp,%ebp
10af97: 57 push %edi
10af98: 56 push %esi
10af99: 53 push %ebx
10af9a: 83 ec 0c sub $0xc,%esp
10af9d: 8b 5d 08 mov 0x8(%ebp),%ebx
POSIX_Cancel_Handler_control tmp_handler;
Chain_Control *handler_stack;
POSIX_API_Control *thread_support;
ISR_Level level;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10afa0: a1 38 7f 12 00 mov 0x127f38,%eax
10afa5: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10afab: 8b 15 50 79 12 00 mov 0x127950,%edx
10afb1: 42 inc %edx
10afb2: 89 15 50 79 12 00 mov %edx,0x127950
* ensure that we do not get prempted and deleted while we are holding
* memory that needs to be freed.
*/
_Thread_Disable_dispatch();
_ISR_Disable( level );
10afb8: 9c pushf
10afb9: fa cli
10afba: 5e pop %esi
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10afbb: 8d 90 e8 00 00 00 lea 0xe8(%eax),%edx
if ( _Chain_Is_empty( handler_stack ) ) {
10afc1: 39 90 e4 00 00 00 cmp %edx,0xe4(%eax)
10afc7: 74 47 je 10b010 <pthread_cleanup_pop+0x7c>
_Thread_Enable_dispatch();
_ISR_Enable( level );
return;
}
handler = (POSIX_Cancel_Handler_control *)
10afc9: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10afcf: 8b 08 mov (%eax),%ecx
previous = the_node->previous;
10afd1: 8b 50 04 mov 0x4(%eax),%edx
next->previous = previous;
10afd4: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
10afd7: 89 0a mov %ecx,(%edx)
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
10afd9: 56 push %esi
10afda: 9d popf
10afdb: 8b 70 08 mov 0x8(%eax),%esi
10afde: 8b 78 0c mov 0xc(%eax),%edi
tmp_handler = *handler;
_Workspace_Free( handler );
10afe1: 83 ec 0c sub $0xc,%esp
10afe4: 50 push %eax
10afe5: e8 3a 3a 00 00 call 10ea24 <_Workspace_Free>
_Thread_Enable_dispatch();
10afea: e8 b5 29 00 00 call 10d9a4 <_Thread_Enable_dispatch>
if ( execute )
10afef: 83 c4 10 add $0x10,%esp
10aff2: 85 db test %ebx,%ebx
10aff4: 75 0a jne 10b000 <pthread_cleanup_pop+0x6c>
(*tmp_handler.routine)( tmp_handler.arg );
}
10aff6: 8d 65 f4 lea -0xc(%ebp),%esp
10aff9: 5b pop %ebx
10affa: 5e pop %esi
10affb: 5f pop %edi
10affc: c9 leave
10affd: c3 ret
10affe: 66 90 xchg %ax,%ax
_Workspace_Free( handler );
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
10b000: 89 7d 08 mov %edi,0x8(%ebp)
10b003: 89 f0 mov %esi,%eax
}
10b005: 8d 65 f4 lea -0xc(%ebp),%esp
10b008: 5b pop %ebx
10b009: 5e pop %esi
10b00a: 5f pop %edi
10b00b: c9 leave
_Workspace_Free( handler );
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
10b00c: ff e0 jmp *%eax
10b00e: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
_ISR_Disable( level );
if ( _Chain_Is_empty( handler_stack ) ) {
_Thread_Enable_dispatch();
10b010: e8 8f 29 00 00 call 10d9a4 <_Thread_Enable_dispatch>
_ISR_Enable( level );
10b015: 56 push %esi
10b016: 9d popf
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
}
10b017: 8d 65 f4 lea -0xc(%ebp),%esp
10b01a: 5b pop %ebx
10b01b: 5e pop %esi
10b01c: 5f pop %edi
10b01d: c9 leave
10b01e: c3 ret
0010b360 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
10b360: 55 push %ebp
10b361: 89 e5 mov %esp,%ebp
10b363: 56 push %esi
10b364: 53 push %ebx
10b365: 8b 5d 08 mov 0x8(%ebp),%ebx
10b368: 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 )
10b36b: 85 db test %ebx,%ebx
10b36d: 74 4d je 10b3bc <pthread_cleanup_push+0x5c>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b36f: a1 f0 8f 12 00 mov 0x128ff0,%eax
10b374: 40 inc %eax
10b375: a3 f0 8f 12 00 mov %eax,0x128ff0
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
10b37a: 83 ec 0c sub $0xc,%esp
10b37d: 6a 10 push $0x10
10b37f: e8 00 42 00 00 call 10f584 <_Workspace_Allocate>
if ( handler ) {
10b384: 83 c4 10 add $0x10,%esp
10b387: 85 c0 test %eax,%eax
10b389: 74 25 je 10b3b0 <pthread_cleanup_push+0x50><== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b38b: 8b 15 d8 95 12 00 mov 0x1295d8,%edx
handler_stack = &thread_support->Cancellation_Handlers;
10b391: 8b 92 ec 00 00 00 mov 0xec(%edx),%edx
10b397: 81 c2 e4 00 00 00 add $0xe4,%edx
handler->routine = routine;
10b39d: 89 58 08 mov %ebx,0x8(%eax)
handler->arg = arg;
10b3a0: 89 70 0c mov %esi,0xc(%eax)
_Chain_Append( handler_stack, &handler->Node );
10b3a3: 83 ec 08 sub $0x8,%esp
10b3a6: 50 push %eax
10b3a7: 52 push %edx
10b3a8: e8 c3 17 00 00 call 10cb70 <_Chain_Append>
10b3ad: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
}
10b3b0: 8d 65 f8 lea -0x8(%ebp),%esp
10b3b3: 5b pop %ebx
10b3b4: 5e pop %esi
10b3b5: c9 leave
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
}
_Thread_Enable_dispatch();
10b3b6: e9 d5 30 00 00 jmp 10e490 <_Thread_Enable_dispatch>
10b3bb: 90 nop
}
10b3bc: 8d 65 f8 lea -0x8(%ebp),%esp
10b3bf: 5b pop %ebx
10b3c0: 5e pop %esi
10b3c1: c9 leave
10b3c2: c3 ret
0010c054 <pthread_cond_destroy>:
*/
int pthread_cond_destroy(
pthread_cond_t *cond
)
{
10c054: 55 push %ebp
10c055: 89 e5 mov %esp,%ebp
10c057: 53 push %ebx
10c058: 83 ec 1c sub $0x1c,%esp
POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
the_cond = _POSIX_Condition_variables_Get( cond, &location );
10c05b: 8d 45 f4 lea -0xc(%ebp),%eax
10c05e: 50 push %eax
10c05f: ff 75 08 pushl 0x8(%ebp)
10c062: e8 65 00 00 00 call 10c0cc <_POSIX_Condition_variables_Get>
10c067: 89 c3 mov %eax,%ebx
switch ( location ) {
10c069: 83 c4 10 add $0x10,%esp
10c06c: 8b 4d f4 mov -0xc(%ebp),%ecx
10c06f: 85 c9 test %ecx,%ecx
10c071: 75 25 jne 10c098 <pthread_cond_destroy+0x44>
case OBJECTS_LOCAL:
if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
10c073: 83 ec 0c sub $0xc,%esp
10c076: 8d 40 18 lea 0x18(%eax),%eax
10c079: 50 push %eax
10c07a: e8 c1 3d 00 00 call 10fe40 <_Thread_queue_First>
10c07f: 83 c4 10 add $0x10,%esp
10c082: 85 c0 test %eax,%eax
10c084: 74 1e je 10c0a4 <pthread_cond_destroy+0x50>
_Thread_Enable_dispatch();
10c086: e8 9d 36 00 00 call 10f728 <_Thread_Enable_dispatch>
return EBUSY;
10c08b: b8 10 00 00 00 mov $0x10,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c090: 8b 5d fc mov -0x4(%ebp),%ebx
10c093: c9 leave
10c094: c3 ret
10c095: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c098: b8 16 00 00 00 mov $0x16,%eax
}
10c09d: 8b 5d fc mov -0x4(%ebp),%ebx
10c0a0: c9 leave
10c0a1: c3 ret
10c0a2: 66 90 xchg %ax,%ax
if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
_Thread_Enable_dispatch();
return EBUSY;
}
_Objects_Close(
10c0a4: 83 ec 08 sub $0x8,%esp
10c0a7: 53 push %ebx
10c0a8: 68 a0 a1 12 00 push $0x12a1a0
10c0ad: e8 86 27 00 00 call 10e838 <_Objects_Close>
RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
POSIX_Condition_variables_Control *the_condition_variable
)
{
_Objects_Free(
10c0b2: 58 pop %eax
10c0b3: 5a pop %edx
10c0b4: 53 push %ebx
10c0b5: 68 a0 a1 12 00 push $0x12a1a0
10c0ba: e8 75 2a 00 00 call 10eb34 <_Objects_Free>
&_POSIX_Condition_variables_Information,
&the_cond->Object
);
_POSIX_Condition_variables_Free( the_cond );
_Thread_Enable_dispatch();
10c0bf: e8 64 36 00 00 call 10f728 <_Thread_Enable_dispatch>
return 0;
10c0c4: 83 c4 10 add $0x10,%esp
10c0c7: 31 c0 xor %eax,%eax
10c0c9: eb d2 jmp 10c09d <pthread_cond_destroy+0x49>
0010c120 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
10c120: 55 push %ebp
10c121: 89 e5 mov %esp,%ebp
10c123: 53 push %ebx
10c124: 83 ec 14 sub $0x14,%esp
10c127: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
10c12a: 85 db test %ebx,%ebx
10c12c: 0f 84 86 00 00 00 je 10c1b8 <pthread_cond_init+0x98>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10c132: 83 7b 04 01 cmpl $0x1,0x4(%ebx)
10c136: 74 06 je 10c13e <pthread_cond_init+0x1e><== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
10c138: 8b 03 mov (%ebx),%eax
10c13a: 85 c0 test %eax,%eax
10c13c: 75 0a jne 10c148 <pthread_cond_init+0x28>
return EINVAL;
10c13e: b8 16 00 00 00 mov $0x16,%eax
*cond = the_cond->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10c143: 8b 5d fc mov -0x4(%ebp),%ebx
10c146: c9 leave
10c147: c3 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c148: a1 b0 9c 12 00 mov 0x129cb0,%eax
10c14d: 40 inc %eax
10c14e: a3 b0 9c 12 00 mov %eax,0x129cb0
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
10c153: 83 ec 0c sub $0xc,%esp
10c156: 68 a0 a1 12 00 push $0x12a1a0
10c15b: e8 5c 26 00 00 call 10e7bc <_Objects_Allocate>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
10c160: 83 c4 10 add $0x10,%esp
10c163: 85 c0 test %eax,%eax
10c165: 74 5d je 10c1c4 <pthread_cond_init+0xa4>
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
10c167: 8b 53 04 mov 0x4(%ebx),%edx
10c16a: 89 50 10 mov %edx,0x10(%eax)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
10c16d: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)
_Thread_queue_Initialize(
10c174: 6a 74 push $0x74
10c176: 68 00 08 00 10 push $0x10000800
10c17b: 6a 00 push $0x0
10c17d: 8d 50 18 lea 0x18(%eax),%edx
10c180: 52 push %edx
10c181: 89 45 f4 mov %eax,-0xc(%ebp)
10c184: e8 33 3d 00 00 call 10febc <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c189: 8b 45 f4 mov -0xc(%ebp),%eax
10c18c: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10c18f: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c192: 8b 0d bc a1 12 00 mov 0x12a1bc,%ecx
10c198: 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;
10c19b: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
10c1a2: 8b 45 08 mov 0x8(%ebp),%eax
10c1a5: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10c1a7: e8 7c 35 00 00 call 10f728 <_Thread_Enable_dispatch>
return 0;
10c1ac: 83 c4 10 add $0x10,%esp
10c1af: 31 c0 xor %eax,%eax
}
10c1b1: 8b 5d fc mov -0x4(%ebp),%ebx
10c1b4: c9 leave
10c1b5: c3 ret
10c1b6: 66 90 xchg %ax,%ax
{
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
else the_attr = &_POSIX_Condition_variables_Default_attributes;
10c1b8: bb 3c 33 12 00 mov $0x12333c,%ebx
10c1bd: e9 70 ff ff ff jmp 10c132 <pthread_cond_init+0x12>
10c1c2: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
_Thread_Enable_dispatch();
10c1c4: e8 5f 35 00 00 call 10f728 <_Thread_Enable_dispatch>
return ENOMEM;
10c1c9: b8 0c 00 00 00 mov $0xc,%eax
10c1ce: e9 70 ff ff ff jmp 10c143 <pthread_cond_init+0x23>
0010bfb0 <pthread_condattr_destroy>:
*/
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
10bfb0: 55 push %ebp
10bfb1: 89 e5 mov %esp,%ebp
10bfb3: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10bfb6: 85 c0 test %eax,%eax
10bfb8: 74 12 je 10bfcc <pthread_condattr_destroy+0x1c>
10bfba: 8b 10 mov (%eax),%edx
10bfbc: 85 d2 test %edx,%edx
10bfbe: 74 0c je 10bfcc <pthread_condattr_destroy+0x1c><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
10bfc0: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10bfc6: 31 c0 xor %eax,%eax
}
10bfc8: c9 leave
10bfc9: c3 ret
10bfca: 66 90 xchg %ax,%ax
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10bfcc: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10bfd1: c9 leave
10bfd2: c3 ret
0010bfd4 <pthread_condattr_getpshared>:
int pthread_condattr_getpshared(
const pthread_condattr_t *attr,
int *pshared
)
{
10bfd4: 55 push %ebp
10bfd5: 89 e5 mov %esp,%ebp
10bfd7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr )
10bfda: 85 c0 test %eax,%eax
10bfdc: 74 0e je 10bfec <pthread_condattr_getpshared+0x18>
return EINVAL;
*pshared = attr->process_shared;
10bfde: 8b 50 04 mov 0x4(%eax),%edx
10bfe1: 8b 45 0c mov 0xc(%ebp),%eax
10bfe4: 89 10 mov %edx,(%eax)
return 0;
10bfe6: 31 c0 xor %eax,%eax
}
10bfe8: c9 leave
10bfe9: c3 ret
10bfea: 66 90 xchg %ax,%ax
const pthread_condattr_t *attr,
int *pshared
)
{
if ( !attr )
return EINVAL;
10bfec: b8 16 00 00 00 mov $0x16,%eax
*pshared = attr->process_shared;
return 0;
}
10bff1: c9 leave
10bff2: c3 ret
0010bff4 <pthread_condattr_init>:
*/
int pthread_condattr_init(
pthread_condattr_t *attr
)
{
10bff4: 55 push %ebp
10bff5: 89 e5 mov %esp,%ebp
10bff7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr )
10bffa: 85 c0 test %eax,%eax
10bffc: 74 16 je 10c014 <pthread_condattr_init+0x20><== NEVER TAKEN
return EINVAL;
*attr = _POSIX_Condition_variables_Default_attributes;
10bffe: 8b 15 3c 33 12 00 mov 0x12333c,%edx
10c004: 8b 0d 40 33 12 00 mov 0x123340,%ecx
10c00a: 89 10 mov %edx,(%eax)
10c00c: 89 48 04 mov %ecx,0x4(%eax)
return 0;
10c00f: 31 c0 xor %eax,%eax
}
10c011: c9 leave
10c012: c3 ret
10c013: 90 nop
int pthread_condattr_init(
pthread_condattr_t *attr
)
{
if ( !attr )
return EINVAL;
10c014: b8 16 00 00 00 mov $0x16,%eax
*attr = _POSIX_Condition_variables_Default_attributes;
return 0;
}
10c019: c9 leave
10c01a: c3 ret
0010c01c <pthread_condattr_setpshared>:
int pthread_condattr_setpshared(
pthread_condattr_t *attr,
int pshared
)
{
10c01c: 55 push %ebp
10c01d: 89 e5 mov %esp,%ebp
10c01f: 8b 45 08 mov 0x8(%ebp),%eax
10c022: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr )
10c025: 85 c0 test %eax,%eax
10c027: 74 05 je 10c02e <pthread_condattr_setpshared+0x12>
return EINVAL;
switch ( pshared ) {
10c029: 83 fa 01 cmp $0x1,%edx
10c02c: 76 0a jbe 10c038 <pthread_condattr_setpshared+0x1c>
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10c02e: b8 16 00 00 00 mov $0x16,%eax
}
}
10c033: c9 leave
10c034: c3 ret
10c035: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10c038: 89 50 04 mov %edx,0x4(%eax)
return 0;
10c03b: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10c03d: c9 leave
10c03e: c3 ret
0010b6c8 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
10b6c8: 55 push %ebp
10b6c9: 89 e5 mov %esp,%ebp
10b6cb: 57 push %edi
10b6cc: 56 push %esi
10b6cd: 53 push %ebx
10b6ce: 83 ec 5c sub $0x5c,%esp
10b6d1: 8b 5d 0c mov 0xc(%ebp),%ebx
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
10b6d4: 8b 75 10 mov 0x10(%ebp),%esi
10b6d7: 85 f6 test %esi,%esi
10b6d9: 0f 84 8d 01 00 00 je 10b86c <pthread_create+0x1a4>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10b6df: 85 db test %ebx,%ebx
10b6e1: 74 65 je 10b748 <pthread_create+0x80>
if ( !the_attr->is_initialized )
10b6e3: 8b 0b mov (%ebx),%ecx
10b6e5: 85 c9 test %ecx,%ecx
10b6e7: 74 1e je 10b707 <pthread_create+0x3f>
* 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) )
10b6e9: 8b 53 04 mov 0x4(%ebx),%edx
10b6ec: 85 d2 test %edx,%edx
10b6ee: 74 0a je 10b6fa <pthread_create+0x32>
10b6f0: a1 78 45 12 00 mov 0x124578,%eax
10b6f5: 39 43 08 cmp %eax,0x8(%ebx)
10b6f8: 72 0d jb 10b707 <pthread_create+0x3f>
* 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 ) {
10b6fa: 8b 43 10 mov 0x10(%ebx),%eax
10b6fd: 83 f8 01 cmp $0x1,%eax
10b700: 74 4e je 10b750 <pthread_create+0x88>
10b702: 83 f8 02 cmp $0x2,%eax
10b705: 74 11 je 10b718 <pthread_create+0x50>
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
return EINVAL;
10b707: ba 16 00 00 00 mov $0x16,%edx
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10b70c: 89 d0 mov %edx,%eax
10b70e: 8d 65 f4 lea -0xc(%ebp),%esp
10b711: 5b pop %ebx
10b712: 5e pop %esi
10b713: 5f pop %edi
10b714: c9 leave
10b715: c3 ret
10b716: 66 90 xchg %ax,%ax
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
10b718: 8b 4b 14 mov 0x14(%ebx),%ecx
10b71b: 89 4d b0 mov %ecx,-0x50(%ebp)
schedparam = the_attr->schedparam;
10b71e: 8d 45 c4 lea -0x3c(%ebp),%eax
10b721: 89 45 b4 mov %eax,-0x4c(%ebp)
10b724: 8d 73 18 lea 0x18(%ebx),%esi
10b727: b9 07 00 00 00 mov $0x7,%ecx
10b72c: 89 c7 mov %eax,%edi
10b72e: 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 )
10b730: 8b 43 0c mov 0xc(%ebx),%eax
10b733: 85 c0 test %eax,%eax
10b735: 74 49 je 10b780 <pthread_create+0xb8> <== ALWAYS TAKEN
return ENOTSUP;
10b737: ba 86 00 00 00 mov $0x86,%edx
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10b73c: 89 d0 mov %edx,%eax
10b73e: 8d 65 f4 lea -0xc(%ebp),%esp
10b741: 5b pop %ebx
10b742: 5e pop %esi
10b743: 5f pop %edi
10b744: c9 leave
10b745: c3 ret
10b746: 66 90 xchg %ax,%ax
int rc;
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10b748: bb e0 1e 12 00 mov $0x121ee0,%ebx
10b74d: eb 94 jmp 10b6e3 <pthread_create+0x1b>
10b74f: 90 nop
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b750: a1 18 8e 12 00 mov 0x128e18,%eax
10b755: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
schedpolicy = api->schedpolicy;
10b75b: 8b 8e 84 00 00 00 mov 0x84(%esi),%ecx
10b761: 89 4d b0 mov %ecx,-0x50(%ebp)
schedparam = api->schedparam;
10b764: 8d 45 c4 lea -0x3c(%ebp),%eax
10b767: 89 45 b4 mov %eax,-0x4c(%ebp)
10b76a: 81 c6 88 00 00 00 add $0x88,%esi
10b770: b9 07 00 00 00 mov $0x7,%ecx
10b775: 89 c7 mov %eax,%edi
10b777: 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 )
10b779: 8b 43 0c mov 0xc(%ebx),%eax
10b77c: 85 c0 test %eax,%eax
10b77e: 75 b7 jne 10b737 <pthread_create+0x6f>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
10b780: 83 ec 0c sub $0xc,%esp
10b783: ff 75 c4 pushl -0x3c(%ebp)
10b786: e8 95 62 00 00 call 111a20 <_POSIX_Priority_Is_valid>
10b78b: 83 c4 10 add $0x10,%esp
10b78e: 84 c0 test %al,%al
10b790: 0f 84 71 ff ff ff je 10b707 <pthread_create+0x3f> <== NEVER TAKEN
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
10b796: 8b 7d c4 mov -0x3c(%ebp),%edi
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10b799: 0f b6 35 7c 45 12 00 movzbl 0x12457c,%esi
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
10b7a0: 8d 45 e0 lea -0x20(%ebp),%eax
10b7a3: 50 push %eax
10b7a4: 8d 45 e4 lea -0x1c(%ebp),%eax
10b7a7: 50 push %eax
10b7a8: ff 75 b4 pushl -0x4c(%ebp)
10b7ab: ff 75 b0 pushl -0x50(%ebp)
10b7ae: e8 89 62 00 00 call 111a3c <_POSIX_Thread_Translate_sched_param>
10b7b3: 89 c2 mov %eax,%edx
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
10b7b5: 83 c4 10 add $0x10,%esp
10b7b8: 85 c0 test %eax,%eax
10b7ba: 0f 85 4c ff ff ff jne 10b70c <pthread_create+0x44>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
10b7c0: 83 ec 0c sub $0xc,%esp
10b7c3: ff 35 1c 89 12 00 pushl 0x12891c
10b7c9: 89 45 a0 mov %eax,-0x60(%ebp)
10b7cc: e8 bf 17 00 00 call 10cf90 <_API_Mutex_Lock>
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
10b7d1: c7 04 24 00 8b 12 00 movl $0x128b00,(%esp)
10b7d8: e8 df 21 00 00 call 10d9bc <_Objects_Allocate>
10b7dd: 89 45 ac mov %eax,-0x54(%ebp)
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
10b7e0: 83 c4 10 add $0x10,%esp
10b7e3: 85 c0 test %eax,%eax
10b7e5: 8b 55 a0 mov -0x60(%ebp),%edx
10b7e8: 0f 84 0f 01 00 00 je 10b8fd <pthread_create+0x235>
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
10b7ee: 8b 4d e0 mov -0x20(%ebp),%ecx
10b7f1: 8b 45 e4 mov -0x1c(%ebp),%eax
10b7f4: 89 45 a4 mov %eax,-0x5c(%ebp)
10b7f7: 8b 43 08 mov 0x8(%ebx),%eax
10b7fa: 89 45 a8 mov %eax,-0x58(%ebp)
10b7fd: a1 78 45 12 00 mov 0x124578,%eax
10b802: d1 e0 shl %eax
10b804: 3b 45 a8 cmp -0x58(%ebp),%eax
10b807: 73 03 jae 10b80c <pthread_create+0x144>
10b809: 8b 45 a8 mov -0x58(%ebp),%eax
10b80c: 83 ec 04 sub $0x4,%esp
10b80f: 6a 00 push $0x0
10b811: 6a 00 push $0x0
10b813: 51 push %ecx
10b814: ff 75 a4 pushl -0x5c(%ebp)
10b817: 6a 01 push $0x1
10b819: 81 e6 ff 00 00 00 and $0xff,%esi
10b81f: 29 fe sub %edi,%esi
10b821: 56 push %esi
10b822: 6a 01 push $0x1
10b824: 50 push %eax
10b825: ff 73 04 pushl 0x4(%ebx)
10b828: ff 75 ac pushl -0x54(%ebp)
10b82b: 68 00 8b 12 00 push $0x128b00
10b830: 89 55 a0 mov %edx,-0x60(%ebp)
10b833: e8 88 31 00 00 call 10e9c0 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
10b838: 83 c4 30 add $0x30,%esp
10b83b: 84 c0 test %al,%al
10b83d: 8b 55 a0 mov -0x60(%ebp),%edx
10b840: 75 34 jne 10b876 <pthread_create+0x1ae>
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
10b842: 83 ec 08 sub $0x8,%esp
10b845: ff 75 ac pushl -0x54(%ebp)
10b848: 68 00 8b 12 00 push $0x128b00
10b84d: e8 e2 24 00 00 call 10dd34 <_Objects_Free>
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
10b852: 59 pop %ecx
10b853: ff 35 1c 89 12 00 pushl 0x12891c
10b859: e8 7a 17 00 00 call 10cfd8 <_API_Mutex_Unlock>
return EAGAIN;
10b85e: 83 c4 10 add $0x10,%esp
10b861: ba 0b 00 00 00 mov $0xb,%edx
10b866: e9 a1 fe ff ff jmp 10b70c <pthread_create+0x44>
10b86b: 90 nop
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
10b86c: ba 0e 00 00 00 mov $0xe,%edx
10b871: e9 96 fe ff ff jmp 10b70c <pthread_create+0x44>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10b876: 8b 4d ac mov -0x54(%ebp),%ecx
10b879: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
10b87f: 89 4d a8 mov %ecx,-0x58(%ebp)
api->Attributes = *the_attr;
10b882: b9 10 00 00 00 mov $0x10,%ecx
10b887: 8b 7d a8 mov -0x58(%ebp),%edi
10b88a: 89 de mov %ebx,%esi
10b88c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
api->detachstate = the_attr->detachstate;
10b88e: 8b 43 3c mov 0x3c(%ebx),%eax
10b891: 8b 4d a8 mov -0x58(%ebp),%ecx
10b894: 89 41 40 mov %eax,0x40(%ecx)
api->schedpolicy = schedpolicy;
10b897: 8b 45 b0 mov -0x50(%ebp),%eax
10b89a: 89 81 84 00 00 00 mov %eax,0x84(%ecx)
api->schedparam = schedparam;
10b8a0: 89 cf mov %ecx,%edi
10b8a2: 81 c7 88 00 00 00 add $0x88,%edi
10b8a8: b9 07 00 00 00 mov $0x7,%ecx
10b8ad: 8b 75 b4 mov -0x4c(%ebp),%esi
10b8b0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
10b8b2: 83 ec 0c sub $0xc,%esp
10b8b5: 6a 00 push $0x0
10b8b7: ff 75 14 pushl 0x14(%ebp)
10b8ba: ff 75 10 pushl 0x10(%ebp)
10b8bd: 6a 01 push $0x1
10b8bf: ff 75 ac pushl -0x54(%ebp)
10b8c2: 89 55 a0 mov %edx,-0x60(%ebp)
10b8c5: e8 6e 3a 00 00 call 10f338 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
10b8ca: 83 c4 20 add $0x20,%esp
10b8cd: 83 7d b0 04 cmpl $0x4,-0x50(%ebp)
10b8d1: 8b 55 a0 mov -0x60(%ebp),%edx
10b8d4: 74 42 je 10b918 <pthread_create+0x250>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
10b8d6: 8b 45 ac mov -0x54(%ebp),%eax
10b8d9: 8b 48 08 mov 0x8(%eax),%ecx
10b8dc: 8b 45 08 mov 0x8(%ebp),%eax
10b8df: 89 08 mov %ecx,(%eax)
_RTEMS_Unlock_allocator();
10b8e1: 83 ec 0c sub $0xc,%esp
10b8e4: ff 35 1c 89 12 00 pushl 0x12891c
10b8ea: 89 55 a0 mov %edx,-0x60(%ebp)
10b8ed: e8 e6 16 00 00 call 10cfd8 <_API_Mutex_Unlock>
return 0;
10b8f2: 83 c4 10 add $0x10,%esp
10b8f5: 8b 55 a0 mov -0x60(%ebp),%edx
10b8f8: e9 0f fe ff ff jmp 10b70c <pthread_create+0x44>
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
10b8fd: 83 ec 0c sub $0xc,%esp
10b900: ff 35 1c 89 12 00 pushl 0x12891c
10b906: e8 cd 16 00 00 call 10cfd8 <_API_Mutex_Unlock>
return EAGAIN;
10b90b: 83 c4 10 add $0x10,%esp
10b90e: ba 0b 00 00 00 mov $0xb,%edx
10b913: e9 f4 fd ff ff jmp 10b70c <pthread_create+0x44>
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10b918: 83 ec 0c sub $0xc,%esp
&api->Sporadic_timer,
_Timespec_To_ticks( &api->schedparam.sched_ss_repl_period )
10b91b: 8b 45 a8 mov -0x58(%ebp),%eax
10b91e: 05 90 00 00 00 add $0x90,%eax
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10b923: 50 push %eax
10b924: e8 ab 3b 00 00 call 10f4d4 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b929: 8b 4d a8 mov -0x58(%ebp),%ecx
10b92c: 89 81 b4 00 00 00 mov %eax,0xb4(%ecx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b932: 58 pop %eax
10b933: 5a pop %edx
10b934: 89 c8 mov %ecx,%eax
10b936: 05 a8 00 00 00 add $0xa8,%eax
10b93b: 50 push %eax
10b93c: 68 3c 89 12 00 push $0x12893c
10b941: e8 be 3e 00 00 call 10f804 <_Watchdog_Insert>
10b946: 83 c4 10 add $0x10,%esp
10b949: 8b 55 a0 mov -0x60(%ebp),%edx
10b94c: eb 88 jmp 10b8d6 <pthread_create+0x20e>
00112e98 <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
112e98: 55 push %ebp
112e99: 89 e5 mov %esp,%ebp
112e9b: 83 ec 10 sub $0x10,%esp
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
112e9e: ff 75 08 pushl 0x8(%ebp)
112ea1: ff 35 38 7b 12 00 pushl 0x127b38
112ea7: e8 88 ff ff ff call 112e34 <_POSIX_Thread_Exit>
112eac: 83 c4 10 add $0x10,%esp
}
112eaf: c9 leave <== NOT EXECUTED
112eb0: c3 ret <== NOT EXECUTED
0010d8c0 <pthread_getschedparam>:
int pthread_getschedparam(
pthread_t thread,
int *policy,
struct sched_param *param
)
{
10d8c0: 55 push %ebp
10d8c1: 89 e5 mov %esp,%ebp
10d8c3: 57 push %edi
10d8c4: 56 push %esi
10d8c5: 53 push %ebx
10d8c6: 83 ec 1c sub $0x1c,%esp
10d8c9: 8b 7d 0c mov 0xc(%ebp),%edi
10d8cc: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Locations location;
POSIX_API_Control *api;
register Thread_Control *the_thread;
if ( !policy || !param )
10d8cf: 85 ff test %edi,%edi
10d8d1: 74 69 je 10d93c <pthread_getschedparam+0x7c>
10d8d3: 85 db test %ebx,%ebx
10d8d5: 74 65 je 10d93c <pthread_getschedparam+0x7c>
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
10d8d7: 51 push %ecx
return EINVAL;
the_thread = _POSIX_Threads_Get( thread, &location );
10d8d8: 8d 45 e4 lea -0x1c(%ebp),%eax
10d8db: 50 push %eax
10d8dc: ff 75 08 pushl 0x8(%ebp)
10d8df: 68 40 b8 12 00 push $0x12b840
10d8e4: e8 0f 24 00 00 call 10fcf8 <_Objects_Get>
switch ( location ) {
10d8e9: 83 c4 10 add $0x10,%esp
10d8ec: 8b 55 e4 mov -0x1c(%ebp),%edx
10d8ef: 85 d2 test %edx,%edx
10d8f1: 75 39 jne 10d92c <pthread_getschedparam+0x6c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10d8f3: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
if ( policy )
*policy = api->schedpolicy;
10d8f9: 8b 96 84 00 00 00 mov 0x84(%esi),%edx
10d8ff: 89 17 mov %edx,(%edi)
if ( param ) {
*param = api->schedparam;
10d901: 81 c6 88 00 00 00 add $0x88,%esi
10d907: b9 07 00 00 00 mov $0x7,%ecx
10d90c: 89 df mov %ebx,%edi
10d90e: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
Priority_Control priority
)
{
return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10d910: 0f b6 15 5c 72 12 00 movzbl 0x12725c,%edx
10d917: 2b 50 14 sub 0x14(%eax),%edx
10d91a: 89 13 mov %edx,(%ebx)
param->sched_priority =
_POSIX_Priority_From_core( the_thread->current_priority );
}
_Thread_Enable_dispatch();
10d91c: e8 8b 2e 00 00 call 1107ac <_Thread_Enable_dispatch>
return 0;
10d921: 31 c0 xor %eax,%eax
break;
}
return ESRCH;
}
10d923: 8d 65 f4 lea -0xc(%ebp),%esp
10d926: 5b pop %ebx
10d927: 5e pop %esi
10d928: 5f pop %edi
10d929: c9 leave
10d92a: c3 ret
10d92b: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10d92c: b8 03 00 00 00 mov $0x3,%eax
}
10d931: 8d 65 f4 lea -0xc(%ebp),%esp
10d934: 5b pop %ebx
10d935: 5e pop %esi
10d936: 5f pop %edi
10d937: c9 leave
10d938: c3 ret
10d939: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
POSIX_API_Control *api;
register Thread_Control *the_thread;
if ( !policy || !param )
return EINVAL;
10d93c: b8 16 00 00 00 mov $0x16,%eax
break;
}
return ESRCH;
}
10d941: 8d 65 f4 lea -0xc(%ebp),%esp
10d944: 5b pop %ebx
10d945: 5e pop %esi
10d946: 5f pop %edi
10d947: c9 leave
10d948: c3 ret
0010b6a8 <pthread_getspecific>:
*/
void *pthread_getspecific(
pthread_key_t key
)
{
10b6a8: 55 push %ebp
10b6a9: 89 e5 mov %esp,%ebp
10b6ab: 83 ec 2c sub $0x2c,%esp
uint32_t api;
uint32_t index;
Objects_Locations location;
void *key_data;
the_key = _POSIX_Keys_Get( key, &location );
10b6ae: 8d 45 f4 lea -0xc(%ebp),%eax
pthread_key_t id,
Objects_Locations *location
)
{
return (POSIX_Keys_Control *)
_Objects_Get( &_POSIX_Keys_Information, (Objects_Id) id, location );
10b6b1: 50 push %eax
10b6b2: ff 75 08 pushl 0x8(%ebp)
10b6b5: 68 20 8a 12 00 push $0x128a20
10b6ba: e8 ad 25 00 00 call 10dc6c <_Objects_Get>
switch ( location ) {
10b6bf: 83 c4 10 add $0x10,%esp
10b6c2: 8b 55 f4 mov -0xc(%ebp),%edx
10b6c5: 85 d2 test %edx,%edx
10b6c7: 75 2b jne 10b6f4 <pthread_getspecific+0x4c>
case OBJECTS_LOCAL:
api = _Objects_Get_API( _Thread_Executing->Object.id );
10b6c9: 8b 15 58 8b 12 00 mov 0x128b58,%edx
10b6cf: 8b 4a 08 mov 0x8(%edx),%ecx
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
10b6d2: 89 ca mov %ecx,%edx
10b6d4: c1 ea 18 shr $0x18,%edx
10b6d7: 83 e2 07 and $0x7,%edx
index = _Objects_Get_index( _Thread_Executing->Object.id );
10b6da: 0f b7 c9 movzwl %cx,%ecx
key_data = (void *) the_key->Values[ api ][ index ];
10b6dd: 8b 44 90 14 mov 0x14(%eax,%edx,4),%eax
10b6e1: 8b 04 88 mov (%eax,%ecx,4),%eax
_Thread_Enable_dispatch();
10b6e4: 89 45 e4 mov %eax,-0x1c(%ebp)
10b6e7: e8 34 30 00 00 call 10e720 <_Thread_Enable_dispatch>
return key_data;
10b6ec: 8b 45 e4 mov -0x1c(%ebp),%eax
case OBJECTS_ERROR:
break;
}
return NULL;
}
10b6ef: c9 leave
10b6f0: c3 ret
10b6f1: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return NULL;
10b6f4: 31 c0 xor %eax,%eax
}
10b6f6: c9 leave
10b6f7: c3 ret
00111104 <pthread_join>:
int pthread_join(
pthread_t thread,
void **value_ptr
)
{
111104: 55 push %ebp
111105: 89 e5 mov %esp,%ebp
111107: 53 push %ebx
111108: 83 ec 18 sub $0x18,%esp
11110b: 8b 5d 0c mov 0xc(%ebp),%ebx
register Thread_Control *the_thread;
POSIX_API_Control *api;
Objects_Locations location;
void *return_pointer;
the_thread = _POSIX_Threads_Get( thread, &location );
11110e: 8d 45 f4 lea -0xc(%ebp),%eax
111111: 50 push %eax
111112: ff 75 08 pushl 0x8(%ebp)
111115: 68 20 22 13 00 push $0x132220
11111a: e8 19 24 00 00 call 113538 <_Objects_Get>
switch ( location ) {
11111f: 83 c4 10 add $0x10,%esp
111122: 8b 55 f4 mov -0xc(%ebp),%edx
111125: 85 d2 test %edx,%edx
111127: 74 0b je 111134 <pthread_join+0x30>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
111129: b8 03 00 00 00 mov $0x3,%eax
}
11112e: 8b 5d fc mov -0x4(%ebp),%ebx
111131: c9 leave
111132: c3 ret
111133: 90 nop
the_thread = _POSIX_Threads_Get( thread, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
111134: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
11113a: 8b 4a 40 mov 0x40(%edx),%ecx
11113d: 85 c9 test %ecx,%ecx
11113f: 74 43 je 111184 <pthread_join+0x80>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
111141: 8b 0d 38 25 13 00 mov 0x132538,%ecx
_Thread_Enable_dispatch();
return EINVAL;
}
if ( _Thread_Is_executing( the_thread ) ) {
111147: 39 c8 cmp %ecx,%eax
111149: 74 49 je 111194 <pthread_join+0x90>
/*
* Put ourself on the threads join list
*/
_Thread_Executing->Wait.return_argument = &return_pointer;
11114b: 8d 45 f0 lea -0x10(%ebp),%eax
11114e: 89 41 28 mov %eax,0x28(%ecx)
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;
111151: c7 42 74 01 00 00 00 movl $0x1,0x74(%edx)
_Thread_queue_Enter_critical_section( &api->Join_List );
_Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT );
111158: 50 push %eax
111159: 68 f4 47 11 00 push $0x1147f4
11115e: 6a 00 push $0x0
111160: 83 c2 44 add $0x44,%edx
111163: 52 push %edx
111164: e8 5f 33 00 00 call 1144c8 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
111169: e8 7e 2e 00 00 call 113fec <_Thread_Enable_dispatch>
if ( value_ptr )
11116e: 83 c4 10 add $0x10,%esp
111171: 85 db test %ebx,%ebx
111173: 74 2b je 1111a0 <pthread_join+0x9c>
*value_ptr = return_pointer;
111175: 8b 45 f0 mov -0x10(%ebp),%eax
111178: 89 03 mov %eax,(%ebx)
return 0;
11117a: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
11117c: 8b 5d fc mov -0x4(%ebp),%ebx
11117f: c9 leave
111180: c3 ret
111181: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
_Thread_Enable_dispatch();
111184: e8 63 2e 00 00 call 113fec <_Thread_Enable_dispatch>
return EINVAL;
111189: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
11118e: 8b 5d fc mov -0x4(%ebp),%ebx
111191: c9 leave
111192: c3 ret
111193: 90 nop
_Thread_Enable_dispatch();
return EINVAL;
}
if ( _Thread_Is_executing( the_thread ) ) {
_Thread_Enable_dispatch();
111194: e8 53 2e 00 00 call 113fec <_Thread_Enable_dispatch>
return EDEADLK;
111199: b8 2d 00 00 00 mov $0x2d,%eax
11119e: eb 8e jmp 11112e <pthread_join+0x2a>
_Thread_Enable_dispatch();
if ( value_ptr )
*value_ptr = return_pointer;
return 0;
1111a0: 31 c0 xor %eax,%eax
1111a2: eb 8a jmp 11112e <pthread_join+0x2a>
0010b534 <pthread_key_create>:
int pthread_key_create(
pthread_key_t *key,
void (*destructor)( void * )
)
{
10b534: 55 push %ebp
10b535: 89 e5 mov %esp,%ebp
10b537: 57 push %edi
10b538: 56 push %esi
10b539: 53 push %ebx
10b53a: 83 ec 28 sub $0x28,%esp
10b53d: a1 70 85 12 00 mov 0x128570,%eax
10b542: 40 inc %eax
10b543: a3 70 85 12 00 mov %eax,0x128570
* the inactive chain of free keys control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void )
{
return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information );
10b548: 68 20 8a 12 00 push $0x128a20
10b54d: e8 62 22 00 00 call 10d7b4 <_Objects_Allocate>
10b552: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_key = _POSIX_Keys_Allocate();
if ( !the_key ) {
10b554: 83 c4 10 add $0x10,%esp
10b557: 85 c0 test %eax,%eax
10b559: 74 79 je 10b5d4 <pthread_key_create+0xa0>
_Thread_Enable_dispatch();
return EAGAIN;
}
the_key->destructor = destructor;
10b55b: 8b 45 0c mov 0xc(%ebp),%eax
10b55e: 89 46 10 mov %eax,0x10(%esi)
* This is a bit more complex than one might initially expect because
* APIs are optional.
*
* NOTE: Currently RTEMS Classic API tasks are always enabled.
*/
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) {
10b561: bb 01 00 00 00 mov $0x1,%ebx
the_key->Values[ the_api ] = NULL;
10b566: c7 44 9e 14 00 00 00 movl $0x0,0x14(%esi,%ebx,4)
10b56d: 00
INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
);
#endif
bytes_to_allocate = sizeof( void * ) *
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
10b56e: 8b 04 9d 48 85 12 00 mov 0x128548(,%ebx,4),%eax
10b575: 8b 40 04 mov 0x4(%eax),%eax
10b578: 0f b7 40 10 movzwl 0x10(%eax),%eax
true,
INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
);
#endif
bytes_to_allocate = sizeof( void * ) *
10b57c: 8d 0c 85 04 00 00 00 lea 0x4(,%eax,4),%ecx
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
table = _Workspace_Allocate( bytes_to_allocate );
10b583: 83 ec 0c sub $0xc,%esp
10b586: 51 push %ecx
10b587: 89 4d e4 mov %ecx,-0x1c(%ebp)
10b58a: e8 fd 42 00 00 call 10f88c <_Workspace_Allocate>
if ( !table ) {
10b58f: 83 c4 10 add $0x10,%esp
10b592: 85 c0 test %eax,%eax
10b594: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b597: 74 4f je 10b5e8 <pthread_key_create+0xb4>
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
return ENOMEM;
}
the_key->Values[ the_api ] = table;
10b599: 89 44 9e 14 mov %eax,0x14(%esi,%ebx,4)
memset( table, '\0', bytes_to_allocate );
10b59d: 89 c7 mov %eax,%edi
10b59f: 31 c0 xor %eax,%eax
10b5a1: f3 aa rep stos %al,%es:(%edi)
* This is a bit more complex than one might initially expect because
* APIs are optional.
*
* NOTE: Currently RTEMS Classic API tasks are always enabled.
*/
for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) {
10b5a3: 43 inc %ebx
10b5a4: 83 fb 04 cmp $0x4,%ebx
10b5a7: 75 bd jne 10b566 <pthread_key_create+0x32>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b5a9: 8b 46 08 mov 0x8(%esi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b5ac: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b5af: 8b 15 3c 8a 12 00 mov 0x128a3c,%edx
10b5b5: 89 34 8a mov %esi,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10b5b8: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi)
the_key->Values[ the_api ] = table;
memset( table, '\0', bytes_to_allocate );
}
_Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
*key = the_key->Object.id;
10b5bf: 8b 55 08 mov 0x8(%ebp),%edx
10b5c2: 89 02 mov %eax,(%edx)
_Thread_Enable_dispatch();
10b5c4: e8 57 31 00 00 call 10e720 <_Thread_Enable_dispatch>
return 0;
10b5c9: 31 c0 xor %eax,%eax
}
10b5cb: 8d 65 f4 lea -0xc(%ebp),%esp
10b5ce: 5b pop %ebx
10b5cf: 5e pop %esi
10b5d0: 5f pop %edi
10b5d1: c9 leave
10b5d2: c3 ret
10b5d3: 90 nop
_Thread_Disable_dispatch();
the_key = _POSIX_Keys_Allocate();
if ( !the_key ) {
_Thread_Enable_dispatch();
10b5d4: e8 47 31 00 00 call 10e720 <_Thread_Enable_dispatch>
return EAGAIN;
10b5d9: b8 0b 00 00 00 mov $0xb,%eax
_Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
*key = the_key->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10b5de: 8d 65 f4 lea -0xc(%ebp),%esp
10b5e1: 5b pop %ebx
10b5e2: 5e pop %esi
10b5e3: 5f pop %edi
10b5e4: c9 leave
10b5e5: c3 ret
10b5e6: 66 90 xchg %ax,%ax
bytes_to_allocate = sizeof( void * ) *
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
table = _Workspace_Allocate( bytes_to_allocate );
if ( !table ) {
_POSIX_Keys_Free_memory( the_key );
10b5e8: 83 ec 0c sub $0xc,%esp
10b5eb: 56 push %esi
10b5ec: e8 87 00 00 00 call 10b678 <_POSIX_Keys_Free_memory>
*/
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
POSIX_Keys_Control *the_key
)
{
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
10b5f1: 58 pop %eax
10b5f2: 5a pop %edx
10b5f3: 56 push %esi
10b5f4: 68 20 8a 12 00 push $0x128a20
10b5f9: e8 2e 25 00 00 call 10db2c <_Objects_Free>
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
10b5fe: e8 1d 31 00 00 call 10e720 <_Thread_Enable_dispatch>
return ENOMEM;
10b603: 83 c4 10 add $0x10,%esp
10b606: b8 0c 00 00 00 mov $0xc,%eax
_Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
*key = the_key->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10b60b: 8d 65 f4 lea -0xc(%ebp),%esp
10b60e: 5b pop %ebx
10b60f: 5e pop %esi
10b610: 5f pop %edi
10b611: c9 leave
10b612: c3 ret
0010b614 <pthread_key_delete>:
* 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167
*/
int pthread_key_delete(
pthread_key_t key
)
{
10b614: 55 push %ebp
10b615: 89 e5 mov %esp,%ebp
10b617: 53 push %ebx
10b618: 83 ec 18 sub $0x18,%esp
POSIX_Keys_Control *the_key;
Objects_Locations location;
the_key = _POSIX_Keys_Get( key, &location );
10b61b: 8d 45 f4 lea -0xc(%ebp),%eax
pthread_key_t id,
Objects_Locations *location
)
{
return (POSIX_Keys_Control *)
_Objects_Get( &_POSIX_Keys_Information, (Objects_Id) id, location );
10b61e: 50 push %eax
10b61f: ff 75 08 pushl 0x8(%ebp)
10b622: 68 20 8a 12 00 push $0x128a20
10b627: e8 40 26 00 00 call 10dc6c <_Objects_Get>
10b62c: 89 c3 mov %eax,%ebx
switch ( location ) {
10b62e: 83 c4 10 add $0x10,%esp
10b631: 8b 4d f4 mov -0xc(%ebp),%ecx
10b634: 85 c9 test %ecx,%ecx
10b636: 75 34 jne 10b66c <pthread_key_delete+0x58>
case OBJECTS_LOCAL:
_Objects_Close( &_POSIX_Keys_Information, &the_key->Object );
10b638: 83 ec 08 sub $0x8,%esp
10b63b: 50 push %eax
10b63c: 68 20 8a 12 00 push $0x128a20
10b641: e8 ea 21 00 00 call 10d830 <_Objects_Close>
_POSIX_Keys_Free_memory( the_key );
10b646: 89 1c 24 mov %ebx,(%esp)
10b649: e8 2a 00 00 00 call 10b678 <_POSIX_Keys_Free_memory>
*/
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
POSIX_Keys_Control *the_key
)
{
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
10b64e: 58 pop %eax
10b64f: 5a pop %edx
10b650: 53 push %ebx
10b651: 68 20 8a 12 00 push $0x128a20
10b656: e8 d1 24 00 00 call 10db2c <_Objects_Free>
/*
* NOTE: The destructor is not called and it is the responsibility
* of the application to free the memory.
*/
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
10b65b: e8 c0 30 00 00 call 10e720 <_Thread_Enable_dispatch>
return 0;
10b660: 83 c4 10 add $0x10,%esp
10b663: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b665: 8b 5d fc mov -0x4(%ebp),%ebx
10b668: c9 leave
10b669: c3 ret
10b66a: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10b66c: b8 16 00 00 00 mov $0x16,%eax
}
10b671: 8b 5d fc mov -0x4(%ebp),%ebx
10b674: c9 leave
10b675: c3 ret
00124564 <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
124564: 55 push %ebp
124565: 89 e5 mov %esp,%ebp
124567: 57 push %edi
124568: 56 push %esi
124569: 53 push %ebx
12456a: 83 ec 1c sub $0x1c,%esp
12456d: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
124570: 85 db test %ebx,%ebx
124572: 0f 84 84 00 00 00 je 1245fc <pthread_kill+0x98>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
124578: 8d 7b ff lea -0x1(%ebx),%edi
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
12457b: 83 ff 1f cmp $0x1f,%edi
12457e: 77 7c ja 1245fc <pthread_kill+0x98>
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
124580: 56 push %esi
rtems_set_errno_and_return_minus_one( EINVAL );
the_thread = _POSIX_Threads_Get( thread, &location );
124581: 8d 45 e4 lea -0x1c(%ebp),%eax
124584: 50 push %eax
124585: ff 75 08 pushl 0x8(%ebp)
124588: 68 60 e5 12 00 push $0x12e560
12458d: e8 36 d9 fe ff call 111ec8 <_Objects_Get>
124592: 89 c6 mov %eax,%esi
switch ( location ) {
124594: 83 c4 10 add $0x10,%esp
124597: 8b 4d e4 mov -0x1c(%ebp),%ecx
12459a: 85 c9 test %ecx,%ecx
12459c: 75 72 jne 124610 <pthread_kill+0xac>
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
12459e: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
1245a4: 8d 04 5b lea (%ebx,%ebx,2),%eax
1245a7: 83 3c 85 e8 e8 12 00 cmpl $0x1,0x12e8e8(,%eax,4)
1245ae: 01
1245af: 74 2d je 1245de <pthread_kill+0x7a>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
1245b1: b8 01 00 00 00 mov $0x1,%eax
1245b6: 89 f9 mov %edi,%ecx
1245b8: d3 e0 shl %cl,%eax
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
1245ba: 09 82 d4 00 00 00 or %eax,0xd4(%edx)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
1245c0: 52 push %edx
1245c1: 6a 00 push $0x0
1245c3: 53 push %ebx
1245c4: 56 push %esi
1245c5: e8 7a fe ff ff call 124444 <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
1245ca: 83 c4 10 add $0x10,%esp
1245cd: a1 74 e8 12 00 mov 0x12e874,%eax
1245d2: 85 c0 test %eax,%eax
1245d4: 74 08 je 1245de <pthread_kill+0x7a>
1245d6: 3b 35 78 e8 12 00 cmp 0x12e878,%esi
1245dc: 74 12 je 1245f0 <pthread_kill+0x8c>
_Thread_Dispatch_necessary = true;
}
_Thread_Enable_dispatch();
1245de: e8 19 e4 fe ff call 1129fc <_Thread_Enable_dispatch>
return 0;
1245e3: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
}
1245e5: 8d 65 f4 lea -0xc(%ebp),%esp
1245e8: 5b pop %ebx
1245e9: 5e pop %esi
1245ea: 5f pop %edi
1245eb: c9 leave
1245ec: c3 ret
1245ed: 8d 76 00 lea 0x0(%esi),%esi
api->signals_pending |= signo_to_mask( sig );
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
1245f0: c6 05 84 e8 12 00 01 movb $0x1,0x12e884
1245f7: eb e5 jmp 1245de <pthread_kill+0x7a>
1245f9: 8d 76 00 lea 0x0(%esi),%esi
if ( !sig )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
1245fc: e8 db 3e ff ff call 1184dc <__errno>
124601: c7 00 16 00 00 00 movl $0x16,(%eax)
124607: b8 ff ff ff ff mov $0xffffffff,%eax
12460c: eb d7 jmp 1245e5 <pthread_kill+0x81>
12460e: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
124610: e8 c7 3e ff ff call 1184dc <__errno>
124615: c7 00 03 00 00 00 movl $0x3,(%eax)
12461b: b8 ff ff ff ff mov $0xffffffff,%eax
124620: eb c3 jmp 1245e5 <pthread_kill+0x81>
0010d18c <pthread_mutex_getprioceiling>:
int pthread_mutex_getprioceiling(
pthread_mutex_t *mutex,
int *prioceiling
)
{
10d18c: 55 push %ebp
10d18d: 89 e5 mov %esp,%ebp
10d18f: 53 push %ebx
10d190: 83 ec 14 sub $0x14,%esp
10d193: 8b 5d 0c mov 0xc(%ebp),%ebx
register POSIX_Mutex_Control *the_mutex;
Objects_Locations location;
if ( !prioceiling )
10d196: 85 db test %ebx,%ebx
10d198: 74 19 je 10d1b3 <pthread_mutex_getprioceiling+0x27>
return EINVAL;
the_mutex = _POSIX_Mutex_Get( mutex, &location );
10d19a: 83 ec 08 sub $0x8,%esp
10d19d: 8d 45 f4 lea -0xc(%ebp),%eax
10d1a0: 50 push %eax
10d1a1: ff 75 08 pushl 0x8(%ebp)
10d1a4: e8 3b ff ff ff call 10d0e4 <_POSIX_Mutex_Get>
switch ( location ) {
10d1a9: 83 c4 10 add $0x10,%esp
10d1ac: 8b 55 f4 mov -0xc(%ebp),%edx
10d1af: 85 d2 test %edx,%edx
10d1b1: 74 0d je 10d1c0 <pthread_mutex_getprioceiling+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10d1b3: b8 16 00 00 00 mov $0x16,%eax
}
10d1b8: 8b 5d fc mov -0x4(%ebp),%ebx
10d1bb: c9 leave
10d1bc: c3 ret
10d1bd: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
Priority_Control priority
)
{
return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10d1c0: 0f b6 15 5c 72 12 00 movzbl 0x12725c,%edx
10d1c7: 2b 50 60 sub 0x60(%eax),%edx
10d1ca: 89 13 mov %edx,(%ebx)
case OBJECTS_LOCAL:
*prioceiling = _POSIX_Priority_From_core(
the_mutex->Mutex.Attributes.priority_ceiling
);
_Thread_Enable_dispatch();
10d1cc: e8 db 35 00 00 call 1107ac <_Thread_Enable_dispatch>
return 0;
10d1d1: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10d1d3: 8b 5d fc mov -0x4(%ebp),%ebx
10d1d6: c9 leave
10d1d7: c3 ret
0010d1d8 <pthread_mutex_init>:
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
)
{
10d1d8: 55 push %ebp
10d1d9: 89 e5 mov %esp,%ebp
10d1db: 57 push %edi
10d1dc: 56 push %esi
10d1dd: 53 push %ebx
10d1de: 83 ec 1c sub $0x1c,%esp
10d1e1: 8b 75 08 mov 0x8(%ebp),%esi
10d1e4: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Mutex_Control *the_mutex;
CORE_mutex_Attributes *the_mutex_attr;
const pthread_mutexattr_t *the_attr;
CORE_mutex_Disciplines the_discipline;
if ( attr ) the_attr = attr;
10d1e7: 85 db test %ebx,%ebx
10d1e9: 0f 84 09 01 00 00 je 10d2f8 <pthread_mutex_init+0x120>
else the_attr = &_POSIX_Mutex_Default_attributes;
/* Check for NULL mutex */
if ( !mutex )
10d1ef: 85 f6 test %esi,%esi
10d1f1: 0f 84 e5 00 00 00 je 10d2dc <pthread_mutex_init+0x104>
}
}
}
#endif
if ( !the_attr->is_initialized )
10d1f7: 8b 13 mov (%ebx),%edx
10d1f9: 85 d2 test %edx,%edx
10d1fb: 0f 84 db 00 00 00 je 10d2dc <pthread_mutex_init+0x104>
return EINVAL;
/*
* We only support process private mutexes.
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10d201: 8b 43 04 mov 0x4(%ebx),%eax
10d204: 83 f8 01 cmp $0x1,%eax
10d207: 0f 84 f7 00 00 00 je 10d304 <pthread_mutex_init+0x12c>
return ENOSYS;
if ( the_attr->process_shared != PTHREAD_PROCESS_PRIVATE )
10d20d: 85 c0 test %eax,%eax
10d20f: 0f 85 c7 00 00 00 jne 10d2dc <pthread_mutex_init+0x104>
return EINVAL;
/*
* Determine the discipline of the mutex
*/
switch ( the_attr->protocol ) {
10d215: 8b 43 0c mov 0xc(%ebx),%eax
10d218: 83 f8 01 cmp $0x1,%eax
10d21b: 0f 84 eb 00 00 00 je 10d30c <pthread_mutex_init+0x134>
10d221: 83 f8 02 cmp $0x2,%eax
10d224: 0f 84 c2 00 00 00 je 10d2ec <pthread_mutex_init+0x114>
10d22a: 85 c0 test %eax,%eax
10d22c: 0f 85 aa 00 00 00 jne 10d2dc <pthread_mutex_init+0x104>
case PTHREAD_PRIO_NONE:
the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
10d232: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
}
/*
* Validate the priority ceiling field -- should always be valid.
*/
if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) )
10d239: 83 ec 0c sub $0xc,%esp
10d23c: ff 73 08 pushl 0x8(%ebx)
10d23f: e8 58 03 00 00 call 10d59c <_POSIX_Priority_Is_valid>
10d244: 83 c4 10 add $0x10,%esp
10d247: 84 c0 test %al,%al
10d249: 0f 84 8d 00 00 00 je 10d2dc <pthread_mutex_init+0x104>
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
/*
* Validate the mutex type and set appropriate SuperCore mutex
* attributes.
*/
switch ( the_attr->type ) {
10d24f: 83 7b 10 03 cmpl $0x3,0x10(%ebx)
10d253: 0f 87 83 00 00 00 ja 10d2dc <pthread_mutex_init+0x104>
10d259: a1 70 b5 12 00 mov 0x12b570,%eax
10d25e: 40 inc %eax
10d25f: a3 70 b5 12 00 mov %eax,0x12b570
* _POSIX_Mutex_Allocate
*/
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
{
return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
10d264: 83 ec 0c sub $0xc,%esp
10d267: 68 80 b9 12 00 push $0x12b980
10d26c: e8 cf 25 00 00 call 10f840 <_Objects_Allocate>
10d271: 89 c7 mov %eax,%edi
*/
_Thread_Disable_dispatch();
the_mutex = _POSIX_Mutex_Allocate();
if ( !the_mutex ) {
10d273: 83 c4 10 add $0x10,%esp
10d276: 85 c0 test %eax,%eax
10d278: 0f 84 9a 00 00 00 je 10d318 <pthread_mutex_init+0x140>
_Thread_Enable_dispatch();
return EAGAIN;
}
the_mutex->process_shared = the_attr->process_shared;
10d27e: 8b 43 04 mov 0x4(%ebx),%eax
10d281: 89 47 10 mov %eax,0x10(%edi)
the_mutex_attr = &the_mutex->Mutex.Attributes;
10d284: 8d 57 54 lea 0x54(%edi),%edx
if ( the_attr->recursive )
the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10d287: 31 c0 xor %eax,%eax
10d289: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10d28d: 0f 94 c0 sete %al
10d290: 89 47 54 mov %eax,0x54(%edi)
else
the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_IS_ERROR;
the_mutex_attr->only_owner_release = true;
10d293: c6 47 58 01 movb $0x1,0x58(%edi)
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
10d297: 0f b6 05 5c 72 12 00 movzbl 0x12725c,%eax
10d29e: 2b 43 08 sub 0x8(%ebx),%eax
10d2a1: 89 47 60 mov %eax,0x60(%edi)
the_mutex_attr->priority_ceiling =
_POSIX_Priority_To_core( the_attr->prio_ceiling );
the_mutex_attr->discipline = the_discipline;
10d2a4: 8b 45 e4 mov -0x1c(%ebp),%eax
10d2a7: 89 47 5c mov %eax,0x5c(%edi)
/*
* Must be initialized to unlocked.
*/
_CORE_mutex_Initialize(
10d2aa: 50 push %eax
10d2ab: 6a 01 push $0x1
10d2ad: 52 push %edx
10d2ae: 8d 47 14 lea 0x14(%edi),%eax
10d2b1: 50 push %eax
10d2b2: e8 0d 1d 00 00 call 10efc4 <_CORE_mutex_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10d2b7: 8b 47 08 mov 0x8(%edi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10d2ba: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10d2bd: 8b 15 9c b9 12 00 mov 0x12b99c,%edx
10d2c3: 89 3c 8a mov %edi,(%edx,%ecx,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10d2c6: c7 47 0c 00 00 00 00 movl $0x0,0xc(%edi)
CORE_MUTEX_UNLOCKED
);
_Objects_Open_u32( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );
*mutex = the_mutex->Object.id;
10d2cd: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10d2cf: e8 d8 34 00 00 call 1107ac <_Thread_Enable_dispatch>
return 0;
10d2d4: 83 c4 10 add $0x10,%esp
10d2d7: 31 c0 xor %eax,%eax
10d2d9: eb 06 jmp 10d2e1 <pthread_mutex_init+0x109>
10d2db: 90 nop
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
break;
default:
return EINVAL;
10d2dc: b8 16 00 00 00 mov $0x16,%eax
*mutex = the_mutex->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10d2e1: 8d 65 f4 lea -0xc(%ebp),%esp
10d2e4: 5b pop %ebx
10d2e5: 5e pop %esi
10d2e6: 5f pop %edi
10d2e7: c9 leave
10d2e8: c3 ret
10d2e9: 8d 76 00 lea 0x0(%esi),%esi
break;
case PTHREAD_PRIO_INHERIT:
the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
break;
case PTHREAD_PRIO_PROTECT:
the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
10d2ec: c7 45 e4 03 00 00 00 movl $0x3,-0x1c(%ebp)
break;
10d2f3: e9 41 ff ff ff jmp 10d239 <pthread_mutex_init+0x61>
CORE_mutex_Attributes *the_mutex_attr;
const pthread_mutexattr_t *the_attr;
CORE_mutex_Disciplines the_discipline;
if ( attr ) the_attr = attr;
else the_attr = &_POSIX_Mutex_Default_attributes;
10d2f8: bb 00 ba 12 00 mov $0x12ba00,%ebx
10d2fd: e9 ed fe ff ff jmp 10d1ef <pthread_mutex_init+0x17>
10d302: 66 90 xchg %ax,%ax
/*
* We only support process private mutexes.
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
return ENOSYS;
10d304: b8 58 00 00 00 mov $0x58,%eax
10d309: eb d6 jmp 10d2e1 <pthread_mutex_init+0x109>
10d30b: 90 nop
switch ( the_attr->protocol ) {
case PTHREAD_PRIO_NONE:
the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
break;
case PTHREAD_PRIO_INHERIT:
the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
10d30c: c7 45 e4 02 00 00 00 movl $0x2,-0x1c(%ebp)
10d313: e9 21 ff ff ff jmp 10d239 <pthread_mutex_init+0x61>
_Thread_Disable_dispatch();
the_mutex = _POSIX_Mutex_Allocate();
if ( !the_mutex ) {
_Thread_Enable_dispatch();
10d318: e8 8f 34 00 00 call 1107ac <_Thread_Enable_dispatch>
return EAGAIN;
10d31d: b8 0b 00 00 00 mov $0xb,%eax
10d322: eb bd jmp 10d2e1 <pthread_mutex_init+0x109>
0010d430 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
10d430: 55 push %ebp
10d431: 89 e5 mov %esp,%ebp
10d433: 56 push %esi
10d434: 53 push %ebx
10d435: 83 ec 18 sub $0x18,%esp
10d438: 8b 75 08 mov 0x8(%ebp),%esi
*
* 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 );
10d43b: 8d 45 f4 lea -0xc(%ebp),%eax
10d43e: 50 push %eax
10d43f: ff 75 0c pushl 0xc(%ebp)
10d442: e8 cd 00 00 00 call 10d514 <_POSIX_Absolute_timeout_to_ticks>
10d447: 89 c3 mov %eax,%ebx
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10d449: 83 c4 10 add $0x10,%esp
10d44c: 83 f8 03 cmp $0x3,%eax
10d44f: 74 2f je 10d480 <pthread_mutex_timedlock+0x50>
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10d451: 50 push %eax
10d452: ff 75 f4 pushl -0xc(%ebp)
10d455: 6a 00 push $0x0
10d457: 56 push %esi
10d458: e8 db fe ff ff call 10d338 <_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) ) {
10d45d: 83 c4 10 add $0x10,%esp
10d460: 83 f8 10 cmp $0x10,%eax
10d463: 74 07 je 10d46c <pthread_mutex_timedlock+0x3c><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
10d465: 8d 65 f8 lea -0x8(%ebp),%esp
10d468: 5b pop %ebx
10d469: 5e pop %esi
10d46a: c9 leave
10d46b: c3 ret
* attempt to lock if the abstime was not in the future. If we did
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10d46c: 85 db test %ebx,%ebx
10d46e: 74 28 je 10d498 <pthread_mutex_timedlock+0x68><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10d470: 4b dec %ebx
10d471: 83 fb 01 cmp $0x1,%ebx
10d474: 77 ef ja 10d465 <pthread_mutex_timedlock+0x35><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10d476: b8 74 00 00 00 mov $0x74,%eax
10d47b: eb e8 jmp 10d465 <pthread_mutex_timedlock+0x35>
10d47d: 8d 76 00 lea 0x0(%esi),%esi
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10d480: 52 push %edx
10d481: ff 75 f4 pushl -0xc(%ebp)
10d484: 6a 01 push $0x1
10d486: 56 push %esi
10d487: e8 ac fe ff ff call 10d338 <_POSIX_Mutex_Lock_support>
10d48c: 83 c4 10 add $0x10,%esp
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
10d48f: 8d 65 f8 lea -0x8(%ebp),%esp
10d492: 5b pop %ebx
10d493: 5e pop %esi
10d494: c9 leave
10d495: c3 ret
10d496: 66 90 xchg %ax,%ax
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10d498: b8 16 00 00 00 mov $0x16,%eax <== NOT EXECUTED
10d49d: eb c6 jmp 10d465 <pthread_mutex_timedlock+0x35><== NOT EXECUTED
0010cf14 <pthread_mutexattr_destroy>:
*/
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr
)
{
10cf14: 55 push %ebp
10cf15: 89 e5 mov %esp,%ebp
10cf17: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
10cf1a: 85 c0 test %eax,%eax
10cf1c: 74 12 je 10cf30 <pthread_mutexattr_destroy+0x1c>
10cf1e: 8b 10 mov (%eax),%edx
10cf20: 85 d2 test %edx,%edx
10cf22: 74 0c je 10cf30 <pthread_mutexattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10cf24: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10cf2a: 31 c0 xor %eax,%eax
}
10cf2c: c9 leave
10cf2d: c3 ret
10cf2e: 66 90 xchg %ax,%ax
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
10cf30: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10cf35: c9 leave
10cf36: c3 ret
0010cfdc <pthread_mutexattr_setprioceiling>:
int pthread_mutexattr_setprioceiling(
pthread_mutexattr_t *attr,
int prioceiling
)
{
10cfdc: 55 push %ebp
10cfdd: 89 e5 mov %esp,%ebp
10cfdf: 56 push %esi
10cfe0: 53 push %ebx
10cfe1: 8b 5d 08 mov 0x8(%ebp),%ebx
10cfe4: 8b 75 0c mov 0xc(%ebp),%esi
if ( !attr || !attr->is_initialized )
10cfe7: 85 db test %ebx,%ebx
10cfe9: 74 06 je 10cff1 <pthread_mutexattr_setprioceiling+0x15>
10cfeb: 8b 03 mov (%ebx),%eax
10cfed: 85 c0 test %eax,%eax
10cfef: 75 0f jne 10d000 <pthread_mutexattr_setprioceiling+0x24><== NEVER TAKEN
return EINVAL;
if ( !_POSIX_Priority_Is_valid( prioceiling ) )
return EINVAL;
10cff1: b8 16 00 00 00 mov $0x16,%eax
attr->prio_ceiling = prioceiling;
return 0;
}
10cff6: 8d 65 f8 lea -0x8(%ebp),%esp
10cff9: 5b pop %ebx
10cffa: 5e pop %esi
10cffb: c9 leave
10cffc: c3 ret
10cffd: 8d 76 00 lea 0x0(%esi),%esi
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( prioceiling ) )
10d000: 83 ec 0c sub $0xc,%esp
10d003: 56 push %esi
10d004: e8 93 05 00 00 call 10d59c <_POSIX_Priority_Is_valid>
10d009: 83 c4 10 add $0x10,%esp
10d00c: 84 c0 test %al,%al
10d00e: 74 e1 je 10cff1 <pthread_mutexattr_setprioceiling+0x15><== NEVER TAKEN
return EINVAL;
attr->prio_ceiling = prioceiling;
10d010: 89 73 08 mov %esi,0x8(%ebx)
return 0;
10d013: 31 c0 xor %eax,%eax
}
10d015: 8d 65 f8 lea -0x8(%ebp),%esp
10d018: 5b pop %ebx
10d019: 5e pop %esi
10d01a: c9 leave
10d01b: c3 ret
0010d044 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
10d044: 55 push %ebp
10d045: 89 e5 mov %esp,%ebp
10d047: 8b 45 08 mov 0x8(%ebp),%eax
10d04a: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
10d04d: 85 c0 test %eax,%eax
10d04f: 74 0b je 10d05c <pthread_mutexattr_setpshared+0x18>
10d051: 8b 08 mov (%eax),%ecx
10d053: 85 c9 test %ecx,%ecx
10d055: 74 05 je 10d05c <pthread_mutexattr_setpshared+0x18>
return EINVAL;
switch ( pshared ) {
10d057: 83 fa 01 cmp $0x1,%edx
10d05a: 76 08 jbe 10d064 <pthread_mutexattr_setpshared+0x20><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10d05c: b8 16 00 00 00 mov $0x16,%eax
}
}
10d061: c9 leave
10d062: c3 ret
10d063: 90 nop
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10d064: 89 50 04 mov %edx,0x4(%eax)
return 0;
10d067: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10d069: c9 leave
10d06a: c3 ret
0010b228 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
10b228: 55 push %ebp
10b229: 89 e5 mov %esp,%ebp
10b22b: 8b 45 08 mov 0x8(%ebp),%eax
10b22e: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
10b231: 85 c0 test %eax,%eax
10b233: 74 0b je 10b240 <pthread_mutexattr_settype+0x18>
10b235: 8b 08 mov (%eax),%ecx
10b237: 85 c9 test %ecx,%ecx
10b239: 74 05 je 10b240 <pthread_mutexattr_settype+0x18><== NEVER TAKEN
return EINVAL;
switch ( type ) {
10b23b: 83 fa 03 cmp $0x3,%edx
10b23e: 76 08 jbe 10b248 <pthread_mutexattr_settype+0x20>
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
return 0;
default:
return EINVAL;
10b240: b8 16 00 00 00 mov $0x16,%eax
}
}
10b245: c9 leave
10b246: c3 ret
10b247: 90 nop
switch ( type ) {
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
10b248: 89 50 10 mov %edx,0x10(%eax)
return 0;
10b24b: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10b24d: c9 leave
10b24e: c3 ret
0010bd8c <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
10bd8c: 55 push %ebp
10bd8d: 89 e5 mov %esp,%ebp
10bd8f: 57 push %edi
10bd90: 56 push %esi
10bd91: 53 push %ebx
10bd92: 83 ec 1c sub $0x1c,%esp
10bd95: 8b 5d 08 mov 0x8(%ebp),%ebx
10bd98: 8b 75 0c mov 0xc(%ebp),%esi
if ( !once_control || !init_routine )
10bd9b: 85 db test %ebx,%ebx
10bd9d: 74 51 je 10bdf0 <pthread_once+0x64>
10bd9f: 85 f6 test %esi,%esi
10bda1: 74 4d je 10bdf0 <pthread_once+0x64>
return EINVAL;
if ( !once_control->init_executed ) {
10bda3: 8b 7b 04 mov 0x4(%ebx),%edi
10bda6: 85 ff test %edi,%edi
10bda8: 74 0a je 10bdb4 <pthread_once+0x28>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
10bdaa: 31 c0 xor %eax,%eax
}
10bdac: 8d 65 f4 lea -0xc(%ebp),%esp
10bdaf: 5b pop %ebx
10bdb0: 5e pop %esi
10bdb1: 5f pop %edi
10bdb2: c9 leave
10bdb3: c3 ret
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
10bdb4: 51 push %ecx
10bdb5: 8d 7d e4 lea -0x1c(%ebp),%edi
10bdb8: 57 push %edi
10bdb9: 68 00 01 00 00 push $0x100
10bdbe: 68 00 01 00 00 push $0x100
10bdc3: e8 f4 0b 00 00 call 10c9bc <rtems_task_mode>
if ( !once_control->init_executed ) {
10bdc8: 83 c4 10 add $0x10,%esp
10bdcb: 8b 53 04 mov 0x4(%ebx),%edx
10bdce: 85 d2 test %edx,%edx
10bdd0: 74 2e je 10be00 <pthread_once+0x74> <== ALWAYS TAKEN
once_control->is_initialized = true;
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
10bdd2: 50 push %eax
10bdd3: 57 push %edi
10bdd4: 68 00 01 00 00 push $0x100
10bdd9: ff 75 e4 pushl -0x1c(%ebp)
10bddc: e8 db 0b 00 00 call 10c9bc <rtems_task_mode>
10bde1: 83 c4 10 add $0x10,%esp
}
return 0;
10bde4: 31 c0 xor %eax,%eax
}
10bde6: 8d 65 f4 lea -0xc(%ebp),%esp
10bde9: 5b pop %ebx
10bdea: 5e pop %esi
10bdeb: 5f pop %edi
10bdec: c9 leave
10bded: c3 ret
10bdee: 66 90 xchg %ax,%ax
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
10bdf0: b8 16 00 00 00 mov $0x16,%eax
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
10bdf5: 8d 65 f4 lea -0xc(%ebp),%esp
10bdf8: 5b pop %ebx
10bdf9: 5e pop %esi
10bdfa: 5f pop %edi
10bdfb: c9 leave
10bdfc: c3 ret
10bdfd: 8d 76 00 lea 0x0(%esi),%esi
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( !once_control->init_executed ) {
once_control->is_initialized = true;
10be00: c7 03 01 00 00 00 movl $0x1,(%ebx)
once_control->init_executed = true;
10be06: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
(*init_routine)();
10be0d: ff d6 call *%esi
10be0f: eb c1 jmp 10bdd2 <pthread_once+0x46>
0010c470 <pthread_rwlock_destroy>:
*/
int pthread_rwlock_destroy(
pthread_rwlock_t *rwlock
)
{
10c470: 55 push %ebp
10c471: 89 e5 mov %esp,%ebp
10c473: 53 push %ebx
10c474: 83 ec 14 sub $0x14,%esp
10c477: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_RWLock_Control *the_rwlock = NULL;
Objects_Locations location;
if ( !rwlock )
10c47a: 85 c0 test %eax,%eax
10c47c: 74 42 je 10c4c0 <pthread_rwlock_destroy+0x50>
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Get (
pthread_rwlock_t *RWLock,
Objects_Locations *location
)
{
return (POSIX_RWLock_Control *) _Objects_Get(
10c47e: 53 push %ebx
return EINVAL;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c47f: 8d 55 f4 lea -0xc(%ebp),%edx
10c482: 52 push %edx
10c483: ff 30 pushl (%eax)
10c485: 68 60 b1 12 00 push $0x12b160
10c48a: e8 e9 2b 00 00 call 10f078 <_Objects_Get>
10c48f: 89 c3 mov %eax,%ebx
switch ( location ) {
10c491: 83 c4 10 add $0x10,%esp
10c494: 8b 4d f4 mov -0xc(%ebp),%ecx
10c497: 85 c9 test %ecx,%ecx
10c499: 75 25 jne 10c4c0 <pthread_rwlock_destroy+0x50>
case OBJECTS_LOCAL:
/*
* If there is at least one thread waiting, then do not delete it.
*/
if ( _Thread_queue_First( &the_rwlock->RWLock.Wait_queue ) != NULL ) {
10c49b: 83 ec 0c sub $0xc,%esp
10c49e: 8d 40 10 lea 0x10(%eax),%eax
10c4a1: 50 push %eax
10c4a2: e8 89 3e 00 00 call 110330 <_Thread_queue_First>
10c4a7: 83 c4 10 add $0x10,%esp
10c4aa: 85 c0 test %eax,%eax
10c4ac: 74 1e je 10c4cc <pthread_rwlock_destroy+0x5c>
_Thread_Enable_dispatch();
10c4ae: e8 79 36 00 00 call 10fb2c <_Thread_Enable_dispatch>
return EBUSY;
10c4b3: b8 10 00 00 00 mov $0x10,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c4b8: 8b 5d fc mov -0x4(%ebp),%ebx
10c4bb: c9 leave
10c4bc: c3 ret
10c4bd: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c4c0: b8 16 00 00 00 mov $0x16,%eax
}
10c4c5: 8b 5d fc mov -0x4(%ebp),%ebx
10c4c8: c9 leave
10c4c9: c3 ret
10c4ca: 66 90 xchg %ax,%ax
/*
* POSIX doesn't require behavior when it is locked.
*/
_Objects_Close( &_POSIX_RWLock_Information, &the_rwlock->Object );
10c4cc: 83 ec 08 sub $0x8,%esp
10c4cf: 53 push %ebx
10c4d0: 68 60 b1 12 00 push $0x12b160
10c4d5: e8 62 27 00 00 call 10ec3c <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _POSIX_RWLock_Free (
POSIX_RWLock_Control *the_RWLock
)
{
_Objects_Free( &_POSIX_RWLock_Information, &the_RWLock->Object );
10c4da: 58 pop %eax
10c4db: 5a pop %edx
10c4dc: 53 push %ebx
10c4dd: 68 60 b1 12 00 push $0x12b160
10c4e2: e8 51 2a 00 00 call 10ef38 <_Objects_Free>
_POSIX_RWLock_Free( the_rwlock );
_Thread_Enable_dispatch();
10c4e7: e8 40 36 00 00 call 10fb2c <_Thread_Enable_dispatch>
return 0;
10c4ec: 83 c4 10 add $0x10,%esp
10c4ef: 31 c0 xor %eax,%eax
10c4f1: eb d2 jmp 10c4c5 <pthread_rwlock_destroy+0x55>
0010c4f4 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
10c4f4: 55 push %ebp
10c4f5: 89 e5 mov %esp,%ebp
10c4f7: 56 push %esi
10c4f8: 53 push %ebx
10c4f9: 83 ec 20 sub $0x20,%esp
10c4fc: 8b 5d 08 mov 0x8(%ebp),%ebx
10c4ff: 8b 75 0c mov 0xc(%ebp),%esi
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
10c502: 85 db test %ebx,%ebx
10c504: 74 15 je 10c51b <pthread_rwlock_init+0x27>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10c506: 85 f6 test %esi,%esi
10c508: 0f 84 8e 00 00 00 je 10c59c <pthread_rwlock_init+0xa8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10c50e: 8b 16 mov (%esi),%edx
10c510: 85 d2 test %edx,%edx
10c512: 74 07 je 10c51b <pthread_rwlock_init+0x27><== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
10c514: 8b 46 04 mov 0x4(%esi),%eax
10c517: 85 c0 test %eax,%eax
10c519: 74 0d je 10c528 <pthread_rwlock_init+0x34><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10c51b: b8 16 00 00 00 mov $0x16,%eax
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10c520: 8d 65 f8 lea -0x8(%ebp),%esp
10c523: 5b pop %ebx
10c524: 5e pop %esi
10c525: c9 leave
10c526: c3 ret
10c527: 90 nop
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
10c528: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c52f: a1 d0 ae 12 00 mov 0x12aed0,%eax
10c534: 40 inc %eax
10c535: a3 d0 ae 12 00 mov %eax,0x12aed0
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
_Objects_Allocate( &_POSIX_RWLock_Information );
10c53a: 83 ec 0c sub $0xc,%esp
10c53d: 68 60 b1 12 00 push $0x12b160
10c542: e8 79 26 00 00 call 10ebc0 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
10c547: 83 c4 10 add $0x10,%esp
10c54a: 85 c0 test %eax,%eax
10c54c: 74 42 je 10c590 <pthread_rwlock_init+0x9c>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
10c54e: 83 ec 08 sub $0x8,%esp
10c551: 8d 55 f4 lea -0xc(%ebp),%edx
10c554: 52 push %edx
10c555: 8d 50 10 lea 0x10(%eax),%edx
10c558: 52 push %edx
10c559: 89 45 e4 mov %eax,-0x1c(%ebp)
10c55c: e8 3f 1e 00 00 call 10e3a0 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c561: 8b 45 e4 mov -0x1c(%ebp),%eax
10c564: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10c567: 0f b7 f2 movzwl %dx,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c56a: 8b 0d 7c b1 12 00 mov 0x12b17c,%ecx
10c570: 89 04 b1 mov %eax,(%ecx,%esi,4)
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
10c573: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
10c57a: 89 13 mov %edx,(%ebx)
_Thread_Enable_dispatch();
10c57c: e8 ab 35 00 00 call 10fb2c <_Thread_Enable_dispatch>
return 0;
10c581: 83 c4 10 add $0x10,%esp
10c584: 31 c0 xor %eax,%eax
}
10c586: 8d 65 f8 lea -0x8(%ebp),%esp
10c589: 5b pop %ebx
10c58a: 5e pop %esi
10c58b: c9 leave
10c58c: c3 ret
10c58d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
_Thread_Enable_dispatch();
10c590: e8 97 35 00 00 call 10fb2c <_Thread_Enable_dispatch>
return EAGAIN;
10c595: b8 0b 00 00 00 mov $0xb,%eax
10c59a: eb 84 jmp 10c520 <pthread_rwlock_init+0x2c>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
10c59c: 83 ec 0c sub $0xc,%esp
10c59f: 8d 75 ec lea -0x14(%ebp),%esi
10c5a2: 56 push %esi
10c5a3: e8 84 09 00 00 call 10cf2c <pthread_rwlockattr_init>
10c5a8: 83 c4 10 add $0x10,%esp
10c5ab: e9 5e ff ff ff jmp 10c50e <pthread_rwlock_init+0x1a>
0010c618 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10c618: 55 push %ebp
10c619: 89 e5 mov %esp,%ebp
10c61b: 56 push %esi
10c61c: 53 push %ebx
10c61d: 83 ec 20 sub $0x20,%esp
10c620: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10c623: 85 db test %ebx,%ebx
10c625: 74 7d je 10c6a4 <pthread_rwlock_timedrdlock+0x8c>
*
* 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 );
10c627: 83 ec 08 sub $0x8,%esp
10c62a: 8d 45 f0 lea -0x10(%ebp),%eax
10c62d: 50 push %eax
10c62e: ff 75 0c pushl 0xc(%ebp)
10c631: e8 ae 62 00 00 call 1128e4 <_POSIX_Absolute_timeout_to_ticks>
10c636: 89 c6 mov %eax,%esi
10c638: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c63b: 8d 45 f4 lea -0xc(%ebp),%eax
10c63e: 50 push %eax
10c63f: ff 33 pushl (%ebx)
10c641: 68 60 b1 12 00 push $0x12b160
10c646: e8 2d 2a 00 00 call 10f078 <_Objects_Get>
switch ( location ) {
10c64b: 83 c4 10 add $0x10,%esp
10c64e: 8b 55 f4 mov -0xc(%ebp),%edx
10c651: 85 d2 test %edx,%edx
10c653: 75 4f jne 10c6a4 <pthread_rwlock_timedrdlock+0x8c>
int _EXFUN(pthread_rwlock_init,
(pthread_rwlock_t *__rwlock, _CONST pthread_rwlockattr_t *__attr));
int _EXFUN(pthread_rwlock_destroy, (pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_rdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_tryrdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedrdlock,
10c655: 83 fe 03 cmp $0x3,%esi
10c658: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
10c65b: 83 ec 0c sub $0xc,%esp
10c65e: 6a 00 push $0x0
10c660: ff 75 f0 pushl -0x10(%ebp)
10c663: 0f b6 ca movzbl %dl,%ecx
10c666: 51 push %ecx
10c667: ff 33 pushl (%ebx)
10c669: 83 c0 10 add $0x10,%eax
10c66c: 50 push %eax
10c66d: 88 55 e4 mov %dl,-0x1c(%ebp)
10c670: e8 5f 1d 00 00 call 10e3d4 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10c675: 83 c4 20 add $0x20,%esp
10c678: e8 af 34 00 00 call 10fb2c <_Thread_Enable_dispatch>
if ( !do_wait ) {
10c67d: 8a 55 e4 mov -0x1c(%ebp),%dl
10c680: 84 d2 test %dl,%dl
10c682: 75 40 jne 10c6c4 <pthread_rwlock_timedrdlock+0xac>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
10c684: a1 b8 b4 12 00 mov 0x12b4b8,%eax
10c689: 8b 40 34 mov 0x34(%eax),%eax
10c68c: 83 f8 02 cmp $0x2,%eax
10c68f: 74 1f je 10c6b0 <pthread_rwlock_timedrdlock+0x98>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10c691: 83 ec 0c sub $0xc,%esp
10c694: 50 push %eax
10c695: e8 ee 00 00 00 call 10c788 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10c69a: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c69d: 8d 65 f8 lea -0x8(%ebp),%esp
10c6a0: 5b pop %ebx
10c6a1: 5e pop %esi
10c6a2: c9 leave
10c6a3: c3 ret
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10c6a4: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c6a9: 8d 65 f8 lea -0x8(%ebp),%esp
10c6ac: 5b pop %ebx
10c6ad: 5e pop %esi
10c6ae: c9 leave
10c6af: c3 ret
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10c6b0: 85 f6 test %esi,%esi
10c6b2: 74 f0 je 10c6a4 <pthread_rwlock_timedrdlock+0x8c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10c6b4: 4e dec %esi
10c6b5: 83 fe 01 cmp $0x1,%esi
10c6b8: 77 d7 ja 10c691 <pthread_rwlock_timedrdlock+0x79><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10c6ba: b8 74 00 00 00 mov $0x74,%eax
10c6bf: eb e8 jmp 10c6a9 <pthread_rwlock_timedrdlock+0x91>
10c6c1: 8d 76 00 lea 0x0(%esi),%esi
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
10c6c4: a1 b8 b4 12 00 mov 0x12b4b8,%eax
10c6c9: 8b 40 34 mov 0x34(%eax),%eax
10c6cc: eb c3 jmp 10c691 <pthread_rwlock_timedrdlock+0x79>
0010c6d0 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10c6d0: 55 push %ebp
10c6d1: 89 e5 mov %esp,%ebp
10c6d3: 56 push %esi
10c6d4: 53 push %ebx
10c6d5: 83 ec 20 sub $0x20,%esp
10c6d8: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
10c6db: 85 db test %ebx,%ebx
10c6dd: 74 7d je 10c75c <pthread_rwlock_timedwrlock+0x8c>
*
* 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 );
10c6df: 83 ec 08 sub $0x8,%esp
10c6e2: 8d 45 f0 lea -0x10(%ebp),%eax
10c6e5: 50 push %eax
10c6e6: ff 75 0c pushl 0xc(%ebp)
10c6e9: e8 f6 61 00 00 call 1128e4 <_POSIX_Absolute_timeout_to_ticks>
10c6ee: 89 c6 mov %eax,%esi
10c6f0: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c6f3: 8d 45 f4 lea -0xc(%ebp),%eax
10c6f6: 50 push %eax
10c6f7: ff 33 pushl (%ebx)
10c6f9: 68 60 b1 12 00 push $0x12b160
10c6fe: e8 75 29 00 00 call 10f078 <_Objects_Get>
switch ( location ) {
10c703: 83 c4 10 add $0x10,%esp
10c706: 8b 55 f4 mov -0xc(%ebp),%edx
10c709: 85 d2 test %edx,%edx
10c70b: 75 4f jne 10c75c <pthread_rwlock_timedwrlock+0x8c>
(pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime));
int _EXFUN(pthread_rwlock_unlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_wrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_trywrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedwrlock,
10c70d: 83 fe 03 cmp $0x3,%esi
10c710: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
10c713: 83 ec 0c sub $0xc,%esp
10c716: 6a 00 push $0x0
10c718: ff 75 f0 pushl -0x10(%ebp)
10c71b: 0f b6 ca movzbl %dl,%ecx
10c71e: 51 push %ecx
10c71f: ff 33 pushl (%ebx)
10c721: 83 c0 10 add $0x10,%eax
10c724: 50 push %eax
10c725: 88 55 e4 mov %dl,-0x1c(%ebp)
10c728: e8 6f 1d 00 00 call 10e49c <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10c72d: 83 c4 20 add $0x20,%esp
10c730: e8 f7 33 00 00 call 10fb2c <_Thread_Enable_dispatch>
if ( !do_wait &&
10c735: 8a 55 e4 mov -0x1c(%ebp),%dl
10c738: 84 d2 test %dl,%dl
10c73a: 75 40 jne 10c77c <pthread_rwlock_timedwrlock+0xac>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
10c73c: a1 b8 b4 12 00 mov 0x12b4b8,%eax
10c741: 8b 40 34 mov 0x34(%eax),%eax
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10c744: 83 f8 02 cmp $0x2,%eax
10c747: 74 1f je 10c768 <pthread_rwlock_timedwrlock+0x98>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10c749: 83 ec 0c sub $0xc,%esp
10c74c: 50 push %eax
10c74d: e8 36 00 00 00 call 10c788 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10c752: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c755: 8d 65 f8 lea -0x8(%ebp),%esp
10c758: 5b pop %ebx
10c759: 5e pop %esi
10c75a: c9 leave
10c75b: c3 ret
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10c75c: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c761: 8d 65 f8 lea -0x8(%ebp),%esp
10c764: 5b pop %ebx
10c765: 5e pop %esi
10c766: c9 leave
10c767: c3 ret
);
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10c768: 85 f6 test %esi,%esi
10c76a: 74 f0 je 10c75c <pthread_rwlock_timedwrlock+0x8c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10c76c: 4e dec %esi
10c76d: 83 fe 01 cmp $0x1,%esi
10c770: 77 d7 ja 10c749 <pthread_rwlock_timedwrlock+0x79><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10c772: b8 74 00 00 00 mov $0x74,%eax
10c777: eb e8 jmp 10c761 <pthread_rwlock_timedwrlock+0x91>
10c779: 8d 76 00 lea 0x0(%esi),%esi
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10c77c: a1 b8 b4 12 00 mov 0x12b4b8,%eax
10c781: 8b 40 34 mov 0x34(%eax),%eax
10c784: eb c3 jmp 10c749 <pthread_rwlock_timedwrlock+0x79>
0010cee4 <pthread_rwlockattr_destroy>:
*/
int pthread_rwlockattr_destroy(
pthread_rwlockattr_t *attr
)
{
10cee4: 55 push %ebp
10cee5: 89 e5 mov %esp,%ebp
10cee7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10ceea: 85 c0 test %eax,%eax
10ceec: 74 12 je 10cf00 <pthread_rwlockattr_destroy+0x1c>
10ceee: 8b 10 mov (%eax),%edx
10cef0: 85 d2 test %edx,%edx
10cef2: 74 0c je 10cf00 <pthread_rwlockattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10cef4: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10cefa: 31 c0 xor %eax,%eax
}
10cefc: c9 leave
10cefd: c3 ret
10cefe: 66 90 xchg %ax,%ax
int pthread_rwlockattr_destroy(
pthread_rwlockattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10cf00: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10cf05: c9 leave
10cf06: c3 ret
0010cf50 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
10cf50: 55 push %ebp
10cf51: 89 e5 mov %esp,%ebp
10cf53: 8b 45 08 mov 0x8(%ebp),%eax
10cf56: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr )
10cf59: 85 c0 test %eax,%eax
10cf5b: 74 0b je 10cf68 <pthread_rwlockattr_setpshared+0x18>
return EINVAL;
if ( !attr->is_initialized )
10cf5d: 8b 08 mov (%eax),%ecx
10cf5f: 85 c9 test %ecx,%ecx
10cf61: 74 05 je 10cf68 <pthread_rwlockattr_setpshared+0x18>
return EINVAL;
switch ( pshared ) {
10cf63: 83 fa 01 cmp $0x1,%edx
10cf66: 76 08 jbe 10cf70 <pthread_rwlockattr_setpshared+0x20><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10cf68: b8 16 00 00 00 mov $0x16,%eax
}
}
10cf6d: c9 leave
10cf6e: c3 ret
10cf6f: 90 nop
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10cf70: 89 50 04 mov %edx,0x4(%eax)
return 0;
10cf73: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10cf75: c9 leave
10cf76: c3 ret
0010b214 <pthread_setcancelstate>:
int pthread_setcancelstate(
int state,
int *oldstate
)
{
10b214: 55 push %ebp
10b215: 89 e5 mov %esp,%ebp
10b217: 53 push %ebx
10b218: 83 ec 04 sub $0x4,%esp
10b21b: 8b 55 08 mov 0x8(%ebp),%edx
10b21e: 8b 45 0c mov 0xc(%ebp),%eax
* 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() )
10b221: 8b 0d 54 8e 12 00 mov 0x128e54,%ecx
10b227: 85 c9 test %ecx,%ecx
10b229: 75 15 jne 10b240 <pthread_setcancelstate+0x2c>
return EPROTO;
if ( !oldstate )
10b22b: 85 c0 test %eax,%eax
10b22d: 74 05 je 10b234 <pthread_setcancelstate+0x20>
return EINVAL;
if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE )
10b22f: 83 fa 01 cmp $0x1,%edx
10b232: 76 18 jbe 10b24c <pthread_setcancelstate+0x38>
return EINVAL;
10b234: b8 16 00 00 00 mov $0x16,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b239: 8b 5d fc mov -0x4(%ebp),%ebx
10b23c: c9 leave
10b23d: c3 ret
10b23e: 66 90 xchg %ax,%ax
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
return EPROTO;
10b240: b8 47 00 00 00 mov $0x47,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b245: 8b 5d fc mov -0x4(%ebp),%ebx
10b248: c9 leave
10b249: c3 ret
10b24a: 66 90 xchg %ax,%ax
return EINVAL;
if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE )
return EINVAL;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b24c: 8b 0d 58 8e 12 00 mov 0x128e58,%ecx
10b252: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b258: 8b 1d 70 88 12 00 mov 0x128870,%ebx
10b25e: 43 inc %ebx
10b25f: 89 1d 70 88 12 00 mov %ebx,0x128870
_Thread_Disable_dispatch();
*oldstate = thread_support->cancelability_state;
10b265: 8b 99 d8 00 00 00 mov 0xd8(%ecx),%ebx
10b26b: 89 18 mov %ebx,(%eax)
thread_support->cancelability_state = state;
10b26d: 89 91 d8 00 00 00 mov %edx,0xd8(%ecx)
_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(_Thread_Executing);
10b273: 83 ec 0c sub $0xc,%esp
10b276: ff 35 58 8e 12 00 pushl 0x128e58
10b27c: e8 5b 54 00 00 call 1106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
10b281: 83 c4 10 add $0x10,%esp
10b284: 31 c0 xor %eax,%eax
}
10b286: 8b 5d fc mov -0x4(%ebp),%ebx
10b289: c9 leave
10b28a: c3 ret
0010b28c <pthread_setcanceltype>:
int pthread_setcanceltype(
int type,
int *oldtype
)
{
10b28c: 55 push %ebp
10b28d: 89 e5 mov %esp,%ebp
10b28f: 53 push %ebx
10b290: 83 ec 04 sub $0x4,%esp
10b293: 8b 55 08 mov 0x8(%ebp),%edx
10b296: 8b 45 0c mov 0xc(%ebp),%eax
* 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() )
10b299: 8b 0d 54 8e 12 00 mov 0x128e54,%ecx
10b29f: 85 c9 test %ecx,%ecx
10b2a1: 75 15 jne 10b2b8 <pthread_setcanceltype+0x2c>
return EPROTO;
if ( !oldtype )
10b2a3: 85 c0 test %eax,%eax
10b2a5: 74 05 je 10b2ac <pthread_setcanceltype+0x20>
return EINVAL;
if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS )
10b2a7: 83 fa 01 cmp $0x1,%edx
10b2aa: 76 18 jbe 10b2c4 <pthread_setcanceltype+0x38>
return EINVAL;
10b2ac: b8 16 00 00 00 mov $0x16,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b2b1: 8b 5d fc mov -0x4(%ebp),%ebx
10b2b4: c9 leave
10b2b5: c3 ret
10b2b6: 66 90 xchg %ax,%ax
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
return EPROTO;
10b2b8: b8 47 00 00 00 mov $0x47,%eax
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
}
10b2bd: 8b 5d fc mov -0x4(%ebp),%ebx
10b2c0: c9 leave
10b2c1: c3 ret
10b2c2: 66 90 xchg %ax,%ax
return EINVAL;
if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS )
return EINVAL;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10b2c4: 8b 0d 58 8e 12 00 mov 0x128e58,%ecx
10b2ca: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
10b2d0: 8b 1d 70 88 12 00 mov 0x128870,%ebx
10b2d6: 43 inc %ebx
10b2d7: 89 1d 70 88 12 00 mov %ebx,0x128870
_Thread_Disable_dispatch();
*oldtype = thread_support->cancelability_type;
10b2dd: 8b 99 dc 00 00 00 mov 0xdc(%ecx),%ebx
10b2e3: 89 18 mov %ebx,(%eax)
thread_support->cancelability_type = type;
10b2e5: 89 91 dc 00 00 00 mov %edx,0xdc(%ecx)
_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(_Thread_Executing);
10b2eb: 83 ec 0c sub $0xc,%esp
10b2ee: ff 35 58 8e 12 00 pushl 0x128e58
10b2f4: e8 e3 53 00 00 call 1106dc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>
/*
* _Thread_Enable_dispatch is invoked by above call.
*/
return 0;
10b2f9: 83 c4 10 add $0x10,%esp
10b2fc: 31 c0 xor %eax,%eax
}
10b2fe: 8b 5d fc mov -0x4(%ebp),%ebx
10b301: c9 leave
10b302: c3 ret
0010dd04 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
10dd04: 55 push %ebp
10dd05: 89 e5 mov %esp,%ebp
10dd07: 57 push %edi
10dd08: 56 push %esi
10dd09: 53 push %ebx
10dd0a: 83 ec 2c sub $0x2c,%esp
10dd0d: 8b 75 10 mov 0x10(%ebp),%esi
int rc;
/*
* Check all the parameters
*/
if ( !param )
10dd10: 85 f6 test %esi,%esi
10dd12: 0f 84 cc 00 00 00 je 10dde4 <pthread_setschedparam+0xe0>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
10dd18: 8d 45 e0 lea -0x20(%ebp),%eax
10dd1b: 50 push %eax
10dd1c: 8d 45 e4 lea -0x1c(%ebp),%eax
10dd1f: 50 push %eax
10dd20: 56 push %esi
10dd21: ff 75 0c pushl 0xc(%ebp)
10dd24: e8 f7 5b 00 00 call 113920 <_POSIX_Thread_Translate_sched_param>
10dd29: 89 c3 mov %eax,%ebx
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
10dd2b: 83 c4 10 add $0x10,%esp
10dd2e: 85 c0 test %eax,%eax
10dd30: 74 0a je 10dd3c <pthread_setschedparam+0x38>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10dd32: 89 d8 mov %ebx,%eax
10dd34: 8d 65 f4 lea -0xc(%ebp),%esp
10dd37: 5b pop %ebx
10dd38: 5e pop %esi
10dd39: 5f pop %edi
10dd3a: c9 leave
10dd3b: c3 ret
10dd3c: 50 push %eax
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _POSIX_Threads_Get( thread, &location );
10dd3d: 8d 45 dc lea -0x24(%ebp),%eax
10dd40: 50 push %eax
10dd41: ff 75 08 pushl 0x8(%ebp)
10dd44: 68 40 b8 12 00 push $0x12b840
10dd49: e8 aa 1f 00 00 call 10fcf8 <_Objects_Get>
10dd4e: 89 c2 mov %eax,%edx
switch ( location ) {
10dd50: 83 c4 10 add $0x10,%esp
10dd53: 8b 7d dc mov -0x24(%ebp),%edi
10dd56: 85 ff test %edi,%edi
10dd58: 0f 85 96 00 00 00 jne 10ddf4 <pthread_setschedparam+0xf0>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10dd5e: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10dd64: 89 45 d4 mov %eax,-0x2c(%ebp)
if ( api->schedpolicy == SCHED_SPORADIC )
10dd67: 83 b8 84 00 00 00 04 cmpl $0x4,0x84(%eax)
10dd6e: 0f 84 cc 00 00 00 je 10de40 <pthread_setschedparam+0x13c>
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
10dd74: 8b 45 0c mov 0xc(%ebp),%eax
10dd77: 8b 4d d4 mov -0x2c(%ebp),%ecx
10dd7a: 89 81 84 00 00 00 mov %eax,0x84(%ecx)
api->schedparam = *param;
10dd80: 89 cf mov %ecx,%edi
10dd82: 81 c7 88 00 00 00 add $0x88,%edi
10dd88: b9 07 00 00 00 mov $0x7,%ecx
10dd8d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_thread->budget_algorithm = budget_algorithm;
10dd8f: 8b 45 e4 mov -0x1c(%ebp),%eax
10dd92: 89 42 7c mov %eax,0x7c(%edx)
the_thread->budget_callout = budget_callout;
10dd95: 8b 45 e0 mov -0x20(%ebp),%eax
10dd98: 89 82 80 00 00 00 mov %eax,0x80(%edx)
switch ( api->schedpolicy ) {
10dd9e: 8b 75 0c mov 0xc(%ebp),%esi
10dda1: 85 f6 test %esi,%esi
10dda3: 78 2e js 10ddd3 <pthread_setschedparam+0xcf><== NEVER TAKEN
10dda5: 83 7d 0c 02 cmpl $0x2,0xc(%ebp)
10dda9: 7f 59 jg 10de04 <pthread_setschedparam+0x100>
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10ddab: a1 40 b5 12 00 mov 0x12b540,%eax
10ddb0: 89 42 78 mov %eax,0x78(%edx)
10ddb3: 0f b6 05 5c 72 12 00 movzbl 0x12725c,%eax
10ddba: 8b 4d d4 mov -0x2c(%ebp),%ecx
10ddbd: 2b 81 88 00 00 00 sub 0x88(%ecx),%eax
the_thread->real_priority =
10ddc3: 89 42 18 mov %eax,0x18(%edx)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
10ddc6: 51 push %ecx
10ddc7: 6a 01 push $0x1
10ddc9: 50 push %eax
10ddca: 52 push %edx
10ddcb: e8 28 25 00 00 call 1102f8 <_Thread_Change_priority>
the_thread,
the_thread->real_priority,
true
);
break;
10ddd0: 83 c4 10 add $0x10,%esp
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
10ddd3: e8 d4 29 00 00 call 1107ac <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10ddd8: 89 d8 mov %ebx,%eax
10ddda: 8d 65 f4 lea -0xc(%ebp),%esp
10dddd: 5b pop %ebx
10ddde: 5e pop %esi
10dddf: 5f pop %edi
10dde0: c9 leave
10dde1: c3 ret
10dde2: 66 90 xchg %ax,%ax
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
10dde4: bb 16 00 00 00 mov $0x16,%ebx
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10dde9: 89 d8 mov %ebx,%eax
10ddeb: 8d 65 f4 lea -0xc(%ebp),%esp
10ddee: 5b pop %ebx
10ddef: 5e pop %esi
10ddf0: 5f pop %edi
10ddf1: c9 leave
10ddf2: c3 ret
10ddf3: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10ddf4: bb 03 00 00 00 mov $0x3,%ebx
}
10ddf9: 89 d8 mov %ebx,%eax
10ddfb: 8d 65 f4 lea -0xc(%ebp),%esp
10ddfe: 5b pop %ebx
10ddff: 5e pop %esi
10de00: 5f pop %edi
10de01: c9 leave
10de02: c3 ret
10de03: 90 nop
api->schedpolicy = policy;
api->schedparam = *param;
the_thread->budget_algorithm = budget_algorithm;
the_thread->budget_callout = budget_callout;
switch ( api->schedpolicy ) {
10de04: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10de08: 75 c9 jne 10ddd3 <pthread_setschedparam+0xcf><== NEVER TAKEN
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
10de0a: 8b 4d d4 mov -0x2c(%ebp),%ecx
10de0d: 8b 81 88 00 00 00 mov 0x88(%ecx),%eax
10de13: 89 81 a4 00 00 00 mov %eax,0xa4(%ecx)
_Watchdog_Remove( &api->Sporadic_timer );
10de19: 83 ec 0c sub $0xc,%esp
10de1c: 89 c8 mov %ecx,%eax
10de1e: 05 a8 00 00 00 add $0xa8,%eax
10de23: 50 push %eax
10de24: 89 55 d0 mov %edx,-0x30(%ebp)
10de27: e8 10 3a 00 00 call 11183c <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
10de2c: 58 pop %eax
10de2d: 5a pop %edx
10de2e: 8b 55 d0 mov -0x30(%ebp),%edx
10de31: 52 push %edx
10de32: 6a 00 push $0x0
10de34: e8 af fd ff ff call 10dbe8 <_POSIX_Threads_Sporadic_budget_TSR>
break;
10de39: 83 c4 10 add $0x10,%esp
10de3c: eb 95 jmp 10ddd3 <pthread_setschedparam+0xcf>
10de3e: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
10de40: 83 ec 0c sub $0xc,%esp
10de43: 05 a8 00 00 00 add $0xa8,%eax
10de48: 50 push %eax
10de49: 89 55 d0 mov %edx,-0x30(%ebp)
10de4c: e8 eb 39 00 00 call 11183c <_Watchdog_Remove>
10de51: 83 c4 10 add $0x10,%esp
10de54: 8b 55 d0 mov -0x30(%ebp),%edx
10de57: e9 18 ff ff ff jmp 10dd74 <pthread_setschedparam+0x70>
00111ce4 <pthread_sigmask>:
int pthread_sigmask(
int how,
const sigset_t *set,
sigset_t *oset
)
{
111ce4: 55 push %ebp
111ce5: 89 e5 mov %esp,%ebp
111ce7: 56 push %esi
111ce8: 53 push %ebx
111ce9: 8b 4d 08 mov 0x8(%ebp),%ecx
111cec: 8b 55 0c mov 0xc(%ebp),%edx
111cef: 8b 5d 10 mov 0x10(%ebp),%ebx
POSIX_API_Control *api;
if ( !set && !oset )
111cf2: 85 d2 test %edx,%edx
111cf4: 0f 84 8a 00 00 00 je 111d84 <pthread_sigmask+0xa0>
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
111cfa: a1 58 9b 12 00 mov 0x129b58,%eax
111cff: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
if ( oset )
111d05: 85 db test %ebx,%ebx
111d07: 74 0c je 111d15 <pthread_sigmask+0x31>
*oset = api->signals_blocked;
111d09: 8b b0 d0 00 00 00 mov 0xd0(%eax),%esi
111d0f: 89 33 mov %esi,(%ebx)
if ( !set )
111d11: 85 d2 test %edx,%edx
111d13: 74 3b je 111d50 <pthread_sigmask+0x6c>
return 0;
switch ( how ) {
111d15: 83 f9 01 cmp $0x1,%ecx
111d18: 74 5e je 111d78 <pthread_sigmask+0x94>
111d1a: 83 f9 02 cmp $0x2,%ecx
111d1d: 74 39 je 111d58 <pthread_sigmask+0x74>
111d1f: 85 c9 test %ecx,%ecx
111d21: 75 41 jne 111d64 <pthread_sigmask+0x80>
break;
case SIG_UNBLOCK:
api->signals_blocked &= ~*set;
break;
case SIG_SETMASK:
api->signals_blocked = *set;
111d23: 8b 12 mov (%edx),%edx
111d25: 89 90 d0 00 00 00 mov %edx,0xd0(%eax)
/* XXX are there critical section problems here? */
/* XXX evaluate the new set */
if ( ~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending) ) {
111d2b: 8b 15 c8 9d 12 00 mov 0x129dc8,%edx
111d31: 0b 90 d4 00 00 00 or 0xd4(%eax),%edx
/* XXX are there critical section problems here? */
/* XXX evaluate the new set */
if ( ~api->signals_blocked &
111d37: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
111d3d: f7 d0 not %eax
111d3f: 85 c2 test %eax,%edx
111d41: 74 0d je 111d50 <pthread_sigmask+0x6c>
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
111d43: e8 24 c9 ff ff call 10e66c <_Thread_Dispatch>
}
return 0;
111d48: 31 c0 xor %eax,%eax
}
111d4a: 5b pop %ebx
111d4b: 5e pop %esi
111d4c: c9 leave
111d4d: c3 ret
111d4e: 66 90 xchg %ax,%ax
if ( ~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}
return 0;
111d50: 31 c0 xor %eax,%eax
}
111d52: 5b pop %ebx
111d53: 5e pop %esi
111d54: c9 leave
111d55: c3 ret
111d56: 66 90 xchg %ax,%ax
switch ( how ) {
case SIG_BLOCK:
api->signals_blocked |= *set;
break;
case SIG_UNBLOCK:
api->signals_blocked &= ~*set;
111d58: 8b 12 mov (%edx),%edx
111d5a: f7 d2 not %edx
111d5c: 21 90 d0 00 00 00 and %edx,0xd0(%eax)
break;
111d62: eb c7 jmp 111d2b <pthread_sigmask+0x47>
case SIG_SETMASK:
api->signals_blocked = *set;
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
111d64: e8 c7 25 00 00 call 114330 <__errno>
111d69: c7 00 16 00 00 00 movl $0x16,(%eax)
111d6f: b8 ff ff ff ff mov $0xffffffff,%eax
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}
return 0;
}
111d74: 5b pop %ebx
111d75: 5e pop %esi
111d76: c9 leave
111d77: c3 ret
if ( !set )
return 0;
switch ( how ) {
case SIG_BLOCK:
api->signals_blocked |= *set;
111d78: 8b 12 mov (%edx),%edx
111d7a: 09 90 d0 00 00 00 or %edx,0xd0(%eax)
break;
111d80: eb a9 jmp 111d2b <pthread_sigmask+0x47>
111d82: 66 90 xchg %ax,%ax
sigset_t *oset
)
{
POSIX_API_Control *api;
if ( !set && !oset )
111d84: 85 db test %ebx,%ebx
111d86: 74 dc je 111d64 <pthread_sigmask+0x80>
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
111d88: a1 58 9b 12 00 mov 0x129b58,%eax
111d8d: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
111d93: e9 71 ff ff ff jmp 111d09 <pthread_sigmask+0x25>
0010bb84 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
10bb84: 55 push %ebp
10bb85: 89 e5 mov %esp,%ebp
10bb87: 83 ec 08 sub $0x8,%esp
* 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() )
10bb8a: 8b 0d d4 95 12 00 mov 0x1295d4,%ecx
10bb90: 85 c9 test %ecx,%ecx
10bb92: 75 44 jne 10bbd8 <pthread_testcancel+0x54><== NEVER TAKEN
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
10bb94: a1 d8 95 12 00 mov 0x1295d8,%eax
10bb99: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10bb9f: 8b 15 f0 8f 12 00 mov 0x128ff0,%edx
10bba5: 42 inc %edx
10bba6: 89 15 f0 8f 12 00 mov %edx,0x128ff0
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
10bbac: 8b 90 d8 00 00 00 mov 0xd8(%eax),%edx
10bbb2: 85 d2 test %edx,%edx
10bbb4: 75 26 jne 10bbdc <pthread_testcancel+0x58><== NEVER TAKEN
10bbb6: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax
10bbbc: 85 c0 test %eax,%eax
10bbbe: 74 1c je 10bbdc <pthread_testcancel+0x58>
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
10bbc0: e8 cb 28 00 00 call 10e490 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
10bbc5: 83 ec 08 sub $0x8,%esp
10bbc8: 6a ff push $0xffffffff
10bbca: ff 35 d8 95 12 00 pushl 0x1295d8
10bbd0: e8 53 5b 00 00 call 111728 <_POSIX_Thread_Exit>
10bbd5: 83 c4 10 add $0x10,%esp
}
10bbd8: c9 leave
10bbd9: c3 ret
10bbda: 66 90 xchg %ax,%ax
10bbdc: c9 leave
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
10bbdd: e9 ae 28 00 00 jmp 10e490 <_Thread_Enable_dispatch>
0010c4f0 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
10c4f0: 55 push %ebp
10c4f1: 89 e5 mov %esp,%ebp
10c4f3: 57 push %edi
10c4f4: 56 push %esi
10c4f5: 53 push %ebx
10c4f6: 83 ec 58 sub $0x58,%esp
10c4f9: 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);
10c4fc: 68 60 a1 12 00 push $0x12a160
10c501: e8 7e 09 00 00 call 10ce84 <pthread_mutex_lock>
10c506: 89 c6 mov %eax,%esi
if (result != 0) {
10c508: 83 c4 10 add $0x10,%esp
10c50b: 85 c0 test %eax,%eax
10c50d: 0f 85 c1 00 00 00 jne 10c5d4 <rtems_aio_enqueue+0xe4><== NEVER TAKEN
return result;
}
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
10c513: e8 1c 12 00 00 call 10d734 <pthread_self>
10c518: 51 push %ecx
10c519: 8d 55 c4 lea -0x3c(%ebp),%edx
10c51c: 52 push %edx
10c51d: 8d 55 e0 lea -0x20(%ebp),%edx
10c520: 52 push %edx
10c521: 50 push %eax
10c522: e8 d9 0d 00 00 call 10d300 <pthread_getschedparam>
req->caller_thread = pthread_self ();
10c527: e8 08 12 00 00 call 10d734 <pthread_self>
10c52c: 89 43 10 mov %eax,0x10(%ebx)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
10c52f: 8b 43 14 mov 0x14(%ebx),%eax
10c532: 8b 55 c4 mov -0x3c(%ebp),%edx
10c535: 2b 50 14 sub 0x14(%eax),%edx
10c538: 89 53 0c mov %edx,0xc(%ebx)
req->policy = policy;
10c53b: 8b 55 e0 mov -0x20(%ebp),%edx
10c53e: 89 53 08 mov %edx,0x8(%ebx)
req->aiocbp->error_code = EINPROGRESS;
10c541: c7 40 30 77 00 00 00 movl $0x77,0x30(%eax)
req->aiocbp->return_value = 0;
10c548: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
if ((aio_request_queue.idle_threads == 0) &&
10c54f: 83 c4 10 add $0x10,%esp
10c552: 8b 15 c8 a1 12 00 mov 0x12a1c8,%edx
10c558: 85 d2 test %edx,%edx
10c55a: 75 0d jne 10c569 <rtems_aio_enqueue+0x79>
10c55c: 83 3d c4 a1 12 00 04 cmpl $0x4,0x12a1c4
10c563: 0f 8e 83 00 00 00 jle 10c5ec <rtems_aio_enqueue+0xfc>
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,
10c569: 51 push %ecx
10c56a: 6a 00 push $0x0
10c56c: ff 30 pushl (%eax)
10c56e: 68 a8 a1 12 00 push $0x12a1a8
10c573: e8 6c fb ff ff call 10c0e4 <rtems_aio_search_fd>
10c578: 89 c7 mov %eax,%edi
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
10c57a: 83 c4 10 add $0x10,%esp
10c57d: 85 c0 test %eax,%eax
10c57f: 0f 84 df 00 00 00 je 10c664 <rtems_aio_enqueue+0x174><== ALWAYS TAKEN
{
pthread_mutex_lock (&r_chain->mutex);
10c585: 8d 57 1c lea 0x1c(%edi),%edx
10c588: 83 ec 0c sub $0xc,%esp
10c58b: 52 push %edx
10c58c: 89 55 b4 mov %edx,-0x4c(%ebp)
10c58f: e8 f0 08 00 00 call 10ce84 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
10c594: 58 pop %eax
10c595: 5a pop %edx
10c596: 53 push %ebx
10c597: 8d 47 08 lea 0x8(%edi),%eax
10c59a: 50 push %eax
10c59b: e8 70 fe ff ff call 10c410 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
10c5a0: 83 c7 20 add $0x20,%edi
10c5a3: 89 3c 24 mov %edi,(%esp)
10c5a6: e8 a9 04 00 00 call 10ca54 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
10c5ab: 8b 55 b4 mov -0x4c(%ebp),%edx
10c5ae: 89 14 24 mov %edx,(%esp)
10c5b1: e8 56 09 00 00 call 10cf0c <pthread_mutex_unlock>
10c5b6: 83 c4 10 add $0x10,%esp
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
10c5b9: 83 ec 0c sub $0xc,%esp
10c5bc: 68 60 a1 12 00 push $0x12a160
10c5c1: e8 46 09 00 00 call 10cf0c <pthread_mutex_unlock>
return 0;
10c5c6: 83 c4 10 add $0x10,%esp
}
10c5c9: 89 f0 mov %esi,%eax
10c5cb: 8d 65 f4 lea -0xc(%ebp),%esp
10c5ce: 5b pop %ebx
10c5cf: 5e pop %esi
10c5d0: 5f pop %edi
10c5d1: c9 leave
10c5d2: c3 ret
10c5d3: 90 nop
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
if (result != 0) {
free (req);
10c5d4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c5d7: 53 push %ebx <== NOT EXECUTED
10c5d8: e8 47 c5 ff ff call 108b24 <free> <== NOT EXECUTED
return result;
10c5dd: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
return 0;
}
10c5e0: 89 f0 mov %esi,%eax <== NOT EXECUTED
10c5e2: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10c5e5: 5b pop %ebx <== NOT EXECUTED
10c5e6: 5e pop %esi <== NOT EXECUTED
10c5e7: 5f pop %edi <== NOT EXECUTED
10c5e8: c9 leave <== NOT EXECUTED
10c5e9: c3 ret <== NOT EXECUTED
10c5ea: 66 90 xchg %ax,%ax <== NOT EXECUTED
if ((aio_request_queue.idle_threads == 0) &&
aio_request_queue.active_threads < AIO_MAX_THREADS)
/* we still have empty places on the active_threads chain */
{
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
10c5ec: 57 push %edi
10c5ed: 6a 01 push $0x1
10c5ef: ff 30 pushl (%eax)
10c5f1: 68 a8 a1 12 00 push $0x12a1a8
10c5f6: e8 e9 fa ff ff call 10c0e4 <rtems_aio_search_fd>
10c5fb: 89 c7 mov %eax,%edi
if (r_chain->new_fd == 1) {
10c5fd: 83 c4 10 add $0x10,%esp
10c600: 83 78 18 01 cmpl $0x1,0x18(%eax)
10c604: 0f 85 7b ff ff ff jne 10c585 <rtems_aio_enqueue+0x95>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10c60a: 83 ec 08 sub $0x8,%esp
10c60d: 53 push %ebx
10c60e: 8d 40 08 lea 0x8(%eax),%eax
10c611: 50 push %eax
10c612: e8 7d 22 00 00 call 10e894 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10c617: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
pthread_mutex_init (&r_chain->mutex, NULL);
10c61e: 5a pop %edx
10c61f: 59 pop %ecx
10c620: 6a 00 push $0x0
10c622: 8d 47 1c lea 0x1c(%edi),%eax
10c625: 50 push %eax
10c626: e8 0d 07 00 00 call 10cd38 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10c62b: 5b pop %ebx
10c62c: 58 pop %eax
10c62d: 6a 00 push $0x0
10c62f: 8d 47 20 lea 0x20(%edi),%eax
10c632: 50 push %eax
10c633: e8 68 03 00 00 call 10c9a0 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
10c638: 57 push %edi
10c639: 68 a4 c1 10 00 push $0x10c1a4
10c63e: 68 68 a1 12 00 push $0x12a168
10c643: 8d 45 e4 lea -0x1c(%ebp),%eax
10c646: 50 push %eax
10c647: e8 2c 0a 00 00 call 10d078 <pthread_create>
10c64c: 89 c3 mov %eax,%ebx
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
10c64e: 83 c4 20 add $0x20,%esp
10c651: 85 c0 test %eax,%eax
10c653: 0f 85 87 00 00 00 jne 10c6e0 <rtems_aio_enqueue+0x1f0><== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
10c659: ff 05 c4 a1 12 00 incl 0x12a1c4
10c65f: e9 55 ff ff ff jmp 10c5b9 <rtems_aio_enqueue+0xc9>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
10c664: 51 push %ecx
10c665: 6a 01 push $0x1
10c667: 8b 43 14 mov 0x14(%ebx),%eax
10c66a: ff 30 pushl (%eax)
10c66c: 68 b4 a1 12 00 push $0x12a1b4
10c671: e8 6e fa ff ff call 10c0e4 <rtems_aio_search_fd>
10c676: 89 c7 mov %eax,%edi
if (r_chain->new_fd == 1) {
10c678: 83 c4 10 add $0x10,%esp
10c67b: 83 78 18 01 cmpl $0x1,0x18(%eax)
10c67f: 74 17 je 10c698 <rtems_aio_enqueue+0x1a8>
pthread_cond_init (&r_chain->cond, NULL);
pthread_cond_signal (&aio_request_queue.new_req);
++aio_request_queue.idle_threads;
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
10c681: 83 ec 08 sub $0x8,%esp
10c684: 53 push %ebx
10c685: 83 c7 08 add $0x8,%edi
10c688: 57 push %edi
10c689: e8 82 fd ff ff call 10c410 <rtems_aio_insert_prio>
10c68e: 83 c4 10 add $0x10,%esp
10c691: e9 23 ff ff ff jmp 10c5b9 <rtems_aio_enqueue+0xc9>
10c696: 66 90 xchg %ax,%ax
10c698: 83 ec 08 sub $0x8,%esp
10c69b: 53 push %ebx
10c69c: 8d 40 08 lea 0x8(%eax),%eax
10c69f: 50 push %eax
10c6a0: e8 ef 21 00 00 call 10e894 <_Chain_Insert>
if (r_chain->new_fd == 1) {
/* If this is a new fd chain we signal the idle threads that
might be waiting for requests */
AIO_printf (" New chain on waiting queue \n ");
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10c6a5: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
pthread_mutex_init (&r_chain->mutex, NULL);
10c6ac: 58 pop %eax
10c6ad: 5a pop %edx
10c6ae: 6a 00 push $0x0
10c6b0: 8d 47 1c lea 0x1c(%edi),%eax
10c6b3: 50 push %eax
10c6b4: e8 7f 06 00 00 call 10cd38 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10c6b9: 59 pop %ecx
10c6ba: 5b pop %ebx
10c6bb: 6a 00 push $0x0
10c6bd: 83 c7 20 add $0x20,%edi
10c6c0: 57 push %edi
10c6c1: e8 da 02 00 00 call 10c9a0 <pthread_cond_init>
pthread_cond_signal (&aio_request_queue.new_req);
10c6c6: c7 04 24 64 a1 12 00 movl $0x12a164,(%esp)
10c6cd: e8 82 03 00 00 call 10ca54 <pthread_cond_signal>
++aio_request_queue.idle_threads;
10c6d2: ff 05 c8 a1 12 00 incl 0x12a1c8
10c6d8: 83 c4 10 add $0x10,%esp
10c6db: e9 d9 fe ff ff jmp 10c5b9 <rtems_aio_enqueue+0xc9>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
pthread_mutex_unlock (&aio_request_queue.mutex);
10c6e0: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c6e3: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10c6e8: e8 1f 08 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return result;
10c6ed: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c6f0: 89 de mov %ebx,%esi <== NOT EXECUTED
10c6f2: e9 d2 fe ff ff jmp 10c5c9 <rtems_aio_enqueue+0xd9><== NOT EXECUTED
0010c1a4 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
10c1a4: 55 push %ebp <== NOT EXECUTED
10c1a5: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10c1a7: 57 push %edi <== NOT EXECUTED
10c1a8: 56 push %esi <== NOT EXECUTED
10c1a9: 53 push %ebx <== NOT EXECUTED
10c1aa: 83 ec 4c sub $0x4c,%esp <== NOT EXECUTED
rtems_aio_request_chain *r_chain = arg;
10c1ad: 8b 5d 08 mov 0x8(%ebp),%ebx <== NOT EXECUTED
10c1b0: 8d 43 1c lea 0x1c(%ebx),%eax <== NOT EXECUTED
10c1b3: 89 45 b4 mov %eax,-0x4c(%ebp) <== NOT EXECUTED
10c1b6: 66 90 xchg %ax,%ax <== NOT EXECUTED
/* acquire the mutex of the current fd chain.
we don't need to lock the queue mutex since we can
add requests to idle fd chains or even active ones
if the working request has been extracted from the
chain */
result = pthread_mutex_lock (&r_chain->mutex);
10c1b8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c1bb: ff 75 b4 pushl -0x4c(%ebp) <== NOT EXECUTED
10c1be: e8 c1 0c 00 00 call 10ce84 <pthread_mutex_lock> <== NOT EXECUTED
if (result != 0)
10c1c3: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c1c6: 85 c0 test %eax,%eax <== NOT EXECUTED
10c1c8: 0f 85 92 01 00 00 jne 10c360 <rtems_aio_handle+0x1bc><== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c1ce: 8b 73 08 mov 0x8(%ebx),%esi <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10c1d1: 8d 43 0c lea 0xc(%ebx),%eax <== NOT EXECUTED
/* 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)) {
10c1d4: 39 c6 cmp %eax,%esi <== NOT EXECUTED
10c1d6: 0f 84 d0 00 00 00 je 10c2ac <rtems_aio_handle+0x108><== NOT EXECUTED
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);
10c1dc: e8 53 15 00 00 call 10d734 <pthread_self> <== NOT EXECUTED
10c1e1: 52 push %edx <== NOT EXECUTED
10c1e2: 8d 55 c0 lea -0x40(%ebp),%edx <== NOT EXECUTED
10c1e5: 52 push %edx <== NOT EXECUTED
10c1e6: 8d 55 e4 lea -0x1c(%ebp),%edx <== NOT EXECUTED
10c1e9: 52 push %edx <== NOT EXECUTED
10c1ea: 50 push %eax <== NOT EXECUTED
10c1eb: e8 10 11 00 00 call 10d300 <pthread_getschedparam> <== NOT EXECUTED
param.sched_priority = req->priority;
10c1f0: 8b 46 0c mov 0xc(%esi),%eax <== NOT EXECUTED
10c1f3: 89 45 c0 mov %eax,-0x40(%ebp) <== NOT EXECUTED
pthread_setschedparam (pthread_self(), req->policy, ¶m);
10c1f6: 8b 7e 08 mov 0x8(%esi),%edi <== NOT EXECUTED
10c1f9: e8 36 15 00 00 call 10d734 <pthread_self> <== NOT EXECUTED
10c1fe: 83 c4 0c add $0xc,%esp <== NOT EXECUTED
10c201: 8d 55 c0 lea -0x40(%ebp),%edx <== NOT EXECUTED
10c204: 52 push %edx <== NOT EXECUTED
10c205: 57 push %edi <== NOT EXECUTED
10c206: 50 push %eax <== NOT EXECUTED
10c207: e8 38 15 00 00 call 10d744 <pthread_setschedparam> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10c20c: 89 34 24 mov %esi,(%esp) <== NOT EXECUTED
10c20f: e8 44 26 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
10c214: 5f pop %edi <== NOT EXECUTED
10c215: ff 75 b4 pushl -0x4c(%ebp) <== NOT EXECUTED
10c218: e8 ef 0c 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
switch (req->aiocbp->aio_lio_opcode) {
10c21d: 8b 7e 14 mov 0x14(%esi),%edi <== NOT EXECUTED
10c220: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c223: 8b 47 2c mov 0x2c(%edi),%eax <== NOT EXECUTED
10c226: 83 f8 02 cmp $0x2,%eax <== NOT EXECUTED
10c229: 74 21 je 10c24c <rtems_aio_handle+0xa8> <== NOT EXECUTED
10c22b: 83 f8 03 cmp $0x3,%eax <== NOT EXECUTED
10c22e: 74 6c je 10c29c <rtems_aio_handle+0xf8> <== NOT EXECUTED
10c230: 48 dec %eax <== NOT EXECUTED
10c231: 74 4d je 10c280 <rtems_aio_handle+0xdc> <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
10c233: c7 47 34 ff ff ff ff movl $0xffffffff,0x34(%edi) <== NOT EXECUTED
req->aiocbp->error_code = errno;
10c23a: e8 bd 99 00 00 call 115bfc <__errno> <== NOT EXECUTED
10c23f: 8b 00 mov (%eax),%eax <== NOT EXECUTED
10c241: 89 47 30 mov %eax,0x30(%edi) <== NOT EXECUTED
10c244: e9 6f ff ff ff jmp 10c1b8 <rtems_aio_handle+0x14> <== NOT EXECUTED
10c249: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
result = pwrite (req->aiocbp->aio_fildes,
10c24c: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c24f: ff 77 08 pushl 0x8(%edi) <== NOT EXECUTED
10c252: ff 77 04 pushl 0x4(%edi) <== NOT EXECUTED
10c255: ff 77 10 pushl 0x10(%edi) <== NOT EXECUTED
10c258: ff 77 0c pushl 0xc(%edi) <== NOT EXECUTED
10c25b: ff 37 pushl (%edi) <== NOT EXECUTED
10c25d: e8 3a a4 00 00 call 11669c <pwrite> <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10c262: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
10c265: 83 f8 ff cmp $0xffffffff,%eax <== NOT EXECUTED
10c268: 0f 84 9a 01 00 00 je 10c408 <rtems_aio_handle+0x264><== NOT EXECUTED
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
10c26e: 8b 56 14 mov 0x14(%esi),%edx <== NOT EXECUTED
10c271: 89 42 34 mov %eax,0x34(%edx) <== NOT EXECUTED
req->aiocbp->error_code = 0;
10c274: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx) <== NOT EXECUTED
10c27b: e9 38 ff ff ff jmp 10c1b8 <rtems_aio_handle+0x14> <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
case LIO_READ:
result = pread (req->aiocbp->aio_fildes,
10c280: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c283: ff 77 08 pushl 0x8(%edi) <== NOT EXECUTED
10c286: ff 77 04 pushl 0x4(%edi) <== NOT EXECUTED
10c289: ff 77 10 pushl 0x10(%edi) <== NOT EXECUTED
10c28c: ff 77 0c pushl 0xc(%edi) <== NOT EXECUTED
10c28f: ff 37 pushl (%edi) <== NOT EXECUTED
10c291: e8 4e a3 00 00 call 1165e4 <pread> <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10c296: 83 c4 20 add $0x20,%esp <== NOT EXECUTED
10c299: eb ca jmp 10c265 <rtems_aio_handle+0xc1> <== NOT EXECUTED
10c29b: 90 nop <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_SYNC:
result = fsync (req->aiocbp->aio_fildes);
10c29c: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c29f: ff 37 pushl (%edi) <== NOT EXECUTED
10c2a1: e8 de 66 00 00 call 112984 <fsync> <== NOT EXECUTED
break;
10c2a6: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c2a9: eb ba jmp 10c265 <rtems_aio_handle+0xc1> <== NOT EXECUTED
10c2ab: 90 nop <== NOT EXECUTED
wait for a signal on chain, this will unlock the queue.
The fd chain is already unlocked */
struct timespec timeout;
pthread_mutex_unlock (&r_chain->mutex);
10c2ac: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c2af: ff 75 b4 pushl -0x4c(%ebp) <== NOT EXECUTED
10c2b2: e8 55 0c 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_lock (&aio_request_queue.mutex);
10c2b7: c7 04 24 60 a1 12 00 movl $0x12a160,(%esp) <== NOT EXECUTED
10c2be: e8 c1 0b 00 00 call 10ce84 <pthread_mutex_lock> <== NOT EXECUTED
if (rtems_chain_is_empty (chain))
10c2c3: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c2c6: 3b 73 08 cmp 0x8(%ebx),%esi <== NOT EXECUTED
10c2c9: 0f 85 e9 fe ff ff jne 10c1b8 <rtems_aio_handle+0x14> <== NOT EXECUTED
{
clock_gettime (CLOCK_REALTIME, &timeout);
10c2cf: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
10c2d2: 8d 45 dc lea -0x24(%ebp),%eax <== NOT EXECUTED
10c2d5: 50 push %eax <== NOT EXECUTED
10c2d6: 6a 01 push $0x1 <== NOT EXECUTED
10c2d8: e8 8b 05 00 00 call 10c868 <clock_gettime> <== NOT EXECUTED
timeout.tv_sec += 3;
10c2dd: 83 45 dc 03 addl $0x3,-0x24(%ebp) <== NOT EXECUTED
timeout.tv_nsec = 0;
10c2e1: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) <== NOT EXECUTED
result = pthread_cond_timedwait (&r_chain->cond,
10c2e8: 8d 73 20 lea 0x20(%ebx),%esi <== NOT EXECUTED
10c2eb: 83 c4 0c add $0xc,%esp <== NOT EXECUTED
10c2ee: 8d 55 dc lea -0x24(%ebp),%edx <== NOT EXECUTED
10c2f1: 52 push %edx <== NOT EXECUTED
10c2f2: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10c2f7: 56 push %esi <== NOT EXECUTED
10c2f8: e8 db 07 00 00 call 10cad8 <pthread_cond_timedwait><== NOT EXECUTED
&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) {
10c2fd: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c300: 83 f8 74 cmp $0x74,%eax <== NOT EXECUTED
10c303: 0f 85 af fe ff ff jne 10c1b8 <rtems_aio_handle+0x14> <== NOT EXECUTED
10c309: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c30c: 53 push %ebx <== NOT EXECUTED
10c30d: e8 46 25 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
10c312: 59 pop %ecx <== NOT EXECUTED
10c313: ff 75 b4 pushl -0x4c(%ebp) <== NOT EXECUTED
10c316: e8 fd 08 00 00 call 10cc18 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_cond_destroy (&r_chain->cond);
10c31b: 89 34 24 mov %esi,(%esp) <== NOT EXECUTED
10c31e: e8 b1 05 00 00 call 10c8d4 <pthread_cond_destroy> <== NOT EXECUTED
free (r_chain);
10c323: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10c326: e8 f9 c7 ff ff call 108b24 <free> <== NOT EXECUTED
/* 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)) {
10c32b: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c32e: 81 3d b4 a1 12 00 b8 cmpl $0x12a1b8,0x12a1b4 <== NOT EXECUTED
10c335: a1 12 00
10c338: 74 30 je 10c36a <rtems_aio_handle+0x1c6><== NOT EXECUTED
r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd;
}
else
/* 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);
10c33a: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c33d: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10c342: e8 c5 0b 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
10c347: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c34a: e9 69 fe ff ff jmp 10c1b8 <rtems_aio_handle+0x14> <== NOT EXECUTED
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
pthread_mutex_unlock (&aio_request_queue.mutex);
10c34f: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c352: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10c357: e8 b0 0b 00 00 call 10cf0c <pthread_mutex_unlock> <== NOT EXECUTED
return NULL;
10c35c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c35f: 90 nop <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c360: 31 c0 xor %eax,%eax <== NOT EXECUTED
10c362: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10c365: 5b pop %ebx <== NOT EXECUTED
10c366: 5e pop %esi <== NOT EXECUTED
10c367: 5f pop %edi <== NOT EXECUTED
10c368: c9 leave <== NOT EXECUTED
10c369: c3 ret <== NOT EXECUTED
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
++aio_request_queue.idle_threads;
10c36a: ff 05 c8 a1 12 00 incl 0x12a1c8 <== NOT EXECUTED
clock_gettime (CLOCK_REALTIME, &timeout);
10c370: 52 push %edx <== NOT EXECUTED
10c371: 52 push %edx <== NOT EXECUTED
10c372: 8d 45 dc lea -0x24(%ebp),%eax <== NOT EXECUTED
10c375: 50 push %eax <== NOT EXECUTED
10c376: 6a 01 push $0x1 <== NOT EXECUTED
10c378: e8 eb 04 00 00 call 10c868 <clock_gettime> <== NOT EXECUTED
timeout.tv_sec += 3;
10c37d: 83 45 dc 03 addl $0x3,-0x24(%ebp) <== NOT EXECUTED
timeout.tv_nsec = 0;
10c381: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) <== NOT EXECUTED
result = pthread_cond_timedwait (&aio_request_queue.new_req,
10c388: 83 c4 0c add $0xc,%esp <== NOT EXECUTED
10c38b: 8d 55 dc lea -0x24(%ebp),%edx <== NOT EXECUTED
10c38e: 52 push %edx <== NOT EXECUTED
10c38f: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10c394: 68 64 a1 12 00 push $0x12a164 <== NOT EXECUTED
10c399: e8 3a 07 00 00 call 10cad8 <pthread_cond_timedwait><== NOT EXECUTED
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
10c39e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c3a1: 83 f8 74 cmp $0x74,%eax <== NOT EXECUTED
10c3a4: 74 a9 je 10c34f <rtems_aio_handle+0x1ab><== NOT EXECUTED
return NULL;
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
10c3a6: ff 0d c8 a1 12 00 decl 0x12a1c8 <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c3ac: 8b 35 b4 a1 12 00 mov 0x12a1b4,%esi <== NOT EXECUTED
10c3b2: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c3b5: 56 push %esi <== NOT EXECUTED
10c3b6: e8 9d 24 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
10c3bb: 83 c4 0c add $0xc,%esp <== NOT EXECUTED
10c3be: 6a 01 push $0x1 <== NOT EXECUTED
10c3c0: ff 76 14 pushl 0x14(%esi) <== NOT EXECUTED
10c3c3: 68 a8 a1 12 00 push $0x12a1a8 <== NOT EXECUTED
10c3c8: e8 17 fd ff ff call 10c0e4 <rtems_aio_search_fd> <== NOT EXECUTED
10c3cd: 89 c3 mov %eax,%ebx <== NOT EXECUTED
((rtems_aio_request_chain *)node)->fildes,
1);
r_chain->new_fd = 0;
10c3cf: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax) <== NOT EXECUTED
pthread_mutex_init (&r_chain->mutex, NULL);
10c3d6: 5f pop %edi <== NOT EXECUTED
10c3d7: 58 pop %eax <== NOT EXECUTED
10c3d8: 6a 00 push $0x0 <== NOT EXECUTED
10c3da: 8d 43 1c lea 0x1c(%ebx),%eax <== NOT EXECUTED
10c3dd: 89 45 b4 mov %eax,-0x4c(%ebp) <== NOT EXECUTED
10c3e0: 50 push %eax <== NOT EXECUTED
10c3e1: e8 52 09 00 00 call 10cd38 <pthread_mutex_init> <== NOT EXECUTED
pthread_cond_init (&r_chain->cond, NULL);
10c3e6: 5a pop %edx <== NOT EXECUTED
10c3e7: 59 pop %ecx <== NOT EXECUTED
10c3e8: 6a 00 push $0x0 <== NOT EXECUTED
10c3ea: 8d 43 20 lea 0x20(%ebx),%eax <== NOT EXECUTED
10c3ed: 50 push %eax <== NOT EXECUTED
10c3ee: e8 ad 05 00 00 call 10c9a0 <pthread_cond_init> <== NOT EXECUTED
r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd;
10c3f3: 8d 7b 08 lea 0x8(%ebx),%edi <== NOT EXECUTED
10c3f6: 83 c6 08 add $0x8,%esi <== NOT EXECUTED
10c3f9: b9 03 00 00 00 mov $0x3,%ecx <== NOT EXECUTED
10c3fe: f3 a5 rep movsl %ds:(%esi),%es:(%edi) <== NOT EXECUTED
10c400: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c403: e9 b0 fd ff ff jmp 10c1b8 <rtems_aio_handle+0x14> <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
10c408: 8b 7e 14 mov 0x14(%esi),%edi <== NOT EXECUTED
10c40b: e9 23 fe ff ff jmp 10c233 <rtems_aio_handle+0x8f> <== NOT EXECUTED
0010bfbc <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
10bfbc: 55 push %ebp
10bfbd: 89 e5 mov %esp,%ebp
10bfbf: 53 push %ebx
10bfc0: 83 ec 10 sub $0x10,%esp
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
10bfc3: 68 68 a1 12 00 push $0x12a168
10bfc8: e8 57 10 00 00 call 10d024 <pthread_attr_init>
10bfcd: 89 c3 mov %eax,%ebx
if (result != 0)
10bfcf: 83 c4 10 add $0x10,%esp
10bfd2: 85 c0 test %eax,%eax
10bfd4: 74 0a je 10bfe0 <rtems_aio_init+0x24> <== ALWAYS TAKEN
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
10bfd6: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10bfd8: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10bfdb: c9 leave <== NOT EXECUTED
10bfdc: c3 ret <== NOT EXECUTED
10bfdd: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
result = pthread_attr_init (&aio_request_queue.attr);
if (result != 0)
return result;
result =
10bfe0: 83 ec 08 sub $0x8,%esp
10bfe3: 6a 00 push $0x0
10bfe5: 68 68 a1 12 00 push $0x12a168
10bfea: e8 61 10 00 00 call 10d050 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
10bfef: 83 c4 10 add $0x10,%esp
10bff2: 85 c0 test %eax,%eax
10bff4: 0f 85 96 00 00 00 jne 10c090 <rtems_aio_init+0xd4> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
10bffa: 83 ec 08 sub $0x8,%esp
10bffd: 6a 00 push $0x0
10bfff: 68 60 a1 12 00 push $0x12a160
10c004: e8 2f 0d 00 00 call 10cd38 <pthread_mutex_init>
if (result != 0)
10c009: 83 c4 10 add $0x10,%esp
10c00c: 85 c0 test %eax,%eax
10c00e: 0f 85 b8 00 00 00 jne 10c0cc <rtems_aio_init+0x110> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
10c014: 83 ec 08 sub $0x8,%esp
10c017: 6a 00 push $0x0
10c019: 68 64 a1 12 00 push $0x12a164
10c01e: e8 7d 09 00 00 call 10c9a0 <pthread_cond_init>
10c023: 89 c3 mov %eax,%ebx
if (result != 0) {
10c025: 83 c4 10 add $0x10,%esp
10c028: 85 c0 test %eax,%eax
10c02a: 75 7c jne 10c0a8 <rtems_aio_init+0xec> <== NEVER TAKEN
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c02c: c7 05 a8 a1 12 00 ac movl $0x12a1ac,0x12a1a8
10c033: a1 12 00
head->previous = NULL;
10c036: c7 05 ac a1 12 00 00 movl $0x0,0x12a1ac
10c03d: 00 00 00
tail->previous = head;
10c040: c7 05 b0 a1 12 00 a8 movl $0x12a1a8,0x12a1b0
10c047: a1 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c04a: c7 05 b4 a1 12 00 b8 movl $0x12a1b8,0x12a1b4
10c051: a1 12 00
head->previous = NULL;
10c054: c7 05 b8 a1 12 00 00 movl $0x0,0x12a1b8
10c05b: 00 00 00
tail->previous = head;
10c05e: c7 05 bc a1 12 00 b4 movl $0x12a1b4,0x12a1bc
10c065: a1 12 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;
10c068: c7 05 c4 a1 12 00 00 movl $0x0,0x12a1c4
10c06f: 00 00 00
aio_request_queue.idle_threads = 0;
10c072: c7 05 c8 a1 12 00 00 movl $0x0,0x12a1c8
10c079: 00 00 00
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
10c07c: c7 05 c0 a1 12 00 0b movl $0xb00b,0x12a1c0
10c083: b0 00 00
return result;
}
10c086: 89 d8 mov %ebx,%eax
10c088: 8b 5d fc mov -0x4(%ebp),%ebx
10c08b: c9 leave
10c08c: c3 ret
10c08d: 8d 76 00 lea 0x0(%esi),%esi
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
10c090: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c093: 68 68 a1 12 00 push $0x12a168 <== NOT EXECUTED
10c098: e8 63 0f 00 00 call 10d000 <pthread_attr_destroy> <== NOT EXECUTED
10c09d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0a0: e9 55 ff ff ff jmp 10bffa <rtems_aio_init+0x3e> <== NOT EXECUTED
10c0a5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
if (result != 0) {
pthread_mutex_destroy (&aio_request_queue.mutex);
10c0a8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0ab: 68 60 a1 12 00 push $0x12a160 <== NOT EXECUTED
10c0b0: e8 63 0b 00 00 call 10cc18 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
10c0b5: c7 04 24 68 a1 12 00 movl $0x12a168,(%esp) <== NOT EXECUTED
10c0bc: e8 3f 0f 00 00 call 10d000 <pthread_attr_destroy> <== NOT EXECUTED
10c0c1: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0c4: e9 63 ff ff ff jmp 10c02c <rtems_aio_init+0x70> <== NOT EXECUTED
10c0c9: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
10c0cc: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0cf: 68 68 a1 12 00 push $0x12a168 <== NOT EXECUTED
10c0d4: e8 27 0f 00 00 call 10d000 <pthread_attr_destroy> <== NOT EXECUTED
10c0d9: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0dc: e9 33 ff ff ff jmp 10c014 <rtems_aio_init+0x58> <== NOT EXECUTED
0010c410 <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
10c410: 55 push %ebp
10c411: 89 e5 mov %esp,%ebp
10c413: 56 push %esi
10c414: 53 push %ebx
10c415: 8b 55 08 mov 0x8(%ebp),%edx
10c418: 8b 75 0c mov 0xc(%ebp),%esi
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c41b: 8b 02 mov (%edx),%eax
10c41d: 8d 5a 04 lea 0x4(%edx),%ebx
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
10c420: 39 d8 cmp %ebx,%eax
10c422: 74 27 je 10c44b <rtems_aio_insert_prio+0x3b><== NEVER TAKEN
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
10c424: 8b 56 14 mov 0x14(%esi),%edx
10c427: 8b 4a 14 mov 0x14(%edx),%ecx
if (rtems_chain_is_empty (chain)) {
AIO_printf ("First in chain \n");
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
10c42a: 8b 50 14 mov 0x14(%eax),%edx
while (req->aiocbp->aio_reqprio > prio &&
10c42d: 39 4a 14 cmp %ecx,0x14(%edx)
10c430: 7c 06 jl 10c438 <rtems_aio_insert_prio+0x28><== NEVER TAKEN
10c432: eb 0e jmp 10c442 <rtems_aio_insert_prio+0x32>
10c434: 39 d8 cmp %ebx,%eax <== NOT EXECUTED
10c436: 74 0a je 10c442 <rtems_aio_insert_prio+0x32><== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c438: 8b 00 mov (%eax),%eax <== 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;
10c43a: 8b 50 14 mov 0x14(%eax),%edx <== 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 &&
10c43d: 39 4a 14 cmp %ecx,0x14(%edx) <== NOT EXECUTED
10c440: 7c f2 jl 10c434 <rtems_aio_insert_prio+0x24><== NOT EXECUTED
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
10c442: 89 75 0c mov %esi,0xc(%ebp)
10c445: 8b 40 04 mov 0x4(%eax),%eax
10c448: 89 45 08 mov %eax,0x8(%ebp)
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
10c44b: 5b pop %ebx
10c44c: 5e pop %esi
10c44d: c9 leave
10c44e: e9 41 24 00 00 jmp 10e894 <_Chain_Insert>
0010c454 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
10c454: 55 push %ebp <== NOT EXECUTED
10c455: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10c457: 53 push %ebx <== NOT EXECUTED
10c458: 83 ec 04 sub $0x4,%esp <== NOT EXECUTED
10c45b: 8b 45 08 mov 0x8(%ebp),%eax <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c45e: 8b 58 08 mov 0x8(%eax),%ebx <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10c461: 83 c0 0c add $0xc,%eax <== NOT EXECUTED
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
10c464: 39 c3 cmp %eax,%ebx <== NOT EXECUTED
10c466: 74 27 je 10c48f <rtems_aio_remove_fd+0x3b><== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10c468: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c46b: 53 push %ebx <== NOT EXECUTED
10c46c: e8 e7 23 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
10c471: 8b 43 14 mov 0x14(%ebx),%eax <== NOT EXECUTED
10c474: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax) <== NOT EXECUTED
req->aiocbp->return_value = -1;
10c47b: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax) <== NOT EXECUTED
free (req);
10c482: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10c485: e8 9a c6 ff ff call 108b24 <free> <== NOT EXECUTED
10c48a: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c48d: eb d9 jmp 10c468 <rtems_aio_remove_fd+0x14><== NOT EXECUTED
}
}
10c48f: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10c492: c9 leave <== NOT EXECUTED
10c493: c3 ret <== NOT EXECUTED
0010c494 <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)
{
10c494: 55 push %ebp <== NOT EXECUTED
10c495: 89 e5 mov %esp,%ebp <== NOT EXECUTED
10c497: 53 push %ebx <== NOT EXECUTED
10c498: 83 ec 04 sub $0x4,%esp <== NOT EXECUTED
10c49b: 8b 45 08 mov 0x8(%ebp),%eax <== NOT EXECUTED
10c49e: 8b 55 0c mov 0xc(%ebp),%edx <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c4a1: 8b 18 mov (%eax),%ebx <== NOT EXECUTED
10c4a3: 83 c0 04 add $0x4,%eax <== 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) {
10c4a6: 39 c3 cmp %eax,%ebx <== NOT EXECUTED
10c4a8: 75 08 jne 10c4b2 <rtems_aio_remove_req+0x1e><== NOT EXECUTED
10c4aa: eb 38 jmp 10c4e4 <rtems_aio_remove_req+0x50><== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c4ac: 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) {
10c4ae: 39 c3 cmp %eax,%ebx <== NOT EXECUTED
10c4b0: 74 32 je 10c4e4 <rtems_aio_remove_req+0x50><== NOT EXECUTED
10c4b2: 39 53 14 cmp %edx,0x14(%ebx) <== NOT EXECUTED
10c4b5: 75 f5 jne 10c4ac <rtems_aio_remove_req+0x18><== NOT EXECUTED
10c4b7: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c4ba: 53 push %ebx <== NOT EXECUTED
10c4bb: e8 98 23 00 00 call 10e858 <_Chain_Extract> <== NOT EXECUTED
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
10c4c0: 8b 43 14 mov 0x14(%ebx),%eax <== NOT EXECUTED
10c4c3: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax) <== NOT EXECUTED
current->aiocbp->return_value = -1;
10c4ca: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax) <== NOT EXECUTED
free (current);
10c4d1: 89 1c 24 mov %ebx,(%esp) <== NOT EXECUTED
10c4d4: e8 4b c6 ff ff call 108b24 <free> <== NOT EXECUTED
}
return AIO_CANCELED;
10c4d9: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c4dc: 31 c0 xor %eax,%eax <== NOT EXECUTED
}
10c4de: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10c4e1: c9 leave <== NOT EXECUTED
10c4e2: c3 ret <== NOT EXECUTED
10c4e3: 90 nop <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
10c4e4: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10c4e9: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10c4ec: c9 leave <== NOT EXECUTED
10c4ed: c3 ret <== NOT EXECUTED
00113684 <rtems_barrier_create>:
rtems_name name,
rtems_attribute attribute_set,
uint32_t maximum_waiters,
rtems_id *id
)
{
113684: 55 push %ebp
113685: 89 e5 mov %esp,%ebp
113687: 57 push %edi
113688: 56 push %esi
113689: 53 push %ebx
11368a: 83 ec 2c sub $0x2c,%esp
11368d: 8b 5d 08 mov 0x8(%ebp),%ebx
113690: 8b 7d 0c mov 0xc(%ebp),%edi
113693: 8b 45 10 mov 0x10(%ebp),%eax
113696: 8b 75 14 mov 0x14(%ebp),%esi
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
113699: 85 db test %ebx,%ebx
11369b: 0f 84 87 00 00 00 je 113728 <rtems_barrier_create+0xa4>
return RTEMS_INVALID_NAME;
if ( !id )
1136a1: 85 f6 test %esi,%esi
1136a3: 0f 84 bf 00 00 00 je 113768 <rtems_barrier_create+0xe4><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
1136a9: f7 c7 10 00 00 00 test $0x10,%edi
1136af: 0f 84 83 00 00 00 je 113738 <rtems_barrier_create+0xb4>
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
1136b5: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
if ( maximum_waiters == 0 )
1136bc: 85 c0 test %eax,%eax
1136be: 0f 84 80 00 00 00 je 113744 <rtems_barrier_create+0xc0>
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
the_attributes.maximum_count = maximum_waiters;
1136c4: 89 45 e4 mov %eax,-0x1c(%ebp)
1136c7: a1 70 9f 12 00 mov 0x129f70,%eax
1136cc: 40 inc %eax
1136cd: a3 70 9f 12 00 mov %eax,0x129f70
* This function allocates a barrier control block from
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Allocate( void )
{
return (Barrier_Control *) _Objects_Allocate( &_Barrier_Information );
1136d2: 83 ec 0c sub $0xc,%esp
1136d5: 68 a0 a9 12 00 push $0x12a9a0
1136da: e8 6d b0 ff ff call 10e74c <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
1136df: 83 c4 10 add $0x10,%esp
1136e2: 85 c0 test %eax,%eax
1136e4: 74 6e je 113754 <rtems_barrier_create+0xd0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_barrier->attribute_set = attribute_set;
1136e6: 89 78 10 mov %edi,0x10(%eax)
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
1136e9: 83 ec 08 sub $0x8,%esp
1136ec: 8d 55 e0 lea -0x20(%ebp),%edx
1136ef: 52 push %edx
1136f0: 8d 50 14 lea 0x14(%eax),%edx
1136f3: 52 push %edx
1136f4: 89 45 d4 mov %eax,-0x2c(%ebp)
1136f7: e8 c0 07 00 00 call 113ebc <_CORE_barrier_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1136fc: 8b 45 d4 mov -0x2c(%ebp),%eax
1136ff: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
113702: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
113705: 8b 0d bc a9 12 00 mov 0x12a9bc,%ecx
11370b: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
11370e: 89 58 0c mov %ebx,0xc(%eax)
&_Barrier_Information,
&the_barrier->Object,
(Objects_Name) name
);
*id = the_barrier->Object.id;
113711: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
113713: e8 d0 bf ff ff call 10f6e8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
113718: 83 c4 10 add $0x10,%esp
11371b: 31 c0 xor %eax,%eax
}
11371d: 8d 65 f4 lea -0xc(%ebp),%esp
113720: 5b pop %ebx
113721: 5e pop %esi
113722: 5f pop %edi
113723: c9 leave
113724: c3 ret
113725: 8d 76 00 lea 0x0(%esi),%esi
{
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
113728: b8 03 00 00 00 mov $0x3,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11372d: 8d 65 f4 lea -0xc(%ebp),%esp
113730: 5b pop %ebx
113731: 5e pop %esi
113732: 5f pop %edi
113733: c9 leave
113734: c3 ret
113735: 8d 76 00 lea 0x0(%esi),%esi
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
113738: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
11373f: eb 83 jmp 1136c4 <rtems_barrier_create+0x40>
113741: 8d 76 00 lea 0x0(%esi),%esi
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
113744: b8 0a 00 00 00 mov $0xa,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113749: 8d 65 f4 lea -0xc(%ebp),%esp
11374c: 5b pop %ebx
11374d: 5e pop %esi
11374e: 5f pop %edi
11374f: c9 leave
113750: c3 ret
113751: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
113754: e8 8f bf ff ff call 10f6e8 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
113759: b8 05 00 00 00 mov $0x5,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11375e: 8d 65 f4 lea -0xc(%ebp),%esp
113761: 5b pop %ebx
113762: 5e pop %esi
113763: 5f pop %edi
113764: c9 leave
113765: c3 ret
113766: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
113768: b8 09 00 00 00 mov $0x9,%eax
11376d: eb ae jmp 11371d <rtems_barrier_create+0x99>
0010c13c <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
10c13c: 55 push %ebp
10c13d: 89 e5 mov %esp,%ebp
10c13f: 56 push %esi
10c140: 53 push %ebx
10c141: 8b 5d 10 mov 0x10(%ebp),%ebx
10c144: 8b 75 14 mov 0x14(%ebp),%esi
RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Append_with_empty_check( chain, node );
10c147: 83 ec 08 sub $0x8,%esp
10c14a: ff 75 0c pushl 0xc(%ebp)
10c14d: ff 75 08 pushl 0x8(%ebp)
10c150: e8 e3 04 00 00 call 10c638 <_Chain_Append_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
10c155: 83 c4 10 add $0x10,%esp
10c158: 84 c0 test %al,%al
10c15a: 75 0c jne 10c168 <rtems_chain_append_with_notification+0x2c><== ALWAYS TAKEN
sc = rtems_event_send( task, events );
}
return sc;
}
10c15c: 31 c0 xor %eax,%eax
10c15e: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
10c161: 5b pop %ebx <== NOT EXECUTED
10c162: 5e pop %esi <== NOT EXECUTED
10c163: c9 leave <== NOT EXECUTED
10c164: c3 ret <== NOT EXECUTED
10c165: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
10c168: 89 75 0c mov %esi,0xc(%ebp)
10c16b: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c16e: 8d 65 f8 lea -0x8(%ebp),%esp
10c171: 5b pop %ebx
10c172: 5e pop %esi
10c173: c9 leave
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
10c174: e9 a3 f5 ff ff jmp 10b71c <rtems_event_send>
0010c17c <rtems_chain_get_with_notification>:
rtems_chain_control *chain,
rtems_id task,
rtems_event_set events,
rtems_chain_node **node
)
{
10c17c: 55 push %ebp
10c17d: 89 e5 mov %esp,%ebp
10c17f: 56 push %esi
10c180: 53 push %ebx
10c181: 8b 5d 0c mov 0xc(%ebp),%ebx
10c184: 8b 75 10 mov 0x10(%ebp),%esi
RTEMS_INLINE_ROUTINE bool rtems_chain_get_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node **node
)
{
return _Chain_Get_with_empty_check( chain, node );
10c187: 83 ec 08 sub $0x8,%esp
10c18a: ff 75 14 pushl 0x14(%ebp)
10c18d: ff 75 08 pushl 0x8(%ebp)
10c190: e8 0b 05 00 00 call 10c6a0 <_Chain_Get_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
10c195: 83 c4 10 add $0x10,%esp
10c198: 84 c0 test %al,%al
10c19a: 75 0c jne 10c1a8 <rtems_chain_get_with_notification+0x2c>
sc = rtems_event_send( task, events );
}
return sc;
}
10c19c: 31 c0 xor %eax,%eax
10c19e: 8d 65 f8 lea -0x8(%ebp),%esp
10c1a1: 5b pop %ebx
10c1a2: 5e pop %esi
10c1a3: c9 leave
10c1a4: c3 ret
10c1a5: 8d 76 00 lea 0x0(%esi),%esi
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
10c1a8: 89 75 0c mov %esi,0xc(%ebp)
10c1ab: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c1ae: 8d 65 f8 lea -0x8(%ebp),%esp
10c1b1: 5b pop %ebx
10c1b2: 5e pop %esi
10c1b3: c9 leave
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
10c1b4: e9 63 f5 ff ff jmp 10b71c <rtems_event_send>
0010c1bc <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
10c1bc: 55 push %ebp
10c1bd: 89 e5 mov %esp,%ebp
10c1bf: 57 push %edi
10c1c0: 56 push %esi
10c1c1: 53 push %ebx
10c1c2: 83 ec 1c sub $0x1c,%esp
10c1c5: 8b 75 08 mov 0x8(%ebp),%esi
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
10c1c8: 8d 7d e4 lea -0x1c(%ebp),%edi
10c1cb: 90 nop
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
10c1cc: 83 ec 0c sub $0xc,%esp
10c1cf: 56 push %esi
10c1d0: e8 07 05 00 00 call 10c6dc <_Chain_Get>
10c1d5: 89 c3 mov %eax,%ebx
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10c1d7: 83 c4 10 add $0x10,%esp
10c1da: 85 c0 test %eax,%eax
10c1dc: 75 22 jne 10c200 <rtems_chain_get_with_wait+0x44>
) {
rtems_event_set out;
sc = rtems_event_receive(
10c1de: 57 push %edi
10c1df: ff 75 10 pushl 0x10(%ebp)
10c1e2: 6a 00 push $0x0
10c1e4: ff 75 0c pushl 0xc(%ebp)
10c1e7: e8 a8 f3 ff ff call 10b594 <rtems_event_receive>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
10c1ec: 83 c4 10 add $0x10,%esp
10c1ef: 85 c0 test %eax,%eax
10c1f1: 74 d9 je 10c1cc <rtems_chain_get_with_wait+0x10><== NEVER TAKEN
timeout,
&out
);
}
*node_ptr = node;
10c1f3: 8b 55 14 mov 0x14(%ebp),%edx
10c1f6: 89 1a mov %ebx,(%edx)
return sc;
}
10c1f8: 8d 65 f4 lea -0xc(%ebp),%esp
10c1fb: 5b pop %ebx
10c1fc: 5e pop %esi
10c1fd: 5f pop %edi
10c1fe: c9 leave
10c1ff: c3 ret
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10c200: 31 c0 xor %eax,%eax
timeout,
&out
);
}
*node_ptr = node;
10c202: 8b 55 14 mov 0x14(%ebp),%edx
10c205: 89 1a mov %ebx,(%edx)
return sc;
}
10c207: 8d 65 f4 lea -0xc(%ebp),%esp
10c20a: 5b pop %ebx
10c20b: 5e pop %esi
10c20c: 5f pop %edi
10c20d: c9 leave
10c20e: c3 ret
0010c210 <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
10c210: 55 push %ebp
10c211: 89 e5 mov %esp,%ebp
10c213: 56 push %esi
10c214: 53 push %ebx
10c215: 8b 5d 10 mov 0x10(%ebp),%ebx
10c218: 8b 75 14 mov 0x14(%ebp),%esi
RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Prepend_with_empty_check( chain, node );
10c21b: 83 ec 08 sub $0x8,%esp
10c21e: ff 75 0c pushl 0xc(%ebp)
10c221: ff 75 08 pushl 0x8(%ebp)
10c224: e8 f7 04 00 00 call 10c720 <_Chain_Prepend_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
10c229: 83 c4 10 add $0x10,%esp
10c22c: 84 c0 test %al,%al
10c22e: 75 0c jne 10c23c <rtems_chain_prepend_with_notification+0x2c><== ALWAYS TAKEN
sc = rtems_event_send( task, events );
}
return sc;
}
10c230: 31 c0 xor %eax,%eax
10c232: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
10c235: 5b pop %ebx <== NOT EXECUTED
10c236: 5e pop %esi <== NOT EXECUTED
10c237: c9 leave <== NOT EXECUTED
10c238: c3 ret <== NOT EXECUTED
10c239: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
10c23c: 89 75 0c mov %esi,0xc(%ebp)
10c23f: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c242: 8d 65 f8 lea -0x8(%ebp),%esp
10c245: 5b pop %ebx
10c246: 5e pop %esi
10c247: c9 leave
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
10c248: e9 cf f4 ff ff jmp 10b71c <rtems_event_send>
00115a4c <rtems_clock_get>:
rtems_status_code rtems_clock_get(
rtems_clock_get_options option,
void *time_buffer
)
{
115a4c: 55 push %ebp
115a4d: 89 e5 mov %esp,%ebp
115a4f: 53 push %ebx
115a50: 83 ec 04 sub $0x4,%esp
115a53: 8b 45 08 mov 0x8(%ebp),%eax
115a56: 8b 5d 0c mov 0xc(%ebp),%ebx
if ( !time_buffer )
115a59: 85 db test %ebx,%ebx
115a5b: 74 3b je 115a98 <rtems_clock_get+0x4c>
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
115a5d: 85 c0 test %eax,%eax
115a5f: 74 2b je 115a8c <rtems_clock_get+0x40>
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
115a61: 83 f8 01 cmp $0x1,%eax
115a64: 74 3e je 115aa4 <rtems_clock_get+0x58>
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
115a66: 83 f8 02 cmp $0x2,%eax
115a69: 74 45 je 115ab0 <rtems_clock_get+0x64>
*interval = rtems_clock_get_ticks_since_boot();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
115a6b: 83 f8 03 cmp $0x3,%eax
115a6e: 74 4c je 115abc <rtems_clock_get+0x70>
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
115a70: 83 f8 04 cmp $0x4,%eax
115a73: 74 0b je 115a80 <rtems_clock_get+0x34>
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
115a75: b8 0a 00 00 00 mov $0xa,%eax
}
115a7a: 5a pop %edx
115a7b: 5b pop %ebx
115a7c: c9 leave
115a7d: c3 ret
115a7e: 66 90 xchg %ax,%ax
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
115a80: 89 5d 08 mov %ebx,0x8(%ebp)
return RTEMS_INVALID_NUMBER;
}
115a83: 59 pop %ecx
115a84: 5b pop %ebx
115a85: c9 leave
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
115a86: e9 41 01 00 00 jmp 115bcc <rtems_clock_get_tod_timeval>
115a8b: 90 nop
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
115a8c: 89 5d 08 mov %ebx,0x8(%ebp)
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
115a8f: 58 pop %eax
115a90: 5b pop %ebx
115a91: c9 leave
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
115a92: e9 81 00 00 00 jmp 115b18 <rtems_clock_get_tod>
115a97: 90 nop
rtems_clock_get_options option,
void *time_buffer
)
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
115a98: b8 09 00 00 00 mov $0x9,%eax
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
115a9d: 5a pop %edx
115a9e: 5b pop %ebx
115a9f: c9 leave
115aa0: c3 ret
115aa1: 8d 76 00 lea 0x0(%esi),%esi
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
115aa4: 89 5d 08 mov %ebx,0x8(%ebp)
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
115aa7: 5b pop %ebx
115aa8: 5b pop %ebx
115aa9: c9 leave
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
115aaa: e9 19 00 00 00 jmp 115ac8 <rtems_clock_get_seconds_since_epoch>
115aaf: 90 nop
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_since_boot();
115ab0: e8 57 00 00 00 call 115b0c <rtems_clock_get_ticks_since_boot>
115ab5: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
115ab7: 31 c0 xor %eax,%eax
115ab9: eb bf jmp 115a7a <rtems_clock_get+0x2e>
115abb: 90 nop
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_per_second();
115abc: e8 37 00 00 00 call 115af8 <rtems_clock_get_ticks_per_second>
115ac1: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
115ac3: 31 c0 xor %eax,%eax
115ac5: eb b3 jmp 115a7a <rtems_clock_get+0x2e>
00115bcc <rtems_clock_get_tod_timeval>:
#include <rtems/score/watchdog.h>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
115bcc: 55 push %ebp
115bcd: 89 e5 mov %esp,%ebp
115bcf: 56 push %esi
115bd0: 53 push %ebx
115bd1: 83 ec 10 sub $0x10,%esp
115bd4: 8b 5d 08 mov 0x8(%ebp),%ebx
if ( !time )
115bd7: 85 db test %ebx,%ebx
115bd9: 74 51 je 115c2c <rtems_clock_get_tod_timeval+0x60>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
115bdb: 80 3d e4 21 14 00 00 cmpb $0x0,0x1421e4
115be2: 75 0c jne 115bf0 <rtems_clock_get_tod_timeval+0x24>
return RTEMS_NOT_DEFINED;
115be4: b8 0b 00 00 00 mov $0xb,%eax
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
}
115be9: 8d 65 f8 lea -0x8(%ebp),%esp
115bec: 5b pop %ebx
115bed: 5e pop %esi
115bee: c9 leave
115bef: c3 ret
{
ISR_Level level;
struct timespec now;
suseconds_t useconds;
_ISR_Disable(level);
115bf0: 9c pushf
115bf1: fa cli
115bf2: 5e pop %esi
_TOD_Get( &now );
115bf3: 83 ec 0c sub $0xc,%esp
115bf6: 8d 45 f0 lea -0x10(%ebp),%eax
115bf9: 50 push %eax
115bfa: e8 21 44 00 00 call 11a020 <_TOD_Get>
_ISR_Enable(level);
115bff: 56 push %esi
115c00: 9d popf
useconds = (suseconds_t)now.tv_nsec;
115c01: 8b 4d f4 mov -0xc(%ebp),%ecx
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
time->tv_sec = now.tv_sec;
115c04: 8b 45 f0 mov -0x10(%ebp),%eax
115c07: 89 03 mov %eax,(%ebx)
_ISR_Disable(level);
_TOD_Get( &now );
_ISR_Enable(level);
useconds = (suseconds_t)now.tv_nsec;
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
115c09: b8 d3 4d 62 10 mov $0x10624dd3,%eax
115c0e: f7 e9 imul %ecx
115c10: 89 d0 mov %edx,%eax
115c12: c1 f8 06 sar $0x6,%eax
115c15: c1 f9 1f sar $0x1f,%ecx
115c18: 29 c8 sub %ecx,%eax
115c1a: 89 43 04 mov %eax,0x4(%ebx)
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
115c1d: 83 c4 10 add $0x10,%esp
115c20: 31 c0 xor %eax,%eax
}
115c22: 8d 65 f8 lea -0x8(%ebp),%esp
115c25: 5b pop %ebx
115c26: 5e pop %esi
115c27: c9 leave
115c28: c3 ret
115c29: 8d 76 00 lea 0x0(%esi),%esi
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
if ( !time )
return RTEMS_INVALID_ADDRESS;
115c2c: b8 09 00 00 00 mov $0x9,%eax
115c31: eb b6 jmp 115be9 <rtems_clock_get_tod_timeval+0x1d>
0010b1c4 <rtems_clock_get_uptime>:
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
10b1c4: 55 push %ebp
10b1c5: 89 e5 mov %esp,%ebp
10b1c7: 83 ec 08 sub $0x8,%esp
10b1ca: 8b 45 08 mov 0x8(%ebp),%eax
if ( !uptime )
10b1cd: 85 c0 test %eax,%eax
10b1cf: 74 13 je 10b1e4 <rtems_clock_get_uptime+0x20>
return RTEMS_INVALID_ADDRESS;
_TOD_Get_uptime_as_timespec( uptime );
10b1d1: 83 ec 0c sub $0xc,%esp
10b1d4: 50 push %eax
10b1d5: e8 82 16 00 00 call 10c85c <_TOD_Get_uptime_as_timespec>
return RTEMS_SUCCESSFUL;
10b1da: 83 c4 10 add $0x10,%esp
10b1dd: 31 c0 xor %eax,%eax
}
10b1df: c9 leave
10b1e0: c3 ret
10b1e1: 8d 76 00 lea 0x0(%esi),%esi
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
if ( !uptime )
return RTEMS_INVALID_ADDRESS;
10b1e4: b8 09 00 00 00 mov $0x9,%eax
_TOD_Get_uptime_as_timespec( uptime );
return RTEMS_SUCCESSFUL;
}
10b1e9: c9 leave
10b1ea: c3 ret
0010c0f8 <rtems_clock_set>:
*/
rtems_status_code rtems_clock_set(
rtems_time_of_day *time_buffer
)
{
10c0f8: 55 push %ebp
10c0f9: 89 e5 mov %esp,%ebp
10c0fb: 53 push %ebx
10c0fc: 83 ec 14 sub $0x14,%esp
10c0ff: 8b 5d 08 mov 0x8(%ebp),%ebx
struct timespec newtime;
if ( !time_buffer )
10c102: 85 db test %ebx,%ebx
10c104: 74 66 je 10c16c <rtems_clock_set+0x74>
return RTEMS_INVALID_ADDRESS;
if ( _TOD_Validate( time_buffer ) ) {
10c106: 83 ec 0c sub $0xc,%esp
10c109: 53 push %ebx
10c10a: e8 39 01 00 00 call 10c248 <_TOD_Validate>
10c10f: 83 c4 10 add $0x10,%esp
10c112: 84 c0 test %al,%al
10c114: 75 0a jne 10c120 <rtems_clock_set+0x28>
_Thread_Disable_dispatch();
_TOD_Set( &newtime );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_CLOCK;
10c116: b8 14 00 00 00 mov $0x14,%eax
}
10c11b: 8b 5d fc mov -0x4(%ebp),%ebx
10c11e: c9 leave
10c11f: c3 ret
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( _TOD_Validate( time_buffer ) ) {
newtime.tv_sec = _TOD_To_seconds( time_buffer );
10c120: 83 ec 0c sub $0xc,%esp
10c123: 53 push %ebx
10c124: e8 93 00 00 00 call 10c1bc <_TOD_To_seconds>
10c129: 89 45 f0 mov %eax,-0x10(%ebp)
newtime.tv_nsec = time_buffer->ticks *
10c12c: 8b 43 18 mov 0x18(%ebx),%eax
10c12f: 0f af 05 2c 62 12 00 imul 0x12622c,%eax
10c136: 8d 04 80 lea (%eax,%eax,4),%eax
10c139: 8d 04 80 lea (%eax,%eax,4),%eax
10c13c: 8d 04 80 lea (%eax,%eax,4),%eax
10c13f: c1 e0 03 shl $0x3,%eax
10c142: 89 45 f4 mov %eax,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c145: a1 50 23 13 00 mov 0x132350,%eax
10c14a: 40 inc %eax
10c14b: a3 50 23 13 00 mov %eax,0x132350
rtems_configuration_get_nanoseconds_per_tick();
_Thread_Disable_dispatch();
_TOD_Set( &newtime );
10c150: 8d 45 f0 lea -0x10(%ebp),%eax
10c153: 89 04 24 mov %eax,(%esp)
10c156: e8 69 19 00 00 call 10dac4 <_TOD_Set>
_Thread_Enable_dispatch();
10c15b: e8 f8 2e 00 00 call 10f058 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c160: 83 c4 10 add $0x10,%esp
10c163: 31 c0 xor %eax,%eax
}
return RTEMS_INVALID_CLOCK;
}
10c165: 8b 5d fc mov -0x4(%ebp),%ebx
10c168: c9 leave
10c169: c3 ret
10c16a: 66 90 xchg %ax,%ax
)
{
struct timespec newtime;
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
10c16c: b8 09 00 00 00 mov $0x9,%eax
_TOD_Set( &newtime );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_CLOCK;
}
10c171: 8b 5d fc mov -0x4(%ebp),%ebx
10c174: c9 leave
10c175: c3 ret
0010afd0 <rtems_clock_tick>:
*
* NOTE: This routine only works for leap-years through 2099.
*/
rtems_status_code rtems_clock_tick( void )
{
10afd0: 55 push %ebp
10afd1: 89 e5 mov %esp,%ebp
10afd3: 83 ec 08 sub $0x8,%esp
_TOD_Tickle_ticks();
10afd6: e8 45 15 00 00 call 10c520 <_TOD_Tickle_ticks>
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void )
{
_Watchdog_Tickle( &_Watchdog_Ticks_chain );
10afdb: 83 ec 0c sub $0xc,%esp
10afde: 68 5c 76 12 00 push $0x12765c
10afe3: e8 bc 38 00 00 call 10e8a4 <_Watchdog_Tickle>
_Watchdog_Tickle_ticks();
_Thread_Tickle_timeslice();
10afe8: e8 7f 33 00 00 call 10e36c <_Thread_Tickle_timeslice>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_context_switch_necessary( void )
{
return ( _Thread_Dispatch_necessary );
10afed: a0 44 7b 12 00 mov 0x127b44,%al
if ( _Thread_Is_context_switch_necessary() &&
10aff2: 83 c4 10 add $0x10,%esp
10aff5: 84 c0 test %al,%al
10aff7: 74 09 je 10b002 <rtems_clock_tick+0x32>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_dispatching_enabled( void )
{
return ( _Thread_Dispatch_disable_level == 0 );
10aff9: a1 50 75 12 00 mov 0x127550,%eax
10affe: 85 c0 test %eax,%eax
10b000: 74 06 je 10b008 <rtems_clock_tick+0x38>
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
return RTEMS_SUCCESSFUL;
}
10b002: 31 c0 xor %eax,%eax
10b004: c9 leave
10b005: c3 ret
10b006: 66 90 xchg %ax,%ax
_Thread_Tickle_timeslice();
if ( _Thread_Is_context_switch_necessary() &&
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
10b008: e8 77 27 00 00 call 10d784 <_Thread_Dispatch>
return RTEMS_SUCCESSFUL;
}
10b00d: 31 c0 xor %eax,%eax
10b00f: c9 leave
10b010: c3 ret
0010b19c <rtems_event_send>:
rtems_status_code rtems_event_send(
rtems_id id,
rtems_event_set event_in
)
{
10b19c: 55 push %ebp
10b19d: 89 e5 mov %esp,%ebp
10b19f: 53 push %ebx
10b1a0: 83 ec 1c sub $0x1c,%esp
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
the_thread = _Thread_Get( id, &location );
10b1a3: 8d 45 f4 lea -0xc(%ebp),%eax
10b1a6: 50 push %eax
10b1a7: ff 75 08 pushl 0x8(%ebp)
10b1aa: e8 71 27 00 00 call 10d920 <_Thread_Get>
switch ( location ) {
10b1af: 83 c4 10 add $0x10,%esp
10b1b2: 8b 55 f4 mov -0xc(%ebp),%edx
10b1b5: 85 d2 test %edx,%edx
10b1b7: 75 2b jne 10b1e4 <rtems_event_send+0x48>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
10b1b9: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
rtems_event_set *the_event_set
)
{
ISR_Level level;
_ISR_Disable( level );
10b1bf: 9c pushf
10b1c0: fa cli
10b1c1: 59 pop %ecx
*the_event_set |= the_new_events;
10b1c2: 8b 5d 0c mov 0xc(%ebp),%ebx
10b1c5: 09 1a or %ebx,(%edx)
_ISR_Enable( level );
10b1c7: 51 push %ecx
10b1c8: 9d popf
_Event_sets_Post( event_in, &api->pending_events );
_Event_Surrender( the_thread );
10b1c9: 83 ec 0c sub $0xc,%esp
10b1cc: 50 push %eax
10b1cd: e8 1e 00 00 00 call 10b1f0 <_Event_Surrender>
_Thread_Enable_dispatch();
10b1d2: e8 25 27 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b1d7: 83 c4 10 add $0x10,%esp
10b1da: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b1dc: 8b 5d fc mov -0x4(%ebp),%ebx
10b1df: c9 leave
10b1e0: c3 ret
10b1e1: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b1e4: b8 04 00 00 00 mov $0x4,%eax
}
10b1e9: 8b 5d fc mov -0x4(%ebp),%ebx
10b1ec: c9 leave
10b1ed: c3 ret
0010d008 <rtems_extension_delete>:
#include <rtems/extension.h>
rtems_status_code rtems_extension_delete(
rtems_id id
)
{
10d008: 55 push %ebp
10d009: 89 e5 mov %esp,%ebp
10d00b: 53 push %ebx
10d00c: 83 ec 18 sub $0x18,%esp
Extension_Control *the_extension;
Objects_Locations location;
the_extension = _Extension_Get( id, &location );
10d00f: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Extension_Control *)
_Objects_Get( &_Extension_Information, id, location );
10d012: 50 push %eax
10d013: ff 75 08 pushl 0x8(%ebp)
10d016: 68 e0 25 13 00 push $0x1325e0
10d01b: e8 2c 12 00 00 call 10e24c <_Objects_Get>
10d020: 89 c3 mov %eax,%ebx
switch ( location ) {
10d022: 83 c4 10 add $0x10,%esp
10d025: 8b 55 f4 mov -0xc(%ebp),%edx
10d028: 85 d2 test %edx,%edx
10d02a: 75 38 jne 10d064 <rtems_extension_delete+0x5c>
case OBJECTS_LOCAL:
_User_extensions_Remove_set( &the_extension->Extension );
10d02c: 83 ec 0c sub $0xc,%esp
10d02f: 8d 40 10 lea 0x10(%eax),%eax
10d032: 50 push %eax
10d033: e8 ac 29 00 00 call 10f9e4 <_User_extensions_Remove_set>
_Objects_Close( &_Extension_Information, &the_extension->Object );
10d038: 59 pop %ecx
10d039: 58 pop %eax
10d03a: 53 push %ebx
10d03b: 68 e0 25 13 00 push $0x1325e0
10d040: e8 cb 0d 00 00 call 10de10 <_Objects_Close>
RTEMS_INLINE_ROUTINE void _Extension_Free (
Extension_Control *the_extension
)
{
_Objects_Free( &_Extension_Information, &the_extension->Object );
10d045: 58 pop %eax
10d046: 5a pop %edx
10d047: 53 push %ebx
10d048: 68 e0 25 13 00 push $0x1325e0
10d04d: e8 ba 10 00 00 call 10e10c <_Objects_Free>
_Extension_Free( the_extension );
_Thread_Enable_dispatch();
10d052: e8 a9 1c 00 00 call 10ed00 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d057: 83 c4 10 add $0x10,%esp
10d05a: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d05c: 8b 5d fc mov -0x4(%ebp),%ebx
10d05f: c9 leave
10d060: c3 ret
10d061: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d064: b8 04 00 00 00 mov $0x4,%eax
}
10d069: 8b 5d fc mov -0x4(%ebp),%ebx
10d06c: c9 leave
10d06d: c3 ret
00113018 <rtems_io_close>:
rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113018: 55 push %ebp
113019: 89 e5 mov %esp,%ebp
11301b: 53 push %ebx
11301c: 83 ec 04 sub $0x4,%esp
11301f: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113022: 39 05 00 80 12 00 cmp %eax,0x128000
113028: 76 1a jbe 113044 <rtems_io_close+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
11302a: 8d 14 40 lea (%eax,%eax,2),%edx
11302d: c1 e2 03 shl $0x3,%edx
113030: 03 15 04 80 12 00 add 0x128004,%edx
113036: 8b 52 08 mov 0x8(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113039: 85 d2 test %edx,%edx
11303b: 74 13 je 113050 <rtems_io_close+0x38>
}
11303d: 59 pop %ecx
11303e: 5b pop %ebx
11303f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113040: ff e2 jmp *%edx
113042: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113044: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113049: 5a pop %edx
11304a: 5b pop %ebx
11304b: c9 leave
11304c: c3 ret
11304d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113050: 31 c0 xor %eax,%eax
}
113052: 5a pop %edx
113053: 5b pop %ebx
113054: c9 leave
113055: c3 ret
00113058 <rtems_io_control>:
rtems_status_code rtems_io_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113058: 55 push %ebp
113059: 89 e5 mov %esp,%ebp
11305b: 53 push %ebx
11305c: 83 ec 04 sub $0x4,%esp
11305f: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113062: 39 05 00 80 12 00 cmp %eax,0x128000
113068: 76 1a jbe 113084 <rtems_io_control+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
11306a: 8d 14 40 lea (%eax,%eax,2),%edx
11306d: c1 e2 03 shl $0x3,%edx
113070: 03 15 04 80 12 00 add 0x128004,%edx
113076: 8b 52 14 mov 0x14(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113079: 85 d2 test %edx,%edx
11307b: 74 13 je 113090 <rtems_io_control+0x38>
}
11307d: 59 pop %ecx
11307e: 5b pop %ebx
11307f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113080: ff e2 jmp *%edx
113082: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113084: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113089: 5a pop %edx
11308a: 5b pop %ebx
11308b: c9 leave
11308c: c3 ret
11308d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113090: 31 c0 xor %eax,%eax
}
113092: 5a pop %edx
113093: 5b pop %ebx
113094: c9 leave
113095: c3 ret
00111014 <rtems_io_initialize>:
rtems_status_code rtems_io_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
111014: 55 push %ebp
111015: 89 e5 mov %esp,%ebp
111017: 53 push %ebx
111018: 83 ec 04 sub $0x4,%esp
11101b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
11101e: 39 05 00 80 12 00 cmp %eax,0x128000
111024: 76 1a jbe 111040 <rtems_io_initialize+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
111026: 8d 14 40 lea (%eax,%eax,2),%edx
111029: c1 e2 03 shl $0x3,%edx
11102c: 03 15 04 80 12 00 add 0x128004,%edx
111032: 8b 12 mov (%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
111034: 85 d2 test %edx,%edx
111036: 74 14 je 11104c <rtems_io_initialize+0x38>
}
111038: 59 pop %ecx
111039: 5b pop %ebx
11103a: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
11103b: ff e2 jmp *%edx
11103d: 8d 76 00 lea 0x0(%esi),%esi
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
111040: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
111045: 5a pop %edx
111046: 5b pop %ebx
111047: c9 leave
111048: c3 ret
111049: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
11104c: 31 c0 xor %eax,%eax
}
11104e: 5a pop %edx
11104f: 5b pop %ebx
111050: c9 leave
111051: c3 ret
00113098 <rtems_io_open>:
rtems_status_code rtems_io_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113098: 55 push %ebp
113099: 89 e5 mov %esp,%ebp
11309b: 53 push %ebx
11309c: 83 ec 04 sub $0x4,%esp
11309f: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
1130a2: 39 05 00 80 12 00 cmp %eax,0x128000
1130a8: 76 1a jbe 1130c4 <rtems_io_open+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
1130aa: 8d 14 40 lea (%eax,%eax,2),%edx
1130ad: c1 e2 03 shl $0x3,%edx
1130b0: 03 15 04 80 12 00 add 0x128004,%edx
1130b6: 8b 52 04 mov 0x4(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130b9: 85 d2 test %edx,%edx
1130bb: 74 13 je 1130d0 <rtems_io_open+0x38>
}
1130bd: 59 pop %ecx
1130be: 5b pop %ebx
1130bf: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130c0: ff e2 jmp *%edx
1130c2: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
1130c4: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
1130c9: 5a pop %edx
1130ca: 5b pop %ebx
1130cb: c9 leave
1130cc: c3 ret
1130cd: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130d0: 31 c0 xor %eax,%eax
}
1130d2: 5a pop %edx
1130d3: 5b pop %ebx
1130d4: c9 leave
1130d5: c3 ret
001130d8 <rtems_io_read>:
rtems_status_code rtems_io_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
1130d8: 55 push %ebp
1130d9: 89 e5 mov %esp,%ebp
1130db: 53 push %ebx
1130dc: 83 ec 04 sub $0x4,%esp
1130df: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
1130e2: 39 05 00 80 12 00 cmp %eax,0x128000
1130e8: 76 1a jbe 113104 <rtems_io_read+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
1130ea: 8d 14 40 lea (%eax,%eax,2),%edx
1130ed: c1 e2 03 shl $0x3,%edx
1130f0: 03 15 04 80 12 00 add 0x128004,%edx
1130f6: 8b 52 0c mov 0xc(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
1130f9: 85 d2 test %edx,%edx
1130fb: 74 13 je 113110 <rtems_io_read+0x38>
}
1130fd: 59 pop %ecx
1130fe: 5b pop %ebx
1130ff: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113100: ff e2 jmp *%edx
113102: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113104: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113109: 5a pop %edx
11310a: 5b pop %ebx
11310b: c9 leave
11310c: c3 ret
11310d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113110: 31 c0 xor %eax,%eax
}
113112: 5a pop %edx
113113: 5b pop %ebx
113114: c9 leave
113115: c3 ret
0010cebc <rtems_io_register_driver>:
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
10cebc: 55 push %ebp
10cebd: 89 e5 mov %esp,%ebp
10cebf: 57 push %edi
10cec0: 56 push %esi
10cec1: 53 push %ebx
10cec2: 83 ec 0c sub $0xc,%esp
10cec5: 8b 5d 08 mov 0x8(%ebp),%ebx
10cec8: 8b 75 0c mov 0xc(%ebp),%esi
10cecb: 8b 55 10 mov 0x10(%ebp),%edx
rtems_device_major_number major_limit = _IO_Number_of_drivers;
10cece: a1 e0 bc 12 00 mov 0x12bce0,%eax
if ( rtems_interrupt_is_in_progress() )
10ced3: 8b 0d 14 b8 12 00 mov 0x12b814,%ecx
10ced9: 85 c9 test %ecx,%ecx
10cedb: 0f 85 ab 00 00 00 jne 10cf8c <rtems_io_register_driver+0xd0>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
10cee1: 85 d2 test %edx,%edx
10cee3: 0f 84 e7 00 00 00 je 10cfd0 <rtems_io_register_driver+0x114>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
10cee9: 89 02 mov %eax,(%edx)
if ( driver_table == NULL )
10ceeb: 85 f6 test %esi,%esi
10ceed: 0f 84 dd 00 00 00 je 10cfd0 <rtems_io_register_driver+0x114>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cef3: 8b 3e mov (%esi),%edi
10cef5: 85 ff test %edi,%edi
10cef7: 0f 84 c7 00 00 00 je 10cfc4 <rtems_io_register_driver+0x108>
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
10cefd: 39 d8 cmp %ebx,%eax
10ceff: 76 7b jbe 10cf7c <rtems_io_register_driver+0xc0>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10cf01: a1 30 b2 12 00 mov 0x12b230,%eax
10cf06: 40 inc %eax
10cf07: a3 30 b2 12 00 mov %eax,0x12b230
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
10cf0c: 85 db test %ebx,%ebx
10cf0e: 0f 85 88 00 00 00 jne 10cf9c <rtems_io_register_driver+0xe0>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
10cf14: 8b 0d e0 bc 12 00 mov 0x12bce0,%ecx
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
10cf1a: 85 c9 test %ecx,%ecx
10cf1c: 0f 84 bb 00 00 00 je 10cfdd <rtems_io_register_driver+0x121><== NEVER TAKEN
10cf22: 8b 3d e4 bc 12 00 mov 0x12bce4,%edi
10cf28: 89 f8 mov %edi,%eax
10cf2a: eb 08 jmp 10cf34 <rtems_io_register_driver+0x78>
10cf2c: 43 inc %ebx
10cf2d: 83 c0 18 add $0x18,%eax
10cf30: 39 d9 cmp %ebx,%ecx
10cf32: 76 0b jbe 10cf3f <rtems_io_register_driver+0x83>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cf34: 83 38 00 cmpl $0x0,(%eax)
10cf37: 75 f3 jne 10cf2c <rtems_io_register_driver+0x70>
10cf39: 83 78 04 00 cmpl $0x0,0x4(%eax)
10cf3d: 75 ed jne 10cf2c <rtems_io_register_driver+0x70>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
10cf3f: 89 1a mov %ebx,(%edx)
if ( m != n )
10cf41: 39 d9 cmp %ebx,%ecx
10cf43: 0f 84 9b 00 00 00 je 10cfe4 <rtems_io_register_driver+0x128>
10cf49: 8d 04 5b lea (%ebx,%ebx,2),%eax
10cf4c: c1 e0 03 shl $0x3,%eax
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
10cf4f: 01 c7 add %eax,%edi
10cf51: b9 06 00 00 00 mov $0x6,%ecx
10cf56: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Thread_Enable_dispatch();
10cf58: e8 ab 1c 00 00 call 10ec08 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
10cf5d: c7 45 10 00 00 00 00 movl $0x0,0x10(%ebp)
10cf64: c7 45 0c 00 00 00 00 movl $0x0,0xc(%ebp)
10cf6b: 89 5d 08 mov %ebx,0x8(%ebp)
}
10cf6e: 83 c4 0c add $0xc,%esp
10cf71: 5b pop %ebx
10cf72: 5e pop %esi
10cf73: 5f pop %edi
10cf74: c9 leave
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
10cf75: e9 2e 7e 00 00 jmp 114da8 <rtems_io_initialize>
10cf7a: 66 90 xchg %ax,%ax
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
10cf7c: b8 0a 00 00 00 mov $0xa,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cf81: 83 c4 0c add $0xc,%esp
10cf84: 5b pop %ebx
10cf85: 5e pop %esi
10cf86: 5f pop %edi
10cf87: c9 leave
10cf88: c3 ret
10cf89: 8d 76 00 lea 0x0(%esi),%esi
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
10cf8c: b8 12 00 00 00 mov $0x12,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cf91: 83 c4 0c add $0xc,%esp
10cf94: 5b pop %ebx
10cf95: 5e pop %esi
10cf96: 5f pop %edi
10cf97: c9 leave
10cf98: c3 ret
10cf99: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
10cf9c: 8d 04 5b lea (%ebx,%ebx,2),%eax
10cf9f: c1 e0 03 shl $0x3,%eax
10cfa2: 8b 0d e4 bc 12 00 mov 0x12bce4,%ecx
10cfa8: 01 c1 add %eax,%ecx
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cfaa: 8b 39 mov (%ecx),%edi
10cfac: 85 ff test %edi,%edi
10cfae: 74 40 je 10cff0 <rtems_io_register_driver+0x134>
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
10cfb0: e8 53 1c 00 00 call 10ec08 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
10cfb5: b8 0c 00 00 00 mov $0xc,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cfba: 83 c4 0c add $0xc,%esp
10cfbd: 5b pop %ebx
10cfbe: 5e pop %esi
10cfbf: 5f pop %edi
10cfc0: c9 leave
10cfc1: c3 ret
10cfc2: 66 90 xchg %ax,%ax
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cfc4: 8b 4e 04 mov 0x4(%esi),%ecx
10cfc7: 85 c9 test %ecx,%ecx
10cfc9: 0f 85 2e ff ff ff jne 10cefd <rtems_io_register_driver+0x41>
10cfcf: 90 nop
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
10cfd0: b8 09 00 00 00 mov $0x9,%eax
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
10cfd5: 83 c4 0c add $0xc,%esp
10cfd8: 5b pop %ebx
10cfd9: 5e pop %esi
10cfda: 5f pop %edi
10cfdb: c9 leave
10cfdc: c3 ret
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
10cfdd: c7 02 00 00 00 00 movl $0x0,(%edx) <== NOT EXECUTED
10cfe3: 90 nop <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
10cfe4: e8 1f 1c 00 00 call 10ec08 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
10cfe9: b8 05 00 00 00 mov $0x5,%eax
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
10cfee: eb 91 jmp 10cf81 <rtems_io_register_driver+0xc5>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
10cff0: 8b 49 04 mov 0x4(%ecx),%ecx
10cff3: 85 c9 test %ecx,%ecx
10cff5: 75 b9 jne 10cfb0 <rtems_io_register_driver+0xf4>
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
10cff7: 89 1a mov %ebx,(%edx)
10cff9: 8b 3d e4 bc 12 00 mov 0x12bce4,%edi
10cfff: e9 4b ff ff ff jmp 10cf4f <rtems_io_register_driver+0x93>
0010d004 <rtems_io_unregister_driver>:
*/
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
10d004: 55 push %ebp
10d005: 89 e5 mov %esp,%ebp
10d007: 57 push %edi
10d008: 83 ec 04 sub $0x4,%esp
10d00b: 8b 45 08 mov 0x8(%ebp),%eax
if ( rtems_interrupt_is_in_progress() )
10d00e: 8b 0d 14 b8 12 00 mov 0x12b814,%ecx
10d014: 85 c9 test %ecx,%ecx
10d016: 75 44 jne 10d05c <rtems_io_unregister_driver+0x58>
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
10d018: 39 05 e0 bc 12 00 cmp %eax,0x12bce0
10d01e: 77 0c ja 10d02c <rtems_io_unregister_driver+0x28>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
10d020: b8 0d 00 00 00 mov $0xd,%eax
}
10d025: 5a pop %edx
10d026: 5f pop %edi
10d027: c9 leave
10d028: c3 ret
10d029: 8d 76 00 lea 0x0(%esi),%esi
10d02c: 8b 15 30 b2 12 00 mov 0x12b230,%edx
10d032: 42 inc %edx
10d033: 89 15 30 b2 12 00 mov %edx,0x12b230
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
&_IO_Driver_address_table[major],
10d039: 8d 14 40 lea (%eax,%eax,2),%edx
10d03c: c1 e2 03 shl $0x3,%edx
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
10d03f: 03 15 e4 bc 12 00 add 0x12bce4,%edx
10d045: b9 18 00 00 00 mov $0x18,%ecx
10d04a: 31 c0 xor %eax,%eax
10d04c: 89 d7 mov %edx,%edi
10d04e: f3 aa rep stos %al,%es:(%edi)
&_IO_Driver_address_table[major],
0,
sizeof( rtems_driver_address_table )
);
_Thread_Enable_dispatch();
10d050: e8 b3 1b 00 00 call 10ec08 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d055: 31 c0 xor %eax,%eax
}
return RTEMS_UNSATISFIED;
}
10d057: 5a pop %edx
10d058: 5f pop %edi
10d059: c9 leave
10d05a: c3 ret
10d05b: 90 nop
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
10d05c: b8 12 00 00 00 mov $0x12,%eax
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
}
10d061: 5a pop %edx
10d062: 5f pop %edi
10d063: c9 leave
10d064: c3 ret
00113118 <rtems_io_write>:
rtems_status_code rtems_io_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113118: 55 push %ebp
113119: 89 e5 mov %esp,%ebp
11311b: 53 push %ebx
11311c: 83 ec 04 sub $0x4,%esp
11311f: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
113122: 39 05 00 80 12 00 cmp %eax,0x128000
113128: 76 1a jbe 113144 <rtems_io_write+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
11312a: 8d 14 40 lea (%eax,%eax,2),%edx
11312d: c1 e2 03 shl $0x3,%edx
113130: 03 15 04 80 12 00 add 0x128004,%edx
113136: 8b 52 10 mov 0x10(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113139: 85 d2 test %edx,%edx
11313b: 74 13 je 113150 <rtems_io_write+0x38>
}
11313d: 59 pop %ecx
11313e: 5b pop %ebx
11313f: c9 leave
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113140: ff e2 jmp *%edx
113142: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113144: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113149: 5a pop %edx
11314a: 5b pop %ebx
11314b: c9 leave
11314c: c3 ret
11314d: 8d 76 00 lea 0x0(%esi),%esi
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113150: 31 c0 xor %eax,%eax
}
113152: 5a pop %edx
113153: 5b pop %ebx
113154: c9 leave
113155: c3 ret
0010dfa0 <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)
{
10dfa0: 55 push %ebp
10dfa1: 89 e5 mov %esp,%ebp
10dfa3: 57 push %edi
10dfa4: 56 push %esi
10dfa5: 53 push %ebx
10dfa6: 83 ec 1c sub $0x1c,%esp
10dfa9: 8b 7d 08 mov 0x8(%ebp),%edi
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
10dfac: 85 ff test %edi,%edi
10dfae: 74 49 je 10dff9 <rtems_iterate_over_all_threads+0x59><== NEVER TAKEN
10dfb0: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%ebp)
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
10dfb7: 8b 55 e4 mov -0x1c(%ebp),%edx
10dfba: 8b 04 95 28 23 13 00 mov 0x132328(,%edx,4),%eax
10dfc1: 8b 70 04 mov 0x4(%eax),%esi
if ( !information )
10dfc4: 85 f6 test %esi,%esi
10dfc6: 74 28 je 10dff0 <rtems_iterate_over_all_threads+0x50>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10dfc8: 66 83 7e 10 00 cmpw $0x0,0x10(%esi)
10dfcd: 74 21 je 10dff0 <rtems_iterate_over_all_threads+0x50>
10dfcf: bb 01 00 00 00 mov $0x1,%ebx
the_thread = (Thread_Control *)information->local_table[ i ];
10dfd4: 8b 46 1c mov 0x1c(%esi),%eax
10dfd7: 8b 04 98 mov (%eax,%ebx,4),%eax
if ( !the_thread )
10dfda: 85 c0 test %eax,%eax
10dfdc: 74 09 je 10dfe7 <rtems_iterate_over_all_threads+0x47><== NEVER TAKEN
continue;
(*routine)(the_thread);
10dfde: 83 ec 0c sub $0xc,%esp
10dfe1: 50 push %eax
10dfe2: ff d7 call *%edi
10dfe4: 83 c4 10 add $0x10,%esp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10dfe7: 43 inc %ebx
10dfe8: 0f b7 46 10 movzwl 0x10(%esi),%eax
10dfec: 39 d8 cmp %ebx,%eax
10dfee: 73 e4 jae 10dfd4 <rtems_iterate_over_all_threads+0x34>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
10dff0: ff 45 e4 incl -0x1c(%ebp)
10dff3: 83 7d e4 04 cmpl $0x4,-0x1c(%ebp)
10dff7: 75 be jne 10dfb7 <rtems_iterate_over_all_threads+0x17>
(*routine)(the_thread);
}
}
}
10dff9: 8d 65 f4 lea -0xc(%ebp),%esp
10dffc: 5b pop %ebx
10dffd: 5e pop %esi
10dffe: 5f pop %edi
10dfff: c9 leave
10e000: c3 ret
001163a8 <rtems_message_queue_broadcast>:
rtems_id id,
const void *buffer,
size_t size,
uint32_t *count
)
{
1163a8: 55 push %ebp
1163a9: 89 e5 mov %esp,%ebp
1163ab: 57 push %edi
1163ac: 56 push %esi
1163ad: 53 push %ebx
1163ae: 83 ec 1c sub $0x1c,%esp
1163b1: 8b 7d 08 mov 0x8(%ebp),%edi
1163b4: 8b 5d 0c mov 0xc(%ebp),%ebx
1163b7: 8b 75 14 mov 0x14(%ebp),%esi
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status core_status;
if ( !buffer )
1163ba: 85 db test %ebx,%ebx
1163bc: 74 62 je 116420 <rtems_message_queue_broadcast+0x78>
return RTEMS_INVALID_ADDRESS;
if ( !count )
1163be: 85 f6 test %esi,%esi
1163c0: 74 5e je 116420 <rtems_message_queue_broadcast+0x78>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
1163c2: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1163c3: 8d 45 e4 lea -0x1c(%ebp),%eax
1163c6: 50 push %eax
1163c7: 57 push %edi
1163c8: 68 00 2c 14 00 push $0x142c00
1163cd: e8 f6 4e 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
1163d2: 83 c4 10 add $0x10,%esp
1163d5: 8b 55 e4 mov -0x1c(%ebp),%edx
1163d8: 85 d2 test %edx,%edx
1163da: 74 10 je 1163ec <rtems_message_queue_broadcast+0x44>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1163dc: b8 04 00 00 00 mov $0x4,%eax
}
1163e1: 8d 65 f4 lea -0xc(%ebp),%esp
1163e4: 5b pop %ebx
1163e5: 5e pop %esi
1163e6: 5f pop %edi
1163e7: c9 leave
1163e8: c3 ret
1163e9: 8d 76 00 lea 0x0(%esi),%esi
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
core_status = _CORE_message_queue_Broadcast(
1163ec: 83 ec 08 sub $0x8,%esp
1163ef: 56 push %esi
1163f0: 6a 00 push $0x0
1163f2: 57 push %edi
1163f3: ff 75 10 pushl 0x10(%ebp)
1163f6: 53 push %ebx
1163f7: 83 c0 14 add $0x14,%eax
1163fa: 50 push %eax
1163fb: e8 cc 34 00 00 call 1198cc <_CORE_message_queue_Broadcast>
116400: 89 c3 mov %eax,%ebx
NULL,
#endif
count
);
_Thread_Enable_dispatch();
116402: 83 c4 20 add $0x20,%esp
116405: e8 72 59 00 00 call 11bd7c <_Thread_Enable_dispatch>
return
11640a: 83 ec 0c sub $0xc,%esp
11640d: 53 push %ebx
11640e: e8 69 03 00 00 call 11677c <_Message_queue_Translate_core_message_queue_return_code>
116413: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116416: 8d 65 f4 lea -0xc(%ebp),%esp
116419: 5b pop %ebx
11641a: 5e pop %esi
11641b: 5f pop %edi
11641c: c9 leave
11641d: c3 ret
11641e: 66 90 xchg %ax,%ax
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116420: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116425: 8d 65 f4 lea -0xc(%ebp),%esp
116428: 5b pop %ebx
116429: 5e pop %esi
11642a: 5f pop %edi
11642b: c9 leave
11642c: c3 ret
00113844 <rtems_message_queue_create>:
uint32_t count,
size_t max_message_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
113844: 55 push %ebp
113845: 89 e5 mov %esp,%ebp
113847: 57 push %edi
113848: 56 push %esi
113849: 53 push %ebx
11384a: 83 ec 2c sub $0x2c,%esp
11384d: 8b 5d 08 mov 0x8(%ebp),%ebx
113850: 8b 75 0c mov 0xc(%ebp),%esi
113853: 8b 4d 10 mov 0x10(%ebp),%ecx
113856: 8b 7d 18 mov 0x18(%ebp),%edi
CORE_message_queue_Attributes the_msgq_attributes;
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
113859: 85 db test %ebx,%ebx
11385b: 74 2f je 11388c <rtems_message_queue_create+0x48>
return RTEMS_INVALID_NAME;
if ( !id )
11385d: 85 ff test %edi,%edi
11385f: 0f 84 a3 00 00 00 je 113908 <rtems_message_queue_create+0xc4>
if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
113865: 85 f6 test %esi,%esi
113867: 74 13 je 11387c <rtems_message_queue_create+0x38>
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
113869: 85 c9 test %ecx,%ecx
11386b: 75 2f jne 11389c <rtems_message_queue_create+0x58>
return RTEMS_INVALID_SIZE;
11386d: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113872: 8d 65 f4 lea -0xc(%ebp),%esp
113875: 5b pop %ebx
113876: 5e pop %esi
113877: 5f pop %edi
113878: c9 leave
113879: c3 ret
11387a: 66 90 xchg %ax,%ax
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
return RTEMS_INVALID_NUMBER;
11387c: b8 0a 00 00 00 mov $0xa,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113881: 8d 65 f4 lea -0xc(%ebp),%esp
113884: 5b pop %ebx
113885: 5e pop %esi
113886: 5f pop %edi
113887: c9 leave
113888: c3 ret
113889: 8d 76 00 lea 0x0(%esi),%esi
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
11388c: b8 03 00 00 00 mov $0x3,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113891: 8d 65 f4 lea -0xc(%ebp),%esp
113894: 5b pop %ebx
113895: 5e pop %esi
113896: 5f pop %edi
113897: c9 leave
113898: c3 ret
113899: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
11389c: a1 f0 0b 13 00 mov 0x130bf0,%eax
1138a1: 40 inc %eax
1138a2: a3 f0 0b 13 00 mov %eax,0x130bf0
#endif
#endif
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
1138a7: 89 4d d4 mov %ecx,-0x2c(%ebp)
1138aa: e8 dd 5f 00 00 call 11988c <_Message_queue_Allocate>
1138af: 89 c2 mov %eax,%edx
if ( !the_message_queue ) {
1138b1: 85 c0 test %eax,%eax
1138b3: 8b 4d d4 mov -0x2c(%ebp),%ecx
1138b6: 74 7c je 113934 <rtems_message_queue_create+0xf0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_message_queue->attribute_set = attribute_set;
1138b8: 8b 45 14 mov 0x14(%ebp),%eax
1138bb: 89 42 10 mov %eax,0x10(%edx)
if (_Attributes_Is_priority( attribute_set ) )
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
1138be: a8 04 test $0x4,%al
1138c0: 0f 95 c0 setne %al
1138c3: 0f b6 c0 movzbl %al,%eax
1138c6: 89 45 e4 mov %eax,-0x1c(%ebp)
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( ! _CORE_message_queue_Initialize(
1138c9: 51 push %ecx
1138ca: 56 push %esi
1138cb: 8d 45 e4 lea -0x1c(%ebp),%eax
1138ce: 50 push %eax
1138cf: 8d 42 14 lea 0x14(%edx),%eax
1138d2: 50 push %eax
1138d3: 89 55 d4 mov %edx,-0x2c(%ebp)
1138d6: e8 31 11 00 00 call 114a0c <_CORE_message_queue_Initialize>
1138db: 83 c4 10 add $0x10,%esp
1138de: 84 c0 test %al,%al
1138e0: 8b 55 d4 mov -0x2c(%ebp),%edx
1138e3: 75 2f jne 113914 <rtems_message_queue_create+0xd0>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
1138e5: 83 ec 08 sub $0x8,%esp
1138e8: 52 push %edx
1138e9: 68 20 16 13 00 push $0x131620
1138ee: e8 c1 1f 00 00 call 1158b4 <_Objects_Free>
_Objects_MP_Close(
&_Message_queue_Information, the_message_queue->Object.id);
#endif
_Message_queue_Free( the_message_queue );
_Thread_Enable_dispatch();
1138f3: e8 30 2c 00 00 call 116528 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
1138f8: 83 c4 10 add $0x10,%esp
1138fb: b8 0d 00 00 00 mov $0xd,%eax
113900: e9 6d ff ff ff jmp 113872 <rtems_message_queue_create+0x2e>
113905: 8d 76 00 lea 0x0(%esi),%esi
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
113908: b8 09 00 00 00 mov $0x9,%eax
11390d: e9 60 ff ff ff jmp 113872 <rtems_message_queue_create+0x2e>
113912: 66 90 xchg %ax,%ax
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
113914: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
113917: 0f b7 f0 movzwl %ax,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
11391a: 8b 0d 3c 16 13 00 mov 0x13163c,%ecx
113920: 89 14 b1 mov %edx,(%ecx,%esi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
113923: 89 5a 0c mov %ebx,0xc(%edx)
&_Message_queue_Information,
&the_message_queue->Object,
(Objects_Name) name
);
*id = the_message_queue->Object.id;
113926: 89 07 mov %eax,(%edi)
name,
0
);
#endif
_Thread_Enable_dispatch();
113928: e8 fb 2b 00 00 call 116528 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11392d: 31 c0 xor %eax,%eax
11392f: e9 3e ff ff ff jmp 113872 <rtems_message_queue_create+0x2e>
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
if ( !the_message_queue ) {
_Thread_Enable_dispatch();
113934: e8 ef 2b 00 00 call 116528 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
113939: b8 05 00 00 00 mov $0x5,%eax
11393e: e9 2f ff ff ff jmp 113872 <rtems_message_queue_create+0x2e>
00116530 <rtems_message_queue_delete>:
*/
rtems_status_code rtems_message_queue_delete(
rtems_id id
)
{
116530: 55 push %ebp
116531: 89 e5 mov %esp,%ebp
116533: 53 push %ebx
116534: 83 ec 18 sub $0x18,%esp
register Message_queue_Control *the_message_queue;
Objects_Locations location;
the_message_queue = _Message_queue_Get( id, &location );
116537: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
11653a: 50 push %eax
11653b: ff 75 08 pushl 0x8(%ebp)
11653e: 68 00 2c 14 00 push $0x142c00
116543: e8 80 4d 00 00 call 11b2c8 <_Objects_Get>
116548: 89 c3 mov %eax,%ebx
switch ( location ) {
11654a: 83 c4 10 add $0x10,%esp
11654d: 8b 4d f4 mov -0xc(%ebp),%ecx
116550: 85 c9 test %ecx,%ecx
116552: 75 3c jne 116590 <rtems_message_queue_delete+0x60>
case OBJECTS_LOCAL:
_Objects_Close( &_Message_queue_Information,
116554: 83 ec 08 sub $0x8,%esp
116557: 50 push %eax
116558: 68 00 2c 14 00 push $0x142c00
11655d: e8 ee 48 00 00 call 11ae50 <_Objects_Close>
&the_message_queue->Object );
_CORE_message_queue_Close(
116562: 83 c4 0c add $0xc,%esp
116565: 6a 05 push $0x5
116567: 6a 00 push $0x0
116569: 8d 43 14 lea 0x14(%ebx),%eax
11656c: 50 push %eax
11656d: e8 de 33 00 00 call 119950 <_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 );
116572: 58 pop %eax
116573: 5a pop %edx
116574: 53 push %ebx
116575: 68 00 2c 14 00 push $0x142c00
11657a: e8 cd 4b 00 00 call 11b14c <_Objects_Free>
0, /* Not used */
0
);
}
#endif
_Thread_Enable_dispatch();
11657f: e8 f8 57 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116584: 83 c4 10 add $0x10,%esp
116587: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116589: 8b 5d fc mov -0x4(%ebp),%ebx
11658c: c9 leave
11658d: c3 ret
11658e: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116590: b8 04 00 00 00 mov $0x4,%eax
}
116595: 8b 5d fc mov -0x4(%ebp),%ebx
116598: c9 leave
116599: c3 ret
0011659c <rtems_message_queue_flush>:
rtems_status_code rtems_message_queue_flush(
rtems_id id,
uint32_t *count
)
{
11659c: 55 push %ebp
11659d: 89 e5 mov %esp,%ebp
11659f: 53 push %ebx
1165a0: 83 ec 14 sub $0x14,%esp
1165a3: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
1165a6: 85 db test %ebx,%ebx
1165a8: 74 46 je 1165f0 <rtems_message_queue_flush+0x54>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
1165aa: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1165ab: 8d 45 f4 lea -0xc(%ebp),%eax
1165ae: 50 push %eax
1165af: ff 75 08 pushl 0x8(%ebp)
1165b2: 68 00 2c 14 00 push $0x142c00
1165b7: e8 0c 4d 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
1165bc: 83 c4 10 add $0x10,%esp
1165bf: 8b 55 f4 mov -0xc(%ebp),%edx
1165c2: 85 d2 test %edx,%edx
1165c4: 74 0a je 1165d0 <rtems_message_queue_flush+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1165c6: b8 04 00 00 00 mov $0x4,%eax
}
1165cb: 8b 5d fc mov -0x4(%ebp),%ebx
1165ce: c9 leave
1165cf: c3 ret
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
*count = _CORE_message_queue_Flush( &the_message_queue->message_queue );
1165d0: 83 ec 0c sub $0xc,%esp
1165d3: 83 c0 14 add $0x14,%eax
1165d6: 50 push %eax
1165d7: e8 b0 33 00 00 call 11998c <_CORE_message_queue_Flush>
1165dc: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
1165de: e8 99 57 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1165e3: 83 c4 10 add $0x10,%esp
1165e6: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1165e8: 8b 5d fc mov -0x4(%ebp),%ebx
1165eb: c9 leave
1165ec: c3 ret
1165ed: 8d 76 00 lea 0x0(%esi),%esi
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
1165f0: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1165f5: 8b 5d fc mov -0x4(%ebp),%ebx
1165f8: c9 leave
1165f9: c3 ret
001165fc <rtems_message_queue_get_number_pending>:
rtems_status_code rtems_message_queue_get_number_pending(
rtems_id id,
uint32_t *count
)
{
1165fc: 55 push %ebp
1165fd: 89 e5 mov %esp,%ebp
1165ff: 53 push %ebx
116600: 83 ec 14 sub $0x14,%esp
116603: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
116606: 85 db test %ebx,%ebx
116608: 74 3a je 116644 <rtems_message_queue_get_number_pending+0x48>
11660a: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
11660b: 8d 45 f4 lea -0xc(%ebp),%eax
11660e: 50 push %eax
11660f: ff 75 08 pushl 0x8(%ebp)
116612: 68 00 2c 14 00 push $0x142c00
116617: e8 ac 4c 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
11661c: 83 c4 10 add $0x10,%esp
11661f: 8b 55 f4 mov -0xc(%ebp),%edx
116622: 85 d2 test %edx,%edx
116624: 74 0a je 116630 <rtems_message_queue_get_number_pending+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116626: b8 04 00 00 00 mov $0x4,%eax
}
11662b: 8b 5d fc mov -0x4(%ebp),%ebx
11662e: c9 leave
11662f: c3 ret
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
*count = the_message_queue->message_queue.number_of_pending_messages;
116630: 8b 40 5c mov 0x5c(%eax),%eax
116633: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
116635: e8 42 57 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11663a: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11663c: 8b 5d fc mov -0x4(%ebp),%ebx
11663f: c9 leave
116640: c3 ret
116641: 8d 76 00 lea 0x0(%esi),%esi
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116644: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116649: 8b 5d fc mov -0x4(%ebp),%ebx
11664c: c9 leave
11664d: c3 ret
00113968 <rtems_message_queue_receive>:
void *buffer,
size_t *size,
rtems_option option_set,
rtems_interval timeout
)
{
113968: 55 push %ebp
113969: 89 e5 mov %esp,%ebp
11396b: 56 push %esi
11396c: 53 push %ebx
11396d: 83 ec 10 sub $0x10,%esp
113970: 8b 5d 0c mov 0xc(%ebp),%ebx
113973: 8b 75 10 mov 0x10(%ebp),%esi
register Message_queue_Control *the_message_queue;
Objects_Locations location;
bool wait;
if ( !buffer )
113976: 85 db test %ebx,%ebx
113978: 74 6e je 1139e8 <rtems_message_queue_receive+0x80>
return RTEMS_INVALID_ADDRESS;
if ( !size )
11397a: 85 f6 test %esi,%esi
11397c: 74 6a je 1139e8 <rtems_message_queue_receive+0x80>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
11397e: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
11397f: 8d 45 f4 lea -0xc(%ebp),%eax
113982: 50 push %eax
113983: ff 75 08 pushl 0x8(%ebp)
113986: 68 20 16 13 00 push $0x131620
11398b: e8 64 20 00 00 call 1159f4 <_Objects_Get>
switch ( location ) {
113990: 83 c4 10 add $0x10,%esp
113993: 8b 55 f4 mov -0xc(%ebp),%edx
113996: 85 d2 test %edx,%edx
113998: 75 42 jne 1139dc <rtems_message_queue_receive+0x74>
if ( _Options_Is_no_wait( option_set ) )
wait = false;
else
wait = true;
_CORE_message_queue_Seize(
11399a: 83 ec 08 sub $0x8,%esp
11399d: ff 75 18 pushl 0x18(%ebp)
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
1139a0: 8b 55 14 mov 0x14(%ebp),%edx
1139a3: 83 e2 01 and $0x1,%edx
1139a6: 83 f2 01 xor $0x1,%edx
1139a9: 52 push %edx
1139aa: 56 push %esi
1139ab: 53 push %ebx
1139ac: ff 70 08 pushl 0x8(%eax)
1139af: 83 c0 14 add $0x14,%eax
1139b2: 50 push %eax
1139b3: e8 04 11 00 00 call 114abc <_CORE_message_queue_Seize>
buffer,
size,
wait,
timeout
);
_Thread_Enable_dispatch();
1139b8: 83 c4 20 add $0x20,%esp
1139bb: e8 68 2b 00 00 call 116528 <_Thread_Enable_dispatch>
return _Message_queue_Translate_core_message_queue_return_code(
1139c0: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code
1139c3: a1 d8 11 13 00 mov 0x1311d8,%eax
size,
wait,
timeout
);
_Thread_Enable_dispatch();
return _Message_queue_Translate_core_message_queue_return_code(
1139c8: ff 70 34 pushl 0x34(%eax)
1139cb: e8 a0 00 00 00 call 113a70 <_Message_queue_Translate_core_message_queue_return_code>
1139d0: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1139d3: 8d 65 f8 lea -0x8(%ebp),%esp
1139d6: 5b pop %ebx
1139d7: 5e pop %esi
1139d8: c9 leave
1139d9: c3 ret
1139da: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1139dc: b8 04 00 00 00 mov $0x4,%eax
}
1139e1: 8d 65 f8 lea -0x8(%ebp),%esp
1139e4: 5b pop %ebx
1139e5: 5e pop %esi
1139e6: c9 leave
1139e7: c3 ret
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
1139e8: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1139ed: 8d 65 f8 lea -0x8(%ebp),%esp
1139f0: 5b pop %ebx
1139f1: 5e pop %esi
1139f2: c9 leave
1139f3: c3 ret
0010b3a8 <rtems_message_queue_send>:
rtems_status_code rtems_message_queue_send(
rtems_id id,
const void *buffer,
size_t size
)
{
10b3a8: 55 push %ebp
10b3a9: 89 e5 mov %esp,%ebp
10b3ab: 56 push %esi
10b3ac: 53 push %ebx
10b3ad: 83 ec 10 sub $0x10,%esp
10b3b0: 8b 75 08 mov 0x8(%ebp),%esi
10b3b3: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
10b3b6: 85 db test %ebx,%ebx
10b3b8: 74 5e je 10b418 <rtems_message_queue_send+0x70>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
10b3ba: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
10b3bb: 8d 45 f4 lea -0xc(%ebp),%eax
10b3be: 50 push %eax
10b3bf: 56 push %esi
10b3c0: 68 80 7f 12 00 push $0x127f80
10b3c5: e8 7e 1a 00 00 call 10ce48 <_Objects_Get>
switch ( location ) {
10b3ca: 83 c4 10 add $0x10,%esp
10b3cd: 8b 55 f4 mov -0xc(%ebp),%edx
10b3d0: 85 d2 test %edx,%edx
10b3d2: 74 0c je 10b3e0 <rtems_message_queue_send+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b3d4: b8 04 00 00 00 mov $0x4,%eax
}
10b3d9: 8d 65 f8 lea -0x8(%ebp),%esp
10b3dc: 5b pop %ebx
10b3dd: 5e pop %esi
10b3de: c9 leave
10b3df: c3 ret
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
bool wait,
Watchdog_Interval timeout
)
{
return _CORE_message_queue_Submit(
10b3e0: 6a 00 push $0x0
10b3e2: 6a 00 push $0x0
10b3e4: 68 ff ff ff 7f push $0x7fffffff
10b3e9: 6a 00 push $0x0
10b3eb: 56 push %esi
10b3ec: ff 75 10 pushl 0x10(%ebp)
10b3ef: 53 push %ebx
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status = _CORE_message_queue_Send(
10b3f0: 83 c0 14 add $0x14,%eax
10b3f3: 50 push %eax
10b3f4: e8 43 0c 00 00 call 10c03c <_CORE_message_queue_Submit>
10b3f9: 89 c3 mov %eax,%ebx
MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0 /* no timeout */
);
_Thread_Enable_dispatch();
10b3fb: 83 c4 20 add $0x20,%esp
10b3fe: e8 f9 24 00 00 call 10d8fc <_Thread_Enable_dispatch>
/*
* Since this API does not allow for blocking sends, we can directly
* return the returned status.
*/
return _Message_queue_Translate_core_message_queue_return_code(status);
10b403: 83 ec 0c sub $0xc,%esp
10b406: 53 push %ebx
10b407: e8 18 00 00 00 call 10b424 <_Message_queue_Translate_core_message_queue_return_code>
10b40c: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b40f: 8d 65 f8 lea -0x8(%ebp),%esp
10b412: 5b pop %ebx
10b413: 5e pop %esi
10b414: c9 leave
10b415: c3 ret
10b416: 66 90 xchg %ax,%ax
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
10b418: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b41d: 8d 65 f8 lea -0x8(%ebp),%esp
10b420: 5b pop %ebx
10b421: 5e pop %esi
10b422: c9 leave
10b423: c3 ret
0011678c <rtems_message_queue_urgent>:
rtems_status_code rtems_message_queue_urgent(
rtems_id id,
const void *buffer,
size_t size
)
{
11678c: 55 push %ebp
11678d: 89 e5 mov %esp,%ebp
11678f: 56 push %esi
116790: 53 push %ebx
116791: 83 ec 10 sub $0x10,%esp
116794: 8b 75 08 mov 0x8(%ebp),%esi
116797: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
11679a: 85 db test %ebx,%ebx
11679c: 74 5e je 1167fc <rtems_message_queue_urgent+0x70>
11679e: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
11679f: 8d 45 f4 lea -0xc(%ebp),%eax
1167a2: 50 push %eax
1167a3: 56 push %esi
1167a4: 68 00 2c 14 00 push $0x142c00
1167a9: e8 1a 4b 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
1167ae: 83 c4 10 add $0x10,%esp
1167b1: 8b 55 f4 mov -0xc(%ebp),%edx
1167b4: 85 d2 test %edx,%edx
1167b6: 74 0c je 1167c4 <rtems_message_queue_urgent+0x38>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1167b8: b8 04 00 00 00 mov $0x4,%eax
}
1167bd: 8d 65 f8 lea -0x8(%ebp),%esp
1167c0: 5b pop %ebx
1167c1: 5e pop %esi
1167c2: c9 leave
1167c3: c3 ret
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
bool wait,
Watchdog_Interval timeout
)
{
return _CORE_message_queue_Submit(
1167c4: 6a 00 push $0x0
1167c6: 6a 00 push $0x0
1167c8: 68 00 00 00 80 push $0x80000000
1167cd: 6a 00 push $0x0
1167cf: 56 push %esi
1167d0: ff 75 10 pushl 0x10(%ebp)
1167d3: 53 push %ebx
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status = _CORE_message_queue_Urgent(
1167d4: 83 c0 14 add $0x14,%eax
1167d7: 50 push %eax
1167d8: e8 ef 33 00 00 call 119bcc <_CORE_message_queue_Submit>
1167dd: 89 c3 mov %eax,%ebx
id,
MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0 /* no timeout */
);
_Thread_Enable_dispatch();
1167df: 83 c4 20 add $0x20,%esp
1167e2: e8 95 55 00 00 call 11bd7c <_Thread_Enable_dispatch>
/*
* Since this API does not allow for blocking sends, we can directly
* return the returned status.
*/
return _Message_queue_Translate_core_message_queue_return_code(status);
1167e7: 83 ec 0c sub $0xc,%esp
1167ea: 53 push %ebx
1167eb: e8 8c ff ff ff call 11677c <_Message_queue_Translate_core_message_queue_return_code>
1167f0: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1167f3: 8d 65 f8 lea -0x8(%ebp),%esp
1167f6: 5b pop %ebx
1167f7: 5e pop %esi
1167f8: c9 leave
1167f9: c3 ret
1167fa: 66 90 xchg %ax,%ax
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
1167fc: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116801: 8d 65 f8 lea -0x8(%ebp),%esp
116804: 5b pop %ebx
116805: 5e pop %esi
116806: c9 leave
116807: c3 ret
0010b974 <rtems_object_get_api_name>:
};
const char *rtems_object_get_api_name(
int api
)
{
10b974: 55 push %ebp
10b975: 89 e5 mov %esp,%ebp
10b977: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *api_assoc;
api_assoc = rtems_assoc_ptr_by_local( rtems_objects_api_assoc, api );
10b97a: ff 75 08 pushl 0x8(%ebp)
10b97d: 68 80 74 12 00 push $0x127480
10b982: e8 ad 49 00 00 call 110334 <rtems_assoc_ptr_by_local>
if ( api_assoc )
10b987: 83 c4 10 add $0x10,%esp
10b98a: 85 c0 test %eax,%eax
10b98c: 74 06 je 10b994 <rtems_object_get_api_name+0x20>
return api_assoc->name;
10b98e: 8b 00 mov (%eax),%eax
return "BAD CLASS";
}
10b990: c9 leave
10b991: c3 ret
10b992: 66 90 xchg %ax,%ax
const rtems_assoc_t *api_assoc;
api_assoc = rtems_assoc_ptr_by_local( rtems_objects_api_assoc, api );
if ( api_assoc )
return api_assoc->name;
return "BAD CLASS";
10b994: b8 63 24 12 00 mov $0x122463,%eax
}
10b999: c9 leave
10b99a: c3 ret
0010cf5c <rtems_object_get_class_information>:
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
10cf5c: 55 push %ebp
10cf5d: 89 e5 mov %esp,%ebp
10cf5f: 57 push %edi
10cf60: 56 push %esi
10cf61: 53 push %ebx
10cf62: 83 ec 0c sub $0xc,%esp
10cf65: 8b 5d 10 mov 0x10(%ebp),%ebx
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
10cf68: 85 db test %ebx,%ebx
10cf6a: 74 60 je 10cfcc <rtems_object_get_class_information+0x70>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
10cf6c: 83 ec 08 sub $0x8,%esp
10cf6f: 0f b7 45 0c movzwl 0xc(%ebp),%eax
10cf73: 50 push %eax
10cf74: ff 75 08 pushl 0x8(%ebp)
10cf77: e8 5c 1b 00 00 call 10ead8 <_Objects_Get_information>
if ( !obj_info )
10cf7c: 83 c4 10 add $0x10,%esp
10cf7f: 85 c0 test %eax,%eax
10cf81: 74 59 je 10cfdc <rtems_object_get_class_information+0x80>
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
10cf83: 8b 50 08 mov 0x8(%eax),%edx
10cf86: 89 13 mov %edx,(%ebx)
info->maximum_id = obj_info->maximum_id;
10cf88: 8b 50 0c mov 0xc(%eax),%edx
10cf8b: 89 53 04 mov %edx,0x4(%ebx)
info->auto_extend = obj_info->auto_extend;
10cf8e: 8a 50 12 mov 0x12(%eax),%dl
10cf91: 88 53 0c mov %dl,0xc(%ebx)
info->maximum = obj_info->maximum;
10cf94: 0f b7 70 10 movzwl 0x10(%eax),%esi
10cf98: 89 73 08 mov %esi,0x8(%ebx)
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cf9b: 85 f6 test %esi,%esi
10cf9d: 74 44 je 10cfe3 <rtems_object_get_class_information+0x87><== NEVER TAKEN
10cf9f: 8b 78 1c mov 0x1c(%eax),%edi
10cfa2: b9 01 00 00 00 mov $0x1,%ecx
10cfa7: b8 01 00 00 00 mov $0x1,%eax
10cfac: 31 d2 xor %edx,%edx
10cfae: 66 90 xchg %ax,%ax
if ( !obj_info->local_table[i] )
unallocated++;
10cfb0: 83 3c 8f 01 cmpl $0x1,(%edi,%ecx,4)
10cfb4: 83 d2 00 adc $0x0,%edx
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cfb7: 40 inc %eax
10cfb8: 89 c1 mov %eax,%ecx
10cfba: 39 c6 cmp %eax,%esi
10cfbc: 73 f2 jae 10cfb0 <rtems_object_get_class_information+0x54>
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
10cfbe: 89 53 10 mov %edx,0x10(%ebx)
return RTEMS_SUCCESSFUL;
10cfc1: 31 c0 xor %eax,%eax
}
10cfc3: 8d 65 f4 lea -0xc(%ebp),%esp
10cfc6: 5b pop %ebx
10cfc7: 5e pop %esi
10cfc8: 5f pop %edi
10cfc9: c9 leave
10cfca: c3 ret
10cfcb: 90 nop
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
10cfcc: b8 09 00 00 00 mov $0x9,%eax
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
10cfd1: 8d 65 f4 lea -0xc(%ebp),%esp
10cfd4: 5b pop %ebx
10cfd5: 5e pop %esi
10cfd6: 5f pop %edi
10cfd7: c9 leave
10cfd8: c3 ret
10cfd9: 8d 76 00 lea 0x0(%esi),%esi
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
return RTEMS_INVALID_NUMBER;
10cfdc: b8 0a 00 00 00 mov $0xa,%eax
10cfe1: eb e0 jmp 10cfc3 <rtems_object_get_class_information+0x67>
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cfe3: 31 d2 xor %edx,%edx
10cfe5: eb d7 jmp 10cfbe <rtems_object_get_class_information+0x62>
0010c50c <rtems_object_get_classic_name>:
rtems_status_code rtems_object_get_classic_name(
rtems_id id,
rtems_name *name
)
{
10c50c: 55 push %ebp
10c50d: 89 e5 mov %esp,%ebp
10c50f: 53 push %ebx
10c510: 83 ec 14 sub $0x14,%esp
10c513: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
10c516: 85 db test %ebx,%ebx
10c518: 74 26 je 10c540 <rtems_object_get_classic_name+0x34>
return RTEMS_INVALID_ADDRESS;
status = _Objects_Id_to_name( id, &name_u );
10c51a: 83 ec 08 sub $0x8,%esp
10c51d: 8d 45 f4 lea -0xc(%ebp),%eax
10c520: 50 push %eax
10c521: ff 75 08 pushl 0x8(%ebp)
10c524: e8 b7 1b 00 00 call 10e0e0 <_Objects_Id_to_name>
*name = name_u.name_u32;
10c529: 8b 55 f4 mov -0xc(%ebp),%edx
10c52c: 89 13 mov %edx,(%ebx)
return _Status_Object_name_errors_to_status[ status ];
10c52e: 8b 04 85 2c 30 12 00 mov 0x12302c(,%eax,4),%eax
10c535: 83 c4 10 add $0x10,%esp
}
10c538: 8b 5d fc mov -0x4(%ebp),%ebx
10c53b: c9 leave
10c53c: c3 ret
10c53d: 8d 76 00 lea 0x0(%esi),%esi
{
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
return RTEMS_INVALID_ADDRESS;
10c540: b8 09 00 00 00 mov $0x9,%eax
status = _Objects_Id_to_name( id, &name_u );
*name = name_u.name_u32;
return _Status_Object_name_errors_to_status[ status ];
}
10c545: 8b 5d fc mov -0x4(%ebp),%ebx
10c548: c9 leave
10c549: c3 ret
0010b9a8 <rtems_object_set_name>:
*/
rtems_status_code rtems_object_set_name(
rtems_id id,
const char *name
)
{
10b9a8: 55 push %ebp
10b9a9: 89 e5 mov %esp,%ebp
10b9ab: 57 push %edi
10b9ac: 56 push %esi
10b9ad: 53 push %ebx
10b9ae: 83 ec 1c sub $0x1c,%esp
10b9b1: 8b 75 08 mov 0x8(%ebp),%esi
10b9b4: 8b 7d 0c mov 0xc(%ebp),%edi
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
10b9b7: 85 ff test %edi,%edi
10b9b9: 74 61 je 10ba1c <rtems_object_set_name+0x74>
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10b9bb: 85 f6 test %esi,%esi
10b9bd: 74 35 je 10b9f4 <rtems_object_set_name+0x4c>
information = _Objects_Get_information_id( tmpId );
10b9bf: 83 ec 0c sub $0xc,%esp
10b9c2: 56 push %esi
10b9c3: e8 34 19 00 00 call 10d2fc <_Objects_Get_information_id>
10b9c8: 89 c3 mov %eax,%ebx
if ( !information )
10b9ca: 83 c4 10 add $0x10,%esp
10b9cd: 85 c0 test %eax,%eax
10b9cf: 74 16 je 10b9e7 <rtems_object_set_name+0x3f>
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
10b9d1: 50 push %eax
10b9d2: 8d 45 e4 lea -0x1c(%ebp),%eax
10b9d5: 50 push %eax
10b9d6: 56 push %esi
10b9d7: 53 push %ebx
10b9d8: e8 d7 1a 00 00 call 10d4b4 <_Objects_Get>
switch ( location ) {
10b9dd: 83 c4 10 add $0x10,%esp
10b9e0: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b9e3: 85 c9 test %ecx,%ecx
10b9e5: 74 19 je 10ba00 <rtems_object_set_name+0x58>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b9e7: b8 04 00 00 00 mov $0x4,%eax
}
10b9ec: 8d 65 f4 lea -0xc(%ebp),%esp
10b9ef: 5b pop %ebx
10b9f0: 5e pop %esi
10b9f1: 5f pop %edi
10b9f2: c9 leave
10b9f3: c3 ret
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10b9f4: a1 18 9e 12 00 mov 0x129e18,%eax
10b9f9: 8b 70 08 mov 0x8(%eax),%esi
10b9fc: eb c1 jmp 10b9bf <rtems_object_set_name+0x17>
10b9fe: 66 90 xchg %ax,%ax
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
10ba00: 52 push %edx
10ba01: 57 push %edi
10ba02: 50 push %eax
10ba03: 53 push %ebx
10ba04: e8 a7 1c 00 00 call 10d6b0 <_Objects_Set_name>
_Thread_Enable_dispatch();
10ba09: e8 3e 26 00 00 call 10e04c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ba0e: 83 c4 10 add $0x10,%esp
10ba11: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ba13: 8d 65 f4 lea -0xc(%ebp),%esp
10ba16: 5b pop %ebx
10ba17: 5e pop %esi
10ba18: 5f pop %edi
10ba19: c9 leave
10ba1a: c3 ret
10ba1b: 90 nop
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
10ba1c: b8 09 00 00 00 mov $0x9,%eax
10ba21: eb c9 jmp 10b9ec <rtems_object_set_name+0x44>
00116808 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
116808: 55 push %ebp
116809: 89 e5 mov %esp,%ebp
11680b: 57 push %edi
11680c: 56 push %esi
11680d: 53 push %ebx
11680e: 83 ec 1c sub $0x1c,%esp
116811: 8b 5d 08 mov 0x8(%ebp),%ebx
116814: 8b 75 0c mov 0xc(%ebp),%esi
116817: 8b 55 10 mov 0x10(%ebp),%edx
11681a: 8b 7d 14 mov 0x14(%ebp),%edi
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
11681d: 85 db test %ebx,%ebx
11681f: 74 47 je 116868 <rtems_partition_create+0x60>
return RTEMS_INVALID_NAME;
if ( !starting_address )
116821: 85 f6 test %esi,%esi
116823: 74 23 je 116848 <rtems_partition_create+0x40>
return RTEMS_INVALID_ADDRESS;
if ( !id )
116825: 8b 45 1c mov 0x1c(%ebp),%eax
116828: 85 c0 test %eax,%eax
11682a: 74 1c je 116848 <rtems_partition_create+0x40><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
11682c: 85 d2 test %edx,%edx
11682e: 74 28 je 116858 <rtems_partition_create+0x50>
116830: 85 ff test %edi,%edi
116832: 74 24 je 116858 <rtems_partition_create+0x50>
116834: 39 fa cmp %edi,%edx
116836: 72 20 jb 116858 <rtems_partition_create+0x50>
116838: f7 c7 03 00 00 00 test $0x3,%edi
11683e: 75 18 jne 116858 <rtems_partition_create+0x50>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
116840: f7 c6 03 00 00 00 test $0x3,%esi
116846: 74 30 je 116878 <rtems_partition_create+0x70>
return RTEMS_INVALID_ADDRESS;
116848: b8 09 00 00 00 mov $0x9,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11684d: 8d 65 f4 lea -0xc(%ebp),%esp
116850: 5b pop %ebx
116851: 5e pop %esi
116852: 5f pop %edi
116853: c9 leave
116854: c3 ret
116855: 8d 76 00 lea 0x0(%esi),%esi
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;
116858: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11685d: 8d 65 f4 lea -0xc(%ebp),%esp
116860: 5b pop %ebx
116861: 5e pop %esi
116862: 5f pop %edi
116863: c9 leave
116864: c3 ret
116865: 8d 76 00 lea 0x0(%esi),%esi
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
116868: b8 03 00 00 00 mov $0x3,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11686d: 8d 65 f4 lea -0xc(%ebp),%esp
116870: 5b pop %ebx
116871: 5e pop %esi
116872: 5f pop %edi
116873: c9 leave
116874: c3 ret
116875: 8d 76 00 lea 0x0(%esi),%esi
116878: a1 d0 21 14 00 mov 0x1421d0,%eax
11687d: 40 inc %eax
11687e: a3 d0 21 14 00 mov %eax,0x1421d0
* 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 );
116883: 83 ec 0c sub $0xc,%esp
116886: 68 60 20 14 00 push $0x142060
11688b: 89 55 e0 mov %edx,-0x20(%ebp)
11688e: e8 41 45 00 00 call 11add4 <_Objects_Allocate>
116893: 89 45 e4 mov %eax,-0x1c(%ebp)
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
116896: 83 c4 10 add $0x10,%esp
116899: 85 c0 test %eax,%eax
11689b: 8b 55 e0 mov -0x20(%ebp),%edx
11689e: 74 58 je 1168f8 <rtems_partition_create+0xf0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
1168a0: 8b 45 e4 mov -0x1c(%ebp),%eax
1168a3: 89 70 10 mov %esi,0x10(%eax)
the_partition->length = length;
1168a6: 89 50 14 mov %edx,0x14(%eax)
the_partition->buffer_size = buffer_size;
1168a9: 89 78 18 mov %edi,0x18(%eax)
the_partition->attribute_set = attribute_set;
1168ac: 8b 4d 18 mov 0x18(%ebp),%ecx
1168af: 89 48 1c mov %ecx,0x1c(%eax)
the_partition->number_of_used_blocks = 0;
1168b2: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax)
_Chain_Initialize( &the_partition->Memory, starting_address,
1168b9: 57 push %edi
1168ba: 89 d0 mov %edx,%eax
1168bc: 31 d2 xor %edx,%edx
1168be: f7 f7 div %edi
1168c0: 50 push %eax
1168c1: 56 push %esi
1168c2: 8b 45 e4 mov -0x1c(%ebp),%eax
1168c5: 83 c0 24 add $0x24,%eax
1168c8: 50 push %eax
1168c9: e8 a2 2f 00 00 call 119870 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1168ce: 8b 7d e4 mov -0x1c(%ebp),%edi
1168d1: 8b 47 08 mov 0x8(%edi),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1168d4: 0f b7 f0 movzwl %ax,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1168d7: 8b 15 7c 20 14 00 mov 0x14207c,%edx
1168dd: 89 3c b2 mov %edi,(%edx,%esi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1168e0: 89 5f 0c mov %ebx,0xc(%edi)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
1168e3: 8b 55 1c mov 0x1c(%ebp),%edx
1168e6: 89 02 mov %eax,(%edx)
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
1168e8: e8 8f 54 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1168ed: 83 c4 10 add $0x10,%esp
1168f0: 31 c0 xor %eax,%eax
1168f2: e9 66 ff ff ff jmp 11685d <rtems_partition_create+0x55>
1168f7: 90 nop
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
1168f8: e8 7f 54 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
1168fd: b8 05 00 00 00 mov $0x5,%eax
116902: e9 56 ff ff ff jmp 11685d <rtems_partition_create+0x55>
00116974 <rtems_partition_get_buffer>:
rtems_status_code rtems_partition_get_buffer(
rtems_id id,
void **buffer
)
{
116974: 55 push %ebp
116975: 89 e5 mov %esp,%ebp
116977: 56 push %esi
116978: 53 push %ebx
116979: 83 ec 20 sub $0x20,%esp
11697c: 8b 5d 0c mov 0xc(%ebp),%ebx
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
11697f: 85 db test %ebx,%ebx
116981: 74 59 je 1169dc <rtems_partition_get_buffer+0x68>
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
116983: 52 push %edx
return RTEMS_INVALID_ADDRESS;
the_partition = _Partition_Get( id, &location );
116984: 8d 45 f4 lea -0xc(%ebp),%eax
116987: 50 push %eax
116988: ff 75 08 pushl 0x8(%ebp)
11698b: 68 60 20 14 00 push $0x142060
116990: e8 33 49 00 00 call 11b2c8 <_Objects_Get>
116995: 89 c6 mov %eax,%esi
switch ( location ) {
116997: 83 c4 10 add $0x10,%esp
11699a: 8b 45 f4 mov -0xc(%ebp),%eax
11699d: 85 c0 test %eax,%eax
11699f: 75 2f jne 1169d0 <rtems_partition_get_buffer+0x5c>
*/
RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
Partition_Control *the_partition
)
{
return _Chain_Get( &the_partition->Memory );
1169a1: 83 ec 0c sub $0xc,%esp
1169a4: 8d 46 24 lea 0x24(%esi),%eax
1169a7: 50 push %eax
1169a8: e8 9f 2e 00 00 call 11984c <_Chain_Get>
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
1169ad: 83 c4 10 add $0x10,%esp
1169b0: 85 c0 test %eax,%eax
1169b2: 74 34 je 1169e8 <rtems_partition_get_buffer+0x74>
the_partition->number_of_used_blocks += 1;
1169b4: ff 46 20 incl 0x20(%esi)
_Thread_Enable_dispatch();
1169b7: 89 45 e4 mov %eax,-0x1c(%ebp)
1169ba: e8 bd 53 00 00 call 11bd7c <_Thread_Enable_dispatch>
*buffer = the_buffer;
1169bf: 8b 45 e4 mov -0x1c(%ebp),%eax
1169c2: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
1169c4: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1169c6: 8d 65 f8 lea -0x8(%ebp),%esp
1169c9: 5b pop %ebx
1169ca: 5e pop %esi
1169cb: c9 leave
1169cc: c3 ret
1169cd: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1169d0: b8 04 00 00 00 mov $0x4,%eax
}
1169d5: 8d 65 f8 lea -0x8(%ebp),%esp
1169d8: 5b pop %ebx
1169d9: 5e pop %esi
1169da: c9 leave
1169db: c3 ret
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
1169dc: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1169e1: 8d 65 f8 lea -0x8(%ebp),%esp
1169e4: 5b pop %ebx
1169e5: 5e pop %esi
1169e6: c9 leave
1169e7: c3 ret
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
1169e8: e8 8f 53 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
1169ed: b8 0d 00 00 00 mov $0xd,%eax
1169f2: eb e1 jmp 1169d5 <rtems_partition_get_buffer+0x61>
00116a18 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
116a18: 55 push %ebp
116a19: 89 e5 mov %esp,%ebp
116a1b: 56 push %esi
116a1c: 53 push %ebx
116a1d: 83 ec 14 sub $0x14,%esp
116a20: 8b 75 0c mov 0xc(%ebp),%esi
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
116a23: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
116a26: 50 push %eax
116a27: ff 75 08 pushl 0x8(%ebp)
116a2a: 68 60 20 14 00 push $0x142060
116a2f: e8 94 48 00 00 call 11b2c8 <_Objects_Get>
116a34: 89 c3 mov %eax,%ebx
switch ( location ) {
116a36: 83 c4 10 add $0x10,%esp
116a39: 8b 45 f4 mov -0xc(%ebp),%eax
116a3c: 85 c0 test %eax,%eax
116a3e: 74 0c je 116a4c <rtems_partition_return_buffer+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116a40: b8 04 00 00 00 mov $0x4,%eax
}
116a45: 8d 65 f8 lea -0x8(%ebp),%esp
116a48: 5b pop %ebx
116a49: 5e pop %esi
116a4a: c9 leave
116a4b: c3 ret
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
116a4c: 8b 43 10 mov 0x10(%ebx),%eax
ending = _Addresses_Add_offset( starting, the_partition->length );
116a4f: 8b 53 14 mov 0x14(%ebx),%edx
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
116a52: 39 c6 cmp %eax,%esi
116a54: 72 3a jb 116a90 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
116a56: 8d 14 10 lea (%eax,%edx,1),%edx
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
116a59: 39 d6 cmp %edx,%esi
116a5b: 77 33 ja 116a90 <rtems_partition_return_buffer+0x78><== NEVER TAKEN
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
116a5d: 89 f2 mov %esi,%edx
116a5f: 29 c2 sub %eax,%edx
116a61: 89 d0 mov %edx,%eax
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
116a63: 31 d2 xor %edx,%edx
116a65: 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 ) &&
116a68: 85 d2 test %edx,%edx
116a6a: 75 24 jne 116a90 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
116a6c: 83 ec 08 sub $0x8,%esp
116a6f: 56 push %esi
116a70: 8d 43 24 lea 0x24(%ebx),%eax
116a73: 50 push %eax
116a74: e8 97 2d 00 00 call 119810 <_Chain_Append>
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
116a79: ff 4b 20 decl 0x20(%ebx)
_Thread_Enable_dispatch();
116a7c: e8 fb 52 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116a81: 83 c4 10 add $0x10,%esp
116a84: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116a86: 8d 65 f8 lea -0x8(%ebp),%esp
116a89: 5b pop %ebx
116a8a: 5e pop %esi
116a8b: c9 leave
116a8c: c3 ret
116a8d: 8d 76 00 lea 0x0(%esi),%esi
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
116a90: e8 e7 52 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
116a95: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116a9a: 8d 65 f8 lea -0x8(%ebp),%esp
116a9d: 5b pop %ebx
116a9e: 5e pop %esi
116a9f: c9 leave
116aa0: c3 ret
00115e3c <rtems_port_create>:
void *internal_start,
void *external_start,
uint32_t length,
rtems_id *id
)
{
115e3c: 55 push %ebp
115e3d: 89 e5 mov %esp,%ebp
115e3f: 57 push %edi
115e40: 56 push %esi
115e41: 53 push %ebx
115e42: 83 ec 1c sub $0x1c,%esp
115e45: 8b 5d 08 mov 0x8(%ebp),%ebx
115e48: 8b 55 0c mov 0xc(%ebp),%edx
115e4b: 8b 7d 10 mov 0x10(%ebp),%edi
115e4e: 8b 75 18 mov 0x18(%ebp),%esi
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
115e51: 85 db test %ebx,%ebx
115e53: 74 1b je 115e70 <rtems_port_create+0x34>
return RTEMS_INVALID_NAME;
if ( !id )
115e55: 85 f6 test %esi,%esi
115e57: 74 08 je 115e61 <rtems_port_create+0x25>
* id - port id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_port_create(
115e59: 89 f8 mov %edi,%eax
115e5b: 09 d0 or %edx,%eax
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !_Addresses_Is_aligned( internal_start ) ||
115e5d: a8 03 test $0x3,%al
115e5f: 74 1f je 115e80 <rtems_port_create+0x44>
!_Addresses_Is_aligned( external_start ) )
return RTEMS_INVALID_ADDRESS;
115e61: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
115e66: 8d 65 f4 lea -0xc(%ebp),%esp
115e69: 5b pop %ebx
115e6a: 5e pop %esi
115e6b: 5f pop %edi
115e6c: c9 leave
115e6d: c3 ret
115e6e: 66 90 xchg %ax,%ax
)
{
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
115e70: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
115e75: 8d 65 f4 lea -0xc(%ebp),%esp
115e78: 5b pop %ebx
115e79: 5e pop %esi
115e7a: 5f pop %edi
115e7b: c9 leave
115e7c: c3 ret
115e7d: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
115e80: a1 d0 21 14 00 mov 0x1421d0,%eax
115e85: 40 inc %eax
115e86: a3 d0 21 14 00 mov %eax,0x1421d0
*/
RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
*_Dual_ported_memory_Allocate ( void )
{
return (Dual_ported_memory_Control *)
_Objects_Allocate( &_Dual_ported_memory_Information );
115e8b: 83 ec 0c sub $0xc,%esp
115e8e: 68 20 20 14 00 push $0x142020
115e93: 89 55 e4 mov %edx,-0x1c(%ebp)
115e96: e8 39 4f 00 00 call 11add4 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
115e9b: 83 c4 10 add $0x10,%esp
115e9e: 85 c0 test %eax,%eax
115ea0: 8b 55 e4 mov -0x1c(%ebp),%edx
115ea3: 74 33 je 115ed8 <rtems_port_create+0x9c>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_port->internal_base = internal_start;
115ea5: 89 50 10 mov %edx,0x10(%eax)
the_port->external_base = external_start;
115ea8: 89 78 14 mov %edi,0x14(%eax)
the_port->length = length - 1;
115eab: 8b 55 14 mov 0x14(%ebp),%edx
115eae: 4a dec %edx
115eaf: 89 50 18 mov %edx,0x18(%eax)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
115eb2: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
115eb5: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
115eb8: 8b 0d 3c 20 14 00 mov 0x14203c,%ecx
115ebe: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
115ec1: 89 58 0c mov %ebx,0xc(%eax)
&_Dual_ported_memory_Information,
&the_port->Object,
(Objects_Name) name
);
*id = the_port->Object.id;
115ec4: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
115ec6: e8 b1 5e 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115ecb: 31 c0 xor %eax,%eax
}
115ecd: 8d 65 f4 lea -0xc(%ebp),%esp
115ed0: 5b pop %ebx
115ed1: 5e pop %esi
115ed2: 5f pop %edi
115ed3: c9 leave
115ed4: c3 ret
115ed5: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
_Thread_Enable_dispatch();
115ed8: e8 9f 5e 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
115edd: b8 05 00 00 00 mov $0x5,%eax
115ee2: eb 82 jmp 115e66 <rtems_port_create+0x2a>
00115ee4 <rtems_port_delete>:
*/
rtems_status_code rtems_port_delete(
rtems_id id
)
{
115ee4: 55 push %ebp
115ee5: 89 e5 mov %esp,%ebp
115ee7: 83 ec 2c sub $0x2c,%esp
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
the_port = _Dual_ported_memory_Get( id, &location );
115eea: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Dual_ported_memory_Control *)
_Objects_Get( &_Dual_ported_memory_Information, id, location );
115eed: 50 push %eax
115eee: ff 75 08 pushl 0x8(%ebp)
115ef1: 68 20 20 14 00 push $0x142020
115ef6: e8 cd 53 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
115efb: 83 c4 10 add $0x10,%esp
115efe: 8b 4d f4 mov -0xc(%ebp),%ecx
115f01: 85 c9 test %ecx,%ecx
115f03: 75 2f jne 115f34 <rtems_port_delete+0x50>
case OBJECTS_LOCAL:
_Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
115f05: 83 ec 08 sub $0x8,%esp
115f08: 50 push %eax
115f09: 68 20 20 14 00 push $0x142020
115f0e: 89 45 e4 mov %eax,-0x1c(%ebp)
115f11: e8 3a 4f 00 00 call 11ae50 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free (
Dual_ported_memory_Control *the_port
)
{
_Objects_Free( &_Dual_ported_memory_Information, &the_port->Object );
115f16: 58 pop %eax
115f17: 5a pop %edx
115f18: 8b 45 e4 mov -0x1c(%ebp),%eax
115f1b: 50 push %eax
115f1c: 68 20 20 14 00 push $0x142020
115f21: e8 26 52 00 00 call 11b14c <_Objects_Free>
_Dual_ported_memory_Free( the_port );
_Thread_Enable_dispatch();
115f26: e8 51 5e 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115f2b: 83 c4 10 add $0x10,%esp
115f2e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115f30: c9 leave
115f31: c3 ret
115f32: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115f34: b8 04 00 00 00 mov $0x4,%eax
}
115f39: c9 leave
115f3a: c3 ret
00115f3c <rtems_port_external_to_internal>:
rtems_status_code rtems_port_external_to_internal(
rtems_id id,
void *external,
void **internal
)
{
115f3c: 55 push %ebp
115f3d: 89 e5 mov %esp,%ebp
115f3f: 56 push %esi
115f40: 53 push %ebx
115f41: 83 ec 10 sub $0x10,%esp
115f44: 8b 75 0c mov 0xc(%ebp),%esi
115f47: 8b 5d 10 mov 0x10(%ebp),%ebx
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
115f4a: 85 db test %ebx,%ebx
115f4c: 74 4e je 115f9c <rtems_port_external_to_internal+0x60>
Objects_Id id,
Objects_Locations *location
)
{
return (Dual_ported_memory_Control *)
_Objects_Get( &_Dual_ported_memory_Information, id, location );
115f4e: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
115f4f: 8d 45 f4 lea -0xc(%ebp),%eax
115f52: 50 push %eax
115f53: ff 75 08 pushl 0x8(%ebp)
115f56: 68 20 20 14 00 push $0x142020
115f5b: e8 68 53 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
115f60: 83 c4 10 add $0x10,%esp
115f63: 8b 55 f4 mov -0xc(%ebp),%edx
115f66: 85 d2 test %edx,%edx
115f68: 74 0e je 115f78 <rtems_port_external_to_internal+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115f6a: b8 04 00 00 00 mov $0x4,%eax
}
115f6f: 8d 65 f8 lea -0x8(%ebp),%esp
115f72: 5b pop %ebx
115f73: 5e pop %esi
115f74: c9 leave
115f75: c3 ret
115f76: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
115f78: 89 f2 mov %esi,%edx
115f7a: 2b 50 14 sub 0x14(%eax),%edx
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( external, the_port->external_base );
if ( ending > the_port->length )
115f7d: 3b 50 18 cmp 0x18(%eax),%edx
115f80: 77 16 ja 115f98 <rtems_port_external_to_internal+0x5c>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
115f82: 03 50 10 add 0x10(%eax),%edx
115f85: 89 13 mov %edx,(%ebx)
*internal = external;
else
*internal = _Addresses_Add_offset( the_port->internal_base,
ending );
_Thread_Enable_dispatch();
115f87: e8 f0 5d 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115f8c: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115f8e: 8d 65 f8 lea -0x8(%ebp),%esp
115f91: 5b pop %ebx
115f92: 5e pop %esi
115f93: c9 leave
115f94: c3 ret
115f95: 8d 76 00 lea 0x0(%esi),%esi
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( external, the_port->external_base );
if ( ending > the_port->length )
*internal = external;
115f98: 89 33 mov %esi,(%ebx)
115f9a: eb eb jmp 115f87 <rtems_port_external_to_internal+0x4b>
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
return RTEMS_INVALID_ADDRESS;
115f9c: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115fa1: 8d 65 f8 lea -0x8(%ebp),%esp
115fa4: 5b pop %ebx
115fa5: 5e pop %esi
115fa6: c9 leave
115fa7: c3 ret
00115fcc <rtems_port_internal_to_external>:
rtems_status_code rtems_port_internal_to_external(
rtems_id id,
void *internal,
void **external
)
{
115fcc: 55 push %ebp
115fcd: 89 e5 mov %esp,%ebp
115fcf: 56 push %esi
115fd0: 53 push %ebx
115fd1: 83 ec 10 sub $0x10,%esp
115fd4: 8b 75 0c mov 0xc(%ebp),%esi
115fd7: 8b 5d 10 mov 0x10(%ebp),%ebx
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
115fda: 85 db test %ebx,%ebx
115fdc: 74 4e je 11602c <rtems_port_internal_to_external+0x60><== NEVER TAKEN
115fde: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
115fdf: 8d 45 f4 lea -0xc(%ebp),%eax
115fe2: 50 push %eax
115fe3: ff 75 08 pushl 0x8(%ebp)
115fe6: 68 20 20 14 00 push $0x142020
115feb: e8 d8 52 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
115ff0: 83 c4 10 add $0x10,%esp
115ff3: 8b 55 f4 mov -0xc(%ebp),%edx
115ff6: 85 d2 test %edx,%edx
115ff8: 74 0e je 116008 <rtems_port_internal_to_external+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115ffa: b8 04 00 00 00 mov $0x4,%eax
}
115fff: 8d 65 f8 lea -0x8(%ebp),%esp
116002: 5b pop %ebx
116003: 5e pop %esi
116004: c9 leave
116005: c3 ret
116006: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract (
const void *left,
const void *right
)
{
return (int32_t) ((const char *) left - (const char *) right);
116008: 89 f2 mov %esi,%edx
11600a: 2b 50 10 sub 0x10(%eax),%edx
the_port = _Dual_ported_memory_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( internal, the_port->internal_base );
if ( ending > the_port->length )
11600d: 3b 50 18 cmp 0x18(%eax),%edx
116010: 77 16 ja 116028 <rtems_port_internal_to_external+0x5c>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
116012: 03 50 14 add 0x14(%eax),%edx
116015: 89 13 mov %edx,(%ebx)
*external = internal;
else
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
116017: e8 60 5d 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11601c: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11601e: 8d 65 f8 lea -0x8(%ebp),%esp
116021: 5b pop %ebx
116022: 5e pop %esi
116023: c9 leave
116024: c3 ret
116025: 8d 76 00 lea 0x0(%esi),%esi
switch ( location ) {
case OBJECTS_LOCAL:
ending = _Addresses_Subtract( internal, the_port->internal_base );
if ( ending > the_port->length )
*external = internal;
116028: 89 33 mov %esi,(%ebx)
11602a: eb eb jmp 116017 <rtems_port_internal_to_external+0x4b>
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
return RTEMS_INVALID_ADDRESS;
11602c: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116031: 8d 65 f8 lea -0x8(%ebp),%esp
116034: 5b pop %ebx
116035: 5e pop %esi
116036: c9 leave
116037: c3 ret
00116aa4 <rtems_rate_monotonic_cancel>:
*/
rtems_status_code rtems_rate_monotonic_cancel(
rtems_id id
)
{
116aa4: 55 push %ebp
116aa5: 89 e5 mov %esp,%ebp
116aa7: 53 push %ebx
116aa8: 83 ec 18 sub $0x18,%esp
Rate_monotonic_Control *the_period;
Objects_Locations location;
the_period = _Rate_monotonic_Get( id, &location );
116aab: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
116aae: 50 push %eax
116aaf: ff 75 08 pushl 0x8(%ebp)
116ab2: 68 a0 20 14 00 push $0x1420a0
116ab7: e8 0c 48 00 00 call 11b2c8 <_Objects_Get>
116abc: 89 c3 mov %eax,%ebx
switch ( location ) {
116abe: 83 c4 10 add $0x10,%esp
116ac1: 8b 45 f4 mov -0xc(%ebp),%eax
116ac4: 85 c0 test %eax,%eax
116ac6: 74 0c je 116ad4 <rtems_rate_monotonic_cancel+0x30>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116ac8: b8 04 00 00 00 mov $0x4,%eax
}
116acd: 8b 5d fc mov -0x4(%ebp),%ebx
116ad0: c9 leave
116ad1: c3 ret
116ad2: 66 90 xchg %ax,%ax
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
116ad4: a1 b8 27 14 00 mov 0x1427b8,%eax
116ad9: 39 43 40 cmp %eax,0x40(%ebx)
116adc: 74 12 je 116af0 <rtems_rate_monotonic_cancel+0x4c>
_Thread_Enable_dispatch();
116ade: e8 99 52 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
116ae3: b8 17 00 00 00 mov $0x17,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116ae8: 8b 5d fc mov -0x4(%ebp),%ebx
116aeb: c9 leave
116aec: c3 ret
116aed: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
(void) _Watchdog_Remove( &the_period->Timer );
116af0: 83 ec 0c sub $0xc,%esp
116af3: 8d 43 10 lea 0x10(%ebx),%eax
116af6: 50 push %eax
116af7: e8 50 64 00 00 call 11cf4c <_Watchdog_Remove>
the_period->state = RATE_MONOTONIC_INACTIVE;
116afc: c7 43 38 00 00 00 00 movl $0x0,0x38(%ebx)
_Thread_Enable_dispatch();
116b03: e8 74 52 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116b08: 83 c4 10 add $0x10,%esp
116b0b: 31 c0 xor %eax,%eax
116b0d: eb be jmp 116acd <rtems_rate_monotonic_cancel+0x29>
0010c32c <rtems_rate_monotonic_create>:
rtems_status_code rtems_rate_monotonic_create(
rtems_name name,
rtems_id *id
)
{
10c32c: 55 push %ebp
10c32d: 89 e5 mov %esp,%ebp
10c32f: 57 push %edi
10c330: 56 push %esi
10c331: 53 push %ebx
10c332: 83 ec 1c sub $0x1c,%esp
10c335: 8b 5d 08 mov 0x8(%ebp),%ebx
10c338: 8b 75 0c mov 0xc(%ebp),%esi
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
10c33b: 85 db test %ebx,%ebx
10c33d: 0f 84 a9 00 00 00 je 10c3ec <rtems_rate_monotonic_create+0xc0>
return RTEMS_INVALID_NAME;
if ( !id )
10c343: 85 f6 test %esi,%esi
10c345: 0f 84 c5 00 00 00 je 10c410 <rtems_rate_monotonic_create+0xe4>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c34b: a1 d0 a8 12 00 mov 0x12a8d0,%eax
10c350: 40 inc %eax
10c351: a3 d0 a8 12 00 mov %eax,0x12a8d0
* the inactive chain of free period control blocks.
*/
RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void )
{
return (Rate_monotonic_Control *)
_Objects_Allocate( &_Rate_monotonic_Information );
10c356: 83 ec 0c sub $0xc,%esp
10c359: 68 e0 a7 12 00 push $0x12a7e0
10c35e: e8 35 1f 00 00 call 10e298 <_Objects_Allocate>
10c363: 89 c2 mov %eax,%edx
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
10c365: 83 c4 10 add $0x10,%esp
10c368: 85 c0 test %eax,%eax
10c36a: 0f 84 8c 00 00 00 je 10c3fc <rtems_rate_monotonic_create+0xd0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_period->owner = _Thread_Executing;
10c370: a1 b8 ae 12 00 mov 0x12aeb8,%eax
10c375: 89 42 40 mov %eax,0x40(%edx)
the_period->state = RATE_MONOTONIC_INACTIVE;
10c378: c7 42 38 00 00 00 00 movl $0x0,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c37f: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
10c386: c7 42 2c 00 00 00 00 movl $0x0,0x2c(%edx)
the_watchdog->id = id;
10c38d: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
the_watchdog->user_data = user_data;
10c394: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_Watchdog_Initialize( &the_period->Timer, NULL, 0, NULL );
_Rate_monotonic_Reset_statistics( the_period );
10c39b: 8d 42 54 lea 0x54(%edx),%eax
10c39e: 89 45 e4 mov %eax,-0x1c(%ebp)
10c3a1: b9 38 00 00 00 mov $0x38,%ecx
10c3a6: 31 c0 xor %eax,%eax
10c3a8: 8b 7d e4 mov -0x1c(%ebp),%edi
10c3ab: f3 aa rep stos %al,%es:(%edi)
10c3ad: c7 42 5c ff ff ff 7f movl $0x7fffffff,0x5c(%edx)
10c3b4: c7 42 60 ff ff ff 7f movl $0x7fffffff,0x60(%edx)
10c3bb: c7 42 74 ff ff ff 7f movl $0x7fffffff,0x74(%edx)
10c3c2: c7 42 78 ff ff ff 7f movl $0x7fffffff,0x78(%edx)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c3c9: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c3cc: 0f b7 f8 movzwl %ax,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c3cf: 8b 0d fc a7 12 00 mov 0x12a7fc,%ecx
10c3d5: 89 14 b9 mov %edx,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c3d8: 89 5a 0c mov %ebx,0xc(%edx)
&_Rate_monotonic_Information,
&the_period->Object,
(Objects_Name) name
);
*id = the_period->Object.id;
10c3db: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10c3dd: e8 0a 2f 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c3e2: 31 c0 xor %eax,%eax
}
10c3e4: 8d 65 f4 lea -0xc(%ebp),%esp
10c3e7: 5b pop %ebx
10c3e8: 5e pop %esi
10c3e9: 5f pop %edi
10c3ea: c9 leave
10c3eb: c3 ret
)
{
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10c3ec: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c3f1: 8d 65 f4 lea -0xc(%ebp),%esp
10c3f4: 5b pop %ebx
10c3f5: 5e pop %esi
10c3f6: 5f pop %edi
10c3f7: c9 leave
10c3f8: c3 ret
10c3f9: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
_Thread_Enable_dispatch();
10c3fc: e8 eb 2e 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10c401: b8 05 00 00 00 mov $0x5,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c406: 8d 65 f4 lea -0xc(%ebp),%esp
10c409: 5b pop %ebx
10c40a: 5e pop %esi
10c40b: 5f pop %edi
10c40c: c9 leave
10c40d: c3 ret
10c40e: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10c410: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c415: 8d 65 f4 lea -0xc(%ebp),%esp
10c418: 5b pop %ebx
10c419: 5e pop %esi
10c41a: 5f pop %edi
10c41b: c9 leave
10c41c: c3 ret
001128d0 <rtems_rate_monotonic_get_status>:
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
rtems_rate_monotonic_period_status *status
)
{
1128d0: 55 push %ebp
1128d1: 89 e5 mov %esp,%ebp
1128d3: 53 push %ebx
1128d4: 83 ec 24 sub $0x24,%esp
1128d7: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
1128da: 85 db test %ebx,%ebx
1128dc: 0f 84 92 00 00 00 je 112974 <rtems_rate_monotonic_get_status+0xa4>
1128e2: 50 push %eax
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
1128e3: 8d 45 f4 lea -0xc(%ebp),%eax
1128e6: 50 push %eax
1128e7: ff 75 08 pushl 0x8(%ebp)
1128ea: 68 e0 a7 12 00 push $0x12a7e0
1128ef: e8 44 bf ff ff call 10e838 <_Objects_Get>
switch ( location ) {
1128f4: 83 c4 10 add $0x10,%esp
1128f7: 8b 4d f4 mov -0xc(%ebp),%ecx
1128fa: 85 c9 test %ecx,%ecx
1128fc: 74 0a je 112908 <rtems_rate_monotonic_get_status+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1128fe: b8 04 00 00 00 mov $0x4,%eax
}
112903: 8b 5d fc mov -0x4(%ebp),%ebx
112906: c9 leave
112907: c3 ret
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
112908: 8b 50 40 mov 0x40(%eax),%edx
11290b: 8b 52 08 mov 0x8(%edx),%edx
11290e: 89 13 mov %edx,(%ebx)
status->state = the_period->state;
112910: 8b 50 38 mov 0x38(%eax),%edx
112913: 89 53 04 mov %edx,0x4(%ebx)
/*
* If the period is inactive, there is no information.
*/
if ( status->state == RATE_MONOTONIC_INACTIVE ) {
112916: 85 d2 test %edx,%edx
112918: 75 2a jne 112944 <rtems_rate_monotonic_get_status+0x74>
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timespec_Set_to_zero( &status->since_last_period );
11291a: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
112921: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
_Timespec_Set_to_zero( &status->executed_since_last_period );
112928: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
11292f: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx)
status->since_last_period = since_last_period;
status->executed_since_last_period = executed;
#endif
}
_Thread_Enable_dispatch();
112936: e8 b1 c9 ff ff call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11293b: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11293d: 8b 5d fc mov -0x4(%ebp),%ebx
112940: c9 leave
112941: c3 ret
112942: 66 90 xchg %ax,%ax
} else {
/*
* Grab the current status.
*/
valid_status =
112944: 52 push %edx
_Rate_monotonic_Get_status(
112945: 8d 55 ec lea -0x14(%ebp),%edx
} else {
/*
* Grab the current status.
*/
valid_status =
112948: 52 push %edx
_Rate_monotonic_Get_status(
112949: 8d 55 e4 lea -0x1c(%ebp),%edx
} else {
/*
* Grab the current status.
*/
valid_status =
11294c: 52 push %edx
11294d: 50 push %eax
11294e: e8 f1 9a ff ff call 10c444 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
112953: 83 c4 10 add $0x10,%esp
112956: 84 c0 test %al,%al
112958: 74 26 je 112980 <rtems_rate_monotonic_get_status+0xb0>
_Thread_Enable_dispatch();
return RTEMS_NOT_DEFINED;
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec(
11295a: 8b 45 e4 mov -0x1c(%ebp),%eax
11295d: 8b 55 e8 mov -0x18(%ebp),%edx
112960: 89 43 08 mov %eax,0x8(%ebx)
112963: 89 53 0c mov %edx,0xc(%ebx)
&since_last_period, &status->since_last_period
);
_Timestamp_To_timespec(
112966: 8b 45 ec mov -0x14(%ebp),%eax
112969: 8b 55 f0 mov -0x10(%ebp),%edx
11296c: 89 43 10 mov %eax,0x10(%ebx)
11296f: 89 53 14 mov %edx,0x14(%ebx)
112972: eb c2 jmp 112936 <rtems_rate_monotonic_get_status+0x66>
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
return RTEMS_INVALID_ADDRESS;
112974: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
112979: 8b 5d fc mov -0x4(%ebp),%ebx
11297c: c9 leave
11297d: c3 ret
11297e: 66 90 xchg %ax,%ax
valid_status =
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
_Thread_Enable_dispatch();
112980: e8 67 c9 ff ff call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
112985: b8 0b 00 00 00 mov $0xb,%eax
11298a: e9 74 ff ff ff jmp 112903 <rtems_rate_monotonic_get_status+0x33>
0010c640 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
10c640: 55 push %ebp
10c641: 89 e5 mov %esp,%ebp
10c643: 57 push %edi
10c644: 56 push %esi
10c645: 53 push %ebx
10c646: 83 ec 30 sub $0x30,%esp
10c649: 8b 5d 08 mov 0x8(%ebp),%ebx
10c64c: 8b 75 0c mov 0xc(%ebp),%esi
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 );
10c64f: 8d 45 e4 lea -0x1c(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
10c652: 50 push %eax
10c653: 53 push %ebx
10c654: 68 e0 a7 12 00 push $0x12a7e0
10c659: e8 da 21 00 00 call 10e838 <_Objects_Get>
switch ( location ) {
10c65e: 83 c4 10 add $0x10,%esp
10c661: 8b 55 e4 mov -0x1c(%ebp),%edx
10c664: 85 d2 test %edx,%edx
10c666: 74 10 je 10c678 <rtems_rate_monotonic_period+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c668: b8 04 00 00 00 mov $0x4,%eax
}
10c66d: 8d 65 f4 lea -0xc(%ebp),%esp
10c670: 5b pop %ebx
10c671: 5e pop %esi
10c672: 5f pop %edi
10c673: c9 leave
10c674: c3 ret
10c675: 8d 76 00 lea 0x0(%esi),%esi
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
10c678: 8b 15 b8 ae 12 00 mov 0x12aeb8,%edx
10c67e: 39 50 40 cmp %edx,0x40(%eax)
10c681: 74 15 je 10c698 <rtems_rate_monotonic_period+0x58>
_Thread_Enable_dispatch();
10c683: e8 64 2c 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
10c688: b8 17 00 00 00 mov $0x17,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c68d: 8d 65 f4 lea -0xc(%ebp),%esp
10c690: 5b pop %ebx
10c691: 5e pop %esi
10c692: 5f pop %edi
10c693: c9 leave
10c694: c3 ret
10c695: 8d 76 00 lea 0x0(%esi),%esi
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
10c698: 85 f6 test %esi,%esi
10c69a: 75 1c jne 10c6b8 <rtems_rate_monotonic_period+0x78>
switch ( the_period->state ) {
10c69c: 8b 40 38 mov 0x38(%eax),%eax
10c69f: 83 f8 04 cmp $0x4,%eax
10c6a2: 77 6c ja 10c710 <rtems_rate_monotonic_period+0xd0><== NEVER TAKEN
10c6a4: 8b 04 85 fc 34 12 00 mov 0x1234fc(,%eax,4),%eax
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
10c6ab: 89 45 d4 mov %eax,-0x2c(%ebp)
10c6ae: e8 39 2c 00 00 call 10f2ec <_Thread_Enable_dispatch>
return( return_value );
10c6b3: 8b 45 d4 mov -0x2c(%ebp),%eax
10c6b6: eb b5 jmp 10c66d <rtems_rate_monotonic_period+0x2d>
}
_ISR_Disable( level );
10c6b8: 9c pushf
10c6b9: fa cli
10c6ba: 5f pop %edi
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
10c6bb: 8b 50 38 mov 0x38(%eax),%edx
10c6be: 85 d2 test %edx,%edx
10c6c0: 74 52 je 10c714 <rtems_rate_monotonic_period+0xd4>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
10c6c2: 83 fa 02 cmp $0x2,%edx
10c6c5: 0f 84 9e 00 00 00 je 10c769 <rtems_rate_monotonic_period+0x129>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
10c6cb: 83 fa 04 cmp $0x4,%edx
10c6ce: 75 98 jne 10c668 <rtems_rate_monotonic_period+0x28><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
10c6d0: 83 ec 0c sub $0xc,%esp
10c6d3: 50 push %eax
10c6d4: 89 45 d4 mov %eax,-0x2c(%ebp)
10c6d7: e8 74 fe ff ff call 10c550 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
10c6dc: 57 push %edi
10c6dd: 9d popf
the_period->state = RATE_MONOTONIC_ACTIVE;
10c6de: 8b 45 d4 mov -0x2c(%ebp),%eax
10c6e1: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
the_period->next_length = length;
10c6e8: 89 70 3c mov %esi,0x3c(%eax)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c6eb: 89 70 1c mov %esi,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c6ee: 5b pop %ebx
10c6ef: 5e pop %esi
_Watchdog_Insert_ticks( &the_period->Timer, length );
10c6f0: 83 c0 10 add $0x10,%eax
10c6f3: 50 push %eax
10c6f4: 68 dc a9 12 00 push $0x12a9dc
10c6f9: e8 f6 3a 00 00 call 1101f4 <_Watchdog_Insert>
_Thread_Enable_dispatch();
10c6fe: e8 e9 2b 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
10c703: 83 c4 10 add $0x10,%esp
10c706: b8 06 00 00 00 mov $0x6,%eax
10c70b: e9 5d ff ff ff jmp 10c66d <rtems_rate_monotonic_period+0x2d>
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
10c710: 31 c0 xor %eax,%eax
10c712: eb 97 jmp 10c6ab <rtems_rate_monotonic_period+0x6b><== NOT EXECUTED
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
10c714: 57 push %edi
10c715: 9d popf
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
10c716: 83 ec 0c sub $0xc,%esp
10c719: 50 push %eax
10c71a: 89 45 d4 mov %eax,-0x2c(%ebp)
10c71d: e8 ba fd ff ff call 10c4dc <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
10c722: 8b 45 d4 mov -0x2c(%ebp),%eax
10c725: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c72c: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10c733: c7 40 2c 98 ca 10 00 movl $0x10ca98,0x2c(%eax)
the_watchdog->id = id;
10c73a: 89 58 30 mov %ebx,0x30(%eax)
the_watchdog->user_data = user_data;
10c73d: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
10c744: 89 70 3c mov %esi,0x3c(%eax)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c747: 89 70 1c mov %esi,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c74a: 5e pop %esi
10c74b: 5f pop %edi
_Watchdog_Insert_ticks( &the_period->Timer, length );
10c74c: 83 c0 10 add $0x10,%eax
10c74f: 50 push %eax
10c750: 68 dc a9 12 00 push $0x12a9dc
10c755: e8 9a 3a 00 00 call 1101f4 <_Watchdog_Insert>
_Thread_Enable_dispatch();
10c75a: e8 8d 2b 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c75f: 83 c4 10 add $0x10,%esp
10c762: 31 c0 xor %eax,%eax
10c764: e9 04 ff ff ff jmp 10c66d <rtems_rate_monotonic_period+0x2d>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
10c769: 83 ec 0c sub $0xc,%esp
10c76c: 50 push %eax
10c76d: 89 45 d4 mov %eax,-0x2c(%ebp)
10c770: e8 db fd ff ff call 10c550 <_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;
10c775: 8b 45 d4 mov -0x2c(%ebp),%eax
10c778: c7 40 38 01 00 00 00 movl $0x1,0x38(%eax)
the_period->next_length = length;
10c77f: 89 70 3c mov %esi,0x3c(%eax)
_ISR_Enable( level );
10c782: 57 push %edi
10c783: 9d popf
_Thread_Executing->Wait.id = the_period->Object.id;
10c784: 8b 15 b8 ae 12 00 mov 0x12aeb8,%edx
10c78a: 8b 48 08 mov 0x8(%eax),%ecx
10c78d: 89 4a 20 mov %ecx,0x20(%edx)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10c790: 59 pop %ecx
10c791: 5b pop %ebx
10c792: 68 00 40 00 00 push $0x4000
10c797: 52 push %edx
10c798: 89 45 d4 mov %eax,-0x2c(%ebp)
10c79b: e8 b0 33 00 00 call 10fb50 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
10c7a0: 9c pushf
10c7a1: fa cli
10c7a2: 59 pop %ecx
local_state = the_period->state;
10c7a3: 8b 45 d4 mov -0x2c(%ebp),%eax
10c7a6: 8b 50 38 mov 0x38(%eax),%edx
the_period->state = RATE_MONOTONIC_ACTIVE;
10c7a9: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
_ISR_Enable( level );
10c7b0: 51 push %ecx
10c7b1: 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 )
10c7b2: 83 c4 10 add $0x10,%esp
10c7b5: 83 fa 03 cmp $0x3,%edx
10c7b8: 74 0c je 10c7c6 <rtems_rate_monotonic_period+0x186>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
10c7ba: e8 2d 2b 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c7bf: 31 c0 xor %eax,%eax
10c7c1: e9 a7 fe ff ff jmp 10c66d <rtems_rate_monotonic_period+0x2d>
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10c7c6: 57 push %edi
10c7c7: 57 push %edi
10c7c8: 68 00 40 00 00 push $0x4000
10c7cd: ff 35 b8 ae 12 00 pushl 0x12aeb8
10c7d3: e8 94 27 00 00 call 10ef6c <_Thread_Clear_state>
10c7d8: 83 c4 10 add $0x10,%esp
10c7db: eb dd jmp 10c7ba <rtems_rate_monotonic_period+0x17a>
0010c7e0 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
10c7e0: 55 push %ebp
10c7e1: 89 e5 mov %esp,%ebp
10c7e3: 57 push %edi
10c7e4: 56 push %esi
10c7e5: 53 push %ebx
10c7e6: 81 ec 8c 00 00 00 sub $0x8c,%esp
10c7ec: 8b 75 08 mov 0x8(%ebp),%esi
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
10c7ef: 8b 7d 0c mov 0xc(%ebp),%edi
10c7f2: 85 ff test %edi,%edi
10c7f4: 0f 84 be 00 00 00 je 10c8b8 <rtems_rate_monotonic_report_statistics_with_plugin+0xd8><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
10c7fa: 83 ec 08 sub $0x8,%esp
10c7fd: 68 10 35 12 00 push $0x123510
10c802: 56 push %esi
10c803: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
10c806: 59 pop %ecx
10c807: 5b pop %ebx
10c808: 68 48 35 12 00 push $0x123548
10c80d: 56 push %esi
10c80e: ff 55 0c call *0xc(%ebp)
(*print)( context, "--- Wall times are in seconds ---\n" );
10c811: 58 pop %eax
10c812: 5a pop %edx
10c813: 68 6c 35 12 00 push $0x12356c
10c818: 56 push %esi
10c819: ff 55 0c call *0xc(%ebp)
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
10c81c: 5b pop %ebx
10c81d: 5f pop %edi
10c81e: 68 90 35 12 00 push $0x123590
10c823: 56 push %esi
10c824: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
10c827: 5a pop %edx
10c828: 59 pop %ecx
10c829: 68 dc 35 12 00 push $0x1235dc
10c82e: 56 push %esi
10c82f: ff 55 0c call *0xc(%ebp)
/*
* 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 ;
10c832: 8b 1d e8 a7 12 00 mov 0x12a7e8,%ebx
10c838: 83 c4 10 add $0x10,%esp
10c83b: 3b 1d ec a7 12 00 cmp 0x12a7ec,%ebx
10c841: 77 75 ja 10c8b8 <rtems_rate_monotonic_report_statistics_with_plugin+0xd8><== NEVER TAKEN
10c843: 8d 7d 88 lea -0x78(%ebp),%edi
10c846: eb 09 jmp 10c851 <rtems_rate_monotonic_report_statistics_with_plugin+0x71>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
10c848: 43 inc %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 ;
10c849: 39 1d ec a7 12 00 cmp %ebx,0x12a7ec
10c84f: 72 67 jb 10c8b8 <rtems_rate_monotonic_report_statistics_with_plugin+0xd8>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
10c851: 83 ec 08 sub $0x8,%esp
10c854: 57 push %edi
10c855: 53 push %ebx
10c856: e8 c9 5f 00 00 call 112824 <rtems_rate_monotonic_get_statistics>
if ( status != RTEMS_SUCCESSFUL )
10c85b: 83 c4 10 add $0x10,%esp
10c85e: 85 c0 test %eax,%eax
10c860: 75 e6 jne 10c848 <rtems_rate_monotonic_report_statistics_with_plugin+0x68>
#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 );
10c862: 83 ec 08 sub $0x8,%esp
10c865: 8d 45 c0 lea -0x40(%ebp),%eax
10c868: 50 push %eax
10c869: 53 push %ebx
10c86a: e8 61 60 00 00 call 1128d0 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
10c86f: 83 c4 0c add $0xc,%esp
10c872: 8d 55 e3 lea -0x1d(%ebp),%edx
10c875: 52 push %edx
10c876: 6a 05 push $0x5
10c878: ff 75 c0 pushl -0x40(%ebp)
10c87b: e8 b4 02 00 00 call 10cb34 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
10c880: 59 pop %ecx
10c881: 58 pop %eax
10c882: ff 75 8c pushl -0x74(%ebp)
10c885: ff 75 88 pushl -0x78(%ebp)
10c888: 8d 45 e3 lea -0x1d(%ebp),%eax
10c88b: 50 push %eax
10c88c: 53 push %ebx
10c88d: 68 2e 35 12 00 push $0x12352e
10c892: 56 push %esi
10c893: ff 55 0c call *0xc(%ebp)
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
10c896: 8b 45 88 mov -0x78(%ebp),%eax
10c899: 83 c4 20 add $0x20,%esp
10c89c: 85 c0 test %eax,%eax
10c89e: 75 20 jne 10c8c0 <rtems_rate_monotonic_report_statistics_with_plugin+0xe0>
(*print)( context, "\n" );
10c8a0: 83 ec 08 sub $0x8,%esp
10c8a3: 68 19 16 12 00 push $0x121619
10c8a8: 56 push %esi
10c8a9: ff 55 0c call *0xc(%ebp)
continue;
10c8ac: 83 c4 10 add $0x10,%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++ ) {
10c8af: 43 inc %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 ;
10c8b0: 39 1d ec a7 12 00 cmp %ebx,0x12a7ec
10c8b6: 73 99 jae 10c851 <rtems_rate_monotonic_report_statistics_with_plugin+0x71><== ALWAYS TAKEN
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
10c8b8: 8d 65 f4 lea -0xc(%ebp),%esp
10c8bb: 5b pop %ebx
10c8bc: 5e pop %esi
10c8bd: 5f pop %edi
10c8be: c9 leave
10c8bf: c3 ret
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 );
10c8c0: 52 push %edx
10c8c1: 8d 55 d8 lea -0x28(%ebp),%edx
10c8c4: 52 push %edx
10c8c5: 50 push %eax
10c8c6: 8d 45 a0 lea -0x60(%ebp),%eax
10c8c9: 50 push %eax
10c8ca: e8 85 35 00 00 call 10fe54 <_Timespec_Divide_by_integer>
(*print)( context,
10c8cf: b9 d3 4d 62 10 mov $0x10624dd3,%ecx
10c8d4: 8b 45 dc mov -0x24(%ebp),%eax
10c8d7: f7 e9 imul %ecx
10c8d9: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c8df: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c8e5: c1 f8 06 sar $0x6,%eax
10c8e8: 8b 55 dc mov -0x24(%ebp),%edx
10c8eb: c1 fa 1f sar $0x1f,%edx
10c8ee: 29 d0 sub %edx,%eax
10c8f0: 50 push %eax
10c8f1: ff 75 d8 pushl -0x28(%ebp)
10c8f4: 8b 45 9c mov -0x64(%ebp),%eax
10c8f7: f7 e9 imul %ecx
10c8f9: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c8ff: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c905: c1 f8 06 sar $0x6,%eax
10c908: 8b 55 9c mov -0x64(%ebp),%edx
10c90b: c1 fa 1f sar $0x1f,%edx
10c90e: 29 d0 sub %edx,%eax
10c910: 50 push %eax
10c911: ff 75 98 pushl -0x68(%ebp)
10c914: 8b 45 94 mov -0x6c(%ebp),%eax
10c917: f7 e9 imul %ecx
10c919: 89 85 70 ff ff ff mov %eax,-0x90(%ebp)
10c91f: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c925: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c92b: c1 f8 06 sar $0x6,%eax
10c92e: 8b 55 94 mov -0x6c(%ebp),%edx
10c931: c1 fa 1f sar $0x1f,%edx
10c934: 29 d0 sub %edx,%eax
10c936: 50 push %eax
10c937: ff 75 90 pushl -0x70(%ebp)
10c93a: 68 28 36 12 00 push $0x123628
10c93f: 56 push %esi
10c940: 89 4d 84 mov %ecx,-0x7c(%ebp)
10c943: ff 55 0c call *0xc(%ebp)
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);
10c946: 83 c4 2c add $0x2c,%esp
10c949: 8d 55 d8 lea -0x28(%ebp),%edx
10c94c: 52 push %edx
10c94d: ff 75 88 pushl -0x78(%ebp)
10c950: 8d 45 b8 lea -0x48(%ebp),%eax
10c953: 50 push %eax
10c954: e8 fb 34 00 00 call 10fe54 <_Timespec_Divide_by_integer>
(*print)( context,
10c959: 8b 4d 84 mov -0x7c(%ebp),%ecx
10c95c: 8b 45 dc mov -0x24(%ebp),%eax
10c95f: f7 e9 imul %ecx
10c961: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c967: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c96d: c1 f8 06 sar $0x6,%eax
10c970: 8b 55 dc mov -0x24(%ebp),%edx
10c973: c1 fa 1f sar $0x1f,%edx
10c976: 29 d0 sub %edx,%eax
10c978: 50 push %eax
10c979: ff 75 d8 pushl -0x28(%ebp)
10c97c: 8b 45 b4 mov -0x4c(%ebp),%eax
10c97f: f7 e9 imul %ecx
10c981: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c987: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c98d: c1 f8 06 sar $0x6,%eax
10c990: 8b 55 b4 mov -0x4c(%ebp),%edx
10c993: c1 fa 1f sar $0x1f,%edx
10c996: 29 d0 sub %edx,%eax
10c998: 50 push %eax
10c999: ff 75 b0 pushl -0x50(%ebp)
10c99c: 8b 45 ac mov -0x54(%ebp),%eax
10c99f: f7 e9 imul %ecx
10c9a1: 89 85 70 ff ff ff mov %eax,-0x90(%ebp)
10c9a7: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c9ad: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c9b3: c1 f8 06 sar $0x6,%eax
10c9b6: 8b 55 ac mov -0x54(%ebp),%edx
10c9b9: c1 fa 1f sar $0x1f,%edx
10c9bc: 29 d0 sub %edx,%eax
10c9be: 50 push %eax
10c9bf: ff 75 a8 pushl -0x58(%ebp)
10c9c2: 68 48 36 12 00 push $0x123648
10c9c7: 56 push %esi
10c9c8: ff 55 0c call *0xc(%ebp)
10c9cb: 83 c4 30 add $0x30,%esp
10c9ce: e9 75 fe ff ff jmp 10c848 <rtems_rate_monotonic_report_statistics_with_plugin+0x68>
0010c9ec <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
10c9ec: 55 push %ebp
10c9ed: 89 e5 mov %esp,%ebp
10c9ef: 53 push %ebx
10c9f0: 83 ec 04 sub $0x4,%esp
10c9f3: a1 d0 a8 12 00 mov 0x12a8d0,%eax
10c9f8: 40 inc %eax
10c9f9: a3 d0 a8 12 00 mov %eax,0x12a8d0
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10c9fe: 8b 1d e8 a7 12 00 mov 0x12a7e8,%ebx
10ca04: 3b 1d ec a7 12 00 cmp 0x12a7ec,%ebx
10ca0a: 77 15 ja 10ca21 <rtems_rate_monotonic_reset_all_statistics+0x35><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
10ca0c: 83 ec 0c sub $0xc,%esp
10ca0f: 53 push %ebx
10ca10: e8 17 00 00 00 call 10ca2c <rtems_rate_monotonic_reset_statistics>
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
10ca15: 43 inc %ebx
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
10ca16: 83 c4 10 add $0x10,%esp
10ca19: 39 1d ec a7 12 00 cmp %ebx,0x12a7ec
10ca1f: 73 eb jae 10ca0c <rtems_rate_monotonic_reset_all_statistics+0x20>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
10ca21: 8b 5d fc mov -0x4(%ebp),%ebx
10ca24: c9 leave
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
10ca25: e9 c2 28 00 00 jmp 10f2ec <_Thread_Enable_dispatch>
0010ca2c <rtems_rate_monotonic_reset_statistics>:
*/
rtems_status_code rtems_rate_monotonic_reset_statistics(
rtems_id id
)
{
10ca2c: 55 push %ebp
10ca2d: 89 e5 mov %esp,%ebp
10ca2f: 57 push %edi
10ca30: 53 push %ebx
10ca31: 83 ec 14 sub $0x14,%esp
Objects_Locations location;
Rate_monotonic_Control *the_period;
the_period = _Rate_monotonic_Get( id, &location );
10ca34: 8d 45 f4 lea -0xc(%ebp),%eax
10ca37: 50 push %eax
10ca38: ff 75 08 pushl 0x8(%ebp)
10ca3b: 68 e0 a7 12 00 push $0x12a7e0
10ca40: e8 f3 1d 00 00 call 10e838 <_Objects_Get>
10ca45: 89 c2 mov %eax,%edx
switch ( location ) {
10ca47: 83 c4 10 add $0x10,%esp
10ca4a: 8b 45 f4 mov -0xc(%ebp),%eax
10ca4d: 85 c0 test %eax,%eax
10ca4f: 75 3b jne 10ca8c <rtems_rate_monotonic_reset_statistics+0x60>
case OBJECTS_LOCAL:
_Rate_monotonic_Reset_statistics( the_period );
10ca51: 8d 5a 54 lea 0x54(%edx),%ebx
10ca54: b9 38 00 00 00 mov $0x38,%ecx
10ca59: 31 c0 xor %eax,%eax
10ca5b: 89 df mov %ebx,%edi
10ca5d: f3 aa rep stos %al,%es:(%edi)
10ca5f: c7 42 5c ff ff ff 7f movl $0x7fffffff,0x5c(%edx)
10ca66: c7 42 60 ff ff ff 7f movl $0x7fffffff,0x60(%edx)
10ca6d: c7 42 74 ff ff ff 7f movl $0x7fffffff,0x74(%edx)
10ca74: c7 42 78 ff ff ff 7f movl $0x7fffffff,0x78(%edx)
_Thread_Enable_dispatch();
10ca7b: e8 6c 28 00 00 call 10f2ec <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ca80: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ca82: 8d 65 f8 lea -0x8(%ebp),%esp
10ca85: 5b pop %ebx
10ca86: 5f pop %edi
10ca87: c9 leave
10ca88: c3 ret
10ca89: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10ca8c: b8 04 00 00 00 mov $0x4,%eax
}
10ca91: 8d 65 f8 lea -0x8(%ebp),%esp
10ca94: 5b pop %ebx
10ca95: 5f pop %edi
10ca96: c9 leave
10ca97: c3 ret
00117238 <rtems_region_create>:
uintptr_t length,
uintptr_t page_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
117238: 55 push %ebp
117239: 89 e5 mov %esp,%ebp
11723b: 57 push %edi
11723c: 56 push %esi
11723d: 53 push %ebx
11723e: 83 ec 1c sub $0x1c,%esp
117241: 8b 7d 08 mov 0x8(%ebp),%edi
117244: 8b 75 0c mov 0xc(%ebp),%esi
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
117247: 85 ff test %edi,%edi
117249: 0f 84 c1 00 00 00 je 117310 <rtems_region_create+0xd8>
return RTEMS_INVALID_NAME;
if ( !starting_address )
11724f: 85 f6 test %esi,%esi
117251: 0f 84 e1 00 00 00 je 117338 <rtems_region_create+0x100>
return RTEMS_INVALID_ADDRESS;
if ( !id )
117257: 8b 45 1c mov 0x1c(%ebp),%eax
11725a: 85 c0 test %eax,%eax
11725c: 0f 84 d6 00 00 00 je 117338 <rtems_region_create+0x100>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
117262: 83 ec 0c sub $0xc,%esp
117265: ff 35 bc 22 14 00 pushl 0x1422bc
11726b: e8 28 25 00 00 call 119798 <_API_Mutex_Lock>
* This function allocates a region control block from
* the inactive chain of free region control blocks.
*/
RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void )
{
return (Region_Control *) _Objects_Allocate( &_Region_Information );
117270: c7 04 24 e0 20 14 00 movl $0x1420e0,(%esp)
117277: e8 58 3b 00 00 call 11add4 <_Objects_Allocate>
11727c: 89 c3 mov %eax,%ebx
the_region = _Region_Allocate();
if ( !the_region )
11727e: 83 c4 10 add $0x10,%esp
117281: 85 c0 test %eax,%eax
117283: 0f 84 bf 00 00 00 je 117348 <rtems_region_create+0x110>
return_status = RTEMS_TOO_MANY;
else {
the_region->maximum_segment_size = _Heap_Initialize(
117289: ff 75 14 pushl 0x14(%ebp)
11728c: ff 75 10 pushl 0x10(%ebp)
11728f: 56 push %esi
117290: 8d 40 68 lea 0x68(%eax),%eax
117293: 50 push %eax
117294: e8 47 37 00 00 call 11a9e0 <_Heap_Initialize>
117299: 89 43 5c mov %eax,0x5c(%ebx)
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
11729c: 83 c4 10 add $0x10,%esp
11729f: 85 c0 test %eax,%eax
1172a1: 74 7d je 117320 <rtems_region_create+0xe8>
return_status = RTEMS_INVALID_SIZE;
}
else {
the_region->starting_address = starting_address;
1172a3: 89 73 50 mov %esi,0x50(%ebx)
the_region->length = length;
1172a6: 8b 45 10 mov 0x10(%ebp),%eax
1172a9: 89 43 54 mov %eax,0x54(%ebx)
the_region->page_size = page_size;
1172ac: 8b 55 14 mov 0x14(%ebp),%edx
1172af: 89 53 58 mov %edx,0x58(%ebx)
the_region->attribute_set = attribute_set;
1172b2: 8b 45 18 mov 0x18(%ebp),%eax
1172b5: 89 43 60 mov %eax,0x60(%ebx)
the_region->number_of_used_blocks = 0;
1172b8: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
_Thread_queue_Initialize(
1172bf: 6a 06 push $0x6
1172c1: 6a 40 push $0x40
1172c3: a8 04 test $0x4,%al
1172c5: 0f 95 c0 setne %al
1172c8: 0f b6 c0 movzbl %al,%eax
1172cb: 50 push %eax
1172cc: 8d 43 10 lea 0x10(%ebx),%eax
1172cf: 50 push %eax
1172d0: e8 eb 51 00 00 call 11c4c0 <_Thread_queue_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1172d5: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1172d8: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1172db: 8b 15 fc 20 14 00 mov 0x1420fc,%edx
1172e1: 89 1c 8a mov %ebx,(%edx,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1172e4: 89 7b 0c mov %edi,0xc(%ebx)
&_Region_Information,
&the_region->Object,
(Objects_Name) name
);
*id = the_region->Object.id;
1172e7: 8b 55 1c mov 0x1c(%ebp),%edx
1172ea: 89 02 mov %eax,(%edx)
1172ec: 83 c4 10 add $0x10,%esp
return_status = RTEMS_SUCCESSFUL;
1172ef: 31 c0 xor %eax,%eax
}
}
_RTEMS_Unlock_allocator();
1172f1: 83 ec 0c sub $0xc,%esp
1172f4: ff 35 bc 22 14 00 pushl 0x1422bc
1172fa: 89 45 e4 mov %eax,-0x1c(%ebp)
1172fd: e8 de 24 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
117302: 83 c4 10 add $0x10,%esp
117305: 8b 45 e4 mov -0x1c(%ebp),%eax
}
117308: 8d 65 f4 lea -0xc(%ebp),%esp
11730b: 5b pop %ebx
11730c: 5e pop %esi
11730d: 5f pop %edi
11730e: c9 leave
11730f: c3 ret
{
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
117310: b8 03 00 00 00 mov $0x3,%eax
}
}
_RTEMS_Unlock_allocator();
return return_status;
}
117315: 8d 65 f4 lea -0xc(%ebp),%esp
117318: 5b pop %ebx
117319: 5e pop %esi
11731a: 5f pop %edi
11731b: c9 leave
11731c: c3 ret
11731d: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
117320: 83 ec 08 sub $0x8,%esp
117323: 53 push %ebx
117324: 68 e0 20 14 00 push $0x1420e0
117329: e8 1e 3e 00 00 call 11b14c <_Objects_Free>
11732e: 83 c4 10 add $0x10,%esp
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
_Region_Free( the_region );
return_status = RTEMS_INVALID_SIZE;
117331: b8 08 00 00 00 mov $0x8,%eax
117336: eb b9 jmp 1172f1 <rtems_region_create+0xb9>
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
117338: b8 09 00 00 00 mov $0x9,%eax
}
}
_RTEMS_Unlock_allocator();
return return_status;
}
11733d: 8d 65 f4 lea -0xc(%ebp),%esp
117340: 5b pop %ebx
117341: 5e pop %esi
117342: 5f pop %edi
117343: c9 leave
117344: c3 ret
117345: 8d 76 00 lea 0x0(%esi),%esi
_RTEMS_Lock_allocator(); /* to prevent deletion */
the_region = _Region_Allocate();
if ( !the_region )
return_status = RTEMS_TOO_MANY;
117348: b8 05 00 00 00 mov $0x5,%eax
11734d: eb a2 jmp 1172f1 <rtems_region_create+0xb9>
00117350 <rtems_region_delete>:
*/
rtems_status_code rtems_region_delete(
rtems_id id
)
{
117350: 55 push %ebp
117351: 89 e5 mov %esp,%ebp
117353: 53 push %ebx
117354: 83 ec 30 sub $0x30,%esp
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
_RTEMS_Lock_allocator();
117357: ff 35 bc 22 14 00 pushl 0x1422bc
11735d: e8 36 24 00 00 call 119798 <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
117362: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117365: 8d 45 f4 lea -0xc(%ebp),%eax
117368: 50 push %eax
117369: ff 75 08 pushl 0x8(%ebp)
11736c: 68 e0 20 14 00 push $0x1420e0
117371: e8 16 3f 00 00 call 11b28c <_Objects_Get_no_protection>
switch ( location ) {
117376: 83 c4 10 add $0x10,%esp
117379: 8b 5d f4 mov -0xc(%ebp),%ebx
11737c: 85 db test %ebx,%ebx
11737e: 74 1c je 11739c <rtems_region_delete+0x4c>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117380: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117385: 83 ec 0c sub $0xc,%esp
117388: ff 35 bc 22 14 00 pushl 0x1422bc
11738e: e8 4d 24 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
}
117393: 89 d8 mov %ebx,%eax
117395: 8b 5d fc mov -0x4(%ebp),%ebx
117398: c9 leave
117399: c3 ret
11739a: 66 90 xchg %ax,%ax
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 5 );
if ( the_region->number_of_used_blocks != 0 )
11739c: 8b 48 64 mov 0x64(%eax),%ecx
11739f: 85 c9 test %ecx,%ecx
1173a1: 74 09 je 1173ac <rtems_region_delete+0x5c>
return_status = RTEMS_RESOURCE_IN_USE;
1173a3: bb 0c 00 00 00 mov $0xc,%ebx
1173a8: eb db jmp 117385 <rtems_region_delete+0x35>
1173aa: 66 90 xchg %ax,%ax
else {
_Objects_Close( &_Region_Information, &the_region->Object );
1173ac: 83 ec 08 sub $0x8,%esp
1173af: 50 push %eax
1173b0: 68 e0 20 14 00 push $0x1420e0
1173b5: 89 45 e4 mov %eax,-0x1c(%ebp)
1173b8: e8 93 3a 00 00 call 11ae50 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
1173bd: 58 pop %eax
1173be: 5a pop %edx
1173bf: 8b 45 e4 mov -0x1c(%ebp),%eax
1173c2: 50 push %eax
1173c3: 68 e0 20 14 00 push $0x1420e0
1173c8: e8 7f 3d 00 00 call 11b14c <_Objects_Free>
1173cd: 83 c4 10 add $0x10,%esp
_Region_Free( the_region );
return_status = RTEMS_SUCCESSFUL;
1173d0: 31 db xor %ebx,%ebx
1173d2: eb b1 jmp 117385 <rtems_region_delete+0x35>
001173d4 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
1173d4: 55 push %ebp
1173d5: 89 e5 mov %esp,%ebp
1173d7: 56 push %esi
1173d8: 53 push %ebx
1173d9: 83 ec 10 sub $0x10,%esp
1173dc: 8b 5d 0c mov 0xc(%ebp),%ebx
bool extend_ok;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
1173df: 85 db test %ebx,%ebx
1173e1: 74 75 je 117458 <rtems_region_extend+0x84>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
1173e3: 83 ec 0c sub $0xc,%esp
1173e6: ff 35 bc 22 14 00 pushl 0x1422bc
1173ec: e8 a7 23 00 00 call 119798 <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
1173f1: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
1173f4: 8d 45 f0 lea -0x10(%ebp),%eax
1173f7: 50 push %eax
1173f8: ff 75 08 pushl 0x8(%ebp)
1173fb: 68 e0 20 14 00 push $0x1420e0
117400: e8 87 3e 00 00 call 11b28c <_Objects_Get_no_protection>
117405: 89 c6 mov %eax,%esi
switch ( location ) {
117407: 83 c4 10 add $0x10,%esp
11740a: 8b 45 f0 mov -0x10(%ebp),%eax
11740d: 85 c0 test %eax,%eax
11740f: 74 1f je 117430 <rtems_region_extend+0x5c>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117411: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117416: 83 ec 0c sub $0xc,%esp
117419: ff 35 bc 22 14 00 pushl 0x1422bc
11741f: e8 bc 23 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
117424: 83 c4 10 add $0x10,%esp
}
117427: 89 d8 mov %ebx,%eax
117429: 8d 65 f8 lea -0x8(%ebp),%esp
11742c: 5b pop %ebx
11742d: 5e pop %esi
11742e: c9 leave
11742f: c3 ret
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
extend_ok = _Heap_Extend(
117430: 8d 45 f4 lea -0xc(%ebp),%eax
117433: 50 push %eax
117434: ff 75 10 pushl 0x10(%ebp)
117437: 53 push %ebx
117438: 8d 46 68 lea 0x68(%esi),%eax
11743b: 50 push %eax
11743c: e8 ab 2f 00 00 call 11a3ec <_Heap_Extend>
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
117441: 83 c4 10 add $0x10,%esp
117444: 84 c0 test %al,%al
117446: 74 20 je 117468 <rtems_region_extend+0x94>
the_region->length += amount_extended;
117448: 8b 45 f4 mov -0xc(%ebp),%eax
11744b: 01 46 54 add %eax,0x54(%esi)
the_region->maximum_segment_size += amount_extended;
11744e: 01 46 5c add %eax,0x5c(%esi)
return_status = RTEMS_SUCCESSFUL;
117451: 31 db xor %ebx,%ebx
117453: eb c1 jmp 117416 <rtems_region_extend+0x42>
117455: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
117458: bb 09 00 00 00 mov $0x9,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
11745d: 89 d8 mov %ebx,%eax
11745f: 8d 65 f8 lea -0x8(%ebp),%esp
117462: 5b pop %ebx
117463: 5e pop %esi
117464: c9 leave
117465: c3 ret
117466: 66 90 xchg %ax,%ax
if ( extend_ok ) {
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
} else {
return_status = RTEMS_INVALID_ADDRESS;
117468: bb 09 00 00 00 mov $0x9,%ebx
11746d: eb a7 jmp 117416 <rtems_region_extend+0x42>
00117470 <rtems_region_get_free_information>:
rtems_status_code rtems_region_get_free_information(
rtems_id id,
Heap_Information_block *the_info
)
{
117470: 55 push %ebp
117471: 89 e5 mov %esp,%ebp
117473: 53 push %ebx
117474: 83 ec 14 sub $0x14,%esp
117477: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
11747a: 85 db test %ebx,%ebx
11747c: 74 76 je 1174f4 <rtems_region_get_free_information+0x84>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
11747e: 83 ec 0c sub $0xc,%esp
117481: ff 35 bc 22 14 00 pushl 0x1422bc
117487: e8 0c 23 00 00 call 119798 <_API_Mutex_Lock>
11748c: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
11748f: 8d 45 f4 lea -0xc(%ebp),%eax
117492: 50 push %eax
117493: ff 75 08 pushl 0x8(%ebp)
117496: 68 e0 20 14 00 push $0x1420e0
11749b: e8 ec 3d 00 00 call 11b28c <_Objects_Get_no_protection>
switch ( location ) {
1174a0: 83 c4 10 add $0x10,%esp
1174a3: 8b 55 f4 mov -0xc(%ebp),%edx
1174a6: 85 d2 test %edx,%edx
1174a8: 74 1e je 1174c8 <rtems_region_get_free_information+0x58>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
1174aa: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
1174af: 83 ec 0c sub $0xc,%esp
1174b2: ff 35 bc 22 14 00 pushl 0x1422bc
1174b8: e8 23 23 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
1174bd: 83 c4 10 add $0x10,%esp
}
1174c0: 89 d8 mov %ebx,%eax
1174c2: 8b 5d fc mov -0x4(%ebp),%ebx
1174c5: c9 leave
1174c6: c3 ret
1174c7: 90 nop
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_info->Used.number = 0;
1174c8: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
the_info->Used.total = 0;
1174cf: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx)
the_info->Used.largest = 0;
1174d6: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
1174dd: 83 ec 08 sub $0x8,%esp
1174e0: 53 push %ebx
1174e1: 83 c0 68 add $0x68,%eax
1174e4: 50 push %eax
1174e5: e8 de 32 00 00 call 11a7c8 <_Heap_Get_free_information>
return_status = RTEMS_SUCCESSFUL;
break;
1174ea: 83 c4 10 add $0x10,%esp
the_info->Used.total = 0;
the_info->Used.largest = 0;
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
return_status = RTEMS_SUCCESSFUL;
1174ed: 31 db xor %ebx,%ebx
break;
1174ef: eb be jmp 1174af <rtems_region_get_free_information+0x3f>
1174f1: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
1174f4: bb 09 00 00 00 mov $0x9,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1174f9: 89 d8 mov %ebx,%eax
1174fb: 8b 5d fc mov -0x4(%ebp),%ebx
1174fe: c9 leave
1174ff: c3 ret
00117578 <rtems_region_get_segment>:
uintptr_t size,
rtems_option option_set,
rtems_interval timeout,
void **segment
)
{
117578: 55 push %ebp
117579: 89 e5 mov %esp,%ebp
11757b: 57 push %edi
11757c: 56 push %esi
11757d: 53 push %ebx
11757e: 83 ec 2c sub $0x2c,%esp
117581: 8b 75 0c mov 0xc(%ebp),%esi
117584: 8b 5d 18 mov 0x18(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
void *the_segment;
if ( !segment )
117587: 85 db test %ebx,%ebx
117589: 0f 84 a1 00 00 00 je 117630 <rtems_region_get_segment+0xb8>
return RTEMS_INVALID_ADDRESS;
*segment = NULL;
11758f: c7 03 00 00 00 00 movl $0x0,(%ebx)
if ( size == 0 )
117595: 85 f6 test %esi,%esi
117597: 75 0f jne 1175a8 <rtems_region_get_segment+0x30>
return RTEMS_INVALID_SIZE;
117599: b8 08 00 00 00 mov $0x8,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
11759e: 8d 65 f4 lea -0xc(%ebp),%esp
1175a1: 5b pop %ebx
1175a2: 5e pop %esi
1175a3: 5f pop %edi
1175a4: c9 leave
1175a5: c3 ret
1175a6: 66 90 xchg %ax,%ax
*segment = NULL;
if ( size == 0 )
return RTEMS_INVALID_SIZE;
_RTEMS_Lock_allocator();
1175a8: 83 ec 0c sub $0xc,%esp
1175ab: ff 35 bc 22 14 00 pushl 0x1422bc
1175b1: e8 e2 21 00 00 call 119798 <_API_Mutex_Lock>
executing = _Thread_Executing;
1175b6: a1 b8 27 14 00 mov 0x1427b8,%eax
1175bb: 89 45 d4 mov %eax,-0x2c(%ebp)
1175be: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
1175c1: 8d 45 e4 lea -0x1c(%ebp),%eax
1175c4: 50 push %eax
1175c5: ff 75 08 pushl 0x8(%ebp)
1175c8: 68 e0 20 14 00 push $0x1420e0
1175cd: e8 ba 3c 00 00 call 11b28c <_Objects_Get_no_protection>
1175d2: 89 c7 mov %eax,%edi
switch ( location ) {
1175d4: 83 c4 10 add $0x10,%esp
1175d7: 8b 45 e4 mov -0x1c(%ebp),%eax
1175da: 85 c0 test %eax,%eax
1175dc: 75 2a jne 117608 <rtems_region_get_segment+0x90>
case OBJECTS_LOCAL:
if ( size > the_region->maximum_segment_size )
1175de: 3b 77 5c cmp 0x5c(%edi),%esi
1175e1: 76 2d jbe 117610 <rtems_region_get_segment+0x98>
return_status = RTEMS_INVALID_SIZE;
1175e3: b8 08 00 00 00 mov $0x8,%eax
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
1175e8: 83 ec 0c sub $0xc,%esp
1175eb: ff 35 bc 22 14 00 pushl 0x1422bc
1175f1: 89 45 d0 mov %eax,-0x30(%ebp)
1175f4: e8 e7 21 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
1175f9: 83 c4 10 add $0x10,%esp
1175fc: 8b 45 d0 mov -0x30(%ebp),%eax
}
1175ff: 8d 65 f4 lea -0xc(%ebp),%esp
117602: 5b pop %ebx
117603: 5e pop %esi
117604: 5f pop %edi
117605: c9 leave
117606: c3 ret
117607: 90 nop
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117608: b8 04 00 00 00 mov $0x4,%eax
11760d: eb d9 jmp 1175e8 <rtems_region_get_segment+0x70>
11760f: 90 nop
* @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 );
117610: 6a 00 push $0x0
117612: 6a 00 push $0x0
117614: 56 push %esi
RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
Region_Control *the_region,
uintptr_t size
)
{
return _Heap_Allocate( &the_region->Memory, size );
117615: 8d 47 68 lea 0x68(%edi),%eax
117618: 50 push %eax
117619: e8 fa 2b 00 00 call 11a218 <_Heap_Allocate_aligned_with_boundary>
the_segment = _Region_Allocate_segment( the_region, size );
_Region_Debug_Walk( the_region, 2 );
if ( the_segment ) {
11761e: 83 c4 10 add $0x10,%esp
117621: 85 c0 test %eax,%eax
117623: 74 17 je 11763c <rtems_region_get_segment+0xc4>
the_region->number_of_used_blocks += 1;
117625: ff 47 64 incl 0x64(%edi)
*segment = the_segment;
117628: 89 03 mov %eax,(%ebx)
return_status = RTEMS_SUCCESSFUL;
11762a: 31 c0 xor %eax,%eax
11762c: eb ba jmp 1175e8 <rtems_region_get_segment+0x70>
11762e: 66 90 xchg %ax,%ax
rtems_status_code return_status;
Region_Control *the_region;
void *the_segment;
if ( !segment )
return RTEMS_INVALID_ADDRESS;
117630: b8 09 00 00 00 mov $0x9,%eax
117635: e9 64 ff ff ff jmp 11759e <rtems_region_get_segment+0x26>
11763a: 66 90 xchg %ax,%ax
if ( the_segment ) {
the_region->number_of_used_blocks += 1;
*segment = the_segment;
return_status = RTEMS_SUCCESSFUL;
} else if ( _Options_Is_no_wait( option_set ) ) {
11763c: f6 45 10 01 testb $0x1,0x10(%ebp)
117640: 74 07 je 117649 <rtems_region_get_segment+0xd1>
return_status = RTEMS_UNSATISFIED;
117642: b8 0d 00 00 00 mov $0xd,%eax
117647: eb 9f jmp 1175e8 <rtems_region_get_segment+0x70>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
117649: a1 d0 21 14 00 mov 0x1421d0,%eax
11764e: 40 inc %eax
11764f: a3 d0 21 14 00 mov %eax,0x1421d0
* Switch from using the memory allocation mutex to using a
* dispatching disabled critical section. We have to do this
* because this thread is going to block.
*/
_Thread_Disable_dispatch();
_RTEMS_Unlock_allocator();
117654: 83 ec 0c sub $0xc,%esp
117657: ff 35 bc 22 14 00 pushl 0x1422bc
11765d: e8 7e 21 00 00 call 1197e0 <_API_Mutex_Unlock>
executing->Wait.queue = &the_region->Wait_queue;
117662: 8d 47 10 lea 0x10(%edi),%eax
117665: 8b 55 d4 mov -0x2c(%ebp),%edx
117668: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
11766b: 8b 4d 08 mov 0x8(%ebp),%ecx
11766e: 89 4a 20 mov %ecx,0x20(%edx)
executing->Wait.count = size;
117671: 89 72 24 mov %esi,0x24(%edx)
executing->Wait.return_argument = segment;
117674: 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;
117677: c7 47 40 01 00 00 00 movl $0x1,0x40(%edi)
_Thread_queue_Enter_critical_section( &the_region->Wait_queue );
_Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
11767e: 83 c4 0c add $0xc,%esp
117681: 68 84 c5 11 00 push $0x11c584
117686: ff 75 14 pushl 0x14(%ebp)
117689: 50 push %eax
11768a: e8 c9 4b 00 00 call 11c258 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
11768f: e8 e8 46 00 00 call 11bd7c <_Thread_Enable_dispatch>
return (rtems_status_code) executing->Wait.return_code;
117694: 8b 55 d4 mov -0x2c(%ebp),%edx
117697: 8b 42 34 mov 0x34(%edx),%eax
11769a: 83 c4 10 add $0x10,%esp
11769d: e9 fc fe ff ff jmp 11759e <rtems_region_get_segment+0x26>
00117758 <rtems_region_resize_segment>:
rtems_id id,
void *segment,
uintptr_t size,
uintptr_t *old_size
)
{
117758: 55 push %ebp
117759: 89 e5 mov %esp,%ebp
11775b: 56 push %esi
11775c: 53 push %ebx
11775d: 83 ec 20 sub $0x20,%esp
117760: 8b 5d 14 mov 0x14(%ebp),%ebx
uintptr_t osize;
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
117763: 85 db test %ebx,%ebx
117765: 0f 84 89 00 00 00 je 1177f4 <rtems_region_resize_segment+0x9c>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
11776b: 83 ec 0c sub $0xc,%esp
11776e: ff 35 bc 22 14 00 pushl 0x1422bc
117774: e8 1f 20 00 00 call 119798 <_API_Mutex_Lock>
117779: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
11777c: 8d 45 f0 lea -0x10(%ebp),%eax
11777f: 50 push %eax
117780: ff 75 08 pushl 0x8(%ebp)
117783: 68 e0 20 14 00 push $0x1420e0
117788: e8 ff 3a 00 00 call 11b28c <_Objects_Get_no_protection>
11778d: 89 c6 mov %eax,%esi
switch ( location ) {
11778f: 83 c4 10 add $0x10,%esp
117792: 8b 45 f0 mov -0x10(%ebp),%eax
117795: 85 c0 test %eax,%eax
117797: 74 1f je 1177b8 <rtems_region_resize_segment+0x60>
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
117799: 83 ec 0c sub $0xc,%esp
11779c: ff 35 bc 22 14 00 pushl 0x1422bc
1177a2: e8 39 20 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
1177a7: 83 c4 10 add $0x10,%esp
1177aa: b8 04 00 00 00 mov $0x4,%eax
}
1177af: 8d 65 f8 lea -0x8(%ebp),%esp
1177b2: 5b pop %ebx
1177b3: 5e pop %esi
1177b4: c9 leave
1177b5: c3 ret
1177b6: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 7 );
status = _Heap_Resize_block(
1177b8: 83 ec 0c sub $0xc,%esp
1177bb: 8d 45 f4 lea -0xc(%ebp),%eax
1177be: 50 push %eax
1177bf: 8d 45 ec lea -0x14(%ebp),%eax
1177c2: 50 push %eax
1177c3: ff 75 10 pushl 0x10(%ebp)
1177c6: ff 75 0c pushl 0xc(%ebp)
1177c9: 8d 46 68 lea 0x68(%esi),%eax
1177cc: 50 push %eax
1177cd: e8 16 34 00 00 call 11abe8 <_Heap_Resize_block>
segment,
(uint32_t) size,
&osize,
&avail_size
);
*old_size = (uint32_t) osize;
1177d2: 8b 55 ec mov -0x14(%ebp),%edx
1177d5: 89 13 mov %edx,(%ebx)
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
1177d7: 83 c4 20 add $0x20,%esp
1177da: 85 c0 test %eax,%eax
1177dc: 75 22 jne 117800 <rtems_region_resize_segment+0xa8>
_Region_Process_queue( the_region ); /* unlocks allocator */
1177de: 83 ec 0c sub $0xc,%esp
1177e1: 56 push %esi
1177e2: e8 a9 7c 00 00 call 11f490 <_Region_Process_queue>
1177e7: 83 c4 10 add $0x10,%esp
else
_RTEMS_Unlock_allocator();
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
1177ea: 31 c0 xor %eax,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1177ec: 8d 65 f8 lea -0x8(%ebp),%esp
1177ef: 5b pop %ebx
1177f0: 5e pop %esi
1177f1: c9 leave
1177f2: c3 ret
1177f3: 90 nop
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
return RTEMS_INVALID_ADDRESS;
1177f4: b8 09 00 00 00 mov $0x9,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1177f9: 8d 65 f8 lea -0x8(%ebp),%esp
1177fc: 5b pop %ebx
1177fd: 5e pop %esi
1177fe: c9 leave
1177ff: c3 ret
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
_Region_Process_queue( the_region ); /* unlocks allocator */
else
_RTEMS_Unlock_allocator();
117800: 83 ec 0c sub $0xc,%esp
117803: ff 35 bc 22 14 00 pushl 0x1422bc
117809: 89 45 e4 mov %eax,-0x1c(%ebp)
11780c: e8 cf 1f 00 00 call 1197e0 <_API_Mutex_Unlock>
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
117811: 83 c4 10 add $0x10,%esp
return RTEMS_UNSATISFIED;
117814: 8b 45 e4 mov -0x1c(%ebp),%eax
117817: 48 dec %eax
117818: 0f 94 c0 sete %al
11781b: 0f b6 c0 movzbl %al,%eax
11781e: 8d 04 85 09 00 00 00 lea 0x9(,%eax,4),%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117825: 8d 65 f8 lea -0x8(%ebp),%esp
117828: 5b pop %ebx
117829: 5e pop %esi
11782a: c9 leave
11782b: c3 ret
0011782c <rtems_region_return_segment>:
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
)
{
11782c: 55 push %ebp
11782d: 89 e5 mov %esp,%ebp
11782f: 53 push %ebx
117830: 83 ec 20 sub $0x20,%esp
uint32_t size;
#endif
int status;
register Region_Control *the_region;
_RTEMS_Lock_allocator();
117833: ff 35 bc 22 14 00 pushl 0x1422bc
117839: e8 5a 1f 00 00 call 119798 <_API_Mutex_Lock>
11783e: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117841: 8d 45 f4 lea -0xc(%ebp),%eax
117844: 50 push %eax
117845: ff 75 08 pushl 0x8(%ebp)
117848: 68 e0 20 14 00 push $0x1420e0
11784d: e8 3a 3a 00 00 call 11b28c <_Objects_Get_no_protection>
117852: 89 c3 mov %eax,%ebx
switch ( location ) {
117854: 83 c4 10 add $0x10,%esp
117857: 8b 45 f4 mov -0xc(%ebp),%eax
11785a: 85 c0 test %eax,%eax
11785c: 75 1e jne 11787c <rtems_region_return_segment+0x50>
RTEMS_INLINE_ROUTINE bool _Region_Free_segment (
Region_Control *the_region,
void *the_segment
)
{
return _Heap_Free( &the_region->Memory, the_segment );
11785e: 83 ec 08 sub $0x8,%esp
117861: ff 75 0c pushl 0xc(%ebp)
117864: 8d 43 68 lea 0x68(%ebx),%eax
117867: 50 push %eax
117868: e8 0b 2e 00 00 call 11a678 <_Heap_Free>
#endif
status = _Region_Free_segment( the_region, segment );
_Region_Debug_Walk( the_region, 4 );
if ( !status )
11786d: 83 c4 10 add $0x10,%esp
117870: 84 c0 test %al,%al
117872: 75 28 jne 11789c <rtems_region_return_segment+0x70>
return_status = RTEMS_INVALID_ADDRESS;
117874: bb 09 00 00 00 mov $0x9,%ebx
117879: eb 06 jmp 117881 <rtems_region_return_segment+0x55>
11787b: 90 nop
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
11787c: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117881: 83 ec 0c sub $0xc,%esp
117884: ff 35 bc 22 14 00 pushl 0x1422bc
11788a: e8 51 1f 00 00 call 1197e0 <_API_Mutex_Unlock>
return return_status;
11788f: 83 c4 10 add $0x10,%esp
}
117892: 89 d8 mov %ebx,%eax
117894: 8b 5d fc mov -0x4(%ebp),%ebx
117897: c9 leave
117898: c3 ret
117899: 8d 76 00 lea 0x0(%esi),%esi
_Region_Debug_Walk( the_region, 4 );
if ( !status )
return_status = RTEMS_INVALID_ADDRESS;
else {
the_region->number_of_used_blocks -= 1;
11789c: ff 4b 64 decl 0x64(%ebx)
_Region_Process_queue(the_region); /* unlocks allocator */
11789f: 83 ec 0c sub $0xc,%esp
1178a2: 53 push %ebx
1178a3: e8 e8 7b 00 00 call 11f490 <_Region_Process_queue>
return RTEMS_SUCCESSFUL;
1178a8: 83 c4 10 add $0x10,%esp
1178ab: 31 db xor %ebx,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1178ad: 89 d8 mov %ebx,%eax
1178af: 8b 5d fc mov -0x4(%ebp),%ebx
1178b2: c9 leave
1178b3: c3 ret
0010b434 <rtems_semaphore_create>:
uint32_t count,
rtems_attribute attribute_set,
rtems_task_priority priority_ceiling,
rtems_id *id
)
{
10b434: 55 push %ebp
10b435: 89 e5 mov %esp,%ebp
10b437: 57 push %edi
10b438: 56 push %esi
10b439: 53 push %ebx
10b43a: 83 ec 3c sub $0x3c,%esp
10b43d: 8b 75 08 mov 0x8(%ebp),%esi
10b440: 8b 5d 10 mov 0x10(%ebp),%ebx
10b443: 8b 7d 18 mov 0x18(%ebp),%edi
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
10b446: 85 f6 test %esi,%esi
10b448: 74 4a je 10b494 <rtems_semaphore_create+0x60>
return RTEMS_INVALID_NAME;
if ( !id )
10b44a: 85 ff test %edi,%edi
10b44c: 0f 84 f6 00 00 00 je 10b548 <rtems_semaphore_create+0x114>
return RTEMS_NOT_DEFINED;
} else
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
10b452: 89 da mov %ebx,%edx
10b454: 81 e2 c0 00 00 00 and $0xc0,%edx
10b45a: 74 48 je 10b4a4 <rtems_semaphore_create+0x70>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_binary_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_BINARY_SEMAPHORE);
10b45c: 89 d8 mov %ebx,%eax
10b45e: 83 e0 30 and $0x30,%eax
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
10b461: 83 f8 10 cmp $0x10,%eax
10b464: 74 0e je 10b474 <rtems_semaphore_create+0x40>
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
10b466: b8 0b 00 00 00 mov $0xb,%eax
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10b46b: 8d 65 f4 lea -0xc(%ebp),%esp
10b46e: 5b pop %ebx
10b46f: 5e pop %esi
10b470: 5f pop %edi
10b471: c9 leave
10b472: c3 ret
10b473: 90 nop
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
10b474: f6 c3 04 test $0x4,%bl
10b477: 74 ed je 10b466 <rtems_semaphore_create+0x32>
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
10b479: 81 fa c0 00 00 00 cmp $0xc0,%edx
10b47f: 74 e5 je 10b466 <rtems_semaphore_create+0x32>
10b481: b9 10 00 00 00 mov $0x10,%ecx
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
10b486: 83 7d 0c 01 cmpl $0x1,0xc(%ebp)
10b48a: 76 1f jbe 10b4ab <rtems_semaphore_create+0x77>
return RTEMS_INVALID_NUMBER;
10b48c: b8 0a 00 00 00 mov $0xa,%eax
10b491: eb d8 jmp 10b46b <rtems_semaphore_create+0x37>
10b493: 90 nop
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10b494: b8 03 00 00 00 mov $0x3,%eax
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10b499: 8d 65 f4 lea -0xc(%ebp),%esp
10b49c: 5b pop %ebx
10b49d: 5e pop %esi
10b49e: 5f pop %edi
10b49f: c9 leave
10b4a0: c3 ret
10b4a1: 8d 76 00 lea 0x0(%esi),%esi
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
10b4a4: 89 d9 mov %ebx,%ecx
10b4a6: 83 e1 30 and $0x30,%ecx
10b4a9: 75 db jne 10b486 <rtems_semaphore_create+0x52>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b4ab: a1 50 75 12 00 mov 0x127550,%eax
10b4b0: 40 inc %eax
10b4b1: a3 50 75 12 00 mov %eax,0x127550
* This function allocates a semaphore control block from
* the inactive chain of free semaphore control blocks.
*/
RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
{
return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
10b4b6: 83 ec 0c sub $0xc,%esp
10b4b9: 68 a0 74 12 00 push $0x1274a0
10b4be: 89 4d c4 mov %ecx,-0x3c(%ebp)
10b4c1: e8 ca 14 00 00 call 10c990 <_Objects_Allocate>
10b4c6: 89 c2 mov %eax,%edx
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
10b4c8: 83 c4 10 add $0x10,%esp
10b4cb: 85 c0 test %eax,%eax
10b4cd: 8b 4d c4 mov -0x3c(%ebp),%ecx
10b4d0: 0f 84 ba 00 00 00 je 10b590 <rtems_semaphore_create+0x15c>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_semaphore->attribute_set = attribute_set;
10b4d6: 89 58 10 mov %ebx,0x10(%eax)
/*
* Initialize it as a counting semaphore.
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
10b4d9: 85 c9 test %ecx,%ecx
10b4db: 74 77 je 10b554 <rtems_semaphore_create+0x120>
/*
* It is either simple binary semaphore or a more powerful mutex
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
10b4dd: 31 c0 xor %eax,%eax
10b4df: f6 c3 04 test $0x4,%bl
10b4e2: 0f 95 c0 setne %al
10b4e5: 89 45 d8 mov %eax,-0x28(%ebp)
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
10b4e8: 83 f9 10 cmp $0x10,%ecx
10b4eb: 0f 84 ae 00 00 00 je 10b59f <rtems_semaphore_create+0x16b>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
the_mutex_attr.only_owner_release = true;
}
}
} else /* must be simple binary semaphore */ {
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
10b4f1: c7 45 d0 02 00 00 00 movl $0x2,-0x30(%ebp)
the_mutex_attr.only_owner_release = false;
10b4f8: c6 45 d4 00 movb $0x0,-0x2c(%ebp)
}
mutex_status = _CORE_mutex_Initialize(
10b4fc: 50 push %eax
10b4fd: 31 c0 xor %eax,%eax
10b4ff: 83 7d 0c 01 cmpl $0x1,0xc(%ebp)
10b503: 0f 94 c0 sete %al
10b506: 50 push %eax
10b507: 8d 45 d0 lea -0x30(%ebp),%eax
10b50a: 50 push %eax
10b50b: 8d 42 14 lea 0x14(%edx),%eax
10b50e: 50 push %eax
10b50f: 89 55 c4 mov %edx,-0x3c(%ebp)
10b512: e8 69 0c 00 00 call 10c180 <_CORE_mutex_Initialize>
&the_semaphore->Core_control.mutex,
&the_mutex_attr,
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
10b517: 83 c4 10 add $0x10,%esp
10b51a: 83 f8 06 cmp $0x6,%eax
10b51d: 8b 55 c4 mov -0x3c(%ebp),%edx
10b520: 0f 84 a9 00 00 00 je 10b5cf <rtems_semaphore_create+0x19b>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b526: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10b529: 0f b7 d8 movzwl %ax,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b52c: 8b 0d bc 74 12 00 mov 0x1274bc,%ecx
10b532: 89 14 99 mov %edx,(%ecx,%ebx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10b535: 89 72 0c mov %esi,0xc(%edx)
&_Semaphore_Information,
&the_semaphore->Object,
(Objects_Name) name
);
*id = the_semaphore->Object.id;
10b538: 89 07 mov %eax,(%edi)
the_semaphore->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
10b53a: e8 bd 23 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b53f: 31 c0 xor %eax,%eax
10b541: e9 25 ff ff ff jmp 10b46b <rtems_semaphore_create+0x37>
10b546: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10b548: b8 09 00 00 00 mov $0x9,%eax
10b54d: e9 19 ff ff ff jmp 10b46b <rtems_semaphore_create+0x37>
10b552: 66 90 xchg %ax,%ax
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
10b554: c7 45 e0 ff ff ff ff movl $0xffffffff,-0x20(%ebp)
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
10b55b: 31 c0 xor %eax,%eax
10b55d: f6 c3 04 test $0x4,%bl
10b560: 0f 95 c0 setne %al
10b563: 89 45 e4 mov %eax,-0x1c(%ebp)
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10b566: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
10b56d: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp)
_CORE_semaphore_Initialize(
10b574: 51 push %ecx
10b575: ff 75 0c pushl 0xc(%ebp)
10b578: 8d 45 e0 lea -0x20(%ebp),%eax
10b57b: 50 push %eax
10b57c: 8d 42 14 lea 0x14(%edx),%eax
10b57f: 50 push %eax
10b580: 89 55 c4 mov %edx,-0x3c(%ebp)
10b583: e8 88 0e 00 00 call 10c410 <_CORE_semaphore_Initialize>
10b588: 83 c4 10 add $0x10,%esp
10b58b: 8b 55 c4 mov -0x3c(%ebp),%edx
10b58e: eb 96 jmp 10b526 <rtems_semaphore_create+0xf2>
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
10b590: e8 67 23 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10b595: b8 05 00 00 00 mov $0x5,%eax
10b59a: e9 cc fe ff ff jmp 10b46b <rtems_semaphore_create+0x37>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
10b59f: 8b 45 14 mov 0x14(%ebp),%eax
10b5a2: 89 45 dc mov %eax,-0x24(%ebp)
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10b5a5: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp)
the_mutex_attr.only_owner_release = false;
10b5ac: c6 45 d4 00 movb $0x0,-0x2c(%ebp)
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
10b5b0: 83 7d d8 01 cmpl $0x1,-0x28(%ebp)
10b5b4: 0f 85 42 ff ff ff jne 10b4fc <rtems_semaphore_create+0xc8>
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
10b5ba: f6 c3 40 test $0x40,%bl
10b5bd: 74 30 je 10b5ef <rtems_semaphore_create+0x1bb>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
10b5bf: c7 45 d8 02 00 00 00 movl $0x2,-0x28(%ebp)
the_mutex_attr.only_owner_release = true;
10b5c6: c6 45 d4 01 movb $0x1,-0x2c(%ebp)
10b5ca: e9 2d ff ff ff jmp 10b4fc <rtems_semaphore_create+0xc8>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
10b5cf: 83 ec 08 sub $0x8,%esp
10b5d2: 52 push %edx
10b5d3: 68 a0 74 12 00 push $0x1274a0
10b5d8: e8 2b 17 00 00 call 10cd08 <_Objects_Free>
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
10b5dd: e8 1a 23 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_INVALID_PRIORITY;
10b5e2: 83 c4 10 add $0x10,%esp
10b5e5: b8 13 00 00 00 mov $0x13,%eax
10b5ea: e9 7c fe ff ff jmp 10b46b <rtems_semaphore_create+0x37>
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
the_mutex_attr.only_owner_release = true;
} else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
10b5ef: 81 e3 80 00 00 00 and $0x80,%ebx
10b5f5: 0f 84 01 ff ff ff je 10b4fc <rtems_semaphore_create+0xc8>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
10b5fb: c7 45 d8 03 00 00 00 movl $0x3,-0x28(%ebp)
the_mutex_attr.only_owner_release = true;
10b602: c6 45 d4 01 movb $0x1,-0x2c(%ebp)
10b606: e9 f1 fe ff ff jmp 10b4fc <rtems_semaphore_create+0xc8>
0010b60c <rtems_semaphore_delete>:
#endif
rtems_status_code rtems_semaphore_delete(
rtems_id id
)
{
10b60c: 55 push %ebp
10b60d: 89 e5 mov %esp,%ebp
10b60f: 53 push %ebx
10b610: 83 ec 18 sub $0x18,%esp
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
10b613: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
_Objects_Get( &_Semaphore_Information, id, location );
10b616: 50 push %eax
10b617: ff 75 08 pushl 0x8(%ebp)
10b61a: 68 a0 74 12 00 push $0x1274a0
10b61f: e8 24 18 00 00 call 10ce48 <_Objects_Get>
10b624: 89 c3 mov %eax,%ebx
switch ( location ) {
10b626: 83 c4 10 add $0x10,%esp
10b629: 8b 4d f4 mov -0xc(%ebp),%ecx
10b62c: 85 c9 test %ecx,%ecx
10b62e: 74 0c je 10b63c <rtems_semaphore_delete+0x30>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b630: b8 04 00 00 00 mov $0x4,%eax
}
10b635: 8b 5d fc mov -0x4(%ebp),%ebx
10b638: c9 leave
10b639: c3 ret
10b63a: 66 90 xchg %ax,%ax
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_counting_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE);
10b63c: 8b 40 10 mov 0x10(%eax),%eax
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
10b63f: 83 e0 30 and $0x30,%eax
10b642: 74 58 je 10b69c <rtems_semaphore_delete+0x90>
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) &&
10b644: 8b 53 64 mov 0x64(%ebx),%edx
10b647: 85 d2 test %edx,%edx
10b649: 75 15 jne 10b660 <rtems_semaphore_delete+0x54>
10b64b: 83 f8 20 cmp $0x20,%eax
10b64e: 74 10 je 10b660 <rtems_semaphore_delete+0x54>
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
10b650: e8 a7 22 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
10b655: b8 0c 00 00 00 mov $0xc,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b65a: 8b 5d fc mov -0x4(%ebp),%ebx
10b65d: c9 leave
10b65e: c3 ret
10b65f: 90 nop
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
_CORE_mutex_Flush(
10b660: 50 push %eax
10b661: 6a 04 push $0x4
10b663: 6a 00 push $0x0
10b665: 8d 43 14 lea 0x14(%ebx),%eax
10b668: 50 push %eax
10b669: e8 06 0b 00 00 call 10c174 <_CORE_mutex_Flush>
10b66e: 83 c4 10 add $0x10,%esp
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
10b671: 83 ec 08 sub $0x8,%esp
10b674: 53 push %ebx
10b675: 68 a0 74 12 00 push $0x1274a0
10b67a: e8 8d 13 00 00 call 10ca0c <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
10b67f: 58 pop %eax
10b680: 5a pop %edx
10b681: 53 push %ebx
10b682: 68 a0 74 12 00 push $0x1274a0
10b687: e8 7c 16 00 00 call 10cd08 <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
10b68c: e8 6b 22 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10b691: 83 c4 10 add $0x10,%esp
10b694: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b696: 8b 5d fc mov -0x4(%ebp),%ebx
10b699: c9 leave
10b69a: c3 ret
10b69b: 90 nop
&the_semaphore->Core_control.mutex,
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_MUTEX_WAS_DELETED
);
} else {
_CORE_semaphore_Flush(
10b69c: 51 push %ecx
10b69d: 6a 02 push $0x2
10b69f: 6a 00 push $0x0
10b6a1: 8d 43 14 lea 0x14(%ebx),%eax
10b6a4: 50 push %eax
10b6a5: e8 5a 0d 00 00 call 10c404 <_CORE_semaphore_Flush>
10b6aa: 83 c4 10 add $0x10,%esp
10b6ad: eb c2 jmp 10b671 <rtems_semaphore_delete+0x65>
0010b6b0 <rtems_semaphore_obtain>:
rtems_status_code rtems_semaphore_obtain(
rtems_id id,
rtems_option option_set,
rtems_interval timeout
)
{
10b6b0: 55 push %ebp
10b6b1: 89 e5 mov %esp,%ebp
10b6b3: 57 push %edi
10b6b4: 56 push %esi
10b6b5: 53 push %ebx
10b6b6: 83 ec 1c sub $0x1c,%esp
10b6b9: 8b 5d 08 mov 0x8(%ebp),%ebx
10b6bc: 8b 75 0c mov 0xc(%ebp),%esi
10b6bf: 8b 7d 10 mov 0x10(%ebp),%edi
register Semaphore_Control *the_semaphore;
Objects_Locations location;
ISR_Level level;
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
10b6c2: 8d 45 e0 lea -0x20(%ebp),%eax
Objects_Locations *location,
ISR_Level *level
)
{
return (Semaphore_Control *)
_Objects_Get_isr_disable( &_Semaphore_Information, id, location, level );
10b6c5: 50 push %eax
10b6c6: 8d 45 e4 lea -0x1c(%ebp),%eax
10b6c9: 50 push %eax
10b6ca: 53 push %ebx
10b6cb: 68 a0 74 12 00 push $0x1274a0
10b6d0: e8 1b 17 00 00 call 10cdf0 <_Objects_Get_isr_disable>
switch ( location ) {
10b6d5: 83 c4 10 add $0x10,%esp
10b6d8: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b6db: 85 c9 test %ecx,%ecx
10b6dd: 74 0d je 10b6ec <rtems_semaphore_obtain+0x3c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b6df: b8 04 00 00 00 mov $0x4,%eax
}
10b6e4: 8d 65 f4 lea -0xc(%ebp),%esp
10b6e7: 5b pop %ebx
10b6e8: 5e pop %esi
10b6e9: 5f pop %edi
10b6ea: c9 leave
10b6eb: c3 ret
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
10b6ec: f6 40 10 30 testb $0x30,0x10(%eax)
10b6f0: 74 36 je 10b728 <rtems_semaphore_obtain+0x78>
_CORE_mutex_Seize(
10b6f2: 83 ec 0c sub $0xc,%esp
10b6f5: ff 75 e0 pushl -0x20(%ebp)
10b6f8: 57 push %edi
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
10b6f9: 83 e6 01 and $0x1,%esi
10b6fc: 83 f6 01 xor $0x1,%esi
10b6ff: 56 push %esi
10b700: 53 push %ebx
10b701: 83 c0 14 add $0x14,%eax
10b704: 50 push %eax
10b705: e8 6e 0b 00 00 call 10c278 <_CORE_mutex_Seize>
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
10b70a: 83 c4 14 add $0x14,%esp
_Thread_Executing->Wait.return_code );
10b70d: a1 38 7b 12 00 mov 0x127b38,%eax
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
10b712: ff 70 34 pushl 0x34(%eax)
10b715: e8 12 01 00 00 call 10b82c <_Semaphore_Translate_core_mutex_return_code>
10b71a: 83 c4 10 add $0x10,%esp
break;
}
return RTEMS_INVALID_ID;
}
10b71d: 8d 65 f4 lea -0xc(%ebp),%esp
10b720: 5b pop %ebx
10b721: 5e pop %esi
10b722: 5f pop %edi
10b723: c9 leave
10b724: c3 ret
10b725: 8d 76 00 lea 0x0(%esi),%esi
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
10b728: 8b 15 38 7b 12 00 mov 0x127b38,%edx
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10b72e: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
if ( the_semaphore->count != 0 ) {
10b735: 8b 48 5c mov 0x5c(%eax),%ecx
10b738: 85 c9 test %ecx,%ecx
10b73a: 75 2c jne 10b768 <rtems_semaphore_obtain+0xb8>
the_semaphore->count -= 1;
_ISR_Enable( *level_p );
return;
}
if ( !wait ) {
10b73c: 83 e6 01 and $0x1,%esi
10b73f: 74 33 je 10b774 <rtems_semaphore_obtain+0xc4>
_ISR_Enable( *level_p );
10b741: ff 75 e0 pushl -0x20(%ebp)
10b744: 9d popf
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
10b745: c7 42 34 01 00 00 00 movl $0x1,0x34(%edx)
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
10b74c: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code );
10b74f: a1 38 7b 12 00 mov 0x127b38,%eax
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
10b754: ff 70 34 pushl 0x34(%eax)
10b757: e8 e0 00 00 00 call 10b83c <_Semaphore_Translate_core_semaphore_return_code>
10b75c: 83 c4 10 add $0x10,%esp
break;
}
return RTEMS_INVALID_ID;
}
10b75f: 8d 65 f4 lea -0xc(%ebp),%esp
10b762: 5b pop %ebx
10b763: 5e pop %esi
10b764: 5f pop %edi
10b765: c9 leave
10b766: c3 ret
10b767: 90 nop
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
the_semaphore->count -= 1;
10b768: 49 dec %ecx
10b769: 89 48 5c mov %ecx,0x5c(%eax)
_ISR_Enable( *level_p );
10b76c: ff 75 e0 pushl -0x20(%ebp)
10b76f: 9d popf
10b770: eb da jmp 10b74c <rtems_semaphore_obtain+0x9c>
10b772: 66 90 xchg %ax,%ax
10b774: 8b 0d 50 75 12 00 mov 0x127550,%ecx
10b77a: 41 inc %ecx
10b77b: 89 0d 50 75 12 00 mov %ecx,0x127550
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;
10b781: c7 40 44 01 00 00 00 movl $0x1,0x44(%eax)
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
10b788: 83 c0 14 add $0x14,%eax
10b78b: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
10b78e: 89 5a 20 mov %ebx,0x20(%edx)
_ISR_Enable( *level_p );
10b791: ff 75 e0 pushl -0x20(%ebp)
10b794: 9d popf
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
10b795: 52 push %edx
10b796: 68 04 e1 10 00 push $0x10e104
10b79b: 57 push %edi
10b79c: 50 push %eax
10b79d: e8 36 26 00 00 call 10ddd8 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10b7a2: e8 55 21 00 00 call 10d8fc <_Thread_Enable_dispatch>
10b7a7: 83 c4 10 add $0x10,%esp
10b7aa: eb a0 jmp 10b74c <rtems_semaphore_obtain+0x9c>
0010b7ac <rtems_semaphore_release>:
#endif
rtems_status_code rtems_semaphore_release(
rtems_id id
)
{
10b7ac: 55 push %ebp
10b7ad: 89 e5 mov %esp,%ebp
10b7af: 53 push %ebx
10b7b0: 83 ec 18 sub $0x18,%esp
10b7b3: 8b 5d 08 mov 0x8(%ebp),%ebx
register Semaphore_Control *the_semaphore;
Objects_Locations location;
CORE_mutex_Status mutex_status;
CORE_semaphore_Status semaphore_status;
the_semaphore = _Semaphore_Get( id, &location );
10b7b6: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
_Objects_Get( &_Semaphore_Information, id, location );
10b7b9: 50 push %eax
10b7ba: 53 push %ebx
10b7bb: 68 a0 74 12 00 push $0x1274a0
10b7c0: e8 83 16 00 00 call 10ce48 <_Objects_Get>
switch ( location ) {
10b7c5: 83 c4 10 add $0x10,%esp
10b7c8: 8b 55 f4 mov -0xc(%ebp),%edx
10b7cb: 85 d2 test %edx,%edx
10b7cd: 74 0d je 10b7dc <rtems_semaphore_release+0x30>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b7cf: b8 04 00 00 00 mov $0x4,%eax
}
10b7d4: 8b 5d fc mov -0x4(%ebp),%ebx
10b7d7: c9 leave
10b7d8: c3 ret
10b7d9: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
10b7dc: f6 40 10 30 testb $0x30,0x10(%eax)
10b7e0: 75 26 jne 10b808 <rtems_semaphore_release+0x5c>
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
return _Semaphore_Translate_core_mutex_return_code( mutex_status );
} else {
semaphore_status = _CORE_semaphore_Surrender(
10b7e2: 52 push %edx
10b7e3: 6a 00 push $0x0
10b7e5: 53 push %ebx
10b7e6: 83 c0 14 add $0x14,%eax
10b7e9: 50 push %eax
10b7ea: e8 61 0c 00 00 call 10c450 <_CORE_semaphore_Surrender>
10b7ef: 89 c3 mov %eax,%ebx
&the_semaphore->Core_control.semaphore,
id,
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
10b7f1: e8 06 21 00 00 call 10d8fc <_Thread_Enable_dispatch>
return
10b7f6: 89 1c 24 mov %ebx,(%esp)
10b7f9: e8 3e 00 00 00 call 10b83c <_Semaphore_Translate_core_semaphore_return_code>
10b7fe: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b801: 8b 5d fc mov -0x4(%ebp),%ebx
10b804: c9 leave
10b805: c3 ret
10b806: 66 90 xchg %ax,%ax
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
mutex_status = _CORE_mutex_Surrender(
10b808: 51 push %ecx
10b809: 6a 00 push $0x0
10b80b: 53 push %ebx
10b80c: 83 c0 14 add $0x14,%eax
10b80f: 50 push %eax
10b810: e8 03 0b 00 00 call 10c318 <_CORE_mutex_Surrender>
10b815: 89 c3 mov %eax,%ebx
&the_semaphore->Core_control.mutex,
id,
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
10b817: e8 e0 20 00 00 call 10d8fc <_Thread_Enable_dispatch>
return _Semaphore_Translate_core_mutex_return_code( mutex_status );
10b81c: 89 1c 24 mov %ebx,(%esp)
10b81f: e8 08 00 00 00 call 10b82c <_Semaphore_Translate_core_mutex_return_code>
10b824: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10b827: 8b 5d fc mov -0x4(%ebp),%ebx
10b82a: c9 leave
10b82b: c3 ret
00117d4c <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
117d4c: 55 push %ebp
117d4d: 89 e5 mov %esp,%ebp
117d4f: 53 push %ebx
117d50: 83 ec 14 sub $0x14,%esp
117d53: 8b 5d 0c mov 0xc(%ebp),%ebx
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
117d56: 85 db test %ebx,%ebx
117d58: 75 0a jne 117d64 <rtems_signal_send+0x18>
return RTEMS_INVALID_NUMBER;
117d5a: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
117d5f: 8b 5d fc mov -0x4(%ebp),%ebx
117d62: c9 leave
117d63: c3 ret
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
117d64: 83 ec 08 sub $0x8,%esp
117d67: 8d 45 f4 lea -0xc(%ebp),%eax
117d6a: 50 push %eax
117d6b: ff 75 08 pushl 0x8(%ebp)
117d6e: e8 2d 40 00 00 call 11bda0 <_Thread_Get>
switch ( location ) {
117d73: 83 c4 10 add $0x10,%esp
117d76: 8b 55 f4 mov -0xc(%ebp),%edx
117d79: 85 d2 test %edx,%edx
117d7b: 74 0b je 117d88 <rtems_signal_send+0x3c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
117d7d: b8 04 00 00 00 mov $0x4,%eax
}
117d82: 8b 5d fc mov -0x4(%ebp),%ebx
117d85: c9 leave
117d86: c3 ret
117d87: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
117d88: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
117d8e: 8b 4a 0c mov 0xc(%edx),%ecx
117d91: 85 c9 test %ecx,%ecx
117d93: 74 3f je 117dd4 <rtems_signal_send+0x88>
if ( asr->is_enabled ) {
117d95: 80 7a 08 00 cmpb $0x0,0x8(%edx)
117d99: 74 25 je 117dc0 <rtems_signal_send+0x74>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
117d9b: 9c pushf
117d9c: fa cli
117d9d: 59 pop %ecx
*signal_set |= signals;
117d9e: 09 5a 14 or %ebx,0x14(%edx)
_ISR_Enable( _level );
117da1: 51 push %ecx
117da2: 9d popf
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
117da3: 8b 15 b4 27 14 00 mov 0x1427b4,%edx
117da9: 85 d2 test %edx,%edx
117dab: 74 1b je 117dc8 <rtems_signal_send+0x7c>
117dad: 3b 05 b8 27 14 00 cmp 0x1427b8,%eax
117db3: 75 13 jne 117dc8 <rtems_signal_send+0x7c><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
117db5: c6 05 c4 27 14 00 01 movb $0x1,0x1427c4
117dbc: eb 0a jmp 117dc8 <rtems_signal_send+0x7c>
117dbe: 66 90 xchg %ax,%ax
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
117dc0: 9c pushf
117dc1: fa cli
117dc2: 58 pop %eax
*signal_set |= signals;
117dc3: 09 5a 18 or %ebx,0x18(%edx)
_ISR_Enable( _level );
117dc6: 50 push %eax
117dc7: 9d popf
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
117dc8: e8 af 3f 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
117dcd: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
117dcf: 8b 5d fc mov -0x4(%ebp),%ebx
117dd2: c9 leave
117dd3: c3 ret
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
117dd4: e8 a3 3f 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
117dd9: b8 0b 00 00 00 mov $0xb,%eax
117dde: e9 7c ff ff ff jmp 117d5f <rtems_signal_send+0x13>
0010b84c <rtems_task_create>:
size_t stack_size,
rtems_mode initial_modes,
rtems_attribute attribute_set,
rtems_id *id
)
{
10b84c: 55 push %ebp
10b84d: 89 e5 mov %esp,%ebp
10b84f: 57 push %edi
10b850: 56 push %esi
10b851: 53 push %ebx
10b852: 83 ec 1c sub $0x1c,%esp
10b855: 8b 5d 08 mov 0x8(%ebp),%ebx
10b858: 8b 7d 0c mov 0xc(%ebp),%edi
10b85b: 8b 75 1c mov 0x1c(%ebp),%esi
Priority_Control core_priority;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
10b85e: 85 f6 test %esi,%esi
10b860: 0f 84 3e 01 00 00 je 10b9a4 <rtems_task_create+0x158>
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
10b866: 85 db test %ebx,%ebx
10b868: 0f 84 d2 00 00 00 je 10b940 <rtems_task_create+0xf4>
/*
* Validate the RTEMS API priority and convert it to the core priority range.
*/
if ( !_Attributes_Is_system_task( the_attribute_set ) ) {
10b86e: f7 45 18 00 80 00 00 testl $0x8000,0x18(%ebp)
10b875: 75 17 jne 10b88e <rtems_task_create+0x42>
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10b877: 85 ff test %edi,%edi
10b879: 0f 84 b1 00 00 00 je 10b930 <rtems_task_create+0xe4>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
10b87f: 0f b6 05 74 32 12 00 movzbl 0x123274,%eax
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10b886: 39 c7 cmp %eax,%edi
10b888: 0f 87 a2 00 00 00 ja 10b930 <rtems_task_create+0xe4>
*/
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
10b88e: 83 ec 0c sub $0xc,%esp
10b891: ff 35 3c 76 12 00 pushl 0x12763c
10b897: e8 c8 06 00 00 call 10bf64 <_API_Mutex_Lock>
* This function allocates a task control block from
* the inactive chain of free task control blocks.
*/
RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
10b89c: c7 04 24 e0 74 12 00 movl $0x1274e0,(%esp)
10b8a3: e8 e8 10 00 00 call 10c990 <_Objects_Allocate>
10b8a8: 89 c2 mov %eax,%edx
* the event of an error.
*/
the_thread = _RTEMS_tasks_Allocate();
if ( !the_thread ) {
10b8aa: 83 c4 10 add $0x10,%esp
10b8ad: 85 c0 test %eax,%eax
10b8af: 0f 84 cf 00 00 00 je 10b984 <rtems_task_create+0x138>
/*
* Initialize the core thread for this task.
*/
status = _Thread_Initialize(
10b8b5: 50 push %eax
10b8b6: 53 push %ebx
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
10b8b7: 8b 45 14 mov 0x14(%ebp),%eax
10b8ba: 83 e0 01 and $0x1,%eax
10b8bd: 50 push %eax
10b8be: 6a 00 push $0x0
10b8c0: 31 c0 xor %eax,%eax
10b8c2: f7 45 14 00 02 00 00 testl $0x200,0x14(%ebp)
10b8c9: 0f 95 c0 setne %al
10b8cc: 50 push %eax
10b8cd: 31 c0 xor %eax,%eax
10b8cf: f7 45 14 00 01 00 00 testl $0x100,0x14(%ebp)
10b8d6: 0f 94 c0 sete %al
10b8d9: 50 push %eax
10b8da: 57 push %edi
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_floating_point(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_FLOATING_POINT ) ? true : false;
10b8db: 8b 45 18 mov 0x18(%ebp),%eax
10b8de: 83 e0 01 and $0x1,%eax
10b8e1: 50 push %eax
10b8e2: ff 75 10 pushl 0x10(%ebp)
10b8e5: 6a 00 push $0x0
10b8e7: 52 push %edx
10b8e8: 68 e0 74 12 00 push $0x1274e0
10b8ed: 89 55 e4 mov %edx,-0x1c(%ebp)
10b8f0: e8 9f 20 00 00 call 10d994 <_Thread_Initialize>
NULL, /* no budget algorithm callout */
_Modes_Get_interrupt_level(initial_modes),
(Objects_Name) name
);
if ( !status ) {
10b8f5: 83 c4 30 add $0x30,%esp
10b8f8: 84 c0 test %al,%al
10b8fa: 8b 55 e4 mov -0x1c(%ebp),%edx
10b8fd: 74 51 je 10b950 <rtems_task_create+0x104>
_RTEMS_Unlock_allocator();
return RTEMS_UNSATISFIED;
}
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
10b8ff: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
* id - thread id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_task_create(
10b905: f7 45 14 00 04 00 00 testl $0x400,0x14(%ebp)
}
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
asr->is_enabled = _Modes_Is_asr_disabled(initial_modes) ? false : true;
10b90c: 0f 94 40 08 sete 0x8(%eax)
*id = the_thread->Object.id;
10b910: 8b 42 08 mov 0x8(%edx),%eax
10b913: 89 06 mov %eax,(%esi)
);
}
#endif
_RTEMS_Unlock_allocator();
10b915: 83 ec 0c sub $0xc,%esp
10b918: ff 35 3c 76 12 00 pushl 0x12763c
10b91e: e8 89 06 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_SUCCESSFUL;
10b923: 83 c4 10 add $0x10,%esp
10b926: 31 c0 xor %eax,%eax
}
10b928: 8d 65 f4 lea -0xc(%ebp),%esp
10b92b: 5b pop %ebx
10b92c: 5e pop %esi
10b92d: 5f pop %edi
10b92e: c9 leave
10b92f: c3 ret
* Validate the RTEMS API priority and convert it to the core priority range.
*/
if ( !_Attributes_Is_system_task( the_attribute_set ) ) {
if ( !_RTEMS_tasks_Priority_is_valid( initial_priority ) )
return RTEMS_INVALID_PRIORITY;
10b930: b8 13 00 00 00 mov $0x13,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b935: 8d 65 f4 lea -0xc(%ebp),%esp
10b938: 5b pop %ebx
10b939: 5e pop %esi
10b93a: 5f pop %edi
10b93b: c9 leave
10b93c: c3 ret
10b93d: 8d 76 00 lea 0x0(%esi),%esi
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10b940: b8 03 00 00 00 mov $0x3,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b945: 8d 65 f4 lea -0xc(%ebp),%esp
10b948: 5b pop %ebx
10b949: 5e pop %esi
10b94a: 5f pop %edi
10b94b: c9 leave
10b94c: c3 ret
10b94d: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _RTEMS_tasks_Free (
Thread_Control *the_task
)
{
_Objects_Free(
10b950: 83 ec 0c sub $0xc,%esp
10b953: ff 72 08 pushl 0x8(%edx)
10b956: e8 1d 14 00 00 call 10cd78 <_Objects_Get_information_id>
10b95b: 5a pop %edx
10b95c: 59 pop %ecx
10b95d: 8b 55 e4 mov -0x1c(%ebp),%edx
10b960: 52 push %edx
10b961: 50 push %eax
10b962: e8 a1 13 00 00 call 10cd08 <_Objects_Free>
#if defined(RTEMS_MULTIPROCESSING)
if ( is_global )
_Objects_MP_Free_global_object( the_global_object );
#endif
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
10b967: 58 pop %eax
10b968: ff 35 3c 76 12 00 pushl 0x12763c
10b96e: e8 39 06 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_UNSATISFIED;
10b973: 83 c4 10 add $0x10,%esp
10b976: b8 0d 00 00 00 mov $0xd,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b97b: 8d 65 f4 lea -0xc(%ebp),%esp
10b97e: 5b pop %ebx
10b97f: 5e pop %esi
10b980: 5f pop %edi
10b981: c9 leave
10b982: c3 ret
10b983: 90 nop
*/
the_thread = _RTEMS_tasks_Allocate();
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
10b984: 83 ec 0c sub $0xc,%esp
10b987: ff 35 3c 76 12 00 pushl 0x12763c
10b98d: e8 1a 06 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_TOO_MANY;
10b992: 83 c4 10 add $0x10,%esp
10b995: b8 05 00 00 00 mov $0x5,%eax
}
#endif
_RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
10b99a: 8d 65 f4 lea -0xc(%ebp),%esp
10b99d: 5b pop %ebx
10b99e: 5e pop %esi
10b99f: 5f pop %edi
10b9a0: c9 leave
10b9a1: c3 ret
10b9a2: 66 90 xchg %ax,%ax
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10b9a4: b8 09 00 00 00 mov $0x9,%eax
10b9a9: eb 8a jmp 10b935 <rtems_task_create+0xe9>
0010b9ac <rtems_task_delete>:
*/
rtems_status_code rtems_task_delete(
rtems_id id
)
{
10b9ac: 55 push %ebp
10b9ad: 89 e5 mov %esp,%ebp
10b9af: 53 push %ebx
10b9b0: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
Objects_Information *the_information;
_RTEMS_Lock_allocator();
10b9b3: ff 35 3c 76 12 00 pushl 0x12763c
10b9b9: e8 a6 05 00 00 call 10bf64 <_API_Mutex_Lock>
the_thread = _Thread_Get( id, &location );
10b9be: 5a pop %edx
10b9bf: 59 pop %ecx
10b9c0: 8d 45 f4 lea -0xc(%ebp),%eax
10b9c3: 50 push %eax
10b9c4: ff 75 08 pushl 0x8(%ebp)
10b9c7: e8 54 1f 00 00 call 10d920 <_Thread_Get>
10b9cc: 89 c3 mov %eax,%ebx
switch ( location ) {
10b9ce: 83 c4 10 add $0x10,%esp
10b9d1: 8b 45 f4 mov -0xc(%ebp),%eax
10b9d4: 85 c0 test %eax,%eax
10b9d6: 75 44 jne 10ba1c <rtems_task_delete+0x70>
case OBJECTS_LOCAL:
the_information = _Objects_Get_information_id( the_thread->Object.id );
10b9d8: 83 ec 0c sub $0xc,%esp
10b9db: ff 73 08 pushl 0x8(%ebx)
10b9de: e8 95 13 00 00 call 10cd78 <_Objects_Get_information_id>
0 /* Not used */
);
}
#endif
_Thread_Close( the_information, the_thread );
10b9e3: 5a pop %edx
10b9e4: 59 pop %ecx
10b9e5: 53 push %ebx
10b9e6: 50 push %eax
10b9e7: e8 d0 1b 00 00 call 10d5bc <_Thread_Close>
10b9ec: 58 pop %eax
10b9ed: ff 73 08 pushl 0x8(%ebx)
10b9f0: e8 83 13 00 00 call 10cd78 <_Objects_Get_information_id>
10b9f5: 5a pop %edx
10b9f6: 59 pop %ecx
10b9f7: 53 push %ebx
10b9f8: 50 push %eax
10b9f9: e8 0a 13 00 00 call 10cd08 <_Objects_Free>
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
10b9fe: 58 pop %eax
10b9ff: ff 35 3c 76 12 00 pushl 0x12763c
10ba05: e8 a2 05 00 00 call 10bfac <_API_Mutex_Unlock>
_Thread_Enable_dispatch();
10ba0a: e8 ed 1e 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ba0f: 83 c4 10 add $0x10,%esp
10ba12: 31 c0 xor %eax,%eax
break;
}
_RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
}
10ba14: 8b 5d fc mov -0x4(%ebp),%ebx
10ba17: c9 leave
10ba18: c3 ret
10ba19: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
_RTEMS_Unlock_allocator();
10ba1c: 83 ec 0c sub $0xc,%esp
10ba1f: ff 35 3c 76 12 00 pushl 0x12763c
10ba25: e8 82 05 00 00 call 10bfac <_API_Mutex_Unlock>
return RTEMS_INVALID_ID;
10ba2a: 83 c4 10 add $0x10,%esp
10ba2d: b8 04 00 00 00 mov $0x4,%eax
}
10ba32: 8b 5d fc mov -0x4(%ebp),%ebx
10ba35: c9 leave
10ba36: c3 ret
0010d4d0 <rtems_task_get_note>:
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
10d4d0: 55 push %ebp
10d4d1: 89 e5 mov %esp,%ebp
10d4d3: 56 push %esi
10d4d4: 53 push %ebx
10d4d5: 83 ec 10 sub $0x10,%esp
10d4d8: 8b 45 08 mov 0x8(%ebp),%eax
10d4db: 8b 75 0c mov 0xc(%ebp),%esi
10d4de: 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() )
10d4e1: 80 3d e4 61 12 00 00 cmpb $0x0,0x1261e4
10d4e8: 74 6e je 10d558 <rtems_task_get_note+0x88>
return RTEMS_NOT_CONFIGURED;
if ( !note )
10d4ea: 85 db test %ebx,%ebx
10d4ec: 74 7e je 10d56c <rtems_task_get_note+0x9c><== NEVER TAKEN
/*
* 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 )
10d4ee: 83 fe 0f cmp $0xf,%esi
10d4f1: 77 3d ja 10d530 <rtems_task_get_note+0x60><== NEVER TAKEN
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d4f3: 85 c0 test %eax,%eax
10d4f5: 74 45 je 10d53c <rtems_task_get_note+0x6c>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
10d4f7: 8b 15 f8 ad 12 00 mov 0x12adf8,%edx
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d4fd: 3b 42 08 cmp 0x8(%edx),%eax
10d500: 74 40 je 10d542 <rtems_task_get_note+0x72>
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
10d502: 83 ec 08 sub $0x8,%esp
10d505: 8d 55 f4 lea -0xc(%ebp),%edx
10d508: 52 push %edx
10d509: 50 push %eax
10d50a: e8 45 22 00 00 call 10f754 <_Thread_Get>
switch ( location ) {
10d50f: 83 c4 10 add $0x10,%esp
10d512: 8b 55 f4 mov -0xc(%ebp),%edx
10d515: 85 d2 test %edx,%edx
10d517: 75 4b jne 10d564 <rtems_task_get_note+0x94>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10d519: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
10d51f: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10d523: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
10d525: e8 06 22 00 00 call 10f730 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d52a: 31 c0 xor %eax,%eax
10d52c: eb 07 jmp 10d535 <rtems_task_get_note+0x65>
10d52e: 66 90 xchg %ax,%ax
* 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;
10d530: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d535: 8d 65 f8 lea -0x8(%ebp),%esp
10d538: 5b pop %ebx
10d539: 5e pop %esi
10d53a: c9 leave
10d53b: c3 ret
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d53c: 8b 15 f8 ad 12 00 mov 0x12adf8,%edx
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10d542: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
10d548: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10d54c: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
10d54e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d550: 8d 65 f8 lea -0x8(%ebp),%esp
10d553: 5b pop %ebx
10d554: 5e pop %esi
10d555: c9 leave
10d556: c3 ret
10d557: 90 nop
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
10d558: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d55d: 8d 65 f8 lea -0x8(%ebp),%esp
10d560: 5b pop %ebx
10d561: 5e pop %esi
10d562: c9 leave
10d563: c3 ret
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d564: b8 04 00 00 00 mov $0x4,%eax
10d569: eb ca jmp 10d535 <rtems_task_get_note+0x65>
10d56b: 90 nop
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
if ( !note )
return RTEMS_INVALID_ADDRESS;
10d56c: b8 09 00 00 00 mov $0x9,%eax
10d571: eb c2 jmp 10d535 <rtems_task_get_note+0x65>
00118130 <rtems_task_is_suspended>:
*/
rtems_status_code rtems_task_is_suspended(
rtems_id id
)
{
118130: 55 push %ebp
118131: 89 e5 mov %esp,%ebp
118133: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
118136: 8d 45 f4 lea -0xc(%ebp),%eax
118139: 50 push %eax
11813a: ff 75 08 pushl 0x8(%ebp)
11813d: e8 5e 3c 00 00 call 11bda0 <_Thread_Get>
switch ( location ) {
118142: 83 c4 10 add $0x10,%esp
118145: 8b 55 f4 mov -0xc(%ebp),%edx
118148: 85 d2 test %edx,%edx
11814a: 74 08 je 118154 <rtems_task_is_suspended+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11814c: b8 04 00 00 00 mov $0x4,%eax
}
118151: c9 leave
118152: c3 ret
118153: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
118154: f6 40 10 02 testb $0x2,0x10(%eax)
118158: 74 0e je 118168 <rtems_task_is_suspended+0x38><== NEVER TAKEN
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
11815a: e8 1d 3c 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_ALREADY_SUSPENDED;
11815f: b8 0f 00 00 00 mov $0xf,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118164: c9 leave
118165: c3 ret
118166: 66 90 xchg %ax,%ax
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Enable_dispatch();
118168: e8 0f 3c 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11816d: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11816f: c9 leave
118170: c3 ret
00112eb4 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
112eb4: 55 push %ebp
112eb5: 89 e5 mov %esp,%ebp
112eb7: 57 push %edi
112eb8: 56 push %esi
112eb9: 53 push %ebx
112eba: 83 ec 1c sub $0x1c,%esp
112ebd: 8b 4d 10 mov 0x10(%ebp),%ecx
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
112ec0: 85 c9 test %ecx,%ecx
112ec2: 0f 84 40 01 00 00 je 113008 <rtems_task_mode+0x154>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
112ec8: 8b 1d 38 7b 12 00 mov 0x127b38,%ebx
api = executing->API_Extensions[ THREAD_API_RTEMS ];
112ece: 8b bb e8 00 00 00 mov 0xe8(%ebx),%edi
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
112ed4: 80 7b 74 01 cmpb $0x1,0x74(%ebx)
112ed8: 19 f6 sbb %esi,%esi
112eda: 81 e6 00 01 00 00 and $0x100,%esi
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
112ee0: 8b 53 7c mov 0x7c(%ebx),%edx
112ee3: 85 d2 test %edx,%edx
112ee5: 0f 85 f1 00 00 00 jne 112fdc <rtems_task_mode+0x128>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
112eeb: 80 7f 08 01 cmpb $0x1,0x8(%edi)
112eef: 19 d2 sbb %edx,%edx
112ef1: 81 e2 00 04 00 00 and $0x400,%edx
old_mode |= _ISR_Get_level();
112ef7: 89 55 e4 mov %edx,-0x1c(%ebp)
112efa: 89 4d e0 mov %ecx,-0x20(%ebp)
112efd: e8 5a be ff ff call 10ed5c <_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;
112f02: 8b 55 e4 mov -0x1c(%ebp),%edx
112f05: 09 d0 or %edx,%eax
old_mode |= _ISR_Get_level();
112f07: 09 f0 or %esi,%eax
112f09: 8b 4d e0 mov -0x20(%ebp),%ecx
112f0c: 89 01 mov %eax,(%ecx)
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
112f0e: f7 45 0c 00 01 00 00 testl $0x100,0xc(%ebp)
112f15: 74 0b je 112f22 <rtems_task_mode+0x6e>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
112f17: f7 45 08 00 01 00 00 testl $0x100,0x8(%ebp)
112f1e: 0f 94 43 74 sete 0x74(%ebx)
if ( mask & RTEMS_TIMESLICE_MASK ) {
112f22: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
112f29: 74 1c je 112f47 <rtems_task_mode+0x93>
if ( _Modes_Is_timeslice(mode_set) ) {
112f2b: f7 45 08 00 02 00 00 testl $0x200,0x8(%ebp)
112f32: 0f 84 b8 00 00 00 je 112ff0 <rtems_task_mode+0x13c>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
112f38: c7 43 7c 01 00 00 00 movl $0x1,0x7c(%ebx)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
112f3f: a1 20 75 12 00 mov 0x127520,%eax
112f44: 89 43 78 mov %eax,0x78(%ebx)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
112f47: f6 45 0c 01 testb $0x1,0xc(%ebp)
112f4b: 74 0b je 112f58 <rtems_task_mode+0xa4>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
112f4d: f6 45 08 01 testb $0x1,0x8(%ebp)
112f51: 0f 84 91 00 00 00 je 112fe8 <rtems_task_mode+0x134>
112f57: fa cli
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
112f58: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
112f5f: 74 3f je 112fa0 <rtems_task_mode+0xec>
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
112f61: f7 45 08 00 04 00 00 testl $0x400,0x8(%ebp)
112f68: 0f 94 c0 sete %al
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
112f6b: 38 47 08 cmp %al,0x8(%edi)
112f6e: 74 30 je 112fa0 <rtems_task_mode+0xec>
asr->is_enabled = is_asr_enabled;
112f70: 88 47 08 mov %al,0x8(%edi)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
112f73: 9c pushf
112f74: fa cli
112f75: 58 pop %eax
_signals = information->signals_pending;
112f76: 8b 57 18 mov 0x18(%edi),%edx
information->signals_pending = information->signals_posted;
112f79: 8b 4f 14 mov 0x14(%edi),%ecx
112f7c: 89 4f 18 mov %ecx,0x18(%edi)
information->signals_posted = _signals;
112f7f: 89 57 14 mov %edx,0x14(%edi)
_ISR_Enable( _level );
112f82: 50 push %eax
112f83: 9d popf
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
112f84: 8b 47 14 mov 0x14(%edi),%eax
112f87: 85 c0 test %eax,%eax
112f89: 0f 95 c0 setne %al
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
112f8c: 83 3d 20 77 12 00 03 cmpl $0x3,0x127720
112f93: 74 16 je 112fab <rtems_task_mode+0xf7> <== ALWAYS TAKEN
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
112f95: 31 c0 xor %eax,%eax
}
112f97: 83 c4 1c add $0x1c,%esp
112f9a: 5b pop %ebx
112f9b: 5e pop %esi
112f9c: 5f pop %edi
112f9d: c9 leave
112f9e: c3 ret
112f9f: 90 nop
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
112fa0: 31 c0 xor %eax,%eax
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
112fa2: 83 3d 20 77 12 00 03 cmpl $0x3,0x127720
112fa9: 75 ea jne 112f95 <rtems_task_mode+0xe1> <== NEVER TAKEN
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
112fab: 8b 15 38 7b 12 00 mov 0x127b38,%edx
if ( are_signals_pending ||
112fb1: 84 c0 test %al,%al
112fb3: 75 0e jne 112fc3 <rtems_task_mode+0x10f>
112fb5: 3b 15 3c 7b 12 00 cmp 0x127b3c,%edx
112fbb: 74 d8 je 112f95 <rtems_task_mode+0xe1>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
112fbd: 80 7a 74 00 cmpb $0x0,0x74(%edx)
112fc1: 74 d2 je 112f95 <rtems_task_mode+0xe1> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
112fc3: c6 05 44 7b 12 00 01 movb $0x1,0x127b44
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
112fca: e8 b5 a7 ff ff call 10d784 <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
112fcf: 31 c0 xor %eax,%eax
}
112fd1: 83 c4 1c add $0x1c,%esp
112fd4: 5b pop %ebx
112fd5: 5e pop %esi
112fd6: 5f pop %edi
112fd7: c9 leave
112fd8: c3 ret
112fd9: 8d 76 00 lea 0x0(%esi),%esi
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
112fdc: 81 ce 00 02 00 00 or $0x200,%esi
112fe2: e9 04 ff ff ff jmp 112eeb <rtems_task_mode+0x37>
112fe7: 90 nop
112fe8: fb sti
112fe9: e9 6a ff ff ff jmp 112f58 <rtems_task_mode+0xa4>
112fee: 66 90 xchg %ax,%ax
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
112ff0: c7 43 7c 00 00 00 00 movl $0x0,0x7c(%ebx)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
112ff7: f6 45 0c 01 testb $0x1,0xc(%ebp)
112ffb: 0f 84 57 ff ff ff je 112f58 <rtems_task_mode+0xa4>
113001: e9 47 ff ff ff jmp 112f4d <rtems_task_mode+0x99>
113006: 66 90 xchg %ax,%ax
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
113008: b8 09 00 00 00 mov $0x9,%eax
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
11300d: 83 c4 1c add $0x1c,%esp
113010: 5b pop %ebx
113011: 5e pop %esi
113012: 5f pop %edi
113013: c9 leave
113014: c3 ret
0010ecb8 <rtems_task_resume>:
*/
rtems_status_code rtems_task_resume(
rtems_id id
)
{
10ecb8: 55 push %ebp
10ecb9: 89 e5 mov %esp,%ebp
10ecbb: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10ecbe: 8d 45 f4 lea -0xc(%ebp),%eax
10ecc1: 50 push %eax
10ecc2: ff 75 08 pushl 0x8(%ebp)
10ecc5: e8 6a 1f 00 00 call 110c34 <_Thread_Get>
switch ( location ) {
10ecca: 83 c4 10 add $0x10,%esp
10eccd: 8b 55 f4 mov -0xc(%ebp),%edx
10ecd0: 85 d2 test %edx,%edx
10ecd2: 74 08 je 10ecdc <rtems_task_resume+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10ecd4: b8 04 00 00 00 mov $0x4,%eax
}
10ecd9: c9 leave
10ecda: c3 ret
10ecdb: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
10ecdc: f6 40 10 02 testb $0x2,0x10(%eax)
10ece0: 75 0e jne 10ecf0 <rtems_task_resume+0x38>
_Thread_Resume( the_thread, true );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
10ece2: e8 29 1f 00 00 call 110c10 <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
10ece7: b8 0e 00 00 00 mov $0xe,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ecec: c9 leave
10eced: c3 ret
10ecee: 66 90 xchg %ax,%ax
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
_Thread_Resume( the_thread, true );
10ecf0: 83 ec 08 sub $0x8,%esp
10ecf3: 6a 01 push $0x1
10ecf5: 50 push %eax
10ecf6: e8 55 27 00 00 call 111450 <_Thread_Resume>
_Thread_Enable_dispatch();
10ecfb: e8 10 1f 00 00 call 110c10 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ed00: 83 c4 10 add $0x10,%esp
10ed03: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ed05: c9 leave
10ed06: c3 ret
0010d648 <rtems_task_set_note>:
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
10d648: 55 push %ebp
10d649: 89 e5 mov %esp,%ebp
10d64b: 56 push %esi
10d64c: 53 push %ebx
10d64d: 83 ec 10 sub $0x10,%esp
10d650: 8b 45 08 mov 0x8(%ebp),%eax
10d653: 8b 5d 0c mov 0xc(%ebp),%ebx
10d656: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
10d659: 80 3d e4 61 12 00 00 cmpb $0x0,0x1261e4
10d660: 74 66 je 10d6c8 <rtems_task_set_note+0x80>
/*
* 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 )
10d662: 83 fb 0f cmp $0xf,%ebx
10d665: 77 39 ja 10d6a0 <rtems_task_set_note+0x58>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d667: 85 c0 test %eax,%eax
10d669: 74 41 je 10d6ac <rtems_task_set_note+0x64>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
10d66b: 8b 15 f8 ad 12 00 mov 0x12adf8,%edx
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d671: 3b 42 08 cmp 0x8(%edx),%eax
10d674: 74 3c je 10d6b2 <rtems_task_set_note+0x6a>
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
10d676: 83 ec 08 sub $0x8,%esp
10d679: 8d 55 f4 lea -0xc(%ebp),%edx
10d67c: 52 push %edx
10d67d: 50 push %eax
10d67e: e8 d1 20 00 00 call 10f754 <_Thread_Get>
switch ( location ) {
10d683: 83 c4 10 add $0x10,%esp
10d686: 8b 55 f4 mov -0xc(%ebp),%edx
10d689: 85 d2 test %edx,%edx
10d68b: 75 47 jne 10d6d4 <rtems_task_set_note+0x8c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
10d68d: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
10d693: 89 74 98 20 mov %esi,0x20(%eax,%ebx,4)
_Thread_Enable_dispatch();
10d697: e8 94 20 00 00 call 10f730 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d69c: 31 c0 xor %eax,%eax
10d69e: eb 05 jmp 10d6a5 <rtems_task_set_note+0x5d>
* 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;
10d6a0: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6a5: 8d 65 f8 lea -0x8(%ebp),%esp
10d6a8: 5b pop %ebx
10d6a9: 5e pop %esi
10d6aa: c9 leave
10d6ab: c3 ret
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d6ac: 8b 15 f8 ad 12 00 mov 0x12adf8,%edx
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
10d6b2: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
10d6b8: 89 74 98 20 mov %esi,0x20(%eax,%ebx,4)
return RTEMS_SUCCESSFUL;
10d6bc: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6be: 8d 65 f8 lea -0x8(%ebp),%esp
10d6c1: 5b pop %ebx
10d6c2: 5e pop %esi
10d6c3: c9 leave
10d6c4: c3 ret
10d6c5: 8d 76 00 lea 0x0(%esi),%esi
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
10d6c8: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6cd: 8d 65 f8 lea -0x8(%ebp),%esp
10d6d0: 5b pop %ebx
10d6d1: 5e pop %esi
10d6d2: c9 leave
10d6d3: c3 ret
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d6d4: b8 04 00 00 00 mov $0x4,%eax
}
10d6d9: 8d 65 f8 lea -0x8(%ebp),%esp
10d6dc: 5b pop %ebx
10d6dd: 5e pop %esi
10d6de: c9 leave
10d6df: c3 ret
0010f98c <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
10f98c: 55 push %ebp
10f98d: 89 e5 mov %esp,%ebp
10f98f: 56 push %esi
10f990: 53 push %ebx
10f991: 83 ec 10 sub $0x10,%esp
10f994: 8b 5d 0c mov 0xc(%ebp),%ebx
10f997: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10f99a: 85 db test %ebx,%ebx
10f99c: 74 0b je 10f9a9 <rtems_task_set_priority+0x1d>
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 ) );
10f99e: 0f b6 05 34 72 12 00 movzbl 0x127234,%eax
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10f9a5: 39 c3 cmp %eax,%ebx
10f9a7: 77 5f ja 10fa08 <rtems_task_set_priority+0x7c>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
10f9a9: 85 f6 test %esi,%esi
10f9ab: 74 67 je 10fa14 <rtems_task_set_priority+0x88>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10f9ad: 83 ec 08 sub $0x8,%esp
10f9b0: 8d 45 f4 lea -0xc(%ebp),%eax
10f9b3: 50 push %eax
10f9b4: ff 75 08 pushl 0x8(%ebp)
10f9b7: e8 c8 20 00 00 call 111a84 <_Thread_Get>
switch ( location ) {
10f9bc: 83 c4 10 add $0x10,%esp
10f9bf: 8b 55 f4 mov -0xc(%ebp),%edx
10f9c2: 85 d2 test %edx,%edx
10f9c4: 75 36 jne 10f9fc <rtems_task_set_priority+0x70>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
10f9c6: 8b 50 14 mov 0x14(%eax),%edx
10f9c9: 89 16 mov %edx,(%esi)
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
10f9cb: 85 db test %ebx,%ebx
10f9cd: 74 1c je 10f9eb <rtems_task_set_priority+0x5f>
the_thread->real_priority = new_priority;
10f9cf: 89 58 18 mov %ebx,0x18(%eax)
if ( the_thread->resource_count == 0 ||
10f9d2: 8b 48 1c mov 0x1c(%eax),%ecx
10f9d5: 85 c9 test %ecx,%ecx
10f9d7: 74 05 je 10f9de <rtems_task_set_priority+0x52>
10f9d9: 3b 58 14 cmp 0x14(%eax),%ebx
10f9dc: 73 0d jae 10f9eb <rtems_task_set_priority+0x5f><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
10f9de: 52 push %edx
10f9df: 6a 00 push $0x0
10f9e1: 53 push %ebx
10f9e2: 50 push %eax
10f9e3: e8 c4 1b 00 00 call 1115ac <_Thread_Change_priority>
10f9e8: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10f9eb: e8 70 20 00 00 call 111a60 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10f9f0: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10f9f2: 8d 65 f8 lea -0x8(%ebp),%esp
10f9f5: 5b pop %ebx
10f9f6: 5e pop %esi
10f9f7: c9 leave
10f9f8: c3 ret
10f9f9: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10f9fc: b8 04 00 00 00 mov $0x4,%eax
}
10fa01: 8d 65 f8 lea -0x8(%ebp),%esp
10fa04: 5b pop %ebx
10fa05: 5e pop %esi
10fa06: c9 leave
10fa07: c3 ret
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
10fa08: b8 13 00 00 00 mov $0x13,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa0d: 8d 65 f8 lea -0x8(%ebp),%esp
10fa10: 5b pop %ebx
10fa11: 5e pop %esi
10fa12: c9 leave
10fa13: c3 ret
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
10fa14: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa19: 8d 65 f8 lea -0x8(%ebp),%esp
10fa1c: 5b pop %ebx
10fa1d: 5e pop %esi
10fa1e: c9 leave
10fa1f: c3 ret
0010baf4 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
10baf4: 55 push %ebp
10baf5: 89 e5 mov %esp,%ebp
10baf7: 53 push %ebx
10baf8: 83 ec 14 sub $0x14,%esp
10bafb: 8b 5d 0c mov 0xc(%ebp),%ebx
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
10bafe: 85 db test %ebx,%ebx
10bb00: 74 4e je 10bb50 <rtems_task_start+0x5c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10bb02: 83 ec 08 sub $0x8,%esp
10bb05: 8d 45 f4 lea -0xc(%ebp),%eax
10bb08: 50 push %eax
10bb09: ff 75 08 pushl 0x8(%ebp)
10bb0c: e8 0f 1e 00 00 call 10d920 <_Thread_Get>
switch ( location ) {
10bb11: 83 c4 10 add $0x10,%esp
10bb14: 8b 55 f4 mov -0xc(%ebp),%edx
10bb17: 85 d2 test %edx,%edx
10bb19: 75 29 jne 10bb44 <rtems_task_start+0x50>
case OBJECTS_LOCAL:
if ( _Thread_Start(
10bb1b: 83 ec 0c sub $0xc,%esp
10bb1e: ff 75 10 pushl 0x10(%ebp)
10bb21: 6a 00 push $0x0
10bb23: 53 push %ebx
10bb24: 6a 00 push $0x0
10bb26: 50 push %eax
10bb27: e8 e0 27 00 00 call 10e30c <_Thread_Start>
10bb2c: 83 c4 20 add $0x20,%esp
10bb2f: 84 c0 test %al,%al
10bb31: 75 29 jne 10bb5c <rtems_task_start+0x68>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
10bb33: e8 c4 1d 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
10bb38: b8 0e 00 00 00 mov $0xe,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10bb3d: 8b 5d fc mov -0x4(%ebp),%ebx
10bb40: c9 leave
10bb41: c3 ret
10bb42: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10bb44: b8 04 00 00 00 mov $0x4,%eax
}
10bb49: 8b 5d fc mov -0x4(%ebp),%ebx
10bb4c: c9 leave
10bb4d: c3 ret
10bb4e: 66 90 xchg %ax,%ax
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
10bb50: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10bb55: 8b 5d fc mov -0x4(%ebp),%ebx
10bb58: c9 leave
10bb59: c3 ret
10bb5a: 66 90 xchg %ax,%ax
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
10bb5c: e8 9b 1d 00 00 call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10bb61: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10bb63: 8b 5d fc mov -0x4(%ebp),%ebx
10bb66: c9 leave
10bb67: c3 ret
00110f40 <rtems_task_suspend>:
*/
rtems_status_code rtems_task_suspend(
rtems_id id
)
{
110f40: 55 push %ebp
110f41: 89 e5 mov %esp,%ebp
110f43: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
110f46: 8d 45 f4 lea -0xc(%ebp),%eax
110f49: 50 push %eax
110f4a: ff 75 08 pushl 0x8(%ebp)
110f4d: e8 ce c9 ff ff call 10d920 <_Thread_Get>
switch ( location ) {
110f52: 83 c4 10 add $0x10,%esp
110f55: 8b 55 f4 mov -0xc(%ebp),%edx
110f58: 85 d2 test %edx,%edx
110f5a: 74 08 je 110f64 <rtems_task_suspend+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
110f5c: b8 04 00 00 00 mov $0x4,%eax
}
110f61: c9 leave
110f62: c3 ret
110f63: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
110f64: f6 40 10 02 testb $0x2,0x10(%eax)
110f68: 74 0e je 110f78 <rtems_task_suspend+0x38>
_Thread_Suspend( the_thread );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
110f6a: e8 8d c9 ff ff call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_ALREADY_SUSPENDED;
110f6f: b8 0f 00 00 00 mov $0xf,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
110f74: c9 leave
110f75: c3 ret
110f76: 66 90 xchg %ax,%ax
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Suspend( the_thread );
110f78: 83 ec 0c sub $0xc,%esp
110f7b: 50 push %eax
110f7c: e8 ff 09 00 00 call 111980 <_Thread_Suspend>
_Thread_Enable_dispatch();
110f81: e8 76 c9 ff ff call 10d8fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
110f86: 83 c4 10 add $0x10,%esp
110f89: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
110f8b: c9 leave
110f8c: c3 ret
0010c650 <rtems_task_variable_add>:
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **ptr,
void (*dtor)(void *)
)
{
10c650: 55 push %ebp
10c651: 89 e5 mov %esp,%ebp
10c653: 57 push %edi
10c654: 56 push %esi
10c655: 53 push %ebx
10c656: 83 ec 1c sub $0x1c,%esp
10c659: 8b 5d 0c mov 0xc(%ebp),%ebx
10c65c: 8b 7d 10 mov 0x10(%ebp),%edi
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
10c65f: 85 db test %ebx,%ebx
10c661: 0f 84 9d 00 00 00 je 10c704 <rtems_task_variable_add+0xb4>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
10c667: 83 ec 08 sub $0x8,%esp
10c66a: 8d 45 e4 lea -0x1c(%ebp),%eax
10c66d: 50 push %eax
10c66e: ff 75 08 pushl 0x8(%ebp)
10c671: e8 ba 1f 00 00 call 10e630 <_Thread_Get>
10c676: 89 c6 mov %eax,%esi
switch (location) {
10c678: 83 c4 10 add $0x10,%esp
10c67b: 8b 45 e4 mov -0x1c(%ebp),%eax
10c67e: 85 c0 test %eax,%eax
10c680: 74 0e je 10c690 <rtems_task_variable_add+0x40>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c682: b8 04 00 00 00 mov $0x4,%eax
}
10c687: 8d 65 f4 lea -0xc(%ebp),%esp
10c68a: 5b pop %ebx
10c68b: 5e pop %esi
10c68c: 5f pop %edi
10c68d: c9 leave
10c68e: c3 ret
10c68f: 90 nop
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
10c690: 8b 86 f4 00 00 00 mov 0xf4(%esi),%eax
while (tvp) {
10c696: 85 c0 test %eax,%eax
10c698: 75 44 jne 10c6de <rtems_task_variable_add+0x8e>
10c69a: 66 90 xchg %ax,%ax
/*
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
10c69c: 83 ec 0c sub $0xc,%esp
10c69f: 6a 14 push $0x14
10c6a1: e8 ca 2f 00 00 call 10f670 <_Workspace_Allocate>
if (new == NULL) {
10c6a6: 83 c4 10 add $0x10,%esp
10c6a9: 85 c0 test %eax,%eax
10c6ab: 74 4b je 10c6f8 <rtems_task_variable_add+0xa8>
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
10c6ad: 8b 13 mov (%ebx),%edx
10c6af: 89 50 08 mov %edx,0x8(%eax)
new->ptr = ptr;
10c6b2: 89 58 04 mov %ebx,0x4(%eax)
new->dtor = dtor;
10c6b5: 89 78 10 mov %edi,0x10(%eax)
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
10c6b8: 8b 96 f4 00 00 00 mov 0xf4(%esi),%edx
10c6be: 89 10 mov %edx,(%eax)
the_thread->task_variables = new;
10c6c0: 89 86 f4 00 00 00 mov %eax,0xf4(%esi)
_Thread_Enable_dispatch();
10c6c6: e8 41 1f 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c6cb: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c6cd: 8d 65 f4 lea -0xc(%ebp),%esp
10c6d0: 5b pop %ebx
10c6d1: 5e pop %esi
10c6d2: 5f pop %edi
10c6d3: c9 leave
10c6d4: c3 ret
10c6d5: 8d 76 00 lea 0x0(%esi),%esi
if (tvp->ptr == ptr) {
tvp->dtor = dtor;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
10c6d8: 8b 00 mov (%eax),%eax
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
10c6da: 85 c0 test %eax,%eax
10c6dc: 74 be je 10c69c <rtems_task_variable_add+0x4c>
if (tvp->ptr == ptr) {
10c6de: 39 58 04 cmp %ebx,0x4(%eax)
10c6e1: 75 f5 jne 10c6d8 <rtems_task_variable_add+0x88>
tvp->dtor = dtor;
10c6e3: 89 78 10 mov %edi,0x10(%eax)
_Thread_Enable_dispatch();
10c6e6: e8 21 1f 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c6eb: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c6ed: 8d 65 f4 lea -0xc(%ebp),%esp
10c6f0: 5b pop %ebx
10c6f1: 5e pop %esi
10c6f2: 5f pop %edi
10c6f3: c9 leave
10c6f4: c3 ret
10c6f5: 8d 76 00 lea 0x0(%esi),%esi
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
10c6f8: e8 0f 1f 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_NO_MEMORY;
10c6fd: b8 1a 00 00 00 mov $0x1a,%eax
10c702: eb 83 jmp 10c687 <rtems_task_variable_add+0x37>
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
10c704: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c709: 8d 65 f4 lea -0xc(%ebp),%esp
10c70c: 5b pop %ebx
10c70d: 5e pop %esi
10c70e: 5f pop %edi
10c70f: c9 leave
10c710: c3 ret
0010c714 <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
10c714: 55 push %ebp
10c715: 89 e5 mov %esp,%ebp
10c717: 53 push %ebx
10c718: 83 ec 14 sub $0x14,%esp
10c71b: 8b 5d 0c mov 0xc(%ebp),%ebx
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
10c71e: 85 db test %ebx,%ebx
10c720: 74 76 je 10c798 <rtems_task_variable_delete+0x84>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
10c722: 83 ec 08 sub $0x8,%esp
10c725: 8d 45 f4 lea -0xc(%ebp),%eax
10c728: 50 push %eax
10c729: ff 75 08 pushl 0x8(%ebp)
10c72c: e8 ff 1e 00 00 call 10e630 <_Thread_Get>
switch (location) {
10c731: 83 c4 10 add $0x10,%esp
10c734: 8b 55 f4 mov -0xc(%ebp),%edx
10c737: 85 d2 test %edx,%edx
10c739: 74 0d je 10c748 <rtems_task_variable_delete+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c73b: b8 04 00 00 00 mov $0x4,%eax
}
10c740: 8b 5d fc mov -0x4(%ebp),%ebx
10c743: c9 leave
10c744: c3 ret
10c745: 8d 76 00 lea 0x0(%esi),%esi
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
10c748: 8b 88 f4 00 00 00 mov 0xf4(%eax),%ecx
while (tvp) {
10c74e: 85 c9 test %ecx,%ecx
10c750: 74 17 je 10c769 <rtems_task_variable_delete+0x55>
if (tvp->ptr == ptr) {
10c752: 39 59 04 cmp %ebx,0x4(%ecx)
10c755: 75 0c jne 10c763 <rtems_task_variable_delete+0x4f>
10c757: eb 49 jmp 10c7a2 <rtems_task_variable_delete+0x8e>
10c759: 8d 76 00 lea 0x0(%esi),%esi
10c75c: 39 5a 04 cmp %ebx,0x4(%edx)
10c75f: 74 17 je 10c778 <rtems_task_variable_delete+0x64>
10c761: 89 d1 mov %edx,%ecx
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
10c763: 8b 11 mov (%ecx),%edx
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
10c765: 85 d2 test %edx,%edx
10c767: 75 f3 jne 10c75c <rtems_task_variable_delete+0x48><== ALWAYS TAKEN
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
10c769: e8 9e 1e 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
10c76e: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c773: 8b 5d fc mov -0x4(%ebp),%ebx
10c776: c9 leave
10c777: c3 ret
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
10c778: 8b 1a mov (%edx),%ebx
10c77a: 89 19 mov %ebx,(%ecx)
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
10c77c: 83 ec 08 sub $0x8,%esp
10c77f: 52 push %edx
10c780: 50 push %eax
10c781: e8 b2 00 00 00 call 10c838 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
10c786: e8 81 1e 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c78b: 83 c4 10 add $0x10,%esp
10c78e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c790: 8b 5d fc mov -0x4(%ebp),%ebx
10c793: c9 leave
10c794: c3 ret
10c795: 8d 76 00 lea 0x0(%esi),%esi
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
10c798: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c79d: 8b 5d fc mov -0x4(%ebp),%ebx
10c7a0: c9 leave
10c7a1: c3 ret
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
10c7a2: 8b 11 mov (%ecx),%edx
10c7a4: 89 90 f4 00 00 00 mov %edx,0xf4(%eax)
10c7aa: 89 ca mov %ecx,%edx
10c7ac: eb ce jmp 10c77c <rtems_task_variable_delete+0x68>
0010c7b0 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
10c7b0: 55 push %ebp
10c7b1: 89 e5 mov %esp,%ebp
10c7b3: 56 push %esi
10c7b4: 53 push %ebx
10c7b5: 83 ec 10 sub $0x10,%esp
10c7b8: 8b 5d 0c mov 0xc(%ebp),%ebx
10c7bb: 8b 75 10 mov 0x10(%ebp),%esi
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
10c7be: 85 db test %ebx,%ebx
10c7c0: 74 56 je 10c818 <rtems_task_variable_get+0x68>
return RTEMS_INVALID_ADDRESS;
if ( !result )
10c7c2: 85 f6 test %esi,%esi
10c7c4: 74 52 je 10c818 <rtems_task_variable_get+0x68>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
10c7c6: 83 ec 08 sub $0x8,%esp
10c7c9: 8d 45 f4 lea -0xc(%ebp),%eax
10c7cc: 50 push %eax
10c7cd: ff 75 08 pushl 0x8(%ebp)
10c7d0: e8 5b 1e 00 00 call 10e630 <_Thread_Get>
switch (location) {
10c7d5: 83 c4 10 add $0x10,%esp
10c7d8: 8b 55 f4 mov -0xc(%ebp),%edx
10c7db: 85 d2 test %edx,%edx
10c7dd: 75 2d jne 10c80c <rtems_task_variable_get+0x5c>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
10c7df: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
10c7e5: 85 c0 test %eax,%eax
10c7e7: 75 09 jne 10c7f2 <rtems_task_variable_get+0x42>
10c7e9: eb 39 jmp 10c824 <rtems_task_variable_get+0x74>
10c7eb: 90 nop
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
10c7ec: 8b 00 mov (%eax),%eax
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
10c7ee: 85 c0 test %eax,%eax
10c7f0: 74 32 je 10c824 <rtems_task_variable_get+0x74><== NEVER TAKEN
if (tvp->ptr == ptr) {
10c7f2: 39 58 04 cmp %ebx,0x4(%eax)
10c7f5: 75 f5 jne 10c7ec <rtems_task_variable_get+0x3c>
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
10c7f7: 8b 40 0c mov 0xc(%eax),%eax
10c7fa: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10c7fc: e8 0b 1e 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c801: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c803: 8d 65 f8 lea -0x8(%ebp),%esp
10c806: 5b pop %ebx
10c807: 5e pop %esi
10c808: c9 leave
10c809: c3 ret
10c80a: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c80c: b8 04 00 00 00 mov $0x4,%eax
}
10c811: 8d 65 f8 lea -0x8(%ebp),%esp
10c814: 5b pop %ebx
10c815: 5e pop %esi
10c816: c9 leave
10c817: c3 ret
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
if ( !result )
return RTEMS_INVALID_ADDRESS;
10c818: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c81d: 8d 65 f8 lea -0x8(%ebp),%esp
10c820: 5b pop %ebx
10c821: 5e pop %esi
10c822: c9 leave
10c823: c3 ret
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
10c824: e8 e3 1d 00 00 call 10e60c <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
10c829: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c82e: 8d 65 f8 lea -0x8(%ebp),%esp
10c831: 5b pop %ebx
10c832: 5e pop %esi
10c833: c9 leave
10c834: c3 ret
0010c9b8 <rtems_task_wake_when>:
*/
rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
10c9b8: 55 push %ebp
10c9b9: 89 e5 mov %esp,%ebp
10c9bb: 53 push %ebx
10c9bc: 83 ec 14 sub $0x14,%esp
10c9bf: 8b 5d 08 mov 0x8(%ebp),%ebx
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
10c9c2: 80 3d 84 a2 12 00 00 cmpb $0x0,0x12a284
10c9c9: 0f 84 a9 00 00 00 je 10ca78 <rtems_task_wake_when+0xc0>
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
10c9cf: 85 db test %ebx,%ebx
10c9d1: 0f 84 ad 00 00 00 je 10ca84 <rtems_task_wake_when+0xcc>
return RTEMS_INVALID_ADDRESS;
time_buffer->ticks = 0;
10c9d7: c7 43 18 00 00 00 00 movl $0x0,0x18(%ebx)
if ( !_TOD_Validate( time_buffer ) )
10c9de: 83 ec 0c sub $0xc,%esp
10c9e1: 53 push %ebx
10c9e2: e8 c5 f3 ff ff call 10bdac <_TOD_Validate>
10c9e7: 83 c4 10 add $0x10,%esp
10c9ea: 84 c0 test %al,%al
10c9ec: 75 0a jne 10c9f8 <rtems_task_wake_when+0x40>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
10c9ee: b8 14 00 00 00 mov $0x14,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c9f3: 8b 5d fc mov -0x4(%ebp),%ebx
10c9f6: c9 leave
10c9f7: c3 ret
time_buffer->ticks = 0;
if ( !_TOD_Validate( time_buffer ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
10c9f8: 83 ec 0c sub $0xc,%esp
10c9fb: 53 push %ebx
10c9fc: e8 1f f3 ff ff call 10bd20 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
10ca01: 83 c4 10 add $0x10,%esp
10ca04: 3b 05 44 a3 12 00 cmp 0x12a344,%eax
10ca0a: 76 e2 jbe 10c9ee <rtems_task_wake_when+0x36>
10ca0c: 8b 15 70 a2 12 00 mov 0x12a270,%edx
10ca12: 42 inc %edx
10ca13: 89 15 70 a2 12 00 mov %edx,0x12a270
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
10ca19: 83 ec 08 sub $0x8,%esp
10ca1c: 6a 10 push $0x10
10ca1e: ff 35 58 a8 12 00 pushl 0x12a858
10ca24: 89 45 f4 mov %eax,-0xc(%ebp)
10ca27: e8 70 26 00 00 call 10f09c <_Thread_Set_state>
_Watchdog_Initialize(
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
10ca2c: 8b 15 58 a8 12 00 mov 0x12a858,%edx
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
_Watchdog_Initialize(
10ca32: 8b 4a 08 mov 0x8(%edx),%ecx
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10ca35: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx)
the_watchdog->routine = routine;
10ca3c: c7 42 64 84 e6 10 00 movl $0x10e684,0x64(%edx)
the_watchdog->id = id;
10ca43: 89 4a 68 mov %ecx,0x68(%edx)
the_watchdog->user_data = user_data;
10ca46: c7 42 6c 00 00 00 00 movl $0x0,0x6c(%edx)
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_seconds(
10ca4d: 8b 45 f4 mov -0xc(%ebp),%eax
10ca50: 2b 05 44 a3 12 00 sub 0x12a344,%eax
10ca56: 89 42 54 mov %eax,0x54(%edx)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
10ca59: 58 pop %eax
10ca5a: 59 pop %ecx
10ca5b: 83 c2 48 add $0x48,%edx
10ca5e: 52 push %edx
10ca5f: 68 70 a3 12 00 push $0x12a370
10ca64: e8 4b 2c 00 00 call 10f6b4 <_Watchdog_Insert>
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
10ca69: e8 ca 1d 00 00 call 10e838 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ca6e: 83 c4 10 add $0x10,%esp
10ca71: 31 c0 xor %eax,%eax
10ca73: e9 7b ff ff ff jmp 10c9f3 <rtems_task_wake_when+0x3b>
)
{
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
10ca78: b8 0b 00 00 00 mov $0xb,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca7d: 8b 5d fc mov -0x4(%ebp),%ebx
10ca80: c9 leave
10ca81: c3 ret
10ca82: 66 90 xchg %ax,%ax
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
10ca84: b8 09 00 00 00 mov $0x9,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca89: 8b 5d fc mov -0x4(%ebp),%ebx
10ca8c: c9 leave
10ca8d: c3 ret
001186cc <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
1186cc: 55 push %ebp
1186cd: 89 e5 mov %esp,%ebp
1186cf: 83 ec 1c sub $0x1c,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
1186d2: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
1186d5: 50 push %eax
1186d6: ff 75 08 pushl 0x8(%ebp)
1186d9: 68 40 2c 14 00 push $0x142c40
1186de: e8 e5 2b 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
1186e3: 83 c4 10 add $0x10,%esp
1186e6: 8b 55 f4 mov -0xc(%ebp),%edx
1186e9: 85 d2 test %edx,%edx
1186eb: 74 07 je 1186f4 <rtems_timer_cancel+0x28>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1186ed: b8 04 00 00 00 mov $0x4,%eax
}
1186f2: c9 leave
1186f3: c3 ret
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
1186f4: 83 78 38 04 cmpl $0x4,0x38(%eax)
1186f8: 74 0f je 118709 <rtems_timer_cancel+0x3d><== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
1186fa: 83 ec 0c sub $0xc,%esp
1186fd: 83 c0 10 add $0x10,%eax
118700: 50 push %eax
118701: e8 46 48 00 00 call 11cf4c <_Watchdog_Remove>
118706: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
118709: e8 6e 36 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11870e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118710: c9 leave
118711: c3 ret
0010bfe8 <rtems_timer_create>:
rtems_status_code rtems_timer_create(
rtems_name name,
rtems_id *id
)
{
10bfe8: 55 push %ebp
10bfe9: 89 e5 mov %esp,%ebp
10bfeb: 57 push %edi
10bfec: 56 push %esi
10bfed: 53 push %ebx
10bfee: 83 ec 0c sub $0xc,%esp
10bff1: 8b 5d 08 mov 0x8(%ebp),%ebx
10bff4: 8b 75 0c mov 0xc(%ebp),%esi
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
10bff7: 85 db test %ebx,%ebx
10bff9: 74 6d je 10c068 <rtems_timer_create+0x80>
return RTEMS_INVALID_NAME;
if ( !id )
10bffb: 85 f6 test %esi,%esi
10bffd: 0f 84 89 00 00 00 je 10c08c <rtems_timer_create+0xa4>
10c003: a1 b0 8f 12 00 mov 0x128fb0,%eax
10c008: 40 inc %eax
10c009: a3 b0 8f 12 00 mov %eax,0x128fb0
* This function allocates a timer control block from
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
{
return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
10c00e: 83 ec 0c sub $0xc,%esp
10c011: 68 20 9a 12 00 push $0x129a20
10c016: e8 31 0f 00 00 call 10cf4c <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
10c01b: 83 c4 10 add $0x10,%esp
10c01e: 85 c0 test %eax,%eax
10c020: 74 56 je 10c078 <rtems_timer_create+0x90>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_timer->the_class = TIMER_DORMANT;
10c022: c7 40 38 04 00 00 00 movl $0x4,0x38(%eax)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c029: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10c030: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10c037: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10c03e: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c045: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c048: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c04b: 8b 0d 3c 9a 12 00 mov 0x129a3c,%ecx
10c051: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c054: 89 58 0c mov %ebx,0xc(%eax)
&_Timer_Information,
&the_timer->Object,
(Objects_Name) name
);
*id = the_timer->Object.id;
10c057: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10c059: e8 5a 1e 00 00 call 10deb8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c05e: 31 c0 xor %eax,%eax
}
10c060: 8d 65 f4 lea -0xc(%ebp),%esp
10c063: 5b pop %ebx
10c064: 5e pop %esi
10c065: 5f pop %edi
10c066: c9 leave
10c067: c3 ret
)
{
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10c068: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c06d: 8d 65 f4 lea -0xc(%ebp),%esp
10c070: 5b pop %ebx
10c071: 5e pop %esi
10c072: 5f pop %edi
10c073: c9 leave
10c074: c3 ret
10c075: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
_Thread_Enable_dispatch();
10c078: e8 3b 1e 00 00 call 10deb8 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10c07d: b8 05 00 00 00 mov $0x5,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c082: 8d 65 f4 lea -0xc(%ebp),%esp
10c085: 5b pop %ebx
10c086: 5e pop %esi
10c087: 5f pop %edi
10c088: c9 leave
10c089: c3 ret
10c08a: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10c08c: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c091: 8d 65 f4 lea -0xc(%ebp),%esp
10c094: 5b pop %ebx
10c095: 5e pop %esi
10c096: 5f pop %edi
10c097: c9 leave
10c098: c3 ret
001187c8 <rtems_timer_delete>:
*/
rtems_status_code rtems_timer_delete(
rtems_id id
)
{
1187c8: 55 push %ebp
1187c9: 89 e5 mov %esp,%ebp
1187cb: 53 push %ebx
1187cc: 83 ec 18 sub $0x18,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
1187cf: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
1187d2: 50 push %eax
1187d3: ff 75 08 pushl 0x8(%ebp)
1187d6: 68 40 2c 14 00 push $0x142c40
1187db: e8 e8 2a 00 00 call 11b2c8 <_Objects_Get>
1187e0: 89 c3 mov %eax,%ebx
switch ( location ) {
1187e2: 83 c4 10 add $0x10,%esp
1187e5: 8b 4d f4 mov -0xc(%ebp),%ecx
1187e8: 85 c9 test %ecx,%ecx
1187ea: 75 38 jne 118824 <rtems_timer_delete+0x5c>
case OBJECTS_LOCAL:
_Objects_Close( &_Timer_Information, &the_timer->Object );
1187ec: 83 ec 08 sub $0x8,%esp
1187ef: 50 push %eax
1187f0: 68 40 2c 14 00 push $0x142c40
1187f5: e8 56 26 00 00 call 11ae50 <_Objects_Close>
(void) _Watchdog_Remove( &the_timer->Ticker );
1187fa: 8d 43 10 lea 0x10(%ebx),%eax
1187fd: 89 04 24 mov %eax,(%esp)
118800: e8 47 47 00 00 call 11cf4c <_Watchdog_Remove>
*/
RTEMS_INLINE_ROUTINE void _Timer_Free (
Timer_Control *the_timer
)
{
_Objects_Free( &_Timer_Information, &the_timer->Object );
118805: 58 pop %eax
118806: 5a pop %edx
118807: 53 push %ebx
118808: 68 40 2c 14 00 push $0x142c40
11880d: e8 3a 29 00 00 call 11b14c <_Objects_Free>
_Timer_Free( the_timer );
_Thread_Enable_dispatch();
118812: e8 65 35 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118817: 83 c4 10 add $0x10,%esp
11881a: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11881c: 8b 5d fc mov -0x4(%ebp),%ebx
11881f: c9 leave
118820: c3 ret
118821: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118824: b8 04 00 00 00 mov $0x4,%eax
}
118829: 8b 5d fc mov -0x4(%ebp),%ebx
11882c: c9 leave
11882d: c3 ret
0010c09c <rtems_timer_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
10c09c: 55 push %ebp
10c09d: 89 e5 mov %esp,%ebp
10c09f: 57 push %edi
10c0a0: 56 push %esi
10c0a1: 53 push %ebx
10c0a2: 83 ec 2c sub $0x2c,%esp
10c0a5: 8b 5d 0c mov 0xc(%ebp),%ebx
10c0a8: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
10c0ab: 85 db test %ebx,%ebx
10c0ad: 0f 84 99 00 00 00 je 10c14c <rtems_timer_fire_after+0xb0>
return RTEMS_INVALID_NUMBER;
if ( !routine )
10c0b3: 85 f6 test %esi,%esi
10c0b5: 0f 84 b1 00 00 00 je 10c16c <rtems_timer_fire_after+0xd0>
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
10c0bb: 57 push %edi
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
10c0bc: 8d 45 e4 lea -0x1c(%ebp),%eax
10c0bf: 50 push %eax
10c0c0: ff 75 08 pushl 0x8(%ebp)
10c0c3: 68 20 9a 12 00 push $0x129a20
10c0c8: e8 37 13 00 00 call 10d404 <_Objects_Get>
10c0cd: 89 c7 mov %eax,%edi
switch ( location ) {
10c0cf: 83 c4 10 add $0x10,%esp
10c0d2: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c0d5: 85 c9 test %ecx,%ecx
10c0d7: 74 0f je 10c0e8 <rtems_timer_fire_after+0x4c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c0d9: b8 04 00 00 00 mov $0x4,%eax
}
10c0de: 8d 65 f4 lea -0xc(%ebp),%esp
10c0e1: 5b pop %ebx
10c0e2: 5e pop %esi
10c0e3: 5f pop %edi
10c0e4: c9 leave
10c0e5: c3 ret
10c0e6: 66 90 xchg %ax,%ax
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
10c0e8: 8d 50 10 lea 0x10(%eax),%edx
10c0eb: 83 ec 0c sub $0xc,%esp
10c0ee: 52 push %edx
10c0ef: 89 55 d4 mov %edx,-0x2c(%ebp)
10c0f2: e8 fd 2c 00 00 call 10edf4 <_Watchdog_Remove>
_ISR_Disable( level );
10c0f7: 9c pushf
10c0f8: fa cli
10c0f9: 58 pop %eax
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
10c0fa: 83 c4 10 add $0x10,%esp
10c0fd: 8b 57 18 mov 0x18(%edi),%edx
10c100: 85 d2 test %edx,%edx
10c102: 8b 55 d4 mov -0x2c(%ebp),%edx
10c105: 75 55 jne 10c15c <rtems_timer_fire_after+0xc0>
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL;
10c107: c7 47 38 00 00 00 00 movl $0x0,0x38(%edi)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10c10e: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
the_watchdog->routine = routine;
10c115: 89 77 2c mov %esi,0x2c(%edi)
the_watchdog->id = id;
10c118: 8b 4d 08 mov 0x8(%ebp),%ecx
10c11b: 89 4f 30 mov %ecx,0x30(%edi)
the_watchdog->user_data = user_data;
10c11e: 8b 4d 14 mov 0x14(%ebp),%ecx
10c121: 89 4f 34 mov %ecx,0x34(%edi)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_ISR_Enable( level );
10c124: 50 push %eax
10c125: 9d popf
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c126: 89 5f 1c mov %ebx,0x1c(%edi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c129: 83 ec 08 sub $0x8,%esp
10c12c: 52 push %edx
10c12d: 68 bc 90 12 00 push $0x1290bc
10c132: e8 85 2b 00 00 call 10ecbc <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
_Thread_Enable_dispatch();
10c137: e8 7c 1d 00 00 call 10deb8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c13c: 83 c4 10 add $0x10,%esp
10c13f: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c141: 8d 65 f4 lea -0xc(%ebp),%esp
10c144: 5b pop %ebx
10c145: 5e pop %esi
10c146: 5f pop %edi
10c147: c9 leave
10c148: c3 ret
10c149: 8d 76 00 lea 0x0(%esi),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
10c14c: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c151: 8d 65 f4 lea -0xc(%ebp),%esp
10c154: 5b pop %ebx
10c155: 5e pop %esi
10c156: 5f pop %edi
10c157: c9 leave
10c158: c3 ret
10c159: 8d 76 00 lea 0x0(%esi),%esi
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
10c15c: 50 push %eax
10c15d: 9d popf
_Thread_Enable_dispatch();
10c15e: e8 55 1d 00 00 call 10deb8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c163: 31 c0 xor %eax,%eax
10c165: e9 74 ff ff ff jmp 10c0de <rtems_timer_fire_after+0x42>
10c16a: 66 90 xchg %ax,%ax
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
10c16c: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c171: 8d 65 f4 lea -0xc(%ebp),%esp
10c174: 5b pop %ebx
10c175: 5e pop %esi
10c176: 5f pop %edi
10c177: c9 leave
10c178: c3 ret
00118910 <rtems_timer_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118910: 55 push %ebp
118911: 89 e5 mov %esp,%ebp
118913: 57 push %edi
118914: 56 push %esi
118915: 53 push %ebx
118916: 83 ec 2c sub $0x2c,%esp
118919: 8b 75 08 mov 0x8(%ebp),%esi
11891c: 8b 7d 0c mov 0xc(%ebp),%edi
11891f: 8b 5d 10 mov 0x10(%ebp),%ebx
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
118922: 80 3d e4 21 14 00 00 cmpb $0x0,0x1421e4
118929: 75 0d jne 118938 <rtems_timer_fire_when+0x28>
return RTEMS_NOT_DEFINED;
11892b: b8 0b 00 00 00 mov $0xb,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118930: 8d 65 f4 lea -0xc(%ebp),%esp
118933: 5b pop %ebx
118934: 5e pop %esi
118935: 5f pop %edi
118936: c9 leave
118937: c3 ret
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
118938: 83 ec 0c sub $0xc,%esp
11893b: 57 push %edi
11893c: e8 87 d4 ff ff call 115dc8 <_TOD_Validate>
118941: 83 c4 10 add $0x10,%esp
118944: 84 c0 test %al,%al
118946: 74 1e je 118966 <rtems_timer_fire_when+0x56>
return RTEMS_INVALID_CLOCK;
if ( !routine )
118948: 85 db test %ebx,%ebx
11894a: 0f 84 a4 00 00 00 je 1189f4 <rtems_timer_fire_when+0xe4>
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
118950: 83 ec 0c sub $0xc,%esp
118953: 57 push %edi
118954: e8 e3 d3 ff ff call 115d3c <_TOD_To_seconds>
118959: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
11895b: 83 c4 10 add $0x10,%esp
11895e: 3b 05 a4 22 14 00 cmp 0x1422a4,%eax
118964: 77 0e ja 118974 <rtems_timer_fire_when+0x64>
return RTEMS_INVALID_CLOCK;
118966: b8 14 00 00 00 mov $0x14,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11896b: 8d 65 f4 lea -0xc(%ebp),%esp
11896e: 5b pop %ebx
11896f: 5e pop %esi
118970: 5f pop %edi
118971: c9 leave
118972: c3 ret
118973: 90 nop
118974: 50 push %eax
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
118975: 8d 45 e4 lea -0x1c(%ebp),%eax
118978: 50 push %eax
118979: 56 push %esi
11897a: 68 40 2c 14 00 push $0x142c40
11897f: e8 44 29 00 00 call 11b2c8 <_Objects_Get>
switch ( location ) {
118984: 83 c4 10 add $0x10,%esp
118987: 8b 4d e4 mov -0x1c(%ebp),%ecx
11898a: 85 c9 test %ecx,%ecx
11898c: 75 5a jne 1189e8 <rtems_timer_fire_when+0xd8>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
11898e: 8d 48 10 lea 0x10(%eax),%ecx
118991: 83 ec 0c sub $0xc,%esp
118994: 51 push %ecx
118995: 89 45 d0 mov %eax,-0x30(%ebp)
118998: 89 4d d4 mov %ecx,-0x2c(%ebp)
11899b: e8 ac 45 00 00 call 11cf4c <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY;
1189a0: 8b 55 d0 mov -0x30(%ebp),%edx
1189a3: c7 42 38 02 00 00 00 movl $0x2,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1189aa: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
1189b1: 89 5a 2c mov %ebx,0x2c(%edx)
the_watchdog->id = id;
1189b4: 89 72 30 mov %esi,0x30(%edx)
the_watchdog->user_data = user_data;
1189b7: 8b 45 14 mov 0x14(%ebp),%eax
1189ba: 89 42 34 mov %eax,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
1189bd: 2b 3d a4 22 14 00 sub 0x1422a4,%edi
1189c3: 89 7a 1c mov %edi,0x1c(%edx)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
1189c6: 58 pop %eax
1189c7: 5a pop %edx
1189c8: 8b 4d d4 mov -0x2c(%ebp),%ecx
1189cb: 51 push %ecx
1189cc: 68 d0 22 14 00 push $0x1422d0
1189d1: e8 3e 44 00 00 call 11ce14 <_Watchdog_Insert>
&the_timer->Ticker,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
1189d6: e8 a1 33 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1189db: 83 c4 10 add $0x10,%esp
1189de: 31 c0 xor %eax,%eax
1189e0: e9 4b ff ff ff jmp 118930 <rtems_timer_fire_when+0x20>
1189e5: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1189e8: b8 04 00 00 00 mov $0x4,%eax
1189ed: e9 3e ff ff ff jmp 118930 <rtems_timer_fire_when+0x20>
1189f2: 66 90 xchg %ax,%ax
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
1189f4: b8 09 00 00 00 mov $0x9,%eax
1189f9: e9 32 ff ff ff jmp 118930 <rtems_timer_fire_when+0x20>
001190a8 <rtems_timer_initiate_server>:
rtems_status_code rtems_timer_initiate_server(
uint32_t priority,
uint32_t stack_size,
rtems_attribute attribute_set
)
{
1190a8: 55 push %ebp
1190a9: 89 e5 mov %esp,%ebp
1190ab: 56 push %esi
1190ac: 53 push %ebx
1190ad: 83 ec 10 sub $0x10,%esp
1190b0: 8b 45 08 mov 0x8(%ebp),%eax
1190b3: 85 c0 test %eax,%eax
1190b5: 74 41 je 1190f8 <rtems_timer_initiate_server+0x50>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
1190b7: 0f b6 15 b4 9a 13 00 movzbl 0x139ab4,%edx
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
1190be: 39 d0 cmp %edx,%eax
1190c0: 76 42 jbe 119104 <rtems_timer_initiate_server+0x5c>
* 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 )
1190c2: 40 inc %eax
1190c3: 75 33 jne 1190f8 <rtems_timer_initiate_server+0x50>
return RTEMS_INVALID_PRIORITY;
_priority = 0;
1190c5: 31 f6 xor %esi,%esi
1190c7: 8b 15 d0 21 14 00 mov 0x1421d0,%edx
1190cd: 42 inc %edx
1190ce: 89 15 d0 21 14 00 mov %edx,0x1421d0
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
1190d4: 8a 1d 00 db 13 00 mov 0x13db00,%bl
initialized = true;
1190da: c6 05 00 db 13 00 01 movb $0x1,0x13db00
_Thread_Enable_dispatch();
1190e1: e8 96 2c 00 00 call 11bd7c <_Thread_Enable_dispatch>
if ( tmpInitialized )
1190e6: 84 db test %bl,%bl
1190e8: 74 1e je 119108 <rtems_timer_initiate_server+0x60>
return RTEMS_INCORRECT_STATE;
1190ea: b8 0e 00 00 00 mov $0xe,%eax
initialized = false;
}
#endif
return status;
}
1190ef: 8d 65 f8 lea -0x8(%ebp),%esp
1190f2: 5b pop %ebx
1190f3: 5e pop %esi
1190f4: c9 leave
1190f5: c3 ret
1190f6: 66 90 xchg %ax,%ax
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
return RTEMS_INVALID_PRIORITY;
1190f8: b8 13 00 00 00 mov $0x13,%eax
initialized = false;
}
#endif
return status;
}
1190fd: 8d 65 f8 lea -0x8(%ebp),%esp
119100: 5b pop %ebx
119101: 5e pop %esi
119102: c9 leave
119103: c3 ret
119104: 89 c6 mov %eax,%esi
119106: eb bf jmp 1190c7 <rtems_timer_initiate_server+0x1f>
* 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(
119108: 83 ec 08 sub $0x8,%esp
11910b: 8d 45 f4 lea -0xc(%ebp),%eax
11910e: 50 push %eax
11910f: 8b 45 10 mov 0x10(%ebp),%eax
119112: 80 cc 80 or $0x80,%ah
119115: 50 push %eax
119116: 68 00 01 00 00 push $0x100
11911b: ff 75 0c pushl 0xc(%ebp)
11911e: 56 push %esi
11911f: 68 45 4d 49 54 push $0x54494d45
119124: e8 bb ec ff ff call 117de4 <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) {
119129: 83 c4 20 add $0x20,%esp
11912c: 85 c0 test %eax,%eax
11912e: 74 10 je 119140 <rtems_timer_initiate_server+0x98>
initialized = false;
119130: c6 05 00 db 13 00 00 movb $0x0,0x13db00
initialized = false;
}
#endif
return status;
}
119137: 8d 65 f8 lea -0x8(%ebp),%esp
11913a: 5b pop %ebx
11913b: 5e pop %esi
11913c: c9 leave
11913d: c3 ret
11913e: 66 90 xchg %ax,%ax
* 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)
119140: 8b 45 f4 mov -0xc(%ebp),%eax
*/
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return NULL;
#endif
return information->local_table[ index ];
119143: 0f b7 c8 movzwl %ax,%ecx
119146: 8b 15 7c 21 14 00 mov 0x14217c,%edx
/*
* 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(
11914c: 8b 14 8a mov (%edx,%ecx,4),%edx
11914f: 89 15 80 da 13 00 mov %edx,0x13da80
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
119155: c7 05 b0 da 13 00 b4 movl $0x13dab4,0x13dab0
11915c: da 13 00
head->previous = NULL;
11915f: c7 05 b4 da 13 00 00 movl $0x0,0x13dab4
119166: 00 00 00
tail->previous = head;
119169: c7 05 b8 da 13 00 b0 movl $0x13dab0,0x13dab8
119170: da 13 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
119173: c7 05 e8 da 13 00 ec movl $0x13daec,0x13dae8
11917a: da 13 00
head->previous = NULL;
11917d: c7 05 ec da 13 00 00 movl $0x0,0x13daec
119184: 00 00 00
tail->previous = head;
119187: c7 05 f0 da 13 00 e8 movl $0x13dae8,0x13daf0
11918e: da 13 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
119191: c7 05 90 da 13 00 00 movl $0x0,0x13da90
119198: 00 00 00
the_watchdog->routine = routine;
11919b: c7 05 a4 da 13 00 c8 movl $0x11bbc8,0x13daa4
1191a2: bb 11 00
the_watchdog->id = id;
1191a5: a3 a8 da 13 00 mov %eax,0x13daa8
the_watchdog->user_data = user_data;
1191aa: c7 05 ac da 13 00 00 movl $0x0,0x13daac
1191b1: 00 00 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1191b4: c7 05 c8 da 13 00 00 movl $0x0,0x13dac8
1191bb: 00 00 00
the_watchdog->routine = routine;
1191be: c7 05 dc da 13 00 c8 movl $0x11bbc8,0x13dadc
1191c5: bb 11 00
the_watchdog->id = id;
1191c8: a3 e0 da 13 00 mov %eax,0x13dae0
the_watchdog->user_data = user_data;
1191cd: c7 05 e4 da 13 00 00 movl $0x0,0x13dae4
1191d4: 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;
1191d7: c7 05 84 da 13 00 78 movl $0x118f78,0x13da84
1191de: 8f 11 00
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
1191e1: 8b 15 44 23 14 00 mov 0x142344,%edx
1191e7: 89 15 bc da 13 00 mov %edx,0x13dabc
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
1191ed: 8b 15 a4 22 14 00 mov 0x1422a4,%edx
1191f3: 89 15 f4 da 13 00 mov %edx,0x13daf4
ts->insert_chain = NULL;
1191f9: c7 05 f8 da 13 00 00 movl $0x0,0x13daf8
119200: 00 00 00
ts->active = false;
119203: c6 05 fc da 13 00 00 movb $0x0,0x13dafc
/*
* The default timer server is now available.
*/
_Timer_server = ts;
11920a: c7 05 80 2c 14 00 80 movl $0x13da80,0x142c80
119211: da 13 00
/*
* Start the timer server
*/
status = rtems_task_start(
119214: 53 push %ebx
119215: 68 80 da 13 00 push $0x13da80
11921a: 68 b0 8d 11 00 push $0x118db0
11921f: 50 push %eax
119220: e8 7f f2 ff ff call 1184a4 <rtems_task_start>
if (status) {
initialized = false;
}
#endif
return status;
119225: 83 c4 10 add $0x10,%esp
119228: e9 d0 fe ff ff jmp 1190fd <rtems_timer_initiate_server+0x55>
00118a88 <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
118a88: 55 push %ebp
118a89: 89 e5 mov %esp,%ebp
118a8b: 56 push %esi
118a8c: 53 push %ebx
118a8d: 83 ec 24 sub $0x24,%esp
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
118a90: 8d 45 f4 lea -0xc(%ebp),%eax
118a93: 50 push %eax
118a94: ff 75 08 pushl 0x8(%ebp)
118a97: 68 40 2c 14 00 push $0x142c40
118a9c: e8 27 28 00 00 call 11b2c8 <_Objects_Get>
118aa1: 89 c3 mov %eax,%ebx
switch ( location ) {
118aa3: 83 c4 10 add $0x10,%esp
118aa6: 8b 45 f4 mov -0xc(%ebp),%eax
118aa9: 85 c0 test %eax,%eax
118aab: 74 0f je 118abc <rtems_timer_reset+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118aad: b8 04 00 00 00 mov $0x4,%eax
}
118ab2: 8d 65 f8 lea -0x8(%ebp),%esp
118ab5: 5b pop %ebx
118ab6: 5e pop %esi
118ab7: c9 leave
118ab8: c3 ret
118ab9: 8d 76 00 lea 0x0(%esi),%esi
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
118abc: 8b 43 38 mov 0x38(%ebx),%eax
118abf: 85 c0 test %eax,%eax
118ac1: 74 1d je 118ae0 <rtems_timer_reset+0x58>
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118ac3: 48 dec %eax
118ac4: 74 3a je 118b00 <rtems_timer_reset+0x78>
/*
* Must be dormant or time of day timer (e.g. TIMER_DORMANT,
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
118ac6: b8 0b 00 00 00 mov $0xb,%eax
}
_Thread_Enable_dispatch();
118acb: 89 45 e4 mov %eax,-0x1c(%ebp)
118ace: e8 a9 32 00 00 call 11bd7c <_Thread_Enable_dispatch>
return status;
118ad3: 8b 45 e4 mov -0x1c(%ebp),%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118ad6: 8d 65 f8 lea -0x8(%ebp),%esp
118ad9: 5b pop %ebx
118ada: 5e pop %esi
118adb: c9 leave
118adc: c3 ret
118add: 8d 76 00 lea 0x0(%esi),%esi
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
118ae0: 83 c3 10 add $0x10,%ebx
118ae3: 83 ec 0c sub $0xc,%esp
118ae6: 53 push %ebx
118ae7: e8 60 44 00 00 call 11cf4c <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
118aec: 59 pop %ecx
118aed: 5e pop %esi
118aee: 53 push %ebx
118aef: 68 dc 22 14 00 push $0x1422dc
118af4: e8 1b 43 00 00 call 11ce14 <_Watchdog_Insert>
118af9: 83 c4 10 add $0x10,%esp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
118afc: 31 c0 xor %eax,%eax
118afe: eb cb jmp 118acb <rtems_timer_reset+0x43>
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
Timer_server_Control *timer_server = _Timer_server;
118b00: 8b 35 80 2c 14 00 mov 0x142c80,%esi
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
118b06: 83 ec 0c sub $0xc,%esp
118b09: 8d 43 10 lea 0x10(%ebx),%eax
118b0c: 50 push %eax
118b0d: e8 3a 44 00 00 call 11cf4c <_Watchdog_Remove>
(*timer_server->schedule_operation)( timer_server, the_timer );
118b12: 58 pop %eax
118b13: 5a pop %edx
118b14: 53 push %ebx
118b15: 56 push %esi
118b16: ff 56 04 call *0x4(%esi)
118b19: 83 c4 10 add $0x10,%esp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
118b1c: 31 c0 xor %eax,%eax
118b1e: eb ab jmp 118acb <rtems_timer_reset+0x43>
00118b20 <rtems_timer_server_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118b20: 55 push %ebp
118b21: 89 e5 mov %esp,%ebp
118b23: 57 push %edi
118b24: 56 push %esi
118b25: 53 push %ebx
118b26: 83 ec 2c sub $0x2c,%esp
118b29: 8b 7d 0c mov 0xc(%ebp),%edi
118b2c: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
118b2f: 8b 1d 80 2c 14 00 mov 0x142c80,%ebx
if ( !timer_server )
118b35: 85 db test %ebx,%ebx
118b37: 0f 84 9f 00 00 00 je 118bdc <rtems_timer_server_fire_after+0xbc>
return RTEMS_INCORRECT_STATE;
if ( !routine )
118b3d: 85 f6 test %esi,%esi
118b3f: 0f 84 a3 00 00 00 je 118be8 <rtems_timer_server_fire_after+0xc8>
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
118b45: 85 ff test %edi,%edi
118b47: 75 0f jne 118b58 <rtems_timer_server_fire_after+0x38>
return RTEMS_INVALID_NUMBER;
118b49: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118b4e: 8d 65 f4 lea -0xc(%ebp),%esp
118b51: 5b pop %ebx
118b52: 5e pop %esi
118b53: 5f pop %edi
118b54: c9 leave
118b55: c3 ret
118b56: 66 90 xchg %ax,%ax
118b58: 52 push %edx
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
118b59: 8d 45 e4 lea -0x1c(%ebp),%eax
118b5c: 50 push %eax
118b5d: ff 75 08 pushl 0x8(%ebp)
118b60: 68 40 2c 14 00 push $0x142c40
118b65: e8 5e 27 00 00 call 11b2c8 <_Objects_Get>
118b6a: 89 c2 mov %eax,%edx
switch ( location ) {
118b6c: 83 c4 10 add $0x10,%esp
118b6f: 8b 45 e4 mov -0x1c(%ebp),%eax
118b72: 85 c0 test %eax,%eax
118b74: 75 56 jne 118bcc <rtems_timer_server_fire_after+0xac>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118b76: 83 ec 0c sub $0xc,%esp
118b79: 8d 42 10 lea 0x10(%edx),%eax
118b7c: 50 push %eax
118b7d: 89 55 d4 mov %edx,-0x2c(%ebp)
118b80: e8 c7 43 00 00 call 11cf4c <_Watchdog_Remove>
_ISR_Disable( level );
118b85: 9c pushf
118b86: fa cli
118b87: 58 pop %eax
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
118b88: 83 c4 10 add $0x10,%esp
118b8b: 8b 55 d4 mov -0x2c(%ebp),%edx
118b8e: 8b 4a 18 mov 0x18(%edx),%ecx
118b91: 85 c9 test %ecx,%ecx
118b93: 75 5f jne 118bf4 <rtems_timer_server_fire_after+0xd4>
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL_ON_TASK;
118b95: c7 42 38 01 00 00 00 movl $0x1,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
118b9c: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
118ba3: 89 72 2c mov %esi,0x2c(%edx)
the_watchdog->id = id;
118ba6: 8b 4d 08 mov 0x8(%ebp),%ecx
118ba9: 89 4a 30 mov %ecx,0x30(%edx)
the_watchdog->user_data = user_data;
118bac: 8b 4d 14 mov 0x14(%ebp),%ecx
118baf: 89 4a 34 mov %ecx,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = ticks;
118bb2: 89 7a 1c mov %edi,0x1c(%edx)
_ISR_Enable( level );
118bb5: 50 push %eax
118bb6: 9d popf
(*timer_server->schedule_operation)( timer_server, the_timer );
118bb7: 83 ec 08 sub $0x8,%esp
118bba: 52 push %edx
118bbb: 53 push %ebx
118bbc: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
118bbf: e8 b8 31 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118bc4: 83 c4 10 add $0x10,%esp
118bc7: 31 c0 xor %eax,%eax
118bc9: eb 83 jmp 118b4e <rtems_timer_server_fire_after+0x2e>
118bcb: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118bcc: b8 04 00 00 00 mov $0x4,%eax
}
118bd1: 8d 65 f4 lea -0xc(%ebp),%esp
118bd4: 5b pop %ebx
118bd5: 5e pop %esi
118bd6: 5f pop %edi
118bd7: c9 leave
118bd8: c3 ret
118bd9: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
118bdc: b8 0e 00 00 00 mov $0xe,%eax
118be1: e9 68 ff ff ff jmp 118b4e <rtems_timer_server_fire_after+0x2e>
118be6: 66 90 xchg %ax,%ax
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118be8: b8 09 00 00 00 mov $0x9,%eax
118bed: e9 5c ff ff ff jmp 118b4e <rtems_timer_server_fire_after+0x2e>
118bf2: 66 90 xchg %ax,%ax
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
118bf4: 50 push %eax
118bf5: 9d popf
_Thread_Enable_dispatch();
118bf6: e8 81 31 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118bfb: 31 c0 xor %eax,%eax
118bfd: e9 4c ff ff ff jmp 118b4e <rtems_timer_server_fire_after+0x2e>
00118c04 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118c04: 55 push %ebp
118c05: 89 e5 mov %esp,%ebp
118c07: 57 push %edi
118c08: 56 push %esi
118c09: 53 push %ebx
118c0a: 83 ec 2c sub $0x2c,%esp
118c0d: 8b 7d 0c mov 0xc(%ebp),%edi
118c10: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
118c13: 8b 1d 80 2c 14 00 mov 0x142c80,%ebx
if ( !timer_server )
118c19: 85 db test %ebx,%ebx
118c1b: 0f 84 d7 00 00 00 je 118cf8 <rtems_timer_server_fire_when+0xf4>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
118c21: 80 3d e4 21 14 00 00 cmpb $0x0,0x1421e4
118c28: 0f 84 aa 00 00 00 je 118cd8 <rtems_timer_server_fire_when+0xd4><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
118c2e: 85 f6 test %esi,%esi
118c30: 0f 84 b2 00 00 00 je 118ce8 <rtems_timer_server_fire_when+0xe4>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
118c36: 83 ec 0c sub $0xc,%esp
118c39: 57 push %edi
118c3a: e8 89 d1 ff ff call 115dc8 <_TOD_Validate>
118c3f: 83 c4 10 add $0x10,%esp
118c42: 84 c0 test %al,%al
118c44: 75 0e jne 118c54 <rtems_timer_server_fire_when+0x50>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
118c46: b8 14 00 00 00 mov $0x14,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118c4b: 8d 65 f4 lea -0xc(%ebp),%esp
118c4e: 5b pop %ebx
118c4f: 5e pop %esi
118c50: 5f pop %edi
118c51: c9 leave
118c52: c3 ret
118c53: 90 nop
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
118c54: 83 ec 0c sub $0xc,%esp
118c57: 57 push %edi
118c58: e8 df d0 ff ff call 115d3c <_TOD_To_seconds>
118c5d: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
118c5f: 83 c4 10 add $0x10,%esp
118c62: 3b 05 a4 22 14 00 cmp 0x1422a4,%eax
118c68: 76 dc jbe 118c46 <rtems_timer_server_fire_when+0x42>
118c6a: 52 push %edx
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
118c6b: 8d 45 e4 lea -0x1c(%ebp),%eax
118c6e: 50 push %eax
118c6f: ff 75 08 pushl 0x8(%ebp)
118c72: 68 40 2c 14 00 push $0x142c40
118c77: e8 4c 26 00 00 call 11b2c8 <_Objects_Get>
118c7c: 89 c2 mov %eax,%edx
switch ( location ) {
118c7e: 83 c4 10 add $0x10,%esp
118c81: 8b 45 e4 mov -0x1c(%ebp),%eax
118c84: 85 c0 test %eax,%eax
118c86: 75 7c jne 118d04 <rtems_timer_server_fire_when+0x100>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118c88: 83 ec 0c sub $0xc,%esp
118c8b: 8d 42 10 lea 0x10(%edx),%eax
118c8e: 50 push %eax
118c8f: 89 55 d4 mov %edx,-0x2c(%ebp)
118c92: e8 b5 42 00 00 call 11cf4c <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
118c97: 8b 55 d4 mov -0x2c(%ebp),%edx
118c9a: c7 42 38 03 00 00 00 movl $0x3,0x38(%edx)
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
118ca1: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
118ca8: 89 72 2c mov %esi,0x2c(%edx)
the_watchdog->id = id;
118cab: 8b 45 08 mov 0x8(%ebp),%eax
118cae: 89 42 30 mov %eax,0x30(%edx)
the_watchdog->user_data = user_data;
118cb1: 8b 45 14 mov 0x14(%ebp),%eax
118cb4: 89 42 34 mov %eax,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
118cb7: 2b 3d a4 22 14 00 sub 0x1422a4,%edi
118cbd: 89 7a 1c mov %edi,0x1c(%edx)
(*timer_server->schedule_operation)( timer_server, the_timer );
118cc0: 58 pop %eax
118cc1: 59 pop %ecx
118cc2: 52 push %edx
118cc3: 53 push %ebx
118cc4: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
118cc7: e8 b0 30 00 00 call 11bd7c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118ccc: 83 c4 10 add $0x10,%esp
118ccf: 31 c0 xor %eax,%eax
118cd1: e9 75 ff ff ff jmp 118c4b <rtems_timer_server_fire_when+0x47>
118cd6: 66 90 xchg %ax,%ax
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
118cd8: b8 0b 00 00 00 mov $0xb,%eax <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118cdd: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
118ce0: 5b pop %ebx <== NOT EXECUTED
118ce1: 5e pop %esi <== NOT EXECUTED
118ce2: 5f pop %edi <== NOT EXECUTED
118ce3: c9 leave <== NOT EXECUTED
118ce4: c3 ret <== NOT EXECUTED
118ce5: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118ce8: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118ced: 8d 65 f4 lea -0xc(%ebp),%esp
118cf0: 5b pop %ebx
118cf1: 5e pop %esi
118cf2: 5f pop %edi
118cf3: c9 leave
118cf4: c3 ret
118cf5: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
118cf8: b8 0e 00 00 00 mov $0xe,%eax
118cfd: e9 49 ff ff ff jmp 118c4b <rtems_timer_server_fire_when+0x47>
118d02: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118d04: b8 04 00 00 00 mov $0x4,%eax
118d09: e9 3d ff ff ff jmp 118c4b <rtems_timer_server_fire_when+0x47>
0010be24 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
10be24: 55 push %ebp
10be25: 89 e5 mov %esp,%ebp
10be27: 83 ec 08 sub $0x8,%esp
10be2a: 8b 45 08 mov 0x8(%ebp),%eax
switch ( policy ) {
10be2d: 85 c0 test %eax,%eax
10be2f: 78 0a js 10be3b <sched_get_priority_max+0x17>
10be31: 83 f8 02 cmp $0x2,%eax
10be34: 7e 1a jle 10be50 <sched_get_priority_max+0x2c>
10be36: 83 f8 04 cmp $0x4,%eax
10be39: 74 15 je 10be50 <sched_get_priority_max+0x2c><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10be3b: e8 f4 81 00 00 call 114034 <__errno>
10be40: c7 00 16 00 00 00 movl $0x16,(%eax)
10be46: b8 ff ff ff ff mov $0xffffffff,%eax
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
10be4b: c9 leave
10be4c: c3 ret
10be4d: 8d 76 00 lea 0x0(%esi),%esi
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
10be50: 0f b6 05 7c 45 12 00 movzbl 0x12457c,%eax
10be57: 48 dec %eax
}
10be58: c9 leave
10be59: c3 ret
0010be5c <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
10be5c: 55 push %ebp
10be5d: 89 e5 mov %esp,%ebp
10be5f: 83 ec 08 sub $0x8,%esp
10be62: 8b 45 08 mov 0x8(%ebp),%eax
switch ( policy ) {
10be65: 85 c0 test %eax,%eax
10be67: 78 0a js 10be73 <sched_get_priority_min+0x17>
10be69: 83 f8 02 cmp $0x2,%eax
10be6c: 7e 1a jle 10be88 <sched_get_priority_min+0x2c><== ALWAYS TAKEN
10be6e: 83 f8 04 cmp $0x4,%eax <== NOT EXECUTED
10be71: 74 15 je 10be88 <sched_get_priority_min+0x2c><== NOT EXECUTED
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10be73: e8 bc 81 00 00 call 114034 <__errno>
10be78: c7 00 16 00 00 00 movl $0x16,(%eax)
10be7e: b8 ff ff ff ff mov $0xffffffff,%eax
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
10be83: c9 leave
10be84: c3 ret
10be85: 8d 76 00 lea 0x0(%esi),%esi
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
10be88: b8 01 00 00 00 mov $0x1,%eax
}
10be8d: c9 leave
10be8e: c3 ret
0010be90 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
10be90: 55 push %ebp
10be91: 89 e5 mov %esp,%ebp
10be93: 56 push %esi
10be94: 53 push %ebx
10be95: 8b 75 08 mov 0x8(%ebp),%esi
10be98: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10be9b: 85 f6 test %esi,%esi
10be9d: 75 21 jne 10bec0 <sched_rr_get_interval+0x30><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
10be9f: 85 db test %ebx,%ebx
10bea1: 74 38 je 10bedb <sched_rr_get_interval+0x4b>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
10bea3: 83 ec 08 sub $0x8,%esp
10bea6: 53 push %ebx
10bea7: ff 35 00 88 12 00 pushl 0x128800
10bead: e8 9a 35 00 00 call 10f44c <_Timespec_From_ticks>
return 0;
10beb2: 83 c4 10 add $0x10,%esp
10beb5: 31 c0 xor %eax,%eax
}
10beb7: 8d 65 f8 lea -0x8(%ebp),%esp
10beba: 5b pop %ebx
10bebb: 5e pop %esi
10bebc: c9 leave
10bebd: c3 ret
10bebe: 66 90 xchg %ax,%ax
{
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10bec0: e8 fb c8 ff ff call 1087c0 <getpid>
10bec5: 39 f0 cmp %esi,%eax
10bec7: 74 d6 je 10be9f <sched_rr_get_interval+0xf>
rtems_set_errno_and_return_minus_one( ESRCH );
10bec9: e8 66 81 00 00 call 114034 <__errno>
10bece: c7 00 03 00 00 00 movl $0x3,(%eax)
10bed4: b8 ff ff ff ff mov $0xffffffff,%eax
10bed9: eb dc jmp 10beb7 <sched_rr_get_interval+0x27>
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
10bedb: e8 54 81 00 00 call 114034 <__errno>
10bee0: c7 00 16 00 00 00 movl $0x16,(%eax)
10bee6: b8 ff ff ff ff mov $0xffffffff,%eax
10beeb: eb ca jmp 10beb7 <sched_rr_get_interval+0x27>
0010e5f4 <sem_close>:
*/
int sem_close(
sem_t *sem
)
{
10e5f4: 55 push %ebp
10e5f5: 89 e5 mov %esp,%ebp
10e5f7: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e5fa: 8d 45 f4 lea -0xc(%ebp),%eax
sem_t *id,
Objects_Locations *location
)
{
return (POSIX_Semaphore_Control *)
_Objects_Get( &_POSIX_Semaphore_Information, (Objects_Id)*id, location );
10e5fd: 50 push %eax
10e5fe: 8b 45 08 mov 0x8(%ebp),%eax
10e601: ff 30 pushl (%eax)
10e603: 68 20 d6 12 00 push $0x12d620
10e608: e8 cf 21 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e60d: 83 c4 10 add $0x10,%esp
10e610: 8b 55 f4 mov -0xc(%ebp),%edx
10e613: 85 d2 test %edx,%edx
10e615: 74 15 je 10e62c <sem_close+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e617: e8 44 90 00 00 call 117660 <__errno>
10e61c: c7 00 16 00 00 00 movl $0x16,(%eax)
10e622: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e627: c9 leave
10e628: c3 ret
10e629: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_semaphore->open_count -= 1;
10e62c: ff 48 18 decl 0x18(%eax)
_POSIX_Semaphore_Delete( the_semaphore );
10e62f: 83 ec 0c sub $0xc,%esp
10e632: 50 push %eax
10e633: e8 1c 64 00 00 call 114a54 <_POSIX_Semaphore_Delete>
_Thread_Enable_dispatch();
10e638: e8 d3 2c 00 00 call 111310 <_Thread_Enable_dispatch>
return 0;
10e63d: 83 c4 10 add $0x10,%esp
10e640: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e642: c9 leave
10e643: c3 ret
0010e644 <sem_destroy>:
*/
int sem_destroy(
sem_t *sem
)
{
10e644: 55 push %ebp
10e645: 89 e5 mov %esp,%ebp
10e647: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e64a: 8d 45 f4 lea -0xc(%ebp),%eax
10e64d: 50 push %eax
10e64e: 8b 45 08 mov 0x8(%ebp),%eax
10e651: ff 30 pushl (%eax)
10e653: 68 20 d6 12 00 push $0x12d620
10e658: e8 7f 21 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e65d: 83 c4 10 add $0x10,%esp
10e660: 8b 55 f4 mov -0xc(%ebp),%edx
10e663: 85 d2 test %edx,%edx
10e665: 74 15 je 10e67c <sem_destroy+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e667: e8 f4 8f 00 00 call 117660 <__errno>
10e66c: c7 00 16 00 00 00 movl $0x16,(%eax)
10e672: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e677: c9 leave
10e678: c3 ret
10e679: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
/*
* Undefined operation on a named semaphore.
*/
if ( the_semaphore->named == true ) {
10e67c: 80 78 14 00 cmpb $0x0,0x14(%eax)
10e680: 75 16 jne 10e698 <sem_destroy+0x54>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
_POSIX_Semaphore_Delete( the_semaphore );
10e682: 83 ec 0c sub $0xc,%esp
10e685: 50 push %eax
10e686: e8 c9 63 00 00 call 114a54 <_POSIX_Semaphore_Delete>
_Thread_Enable_dispatch();
10e68b: e8 80 2c 00 00 call 111310 <_Thread_Enable_dispatch>
return 0;
10e690: 83 c4 10 add $0x10,%esp
10e693: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e695: c9 leave
10e696: c3 ret
10e697: 90 nop
/*
* Undefined operation on a named semaphore.
*/
if ( the_semaphore->named == true ) {
_Thread_Enable_dispatch();
10e698: e8 73 2c 00 00 call 111310 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EINVAL );
10e69d: e8 be 8f 00 00 call 117660 <__errno>
10e6a2: c7 00 16 00 00 00 movl $0x16,(%eax)
10e6a8: b8 ff ff ff ff mov $0xffffffff,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e6ad: c9 leave
10e6ae: c3 ret
0010e6b0 <sem_getvalue>:
int sem_getvalue(
sem_t *sem,
int *sval
)
{
10e6b0: 55 push %ebp
10e6b1: 89 e5 mov %esp,%ebp
10e6b3: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e6b6: 8d 45 f4 lea -0xc(%ebp),%eax
10e6b9: 50 push %eax
10e6ba: 8b 45 08 mov 0x8(%ebp),%eax
10e6bd: ff 30 pushl (%eax)
10e6bf: 68 20 d6 12 00 push $0x12d620
10e6c4: e8 13 21 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e6c9: 83 c4 10 add $0x10,%esp
10e6cc: 8b 55 f4 mov -0xc(%ebp),%edx
10e6cf: 85 d2 test %edx,%edx
10e6d1: 74 15 je 10e6e8 <sem_getvalue+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e6d3: e8 88 8f 00 00 call 117660 <__errno>
10e6d8: c7 00 16 00 00 00 movl $0x16,(%eax)
10e6de: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e6e3: c9 leave
10e6e4: c3 ret
10e6e5: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
*sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore );
10e6e8: 8b 50 64 mov 0x64(%eax),%edx
10e6eb: 8b 45 0c mov 0xc(%ebp),%eax
10e6ee: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e6f0: e8 1b 2c 00 00 call 111310 <_Thread_Enable_dispatch>
return 0;
10e6f5: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e6f7: c9 leave
10e6f8: c3 ret
0010e744 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
10e744: 55 push %ebp
10e745: 89 e5 mov %esp,%ebp
10e747: 57 push %edi
10e748: 56 push %esi
10e749: 53 push %ebx
10e74a: 83 ec 2c sub $0x2c,%esp
10e74d: 8b 75 08 mov 0x8(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10e750: a1 d0 d2 12 00 mov 0x12d2d0,%eax
10e755: 40 inc %eax
10e756: a3 d0 d2 12 00 mov %eax,0x12d2d0
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10e75b: 8b 7d 0c mov 0xc(%ebp),%edi
10e75e: 81 e7 00 02 00 00 and $0x200,%edi
10e764: 0f 85 86 00 00 00 jne 10e7f0 <sem_open+0xac>
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
10e76a: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
10e771: 83 ec 08 sub $0x8,%esp
10e774: 8d 45 e4 lea -0x1c(%ebp),%eax
10e777: 50 push %eax
10e778: 56 push %esi
10e779: e8 26 63 00 00 call 114aa4 <_POSIX_Semaphore_Name_to_id>
10e77e: 89 c3 mov %eax,%ebx
* 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 ) {
10e780: 83 c4 10 add $0x10,%esp
10e783: 85 c0 test %eax,%eax
10e785: 74 25 je 10e7ac <sem_open+0x68>
/*
* 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) ) ) {
10e787: 83 f8 02 cmp $0x2,%eax
10e78a: 75 04 jne 10e790 <sem_open+0x4c> <== NEVER TAKEN
10e78c: 85 ff test %edi,%edi
10e78e: 75 6c jne 10e7fc <sem_open+0xb8>
_Thread_Enable_dispatch();
10e790: e8 7b 2b 00 00 call 111310 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
10e795: e8 c6 8e 00 00 call 117660 <__errno>
10e79a: 89 18 mov %ebx,(%eax)
10e79c: b8 ff ff ff ff mov $0xffffffff,%eax
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
10e7a1: 8d 65 f4 lea -0xc(%ebp),%esp
10e7a4: 5b pop %ebx
10e7a5: 5e pop %esi
10e7a6: 5f pop %edi
10e7a7: c9 leave
10e7a8: c3 ret
10e7a9: 8d 76 00 lea 0x0(%esi),%esi
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10e7ac: 8b 45 0c mov 0xc(%ebp),%eax
10e7af: 25 00 0a 00 00 and $0xa00,%eax
10e7b4: 3d 00 0a 00 00 cmp $0xa00,%eax
10e7b9: 74 65 je 10e820 <sem_open+0xdc>
10e7bb: 50 push %eax
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
10e7bc: 8d 45 dc lea -0x24(%ebp),%eax
10e7bf: 50 push %eax
10e7c0: ff 75 e4 pushl -0x1c(%ebp)
10e7c3: 68 20 d6 12 00 push $0x12d620
10e7c8: e8 0f 20 00 00 call 1107dc <_Objects_Get>
10e7cd: 89 45 e0 mov %eax,-0x20(%ebp)
the_semaphore->open_count += 1;
10e7d0: ff 40 18 incl 0x18(%eax)
_Thread_Enable_dispatch();
10e7d3: e8 38 2b 00 00 call 111310 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10e7d8: e8 33 2b 00 00 call 111310 <_Thread_Enable_dispatch>
goto return_id;
10e7dd: 83 c4 10 add $0x10,%esp
return_id:
#if defined(RTEMS_USE_16_BIT_OBJECT)
the_semaphore->Semaphore_id = the_semaphore->Object.id;
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
10e7e0: 8b 45 e0 mov -0x20(%ebp),%eax
10e7e3: 83 c0 08 add $0x8,%eax
#endif
return id;
}
10e7e6: 8d 65 f4 lea -0xc(%ebp),%esp
10e7e9: 5b pop %ebx
10e7ea: 5e pop %esi
10e7eb: 5f pop %edi
10e7ec: c9 leave
10e7ed: c3 ret
10e7ee: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
10e7f0: 8b 45 14 mov 0x14(%ebp),%eax
10e7f3: 89 45 d4 mov %eax,-0x2c(%ebp)
10e7f6: e9 76 ff ff ff jmp 10e771 <sem_open+0x2d>
10e7fb: 90 nop
/*
* 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(
10e7fc: 8d 45 e0 lea -0x20(%ebp),%eax
10e7ff: 50 push %eax
10e800: ff 75 d4 pushl -0x2c(%ebp)
10e803: 6a 00 push $0x0
10e805: 56 push %esi
10e806: e8 3d 61 00 00 call 114948 <_POSIX_Semaphore_Create_support>
10e80b: 89 c3 mov %eax,%ebx
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
10e80d: e8 fe 2a 00 00 call 111310 <_Thread_Enable_dispatch>
if ( status == -1 )
10e812: 83 c4 10 add $0x10,%esp
10e815: 43 inc %ebx
10e816: 75 c8 jne 10e7e0 <sem_open+0x9c>
return SEM_FAILED;
10e818: b8 ff ff ff ff mov $0xffffffff,%eax
10e81d: eb c7 jmp 10e7e6 <sem_open+0xa2>
10e81f: 90 nop
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
10e820: e8 eb 2a 00 00 call 111310 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
10e825: e8 36 8e 00 00 call 117660 <__errno>
10e82a: c7 00 11 00 00 00 movl $0x11,(%eax)
10e830: b8 ff ff ff ff mov $0xffffffff,%eax
10e835: eb af jmp 10e7e6 <sem_open+0xa2>
0010e838 <sem_post>:
*/
int sem_post(
sem_t *sem
)
{
10e838: 55 push %ebp
10e839: 89 e5 mov %esp,%ebp
10e83b: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e83e: 8d 45 f4 lea -0xc(%ebp),%eax
10e841: 50 push %eax
10e842: 8b 45 08 mov 0x8(%ebp),%eax
10e845: ff 30 pushl (%eax)
10e847: 68 20 d6 12 00 push $0x12d620
10e84c: e8 8b 1f 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e851: 83 c4 10 add $0x10,%esp
10e854: 8b 4d f4 mov -0xc(%ebp),%ecx
10e857: 85 c9 test %ecx,%ecx
10e859: 74 15 je 10e870 <sem_post+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e85b: e8 00 8e 00 00 call 117660 <__errno>
10e860: c7 00 16 00 00 00 movl $0x16,(%eax)
10e866: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e86b: c9 leave
10e86c: c3 ret
10e86d: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_semaphore_Surrender(
10e870: 52 push %edx
10e871: 6a 00 push $0x0
10e873: ff 70 08 pushl 0x8(%eax)
10e876: 83 c0 1c add $0x1c,%eax
10e879: 50 push %eax
10e87a: e8 65 15 00 00 call 10fde4 <_CORE_semaphore_Surrender>
NULL /* XXX need to define a routine to handle this case */
#else
NULL
#endif
);
_Thread_Enable_dispatch();
10e87f: e8 8c 2a 00 00 call 111310 <_Thread_Enable_dispatch>
return 0;
10e884: 83 c4 10 add $0x10,%esp
10e887: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e889: c9 leave
10e88a: c3 ret
0010e88c <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
10e88c: 55 push %ebp
10e88d: 89 e5 mov %esp,%ebp
10e88f: 53 push %ebx
10e890: 83 ec 1c sub $0x1c,%esp
10e893: 8b 5d 08 mov 0x8(%ebp),%ebx
*
* 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 );
10e896: 8d 45 f4 lea -0xc(%ebp),%eax
10e899: 50 push %eax
10e89a: ff 75 0c pushl 0xc(%ebp)
10e89d: e8 36 55 00 00 call 113dd8 <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10e8a2: 83 c4 10 add $0x10,%esp
10e8a5: 83 f8 03 cmp $0x3,%eax
10e8a8: 74 16 je 10e8c0 <sem_timedwait+0x34> <== ALWAYS TAKEN
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
10e8aa: 50 push %eax <== NOT EXECUTED
10e8ab: ff 75 f4 pushl -0xc(%ebp) <== NOT EXECUTED
10e8ae: 6a 00 push $0x0 <== NOT EXECUTED
10e8b0: 53 push %ebx <== NOT EXECUTED
10e8b1: e8 5a 62 00 00 call 114b10 <_POSIX_Semaphore_Wait_support><== NOT EXECUTED
10e8b6: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
10e8b9: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10e8bc: c9 leave <== NOT EXECUTED
10e8bd: c3 ret <== NOT EXECUTED
10e8be: 66 90 xchg %ax,%ax <== NOT EXECUTED
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
10e8c0: 52 push %edx
10e8c1: ff 75 f4 pushl -0xc(%ebp)
10e8c4: 6a 01 push $0x1
10e8c6: 53 push %ebx
10e8c7: e8 44 62 00 00 call 114b10 <_POSIX_Semaphore_Wait_support>
10e8cc: 83 c4 10 add $0x10,%esp
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
10e8cf: 8b 5d fc mov -0x4(%ebp),%ebx
10e8d2: c9 leave
10e8d3: c3 ret
0010b2f4 <setitimer>:
int setitimer(
int which,
const struct itimerval *value,
struct itimerval *ovalue
)
{
10b2f4: 55 push %ebp
10b2f5: 89 e5 mov %esp,%ebp
10b2f7: 83 ec 08 sub $0x8,%esp
if ( !value )
10b2fa: 8b 55 0c mov 0xc(%ebp),%edx
10b2fd: 85 d2 test %edx,%edx
10b2ff: 74 33 je 10b334 <setitimer+0x40>
rtems_set_errno_and_return_minus_one( EFAULT );
if ( !ovalue )
10b301: 8b 45 10 mov 0x10(%ebp),%eax
10b304: 85 c0 test %eax,%eax
10b306: 74 2c je 10b334 <setitimer+0x40>
rtems_set_errno_and_return_minus_one( EFAULT );
switch ( which ) {
10b308: 83 7d 08 02 cmpl $0x2,0x8(%ebp)
10b30c: 76 12 jbe 10b320 <setitimer+0x2c>
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b30e: e8 41 87 00 00 call 113a54 <__errno>
10b313: c7 00 16 00 00 00 movl $0x16,(%eax)
}
10b319: b8 ff ff ff ff mov $0xffffffff,%eax
10b31e: c9 leave
10b31f: c3 ret
switch ( which ) {
case ITIMER_REAL:
case ITIMER_VIRTUAL:
case ITIMER_PROF:
rtems_set_errno_and_return_minus_one( ENOSYS );
10b320: e8 2f 87 00 00 call 113a54 <__errno>
10b325: c7 00 58 00 00 00 movl $0x58,(%eax)
default:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b32b: b8 ff ff ff ff mov $0xffffffff,%eax
10b330: c9 leave
10b331: c3 ret
10b332: 66 90 xchg %ax,%ax
{
if ( !value )
rtems_set_errno_and_return_minus_one( EFAULT );
if ( !ovalue )
rtems_set_errno_and_return_minus_one( EFAULT );
10b334: e8 1b 87 00 00 call 113a54 <__errno>
10b339: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b33f: eb d8 jmp 10b319 <setitimer+0x25>
0010bd40 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
10bd40: 55 push %ebp
10bd41: 89 e5 mov %esp,%ebp
10bd43: 57 push %edi
10bd44: 56 push %esi
10bd45: 53 push %ebx
10bd46: 83 ec 1c sub $0x1c,%esp
10bd49: 8b 5d 08 mov 0x8(%ebp),%ebx
10bd4c: 8b 45 0c mov 0xc(%ebp),%eax
10bd4f: 8b 55 10 mov 0x10(%ebp),%edx
ISR_Level level;
if ( oact )
10bd52: 85 d2 test %edx,%edx
10bd54: 74 13 je 10bd69 <sigaction+0x29>
*oact = _POSIX_signals_Vectors[ sig ];
10bd56: 8d 0c 5b lea (%ebx,%ebx,2),%ecx
10bd59: 8d 34 8d c0 9b 12 00 lea 0x129bc0(,%ecx,4),%esi
10bd60: b9 03 00 00 00 mov $0x3,%ecx
10bd65: 89 d7 mov %edx,%edi
10bd67: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( !sig )
10bd69: 85 db test %ebx,%ebx
10bd6b: 74 77 je 10bde4 <sigaction+0xa4>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10bd6d: 8d 53 ff lea -0x1(%ebx),%edx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
10bd70: 83 fa 1f cmp $0x1f,%edx
10bd73: 77 6f ja 10bde4 <sigaction+0xa4>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
10bd75: 83 fb 09 cmp $0x9,%ebx
10bd78: 74 6a je 10bde4 <sigaction+0xa4>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
10bd7a: 85 c0 test %eax,%eax
10bd7c: 74 62 je 10bde0 <sigaction+0xa0> <== 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 );
10bd7e: 9c pushf
10bd7f: fa cli
10bd80: 8f 45 e4 popl -0x1c(%ebp)
if ( act->sa_handler == SIG_DFL ) {
10bd83: 8b 50 08 mov 0x8(%eax),%edx
10bd86: 85 d2 test %edx,%edx
10bd88: 74 36 je 10bdc0 <sigaction+0x80>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
10bd8a: 83 ec 0c sub $0xc,%esp
10bd8d: 53 push %ebx
10bd8e: 89 45 e0 mov %eax,-0x20(%ebp)
10bd91: e8 96 57 00 00 call 11152c <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
10bd96: 8d 14 5b lea (%ebx,%ebx,2),%edx
10bd99: 8d 14 95 c0 9b 12 00 lea 0x129bc0(,%edx,4),%edx
10bda0: b9 03 00 00 00 mov $0x3,%ecx
10bda5: 8b 45 e0 mov -0x20(%ebp),%eax
10bda8: 89 d7 mov %edx,%edi
10bdaa: 89 c6 mov %eax,%esi
10bdac: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10bdae: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10bdb1: ff 75 e4 pushl -0x1c(%ebp)
10bdb4: 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;
10bdb5: 31 c0 xor %eax,%eax
}
10bdb7: 8d 65 f4 lea -0xc(%ebp),%esp
10bdba: 5b pop %ebx
10bdbb: 5e pop %esi
10bdbc: 5f pop %edi
10bdbd: c9 leave
10bdbe: c3 ret
10bdbf: 90 nop
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
10bdc0: 8d 34 5b lea (%ebx,%ebx,2),%esi
10bdc3: c1 e6 02 shl $0x2,%esi
10bdc6: 8d 86 c0 9b 12 00 lea 0x129bc0(%esi),%eax
10bdcc: 81 c6 40 30 12 00 add $0x123040,%esi
10bdd2: b9 03 00 00 00 mov $0x3,%ecx
10bdd7: 89 c7 mov %eax,%edi
10bdd9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10bddb: eb d4 jmp 10bdb1 <sigaction+0x71>
10bddd: 8d 76 00 lea 0x0(%esi),%esi
* 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;
10bde0: 31 c0 xor %eax,%eax
10bde2: eb d3 jmp 10bdb7 <sigaction+0x77> <== NOT EXECUTED
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
rtems_set_errno_and_return_minus_one( EINVAL );
10bde4: e8 47 85 00 00 call 114330 <__errno>
10bde9: c7 00 16 00 00 00 movl $0x16,(%eax)
10bdef: b8 ff ff ff ff mov $0xffffffff,%eax
10bdf4: eb c1 jmp 10bdb7 <sigaction+0x77>
0010c110 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
10c110: 55 push %ebp
10c111: 89 e5 mov %esp,%ebp
10c113: 57 push %edi
10c114: 56 push %esi
10c115: 53 push %ebx
10c116: 83 ec 2c sub $0x2c,%esp
10c119: 8b 5d 08 mov 0x8(%ebp),%ebx
10c11c: 8b 7d 0c mov 0xc(%ebp),%edi
10c11f: 8b 75 10 mov 0x10(%ebp),%esi
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
10c122: 85 db test %ebx,%ebx
10c124: 0f 84 9e 01 00 00 je 10c2c8 <sigtimedwait+0x1b8>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
10c12a: 85 f6 test %esi,%esi
10c12c: 0f 84 3e 01 00 00 je 10c270 <sigtimedwait+0x160>
if ( !_Timespec_Is_valid( timeout ) )
10c132: 83 ec 0c sub $0xc,%esp
10c135: 56 push %esi
10c136: e8 21 36 00 00 call 10f75c <_Timespec_Is_valid>
10c13b: 83 c4 10 add $0x10,%esp
10c13e: 84 c0 test %al,%al
10c140: 0f 84 82 01 00 00 je 10c2c8 <sigtimedwait+0x1b8>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
10c146: 83 ec 0c sub $0xc,%esp
10c149: 56 push %esi
10c14a: e8 75 36 00 00 call 10f7c4 <_Timespec_To_ticks>
if ( !interval )
10c14f: 83 c4 10 add $0x10,%esp
10c152: 85 c0 test %eax,%eax
10c154: 0f 84 6e 01 00 00 je 10c2c8 <sigtimedwait+0x1b8> <== NEVER TAKEN
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10c15a: 85 ff test %edi,%edi
10c15c: 0f 84 18 01 00 00 je 10c27a <sigtimedwait+0x16a> <== NEVER TAKEN
the_thread = _Thread_Executing;
10c162: 8b 0d 38 a2 12 00 mov 0x12a238,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10c168: 8b 91 ec 00 00 00 mov 0xec(%ecx),%edx
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
10c16e: 9c pushf
10c16f: fa cli
10c170: 8f 45 d0 popl -0x30(%ebp)
if ( *set & api->signals_pending ) {
10c173: 8b 33 mov (%ebx),%esi
10c175: 89 75 d4 mov %esi,-0x2c(%ebp)
10c178: 8b b2 d4 00 00 00 mov 0xd4(%edx),%esi
10c17e: 85 75 d4 test %esi,-0x2c(%ebp)
10c181: 0f 85 fd 00 00 00 jne 10c284 <sigtimedwait+0x174>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
10c187: 8b 35 a8 a4 12 00 mov 0x12a4a8,%esi
10c18d: 85 75 d4 test %esi,-0x2c(%ebp)
10c190: 0f 85 96 00 00 00 jne 10c22c <sigtimedwait+0x11c>
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
10c196: c7 07 ff ff ff ff movl $0xffffffff,(%edi)
10c19c: 8b 35 50 9c 12 00 mov 0x129c50,%esi
10c1a2: 46 inc %esi
10c1a3: 89 35 50 9c 12 00 mov %esi,0x129c50
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
10c1a9: c7 41 44 40 a4 12 00 movl $0x12a440,0x44(%ecx)
the_thread->Wait.return_code = EINTR;
10c1b0: c7 41 34 04 00 00 00 movl $0x4,0x34(%ecx)
the_thread->Wait.option = *set;
10c1b7: 8b 33 mov (%ebx),%esi
10c1b9: 89 71 30 mov %esi,0x30(%ecx)
the_thread->Wait.return_argument = the_info;
10c1bc: 89 79 28 mov %edi,0x28(%ecx)
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;
10c1bf: c7 05 70 a4 12 00 01 movl $0x1,0x12a470
10c1c6: 00 00 00
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
10c1c9: ff 75 d0 pushl -0x30(%ebp)
10c1cc: 9d popf
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
10c1cd: 51 push %ecx
10c1ce: 68 40 f4 10 00 push $0x10f440
10c1d3: 50 push %eax
10c1d4: 68 40 a4 12 00 push $0x12a440
10c1d9: 89 55 cc mov %edx,-0x34(%ebp)
10c1dc: e8 33 2f 00 00 call 10f114 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10c1e1: e8 52 2a 00 00 call 10ec38 <_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 );
10c1e6: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c1ed: 6a 00 push $0x0
10c1ef: 57 push %edi
10c1f0: ff 37 pushl (%edi)
10c1f2: 8b 55 cc mov -0x34(%ebp),%edx
10c1f5: 52 push %edx
10c1f6: e8 1d 5a 00 00 call 111c18 <_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)
10c1fb: 83 c4 20 add $0x20,%esp
10c1fe: a1 38 a2 12 00 mov 0x12a238,%eax
10c203: 83 78 34 04 cmpl $0x4,0x34(%eax)
10c207: 0f 85 d3 00 00 00 jne 10c2e0 <sigtimedwait+0x1d0>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
10c20d: 8b 37 mov (%edi),%esi
10c20f: 8d 4e ff lea -0x1(%esi),%ecx
10c212: b8 01 00 00 00 mov $0x1,%eax
10c217: d3 e0 shl %cl,%eax
10c219: 85 03 test %eax,(%ebx)
10c21b: 0f 84 bf 00 00 00 je 10c2e0 <sigtimedwait+0x1d0> <== NEVER TAKEN
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c221: 89 f0 mov %esi,%eax
10c223: 8d 65 f4 lea -0xc(%ebp),%esp
10c226: 5b pop %ebx
10c227: 5e pop %esi
10c228: 5f pop %edi
10c229: c9 leave
10c22a: c3 ret
10c22b: 90 nop
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
10c22c: 83 ec 0c sub $0xc,%esp
10c22f: 56 push %esi
10c230: 89 55 cc mov %edx,-0x34(%ebp)
10c233: e8 94 fe ff ff call 10c0cc <_POSIX_signals_Get_lowest>
10c238: 89 c6 mov %eax,%esi
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
10c23a: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c241: 6a 01 push $0x1
10c243: 57 push %edi
10c244: 50 push %eax
10c245: 8b 55 cc mov -0x34(%ebp),%edx
10c248: 52 push %edx
10c249: e8 ca 59 00 00 call 111c18 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
10c24e: ff 75 d0 pushl -0x30(%ebp)
10c251: 9d popf
the_info->si_signo = signo;
10c252: 89 37 mov %esi,(%edi)
the_info->si_code = SI_USER;
10c254: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10c25b: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return signo;
10c262: 83 c4 20 add $0x20,%esp
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c265: 89 f0 mov %esi,%eax
10c267: 8d 65 f4 lea -0xc(%ebp),%esp
10c26a: 5b pop %ebx
10c26b: 5e pop %esi
10c26c: 5f pop %edi
10c26d: c9 leave
10c26e: c3 ret
10c26f: 90 nop
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
10c270: 31 c0 xor %eax,%eax
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10c272: 85 ff test %edi,%edi
10c274: 0f 85 e8 fe ff ff jne 10c162 <sigtimedwait+0x52>
10c27a: 8d 7d dc lea -0x24(%ebp),%edi
10c27d: e9 e0 fe ff ff jmp 10c162 <sigtimedwait+0x52>
10c282: 66 90 xchg %ax,%ax
/* API signals pending? */
_ISR_Disable( level );
if ( *set & api->signals_pending ) {
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
10c284: 83 ec 0c sub $0xc,%esp
10c287: 56 push %esi
10c288: 89 55 cc mov %edx,-0x34(%ebp)
10c28b: e8 3c fe ff ff call 10c0cc <_POSIX_signals_Get_lowest>
10c290: 89 07 mov %eax,(%edi)
_POSIX_signals_Clear_signals(
10c292: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c299: 6a 00 push $0x0
10c29b: 57 push %edi
10c29c: 50 push %eax
10c29d: 8b 55 cc mov -0x34(%ebp),%edx
10c2a0: 52 push %edx
10c2a1: e8 72 59 00 00 call 111c18 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
10c2a6: ff 75 d0 pushl -0x30(%ebp)
10c2a9: 9d popf
the_info->si_code = SI_USER;
10c2aa: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10c2b1: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return the_info->si_signo;
10c2b8: 8b 37 mov (%edi),%esi
10c2ba: 83 c4 20 add $0x20,%esp
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c2bd: 89 f0 mov %esi,%eax
10c2bf: 8d 65 f4 lea -0xc(%ebp),%esp
10c2c2: 5b pop %ebx
10c2c3: 5e pop %esi
10c2c4: 5f pop %edi
10c2c5: c9 leave
10c2c6: c3 ret
10c2c7: 90 nop
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
10c2c8: e8 a7 86 00 00 call 114974 <__errno>
10c2cd: c7 00 16 00 00 00 movl $0x16,(%eax)
10c2d3: be ff ff ff ff mov $0xffffffff,%esi
10c2d8: e9 44 ff ff ff jmp 10c221 <sigtimedwait+0x111>
10c2dd: 8d 76 00 lea 0x0(%esi),%esi
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
10c2e0: e8 8f 86 00 00 call 114974 <__errno>
10c2e5: 8b 15 38 a2 12 00 mov 0x12a238,%edx
10c2eb: 8b 52 34 mov 0x34(%edx),%edx
10c2ee: 89 10 mov %edx,(%eax)
return -1;
10c2f0: be ff ff ff ff mov $0xffffffff,%esi
10c2f5: e9 27 ff ff ff jmp 10c221 <sigtimedwait+0x111>
0010df98 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
10df98: 55 push %ebp
10df99: 89 e5 mov %esp,%ebp
10df9b: 53 push %ebx
10df9c: 83 ec 08 sub $0x8,%esp
10df9f: 8b 5d 0c mov 0xc(%ebp),%ebx
int status;
status = sigtimedwait( set, NULL, NULL );
10dfa2: 6a 00 push $0x0
10dfa4: 6a 00 push $0x0
10dfa6: ff 75 08 pushl 0x8(%ebp)
10dfa9: e8 e6 fd ff ff call 10dd94 <sigtimedwait>
if ( status != -1 ) {
10dfae: 83 c4 10 add $0x10,%esp
10dfb1: 83 f8 ff cmp $0xffffffff,%eax
10dfb4: 74 0e je 10dfc4 <sigwait+0x2c>
if ( sig )
10dfb6: 85 db test %ebx,%ebx
10dfb8: 74 16 je 10dfd0 <sigwait+0x38> <== NEVER TAKEN
*sig = status;
10dfba: 89 03 mov %eax,(%ebx)
return 0;
10dfbc: 31 c0 xor %eax,%eax
}
return errno;
}
10dfbe: 8b 5d fc mov -0x4(%ebp),%ebx
10dfc1: c9 leave
10dfc2: c3 ret
10dfc3: 90 nop
if ( sig )
*sig = status;
return 0;
}
return errno;
10dfc4: e8 7b 81 00 00 call 116144 <__errno>
10dfc9: 8b 00 mov (%eax),%eax
}
10dfcb: 8b 5d fc mov -0x4(%ebp),%ebx
10dfce: c9 leave
10dfcf: c3 ret
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
10dfd0: 31 c0 xor %eax,%eax
}
return errno;
}
10dfd2: 8b 5d fc mov -0x4(%ebp),%ebx
10dfd5: c9 leave <== NOT EXECUTED
10dfd6: c3 ret <== NOT EXECUTED
0010b4ec <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
10b4ec: 55 push %ebp
10b4ed: 89 e5 mov %esp,%ebp
10b4ef: 56 push %esi
10b4f0: 53 push %ebx
10b4f1: 8b 5d 0c mov 0xc(%ebp),%ebx
10b4f4: 8b 75 10 mov 0x10(%ebp),%esi
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
10b4f7: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
10b4fb: 0f 85 db 00 00 00 jne 10b5dc <timer_create+0xf0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
10b501: 85 f6 test %esi,%esi
10b503: 0f 84 d3 00 00 00 je 10b5dc <timer_create+0xf0>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
10b509: 85 db test %ebx,%ebx
10b50b: 74 21 je 10b52e <timer_create+0x42>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
10b50d: 8b 03 mov (%ebx),%eax
10b50f: 48 dec %eax
10b510: 83 f8 01 cmp $0x1,%eax
10b513: 0f 87 c3 00 00 00 ja 10b5dc <timer_create+0xf0> <== NEVER TAKEN
( evp->sigev_notify != SIGEV_SIGNAL ) ) {
/* The value of the field sigev_notify is not valid */
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !evp->sigev_signo )
10b519: 8b 43 04 mov 0x4(%ebx),%eax
10b51c: 85 c0 test %eax,%eax
10b51e: 0f 84 b8 00 00 00 je 10b5dc <timer_create+0xf0> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10b524: 48 dec %eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
10b525: 83 f8 1f cmp $0x1f,%eax
10b528: 0f 87 ae 00 00 00 ja 10b5dc <timer_create+0xf0> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b52e: a1 70 98 12 00 mov 0x129870,%eax
10b533: 40 inc %eax
10b534: a3 70 98 12 00 mov %eax,0x129870
* 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 );
10b539: 83 ec 0c sub $0xc,%esp
10b53c: 68 00 9c 12 00 push $0x129c00
10b541: e8 a6 1e 00 00 call 10d3ec <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
10b546: 83 c4 10 add $0x10,%esp
10b549: 85 c0 test %eax,%eax
10b54b: 0f 84 a2 00 00 00 je 10b5f3 <timer_create+0x107>
rtems_set_errno_and_return_minus_one( EAGAIN );
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
10b551: c6 40 3c 02 movb $0x2,0x3c(%eax)
ptimer->thread_id = _Thread_Executing->Object.id;
10b555: 8b 15 58 9e 12 00 mov 0x129e58,%edx
10b55b: 8b 52 08 mov 0x8(%edx),%edx
10b55e: 89 50 38 mov %edx,0x38(%eax)
if ( evp != NULL ) {
10b561: 85 db test %ebx,%ebx
10b563: 74 11 je 10b576 <timer_create+0x8a>
ptimer->inf.sigev_notify = evp->sigev_notify;
10b565: 8b 13 mov (%ebx),%edx
10b567: 89 50 40 mov %edx,0x40(%eax)
ptimer->inf.sigev_signo = evp->sigev_signo;
10b56a: 8b 53 04 mov 0x4(%ebx),%edx
10b56d: 89 50 44 mov %edx,0x44(%eax)
ptimer->inf.sigev_value = evp->sigev_value;
10b570: 8b 53 08 mov 0x8(%ebx),%edx
10b573: 89 50 48 mov %edx,0x48(%eax)
}
ptimer->overrun = 0;
10b576: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
ptimer->timer_data.it_value.tv_sec = 0;
10b57d: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
ptimer->timer_data.it_value.tv_nsec = 0;
10b584: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
ptimer->timer_data.it_interval.tv_sec = 0;
10b58b: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
ptimer->timer_data.it_interval.tv_nsec = 0;
10b592: 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;
10b599: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10b5a0: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10b5a7: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10b5ae: 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 ),
10b5b5: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b5b8: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b5bb: 8b 0d 1c 9c 12 00 mov 0x129c1c,%ecx
10b5c1: 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;
10b5c4: 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;
10b5cb: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10b5cd: e8 86 2d 00 00 call 10e358 <_Thread_Enable_dispatch>
return 0;
10b5d2: 31 c0 xor %eax,%eax
}
10b5d4: 8d 65 f8 lea -0x8(%ebp),%esp
10b5d7: 5b pop %ebx
10b5d8: 5e pop %esi
10b5d9: c9 leave
10b5da: c3 ret
10b5db: 90 nop
if ( !evp->sigev_signo )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
rtems_set_errno_and_return_minus_one( EINVAL );
10b5dc: e8 f7 8a 00 00 call 1140d8 <__errno>
10b5e1: c7 00 16 00 00 00 movl $0x16,(%eax)
10b5e7: b8 ff ff ff ff mov $0xffffffff,%eax
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10b5ec: 8d 65 f8 lea -0x8(%ebp),%esp
10b5ef: 5b pop %ebx
10b5f0: 5e pop %esi
10b5f1: c9 leave
10b5f2: c3 ret
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
_Thread_Enable_dispatch();
10b5f3: e8 60 2d 00 00 call 10e358 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
10b5f8: e8 db 8a 00 00 call 1140d8 <__errno>
10b5fd: c7 00 0b 00 00 00 movl $0xb,(%eax)
10b603: b8 ff ff ff ff mov $0xffffffff,%eax
10b608: eb ca jmp 10b5d4 <timer_create+0xe8>
0010ba34 <timer_delete>:
int timer_delete(
timer_t timerid
)
{
10ba34: 55 push %ebp
10ba35: 89 e5 mov %esp,%ebp
10ba37: 53 push %ebx
10ba38: 83 ec 18 sub $0x18,%esp
* because rtems_timer_delete stops the timer before deleting it.
*/
POSIX_Timer_Control *ptimer;
Objects_Locations location;
ptimer = _POSIX_Timer_Get( timerid, &location );
10ba3b: 8d 45 f4 lea -0xc(%ebp),%eax
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10ba3e: 50 push %eax
10ba3f: ff 75 08 pushl 0x8(%ebp)
10ba42: 68 00 9b 12 00 push $0x129b00
10ba47: e8 ac 21 00 00 call 10dbf8 <_Objects_Get>
10ba4c: 89 c3 mov %eax,%ebx
switch ( location ) {
10ba4e: 83 c4 10 add $0x10,%esp
10ba51: 8b 4d f4 mov -0xc(%ebp),%ecx
10ba54: 85 c9 test %ecx,%ecx
10ba56: 74 18 je 10ba70 <timer_delete+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10ba58: e8 8b 8d 00 00 call 1147e8 <__errno>
10ba5d: c7 00 16 00 00 00 movl $0x16,(%eax)
10ba63: b8 ff ff ff ff mov $0xffffffff,%eax
}
10ba68: 8b 5d fc mov -0x4(%ebp),%ebx
10ba6b: c9 leave
10ba6c: c3 ret
10ba6d: 8d 76 00 lea 0x0(%esi),%esi
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Close( &_POSIX_Timer_Information, &ptimer->Object );
10ba70: 83 ec 08 sub $0x8,%esp
10ba73: 50 push %eax
10ba74: 68 00 9b 12 00 push $0x129b00
10ba79: e8 3e 1d 00 00 call 10d7bc <_Objects_Close>
ptimer->state = POSIX_TIMER_STATE_FREE;
10ba7e: c6 43 3c 01 movb $0x1,0x3c(%ebx)
(void) _Watchdog_Remove( &ptimer->Timer );
10ba82: 8d 43 10 lea 0x10(%ebx),%eax
10ba85: 89 04 24 mov %eax,(%esp)
10ba88: e8 43 3c 00 00 call 10f6d0 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _POSIX_Timer_Free (
POSIX_Timer_Control *the_timer
)
{
_Objects_Free( &_POSIX_Timer_Information, &the_timer->Object );
10ba8d: 58 pop %eax
10ba8e: 5a pop %edx
10ba8f: 53 push %ebx
10ba90: 68 00 9b 12 00 push $0x129b00
10ba95: e8 1e 20 00 00 call 10dab8 <_Objects_Free>
_POSIX_Timer_Free( ptimer );
_Thread_Enable_dispatch();
10ba9a: e8 0d 2c 00 00 call 10e6ac <_Thread_Enable_dispatch>
return 0;
10ba9f: 83 c4 10 add $0x10,%esp
10baa2: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10baa4: 8b 5d fc mov -0x4(%ebp),%ebx
10baa7: c9 leave
10baa8: c3 ret
0010c8f0 <timer_getoverrun>:
* its execution, _POSIX_Timer_TSR will have to set this counter to 0.
*/
int timer_getoverrun(
timer_t timerid
)
{
10c8f0: 55 push %ebp
10c8f1: 89 e5 mov %esp,%ebp
10c8f3: 53 push %ebx
10c8f4: 83 ec 18 sub $0x18,%esp
int overrun;
POSIX_Timer_Control *ptimer;
Objects_Locations location;
ptimer = _POSIX_Timer_Get( timerid, &location );
10c8f7: 8d 45 f4 lea -0xc(%ebp),%eax
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10c8fa: 50 push %eax
10c8fb: ff 75 08 pushl 0x8(%ebp)
10c8fe: 68 c0 b1 12 00 push $0x12b1c0
10c903: e8 34 21 00 00 call 10ea3c <_Objects_Get>
switch ( location ) {
10c908: 83 c4 10 add $0x10,%esp
10c90b: 8b 55 f4 mov -0xc(%ebp),%edx
10c90e: 85 d2 test %edx,%edx
10c910: 74 1a je 10c92c <timer_getoverrun+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10c912: e8 51 89 00 00 call 115268 <__errno>
10c917: c7 00 16 00 00 00 movl $0x16,(%eax)
10c91d: bb ff ff ff ff mov $0xffffffff,%ebx
}
10c922: 89 d8 mov %ebx,%eax
10c924: 8b 5d fc mov -0x4(%ebp),%ebx
10c927: c9 leave
10c928: c3 ret
10c929: 8d 76 00 lea 0x0(%esi),%esi
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
overrun = ptimer->overrun;
10c92c: 8b 58 68 mov 0x68(%eax),%ebx
ptimer->overrun = 0;
10c92f: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
_Thread_Enable_dispatch();
10c936: e8 b5 2b 00 00 call 10f4f0 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10c93b: 89 d8 mov %ebx,%eax
10c93d: 8b 5d fc mov -0x4(%ebp),%ebx
10c940: c9 leave
10c941: c3 ret
0010c944 <timer_gettime>:
int timer_gettime(
timer_t timerid,
struct itimerspec *value
)
{
10c944: 55 push %ebp
10c945: 89 e5 mov %esp,%ebp
10c947: 56 push %esi
10c948: 53 push %ebx
10c949: 83 ec 10 sub $0x10,%esp
10c94c: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Timer_Control *ptimer;
Objects_Locations location;
struct timespec current_time;
Watchdog_Interval left;
if ( !value )
10c94f: 85 db test %ebx,%ebx
10c951: 74 65 je 10c9b8 <timer_gettime+0x74>
rtems_set_errno_and_return_minus_one( EINVAL );
/* Reads the current time */
_TOD_Get( ¤t_time );
10c953: 83 ec 0c sub $0xc,%esp
10c956: 8d 45 ec lea -0x14(%ebp),%eax
10c959: 50 push %eax
10c95a: e8 01 17 00 00 call 10e060 <_TOD_Get>
10c95f: 83 c4 0c add $0xc,%esp
ptimer = _POSIX_Timer_Get( timerid, &location );
10c962: 8d 45 f4 lea -0xc(%ebp),%eax
10c965: 50 push %eax
10c966: ff 75 08 pushl 0x8(%ebp)
10c969: 68 c0 b1 12 00 push $0x12b1c0
10c96e: e8 c9 20 00 00 call 10ea3c <_Objects_Get>
10c973: 89 c6 mov %eax,%esi
switch ( location ) {
10c975: 83 c4 10 add $0x10,%esp
10c978: 8b 45 f4 mov -0xc(%ebp),%eax
10c97b: 85 c0 test %eax,%eax
10c97d: 75 39 jne 10c9b8 <timer_gettime+0x74>
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
10c97f: a1 a4 af 12 00 mov 0x12afa4,%eax
_Watchdog_Ticks_since_boot; /* now */
_Timespec_From_ticks( left, &value->it_value );
10c984: 83 ec 08 sub $0x8,%esp
10c987: 8d 53 08 lea 0x8(%ebx),%edx
10c98a: 52 push %edx
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
10c98b: 8b 56 1c mov 0x1c(%esi),%edx
10c98e: 03 56 24 add 0x24(%esi),%edx
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
10c991: 29 c2 sub %eax,%edx
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
_Watchdog_Ticks_since_boot; /* now */
_Timespec_From_ticks( left, &value->it_value );
10c993: 52 push %edx
10c994: e8 7b 36 00 00 call 110014 <_Timespec_From_ticks>
value->it_interval = ptimer->timer_data.it_interval;
10c999: 8b 46 54 mov 0x54(%esi),%eax
10c99c: 8b 56 58 mov 0x58(%esi),%edx
10c99f: 89 03 mov %eax,(%ebx)
10c9a1: 89 53 04 mov %edx,0x4(%ebx)
_Thread_Enable_dispatch();
10c9a4: e8 47 2b 00 00 call 10f4f0 <_Thread_Enable_dispatch>
return 0;
10c9a9: 83 c4 10 add $0x10,%esp
10c9ac: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10c9ae: 8d 65 f8 lea -0x8(%ebp),%esp
10c9b1: 5b pop %ebx
10c9b2: 5e pop %esi
10c9b3: c9 leave
10c9b4: c3 ret
10c9b5: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10c9b8: e8 ab 88 00 00 call 115268 <__errno>
10c9bd: c7 00 16 00 00 00 movl $0x16,(%eax)
10c9c3: b8 ff ff ff ff mov $0xffffffff,%eax
10c9c8: eb e4 jmp 10c9ae <timer_gettime+0x6a>
0010b60c <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
10b60c: 55 push %ebp
10b60d: 89 e5 mov %esp,%ebp
10b60f: 57 push %edi
10b610: 56 push %esi
10b611: 53 push %ebx
10b612: 83 ec 3c sub $0x3c,%esp
10b615: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
10b618: 85 db test %ebx,%ebx
10b61a: 0f 84 50 01 00 00 je 10b770 <timer_settime+0x164> <== NEVER TAKEN
/*
* First, it verifies if the structure "value" is correct
* if the number of nanoseconds is not correct return EINVAL
*/
if ( !_Timespec_Is_valid( &(value->it_value) ) ) {
10b620: 83 ec 0c sub $0xc,%esp
10b623: 8d 43 08 lea 0x8(%ebx),%eax
10b626: 50 push %eax
10b627: e8 74 38 00 00 call 10eea0 <_Timespec_Is_valid>
10b62c: 83 c4 10 add $0x10,%esp
10b62f: 84 c0 test %al,%al
10b631: 0f 84 39 01 00 00 je 10b770 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
10b637: 83 ec 0c sub $0xc,%esp
10b63a: 53 push %ebx
10b63b: e8 60 38 00 00 call 10eea0 <_Timespec_Is_valid>
10b640: 83 c4 10 add $0x10,%esp
10b643: 84 c0 test %al,%al
10b645: 0f 84 25 01 00 00 je 10b770 <timer_settime+0x164> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
10b64b: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10b64f: 0f 84 db 00 00 00 je 10b730 <timer_settime+0x124>
10b655: 8b 45 0c mov 0xc(%ebp),%eax
10b658: 85 c0 test %eax,%eax
10b65a: 0f 85 10 01 00 00 jne 10b770 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10b660: 8d 45 cc lea -0x34(%ebp),%eax
10b663: 89 45 c4 mov %eax,-0x3c(%ebp)
10b666: b9 04 00 00 00 mov $0x4,%ecx
10b66b: 89 c7 mov %eax,%edi
10b66d: 89 de mov %ebx,%esi
10b66f: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
10b671: 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 );
10b672: 8d 45 e4 lea -0x1c(%ebp),%eax
10b675: 50 push %eax
10b676: ff 75 08 pushl 0x8(%ebp)
10b679: 68 00 9c 12 00 push $0x129c00
10b67e: e8 21 22 00 00 call 10d8a4 <_Objects_Get>
10b683: 89 c2 mov %eax,%edx
switch ( location ) {
10b685: 83 c4 10 add $0x10,%esp
10b688: 8b 7d e4 mov -0x1c(%ebp),%edi
10b68b: 85 ff test %edi,%edi
10b68d: 0f 85 dd 00 00 00 jne 10b770 <timer_settime+0x164>
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 ) {
10b693: 8b 75 d4 mov -0x2c(%ebp),%esi
10b696: 85 f6 test %esi,%esi
10b698: 75 0b jne 10b6a5 <timer_settime+0x99>
10b69a: 8b 4d d8 mov -0x28(%ebp),%ecx
10b69d: 85 c9 test %ecx,%ecx
10b69f: 0f 84 df 00 00 00 je 10b784 <timer_settime+0x178>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
10b6a5: 83 ec 0c sub $0xc,%esp
10b6a8: 53 push %ebx
10b6a9: 89 55 c0 mov %edx,-0x40(%ebp)
10b6ac: e8 57 38 00 00 call 10ef08 <_Timespec_To_ticks>
10b6b1: 8b 55 c0 mov -0x40(%ebp),%edx
10b6b4: 89 42 64 mov %eax,0x64(%edx)
initial_period = _Timespec_To_ticks( &normalize.it_value );
10b6b7: 8d 45 d4 lea -0x2c(%ebp),%eax
10b6ba: 89 04 24 mov %eax,(%esp)
10b6bd: e8 46 38 00 00 call 10ef08 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
10b6c2: 8b 55 c0 mov -0x40(%ebp),%edx
10b6c5: 89 14 24 mov %edx,(%esp)
10b6c8: 68 f0 b7 10 00 push $0x10b7f0
10b6cd: ff 72 08 pushl 0x8(%edx)
10b6d0: 50 push %eax
10b6d1: 8d 42 10 lea 0x10(%edx),%eax
10b6d4: 50 push %eax
10b6d5: e8 42 61 00 00 call 11181c <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
10b6da: 83 c4 20 add $0x20,%esp
10b6dd: 84 c0 test %al,%al
10b6df: 8b 55 c0 mov -0x40(%ebp),%edx
10b6e2: 0f 84 e8 00 00 00 je 10b7d0 <timer_settime+0x1c4>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
10b6e8: 8b 45 14 mov 0x14(%ebp),%eax
10b6eb: 85 c0 test %eax,%eax
10b6ed: 0f 84 ed 00 00 00 je 10b7e0 <timer_settime+0x1d4>
*ovalue = ptimer->timer_data;
10b6f3: 8d 42 54 lea 0x54(%edx),%eax
10b6f6: b9 04 00 00 00 mov $0x4,%ecx
10b6fb: 8b 7d 14 mov 0x14(%ebp),%edi
10b6fe: 89 c6 mov %eax,%esi
10b700: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ptimer->timer_data = normalize;
10b702: b9 04 00 00 00 mov $0x4,%ecx
10b707: 89 c7 mov %eax,%edi
10b709: 8b 75 c4 mov -0x3c(%ebp),%esi
10b70c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10b70e: c6 42 3c 03 movb $0x3,0x3c(%edx)
_TOD_Get( &ptimer->time );
10b712: 83 ec 0c sub $0xc,%esp
10b715: 83 c2 6c add $0x6c,%edx
10b718: 52 push %edx
10b719: e8 ce 17 00 00 call 10ceec <_TOD_Get>
_Thread_Enable_dispatch();
10b71e: e8 35 2c 00 00 call 10e358 <_Thread_Enable_dispatch>
return 0;
10b723: 83 c4 10 add $0x10,%esp
10b726: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b728: 8d 65 f4 lea -0xc(%ebp),%esp
10b72b: 5b pop %ebx
10b72c: 5e pop %esi
10b72d: 5f pop %edi
10b72e: c9 leave
10b72f: c3 ret
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10b730: 8d 45 cc lea -0x34(%ebp),%eax
10b733: 89 45 c4 mov %eax,-0x3c(%ebp)
10b736: 89 c7 mov %eax,%edi
10b738: 89 de mov %ebx,%esi
10b73a: 8b 4d 0c mov 0xc(%ebp),%ecx
10b73d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
_TOD_Get( &now );
10b73f: 83 ec 0c sub $0xc,%esp
10b742: 8d 75 dc lea -0x24(%ebp),%esi
10b745: 56 push %esi
10b746: e8 a1 17 00 00 call 10ceec <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
10b74b: 59 pop %ecx
10b74c: 5f pop %edi
10b74d: 8d 7d d4 lea -0x2c(%ebp),%edi
10b750: 57 push %edi
10b751: 56 push %esi
10b752: e8 25 37 00 00 call 10ee7c <_Timespec_Greater_than>
10b757: 83 c4 10 add $0x10,%esp
10b75a: 84 c0 test %al,%al
10b75c: 75 12 jne 10b770 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
10b75e: 52 push %edx
10b75f: 57 push %edi
10b760: 57 push %edi
10b761: 56 push %esi
10b762: e8 61 37 00 00 call 10eec8 <_Timespec_Subtract>
10b767: 83 c4 10 add $0x10,%esp
10b76a: e9 02 ff ff ff jmp 10b671 <timer_settime+0x65>
10b76f: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b770: e8 63 89 00 00 call 1140d8 <__errno>
10b775: c7 00 16 00 00 00 movl $0x16,(%eax)
10b77b: b8 ff ff ff ff mov $0xffffffff,%eax
10b780: eb a6 jmp 10b728 <timer_settime+0x11c>
10b782: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
10b784: 83 ec 0c sub $0xc,%esp
10b787: 8d 40 10 lea 0x10(%eax),%eax
10b78a: 50 push %eax
10b78b: 89 55 c0 mov %edx,-0x40(%ebp)
10b78e: e8 a1 3b 00 00 call 10f334 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
10b793: 83 c4 10 add $0x10,%esp
10b796: 8b 55 14 mov 0x14(%ebp),%edx
10b799: 85 d2 test %edx,%edx
10b79b: 8b 55 c0 mov -0x40(%ebp),%edx
10b79e: 74 48 je 10b7e8 <timer_settime+0x1dc>
*ovalue = ptimer->timer_data;
10b7a0: 8d 42 54 lea 0x54(%edx),%eax
10b7a3: b9 04 00 00 00 mov $0x4,%ecx
10b7a8: 8b 7d 14 mov 0x14(%ebp),%edi
10b7ab: 89 c6 mov %eax,%esi
10b7ad: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* The new data are set */
ptimer->timer_data = normalize;
10b7af: b9 04 00 00 00 mov $0x4,%ecx
10b7b4: 89 c7 mov %eax,%edi
10b7b6: 8b 75 c4 mov -0x3c(%ebp),%esi
10b7b9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10b7bb: c6 42 3c 04 movb $0x4,0x3c(%edx)
/* Returns with success */
_Thread_Enable_dispatch();
10b7bf: e8 94 2b 00 00 call 10e358 <_Thread_Enable_dispatch>
return 0;
10b7c4: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b7c6: 8d 65 f4 lea -0xc(%ebp),%esp
10b7c9: 5b pop %ebx
10b7ca: 5e pop %esi
10b7cb: 5f pop %edi
10b7cc: c9 leave
10b7cd: c3 ret
10b7ce: 66 90 xchg %ax,%ax
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
_Thread_Enable_dispatch();
10b7d0: e8 83 2b 00 00 call 10e358 <_Thread_Enable_dispatch>
return 0;
10b7d5: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b7d7: 8d 65 f4 lea -0xc(%ebp),%esp
10b7da: 5b pop %ebx
10b7db: 5e pop %esi
10b7dc: 5f pop %edi
10b7dd: c9 leave
10b7de: c3 ret
10b7df: 90 nop
10b7e0: 8d 42 54 lea 0x54(%edx),%eax
10b7e3: e9 1a ff ff ff jmp 10b702 <timer_settime+0xf6>
10b7e8: 8d 42 54 lea 0x54(%edx),%eax
10b7eb: eb c2 jmp 10b7af <timer_settime+0x1a3>
0010b410 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
10b410: 55 push %ebp
10b411: 89 e5 mov %esp,%ebp
10b413: 56 push %esi
10b414: 53 push %ebx
10b415: 83 ec 10 sub $0x10,%esp
10b418: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
10b41b: 8b 0d 7c 8f 12 00 mov 0x128f7c,%ecx
10b421: 85 c9 test %ecx,%ecx
10b423: 0f 84 8f 00 00 00 je 10b4b8 <ualarm+0xa8>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
10b429: 83 ec 0c sub $0xc,%esp
10b42c: 68 60 8f 12 00 push $0x128f60
10b431: e8 72 3a 00 00 call 10eea8 <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
10b436: 83 e8 02 sub $0x2,%eax
10b439: 83 c4 10 add $0x10,%esp
10b43c: 83 f8 01 cmp $0x1,%eax
10b43f: 0f 86 a3 00 00 00 jbe 10b4e8 <ualarm+0xd8> <== ALWAYS TAKEN
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
10b445: 31 f6 xor %esi,%esi
/*
* 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 ) {
10b447: 85 db test %ebx,%ebx
10b449: 74 62 je 10b4ad <ualarm+0x9d>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
10b44b: ba 83 de 1b 43 mov $0x431bde83,%edx
10b450: 89 d8 mov %ebx,%eax
10b452: f7 e2 mul %edx
10b454: c1 ea 12 shr $0x12,%edx
10b457: 89 55 f0 mov %edx,-0x10(%ebp)
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
10b45a: 8d 04 92 lea (%edx,%edx,4),%eax
10b45d: 8d 04 80 lea (%eax,%eax,4),%eax
10b460: 8d 04 80 lea (%eax,%eax,4),%eax
10b463: 8d 04 80 lea (%eax,%eax,4),%eax
10b466: 8d 04 80 lea (%eax,%eax,4),%eax
10b469: 8d 04 80 lea (%eax,%eax,4),%eax
10b46c: c1 e0 06 shl $0x6,%eax
10b46f: 29 c3 sub %eax,%ebx
10b471: 8d 04 9b lea (%ebx,%ebx,4),%eax
10b474: 8d 04 80 lea (%eax,%eax,4),%eax
10b477: 8d 04 80 lea (%eax,%eax,4),%eax
10b47a: c1 e0 03 shl $0x3,%eax
10b47d: 89 45 f4 mov %eax,-0xc(%ebp)
ticks = _Timespec_To_ticks( &tp );
10b480: 83 ec 0c sub $0xc,%esp
10b483: 8d 5d f0 lea -0x10(%ebp),%ebx
10b486: 53 push %ebx
10b487: e8 78 35 00 00 call 10ea04 <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
10b48c: 89 1c 24 mov %ebx,(%esp)
10b48f: e8 70 35 00 00 call 10ea04 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b494: a3 6c 8f 12 00 mov %eax,0x128f6c
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b499: 58 pop %eax
10b49a: 5a pop %edx
10b49b: 68 60 8f 12 00 push $0x128f60
10b4a0: 68 7c 86 12 00 push $0x12867c
10b4a5: e8 c6 38 00 00 call 10ed70 <_Watchdog_Insert>
10b4aa: 83 c4 10 add $0x10,%esp
}
return remaining;
}
10b4ad: 89 f0 mov %esi,%eax
10b4af: 8d 65 f8 lea -0x8(%ebp),%esp
10b4b2: 5b pop %ebx
10b4b3: 5e pop %esi
10b4b4: c9 leave
10b4b5: c3 ret
10b4b6: 66 90 xchg %ax,%ax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10b4b8: c7 05 68 8f 12 00 00 movl $0x0,0x128f68
10b4bf: 00 00 00
the_watchdog->routine = routine;
10b4c2: c7 05 7c 8f 12 00 d4 movl $0x10b3d4,0x128f7c
10b4c9: b3 10 00
the_watchdog->id = id;
10b4cc: c7 05 80 8f 12 00 00 movl $0x0,0x128f80
10b4d3: 00 00 00
the_watchdog->user_data = user_data;
10b4d6: c7 05 84 8f 12 00 00 movl $0x0,0x128f84
10b4dd: 00 00 00
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
10b4e0: 31 f6 xor %esi,%esi
10b4e2: e9 60 ff ff ff jmp 10b447 <ualarm+0x37>
10b4e7: 90 nop
* 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);
10b4e8: a1 74 8f 12 00 mov 0x128f74,%eax
10b4ed: 03 05 6c 8f 12 00 add 0x128f6c,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10b4f3: 83 ec 08 sub $0x8,%esp
10b4f6: 8d 55 f0 lea -0x10(%ebp),%edx
10b4f9: 52 push %edx
* 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);
10b4fa: 2b 05 78 8f 12 00 sub 0x128f78,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10b500: 50 push %eax
10b501: e8 76 34 00 00 call 10e97c <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
10b506: 8b 45 f0 mov -0x10(%ebp),%eax
10b509: 8d 04 80 lea (%eax,%eax,4),%eax
10b50c: 8d 04 80 lea (%eax,%eax,4),%eax
10b50f: 8d 04 80 lea (%eax,%eax,4),%eax
10b512: 8d 04 80 lea (%eax,%eax,4),%eax
10b515: 8d 04 80 lea (%eax,%eax,4),%eax
10b518: 8d 0c 80 lea (%eax,%eax,4),%ecx
10b51b: c1 e1 06 shl $0x6,%ecx
remaining += tp.tv_nsec / 1000;
10b51e: 8b 75 f4 mov -0xc(%ebp),%esi
10b521: b8 d3 4d 62 10 mov $0x10624dd3,%eax
10b526: f7 ee imul %esi
10b528: 89 d0 mov %edx,%eax
10b52a: c1 f8 06 sar $0x6,%eax
10b52d: c1 fe 1f sar $0x1f,%esi
10b530: 29 f0 sub %esi,%eax
10b532: 8d 34 08 lea (%eax,%ecx,1),%esi
10b535: 83 c4 10 add $0x10,%esp
10b538: e9 0a ff ff ff jmp 10b447 <ualarm+0x37>