RTEMS 4.11Annotated Report
Fri Feb 18 19:23:39 2011
0010be9c <_API_extensions_Run_postdriver>:
*
* _API_extensions_Run_postdriver
*/
void _API_extensions_Run_postdriver( void )
{
10be9c: 55 push %ebp
10be9d: 89 e5 mov %esp,%ebp
10be9f: 53 push %ebx
10bea0: 83 ec 04 sub $0x4,%esp
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10bea3: 8b 1d b8 7f 12 00 mov 0x127fb8,%ebx
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10bea9: 81 fb bc 7f 12 00 cmp $0x127fbc,%ebx
10beaf: 74 10 je 10bec1 <_API_extensions_Run_postdriver+0x25><== NEVER TAKEN
10beb1: 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)();
10beb4: 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 ) {
10beb7: 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 );
10beb9: 81 fb bc 7f 12 00 cmp $0x127fbc,%ebx
10bebf: 75 f3 jne 10beb4 <_API_extensions_Run_postdriver+0x18>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
10bec1: 58 pop %eax
10bec2: 5b pop %ebx
10bec3: c9 leave
10bec4: c3 ret
0010bec8 <_API_extensions_Run_postswitch>:
*
* _API_extensions_Run_postswitch
*/
void _API_extensions_Run_postswitch( void )
{
10bec8: 55 push %ebp
10bec9: 89 e5 mov %esp,%ebp
10becb: 53 push %ebx
10becc: 83 ec 04 sub $0x4,%esp
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10becf: 8b 1d b8 7f 12 00 mov 0x127fb8,%ebx
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
10bed5: 81 fb bc 7f 12 00 cmp $0x127fbc,%ebx
10bedb: 74 1c je 10bef9 <_API_extensions_Run_postswitch+0x31><== NEVER TAKEN
10bedd: 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 );
10bee0: 83 ec 0c sub $0xc,%esp
10bee3: ff 35 38 83 12 00 pushl 0x128338
10bee9: 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 ) {
10beec: 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 );
10beee: 83 c4 10 add $0x10,%esp
10bef1: 81 fb bc 7f 12 00 cmp $0x127fbc,%ebx
10bef7: 75 e7 jne 10bee0 <_API_extensions_Run_postswitch+0x18>
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
10bef9: 8b 5d fc mov -0x4(%ebp),%ebx
10befc: c9 leave
10befd: c3 ret
0010e3e0 <_CORE_RWLock_Obtain_for_reading>:
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
10e3e0: 55 push %ebp
10e3e1: 89 e5 mov %esp,%ebp
10e3e3: 57 push %edi
10e3e4: 56 push %esi
10e3e5: 53 push %ebx
10e3e6: 83 ec 1c sub $0x1c,%esp
10e3e9: 8b 5d 08 mov 0x8(%ebp),%ebx
10e3ec: 8b 7d 0c mov 0xc(%ebp),%edi
10e3ef: 8b 4d 14 mov 0x14(%ebp),%ecx
10e3f2: 8a 55 10 mov 0x10(%ebp),%dl
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e3f5: 8b 35 d8 bc 12 00 mov 0x12bcd8,%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 );
10e3fb: 9c pushf
10e3fc: fa cli
10e3fd: 8f 45 e4 popl -0x1c(%ebp)
switch ( the_rwlock->current_state ) {
10e400: 8b 43 44 mov 0x44(%ebx),%eax
10e403: 85 c0 test %eax,%eax
10e405: 75 1d jne 10e424 <_CORE_RWLock_Obtain_for_reading+0x44>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10e407: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
the_rwlock->number_of_readers += 1;
10e40e: ff 43 48 incl 0x48(%ebx)
_ISR_Enable( level );
10e411: ff 75 e4 pushl -0x1c(%ebp)
10e414: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e415: 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 */
}
10e41c: 8d 65 f4 lea -0xc(%ebp),%esp
10e41f: 5b pop %ebx
10e420: 5e pop %esi
10e421: 5f pop %edi
10e422: c9 leave
10e423: 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 ) {
10e424: 48 dec %eax
10e425: 74 51 je 10e478 <_CORE_RWLock_Obtain_for_reading+0x98>
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
10e427: 84 d2 test %dl,%dl
10e429: 75 15 jne 10e440 <_CORE_RWLock_Obtain_for_reading+0x60>
_ISR_Enable( level );
10e42b: ff 75 e4 pushl -0x1c(%ebp)
10e42e: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e42f: 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 */
}
10e436: 8d 65 f4 lea -0xc(%ebp),%esp
10e439: 5b pop %ebx
10e43a: 5e pop %esi
10e43b: 5f pop %edi
10e43c: c9 leave
10e43d: c3 ret
10e43e: 66 90 xchg %ax,%ax
10e440: 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;
10e447: 89 5e 44 mov %ebx,0x44(%esi)
executing->Wait.id = id;
10e44a: 89 7e 20 mov %edi,0x20(%esi)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_READ;
10e44d: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e454: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
_ISR_Enable( level );
10e45b: ff 75 e4 pushl -0x1c(%ebp)
10e45e: 9d popf
_Thread_queue_Enqueue_with_handler(
10e45f: c7 45 10 e4 e5 10 00 movl $0x10e5e4,0x10(%ebp)
10e466: 89 4d 0c mov %ecx,0xc(%ebp)
10e469: 89 5d 08 mov %ebx,0x8(%ebp)
timeout,
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e46c: 8d 65 f4 lea -0xc(%ebp),%esp
10e46f: 5b pop %ebx
10e470: 5e pop %esi
10e471: 5f pop %edi
10e472: 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(
10e473: e9 1c 1c 00 00 jmp 110094 <_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 );
10e478: 83 ec 0c sub $0xc,%esp
10e47b: 53 push %ebx
10e47c: 88 55 e0 mov %dl,-0x20(%ebp)
10e47f: 89 4d dc mov %ecx,-0x24(%ebp)
10e482: e8 35 1f 00 00 call 1103bc <_Thread_queue_First>
if ( !waiter ) {
10e487: 83 c4 10 add $0x10,%esp
10e48a: 85 c0 test %eax,%eax
10e48c: 8a 55 e0 mov -0x20(%ebp),%dl
10e48f: 8b 4d dc mov -0x24(%ebp),%ecx
10e492: 75 93 jne 10e427 <_CORE_RWLock_Obtain_for_reading+0x47>
the_rwlock->number_of_readers += 1;
10e494: ff 43 48 incl 0x48(%ebx)
_ISR_Enable( level );
10e497: ff 75 e4 pushl -0x1c(%ebp)
10e49a: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e49b: c7 46 34 00 00 00 00 movl $0x0,0x34(%esi)
return;
10e4a2: e9 75 ff ff ff jmp 10e41c <_CORE_RWLock_Obtain_for_reading+0x3c>
0010e4a8 <_CORE_RWLock_Obtain_for_writing>:
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_RWLock_API_mp_support_callout api_rwlock_mp_support
)
{
10e4a8: 55 push %ebp
10e4a9: 89 e5 mov %esp,%ebp
10e4ab: 57 push %edi
10e4ac: 56 push %esi
10e4ad: 53 push %ebx
10e4ae: 83 ec 0c sub $0xc,%esp
10e4b1: 8b 45 08 mov 0x8(%ebp),%eax
10e4b4: 8b 7d 0c mov 0xc(%ebp),%edi
10e4b7: 8b 75 14 mov 0x14(%ebp),%esi
10e4ba: 8a 5d 10 mov 0x10(%ebp),%bl
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e4bd: 8b 15 d8 bc 12 00 mov 0x12bcd8,%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 );
10e4c3: 9c pushf
10e4c4: fa cli
10e4c5: 59 pop %ecx
switch ( the_rwlock->current_state ) {
10e4c6: 83 78 44 00 cmpl $0x0,0x44(%eax)
10e4ca: 75 18 jne 10e4e4 <_CORE_RWLock_Obtain_for_writing+0x3c>
case CORE_RWLOCK_UNLOCKED:
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
10e4cc: c7 40 44 02 00 00 00 movl $0x2,0x44(%eax)
_ISR_Enable( level );
10e4d3: 51 push %ecx
10e4d4: 9d popf
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e4d5: 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 */
}
10e4dc: 83 c4 0c add $0xc,%esp
10e4df: 5b pop %ebx
10e4e0: 5e pop %esi
10e4e1: 5f pop %edi
10e4e2: c9 leave
10e4e3: c3 ret
/*
* If the thread is not willing to wait, then return immediately.
*/
if ( !wait ) {
10e4e4: 84 db test %bl,%bl
10e4e6: 75 14 jne 10e4fc <_CORE_RWLock_Obtain_for_writing+0x54>
_ISR_Enable( level );
10e4e8: 51 push %ecx
10e4e9: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e4ea: 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 */
}
10e4f1: 83 c4 0c add $0xc,%esp
10e4f4: 5b pop %ebx
10e4f5: 5e pop %esi
10e4f6: 5f pop %edi
10e4f7: c9 leave
10e4f8: c3 ret
10e4f9: 8d 76 00 lea 0x0(%esi),%esi
10e4fc: 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;
10e503: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
10e506: 89 7a 20 mov %edi,0x20(%edx)
executing->Wait.option = CORE_RWLOCK_THREAD_WAITING_FOR_WRITE;
10e509: c7 42 30 01 00 00 00 movl $0x1,0x30(%edx)
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e510: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_ISR_Enable( level );
10e517: 51 push %ecx
10e518: 9d popf
_Thread_queue_Enqueue_with_handler(
10e519: c7 45 10 e4 e5 10 00 movl $0x10e5e4,0x10(%ebp)
10e520: 89 75 0c mov %esi,0xc(%ebp)
10e523: 89 45 08 mov %eax,0x8(%ebp)
_CORE_RWLock_Timeout
);
/* return to API level so it can dispatch and we block */
}
10e526: 83 c4 0c add $0xc,%esp
10e529: 5b pop %ebx
10e52a: 5e pop %esi
10e52b: 5f pop %edi
10e52c: 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(
10e52d: e9 62 1b 00 00 jmp 110094 <_Thread_queue_Enqueue_with_handler>
0010e534 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
10e534: 55 push %ebp
10e535: 89 e5 mov %esp,%ebp
10e537: 53 push %ebx
10e538: 83 ec 04 sub $0x4,%esp
10e53b: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
10e53e: 8b 0d d8 bc 12 00 mov 0x12bcd8,%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 );
10e544: 9c pushf
10e545: fa cli
10e546: 5a pop %edx
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
10e547: 8b 43 44 mov 0x44(%ebx),%eax
10e54a: 85 c0 test %eax,%eax
10e54c: 74 7a je 10e5c8 <_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 ) {
10e54e: 48 dec %eax
10e54f: 74 63 je 10e5b4 <_CORE_RWLock_Release+0x80>
return CORE_RWLOCK_SUCCESSFUL;
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
10e551: 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;
10e558: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
_ISR_Enable( level );
10e55f: 52 push %edx
10e560: 9d popf
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
10e561: 83 ec 0c sub $0xc,%esp
10e564: 53 push %ebx
10e565: e8 02 1a 00 00 call 10ff6c <_Thread_queue_Dequeue>
if ( next ) {
10e56a: 83 c4 10 add $0x10,%esp
10e56d: 85 c0 test %eax,%eax
10e56f: 74 39 je 10e5aa <_CORE_RWLock_Release+0x76>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
10e571: 83 78 30 01 cmpl $0x1,0x30(%eax)
10e575: 74 61 je 10e5d8 <_CORE_RWLock_Release+0xa4>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
10e577: ff 43 48 incl 0x48(%ebx)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
10e57a: c7 43 44 01 00 00 00 movl $0x1,0x44(%ebx)
10e581: eb 17 jmp 10e59a <_CORE_RWLock_Release+0x66>
10e583: 90 nop
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
10e584: 83 78 30 01 cmpl $0x1,0x30(%eax)
10e588: 74 20 je 10e5aa <_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;
10e58a: ff 43 48 incl 0x48(%ebx)
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
10e58d: 83 ec 08 sub $0x8,%esp
10e590: 50 push %eax
10e591: 53 push %ebx
10e592: e8 0d 1d 00 00 call 1102a4 <_Thread_queue_Extract>
}
10e597: 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 );
10e59a: 83 ec 0c sub $0xc,%esp
10e59d: 53 push %ebx
10e59e: e8 19 1e 00 00 call 1103bc <_Thread_queue_First>
if ( !next ||
10e5a3: 83 c4 10 add $0x10,%esp
10e5a6: 85 c0 test %eax,%eax
10e5a8: 75 da jne 10e584 <_CORE_RWLock_Release+0x50>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5aa: 31 c0 xor %eax,%eax
10e5ac: 8b 5d fc mov -0x4(%ebp),%ebx
10e5af: c9 leave
10e5b0: c3 ret
10e5b1: 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;
10e5b4: 8b 43 48 mov 0x48(%ebx),%eax
10e5b7: 48 dec %eax
10e5b8: 89 43 48 mov %eax,0x48(%ebx)
if ( the_rwlock->number_of_readers != 0 ) {
10e5bb: 85 c0 test %eax,%eax
10e5bd: 74 92 je 10e551 <_CORE_RWLock_Release+0x1d>
/* must be unlocked again */
_ISR_Enable( level );
10e5bf: 52 push %edx
10e5c0: 9d popf
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5c1: 31 c0 xor %eax,%eax
10e5c3: 8b 5d fc mov -0x4(%ebp),%ebx
10e5c6: c9 leave
10e5c7: c3 ret
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
10e5c8: 52 push %edx
10e5c9: 9d popf
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
10e5ca: c7 41 34 02 00 00 00 movl $0x2,0x34(%ecx)
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
10e5d1: 31 c0 xor %eax,%eax
10e5d3: 8b 5d fc mov -0x4(%ebp),%ebx
10e5d6: c9 leave
10e5d7: 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;
10e5d8: c7 43 44 02 00 00 00 movl $0x2,0x44(%ebx)
return CORE_RWLOCK_SUCCESSFUL;
10e5df: eb c9 jmp 10e5aa <_CORE_RWLock_Release+0x76>
0010e5e4 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
10e5e4: 55 push %ebp
10e5e5: 89 e5 mov %esp,%ebp
10e5e7: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10e5ea: 8d 45 f4 lea -0xc(%ebp),%eax
10e5ed: 50 push %eax
10e5ee: ff 75 08 pushl 0x8(%ebp)
10e5f1: e8 1e 16 00 00 call 10fc14 <_Thread_Get>
switch ( location ) {
10e5f6: 83 c4 10 add $0x10,%esp
10e5f9: 8b 55 f4 mov -0xc(%ebp),%edx
10e5fc: 85 d2 test %edx,%edx
10e5fe: 75 17 jne 10e617 <_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 );
10e600: 83 ec 0c sub $0xc,%esp
10e603: 50 push %eax
10e604: e8 93 1e 00 00 call 11049c <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10e609: a1 30 b7 12 00 mov 0x12b730,%eax
10e60e: 48 dec %eax
10e60f: a3 30 b7 12 00 mov %eax,0x12b730
10e614: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10e617: c9 leave
10e618: c3 ret
001198dc <_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
)
{
1198dc: 55 push %ebp
1198dd: 89 e5 mov %esp,%ebp
1198df: 57 push %edi
1198e0: 56 push %esi
1198e1: 53 push %ebx
1198e2: 83 ec 1c sub $0x1c,%esp
1198e5: 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 ) {
1198e8: 8b 45 10 mov 0x10(%ebp),%eax
1198eb: 39 43 4c cmp %eax,0x4c(%ebx)
1198ee: 72 60 jb 119950 <_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 ) {
1198f0: 8b 43 48 mov 0x48(%ebx),%eax
1198f3: 85 c0 test %eax,%eax
1198f5: 75 45 jne 11993c <_CORE_message_queue_Broadcast+0x60>
1198f7: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
1198fe: eb 18 jmp 119918 <_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;
119900: ff 45 e4 incl -0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
119903: 8b 42 2c mov 0x2c(%edx),%eax
119906: 89 c7 mov %eax,%edi
119908: 8b 75 0c mov 0xc(%ebp),%esi
11990b: 8b 4d 10 mov 0x10(%ebp),%ecx
11990e: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
119910: 8b 42 28 mov 0x28(%edx),%eax
119913: 8b 55 10 mov 0x10(%ebp),%edx
119916: 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 =
119918: 83 ec 0c sub $0xc,%esp
11991b: 53 push %ebx
11991c: e8 af 28 00 00 call 11c1d0 <_Thread_queue_Dequeue>
119921: 89 c2 mov %eax,%edx
119923: 83 c4 10 add $0x10,%esp
119926: 85 c0 test %eax,%eax
119928: 75 d6 jne 119900 <_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;
11992a: 8b 55 e4 mov -0x1c(%ebp),%edx
11992d: 8b 45 1c mov 0x1c(%ebp),%eax
119930: 89 10 mov %edx,(%eax)
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
119932: 31 c0 xor %eax,%eax
}
119934: 8d 65 f4 lea -0xc(%ebp),%esp
119937: 5b pop %ebx
119938: 5e pop %esi
119939: 5f pop %edi
11993a: c9 leave
11993b: 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;
11993c: 8b 55 1c mov 0x1c(%ebp),%edx
11993f: c7 02 00 00 00 00 movl $0x0,(%edx)
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
119945: 31 c0 xor %eax,%eax
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
119947: 8d 65 f4 lea -0xc(%ebp),%esp
11994a: 5b pop %ebx
11994b: 5e pop %esi
11994c: 5f pop %edi
11994d: c9 leave
11994e: c3 ret
11994f: 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;
119950: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
119955: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
119958: 5b pop %ebx <== NOT EXECUTED
119959: 5e pop %esi <== NOT EXECUTED
11995a: 5f pop %edi <== NOT EXECUTED
11995b: c9 leave <== NOT EXECUTED
11995c: c3 ret <== NOT EXECUTED
00114a1c <_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
)
{
114a1c: 55 push %ebp
114a1d: 89 e5 mov %esp,%ebp
114a1f: 57 push %edi
114a20: 56 push %esi
114a21: 53 push %ebx
114a22: 83 ec 0c sub $0xc,%esp
114a25: 8b 5d 08 mov 0x8(%ebp),%ebx
114a28: 8b 75 10 mov 0x10(%ebp),%esi
114a2b: 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;
114a2e: 89 73 44 mov %esi,0x44(%ebx)
the_message_queue->number_of_pending_messages = 0;
114a31: c7 43 48 00 00 00 00 movl $0x0,0x48(%ebx)
the_message_queue->maximum_message_size = maximum_message_size;
114a38: 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;
114a3b: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx)
the_message_queue->notify_argument = the_argument;
114a42: 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)) {
114a49: a8 03 test $0x3,%al
114a4b: 74 17 je 114a64 <_CORE_message_queue_Initialize+0x48>
allocated_message_size += sizeof(uint32_t);
114a4d: 8d 50 04 lea 0x4(%eax),%edx
allocated_message_size &= ~(sizeof(uint32_t) - 1);
114a50: 83 e2 fc and $0xfffffffc,%edx
}
if (allocated_message_size < maximum_message_size)
114a53: 39 d0 cmp %edx,%eax
114a55: 76 0f jbe 114a66 <_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;
114a57: 31 c0 xor %eax,%eax
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
114a59: 8d 65 f4 lea -0xc(%ebp),%esp
114a5c: 5b pop %ebx
114a5d: 5e pop %esi
114a5e: 5f pop %edi
114a5f: c9 leave
114a60: c3 ret
114a61: 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)) {
114a64: 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));
114a66: 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 *
114a69: 89 f8 mov %edi,%eax
114a6b: 0f af c6 imul %esi,%eax
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
114a6e: 39 d0 cmp %edx,%eax
114a70: 72 e5 jb 114a57 <_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 );
114a72: 83 ec 0c sub $0xc,%esp
114a75: 50 push %eax
114a76: e8 4d 2b 00 00 call 1175c8 <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
114a7b: 89 43 5c mov %eax,0x5c(%ebx)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
114a7e: 83 c4 10 add $0x10,%esp
114a81: 85 c0 test %eax,%eax
114a83: 74 d2 je 114a57 <_CORE_message_queue_Initialize+0x3b>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
114a85: 57 push %edi
114a86: 56 push %esi
114a87: 50 push %eax
114a88: 8d 43 68 lea 0x68(%ebx),%eax
114a8b: 50 push %eax
114a8c: e8 47 52 00 00 call 119cd8 <_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 );
114a91: 8d 43 54 lea 0x54(%ebx),%eax
114a94: 89 43 50 mov %eax,0x50(%ebx)
head->next = tail;
head->previous = NULL;
114a97: 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 );
114a9e: 8d 43 50 lea 0x50(%ebx),%eax
114aa1: 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(
114aa4: 6a 06 push $0x6
114aa6: 68 80 00 00 00 push $0x80
114aab: 8b 45 0c mov 0xc(%ebp),%eax
114aae: 83 38 01 cmpl $0x1,(%eax)
114ab1: 0f 94 c0 sete %al
114ab4: 0f b6 c0 movzbl %al,%eax
114ab7: 50 push %eax
114ab8: 53 push %ebx
114ab9: e8 3e 22 00 00 call 116cfc <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
114abe: 83 c4 20 add $0x20,%esp
114ac1: b0 01 mov $0x1,%al
}
114ac3: 8d 65 f4 lea -0xc(%ebp),%esp
114ac6: 5b pop %ebx
114ac7: 5e pop %esi
114ac8: 5f pop %edi
114ac9: c9 leave
114aca: c3 ret
001110e0 <_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
)
{
1110e0: 55 push %ebp
1110e1: 89 e5 mov %esp,%ebp
1110e3: 56 push %esi
1110e4: 53 push %ebx
1110e5: 83 ec 10 sub $0x10,%esp
1110e8: 8b 45 08 mov 0x8(%ebp),%eax
1110eb: 8b 55 0c mov 0xc(%ebp),%edx
1110ee: 8b 4d 10 mov 0x10(%ebp),%ecx
1110f1: 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 ) {
1110f4: 81 f9 ff ff ff 7f cmp $0x7fffffff,%ecx
1110fa: 74 70 je 11116c <_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 ) {
1110fc: 81 f9 00 00 00 80 cmp $0x80000000,%ecx
111102: 0f 84 88 00 00 00 je 111190 <_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
}
111108: 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));
11110b: 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 ) ) {
11110e: 39 de cmp %ebx,%esi
111110: 74 05 je 111117 <_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 ) {
111112: 3b 4b 08 cmp 0x8(%ebx),%ecx
111115: 7d 45 jge 11115c <_CORE_message_queue_Insert_message+0x7c>
the_node = the_node->next;
continue;
}
break;
}
_ISR_Disable( level );
111117: 9c pushf
111118: fa cli
111119: 5e pop %esi
SET_NOTIFY();
11111a: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
11111d: 85 c9 test %ecx,%ecx
11111f: 0f 94 45 f7 sete -0x9(%ebp)
}
break;
}
_ISR_Disable( level );
SET_NOTIFY();
the_message_queue->number_of_pending_messages++;
111123: 41 inc %ecx
111124: 89 48 48 mov %ecx,0x48(%eax)
_Chain_Insert_unprotected( the_node->previous, &the_message->Node );
111127: 8b 4b 04 mov 0x4(%ebx),%ecx
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
11112a: 89 4a 04 mov %ecx,0x4(%edx)
before_node = after_node->next;
11112d: 8b 19 mov (%ecx),%ebx
after_node->next = the_node;
11112f: 89 11 mov %edx,(%ecx)
the_node->next = before_node;
111131: 89 1a mov %ebx,(%edx)
before_node->previous = the_node;
111133: 89 53 04 mov %edx,0x4(%ebx)
_ISR_Enable( level );
111136: 56 push %esi
111137: 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 )
111138: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
11113c: 74 16 je 111154 <_CORE_message_queue_Insert_message+0x74>
11113e: 8b 50 60 mov 0x60(%eax),%edx
111141: 85 d2 test %edx,%edx
111143: 74 0f je 111154 <_CORE_message_queue_Insert_message+0x74>
(*the_message_queue->notify_handler)(the_message_queue->notify_argument);
111145: 8b 40 64 mov 0x64(%eax),%eax
111148: 89 45 08 mov %eax,0x8(%ebp)
#endif
}
11114b: 83 c4 10 add $0x10,%esp
11114e: 5b pop %ebx
11114f: 5e pop %esi
111150: 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);
111151: ff e2 jmp *%edx
111153: 90 nop
#endif
}
111154: 83 c4 10 add $0x10,%esp
111157: 5b pop %ebx
111158: 5e pop %esi
111159: c9 leave
11115a: c3 ret
11115b: 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;
11115c: 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 ) ) {
11115e: 39 de cmp %ebx,%esi
111160: 74 b5 je 111117 <_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 ) {
111162: 3b 4b 08 cmp 0x8(%ebx),%ecx
111165: 7c b0 jl 111117 <_CORE_message_queue_Insert_message+0x37>
111167: eb f3 jmp 11115c <_CORE_message_queue_Insert_message+0x7c>
111169: 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 );
11116c: 9c pushf
11116d: fa cli
11116e: 5b pop %ebx
SET_NOTIFY();
11116f: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
111172: 85 c9 test %ecx,%ecx
111174: 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++;
111178: 41 inc %ecx
111179: 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;
11117c: 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 );
11117f: 8d 70 54 lea 0x54(%eax),%esi
111182: 89 32 mov %esi,(%edx)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
111184: 89 50 58 mov %edx,0x58(%eax)
old_last->next = the_node;
111187: 89 11 mov %edx,(%ecx)
the_node->previous = old_last;
111189: 89 4a 04 mov %ecx,0x4(%edx)
_CORE_message_queue_Append_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
11118c: 53 push %ebx
11118d: 9d popf
11118e: eb a8 jmp 111138 <_CORE_message_queue_Insert_message+0x58>
} else if ( submit_type == CORE_MESSAGE_QUEUE_URGENT_REQUEST ) {
_ISR_Disable( level );
111190: 9c pushf
111191: fa cli
111192: 5b pop %ebx
SET_NOTIFY();
111193: 8b 48 48 mov 0x48(%eax),%ecx
*
* INTERRUPT LATENCY:
* insert
*/
void _CORE_message_queue_Insert_message(
111196: 85 c9 test %ecx,%ecx
111198: 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++;
11119c: 41 inc %ecx
11119d: 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);
1111a0: 8d 48 50 lea 0x50(%eax),%ecx
1111a3: 89 4a 04 mov %ecx,0x4(%edx)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
1111a6: 8b 48 50 mov 0x50(%eax),%ecx
after_node->next = the_node;
1111a9: 89 50 50 mov %edx,0x50(%eax)
the_node->next = before_node;
1111ac: 89 0a mov %ecx,(%edx)
before_node->previous = the_node;
1111ae: 89 51 04 mov %edx,0x4(%ecx)
_CORE_message_queue_Prepend_unprotected(the_message_queue, the_message);
_ISR_Enable( level );
1111b1: 53 push %ebx
1111b2: 9d popf
1111b3: eb 83 jmp 111138 <_CORE_message_queue_Insert_message+0x58>
00114acc <_CORE_message_queue_Seize>:
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
114acc: 55 push %ebp
114acd: 89 e5 mov %esp,%ebp
114acf: 57 push %edi
114ad0: 56 push %esi
114ad1: 53 push %ebx
114ad2: 83 ec 2c sub $0x2c,%esp
114ad5: 8b 55 08 mov 0x8(%ebp),%edx
114ad8: 8b 45 0c mov 0xc(%ebp),%eax
114adb: 89 45 dc mov %eax,-0x24(%ebp)
114ade: 8b 4d 10 mov 0x10(%ebp),%ecx
114ae1: 89 4d e0 mov %ecx,-0x20(%ebp)
114ae4: 8b 45 14 mov 0x14(%ebp),%eax
114ae7: 8b 5d 1c mov 0x1c(%ebp),%ebx
114aea: 89 5d d8 mov %ebx,-0x28(%ebp)
114aed: 0f b6 7d 18 movzbl 0x18(%ebp),%edi
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
114af1: 8b 0d d8 0c 13 00 mov 0x130cd8,%ecx
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
114af7: c7 41 34 00 00 00 00 movl $0x0,0x34(%ecx)
_ISR_Disable( level );
114afe: 9c pushf
114aff: fa cli
114b00: 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 );
}
114b03: 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 );
114b06: 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))
114b09: 39 f3 cmp %esi,%ebx
114b0b: 74 7b je 114b88 <_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;
114b0d: 8b 0b mov (%ebx),%ecx
head->next = new_first;
114b0f: 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 );
114b12: 8d 72 50 lea 0x50(%edx),%esi
114b15: 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;
114b18: ff 4a 48 decl 0x48(%edx)
_ISR_Enable( level );
114b1b: ff 75 e4 pushl -0x1c(%ebp)
114b1e: 9d popf
*size_p = the_message->Contents.size;
114b1f: 8b 4b 0c mov 0xc(%ebx),%ecx
114b22: 89 08 mov %ecx,(%eax)
_Thread_Executing->Wait.count =
114b24: 8b 73 08 mov 0x8(%ebx),%esi
114b27: 8b 0d d8 0c 13 00 mov 0x130cd8,%ecx
114b2d: 89 71 24 mov %esi,0x24(%ecx)
_CORE_message_queue_Get_message_priority( the_message );
_CORE_message_queue_Copy_buffer(
the_message->Contents.buffer,
114b30: 8d 4b 10 lea 0x10(%ebx),%ecx
114b33: 89 4d e4 mov %ecx,-0x1c(%ebp)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
114b36: 8b 08 mov (%eax),%ecx
114b38: 8b 7d e0 mov -0x20(%ebp),%edi
114b3b: 8b 75 e4 mov -0x1c(%ebp),%esi
114b3e: 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 );
114b40: 83 ec 0c sub $0xc,%esp
114b43: 52 push %edx
114b44: 89 55 d4 mov %edx,-0x2c(%ebp)
114b47: e8 20 1e 00 00 call 11696c <_Thread_queue_Dequeue>
if ( !the_thread ) {
114b4c: 83 c4 10 add $0x10,%esp
114b4f: 85 c0 test %eax,%eax
114b51: 8b 55 d4 mov -0x2c(%ebp),%edx
114b54: 0f 84 86 00 00 00 je 114be0 <_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;
114b5a: 8b 48 24 mov 0x24(%eax),%ecx
114b5d: 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;
114b60: 8b 48 30 mov 0x30(%eax),%ecx
114b63: 89 4b 0c mov %ecx,0xc(%ebx)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
114b66: 8b 70 2c mov 0x2c(%eax),%esi
114b69: 8b 7d e4 mov -0x1c(%ebp),%edi
114b6c: 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(
114b6e: 8b 43 08 mov 0x8(%ebx),%eax
114b71: 89 45 10 mov %eax,0x10(%ebp)
114b74: 89 5d 0c mov %ebx,0xc(%ebp)
114b77: 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 );
}
114b7a: 8d 65 f4 lea -0xc(%ebp),%esp
114b7d: 5b pop %ebx
114b7e: 5e pop %esi
114b7f: 5f pop %edi
114b80: c9 leave
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
114b81: e9 ae 51 00 00 jmp 119d34 <_CORE_message_queue_Insert_message>
114b86: 66 90 xchg %ax,%ax
return;
}
#endif
}
if ( !wait ) {
114b88: 89 fb mov %edi,%ebx
114b8a: 84 db test %bl,%bl
114b8c: 75 16 jne 114ba4 <_CORE_message_queue_Seize+0xd8>
_ISR_Enable( level );
114b8e: ff 75 e4 pushl -0x1c(%ebp)
114b91: 9d popf
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
114b92: 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 );
}
114b99: 8d 65 f4 lea -0xc(%ebp),%esp
114b9c: 5b pop %ebx
114b9d: 5e pop %esi
114b9e: 5f pop %edi
114b9f: c9 leave
114ba0: c3 ret
114ba1: 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;
114ba4: 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;
114bab: 89 51 44 mov %edx,0x44(%ecx)
executing->Wait.id = id;
114bae: 8b 5d dc mov -0x24(%ebp),%ebx
114bb1: 89 59 20 mov %ebx,0x20(%ecx)
executing->Wait.return_argument_second.mutable_object = buffer;
114bb4: 8b 5d e0 mov -0x20(%ebp),%ebx
114bb7: 89 59 2c mov %ebx,0x2c(%ecx)
executing->Wait.return_argument = size_p;
114bba: 89 41 28 mov %eax,0x28(%ecx)
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
114bbd: ff 75 e4 pushl -0x1c(%ebp)
114bc0: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
114bc1: c7 45 10 c0 6d 11 00 movl $0x116dc0,0x10(%ebp)
114bc8: 8b 45 d8 mov -0x28(%ebp),%eax
114bcb: 89 45 0c mov %eax,0xc(%ebp)
114bce: 89 55 08 mov %edx,0x8(%ebp)
}
114bd1: 8d 65 f4 lea -0xc(%ebp),%esp
114bd4: 5b pop %ebx
114bd5: 5e pop %esi
114bd6: 5f pop %edi
114bd7: 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 );
114bd8: e9 b7 1e 00 00 jmp 116a94 <_Thread_queue_Enqueue_with_handler>
114bdd: 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 );
114be0: 89 5d 0c mov %ebx,0xc(%ebp)
114be3: 83 c2 68 add $0x68,%edx
114be6: 89 55 08 mov %edx,0x8(%ebp)
}
114be9: 8d 65 f4 lea -0xc(%ebp),%esp
114bec: 5b pop %ebx
114bed: 5e pop %esi
114bee: 5f pop %edi
114bef: c9 leave
114bf0: e9 a7 fd ff ff jmp 11499c <_Chain_Append>
0010c038 <_CORE_message_queue_Submit>:
#endif
CORE_message_queue_Submit_types submit_type,
bool wait,
Watchdog_Interval timeout
)
{
10c038: 55 push %ebp
10c039: 89 e5 mov %esp,%ebp
10c03b: 57 push %edi
10c03c: 56 push %esi
10c03d: 53 push %ebx
10c03e: 83 ec 1c sub $0x1c,%esp
10c041: 8b 5d 08 mov 0x8(%ebp),%ebx
10c044: 8b 75 0c mov 0xc(%ebp),%esi
10c047: 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 ) {
10c04a: 8b 45 10 mov 0x10(%ebp),%eax
10c04d: 39 43 4c cmp %eax,0x4c(%ebx)
10c050: 72 32 jb 10c084 <_CORE_message_queue_Submit+0x4c>
}
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
10c052: 8b 43 48 mov 0x48(%ebx),%eax
10c055: 85 c0 test %eax,%eax
10c057: 74 3b je 10c094 <_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 <
10c059: 39 43 44 cmp %eax,0x44(%ebx)
10c05c: 0f 87 ba 00 00 00 ja 10c11c <_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 ) {
10c062: 84 c9 test %cl,%cl
10c064: 0f 84 ee 00 00 00 je 10c158 <_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() ) {
10c06a: 8b 15 34 83 12 00 mov 0x128334,%edx
10c070: 85 d2 test %edx,%edx
10c072: 74 60 je 10c0d4 <_CORE_message_queue_Submit+0x9c>
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
10c074: 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
}
10c079: 8d 65 f4 lea -0xc(%ebp),%esp
10c07c: 5b pop %ebx
10c07d: 5e pop %esi
10c07e: 5f pop %edi
10c07f: c9 leave
10c080: c3 ret
10c081: 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;
10c084: 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
}
10c089: 8d 65 f4 lea -0xc(%ebp),%esp
10c08c: 5b pop %ebx
10c08d: 5e pop %esi
10c08e: 5f pop %edi
10c08f: c9 leave
10c090: c3 ret
10c091: 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 );
10c094: 83 ec 0c sub $0xc,%esp
10c097: 53 push %ebx
10c098: 88 4d e4 mov %cl,-0x1c(%ebp)
10c09b: e8 8c 1c 00 00 call 10dd2c <_Thread_queue_Dequeue>
10c0a0: 89 c2 mov %eax,%edx
if ( the_thread ) {
10c0a2: 83 c4 10 add $0x10,%esp
10c0a5: 85 c0 test %eax,%eax
10c0a7: 8a 4d e4 mov -0x1c(%ebp),%cl
10c0aa: 0f 84 b8 00 00 00 je 10c168 <_CORE_message_queue_Submit+0x130>
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
10c0b0: 8b 40 2c mov 0x2c(%eax),%eax
10c0b3: 89 c7 mov %eax,%edi
10c0b5: 8b 4d 10 mov 0x10(%ebp),%ecx
10c0b8: 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;
10c0ba: 8b 42 28 mov 0x28(%edx),%eax
10c0bd: 8b 4d 10 mov 0x10(%ebp),%ecx
10c0c0: 89 08 mov %ecx,(%eax)
the_thread->Wait.count = (uint32_t) submit_type;
10c0c2: 8b 45 1c mov 0x1c(%ebp),%eax
10c0c5: 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;
10c0c8: 31 c0 xor %eax,%eax
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
10c0ca: 8d 65 f4 lea -0xc(%ebp),%esp
10c0cd: 5b pop %ebx
10c0ce: 5e pop %esi
10c0cf: 5f pop %edi
10c0d0: c9 leave
10c0d1: c3 ret
10c0d2: 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;
10c0d4: a1 38 83 12 00 mov 0x128338,%eax
ISR_Level level;
_ISR_Disable( level );
10c0d9: 9c pushf
10c0da: fa cli
10c0db: 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;
10c0dc: 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;
10c0e3: 89 58 44 mov %ebx,0x44(%eax)
executing->Wait.id = id;
10c0e6: 8b 55 14 mov 0x14(%ebp),%edx
10c0e9: 89 50 20 mov %edx,0x20(%eax)
executing->Wait.return_argument_second.immutable_object = buffer;
10c0ec: 89 70 2c mov %esi,0x2c(%eax)
executing->Wait.option = (uint32_t) size;
10c0ef: 8b 55 10 mov 0x10(%ebp),%edx
10c0f2: 89 50 30 mov %edx,0x30(%eax)
executing->Wait.count = submit_type;
10c0f5: 8b 55 1c mov 0x1c(%ebp),%edx
10c0f8: 89 50 24 mov %edx,0x24(%eax)
_ISR_Enable( level );
10c0fb: 51 push %ecx
10c0fc: 9d popf
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
10c0fd: 50 push %eax
10c0fe: 68 80 e1 10 00 push $0x10e180
10c103: ff 75 24 pushl 0x24(%ebp)
10c106: 53 push %ebx
10c107: e8 48 1d 00 00 call 10de54 <_Thread_queue_Enqueue_with_handler>
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
10c10c: 83 c4 10 add $0x10,%esp
10c10f: b8 07 00 00 00 mov $0x7,%eax
#endif
}
10c114: 8d 65 f4 lea -0xc(%ebp),%esp
10c117: 5b pop %ebx
10c118: 5e pop %esi
10c119: 5f pop %edi
10c11a: c9 leave
10c11b: 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 );
10c11c: 83 ec 0c sub $0xc,%esp
10c11f: 8d 43 68 lea 0x68(%ebx),%eax
10c122: 50 push %eax
10c123: e8 ec fe ff ff call 10c014 <_Chain_Get>
10c128: 89 c2 mov %eax,%edx
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
#endif
_CORE_message_queue_Copy_buffer(
buffer,
the_message->Contents.buffer,
10c12a: 8d 40 10 lea 0x10(%eax),%eax
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
10c12d: 89 c7 mov %eax,%edi
10c12f: 8b 4d 10 mov 0x10(%ebp),%ecx
10c132: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
size
);
the_message->Contents.size = size;
10c134: 8b 4d 10 mov 0x10(%ebp),%ecx
10c137: 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;
10c13a: 8b 45 1c mov 0x1c(%ebp),%eax
10c13d: 89 42 08 mov %eax,0x8(%edx)
_CORE_message_queue_Set_message_priority( the_message, submit_type );
_CORE_message_queue_Insert_message(
10c140: 83 c4 0c add $0xc,%esp
10c143: 50 push %eax
10c144: 52 push %edx
10c145: 53 push %ebx
10c146: e8 95 4f 00 00 call 1110e0 <_CORE_message_queue_Insert_message>
the_message_queue,
the_message,
submit_type
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
10c14b: 83 c4 10 add $0x10,%esp
10c14e: 31 c0 xor %eax,%eax
10c150: e9 34 ff ff ff jmp 10c089 <_CORE_message_queue_Submit+0x51>
10c155: 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;
10c158: 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
}
10c15d: 8d 65 f4 lea -0xc(%ebp),%esp
10c160: 5b pop %ebx
10c161: 5e pop %esi
10c162: 5f pop %edi
10c163: c9 leave
10c164: c3 ret
10c165: 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 ) {
10c168: 8b 43 48 mov 0x48(%ebx),%eax
10c16b: e9 e9 fe ff ff jmp 10c059 <_CORE_message_queue_Submit+0x21>
0010c17c <_CORE_mutex_Initialize>:
CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex,
CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock
)
{
10c17c: 55 push %ebp
10c17d: 89 e5 mov %esp,%ebp
10c17f: 57 push %edi
10c180: 56 push %esi
10c181: 53 push %ebx
10c182: 83 ec 0c sub $0xc,%esp
10c185: 8b 45 08 mov 0x8(%ebp),%eax
10c188: 8b 5d 0c mov 0xc(%ebp),%ebx
10c18b: 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;
10c18e: 8d 78 40 lea 0x40(%eax),%edi
10c191: b9 04 00 00 00 mov $0x4,%ecx
10c196: 89 de mov %ebx,%esi
10c198: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_mutex->lock = initial_lock;
10c19a: 89 50 50 mov %edx,0x50(%eax)
the_mutex->blocked_count = 0;
10c19d: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax)
if ( initial_lock == CORE_MUTEX_LOCKED ) {
10c1a4: 85 d2 test %edx,%edx
10c1a6: 75 30 jne 10c1d8 <_CORE_mutex_Initialize+0x5c>
the_mutex->nest_count = 1;
10c1a8: c7 40 54 01 00 00 00 movl $0x1,0x54(%eax)
the_mutex->holder = _Thread_Executing;
10c1af: 8b 15 38 83 12 00 mov 0x128338,%edx
10c1b5: 89 50 5c mov %edx,0x5c(%eax)
the_mutex->holder_id = _Thread_Executing->Object.id;
10c1b8: 8b 4a 08 mov 0x8(%edx),%ecx
10c1bb: 89 48 60 mov %ecx,0x60(%eax)
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c1be: 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 ) ||
10c1c1: 83 f9 02 cmp $0x2,%ecx
10c1c4: 74 05 je 10c1cb <_CORE_mutex_Initialize+0x4f>
10c1c6: 83 f9 03 cmp $0x3,%ecx
10c1c9: 75 22 jne 10c1ed <_CORE_mutex_Initialize+0x71>
_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
if ( _Thread_Executing->current_priority <
10c1cb: 8b 48 4c mov 0x4c(%eax),%ecx
10c1ce: 39 4a 14 cmp %ecx,0x14(%edx)
10c1d1: 72 41 jb 10c214 <_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++;
10c1d3: ff 42 1c incl 0x1c(%edx)
10c1d6: eb 15 jmp 10c1ed <_CORE_mutex_Initialize+0x71>
}
} else {
the_mutex->nest_count = 0;
10c1d8: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
the_mutex->holder = NULL;
10c1df: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
the_mutex->holder_id = 0;
10c1e6: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
}
_Thread_queue_Initialize(
10c1ed: 6a 05 push $0x5
10c1ef: 68 00 04 00 00 push $0x400
10c1f4: 31 d2 xor %edx,%edx
10c1f6: 83 7b 08 00 cmpl $0x0,0x8(%ebx)
10c1fa: 0f 95 c2 setne %dl
10c1fd: 52 push %edx
10c1fe: 50 push %eax
10c1ff: e8 b8 1e 00 00 call 10e0bc <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c204: 83 c4 10 add $0x10,%esp
10c207: 31 c0 xor %eax,%eax
}
10c209: 8d 65 f4 lea -0xc(%ebp),%esp
10c20c: 5b pop %ebx
10c20d: 5e pop %esi
10c20e: 5f pop %edi
10c20f: c9 leave
10c210: c3 ret
10c211: 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;
10c214: b8 06 00 00 00 mov $0x6,%eax
STATES_WAITING_FOR_MUTEX,
CORE_MUTEX_TIMEOUT
);
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c219: 8d 65 f4 lea -0xc(%ebp),%esp
10c21c: 5b pop %ebx
10c21d: 5e pop %esi
10c21e: 5f pop %edi
10c21f: c9 leave
10c220: c3 ret
0010c274 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
10c274: 55 push %ebp
10c275: 89 e5 mov %esp,%ebp
10c277: 53 push %ebx
10c278: 83 ec 14 sub $0x14,%esp
10c27b: 8b 5d 08 mov 0x8(%ebp),%ebx
10c27e: 8a 55 10 mov 0x10(%ebp),%dl
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
10c281: a1 90 7d 12 00 mov 0x127d90,%eax
10c286: 85 c0 test %eax,%eax
10c288: 74 04 je 10c28e <_CORE_mutex_Seize+0x1a>
10c28a: 84 d2 test %dl,%dl
10c28c: 75 36 jne 10c2c4 <_CORE_mutex_Seize+0x50><== ALWAYS TAKEN
10c28e: 83 ec 08 sub $0x8,%esp
10c291: 8d 45 18 lea 0x18(%ebp),%eax
10c294: 50 push %eax
10c295: 53 push %ebx
10c296: 88 55 f4 mov %dl,-0xc(%ebp)
10c299: e8 1a 4f 00 00 call 1111b8 <_CORE_mutex_Seize_interrupt_trylock>
10c29e: 83 c4 10 add $0x10,%esp
10c2a1: 85 c0 test %eax,%eax
10c2a3: 8a 55 f4 mov -0xc(%ebp),%dl
10c2a6: 74 14 je 10c2bc <_CORE_mutex_Seize+0x48>
10c2a8: 84 d2 test %dl,%dl
10c2aa: 75 30 jne 10c2dc <_CORE_mutex_Seize+0x68>
10c2ac: ff 75 18 pushl 0x18(%ebp)
10c2af: 9d popf
10c2b0: a1 38 83 12 00 mov 0x128338,%eax
10c2b5: c7 40 34 01 00 00 00 movl $0x1,0x34(%eax)
}
10c2bc: 8b 5d fc mov -0x4(%ebp),%ebx
10c2bf: c9 leave
10c2c0: c3 ret
10c2c1: 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 );
10c2c4: 83 3d 20 7f 12 00 01 cmpl $0x1,0x127f20
10c2cb: 76 c1 jbe 10c28e <_CORE_mutex_Seize+0x1a>
10c2cd: 53 push %ebx
10c2ce: 6a 12 push $0x12
10c2d0: 6a 00 push $0x0
10c2d2: 6a 00 push $0x0
10c2d4: e8 1b 06 00 00 call 10c8f4 <_Internal_error_Occurred>
10c2d9: 8d 76 00 lea 0x0(%esi),%esi
10c2dc: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx)
10c2e3: a1 38 83 12 00 mov 0x128338,%eax
10c2e8: 89 58 44 mov %ebx,0x44(%eax)
10c2eb: 8b 55 0c mov 0xc(%ebp),%edx
10c2ee: 89 50 20 mov %edx,0x20(%eax)
10c2f1: a1 90 7d 12 00 mov 0x127d90,%eax
10c2f6: 40 inc %eax
10c2f7: a3 90 7d 12 00 mov %eax,0x127d90
10c2fc: ff 75 18 pushl 0x18(%ebp)
10c2ff: 9d popf
10c300: 83 ec 08 sub $0x8,%esp
10c303: ff 75 14 pushl 0x14(%ebp)
10c306: 53 push %ebx
10c307: e8 18 ff ff ff call 10c224 <_CORE_mutex_Seize_interrupt_blocking>
10c30c: 83 c4 10 add $0x10,%esp
}
10c30f: 8b 5d fc mov -0x4(%ebp),%ebx
10c312: c9 leave
10c313: c3 ret
001111b8 <_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
)
{
1111b8: 55 push %ebp
1111b9: 89 e5 mov %esp,%ebp
1111bb: 56 push %esi
1111bc: 53 push %ebx
1111bd: 8b 45 08 mov 0x8(%ebp),%eax
1111c0: 8b 4d 0c mov 0xc(%ebp),%ecx
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
1111c3: 8b 15 38 83 12 00 mov 0x128338,%edx
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
1111c9: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
1111d0: 8b 58 50 mov 0x50(%eax),%ebx
1111d3: 85 db test %ebx,%ebx
1111d5: 74 31 je 111208 <_CORE_mutex_Seize_interrupt_trylock+0x50>
the_mutex->lock = CORE_MUTEX_LOCKED;
1111d7: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax)
the_mutex->holder = executing;
1111de: 89 50 5c mov %edx,0x5c(%eax)
the_mutex->holder_id = executing->Object.id;
1111e1: 8b 5a 08 mov 0x8(%edx),%ebx
1111e4: 89 58 60 mov %ebx,0x60(%eax)
the_mutex->nest_count = 1;
1111e7: c7 40 54 01 00 00 00 movl $0x1,0x54(%eax)
return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p );
}
1111ee: 8b 58 48 mov 0x48(%eax),%ebx
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
1111f1: 83 fb 02 cmp $0x2,%ebx
1111f4: 74 26 je 11121c <_CORE_mutex_Seize_interrupt_trylock+0x64>
1111f6: 83 fb 03 cmp $0x3,%ebx
1111f9: 74 3d je 111238 <_CORE_mutex_Seize_interrupt_trylock+0x80>
executing->resource_count++;
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
1111fb: ff 31 pushl (%ecx)
1111fd: 9d popf
return 0;
1111fe: 31 c0 xor %eax,%eax
111200: 8d 65 f8 lea -0x8(%ebp),%esp
111203: 5b pop %ebx
111204: 5e pop %esi
111205: c9 leave
111206: c3 ret
111207: 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 ) ) {
111208: 3b 50 5c cmp 0x5c(%eax),%edx
11120b: 74 17 je 111224 <_CORE_mutex_Seize_interrupt_trylock+0x6c>
/*
* The mutex is not available and the caller must deal with the possibility
* of blocking.
*/
return 1;
11120d: b8 01 00 00 00 mov $0x1,%eax
111212: 8d 65 f8 lea -0x8(%ebp),%esp
111215: 5b pop %ebx
111216: 5e pop %esi
111217: c9 leave
111218: c3 ret
111219: 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++;
11121c: ff 42 1c incl 0x1c(%edx)
11121f: eb da jmp 1111fb <_CORE_mutex_Seize_interrupt_trylock+0x43>
111221: 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 ) {
111224: 8b 58 40 mov 0x40(%eax),%ebx
111227: 85 db test %ebx,%ebx
111229: 75 45 jne 111270 <_CORE_mutex_Seize_interrupt_trylock+0xb8>
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
11122b: ff 40 54 incl 0x54(%eax)
_ISR_Enable( *level_p );
11122e: ff 31 pushl (%ecx)
111230: 9d popf
return 0;
111231: 31 c0 xor %eax,%eax
111233: eb dd jmp 111212 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111235: 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++;
111238: 8b 5a 1c mov 0x1c(%edx),%ebx
11123b: 8d 73 01 lea 0x1(%ebx),%esi
11123e: 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 ) {
111241: 8b 72 14 mov 0x14(%edx),%esi
111244: 39 70 4c cmp %esi,0x4c(%eax)
111247: 74 6b je 1112b4 <_CORE_mutex_Seize_interrupt_trylock+0xfc>
_ISR_Enable( *level_p );
return 0;
}
if ( current > ceiling ) {
111249: 72 39 jb 111284 <_CORE_mutex_Seize_interrupt_trylock+0xcc>
);
_Thread_Enable_dispatch();
return 0;
}
/* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
11124b: c7 42 34 06 00 00 00 movl $0x6,0x34(%edx)
the_mutex->lock = CORE_MUTEX_UNLOCKED;
111252: c7 40 50 01 00 00 00 movl $0x1,0x50(%eax)
the_mutex->nest_count = 0; /* undo locking above */
111259: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
executing->resource_count--; /* undo locking above */
111260: 89 5a 1c mov %ebx,0x1c(%edx)
_ISR_Enable( *level_p );
111263: ff 31 pushl (%ecx)
111265: 9d popf
return 0;
111266: 31 c0 xor %eax,%eax
111268: 8d 65 f8 lea -0x8(%ebp),%esp
11126b: 5b pop %ebx
11126c: 5e pop %esi
11126d: c9 leave
11126e: c3 ret
11126f: 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 ) {
111270: 4b dec %ebx
111271: 75 9a jne 11120d <_CORE_mutex_Seize_interrupt_trylock+0x55>
the_mutex->nest_count++;
_ISR_Enable( *level_p );
return 0;
#if defined(RTEMS_POSIX_API)
case CORE_MUTEX_NESTING_IS_ERROR:
executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
111273: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx)
_ISR_Enable( *level_p );
11127a: ff 31 pushl (%ecx)
11127c: 9d popf
return 0;
11127d: 31 c0 xor %eax,%eax
11127f: eb 91 jmp 111212 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
111281: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
111284: 8b 15 90 7d 12 00 mov 0x127d90,%edx
11128a: 42 inc %edx
11128b: 89 15 90 7d 12 00 mov %edx,0x127d90
return 0;
}
if ( current > ceiling ) {
_Thread_Disable_dispatch();
_ISR_Enable( *level_p );
111291: ff 31 pushl (%ecx)
111293: 9d popf
_Thread_Change_priority(
111294: 52 push %edx
111295: 6a 00 push $0x0
111297: ff 70 4c pushl 0x4c(%eax)
11129a: ff 70 5c pushl 0x5c(%eax)
11129d: e8 d6 c2 ff ff call 10d578 <_Thread_Change_priority>
the_mutex->holder,
the_mutex->Attributes.priority_ceiling,
false
);
_Thread_Enable_dispatch();
1112a2: e8 09 c7 ff ff call 10d9b0 <_Thread_Enable_dispatch>
1112a7: 83 c4 10 add $0x10,%esp
return 0;
1112aa: 31 c0 xor %eax,%eax
1112ac: e9 61 ff ff ff jmp 111212 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
1112b1: 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 );
1112b4: ff 31 pushl (%ecx)
1112b6: 9d popf
return 0;
1112b7: 31 c0 xor %eax,%eax
1112b9: e9 54 ff ff ff jmp 111212 <_CORE_mutex_Seize_interrupt_trylock+0x5a>
0010c314 <_CORE_mutex_Surrender>:
#else
Objects_Id id __attribute__((unused)),
CORE_mutex_API_mp_support_callout api_mutex_mp_support __attribute__((unused))
#endif
)
{
10c314: 55 push %ebp
10c315: 89 e5 mov %esp,%ebp
10c317: 53 push %ebx
10c318: 83 ec 04 sub $0x4,%esp
10c31b: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *the_thread;
Thread_Control *holder;
holder = the_mutex->holder;
10c31e: 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 ) {
10c321: 80 7b 44 00 cmpb $0x0,0x44(%ebx)
10c325: 74 15 je 10c33c <_CORE_mutex_Surrender+0x28>
if ( !_Thread_Is_executing( holder ) )
10c327: 3b 05 38 83 12 00 cmp 0x128338,%eax
10c32d: 74 0d je 10c33c <_CORE_mutex_Surrender+0x28>
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
10c32f: b8 03 00 00 00 mov $0x3,%eax
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c334: 8b 5d fc mov -0x4(%ebp),%ebx
10c337: c9 leave
10c338: c3 ret
10c339: 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 )
10c33c: 8b 53 54 mov 0x54(%ebx),%edx
10c33f: 85 d2 test %edx,%edx
10c341: 74 51 je 10c394 <_CORE_mutex_Surrender+0x80>
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
10c343: 4a dec %edx
10c344: 89 53 54 mov %edx,0x54(%ebx)
if ( the_mutex->nest_count != 0 ) {
10c347: 85 d2 test %edx,%edx
10c349: 75 49 jne 10c394 <_CORE_mutex_Surrender+0x80>
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
10c34b: 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 ) ||
10c34e: 83 fa 02 cmp $0x2,%edx
10c351: 74 69 je 10c3bc <_CORE_mutex_Surrender+0xa8>
10c353: 83 fa 03 cmp $0x3,%edx
10c356: 74 64 je 10c3bc <_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;
10c358: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx)
the_mutex->holder_id = 0;
10c35f: 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 ) ) ) {
10c366: 83 ec 0c sub $0xc,%esp
10c369: 53 push %ebx
10c36a: e8 bd 19 00 00 call 10dd2c <_Thread_queue_Dequeue>
10c36f: 83 c4 10 add $0x10,%esp
10c372: 85 c0 test %eax,%eax
10c374: 74 7a je 10c3f0 <_CORE_mutex_Surrender+0xdc>
} else
#endif
{
the_mutex->holder = the_thread;
10c376: 89 43 5c mov %eax,0x5c(%ebx)
the_mutex->holder_id = the_thread->Object.id;
10c379: 8b 50 08 mov 0x8(%eax),%edx
10c37c: 89 53 60 mov %edx,0x60(%ebx)
the_mutex->nest_count = 1;
10c37f: c7 43 54 01 00 00 00 movl $0x1,0x54(%ebx)
switch ( the_mutex->Attributes.discipline ) {
10c386: 8b 53 48 mov 0x48(%ebx),%edx
10c389: 83 fa 02 cmp $0x2,%edx
10c38c: 74 56 je 10c3e4 <_CORE_mutex_Surrender+0xd0>
10c38e: 83 fa 03 cmp $0x3,%edx
10c391: 74 09 je 10c39c <_CORE_mutex_Surrender+0x88>
10c393: 90 nop
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c394: 31 c0 xor %eax,%eax
}
10c396: 8b 5d fc mov -0x4(%ebp),%ebx
10c399: c9 leave
10c39a: c3 ret
10c39b: 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++;
10c39c: ff 40 1c incl 0x1c(%eax)
if (the_mutex->Attributes.priority_ceiling <
10c39f: 8b 53 4c mov 0x4c(%ebx),%edx
10c3a2: 3b 50 14 cmp 0x14(%eax),%edx
10c3a5: 73 ed jae 10c394 <_CORE_mutex_Surrender+0x80>
the_thread->current_priority){
_Thread_Change_priority(
10c3a7: 51 push %ecx
10c3a8: 6a 00 push $0x0
10c3aa: 52 push %edx
10c3ab: 50 push %eax
10c3ac: e8 c7 11 00 00 call 10d578 <_Thread_Change_priority>
10c3b1: 83 c4 10 add $0x10,%esp
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3b4: 31 c0 xor %eax,%eax
10c3b6: e9 79 ff ff ff jmp 10c334 <_CORE_mutex_Surrender+0x20>
10c3bb: 90 nop
_CORE_mutex_Pop_priority( the_mutex, holder );
if ( pop_status != CORE_MUTEX_STATUS_SUCCESSFUL )
return pop_status;
holder->resource_count--;
10c3bc: 8b 50 1c mov 0x1c(%eax),%edx
10c3bf: 4a dec %edx
10c3c0: 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 &&
10c3c3: 85 d2 test %edx,%edx
10c3c5: 75 91 jne 10c358 <_CORE_mutex_Surrender+0x44>
holder->real_priority != holder->current_priority ) {
10c3c7: 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 &&
10c3ca: 3b 50 14 cmp 0x14(%eax),%edx
10c3cd: 74 89 je 10c358 <_CORE_mutex_Surrender+0x44>
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
10c3cf: 51 push %ecx
10c3d0: 6a 01 push $0x1
10c3d2: 52 push %edx
10c3d3: 50 push %eax
10c3d4: e8 9f 11 00 00 call 10d578 <_Thread_Change_priority>
10c3d9: 83 c4 10 add $0x10,%esp
10c3dc: e9 77 ff ff ff jmp 10c358 <_CORE_mutex_Surrender+0x44>
10c3e1: 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++;
10c3e4: ff 40 1c incl 0x1c(%eax)
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3e7: 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;
10c3e9: e9 46 ff ff ff jmp 10c334 <_CORE_mutex_Surrender+0x20>
10c3ee: 66 90 xchg %ax,%ax
}
break;
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
10c3f0: c7 43 50 01 00 00 00 movl $0x1,0x50(%ebx)
return CORE_MUTEX_STATUS_SUCCESSFUL;
10c3f7: 31 c0 xor %eax,%eax
10c3f9: e9 36 ff ff ff jmp 10c334 <_CORE_mutex_Surrender+0x20>
001152b8 <_CORE_semaphore_Seize>:
CORE_semaphore_Control *the_semaphore,
Objects_Id id,
bool wait,
Watchdog_Interval timeout
)
{
1152b8: 55 push %ebp
1152b9: 89 e5 mov %esp,%ebp
1152bb: 57 push %edi
1152bc: 56 push %esi
1152bd: 53 push %ebx
1152be: 83 ec 1c sub $0x1c,%esp
1152c1: 8b 45 08 mov 0x8(%ebp),%eax
1152c4: 8b 7d 0c mov 0xc(%ebp),%edi
1152c7: 8b 75 14 mov 0x14(%ebp),%esi
1152ca: 8a 5d 10 mov 0x10(%ebp),%bl
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
1152cd: 8b 15 b8 e0 12 00 mov 0x12e0b8,%edx
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
1152d3: c7 42 34 00 00 00 00 movl $0x0,0x34(%edx)
_ISR_Disable( level );
1152da: 9c pushf
1152db: fa cli
1152dc: 8f 45 e4 popl -0x1c(%ebp)
if ( the_semaphore->count != 0 ) {
1152df: 8b 48 48 mov 0x48(%eax),%ecx
1152e2: 85 c9 test %ecx,%ecx
1152e4: 75 46 jne 11532c <_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 ) {
1152e6: 84 db test %bl,%bl
1152e8: 75 16 jne 115300 <_CORE_semaphore_Seize+0x48>
_ISR_Enable( level );
1152ea: ff 75 e4 pushl -0x1c(%ebp)
1152ed: 9d popf
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
1152ee: 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 );
}
1152f5: 83 c4 1c add $0x1c,%esp
1152f8: 5b pop %ebx
1152f9: 5e pop %esi
1152fa: 5f pop %edi
1152fb: c9 leave
1152fc: c3 ret
1152fd: 8d 76 00 lea 0x0(%esi),%esi
115300: 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;
115307: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
11530a: 89 7a 20 mov %edi,0x20(%edx)
_ISR_Enable( level );
11530d: ff 75 e4 pushl -0x1c(%ebp)
115310: 9d popf
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
115311: c7 45 10 a4 1b 11 00 movl $0x111ba4,0x10(%ebp)
115318: 89 75 0c mov %esi,0xc(%ebp)
11531b: 89 45 08 mov %eax,0x8(%ebp)
}
11531e: 83 c4 1c add $0x1c,%esp
115321: 5b pop %ebx
115322: 5e pop %esi
115323: 5f pop %edi
115324: 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 );
115325: e9 4e c5 ff ff jmp 111878 <_Thread_queue_Enqueue_with_handler>
11532a: 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;
11532c: 49 dec %ecx
11532d: 89 48 48 mov %ecx,0x48(%eax)
_ISR_Enable( level );
115330: ff 75 e4 pushl -0x1c(%ebp)
115333: 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 );
}
115334: 83 c4 1c add $0x1c,%esp
115337: 5b pop %ebx
115338: 5e pop %esi
115339: 5f pop %edi
11533a: c9 leave
11533b: c3 ret
0010c44c <_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
)
{
10c44c: 55 push %ebp
10c44d: 89 e5 mov %esp,%ebp
10c44f: 53 push %ebx
10c450: 83 ec 10 sub $0x10,%esp
10c453: 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)) ) {
10c456: 53 push %ebx
10c457: e8 d0 18 00 00 call 10dd2c <_Thread_queue_Dequeue>
10c45c: 83 c4 10 add $0x10,%esp
10c45f: 85 c0 test %eax,%eax
10c461: 74 09 je 10c46c <_CORE_semaphore_Surrender+0x20>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10c463: 31 c0 xor %eax,%eax
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
10c465: 8b 5d fc mov -0x4(%ebp),%ebx
10c468: c9 leave
10c469: c3 ret
10c46a: 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 );
10c46c: 9c pushf
10c46d: fa cli
10c46e: 5a pop %edx
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
10c46f: 8b 43 48 mov 0x48(%ebx),%eax
10c472: 3b 43 40 cmp 0x40(%ebx),%eax
10c475: 72 0d jb 10c484 <_CORE_semaphore_Surrender+0x38><== ALWAYS TAKEN
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
10c477: b8 04 00 00 00 mov $0x4,%eax <== NOT EXECUTED
_ISR_Enable( level );
10c47c: 52 push %edx
10c47d: 9d popf
}
return status;
}
10c47e: 8b 5d fc mov -0x4(%ebp),%ebx
10c481: c9 leave
10c482: c3 ret
10c483: 90 nop
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
10c484: 40 inc %eax
10c485: 89 43 48 mov %eax,0x48(%ebx)
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
10c488: 31 c0 xor %eax,%eax
10c48a: eb f0 jmp 10c47c <_CORE_semaphore_Surrender+0x30>
0010c6ac <_Chain_Get_with_empty_check>:
bool _Chain_Get_with_empty_check(
Chain_Control *chain,
Chain_Node **node
)
{
10c6ac: 55 push %ebp
10c6ad: 89 e5 mov %esp,%ebp
10c6af: 57 push %edi
10c6b0: 56 push %esi
10c6b1: 53 push %ebx
10c6b2: 8b 45 08 mov 0x8(%ebp),%eax
10c6b5: 8b 7d 0c mov 0xc(%ebp),%edi
ISR_Level level;
bool is_empty_now;
_ISR_Disable( level );
10c6b8: 9c pushf
10c6b9: fa cli
10c6ba: 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 );
10c6bb: 8d 58 04 lea 0x4(%eax),%ebx
Chain_Node *old_first = head->next;
10c6be: 8b 10 mov (%eax),%edx
if ( old_first != tail ) {
10c6c0: 39 d3 cmp %edx,%ebx
10c6c2: 74 18 je 10c6dc <_Chain_Get_with_empty_check+0x30>
Chain_Node *new_first = old_first->next;
10c6c4: 8b 0a mov (%edx),%ecx
head->next = new_first;
10c6c6: 89 08 mov %ecx,(%eax)
new_first->previous = head;
10c6c8: 89 41 04 mov %eax,0x4(%ecx)
*the_node = old_first;
10c6cb: 89 17 mov %edx,(%edi)
is_empty_now = new_first == tail;
10c6cd: 39 cb cmp %ecx,%ebx
10c6cf: 0f 94 c0 sete %al
is_empty_now = _Chain_Get_with_empty_check_unprotected( chain, node );
_ISR_Enable( level );
10c6d2: 56 push %esi
10c6d3: 9d popf
return is_empty_now;
}
10c6d4: 5b pop %ebx
10c6d5: 5e pop %esi
10c6d6: 5f pop %edi
10c6d7: c9 leave
10c6d8: c3 ret
10c6d9: 8d 76 00 lea 0x0(%esi),%esi
} else
*the_node = NULL;
10c6dc: 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;
10c6e2: b0 01 mov $0x1,%al
10c6e4: eb ec jmp 10c6d2 <_Chain_Get_with_empty_check+0x26>
00111084 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
111084: 55 push %ebp
111085: 89 e5 mov %esp,%ebp
111087: 57 push %edi
111088: 56 push %esi
111089: 53 push %ebx
11108a: 83 ec 08 sub $0x8,%esp
11108d: 8b 7d 08 mov 0x8(%ebp),%edi
111090: 8b 4d 10 mov 0x10(%ebp),%ecx
111093: 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 );
111096: 8d 47 04 lea 0x4(%edi),%eax
111099: 89 45 f0 mov %eax,-0x10(%ebp)
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
11109c: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
while ( count-- ) {
1110a3: 85 c9 test %ecx,%ecx
1110a5: 74 35 je 1110dc <_Chain_Initialize+0x58><== NEVER TAKEN
1110a7: 49 dec %ecx
1110a8: 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;
1110ab: 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;
1110ae: 89 fa mov %edi,%edx
1110b0: eb 07 jmp 1110b9 <_Chain_Initialize+0x35>
1110b2: 66 90 xchg %ax,%ax
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
1110b4: 89 c2 mov %eax,%edx
current->next = next;
next->previous = current;
current = next;
next = (Chain_Node *)
1110b6: 89 d8 mov %ebx,%eax
1110b8: 49 dec %ecx
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
current->next = next;
1110b9: 89 02 mov %eax,(%edx)
next->previous = current;
1110bb: 89 50 04 mov %edx,0x4(%eax)
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
1110be: 8d 1c 30 lea (%eax,%esi,1),%ebx
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
1110c1: 85 c9 test %ecx,%ecx
1110c3: 75 ef jne 1110b4 <_Chain_Initialize+0x30>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
1110c5: 0f af 75 ec imul -0x14(%ebp),%esi
1110c9: 03 75 0c add 0xc(%ebp),%esi
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
1110cc: 8b 45 f0 mov -0x10(%ebp),%eax
1110cf: 89 06 mov %eax,(%esi)
tail->previous = current;
1110d1: 89 77 08 mov %esi,0x8(%edi)
}
1110d4: 83 c4 08 add $0x8,%esp
1110d7: 5b pop %ebx
1110d8: 5e pop %esi
1110d9: 5f pop %edi
1110da: c9 leave
1110db: 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;
1110dc: 89 fe mov %edi,%esi <== NOT EXECUTED
1110de: eb ec jmp 1110cc <_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 83 12 00 mov 0x128338,%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 87 12 00 01 movl $0x1,0x128768
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 e2 30 00 00 call 10e1d0 <_Thread_Set_state>
_ISR_Disable( level );
10b0ee: 9c pushf
10b0ef: fa cli
10b0f0: 5a pop %edx
sync_state = _Event_Sync_state;
10b0f1: a1 68 87 12 00 mov 0x128768,%eax
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10b0f6: c7 05 68 87 12 00 00 movl $0x0,0x128768
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 0f 24 00 00 jmp 10d52c <_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 60 7e 12 00 push $0x127e60
10b18d: e8 8e 35 00 00 call 10e720 <_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 83 12 00 mov 0x128334,%esi
10b21e: 85 f6 test %esi,%esi
10b220: 74 0c je 10b22e <_Event_Surrender+0x3e>
10b222: 3b 1d 38 83 12 00 cmp 0x128338,%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 d9 23 00 00 call 10d64c <_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 b1 35 00 00 call 10e860 <_Watchdog_Remove>
10b2af: 58 pop %eax
10b2b0: 5a pop %edx
10b2b1: 68 f8 ff 03 10 push $0x1003fff8
10b2b6: 53 push %ebx
10b2b7: e8 90 23 00 00 call 10d64c <_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 87 12 00 mov 0x128768,%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 87 12 00 mov 0x128768,%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 87 12 00 03 movl $0x3,0x128768
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 ae 26 00 00 call 10d9d4 <_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 83 12 00 cmp 0x128338,%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 f3 22 00 00 call 10d64c <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10b359: a1 90 7d 12 00 mov 0x127d90,%eax
10b35e: 48 dec %eax
10b35f: a3 90 7d 12 00 mov %eax,0x127d90
_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 87 12 00 mov 0x128768,%ecx
10b372: 49 dec %ecx
10b373: 75 cd jne 10b342 <_Event_Timeout+0x2e>
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
10b375: c7 05 68 87 12 00 02 movl $0x2,0x128768
10b37c: 00 00 00
10b37f: eb c1 jmp 10b342 <_Event_Timeout+0x2e>
00111314 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
111314: 55 push %ebp
111315: 89 e5 mov %esp,%ebp
111317: 57 push %edi
111318: 56 push %esi
111319: 53 push %ebx
11131a: 83 ec 2c sub $0x2c,%esp
11131d: 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
111320: 8d 47 04 lea 0x4(%edi),%eax
111323: 89 45 dc mov %eax,-0x24(%ebp)
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
111326: 8b 55 08 mov 0x8(%ebp),%edx
111329: 8b 52 10 mov 0x10(%edx),%edx
11132c: 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 ) {
11132f: 39 c7 cmp %eax,%edi
111331: 0f 87 69 01 00 00 ja 1114a0 <_Heap_Allocate_aligned_with_boundary+0x18c>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
111337: 8b 5d 14 mov 0x14(%ebp),%ebx
11133a: 85 db test %ebx,%ebx
11133c: 0f 85 56 01 00 00 jne 111498 <_Heap_Allocate_aligned_with_boundary+0x184>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
111342: 8b 45 08 mov 0x8(%ebp),%eax
111345: 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 ) {
111348: 39 c8 cmp %ecx,%eax
11134a: 0f 84 50 01 00 00 je 1114a0 <_Heap_Allocate_aligned_with_boundary+0x18c>
111350: 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
111357: 8b 55 cc mov -0x34(%ebp),%edx
11135a: 83 c2 07 add $0x7,%edx
11135d: 89 55 c8 mov %edx,-0x38(%ebp)
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
111360: c7 45 d0 04 00 00 00 movl $0x4,-0x30(%ebp)
111367: 29 7d d0 sub %edi,-0x30(%ebp)
11136a: eb 1e jmp 11138a <_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;
11136c: 8d 59 08 lea 0x8(%ecx),%ebx
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
11136f: 85 db test %ebx,%ebx
111371: 0f 85 f1 00 00 00 jne 111468 <_Heap_Allocate_aligned_with_boundary+0x154><== ALWAYS TAKEN
break;
}
block = block->next;
111377: 8b 49 08 mov 0x8(%ecx),%ecx
11137a: 8b 45 e4 mov -0x1c(%ebp),%eax
11137d: 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 ) {
11137e: 39 4d 08 cmp %ecx,0x8(%ebp)
111381: 0f 84 25 01 00 00 je 1114ac <_Heap_Allocate_aligned_with_boundary+0x198>
111387: 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 ) {
11138a: 8b 59 04 mov 0x4(%ecx),%ebx
11138d: 39 5d dc cmp %ebx,-0x24(%ebp)
111390: 73 e5 jae 111377 <_Heap_Allocate_aligned_with_boundary+0x63>
if ( alignment == 0 ) {
111392: 8b 55 10 mov 0x10(%ebp),%edx
111395: 85 d2 test %edx,%edx
111397: 74 d3 je 11136c <_Heap_Allocate_aligned_with_boundary+0x58>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
111399: 8b 45 08 mov 0x8(%ebp),%eax
11139c: 8b 40 14 mov 0x14(%eax),%eax
11139f: 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;
1113a2: 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;
1113a5: 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;
1113a8: 8d 51 08 lea 0x8(%ecx),%edx
1113ab: 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;
1113ae: 8b 75 c8 mov -0x38(%ebp),%esi
1113b1: 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
1113b3: 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;
1113b5: 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);
1113b8: 89 d8 mov %ebx,%eax
1113ba: 31 d2 xor %edx,%edx
1113bc: f7 75 10 divl 0x10(%ebp)
1113bf: 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 ) {
1113c1: 39 de cmp %ebx,%esi
1113c3: 73 0b jae 1113d0 <_Heap_Allocate_aligned_with_boundary+0xbc>
1113c5: 89 f0 mov %esi,%eax
1113c7: 31 d2 xor %edx,%edx
1113c9: f7 75 10 divl 0x10(%ebp)
1113cc: 89 f3 mov %esi,%ebx
1113ce: 29 d3 sub %edx,%ebx
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
1113d0: 8b 45 14 mov 0x14(%ebp),%eax
1113d3: 85 c0 test %eax,%eax
1113d5: 74 5b je 111432 <_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;
1113d7: 8d 34 3b lea (%ebx,%edi,1),%esi
1113da: 89 f0 mov %esi,%eax
1113dc: 31 d2 xor %edx,%edx
1113de: f7 75 14 divl 0x14(%ebp)
1113e1: 89 f0 mov %esi,%eax
1113e3: 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 ) {
1113e5: 39 c3 cmp %eax,%ebx
1113e7: 73 49 jae 111432 <_Heap_Allocate_aligned_with_boundary+0x11e>
1113e9: 39 c6 cmp %eax,%esi
1113eb: 76 45 jbe 111432 <_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;
1113ed: 8b 55 d4 mov -0x2c(%ebp),%edx
1113f0: 01 fa add %edi,%edx
1113f2: 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 ) {
1113f5: 39 c2 cmp %eax,%edx
1113f7: 0f 87 7a ff ff ff ja 111377 <_Heap_Allocate_aligned_with_boundary+0x63>
1113fd: 89 ce mov %ecx,%esi
1113ff: eb 10 jmp 111411 <_Heap_Allocate_aligned_with_boundary+0xfd>
111401: 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 ) {
111404: 39 c1 cmp %eax,%ecx
111406: 76 28 jbe 111430 <_Heap_Allocate_aligned_with_boundary+0x11c>
if ( boundary_line < boundary_floor ) {
111408: 39 45 e0 cmp %eax,-0x20(%ebp)
11140b: 0f 87 9f 00 00 00 ja 1114b0 <_Heap_Allocate_aligned_with_boundary+0x19c><== NEVER TAKEN
return 0;
}
alloc_begin = boundary_line - alloc_size;
111411: 89 c3 mov %eax,%ebx
111413: 29 fb sub %edi,%ebx
111415: 89 d8 mov %ebx,%eax
111417: 31 d2 xor %edx,%edx
111419: f7 75 10 divl 0x10(%ebp)
11141c: 29 d3 sub %edx,%ebx
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
11141e: 8d 0c 3b lea (%ebx,%edi,1),%ecx
111421: 89 c8 mov %ecx,%eax
111423: 31 d2 xor %edx,%edx
111425: f7 75 14 divl 0x14(%ebp)
111428: 89 c8 mov %ecx,%eax
11142a: 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 ) {
11142c: 39 c3 cmp %eax,%ebx
11142e: 72 d4 jb 111404 <_Heap_Allocate_aligned_with_boundary+0xf0>
111430: 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 ) {
111432: 39 5d d4 cmp %ebx,-0x2c(%ebp)
111435: 0f 87 3c ff ff ff ja 111377 <_Heap_Allocate_aligned_with_boundary+0x63>
11143b: be f8 ff ff ff mov $0xfffffff8,%esi
111440: 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);
111442: 01 de add %ebx,%esi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
111444: 89 d8 mov %ebx,%eax
111446: 31 d2 xor %edx,%edx
111448: 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;
11144b: 29 d6 sub %edx,%esi
if ( free_size >= min_block_size || free_size == 0 ) {
11144d: 39 75 d8 cmp %esi,-0x28(%ebp)
111450: 0f 86 19 ff ff ff jbe 11136f <_Heap_Allocate_aligned_with_boundary+0x5b>
111456: 85 f6 test %esi,%esi
111458: 0f 85 19 ff ff ff jne 111377 <_Heap_Allocate_aligned_with_boundary+0x63>
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
11145e: 85 db test %ebx,%ebx
111460: 0f 84 11 ff ff ff je 111377 <_Heap_Allocate_aligned_with_boundary+0x63><== NEVER TAKEN
111466: 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;
111468: 8b 45 08 mov 0x8(%ebp),%eax
11146b: ff 40 48 incl 0x48(%eax)
stats->searches += search_count;
11146e: 8b 55 e4 mov -0x1c(%ebp),%edx
111471: 01 50 4c add %edx,0x4c(%eax)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
111474: 57 push %edi
111475: 53 push %ebx
111476: 51 push %ecx
111477: 50 push %eax
111478: e8 83 b3 ff ff call 10c800 <_Heap_Block_allocate>
11147d: 89 d8 mov %ebx,%eax
11147f: 83 c4 10 add $0x10,%esp
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
111482: 8b 55 e4 mov -0x1c(%ebp),%edx
111485: 8b 4d 08 mov 0x8(%ebp),%ecx
111488: 39 51 44 cmp %edx,0x44(%ecx)
11148b: 73 15 jae 1114a2 <_Heap_Allocate_aligned_with_boundary+0x18e>
stats->max_search = search_count;
11148d: 89 51 44 mov %edx,0x44(%ecx)
}
return (void *) alloc_begin;
}
111490: 8d 65 f4 lea -0xc(%ebp),%esp
111493: 5b pop %ebx
111494: 5e pop %esi
111495: 5f pop %edi
111496: c9 leave
111497: c3 ret
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
111498: 3b 7d 14 cmp 0x14(%ebp),%edi
11149b: 76 1a jbe 1114b7 <_Heap_Allocate_aligned_with_boundary+0x1a3>
11149d: 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 ) {
1114a0: 31 c0 xor %eax,%eax
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
1114a2: 8d 65 f4 lea -0xc(%ebp),%esp
1114a5: 5b pop %ebx
1114a6: 5e pop %esi
1114a7: 5f pop %edi
1114a8: c9 leave
1114a9: c3 ret
1114aa: 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 ) {
1114ac: 31 c0 xor %eax,%eax
1114ae: eb d2 jmp 111482 <_Heap_Allocate_aligned_with_boundary+0x16e>
1114b0: 89 f1 mov %esi,%ecx <== NOT EXECUTED
1114b2: e9 c0 fe ff ff jmp 111377 <_Heap_Allocate_aligned_with_boundary+0x63><== NOT EXECUTED
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
return NULL;
}
if ( alignment == 0 ) {
1114b7: 8b 4d 10 mov 0x10(%ebp),%ecx
1114ba: 85 c9 test %ecx,%ecx
1114bc: 0f 85 80 fe ff ff jne 111342 <_Heap_Allocate_aligned_with_boundary+0x2e>
alignment = page_size;
1114c2: 89 55 10 mov %edx,0x10(%ebp)
1114c5: e9 78 fe ff ff jmp 111342 <_Heap_Allocate_aligned_with_boundary+0x2e>
001118a8 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
1118a8: 55 push %ebp
1118a9: 89 e5 mov %esp,%ebp
1118ab: 57 push %edi
1118ac: 56 push %esi
1118ad: 53 push %ebx
1118ae: 83 ec 4c sub $0x4c,%esp
1118b1: 8b 5d 08 mov 0x8(%ebp),%ebx
1118b4: 8b 4d 10 mov 0x10(%ebp),%ecx
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
1118b7: 8b 43 20 mov 0x20(%ebx),%eax
1118ba: 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;
1118bd: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
Heap_Block *extend_last_block = NULL;
1118c4: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
uintptr_t const page_size = heap->page_size;
1118cb: 8b 53 10 mov 0x10(%ebx),%edx
1118ce: 89 55 d4 mov %edx,-0x2c(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
1118d1: 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;
1118d4: 8b 73 30 mov 0x30(%ebx),%esi
1118d7: 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 ) {
1118da: 8b 55 0c mov 0xc(%ebp),%edx
1118dd: 01 ca add %ecx,%edx
1118df: 89 55 cc mov %edx,-0x34(%ebp)
1118e2: 73 0c jae 1118f0 <_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;
1118e4: 31 c0 xor %eax,%eax
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
1118e6: 8d 65 f4 lea -0xc(%ebp),%esp
1118e9: 5b pop %ebx
1118ea: 5e pop %esi
1118eb: 5f pop %edi
1118ec: c9 leave
1118ed: c3 ret
1118ee: 66 90 xchg %ax,%ax
if ( extend_area_end < extend_area_begin ) {
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
1118f0: 83 ec 08 sub $0x8,%esp
1118f3: 8d 55 e0 lea -0x20(%ebp),%edx
1118f6: 52 push %edx
1118f7: 8d 55 e4 lea -0x1c(%ebp),%edx
1118fa: 52 push %edx
1118fb: 50 push %eax
1118fc: ff 75 d4 pushl -0x2c(%ebp)
1118ff: 51 push %ecx
111900: ff 75 0c pushl 0xc(%ebp)
111903: e8 14 b1 ff ff call 10ca1c <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
111908: 83 c4 20 add $0x20,%esp
11190b: 84 c0 test %al,%al
11190d: 74 d5 je 1118e4 <_Heap_Extend+0x3c>
11190f: 8b 7d d0 mov -0x30(%ebp),%edi
111912: c7 45 bc 00 00 00 00 movl $0x0,-0x44(%ebp)
111919: c7 45 b8 00 00 00 00 movl $0x0,-0x48(%ebp)
111920: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp)
111927: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp)
11192e: 8b 75 cc mov -0x34(%ebp),%esi
111931: 89 5d b4 mov %ebx,-0x4c(%ebp)
111934: eb 30 jmp 111966 <_Heap_Extend+0xbe>
111936: 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 ) {
111938: 39 ce cmp %ecx,%esi
11193a: 73 03 jae 11193f <_Heap_Extend+0x97>
11193c: 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);
11193f: 8d 59 f8 lea -0x8(%ecx),%ebx
111942: 89 c8 mov %ecx,%eax
111944: 31 d2 xor %edx,%edx
111946: 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);
111949: 29 d3 sub %edx,%ebx
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
11194b: 3b 4d 0c cmp 0xc(%ebp),%ecx
11194e: 74 3c je 11198c <_Heap_Extend+0xe4> <== NEVER TAKEN
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
111950: 39 4d 0c cmp %ecx,0xc(%ebp)
111953: 76 03 jbe 111958 <_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 )
111955: 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;
111958: 8b 7b 04 mov 0x4(%ebx),%edi
11195b: 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);
11195e: 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 );
111961: 39 7d d0 cmp %edi,-0x30(%ebp)
111964: 74 39 je 11199f <_Heap_Extend+0xf7>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
111966: 3b 7d d0 cmp -0x30(%ebp),%edi
111969: 0f 84 39 01 00 00 je 111aa8 <_Heap_Extend+0x200>
11196f: 89 f8 mov %edi,%eax
uintptr_t const sub_area_end = start_block->prev_size;
111971: 8b 0f mov (%edi),%ecx
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
111973: 39 4d 0c cmp %ecx,0xc(%ebp)
111976: 73 08 jae 111980 <_Heap_Extend+0xd8>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
111978: 39 f0 cmp %esi,%eax
11197a: 0f 82 64 ff ff ff jb 1118e4 <_Heap_Extend+0x3c>
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
111980: 39 f0 cmp %esi,%eax
111982: 75 b4 jne 111938 <_Heap_Extend+0x90>
111984: 89 7d c4 mov %edi,-0x3c(%ebp)
111987: eb b6 jmp 11193f <_Heap_Extend+0x97>
111989: 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;
11198c: 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 )
11198e: 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;
111991: 8b 7b 04 mov 0x4(%ebx),%edi
111994: 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);
111997: 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 );
11199a: 39 7d d0 cmp %edi,-0x30(%ebp)
11199d: 75 c7 jne 111966 <_Heap_Extend+0xbe> <== NEVER TAKEN
11199f: 8b 5d b4 mov -0x4c(%ebp),%ebx
if ( extend_area_begin < heap->area_begin ) {
1119a2: 8b 75 0c mov 0xc(%ebp),%esi
1119a5: 3b 73 18 cmp 0x18(%ebx),%esi
1119a8: 0f 82 06 01 00 00 jb 111ab4 <_Heap_Extend+0x20c>
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
1119ae: 8b 45 cc mov -0x34(%ebp),%eax
1119b1: 3b 43 1c cmp 0x1c(%ebx),%eax
1119b4: 76 03 jbe 1119b9 <_Heap_Extend+0x111>
heap->area_end = extend_area_end;
1119b6: 89 43 1c mov %eax,0x1c(%ebx)
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
1119b9: 8b 55 e0 mov -0x20(%ebp),%edx
1119bc: 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 =
1119bf: 89 d1 mov %edx,%ecx
1119c1: 29 c1 sub %eax,%ecx
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
1119c3: 8b 75 cc mov -0x34(%ebp),%esi
1119c6: 89 30 mov %esi,(%eax)
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
1119c8: 89 ce mov %ecx,%esi
1119ca: 83 ce 01 or $0x1,%esi
1119cd: 89 70 04 mov %esi,0x4(%eax)
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
1119d0: 89 0a mov %ecx,(%edx)
extend_last_block->size_and_flag = 0;
1119d2: 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 ) {
1119d9: 39 43 20 cmp %eax,0x20(%ebx)
1119dc: 0f 86 da 00 00 00 jbe 111abc <_Heap_Extend+0x214>
heap->first_block = extend_first_block;
1119e2: 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 ) {
1119e5: 8b 75 c4 mov -0x3c(%ebp),%esi
1119e8: 85 f6 test %esi,%esi
1119ea: 0f 84 10 01 00 00 je 111b00 <_Heap_Extend+0x258>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
1119f0: 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 );
1119f3: 8b 4d 0c mov 0xc(%ebp),%ecx
1119f6: 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;
1119f9: 89 c8 mov %ecx,%eax
1119fb: 31 d2 xor %edx,%edx
1119fd: f7 f6 div %esi
if ( remainder != 0 ) {
1119ff: 85 d2 test %edx,%edx
111a01: 0f 84 c9 00 00 00 je 111ad0 <_Heap_Extend+0x228> <== ALWAYS TAKEN
return value - remainder + alignment;
111a07: 8d 04 31 lea (%ecx,%esi,1),%eax <== NOT EXECUTED
111a0a: 29 d0 sub %edx,%eax <== NOT EXECUTED
uintptr_t const new_first_block_begin =
111a0c: 8d 50 f8 lea -0x8(%eax),%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;
111a0f: 8b 75 c4 mov -0x3c(%ebp),%esi
111a12: 8b 0e mov (%esi),%ecx
111a14: 89 48 f8 mov %ecx,-0x8(%eax)
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 =
111a17: 89 f0 mov %esi,%eax
111a19: 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;
111a1b: 83 c8 01 or $0x1,%eax
111a1e: 89 42 04 mov %eax,0x4(%edx)
_Heap_Free_block( heap, new_first_block );
111a21: 89 d8 mov %ebx,%eax
111a23: e8 64 fe ff ff call 11188c <_Heap_Free_block>
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
111a28: 8b 45 c8 mov -0x38(%ebp),%eax
111a2b: 85 c0 test %eax,%eax
111a2d: 0f 84 a5 00 00 00 je 111ad8 <_Heap_Extend+0x230>
)
{
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,
111a33: 8b 4d cc mov -0x34(%ebp),%ecx
111a36: 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(
111a39: 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);
111a3c: 89 c8 mov %ecx,%eax
111a3e: 31 d2 xor %edx,%edx
111a40: f7 73 10 divl 0x10(%ebx)
111a43: 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)
111a45: 8b 55 c8 mov -0x38(%ebp),%edx
111a48: 8b 42 04 mov 0x4(%edx),%eax
111a4b: 29 c8 sub %ecx,%eax
| HEAP_PREV_BLOCK_USED;
111a4d: 83 c8 01 or $0x1,%eax
111a50: 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;
111a54: 8b 42 04 mov 0x4(%edx),%eax
111a57: 83 e0 01 and $0x1,%eax
block->size_and_flag = size | flag;
111a5a: 09 c8 or %ecx,%eax
111a5c: 89 42 04 mov %eax,0x4(%edx)
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
111a5f: 89 d8 mov %ebx,%eax
111a61: e8 26 fe ff ff call 11188c <_Heap_Free_block>
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
111a66: 8b 75 c4 mov -0x3c(%ebp),%esi
111a69: 85 f6 test %esi,%esi
111a6b: 0f 84 ab 00 00 00 je 111b1c <_Heap_Extend+0x274>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
111a71: 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(
111a74: 8b 43 20 mov 0x20(%ebx),%eax
111a77: 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;
111a79: 8b 4a 04 mov 0x4(%edx),%ecx
111a7c: 83 e1 01 and $0x1,%ecx
block->size_and_flag = size | flag;
111a7f: 09 c8 or %ecx,%eax
111a81: 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;
111a84: 8b 43 30 mov 0x30(%ebx),%eax
111a87: 2b 45 c0 sub -0x40(%ebp),%eax
/* Statistics */
stats->size += extended_size;
111a8a: 01 43 2c add %eax,0x2c(%ebx)
if ( extended_size_ptr != NULL )
111a8d: 8b 55 14 mov 0x14(%ebp),%edx
111a90: 85 d2 test %edx,%edx
111a92: 0f 84 a0 00 00 00 je 111b38 <_Heap_Extend+0x290> <== NEVER TAKEN
*extended_size_ptr = extended_size;
111a98: 8b 55 14 mov 0x14(%ebp),%edx
111a9b: 89 02 mov %eax,(%edx)
return true;
111a9d: b0 01 mov $0x1,%al
}
111a9f: 8d 65 f4 lea -0xc(%ebp),%esp
111aa2: 5b pop %ebx
111aa3: 5e pop %esi
111aa4: 5f pop %edi
111aa5: c9 leave
111aa6: c3 ret
111aa7: 90 nop
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
111aa8: 8b 55 b4 mov -0x4c(%ebp),%edx
111aab: 8b 42 18 mov 0x18(%edx),%eax
111aae: e9 be fe ff ff jmp 111971 <_Heap_Extend+0xc9>
111ab3: 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;
111ab4: 89 73 18 mov %esi,0x18(%ebx)
111ab7: e9 fd fe ff ff jmp 1119b9 <_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 ) {
111abc: 39 53 24 cmp %edx,0x24(%ebx)
111abf: 0f 83 20 ff ff ff jae 1119e5 <_Heap_Extend+0x13d>
heap->last_block = extend_last_block;
111ac5: 89 53 24 mov %edx,0x24(%ebx)
111ac8: e9 18 ff ff ff jmp 1119e5 <_Heap_Extend+0x13d>
111acd: 8d 76 00 lea 0x0(%esi),%esi
uintptr_t remainder = value % alignment;
if ( remainder != 0 ) {
return value - remainder + alignment;
} else {
return value;
111ad0: 89 c8 mov %ecx,%eax
111ad2: e9 35 ff ff ff jmp 111a0c <_Heap_Extend+0x164>
111ad7: 90 nop
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
111ad8: 8b 7d bc mov -0x44(%ebp),%edi
111adb: 85 ff test %edi,%edi
111add: 74 87 je 111a66 <_Heap_Extend+0x1be>
_Heap_Link_above(
111adf: 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 );
111ae2: 8b 45 e4 mov -0x1c(%ebp),%eax
111ae5: 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;
111ae8: 8b 75 bc mov -0x44(%ebp),%esi
111aeb: 8b 56 04 mov 0x4(%esi),%edx
111aee: 83 e2 01 and $0x1,%edx
block->size_and_flag = size | flag;
111af1: 09 d0 or %edx,%eax
111af3: 89 46 04 mov %eax,0x4(%esi)
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
111af6: 83 49 04 01 orl $0x1,0x4(%ecx)
111afa: e9 67 ff ff ff jmp 111a66 <_Heap_Extend+0x1be>
111aff: 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 ) {
111b00: 8b 4d b8 mov -0x48(%ebp),%ecx
111b03: 85 c9 test %ecx,%ecx
111b05: 0f 84 1d ff ff ff je 111a28 <_Heap_Extend+0x180>
{
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;
111b0b: 8b 45 b8 mov -0x48(%ebp),%eax
111b0e: 29 d0 sub %edx,%eax
111b10: 83 c8 01 or $0x1,%eax
111b13: 89 42 04 mov %eax,0x4(%edx)
111b16: e9 0d ff ff ff jmp 111a28 <_Heap_Extend+0x180>
111b1b: 90 nop
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
111b1c: 8b 4d c8 mov -0x38(%ebp),%ecx
111b1f: 85 c9 test %ecx,%ecx
111b21: 0f 85 4a ff ff ff jne 111a71 <_Heap_Extend+0x1c9>
_Heap_Free_block( heap, extend_first_block );
111b27: 8b 55 e4 mov -0x1c(%ebp),%edx
111b2a: 89 d8 mov %ebx,%eax
111b2c: e8 5b fd ff ff call 11188c <_Heap_Free_block>
111b31: e9 3b ff ff ff jmp 111a71 <_Heap_Extend+0x1c9>
111b36: 66 90 xchg %ax,%ax
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
111b38: b0 01 mov $0x1,%al <== NOT EXECUTED
111b3a: e9 a7 fd ff ff jmp 1118e6 <_Heap_Extend+0x3e> <== NOT EXECUTED
001114cc <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
1114cc: 55 push %ebp
1114cd: 89 e5 mov %esp,%ebp
1114cf: 57 push %edi
1114d0: 56 push %esi
1114d1: 53 push %ebx
1114d2: 83 ec 10 sub $0x10,%esp
1114d5: 8b 5d 08 mov 0x8(%ebp),%ebx
1114d8: 8b 45 0c mov 0xc(%ebp),%eax
1114db: 8d 48 f8 lea -0x8(%eax),%ecx
1114de: 31 d2 xor %edx,%edx
1114e0: 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);
1114e3: 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
1114e5: 8b 43 20 mov 0x20(%ebx),%eax
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
1114e8: 39 c1 cmp %eax,%ecx
1114ea: 72 07 jb 1114f3 <_Heap_Free+0x27>
1114ec: 8b 73 24 mov 0x24(%ebx),%esi
1114ef: 39 f1 cmp %esi,%ecx
1114f1: 76 0d jbe 111500 <_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 );
1114f3: 31 c0 xor %eax,%eax
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
1114f5: 83 c4 10 add $0x10,%esp
1114f8: 5b pop %ebx
1114f9: 5e pop %esi
1114fa: 5f pop %edi
1114fb: c9 leave
1114fc: c3 ret
1114fd: 8d 76 00 lea 0x0(%esi),%esi
111500: 8b 51 04 mov 0x4(%ecx),%edx
111503: 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;
111506: 83 e2 fe and $0xfffffffe,%edx
111509: 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);
11150c: 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;
11150f: 39 d0 cmp %edx,%eax
111511: 77 e0 ja 1114f3 <_Heap_Free+0x27> <== NEVER TAKEN
111513: 39 d6 cmp %edx,%esi
111515: 72 dc jb 1114f3 <_Heap_Free+0x27> <== NEVER TAKEN
111517: 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 ) ) {
11151a: f7 c7 01 00 00 00 test $0x1,%edi
111520: 74 d1 je 1114f3 <_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;
111522: 83 e7 fe and $0xfffffffe,%edi
111525: 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 ));
111528: 39 d6 cmp %edx,%esi
11152a: 0f 84 c8 00 00 00 je 1115f8 <_Heap_Free+0x12c>
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
111530: f6 44 3a 04 01 testb $0x1,0x4(%edx,%edi,1)
111535: 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 ) ) {
111539: f6 45 f0 01 testb $0x1,-0x10(%ebp)
11153d: 75 45 jne 111584 <_Heap_Free+0xb8>
uintptr_t const prev_size = block->prev_size;
11153f: 8b 39 mov (%ecx),%edi
111541: 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);
111544: 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;
111546: 39 c8 cmp %ecx,%eax
111548: 77 a9 ja 1114f3 <_Heap_Free+0x27> <== NEVER TAKEN
11154a: 39 ce cmp %ecx,%esi
11154c: 72 a5 jb 1114f3 <_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) ) {
11154e: f6 41 04 01 testb $0x1,0x4(%ecx)
111552: 74 9f je 1114f3 <_Heap_Free+0x27> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
111554: 80 7d eb 00 cmpb $0x0,-0x15(%ebp)
111558: 0f 84 a6 00 00 00 je 111604 <_Heap_Free+0x138>
uintptr_t const size = block_size + prev_size + next_block_size;
11155e: 8b 7d e4 mov -0x1c(%ebp),%edi
111561: 03 7d ec add -0x14(%ebp),%edi
111564: 03 7d f0 add -0x10(%ebp),%edi
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
111567: 8b 42 08 mov 0x8(%edx),%eax
11156a: 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;
11156d: 89 42 08 mov %eax,0x8(%edx)
next->prev = prev;
111570: 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;
111573: ff 4b 38 decl 0x38(%ebx)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
111576: 89 f8 mov %edi,%eax
111578: 83 c8 01 or $0x1,%eax
11157b: 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;
11157e: 89 3c 39 mov %edi,(%ecx,%edi,1)
111581: eb 2a jmp 1115ad <_Heap_Free+0xe1>
111583: 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 */
111584: 80 7d eb 00 cmpb $0x0,-0x15(%ebp)
111588: 74 3a je 1115c4 <_Heap_Free+0xf8>
uintptr_t const size = block_size + next_block_size;
11158a: 8b 7d e4 mov -0x1c(%ebp),%edi
11158d: 03 7d ec add -0x14(%ebp),%edi
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
111590: 8b 42 08 mov 0x8(%edx),%eax
111593: 8b 52 0c mov 0xc(%edx),%edx
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
111596: 89 41 08 mov %eax,0x8(%ecx)
new_block->prev = prev;
111599: 89 51 0c mov %edx,0xc(%ecx)
next->prev = new_block;
11159c: 89 48 0c mov %ecx,0xc(%eax)
prev->next = new_block;
11159f: 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;
1115a2: 89 f8 mov %edi,%eax
1115a4: 83 c8 01 or $0x1,%eax
1115a7: 89 41 04 mov %eax,0x4(%ecx)
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
1115aa: 89 3c 39 mov %edi,(%ecx,%edi,1)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
1115ad: ff 4b 40 decl 0x40(%ebx)
++stats->frees;
1115b0: ff 43 50 incl 0x50(%ebx)
stats->free_size += block_size;
1115b3: 8b 55 ec mov -0x14(%ebp),%edx
1115b6: 01 53 30 add %edx,0x30(%ebx)
return( true );
1115b9: b0 01 mov $0x1,%al
}
1115bb: 83 c4 10 add $0x10,%esp
1115be: 5b pop %ebx
1115bf: 5e pop %esi
1115c0: 5f pop %edi
1115c1: c9 leave
1115c2: c3 ret
1115c3: 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;
1115c4: 8b 43 08 mov 0x8(%ebx),%eax
new_block->next = next;
1115c7: 89 41 08 mov %eax,0x8(%ecx)
new_block->prev = block_before;
1115ca: 89 59 0c mov %ebx,0xc(%ecx)
block_before->next = new_block;
1115cd: 89 4b 08 mov %ecx,0x8(%ebx)
next->prev = new_block;
1115d0: 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;
1115d3: 8b 45 ec mov -0x14(%ebp),%eax
1115d6: 83 c8 01 or $0x1,%eax
1115d9: 89 41 04 mov %eax,0x4(%ecx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
1115dc: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = block_size;
1115e0: 8b 45 ec mov -0x14(%ebp),%eax
1115e3: 89 02 mov %eax,(%edx)
/* Statistics */
++stats->free_blocks;
1115e5: 8b 43 38 mov 0x38(%ebx),%eax
1115e8: 40 inc %eax
1115e9: 89 43 38 mov %eax,0x38(%ebx)
if ( stats->max_free_blocks < stats->free_blocks ) {
1115ec: 3b 43 3c cmp 0x3c(%ebx),%eax
1115ef: 76 bc jbe 1115ad <_Heap_Free+0xe1>
stats->max_free_blocks = stats->free_blocks;
1115f1: 89 43 3c mov %eax,0x3c(%ebx)
1115f4: eb b7 jmp 1115ad <_Heap_Free+0xe1>
1115f6: 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 ));
1115f8: c6 45 eb 00 movb $0x0,-0x15(%ebp)
1115fc: e9 38 ff ff ff jmp 111539 <_Heap_Free+0x6d>
111601: 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;
111604: 8b 45 ec mov -0x14(%ebp),%eax
111607: 03 45 f0 add -0x10(%ebp),%eax
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
11160a: 89 c6 mov %eax,%esi
11160c: 83 ce 01 or $0x1,%esi
11160f: 89 71 04 mov %esi,0x4(%ecx)
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
111612: 83 62 04 fe andl $0xfffffffe,0x4(%edx)
next_block->prev_size = size;
111616: 89 02 mov %eax,(%edx)
111618: eb 93 jmp 1115ad <_Heap_Free+0xe1>
0010c690 <_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
)
{
10c690: 55 push %ebp
10c691: 89 e5 mov %esp,%ebp
10c693: 57 push %edi
10c694: 56 push %esi
10c695: 53 push %ebx
10c696: 8b 4d 08 mov 0x8(%ebp),%ecx
10c699: 8b 7d 0c mov 0xc(%ebp),%edi
uintptr_t const heap_area_end = heap_area_begin + heap_area_size;
10c69c: 8d 34 0f lea (%edi,%ecx,1),%esi
uintptr_t const alloc_area_begin =
_Heap_Align_up( heap_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
10c69f: 8d 59 08 lea 0x8(%ecx),%ebx
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
10c6a2: 89 d8 mov %ebx,%eax
10c6a4: 31 d2 xor %edx,%edx
10c6a6: f7 75 10 divl 0x10(%ebp)
if ( remainder != 0 ) {
10c6a9: 85 d2 test %edx,%edx
10c6ab: 74 05 je 10c6b2 <_Heap_Get_first_and_last_block+0x22>
return value - remainder + alignment;
10c6ad: 03 5d 10 add 0x10(%ebp),%ebx
10c6b0: 29 d3 sub %edx,%ebx
_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 (
10c6b2: 39 f1 cmp %esi,%ecx
10c6b4: 77 2e ja 10c6e4 <_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);
10c6b6: 8d 73 f8 lea -0x8(%ebx),%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 =
10c6b9: 29 cb sub %ecx,%ebx
Heap_Block *const last_block =
_Heap_Block_at( first_block, first_block_size );
if (
heap_area_end < heap_area_begin
|| heap_area_size <= overhead
10c6bb: 39 df cmp %ebx,%edi
10c6bd: 76 25 jbe 10c6e4 <_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 );
10c6bf: 29 df sub %ebx,%edi
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
10c6c1: 89 f8 mov %edi,%eax
10c6c3: 31 d2 xor %edx,%edx
10c6c5: f7 75 10 divl 0x10(%ebp)
10c6c8: 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
10c6ca: 39 7d 14 cmp %edi,0x14(%ebp)
10c6cd: 77 15 ja 10c6e4 <_Heap_Get_first_and_last_block+0x54>
) {
/* Invalid area or area too small */
return false;
}
*first_block_ptr = first_block;
10c6cf: 8b 45 18 mov 0x18(%ebp),%eax
10c6d2: 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);
10c6d4: 01 f7 add %esi,%edi
10c6d6: 8b 45 1c mov 0x1c(%ebp),%eax
10c6d9: 89 38 mov %edi,(%eax)
*last_block_ptr = last_block;
return true;
10c6db: b0 01 mov $0x1,%al
}
10c6dd: 5b pop %ebx
10c6de: 5e pop %esi
10c6df: 5f pop %edi
10c6e0: c9 leave
10c6e1: c3 ret
10c6e2: 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;
10c6e4: 31 c0 xor %eax,%eax
*first_block_ptr = first_block;
*last_block_ptr = last_block;
return true;
}
10c6e6: 5b pop %ebx
10c6e7: 5e pop %esi
10c6e8: 5f pop %edi
10c6e9: c9 leave
10c6ea: c3 ret
001151e0 <_Heap_Get_free_information>:
void _Heap_Get_free_information(
Heap_Control *the_heap,
Heap_Information *info
)
{
1151e0: 55 push %ebp
1151e1: 89 e5 mov %esp,%ebp
1151e3: 57 push %edi
1151e4: 56 push %esi
1151e5: 53 push %ebx
1151e6: 8b 7d 0c mov 0xc(%ebp),%edi
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
1151e9: c7 07 00 00 00 00 movl $0x0,(%edi)
info->largest = 0;
1151ef: c7 47 04 00 00 00 00 movl $0x0,0x4(%edi)
info->total = 0;
1151f6: 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;
}
}
1151fd: 8b 45 08 mov 0x8(%ebp),%eax
115200: 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);
115203: 39 d0 cmp %edx,%eax
115205: 74 31 je 115238 <_Heap_Get_free_information+0x58>
115207: b9 01 00 00 00 mov $0x1,%ecx
11520c: 31 f6 xor %esi,%esi
11520e: 31 db xor %ebx,%ebx
115210: eb 07 jmp 115219 <_Heap_Get_free_information+0x39>
115212: 66 90 xchg %ax,%ax
115214: 8b 77 04 mov 0x4(%edi),%esi
115217: 89 c1 mov %eax,%ecx
- 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;
115219: 8b 42 04 mov 0x4(%edx),%eax
11521c: 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;
11521f: 01 c3 add %eax,%ebx
if ( info->largest < the_size )
115221: 39 f0 cmp %esi,%eax
115223: 76 03 jbe 115228 <_Heap_Get_free_information+0x48>
info->largest = the_size;
115225: 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)
115228: 8b 52 08 mov 0x8(%edx),%edx
11522b: 8d 41 01 lea 0x1(%ecx),%eax
info->number = 0;
info->largest = 0;
info->total = 0;
for(the_block = _Heap_Free_list_first(the_heap);
11522e: 39 55 08 cmp %edx,0x8(%ebp)
115231: 75 e1 jne 115214 <_Heap_Get_free_information+0x34>
115233: 89 0f mov %ecx,(%edi)
115235: 89 5f 08 mov %ebx,0x8(%edi)
info->number++;
info->total += the_size;
if ( info->largest < the_size )
info->largest = the_size;
}
}
115238: 5b pop %ebx
115239: 5e pop %esi
11523a: 5f pop %edi
11523b: c9 leave
11523c: c3 ret
00112044 <_Heap_Get_information>:
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
112044: 55 push %ebp
112045: 89 e5 mov %esp,%ebp
112047: 57 push %edi
112048: 56 push %esi
112049: 53 push %ebx
11204a: 83 ec 04 sub $0x4,%esp
11204d: 8b 45 08 mov 0x8(%ebp),%eax
112050: 8b 5d 0c mov 0xc(%ebp),%ebx
Heap_Block *the_block = the_heap->first_block;
112053: 8b 50 20 mov 0x20(%eax),%edx
Heap_Block *const end = the_heap->last_block;
112056: 8b 40 24 mov 0x24(%eax),%eax
112059: 89 45 f0 mov %eax,-0x10(%ebp)
memset(the_info, 0, sizeof(*the_info));
11205c: b9 18 00 00 00 mov $0x18,%ecx
112061: 31 c0 xor %eax,%eax
112063: 89 df mov %ebx,%edi
112065: f3 aa rep stos %al,%es:(%edi)
while ( the_block != end ) {
112067: 3b 55 f0 cmp -0x10(%ebp),%edx
11206a: 74 38 je 1120a4 <_Heap_Get_information+0x60><== NEVER TAKEN
11206c: 8b 7a 04 mov 0x4(%edx),%edi
11206f: eb 18 jmp 112089 <_Heap_Get_information+0x45>
112071: 8d 76 00 lea 0x0(%esi),%esi
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;
112074: 8d 43 0c lea 0xc(%ebx),%eax
else
info = &the_info->Free;
info->number++;
112077: ff 00 incl (%eax)
info->total += the_size;
112079: 01 48 08 add %ecx,0x8(%eax)
if ( info->largest < the_size )
11207c: 39 48 04 cmp %ecx,0x4(%eax)
11207f: 73 03 jae 112084 <_Heap_Get_information+0x40>
info->largest = the_size;
112081: 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 ) {
112084: 39 75 f0 cmp %esi,-0x10(%ebp)
112087: 74 1b je 1120a4 <_Heap_Get_information+0x60>
- 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;
112089: 89 f9 mov %edi,%ecx
11208b: 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);
11208e: 8d 34 0a lea (%edx,%ecx,1),%esi
112091: 89 f2 mov %esi,%edx
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
112093: 8b 7e 04 mov 0x4(%esi),%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) )
112096: f7 c7 01 00 00 00 test $0x1,%edi
11209c: 75 d6 jne 112074 <_Heap_Get_information+0x30>
info = &the_info->Used;
else
info = &the_info->Free;
11209e: 89 d8 mov %ebx,%eax
1120a0: eb d5 jmp 112077 <_Heap_Get_information+0x33>
1120a2: 66 90 xchg %ax,%ax
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
1120a4: 58 pop %eax
1120a5: 5b pop %ebx
1120a6: 5e pop %esi
1120a7: 5f pop %edi
1120a8: c9 leave
1120a9: c3 ret
0011f528 <_Heap_Resize_block>:
void *alloc_begin_ptr,
uintptr_t new_alloc_size,
uintptr_t *old_size,
uintptr_t *new_size
)
{
11f528: 55 push %ebp
11f529: 89 e5 mov %esp,%ebp
11f52b: 57 push %edi
11f52c: 56 push %esi
11f52d: 53 push %ebx
11f52e: 83 ec 2c sub $0x2c,%esp
11f531: 8b 5d 08 mov 0x8(%ebp),%ebx
11f534: 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);
11f537: 8d 4e f8 lea -0x8(%esi),%ecx
11f53a: 89 f0 mov %esi,%eax
11f53c: 31 d2 xor %edx,%edx
11f53e: 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);
11f541: 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;
11f543: 8b 45 14 mov 0x14(%ebp),%eax
11f546: c7 00 00 00 00 00 movl $0x0,(%eax)
*new_size = 0;
11f54c: 8b 55 18 mov 0x18(%ebp),%edx
11f54f: 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;
11f555: 39 4b 20 cmp %ecx,0x20(%ebx)
11f558: 77 05 ja 11f55f <_Heap_Resize_block+0x37>
11f55a: 39 4b 24 cmp %ecx,0x24(%ebx)
11f55d: 73 0d jae 11f56c <_Heap_Resize_block+0x44>
new_alloc_size,
old_size,
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
11f55f: b8 02 00 00 00 mov $0x2,%eax
}
}
11f564: 8d 65 f4 lea -0xc(%ebp),%esp
11f567: 5b pop %ebx
11f568: 5e pop %esi
11f569: 5f pop %edi
11f56a: c9 leave
11f56b: 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;
11f56c: 8b 41 04 mov 0x4(%ecx),%eax
11f56f: 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;
11f572: 8d 3c 01 lea (%ecx,%eax,1),%edi
11f575: 89 7d d4 mov %edi,-0x2c(%ebp)
uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS;
11f578: 89 fa mov %edi,%edx
11f57a: 29 f2 sub %esi,%edx
11f57c: 83 c2 04 add $0x4,%edx
11f57f: 89 55 e0 mov %edx,-0x20(%ebp)
11f582: 8b 57 04 mov 0x4(%edi),%edx
11f585: 83 e2 fe and $0xfffffffe,%edx
11f588: 89 55 d0 mov %edx,-0x30(%ebp)
RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
const Heap_Block *block
)
{
return !_Heap_Is_used( block );
11f58b: f6 44 17 04 01 testb $0x1,0x4(%edi,%edx,1)
11f590: 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;
11f594: 8b 55 e0 mov -0x20(%ebp),%edx
11f597: 8b 7d 14 mov 0x14(%ebp),%edi
11f59a: 89 17 mov %edx,(%edi)
if ( next_block_is_free ) {
11f59c: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
11f5a0: 75 6e jne 11f610 <_Heap_Resize_block+0xe8>
block_size += next_block_size;
alloc_size += next_block_size;
}
if ( new_alloc_size > alloc_size ) {
11f5a2: 8b 55 e0 mov -0x20(%ebp),%edx
11f5a5: 39 55 10 cmp %edx,0x10(%ebp)
11f5a8: 77 79 ja 11f623 <_Heap_Resize_block+0xfb>
return HEAP_RESIZE_UNSATISFIED;
}
if ( next_block_is_free ) {
11f5aa: 80 7d df 00 cmpb $0x0,-0x21(%ebp)
11f5ae: 74 31 je 11f5e1 <_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;
11f5b0: 8b 79 04 mov 0x4(%ecx),%edi
11f5b3: 83 e7 01 and $0x1,%edi
block->size_and_flag = size | flag;
11f5b6: 09 c7 or %eax,%edi
11f5b8: 89 79 04 mov %edi,0x4(%ecx)
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11f5bb: 8b 7d d4 mov -0x2c(%ebp),%edi
11f5be: 8b 7f 08 mov 0x8(%edi),%edi
11f5c1: 89 7d e4 mov %edi,-0x1c(%ebp)
11f5c4: 8b 55 d4 mov -0x2c(%ebp),%edx
11f5c7: 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;
11f5ca: 8b 55 e4 mov -0x1c(%ebp),%edx
11f5cd: 89 57 08 mov %edx,0x8(%edi)
next->prev = prev;
11f5d0: 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;
11f5d3: 83 4c 01 04 01 orl $0x1,0x4(%ecx,%eax,1)
/* Statistics */
--stats->free_blocks;
11f5d8: ff 4b 38 decl 0x38(%ebx)
stats->free_size -= next_block_size;
11f5db: 8b 7d d0 mov -0x30(%ebp),%edi
11f5de: 29 7b 30 sub %edi,0x30(%ebx)
}
block = _Heap_Block_allocate( heap, block, alloc_begin, new_alloc_size );
11f5e1: ff 75 10 pushl 0x10(%ebp)
11f5e4: 56 push %esi
11f5e5: 51 push %ecx
11f5e6: 53 push %ebx
11f5e7: e8 14 d2 fe ff call 10c800 <_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;
11f5ec: 8b 50 04 mov 0x4(%eax),%edx
11f5ef: 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;
11f5f2: 29 f0 sub %esi,%eax
11f5f4: 8d 44 10 04 lea 0x4(%eax,%edx,1),%eax
11f5f8: 8b 55 18 mov 0x18(%ebp),%edx
11f5fb: 89 02 mov %eax,(%edx)
/* Statistics */
++stats->resizes;
11f5fd: ff 43 54 incl 0x54(%ebx)
11f600: 83 c4 10 add $0x10,%esp
return HEAP_RESIZE_SUCCESSFUL;
11f603: 31 c0 xor %eax,%eax
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11f605: 8d 65 f4 lea -0xc(%ebp),%esp
11f608: 5b pop %ebx
11f609: 5e pop %esi
11f60a: 5f pop %edi
11f60b: c9 leave
11f60c: c3 ret
11f60d: 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;
11f610: 03 45 d0 add -0x30(%ebp),%eax
alloc_size += next_block_size;
11f613: 8b 7d d0 mov -0x30(%ebp),%edi
11f616: 01 fa add %edi,%edx
11f618: 89 55 e0 mov %edx,-0x20(%ebp)
}
if ( new_alloc_size > alloc_size ) {
11f61b: 8b 55 e0 mov -0x20(%ebp),%edx
11f61e: 39 55 10 cmp %edx,0x10(%ebp)
11f621: 76 87 jbe 11f5aa <_Heap_Resize_block+0x82>
return HEAP_RESIZE_UNSATISFIED;
11f623: b8 01 00 00 00 mov $0x1,%eax
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
11f628: 8d 65 f4 lea -0xc(%ebp),%esp
11f62b: 5b pop %ebx
11f62c: 5e pop %esi
11f62d: 5f pop %edi
11f62e: c9 leave
11f62f: c3 ret
0011f630 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
11f630: 55 push %ebp
11f631: 89 e5 mov %esp,%ebp
11f633: 56 push %esi
11f634: 53 push %ebx
11f635: 8b 5d 08 mov 0x8(%ebp),%ebx
11f638: 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);
11f63b: 8d 4e f8 lea -0x8(%esi),%ecx
11f63e: 89 f0 mov %esi,%eax
11f640: 31 d2 xor %edx,%edx
11f642: 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);
11f645: 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
11f647: 8b 43 20 mov 0x20(%ebx),%eax
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
11f64a: 39 c1 cmp %eax,%ecx
11f64c: 72 07 jb 11f655 <_Heap_Size_of_alloc_area+0x25>
11f64e: 8b 53 24 mov 0x24(%ebx),%edx
11f651: 39 d1 cmp %edx,%ecx
11f653: 76 07 jbe 11f65c <_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;
11f655: 31 c0 xor %eax,%eax
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
11f657: 5b pop %ebx
11f658: 5e pop %esi
11f659: c9 leave
11f65a: c3 ret
11f65b: 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;
11f65c: 8b 59 04 mov 0x4(%ecx),%ebx
11f65f: 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);
11f662: 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;
11f664: 39 c8 cmp %ecx,%eax
11f666: 77 ed ja 11f655 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
11f668: 39 ca cmp %ecx,%edx
11f66a: 72 e9 jb 11f655 <_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 )
11f66c: f6 41 04 01 testb $0x1,0x4(%ecx)
11f670: 74 e3 je 11f655 <_Heap_Size_of_alloc_area+0x25><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
11f672: 29 f1 sub %esi,%ecx
11f674: 8d 51 04 lea 0x4(%ecx),%edx
11f677: 8b 45 10 mov 0x10(%ebp),%eax
11f67a: 89 10 mov %edx,(%eax)
return true;
11f67c: b0 01 mov $0x1,%al
}
11f67e: 5b pop %ebx
11f67f: 5e pop %esi
11f680: c9 leave
11f681: c3 ret
0010d334 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
10d334: 55 push %ebp
10d335: 89 e5 mov %esp,%ebp
10d337: 57 push %edi
10d338: 56 push %esi
10d339: 53 push %ebx
10d33a: 83 ec 4c sub $0x4c,%esp
10d33d: 8b 5d 08 mov 0x8(%ebp),%ebx
uintptr_t const page_size = heap->page_size;
10d340: 8b 43 10 mov 0x10(%ebx),%eax
10d343: 89 45 e0 mov %eax,-0x20(%ebp)
uintptr_t const min_block_size = heap->min_block_size;
10d346: 8b 53 14 mov 0x14(%ebx),%edx
10d349: 89 55 d0 mov %edx,-0x30(%ebp)
Heap_Block *const first_block = heap->first_block;
10d34c: 8b 43 20 mov 0x20(%ebx),%eax
10d34f: 89 45 dc mov %eax,-0x24(%ebp)
Heap_Block *const last_block = heap->last_block;
10d352: 8b 53 24 mov 0x24(%ebx),%edx
10d355: 89 55 cc mov %edx,-0x34(%ebp)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
10d358: 80 7d 10 00 cmpb $0x0,0x10(%ebp)
10d35c: 74 1a je 10d378 <_Heap_Walk+0x44>
10d35e: c7 45 d8 ec d2 10 00 movl $0x10d2ec,-0x28(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10d365: 83 3d 20 a4 12 00 03 cmpl $0x3,0x12a420
10d36c: 74 1a je 10d388 <_Heap_Walk+0x54> <== ALWAYS TAKEN
}
block = next_block;
} while ( block != first_block );
return true;
10d36e: b0 01 mov $0x1,%al
}
10d370: 8d 65 f4 lea -0xc(%ebp),%esp
10d373: 5b pop %ebx
10d374: 5e pop %esi
10d375: 5f pop %edi
10d376: c9 leave
10d377: 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;
10d378: c7 45 d8 e4 d2 10 00 movl $0x10d2e4,-0x28(%ebp)
if ( !_System_state_Is_up( _System_state_Get() ) ) {
10d37f: 83 3d 20 a4 12 00 03 cmpl $0x3,0x12a420
10d386: 75 e6 jne 10d36e <_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)(
10d388: 52 push %edx
10d389: ff 73 0c pushl 0xc(%ebx)
10d38c: ff 73 08 pushl 0x8(%ebx)
10d38f: ff 75 cc pushl -0x34(%ebp)
10d392: ff 75 dc pushl -0x24(%ebp)
10d395: ff 73 1c pushl 0x1c(%ebx)
10d398: ff 73 18 pushl 0x18(%ebx)
10d39b: ff 75 d0 pushl -0x30(%ebp)
10d39e: ff 75 e0 pushl -0x20(%ebp)
10d3a1: 68 a4 25 12 00 push $0x1225a4
10d3a6: 6a 00 push $0x0
10d3a8: ff 75 0c pushl 0xc(%ebp)
10d3ab: 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 ) {
10d3ae: 83 c4 30 add $0x30,%esp
10d3b1: 8b 45 e0 mov -0x20(%ebp),%eax
10d3b4: 85 c0 test %eax,%eax
10d3b6: 74 70 je 10d428 <_Heap_Walk+0xf4>
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
10d3b8: f6 45 e0 03 testb $0x3,-0x20(%ebp)
10d3bc: 75 72 jne 10d430 <_Heap_Walk+0xfc>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d3be: 8b 45 d0 mov -0x30(%ebp),%eax
10d3c1: 31 d2 xor %edx,%edx
10d3c3: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
10d3c6: 85 d2 test %edx,%edx
10d3c8: 75 72 jne 10d43c <_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;
10d3ca: 8b 45 dc mov -0x24(%ebp),%eax
10d3cd: 83 c0 08 add $0x8,%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d3d0: 31 d2 xor %edx,%edx
10d3d2: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if (
10d3d5: 85 d2 test %edx,%edx
10d3d7: 75 6f jne 10d448 <_Heap_Walk+0x114>
block = next_block;
} while ( block != first_block );
return true;
}
10d3d9: 8b 45 dc mov -0x24(%ebp),%eax
10d3dc: 8b 40 04 mov 0x4(%eax),%eax
10d3df: 89 45 e4 mov %eax,-0x1c(%ebp)
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
10d3e2: a8 01 test $0x1,%al
10d3e4: 0f 84 ce 02 00 00 je 10d6b8 <_Heap_Walk+0x384>
- 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;
10d3ea: 8b 55 cc mov -0x34(%ebp),%edx
10d3ed: 8b 42 04 mov 0x4(%edx),%eax
10d3f0: 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);
10d3f3: 01 d0 add %edx,%eax
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
10d3f5: f6 40 04 01 testb $0x1,0x4(%eax)
10d3f9: 74 25 je 10d420 <_Heap_Walk+0xec>
);
return false;
}
if (
10d3fb: 39 45 dc cmp %eax,-0x24(%ebp)
10d3fe: 74 54 je 10d454 <_Heap_Walk+0x120> <== ALWAYS TAKEN
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
10d400: 51 push %ecx <== NOT EXECUTED
10d401: 68 c0 26 12 00 push $0x1226c0 <== NOT EXECUTED
10d406: 66 90 xchg %ax,%ax <== NOT EXECUTED
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10d408: 6a 01 push $0x1
10d40a: ff 75 0c pushl 0xc(%ebp)
10d40d: ff 55 d8 call *-0x28(%ebp)
10d410: 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;
10d413: 31 c0 xor %eax,%eax
block = next_block;
} while ( block != first_block );
return true;
}
10d415: 8d 65 f4 lea -0xc(%ebp),%esp
10d418: 5b pop %ebx
10d419: 5e pop %esi
10d41a: 5f pop %edi
10d41b: c9 leave
10d41c: c3 ret
10d41d: 8d 76 00 lea 0x0(%esi),%esi
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
10d420: 53 push %ebx
10d421: 68 5a 25 12 00 push $0x12255a
10d426: eb e0 jmp 10d408 <_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" );
10d428: 57 push %edi
10d429: 68 29 25 12 00 push $0x122529
10d42e: eb d8 jmp 10d408 <_Heap_Walk+0xd4>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
10d430: ff 75 e0 pushl -0x20(%ebp)
10d433: 68 3c 25 12 00 push $0x12253c
10d438: eb ce jmp 10d408 <_Heap_Walk+0xd4>
10d43a: 66 90 xchg %ax,%ax
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
10d43c: ff 75 d0 pushl -0x30(%ebp)
10d43f: 68 38 26 12 00 push $0x122638
10d444: eb c2 jmp 10d408 <_Heap_Walk+0xd4>
10d446: 66 90 xchg %ax,%ax
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
10d448: ff 75 dc pushl -0x24(%ebp)
10d44b: 68 5c 26 12 00 push $0x12265c
10d450: eb b6 jmp 10d408 <_Heap_Walk+0xd4>
10d452: 66 90 xchg %ax,%ax
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
10d454: 8b 43 10 mov 0x10(%ebx),%eax
10d457: 89 45 c8 mov %eax,-0x38(%ebp)
block = next_block;
} while ( block != first_block );
return true;
}
10d45a: 8b 73 08 mov 0x8(%ebx),%esi
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 ) {
10d45d: 39 f3 cmp %esi,%ebx
10d45f: 74 65 je 10d4c6 <_Heap_Walk+0x192>
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 f0 cmp %esi,%eax
10d469: 0f 87 55 02 00 00 ja 10d6c4 <_Heap_Walk+0x390> <== NEVER TAKEN
10d46f: 8b 7b 24 mov 0x24(%ebx),%edi
10d472: 39 f7 cmp %esi,%edi
10d474: 0f 82 4a 02 00 00 jb 10d6c4 <_Heap_Walk+0x390> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d47a: 8d 46 08 lea 0x8(%esi),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d47d: 31 d2 xor %edx,%edx
10d47f: f7 75 c8 divl -0x38(%ebp)
);
return false;
}
if (
10d482: 85 d2 test %edx,%edx
10d484: 0f 85 71 02 00 00 jne 10d6fb <_Heap_Walk+0x3c7> <== 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;
10d48a: 8b 46 04 mov 0x4(%esi),%eax
10d48d: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d490: f6 44 06 04 01 testb $0x1,0x4(%esi,%eax,1)
10d495: 0f 85 6d 02 00 00 jne 10d708 <_Heap_Walk+0x3d4> <== NEVER TAKEN
10d49b: 89 da mov %ebx,%edx
10d49d: 8d 76 00 lea 0x0(%esi),%esi
);
return false;
}
if ( free_block->prev != prev_block ) {
10d4a0: 8b 46 0c mov 0xc(%esi),%eax
10d4a3: 39 d0 cmp %edx,%eax
10d4a5: 0f 85 6a 02 00 00 jne 10d715 <_Heap_Walk+0x3e1>
return false;
}
prev_block = free_block;
free_block = free_block->next;
10d4ab: 8b 4e 08 mov 0x8(%esi),%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 ) {
10d4ae: 39 cb cmp %ecx,%ebx
10d4b0: 74 1a je 10d4cc <_Heap_Walk+0x198>
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;
10d4b2: 39 4d d4 cmp %ecx,-0x2c(%ebp)
10d4b5: 0f 86 7d 01 00 00 jbe 10d638 <_Heap_Walk+0x304>
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
10d4bb: 51 push %ecx
10d4bc: 68 f0 26 12 00 push $0x1226f0
10d4c1: e9 42 ff ff ff jmp 10d408 <_Heap_Walk+0xd4>
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 ) {
10d4c6: 8b 53 20 mov 0x20(%ebx),%edx
10d4c9: 89 55 d4 mov %edx,-0x2c(%ebp)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d4cc: 8b 7d dc mov -0x24(%ebp),%edi
10d4cf: 8b 45 d4 mov -0x2c(%ebp),%eax
10d4d2: 66 90 xchg %ax,%ax
- 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;
10d4d4: 8b 4d e4 mov -0x1c(%ebp),%ecx
10d4d7: 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);
10d4da: 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;
10d4dd: 39 f0 cmp %esi,%eax
10d4df: 76 23 jbe 10d504 <_Heap_Walk+0x1d0> <== 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)(
10d4e1: 83 ec 0c sub $0xc,%esp
10d4e4: 56 push %esi
10d4e5: 57 push %edi
10d4e6: 68 74 27 12 00 push $0x122774
10d4eb: 90 nop
10d4ec: 6a 01 push $0x1
10d4ee: ff 75 0c pushl 0xc(%ebp)
10d4f1: ff 55 d8 call *-0x28(%ebp)
"block 0x%08x: next block 0x%08x not in heap\n",
block,
next_block
);
return false;
10d4f4: 83 c4 20 add $0x20,%esp
10d4f7: 31 c0 xor %eax,%eax
block = next_block;
} while ( block != first_block );
return true;
}
10d4f9: 8d 65 f4 lea -0xc(%ebp),%esp
10d4fc: 5b pop %ebx
10d4fd: 5e pop %esi
10d4fe: 5f pop %edi
10d4ff: c9 leave
10d500: c3 ret
10d501: 8d 76 00 lea 0x0(%esi),%esi
10d504: 39 73 24 cmp %esi,0x24(%ebx)
10d507: 72 d8 jb 10d4e1 <_Heap_Walk+0x1ad>
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;
10d509: 3b 7d cc cmp -0x34(%ebp),%edi
10d50c: 0f 95 45 d4 setne -0x2c(%ebp)
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d510: 89 c8 mov %ecx,%eax
10d512: 31 d2 xor %edx,%edx
10d514: f7 75 e0 divl -0x20(%ebp)
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
10d517: 85 d2 test %edx,%edx
10d519: 74 0a je 10d525 <_Heap_Walk+0x1f1>
10d51b: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d51f: 0f 85 a6 01 00 00 jne 10d6cb <_Heap_Walk+0x397>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
10d525: 39 4d d0 cmp %ecx,-0x30(%ebp)
10d528: 76 0a jbe 10d534 <_Heap_Walk+0x200>
10d52a: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d52e: 0f 85 a6 01 00 00 jne 10d6da <_Heap_Walk+0x3a6> <== ALWAYS TAKEN
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
10d534: 39 f7 cmp %esi,%edi
10d536: 72 0a jb 10d542 <_Heap_Walk+0x20e>
10d538: 80 7d d4 00 cmpb $0x0,-0x2c(%ebp)
10d53c: 0f 85 aa 01 00 00 jne 10d6ec <_Heap_Walk+0x3b8>
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;
10d542: 8b 55 e4 mov -0x1c(%ebp),%edx
10d545: 83 e2 01 and $0x1,%edx
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
10d548: f6 46 04 01 testb $0x1,0x4(%esi)
10d54c: 74 4e je 10d59c <_Heap_Walk+0x268>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
10d54e: 85 d2 test %edx,%edx
10d550: 74 2e je 10d580 <_Heap_Walk+0x24c>
(*printer)(
10d552: 83 ec 0c sub $0xc,%esp
10d555: 51 push %ecx
10d556: 57 push %edi
10d557: 68 8b 25 12 00 push $0x12258b
10d55c: 6a 00 push $0x0
10d55e: ff 75 0c pushl 0xc(%ebp)
10d561: ff 55 d8 call *-0x28(%ebp)
10d564: 83 c4 20 add $0x20,%esp
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
10d567: 39 75 dc cmp %esi,-0x24(%ebp)
10d56a: 0f 84 fe fd ff ff je 10d36e <_Heap_Walk+0x3a>
10d570: 8b 56 04 mov 0x4(%esi),%edx
10d573: 89 55 e4 mov %edx,-0x1c(%ebp)
10d576: 8b 43 20 mov 0x20(%ebx),%eax
10d579: 89 f7 mov %esi,%edi
10d57b: e9 54 ff ff ff jmp 10d4d4 <_Heap_Walk+0x1a0>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
10d580: 83 ec 08 sub $0x8,%esp
10d583: ff 37 pushl (%edi)
10d585: 51 push %ecx
10d586: 57 push %edi
10d587: 68 d8 28 12 00 push $0x1228d8
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
10d597: eb ce jmp 10d567 <_Heap_Walk+0x233>
10d599: 8d 76 00 lea 0x0(%esi),%esi
block = next_block;
} while ( block != first_block );
return true;
}
10d59c: 8b 43 08 mov 0x8(%ebx),%eax
10d59f: 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 ?
10d5a2: 8b 47 08 mov 0x8(%edi),%eax
10d5a5: 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)(
10d5a8: 39 43 0c cmp %eax,0xc(%ebx)
10d5ab: 0f 84 cb 00 00 00 je 10d67c <_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)" : "")
10d5b1: 39 c3 cmp %eax,%ebx
10d5b3: 0f 84 db 00 00 00 je 10d694 <_Heap_Walk+0x360>
10d5b9: c7 45 c8 29 24 12 00 movl $0x122429,-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 ?
10d5c0: 8b 47 0c mov 0xc(%edi),%eax
10d5c3: 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)(
10d5c6: 39 45 b4 cmp %eax,-0x4c(%ebp)
10d5c9: 0f 84 b9 00 00 00 je 10d688 <_Heap_Walk+0x354>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10d5cf: 39 c3 cmp %eax,%ebx
10d5d1: 0f 84 c9 00 00 00 je 10d6a0 <_Heap_Walk+0x36c>
10d5d7: b8 29 24 12 00 mov $0x122429,%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)(
10d5dc: 83 ec 0c sub $0xc,%esp
10d5df: ff 75 c8 pushl -0x38(%ebp)
10d5e2: ff 75 e4 pushl -0x1c(%ebp)
10d5e5: 50 push %eax
10d5e6: ff 75 d4 pushl -0x2c(%ebp)
10d5e9: 51 push %ecx
10d5ea: 57 push %edi
10d5eb: 68 34 28 12 00 push $0x122834
10d5f0: 6a 00 push $0x0
10d5f2: ff 75 0c pushl 0xc(%ebp)
10d5f5: 89 55 c4 mov %edx,-0x3c(%ebp)
10d5f8: 89 4d c0 mov %ecx,-0x40(%ebp)
10d5fb: 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 ) {
10d5fe: 8b 06 mov (%esi),%eax
10d600: 83 c4 30 add $0x30,%esp
10d603: 8b 4d c0 mov -0x40(%ebp),%ecx
10d606: 39 c1 cmp %eax,%ecx
10d608: 8b 55 c4 mov -0x3c(%ebp),%edx
10d60b: 75 5f jne 10d66c <_Heap_Walk+0x338>
);
return false;
}
if ( !prev_used ) {
10d60d: 85 d2 test %edx,%edx
10d60f: 0f 84 97 00 00 00 je 10d6ac <_Heap_Walk+0x378>
block = next_block;
} while ( block != first_block );
return true;
}
10d615: 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 ) {
10d618: 39 c3 cmp %eax,%ebx
10d61a: 74 0f je 10d62b <_Heap_Walk+0x2f7> <== NEVER TAKEN
if ( free_block == block ) {
10d61c: 39 c7 cmp %eax,%edi
10d61e: 0f 84 43 ff ff ff je 10d567 <_Heap_Walk+0x233>
return true;
}
free_block = free_block->next;
10d624: 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 ) {
10d627: 39 c3 cmp %eax,%ebx
10d629: 75 f1 jne 10d61c <_Heap_Walk+0x2e8>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
10d62b: 57 push %edi
10d62c: 68 00 29 12 00 push $0x122900
10d631: e9 d2 fd ff ff jmp 10d408 <_Heap_Walk+0xd4>
10d636: 66 90 xchg %ax,%ax
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;
10d638: 39 f9 cmp %edi,%ecx
10d63a: 0f 87 7b fe ff ff ja 10d4bb <_Heap_Walk+0x187> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
10d640: 8d 41 08 lea 0x8(%ecx),%eax
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
10d643: 31 d2 xor %edx,%edx
10d645: f7 75 c8 divl -0x38(%ebp)
);
return false;
}
if (
10d648: 85 d2 test %edx,%edx
10d64a: 0f 85 ad 00 00 00 jne 10d6fd <_Heap_Walk+0x3c9>
- 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;
10d650: 8b 41 04 mov 0x4(%ecx),%eax
10d653: 83 e0 fe and $0xfffffffe,%eax
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d656: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1)
10d65b: 0f 85 a9 00 00 00 jne 10d70a <_Heap_Walk+0x3d6>
10d661: 89 f2 mov %esi,%edx
10d663: 89 ce mov %ecx,%esi
10d665: e9 36 fe ff ff jmp 10d4a0 <_Heap_Walk+0x16c>
10d66a: 66 90 xchg %ax,%ax
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
10d66c: 52 push %edx
10d66d: 56 push %esi
10d66e: 50 push %eax
10d66f: 51 push %ecx
10d670: 57 push %edi
10d671: 68 6c 28 12 00 push $0x12286c
10d676: e9 71 fe ff ff jmp 10d4ec <_Heap_Walk+0x1b8>
10d67b: 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)(
10d67c: c7 45 c8 f6 24 12 00 movl $0x1224f6,-0x38(%ebp)
10d683: e9 38 ff ff ff jmp 10d5c0 <_Heap_Walk+0x28c>
10d688: b8 0f 25 12 00 mov $0x12250f,%eax
10d68d: e9 4a ff ff ff jmp 10d5dc <_Heap_Walk+0x2a8>
10d692: 66 90 xchg %ax,%ax
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
10d694: c7 45 c8 05 25 12 00 movl $0x122505,-0x38(%ebp)
10d69b: e9 20 ff ff ff jmp 10d5c0 <_Heap_Walk+0x28c>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
10d6a0: b8 1f 25 12 00 mov $0x12251f,%eax
10d6a5: e9 32 ff ff ff jmp 10d5dc <_Heap_Walk+0x2a8>
10d6aa: 66 90 xchg %ax,%ax
return false;
}
if ( !prev_used ) {
(*printer)(
10d6ac: 57 push %edi
10d6ad: 68 a8 28 12 00 push $0x1228a8
10d6b2: e9 51 fd ff ff jmp 10d408 <_Heap_Walk+0xd4>
10d6b7: 90 nop
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
10d6b8: 56 push %esi
10d6b9: 68 90 26 12 00 push $0x122690
10d6be: e9 45 fd ff ff jmp 10d408 <_Heap_Walk+0xd4>
10d6c3: 90 nop
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;
10d6c4: 89 f1 mov %esi,%ecx <== NOT EXECUTED
10d6c6: e9 f0 fd ff ff jmp 10d4bb <_Heap_Walk+0x187> <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
10d6cb: 83 ec 0c sub $0xc,%esp
10d6ce: 51 push %ecx
10d6cf: 57 push %edi
10d6d0: 68 a4 27 12 00 push $0x1227a4
10d6d5: e9 12 fe ff ff jmp 10d4ec <_Heap_Walk+0x1b8>
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
10d6da: 83 ec 08 sub $0x8,%esp
10d6dd: ff 75 d0 pushl -0x30(%ebp)
10d6e0: 51 push %ecx
10d6e1: 57 push %edi
10d6e2: 68 d4 27 12 00 push $0x1227d4
10d6e7: e9 00 fe ff ff jmp 10d4ec <_Heap_Walk+0x1b8>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
10d6ec: 83 ec 0c sub $0xc,%esp
10d6ef: 56 push %esi
10d6f0: 57 push %edi
10d6f1: 68 00 28 12 00 push $0x122800
10d6f6: e9 f1 fd ff ff jmp 10d4ec <_Heap_Walk+0x1b8>
);
return false;
}
if (
10d6fb: 89 f1 mov %esi,%ecx <== NOT EXECUTED
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
10d6fd: 51 push %ecx
10d6fe: 68 10 27 12 00 push $0x122710
10d703: e9 00 fd ff ff jmp 10d408 <_Heap_Walk+0xd4>
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
10d708: 89 f1 mov %esi,%ecx <== NOT EXECUTED
(*printer)(
10d70a: 51 push %ecx
10d70b: 68 6f 25 12 00 push $0x12256f
10d710: e9 f3 fc ff ff jmp 10d408 <_Heap_Walk+0xd4>
return false;
}
if ( free_block->prev != prev_block ) {
(*printer)(
10d715: 83 ec 0c sub $0xc,%esp
10d718: 50 push %eax
10d719: 56 push %esi
10d71a: 68 40 27 12 00 push $0x122740
10d71f: e9 c8 fd ff ff jmp 10d4ec <_Heap_Walk+0x1b8>
0010bda0 <_IO_Initialize_all_drivers>:
*
* Output Parameters: NONE
*/
void _IO_Initialize_all_drivers( void )
{
10bda0: 55 push %ebp
10bda1: 89 e5 mov %esp,%ebp
10bda3: 53 push %ebx
10bda4: 83 ec 04 sub $0x4,%esp
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
10bda7: 8b 0d 00 88 12 00 mov 0x128800,%ecx
10bdad: 85 c9 test %ecx,%ecx
10bdaf: 74 1a je 10bdcb <_IO_Initialize_all_drivers+0x2b><== NEVER TAKEN
10bdb1: 31 db xor %ebx,%ebx
10bdb3: 90 nop
(void) rtems_io_initialize( major, 0, NULL );
10bdb4: 52 push %edx
10bdb5: 6a 00 push $0x0
10bdb7: 6a 00 push $0x0
10bdb9: 53 push %ebx
10bdba: e8 85 52 00 00 call 111044 <rtems_io_initialize>
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
10bdbf: 43 inc %ebx
10bdc0: 83 c4 10 add $0x10,%esp
10bdc3: 39 1d 00 88 12 00 cmp %ebx,0x128800
10bdc9: 77 e9 ja 10bdb4 <_IO_Initialize_all_drivers+0x14>
(void) rtems_io_initialize( major, 0, NULL );
}
10bdcb: 8b 5d fc mov -0x4(%ebp),%ebx
10bdce: c9 leave
10bdcf: c3 ret
0010bd08 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
10bd08: 55 push %ebp
10bd09: 89 e5 mov %esp,%ebp
10bd0b: 57 push %edi
10bd0c: 56 push %esi
10bd0d: 53 push %ebx
10bd0e: 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;
10bd11: 8b 1d b4 3a 12 00 mov 0x123ab4,%ebx
drivers_in_table = Configuration.number_of_device_drivers;
10bd17: a1 b0 3a 12 00 mov 0x123ab0,%eax
10bd1c: 89 45 e4 mov %eax,-0x1c(%ebp)
number_of_drivers = Configuration.maximum_drivers;
10bd1f: 8b 35 ac 3a 12 00 mov 0x123aac,%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 )
10bd25: 39 f0 cmp %esi,%eax
10bd27: 73 5f jae 10bd88 <_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(
10bd29: 8d 0c 76 lea (%esi,%esi,2),%ecx
10bd2c: c1 e1 03 shl $0x3,%ecx
10bd2f: 83 ec 0c sub $0xc,%esp
10bd32: 51 push %ecx
10bd33: 89 4d dc mov %ecx,-0x24(%ebp)
10bd36: e8 81 2c 00 00 call 10e9bc <_Workspace_Allocate_or_fatal_error>
10bd3b: 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 *)
10bd3d: a3 04 88 12 00 mov %eax,0x128804
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
10bd42: 89 35 00 88 12 00 mov %esi,0x128800
memset(
10bd48: 31 c0 xor %eax,%eax
10bd4a: 8b 4d dc mov -0x24(%ebp),%ecx
10bd4d: 89 d7 mov %edx,%edi
10bd4f: 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++ )
10bd51: 83 c4 10 add $0x10,%esp
10bd54: 8b 45 e4 mov -0x1c(%ebp),%eax
10bd57: 85 c0 test %eax,%eax
10bd59: 74 25 je 10bd80 <_IO_Manager_initialization+0x78><== NEVER TAKEN
10bd5b: a1 04 88 12 00 mov 0x128804,%eax
10bd60: 89 45 e0 mov %eax,-0x20(%ebp)
10bd63: 31 c0 xor %eax,%eax
10bd65: 31 d2 xor %edx,%edx
10bd67: 90 nop
_IO_Driver_address_table[index] = driver_table[index];
10bd68: 8b 7d e0 mov -0x20(%ebp),%edi
10bd6b: 01 c7 add %eax,%edi
10bd6d: 8d 34 03 lea (%ebx,%eax,1),%esi
10bd70: b9 06 00 00 00 mov $0x6,%ecx
10bd75: 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++ )
10bd77: 42 inc %edx
10bd78: 83 c0 18 add $0x18,%eax
10bd7b: 39 55 e4 cmp %edx,-0x1c(%ebp)
10bd7e: 77 e8 ja 10bd68 <_IO_Manager_initialization+0x60>
_IO_Driver_address_table[index] = driver_table[index];
}
10bd80: 8d 65 f4 lea -0xc(%ebp),%esp
10bd83: 5b pop %ebx
10bd84: 5e pop %esi
10bd85: 5f pop %edi
10bd86: c9 leave
10bd87: 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;
10bd88: 89 1d 04 88 12 00 mov %ebx,0x128804
_IO_Number_of_drivers = number_of_drivers;
10bd8e: 8b 45 e4 mov -0x1c(%ebp),%eax
10bd91: a3 00 88 12 00 mov %eax,0x128800
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
10bd96: 8d 65 f4 lea -0xc(%ebp),%esp
10bd99: 5b pop %ebx
10bd9a: 5e pop %esi
10bd9b: 5f pop %edi
10bd9c: c9 leave
10bd9d: c3 ret
0010c8f4 <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10c8f4: 55 push %ebp
10c8f5: 89 e5 mov %esp,%ebp
10c8f7: 53 push %ebx
10c8f8: 83 ec 08 sub $0x8,%esp
10c8fb: 8b 45 08 mov 0x8(%ebp),%eax
10c8fe: 8b 55 0c mov 0xc(%ebp),%edx
10c901: 8b 5d 10 mov 0x10(%ebp),%ebx
_Internal_errors_What_happened.the_source = the_source;
10c904: a3 34 7e 12 00 mov %eax,0x127e34
_Internal_errors_What_happened.is_internal = is_internal;
10c909: 88 15 38 7e 12 00 mov %dl,0x127e38
_Internal_errors_What_happened.the_error = the_error;
10c90f: 89 1d 3c 7e 12 00 mov %ebx,0x127e3c
_User_extensions_Fatal( the_source, is_internal, the_error );
10c915: 53 push %ebx
10c916: 0f b6 d2 movzbl %dl,%edx
10c919: 52 push %edx
10c91a: 50 push %eax
10c91b: e8 9c 1c 00 00 call 10e5bc <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
10c920: c7 05 20 7f 12 00 05 movl $0x5,0x127f20 <== NOT EXECUTED
10c927: 00 00 00
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
10c92a: fa cli <== NOT EXECUTED
10c92b: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10c92d: f4 hlt <== NOT EXECUTED
10c92e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c931: eb fe jmp 10c931 <_Internal_error_Occurred+0x3d><== NOT EXECUTED
0011161c <_Objects_API_maximum_class>:
#include <rtems/score/object.h>
unsigned int _Objects_API_maximum_class(
uint32_t api
)
{
11161c: 55 push %ebp
11161d: 89 e5 mov %esp,%ebp
11161f: 8b 45 08 mov 0x8(%ebp),%eax
111622: 48 dec %eax
111623: 83 f8 02 cmp $0x2,%eax
111626: 77 0c ja 111634 <_Objects_API_maximum_class+0x18>
111628: 8b 04 85 a0 1b 12 00 mov 0x121ba0(,%eax,4),%eax
case OBJECTS_NO_API:
default:
break;
}
return 0;
}
11162f: c9 leave
111630: c3 ret
111631: 8d 76 00 lea 0x0(%esi),%esi
#include <rtems/score/object.h>
unsigned int _Objects_API_maximum_class(
uint32_t api
)
{
111634: 31 c0 xor %eax,%eax
case OBJECTS_NO_API:
default:
break;
}
return 0;
}
111636: c9 leave
111637: c3 ret
0010c984 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
10c984: 55 push %ebp
10c985: 89 e5 mov %esp,%ebp
10c987: 56 push %esi
10c988: 53 push %ebx
10c989: 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 )
10c98c: 8b 43 18 mov 0x18(%ebx),%eax
10c98f: 85 c0 test %eax,%eax
10c991: 75 0d jne 10c9a0 <_Objects_Allocate+0x1c><== ALWAYS TAKEN
return NULL;
10c993: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
);
}
#endif
return the_object;
}
10c995: 89 c8 mov %ecx,%eax
10c997: 8d 65 f8 lea -0x8(%ebp),%esp
10c99a: 5b pop %ebx
10c99b: 5e pop %esi
10c99c: c9 leave
10c99d: c3 ret
10c99e: 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 );
10c9a0: 8d 73 20 lea 0x20(%ebx),%esi
10c9a3: 83 ec 0c sub $0xc,%esp
10c9a6: 56 push %esi
10c9a7: e8 68 f6 ff ff call 10c014 <_Chain_Get>
10c9ac: 89 c1 mov %eax,%ecx
if ( information->auto_extend ) {
10c9ae: 83 c4 10 add $0x10,%esp
10c9b1: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10c9b5: 74 de je 10c995 <_Objects_Allocate+0x11>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
10c9b7: 85 c0 test %eax,%eax
10c9b9: 74 29 je 10c9e4 <_Objects_Allocate+0x60>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
10c9bb: 0f b7 41 08 movzwl 0x8(%ecx),%eax
10c9bf: 0f b7 53 08 movzwl 0x8(%ebx),%edx
10c9c3: 29 d0 sub %edx,%eax
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
10c9c5: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10c9c9: 31 d2 xor %edx,%edx
10c9cb: f7 f6 div %esi
information->inactive_per_block[ block ]--;
10c9cd: c1 e0 02 shl $0x2,%eax
10c9d0: 03 43 30 add 0x30(%ebx),%eax
10c9d3: ff 08 decl (%eax)
information->inactive--;
10c9d5: 66 ff 4b 2c decw 0x2c(%ebx)
);
}
#endif
return the_object;
}
10c9d9: 89 c8 mov %ecx,%eax
10c9db: 8d 65 f8 lea -0x8(%ebp),%esp
10c9de: 5b pop %ebx
10c9df: 5e pop %esi
10c9e0: c9 leave
10c9e1: c3 ret
10c9e2: 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 );
10c9e4: 83 ec 0c sub $0xc,%esp
10c9e7: 53 push %ebx
10c9e8: e8 3b 00 00 00 call 10ca28 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
10c9ed: 89 34 24 mov %esi,(%esp)
10c9f0: e8 1f f6 ff ff call 10c014 <_Chain_Get>
10c9f5: 89 c1 mov %eax,%ecx
}
if ( the_object ) {
10c9f7: 83 c4 10 add $0x10,%esp
10c9fa: 85 c0 test %eax,%eax
10c9fc: 74 97 je 10c995 <_Objects_Allocate+0x11>
10c9fe: eb bb jmp 10c9bb <_Objects_Allocate+0x37>
0010ca28 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
10ca28: 55 push %ebp
10ca29: 89 e5 mov %esp,%ebp
10ca2b: 57 push %edi
10ca2c: 56 push %esi
10ca2d: 53 push %ebx
10ca2e: 83 ec 4c sub $0x4c,%esp
10ca31: 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 );
10ca34: 0f b7 43 08 movzwl 0x8(%ebx),%eax
10ca38: 89 45 cc mov %eax,-0x34(%ebp)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
10ca3b: 8b 4b 34 mov 0x34(%ebx),%ecx
10ca3e: 85 c9 test %ecx,%ecx
10ca40: 0f 84 62 02 00 00 je 10cca8 <_Objects_Extend_information+0x280>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
10ca46: 8b 73 10 mov 0x10(%ebx),%esi
10ca49: 66 89 75 d0 mov %si,-0x30(%ebp)
10ca4d: 8b 7b 14 mov 0x14(%ebx),%edi
10ca50: 89 f0 mov %esi,%eax
10ca52: 31 d2 xor %edx,%edx
10ca54: 66 f7 f7 div %di
10ca57: 0f b7 f0 movzwl %ax,%esi
for ( ; block < block_count; block++ ) {
10ca5a: 85 f6 test %esi,%esi
10ca5c: 0f 84 5f 02 00 00 je 10ccc1 <_Objects_Extend_information+0x299><== NEVER TAKEN
if ( information->object_blocks[ block ] == NULL ) {
10ca62: 8b 01 mov (%ecx),%eax
10ca64: 85 c0 test %eax,%eax
10ca66: 0f 84 67 02 00 00 je 10ccd3 <_Objects_Extend_information+0x2ab><== NEVER TAKEN
10ca6c: 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 );
10ca6f: 8b 55 cc mov -0x34(%ebp),%edx
10ca72: 89 55 d4 mov %edx,-0x2c(%ebp)
index_base = minimum_index;
block = 0;
10ca75: 31 d2 xor %edx,%edx
10ca77: 8b 45 d4 mov -0x2c(%ebp),%eax
10ca7a: eb 0a jmp 10ca86 <_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 ) {
10ca7c: 83 3c 91 00 cmpl $0x0,(%ecx,%edx,4)
10ca80: 0f 84 c2 01 00 00 je 10cc48 <_Objects_Extend_information+0x220>
do_extend = false;
break;
} else
index_base += information->allocation_size;
10ca86: 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++ ) {
10ca88: 42 inc %edx
10ca89: 39 d6 cmp %edx,%esi
10ca8b: 77 ef ja 10ca7c <_Objects_Extend_information+0x54>
10ca8d: 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;
10ca90: b1 01 mov $0x1,%cl
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
10ca92: 0f b7 45 d0 movzwl -0x30(%ebp),%eax
10ca96: 01 f8 add %edi,%eax
10ca98: 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 ) {
10ca9b: 3d ff ff 00 00 cmp $0xffff,%eax
10caa0: 0f 87 9a 01 00 00 ja 10cc40 <_Objects_Extend_information+0x218><== 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;
10caa6: 0f af 7b 18 imul 0x18(%ebx),%edi
if ( information->auto_extend ) {
10caaa: 80 7b 12 00 cmpb $0x0,0x12(%ebx)
10caae: 0f 84 a0 01 00 00 je 10cc54 <_Objects_Extend_information+0x22c>
new_object_block = _Workspace_Allocate( block_size );
10cab4: 83 ec 0c sub $0xc,%esp
10cab7: 57 push %edi
10cab8: 89 55 b8 mov %edx,-0x48(%ebp)
10cabb: 88 4d b4 mov %cl,-0x4c(%ebp)
10cabe: e8 c5 1e 00 00 call 10e988 <_Workspace_Allocate>
10cac3: 89 45 c8 mov %eax,-0x38(%ebp)
if ( !new_object_block )
10cac6: 83 c4 10 add $0x10,%esp
10cac9: 85 c0 test %eax,%eax
10cacb: 8b 55 b8 mov -0x48(%ebp),%edx
10cace: 8a 4d b4 mov -0x4c(%ebp),%cl
10cad1: 0f 84 69 01 00 00 je 10cc40 <_Objects_Extend_information+0x218>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
10cad7: 84 c9 test %cl,%cl
10cad9: 0f 84 e6 00 00 00 je 10cbc5 <_Objects_Extend_information+0x19d>
*/
/*
* Up the block count and maximum
*/
block_count++;
10cadf: 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 );
10cae2: 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 *)) +
10cae5: 8d 04 7f lea (%edi,%edi,2),%eax
((maximum + minimum_index) * sizeof(Objects_Control *));
10cae8: 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 *)) +
10caeb: 03 45 cc add -0x34(%ebp),%eax
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
10caee: 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 );
10caf1: 50 push %eax
10caf2: 89 55 b8 mov %edx,-0x48(%ebp)
10caf5: e8 8e 1e 00 00 call 10e988 <_Workspace_Allocate>
10cafa: 89 45 c4 mov %eax,-0x3c(%ebp)
if ( !object_blocks ) {
10cafd: 83 c4 10 add $0x10,%esp
10cb00: 85 c0 test %eax,%eax
10cb02: 8b 55 b8 mov -0x48(%ebp),%edx
10cb05: 0f 84 da 01 00 00 je 10cce5 <_Objects_Extend_information+0x2bd>
10cb0b: 8b 45 c4 mov -0x3c(%ebp),%eax
10cb0e: 8d 04 b8 lea (%eax,%edi,4),%eax
10cb11: 89 45 bc mov %eax,-0x44(%ebp)
10cb14: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb17: 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 ) {
10cb1a: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10cb1e: 39 4d cc cmp %ecx,-0x34(%ebp)
10cb21: 0f 82 4d 01 00 00 jb 10cc74 <_Objects_Extend_information+0x24c>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
10cb27: 8b 4d cc mov -0x34(%ebp),%ecx
10cb2a: 85 c9 test %ecx,%ecx
10cb2c: 74 12 je 10cb40 <_Objects_Extend_information+0x118><== NEVER TAKEN
10cb2e: 31 c9 xor %ecx,%ecx
10cb30: 8b 7d cc mov -0x34(%ebp),%edi
10cb33: 90 nop
local_table[ index ] = NULL;
10cb34: 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++ ) {
10cb3b: 41 inc %ecx
10cb3c: 39 cf cmp %ecx,%edi
10cb3e: 77 f4 ja 10cb34 <_Objects_Extend_information+0x10c><== NEVER TAKEN
10cb40: c1 e6 02 shl $0x2,%esi
10cb43: 89 75 c0 mov %esi,-0x40(%ebp)
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
10cb46: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb49: 8b 75 c0 mov -0x40(%ebp),%esi
10cb4c: c7 04 31 00 00 00 00 movl $0x0,(%ecx,%esi,1)
inactive_per_block[block_count] = 0;
10cb53: 8b 4d bc mov -0x44(%ebp),%ecx
10cb56: c7 04 31 00 00 00 00 movl $0x0,(%ecx,%esi,1)
for ( index=index_base ;
index < ( information->allocation_size + index_base );
10cb5d: 0f b7 73 14 movzwl 0x14(%ebx),%esi
10cb61: 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 ;
10cb64: 39 75 d4 cmp %esi,-0x2c(%ebp)
10cb67: 73 0f jae 10cb78 <_Objects_Extend_information+0x150><== NEVER TAKEN
10cb69: 8b 4d d4 mov -0x2c(%ebp),%ecx
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
10cb6c: 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++ ) {
10cb73: 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 ;
10cb74: 39 f1 cmp %esi,%ecx
10cb76: 72 f4 jb 10cb6c <_Objects_Extend_information+0x144>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
10cb78: 9c pushf
10cb79: fa cli
10cb7a: 5f pop %edi
old_tables = information->object_blocks;
10cb7b: 8b 73 34 mov 0x34(%ebx),%esi
information->object_blocks = object_blocks;
10cb7e: 8b 4d c4 mov -0x3c(%ebp),%ecx
10cb81: 89 4b 34 mov %ecx,0x34(%ebx)
information->inactive_per_block = inactive_per_block;
10cb84: 8b 4d bc mov -0x44(%ebp),%ecx
10cb87: 89 4b 30 mov %ecx,0x30(%ebx)
information->local_table = local_table;
10cb8a: 89 43 1c mov %eax,0x1c(%ebx)
information->maximum = (Objects_Maximum) maximum;
10cb8d: 8b 45 d0 mov -0x30(%ebp),%eax
10cb90: 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) |
10cb94: 8b 0b mov (%ebx),%ecx
10cb96: c1 e1 18 shl $0x18,%ecx
10cb99: 81 c9 00 00 01 00 or $0x10000,%ecx
information->maximum_id = _Objects_Build_id(
10cb9f: 0f b7 43 04 movzwl 0x4(%ebx),%eax
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cba3: c1 e0 1b shl $0x1b,%eax
10cba6: 09 c1 or %eax,%ecx
10cba8: 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) |
10cbac: 09 c1 or %eax,%ecx
10cbae: 89 4b 0c mov %ecx,0xc(%ebx)
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
10cbb1: 57 push %edi
10cbb2: 9d popf
_Workspace_Free( old_tables );
10cbb3: 83 ec 0c sub $0xc,%esp
10cbb6: 56 push %esi
10cbb7: 89 55 b8 mov %edx,-0x48(%ebp)
10cbba: e8 e5 1d 00 00 call 10e9a4 <_Workspace_Free>
10cbbf: 83 c4 10 add $0x10,%esp
10cbc2: 8b 55 b8 mov -0x48(%ebp),%edx
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
10cbc5: c1 e2 02 shl $0x2,%edx
10cbc8: 89 55 d0 mov %edx,-0x30(%ebp)
10cbcb: 8b 43 34 mov 0x34(%ebx),%eax
10cbce: 8b 4d c8 mov -0x38(%ebp),%ecx
10cbd1: 89 0c 10 mov %ecx,(%eax,%edx,1)
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
10cbd4: ff 73 18 pushl 0x18(%ebx)
10cbd7: 0f b7 43 14 movzwl 0x14(%ebx),%eax
10cbdb: 50 push %eax
10cbdc: 51 push %ecx
10cbdd: 8d 7d dc lea -0x24(%ebp),%edi
10cbe0: 57 push %edi
10cbe1: e8 9e 44 00 00 call 111084 <_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 ) {
10cbe6: 83 c4 10 add $0x10,%esp
10cbe9: 8b 75 d4 mov -0x2c(%ebp),%esi
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10cbec: 8d 43 20 lea 0x20(%ebx),%eax
10cbef: 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 ) {
10cbf2: eb 29 jmp 10cc1d <_Objects_Extend_information+0x1f5>
10cbf4: 8b 13 mov (%ebx),%edx
10cbf6: c1 e2 18 shl $0x18,%edx
10cbf9: 81 ca 00 00 01 00 or $0x10000,%edx
the_object->id = _Objects_Build_id(
10cbff: 0f b7 4b 04 movzwl 0x4(%ebx),%ecx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cc03: c1 e1 1b shl $0x1b,%ecx
10cc06: 09 ca or %ecx,%edx
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cc08: 09 f2 or %esi,%edx
10cc0a: 89 50 08 mov %edx,0x8(%eax)
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
10cc0d: 83 ec 08 sub $0x8,%esp
10cc10: 50 push %eax
10cc11: ff 75 d4 pushl -0x2c(%ebp)
10cc14: e8 bf f3 ff ff call 10bfd8 <_Chain_Append>
index++;
10cc19: 46 inc %esi
10cc1a: 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 ) {
10cc1d: 83 ec 0c sub $0xc,%esp
10cc20: 57 push %edi
10cc21: e8 ee f3 ff ff call 10c014 <_Chain_Get>
10cc26: 83 c4 10 add $0x10,%esp
10cc29: 85 c0 test %eax,%eax
10cc2b: 75 c7 jne 10cbf4 <_Objects_Extend_information+0x1cc>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
10cc2d: 8b 43 14 mov 0x14(%ebx),%eax
10cc30: 8b 53 30 mov 0x30(%ebx),%edx
10cc33: 0f b7 c8 movzwl %ax,%ecx
10cc36: 8b 75 d0 mov -0x30(%ebp),%esi
10cc39: 89 0c 32 mov %ecx,(%edx,%esi,1)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
10cc3c: 66 01 43 2c add %ax,0x2c(%ebx)
}
10cc40: 8d 65 f4 lea -0xc(%ebp),%esp
10cc43: 5b pop %ebx
10cc44: 5e pop %esi
10cc45: 5f pop %edi
10cc46: c9 leave
10cc47: c3 ret
10cc48: 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;
10cc4b: 31 c9 xor %ecx,%ecx
10cc4d: e9 40 fe ff ff jmp 10ca92 <_Objects_Extend_information+0x6a>
10cc52: 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 );
10cc54: 83 ec 0c sub $0xc,%esp
10cc57: 57 push %edi
10cc58: 89 55 b8 mov %edx,-0x48(%ebp)
10cc5b: 88 4d b4 mov %cl,-0x4c(%ebp)
10cc5e: e8 59 1d 00 00 call 10e9bc <_Workspace_Allocate_or_fatal_error>
10cc63: 89 45 c8 mov %eax,-0x38(%ebp)
10cc66: 83 c4 10 add $0x10,%esp
10cc69: 8a 4d b4 mov -0x4c(%ebp),%cl
10cc6c: 8b 55 b8 mov -0x48(%ebp),%edx
10cc6f: e9 63 fe ff ff jmp 10cad7 <_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,
10cc74: c1 e6 02 shl $0x2,%esi
10cc77: 89 75 c0 mov %esi,-0x40(%ebp)
10cc7a: 8b 73 34 mov 0x34(%ebx),%esi
10cc7d: 8b 7d c4 mov -0x3c(%ebp),%edi
10cc80: 8b 4d c0 mov -0x40(%ebp),%ecx
10cc83: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
10cc85: 8b 73 30 mov 0x30(%ebx),%esi
10cc88: 8b 7d bc mov -0x44(%ebp),%edi
10cc8b: 8b 4d c0 mov -0x40(%ebp),%ecx
10cc8e: 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 *) );
10cc90: 0f b7 4b 10 movzwl 0x10(%ebx),%ecx
10cc94: 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,
10cc97: c1 e1 02 shl $0x2,%ecx
10cc9a: 8b 73 1c mov 0x1c(%ebx),%esi
10cc9d: 89 c7 mov %eax,%edi
10cc9f: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
10cca1: e9 a0 fe ff ff jmp 10cb46 <_Objects_Extend_information+0x11e>
10cca6: 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 )
10cca8: 8b 53 10 mov 0x10(%ebx),%edx
10ccab: 66 89 55 d0 mov %dx,-0x30(%ebp)
10ccaf: 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 );
10ccb3: 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;
10ccb6: b1 01 mov $0x1,%cl
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10ccb8: 31 d2 xor %edx,%edx
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
10ccba: 31 f6 xor %esi,%esi
10ccbc: e9 d1 fd ff ff jmp 10ca92 <_Objects_Extend_information+0x6a>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
10ccc1: 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 );
10ccc4: 8b 45 cc mov -0x34(%ebp),%eax <== NOT EXECUTED
10ccc7: 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;
10ccca: b1 01 mov $0x1,%cl <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
10cccc: 31 d2 xor %edx,%edx <== NOT EXECUTED
10ccce: e9 bf fd ff ff jmp 10ca92 <_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 ) {
10ccd3: 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 );
10ccd6: 8b 4d cc mov -0x34(%ebp),%ecx <== NOT EXECUTED
10ccd9: 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;
10ccdc: 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;
10ccde: 31 d2 xor %edx,%edx <== NOT EXECUTED
10cce0: e9 ad fd ff ff jmp 10ca92 <_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 );
10cce5: 83 ec 0c sub $0xc,%esp
10cce8: ff 75 c8 pushl -0x38(%ebp)
10cceb: e8 b4 1c 00 00 call 10e9a4 <_Workspace_Free>
return;
10ccf0: 83 c4 10 add $0x10,%esp
10ccf3: e9 48 ff ff ff jmp 10cc40 <_Objects_Extend_information+0x218>
0010cd88 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
10cd88: 55 push %ebp
10cd89: 89 e5 mov %esp,%ebp
10cd8b: 56 push %esi
10cd8c: 53 push %ebx
10cd8d: 8b 75 08 mov 0x8(%ebp),%esi
10cd90: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
10cd93: 66 85 db test %bx,%bx
10cd96: 75 0c jne 10cda4 <_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;
10cd98: 31 c0 xor %eax,%eax
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
10cd9a: 8d 65 f8 lea -0x8(%ebp),%esp
10cd9d: 5b pop %ebx
10cd9e: 5e pop %esi
10cd9f: c9 leave
10cda0: c3 ret
10cda1: 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 );
10cda4: 83 ec 0c sub $0xc,%esp
10cda7: 56 push %esi
10cda8: e8 6f 48 00 00 call 11161c <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
10cdad: 83 c4 10 add $0x10,%esp
10cdb0: 85 c0 test %eax,%eax
10cdb2: 74 e4 je 10cd98 <_Objects_Get_information+0x10>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
10cdb4: 0f b7 db movzwl %bx,%ebx
10cdb7: 39 d8 cmp %ebx,%eax
10cdb9: 72 dd jb 10cd98 <_Objects_Get_information+0x10>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10cdbb: 8b 14 b5 68 7d 12 00 mov 0x127d68(,%esi,4),%edx
return NULL;
10cdc2: 31 c0 xor %eax,%eax
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
10cdc4: 85 d2 test %edx,%edx
10cdc6: 74 d2 je 10cd9a <_Objects_Get_information+0x12><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
10cdc8: 8b 04 9a mov (%edx,%ebx,4),%eax
if ( !info )
10cdcb: 85 c0 test %eax,%eax
10cdcd: 74 cb je 10cd9a <_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;
10cdcf: 31 d2 xor %edx,%edx
10cdd1: 66 83 78 10 00 cmpw $0x0,0x10(%eax)
10cdd6: 0f 95 c2 setne %dl
10cdd9: f7 da neg %edx
10cddb: 21 d0 and %edx,%eax
10cddd: eb bb jmp 10cd9a <_Objects_Get_information+0x12>
0010cde0 <_Objects_Get_isr_disable>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location,
ISR_Level *level_p
)
{
10cde0: 55 push %ebp
10cde1: 89 e5 mov %esp,%ebp
10cde3: 56 push %esi
10cde4: 53 push %ebx
10cde5: 8b 55 08 mov 0x8(%ebp),%edx
10cde8: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Control *the_object;
uint32_t index;
ISR_Level level;
index = id - information->minimum_id + 1;
10cdeb: b8 01 00 00 00 mov $0x1,%eax
10cdf0: 2b 42 08 sub 0x8(%edx),%eax
10cdf3: 03 45 0c add 0xc(%ebp),%eax
_ISR_Disable( level );
10cdf6: 9c pushf
10cdf7: fa cli
10cdf8: 5e pop %esi
if ( information->maximum >= index ) {
10cdf9: 0f b7 4a 10 movzwl 0x10(%edx),%ecx
10cdfd: 39 c8 cmp %ecx,%eax
10cdff: 77 1b ja 10ce1c <_Objects_Get_isr_disable+0x3c>
if ( (the_object = information->local_table[ index ]) != NULL ) {
10ce01: 8b 52 1c mov 0x1c(%edx),%edx
10ce04: 8b 04 82 mov (%edx,%eax,4),%eax
10ce07: 85 c0 test %eax,%eax
10ce09: 74 21 je 10ce2c <_Objects_Get_isr_disable+0x4c>
*location = OBJECTS_LOCAL;
10ce0b: c7 03 00 00 00 00 movl $0x0,(%ebx)
*level_p = level;
10ce11: 8b 55 14 mov 0x14(%ebp),%edx
10ce14: 89 32 mov %esi,(%edx)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
#endif
}
10ce16: 5b pop %ebx
10ce17: 5e pop %esi
10ce18: c9 leave
10ce19: c3 ret
10ce1a: 66 90 xchg %ax,%ax
}
_ISR_Enable( level );
*location = OBJECTS_ERROR;
return NULL;
}
_ISR_Enable( level );
10ce1c: 56 push %esi
10ce1d: 9d popf
*location = OBJECTS_ERROR;
10ce1e: 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;
10ce24: 31 c0 xor %eax,%eax
#endif
}
10ce26: 5b pop %ebx
10ce27: 5e pop %esi
10ce28: c9 leave
10ce29: c3 ret
10ce2a: 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 );
10ce2c: 56 push %esi
10ce2d: 9d popf
*location = OBJECTS_ERROR;
10ce2e: c7 03 01 00 00 00 movl $0x1,(%ebx)
return NULL;
10ce34: eb e0 jmp 10ce16 <_Objects_Get_isr_disable+0x36>
0010e4d0 <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
10e4d0: 55 push %ebp
10e4d1: 89 e5 mov %esp,%ebp
10e4d3: 57 push %edi
10e4d4: 56 push %esi
10e4d5: 53 push %ebx
10e4d6: 83 ec 2c sub $0x2c,%esp
10e4d9: 8b 55 08 mov 0x8(%ebp),%edx
10e4dc: 8b 75 0c mov 0xc(%ebp),%esi
10e4df: 8b 5d 10 mov 0x10(%ebp),%ebx
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
10e4e2: 85 f6 test %esi,%esi
10e4e4: 75 0e jne 10e4f4 <_Objects_Get_name_as_string+0x24>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
10e4e6: 31 db xor %ebx,%ebx
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
10e4e8: 89 d8 mov %ebx,%eax
10e4ea: 8d 65 f4 lea -0xc(%ebp),%esp
10e4ed: 5b pop %ebx
10e4ee: 5e pop %esi
10e4ef: 5f pop %edi
10e4f0: c9 leave
10e4f1: c3 ret
10e4f2: 66 90 xchg %ax,%ax
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
10e4f4: 85 db test %ebx,%ebx
10e4f6: 74 f0 je 10e4e8 <_Objects_Get_name_as_string+0x18>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e4f8: 85 d2 test %edx,%edx
10e4fa: 75 08 jne 10e504 <_Objects_Get_name_as_string+0x34>
10e4fc: a1 f8 af 12 00 mov 0x12aff8,%eax
10e501: 8b 50 08 mov 0x8(%eax),%edx
information = _Objects_Get_information_id( tmpId );
10e504: 83 ec 0c sub $0xc,%esp
10e507: 52 push %edx
10e508: 89 55 cc mov %edx,-0x34(%ebp)
10e50b: e8 f0 fe ff ff call 10e400 <_Objects_Get_information_id>
10e510: 89 c7 mov %eax,%edi
if ( !information )
10e512: 83 c4 10 add $0x10,%esp
10e515: 85 c0 test %eax,%eax
10e517: 8b 55 cc mov -0x34(%ebp),%edx
10e51a: 74 ca je 10e4e6 <_Objects_Get_name_as_string+0x16>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
10e51c: 51 push %ecx
10e51d: 8d 45 e4 lea -0x1c(%ebp),%eax
10e520: 50 push %eax
10e521: 52 push %edx
10e522: 57 push %edi
10e523: e8 90 00 00 00 call 10e5b8 <_Objects_Get>
switch ( location ) {
10e528: 83 c4 10 add $0x10,%esp
10e52b: 8b 55 e4 mov -0x1c(%ebp),%edx
10e52e: 85 d2 test %edx,%edx
10e530: 75 b4 jne 10e4e6 <_Objects_Get_name_as_string+0x16>
return NULL;
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
10e532: 80 7f 38 00 cmpb $0x0,0x38(%edi)
10e536: 74 54 je 10e58c <_Objects_Get_name_as_string+0xbc>
s = the_object->name.name_p;
10e538: 8b 78 0c mov 0xc(%eax),%edi
lname[ 4 ] = '\0';
s = lname;
}
d = name;
if ( s ) {
10e53b: 85 ff test %edi,%edi
10e53d: 74 74 je 10e5b3 <_Objects_Get_name_as_string+0xe3>
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e53f: 4e dec %esi
10e540: 89 75 d4 mov %esi,-0x2c(%ebp)
10e543: 74 6e je 10e5b3 <_Objects_Get_name_as_string+0xe3><== NEVER TAKEN
10e545: 8a 17 mov (%edi),%dl
10e547: 84 d2 test %dl,%dl
10e549: 74 68 je 10e5b3 <_Objects_Get_name_as_string+0xe3>
10e54b: 89 d9 mov %ebx,%ecx
10e54d: 31 c0 xor %eax,%eax
10e54f: 89 5d d0 mov %ebx,-0x30(%ebp)
10e552: eb 07 jmp 10e55b <_Objects_Get_name_as_string+0x8b>
10e554: 8a 14 07 mov (%edi,%eax,1),%dl
10e557: 84 d2 test %dl,%dl
10e559: 74 21 je 10e57c <_Objects_Get_name_as_string+0xac>
*d = (isprint((unsigned char)*s)) ? *s : '*';
10e55b: 0f b6 da movzbl %dl,%ebx
10e55e: 8b 35 e8 82 12 00 mov 0x1282e8,%esi
10e564: 0f be 5c 1e 01 movsbl 0x1(%esi,%ebx,1),%ebx
10e569: 81 e3 97 00 00 00 and $0x97,%ebx
10e56f: 75 02 jne 10e573 <_Objects_Get_name_as_string+0xa3>
10e571: b2 2a mov $0x2a,%dl
10e573: 88 11 mov %dl,(%ecx)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e575: 40 inc %eax
10e576: 41 inc %ecx
10e577: 3b 45 d4 cmp -0x2c(%ebp),%eax
10e57a: 72 d8 jb 10e554 <_Objects_Get_name_as_string+0x84>
10e57c: 8b 5d d0 mov -0x30(%ebp),%ebx
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
10e57f: c6 01 00 movb $0x0,(%ecx)
_Thread_Enable_dispatch();
10e582: e8 a9 0b 00 00 call 10f130 <_Thread_Enable_dispatch>
return name;
10e587: e9 5c ff ff ff jmp 10e4e8 <_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;
10e58c: 8b 40 0c mov 0xc(%eax),%eax
lname[ 0 ] = (u32_name >> 24) & 0xff;
10e58f: 89 c2 mov %eax,%edx
10e591: c1 ea 18 shr $0x18,%edx
10e594: 88 55 df mov %dl,-0x21(%ebp)
lname[ 1 ] = (u32_name >> 16) & 0xff;
10e597: 89 c2 mov %eax,%edx
10e599: c1 ea 10 shr $0x10,%edx
10e59c: 88 55 e0 mov %dl,-0x20(%ebp)
lname[ 2 ] = (u32_name >> 8) & 0xff;
10e59f: 89 c2 mov %eax,%edx
10e5a1: c1 ea 08 shr $0x8,%edx
10e5a4: 88 55 e1 mov %dl,-0x1f(%ebp)
lname[ 3 ] = (u32_name >> 0) & 0xff;
10e5a7: 88 45 e2 mov %al,-0x1e(%ebp)
lname[ 4 ] = '\0';
10e5aa: c6 45 e3 00 movb $0x0,-0x1d(%ebp)
s = lname;
10e5ae: 8d 7d df lea -0x21(%ebp),%edi
10e5b1: eb 8c jmp 10e53f <_Objects_Get_name_as_string+0x6f>
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
10e5b3: 89 d9 mov %ebx,%ecx
10e5b5: eb c8 jmp 10e57f <_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>
0011b2a0 <_Objects_Get_no_protection>:
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
11b2a0: 55 push %ebp
11b2a1: 89 e5 mov %esp,%ebp
11b2a3: 53 push %ebx
11b2a4: 8b 55 08 mov 0x8(%ebp),%edx
11b2a7: 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;
11b2aa: b8 01 00 00 00 mov $0x1,%eax
11b2af: 2b 42 08 sub 0x8(%edx),%eax
11b2b2: 03 45 0c add 0xc(%ebp),%eax
if ( information->maximum >= index ) {
11b2b5: 0f b7 4a 10 movzwl 0x10(%edx),%ecx
11b2b9: 39 c8 cmp %ecx,%eax
11b2bb: 77 13 ja 11b2d0 <_Objects_Get_no_protection+0x30>
if ( (the_object = information->local_table[ index ]) != NULL ) {
11b2bd: 8b 52 1c mov 0x1c(%edx),%edx
11b2c0: 8b 04 82 mov (%edx,%eax,4),%eax
11b2c3: 85 c0 test %eax,%eax
11b2c5: 74 09 je 11b2d0 <_Objects_Get_no_protection+0x30><== NEVER TAKEN
*location = OBJECTS_LOCAL;
11b2c7: 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;
}
11b2cd: 5b pop %ebx
11b2ce: c9 leave
11b2cf: 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;
11b2d0: c7 03 01 00 00 00 movl $0x1,(%ebx)
return NULL;
11b2d6: 31 c0 xor %eax,%eax
}
11b2d8: 5b pop %ebx
11b2d9: c9 leave
11b2da: c3 ret
0010e0e4 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
10e0e4: 55 push %ebp
10e0e5: 89 e5 mov %esp,%ebp
10e0e7: 83 ec 18 sub $0x18,%esp
10e0ea: 8b 55 08 mov 0x8(%ebp),%edx
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10e0ed: 85 d2 test %edx,%edx
10e0ef: 75 08 jne 10e0f9 <_Objects_Id_to_name+0x15>
10e0f1: a1 78 af 12 00 mov 0x12af78,%eax
10e0f6: 8b 50 08 mov 0x8(%eax),%edx
10e0f9: 89 d0 mov %edx,%eax
10e0fb: c1 e8 18 shr $0x18,%eax
10e0fe: 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 )
10e101: 8d 48 ff lea -0x1(%eax),%ecx
10e104: 83 f9 02 cmp $0x2,%ecx
10e107: 77 1d ja 10e126 <_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 ] )
10e109: 8b 04 85 a8 a9 12 00 mov 0x12a9a8(,%eax,4),%eax
10e110: 85 c0 test %eax,%eax
10e112: 74 12 je 10e126 <_Objects_Id_to_name+0x42>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10e114: 89 d1 mov %edx,%ecx
10e116: c1 e9 1b shr $0x1b,%ecx
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
10e119: 8b 04 88 mov (%eax,%ecx,4),%eax
if ( !information )
10e11c: 85 c0 test %eax,%eax
10e11e: 74 06 je 10e126 <_Objects_Id_to_name+0x42><== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
10e120: 80 78 38 00 cmpb $0x0,0x38(%eax)
10e124: 74 0a je 10e130 <_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;
10e126: 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;
}
10e12b: c9 leave
10e12c: c3 ret
10e12d: 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 );
10e130: 51 push %ecx
10e131: 8d 4d f4 lea -0xc(%ebp),%ecx
10e134: 51 push %ecx
10e135: 52 push %edx
10e136: 50 push %eax
10e137: e8 40 ff ff ff call 10e07c <_Objects_Get>
if ( !the_object )
10e13c: 83 c4 10 add $0x10,%esp
10e13f: 85 c0 test %eax,%eax
10e141: 74 e3 je 10e126 <_Objects_Id_to_name+0x42>
return OBJECTS_INVALID_ID;
*name = the_object->name;
10e143: 8b 50 0c mov 0xc(%eax),%edx
10e146: 8b 45 0c mov 0xc(%ebp),%eax
10e149: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e14b: e8 14 0b 00 00 call 10ec64 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10e150: 31 c0 xor %eax,%eax
}
10e152: c9 leave
10e153: c3 ret
0010cea0 <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
10cea0: 55 push %ebp
10cea1: 89 e5 mov %esp,%ebp
10cea3: 57 push %edi
10cea4: 56 push %esi
10cea5: 53 push %ebx
10cea6: 83 ec 0c sub $0xc,%esp
10cea9: 8b 45 08 mov 0x8(%ebp),%eax
10ceac: 8b 55 0c mov 0xc(%ebp),%edx
10ceaf: 8b 5d 10 mov 0x10(%ebp),%ebx
10ceb2: 8b 75 20 mov 0x20(%ebp),%esi
10ceb5: 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;
10ceb9: 89 10 mov %edx,(%eax)
information->the_class = the_class;
10cebb: 66 89 58 04 mov %bx,0x4(%eax)
information->size = size;
10cebf: 89 78 18 mov %edi,0x18(%eax)
information->local_table = 0;
10cec2: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
information->inactive_per_block = 0;
10cec9: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
information->object_blocks = 0;
10ced0: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
information->inactive = 0;
10ced7: 66 c7 40 2c 00 00 movw $0x0,0x2c(%eax)
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
information->is_string = is_string;
10cedd: 8b 7d 1c mov 0x1c(%ebp),%edi
10cee0: 89 f9 mov %edi,%ecx
10cee2: 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;
10cee5: 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;
10ceeb: 0f b7 db movzwl %bx,%ebx
10ceee: 8b 3c 95 68 7d 12 00 mov 0x127d68(,%edx,4),%edi
10cef5: 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;
10cef8: 8b 7d 14 mov 0x14(%ebp),%edi
10cefb: 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 =
10cefe: 89 f9 mov %edi,%ecx
10cf00: 88 48 12 mov %cl,0x12(%eax)
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
10cf03: 8b 4d 14 mov 0x14(%ebp),%ecx
10cf06: 81 e1 ff ff ff 7f and $0x7fffffff,%ecx
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
10cf0c: 85 ff test %edi,%edi
10cf0e: 74 04 je 10cf14 <_Objects_Initialize_information+0x74>
10cf10: 85 c9 test %ecx,%ecx
10cf12: 74 57 je 10cf6b <_Objects_Initialize_information+0xcb><== NEVER TAKEN
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
10cf14: 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;
10cf18: c7 40 1c 04 7a 12 00 movl $0x127a04,0x1c(%eax)
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cf1f: c1 e2 18 shl $0x18,%edx
10cf22: 81 ca 00 00 01 00 or $0x10000,%edx
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
10cf28: c1 e3 1b shl $0x1b,%ebx
10cf2b: 09 da or %ebx,%edx
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
10cf2d: 31 db xor %ebx,%ebx
10cf2f: 85 c9 test %ecx,%ecx
10cf31: 0f 95 c3 setne %bl
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
10cf34: 09 da or %ebx,%edx
10cf36: 89 50 08 mov %edx,0x8(%eax)
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
#endif
information->name_length = name_length;
10cf39: 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 );
10cf3d: 8d 50 24 lea 0x24(%eax),%edx
10cf40: 89 50 20 mov %edx,0x20(%eax)
head->next = tail;
head->previous = NULL;
10cf43: 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 );
10cf4a: 8d 50 20 lea 0x20(%eax),%edx
10cf4d: 89 50 28 mov %edx,0x28(%eax)
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
10cf50: 85 c9 test %ecx,%ecx
10cf52: 75 08 jne 10cf5c <_Objects_Initialize_information+0xbc>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
10cf54: 8d 65 f4 lea -0xc(%ebp),%esp
10cf57: 5b pop %ebx
10cf58: 5e pop %esi
10cf59: 5f pop %edi
10cf5a: c9 leave
10cf5b: c3 ret
/*
* 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 );
10cf5c: 89 45 08 mov %eax,0x8(%ebp)
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
10cf5f: 8d 65 f4 lea -0xc(%ebp),%esp
10cf62: 5b pop %ebx
10cf63: 5e pop %esi
10cf64: 5f pop %edi
10cf65: 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 );
10cf66: e9 bd fa ff ff jmp 10ca28 <_Objects_Extend_information>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
10cf6b: 50 push %eax
10cf6c: 6a 13 push $0x13
10cf6e: 6a 01 push $0x1
10cf70: 6a 00 push $0x0
10cf72: e8 7d f9 ff ff call 10c8f4 <_Internal_error_Occurred>
00117994 <_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
)
{
117994: 55 push %ebp
117995: 89 e5 mov %esp,%ebp
117997: 57 push %edi
117998: 56 push %esi
117999: 53 push %ebx
11799a: 83 ec 1c sub $0x1c,%esp
11799d: 8b 7d 08 mov 0x8(%ebp),%edi
Objects_Control *the_object;
uint32_t index;
/* ASSERT: information->is_string == true */
if ( !id )
1179a0: 8b 5d 10 mov 0x10(%ebp),%ebx
1179a3: 85 db test %ebx,%ebx
1179a5: 74 75 je 117a1c <_Objects_Name_to_id_string+0x88>
return OBJECTS_INVALID_ADDRESS;
if ( !name )
1179a7: 8b 4d 0c mov 0xc(%ebp),%ecx
1179aa: 85 c9 test %ecx,%ecx
1179ac: 74 4b je 1179f9 <_Objects_Name_to_id_string+0x65>
return OBJECTS_INVALID_NAME;
if ( information->maximum != 0 ) {
1179ae: 8b 47 10 mov 0x10(%edi),%eax
1179b1: 66 85 c0 test %ax,%ax
1179b4: 74 43 je 1179f9 <_Objects_Name_to_id_string+0x65>
for ( index = 1; index <= information->maximum; index++ ) {
1179b6: 0f b7 c0 movzwl %ax,%eax
1179b9: 89 45 e4 mov %eax,-0x1c(%ebp)
1179bc: 8b 47 1c mov 0x1c(%edi),%eax
1179bf: bb 01 00 00 00 mov $0x1,%ebx
1179c4: 89 7d e0 mov %edi,-0x20(%ebp)
1179c7: 89 c7 mov %eax,%edi
1179c9: 8d 76 00 lea 0x0(%esi),%esi
the_object = information->local_table[ index ];
1179cc: 8b 34 9f mov (%edi,%ebx,4),%esi
if ( !the_object )
1179cf: 85 f6 test %esi,%esi
1179d1: 74 20 je 1179f3 <_Objects_Name_to_id_string+0x5f>
continue;
if ( !the_object->name.name_p )
1179d3: 8b 46 0c mov 0xc(%esi),%eax
1179d6: 85 c0 test %eax,%eax
1179d8: 74 19 je 1179f3 <_Objects_Name_to_id_string+0x5f>
continue;
if (!strncmp( name, the_object->name.name_p, information->name_length)) {
1179da: 52 push %edx
1179db: 8b 4d e0 mov -0x20(%ebp),%ecx
1179de: 0f b7 51 3a movzwl 0x3a(%ecx),%edx
1179e2: 52 push %edx
1179e3: 50 push %eax
1179e4: ff 75 0c pushl 0xc(%ebp)
1179e7: e8 a0 34 00 00 call 11ae8c <strncmp>
1179ec: 83 c4 10 add $0x10,%esp
1179ef: 85 c0 test %eax,%eax
1179f1: 74 15 je 117a08 <_Objects_Name_to_id_string+0x74>
if ( !name )
return OBJECTS_INVALID_NAME;
if ( information->maximum != 0 ) {
for ( index = 1; index <= information->maximum; index++ ) {
1179f3: 43 inc %ebx
1179f4: 3b 5d e4 cmp -0x1c(%ebp),%ebx
1179f7: 76 d3 jbe 1179cc <_Objects_Name_to_id_string+0x38>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
}
}
return OBJECTS_INVALID_NAME;
1179f9: b8 01 00 00 00 mov $0x1,%eax
}
1179fe: 8d 65 f4 lea -0xc(%ebp),%esp
117a01: 5b pop %ebx
117a02: 5e pop %esi
117a03: 5f pop %edi
117a04: c9 leave
117a05: c3 ret
117a06: 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;
117a08: 8b 46 08 mov 0x8(%esi),%eax
117a0b: 8b 55 10 mov 0x10(%ebp),%edx
117a0e: 89 02 mov %eax,(%edx)
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
117a10: 31 c0 xor %eax,%eax
}
}
}
return OBJECTS_INVALID_NAME;
}
117a12: 8d 65 f4 lea -0xc(%ebp),%esp
117a15: 5b pop %ebx
117a16: 5e pop %esi
117a17: 5f pop %edi
117a18: c9 leave
117a19: c3 ret
117a1a: 66 90 xchg %ax,%ax
uint32_t index;
/* ASSERT: information->is_string == true */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
117a1c: b8 02 00 00 00 mov $0x2,%eax
}
}
}
return OBJECTS_INVALID_NAME;
}
117a21: 8d 65 f4 lea -0xc(%ebp),%esp
117a24: 5b pop %ebx
117a25: 5e pop %esi
117a26: 5f pop %edi
117a27: c9 leave
117a28: c3 ret
0010cfa8 <_Objects_Name_to_id_u32>:
Objects_Information *information,
uint32_t name,
uint32_t node,
Objects_Id *id
)
{
10cfa8: 55 push %ebp
10cfa9: 89 e5 mov %esp,%ebp
10cfab: 57 push %edi
10cfac: 56 push %esi
10cfad: 53 push %ebx
10cfae: 8b 45 08 mov 0x8(%ebp),%eax
10cfb1: 8b 4d 0c mov 0xc(%ebp),%ecx
10cfb4: 8b 55 10 mov 0x10(%ebp),%edx
10cfb7: 8b 7d 14 mov 0x14(%ebp),%edi
Objects_Name name_for_mp;
#endif
/* ASSERT: information->is_string == false */
if ( !id )
10cfba: 85 ff test %edi,%edi
10cfbc: 74 56 je 10d014 <_Objects_Name_to_id_u32+0x6c>
return OBJECTS_INVALID_ADDRESS;
if ( name == 0 )
10cfbe: 85 c9 test %ecx,%ecx
10cfc0: 74 08 je 10cfca <_Objects_Name_to_id_u32+0x22>
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
10cfc2: 8b 70 10 mov 0x10(%eax),%esi
10cfc5: 66 85 f6 test %si,%si
10cfc8: 75 0a jne 10cfd4 <_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;
10cfca: b8 01 00 00 00 mov $0x1,%eax
#endif
}
10cfcf: 5b pop %ebx
10cfd0: 5e pop %esi
10cfd1: 5f pop %edi
10cfd2: c9 leave
10cfd3: c3 ret
if ( name == 0 )
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
10cfd4: 85 d2 test %edx,%edx
10cfd6: 75 20 jne 10cff8 <_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++ ) {
10cfd8: 0f b7 f6 movzwl %si,%esi
10cfdb: 8b 58 1c mov 0x1c(%eax),%ebx
10cfde: b8 01 00 00 00 mov $0x1,%eax
10cfe3: 90 nop
the_object = information->local_table[ index ];
10cfe4: 8b 14 83 mov (%ebx,%eax,4),%edx
if ( !the_object )
10cfe7: 85 d2 test %edx,%edx
10cfe9: 74 05 je 10cff0 <_Objects_Name_to_id_u32+0x48>
continue;
if ( name == the_object->name.name_u32 ) {
10cfeb: 39 4a 0c cmp %ecx,0xc(%edx)
10cfee: 74 18 je 10d008 <_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++ ) {
10cff0: 40 inc %eax
10cff1: 39 c6 cmp %eax,%esi
10cff3: 73 ef jae 10cfe4 <_Objects_Name_to_id_u32+0x3c>
10cff5: eb d3 jmp 10cfca <_Objects_Name_to_id_u32+0x22>
10cff7: 90 nop
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
(node == OBJECTS_SEARCH_ALL_NODES ||
10cff8: 81 fa ff ff ff 7f cmp $0x7fffffff,%edx
10cffe: 74 d8 je 10cfd8 <_Objects_Name_to_id_u32+0x30>
node == OBJECTS_SEARCH_LOCAL_NODE ||
10d000: 4a dec %edx
10d001: 75 c7 jne 10cfca <_Objects_Name_to_id_u32+0x22>
10d003: eb d3 jmp 10cfd8 <_Objects_Name_to_id_u32+0x30>
10d005: 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;
10d008: 8b 42 08 mov 0x8(%edx),%eax
10d00b: 89 07 mov %eax,(%edi)
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
10d00d: 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
}
10d00f: 5b pop %ebx
10d010: 5e pop %esi
10d011: 5f pop %edi
10d012: c9 leave
10d013: c3 ret
#endif
/* ASSERT: information->is_string == false */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
10d014: 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
}
10d019: 5b pop %ebx
10d01a: 5e pop %esi
10d01b: 5f pop %edi
10d01c: c9 leave
10d01d: c3 ret
0010d690 <_Objects_Set_name>:
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
10d690: 55 push %ebp
10d691: 89 e5 mov %esp,%ebp
10d693: 57 push %edi
10d694: 56 push %esi
10d695: 53 push %ebx
10d696: 83 ec 14 sub $0x14,%esp
10d699: 8b 7d 08 mov 0x8(%ebp),%edi
10d69c: 8b 5d 10 mov 0x10(%ebp),%ebx
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
10d69f: 0f b7 47 3a movzwl 0x3a(%edi),%eax
10d6a3: 50 push %eax
10d6a4: 53 push %ebx
10d6a5: e8 8e 79 00 00 call 115038 <strnlen>
10d6aa: 89 c6 mov %eax,%esi
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
10d6ac: 83 c4 10 add $0x10,%esp
10d6af: 80 7f 38 00 cmpb $0x0,0x38(%edi)
10d6b3: 75 57 jne 10d70c <_Objects_Set_name+0x7c>
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d6b5: 0f be 13 movsbl (%ebx),%edx
10d6b8: c1 e2 18 shl $0x18,%edx
10d6bb: 83 f8 01 cmp $0x1,%eax
10d6be: 76 38 jbe 10d6f8 <_Objects_Set_name+0x68>
10d6c0: 0f be 43 01 movsbl 0x1(%ebx),%eax
10d6c4: c1 e0 10 shl $0x10,%eax
10d6c7: 09 d0 or %edx,%eax
10d6c9: 83 fe 02 cmp $0x2,%esi
10d6cc: 74 31 je 10d6ff <_Objects_Set_name+0x6f>
10d6ce: 0f be 53 02 movsbl 0x2(%ebx),%edx
10d6d2: c1 e2 08 shl $0x8,%edx
10d6d5: 09 c2 or %eax,%edx
10d6d7: 83 fe 03 cmp $0x3,%esi
10d6da: 0f 84 80 00 00 00 je 10d760 <_Objects_Set_name+0xd0>
10d6e0: 0f be 43 03 movsbl 0x3(%ebx),%eax
10d6e4: 09 c2 or %eax,%edx
10d6e6: 8b 45 0c mov 0xc(%ebp),%eax
10d6e9: 89 50 0c mov %edx,0xc(%eax)
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
10d6ec: b0 01 mov $0x1,%al
}
10d6ee: 8d 65 f4 lea -0xc(%ebp),%esp
10d6f1: 5b pop %ebx
10d6f2: 5e pop %esi
10d6f3: 5f pop %edi
10d6f4: c9 leave
10d6f5: c3 ret
10d6f6: 66 90 xchg %ax,%ax
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d6f8: 89 d0 mov %edx,%eax
10d6fa: 0d 00 00 20 00 or $0x200000,%eax
10d6ff: 89 c2 mov %eax,%edx
10d701: 80 ce 20 or $0x20,%dh
10d704: b8 20 00 00 00 mov $0x20,%eax
10d709: eb d9 jmp 10d6e4 <_Objects_Set_name+0x54>
10d70b: 90 nop
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
10d70c: 83 ec 0c sub $0xc,%esp
10d70f: 8d 40 01 lea 0x1(%eax),%eax
10d712: 50 push %eax
10d713: e8 bc 19 00 00 call 10f0d4 <_Workspace_Allocate>
10d718: 89 c7 mov %eax,%edi
if ( !d )
10d71a: 83 c4 10 add $0x10,%esp
10d71d: 85 c0 test %eax,%eax
10d71f: 74 3b je 10d75c <_Objects_Set_name+0xcc>
return false;
_Workspace_Free( (void *)the_object->name.name_p );
10d721: 83 ec 0c sub $0xc,%esp
10d724: 8b 45 0c mov 0xc(%ebp),%eax
10d727: ff 70 0c pushl 0xc(%eax)
10d72a: e8 c1 19 00 00 call 10f0f0 <_Workspace_Free>
the_object->name.name_p = NULL;
10d72f: 8b 45 0c mov 0xc(%ebp),%eax
10d732: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
strncpy( d, name, length );
10d739: 83 c4 0c add $0xc,%esp
10d73c: 56 push %esi
10d73d: 53 push %ebx
10d73e: 57 push %edi
10d73f: e8 78 78 00 00 call 114fbc <strncpy>
d[length] = '\0';
10d744: c6 04 37 00 movb $0x0,(%edi,%esi,1)
the_object->name.name_p = d;
10d748: 8b 45 0c mov 0xc(%ebp),%eax
10d74b: 89 78 0c mov %edi,0xc(%eax)
10d74e: 83 c4 10 add $0x10,%esp
((3 < length) ? s[ 3 ] : ' ')
);
}
return true;
10d751: b0 01 mov $0x1,%al
}
10d753: 8d 65 f4 lea -0xc(%ebp),%esp
10d756: 5b pop %ebx
10d757: 5e pop %esi
10d758: 5f pop %edi
10d759: c9 leave
10d75a: c3 ret
10d75b: 90 nop
if ( information->is_string ) {
char *d;
d = _Workspace_Allocate( length + 1 );
if ( !d )
return false;
10d75c: 31 c0 xor %eax,%eax
10d75e: eb 8e jmp 10d6ee <_Objects_Set_name+0x5e>
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
10d760: b8 20 00 00 00 mov $0x20,%eax
10d765: e9 7a ff ff ff jmp 10d6e4 <_Objects_Set_name+0x54>
0010d020 <_Objects_Shrink_information>:
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
10d020: 55 push %ebp
10d021: 89 e5 mov %esp,%ebp
10d023: 57 push %edi
10d024: 56 push %esi
10d025: 53 push %ebx
10d026: 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 );
10d029: 8b 45 08 mov 0x8(%ebp),%eax
10d02c: 0f b7 58 08 movzwl 0x8(%eax),%ebx
block_count = (information->maximum - index_base) /
10d030: 0f b7 48 14 movzwl 0x14(%eax),%ecx
10d034: 0f b7 40 10 movzwl 0x10(%eax),%eax
10d038: 29 d8 sub %ebx,%eax
10d03a: 31 d2 xor %edx,%edx
10d03c: f7 f1 div %ecx
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
10d03e: 85 c0 test %eax,%eax
10d040: 74 21 je 10d063 <_Objects_Shrink_information+0x43><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
10d042: 8b 55 08 mov 0x8(%ebp),%edx
10d045: 8b 72 30 mov 0x30(%edx),%esi
10d048: 3b 0e cmp (%esi),%ecx
10d04a: 74 1f je 10d06b <_Objects_Shrink_information+0x4b><== NEVER TAKEN
10d04c: 31 d2 xor %edx,%edx
10d04e: eb 0e jmp 10d05e <_Objects_Shrink_information+0x3e>
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
10d050: 01 cb add %ecx,%ebx
10d052: 8d 3c 95 00 00 00 00 lea 0x0(,%edx,4),%edi
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 ] ==
10d059: 3b 0c 96 cmp (%esi,%edx,4),%ecx
10d05c: 74 12 je 10d070 <_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++ ) {
10d05e: 42 inc %edx
10d05f: 39 d0 cmp %edx,%eax
10d061: 77 ed ja 10d050 <_Objects_Shrink_information+0x30>
return;
}
index_base += information->allocation_size;
}
}
10d063: 8d 65 f4 lea -0xc(%ebp),%esp
10d066: 5b pop %ebx
10d067: 5e pop %esi
10d068: 5f pop %edi
10d069: c9 leave
10d06a: 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 ] ==
10d06b: 31 ff xor %edi,%edi <== NOT EXECUTED
10d06d: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
10d070: 8b 55 08 mov 0x8(%ebp),%edx
10d073: 8b 42 20 mov 0x20(%edx),%eax
10d076: 89 7d e4 mov %edi,-0x1c(%ebp)
10d079: eb 07 jmp 10d082 <_Objects_Shrink_information+0x62>
10d07b: 90 nop
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
10d07c: 85 f6 test %esi,%esi
10d07e: 74 2c je 10d0ac <_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;
10d080: 89 f0 mov %esi,%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 );
10d082: 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;
10d086: 8b 30 mov (%eax),%esi
if ((index >= index_base) &&
10d088: 39 da cmp %ebx,%edx
10d08a: 72 f0 jb 10d07c <_Objects_Shrink_information+0x5c>
(index < (index_base + information->allocation_size))) {
10d08c: 8b 7d 08 mov 0x8(%ebp),%edi
10d08f: 0f b7 4f 14 movzwl 0x14(%edi),%ecx
10d093: 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) &&
10d096: 39 ca cmp %ecx,%edx
10d098: 73 e2 jae 10d07c <_Objects_Shrink_information+0x5c>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
10d09a: 83 ec 0c sub $0xc,%esp
10d09d: 50 push %eax
10d09e: e8 59 ef ff ff call 10bffc <_Chain_Extract>
10d0a3: 83 c4 10 add $0x10,%esp
}
}
while ( the_object );
10d0a6: 85 f6 test %esi,%esi
10d0a8: 75 d6 jne 10d080 <_Objects_Shrink_information+0x60>
10d0aa: 66 90 xchg %ax,%ax
10d0ac: 8b 7d e4 mov -0x1c(%ebp),%edi
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
10d0af: 83 ec 0c sub $0xc,%esp
10d0b2: 8b 55 08 mov 0x8(%ebp),%edx
10d0b5: 8b 42 34 mov 0x34(%edx),%eax
10d0b8: ff 34 38 pushl (%eax,%edi,1)
10d0bb: e8 e4 18 00 00 call 10e9a4 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
10d0c0: 8b 55 08 mov 0x8(%ebp),%edx
10d0c3: 8b 42 34 mov 0x34(%edx),%eax
10d0c6: c7 04 38 00 00 00 00 movl $0x0,(%eax,%edi,1)
information->inactive_per_block[ block ] = 0;
10d0cd: 8b 42 30 mov 0x30(%edx),%eax
10d0d0: c7 04 38 00 00 00 00 movl $0x0,(%eax,%edi,1)
information->inactive -= information->allocation_size;
10d0d7: 8b 42 14 mov 0x14(%edx),%eax
10d0da: 66 29 42 2c sub %ax,0x2c(%edx)
return;
10d0de: 83 c4 10 add $0x10,%esp
}
index_base += information->allocation_size;
}
}
10d0e1: 8d 65 f4 lea -0xc(%ebp),%esp
10d0e4: 5b pop %ebx
10d0e5: 5e pop %esi
10d0e6: 5f pop %edi
10d0e7: c9 leave
10d0e8: c3 ret
0010d524 <_POSIX_Absolute_timeout_to_ticks>:
*/
POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks(
const struct timespec *abstime,
Watchdog_Interval *ticks_out
)
{
10d524: 55 push %ebp
10d525: 89 e5 mov %esp,%ebp
10d527: 57 push %edi
10d528: 56 push %esi
10d529: 53 push %ebx
10d52a: 83 ec 38 sub $0x38,%esp
10d52d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d530: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Make sure there is always a value returned.
*/
*ticks_out = 0;
10d533: c7 06 00 00 00 00 movl $0x0,(%esi)
/*
* Is the absolute time even valid?
*/
if ( !_Timespec_Is_valid(abstime) )
10d539: 53 push %ebx
10d53a: e8 c1 3d 00 00 call 111300 <_Timespec_Is_valid>
10d53f: 83 c4 10 add $0x10,%esp
10d542: 84 c0 test %al,%al
10d544: 75 0a jne 10d550 <_POSIX_Absolute_timeout_to_ticks+0x2c>
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
10d546: 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;
}
10d548: 8d 65 f4 lea -0xc(%ebp),%esp
10d54b: 5b pop %ebx
10d54c: 5e pop %esi
10d54d: 5f pop %edi
10d54e: c9 leave
10d54f: c3 ret
return POSIX_ABSOLUTE_TIMEOUT_INVALID;
/*
* Is the absolute time in the past?
*/
_TOD_Get( ¤t_time );
10d550: 83 ec 0c sub $0xc,%esp
10d553: 8d 7d e0 lea -0x20(%ebp),%edi
10d556: 57 push %edi
10d557: e8 84 1d 00 00 call 10f2e0 <_TOD_Get>
if ( _Timespec_Less_than( abstime, ¤t_time ) )
10d55c: 5a pop %edx
10d55d: 59 pop %ecx
10d55e: 57 push %edi
10d55f: 53 push %ebx
10d560: e8 c3 3d 00 00 call 111328 <_Timespec_Less_than>
10d565: 83 c4 10 add $0x10,%esp
10d568: 84 c0 test %al,%al
10d56a: 74 10 je 10d57c <_POSIX_Absolute_timeout_to_ticks+0x58>
return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
10d56c: 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;
}
10d571: 8d 65 f4 lea -0xc(%ebp),%esp
10d574: 5b pop %ebx
10d575: 5e pop %esi
10d576: 5f pop %edi
10d577: c9 leave
10d578: c3 ret
10d579: 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 );
10d57c: 50 push %eax
10d57d: 8d 45 d8 lea -0x28(%ebp),%eax
10d580: 50 push %eax
10d581: 53 push %ebx
10d582: 57 push %edi
10d583: 89 45 d4 mov %eax,-0x2c(%ebp)
10d586: e8 c1 3d 00 00 call 11134c <_Timespec_Subtract>
/*
* Internally the SuperCore uses ticks, so convert to them.
*/
*ticks_out = _Timespec_To_ticks( &difference );
10d58b: 8b 45 d4 mov -0x2c(%ebp),%eax
10d58e: 89 04 24 mov %eax,(%esp)
10d591: e8 f6 3d 00 00 call 11138c <_Timespec_To_ticks>
10d596: 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 )
10d598: 83 c4 10 add $0x10,%esp
return POSIX_ABSOLUTE_TIMEOUT_IS_NOW;
10d59b: 83 f8 01 cmp $0x1,%eax
10d59e: 19 c0 sbb %eax,%eax
10d5a0: 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;
}
10d5a3: 8d 65 f4 lea -0xc(%ebp),%esp
10d5a6: 5b pop %ebx
10d5a7: 5e pop %esi
10d5a8: 5f pop %edi
10d5a9: c9 leave
10d5aa: 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 40 9a 12 00 push $0x129a40
10c0ea: e8 75 2b 00 00 call 10ec64 <_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 23 39 00 00 call 10fb58 <_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 8f 35 00 00 call 10f7dc <_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 90 95 12 00 mov 0x129590,%eax
10c2db: 48 dec %eax
10c2dc: a3 90 95 12 00 mov %eax,0x129590
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 c4 34 00 00 call 10f7dc <_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 38 9b 12 00 mov 0x129b38,%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 fc ff 10 00 push $0x10fffc
10c363: ff 75 10 pushl 0x10(%ebp)
10c366: 56 push %esi
10c367: e8 14 39 00 00 call 10fc80 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10c36c: e8 6b 34 00 00 call 10f7dc <_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 38 9b 12 00 mov 0x129b38,%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 4f 34 00 00 call 10f7dc <_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
001163a8 <_POSIX_Message_queue_Create_support>:
const char *name_arg,
int pshared,
struct mq_attr *attr_ptr,
POSIX_Message_queue_Control **message_queue
)
{
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 24 sub $0x24,%esp
1163b1: 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 );
1163b4: 68 ff 00 00 00 push $0xff
1163b9: ff 75 08 pushl 0x8(%ebp)
1163bc: e8 d7 4b 00 00 call 11af98 <strnlen>
1163c1: 89 c6 mov %eax,%esi
1163c3: a1 f0 0e 13 00 mov 0x130ef0,%eax
1163c8: 40 inc %eax
1163c9: a3 f0 0e 13 00 mov %eax,0x130ef0
* 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 ) {
1163ce: 83 c4 10 add $0x10,%esp
1163d1: 85 db test %ebx,%ebx
1163d3: 0f 84 b7 00 00 00 je 116490 <_POSIX_Message_queue_Create_support+0xe8>
attr.mq_maxmsg = 10;
attr.mq_msgsize = 16;
} else {
if ( attr_ptr->mq_maxmsg <= 0 ){
1163d9: 8b 7b 04 mov 0x4(%ebx),%edi
1163dc: 85 ff test %edi,%edi
1163de: 0f 8e f0 00 00 00 jle 1164d4 <_POSIX_Message_queue_Create_support+0x12c>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( attr_ptr->mq_msgsize <= 0 ){
1163e4: 8b 5b 08 mov 0x8(%ebx),%ebx
1163e7: 89 5d e4 mov %ebx,-0x1c(%ebp)
1163ea: 85 db test %ebx,%ebx
1163ec: 0f 8e e2 00 00 00 jle 1164d4 <_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 );
1163f2: 83 ec 0c sub $0xc,%esp
1163f5: 68 80 12 13 00 push $0x131280
1163fa: e8 a5 c3 ff ff call 1127a4 <_Objects_Allocate>
1163ff: 89 c3 mov %eax,%ebx
attr = *attr_ptr;
}
the_mq = _POSIX_Message_queue_Allocate();
if ( !the_mq ) {
116401: 83 c4 10 add $0x10,%esp
116404: 85 c0 test %eax,%eax
116406: 0f 84 0a 01 00 00 je 116516 <_POSIX_Message_queue_Create_support+0x16e>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq->process_shared = pshared;
11640c: 8b 45 0c mov 0xc(%ebp),%eax
11640f: 89 43 10 mov %eax,0x10(%ebx)
the_mq->named = true;
116412: c6 43 14 01 movb $0x1,0x14(%ebx)
the_mq->open_count = 1;
116416: c7 43 18 01 00 00 00 movl $0x1,0x18(%ebx)
the_mq->linked = true;
11641d: 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);
116421: 8d 56 01 lea 0x1(%esi),%edx
116424: 83 ec 0c sub $0xc,%esp
116427: 52 push %edx
116428: 89 55 e0 mov %edx,-0x20(%ebp)
11642b: e8 d4 e4 ff ff call 114904 <_Workspace_Allocate>
116430: 89 c6 mov %eax,%esi
if (!name) {
116432: 83 c4 10 add $0x10,%esp
116435: 85 c0 test %eax,%eax
116437: 8b 55 e0 mov -0x20(%ebp),%edx
11643a: 0f 84 ab 00 00 00 je 1164eb <_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 );
116440: 50 push %eax
116441: 52 push %edx
116442: ff 75 08 pushl 0x8(%ebp)
116445: 56 push %esi
116446: e8 d1 4a 00 00 call 11af1c <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;
11644b: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx)
if ( !_CORE_message_queue_Initialize(
116452: ff 75 e4 pushl -0x1c(%ebp)
116455: 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;
116456: 8d 43 5c lea 0x5c(%ebx),%eax
the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( !_CORE_message_queue_Initialize(
116459: 50 push %eax
11645a: 8d 43 1c lea 0x1c(%ebx),%eax
11645d: 50 push %eax
11645e: e8 25 0f 00 00 call 117388 <_CORE_message_queue_Initialize>
116463: 83 c4 20 add $0x20,%esp
116466: 84 c0 test %al,%al
116468: 74 3a je 1164a4 <_POSIX_Message_queue_Create_support+0xfc>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
11646a: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
11646e: a1 9c 12 13 00 mov 0x13129c,%eax
116473: 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;
116476: 89 73 0c mov %esi,0xc(%ebx)
&_POSIX_Message_queue_Information,
&the_mq->Object,
name
);
*message_queue = the_mq;
116479: 8b 45 14 mov 0x14(%ebp),%eax
11647c: 89 18 mov %ebx,(%eax)
_Thread_Enable_dispatch();
11647e: e8 cd d3 ff ff call 113850 <_Thread_Enable_dispatch>
return 0;
116483: 31 c0 xor %eax,%eax
}
116485: 8d 65 f4 lea -0xc(%ebp),%esp
116488: 5b pop %ebx
116489: 5e pop %esi
11648a: 5f pop %edi
11648b: c9 leave
11648c: c3 ret
11648d: 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;
116490: 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;
116497: bf 0a 00 00 00 mov $0xa,%edi
11649c: e9 51 ff ff ff jmp 1163f2 <_POSIX_Message_queue_Create_support+0x4a>
1164a1: 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 );
1164a4: 83 ec 08 sub $0x8,%esp
1164a7: 53 push %ebx
1164a8: 68 80 12 13 00 push $0x131280
1164ad: e8 66 c6 ff ff call 112b18 <_Objects_Free>
attr.mq_maxmsg,
attr.mq_msgsize
) ) {
_POSIX_Message_queue_Free( the_mq );
_Workspace_Free(name);
1164b2: 89 34 24 mov %esi,(%esp)
1164b5: e8 66 e4 ff ff call 114920 <_Workspace_Free>
_Thread_Enable_dispatch();
1164ba: e8 91 d3 ff ff call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
1164bf: e8 50 33 00 00 call 119814 <__errno>
1164c4: c7 00 1c 00 00 00 movl $0x1c,(%eax)
1164ca: 83 c4 10 add $0x10,%esp
1164cd: b8 ff ff ff ff mov $0xffffffff,%eax
1164d2: eb b1 jmp 116485 <_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();
1164d4: e8 77 d3 ff ff call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EINVAL );
1164d9: e8 36 33 00 00 call 119814 <__errno>
1164de: c7 00 16 00 00 00 movl $0x16,(%eax)
1164e4: b8 ff ff ff ff mov $0xffffffff,%eax
1164e9: eb 9a jmp 116485 <_POSIX_Message_queue_Create_support+0xdd>
1164eb: 83 ec 08 sub $0x8,%esp
1164ee: 53 push %ebx
1164ef: 68 80 12 13 00 push $0x131280
1164f4: e8 1f 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();
1164f9: e8 52 d3 ff ff call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOMEM );
1164fe: e8 11 33 00 00 call 119814 <__errno>
116503: c7 00 0c 00 00 00 movl $0xc,(%eax)
116509: 83 c4 10 add $0x10,%esp
11650c: b8 ff ff ff ff mov $0xffffffff,%eax
116511: e9 6f ff ff ff jmp 116485 <_POSIX_Message_queue_Create_support+0xdd>
attr = *attr_ptr;
}
the_mq = _POSIX_Message_queue_Allocate();
if ( !the_mq ) {
_Thread_Enable_dispatch();
116516: e8 35 d3 ff ff call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
11651b: e8 f4 32 00 00 call 119814 <__errno>
116520: c7 00 17 00 00 00 movl $0x17,(%eax)
116526: b8 ff ff ff ff mov $0xffffffff,%eax
11652b: e9 55 ff ff ff jmp 116485 <_POSIX_Message_queue_Create_support+0xdd>
00116530 <_POSIX_Message_queue_Name_to_id>:
*/
int _POSIX_Message_queue_Name_to_id(
const char *name,
Objects_Id *id
)
{
116530: 55 push %ebp
116531: 89 e5 mov %esp,%ebp
116533: 53 push %ebx
116534: 83 ec 14 sub $0x14,%esp
116537: 8b 5d 08 mov 0x8(%ebp),%ebx
Objects_Name_or_id_lookup_errors status;
Objects_Id the_id;
if ( !name )
11653a: 85 db test %ebx,%ebx
11653c: 74 05 je 116543 <_POSIX_Message_queue_Name_to_id+0x13>
return EINVAL;
if ( !name[0] )
11653e: 80 3b 00 cmpb $0x0,(%ebx)
116541: 75 0d jne 116550 <_POSIX_Message_queue_Name_to_id+0x20>
return EINVAL;
116543: b8 16 00 00 00 mov $0x16,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
116548: 8b 5d fc mov -0x4(%ebp),%ebx
11654b: c9 leave
11654c: c3 ret
11654d: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
if ( !name[0] )
return EINVAL;
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
116550: 83 ec 08 sub $0x8,%esp
116553: 68 ff 00 00 00 push $0xff
116558: 53 push %ebx
116559: e8 3a 4a 00 00 call 11af98 <strnlen>
11655e: 83 c4 10 add $0x10,%esp
116561: 3d fe 00 00 00 cmp $0xfe,%eax
116566: 76 0c jbe 116574 <_POSIX_Message_queue_Name_to_id+0x44>
return ENAMETOOLONG;
116568: b8 5b 00 00 00 mov $0x5b,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
11656d: 8b 5d fc mov -0x4(%ebp),%ebx
116570: c9 leave
116571: c3 ret
116572: 66 90 xchg %ax,%ax
return EINVAL;
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
return ENAMETOOLONG;
status = _Objects_Name_to_id_string(
116574: 50 push %eax
116575: 8d 45 f4 lea -0xc(%ebp),%eax
116578: 50 push %eax
116579: 53 push %ebx
11657a: 68 80 12 13 00 push $0x131280
11657f: e8 10 14 00 00 call 117994 <_Objects_Name_to_id_string>
&_POSIX_Message_queue_Information,
name,
&the_id
);
*id = the_id;
116584: 8b 4d f4 mov -0xc(%ebp),%ecx
116587: 8b 55 0c mov 0xc(%ebp),%edx
11658a: 89 0a mov %ecx,(%edx)
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
11658c: 83 c4 10 add $0x10,%esp
return 0;
11658f: 83 f8 01 cmp $0x1,%eax
116592: 19 c0 sbb %eax,%eax
116594: f7 d0 not %eax
116596: 83 e0 02 and $0x2,%eax
return ENOENT;
}
116599: 8b 5d fc mov -0x4(%ebp),%ebx
11659c: c9 leave
11659d: c3 ret
0010fce8 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10fce8: 55 push %ebp
10fce9: 89 e5 mov %esp,%ebp
10fceb: 53 push %ebx
10fcec: 83 ec 28 sub $0x28,%esp
10fcef: 8b 5d 08 mov 0x8(%ebp),%ebx
10fcf2: 8a 45 18 mov 0x18(%ebp),%al
10fcf5: 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 );
10fcf8: 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(
10fcfb: 50 push %eax
10fcfc: 53 push %ebx
10fcfd: 68 20 14 13 00 push $0x131420
10fd02: e8 51 2f 00 00 call 112c58 <_Objects_Get>
switch ( location ) {
10fd07: 83 c4 10 add $0x10,%esp
10fd0a: 8b 55 f4 mov -0xc(%ebp),%edx
10fd0d: 85 d2 test %edx,%edx
10fd0f: 74 17 je 10fd28 <_POSIX_Message_queue_Receive_support+0x40>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10fd11: e8 fe 9a 00 00 call 119814 <__errno>
10fd16: c7 00 09 00 00 00 movl $0x9,(%eax)
10fd1c: b8 ff ff ff ff mov $0xffffffff,%eax
}
10fd21: 8b 5d fc mov -0x4(%ebp),%ebx
10fd24: c9 leave
10fd25: c3 ret
10fd26: 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 ) {
10fd28: 8b 50 14 mov 0x14(%eax),%edx
10fd2b: 89 d1 mov %edx,%ecx
10fd2d: 83 e1 03 and $0x3,%ecx
10fd30: 49 dec %ecx
10fd31: 0f 84 af 00 00 00 je 10fde6 <_POSIX_Message_queue_Receive_support+0xfe>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10fd37: 8b 40 10 mov 0x10(%eax),%eax
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
10fd3a: 8b 4d 10 mov 0x10(%ebp),%ecx
10fd3d: 39 48 68 cmp %ecx,0x68(%eax)
10fd40: 77 62 ja 10fda4 <_POSIX_Message_queue_Receive_support+0xbc>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
10fd42: 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 )
10fd49: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10fd4d: 75 45 jne 10fd94 <_POSIX_Message_queue_Receive_support+0xac><== ALWAYS TAKEN
10fd4f: 31 d2 xor %edx,%edx <== NOT EXECUTED
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
10fd51: 83 ec 08 sub $0x8,%esp
10fd54: ff 75 1c pushl 0x1c(%ebp)
10fd57: 52 push %edx
10fd58: 8d 55 f0 lea -0x10(%ebp),%edx
10fd5b: 52 push %edx
10fd5c: ff 75 0c pushl 0xc(%ebp)
10fd5f: 53 push %ebx
10fd60: 83 c0 1c add $0x1c,%eax
10fd63: 50 push %eax
10fd64: e8 9f 1f 00 00 call 111d08 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
10fd69: 83 c4 20 add $0x20,%esp
10fd6c: e8 df 3a 00 00 call 113850 <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
10fd71: 8b 15 98 14 13 00 mov 0x131498,%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);
10fd77: 8b 42 24 mov 0x24(%edx),%eax
10fd7a: 85 c0 test %eax,%eax
10fd7c: 78 22 js 10fda0 <_POSIX_Message_queue_Receive_support+0xb8>
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
10fd7e: 8b 4d 14 mov 0x14(%ebp),%ecx
10fd81: 89 01 mov %eax,(%ecx)
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
10fd83: 8b 42 34 mov 0x34(%edx),%eax
10fd86: 85 c0 test %eax,%eax
10fd88: 75 36 jne 10fdc0 <_POSIX_Message_queue_Receive_support+0xd8>
return length_out;
10fd8a: 8b 45 f0 mov -0x10(%ebp),%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
10fd8d: 8b 5d fc mov -0x4(%ebp),%ebx
10fd90: c9 leave
10fd91: c3 ret
10fd92: 66 90 xchg %ax,%ax
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fd94: 80 e6 40 and $0x40,%dh
10fd97: 0f 94 c2 sete %dl
10fd9a: 0f b6 d2 movzbl %dl,%edx
10fd9d: eb b2 jmp 10fd51 <_POSIX_Message_queue_Receive_support+0x69>
10fd9f: 90 nop
10fda0: f7 d8 neg %eax
10fda2: eb da jmp 10fd7e <_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();
10fda4: e8 a7 3a 00 00 call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
10fda9: e8 66 9a 00 00 call 119814 <__errno>
10fdae: c7 00 7a 00 00 00 movl $0x7a,(%eax)
10fdb4: b8 ff ff ff ff mov $0xffffffff,%eax
10fdb9: e9 63 ff ff ff jmp 10fd21 <_POSIX_Message_queue_Receive_support+0x39>
10fdbe: 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(
10fdc0: e8 4f 9a 00 00 call 119814 <__errno>
10fdc5: 89 c3 mov %eax,%ebx
10fdc7: 83 ec 0c sub $0xc,%esp
10fdca: a1 98 14 13 00 mov 0x131498,%eax
10fdcf: ff 70 34 pushl 0x34(%eax)
10fdd2: e8 29 02 00 00 call 110000 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10fdd7: 89 03 mov %eax,(%ebx)
10fdd9: 83 c4 10 add $0x10,%esp
10fddc: b8 ff ff ff ff mov $0xffffffff,%eax
10fde1: e9 3b ff ff ff jmp 10fd21 <_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();
10fde6: e8 65 3a 00 00 call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
10fdeb: e8 24 9a 00 00 call 119814 <__errno>
10fdf0: c7 00 09 00 00 00 movl $0x9,(%eax)
10fdf6: b8 ff ff ff ff mov $0xffffffff,%eax
10fdfb: e9 21 ff ff ff jmp 10fd21 <_POSIX_Message_queue_Receive_support+0x39>
0010fe20 <_POSIX_Message_queue_Send_support>:
size_t msg_len,
uint32_t msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
10fe20: 55 push %ebp
10fe21: 89 e5 mov %esp,%ebp
10fe23: 56 push %esi
10fe24: 53 push %ebx
10fe25: 83 ec 20 sub $0x20,%esp
10fe28: 8b 75 08 mov 0x8(%ebp),%esi
10fe2b: 8b 5d 14 mov 0x14(%ebp),%ebx
10fe2e: 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 )
10fe31: 83 fb 20 cmp $0x20,%ebx
10fe34: 0f 87 92 00 00 00 ja 10fecc <_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(
10fe3a: 51 push %ecx
rtems_set_errno_and_return_minus_one( EINVAL );
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
10fe3b: 8d 45 f4 lea -0xc(%ebp),%eax
10fe3e: 50 push %eax
10fe3f: 56 push %esi
10fe40: 68 20 14 13 00 push $0x131420
10fe45: 88 55 e4 mov %dl,-0x1c(%ebp)
10fe48: e8 0b 2e 00 00 call 112c58 <_Objects_Get>
switch ( location ) {
10fe4d: 83 c4 10 add $0x10,%esp
10fe50: 8b 55 f4 mov -0xc(%ebp),%edx
10fe53: 85 d2 test %edx,%edx
10fe55: 8a 55 e4 mov -0x1c(%ebp),%dl
10fe58: 75 5e jne 10feb8 <_POSIX_Message_queue_Send_support+0x98>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) {
10fe5a: 8b 48 14 mov 0x14(%eax),%ecx
10fe5d: f6 c1 03 test $0x3,%cl
10fe60: 74 7e je 10fee0 <_POSIX_Message_queue_Send_support+0xc0>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
10fe62: 8b 40 10 mov 0x10(%eax),%eax
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fe65: 84 d2 test %dl,%dl
10fe67: 75 37 jne 10fea0 <_POSIX_Message_queue_Send_support+0x80>
10fe69: 31 d2 xor %edx,%edx
do_wait = wait;
/*
* Now perform the actual message receive
*/
msg_status = _CORE_message_queue_Submit(
10fe6b: ff 75 1c pushl 0x1c(%ebp)
10fe6e: 52 push %edx
RTEMS_INLINE_ROUTINE CORE_message_queue_Submit_types _POSIX_Message_queue_Priority_to_core(
unsigned int priority
)
{
return priority * -1;
10fe6f: f7 db neg %ebx
10fe71: 53 push %ebx
10fe72: 6a 00 push $0x0
10fe74: 56 push %esi
10fe75: ff 75 10 pushl 0x10(%ebp)
10fe78: ff 75 0c pushl 0xc(%ebp)
10fe7b: 83 c0 1c add $0x1c,%eax
10fe7e: 50 push %eax
10fe7f: e8 b0 1f 00 00 call 111e34 <_CORE_message_queue_Submit>
10fe84: 89 c3 mov %eax,%ebx
_POSIX_Message_queue_Priority_to_core( msg_prio ),
do_wait,
timeout /* no timeout */
);
_Thread_Enable_dispatch();
10fe86: 83 c4 20 add $0x20,%esp
10fe89: e8 c2 39 00 00 call 113850 <_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 )
10fe8e: 83 fb 07 cmp $0x7,%ebx
10fe91: 74 19 je 10feac <_POSIX_Message_queue_Send_support+0x8c>
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
10fe93: 85 db test %ebx,%ebx
10fe95: 75 61 jne 10fef8 <_POSIX_Message_queue_Send_support+0xd8>
return msg_status;
10fe97: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
}
10fe99: 8d 65 f8 lea -0x8(%ebp),%esp
10fe9c: 5b pop %ebx
10fe9d: 5e pop %esi
10fe9e: c9 leave
10fe9f: c3 ret
the_mq = the_mq_fd->Queue;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
10fea0: 31 d2 xor %edx,%edx
10fea2: f6 c5 40 test $0x40,%ch
10fea5: 0f 94 c2 sete %dl
10fea8: eb c1 jmp 10fe6b <_POSIX_Message_queue_Send_support+0x4b>
10feaa: 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;
10feac: a1 98 14 13 00 mov 0x131498,%eax
10feb1: 8b 58 34 mov 0x34(%eax),%ebx
10feb4: eb dd jmp 10fe93 <_POSIX_Message_queue_Send_support+0x73>
10feb6: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
10feb8: e8 57 99 00 00 call 119814 <__errno>
10febd: c7 00 09 00 00 00 movl $0x9,(%eax)
10fec3: b8 ff ff ff ff mov $0xffffffff,%eax
10fec8: eb cf jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
10feca: 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 );
10fecc: e8 43 99 00 00 call 119814 <__errno>
10fed1: c7 00 16 00 00 00 movl $0x16,(%eax)
10fed7: b8 ff ff ff ff mov $0xffffffff,%eax
10fedc: eb bb jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
10fede: 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();
10fee0: e8 6b 39 00 00 call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
10fee5: e8 2a 99 00 00 call 119814 <__errno>
10feea: c7 00 09 00 00 00 movl $0x9,(%eax)
10fef0: b8 ff ff ff ff mov $0xffffffff,%eax
10fef5: eb a2 jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
10fef7: 90 nop
msg_status = _Thread_Executing->Wait.return_code;
if ( !msg_status )
return msg_status;
rtems_set_errno_and_return_minus_one(
10fef8: e8 17 99 00 00 call 119814 <__errno>
10fefd: 89 c6 mov %eax,%esi
10feff: 83 ec 0c sub $0xc,%esp
10ff02: 53 push %ebx
10ff03: e8 f8 00 00 00 call 110000 <_POSIX_Message_queue_Translate_core_message_queue_return_code>
10ff08: 89 06 mov %eax,(%esi)
10ff0a: 83 c4 10 add $0x10,%esp
10ff0d: b8 ff ff ff ff mov $0xffffffff,%eax
10ff12: eb 85 jmp 10fe99 <_POSIX_Message_queue_Send_support+0x79>
0010d0f4 <_POSIX_Mutex_Get>:
POSIX_Mutex_Control *_POSIX_Mutex_Get (
pthread_mutex_t *mutex,
Objects_Locations *location
)
{
10d0f4: 55 push %ebp
10d0f5: 89 e5 mov %esp,%ebp
10d0f7: 56 push %esi
10d0f8: 53 push %ebx
10d0f9: 8b 5d 08 mov 0x8(%ebp),%ebx
10d0fc: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10d0ff: 85 db test %ebx,%ebx
10d101: 74 39 je 10d13c <_POSIX_Mutex_Get+0x48>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d103: 8b 03 mov (%ebx),%eax
10d105: 83 f8 ff cmp $0xffffffff,%eax
10d108: 74 1a je 10d124 <_POSIX_Mutex_Get+0x30>
return (POSIX_Mutex_Control *)
_Objects_Get( &_POSIX_Mutex_Information, (Objects_Id) *mutex, location );
10d10a: 52 push %edx
10d10b: 56 push %esi
10d10c: 50 push %eax
10d10d: 68 c0 d0 12 00 push $0x12d0c0
10d112: e8 e1 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 *)
10d117: 83 c4 10 add $0x10,%esp
_Objects_Get( &_POSIX_Mutex_Information, (Objects_Id) *mutex, location );
}
10d11a: 8d 65 f8 lea -0x8(%ebp),%esp
10d11d: 5b pop %ebx
10d11e: 5e pop %esi
10d11f: c9 leave
10d120: c3 ret
10d121: 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 );
10d124: 83 ec 08 sub $0x8,%esp
10d127: 6a 00 push $0x0
10d129: 53 push %ebx
10d12a: e8 b9 00 00 00 call 10d1e8 <pthread_mutex_init>
10d12f: 83 c4 10 add $0x10,%esp
10d132: 85 c0 test %eax,%eax
10d134: 75 06 jne 10d13c <_POSIX_Mutex_Get+0x48>
10d136: 8b 03 mov (%ebx),%eax
10d138: eb d0 jmp 10d10a <_POSIX_Mutex_Get+0x16>
10d13a: 66 90 xchg %ax,%ax
10d13c: c7 06 01 00 00 00 movl $0x1,(%esi)
10d142: 31 c0 xor %eax,%eax
10d144: eb d4 jmp 10d11a <_POSIX_Mutex_Get+0x26>
0010d148 <_POSIX_Mutex_Get_interrupt_disable>:
POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
)
{
10d148: 55 push %ebp
10d149: 89 e5 mov %esp,%ebp
10d14b: 56 push %esi
10d14c: 53 push %ebx
10d14d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d150: 8b 75 0c mov 0xc(%ebp),%esi
___POSIX_Mutex_Get_support_error_check( mutex, location );
10d153: 85 db test %ebx,%ebx
10d155: 74 39 je 10d190 <_POSIX_Mutex_Get_interrupt_disable+0x48>
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d157: 8b 03 mov (%ebx),%eax
10d159: 83 f8 ff cmp $0xffffffff,%eax
10d15c: 74 1a je 10d178 <_POSIX_Mutex_Get_interrupt_disable+0x30>
return (POSIX_Mutex_Control *) _Objects_Get_isr_disable(
10d15e: ff 75 10 pushl 0x10(%ebp)
10d161: 56 push %esi
10d162: 50 push %eax
10d163: 68 c0 d0 12 00 push $0x12d0c0
10d168: e8 33 2b 00 00 call 10fca0 <_Objects_Get_isr_disable>
10d16d: 83 c4 10 add $0x10,%esp
&_POSIX_Mutex_Information,
(Objects_Id) *mutex,
location,
level
);
}
10d170: 8d 65 f8 lea -0x8(%ebp),%esp
10d173: 5b pop %ebx
10d174: 5e pop %esi
10d175: c9 leave
10d176: c3 ret
10d177: 90 nop
ISR_Level *level
)
{
___POSIX_Mutex_Get_support_error_check( mutex, location );
___POSIX_Mutex_Get_support_auto_initialization( mutex, location );
10d178: 83 ec 08 sub $0x8,%esp
10d17b: 6a 00 push $0x0
10d17d: 53 push %ebx
10d17e: e8 65 00 00 00 call 10d1e8 <pthread_mutex_init>
10d183: 83 c4 10 add $0x10,%esp
10d186: 85 c0 test %eax,%eax
10d188: 75 06 jne 10d190 <_POSIX_Mutex_Get_interrupt_disable+0x48>
10d18a: 8b 03 mov (%ebx),%eax
10d18c: eb d0 jmp 10d15e <_POSIX_Mutex_Get_interrupt_disable+0x16>
10d18e: 66 90 xchg %ax,%ax
10d190: c7 06 01 00 00 00 movl $0x1,(%esi)
10d196: 31 c0 xor %eax,%eax
10d198: eb d6 jmp 10d170 <_POSIX_Mutex_Get_interrupt_disable+0x28>
0010d348 <_POSIX_Mutex_Lock_support>:
int _POSIX_Mutex_Lock_support(
pthread_mutex_t *mutex,
bool blocking,
Watchdog_Interval timeout
)
{
10d348: 55 push %ebp
10d349: 89 e5 mov %esp,%ebp
10d34b: 53 push %ebx
10d34c: 83 ec 18 sub $0x18,%esp
10d34f: 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 );
10d352: 8d 45 f0 lea -0x10(%ebp),%eax
10d355: 50 push %eax
10d356: 8d 45 f4 lea -0xc(%ebp),%eax
10d359: 50 push %eax
10d35a: ff 75 08 pushl 0x8(%ebp)
10d35d: e8 e6 fd ff ff call 10d148 <_POSIX_Mutex_Get_interrupt_disable>
switch ( location ) {
10d362: 83 c4 10 add $0x10,%esp
10d365: 8b 55 f4 mov -0xc(%ebp),%edx
10d368: 85 d2 test %edx,%edx
10d36a: 75 34 jne 10d3a0 <_POSIX_Mutex_Lock_support+0x58>
case OBJECTS_LOCAL:
_CORE_mutex_Seize(
10d36c: 83 ec 0c sub $0xc,%esp
10d36f: ff 75 f0 pushl -0x10(%ebp)
10d372: ff 75 10 pushl 0x10(%ebp)
10d375: 0f b6 db movzbl %bl,%ebx
10d378: 53 push %ebx
10d379: ff 70 08 pushl 0x8(%eax)
10d37c: 83 c0 14 add $0x14,%eax
10d37f: 50 push %eax
10d380: e8 43 1d 00 00 call 10f0c8 <_CORE_mutex_Seize>
the_mutex->Object.id,
blocking,
timeout,
level
);
return _POSIX_Mutex_Translate_core_mutex_return_code(
10d385: 83 c4 14 add $0x14,%esp
(CORE_mutex_Status) _Thread_Executing->Wait.return_code
10d388: a1 98 d2 12 00 mov 0x12d298,%eax
the_mutex->Object.id,
blocking,
timeout,
level
);
return _POSIX_Mutex_Translate_core_mutex_return_code(
10d38d: ff 70 34 pushl 0x34(%eax)
10d390: e8 1b 01 00 00 call 10d4b0 <_POSIX_Mutex_Translate_core_mutex_return_code>
10d395: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10d398: 8b 5d fc mov -0x4(%ebp),%ebx
10d39b: c9 leave
10d39c: c3 ret
10d39d: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10d3a0: b8 16 00 00 00 mov $0x16,%eax
}
10d3a5: 8b 5d fc mov -0x4(%ebp),%ebx
10d3a8: c9 leave
10d3a9: c3 ret
00114978 <_POSIX_Semaphore_Create_support>:
const char *name,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
114978: 55 push %ebp
114979: 89 e5 mov %esp,%ebp
11497b: 56 push %esi
11497c: 53 push %ebx
11497d: 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)
114980: 8b 55 0c mov 0xc(%ebp),%edx
114983: 85 d2 test %edx,%edx
114985: 0f 85 b9 00 00 00 jne 114a44 <_POSIX_Semaphore_Create_support+0xcc>
rtems_set_errno_and_return_minus_one( ENOSYS );
if ( name ) {
11498b: 85 db test %ebx,%ebx
11498d: 74 1c je 1149ab <_POSIX_Semaphore_Create_support+0x33>
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
11498f: 83 ec 08 sub $0x8,%esp
114992: 68 ff 00 00 00 push $0xff
114997: 53 push %ebx
114998: e8 3b 3d 00 00 call 1186d8 <strnlen>
11499d: 83 c4 10 add $0x10,%esp
1149a0: 3d fe 00 00 00 cmp $0xfe,%eax
1149a5: 0f 87 ad 00 00 00 ja 114a58 <_POSIX_Semaphore_Create_support+0xe0>
1149ab: a1 10 db 12 00 mov 0x12db10,%eax
1149b0: 40 inc %eax
1149b1: a3 10 db 12 00 mov %eax,0x12db10
*/
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
{
return (POSIX_Semaphore_Control *)
_Objects_Allocate( &_POSIX_Semaphore_Information );
1149b6: 83 ec 0c sub $0xc,%esp
1149b9: 68 20 de 12 00 push $0x12de20
1149be: e8 65 b9 ff ff call 110328 <_Objects_Allocate>
1149c3: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
1149c5: 83 c4 10 add $0x10,%esp
1149c8: 85 c0 test %eax,%eax
1149ca: 0f 84 9a 00 00 00 je 114a6a <_POSIX_Semaphore_Create_support+0xf2>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENOSPC );
}
the_semaphore->process_shared = pshared;
1149d0: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
if ( name ) {
1149d7: 85 db test %ebx,%ebx
1149d9: 74 55 je 114a30 <_POSIX_Semaphore_Create_support+0xb8>
the_semaphore->named = true;
1149db: c6 40 14 01 movb $0x1,0x14(%eax)
the_semaphore->open_count = 1;
1149df: c7 40 18 01 00 00 00 movl $0x1,0x18(%eax)
the_semaphore->linked = true;
1149e6: 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;
1149ea: c7 46 60 00 00 00 00 movl $0x0,0x60(%esi)
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
1149f1: c7 46 5c ff ff ff ff movl $0xffffffff,0x5c(%esi)
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
1149f8: 50 push %eax
1149f9: 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;
1149fc: 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 );
1149ff: 50 push %eax
114a00: 8d 46 1c lea 0x1c(%esi),%eax
114a03: 50 push %eax
114a04: e8 a7 b3 ff ff call 10fdb0 <_CORE_semaphore_Initialize>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
114a09: 0f b7 56 08 movzwl 0x8(%esi),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
114a0d: a1 3c de 12 00 mov 0x12de3c,%eax
114a12: 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;
114a15: 89 5e 0c mov %ebx,0xc(%esi)
&_POSIX_Semaphore_Information,
&the_semaphore->Object,
name_p
);
*the_sem = the_semaphore;
114a18: 8b 45 14 mov 0x14(%ebp),%eax
114a1b: 89 30 mov %esi,(%eax)
_Thread_Enable_dispatch();
114a1d: e8 b2 c9 ff ff call 1113d4 <_Thread_Enable_dispatch>
return 0;
114a22: 83 c4 10 add $0x10,%esp
114a25: 31 c0 xor %eax,%eax
}
114a27: 8d 65 f8 lea -0x8(%ebp),%esp
114a2a: 5b pop %ebx
114a2b: 5e pop %esi
114a2c: c9 leave
114a2d: c3 ret
114a2e: 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;
114a30: c6 40 14 00 movb $0x0,0x14(%eax)
the_semaphore->open_count = 0;
114a34: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_semaphore->linked = false;
114a3b: c6 40 15 00 movb $0x0,0x15(%eax)
114a3f: eb a9 jmp 1149ea <_POSIX_Semaphore_Create_support+0x72>
114a41: 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 );
114a44: e8 5f 2b 00 00 call 1175a8 <__errno>
114a49: c7 00 58 00 00 00 movl $0x58,(%eax)
114a4f: b8 ff ff ff ff mov $0xffffffff,%eax
114a54: eb d1 jmp 114a27 <_POSIX_Semaphore_Create_support+0xaf>
114a56: 66 90 xchg %ax,%ax
if ( name ) {
if ( strnlen( name, NAME_MAX ) >= NAME_MAX )
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
114a58: e8 4b 2b 00 00 call 1175a8 <__errno>
114a5d: c7 00 5b 00 00 00 movl $0x5b,(%eax)
114a63: b8 ff ff ff ff mov $0xffffffff,%eax
114a68: eb bd jmp 114a27 <_POSIX_Semaphore_Create_support+0xaf>
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
114a6a: e8 65 c9 ff ff call 1113d4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
114a6f: e8 34 2b 00 00 call 1175a8 <__errno>
114a74: c7 00 1c 00 00 00 movl $0x1c,(%eax)
114a7a: b8 ff ff ff ff mov $0xffffffff,%eax
114a7f: eb a6 jmp 114a27 <_POSIX_Semaphore_Create_support+0xaf>
00114ad4 <_POSIX_Semaphore_Name_to_id>:
int _POSIX_Semaphore_Name_to_id(
const char *name,
sem_t *id
)
{
114ad4: 55 push %ebp
114ad5: 89 e5 mov %esp,%ebp
114ad7: 83 ec 18 sub $0x18,%esp
114ada: 8b 45 08 mov 0x8(%ebp),%eax
Objects_Name_or_id_lookup_errors status;
Objects_Id the_id;
if ( !name )
114add: 85 c0 test %eax,%eax
114adf: 74 05 je 114ae6 <_POSIX_Semaphore_Name_to_id+0x12>
return EINVAL;
if ( !name[0] )
114ae1: 80 38 00 cmpb $0x0,(%eax)
114ae4: 75 0a jne 114af0 <_POSIX_Semaphore_Name_to_id+0x1c>
return EINVAL;
114ae6: b8 16 00 00 00 mov $0x16,%eax
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
return 0;
return ENOENT;
}
114aeb: c9 leave
114aec: c3 ret
114aed: 8d 76 00 lea 0x0(%esi),%esi
return EINVAL;
if ( !name[0] )
return EINVAL;
status = _Objects_Name_to_id_string(
114af0: 52 push %edx
114af1: 8d 55 f4 lea -0xc(%ebp),%edx
114af4: 52 push %edx
114af5: 50 push %eax
114af6: 68 20 de 12 00 push $0x12de20
114afb: e8 7c 0c 00 00 call 11577c <_Objects_Name_to_id_string>
&_POSIX_Semaphore_Information,
name,
&the_id
);
*id = the_id;
114b00: 8b 4d f4 mov -0xc(%ebp),%ecx
114b03: 8b 55 0c mov 0xc(%ebp),%edx
114b06: 89 0a mov %ecx,(%edx)
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL )
114b08: 83 c4 10 add $0x10,%esp
return 0;
114b0b: 83 f8 01 cmp $0x1,%eax
114b0e: 19 c0 sbb %eax,%eax
114b10: f7 d0 not %eax
114b12: 83 e0 02 and $0x2,%eax
return ENOENT;
}
114b15: c9 leave
114b16: c3 ret
00114b40 <_POSIX_Semaphore_Wait_support>:
int _POSIX_Semaphore_Wait_support(
sem_t *sem,
bool blocking,
Watchdog_Interval timeout
)
{
114b40: 55 push %ebp
114b41: 89 e5 mov %esp,%ebp
114b43: 53 push %ebx
114b44: 83 ec 18 sub $0x18,%esp
114b47: 8a 5d 0c mov 0xc(%ebp),%bl
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
114b4a: 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 );
114b4d: 50 push %eax
114b4e: 8b 45 08 mov 0x8(%ebp),%eax
114b51: ff 30 pushl (%eax)
114b53: 68 20 de 12 00 push $0x12de20
114b58: e8 7f bc ff ff call 1107dc <_Objects_Get>
switch ( location ) {
114b5d: 83 c4 10 add $0x10,%esp
114b60: 8b 55 f4 mov -0xc(%ebp),%edx
114b63: 85 d2 test %edx,%edx
114b65: 74 15 je 114b7c <_POSIX_Semaphore_Wait_support+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
114b67: e8 3c 2a 00 00 call 1175a8 <__errno>
114b6c: c7 00 16 00 00 00 movl $0x16,(%eax)
114b72: b8 ff ff ff ff mov $0xffffffff,%eax
}
114b77: 8b 5d fc mov -0x4(%ebp),%ebx
114b7a: c9 leave
114b7b: c3 ret
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_semaphore_Seize(
114b7c: ff 75 10 pushl 0x10(%ebp)
114b7f: 0f b6 db movzbl %bl,%ebx
114b82: 53 push %ebx
114b83: ff 70 08 pushl 0x8(%eax)
114b86: 83 c0 1c add $0x1c,%eax
114b89: 50 push %eax
114b8a: e8 29 07 00 00 call 1152b8 <_CORE_semaphore_Seize>
&the_semaphore->Semaphore,
the_semaphore->Object.id,
blocking,
timeout
);
_Thread_Enable_dispatch();
114b8f: e8 40 c8 ff ff call 1113d4 <_Thread_Enable_dispatch>
if ( !_Thread_Executing->Wait.return_code )
114b94: 83 c4 10 add $0x10,%esp
114b97: a1 b8 e0 12 00 mov 0x12e0b8,%eax
114b9c: 8b 40 34 mov 0x34(%eax),%eax
114b9f: 85 c0 test %eax,%eax
114ba1: 75 09 jne 114bac <_POSIX_Semaphore_Wait_support+0x6c>
return 0;
114ba3: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
114ba5: 8b 5d fc mov -0x4(%ebp),%ebx
114ba8: c9 leave
114ba9: c3 ret
114baa: 66 90 xchg %ax,%ax
_Thread_Enable_dispatch();
if ( !_Thread_Executing->Wait.return_code )
return 0;
rtems_set_errno_and_return_minus_one(
114bac: e8 f7 29 00 00 call 1175a8 <__errno>
114bb1: 89 c3 mov %eax,%ebx
114bb3: 83 ec 0c sub $0xc,%esp
114bb6: a1 b8 e0 12 00 mov 0x12e0b8,%eax
114bbb: ff 70 34 pushl 0x34(%eax)
114bbe: e8 55 25 00 00 call 117118 <_POSIX_Semaphore_Translate_core_semaphore_return_code>
114bc3: 89 03 mov %eax,(%ebx)
114bc5: 83 c4 10 add $0x10,%esp
114bc8: b8 ff ff ff ff mov $0xffffffff,%eax
114bcd: eb a8 jmp 114b77 <_POSIX_Semaphore_Wait_support+0x37>
001106fc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
1106fc: 55 push %ebp
1106fd: 89 e5 mov %esp,%ebp
1106ff: 83 ec 08 sub $0x8,%esp
110702: 8b 55 08 mov 0x8(%ebp),%edx
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
110705: 8b 82 ec 00 00 00 mov 0xec(%edx),%eax
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
11070b: 8b 88 d8 00 00 00 mov 0xd8(%eax),%ecx
110711: 85 c9 test %ecx,%ecx
110713: 75 09 jne 11071e <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x22><== NEVER TAKEN
110715: 83 b8 dc 00 00 00 01 cmpl $0x1,0xdc(%eax)
11071c: 74 06 je 110724 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x28>
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
} else
_Thread_Enable_dispatch();
}
11071e: 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();
11071f: e9 d4 d6 ff ff jmp 10ddf8 <_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 &&
110724: 8b 80 e0 00 00 00 mov 0xe0(%eax),%eax
11072a: 85 c0 test %eax,%eax
11072c: 74 f0 je 11071e <_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;
11072e: a1 b0 90 12 00 mov 0x1290b0,%eax
110733: 48 dec %eax
110734: a3 b0 90 12 00 mov %eax,0x1290b0
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
110739: 83 ec 08 sub $0x8,%esp
11073c: 6a ff push $0xffffffff
11073e: 52 push %edx
11073f: e8 c0 08 00 00 call 111004 <_POSIX_Thread_Exit>
110744: 83 c4 10 add $0x10,%esp
} else
_Thread_Enable_dispatch();
}
110747: c9 leave
110748: c3 ret
00111a6c <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
111a6c: 55 push %ebp
111a6d: 89 e5 mov %esp,%ebp
111a6f: 57 push %edi
111a70: 56 push %esi
111a71: 53 push %ebx
111a72: 83 ec 18 sub $0x18,%esp
111a75: 8b 5d 08 mov 0x8(%ebp),%ebx
111a78: 8b 75 0c mov 0xc(%ebp),%esi
111a7b: 8b 7d 10 mov 0x10(%ebp),%edi
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
111a7e: ff 36 pushl (%esi)
111a80: e8 cb ff ff ff call 111a50 <_POSIX_Priority_Is_valid>
111a85: 83 c4 10 add $0x10,%esp
111a88: 84 c0 test %al,%al
111a8a: 74 2a je 111ab6 <_POSIX_Thread_Translate_sched_param+0x4a><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
111a8c: c7 07 00 00 00 00 movl $0x0,(%edi)
*budget_callout = NULL;
111a92: 8b 45 14 mov 0x14(%ebp),%eax
111a95: c7 00 00 00 00 00 movl $0x0,(%eax)
if ( policy == SCHED_OTHER ) {
111a9b: 85 db test %ebx,%ebx
111a9d: 74 25 je 111ac4 <_POSIX_Thread_Translate_sched_param+0x58>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
111a9f: 83 fb 01 cmp $0x1,%ebx
111aa2: 0f 84 90 00 00 00 je 111b38 <_POSIX_Thread_Translate_sched_param+0xcc>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
111aa8: 83 fb 02 cmp $0x2,%ebx
111aab: 0f 84 8f 00 00 00 je 111b40 <_POSIX_Thread_Translate_sched_param+0xd4>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
111ab1: 83 fb 04 cmp $0x4,%ebx
111ab4: 74 1e je 111ad4 <_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;
111ab6: b8 16 00 00 00 mov $0x16,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
111abb: 8d 65 f4 lea -0xc(%ebp),%esp
111abe: 5b pop %ebx
111abf: 5e pop %esi
111ac0: 5f pop %edi
111ac1: c9 leave
111ac2: c3 ret
111ac3: 90 nop
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
111ac4: c7 07 01 00 00 00 movl $0x1,(%edi)
return 0;
111aca: 31 c0 xor %eax,%eax
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
111acc: 8d 65 f4 lea -0xc(%ebp),%esp
111acf: 5b pop %ebx
111ad0: 5e pop %esi
111ad1: 5f pop %edi
111ad2: c9 leave
111ad3: 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) &&
111ad4: 8b 5e 08 mov 0x8(%esi),%ebx
111ad7: 85 db test %ebx,%ebx
111ad9: 75 07 jne 111ae2 <_POSIX_Thread_Translate_sched_param+0x76>
111adb: 8b 4e 0c mov 0xc(%esi),%ecx
111ade: 85 c9 test %ecx,%ecx
111ae0: 74 d4 je 111ab6 <_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) &&
111ae2: 8b 56 10 mov 0x10(%esi),%edx
111ae5: 85 d2 test %edx,%edx
111ae7: 75 07 jne 111af0 <_POSIX_Thread_Translate_sched_param+0x84>
111ae9: 8b 46 14 mov 0x14(%esi),%eax
111aec: 85 c0 test %eax,%eax
111aee: 74 c6 je 111ab6 <_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 ) <
111af0: 83 ec 0c sub $0xc,%esp
111af3: 8d 46 08 lea 0x8(%esi),%eax
111af6: 50 push %eax
111af7: e8 00 da ff ff call 10f4fc <_Timespec_To_ticks>
111afc: 89 c3 mov %eax,%ebx
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
111afe: 8d 46 10 lea 0x10(%esi),%eax
111b01: 89 04 24 mov %eax,(%esp)
111b04: e8 f3 d9 ff ff call 10f4fc <_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 ) <
111b09: 83 c4 10 add $0x10,%esp
111b0c: 39 c3 cmp %eax,%ebx
111b0e: 72 a6 jb 111ab6 <_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 ) )
111b10: 83 ec 0c sub $0xc,%esp
111b13: ff 76 04 pushl 0x4(%esi)
111b16: e8 35 ff ff ff call 111a50 <_POSIX_Priority_Is_valid>
111b1b: 83 c4 10 add $0x10,%esp
111b1e: 84 c0 test %al,%al
111b20: 74 94 je 111ab6 <_POSIX_Thread_Translate_sched_param+0x4a>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
111b22: c7 07 03 00 00 00 movl $0x3,(%edi)
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
111b28: 8b 45 14 mov 0x14(%ebp),%eax
111b2b: c7 00 14 bd 10 00 movl $0x10bd14,(%eax)
return 0;
111b31: 31 c0 xor %eax,%eax
111b33: eb 86 jmp 111abb <_POSIX_Thread_Translate_sched_param+0x4f>
111b35: 8d 76 00 lea 0x0(%esi),%esi
return 0;
}
if ( policy == SCHED_FIFO ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
111b38: 31 c0 xor %eax,%eax
111b3a: e9 7c ff ff ff jmp 111abb <_POSIX_Thread_Translate_sched_param+0x4f>
111b3f: 90 nop
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
111b40: c7 07 02 00 00 00 movl $0x2,(%edi)
return 0;
111b46: 31 c0 xor %eax,%eax
111b48: e9 6e ff ff ff jmp 111abb <_POSIX_Thread_Translate_sched_param+0x4f>
00110918 <_POSIX_Threads_Create_extension>:
bool _POSIX_Threads_Create_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *created
)
{
110918: 55 push %ebp
110919: 89 e5 mov %esp,%ebp
11091b: 57 push %edi
11091c: 56 push %esi
11091d: 53 push %ebx
11091e: 83 ec 28 sub $0x28,%esp
110921: 8b 55 0c mov 0xc(%ebp),%edx
POSIX_API_Control *api;
POSIX_API_Control *executing_api;
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
110924: 68 f0 00 00 00 push $0xf0
110929: 89 55 e4 mov %edx,-0x1c(%ebp)
11092c: e8 57 e0 ff ff call 10e988 <_Workspace_Allocate>
110931: 89 c3 mov %eax,%ebx
if ( !api )
110933: 83 c4 10 add $0x10,%esp
110936: 85 c0 test %eax,%eax
110938: 8b 55 e4 mov -0x1c(%ebp),%edx
11093b: 0f 84 2f 01 00 00 je 110a70 <_POSIX_Threads_Create_extension+0x158><== NEVER TAKEN
return false;
created->API_Extensions[ THREAD_API_POSIX ] = api;
110941: 89 82 ec 00 00 00 mov %eax,0xec(%edx)
/* XXX check all fields are touched */
api->Attributes = _POSIX_Threads_Default_attributes;
110947: b9 40 00 00 00 mov $0x40,%ecx
11094c: 31 c0 xor %eax,%eax
11094e: 89 df mov %ebx,%edi
110950: f3 aa rep stos %al,%es:(%edi)
110952: c7 03 01 00 00 00 movl $0x1,(%ebx)
110958: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
11095f: c7 43 14 01 00 00 00 movl $0x1,0x14(%ebx)
110966: c7 43 18 02 00 00 00 movl $0x2,0x18(%ebx)
11096d: c7 43 38 01 00 00 00 movl $0x1,0x38(%ebx)
110974: c7 43 3c 01 00 00 00 movl $0x1,0x3c(%ebx)
api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
11097b: c7 43 40 01 00 00 00 movl $0x1,0x40(%ebx)
api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
110982: c7 83 84 00 00 00 01 movl $0x1,0x84(%ebx)
110989: 00 00 00
api->schedparam = _POSIX_Threads_Default_attributes.schedparam;
11098c: be 78 1b 12 00 mov $0x121b78,%esi
110991: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi
110997: b1 07 mov $0x7,%cl
110999: 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);
11099b: 0f b6 05 74 3a 12 00 movzbl 0x123a74,%eax
1109a2: 2b 42 14 sub 0x14(%edx),%eax
1109a5: 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;
1109ab: c7 83 e0 00 00 00 00 movl $0x0,0xe0(%ebx)
1109b2: 00 00 00
api->cancelability_state = PTHREAD_CANCEL_ENABLE;
1109b5: c7 83 d8 00 00 00 00 movl $0x0,0xd8(%ebx)
1109bc: 00 00 00
api->cancelability_type = PTHREAD_CANCEL_DEFERRED;
1109bf: c7 83 dc 00 00 00 00 movl $0x0,0xdc(%ebx)
1109c6: 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 );
1109c9: 8d 83 e8 00 00 00 lea 0xe8(%ebx),%eax
1109cf: 89 83 e4 00 00 00 mov %eax,0xe4(%ebx)
head->next = tail;
head->previous = NULL;
1109d5: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
1109dc: 00 00 00
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
1109df: 8d 83 e4 00 00 00 lea 0xe4(%ebx),%eax
1109e5: 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;
1109eb: c7 83 d4 00 00 00 00 movl $0x0,0xd4(%ebx)
1109f2: 00 00 00
1109f5: 0f b6 42 0b movzbl 0xb(%edx),%eax
1109f9: 83 e0 07 and $0x7,%eax
if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API
1109fc: 83 f8 03 cmp $0x3,%eax
1109ff: 74 53 je 110a54 <_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;
110a01: c7 83 d0 00 00 00 ff movl $0xffffffff,0xd0(%ebx)
110a08: ff ff ff
}
_Thread_queue_Initialize(
110a0b: 6a 00 push $0x0
110a0d: 68 00 10 00 00 push $0x1000
110a12: 6a 00 push $0x0
110a14: 8d 43 44 lea 0x44(%ebx),%eax
110a17: 50 push %eax
110a18: 89 55 e4 mov %edx,-0x1c(%ebp)
110a1b: e8 9c d6 ff ff call 10e0bc <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_JOIN_AT_EXIT,
0
);
_Watchdog_Initialize(
110a20: 8b 55 e4 mov -0x1c(%ebp),%edx
110a23: 8b 42 08 mov 0x8(%edx),%eax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
110a26: c7 83 b0 00 00 00 00 movl $0x0,0xb0(%ebx)
110a2d: 00 00 00
the_watchdog->routine = routine;
110a30: c7 83 c4 00 00 00 7c movl $0x110a7c,0xc4(%ebx)
110a37: 0a 11 00
the_watchdog->id = id;
110a3a: 89 83 c8 00 00 00 mov %eax,0xc8(%ebx)
the_watchdog->user_data = user_data;
110a40: 89 93 cc 00 00 00 mov %edx,0xcc(%ebx)
_POSIX_Threads_Sporadic_budget_TSR,
created->Object.id,
created
);
return true;
110a46: 83 c4 10 add $0x10,%esp
110a49: b0 01 mov $0x1,%al
}
110a4b: 8d 65 f4 lea -0xc(%ebp),%esp
110a4e: 5b pop %ebx
110a4f: 5e pop %esi
110a50: 5f pop %edi
110a51: c9 leave
110a52: c3 ret
110a53: 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 ];
110a54: a1 38 83 12 00 mov 0x128338,%eax
api->signals_blocked = executing_api->signals_blocked;
110a59: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
110a5f: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
110a65: 89 83 d0 00 00 00 mov %eax,0xd0(%ebx)
110a6b: eb 9e jmp 110a0b <_POSIX_Threads_Create_extension+0xf3>
110a6d: 8d 76 00 lea 0x0(%esi),%esi
POSIX_API_Control *executing_api;
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
if ( !api )
return false;
110a70: 31 c0 xor %eax,%eax
created->Object.id,
created
);
return true;
}
110a72: 8d 65 f4 lea -0xc(%ebp),%esp
110a75: 5b pop %ebx
110a76: 5e pop %esi
110a77: 5f pop %edi
110a78: c9 leave
110a79: c3 ret
00110890 <_POSIX_Threads_Delete_extension>:
*/
void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
110890: 55 push %ebp
110891: 89 e5 mov %esp,%ebp
110893: 57 push %edi
110894: 56 push %esi
110895: 53 push %ebx
110896: 83 ec 28 sub $0x28,%esp
110899: 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 ];
11089c: 8b 87 ec 00 00 00 mov 0xec(%edi),%eax
1108a2: 89 45 e4 mov %eax,-0x1c(%ebp)
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
1108a5: 57 push %edi
1108a6: e8 fd 21 00 00 call 112aa8 <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
1108ab: 89 3c 24 mov %edi,(%esp)
1108ae: e8 5d 22 00 00 call 112b10 <_POSIX_Keys_Run_destructors>
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
1108b3: 8b 77 28 mov 0x28(%edi),%esi
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
1108b6: 83 c4 10 add $0x10,%esp
1108b9: 8b 45 e4 mov -0x1c(%ebp),%eax
1108bc: 8d 58 44 lea 0x44(%eax),%ebx
1108bf: eb 08 jmp 1108c9 <_POSIX_Threads_Delete_extension+0x39>
1108c1: 8d 76 00 lea 0x0(%esi),%esi
*(void **)the_thread->Wait.return_argument = value_ptr;
1108c4: 8b 40 28 mov 0x28(%eax),%eax
1108c7: 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 )) )
1108c9: 83 ec 0c sub $0xc,%esp
1108cc: 53 push %ebx
1108cd: e8 5a d4 ff ff call 10dd2c <_Thread_queue_Dequeue>
1108d2: 83 c4 10 add $0x10,%esp
1108d5: 85 c0 test %eax,%eax
1108d7: 75 eb jne 1108c4 <_POSIX_Threads_Delete_extension+0x34>
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
1108d9: 8b 45 e4 mov -0x1c(%ebp),%eax
1108dc: 83 b8 84 00 00 00 04 cmpl $0x4,0x84(%eax)
1108e3: 74 1f je 110904 <_POSIX_Threads_Delete_extension+0x74>
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
1108e5: c7 87 ec 00 00 00 00 movl $0x0,0xec(%edi)
1108ec: 00 00 00
_Workspace_Free( api );
1108ef: 8b 45 e4 mov -0x1c(%ebp),%eax
1108f2: 89 45 08 mov %eax,0x8(%ebp)
}
1108f5: 8d 65 f4 lea -0xc(%ebp),%esp
1108f8: 5b pop %ebx
1108f9: 5e pop %esi
1108fa: 5f pop %edi
1108fb: c9 leave
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
1108fc: e9 a3 e0 ff ff jmp 10e9a4 <_Workspace_Free>
110901: 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 );
110904: 83 ec 0c sub $0xc,%esp
110907: 05 a8 00 00 00 add $0xa8,%eax
11090c: 50 push %eax
11090d: e8 4e df ff ff call 10e860 <_Watchdog_Remove>
110912: 83 c4 10 add $0x10,%esp
110915: eb ce jmp 1108e5 <_POSIX_Threads_Delete_extension+0x55>
00110854 <_POSIX_Threads_Initialize_user_threads>:
*
* This routine creates and starts all configured user
* initialzation threads.
*/
void _POSIX_Threads_Initialize_user_threads( void )
{
110854: 55 push %ebp
110855: 89 e5 mov %esp,%ebp
110857: 83 ec 08 sub $0x8,%esp
if ( _POSIX_Threads_Initialize_user_threads_p )
11085a: a1 38 60 12 00 mov 0x126038,%eax
11085f: 85 c0 test %eax,%eax
110861: 74 05 je 110868 <_POSIX_Threads_Initialize_user_threads+0x14>
(*_POSIX_Threads_Initialize_user_threads_p)();
}
110863: c9 leave
* initialzation threads.
*/
void _POSIX_Threads_Initialize_user_threads( void )
{
if ( _POSIX_Threads_Initialize_user_threads_p )
(*_POSIX_Threads_Initialize_user_threads_p)();
110864: ff e0 jmp *%eax
110866: 66 90 xchg %ax,%ax
}
110868: c9 leave
110869: c3 ret
0010b9f4 <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
10b9f4: 55 push %ebp
10b9f5: 89 e5 mov %esp,%ebp
10b9f7: 57 push %edi
10b9f8: 56 push %esi
10b9f9: 53 push %ebx
10b9fa: 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;
10b9fd: 8b 3d 94 4d 12 00 mov 0x124d94,%edi
maximum = Configuration_POSIX_API.number_of_initialization_threads;
10ba03: a1 90 4d 12 00 mov 0x124d90,%eax
10ba08: 89 45 94 mov %eax,-0x6c(%ebp)
if ( !user_threads || maximum == 0 )
10ba0b: 85 ff test %edi,%edi
10ba0d: 74 44 je 10ba53 <_POSIX_Threads_Initialize_user_threads_body+0x5f><== NEVER TAKEN
10ba0f: 85 c0 test %eax,%eax
10ba11: 74 40 je 10ba53 <_POSIX_Threads_Initialize_user_threads_body+0x5f><== NEVER TAKEN
10ba13: 31 db xor %ebx,%ebx
10ba15: 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 );
10ba18: 83 ec 0c sub $0xc,%esp
10ba1b: 56 push %esi
10ba1c: e8 2f 61 00 00 call 111b50 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
10ba21: 5a pop %edx
10ba22: 59 pop %ecx
10ba23: 6a 02 push $0x2
10ba25: 56 push %esi
10ba26: e8 51 61 00 00 call 111b7c <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
10ba2b: 59 pop %ecx
10ba2c: 58 pop %eax
10ba2d: ff 74 df 04 pushl 0x4(%edi,%ebx,8)
10ba31: 56 push %esi
10ba32: e8 79 61 00 00 call 111bb0 <pthread_attr_setstacksize>
status = pthread_create(
10ba37: 6a 00 push $0x0
10ba39: ff 34 df pushl (%edi,%ebx,8)
10ba3c: 56 push %esi
10ba3d: 8d 45 e4 lea -0x1c(%ebp),%eax
10ba40: 50 push %eax
10ba41: e8 92 fc ff ff call 10b6d8 <pthread_create>
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
10ba46: 83 c4 20 add $0x20,%esp
10ba49: 85 c0 test %eax,%eax
10ba4b: 75 0e jne 10ba5b <_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++ ) {
10ba4d: 43 inc %ebx
10ba4e: 39 5d 94 cmp %ebx,-0x6c(%ebp)
10ba51: 77 c5 ja 10ba18 <_POSIX_Threads_Initialize_user_threads_body+0x24><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
10ba53: 8d 65 f4 lea -0xc(%ebp),%esp
10ba56: 5b pop %ebx
10ba57: 5e pop %esi
10ba58: 5f pop %edi
10ba59: c9 leave
10ba5a: c3 ret
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
10ba5b: 52 push %edx
10ba5c: 50 push %eax
10ba5d: 6a 01 push $0x1
10ba5f: 6a 02 push $0x2
10ba61: e8 c2 1e 00 00 call 10d928 <_Internal_error_Occurred>
00110a7c <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
110a7c: 55 push %ebp
110a7d: 89 e5 mov %esp,%ebp
110a7f: 56 push %esi
110a80: 53 push %ebx
110a81: 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 ];
110a84: 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 );
110a8a: 83 ec 0c sub $0xc,%esp
110a8d: 8d 83 98 00 00 00 lea 0x98(%ebx),%eax
110a93: 50 push %eax
110a94: e8 7f 0e 00 00 call 111918 <_Timespec_To_ticks>
the_thread->cpu_time_budget = ticks;
110a99: 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);
110a9c: 0f b6 05 74 3a 12 00 movzbl 0x123a74,%eax
110aa3: 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;
110aa9: 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 ) {
110aac: 83 c4 10 add $0x10,%esp
110aaf: 8b 4e 1c mov 0x1c(%esi),%ecx
110ab2: 85 c9 test %ecx,%ecx
110ab4: 75 05 jne 110abb <_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 ) {
110ab6: 39 46 14 cmp %eax,0x14(%esi)
110ab9: 77 35 ja 110af0 <_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 );
110abb: 83 ec 0c sub $0xc,%esp
110abe: 8d 83 90 00 00 00 lea 0x90(%ebx),%eax
110ac4: 50 push %eax
110ac5: e8 4e 0e 00 00 call 111918 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
110aca: 89 83 b4 00 00 00 mov %eax,0xb4(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
110ad0: 83 c4 10 add $0x10,%esp
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
110ad3: 81 c3 a8 00 00 00 add $0xa8,%ebx
110ad9: 89 5d 0c mov %ebx,0xc(%ebp)
110adc: c7 45 08 60 7e 12 00 movl $0x127e60,0x8(%ebp)
}
110ae3: 8d 65 f8 lea -0x8(%ebp),%esp
110ae6: 5b pop %ebx
110ae7: 5e pop %esi
110ae8: c9 leave
110ae9: e9 32 dc ff ff jmp 10e720 <_Watchdog_Insert>
110aee: 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 );
110af0: 52 push %edx
110af1: 6a 01 push $0x1
110af3: 50 push %eax
110af4: 56 push %esi
110af5: e8 7e ca ff ff call 10d578 <_Thread_Change_priority>
110afa: 83 c4 10 add $0x10,%esp
110afd: eb bc jmp 110abb <_POSIX_Threads_Sporadic_budget_TSR+0x3f>
00110b00 <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
110b00: 55 push %ebp
110b01: 89 e5 mov %esp,%ebp
110b03: 83 ec 08 sub $0x8,%esp
110b06: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
110b09: 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 */
110b0f: c7 40 78 ff ff ff ff movl $0xffffffff,0x78(%eax)
110b16: 0f b6 15 74 3a 12 00 movzbl 0x123a74,%edx
110b1d: 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;
110b23: 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 ) {
110b26: 8b 48 1c mov 0x1c(%eax),%ecx
110b29: 85 c9 test %ecx,%ecx
110b2b: 75 05 jne 110b32 <_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 ) {
110b2d: 39 50 14 cmp %edx,0x14(%eax)
110b30: 72 02 jb 110b34 <_POSIX_Threads_Sporadic_budget_callout+0x34><== ALWAYS TAKEN
#if 0
printk( "lower priority\n" );
#endif
}
}
}
110b32: c9 leave <== NOT EXECUTED
110b33: 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 );
110b34: 51 push %ecx
110b35: 6a 01 push $0x1
110b37: 52 push %edx
110b38: 50 push %eax
110b39: e8 3a ca ff ff call 10d578 <_Thread_Change_priority>
110b3e: 83 c4 10 add $0x10,%esp
#if 0
printk( "lower priority\n" );
#endif
}
}
}
110b41: c9 leave
110b42: c3 ret
00112aa8 <_POSIX_Threads_cancel_run>:
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
112aa8: 55 push %ebp
112aa9: 89 e5 mov %esp,%ebp
112aab: 57 push %edi
112aac: 56 push %esi
112aad: 53 push %ebx
112aae: 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 ];
112ab1: 8b 45 08 mov 0x8(%ebp),%eax
112ab4: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
112aba: c7 86 d8 00 00 00 01 movl $0x1,0xd8(%esi)
112ac1: 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 );
112ac4: 8d be e8 00 00 00 lea 0xe8(%esi),%edi
while ( !_Chain_Is_empty( handler_stack ) ) {
112aca: 39 be e4 00 00 00 cmp %edi,0xe4(%esi)
112ad0: 74 33 je 112b05 <_POSIX_Threads_cancel_run+0x5d>
112ad2: 66 90 xchg %ax,%ax
_ISR_Disable( level );
112ad4: 9c pushf
112ad5: fa cli
112ad6: 59 pop %ecx
handler = (POSIX_Cancel_Handler_control *)
112ad7: 8b 9e ec 00 00 00 mov 0xec(%esi),%ebx
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
112add: 8b 13 mov (%ebx),%edx
previous = the_node->previous;
112adf: 8b 43 04 mov 0x4(%ebx),%eax
next->previous = previous;
112ae2: 89 42 04 mov %eax,0x4(%edx)
previous->next = next;
112ae5: 89 10 mov %edx,(%eax)
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
112ae7: 51 push %ecx
112ae8: 9d popf
(*handler->routine)( handler->arg );
112ae9: 83 ec 0c sub $0xc,%esp
112aec: ff 73 0c pushl 0xc(%ebx)
112aef: ff 53 08 call *0x8(%ebx)
_Workspace_Free( handler );
112af2: 89 1c 24 mov %ebx,(%esp)
112af5: e8 aa be ff ff call 10e9a4 <_Workspace_Free>
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
112afa: 83 c4 10 add $0x10,%esp
112afd: 39 be e4 00 00 00 cmp %edi,0xe4(%esi)
112b03: 75 cf jne 112ad4 <_POSIX_Threads_cancel_run+0x2c><== NEVER TAKEN
(*handler->routine)( handler->arg );
_Workspace_Free( handler );
}
}
112b05: 8d 65 f4 lea -0xc(%ebp),%esp
112b08: 5b pop %ebx
112b09: 5e pop %esi
112b0a: 5f pop %edi
112b0b: c9 leave
112b0c: c3 ret
0011185c <_POSIX_Timer_Insert_helper>:
Watchdog_Interval ticks,
Objects_Id id,
Watchdog_Service_routine_entry TSR,
void *arg
)
{
11185c: 55 push %ebp
11185d: 89 e5 mov %esp,%ebp
11185f: 56 push %esi
111860: 53 push %ebx
111861: 8b 5d 08 mov 0x8(%ebp),%ebx
ISR_Level level;
(void) _Watchdog_Remove( timer );
111864: 83 ec 0c sub $0xc,%esp
111867: 53 push %ebx
111868: e8 03 db ff ff call 10f370 <_Watchdog_Remove>
_ISR_Disable( level );
11186d: 9c pushf
11186e: fa cli
11186f: 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 ) {
111870: 83 c4 10 add $0x10,%esp
111873: 8b 43 08 mov 0x8(%ebx),%eax
111876: 85 c0 test %eax,%eax
111878: 74 0e je 111888 <_POSIX_Timer_Insert_helper+0x2c>
_ISR_Enable( level );
11187a: 56 push %esi
11187b: 9d popf
return false;
11187c: 31 c0 xor %eax,%eax
*/
_Watchdog_Initialize( timer, TSR, id, arg );
_Watchdog_Insert_ticks( timer, ticks );
_ISR_Enable( level );
return true;
}
11187e: 8d 65 f8 lea -0x8(%ebp),%esp
111881: 5b pop %ebx
111882: 5e pop %esi
111883: c9 leave
111884: c3 ret
111885: 8d 76 00 lea 0x0(%esi),%esi
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
111888: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
the_watchdog->routine = routine;
11188f: 8b 45 14 mov 0x14(%ebp),%eax
111892: 89 43 1c mov %eax,0x1c(%ebx)
the_watchdog->id = id;
111895: 8b 45 10 mov 0x10(%ebp),%eax
111898: 89 43 20 mov %eax,0x20(%ebx)
the_watchdog->user_data = user_data;
11189b: 8b 45 18 mov 0x18(%ebp),%eax
11189e: 89 43 24 mov %eax,0x24(%ebx)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
1118a1: 8b 45 0c mov 0xc(%ebp),%eax
1118a4: 89 43 0c mov %eax,0xc(%ebx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
1118a7: 83 ec 08 sub $0x8,%esp
1118aa: 53 push %ebx
1118ab: 68 a0 a1 12 00 push $0x12a1a0
1118b0: e8 7b d9 ff ff call 10f230 <_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 );
1118b5: 56 push %esi
1118b6: 9d popf
return true;
1118b7: 83 c4 10 add $0x10,%esp
1118ba: b0 01 mov $0x1,%al
}
1118bc: 8d 65 f8 lea -0x8(%ebp),%esp
1118bf: 5b pop %ebx
1118c0: 5e pop %esi
1118c1: c9 leave
1118c2: c3 ret
0010b804 <_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)
{
10b804: 55 push %ebp
10b805: 89 e5 mov %esp,%ebp
10b807: 53 push %ebx
10b808: 83 ec 04 sub $0x4,%esp
10b80b: 8b 5d 0c mov 0xc(%ebp),%ebx
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
10b80e: ff 43 68 incl 0x68(%ebx)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
10b811: 8b 53 54 mov 0x54(%ebx),%edx
10b814: 85 d2 test %edx,%edx
10b816: 75 28 jne 10b840 <_POSIX_Timer_TSR+0x3c>
10b818: 8b 43 58 mov 0x58(%ebx),%eax
10b81b: 85 c0 test %eax,%eax
10b81d: 75 21 jne 10b840 <_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;
10b81f: c6 43 3c 04 movb $0x4,0x3c(%ebx)
/*
* 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 ) ) {
10b823: 83 ec 08 sub $0x8,%esp
10b826: ff 73 44 pushl 0x44(%ebx)
10b829: ff 73 38 pushl 0x38(%ebx)
10b82c: e8 bb 5b 00 00 call 1113ec <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
10b831: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
10b838: 83 c4 10 add $0x10,%esp
}
10b83b: 8b 5d fc mov -0x4(%ebp),%ebx
10b83e: c9 leave
10b83f: 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(
10b840: 83 ec 0c sub $0xc,%esp
10b843: 53 push %ebx
10b844: 68 04 b8 10 00 push $0x10b804
10b849: ff 73 08 pushl 0x8(%ebx)
10b84c: ff 73 64 pushl 0x64(%ebx)
10b84f: 8d 43 10 lea 0x10(%ebx),%eax
10b852: 50 push %eax
10b853: e8 04 60 00 00 call 11185c <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
10b858: 83 c4 20 add $0x20,%esp
10b85b: 84 c0 test %al,%al
10b85d: 74 dc je 10b83b <_POSIX_Timer_TSR+0x37> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
10b85f: 83 ec 0c sub $0xc,%esp
10b862: 8d 43 6c lea 0x6c(%ebx),%eax
10b865: 50 push %eax
10b866: e8 91 16 00 00 call 10cefc <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10b86b: c6 43 3c 03 movb $0x3,0x3c(%ebx)
10b86f: 83 c4 10 add $0x10,%esp
10b872: eb af jmp 10b823 <_POSIX_Timer_TSR+0x1f>
00112b94 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
112b94: 55 push %ebp
112b95: 89 e5 mov %esp,%ebp
112b97: 57 push %edi
112b98: 56 push %esi
112b99: 53 push %ebx
112b9a: 83 ec 78 sub $0x78,%esp
112b9d: 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,
112ba0: 6a 01 push $0x1
112ba2: 0f b6 45 10 movzbl 0x10(%ebp),%eax
112ba6: 50 push %eax
112ba7: 8d 55 dc lea -0x24(%ebp),%edx
112baa: 52 push %edx
112bab: 53 push %ebx
112bac: ff 75 08 pushl 0x8(%ebp)
112baf: 89 55 9c mov %edx,-0x64(%ebp)
112bb2: e8 b5 00 00 00 call 112c6c <_POSIX_signals_Clear_signals>
112bb7: 83 c4 20 add $0x20,%esp
112bba: 84 c0 test %al,%al
112bbc: 8b 55 9c mov -0x64(%ebp),%edx
112bbf: 0f 84 9b 00 00 00 je 112c60 <_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 )
112bc5: 8d 04 5b lea (%ebx,%ebx,2),%eax
112bc8: c1 e0 02 shl $0x2,%eax
112bcb: 8b 88 a8 83 12 00 mov 0x1283a8(%eax),%ecx
112bd1: 89 4d a4 mov %ecx,-0x5c(%ebp)
112bd4: 49 dec %ecx
112bd5: 0f 84 85 00 00 00 je 112c60 <_POSIX_signals_Check_signal+0xcc><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
112bdb: 8b 75 08 mov 0x8(%ebp),%esi
112bde: 8b b6 d0 00 00 00 mov 0xd0(%esi),%esi
112be4: 89 75 a0 mov %esi,-0x60(%ebp)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
112be7: 8b 88 a4 83 12 00 mov 0x1283a4(%eax),%ecx
112bed: 09 f1 or %esi,%ecx
112bef: 8b 75 08 mov 0x8(%ebp),%esi
112bf2: 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,
112bf8: 8d 75 b4 lea -0x4c(%ebp),%esi
112bfb: 89 75 94 mov %esi,-0x6c(%ebp)
112bfe: 8b 35 38 83 12 00 mov 0x128338,%esi
112c04: 83 c6 20 add $0x20,%esi
112c07: b9 0a 00 00 00 mov $0xa,%ecx
112c0c: 8b 7d 94 mov -0x6c(%ebp),%edi
112c0f: 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 ) {
112c11: 83 b8 a0 83 12 00 02 cmpl $0x2,0x1283a0(%eax)
112c18: 74 36 je 112c50 <_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 );
112c1a: 83 ec 0c sub $0xc,%esp
112c1d: 53 push %ebx
112c1e: ff 55 a4 call *-0x5c(%ebp)
break;
112c21: 83 c4 10 add $0x10,%esp
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
112c24: 8b 3d 38 83 12 00 mov 0x128338,%edi
112c2a: 83 c7 20 add $0x20,%edi
112c2d: b9 0a 00 00 00 mov $0xa,%ecx
112c32: 8b 75 94 mov -0x6c(%ebp),%esi
112c35: 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;
112c37: 8b 55 a0 mov -0x60(%ebp),%edx
112c3a: 8b 45 08 mov 0x8(%ebp),%eax
112c3d: 89 90 d0 00 00 00 mov %edx,0xd0(%eax)
return true;
112c43: b0 01 mov $0x1,%al
}
112c45: 8d 65 f4 lea -0xc(%ebp),%esp
112c48: 5b pop %ebx
112c49: 5e pop %esi
112c4a: 5f pop %edi
112c4b: c9 leave
112c4c: c3 ret
112c4d: 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)(
112c50: 50 push %eax
112c51: 6a 00 push $0x0
112c53: 52 push %edx
112c54: 53 push %ebx
112c55: ff 55 a4 call *-0x5c(%ebp)
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
112c58: 83 c4 10 add $0x10,%esp
112c5b: eb c7 jmp 112c24 <_POSIX_signals_Check_signal+0x90>
112c5d: 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;
112c60: 31 c0 xor %eax,%eax
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
}
112c62: 8d 65 f4 lea -0xc(%ebp),%esp
112c65: 5b pop %ebx
112c66: 5e pop %esi
112c67: 5f pop %edi
112c68: c9 leave
112c69: c3 ret
0011321c <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
11321c: 55 push %ebp
11321d: 89 e5 mov %esp,%ebp
11321f: 53 push %ebx
113220: 8b 4d 08 mov 0x8(%ebp),%ecx
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
113223: 9c pushf
113224: fa cli
113225: 5a pop %edx
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
113226: 8d 04 49 lea (%ecx,%ecx,2),%eax
113229: c1 e0 02 shl $0x2,%eax
11322c: 83 b8 a0 83 12 00 02 cmpl $0x2,0x1283a0(%eax)
113233: 74 13 je 113248 <_POSIX_signals_Clear_process_signals+0x2c>
113235: 49 dec %ecx
113236: 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;
11323b: d3 c0 rol %cl,%eax
11323d: 21 05 a8 85 12 00 and %eax,0x1285a8
}
_ISR_Enable( level );
113243: 52 push %edx
113244: 9d popf
}
113245: 5b pop %ebx
113246: c9 leave
113247: 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 );
113248: 8d 98 c4 85 12 00 lea 0x1285c4(%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 ] ) )
11324e: 39 98 c0 85 12 00 cmp %ebx,0x1285c0(%eax)
113254: 75 ed jne 113243 <_POSIX_signals_Clear_process_signals+0x27><== NEVER TAKEN
113256: eb dd jmp 113235 <_POSIX_signals_Clear_process_signals+0x19>
00112c6c <_POSIX_signals_Clear_signals>:
int signo,
siginfo_t *info,
bool is_global,
bool check_blocked
)
{
112c6c: 55 push %ebp
112c6d: 89 e5 mov %esp,%ebp
112c6f: 57 push %edi
112c70: 56 push %esi
112c71: 53 push %ebx
112c72: 83 ec 1c sub $0x1c,%esp
112c75: 8b 5d 0c mov 0xc(%ebp),%ebx
112c78: 0f b6 7d 14 movzbl 0x14(%ebp),%edi
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
112c7c: 8d 4b ff lea -0x1(%ebx),%ecx
112c7f: b8 01 00 00 00 mov $0x1,%eax
112c84: 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 )
112c86: 80 7d 18 00 cmpb $0x0,0x18(%ebp)
112c8a: 74 40 je 112ccc <_POSIX_signals_Clear_signals+0x60>
signals_blocked = ~api->signals_blocked;
112c8c: 8b 55 08 mov 0x8(%ebp),%edx
112c8f: 8b 8a d0 00 00 00 mov 0xd0(%edx),%ecx
112c95: 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 );
112c97: 9c pushf
112c98: fa cli
112c99: 8f 45 e4 popl -0x1c(%ebp)
if ( is_global ) {
112c9c: 89 fa mov %edi,%edx
112c9e: 84 d2 test %dl,%dl
112ca0: 74 32 je 112cd4 <_POSIX_signals_Clear_signals+0x68>
if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
112ca2: 23 05 a8 85 12 00 and 0x1285a8,%eax
112ca8: 85 c8 test %ecx,%eax
112caa: 74 54 je 112d00 <_POSIX_signals_Clear_signals+0x94>
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
112cac: 8d 14 5b lea (%ebx,%ebx,2),%edx
112caf: c1 e2 02 shl $0x2,%edx
112cb2: 83 ba a0 83 12 00 02 cmpl $0x2,0x1283a0(%edx)
112cb9: 74 49 je 112d04 <_POSIX_signals_Clear_signals+0x98>
&psiginfo->Node
);
} else
do_callout = false;
}
_POSIX_signals_Clear_process_signals( signo );
112cbb: 83 ec 0c sub $0xc,%esp
112cbe: 53 push %ebx
112cbf: e8 58 05 00 00 call 11321c <_POSIX_signals_Clear_process_signals>
112cc4: 83 c4 10 add $0x10,%esp
do_callout = true;
112cc7: b0 01 mov $0x1,%al
112cc9: eb 26 jmp 112cf1 <_POSIX_signals_Clear_signals+0x85>
112ccb: 90 nop
*/
if ( check_blocked )
signals_blocked = ~api->signals_blocked;
else
signals_blocked = SIGNAL_ALL_MASK;
112ccc: b9 ff ff ff ff mov $0xffffffff,%ecx
112cd1: eb c4 jmp 112c97 <_POSIX_signals_Clear_signals+0x2b>
112cd3: 90 nop
}
_POSIX_signals_Clear_process_signals( signo );
do_callout = true;
}
} else {
if ( mask & (api->signals_pending & signals_blocked) ) {
112cd4: 8b 55 08 mov 0x8(%ebp),%edx
112cd7: 8b 9a d4 00 00 00 mov 0xd4(%edx),%ebx
112cdd: 89 c6 mov %eax,%esi
112cdf: 21 de and %ebx,%esi
112ce1: 85 ce test %ecx,%esi
112ce3: 74 1b je 112d00 <_POSIX_signals_Clear_signals+0x94>
api->signals_pending &= ~mask;
112ce5: f7 d0 not %eax
112ce7: 21 d8 and %ebx,%eax
112ce9: 89 82 d4 00 00 00 mov %eax,0xd4(%edx)
do_callout = true;
112cef: b0 01 mov $0x1,%al
}
}
_ISR_Enable( level );
112cf1: ff 75 e4 pushl -0x1c(%ebp)
112cf4: 9d popf
return do_callout;
}
112cf5: 8d 65 f4 lea -0xc(%ebp),%esp
112cf8: 5b pop %ebx
112cf9: 5e pop %esi
112cfa: 5f pop %edi
112cfb: c9 leave
112cfc: c3 ret
112cfd: 8d 76 00 lea 0x0(%esi),%esi
bool do_callout;
POSIX_signals_Siginfo_node *psiginfo;
mask = signo_to_mask( signo );
do_callout = false;
112d00: 31 c0 xor %eax,%eax
112d02: eb ed jmp 112cf1 <_POSIX_signals_Clear_signals+0x85>
do_callout = true;
}
}
_ISR_Enable( level );
return do_callout;
}
112d04: 8d 8a c0 85 12 00 lea 0x1285c0(%edx),%ecx
112d0a: 8b 82 c0 85 12 00 mov 0x1285c0(%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 );
112d10: 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))
112d13: 39 f0 cmp %esi,%eax
112d15: 74 45 je 112d5c <_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;
112d17: 8b 30 mov (%eax),%esi
head->next = new_first;
112d19: 89 b2 c0 85 12 00 mov %esi,0x1285c0(%edx)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
112d1f: 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 );
112d22: 83 ec 0c sub $0xc,%esp
112d25: 53 push %ebx
112d26: 89 45 e0 mov %eax,-0x20(%ebp)
112d29: e8 ee 04 00 00 call 11321c <_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;
112d2e: 8b 45 e0 mov -0x20(%ebp),%eax
112d31: 8d 70 08 lea 0x8(%eax),%esi
112d34: b9 03 00 00 00 mov $0x3,%ecx
112d39: 8b 7d 10 mov 0x10(%ebp),%edi
112d3c: 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;
112d3e: 8b 15 28 85 12 00 mov 0x128528,%edx
the_node->next = tail;
112d44: c7 00 24 85 12 00 movl $0x128524,(%eax)
tail->previous = the_node;
112d4a: a3 28 85 12 00 mov %eax,0x128528
old_last->next = the_node;
112d4f: 89 02 mov %eax,(%edx)
the_node->previous = old_last;
112d51: 89 50 04 mov %edx,0x4(%eax)
112d54: 83 c4 10 add $0x10,%esp
112d57: e9 5f ff ff ff jmp 112cbb <_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 );
112d5c: 83 ec 0c sub $0xc,%esp
112d5f: 53 push %ebx
112d60: e8 b7 04 00 00 call 11321c <_POSIX_signals_Clear_process_signals>
112d65: 83 c4 10 add $0x10,%esp
112d68: e9 4e ff ff ff jmp 112cbb <_POSIX_signals_Clear_signals+0x4f>
0010c0dc <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
10c0dc: 55 push %ebp
10c0dd: 89 e5 mov %esp,%ebp
10c0df: 56 push %esi
10c0e0: 53 push %ebx
10c0e1: 8b 55 08 mov 0x8(%ebp),%edx
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10c0e4: b8 1b 00 00 00 mov $0x1b,%eax
10c0e9: 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(
10c0ee: 8d 48 ff lea -0x1(%eax),%ecx
10c0f1: 89 de mov %ebx,%esi
10c0f3: d3 e6 shl %cl,%esi
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
if ( set & signo_to_mask( signo ) ) {
10c0f5: 85 d6 test %edx,%esi
10c0f7: 75 20 jne 10c119 <_POSIX_signals_Get_lowest+0x3d><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
10c0f9: 40 inc %eax
10c0fa: 83 f8 20 cmp $0x20,%eax
10c0fd: 75 ef jne 10c0ee <_POSIX_signals_Get_lowest+0x12>
10c0ff: b0 01 mov $0x1,%al
10c101: bb 01 00 00 00 mov $0x1,%ebx
10c106: eb 06 jmp 10c10e <_POSIX_signals_Get_lowest+0x32>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
10c108: 40 inc %eax
10c109: 83 f8 1b cmp $0x1b,%eax
10c10c: 74 0b je 10c119 <_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(
10c10e: 8d 48 ff lea -0x1(%eax),%ecx
10c111: 89 de mov %ebx,%esi
10c113: 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 ) ) {
10c115: 85 d6 test %edx,%esi
10c117: 74 ef je 10c108 <_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;
}
10c119: 5b pop %ebx
10c11a: 5e pop %esi
10c11b: c9 leave
10c11c: c3 ret
00124c6c <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
124c6c: 55 push %ebp
124c6d: 89 e5 mov %esp,%ebp
124c6f: 57 push %edi
124c70: 56 push %esi
124c71: 53 push %ebx
124c72: 83 ec 0c sub $0xc,%esp
124c75: 8b 5d 08 mov 0x8(%ebp),%ebx
124c78: 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 ];
124c7b: 8b b3 ec 00 00 00 mov 0xec(%ebx),%esi
124c81: 8d 4a ff lea -0x1(%edx),%ecx
124c84: b8 01 00 00 00 mov $0x1,%eax
124c89: d3 e0 shl %cl,%eax
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
124c8b: 8b 4b 10 mov 0x10(%ebx),%ecx
124c8e: 89 cf mov %ecx,%edi
124c90: 81 e7 00 80 00 10 and $0x10008000,%edi
124c96: 81 ff 00 80 00 10 cmp $0x10008000,%edi
124c9c: 74 72 je 124d10 <_POSIX_signals_Unblock_thread+0xa4>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
124c9e: 8b 96 d0 00 00 00 mov 0xd0(%esi),%edx
124ca4: f7 d2 not %edx
124ca6: 85 d0 test %edx,%eax
124ca8: 74 5a je 124d04 <_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 ) ) {
124caa: f7 c1 00 00 00 10 test $0x10000000,%ecx
124cb0: 74 3a je 124cec <_POSIX_signals_Unblock_thread+0x80>
the_thread->Wait.return_code = EINTR;
124cb2: 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) )
124cb9: f7 c1 e0 be 03 00 test $0x3bee0,%ecx
124cbf: 0f 85 93 00 00 00 jne 124d58 <_POSIX_signals_Unblock_thread+0xec>
_Thread_queue_Extract_with_proxy( the_thread );
else if ( _States_Is_delaying(the_thread->current_state) ) {
124cc5: 83 e1 08 and $0x8,%ecx
124cc8: 74 3a je 124d04 <_POSIX_signals_Unblock_thread+0x98><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
124cca: 83 ec 0c sub $0xc,%esp
124ccd: 8d 43 48 lea 0x48(%ebx),%eax
124cd0: 50 push %eax
124cd1: e8 b2 ec fe ff call 113988 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
124cd6: 5a pop %edx
124cd7: 59 pop %ecx
124cd8: 68 f8 ff 03 10 push $0x1003fff8
124cdd: 53 push %ebx
124cde: e8 91 da fe ff call 112774 <_Thread_Clear_state>
124ce3: 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;
124ce6: 31 c0 xor %eax,%eax
124ce8: eb 1c jmp 124d06 <_POSIX_signals_Unblock_thread+0x9a>
124cea: 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 ) {
124cec: 85 c9 test %ecx,%ecx
124cee: 75 14 jne 124d04 <_POSIX_signals_Unblock_thread+0x98><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
124cf0: a1 b4 f0 12 00 mov 0x12f0b4,%eax
124cf5: 85 c0 test %eax,%eax
124cf7: 74 0b je 124d04 <_POSIX_signals_Unblock_thread+0x98>
124cf9: 3b 1d b8 f0 12 00 cmp 0x12f0b8,%ebx
124cff: 74 7b je 124d7c <_POSIX_signals_Unblock_thread+0x110><== ALWAYS TAKEN
124d01: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Dispatch_necessary = true;
}
}
return false;
124d04: 31 c0 xor %eax,%eax
}
124d06: 8d 65 f4 lea -0xc(%ebp),%esp
124d09: 5b pop %ebx
124d0a: 5e pop %esi
124d0b: 5f pop %edi
124d0c: c9 leave
124d0d: c3 ret
124d0e: 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) ) {
124d10: 85 43 30 test %eax,0x30(%ebx)
124d13: 74 33 je 124d48 <_POSIX_signals_Unblock_thread+0xdc>
the_thread->Wait.return_code = EINTR;
124d15: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx)
the_info = (siginfo_t *) the_thread->Wait.return_argument;
124d1c: 8b 43 28 mov 0x28(%ebx),%eax
if ( !info ) {
124d1f: 8b 75 10 mov 0x10(%ebp),%esi
124d22: 85 f6 test %esi,%esi
124d24: 74 42 je 124d68 <_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;
124d26: b9 03 00 00 00 mov $0x3,%ecx
124d2b: 89 c7 mov %eax,%edi
124d2d: 8b 75 10 mov 0x10(%ebp),%esi
124d30: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
}
_Thread_queue_Extract_with_proxy( the_thread );
124d32: 83 ec 0c sub $0xc,%esp
124d35: 53 push %ebx
124d36: e8 51 e4 fe ff call 11318c <_Thread_queue_Extract_with_proxy>
return true;
124d3b: 83 c4 10 add $0x10,%esp
124d3e: b0 01 mov $0x1,%al
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
124d40: 8d 65 f4 lea -0xc(%ebp),%esp
124d43: 5b pop %ebx
124d44: 5e pop %esi
124d45: 5f pop %edi
124d46: c9 leave
124d47: 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) ) {
124d48: 8b 8e d0 00 00 00 mov 0xd0(%esi),%ecx
124d4e: f7 d1 not %ecx
124d50: 85 c8 test %ecx,%eax
124d52: 75 c1 jne 124d15 <_POSIX_signals_Unblock_thread+0xa9>
124d54: eb ae jmp 124d04 <_POSIX_signals_Unblock_thread+0x98>
124d56: 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 );
124d58: 83 ec 0c sub $0xc,%esp
124d5b: 53 push %ebx
124d5c: e8 2b e4 fe ff call 11318c <_Thread_queue_Extract_with_proxy>
124d61: 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;
124d64: 31 c0 xor %eax,%eax
124d66: eb 9e jmp 124d06 <_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;
124d68: 89 10 mov %edx,(%eax)
the_info->si_code = SI_USER;
124d6a: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax)
the_info->si_value.sival_int = 0;
124d71: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
124d78: eb b8 jmp 124d32 <_POSIX_signals_Unblock_thread+0xc6>
124d7a: 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;
124d7c: c6 05 c4 f0 12 00 01 movb $0x1,0x12f0c4
}
}
return false;
124d83: 31 c0 xor %eax,%eax
124d85: e9 7c ff ff ff jmp 124d06 <_POSIX_signals_Unblock_thread+0x9a>
0010d848 <_Protected_heap_Get_information>:
bool _Protected_heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
10d848: 55 push %ebp
10d849: 89 e5 mov %esp,%ebp
10d84b: 56 push %esi
10d84c: 53 push %ebx
10d84d: 8b 5d 08 mov 0x8(%ebp),%ebx
10d850: 8b 75 0c mov 0xc(%ebp),%esi
if ( !the_heap )
10d853: 85 db test %ebx,%ebx
10d855: 74 35 je 10d88c <_Protected_heap_Get_information+0x44>
return false;
if ( !the_info )
10d857: 85 f6 test %esi,%esi
10d859: 74 31 je 10d88c <_Protected_heap_Get_information+0x44>
return false;
_RTEMS_Lock_allocator();
10d85b: 83 ec 0c sub $0xc,%esp
10d85e: ff 35 40 88 12 00 pushl 0x128840
10d864: e8 e7 ed ff ff call 10c650 <_API_Mutex_Lock>
_Heap_Get_information( the_heap, the_info );
10d869: 5a pop %edx
10d86a: 59 pop %ecx
10d86b: 56 push %esi
10d86c: 53 push %ebx
10d86d: e8 d2 47 00 00 call 112044 <_Heap_Get_information>
_RTEMS_Unlock_allocator();
10d872: 58 pop %eax
10d873: ff 35 40 88 12 00 pushl 0x128840
10d879: e8 1a ee ff ff call 10c698 <_API_Mutex_Unlock>
return true;
10d87e: 83 c4 10 add $0x10,%esp
10d881: b0 01 mov $0x1,%al
}
10d883: 8d 65 f8 lea -0x8(%ebp),%esp
10d886: 5b pop %ebx
10d887: 5e pop %esi
10d888: c9 leave
10d889: c3 ret
10d88a: 66 90 xchg %ax,%ax
{
if ( !the_heap )
return false;
if ( !the_info )
return false;
10d88c: 31 c0 xor %eax,%eax
_RTEMS_Lock_allocator();
_Heap_Get_information( the_heap, the_info );
_RTEMS_Unlock_allocator();
return true;
}
10d88e: 8d 65 f8 lea -0x8(%ebp),%esp
10d891: 5b pop %ebx
10d892: 5e pop %esi
10d893: c9 leave
10d894: c3 ret
00110c04 <_Protected_heap_Walk>:
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
110c04: 55 push %ebp
110c05: 89 e5 mov %esp,%ebp
110c07: 56 push %esi
110c08: 53 push %ebx
110c09: 83 ec 10 sub $0x10,%esp
110c0c: 8b 5d 08 mov 0x8(%ebp),%ebx
110c0f: 8b 75 0c mov 0xc(%ebp),%esi
110c12: 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 ) {
110c15: 8b 15 d0 f2 12 00 mov 0x12f2d0,%edx
110c1b: 85 d2 test %edx,%edx
110c1d: 74 19 je 110c38 <_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 );
110c1f: 0f b6 c0 movzbl %al,%eax
110c22: 89 45 10 mov %eax,0x10(%ebp)
110c25: 89 75 0c mov %esi,0xc(%ebp)
110c28: 89 5d 08 mov %ebx,0x8(%ebp)
}
return status;
}
110c2b: 8d 65 f8 lea -0x8(%ebp),%esp
110c2e: 5b pop %ebx
110c2f: 5e pop %esi
110c30: 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 );
110c31: e9 32 f2 ff ff jmp 10fe68 <_Heap_Walk>
110c36: 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();
110c38: 83 ec 0c sub $0xc,%esp
110c3b: ff 35 80 f3 12 00 pushl 0x12f380
110c41: 88 45 f4 mov %al,-0xc(%ebp)
110c44: e8 bf e3 ff ff call 10f008 <_API_Mutex_Lock>
status = _Heap_Walk( the_heap, source, do_dump );
110c49: 83 c4 0c add $0xc,%esp
110c4c: 8a 45 f4 mov -0xc(%ebp),%al
110c4f: 0f b6 c0 movzbl %al,%eax
110c52: 50 push %eax
110c53: 56 push %esi
110c54: 53 push %ebx
110c55: e8 0e f2 ff ff call 10fe68 <_Heap_Walk>
_RTEMS_Unlock_allocator();
110c5a: 5a pop %edx
110c5b: ff 35 80 f3 12 00 pushl 0x12f380
110c61: 88 45 f4 mov %al,-0xc(%ebp)
110c64: e8 e7 e3 ff ff call 10f050 <_API_Mutex_Unlock>
110c69: 83 c4 10 add $0x10,%esp
} else {
status = _Heap_Walk( the_heap, source, do_dump );
}
return status;
}
110c6c: 8a 45 f4 mov -0xc(%ebp),%al
110c6f: 8d 65 f8 lea -0x8(%ebp),%esp
110c72: 5b pop %ebx
110c73: 5e pop %esi
110c74: c9 leave
110c75: c3 ret
00110e94 <_RTEMS_tasks_Create_extension>:
bool _RTEMS_tasks_Create_extension(
Thread_Control *executing,
Thread_Control *created
)
{
110e94: 55 push %ebp
110e95: 89 e5 mov %esp,%ebp
110e97: 53 push %ebx
110e98: 83 ec 10 sub $0x10,%esp
110e9b: 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 );
110e9e: 80 3d 44 3a 12 00 01 cmpb $0x1,0x123a44
110ea5: 19 c0 sbb %eax,%eax
110ea7: 83 e0 c0 and $0xffffffc0,%eax
110eaa: 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 );
110ead: 50 push %eax
110eae: e8 d5 da ff ff call 10e988 <_Workspace_Allocate>
if ( !api )
110eb3: 83 c4 10 add $0x10,%esp
110eb6: 85 c0 test %eax,%eax
110eb8: 74 6a je 110f24 <_RTEMS_tasks_Create_extension+0x90>
return false;
created->API_Extensions[ THREAD_API_RTEMS ] = api;
110eba: 89 83 e8 00 00 00 mov %eax,0xe8(%ebx)
api->pending_events = EVENT_SETS_NONE_PENDING;
110ec0: c7 00 00 00 00 00 movl $0x0,(%eax)
api->event_condition = 0;
110ec6: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
*/
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
ASR_Information *information
)
{
information->is_enabled = false;
110ecd: c6 40 08 00 movb $0x0,0x8(%eax)
information->handler = NULL;
110ed1: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
information->mode_set = RTEMS_DEFAULT_MODES;
110ed8: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax)
information->signals_posted = 0;
110edf: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax)
information->signals_pending = 0;
110ee6: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
information->nest_level = 0;
110eed: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax)
_ASR_Initialize( &api->Signal );
created->task_variables = NULL;
110ef4: c7 83 f4 00 00 00 00 movl $0x0,0xf4(%ebx)
110efb: 00 00 00
if ( rtems_configuration_get_notepads_enabled() ) {
110efe: 80 3d 44 3a 12 00 00 cmpb $0x0,0x123a44
110f05: 74 13 je 110f1a <_RTEMS_tasks_Create_extension+0x86>
110f07: 31 d2 xor %edx,%edx
110f09: 8d 76 00 lea 0x0(%esi),%esi
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
110f0c: c7 44 90 20 00 00 00 movl $0x0,0x20(%eax,%edx,4)
110f13: 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++)
110f14: 42 inc %edx
110f15: 83 fa 10 cmp $0x10,%edx
110f18: 75 f2 jne 110f0c <_RTEMS_tasks_Create_extension+0x78>
api->Notepads[i] = 0;
}
return true;
110f1a: b0 01 mov $0x1,%al
}
110f1c: 8b 5d fc mov -0x4(%ebp),%ebx
110f1f: c9 leave
110f20: c3 ret
110f21: 8d 76 00 lea 0x0(%esi),%esi
to_allocate -= (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t));
api = _Workspace_Allocate( to_allocate );
if ( !api )
return false;
110f24: 31 c0 xor %eax,%eax
for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
api->Notepads[i] = 0;
}
return true;
}
110f26: 8b 5d fc mov -0x4(%ebp),%ebx
110f29: c9 leave
110f2a: c3 ret
00110e3c <_RTEMS_tasks_Delete_extension>:
void _RTEMS_tasks_Delete_extension(
Thread_Control *executing,
Thread_Control *deleted
)
{
110e3c: 55 push %ebp
110e3d: 89 e5 mov %esp,%ebp
110e3f: 56 push %esi
110e40: 53 push %ebx
110e41: 8b 75 0c mov 0xc(%ebp),%esi
/*
* Free per task variable memory
*/
tvp = deleted->task_variables;
110e44: 8b 86 f4 00 00 00 mov 0xf4(%esi),%eax
deleted->task_variables = NULL;
110e4a: c7 86 f4 00 00 00 00 movl $0x0,0xf4(%esi)
110e51: 00 00 00
while (tvp) {
110e54: 85 c0 test %eax,%eax
110e56: 75 06 jne 110e5e <_RTEMS_tasks_Delete_extension+0x22>
110e58: eb 17 jmp 110e71 <_RTEMS_tasks_Delete_extension+0x35>
110e5a: 66 90 xchg %ax,%ax
next = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
tvp = next;
110e5c: 89 d8 mov %ebx,%eax
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = (rtems_task_variable_t *)tvp->next;
110e5e: 8b 18 mov (%eax),%ebx
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
110e60: 83 ec 08 sub $0x8,%esp
110e63: 50 push %eax
110e64: 56 push %esi
110e65: e8 56 01 00 00 call 110fc0 <_RTEMS_Tasks_Invoke_task_variable_dtor>
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
110e6a: 83 c4 10 add $0x10,%esp
110e6d: 85 db test %ebx,%ebx
110e6f: 75 eb jne 110e5c <_RTEMS_tasks_Delete_extension+0x20>
/*
* Free API specific memory
*/
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
110e71: 83 ec 0c sub $0xc,%esp
110e74: ff b6 e8 00 00 00 pushl 0xe8(%esi)
110e7a: e8 25 db ff ff call 10e9a4 <_Workspace_Free>
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
110e7f: c7 86 e8 00 00 00 00 movl $0x0,0xe8(%esi)
110e86: 00 00 00
110e89: 83 c4 10 add $0x10,%esp
}
110e8c: 8d 65 f8 lea -0x8(%ebp),%esp
110e8f: 5b pop %ebx
110e90: 5e pop %esi
110e91: c9 leave
110e92: c3 ret
00110dc0 <_RTEMS_tasks_Initialize_user_tasks>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks( void )
{
110dc0: 55 push %ebp
110dc1: 89 e5 mov %esp,%ebp
110dc3: 83 ec 08 sub $0x8,%esp
if ( _RTEMS_tasks_Initialize_user_tasks_p )
110dc6: a1 c0 3a 12 00 mov 0x123ac0,%eax
110dcb: 85 c0 test %eax,%eax
110dcd: 74 05 je 110dd4 <_RTEMS_tasks_Initialize_user_tasks+0x14>
(*_RTEMS_tasks_Initialize_user_tasks_p)();
}
110dcf: c9 leave
*/
void _RTEMS_tasks_Initialize_user_tasks( void )
{
if ( _RTEMS_tasks_Initialize_user_tasks_p )
(*_RTEMS_tasks_Initialize_user_tasks_p)();
110dd0: ff e0 jmp *%eax
110dd2: 66 90 xchg %ax,%ax
}
110dd4: c9 leave
110dd5: 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 3a 12 00 mov 0x123a6c,%ebx
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
10ba8f: 8b 3d 68 3a 12 00 mov 0x123a68,%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 02 0e 00 00 call 10c8f4 <_Internal_error_Occurred>
00110d78 <_RTEMS_tasks_Switch_extension>:
void _RTEMS_tasks_Switch_extension(
Thread_Control *executing,
Thread_Control *heir
)
{
110d78: 55 push %ebp
110d79: 89 e5 mov %esp,%ebp
/*
* Per Task Variables
*/
tvp = executing->task_variables;
110d7b: 8b 45 08 mov 0x8(%ebp),%eax
110d7e: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
110d84: 85 c0 test %eax,%eax
110d86: 74 13 je 110d9b <_RTEMS_tasks_Switch_extension+0x23>
tvp->tval = *tvp->ptr;
110d88: 8b 50 04 mov 0x4(%eax),%edx
110d8b: 8b 0a mov (%edx),%ecx
110d8d: 89 48 0c mov %ecx,0xc(%eax)
*tvp->ptr = tvp->gval;
110d90: 8b 48 08 mov 0x8(%eax),%ecx
110d93: 89 0a mov %ecx,(%edx)
tvp = (rtems_task_variable_t *)tvp->next;
110d95: 8b 00 mov (%eax),%eax
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
110d97: 85 c0 test %eax,%eax
110d99: 75 ed jne 110d88 <_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;
110d9b: 8b 45 0c mov 0xc(%ebp),%eax
110d9e: 8b 80 f4 00 00 00 mov 0xf4(%eax),%eax
while (tvp) {
110da4: 85 c0 test %eax,%eax
110da6: 74 13 je 110dbb <_RTEMS_tasks_Switch_extension+0x43>
tvp->gval = *tvp->ptr;
110da8: 8b 50 04 mov 0x4(%eax),%edx
110dab: 8b 0a mov (%edx),%ecx
110dad: 89 48 08 mov %ecx,0x8(%eax)
*tvp->ptr = tvp->tval;
110db0: 8b 48 0c mov 0xc(%eax),%ecx
110db3: 89 0a mov %ecx,(%edx)
tvp = (rtems_task_variable_t *)tvp->next;
110db5: 8b 00 mov (%eax),%eax
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
110db7: 85 c0 test %eax,%eax
110db9: 75 ed jne 110da8 <_RTEMS_tasks_Switch_extension+0x30><== NEVER TAKEN
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
}
}
110dbb: c9 leave
110dbc: c3 ret
0010c4f0 <_Rate_monotonic_Initiate_statistics>:
}
void _Rate_monotonic_Initiate_statistics(
Rate_monotonic_Control *the_period
)
{
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 28 sub $0x28,%esp
10c4f9: 8b 5d 08 mov 0x8(%ebp),%ebx
Thread_Control *owning_thread = the_period->owner;
10c4fc: 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 );
10c4ff: 8d 7d e0 lea -0x20(%ebp),%edi
10c502: 57 push %edi
10c503: e8 98 18 00 00 call 10dda0 <_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;
10c508: 8b 45 e0 mov -0x20(%ebp),%eax
10c50b: 8b 55 e4 mov -0x1c(%ebp),%edx
10c50e: 89 43 4c mov %eax,0x4c(%ebx)
10c511: 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;
10c514: 8b 86 84 00 00 00 mov 0x84(%esi),%eax
10c51a: 8b 96 88 00 00 00 mov 0x88(%esi),%edx
10c520: 89 43 44 mov %eax,0x44(%ebx)
10c523: 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) {
10c526: 83 c4 10 add $0x10,%esp
10c529: 39 35 f8 b6 12 00 cmp %esi,0x12b6f8
10c52f: 74 0b je 10c53c <_Rate_monotonic_Initiate_statistics+0x4c>
);
_Timespec_Add_to( &the_period->cpu_usage_period_initiated, &ran );
}
#endif
}
10c531: 8d 65 f4 lea -0xc(%ebp),%esp
10c534: 5b pop %ebx
10c535: 5e pop %esi
10c536: 5f pop %edi
10c537: c9 leave
10c538: c3 ret
10c539: 8d 76 00 lea 0x0(%esi),%esi
/*
* Adjust the CPU time used to account for the time since last
* context switch.
*/
_Timespec_Subtract(
10c53c: 50 push %eax
&_Thread_Time_of_last_context_switch, &uptime, &ran
10c53d: 8d 75 d8 lea -0x28(%ebp),%esi
/*
* Adjust the CPU time used to account for the time since last
* context switch.
*/
_Timespec_Subtract(
10c540: 56 push %esi
10c541: 57 push %edi
10c542: 68 0c b2 12 00 push $0x12b20c
10c547: e8 f0 39 00 00 call 10ff3c <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch, &uptime, &ran
);
_Timespec_Add_to( &the_period->cpu_usage_period_initiated, &ran );
10c54c: 59 pop %ecx
10c54d: 5f pop %edi
10c54e: 56 push %esi
10c54f: 83 c3 44 add $0x44,%ebx
10c552: 53 push %ebx
10c553: e8 e8 38 00 00 call 10fe40 <_Timespec_Add_to>
10c558: 83 c4 10 add $0x10,%esp
}
#endif
}
10c55b: 8d 65 f4 lea -0xc(%ebp),%esp
10c55e: 5b pop %ebx
10c55f: 5e pop %esi
10c560: 5f pop %edi
10c561: c9 leave
10c562: c3 ret
0010caac <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
10caac: 55 push %ebp
10caad: 89 e5 mov %esp,%ebp
10caaf: 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 );
10cab2: 8d 45 f4 lea -0xc(%ebp),%eax
10cab5: 50 push %eax
10cab6: ff 75 08 pushl 0x8(%ebp)
10cab9: 68 60 b0 12 00 push $0x12b060
10cabe: e8 71 1d 00 00 call 10e834 <_Objects_Get>
switch ( location ) {
10cac3: 83 c4 10 add $0x10,%esp
10cac6: 8b 55 f4 mov -0xc(%ebp),%edx
10cac9: 85 d2 test %edx,%edx
10cacb: 75 29 jne 10caf6 <_Rate_monotonic_Timeout+0x4a><== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
10cacd: 8b 50 40 mov 0x40(%eax),%edx
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
10cad0: f6 42 11 40 testb $0x40,0x11(%edx)
10cad4: 74 08 je 10cade <_Rate_monotonic_Timeout+0x32>
10cad6: 8b 48 08 mov 0x8(%eax),%ecx
10cad9: 39 4a 20 cmp %ecx,0x20(%edx)
10cadc: 74 4e je 10cb2c <_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 ) {
10cade: 83 78 38 01 cmpl $0x1,0x38(%eax)
10cae2: 74 14 je 10caf8 <_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;
10cae4: 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;
10caeb: a1 50 b1 12 00 mov 0x12b150,%eax
10caf0: 48 dec %eax
10caf1: a3 50 b1 12 00 mov %eax,0x12b150
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
10caf6: c9 leave
10caf7: 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;
10caf8: c7 40 38 03 00 00 00 movl $0x3,0x38(%eax)
_Rate_monotonic_Initiate_statistics( the_period );
10caff: 83 ec 0c sub $0xc,%esp
10cb02: 50 push %eax
10cb03: 89 45 e4 mov %eax,-0x1c(%ebp)
10cb06: e8 e5 f9 ff ff call 10c4f0 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10cb0b: 8b 45 e4 mov -0x1c(%ebp),%eax
10cb0e: 8b 50 3c mov 0x3c(%eax),%edx
10cb11: 89 50 1c mov %edx,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10cb14: 5a pop %edx
10cb15: 59 pop %ecx
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
10cb16: 83 c0 10 add $0x10,%eax
10cb19: 50 push %eax
10cb1a: 68 20 b2 12 00 push $0x12b220
10cb1f: e8 f8 36 00 00 call 11021c <_Watchdog_Insert>
10cb24: 83 c4 10 add $0x10,%esp
10cb27: eb c2 jmp 10caeb <_Rate_monotonic_Timeout+0x3f>
10cb29: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10cb2c: 83 ec 08 sub $0x8,%esp
10cb2f: 68 f8 ff 03 10 push $0x1003fff8
10cb34: 52 push %edx
10cb35: 89 45 e4 mov %eax,-0x1c(%ebp)
10cb38: e8 0b 25 00 00 call 10f048 <_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 );
10cb3d: 8b 45 e4 mov -0x1c(%ebp),%eax
10cb40: 89 04 24 mov %eax,(%esp)
10cb43: eb c1 jmp 10cb06 <_Rate_monotonic_Timeout+0x5a>
0010c564 <_Rate_monotonic_Update_statistics>:
void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
10c564: 55 push %ebp
10c565: 89 e5 mov %esp,%ebp
10c567: 57 push %edi
10c568: 56 push %esi
10c569: 53 push %ebx
10c56a: 83 ec 1c sub $0x1c,%esp
10c56d: 8b 5d 08 mov 0x8(%ebp),%ebx
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
10c570: ff 43 54 incl 0x54(%ebx)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
10c573: 83 7b 38 04 cmpl $0x4,0x38(%ebx)
10c577: 0f 84 bf 00 00 00 je 10c63c <_Rate_monotonic_Update_statistics+0xd8>
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c57d: 51 push %ecx
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
10c57e: 8d 7d e0 lea -0x20(%ebp),%edi
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c581: 57 push %edi
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
10c582: 8d 75 d8 lea -0x28(%ebp),%esi
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
10c585: 56 push %esi
10c586: 53 push %ebx
10c587: e8 cc fe ff ff call 10c458 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
10c58c: 83 c4 10 add $0x10,%esp
10c58f: 84 c0 test %al,%al
10c591: 75 09 jne 10c59c <_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
}
10c593: 8d 65 f4 lea -0xc(%ebp),%esp
10c596: 5b pop %ebx
10c597: 5e pop %esi
10c598: 5f pop %edi
10c599: c9 leave
10c59a: c3 ret
10c59b: 90 nop
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
10c59c: 83 ec 08 sub $0x8,%esp
10c59f: 57 push %edi
10c5a0: 8d 43 6c lea 0x6c(%ebx),%eax
10c5a3: 50 push %eax
10c5a4: e8 97 38 00 00 call 10fe40 <_Timespec_Add_to>
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
10c5a9: 58 pop %eax
10c5aa: 5a pop %edx
10c5ab: 8d 43 5c lea 0x5c(%ebx),%eax
10c5ae: 50 push %eax
10c5af: 57 push %edi
10c5b0: e8 63 39 00 00 call 10ff18 <_Timespec_Less_than>
10c5b5: 83 c4 10 add $0x10,%esp
10c5b8: 84 c0 test %al,%al
10c5ba: 74 0c je 10c5c8 <_Rate_monotonic_Update_statistics+0x64>
stats->min_cpu_time = executed;
10c5bc: 8b 45 e0 mov -0x20(%ebp),%eax
10c5bf: 8b 55 e4 mov -0x1c(%ebp),%edx
10c5c2: 89 43 5c mov %eax,0x5c(%ebx)
10c5c5: 89 53 60 mov %edx,0x60(%ebx)
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
10c5c8: 83 ec 08 sub $0x8,%esp
10c5cb: 8d 43 64 lea 0x64(%ebx),%eax
10c5ce: 50 push %eax
10c5cf: 57 push %edi
10c5d0: e8 1f 39 00 00 call 10fef4 <_Timespec_Greater_than>
10c5d5: 83 c4 10 add $0x10,%esp
10c5d8: 84 c0 test %al,%al
10c5da: 74 0c je 10c5e8 <_Rate_monotonic_Update_statistics+0x84>
stats->max_cpu_time = executed;
10c5dc: 8b 45 e0 mov -0x20(%ebp),%eax
10c5df: 8b 55 e4 mov -0x1c(%ebp),%edx
10c5e2: 89 43 64 mov %eax,0x64(%ebx)
10c5e5: 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 );
10c5e8: 83 ec 08 sub $0x8,%esp
10c5eb: 56 push %esi
10c5ec: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10c5f2: 50 push %eax
10c5f3: e8 48 38 00 00 call 10fe40 <_Timespec_Add_to>
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
10c5f8: 5a pop %edx
10c5f9: 59 pop %ecx
10c5fa: 8d 43 74 lea 0x74(%ebx),%eax
10c5fd: 50 push %eax
10c5fe: 56 push %esi
10c5ff: e8 14 39 00 00 call 10ff18 <_Timespec_Less_than>
10c604: 83 c4 10 add $0x10,%esp
10c607: 84 c0 test %al,%al
10c609: 75 39 jne 10c644 <_Rate_monotonic_Update_statistics+0xe0>
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
10c60b: 83 ec 08 sub $0x8,%esp
10c60e: 8d 43 7c lea 0x7c(%ebx),%eax
10c611: 50 push %eax
10c612: 56 push %esi
10c613: e8 dc 38 00 00 call 10fef4 <_Timespec_Greater_than>
10c618: 83 c4 10 add $0x10,%esp
10c61b: 84 c0 test %al,%al
10c61d: 0f 84 70 ff ff ff je 10c593 <_Rate_monotonic_Update_statistics+0x2f>
stats->max_wall_time = since_last_period;
10c623: 8b 45 d8 mov -0x28(%ebp),%eax
10c626: 8b 55 dc mov -0x24(%ebp),%edx
10c629: 89 43 7c mov %eax,0x7c(%ebx)
10c62c: 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
}
10c632: 8d 65 f4 lea -0xc(%ebp),%esp
10c635: 5b pop %ebx
10c636: 5e pop %esi
10c637: 5f pop %edi
10c638: c9 leave
10c639: c3 ret
10c63a: 66 90 xchg %ax,%ax
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
stats->missed_count++;
10c63c: ff 43 58 incl 0x58(%ebx)
10c63f: e9 39 ff ff ff jmp 10c57d <_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;
10c644: 8b 45 d8 mov -0x28(%ebp),%eax
10c647: 8b 55 dc mov -0x24(%ebp),%edx
10c64a: 89 43 74 mov %eax,0x74(%ebx)
10c64d: 89 53 78 mov %edx,0x78(%ebx)
10c650: eb b9 jmp 10c60b <_Rate_monotonic_Update_statistics+0xa7>
0010d18c <_Scheduler_priority_Block>:
#include <rtems/score/thread.h>
void _Scheduler_priority_Block(
Thread_Control *the_thread
)
{
10d18c: 55 push %ebp
10d18d: 89 e5 mov %esp,%ebp
10d18f: 53 push %ebx
10d190: 8b 45 08 mov 0x8(%ebp),%eax
)
{
Scheduler_priority_Per_thread *sched_info;
Chain_Control *ready;
sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info;
10d193: 8b 88 8c 00 00 00 mov 0x8c(%eax),%ecx
ready = sched_info->ready_chain;
10d199: 8b 11 mov (%ecx),%edx
if ( _Chain_Has_only_one_node( ready ) ) {
10d19b: 8b 5a 08 mov 0x8(%edx),%ebx
10d19e: 39 1a cmp %ebx,(%edx)
10d1a0: 74 6e je 10d210 <_Scheduler_priority_Block+0x84>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10d1a2: 8b 08 mov (%eax),%ecx
previous = the_node->previous;
10d1a4: 8b 50 04 mov 0x4(%eax),%edx
next->previous = previous;
10d1a7: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
10d1aa: 89 0a mov %ecx,(%edx)
_Scheduler_priority_Ready_queue_extract( the_thread );
/* TODO: flash critical section? */
if ( _Thread_Is_heir( the_thread ) )
10d1ac: 3b 05 3c 83 12 00 cmp 0x12833c,%eax
10d1b2: 74 18 je 10d1cc <_Scheduler_priority_Block+0x40>
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
10d1b4: 3b 05 38 83 12 00 cmp 0x128338,%eax
10d1ba: 74 04 je 10d1c0 <_Scheduler_priority_Block+0x34>
_Thread_Dispatch_necessary = true;
}
10d1bc: 5b pop %ebx
10d1bd: c9 leave
10d1be: c3 ret
10d1bf: 90 nop
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body();
if ( _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
10d1c0: c6 05 44 83 12 00 01 movb $0x1,0x128344
}
10d1c7: 5b pop %ebx
10d1c8: c9 leave
10d1c9: c3 ret
10d1ca: 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 );
10d1cc: 66 8b 1d 60 83 12 00 mov 0x128360,%bx
10d1d3: 31 d2 xor %edx,%edx
10d1d5: 89 d1 mov %edx,%ecx
10d1d7: 66 0f bc cb bsf %bx,%cx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
10d1db: 0f b7 c9 movzwl %cx,%ecx
10d1de: 66 8b 9c 09 80 83 12 mov 0x128380(%ecx,%ecx,1),%bx
10d1e5: 00
10d1e6: 66 0f bc d3 bsf %bx,%dx
return (_Priority_Bits_index( major ) << 4) +
10d1ea: c1 e1 04 shl $0x4,%ecx
10d1ed: 0f b7 d2 movzwl %dx,%edx
10d1f0: 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 ] ) )
10d1f3: 8d 14 52 lea (%edx,%edx,2),%edx
10d1f6: c1 e2 02 shl $0x2,%edx
10d1f9: 03 15 80 39 12 00 add 0x123980,%edx
10d1ff: 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 );
10d201: 83 c2 04 add $0x4,%edx
10d204: 39 d1 cmp %edx,%ecx
10d206: 74 44 je 10d24c <_Scheduler_priority_Block+0xc0><== NEVER TAKEN
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d208: 89 0d 3c 83 12 00 mov %ecx,0x12833c
10d20e: eb a4 jmp 10d1b4 <_Scheduler_priority_Block+0x28>
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 );
10d210: 8d 5a 04 lea 0x4(%edx),%ebx
10d213: 89 1a mov %ebx,(%edx)
head->next = tail;
head->previous = NULL;
10d215: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx)
tail->previous = head;
10d21c: 89 52 08 mov %edx,0x8(%edx)
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
10d21f: 8b 59 04 mov 0x4(%ecx),%ebx
10d222: 66 8b 13 mov (%ebx),%dx
10d225: 66 23 51 0e and 0xe(%ecx),%dx
10d229: 66 89 13 mov %dx,(%ebx)
if ( *the_priority_map->minor == 0 )
10d22c: 66 85 d2 test %dx,%dx
10d22f: 0f 85 77 ff ff ff jne 10d1ac <_Scheduler_priority_Block+0x20>
_Priority_Major_bit_map &= the_priority_map->block_major;
10d235: 66 8b 15 60 83 12 00 mov 0x128360,%dx
10d23c: 23 51 0c and 0xc(%ecx),%edx
10d23f: 66 89 15 60 83 12 00 mov %dx,0x128360
10d246: e9 61 ff ff ff jmp 10d1ac <_Scheduler_priority_Block+0x20>
10d24b: 90 nop
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;
10d24c: 31 c9 xor %ecx,%ecx <== NOT EXECUTED
10d24e: eb b8 jmp 10d208 <_Scheduler_priority_Block+0x7c><== NOT EXECUTED
0010d3a0 <_Scheduler_priority_Schedule>:
#include <rtems/system.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/schedulerpriority.h>
void _Scheduler_priority_Schedule(void)
{
10d3a0: 55 push %ebp
10d3a1: 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 );
10d3a3: 66 8b 0d 60 83 12 00 mov 0x128360,%cx
10d3aa: 31 c0 xor %eax,%eax
10d3ac: 89 c2 mov %eax,%edx
10d3ae: 66 0f bc d1 bsf %cx,%dx
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
10d3b2: 0f b7 d2 movzwl %dx,%edx
10d3b5: 66 8b 8c 12 80 83 12 mov 0x128380(%edx,%edx,1),%cx
10d3bc: 00
10d3bd: 66 0f bc c1 bsf %cx,%ax
return (_Priority_Bits_index( major ) << 4) +
10d3c1: c1 e2 04 shl $0x4,%edx
10d3c4: 0f b7 c0 movzwl %ax,%eax
10d3c7: 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 ] ) )
10d3ca: 8d 04 40 lea (%eax,%eax,2),%eax
10d3cd: c1 e0 02 shl $0x2,%eax
10d3d0: 03 05 80 39 12 00 add 0x123980,%eax
_Scheduler_priority_Schedule_body();
}
10d3d6: 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 );
10d3d8: 83 c0 04 add $0x4,%eax
10d3db: 39 c2 cmp %eax,%edx
10d3dd: 74 09 je 10d3e8 <_Scheduler_priority_Schedule+0x48><== NEVER TAKEN
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d3df: 89 15 3c 83 12 00 mov %edx,0x12833c
10d3e5: c9 leave
10d3e6: c3 ret
10d3e7: 90 nop
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;
10d3e8: 31 d2 xor %edx,%edx <== NOT EXECUTED
*
* @param[in] the_thread - pointer to thread
*/
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
10d3ea: 89 15 3c 83 12 00 mov %edx,0x12833c <== NOT EXECUTED
10d3f0: c9 leave <== NOT EXECUTED
10d3f1: c3 ret <== NOT EXECUTED
0010d4c4 <_Scheduler_priority_Yield>:
* ready chain
* select heir
*/
void _Scheduler_priority_Yield(void)
{
10d4c4: 55 push %ebp
10d4c5: 89 e5 mov %esp,%ebp
10d4c7: 56 push %esi
10d4c8: 53 push %ebx
Scheduler_priority_Per_thread *sched_info;
ISR_Level level;
Thread_Control *executing;
Chain_Control *ready;
executing = _Thread_Executing;
10d4c9: a1 38 83 12 00 mov 0x128338,%eax
sched_info = (Scheduler_priority_Per_thread *) executing->scheduler_info;
ready = sched_info->ready_chain;
10d4ce: 8b 90 8c 00 00 00 mov 0x8c(%eax),%edx
10d4d4: 8b 12 mov (%edx),%edx
_ISR_Disable( level );
10d4d6: 9c pushf
10d4d7: fa cli
10d4d8: 59 pop %ecx
if ( !_Chain_Has_only_one_node( ready ) ) {
10d4d9: 8b 5a 08 mov 0x8(%edx),%ebx
10d4dc: 39 1a cmp %ebx,(%edx)
10d4de: 74 40 je 10d520 <_Scheduler_priority_Yield+0x5c>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10d4e0: 8b 30 mov (%eax),%esi
previous = the_node->previous;
10d4e2: 8b 58 04 mov 0x4(%eax),%ebx
next->previous = previous;
10d4e5: 89 5e 04 mov %ebx,0x4(%esi)
previous->next = next;
10d4e8: 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;
10d4ea: 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 );
10d4ed: 8d 72 04 lea 0x4(%edx),%esi
10d4f0: 89 30 mov %esi,(%eax)
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
10d4f2: 89 42 08 mov %eax,0x8(%edx)
old_last->next = the_node;
10d4f5: 89 03 mov %eax,(%ebx)
the_node->previous = old_last;
10d4f7: 89 58 04 mov %ebx,0x4(%eax)
_Chain_Extract_unprotected( &executing->Object.Node );
_Chain_Append_unprotected( ready, &executing->Object.Node );
_ISR_Flash( level );
10d4fa: 51 push %ecx
10d4fb: 9d popf
10d4fc: fa cli
if ( _Thread_Is_heir( executing ) )
10d4fd: 3b 05 3c 83 12 00 cmp 0x12833c,%eax
10d503: 74 0f je 10d514 <_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;
10d505: c6 05 44 83 12 00 01 movb $0x1,0x128344
_ISR_Enable( level );
10d50c: 51 push %ecx
10d50d: 9d popf
}
10d50e: 5b pop %ebx
10d50f: 5e pop %esi
10d510: c9 leave
10d511: c3 ret
10d512: 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 );
10d514: 8b 02 mov (%edx),%eax
10d516: a3 3c 83 12 00 mov %eax,0x12833c
10d51b: eb e8 jmp 10d505 <_Scheduler_priority_Yield+0x41>
10d51d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Dispatch_necessary = true;
}
else if ( !_Thread_Is_heir( executing ) )
10d520: 3b 05 3c 83 12 00 cmp 0x12833c,%eax
10d526: 75 dd jne 10d505 <_Scheduler_priority_Yield+0x41>
10d528: eb e2 jmp 10d50c <_Scheduler_priority_Yield+0x48>
0010dadc <_TOD_Set>:
*/
void _TOD_Set(
const struct timespec *time
)
{
10dadc: 55 push %ebp
10dadd: 89 e5 mov %esp,%ebp
10dadf: 53 push %ebx
10dae0: 83 ec 04 sub $0x4,%esp
10dae3: 8b 5d 08 mov 0x8(%ebp),%ebx
10dae6: a1 10 aa 12 00 mov 0x12aa10,%eax
10daeb: 40 inc %eax
10daec: a3 10 aa 12 00 mov %eax,0x12aa10
long seconds;
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
10daf1: a1 a8 aa 12 00 mov 0x12aaa8,%eax
if ( time->tv_sec < seconds )
10daf6: 8b 13 mov (%ebx),%edx
10daf8: 39 d0 cmp %edx,%eax
10dafa: 7f 34 jg 10db30 <_TOD_Set+0x54>
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
_Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
10dafc: 51 push %ecx
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
10dafd: 29 c2 sub %eax,%edx
10daff: 52 push %edx
10db00: 6a 00 push $0x0
10db02: 68 d4 aa 12 00 push $0x12aad4
10db07: e8 0c 25 00 00 call 110018 <_Watchdog_Adjust>
10db0c: 83 c4 10 add $0x10,%esp
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
10db0f: 8b 03 mov (%ebx),%eax
10db11: a3 a8 aa 12 00 mov %eax,0x12aaa8
10db16: 8b 43 04 mov 0x4(%ebx),%eax
10db19: a3 ac aa 12 00 mov %eax,0x12aaac
_TOD_Is_set = true;
10db1e: c6 05 24 aa 12 00 01 movb $0x1,0x12aa24
_TOD_Activate();
_Thread_Enable_dispatch();
}
10db25: 8b 5d fc mov -0x4(%ebp),%ebx
10db28: c9 leave
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
_TOD_Is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
10db29: e9 02 16 00 00 jmp 10f130 <_Thread_Enable_dispatch>
10db2e: 66 90 xchg %ax,%ax
10db30: 51 push %ecx
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
if ( time->tv_sec < seconds )
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
10db31: 29 d0 sub %edx,%eax
10db33: 50 push %eax
10db34: 6a 01 push $0x1
10db36: 68 d4 aa 12 00 push $0x12aad4
10db3b: e8 d8 24 00 00 call 110018 <_Watchdog_Adjust>
10db40: 83 c4 10 add $0x10,%esp
10db43: eb ca jmp 10db0f <_TOD_Set+0x33>
0010c1e8 <_TOD_To_seconds>:
*/
uint32_t _TOD_To_seconds(
const rtems_time_of_day *the_tod
)
{
10c1e8: 55 push %ebp
10c1e9: 89 e5 mov %esp,%ebp
10c1eb: 56 push %esi
10c1ec: 53 push %ebx
10c1ed: 8b 55 08 mov 0x8(%ebp),%edx
uint32_t time;
uint32_t year_mod_4;
time = the_tod->day - 1;
10c1f0: 8b 72 08 mov 0x8(%edx),%esi
10c1f3: 4e dec %esi
year_mod_4 = the_tod->year & 3;
10c1f4: 8b 02 mov (%edx),%eax
if ( year_mod_4 == 0 )
10c1f6: 89 c3 mov %eax,%ebx
10c1f8: 83 e3 03 and $0x3,%ebx
10c1fb: 74 67 je 10c264 <_TOD_To_seconds+0x7c>
time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
else
time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
10c1fd: 8b 4a 04 mov 0x4(%edx),%ecx
10c200: 0f b7 8c 09 c0 42 12 movzwl 0x1242c0(%ecx,%ecx,1),%ecx
10c207: 00
10c208: 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 ];
10c20b: 0f b7 8c 1b f4 42 12 movzwl 0x1242f4(%ebx,%ebx,1),%ecx
10c212: 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 ) *
10c213: 2d c4 07 00 00 sub $0x7c4,%eax
10c218: c1 e8 02 shr $0x2,%eax
10c21b: 8d 1c c0 lea (%eax,%eax,8),%ebx
10c21e: 8d 1c d8 lea (%eax,%ebx,8),%ebx
10c221: 8d 1c 9b lea (%ebx,%ebx,4),%ebx
10c224: 8d 04 98 lea (%eax,%ebx,4),%eax
10c227: 01 c1 add %eax,%ecx
( (TOD_DAYS_PER_YEAR * 4) + 1);
time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
10c229: 01 f1 add %esi,%ecx
time *= TOD_SECONDS_PER_DAY;
10c22b: 8d 04 89 lea (%ecx,%ecx,4),%eax
10c22e: 8d 04 81 lea (%ecx,%eax,4),%eax
10c231: 8d 04 c1 lea (%ecx,%eax,8),%eax
10c234: c1 e0 02 shl $0x2,%eax
10c237: 29 c8 sub %ecx,%eax
10c239: c1 e0 07 shl $0x7,%eax
time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
10c23c: 8b 5a 14 mov 0x14(%edx),%ebx
10c23f: 8b 4a 0c mov 0xc(%edx),%ecx
10c242: 8d 0c 49 lea (%ecx,%ecx,2),%ecx
10c245: 8d 0c 89 lea (%ecx,%ecx,4),%ecx
10c248: c1 e1 02 shl $0x2,%ecx
10c24b: 03 4a 10 add 0x10(%edx),%ecx
* TOD_SECONDS_PER_MINUTE;
10c24e: 8d 14 49 lea (%ecx,%ecx,2),%edx
10c251: 8d 14 92 lea (%edx,%edx,4),%edx
time += the_tod->second;
10c254: 8d 94 93 00 e5 da 21 lea 0x21dae500(%ebx,%edx,4),%edx
time += TOD_SECONDS_1970_THROUGH_1988;
10c25b: 8d 04 02 lea (%edx,%eax,1),%eax
return( time );
}
10c25e: 5b pop %ebx
10c25f: 5e pop %esi
10c260: c9 leave
10c261: c3 ret
10c262: 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 ];
10c264: 8b 4a 04 mov 0x4(%edx),%ecx
10c267: 0f b7 8c 09 da 42 12 movzwl 0x1242da(%ecx,%ecx,1),%ecx
10c26e: 00
10c26f: 8d 34 31 lea (%ecx,%esi,1),%esi
10c272: eb 97 jmp 10c20b <_TOD_To_seconds+0x23>
0010c274 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
10c274: 55 push %ebp
10c275: 89 e5 mov %esp,%ebp
10c277: 53 push %ebx
10c278: 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();
10c27b: 8b 1d 6c 62 12 00 mov 0x12626c,%ebx
if ((!the_tod) ||
10c281: 85 c9 test %ecx,%ecx
10c283: 74 53 je 10c2d8 <_TOD_Validate+0x64> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
10c285: b8 40 42 0f 00 mov $0xf4240,%eax
10c28a: 31 d2 xor %edx,%edx
10c28c: f7 f3 div %ebx
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
10c28e: 3b 41 18 cmp 0x18(%ecx),%eax
10c291: 76 45 jbe 10c2d8 <_TOD_Validate+0x64>
(the_tod->ticks >= ticks_per_second) ||
10c293: 83 79 14 3b cmpl $0x3b,0x14(%ecx)
10c297: 77 3f ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
10c299: 83 79 10 3b cmpl $0x3b,0x10(%ecx)
10c29d: 77 39 ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
10c29f: 83 79 0c 17 cmpl $0x17,0xc(%ecx)
10c2a3: 77 33 ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
10c2a5: 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) ||
10c2a8: 85 c0 test %eax,%eax
10c2aa: 74 2c je 10c2d8 <_TOD_Validate+0x64> <== NEVER TAKEN
(the_tod->month == 0) ||
10c2ac: 83 f8 0c cmp $0xc,%eax
10c2af: 77 27 ja 10c2d8 <_TOD_Validate+0x64>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
10c2b1: 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) ||
10c2b3: 81 fa c3 07 00 00 cmp $0x7c3,%edx
10c2b9: 76 1d jbe 10c2d8 <_TOD_Validate+0x64>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
10c2bb: 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) ||
10c2be: 85 c9 test %ecx,%ecx
10c2c0: 74 16 je 10c2d8 <_TOD_Validate+0x64> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
10c2c2: 83 e2 03 and $0x3,%edx
10c2c5: 75 16 jne 10c2dd <_TOD_Validate+0x69>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
10c2c7: 8b 04 85 34 43 12 00 mov 0x124334(,%eax,4),%eax
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
10c2ce: 39 c8 cmp %ecx,%eax
10c2d0: 0f 93 c0 setae %al
10c2d3: eb 05 jmp 10c2da <_TOD_Validate+0x66>
10c2d5: 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;
10c2d8: 31 c0 xor %eax,%eax
if ( the_tod->day > days_in_month )
return false;
return true;
}
10c2da: 5b pop %ebx
10c2db: c9 leave
10c2dc: 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 ];
10c2dd: 8b 04 85 00 43 12 00 mov 0x124300(,%eax,4),%eax
10c2e4: eb e8 jmp 10c2ce <_TOD_Validate+0x5a>
0010d578 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
10d578: 55 push %ebp
10d579: 89 e5 mov %esp,%ebp
10d57b: 57 push %edi
10d57c: 56 push %esi
10d57d: 53 push %ebx
10d57e: 83 ec 28 sub $0x28,%esp
10d581: 8b 5d 08 mov 0x8(%ebp),%ebx
10d584: 8b 75 0c mov 0xc(%ebp),%esi
10d587: 8a 45 10 mov 0x10(%ebp),%al
10d58a: 88 45 e7 mov %al,-0x19(%ebp)
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
10d58d: 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 );
10d590: 53 push %ebx
10d591: e8 76 0c 00 00 call 10e20c <_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 )
10d596: 83 c4 10 add $0x10,%esp
10d599: 39 73 14 cmp %esi,0x14(%ebx)
10d59c: 74 0d je 10d5ab <_Thread_Change_priority+0x33>
_Thread_Set_priority( the_thread, new_priority );
10d59e: 83 ec 08 sub $0x8,%esp
10d5a1: 56 push %esi
10d5a2: 53 push %ebx
10d5a3: e8 10 0c 00 00 call 10e1b8 <_Thread_Set_priority>
10d5a8: 83 c4 10 add $0x10,%esp
_ISR_Disable( level );
10d5ab: 9c pushf
10d5ac: fa cli
10d5ad: 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;
10d5ae: 8b 43 10 mov 0x10(%ebx),%eax
if ( state != STATES_TRANSIENT ) {
10d5b1: 83 f8 04 cmp $0x4,%eax
10d5b4: 74 22 je 10d5d8 <_Thread_Change_priority+0x60>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
10d5b6: 83 e7 04 and $0x4,%edi
10d5b9: 74 11 je 10d5cc <_Thread_Change_priority+0x54><== ALWAYS TAKEN
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
10d5bb: 56 push %esi
10d5bc: 9d popf
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10d5bd: a9 e0 be 03 00 test $0x3bee0,%eax
10d5c2: 75 60 jne 10d624 <_Thread_Change_priority+0xac>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
10d5c4: 8d 65 f4 lea -0xc(%ebp),%esp
10d5c7: 5b pop %ebx
10d5c8: 5e pop %esi
10d5c9: 5f pop %edi
10d5ca: c9 leave
10d5cb: c3 ret
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
10d5cc: 89 c2 mov %eax,%edx
10d5ce: 83 e2 fb and $0xfffffffb,%edx
10d5d1: 89 53 10 mov %edx,0x10(%ebx)
10d5d4: eb e5 jmp 10d5bb <_Thread_Change_priority+0x43>
10d5d6: 66 90 xchg %ax,%ax
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
10d5d8: 83 e7 04 and $0x4,%edi
10d5db: 75 1a jne 10d5f7 <_Thread_Change_priority+0x7f><== NEVER TAKEN
* Interrupts are STILL disabled.
* We now know the thread will be in the READY state when we remove
* the TRANSIENT state. So we have to place it on the appropriate
* Ready Queue with interrupts off.
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
10d5dd: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
if ( prepend_it )
10d5e4: 80 7d e7 00 cmpb $0x0,-0x19(%ebp)
10d5e8: 74 52 je 10d63c <_Thread_Change_priority+0xc4>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
10d5ea: 83 ec 0c sub $0xc,%esp
10d5ed: 53 push %ebx
10d5ee: ff 15 a8 39 12 00 call *0x1239a8
10d5f4: 83 c4 10 add $0x10,%esp
_Scheduler_Enqueue_first( the_thread );
else
_Scheduler_Enqueue( the_thread );
}
_ISR_Flash( level );
10d5f7: 56 push %esi
10d5f8: 9d popf
10d5f9: fa cli
* This kernel routine implements the scheduling decision logic for
* the scheduler. It does NOT dispatch.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( void )
{
_Scheduler.Operations.schedule();
10d5fa: ff 15 88 39 12 00 call *0x123988
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
10d600: a1 38 83 12 00 mov 0x128338,%eax
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule();
if ( !_Thread_Is_executing_also_the_heir() &&
10d605: 3b 05 3c 83 12 00 cmp 0x12833c,%eax
10d60b: 74 0d je 10d61a <_Thread_Change_priority+0xa2>
10d60d: 80 78 74 00 cmpb $0x0,0x74(%eax)
10d611: 74 07 je 10d61a <_Thread_Change_priority+0xa2>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
10d613: c6 05 44 83 12 00 01 movb $0x1,0x128344
_ISR_Enable( level );
10d61a: 56 push %esi
10d61b: 9d popf
}
10d61c: 8d 65 f4 lea -0xc(%ebp),%esp
10d61f: 5b pop %ebx
10d620: 5e pop %esi
10d621: 5f pop %edi
10d622: c9 leave
10d623: c3 ret
/* 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 );
10d624: 89 5d 0c mov %ebx,0xc(%ebp)
10d627: 8b 43 44 mov 0x44(%ebx),%eax
10d62a: 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 );
}
10d62d: 8d 65 f4 lea -0xc(%ebp),%esp
10d630: 5b pop %ebx
10d631: 5e pop %esi
10d632: 5f pop %edi
10d633: 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 );
10d634: e9 e7 0a 00 00 jmp 10e120 <_Thread_queue_Requeue>
10d639: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
10d63c: 83 ec 0c sub $0xc,%esp
10d63f: 53 push %ebx
10d640: ff 15 a4 39 12 00 call *0x1239a4
10d646: 83 c4 10 add $0x10,%esp
10d649: eb ac jmp 10d5f7 <_Thread_Change_priority+0x7f>
0010d64c <_Thread_Clear_state>:
*/
void _Thread_Clear_state(
Thread_Control *the_thread,
States_Control state
)
{
10d64c: 55 push %ebp
10d64d: 89 e5 mov %esp,%ebp
10d64f: 53 push %ebx
10d650: 83 ec 04 sub $0x4,%esp
10d653: 8b 55 08 mov 0x8(%ebp),%edx
10d656: 8b 45 0c mov 0xc(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
10d659: 9c pushf
10d65a: fa cli
10d65b: 5b pop %ebx
current_state = the_thread->current_state;
10d65c: 8b 4a 10 mov 0x10(%edx),%ecx
if ( current_state & state ) {
10d65f: 85 c8 test %ecx,%eax
10d661: 74 0b je 10d66e <_Thread_Clear_state+0x22>
10d663: f7 d0 not %eax
10d665: 21 c8 and %ecx,%eax
current_state =
the_thread->current_state = _States_Clear( state, current_state );
10d667: 89 42 10 mov %eax,0x10(%edx)
if ( _States_Is_ready( current_state ) ) {
10d66a: 85 c0 test %eax,%eax
10d66c: 74 0a je 10d678 <_Thread_Clear_state+0x2c>
_Scheduler_Unblock( the_thread );
}
}
_ISR_Enable( level );
10d66e: 53 push %ebx
10d66f: 9d popf
}
10d670: 8b 5d fc mov -0x4(%ebp),%ebx
10d673: c9 leave
10d674: c3 ret
10d675: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Thread_Control *the_thread
)
{
_Scheduler.Operations.unblock( the_thread );
10d678: 83 ec 0c sub $0xc,%esp
10d67b: 52 push %edx
10d67c: ff 15 94 39 12 00 call *0x123994
10d682: 83 c4 10 add $0x10,%esp
10d685: eb e7 jmp 10d66e <_Thread_Clear_state+0x22>
0010d7fc <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10d7fc: 55 push %ebp
10d7fd: 89 e5 mov %esp,%ebp
10d7ff: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10d802: 8d 45 f4 lea -0xc(%ebp),%eax
10d805: 50 push %eax
10d806: ff 75 08 pushl 0x8(%ebp)
10d809: e8 c6 01 00 00 call 10d9d4 <_Thread_Get>
switch ( location ) {
10d80e: 83 c4 10 add $0x10,%esp
10d811: 8b 55 f4 mov -0xc(%ebp),%edx
10d814: 85 d2 test %edx,%edx
10d816: 75 1c jne 10d834 <_Thread_Delay_ended+0x38><== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
10d818: 83 ec 08 sub $0x8,%esp
10d81b: 68 18 00 00 10 push $0x10000018
10d820: 50 push %eax
10d821: e8 26 fe ff ff call 10d64c <_Thread_Clear_state>
10d826: a1 90 7d 12 00 mov 0x127d90,%eax
10d82b: 48 dec %eax
10d82c: a3 90 7d 12 00 mov %eax,0x127d90
10d831: 83 c4 10 add $0x10,%esp
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
10d834: c9 leave
10d835: c3 ret
0010d838 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
10d838: 55 push %ebp
10d839: 89 e5 mov %esp,%ebp
10d83b: 57 push %edi
10d83c: 56 push %esi
10d83d: 53 push %ebx
10d83e: 83 ec 1c sub $0x1c,%esp
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
10d841: 8b 1d 38 83 12 00 mov 0x128338,%ebx
_ISR_Disable( level );
10d847: 9c pushf
10d848: fa cli
10d849: 58 pop %eax
while ( _Thread_Dispatch_necessary == true ) {
10d84a: 8a 15 44 83 12 00 mov 0x128344,%dl
10d850: 84 d2 test %dl,%dl
10d852: 0f 84 3c 01 00 00 je 10d994 <_Thread_Dispatch+0x15c>
heir = _Thread_Heir;
10d858: 8b 35 3c 83 12 00 mov 0x12833c,%esi
_Thread_Dispatch_disable_level = 1;
10d85e: c7 05 90 7d 12 00 01 movl $0x1,0x127d90
10d865: 00 00 00
_Thread_Dispatch_necessary = false;
10d868: c6 05 44 83 12 00 00 movb $0x0,0x128344
_Thread_Executing = heir;
10d86f: 89 35 38 83 12 00 mov %esi,0x128338
/*
* 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 )
10d875: 39 f3 cmp %esi,%ebx
10d877: 0f 84 17 01 00 00 je 10d994 <_Thread_Dispatch+0x15c>
10d87d: 8d 7d d8 lea -0x28(%ebp),%edi
10d880: e9 f5 00 00 00 jmp 10d97a <_Thread_Dispatch+0x142>
10d885: 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 );
10d888: 50 push %eax
10d889: 9d popf
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
10d88a: 83 ec 0c sub $0xc,%esp
10d88d: 8d 45 e0 lea -0x20(%ebp),%eax
10d890: 50 push %eax
10d891: e8 2a 3a 00 00 call 1112c0 <_TOD_Get_uptime>
_Timestamp_Subtract(
10d896: 83 c4 0c add $0xc,%esp
10d899: 57 push %edi
10d89a: 8d 45 e0 lea -0x20(%ebp),%eax
10d89d: 50 push %eax
10d89e: 68 4c 7e 12 00 push $0x127e4c
10d8a3: e8 98 0b 00 00 call 10e440 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
10d8a8: 58 pop %eax
10d8a9: 5a pop %edx
10d8aa: 57 push %edi
10d8ab: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax
10d8b1: 50 push %eax
10d8b2: e8 4d 0b 00 00 call 10e404 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
10d8b7: 8b 45 e0 mov -0x20(%ebp),%eax
10d8ba: 8b 55 e4 mov -0x1c(%ebp),%edx
10d8bd: a3 4c 7e 12 00 mov %eax,0x127e4c
10d8c2: 89 15 50 7e 12 00 mov %edx,0x127e50
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
10d8c8: a1 24 7e 12 00 mov 0x127e24,%eax
10d8cd: 83 c4 10 add $0x10,%esp
10d8d0: 85 c0 test %eax,%eax
10d8d2: 74 10 je 10d8e4 <_Thread_Dispatch+0xac> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
10d8d4: 8b 10 mov (%eax),%edx
10d8d6: 89 93 e4 00 00 00 mov %edx,0xe4(%ebx)
*_Thread_libc_reent = heir->libc_reent;
10d8dc: 8b 96 e4 00 00 00 mov 0xe4(%esi),%edx
10d8e2: 89 10 mov %edx,(%eax)
}
_User_extensions_Thread_switch( executing, heir );
10d8e4: 83 ec 08 sub $0x8,%esp
10d8e7: 56 push %esi
10d8e8: 53 push %ebx
10d8e9: e8 f2 0d 00 00 call 10e6e0 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
10d8ee: 5a pop %edx
10d8ef: 59 pop %ecx
10d8f0: 81 c6 c8 00 00 00 add $0xc8,%esi
10d8f6: 56 push %esi
10d8f7: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax
10d8fd: 50 push %eax
10d8fe: e8 ed 10 00 00 call 10e9f0 <_CPU_Context_switch>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
10d903: 83 c4 10 add $0x10,%esp
10d906: 8b 83 e0 00 00 00 mov 0xe0(%ebx),%eax
10d90c: 85 c0 test %eax,%eax
10d90e: 74 36 je 10d946 <_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 );
10d910: a1 20 7e 12 00 mov 0x127e20,%eax
10d915: 39 c3 cmp %eax,%ebx
10d917: 74 2d je 10d946 <_Thread_Dispatch+0x10e>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
10d919: 85 c0 test %eax,%eax
10d91b: 74 11 je 10d92e <_Thread_Dispatch+0xf6>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
10d91d: 83 ec 0c sub $0xc,%esp
10d920: 05 e0 00 00 00 add $0xe0,%eax
10d925: 50 push %eax
10d926: e8 f9 10 00 00 call 10ea24 <_CPU_Context_save_fp>
10d92b: 83 c4 10 add $0x10,%esp
_Context_Restore_fp( &executing->fp_context );
10d92e: 83 ec 0c sub $0xc,%esp
10d931: 8d 83 e0 00 00 00 lea 0xe0(%ebx),%eax
10d937: 50 push %eax
10d938: e8 f1 10 00 00 call 10ea2e <_CPU_Context_restore_fp>
_Thread_Allocated_fp = executing;
10d93d: 89 1d 20 7e 12 00 mov %ebx,0x127e20
10d943: 83 c4 10 add $0x10,%esp
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
10d946: 8b 1d 38 83 12 00 mov 0x128338,%ebx
_ISR_Disable( level );
10d94c: 9c pushf
10d94d: fa cli
10d94e: 58 pop %eax
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
10d94f: 8a 15 44 83 12 00 mov 0x128344,%dl
10d955: 84 d2 test %dl,%dl
10d957: 74 3b je 10d994 <_Thread_Dispatch+0x15c>
heir = _Thread_Heir;
10d959: 8b 35 3c 83 12 00 mov 0x12833c,%esi
_Thread_Dispatch_disable_level = 1;
10d95f: c7 05 90 7d 12 00 01 movl $0x1,0x127d90
10d966: 00 00 00
_Thread_Dispatch_necessary = false;
10d969: c6 05 44 83 12 00 00 movb $0x0,0x128344
_Thread_Executing = heir;
10d970: 89 35 38 83 12 00 mov %esi,0x128338
/*
* 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 )
10d976: 39 de cmp %ebx,%esi
10d978: 74 1a je 10d994 <_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 )
10d97a: 83 7e 7c 01 cmpl $0x1,0x7c(%esi)
10d97e: 0f 85 04 ff ff ff jne 10d888 <_Thread_Dispatch+0x50>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
10d984: 8b 15 60 7d 12 00 mov 0x127d60,%edx
10d98a: 89 56 78 mov %edx,0x78(%esi)
10d98d: e9 f6 fe ff ff jmp 10d888 <_Thread_Dispatch+0x50>
10d992: 66 90 xchg %ax,%ax
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
10d994: c7 05 90 7d 12 00 00 movl $0x0,0x127d90
10d99b: 00 00 00
_ISR_Enable( level );
10d99e: 50 push %eax
10d99f: 9d popf
_API_extensions_Run_postswitch();
10d9a0: e8 23 e5 ff ff call 10bec8 <_API_extensions_Run_postswitch>
}
10d9a5: 8d 65 f4 lea -0xc(%ebp),%esp
10d9a8: 5b pop %ebx
10d9a9: 5e pop %esi
10d9aa: 5f pop %edi
10d9ab: c9 leave
10d9ac: c3 ret
0010d9d4 <_Thread_Get>:
*/
Thread_Control *_Thread_Get (
Objects_Id id,
Objects_Locations *location
)
{
10d9d4: 55 push %ebp
10d9d5: 89 e5 mov %esp,%ebp
10d9d7: 53 push %ebx
10d9d8: 83 ec 04 sub $0x4,%esp
10d9db: 8b 45 08 mov 0x8(%ebp),%eax
10d9de: 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 ) ) {
10d9e1: 85 c0 test %eax,%eax
10d9e3: 74 47 je 10da2c <_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);
10d9e5: 89 c2 mov %eax,%edx
10d9e7: c1 ea 18 shr $0x18,%edx
10d9ea: 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 )
10d9ed: 8d 5a ff lea -0x1(%edx),%ebx
10d9f0: 83 fb 02 cmp $0x2,%ebx
10d9f3: 77 27 ja 10da1c <_Thread_Get+0x48>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
10d9f5: 89 c3 mov %eax,%ebx
10d9f7: 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 :) */
10d9fa: 4b dec %ebx
10d9fb: 75 1f jne 10da1c <_Thread_Get+0x48>
*location = OBJECTS_ERROR;
goto done;
}
#endif
information = api_information[ the_class ];
10d9fd: 8b 14 95 68 7d 12 00 mov 0x127d68(,%edx,4),%edx
10da04: 8b 52 04 mov 0x4(%edx),%edx
if ( !information ) {
10da07: 85 d2 test %edx,%edx
10da09: 74 11 je 10da1c <_Thread_Get+0x48>
*location = OBJECTS_ERROR;
goto done;
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
10da0b: 53 push %ebx
10da0c: 51 push %ecx
10da0d: 50 push %eax
10da0e: 52 push %edx
10da0f: e8 24 f4 ff ff call 10ce38 <_Objects_Get>
10da14: 83 c4 10 add $0x10,%esp
done:
return tp;
}
10da17: 8b 5d fc mov -0x4(%ebp),%ebx
10da1a: c9 leave
10da1b: c3 ret
}
#endif
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
10da1c: 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;
10da22: 31 c0 xor %eax,%eax
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
10da24: 8b 5d fc mov -0x4(%ebp),%ebx
10da27: c9 leave
10da28: c3 ret
10da29: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10da2c: a1 90 7d 12 00 mov 0x127d90,%eax
10da31: 40 inc %eax
10da32: a3 90 7d 12 00 mov %eax,0x127d90
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;
10da37: c7 01 00 00 00 00 movl $0x0,(%ecx)
tp = _Thread_Executing;
10da3d: a1 38 83 12 00 mov 0x128338,%eax
tp = (Thread_Control *) _Objects_Get( information, id, location );
done:
return tp;
}
10da42: 8b 5d fc mov -0x4(%ebp),%ebx
10da45: c9 leave
10da46: c3 ret
001130a8 <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
1130a8: 55 push %ebp
1130a9: 89 e5 mov %esp,%ebp
1130ab: 53 push %ebx
1130ac: 83 ec 14 sub $0x14,%esp
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
1130af: 8b 1d 38 83 12 00 mov 0x128338,%ebx
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
1130b5: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax
_ISR_Set_level(level);
1130bb: 85 c0 test %eax,%eax
1130bd: 74 79 je 113138 <_Thread_Handler+0x90>
1130bf: fa cli
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
1130c0: a0 0c 7a 12 00 mov 0x127a0c,%al
1130c5: 88 45 f7 mov %al,-0x9(%ebp)
doneConstructors = 1;
1130c8: c6 05 0c 7a 12 00 01 movb $0x1,0x127a0c
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
if ( (executing->fp_context != NULL) &&
1130cf: 8b 83 e0 00 00 00 mov 0xe0(%ebx),%eax
1130d5: 85 c0 test %eax,%eax
1130d7: 74 24 je 1130fd <_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 );
1130d9: a1 20 7e 12 00 mov 0x127e20,%eax
1130de: 39 c3 cmp %eax,%ebx
1130e0: 74 1b je 1130fd <_Thread_Handler+0x55>
!_Thread_Is_allocated_fp( executing ) ) {
if ( _Thread_Allocated_fp != NULL )
1130e2: 85 c0 test %eax,%eax
1130e4: 74 11 je 1130f7 <_Thread_Handler+0x4f>
_Context_Save_fp( &_Thread_Allocated_fp->fp_context );
1130e6: 83 ec 0c sub $0xc,%esp
1130e9: 05 e0 00 00 00 add $0xe0,%eax
1130ee: 50 push %eax
1130ef: e8 30 b9 ff ff call 10ea24 <_CPU_Context_save_fp>
1130f4: 83 c4 10 add $0x10,%esp
_Thread_Allocated_fp = executing;
1130f7: 89 1d 20 7e 12 00 mov %ebx,0x127e20
/*
* 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 );
1130fd: 83 ec 0c sub $0xc,%esp
113100: 53 push %ebx
113101: e8 3e b4 ff ff call 10e544 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
113106: e8 a5 a8 ff ff call 10d9b0 <_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) */ {
11310b: 83 c4 10 add $0x10,%esp
11310e: 80 7d f7 00 cmpb $0x0,-0x9(%ebp)
113112: 74 28 je 11313c <_Thread_Handler+0x94>
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
113114: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
11311a: 85 c0 test %eax,%eax
11311c: 74 2d je 11314b <_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 ) {
11311e: 48 dec %eax
11311f: 74 43 je 113164 <_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 );
113121: 83 ec 0c sub $0xc,%esp
113124: 53 push %ebx
113125: e8 56 b4 ff ff call 10e580 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
11312a: 83 c4 0c add $0xc,%esp
11312d: 6a 05 push $0x5
11312f: 6a 01 push $0x1
113131: 6a 00 push $0x0
113133: e8 bc 97 ff ff call 10c8f4 <_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);
113138: fb sti
113139: eb 85 jmp 1130c0 <_Thread_Handler+0x18>
11313b: 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 ();
11313c: e8 3f c7 00 00 call 11f880 <__start_set_sysctl_set>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
113141: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax
113147: 85 c0 test %eax,%eax
113149: 75 d3 jne 11311e <_Thread_Handler+0x76>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
11314b: 83 ec 0c sub $0xc,%esp
11314e: ff b3 9c 00 00 00 pushl 0x9c(%ebx)
113154: ff 93 90 00 00 00 call *0x90(%ebx)
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
11315a: 89 43 28 mov %eax,0x28(%ebx)
11315d: 83 c4 10 add $0x10,%esp
113160: eb bf jmp 113121 <_Thread_Handler+0x79>
113162: 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)(
113164: 83 ec 0c sub $0xc,%esp
113167: ff b3 98 00 00 00 pushl 0x98(%ebx)
11316d: 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 =
113173: 89 43 28 mov %eax,0x28(%ebx)
113176: 83 c4 10 add $0x10,%esp
113179: eb a6 jmp 113121 <_Thread_Handler+0x79>
0010da48 <_Thread_Initialize>:
Thread_CPU_budget_algorithms budget_algorithm,
Thread_CPU_budget_algorithm_callout budget_callout,
uint32_t isr_level,
Objects_Name name
)
{
10da48: 55 push %ebp
10da49: 89 e5 mov %esp,%ebp
10da4b: 57 push %edi
10da4c: 56 push %esi
10da4d: 53 push %ebx
10da4e: 83 ec 1c sub $0x1c,%esp
10da51: 8b 5d 0c mov 0xc(%ebp),%ebx
10da54: 8b 4d 10 mov 0x10(%ebp),%ecx
10da57: 8b 75 14 mov 0x14(%ebp),%esi
10da5a: 8b 7d 1c mov 0x1c(%ebp),%edi
10da5d: 8a 55 18 mov 0x18(%ebp),%dl
10da60: 8a 45 20 mov 0x20(%ebp),%al
10da63: 88 45 df mov %al,-0x21(%ebp)
/*
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
10da66: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx)
10da6d: 00 00 00
10da70: c7 83 ec 00 00 00 00 movl $0x0,0xec(%ebx)
10da77: 00 00 00
extensions_area = NULL;
the_thread->libc_reent = NULL;
10da7a: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx)
10da81: 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 ) {
10da84: 85 c9 test %ecx,%ecx
10da86: 0f 84 d3 01 00 00 je 10dc5f <_Thread_Initialize+0x217>
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;
10da8c: c6 83 b4 00 00 00 00 movb $0x0,0xb4(%ebx)
10da93: 89 f0 mov %esi,%eax
Stack_Control *the_stack,
void *starting_address,
size_t size
)
{
the_stack->area = starting_address;
10da95: 89 8b bc 00 00 00 mov %ecx,0xbc(%ebx)
the_stack->size = size;
10da9b: 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 ) {
10daa1: 84 d2 test %dl,%dl
10daa3: 0f 85 4f 01 00 00 jne 10dbf8 <_Thread_Initialize+0x1b0>
10daa9: 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;
10daab: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%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;
10dab2: 89 83 e0 00 00 00 mov %eax,0xe0(%ebx)
the_thread->Start.fp_context = fp_area;
10dab8: 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;
10dabe: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx)
the_watchdog->routine = routine;
10dac5: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
the_watchdog->id = id;
10dacc: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx)
the_watchdog->user_data = user_data;
10dad3: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx)
#endif
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
10dada: a1 30 7e 12 00 mov 0x127e30,%eax
10dadf: 85 c0 test %eax,%eax
10dae1: 0f 85 39 01 00 00 jne 10dc20 <_Thread_Initialize+0x1d8>
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dae7: c7 83 f0 00 00 00 00 movl $0x0,0xf0(%ebx)
10daee: 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;
10daf1: 31 f6 xor %esi,%esi
/*
* General initialization
*/
the_thread->Start.is_preemptible = is_preemptible;
10daf3: 8a 45 df mov -0x21(%ebp),%al
10daf6: 88 83 a0 00 00 00 mov %al,0xa0(%ebx)
the_thread->Start.budget_algorithm = budget_algorithm;
10dafc: 8b 45 24 mov 0x24(%ebp),%eax
10daff: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx)
the_thread->Start.budget_callout = budget_callout;
10db05: 8b 45 28 mov 0x28(%ebp),%eax
10db08: 89 83 a8 00 00 00 mov %eax,0xa8(%ebx)
switch ( budget_algorithm ) {
10db0e: 83 7d 24 02 cmpl $0x2,0x24(%ebp)
10db12: 75 08 jne 10db1c <_Thread_Initialize+0xd4>
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;
10db14: a1 60 7d 12 00 mov 0x127d60,%eax
10db19: 89 43 78 mov %eax,0x78(%ebx)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
break;
#endif
}
the_thread->Start.isr_level = isr_level;
10db1c: 8b 45 2c mov 0x2c(%ebp),%eax
10db1f: 89 83 ac 00 00 00 mov %eax,0xac(%ebx)
the_thread->current_state = STATES_DORMANT;
10db25: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx)
the_thread->Wait.queue = NULL;
10db2c: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
the_thread->resource_count = 0;
10db33: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->real_priority = priority;
10db3a: 89 7b 18 mov %edi,0x18(%ebx)
the_thread->Start.initial_priority = priority;
10db3d: 89 bb b0 00 00 00 mov %edi,0xb0(%ebx)
*/
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.allocate( the_thread );
10db43: 83 ec 0c sub $0xc,%esp
10db46: 53 push %ebx
10db47: ff 15 98 39 12 00 call *0x123998
10db4d: 89 45 e4 mov %eax,-0x1c(%ebp)
sched =_Scheduler_Allocate( the_thread );
if ( !sched )
10db50: 83 c4 10 add $0x10,%esp
10db53: 85 c0 test %eax,%eax
10db55: 74 40 je 10db97 <_Thread_Initialize+0x14f>
goto failed;
_Thread_Set_priority( the_thread, priority );
10db57: 83 ec 08 sub $0x8,%esp
10db5a: 57 push %edi
10db5b: 53 push %ebx
10db5c: e8 57 06 00 00 call 10e1b8 <_Thread_Set_priority>
/*
* Initialize the CPU usage statistics
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Set_to_zero( &the_thread->cpu_time_used );
10db61: c7 83 84 00 00 00 00 movl $0x0,0x84(%ebx)
10db68: 00 00 00
10db6b: c7 83 88 00 00 00 00 movl $0x0,0x88(%ebx)
10db72: 00 00 00
_Workspace_Free( sched );
_Thread_Stack_Free( the_thread );
return false;
}
10db75: 8b 45 08 mov 0x8(%ebp),%eax
10db78: 8b 40 1c mov 0x1c(%eax),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10db7b: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10db7f: 89 1c 90 mov %ebx,(%eax,%edx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10db82: 8b 45 30 mov 0x30(%ebp),%eax
10db85: 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 );
10db88: 89 1c 24 mov %ebx,(%esp)
10db8b: e8 7c 0a 00 00 call 10e60c <_User_extensions_Thread_create>
if ( extension_status )
10db90: 83 c4 10 add $0x10,%esp
10db93: 84 c0 test %al,%al
10db95: 75 55 jne 10dbec <_Thread_Initialize+0x1a4>
return true;
failed:
_Workspace_Free( the_thread->libc_reent );
10db97: 83 ec 0c sub $0xc,%esp
10db9a: ff b3 e4 00 00 00 pushl 0xe4(%ebx)
10dba0: e8 ff 0d 00 00 call 10e9a4 <_Workspace_Free>
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
_Workspace_Free( the_thread->API_Extensions[i] );
10dba5: 5f pop %edi
10dba6: ff b3 e8 00 00 00 pushl 0xe8(%ebx)
10dbac: e8 f3 0d 00 00 call 10e9a4 <_Workspace_Free>
10dbb1: 59 pop %ecx
10dbb2: ff b3 ec 00 00 00 pushl 0xec(%ebx)
10dbb8: e8 e7 0d 00 00 call 10e9a4 <_Workspace_Free>
_Workspace_Free( extensions_area );
10dbbd: 89 34 24 mov %esi,(%esp)
10dbc0: e8 df 0d 00 00 call 10e9a4 <_Workspace_Free>
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Workspace_Free( fp_area );
10dbc5: 5a pop %edx
10dbc6: ff 75 e0 pushl -0x20(%ebp)
10dbc9: e8 d6 0d 00 00 call 10e9a4 <_Workspace_Free>
#endif
_Workspace_Free( sched );
10dbce: 58 pop %eax
10dbcf: ff 75 e4 pushl -0x1c(%ebp)
10dbd2: e8 cd 0d 00 00 call 10e9a4 <_Workspace_Free>
_Thread_Stack_Free( the_thread );
10dbd7: 89 1c 24 mov %ebx,(%esp)
10dbda: e8 c1 06 00 00 call 10e2a0 <_Thread_Stack_Free>
return false;
10dbdf: 83 c4 10 add $0x10,%esp
10dbe2: 31 c0 xor %eax,%eax
}
10dbe4: 8d 65 f4 lea -0xc(%ebp),%esp
10dbe7: 5b pop %ebx
10dbe8: 5e pop %esi
10dbe9: 5f pop %edi
10dbea: c9 leave
10dbeb: c3 ret
* Mutex provides sufficient protection to let the user extensions
* run safely.
*/
extension_status = _User_extensions_Thread_create( the_thread );
if ( extension_status )
return true;
10dbec: b0 01 mov $0x1,%al
_Workspace_Free( sched );
_Thread_Stack_Free( the_thread );
return false;
}
10dbee: 8d 65 f4 lea -0xc(%ebp),%esp
10dbf1: 5b pop %ebx
10dbf2: 5e pop %esi
10dbf3: 5f pop %edi
10dbf4: c9 leave
10dbf5: c3 ret
10dbf6: 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 );
10dbf8: 83 ec 0c sub $0xc,%esp
10dbfb: 6a 6c push $0x6c
10dbfd: e8 86 0d 00 00 call 10e988 <_Workspace_Allocate>
10dc02: 89 45 e0 mov %eax,-0x20(%ebp)
if ( !fp_area )
10dc05: 83 c4 10 add $0x10,%esp
10dc08: 85 c0 test %eax,%eax
10dc0a: 0f 85 a2 fe ff ff jne 10dab2 <_Thread_Initialize+0x6a>
* Zero out all the allocated memory fields
*/
for ( i=0 ; i <= THREAD_API_LAST ; i++ )
the_thread->API_Extensions[i] = NULL;
extensions_area = NULL;
10dc10: 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;
10dc12: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
10dc19: e9 79 ff ff ff jmp 10db97 <_Thread_Initialize+0x14f>
10dc1e: 66 90 xchg %ax,%ax
/*
* Allocate the extensions area for this thread
*/
if ( _Thread_Maximum_extensions ) {
extensions_area = _Workspace_Allocate(
10dc20: 83 ec 0c sub $0xc,%esp
10dc23: 8d 04 85 04 00 00 00 lea 0x4(,%eax,4),%eax
10dc2a: 50 push %eax
10dc2b: e8 58 0d 00 00 call 10e988 <_Workspace_Allocate>
10dc30: 89 c6 mov %eax,%esi
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
10dc32: 83 c4 10 add $0x10,%esp
10dc35: 85 c0 test %eax,%eax
10dc37: 74 5a je 10dc93 <_Thread_Initialize+0x24b>
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dc39: 89 83 f0 00 00 00 mov %eax,0xf0(%ebx)
10dc3f: 8b 0d 30 7e 12 00 mov 0x127e30,%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++ )
10dc45: 31 d2 xor %edx,%edx
(_Thread_Maximum_extensions + 1) * sizeof( void * )
);
if ( !extensions_area )
goto failed;
}
the_thread->extensions = (void **) extensions_area;
10dc47: 31 c0 xor %eax,%eax
10dc49: 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;
10dc4c: 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++ )
10dc53: 40 inc %eax
10dc54: 89 c2 mov %eax,%edx
10dc56: 39 c1 cmp %eax,%ecx
10dc58: 73 f2 jae 10dc4c <_Thread_Initialize+0x204>
10dc5a: e9 94 fe ff ff jmp 10daf3 <_Thread_Initialize+0xab>
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
10dc5f: 83 ec 08 sub $0x8,%esp
10dc62: 56 push %esi
10dc63: 53 push %ebx
10dc64: 88 55 d8 mov %dl,-0x28(%ebp)
10dc67: e8 d0 05 00 00 call 10e23c <_Thread_Stack_Allocate>
if ( !actual_stack_size || actual_stack_size < stack_size )
10dc6c: 83 c4 10 add $0x10,%esp
10dc6f: 85 c0 test %eax,%eax
10dc71: 8a 55 d8 mov -0x28(%ebp),%dl
10dc74: 74 16 je 10dc8c <_Thread_Initialize+0x244>
10dc76: 39 c6 cmp %eax,%esi
10dc78: 77 12 ja 10dc8c <_Thread_Initialize+0x244><== NEVER TAKEN
return false; /* stack allocation failed */
stack = the_thread->Start.stack;
10dc7a: 8b 8b c4 00 00 00 mov 0xc4(%ebx),%ecx
the_thread->Start.core_allocated_stack = true;
10dc80: c6 83 b4 00 00 00 01 movb $0x1,0xb4(%ebx)
10dc87: e9 09 fe ff ff jmp 10da95 <_Thread_Initialize+0x4d>
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 */
10dc8c: 31 c0 xor %eax,%eax
10dc8e: e9 51 ff ff ff jmp 10dbe4 <_Thread_Initialize+0x19c>
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;
10dc93: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
10dc9a: e9 f8 fe ff ff jmp 10db97 <_Thread_Initialize+0x14f>
00112560 <_Thread_Reset>:
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
112560: 55 push %ebp
112561: 89 e5 mov %esp,%ebp
112563: 53 push %ebx
112564: 83 ec 10 sub $0x10,%esp
112567: 8b 5d 08 mov 0x8(%ebp),%ebx
the_thread->resource_count = 0;
11256a: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx)
the_thread->is_preemptible = the_thread->Start.is_preemptible;
112571: 8a 83 a0 00 00 00 mov 0xa0(%ebx),%al
112577: 88 43 74 mov %al,0x74(%ebx)
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
11257a: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax
112580: 89 43 7c mov %eax,0x7c(%ebx)
the_thread->budget_callout = the_thread->Start.budget_callout;
112583: 8b 83 a8 00 00 00 mov 0xa8(%ebx),%eax
112589: 89 83 80 00 00 00 mov %eax,0x80(%ebx)
the_thread->Start.pointer_argument = pointer_argument;
11258f: 8b 45 0c mov 0xc(%ebp),%eax
112592: 89 83 98 00 00 00 mov %eax,0x98(%ebx)
the_thread->Start.numeric_argument = numeric_argument;
112598: 8b 45 10 mov 0x10(%ebp),%eax
11259b: 89 83 9c 00 00 00 mov %eax,0x9c(%ebx)
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
1125a1: 53 push %ebx
1125a2: e8 f9 c5 ff ff call 10eba0 <_Thread_queue_Extract_with_proxy>
1125a7: 83 c4 10 add $0x10,%esp
1125aa: 84 c0 test %al,%al
1125ac: 75 06 jne 1125b4 <_Thread_Reset+0x54>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
1125ae: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
1125b2: 74 28 je 1125dc <_Thread_Reset+0x7c>
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
1125b4: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax
1125ba: 39 43 14 cmp %eax,0x14(%ebx)
1125bd: 74 15 je 1125d4 <_Thread_Reset+0x74>
the_thread->real_priority = the_thread->Start.initial_priority;
1125bf: 89 43 18 mov %eax,0x18(%ebx)
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
1125c2: 89 45 0c mov %eax,0xc(%ebp)
1125c5: 89 5d 08 mov %ebx,0x8(%ebp)
}
}
1125c8: 8b 5d fc mov -0x4(%ebp),%ebx
1125cb: 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 );
1125cc: e9 ab c7 ff ff jmp 10ed7c <_Thread_Set_priority>
1125d1: 8d 76 00 lea 0x0(%esi),%esi
}
}
1125d4: 8b 5d fc mov -0x4(%ebp),%ebx
1125d7: c9 leave
1125d8: c3 ret
1125d9: 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 );
1125dc: 83 ec 0c sub $0xc,%esp
1125df: 8d 43 48 lea 0x48(%ebx),%eax
1125e2: 50 push %eax
1125e3: e8 7c ce ff ff call 10f464 <_Watchdog_Remove>
1125e8: 83 c4 10 add $0x10,%esp
1125eb: eb c7 jmp 1125b4 <_Thread_Reset+0x54>
001114f0 <_Thread_Resume>:
*/
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
1114f0: 55 push %ebp
1114f1: 89 e5 mov %esp,%ebp
1114f3: 53 push %ebx
1114f4: 83 ec 04 sub $0x4,%esp
1114f7: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
1114fa: 9c pushf
1114fb: fa cli
1114fc: 5b pop %ebx
current_state = the_thread->current_state;
1114fd: 8b 50 10 mov 0x10(%eax),%edx
if ( current_state & STATES_SUSPENDED ) {
111500: f6 c2 02 test $0x2,%dl
111503: 74 0a je 11150f <_Thread_Resume+0x1f> <== NEVER TAKEN
111505: 83 e2 fd and $0xfffffffd,%edx
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
111508: 89 50 10 mov %edx,0x10(%eax)
if ( _States_Is_ready( current_state ) ) {
11150b: 85 d2 test %edx,%edx
11150d: 74 09 je 111518 <_Thread_Resume+0x28>
_Scheduler_Unblock( the_thread );
}
}
_ISR_Enable( level );
11150f: 53 push %ebx
111510: 9d popf
}
111511: 8b 5d fc mov -0x4(%ebp),%ebx
111514: c9 leave
111515: c3 ret
111516: 66 90 xchg %ax,%ax
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Thread_Control *the_thread
)
{
_Scheduler.Operations.unblock( the_thread );
111518: 83 ec 0c sub $0xc,%esp
11151b: 50 push %eax
11151c: ff 15 74 72 12 00 call *0x127274
111522: 83 c4 10 add $0x10,%esp
111525: eb e8 jmp 11150f <_Thread_Resume+0x1f>
0010e23c <_Thread_Stack_Allocate>:
size_t _Thread_Stack_Allocate(
Thread_Control *the_thread,
size_t stack_size
)
{
10e23c: 55 push %ebp
10e23d: 89 e5 mov %esp,%ebp
10e23f: 53 push %ebx
10e240: 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;
10e243: a1 70 3a 12 00 mov 0x123a70,%eax
10e248: 8b 5d 0c mov 0xc(%ebp),%ebx
10e24b: 39 c3 cmp %eax,%ebx
10e24d: 73 02 jae 10e251 <_Thread_Stack_Allocate+0x15>
10e24f: 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 ) {
10e251: a1 a0 3a 12 00 mov 0x123aa0,%eax
10e256: 85 c0 test %eax,%eax
10e258: 74 32 je 10e28c <_Thread_Stack_Allocate+0x50>
stack_addr = (*Configuration.stack_allocate_hook)( the_stack_size );
10e25a: 83 ec 0c sub $0xc,%esp
10e25d: 53 push %ebx
10e25e: ff d0 call *%eax
10e260: 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 )
10e263: 85 c0 test %eax,%eax
10e265: 74 11 je 10e278 <_Thread_Stack_Allocate+0x3c>
the_stack_size = 0;
the_thread->Start.stack = stack_addr;
10e267: 8b 55 08 mov 0x8(%ebp),%edx
10e26a: 89 82 c4 00 00 00 mov %eax,0xc4(%edx)
return the_stack_size;
}
10e270: 89 d8 mov %ebx,%eax
10e272: 8b 5d fc mov -0x4(%ebp),%ebx
10e275: c9 leave
10e276: c3 ret
10e277: 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;
10e278: 31 db xor %ebx,%ebx
the_thread->Start.stack = stack_addr;
10e27a: 8b 55 08 mov 0x8(%ebp),%edx
10e27d: 89 82 c4 00 00 00 mov %eax,0xc4(%edx)
return the_stack_size;
}
10e283: 89 d8 mov %ebx,%eax
10e285: 8b 5d fc mov -0x4(%ebp),%ebx
10e288: c9 leave
10e289: c3 ret
10e28a: 66 90 xchg %ax,%ax
RTEMS_INLINE_ROUTINE uint32_t _Stack_Adjust_size (
size_t size
)
{
return size + CPU_STACK_ALIGNMENT;
10e28c: 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 );
10e28f: 83 ec 0c sub $0xc,%esp
10e292: 53 push %ebx
10e293: e8 f0 06 00 00 call 10e988 <_Workspace_Allocate>
10e298: 83 c4 10 add $0x10,%esp
10e29b: eb c6 jmp 10e263 <_Thread_Stack_Allocate+0x27>
0010e2a0 <_Thread_Stack_Free>:
*/
void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
10e2a0: 55 push %ebp
10e2a1: 89 e5 mov %esp,%ebp
10e2a3: 83 ec 08 sub $0x8,%esp
10e2a6: 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 )
10e2a9: 80 b8 b4 00 00 00 00 cmpb $0x0,0xb4(%eax)
10e2b0: 74 16 je 10e2c8 <_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 )
10e2b2: 8b 15 a4 3a 12 00 mov 0x123aa4,%edx
10e2b8: 85 d2 test %edx,%edx
10e2ba: 74 10 je 10e2cc <_Thread_Stack_Free+0x2c>
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
10e2bc: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax
10e2c2: 89 45 08 mov %eax,0x8(%ebp)
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
10e2c5: 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 );
10e2c6: ff e2 jmp *%edx
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}
10e2c8: c9 leave
10e2c9: c3 ret
10e2ca: 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 );
10e2cc: 8b 80 bc 00 00 00 mov 0xbc(%eax),%eax
10e2d2: 89 45 08 mov %eax,0x8(%ebp)
}
10e2d5: 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 );
10e2d6: e9 c9 06 00 00 jmp 10e9a4 <_Workspace_Free>
001118d8 <_Thread_Suspend>:
* select map
*/
void _Thread_Suspend(
Thread_Control *the_thread
)
{
1118d8: 55 push %ebp
1118d9: 89 e5 mov %esp,%ebp
1118db: 53 push %ebx
1118dc: 83 ec 04 sub $0x4,%esp
1118df: 8b 45 08 mov 0x8(%ebp),%eax
ISR_Level level;
_ISR_Disable( level );
1118e2: 9c pushf
1118e3: fa cli
1118e4: 5b pop %ebx
if ( !_States_Is_ready( the_thread->current_state ) ) {
1118e5: 8b 50 10 mov 0x10(%eax),%edx
1118e8: 85 d2 test %edx,%edx
1118ea: 74 10 je 1118fc <_Thread_Suspend+0x24>
1118ec: 83 ca 02 or $0x2,%edx
1118ef: 89 50 10 mov %edx,0x10(%eax)
the_thread->current_state =
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
1118f2: 53 push %ebx
1118f3: 9d popf
the_thread->current_state = STATES_SUSPENDED;
_Scheduler_Block( the_thread );
_ISR_Enable( level );
}
1118f4: 8b 5d fc mov -0x4(%ebp),%ebx
1118f7: c9 leave
1118f8: c3 ret
1118f9: 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;
1118fc: c7 40 10 02 00 00 00 movl $0x2,0x10(%eax)
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Block(
Thread_Control *the_thread
)
{
_Scheduler.Operations.block( the_thread );
111903: 83 ec 0c sub $0xc,%esp
111906: 50 push %eax
111907: ff 15 90 39 12 00 call *0x123990
_Scheduler_Block( the_thread );
_ISR_Enable( level );
11190d: 53 push %ebx
11190e: 9d popf
11190f: 83 c4 10 add $0x10,%esp
}
111912: 8b 5d fc mov -0x4(%ebp),%ebx
111915: c9 leave
111916: c3 ret
0010e398 <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
10e398: 55 push %ebp
10e399: 89 e5 mov %esp,%ebp
10e39b: 53 push %ebx
10e39c: 83 ec 04 sub $0x4,%esp
Thread_Control *executing;
executing = _Thread_Executing;
10e39f: 8b 1d 38 83 12 00 mov 0x128338,%ebx
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
10e3a5: 80 7b 74 00 cmpb $0x0,0x74(%ebx)
10e3a9: 74 19 je 10e3c4 <_Thread_Tickle_timeslice+0x2c>
return;
if ( !_States_Is_ready( executing->current_state ) )
10e3ab: 8b 43 10 mov 0x10(%ebx),%eax
10e3ae: 85 c0 test %eax,%eax
10e3b0: 75 12 jne 10e3c4 <_Thread_Tickle_timeslice+0x2c>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
10e3b2: 8b 43 7c mov 0x7c(%ebx),%eax
10e3b5: 83 f8 01 cmp $0x1,%eax
10e3b8: 72 0a jb 10e3c4 <_Thread_Tickle_timeslice+0x2c>
10e3ba: 83 f8 02 cmp $0x2,%eax
10e3bd: 76 29 jbe 10e3e8 <_Thread_Tickle_timeslice+0x50>
10e3bf: 83 f8 03 cmp $0x3,%eax
10e3c2: 74 08 je 10e3cc <_Thread_Tickle_timeslice+0x34><== ALWAYS TAKEN
if ( --executing->cpu_time_budget == 0 )
(*executing->budget_callout)( executing );
break;
#endif
}
}
10e3c4: 8b 5d fc mov -0x4(%ebp),%ebx
10e3c7: c9 leave
10e3c8: c3 ret
10e3c9: 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 )
10e3cc: 8b 43 78 mov 0x78(%ebx),%eax
10e3cf: 48 dec %eax
10e3d0: 89 43 78 mov %eax,0x78(%ebx)
10e3d3: 85 c0 test %eax,%eax
10e3d5: 75 ed jne 10e3c4 <_Thread_Tickle_timeslice+0x2c>
(*executing->budget_callout)( executing );
10e3d7: 83 ec 0c sub $0xc,%esp
10e3da: 53 push %ebx
10e3db: ff 93 80 00 00 00 call *0x80(%ebx)
10e3e1: 83 c4 10 add $0x10,%esp
10e3e4: eb de jmp 10e3c4 <_Thread_Tickle_timeslice+0x2c>
10e3e6: 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 ) {
10e3e8: 8b 43 78 mov 0x78(%ebx),%eax
10e3eb: 48 dec %eax
10e3ec: 89 43 78 mov %eax,0x78(%ebx)
10e3ef: 85 c0 test %eax,%eax
10e3f1: 7f d1 jg 10e3c4 <_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();
10e3f3: ff 15 8c 39 12 00 call *0x12398c
* 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;
10e3f9: a1 60 7d 12 00 mov 0x127d60,%eax
10e3fe: 89 43 78 mov %eax,0x78(%ebx)
10e401: eb c1 jmp 10e3c4 <_Thread_Tickle_timeslice+0x2c>
0010dd78 <_Thread_queue_Dequeue_priority>:
*/
Thread_Control *_Thread_queue_Dequeue_priority(
Thread_queue_Control *the_thread_queue
)
{
10dd78: 55 push %ebp
10dd79: 89 e5 mov %esp,%ebp
10dd7b: 57 push %edi
10dd7c: 56 push %esi
10dd7d: 53 push %ebx
10dd7e: 83 ec 2c sub $0x2c,%esp
10dd81: 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 );
10dd84: 9c pushf
10dd85: fa cli
10dd86: 58 pop %eax
10dd87: 89 f9 mov %edi,%ecx
for( index=0 ;
10dd89: 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 );
}
10dd8b: 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 );
10dd8d: 8d 34 52 lea (%edx,%edx,2),%esi
10dd90: 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 ] ) ) {
10dd94: 39 f3 cmp %esi,%ebx
10dd96: 75 18 jne 10ddb0 <_Thread_queue_Dequeue_priority+0x38>
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
10dd98: 42 inc %edx
10dd99: 83 c1 0c add $0xc,%ecx
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
10dd9c: 83 fa 04 cmp $0x4,%edx
10dd9f: 75 ea jne 10dd8b <_Thread_queue_Dequeue_priority+0x13>
}
/*
* We did not find a thread to unblock.
*/
_ISR_Enable( level );
10dda1: 50 push %eax
10dda2: 9d popf
return NULL;
10dda3: 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 );
}
10dda5: 89 f0 mov %esi,%eax
10dda7: 8d 65 f4 lea -0xc(%ebp),%esp
10ddaa: 5b pop %ebx
10ddab: 5e pop %esi
10ddac: 5f pop %edi
10ddad: c9 leave
10ddae: c3 ret
10ddaf: 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(
10ddb0: 89 de mov %ebx,%esi
*/
_ISR_Enable( level );
return NULL;
dequeue:
the_thread->Wait.queue = NULL;
10ddb2: 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 );
}
10ddb9: 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;
10ddbc: 8b 0b mov (%ebx),%ecx
previous_node = the_thread->Object.Node.previous;
10ddbe: 8b 7b 04 mov 0x4(%ebx),%edi
10ddc1: 89 7d d4 mov %edi,-0x2c(%ebp)
10ddc4: 8d 7b 3c lea 0x3c(%ebx),%edi
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
10ddc7: 39 fa cmp %edi,%edx
10ddc9: 74 7f je 10de4a <_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 );
}
10ddcb: 8b 7b 40 mov 0x40(%ebx),%edi
10ddce: 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;
10ddd1: 8b 3a mov (%edx),%edi
10ddd3: 89 7d e0 mov %edi,-0x20(%ebp)
previous_node->next = new_first_node;
10ddd6: 8b 7d d4 mov -0x2c(%ebp),%edi
10ddd9: 89 17 mov %edx,(%edi)
next_node->previous = new_first_node;
10dddb: 89 51 04 mov %edx,0x4(%ecx)
new_first_node->next = next_node;
10ddde: 89 0a mov %ecx,(%edx)
new_first_node->previous = previous_node;
10dde0: 89 7a 04 mov %edi,0x4(%edx)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
10dde3: 8b 4b 40 mov 0x40(%ebx),%ecx
10dde6: 39 4b 38 cmp %ecx,0x38(%ebx)
10dde9: 74 17 je 10de02 <_Thread_queue_Dequeue_priority+0x8a>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
10ddeb: 8d 4a 38 lea 0x38(%edx),%ecx
10ddee: 8b 7d e0 mov -0x20(%ebp),%edi
10ddf1: 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;
10ddf4: 89 7a 38 mov %edi,0x38(%edx)
tail->previous = last_node;
10ddf7: 8b 4d e4 mov -0x1c(%ebp),%ecx
10ddfa: 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 );
10ddfd: 83 c2 3c add $0x3c,%edx
10de00: 89 11 mov %edx,(%ecx)
} else {
previous_node->next = next_node;
next_node->previous = previous_node;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
10de02: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
10de06: 74 18 je 10de20 <_Thread_queue_Dequeue_priority+0xa8>
_ISR_Enable( level );
10de08: 50 push %eax
10de09: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
10de0a: 83 ec 08 sub $0x8,%esp
10de0d: 68 f8 ff 03 10 push $0x1003fff8
10de12: 53 push %ebx
10de13: e8 34 f8 ff ff call 10d64c <_Thread_Clear_state>
10de18: 83 c4 10 add $0x10,%esp
10de1b: eb 88 jmp 10dda5 <_Thread_queue_Dequeue_priority+0x2d>
10de1d: 8d 76 00 lea 0x0(%esi),%esi
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
10de20: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx)
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
10de27: 50 push %eax
10de28: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
10de29: 83 ec 0c sub $0xc,%esp
10de2c: 8d 43 48 lea 0x48(%ebx),%eax
10de2f: 50 push %eax
10de30: e8 2b 0a 00 00 call 10e860 <_Watchdog_Remove>
10de35: 58 pop %eax
10de36: 5a pop %edx
10de37: 68 f8 ff 03 10 push $0x1003fff8
10de3c: 53 push %ebx
10de3d: e8 0a f8 ff ff call 10d64c <_Thread_Clear_state>
10de42: 83 c4 10 add $0x10,%esp
10de45: e9 5b ff ff ff jmp 10dda5 <_Thread_queue_Dequeue_priority+0x2d>
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
10de4a: 8b 7d d4 mov -0x2c(%ebp),%edi
10de4d: 89 0f mov %ecx,(%edi)
next_node->previous = previous_node;
10de4f: 89 79 04 mov %edi,0x4(%ecx)
10de52: eb ae jmp 10de02 <_Thread_queue_Dequeue_priority+0x8a>
0010deec <_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
)
{
10deec: 55 push %ebp
10deed: 89 e5 mov %esp,%ebp
10deef: 57 push %edi
10def0: 56 push %esi
10def1: 53 push %ebx
10def2: 83 ec 0c sub $0xc,%esp
10def5: 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 );
10def8: 8d 47 3c lea 0x3c(%edi),%eax
10defb: 89 47 38 mov %eax,0x38(%edi)
head->next = tail;
head->previous = NULL;
10defe: 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 );
10df05: 8d 47 38 lea 0x38(%edi),%eax
10df08: 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;
10df0b: 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);
10df0e: 89 d0 mov %edx,%eax
10df10: 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;
10df13: 8b 4d 08 mov 0x8(%ebp),%ecx
10df16: 8b 59 38 mov 0x38(%ecx),%ebx
if ( _Thread_queue_Is_reverse_search( priority ) )
10df19: f6 c2 20 test $0x20,%dl
10df1c: 75 66 jne 10df84 <_Thread_queue_Enqueue_priority+0x98>
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10df1e: 8d 04 40 lea (%eax,%eax,2),%eax
10df21: 8d 04 81 lea (%ecx,%eax,4),%eax
10df24: 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));
10df27: 83 c0 04 add $0x4,%eax
10df2a: 89 7d e8 mov %edi,-0x18(%ebp)
10df2d: 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 );
10df2f: 9c pushf
10df30: fa cli
10df31: 5e pop %esi
10df32: 89 75 ec mov %esi,-0x14(%ebp)
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10df35: 8b 4d f0 mov -0x10(%ebp),%ecx
10df38: 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 ) ) {
10df3a: 39 f8 cmp %edi,%eax
10df3c: 75 18 jne 10df56 <_Thread_queue_Enqueue_priority+0x6a>
10df3e: e9 0e 01 00 00 jmp 10e051 <_Thread_queue_Enqueue_priority+0x165>
10df43: 90 nop
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
10df44: 56 push %esi
10df45: 9d popf
10df46: fa cli
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
10df47: 85 58 10 test %ebx,0x10(%eax)
10df4a: 0f 84 ac 00 00 00 je 10dffc <_Thread_queue_Enqueue_priority+0x110>
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
10df50: 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 ) ) {
10df52: 39 f8 cmp %edi,%eax
10df54: 74 07 je 10df5d <_Thread_queue_Enqueue_priority+0x71>
search_priority = search_thread->current_priority;
10df56: 8b 48 14 mov 0x14(%eax),%ecx
if ( priority <= search_priority )
10df59: 39 ca cmp %ecx,%edx
10df5b: 77 e7 ja 10df44 <_Thread_queue_Enqueue_priority+0x58>
10df5d: 8b 7d e8 mov -0x18(%ebp),%edi
10df60: 89 75 f0 mov %esi,-0x10(%ebp)
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
10df63: 8b 75 08 mov 0x8(%ebp),%esi
10df66: 8b 5e 30 mov 0x30(%esi),%ebx
10df69: 83 fb 01 cmp $0x1,%ebx
10df6c: 0f 84 92 00 00 00 je 10e004 <_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;
10df72: 8b 45 10 mov 0x10(%ebp),%eax
10df75: 8b 55 ec mov -0x14(%ebp),%edx
10df78: 89 10 mov %edx,(%eax)
return the_thread_queue->sync_state;
}
10df7a: 89 d8 mov %ebx,%eax
10df7c: 83 c4 0c add $0xc,%esp
10df7f: 5b pop %ebx
10df80: 5e pop %esi
10df81: 5f pop %edi
10df82: c9 leave
10df83: c3 ret
10df84: 8d 04 40 lea (%eax,%eax,2),%eax
10df87: 8b 4d 08 mov 0x8(%ebp),%ecx
10df8a: 8d 34 81 lea (%ecx,%eax,4),%esi
10df8d: 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;
10df90: 0f b6 0d 74 3a 12 00 movzbl 0x123a74,%ecx
10df97: 41 inc %ecx
_ISR_Disable( level );
10df98: 9c pushf
10df99: fa cli
10df9a: 5f pop %edi
10df9b: 89 7d ec mov %edi,-0x14(%ebp)
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10df9e: 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 ) ) {
10dfa1: 39 f0 cmp %esi,%eax
10dfa3: 75 12 jne 10dfb7 <_Thread_queue_Enqueue_priority+0xcb>
10dfa5: eb 17 jmp 10dfbe <_Thread_queue_Enqueue_priority+0xd2>
10dfa7: 90 nop
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
10dfa8: 57 push %edi
10dfa9: 9d popf
10dfaa: fa cli
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
10dfab: 85 58 10 test %ebx,0x10(%eax)
10dfae: 74 48 je 10dff8 <_Thread_queue_Enqueue_priority+0x10c><== NEVER TAKEN
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
10dfb0: 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 ) ) {
10dfb3: 39 f0 cmp %esi,%eax
10dfb5: 74 07 je 10dfbe <_Thread_queue_Enqueue_priority+0xd2>
search_priority = search_thread->current_priority;
10dfb7: 8b 48 14 mov 0x14(%eax),%ecx
if ( priority >= search_priority )
10dfba: 39 ca cmp %ecx,%edx
10dfbc: 72 ea jb 10dfa8 <_Thread_queue_Enqueue_priority+0xbc>
10dfbe: 89 7d e8 mov %edi,-0x18(%ebp)
10dfc1: 8b 7d f0 mov -0x10(%ebp),%edi
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
10dfc4: 8b 75 08 mov 0x8(%ebp),%esi
10dfc7: 8b 5e 30 mov 0x30(%esi),%ebx
10dfca: 83 fb 01 cmp $0x1,%ebx
10dfcd: 75 a3 jne 10df72 <_Thread_queue_Enqueue_priority+0x86>
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10dfcf: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
if ( priority == search_priority )
10dfd6: 39 ca cmp %ecx,%edx
10dfd8: 74 53 je 10e02d <_Thread_queue_Enqueue_priority+0x141>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
10dfda: 8b 10 mov (%eax),%edx
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
10dfdc: 89 17 mov %edx,(%edi)
the_node->previous = search_node;
10dfde: 89 47 04 mov %eax,0x4(%edi)
search_node->next = the_node;
10dfe1: 89 38 mov %edi,(%eax)
next_node->previous = the_node;
10dfe3: 89 7a 04 mov %edi,0x4(%edx)
the_thread->Wait.queue = the_thread_queue;
10dfe6: 89 77 44 mov %esi,0x44(%edi)
_ISR_Enable( level );
10dfe9: ff 75 e8 pushl -0x18(%ebp)
10dfec: 9d popf
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10dfed: 89 d8 mov %ebx,%eax
10dfef: 83 c4 0c add $0xc,%esp
10dff2: 5b pop %ebx
10dff3: 5e pop %esi
10dff4: 5f pop %edi
10dff5: c9 leave
10dff6: c3 ret
10dff7: 90 nop
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
10dff8: 57 push %edi <== NOT EXECUTED
10dff9: 9d popf <== NOT EXECUTED
goto restart_reverse_search;
10dffa: eb 94 jmp 10df90 <_Thread_queue_Enqueue_priority+0xa4><== NOT EXECUTED
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
10dffc: 56 push %esi
10dffd: 9d popf
goto restart_forward_search;
10dffe: e9 2c ff ff ff jmp 10df2f <_Thread_queue_Enqueue_priority+0x43>
10e003: 90 nop
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10e004: c7 46 30 00 00 00 00 movl $0x0,0x30(%esi)
if ( priority == search_priority )
10e00b: 39 ca cmp %ecx,%edx
10e00d: 74 1e je 10e02d <_Thread_queue_Enqueue_priority+0x141>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
10e00f: 8b 50 04 mov 0x4(%eax),%edx
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
10e012: 89 07 mov %eax,(%edi)
the_node->previous = previous_node;
10e014: 89 57 04 mov %edx,0x4(%edi)
previous_node->next = the_node;
10e017: 89 3a mov %edi,(%edx)
search_node->previous = the_node;
10e019: 89 78 04 mov %edi,0x4(%eax)
the_thread->Wait.queue = the_thread_queue;
10e01c: 89 77 44 mov %esi,0x44(%edi)
_ISR_Enable( level );
10e01f: ff 75 f0 pushl -0x10(%ebp)
10e022: 9d popf
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
10e023: 89 d8 mov %ebx,%eax
10e025: 83 c4 0c add $0xc,%esp
10e028: 5b pop %ebx
10e029: 5e pop %esi
10e02a: 5f pop %edi
10e02b: c9 leave
10e02c: 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;
10e02d: 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 );
10e030: 8d 48 3c lea 0x3c(%eax),%ecx
10e033: 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;
10e035: 89 57 04 mov %edx,0x4(%edi)
previous_node->next = the_node;
10e038: 89 3a mov %edi,(%edx)
search_node->previous = the_node;
10e03a: 89 78 40 mov %edi,0x40(%eax)
the_thread->Wait.queue = the_thread_queue;
10e03d: 8b 45 08 mov 0x8(%ebp),%eax
10e040: 89 47 44 mov %eax,0x44(%edi)
_ISR_Enable( level );
10e043: ff 75 ec pushl -0x14(%ebp)
10e046: 9d popf
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
10e047: bb 01 00 00 00 mov $0x1,%ebx
10e04c: e9 29 ff ff ff jmp 10df7a <_Thread_queue_Enqueue_priority+0x8e>
10e051: 8b 7d e8 mov -0x18(%ebp),%edi
10e054: 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;
10e057: b9 ff ff ff ff mov $0xffffffff,%ecx
10e05c: e9 02 ff ff ff jmp 10df63 <_Thread_queue_Enqueue_priority+0x77>
00111780 <_Thread_queue_Extract>:
void _Thread_queue_Extract(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
111780: 55 push %ebp
111781: 89 e5 mov %esp,%ebp
111783: 83 ec 08 sub $0x8,%esp
111786: 8b 45 08 mov 0x8(%ebp),%eax
111789: 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 )
11178c: 83 78 34 01 cmpl $0x1,0x34(%eax)
111790: 74 0e je 1117a0 <_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 );
111792: 89 55 0c mov %edx,0xc(%ebp)
111795: 89 45 08 mov %eax,0x8(%ebp)
}
111798: 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 );
111799: e9 de 19 00 00 jmp 11317c <_Thread_queue_Extract_fifo>
11179e: 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 );
1117a0: 51 push %ecx
1117a1: 6a 00 push $0x0
1117a3: 52 push %edx
1117a4: 50 push %eax
1117a5: e8 06 00 00 00 call 1117b0 <_Thread_queue_Extract_priority_helper>
1117aa: 83 c4 10 add $0x10,%esp
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
_Thread_queue_Extract_fifo( the_thread_queue, the_thread );
}
1117ad: c9 leave
1117ae: c3 ret
0011317c <_Thread_queue_Extract_fifo>:
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
11317c: 55 push %ebp
11317d: 89 e5 mov %esp,%ebp
11317f: 53 push %ebx
113180: 83 ec 04 sub $0x4,%esp
113183: 8b 5d 0c mov 0xc(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
113186: 9c pushf
113187: fa cli
113188: 58 pop %eax
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
113189: f7 43 10 e0 be 03 00 testl $0x3bee0,0x10(%ebx)
113190: 74 2e je 1131c0 <_Thread_queue_Extract_fifo+0x44>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
113192: 8b 0b mov (%ebx),%ecx
previous = the_node->previous;
113194: 8b 53 04 mov 0x4(%ebx),%edx
next->previous = previous;
113197: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
11319a: 89 0a mov %ecx,(%edx)
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
11319c: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx)
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
1131a3: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
1131a7: 74 1f je 1131c8 <_Thread_queue_Extract_fifo+0x4c>
_ISR_Enable( level );
1131a9: 50 push %eax
1131aa: 9d popf
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
1131ab: c7 45 0c f8 ff 03 10 movl $0x1003fff8,0xc(%ebp)
1131b2: 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
}
1131b5: 8b 5d fc mov -0x4(%ebp),%ebx
1131b8: c9 leave
1131b9: e9 8e a4 ff ff jmp 10d64c <_Thread_Clear_state>
1131be: 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 );
1131c0: 50 push %eax
1131c1: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
1131c2: 8b 5d fc mov -0x4(%ebp),%ebx
1131c5: c9 leave
1131c6: c3 ret
1131c7: 90 nop
1131c8: 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 );
1131cf: 50 push %eax
1131d0: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
1131d1: 83 ec 0c sub $0xc,%esp
1131d4: 8d 43 48 lea 0x48(%ebx),%eax
1131d7: 50 push %eax
1131d8: e8 83 b6 ff ff call 10e860 <_Watchdog_Remove>
1131dd: 83 c4 10 add $0x10,%esp
1131e0: eb c9 jmp 1131ab <_Thread_queue_Extract_fifo+0x2f>
001117b0 <_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
)
{
1117b0: 55 push %ebp
1117b1: 89 e5 mov %esp,%ebp
1117b3: 57 push %edi
1117b4: 56 push %esi
1117b5: 53 push %ebx
1117b6: 83 ec 1c sub $0x1c,%esp
1117b9: 8b 5d 0c mov 0xc(%ebp),%ebx
1117bc: 8a 45 10 mov 0x10(%ebp),%al
1117bf: 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 );
1117c2: 9c pushf
1117c3: fa cli
1117c4: 8f 45 e4 popl -0x1c(%ebp)
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
1117c7: f7 43 10 e0 be 03 00 testl $0x3bee0,0x10(%ebx)
1117ce: 74 6c je 11183c <_Thread_queue_Extract_priority_helper+0x8c>
/*
* The thread was actually waiting on a thread queue so let's remove it.
*/
next_node = the_node->next;
1117d0: 8b 13 mov (%ebx),%edx
previous_node = the_node->previous;
1117d2: 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
}
1117d5: 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 );
1117d8: 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 ) ) {
1117db: 39 f0 cmp %esi,%eax
1117dd: 74 69 je 111848 <_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
}
1117df: 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;
1117e2: 8b 30 mov (%eax),%esi
previous_node->next = new_first_node;
1117e4: 89 01 mov %eax,(%ecx)
next_node->previous = new_first_node;
1117e6: 89 42 04 mov %eax,0x4(%edx)
new_first_node->next = next_node;
1117e9: 89 10 mov %edx,(%eax)
new_first_node->previous = previous_node;
1117eb: 89 48 04 mov %ecx,0x4(%eax)
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
1117ee: 8b 53 40 mov 0x40(%ebx),%edx
1117f1: 39 53 38 cmp %edx,0x38(%ebx)
1117f4: 74 11 je 111807 <_Thread_queue_Extract_priority_helper+0x57>
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
1117f6: 8d 50 38 lea 0x38(%eax),%edx
1117f9: 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;
1117fc: 89 70 38 mov %esi,0x38(%eax)
tail->previous = last_node;
1117ff: 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 );
111802: 83 c0 3c add $0x3c,%eax
111805: 89 07 mov %eax,(%edi)
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
111807: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp)
11180b: 75 23 jne 111830 <_Thread_queue_Extract_priority_helper+0x80>
_ISR_Enable( level );
return;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
11180d: 83 7b 50 02 cmpl $0x2,0x50(%ebx)
111811: 74 3d je 111850 <_Thread_queue_Extract_priority_helper+0xa0>
_ISR_Enable( level );
111813: ff 75 e4 pushl -0x1c(%ebp)
111816: 9d popf
111817: c7 45 0c f8 ff 03 10 movl $0x1003fff8,0xc(%ebp)
11181e: 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
}
111821: 8d 65 f4 lea -0xc(%ebp),%esp
111824: 5b pop %ebx
111825: 5e pop %esi
111826: 5f pop %edi
111827: c9 leave
111828: e9 1f be ff ff jmp 10d64c <_Thread_Clear_state>
11182d: 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 );
111830: ff 75 e4 pushl -0x1c(%ebp)
111833: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
111834: 8d 65 f4 lea -0xc(%ebp),%esp
111837: 5b pop %ebx
111838: 5e pop %esi
111839: 5f pop %edi
11183a: c9 leave
11183b: 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 );
11183c: ff 75 e4 pushl -0x1c(%ebp)
11183f: 9d popf
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
111840: 8d 65 f4 lea -0xc(%ebp),%esp
111843: 5b pop %ebx
111844: 5e pop %esi
111845: 5f pop %edi
111846: c9 leave
111847: c3 ret
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
111848: 89 11 mov %edx,(%ecx)
next_node->previous = previous_node;
11184a: 89 4a 04 mov %ecx,0x4(%edx)
11184d: eb b8 jmp 111807 <_Thread_queue_Extract_priority_helper+0x57>
11184f: 90 nop
111850: 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 );
111857: ff 75 e4 pushl -0x1c(%ebp)
11185a: 9d popf
(void) _Watchdog_Remove( &the_thread->Timer );
11185b: 83 ec 0c sub $0xc,%esp
11185e: 8d 43 48 lea 0x48(%ebx),%eax
111861: 50 push %eax
111862: e8 f9 cf ff ff call 10e860 <_Watchdog_Remove>
111867: 83 c4 10 add $0x10,%esp
11186a: eb ab jmp 111817 <_Thread_queue_Extract_priority_helper+0x67>
0010e064 <_Thread_queue_Extract_with_proxy>:
*/
bool _Thread_queue_Extract_with_proxy(
Thread_Control *the_thread
)
{
10e064: 55 push %ebp
10e065: 89 e5 mov %esp,%ebp
10e067: 83 ec 08 sub $0x8,%esp
10e06a: 8b 45 08 mov 0x8(%ebp),%eax
States_Control state;
state = the_thread->current_state;
if ( _States_Is_waiting_on_thread_queue( state ) ) {
10e06d: f7 40 10 e0 be 03 00 testl $0x3bee0,0x10(%eax)
10e074: 75 06 jne 10e07c <_Thread_queue_Extract_with_proxy+0x18>
#endif
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
return true;
}
return false;
10e076: 31 c0 xor %eax,%eax
}
10e078: c9 leave
10e079: c3 ret
10e07a: 66 90 xchg %ax,%ax
if ( proxy_extract_callout )
(*proxy_extract_callout)( the_thread );
}
#endif
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
10e07c: 83 ec 08 sub $0x8,%esp
10e07f: 50 push %eax
10e080: ff 70 44 pushl 0x44(%eax)
10e083: e8 f8 36 00 00 call 111780 <_Thread_queue_Extract>
return true;
10e088: 83 c4 10 add $0x10,%esp
10e08b: b0 01 mov $0x1,%al
}
return false;
}
10e08d: c9 leave
10e08e: c3 ret
0010febc <_Thread_queue_First>:
*/
Thread_Control *_Thread_queue_First(
Thread_queue_Control *the_thread_queue
)
{
10febc: 55 push %ebp
10febd: 89 e5 mov %esp,%ebp
10febf: 83 ec 08 sub $0x8,%esp
10fec2: 8b 45 08 mov 0x8(%ebp),%eax
Thread_Control * (*first_p)(Thread_queue_Control *);
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
10fec5: 83 78 34 01 cmpl $0x1,0x34(%eax)
10fec9: 74 0d je 10fed8 <_Thread_queue_First+0x1c>
first_p = _Thread_queue_First_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
10fecb: ba 04 37 11 00 mov $0x113704,%edx
return (*first_p)( the_thread_queue );
10fed0: 89 45 08 mov %eax,0x8(%ebp)
}
10fed3: 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 );
10fed4: ff e2 jmp *%edx
10fed6: 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;
10fed8: ba e4 fe 10 00 mov $0x10fee4,%edx
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
first_p = _Thread_queue_First_fifo;
return (*first_p)( the_thread_queue );
10fedd: 89 45 08 mov %eax,0x8(%ebp)
}
10fee0: 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 );
10fee1: ff e2 jmp *%edx
00113704 <_Thread_queue_First_fifo>:
*/
Thread_Control *_Thread_queue_First_fifo(
Thread_queue_Control *the_thread_queue
)
{
113704: 55 push %ebp
113705: 89 e5 mov %esp,%ebp
113707: 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;
}
11370a: 8b 02 mov (%edx),%eax
11370c: 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 ) )
11370f: 39 d0 cmp %edx,%eax
113711: 74 05 je 113718 <_Thread_queue_First_fifo+0x14>
return (Thread_Control *) _Chain_First( &the_thread_queue->Queues.Fifo );
return NULL;
}
113713: c9 leave
113714: c3 ret
113715: 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;
113718: 31 c0 xor %eax,%eax
}
11371a: c9 leave
11371b: c3 ret
0010e090 <_Thread_queue_Flush>:
#else
Thread_queue_Flush_callout remote_extract_callout __attribute__((unused)),
#endif
uint32_t status
)
{
10e090: 55 push %ebp
10e091: 89 e5 mov %esp,%ebp
10e093: 56 push %esi
10e094: 53 push %ebx
10e095: 8b 5d 08 mov 0x8(%ebp),%ebx
10e098: 8b 75 10 mov 0x10(%ebp),%esi
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
10e09b: eb 06 jmp 10e0a3 <_Thread_queue_Flush+0x13>
10e09d: 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;
10e0a0: 89 70 34 mov %esi,0x34(%eax)
uint32_t status
)
{
Thread_Control *the_thread;
while ( (the_thread = _Thread_queue_Dequeue( the_thread_queue )) ) {
10e0a3: 83 ec 0c sub $0xc,%esp
10e0a6: 53 push %ebx
10e0a7: e8 80 fc ff ff call 10dd2c <_Thread_queue_Dequeue>
10e0ac: 83 c4 10 add $0x10,%esp
10e0af: 85 c0 test %eax,%eax
10e0b1: 75 ed jne 10e0a0 <_Thread_queue_Flush+0x10>
( *remote_extract_callout )( the_thread );
else
#endif
the_thread->Wait.return_code = status;
}
}
10e0b3: 8d 65 f8 lea -0x8(%ebp),%esp
10e0b6: 5b pop %ebx
10e0b7: 5e pop %esi
10e0b8: c9 leave
10e0b9: c3 ret
0010e0bc <_Thread_queue_Initialize>:
Thread_queue_Control *the_thread_queue,
Thread_queue_Disciplines the_discipline,
States_Control state,
uint32_t timeout_status
)
{
10e0bc: 55 push %ebp
10e0bd: 89 e5 mov %esp,%ebp
10e0bf: 56 push %esi
10e0c0: 53 push %ebx
10e0c1: 8b 45 08 mov 0x8(%ebp),%eax
10e0c4: 8b 55 0c mov 0xc(%ebp),%edx
the_thread_queue->state = state;
10e0c7: 8b 4d 10 mov 0x10(%ebp),%ecx
10e0ca: 89 48 38 mov %ecx,0x38(%eax)
the_thread_queue->discipline = the_discipline;
10e0cd: 89 50 34 mov %edx,0x34(%eax)
the_thread_queue->timeout_status = timeout_status;
10e0d0: 8b 4d 14 mov 0x14(%ebp),%ecx
10e0d3: 89 48 3c mov %ecx,0x3c(%eax)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
10e0d6: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
10e0dd: 83 fa 01 cmp $0x1,%edx
10e0e0: 74 16 je 10e0f8 <_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 );
10e0e2: 8d 50 04 lea 0x4(%eax),%edx
10e0e5: 89 10 mov %edx,(%eax)
head->next = tail;
head->previous = NULL;
10e0e7: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax)
tail->previous = head;
10e0ee: 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 );
}
}
10e0f1: 5b pop %ebx
10e0f2: 5e pop %esi
10e0f3: c9 leave
10e0f4: c3 ret
10e0f5: 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 ) {
10e0f8: 89 c1 mov %eax,%ecx
10e0fa: 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 );
10e0fc: 8d 1c 52 lea (%edx,%edx,2),%ebx
10e0ff: 8d 1c 98 lea (%eax,%ebx,4),%ebx
10e102: 8d 73 04 lea 0x4(%ebx),%esi
10e105: 89 31 mov %esi,(%ecx)
head->next = tail;
head->previous = NULL;
10e107: 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 );
10e10e: 89 59 08 mov %ebx,0x8(%ecx)
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++)
10e111: 42 inc %edx
10e112: 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 ;
10e115: 83 fa 04 cmp $0x4,%edx
10e118: 75 e2 jne 10e0fc <_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 );
}
}
10e11a: 5b pop %ebx
10e11b: 5e pop %esi
10e11c: c9 leave
10e11d: c3 ret
0011186c <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
11186c: 55 push %ebp
11186d: 89 e5 mov %esp,%ebp
11186f: 83 ec 08 sub $0x8,%esp
111872: 8b 45 08 mov 0x8(%ebp),%eax
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
111875: 8b 50 44 mov 0x44(%eax),%edx
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
111878: 8b 4a 30 mov 0x30(%edx),%ecx
11187b: 85 c9 test %ecx,%ecx
11187d: 74 08 je 111887 <_Thread_queue_Process_timeout+0x1b>
11187f: 3b 05 38 83 12 00 cmp 0x128338,%eax
111885: 74 15 je 11189c <_Thread_queue_Process_timeout+0x30><== ALWAYS TAKEN
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
111887: 8b 4a 3c mov 0x3c(%edx),%ecx
11188a: 89 48 34 mov %ecx,0x34(%eax)
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
11188d: 83 ec 08 sub $0x8,%esp
111890: 50 push %eax
111891: 52 push %edx
111892: e8 e9 fe ff ff call 111780 <_Thread_queue_Extract>
111897: 83 c4 10 add $0x10,%esp
}
}
11189a: c9 leave
11189b: c3 ret
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
11189c: 83 f9 03 cmp $0x3,%ecx
11189f: 74 f9 je 11189a <_Thread_queue_Process_timeout+0x2e>
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
1118a1: 8b 4a 3c mov 0x3c(%edx),%ecx
1118a4: 89 48 34 mov %ecx,0x34(%eax)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
1118a7: c7 42 30 02 00 00 00 movl $0x2,0x30(%edx)
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
}
}
1118ae: c9 leave
1118af: c3 ret
0010e120 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
10e120: 55 push %ebp
10e121: 89 e5 mov %esp,%ebp
10e123: 57 push %edi
10e124: 56 push %esi
10e125: 53 push %ebx
10e126: 83 ec 1c sub $0x1c,%esp
10e129: 8b 75 08 mov 0x8(%ebp),%esi
10e12c: 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 )
10e12f: 85 f6 test %esi,%esi
10e131: 74 06 je 10e139 <_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 ) {
10e133: 83 7e 34 01 cmpl $0x1,0x34(%esi)
10e137: 74 0b je 10e144 <_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 );
}
}
10e139: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10e13c: 5b pop %ebx <== NOT EXECUTED
10e13d: 5e pop %esi <== NOT EXECUTED
10e13e: 5f pop %edi <== NOT EXECUTED
10e13f: c9 leave <== NOT EXECUTED
10e140: c3 ret <== NOT EXECUTED
10e141: 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 );
10e144: 9c pushf
10e145: fa cli
10e146: 5b pop %ebx
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
10e147: f7 47 10 e0 be 03 00 testl $0x3bee0,0x10(%edi)
10e14e: 75 0c jne 10e15c <_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 );
10e150: 53 push %ebx
10e151: 9d popf
}
}
10e152: 8d 65 f4 lea -0xc(%ebp),%esp
10e155: 5b pop %ebx
10e156: 5e pop %esi
10e157: 5f pop %edi
10e158: c9 leave
10e159: c3 ret
10e15a: 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;
10e15c: 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 );
10e163: 50 push %eax
10e164: 6a 01 push $0x1
10e166: 57 push %edi
10e167: 56 push %esi
10e168: e8 43 36 00 00 call 1117b0 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
10e16d: 83 c4 0c add $0xc,%esp
10e170: 8d 45 e4 lea -0x1c(%ebp),%eax
10e173: 50 push %eax
10e174: 57 push %edi
10e175: 56 push %esi
10e176: e8 71 fd ff ff call 10deec <_Thread_queue_Enqueue_priority>
10e17b: 83 c4 10 add $0x10,%esp
10e17e: eb d0 jmp 10e150 <_Thread_queue_Requeue+0x30>
0010e180 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
10e180: 55 push %ebp
10e181: 89 e5 mov %esp,%ebp
10e183: 83 ec 20 sub $0x20,%esp
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10e186: 8d 45 f4 lea -0xc(%ebp),%eax
10e189: 50 push %eax
10e18a: ff 75 08 pushl 0x8(%ebp)
10e18d: e8 42 f8 ff ff call 10d9d4 <_Thread_Get>
switch ( location ) {
10e192: 83 c4 10 add $0x10,%esp
10e195: 8b 55 f4 mov -0xc(%ebp),%edx
10e198: 85 d2 test %edx,%edx
10e19a: 75 17 jne 10e1b3 <_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 );
10e19c: 83 ec 0c sub $0xc,%esp
10e19f: 50 push %eax
10e1a0: e8 c7 36 00 00 call 11186c <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
10e1a5: a1 90 7d 12 00 mov 0x127d90,%eax
10e1aa: 48 dec %eax
10e1ab: a3 90 7d 12 00 mov %eax,0x127d90
10e1b0: 83 c4 10 add $0x10,%esp
_Thread_Unnest_dispatch();
break;
}
}
10e1b3: c9 leave
10e1b4: c3 ret
00118db8 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
118db8: 55 push %ebp
118db9: 89 e5 mov %esp,%ebp
118dbb: 57 push %edi
118dbc: 56 push %esi
118dbd: 53 push %ebx
118dbe: 83 ec 4c sub $0x4c,%esp
118dc1: 8b 5d 08 mov 0x8(%ebp),%ebx
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
118dc4: 8d 45 e0 lea -0x20(%ebp),%eax
118dc7: 89 45 b4 mov %eax,-0x4c(%ebp)
118dca: 89 45 dc mov %eax,-0x24(%ebp)
head->previous = NULL;
118dcd: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
tail->previous = head;
118dd4: 8d 4d dc lea -0x24(%ebp),%ecx
118dd7: 89 4d e4 mov %ecx,-0x1c(%ebp)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
118dda: 8d 7d d0 lea -0x30(%ebp),%edi
118ddd: 8d 45 d4 lea -0x2c(%ebp),%eax
118de0: 89 45 b0 mov %eax,-0x50(%ebp)
118de3: 89 45 d0 mov %eax,-0x30(%ebp)
head->previous = NULL;
118de6: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp)
tail->previous = head;
118ded: 89 7d d8 mov %edi,-0x28(%ebp)
118df0: 8d 73 30 lea 0x30(%ebx),%esi
118df3: 8d 4b 68 lea 0x68(%ebx),%ecx
118df6: 89 4d c4 mov %ecx,-0x3c(%ebp)
118df9: 8d 43 08 lea 0x8(%ebx),%eax
118dfc: 89 45 bc mov %eax,-0x44(%ebp)
118dff: 8d 53 40 lea 0x40(%ebx),%edx
118e02: 89 55 c0 mov %edx,-0x40(%ebp)
118e05: 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;
118e08: 8d 4d dc lea -0x24(%ebp),%ecx
118e0b: 89 4b 78 mov %ecx,0x78(%ebx)
118e0e: 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;
118e10: a1 64 2b 14 00 mov 0x142b64,%eax
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
118e15: 8b 53 3c mov 0x3c(%ebx),%edx
watchdogs->last_snapshot = snapshot;
118e18: 89 43 3c mov %eax,0x3c(%ebx)
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118e1b: 51 push %ecx
118e1c: 57 push %edi
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
118e1d: 29 d0 sub %edx,%eax
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118e1f: 50 push %eax
118e20: 56 push %esi
118e21: e8 9e 3f 00 00 call 11cdc4 <_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();
118e26: a1 c8 2a 14 00 mov 0x142ac8,%eax
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
118e2b: 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 ) {
118e2e: 83 c4 10 add $0x10,%esp
118e31: 39 d0 cmp %edx,%eax
118e33: 0f 87 af 00 00 00 ja 118ee8 <_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 ) {
118e39: 0f 82 c9 00 00 00 jb 118f08 <_Timer_server_Body+0x150>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
118e3f: 89 43 74 mov %eax,0x74(%ebx)
118e42: 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 );
118e44: 8b 43 78 mov 0x78(%ebx),%eax
118e47: 83 ec 0c sub $0xc,%esp
118e4a: 50 push %eax
118e4b: e8 0c 0a 00 00 call 11985c <_Chain_Get>
if ( timer == NULL ) {
118e50: 83 c4 10 add $0x10,%esp
118e53: 85 c0 test %eax,%eax
118e55: 74 35 je 118e8c <_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 ) {
118e57: 8b 50 38 mov 0x38(%eax),%edx <== NOT EXECUTED
118e5a: 83 fa 01 cmp $0x1,%edx <== NOT EXECUTED
118e5d: 74 19 je 118e78 <_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 ) {
118e5f: 83 fa 03 cmp $0x3,%edx <== NOT EXECUTED
118e62: 75 e0 jne 118e44 <_Timer_server_Body+0x8c><== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
118e64: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
118e67: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
118e6a: 50 push %eax <== NOT EXECUTED
118e6b: ff 75 c4 pushl -0x3c(%ebp) <== NOT EXECUTED
118e6e: e8 dd 3f 00 00 call 11ce50 <_Watchdog_Insert> <== NOT EXECUTED
118e73: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
118e76: eb cc jmp 118e44 <_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 );
118e78: 83 ec 08 sub $0x8,%esp <== NOT EXECUTED
118e7b: 83 c0 10 add $0x10,%eax <== NOT EXECUTED
118e7e: 50 push %eax <== NOT EXECUTED
118e7f: 56 push %esi <== NOT EXECUTED
118e80: e8 cb 3f 00 00 call 11ce50 <_Watchdog_Insert> <== NOT EXECUTED
118e85: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
118e88: eb ba jmp 118e44 <_Timer_server_Body+0x8c><== NOT EXECUTED
118e8a: 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 );
118e8c: 9c pushf
118e8d: fa cli
118e8e: 58 pop %eax
tmp = ts->insert_chain;
118e8f: 8b 53 78 mov 0x78(%ebx),%edx
if ( _Chain_Is_empty( insert_chain ) ) {
118e92: 8b 55 b4 mov -0x4c(%ebp),%edx
118e95: 39 55 dc cmp %edx,-0x24(%ebp)
118e98: 0f 84 86 00 00 00 je 118f24 <_Timer_server_Body+0x16c><== ALWAYS TAKEN
118e9e: b2 01 mov $0x1,%dl <== NOT EXECUTED
ts->insert_chain = NULL;
do_loop = false;
}
_ISR_Enable( level );
118ea0: 50 push %eax
118ea1: 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 ) {
118ea2: 84 d2 test %dl,%dl
118ea4: 0f 85 66 ff ff ff jne 118e10 <_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 ) ) {
118eaa: 8b 4d b0 mov -0x50(%ebp),%ecx
118ead: 39 4d d0 cmp %ecx,-0x30(%ebp)
118eb0: 75 22 jne 118ed4 <_Timer_server_Body+0x11c>
118eb2: eb 7e jmp 118f32 <_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;
118eb4: 8b 10 mov (%eax),%edx
head->next = new_first;
118eb6: 89 55 d0 mov %edx,-0x30(%ebp)
new_first->previous = head;
118eb9: 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;
118ebc: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax)
_ISR_Enable( level );
118ec3: 51 push %ecx
118ec4: 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 );
118ec5: 83 ec 08 sub $0x8,%esp
118ec8: ff 70 24 pushl 0x24(%eax)
118ecb: ff 70 20 pushl 0x20(%eax)
118ece: ff 50 1c call *0x1c(%eax)
}
118ed1: 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 );
118ed4: 9c pushf
118ed5: fa cli
118ed6: 59 pop %ecx
initialized = false;
}
#endif
return status;
}
118ed7: 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))
118eda: 3b 45 b0 cmp -0x50(%ebp),%eax
118edd: 75 d5 jne 118eb4 <_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 );
118edf: 51 push %ecx
118ee0: 9d popf
118ee1: e9 22 ff ff ff jmp 118e08 <_Timer_server_Body+0x50>
118ee6: 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 );
118ee8: 51 push %ecx
118ee9: 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;
118eea: 89 c1 mov %eax,%ecx
118eec: 29 d1 sub %edx,%ecx
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
118eee: 51 push %ecx
118eef: ff 75 c4 pushl -0x3c(%ebp)
118ef2: 89 45 b8 mov %eax,-0x48(%ebp)
118ef5: e8 ca 3e 00 00 call 11cdc4 <_Watchdog_Adjust_to_chain>
118efa: 83 c4 10 add $0x10,%esp
118efd: 8b 45 b8 mov -0x48(%ebp),%eax
118f00: e9 3a ff ff ff jmp 118e3f <_Timer_server_Body+0x87>
118f05: 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 );
118f08: 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;
118f09: 29 c2 sub %eax,%edx
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
118f0b: 52 push %edx
118f0c: 6a 01 push $0x1
118f0e: ff 75 c4 pushl -0x3c(%ebp)
118f11: 89 45 b8 mov %eax,-0x48(%ebp)
118f14: e8 33 3e 00 00 call 11cd4c <_Watchdog_Adjust>
118f19: 83 c4 10 add $0x10,%esp
118f1c: 8b 45 b8 mov -0x48(%ebp),%eax
118f1f: e9 1b ff ff ff jmp 118e3f <_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;
118f24: c7 43 78 00 00 00 00 movl $0x0,0x78(%ebx)
do_loop = false;
118f2b: 31 d2 xor %edx,%edx
118f2d: e9 6e ff ff ff jmp 118ea0 <_Timer_server_Body+0xe8>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
118f32: c6 43 7c 00 movb $0x0,0x7c(%ebx)
118f36: a1 30 2a 14 00 mov 0x142a30,%eax
118f3b: 40 inc %eax
118f3c: a3 30 2a 14 00 mov %eax,0x142a30
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
118f41: 83 ec 08 sub $0x8,%esp
118f44: 6a 08 push $0x8
118f46: ff 33 pushl (%ebx)
118f48: e8 e7 37 00 00 call 11c734 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
118f4d: 89 d8 mov %ebx,%eax
118f4f: e8 c4 fd ff ff call 118d18 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
118f54: 89 d8 mov %ebx,%eax
118f56: e8 0d fe ff ff call 118d68 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
118f5b: e8 f4 2e 00 00 call 11be54 <_Thread_Enable_dispatch>
ts->active = true;
118f60: 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 );
118f64: 5a pop %edx
118f65: ff 75 bc pushl -0x44(%ebp)
118f68: e8 23 40 00 00 call 11cf90 <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
118f6d: 58 pop %eax
118f6e: ff 75 c0 pushl -0x40(%ebp)
118f71: e8 1a 40 00 00 call 11cf90 <_Watchdog_Remove>
118f76: 83 c4 10 add $0x10,%esp
118f79: e9 8a fe ff ff jmp 118e08 <_Timer_server_Body+0x50>
00118f80 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
118f80: 55 push %ebp
118f81: 89 e5 mov %esp,%ebp
118f83: 57 push %edi
118f84: 56 push %esi
118f85: 53 push %ebx
118f86: 83 ec 2c sub $0x2c,%esp
118f89: 8b 5d 08 mov 0x8(%ebp),%ebx
118f8c: 8b 45 0c mov 0xc(%ebp),%eax
if ( ts->insert_chain == NULL ) {
118f8f: 8b 53 78 mov 0x78(%ebx),%edx
118f92: 85 d2 test %edx,%edx
118f94: 74 16 je 118fac <_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 );
118f96: 8b 53 78 mov 0x78(%ebx),%edx <== NOT EXECUTED
118f99: 89 45 0c mov %eax,0xc(%ebp) <== NOT EXECUTED
118f9c: 89 55 08 mov %edx,0x8(%ebp) <== NOT EXECUTED
}
}
118f9f: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
118fa2: 5b pop %ebx <== NOT EXECUTED
118fa3: 5e pop %esi <== NOT EXECUTED
118fa4: 5f pop %edi <== NOT EXECUTED
118fa5: 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 );
118fa6: e9 75 08 00 00 jmp 119820 <_Chain_Append> <== NOT EXECUTED
118fab: 90 nop <== NOT EXECUTED
118fac: 8b 15 30 2a 14 00 mov 0x142a30,%edx
118fb2: 42 inc %edx
118fb3: 89 15 30 2a 14 00 mov %edx,0x142a30
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
118fb9: 8b 50 38 mov 0x38(%eax),%edx
118fbc: 83 fa 01 cmp $0x1,%edx
118fbf: 74 7b je 11903c <_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 ) {
118fc1: 83 fa 03 cmp $0x3,%edx
118fc4: 74 0e je 118fd4 <_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 );
}
}
118fc6: 8d 65 f4 lea -0xc(%ebp),%esp
118fc9: 5b pop %ebx
118fca: 5e pop %esi
118fcb: 5f pop %edi
118fcc: c9 leave
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
118fcd: e9 82 2e 00 00 jmp 11be54 <_Thread_Enable_dispatch>
118fd2: 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 );
118fd4: 9c pushf
118fd5: fa cli
118fd6: 8f 45 e4 popl -0x1c(%ebp)
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
118fd9: 8b 0d c8 2a 14 00 mov 0x142ac8,%ecx
last_snapshot = ts->TOD_watchdogs.last_snapshot;
118fdf: 8b 53 74 mov 0x74(%ebx),%edx
118fe2: 89 55 d4 mov %edx,-0x2c(%ebp)
initialized = false;
}
#endif
return status;
}
118fe5: 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 );
118fe8: 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 ) ) {
118feb: 39 fa cmp %edi,%edx
118fed: 74 21 je 119010 <_Timer_server_Schedule_operation_method+0x90>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
118fef: 8b 7a 10 mov 0x10(%edx),%edi
if ( snapshot > last_snapshot ) {
118ff2: 3b 4d d4 cmp -0x2c(%ebp),%ecx
118ff5: 0f 86 a1 00 00 00 jbe 11909c <_Timer_server_Schedule_operation_method+0x11c>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
118ffb: 89 ce mov %ecx,%esi
118ffd: 2b 75 d4 sub -0x2c(%ebp),%esi
119000: 89 75 d4 mov %esi,-0x2c(%ebp)
if (delta_interval > delta) {
119003: 39 f7 cmp %esi,%edi
119005: 0f 86 9b 00 00 00 jbe 1190a6 <_Timer_server_Schedule_operation_method+0x126><== NEVER TAKEN
delta_interval -= delta;
11900b: 29 f7 sub %esi,%edi
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
11900d: 89 7a 10 mov %edi,0x10(%edx)
}
ts->TOD_watchdogs.last_snapshot = snapshot;
119010: 89 4b 74 mov %ecx,0x74(%ebx)
_ISR_Enable( level );
119013: ff 75 e4 pushl -0x1c(%ebp)
119016: 9d popf
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
119017: 83 ec 08 sub $0x8,%esp
11901a: 83 c0 10 add $0x10,%eax
11901d: 50 push %eax
11901e: 8d 43 68 lea 0x68(%ebx),%eax
119021: 50 push %eax
119022: e8 29 3e 00 00 call 11ce50 <_Watchdog_Insert>
if ( !ts->active ) {
119027: 8a 43 7c mov 0x7c(%ebx),%al
11902a: 83 c4 10 add $0x10,%esp
11902d: 84 c0 test %al,%al
11902f: 75 95 jne 118fc6 <_Timer_server_Schedule_operation_method+0x46>
_Timer_server_Reset_tod_system_watchdog( ts );
119031: 89 d8 mov %ebx,%eax
119033: e8 30 fd ff ff call 118d68 <_Timer_server_Reset_tod_system_watchdog>
119038: eb 8c jmp 118fc6 <_Timer_server_Schedule_operation_method+0x46>
11903a: 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 );
11903c: 9c pushf
11903d: fa cli
11903e: 8f 45 e4 popl -0x1c(%ebp)
snapshot = _Watchdog_Ticks_since_boot;
119041: 8b 0d 64 2b 14 00 mov 0x142b64,%ecx
last_snapshot = ts->Interval_watchdogs.last_snapshot;
119047: 8b 7b 3c mov 0x3c(%ebx),%edi
initialized = false;
}
#endif
return status;
}
11904a: 8b 53 30 mov 0x30(%ebx),%edx
11904d: 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 ) ) {
119050: 39 f2 cmp %esi,%edx
119052: 74 10 je 119064 <_Timer_server_Schedule_operation_method+0xe4>
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
119054: 89 ce mov %ecx,%esi
119056: 29 fe sub %edi,%esi
delta_interval = first_watchdog->delta_interval;
119058: 8b 7a 10 mov 0x10(%edx),%edi
if (delta_interval > delta) {
11905b: 39 fe cmp %edi,%esi
11905d: 73 39 jae 119098 <_Timer_server_Schedule_operation_method+0x118>
delta_interval -= delta;
11905f: 29 f7 sub %esi,%edi
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
119061: 89 7a 10 mov %edi,0x10(%edx)
}
ts->Interval_watchdogs.last_snapshot = snapshot;
119064: 89 4b 3c mov %ecx,0x3c(%ebx)
_ISR_Enable( level );
119067: ff 75 e4 pushl -0x1c(%ebp)
11906a: 9d popf
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
11906b: 83 ec 08 sub $0x8,%esp
11906e: 83 c0 10 add $0x10,%eax
119071: 50 push %eax
119072: 8d 43 30 lea 0x30(%ebx),%eax
119075: 50 push %eax
119076: e8 d5 3d 00 00 call 11ce50 <_Watchdog_Insert>
if ( !ts->active ) {
11907b: 8a 43 7c mov 0x7c(%ebx),%al
11907e: 83 c4 10 add $0x10,%esp
119081: 84 c0 test %al,%al
119083: 0f 85 3d ff ff ff jne 118fc6 <_Timer_server_Schedule_operation_method+0x46>
_Timer_server_Reset_interval_system_watchdog( ts );
119089: 89 d8 mov %ebx,%eax
11908b: e8 88 fc ff ff call 118d18 <_Timer_server_Reset_interval_system_watchdog>
119090: e9 31 ff ff ff jmp 118fc6 <_Timer_server_Schedule_operation_method+0x46>
119095: 8d 76 00 lea 0x0(%esi),%esi
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
119098: 31 ff xor %edi,%edi
11909a: eb c5 jmp 119061 <_Timer_server_Schedule_operation_method+0xe1>
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
11909c: 03 7d d4 add -0x2c(%ebp),%edi
delta_interval += delta;
11909f: 29 cf sub %ecx,%edi
1190a1: e9 67 ff ff ff jmp 11900d <_Timer_server_Schedule_operation_method+0x8d>
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
1190a6: 31 ff xor %edi,%edi <== NOT EXECUTED
1190a8: e9 60 ff ff ff jmp 11900d <_Timer_server_Schedule_operation_method+0x8d><== NOT EXECUTED
0010fc38 <_Timespec_Divide>:
const struct timespec *lhs,
const struct timespec *rhs,
uint32_t *ival_percentage,
uint32_t *fval_percentage
)
{
10fc38: 55 push %ebp
10fc39: 89 e5 mov %esp,%ebp
10fc3b: 57 push %edi
10fc3c: 56 push %esi
10fc3d: 53 push %ebx
10fc3e: 83 ec 2c sub $0x2c,%esp
10fc41: 8b 45 08 mov 0x8(%ebp),%eax
10fc44: 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;
10fc47: 8b 38 mov (%eax),%edi
left += lhs->tv_nsec;
10fc49: 8b 70 04 mov 0x4(%eax),%esi
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
10fc4c: bb 00 ca 9a 3b mov $0x3b9aca00,%ebx
10fc51: 8b 01 mov (%ecx),%eax
10fc53: f7 eb imul %ebx
10fc55: 89 45 e0 mov %eax,-0x20(%ebp)
10fc58: 89 55 e4 mov %edx,-0x1c(%ebp)
right += rhs->tv_nsec;
10fc5b: 8b 41 04 mov 0x4(%ecx),%eax
10fc5e: 99 cltd
10fc5f: 01 45 e0 add %eax,-0x20(%ebp)
10fc62: 11 55 e4 adc %edx,-0x1c(%ebp)
if ( right == 0 ) {
10fc65: 8b 55 e4 mov -0x1c(%ebp),%edx
10fc68: 0b 55 e0 or -0x20(%ebp),%edx
10fc6b: 74 73 je 10fce0 <_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;
10fc6d: 89 f8 mov %edi,%eax
10fc6f: f7 eb imul %ebx
10fc71: 89 45 d0 mov %eax,-0x30(%ebp)
10fc74: 89 55 d4 mov %edx,-0x2c(%ebp)
left += lhs->tv_nsec;
10fc77: 89 f7 mov %esi,%edi
10fc79: c1 ff 1f sar $0x1f,%edi
10fc7c: 01 75 d0 add %esi,-0x30(%ebp)
10fc7f: 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;
10fc82: 69 4d d4 a0 86 01 00 imul $0x186a0,-0x2c(%ebp),%ecx
10fc89: bb a0 86 01 00 mov $0x186a0,%ebx
10fc8e: 8b 45 d0 mov -0x30(%ebp),%eax
10fc91: f7 e3 mul %ebx
10fc93: 8d 34 11 lea (%ecx,%edx,1),%esi
10fc96: ff 75 e4 pushl -0x1c(%ebp)
10fc99: ff 75 e0 pushl -0x20(%ebp)
10fc9c: 56 push %esi
10fc9d: 50 push %eax
10fc9e: e8 29 12 01 00 call 120ecc <__udivdi3>
10fca3: 83 c4 10 add $0x10,%esp
10fca6: 89 c3 mov %eax,%ebx
10fca8: 89 d6 mov %edx,%esi
*ival_percentage = answer / 1000;
10fcaa: 6a 00 push $0x0
10fcac: 68 e8 03 00 00 push $0x3e8
10fcb1: 52 push %edx
10fcb2: 50 push %eax
10fcb3: e8 14 12 01 00 call 120ecc <__udivdi3>
10fcb8: 83 c4 10 add $0x10,%esp
10fcbb: 8b 55 10 mov 0x10(%ebp),%edx
10fcbe: 89 02 mov %eax,(%edx)
*fval_percentage = answer % 1000;
10fcc0: 6a 00 push $0x0
10fcc2: 68 e8 03 00 00 push $0x3e8
10fcc7: 56 push %esi
10fcc8: 53 push %ebx
10fcc9: e8 0e 13 01 00 call 120fdc <__umoddi3>
10fcce: 83 c4 10 add $0x10,%esp
10fcd1: 8b 55 14 mov 0x14(%ebp),%edx
10fcd4: 89 02 mov %eax,(%edx)
}
10fcd6: 8d 65 f4 lea -0xc(%ebp),%esp
10fcd9: 5b pop %ebx
10fcda: 5e pop %esi
10fcdb: 5f pop %edi
10fcdc: c9 leave
10fcdd: c3 ret
10fcde: 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;
10fce0: 8b 45 10 mov 0x10(%ebp),%eax
10fce3: c7 00 00 00 00 00 movl $0x0,(%eax)
*fval_percentage = 0;
10fce9: 8b 55 14 mov 0x14(%ebp),%edx
10fcec: c7 02 00 00 00 00 movl $0x0,(%edx)
answer = (left * 100000) / right;
*ival_percentage = answer / 1000;
*fval_percentage = answer % 1000;
}
10fcf2: 8d 65 f4 lea -0xc(%ebp),%esp
10fcf5: 5b pop %ebx
10fcf6: 5e pop %esi
10fcf7: 5f pop %edi
10fcf8: c9 leave
10fcf9: c3 ret
0011ff98 <_Timespec_Is_valid>:
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
const struct timespec *time
)
{
11ff98: 55 push %ebp
11ff99: 89 e5 mov %esp,%ebp
11ff9b: 8b 45 08 mov 0x8(%ebp),%eax
if ( !time )
11ff9e: 85 c0 test %eax,%eax
11ffa0: 74 1a je 11ffbc <_Timespec_Is_valid+0x24>
return false;
if ( time->tv_sec < 0 )
11ffa2: 8b 10 mov (%eax),%edx
11ffa4: 85 d2 test %edx,%edx
11ffa6: 78 14 js 11ffbc <_Timespec_Is_valid+0x24>
return false;
if ( time->tv_nsec < 0 )
11ffa8: 8b 40 04 mov 0x4(%eax),%eax
11ffab: 85 c0 test %eax,%eax
11ffad: 78 0d js 11ffbc <_Timespec_Is_valid+0x24>
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
11ffaf: 3d ff c9 9a 3b cmp $0x3b9ac9ff,%eax
11ffb4: 0f 96 c0 setbe %al
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
11ffb7: c9 leave
11ffb8: c3 ret
11ffb9: 8d 76 00 lea 0x0(%esi),%esi
if ( time->tv_sec < 0 )
return false;
if ( time->tv_nsec < 0 )
return false;
11ffbc: 31 c0 xor %eax,%eax
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
11ffbe: c9 leave
11ffbf: c3 ret
00111918 <_Timespec_To_ticks>:
*/
uint32_t _Timespec_To_ticks(
const struct timespec *time
)
{
111918: 55 push %ebp
111919: 89 e5 mov %esp,%ebp
11191b: 56 push %esi
11191c: 53 push %ebx
11191d: 8b 5d 08 mov 0x8(%ebp),%ebx
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
111920: 8b 33 mov (%ebx),%esi
111922: 85 f6 test %esi,%esi
111924: 75 07 jne 11192d <_Timespec_To_ticks+0x15>
111926: 8b 43 04 mov 0x4(%ebx),%eax
111929: 85 c0 test %eax,%eax
11192b: 74 37 je 111964 <_Timespec_To_ticks+0x4c>
return 0;
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
11192d: e8 62 17 00 00 call 113094 <TOD_TICKS_PER_SECOND_method>
111932: 89 c1 mov %eax,%ecx
111934: 0f af ce imul %esi,%ecx
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
111937: a1 8c 3a 12 00 mov 0x123a8c,%eax
11193c: 8d 04 80 lea (%eax,%eax,4),%eax
11193f: 8d 04 80 lea (%eax,%eax,4),%eax
111942: 8d 34 80 lea (%eax,%eax,4),%esi
111945: c1 e6 03 shl $0x3,%esi
111948: 8b 43 04 mov 0x4(%ebx),%eax
11194b: 31 d2 xor %edx,%edx
11194d: f7 f6 div %esi
if (ticks)
11194f: 01 c8 add %ecx,%eax
111951: 74 05 je 111958 <_Timespec_To_ticks+0x40>
return ticks;
return 1;
}
111953: 5b pop %ebx
111954: 5e pop %esi
111955: c9 leave
111956: c3 ret
111957: 90 nop
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
if (ticks)
return ticks;
return 1;
111958: b8 01 00 00 00 mov $0x1,%eax
}
11195d: 5b pop %ebx
11195e: 5e pop %esi
11195f: c9 leave
111960: c3 ret
111961: 8d 76 00 lea 0x0(%esi),%esi
)
{
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
return 0;
111964: 31 c0 xor %eax,%eax
if (ticks)
return ticks;
return 1;
}
111966: 5b pop %ebx
111967: 5e pop %esi
111968: c9 leave
111969: c3 ret
0010e5bc <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
10e5bc: 55 push %ebp
10e5bd: 89 e5 mov %esp,%ebp
10e5bf: 57 push %edi
10e5c0: 56 push %esi
10e5c1: 53 push %ebx
10e5c2: 83 ec 1c sub $0x1c,%esp
10e5c5: 8b 75 08 mov 0x8(%ebp),%esi
10e5c8: 8b 7d 10 mov 0x10(%ebp),%edi
10e5cb: 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 );
}
}
10e5ce: 8b 1d b4 7f 12 00 mov 0x127fb4,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5d4: 81 fb ac 7f 12 00 cmp $0x127fac,%ebx
10e5da: 74 25 je 10e601 <_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 );
10e5dc: 0f b6 c0 movzbl %al,%eax
10e5df: 89 45 e4 mov %eax,-0x1c(%ebp)
10e5e2: 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 )
10e5e4: 8b 43 30 mov 0x30(%ebx),%eax
10e5e7: 85 c0 test %eax,%eax
10e5e9: 74 0b je 10e5f6 <_User_extensions_Fatal+0x3a>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
10e5eb: 52 push %edx
10e5ec: 57 push %edi
10e5ed: ff 75 e4 pushl -0x1c(%ebp)
10e5f0: 56 push %esi
10e5f1: ff d0 call *%eax
10e5f3: 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 ) {
10e5f6: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5f9: 81 fb ac 7f 12 00 cmp $0x127fac,%ebx
10e5ff: 75 e3 jne 10e5e4 <_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 );
}
}
10e601: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10e604: 5b pop %ebx <== NOT EXECUTED
10e605: 5e pop %esi <== NOT EXECUTED
10e606: 5f pop %edi <== NOT EXECUTED
10e607: c9 leave <== NOT EXECUTED
10e608: c3 ret <== NOT EXECUTED
0010e480 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
10e480: 55 push %ebp
10e481: 89 e5 mov %esp,%ebp
10e483: 57 push %edi
10e484: 56 push %esi
10e485: 53 push %ebx
10e486: 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;
10e489: a1 b8 3a 12 00 mov 0x123ab8,%eax
10e48e: 89 45 dc mov %eax,-0x24(%ebp)
initial_extensions = Configuration.User_extension_table;
10e491: 8b 35 bc 3a 12 00 mov 0x123abc,%esi
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10e497: c7 05 ac 7f 12 00 b0 movl $0x127fb0,0x127fac
10e49e: 7f 12 00
head->previous = NULL;
10e4a1: c7 05 b0 7f 12 00 00 movl $0x0,0x127fb0
10e4a8: 00 00 00
tail->previous = head;
10e4ab: c7 05 b4 7f 12 00 ac movl $0x127fac,0x127fb4
10e4b2: 7f 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10e4b5: c7 05 94 7d 12 00 98 movl $0x127d98,0x127d94
10e4bc: 7d 12 00
head->previous = NULL;
10e4bf: c7 05 98 7d 12 00 00 movl $0x0,0x127d98
10e4c6: 00 00 00
tail->previous = head;
10e4c9: c7 05 9c 7d 12 00 94 movl $0x127d94,0x127d9c
10e4d0: 7d 12 00
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
10e4d3: 85 f6 test %esi,%esi
10e4d5: 74 64 je 10e53b <_User_extensions_Handler_initialization+0xbb><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
10e4d7: 89 c2 mov %eax,%edx
10e4d9: 8d 04 40 lea (%eax,%eax,2),%eax
10e4dc: 8d 0c 82 lea (%edx,%eax,4),%ecx
10e4df: c1 e1 02 shl $0x2,%ecx
10e4e2: 83 ec 0c sub $0xc,%esp
10e4e5: 51 push %ecx
10e4e6: 89 4d d8 mov %ecx,-0x28(%ebp)
10e4e9: e8 ce 04 00 00 call 10e9bc <_Workspace_Allocate_or_fatal_error>
10e4ee: 89 c3 mov %eax,%ebx
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
10e4f0: 31 c0 xor %eax,%eax
10e4f2: 8b 4d d8 mov -0x28(%ebp),%ecx
10e4f5: 89 df mov %ebx,%edi
10e4f7: f3 aa rep stos %al,%es:(%edi)
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10e4f9: 83 c4 10 add $0x10,%esp
10e4fc: 8b 45 dc mov -0x24(%ebp),%eax
10e4ff: 85 c0 test %eax,%eax
10e501: 74 38 je 10e53b <_User_extensions_Handler_initialization+0xbb><== NEVER TAKEN
10e503: 89 75 e4 mov %esi,-0x1c(%ebp)
10e506: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
10e50d: 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;
10e510: 8d 7b 14 lea 0x14(%ebx),%edi
10e513: 8b 75 e4 mov -0x1c(%ebp),%esi
10e516: b9 08 00 00 00 mov $0x8,%ecx
10e51b: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_User_extensions_Add_set( extension );
10e51d: 83 ec 0c sub $0xc,%esp
10e520: 53 push %ebx
10e521: e8 46 34 00 00 call 11196c <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
10e526: 83 c3 34 add $0x34,%ebx
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
10e529: ff 45 e0 incl -0x20(%ebp)
10e52c: 83 45 e4 20 addl $0x20,-0x1c(%ebp)
10e530: 83 c4 10 add $0x10,%esp
10e533: 8b 45 e0 mov -0x20(%ebp),%eax
10e536: 39 45 dc cmp %eax,-0x24(%ebp)
10e539: 77 d5 ja 10e510 <_User_extensions_Handler_initialization+0x90>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
10e53b: 8d 65 f4 lea -0xc(%ebp),%esp
10e53e: 5b pop %ebx
10e53f: 5e pop %esi
10e540: 5f pop %edi
10e541: c9 leave
10e542: c3 ret
0010fa00 <_User_extensions_Remove_set>:
#include <rtems/score/userext.h>
void _User_extensions_Remove_set (
User_extensions_Control *the_extension
)
{
10fa00: 55 push %ebp
10fa01: 89 e5 mov %esp,%ebp
10fa03: 53 push %ebx
10fa04: 83 ec 10 sub $0x10,%esp
10fa07: 8b 5d 08 mov 0x8(%ebp),%ebx
_Chain_Extract( &the_extension->Node );
10fa0a: 53 push %ebx
10fa0b: e8 88 d9 ff ff call 10d398 <_Chain_Extract>
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
10fa10: 83 c4 10 add $0x10,%esp
10fa13: 8b 43 24 mov 0x24(%ebx),%eax
10fa16: 85 c0 test %eax,%eax
10fa18: 74 12 je 10fa2c <_User_extensions_Remove_set+0x2c>
_Chain_Extract( &the_extension->Switch.Node );
10fa1a: 83 c3 08 add $0x8,%ebx
10fa1d: 89 5d 08 mov %ebx,0x8(%ebp)
}
10fa20: 8b 5d fc mov -0x4(%ebp),%ebx
10fa23: c9 leave
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
_Chain_Extract( &the_extension->Switch.Node );
10fa24: e9 6f d9 ff ff jmp 10d398 <_Chain_Extract>
10fa29: 8d 76 00 lea 0x0(%esi),%esi
}
10fa2c: 8b 5d fc mov -0x4(%ebp),%ebx
10fa2f: c9 leave
10fa30: c3 ret
0010e544 <_User_extensions_Thread_begin>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
10e544: 55 push %ebp
10e545: 89 e5 mov %esp,%ebp
10e547: 56 push %esi
10e548: 53 push %ebx
10e549: 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 );
}
}
10e54c: 8b 1d ac 7f 12 00 mov 0x127fac,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e552: 81 fb b0 7f 12 00 cmp $0x127fb0,%ebx
10e558: 74 1c je 10e576 <_User_extensions_Thread_begin+0x32><== NEVER TAKEN
10e55a: 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 )
10e55c: 8b 43 28 mov 0x28(%ebx),%eax
10e55f: 85 c0 test %eax,%eax
10e561: 74 09 je 10e56c <_User_extensions_Thread_begin+0x28>
(*the_extension->Callouts.thread_begin)( executing );
10e563: 83 ec 0c sub $0xc,%esp
10e566: 56 push %esi
10e567: ff d0 call *%eax
10e569: 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 ) {
10e56c: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e56e: 81 fb b0 7f 12 00 cmp $0x127fb0,%ebx
10e574: 75 e6 jne 10e55c <_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 );
}
}
10e576: 8d 65 f8 lea -0x8(%ebp),%esp
10e579: 5b pop %ebx
10e57a: 5e pop %esi
10e57b: c9 leave
10e57c: c3 ret
0010e60c <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
10e60c: 55 push %ebp
10e60d: 89 e5 mov %esp,%ebp
10e60f: 56 push %esi
10e610: 53 push %ebx
10e611: 8b 75 08 mov 0x8(%ebp),%esi
return false;
}
}
return true;
}
10e614: 8b 1d ac 7f 12 00 mov 0x127fac,%ebx
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
10e61a: 81 fb b0 7f 12 00 cmp $0x127fb0,%ebx
10e620: 74 26 je 10e648 <_User_extensions_Thread_create+0x3c><== NEVER TAKEN
10e622: 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 ) {
10e624: 8b 43 14 mov 0x14(%ebx),%eax
10e627: 85 c0 test %eax,%eax
10e629: 74 13 je 10e63e <_User_extensions_Thread_create+0x32>
status = (*the_extension->Callouts.thread_create)(
10e62b: 83 ec 08 sub $0x8,%esp
10e62e: 56 push %esi
10e62f: ff 35 38 83 12 00 pushl 0x128338
10e635: ff d0 call *%eax
_Thread_Executing,
the_thread
);
if ( !status )
10e637: 83 c4 10 add $0x10,%esp
10e63a: 84 c0 test %al,%al
10e63c: 74 16 je 10e654 <_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 ) {
10e63e: 8b 1b mov (%ebx),%ebx
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
10e640: 81 fb b0 7f 12 00 cmp $0x127fb0,%ebx
10e646: 75 dc jne 10e624 <_User_extensions_Thread_create+0x18>
if ( !status )
return false;
}
}
return true;
10e648: b0 01 mov $0x1,%al
}
10e64a: 8d 65 f8 lea -0x8(%ebp),%esp
10e64d: 5b pop %ebx
10e64e: 5e pop %esi
10e64f: c9 leave
10e650: c3 ret
10e651: 8d 76 00 lea 0x0(%esi),%esi
status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
if ( !status )
return false;
10e654: 31 c0 xor %eax,%eax
}
}
return true;
}
10e656: 8d 65 f8 lea -0x8(%ebp),%esp
10e659: 5b pop %ebx
10e65a: 5e pop %esi
10e65b: c9 leave
10e65c: c3 ret
0010e660 <_User_extensions_Thread_delete>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
10e660: 55 push %ebp
10e661: 89 e5 mov %esp,%ebp
10e663: 56 push %esi
10e664: 53 push %ebx
10e665: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
10e668: 8b 1d b4 7f 12 00 mov 0x127fb4,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e66e: 81 fb ac 7f 12 00 cmp $0x127fac,%ebx
10e674: 74 23 je 10e699 <_User_extensions_Thread_delete+0x39><== NEVER TAKEN
10e676: 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 )
10e678: 8b 43 20 mov 0x20(%ebx),%eax
10e67b: 85 c0 test %eax,%eax
10e67d: 74 0f je 10e68e <_User_extensions_Thread_delete+0x2e>
(*the_extension->Callouts.thread_delete)(
10e67f: 83 ec 08 sub $0x8,%esp
10e682: 56 push %esi
10e683: ff 35 38 83 12 00 pushl 0x128338
10e689: ff d0 call *%eax
10e68b: 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 ) {
10e68e: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e691: 81 fb ac 7f 12 00 cmp $0x127fac,%ebx
10e697: 75 df jne 10e678 <_User_extensions_Thread_delete+0x18>
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
10e699: 8d 65 f8 lea -0x8(%ebp),%esp
10e69c: 5b pop %ebx
10e69d: 5e pop %esi
10e69e: c9 leave
10e69f: c3 ret
0010e580 <_User_extensions_Thread_exitted>:
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
10e580: 55 push %ebp
10e581: 89 e5 mov %esp,%ebp
10e583: 56 push %esi
10e584: 53 push %ebx
10e585: 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 );
}
}
10e588: 8b 1d b4 7f 12 00 mov 0x127fb4,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e58e: 81 fb ac 7f 12 00 cmp $0x127fac,%ebx
10e594: 74 1d je 10e5b3 <_User_extensions_Thread_exitted+0x33><== NEVER TAKEN
10e596: 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 )
10e598: 8b 43 2c mov 0x2c(%ebx),%eax
10e59b: 85 c0 test %eax,%eax
10e59d: 74 09 je 10e5a8 <_User_extensions_Thread_exitted+0x28>
(*the_extension->Callouts.thread_exitted)( executing );
10e59f: 83 ec 0c sub $0xc,%esp
10e5a2: 56 push %esi
10e5a3: ff d0 call *%eax
10e5a5: 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 ) {
10e5a8: 8b 5b 04 mov 0x4(%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
10e5ab: 81 fb ac 7f 12 00 cmp $0x127fac,%ebx
10e5b1: 75 e5 jne 10e598 <_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 );
}
}
10e5b3: 8d 65 f8 lea -0x8(%ebp),%esp
10e5b6: 5b pop %ebx
10e5b7: 5e pop %esi
10e5b8: c9 leave
10e5b9: c3 ret
0010f264 <_User_extensions_Thread_restart>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
10f264: 55 push %ebp
10f265: 89 e5 mov %esp,%ebp
10f267: 56 push %esi
10f268: 53 push %ebx
10f269: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
10f26c: 8b 1d cc a2 12 00 mov 0x12a2cc,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10f272: 81 fb d0 a2 12 00 cmp $0x12a2d0,%ebx
10f278: 74 22 je 10f29c <_User_extensions_Thread_restart+0x38><== NEVER TAKEN
10f27a: 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 )
10f27c: 8b 43 1c mov 0x1c(%ebx),%eax
10f27f: 85 c0 test %eax,%eax
10f281: 74 0f je 10f292 <_User_extensions_Thread_restart+0x2e>
(*the_extension->Callouts.thread_restart)(
10f283: 83 ec 08 sub $0x8,%esp
10f286: 56 push %esi
10f287: ff 35 58 a6 12 00 pushl 0x12a658
10f28d: ff d0 call *%eax
10f28f: 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 ) {
10f292: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10f294: 81 fb d0 a2 12 00 cmp $0x12a2d0,%ebx
10f29a: 75 e0 jne 10f27c <_User_extensions_Thread_restart+0x18>
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
10f29c: 8d 65 f8 lea -0x8(%ebp),%esp
10f29f: 5b pop %ebx
10f2a0: 5e pop %esi
10f2a1: c9 leave
10f2a2: c3 ret
0010e6a0 <_User_extensions_Thread_start>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
10e6a0: 55 push %ebp
10e6a1: 89 e5 mov %esp,%ebp
10e6a3: 56 push %esi
10e6a4: 53 push %ebx
10e6a5: 8b 75 08 mov 0x8(%ebp),%esi
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
10e6a8: 8b 1d ac 7f 12 00 mov 0x127fac,%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e6ae: 81 fb b0 7f 12 00 cmp $0x127fb0,%ebx
10e6b4: 74 22 je 10e6d8 <_User_extensions_Thread_start+0x38><== NEVER TAKEN
10e6b6: 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 )
10e6b8: 8b 43 18 mov 0x18(%ebx),%eax
10e6bb: 85 c0 test %eax,%eax
10e6bd: 74 0f je 10e6ce <_User_extensions_Thread_start+0x2e>
(*the_extension->Callouts.thread_start)(
10e6bf: 83 ec 08 sub $0x8,%esp
10e6c2: 56 push %esi
10e6c3: ff 35 38 83 12 00 pushl 0x128338
10e6c9: ff d0 call *%eax
10e6cb: 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 ) {
10e6ce: 8b 1b mov (%ebx),%ebx
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
10e6d0: 81 fb b0 7f 12 00 cmp $0x127fb0,%ebx
10e6d6: 75 e0 jne 10e6b8 <_User_extensions_Thread_start+0x18>
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
10e6d8: 8d 65 f8 lea -0x8(%ebp),%esp
10e6db: 5b pop %ebx
10e6dc: 5e pop %esi
10e6dd: c9 leave
10e6de: c3 ret
0010e6e0 <_User_extensions_Thread_switch>:
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
10e6e0: 55 push %ebp
10e6e1: 89 e5 mov %esp,%ebp
10e6e3: 57 push %edi
10e6e4: 56 push %esi
10e6e5: 53 push %ebx
10e6e6: 83 ec 0c sub $0xc,%esp
10e6e9: 8b 7d 08 mov 0x8(%ebp),%edi
10e6ec: 8b 75 0c mov 0xc(%ebp),%esi
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
10e6ef: 8b 1d 94 7d 12 00 mov 0x127d94,%ebx
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
10e6f5: 81 fb 98 7d 12 00 cmp $0x127d98,%ebx
10e6fb: 74 18 je 10e715 <_User_extensions_Thread_switch+0x35><== NEVER TAKEN
10e6fd: 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 );
10e700: 83 ec 08 sub $0x8,%esp
10e703: 56 push %esi
10e704: 57 push %edi
10e705: 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 ) {
10e708: 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 );
10e70a: 83 c4 10 add $0x10,%esp
10e70d: 81 fb 98 7d 12 00 cmp $0x127d98,%ebx
10e713: 75 eb jne 10e700 <_User_extensions_Thread_switch+0x20>
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
10e715: 8d 65 f4 lea -0xc(%ebp),%esp
10e718: 5b pop %ebx
10e719: 5e pop %esi
10e71a: 5f pop %edi
10e71b: c9 leave
10e71c: c3 ret
00110018 <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
110018: 55 push %ebp
110019: 89 e5 mov %esp,%ebp
11001b: 57 push %edi
11001c: 56 push %esi
11001d: 53 push %ebx
11001e: 83 ec 1c sub $0x1c,%esp
110021: 8b 75 08 mov 0x8(%ebp),%esi
110024: 8b 4d 0c mov 0xc(%ebp),%ecx
110027: 8b 5d 10 mov 0x10(%ebp),%ebx
ISR_Level level;
_ISR_Disable( level );
11002a: 9c pushf
11002b: fa cli
11002c: 58 pop %eax
}
}
_ISR_Enable( level );
}
11002d: 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 );
11002f: 8d 7e 04 lea 0x4(%esi),%edi
110032: 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 ) ) {
110035: 39 fa cmp %edi,%edx
110037: 74 3d je 110076 <_Watchdog_Adjust+0x5e>
switch ( direction ) {
110039: 85 c9 test %ecx,%ecx
11003b: 75 43 jne 110080 <_Watchdog_Adjust+0x68>
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
11003d: 85 db test %ebx,%ebx
11003f: 74 35 je 110076 <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
110041: 8b 7a 10 mov 0x10(%edx),%edi
110044: 39 fb cmp %edi,%ebx
110046: 73 0f jae 110057 <_Watchdog_Adjust+0x3f> <== ALWAYS TAKEN
110048: eb 3e jmp 110088 <_Watchdog_Adjust+0x70> <== NOT EXECUTED
11004a: 66 90 xchg %ax,%ax <== NOT EXECUTED
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
11004c: 29 fb sub %edi,%ebx
11004e: 74 26 je 110076 <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
110050: 8b 7a 10 mov 0x10(%edx),%edi
110053: 39 df cmp %ebx,%edi
110055: 77 31 ja 110088 <_Watchdog_Adjust+0x70>
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
110057: c7 42 10 01 00 00 00 movl $0x1,0x10(%edx)
_ISR_Enable( level );
11005e: 50 push %eax
11005f: 9d popf
_Watchdog_Tickle( header );
110060: 83 ec 0c sub $0xc,%esp
110063: 56 push %esi
110064: e8 d3 01 00 00 call 11023c <_Watchdog_Tickle>
_ISR_Disable( level );
110069: 9c pushf
11006a: fa cli
11006b: 58 pop %eax
}
}
_ISR_Enable( level );
}
11006c: 8b 16 mov (%esi),%edx
_Watchdog_Tickle( header );
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
11006e: 83 c4 10 add $0x10,%esp
110071: 39 55 e4 cmp %edx,-0x1c(%ebp)
110074: 75 d6 jne 11004c <_Watchdog_Adjust+0x34>
}
break;
}
}
_ISR_Enable( level );
110076: 50 push %eax
110077: 9d popf
}
110078: 8d 65 f4 lea -0xc(%ebp),%esp
11007b: 5b pop %ebx
11007c: 5e pop %esi
11007d: 5f pop %edi
11007e: c9 leave
11007f: c3 ret
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
110080: 49 dec %ecx
110081: 75 f3 jne 110076 <_Watchdog_Adjust+0x5e> <== NEVER TAKEN
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
110083: 01 5a 10 add %ebx,0x10(%edx)
break;
110086: eb ee jmp 110076 <_Watchdog_Adjust+0x5e>
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
110088: 29 df sub %ebx,%edi
11008a: 89 7a 10 mov %edi,0x10(%edx)
break;
11008d: eb e7 jmp 110076 <_Watchdog_Adjust+0x5e>
0010e720 <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
10e720: 55 push %ebp
10e721: 89 e5 mov %esp,%ebp
10e723: 57 push %edi
10e724: 56 push %esi
10e725: 53 push %ebx
10e726: 83 ec 04 sub $0x4,%esp
10e729: 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;
10e72c: 8b 3d 34 83 12 00 mov 0x128334,%edi
_ISR_Disable( level );
10e732: 9c pushf
10e733: fa cli
10e734: 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 ) {
10e737: 8b 43 08 mov 0x8(%ebx),%eax
10e73a: 85 c0 test %eax,%eax
10e73c: 0f 85 9e 00 00 00 jne 10e7e0 <_Watchdog_Insert+0xc0>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
10e742: c7 43 08 01 00 00 00 movl $0x1,0x8(%ebx)
_Watchdog_Sync_count++;
10e749: a1 c0 7e 12 00 mov 0x127ec0,%eax
10e74e: 40 inc %eax
10e74f: a3 c0 7e 12 00 mov %eax,0x127ec0
restart:
delta_interval = the_watchdog->initial;
10e754: 8b 43 0c mov 0xc(%ebx),%eax
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
10e757: 8b 4d 08 mov 0x8(%ebp),%ecx
10e75a: 8b 11 mov (%ecx),%edx
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
10e75c: 85 c0 test %eax,%eax
10e75e: 74 5d je 10e7bd <_Watchdog_Insert+0x9d>
10e760: 8b 32 mov (%edx),%esi
10e762: 85 f6 test %esi,%esi
10e764: 74 57 je 10e7bd <_Watchdog_Insert+0x9d>
break;
if ( delta_interval < after->delta_interval ) {
10e766: 8b 4a 10 mov 0x10(%edx),%ecx
10e769: 39 c8 cmp %ecx,%eax
10e76b: 73 22 jae 10e78f <_Watchdog_Insert+0x6f>
10e76d: eb 49 jmp 10e7b8 <_Watchdog_Insert+0x98>
10e76f: 90 nop
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
10e770: 8b 35 44 7e 12 00 mov 0x127e44,%esi
10e776: 39 f7 cmp %esi,%edi
10e778: 72 72 jb 10e7ec <_Watchdog_Insert+0xcc>
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
10e77a: 29 c8 sub %ecx,%eax
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
10e77c: 8b 12 mov (%edx),%edx
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
10e77e: 85 c0 test %eax,%eax
10e780: 74 3b je 10e7bd <_Watchdog_Insert+0x9d>
10e782: 8b 0a mov (%edx),%ecx
10e784: 85 c9 test %ecx,%ecx
10e786: 74 35 je 10e7bd <_Watchdog_Insert+0x9d>
break;
if ( delta_interval < after->delta_interval ) {
10e788: 8b 4a 10 mov 0x10(%edx),%ecx
10e78b: 39 c1 cmp %eax,%ecx
10e78d: 77 29 ja 10e7b8 <_Watchdog_Insert+0x98>
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
10e78f: ff 75 f0 pushl -0x10(%ebp)
10e792: 9d popf
10e793: fa cli
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
10e794: 83 7b 08 01 cmpl $0x1,0x8(%ebx)
10e798: 74 d6 je 10e770 <_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;
10e79a: 89 3d 44 7e 12 00 mov %edi,0x127e44
_Watchdog_Sync_count--;
10e7a0: a1 c0 7e 12 00 mov 0x127ec0,%eax
10e7a5: 48 dec %eax
10e7a6: a3 c0 7e 12 00 mov %eax,0x127ec0
_ISR_Enable( level );
10e7ab: ff 75 f0 pushl -0x10(%ebp)
10e7ae: 9d popf
}
10e7af: 58 pop %eax
10e7b0: 5b pop %ebx
10e7b1: 5e pop %esi
10e7b2: 5f pop %edi
10e7b3: c9 leave
10e7b4: c3 ret
10e7b5: 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;
10e7b8: 29 c1 sub %eax,%ecx
10e7ba: 89 4a 10 mov %ecx,0x10(%edx)
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
10e7bd: c7 43 08 02 00 00 00 movl $0x2,0x8(%ebx)
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
10e7c4: 89 43 10 mov %eax,0x10(%ebx)
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
10e7c7: 8b 42 04 mov 0x4(%edx),%eax
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
10e7ca: 89 43 04 mov %eax,0x4(%ebx)
before_node = after_node->next;
10e7cd: 8b 10 mov (%eax),%edx
after_node->next = the_node;
10e7cf: 89 18 mov %ebx,(%eax)
the_node->next = before_node;
10e7d1: 89 13 mov %edx,(%ebx)
before_node->previous = the_node;
10e7d3: 89 5a 04 mov %ebx,0x4(%edx)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
10e7d6: a1 c4 7e 12 00 mov 0x127ec4,%eax
10e7db: 89 43 14 mov %eax,0x14(%ebx)
10e7de: eb ba jmp 10e79a <_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 );
10e7e0: ff 75 f0 pushl -0x10(%ebp)
10e7e3: 9d popf
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
10e7e4: 58 pop %eax
10e7e5: 5b pop %ebx
10e7e6: 5e pop %esi
10e7e7: 5f pop %edi
10e7e8: c9 leave
10e7e9: c3 ret
10e7ea: 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;
10e7ec: 89 3d 44 7e 12 00 mov %edi,0x127e44
goto restart;
10e7f2: e9 5d ff ff ff jmp 10e754 <_Watchdog_Insert+0x34>
0010e860 <_Watchdog_Remove>:
*/
Watchdog_States _Watchdog_Remove(
Watchdog_Control *the_watchdog
)
{
10e860: 55 push %ebp
10e861: 89 e5 mov %esp,%ebp
10e863: 56 push %esi
10e864: 53 push %ebx
10e865: 8b 55 08 mov 0x8(%ebp),%edx
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
10e868: 9c pushf
10e869: fa cli
10e86a: 59 pop %ecx
previous_state = the_watchdog->state;
10e86b: 8b 42 08 mov 0x8(%edx),%eax
switch ( previous_state ) {
10e86e: 83 f8 01 cmp $0x1,%eax
10e871: 74 4d je 10e8c0 <_Watchdog_Remove+0x60>
10e873: 73 0f jae 10e884 <_Watchdog_Remove+0x24>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
10e875: 8b 1d c4 7e 12 00 mov 0x127ec4,%ebx
10e87b: 89 5a 18 mov %ebx,0x18(%edx)
_ISR_Enable( level );
10e87e: 51 push %ecx
10e87f: 9d popf
return( previous_state );
}
10e880: 5b pop %ebx
10e881: 5e pop %esi
10e882: c9 leave
10e883: c3 ret
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
10e884: 83 f8 03 cmp $0x3,%eax
10e887: 77 ec ja 10e875 <_Watchdog_Remove+0x15> <== NEVER TAKEN
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
10e889: 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 );
}
10e890: 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) )
10e892: 8b 33 mov (%ebx),%esi
10e894: 85 f6 test %esi,%esi
10e896: 74 06 je 10e89e <_Watchdog_Remove+0x3e>
next_watchdog->delta_interval += the_watchdog->delta_interval;
10e898: 8b 72 10 mov 0x10(%edx),%esi
10e89b: 01 73 10 add %esi,0x10(%ebx)
if ( _Watchdog_Sync_count )
10e89e: 8b 35 c0 7e 12 00 mov 0x127ec0,%esi
10e8a4: 85 f6 test %esi,%esi
10e8a6: 74 0c je 10e8b4 <_Watchdog_Remove+0x54>
_Watchdog_Sync_level = _ISR_Nest_level;
10e8a8: 8b 35 34 83 12 00 mov 0x128334,%esi
10e8ae: 89 35 44 7e 12 00 mov %esi,0x127e44
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
10e8b4: 8b 72 04 mov 0x4(%edx),%esi
next->previous = previous;
10e8b7: 89 73 04 mov %esi,0x4(%ebx)
previous->next = next;
10e8ba: 89 1e mov %ebx,(%esi)
10e8bc: eb b7 jmp 10e875 <_Watchdog_Remove+0x15>
10e8be: 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;
10e8c0: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
break;
10e8c7: eb ac jmp 10e875 <_Watchdog_Remove+0x15>
0010fc0c <_Watchdog_Report>:
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
10fc0c: 55 push %ebp
10fc0d: 89 e5 mov %esp,%ebp
10fc0f: 57 push %edi
10fc10: 56 push %esi
10fc11: 53 push %ebx
10fc12: 83 ec 2c sub $0x2c,%esp
10fc15: 8b 55 08 mov 0x8(%ebp),%edx
10fc18: 8b 45 0c mov 0xc(%ebp),%eax
printk(
10fc1b: 8b 78 24 mov 0x24(%eax),%edi
10fc1e: 8b 70 20 mov 0x20(%eax),%esi
10fc21: 8b 58 1c mov 0x1c(%eax),%ebx
10fc24: 8b 48 0c mov 0xc(%eax),%ecx
10fc27: 89 4d d4 mov %ecx,-0x2c(%ebp)
10fc2a: 8b 48 10 mov 0x10(%eax),%ecx
10fc2d: 89 4d e4 mov %ecx,-0x1c(%ebp)
10fc30: 85 d2 test %edx,%edx
10fc32: 74 2c je 10fc60 <_Watchdog_Report+0x54>
10fc34: b9 83 34 12 00 mov $0x123483,%ecx
10fc39: 83 ec 0c sub $0xc,%esp
10fc3c: 57 push %edi
10fc3d: 56 push %esi
10fc3e: 53 push %ebx
10fc3f: 50 push %eax
10fc40: ff 75 d4 pushl -0x2c(%ebp)
10fc43: ff 75 e4 pushl -0x1c(%ebp)
10fc46: 51 push %ecx
10fc47: 52 push %edx
10fc48: 68 d6 3e 12 00 push $0x123ed6
10fc4d: e8 46 9e ff ff call 109a98 <printk>
10fc52: 83 c4 30 add $0x30,%esp
watch,
watch->routine,
watch->id,
watch->user_data
);
}
10fc55: 8d 65 f4 lea -0xc(%ebp),%esp
10fc58: 5b pop %ebx
10fc59: 5e pop %esi
10fc5a: 5f pop %edi
10fc5b: c9 leave
10fc5c: c3 ret
10fc5d: 8d 76 00 lea 0x0(%esi),%esi
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
printk(
10fc60: b9 49 3d 12 00 mov $0x123d49,%ecx
10fc65: 89 ca mov %ecx,%edx
10fc67: eb d0 jmp 10fc39 <_Watchdog_Report+0x2d>
0010fb9c <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
10fb9c: 55 push %ebp
10fb9d: 89 e5 mov %esp,%ebp
10fb9f: 57 push %edi
10fba0: 56 push %esi
10fba1: 53 push %ebx
10fba2: 83 ec 20 sub $0x20,%esp
10fba5: 8b 7d 08 mov 0x8(%ebp),%edi
10fba8: 8b 75 0c mov 0xc(%ebp),%esi
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
10fbab: 9c pushf
10fbac: fa cli
10fbad: 8f 45 e4 popl -0x1c(%ebp)
printk( "Watchdog Chain: %s %p\n", name, header );
10fbb0: 56 push %esi
10fbb1: 57 push %edi
10fbb2: 68 a0 3e 12 00 push $0x123ea0
10fbb7: e8 dc 9e ff ff call 109a98 <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
10fbbc: 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 );
10fbbe: 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 ) ) {
10fbc1: 83 c4 10 add $0x10,%esp
10fbc4: 39 f3 cmp %esi,%ebx
10fbc6: 74 31 je 10fbf9 <_Watchdog_Report_chain+0x5d>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
10fbc8: 83 ec 08 sub $0x8,%esp
10fbcb: 53 push %ebx
10fbcc: 6a 00 push $0x0
10fbce: e8 39 00 00 00 call 10fc0c <_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 )
10fbd3: 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 ) ;
10fbd5: 83 c4 10 add $0x10,%esp
10fbd8: 39 f3 cmp %esi,%ebx
10fbda: 75 ec jne 10fbc8 <_Watchdog_Report_chain+0x2c><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
10fbdc: 83 ec 08 sub $0x8,%esp
10fbdf: 57 push %edi
10fbe0: 68 b7 3e 12 00 push $0x123eb7
10fbe5: e8 ae 9e ff ff call 109a98 <printk>
10fbea: 83 c4 10 add $0x10,%esp
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
10fbed: ff 75 e4 pushl -0x1c(%ebp)
10fbf0: 9d popf
}
10fbf1: 8d 65 f4 lea -0xc(%ebp),%esp
10fbf4: 5b pop %ebx
10fbf5: 5e pop %esi
10fbf6: 5f pop %edi
10fbf7: c9 leave
10fbf8: c3 ret
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
10fbf9: 83 ec 0c sub $0xc,%esp
10fbfc: 68 c6 3e 12 00 push $0x123ec6
10fc01: e8 92 9e ff ff call 109a98 <printk>
10fc06: 83 c4 10 add $0x10,%esp
10fc09: eb e2 jmp 10fbed <_Watchdog_Report_chain+0x51>
0010e8cc <_Watchdog_Tickle>:
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
10e8cc: 55 push %ebp
10e8cd: 89 e5 mov %esp,%ebp
10e8cf: 57 push %edi
10e8d0: 56 push %esi
10e8d1: 53 push %ebx
10e8d2: 83 ec 1c sub $0x1c,%esp
10e8d5: 8b 7d 08 mov 0x8(%ebp),%edi
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
10e8d8: 9c pushf
10e8d9: fa cli
10e8da: 5e pop %esi
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
10e8db: 8b 1f mov (%edi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10e8dd: 8d 47 04 lea 0x4(%edi),%eax
10e8e0: 89 45 e4 mov %eax,-0x1c(%ebp)
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
10e8e3: 39 c3 cmp %eax,%ebx
10e8e5: 74 11 je 10e8f8 <_Watchdog_Tickle+0x2c>
* to be inserted has already had its delta_interval adjusted to 0, and
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
10e8e7: 8b 43 10 mov 0x10(%ebx),%eax
10e8ea: 85 c0 test %eax,%eax
10e8ec: 74 34 je 10e922 <_Watchdog_Tickle+0x56>
the_watchdog->delta_interval--;
10e8ee: 48 dec %eax
10e8ef: 89 43 10 mov %eax,0x10(%ebx)
if ( the_watchdog->delta_interval != 0 )
10e8f2: 85 c0 test %eax,%eax
10e8f4: 74 2c je 10e922 <_Watchdog_Tickle+0x56>
10e8f6: 66 90 xchg %ax,%ax
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
10e8f8: 56 push %esi
10e8f9: 9d popf
}
10e8fa: 8d 65 f4 lea -0xc(%ebp),%esp
10e8fd: 5b pop %ebx
10e8fe: 5e pop %esi
10e8ff: 5f pop %edi
10e900: c9 leave
10e901: c3 ret
_ISR_Enable( level );
switch( watchdog_state ) {
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
10e902: 83 ec 08 sub $0x8,%esp
10e905: ff 73 24 pushl 0x24(%ebx)
10e908: ff 73 20 pushl 0x20(%ebx)
10e90b: ff 53 1c call *0x1c(%ebx)
the_watchdog->id,
the_watchdog->user_data
);
break;
10e90e: 83 c4 10 add $0x10,%esp
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
10e911: 9c pushf
10e912: fa cli
10e913: 5e pop %esi
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
10e914: 8b 1f mov (%edi),%ebx
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
10e916: 3b 5d e4 cmp -0x1c(%ebp),%ebx
10e919: 74 dd je 10e8f8 <_Watchdog_Tickle+0x2c>
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
10e91b: 8b 43 10 mov 0x10(%ebx),%eax
10e91e: 85 c0 test %eax,%eax
10e920: 75 d6 jne 10e8f8 <_Watchdog_Tickle+0x2c>
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
10e922: 83 ec 0c sub $0xc,%esp
10e925: 53 push %ebx
10e926: e8 35 ff ff ff call 10e860 <_Watchdog_Remove>
_ISR_Enable( level );
10e92b: 56 push %esi
10e92c: 9d popf
switch( watchdog_state ) {
10e92d: 83 c4 10 add $0x10,%esp
10e930: 83 f8 02 cmp $0x2,%eax
10e933: 75 dc jne 10e911 <_Watchdog_Tickle+0x45> <== NEVER TAKEN
10e935: eb cb jmp 10e902 <_Watchdog_Tickle+0x36>
0010e938 <_Workspace_Handler_initialization>:
/*
* _Workspace_Handler_initialization
*/
void _Workspace_Handler_initialization(void)
{
10e938: 55 push %ebp
10e939: 89 e5 mov %esp,%ebp
10e93b: 57 push %edi
10e93c: 53 push %ebx
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
10e93d: 8b 1d 80 3a 12 00 mov 0x123a80,%ebx
uintptr_t size = Configuration.work_space_size;
10e943: 8b 15 84 3a 12 00 mov 0x123a84,%edx
if ( Configuration.do_zero_of_workspace )
10e949: 80 3d a8 3a 12 00 00 cmpb $0x0,0x123aa8
10e950: 75 1e jne 10e970 <_Workspace_Handler_initialization+0x38>
memset( starting_address, 0, size );
memory_available = _Heap_Initialize(
10e952: 6a 04 push $0x4
10e954: 52 push %edx
10e955: 53 push %ebx
10e956: 68 c0 7d 12 00 push $0x127dc0
10e95b: e8 8c dd ff ff call 10c6ec <_Heap_Initialize>
starting_address,
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
10e960: 83 c4 10 add $0x10,%esp
10e963: 85 c0 test %eax,%eax
10e965: 74 13 je 10e97a <_Workspace_Handler_initialization+0x42>
_Internal_error_Occurred(
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
);
}
10e967: 8d 65 f8 lea -0x8(%ebp),%esp
10e96a: 5b pop %ebx
10e96b: 5f pop %edi
10e96c: c9 leave
10e96d: c3 ret
10e96e: 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 );
10e970: 31 c0 xor %eax,%eax
10e972: 89 df mov %ebx,%edi
10e974: 89 d1 mov %edx,%ecx
10e976: f3 aa rep stos %al,%es:(%edi)
10e978: eb d8 jmp 10e952 <_Workspace_Handler_initialization+0x1a>
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
_Internal_error_Occurred(
10e97a: 50 push %eax
10e97b: 6a 02 push $0x2
10e97d: 6a 01 push $0x1
10e97f: 6a 00 push $0x0
10e981: e8 6e df ff ff call 10c8f4 <_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 6c 42 12 00 cmp 0x12426c,%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 d0 86 12 00 mov 0x1286d0,%eax
10b641: 40 inc %eax
10b642: a3 d0 86 12 00 mov %eax,0x1286d0
* 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 85 17 00 00 call 10cdd8 <_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 a8 17 00 00 call 10ce60 <_TOD_Set>
_Thread_Enable_dispatch();
10b6b8: e8 ab 2c 00 00 call 10e368 <_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 43 86 00 00 call 113d24 <__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>
0010bd14 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
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 18 sub $0x18,%esp
10bd1d: 8b 75 08 mov 0x8(%ebp),%esi
10bd20: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
10bd23: 68 00 aa 12 00 push $0x12aa00
10bd28: e8 bf 11 00 00 call 10ceec <pthread_mutex_lock>
if (fcntl (fildes, F_GETFD) < 0) {
10bd2d: 5a pop %edx
10bd2e: 59 pop %ecx
10bd2f: 6a 01 push $0x1
10bd31: 56 push %esi
10bd32: e8 01 6b 00 00 call 112838 <fcntl>
10bd37: 83 c4 10 add $0x10,%esp
10bd3a: 85 c0 test %eax,%eax
10bd3c: 0f 88 9b 01 00 00 js 10bedd <aio_cancel+0x1c9>
pthread_mutex_unlock(&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EBADF);
}
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
10bd42: 85 db test %ebx,%ebx
10bd44: 0f 84 ea 00 00 00 je 10be34 <aio_cancel+0x120>
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
10bd4a: 8b 3b mov (%ebx),%edi
10bd4c: 39 f7 cmp %esi,%edi
10bd4e: 0f 85 b8 00 00 00 jne 10be0c <aio_cancel+0xf8>
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
10bd54: 56 push %esi
10bd55: 6a 00 push $0x0
10bd57: 57 push %edi
10bd58: 68 48 aa 12 00 push $0x12aa48
10bd5d: e8 9e 03 00 00 call 10c100 <rtems_aio_search_fd>
10bd62: 89 c6 mov %eax,%esi
if (r_chain == NULL) {
10bd64: 83 c4 10 add $0x10,%esp
10bd67: 85 c0 test %eax,%eax
10bd69: 74 3d je 10bda8 <aio_cancel+0x94>
return AIO_ALLDONE;
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
10bd6b: 8d 78 1c lea 0x1c(%eax),%edi
10bd6e: 83 ec 0c sub $0xc,%esp
10bd71: 57 push %edi
10bd72: e8 75 11 00 00 call 10ceec <pthread_mutex_lock>
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
10bd77: 58 pop %eax
10bd78: 5a pop %edx
10bd79: 53 push %ebx
10bd7a: 83 c6 08 add $0x8,%esi
10bd7d: 56 push %esi
10bd7e: e8 5d 07 00 00 call 10c4e0 <rtems_aio_remove_req>
10bd83: 89 c3 mov %eax,%ebx
pthread_mutex_unlock (&r_chain->mutex);
10bd85: 89 3c 24 mov %edi,(%esp)
10bd88: e8 e7 11 00 00 call 10cf74 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
10bd8d: c7 04 24 00 aa 12 00 movl $0x12aa00,(%esp)
10bd94: e8 db 11 00 00 call 10cf74 <pthread_mutex_unlock>
return result;
10bd99: 83 c4 10 add $0x10,%esp
}
return AIO_ALLDONE;
}
10bd9c: 89 d8 mov %ebx,%eax
10bd9e: 8d 65 f4 lea -0xc(%ebp),%esp
10bda1: 5b pop %ebx
10bda2: 5e pop %esi
10bda3: 5f pop %edi
10bda4: c9 leave
10bda5: c3 ret
10bda6: 66 90 xchg %ax,%ax
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10bda8: 81 3d 54 aa 12 00 58 cmpl $0x12aa58,0x12aa54
10bdaf: aa 12 00
10bdb2: 74 40 je 10bdf4 <aio_cancel+0xe0> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
10bdb4: 51 push %ecx
10bdb5: 6a 00 push $0x0
10bdb7: 57 push %edi
10bdb8: 68 54 aa 12 00 push $0x12aa54
10bdbd: e8 3e 03 00 00 call 10c100 <rtems_aio_search_fd>
if (r_chain == NULL) {
10bdc2: 83 c4 10 add $0x10,%esp
10bdc5: 85 c0 test %eax,%eax
10bdc7: 74 43 je 10be0c <aio_cancel+0xf8>
rtems_set_errno_and_return_minus_one (EINVAL);
}
AIO_printf ("Request on [IQ]\n");
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
10bdc9: 83 ec 08 sub $0x8,%esp
10bdcc: 53 push %ebx
10bdcd: 83 c0 08 add $0x8,%eax
10bdd0: 50 push %eax
10bdd1: e8 0a 07 00 00 call 10c4e0 <rtems_aio_remove_req>
10bdd6: 89 c3 mov %eax,%ebx
pthread_mutex_unlock (&aio_request_queue.mutex);
10bdd8: c7 04 24 00 aa 12 00 movl $0x12aa00,(%esp)
10bddf: e8 90 11 00 00 call 10cf74 <pthread_mutex_unlock>
return result;
10bde4: 83 c4 10 add $0x10,%esp
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
return AIO_ALLDONE;
}
10bde7: 89 d8 mov %ebx,%eax
10bde9: 8d 65 f4 lea -0xc(%ebp),%esp
10bdec: 5b pop %ebx
10bded: 5e pop %esi
10bdee: 5f pop %edi
10bdef: c9 leave
10bdf0: c3 ret
10bdf1: 8d 76 00 lea 0x0(%esi),%esi
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
} else {
pthread_mutex_unlock (&aio_request_queue.mutex);
10bdf4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10bdf7: 68 00 aa 12 00 push $0x12aa00 <== NOT EXECUTED
10bdfc: e8 73 11 00 00 call 10cf74 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
10be01: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10be04: bb 02 00 00 00 mov $0x2,%ebx <== NOT EXECUTED
10be09: eb 91 jmp 10bd9c <aio_cancel+0x88> <== NOT EXECUTED
10be0b: 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)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
if (r_chain == NULL) {
pthread_mutex_unlock (&aio_request_queue.mutex);
10be0c: 83 ec 0c sub $0xc,%esp
10be0f: 68 00 aa 12 00 push $0x12aa00
10be14: e8 5b 11 00 00 call 10cf74 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
10be19: e8 7a 9d 00 00 call 115b98 <__errno>
10be1e: c7 00 16 00 00 00 movl $0x16,(%eax)
10be24: 83 c4 10 add $0x10,%esp
10be27: bb ff ff ff ff mov $0xffffffff,%ebx
10be2c: e9 6b ff ff ff jmp 10bd9c <aio_cancel+0x88>
10be31: 8d 76 00 lea 0x0(%esi),%esi
/* if aiocbp is NULL remove all request for given file descriptor */
if (aiocbp == NULL) {
AIO_printf ("Cancel all requests\n");
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
10be34: 50 push %eax
10be35: 6a 00 push $0x0
10be37: 56 push %esi
10be38: 68 48 aa 12 00 push $0x12aa48
10be3d: e8 be 02 00 00 call 10c100 <rtems_aio_search_fd>
10be42: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
10be44: 83 c4 10 add $0x10,%esp
10be47: 85 c0 test %eax,%eax
10be49: 74 3d je 10be88 <aio_cancel+0x174>
return AIO_ALLDONE;
}
AIO_printf ("Request chain on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
10be4b: 8d 70 1c lea 0x1c(%eax),%esi
10be4e: 83 ec 0c sub $0xc,%esp
10be51: 56 push %esi
10be52: e8 95 10 00 00 call 10ceec <pthread_mutex_lock>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10be57: 89 1c 24 mov %ebx,(%esp)
10be5a: e8 5d 2a 00 00 call 10e8bc <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10be5f: 89 1c 24 mov %ebx,(%esp)
10be62: e8 29 06 00 00 call 10c490 <rtems_aio_remove_fd>
pthread_mutex_unlock (&r_chain->mutex);
10be67: 89 34 24 mov %esi,(%esp)
10be6a: e8 05 11 00 00 call 10cf74 <pthread_mutex_unlock>
pthread_mutex_unlock (&aio_request_queue.mutex);
10be6f: c7 04 24 00 aa 12 00 movl $0x12aa00,(%esp)
10be76: e8 f9 10 00 00 call 10cf74 <pthread_mutex_unlock>
return AIO_CANCELED;
10be7b: 83 c4 10 add $0x10,%esp
10be7e: 31 db xor %ebx,%ebx
10be80: e9 17 ff ff ff jmp 10bd9c <aio_cancel+0x88>
10be85: 8d 76 00 lea 0x0(%esi),%esi
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0);
if (r_chain == NULL) {
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10be88: 81 3d 54 aa 12 00 58 cmpl $0x12aa58,0x12aa54
10be8f: aa 12 00
10be92: 0f 84 5c ff ff ff je 10bdf4 <aio_cancel+0xe0> <== NEVER TAKEN
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
10be98: 57 push %edi
10be99: 6a 00 push $0x0
10be9b: 56 push %esi
10be9c: 68 54 aa 12 00 push $0x12aa54
10bea1: e8 5a 02 00 00 call 10c100 <rtems_aio_search_fd>
10bea6: 89 c3 mov %eax,%ebx
if (r_chain == NULL) {
10bea8: 83 c4 10 add $0x10,%esp
10beab: 85 c0 test %eax,%eax
10bead: 74 53 je 10bf02 <aio_cancel+0x1ee>
10beaf: 83 ec 0c sub $0xc,%esp
10beb2: 50 push %eax
10beb3: e8 04 2a 00 00 call 10e8bc <_Chain_Extract>
}
AIO_printf ("Request chain on [IQ]\n");
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
10beb8: 89 1c 24 mov %ebx,(%esp)
10bebb: e8 d0 05 00 00 call 10c490 <rtems_aio_remove_fd>
pthread_mutex_destroy (&r_chain->mutex);
10bec0: 8d 73 1c lea 0x1c(%ebx),%esi
10bec3: 89 34 24 mov %esi,(%esp)
10bec6: e8 b5 0d 00 00 call 10cc80 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->mutex);
10becb: 89 34 24 mov %esi,(%esp)
10bece: e8 69 0a 00 00 call 10c93c <pthread_cond_destroy>
free (r_chain);
10bed3: 89 1c 24 mov %ebx,(%esp)
10bed6: e8 59 cc ff ff call 108b34 <free>
10bedb: eb 92 jmp 10be6f <aio_cancel+0x15b>
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
if (fcntl (fildes, F_GETFD) < 0) {
pthread_mutex_unlock(&aio_request_queue.mutex);
10bedd: 83 ec 0c sub $0xc,%esp
10bee0: 68 00 aa 12 00 push $0x12aa00
10bee5: e8 8a 10 00 00 call 10cf74 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
10beea: e8 a9 9c 00 00 call 115b98 <__errno>
10beef: c7 00 09 00 00 00 movl $0x9,(%eax)
10bef5: 83 c4 10 add $0x10,%esp
10bef8: bb ff ff ff ff mov $0xffffffff,%ebx
10befd: e9 9a fe ff ff jmp 10bd9c <aio_cancel+0x88>
AIO_printf ("Request chain not on [WQ]\n");
if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) {
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0);
if (r_chain == NULL) {
pthread_mutex_unlock(&aio_request_queue.mutex);
10bf02: 83 ec 0c sub $0xc,%esp
10bf05: 68 00 aa 12 00 push $0x12aa00
10bf0a: e8 65 10 00 00 call 10cf74 <pthread_mutex_unlock>
return AIO_ALLDONE;
10bf0f: 83 c4 10 add $0x10,%esp
10bf12: b3 02 mov $0x2,%bl
10bf14: e9 83 fe ff ff jmp 10bd9c <aio_cancel+0x88>
0010bf28 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
10bf28: 55 push %ebp
10bf29: 89 e5 mov %esp,%ebp
10bf2b: 53 push %ebx
10bf2c: 83 ec 04 sub $0x4,%esp
10bf2f: 8b 5d 0c mov 0xc(%ebp),%ebx
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
10bf32: 81 7d 08 00 20 00 00 cmpl $0x2000,0x8(%ebp)
10bf39: 75 41 jne 10bf7c <aio_fsync+0x54>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10bf3b: 83 ec 08 sub $0x8,%esp
10bf3e: 6a 03 push $0x3
10bf40: ff 33 pushl (%ebx)
10bf42: e8 f1 68 00 00 call 112838 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10bf47: 83 e0 03 and $0x3,%eax
10bf4a: 48 dec %eax
10bf4b: 83 c4 10 add $0x10,%esp
10bf4e: 83 f8 01 cmp $0x1,%eax
10bf51: 77 4d ja 10bfa0 <aio_fsync+0x78>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10bf53: 83 ec 0c sub $0xc,%esp
10bf56: 6a 18 push $0x18
10bf58: e8 eb d0 ff ff call 109048 <malloc>
if (req == NULL)
10bf5d: 83 c4 10 add $0x10,%esp
10bf60: 85 c0 test %eax,%eax
10bf62: 74 57 je 10bfbb <aio_fsync+0x93> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10bf64: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_SYNC;
10bf67: c7 43 2c 03 00 00 00 movl $0x3,0x2c(%ebx)
return rtems_aio_enqueue (req);
10bf6e: 89 45 08 mov %eax,0x8(%ebp)
}
10bf71: 8b 5d fc mov -0x4(%ebp),%ebx
10bf74: c9 leave
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
10bf75: e9 d6 05 00 00 jmp 10c550 <rtems_aio_enqueue>
10bf7a: 66 90 xchg %ax,%ax
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
10bf7c: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10bf83: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10bf8a: e8 09 9c 00 00 call 115b98 <__errno>
10bf8f: c7 00 16 00 00 00 movl $0x16,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
10bf95: b8 ff ff ff ff mov $0xffffffff,%eax
10bf9a: 8b 5d fc mov -0x4(%ebp),%ebx
10bf9d: c9 leave
10bf9e: c3 ret
10bf9f: 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);
10bfa0: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10bfa7: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10bfae: e8 e5 9b 00 00 call 115b98 <__errno>
10bfb3: c7 00 09 00 00 00 movl $0x9,(%eax)
10bfb9: eb da jmp 10bf95 <aio_fsync+0x6d>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10bfbb: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10bfc2: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10bfc9: e8 ca 9b 00 00 call 115b98 <__errno> <== NOT EXECUTED
10bfce: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10bfd4: eb bf jmp 10bf95 <aio_fsync+0x6d> <== NOT EXECUTED
0010c760 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
10c760: 55 push %ebp
10c761: 89 e5 mov %esp,%ebp
10c763: 53 push %ebx
10c764: 83 ec 0c sub $0xc,%esp
10c767: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10c76a: 6a 03 push $0x3
10c76c: ff 33 pushl (%ebx)
10c76e: e8 c5 60 00 00 call 112838 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10c773: 83 c4 10 add $0x10,%esp
10c776: 83 e0 03 and $0x3,%eax
10c779: 74 05 je 10c780 <aio_read+0x20> <== NEVER TAKEN
10c77b: 83 f8 02 cmp $0x2,%eax
10c77e: 75 38 jne 10c7b8 <aio_read+0x58>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10c780: 8b 53 14 mov 0x14(%ebx),%edx
10c783: 85 d2 test %edx,%edx
10c785: 75 55 jne 10c7dc <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10c787: 8b 43 08 mov 0x8(%ebx),%eax
10c78a: 85 c0 test %eax,%eax
10c78c: 78 4e js 10c7dc <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10c78e: 83 ec 0c sub $0xc,%esp
10c791: 6a 18 push $0x18
10c793: e8 b0 c8 ff ff call 109048 <malloc>
if (req == NULL)
10c798: 83 c4 10 add $0x10,%esp
10c79b: 85 c0 test %eax,%eax
10c79d: 74 58 je 10c7f7 <aio_read+0x97> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10c79f: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_READ;
10c7a2: c7 43 2c 01 00 00 00 movl $0x1,0x2c(%ebx)
return rtems_aio_enqueue (req);
10c7a9: 89 45 08 mov %eax,0x8(%ebp)
}
10c7ac: 8b 5d fc mov -0x4(%ebp),%ebx
10c7af: 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);
10c7b0: e9 9b fd ff ff jmp 10c550 <rtems_aio_enqueue>
10c7b5: 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);
10c7b8: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10c7bf: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c7c6: e8 cd 93 00 00 call 115b98 <__errno>
10c7cb: c7 00 09 00 00 00 movl $0x9,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
10c7d1: b8 ff ff ff ff mov $0xffffffff,%eax
10c7d6: 8b 5d fc mov -0x4(%ebp),%ebx
10c7d9: c9 leave
10c7da: c3 ret
10c7db: 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);
10c7dc: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10c7e3: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c7ea: e8 a9 93 00 00 call 115b98 <__errno>
10c7ef: c7 00 16 00 00 00 movl $0x16,(%eax)
10c7f5: eb da jmp 10c7d1 <aio_read+0x71>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10c7f7: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10c7fe: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10c805: e8 8e 93 00 00 call 115b98 <__errno> <== NOT EXECUTED
10c80a: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10c810: eb bf jmp 10c7d1 <aio_read+0x71> <== NOT EXECUTED
0010c820 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
10c820: 55 push %ebp
10c821: 89 e5 mov %esp,%ebp
10c823: 53 push %ebx
10c824: 83 ec 0c sub $0xc,%esp
10c827: 8b 5d 08 mov 0x8(%ebp),%ebx
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
10c82a: 6a 03 push $0x3
10c82c: ff 33 pushl (%ebx)
10c82e: e8 05 60 00 00 call 112838 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
10c833: 83 e0 03 and $0x3,%eax
10c836: 48 dec %eax
10c837: 83 c4 10 add $0x10,%esp
10c83a: 83 f8 01 cmp $0x1,%eax
10c83d: 77 35 ja 10c874 <aio_write+0x54>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
10c83f: 8b 53 14 mov 0x14(%ebx),%edx
10c842: 85 d2 test %edx,%edx
10c844: 75 52 jne 10c898 <aio_write+0x78>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
10c846: 8b 43 08 mov 0x8(%ebx),%eax
10c849: 85 c0 test %eax,%eax
10c84b: 78 4b js 10c898 <aio_write+0x78>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
10c84d: 83 ec 0c sub $0xc,%esp
10c850: 6a 18 push $0x18
10c852: e8 f1 c7 ff ff call 109048 <malloc>
if (req == NULL)
10c857: 83 c4 10 add $0x10,%esp
10c85a: 85 c0 test %eax,%eax
10c85c: 74 55 je 10c8b3 <aio_write+0x93> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
10c85e: 89 58 14 mov %ebx,0x14(%eax)
req->aiocbp->aio_lio_opcode = LIO_WRITE;
10c861: c7 43 2c 02 00 00 00 movl $0x2,0x2c(%ebx)
return rtems_aio_enqueue (req);
10c868: 89 45 08 mov %eax,0x8(%ebp)
}
10c86b: 8b 5d fc mov -0x4(%ebp),%ebx
10c86e: 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);
10c86f: e9 dc fc ff ff jmp 10c550 <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);
10c874: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx)
10c87b: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c882: e8 11 93 00 00 call 115b98 <__errno>
10c887: c7 00 09 00 00 00 movl $0x9,(%eax)
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
10c88d: b8 ff ff ff ff mov $0xffffffff,%eax
10c892: 8b 5d fc mov -0x4(%ebp),%ebx
10c895: c9 leave
10c896: c3 ret
10c897: 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);
10c898: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx)
10c89f: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx)
10c8a6: e8 ed 92 00 00 call 115b98 <__errno>
10c8ab: c7 00 16 00 00 00 movl $0x16,(%eax)
10c8b1: eb da jmp 10c88d <aio_write+0x6d>
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
10c8b3: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED
10c8ba: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED
10c8c1: e8 d2 92 00 00 call 115b98 <__errno> <== NOT EXECUTED
10c8c6: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED
10c8cc: eb bf jmp 10c88d <aio_write+0x6d> <== NOT EXECUTED
0010b454 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
10b454: 55 push %ebp
10b455: 89 e5 mov %esp,%ebp
10b457: 83 ec 08 sub $0x8,%esp
10b45a: 8b 45 08 mov 0x8(%ebp),%eax
10b45d: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10b460: 85 d2 test %edx,%edx
10b462: 74 14 je 10b478 <clock_gettime+0x24>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10b464: 83 f8 01 cmp $0x1,%eax
10b467: 74 47 je 10b4b0 <clock_gettime+0x5c>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
10b469: 83 f8 04 cmp $0x4,%eax
10b46c: 74 32 je 10b4a0 <clock_gettime+0x4c> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
10b46e: 83 f8 02 cmp $0x2,%eax
10b471: 74 2d je 10b4a0 <clock_gettime+0x4c>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
10b473: 83 f8 03 cmp $0x3,%eax
10b476: 74 14 je 10b48c <clock_gettime+0x38>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
10b478: e8 ef 8d 00 00 call 11426c <__errno>
10b47d: c7 00 16 00 00 00 movl $0x16,(%eax)
10b483: b8 ff ff ff ff mov $0xffffffff,%eax
return 0;
}
10b488: c9 leave
10b489: c3 ret
10b48a: 66 90 xchg %ax,%ax
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
10b48c: e8 db 8d 00 00 call 11426c <__errno>
10b491: c7 00 58 00 00 00 movl $0x58,(%eax)
10b497: b8 ff ff ff ff mov $0xffffffff,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b49c: c9 leave
10b49d: c3 ret
10b49e: 66 90 xchg %ax,%ax
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
_TOD_Get_uptime_as_timespec( tp );
10b4a0: 83 ec 0c sub $0xc,%esp
10b4a3: 52 push %edx
10b4a4: e8 97 1e 00 00 call 10d340 <_TOD_Get_uptime_as_timespec>
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
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
_TOD_Get(tp);
10b4b0: 83 ec 0c sub $0xc,%esp
10b4b3: 52 push %edx
10b4b4: e8 33 1e 00 00 call 10d2ec <_TOD_Get>
return 0;
10b4b9: 83 c4 10 add $0x10,%esp
10b4bc: 31 c0 xor %eax,%eax
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b4be: c9 leave
10b4bf: c3 ret
0010b4c0 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
10b4c0: 55 push %ebp
10b4c1: 89 e5 mov %esp,%ebp
10b4c3: 83 ec 08 sub $0x8,%esp
10b4c6: 8b 45 08 mov 0x8(%ebp),%eax
10b4c9: 8b 55 0c mov 0xc(%ebp),%edx
if ( !tp )
10b4cc: 85 d2 test %edx,%edx
10b4ce: 74 0f je 10b4df <clock_settime+0x1f> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
10b4d0: 83 f8 01 cmp $0x1,%eax
10b4d3: 74 1f je 10b4f4 <clock_settime+0x34>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
10b4d5: 83 f8 02 cmp $0x2,%eax
10b4d8: 74 42 je 10b51c <clock_settime+0x5c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
10b4da: 83 f8 03 cmp $0x3,%eax
10b4dd: 74 3d je 10b51c <clock_settime+0x5c>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
10b4df: e8 88 8d 00 00 call 11426c <__errno>
10b4e4: c7 00 16 00 00 00 movl $0x16,(%eax)
10b4ea: b8 ff ff ff ff mov $0xffffffff,%eax
return 0;
}
10b4ef: c9 leave
10b4f0: c3 ret
10b4f1: 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 )
10b4f4: 81 3a ff e4 da 21 cmpl $0x21dae4ff,(%edx)
10b4fa: 76 e3 jbe 10b4df <clock_settime+0x1f>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b4fc: a1 b0 9d 12 00 mov 0x129db0,%eax
10b501: 40 inc %eax
10b502: a3 b0 9d 12 00 mov %eax,0x129db0
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
10b507: 83 ec 0c sub $0xc,%esp
10b50a: 52 push %edx
10b50b: e8 88 1e 00 00 call 10d398 <_TOD_Set>
_Thread_Enable_dispatch();
10b510: e8 8b 33 00 00 call 10e8a0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
10b515: 83 c4 10 add $0x10,%esp
10b518: 31 c0 xor %eax,%eax
}
10b51a: c9 leave
10b51b: 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 );
10b51c: e8 4b 8d 00 00 call 11426c <__errno>
10b521: c7 00 58 00 00 00 movl $0x58,(%eax)
10b527: b8 ff ff ff ff mov $0xffffffff,%eax
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
10b52c: c9 leave
10b52d: 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 34 87 00 00 call 113980 <__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 1f 87 00 00 call 113980 <__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 0b 87 00 00 call 113980 <__errno>
10b275: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b27b: eb d5 jmp 10b252 <getitimer+0x1e>
001249b8 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
1249b8: 55 push %ebp
1249b9: 89 e5 mov %esp,%ebp
1249bb: 57 push %edi
1249bc: 56 push %esi
1249bd: 53 push %ebx
1249be: 83 ec 3c sub $0x3c,%esp
1249c1: 8b 75 0c mov 0xc(%ebp),%esi
1249c4: 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() )
1249c7: e8 00 fd ff ff call 1246cc <getpid>
1249cc: 3b 45 08 cmp 0x8(%ebp),%eax
1249cf: 0f 85 3f 02 00 00 jne 124c14 <killinfo+0x25c>
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
1249d5: 85 f6 test %esi,%esi
1249d7: 0f 84 4c 02 00 00 je 124c29 <killinfo+0x271>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
1249dd: 8d 4e ff lea -0x1(%esi),%ecx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
1249e0: 83 f9 1f cmp $0x1f,%ecx
1249e3: 0f 87 40 02 00 00 ja 124c29 <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 )
1249e9: 8d 04 76 lea (%esi,%esi,2),%eax
1249ec: 83 3c 85 28 f1 12 00 cmpl $0x1,0x12f128(,%eax,4)
1249f3: 01
1249f4: 0f 84 e6 01 00 00 je 124be0 <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 ) )
1249fa: 83 fe 08 cmp $0x8,%esi
1249fd: 0f 84 c9 00 00 00 je 124acc <killinfo+0x114>
124a03: 83 fe 04 cmp $0x4,%esi
124a06: 0f 84 c0 00 00 00 je 124acc <killinfo+0x114>
124a0c: 83 fe 0b cmp $0xb,%esi
124a0f: 0f 84 b7 00 00 00 je 124acc <killinfo+0x114>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
124a15: bb 01 00 00 00 mov $0x1,%ebx
124a1a: d3 e3 shl %cl,%ebx
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
124a1c: 89 75 dc mov %esi,-0x24(%ebp)
siginfo->si_code = SI_USER;
124a1f: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
if ( !value ) {
124a26: 85 ff test %edi,%edi
124a28: 0f 84 ba 01 00 00 je 124be8 <killinfo+0x230>
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
124a2e: 8b 07 mov (%edi),%eax
124a30: 89 45 e4 mov %eax,-0x1c(%ebp)
124a33: a1 10 eb 12 00 mov 0x12eb10,%eax
124a38: 40 inc %eax
124a39: a3 10 eb 12 00 mov %eax,0x12eb10
/*
* 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;
124a3e: 8b 0d b8 f0 12 00 mov 0x12f0b8,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
124a44: 8b 81 ec 00 00 00 mov 0xec(%ecx),%eax
124a4a: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
124a50: f7 d0 not %eax
124a52: 85 c3 test %eax,%ebx
124a54: 75 34 jne 124a8a <killinfo+0xd2>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
124a56: a1 c0 f2 12 00 mov 0x12f2c0,%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 );
124a5b: 3d c4 f2 12 00 cmp $0x12f2c4,%eax
124a60: 75 1b jne 124a7d <killinfo+0xc5>
124a62: e9 81 00 00 00 jmp 124ae8 <killinfo+0x130>
124a67: 90 nop
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
124a68: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx
124a6e: f7 d2 not %edx
124a70: 85 d3 test %edx,%ebx
124a72: 75 16 jne 124a8a <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 ) {
124a74: 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 );
124a76: 3d c4 f2 12 00 cmp $0x12f2c4,%eax
124a7b: 74 6b je 124ae8 <killinfo+0x130> <== ALWAYS TAKEN
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
124a7d: 89 c1 mov %eax,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124a7f: 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)
124a85: 85 58 30 test %ebx,0x30(%eax)
124a88: 74 de je 124a68 <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 ) ) {
124a8a: 50 push %eax
mask = signo_to_mask( sig );
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
124a8b: 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 ) ) {
124a8e: 50 push %eax
124a8f: 56 push %esi
124a90: 51 push %ecx
124a91: e8 d6 01 00 00 call 124c6c <_POSIX_signals_Unblock_thread>
124a96: 83 c4 10 add $0x10,%esp
124a99: 84 c0 test %al,%al
124a9b: 75 1f jne 124abc <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 );
124a9d: 83 ec 0c sub $0xc,%esp
124aa0: 53 push %ebx
124aa1: e8 b2 01 00 00 call 124c58 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
124aa6: 8d 1c 76 lea (%esi,%esi,2),%ebx
124aa9: c1 e3 02 shl $0x2,%ebx
124aac: 83 c4 10 add $0x10,%esp
124aaf: 83 bb 20 f1 12 00 02 cmpl $0x2,0x12f120(%ebx)
124ab6: 0f 84 e4 00 00 00 je 124ba0 <killinfo+0x1e8>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
124abc: e8 17 e0 fe ff call 112ad8 <_Thread_Enable_dispatch>
return 0;
124ac1: 31 c0 xor %eax,%eax
}
124ac3: 8d 65 f4 lea -0xc(%ebp),%esp
124ac6: 5b pop %ebx
124ac7: 5e pop %esi
124ac8: 5f pop %edi
124ac9: c9 leave
124aca: c3 ret
124acb: 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 );
124acc: e8 7b 03 00 00 call 124e4c <pthread_self>
124ad1: 83 ec 08 sub $0x8,%esp
124ad4: 56 push %esi
124ad5: 50 push %eax
124ad6: e8 b1 02 00 00 call 124d8c <pthread_kill>
124adb: 83 c4 10 add $0x10,%esp
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
124ade: 8d 65 f4 lea -0xc(%ebp),%esp
124ae1: 5b pop %ebx
124ae2: 5e pop %esi
124ae3: 5f pop %edi
124ae4: c9 leave
124ae5: c3 ret
124ae6: 66 90 xchg %ax,%ax
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
124ae8: 0f b6 05 54 a6 12 00 movzbl 0x12a654,%eax
124aef: 40 inc %eax
124af0: 89 45 d4 mov %eax,-0x2c(%ebp)
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
124af3: 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++) {
124afa: c7 45 cc 02 00 00 00 movl $0x2,-0x34(%ebp)
124b01: 89 5d d0 mov %ebx,-0x30(%ebp)
124b04: 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 ] )
124b07: 8b 55 cc mov -0x34(%ebp),%edx
124b0a: 8b 04 95 e8 ea 12 00 mov 0x12eae8(,%edx,4),%eax
124b11: 85 c0 test %eax,%eax
124b13: 74 68 je 124b7d <killinfo+0x1c5> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
124b15: 8b 40 04 mov 0x4(%eax),%eax
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
124b18: 0f b7 70 10 movzwl 0x10(%eax),%esi
object_table = the_info->local_table;
124b1c: 8b 78 1c mov 0x1c(%eax),%edi
for ( index = 1 ; index <= maximum ; index++ ) {
124b1f: 85 f6 test %esi,%esi
124b21: 74 5a je 124b7d <killinfo+0x1c5>
124b23: b8 01 00 00 00 mov $0x1,%eax
the_thread = (Thread_Control *) object_table[ index ];
124b28: 8b 14 87 mov (%edi,%eax,4),%edx
if ( !the_thread )
124b2b: 85 d2 test %edx,%edx
124b2d: 74 49 je 124b78 <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 )
124b2f: 8b 4a 14 mov 0x14(%edx),%ecx
124b32: 3b 4d d4 cmp -0x2c(%ebp),%ecx
124b35: 77 41 ja 124b78 <killinfo+0x1c0>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
124b37: 8b 9a ec 00 00 00 mov 0xec(%edx),%ebx
124b3d: 8b 9b d0 00 00 00 mov 0xd0(%ebx),%ebx
124b43: f7 d3 not %ebx
124b45: 85 5d d0 test %ebx,-0x30(%ebp)
124b48: 74 2e je 124b78 <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 ) {
124b4a: 3b 4d d4 cmp -0x2c(%ebp),%ecx
124b4d: 72 21 jb 124b70 <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 ) ) {
124b4f: 8b 5d c8 mov -0x38(%ebp),%ebx
124b52: 85 db test %ebx,%ebx
124b54: 74 22 je 124b78 <killinfo+0x1c0> <== NEVER TAKEN
124b56: 8b 5d c8 mov -0x38(%ebp),%ebx
124b59: 8b 5b 10 mov 0x10(%ebx),%ebx
124b5c: 89 5d c4 mov %ebx,-0x3c(%ebp)
124b5f: 85 db test %ebx,%ebx
124b61: 74 15 je 124b78 <killinfo+0x1c0> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
124b63: 8b 5a 10 mov 0x10(%edx),%ebx
124b66: 85 db test %ebx,%ebx
124b68: 0f 85 86 00 00 00 jne 124bf4 <killinfo+0x23c>
124b6e: 66 90 xchg %ax,%ax
124b70: 89 4d d4 mov %ecx,-0x2c(%ebp)
124b73: 89 55 c8 mov %edx,-0x38(%ebp)
124b76: 66 90 xchg %ax,%ax
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
124b78: 40 inc %eax
124b79: 39 c6 cmp %eax,%esi
124b7b: 73 ab jae 124b28 <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++) {
124b7d: ff 45 cc incl -0x34(%ebp)
124b80: 83 7d cc 04 cmpl $0x4,-0x34(%ebp)
124b84: 75 81 jne 124b07 <killinfo+0x14f>
124b86: 8b 5d d0 mov -0x30(%ebp),%ebx
124b89: 8b 75 c0 mov -0x40(%ebp),%esi
}
}
}
}
if ( interested ) {
124b8c: 8b 55 c8 mov -0x38(%ebp),%edx
124b8f: 85 d2 test %edx,%edx
124b91: 0f 84 06 ff ff ff je 124a9d <killinfo+0xe5>
124b97: 8b 4d c8 mov -0x38(%ebp),%ecx
124b9a: e9 eb fe ff ff jmp 124a8a <killinfo+0xd2>
124b9f: 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 );
124ba0: 83 ec 0c sub $0xc,%esp
124ba3: 68 a0 f2 12 00 push $0x12f2a0
124ba8: e8 ef c4 fe ff call 11109c <_Chain_Get>
if ( !psiginfo ) {
124bad: 83 c4 10 add $0x10,%esp
124bb0: 85 c0 test %eax,%eax
124bb2: 0f 84 86 00 00 00 je 124c3e <killinfo+0x286>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
124bb8: 8d 78 08 lea 0x8(%eax),%edi
124bbb: 8d 75 dc lea -0x24(%ebp),%esi
124bbe: b9 03 00 00 00 mov $0x3,%ecx
124bc3: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
124bc5: 83 ec 08 sub $0x8,%esp
124bc8: 50 push %eax
124bc9: 81 c3 40 f3 12 00 add $0x12f340,%ebx
124bcf: 53 push %ebx
124bd0: e8 8b c4 fe ff call 111060 <_Chain_Append>
124bd5: 83 c4 10 add $0x10,%esp
124bd8: e9 df fe ff ff jmp 124abc <killinfo+0x104>
124bdd: 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;
124be0: 31 c0 xor %eax,%eax
124be2: e9 f7 fe ff ff jmp 124ade <killinfo+0x126>
124be7: 90 nop
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
siginfo->si_value.sival_int = 0;
124be8: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp)
124bef: e9 3f fe ff ff jmp 124a33 <killinfo+0x7b>
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
124bf4: f7 45 c4 00 00 00 10 testl $0x10000000,-0x3c(%ebp)
124bfb: 0f 85 77 ff ff ff jne 124b78 <killinfo+0x1c0>
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
124c01: 81 e3 00 00 00 10 and $0x10000000,%ebx
124c07: 0f 84 6b ff ff ff je 124b78 <killinfo+0x1c0>
124c0d: e9 5e ff ff ff jmp 124b70 <killinfo+0x1b8>
124c12: 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 );
124c14: e8 1f 38 ff ff call 118438 <__errno>
124c19: c7 00 03 00 00 00 movl $0x3,(%eax)
124c1f: b8 ff ff ff ff mov $0xffffffff,%eax
124c24: e9 b5 fe ff ff jmp 124ade <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 );
124c29: e8 0a 38 ff ff call 118438 <__errno>
124c2e: c7 00 16 00 00 00 movl $0x16,(%eax)
124c34: b8 ff ff ff ff mov $0xffffffff,%eax
124c39: e9 a0 fe ff ff jmp 124ade <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();
124c3e: e8 95 de fe ff call 112ad8 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
124c43: e8 f0 37 ff ff call 118438 <__errno>
124c48: c7 00 0b 00 00 00 movl $0xb,(%eax)
124c4e: 83 c8 ff or $0xffffffff,%eax
124c51: e9 88 fe ff ff jmp 124ade <killinfo+0x126>
0010fb14 <mq_open>:
int oflag,
...
/* mode_t mode, */
/* struct mq_attr attr */
)
{
10fb14: 55 push %ebp
10fb15: 89 e5 mov %esp,%ebp
10fb17: 57 push %edi
10fb18: 56 push %esi
10fb19: 53 push %ebx
10fb1a: 83 ec 2c sub $0x2c,%esp
10fb1d: 8b 75 0c mov 0xc(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10fb20: a1 f0 0e 13 00 mov 0x130ef0,%eax
10fb25: 40 inc %eax
10fb26: a3 f0 0e 13 00 mov %eax,0x130ef0
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10fb2b: 89 f0 mov %esi,%eax
10fb2d: 25 00 02 00 00 and $0x200,%eax
10fb32: 89 45 d4 mov %eax,-0x2c(%ebp)
10fb35: 0f 85 c9 00 00 00 jne 10fc04 <mq_open+0xf0>
/* struct mq_attr attr */
)
{
va_list arg;
mode_t mode;
struct mq_attr *attr = NULL;
10fb3b: 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 );
10fb42: 83 ec 0c sub $0xc,%esp
10fb45: 68 20 14 13 00 push $0x131420
10fb4a: e8 55 2c 00 00 call 1127a4 <_Objects_Allocate>
10fb4f: 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 ) {
10fb51: 83 c4 10 add $0x10,%esp
10fb54: 85 c0 test %eax,%eax
10fb56: 0f 84 b4 00 00 00 je 10fc10 <mq_open+0xfc>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq_fd->oflag = oflag;
10fb5c: 89 70 14 mov %esi,0x14(%eax)
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
10fb5f: 83 ec 08 sub $0x8,%esp
10fb62: 8d 45 e4 lea -0x1c(%ebp),%eax
10fb65: 50 push %eax
10fb66: ff 75 08 pushl 0x8(%ebp)
10fb69: e8 c2 69 00 00 call 116530 <_POSIX_Message_queue_Name_to_id>
10fb6e: 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 ) {
10fb70: 83 c4 10 add $0x10,%esp
10fb73: 85 c0 test %eax,%eax
10fb75: 75 59 jne 10fbd0 <mq_open+0xbc>
} else { /* name -> ID translation succeeded */
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10fb77: 81 e6 00 0a 00 00 and $0xa00,%esi
10fb7d: 81 fe 00 0a 00 00 cmp $0xa00,%esi
10fb83: 0f 84 a7 00 00 00 je 10fc30 <mq_open+0x11c>
Objects_Id id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control *)
_Objects_Get( &_POSIX_Message_queue_Information, id, location );
10fb89: 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 );
10fb8a: 8d 45 dc lea -0x24(%ebp),%eax
10fb8d: 50 push %eax
10fb8e: ff 75 e4 pushl -0x1c(%ebp)
10fb91: 68 80 12 13 00 push $0x131280
10fb96: e8 bd 30 00 00 call 112c58 <_Objects_Get>
10fb9b: 89 45 e0 mov %eax,-0x20(%ebp)
the_mq->open_count += 1;
10fb9e: ff 40 18 incl 0x18(%eax)
the_mq_fd->Queue = the_mq;
10fba1: 89 43 10 mov %eax,0x10(%ebx)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
10fba4: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10fba8: a1 3c 14 13 00 mov 0x13143c,%eax
10fbad: 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;
10fbb0: 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();
10fbb7: e8 94 3c 00 00 call 113850 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10fbbc: e8 8f 3c 00 00 call 113850 <_Thread_Enable_dispatch>
return (mqd_t)the_mq_fd->Object.id;
10fbc1: 8b 43 08 mov 0x8(%ebx),%eax
10fbc4: 83 c4 10 add $0x10,%esp
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fbc7: 8d 65 f4 lea -0xc(%ebp),%esp
10fbca: 5b pop %ebx
10fbcb: 5e pop %esi
10fbcc: 5f pop %edi
10fbcd: c9 leave
10fbce: c3 ret
10fbcf: 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) ) ) {
10fbd0: 83 f8 02 cmp $0x2,%eax
10fbd3: 0f 84 87 00 00 00 je 10fc60 <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 );
10fbd9: 83 ec 08 sub $0x8,%esp
10fbdc: 53 push %ebx
10fbdd: 68 20 14 13 00 push $0x131420
10fbe2: e8 31 2f 00 00 call 112b18 <_Objects_Free>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
10fbe7: e8 64 3c 00 00 call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
10fbec: e8 23 9c 00 00 call 119814 <__errno>
10fbf1: 89 38 mov %edi,(%eax)
10fbf3: 83 c4 10 add $0x10,%esp
10fbf6: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fbfb: 8d 65 f4 lea -0xc(%ebp),%esp
10fbfe: 5b pop %ebx
10fbff: 5e pop %esi
10fc00: 5f pop %edi
10fc01: c9 leave
10fc02: c3 ret
10fc03: 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 * );
10fc04: 8b 45 14 mov 0x14(%ebp),%eax
10fc07: 89 45 d0 mov %eax,-0x30(%ebp)
10fc0a: e9 33 ff ff ff jmp 10fb42 <mq_open+0x2e>
10fc0f: 90 nop
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
_Thread_Enable_dispatch();
10fc10: e8 3b 3c 00 00 call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
10fc15: e8 fa 9b 00 00 call 119814 <__errno>
10fc1a: c7 00 17 00 00 00 movl $0x17,(%eax)
10fc20: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fc25: 8d 65 f4 lea -0xc(%ebp),%esp
10fc28: 5b pop %ebx
10fc29: 5e pop %esi
10fc2a: 5f pop %edi
10fc2b: c9 leave
10fc2c: c3 ret
10fc2d: 8d 76 00 lea 0x0(%esi),%esi
10fc30: 83 ec 08 sub $0x8,%esp
10fc33: 53 push %ebx
10fc34: 68 20 14 13 00 push $0x131420
10fc39: e8 da 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();
10fc3e: e8 0d 3c 00 00 call 113850 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
10fc43: e8 cc 9b 00 00 call 119814 <__errno>
10fc48: c7 00 11 00 00 00 movl $0x11,(%eax)
10fc4e: 83 c4 10 add $0x10,%esp
10fc51: b8 ff ff ff ff mov $0xffffffff,%eax
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
10fc56: 8d 65 f4 lea -0xc(%ebp),%esp
10fc59: 5b pop %ebx
10fc5a: 5e pop %esi
10fc5b: 5f pop %edi
10fc5c: c9 leave
10fc5d: c3 ret
10fc5e: 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) ) ) {
10fc60: 8b 55 d4 mov -0x2c(%ebp),%edx
10fc63: 85 d2 test %edx,%edx
10fc65: 0f 84 6e ff ff ff je 10fbd9 <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(
10fc6b: 8d 45 e0 lea -0x20(%ebp),%eax
10fc6e: 50 push %eax
10fc6f: ff 75 d0 pushl -0x30(%ebp)
10fc72: 6a 01 push $0x1
10fc74: ff 75 08 pushl 0x8(%ebp)
10fc77: e8 2c 67 00 00 call 1163a8 <_POSIX_Message_queue_Create_support>
);
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
10fc7c: 83 c4 10 add $0x10,%esp
10fc7f: 40 inc %eax
10fc80: 74 26 je 10fca8 <mq_open+0x194>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
return (mqd_t) -1;
}
the_mq_fd->Queue = the_mq;
10fc82: 8b 45 e0 mov -0x20(%ebp),%eax
10fc85: 89 43 10 mov %eax,0x10(%ebx)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
10fc88: 0f b7 53 08 movzwl 0x8(%ebx),%edx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10fc8c: a1 3c 14 13 00 mov 0x13143c,%eax
10fc91: 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;
10fc94: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
10fc9b: e8 b0 3b 00 00 call 113850 <_Thread_Enable_dispatch>
return (mqd_t) the_mq_fd->Object.id;
10fca0: 8b 43 08 mov 0x8(%ebx),%eax
10fca3: e9 1f ff ff ff jmp 10fbc7 <mq_open+0xb3>
10fca8: 83 ec 08 sub $0x8,%esp
10fcab: 53 push %ebx
10fcac: 68 20 14 13 00 push $0x131420
10fcb1: e8 62 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();
10fcb6: e8 95 3b 00 00 call 113850 <_Thread_Enable_dispatch>
return (mqd_t) -1;
10fcbb: 83 c4 10 add $0x10,%esp
10fcbe: b8 ff ff ff ff mov $0xffffffff,%eax
10fcc3: e9 ff fe ff ff jmp 10fbc7 <mq_open+0xb3>
0011fe04 <nanosleep>:
int nanosleep(
const struct timespec *rqtp,
struct timespec *rmtp
)
{
11fe04: 55 push %ebp
11fe05: 89 e5 mov %esp,%ebp
11fe07: 56 push %esi
11fe08: 53 push %ebx
11fe09: 8b 75 08 mov 0x8(%ebp),%esi
11fe0c: 8b 5d 0c mov 0xc(%ebp),%ebx
* Return EINVAL if the delay interval is negative.
*
* NOTE: This behavior is beyond the POSIX specification.
* FSU and GNU/Linux pthreads shares this behavior.
*/
if ( !_Timespec_Is_valid( rqtp ) )
11fe0f: 83 ec 0c sub $0xc,%esp
11fe12: 56 push %esi
11fe13: e8 80 01 00 00 call 11ff98 <_Timespec_Is_valid>
11fe18: 83 c4 10 add $0x10,%esp
11fe1b: 84 c0 test %al,%al
11fe1d: 0f 84 e1 00 00 00 je 11ff04 <nanosleep+0x100>
rtems_set_errno_and_return_minus_one( EINVAL );
ticks = _Timespec_To_ticks( rqtp );
11fe23: 83 ec 0c sub $0xc,%esp
11fe26: 56 push %esi
11fe27: e8 6c 1f ff ff call 111d98 <_Timespec_To_ticks>
11fe2c: 89 c6 mov %eax,%esi
* A nanosleep for zero time is implemented as a yield.
* This behavior is also beyond the POSIX specification but is
* consistent with the RTEMS API and yields desirable behavior.
*/
if ( !ticks ) {
11fe2e: 83 c4 10 add $0x10,%esp
11fe31: 85 c0 test %eax,%eax
11fe33: 75 37 jne 11fe6c <nanosleep+0x68>
11fe35: a1 90 8c 12 00 mov 0x128c90,%eax
11fe3a: 40 inc %eax
11fe3b: a3 90 8c 12 00 mov %eax,0x128c90
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
11fe40: ff 15 0c 48 12 00 call *0x12480c
_Thread_Disable_dispatch();
_Scheduler_Yield();
_Thread_Enable_dispatch();
11fe46: e8 75 df fe ff call 10ddc0 <_Thread_Enable_dispatch>
if ( rmtp ) {
11fe4b: 85 db test %ebx,%ebx
11fe4d: 0f 84 93 00 00 00 je 11fee6 <nanosleep+0xe2>
rmtp->tv_sec = 0;
11fe53: c7 03 00 00 00 00 movl $0x0,(%ebx)
rmtp->tv_nsec = 0;
11fe59: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx)
}
return 0;
11fe60: 31 c0 xor %eax,%eax
rtems_set_errno_and_return_minus_one( EINTR );
#endif
}
return 0;
}
11fe62: 8d 65 f8 lea -0x8(%ebp),%esp
11fe65: 5b pop %ebx
11fe66: 5e pop %esi
11fe67: c9 leave
11fe68: c3 ret
11fe69: 8d 76 00 lea 0x0(%esi),%esi
11fe6c: a1 90 8c 12 00 mov 0x128c90,%eax
11fe71: 40 inc %eax
11fe72: a3 90 8c 12 00 mov %eax,0x128c90
/*
* Block for the desired amount of time
*/
_Thread_Disable_dispatch();
_Thread_Set_state(
11fe77: 83 ec 08 sub $0x8,%esp
11fe7a: 68 08 00 00 10 push $0x10000008
11fe7f: ff 35 38 92 12 00 pushl 0x129238
11fe85: e8 56 e7 fe ff call 10e5e0 <_Thread_Set_state>
STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Watchdog_Initialize(
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
11fe8a: 8b 15 38 92 12 00 mov 0x129238,%edx
_Thread_Disable_dispatch();
_Thread_Set_state(
_Thread_Executing,
STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Watchdog_Initialize(
11fe90: 8b 42 08 mov 0x8(%edx),%eax
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
11fe93: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx)
the_watchdog->routine = routine;
11fe9a: c7 42 64 0c dc 10 00 movl $0x10dc0c,0x64(%edx)
the_watchdog->id = id;
11fea1: 89 42 68 mov %eax,0x68(%edx)
the_watchdog->user_data = user_data;
11fea4: c7 42 6c 00 00 00 00 movl $0x0,0x6c(%edx)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
11feab: 89 72 54 mov %esi,0x54(%edx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
11feae: 58 pop %eax
11feaf: 59 pop %ecx
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
11feb0: 83 c2 48 add $0x48,%edx
11feb3: 52 push %edx
11feb4: 68 60 8d 12 00 push $0x128d60
11feb9: e8 ea ec fe ff call 10eba8 <_Watchdog_Insert>
_Thread_Enable_dispatch();
11febe: e8 fd de fe ff call 10ddc0 <_Thread_Enable_dispatch>
/* calculate time remaining */
if ( rmtp ) {
11fec3: 83 c4 10 add $0x10,%esp
11fec6: 85 db test %ebx,%ebx
11fec8: 74 1c je 11fee6 <nanosleep+0xe2>
ticks -=
_Thread_Executing->Timer.stop_time - _Thread_Executing->Timer.start_time;
11feca: a1 38 92 12 00 mov 0x129238,%eax
11fecf: 03 70 5c add 0x5c(%eax),%esi
_Thread_Enable_dispatch();
/* calculate time remaining */
if ( rmtp ) {
ticks -=
11fed2: 2b 70 60 sub 0x60(%eax),%esi
_Thread_Executing->Timer.stop_time - _Thread_Executing->Timer.start_time;
_Timespec_From_ticks( ticks, rmtp );
11fed5: 83 ec 08 sub $0x8,%esp
11fed8: 53 push %ebx
11fed9: 56 push %esi
11feda: e8 71 00 00 00 call 11ff50 <_Timespec_From_ticks>
*/
#if defined(RTEMS_POSIX_API)
/*
* If there is time remaining, then we were interrupted by a signal.
*/
if ( ticks )
11fedf: 83 c4 10 add $0x10,%esp
11fee2: 85 f6 test %esi,%esi
11fee4: 75 09 jne 11feef <nanosleep+0xeb>
rtems_set_errno_and_return_minus_one( EINTR );
#endif
}
return 0;
11fee6: 31 c0 xor %eax,%eax
}
11fee8: 8d 65 f8 lea -0x8(%ebp),%esp
11feeb: 5b pop %ebx
11feec: 5e pop %esi
11feed: c9 leave
11feee: c3 ret
#if defined(RTEMS_POSIX_API)
/*
* If there is time remaining, then we were interrupted by a signal.
*/
if ( ticks )
rtems_set_errno_and_return_minus_one( EINTR );
11feef: e8 1c 38 ff ff call 113710 <__errno>
11fef4: c7 00 04 00 00 00 movl $0x4,(%eax)
11fefa: b8 ff ff ff ff mov $0xffffffff,%eax
11feff: e9 5e ff ff ff jmp 11fe62 <nanosleep+0x5e>
*
* NOTE: This behavior is beyond the POSIX specification.
* FSU and GNU/Linux pthreads shares this behavior.
*/
if ( !_Timespec_Is_valid( rqtp ) )
rtems_set_errno_and_return_minus_one( EINVAL );
11ff04: e8 07 38 ff ff call 113710 <__errno>
11ff09: c7 00 16 00 00 00 movl $0x16,(%eax)
11ff0f: b8 ff ff ff ff mov $0xffffffff,%eax
11ff14: e9 49 ff ff ff jmp 11fe62 <nanosleep+0x5e>
00110950 <pthread_attr_destroy>:
#include <rtems/system.h>
int pthread_attr_destroy(
pthread_attr_t *attr
)
{
110950: 55 push %ebp
110951: 89 e5 mov %esp,%ebp
110953: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110956: 85 c0 test %eax,%eax
110958: 74 12 je 11096c <pthread_attr_destroy+0x1c>
11095a: 8b 10 mov (%eax),%edx
11095c: 85 d2 test %edx,%edx
11095e: 74 0c je 11096c <pthread_attr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
110960: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
110966: 31 c0 xor %eax,%eax
}
110968: c9 leave
110969: c3 ret
11096a: 66 90 xchg %ax,%ax
int pthread_attr_destroy(
pthread_attr_t *attr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
11096c: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
110971: c9 leave
110972: c3 ret
00110ff0 <pthread_attr_getcputime>:
int pthread_attr_getcputime(
pthread_attr_t *attr,
int *clock_allowed
)
{
110ff0: 55 push %ebp
110ff1: 89 e5 mov %esp,%ebp
110ff3: 8b 45 08 mov 0x8(%ebp),%eax
110ff6: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized || !clock_allowed )
110ff9: 85 c0 test %eax,%eax
110ffb: 74 13 je 111010 <pthread_attr_getcputime+0x20><== NEVER TAKEN
110ffd: 8b 08 mov (%eax),%ecx
110fff: 85 c9 test %ecx,%ecx
111001: 74 0d je 111010 <pthread_attr_getcputime+0x20>
111003: 85 d2 test %edx,%edx
111005: 74 09 je 111010 <pthread_attr_getcputime+0x20>
return EINVAL;
*clock_allowed = attr->cputime_clock_allowed;
111007: 8b 40 38 mov 0x38(%eax),%eax
11100a: 89 02 mov %eax,(%edx)
return 0;
11100c: 31 c0 xor %eax,%eax
}
11100e: c9 leave
11100f: c3 ret
pthread_attr_t *attr,
int *clock_allowed
)
{
if ( !attr || !attr->is_initialized || !clock_allowed )
return EINVAL;
111010: b8 16 00 00 00 mov $0x16,%eax
*clock_allowed = attr->cputime_clock_allowed;
return 0;
}
111015: c9 leave
111016: c3 ret
00110a9c <pthread_attr_getstack>:
int pthread_attr_getstack(
const pthread_attr_t *attr,
void **stackaddr,
size_t *stacksize
)
{
110a9c: 55 push %ebp
110a9d: 89 e5 mov %esp,%ebp
110a9f: 53 push %ebx
110aa0: 8b 45 08 mov 0x8(%ebp),%eax
110aa3: 8b 55 0c mov 0xc(%ebp),%edx
110aa6: 8b 4d 10 mov 0x10(%ebp),%ecx
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
110aa9: 85 c0 test %eax,%eax
110aab: 74 1f je 110acc <pthread_attr_getstack+0x30>
110aad: 8b 18 mov (%eax),%ebx
110aaf: 85 db test %ebx,%ebx
110ab1: 74 19 je 110acc <pthread_attr_getstack+0x30>
110ab3: 85 d2 test %edx,%edx
110ab5: 74 15 je 110acc <pthread_attr_getstack+0x30>
110ab7: 85 c9 test %ecx,%ecx
110ab9: 74 11 je 110acc <pthread_attr_getstack+0x30>
return EINVAL;
*stackaddr = attr->stackaddr;
110abb: 8b 58 04 mov 0x4(%eax),%ebx
110abe: 89 1a mov %ebx,(%edx)
*stacksize = attr->stacksize;
110ac0: 8b 40 08 mov 0x8(%eax),%eax
110ac3: 89 01 mov %eax,(%ecx)
return 0;
110ac5: 31 c0 xor %eax,%eax
}
110ac7: 5b pop %ebx
110ac8: c9 leave
110ac9: c3 ret
110aca: 66 90 xchg %ax,%ax
void **stackaddr,
size_t *stacksize
)
{
if ( !attr || !attr->is_initialized || !stackaddr || !stacksize )
return EINVAL;
110acc: b8 16 00 00 00 mov $0x16,%eax
*stackaddr = attr->stackaddr;
*stacksize = attr->stacksize;
return 0;
}
110ad1: 5b pop %ebx
110ad2: c9 leave
110ad3: c3 ret
00110b50 <pthread_attr_setguardsize>:
int pthread_attr_setguardsize(
pthread_attr_t *attr,
size_t guardsize
)
{
110b50: 55 push %ebp
110b51: 89 e5 mov %esp,%ebp
110b53: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110b56: 85 c0 test %eax,%eax
110b58: 74 12 je 110b6c <pthread_attr_setguardsize+0x1c>
110b5a: 8b 10 mov (%eax),%edx
110b5c: 85 d2 test %edx,%edx
110b5e: 74 0c je 110b6c <pthread_attr_setguardsize+0x1c>
return EINVAL;
attr->guardsize = guardsize;
110b60: 8b 55 0c mov 0xc(%ebp),%edx
110b63: 89 50 34 mov %edx,0x34(%eax)
return 0;
110b66: 31 c0 xor %eax,%eax
}
110b68: c9 leave
110b69: c3 ret
110b6a: 66 90 xchg %ax,%ax
pthread_attr_t *attr,
size_t guardsize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110b6c: b8 16 00 00 00 mov $0x16,%eax
attr->guardsize = guardsize;
return 0;
}
110b71: c9 leave
110b72: c3 ret
00111b7c <pthread_attr_setinheritsched>:
int pthread_attr_setinheritsched(
pthread_attr_t *attr,
int inheritsched
)
{
111b7c: 55 push %ebp
111b7d: 89 e5 mov %esp,%ebp
111b7f: 8b 45 08 mov 0x8(%ebp),%eax
111b82: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
111b85: 85 c0 test %eax,%eax
111b87: 74 1f je 111ba8 <pthread_attr_setinheritsched+0x2c>
111b89: 8b 08 mov (%eax),%ecx
111b8b: 85 c9 test %ecx,%ecx
111b8d: 74 19 je 111ba8 <pthread_attr_setinheritsched+0x2c>
return EINVAL;
switch ( inheritsched ) {
111b8f: 8d 4a ff lea -0x1(%edx),%ecx
111b92: 83 f9 01 cmp $0x1,%ecx
111b95: 76 09 jbe 111ba0 <pthread_attr_setinheritsched+0x24>
case PTHREAD_EXPLICIT_SCHED:
attr->inheritsched = inheritsched;
return 0;
default:
return ENOTSUP;
111b97: b8 86 00 00 00 mov $0x86,%eax
}
}
111b9c: c9 leave
111b9d: c3 ret
111b9e: 66 90 xchg %ax,%ax
return EINVAL;
switch ( inheritsched ) {
case PTHREAD_INHERIT_SCHED:
case PTHREAD_EXPLICIT_SCHED:
attr->inheritsched = inheritsched;
111ba0: 89 50 10 mov %edx,0x10(%eax)
return 0;
111ba3: 31 c0 xor %eax,%eax
default:
return ENOTSUP;
}
}
111ba5: c9 leave
111ba6: c3 ret
111ba7: 90 nop
pthread_attr_t *attr,
int inheritsched
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
111ba8: b8 16 00 00 00 mov $0x16,%eax
return 0;
default:
return ENOTSUP;
}
}
111bad: c9 leave
111bae: c3 ret
00110ba8 <pthread_attr_setschedparam>:
int pthread_attr_setschedparam(
pthread_attr_t *attr,
const struct sched_param *param
)
{
110ba8: 55 push %ebp
110ba9: 89 e5 mov %esp,%ebp
110bab: 57 push %edi
110bac: 56 push %esi
110bad: 8b 7d 08 mov 0x8(%ebp),%edi
110bb0: 8b 75 0c mov 0xc(%ebp),%esi
if ( !attr || !attr->is_initialized || !param )
110bb3: 85 ff test %edi,%edi
110bb5: 74 1d je 110bd4 <pthread_attr_setschedparam+0x2c>
110bb7: 8b 07 mov (%edi),%eax
110bb9: 85 c0 test %eax,%eax
110bbb: 74 17 je 110bd4 <pthread_attr_setschedparam+0x2c>
110bbd: 85 f6 test %esi,%esi
110bbf: 74 13 je 110bd4 <pthread_attr_setschedparam+0x2c>
return EINVAL;
attr->schedparam = *param;
110bc1: 83 c7 18 add $0x18,%edi
110bc4: b9 07 00 00 00 mov $0x7,%ecx
110bc9: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
return 0;
110bcb: 31 c0 xor %eax,%eax
}
110bcd: 5e pop %esi
110bce: 5f pop %edi
110bcf: c9 leave
110bd0: c3 ret
110bd1: 8d 76 00 lea 0x0(%esi),%esi
pthread_attr_t *attr,
const struct sched_param *param
)
{
if ( !attr || !attr->is_initialized || !param )
return EINVAL;
110bd4: b8 16 00 00 00 mov $0x16,%eax
attr->schedparam = *param;
return 0;
}
110bd9: 5e pop %esi
110bda: 5f pop %edi
110bdb: c9 leave
110bdc: c3 ret
00110be0 <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
110be0: 55 push %ebp
110be1: 89 e5 mov %esp,%ebp
110be3: 8b 45 08 mov 0x8(%ebp),%eax
110be6: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
110be9: 85 c0 test %eax,%eax
110beb: 74 23 je 110c10 <pthread_attr_setschedpolicy+0x30>
110bed: 8b 08 mov (%eax),%ecx
110bef: 85 c9 test %ecx,%ecx
110bf1: 74 1d je 110c10 <pthread_attr_setschedpolicy+0x30>
return EINVAL;
switch ( policy ) {
110bf3: 85 d2 test %edx,%edx
110bf5: 78 0a js 110c01 <pthread_attr_setschedpolicy+0x21>
110bf7: 83 fa 02 cmp $0x2,%edx
110bfa: 7e 0c jle 110c08 <pthread_attr_setschedpolicy+0x28>
110bfc: 83 fa 04 cmp $0x4,%edx
110bff: 74 07 je 110c08 <pthread_attr_setschedpolicy+0x28><== ALWAYS TAKEN
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
110c01: b8 86 00 00 00 mov $0x86,%eax
}
}
110c06: c9 leave
110c07: c3 ret
switch ( policy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
110c08: 89 50 14 mov %edx,0x14(%eax)
return 0;
110c0b: 31 c0 xor %eax,%eax
default:
return ENOTSUP;
}
}
110c0d: c9 leave
110c0e: c3 ret
110c0f: 90 nop
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110c10: b8 16 00 00 00 mov $0x16,%eax
return 0;
default:
return ENOTSUP;
}
}
110c15: c9 leave
110c16: c3 ret
00110c18 <pthread_attr_setscope>:
int pthread_attr_setscope(
pthread_attr_t *attr,
int contentionscope
)
{
110c18: 55 push %ebp
110c19: 89 e5 mov %esp,%ebp
110c1b: 8b 45 08 mov 0x8(%ebp),%eax
110c1e: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
110c21: 85 c0 test %eax,%eax
110c23: 74 1a je 110c3f <pthread_attr_setscope+0x27>
110c25: 8b 08 mov (%eax),%ecx
110c27: 85 c9 test %ecx,%ecx
110c29: 74 14 je 110c3f <pthread_attr_setscope+0x27>
return EINVAL;
switch ( contentionscope ) {
110c2b: 85 d2 test %edx,%edx
110c2d: 75 0d jne 110c3c <pthread_attr_setscope+0x24>
case PTHREAD_SCOPE_PROCESS:
attr->contentionscope = contentionscope;
110c2f: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
return 0;
110c36: 31 c0 xor %eax,%eax
return ENOTSUP;
default:
return EINVAL;
}
}
110c38: c9 leave
110c39: c3 ret
110c3a: 66 90 xchg %ax,%ax
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
switch ( contentionscope ) {
110c3c: 4a dec %edx
110c3d: 74 09 je 110c48 <pthread_attr_setscope+0x30>
case PTHREAD_SCOPE_SYSTEM:
return ENOTSUP;
default:
return EINVAL;
110c3f: b8 16 00 00 00 mov $0x16,%eax
}
}
110c44: c9 leave
110c45: c3 ret
110c46: 66 90 xchg %ax,%ax
case PTHREAD_SCOPE_PROCESS:
attr->contentionscope = contentionscope;
return 0;
case PTHREAD_SCOPE_SYSTEM:
return ENOTSUP;
110c48: b8 86 00 00 00 mov $0x86,%eax
default:
return EINVAL;
}
}
110c4d: c9 leave
110c4e: c3 ret
00110c74 <pthread_attr_setstack>:
int pthread_attr_setstack(
pthread_attr_t *attr,
void *stackaddr,
size_t stacksize
)
{
110c74: 55 push %ebp
110c75: 89 e5 mov %esp,%ebp
110c77: 8b 45 08 mov 0x8(%ebp),%eax
110c7a: 8b 55 10 mov 0x10(%ebp),%edx
if ( !attr || !attr->is_initialized )
110c7d: 85 c0 test %eax,%eax
110c7f: 74 27 je 110ca8 <pthread_attr_setstack+0x34>
110c81: 8b 08 mov (%eax),%ecx
110c83: 85 c9 test %ecx,%ecx
110c85: 74 21 je 110ca8 <pthread_attr_setstack+0x34>
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
110c87: 8b 0d 18 e4 12 00 mov 0x12e418,%ecx
110c8d: d1 e1 shl %ecx
110c8f: 39 d1 cmp %edx,%ecx
110c91: 77 0d ja 110ca0 <pthread_attr_setstack+0x2c>
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
110c93: 89 50 08 mov %edx,0x8(%eax)
attr->stackaddr = stackaddr;
110c96: 8b 55 0c mov 0xc(%ebp),%edx
110c99: 89 50 04 mov %edx,0x4(%eax)
return 0;
110c9c: 31 c0 xor %eax,%eax
}
110c9e: c9 leave
110c9f: c3 ret
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
110ca0: 89 48 08 mov %ecx,0x8(%eax)
110ca3: eb f1 jmp 110c96 <pthread_attr_setstack+0x22>
110ca5: 8d 76 00 lea 0x0(%esi),%esi
void *stackaddr,
size_t stacksize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110ca8: b8 16 00 00 00 mov $0x16,%eax
else
attr->stacksize = stacksize;
attr->stackaddr = stackaddr;
return 0;
}
110cad: c9 leave
110cae: c3 ret
00110c50 <pthread_attr_setstackaddr>:
int pthread_attr_setstackaddr(
pthread_attr_t *attr,
void *stackaddr
)
{
110c50: 55 push %ebp
110c51: 89 e5 mov %esp,%ebp
110c53: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
110c56: 85 c0 test %eax,%eax
110c58: 74 12 je 110c6c <pthread_attr_setstackaddr+0x1c>
110c5a: 8b 10 mov (%eax),%edx
110c5c: 85 d2 test %edx,%edx
110c5e: 74 0c je 110c6c <pthread_attr_setstackaddr+0x1c>
return EINVAL;
attr->stackaddr = stackaddr;
110c60: 8b 55 0c mov 0xc(%ebp),%edx
110c63: 89 50 04 mov %edx,0x4(%eax)
return 0;
110c66: 31 c0 xor %eax,%eax
}
110c68: c9 leave
110c69: c3 ret
110c6a: 66 90 xchg %ax,%ax
pthread_attr_t *attr,
void *stackaddr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
110c6c: b8 16 00 00 00 mov $0x16,%eax
attr->stackaddr = stackaddr;
return 0;
}
110c71: c9 leave
110c72: c3 ret
00111bb0 <pthread_attr_setstacksize>:
int pthread_attr_setstacksize(
pthread_attr_t *attr,
size_t stacksize
)
{
111bb0: 55 push %ebp
111bb1: 89 e5 mov %esp,%ebp
111bb3: 8b 45 08 mov 0x8(%ebp),%eax
111bb6: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
111bb9: 85 c0 test %eax,%eax
111bbb: 74 23 je 111be0 <pthread_attr_setstacksize+0x30>
111bbd: 8b 08 mov (%eax),%ecx
111bbf: 85 c9 test %ecx,%ecx
111bc1: 74 1d je 111be0 <pthread_attr_setstacksize+0x30>
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
111bc3: 8b 0d 98 4d 12 00 mov 0x124d98,%ecx
111bc9: d1 e1 shl %ecx
111bcb: 39 d1 cmp %edx,%ecx
111bcd: 77 09 ja 111bd8 <pthread_attr_setstacksize+0x28>
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
else
attr->stacksize = stacksize;
111bcf: 89 50 08 mov %edx,0x8(%eax)
return 0;
111bd2: 31 c0 xor %eax,%eax
}
111bd4: c9 leave
111bd5: c3 ret
111bd6: 66 90 xchg %ax,%ax
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
111bd8: 89 48 08 mov %ecx,0x8(%eax)
else
attr->stacksize = stacksize;
return 0;
111bdb: 31 c0 xor %eax,%eax
}
111bdd: c9 leave
111bde: c3 ret
111bdf: 90 nop
pthread_attr_t *attr,
size_t stacksize
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
111be0: 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;
}
111be5: c9 leave
111be6: c3 ret
0010b99c <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
10b99c: 55 push %ebp
10b99d: 89 e5 mov %esp,%ebp
10b99f: 57 push %edi
10b9a0: 56 push %esi
10b9a1: 53 push %ebx
10b9a2: 83 ec 2c sub $0x2c,%esp
10b9a5: 8b 5d 08 mov 0x8(%ebp),%ebx
10b9a8: 8b 7d 0c mov 0xc(%ebp),%edi
10b9ab: 8b 75 10 mov 0x10(%ebp),%esi
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
10b9ae: 85 db test %ebx,%ebx
10b9b0: 0f 84 82 00 00 00 je 10ba38 <pthread_barrier_init+0x9c>
return EINVAL;
if ( count == 0 )
10b9b6: 85 f6 test %esi,%esi
10b9b8: 74 7e je 10ba38 <pthread_barrier_init+0x9c>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10b9ba: 85 ff test %edi,%edi
10b9bc: 0f 84 92 00 00 00 je 10ba54 <pthread_barrier_init+0xb8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10b9c2: 8b 17 mov (%edi),%edx
10b9c4: 85 d2 test %edx,%edx
10b9c6: 74 70 je 10ba38 <pthread_barrier_init+0x9c>
return EINVAL;
switch ( the_attr->process_shared ) {
10b9c8: 8b 47 04 mov 0x4(%edi),%eax
10b9cb: 85 c0 test %eax,%eax
10b9cd: 75 69 jne 10ba38 <pthread_barrier_init+0x9c><== NEVER TAKEN
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
10b9cf: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
the_attributes.maximum_count = count;
10b9d6: 89 75 e4 mov %esi,-0x1c(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b9d9: a1 90 85 12 00 mov 0x128590,%eax
10b9de: 40 inc %eax
10b9df: a3 90 85 12 00 mov %eax,0x128590
* 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 );
10b9e4: 83 ec 0c sub $0xc,%esp
10b9e7: 68 a0 89 12 00 push $0x1289a0
10b9ec: e8 f7 20 00 00 call 10dae8 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
10b9f1: 83 c4 10 add $0x10,%esp
10b9f4: 85 c0 test %eax,%eax
10b9f6: 74 50 je 10ba48 <pthread_barrier_init+0xac>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
10b9f8: 83 ec 08 sub $0x8,%esp
10b9fb: 8d 55 e0 lea -0x20(%ebp),%edx
10b9fe: 52 push %edx
10b9ff: 8d 50 10 lea 0x10(%eax),%edx
10ba02: 52 push %edx
10ba03: 89 45 d4 mov %eax,-0x2c(%ebp)
10ba06: e8 d9 16 00 00 call 10d0e4 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10ba0b: 8b 45 d4 mov -0x2c(%ebp),%eax
10ba0e: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10ba11: 0f b7 f2 movzwl %dx,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10ba14: 8b 0d bc 89 12 00 mov 0x1289bc,%ecx
10ba1a: 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;
10ba1d: 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;
10ba24: 89 13 mov %edx,(%ebx)
_Thread_Enable_dispatch();
10ba26: e8 e9 30 00 00 call 10eb14 <_Thread_Enable_dispatch>
return 0;
10ba2b: 83 c4 10 add $0x10,%esp
10ba2e: 31 c0 xor %eax,%eax
}
10ba30: 8d 65 f4 lea -0xc(%ebp),%esp
10ba33: 5b pop %ebx
10ba34: 5e pop %esi
10ba35: 5f pop %edi
10ba36: c9 leave
10ba37: c3 ret
switch ( the_attr->process_shared ) {
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10ba38: 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;
}
10ba3d: 8d 65 f4 lea -0xc(%ebp),%esp
10ba40: 5b pop %ebx
10ba41: 5e pop %esi
10ba42: 5f pop %edi
10ba43: c9 leave
10ba44: c3 ret
10ba45: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
10ba48: e8 c7 30 00 00 call 10eb14 <_Thread_Enable_dispatch>
return EAGAIN;
10ba4d: b8 0b 00 00 00 mov $0xb,%eax
10ba52: eb e9 jmp 10ba3d <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 );
10ba54: 83 ec 0c sub $0xc,%esp
10ba57: 8d 7d d8 lea -0x28(%ebp),%edi
10ba5a: 57 push %edi
10ba5b: e8 7c fe ff ff call 10b8dc <pthread_barrierattr_init>
10ba60: 83 c4 10 add $0x10,%esp
10ba63: e9 5a ff ff ff jmp 10b9c2 <pthread_barrier_init+0x26>
0010ba68 <pthread_barrier_wait>:
*/
int pthread_barrier_wait(
pthread_barrier_t *barrier
)
{
10ba68: 55 push %ebp
10ba69: 89 e5 mov %esp,%ebp
10ba6b: 83 ec 18 sub $0x18,%esp
10ba6e: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_Barrier_Control *the_barrier = NULL;
Objects_Locations location;
if ( !barrier )
10ba71: 85 c0 test %eax,%eax
10ba73: 74 4f je 10bac4 <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(
10ba75: 51 push %ecx
return EINVAL;
the_barrier = _POSIX_Barrier_Get( barrier, &location );
10ba76: 8d 55 f4 lea -0xc(%ebp),%edx
10ba79: 52 push %edx
10ba7a: ff 30 pushl (%eax)
10ba7c: 68 a0 89 12 00 push $0x1289a0
10ba81: e8 16 25 00 00 call 10df9c <_Objects_Get>
switch ( location ) {
10ba86: 83 c4 10 add $0x10,%esp
10ba89: 8b 55 f4 mov -0xc(%ebp),%edx
10ba8c: 85 d2 test %edx,%edx
10ba8e: 75 34 jne 10bac4 <pthread_barrier_wait+0x5c>
case OBJECTS_LOCAL:
_CORE_barrier_Wait(
10ba90: 83 ec 0c sub $0xc,%esp
10ba93: 6a 00 push $0x0
10ba95: 6a 00 push $0x0
10ba97: 6a 01 push $0x1
10ba99: ff 70 08 pushl 0x8(%eax)
10ba9c: 83 c0 10 add $0x10,%eax
10ba9f: 50 push %eax
10baa0: e8 73 16 00 00 call 10d118 <_CORE_barrier_Wait>
the_barrier->Object.id,
true,
0,
NULL
);
_Thread_Enable_dispatch();
10baa5: 83 c4 20 add $0x20,%esp
10baa8: e8 67 30 00 00 call 10eb14 <_Thread_Enable_dispatch>
return _POSIX_Barrier_Translate_core_barrier_return_code(
10baad: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code );
10bab0: a1 38 8b 12 00 mov 0x128b38,%eax
true,
0,
NULL
);
_Thread_Enable_dispatch();
return _POSIX_Barrier_Translate_core_barrier_return_code(
10bab5: ff 70 34 pushl 0x34(%eax)
10bab8: e8 07 5c 00 00 call 1116c4 <_POSIX_Barrier_Translate_core_barrier_return_code>
10babd: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10bac0: c9 leave
10bac1: c3 ret
10bac2: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10bac4: b8 16 00 00 00 mov $0x16,%eax
}
10bac9: c9 leave
10baca: c3 ret
0010b894 <pthread_barrierattr_destroy>:
*/
int pthread_barrierattr_destroy(
pthread_barrierattr_t *attr
)
{
10b894: 55 push %ebp
10b895: 89 e5 mov %esp,%ebp
10b897: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10b89a: 85 c0 test %eax,%eax
10b89c: 74 12 je 10b8b0 <pthread_barrierattr_destroy+0x1c>
10b89e: 8b 10 mov (%eax),%edx
10b8a0: 85 d2 test %edx,%edx
10b8a2: 74 0c je 10b8b0 <pthread_barrierattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10b8a4: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10b8aa: 31 c0 xor %eax,%eax
}
10b8ac: c9 leave
10b8ad: c3 ret
10b8ae: 66 90 xchg %ax,%ax
int pthread_barrierattr_destroy(
pthread_barrierattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10b8b0: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10b8b5: c9 leave
10b8b6: 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 96 12 00 mov 0x129654,%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 93 12 00 push $0x129340
10b159: e8 22 21 00 00 call 10d280 <_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 7b 55 00 00 call 1106fc <_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
0010afb4 <pthread_cleanup_pop>:
*/
void pthread_cleanup_pop(
int execute
)
{
10afb4: 55 push %ebp
10afb5: 89 e5 mov %esp,%ebp
10afb7: 57 push %edi
10afb8: 56 push %esi
10afb9: 53 push %ebx
10afba: 83 ec 0c sub $0xc,%esp
10afbd: 8b 75 08 mov 0x8(%ebp),%esi
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 ];
10afc0: a1 78 87 12 00 mov 0x128778,%eax
10afc5: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10afcb: 8b 15 d0 81 12 00 mov 0x1281d0,%edx
10afd1: 42 inc %edx
10afd2: 89 15 d0 81 12 00 mov %edx,0x1281d0
* 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 );
10afd8: 9c pushf
10afd9: fa cli
10afda: 5b pop %ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10afdb: 8d 90 e8 00 00 00 lea 0xe8(%eax),%edx
if ( _Chain_Is_empty( handler_stack ) ) {
10afe1: 39 90 e4 00 00 00 cmp %edx,0xe4(%eax)
10afe7: 74 47 je 10b030 <pthread_cleanup_pop+0x7c>
_Thread_Enable_dispatch();
_ISR_Enable( level );
return;
}
handler = (POSIX_Cancel_Handler_control *)
10afe9: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
10afef: 8b 08 mov (%eax),%ecx
previous = the_node->previous;
10aff1: 8b 50 04 mov 0x4(%eax),%edx
next->previous = previous;
10aff4: 89 51 04 mov %edx,0x4(%ecx)
previous->next = next;
10aff7: 89 0a mov %ecx,(%edx)
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
10aff9: 53 push %ebx
10affa: 9d popf
10affb: 8b 58 08 mov 0x8(%eax),%ebx
10affe: 8b 78 0c mov 0xc(%eax),%edi
tmp_handler = *handler;
_Workspace_Free( handler );
10b001: 83 ec 0c sub $0xc,%esp
10b004: 50 push %eax
10b005: e8 62 3a 00 00 call 10ea6c <_Workspace_Free>
_Thread_Enable_dispatch();
10b00a: e8 69 2a 00 00 call 10da78 <_Thread_Enable_dispatch>
if ( execute )
10b00f: 83 c4 10 add $0x10,%esp
10b012: 85 f6 test %esi,%esi
10b014: 75 0a jne 10b020 <pthread_cleanup_pop+0x6c>
(*tmp_handler.routine)( tmp_handler.arg );
}
10b016: 8d 65 f4 lea -0xc(%ebp),%esp
10b019: 5b pop %ebx
10b01a: 5e pop %esi
10b01b: 5f pop %edi
10b01c: c9 leave
10b01d: c3 ret
10b01e: 66 90 xchg %ax,%ax
_Workspace_Free( handler );
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
10b020: 89 7d 08 mov %edi,0x8(%ebp)
10b023: 89 d8 mov %ebx,%eax
}
10b025: 8d 65 f4 lea -0xc(%ebp),%esp
10b028: 5b pop %ebx
10b029: 5e pop %esi
10b02a: 5f pop %edi
10b02b: c9 leave
_Workspace_Free( handler );
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
10b02c: ff e0 jmp *%eax
10b02e: 66 90 xchg %ax,%ax
_Thread_Disable_dispatch();
_ISR_Disable( level );
if ( _Chain_Is_empty( handler_stack ) ) {
_Thread_Enable_dispatch();
10b030: e8 43 2a 00 00 call 10da78 <_Thread_Enable_dispatch>
_ISR_Enable( level );
10b035: 53 push %ebx
10b036: 9d popf
_Thread_Enable_dispatch();
if ( execute )
(*tmp_handler.routine)( tmp_handler.arg );
}
10b037: 8d 65 f4 lea -0xc(%ebp),%esp
10b03a: 5b pop %ebx
10b03b: 5e pop %esi
10b03c: 5f pop %edi
10b03d: c9 leave
10b03e: 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 30 98 12 00 mov 0x129830,%eax
10b374: 40 inc %eax
10b375: a3 30 98 12 00 mov %eax,0x129830
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 28 42 00 00 call 10f5ac <_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 9d 12 00 mov 0x129dd8,%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 bf 17 00 00 call 10cb6c <_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 89 31 00 00 jmp 10e544 <_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 3d 3e 00 00 call 10febc <_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 51 37 00 00 call 10f7dc <_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 40 9a 12 00 push $0x129a40
10c0ad: e8 7a 27 00 00 call 10e82c <_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 40 9a 12 00 push $0x129a40
10c0ba: e8 65 2a 00 00 call 10eb24 <_Objects_Free>
&_POSIX_Condition_variables_Information,
&the_cond->Object
);
_POSIX_Condition_variables_Free( the_cond );
_Thread_Enable_dispatch();
10c0bf: e8 18 37 00 00 call 10f7dc <_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 90 95 12 00 mov 0x129590,%eax
10c14d: 40 inc %eax
10c14e: a3 90 95 12 00 mov %eax,0x129590
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 40 9a 12 00 push $0x129a40
10c15b: e8 50 26 00 00 call 10e7b0 <_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 af 3d 00 00 call 10ff38 <_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 5c 9a 12 00 mov 0x129a5c,%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 30 36 00 00 call 10f7dc <_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 3b 12 00 mov $0x123b3c,%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 13 36 00 00 call 10f7dc <_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 3b 12 00 mov 0x123b3c,%edx
10c004: 8b 0d 40 3b 12 00 mov 0x123b40,%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
0010b6d8 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
10b6d8: 55 push %ebp
10b6d9: 89 e5 mov %esp,%ebp
10b6db: 57 push %edi
10b6dc: 56 push %esi
10b6dd: 53 push %ebx
10b6de: 83 ec 5c sub $0x5c,%esp
10b6e1: 8b 5d 0c mov 0xc(%ebp),%ebx
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
10b6e4: 8b 75 10 mov 0x10(%ebp),%esi
10b6e7: 85 f6 test %esi,%esi
10b6e9: 0f 84 8d 01 00 00 je 10b87c <pthread_create+0x1a4>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10b6ef: 85 db test %ebx,%ebx
10b6f1: 74 65 je 10b758 <pthread_create+0x80>
if ( !the_attr->is_initialized )
10b6f3: 8b 0b mov (%ebx),%ecx
10b6f5: 85 c9 test %ecx,%ecx
10b6f7: 74 1e je 10b717 <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) )
10b6f9: 8b 53 04 mov 0x4(%ebx),%edx
10b6fc: 85 d2 test %edx,%edx
10b6fe: 74 0a je 10b70a <pthread_create+0x32>
10b700: a1 98 4d 12 00 mov 0x124d98,%eax
10b705: 39 43 08 cmp %eax,0x8(%ebx)
10b708: 72 0d jb 10b717 <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 ) {
10b70a: 8b 43 10 mov 0x10(%ebx),%eax
10b70d: 83 f8 01 cmp $0x1,%eax
10b710: 74 4e je 10b760 <pthread_create+0x88>
10b712: 83 f8 02 cmp $0x2,%eax
10b715: 74 11 je 10b728 <pthread_create+0x50>
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
return EINVAL;
10b717: ba 16 00 00 00 mov $0x16,%edx
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10b71c: 89 d0 mov %edx,%eax
10b71e: 8d 65 f4 lea -0xc(%ebp),%esp
10b721: 5b pop %ebx
10b722: 5e pop %esi
10b723: 5f pop %edi
10b724: c9 leave
10b725: c3 ret
10b726: 66 90 xchg %ax,%ax
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
10b728: 8b 4b 14 mov 0x14(%ebx),%ecx
10b72b: 89 4d b0 mov %ecx,-0x50(%ebp)
schedparam = the_attr->schedparam;
10b72e: 8d 45 c4 lea -0x3c(%ebp),%eax
10b731: 89 45 b4 mov %eax,-0x4c(%ebp)
10b734: 8d 73 18 lea 0x18(%ebx),%esi
10b737: b9 07 00 00 00 mov $0x7,%ecx
10b73c: 89 c7 mov %eax,%edi
10b73e: 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 )
10b740: 8b 43 0c mov 0xc(%ebx),%eax
10b743: 85 c0 test %eax,%eax
10b745: 74 49 je 10b790 <pthread_create+0xb8> <== ALWAYS TAKEN
return ENOTSUP;
10b747: ba 86 00 00 00 mov $0x86,%edx
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
10b74c: 89 d0 mov %edx,%eax
10b74e: 8d 65 f4 lea -0xc(%ebp),%esp
10b751: 5b pop %ebx
10b752: 5e pop %esi
10b753: 5f pop %edi
10b754: c9 leave
10b755: c3 ret
10b756: 66 90 xchg %ax,%ax
int rc;
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
10b758: bb 00 27 12 00 mov $0x122700,%ebx
10b75d: eb 94 jmp 10b6f3 <pthread_create+0x1b>
10b75f: 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 ];
10b760: a1 38 96 12 00 mov 0x129638,%eax
10b765: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
schedpolicy = api->schedpolicy;
10b76b: 8b 8e 84 00 00 00 mov 0x84(%esi),%ecx
10b771: 89 4d b0 mov %ecx,-0x50(%ebp)
schedparam = api->schedparam;
10b774: 8d 45 c4 lea -0x3c(%ebp),%eax
10b777: 89 45 b4 mov %eax,-0x4c(%ebp)
10b77a: 81 c6 88 00 00 00 add $0x88,%esi
10b780: b9 07 00 00 00 mov $0x7,%ecx
10b785: 89 c7 mov %eax,%edi
10b787: 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 )
10b789: 8b 43 0c mov 0xc(%ebx),%eax
10b78c: 85 c0 test %eax,%eax
10b78e: 75 b7 jne 10b747 <pthread_create+0x6f>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
10b790: 83 ec 0c sub $0xc,%esp
10b793: ff 75 c4 pushl -0x3c(%ebp)
10b796: e8 b5 62 00 00 call 111a50 <_POSIX_Priority_Is_valid>
10b79b: 83 c4 10 add $0x10,%esp
10b79e: 84 c0 test %al,%al
10b7a0: 0f 84 71 ff ff ff je 10b717 <pthread_create+0x3f> <== NEVER TAKEN
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
10b7a6: 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);
10b7a9: 0f b6 35 9c 4d 12 00 movzbl 0x124d9c,%esi
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
10b7b0: 8d 45 e0 lea -0x20(%ebp),%eax
10b7b3: 50 push %eax
10b7b4: 8d 45 e4 lea -0x1c(%ebp),%eax
10b7b7: 50 push %eax
10b7b8: ff 75 b4 pushl -0x4c(%ebp)
10b7bb: ff 75 b0 pushl -0x50(%ebp)
10b7be: e8 a9 62 00 00 call 111a6c <_POSIX_Thread_Translate_sched_param>
10b7c3: 89 c2 mov %eax,%edx
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
10b7c5: 83 c4 10 add $0x10,%esp
10b7c8: 85 c0 test %eax,%eax
10b7ca: 0f 85 4c ff ff ff jne 10b71c <pthread_create+0x44>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
10b7d0: 83 ec 0c sub $0xc,%esp
10b7d3: ff 35 40 91 12 00 pushl 0x129140
10b7d9: 89 45 a0 mov %eax,-0x60(%ebp)
10b7dc: e8 b3 17 00 00 call 10cf94 <_API_Mutex_Lock>
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
10b7e1: c7 04 24 20 93 12 00 movl $0x129320,(%esp)
10b7e8: e8 cb 21 00 00 call 10d9b8 <_Objects_Allocate>
10b7ed: 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 ) {
10b7f0: 83 c4 10 add $0x10,%esp
10b7f3: 85 c0 test %eax,%eax
10b7f5: 8b 55 a0 mov -0x60(%ebp),%edx
10b7f8: 0f 84 0f 01 00 00 je 10b90d <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(
10b7fe: 8b 4d e0 mov -0x20(%ebp),%ecx
10b801: 8b 45 e4 mov -0x1c(%ebp),%eax
10b804: 89 45 a4 mov %eax,-0x5c(%ebp)
10b807: 8b 43 08 mov 0x8(%ebx),%eax
10b80a: 89 45 a8 mov %eax,-0x58(%ebp)
10b80d: a1 98 4d 12 00 mov 0x124d98,%eax
10b812: d1 e0 shl %eax
10b814: 3b 45 a8 cmp -0x58(%ebp),%eax
10b817: 73 03 jae 10b81c <pthread_create+0x144>
10b819: 8b 45 a8 mov -0x58(%ebp),%eax
10b81c: 83 ec 04 sub $0x4,%esp
10b81f: 6a 00 push $0x0
10b821: 6a 00 push $0x0
10b823: 51 push %ecx
10b824: ff 75 a4 pushl -0x5c(%ebp)
10b827: 6a 01 push $0x1
10b829: 81 e6 ff 00 00 00 and $0xff,%esi
10b82f: 29 fe sub %edi,%esi
10b831: 56 push %esi
10b832: 6a 01 push $0x1
10b834: 50 push %eax
10b835: ff 73 04 pushl 0x4(%ebx)
10b838: ff 75 ac pushl -0x54(%ebp)
10b83b: 68 20 93 12 00 push $0x129320
10b840: 89 55 a0 mov %edx,-0x60(%ebp)
10b843: e8 34 32 00 00 call 10ea7c <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
10b848: 83 c4 30 add $0x30,%esp
10b84b: 84 c0 test %al,%al
10b84d: 8b 55 a0 mov -0x60(%ebp),%edx
10b850: 75 34 jne 10b886 <pthread_create+0x1ae>
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
10b852: 83 ec 08 sub $0x8,%esp
10b855: ff 75 ac pushl -0x54(%ebp)
10b858: 68 20 93 12 00 push $0x129320
10b85d: e8 ca 24 00 00 call 10dd2c <_Objects_Free>
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
10b862: 59 pop %ecx
10b863: ff 35 40 91 12 00 pushl 0x129140
10b869: e8 6e 17 00 00 call 10cfdc <_API_Mutex_Unlock>
return EAGAIN;
10b86e: 83 c4 10 add $0x10,%esp
10b871: ba 0b 00 00 00 mov $0xb,%edx
10b876: e9 a1 fe ff ff jmp 10b71c <pthread_create+0x44>
10b87b: 90 nop
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
10b87c: ba 0e 00 00 00 mov $0xe,%edx
10b881: e9 96 fe ff ff jmp 10b71c <pthread_create+0x44>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10b886: 8b 4d ac mov -0x54(%ebp),%ecx
10b889: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
10b88f: 89 4d a8 mov %ecx,-0x58(%ebp)
api->Attributes = *the_attr;
10b892: b9 10 00 00 00 mov $0x10,%ecx
10b897: 8b 7d a8 mov -0x58(%ebp),%edi
10b89a: 89 de mov %ebx,%esi
10b89c: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
api->detachstate = the_attr->detachstate;
10b89e: 8b 43 3c mov 0x3c(%ebx),%eax
10b8a1: 8b 4d a8 mov -0x58(%ebp),%ecx
10b8a4: 89 41 40 mov %eax,0x40(%ecx)
api->schedpolicy = schedpolicy;
10b8a7: 8b 45 b0 mov -0x50(%ebp),%eax
10b8aa: 89 81 84 00 00 00 mov %eax,0x84(%ecx)
api->schedparam = schedparam;
10b8b0: 89 cf mov %ecx,%edi
10b8b2: 81 c7 88 00 00 00 add $0x88,%edi
10b8b8: b9 07 00 00 00 mov $0x7,%ecx
10b8bd: 8b 75 b4 mov -0x4c(%ebp),%esi
10b8c0: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
10b8c2: 83 ec 0c sub $0xc,%esp
10b8c5: 6a 00 push $0x0
10b8c7: ff 75 14 pushl 0x14(%ebp)
10b8ca: ff 75 10 pushl 0x10(%ebp)
10b8cd: 6a 01 push $0x1
10b8cf: ff 75 ac pushl -0x54(%ebp)
10b8d2: 89 55 a0 mov %edx,-0x60(%ebp)
10b8d5: e8 92 3a 00 00 call 10f36c <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
10b8da: 83 c4 20 add $0x20,%esp
10b8dd: 83 7d b0 04 cmpl $0x4,-0x50(%ebp)
10b8e1: 8b 55 a0 mov -0x60(%ebp),%edx
10b8e4: 74 42 je 10b928 <pthread_create+0x250>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
10b8e6: 8b 45 ac mov -0x54(%ebp),%eax
10b8e9: 8b 48 08 mov 0x8(%eax),%ecx
10b8ec: 8b 45 08 mov 0x8(%ebp),%eax
10b8ef: 89 08 mov %ecx,(%eax)
_RTEMS_Unlock_allocator();
10b8f1: 83 ec 0c sub $0xc,%esp
10b8f4: ff 35 40 91 12 00 pushl 0x129140
10b8fa: 89 55 a0 mov %edx,-0x60(%ebp)
10b8fd: e8 da 16 00 00 call 10cfdc <_API_Mutex_Unlock>
return 0;
10b902: 83 c4 10 add $0x10,%esp
10b905: 8b 55 a0 mov -0x60(%ebp),%edx
10b908: e9 0f fe ff ff jmp 10b71c <pthread_create+0x44>
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
10b90d: 83 ec 0c sub $0xc,%esp
10b910: ff 35 40 91 12 00 pushl 0x129140
10b916: e8 c1 16 00 00 call 10cfdc <_API_Mutex_Unlock>
return EAGAIN;
10b91b: 83 c4 10 add $0x10,%esp
10b91e: ba 0b 00 00 00 mov $0xb,%edx
10b923: e9 f4 fd ff ff jmp 10b71c <pthread_create+0x44>
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10b928: 83 ec 0c sub $0xc,%esp
&api->Sporadic_timer,
_Timespec_To_ticks( &api->schedparam.sched_ss_repl_period )
10b92b: 8b 45 a8 mov -0x58(%ebp),%eax
10b92e: 05 90 00 00 00 add $0x90,%eax
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
10b933: 50 push %eax
10b934: e8 c3 3b 00 00 call 10f4fc <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b939: 8b 4d a8 mov -0x58(%ebp),%ecx
10b93c: 89 81 b4 00 00 00 mov %eax,0xb4(%ecx)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b942: 58 pop %eax
10b943: 5a pop %edx
10b944: 89 c8 mov %ecx,%eax
10b946: 05 a8 00 00 00 add $0xa8,%eax
10b94b: 50 push %eax
10b94c: 68 60 91 12 00 push $0x129160
10b951: e8 d6 3e 00 00 call 10f82c <_Watchdog_Insert>
10b956: 83 c4 10 add $0x10,%esp
10b959: 8b 55 a0 mov -0x60(%ebp),%edx
10b95c: eb 88 jmp 10b8e6 <pthread_create+0x20e>
00112dd4 <pthread_exit>:
}
void pthread_exit(
void *value_ptr
)
{
112dd4: 55 push %ebp
112dd5: 89 e5 mov %esp,%ebp
112dd7: 83 ec 10 sub $0x10,%esp
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
112dda: ff 75 08 pushl 0x8(%ebp)
112ddd: ff 35 38 83 12 00 pushl 0x128338
112de3: e8 88 ff ff ff call 112d70 <_POSIX_Thread_Exit>
112de8: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
112deb: c9 leave <== NOT EXECUTED
112dec: c3 ret <== NOT EXECUTED
0010d8d0 <pthread_getschedparam>:
int pthread_getschedparam(
pthread_t thread,
int *policy,
struct sched_param *param
)
{
10d8d0: 55 push %ebp
10d8d1: 89 e5 mov %esp,%ebp
10d8d3: 57 push %edi
10d8d4: 56 push %esi
10d8d5: 53 push %ebx
10d8d6: 83 ec 1c sub $0x1c,%esp
10d8d9: 8b 7d 0c mov 0xc(%ebp),%edi
10d8dc: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Locations location;
POSIX_API_Control *api;
register Thread_Control *the_thread;
if ( !policy || !param )
10d8df: 85 ff test %edi,%edi
10d8e1: 74 69 je 10d94c <pthread_getschedparam+0x7c>
10d8e3: 85 db test %ebx,%ebx
10d8e5: 74 65 je 10d94c <pthread_getschedparam+0x7c>
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
10d8e7: 51 push %ecx
return EINVAL;
the_thread = _POSIX_Threads_Get( thread, &location );
10d8e8: 8d 45 e4 lea -0x1c(%ebp),%eax
10d8eb: 50 push %eax
10d8ec: ff 75 08 pushl 0x8(%ebp)
10d8ef: 68 80 cf 12 00 push $0x12cf80
10d8f4: e8 ff 23 00 00 call 10fcf8 <_Objects_Get>
switch ( location ) {
10d8f9: 83 c4 10 add $0x10,%esp
10d8fc: 8b 55 e4 mov -0x1c(%ebp),%edx
10d8ff: 85 d2 test %edx,%edx
10d901: 75 39 jne 10d93c <pthread_getschedparam+0x6c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10d903: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi
if ( policy )
*policy = api->schedpolicy;
10d909: 8b 96 84 00 00 00 mov 0x84(%esi),%edx
10d90f: 89 17 mov %edx,(%edi)
if ( param ) {
*param = api->schedparam;
10d911: 81 c6 88 00 00 00 add $0x88,%esi
10d917: b9 07 00 00 00 mov $0x7,%ecx
10d91c: 89 df mov %ebx,%edi
10d91e: 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);
10d920: 0f b6 15 9c 89 12 00 movzbl 0x12899c,%edx
10d927: 2b 50 14 sub 0x14(%eax),%edx
10d92a: 89 13 mov %edx,(%ebx)
param->sched_priority =
_POSIX_Priority_From_core( the_thread->current_priority );
}
_Thread_Enable_dispatch();
10d92c: e8 3f 2f 00 00 call 110870 <_Thread_Enable_dispatch>
return 0;
10d931: 31 c0 xor %eax,%eax
break;
}
return ESRCH;
}
10d933: 8d 65 f4 lea -0xc(%ebp),%esp
10d936: 5b pop %ebx
10d937: 5e pop %esi
10d938: 5f pop %edi
10d939: c9 leave
10d93a: c3 ret
10d93b: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10d93c: b8 03 00 00 00 mov $0x3,%eax
}
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
10d949: 8d 76 00 lea 0x0(%esi),%esi
Objects_Locations location;
POSIX_API_Control *api;
register Thread_Control *the_thread;
if ( !policy || !param )
return EINVAL;
10d94c: b8 16 00 00 00 mov $0x16,%eax
break;
}
return ESRCH;
}
10d951: 8d 65 f4 lea -0xc(%ebp),%esp
10d954: 5b pop %ebx
10d955: 5e pop %esi
10d956: 5f pop %edi
10d957: c9 leave
10d958: c3 ret
0010b6b8 <pthread_getspecific>:
*/
void *pthread_getspecific(
pthread_key_t key
)
{
10b6b8: 55 push %ebp
10b6b9: 89 e5 mov %esp,%ebp
10b6bb: 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 );
10b6be: 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 );
10b6c1: 50 push %eax
10b6c2: ff 75 08 pushl 0x8(%ebp)
10b6c5: 68 20 a1 12 00 push $0x12a120
10b6ca: e8 9d 25 00 00 call 10dc6c <_Objects_Get>
switch ( location ) {
10b6cf: 83 c4 10 add $0x10,%esp
10b6d2: 8b 55 f4 mov -0xc(%ebp),%edx
10b6d5: 85 d2 test %edx,%edx
10b6d7: 75 2b jne 10b704 <pthread_getspecific+0x4c>
case OBJECTS_LOCAL:
api = _Objects_Get_API( _Thread_Executing->Object.id );
10b6d9: 8b 15 58 a2 12 00 mov 0x12a258,%edx
10b6df: 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);
10b6e2: 89 ca mov %ecx,%edx
10b6e4: c1 ea 18 shr $0x18,%edx
10b6e7: 83 e2 07 and $0x7,%edx
index = _Objects_Get_index( _Thread_Executing->Object.id );
10b6ea: 0f b7 c9 movzwl %cx,%ecx
key_data = (void *) the_key->Values[ api ][ index ];
10b6ed: 8b 44 90 14 mov 0x14(%eax,%edx,4),%eax
10b6f1: 8b 04 88 mov (%eax,%ecx,4),%eax
_Thread_Enable_dispatch();
10b6f4: 89 45 e4 mov %eax,-0x1c(%ebp)
10b6f7: e8 e8 30 00 00 call 10e7e4 <_Thread_Enable_dispatch>
return key_data;
10b6fc: 8b 45 e4 mov -0x1c(%ebp),%eax
case OBJECTS_ERROR:
break;
}
return NULL;
}
10b6ff: c9 leave
10b700: c3 ret
10b701: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return NULL;
10b704: 31 c0 xor %eax,%eax
}
10b706: c9 leave
10b707: c3 ret
00111118 <pthread_join>:
int pthread_join(
pthread_t thread,
void **value_ptr
)
{
111118: 55 push %ebp
111119: 89 e5 mov %esp,%ebp
11111b: 53 push %ebx
11111c: 83 ec 18 sub $0x18,%esp
11111f: 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 );
111122: 8d 45 f4 lea -0xc(%ebp),%eax
111125: 50 push %eax
111126: ff 75 08 pushl 0x8(%ebp)
111129: 68 40 2a 13 00 push $0x132a40
11112e: e8 09 24 00 00 call 11353c <_Objects_Get>
switch ( location ) {
111133: 83 c4 10 add $0x10,%esp
111136: 8b 55 f4 mov -0xc(%ebp),%edx
111139: 85 d2 test %edx,%edx
11113b: 74 0b je 111148 <pthread_join+0x30>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
11113d: b8 03 00 00 00 mov $0x3,%eax
}
111142: 8b 5d fc mov -0x4(%ebp),%ebx
111145: c9 leave
111146: c3 ret
111147: 90 nop
the_thread = _POSIX_Threads_Get( thread, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
111148: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
11114e: 8b 4a 40 mov 0x40(%edx),%ecx
111151: 85 c9 test %ecx,%ecx
111153: 74 43 je 111198 <pthread_join+0x80>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
111155: 8b 0d 58 2d 13 00 mov 0x132d58,%ecx
_Thread_Enable_dispatch();
return EINVAL;
}
if ( _Thread_Is_executing( the_thread ) ) {
11115b: 39 c8 cmp %ecx,%eax
11115d: 74 49 je 1111a8 <pthread_join+0x90>
/*
* Put ourself on the threads join list
*/
_Thread_Executing->Wait.return_argument = &return_pointer;
11115f: 8d 45 f0 lea -0x10(%ebp),%eax
111162: 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;
111165: 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 );
11116c: 50 push %eax
11116d: 68 84 48 11 00 push $0x114884
111172: 6a 00 push $0x0
111174: 83 c2 44 add $0x44,%edx
111177: 52 push %edx
111178: e8 db 33 00 00 call 114558 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
11117d: e8 32 2f 00 00 call 1140b4 <_Thread_Enable_dispatch>
if ( value_ptr )
111182: 83 c4 10 add $0x10,%esp
111185: 85 db test %ebx,%ebx
111187: 74 2b je 1111b4 <pthread_join+0x9c>
*value_ptr = return_pointer;
111189: 8b 45 f0 mov -0x10(%ebp),%eax
11118c: 89 03 mov %eax,(%ebx)
return 0;
11118e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
111190: 8b 5d fc mov -0x4(%ebp),%ebx
111193: c9 leave
111194: c3 ret
111195: 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();
111198: e8 17 2f 00 00 call 1140b4 <_Thread_Enable_dispatch>
return EINVAL;
11119d: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
1111a2: 8b 5d fc mov -0x4(%ebp),%ebx
1111a5: c9 leave
1111a6: c3 ret
1111a7: 90 nop
_Thread_Enable_dispatch();
return EINVAL;
}
if ( _Thread_Is_executing( the_thread ) ) {
_Thread_Enable_dispatch();
1111a8: e8 07 2f 00 00 call 1140b4 <_Thread_Enable_dispatch>
return EDEADLK;
1111ad: b8 2d 00 00 00 mov $0x2d,%eax
1111b2: eb 8e jmp 111142 <pthread_join+0x2a>
_Thread_Enable_dispatch();
if ( value_ptr )
*value_ptr = return_pointer;
return 0;
1111b4: 31 c0 xor %eax,%eax
1111b6: eb 8a jmp 111142 <pthread_join+0x2a>
0010b544 <pthread_key_create>:
int pthread_key_create(
pthread_key_t *key,
void (*destructor)( void * )
)
{
10b544: 55 push %ebp
10b545: 89 e5 mov %esp,%ebp
10b547: 57 push %edi
10b548: 56 push %esi
10b549: 53 push %ebx
10b54a: 83 ec 28 sub $0x28,%esp
10b54d: a1 b0 9c 12 00 mov 0x129cb0,%eax
10b552: 40 inc %eax
10b553: a3 b0 9c 12 00 mov %eax,0x129cb0
* 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 );
10b558: 68 20 a1 12 00 push $0x12a120
10b55d: e8 56 22 00 00 call 10d7b8 <_Objects_Allocate>
10b562: 89 c6 mov %eax,%esi
_Thread_Disable_dispatch();
the_key = _POSIX_Keys_Allocate();
if ( !the_key ) {
10b564: 83 c4 10 add $0x10,%esp
10b567: 85 c0 test %eax,%eax
10b569: 74 79 je 10b5e4 <pthread_key_create+0xa0>
_Thread_Enable_dispatch();
return EAGAIN;
}
the_key->destructor = destructor;
10b56b: 8b 45 0c mov 0xc(%ebp),%eax
10b56e: 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++ ) {
10b571: bb 01 00 00 00 mov $0x1,%ebx
the_key->Values[ the_api ] = NULL;
10b576: c7 44 9e 14 00 00 00 movl $0x0,0x14(%esi,%ebx,4)
10b57d: 00
INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
);
#endif
bytes_to_allocate = sizeof( void * ) *
(_Objects_Information_table[ the_api ][ 1 ]->maximum + 1);
10b57e: 8b 04 9d 88 9c 12 00 mov 0x129c88(,%ebx,4),%eax
10b585: 8b 40 04 mov 0x4(%eax),%eax
10b588: 0f b7 40 10 movzwl 0x10(%eax),%eax
true,
INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
);
#endif
bytes_to_allocate = sizeof( void * ) *
10b58c: 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 );
10b593: 83 ec 0c sub $0xc,%esp
10b596: 51 push %ecx
10b597: 89 4d e4 mov %ecx,-0x1c(%ebp)
10b59a: e8 25 43 00 00 call 10f8c4 <_Workspace_Allocate>
if ( !table ) {
10b59f: 83 c4 10 add $0x10,%esp
10b5a2: 85 c0 test %eax,%eax
10b5a4: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b5a7: 74 4f je 10b5f8 <pthread_key_create+0xb4>
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
return ENOMEM;
}
the_key->Values[ the_api ] = table;
10b5a9: 89 44 9e 14 mov %eax,0x14(%esi,%ebx,4)
memset( table, '\0', bytes_to_allocate );
10b5ad: 89 c7 mov %eax,%edi
10b5af: 31 c0 xor %eax,%eax
10b5b1: 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++ ) {
10b5b3: 43 inc %ebx
10b5b4: 83 fb 04 cmp $0x4,%ebx
10b5b7: 75 bd jne 10b576 <pthread_key_create+0x32>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10b5b9: 8b 46 08 mov 0x8(%esi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b5bc: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b5bf: 8b 15 3c a1 12 00 mov 0x12a13c,%edx
10b5c5: 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;
10b5c8: 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;
10b5cf: 8b 55 08 mov 0x8(%ebp),%edx
10b5d2: 89 02 mov %eax,(%edx)
_Thread_Enable_dispatch();
10b5d4: e8 0b 32 00 00 call 10e7e4 <_Thread_Enable_dispatch>
return 0;
10b5d9: 31 c0 xor %eax,%eax
}
10b5db: 8d 65 f4 lea -0xc(%ebp),%esp
10b5de: 5b pop %ebx
10b5df: 5e pop %esi
10b5e0: 5f pop %edi
10b5e1: c9 leave
10b5e2: c3 ret
10b5e3: 90 nop
_Thread_Disable_dispatch();
the_key = _POSIX_Keys_Allocate();
if ( !the_key ) {
_Thread_Enable_dispatch();
10b5e4: e8 fb 31 00 00 call 10e7e4 <_Thread_Enable_dispatch>
return EAGAIN;
10b5e9: 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;
}
10b5ee: 8d 65 f4 lea -0xc(%ebp),%esp
10b5f1: 5b pop %ebx
10b5f2: 5e pop %esi
10b5f3: 5f pop %edi
10b5f4: c9 leave
10b5f5: c3 ret
10b5f6: 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 );
10b5f8: 83 ec 0c sub $0xc,%esp
10b5fb: 56 push %esi
10b5fc: e8 87 00 00 00 call 10b688 <_POSIX_Keys_Free_memory>
*/
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
POSIX_Keys_Control *the_key
)
{
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
10b601: 58 pop %eax
10b602: 5a pop %edx
10b603: 56 push %esi
10b604: 68 20 a1 12 00 push $0x12a120
10b609: e8 1e 25 00 00 call 10db2c <_Objects_Free>
_POSIX_Keys_Free( the_key );
_Thread_Enable_dispatch();
10b60e: e8 d1 31 00 00 call 10e7e4 <_Thread_Enable_dispatch>
return ENOMEM;
10b613: 83 c4 10 add $0x10,%esp
10b616: 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;
}
10b61b: 8d 65 f4 lea -0xc(%ebp),%esp
10b61e: 5b pop %ebx
10b61f: 5e pop %esi
10b620: 5f pop %edi
10b621: c9 leave
10b622: c3 ret
0010b624 <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
)
{
10b624: 55 push %ebp
10b625: 89 e5 mov %esp,%ebp
10b627: 53 push %ebx
10b628: 83 ec 18 sub $0x18,%esp
POSIX_Keys_Control *the_key;
Objects_Locations location;
the_key = _POSIX_Keys_Get( key, &location );
10b62b: 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 );
10b62e: 50 push %eax
10b62f: ff 75 08 pushl 0x8(%ebp)
10b632: 68 20 a1 12 00 push $0x12a120
10b637: e8 30 26 00 00 call 10dc6c <_Objects_Get>
10b63c: 89 c3 mov %eax,%ebx
switch ( location ) {
10b63e: 83 c4 10 add $0x10,%esp
10b641: 8b 4d f4 mov -0xc(%ebp),%ecx
10b644: 85 c9 test %ecx,%ecx
10b646: 75 34 jne 10b67c <pthread_key_delete+0x58>
case OBJECTS_LOCAL:
_Objects_Close( &_POSIX_Keys_Information, &the_key->Object );
10b648: 83 ec 08 sub $0x8,%esp
10b64b: 50 push %eax
10b64c: 68 20 a1 12 00 push $0x12a120
10b651: e8 de 21 00 00 call 10d834 <_Objects_Close>
_POSIX_Keys_Free_memory( the_key );
10b656: 89 1c 24 mov %ebx,(%esp)
10b659: e8 2a 00 00 00 call 10b688 <_POSIX_Keys_Free_memory>
*/
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
POSIX_Keys_Control *the_key
)
{
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
10b65e: 58 pop %eax
10b65f: 5a pop %edx
10b660: 53 push %ebx
10b661: 68 20 a1 12 00 push $0x12a120
10b666: e8 c1 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();
10b66b: e8 74 31 00 00 call 10e7e4 <_Thread_Enable_dispatch>
return 0;
10b670: 83 c4 10 add $0x10,%esp
10b673: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10b675: 8b 5d fc mov -0x4(%ebp),%ebx
10b678: c9 leave
10b679: c3 ret
10b67a: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10b67c: b8 16 00 00 00 mov $0x16,%eax
}
10b681: 8b 5d fc mov -0x4(%ebp),%ebx
10b684: c9 leave
10b685: c3 ret
00124d8c <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
124d8c: 55 push %ebp
124d8d: 89 e5 mov %esp,%ebp
124d8f: 57 push %edi
124d90: 56 push %esi
124d91: 53 push %ebx
124d92: 83 ec 1c sub $0x1c,%esp
124d95: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
124d98: 85 db test %ebx,%ebx
124d9a: 0f 84 84 00 00 00 je 124e24 <pthread_kill+0x98>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
124da0: 8d 7b ff lea -0x1(%ebx),%edi
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
124da3: 83 ff 1f cmp $0x1f,%edi
124da6: 77 7c ja 124e24 <pthread_kill+0x98>
pthread_t id,
Objects_Locations *location
)
{
return (Thread_Control *)
_Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
124da8: 56 push %esi
rtems_set_errno_and_return_minus_one( EINVAL );
the_thread = _POSIX_Threads_Get( thread, &location );
124da9: 8d 45 e4 lea -0x1c(%ebp),%eax
124dac: 50 push %eax
124dad: ff 75 08 pushl 0x8(%ebp)
124db0: 68 a0 ed 12 00 push $0x12eda0
124db5: e8 26 d1 fe ff call 111ee0 <_Objects_Get>
124dba: 89 c6 mov %eax,%esi
switch ( location ) {
124dbc: 83 c4 10 add $0x10,%esp
124dbf: 8b 4d e4 mov -0x1c(%ebp),%ecx
124dc2: 85 c9 test %ecx,%ecx
124dc4: 75 72 jne 124e38 <pthread_kill+0xac>
case OBJECTS_LOCAL:
/*
* If sig == 0 then just validate arguments
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
124dc6: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
124dcc: 8d 04 5b lea (%ebx,%ebx,2),%eax
124dcf: 83 3c 85 28 f1 12 00 cmpl $0x1,0x12f128(,%eax,4)
124dd6: 01
124dd7: 74 2d je 124e06 <pthread_kill+0x7a>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
124dd9: b8 01 00 00 00 mov $0x1,%eax
124dde: 89 f9 mov %edi,%ecx
124de0: d3 e0 shl %cl,%eax
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
124de2: 09 82 d4 00 00 00 or %eax,0xd4(%edx)
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
124de8: 52 push %edx
124de9: 6a 00 push $0x0
124deb: 53 push %ebx
124dec: 56 push %esi
124ded: e8 7a fe ff ff call 124c6c <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
124df2: 83 c4 10 add $0x10,%esp
124df5: a1 b4 f0 12 00 mov 0x12f0b4,%eax
124dfa: 85 c0 test %eax,%eax
124dfc: 74 08 je 124e06 <pthread_kill+0x7a>
124dfe: 3b 35 b8 f0 12 00 cmp 0x12f0b8,%esi
124e04: 74 12 je 124e18 <pthread_kill+0x8c>
_Thread_Dispatch_necessary = true;
}
_Thread_Enable_dispatch();
124e06: e8 cd dc fe ff call 112ad8 <_Thread_Enable_dispatch>
return 0;
124e0b: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
}
124e0d: 8d 65 f4 lea -0xc(%ebp),%esp
124e10: 5b pop %ebx
124e11: 5e pop %esi
124e12: 5f pop %edi
124e13: c9 leave
124e14: c3 ret
124e15: 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;
124e18: c6 05 c4 f0 12 00 01 movb $0x1,0x12f0c4
124e1f: eb e5 jmp 124e06 <pthread_kill+0x7a>
124e21: 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 );
124e24: e8 0f 36 ff ff call 118438 <__errno>
124e29: c7 00 16 00 00 00 movl $0x16,(%eax)
124e2f: b8 ff ff ff ff mov $0xffffffff,%eax
124e34: eb d7 jmp 124e0d <pthread_kill+0x81>
124e36: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
124e38: e8 fb 35 ff ff call 118438 <__errno>
124e3d: c7 00 03 00 00 00 movl $0x3,(%eax)
124e43: b8 ff ff ff ff mov $0xffffffff,%eax
124e48: eb c3 jmp 124e0d <pthread_kill+0x81>
0010d19c <pthread_mutex_getprioceiling>:
int pthread_mutex_getprioceiling(
pthread_mutex_t *mutex,
int *prioceiling
)
{
10d19c: 55 push %ebp
10d19d: 89 e5 mov %esp,%ebp
10d19f: 53 push %ebx
10d1a0: 83 ec 14 sub $0x14,%esp
10d1a3: 8b 5d 0c mov 0xc(%ebp),%ebx
register POSIX_Mutex_Control *the_mutex;
Objects_Locations location;
if ( !prioceiling )
10d1a6: 85 db test %ebx,%ebx
10d1a8: 74 19 je 10d1c3 <pthread_mutex_getprioceiling+0x27>
return EINVAL;
the_mutex = _POSIX_Mutex_Get( mutex, &location );
10d1aa: 83 ec 08 sub $0x8,%esp
10d1ad: 8d 45 f4 lea -0xc(%ebp),%eax
10d1b0: 50 push %eax
10d1b1: ff 75 08 pushl 0x8(%ebp)
10d1b4: e8 3b ff ff ff call 10d0f4 <_POSIX_Mutex_Get>
switch ( location ) {
10d1b9: 83 c4 10 add $0x10,%esp
10d1bc: 8b 55 f4 mov -0xc(%ebp),%edx
10d1bf: 85 d2 test %edx,%edx
10d1c1: 74 0d je 10d1d0 <pthread_mutex_getprioceiling+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10d1c3: b8 16 00 00 00 mov $0x16,%eax
}
10d1c8: 8b 5d fc mov -0x4(%ebp),%ebx
10d1cb: c9 leave
10d1cc: c3 ret
10d1cd: 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);
10d1d0: 0f b6 15 9c 89 12 00 movzbl 0x12899c,%edx
10d1d7: 2b 50 60 sub 0x60(%eax),%edx
10d1da: 89 13 mov %edx,(%ebx)
case OBJECTS_LOCAL:
*prioceiling = _POSIX_Priority_From_core(
the_mutex->Mutex.Attributes.priority_ceiling
);
_Thread_Enable_dispatch();
10d1dc: e8 8f 36 00 00 call 110870 <_Thread_Enable_dispatch>
return 0;
10d1e1: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10d1e3: 8b 5d fc mov -0x4(%ebp),%ebx
10d1e6: c9 leave
10d1e7: c3 ret
0010d1e8 <pthread_mutex_init>:
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
)
{
10d1e8: 55 push %ebp
10d1e9: 89 e5 mov %esp,%ebp
10d1eb: 57 push %edi
10d1ec: 56 push %esi
10d1ed: 53 push %ebx
10d1ee: 83 ec 1c sub $0x1c,%esp
10d1f1: 8b 75 08 mov 0x8(%ebp),%esi
10d1f4: 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;
10d1f7: 85 db test %ebx,%ebx
10d1f9: 0f 84 09 01 00 00 je 10d308 <pthread_mutex_init+0x120>
else the_attr = &_POSIX_Mutex_Default_attributes;
/* Check for NULL mutex */
if ( !mutex )
10d1ff: 85 f6 test %esi,%esi
10d201: 0f 84 e5 00 00 00 je 10d2ec <pthread_mutex_init+0x104>
}
}
}
#endif
if ( !the_attr->is_initialized )
10d207: 8b 13 mov (%ebx),%edx
10d209: 85 d2 test %edx,%edx
10d20b: 0f 84 db 00 00 00 je 10d2ec <pthread_mutex_init+0x104>
return EINVAL;
/*
* We only support process private mutexes.
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
10d211: 8b 43 04 mov 0x4(%ebx),%eax
10d214: 83 f8 01 cmp $0x1,%eax
10d217: 0f 84 f7 00 00 00 je 10d314 <pthread_mutex_init+0x12c>
return ENOSYS;
if ( the_attr->process_shared != PTHREAD_PROCESS_PRIVATE )
10d21d: 85 c0 test %eax,%eax
10d21f: 0f 85 c7 00 00 00 jne 10d2ec <pthread_mutex_init+0x104>
return EINVAL;
/*
* Determine the discipline of the mutex
*/
switch ( the_attr->protocol ) {
10d225: 8b 43 0c mov 0xc(%ebx),%eax
10d228: 83 f8 01 cmp $0x1,%eax
10d22b: 0f 84 eb 00 00 00 je 10d31c <pthread_mutex_init+0x134>
10d231: 83 f8 02 cmp $0x2,%eax
10d234: 0f 84 c2 00 00 00 je 10d2fc <pthread_mutex_init+0x114>
10d23a: 85 c0 test %eax,%eax
10d23c: 0f 85 aa 00 00 00 jne 10d2ec <pthread_mutex_init+0x104>
case PTHREAD_PRIO_NONE:
the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
10d242: 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 ) )
10d249: 83 ec 0c sub $0xc,%esp
10d24c: ff 73 08 pushl 0x8(%ebx)
10d24f: e8 58 03 00 00 call 10d5ac <_POSIX_Priority_Is_valid>
10d254: 83 c4 10 add $0x10,%esp
10d257: 84 c0 test %al,%al
10d259: 0f 84 8d 00 00 00 je 10d2ec <pthread_mutex_init+0x104>
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
/*
* Validate the mutex type and set appropriate SuperCore mutex
* attributes.
*/
switch ( the_attr->type ) {
10d25f: 83 7b 10 03 cmpl $0x3,0x10(%ebx)
10d263: 0f 87 83 00 00 00 ja 10d2ec <pthread_mutex_init+0x104>
10d269: a1 f0 cc 12 00 mov 0x12ccf0,%eax
10d26e: 40 inc %eax
10d26f: a3 f0 cc 12 00 mov %eax,0x12ccf0
* _POSIX_Mutex_Allocate
*/
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
{
return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
10d274: 83 ec 0c sub $0xc,%esp
10d277: 68 c0 d0 12 00 push $0x12d0c0
10d27c: e8 c3 25 00 00 call 10f844 <_Objects_Allocate>
10d281: 89 c7 mov %eax,%edi
*/
_Thread_Disable_dispatch();
the_mutex = _POSIX_Mutex_Allocate();
if ( !the_mutex ) {
10d283: 83 c4 10 add $0x10,%esp
10d286: 85 c0 test %eax,%eax
10d288: 0f 84 9a 00 00 00 je 10d328 <pthread_mutex_init+0x140>
_Thread_Enable_dispatch();
return EAGAIN;
}
the_mutex->process_shared = the_attr->process_shared;
10d28e: 8b 43 04 mov 0x4(%ebx),%eax
10d291: 89 47 10 mov %eax,0x10(%edi)
the_mutex_attr = &the_mutex->Mutex.Attributes;
10d294: 8d 57 54 lea 0x54(%edi),%edx
if ( the_attr->recursive )
the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
10d297: 31 c0 xor %eax,%eax
10d299: 83 7b 14 00 cmpl $0x0,0x14(%ebx)
10d29d: 0f 94 c0 sete %al
10d2a0: 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;
10d2a3: 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);
10d2a7: 0f b6 05 9c 89 12 00 movzbl 0x12899c,%eax
10d2ae: 2b 43 08 sub 0x8(%ebx),%eax
10d2b1: 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;
10d2b4: 8b 45 e4 mov -0x1c(%ebp),%eax
10d2b7: 89 47 5c mov %eax,0x5c(%edi)
/*
* Must be initialized to unlocked.
*/
_CORE_mutex_Initialize(
10d2ba: 50 push %eax
10d2bb: 6a 01 push $0x1
10d2bd: 52 push %edx
10d2be: 8d 47 14 lea 0x14(%edi),%eax
10d2c1: 50 push %eax
10d2c2: e8 09 1d 00 00 call 10efd0 <_CORE_mutex_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10d2c7: 8b 47 08 mov 0x8(%edi),%eax
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10d2ca: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10d2cd: 8b 15 dc d0 12 00 mov 0x12d0dc,%edx
10d2d3: 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;
10d2d6: 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;
10d2dd: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10d2df: e8 8c 35 00 00 call 110870 <_Thread_Enable_dispatch>
return 0;
10d2e4: 83 c4 10 add $0x10,%esp
10d2e7: 31 c0 xor %eax,%eax
10d2e9: eb 06 jmp 10d2f1 <pthread_mutex_init+0x109>
10d2eb: 90 nop
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
break;
default:
return EINVAL;
10d2ec: b8 16 00 00 00 mov $0x16,%eax
*mutex = the_mutex->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10d2f1: 8d 65 f4 lea -0xc(%ebp),%esp
10d2f4: 5b pop %ebx
10d2f5: 5e pop %esi
10d2f6: 5f pop %edi
10d2f7: c9 leave
10d2f8: c3 ret
10d2f9: 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;
10d2fc: c7 45 e4 03 00 00 00 movl $0x3,-0x1c(%ebp)
break;
10d303: e9 41 ff ff ff jmp 10d249 <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;
10d308: bb 40 d1 12 00 mov $0x12d140,%ebx
10d30d: e9 ed fe ff ff jmp 10d1ff <pthread_mutex_init+0x17>
10d312: 66 90 xchg %ax,%ax
/*
* We only support process private mutexes.
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
return ENOSYS;
10d314: b8 58 00 00 00 mov $0x58,%eax
10d319: eb d6 jmp 10d2f1 <pthread_mutex_init+0x109>
10d31b: 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;
10d31c: c7 45 e4 02 00 00 00 movl $0x2,-0x1c(%ebp)
10d323: e9 21 ff ff ff jmp 10d249 <pthread_mutex_init+0x61>
_Thread_Disable_dispatch();
the_mutex = _POSIX_Mutex_Allocate();
if ( !the_mutex ) {
_Thread_Enable_dispatch();
10d328: e8 43 35 00 00 call 110870 <_Thread_Enable_dispatch>
return EAGAIN;
10d32d: b8 0b 00 00 00 mov $0xb,%eax
10d332: eb bd jmp 10d2f1 <pthread_mutex_init+0x109>
0010d440 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
10d440: 55 push %ebp
10d441: 89 e5 mov %esp,%ebp
10d443: 56 push %esi
10d444: 53 push %ebx
10d445: 83 ec 18 sub $0x18,%esp
10d448: 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 );
10d44b: 8d 45 f4 lea -0xc(%ebp),%eax
10d44e: 50 push %eax
10d44f: ff 75 0c pushl 0xc(%ebp)
10d452: e8 cd 00 00 00 call 10d524 <_POSIX_Absolute_timeout_to_ticks>
10d457: 89 c3 mov %eax,%ebx
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10d459: 83 c4 10 add $0x10,%esp
10d45c: 83 f8 03 cmp $0x3,%eax
10d45f: 74 2f je 10d490 <pthread_mutex_timedlock+0x50>
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
10d461: 50 push %eax
10d462: ff 75 f4 pushl -0xc(%ebp)
10d465: 6a 00 push $0x0
10d467: 56 push %esi
10d468: e8 db fe ff ff call 10d348 <_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) ) {
10d46d: 83 c4 10 add $0x10,%esp
10d470: 83 f8 10 cmp $0x10,%eax
10d473: 74 07 je 10d47c <pthread_mutex_timedlock+0x3c><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
10d475: 8d 65 f8 lea -0x8(%ebp),%esp
10d478: 5b pop %ebx
10d479: 5e pop %esi
10d47a: c9 leave
10d47b: 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 )
10d47c: 85 db test %ebx,%ebx
10d47e: 74 28 je 10d4a8 <pthread_mutex_timedlock+0x68><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10d480: 4b dec %ebx
10d481: 83 fb 01 cmp $0x1,%ebx
10d484: 77 ef ja 10d475 <pthread_mutex_timedlock+0x35><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10d486: b8 74 00 00 00 mov $0x74,%eax
10d48b: eb e8 jmp 10d475 <pthread_mutex_timedlock+0x35>
10d48d: 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 );
10d490: 52 push %edx
10d491: ff 75 f4 pushl -0xc(%ebp)
10d494: 6a 01 push $0x1
10d496: 56 push %esi
10d497: e8 ac fe ff ff call 10d348 <_POSIX_Mutex_Lock_support>
10d49c: 83 c4 10 add $0x10,%esp
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
10d49f: 8d 65 f8 lea -0x8(%ebp),%esp
10d4a2: 5b pop %ebx
10d4a3: 5e pop %esi
10d4a4: c9 leave
10d4a5: c3 ret
10d4a6: 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;
10d4a8: b8 16 00 00 00 mov $0x16,%eax <== NOT EXECUTED
10d4ad: eb c6 jmp 10d475 <pthread_mutex_timedlock+0x35><== NOT EXECUTED
0010cf24 <pthread_mutexattr_destroy>:
*/
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr
)
{
10cf24: 55 push %ebp
10cf25: 89 e5 mov %esp,%ebp
10cf27: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || !attr->is_initialized )
10cf2a: 85 c0 test %eax,%eax
10cf2c: 74 12 je 10cf40 <pthread_mutexattr_destroy+0x1c>
10cf2e: 8b 10 mov (%eax),%edx
10cf30: 85 d2 test %edx,%edx
10cf32: 74 0c je 10cf40 <pthread_mutexattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10cf34: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10cf3a: 31 c0 xor %eax,%eax
}
10cf3c: c9 leave
10cf3d: c3 ret
10cf3e: 66 90 xchg %ax,%ax
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
10cf40: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10cf45: c9 leave
10cf46: c3 ret
0010cfec <pthread_mutexattr_setprioceiling>:
int pthread_mutexattr_setprioceiling(
pthread_mutexattr_t *attr,
int prioceiling
)
{
10cfec: 55 push %ebp
10cfed: 89 e5 mov %esp,%ebp
10cfef: 56 push %esi
10cff0: 53 push %ebx
10cff1: 8b 5d 08 mov 0x8(%ebp),%ebx
10cff4: 8b 75 0c mov 0xc(%ebp),%esi
if ( !attr || !attr->is_initialized )
10cff7: 85 db test %ebx,%ebx
10cff9: 74 06 je 10d001 <pthread_mutexattr_setprioceiling+0x15><== NEVER TAKEN
10cffb: 8b 03 mov (%ebx),%eax
10cffd: 85 c0 test %eax,%eax
10cfff: 75 0f jne 10d010 <pthread_mutexattr_setprioceiling+0x24>
return EINVAL;
if ( !_POSIX_Priority_Is_valid( prioceiling ) )
return EINVAL;
10d001: b8 16 00 00 00 mov $0x16,%eax
attr->prio_ceiling = prioceiling;
return 0;
}
10d006: 8d 65 f8 lea -0x8(%ebp),%esp
10d009: 5b pop %ebx
10d00a: 5e pop %esi
10d00b: c9 leave
10d00c: c3 ret
10d00d: 8d 76 00 lea 0x0(%esi),%esi
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( prioceiling ) )
10d010: 83 ec 0c sub $0xc,%esp
10d013: 56 push %esi
10d014: e8 93 05 00 00 call 10d5ac <_POSIX_Priority_Is_valid>
10d019: 83 c4 10 add $0x10,%esp
10d01c: 84 c0 test %al,%al
10d01e: 74 e1 je 10d001 <pthread_mutexattr_setprioceiling+0x15>
return EINVAL;
attr->prio_ceiling = prioceiling;
10d020: 89 73 08 mov %esi,0x8(%ebx)
return 0;
10d023: 31 c0 xor %eax,%eax
}
10d025: 8d 65 f8 lea -0x8(%ebp),%esp
10d028: 5b pop %ebx
10d029: 5e pop %esi
10d02a: c9 leave
10d02b: c3 ret
0010d054 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
10d054: 55 push %ebp
10d055: 89 e5 mov %esp,%ebp
10d057: 8b 45 08 mov 0x8(%ebp),%eax
10d05a: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
10d05d: 85 c0 test %eax,%eax
10d05f: 74 0b je 10d06c <pthread_mutexattr_setpshared+0x18>
10d061: 8b 08 mov (%eax),%ecx
10d063: 85 c9 test %ecx,%ecx
10d065: 74 05 je 10d06c <pthread_mutexattr_setpshared+0x18>
return EINVAL;
switch ( pshared ) {
10d067: 83 fa 01 cmp $0x1,%edx
10d06a: 76 08 jbe 10d074 <pthread_mutexattr_setpshared+0x20><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10d06c: b8 16 00 00 00 mov $0x16,%eax
}
}
10d071: c9 leave
10d072: c3 ret
10d073: 90 nop
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10d074: 89 50 04 mov %edx,0x4(%eax)
return 0;
10d077: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10d079: c9 leave
10d07a: c3 ret
0010b248 <pthread_mutexattr_settype>:
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
10b248: 55 push %ebp
10b249: 89 e5 mov %esp,%ebp
10b24b: 8b 45 08 mov 0x8(%ebp),%eax
10b24e: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr || !attr->is_initialized )
10b251: 85 c0 test %eax,%eax
10b253: 74 0b je 10b260 <pthread_mutexattr_settype+0x18>
10b255: 8b 08 mov (%eax),%ecx
10b257: 85 c9 test %ecx,%ecx
10b259: 74 05 je 10b260 <pthread_mutexattr_settype+0x18><== NEVER TAKEN
return EINVAL;
switch ( type ) {
10b25b: 83 fa 03 cmp $0x3,%edx
10b25e: 76 08 jbe 10b268 <pthread_mutexattr_settype+0x20>
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
return 0;
default:
return EINVAL;
10b260: b8 16 00 00 00 mov $0x16,%eax
}
}
10b265: c9 leave
10b266: c3 ret
10b267: 90 nop
switch ( type ) {
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
10b268: 89 50 10 mov %edx,0x10(%eax)
return 0;
10b26b: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10b26d: c9 leave
10b26e: c3 ret
0010bd9c <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
10bd9c: 55 push %ebp
10bd9d: 89 e5 mov %esp,%ebp
10bd9f: 57 push %edi
10bda0: 56 push %esi
10bda1: 53 push %ebx
10bda2: 83 ec 1c sub $0x1c,%esp
10bda5: 8b 5d 08 mov 0x8(%ebp),%ebx
10bda8: 8b 75 0c mov 0xc(%ebp),%esi
if ( !once_control || !init_routine )
10bdab: 85 db test %ebx,%ebx
10bdad: 74 51 je 10be00 <pthread_once+0x64>
10bdaf: 85 f6 test %esi,%esi
10bdb1: 74 4d je 10be00 <pthread_once+0x64>
return EINVAL;
if ( !once_control->init_executed ) {
10bdb3: 8b 7b 04 mov 0x4(%ebx),%edi
10bdb6: 85 ff test %edi,%edi
10bdb8: 74 0a je 10bdc4 <pthread_once+0x28>
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
10bdba: 31 c0 xor %eax,%eax
}
10bdbc: 8d 65 f4 lea -0xc(%ebp),%esp
10bdbf: 5b pop %ebx
10bdc0: 5e pop %esi
10bdc1: 5f pop %edi
10bdc2: c9 leave
10bdc3: 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);
10bdc4: 51 push %ecx
10bdc5: 8d 7d e4 lea -0x1c(%ebp),%edi
10bdc8: 57 push %edi
10bdc9: 68 00 01 00 00 push $0x100
10bdce: 68 00 01 00 00 push $0x100
10bdd3: e8 ec 0b 00 00 call 10c9c4 <rtems_task_mode>
if ( !once_control->init_executed ) {
10bdd8: 83 c4 10 add $0x10,%esp
10bddb: 8b 53 04 mov 0x4(%ebx),%edx
10bdde: 85 d2 test %edx,%edx
10bde0: 74 2e je 10be10 <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);
10bde2: 50 push %eax
10bde3: 57 push %edi
10bde4: 68 00 01 00 00 push $0x100
10bde9: ff 75 e4 pushl -0x1c(%ebp)
10bdec: e8 d3 0b 00 00 call 10c9c4 <rtems_task_mode>
10bdf1: 83 c4 10 add $0x10,%esp
}
return 0;
10bdf4: 31 c0 xor %eax,%eax
}
10bdf6: 8d 65 f4 lea -0xc(%ebp),%esp
10bdf9: 5b pop %ebx
10bdfa: 5e pop %esi
10bdfb: 5f pop %edi
10bdfc: c9 leave
10bdfd: c3 ret
10bdfe: 66 90 xchg %ax,%ax
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
return EINVAL;
10be00: b8 16 00 00 00 mov $0x16,%eax
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
10be05: 8d 65 f4 lea -0xc(%ebp),%esp
10be08: 5b pop %ebx
10be09: 5e pop %esi
10be0a: 5f pop %edi
10be0b: c9 leave
10be0c: c3 ret
10be0d: 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;
10be10: c7 03 01 00 00 00 movl $0x1,(%ebx)
once_control->init_executed = true;
10be16: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx)
(*init_routine)();
10be1d: ff d6 call *%esi
10be1f: eb c1 jmp 10bde2 <pthread_once+0x46>
0010c480 <pthread_rwlock_destroy>:
*/
int pthread_rwlock_destroy(
pthread_rwlock_t *rwlock
)
{
10c480: 55 push %ebp
10c481: 89 e5 mov %esp,%ebp
10c483: 53 push %ebx
10c484: 83 ec 14 sub $0x14,%esp
10c487: 8b 45 08 mov 0x8(%ebp),%eax
POSIX_RWLock_Control *the_rwlock = NULL;
Objects_Locations location;
if ( !rwlock )
10c48a: 85 c0 test %eax,%eax
10c48c: 74 42 je 10c4d0 <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(
10c48e: 53 push %ebx
return EINVAL;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c48f: 8d 55 f4 lea -0xc(%ebp),%edx
10c492: 52 push %edx
10c493: ff 30 pushl (%eax)
10c495: 68 80 b9 12 00 push $0x12b980
10c49a: e8 d9 2b 00 00 call 10f078 <_Objects_Get>
10c49f: 89 c3 mov %eax,%ebx
switch ( location ) {
10c4a1: 83 c4 10 add $0x10,%esp
10c4a4: 8b 4d f4 mov -0xc(%ebp),%ecx
10c4a7: 85 c9 test %ecx,%ecx
10c4a9: 75 25 jne 10c4d0 <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 ) {
10c4ab: 83 ec 0c sub $0xc,%esp
10c4ae: 8d 40 10 lea 0x10(%eax),%eax
10c4b1: 50 push %eax
10c4b2: e8 05 3f 00 00 call 1103bc <_Thread_queue_First>
10c4b7: 83 c4 10 add $0x10,%esp
10c4ba: 85 c0 test %eax,%eax
10c4bc: 74 1e je 10c4dc <pthread_rwlock_destroy+0x5c>
_Thread_Enable_dispatch();
10c4be: e8 2d 37 00 00 call 10fbf0 <_Thread_Enable_dispatch>
return EBUSY;
10c4c3: b8 10 00 00 00 mov $0x10,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c4c8: 8b 5d fc mov -0x4(%ebp),%ebx
10c4cb: c9 leave
10c4cc: c3 ret
10c4cd: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return EINVAL;
10c4d0: b8 16 00 00 00 mov $0x16,%eax
}
10c4d5: 8b 5d fc mov -0x4(%ebp),%ebx
10c4d8: c9 leave
10c4d9: c3 ret
10c4da: 66 90 xchg %ax,%ax
/*
* POSIX doesn't require behavior when it is locked.
*/
_Objects_Close( &_POSIX_RWLock_Information, &the_rwlock->Object );
10c4dc: 83 ec 08 sub $0x8,%esp
10c4df: 53 push %ebx
10c4e0: 68 80 b9 12 00 push $0x12b980
10c4e5: e8 56 27 00 00 call 10ec40 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _POSIX_RWLock_Free (
POSIX_RWLock_Control *the_RWLock
)
{
_Objects_Free( &_POSIX_RWLock_Information, &the_RWLock->Object );
10c4ea: 58 pop %eax
10c4eb: 5a pop %edx
10c4ec: 53 push %ebx
10c4ed: 68 80 b9 12 00 push $0x12b980
10c4f2: e8 41 2a 00 00 call 10ef38 <_Objects_Free>
_POSIX_RWLock_Free( the_rwlock );
_Thread_Enable_dispatch();
10c4f7: e8 f4 36 00 00 call 10fbf0 <_Thread_Enable_dispatch>
return 0;
10c4fc: 83 c4 10 add $0x10,%esp
10c4ff: 31 c0 xor %eax,%eax
10c501: eb d2 jmp 10c4d5 <pthread_rwlock_destroy+0x55>
0010c504 <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
10c504: 55 push %ebp
10c505: 89 e5 mov %esp,%ebp
10c507: 56 push %esi
10c508: 53 push %ebx
10c509: 83 ec 20 sub $0x20,%esp
10c50c: 8b 5d 08 mov 0x8(%ebp),%ebx
10c50f: 8b 75 0c mov 0xc(%ebp),%esi
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
10c512: 85 db test %ebx,%ebx
10c514: 74 15 je 10c52b <pthread_rwlock_init+0x27>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
10c516: 85 f6 test %esi,%esi
10c518: 0f 84 8e 00 00 00 je 10c5ac <pthread_rwlock_init+0xa8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
10c51e: 8b 16 mov (%esi),%edx
10c520: 85 d2 test %edx,%edx
10c522: 74 07 je 10c52b <pthread_rwlock_init+0x27><== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
10c524: 8b 46 04 mov 0x4(%esi),%eax
10c527: 85 c0 test %eax,%eax
10c529: 74 0d je 10c538 <pthread_rwlock_init+0x34><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE: /* only supported values */
break;
case PTHREAD_PROCESS_SHARED:
default:
return EINVAL;
10c52b: b8 16 00 00 00 mov $0x16,%eax
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
10c530: 8d 65 f8 lea -0x8(%ebp),%esp
10c533: 5b pop %ebx
10c534: 5e pop %esi
10c535: c9 leave
10c536: c3 ret
10c537: 90 nop
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
10c538: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c53f: a1 30 b7 12 00 mov 0x12b730,%eax
10c544: 40 inc %eax
10c545: a3 30 b7 12 00 mov %eax,0x12b730
* 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 );
10c54a: 83 ec 0c sub $0xc,%esp
10c54d: 68 80 b9 12 00 push $0x12b980
10c552: e8 6d 26 00 00 call 10ebc4 <_Objects_Allocate>
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
10c557: 83 c4 10 add $0x10,%esp
10c55a: 85 c0 test %eax,%eax
10c55c: 74 42 je 10c5a0 <pthread_rwlock_init+0x9c>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
10c55e: 83 ec 08 sub $0x8,%esp
10c561: 8d 55 f4 lea -0xc(%ebp),%edx
10c564: 52 push %edx
10c565: 8d 50 10 lea 0x10(%eax),%edx
10c568: 52 push %edx
10c569: 89 45 e4 mov %eax,-0x1c(%ebp)
10c56c: e8 3b 1e 00 00 call 10e3ac <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
10c571: 8b 45 e4 mov -0x1c(%ebp),%eax
10c574: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10c577: 0f b7 f2 movzwl %dx,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c57a: 8b 0d 9c b9 12 00 mov 0x12b99c,%ecx
10c580: 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;
10c583: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax)
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
10c58a: 89 13 mov %edx,(%ebx)
_Thread_Enable_dispatch();
10c58c: e8 5f 36 00 00 call 10fbf0 <_Thread_Enable_dispatch>
return 0;
10c591: 83 c4 10 add $0x10,%esp
10c594: 31 c0 xor %eax,%eax
}
10c596: 8d 65 f8 lea -0x8(%ebp),%esp
10c599: 5b pop %ebx
10c59a: 5e pop %esi
10c59b: c9 leave
10c59c: c3 ret
10c59d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
_Thread_Enable_dispatch();
10c5a0: e8 4b 36 00 00 call 10fbf0 <_Thread_Enable_dispatch>
return EAGAIN;
10c5a5: b8 0b 00 00 00 mov $0xb,%eax
10c5aa: eb 84 jmp 10c530 <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 );
10c5ac: 83 ec 0c sub $0xc,%esp
10c5af: 8d 75 ec lea -0x14(%ebp),%esi
10c5b2: 56 push %esi
10c5b3: e8 84 09 00 00 call 10cf3c <pthread_rwlockattr_init>
10c5b8: 83 c4 10 add $0x10,%esp
10c5bb: e9 5e ff ff ff jmp 10c51e <pthread_rwlock_init+0x1a>
0010c628 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10c628: 55 push %ebp
10c629: 89 e5 mov %esp,%ebp
10c62b: 56 push %esi
10c62c: 53 push %ebx
10c62d: 83 ec 20 sub $0x20,%esp
10c630: 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 )
10c633: 85 db test %ebx,%ebx
10c635: 74 7d je 10c6b4 <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 );
10c637: 83 ec 08 sub $0x8,%esp
10c63a: 8d 45 f0 lea -0x10(%ebp),%eax
10c63d: 50 push %eax
10c63e: ff 75 0c pushl 0xc(%ebp)
10c641: e8 de 62 00 00 call 112924 <_POSIX_Absolute_timeout_to_ticks>
10c646: 89 c6 mov %eax,%esi
10c648: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c64b: 8d 45 f4 lea -0xc(%ebp),%eax
10c64e: 50 push %eax
10c64f: ff 33 pushl (%ebx)
10c651: 68 80 b9 12 00 push $0x12b980
10c656: e8 1d 2a 00 00 call 10f078 <_Objects_Get>
switch ( location ) {
10c65b: 83 c4 10 add $0x10,%esp
10c65e: 8b 55 f4 mov -0xc(%ebp),%edx
10c661: 85 d2 test %edx,%edx
10c663: 75 4f jne 10c6b4 <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,
10c665: 83 fe 03 cmp $0x3,%esi
10c668: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
10c66b: 83 ec 0c sub $0xc,%esp
10c66e: 6a 00 push $0x0
10c670: ff 75 f0 pushl -0x10(%ebp)
10c673: 0f b6 ca movzbl %dl,%ecx
10c676: 51 push %ecx
10c677: ff 33 pushl (%ebx)
10c679: 83 c0 10 add $0x10,%eax
10c67c: 50 push %eax
10c67d: 88 55 e4 mov %dl,-0x1c(%ebp)
10c680: e8 5b 1d 00 00 call 10e3e0 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10c685: 83 c4 20 add $0x20,%esp
10c688: e8 63 35 00 00 call 10fbf0 <_Thread_Enable_dispatch>
if ( !do_wait ) {
10c68d: 8a 55 e4 mov -0x1c(%ebp),%dl
10c690: 84 d2 test %dl,%dl
10c692: 75 40 jne 10c6d4 <pthread_rwlock_timedrdlock+0xac>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
10c694: a1 d8 bc 12 00 mov 0x12bcd8,%eax
10c699: 8b 40 34 mov 0x34(%eax),%eax
10c69c: 83 f8 02 cmp $0x2,%eax
10c69f: 74 1f je 10c6c0 <pthread_rwlock_timedrdlock+0x98>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
10c6a1: 83 ec 0c sub $0xc,%esp
10c6a4: 50 push %eax
10c6a5: e8 ee 00 00 00 call 10c798 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10c6aa: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c6ad: 8d 65 f8 lea -0x8(%ebp),%esp
10c6b0: 5b pop %ebx
10c6b1: 5e pop %esi
10c6b2: c9 leave
10c6b3: 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;
10c6b4: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c6b9: 8d 65 f8 lea -0x8(%ebp),%esp
10c6bc: 5b pop %ebx
10c6bd: 5e pop %esi
10c6be: c9 leave
10c6bf: c3 ret
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10c6c0: 85 f6 test %esi,%esi
10c6c2: 74 f0 je 10c6b4 <pthread_rwlock_timedrdlock+0x8c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10c6c4: 4e dec %esi
10c6c5: 83 fe 01 cmp $0x1,%esi
10c6c8: 77 d7 ja 10c6a1 <pthread_rwlock_timedrdlock+0x79><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10c6ca: b8 74 00 00 00 mov $0x74,%eax
10c6cf: eb e8 jmp 10c6b9 <pthread_rwlock_timedrdlock+0x91>
10c6d1: 8d 76 00 lea 0x0(%esi),%esi
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
10c6d4: a1 d8 bc 12 00 mov 0x12bcd8,%eax
10c6d9: 8b 40 34 mov 0x34(%eax),%eax
10c6dc: eb c3 jmp 10c6a1 <pthread_rwlock_timedrdlock+0x79>
0010c6e0 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
10c6e0: 55 push %ebp
10c6e1: 89 e5 mov %esp,%ebp
10c6e3: 56 push %esi
10c6e4: 53 push %ebx
10c6e5: 83 ec 20 sub $0x20,%esp
10c6e8: 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 )
10c6eb: 85 db test %ebx,%ebx
10c6ed: 74 7d je 10c76c <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 );
10c6ef: 83 ec 08 sub $0x8,%esp
10c6f2: 8d 45 f0 lea -0x10(%ebp),%eax
10c6f5: 50 push %eax
10c6f6: ff 75 0c pushl 0xc(%ebp)
10c6f9: e8 26 62 00 00 call 112924 <_POSIX_Absolute_timeout_to_ticks>
10c6fe: 89 c6 mov %eax,%esi
10c700: 83 c4 0c add $0xc,%esp
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
10c703: 8d 45 f4 lea -0xc(%ebp),%eax
10c706: 50 push %eax
10c707: ff 33 pushl (%ebx)
10c709: 68 80 b9 12 00 push $0x12b980
10c70e: e8 65 29 00 00 call 10f078 <_Objects_Get>
switch ( location ) {
10c713: 83 c4 10 add $0x10,%esp
10c716: 8b 55 f4 mov -0xc(%ebp),%edx
10c719: 85 d2 test %edx,%edx
10c71b: 75 4f jne 10c76c <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,
10c71d: 83 fe 03 cmp $0x3,%esi
10c720: 0f 94 c2 sete %dl
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
10c723: 83 ec 0c sub $0xc,%esp
10c726: 6a 00 push $0x0
10c728: ff 75 f0 pushl -0x10(%ebp)
10c72b: 0f b6 ca movzbl %dl,%ecx
10c72e: 51 push %ecx
10c72f: ff 33 pushl (%ebx)
10c731: 83 c0 10 add $0x10,%eax
10c734: 50 push %eax
10c735: 88 55 e4 mov %dl,-0x1c(%ebp)
10c738: e8 6b 1d 00 00 call 10e4a8 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
10c73d: 83 c4 20 add $0x20,%esp
10c740: e8 ab 34 00 00 call 10fbf0 <_Thread_Enable_dispatch>
if ( !do_wait &&
10c745: 8a 55 e4 mov -0x1c(%ebp),%dl
10c748: 84 d2 test %dl,%dl
10c74a: 75 40 jne 10c78c <pthread_rwlock_timedwrlock+0xac>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
10c74c: a1 d8 bc 12 00 mov 0x12bcd8,%eax
10c751: 8b 40 34 mov 0x34(%eax),%eax
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10c754: 83 f8 02 cmp $0x2,%eax
10c757: 74 1f je 10c778 <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(
10c759: 83 ec 0c sub $0xc,%esp
10c75c: 50 push %eax
10c75d: e8 36 00 00 00 call 10c798 <_POSIX_RWLock_Translate_core_RWLock_return_code>
10c762: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c765: 8d 65 f8 lea -0x8(%ebp),%esp
10c768: 5b pop %ebx
10c769: 5e pop %esi
10c76a: c9 leave
10c76b: c3 ret
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
10c76c: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
10c771: 8d 65 f8 lea -0x8(%ebp),%esp
10c774: 5b pop %ebx
10c775: 5e pop %esi
10c776: c9 leave
10c777: c3 ret
);
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
10c778: 85 f6 test %esi,%esi
10c77a: 74 f0 je 10c76c <pthread_rwlock_timedwrlock+0x8c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
10c77c: 4e dec %esi
10c77d: 83 fe 01 cmp $0x1,%esi
10c780: 77 d7 ja 10c759 <pthread_rwlock_timedwrlock+0x79><== NEVER TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
10c782: b8 74 00 00 00 mov $0x74,%eax
10c787: eb e8 jmp 10c771 <pthread_rwlock_timedwrlock+0x91>
10c789: 8d 76 00 lea 0x0(%esi),%esi
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
10c78c: a1 d8 bc 12 00 mov 0x12bcd8,%eax
10c791: 8b 40 34 mov 0x34(%eax),%eax
10c794: eb c3 jmp 10c759 <pthread_rwlock_timedwrlock+0x79>
0010cef4 <pthread_rwlockattr_destroy>:
*/
int pthread_rwlockattr_destroy(
pthread_rwlockattr_t *attr
)
{
10cef4: 55 push %ebp
10cef5: 89 e5 mov %esp,%ebp
10cef7: 8b 45 08 mov 0x8(%ebp),%eax
if ( !attr || attr->is_initialized == false )
10cefa: 85 c0 test %eax,%eax
10cefc: 74 12 je 10cf10 <pthread_rwlockattr_destroy+0x1c>
10cefe: 8b 10 mov (%eax),%edx
10cf00: 85 d2 test %edx,%edx
10cf02: 74 0c je 10cf10 <pthread_rwlockattr_destroy+0x1c>
return EINVAL;
attr->is_initialized = false;
10cf04: c7 00 00 00 00 00 movl $0x0,(%eax)
return 0;
10cf0a: 31 c0 xor %eax,%eax
}
10cf0c: c9 leave
10cf0d: c3 ret
10cf0e: 66 90 xchg %ax,%ax
int pthread_rwlockattr_destroy(
pthread_rwlockattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
10cf10: b8 16 00 00 00 mov $0x16,%eax
attr->is_initialized = false;
return 0;
}
10cf15: c9 leave
10cf16: c3 ret
0010cf60 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
10cf60: 55 push %ebp
10cf61: 89 e5 mov %esp,%ebp
10cf63: 8b 45 08 mov 0x8(%ebp),%eax
10cf66: 8b 55 0c mov 0xc(%ebp),%edx
if ( !attr )
10cf69: 85 c0 test %eax,%eax
10cf6b: 74 0b je 10cf78 <pthread_rwlockattr_setpshared+0x18>
return EINVAL;
if ( !attr->is_initialized )
10cf6d: 8b 08 mov (%eax),%ecx
10cf6f: 85 c9 test %ecx,%ecx
10cf71: 74 05 je 10cf78 <pthread_rwlockattr_setpshared+0x18>
return EINVAL;
switch ( pshared ) {
10cf73: 83 fa 01 cmp $0x1,%edx
10cf76: 76 08 jbe 10cf80 <pthread_rwlockattr_setpshared+0x20><== ALWAYS TAKEN
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
10cf78: b8 16 00 00 00 mov $0x16,%eax
}
}
10cf7d: c9 leave
10cf7e: c3 ret
10cf7f: 90 nop
return EINVAL;
switch ( pshared ) {
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
10cf80: 89 50 04 mov %edx,0x4(%eax)
return 0;
10cf83: 31 c0 xor %eax,%eax
default:
return EINVAL;
}
}
10cf85: c9 leave
10cf86: 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 96 12 00 mov 0x129654,%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 96 12 00 mov 0x129658,%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 b0 90 12 00 mov 0x1290b0,%ebx
10b25e: 43 inc %ebx
10b25f: 89 1d b0 90 12 00 mov %ebx,0x1290b0
_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 96 12 00 pushl 0x129658
10b27c: e8 7b 54 00 00 call 1106fc <_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 96 12 00 mov 0x129654,%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 96 12 00 mov 0x129658,%ecx
10b2ca: 8b 89 ec 00 00 00 mov 0xec(%ecx),%ecx
10b2d0: 8b 1d b0 90 12 00 mov 0x1290b0,%ebx
10b2d6: 43 inc %ebx
10b2d7: 89 1d b0 90 12 00 mov %ebx,0x1290b0
_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 96 12 00 pushl 0x129658
10b2f4: e8 03 54 00 00 call 1106fc <_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
0010dd14 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
10dd14: 55 push %ebp
10dd15: 89 e5 mov %esp,%ebp
10dd17: 57 push %edi
10dd18: 56 push %esi
10dd19: 53 push %ebx
10dd1a: 83 ec 2c sub $0x2c,%esp
10dd1d: 8b 75 10 mov 0x10(%ebp),%esi
int rc;
/*
* Check all the parameters
*/
if ( !param )
10dd20: 85 f6 test %esi,%esi
10dd22: 0f 84 cc 00 00 00 je 10ddf4 <pthread_setschedparam+0xe0>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
10dd28: 8d 45 e0 lea -0x20(%ebp),%eax
10dd2b: 50 push %eax
10dd2c: 8d 45 e4 lea -0x1c(%ebp),%eax
10dd2f: 50 push %eax
10dd30: 56 push %esi
10dd31: ff 75 0c pushl 0xc(%ebp)
10dd34: e8 17 5c 00 00 call 113950 <_POSIX_Thread_Translate_sched_param>
10dd39: 89 c3 mov %eax,%ebx
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
10dd3b: 83 c4 10 add $0x10,%esp
10dd3e: 85 c0 test %eax,%eax
10dd40: 74 0a je 10dd4c <pthread_setschedparam+0x38>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10dd42: 89 d8 mov %ebx,%eax
10dd44: 8d 65 f4 lea -0xc(%ebp),%esp
10dd47: 5b pop %ebx
10dd48: 5e pop %esi
10dd49: 5f pop %edi
10dd4a: c9 leave
10dd4b: c3 ret
10dd4c: 50 push %eax
return rc;
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _POSIX_Threads_Get( thread, &location );
10dd4d: 8d 45 dc lea -0x24(%ebp),%eax
10dd50: 50 push %eax
10dd51: ff 75 08 pushl 0x8(%ebp)
10dd54: 68 80 cf 12 00 push $0x12cf80
10dd59: e8 9a 1f 00 00 call 10fcf8 <_Objects_Get>
10dd5e: 89 c2 mov %eax,%edx
switch ( location ) {
10dd60: 83 c4 10 add $0x10,%esp
10dd63: 8b 7d dc mov -0x24(%ebp),%edi
10dd66: 85 ff test %edi,%edi
10dd68: 0f 85 96 00 00 00 jne 10de04 <pthread_setschedparam+0xf0>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10dd6e: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10dd74: 89 45 d4 mov %eax,-0x2c(%ebp)
if ( api->schedpolicy == SCHED_SPORADIC )
10dd77: 83 b8 84 00 00 00 04 cmpl $0x4,0x84(%eax)
10dd7e: 0f 84 cc 00 00 00 je 10de50 <pthread_setschedparam+0x13c>
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
10dd84: 8b 45 0c mov 0xc(%ebp),%eax
10dd87: 8b 4d d4 mov -0x2c(%ebp),%ecx
10dd8a: 89 81 84 00 00 00 mov %eax,0x84(%ecx)
api->schedparam = *param;
10dd90: 89 cf mov %ecx,%edi
10dd92: 81 c7 88 00 00 00 add $0x88,%edi
10dd98: b9 07 00 00 00 mov $0x7,%ecx
10dd9d: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
the_thread->budget_algorithm = budget_algorithm;
10dd9f: 8b 45 e4 mov -0x1c(%ebp),%eax
10dda2: 89 42 7c mov %eax,0x7c(%edx)
the_thread->budget_callout = budget_callout;
10dda5: 8b 45 e0 mov -0x20(%ebp),%eax
10dda8: 89 82 80 00 00 00 mov %eax,0x80(%edx)
switch ( api->schedpolicy ) {
10ddae: 8b 75 0c mov 0xc(%ebp),%esi
10ddb1: 85 f6 test %esi,%esi
10ddb3: 78 2e js 10dde3 <pthread_setschedparam+0xcf><== NEVER TAKEN
10ddb5: 83 7d 0c 02 cmpl $0x2,0xc(%ebp)
10ddb9: 7f 59 jg 10de14 <pthread_setschedparam+0x100>
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
10ddbb: a1 c0 cc 12 00 mov 0x12ccc0,%eax
10ddc0: 89 42 78 mov %eax,0x78(%edx)
10ddc3: 0f b6 05 9c 89 12 00 movzbl 0x12899c,%eax
10ddca: 8b 4d d4 mov -0x2c(%ebp),%ecx
10ddcd: 2b 81 88 00 00 00 sub 0x88(%ecx),%eax
the_thread->real_priority =
10ddd3: 89 42 18 mov %eax,0x18(%edx)
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
10ddd6: 51 push %ecx
10ddd7: 6a 01 push $0x1
10ddd9: 50 push %eax
10ddda: 52 push %edx
10dddb: e8 58 26 00 00 call 110438 <_Thread_Change_priority>
the_thread,
the_thread->real_priority,
true
);
break;
10dde0: 83 c4 10 add $0x10,%esp
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
10dde3: e8 88 2a 00 00 call 110870 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
10dde8: 89 d8 mov %ebx,%eax
10ddea: 8d 65 f4 lea -0xc(%ebp),%esp
10dded: 5b pop %ebx
10ddee: 5e pop %esi
10ddef: 5f pop %edi
10ddf0: c9 leave
10ddf1: c3 ret
10ddf2: 66 90 xchg %ax,%ax
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
10ddf4: bb 16 00 00 00 mov $0x16,%ebx
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
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
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
10de04: bb 03 00 00 00 mov $0x3,%ebx
}
10de09: 89 d8 mov %ebx,%eax
10de0b: 8d 65 f4 lea -0xc(%ebp),%esp
10de0e: 5b pop %ebx
10de0f: 5e pop %esi
10de10: 5f pop %edi
10de11: c9 leave
10de12: c3 ret
10de13: 90 nop
api->schedpolicy = policy;
api->schedparam = *param;
the_thread->budget_algorithm = budget_algorithm;
the_thread->budget_callout = budget_callout;
switch ( api->schedpolicy ) {
10de14: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10de18: 75 c9 jne 10dde3 <pthread_setschedparam+0xcf><== NEVER TAKEN
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
10de1a: 8b 4d d4 mov -0x2c(%ebp),%ecx
10de1d: 8b 81 88 00 00 00 mov 0x88(%ecx),%eax
10de23: 89 81 a4 00 00 00 mov %eax,0xa4(%ecx)
_Watchdog_Remove( &api->Sporadic_timer );
10de29: 83 ec 0c sub $0xc,%esp
10de2c: 89 c8 mov %ecx,%eax
10de2e: 05 a8 00 00 00 add $0xa8,%eax
10de33: 50 push %eax
10de34: 89 55 d0 mov %edx,-0x30(%ebp)
10de37: e8 38 3a 00 00 call 111874 <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
10de3c: 58 pop %eax
10de3d: 5a pop %edx
10de3e: 8b 55 d0 mov -0x30(%ebp),%edx
10de41: 52 push %edx
10de42: 6a 00 push $0x0
10de44: e8 af fd ff ff call 10dbf8 <_POSIX_Threads_Sporadic_budget_TSR>
break;
10de49: 83 c4 10 add $0x10,%esp
10de4c: eb 95 jmp 10dde3 <pthread_setschedparam+0xcf>
10de4e: 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 );
10de50: 83 ec 0c sub $0xc,%esp
10de53: 05 a8 00 00 00 add $0xa8,%eax
10de58: 50 push %eax
10de59: 89 55 d0 mov %edx,-0x30(%ebp)
10de5c: e8 13 3a 00 00 call 111874 <_Watchdog_Remove>
10de61: 83 c4 10 add $0x10,%esp
10de64: 8b 55 d0 mov -0x30(%ebp),%edx
10de67: e9 18 ff ff ff jmp 10dd84 <pthread_setschedparam+0x70>
00111d14 <pthread_sigmask>:
int pthread_sigmask(
int how,
const sigset_t *set,
sigset_t *oset
)
{
111d14: 55 push %ebp
111d15: 89 e5 mov %esp,%ebp
111d17: 56 push %esi
111d18: 53 push %ebx
111d19: 8b 4d 08 mov 0x8(%ebp),%ecx
111d1c: 8b 55 0c mov 0xc(%ebp),%edx
111d1f: 8b 5d 10 mov 0x10(%ebp),%ebx
POSIX_API_Control *api;
if ( !set && !oset )
111d22: 85 d2 test %edx,%edx
111d24: 0f 84 8a 00 00 00 je 111db4 <pthread_sigmask+0xa0>
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
111d2a: a1 58 a3 12 00 mov 0x12a358,%eax
111d2f: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
if ( oset )
111d35: 85 db test %ebx,%ebx
111d37: 74 0c je 111d45 <pthread_sigmask+0x31>
*oset = api->signals_blocked;
111d39: 8b b0 d0 00 00 00 mov 0xd0(%eax),%esi
111d3f: 89 33 mov %esi,(%ebx)
if ( !set )
111d41: 85 d2 test %edx,%edx
111d43: 74 3b je 111d80 <pthread_sigmask+0x6c>
return 0;
switch ( how ) {
111d45: 83 f9 01 cmp $0x1,%ecx
111d48: 74 5e je 111da8 <pthread_sigmask+0x94>
111d4a: 83 f9 02 cmp $0x2,%ecx
111d4d: 74 39 je 111d88 <pthread_sigmask+0x74>
111d4f: 85 c9 test %ecx,%ecx
111d51: 75 41 jne 111d94 <pthread_sigmask+0x80>
break;
case SIG_UNBLOCK:
api->signals_blocked &= ~*set;
break;
case SIG_SETMASK:
api->signals_blocked = *set;
111d53: 8b 12 mov (%edx),%edx
111d55: 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) ) {
111d5b: 8b 15 c8 a5 12 00 mov 0x12a5c8,%edx
111d61: 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 &
111d67: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax
111d6d: f7 d0 not %eax
111d6f: 85 c2 test %eax,%edx
111d71: 74 0d je 111d80 <pthread_sigmask+0x6c>
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
111d73: e8 b0 c9 ff ff call 10e728 <_Thread_Dispatch>
}
return 0;
111d78: 31 c0 xor %eax,%eax
}
111d7a: 5b pop %ebx
111d7b: 5e pop %esi
111d7c: c9 leave
111d7d: c3 ret
111d7e: 66 90 xchg %ax,%ax
if ( ~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}
return 0;
111d80: 31 c0 xor %eax,%eax
}
111d82: 5b pop %ebx
111d83: 5e pop %esi
111d84: c9 leave
111d85: c3 ret
111d86: 66 90 xchg %ax,%ax
switch ( how ) {
case SIG_BLOCK:
api->signals_blocked |= *set;
break;
case SIG_UNBLOCK:
api->signals_blocked &= ~*set;
111d88: 8b 12 mov (%edx),%edx
111d8a: f7 d2 not %edx
111d8c: 21 90 d0 00 00 00 and %edx,0xd0(%eax)
break;
111d92: eb c7 jmp 111d5b <pthread_sigmask+0x47>
case SIG_SETMASK:
api->signals_blocked = *set;
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
111d94: e8 d3 24 00 00 call 11426c <__errno>
111d99: c7 00 16 00 00 00 movl $0x16,(%eax)
111d9f: b8 ff ff ff ff mov $0xffffffff,%eax
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}
return 0;
}
111da4: 5b pop %ebx
111da5: 5e pop %esi
111da6: c9 leave
111da7: c3 ret
if ( !set )
return 0;
switch ( how ) {
case SIG_BLOCK:
api->signals_blocked |= *set;
111da8: 8b 12 mov (%edx),%edx
111daa: 09 90 d0 00 00 00 or %edx,0xd0(%eax)
break;
111db0: eb a9 jmp 111d5b <pthread_sigmask+0x47>
111db2: 66 90 xchg %ax,%ax
sigset_t *oset
)
{
POSIX_API_Control *api;
if ( !set && !oset )
111db4: 85 db test %ebx,%ebx
111db6: 74 dc je 111d94 <pthread_sigmask+0x80>
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
111db8: a1 58 a3 12 00 mov 0x12a358,%eax
111dbd: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
111dc3: e9 71 ff ff ff jmp 111d39 <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 9d 12 00 mov 0x129dd4,%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 9d 12 00 mov 0x129dd8,%eax
10bb99: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax
10bb9f: 8b 15 30 98 12 00 mov 0x129830,%edx
10bba5: 42 inc %edx
10bba6: 89 15 30 98 12 00 mov %edx,0x129830
_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 7f 29 00 00 call 10e544 <_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 9d 12 00 pushl 0x129dd8
10bbd0: e8 73 5b 00 00 call 111748 <_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 62 29 00 00 jmp 10e544 <_Thread_Enable_dispatch>
0010c550 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
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 58 sub $0x58,%esp
10c559: 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);
10c55c: 68 00 aa 12 00 push $0x12aa00
10c561: e8 86 09 00 00 call 10ceec <pthread_mutex_lock>
10c566: 89 c6 mov %eax,%esi
if (result != 0) {
10c568: 83 c4 10 add $0x10,%esp
10c56b: 85 c0 test %eax,%eax
10c56d: 0f 85 c1 00 00 00 jne 10c634 <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);
10c573: e8 24 12 00 00 call 10d79c <pthread_self>
10c578: 51 push %ecx
10c579: 8d 55 c4 lea -0x3c(%ebp),%edx
10c57c: 52 push %edx
10c57d: 8d 55 e0 lea -0x20(%ebp),%edx
10c580: 52 push %edx
10c581: 50 push %eax
10c582: e8 e1 0d 00 00 call 10d368 <pthread_getschedparam>
req->caller_thread = pthread_self ();
10c587: e8 10 12 00 00 call 10d79c <pthread_self>
10c58c: 89 43 10 mov %eax,0x10(%ebx)
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
10c58f: 8b 43 14 mov 0x14(%ebx),%eax
10c592: 8b 55 c4 mov -0x3c(%ebp),%edx
10c595: 2b 50 14 sub 0x14(%eax),%edx
10c598: 89 53 0c mov %edx,0xc(%ebx)
req->policy = policy;
10c59b: 8b 55 e0 mov -0x20(%ebp),%edx
10c59e: 89 53 08 mov %edx,0x8(%ebx)
req->aiocbp->error_code = EINPROGRESS;
10c5a1: c7 40 30 77 00 00 00 movl $0x77,0x30(%eax)
req->aiocbp->return_value = 0;
10c5a8: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
if ((aio_request_queue.idle_threads == 0) &&
10c5af: 83 c4 10 add $0x10,%esp
10c5b2: 8b 15 68 aa 12 00 mov 0x12aa68,%edx
10c5b8: 85 d2 test %edx,%edx
10c5ba: 75 0d jne 10c5c9 <rtems_aio_enqueue+0x79><== NEVER TAKEN
10c5bc: 83 3d 64 aa 12 00 04 cmpl $0x4,0x12aa64
10c5c3: 0f 8e 83 00 00 00 jle 10c64c <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,
10c5c9: 51 push %ecx
10c5ca: 6a 00 push $0x0
10c5cc: ff 30 pushl (%eax)
10c5ce: 68 48 aa 12 00 push $0x12aa48
10c5d3: e8 28 fb ff ff call 10c100 <rtems_aio_search_fd>
10c5d8: 89 c7 mov %eax,%edi
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
10c5da: 83 c4 10 add $0x10,%esp
10c5dd: 85 c0 test %eax,%eax
10c5df: 0f 84 df 00 00 00 je 10c6c4 <rtems_aio_enqueue+0x174>
{
pthread_mutex_lock (&r_chain->mutex);
10c5e5: 8d 57 1c lea 0x1c(%edi),%edx
10c5e8: 83 ec 0c sub $0xc,%esp
10c5eb: 52 push %edx
10c5ec: 89 55 b4 mov %edx,-0x4c(%ebp)
10c5ef: e8 f8 08 00 00 call 10ceec <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
10c5f4: 58 pop %eax
10c5f5: 5a pop %edx
10c5f6: 53 push %ebx
10c5f7: 8d 47 08 lea 0x8(%edi),%eax
10c5fa: 50 push %eax
10c5fb: e8 48 fe ff ff call 10c448 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
10c600: 83 c7 20 add $0x20,%edi
10c603: 89 3c 24 mov %edi,(%esp)
10c606: e8 b1 04 00 00 call 10cabc <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
10c60b: 8b 55 b4 mov -0x4c(%ebp),%edx
10c60e: 89 14 24 mov %edx,(%esp)
10c611: e8 5e 09 00 00 call 10cf74 <pthread_mutex_unlock>
10c616: 83 c4 10 add $0x10,%esp
if (aio_request_queue.idle_threads > 0)
pthread_cond_signal (&aio_request_queue.new_req);
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
10c619: 83 ec 0c sub $0xc,%esp
10c61c: 68 00 aa 12 00 push $0x12aa00
10c621: e8 4e 09 00 00 call 10cf74 <pthread_mutex_unlock>
return 0;
10c626: 83 c4 10 add $0x10,%esp
}
10c629: 89 f0 mov %esi,%eax
10c62b: 8d 65 f4 lea -0xc(%ebp),%esp
10c62e: 5b pop %ebx
10c62f: 5e pop %esi
10c630: 5f pop %edi
10c631: c9 leave
10c632: c3 ret
10c633: 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);
10c634: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c637: 53 push %ebx <== NOT EXECUTED
10c638: e8 f7 c4 ff ff call 108b34 <free> <== NOT EXECUTED
return result;
10c63d: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
return 0;
}
10c640: 89 f0 mov %esi,%eax <== NOT EXECUTED
10c642: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
10c645: 5b pop %ebx <== NOT EXECUTED
10c646: 5e pop %esi <== NOT EXECUTED
10c647: 5f pop %edi <== NOT EXECUTED
10c648: c9 leave <== NOT EXECUTED
10c649: c3 ret <== NOT EXECUTED
10c64a: 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);
10c64c: 57 push %edi
10c64d: 6a 01 push $0x1
10c64f: ff 30 pushl (%eax)
10c651: 68 48 aa 12 00 push $0x12aa48
10c656: e8 a5 fa ff ff call 10c100 <rtems_aio_search_fd>
10c65b: 89 c7 mov %eax,%edi
if (r_chain->new_fd == 1) {
10c65d: 83 c4 10 add $0x10,%esp
10c660: 83 78 18 01 cmpl $0x1,0x18(%eax)
10c664: 0f 85 7b ff ff ff jne 10c5e5 <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);
10c66a: 83 ec 08 sub $0x8,%esp
10c66d: 53 push %ebx
10c66e: 8d 40 08 lea 0x8(%eax),%eax
10c671: 50 push %eax
10c672: e8 81 22 00 00 call 10e8f8 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
10c677: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
pthread_mutex_init (&r_chain->mutex, NULL);
10c67e: 5a pop %edx
10c67f: 59 pop %ecx
10c680: 6a 00 push $0x0
10c682: 8d 47 1c lea 0x1c(%edi),%eax
10c685: 50 push %eax
10c686: e8 15 07 00 00 call 10cda0 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10c68b: 5b pop %ebx
10c68c: 58 pop %eax
10c68d: 6a 00 push $0x0
10c68f: 8d 47 20 lea 0x20(%edi),%eax
10c692: 50 push %eax
10c693: e8 70 03 00 00 call 10ca08 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
10c698: 57 push %edi
10c699: 68 fc c1 10 00 push $0x10c1fc
10c69e: 68 08 aa 12 00 push $0x12aa08
10c6a3: 8d 45 e4 lea -0x1c(%ebp),%eax
10c6a6: 50 push %eax
10c6a7: e8 34 0a 00 00 call 10d0e0 <pthread_create>
10c6ac: 89 c3 mov %eax,%ebx
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
10c6ae: 83 c4 20 add $0x20,%esp
10c6b1: 85 c0 test %eax,%eax
10c6b3: 0f 85 8e 00 00 00 jne 10c747 <rtems_aio_enqueue+0x1f7><== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
10c6b9: ff 05 64 aa 12 00 incl 0x12aa64
10c6bf: e9 55 ff ff ff jmp 10c619 <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);
10c6c4: 57 push %edi
10c6c5: 6a 01 push $0x1
10c6c7: 8b 43 14 mov 0x14(%ebx),%eax
10c6ca: ff 30 pushl (%eax)
10c6cc: 68 54 aa 12 00 push $0x12aa54
10c6d1: e8 2a fa ff ff call 10c100 <rtems_aio_search_fd>
10c6d6: 89 c7 mov %eax,%edi
if (r_chain->new_fd == 1) {
10c6d8: 83 c4 10 add $0x10,%esp
10c6db: 83 78 18 01 cmpl $0x1,0x18(%eax)
10c6df: 74 33 je 10c714 <rtems_aio_enqueue+0x1c4>
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
pthread_cond_init (&r_chain->cond, NULL);
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
10c6e1: 83 ec 08 sub $0x8,%esp
10c6e4: 53 push %ebx
10c6e5: 83 c7 08 add $0x8,%edi
10c6e8: 57 push %edi
10c6e9: e8 5a fd ff ff call 10c448 <rtems_aio_insert_prio>
10c6ee: 83 c4 10 add $0x10,%esp
if (aio_request_queue.idle_threads > 0)
10c6f1: 8b 0d 68 aa 12 00 mov 0x12aa68,%ecx
10c6f7: 85 c9 test %ecx,%ecx
10c6f9: 0f 8e 1a ff ff ff jle 10c619 <rtems_aio_enqueue+0xc9><== ALWAYS TAKEN
pthread_cond_signal (&aio_request_queue.new_req);
10c6ff: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c702: 68 04 aa 12 00 push $0x12aa04 <== NOT EXECUTED
10c707: e8 b0 03 00 00 call 10cabc <pthread_cond_signal> <== NOT EXECUTED
10c70c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c70f: e9 05 ff ff ff jmp 10c619 <rtems_aio_enqueue+0xc9><== NOT EXECUTED
10c714: 83 ec 08 sub $0x8,%esp
10c717: 53 push %ebx
10c718: 8d 40 08 lea 0x8(%eax),%eax
10c71b: 50 push %eax
10c71c: e8 d7 21 00 00 call 10e8f8 <_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;
10c721: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
pthread_mutex_init (&r_chain->mutex, NULL);
10c728: 5a pop %edx
10c729: 59 pop %ecx
10c72a: 6a 00 push $0x0
10c72c: 8d 47 1c lea 0x1c(%edi),%eax
10c72f: 50 push %eax
10c730: e8 6b 06 00 00 call 10cda0 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
10c735: 5b pop %ebx
10c736: 58 pop %eax
10c737: 6a 00 push $0x0
10c739: 83 c7 20 add $0x20,%edi
10c73c: 57 push %edi
10c73d: e8 c6 02 00 00 call 10ca08 <pthread_cond_init>
10c742: 83 c4 10 add $0x10,%esp
10c745: eb aa jmp 10c6f1 <rtems_aio_enqueue+0x1a1>
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);
10c747: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c74a: 68 00 aa 12 00 push $0x12aa00 <== NOT EXECUTED
10c74f: e8 20 08 00 00 call 10cf74 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
10c754: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c757: 89 de mov %ebx,%esi <== NOT EXECUTED
10c759: e9 cb fe ff ff jmp 10c629 <rtems_aio_enqueue+0xd9><== NOT EXECUTED
0010c1fc <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
10c1fc: 55 push %ebp
10c1fd: 89 e5 mov %esp,%ebp
10c1ff: 57 push %edi
10c200: 56 push %esi
10c201: 53 push %ebx
10c202: 83 ec 4c sub $0x4c,%esp
rtems_aio_request_chain *r_chain = arg;
10c205: 8b 7d 08 mov 0x8(%ebp),%edi
10c208: 8d 47 1c lea 0x1c(%edi),%eax
10c20b: 89 45 b4 mov %eax,-0x4c(%ebp)
10c20e: 66 90 xchg %ax,%ax
/* 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);
10c210: 83 ec 0c sub $0xc,%esp
10c213: ff 75 b4 pushl -0x4c(%ebp)
10c216: e8 d1 0c 00 00 call 10ceec <pthread_mutex_lock>
if (result != 0)
10c21b: 83 c4 10 add $0x10,%esp
10c21e: 85 c0 test %eax,%eax
10c220: 0f 85 2a 01 00 00 jne 10c350 <rtems_aio_handle+0x154><== NEVER TAKEN
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c226: 8b 5f 08 mov 0x8(%edi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10c229: 8d 47 0c lea 0xc(%edi),%eax
/* If the locked chain is not empty, take the first
request extract it, unlock the chain and process
the request, in this way the user can supply more
requests to this fd chain */
if (!rtems_chain_is_empty (chain)) {
10c22c: 39 c3 cmp %eax,%ebx
10c22e: 0f 84 d0 00 00 00 je 10c304 <rtems_aio_handle+0x108>
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);
10c234: e8 63 15 00 00 call 10d79c <pthread_self>
10c239: 52 push %edx
10c23a: 8d 55 c0 lea -0x40(%ebp),%edx
10c23d: 52 push %edx
10c23e: 8d 55 e4 lea -0x1c(%ebp),%edx
10c241: 52 push %edx
10c242: 50 push %eax
10c243: e8 20 11 00 00 call 10d368 <pthread_getschedparam>
param.sched_priority = req->priority;
10c248: 8b 43 0c mov 0xc(%ebx),%eax
10c24b: 89 45 c0 mov %eax,-0x40(%ebp)
pthread_setschedparam (pthread_self(), req->policy, ¶m);
10c24e: 8b 73 08 mov 0x8(%ebx),%esi
10c251: e8 46 15 00 00 call 10d79c <pthread_self>
10c256: 83 c4 0c add $0xc,%esp
10c259: 8d 55 c0 lea -0x40(%ebp),%edx
10c25c: 52 push %edx
10c25d: 56 push %esi
10c25e: 50 push %eax
10c25f: e8 48 15 00 00 call 10d7ac <pthread_setschedparam>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10c264: 89 1c 24 mov %ebx,(%esp)
10c267: e8 50 26 00 00 call 10e8bc <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
10c26c: 5e pop %esi
10c26d: ff 75 b4 pushl -0x4c(%ebp)
10c270: e8 ff 0c 00 00 call 10cf74 <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
10c275: 8b 73 14 mov 0x14(%ebx),%esi
10c278: 83 c4 10 add $0x10,%esp
10c27b: 8b 46 2c mov 0x2c(%esi),%eax
10c27e: 83 f8 02 cmp $0x2,%eax
10c281: 74 21 je 10c2a4 <rtems_aio_handle+0xa8>
10c283: 83 f8 03 cmp $0x3,%eax
10c286: 74 6c je 10c2f4 <rtems_aio_handle+0xf8> <== NEVER TAKEN
10c288: 48 dec %eax
10c289: 74 4d je 10c2d8 <rtems_aio_handle+0xdc> <== ALWAYS TAKEN
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
10c28b: c7 46 34 ff ff ff ff movl $0xffffffff,0x34(%esi) <== NOT EXECUTED
req->aiocbp->error_code = errno;
10c292: e8 01 99 00 00 call 115b98 <__errno> <== NOT EXECUTED
10c297: 8b 00 mov (%eax),%eax <== NOT EXECUTED
10c299: 89 46 30 mov %eax,0x30(%esi) <== NOT EXECUTED
10c29c: e9 6f ff ff ff jmp 10c210 <rtems_aio_handle+0x14> <== NOT EXECUTED
10c2a1: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
10c2a4: 83 ec 0c sub $0xc,%esp
10c2a7: ff 76 08 pushl 0x8(%esi)
10c2aa: ff 76 04 pushl 0x4(%esi)
10c2ad: ff 76 10 pushl 0x10(%esi)
10c2b0: ff 76 0c pushl 0xc(%esi)
10c2b3: ff 36 pushl (%esi)
10c2b5: e8 76 a3 00 00 call 116630 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10c2ba: 83 c4 20 add $0x20,%esp
break;
default:
result = -1;
}
if (result == -1) {
10c2bd: 83 f8 ff cmp $0xffffffff,%eax
10c2c0: 0f 84 78 01 00 00 je 10c43e <rtems_aio_handle+0x242><== NEVER TAKEN
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
10c2c6: 8b 53 14 mov 0x14(%ebx),%edx
10c2c9: 89 42 34 mov %eax,0x34(%edx)
req->aiocbp->error_code = 0;
10c2cc: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
10c2d3: e9 38 ff ff ff jmp 10c210 <rtems_aio_handle+0x14>
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
10c2d8: 83 ec 0c sub $0xc,%esp
10c2db: ff 76 08 pushl 0x8(%esi)
10c2de: ff 76 04 pushl 0x4(%esi)
10c2e1: ff 76 10 pushl 0x10(%esi)
10c2e4: ff 76 0c pushl 0xc(%esi)
10c2e7: ff 36 pushl (%esi)
10c2e9: e8 8e a2 00 00 call 11657c <pread>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
10c2ee: 83 c4 20 add $0x20,%esp
10c2f1: eb ca jmp 10c2bd <rtems_aio_handle+0xc1>
10c2f3: 90 nop
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
10c2f4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c2f7: ff 36 pushl (%esi) <== NOT EXECUTED
10c2f9: e8 16 67 00 00 call 112a14 <fsync> <== NOT EXECUTED
break;
10c2fe: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c301: eb ba jmp 10c2bd <rtems_aio_handle+0xc1> <== NOT EXECUTED
10c303: 90 nop <== NOT EXECUTED
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
10c304: 83 ec 0c sub $0xc,%esp
10c307: ff 75 b4 pushl -0x4c(%ebp)
10c30a: e8 65 0c 00 00 call 10cf74 <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
10c30f: c7 04 24 00 aa 12 00 movl $0x12aa00,(%esp)
10c316: e8 d1 0b 00 00 call 10ceec <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
10c31b: 83 c4 10 add $0x10,%esp
10c31e: 3b 5f 08 cmp 0x8(%edi),%ebx
10c321: 74 39 je 10c35c <rtems_aio_handle+0x160><== ALWAYS TAKEN
}
}
/* If there was a request added in the initial fd chain then release
the mutex and process it */
pthread_mutex_unlock (&aio_request_queue.mutex);
10c323: 83 ec 0c sub $0xc,%esp
10c326: 68 00 aa 12 00 push $0x12aa00
10c32b: e8 44 0c 00 00 call 10cf74 <pthread_mutex_unlock>
10c330: 83 c4 10 add $0x10,%esp
10c333: e9 d8 fe ff ff jmp 10c210 <rtems_aio_handle+0x14>
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
10c338: ff 0d 68 aa 12 00 decl 0x12aa68
pthread_mutex_unlock (&aio_request_queue.mutex);
10c33e: 83 ec 0c sub $0xc,%esp
10c341: 68 00 aa 12 00 push $0x12aa00
10c346: e8 29 0c 00 00 call 10cf74 <pthread_mutex_unlock>
return NULL;
10c34b: 83 c4 10 add $0x10,%esp
10c34e: 66 90 xchg %ax,%ax
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c350: 31 c0 xor %eax,%eax
10c352: 8d 65 f4 lea -0xc(%ebp),%esp
10c355: 5b pop %ebx
10c356: 5e pop %esi
10c357: 5f pop %edi
10c358: c9 leave
10c359: c3 ret
10c35a: 66 90 xchg %ax,%ax
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
10c35c: 83 ec 08 sub $0x8,%esp
10c35f: 8d 45 dc lea -0x24(%ebp),%eax
10c362: 50 push %eax
10c363: 6a 01 push $0x1
10c365: e8 66 05 00 00 call 10c8d0 <clock_gettime>
timeout.tv_sec += 3;
10c36a: 83 45 dc 03 addl $0x3,-0x24(%ebp)
timeout.tv_nsec = 0;
10c36e: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
result = pthread_cond_timedwait (&r_chain->cond,
10c375: 8d 5f 20 lea 0x20(%edi),%ebx
10c378: 83 c4 0c add $0xc,%esp
10c37b: 8d 55 dc lea -0x24(%ebp),%edx
10c37e: 52 push %edx
10c37f: 68 00 aa 12 00 push $0x12aa00
10c384: 53 push %ebx
10c385: e8 b6 07 00 00 call 10cb40 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no requests were added to the chain we delete the fd chain from
the queue and start working with idle fd chains */
if (result == ETIMEDOUT) {
10c38a: 83 c4 10 add $0x10,%esp
10c38d: 83 f8 74 cmp $0x74,%eax
10c390: 75 91 jne 10c323 <rtems_aio_handle+0x127><== NEVER TAKEN
10c392: 83 ec 0c sub $0xc,%esp
10c395: 57 push %edi
10c396: e8 21 25 00 00 call 10e8bc <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
10c39b: 59 pop %ecx
10c39c: ff 75 b4 pushl -0x4c(%ebp)
10c39f: e8 dc 08 00 00 call 10cc80 <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
10c3a4: 89 1c 24 mov %ebx,(%esp)
10c3a7: e8 90 05 00 00 call 10c93c <pthread_cond_destroy>
free (r_chain);
10c3ac: 89 3c 24 mov %edi,(%esp)
10c3af: e8 80 c7 ff ff call 108b34 <free>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c3b4: 8b 3d 54 aa 12 00 mov 0x12aa54,%edi
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
10c3ba: 83 c4 10 add $0x10,%esp
10c3bd: 81 ff 58 aa 12 00 cmp $0x12aa58,%edi
10c3c3: 74 2b je 10c3f0 <rtems_aio_handle+0x1f4>
}
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
AIO_printf ("Work on idle\n");
--aio_request_queue.idle_threads;
10c3c5: ff 0d 68 aa 12 00 decl 0x12aa68
++aio_request_queue.active_threads;
10c3cb: ff 05 64 aa 12 00 incl 0x12aa64
10c3d1: 83 ec 0c sub $0xc,%esp
10c3d4: 57 push %edi
10c3d5: e8 e2 24 00 00 call 10e8bc <_Chain_Extract>
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = (rtems_aio_request_chain *) node;
rtems_aio_move_to_work (r_chain);
10c3da: 89 3c 24 mov %edi,(%esp)
10c3dd: e8 de fd ff ff call 10c1c0 <rtems_aio_move_to_work>
10c3e2: 83 c4 10 add $0x10,%esp
10c3e5: 8d 47 1c lea 0x1c(%edi),%eax
10c3e8: 89 45 b4 mov %eax,-0x4c(%ebp)
10c3eb: e9 33 ff ff ff jmp 10c323 <rtems_aio_handle+0x127>
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
10c3f0: ff 05 68 aa 12 00 incl 0x12aa68
--aio_request_queue.active_threads;
10c3f6: ff 0d 64 aa 12 00 decl 0x12aa64
clock_gettime (CLOCK_REALTIME, &timeout);
10c3fc: 52 push %edx
10c3fd: 52 push %edx
10c3fe: 8d 45 dc lea -0x24(%ebp),%eax
10c401: 50 push %eax
10c402: 6a 01 push $0x1
10c404: e8 c7 04 00 00 call 10c8d0 <clock_gettime>
timeout.tv_sec += 3;
10c409: 83 45 dc 03 addl $0x3,-0x24(%ebp)
timeout.tv_nsec = 0;
10c40d: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
result = pthread_cond_timedwait (&aio_request_queue.new_req,
10c414: 83 c4 0c add $0xc,%esp
10c417: 8d 55 dc lea -0x24(%ebp),%edx
10c41a: 52 push %edx
10c41b: 68 00 aa 12 00 push $0x12aa00
10c420: 68 04 aa 12 00 push $0x12aa04
10c425: e8 16 07 00 00 call 10cb40 <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
10c42a: 83 c4 10 add $0x10,%esp
10c42d: 83 f8 74 cmp $0x74,%eax
10c430: 0f 84 02 ff ff ff je 10c338 <rtems_aio_handle+0x13c><== ALWAYS TAKEN
10c436: 8b 3d 54 aa 12 00 mov 0x12aa54,%edi <== NOT EXECUTED
10c43c: eb 87 jmp 10c3c5 <rtems_aio_handle+0x1c9><== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
10c43e: 8b 73 14 mov 0x14(%ebx),%esi <== NOT EXECUTED
10c441: e9 45 fe ff ff jmp 10c28b <rtems_aio_handle+0x8f> <== NOT EXECUTED
0010bfd8 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
10bfd8: 55 push %ebp
10bfd9: 89 e5 mov %esp,%ebp
10bfdb: 53 push %ebx
10bfdc: 83 ec 10 sub $0x10,%esp
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
10bfdf: 68 08 aa 12 00 push $0x12aa08
10bfe4: e8 a3 10 00 00 call 10d08c <pthread_attr_init>
10bfe9: 89 c3 mov %eax,%ebx
if (result != 0)
10bfeb: 83 c4 10 add $0x10,%esp
10bfee: 85 c0 test %eax,%eax
10bff0: 74 0a je 10bffc <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;
}
10bff2: 89 d8 mov %ebx,%eax <== NOT EXECUTED
10bff4: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10bff7: c9 leave <== NOT EXECUTED
10bff8: c3 ret <== NOT EXECUTED
10bff9: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
result = pthread_attr_init (&aio_request_queue.attr);
if (result != 0)
return result;
result =
10bffc: 83 ec 08 sub $0x8,%esp
10bfff: 6a 00 push $0x0
10c001: 68 08 aa 12 00 push $0x12aa08
10c006: e8 ad 10 00 00 call 10d0b8 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
10c00b: 83 c4 10 add $0x10,%esp
10c00e: 85 c0 test %eax,%eax
10c010: 0f 85 96 00 00 00 jne 10c0ac <rtems_aio_init+0xd4> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
10c016: 83 ec 08 sub $0x8,%esp
10c019: 6a 00 push $0x0
10c01b: 68 00 aa 12 00 push $0x12aa00
10c020: e8 7b 0d 00 00 call 10cda0 <pthread_mutex_init>
if (result != 0)
10c025: 83 c4 10 add $0x10,%esp
10c028: 85 c0 test %eax,%eax
10c02a: 0f 85 b8 00 00 00 jne 10c0e8 <rtems_aio_init+0x110> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
10c030: 83 ec 08 sub $0x8,%esp
10c033: 6a 00 push $0x0
10c035: 68 04 aa 12 00 push $0x12aa04
10c03a: e8 c9 09 00 00 call 10ca08 <pthread_cond_init>
10c03f: 89 c3 mov %eax,%ebx
if (result != 0) {
10c041: 83 c4 10 add $0x10,%esp
10c044: 85 c0 test %eax,%eax
10c046: 75 7c jne 10c0c4 <rtems_aio_init+0xec> <== NEVER TAKEN
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c048: c7 05 48 aa 12 00 4c movl $0x12aa4c,0x12aa48
10c04f: aa 12 00
head->previous = NULL;
10c052: c7 05 4c aa 12 00 00 movl $0x0,0x12aa4c
10c059: 00 00 00
tail->previous = head;
10c05c: c7 05 50 aa 12 00 48 movl $0x12aa48,0x12aa50
10c063: aa 12 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
10c066: c7 05 54 aa 12 00 58 movl $0x12aa58,0x12aa54
10c06d: aa 12 00
head->previous = NULL;
10c070: c7 05 58 aa 12 00 00 movl $0x0,0x12aa58
10c077: 00 00 00
tail->previous = head;
10c07a: c7 05 5c aa 12 00 54 movl $0x12aa54,0x12aa5c
10c081: aa 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;
10c084: c7 05 64 aa 12 00 00 movl $0x0,0x12aa64
10c08b: 00 00 00
aio_request_queue.idle_threads = 0;
10c08e: c7 05 68 aa 12 00 00 movl $0x0,0x12aa68
10c095: 00 00 00
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
10c098: c7 05 60 aa 12 00 0b movl $0xb00b,0x12aa60
10c09f: b0 00 00
return result;
}
10c0a2: 89 d8 mov %ebx,%eax
10c0a4: 8b 5d fc mov -0x4(%ebp),%ebx
10c0a7: c9 leave
10c0a8: c3 ret
10c0a9: 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);
10c0ac: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0af: 68 08 aa 12 00 push $0x12aa08 <== NOT EXECUTED
10c0b4: e8 af 0f 00 00 call 10d068 <pthread_attr_destroy> <== NOT EXECUTED
10c0b9: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0bc: e9 55 ff ff ff jmp 10c016 <rtems_aio_init+0x3e> <== NOT EXECUTED
10c0c1: 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);
10c0c4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0c7: 68 00 aa 12 00 push $0x12aa00 <== NOT EXECUTED
10c0cc: e8 af 0b 00 00 call 10cc80 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
10c0d1: c7 04 24 08 aa 12 00 movl $0x12aa08,(%esp) <== NOT EXECUTED
10c0d8: e8 8b 0f 00 00 call 10d068 <pthread_attr_destroy> <== NOT EXECUTED
10c0dd: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0e0: e9 63 ff ff ff jmp 10c048 <rtems_aio_init+0x70> <== NOT EXECUTED
10c0e5: 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);
10c0e8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED
10c0eb: 68 08 aa 12 00 push $0x12aa08 <== NOT EXECUTED
10c0f0: e8 73 0f 00 00 call 10d068 <pthread_attr_destroy> <== NOT EXECUTED
10c0f5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED
10c0f8: e9 33 ff ff ff jmp 10c030 <rtems_aio_init+0x58> <== NOT EXECUTED
0010c448 <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
10c448: 55 push %ebp
10c449: 89 e5 mov %esp,%ebp
10c44b: 56 push %esi
10c44c: 53 push %ebx
10c44d: 8b 55 08 mov 0x8(%ebp),%edx
10c450: 8b 75 0c mov 0xc(%ebp),%esi
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c453: 8b 02 mov (%edx),%eax
10c455: 8d 4a 04 lea 0x4(%edx),%ecx
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
10c458: 39 c8 cmp %ecx,%eax
10c45a: 74 27 je 10c483 <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 &&
10c45c: 8b 56 14 mov 0x14(%esi),%edx
10c45f: 8b 5a 14 mov 0x14(%edx),%ebx
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;
10c462: 8b 50 14 mov 0x14(%eax),%edx
while (req->aiocbp->aio_reqprio > prio &&
10c465: 39 5a 14 cmp %ebx,0x14(%edx)
10c468: 7c 06 jl 10c470 <rtems_aio_insert_prio+0x28><== NEVER TAKEN
10c46a: eb 0e jmp 10c47a <rtems_aio_insert_prio+0x32>
10c46c: 39 c8 cmp %ecx,%eax <== NOT EXECUTED
10c46e: 74 1c je 10c48c <rtems_aio_insert_prio+0x44><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c470: 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;
10c472: 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 &&
10c475: 39 5a 14 cmp %ebx,0x14(%edx) <== NOT EXECUTED
10c478: 7c f2 jl 10c46c <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 );
10c47a: 89 75 0c mov %esi,0xc(%ebp)
10c47d: 8b 40 04 mov 0x4(%eax),%eax
10c480: 89 45 08 mov %eax,0x8(%ebp)
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
10c483: 5b pop %ebx
10c484: 5e pop %esi
10c485: c9 leave
10c486: e9 6d 24 00 00 jmp 10e8f8 <_Chain_Insert>
10c48b: 90 nop
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c48c: 89 c8 mov %ecx,%eax <== NOT EXECUTED
10c48e: eb ea jmp 10c47a <rtems_aio_insert_prio+0x32><== NOT EXECUTED
0010c1c0 <rtems_aio_move_to_work>:
* NONE
*/
void
rtems_aio_move_to_work (rtems_aio_request_chain *r_chain)
{
10c1c0: 55 push %ebp
10c1c1: 89 e5 mov %esp,%ebp
10c1c3: 83 ec 08 sub $0x8,%esp
10c1c6: 8b 4d 08 mov 0x8(%ebp),%ecx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c1c9: a1 48 aa 12 00 mov 0x12aa48,%eax
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
10c1ce: 8b 51 14 mov 0x14(%ecx),%edx
10c1d1: 39 50 14 cmp %edx,0x14(%eax)
10c1d4: 7c 09 jl 10c1df <rtems_aio_move_to_work+0x1f><== ALWAYS TAKEN
10c1d6: eb 13 jmp 10c1eb <rtems_aio_move_to_work+0x2b><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c1d8: 8b 00 mov (%eax),%eax
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
10c1da: 39 50 14 cmp %edx,0x14(%eax)
10c1dd: 7d 0c jge 10c1eb <rtems_aio_move_to_work+0x2b>
10c1df: 3d 4c aa 12 00 cmp $0x12aa4c,%eax
10c1e4: 75 f2 jne 10c1d8 <rtems_aio_move_to_work+0x18><== ALWAYS TAKEN
10c1e6: b8 4c aa 12 00 mov $0x12aa4c,%eax <== NOT EXECUTED
10c1eb: 83 ec 08 sub $0x8,%esp
10c1ee: 51 push %ecx
10c1ef: ff 70 04 pushl 0x4(%eax)
10c1f2: e8 01 27 00 00 call 10e8f8 <_Chain_Insert>
10c1f7: 83 c4 10 add $0x10,%esp
node = rtems_chain_next (node);
temp = (rtems_aio_request_chain *) node;
}
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
}
10c1fa: c9 leave
10c1fb: c3 ret
0010c490 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
10c490: 55 push %ebp
10c491: 89 e5 mov %esp,%ebp
10c493: 57 push %edi
10c494: 56 push %esi
10c495: 53 push %ebx
10c496: 83 ec 0c sub $0xc,%esp
10c499: 8b 7d 08 mov 0x8(%ebp),%edi
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c49c: 8b 5f 08 mov 0x8(%edi),%ebx
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10c49f: 83 c7 0c add $0xc,%edi
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
10c4a2: 39 fb cmp %edi,%ebx
10c4a4: 75 04 jne 10c4aa <rtems_aio_remove_fd+0x1a><== ALWAYS TAKEN
10c4a6: eb 2d jmp 10c4d5 <rtems_aio_remove_fd+0x45><== NOT EXECUTED
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
10c4a8: 89 f3 mov %esi,%ebx
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10c4aa: 83 ec 0c sub $0xc,%esp
10c4ad: 53 push %ebx
10c4ae: e8 09 24 00 00 call 10e8bc <_Chain_Extract>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c4b3: 8b 33 mov (%ebx),%esi
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
10c4b5: 8b 43 14 mov 0x14(%ebx),%eax
10c4b8: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax)
req->aiocbp->return_value = -1;
10c4bf: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax)
free (req);
10c4c6: 89 1c 24 mov %ebx,(%esp)
10c4c9: e8 66 c6 ff ff call 108b34 <free>
rtems_chain_control *chain;
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
10c4ce: 83 c4 10 add $0x10,%esp
10c4d1: 39 fe cmp %edi,%esi
10c4d3: 75 d3 jne 10c4a8 <rtems_aio_remove_fd+0x18>
node = rtems_chain_next (node);
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
free (req);
}
}
10c4d5: 8d 65 f4 lea -0xc(%ebp),%esp
10c4d8: 5b pop %ebx
10c4d9: 5e pop %esi
10c4da: 5f pop %edi
10c4db: c9 leave
10c4dc: c3 ret
0010c4e0 <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)
{
10c4e0: 55 push %ebp
10c4e1: 89 e5 mov %esp,%ebp
10c4e3: 53 push %ebx
10c4e4: 83 ec 04 sub $0x4,%esp
10c4e7: 8b 55 08 mov 0x8(%ebp),%edx
10c4ea: 8b 4d 0c mov 0xc(%ebp),%ecx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c4ed: 8b 02 mov (%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 );
10c4ef: 83 c2 04 add $0x4,%edx
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
10c4f2: 39 d0 cmp %edx,%eax
10c4f4: 74 4e je 10c544 <rtems_aio_remove_req+0x64>
return AIO_ALLDONE;
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
10c4f6: 89 c3 mov %eax,%ebx
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
10c4f8: 39 48 14 cmp %ecx,0x14(%eax)
10c4fb: 75 0a jne 10c507 <rtems_aio_remove_req+0x27><== NEVER TAKEN
10c4fd: eb 19 jmp 10c518 <rtems_aio_remove_req+0x38>
10c4ff: 90 nop
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
10c500: 89 c3 mov %eax,%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) {
10c502: 39 48 14 cmp %ecx,0x14(%eax) <== NOT EXECUTED
10c505: 74 11 je 10c518 <rtems_aio_remove_req+0x38><== NOT EXECUTED
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c507: 8b 00 mov (%eax),%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) {
10c509: 39 d0 cmp %edx,%eax <== NOT EXECUTED
10c50b: 75 f3 jne 10c500 <rtems_aio_remove_req+0x20><== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
10c50d: b8 01 00 00 00 mov $0x1,%eax <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10c512: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10c515: c9 leave <== NOT EXECUTED
10c516: c3 ret <== NOT EXECUTED
10c517: 90 nop <== NOT EXECUTED
10c518: 83 ec 0c sub $0xc,%esp
10c51b: 50 push %eax
10c51c: e8 9b 23 00 00 call 10e8bc <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
10c521: 8b 43 14 mov 0x14(%ebx),%eax
10c524: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax)
current->aiocbp->return_value = -1;
10c52b: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax)
free (current);
10c532: 89 1c 24 mov %ebx,(%esp)
10c535: e8 fa c5 ff ff call 108b34 <free>
}
return AIO_CANCELED;
10c53a: 83 c4 10 add $0x10,%esp
10c53d: 31 c0 xor %eax,%eax
}
10c53f: 8b 5d fc mov -0x4(%ebp),%ebx
10c542: c9 leave
10c543: c3 ret
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
10c544: b8 02 00 00 00 mov $0x2,%eax
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
10c549: 8b 5d fc mov -0x4(%ebp),%ebx
10c54c: c9 leave
10c54d: c3 ret
0010c100 <rtems_aio_search_fd>:
*
*/
rtems_aio_request_chain *
rtems_aio_search_fd (rtems_chain_control *chain, int fildes, int create)
{
10c100: 55 push %ebp
10c101: 89 e5 mov %esp,%ebp
10c103: 57 push %edi
10c104: 56 push %esi
10c105: 53 push %ebx
10c106: 83 ec 1c sub $0x1c,%esp
10c109: 8b 75 08 mov 0x8(%ebp),%esi
10c10c: 8b 5d 0c mov 0xc(%ebp),%ebx
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c10f: 8b 06 mov (%esi),%eax
rtems_chain_node *node;
node = rtems_chain_first (chain);
r_chain = (rtems_aio_request_chain *) node;
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
10c111: 8b 50 14 mov 0x14(%eax),%edx
10c114: 39 d3 cmp %edx,%ebx
10c116: 7e 28 jle 10c140 <rtems_aio_search_fd+0x40>
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
10c118: 8d 4e 04 lea 0x4(%esi),%ecx
10c11b: eb 0c jmp 10c129 <rtems_aio_search_fd+0x29>
10c11d: 8d 76 00 lea 0x0(%esi),%esi
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c120: 8b 00 mov (%eax),%eax
rtems_chain_node *node;
node = rtems_chain_first (chain);
r_chain = (rtems_aio_request_chain *) node;
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
10c122: 8b 50 14 mov 0x14(%eax),%edx
10c125: 39 da cmp %ebx,%edx
10c127: 7d 17 jge 10c140 <rtems_aio_search_fd+0x40>
10c129: 39 c8 cmp %ecx,%eax
10c12b: 75 f3 jne 10c120 <rtems_aio_search_fd+0x20>
10c12d: 89 c7 mov %eax,%edi
}
if (r_chain->fildes == fildes)
r_chain->new_fd = 0;
else {
if (create == 0)
10c12f: 8b 45 10 mov 0x10(%ebp),%eax
10c132: 85 c0 test %eax,%eax
10c134: 75 1f jne 10c155 <rtems_aio_search_fd+0x55>
r_chain = NULL;
10c136: 31 c0 xor %eax,%eax
r_chain->new_fd = 1;
r_chain->fildes = fildes;
}
}
return r_chain;
}
10c138: 8d 65 f4 lea -0xc(%ebp),%esp
10c13b: 5b pop %ebx
10c13c: 5e pop %esi
10c13d: 5f pop %edi
10c13e: c9 leave
10c13f: c3 ret
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
10c140: 89 c7 mov %eax,%edi
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
node = rtems_chain_next (node);
r_chain = (rtems_aio_request_chain *) node;
}
if (r_chain->fildes == fildes)
10c142: 39 d3 cmp %edx,%ebx
10c144: 75 e9 jne 10c12f <rtems_aio_search_fd+0x2f>
r_chain->new_fd = 0;
10c146: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
r_chain->new_fd = 1;
r_chain->fildes = fildes;
}
}
return r_chain;
}
10c14d: 8d 65 f4 lea -0xc(%ebp),%esp
10c150: 5b pop %ebx
10c151: 5e pop %esi
10c152: 5f pop %edi
10c153: c9 leave
10c154: c3 ret
r_chain->new_fd = 0;
else {
if (create == 0)
r_chain = NULL;
else {
r_chain = malloc (sizeof (rtems_aio_request_chain));
10c155: 83 ec 0c sub $0xc,%esp
10c158: 6a 24 push $0x24
10c15a: e8 e9 ce ff ff call 109048 <malloc>
10c15f: 89 c2 mov %eax,%edx
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 );
10c161: 8d 4a 0c lea 0xc(%edx),%ecx
10c164: 89 4a 08 mov %ecx,0x8(%edx)
head->next = tail;
head->previous = NULL;
10c167: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx)
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
10c16e: 8d 4a 08 lea 0x8(%edx),%ecx
10c171: 89 4a 10 mov %ecx,0x10(%edx)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
10c174: 8d 4e 04 lea 0x4(%esi),%ecx
rtems_chain_initialize_empty (&r_chain->perfd);
if (rtems_chain_is_empty (chain))
10c177: 83 c4 10 add $0x10,%esp
10c17a: 39 0e cmp %ecx,(%esi)
10c17c: 74 27 je 10c1a5 <rtems_aio_search_fd+0xa5>
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
10c17e: 83 ec 08 sub $0x8,%esp
10c181: 52 push %edx
10c182: ff 77 04 pushl 0x4(%edi)
10c185: 89 45 e4 mov %eax,-0x1c(%ebp)
10c188: 89 55 e0 mov %edx,-0x20(%ebp)
10c18b: e8 68 27 00 00 call 10e8f8 <_Chain_Insert>
10c190: 83 c4 10 add $0x10,%esp
10c193: 8b 55 e0 mov -0x20(%ebp),%edx
10c196: 8b 45 e4 mov -0x1c(%ebp),%eax
rtems_chain_prepend (chain, &r_chain->next_fd);
else
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
r_chain->new_fd = 1;
10c199: c7 42 18 01 00 00 00 movl $0x1,0x18(%edx)
r_chain->fildes = fildes;
10c1a0: 89 5a 14 mov %ebx,0x14(%edx)
10c1a3: eb a8 jmp 10c14d <rtems_aio_search_fd+0x4d>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
10c1a5: 83 ec 08 sub $0x8,%esp
10c1a8: 52 push %edx
10c1a9: 56 push %esi
10c1aa: 89 45 e4 mov %eax,-0x1c(%ebp)
10c1ad: 89 55 e0 mov %edx,-0x20(%ebp)
10c1b0: e8 43 27 00 00 call 10e8f8 <_Chain_Insert>
10c1b5: 83 c4 10 add $0x10,%esp
10c1b8: 8b 45 e4 mov -0x1c(%ebp),%eax
10c1bb: 8b 55 e0 mov -0x20(%ebp),%edx
10c1be: eb d9 jmp 10c199 <rtems_aio_search_fd+0x99>
001136b4 <rtems_barrier_create>:
rtems_name name,
rtems_attribute attribute_set,
uint32_t maximum_waiters,
rtems_id *id
)
{
1136b4: 55 push %ebp
1136b5: 89 e5 mov %esp,%ebp
1136b7: 57 push %edi
1136b8: 56 push %esi
1136b9: 53 push %ebx
1136ba: 83 ec 2c sub $0x2c,%esp
1136bd: 8b 5d 08 mov 0x8(%ebp),%ebx
1136c0: 8b 7d 0c mov 0xc(%ebp),%edi
1136c3: 8b 45 10 mov 0x10(%ebp),%eax
1136c6: 8b 75 14 mov 0x14(%ebp),%esi
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
1136c9: 85 db test %ebx,%ebx
1136cb: 0f 84 87 00 00 00 je 113758 <rtems_barrier_create+0xa4>
return RTEMS_INVALID_NAME;
if ( !id )
1136d1: 85 f6 test %esi,%esi
1136d3: 0f 84 bf 00 00 00 je 113798 <rtems_barrier_create+0xe4><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
1136d9: f7 c7 10 00 00 00 test $0x10,%edi
1136df: 0f 84 83 00 00 00 je 113768 <rtems_barrier_create+0xb4>
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
1136e5: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp)
if ( maximum_waiters == 0 )
1136ec: 85 c0 test %eax,%eax
1136ee: 0f 84 80 00 00 00 je 113774 <rtems_barrier_create+0xc0><== NEVER TAKEN
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
the_attributes.maximum_count = maximum_waiters;
1136f4: 89 45 e4 mov %eax,-0x1c(%ebp)
1136f7: a1 90 a7 12 00 mov 0x12a790,%eax
1136fc: 40 inc %eax
1136fd: a3 90 a7 12 00 mov %eax,0x12a790
* 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 );
113702: 83 ec 0c sub $0xc,%esp
113705: 68 80 b1 12 00 push $0x12b180
11370a: e8 51 b0 ff ff call 10e760 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
11370f: 83 c4 10 add $0x10,%esp
113712: 85 c0 test %eax,%eax
113714: 74 6e je 113784 <rtems_barrier_create+0xd0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_barrier->attribute_set = attribute_set;
113716: 89 78 10 mov %edi,0x10(%eax)
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
113719: 83 ec 08 sub $0x8,%esp
11371c: 8d 55 e0 lea -0x20(%ebp),%edx
11371f: 52 push %edx
113720: 8d 50 14 lea 0x14(%eax),%edx
113723: 52 push %edx
113724: 89 45 d4 mov %eax,-0x2c(%ebp)
113727: e8 c0 07 00 00 call 113eec <_CORE_barrier_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
11372c: 8b 45 d4 mov -0x2c(%ebp),%eax
11372f: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
113732: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
113735: 8b 0d 9c b1 12 00 mov 0x12b19c,%ecx
11373b: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
11373e: 89 58 0c mov %ebx,0xc(%eax)
&_Barrier_Information,
&the_barrier->Object,
(Objects_Name) name
);
*id = the_barrier->Object.id;
113741: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
113743: e8 74 c0 ff ff call 10f7bc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
113748: 83 c4 10 add $0x10,%esp
11374b: 31 c0 xor %eax,%eax
}
11374d: 8d 65 f4 lea -0xc(%ebp),%esp
113750: 5b pop %ebx
113751: 5e pop %esi
113752: 5f pop %edi
113753: c9 leave
113754: c3 ret
113755: 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;
113758: b8 03 00 00 00 mov $0x3,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11375d: 8d 65 f4 lea -0xc(%ebp),%esp
113760: 5b pop %ebx
113761: 5e pop %esi
113762: 5f pop %edi
113763: c9 leave
113764: c3 ret
113765: 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;
113768: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp)
11376f: eb 83 jmp 1136f4 <rtems_barrier_create+0x40>
113771: 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;
113774: b8 0a 00 00 00 mov $0xa,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113779: 8d 65 f4 lea -0xc(%ebp),%esp
11377c: 5b pop %ebx
11377d: 5e pop %esi
11377e: 5f pop %edi
11377f: c9 leave
113780: c3 ret
113781: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
113784: e8 33 c0 ff ff call 10f7bc <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
113789: b8 05 00 00 00 mov $0x5,%eax
*id = the_barrier->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
11378e: 8d 65 f4 lea -0xc(%ebp),%esp
113791: 5b pop %ebx
113792: 5e pop %esi
113793: 5f pop %edi
113794: c9 leave
113795: c3 ret
113796: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
113798: b8 09 00 00 00 mov $0x9,%eax
11379d: eb ae jmp 11374d <rtems_barrier_create+0x99>
0010c140 <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
10c140: 55 push %ebp
10c141: 89 e5 mov %esp,%ebp
10c143: 56 push %esi
10c144: 53 push %ebx
10c145: 8b 5d 10 mov 0x10(%ebp),%ebx
10c148: 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 );
10c14b: 83 ec 08 sub $0x8,%esp
10c14e: ff 75 0c pushl 0xc(%ebp)
10c151: ff 75 08 pushl 0x8(%ebp)
10c154: e8 eb 04 00 00 call 10c644 <_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 ) {
10c159: 83 c4 10 add $0x10,%esp
10c15c: 84 c0 test %al,%al
10c15e: 75 0c jne 10c16c <rtems_chain_append_with_notification+0x2c><== ALWAYS TAKEN
sc = rtems_event_send( task, events );
}
return sc;
}
10c160: 31 c0 xor %eax,%eax
10c162: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
10c165: 5b pop %ebx <== NOT EXECUTED
10c166: 5e pop %esi <== NOT EXECUTED
10c167: c9 leave <== NOT EXECUTED
10c168: c3 ret <== NOT EXECUTED
10c169: 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 );
10c16c: 89 75 0c mov %esi,0xc(%ebp)
10c16f: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c172: 8d 65 f8 lea -0x8(%ebp),%esp
10c175: 5b pop %ebx
10c176: 5e pop %esi
10c177: 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 );
10c178: e9 af f5 ff ff jmp 10b72c <rtems_event_send>
0010c180 <rtems_chain_get_with_notification>:
rtems_chain_control *chain,
rtems_id task,
rtems_event_set events,
rtems_chain_node **node
)
{
10c180: 55 push %ebp
10c181: 89 e5 mov %esp,%ebp
10c183: 56 push %esi
10c184: 53 push %ebx
10c185: 8b 5d 0c mov 0xc(%ebp),%ebx
10c188: 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 );
10c18b: 83 ec 08 sub $0x8,%esp
10c18e: ff 75 14 pushl 0x14(%ebp)
10c191: ff 75 08 pushl 0x8(%ebp)
10c194: e8 13 05 00 00 call 10c6ac <_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 ) {
10c199: 83 c4 10 add $0x10,%esp
10c19c: 84 c0 test %al,%al
10c19e: 75 0c jne 10c1ac <rtems_chain_get_with_notification+0x2c>
sc = rtems_event_send( task, events );
}
return sc;
}
10c1a0: 31 c0 xor %eax,%eax
10c1a2: 8d 65 f8 lea -0x8(%ebp),%esp
10c1a5: 5b pop %ebx
10c1a6: 5e pop %esi
10c1a7: c9 leave
10c1a8: c3 ret
10c1a9: 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 );
10c1ac: 89 75 0c mov %esi,0xc(%ebp)
10c1af: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c1b2: 8d 65 f8 lea -0x8(%ebp),%esp
10c1b5: 5b pop %ebx
10c1b6: 5e pop %esi
10c1b7: 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 );
10c1b8: e9 6f f5 ff ff jmp 10b72c <rtems_event_send>
0010c1c0 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
10c1c0: 55 push %ebp
10c1c1: 89 e5 mov %esp,%ebp
10c1c3: 57 push %edi
10c1c4: 56 push %esi
10c1c5: 53 push %ebx
10c1c6: 83 ec 1c sub $0x1c,%esp
10c1c9: 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(
10c1cc: 8d 7d e4 lea -0x1c(%ebp),%edi
10c1cf: 90 nop
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
10c1d0: 83 ec 0c sub $0xc,%esp
10c1d3: 56 push %esi
10c1d4: e8 0f 05 00 00 call 10c6e8 <_Chain_Get>
10c1d9: 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
10c1db: 83 c4 10 add $0x10,%esp
10c1de: 85 c0 test %eax,%eax
10c1e0: 75 22 jne 10c204 <rtems_chain_get_with_wait+0x44>
) {
rtems_event_set out;
sc = rtems_event_receive(
10c1e2: 57 push %edi
10c1e3: ff 75 10 pushl 0x10(%ebp)
10c1e6: 6a 00 push $0x0
10c1e8: ff 75 0c pushl 0xc(%ebp)
10c1eb: e8 b4 f3 ff ff call 10b5a4 <rtems_event_receive>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
10c1f0: 83 c4 10 add $0x10,%esp
10c1f3: 85 c0 test %eax,%eax
10c1f5: 74 d9 je 10c1d0 <rtems_chain_get_with_wait+0x10><== NEVER TAKEN
timeout,
&out
);
}
*node_ptr = node;
10c1f7: 8b 55 14 mov 0x14(%ebp),%edx
10c1fa: 89 1a mov %ebx,(%edx)
return sc;
}
10c1fc: 8d 65 f4 lea -0xc(%ebp),%esp
10c1ff: 5b pop %ebx
10c200: 5e pop %esi
10c201: 5f pop %edi
10c202: c9 leave
10c203: c3 ret
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
10c204: 31 c0 xor %eax,%eax
timeout,
&out
);
}
*node_ptr = node;
10c206: 8b 55 14 mov 0x14(%ebp),%edx
10c209: 89 1a mov %ebx,(%edx)
return sc;
}
10c20b: 8d 65 f4 lea -0xc(%ebp),%esp
10c20e: 5b pop %ebx
10c20f: 5e pop %esi
10c210: 5f pop %edi
10c211: c9 leave
10c212: c3 ret
0010c214 <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
10c214: 55 push %ebp
10c215: 89 e5 mov %esp,%ebp
10c217: 56 push %esi
10c218: 53 push %ebx
10c219: 8b 5d 10 mov 0x10(%ebp),%ebx
10c21c: 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 );
10c21f: 83 ec 08 sub $0x8,%esp
10c222: ff 75 0c pushl 0xc(%ebp)
10c225: ff 75 08 pushl 0x8(%ebp)
10c228: e8 ff 04 00 00 call 10c72c <_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) {
10c22d: 83 c4 10 add $0x10,%esp
10c230: 84 c0 test %al,%al
10c232: 75 0c jne 10c240 <rtems_chain_prepend_with_notification+0x2c><== ALWAYS TAKEN
sc = rtems_event_send( task, events );
}
return sc;
}
10c234: 31 c0 xor %eax,%eax
10c236: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED
10c239: 5b pop %ebx <== NOT EXECUTED
10c23a: 5e pop %esi <== NOT EXECUTED
10c23b: c9 leave <== NOT EXECUTED
10c23c: c3 ret <== NOT EXECUTED
10c23d: 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 );
10c240: 89 75 0c mov %esi,0xc(%ebp)
10c243: 89 5d 08 mov %ebx,0x8(%ebp)
}
return sc;
}
10c246: 8d 65 f8 lea -0x8(%ebp),%esp
10c249: 5b pop %ebx
10c24a: 5e pop %esi
10c24b: 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 );
10c24c: e9 db f4 ff ff jmp 10b72c <rtems_event_send>
00115a60 <rtems_clock_get>:
rtems_status_code rtems_clock_get(
rtems_clock_get_options option,
void *time_buffer
)
{
115a60: 55 push %ebp
115a61: 89 e5 mov %esp,%ebp
115a63: 53 push %ebx
115a64: 83 ec 04 sub $0x4,%esp
115a67: 8b 45 08 mov 0x8(%ebp),%eax
115a6a: 8b 5d 0c mov 0xc(%ebp),%ebx
if ( !time_buffer )
115a6d: 85 db test %ebx,%ebx
115a6f: 74 3b je 115aac <rtems_clock_get+0x4c>
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
115a71: 85 c0 test %eax,%eax
115a73: 74 2b je 115aa0 <rtems_clock_get+0x40>
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
115a75: 83 f8 01 cmp $0x1,%eax
115a78: 74 3e je 115ab8 <rtems_clock_get+0x58>
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
115a7a: 83 f8 02 cmp $0x2,%eax
115a7d: 74 45 je 115ac4 <rtems_clock_get+0x64>
*interval = rtems_clock_get_ticks_since_boot();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
115a7f: 83 f8 03 cmp $0x3,%eax
115a82: 74 4c je 115ad0 <rtems_clock_get+0x70>
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
115a84: 83 f8 04 cmp $0x4,%eax
115a87: 74 0b je 115a94 <rtems_clock_get+0x34>
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
115a89: b8 0a 00 00 00 mov $0xa,%eax
}
115a8e: 5a pop %edx
115a8f: 5b pop %ebx
115a90: c9 leave
115a91: c3 ret
115a92: 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 );
115a94: 89 5d 08 mov %ebx,0x8(%ebp)
return RTEMS_INVALID_NUMBER;
}
115a97: 59 pop %ecx
115a98: 5b pop %ebx
115a99: 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 );
115a9a: e9 41 01 00 00 jmp 115be0 <rtems_clock_get_tod_timeval>
115a9f: 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 );
115aa0: 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;
}
115aa3: 58 pop %eax
115aa4: 5b pop %ebx
115aa5: 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 );
115aa6: e9 81 00 00 00 jmp 115b2c <rtems_clock_get_tod>
115aab: 90 nop
rtems_clock_get_options option,
void *time_buffer
)
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
115aac: 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;
}
115ab1: 5a pop %edx
115ab2: 5b pop %ebx
115ab3: c9 leave
115ab4: c3 ret
115ab5: 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);
115ab8: 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;
}
115abb: 5b pop %ebx
115abc: 5b pop %ebx
115abd: 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);
115abe: e9 19 00 00 00 jmp 115adc <rtems_clock_get_seconds_since_epoch>
115ac3: 90 nop
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_since_boot();
115ac4: e8 57 00 00 00 call 115b20 <rtems_clock_get_ticks_since_boot>
115ac9: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
115acb: 31 c0 xor %eax,%eax
115acd: eb bf jmp 115a8e <rtems_clock_get+0x2e>
115acf: 90 nop
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_per_second();
115ad0: e8 37 00 00 00 call 115b0c <rtems_clock_get_ticks_per_second>
115ad5: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
115ad7: 31 c0 xor %eax,%eax
115ad9: eb b3 jmp 115a8e <rtems_clock_get+0x2e>
00115be0 <rtems_clock_get_tod_timeval>:
#include <rtems/score/watchdog.h>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
115be0: 55 push %ebp
115be1: 89 e5 mov %esp,%ebp
115be3: 56 push %esi
115be4: 53 push %ebx
115be5: 83 ec 10 sub $0x10,%esp
115be8: 8b 5d 08 mov 0x8(%ebp),%ebx
if ( !time )
115beb: 85 db test %ebx,%ebx
115bed: 74 51 je 115c40 <rtems_clock_get_tod_timeval+0x60>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
115bef: 80 3d 44 2a 14 00 00 cmpb $0x0,0x142a44
115bf6: 75 0c jne 115c04 <rtems_clock_get_tod_timeval+0x24>
return RTEMS_NOT_DEFINED;
115bf8: b8 0b 00 00 00 mov $0xb,%eax
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
}
115bfd: 8d 65 f8 lea -0x8(%ebp),%esp
115c00: 5b pop %ebx
115c01: 5e pop %esi
115c02: c9 leave
115c03: c3 ret
{
ISR_Level level;
struct timespec now;
suseconds_t useconds;
_ISR_Disable(level);
115c04: 9c pushf
115c05: fa cli
115c06: 5e pop %esi
_TOD_Get( &now );
115c07: 83 ec 0c sub $0xc,%esp
115c0a: 8d 45 f0 lea -0x10(%ebp),%eax
115c0d: 50 push %eax
115c0e: e8 1d 44 00 00 call 11a030 <_TOD_Get>
_ISR_Enable(level);
115c13: 56 push %esi
115c14: 9d popf
useconds = (suseconds_t)now.tv_nsec;
115c15: 8b 4d f4 mov -0xc(%ebp),%ecx
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
time->tv_sec = now.tv_sec;
115c18: 8b 45 f0 mov -0x10(%ebp),%eax
115c1b: 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;
115c1d: b8 d3 4d 62 10 mov $0x10624dd3,%eax
115c22: f7 e9 imul %ecx
115c24: 89 d0 mov %edx,%eax
115c26: c1 f8 06 sar $0x6,%eax
115c29: c1 f9 1f sar $0x1f,%ecx
115c2c: 29 c8 sub %ecx,%eax
115c2e: 89 43 04 mov %eax,0x4(%ebx)
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
115c31: 83 c4 10 add $0x10,%esp
115c34: 31 c0 xor %eax,%eax
}
115c36: 8d 65 f8 lea -0x8(%ebp),%esp
115c39: 5b pop %ebx
115c3a: 5e pop %esi
115c3b: c9 leave
115c3c: c3 ret
115c3d: 8d 76 00 lea 0x0(%esi),%esi
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
if ( !time )
return RTEMS_INVALID_ADDRESS;
115c40: b8 09 00 00 00 mov $0x9,%eax
115c45: eb b6 jmp 115bfd <rtems_clock_get_tod_timeval+0x1d>
0010b1d4 <rtems_clock_get_uptime>:
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
10b1d4: 55 push %ebp
10b1d5: 89 e5 mov %esp,%ebp
10b1d7: 83 ec 08 sub $0x8,%esp
10b1da: 8b 45 08 mov 0x8(%ebp),%eax
if ( !uptime )
10b1dd: 85 c0 test %eax,%eax
10b1df: 74 13 je 10b1f4 <rtems_clock_get_uptime+0x20>
return RTEMS_INVALID_ADDRESS;
_TOD_Get_uptime_as_timespec( uptime );
10b1e1: 83 ec 0c sub $0xc,%esp
10b1e4: 50 push %eax
10b1e5: e8 76 16 00 00 call 10c860 <_TOD_Get_uptime_as_timespec>
return RTEMS_SUCCESSFUL;
10b1ea: 83 c4 10 add $0x10,%esp
10b1ed: 31 c0 xor %eax,%eax
}
10b1ef: c9 leave
10b1f0: c3 ret
10b1f1: 8d 76 00 lea 0x0(%esi),%esi
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
if ( !uptime )
return RTEMS_INVALID_ADDRESS;
10b1f4: b8 09 00 00 00 mov $0x9,%eax
_TOD_Get_uptime_as_timespec( uptime );
return RTEMS_SUCCESSFUL;
}
10b1f9: c9 leave
10b1fa: c3 ret
0010c124 <rtems_clock_set>:
*/
rtems_status_code rtems_clock_set(
rtems_time_of_day *time_buffer
)
{
10c124: 55 push %ebp
10c125: 89 e5 mov %esp,%ebp
10c127: 53 push %ebx
10c128: 83 ec 14 sub $0x14,%esp
10c12b: 8b 5d 08 mov 0x8(%ebp),%ebx
struct timespec newtime;
if ( !time_buffer )
10c12e: 85 db test %ebx,%ebx
10c130: 74 66 je 10c198 <rtems_clock_set+0x74>
return RTEMS_INVALID_ADDRESS;
if ( _TOD_Validate( time_buffer ) ) {
10c132: 83 ec 0c sub $0xc,%esp
10c135: 53 push %ebx
10c136: e8 39 01 00 00 call 10c274 <_TOD_Validate>
10c13b: 83 c4 10 add $0x10,%esp
10c13e: 84 c0 test %al,%al
10c140: 75 0a jne 10c14c <rtems_clock_set+0x28>
_Thread_Disable_dispatch();
_TOD_Set( &newtime );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_CLOCK;
10c142: b8 14 00 00 00 mov $0x14,%eax
}
10c147: 8b 5d fc mov -0x4(%ebp),%ebx
10c14a: c9 leave
10c14b: c3 ret
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( _TOD_Validate( time_buffer ) ) {
newtime.tv_sec = _TOD_To_seconds( time_buffer );
10c14c: 83 ec 0c sub $0xc,%esp
10c14f: 53 push %ebx
10c150: e8 93 00 00 00 call 10c1e8 <_TOD_To_seconds>
10c155: 89 45 f0 mov %eax,-0x10(%ebp)
newtime.tv_nsec = time_buffer->ticks *
10c158: 8b 43 18 mov 0x18(%ebx),%eax
10c15b: 0f af 05 6c 62 12 00 imul 0x12626c,%eax
10c162: 8d 04 80 lea (%eax,%eax,4),%eax
10c165: 8d 04 80 lea (%eax,%eax,4),%eax
10c168: 8d 04 80 lea (%eax,%eax,4),%eax
10c16b: c1 e0 03 shl $0x3,%eax
10c16e: 89 45 f4 mov %eax,-0xc(%ebp)
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c171: a1 10 aa 12 00 mov 0x12aa10,%eax
10c176: 40 inc %eax
10c177: a3 10 aa 12 00 mov %eax,0x12aa10
rtems_configuration_get_nanoseconds_per_tick();
_Thread_Disable_dispatch();
_TOD_Set( &newtime );
10c17c: 8d 45 f0 lea -0x10(%ebp),%eax
10c17f: 89 04 24 mov %eax,(%esp)
10c182: e8 55 19 00 00 call 10dadc <_TOD_Set>
_Thread_Enable_dispatch();
10c187: e8 a4 2f 00 00 call 10f130 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c18c: 83 c4 10 add $0x10,%esp
10c18f: 31 c0 xor %eax,%eax
}
return RTEMS_INVALID_CLOCK;
}
10c191: 8b 5d fc mov -0x4(%ebp),%ebx
10c194: c9 leave
10c195: c3 ret
10c196: 66 90 xchg %ax,%ax
)
{
struct timespec newtime;
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
10c198: b8 09 00 00 00 mov $0x9,%eax
_TOD_Set( &newtime );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_INVALID_CLOCK;
}
10c19d: 8b 5d fc mov -0x4(%ebp),%ebx
10c1a0: c9 leave
10c1a1: 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 39 15 00 00 call 10c514 <_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 60 7e 12 00 push $0x127e60
10afe3: e8 e4 38 00 00 call 10e8cc <_Watchdog_Tickle>
_Watchdog_Tickle_ticks();
_Thread_Tickle_timeslice();
10afe8: e8 ab 33 00 00 call 10e398 <_Thread_Tickle_timeslice>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_context_switch_necessary( void )
{
return ( _Thread_Dispatch_necessary );
10afed: a0 44 83 12 00 mov 0x128344,%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 90 7d 12 00 mov 0x127d90,%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 2b 28 00 00 call 10d838 <_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 25 28 00 00 call 10d9d4 <_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 d9 27 00 00 call 10d9b0 <_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
0010d000 <rtems_extension_delete>:
#include <rtems/extension.h>
rtems_status_code rtems_extension_delete(
rtems_id id
)
{
10d000: 55 push %ebp
10d001: 89 e5 mov %esp,%ebp
10d003: 53 push %ebx
10d004: 83 ec 18 sub $0x18,%esp
Extension_Control *the_extension;
Objects_Locations location;
the_extension = _Extension_Get( id, &location );
10d007: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Extension_Control *)
_Objects_Get( &_Extension_Information, id, location );
10d00a: 50 push %eax
10d00b: ff 75 08 pushl 0x8(%ebp)
10d00e: 68 20 b6 12 00 push $0x12b620
10d013: e8 28 12 00 00 call 10e240 <_Objects_Get>
10d018: 89 c3 mov %eax,%ebx
switch ( location ) {
10d01a: 83 c4 10 add $0x10,%esp
10d01d: 8b 55 f4 mov -0xc(%ebp),%edx
10d020: 85 d2 test %edx,%edx
10d022: 75 38 jne 10d05c <rtems_extension_delete+0x5c>
case OBJECTS_LOCAL:
_User_extensions_Remove_set( &the_extension->Extension );
10d024: 83 ec 0c sub $0xc,%esp
10d027: 8d 40 10 lea 0x10(%eax),%eax
10d02a: 50 push %eax
10d02b: e8 d0 29 00 00 call 10fa00 <_User_extensions_Remove_set>
_Objects_Close( &_Extension_Information, &the_extension->Object );
10d030: 59 pop %ecx
10d031: 58 pop %eax
10d032: 53 push %ebx
10d033: 68 20 b6 12 00 push $0x12b620
10d038: e8 cb 0d 00 00 call 10de08 <_Objects_Close>
RTEMS_INLINE_ROUTINE void _Extension_Free (
Extension_Control *the_extension
)
{
_Objects_Free( &_Extension_Information, &the_extension->Object );
10d03d: 58 pop %eax
10d03e: 5a pop %edx
10d03f: 53 push %ebx
10d040: 68 20 b6 12 00 push $0x12b620
10d045: e8 b6 10 00 00 call 10e100 <_Objects_Free>
_Extension_Free( the_extension );
_Thread_Enable_dispatch();
10d04a: e8 69 1d 00 00 call 10edb8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d04f: 83 c4 10 add $0x10,%esp
10d052: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d054: 8b 5d fc mov -0x4(%ebp),%ebx
10d057: c9 leave
10d058: c3 ret
10d059: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d05c: b8 04 00 00 00 mov $0x4,%eax
}
10d061: 8b 5d fc mov -0x4(%ebp),%ebx
10d064: c9 leave
10d065: c3 ret
00112f54 <rtems_io_close>:
rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
112f54: 55 push %ebp
112f55: 89 e5 mov %esp,%ebp
112f57: 53 push %ebx
112f58: 83 ec 04 sub $0x4,%esp
112f5b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
112f5e: 39 05 00 88 12 00 cmp %eax,0x128800
112f64: 76 1a jbe 112f80 <rtems_io_close+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
112f66: 8d 14 40 lea (%eax,%eax,2),%edx
112f69: c1 e2 03 shl $0x3,%edx
112f6c: 03 15 04 88 12 00 add 0x128804,%edx
112f72: 8b 52 08 mov 0x8(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
112f75: 85 d2 test %edx,%edx
112f77: 74 13 je 112f8c <rtems_io_close+0x38>
}
112f79: 59 pop %ecx
112f7a: 5b pop %ebx
112f7b: 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;
112f7c: ff e2 jmp *%edx
112f7e: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
112f80: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].close_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
112f85: 5a pop %edx
112f86: 5b pop %ebx
112f87: c9 leave
112f88: c3 ret
112f89: 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;
112f8c: 31 c0 xor %eax,%eax
}
112f8e: 5a pop %edx
112f8f: 5b pop %ebx
112f90: c9 leave
112f91: c3 ret
00112f94 <rtems_io_control>:
rtems_status_code rtems_io_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
112f94: 55 push %ebp
112f95: 89 e5 mov %esp,%ebp
112f97: 53 push %ebx
112f98: 83 ec 04 sub $0x4,%esp
112f9b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
112f9e: 39 05 00 88 12 00 cmp %eax,0x128800
112fa4: 76 1a jbe 112fc0 <rtems_io_control+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
112fa6: 8d 14 40 lea (%eax,%eax,2),%edx
112fa9: c1 e2 03 shl $0x3,%edx
112fac: 03 15 04 88 12 00 add 0x128804,%edx
112fb2: 8b 52 14 mov 0x14(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
112fb5: 85 d2 test %edx,%edx
112fb7: 74 13 je 112fcc <rtems_io_control+0x38>
}
112fb9: 59 pop %ecx
112fba: 5b pop %ebx
112fbb: 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;
112fbc: ff e2 jmp *%edx
112fbe: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
112fc0: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].control_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
112fc5: 5a pop %edx
112fc6: 5b pop %ebx
112fc7: c9 leave
112fc8: c3 ret
112fc9: 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;
112fcc: 31 c0 xor %eax,%eax
}
112fce: 5a pop %edx
112fcf: 5b pop %ebx
112fd0: c9 leave
112fd1: c3 ret
00111044 <rtems_io_initialize>:
rtems_status_code rtems_io_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
111044: 55 push %ebp
111045: 89 e5 mov %esp,%ebp
111047: 53 push %ebx
111048: 83 ec 04 sub $0x4,%esp
11104b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
11104e: 39 05 00 88 12 00 cmp %eax,0x128800
111054: 76 1a jbe 111070 <rtems_io_initialize+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].initialization_entry;
111056: 8d 14 40 lea (%eax,%eax,2),%edx
111059: c1 e2 03 shl $0x3,%edx
11105c: 03 15 04 88 12 00 add 0x128804,%edx
111062: 8b 12 mov (%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
111064: 85 d2 test %edx,%edx
111066: 74 14 je 11107c <rtems_io_initialize+0x38>
}
111068: 59 pop %ecx
111069: 5b pop %ebx
11106a: 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;
11106b: ff e2 jmp *%edx
11106d: 8d 76 00 lea 0x0(%esi),%esi
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
111070: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].initialization_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
111075: 5a pop %edx
111076: 5b pop %ebx
111077: c9 leave
111078: c3 ret
111079: 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;
11107c: 31 c0 xor %eax,%eax
}
11107e: 5a pop %edx
11107f: 5b pop %ebx
111080: c9 leave
111081: c3 ret
00112fd4 <rtems_io_open>:
rtems_status_code rtems_io_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
112fd4: 55 push %ebp
112fd5: 89 e5 mov %esp,%ebp
112fd7: 53 push %ebx
112fd8: 83 ec 04 sub $0x4,%esp
112fdb: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
112fde: 39 05 00 88 12 00 cmp %eax,0x128800
112fe4: 76 1a jbe 113000 <rtems_io_open+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
112fe6: 8d 14 40 lea (%eax,%eax,2),%edx
112fe9: c1 e2 03 shl $0x3,%edx
112fec: 03 15 04 88 12 00 add 0x128804,%edx
112ff2: 8b 52 04 mov 0x4(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
112ff5: 85 d2 test %edx,%edx
112ff7: 74 13 je 11300c <rtems_io_open+0x38>
}
112ff9: 59 pop %ecx
112ffa: 5b pop %ebx
112ffb: 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;
112ffc: ff e2 jmp *%edx
112ffe: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113000: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].open_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113005: 5a pop %edx
113006: 5b pop %ebx
113007: c9 leave
113008: c3 ret
113009: 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;
11300c: 31 c0 xor %eax,%eax
}
11300e: 5a pop %edx
11300f: 5b pop %ebx
113010: c9 leave
113011: c3 ret
00113014 <rtems_io_read>:
rtems_status_code rtems_io_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113014: 55 push %ebp
113015: 89 e5 mov %esp,%ebp
113017: 53 push %ebx
113018: 83 ec 04 sub $0x4,%esp
11301b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
11301e: 39 05 00 88 12 00 cmp %eax,0x128800
113024: 76 1a jbe 113040 <rtems_io_read+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
113026: 8d 14 40 lea (%eax,%eax,2),%edx
113029: c1 e2 03 shl $0x3,%edx
11302c: 03 15 04 88 12 00 add 0x128804,%edx
113032: 8b 52 0c mov 0xc(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113035: 85 d2 test %edx,%edx
113037: 74 13 je 11304c <rtems_io_read+0x38>
}
113039: 59 pop %ecx
11303a: 5b pop %ebx
11303b: 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;
11303c: ff e2 jmp *%edx
11303e: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113040: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].read_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113045: 5a pop %edx
113046: 5b pop %ebx
113047: c9 leave
113048: c3 ret
113049: 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;
11304c: 31 c0 xor %eax,%eax
}
11304e: 5a pop %edx
11304f: 5b pop %ebx
113050: c9 leave
113051: c3 ret
0010cec0 <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
)
{
10cec0: 55 push %ebp
10cec1: 89 e5 mov %esp,%ebp
10cec3: 57 push %edi
10cec4: 56 push %esi
10cec5: 53 push %ebx
10cec6: 83 ec 0c sub $0xc,%esp
10cec9: 8b 5d 08 mov 0x8(%ebp),%ebx
10cecc: 8b 75 0c mov 0xc(%ebp),%esi
10cecf: 8b 55 10 mov 0x10(%ebp),%edx
rtems_device_major_number major_limit = _IO_Number_of_drivers;
10ced2: a1 00 c5 12 00 mov 0x12c500,%eax
if ( rtems_interrupt_is_in_progress() )
10ced7: 8b 0d 34 c0 12 00 mov 0x12c034,%ecx
10cedd: 85 c9 test %ecx,%ecx
10cedf: 0f 85 ab 00 00 00 jne 10cf90 <rtems_io_register_driver+0xd0>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
10cee5: 85 d2 test %edx,%edx
10cee7: 0f 84 e7 00 00 00 je 10cfd4 <rtems_io_register_driver+0x114>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
10ceed: 89 02 mov %eax,(%edx)
if ( driver_table == NULL )
10ceef: 85 f6 test %esi,%esi
10cef1: 0f 84 dd 00 00 00 je 10cfd4 <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;
10cef7: 8b 3e mov (%esi),%edi
10cef9: 85 ff test %edi,%edi
10cefb: 0f 84 c7 00 00 00 je 10cfc8 <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 )
10cf01: 39 d8 cmp %ebx,%eax
10cf03: 76 7b jbe 10cf80 <rtems_io_register_driver+0xc0>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10cf05: a1 90 ba 12 00 mov 0x12ba90,%eax
10cf0a: 40 inc %eax
10cf0b: a3 90 ba 12 00 mov %eax,0x12ba90
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
10cf10: 85 db test %ebx,%ebx
10cf12: 0f 85 88 00 00 00 jne 10cfa0 <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;
10cf18: 8b 0d 00 c5 12 00 mov 0x12c500,%ecx
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
10cf1e: 85 c9 test %ecx,%ecx
10cf20: 0f 84 bb 00 00 00 je 10cfe1 <rtems_io_register_driver+0x121><== NEVER TAKEN
10cf26: 8b 3d 04 c5 12 00 mov 0x12c504,%edi
10cf2c: 89 f8 mov %edi,%eax
10cf2e: eb 08 jmp 10cf38 <rtems_io_register_driver+0x78>
10cf30: 43 inc %ebx
10cf31: 83 c0 18 add $0x18,%eax
10cf34: 39 d9 cmp %ebx,%ecx
10cf36: 76 0b jbe 10cf43 <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;
10cf38: 83 38 00 cmpl $0x0,(%eax)
10cf3b: 75 f3 jne 10cf30 <rtems_io_register_driver+0x70>
10cf3d: 83 78 04 00 cmpl $0x0,0x4(%eax)
10cf41: 75 ed jne 10cf30 <rtems_io_register_driver+0x70>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
10cf43: 89 1a mov %ebx,(%edx)
if ( m != n )
10cf45: 39 d9 cmp %ebx,%ecx
10cf47: 0f 84 9b 00 00 00 je 10cfe8 <rtems_io_register_driver+0x128>
10cf4d: 8d 04 5b lea (%ebx,%ebx,2),%eax
10cf50: c1 e0 03 shl $0x3,%eax
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
10cf53: 01 c7 add %eax,%edi
10cf55: b9 06 00 00 00 mov $0x6,%ecx
10cf5a: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
_Thread_Enable_dispatch();
10cf5c: e8 6b 1d 00 00 call 10eccc <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
10cf61: c7 45 10 00 00 00 00 movl $0x0,0x10(%ebp)
10cf68: c7 45 0c 00 00 00 00 movl $0x0,0xc(%ebp)
10cf6f: 89 5d 08 mov %ebx,0x8(%ebp)
}
10cf72: 83 c4 0c add $0xc,%esp
10cf75: 5b pop %ebx
10cf76: 5e pop %esi
10cf77: 5f pop %edi
10cf78: c9 leave
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
10cf79: e9 72 7e 00 00 jmp 114df0 <rtems_io_initialize>
10cf7e: 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;
10cf80: 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 );
}
10cf85: 83 c4 0c add $0xc,%esp
10cf88: 5b pop %ebx
10cf89: 5e pop %esi
10cf8a: 5f pop %edi
10cf8b: c9 leave
10cf8c: c3 ret
10cf8d: 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;
10cf90: 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 );
}
10cf95: 83 c4 0c add $0xc,%esp
10cf98: 5b pop %ebx
10cf99: 5e pop %esi
10cf9a: 5f pop %edi
10cf9b: c9 leave
10cf9c: c3 ret
10cf9d: 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;
10cfa0: 8d 04 5b lea (%ebx,%ebx,2),%eax
10cfa3: c1 e0 03 shl $0x3,%eax
10cfa6: 8b 0d 04 c5 12 00 mov 0x12c504,%ecx
10cfac: 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;
10cfae: 8b 39 mov (%ecx),%edi
10cfb0: 85 ff test %edi,%edi
10cfb2: 74 40 je 10cff4 <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();
10cfb4: e8 13 1d 00 00 call 10eccc <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
10cfb9: 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 );
}
10cfbe: 83 c4 0c add $0xc,%esp
10cfc1: 5b pop %ebx
10cfc2: 5e pop %esi
10cfc3: 5f pop %edi
10cfc4: c9 leave
10cfc5: c3 ret
10cfc6: 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;
10cfc8: 8b 4e 04 mov 0x4(%esi),%ecx
10cfcb: 85 c9 test %ecx,%ecx
10cfcd: 0f 85 2e ff ff ff jne 10cf01 <rtems_io_register_driver+0x41>
10cfd3: 90 nop
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
10cfd4: 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 );
}
10cfd9: 83 c4 0c add $0xc,%esp
10cfdc: 5b pop %ebx
10cfdd: 5e pop %esi
10cfde: 5f pop %edi
10cfdf: c9 leave
10cfe0: c3 ret
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
10cfe1: c7 02 00 00 00 00 movl $0x0,(%edx) <== NOT EXECUTED
10cfe7: 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();
10cfe8: e8 df 1c 00 00 call 10eccc <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
10cfed: 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;
10cff2: eb 91 jmp 10cf85 <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;
10cff4: 8b 49 04 mov 0x4(%ecx),%ecx
10cff7: 85 c9 test %ecx,%ecx
10cff9: 75 b9 jne 10cfb4 <rtems_io_register_driver+0xf4>
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
10cffb: 89 1a mov %ebx,(%edx)
10cffd: 8b 3d 04 c5 12 00 mov 0x12c504,%edi
10d003: e9 4b ff ff ff jmp 10cf53 <rtems_io_register_driver+0x93>
0010d008 <rtems_io_unregister_driver>:
*/
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
10d008: 55 push %ebp
10d009: 89 e5 mov %esp,%ebp
10d00b: 57 push %edi
10d00c: 83 ec 04 sub $0x4,%esp
10d00f: 8b 45 08 mov 0x8(%ebp),%eax
if ( rtems_interrupt_is_in_progress() )
10d012: 8b 0d 34 c0 12 00 mov 0x12c034,%ecx
10d018: 85 c9 test %ecx,%ecx
10d01a: 75 44 jne 10d060 <rtems_io_unregister_driver+0x58>
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
10d01c: 39 05 00 c5 12 00 cmp %eax,0x12c500
10d022: 77 0c ja 10d030 <rtems_io_unregister_driver+0x28>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
10d024: b8 0d 00 00 00 mov $0xd,%eax
}
10d029: 5a pop %edx
10d02a: 5f pop %edi
10d02b: c9 leave
10d02c: c3 ret
10d02d: 8d 76 00 lea 0x0(%esi),%esi
10d030: 8b 15 90 ba 12 00 mov 0x12ba90,%edx
10d036: 42 inc %edx
10d037: 89 15 90 ba 12 00 mov %edx,0x12ba90
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
&_IO_Driver_address_table[major],
10d03d: 8d 14 40 lea (%eax,%eax,2),%edx
10d040: 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(
10d043: 03 15 04 c5 12 00 add 0x12c504,%edx
10d049: b9 18 00 00 00 mov $0x18,%ecx
10d04e: 31 c0 xor %eax,%eax
10d050: 89 d7 mov %edx,%edi
10d052: f3 aa rep stos %al,%es:(%edi)
&_IO_Driver_address_table[major],
0,
sizeof( rtems_driver_address_table )
);
_Thread_Enable_dispatch();
10d054: e8 73 1c 00 00 call 10eccc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d059: 31 c0 xor %eax,%eax
}
return RTEMS_UNSATISFIED;
}
10d05b: 5a pop %edx
10d05c: 5f pop %edi
10d05d: c9 leave
10d05e: c3 ret
10d05f: 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;
10d060: b8 12 00 00 00 mov $0x12,%eax
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
}
10d065: 5a pop %edx
10d066: 5f pop %edi
10d067: c9 leave
10d068: c3 ret
00113054 <rtems_io_write>:
rtems_status_code rtems_io_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
113054: 55 push %ebp
113055: 89 e5 mov %esp,%ebp
113057: 53 push %ebx
113058: 83 ec 04 sub $0x4,%esp
11305b: 8b 45 08 mov 0x8(%ebp),%eax
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
11305e: 39 05 00 88 12 00 cmp %eax,0x128800
113064: 76 1a jbe 113080 <rtems_io_write+0x2c>
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
113066: 8d 14 40 lea (%eax,%eax,2),%edx
113069: c1 e2 03 shl $0x3,%edx
11306c: 03 15 04 88 12 00 add 0x128804,%edx
113072: 8b 52 10 mov 0x10(%edx),%edx
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
113075: 85 d2 test %edx,%edx
113077: 74 13 je 11308c <rtems_io_write+0x38>
}
113079: 59 pop %ecx
11307a: 5b pop %ebx
11307b: 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;
11307c: ff e2 jmp *%edx
11307e: 66 90 xchg %ax,%ax
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
return RTEMS_INVALID_NUMBER;
113080: b8 0a 00 00 00 mov $0xa,%eax
callout = _IO_Driver_address_table[major].write_entry;
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
}
113085: 5a pop %edx
113086: 5b pop %ebx
113087: c9 leave
113088: c3 ret
113089: 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;
11308c: 31 c0 xor %eax,%eax
}
11308e: 5a pop %edx
11308f: 5b pop %ebx
113090: c9 leave
113091: c3 ret
0010dfb8 <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)
{
10dfb8: 55 push %ebp
10dfb9: 89 e5 mov %esp,%ebp
10dfbb: 57 push %edi
10dfbc: 56 push %esi
10dfbd: 53 push %ebx
10dfbe: 83 ec 1c sub $0x1c,%esp
10dfc1: 8b 7d 08 mov 0x8(%ebp),%edi
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
10dfc4: 85 ff test %edi,%edi
10dfc6: 74 49 je 10e011 <rtems_iterate_over_all_threads+0x59><== NEVER TAKEN
10dfc8: 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 ];
10dfcf: 8b 55 e4 mov -0x1c(%ebp),%edx
10dfd2: 8b 04 95 e8 a9 12 00 mov 0x12a9e8(,%edx,4),%eax
10dfd9: 8b 70 04 mov 0x4(%eax),%esi
if ( !information )
10dfdc: 85 f6 test %esi,%esi
10dfde: 74 28 je 10e008 <rtems_iterate_over_all_threads+0x50>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10dfe0: 66 83 7e 10 00 cmpw $0x0,0x10(%esi)
10dfe5: 74 21 je 10e008 <rtems_iterate_over_all_threads+0x50>
10dfe7: bb 01 00 00 00 mov $0x1,%ebx
the_thread = (Thread_Control *)information->local_table[ i ];
10dfec: 8b 46 1c mov 0x1c(%esi),%eax
10dfef: 8b 04 98 mov (%eax,%ebx,4),%eax
if ( !the_thread )
10dff2: 85 c0 test %eax,%eax
10dff4: 74 09 je 10dfff <rtems_iterate_over_all_threads+0x47><== NEVER TAKEN
continue;
(*routine)(the_thread);
10dff6: 83 ec 0c sub $0xc,%esp
10dff9: 50 push %eax
10dffa: ff d7 call *%edi
10dffc: 83 c4 10 add $0x10,%esp
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
10dfff: 43 inc %ebx
10e000: 0f b7 46 10 movzwl 0x10(%esi),%eax
10e004: 39 d8 cmp %ebx,%eax
10e006: 73 e4 jae 10dfec <rtems_iterate_over_all_threads+0x34>
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
10e008: ff 45 e4 incl -0x1c(%ebp)
10e00b: 83 7d e4 04 cmpl $0x4,-0x1c(%ebp)
10e00f: 75 be jne 10dfcf <rtems_iterate_over_all_threads+0x17>
(*routine)(the_thread);
}
}
}
10e011: 8d 65 f4 lea -0xc(%ebp),%esp
10e014: 5b pop %ebx
10e015: 5e pop %esi
10e016: 5f pop %edi
10e017: c9 leave
10e018: c3 ret
001163bc <rtems_message_queue_broadcast>:
rtems_id id,
const void *buffer,
size_t size,
uint32_t *count
)
{
1163bc: 55 push %ebp
1163bd: 89 e5 mov %esp,%ebp
1163bf: 57 push %edi
1163c0: 56 push %esi
1163c1: 53 push %ebx
1163c2: 83 ec 1c sub $0x1c,%esp
1163c5: 8b 7d 08 mov 0x8(%ebp),%edi
1163c8: 8b 5d 0c mov 0xc(%ebp),%ebx
1163cb: 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 )
1163ce: 85 db test %ebx,%ebx
1163d0: 74 62 je 116434 <rtems_message_queue_broadcast+0x78>
return RTEMS_INVALID_ADDRESS;
if ( !count )
1163d2: 85 f6 test %esi,%esi
1163d4: 74 5e je 116434 <rtems_message_queue_broadcast+0x78>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
1163d6: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1163d7: 8d 45 e4 lea -0x1c(%ebp),%eax
1163da: 50 push %eax
1163db: 57 push %edi
1163dc: 68 20 34 14 00 push $0x143420
1163e1: e8 f6 4e 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
1163e6: 83 c4 10 add $0x10,%esp
1163e9: 8b 55 e4 mov -0x1c(%ebp),%edx
1163ec: 85 d2 test %edx,%edx
1163ee: 74 10 je 116400 <rtems_message_queue_broadcast+0x44>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1163f0: b8 04 00 00 00 mov $0x4,%eax
}
1163f5: 8d 65 f4 lea -0xc(%ebp),%esp
1163f8: 5b pop %ebx
1163f9: 5e pop %esi
1163fa: 5f pop %edi
1163fb: c9 leave
1163fc: c3 ret
1163fd: 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(
116400: 83 ec 08 sub $0x8,%esp
116403: 56 push %esi
116404: 6a 00 push $0x0
116406: 57 push %edi
116407: ff 75 10 pushl 0x10(%ebp)
11640a: 53 push %ebx
11640b: 83 c0 14 add $0x14,%eax
11640e: 50 push %eax
11640f: e8 c8 34 00 00 call 1198dc <_CORE_message_queue_Broadcast>
116414: 89 c3 mov %eax,%ebx
NULL,
#endif
count
);
_Thread_Enable_dispatch();
116416: 83 c4 20 add $0x20,%esp
116419: e8 36 5a 00 00 call 11be54 <_Thread_Enable_dispatch>
return
11641e: 83 ec 0c sub $0xc,%esp
116421: 53 push %ebx
116422: e8 69 03 00 00 call 116790 <_Message_queue_Translate_core_message_queue_return_code>
116427: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11642a: 8d 65 f4 lea -0xc(%ebp),%esp
11642d: 5b pop %ebx
11642e: 5e pop %esi
11642f: 5f pop %edi
116430: c9 leave
116431: c3 ret
116432: 66 90 xchg %ax,%ax
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116434: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116439: 8d 65 f4 lea -0xc(%ebp),%esp
11643c: 5b pop %ebx
11643d: 5e pop %esi
11643e: 5f pop %edi
11643f: c9 leave
116440: c3 ret
00113858 <rtems_message_queue_create>:
uint32_t count,
size_t max_message_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
113858: 55 push %ebp
113859: 89 e5 mov %esp,%ebp
11385b: 57 push %edi
11385c: 56 push %esi
11385d: 53 push %ebx
11385e: 83 ec 2c sub $0x2c,%esp
113861: 8b 5d 08 mov 0x8(%ebp),%ebx
113864: 8b 75 0c mov 0xc(%ebp),%esi
113867: 8b 4d 10 mov 0x10(%ebp),%ecx
11386a: 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 ) )
11386d: 85 db test %ebx,%ebx
11386f: 74 2f je 1138a0 <rtems_message_queue_create+0x48>
return RTEMS_INVALID_NAME;
if ( !id )
113871: 85 ff test %edi,%edi
113873: 0f 84 a3 00 00 00 je 11391c <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 )
113879: 85 f6 test %esi,%esi
11387b: 74 13 je 113890 <rtems_message_queue_create+0x38>
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
11387d: 85 c9 test %ecx,%ecx
11387f: 75 2f jne 1138b0 <rtems_message_queue_create+0x58>
return RTEMS_INVALID_SIZE;
113881: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113886: 8d 65 f4 lea -0xc(%ebp),%esp
113889: 5b pop %ebx
11388a: 5e pop %esi
11388b: 5f pop %edi
11388c: c9 leave
11388d: c3 ret
11388e: 66 90 xchg %ax,%ax
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
return RTEMS_INVALID_NUMBER;
113890: b8 0a 00 00 00 mov $0xa,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
113895: 8d 65 f4 lea -0xc(%ebp),%esp
113898: 5b pop %ebx
113899: 5e pop %esi
11389a: 5f pop %edi
11389b: c9 leave
11389c: c3 ret
11389d: 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;
1138a0: b8 03 00 00 00 mov $0x3,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
1138a5: 8d 65 f4 lea -0xc(%ebp),%esp
1138a8: 5b pop %ebx
1138a9: 5e pop %esi
1138aa: 5f pop %edi
1138ab: c9 leave
1138ac: c3 ret
1138ad: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
1138b0: a1 30 07 13 00 mov 0x130730,%eax
1138b5: 40 inc %eax
1138b6: a3 30 07 13 00 mov %eax,0x130730
#endif
#endif
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
1138bb: 89 4d d4 mov %ecx,-0x2c(%ebp)
1138be: e8 09 60 00 00 call 1198cc <_Message_queue_Allocate>
1138c3: 89 c2 mov %eax,%edx
if ( !the_message_queue ) {
1138c5: 85 c0 test %eax,%eax
1138c7: 8b 4d d4 mov -0x2c(%ebp),%ecx
1138ca: 74 7c je 113948 <rtems_message_queue_create+0xf0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_message_queue->attribute_set = attribute_set;
1138cc: 8b 45 14 mov 0x14(%ebp),%eax
1138cf: 89 42 10 mov %eax,0x10(%edx)
if (_Attributes_Is_priority( attribute_set ) )
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
1138d2: a8 04 test $0x4,%al
1138d4: 0f 95 c0 setne %al
1138d7: 0f b6 c0 movzbl %al,%eax
1138da: 89 45 e4 mov %eax,-0x1c(%ebp)
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
if ( ! _CORE_message_queue_Initialize(
1138dd: 51 push %ecx
1138de: 56 push %esi
1138df: 8d 45 e4 lea -0x1c(%ebp),%eax
1138e2: 50 push %eax
1138e3: 8d 42 14 lea 0x14(%edx),%eax
1138e6: 50 push %eax
1138e7: 89 55 d4 mov %edx,-0x2c(%ebp)
1138ea: e8 2d 11 00 00 call 114a1c <_CORE_message_queue_Initialize>
1138ef: 83 c4 10 add $0x10,%esp
1138f2: 84 c0 test %al,%al
1138f4: 8b 55 d4 mov -0x2c(%ebp),%edx
1138f7: 75 2f jne 113928 <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 );
1138f9: 83 ec 08 sub $0x8,%esp
1138fc: 52 push %edx
1138fd: 68 20 11 13 00 push $0x131120
113902: e8 b1 1f 00 00 call 1158b8 <_Objects_Free>
_Objects_MP_Close(
&_Message_queue_Information, the_message_queue->Object.id);
#endif
_Message_queue_Free( the_message_queue );
_Thread_Enable_dispatch();
113907: e8 e4 2c 00 00 call 1165f0 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
11390c: 83 c4 10 add $0x10,%esp
11390f: b8 0d 00 00 00 mov $0xd,%eax
113914: e9 6d ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
113919: 8d 76 00 lea 0x0(%esi),%esi
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
11391c: b8 09 00 00 00 mov $0x9,%eax
113921: e9 60 ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
113926: 66 90 xchg %ax,%ax
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
113928: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
11392b: 0f b7 f0 movzwl %ax,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
11392e: 8b 0d 3c 11 13 00 mov 0x13113c,%ecx
113934: 89 14 b1 mov %edx,(%ecx,%esi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
113937: 89 5a 0c mov %ebx,0xc(%edx)
&_Message_queue_Information,
&the_message_queue->Object,
(Objects_Name) name
);
*id = the_message_queue->Object.id;
11393a: 89 07 mov %eax,(%edi)
name,
0
);
#endif
_Thread_Enable_dispatch();
11393c: e8 af 2c 00 00 call 1165f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
113941: 31 c0 xor %eax,%eax
113943: e9 3e ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
if ( !the_message_queue ) {
_Thread_Enable_dispatch();
113948: e8 a3 2c 00 00 call 1165f0 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
11394d: b8 05 00 00 00 mov $0x5,%eax
113952: e9 2f ff ff ff jmp 113886 <rtems_message_queue_create+0x2e>
00116544 <rtems_message_queue_delete>:
*/
rtems_status_code rtems_message_queue_delete(
rtems_id id
)
{
116544: 55 push %ebp
116545: 89 e5 mov %esp,%ebp
116547: 53 push %ebx
116548: 83 ec 18 sub $0x18,%esp
register Message_queue_Control *the_message_queue;
Objects_Locations location;
the_message_queue = _Message_queue_Get( id, &location );
11654b: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
11654e: 50 push %eax
11654f: ff 75 08 pushl 0x8(%ebp)
116552: 68 20 34 14 00 push $0x143420
116557: e8 80 4d 00 00 call 11b2dc <_Objects_Get>
11655c: 89 c3 mov %eax,%ebx
switch ( location ) {
11655e: 83 c4 10 add $0x10,%esp
116561: 8b 4d f4 mov -0xc(%ebp),%ecx
116564: 85 c9 test %ecx,%ecx
116566: 75 3c jne 1165a4 <rtems_message_queue_delete+0x60>
case OBJECTS_LOCAL:
_Objects_Close( &_Message_queue_Information,
116568: 83 ec 08 sub $0x8,%esp
11656b: 50 push %eax
11656c: 68 20 34 14 00 push $0x143420
116571: e8 f2 48 00 00 call 11ae68 <_Objects_Close>
&the_message_queue->Object );
_CORE_message_queue_Close(
116576: 83 c4 0c add $0xc,%esp
116579: 6a 05 push $0x5
11657b: 6a 00 push $0x0
11657d: 8d 43 14 lea 0x14(%ebx),%eax
116580: 50 push %eax
116581: e8 da 33 00 00 call 119960 <_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 );
116586: 58 pop %eax
116587: 5a pop %edx
116588: 53 push %ebx
116589: 68 20 34 14 00 push $0x143420
11658e: e8 cd 4b 00 00 call 11b160 <_Objects_Free>
0, /* Not used */
0
);
}
#endif
_Thread_Enable_dispatch();
116593: e8 bc 58 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116598: 83 c4 10 add $0x10,%esp
11659b: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11659d: 8b 5d fc mov -0x4(%ebp),%ebx
1165a0: c9 leave
1165a1: c3 ret
1165a2: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1165a4: b8 04 00 00 00 mov $0x4,%eax
}
1165a9: 8b 5d fc mov -0x4(%ebp),%ebx
1165ac: c9 leave
1165ad: c3 ret
001165b0 <rtems_message_queue_flush>:
rtems_status_code rtems_message_queue_flush(
rtems_id id,
uint32_t *count
)
{
1165b0: 55 push %ebp
1165b1: 89 e5 mov %esp,%ebp
1165b3: 53 push %ebx
1165b4: 83 ec 14 sub $0x14,%esp
1165b7: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
1165ba: 85 db test %ebx,%ebx
1165bc: 74 46 je 116604 <rtems_message_queue_flush+0x54>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
1165be: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1165bf: 8d 45 f4 lea -0xc(%ebp),%eax
1165c2: 50 push %eax
1165c3: ff 75 08 pushl 0x8(%ebp)
1165c6: 68 20 34 14 00 push $0x143420
1165cb: e8 0c 4d 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
1165d0: 83 c4 10 add $0x10,%esp
1165d3: 8b 55 f4 mov -0xc(%ebp),%edx
1165d6: 85 d2 test %edx,%edx
1165d8: 74 0a je 1165e4 <rtems_message_queue_flush+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1165da: b8 04 00 00 00 mov $0x4,%eax
}
1165df: 8b 5d fc mov -0x4(%ebp),%ebx
1165e2: c9 leave
1165e3: 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 );
1165e4: 83 ec 0c sub $0xc,%esp
1165e7: 83 c0 14 add $0x14,%eax
1165ea: 50 push %eax
1165eb: e8 ac 33 00 00 call 11999c <_CORE_message_queue_Flush>
1165f0: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
1165f2: e8 5d 58 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1165f7: 83 c4 10 add $0x10,%esp
1165fa: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1165fc: 8b 5d fc mov -0x4(%ebp),%ebx
1165ff: c9 leave
116600: c3 ret
116601: 8d 76 00 lea 0x0(%esi),%esi
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116604: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116609: 8b 5d fc mov -0x4(%ebp),%ebx
11660c: c9 leave
11660d: c3 ret
00116610 <rtems_message_queue_get_number_pending>:
rtems_status_code rtems_message_queue_get_number_pending(
rtems_id id,
uint32_t *count
)
{
116610: 55 push %ebp
116611: 89 e5 mov %esp,%ebp
116613: 53 push %ebx
116614: 83 ec 14 sub $0x14,%esp
116617: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
11661a: 85 db test %ebx,%ebx
11661c: 74 3a je 116658 <rtems_message_queue_get_number_pending+0x48>
11661e: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
11661f: 8d 45 f4 lea -0xc(%ebp),%eax
116622: 50 push %eax
116623: ff 75 08 pushl 0x8(%ebp)
116626: 68 20 34 14 00 push $0x143420
11662b: e8 ac 4c 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
116630: 83 c4 10 add $0x10,%esp
116633: 8b 55 f4 mov -0xc(%ebp),%edx
116636: 85 d2 test %edx,%edx
116638: 74 0a je 116644 <rtems_message_queue_get_number_pending+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11663a: b8 04 00 00 00 mov $0x4,%eax
}
11663f: 8b 5d fc mov -0x4(%ebp),%ebx
116642: c9 leave
116643: 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;
116644: 8b 40 5c mov 0x5c(%eax),%eax
116647: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
116649: e8 06 58 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11664e: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116650: 8b 5d fc mov -0x4(%ebp),%ebx
116653: c9 leave
116654: c3 ret
116655: 8d 76 00 lea 0x0(%esi),%esi
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
116658: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11665d: 8b 5d fc mov -0x4(%ebp),%ebx
116660: c9 leave
116661: c3 ret
0011397c <rtems_message_queue_receive>:
void *buffer,
size_t *size,
rtems_option option_set,
rtems_interval timeout
)
{
11397c: 55 push %ebp
11397d: 89 e5 mov %esp,%ebp
11397f: 56 push %esi
113980: 53 push %ebx
113981: 83 ec 10 sub $0x10,%esp
113984: 8b 5d 0c mov 0xc(%ebp),%ebx
113987: 8b 75 10 mov 0x10(%ebp),%esi
register Message_queue_Control *the_message_queue;
Objects_Locations location;
bool wait;
if ( !buffer )
11398a: 85 db test %ebx,%ebx
11398c: 74 6e je 1139fc <rtems_message_queue_receive+0x80>
return RTEMS_INVALID_ADDRESS;
if ( !size )
11398e: 85 f6 test %esi,%esi
113990: 74 6a je 1139fc <rtems_message_queue_receive+0x80>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
113992: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
113993: 8d 45 f4 lea -0xc(%ebp),%eax
113996: 50 push %eax
113997: ff 75 08 pushl 0x8(%ebp)
11399a: 68 20 11 13 00 push $0x131120
11399f: e8 54 20 00 00 call 1159f8 <_Objects_Get>
switch ( location ) {
1139a4: 83 c4 10 add $0x10,%esp
1139a7: 8b 55 f4 mov -0xc(%ebp),%edx
1139aa: 85 d2 test %edx,%edx
1139ac: 75 42 jne 1139f0 <rtems_message_queue_receive+0x74>
if ( _Options_Is_no_wait( option_set ) )
wait = false;
else
wait = true;
_CORE_message_queue_Seize(
1139ae: 83 ec 08 sub $0x8,%esp
1139b1: 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;
1139b4: 8b 55 14 mov 0x14(%ebp),%edx
1139b7: 83 e2 01 and $0x1,%edx
1139ba: 83 f2 01 xor $0x1,%edx
1139bd: 52 push %edx
1139be: 56 push %esi
1139bf: 53 push %ebx
1139c0: ff 70 08 pushl 0x8(%eax)
1139c3: 83 c0 14 add $0x14,%eax
1139c6: 50 push %eax
1139c7: e8 00 11 00 00 call 114acc <_CORE_message_queue_Seize>
buffer,
size,
wait,
timeout
);
_Thread_Enable_dispatch();
1139cc: 83 c4 20 add $0x20,%esp
1139cf: e8 1c 2c 00 00 call 1165f0 <_Thread_Enable_dispatch>
return _Message_queue_Translate_core_message_queue_return_code(
1139d4: 83 ec 0c sub $0xc,%esp
_Thread_Executing->Wait.return_code
1139d7: a1 d8 0c 13 00 mov 0x130cd8,%eax
size,
wait,
timeout
);
_Thread_Enable_dispatch();
return _Message_queue_Translate_core_message_queue_return_code(
1139dc: ff 70 34 pushl 0x34(%eax)
1139df: e8 a0 00 00 00 call 113a84 <_Message_queue_Translate_core_message_queue_return_code>
1139e4: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1139e7: 8d 65 f8 lea -0x8(%ebp),%esp
1139ea: 5b pop %ebx
1139eb: 5e pop %esi
1139ec: c9 leave
1139ed: c3 ret
1139ee: 66 90 xchg %ax,%ax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1139f0: b8 04 00 00 00 mov $0x4,%eax
}
1139f5: 8d 65 f8 lea -0x8(%ebp),%esp
1139f8: 5b pop %ebx
1139f9: 5e pop %esi
1139fa: c9 leave
1139fb: c3 ret
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
1139fc: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
113a01: 8d 65 f8 lea -0x8(%ebp),%esp
113a04: 5b pop %ebx
113a05: 5e pop %esi
113a06: c9 leave
113a07: 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 87 12 00 push $0x128780
10b3c5: e8 6e 1a 00 00 call 10ce38 <_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 3f 0c 00 00 call 10c038 <_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 ad 25 00 00 call 10d9b0 <_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
001167a0 <rtems_message_queue_urgent>:
rtems_status_code rtems_message_queue_urgent(
rtems_id id,
const void *buffer,
size_t size
)
{
1167a0: 55 push %ebp
1167a1: 89 e5 mov %esp,%ebp
1167a3: 56 push %esi
1167a4: 53 push %ebx
1167a5: 83 ec 10 sub $0x10,%esp
1167a8: 8b 75 08 mov 0x8(%ebp),%esi
1167ab: 8b 5d 0c mov 0xc(%ebp),%ebx
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status status;
if ( !buffer )
1167ae: 85 db test %ebx,%ebx
1167b0: 74 5e je 116810 <rtems_message_queue_urgent+0x70>
1167b2: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
1167b3: 8d 45 f4 lea -0xc(%ebp),%eax
1167b6: 50 push %eax
1167b7: 56 push %esi
1167b8: 68 20 34 14 00 push $0x143420
1167bd: e8 1a 4b 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
1167c2: 83 c4 10 add $0x10,%esp
1167c5: 8b 55 f4 mov -0xc(%ebp),%edx
1167c8: 85 d2 test %edx,%edx
1167ca: 74 0c je 1167d8 <rtems_message_queue_urgent+0x38>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1167cc: b8 04 00 00 00 mov $0x4,%eax
}
1167d1: 8d 65 f8 lea -0x8(%ebp),%esp
1167d4: 5b pop %ebx
1167d5: 5e pop %esi
1167d6: c9 leave
1167d7: c3 ret
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
bool wait,
Watchdog_Interval timeout
)
{
return _CORE_message_queue_Submit(
1167d8: 6a 00 push $0x0
1167da: 6a 00 push $0x0
1167dc: 68 00 00 00 80 push $0x80000000
1167e1: 6a 00 push $0x0
1167e3: 56 push %esi
1167e4: ff 75 10 pushl 0x10(%ebp)
1167e7: 53 push %ebx
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status = _CORE_message_queue_Urgent(
1167e8: 83 c0 14 add $0x14,%eax
1167eb: 50 push %eax
1167ec: e8 eb 33 00 00 call 119bdc <_CORE_message_queue_Submit>
1167f1: 89 c3 mov %eax,%ebx
id,
MESSAGE_QUEUE_MP_HANDLER,
false, /* sender does not block */
0 /* no timeout */
);
_Thread_Enable_dispatch();
1167f3: 83 c4 20 add $0x20,%esp
1167f6: e8 59 56 00 00 call 11be54 <_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);
1167fb: 83 ec 0c sub $0xc,%esp
1167fe: 53 push %ebx
1167ff: e8 8c ff ff ff call 116790 <_Message_queue_Translate_core_message_queue_return_code>
116804: 83 c4 10 add $0x10,%esp
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116807: 8d 65 f8 lea -0x8(%ebp),%esp
11680a: 5b pop %ebx
11680b: 5e pop %esi
11680c: c9 leave
11680d: c3 ret
11680e: 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;
116810: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116815: 8d 65 f8 lea -0x8(%ebp),%esp
116818: 5b pop %ebx
116819: 5e pop %esi
11681a: c9 leave
11681b: c3 ret
0010b978 <rtems_object_get_api_name>:
};
const char *rtems_object_get_api_name(
int api
)
{
10b978: 55 push %ebp
10b979: 89 e5 mov %esp,%ebp
10b97b: 83 ec 10 sub $0x10,%esp
const rtems_assoc_t *api_assoc;
api_assoc = rtems_assoc_ptr_by_local( rtems_objects_api_assoc, api );
10b97e: ff 75 08 pushl 0x8(%ebp)
10b981: 68 40 7c 12 00 push $0x127c40
10b986: e8 d9 49 00 00 call 110364 <rtems_assoc_ptr_by_local>
if ( api_assoc )
10b98b: 83 c4 10 add $0x10,%esp
10b98e: 85 c0 test %eax,%eax
10b990: 74 06 je 10b998 <rtems_object_get_api_name+0x20>
return api_assoc->name;
10b992: 8b 00 mov (%eax),%eax
return "BAD CLASS";
}
10b994: c9 leave
10b995: c3 ret
10b996: 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";
10b998: b8 63 2c 12 00 mov $0x122c63,%eax
}
10b99d: c9 leave
10b99e: c3 ret
0010cf60 <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
)
{
10cf60: 55 push %ebp
10cf61: 89 e5 mov %esp,%ebp
10cf63: 57 push %edi
10cf64: 56 push %esi
10cf65: 53 push %ebx
10cf66: 83 ec 0c sub $0xc,%esp
10cf69: 8b 5d 10 mov 0x10(%ebp),%ebx
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
10cf6c: 85 db test %ebx,%ebx
10cf6e: 74 60 je 10cfd0 <rtems_object_get_class_information+0x70>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
10cf70: 83 ec 08 sub $0x8,%esp
10cf73: 0f b7 45 0c movzwl 0xc(%ebp),%eax
10cf77: 50 push %eax
10cf78: ff 75 08 pushl 0x8(%ebp)
10cf7b: e8 4c 1b 00 00 call 10eacc <_Objects_Get_information>
if ( !obj_info )
10cf80: 83 c4 10 add $0x10,%esp
10cf83: 85 c0 test %eax,%eax
10cf85: 74 59 je 10cfe0 <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;
10cf87: 8b 50 08 mov 0x8(%eax),%edx
10cf8a: 89 13 mov %edx,(%ebx)
info->maximum_id = obj_info->maximum_id;
10cf8c: 8b 50 0c mov 0xc(%eax),%edx
10cf8f: 89 53 04 mov %edx,0x4(%ebx)
info->auto_extend = obj_info->auto_extend;
10cf92: 8a 50 12 mov 0x12(%eax),%dl
10cf95: 88 53 0c mov %dl,0xc(%ebx)
info->maximum = obj_info->maximum;
10cf98: 0f b7 70 10 movzwl 0x10(%eax),%esi
10cf9c: 89 73 08 mov %esi,0x8(%ebx)
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
10cf9f: 85 f6 test %esi,%esi
10cfa1: 74 44 je 10cfe7 <rtems_object_get_class_information+0x87><== NEVER TAKEN
10cfa3: 8b 78 1c mov 0x1c(%eax),%edi
10cfa6: b9 01 00 00 00 mov $0x1,%ecx
10cfab: b8 01 00 00 00 mov $0x1,%eax
10cfb0: 31 d2 xor %edx,%edx
10cfb2: 66 90 xchg %ax,%ax
if ( !obj_info->local_table[i] )
unallocated++;
10cfb4: 83 3c 8f 01 cmpl $0x1,(%edi,%ecx,4)
10cfb8: 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++ )
10cfbb: 40 inc %eax
10cfbc: 89 c1 mov %eax,%ecx
10cfbe: 39 c6 cmp %eax,%esi
10cfc0: 73 f2 jae 10cfb4 <rtems_object_get_class_information+0x54>
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
10cfc2: 89 53 10 mov %edx,0x10(%ebx)
return RTEMS_SUCCESSFUL;
10cfc5: 31 c0 xor %eax,%eax
}
10cfc7: 8d 65 f4 lea -0xc(%ebp),%esp
10cfca: 5b pop %ebx
10cfcb: 5e pop %esi
10cfcc: 5f pop %edi
10cfcd: c9 leave
10cfce: c3 ret
10cfcf: 90 nop
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
10cfd0: b8 09 00 00 00 mov $0x9,%eax
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
10cfd5: 8d 65 f4 lea -0xc(%ebp),%esp
10cfd8: 5b pop %ebx
10cfd9: 5e pop %esi
10cfda: 5f pop %edi
10cfdb: c9 leave
10cfdc: c3 ret
10cfdd: 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;
10cfe0: b8 0a 00 00 00 mov $0xa,%eax
10cfe5: eb e0 jmp 10cfc7 <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++ )
10cfe7: 31 d2 xor %edx,%edx <== NOT EXECUTED
10cfe9: eb d7 jmp 10cfc2 <rtems_object_get_class_information+0x62><== NOT EXECUTED
0010c520 <rtems_object_get_classic_name>:
rtems_status_code rtems_object_get_classic_name(
rtems_id id,
rtems_name *name
)
{
10c520: 55 push %ebp
10c521: 89 e5 mov %esp,%ebp
10c523: 53 push %ebx
10c524: 83 ec 14 sub $0x14,%esp
10c527: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
10c52a: 85 db test %ebx,%ebx
10c52c: 74 26 je 10c554 <rtems_object_get_classic_name+0x34>
return RTEMS_INVALID_ADDRESS;
status = _Objects_Id_to_name( id, &name_u );
10c52e: 83 ec 08 sub $0x8,%esp
10c531: 8d 45 f4 lea -0xc(%ebp),%eax
10c534: 50 push %eax
10c535: ff 75 08 pushl 0x8(%ebp)
10c538: e8 a7 1b 00 00 call 10e0e4 <_Objects_Id_to_name>
*name = name_u.name_u32;
10c53d: 8b 55 f4 mov -0xc(%ebp),%edx
10c540: 89 13 mov %edx,(%ebx)
return _Status_Object_name_errors_to_status[ status ];
10c542: 8b 04 85 4c 38 12 00 mov 0x12384c(,%eax,4),%eax
10c549: 83 c4 10 add $0x10,%esp
}
10c54c: 8b 5d fc mov -0x4(%ebp),%ebx
10c54f: c9 leave
10c550: c3 ret
10c551: 8d 76 00 lea 0x0(%esi),%esi
{
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
return RTEMS_INVALID_ADDRESS;
10c554: 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 ];
}
10c559: 8b 5d fc mov -0x4(%ebp),%ebx
10c55c: c9 leave
10c55d: c3 ret
0010b9ac <rtems_object_set_name>:
*/
rtems_status_code rtems_object_set_name(
rtems_id id,
const char *name
)
{
10b9ac: 55 push %ebp
10b9ad: 89 e5 mov %esp,%ebp
10b9af: 57 push %edi
10b9b0: 56 push %esi
10b9b1: 53 push %ebx
10b9b2: 83 ec 1c sub $0x1c,%esp
10b9b5: 8b 75 08 mov 0x8(%ebp),%esi
10b9b8: 8b 7d 0c mov 0xc(%ebp),%edi
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
10b9bb: 85 ff test %edi,%edi
10b9bd: 74 61 je 10ba20 <rtems_object_set_name+0x74>
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10b9bf: 85 f6 test %esi,%esi
10b9c1: 74 35 je 10b9f8 <rtems_object_set_name+0x4c>
information = _Objects_Get_information_id( tmpId );
10b9c3: 83 ec 0c sub $0xc,%esp
10b9c6: 56 push %esi
10b9c7: e8 24 19 00 00 call 10d2f0 <_Objects_Get_information_id>
10b9cc: 89 c3 mov %eax,%ebx
if ( !information )
10b9ce: 83 c4 10 add $0x10,%esp
10b9d1: 85 c0 test %eax,%eax
10b9d3: 74 16 je 10b9eb <rtems_object_set_name+0x3f>
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
10b9d5: 50 push %eax
10b9d6: 8d 45 e4 lea -0x1c(%ebp),%eax
10b9d9: 50 push %eax
10b9da: 56 push %esi
10b9db: 53 push %ebx
10b9dc: e8 c7 1a 00 00 call 10d4a8 <_Objects_Get>
switch ( location ) {
10b9e1: 83 c4 10 add $0x10,%esp
10b9e4: 8b 4d e4 mov -0x1c(%ebp),%ecx
10b9e7: 85 c9 test %ecx,%ecx
10b9e9: 74 19 je 10ba04 <rtems_object_set_name+0x58>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10b9eb: b8 04 00 00 00 mov $0x4,%eax
}
10b9f0: 8d 65 f4 lea -0xc(%ebp),%esp
10b9f3: 5b pop %ebx
10b9f4: 5e pop %esi
10b9f5: 5f pop %edi
10b9f6: c9 leave
10b9f7: c3 ret
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
10b9f8: a1 f8 a5 12 00 mov 0x12a5f8,%eax
10b9fd: 8b 70 08 mov 0x8(%eax),%esi
10ba00: eb c1 jmp 10b9c3 <rtems_object_set_name+0x17>
10ba02: 66 90 xchg %ax,%ax
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
10ba04: 52 push %edx
10ba05: 57 push %edi
10ba06: 50 push %eax
10ba07: 53 push %ebx
10ba08: e8 83 1c 00 00 call 10d690 <_Objects_Set_name>
_Thread_Enable_dispatch();
10ba0d: e8 ea 26 00 00 call 10e0fc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ba12: 83 c4 10 add $0x10,%esp
10ba15: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ba17: 8d 65 f4 lea -0xc(%ebp),%esp
10ba1a: 5b pop %ebx
10ba1b: 5e pop %esi
10ba1c: 5f pop %edi
10ba1d: c9 leave
10ba1e: c3 ret
10ba1f: 90 nop
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
10ba20: b8 09 00 00 00 mov $0x9,%eax
10ba25: eb c9 jmp 10b9f0 <rtems_object_set_name+0x44>
0011681c <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
11681c: 55 push %ebp
11681d: 89 e5 mov %esp,%ebp
11681f: 57 push %edi
116820: 56 push %esi
116821: 53 push %ebx
116822: 83 ec 1c sub $0x1c,%esp
116825: 8b 5d 08 mov 0x8(%ebp),%ebx
116828: 8b 75 0c mov 0xc(%ebp),%esi
11682b: 8b 55 10 mov 0x10(%ebp),%edx
11682e: 8b 7d 14 mov 0x14(%ebp),%edi
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
116831: 85 db test %ebx,%ebx
116833: 74 47 je 11687c <rtems_partition_create+0x60>
return RTEMS_INVALID_NAME;
if ( !starting_address )
116835: 85 f6 test %esi,%esi
116837: 74 23 je 11685c <rtems_partition_create+0x40>
return RTEMS_INVALID_ADDRESS;
if ( !id )
116839: 8b 45 1c mov 0x1c(%ebp),%eax
11683c: 85 c0 test %eax,%eax
11683e: 74 1c je 11685c <rtems_partition_create+0x40><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
116840: 85 d2 test %edx,%edx
116842: 74 28 je 11686c <rtems_partition_create+0x50>
116844: 85 ff test %edi,%edi
116846: 74 24 je 11686c <rtems_partition_create+0x50>
116848: 39 fa cmp %edi,%edx
11684a: 72 20 jb 11686c <rtems_partition_create+0x50>
11684c: f7 c7 03 00 00 00 test $0x3,%edi
116852: 75 18 jne 11686c <rtems_partition_create+0x50>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
116854: f7 c6 03 00 00 00 test $0x3,%esi
11685a: 74 30 je 11688c <rtems_partition_create+0x70>
return RTEMS_INVALID_ADDRESS;
11685c: b8 09 00 00 00 mov $0x9,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
116861: 8d 65 f4 lea -0xc(%ebp),%esp
116864: 5b pop %ebx
116865: 5e pop %esi
116866: 5f pop %edi
116867: c9 leave
116868: c3 ret
116869: 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;
11686c: b8 08 00 00 00 mov $0x8,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
116871: 8d 65 f4 lea -0xc(%ebp),%esp
116874: 5b pop %ebx
116875: 5e pop %esi
116876: 5f pop %edi
116877: c9 leave
116878: c3 ret
116879: 8d 76 00 lea 0x0(%esi),%esi
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
11687c: b8 03 00 00 00 mov $0x3,%eax
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
116881: 8d 65 f4 lea -0xc(%ebp),%esp
116884: 5b pop %ebx
116885: 5e pop %esi
116886: 5f pop %edi
116887: c9 leave
116888: c3 ret
116889: 8d 76 00 lea 0x0(%esi),%esi
11688c: a1 30 2a 14 00 mov 0x142a30,%eax
116891: 40 inc %eax
116892: a3 30 2a 14 00 mov %eax,0x142a30
* 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 );
116897: 83 ec 0c sub $0xc,%esp
11689a: 68 c0 28 14 00 push $0x1428c0
11689f: 89 55 e0 mov %edx,-0x20(%ebp)
1168a2: e8 45 45 00 00 call 11adec <_Objects_Allocate>
1168a7: 89 45 e4 mov %eax,-0x1c(%ebp)
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
1168aa: 83 c4 10 add $0x10,%esp
1168ad: 85 c0 test %eax,%eax
1168af: 8b 55 e0 mov -0x20(%ebp),%edx
1168b2: 74 58 je 11690c <rtems_partition_create+0xf0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
1168b4: 8b 45 e4 mov -0x1c(%ebp),%eax
1168b7: 89 70 10 mov %esi,0x10(%eax)
the_partition->length = length;
1168ba: 89 50 14 mov %edx,0x14(%eax)
the_partition->buffer_size = buffer_size;
1168bd: 89 78 18 mov %edi,0x18(%eax)
the_partition->attribute_set = attribute_set;
1168c0: 8b 4d 18 mov 0x18(%ebp),%ecx
1168c3: 89 48 1c mov %ecx,0x1c(%eax)
the_partition->number_of_used_blocks = 0;
1168c6: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax)
_Chain_Initialize( &the_partition->Memory, starting_address,
1168cd: 57 push %edi
1168ce: 89 d0 mov %edx,%eax
1168d0: 31 d2 xor %edx,%edx
1168d2: f7 f7 div %edi
1168d4: 50 push %eax
1168d5: 56 push %esi
1168d6: 8b 45 e4 mov -0x1c(%ebp),%eax
1168d9: 83 c0 24 add $0x24,%eax
1168dc: 50 push %eax
1168dd: e8 9e 2f 00 00 call 119880 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1168e2: 8b 7d e4 mov -0x1c(%ebp),%edi
1168e5: 8b 47 08 mov 0x8(%edi),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1168e8: 0f b7 f0 movzwl %ax,%esi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1168eb: 8b 15 dc 28 14 00 mov 0x1428dc,%edx
1168f1: 89 3c b2 mov %edi,(%edx,%esi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1168f4: 89 5f 0c mov %ebx,0xc(%edi)
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
1168f7: 8b 55 1c mov 0x1c(%ebp),%edx
1168fa: 89 02 mov %eax,(%edx)
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
1168fc: e8 53 55 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116901: 83 c4 10 add $0x10,%esp
116904: 31 c0 xor %eax,%eax
116906: e9 66 ff ff ff jmp 116871 <rtems_partition_create+0x55>
11690b: 90 nop
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
11690c: e8 43 55 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
116911: b8 05 00 00 00 mov $0x5,%eax
116916: e9 56 ff ff ff jmp 116871 <rtems_partition_create+0x55>
00116988 <rtems_partition_get_buffer>:
rtems_status_code rtems_partition_get_buffer(
rtems_id id,
void **buffer
)
{
116988: 55 push %ebp
116989: 89 e5 mov %esp,%ebp
11698b: 56 push %esi
11698c: 53 push %ebx
11698d: 83 ec 20 sub $0x20,%esp
116990: 8b 5d 0c mov 0xc(%ebp),%ebx
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
116993: 85 db test %ebx,%ebx
116995: 74 59 je 1169f0 <rtems_partition_get_buffer+0x68>
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
116997: 52 push %edx
return RTEMS_INVALID_ADDRESS;
the_partition = _Partition_Get( id, &location );
116998: 8d 45 f4 lea -0xc(%ebp),%eax
11699b: 50 push %eax
11699c: ff 75 08 pushl 0x8(%ebp)
11699f: 68 c0 28 14 00 push $0x1428c0
1169a4: e8 33 49 00 00 call 11b2dc <_Objects_Get>
1169a9: 89 c6 mov %eax,%esi
switch ( location ) {
1169ab: 83 c4 10 add $0x10,%esp
1169ae: 8b 45 f4 mov -0xc(%ebp),%eax
1169b1: 85 c0 test %eax,%eax
1169b3: 75 2f jne 1169e4 <rtems_partition_get_buffer+0x5c>
*/
RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
Partition_Control *the_partition
)
{
return _Chain_Get( &the_partition->Memory );
1169b5: 83 ec 0c sub $0xc,%esp
1169b8: 8d 46 24 lea 0x24(%esi),%eax
1169bb: 50 push %eax
1169bc: e8 9b 2e 00 00 call 11985c <_Chain_Get>
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
1169c1: 83 c4 10 add $0x10,%esp
1169c4: 85 c0 test %eax,%eax
1169c6: 74 34 je 1169fc <rtems_partition_get_buffer+0x74>
the_partition->number_of_used_blocks += 1;
1169c8: ff 46 20 incl 0x20(%esi)
_Thread_Enable_dispatch();
1169cb: 89 45 e4 mov %eax,-0x1c(%ebp)
1169ce: e8 81 54 00 00 call 11be54 <_Thread_Enable_dispatch>
*buffer = the_buffer;
1169d3: 8b 45 e4 mov -0x1c(%ebp),%eax
1169d6: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
1169d8: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1169da: 8d 65 f8 lea -0x8(%ebp),%esp
1169dd: 5b pop %ebx
1169de: 5e pop %esi
1169df: c9 leave
1169e0: c3 ret
1169e1: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1169e4: b8 04 00 00 00 mov $0x4,%eax
}
1169e9: 8d 65 f8 lea -0x8(%ebp),%esp
1169ec: 5b pop %ebx
1169ed: 5e pop %esi
1169ee: c9 leave
1169ef: c3 ret
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
1169f0: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1169f5: 8d 65 f8 lea -0x8(%ebp),%esp
1169f8: 5b pop %ebx
1169f9: 5e pop %esi
1169fa: c9 leave
1169fb: c3 ret
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
1169fc: e8 53 54 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_UNSATISFIED;
116a01: b8 0d 00 00 00 mov $0xd,%eax
116a06: eb e1 jmp 1169e9 <rtems_partition_get_buffer+0x61>
00116a2c <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
116a2c: 55 push %ebp
116a2d: 89 e5 mov %esp,%ebp
116a2f: 56 push %esi
116a30: 53 push %ebx
116a31: 83 ec 14 sub $0x14,%esp
116a34: 8b 75 0c mov 0xc(%ebp),%esi
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
116a37: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
116a3a: 50 push %eax
116a3b: ff 75 08 pushl 0x8(%ebp)
116a3e: 68 c0 28 14 00 push $0x1428c0
116a43: e8 94 48 00 00 call 11b2dc <_Objects_Get>
116a48: 89 c3 mov %eax,%ebx
switch ( location ) {
116a4a: 83 c4 10 add $0x10,%esp
116a4d: 8b 45 f4 mov -0xc(%ebp),%eax
116a50: 85 c0 test %eax,%eax
116a52: 74 0c je 116a60 <rtems_partition_return_buffer+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116a54: b8 04 00 00 00 mov $0x4,%eax
}
116a59: 8d 65 f8 lea -0x8(%ebp),%esp
116a5c: 5b pop %ebx
116a5d: 5e pop %esi
116a5e: c9 leave
116a5f: c3 ret
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
116a60: 8b 43 10 mov 0x10(%ebx),%eax
ending = _Addresses_Add_offset( starting, the_partition->length );
116a63: 8b 53 14 mov 0x14(%ebx),%edx
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
116a66: 39 c6 cmp %eax,%esi
116a68: 72 3a jb 116aa4 <rtems_partition_return_buffer+0x78>
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
116a6a: 8d 14 10 lea (%eax,%edx,1),%edx
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
116a6d: 39 d6 cmp %edx,%esi
116a6f: 77 33 ja 116aa4 <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);
116a71: 89 f2 mov %esi,%edx
116a73: 29 c2 sub %eax,%edx
116a75: 89 d0 mov %edx,%eax
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
116a77: 31 d2 xor %edx,%edx
116a79: 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 ) &&
116a7c: 85 d2 test %edx,%edx
116a7e: 75 24 jne 116aa4 <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 );
116a80: 83 ec 08 sub $0x8,%esp
116a83: 56 push %esi
116a84: 8d 43 24 lea 0x24(%ebx),%eax
116a87: 50 push %eax
116a88: e8 93 2d 00 00 call 119820 <_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;
116a8d: ff 4b 20 decl 0x20(%ebx)
_Thread_Enable_dispatch();
116a90: e8 bf 53 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116a95: 83 c4 10 add $0x10,%esp
116a98: 31 c0 xor %eax,%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
116aa1: 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();
116aa4: e8 ab 53 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
116aa9: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116aae: 8d 65 f8 lea -0x8(%ebp),%esp
116ab1: 5b pop %ebx
116ab2: 5e pop %esi
116ab3: c9 leave
116ab4: c3 ret
00115e50 <rtems_port_create>:
void *internal_start,
void *external_start,
uint32_t length,
rtems_id *id
)
{
115e50: 55 push %ebp
115e51: 89 e5 mov %esp,%ebp
115e53: 57 push %edi
115e54: 56 push %esi
115e55: 53 push %ebx
115e56: 83 ec 1c sub $0x1c,%esp
115e59: 8b 5d 08 mov 0x8(%ebp),%ebx
115e5c: 8b 55 0c mov 0xc(%ebp),%edx
115e5f: 8b 7d 10 mov 0x10(%ebp),%edi
115e62: 8b 75 18 mov 0x18(%ebp),%esi
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
115e65: 85 db test %ebx,%ebx
115e67: 74 1b je 115e84 <rtems_port_create+0x34>
return RTEMS_INVALID_NAME;
if ( !id )
115e69: 85 f6 test %esi,%esi
115e6b: 74 08 je 115e75 <rtems_port_create+0x25>
* id - port id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_port_create(
115e6d: 89 f8 mov %edi,%eax
115e6f: 09 d0 or %edx,%eax
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !_Addresses_Is_aligned( internal_start ) ||
115e71: a8 03 test $0x3,%al
115e73: 74 1f je 115e94 <rtems_port_create+0x44>
!_Addresses_Is_aligned( external_start ) )
return RTEMS_INVALID_ADDRESS;
115e75: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
115e7a: 8d 65 f4 lea -0xc(%ebp),%esp
115e7d: 5b pop %ebx
115e7e: 5e pop %esi
115e7f: 5f pop %edi
115e80: c9 leave
115e81: c3 ret
115e82: 66 90 xchg %ax,%ax
)
{
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
115e84: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
115e89: 8d 65 f4 lea -0xc(%ebp),%esp
115e8c: 5b pop %ebx
115e8d: 5e pop %esi
115e8e: 5f pop %edi
115e8f: c9 leave
115e90: c3 ret
115e91: 8d 76 00 lea 0x0(%esi),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
115e94: a1 30 2a 14 00 mov 0x142a30,%eax
115e99: 40 inc %eax
115e9a: a3 30 2a 14 00 mov %eax,0x142a30
*/
RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
*_Dual_ported_memory_Allocate ( void )
{
return (Dual_ported_memory_Control *)
_Objects_Allocate( &_Dual_ported_memory_Information );
115e9f: 83 ec 0c sub $0xc,%esp
115ea2: 68 80 28 14 00 push $0x142880
115ea7: 89 55 e4 mov %edx,-0x1c(%ebp)
115eaa: e8 3d 4f 00 00 call 11adec <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
115eaf: 83 c4 10 add $0x10,%esp
115eb2: 85 c0 test %eax,%eax
115eb4: 8b 55 e4 mov -0x1c(%ebp),%edx
115eb7: 74 33 je 115eec <rtems_port_create+0x9c>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_port->internal_base = internal_start;
115eb9: 89 50 10 mov %edx,0x10(%eax)
the_port->external_base = external_start;
115ebc: 89 78 14 mov %edi,0x14(%eax)
the_port->length = length - 1;
115ebf: 8b 55 14 mov 0x14(%ebp),%edx
115ec2: 4a dec %edx
115ec3: 89 50 18 mov %edx,0x18(%eax)
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
115ec6: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
115ec9: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
115ecc: 8b 0d 9c 28 14 00 mov 0x14289c,%ecx
115ed2: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
115ed5: 89 58 0c mov %ebx,0xc(%eax)
&_Dual_ported_memory_Information,
&the_port->Object,
(Objects_Name) name
);
*id = the_port->Object.id;
115ed8: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
115eda: e8 75 5f 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115edf: 31 c0 xor %eax,%eax
}
115ee1: 8d 65 f4 lea -0xc(%ebp),%esp
115ee4: 5b pop %ebx
115ee5: 5e pop %esi
115ee6: 5f pop %edi
115ee7: c9 leave
115ee8: c3 ret
115ee9: 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();
115eec: e8 63 5f 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
115ef1: b8 05 00 00 00 mov $0x5,%eax
115ef6: eb 82 jmp 115e7a <rtems_port_create+0x2a>
00115ef8 <rtems_port_delete>:
*/
rtems_status_code rtems_port_delete(
rtems_id id
)
{
115ef8: 55 push %ebp
115ef9: 89 e5 mov %esp,%ebp
115efb: 83 ec 2c sub $0x2c,%esp
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
the_port = _Dual_ported_memory_Get( id, &location );
115efe: 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 );
115f01: 50 push %eax
115f02: ff 75 08 pushl 0x8(%ebp)
115f05: 68 80 28 14 00 push $0x142880
115f0a: e8 cd 53 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
115f0f: 83 c4 10 add $0x10,%esp
115f12: 8b 4d f4 mov -0xc(%ebp),%ecx
115f15: 85 c9 test %ecx,%ecx
115f17: 75 2f jne 115f48 <rtems_port_delete+0x50>
case OBJECTS_LOCAL:
_Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
115f19: 83 ec 08 sub $0x8,%esp
115f1c: 50 push %eax
115f1d: 68 80 28 14 00 push $0x142880
115f22: 89 45 e4 mov %eax,-0x1c(%ebp)
115f25: e8 3e 4f 00 00 call 11ae68 <_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 );
115f2a: 58 pop %eax
115f2b: 5a pop %edx
115f2c: 8b 45 e4 mov -0x1c(%ebp),%eax
115f2f: 50 push %eax
115f30: 68 80 28 14 00 push $0x142880
115f35: e8 26 52 00 00 call 11b160 <_Objects_Free>
_Dual_ported_memory_Free( the_port );
_Thread_Enable_dispatch();
115f3a: e8 15 5f 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115f3f: 83 c4 10 add $0x10,%esp
115f42: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115f44: c9 leave
115f45: c3 ret
115f46: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115f48: b8 04 00 00 00 mov $0x4,%eax
}
115f4d: c9 leave
115f4e: c3 ret
00115f50 <rtems_port_external_to_internal>:
rtems_status_code rtems_port_external_to_internal(
rtems_id id,
void *external,
void **internal
)
{
115f50: 55 push %ebp
115f51: 89 e5 mov %esp,%ebp
115f53: 56 push %esi
115f54: 53 push %ebx
115f55: 83 ec 10 sub $0x10,%esp
115f58: 8b 75 0c mov 0xc(%ebp),%esi
115f5b: 8b 5d 10 mov 0x10(%ebp),%ebx
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !internal )
115f5e: 85 db test %ebx,%ebx
115f60: 74 4e je 115fb0 <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 );
115f62: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
115f63: 8d 45 f4 lea -0xc(%ebp),%eax
115f66: 50 push %eax
115f67: ff 75 08 pushl 0x8(%ebp)
115f6a: 68 80 28 14 00 push $0x142880
115f6f: e8 68 53 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
115f74: 83 c4 10 add $0x10,%esp
115f77: 8b 55 f4 mov -0xc(%ebp),%edx
115f7a: 85 d2 test %edx,%edx
115f7c: 74 0e je 115f8c <rtems_port_external_to_internal+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
115f7e: b8 04 00 00 00 mov $0x4,%eax
}
115f83: 8d 65 f8 lea -0x8(%ebp),%esp
115f86: 5b pop %ebx
115f87: 5e pop %esi
115f88: c9 leave
115f89: c3 ret
115f8a: 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);
115f8c: 89 f2 mov %esi,%edx
115f8e: 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 )
115f91: 3b 50 18 cmp 0x18(%eax),%edx
115f94: 77 16 ja 115fac <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);
115f96: 03 50 10 add 0x10(%eax),%edx
115f99: 89 13 mov %edx,(%ebx)
*internal = external;
else
*internal = _Addresses_Add_offset( the_port->internal_base,
ending );
_Thread_Enable_dispatch();
115f9b: e8 b4 5e 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
115fa0: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115fa2: 8d 65 f8 lea -0x8(%ebp),%esp
115fa5: 5b pop %ebx
115fa6: 5e pop %esi
115fa7: c9 leave
115fa8: c3 ret
115fa9: 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;
115fac: 89 33 mov %esi,(%ebx)
115fae: eb eb jmp 115f9b <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;
115fb0: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
115fb5: 8d 65 f8 lea -0x8(%ebp),%esp
115fb8: 5b pop %ebx
115fb9: 5e pop %esi
115fba: c9 leave
115fbb: c3 ret
00115fe0 <rtems_port_internal_to_external>:
rtems_status_code rtems_port_internal_to_external(
rtems_id id,
void *internal,
void **external
)
{
115fe0: 55 push %ebp
115fe1: 89 e5 mov %esp,%ebp
115fe3: 56 push %esi
115fe4: 53 push %ebx
115fe5: 83 ec 10 sub $0x10,%esp
115fe8: 8b 75 0c mov 0xc(%ebp),%esi
115feb: 8b 5d 10 mov 0x10(%ebp),%ebx
register Dual_ported_memory_Control *the_port;
Objects_Locations location;
uint32_t ending;
if ( !external )
115fee: 85 db test %ebx,%ebx
115ff0: 74 4e je 116040 <rtems_port_internal_to_external+0x60><== NEVER TAKEN
115ff2: 51 push %ecx
return RTEMS_INVALID_ADDRESS;
the_port = _Dual_ported_memory_Get( id, &location );
115ff3: 8d 45 f4 lea -0xc(%ebp),%eax
115ff6: 50 push %eax
115ff7: ff 75 08 pushl 0x8(%ebp)
115ffa: 68 80 28 14 00 push $0x142880
115fff: e8 d8 52 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
116004: 83 c4 10 add $0x10,%esp
116007: 8b 55 f4 mov -0xc(%ebp),%edx
11600a: 85 d2 test %edx,%edx
11600c: 74 0e je 11601c <rtems_port_internal_to_external+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11600e: b8 04 00 00 00 mov $0x4,%eax
}
116013: 8d 65 f8 lea -0x8(%ebp),%esp
116016: 5b pop %ebx
116017: 5e pop %esi
116018: c9 leave
116019: c3 ret
11601a: 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);
11601c: 89 f2 mov %esi,%edx
11601e: 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 )
116021: 3b 50 18 cmp 0x18(%eax),%edx
116024: 77 16 ja 11603c <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);
116026: 03 50 14 add 0x14(%eax),%edx
116029: 89 13 mov %edx,(%ebx)
*external = internal;
else
*external = _Addresses_Add_offset( the_port->external_base,
ending );
_Thread_Enable_dispatch();
11602b: e8 24 5e 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116030: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116032: 8d 65 f8 lea -0x8(%ebp),%esp
116035: 5b pop %ebx
116036: 5e pop %esi
116037: c9 leave
116038: c3 ret
116039: 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;
11603c: 89 33 mov %esi,(%ebx)
11603e: eb eb jmp 11602b <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;
116040: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116045: 8d 65 f8 lea -0x8(%ebp),%esp
116048: 5b pop %ebx
116049: 5e pop %esi
11604a: c9 leave
11604b: c3 ret
00116ab8 <rtems_rate_monotonic_cancel>:
*/
rtems_status_code rtems_rate_monotonic_cancel(
rtems_id id
)
{
116ab8: 55 push %ebp
116ab9: 89 e5 mov %esp,%ebp
116abb: 53 push %ebx
116abc: 83 ec 18 sub $0x18,%esp
Rate_monotonic_Control *the_period;
Objects_Locations location;
the_period = _Rate_monotonic_Get( id, &location );
116abf: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
116ac2: 50 push %eax
116ac3: ff 75 08 pushl 0x8(%ebp)
116ac6: 68 00 29 14 00 push $0x142900
116acb: e8 0c 48 00 00 call 11b2dc <_Objects_Get>
116ad0: 89 c3 mov %eax,%ebx
switch ( location ) {
116ad2: 83 c4 10 add $0x10,%esp
116ad5: 8b 45 f4 mov -0xc(%ebp),%eax
116ad8: 85 c0 test %eax,%eax
116ada: 74 0c je 116ae8 <rtems_rate_monotonic_cancel+0x30>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
116adc: b8 04 00 00 00 mov $0x4,%eax
}
116ae1: 8b 5d fc mov -0x4(%ebp),%ebx
116ae4: c9 leave
116ae5: c3 ret
116ae6: 66 90 xchg %ax,%ax
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
116ae8: a1 d8 2f 14 00 mov 0x142fd8,%eax
116aed: 39 43 40 cmp %eax,0x40(%ebx)
116af0: 74 12 je 116b04 <rtems_rate_monotonic_cancel+0x4c>
_Thread_Enable_dispatch();
116af2: e8 5d 53 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
116af7: b8 17 00 00 00 mov $0x17,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
116afc: 8b 5d fc mov -0x4(%ebp),%ebx
116aff: c9 leave
116b00: c3 ret
116b01: 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 );
116b04: 83 ec 0c sub $0xc,%esp
116b07: 8d 43 10 lea 0x10(%ebx),%eax
116b0a: 50 push %eax
116b0b: e8 80 64 00 00 call 11cf90 <_Watchdog_Remove>
the_period->state = RATE_MONOTONIC_INACTIVE;
116b10: c7 43 38 00 00 00 00 movl $0x0,0x38(%ebx)
_Thread_Enable_dispatch();
116b17: e8 38 53 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
116b1c: 83 c4 10 add $0x10,%esp
116b1f: 31 c0 xor %eax,%eax
116b21: eb be jmp 116ae1 <rtems_rate_monotonic_cancel+0x29>
0010c340 <rtems_rate_monotonic_create>:
rtems_status_code rtems_rate_monotonic_create(
rtems_name name,
rtems_id *id
)
{
10c340: 55 push %ebp
10c341: 89 e5 mov %esp,%ebp
10c343: 57 push %edi
10c344: 56 push %esi
10c345: 53 push %ebx
10c346: 83 ec 1c sub $0x1c,%esp
10c349: 8b 5d 08 mov 0x8(%ebp),%ebx
10c34c: 8b 75 0c mov 0xc(%ebp),%esi
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
10c34f: 85 db test %ebx,%ebx
10c351: 0f 84 a9 00 00 00 je 10c400 <rtems_rate_monotonic_create+0xc0>
return RTEMS_INVALID_NAME;
if ( !id )
10c357: 85 f6 test %esi,%esi
10c359: 0f 84 c5 00 00 00 je 10c424 <rtems_rate_monotonic_create+0xe4>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10c35f: a1 50 b1 12 00 mov 0x12b150,%eax
10c364: 40 inc %eax
10c365: a3 50 b1 12 00 mov %eax,0x12b150
* 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 );
10c36a: 83 ec 0c sub $0xc,%esp
10c36d: 68 60 b0 12 00 push $0x12b060
10c372: e8 21 1f 00 00 call 10e298 <_Objects_Allocate>
10c377: 89 c2 mov %eax,%edx
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
10c379: 83 c4 10 add $0x10,%esp
10c37c: 85 c0 test %eax,%eax
10c37e: 0f 84 8c 00 00 00 je 10c410 <rtems_rate_monotonic_create+0xd0>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_period->owner = _Thread_Executing;
10c384: a1 f8 b6 12 00 mov 0x12b6f8,%eax
10c389: 89 42 40 mov %eax,0x40(%edx)
the_period->state = RATE_MONOTONIC_INACTIVE;
10c38c: 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;
10c393: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
10c39a: c7 42 2c 00 00 00 00 movl $0x0,0x2c(%edx)
the_watchdog->id = id;
10c3a1: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx)
the_watchdog->user_data = user_data;
10c3a8: 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 );
10c3af: 8d 42 54 lea 0x54(%edx),%eax
10c3b2: 89 45 e4 mov %eax,-0x1c(%ebp)
10c3b5: b9 38 00 00 00 mov $0x38,%ecx
10c3ba: 31 c0 xor %eax,%eax
10c3bc: 8b 7d e4 mov -0x1c(%ebp),%edi
10c3bf: f3 aa rep stos %al,%es:(%edi)
10c3c1: c7 42 5c ff ff ff 7f movl $0x7fffffff,0x5c(%edx)
10c3c8: c7 42 60 ff ff ff 7f movl $0x7fffffff,0x60(%edx)
10c3cf: c7 42 74 ff ff ff 7f movl $0x7fffffff,0x74(%edx)
10c3d6: 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 ),
10c3dd: 8b 42 08 mov 0x8(%edx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c3e0: 0f b7 f8 movzwl %ax,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c3e3: 8b 0d 7c b0 12 00 mov 0x12b07c,%ecx
10c3e9: 89 14 b9 mov %edx,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c3ec: 89 5a 0c mov %ebx,0xc(%edx)
&_Rate_monotonic_Information,
&the_period->Object,
(Objects_Name) name
);
*id = the_period->Object.id;
10c3ef: 89 06 mov %eax,(%esi)
_Thread_Enable_dispatch();
10c3f1: e8 b6 2f 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c3f6: 31 c0 xor %eax,%eax
}
10c3f8: 8d 65 f4 lea -0xc(%ebp),%esp
10c3fb: 5b pop %ebx
10c3fc: 5e pop %esi
10c3fd: 5f pop %edi
10c3fe: c9 leave
10c3ff: c3 ret
)
{
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10c400: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c405: 8d 65 f4 lea -0xc(%ebp),%esp
10c408: 5b pop %ebx
10c409: 5e pop %esi
10c40a: 5f pop %edi
10c40b: c9 leave
10c40c: c3 ret
10c40d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
_Thread_Enable_dispatch();
10c410: e8 97 2f 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10c415: b8 05 00 00 00 mov $0x5,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c41a: 8d 65 f4 lea -0xc(%ebp),%esp
10c41d: 5b pop %ebx
10c41e: 5e pop %esi
10c41f: 5f pop %edi
10c420: c9 leave
10c421: c3 ret
10c422: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10c424: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c429: 8d 65 f4 lea -0xc(%ebp),%esp
10c42c: 5b pop %ebx
10c42d: 5e pop %esi
10c42e: 5f pop %edi
10c42f: c9 leave
10c430: c3 ret
00112900 <rtems_rate_monotonic_get_status>:
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
rtems_rate_monotonic_period_status *status
)
{
112900: 55 push %ebp
112901: 89 e5 mov %esp,%ebp
112903: 53 push %ebx
112904: 83 ec 24 sub $0x24,%esp
112907: 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 )
11290a: 85 db test %ebx,%ebx
11290c: 0f 84 92 00 00 00 je 1129a4 <rtems_rate_monotonic_get_status+0xa4>
112912: 50 push %eax
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
112913: 8d 45 f4 lea -0xc(%ebp),%eax
112916: 50 push %eax
112917: ff 75 08 pushl 0x8(%ebp)
11291a: 68 60 b0 12 00 push $0x12b060
11291f: e8 10 bf ff ff call 10e834 <_Objects_Get>
switch ( location ) {
112924: 83 c4 10 add $0x10,%esp
112927: 8b 4d f4 mov -0xc(%ebp),%ecx
11292a: 85 c9 test %ecx,%ecx
11292c: 74 0a je 112938 <rtems_rate_monotonic_get_status+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11292e: b8 04 00 00 00 mov $0x4,%eax
}
112933: 8b 5d fc mov -0x4(%ebp),%ebx
112936: c9 leave
112937: c3 ret
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
112938: 8b 50 40 mov 0x40(%eax),%edx
11293b: 8b 52 08 mov 0x8(%edx),%edx
11293e: 89 13 mov %edx,(%ebx)
status->state = the_period->state;
112940: 8b 50 38 mov 0x38(%eax),%edx
112943: 89 53 04 mov %edx,0x4(%ebx)
/*
* If the period is inactive, there is no information.
*/
if ( status->state == RATE_MONOTONIC_INACTIVE ) {
112946: 85 d2 test %edx,%edx
112948: 75 2a jne 112974 <rtems_rate_monotonic_get_status+0x74>
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timespec_Set_to_zero( &status->since_last_period );
11294a: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx)
112951: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
_Timespec_Set_to_zero( &status->executed_since_last_period );
112958: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
11295f: 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();
112966: e8 41 ca ff ff call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11296b: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
11296d: 8b 5d fc mov -0x4(%ebp),%ebx
112970: c9 leave
112971: c3 ret
112972: 66 90 xchg %ax,%ax
} else {
/*
* Grab the current status.
*/
valid_status =
112974: 52 push %edx
_Rate_monotonic_Get_status(
112975: 8d 55 ec lea -0x14(%ebp),%edx
} else {
/*
* Grab the current status.
*/
valid_status =
112978: 52 push %edx
_Rate_monotonic_Get_status(
112979: 8d 55 e4 lea -0x1c(%ebp),%edx
} else {
/*
* Grab the current status.
*/
valid_status =
11297c: 52 push %edx
11297d: 50 push %eax
11297e: e8 d5 9a ff ff call 10c458 <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
112983: 83 c4 10 add $0x10,%esp
112986: 84 c0 test %al,%al
112988: 74 26 je 1129b0 <rtems_rate_monotonic_get_status+0xb0>
_Thread_Enable_dispatch();
return RTEMS_NOT_DEFINED;
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec(
11298a: 8b 45 e4 mov -0x1c(%ebp),%eax
11298d: 8b 55 e8 mov -0x18(%ebp),%edx
112990: 89 43 08 mov %eax,0x8(%ebx)
112993: 89 53 0c mov %edx,0xc(%ebx)
&since_last_period, &status->since_last_period
);
_Timestamp_To_timespec(
112996: 8b 45 ec mov -0x14(%ebp),%eax
112999: 8b 55 f0 mov -0x10(%ebp),%edx
11299c: 89 43 10 mov %eax,0x10(%ebx)
11299f: 89 53 14 mov %edx,0x14(%ebx)
1129a2: eb c2 jmp 112966 <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;
1129a4: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
1129a9: 8b 5d fc mov -0x4(%ebp),%ebx
1129ac: c9 leave
1129ad: c3 ret
1129ae: 66 90 xchg %ax,%ax
valid_status =
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
_Thread_Enable_dispatch();
1129b0: e8 f7 c9 ff ff call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
1129b5: b8 0b 00 00 00 mov $0xb,%eax
1129ba: e9 74 ff ff ff jmp 112933 <rtems_rate_monotonic_get_status+0x33>
0010c654 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
10c654: 55 push %ebp
10c655: 89 e5 mov %esp,%ebp
10c657: 57 push %edi
10c658: 56 push %esi
10c659: 53 push %ebx
10c65a: 83 ec 30 sub $0x30,%esp
10c65d: 8b 5d 08 mov 0x8(%ebp),%ebx
10c660: 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 );
10c663: 8d 45 e4 lea -0x1c(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
10c666: 50 push %eax
10c667: 53 push %ebx
10c668: 68 60 b0 12 00 push $0x12b060
10c66d: e8 c2 21 00 00 call 10e834 <_Objects_Get>
switch ( location ) {
10c672: 83 c4 10 add $0x10,%esp
10c675: 8b 55 e4 mov -0x1c(%ebp),%edx
10c678: 85 d2 test %edx,%edx
10c67a: 74 10 je 10c68c <rtems_rate_monotonic_period+0x38>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c67c: b8 04 00 00 00 mov $0x4,%eax
}
10c681: 8d 65 f4 lea -0xc(%ebp),%esp
10c684: 5b pop %ebx
10c685: 5e pop %esi
10c686: 5f pop %edi
10c687: c9 leave
10c688: c3 ret
10c689: 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 ) ) {
10c68c: 8b 15 f8 b6 12 00 mov 0x12b6f8,%edx
10c692: 39 50 40 cmp %edx,0x40(%eax)
10c695: 74 15 je 10c6ac <rtems_rate_monotonic_period+0x58>
_Thread_Enable_dispatch();
10c697: e8 10 2d 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
10c69c: b8 17 00 00 00 mov $0x17,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c6a1: 8d 65 f4 lea -0xc(%ebp),%esp
10c6a4: 5b pop %ebx
10c6a5: 5e pop %esi
10c6a6: 5f pop %edi
10c6a7: c9 leave
10c6a8: c3 ret
10c6a9: 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 ) {
10c6ac: 85 f6 test %esi,%esi
10c6ae: 75 1c jne 10c6cc <rtems_rate_monotonic_period+0x78>
switch ( the_period->state ) {
10c6b0: 8b 40 38 mov 0x38(%eax),%eax
10c6b3: 83 f8 04 cmp $0x4,%eax
10c6b6: 77 6c ja 10c724 <rtems_rate_monotonic_period+0xd0><== NEVER TAKEN
10c6b8: 8b 04 85 1c 3d 12 00 mov 0x123d1c(,%eax,4),%eax
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
10c6bf: 89 45 d4 mov %eax,-0x2c(%ebp)
10c6c2: e8 e5 2c 00 00 call 10f3ac <_Thread_Enable_dispatch>
return( return_value );
10c6c7: 8b 45 d4 mov -0x2c(%ebp),%eax
10c6ca: eb b5 jmp 10c681 <rtems_rate_monotonic_period+0x2d>
}
_ISR_Disable( level );
10c6cc: 9c pushf
10c6cd: fa cli
10c6ce: 5f pop %edi
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
10c6cf: 8b 50 38 mov 0x38(%eax),%edx
10c6d2: 85 d2 test %edx,%edx
10c6d4: 74 52 je 10c728 <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 ) {
10c6d6: 83 fa 02 cmp $0x2,%edx
10c6d9: 0f 84 9e 00 00 00 je 10c77d <rtems_rate_monotonic_period+0x129>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
10c6df: 83 fa 04 cmp $0x4,%edx
10c6e2: 75 98 jne 10c67c <rtems_rate_monotonic_period+0x28><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
10c6e4: 83 ec 0c sub $0xc,%esp
10c6e7: 50 push %eax
10c6e8: 89 45 d4 mov %eax,-0x2c(%ebp)
10c6eb: e8 74 fe ff ff call 10c564 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
10c6f0: 57 push %edi
10c6f1: 9d popf
the_period->state = RATE_MONOTONIC_ACTIVE;
10c6f2: 8b 45 d4 mov -0x2c(%ebp),%eax
10c6f5: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
the_period->next_length = length;
10c6fc: 89 70 3c mov %esi,0x3c(%eax)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c6ff: 89 70 1c mov %esi,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c702: 5b pop %ebx
10c703: 5e pop %esi
_Watchdog_Insert_ticks( &the_period->Timer, length );
10c704: 83 c0 10 add $0x10,%eax
10c707: 50 push %eax
10c708: 68 20 b2 12 00 push $0x12b220
10c70d: e8 0a 3b 00 00 call 11021c <_Watchdog_Insert>
_Thread_Enable_dispatch();
10c712: e8 95 2c 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
10c717: 83 c4 10 add $0x10,%esp
10c71a: b8 06 00 00 00 mov $0x6,%eax
10c71f: e9 5d ff ff ff jmp 10c681 <rtems_rate_monotonic_period+0x2d>
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
switch ( the_period->state ) {
10c724: 31 c0 xor %eax,%eax
10c726: eb 97 jmp 10c6bf <rtems_rate_monotonic_period+0x6b><== NOT EXECUTED
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
10c728: 57 push %edi
10c729: 9d popf
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
10c72a: 83 ec 0c sub $0xc,%esp
10c72d: 50 push %eax
10c72e: 89 45 d4 mov %eax,-0x2c(%ebp)
10c731: e8 ba fd ff ff call 10c4f0 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
10c736: 8b 45 d4 mov -0x2c(%ebp),%eax
10c739: 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;
10c740: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10c747: c7 40 2c ac ca 10 00 movl $0x10caac,0x2c(%eax)
the_watchdog->id = id;
10c74e: 89 58 30 mov %ebx,0x30(%eax)
the_watchdog->user_data = user_data;
10c751: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax)
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
10c758: 89 70 3c mov %esi,0x3c(%eax)
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c75b: 89 70 1c mov %esi,0x1c(%eax)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c75e: 5e pop %esi
10c75f: 5f pop %edi
_Watchdog_Insert_ticks( &the_period->Timer, length );
10c760: 83 c0 10 add $0x10,%eax
10c763: 50 push %eax
10c764: 68 20 b2 12 00 push $0x12b220
10c769: e8 ae 3a 00 00 call 11021c <_Watchdog_Insert>
_Thread_Enable_dispatch();
10c76e: e8 39 2c 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c773: 83 c4 10 add $0x10,%esp
10c776: 31 c0 xor %eax,%eax
10c778: e9 04 ff ff ff jmp 10c681 <rtems_rate_monotonic_period+0x2d>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
10c77d: 83 ec 0c sub $0xc,%esp
10c780: 50 push %eax
10c781: 89 45 d4 mov %eax,-0x2c(%ebp)
10c784: e8 db fd ff ff call 10c564 <_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;
10c789: 8b 45 d4 mov -0x2c(%ebp),%eax
10c78c: c7 40 38 01 00 00 00 movl $0x1,0x38(%eax)
the_period->next_length = length;
10c793: 89 70 3c mov %esi,0x3c(%eax)
_ISR_Enable( level );
10c796: 57 push %edi
10c797: 9d popf
_Thread_Executing->Wait.id = the_period->Object.id;
10c798: 8b 15 f8 b6 12 00 mov 0x12b6f8,%edx
10c79e: 8b 48 08 mov 0x8(%eax),%ecx
10c7a1: 89 4a 20 mov %ecx,0x20(%edx)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
10c7a4: 59 pop %ecx
10c7a5: 5b pop %ebx
10c7a6: 68 00 40 00 00 push $0x4000
10c7ab: 52 push %edx
10c7ac: 89 45 d4 mov %eax,-0x2c(%ebp)
10c7af: e8 18 34 00 00 call 10fbcc <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
10c7b4: 9c pushf
10c7b5: fa cli
10c7b6: 59 pop %ecx
local_state = the_period->state;
10c7b7: 8b 45 d4 mov -0x2c(%ebp),%eax
10c7ba: 8b 50 38 mov 0x38(%eax),%edx
the_period->state = RATE_MONOTONIC_ACTIVE;
10c7bd: c7 40 38 02 00 00 00 movl $0x2,0x38(%eax)
_ISR_Enable( level );
10c7c4: 51 push %ecx
10c7c5: 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 )
10c7c6: 83 c4 10 add $0x10,%esp
10c7c9: 83 fa 03 cmp $0x3,%edx
10c7cc: 74 0c je 10c7da <rtems_rate_monotonic_period+0x186>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
10c7ce: e8 d9 2b 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c7d3: 31 c0 xor %eax,%eax
10c7d5: e9 a7 fe ff ff jmp 10c681 <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 );
10c7da: 57 push %edi
10c7db: 57 push %edi
10c7dc: 68 00 40 00 00 push $0x4000
10c7e1: ff 35 f8 b6 12 00 pushl 0x12b6f8
10c7e7: e8 5c 28 00 00 call 10f048 <_Thread_Clear_state>
10c7ec: 83 c4 10 add $0x10,%esp
10c7ef: eb dd jmp 10c7ce <rtems_rate_monotonic_period+0x17a>
0010c7f4 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
10c7f4: 55 push %ebp
10c7f5: 89 e5 mov %esp,%ebp
10c7f7: 57 push %edi
10c7f8: 56 push %esi
10c7f9: 53 push %ebx
10c7fa: 81 ec 8c 00 00 00 sub $0x8c,%esp
10c800: 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 )
10c803: 8b 7d 0c mov 0xc(%ebp),%edi
10c806: 85 ff test %edi,%edi
10c808: 0f 84 be 00 00 00 je 10c8cc <rtems_rate_monotonic_report_statistics_with_plugin+0xd8><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
10c80e: 83 ec 08 sub $0x8,%esp
10c811: 68 30 3d 12 00 push $0x123d30
10c816: 56 push %esi
10c817: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
10c81a: 59 pop %ecx
10c81b: 5b pop %ebx
10c81c: 68 68 3d 12 00 push $0x123d68
10c821: 56 push %esi
10c822: ff 55 0c call *0xc(%ebp)
(*print)( context, "--- Wall times are in seconds ---\n" );
10c825: 58 pop %eax
10c826: 5a pop %edx
10c827: 68 8c 3d 12 00 push $0x123d8c
10c82c: 56 push %esi
10c82d: ff 55 0c call *0xc(%ebp)
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
10c830: 5b pop %ebx
10c831: 5f pop %edi
10c832: 68 b0 3d 12 00 push $0x123db0
10c837: 56 push %esi
10c838: ff 55 0c call *0xc(%ebp)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
10c83b: 5a pop %edx
10c83c: 59 pop %ecx
10c83d: 68 fc 3d 12 00 push $0x123dfc
10c842: 56 push %esi
10c843: 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 ;
10c846: 8b 1d 68 b0 12 00 mov 0x12b068,%ebx
10c84c: 83 c4 10 add $0x10,%esp
10c84f: 3b 1d 6c b0 12 00 cmp 0x12b06c,%ebx
10c855: 77 75 ja 10c8cc <rtems_rate_monotonic_report_statistics_with_plugin+0xd8><== NEVER TAKEN
10c857: 8d 7d 88 lea -0x78(%ebp),%edi
10c85a: eb 09 jmp 10c865 <rtems_rate_monotonic_report_statistics_with_plugin+0x71>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
10c85c: 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 ;
10c85d: 39 1d 6c b0 12 00 cmp %ebx,0x12b06c
10c863: 72 67 jb 10c8cc <rtems_rate_monotonic_report_statistics_with_plugin+0xd8>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
10c865: 83 ec 08 sub $0x8,%esp
10c868: 57 push %edi
10c869: 53 push %ebx
10c86a: e8 e5 5f 00 00 call 112854 <rtems_rate_monotonic_get_statistics>
if ( status != RTEMS_SUCCESSFUL )
10c86f: 83 c4 10 add $0x10,%esp
10c872: 85 c0 test %eax,%eax
10c874: 75 e6 jne 10c85c <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 );
10c876: 83 ec 08 sub $0x8,%esp
10c879: 8d 45 c0 lea -0x40(%ebp),%eax
10c87c: 50 push %eax
10c87d: 53 push %ebx
10c87e: e8 7d 60 00 00 call 112900 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
10c883: 83 c4 0c add $0xc,%esp
10c886: 8d 55 e3 lea -0x1d(%ebp),%edx
10c889: 52 push %edx
10c88a: 6a 05 push $0x5
10c88c: ff 75 c0 pushl -0x40(%ebp)
10c88f: e8 b4 02 00 00 call 10cb48 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
10c894: 59 pop %ecx
10c895: 58 pop %eax
10c896: ff 75 8c pushl -0x74(%ebp)
10c899: ff 75 88 pushl -0x78(%ebp)
10c89c: 8d 45 e3 lea -0x1d(%ebp),%eax
10c89f: 50 push %eax
10c8a0: 53 push %ebx
10c8a1: 68 4e 3d 12 00 push $0x123d4e
10c8a6: 56 push %esi
10c8a7: ff 55 0c call *0xc(%ebp)
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
10c8aa: 8b 45 88 mov -0x78(%ebp),%eax
10c8ad: 83 c4 20 add $0x20,%esp
10c8b0: 85 c0 test %eax,%eax
10c8b2: 75 20 jne 10c8d4 <rtems_rate_monotonic_report_statistics_with_plugin+0xe0>
(*print)( context, "\n" );
10c8b4: 83 ec 08 sub $0x8,%esp
10c8b7: 68 31 1e 12 00 push $0x121e31
10c8bc: 56 push %esi
10c8bd: ff 55 0c call *0xc(%ebp)
continue;
10c8c0: 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++ ) {
10c8c3: 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 ;
10c8c4: 39 1d 6c b0 12 00 cmp %ebx,0x12b06c
10c8ca: 73 99 jae 10c865 <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
}
}
}
10c8cc: 8d 65 f4 lea -0xc(%ebp),%esp
10c8cf: 5b pop %ebx
10c8d0: 5e pop %esi
10c8d1: 5f pop %edi
10c8d2: c9 leave
10c8d3: 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 );
10c8d4: 52 push %edx
10c8d5: 8d 55 d8 lea -0x28(%ebp),%edx
10c8d8: 52 push %edx
10c8d9: 50 push %eax
10c8da: 8d 45 a0 lea -0x60(%ebp),%eax
10c8dd: 50 push %eax
10c8de: e8 99 35 00 00 call 10fe7c <_Timespec_Divide_by_integer>
(*print)( context,
10c8e3: b9 d3 4d 62 10 mov $0x10624dd3,%ecx
10c8e8: 8b 45 dc mov -0x24(%ebp),%eax
10c8eb: f7 e9 imul %ecx
10c8ed: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c8f3: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c8f9: c1 f8 06 sar $0x6,%eax
10c8fc: 8b 55 dc mov -0x24(%ebp),%edx
10c8ff: c1 fa 1f sar $0x1f,%edx
10c902: 29 d0 sub %edx,%eax
10c904: 50 push %eax
10c905: ff 75 d8 pushl -0x28(%ebp)
10c908: 8b 45 9c mov -0x64(%ebp),%eax
10c90b: f7 e9 imul %ecx
10c90d: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c913: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c919: c1 f8 06 sar $0x6,%eax
10c91c: 8b 55 9c mov -0x64(%ebp),%edx
10c91f: c1 fa 1f sar $0x1f,%edx
10c922: 29 d0 sub %edx,%eax
10c924: 50 push %eax
10c925: ff 75 98 pushl -0x68(%ebp)
10c928: 8b 45 94 mov -0x6c(%ebp),%eax
10c92b: f7 e9 imul %ecx
10c92d: 89 85 70 ff ff ff mov %eax,-0x90(%ebp)
10c933: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c939: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c93f: c1 f8 06 sar $0x6,%eax
10c942: 8b 55 94 mov -0x6c(%ebp),%edx
10c945: c1 fa 1f sar $0x1f,%edx
10c948: 29 d0 sub %edx,%eax
10c94a: 50 push %eax
10c94b: ff 75 90 pushl -0x70(%ebp)
10c94e: 68 48 3e 12 00 push $0x123e48
10c953: 56 push %esi
10c954: 89 4d 84 mov %ecx,-0x7c(%ebp)
10c957: 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);
10c95a: 83 c4 2c add $0x2c,%esp
10c95d: 8d 55 d8 lea -0x28(%ebp),%edx
10c960: 52 push %edx
10c961: ff 75 88 pushl -0x78(%ebp)
10c964: 8d 45 b8 lea -0x48(%ebp),%eax
10c967: 50 push %eax
10c968: e8 0f 35 00 00 call 10fe7c <_Timespec_Divide_by_integer>
(*print)( context,
10c96d: 8b 4d 84 mov -0x7c(%ebp),%ecx
10c970: 8b 45 dc mov -0x24(%ebp),%eax
10c973: f7 e9 imul %ecx
10c975: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c97b: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c981: c1 f8 06 sar $0x6,%eax
10c984: 8b 55 dc mov -0x24(%ebp),%edx
10c987: c1 fa 1f sar $0x1f,%edx
10c98a: 29 d0 sub %edx,%eax
10c98c: 50 push %eax
10c98d: ff 75 d8 pushl -0x28(%ebp)
10c990: 8b 45 b4 mov -0x4c(%ebp),%eax
10c993: f7 e9 imul %ecx
10c995: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c99b: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c9a1: c1 f8 06 sar $0x6,%eax
10c9a4: 8b 55 b4 mov -0x4c(%ebp),%edx
10c9a7: c1 fa 1f sar $0x1f,%edx
10c9aa: 29 d0 sub %edx,%eax
10c9ac: 50 push %eax
10c9ad: ff 75 b0 pushl -0x50(%ebp)
10c9b0: 8b 45 ac mov -0x54(%ebp),%eax
10c9b3: f7 e9 imul %ecx
10c9b5: 89 85 70 ff ff ff mov %eax,-0x90(%ebp)
10c9bb: 89 95 74 ff ff ff mov %edx,-0x8c(%ebp)
10c9c1: 8b 85 74 ff ff ff mov -0x8c(%ebp),%eax
10c9c7: c1 f8 06 sar $0x6,%eax
10c9ca: 8b 55 ac mov -0x54(%ebp),%edx
10c9cd: c1 fa 1f sar $0x1f,%edx
10c9d0: 29 d0 sub %edx,%eax
10c9d2: 50 push %eax
10c9d3: ff 75 a8 pushl -0x58(%ebp)
10c9d6: 68 68 3e 12 00 push $0x123e68
10c9db: 56 push %esi
10c9dc: ff 55 0c call *0xc(%ebp)
10c9df: 83 c4 30 add $0x30,%esp
10c9e2: e9 75 fe ff ff jmp 10c85c <rtems_rate_monotonic_report_statistics_with_plugin+0x68>
0010ca00 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
10ca00: 55 push %ebp
10ca01: 89 e5 mov %esp,%ebp
10ca03: 53 push %ebx
10ca04: 83 ec 04 sub $0x4,%esp
10ca07: a1 50 b1 12 00 mov 0x12b150,%eax
10ca0c: 40 inc %eax
10ca0d: a3 50 b1 12 00 mov %eax,0x12b150
/*
* 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 ;
10ca12: 8b 1d 68 b0 12 00 mov 0x12b068,%ebx
10ca18: 3b 1d 6c b0 12 00 cmp 0x12b06c,%ebx
10ca1e: 77 15 ja 10ca35 <rtems_rate_monotonic_reset_all_statistics+0x35><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
10ca20: 83 ec 0c sub $0xc,%esp
10ca23: 53 push %ebx
10ca24: e8 17 00 00 00 call 10ca40 <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++ ) {
10ca29: 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 ;
10ca2a: 83 c4 10 add $0x10,%esp
10ca2d: 39 1d 6c b0 12 00 cmp %ebx,0x12b06c
10ca33: 73 eb jae 10ca20 <rtems_rate_monotonic_reset_all_statistics+0x20>
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
10ca35: 8b 5d fc mov -0x4(%ebp),%ebx
10ca38: c9 leave
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
10ca39: e9 6e 29 00 00 jmp 10f3ac <_Thread_Enable_dispatch>
0010ca40 <rtems_rate_monotonic_reset_statistics>:
*/
rtems_status_code rtems_rate_monotonic_reset_statistics(
rtems_id id
)
{
10ca40: 55 push %ebp
10ca41: 89 e5 mov %esp,%ebp
10ca43: 57 push %edi
10ca44: 53 push %ebx
10ca45: 83 ec 14 sub $0x14,%esp
Objects_Locations location;
Rate_monotonic_Control *the_period;
the_period = _Rate_monotonic_Get( id, &location );
10ca48: 8d 45 f4 lea -0xc(%ebp),%eax
10ca4b: 50 push %eax
10ca4c: ff 75 08 pushl 0x8(%ebp)
10ca4f: 68 60 b0 12 00 push $0x12b060
10ca54: e8 db 1d 00 00 call 10e834 <_Objects_Get>
10ca59: 89 c2 mov %eax,%edx
switch ( location ) {
10ca5b: 83 c4 10 add $0x10,%esp
10ca5e: 8b 45 f4 mov -0xc(%ebp),%eax
10ca61: 85 c0 test %eax,%eax
10ca63: 75 3b jne 10caa0 <rtems_rate_monotonic_reset_statistics+0x60>
case OBJECTS_LOCAL:
_Rate_monotonic_Reset_statistics( the_period );
10ca65: 8d 5a 54 lea 0x54(%edx),%ebx
10ca68: b9 38 00 00 00 mov $0x38,%ecx
10ca6d: 31 c0 xor %eax,%eax
10ca6f: 89 df mov %ebx,%edi
10ca71: f3 aa rep stos %al,%es:(%edi)
10ca73: c7 42 5c ff ff ff 7f movl $0x7fffffff,0x5c(%edx)
10ca7a: c7 42 60 ff ff ff 7f movl $0x7fffffff,0x60(%edx)
10ca81: c7 42 74 ff ff ff 7f movl $0x7fffffff,0x74(%edx)
10ca88: c7 42 78 ff ff ff 7f movl $0x7fffffff,0x78(%edx)
_Thread_Enable_dispatch();
10ca8f: e8 18 29 00 00 call 10f3ac <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ca94: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ca96: 8d 65 f8 lea -0x8(%ebp),%esp
10ca99: 5b pop %ebx
10ca9a: 5f pop %edi
10ca9b: c9 leave
10ca9c: c3 ret
10ca9d: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10caa0: b8 04 00 00 00 mov $0x4,%eax
}
10caa5: 8d 65 f8 lea -0x8(%ebp),%esp
10caa8: 5b pop %ebx
10caa9: 5f pop %edi
10caaa: c9 leave
10caab: c3 ret
0011724c <rtems_region_create>:
uintptr_t length,
uintptr_t page_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
11724c: 55 push %ebp
11724d: 89 e5 mov %esp,%ebp
11724f: 57 push %edi
117250: 56 push %esi
117251: 53 push %ebx
117252: 83 ec 1c sub $0x1c,%esp
117255: 8b 7d 08 mov 0x8(%ebp),%edi
117258: 8b 75 0c mov 0xc(%ebp),%esi
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
11725b: 85 ff test %edi,%edi
11725d: 0f 84 c1 00 00 00 je 117324 <rtems_region_create+0xd8>
return RTEMS_INVALID_NAME;
if ( !starting_address )
117263: 85 f6 test %esi,%esi
117265: 0f 84 e1 00 00 00 je 11734c <rtems_region_create+0x100>
return RTEMS_INVALID_ADDRESS;
if ( !id )
11726b: 8b 45 1c mov 0x1c(%ebp),%eax
11726e: 85 c0 test %eax,%eax
117270: 0f 84 d6 00 00 00 je 11734c <rtems_region_create+0x100>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
117276: 83 ec 0c sub $0xc,%esp
117279: ff 35 e0 2a 14 00 pushl 0x142ae0
11727f: e8 24 25 00 00 call 1197a8 <_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 );
117284: c7 04 24 40 29 14 00 movl $0x142940,(%esp)
11728b: e8 5c 3b 00 00 call 11adec <_Objects_Allocate>
117290: 89 c3 mov %eax,%ebx
the_region = _Region_Allocate();
if ( !the_region )
117292: 83 c4 10 add $0x10,%esp
117295: 85 c0 test %eax,%eax
117297: 0f 84 bf 00 00 00 je 11735c <rtems_region_create+0x110>
return_status = RTEMS_TOO_MANY;
else {
the_region->maximum_segment_size = _Heap_Initialize(
11729d: ff 75 14 pushl 0x14(%ebp)
1172a0: ff 75 10 pushl 0x10(%ebp)
1172a3: 56 push %esi
1172a4: 8d 40 68 lea 0x68(%eax),%eax
1172a7: 50 push %eax
1172a8: e8 4b 37 00 00 call 11a9f8 <_Heap_Initialize>
1172ad: 89 43 5c mov %eax,0x5c(%ebx)
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
1172b0: 83 c4 10 add $0x10,%esp
1172b3: 85 c0 test %eax,%eax
1172b5: 74 7d je 117334 <rtems_region_create+0xe8>
return_status = RTEMS_INVALID_SIZE;
}
else {
the_region->starting_address = starting_address;
1172b7: 89 73 50 mov %esi,0x50(%ebx)
the_region->length = length;
1172ba: 8b 45 10 mov 0x10(%ebp),%eax
1172bd: 89 43 54 mov %eax,0x54(%ebx)
the_region->page_size = page_size;
1172c0: 8b 55 14 mov 0x14(%ebp),%edx
1172c3: 89 53 58 mov %edx,0x58(%ebx)
the_region->attribute_set = attribute_set;
1172c6: 8b 45 18 mov 0x18(%ebp),%eax
1172c9: 89 43 60 mov %eax,0x60(%ebx)
the_region->number_of_used_blocks = 0;
1172cc: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx)
_Thread_queue_Initialize(
1172d3: 6a 06 push $0x6
1172d5: 6a 40 push $0x40
1172d7: a8 04 test $0x4,%al
1172d9: 0f 95 c0 setne %al
1172dc: 0f b6 c0 movzbl %al,%eax
1172df: 50 push %eax
1172e0: 8d 43 10 lea 0x10(%ebx),%eax
1172e3: 50 push %eax
1172e4: e8 77 52 00 00 call 11c560 <_Thread_queue_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
1172e9: 8b 43 08 mov 0x8(%ebx),%eax
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
1172ec: 0f b7 c8 movzwl %ax,%ecx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
1172ef: 8b 15 5c 29 14 00 mov 0x14295c,%edx
1172f5: 89 1c 8a mov %ebx,(%edx,%ecx,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
1172f8: 89 7b 0c mov %edi,0xc(%ebx)
&_Region_Information,
&the_region->Object,
(Objects_Name) name
);
*id = the_region->Object.id;
1172fb: 8b 55 1c mov 0x1c(%ebp),%edx
1172fe: 89 02 mov %eax,(%edx)
117300: 83 c4 10 add $0x10,%esp
return_status = RTEMS_SUCCESSFUL;
117303: 31 c0 xor %eax,%eax
}
}
_RTEMS_Unlock_allocator();
117305: 83 ec 0c sub $0xc,%esp
117308: ff 35 e0 2a 14 00 pushl 0x142ae0
11730e: 89 45 e4 mov %eax,-0x1c(%ebp)
117311: e8 da 24 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
117316: 83 c4 10 add $0x10,%esp
117319: 8b 45 e4 mov -0x1c(%ebp),%eax
}
11731c: 8d 65 f4 lea -0xc(%ebp),%esp
11731f: 5b pop %ebx
117320: 5e pop %esi
117321: 5f pop %edi
117322: c9 leave
117323: c3 ret
{
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
117324: b8 03 00 00 00 mov $0x3,%eax
}
}
_RTEMS_Unlock_allocator();
return return_status;
}
117329: 8d 65 f4 lea -0xc(%ebp),%esp
11732c: 5b pop %ebx
11732d: 5e pop %esi
11732e: 5f pop %edi
11732f: c9 leave
117330: c3 ret
117331: 8d 76 00 lea 0x0(%esi),%esi
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
117334: 83 ec 08 sub $0x8,%esp
117337: 53 push %ebx
117338: 68 40 29 14 00 push $0x142940
11733d: e8 1e 3e 00 00 call 11b160 <_Objects_Free>
117342: 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;
117345: b8 08 00 00 00 mov $0x8,%eax
11734a: eb b9 jmp 117305 <rtems_region_create+0xb9>
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
11734c: b8 09 00 00 00 mov $0x9,%eax
}
}
_RTEMS_Unlock_allocator();
return return_status;
}
117351: 8d 65 f4 lea -0xc(%ebp),%esp
117354: 5b pop %ebx
117355: 5e pop %esi
117356: 5f pop %edi
117357: c9 leave
117358: c3 ret
117359: 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;
11735c: b8 05 00 00 00 mov $0x5,%eax
117361: eb a2 jmp 117305 <rtems_region_create+0xb9>
00117364 <rtems_region_delete>:
*/
rtems_status_code rtems_region_delete(
rtems_id id
)
{
117364: 55 push %ebp
117365: 89 e5 mov %esp,%ebp
117367: 53 push %ebx
117368: 83 ec 30 sub $0x30,%esp
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
_RTEMS_Lock_allocator();
11736b: ff 35 e0 2a 14 00 pushl 0x142ae0
117371: e8 32 24 00 00 call 1197a8 <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
117376: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117379: 8d 45 f4 lea -0xc(%ebp),%eax
11737c: 50 push %eax
11737d: ff 75 08 pushl 0x8(%ebp)
117380: 68 40 29 14 00 push $0x142940
117385: e8 16 3f 00 00 call 11b2a0 <_Objects_Get_no_protection>
switch ( location ) {
11738a: 83 c4 10 add $0x10,%esp
11738d: 8b 5d f4 mov -0xc(%ebp),%ebx
117390: 85 db test %ebx,%ebx
117392: 74 1c je 1173b0 <rtems_region_delete+0x4c>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117394: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117399: 83 ec 0c sub $0xc,%esp
11739c: ff 35 e0 2a 14 00 pushl 0x142ae0
1173a2: e8 49 24 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
}
1173a7: 89 d8 mov %ebx,%eax
1173a9: 8b 5d fc mov -0x4(%ebp),%ebx
1173ac: c9 leave
1173ad: c3 ret
1173ae: 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 )
1173b0: 8b 48 64 mov 0x64(%eax),%ecx
1173b3: 85 c9 test %ecx,%ecx
1173b5: 74 09 je 1173c0 <rtems_region_delete+0x5c>
return_status = RTEMS_RESOURCE_IN_USE;
1173b7: bb 0c 00 00 00 mov $0xc,%ebx
1173bc: eb db jmp 117399 <rtems_region_delete+0x35>
1173be: 66 90 xchg %ax,%ax
else {
_Objects_Close( &_Region_Information, &the_region->Object );
1173c0: 83 ec 08 sub $0x8,%esp
1173c3: 50 push %eax
1173c4: 68 40 29 14 00 push $0x142940
1173c9: 89 45 e4 mov %eax,-0x1c(%ebp)
1173cc: e8 97 3a 00 00 call 11ae68 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
1173d1: 58 pop %eax
1173d2: 5a pop %edx
1173d3: 8b 45 e4 mov -0x1c(%ebp),%eax
1173d6: 50 push %eax
1173d7: 68 40 29 14 00 push $0x142940
1173dc: e8 7f 3d 00 00 call 11b160 <_Objects_Free>
1173e1: 83 c4 10 add $0x10,%esp
_Region_Free( the_region );
return_status = RTEMS_SUCCESSFUL;
1173e4: 31 db xor %ebx,%ebx
1173e6: eb b1 jmp 117399 <rtems_region_delete+0x35>
001173e8 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
1173e8: 55 push %ebp
1173e9: 89 e5 mov %esp,%ebp
1173eb: 56 push %esi
1173ec: 53 push %ebx
1173ed: 83 ec 10 sub $0x10,%esp
1173f0: 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 )
1173f3: 85 db test %ebx,%ebx
1173f5: 74 75 je 11746c <rtems_region_extend+0x84>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
1173f7: 83 ec 0c sub $0xc,%esp
1173fa: ff 35 e0 2a 14 00 pushl 0x142ae0
117400: e8 a3 23 00 00 call 1197a8 <_API_Mutex_Lock>
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
117405: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117408: 8d 45 f0 lea -0x10(%ebp),%eax
11740b: 50 push %eax
11740c: ff 75 08 pushl 0x8(%ebp)
11740f: 68 40 29 14 00 push $0x142940
117414: e8 87 3e 00 00 call 11b2a0 <_Objects_Get_no_protection>
117419: 89 c6 mov %eax,%esi
switch ( location ) {
11741b: 83 c4 10 add $0x10,%esp
11741e: 8b 45 f0 mov -0x10(%ebp),%eax
117421: 85 c0 test %eax,%eax
117423: 74 1f je 117444 <rtems_region_extend+0x5c>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117425: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
11742a: 83 ec 0c sub $0xc,%esp
11742d: ff 35 e0 2a 14 00 pushl 0x142ae0
117433: e8 b8 23 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
117438: 83 c4 10 add $0x10,%esp
}
11743b: 89 d8 mov %ebx,%eax
11743d: 8d 65 f8 lea -0x8(%ebp),%esp
117440: 5b pop %ebx
117441: 5e pop %esi
117442: c9 leave
117443: c3 ret
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
extend_ok = _Heap_Extend(
117444: 8d 45 f4 lea -0xc(%ebp),%eax
117447: 50 push %eax
117448: ff 75 10 pushl 0x10(%ebp)
11744b: 53 push %ebx
11744c: 8d 46 68 lea 0x68(%esi),%eax
11744f: 50 push %eax
117450: e8 97 2f 00 00 call 11a3ec <_Heap_Extend>
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
117455: 83 c4 10 add $0x10,%esp
117458: 84 c0 test %al,%al
11745a: 74 20 je 11747c <rtems_region_extend+0x94>
the_region->length += amount_extended;
11745c: 8b 45 f4 mov -0xc(%ebp),%eax
11745f: 01 46 54 add %eax,0x54(%esi)
the_region->maximum_segment_size += amount_extended;
117462: 01 46 5c add %eax,0x5c(%esi)
return_status = RTEMS_SUCCESSFUL;
117465: 31 db xor %ebx,%ebx
117467: eb c1 jmp 11742a <rtems_region_extend+0x42>
117469: 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;
11746c: bb 09 00 00 00 mov $0x9,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117471: 89 d8 mov %ebx,%eax
117473: 8d 65 f8 lea -0x8(%ebp),%esp
117476: 5b pop %ebx
117477: 5e pop %esi
117478: c9 leave
117479: c3 ret
11747a: 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;
11747c: bb 09 00 00 00 mov $0x9,%ebx
117481: eb a7 jmp 11742a <rtems_region_extend+0x42>
00117484 <rtems_region_get_free_information>:
rtems_status_code rtems_region_get_free_information(
rtems_id id,
Heap_Information_block *the_info
)
{
117484: 55 push %ebp
117485: 89 e5 mov %esp,%ebp
117487: 53 push %ebx
117488: 83 ec 14 sub $0x14,%esp
11748b: 8b 5d 0c mov 0xc(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
11748e: 85 db test %ebx,%ebx
117490: 74 76 je 117508 <rtems_region_get_free_information+0x84>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
117492: 83 ec 0c sub $0xc,%esp
117495: ff 35 e0 2a 14 00 pushl 0x142ae0
11749b: e8 08 23 00 00 call 1197a8 <_API_Mutex_Lock>
1174a0: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
1174a3: 8d 45 f4 lea -0xc(%ebp),%eax
1174a6: 50 push %eax
1174a7: ff 75 08 pushl 0x8(%ebp)
1174aa: 68 40 29 14 00 push $0x142940
1174af: e8 ec 3d 00 00 call 11b2a0 <_Objects_Get_no_protection>
switch ( location ) {
1174b4: 83 c4 10 add $0x10,%esp
1174b7: 8b 55 f4 mov -0xc(%ebp),%edx
1174ba: 85 d2 test %edx,%edx
1174bc: 74 1e je 1174dc <rtems_region_get_free_information+0x58>
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
1174be: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
1174c3: 83 ec 0c sub $0xc,%esp
1174c6: ff 35 e0 2a 14 00 pushl 0x142ae0
1174cc: e8 1f 23 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
1174d1: 83 c4 10 add $0x10,%esp
}
1174d4: 89 d8 mov %ebx,%eax
1174d6: 8b 5d fc mov -0x4(%ebp),%ebx
1174d9: c9 leave
1174da: c3 ret
1174db: 90 nop
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_info->Used.number = 0;
1174dc: c7 43 0c 00 00 00 00 movl $0x0,0xc(%ebx)
the_info->Used.total = 0;
1174e3: c7 43 14 00 00 00 00 movl $0x0,0x14(%ebx)
the_info->Used.largest = 0;
1174ea: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx)
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
1174f1: 83 ec 08 sub $0x8,%esp
1174f4: 53 push %ebx
1174f5: 83 c0 68 add $0x68,%eax
1174f8: 50 push %eax
1174f9: e8 d6 32 00 00 call 11a7d4 <_Heap_Get_free_information>
return_status = RTEMS_SUCCESSFUL;
break;
1174fe: 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;
117501: 31 db xor %ebx,%ebx
break;
117503: eb be jmp 1174c3 <rtems_region_get_free_information+0x3f>
117505: 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;
117508: bb 09 00 00 00 mov $0x9,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
11750d: 89 d8 mov %ebx,%eax
11750f: 8b 5d fc mov -0x4(%ebp),%ebx
117512: c9 leave
117513: c3 ret
0011758c <rtems_region_get_segment>:
uintptr_t size,
rtems_option option_set,
rtems_interval timeout,
void **segment
)
{
11758c: 55 push %ebp
11758d: 89 e5 mov %esp,%ebp
11758f: 57 push %edi
117590: 56 push %esi
117591: 53 push %ebx
117592: 83 ec 2c sub $0x2c,%esp
117595: 8b 75 0c mov 0xc(%ebp),%esi
117598: 8b 5d 18 mov 0x18(%ebp),%ebx
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
void *the_segment;
if ( !segment )
11759b: 85 db test %ebx,%ebx
11759d: 0f 84 a1 00 00 00 je 117644 <rtems_region_get_segment+0xb8>
return RTEMS_INVALID_ADDRESS;
*segment = NULL;
1175a3: c7 03 00 00 00 00 movl $0x0,(%ebx)
if ( size == 0 )
1175a9: 85 f6 test %esi,%esi
1175ab: 75 0f jne 1175bc <rtems_region_get_segment+0x30>
return RTEMS_INVALID_SIZE;
1175ad: b8 08 00 00 00 mov $0x8,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1175b2: 8d 65 f4 lea -0xc(%ebp),%esp
1175b5: 5b pop %ebx
1175b6: 5e pop %esi
1175b7: 5f pop %edi
1175b8: c9 leave
1175b9: c3 ret
1175ba: 66 90 xchg %ax,%ax
*segment = NULL;
if ( size == 0 )
return RTEMS_INVALID_SIZE;
_RTEMS_Lock_allocator();
1175bc: 83 ec 0c sub $0xc,%esp
1175bf: ff 35 e0 2a 14 00 pushl 0x142ae0
1175c5: e8 de 21 00 00 call 1197a8 <_API_Mutex_Lock>
executing = _Thread_Executing;
1175ca: a1 d8 2f 14 00 mov 0x142fd8,%eax
1175cf: 89 45 d4 mov %eax,-0x2c(%ebp)
1175d2: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
1175d5: 8d 45 e4 lea -0x1c(%ebp),%eax
1175d8: 50 push %eax
1175d9: ff 75 08 pushl 0x8(%ebp)
1175dc: 68 40 29 14 00 push $0x142940
1175e1: e8 ba 3c 00 00 call 11b2a0 <_Objects_Get_no_protection>
1175e6: 89 c7 mov %eax,%edi
switch ( location ) {
1175e8: 83 c4 10 add $0x10,%esp
1175eb: 8b 45 e4 mov -0x1c(%ebp),%eax
1175ee: 85 c0 test %eax,%eax
1175f0: 75 2a jne 11761c <rtems_region_get_segment+0x90>
case OBJECTS_LOCAL:
if ( size > the_region->maximum_segment_size )
1175f2: 3b 77 5c cmp 0x5c(%edi),%esi
1175f5: 76 2d jbe 117624 <rtems_region_get_segment+0x98>
return_status = RTEMS_INVALID_SIZE;
1175f7: b8 08 00 00 00 mov $0x8,%eax
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
1175fc: 83 ec 0c sub $0xc,%esp
1175ff: ff 35 e0 2a 14 00 pushl 0x142ae0
117605: 89 45 d0 mov %eax,-0x30(%ebp)
117608: e8 e3 21 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
11760d: 83 c4 10 add $0x10,%esp
117610: 8b 45 d0 mov -0x30(%ebp),%eax
}
117613: 8d 65 f4 lea -0xc(%ebp),%esp
117616: 5b pop %ebx
117617: 5e pop %esi
117618: 5f pop %edi
117619: c9 leave
11761a: c3 ret
11761b: 90 nop
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
11761c: b8 04 00 00 00 mov $0x4,%eax
117621: eb d9 jmp 1175fc <rtems_region_get_segment+0x70>
117623: 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 );
117624: 6a 00 push $0x0
117626: 6a 00 push $0x0
117628: 56 push %esi
RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
Region_Control *the_region,
uintptr_t size
)
{
return _Heap_Allocate( &the_region->Memory, size );
117629: 8d 47 68 lea 0x68(%edi),%eax
11762c: 50 push %eax
11762d: e8 e6 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 ) {
117632: 83 c4 10 add $0x10,%esp
117635: 85 c0 test %eax,%eax
117637: 74 17 je 117650 <rtems_region_get_segment+0xc4>
the_region->number_of_used_blocks += 1;
117639: ff 47 64 incl 0x64(%edi)
*segment = the_segment;
11763c: 89 03 mov %eax,(%ebx)
return_status = RTEMS_SUCCESSFUL;
11763e: 31 c0 xor %eax,%eax
117640: eb ba jmp 1175fc <rtems_region_get_segment+0x70>
117642: 66 90 xchg %ax,%ax
rtems_status_code return_status;
Region_Control *the_region;
void *the_segment;
if ( !segment )
return RTEMS_INVALID_ADDRESS;
117644: b8 09 00 00 00 mov $0x9,%eax
117649: e9 64 ff ff ff jmp 1175b2 <rtems_region_get_segment+0x26>
11764e: 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 ) ) {
117650: f6 45 10 01 testb $0x1,0x10(%ebp)
117654: 74 07 je 11765d <rtems_region_get_segment+0xd1>
return_status = RTEMS_UNSATISFIED;
117656: b8 0d 00 00 00 mov $0xd,%eax
11765b: eb 9f jmp 1175fc <rtems_region_get_segment+0x70>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
11765d: a1 30 2a 14 00 mov 0x142a30,%eax
117662: 40 inc %eax
117663: a3 30 2a 14 00 mov %eax,0x142a30
* 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();
117668: 83 ec 0c sub $0xc,%esp
11766b: ff 35 e0 2a 14 00 pushl 0x142ae0
117671: e8 7a 21 00 00 call 1197f0 <_API_Mutex_Unlock>
executing->Wait.queue = &the_region->Wait_queue;
117676: 8d 47 10 lea 0x10(%edi),%eax
117679: 8b 55 d4 mov -0x2c(%ebp),%edx
11767c: 89 42 44 mov %eax,0x44(%edx)
executing->Wait.id = id;
11767f: 8b 4d 08 mov 0x8(%ebp),%ecx
117682: 89 4a 20 mov %ecx,0x20(%edx)
executing->Wait.count = size;
117685: 89 72 24 mov %esi,0x24(%edx)
executing->Wait.return_argument = segment;
117688: 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;
11768b: 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 );
117692: 83 c4 0c add $0xc,%esp
117695: 68 24 c6 11 00 push $0x11c624
11769a: ff 75 14 pushl 0x14(%ebp)
11769d: 50 push %eax
11769e: e8 55 4c 00 00 call 11c2f8 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
1176a3: e8 ac 47 00 00 call 11be54 <_Thread_Enable_dispatch>
return (rtems_status_code) executing->Wait.return_code;
1176a8: 8b 55 d4 mov -0x2c(%ebp),%edx
1176ab: 8b 42 34 mov 0x34(%edx),%eax
1176ae: 83 c4 10 add $0x10,%esp
1176b1: e9 fc fe ff ff jmp 1175b2 <rtems_region_get_segment+0x26>
0011776c <rtems_region_resize_segment>:
rtems_id id,
void *segment,
uintptr_t size,
uintptr_t *old_size
)
{
11776c: 55 push %ebp
11776d: 89 e5 mov %esp,%ebp
11776f: 56 push %esi
117770: 53 push %ebx
117771: 83 ec 20 sub $0x20,%esp
117774: 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 )
117777: 85 db test %ebx,%ebx
117779: 0f 84 89 00 00 00 je 117808 <rtems_region_resize_segment+0x9c>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
11777f: 83 ec 0c sub $0xc,%esp
117782: ff 35 e0 2a 14 00 pushl 0x142ae0
117788: e8 1b 20 00 00 call 1197a8 <_API_Mutex_Lock>
11778d: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117790: 8d 45 f0 lea -0x10(%ebp),%eax
117793: 50 push %eax
117794: ff 75 08 pushl 0x8(%ebp)
117797: 68 40 29 14 00 push $0x142940
11779c: e8 ff 3a 00 00 call 11b2a0 <_Objects_Get_no_protection>
1177a1: 89 c6 mov %eax,%esi
switch ( location ) {
1177a3: 83 c4 10 add $0x10,%esp
1177a6: 8b 45 f0 mov -0x10(%ebp),%eax
1177a9: 85 c0 test %eax,%eax
1177ab: 74 1f je 1177cc <rtems_region_resize_segment+0x60>
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
1177ad: 83 ec 0c sub $0xc,%esp
1177b0: ff 35 e0 2a 14 00 pushl 0x142ae0
1177b6: e8 35 20 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
1177bb: 83 c4 10 add $0x10,%esp
1177be: b8 04 00 00 00 mov $0x4,%eax
}
1177c3: 8d 65 f8 lea -0x8(%ebp),%esp
1177c6: 5b pop %ebx
1177c7: 5e pop %esi
1177c8: c9 leave
1177c9: c3 ret
1177ca: 66 90 xchg %ax,%ax
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 7 );
status = _Heap_Resize_block(
1177cc: 83 ec 0c sub $0xc,%esp
1177cf: 8d 45 f4 lea -0xc(%ebp),%eax
1177d2: 50 push %eax
1177d3: 8d 45 ec lea -0x14(%ebp),%eax
1177d6: 50 push %eax
1177d7: ff 75 10 pushl 0x10(%ebp)
1177da: ff 75 0c pushl 0xc(%ebp)
1177dd: 8d 46 68 lea 0x68(%esi),%eax
1177e0: 50 push %eax
1177e1: e8 1a 34 00 00 call 11ac00 <_Heap_Resize_block>
segment,
(uint32_t) size,
&osize,
&avail_size
);
*old_size = (uint32_t) osize;
1177e6: 8b 55 ec mov -0x14(%ebp),%edx
1177e9: 89 13 mov %edx,(%ebx)
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
1177eb: 83 c4 20 add $0x20,%esp
1177ee: 85 c0 test %eax,%eax
1177f0: 75 22 jne 117814 <rtems_region_resize_segment+0xa8>
_Region_Process_queue( the_region ); /* unlocks allocator */
1177f2: 83 ec 0c sub $0xc,%esp
1177f5: 56 push %esi
1177f6: e8 d5 7c 00 00 call 11f4d0 <_Region_Process_queue>
1177fb: 83 c4 10 add $0x10,%esp
else
_RTEMS_Unlock_allocator();
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
1177fe: 31 c0 xor %eax,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117800: 8d 65 f8 lea -0x8(%ebp),%esp
117803: 5b pop %ebx
117804: 5e pop %esi
117805: c9 leave
117806: c3 ret
117807: 90 nop
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
return RTEMS_INVALID_ADDRESS;
117808: b8 09 00 00 00 mov $0x9,%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
11780d: 8d 65 f8 lea -0x8(%ebp),%esp
117810: 5b pop %ebx
117811: 5e pop %esi
117812: c9 leave
117813: c3 ret
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
_Region_Process_queue( the_region ); /* unlocks allocator */
else
_RTEMS_Unlock_allocator();
117814: 83 ec 0c sub $0xc,%esp
117817: ff 35 e0 2a 14 00 pushl 0x142ae0
11781d: 89 45 e4 mov %eax,-0x1c(%ebp)
117820: e8 cb 1f 00 00 call 1197f0 <_API_Mutex_Unlock>
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
117825: 83 c4 10 add $0x10,%esp
return RTEMS_UNSATISFIED;
117828: 8b 45 e4 mov -0x1c(%ebp),%eax
11782b: 48 dec %eax
11782c: 0f 94 c0 sete %al
11782f: 0f b6 c0 movzbl %al,%eax
117832: 8d 04 85 09 00 00 00 lea 0x9(,%eax,4),%eax
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
117839: 8d 65 f8 lea -0x8(%ebp),%esp
11783c: 5b pop %ebx
11783d: 5e pop %esi
11783e: c9 leave
11783f: c3 ret
00117840 <rtems_region_return_segment>:
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
)
{
117840: 55 push %ebp
117841: 89 e5 mov %esp,%ebp
117843: 53 push %ebx
117844: 83 ec 20 sub $0x20,%esp
uint32_t size;
#endif
int status;
register Region_Control *the_region;
_RTEMS_Lock_allocator();
117847: ff 35 e0 2a 14 00 pushl 0x142ae0
11784d: e8 56 1f 00 00 call 1197a8 <_API_Mutex_Lock>
117852: 83 c4 0c add $0xc,%esp
the_region = _Region_Get( id, &location );
117855: 8d 45 f4 lea -0xc(%ebp),%eax
117858: 50 push %eax
117859: ff 75 08 pushl 0x8(%ebp)
11785c: 68 40 29 14 00 push $0x142940
117861: e8 3a 3a 00 00 call 11b2a0 <_Objects_Get_no_protection>
117866: 89 c3 mov %eax,%ebx
switch ( location ) {
117868: 83 c4 10 add $0x10,%esp
11786b: 8b 45 f4 mov -0xc(%ebp),%eax
11786e: 85 c0 test %eax,%eax
117870: 75 1e jne 117890 <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 );
117872: 83 ec 08 sub $0x8,%esp
117875: ff 75 0c pushl 0xc(%ebp)
117878: 8d 43 68 lea 0x68(%ebx),%eax
11787b: 50 push %eax
11787c: e8 03 2e 00 00 call 11a684 <_Heap_Free>
#endif
status = _Region_Free_segment( the_region, segment );
_Region_Debug_Walk( the_region, 4 );
if ( !status )
117881: 83 c4 10 add $0x10,%esp
117884: 84 c0 test %al,%al
117886: 75 28 jne 1178b0 <rtems_region_return_segment+0x70>
return_status = RTEMS_INVALID_ADDRESS;
117888: bb 09 00 00 00 mov $0x9,%ebx
11788d: eb 06 jmp 117895 <rtems_region_return_segment+0x55>
11788f: 90 nop
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
117890: bb 04 00 00 00 mov $0x4,%ebx
break;
}
_RTEMS_Unlock_allocator();
117895: 83 ec 0c sub $0xc,%esp
117898: ff 35 e0 2a 14 00 pushl 0x142ae0
11789e: e8 4d 1f 00 00 call 1197f0 <_API_Mutex_Unlock>
return return_status;
1178a3: 83 c4 10 add $0x10,%esp
}
1178a6: 89 d8 mov %ebx,%eax
1178a8: 8b 5d fc mov -0x4(%ebp),%ebx
1178ab: c9 leave
1178ac: c3 ret
1178ad: 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;
1178b0: ff 4b 64 decl 0x64(%ebx)
_Region_Process_queue(the_region); /* unlocks allocator */
1178b3: 83 ec 0c sub $0xc,%esp
1178b6: 53 push %ebx
1178b7: e8 14 7c 00 00 call 11f4d0 <_Region_Process_queue>
return RTEMS_SUCCESSFUL;
1178bc: 83 c4 10 add $0x10,%esp
1178bf: 31 db xor %ebx,%ebx
break;
}
_RTEMS_Unlock_allocator();
return return_status;
}
1178c1: 89 d8 mov %ebx,%eax
1178c3: 8b 5d fc mov -0x4(%ebp),%ebx
1178c6: c9 leave
1178c7: 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 90 7d 12 00 mov 0x127d90,%eax
10b4b0: 40 inc %eax
10b4b1: a3 90 7d 12 00 mov %eax,0x127d90
* 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 e0 7c 12 00 push $0x127ce0
10b4be: 89 4d c4 mov %ecx,-0x3c(%ebp)
10b4c1: e8 be 14 00 00 call 10c984 <_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 65 0c 00 00 call 10c17c <_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 fc 7c 12 00 mov 0x127cfc,%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 71 24 00 00 call 10d9b0 <_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 84 0e 00 00 call 10c40c <_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 1b 24 00 00 call 10d9b0 <_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 e0 7c 12 00 push $0x127ce0
10b5d8: e8 1b 17 00 00 call 10ccf8 <_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 ce 23 00 00 call 10d9b0 <_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 e0 7c 12 00 push $0x127ce0
10b61f: e8 14 18 00 00 call 10ce38 <_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 5b 23 00 00 call 10d9b0 <_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 02 0b 00 00 call 10c170 <_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 e0 7c 12 00 push $0x127ce0
10b67a: e8 81 13 00 00 call 10ca00 <_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 e0 7c 12 00 push $0x127ce0
10b687: e8 6c 16 00 00 call 10ccf8 <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
10b68c: e8 1f 23 00 00 call 10d9b0 <_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 56 0d 00 00 call 10c400 <_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 e0 7c 12 00 push $0x127ce0
10b6d0: e8 0b 17 00 00 call 10cde0 <_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 6a 0b 00 00 call 10c274 <_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 83 12 00 mov 0x128338,%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 83 12 00 mov 0x128338,%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 83 12 00 mov 0x128338,%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 90 7d 12 00 mov 0x127d90,%ecx
10b77a: 41 inc %ecx
10b77b: 89 0d 90 7d 12 00 mov %ecx,0x127d90
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 80 e1 10 00 push $0x10e180
10b79b: 57 push %edi
10b79c: 50 push %eax
10b79d: e8 b2 26 00 00 call 10de54 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10b7a2: e8 09 22 00 00 call 10d9b0 <_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 e0 7c 12 00 push $0x127ce0
10b7c0: e8 73 16 00 00 call 10ce38 <_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 5d 0c 00 00 call 10c44c <_CORE_semaphore_Surrender>
10b7ef: 89 c3 mov %eax,%ebx
&the_semaphore->Core_control.semaphore,
id,
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
10b7f1: e8 ba 21 00 00 call 10d9b0 <_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 ff 0a 00 00 call 10c314 <_CORE_mutex_Surrender>
10b815: 89 c3 mov %eax,%ebx
&the_semaphore->Core_control.mutex,
id,
MUTEX_MP_SUPPORT
);
_Thread_Enable_dispatch();
10b817: e8 94 21 00 00 call 10d9b0 <_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
00117d60 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
117d60: 55 push %ebp
117d61: 89 e5 mov %esp,%ebp
117d63: 53 push %ebx
117d64: 83 ec 14 sub $0x14,%esp
117d67: 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 )
117d6a: 85 db test %ebx,%ebx
117d6c: 75 0a jne 117d78 <rtems_signal_send+0x18>
return RTEMS_INVALID_NUMBER;
117d6e: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
117d73: 8b 5d fc mov -0x4(%ebp),%ebx
117d76: c9 leave
117d77: c3 ret
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
117d78: 83 ec 08 sub $0x8,%esp
117d7b: 8d 45 f4 lea -0xc(%ebp),%eax
117d7e: 50 push %eax
117d7f: ff 75 08 pushl 0x8(%ebp)
117d82: e8 f1 40 00 00 call 11be78 <_Thread_Get>
switch ( location ) {
117d87: 83 c4 10 add $0x10,%esp
117d8a: 8b 55 f4 mov -0xc(%ebp),%edx
117d8d: 85 d2 test %edx,%edx
117d8f: 74 0b je 117d9c <rtems_signal_send+0x3c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
117d91: b8 04 00 00 00 mov $0x4,%eax
}
117d96: 8b 5d fc mov -0x4(%ebp),%ebx
117d99: c9 leave
117d9a: c3 ret
117d9b: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
117d9c: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
117da2: 8b 4a 0c mov 0xc(%edx),%ecx
117da5: 85 c9 test %ecx,%ecx
117da7: 74 3f je 117de8 <rtems_signal_send+0x88>
if ( asr->is_enabled ) {
117da9: 80 7a 08 00 cmpb $0x0,0x8(%edx)
117dad: 74 25 je 117dd4 <rtems_signal_send+0x74>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
117daf: 9c pushf
117db0: fa cli
117db1: 59 pop %ecx
*signal_set |= signals;
117db2: 09 5a 14 or %ebx,0x14(%edx)
_ISR_Enable( _level );
117db5: 51 push %ecx
117db6: 9d popf
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
117db7: 8b 15 d4 2f 14 00 mov 0x142fd4,%edx
117dbd: 85 d2 test %edx,%edx
117dbf: 74 1b je 117ddc <rtems_signal_send+0x7c>
117dc1: 3b 05 d8 2f 14 00 cmp 0x142fd8,%eax
117dc7: 75 13 jne 117ddc <rtems_signal_send+0x7c><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
117dc9: c6 05 e4 2f 14 00 01 movb $0x1,0x142fe4
117dd0: eb 0a jmp 117ddc <rtems_signal_send+0x7c>
117dd2: 66 90 xchg %ax,%ax
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
117dd4: 9c pushf
117dd5: fa cli
117dd6: 58 pop %eax
*signal_set |= signals;
117dd7: 09 5a 18 or %ebx,0x18(%edx)
_ISR_Enable( _level );
117dda: 50 push %eax
117ddb: 9d popf
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
117ddc: e8 73 40 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
117de1: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
117de3: 8b 5d fc mov -0x4(%ebp),%ebx
117de6: c9 leave
117de7: c3 ret
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
117de8: e8 67 40 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
117ded: b8 0b 00 00 00 mov $0xb,%eax
117df2: e9 7c ff ff ff jmp 117d73 <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 3a 12 00 movzbl 0x123a74,%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 40 7e 12 00 pushl 0x127e40
10b897: e8 c4 06 00 00 call 10bf60 <_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 20 7d 12 00 movl $0x127d20,(%esp)
10b8a3: e8 dc 10 00 00 call 10c984 <_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 20 7d 12 00 push $0x127d20
10b8ed: 89 55 e4 mov %edx,-0x1c(%ebp)
10b8f0: e8 53 21 00 00 call 10da48 <_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 40 7e 12 00 pushl 0x127e40
10b91e: e8 85 06 00 00 call 10bfa8 <_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 0d 14 00 00 call 10cd68 <_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 91 13 00 00 call 10ccf8 <_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 40 7e 12 00 pushl 0x127e40
10b96e: e8 35 06 00 00 call 10bfa8 <_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 40 7e 12 00 pushl 0x127e40
10b98d: e8 16 06 00 00 call 10bfa8 <_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 40 7e 12 00 pushl 0x127e40
10b9b9: e8 a2 05 00 00 call 10bf60 <_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 08 20 00 00 call 10d9d4 <_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 85 13 00 00 call 10cd68 <_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 9c 1c 00 00 call 10d688 <_Thread_Close>
10b9ec: 58 pop %eax
10b9ed: ff 73 08 pushl 0x8(%ebx)
10b9f0: e8 73 13 00 00 call 10cd68 <_Objects_Get_information_id>
10b9f5: 5a pop %edx
10b9f6: 59 pop %ecx
10b9f7: 53 push %ebx
10b9f8: 50 push %eax
10b9f9: e8 fa 12 00 00 call 10ccf8 <_Objects_Free>
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
10b9fe: 58 pop %eax
10b9ff: ff 35 40 7e 12 00 pushl 0x127e40
10ba05: e8 9e 05 00 00 call 10bfa8 <_API_Mutex_Unlock>
_Thread_Enable_dispatch();
10ba0a: e8 a1 1f 00 00 call 10d9b0 <_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 40 7e 12 00 pushl 0x127e40
10ba25: e8 7e 05 00 00 call 10bfa8 <_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
0010d4e4 <rtems_task_get_note>:
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
10d4e4: 55 push %ebp
10d4e5: 89 e5 mov %esp,%ebp
10d4e7: 56 push %esi
10d4e8: 53 push %ebx
10d4e9: 83 ec 10 sub $0x10,%esp
10d4ec: 8b 45 08 mov 0x8(%ebp),%eax
10d4ef: 8b 75 0c mov 0xc(%ebp),%esi
10d4f2: 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() )
10d4f5: 80 3d 04 79 12 00 00 cmpb $0x0,0x127904
10d4fc: 74 6e je 10d56c <rtems_task_get_note+0x88>
return RTEMS_NOT_CONFIGURED;
if ( !note )
10d4fe: 85 db test %ebx,%ebx
10d500: 74 7e je 10d580 <rtems_task_get_note+0x9c>
/*
* 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 )
10d502: 83 fe 0f cmp $0xf,%esi
10d505: 77 3d ja 10d544 <rtems_task_get_note+0x60>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d507: 85 c0 test %eax,%eax
10d509: 74 45 je 10d550 <rtems_task_get_note+0x6c>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
10d50b: 8b 15 38 c5 12 00 mov 0x12c538,%edx
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d511: 3b 42 08 cmp 0x8(%edx),%eax
10d514: 74 40 je 10d556 <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 );
10d516: 83 ec 08 sub $0x8,%esp
10d519: 8d 55 f4 lea -0xc(%ebp),%edx
10d51c: 52 push %edx
10d51d: 50 push %eax
10d51e: e8 f9 22 00 00 call 10f81c <_Thread_Get>
switch ( location ) {
10d523: 83 c4 10 add $0x10,%esp
10d526: 8b 55 f4 mov -0xc(%ebp),%edx
10d529: 85 d2 test %edx,%edx
10d52b: 75 4b jne 10d578 <rtems_task_get_note+0x94>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10d52d: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
10d533: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10d537: 89 03 mov %eax,(%ebx)
_Thread_Enable_dispatch();
10d539: e8 ba 22 00 00 call 10f7f8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d53e: 31 c0 xor %eax,%eax
10d540: eb 07 jmp 10d549 <rtems_task_get_note+0x65>
10d542: 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;
10d544: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d549: 8d 65 f8 lea -0x8(%ebp),%esp
10d54c: 5b pop %ebx
10d54d: 5e pop %esi
10d54e: c9 leave
10d54f: c3 ret
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d550: 8b 15 38 c5 12 00 mov 0x12c538,%edx
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
10d556: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
10d55c: 8b 44 b0 20 mov 0x20(%eax,%esi,4),%eax
10d560: 89 03 mov %eax,(%ebx)
return RTEMS_SUCCESSFUL;
10d562: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d564: 8d 65 f8 lea -0x8(%ebp),%esp
10d567: 5b pop %ebx
10d568: 5e pop %esi
10d569: c9 leave
10d56a: c3 ret
10d56b: 90 nop
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
10d56c: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d571: 8d 65 f8 lea -0x8(%ebp),%esp
10d574: 5b pop %ebx
10d575: 5e pop %esi
10d576: c9 leave
10d577: c3 ret
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d578: b8 04 00 00 00 mov $0x4,%eax
10d57d: eb ca jmp 10d549 <rtems_task_get_note+0x65>
10d57f: 90 nop
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
if ( !note )
return RTEMS_INVALID_ADDRESS;
10d580: b8 09 00 00 00 mov $0x9,%eax
10d585: eb c2 jmp 10d549 <rtems_task_get_note+0x65>
00118144 <rtems_task_is_suspended>:
*/
rtems_status_code rtems_task_is_suspended(
rtems_id id
)
{
118144: 55 push %ebp
118145: 89 e5 mov %esp,%ebp
118147: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
11814a: 8d 45 f4 lea -0xc(%ebp),%eax
11814d: 50 push %eax
11814e: ff 75 08 pushl 0x8(%ebp)
118151: e8 22 3d 00 00 call 11be78 <_Thread_Get>
switch ( location ) {
118156: 83 c4 10 add $0x10,%esp
118159: 8b 55 f4 mov -0xc(%ebp),%edx
11815c: 85 d2 test %edx,%edx
11815e: 74 08 je 118168 <rtems_task_is_suspended+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118160: b8 04 00 00 00 mov $0x4,%eax
}
118165: c9 leave
118166: c3 ret
118167: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
118168: f6 40 10 02 testb $0x2,0x10(%eax)
11816c: 74 0e je 11817c <rtems_task_is_suspended+0x38>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
11816e: e8 e1 3c 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_ALREADY_SUSPENDED;
118173: b8 0f 00 00 00 mov $0xf,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118178: c9 leave
118179: c3 ret
11817a: 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();
11817c: e8 d3 3c 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118181: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118183: c9 leave
118184: c3 ret
00112df0 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
112df0: 55 push %ebp
112df1: 89 e5 mov %esp,%ebp
112df3: 57 push %edi
112df4: 56 push %esi
112df5: 53 push %ebx
112df6: 83 ec 1c sub $0x1c,%esp
112df9: 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 )
112dfc: 85 c9 test %ecx,%ecx
112dfe: 0f 84 40 01 00 00 je 112f44 <rtems_task_mode+0x154>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
112e04: 8b 1d 38 83 12 00 mov 0x128338,%ebx
api = executing->API_Extensions[ THREAD_API_RTEMS ];
112e0a: 8b bb e8 00 00 00 mov 0xe8(%ebx),%edi
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
112e10: 80 7b 74 01 cmpb $0x1,0x74(%ebx)
112e14: 19 f6 sbb %esi,%esi
112e16: 81 e6 00 01 00 00 and $0x100,%esi
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
112e1c: 8b 53 7c mov 0x7c(%ebx),%edx
112e1f: 85 d2 test %edx,%edx
112e21: 0f 85 f1 00 00 00 jne 112f18 <rtems_task_mode+0x128>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
112e27: 80 7f 08 01 cmpb $0x1,0x8(%edi)
112e2b: 19 d2 sbb %edx,%edx
112e2d: 81 e2 00 04 00 00 and $0x400,%edx
old_mode |= _ISR_Get_level();
112e33: 89 55 e4 mov %edx,-0x1c(%ebp)
112e36: 89 4d e0 mov %ecx,-0x20(%ebp)
112e39: e8 4e bf ff ff call 10ed8c <_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;
112e3e: 8b 55 e4 mov -0x1c(%ebp),%edx
112e41: 09 d0 or %edx,%eax
old_mode |= _ISR_Get_level();
112e43: 09 f0 or %esi,%eax
112e45: 8b 4d e0 mov -0x20(%ebp),%ecx
112e48: 89 01 mov %eax,(%ecx)
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
112e4a: f7 45 0c 00 01 00 00 testl $0x100,0xc(%ebp)
112e51: 74 0b je 112e5e <rtems_task_mode+0x6e>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
112e53: f7 45 08 00 01 00 00 testl $0x100,0x8(%ebp)
112e5a: 0f 94 43 74 sete 0x74(%ebx)
if ( mask & RTEMS_TIMESLICE_MASK ) {
112e5e: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp)
112e65: 74 1c je 112e83 <rtems_task_mode+0x93>
if ( _Modes_Is_timeslice(mode_set) ) {
112e67: f7 45 08 00 02 00 00 testl $0x200,0x8(%ebp)
112e6e: 0f 84 b8 00 00 00 je 112f2c <rtems_task_mode+0x13c>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
112e74: c7 43 7c 01 00 00 00 movl $0x1,0x7c(%ebx)
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
112e7b: a1 60 7d 12 00 mov 0x127d60,%eax
112e80: 89 43 78 mov %eax,0x78(%ebx)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
112e83: f6 45 0c 01 testb $0x1,0xc(%ebp)
112e87: 74 0b je 112e94 <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 ) );
112e89: f6 45 08 01 testb $0x1,0x8(%ebp)
112e8d: 0f 84 91 00 00 00 je 112f24 <rtems_task_mode+0x134>
112e93: fa cli
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
112e94: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp)
112e9b: 74 3f je 112edc <rtems_task_mode+0xec>
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
112e9d: f7 45 08 00 04 00 00 testl $0x400,0x8(%ebp)
112ea4: 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 ) {
112ea7: 38 47 08 cmp %al,0x8(%edi)
112eaa: 74 30 je 112edc <rtems_task_mode+0xec>
asr->is_enabled = is_asr_enabled;
112eac: 88 47 08 mov %al,0x8(%edi)
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
112eaf: 9c pushf
112eb0: fa cli
112eb1: 58 pop %eax
_signals = information->signals_pending;
112eb2: 8b 57 18 mov 0x18(%edi),%edx
information->signals_pending = information->signals_posted;
112eb5: 8b 4f 14 mov 0x14(%edi),%ecx
112eb8: 89 4f 18 mov %ecx,0x18(%edi)
information->signals_posted = _signals;
112ebb: 89 57 14 mov %edx,0x14(%edi)
_ISR_Enable( _level );
112ebe: 50 push %eax
112ebf: 9d popf
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
112ec0: 8b 47 14 mov 0x14(%edi),%eax
112ec3: 85 c0 test %eax,%eax
112ec5: 0f 95 c0 setne %al
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
112ec8: 83 3d 20 7f 12 00 03 cmpl $0x3,0x127f20
112ecf: 74 16 je 112ee7 <rtems_task_mode+0xf7> <== ALWAYS TAKEN
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
112ed1: 31 c0 xor %eax,%eax
}
112ed3: 83 c4 1c add $0x1c,%esp
112ed6: 5b pop %ebx
112ed7: 5e pop %esi
112ed8: 5f pop %edi
112ed9: c9 leave
112eda: c3 ret
112edb: 90 nop
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
112edc: 31 c0 xor %eax,%eax
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
112ede: 83 3d 20 7f 12 00 03 cmpl $0x3,0x127f20
112ee5: 75 ea jne 112ed1 <rtems_task_mode+0xe1> <== NEVER TAKEN
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
112ee7: 8b 15 38 83 12 00 mov 0x128338,%edx
if ( are_signals_pending ||
112eed: 84 c0 test %al,%al
112eef: 75 0e jne 112eff <rtems_task_mode+0x10f>
112ef1: 3b 15 3c 83 12 00 cmp 0x12833c,%edx
112ef7: 74 d8 je 112ed1 <rtems_task_mode+0xe1>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
112ef9: 80 7a 74 00 cmpb $0x0,0x74(%edx)
112efd: 74 d2 je 112ed1 <rtems_task_mode+0xe1> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
112eff: c6 05 44 83 12 00 01 movb $0x1,0x128344
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
112f06: e8 2d a9 ff ff call 10d838 <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
112f0b: 31 c0 xor %eax,%eax
}
112f0d: 83 c4 1c add $0x1c,%esp
112f10: 5b pop %ebx
112f11: 5e pop %esi
112f12: 5f pop %edi
112f13: c9 leave
112f14: c3 ret
112f15: 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;
112f18: 81 ce 00 02 00 00 or $0x200,%esi
112f1e: e9 04 ff ff ff jmp 112e27 <rtems_task_mode+0x37>
112f23: 90 nop
112f24: fb sti
112f25: e9 6a ff ff ff jmp 112e94 <rtems_task_mode+0xa4>
112f2a: 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;
112f2c: c7 43 7c 00 00 00 00 movl $0x0,0x7c(%ebx)
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
112f33: f6 45 0c 01 testb $0x1,0xc(%ebp)
112f37: 0f 84 57 ff ff ff je 112e94 <rtems_task_mode+0xa4>
112f3d: e9 47 ff ff ff jmp 112e89 <rtems_task_mode+0x99>
112f42: 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;
112f44: b8 09 00 00 00 mov $0x9,%eax
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
112f49: 83 c4 1c add $0x1c,%esp
112f4c: 5b pop %ebx
112f4d: 5e pop %esi
112f4e: 5f pop %edi
112f4f: c9 leave
112f50: c3 ret
0010ecdc <rtems_task_resume>:
*/
rtems_status_code rtems_task_resume(
rtems_id id
)
{
10ecdc: 55 push %ebp
10ecdd: 89 e5 mov %esp,%ebp
10ecdf: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
10ece2: 8d 45 f4 lea -0xc(%ebp),%eax
10ece5: 50 push %eax
10ece6: ff 75 08 pushl 0x8(%ebp)
10ece9: e8 1e 20 00 00 call 110d0c <_Thread_Get>
switch ( location ) {
10ecee: 83 c4 10 add $0x10,%esp
10ecf1: 8b 55 f4 mov -0xc(%ebp),%edx
10ecf4: 85 d2 test %edx,%edx
10ecf6: 74 08 je 10ed00 <rtems_task_resume+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10ecf8: b8 04 00 00 00 mov $0x4,%eax
}
10ecfd: c9 leave
10ecfe: c3 ret
10ecff: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
10ed00: f6 40 10 02 testb $0x2,0x10(%eax)
10ed04: 75 0e jne 10ed14 <rtems_task_resume+0x38>
_Thread_Resume( the_thread, true );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
10ed06: e8 dd 1f 00 00 call 110ce8 <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
10ed0b: b8 0e 00 00 00 mov $0xe,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ed10: c9 leave
10ed11: c3 ret
10ed12: 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 );
10ed14: 83 ec 08 sub $0x8,%esp
10ed17: 6a 01 push $0x1
10ed19: 50 push %eax
10ed1a: e8 d1 27 00 00 call 1114f0 <_Thread_Resume>
_Thread_Enable_dispatch();
10ed1f: e8 c4 1f 00 00 call 110ce8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ed24: 83 c4 10 add $0x10,%esp
10ed27: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10ed29: c9 leave
10ed2a: c3 ret
0010d65c <rtems_task_set_note>:
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
10d65c: 55 push %ebp
10d65d: 89 e5 mov %esp,%ebp
10d65f: 56 push %esi
10d660: 53 push %ebx
10d661: 83 ec 10 sub $0x10,%esp
10d664: 8b 45 08 mov 0x8(%ebp),%eax
10d667: 8b 5d 0c mov 0xc(%ebp),%ebx
10d66a: 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() )
10d66d: 80 3d 04 79 12 00 00 cmpb $0x0,0x127904
10d674: 74 66 je 10d6dc <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 )
10d676: 83 fb 0f cmp $0xf,%ebx
10d679: 77 39 ja 10d6b4 <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 ) ||
10d67b: 85 c0 test %eax,%eax
10d67d: 74 41 je 10d6c0 <rtems_task_set_note+0x64>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
10d67f: 8b 15 38 c5 12 00 mov 0x12c538,%edx
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d685: 3b 42 08 cmp 0x8(%edx),%eax
10d688: 74 3c je 10d6c6 <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 );
10d68a: 83 ec 08 sub $0x8,%esp
10d68d: 8d 55 f4 lea -0xc(%ebp),%edx
10d690: 52 push %edx
10d691: 50 push %eax
10d692: e8 85 21 00 00 call 10f81c <_Thread_Get>
switch ( location ) {
10d697: 83 c4 10 add $0x10,%esp
10d69a: 8b 55 f4 mov -0xc(%ebp),%edx
10d69d: 85 d2 test %edx,%edx
10d69f: 75 47 jne 10d6e8 <rtems_task_set_note+0x8c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
10d6a1: 8b 80 e8 00 00 00 mov 0xe8(%eax),%eax
10d6a7: 89 74 98 20 mov %esi,0x20(%eax,%ebx,4)
_Thread_Enable_dispatch();
10d6ab: e8 48 21 00 00 call 10f7f8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10d6b0: 31 c0 xor %eax,%eax
10d6b2: eb 05 jmp 10d6b9 <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;
10d6b4: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6b9: 8d 65 f8 lea -0x8(%ebp),%esp
10d6bc: 5b pop %ebx
10d6bd: 5e pop %esi
10d6be: c9 leave
10d6bf: c3 ret
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
10d6c0: 8b 15 38 c5 12 00 mov 0x12c538,%edx
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
10d6c6: 8b 82 e8 00 00 00 mov 0xe8(%edx),%eax
10d6cc: 89 74 98 20 mov %esi,0x20(%eax,%ebx,4)
return RTEMS_SUCCESSFUL;
10d6d0: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6d2: 8d 65 f8 lea -0x8(%ebp),%esp
10d6d5: 5b pop %ebx
10d6d6: 5e pop %esi
10d6d7: c9 leave
10d6d8: c3 ret
10d6d9: 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;
10d6dc: b8 16 00 00 00 mov $0x16,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10d6e1: 8d 65 f8 lea -0x8(%ebp),%esp
10d6e4: 5b pop %ebx
10d6e5: 5e pop %esi
10d6e6: c9 leave
10d6e7: c3 ret
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10d6e8: b8 04 00 00 00 mov $0x4,%eax
}
10d6ed: 8d 65 f8 lea -0x8(%ebp),%esp
10d6f0: 5b pop %ebx
10d6f1: 5e pop %esi
10d6f2: c9 leave
10d6f3: c3 ret
0010f9a0 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
10f9a0: 55 push %ebp
10f9a1: 89 e5 mov %esp,%ebp
10f9a3: 56 push %esi
10f9a4: 53 push %ebx
10f9a5: 83 ec 10 sub $0x10,%esp
10f9a8: 8b 5d 0c mov 0xc(%ebp),%ebx
10f9ab: 8b 75 10 mov 0x10(%ebp),%esi
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
10f9ae: 85 db test %ebx,%ebx
10f9b0: 74 0b je 10f9bd <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 ) );
10f9b2: 0f b6 05 34 7a 12 00 movzbl 0x127a34,%eax
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
10f9b9: 39 c3 cmp %eax,%ebx
10f9bb: 77 5f ja 10fa1c <rtems_task_set_priority+0x7c>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
10f9bd: 85 f6 test %esi,%esi
10f9bf: 74 67 je 10fa28 <rtems_task_set_priority+0x88>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
10f9c1: 83 ec 08 sub $0x8,%esp
10f9c4: 8d 45 f4 lea -0xc(%ebp),%eax
10f9c7: 50 push %eax
10f9c8: ff 75 08 pushl 0x8(%ebp)
10f9cb: e8 7c 21 00 00 call 111b4c <_Thread_Get>
switch ( location ) {
10f9d0: 83 c4 10 add $0x10,%esp
10f9d3: 8b 55 f4 mov -0xc(%ebp),%edx
10f9d6: 85 d2 test %edx,%edx
10f9d8: 75 36 jne 10fa10 <rtems_task_set_priority+0x70>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
10f9da: 8b 50 14 mov 0x14(%eax),%edx
10f9dd: 89 16 mov %edx,(%esi)
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
10f9df: 85 db test %ebx,%ebx
10f9e1: 74 1c je 10f9ff <rtems_task_set_priority+0x5f>
the_thread->real_priority = new_priority;
10f9e3: 89 58 18 mov %ebx,0x18(%eax)
if ( the_thread->resource_count == 0 ||
10f9e6: 8b 48 1c mov 0x1c(%eax),%ecx
10f9e9: 85 c9 test %ecx,%ecx
10f9eb: 74 05 je 10f9f2 <rtems_task_set_priority+0x52>
10f9ed: 3b 58 14 cmp 0x14(%eax),%ebx
10f9f0: 73 0d jae 10f9ff <rtems_task_set_priority+0x5f><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
10f9f2: 52 push %edx
10f9f3: 6a 00 push $0x0
10f9f5: 53 push %ebx
10f9f6: 50 push %eax
10f9f7: e8 f4 1c 00 00 call 1116f0 <_Thread_Change_priority>
10f9fc: 83 c4 10 add $0x10,%esp
}
_Thread_Enable_dispatch();
10f9ff: e8 24 21 00 00 call 111b28 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10fa04: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa06: 8d 65 f8 lea -0x8(%ebp),%esp
10fa09: 5b pop %ebx
10fa0a: 5e pop %esi
10fa0b: c9 leave
10fa0c: c3 ret
10fa0d: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10fa10: b8 04 00 00 00 mov $0x4,%eax
}
10fa15: 8d 65 f8 lea -0x8(%ebp),%esp
10fa18: 5b pop %ebx
10fa19: 5e pop %esi
10fa1a: c9 leave
10fa1b: 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;
10fa1c: b8 13 00 00 00 mov $0x13,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa21: 8d 65 f8 lea -0x8(%ebp),%esp
10fa24: 5b pop %ebx
10fa25: 5e pop %esi
10fa26: c9 leave
10fa27: 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;
10fa28: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10fa2d: 8d 65 f8 lea -0x8(%ebp),%esp
10fa30: 5b pop %ebx
10fa31: 5e pop %esi
10fa32: c9 leave
10fa33: 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 c3 1e 00 00 call 10d9d4 <_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 0c 28 00 00 call 10e338 <_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 78 1e 00 00 call 10d9b0 <_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 4f 1e 00 00 call 10d9b0 <_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
00110f70 <rtems_task_suspend>:
*/
rtems_status_code rtems_task_suspend(
rtems_id id
)
{
110f70: 55 push %ebp
110f71: 89 e5 mov %esp,%ebp
110f73: 83 ec 20 sub $0x20,%esp
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
110f76: 8d 45 f4 lea -0xc(%ebp),%eax
110f79: 50 push %eax
110f7a: ff 75 08 pushl 0x8(%ebp)
110f7d: e8 52 ca ff ff call 10d9d4 <_Thread_Get>
switch ( location ) {
110f82: 83 c4 10 add $0x10,%esp
110f85: 8b 55 f4 mov -0xc(%ebp),%edx
110f88: 85 d2 test %edx,%edx
110f8a: 74 08 je 110f94 <rtems_task_suspend+0x24>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
110f8c: b8 04 00 00 00 mov $0x4,%eax
}
110f91: c9 leave
110f92: c3 ret
110f93: 90 nop
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
110f94: f6 40 10 02 testb $0x2,0x10(%eax)
110f98: 74 0e je 110fa8 <rtems_task_suspend+0x38>
_Thread_Suspend( the_thread );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
110f9a: e8 11 ca ff ff call 10d9b0 <_Thread_Enable_dispatch>
return RTEMS_ALREADY_SUSPENDED;
110f9f: b8 0f 00 00 00 mov $0xf,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
110fa4: c9 leave
110fa5: c3 ret
110fa6: 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 );
110fa8: 83 ec 0c sub $0xc,%esp
110fab: 50 push %eax
110fac: e8 27 09 00 00 call 1118d8 <_Thread_Suspend>
_Thread_Enable_dispatch();
110fb1: e8 fa c9 ff ff call 10d9b0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
110fb6: 83 c4 10 add $0x10,%esp
110fb9: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
110fbb: c9 leave
110fbc: 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 6e 20 00 00 call 10e6e4 <_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 f2 2f 00 00 call 10f698 <_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 f5 1f 00 00 call 10e6c0 <_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 d5 1f 00 00 call 10e6c0 <_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 c3 1f 00 00 call 10e6c0 <_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 b3 1f 00 00 call 10e6e4 <_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 52 1f 00 00 call 10e6c0 <_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 35 1f 00 00 call 10e6c0 <_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 0f 1f 00 00 call 10e6e4 <_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 bf 1e 00 00 call 10e6c0 <_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 97 1e 00 00 call 10e6c0 <_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
0010c9c0 <rtems_task_wake_when>:
*/
rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
10c9c0: 55 push %ebp
10c9c1: 89 e5 mov %esp,%ebp
10c9c3: 53 push %ebx
10c9c4: 83 ec 14 sub $0x14,%esp
10c9c7: 8b 5d 08 mov 0x8(%ebp),%ebx
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
10c9ca: 80 3d c4 aa 12 00 00 cmpb $0x0,0x12aac4
10c9d1: 0f 84 a9 00 00 00 je 10ca80 <rtems_task_wake_when+0xc0>
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
10c9d7: 85 db test %ebx,%ebx
10c9d9: 0f 84 ad 00 00 00 je 10ca8c <rtems_task_wake_when+0xcc>
return RTEMS_INVALID_ADDRESS;
time_buffer->ticks = 0;
10c9df: c7 43 18 00 00 00 00 movl $0x0,0x18(%ebx)
if ( !_TOD_Validate( time_buffer ) )
10c9e6: 83 ec 0c sub $0xc,%esp
10c9e9: 53 push %ebx
10c9ea: e8 d1 f3 ff ff call 10bdc0 <_TOD_Validate>
10c9ef: 83 c4 10 add $0x10,%esp
10c9f2: 84 c0 test %al,%al
10c9f4: 75 0a jne 10ca00 <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;
10c9f6: b8 14 00 00 00 mov $0x14,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c9fb: 8b 5d fc mov -0x4(%ebp),%ebx
10c9fe: c9 leave
10c9ff: c3 ret
time_buffer->ticks = 0;
if ( !_TOD_Validate( time_buffer ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
10ca00: 83 ec 0c sub $0xc,%esp
10ca03: 53 push %ebx
10ca04: e8 2b f3 ff ff call 10bd34 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
10ca09: 83 c4 10 add $0x10,%esp
10ca0c: 3b 05 48 ab 12 00 cmp 0x12ab48,%eax
10ca12: 76 e2 jbe 10c9f6 <rtems_task_wake_when+0x36>
10ca14: 8b 15 b0 aa 12 00 mov 0x12aab0,%edx
10ca1a: 42 inc %edx
10ca1b: 89 15 b0 aa 12 00 mov %edx,0x12aab0
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
10ca21: 83 ec 08 sub $0x8,%esp
10ca24: 6a 10 push $0x10
10ca26: ff 35 58 b0 12 00 pushl 0x12b058
10ca2c: 89 45 f4 mov %eax,-0xc(%ebp)
10ca2f: e8 ec 26 00 00 call 10f120 <_Thread_Set_state>
_Watchdog_Initialize(
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
10ca34: 8b 15 58 b0 12 00 mov 0x12b058,%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(
10ca3a: 8b 4a 08 mov 0x8(%edx),%ecx
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
10ca3d: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx)
the_watchdog->routine = routine;
10ca44: c7 42 64 4c e7 10 00 movl $0x10e74c,0x64(%edx)
the_watchdog->id = id;
10ca4b: 89 4a 68 mov %ecx,0x68(%edx)
the_watchdog->user_data = user_data;
10ca4e: 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(
10ca55: 8b 45 f4 mov -0xc(%ebp),%eax
10ca58: 2b 05 48 ab 12 00 sub 0x12ab48,%eax
10ca5e: 89 42 54 mov %eax,0x54(%edx)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
10ca61: 58 pop %eax
10ca62: 59 pop %ecx
10ca63: 83 c2 48 add $0x48,%edx
10ca66: 52 push %edx
10ca67: 68 74 ab 12 00 push $0x12ab74
10ca6c: e8 77 2c 00 00 call 10f6e8 <_Watchdog_Insert>
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
10ca71: e8 8a 1e 00 00 call 10e900 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10ca76: 83 c4 10 add $0x10,%esp
10ca79: 31 c0 xor %eax,%eax
10ca7b: e9 7b ff ff ff jmp 10c9fb <rtems_task_wake_when+0x3b>
)
{
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
10ca80: b8 0b 00 00 00 mov $0xb,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca85: 8b 5d fc mov -0x4(%ebp),%ebx
10ca88: c9 leave
10ca89: c3 ret
10ca8a: 66 90 xchg %ax,%ax
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
10ca8c: b8 09 00 00 00 mov $0x9,%eax
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10ca91: 8b 5d fc mov -0x4(%ebp),%ebx
10ca94: c9 leave
10ca95: c3 ret
001186d4 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
1186d4: 55 push %ebp
1186d5: 89 e5 mov %esp,%ebp
1186d7: 83 ec 1c sub $0x1c,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
1186da: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
1186dd: 50 push %eax
1186de: ff 75 08 pushl 0x8(%ebp)
1186e1: 68 60 34 14 00 push $0x143460
1186e6: e8 f1 2b 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
1186eb: 83 c4 10 add $0x10,%esp
1186ee: 8b 55 f4 mov -0xc(%ebp),%edx
1186f1: 85 d2 test %edx,%edx
1186f3: 74 07 je 1186fc <rtems_timer_cancel+0x28>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1186f5: b8 04 00 00 00 mov $0x4,%eax
}
1186fa: c9 leave
1186fb: c3 ret
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
1186fc: 83 78 38 04 cmpl $0x4,0x38(%eax)
118700: 74 0f je 118711 <rtems_timer_cancel+0x3d><== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
118702: 83 ec 0c sub $0xc,%esp
118705: 83 c0 10 add $0x10,%eax
118708: 50 push %eax
118709: e8 82 48 00 00 call 11cf90 <_Watchdog_Remove>
11870e: 83 c4 10 add $0x10,%esp
_Thread_Enable_dispatch();
118711: e8 3e 37 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118716: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118718: c9 leave
118719: c3 ret
0010bff0 <rtems_timer_create>:
rtems_status_code rtems_timer_create(
rtems_name name,
rtems_id *id
)
{
10bff0: 55 push %ebp
10bff1: 89 e5 mov %esp,%ebp
10bff3: 57 push %edi
10bff4: 56 push %esi
10bff5: 53 push %ebx
10bff6: 83 ec 0c sub $0xc,%esp
10bff9: 8b 5d 08 mov 0x8(%ebp),%ebx
10bffc: 8b 75 0c mov 0xc(%ebp),%esi
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
10bfff: 85 db test %ebx,%ebx
10c001: 74 6d je 10c070 <rtems_timer_create+0x80>
return RTEMS_INVALID_NAME;
if ( !id )
10c003: 85 f6 test %esi,%esi
10c005: 0f 84 89 00 00 00 je 10c094 <rtems_timer_create+0xa4>
10c00b: a1 10 98 12 00 mov 0x129810,%eax
10c010: 40 inc %eax
10c011: a3 10 98 12 00 mov %eax,0x129810
* 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 );
10c016: 83 ec 0c sub $0xc,%esp
10c019: 68 40 a2 12 00 push $0x12a240
10c01e: e8 31 0f 00 00 call 10cf54 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
10c023: 83 c4 10 add $0x10,%esp
10c026: 85 c0 test %eax,%eax
10c028: 74 56 je 10c080 <rtems_timer_create+0x90>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_timer->the_class = TIMER_DORMANT;
10c02a: 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;
10c031: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10c038: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10c03f: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10c046: 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 ),
10c04d: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
10c050: 0f b7 fa movzwl %dx,%edi
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10c053: 8b 0d 5c a2 12 00 mov 0x12a25c,%ecx
10c059: 89 04 b9 mov %eax,(%ecx,%edi,4)
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
10c05c: 89 58 0c mov %ebx,0xc(%eax)
&_Timer_Information,
&the_timer->Object,
(Objects_Name) name
);
*id = the_timer->Object.id;
10c05f: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10c061: e8 1a 1f 00 00 call 10df80 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c066: 31 c0 xor %eax,%eax
}
10c068: 8d 65 f4 lea -0xc(%ebp),%esp
10c06b: 5b pop %ebx
10c06c: 5e pop %esi
10c06d: 5f pop %edi
10c06e: c9 leave
10c06f: c3 ret
)
{
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
10c070: b8 03 00 00 00 mov $0x3,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c075: 8d 65 f4 lea -0xc(%ebp),%esp
10c078: 5b pop %ebx
10c079: 5e pop %esi
10c07a: 5f pop %edi
10c07b: c9 leave
10c07c: c3 ret
10c07d: 8d 76 00 lea 0x0(%esi),%esi
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
_Thread_Enable_dispatch();
10c080: e8 fb 1e 00 00 call 10df80 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
10c085: b8 05 00 00 00 mov $0x5,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c08a: 8d 65 f4 lea -0xc(%ebp),%esp
10c08d: 5b pop %ebx
10c08e: 5e pop %esi
10c08f: 5f pop %edi
10c090: c9 leave
10c091: c3 ret
10c092: 66 90 xchg %ax,%ax
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
10c094: b8 09 00 00 00 mov $0x9,%eax
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
10c099: 8d 65 f4 lea -0xc(%ebp),%esp
10c09c: 5b pop %ebx
10c09d: 5e pop %esi
10c09e: 5f pop %edi
10c09f: c9 leave
10c0a0: c3 ret
001187d0 <rtems_timer_delete>:
*/
rtems_status_code rtems_timer_delete(
rtems_id id
)
{
1187d0: 55 push %ebp
1187d1: 89 e5 mov %esp,%ebp
1187d3: 53 push %ebx
1187d4: 83 ec 18 sub $0x18,%esp
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
1187d7: 8d 45 f4 lea -0xc(%ebp),%eax
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
1187da: 50 push %eax
1187db: ff 75 08 pushl 0x8(%ebp)
1187de: 68 60 34 14 00 push $0x143460
1187e3: e8 f4 2a 00 00 call 11b2dc <_Objects_Get>
1187e8: 89 c3 mov %eax,%ebx
switch ( location ) {
1187ea: 83 c4 10 add $0x10,%esp
1187ed: 8b 4d f4 mov -0xc(%ebp),%ecx
1187f0: 85 c9 test %ecx,%ecx
1187f2: 75 38 jne 11882c <rtems_timer_delete+0x5c>
case OBJECTS_LOCAL:
_Objects_Close( &_Timer_Information, &the_timer->Object );
1187f4: 83 ec 08 sub $0x8,%esp
1187f7: 50 push %eax
1187f8: 68 60 34 14 00 push $0x143460
1187fd: e8 66 26 00 00 call 11ae68 <_Objects_Close>
(void) _Watchdog_Remove( &the_timer->Ticker );
118802: 8d 43 10 lea 0x10(%ebx),%eax
118805: 89 04 24 mov %eax,(%esp)
118808: e8 83 47 00 00 call 11cf90 <_Watchdog_Remove>
*/
RTEMS_INLINE_ROUTINE void _Timer_Free (
Timer_Control *the_timer
)
{
_Objects_Free( &_Timer_Information, &the_timer->Object );
11880d: 58 pop %eax
11880e: 5a pop %edx
11880f: 53 push %ebx
118810: 68 60 34 14 00 push $0x143460
118815: e8 46 29 00 00 call 11b160 <_Objects_Free>
_Timer_Free( the_timer );
_Thread_Enable_dispatch();
11881a: e8 35 36 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
11881f: 83 c4 10 add $0x10,%esp
118822: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118824: 8b 5d fc mov -0x4(%ebp),%ebx
118827: c9 leave
118828: c3 ret
118829: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
11882c: b8 04 00 00 00 mov $0x4,%eax
}
118831: 8b 5d fc mov -0x4(%ebp),%ebx
118834: c9 leave
118835: c3 ret
0010c0a4 <rtems_timer_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
10c0a4: 55 push %ebp
10c0a5: 89 e5 mov %esp,%ebp
10c0a7: 57 push %edi
10c0a8: 56 push %esi
10c0a9: 53 push %ebx
10c0aa: 83 ec 2c sub $0x2c,%esp
10c0ad: 8b 5d 0c mov 0xc(%ebp),%ebx
10c0b0: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
10c0b3: 85 db test %ebx,%ebx
10c0b5: 0f 84 99 00 00 00 je 10c154 <rtems_timer_fire_after+0xb0>
return RTEMS_INVALID_NUMBER;
if ( !routine )
10c0bb: 85 f6 test %esi,%esi
10c0bd: 0f 84 b1 00 00 00 je 10c174 <rtems_timer_fire_after+0xd0>
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
10c0c3: 57 push %edi
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
10c0c4: 8d 45 e4 lea -0x1c(%ebp),%eax
10c0c7: 50 push %eax
10c0c8: ff 75 08 pushl 0x8(%ebp)
10c0cb: 68 40 a2 12 00 push $0x12a240
10c0d0: e8 33 13 00 00 call 10d408 <_Objects_Get>
10c0d5: 89 c7 mov %eax,%edi
switch ( location ) {
10c0d7: 83 c4 10 add $0x10,%esp
10c0da: 8b 4d e4 mov -0x1c(%ebp),%ecx
10c0dd: 85 c9 test %ecx,%ecx
10c0df: 74 0f je 10c0f0 <rtems_timer_fire_after+0x4c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
10c0e1: b8 04 00 00 00 mov $0x4,%eax
}
10c0e6: 8d 65 f4 lea -0xc(%ebp),%esp
10c0e9: 5b pop %ebx
10c0ea: 5e pop %esi
10c0eb: 5f pop %edi
10c0ec: c9 leave
10c0ed: c3 ret
10c0ee: 66 90 xchg %ax,%ax
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
10c0f0: 8d 50 10 lea 0x10(%eax),%edx
10c0f3: 83 ec 0c sub $0xc,%esp
10c0f6: 52 push %edx
10c0f7: 89 55 d4 mov %edx,-0x2c(%ebp)
10c0fa: e8 31 2d 00 00 call 10ee30 <_Watchdog_Remove>
_ISR_Disable( level );
10c0ff: 9c pushf
10c100: fa cli
10c101: 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 ) {
10c102: 83 c4 10 add $0x10,%esp
10c105: 8b 57 18 mov 0x18(%edi),%edx
10c108: 85 d2 test %edx,%edx
10c10a: 8b 55 d4 mov -0x2c(%ebp),%edx
10c10d: 75 55 jne 10c164 <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;
10c10f: 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;
10c116: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi)
the_watchdog->routine = routine;
10c11d: 89 77 2c mov %esi,0x2c(%edi)
the_watchdog->id = id;
10c120: 8b 4d 08 mov 0x8(%ebp),%ecx
10c123: 89 4f 30 mov %ecx,0x30(%edi)
the_watchdog->user_data = user_data;
10c126: 8b 4d 14 mov 0x14(%ebp),%ecx
10c129: 89 4f 34 mov %ecx,0x34(%edi)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_ISR_Enable( level );
10c12c: 50 push %eax
10c12d: 9d popf
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10c12e: 89 5f 1c mov %ebx,0x1c(%edi)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10c131: 83 ec 08 sub $0x8,%esp
10c134: 52 push %edx
10c135: 68 e0 98 12 00 push $0x1298e0
10c13a: e8 b1 2b 00 00 call 10ecf0 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
_Thread_Enable_dispatch();
10c13f: e8 3c 1e 00 00 call 10df80 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c144: 83 c4 10 add $0x10,%esp
10c147: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c149: 8d 65 f4 lea -0xc(%ebp),%esp
10c14c: 5b pop %ebx
10c14d: 5e pop %esi
10c14e: 5f pop %edi
10c14f: c9 leave
10c150: c3 ret
10c151: 8d 76 00 lea 0x0(%esi),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
10c154: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c159: 8d 65 f4 lea -0xc(%ebp),%esp
10c15c: 5b pop %ebx
10c15d: 5e pop %esi
10c15e: 5f pop %edi
10c15f: c9 leave
10c160: c3 ret
10c161: 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 );
10c164: 50 push %eax
10c165: 9d popf
_Thread_Enable_dispatch();
10c166: e8 15 1e 00 00 call 10df80 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
10c16b: 31 c0 xor %eax,%eax
10c16d: e9 74 ff ff ff jmp 10c0e6 <rtems_timer_fire_after+0x42>
10c172: 66 90 xchg %ax,%ax
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
10c174: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
10c179: 8d 65 f4 lea -0xc(%ebp),%esp
10c17c: 5b pop %ebx
10c17d: 5e pop %esi
10c17e: 5f pop %edi
10c17f: c9 leave
10c180: c3 ret
00118918 <rtems_timer_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118918: 55 push %ebp
118919: 89 e5 mov %esp,%ebp
11891b: 57 push %edi
11891c: 56 push %esi
11891d: 53 push %ebx
11891e: 83 ec 2c sub $0x2c,%esp
118921: 8b 75 08 mov 0x8(%ebp),%esi
118924: 8b 7d 0c mov 0xc(%ebp),%edi
118927: 8b 5d 10 mov 0x10(%ebp),%ebx
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
11892a: 80 3d 44 2a 14 00 00 cmpb $0x0,0x142a44
118931: 75 0d jne 118940 <rtems_timer_fire_when+0x28>
return RTEMS_NOT_DEFINED;
118933: b8 0b 00 00 00 mov $0xb,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118938: 8d 65 f4 lea -0xc(%ebp),%esp
11893b: 5b pop %ebx
11893c: 5e pop %esi
11893d: 5f pop %edi
11893e: c9 leave
11893f: c3 ret
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
118940: 83 ec 0c sub $0xc,%esp
118943: 57 push %edi
118944: e8 93 d4 ff ff call 115ddc <_TOD_Validate>
118949: 83 c4 10 add $0x10,%esp
11894c: 84 c0 test %al,%al
11894e: 74 1e je 11896e <rtems_timer_fire_when+0x56>
return RTEMS_INVALID_CLOCK;
if ( !routine )
118950: 85 db test %ebx,%ebx
118952: 0f 84 a4 00 00 00 je 1189fc <rtems_timer_fire_when+0xe4>
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
118958: 83 ec 0c sub $0xc,%esp
11895b: 57 push %edi
11895c: e8 ef d3 ff ff call 115d50 <_TOD_To_seconds>
118961: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
118963: 83 c4 10 add $0x10,%esp
118966: 3b 05 c8 2a 14 00 cmp 0x142ac8,%eax
11896c: 77 0e ja 11897c <rtems_timer_fire_when+0x64>
return RTEMS_INVALID_CLOCK;
11896e: b8 14 00 00 00 mov $0x14,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118973: 8d 65 f4 lea -0xc(%ebp),%esp
118976: 5b pop %ebx
118977: 5e pop %esi
118978: 5f pop %edi
118979: c9 leave
11897a: c3 ret
11897b: 90 nop
11897c: 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 );
11897d: 8d 45 e4 lea -0x1c(%ebp),%eax
118980: 50 push %eax
118981: 56 push %esi
118982: 68 60 34 14 00 push $0x143460
118987: e8 50 29 00 00 call 11b2dc <_Objects_Get>
switch ( location ) {
11898c: 83 c4 10 add $0x10,%esp
11898f: 8b 4d e4 mov -0x1c(%ebp),%ecx
118992: 85 c9 test %ecx,%ecx
118994: 75 5a jne 1189f0 <rtems_timer_fire_when+0xd8>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118996: 8d 48 10 lea 0x10(%eax),%ecx
118999: 83 ec 0c sub $0xc,%esp
11899c: 51 push %ecx
11899d: 89 45 d0 mov %eax,-0x30(%ebp)
1189a0: 89 4d d4 mov %ecx,-0x2c(%ebp)
1189a3: e8 e8 45 00 00 call 11cf90 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY;
1189a8: 8b 55 d0 mov -0x30(%ebp),%edx
1189ab: 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;
1189b2: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
1189b9: 89 5a 2c mov %ebx,0x2c(%edx)
the_watchdog->id = id;
1189bc: 89 72 30 mov %esi,0x30(%edx)
the_watchdog->user_data = user_data;
1189bf: 8b 45 14 mov 0x14(%ebp),%eax
1189c2: 89 42 34 mov %eax,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
1189c5: 2b 3d c8 2a 14 00 sub 0x142ac8,%edi
1189cb: 89 7a 1c mov %edi,0x1c(%edx)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
1189ce: 58 pop %eax
1189cf: 5a pop %edx
1189d0: 8b 4d d4 mov -0x2c(%ebp),%ecx
1189d3: 51 push %ecx
1189d4: 68 f4 2a 14 00 push $0x142af4
1189d9: e8 72 44 00 00 call 11ce50 <_Watchdog_Insert>
&the_timer->Ticker,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
1189de: e8 71 34 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
1189e3: 83 c4 10 add $0x10,%esp
1189e6: 31 c0 xor %eax,%eax
1189e8: e9 4b ff ff ff jmp 118938 <rtems_timer_fire_when+0x20>
1189ed: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
1189f0: b8 04 00 00 00 mov $0x4,%eax
1189f5: e9 3e ff ff ff jmp 118938 <rtems_timer_fire_when+0x20>
1189fa: 66 90 xchg %ax,%ax
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
1189fc: b8 09 00 00 00 mov $0x9,%eax
118a01: e9 32 ff ff ff jmp 118938 <rtems_timer_fire_when+0x20>
001190b0 <rtems_timer_initiate_server>:
rtems_status_code rtems_timer_initiate_server(
uint32_t priority,
uint32_t stack_size,
rtems_attribute attribute_set
)
{
1190b0: 55 push %ebp
1190b1: 89 e5 mov %esp,%ebp
1190b3: 56 push %esi
1190b4: 53 push %ebx
1190b5: 83 ec 10 sub $0x10,%esp
1190b8: 8b 45 08 mov 0x8(%ebp),%eax
1190bb: 85 c0 test %eax,%eax
1190bd: 74 41 je 119100 <rtems_timer_initiate_server+0x50>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
1190bf: 0f b6 15 d4 a2 13 00 movzbl 0x13a2d4,%edx
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
1190c6: 39 d0 cmp %edx,%eax
1190c8: 76 42 jbe 11910c <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 )
1190ca: 40 inc %eax
1190cb: 75 33 jne 119100 <rtems_timer_initiate_server+0x50>
return RTEMS_INVALID_PRIORITY;
_priority = 0;
1190cd: 31 f6 xor %esi,%esi
1190cf: 8b 15 30 2a 14 00 mov 0x142a30,%edx
1190d5: 42 inc %edx
1190d6: 89 15 30 2a 14 00 mov %edx,0x142a30
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
1190dc: 8a 1d 60 e3 13 00 mov 0x13e360,%bl
initialized = true;
1190e2: c6 05 60 e3 13 00 01 movb $0x1,0x13e360
_Thread_Enable_dispatch();
1190e9: e8 66 2d 00 00 call 11be54 <_Thread_Enable_dispatch>
if ( tmpInitialized )
1190ee: 84 db test %bl,%bl
1190f0: 74 1e je 119110 <rtems_timer_initiate_server+0x60>
return RTEMS_INCORRECT_STATE;
1190f2: b8 0e 00 00 00 mov $0xe,%eax
initialized = false;
}
#endif
return status;
}
1190f7: 8d 65 f8 lea -0x8(%ebp),%esp
1190fa: 5b pop %ebx
1190fb: 5e pop %esi
1190fc: c9 leave
1190fd: c3 ret
1190fe: 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;
119100: b8 13 00 00 00 mov $0x13,%eax
initialized = false;
}
#endif
return status;
}
119105: 8d 65 f8 lea -0x8(%ebp),%esp
119108: 5b pop %ebx
119109: 5e pop %esi
11910a: c9 leave
11910b: c3 ret
11910c: 89 c6 mov %eax,%esi
11910e: eb bf jmp 1190cf <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(
119110: 83 ec 08 sub $0x8,%esp
119113: 8d 45 f4 lea -0xc(%ebp),%eax
119116: 50 push %eax
119117: 8b 45 10 mov 0x10(%ebp),%eax
11911a: 80 cc 80 or $0x80,%ah
11911d: 50 push %eax
11911e: 68 00 01 00 00 push $0x100
119123: ff 75 0c pushl 0xc(%ebp)
119126: 56 push %esi
119127: 68 45 4d 49 54 push $0x54494d45
11912c: e8 c7 ec ff ff call 117df8 <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) {
119131: 83 c4 20 add $0x20,%esp
119134: 85 c0 test %eax,%eax
119136: 74 10 je 119148 <rtems_timer_initiate_server+0x98>
initialized = false;
119138: c6 05 60 e3 13 00 00 movb $0x0,0x13e360
initialized = false;
}
#endif
return status;
}
11913f: 8d 65 f8 lea -0x8(%ebp),%esp
119142: 5b pop %ebx
119143: 5e pop %esi
119144: c9 leave
119145: c3 ret
119146: 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)
119148: 8b 45 f4 mov -0xc(%ebp),%eax
*/
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return NULL;
#endif
return information->local_table[ index ];
11914b: 0f b7 c8 movzwl %ax,%ecx
11914e: 8b 15 dc 29 14 00 mov 0x1429dc,%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(
119154: 8b 14 8a mov (%edx,%ecx,4),%edx
119157: 89 15 e0 e2 13 00 mov %edx,0x13e2e0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
11915d: c7 05 10 e3 13 00 14 movl $0x13e314,0x13e310
119164: e3 13 00
head->previous = NULL;
119167: c7 05 14 e3 13 00 00 movl $0x0,0x13e314
11916e: 00 00 00
tail->previous = head;
119171: c7 05 18 e3 13 00 10 movl $0x13e310,0x13e318
119178: e3 13 00
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
11917b: c7 05 48 e3 13 00 4c movl $0x13e34c,0x13e348
119182: e3 13 00
head->previous = NULL;
119185: c7 05 4c e3 13 00 00 movl $0x0,0x13e34c
11918c: 00 00 00
tail->previous = head;
11918f: c7 05 50 e3 13 00 48 movl $0x13e348,0x13e350
119196: e3 13 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
119199: c7 05 f0 e2 13 00 00 movl $0x0,0x13e2f0
1191a0: 00 00 00
the_watchdog->routine = routine;
1191a3: c7 05 04 e3 13 00 a0 movl $0x11bca0,0x13e304
1191aa: bc 11 00
the_watchdog->id = id;
1191ad: a3 08 e3 13 00 mov %eax,0x13e308
the_watchdog->user_data = user_data;
1191b2: c7 05 0c e3 13 00 00 movl $0x0,0x13e30c
1191b9: 00 00 00
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
1191bc: c7 05 28 e3 13 00 00 movl $0x0,0x13e328
1191c3: 00 00 00
the_watchdog->routine = routine;
1191c6: c7 05 3c e3 13 00 a0 movl $0x11bca0,0x13e33c
1191cd: bc 11 00
the_watchdog->id = id;
1191d0: a3 40 e3 13 00 mov %eax,0x13e340
the_watchdog->user_data = user_data;
1191d5: c7 05 44 e3 13 00 00 movl $0x0,0x13e344
1191dc: 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;
1191df: c7 05 e4 e2 13 00 80 movl $0x118f80,0x13e2e4
1191e6: 8f 11 00
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
1191e9: 8b 15 64 2b 14 00 mov 0x142b64,%edx
1191ef: 89 15 1c e3 13 00 mov %edx,0x13e31c
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
1191f5: 8b 15 c8 2a 14 00 mov 0x142ac8,%edx
1191fb: 89 15 54 e3 13 00 mov %edx,0x13e354
ts->insert_chain = NULL;
119201: c7 05 58 e3 13 00 00 movl $0x0,0x13e358
119208: 00 00 00
ts->active = false;
11920b: c6 05 5c e3 13 00 00 movb $0x0,0x13e35c
/*
* The default timer server is now available.
*/
_Timer_server = ts;
119212: c7 05 a0 34 14 00 e0 movl $0x13e2e0,0x1434a0
119219: e2 13 00
/*
* Start the timer server
*/
status = rtems_task_start(
11921c: 53 push %ebx
11921d: 68 e0 e2 13 00 push $0x13e2e0
119222: 68 b8 8d 11 00 push $0x118db8
119227: 50 push %eax
119228: e8 8b f2 ff ff call 1184b8 <rtems_task_start>
if (status) {
initialized = false;
}
#endif
return status;
11922d: 83 c4 10 add $0x10,%esp
119230: e9 d0 fe ff ff jmp 119105 <rtems_timer_initiate_server+0x55>
00118a90 <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
118a90: 55 push %ebp
118a91: 89 e5 mov %esp,%ebp
118a93: 56 push %esi
118a94: 53 push %ebx
118a95: 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 );
118a98: 8d 45 f4 lea -0xc(%ebp),%eax
118a9b: 50 push %eax
118a9c: ff 75 08 pushl 0x8(%ebp)
118a9f: 68 60 34 14 00 push $0x143460
118aa4: e8 33 28 00 00 call 11b2dc <_Objects_Get>
118aa9: 89 c3 mov %eax,%ebx
switch ( location ) {
118aab: 83 c4 10 add $0x10,%esp
118aae: 8b 45 f4 mov -0xc(%ebp),%eax
118ab1: 85 c0 test %eax,%eax
118ab3: 74 0f je 118ac4 <rtems_timer_reset+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118ab5: b8 04 00 00 00 mov $0x4,%eax
}
118aba: 8d 65 f8 lea -0x8(%ebp),%esp
118abd: 5b pop %ebx
118abe: 5e pop %esi
118abf: c9 leave
118ac0: c3 ret
118ac1: 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 ) {
118ac4: 8b 43 38 mov 0x38(%ebx),%eax
118ac7: 85 c0 test %eax,%eax
118ac9: 74 1d je 118ae8 <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 ) {
118acb: 48 dec %eax
118acc: 74 3a je 118b08 <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;
118ace: b8 0b 00 00 00 mov $0xb,%eax
}
_Thread_Enable_dispatch();
118ad3: 89 45 e4 mov %eax,-0x1c(%ebp)
118ad6: e8 79 33 00 00 call 11be54 <_Thread_Enable_dispatch>
return status;
118adb: 8b 45 e4 mov -0x1c(%ebp),%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118ade: 8d 65 f8 lea -0x8(%ebp),%esp
118ae1: 5b pop %ebx
118ae2: 5e pop %esi
118ae3: c9 leave
118ae4: c3 ret
118ae5: 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 );
118ae8: 83 c3 10 add $0x10,%ebx
118aeb: 83 ec 0c sub $0xc,%esp
118aee: 53 push %ebx
118aef: e8 9c 44 00 00 call 11cf90 <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
118af4: 59 pop %ecx
118af5: 5e pop %esi
118af6: 53 push %ebx
118af7: 68 00 2b 14 00 push $0x142b00
118afc: e8 4f 43 00 00 call 11ce50 <_Watchdog_Insert>
118b01: 83 c4 10 add $0x10,%esp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
118b04: 31 c0 xor %eax,%eax
118b06: eb cb jmp 118ad3 <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;
118b08: 8b 35 a0 34 14 00 mov 0x1434a0,%esi
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
118b0e: 83 ec 0c sub $0xc,%esp
118b11: 8d 43 10 lea 0x10(%ebx),%eax
118b14: 50 push %eax
118b15: e8 76 44 00 00 call 11cf90 <_Watchdog_Remove>
(*timer_server->schedule_operation)( timer_server, the_timer );
118b1a: 58 pop %eax
118b1b: 5a pop %edx
118b1c: 53 push %ebx
118b1d: 56 push %esi
118b1e: ff 56 04 call *0x4(%esi)
118b21: 83 c4 10 add $0x10,%esp
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
118b24: 31 c0 xor %eax,%eax
118b26: eb ab jmp 118ad3 <rtems_timer_reset+0x43>
00118b28 <rtems_timer_server_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118b28: 55 push %ebp
118b29: 89 e5 mov %esp,%ebp
118b2b: 57 push %edi
118b2c: 56 push %esi
118b2d: 53 push %ebx
118b2e: 83 ec 2c sub $0x2c,%esp
118b31: 8b 7d 0c mov 0xc(%ebp),%edi
118b34: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
118b37: 8b 1d a0 34 14 00 mov 0x1434a0,%ebx
if ( !timer_server )
118b3d: 85 db test %ebx,%ebx
118b3f: 0f 84 9f 00 00 00 je 118be4 <rtems_timer_server_fire_after+0xbc>
return RTEMS_INCORRECT_STATE;
if ( !routine )
118b45: 85 f6 test %esi,%esi
118b47: 0f 84 a3 00 00 00 je 118bf0 <rtems_timer_server_fire_after+0xc8>
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
118b4d: 85 ff test %edi,%edi
118b4f: 75 0f jne 118b60 <rtems_timer_server_fire_after+0x38>
return RTEMS_INVALID_NUMBER;
118b51: b8 0a 00 00 00 mov $0xa,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118b56: 8d 65 f4 lea -0xc(%ebp),%esp
118b59: 5b pop %ebx
118b5a: 5e pop %esi
118b5b: 5f pop %edi
118b5c: c9 leave
118b5d: c3 ret
118b5e: 66 90 xchg %ax,%ax
118b60: 52 push %edx
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
118b61: 8d 45 e4 lea -0x1c(%ebp),%eax
118b64: 50 push %eax
118b65: ff 75 08 pushl 0x8(%ebp)
118b68: 68 60 34 14 00 push $0x143460
118b6d: e8 6a 27 00 00 call 11b2dc <_Objects_Get>
118b72: 89 c2 mov %eax,%edx
switch ( location ) {
118b74: 83 c4 10 add $0x10,%esp
118b77: 8b 45 e4 mov -0x1c(%ebp),%eax
118b7a: 85 c0 test %eax,%eax
118b7c: 75 56 jne 118bd4 <rtems_timer_server_fire_after+0xac>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118b7e: 83 ec 0c sub $0xc,%esp
118b81: 8d 42 10 lea 0x10(%edx),%eax
118b84: 50 push %eax
118b85: 89 55 d4 mov %edx,-0x2c(%ebp)
118b88: e8 03 44 00 00 call 11cf90 <_Watchdog_Remove>
_ISR_Disable( level );
118b8d: 9c pushf
118b8e: fa cli
118b8f: 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 ) {
118b90: 83 c4 10 add $0x10,%esp
118b93: 8b 55 d4 mov -0x2c(%ebp),%edx
118b96: 8b 4a 18 mov 0x18(%edx),%ecx
118b99: 85 c9 test %ecx,%ecx
118b9b: 75 5f jne 118bfc <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;
118b9d: 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;
118ba4: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
118bab: 89 72 2c mov %esi,0x2c(%edx)
the_watchdog->id = id;
118bae: 8b 4d 08 mov 0x8(%ebp),%ecx
118bb1: 89 4a 30 mov %ecx,0x30(%edx)
the_watchdog->user_data = user_data;
118bb4: 8b 4d 14 mov 0x14(%ebp),%ecx
118bb7: 89 4a 34 mov %ecx,0x34(%edx)
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = ticks;
118bba: 89 7a 1c mov %edi,0x1c(%edx)
_ISR_Enable( level );
118bbd: 50 push %eax
118bbe: 9d popf
(*timer_server->schedule_operation)( timer_server, the_timer );
118bbf: 83 ec 08 sub $0x8,%esp
118bc2: 52 push %edx
118bc3: 53 push %ebx
118bc4: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
118bc7: e8 88 32 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118bcc: 83 c4 10 add $0x10,%esp
118bcf: 31 c0 xor %eax,%eax
118bd1: eb 83 jmp 118b56 <rtems_timer_server_fire_after+0x2e>
118bd3: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118bd4: b8 04 00 00 00 mov $0x4,%eax
}
118bd9: 8d 65 f4 lea -0xc(%ebp),%esp
118bdc: 5b pop %ebx
118bdd: 5e pop %esi
118bde: 5f pop %edi
118bdf: c9 leave
118be0: c3 ret
118be1: 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;
118be4: b8 0e 00 00 00 mov $0xe,%eax
118be9: e9 68 ff ff ff jmp 118b56 <rtems_timer_server_fire_after+0x2e>
118bee: 66 90 xchg %ax,%ax
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118bf0: b8 09 00 00 00 mov $0x9,%eax
118bf5: e9 5c ff ff ff jmp 118b56 <rtems_timer_server_fire_after+0x2e>
118bfa: 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 );
118bfc: 50 push %eax
118bfd: 9d popf
_Thread_Enable_dispatch();
118bfe: e8 51 32 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118c03: 31 c0 xor %eax,%eax
118c05: e9 4c ff ff ff jmp 118b56 <rtems_timer_server_fire_after+0x2e>
00118c0c <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
118c0c: 55 push %ebp
118c0d: 89 e5 mov %esp,%ebp
118c0f: 57 push %edi
118c10: 56 push %esi
118c11: 53 push %ebx
118c12: 83 ec 2c sub $0x2c,%esp
118c15: 8b 7d 0c mov 0xc(%ebp),%edi
118c18: 8b 75 10 mov 0x10(%ebp),%esi
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
118c1b: 8b 1d a0 34 14 00 mov 0x1434a0,%ebx
if ( !timer_server )
118c21: 85 db test %ebx,%ebx
118c23: 0f 84 d7 00 00 00 je 118d00 <rtems_timer_server_fire_when+0xf4>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
118c29: 80 3d 44 2a 14 00 00 cmpb $0x0,0x142a44
118c30: 0f 84 aa 00 00 00 je 118ce0 <rtems_timer_server_fire_when+0xd4><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
118c36: 85 f6 test %esi,%esi
118c38: 0f 84 b2 00 00 00 je 118cf0 <rtems_timer_server_fire_when+0xe4>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
118c3e: 83 ec 0c sub $0xc,%esp
118c41: 57 push %edi
118c42: e8 95 d1 ff ff call 115ddc <_TOD_Validate>
118c47: 83 c4 10 add $0x10,%esp
118c4a: 84 c0 test %al,%al
118c4c: 75 0e jne 118c5c <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;
118c4e: b8 14 00 00 00 mov $0x14,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118c53: 8d 65 f4 lea -0xc(%ebp),%esp
118c56: 5b pop %ebx
118c57: 5e pop %esi
118c58: 5f pop %edi
118c59: c9 leave
118c5a: c3 ret
118c5b: 90 nop
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
118c5c: 83 ec 0c sub $0xc,%esp
118c5f: 57 push %edi
118c60: e8 eb d0 ff ff call 115d50 <_TOD_To_seconds>
118c65: 89 c7 mov %eax,%edi
if ( seconds <= _TOD_Seconds_since_epoch() )
118c67: 83 c4 10 add $0x10,%esp
118c6a: 3b 05 c8 2a 14 00 cmp 0x142ac8,%eax
118c70: 76 dc jbe 118c4e <rtems_timer_server_fire_when+0x42>
118c72: 52 push %edx
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
118c73: 8d 45 e4 lea -0x1c(%ebp),%eax
118c76: 50 push %eax
118c77: ff 75 08 pushl 0x8(%ebp)
118c7a: 68 60 34 14 00 push $0x143460
118c7f: e8 58 26 00 00 call 11b2dc <_Objects_Get>
118c84: 89 c2 mov %eax,%edx
switch ( location ) {
118c86: 83 c4 10 add $0x10,%esp
118c89: 8b 45 e4 mov -0x1c(%ebp),%eax
118c8c: 85 c0 test %eax,%eax
118c8e: 75 7c jne 118d0c <rtems_timer_server_fire_when+0x100>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
118c90: 83 ec 0c sub $0xc,%esp
118c93: 8d 42 10 lea 0x10(%edx),%eax
118c96: 50 push %eax
118c97: 89 55 d4 mov %edx,-0x2c(%ebp)
118c9a: e8 f1 42 00 00 call 11cf90 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
118c9f: 8b 55 d4 mov -0x2c(%ebp),%edx
118ca2: 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;
118ca9: c7 42 18 00 00 00 00 movl $0x0,0x18(%edx)
the_watchdog->routine = routine;
118cb0: 89 72 2c mov %esi,0x2c(%edx)
the_watchdog->id = id;
118cb3: 8b 45 08 mov 0x8(%ebp),%eax
118cb6: 89 42 30 mov %eax,0x30(%edx)
the_watchdog->user_data = user_data;
118cb9: 8b 45 14 mov 0x14(%ebp),%eax
118cbc: 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();
118cbf: 2b 3d c8 2a 14 00 sub 0x142ac8,%edi
118cc5: 89 7a 1c mov %edi,0x1c(%edx)
(*timer_server->schedule_operation)( timer_server, the_timer );
118cc8: 58 pop %eax
118cc9: 59 pop %ecx
118cca: 52 push %edx
118ccb: 53 push %ebx
118ccc: ff 53 04 call *0x4(%ebx)
_Thread_Enable_dispatch();
118ccf: e8 80 31 00 00 call 11be54 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
118cd4: 83 c4 10 add $0x10,%esp
118cd7: 31 c0 xor %eax,%eax
118cd9: e9 75 ff ff ff jmp 118c53 <rtems_timer_server_fire_when+0x47>
118cde: 66 90 xchg %ax,%ax
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
118ce0: b8 0b 00 00 00 mov $0xb,%eax <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118ce5: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED
118ce8: 5b pop %ebx <== NOT EXECUTED
118ce9: 5e pop %esi <== NOT EXECUTED
118cea: 5f pop %edi <== NOT EXECUTED
118ceb: c9 leave <== NOT EXECUTED
118cec: c3 ret <== NOT EXECUTED
118ced: 8d 76 00 lea 0x0(%esi),%esi <== NOT EXECUTED
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
118cf0: b8 09 00 00 00 mov $0x9,%eax
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
118cf5: 8d 65 f4 lea -0xc(%ebp),%esp
118cf8: 5b pop %ebx
118cf9: 5e pop %esi
118cfa: 5f pop %edi
118cfb: c9 leave
118cfc: c3 ret
118cfd: 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;
118d00: b8 0e 00 00 00 mov $0xe,%eax
118d05: e9 49 ff ff ff jmp 118c53 <rtems_timer_server_fire_when+0x47>
118d0a: 66 90 xchg %ax,%ax
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
118d0c: b8 04 00 00 00 mov $0x4,%eax
118d11: e9 3d ff ff ff jmp 118c53 <rtems_timer_server_fire_when+0x47>
0010be34 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
10be34: 55 push %ebp
10be35: 89 e5 mov %esp,%ebp
10be37: 83 ec 08 sub $0x8,%esp
10be3a: 8b 45 08 mov 0x8(%ebp),%eax
switch ( policy ) {
10be3d: 85 c0 test %eax,%eax
10be3f: 78 0a js 10be4b <sched_get_priority_max+0x17>
10be41: 83 f8 02 cmp $0x2,%eax
10be44: 7e 1a jle 10be60 <sched_get_priority_max+0x2c>
10be46: 83 f8 04 cmp $0x4,%eax
10be49: 74 15 je 10be60 <sched_get_priority_max+0x2c><== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10be4b: e8 20 81 00 00 call 113f70 <__errno>
10be50: c7 00 16 00 00 00 movl $0x16,(%eax)
10be56: b8 ff ff ff ff mov $0xffffffff,%eax
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
}
10be5b: c9 leave
10be5c: c3 ret
10be5d: 8d 76 00 lea 0x0(%esi),%esi
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
10be60: 0f b6 05 9c 4d 12 00 movzbl 0x124d9c,%eax
10be67: 48 dec %eax
}
10be68: c9 leave
10be69: c3 ret
0010be6c <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
10be6c: 55 push %ebp
10be6d: 89 e5 mov %esp,%ebp
10be6f: 83 ec 08 sub $0x8,%esp
10be72: 8b 45 08 mov 0x8(%ebp),%eax
switch ( policy ) {
10be75: 85 c0 test %eax,%eax
10be77: 78 0a js 10be83 <sched_get_priority_min+0x17>
10be79: 83 f8 02 cmp $0x2,%eax
10be7c: 7e 1a jle 10be98 <sched_get_priority_min+0x2c><== ALWAYS TAKEN
10be7e: 83 f8 04 cmp $0x4,%eax <== NOT EXECUTED
10be81: 74 15 je 10be98 <sched_get_priority_min+0x2c><== NOT EXECUTED
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
10be83: e8 e8 80 00 00 call 113f70 <__errno>
10be88: c7 00 16 00 00 00 movl $0x16,(%eax)
10be8e: b8 ff ff ff ff mov $0xffffffff,%eax
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
}
10be93: c9 leave
10be94: c3 ret
10be95: 8d 76 00 lea 0x0(%esi),%esi
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
10be98: b8 01 00 00 00 mov $0x1,%eax
}
10be9d: c9 leave
10be9e: c3 ret
0010bea0 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
10bea0: 55 push %ebp
10bea1: 89 e5 mov %esp,%ebp
10bea3: 56 push %esi
10bea4: 53 push %ebx
10bea5: 8b 75 08 mov 0x8(%ebp),%esi
10bea8: 8b 5d 0c mov 0xc(%ebp),%ebx
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10beab: 85 f6 test %esi,%esi
10bead: 75 21 jne 10bed0 <sched_rr_get_interval+0x30><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
10beaf: 85 db test %ebx,%ebx
10beb1: 74 38 je 10beeb <sched_rr_get_interval+0x4b>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
10beb3: 83 ec 08 sub $0x8,%esp
10beb6: 53 push %ebx
10beb7: ff 35 60 90 12 00 pushl 0x129060
10bebd: e8 b2 35 00 00 call 10f474 <_Timespec_From_ticks>
return 0;
10bec2: 83 c4 10 add $0x10,%esp
10bec5: 31 c0 xor %eax,%eax
}
10bec7: 8d 65 f8 lea -0x8(%ebp),%esp
10beca: 5b pop %ebx
10becb: 5e pop %esi
10becc: c9 leave
10becd: c3 ret
10bece: 66 90 xchg %ax,%ax
{
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
10bed0: e8 fb c8 ff ff call 1087d0 <getpid>
10bed5: 39 f0 cmp %esi,%eax
10bed7: 74 d6 je 10beaf <sched_rr_get_interval+0xf>
rtems_set_errno_and_return_minus_one( ESRCH );
10bed9: e8 92 80 00 00 call 113f70 <__errno>
10bede: c7 00 03 00 00 00 movl $0x3,(%eax)
10bee4: b8 ff ff ff ff mov $0xffffffff,%eax
10bee9: eb dc jmp 10bec7 <sched_rr_get_interval+0x27>
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
10beeb: e8 80 80 00 00 call 113f70 <__errno>
10bef0: c7 00 16 00 00 00 movl $0x16,(%eax)
10bef6: b8 ff ff ff ff mov $0xffffffff,%eax
10befb: eb ca jmp 10bec7 <sched_rr_get_interval+0x27>
0010e604 <sem_close>:
*/
int sem_close(
sem_t *sem
)
{
10e604: 55 push %ebp
10e605: 89 e5 mov %esp,%ebp
10e607: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e60a: 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 );
10e60d: 50 push %eax
10e60e: 8b 45 08 mov 0x8(%ebp),%eax
10e611: ff 30 pushl (%eax)
10e613: 68 20 de 12 00 push $0x12de20
10e618: e8 bf 21 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e61d: 83 c4 10 add $0x10,%esp
10e620: 8b 55 f4 mov -0xc(%ebp),%edx
10e623: 85 d2 test %edx,%edx
10e625: 74 15 je 10e63c <sem_close+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e627: e8 7c 8f 00 00 call 1175a8 <__errno>
10e62c: c7 00 16 00 00 00 movl $0x16,(%eax)
10e632: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e637: c9 leave
10e638: c3 ret
10e639: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_semaphore->open_count -= 1;
10e63c: ff 48 18 decl 0x18(%eax)
_POSIX_Semaphore_Delete( the_semaphore );
10e63f: 83 ec 0c sub $0xc,%esp
10e642: 50 push %eax
10e643: e8 3c 64 00 00 call 114a84 <_POSIX_Semaphore_Delete>
_Thread_Enable_dispatch();
10e648: e8 87 2d 00 00 call 1113d4 <_Thread_Enable_dispatch>
return 0;
10e64d: 83 c4 10 add $0x10,%esp
10e650: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e652: c9 leave
10e653: c3 ret
0010e654 <sem_destroy>:
*/
int sem_destroy(
sem_t *sem
)
{
10e654: 55 push %ebp
10e655: 89 e5 mov %esp,%ebp
10e657: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e65a: 8d 45 f4 lea -0xc(%ebp),%eax
10e65d: 50 push %eax
10e65e: 8b 45 08 mov 0x8(%ebp),%eax
10e661: ff 30 pushl (%eax)
10e663: 68 20 de 12 00 push $0x12de20
10e668: e8 6f 21 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e66d: 83 c4 10 add $0x10,%esp
10e670: 8b 55 f4 mov -0xc(%ebp),%edx
10e673: 85 d2 test %edx,%edx
10e675: 74 15 je 10e68c <sem_destroy+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e677: e8 2c 8f 00 00 call 1175a8 <__errno>
10e67c: c7 00 16 00 00 00 movl $0x16,(%eax)
10e682: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e687: c9 leave
10e688: c3 ret
10e689: 8d 76 00 lea 0x0(%esi),%esi
case OBJECTS_LOCAL:
/*
* Undefined operation on a named semaphore.
*/
if ( the_semaphore->named == true ) {
10e68c: 80 78 14 00 cmpb $0x0,0x14(%eax)
10e690: 75 16 jne 10e6a8 <sem_destroy+0x54>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EINVAL );
}
_POSIX_Semaphore_Delete( the_semaphore );
10e692: 83 ec 0c sub $0xc,%esp
10e695: 50 push %eax
10e696: e8 e9 63 00 00 call 114a84 <_POSIX_Semaphore_Delete>
_Thread_Enable_dispatch();
10e69b: e8 34 2d 00 00 call 1113d4 <_Thread_Enable_dispatch>
return 0;
10e6a0: 83 c4 10 add $0x10,%esp
10e6a3: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e6a5: c9 leave
10e6a6: c3 ret
10e6a7: 90 nop
/*
* Undefined operation on a named semaphore.
*/
if ( the_semaphore->named == true ) {
_Thread_Enable_dispatch();
10e6a8: e8 27 2d 00 00 call 1113d4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EINVAL );
10e6ad: e8 f6 8e 00 00 call 1175a8 <__errno>
10e6b2: c7 00 16 00 00 00 movl $0x16,(%eax)
10e6b8: b8 ff ff ff ff mov $0xffffffff,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e6bd: c9 leave
10e6be: c3 ret
0010e6c0 <sem_getvalue>:
int sem_getvalue(
sem_t *sem,
int *sval
)
{
10e6c0: 55 push %ebp
10e6c1: 89 e5 mov %esp,%ebp
10e6c3: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e6c6: 8d 45 f4 lea -0xc(%ebp),%eax
10e6c9: 50 push %eax
10e6ca: 8b 45 08 mov 0x8(%ebp),%eax
10e6cd: ff 30 pushl (%eax)
10e6cf: 68 20 de 12 00 push $0x12de20
10e6d4: e8 03 21 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e6d9: 83 c4 10 add $0x10,%esp
10e6dc: 8b 55 f4 mov -0xc(%ebp),%edx
10e6df: 85 d2 test %edx,%edx
10e6e1: 74 15 je 10e6f8 <sem_getvalue+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e6e3: e8 c0 8e 00 00 call 1175a8 <__errno>
10e6e8: c7 00 16 00 00 00 movl $0x16,(%eax)
10e6ee: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e6f3: c9 leave
10e6f4: c3 ret
10e6f5: 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 );
10e6f8: 8b 50 64 mov 0x64(%eax),%edx
10e6fb: 8b 45 0c mov 0xc(%ebp),%eax
10e6fe: 89 10 mov %edx,(%eax)
_Thread_Enable_dispatch();
10e700: e8 cf 2c 00 00 call 1113d4 <_Thread_Enable_dispatch>
return 0;
10e705: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e707: c9 leave
10e708: c3 ret
0010e754 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
10e754: 55 push %ebp
10e755: 89 e5 mov %esp,%ebp
10e757: 57 push %edi
10e758: 56 push %esi
10e759: 53 push %ebx
10e75a: 83 ec 2c sub $0x2c,%esp
10e75d: 8b 75 08 mov 0x8(%ebp),%esi
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10e760: a1 10 db 12 00 mov 0x12db10,%eax
10e765: 40 inc %eax
10e766: a3 10 db 12 00 mov %eax,0x12db10
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
10e76b: 8b 7d 0c mov 0xc(%ebp),%edi
10e76e: 81 e7 00 02 00 00 and $0x200,%edi
10e774: 0f 85 86 00 00 00 jne 10e800 <sem_open+0xac>
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
10e77a: 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 );
10e781: 83 ec 08 sub $0x8,%esp
10e784: 8d 45 e4 lea -0x1c(%ebp),%eax
10e787: 50 push %eax
10e788: 56 push %esi
10e789: e8 46 63 00 00 call 114ad4 <_POSIX_Semaphore_Name_to_id>
10e78e: 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 ) {
10e790: 83 c4 10 add $0x10,%esp
10e793: 85 c0 test %eax,%eax
10e795: 74 25 je 10e7bc <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) ) ) {
10e797: 83 f8 02 cmp $0x2,%eax
10e79a: 75 04 jne 10e7a0 <sem_open+0x4c> <== NEVER TAKEN
10e79c: 85 ff test %edi,%edi
10e79e: 75 6c jne 10e80c <sem_open+0xb8>
_Thread_Enable_dispatch();
10e7a0: e8 2f 2c 00 00 call 1113d4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
10e7a5: e8 fe 8d 00 00 call 1175a8 <__errno>
10e7aa: 89 18 mov %ebx,(%eax)
10e7ac: b8 ff ff ff ff mov $0xffffffff,%eax
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
10e7b1: 8d 65 f4 lea -0xc(%ebp),%esp
10e7b4: 5b pop %ebx
10e7b5: 5e pop %esi
10e7b6: 5f pop %edi
10e7b7: c9 leave
10e7b8: c3 ret
10e7b9: 8d 76 00 lea 0x0(%esi),%esi
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
10e7bc: 8b 45 0c mov 0xc(%ebp),%eax
10e7bf: 25 00 0a 00 00 and $0xa00,%eax
10e7c4: 3d 00 0a 00 00 cmp $0xa00,%eax
10e7c9: 74 65 je 10e830 <sem_open+0xdc>
10e7cb: 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 );
10e7cc: 8d 45 dc lea -0x24(%ebp),%eax
10e7cf: 50 push %eax
10e7d0: ff 75 e4 pushl -0x1c(%ebp)
10e7d3: 68 20 de 12 00 push $0x12de20
10e7d8: e8 ff 1f 00 00 call 1107dc <_Objects_Get>
10e7dd: 89 45 e0 mov %eax,-0x20(%ebp)
the_semaphore->open_count += 1;
10e7e0: ff 40 18 incl 0x18(%eax)
_Thread_Enable_dispatch();
10e7e3: e8 ec 2b 00 00 call 1113d4 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
10e7e8: e8 e7 2b 00 00 call 1113d4 <_Thread_Enable_dispatch>
goto return_id;
10e7ed: 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;
10e7f0: 8b 45 e0 mov -0x20(%ebp),%eax
10e7f3: 83 c0 08 add $0x8,%eax
#endif
return id;
}
10e7f6: 8d 65 f4 lea -0xc(%ebp),%esp
10e7f9: 5b pop %ebx
10e7fa: 5e pop %esi
10e7fb: 5f pop %edi
10e7fc: c9 leave
10e7fd: c3 ret
10e7fe: 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 );
10e800: 8b 45 14 mov 0x14(%ebp),%eax
10e803: 89 45 d4 mov %eax,-0x2c(%ebp)
10e806: e9 76 ff ff ff jmp 10e781 <sem_open+0x2d>
10e80b: 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(
10e80c: 8d 45 e0 lea -0x20(%ebp),%eax
10e80f: 50 push %eax
10e810: ff 75 d4 pushl -0x2c(%ebp)
10e813: 6a 00 push $0x0
10e815: 56 push %esi
10e816: e8 5d 61 00 00 call 114978 <_POSIX_Semaphore_Create_support>
10e81b: 89 c3 mov %eax,%ebx
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
10e81d: e8 b2 2b 00 00 call 1113d4 <_Thread_Enable_dispatch>
if ( status == -1 )
10e822: 83 c4 10 add $0x10,%esp
10e825: 43 inc %ebx
10e826: 75 c8 jne 10e7f0 <sem_open+0x9c>
return SEM_FAILED;
10e828: b8 ff ff ff ff mov $0xffffffff,%eax
10e82d: eb c7 jmp 10e7f6 <sem_open+0xa2>
10e82f: 90 nop
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
10e830: e8 9f 2b 00 00 call 1113d4 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
10e835: e8 6e 8d 00 00 call 1175a8 <__errno>
10e83a: c7 00 11 00 00 00 movl $0x11,(%eax)
10e840: b8 ff ff ff ff mov $0xffffffff,%eax
10e845: eb af jmp 10e7f6 <sem_open+0xa2>
0010e848 <sem_post>:
*/
int sem_post(
sem_t *sem
)
{
10e848: 55 push %ebp
10e849: 89 e5 mov %esp,%ebp
10e84b: 83 ec 1c sub $0x1c,%esp
register POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
10e84e: 8d 45 f4 lea -0xc(%ebp),%eax
10e851: 50 push %eax
10e852: 8b 45 08 mov 0x8(%ebp),%eax
10e855: ff 30 pushl (%eax)
10e857: 68 20 de 12 00 push $0x12de20
10e85c: e8 7b 1f 00 00 call 1107dc <_Objects_Get>
switch ( location ) {
10e861: 83 c4 10 add $0x10,%esp
10e864: 8b 4d f4 mov -0xc(%ebp),%ecx
10e867: 85 c9 test %ecx,%ecx
10e869: 74 15 je 10e880 <sem_post+0x38>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10e86b: e8 38 8d 00 00 call 1175a8 <__errno>
10e870: c7 00 16 00 00 00 movl $0x16,(%eax)
10e876: b8 ff ff ff ff mov $0xffffffff,%eax
}
10e87b: c9 leave
10e87c: c3 ret
10e87d: 8d 76 00 lea 0x0(%esi),%esi
the_semaphore = _POSIX_Semaphore_Get( sem, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_semaphore_Surrender(
10e880: 52 push %edx
10e881: 6a 00 push $0x0
10e883: ff 70 08 pushl 0x8(%eax)
10e886: 83 c0 1c add $0x1c,%eax
10e889: 50 push %eax
10e88a: e8 61 15 00 00 call 10fdf0 <_CORE_semaphore_Surrender>
NULL /* XXX need to define a routine to handle this case */
#else
NULL
#endif
);
_Thread_Enable_dispatch();
10e88f: e8 40 2b 00 00 call 1113d4 <_Thread_Enable_dispatch>
return 0;
10e894: 83 c4 10 add $0x10,%esp
10e897: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10e899: c9 leave
10e89a: c3 ret
0010e89c <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
10e89c: 55 push %ebp
10e89d: 89 e5 mov %esp,%ebp
10e89f: 53 push %ebx
10e8a0: 83 ec 1c sub $0x1c,%esp
10e8a3: 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 );
10e8a6: 8d 45 f4 lea -0xc(%ebp),%eax
10e8a9: 50 push %eax
10e8aa: ff 75 0c pushl 0xc(%ebp)
10e8ad: e8 56 55 00 00 call 113e08 <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
10e8b2: 83 c4 10 add $0x10,%esp
10e8b5: 83 f8 03 cmp $0x3,%eax
10e8b8: 74 16 je 10e8d0 <sem_timedwait+0x34> <== ALWAYS TAKEN
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
10e8ba: 50 push %eax <== NOT EXECUTED
10e8bb: ff 75 f4 pushl -0xc(%ebp) <== NOT EXECUTED
10e8be: 6a 00 push $0x0 <== NOT EXECUTED
10e8c0: 53 push %ebx <== NOT EXECUTED
10e8c1: e8 7a 62 00 00 call 114b40 <_POSIX_Semaphore_Wait_support><== NOT EXECUTED
10e8c6: 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;
}
10e8c9: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED
10e8cc: c9 leave <== NOT EXECUTED
10e8cd: c3 ret <== NOT EXECUTED
10e8ce: 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 );
10e8d0: 52 push %edx
10e8d1: ff 75 f4 pushl -0xc(%ebp)
10e8d4: 6a 01 push $0x1
10e8d6: 53 push %ebx
10e8d7: e8 64 62 00 00 call 114b40 <_POSIX_Semaphore_Wait_support>
10e8dc: 83 c4 10 add $0x10,%esp
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
10e8df: 8b 5d fc mov -0x4(%ebp),%ebx
10e8e2: c9 leave
10e8e3: 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 6d 86 00 00 call 113980 <__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 5b 86 00 00 call 113980 <__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 47 86 00 00 call 113980 <__errno>
10b339: c7 00 0e 00 00 00 movl $0xe,(%eax)
10b33f: eb d8 jmp 10b319 <setitimer+0x25>
0010bd48 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
10bd48: 55 push %ebp
10bd49: 89 e5 mov %esp,%ebp
10bd4b: 57 push %edi
10bd4c: 56 push %esi
10bd4d: 53 push %ebx
10bd4e: 83 ec 1c sub $0x1c,%esp
10bd51: 8b 5d 08 mov 0x8(%ebp),%ebx
10bd54: 8b 45 0c mov 0xc(%ebp),%eax
10bd57: 8b 55 10 mov 0x10(%ebp),%edx
ISR_Level level;
if ( oact )
10bd5a: 85 d2 test %edx,%edx
10bd5c: 74 13 je 10bd71 <sigaction+0x29>
*oact = _POSIX_signals_Vectors[ sig ];
10bd5e: 8d 0c 5b lea (%ebx,%ebx,2),%ecx
10bd61: 8d 34 8d c0 a3 12 00 lea 0x12a3c0(,%ecx,4),%esi
10bd68: b9 03 00 00 00 mov $0x3,%ecx
10bd6d: 89 d7 mov %edx,%edi
10bd6f: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
if ( !sig )
10bd71: 85 db test %ebx,%ebx
10bd73: 74 77 je 10bdec <sigaction+0xa4>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10bd75: 8d 53 ff lea -0x1(%ebx),%edx
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
10bd78: 83 fa 1f cmp $0x1f,%edx
10bd7b: 77 6f ja 10bdec <sigaction+0xa4>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
10bd7d: 83 fb 09 cmp $0x9,%ebx
10bd80: 74 6a je 10bdec <sigaction+0xa4>
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
10bd82: 85 c0 test %eax,%eax
10bd84: 74 62 je 10bde8 <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 );
10bd86: 9c pushf
10bd87: fa cli
10bd88: 8f 45 e4 popl -0x1c(%ebp)
if ( act->sa_handler == SIG_DFL ) {
10bd8b: 8b 50 08 mov 0x8(%eax),%edx
10bd8e: 85 d2 test %edx,%edx
10bd90: 74 36 je 10bdc8 <sigaction+0x80>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
10bd92: 83 ec 0c sub $0xc,%esp
10bd95: 53 push %ebx
10bd96: 89 45 e0 mov %eax,-0x20(%ebp)
10bd99: e8 be 57 00 00 call 11155c <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
10bd9e: 8d 14 5b lea (%ebx,%ebx,2),%edx
10bda1: 8d 14 95 c0 a3 12 00 lea 0x12a3c0(,%edx,4),%edx
10bda8: b9 03 00 00 00 mov $0x3,%ecx
10bdad: 8b 45 e0 mov -0x20(%ebp),%eax
10bdb0: 89 d7 mov %edx,%edi
10bdb2: 89 c6 mov %eax,%esi
10bdb4: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10bdb6: 83 c4 10 add $0x10,%esp
}
_ISR_Enable( level );
10bdb9: ff 75 e4 pushl -0x1c(%ebp)
10bdbc: 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;
10bdbd: 31 c0 xor %eax,%eax
}
10bdbf: 8d 65 f4 lea -0xc(%ebp),%esp
10bdc2: 5b pop %ebx
10bdc3: 5e pop %esi
10bdc4: 5f pop %edi
10bdc5: c9 leave
10bdc6: c3 ret
10bdc7: 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 ];
10bdc8: 8d 34 5b lea (%ebx,%ebx,2),%esi
10bdcb: c1 e6 02 shl $0x2,%esi
10bdce: 8d 86 c0 a3 12 00 lea 0x12a3c0(%esi),%eax
10bdd4: 81 c6 40 38 12 00 add $0x123840,%esi
10bdda: b9 03 00 00 00 mov $0x3,%ecx
10bddf: 89 c7 mov %eax,%edi
10bde1: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
10bde3: eb d4 jmp 10bdb9 <sigaction+0x71>
10bde5: 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;
10bde8: 31 c0 xor %eax,%eax
10bdea: eb d3 jmp 10bdbf <sigaction+0x77>
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
rtems_set_errno_and_return_minus_one( EINVAL );
10bdec: e8 7b 84 00 00 call 11426c <__errno>
10bdf1: c7 00 16 00 00 00 movl $0x16,(%eax)
10bdf7: b8 ff ff ff ff mov $0xffffffff,%eax
10bdfc: eb c1 jmp 10bdbf <sigaction+0x77>
0010c120 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
10c120: 55 push %ebp
10c121: 89 e5 mov %esp,%ebp
10c123: 57 push %edi
10c124: 56 push %esi
10c125: 53 push %ebx
10c126: 83 ec 2c sub $0x2c,%esp
10c129: 8b 5d 08 mov 0x8(%ebp),%ebx
10c12c: 8b 7d 0c mov 0xc(%ebp),%edi
10c12f: 8b 75 10 mov 0x10(%ebp),%esi
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
10c132: 85 db test %ebx,%ebx
10c134: 0f 84 9e 01 00 00 je 10c2d8 <sigtimedwait+0x1b8>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
10c13a: 85 f6 test %esi,%esi
10c13c: 0f 84 3e 01 00 00 je 10c280 <sigtimedwait+0x160>
if ( !_Timespec_Is_valid( timeout ) )
10c142: 83 ec 0c sub $0xc,%esp
10c145: 56 push %esi
10c146: e8 41 36 00 00 call 10f78c <_Timespec_Is_valid>
10c14b: 83 c4 10 add $0x10,%esp
10c14e: 84 c0 test %al,%al
10c150: 0f 84 82 01 00 00 je 10c2d8 <sigtimedwait+0x1b8>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
10c156: 83 ec 0c sub $0xc,%esp
10c159: 56 push %esi
10c15a: e8 95 36 00 00 call 10f7f4 <_Timespec_To_ticks>
if ( !interval )
10c15f: 83 c4 10 add $0x10,%esp
10c162: 85 c0 test %eax,%eax
10c164: 0f 84 6e 01 00 00 je 10c2d8 <sigtimedwait+0x1b8> <== NEVER TAKEN
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10c16a: 85 ff test %edi,%edi
10c16c: 0f 84 18 01 00 00 je 10c28a <sigtimedwait+0x16a> <== NEVER TAKEN
the_thread = _Thread_Executing;
10c172: 8b 0d 98 9b 12 00 mov 0x129b98,%ecx
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
10c178: 8b 91 ec 00 00 00 mov 0xec(%ecx),%edx
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
10c17e: 9c pushf
10c17f: fa cli
10c180: 8f 45 d0 popl -0x30(%ebp)
if ( *set & api->signals_pending ) {
10c183: 8b 33 mov (%ebx),%esi
10c185: 89 75 d4 mov %esi,-0x2c(%ebp)
10c188: 8b b2 d4 00 00 00 mov 0xd4(%edx),%esi
10c18e: 85 75 d4 test %esi,-0x2c(%ebp)
10c191: 0f 85 fd 00 00 00 jne 10c294 <sigtimedwait+0x174>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
10c197: 8b 35 08 9e 12 00 mov 0x129e08,%esi
10c19d: 85 75 d4 test %esi,-0x2c(%ebp)
10c1a0: 0f 85 96 00 00 00 jne 10c23c <sigtimedwait+0x11c>
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
10c1a6: c7 07 ff ff ff ff movl $0xffffffff,(%edi)
10c1ac: 8b 35 f0 95 12 00 mov 0x1295f0,%esi
10c1b2: 46 inc %esi
10c1b3: 89 35 f0 95 12 00 mov %esi,0x1295f0
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
10c1b9: c7 41 44 a0 9d 12 00 movl $0x129da0,0x44(%ecx)
the_thread->Wait.return_code = EINTR;
10c1c0: c7 41 34 04 00 00 00 movl $0x4,0x34(%ecx)
the_thread->Wait.option = *set;
10c1c7: 8b 33 mov (%ebx),%esi
10c1c9: 89 71 30 mov %esi,0x30(%ecx)
the_thread->Wait.return_argument = the_info;
10c1cc: 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;
10c1cf: c7 05 d0 9d 12 00 01 movl $0x1,0x129dd0
10c1d6: 00 00 00
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
10c1d9: ff 75 d0 pushl -0x30(%ebp)
10c1dc: 9d popf
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
10c1dd: 51 push %ecx
10c1de: 68 cc f4 10 00 push $0x10f4cc
10c1e3: 50 push %eax
10c1e4: 68 a0 9d 12 00 push $0x129da0
10c1e9: 89 55 cc mov %edx,-0x34(%ebp)
10c1ec: e8 af 2f 00 00 call 10f1a0 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
10c1f1: e8 06 2b 00 00 call 10ecfc <_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 );
10c1f6: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c1fd: 6a 00 push $0x0
10c1ff: 57 push %edi
10c200: ff 37 pushl (%edi)
10c202: 8b 55 cc mov -0x34(%ebp),%edx
10c205: 52 push %edx
10c206: e8 4d 5a 00 00 call 111c58 <_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)
10c20b: 83 c4 20 add $0x20,%esp
10c20e: a1 98 9b 12 00 mov 0x129b98,%eax
10c213: 83 78 34 04 cmpl $0x4,0x34(%eax)
10c217: 0f 85 d3 00 00 00 jne 10c2f0 <sigtimedwait+0x1d0>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
10c21d: 8b 37 mov (%edi),%esi
10c21f: 8d 4e ff lea -0x1(%esi),%ecx
10c222: b8 01 00 00 00 mov $0x1,%eax
10c227: d3 e0 shl %cl,%eax
10c229: 85 03 test %eax,(%ebx)
10c22b: 0f 84 bf 00 00 00 je 10c2f0 <sigtimedwait+0x1d0>
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c231: 89 f0 mov %esi,%eax
10c233: 8d 65 f4 lea -0xc(%ebp),%esp
10c236: 5b pop %ebx
10c237: 5e pop %esi
10c238: 5f pop %edi
10c239: c9 leave
10c23a: c3 ret
10c23b: 90 nop
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
10c23c: 83 ec 0c sub $0xc,%esp
10c23f: 56 push %esi
10c240: 89 55 cc mov %edx,-0x34(%ebp)
10c243: e8 94 fe ff ff call 10c0dc <_POSIX_signals_Get_lowest>
10c248: 89 c6 mov %eax,%esi
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
10c24a: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c251: 6a 01 push $0x1
10c253: 57 push %edi
10c254: 50 push %eax
10c255: 8b 55 cc mov -0x34(%ebp),%edx
10c258: 52 push %edx
10c259: e8 fa 59 00 00 call 111c58 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
10c25e: ff 75 d0 pushl -0x30(%ebp)
10c261: 9d popf
the_info->si_signo = signo;
10c262: 89 37 mov %esi,(%edi)
the_info->si_code = SI_USER;
10c264: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10c26b: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return signo;
10c272: 83 c4 20 add $0x20,%esp
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c275: 89 f0 mov %esi,%eax
10c277: 8d 65 f4 lea -0xc(%ebp),%esp
10c27a: 5b pop %ebx
10c27b: 5e pop %esi
10c27c: 5f pop %edi
10c27d: c9 leave
10c27e: c3 ret
10c27f: 90 nop
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
10c280: 31 c0 xor %eax,%eax
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
10c282: 85 ff test %edi,%edi
10c284: 0f 85 e8 fe ff ff jne 10c172 <sigtimedwait+0x52>
10c28a: 8d 7d dc lea -0x24(%ebp),%edi
10c28d: e9 e0 fe ff ff jmp 10c172 <sigtimedwait+0x52>
10c292: 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 );
10c294: 83 ec 0c sub $0xc,%esp
10c297: 56 push %esi
10c298: 89 55 cc mov %edx,-0x34(%ebp)
10c29b: e8 3c fe ff ff call 10c0dc <_POSIX_signals_Get_lowest>
10c2a0: 89 07 mov %eax,(%edi)
_POSIX_signals_Clear_signals(
10c2a2: c7 04 24 00 00 00 00 movl $0x0,(%esp)
10c2a9: 6a 00 push $0x0
10c2ab: 57 push %edi
10c2ac: 50 push %eax
10c2ad: 8b 55 cc mov -0x34(%ebp),%edx
10c2b0: 52 push %edx
10c2b1: e8 a2 59 00 00 call 111c58 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
10c2b6: ff 75 d0 pushl -0x30(%ebp)
10c2b9: 9d popf
the_info->si_code = SI_USER;
10c2ba: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi)
the_info->si_value.sival_int = 0;
10c2c1: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi)
return the_info->si_signo;
10c2c8: 8b 37 mov (%edi),%esi
10c2ca: 83 c4 20 add $0x20,%esp
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
10c2cd: 89 f0 mov %esi,%eax
10c2cf: 8d 65 f4 lea -0xc(%ebp),%esp
10c2d2: 5b pop %ebx
10c2d3: 5e pop %esi
10c2d4: 5f pop %edi
10c2d5: c9 leave
10c2d6: c3 ret
10c2d7: 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 );
10c2d8: e8 e3 85 00 00 call 1148c0 <__errno>
10c2dd: c7 00 16 00 00 00 movl $0x16,(%eax)
10c2e3: be ff ff ff ff mov $0xffffffff,%esi
10c2e8: e9 44 ff ff ff jmp 10c231 <sigtimedwait+0x111>
10c2ed: 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;
10c2f0: e8 cb 85 00 00 call 1148c0 <__errno>
10c2f5: 8b 15 98 9b 12 00 mov 0x129b98,%edx
10c2fb: 8b 52 34 mov 0x34(%edx),%edx
10c2fe: 89 10 mov %edx,(%eax)
return -1;
10c300: be ff ff ff ff mov $0xffffffff,%esi
10c305: e9 27 ff ff ff jmp 10c231 <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 a7 80 00 00 call 116070 <__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 <== NOT EXECUTED
10dfd5: c9 leave <== NOT EXECUTED
10dfd6: c3 ret <== NOT EXECUTED
0010b500 <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
10b500: 55 push %ebp
10b501: 89 e5 mov %esp,%ebp
10b503: 56 push %esi
10b504: 53 push %ebx
10b505: 8b 5d 0c mov 0xc(%ebp),%ebx
10b508: 8b 75 10 mov 0x10(%ebp),%esi
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
10b50b: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
10b50f: 0f 85 db 00 00 00 jne 10b5f0 <timer_create+0xf0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
10b515: 85 f6 test %esi,%esi
10b517: 0f 84 d3 00 00 00 je 10b5f0 <timer_create+0xf0>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
10b51d: 85 db test %ebx,%ebx
10b51f: 74 21 je 10b542 <timer_create+0x42>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
10b521: 8b 03 mov (%ebx),%eax
10b523: 48 dec %eax
10b524: 83 f8 01 cmp $0x1,%eax
10b527: 0f 87 c3 00 00 00 ja 10b5f0 <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 )
10b52d: 8b 43 04 mov 0x4(%ebx),%eax
10b530: 85 c0 test %eax,%eax
10b532: 0f 84 b8 00 00 00 je 10b5f0 <timer_create+0xf0> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
10b538: 48 dec %eax
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
10b539: 83 f8 1f cmp $0x1f,%eax
10b53c: 0f 87 ae 00 00 00 ja 10b5f0 <timer_create+0xf0> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
10b542: a1 d0 a0 12 00 mov 0x12a0d0,%eax
10b547: 40 inc %eax
10b548: a3 d0 a0 12 00 mov %eax,0x12a0d0
* 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 );
10b54d: 83 ec 0c sub $0xc,%esp
10b550: 68 20 a4 12 00 push $0x12a420
10b555: e8 9a 1e 00 00 call 10d3f4 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
10b55a: 83 c4 10 add $0x10,%esp
10b55d: 85 c0 test %eax,%eax
10b55f: 0f 84 a2 00 00 00 je 10b607 <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;
10b565: c6 40 3c 02 movb $0x2,0x3c(%eax)
ptimer->thread_id = _Thread_Executing->Object.id;
10b569: 8b 15 78 a6 12 00 mov 0x12a678,%edx
10b56f: 8b 52 08 mov 0x8(%edx),%edx
10b572: 89 50 38 mov %edx,0x38(%eax)
if ( evp != NULL ) {
10b575: 85 db test %ebx,%ebx
10b577: 74 11 je 10b58a <timer_create+0x8a>
ptimer->inf.sigev_notify = evp->sigev_notify;
10b579: 8b 13 mov (%ebx),%edx
10b57b: 89 50 40 mov %edx,0x40(%eax)
ptimer->inf.sigev_signo = evp->sigev_signo;
10b57e: 8b 53 04 mov 0x4(%ebx),%edx
10b581: 89 50 44 mov %edx,0x44(%eax)
ptimer->inf.sigev_value = evp->sigev_value;
10b584: 8b 53 08 mov 0x8(%ebx),%edx
10b587: 89 50 48 mov %edx,0x48(%eax)
}
ptimer->overrun = 0;
10b58a: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
ptimer->timer_data.it_value.tv_sec = 0;
10b591: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax)
ptimer->timer_data.it_value.tv_nsec = 0;
10b598: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax)
ptimer->timer_data.it_interval.tv_sec = 0;
10b59f: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax)
ptimer->timer_data.it_interval.tv_nsec = 0;
10b5a6: 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;
10b5ad: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax)
the_watchdog->routine = routine;
10b5b4: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax)
the_watchdog->id = id;
10b5bb: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax)
the_watchdog->user_data = user_data;
10b5c2: 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 ),
10b5c9: 8b 50 08 mov 0x8(%eax),%edx
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
10b5cc: 0f b7 da movzwl %dx,%ebx
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
10b5cf: 8b 0d 3c a4 12 00 mov 0x12a43c,%ecx
10b5d5: 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;
10b5d8: 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;
10b5df: 89 16 mov %edx,(%esi)
_Thread_Enable_dispatch();
10b5e1: e8 3a 2e 00 00 call 10e420 <_Thread_Enable_dispatch>
return 0;
10b5e6: 31 c0 xor %eax,%eax
}
10b5e8: 8d 65 f8 lea -0x8(%ebp),%esp
10b5eb: 5b pop %ebx
10b5ec: 5e pop %esi
10b5ed: c9 leave
10b5ee: c3 ret
10b5ef: 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 );
10b5f0: e8 2f 8a 00 00 call 114024 <__errno>
10b5f5: c7 00 16 00 00 00 movl $0x16,(%eax)
10b5fb: 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;
}
10b600: 8d 65 f8 lea -0x8(%ebp),%esp
10b603: 5b pop %ebx
10b604: 5e pop %esi
10b605: c9 leave
10b606: c3 ret
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
_Thread_Enable_dispatch();
10b607: e8 14 2e 00 00 call 10e420 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
10b60c: e8 13 8a 00 00 call 114024 <__errno>
10b611: c7 00 0b 00 00 00 movl $0xb,(%eax)
10b617: b8 ff ff ff ff mov $0xffffffff,%eax
10b61c: eb ca jmp 10b5e8 <timer_create+0xe8>
0010ba44 <timer_delete>:
int timer_delete(
timer_t timerid
)
{
10ba44: 55 push %ebp
10ba45: 89 e5 mov %esp,%ebp
10ba47: 53 push %ebx
10ba48: 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 );
10ba4b: 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 );
10ba4e: 50 push %eax
10ba4f: ff 75 08 pushl 0x8(%ebp)
10ba52: 68 00 a3 12 00 push $0x12a300
10ba57: e8 9c 21 00 00 call 10dbf8 <_Objects_Get>
10ba5c: 89 c3 mov %eax,%ebx
switch ( location ) {
10ba5e: 83 c4 10 add $0x10,%esp
10ba61: 8b 4d f4 mov -0xc(%ebp),%ecx
10ba64: 85 c9 test %ecx,%ecx
10ba66: 74 18 je 10ba80 <timer_delete+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10ba68: e8 b7 8c 00 00 call 114724 <__errno>
10ba6d: c7 00 16 00 00 00 movl $0x16,(%eax)
10ba73: b8 ff ff ff ff mov $0xffffffff,%eax
}
10ba78: 8b 5d fc mov -0x4(%ebp),%ebx
10ba7b: c9 leave
10ba7c: c3 ret
10ba7d: 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 );
10ba80: 83 ec 08 sub $0x8,%esp
10ba83: 50 push %eax
10ba84: 68 00 a3 12 00 push $0x12a300
10ba89: e8 32 1d 00 00 call 10d7c0 <_Objects_Close>
ptimer->state = POSIX_TIMER_STATE_FREE;
10ba8e: c6 43 3c 01 movb $0x1,0x3c(%ebx)
(void) _Watchdog_Remove( &ptimer->Timer );
10ba92: 8d 43 10 lea 0x10(%ebx),%eax
10ba95: 89 04 24 mov %eax,(%esp)
10ba98: e8 6b 3c 00 00 call 10f708 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _POSIX_Timer_Free (
POSIX_Timer_Control *the_timer
)
{
_Objects_Free( &_POSIX_Timer_Information, &the_timer->Object );
10ba9d: 58 pop %eax
10ba9e: 5a pop %edx
10ba9f: 53 push %ebx
10baa0: 68 00 a3 12 00 push $0x12a300
10baa5: e8 0e 20 00 00 call 10dab8 <_Objects_Free>
_POSIX_Timer_Free( ptimer );
_Thread_Enable_dispatch();
10baaa: e8 c1 2c 00 00 call 10e770 <_Thread_Enable_dispatch>
return 0;
10baaf: 83 c4 10 add $0x10,%esp
10bab2: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10bab4: 8b 5d fc mov -0x4(%ebp),%ebx
10bab7: c9 leave
10bab8: c3 ret
0010c900 <timer_getoverrun>:
* its execution, _POSIX_Timer_TSR will have to set this counter to 0.
*/
int timer_getoverrun(
timer_t timerid
)
{
10c900: 55 push %ebp
10c901: 89 e5 mov %esp,%ebp
10c903: 53 push %ebx
10c904: 83 ec 18 sub $0x18,%esp
int overrun;
POSIX_Timer_Control *ptimer;
Objects_Locations location;
ptimer = _POSIX_Timer_Get( timerid, &location );
10c907: 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 );
10c90a: 50 push %eax
10c90b: ff 75 08 pushl 0x8(%ebp)
10c90e: 68 e0 b9 12 00 push $0x12b9e0
10c913: e8 24 21 00 00 call 10ea3c <_Objects_Get>
switch ( location ) {
10c918: 83 c4 10 add $0x10,%esp
10c91b: 8b 55 f4 mov -0xc(%ebp),%edx
10c91e: 85 d2 test %edx,%edx
10c920: 74 1a je 10c93c <timer_getoverrun+0x3c>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10c922: e8 7d 88 00 00 call 1151a4 <__errno>
10c927: c7 00 16 00 00 00 movl $0x16,(%eax)
10c92d: bb ff ff ff ff mov $0xffffffff,%ebx
}
10c932: 89 d8 mov %ebx,%eax
10c934: 8b 5d fc mov -0x4(%ebp),%ebx
10c937: c9 leave
10c938: c3 ret
10c939: 8d 76 00 lea 0x0(%esi),%esi
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
overrun = ptimer->overrun;
10c93c: 8b 58 68 mov 0x68(%eax),%ebx
ptimer->overrun = 0;
10c93f: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax)
_Thread_Enable_dispatch();
10c946: e8 69 2c 00 00 call 10f5b4 <_Thread_Enable_dispatch>
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10c94b: 89 d8 mov %ebx,%eax
10c94d: 8b 5d fc mov -0x4(%ebp),%ebx
10c950: c9 leave
10c951: c3 ret
0010c954 <timer_gettime>:
int timer_gettime(
timer_t timerid,
struct itimerspec *value
)
{
10c954: 55 push %ebp
10c955: 89 e5 mov %esp,%ebp
10c957: 56 push %esi
10c958: 53 push %ebx
10c959: 83 ec 10 sub $0x10,%esp
10c95c: 8b 5d 0c mov 0xc(%ebp),%ebx
POSIX_Timer_Control *ptimer;
Objects_Locations location;
struct timespec current_time;
Watchdog_Interval left;
if ( !value )
10c95f: 85 db test %ebx,%ebx
10c961: 74 65 je 10c9c8 <timer_gettime+0x74>
rtems_set_errno_and_return_minus_one( EINVAL );
/* Reads the current time */
_TOD_Get( ¤t_time );
10c963: 83 ec 0c sub $0xc,%esp
10c966: 8d 45 ec lea -0x14(%ebp),%eax
10c969: 50 push %eax
10c96a: e8 fd 16 00 00 call 10e06c <_TOD_Get>
10c96f: 83 c4 0c add $0xc,%esp
ptimer = _POSIX_Timer_Get( timerid, &location );
10c972: 8d 45 f4 lea -0xc(%ebp),%eax
10c975: 50 push %eax
10c976: ff 75 08 pushl 0x8(%ebp)
10c979: 68 e0 b9 12 00 push $0x12b9e0
10c97e: e8 b9 20 00 00 call 10ea3c <_Objects_Get>
10c983: 89 c6 mov %eax,%esi
switch ( location ) {
10c985: 83 c4 10 add $0x10,%esp
10c988: 8b 45 f4 mov -0xc(%ebp),%eax
10c98b: 85 c0 test %eax,%eax
10c98d: 75 39 jne 10c9c8 <timer_gettime+0x74>
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
10c98f: a1 c4 b7 12 00 mov 0x12b7c4,%eax
_Watchdog_Ticks_since_boot; /* now */
_Timespec_From_ticks( left, &value->it_value );
10c994: 83 ec 08 sub $0x8,%esp
10c997: 8d 53 08 lea 0x8(%ebx),%edx
10c99a: 52 push %edx
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
(ptimer->Timer.start_time + ptimer->Timer.initial) - /* expire */
10c99b: 8b 56 1c mov 0x1c(%esi),%edx
10c99e: 03 56 24 add 0x24(%esi),%edx
case OBJECTS_LOCAL:
/* Calculates the time left before the timer finishes */
left =
10c9a1: 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 );
10c9a3: 52 push %edx
10c9a4: e8 9b 36 00 00 call 110044 <_Timespec_From_ticks>
value->it_interval = ptimer->timer_data.it_interval;
10c9a9: 8b 46 54 mov 0x54(%esi),%eax
10c9ac: 8b 56 58 mov 0x58(%esi),%edx
10c9af: 89 03 mov %eax,(%ebx)
10c9b1: 89 53 04 mov %edx,0x4(%ebx)
_Thread_Enable_dispatch();
10c9b4: e8 fb 2b 00 00 call 10f5b4 <_Thread_Enable_dispatch>
return 0;
10c9b9: 83 c4 10 add $0x10,%esp
10c9bc: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10c9be: 8d 65 f8 lea -0x8(%ebp),%esp
10c9c1: 5b pop %ebx
10c9c2: 5e pop %esi
10c9c3: c9 leave
10c9c4: c3 ret
10c9c5: 8d 76 00 lea 0x0(%esi),%esi
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10c9c8: e8 d7 87 00 00 call 1151a4 <__errno>
10c9cd: c7 00 16 00 00 00 movl $0x16,(%eax)
10c9d3: b8 ff ff ff ff mov $0xffffffff,%eax
10c9d8: eb e4 jmp 10c9be <timer_gettime+0x6a>
0010b620 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
10b620: 55 push %ebp
10b621: 89 e5 mov %esp,%ebp
10b623: 57 push %edi
10b624: 56 push %esi
10b625: 53 push %ebx
10b626: 83 ec 3c sub $0x3c,%esp
10b629: 8b 5d 10 mov 0x10(%ebp),%ebx
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
10b62c: 85 db test %ebx,%ebx
10b62e: 0f 84 50 01 00 00 je 10b784 <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) ) ) {
10b634: 83 ec 0c sub $0xc,%esp
10b637: 8d 43 08 lea 0x8(%ebx),%eax
10b63a: 50 push %eax
10b63b: e8 94 38 00 00 call 10eed4 <_Timespec_Is_valid>
10b640: 83 c4 10 add $0x10,%esp
10b643: 84 c0 test %al,%al
10b645: 0f 84 39 01 00 00 je 10b784 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
10b64b: 83 ec 0c sub $0xc,%esp
10b64e: 53 push %ebx
10b64f: e8 80 38 00 00 call 10eed4 <_Timespec_Is_valid>
10b654: 83 c4 10 add $0x10,%esp
10b657: 84 c0 test %al,%al
10b659: 0f 84 25 01 00 00 je 10b784 <timer_settime+0x164> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
10b65f: 83 7d 0c 04 cmpl $0x4,0xc(%ebp)
10b663: 0f 84 db 00 00 00 je 10b744 <timer_settime+0x124>
10b669: 8b 45 0c mov 0xc(%ebp),%eax
10b66c: 85 c0 test %eax,%eax
10b66e: 0f 85 10 01 00 00 jne 10b784 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10b674: 8d 45 cc lea -0x34(%ebp),%eax
10b677: 89 45 c4 mov %eax,-0x3c(%ebp)
10b67a: b9 04 00 00 00 mov $0x4,%ecx
10b67f: 89 c7 mov %eax,%edi
10b681: 89 de mov %ebx,%esi
10b683: 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 );
10b685: 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 );
10b686: 8d 45 e4 lea -0x1c(%ebp),%eax
10b689: 50 push %eax
10b68a: ff 75 08 pushl 0x8(%ebp)
10b68d: 68 20 a4 12 00 push $0x12a420
10b692: e8 11 22 00 00 call 10d8a8 <_Objects_Get>
10b697: 89 c2 mov %eax,%edx
switch ( location ) {
10b699: 83 c4 10 add $0x10,%esp
10b69c: 8b 7d e4 mov -0x1c(%ebp),%edi
10b69f: 85 ff test %edi,%edi
10b6a1: 0f 85 dd 00 00 00 jne 10b784 <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 ) {
10b6a7: 8b 75 d4 mov -0x2c(%ebp),%esi
10b6aa: 85 f6 test %esi,%esi
10b6ac: 75 0b jne 10b6b9 <timer_settime+0x99>
10b6ae: 8b 4d d8 mov -0x28(%ebp),%ecx
10b6b1: 85 c9 test %ecx,%ecx
10b6b3: 0f 84 df 00 00 00 je 10b798 <timer_settime+0x178>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
10b6b9: 83 ec 0c sub $0xc,%esp
10b6bc: 53 push %ebx
10b6bd: 89 55 c0 mov %edx,-0x40(%ebp)
10b6c0: e8 77 38 00 00 call 10ef3c <_Timespec_To_ticks>
10b6c5: 8b 55 c0 mov -0x40(%ebp),%edx
10b6c8: 89 42 64 mov %eax,0x64(%edx)
initial_period = _Timespec_To_ticks( &normalize.it_value );
10b6cb: 8d 45 d4 lea -0x2c(%ebp),%eax
10b6ce: 89 04 24 mov %eax,(%esp)
10b6d1: e8 66 38 00 00 call 10ef3c <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
10b6d6: 8b 55 c0 mov -0x40(%ebp),%edx
10b6d9: 89 14 24 mov %edx,(%esp)
10b6dc: 68 04 b8 10 00 push $0x10b804
10b6e1: ff 72 08 pushl 0x8(%edx)
10b6e4: 50 push %eax
10b6e5: 8d 42 10 lea 0x10(%edx),%eax
10b6e8: 50 push %eax
10b6e9: e8 6e 61 00 00 call 11185c <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
10b6ee: 83 c4 20 add $0x20,%esp
10b6f1: 84 c0 test %al,%al
10b6f3: 8b 55 c0 mov -0x40(%ebp),%edx
10b6f6: 0f 84 e8 00 00 00 je 10b7e4 <timer_settime+0x1c4>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
10b6fc: 8b 45 14 mov 0x14(%ebp),%eax
10b6ff: 85 c0 test %eax,%eax
10b701: 0f 84 ed 00 00 00 je 10b7f4 <timer_settime+0x1d4>
*ovalue = ptimer->timer_data;
10b707: 8d 42 54 lea 0x54(%edx),%eax
10b70a: b9 04 00 00 00 mov $0x4,%ecx
10b70f: 8b 7d 14 mov 0x14(%ebp),%edi
10b712: 89 c6 mov %eax,%esi
10b714: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
ptimer->timer_data = normalize;
10b716: b9 04 00 00 00 mov $0x4,%ecx
10b71b: 89 c7 mov %eax,%edi
10b71d: 8b 75 c4 mov -0x3c(%ebp),%esi
10b720: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
10b722: c6 42 3c 03 movb $0x3,0x3c(%edx)
_TOD_Get( &ptimer->time );
10b726: 83 ec 0c sub $0xc,%esp
10b729: 83 c2 6c add $0x6c,%edx
10b72c: 52 push %edx
10b72d: e8 ca 17 00 00 call 10cefc <_TOD_Get>
_Thread_Enable_dispatch();
10b732: e8 e9 2c 00 00 call 10e420 <_Thread_Enable_dispatch>
return 0;
10b737: 83 c4 10 add $0x10,%esp
10b73a: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b73c: 8d 65 f4 lea -0xc(%ebp),%esp
10b73f: 5b pop %ebx
10b740: 5e pop %esi
10b741: 5f pop %edi
10b742: c9 leave
10b743: c3 ret
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
10b744: 8d 45 cc lea -0x34(%ebp),%eax
10b747: 89 45 c4 mov %eax,-0x3c(%ebp)
10b74a: 89 c7 mov %eax,%edi
10b74c: 89 de mov %ebx,%esi
10b74e: 8b 4d 0c mov 0xc(%ebp),%ecx
10b751: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
_TOD_Get( &now );
10b753: 83 ec 0c sub $0xc,%esp
10b756: 8d 75 dc lea -0x24(%ebp),%esi
10b759: 56 push %esi
10b75a: e8 9d 17 00 00 call 10cefc <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
10b75f: 59 pop %ecx
10b760: 5f pop %edi
10b761: 8d 7d d4 lea -0x2c(%ebp),%edi
10b764: 57 push %edi
10b765: 56 push %esi
10b766: e8 45 37 00 00 call 10eeb0 <_Timespec_Greater_than>
10b76b: 83 c4 10 add $0x10,%esp
10b76e: 84 c0 test %al,%al
10b770: 75 12 jne 10b784 <timer_settime+0x164>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
10b772: 52 push %edx
10b773: 57 push %edi
10b774: 57 push %edi
10b775: 56 push %esi
10b776: e8 81 37 00 00 call 10eefc <_Timespec_Subtract>
10b77b: 83 c4 10 add $0x10,%esp
10b77e: e9 02 ff ff ff jmp 10b685 <timer_settime+0x65>
10b783: 90 nop
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
10b784: e8 9b 88 00 00 call 114024 <__errno>
10b789: c7 00 16 00 00 00 movl $0x16,(%eax)
10b78f: b8 ff ff ff ff mov $0xffffffff,%eax
10b794: eb a6 jmp 10b73c <timer_settime+0x11c>
10b796: 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 );
10b798: 83 ec 0c sub $0xc,%esp
10b79b: 8d 40 10 lea 0x10(%eax),%eax
10b79e: 50 push %eax
10b79f: 89 55 c0 mov %edx,-0x40(%ebp)
10b7a2: e8 c9 3b 00 00 call 10f370 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
10b7a7: 83 c4 10 add $0x10,%esp
10b7aa: 8b 55 14 mov 0x14(%ebp),%edx
10b7ad: 85 d2 test %edx,%edx
10b7af: 8b 55 c0 mov -0x40(%ebp),%edx
10b7b2: 74 48 je 10b7fc <timer_settime+0x1dc>
*ovalue = ptimer->timer_data;
10b7b4: 8d 42 54 lea 0x54(%edx),%eax
10b7b7: b9 04 00 00 00 mov $0x4,%ecx
10b7bc: 8b 7d 14 mov 0x14(%ebp),%edi
10b7bf: 89 c6 mov %eax,%esi
10b7c1: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* The new data are set */
ptimer->timer_data = normalize;
10b7c3: b9 04 00 00 00 mov $0x4,%ecx
10b7c8: 89 c7 mov %eax,%edi
10b7ca: 8b 75 c4 mov -0x3c(%ebp),%esi
10b7cd: f3 a5 rep movsl %ds:(%esi),%es:(%edi)
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
10b7cf: c6 42 3c 04 movb $0x4,0x3c(%edx)
/* Returns with success */
_Thread_Enable_dispatch();
10b7d3: e8 48 2c 00 00 call 10e420 <_Thread_Enable_dispatch>
return 0;
10b7d8: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b7da: 8d 65 f4 lea -0xc(%ebp),%esp
10b7dd: 5b pop %ebx
10b7de: 5e pop %esi
10b7df: 5f pop %edi
10b7e0: c9 leave
10b7e1: c3 ret
10b7e2: 66 90 xchg %ax,%ax
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
_Thread_Enable_dispatch();
10b7e4: e8 37 2c 00 00 call 10e420 <_Thread_Enable_dispatch>
return 0;
10b7e9: 31 c0 xor %eax,%eax
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
10b7eb: 8d 65 f4 lea -0xc(%ebp),%esp
10b7ee: 5b pop %ebx
10b7ef: 5e pop %esi
10b7f0: 5f pop %edi
10b7f1: c9 leave
10b7f2: c3 ret
10b7f3: 90 nop
10b7f4: 8d 42 54 lea 0x54(%edx),%eax
10b7f7: e9 1a ff ff ff jmp 10b716 <timer_settime+0xf6>
10b7fc: 8d 42 54 lea 0x54(%edx),%eax
10b7ff: eb c2 jmp 10b7c3 <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 5c a6 12 00 mov 0x12a65c,%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 40 a6 12 00 push $0x12a640
10b431: e8 9a 3a 00 00 call 10eed0 <_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 98 35 00 00 call 10ea24 <_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 90 35 00 00 call 10ea24 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
10b494: a3 4c a6 12 00 mov %eax,0x12a64c
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
10b499: 58 pop %eax
10b49a: 5a pop %edx
10b49b: 68 40 a6 12 00 push $0x12a640
10b4a0: 68 60 9d 12 00 push $0x129d60
10b4a5: e8 e6 38 00 00 call 10ed90 <_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 48 a6 12 00 00 movl $0x0,0x12a648
10b4bf: 00 00 00
the_watchdog->routine = routine;
10b4c2: c7 05 5c a6 12 00 d4 movl $0x10b3d4,0x12a65c
10b4c9: b3 10 00
the_watchdog->id = id;
10b4cc: c7 05 60 a6 12 00 00 movl $0x0,0x12a660
10b4d3: 00 00 00
the_watchdog->user_data = user_data;
10b4d6: c7 05 64 a6 12 00 00 movl $0x0,0x12a664
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 54 a6 12 00 mov 0x12a654,%eax
10b4ed: 03 05 4c a6 12 00 add 0x12a64c,%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 58 a6 12 00 sub 0x12a658,%eax
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
10b500: 50 push %eax
10b501: e8 96 34 00 00 call 10e99c <_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>