RTEMS-5
Annotated Report
Fri Aug 10 13:08:23 2018
400132e0 <_POSIX_Condition_variables_Default_attributes>:
400132e0: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 ................
...
400072e8 <_POSIX_Condition_variables_Signal_support>:
int _POSIX_Condition_variables_Signal_support(
pthread_cond_t *cond,
bool is_broadcast
)
{
400072e8: 9d e3 bf 78 save %sp, -136, %sp
unsigned long flags;
const Thread_queue_Operations *operations;
Thread_queue_Heads *heads;
the_cond = _POSIX_Condition_variables_Get( cond );
POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags );
400072ec: 80 a6 20 00 cmp %i0, 0
400072f0: 02 80 00 28 be 40007390 <_POSIX_Condition_variables_Signal_support+0xa8>
400072f4: 05 06 37 ec sethi %hi(0x18dfb000), %g2
400072f8: c2 06 00 00 ld [ %i0 ], %g1
400072fc: 82 1e 00 01 xor %i0, %g1, %g1
40007300: 84 10 a1 fe or %g2, 0x1fe, %g2
40007304: 82 18 40 02 xor %g1, %g2, %g1
40007308: 80 88 7f fe btst -2, %g1
4000730c: 12 80 00 1c bne 4000737c <_POSIX_Condition_variables_Signal_support+0x94>
40007310: 3b 10 00 4c sethi %hi(0x40013000), %i5
if ( heads != NULL ) {
Thread_Control *the_thread;
the_thread = ( *operations->first )( heads );
_Thread_queue_Extract_critical(
40007314: b8 06 20 0c add %i0, 0xc, %i4
<== NOT EXECUTED
the_thread = ( *operations->first )( heads );
40007318: ba 17 63 84 or %i5, 0x384, %i5
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000731c: 91 d0 20 09 ta 9
<== NOT EXECUTED
)
{
#if defined( RTEMS_SMP )
context->Lock_context.isr_level = level;
#else
context->isr_level = level;
40007320: c2 27 bf dc st %g1, [ %fp + -36 ]
heads = the_cond->Queue.Queue.heads;
40007324: c2 06 20 0c ld [ %i0 + 0xc ], %g1
if ( heads != NULL ) {
40007328: 90 90 60 00 orcc %g1, 0, %o0
4000732c: 22 80 00 0f be,a 40007368 <_POSIX_Condition_variables_Signal_support+0x80>
40007330: c0 26 20 18 clr [ %i0 + 0x18 ]
the_thread = ( *operations->first )( heads );
40007334: c2 07 60 10 ld [ %i5 + 0x10 ], %g1
40007338: 9f c0 40 00 call %g1
4000733c: 01 00 00 00 nop
_Thread_queue_Extract_critical(
40007340: 96 07 bf dc add %fp, -36, %o3
40007344: 94 10 00 08 mov %o0, %o2
40007348: 92 10 00 1d mov %i5, %o1
4000734c: 40 00 16 65 call 4000cce0 <_Thread_queue_Extract_critical>
40007350: 90 10 00 1c mov %i4, %o0
);
} else {
the_cond->mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_POSIX_Condition_variables_Release( the_cond, &queue_context );
}
} while ( is_broadcast && heads != NULL );
40007354: 80 a6 60 00 cmp %i1, 0
40007358: 12 bf ff f1 bne 4000731c <_POSIX_Condition_variables_Signal_support+0x34>
4000735c: 01 00 00 00 nop
return 0;
}
40007360: 81 c7 e0 08 ret
40007364: 91 e8 20 00 restore %g0, 0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007368: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000736c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007370: 01 00 00 00 nop
40007374: 81 c7 e0 08 ret
40007378: 91 e8 20 00 restore %g0, 0, %o0
POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags );
4000737c: 40 00 00 0f call 400073b8 <_POSIX_Condition_variables_Auto_initialization>
40007380: 90 10 00 18 mov %i0, %o0
40007384: 80 a2 20 00 cmp %o0, 0
40007388: 12 bf ff e3 bne 40007314 <_POSIX_Condition_variables_Signal_support+0x2c>
4000738c: 3b 10 00 4c sethi %hi(0x40013000), %i5
40007390: 81 c7 e0 08 ret
40007394: 91 e8 20 16 restore %g0, 0x16, %o0
400074a0 <_POSIX_Condition_variables_Wait_support>:
int _POSIX_Condition_variables_Wait_support(
pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
400074a0: 9d e3 bf 78 save %sp, -136, %sp
Thread_queue_Context queue_context;
int error;
Thread_Control *executing;
the_cond = _POSIX_Condition_variables_Get( cond );
POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags );
400074a4: 80 a6 20 00 cmp %i0, 0
400074a8: 02 80 00 44 be 400075b8 <_POSIX_Condition_variables_Wait_support+0x118>
400074ac: 05 06 37 ec sethi %hi(0x18dfb000), %g2
400074b0: fa 06 00 00 ld [ %i0 ], %i5
400074b4: 82 1e 00 1d xor %i0, %i5, %g1
400074b8: 84 10 a1 fe or %g2, 0x1fe, %g2
400074bc: 82 18 40 02 xor %g1, %g2, %g1
400074c0: 80 88 7f fe btst -2, %g1
400074c4: 12 80 00 38 bne 400075a4 <_POSIX_Condition_variables_Wait_support+0x104>
400074c8: 80 a6 a0 00 cmp %i2, 0
_Thread_queue_Context_initialize( &queue_context );
if ( abstime != NULL ) {
400074cc: 02 80 00 3d be 400075c0 <_POSIX_Condition_variables_Wait_support+0x120>
400074d0: 80 8f 60 01 btst 1, %i5
RTEMS_INLINE_ROUTINE clockid_t _POSIX_Condition_variables_Get_clock(
unsigned long flags
)
{
if ( ( flags & POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC ) != 0 ) {
400074d4: 12 80 00 13 bne 40007520 <_POSIX_Condition_variables_Wait_support+0x80>
<== NEVER TAKEN
400074d8: f4 27 bf e8 st %i2, [ %fp + -24 ]
<== NOT EXECUTED
queue_context->enqueue_callout = enqueue_callout;
400074dc: 03 10 00 1d sethi %hi(0x40007400), %g1
<== NOT EXECUTED
400074e0: 82 10 60 60 or %g1, 0x60, %g1 ! 40007460 <_POSIX_Condition_variables_Enqueue_with_timeout_realtime>
<== NOT EXECUTED
400074e4: c2 27 bf e4 st %g1, [ %fp + -28 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400074e8: 91 d0 20 09 ta 9
<== NOT EXECUTED
400074ec: c2 27 bf dc st %g1, [ %fp + -36 ]
}
executing = _POSIX_Condition_variables_Acquire( the_cond, &queue_context );
if (
the_cond->mutex != POSIX_CONDITION_VARIABLES_NO_MUTEX
400074f0: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
&& the_cond->mutex != mutex
400074f4: 80 a0 40 19 cmp %g1, %i1
400074f8: 02 80 00 13 be 40007544 <_POSIX_Condition_variables_Wait_support+0xa4>
400074fc: 84 10 00 06 mov %g6, %g2
40007500: 80 a0 60 00 cmp %g1, 0
40007504: 22 80 00 11 be,a 40007548 <_POSIX_Condition_variables_Wait_support+0xa8>
40007508: fa 00 a0 20 ld [ %g2 + 0x20 ], %i5
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000750c: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007510: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007514: 01 00 00 00 nop
) {
_POSIX_Condition_variables_Release( the_cond, &queue_context );
return EINVAL;
40007518: 81 c7 e0 08 ret
4000751c: 91 e8 20 16 restore %g0, 0x16, %o0
40007520: 03 10 00 1d sethi %hi(0x40007400), %g1
<== NOT EXECUTED
40007524: 82 10 60 80 or %g1, 0x80, %g1 ! 40007480 <_POSIX_Condition_variables_Enqueue_with_timeout_monotonic>
<== NOT EXECUTED
40007528: c2 27 bf e4 st %g1, [ %fp + -28 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000752c: 91 d0 20 09 ta 9
<== NOT EXECUTED
40007530: c2 27 bf dc st %g1, [ %fp + -36 ]
<== NOT EXECUTED
the_cond->mutex != POSIX_CONDITION_VARIABLES_NO_MUTEX
40007534: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
<== NOT EXECUTED
&& the_cond->mutex != mutex
40007538: 80 a0 40 19 cmp %g1, %i1
<== NOT EXECUTED
4000753c: 12 bf ff f1 bne 40007500 <_POSIX_Condition_variables_Wait_support+0x60>
<== NOT EXECUTED
40007540: 84 10 00 06 mov %g6, %g2
<== NOT EXECUTED
ISR_Level level;
Thread_Control *executing;
_Thread_queue_Context_ISR_disable( queue_context, level );
_Thread_queue_Context_set_ISR_level( queue_context, level );
executing = _Thread_Executing;
40007544: fa 00 a0 20 ld [ %g2 + 0x20 ], %i5
}
the_cond->mutex = mutex;
40007548: f2 26 20 18 st %i1, [ %i0 + 0x18 ]
queue_context->thread_state = thread_state;
4000754c: 82 10 20 20 mov 0x20, %g1
_Thread_queue_Context_set_thread_state(
&queue_context,
STATES_WAITING_FOR_CONDITION_VARIABLE
);
_Thread_queue_Enqueue(
40007550: 90 06 20 0c add %i0, 0xc, %o0
40007554: 96 07 bf dc add %fp, -36, %o3
40007558: c2 27 bf e0 st %g1, [ %fp + -32 ]
4000755c: 94 10 00 1d mov %i5, %o2
40007560: 13 10 00 4c sethi %hi(0x40013000), %o1
40007564: 40 00 15 69 call 4000cb08 <_Thread_queue_Enqueue>
40007568: 92 12 63 84 or %o1, 0x384, %o1 ! 40013384 <_Thread_queue_Operations_FIFO>
return _POSIX_Get_by_name_error_table[ error ];
}
RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status )
{
return STATUS_GET_POSIX( status );
4000756c: f0 07 60 4c ld [ %i5 + 0x4c ], %i0
40007570: b1 3e 20 08 sra %i0, 8, %i0
* 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().
*/
if ( error == EINTR ) {
40007574: 80 a6 20 04 cmp %i0, 4
40007578: 02 80 00 18 be 400075d8 <_POSIX_Condition_variables_Wait_support+0x138>
<== NEVER TAKEN
4000757c: 80 a6 20 01 cmp %i0, 1
/*
* When we get here the dispatch disable level is 0.
*/
if ( error != EPERM ) {
40007580: 02 80 00 14 be 400075d0 <_POSIX_Condition_variables_Wait_support+0x130>
40007584: 01 00 00 00 nop
int mutex_error;
mutex_error = pthread_mutex_lock( mutex );
40007588: 40 00 01 13 call 400079d4 <pthread_mutex_lock>
4000758c: 90 10 00 19 mov %i1, %o0
if ( mutex_error != 0 ) {
40007590: 80 a2 20 00 cmp %o0, 0
40007594: 12 80 00 09 bne 400075b8 <_POSIX_Condition_variables_Wait_support+0x118>
40007598: 01 00 00 00 nop
error = EINVAL;
}
}
return error;
}
4000759c: 81 c7 e0 08 ret
400075a0: 81 e8 00 00 restore
POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags );
400075a4: 7f ff ff 85 call 400073b8 <_POSIX_Condition_variables_Auto_initialization>
400075a8: 90 10 00 18 mov %i0, %o0
400075ac: 80 a2 20 00 cmp %o0, 0
400075b0: 12 bf ff c7 bne 400074cc <_POSIX_Condition_variables_Wait_support+0x2c>
400075b4: 80 a6 a0 00 cmp %i2, 0
}
400075b8: 81 c7 e0 08 ret
400075bc: 91 e8 20 16 restore %g0, 0x16, %o0
queue_context->enqueue_callout = enqueue_callout;
400075c0: 03 10 00 1d sethi %hi(0x40007400), %g1
400075c4: 82 10 60 54 or %g1, 0x54, %g1 ! 40007454 <_POSIX_Condition_variables_Enqueue_no_timeout>
400075c8: 10 bf ff c8 b 400074e8 <_POSIX_Condition_variables_Wait_support+0x48>
400075cc: c2 27 bf e4 st %g1, [ %fp + -28 ]
400075d0: 81 c7 e0 08 ret
400075d4: 81 e8 00 00 restore
error = 0;
400075d8: 10 bf ff ec b 40007588 <_POSIX_Condition_variables_Wait_support+0xe8>
<== NOT EXECUTED
400075dc: b0 10 20 00 clr %i0
<== NOT EXECUTED
400148ac <_POSIX_Get_by_name_error_table>:
400148ac: 00 00 00 16 00 00 00 5b 00 00 00 02 .......[....
40007560 <_POSIX_Message_queue_Delete>:
void _POSIX_Message_queue_Delete(
POSIX_Message_queue_Control *the_mq,
Thread_queue_Context *queue_context
)
{
40007560: 9d e3 bf a0 save %sp, -96, %sp
if ( !the_mq->linked && the_mq->open_count == 0 ) {
40007564: c2 0e 20 4c ldub [ %i0 + 0x4c ], %g1
40007568: 80 a0 60 00 cmp %g1, 0
4000756c: 12 80 00 06 bne 40007584 <_POSIX_Message_queue_Delete+0x24>
40007570: 01 00 00 00 nop
40007574: c2 06 20 50 ld [ %i0 + 0x50 ], %g1
40007578: 80 a0 60 00 cmp %g1, 0
4000757c: 02 80 00 07 be 40007598 <_POSIX_Message_queue_Delete+0x38>
40007580: 92 10 00 19 mov %i1, %o1
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007584: c2 06 40 00 ld [ %i1 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007588: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000758c: 01 00 00 00 nop
_CORE_message_queue_Close( &the_mq->Message_queue, queue_context );
_POSIX_Message_queue_Free( the_mq );
} else {
_CORE_message_queue_Release( &the_mq->Message_queue, queue_context );
}
}
40007590: 81 c7 e0 08 ret
40007594: 81 e8 00 00 restore
_CORE_message_queue_Close( &the_mq->Message_queue, queue_context );
40007598: 90 06 20 10 add %i0, 0x10, %o0
4000759c: 40 00 07 e9 call 40009540 <_CORE_message_queue_Close>
400075a0: b2 10 00 18 mov %i0, %i1
_Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
400075a4: 31 10 00 60 sethi %hi(0x40018000), %i0
400075a8: 40 00 12 1c call 4000be18 <_Objects_Free>
400075ac: 91 ee 20 48 restore %i0, 0x48, %o0
400077ec <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
const struct timespec *abstime,
Thread_queue_Enqueue_callout enqueue_callout
)
{
400077ec: 9d e3 bf 70 save %sp, -144, %sp
return (POSIX_Message_queue_Control *) _Objects_Get(
400077f0: 15 10 00 60 sethi %hi(0x40018000), %o2
400077f4: 92 07 bf dc add %fp, -36, %o1
400077f8: 94 12 a0 48 or %o2, 0x48, %o2
400077fc: 40 00 11 b3 call 4000bec8 <_Objects_Get>
40007800: 90 10 00 18 mov %i0, %o0
Thread_Control *executing;
Status_Control status;
the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context );
if ( the_mq == NULL ) {
40007804: 80 a2 20 00 cmp %o0, 0
40007808: 02 80 00 2c be 400078b8 <_POSIX_Message_queue_Receive_support+0xcc>
<== NEVER TAKEN
4000780c: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
}
if ( ( the_mq->oflag & O_ACCMODE ) == O_WRONLY ) {
40007810: d8 02 20 68 ld [ %o0 + 0x68 ], %o4
40007814: 82 0b 20 03 and %o4, 3, %g1
40007818: 80 a0 60 01 cmp %g1, 1
4000781c: 02 80 00 24 be 400078ac <_POSIX_Message_queue_Receive_support+0xc0>
40007820: 01 00 00 00 nop
_ISR_lock_ISR_enable( &queue_context.Lock_context.Lock_context );
rtems_set_errno_and_return_minus_one( EBADF );
}
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
40007824: c2 02 20 28 ld [ %o0 + 0x28 ], %g1
40007828: 80 a0 40 1a cmp %g1, %i2
4000782c: 18 80 00 29 bgu 400078d0 <_POSIX_Message_queue_Receive_support+0xe4>
40007830: 82 10 3f ff mov -1, %g1
40007834: fa 27 bf e4 st %i5, [ %fp + -28 ]
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
40007838: c2 27 bf d8 st %g1, [ %fp + -40 ]
queue_context->Timeout.arg = arg;
4000783c: f8 27 bf e8 st %i4, [ %fp + -24 ]
_CORE_message_queue_Acquire_critical(
&the_mq->Message_queue,
&queue_context
);
if ( the_mq->open_count == 0 ) {
40007840: c2 02 20 50 ld [ %o0 + 0x50 ], %g1
40007844: 80 a0 60 00 cmp %g1, 0
40007848: 02 80 00 19 be 400078ac <_POSIX_Message_queue_Receive_support+0xc0>
4000784c: 84 02 20 10 add %o0, 0x10, %g2
}
/*
* Now perform the actual message receive
*/
executing = _Thread_Executing;
40007850: fa 01 a0 20 ld [ %g6 + 0x20 ], %i5
status = _CORE_message_queue_Seize(
40007854: 99 33 20 0e srl %o4, 0xe, %o4
40007858: 9a 07 bf dc add %fp, -36, %o5
4000785c: 98 1b 20 01 xor %o4, 1, %o4
40007860: 96 07 bf d8 add %fp, -40, %o3
40007864: 98 0b 20 01 and %o4, 1, %o4
40007868: 94 10 00 19 mov %i1, %o2
4000786c: 92 10 00 1d mov %i5, %o1
40007870: 40 00 07 6e call 40009628 <_CORE_message_queue_Seize>
40007874: 90 10 00 02 mov %g2, %o0
&length_out,
( the_mq->oflag & O_NONBLOCK ) == 0,
&queue_context
);
if ( status != STATUS_SUCCESSFUL ) {
40007878: 80 92 00 09 orcc %o0, %o1, %g0
4000787c: 12 80 00 1e bne 400078f4 <_POSIX_Message_queue_Receive_support+0x108>
40007880: 80 a6 e0 00 cmp %i3, 0
rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) );
}
if ( msg_prio != NULL ) {
40007884: 22 80 00 08 be,a 400078a4 <_POSIX_Message_queue_Receive_support+0xb8>
<== NEVER TAKEN
40007888: f0 07 bf d8 ld [ %fp + -40 ], %i0
<== NOT EXECUTED
return (unsigned int) ((priority >= 0) ? priority : -priority);
4000788c: c2 07 60 3c ld [ %i5 + 0x3c ], %g1
40007890: 85 38 60 1f sra %g1, 0x1f, %g2
40007894: 82 18 80 01 xor %g2, %g1, %g1
40007898: 82 20 40 02 sub %g1, %g2, %g1
*msg_prio = _POSIX_Message_queue_Priority_from_core(
4000789c: c2 26 c0 00 st %g1, [ %i3 ]
executing->Wait.count
);
}
return length_out;
400078a0: f0 07 bf d8 ld [ %fp + -40 ], %i0
}
400078a4: 81 c7 e0 08 ret
400078a8: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400078ac: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400078b0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400078b4: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
400078b8: 40 00 2a b2 call 40012380 <__errno>
400078bc: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
400078c0: 82 10 20 09 mov 9, %g1
400078c4: c2 22 00 00 st %g1, [ %o0 ]
400078c8: 81 c7 e0 08 ret
400078cc: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400078d0: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400078d4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400078d8: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EMSGSIZE );
400078dc: 40 00 2a a9 call 40012380 <__errno>
400078e0: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
400078e4: 82 10 20 7a mov 0x7a, %g1
400078e8: c2 22 00 00 st %g1, [ %o0 ]
400078ec: 81 c7 e0 08 ret
400078f0: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) );
400078f4: 40 00 2a a3 call 40012380 <__errno>
400078f8: d2 27 bf d4 st %o1, [ %fp + -44 ]
return STATUS_GET_POSIX( status );
400078fc: d2 07 bf d4 ld [ %fp + -44 ], %o1
40007900: 93 3a 60 08 sra %o1, 8, %o1
40007904: d2 22 00 00 st %o1, [ %o0 ]
40007908: 81 c7 e0 08 ret
4000790c: 91 e8 3f ff restore %g0, -1, %o0
40007928 <_POSIX_Message_queue_Send_support>:
size_t msg_len,
unsigned int msg_prio,
const struct timespec *abstime,
Thread_queue_Enqueue_callout enqueue_callout
)
{
40007928: 9d e3 bf 68 save %sp, -152, %sp
/*
* Validate the priority.
* XXX - Do not validate msg_prio is not less than 0.
*/
if ( msg_prio > MQ_PRIO_MAX ) {
4000792c: 80 a6 e0 20 cmp %i3, 0x20
40007930: 18 80 00 34 bgu 40007a00 <_POSIX_Message_queue_Send_support+0xd8>
<== NEVER TAKEN
40007934: 92 07 bf dc add %fp, -36, %o1
return (POSIX_Message_queue_Control *) _Objects_Get(
40007938: 15 10 00 60 sethi %hi(0x40018000), %o2
4000793c: 90 10 00 18 mov %i0, %o0
40007940: 40 00 11 62 call 4000bec8 <_Objects_Get>
40007944: 94 12 a0 48 or %o2, 0x48, %o2
rtems_set_errno_and_return_minus_one( EINVAL );
}
the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context );
if ( the_mq == NULL ) {
40007948: 80 a2 20 00 cmp %o0, 0
4000794c: 02 80 00 27 be 400079e8 <_POSIX_Message_queue_Send_support+0xc0>
<== NEVER TAKEN
40007950: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
}
if ( ( the_mq->oflag & O_ACCMODE ) == O_RDONLY ) {
40007954: da 02 20 68 ld [ %o0 + 0x68 ], %o5
40007958: 80 8b 60 03 btst 3, %o5
4000795c: 02 80 00 20 be 400079dc <_POSIX_Message_queue_Send_support+0xb4>
40007960: 01 00 00 00 nop
queue_context->enqueue_callout = enqueue_callout;
40007964: fa 27 bf e4 st %i5, [ %fp + -28 ]
queue_context->Timeout.arg = arg;
40007968: f8 27 bf e8 st %i4, [ %fp + -24 ]
_CORE_message_queue_Acquire_critical(
&the_mq->Message_queue,
&queue_context
);
if ( the_mq->open_count == 0 ) {
4000796c: c2 02 20 50 ld [ %o0 + 0x50 ], %g1
40007970: 80 a0 60 00 cmp %g1, 0
40007974: 02 80 00 1a be 400079dc <_POSIX_Message_queue_Send_support+0xb4>
40007978: 84 02 20 10 add %o0, 0x10, %g2
/*
* Now perform the actual message receive
*/
executing = _Thread_Executing;
status = _CORE_message_queue_Submit(
4000797c: 82 07 bf dc add %fp, -36, %g1
40007980: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
40007984: 9b 33 60 0e srl %o5, 0xe, %o5
40007988: d2 01 a0 20 ld [ %g6 + 0x20 ], %o1
4000798c: 9a 1b 60 01 xor %o5, 1, %o5
40007990: 98 20 00 1b neg %i3, %o4
40007994: 9a 0b 60 01 and %o5, 1, %o5
40007998: 96 10 00 1a mov %i2, %o3
4000799c: 94 10 00 19 mov %i1, %o2
400079a0: 90 10 00 02 mov %g2, %o0
400079a4: 40 00 07 6d call 40009758 <_CORE_message_queue_Submit>
400079a8: b0 10 20 00 clr %i0
RTEMS_INLINE_ROUTINE int _POSIX_Zero_or_minus_one_plus_errno(
Status_Control status
)
{
if ( status == STATUS_SUCCESSFUL ) {
400079ac: 80 92 00 09 orcc %o0, %o1, %g0
400079b0: 12 80 00 04 bne 400079c0 <_POSIX_Message_queue_Send_support+0x98>
400079b4: 01 00 00 00 nop
_POSIX_Message_queue_Priority_to_core( msg_prio ),
( the_mq->oflag & O_NONBLOCK ) == 0,
&queue_context
);
return _POSIX_Zero_or_minus_one_plus_errno( status );
}
400079b8: 81 c7 e0 08 ret
400079bc: 81 e8 00 00 restore
return 0;
}
rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) );
400079c0: 40 00 2a 70 call 40012380 <__errno>
400079c4: d2 27 bf d4 st %o1, [ %fp + -44 ]
return STATUS_GET_POSIX( status );
400079c8: d2 07 bf d4 ld [ %fp + -44 ], %o1
400079cc: 93 3a 60 08 sra %o1, 8, %o1
rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) );
400079d0: d2 22 00 00 st %o1, [ %o0 ]
400079d4: 81 c7 e0 08 ret
400079d8: 91 e8 3f ff restore %g0, -1, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400079dc: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400079e0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400079e4: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
400079e8: 40 00 2a 66 call 40012380 <__errno>
400079ec: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
400079f0: 82 10 20 09 mov 9, %g1
400079f4: c2 22 00 00 st %g1, [ %o0 ]
400079f8: 81 c7 e0 08 ret
400079fc: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( EINVAL );
40007a00: 40 00 2a 60 call 40012380 <__errno>
40007a04: b0 10 3f ff mov -1, %i0
40007a08: 82 10 20 16 mov 0x16, %g1
40007a0c: c2 22 00 00 st %g1, [ %o0 ]
40007a10: 81 c7 e0 08 ret
40007a14: 81 e8 00 00 restore
4001bcd0 <_POSIX_Mutex_Default_attributes>:
4001bcd0: 00 00 00 01 00 00 00 00 7f ff ff ff 00 00 00 00 ................
4001bce0: 00 00 00 03 00 00 00 00 ........
40009a10 <_POSIX_Mutex_Lock_support>:
int _POSIX_Mutex_Lock_support(
pthread_mutex_t *mutex,
const struct timespec *abstime,
Thread_queue_Enqueue_callout enqueue_callout
)
{
40009a10: 9d e3 bf 70 save %sp, -144, %sp
Thread_queue_Context queue_context;
Thread_Control *executing;
Status_Control status;
the_mutex = _POSIX_Mutex_Get( mutex );
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009a14: 80 a6 20 00 cmp %i0, 0
40009a18: 02 80 00 3f be 40009b14 <_POSIX_Mutex_Lock_support+0x104>
40009a1c: 05 25 87 04 sethi %hi(0x961c1000), %g2
40009a20: fa 06 00 00 ld [ %i0 ], %i5
40009a24: 82 1e 00 1d xor %i0, %i5, %g1
40009a28: 84 10 a3 b8 or %g2, 0x3b8, %g2
40009a2c: 82 18 40 02 xor %g1, %g2, %g1
40009a30: 80 88 7f f8 btst -8, %g1
40009a34: 12 80 00 33 bne 40009b00 <_POSIX_Mutex_Lock_support+0xf0>
40009a38: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40009a3c: 91 d0 20 09 ta 9
<== NOT EXECUTED
)
{
#if defined( RTEMS_SMP )
context->Lock_context.isr_level = level;
#else
context->isr_level = level;
40009a40: c2 27 bf dc st %g1, [ %fp + -36 ]
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout);
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime );
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
40009a44: 82 8f 60 03 andcc %i5, 3, %g1
queue_context->enqueue_callout = enqueue_callout;
40009a48: f4 27 bf e4 st %i2, [ %fp + -28 ]
queue_context->Timeout.arg = arg;
40009a4c: f2 27 bf e8 st %i1, [ %fp + -24 ]
40009a50: 02 80 00 34 be 40009b20 <_POSIX_Mutex_Lock_support+0x110>
40009a54: d0 01 a0 20 ld [ %g6 + 0x20 ], %o0
40009a58: 80 a0 60 02 cmp %g1, 2
40009a5c: 12 80 00 10 bne 40009a9c <_POSIX_Mutex_Lock_support+0x8c>
40009a60: c2 06 20 10 ld [ %i0 + 0x10 ], %g1
{
Thread_Control *owner;
owner = _POSIX_Mutex_Get_owner( the_mutex );
if ( owner == NULL ) {
40009a64: 80 a0 60 00 cmp %g1, 0
40009a68: 02 80 00 43 be 40009b74 <_POSIX_Mutex_Lock_support+0x164>
40009a6c: 80 a2 00 01 cmp %o0, %g1
executing,
queue_context
);
}
if ( owner == executing ) {
40009a70: 02 80 00 18 be 40009ad0 <_POSIX_Mutex_Lock_support+0xc0>
<== NEVER TAKEN
40009a74: 94 10 00 08 mov %o0, %o2
status = _POSIX_Mutex_Lock_nested( the_mutex, flags );
_POSIX_Mutex_Release( the_mutex, queue_context );
return status;
}
return _POSIX_Mutex_Seize_slow(
40009a78: 98 07 bf dc add %fp, -36, %o4
40009a7c: 96 10 00 19 mov %i1, %o3
40009a80: 90 10 00 18 mov %i0, %o0
40009a84: 13 10 00 6f sethi %hi(0x4001bc00), %o1
40009a88: 7f ff ff ca call 400099b0 <_POSIX_Mutex_Seize_slow>
40009a8c: 92 12 61 68 or %o1, 0x168, %o1 ! 4001bd68 <_Thread_queue_Operations_priority>
40009a90: 93 3a 60 08 sra %o1, 8, %o1
);
break;
}
return _POSIX_Get_error( status );
}
40009a94: 81 c7 e0 08 ret
40009a98: 91 e8 00 09 restore %g0, %o1, %o0
if ( owner == NULL ) {
40009a9c: 80 a0 60 00 cmp %g1, 0
40009aa0: 02 80 00 2e be 40009b58 <_POSIX_Mutex_Lock_support+0x148>
40009aa4: 80 a2 00 01 cmp %o0, %g1
if ( owner == executing ) {
40009aa8: 02 80 00 0a be 40009ad0 <_POSIX_Mutex_Lock_support+0xc0>
40009aac: 94 10 00 08 mov %o0, %o2
return _POSIX_Mutex_Seize_slow(
40009ab0: 98 07 bf dc add %fp, -36, %o4
40009ab4: 96 10 00 19 mov %i1, %o3
40009ab8: 90 10 00 18 mov %i0, %o0
40009abc: 13 10 00 6f sethi %hi(0x4001bc00), %o1
40009ac0: 7f ff ff bc call 400099b0 <_POSIX_Mutex_Seize_slow>
40009ac4: 92 12 61 54 or %o1, 0x154, %o1 ! 4001bd54 <_Thread_queue_Operations_priority_inherit>
return _POSIX_Get_error( status );
40009ac8: 10 80 00 0c b 40009af8 <_POSIX_Mutex_Lock_support+0xe8>
40009acc: 93 3a 60 08 sra %o1, 8, %o1
if ( _POSIX_Mutex_Is_recursive( flags ) ) {
40009ad0: 80 8f 60 04 btst 4, %i5
40009ad4: 02 80 00 06 be 40009aec <_POSIX_Mutex_Lock_support+0xdc>
<== ALWAYS TAKEN
40009ad8: 92 10 20 2d mov 0x2d, %o1
++the_mutex->Recursive.nest_level;
40009adc: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
<== NOT EXECUTED
40009ae0: 82 00 60 01 inc %g1
<== NOT EXECUTED
40009ae4: c2 26 20 18 st %g1, [ %i0 + 0x18 ]
<== NOT EXECUTED
40009ae8: 92 10 20 00 clr %o1
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009aec: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009af0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009af4: 01 00 00 00 nop
}
40009af8: 81 c7 e0 08 ret
40009afc: 91 e8 00 09 restore %g0, %o1, %o0
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009b00: 40 00 00 b6 call 40009dd8 <_POSIX_Mutex_Auto_initialization>
40009b04: 90 10 00 18 mov %i0, %o0
40009b08: 80 a2 20 00 cmp %o0, 0
40009b0c: 12 bf ff cc bne 40009a3c <_POSIX_Mutex_Lock_support+0x2c>
40009b10: 01 00 00 00 nop
40009b14: 92 10 20 16 mov 0x16, %o1 ! 16 <_TLS_Alignment+0x15>
}
40009b18: 81 c7 e0 08 ret
40009b1c: 91 e8 00 09 restore %g0, %o1, %o0
40009b20: c2 06 20 10 ld [ %i0 + 0x10 ], %g1
if ( owner == NULL ) {
40009b24: 80 a0 60 00 cmp %g1, 0
40009b28: 02 80 00 0c be 40009b58 <_POSIX_Mutex_Lock_support+0x148>
40009b2c: 80 a2 00 01 cmp %o0, %g1
if ( owner == executing ) {
40009b30: 02 bf ff e8 be 40009ad0 <_POSIX_Mutex_Lock_support+0xc0>
<== NEVER TAKEN
40009b34: 94 10 00 08 mov %o0, %o2
return _POSIX_Mutex_Seize_slow(
40009b38: 98 07 bf dc add %fp, -36, %o4
40009b3c: 96 10 00 19 mov %i1, %o3
40009b40: 90 10 00 18 mov %i0, %o0
40009b44: 13 10 00 6f sethi %hi(0x4001bc00), %o1
40009b48: 7f ff ff 9a call 400099b0 <_POSIX_Mutex_Seize_slow>
40009b4c: 92 12 61 7c or %o1, 0x17c, %o1 ! 4001bd7c <_Thread_queue_Operations_FIFO>
40009b50: 10 bf ff ea b 40009af8 <_POSIX_Mutex_Lock_support+0xe8>
40009b54: 93 3a 60 08 sra %o1, 8, %o1
the_mutex->Recursive.Mutex.Queue.Queue.owner = owner;
40009b58: d0 26 20 10 st %o0, [ %i0 + 0x10 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009b5c: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009b60: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009b64: 01 00 00 00 nop
40009b68: 92 10 20 00 clr %o1 ! 0 <PROM_START>
40009b6c: 81 c7 e0 08 ret
40009b70: 91 e8 00 09 restore %g0, %o1, %o0
if (
40009b74: c2 02 20 38 ld [ %o0 + 0x38 ], %g1
queue_context->Priority.update_count = 0;
40009b78: c0 27 bf f0 clr [ %fp + -16 ]
40009b7c: c6 06 20 30 ld [ %i0 + 0x30 ], %g3
40009b80: c4 00 60 18 ld [ %g1 + 0x18 ], %g2
40009b84: 80 a0 c0 02 cmp %g3, %g2
40009b88: 18 80 00 09 bgu 40009bac <_POSIX_Mutex_Lock_support+0x19c>
<== NEVER TAKEN
40009b8c: 01 00 00 00 nop
40009b90: 32 80 00 0c bne,a 40009bc0 <_POSIX_Mutex_Lock_support+0x1b0>
<== NEVER TAKEN
40009b94: d0 26 20 10 st %o0, [ %i0 + 0x10 ]
<== NOT EXECUTED
40009b98: c4 06 20 34 ld [ %i0 + 0x34 ], %g2
40009b9c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1
40009ba0: 80 a0 80 01 cmp %g2, %g1
40009ba4: 28 80 00 07 bleu,a 40009bc0 <_POSIX_Mutex_Lock_support+0x1b0>
40009ba8: d0 26 20 10 st %o0, [ %i0 + 0x10 ]
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009bac: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009bb0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009bb4: 01 00 00 00 nop
40009bb8: 10 bf ff d8 b 40009b18 <_POSIX_Mutex_Lock_support+0x108>
40009bbc: 92 10 20 16 mov 0x16, %o1 ! 16 <_TLS_Alignment+0x15>
_Thread_Priority_add(
40009bc0: 92 06 20 20 add %i0, 0x20, %o1
40009bc4: 40 00 13 83 call 4000e9d0 <_Thread_Priority_add>
40009bc8: 94 07 bf dc add %fp, -36, %o2
const ISR_lock_Context *lock_context
)
{
uint32_t disable_level;
disable_level = cpu_self->thread_dispatch_disable_level;
40009bcc: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
<== NOT EXECUTED
_Profiling_Thread_dispatch_disable_critical(
cpu_self,
disable_level,
lock_context
);
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40009bd0: 82 00 60 01 inc %g1
<== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Dispatch_disable_critical(
const ISR_lock_Context *lock_context
)
{
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
40009bd4: ba 10 00 06 mov %g6, %i5
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40009bd8: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009bdc: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009be0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009be4: 01 00 00 00 nop
_Thread_Priority_update( queue_context );
40009be8: 40 00 13 8b call 4000ea14 <_Thread_Priority_update>
40009bec: 90 07 bf dc add %fp, -36, %o0
*
* @param[in] cpu_self The current processor.
*/
RTEMS_INLINE_ROUTINE void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
{
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
40009bf0: c2 07 60 18 ld [ %i5 + 0x18 ], %g1
if ( disable_level == 1 ) {
40009bf4: 80 a0 60 01 cmp %g1, 1
40009bf8: 02 80 00 05 be 40009c0c <_POSIX_Mutex_Lock_support+0x1fc>
<== ALWAYS TAKEN
40009bfc: 82 00 7f ff add %g1, -1, %g1
}
_ISR_Local_enable( level );
} else {
_Assert( disable_level > 0 );
cpu_self->thread_dispatch_disable_level = disable_level - 1;
40009c00: 92 10 20 00 clr %o1
<== NOT EXECUTED
40009c04: c2 27 60 18 st %g1, [ %i5 + 0x18 ]
<== NOT EXECUTED
40009c08: 30 bf ff bc b,a 40009af8 <_POSIX_Mutex_Lock_support+0xe8>
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40009c0c: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
40009c10: c4 0f 60 1c ldub [ %i5 + 0x1c ], %g2
40009c14: 80 a0 a0 00 cmp %g2, 0
40009c18: 32 80 00 07 bne,a 40009c34 <_POSIX_Mutex_Lock_support+0x224>
<== NEVER TAKEN
40009c1c: 92 10 00 01 mov %g1, %o1
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = 0;
40009c20: c0 27 60 18 clr [ %i5 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009c24: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009c28: 01 00 00 00 nop
40009c2c: 10 bf ff b3 b 40009af8 <_POSIX_Mutex_Lock_support+0xe8>
40009c30: 92 10 20 00 clr %o1 ! 0 <PROM_START>
_Thread_Do_dispatch( cpu_self, level );
40009c34: c2 27 bf d4 st %g1, [ %fp + -44 ]
<== NOT EXECUTED
40009c38: 40 00 13 fe call 4000ec30 <_Thread_Do_dispatch>
<== NOT EXECUTED
40009c3c: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
40009c40: 10 bf ff f9 b 40009c24 <_POSIX_Mutex_Lock_support+0x214>
<== NOT EXECUTED
40009c44: c2 07 bf d4 ld [ %fp + -44 ], %g1
<== NOT EXECUTED
400099b0 <_POSIX_Mutex_Seize_slow>:
const Thread_queue_Operations *operations,
Thread_Control *executing,
const struct timespec *abstime,
Thread_queue_Context *queue_context
)
{
400099b0: 9d e3 bf a0 save %sp, -96, %sp
if ( (uintptr_t) abstime != POSIX_MUTEX_ABSTIME_TRY_LOCK ) {
400099b4: 80 a6 e0 01 cmp %i3, 1
400099b8: 02 80 00 0f be 400099f4 <_POSIX_Mutex_Seize_slow+0x44>
400099bc: 82 10 20 01 mov 1, %g1
queue_context->thread_state = thread_state;
400099c0: c2 27 20 04 st %g1, [ %i4 + 4 ]
queue_context->deadlock_callout = deadlock_callout;
400099c4: 03 10 00 3c sethi %hi(0x4000f000), %g1
400099c8: 82 10 63 64 or %g1, 0x364, %g1 ! 4000f364 <_Thread_queue_Deadlock_status>
400099cc: c2 27 20 20 st %g1, [ %i4 + 0x20 ]
);
_Thread_queue_Context_set_deadlock_callout(
queue_context,
_Thread_queue_Deadlock_status
);
_Thread_queue_Enqueue(
400099d0: 92 10 00 19 mov %i1, %o1
400099d4: 90 06 20 0c add %i0, 0xc, %o0
400099d8: 96 10 00 1c mov %i4, %o3
400099dc: 94 10 00 1a mov %i2, %o2
400099e0: 40 00 16 69 call 4000f384 <_Thread_queue_Enqueue>
400099e4: b0 10 20 00 clr %i0
RTEMS_INLINE_ROUTINE Status_Control _Thread_Wait_get_status(
const Thread_Control *the_thread
)
{
return (Status_Control) the_thread->Wait.return_code;
400099e8: f2 06 a0 4c ld [ %i2 + 0x4c ], %i1
return _Thread_Wait_get_status( executing );
} else {
_POSIX_Mutex_Release( the_mutex, queue_context );
return STATUS_UNAVAILABLE;
}
}
400099ec: 81 c7 e0 08 ret
400099f0: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400099f4: c2 07 00 00 ld [ %i4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400099f8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400099fc: 01 00 00 00 nop
40009a00: 33 00 00 04 sethi %hi(0x1000), %i1
40009a04: b2 16 60 0d or %i1, 0xd, %i1 ! 100d <_Configuration_Interrupt_stack_size+0xd>
40009a08: 81 c7 e0 08 ret
40009a0c: 91 e8 20 00 restore %g0, 0, %o0
4000e138 <_POSIX_Priority_To_core>:
Priority_Control _POSIX_Priority_To_core(
const Scheduler_Control *scheduler,
int posix_priority,
bool *valid
)
{
4000e138: 9d e3 bf a0 save %sp, -96, %sp
Priority_Control core_posix_priority;
Priority_Control core_priority;
core_posix_priority = (Priority_Control) posix_priority;
core_priority = scheduler->maximum_priority - core_posix_priority;
4000e13c: f8 1e 20 40 ldd [ %i0 + 0x40 ], %i4
core_posix_priority = (Priority_Control) posix_priority;
4000e140: 83 3e 60 1f sra %i1, 0x1f, %g1
4000e144: 86 10 00 19 mov %i1, %g3
4000e148: 84 10 00 01 mov %g1, %g2
*valid = ( posix_priority >= POSIX_SCHEDULER_MINIMUM_PRIORITY
&& core_posix_priority < scheduler->maximum_priority );
4000e14c: 80 a7 00 01 cmp %i4, %g1
4000e150: 18 80 00 05 bgu 4000e164 <_POSIX_Priority_To_core+0x2c>
<== NEVER TAKEN
4000e154: 88 10 20 01 mov 1, %g4
4000e158: 02 80 00 11 be 4000e19c <_POSIX_Priority_To_core+0x64>
4000e15c: 80 a7 40 19 cmp %i5, %i1
4000e160: 88 10 20 00 clr %g4
4000e164: 82 20 40 19 sub %g1, %i1, %g1
4000e168: 83 30 60 1f srl %g1, 0x1f, %g1
4000e16c: 82 08 40 04 and %g1, %g4, %g1
*valid = ( posix_priority >= POSIX_SCHEDULER_MINIMUM_PRIORITY
4000e170: c2 2e 80 00 stb %g1, [ %i2 ]
core_priority = scheduler->maximum_priority - core_posix_priority;
4000e174: b6 a7 40 03 subcc %i5, %g3, %i3
return ( *scheduler->Operations.map_priority )( scheduler, priority );
4000e178: c2 06 20 1c ld [ %i0 + 0x1c ], %g1
4000e17c: b4 67 00 02 subx %i4, %g2, %i2
4000e180: 94 10 00 1b mov %i3, %o2
4000e184: 92 10 00 1a mov %i2, %o1
4000e188: 9f c0 40 00 call %g1
4000e18c: 90 10 00 18 mov %i0, %o0
return _Scheduler_Map_priority( scheduler, core_priority );
}
4000e190: b0 10 00 08 mov %o0, %i0
4000e194: 81 c7 e0 08 ret
4000e198: 93 e8 00 09 restore %g0, %o1, %o1
&& core_posix_priority < scheduler->maximum_priority );
4000e19c: 38 bf ff f3 bgu,a 4000e168 <_POSIX_Priority_To_core+0x30>
4000e1a0: 82 20 40 19 sub %g1, %i1, %g1
4000e1a4: 10 bf ff f0 b 4000e164 <_POSIX_Priority_To_core+0x2c>
4000e1a8: 88 10 20 00 clr %g4
40006dfc <_POSIX_Shm_Object_create_from_heap>:
int _POSIX_Shm_Object_create_from_heap(
POSIX_Shm_Object *shm_obj,
size_t size
)
{
40006dfc: 9d e3 bf a0 save %sp, -96, %sp
<== NOT EXECUTED
void *p = calloc( 1, size ); /* get zero'd memory */
40006e00: 90 10 20 01 mov 1, %o0
<== NOT EXECUTED
40006e04: 7f ff f5 96 call 4000445c <calloc>
<== NOT EXECUTED
40006e08: 92 10 00 19 mov %i1, %o1
<== NOT EXECUTED
if ( p != NULL ) {
40006e0c: 80 a2 20 00 cmp %o0, 0
<== NOT EXECUTED
40006e10: 02 80 00 06 be 40006e28 <_POSIX_Shm_Object_create_from_heap+0x2c>
<== NOT EXECUTED
40006e14: 01 00 00 00 nop
<== NOT EXECUTED
shm_obj->handle = p;
40006e18: d0 26 00 00 st %o0, [ %i0 ]
<== NOT EXECUTED
shm_obj->size = size;
40006e1c: f2 26 20 04 st %i1, [ %i0 + 4 ]
<== NOT EXECUTED
} else {
errno = EIO;
}
return 0;
}
40006e20: 81 c7 e0 08 ret
<== NOT EXECUTED
40006e24: 91 e8 20 00 restore %g0, 0, %o0
<== NOT EXECUTED
errno = EIO;
40006e28: 40 00 24 2c call 4000fed8 <__errno>
<== NOT EXECUTED
40006e2c: b0 10 20 00 clr %i0
<== NOT EXECUTED
40006e30: 82 10 20 05 mov 5, %g1
<== NOT EXECUTED
40006e34: c2 22 00 00 st %g1, [ %o0 ]
<== NOT EXECUTED
}
40006e38: 81 c7 e0 08 ret
<== NOT EXECUTED
40006e3c: 81 e8 00 00 restore
<== NOT EXECUTED
40007e00 <_POSIX_Shm_Object_create_from_workspace>:
int _POSIX_Shm_Object_create_from_workspace(
POSIX_Shm_Object *shm_obj,
size_t size
)
{
40007e00: 9d e3 bf a0 save %sp, -96, %sp
<== NOT EXECUTED
shm_obj->handle = _Workspace_Allocate_or_fatal_error( size );
40007e04: 40 00 16 92 call 4000d84c <_Workspace_Allocate_or_fatal_error>
<== NOT EXECUTED
40007e08: 90 10 00 19 mov %i1, %o0
<== NOT EXECUTED
40007e0c: d0 26 00 00 st %o0, [ %i0 ]
<== NOT EXECUTED
{
40007e10: ba 10 00 18 mov %i0, %i5
<== NOT EXECUTED
memset( shm_obj->handle, 0, size );
40007e14: 94 10 00 19 mov %i1, %o2
<== NOT EXECUTED
40007e18: 92 10 20 00 clr %o1
<== NOT EXECUTED
40007e1c: 40 00 23 3c call 40010b0c <memset>
<== NOT EXECUTED
40007e20: b0 10 20 00 clr %i0
<== NOT EXECUTED
shm_obj->size = size;
40007e24: f2 27 60 04 st %i1, [ %i5 + 4 ]
<== NOT EXECUTED
return 0;
}
40007e28: 81 c7 e0 08 ret
<== NOT EXECUTED
40007e2c: 81 e8 00 00 restore
<== NOT EXECUTED
40006f44 <_POSIX_Shm_Object_mmap_from_heap>:
size_t len,
int prot,
off_t off
)
{
if ( shm_obj == NULL || shm_obj->handle == NULL )
40006f44: 80 a2 20 00 cmp %o0, 0
40006f48: 02 80 00 11 be 40006f8c <_POSIX_Shm_Object_mmap_from_heap+0x48>
<== NEVER TAKEN
40006f4c: 86 10 00 0c mov %o4, %g3
40006f50: c2 02 00 00 ld [ %o0 ], %g1
40006f54: 80 a0 60 00 cmp %g1, 0
40006f58: 02 80 00 09 be 40006f7c <_POSIX_Shm_Object_mmap_from_heap+0x38>
<== NEVER TAKEN
40006f5c: 9a 83 00 09 addcc %o4, %o1, %o5
return 0;
/* This is already checked by mmap. Maybe make it a debug assert? */
if ( shm_obj->size < len + off ) {
40006f60: 98 42 e0 00 addx %o3, 0, %o4
40006f64: 80 a3 20 00 cmp %o4, 0
40006f68: 14 80 00 09 bg 40006f8c <_POSIX_Shm_Object_mmap_from_heap+0x48>
<== NEVER TAKEN
40006f6c: c8 02 20 04 ld [ %o0 + 4 ], %g4
40006f70: 02 80 00 05 be 40006f84 <_POSIX_Shm_Object_mmap_from_heap+0x40>
<== ALWAYS TAKEN
40006f74: 80 a3 40 04 cmp %o5, %g4
return NULL;
}
return (char*)shm_obj->handle + off;
40006f78: 82 00 40 03 add %g1, %g3, %g1
<== NOT EXECUTED
}
40006f7c: 81 c3 e0 08 retl
40006f80: 90 10 00 01 mov %g1, %o0
if ( shm_obj->size < len + off ) {
40006f84: 08 bf ff fe bleu 40006f7c <_POSIX_Shm_Object_mmap_from_heap+0x38>
<== ALWAYS TAKEN
40006f88: 82 00 40 03 add %g1, %g3, %g1
return 0;
40006f8c: 82 10 20 00 clr %g1
<== NOT EXECUTED
}
40006f90: 81 c3 e0 08 retl
<== NOT EXECUTED
40006f94: 90 10 00 01 mov %g1, %o0
<== NOT EXECUTED
40007f08 <_POSIX_Shm_Object_mmap_from_workspace>:
size_t len,
int prot,
off_t off
)
{
if ( shm_obj == NULL || shm_obj->handle == NULL )
40007f08: 80 a2 20 00 cmp %o0, 0
40007f0c: 02 80 00 11 be 40007f50 <_POSIX_Shm_Object_mmap_from_workspace+0x48>
<== NEVER TAKEN
40007f10: 86 10 00 0c mov %o4, %g3
40007f14: c2 02 00 00 ld [ %o0 ], %g1
40007f18: 80 a0 60 00 cmp %g1, 0
40007f1c: 02 80 00 09 be 40007f40 <_POSIX_Shm_Object_mmap_from_workspace+0x38>
<== NEVER TAKEN
40007f20: 9a 83 00 09 addcc %o4, %o1, %o5
return 0;
/* This is already checked by mmap. Maybe make it a debug assert? */
if ( shm_obj->size < len + off ) {
40007f24: 98 42 e0 00 addx %o3, 0, %o4
40007f28: 80 a3 20 00 cmp %o4, 0
40007f2c: 14 80 00 09 bg 40007f50 <_POSIX_Shm_Object_mmap_from_workspace+0x48>
<== NEVER TAKEN
40007f30: c8 02 20 04 ld [ %o0 + 4 ], %g4
40007f34: 02 80 00 05 be 40007f48 <_POSIX_Shm_Object_mmap_from_workspace+0x40>
<== ALWAYS TAKEN
40007f38: 80 a3 40 04 cmp %o5, %g4
return NULL;
}
return (char*)shm_obj->handle + off;
40007f3c: 82 00 40 03 add %g1, %g3, %g1
<== NOT EXECUTED
}
40007f40: 81 c3 e0 08 retl
40007f44: 90 10 00 01 mov %g1, %o0
if ( shm_obj->size < len + off ) {
40007f48: 08 bf ff fe bleu 40007f40 <_POSIX_Shm_Object_mmap_from_workspace+0x38>
<== ALWAYS TAKEN
40007f4c: 82 00 40 03 add %g1, %g3, %g1
return 0;
40007f50: 82 10 20 00 clr %g1
<== NOT EXECUTED
}
40007f54: 81 c3 e0 08 retl
<== NOT EXECUTED
40007f58: 90 10 00 01 mov %g1, %o0
<== NOT EXECUTED
40006efc <_POSIX_Shm_Object_read_from_heap>:
int _POSIX_Shm_Object_read_from_heap(
POSIX_Shm_Object *shm_obj,
void *buf,
size_t count
)
{
40006efc: 9d e3 bf a0 save %sp, -96, %sp
<== NOT EXECUTED
if ( shm_obj == NULL || shm_obj->handle == NULL )
40006f00: 80 a6 20 00 cmp %i0, 0
<== NOT EXECUTED
40006f04: 02 80 00 0e be 40006f3c <_POSIX_Shm_Object_read_from_heap+0x40>
<== NOT EXECUTED
40006f08: 94 10 20 00 clr %o2
<== NOT EXECUTED
40006f0c: d2 06 00 00 ld [ %i0 ], %o1
<== NOT EXECUTED
40006f10: 80 a2 60 00 cmp %o1, 0
<== NOT EXECUTED
40006f14: 02 80 00 0a be 40006f3c <_POSIX_Shm_Object_read_from_heap+0x40>
<== NOT EXECUTED
40006f18: 01 00 00 00 nop
<== NOT EXECUTED
40006f1c: f0 06 20 04 ld [ %i0 + 4 ], %i0
<== NOT EXECUTED
40006f20: 80 a6 00 1a cmp %i0, %i2
<== NOT EXECUTED
40006f24: 38 80 00 02 bgu,a 40006f2c <_POSIX_Shm_Object_read_from_heap+0x30>
<== NOT EXECUTED
40006f28: b0 10 00 1a mov %i2, %i0
<== NOT EXECUTED
if ( shm_obj->size < count ) {
count = shm_obj->size;
}
memcpy( buf, shm_obj->handle, count );
40006f2c: 94 10 00 18 mov %i0, %o2
<== NOT EXECUTED
40006f30: 40 00 24 18 call 4000ff90 <memcpy>
<== NOT EXECUTED
40006f34: 90 10 00 19 mov %i1, %o0
<== NOT EXECUTED
return count;
40006f38: 94 10 00 18 mov %i0, %o2
<== NOT EXECUTED
}
40006f3c: 81 c7 e0 08 ret
<== NOT EXECUTED
40006f40: 91 e8 00 0a restore %g0, %o2, %o0
<== NOT EXECUTED
40007ec0 <_POSIX_Shm_Object_read_from_workspace>:
int _POSIX_Shm_Object_read_from_workspace(
POSIX_Shm_Object *shm_obj,
void *buf,
size_t count
)
{
40007ec0: 9d e3 bf a0 save %sp, -96, %sp
if ( shm_obj == NULL || shm_obj->handle == NULL )
40007ec4: 80 a6 20 00 cmp %i0, 0
40007ec8: 02 80 00 0e be 40007f00 <_POSIX_Shm_Object_read_from_workspace+0x40>
<== NEVER TAKEN
40007ecc: 94 10 20 00 clr %o2
40007ed0: d2 06 00 00 ld [ %i0 ], %o1
40007ed4: 80 a2 60 00 cmp %o1, 0
40007ed8: 02 80 00 0a be 40007f00 <_POSIX_Shm_Object_read_from_workspace+0x40>
<== NEVER TAKEN
40007edc: 01 00 00 00 nop
40007ee0: f0 06 20 04 ld [ %i0 + 4 ], %i0
40007ee4: 80 a6 00 1a cmp %i0, %i2
40007ee8: 38 80 00 02 bgu,a 40007ef0 <_POSIX_Shm_Object_read_from_workspace+0x30>
<== NEVER TAKEN
40007eec: b0 10 00 1a mov %i2, %i0
<== NOT EXECUTED
if ( shm_obj->size < count ) {
count = shm_obj->size;
}
memcpy( buf, shm_obj->handle, count );
40007ef0: 94 10 00 18 mov %i0, %o2
40007ef4: 40 00 22 ca call 40010a1c <memcpy>
40007ef8: 90 10 00 19 mov %i1, %o0
return count;
40007efc: 94 10 00 18 mov %i0, %o2
}
40007f00: 81 c7 e0 08 ret
40007f04: 91 e8 00 0a restore %g0, %o2, %o0
40006e70 <_POSIX_Shm_Object_resize_from_heap>:
int _POSIX_Shm_Object_resize_from_heap(
POSIX_Shm_Object *shm_obj,
size_t size
)
{
40006e70: 9d e3 bf a0 save %sp, -96, %sp
void *p;
int err = 0;
if ( size < shm_obj->size ) {
40006e74: d4 06 20 04 ld [ %i0 + 4 ], %o2
40006e78: 80 a2 80 19 cmp %o2, %i1
40006e7c: 18 80 00 0f bgu 40006eb8 <_POSIX_Shm_Object_resize_from_heap+0x48>
<== NEVER TAKEN
40006e80: d0 06 00 00 ld [ %i0 ], %o0
/* zero out if shrinking */
p = (void*)((uintptr_t)shm_obj->handle + (uintptr_t)size);
memset( p, 0, shm_obj->size - size );
}
p = realloc( shm_obj->handle, size );
40006e84: 40 00 1c ce call 4000e1bc <realloc>
40006e88: 92 10 00 19 mov %i1, %o1
if ( p != NULL ) {
40006e8c: 82 92 20 00 orcc %o0, 0, %g1
40006e90: 02 80 00 14 be 40006ee0 <_POSIX_Shm_Object_resize_from_heap+0x70>
<== NEVER TAKEN
40006e94: 01 00 00 00 nop
shm_obj->handle = p;
40006e98: c2 26 00 00 st %g1, [ %i0 ]
if ( size > shm_obj->size ) {
40006e9c: d4 06 20 04 ld [ %i0 + 4 ], %o2
40006ea0: 80 a2 80 19 cmp %o2, %i1
40006ea4: 2a 80 00 11 bcs,a 40006ee8 <_POSIX_Shm_Object_resize_from_heap+0x78>
<== ALWAYS TAKEN
40006ea8: 94 26 40 0a sub %i1, %o2, %o2
/* initialize added memory */
memset( p, 0, size - shm_obj->size );
}
shm_obj->size = size;
40006eac: f2 26 20 04 st %i1, [ %i0 + 4 ]
<== NOT EXECUTED
40006eb0: 81 c7 e0 08 ret
<== NOT EXECUTED
40006eb4: 91 e8 20 00 restore %g0, 0, %o0
<== NOT EXECUTED
memset( p, 0, shm_obj->size - size );
40006eb8: 94 22 80 19 sub %o2, %i1, %o2
<== NOT EXECUTED
40006ebc: 92 10 20 00 clr %o1
<== NOT EXECUTED
40006ec0: 40 00 24 70 call 40010080 <memset>
<== NOT EXECUTED
40006ec4: 90 02 00 19 add %o0, %i1, %o0
<== NOT EXECUTED
40006ec8: d0 06 00 00 ld [ %i0 ], %o0
<== NOT EXECUTED
p = realloc( shm_obj->handle, size );
40006ecc: 40 00 1c bc call 4000e1bc <realloc>
<== NOT EXECUTED
40006ed0: 92 10 00 19 mov %i1, %o1
<== NOT EXECUTED
if ( p != NULL ) {
40006ed4: 82 92 20 00 orcc %o0, 0, %g1
<== NOT EXECUTED
40006ed8: 32 bf ff f1 bne,a 40006e9c <_POSIX_Shm_Object_resize_from_heap+0x2c>
<== NOT EXECUTED
40006edc: c2 26 00 00 st %g1, [ %i0 ]
<== NOT EXECUTED
} else {
err = EIO;
}
return err;
}
40006ee0: 81 c7 e0 08 ret
<== NOT EXECUTED
40006ee4: 91 e8 20 05 restore %g0, 5, %o0
<== NOT EXECUTED
memset( p, 0, size - shm_obj->size );
40006ee8: 40 00 24 66 call 40010080 <memset>
40006eec: 92 10 20 00 clr %o1
shm_obj->size = size;
40006ef0: f2 26 20 04 st %i1, [ %i0 + 4 ]
40006ef4: 81 c7 e0 08 ret
40006ef8: 91 e8 20 00 restore %g0, 0, %o0
40007e60 <_POSIX_Shm_Object_resize_from_workspace>:
int _POSIX_Shm_Object_resize_from_workspace(
POSIX_Shm_Object *shm_obj,
size_t size
)
{
40007e60: 9d e3 bf a0 save %sp, -96, %sp
int err;
if ( size == 0 ) {
40007e64: 80 a6 60 00 cmp %i1, 0
40007e68: 02 80 00 14 be 40007eb8 <_POSIX_Shm_Object_resize_from_workspace+0x58>
<== NEVER TAKEN
40007e6c: ba 10 00 18 mov %i0, %i5
err = _POSIX_Shm_Object_delete_from_workspace( shm_obj );
} else if ( shm_obj->handle == NULL && shm_obj->size == 0 ) {
40007e70: c2 06 00 00 ld [ %i0 ], %g1
40007e74: 80 a0 60 00 cmp %g1, 0
40007e78: 12 80 00 0e bne 40007eb0 <_POSIX_Shm_Object_resize_from_workspace+0x50>
<== NEVER TAKEN
40007e7c: b0 10 20 05 mov 5, %i0
40007e80: c2 07 60 04 ld [ %i5 + 4 ], %g1
40007e84: 80 a0 60 00 cmp %g1, 0
40007e88: 12 80 00 0a bne 40007eb0 <_POSIX_Shm_Object_resize_from_workspace+0x50>
<== NEVER TAKEN
40007e8c: 01 00 00 00 nop
shm_obj->handle = _Workspace_Allocate_or_fatal_error( size );
40007e90: 40 00 16 6f call 4000d84c <_Workspace_Allocate_or_fatal_error>
40007e94: 90 10 00 19 mov %i1, %o0
40007e98: d0 27 40 00 st %o0, [ %i5 ]
memset( shm_obj->handle, 0, size );
40007e9c: 94 10 00 19 mov %i1, %o2
40007ea0: 92 10 20 00 clr %o1
40007ea4: 40 00 23 1a call 40010b0c <memset>
40007ea8: b0 10 20 00 clr %i0
shm_obj->size = size;
40007eac: f2 27 60 04 st %i1, [ %i5 + 4 ]
} else {
/* Refuse to resize a workspace object. */
err = EIO;
}
return err;
}
40007eb0: 81 c7 e0 08 ret
40007eb4: 81 e8 00 00 restore
err = _POSIX_Shm_Object_delete_from_workspace( shm_obj );
40007eb8: 7f ff ff de call 40007e30 <_POSIX_Shm_Object_delete_from_workspace>
<== NOT EXECUTED
40007ebc: 81 e8 00 00 restore
<== NOT EXECUTED
40017c60 <_POSIX_Threads_Default_attributes>:
40017c60: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 ................
40017c70: 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 00 ................
...
40017cac: 00 00 00 01 00 00 00 01 00 00 00 04 40 01 7c bc ............@.|.
40017cbc: ff ff ff ff ....
40006b64 <_POSIX_Threads_Initialize_user_threads_body>:
#include <rtems/posix/pthreadimpl.h>
#include <rtems/posix/priorityimpl.h>
#include <rtems/posix/config.h>
void _POSIX_Threads_Initialize_user_threads_body(void)
{
40006b64: 9d e3 bf 38 save %sp, -200, %sp
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;
40006b68: 03 10 00 65 sethi %hi(0x40019400), %g1
40006b6c: 82 10 60 44 or %g1, 0x44, %g1 ! 40019444 <Configuration_POSIX_API>
40006b70: fa 00 60 1c ld [ %g1 + 0x1c ], %i5
maximum = Configuration_POSIX_API.number_of_initialization_threads;
if ( !user_threads )
40006b74: 80 a7 60 00 cmp %i5, 0
40006b78: 02 80 00 1f be 40006bf4 <_POSIX_Threads_Initialize_user_threads_body+0x90>
<== NEVER TAKEN
40006b7c: 01 00 00 00 nop
maximum = Configuration_POSIX_API.number_of_initialization_threads;
40006b80: f4 00 60 18 ld [ %g1 + 0x18 ], %i2
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
40006b84: 80 a6 a0 00 cmp %i2, 0
40006b88: 02 80 00 1b be 40006bf4 <_POSIX_Threads_Initialize_user_threads_body+0x90>
<== NEVER TAKEN
40006b8c: b8 10 20 00 clr %i4
);
if ( eno != 0 ) {
_Internal_error( INTERNAL_ERROR_POSIX_INIT_THREAD_CREATE_FAILED );
}
if ( _Thread_Global_constructor == 0 ) {
40006b90: 37 10 00 6c sethi %hi(0x4001b000), %i3
eno = pthread_attr_init( &attr );
40006b94: 40 00 1d d2 call 4000e2dc <pthread_attr_init>
40006b98: 90 07 bf a0 add %fp, -96, %o0
eno = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
40006b9c: 92 10 20 02 mov 2, %o1
40006ba0: 40 00 1d de call 4000e318 <pthread_attr_setinheritsched>
40006ba4: 90 07 bf a0 add %fp, -96, %o0
eno = pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
40006ba8: d2 07 60 04 ld [ %i5 + 4 ], %o1
40006bac: 40 00 1d ea call 4000e354 <pthread_attr_setstacksize>
40006bb0: 90 07 bf a0 add %fp, -96, %o0
eno = pthread_create(
40006bb4: d4 07 40 00 ld [ %i5 ], %o2
40006bb8: 96 10 20 00 clr %o3
40006bbc: 92 07 bf a0 add %fp, -96, %o1
40006bc0: 7f ff fe d3 call 4000670c <pthread_create>
40006bc4: 90 07 bf 9c add %fp, -100, %o0
if ( eno != 0 ) {
40006bc8: 80 a2 20 00 cmp %o0, 0
40006bcc: 12 80 00 0c bne 40006bfc <_POSIX_Threads_Initialize_user_threads_body+0x98>
40006bd0: c2 06 e2 50 ld [ %i3 + 0x250 ], %g1
if ( _Thread_Global_constructor == 0 ) {
40006bd4: 80 a0 60 00 cmp %g1, 0
40006bd8: 12 80 00 04 bne 40006be8 <_POSIX_Threads_Initialize_user_threads_body+0x84>
40006bdc: b8 07 20 01 inc %i4
_Thread_Global_constructor = thread_id;
40006be0: c2 07 bf 9c ld [ %fp + -100 ], %g1
40006be4: c2 26 e2 50 st %g1, [ %i3 + 0x250 ]
for ( index=0 ; index < maximum ; index++ ) {
40006be8: 80 a6 80 1c cmp %i2, %i4
40006bec: 12 bf ff ea bne 40006b94 <_POSIX_Threads_Initialize_user_threads_body+0x30>
<== NEVER TAKEN
40006bf0: ba 07 60 08 add %i5, 8, %i5
}
}
}
40006bf4: 81 c7 e0 08 ret
40006bf8: 81 e8 00 00 restore
_Internal_error( INTERNAL_ERROR_POSIX_INIT_THREAD_CREATE_FAILED );
40006bfc: 40 00 03 69 call 400079a0 <_Internal_error>
40006c00: 90 10 20 21 mov 0x21, %o0
40006c04: 01 00 00 00 nop
<== NOT EXECUTED
40006d80 <_POSIX_Threads_Sporadic_budget_callout>:
{
40006d80: 9d e3 bf 78 save %sp, -136, %sp
<== NOT EXECUTED
40006d84: c0 27 bf f0 clr [ %fp + -16 ]
<== NOT EXECUTED
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
40006d88: d2 06 21 5c ld [ %i0 + 0x15c ], %o1
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006d8c: 91 d0 20 09 ta 9
<== NOT EXECUTED
40006d90: c2 27 bf dc st %g1, [ %fp + -36 ]
the_thread->cpu_time_budget = UINT32_MAX;
40006d94: 82 10 3f ff mov -1, %g1
40006d98: c2 26 20 8c st %g1, [ %i0 + 0x8c ]
if ( !_Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
40006d9c: c2 02 60 34 ld [ %o1 + 0x34 ], %g1
40006da0: 80 a0 7f ff cmp %g1, -1
40006da4: 02 80 00 09 be 40006dc8 <_POSIX_Threads_Sporadic_budget_callout+0x48>
<== ALWAYS TAKEN
40006da8: 90 10 00 18 mov %i0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006dac: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006db0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006db4: 01 00 00 00 nop
<== NOT EXECUTED
_Thread_Priority_update( &queue_context );
40006db8: 40 00 0e eb call 4000a964 <_Thread_Priority_update>
<== NOT EXECUTED
40006dbc: 90 07 bf dc add %fp, -36, %o0
<== NOT EXECUTED
}
40006dc0: 81 c7 e0 08 ret
<== NOT EXECUTED
40006dc4: 81 e8 00 00 restore
<== NOT EXECUTED
_Thread_Priority_add(
40006dc8: 94 07 bf dc add %fp, -36, %o2
40006dcc: 40 00 0e dc call 4000a93c <_Thread_Priority_add>
40006dd0: 92 02 60 28 add %o1, 0x28, %o1
_Thread_Priority_remove(
40006dd4: 94 07 bf dc add %fp, -36, %o2
40006dd8: 92 06 20 20 add %i0, 0x20, %o1
40006ddc: 40 00 0e dd call 4000a950 <_Thread_Priority_remove>
40006de0: 90 10 00 18 mov %i0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006de4: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006de8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006dec: 01 00 00 00 nop
_Thread_Priority_update( &queue_context );
40006df0: 40 00 0e dd call 4000a964 <_Thread_Priority_update>
40006df4: 90 07 bf dc add %fp, -36, %o0
}
40006df8: 81 c7 e0 08 ret
40006dfc: 81 e8 00 00 restore
40006ccc <_POSIX_Threads_Sporadic_timer>:
{
40006ccc: 9d e3 bf 78 save %sp, -136, %sp
<== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_queue_Context_clear_priority_updates(
Thread_queue_Context *queue_context
)
{
queue_context->Priority.update_count = 0;
40006cd0: c0 27 bf f0 clr [ %fp + -16 ]
<== NOT EXECUTED
api = RTEMS_CONTAINER_OF( watchdog, POSIX_API_Control, Sporadic.Timer );
40006cd4: ba 06 3f f8 add %i0, -8, %i5
<== NOT EXECUTED
the_thread = api->Sporadic.thread;
40006cd8: f8 06 3f f8 ld [ %i0 + -8 ], %i4
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006cdc: 91 d0 20 09 ta 9
<== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_Wait_acquire(
Thread_Control *the_thread,
Thread_queue_Context *queue_context
)
{
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40006ce0: c2 27 bf dc st %g1, [ %fp + -36 ]
if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
40006ce4: c2 07 60 34 ld [ %i5 + 0x34 ], %g1
40006ce8: 80 a0 7f ff cmp %g1, -1
40006cec: 02 80 00 0b be 40006d18 <_POSIX_Threads_Sporadic_timer+0x4c>
40006cf0: 92 07 20 20 add %i4, 0x20, %o1
_Thread_Priority_add(
40006cf4: 90 10 00 1c mov %i4, %o0
40006cf8: 40 00 0f 11 call 4000a93c <_Thread_Priority_add>
40006cfc: 94 07 bf dc add %fp, -36, %o2
_Thread_Priority_remove(
40006d00: 94 07 bf dc add %fp, -36, %o2
40006d04: 92 06 20 20 add %i0, 0x20, %o1
40006d08: 40 00 0f 12 call 4000a950 <_Thread_Priority_remove>
40006d0c: 90 10 00 1c mov %i4, %o0
40006d10: 82 10 3f ff mov -1, %g1
40006d14: c2 27 60 34 st %g1, [ %i5 + 0x34 ]
_Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
40006d18: b6 07 60 08 add %i5, 8, %i3
40006d1c: 11 10 00 6c sethi %hi(0x4001b000), %o0
40006d20: 92 10 00 1b mov %i3, %o1
40006d24: 40 00 17 27 call 4000c9c0 <_Watchdog_Remove>
40006d28: 90 12 22 38 or %o0, 0x238, %o0
_Timespec_To_ticks( &api->Sporadic.sched_ss_init_budget );
40006d2c: 40 00 15 f5 call 4000c500 <_Timespec_To_ticks>
40006d30: 90 07 60 50 add %i5, 0x50, %o0
the_thread->cpu_time_budget =
40006d34: d0 27 20 8c st %o0, [ %i4 + 0x8c ]
_Watchdog_Per_CPU_insert_ticks(
40006d38: b8 10 00 06 mov %g6, %i4
40006d3c: 40 00 15 f1 call 4000c500 <_Timespec_To_ticks>
40006d40: 90 07 60 40 add %i5, 0x40, %o0
expire = ticks + cpu->Watchdog.ticks;
40006d44: d4 1f 20 30 ldd [ %i4 + 0x30 ], %o2
_Watchdog_Insert(header, the_watchdog, expire);
40006d48: 86 82 c0 08 addcc %o3, %o0, %g3
40006d4c: 84 42 a0 00 addx %o2, 0, %g2
40006d50: 96 10 00 03 mov %g3, %o3
40006d54: 94 10 00 02 mov %g2, %o2
40006d58: 92 10 00 1b mov %i3, %o1
40006d5c: 40 00 16 f1 call 4000c920 <_Watchdog_Insert>
40006d60: 90 07 20 38 add %i4, 0x38, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006d64: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006d68: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006d6c: 01 00 00 00 nop
_Thread_Priority_update( &queue_context );
40006d70: 40 00 0e fd call 4000a964 <_Thread_Priority_update>
40006d74: 90 07 bf dc add %fp, -36, %o0
}
40006d78: 81 c7 e0 08 ret
40006d7c: 81 e8 00 00 restore
40007c88 <_POSIX_Timer_TSR>:
/*
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR( Watchdog_Control *the_watchdog )
{
40007c88: 9d e3 bf 98 save %sp, -104, %sp
<== NOT EXECUTED
POSIX_Timer_Control *ptimer;
ISR_lock_Context lock_context;
Per_CPU_Control *cpu;
ptimer = RTEMS_CONTAINER_OF( the_watchdog, POSIX_Timer_Control, Timer );
40007c8c: b0 06 3f f0 add %i0, -16, %i0
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007c90: 91 d0 20 09 ta 9
<== NOT EXECUTED
_ISR_lock_ISR_disable( &lock_context );
cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
40007c94: c4 06 20 74 ld [ %i0 + 0x74 ], %g2
40007c98: 84 00 a0 01 inc %g2
40007c9c: c4 26 20 74 st %g2, [ %i0 + 0x74 ]
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
40007ca0: c6 06 20 50 ld [ %i0 + 0x50 ], %g3
40007ca4: c4 06 20 54 ld [ %i0 + 0x54 ], %g2
40007ca8: 80 90 c0 02 orcc %g3, %g2, %g0
40007cac: 12 80 00 10 bne 40007cec <_POSIX_Timer_TSR+0x64>
40007cb0: 84 10 20 03 mov 3, %g2
40007cb4: c4 06 20 58 ld [ %i0 + 0x58 ], %g2
40007cb8: 80 a0 a0 00 cmp %g2, 0
40007cbc: 12 80 00 0b bne 40007ce8 <_POSIX_Timer_TSR+0x60>
<== ALWAYS TAKEN
40007cc0: 84 10 20 04 mov 4, %g2
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
_POSIX_Timer_Insert( ptimer, cpu, ptimer->ticks );
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
40007cc4: c4 2e 20 34 stb %g2, [ %i0 + 0x34 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007cc8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007ccc: 01 00 00 00 nop
<== NOT EXECUTED
/*
* The sending of the signal to the process running the handling function
* specified for that signal is simulated
*/
if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) {
40007cd0: d2 06 20 3c ld [ %i0 + 0x3c ], %o1
<== NOT EXECUTED
40007cd4: 40 00 22 1c call 40010544 <pthread_kill>
<== NOT EXECUTED
40007cd8: d0 06 20 30 ld [ %i0 + 0x30 ], %o0
<== NOT EXECUTED
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
40007cdc: c0 26 20 74 clr [ %i0 + 0x74 ]
<== NOT EXECUTED
}
40007ce0: 81 c7 e0 08 ret
<== NOT EXECUTED
40007ce4: 81 e8 00 00 restore
<== NOT EXECUTED
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
40007ce8: 84 10 20 03 mov 3, %g2
40007cec: c4 2e 20 34 stb %g2, [ %i0 + 0x34 ]
_Timecounter_Nanotime( tod );
40007cf0: 90 06 20 78 add %i0, 0x78, %o0
40007cf4: c2 27 bf fc st %g1, [ %fp + -4 ]
40007cf8: 40 00 0a c6 call 4000a810 <_Timecounter_Nanotime>
40007cfc: fa 06 20 70 ld [ %i0 + 0x70 ], %i5
cpu->Watchdog.ticks + ticks
40007d00: 11 10 00 68 sethi %hi(0x4001a000), %o0
40007d04: 90 12 20 80 or %o0, 0x80, %o0 ! 4001a080 <_Per_CPU_Information>
_Watchdog_Insert(
40007d08: d4 1a 20 30 ldd [ %o0 + 0x30 ], %o2
40007d0c: 86 82 c0 1d addcc %o3, %i5, %g3
40007d10: 84 42 a0 00 addx %o2, 0, %g2
40007d14: 96 10 00 03 mov %g3, %o3
40007d18: 94 10 00 02 mov %g2, %o2
40007d1c: 92 06 20 10 add %i0, 0x10, %o1
40007d20: 40 00 1b 71 call 4000eae4 <_Watchdog_Insert>
40007d24: 90 02 20 38 add %o0, 0x38, %o0
40007d28: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
40007d2c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007d30: 01 00 00 00 nop
if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) {
40007d34: d2 06 20 3c ld [ %i0 + 0x3c ], %o1
40007d38: 40 00 22 03 call 40010544 <pthread_kill>
40007d3c: d0 06 20 30 ld [ %i0 + 0x30 ], %o0
ptimer->overrun = 0;
40007d40: c0 26 20 74 clr [ %i0 + 0x74 ]
}
40007d44: 81 c7 e0 08 ret
40007d48: 81 e8 00 00 restore
4000ece0 <_POSIX_signals_Abnormal_termination_handler>:
sigset_t _POSIX_signals_Pending;
void _POSIX_signals_Abnormal_termination_handler(
int signo RTEMS_UNUSED )
{
4000ece0: 9d e3 bf a0 save %sp, -96, %sp
exit( 1 );
4000ece4: 40 00 05 2e call 4001019c <exit>
4000ece8: 90 10 20 01 mov 1, %o0
4000ecec: 01 00 00 00 nop
<== NOT EXECUTED
4000ec78 <_POSIX_signals_Clear_process_signals>:
_Assert( _ISR_Get_level() != 0 );
clear_signal = true;
mask = signo_to_mask( signo );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
4000ec78: 83 2a 20 01 sll %o0, 1, %g1
4000ec7c: 05 10 00 74 sethi %hi(0x4001d000), %g2
4000ec80: 82 00 40 08 add %g1, %o0, %g1
4000ec84: 84 10 a3 88 or %g2, 0x388, %g2
4000ec88: 83 28 60 02 sll %g1, 2, %g1
4000ec8c: c4 00 80 01 ld [ %g2 + %g1 ], %g2
4000ec90: 90 02 3f ff add %o0, -1, %o0
4000ec94: 80 a0 a0 02 cmp %g2, 2
4000ec98: 84 10 20 01 mov 1, %g2
4000ec9c: 02 80 00 07 be 4000ecb8 <_POSIX_signals_Clear_process_signals+0x40>
4000eca0: 91 28 80 08 sll %g2, %o0, %o0
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
4000eca4: 03 10 00 75 sethi %hi(0x4001d400), %g1
4000eca8: c4 00 61 14 ld [ %g1 + 0x114 ], %g2 ! 4001d514 <_POSIX_signals_Pending>
4000ecac: 90 28 80 08 andn %g2, %o0, %o0
}
}
4000ecb0: 81 c3 e0 08 retl
4000ecb4: d0 20 61 14 st %o0, [ %g1 + 0x114 ]
return _Chain_Immutable_head( the_chain )->next;
4000ecb8: 05 10 00 75 sethi %hi(0x4001d400), %g2
4000ecbc: 84 10 a1 18 or %g2, 0x118, %g2 ! 4001d518 <_POSIX_signals_Siginfo>
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
4000ecc0: c6 00 80 01 ld [ %g2 + %g1 ], %g3
return &the_chain->Tail.Node;
4000ecc4: 82 00 60 04 add %g1, 4, %g1
4000ecc8: 82 00 40 02 add %g1, %g2, %g1
4000eccc: 80 a0 c0 01 cmp %g3, %g1
4000ecd0: 02 bf ff f6 be 4000eca8 <_POSIX_signals_Clear_process_signals+0x30>
<== ALWAYS TAKEN
4000ecd4: 03 10 00 75 sethi %hi(0x4001d400), %g1
}
4000ecd8: 81 c3 e0 08 retl
<== NOT EXECUTED
4000ecdc: 01 00 00 00 nop
<== NOT EXECUTED
4000ffd0 <_POSIX_signals_Clear_signals>:
siginfo_t *info,
bool is_global,
bool check_blocked,
bool do_signals_acquire_release
)
{
4000ffd0: 9d e3 bf 98 save %sp, -104, %sp
4000ffd4: 84 10 20 01 mov 1, %g2
4000ffd8: 86 06 7f ff add %i1, -1, %g3
*/
if ( check_blocked )
signals_unblocked = api->signals_unblocked;
else
signals_unblocked = SIGNAL_ALL_MASK;
4000ffdc: 88 10 3f ff mov -1, %g4
if ( check_blocked )
4000ffe0: 80 a7 20 00 cmp %i4, 0
4000ffe4: 02 80 00 03 be 4000fff0 <_POSIX_signals_Clear_signals+0x20>
4000ffe8: 85 28 80 03 sll %g2, %g3, %g2
signals_unblocked = api->signals_unblocked;
4000ffec: c8 06 20 68 ld [ %i0 + 0x68 ], %g4
/* XXX is this right for siginfo type signals? */
/* XXX are we sure they can be cleared the same way? */
if ( do_signals_acquire_release ) {
4000fff0: 80 a7 60 00 cmp %i5, 0
4000fff4: 02 80 00 04 be 40010004 <_POSIX_signals_Clear_signals+0x34>
4000fff8: 80 a6 e0 00 cmp %i3, 0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000fffc: 91 d0 20 09 ta 9
<== NOT EXECUTED
_Thread_queue_Context_initialize( &queue_context );
_POSIX_signals_Acquire( &queue_context );
}
if ( is_global ) {
40010000: 80 a6 e0 00 cmp %i3, 0
40010004: 22 80 00 10 be,a 40010044 <_POSIX_signals_Clear_signals+0x74>
40010008: f8 06 20 6c ld [ %i0 + 0x6c ], %i4
if ( mask & (_POSIX_signals_Pending & signals_unblocked) ) {
4001000c: 07 10 00 75 sethi %hi(0x4001d400), %g3
40010010: c6 00 e1 14 ld [ %g3 + 0x114 ], %g3 ! 4001d514 <_POSIX_signals_Pending>
40010014: 84 08 80 03 and %g2, %g3, %g2
40010018: 80 88 80 04 btst %g2, %g4
4001001c: 12 80 00 12 bne 40010064 <_POSIX_signals_Clear_signals+0x94>
40010020: 86 10 20 00 clr %g3
api->signals_pending &= ~mask;
do_callout = true;
}
}
if ( do_signals_acquire_release ) {
40010024: 80 a7 60 00 cmp %i5, 0
40010028: 22 80 00 05 be,a 4001003c <_POSIX_signals_Clear_signals+0x6c>
4001002c: b0 08 e0 01 and %g3, 1, %i0
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40010030: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40010034: 01 00 00 00 nop
_POSIX_signals_Release( &queue_context );
}
return do_callout;
}
40010038: b0 08 e0 01 and %g3, 1, %i0
4001003c: 81 c7 e0 08 ret
40010040: 81 e8 00 00 restore
if ( mask & (api->signals_pending & signals_unblocked) ) {
40010044: b6 0f 00 02 and %i4, %g2, %i3
40010048: 80 8e c0 04 btst %i3, %g4
4001004c: 02 bf ff f6 be 40010024 <_POSIX_signals_Clear_signals+0x54>
40010050: 86 10 20 00 clr %g3
api->signals_pending &= ~mask;
40010054: 84 2f 00 02 andn %i4, %g2, %g2
do_callout = true;
40010058: 86 10 20 01 mov 1, %g3
api->signals_pending &= ~mask;
4001005c: 10 bf ff f2 b 40010024 <_POSIX_signals_Clear_signals+0x54>
40010060: c4 26 20 6c st %g2, [ %i0 + 0x6c ]
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
40010064: 85 2e 60 01 sll %i1, 1, %g2
40010068: 07 10 00 74 sethi %hi(0x4001d000), %g3
4001006c: 84 00 80 19 add %g2, %i1, %g2
40010070: 86 10 e3 88 or %g3, 0x388, %g3
40010074: 85 28 a0 02 sll %g2, 2, %g2
40010078: c6 00 c0 02 ld [ %g3 + %g2 ], %g3
4001007c: 80 a0 e0 02 cmp %g3, 2
40010080: 22 80 00 08 be,a 400100a0 <_POSIX_signals_Clear_signals+0xd0>
40010084: c2 27 bf fc st %g1, [ %fp + -4 ]
40010088: c2 27 bf fc st %g1, [ %fp + -4 ]
_POSIX_signals_Clear_process_signals( signo );
4001008c: 7f ff fa fb call 4000ec78 <_POSIX_signals_Clear_process_signals>
40010090: 90 10 00 19 mov %i1, %o0
do_callout = true;
40010094: 86 10 20 01 mov 1, %g3
40010098: 10 bf ff e3 b 40010024 <_POSIX_signals_Clear_signals+0x54>
4001009c: c2 07 bf fc ld [ %fp + -4 ], %g1
_Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
400100a0: 07 10 00 75 sethi %hi(0x4001d400), %g3
400100a4: 86 10 e1 18 or %g3, 0x118, %g3 ! 4001d518 <_POSIX_signals_Siginfo>
return _Chain_Immutable_head( the_chain )->next;
400100a8: f8 00 80 03 ld [ %g2 + %g3 ], %i4
return &the_chain->Tail.Node;
400100ac: 88 00 a0 04 add %g2, 4, %g4
400100b0: 88 01 00 03 add %g4, %g3, %g4
if ( !_Chain_Is_empty(the_chain))
400100b4: 80 a7 00 04 cmp %i4, %g4
400100b8: 02 80 00 17 be 40010114 <_POSIX_signals_Clear_signals+0x144>
400100bc: b6 00 80 03 add %g2, %g3, %i3
new_first = old_first->next;
400100c0: c8 07 00 00 ld [ %i4 ], %g4
head->next = new_first;
400100c4: c8 20 80 03 st %g4, [ %g2 + %g3 ]
_POSIX_signals_Clear_process_signals( signo );
400100c8: 90 10 00 19 mov %i1, %o0
400100cc: 7f ff fa eb call 4000ec78 <_POSIX_signals_Clear_process_signals>
400100d0: f6 21 20 04 st %i3, [ %g4 + 4 ]
*info = psiginfo->Info;
400100d4: c4 07 20 08 ld [ %i4 + 8 ], %g2
400100d8: c4 26 80 00 st %g2, [ %i2 ]
400100dc: c4 07 20 0c ld [ %i4 + 0xc ], %g2
400100e0: c4 26 a0 04 st %g2, [ %i2 + 4 ]
old_last = tail->previous;
400100e4: 05 10 00 75 sethi %hi(0x4001d400), %g2
400100e8: c6 07 20 10 ld [ %i4 + 0x10 ], %g3
400100ec: c6 26 a0 08 st %g3, [ %i2 + 8 ]
400100f0: 84 10 a1 08 or %g2, 0x108, %g2
400100f4: c6 00 a0 08 ld [ %g2 + 8 ], %g3
the_node->next = tail;
400100f8: 88 00 a0 04 add %g2, 4, %g4
400100fc: c8 27 00 00 st %g4, [ %i4 ]
tail->previous = the_node;
40010100: f8 20 a0 08 st %i4, [ %g2 + 8 ]
old_last->next = the_node;
40010104: f8 20 c0 00 st %i4, [ %g3 ]
the_node->previous = old_last;
40010108: c6 27 20 04 st %g3, [ %i4 + 4 ]
4001010c: 10 bf ff df b 40010088 <_POSIX_signals_Clear_signals+0xb8>
40010110: c2 07 bf fc ld [ %fp + -4 ], %g1
_POSIX_signals_Clear_process_signals( signo );
40010114: 7f ff fa d9 call 4000ec78 <_POSIX_signals_Clear_process_signals>
40010118: 90 10 00 19 mov %i1, %o0
4001011c: 10 bf ff db b 40010088 <_POSIX_signals_Clear_signals+0xb8>
40010120: c2 07 bf fc ld [ %fp + -4 ], %g1
40019aa0 <_POSIX_signals_Default_vectors>:
40019aa0: 00 00 00 00 ff ff ff ff 00 00 00 01 00 00 00 00 ................
40019ab0: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019ac0: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019ad0: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019ae0: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019af0: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019b00: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019b10: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019b20: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019b30: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019b40: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019b50: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019b60: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019b70: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019b80: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019b90: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019ba0: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019bb0: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019bc0: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019bd0: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019be0: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
40019bf0: 00 00 00 00 ff ff ff ff 40 00 ec e0 00 00 00 00 ........@.......
40019c00: ff ff ff ff 40 00 ec e0 00 00 00 00 ff ff ff ff ....@...........
40019c10: 40 00 ec e0 00 00 00 00 ff ff ff ff 40 00 ec e0 @...........@...
4000ee98 <_POSIX_signals_Send>:
int _POSIX_signals_Send(
pid_t pid,
int sig,
const union sigval *value
)
{
4000ee98: 9d e3 bf 88 save %sp, -120, %sp
Per_CPU_Control *cpu_self;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
4000ee9c: 7f ff d7 16 call 40004af4 <getpid>
4000eea0: 01 00 00 00 nop
4000eea4: 80 a2 00 18 cmp %o0, %i0
4000eea8: 12 80 00 e7 bne 4000f244 <_POSIX_signals_Send+0x3ac>
4000eeac: 80 a6 60 00 cmp %i1, 0
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
4000eeb0: 02 80 00 df be 4000f22c <_POSIX_signals_Send+0x394>
4000eeb4: b8 06 7f ff add %i1, -1, %i4
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
4000eeb8: 80 a7 20 1f cmp %i4, 0x1f
4000eebc: 18 80 00 dc bgu 4000f22c <_POSIX_signals_Send+0x394>
4000eec0: bb 2e 60 01 sll %i1, 1, %i5
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 )
4000eec4: 37 10 00 76 sethi %hi(0x4001d800), %i3
4000eec8: ba 07 40 19 add %i5, %i1, %i5
4000eecc: b6 16 e2 88 or %i3, 0x288, %i3
4000eed0: 83 2f 60 02 sll %i5, 2, %g1
4000eed4: 82 06 c0 01 add %i3, %g1, %g1
4000eed8: c2 00 60 08 ld [ %g1 + 8 ], %g1
4000eedc: 80 a0 60 01 cmp %g1, 1
4000eee0: 02 80 00 56 be 4000f038 <_POSIX_signals_Send+0x1a0>
4000eee4: b0 10 20 00 clr %i0
/*
* 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 ) )
4000eee8: 82 06 7f fc add %i1, -4, %g1
4000eeec: 80 88 7f fb btst -5, %g1
4000eef0: 02 80 00 46 be 4000f008 <_POSIX_signals_Send+0x170>
4000eef4: 80 a6 60 0b cmp %i1, 0xb
4000eef8: 02 80 00 44 be 4000f008 <_POSIX_signals_Send+0x170>
4000eefc: 82 10 20 01 mov 1, %g1
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
4000ef00: f2 27 bf f4 st %i1, [ %fp + -12 ]
4000ef04: b9 28 40 1c sll %g1, %i4, %i4
siginfo->si_code = SI_USER;
if ( !value ) {
4000ef08: 80 a6 a0 00 cmp %i2, 0
4000ef0c: 02 80 00 99 be 4000f170 <_POSIX_signals_Send+0x2d8>
4000ef10: c2 27 bf f8 st %g1, [ %fp + -8 ]
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
4000ef14: c2 06 80 00 ld [ %i2 ], %g1
4000ef18: c2 27 bf fc st %g1, [ %fp + -4 ]
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
4000ef1c: b4 10 00 06 mov %g6, %i2
disable_level = cpu_self->thread_dispatch_disable_level;
4000ef20: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
return cpu->executing;
4000ef24: d0 01 a0 20 ld [ %g6 + 0x20 ], %o0
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4000ef28: 82 00 60 01 inc %g1
* get it an execute it as soon as the dispatcher executes.
*/
the_thread = _Per_CPU_Get_executing( cpu_self );
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
4000ef2c: c4 02 21 5c ld [ %o0 + 0x15c ], %g2
4000ef30: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
4000ef34: c2 00 a0 68 ld [ %g2 + 0x68 ], %g1
4000ef38: 80 8f 00 01 btst %i4, %g1
4000ef3c: 12 80 00 1a bne 4000efa4 <_POSIX_signals_Send+0x10c>
4000ef40: 03 10 00 6f sethi %hi(0x4001bc00), %g1
* There is no requirement on the order of threads pending on a sigwait().
*/
/* XXX violation of visibility -- need to define thread queue support */
heads = _POSIX_signals_Wait_queue.Queue.heads;
4000ef44: c4 00 61 a4 ld [ %g1 + 0x1a4 ], %g2 ! 4001bda4 <_POSIX_signals_Wait_queue>
if ( heads != NULL ) {
4000ef48: 80 a0 a0 00 cmp %g2, 0
4000ef4c: 02 80 00 3d be 4000f040 <_POSIX_signals_Send+0x1a8>
4000ef50: 17 10 00 67 sethi %hi(0x40019c00), %o3
4000ef54: c2 00 80 00 ld [ %g2 ], %g1
return &the_chain->Tail.Node;
4000ef58: 84 00 a0 04 add %g2, 4, %g2
Chain_Control *the_chain = &heads->Heads.Fifo;
for ( the_node = _Chain_First( the_chain );
4000ef5c: 80 a0 40 02 cmp %g1, %g2
4000ef60: 32 80 00 0d bne,a 4000ef94 <_POSIX_signals_Send+0xfc>
<== ALWAYS TAKEN
4000ef64: d0 00 7f f8 ld [ %g1 + -8 ], %o0
4000ef68: 10 80 00 37 b 4000f044 <_POSIX_signals_Send+0x1ac>
<== NOT EXECUTED
4000ef6c: 9e 10 3f ff mov -1, %o7
<== NOT EXECUTED
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (api->signals_unblocked & mask)
4000ef70: c6 01 20 68 ld [ %g4 + 0x68 ], %g3
4000ef74: 80 8f 00 03 btst %i4, %g3
4000ef78: 12 80 00 0c bne 4000efa8 <_POSIX_signals_Send+0x110>
4000ef7c: 94 07 bf f4 add %fp, -12, %o2
the_node = the_node->next ) {
4000ef80: c2 00 40 00 ld [ %g1 ], %g1
for ( the_node = _Chain_First( the_chain );
4000ef84: 80 a0 40 02 cmp %g1, %g2
4000ef88: 02 80 00 2e be 4000f040 <_POSIX_signals_Send+0x1a8>
<== ALWAYS TAKEN
4000ef8c: 17 10 00 67 sethi %hi(0x40019c00), %o3
4000ef90: d0 00 7f f8 ld [ %g1 + -8 ], %o0
<== NOT EXECUTED
if (the_thread->Wait.option & mask)
4000ef94: c6 02 20 48 ld [ %o0 + 0x48 ], %g3
4000ef98: 80 8f 00 03 btst %i4, %g3
4000ef9c: 02 bf ff f5 be 4000ef70 <_POSIX_signals_Send+0xd8>
4000efa0: c8 02 21 5c ld [ %o0 + 0x15c ], %g4
/*
* 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 ) ) {
4000efa4: 94 07 bf f4 add %fp, -12, %o2
4000efa8: 40 00 01 cf call 4000f6e4 <_POSIX_signals_Unblock_thread>
4000efac: 92 10 00 19 mov %i1, %o1
4000efb0: 80 a2 20 00 cmp %o0, 0
4000efb4: 12 80 00 1b bne 4000f020 <_POSIX_signals_Send+0x188>
4000efb8: 01 00 00 00 nop
/*
* 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 );
4000efbc: 40 00 01 5f call 4000f538 <_POSIX_signals_Set_process_signals>
4000efc0: 90 10 00 1c mov %i4, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000efc4: 91 d0 20 09 ta 9
<== NOT EXECUTED
return psr;
4000efc8: 86 10 00 01 mov %g1, %g3
_Thread_queue_Context_initialize( &queue_context );
_POSIX_signals_Acquire( &queue_context );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
4000efcc: bb 2f 60 02 sll %i5, 2, %i5
4000efd0: c4 06 c0 1d ld [ %i3 + %i5 ], %g2
4000efd4: 80 a0 a0 02 cmp %g2, 2
4000efd8: 02 80 00 6c be 4000f188 <_POSIX_signals_Send+0x2f0>
4000efdc: 09 10 00 77 sethi %hi(0x4001dc00), %g4
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000efe0: 82 10 00 03 mov %g3, %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000efe4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000efe8: 01 00 00 00 nop
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
4000efec: c2 06 a0 18 ld [ %i2 + 0x18 ], %g1
if ( disable_level == 1 ) {
4000eff0: 80 a0 60 01 cmp %g1, 1
4000eff4: 02 80 00 7f be 4000f1f0 <_POSIX_signals_Send+0x358>
4000eff8: 82 00 7f ff add %g1, -1, %g1
cpu_self->thread_dispatch_disable_level = disable_level - 1;
4000effc: c2 26 a0 18 st %g1, [ %i2 + 0x18 ]
_POSIX_signals_Release( &queue_context );
DEBUG_STEP("\n");
_Thread_Dispatch_enable( cpu_self );
return 0;
}
4000f000: 81 c7 e0 08 ret
4000f004: 91 e8 20 00 restore %g0, 0, %o0
return pthread_kill( pthread_self(), sig );
4000f008: 7f ff e0 5e call 40007180 <pthread_self>
4000f00c: 01 00 00 00 nop
4000f010: 7f ff df 9c call 40006e80 <pthread_kill>
4000f014: 92 10 00 19 mov %i1, %o1
4000f018: 81 c7 e0 08 ret
4000f01c: 91 e8 00 08 restore %g0, %o0, %o0
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
4000f020: c2 06 a0 18 ld [ %i2 + 0x18 ], %g1
if ( disable_level == 1 ) {
4000f024: 80 a0 60 01 cmp %g1, 1
4000f028: 02 80 00 72 be 4000f1f0 <_POSIX_signals_Send+0x358>
<== ALWAYS TAKEN
4000f02c: 82 00 7f ff add %g1, -1, %g1
return 0;
4000f030: b0 10 20 00 clr %i0
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level - 1;
4000f034: c2 26 a0 18 st %g1, [ %i2 + 0x18 ]
<== NOT EXECUTED
4000f038: 81 c7 e0 08 ret
4000f03c: 81 e8 00 00 restore
for ( the_node = _Chain_First( the_chain );
4000f040: 9e 10 3f ff mov -1, %o7
4000f044: 94 10 3f ff mov -1, %o2
4000f048: 90 10 20 00 clr %o0
4000f04c: 98 10 20 02 mov 2, %o4
*/
RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal (
States_Control the_states
)
{
return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL);
4000f050: 13 04 00 00 sethi %hi(0x10000000), %o1
4000f054: 96 12 e2 90 or %o3, 0x290, %o3
if ( !_Objects_Information_table[ the_api ] )
4000f058: 83 2b 20 02 sll %o4, 2, %g1
4000f05c: c2 02 c0 01 ld [ %o3 + %g1 ], %g1
4000f060: 80 a0 60 00 cmp %g1, 0
4000f064: 02 80 00 39 be 4000f148 <_POSIX_signals_Send+0x2b0>
<== NEVER TAKEN
4000f068: 80 a3 20 03 cmp %o4, 3
the_info = _Objects_Information_table[ the_api ][ 1 ];
4000f06c: c2 00 60 04 ld [ %g1 + 4 ], %g1
if ( !the_info )
4000f070: 80 a0 60 00 cmp %g1, 0
4000f074: 02 80 00 35 be 4000f148 <_POSIX_signals_Send+0x2b0>
<== NEVER TAKEN
4000f078: 80 a3 20 03 cmp %o4, 3
maximum = the_info->maximum;
4000f07c: f0 10 60 10 lduh [ %g1 + 0x10 ], %i0
for ( index = 1 ; index <= maximum ; index++ ) {
4000f080: 80 a6 20 00 cmp %i0, 0
4000f084: 02 80 00 30 be 4000f144 <_POSIX_signals_Send+0x2ac>
4000f088: c2 00 60 1c ld [ %g1 + 0x1c ], %g1
4000f08c: 82 00 60 04 add %g1, 4, %g1
4000f090: b1 2e 20 02 sll %i0, 2, %i0
4000f094: b0 06 00 01 add %i0, %g1, %i0
the_thread = (Thread_Control *) object_table[ index ];
4000f098: c4 00 40 00 ld [ %g1 ], %g2
if ( !the_thread )
4000f09c: 80 a0 a0 00 cmp %g2, 0
4000f0a0: 22 80 00 26 be,a 4000f138 <_POSIX_signals_Send+0x2a0>
4000f0a4: 82 00 60 04 add %g1, 4, %g1
4000f0a8: c6 00 a0 38 ld [ %g2 + 0x38 ], %g3
4000f0ac: c8 00 e0 18 ld [ %g3 + 0x18 ], %g4
if ( _Thread_Get_priority( the_thread ) > interested_priority )
4000f0b0: 80 a1 00 0f cmp %g4, %o7
4000f0b4: 18 80 00 20 bgu 4000f134 <_POSIX_signals_Send+0x29c>
<== NEVER TAKEN
4000f0b8: c6 00 e0 1c ld [ %g3 + 0x1c ], %g3
4000f0bc: 02 80 00 29 be 4000f160 <_POSIX_signals_Send+0x2c8>
4000f0c0: 80 a0 c0 0a cmp %g3, %o2
if ( !_POSIX_signals_Is_interested( api, mask ) )
4000f0c4: da 00 a1 5c ld [ %g2 + 0x15c ], %o5
4000f0c8: da 03 60 68 ld [ %o5 + 0x68 ], %o5
4000f0cc: 80 8f 00 0d btst %i4, %o5
4000f0d0: 02 80 00 19 be 4000f134 <_POSIX_signals_Send+0x29c>
4000f0d4: 80 a3 c0 04 cmp %o7, %g4
if ( _Thread_Get_priority( the_thread ) < interested_priority ) {
4000f0d8: 38 80 00 15 bgu,a 4000f12c <_POSIX_signals_Send+0x294>
4000f0dc: 9e 10 00 04 mov %g4, %o7
4000f0e0: 02 80 00 26 be 4000f178 <_POSIX_signals_Send+0x2e0>
<== ALWAYS TAKEN
4000f0e4: 80 a2 80 03 cmp %o2, %g3
if ( interested && !_States_Is_ready( interested->current_state ) ) {
4000f0e8: 80 a2 20 00 cmp %o0, 0
<== NOT EXECUTED
4000f0ec: 22 80 00 13 be,a 4000f138 <_POSIX_signals_Send+0x2a0>
<== NEVER TAKEN
4000f0f0: 82 00 60 04 add %g1, 4, %g1
<== NOT EXECUTED
4000f0f4: da 02 20 1c ld [ %o0 + 0x1c ], %o5
4000f0f8: 80 a3 60 00 cmp %o5, 0
4000f0fc: 22 80 00 0f be,a 4000f138 <_POSIX_signals_Send+0x2a0>
4000f100: 82 00 60 04 add %g1, 4, %g1
if ( _States_Is_ready( the_thread->current_state ) ) {
4000f104: e0 00 a0 1c ld [ %g2 + 0x1c ], %l0
4000f108: 80 a4 20 00 cmp %l0, 0
4000f10c: 02 80 00 07 be 4000f128 <_POSIX_signals_Send+0x290>
4000f110: 80 8b 40 09 btst %o5, %o1
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
4000f114: 32 80 00 09 bne,a 4000f138 <_POSIX_signals_Send+0x2a0>
4000f118: 82 00 60 04 add %g1, 4, %g1
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
4000f11c: 80 8c 00 09 btst %l0, %o1
4000f120: 22 80 00 06 be,a 4000f138 <_POSIX_signals_Send+0x2a0>
4000f124: 82 00 60 04 add %g1, 4, %g1
4000f128: 9e 10 00 04 mov %g4, %o7
4000f12c: 94 10 00 03 mov %g3, %o2
4000f130: 90 10 00 02 mov %g2, %o0
4000f134: 82 00 60 04 add %g1, 4, %g1
for ( index = 1 ; index <= maximum ; index++ ) {
4000f138: 80 a6 00 01 cmp %i0, %g1
4000f13c: 32 bf ff d8 bne,a 4000f09c <_POSIX_signals_Send+0x204>
4000f140: c4 00 40 00 ld [ %g1 ], %g2
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
4000f144: 80 a3 20 03 cmp %o4, 3
4000f148: 12 bf ff c4 bne 4000f058 <_POSIX_signals_Send+0x1c0>
4000f14c: 98 10 20 03 mov 3, %o4
if ( interested ) {
4000f150: 80 a2 20 00 cmp %o0, 0
4000f154: 12 bf ff 95 bne 4000efa8 <_POSIX_signals_Send+0x110>
4000f158: 94 07 bf f4 add %fp, -12, %o2
4000f15c: 30 bf ff 98 b,a 4000efbc <_POSIX_signals_Send+0x124>
if ( _Thread_Get_priority( the_thread ) > interested_priority )
4000f160: 28 bf ff da bleu,a 4000f0c8 <_POSIX_signals_Send+0x230>
4000f164: da 00 a1 5c ld [ %g2 + 0x15c ], %o5
4000f168: 10 bf ff f4 b 4000f138 <_POSIX_signals_Send+0x2a0>
4000f16c: 82 00 60 04 add %g1, 4, %g1
4000f170: 10 bf ff 6b b 4000ef1c <_POSIX_signals_Send+0x84>
4000f174: c0 27 bf fc clr [ %fp + -4 ]
if ( _Thread_Get_priority( the_thread ) < interested_priority ) {
4000f178: 08 bf ff dd bleu 4000f0ec <_POSIX_signals_Send+0x254>
4000f17c: 80 a2 20 00 cmp %o0, 0
4000f180: 10 bf ff eb b 4000f12c <_POSIX_signals_Send+0x294>
4000f184: 9e 10 00 04 mov %g4, %o7
return _Chain_Immutable_head( the_chain )->next;
4000f188: c4 01 20 08 ld [ %g4 + 8 ], %g2
4000f18c: b8 11 20 08 or %g4, 8, %i4
if ( !_Chain_Is_empty(the_chain))
4000f190: b6 07 20 04 add %i4, 4, %i3
4000f194: 80 a0 80 1b cmp %g2, %i3
4000f198: 02 80 00 31 be 4000f25c <_POSIX_signals_Send+0x3c4>
4000f19c: 01 00 00 00 nop
new_first = old_first->next;
4000f1a0: c2 00 80 00 ld [ %g2 ], %g1
new_first->previous = head;
4000f1a4: f8 20 60 04 st %i4, [ %g1 + 4 ]
psiginfo->Info = *siginfo;
4000f1a8: f6 07 bf fc ld [ %fp + -4 ], %i3
4000f1ac: f2 07 bf f8 ld [ %fp + -8 ], %i1
head->next = new_first;
4000f1b0: c2 21 20 08 st %g1, [ %g4 + 8 ]
_Chain_Append_unprotected(
4000f1b4: 03 10 00 77 sethi %hi(0x4001dc00), %g1
psiginfo->Info = *siginfo;
4000f1b8: c8 07 bf f4 ld [ %fp + -12 ], %g4
4000f1bc: c8 20 a0 08 st %g4, [ %g2 + 8 ]
_Chain_Append_unprotected(
4000f1c0: 82 10 60 18 or %g1, 0x18, %g1
psiginfo->Info = *siginfo;
4000f1c4: f2 20 a0 0c st %i1, [ %g2 + 0xc ]
_Chain_Append_unprotected(
4000f1c8: b8 07 40 01 add %i5, %g1, %i4
return &the_chain->Tail.Node;
4000f1cc: ba 07 60 04 add %i5, 4, %i5
old_last = tail->previous;
4000f1d0: c8 07 20 08 ld [ %i4 + 8 ], %g4
return &the_chain->Tail.Node;
4000f1d4: ba 07 40 01 add %i5, %g1, %i5
psiginfo->Info = *siginfo;
4000f1d8: f6 20 a0 10 st %i3, [ %g2 + 0x10 ]
the_node->next = tail;
4000f1dc: fa 20 80 00 st %i5, [ %g2 ]
tail->previous = the_node;
4000f1e0: c4 27 20 08 st %g2, [ %i4 + 8 ]
old_last->next = the_node;
4000f1e4: c4 21 00 00 st %g2, [ %g4 ]
the_node->previous = old_last;
4000f1e8: 10 bf ff 7e b 4000efe0 <_POSIX_signals_Send+0x148>
4000f1ec: c8 20 a0 04 st %g4, [ %g2 + 4 ]
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000f1f0: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
4000f1f4: c4 0e a0 1c ldub [ %i2 + 0x1c ], %g2
4000f1f8: 80 a0 a0 00 cmp %g2, 0
4000f1fc: 12 80 00 07 bne 4000f218 <_POSIX_signals_Send+0x380>
4000f200: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
4000f204: c0 26 a0 18 clr [ %i2 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000f208: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000f20c: 01 00 00 00 nop
return 0;
4000f210: 81 c7 e0 08 ret
4000f214: 91 e8 20 00 restore %g0, 0, %o0
_Thread_Do_dispatch( cpu_self, level );
4000f218: c2 27 bf ec st %g1, [ %fp + -20 ]
4000f21c: 7f ff f0 c8 call 4000b53c <_Thread_Do_dispatch>
4000f220: 90 10 00 1a mov %i2, %o0
4000f224: 10 bf ff f9 b 4000f208 <_POSIX_signals_Send+0x370>
4000f228: c2 07 bf ec ld [ %fp + -20 ], %g1
rtems_set_errno_and_return_minus_one( EINVAL );
4000f22c: 40 00 05 68 call 400107cc <__errno>
4000f230: b0 10 3f ff mov -1, %i0
4000f234: 82 10 20 16 mov 0x16, %g1
4000f238: c2 22 00 00 st %g1, [ %o0 ]
4000f23c: 81 c7 e0 08 ret
4000f240: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( ESRCH );
4000f244: 40 00 05 62 call 400107cc <__errno>
4000f248: b0 10 3f ff mov -1, %i0
4000f24c: 82 10 20 03 mov 3, %g1
4000f250: c2 22 00 00 st %g1, [ %o0 ]
4000f254: 81 c7 e0 08 ret
4000f258: 81 e8 00 00 restore
4000f25c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000f260: 01 00 00 00 nop
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
4000f264: c2 06 a0 18 ld [ %i2 + 0x18 ], %g1
if ( disable_level == 1 ) {
4000f268: 80 a0 60 01 cmp %g1, 1
4000f26c: 02 80 00 09 be 4000f290 <_POSIX_signals_Send+0x3f8>
<== ALWAYS TAKEN
4000f270: 82 00 7f ff add %g1, -1, %g1
cpu_self->thread_dispatch_disable_level = disable_level - 1;
4000f274: c2 26 a0 18 st %g1, [ %i2 + 0x18 ]
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EAGAIN );
4000f278: 40 00 05 55 call 400107cc <__errno>
4000f27c: b0 10 3f ff mov -1, %i0
4000f280: 82 10 20 0b mov 0xb, %g1
4000f284: c2 22 00 00 st %g1, [ %o0 ]
4000f288: 81 c7 e0 08 ret
4000f28c: 81 e8 00 00 restore
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000f290: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
4000f294: c4 0e a0 1c ldub [ %i2 + 0x1c ], %g2
4000f298: 80 a0 a0 00 cmp %g2, 0
4000f29c: 12 80 00 06 bne 4000f2b4 <_POSIX_signals_Send+0x41c>
<== ALWAYS TAKEN
4000f2a0: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
4000f2a4: c0 26 a0 18 clr [ %i2 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000f2a8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000f2ac: 01 00 00 00 nop
4000f2b0: 30 bf ff f2 b,a 4000f278 <_POSIX_signals_Send+0x3e0>
_Thread_Do_dispatch( cpu_self, level );
4000f2b4: c2 27 bf ec st %g1, [ %fp + -20 ]
4000f2b8: 7f ff f0 a1 call 4000b53c <_Thread_Do_dispatch>
4000f2bc: 90 10 00 1a mov %i2, %o0
4000f2c0: 10 bf ff fa b 4000f2a8 <_POSIX_signals_Send+0x410>
4000f2c4: c2 07 bf ec ld [ %fp + -20 ], %g1
4000f538 <_POSIX_signals_Set_process_signals>:
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000f538: 91 d0 20 09 ta 9
<== NOT EXECUTED
{
Thread_queue_Context queue_context;
_Thread_queue_Context_initialize( &queue_context );
_POSIX_signals_Acquire( &queue_context );
_POSIX_signals_Pending |= mask;
4000f53c: 07 10 00 77 sethi %hi(0x4001dc00), %g3
<== NOT EXECUTED
4000f540: c4 00 e0 14 ld [ %g3 + 0x14 ], %g2 ! 4001dc14 <_POSIX_signals_Pending>
<== NOT EXECUTED
4000f544: 90 10 80 08 or %g2, %o0, %o0
<== NOT EXECUTED
4000f548: d0 20 e0 14 st %o0, [ %g3 + 0x14 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000f54c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000f550: 01 00 00 00 nop
_POSIX_signals_Release( &queue_context );
}
4000f554: 81 c3 e0 08 retl
4000f558: 01 00 00 00 nop
4000ef1c <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
4000ef1c: 9d e3 bf a0 save %sp, -96, %sp
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4000ef20: fa 06 21 5c ld [ %i0 + 0x15c ], %i5
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
4000ef24: c6 06 20 1c ld [ %i0 + 0x1c ], %g3
4000ef28: 05 04 00 01 sethi %hi(0x10000400), %g2
4000ef2c: 88 10 20 01 mov 1, %g4
4000ef30: 82 06 7f ff add %i1, -1, %g1
4000ef34: b8 08 c0 02 and %g3, %g2, %i4
4000ef38: 83 29 00 01 sll %g4, %g1, %g1
4000ef3c: 80 a7 00 02 cmp %i4, %g2
4000ef40: 02 80 00 19 be 4000efa4 <_POSIX_signals_Unblock_thread+0x88>
4000ef44: b6 07 60 70 add %i5, 0x70, %i3
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( api->signals_unblocked & mask ) {
4000ef48: c4 07 60 68 ld [ %i5 + 0x68 ], %g2
4000ef4c: 80 88 40 02 btst %g1, %g2
4000ef50: 02 80 00 05 be 4000ef64 <_POSIX_signals_Unblock_thread+0x48>
4000ef54: 03 04 00 00 sethi %hi(0x10000000), %g1
* 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 ) ) {
4000ef58: 80 88 c0 01 btst %g3, %g1
4000ef5c: 12 80 00 4b bne 4000f088 <_POSIX_signals_Unblock_thread+0x16c>
4000ef60: 82 10 24 0d mov 0x40d, %g1
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000ef64: 91 d0 20 09 ta 9
<== NOT EXECUTED
action->handler = handler;
4000ef68: 05 10 00 3b sethi %hi(0x4000ec00), %g2
4000ef6c: 84 10 a2 30 or %g2, 0x230, %g2 ! 4000ee30 <_POSIX_signals_Action_handler>
4000ef70: c4 27 60 78 st %g2, [ %i5 + 0x78 ]
cpu_self->dispatch_necessary = true;
4000ef74: 86 10 20 01 mov 1, %g3
4000ef78: c6 29 a0 1c stb %g3, [ %g6 + 0x1c ]
if ( _Chain_Is_node_off_chain( the_node ) ) {
4000ef7c: c4 07 60 70 ld [ %i5 + 0x70 ], %g2
4000ef80: 80 a0 a0 00 cmp %g2, 0
4000ef84: 22 80 00 1a be,a 4000efec <_POSIX_signals_Unblock_thread+0xd0>
4000ef88: c4 06 20 e8 ld [ %i0 + 0xe8 ], %g2
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000ef8c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000ef90: 01 00 00 00 nop
the_thread->Wait.return_code = STATUS_INTERRUPTED;
_Thread_queue_Extract_with_proxy( the_thread );
}
}
return _POSIX_signals_Unblock_thread_done( the_thread, api, false );
4000ef94: b0 10 20 00 clr %i0 ! 0 <PROM_START>
}
4000ef98: b0 0e 20 01 and %i0, 1, %i0
4000ef9c: 81 c7 e0 08 ret
4000efa0: 81 e8 00 00 restore
if ( (the_thread->Wait.option & mask) || (api->signals_unblocked & mask) ) {
4000efa4: c4 06 20 48 ld [ %i0 + 0x48 ], %g2
4000efa8: 80 88 40 02 btst %g1, %g2
4000efac: 32 80 00 16 bne,a 4000f004 <_POSIX_signals_Unblock_thread+0xe8>
4000efb0: 82 10 24 0d mov 0x40d, %g1
4000efb4: c4 07 60 68 ld [ %i5 + 0x68 ], %g2
4000efb8: 80 88 40 02 btst %g1, %g2
4000efbc: 12 80 00 12 bne 4000f004 <_POSIX_signals_Unblock_thread+0xe8>
4000efc0: 82 10 24 0d mov 0x40d, %g1
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000efc4: 91 d0 20 09 ta 9
<== NOT EXECUTED
4000efc8: 05 10 00 3b sethi %hi(0x4000ec00), %g2
4000efcc: 84 10 a2 30 or %g2, 0x230, %g2 ! 4000ee30 <_POSIX_signals_Action_handler>
4000efd0: c4 27 60 78 st %g2, [ %i5 + 0x78 ]
4000efd4: c8 29 a0 1c stb %g4, [ %g6 + 0x1c ]
4000efd8: c4 07 60 70 ld [ %i5 + 0x70 ], %g2
4000efdc: 80 a0 a0 00 cmp %g2, 0
4000efe0: 12 bf ff eb bne 4000ef8c <_POSIX_signals_Unblock_thread+0x70>
<== NEVER TAKEN
4000efe4: 01 00 00 00 nop
old_last = tail->previous;
4000efe8: c4 06 20 e8 ld [ %i0 + 0xe8 ], %g2
return &the_chain->Tail.Node;
4000efec: 86 06 20 e4 add %i0, 0xe4, %g3
the_node->next = tail;
4000eff0: c6 27 60 70 st %g3, [ %i5 + 0x70 ]
tail->previous = the_node;
4000eff4: f6 26 20 e8 st %i3, [ %i0 + 0xe8 ]
old_last->next = the_node;
4000eff8: f6 20 80 00 st %i3, [ %g2 ]
the_node->previous = old_last;
4000effc: 10 bf ff e4 b 4000ef8c <_POSIX_signals_Unblock_thread+0x70>
4000f000: c4 27 60 74 st %g2, [ %i5 + 0x74 ]
the_thread->Wait.return_code = STATUS_INTERRUPTED;
4000f004: c2 26 20 4c st %g1, [ %i0 + 0x4c ]
if ( !info ) {
4000f008: 80 a6 a0 00 cmp %i2, 0
4000f00c: 02 80 00 2e be 4000f0c4 <_POSIX_signals_Unblock_thread+0x1a8>
4000f010: c2 06 20 40 ld [ %i0 + 0x40 ], %g1
*the_info = *info;
4000f014: c4 06 80 00 ld [ %i2 ], %g2
4000f018: c4 20 40 00 st %g2, [ %g1 ]
4000f01c: c4 06 a0 04 ld [ %i2 + 4 ], %g2
4000f020: c4 20 60 04 st %g2, [ %g1 + 4 ]
4000f024: c4 06 a0 08 ld [ %i2 + 8 ], %g2
4000f028: c4 20 60 08 st %g2, [ %g1 + 8 ]
_Thread_queue_Extract_with_proxy( the_thread );
4000f02c: 40 00 02 f9 call 4000fc10 <_Thread_queue_Extract_with_proxy>
4000f030: 90 10 00 18 mov %i0, %o0
4000f034: 91 d0 20 09 ta 9
<== NOT EXECUTED
4000f038: 05 10 00 3b sethi %hi(0x4000ec00), %g2
4000f03c: 84 10 a2 30 or %g2, 0x230, %g2 ! 4000ee30 <_POSIX_signals_Action_handler>
4000f040: c4 27 60 78 st %g2, [ %i5 + 0x78 ]
4000f044: 86 10 20 01 mov 1, %g3
4000f048: c6 29 a0 1c stb %g3, [ %g6 + 0x1c ]
if ( _Chain_Is_node_off_chain( the_node ) ) {
4000f04c: c4 07 60 70 ld [ %i5 + 0x70 ], %g2
4000f050: 80 a0 a0 00 cmp %g2, 0
4000f054: 12 80 00 07 bne 4000f070 <_POSIX_signals_Unblock_thread+0x154>
<== NEVER TAKEN
4000f058: 86 06 20 e4 add %i0, 0xe4, %g3
<== NOT EXECUTED
old_last = tail->previous;
4000f05c: c4 06 20 e8 ld [ %i0 + 0xe8 ], %g2
<== NOT EXECUTED
the_node->next = tail;
4000f060: c6 27 60 70 st %g3, [ %i5 + 0x70 ]
<== NOT EXECUTED
tail->previous = the_node;
4000f064: f6 26 20 e8 st %i3, [ %i0 + 0xe8 ]
<== NOT EXECUTED
old_last->next = the_node;
4000f068: f6 20 80 00 st %i3, [ %g2 ]
<== NOT EXECUTED
the_node->previous = old_last;
4000f06c: c4 27 60 74 st %g2, [ %i5 + 0x74 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000f070: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000f074: 01 00 00 00 nop
return _POSIX_signals_Unblock_thread_done( the_thread, api, true );
4000f078: b0 10 20 01 mov 1, %i0 ! 1 <_TLS_Alignment>
}
4000f07c: b0 0e 20 01 and %i0, 1, %i0
4000f080: 81 c7 e0 08 ret
4000f084: 81 e8 00 00 restore
the_thread->Wait.return_code = STATUS_INTERRUPTED;
4000f088: c2 26 20 4c st %g1, [ %i0 + 0x4c ]
_Thread_queue_Extract_with_proxy( the_thread );
4000f08c: 40 00 02 e1 call 4000fc10 <_Thread_queue_Extract_with_proxy>
4000f090: 90 10 00 18 mov %i0, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000f094: 91 d0 20 09 ta 9
<== NOT EXECUTED
4000f098: 05 10 00 3b sethi %hi(0x4000ec00), %g2
4000f09c: 84 10 a2 30 or %g2, 0x230, %g2 ! 4000ee30 <_POSIX_signals_Action_handler>
4000f0a0: c4 27 60 78 st %g2, [ %i5 + 0x78 ]
4000f0a4: 86 10 20 01 mov 1, %g3
4000f0a8: c6 29 a0 1c stb %g3, [ %g6 + 0x1c ]
if ( _Chain_Is_node_off_chain( the_node ) ) {
4000f0ac: c4 07 60 70 ld [ %i5 + 0x70 ], %g2
4000f0b0: 80 a0 a0 00 cmp %g2, 0
4000f0b4: 12 bf ff b6 bne 4000ef8c <_POSIX_signals_Unblock_thread+0x70>
<== NEVER TAKEN
4000f0b8: 01 00 00 00 nop
old_last = tail->previous;
4000f0bc: 10 bf ff cc b 4000efec <_POSIX_signals_Unblock_thread+0xd0>
4000f0c0: c4 06 20 e8 ld [ %i0 + 0xe8 ], %g2
the_info->si_code = SI_USER;
4000f0c4: 84 10 20 01 mov 1, %g2
the_info->si_signo = signo;
4000f0c8: f2 20 40 00 st %i1, [ %g1 ]
the_info->si_code = SI_USER;
4000f0cc: c4 20 60 04 st %g2, [ %g1 + 4 ]
4000f0d0: 10 bf ff d7 b 4000f02c <_POSIX_signals_Unblock_thread+0x110>
4000f0d4: c0 20 60 08 clr [ %g1 + 8 ]
40006600 <_pthread_cleanup_pop>:
{
40006600: 9d e3 bf a0 save %sp, -96, %sp
if ( execute != 0 ) {
40006604: 80 a6 60 00 cmp %i1, 0
40006608: 02 80 00 05 be 4000661c <_pthread_cleanup_pop+0x1c>
4000660c: 01 00 00 00 nop
( *context->_routine )( context->_arg );
40006610: c2 06 00 00 ld [ %i0 ], %g1
40006614: 9f c0 40 00 call %g1
40006618: d0 06 20 04 ld [ %i0 + 4 ], %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000661c: 91 d0 20 09 ta 9
<== NOT EXECUTED
executing->last_cleanup_context = context->_previous;
40006620: c4 01 a0 20 ld [ %g6 + 0x20 ], %g2
<== NOT EXECUTED
40006624: c6 06 20 0c ld [ %i0 + 0xc ], %g3
<== NOT EXECUTED
40006628: c6 20 a1 84 st %g3, [ %g2 + 0x184 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000662c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006630: 01 00 00 00 nop
}
40006634: 81 c7 e0 08 ret
40006638: 81 e8 00 00 restore
400072f0 <_pthread_cleanup_push>:
context->_canceltype = -1;
400072f0: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
context->_routine = routine;
400072f4: d2 22 00 00 st %o1, [ %o0 ]
<== NOT EXECUTED
context->_arg = arg;
400072f8: d4 22 20 04 st %o2, [ %o0 + 4 ]
<== NOT EXECUTED
context->_canceltype = -1;
400072fc: c2 22 20 08 st %g1, [ %o0 + 8 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007300: 91 d0 20 09 ta 9
<== NOT EXECUTED
executing = _Thread_Executing;
40007304: c4 01 a0 20 ld [ %g6 + 0x20 ], %g2
<== NOT EXECUTED
context->_previous = executing->last_cleanup_context;
40007308: c6 00 a1 84 ld [ %g2 + 0x184 ], %g3
<== NOT EXECUTED
4000730c: c6 22 20 0c st %g3, [ %o0 + 0xc ]
<== NOT EXECUTED
executing->last_cleanup_context = context;
40007310: d0 20 a1 84 st %o0, [ %g2 + 0x184 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007314: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007318: 01 00 00 00 nop
}
4000731c: 81 c3 e0 08 retl
40007320: 01 00 00 00 nop
400066e4 <aio_cancel>:
#include <stdlib.h>
#include <rtems/system.h>
#include <rtems/seterr.h>
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
400066e4: 9d e3 bf a0 save %sp, -96, %sp
rtems_chain_control *idle_req_chain = &aio_request_queue.idle_req;
rtems_chain_control *work_req_chain = &aio_request_queue.work_req;
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
400066e8: 3b 10 00 59 sethi %hi(0x40016400), %i5
400066ec: 40 00 05 10 call 40007b2c <pthread_mutex_lock>
400066f0: 90 17 60 68 or %i5, 0x68, %o0 ! 40016468 <aio_request_queue>
if (fcntl (fildes, F_GETFD) < 0) {
400066f4: 92 10 20 01 mov 1, %o1
400066f8: 40 00 25 b4 call 4000fdc8 <fcntl>
400066fc: 90 10 00 18 mov %i0, %o0
40006700: 80 a2 20 00 cmp %o0, 0
40006704: 06 80 00 6b bl 400068b0 <aio_cancel+0x1cc>
40006708: 80 a6 60 00 cmp %i1, 0
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) {
4000670c: 02 80 00 2d be 400067c0 <aio_cancel+0xdc>
40006710: 94 10 20 00 clr %o2
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
} else {
AIO_printf ("Cancel request\n");
if (aiocbp->aio_fildes != fildes) {
40006714: f8 06 40 00 ld [ %i1 ], %i4
40006718: 80 a7 00 18 cmp %i4, %i0
4000671c: 12 80 00 5d bne 40006890 <aio_cancel+0x1ac>
40006720: 90 17 60 68 or %i5, 0x68, %o0
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (work_req_chain, fildes, 0);
40006724: 94 10 20 00 clr %o2
40006728: 92 10 00 1c mov %i4, %o1
4000672c: 11 10 00 59 sethi %hi(0x40016400), %o0
40006730: 40 00 01 96 call 40006d88 <rtems_aio_search_fd>
40006734: 90 12 21 28 or %o0, 0x128, %o0 ! 40016528 <aio_request_queue+0xc0>
if (r_chain == NULL) {
40006738: b6 92 20 00 orcc %o0, 0, %i3
4000673c: 22 80 00 0f be,a 40006778 <aio_cancel+0x94>
40006740: b6 17 60 68 or %i5, 0x68, %i3
return AIO_ALLDONE;
}
}
AIO_printf ("Request on [WQ]\n");
pthread_mutex_lock (&r_chain->mutex);
40006744: b8 06 e0 20 add %i3, 0x20, %i4
40006748: 40 00 04 f9 call 40007b2c <pthread_mutex_lock>
4000674c: 90 10 00 1c mov %i4, %o0
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
40006750: 92 10 00 19 mov %i1, %o1
40006754: 40 00 01 e2 call 40006edc <rtems_aio_remove_req>
40006758: 90 06 e0 08 add %i3, 8, %o0
4000675c: b0 10 00 08 mov %o0, %i0
pthread_mutex_unlock (&r_chain->mutex);
40006760: 40 00 05 c6 call 40007e78 <pthread_mutex_unlock>
40006764: 90 10 00 1c mov %i4, %o0
pthread_mutex_unlock (&aio_request_queue.mutex);
40006768: 40 00 05 c4 call 40007e78 <pthread_mutex_unlock>
4000676c: 90 17 60 68 or %i5, 0x68, %o0
return result;
}
return AIO_ALLDONE;
}
40006770: 81 c7 e0 08 ret
40006774: 81 e8 00 00 restore
if (!rtems_chain_is_empty (idle_req_chain)) {
40006778: c4 06 e0 cc ld [ %i3 + 0xcc ], %g2
4000677c: 82 06 e0 d0 add %i3, 0xd0, %g1
40006780: 80 a0 80 01 cmp %g2, %g1
40006784: 02 80 00 3d be 40006878 <aio_cancel+0x194>
<== NEVER TAKEN
40006788: 94 10 20 00 clr %o2
r_chain = rtems_aio_search_fd (idle_req_chain, fildes, 0);
4000678c: 92 10 00 1c mov %i4, %o1
40006790: 40 00 01 7e call 40006d88 <rtems_aio_search_fd>
40006794: 90 06 e0 cc add %i3, 0xcc, %o0
if (r_chain == NULL) {
40006798: 80 a2 20 00 cmp %o0, 0
4000679c: 02 80 00 3c be 4000688c <aio_cancel+0x1a8>
400067a0: 92 10 00 19 mov %i1, %o1
result = rtems_aio_remove_req (&r_chain->perfd, aiocbp);
400067a4: 40 00 01 ce call 40006edc <rtems_aio_remove_req>
400067a8: 90 02 20 08 add %o0, 8, %o0
400067ac: b0 10 00 08 mov %o0, %i0
pthread_mutex_unlock (&aio_request_queue.mutex);
400067b0: 40 00 05 b2 call 40007e78 <pthread_mutex_unlock>
400067b4: 90 10 00 1b mov %i3, %o0
return result;
400067b8: 81 c7 e0 08 ret
400067bc: 81 e8 00 00 restore
r_chain = rtems_aio_search_fd (work_req_chain, fildes, 0);
400067c0: 92 10 00 18 mov %i0, %o1
400067c4: 11 10 00 59 sethi %hi(0x40016400), %o0
400067c8: 40 00 01 70 call 40006d88 <rtems_aio_search_fd>
400067cc: 90 12 21 28 or %o0, 0x128, %o0 ! 40016528 <aio_request_queue+0xc0>
if (r_chain == NULL) {
400067d0: b8 92 20 00 orcc %o0, 0, %i4
400067d4: 12 80 00 1c bne 40006844 <aio_cancel+0x160>
400067d8: b6 07 20 20 add %i4, 0x20, %i3
return _Chain_Immutable_head( the_chain )->next;
400067dc: b8 17 60 68 or %i5, 0x68, %i4
if (!rtems_chain_is_empty (idle_req_chain)) {
400067e0: c4 07 20 cc ld [ %i4 + 0xcc ], %g2
400067e4: 82 07 20 d0 add %i4, 0xd0, %g1
400067e8: 80 a0 80 01 cmp %g2, %g1
400067ec: 02 80 00 23 be 40006878 <aio_cancel+0x194>
<== NEVER TAKEN
400067f0: 94 10 20 00 clr %o2
r_chain = rtems_aio_search_fd (idle_req_chain, fildes, 0);
400067f4: 92 10 00 18 mov %i0, %o1
400067f8: 40 00 01 64 call 40006d88 <rtems_aio_search_fd>
400067fc: 90 07 20 cc add %i4, 0xcc, %o0
if (r_chain == NULL) {
40006800: b6 92 20 00 orcc %o0, 0, %i3
40006804: 22 80 00 1e be,a 4000687c <aio_cancel+0x198>
40006808: b0 10 20 02 mov 2, %i0
rtems_chain_extract (&r_chain->next_fd);
4000680c: 40 00 08 d9 call 40008b70 <rtems_chain_extract>
40006810: b0 10 20 00 clr %i0
rtems_aio_remove_fd (r_chain);
40006814: 40 00 01 9d call 40006e88 <rtems_aio_remove_fd>
40006818: 90 10 00 1b mov %i3, %o0
pthread_mutex_destroy (&r_chain->mutex);
4000681c: 40 00 04 4e call 40007954 <pthread_mutex_destroy>
40006820: 90 06 e0 20 add %i3, 0x20, %o0
pthread_cond_destroy (&r_chain->cond);
40006824: 40 00 02 be call 4000731c <pthread_cond_destroy>
40006828: 90 06 e0 60 add %i3, 0x60, %o0
free (r_chain);
4000682c: 7f ff f8 7a call 40004a14 <free>
40006830: 90 10 00 1b mov %i3, %o0
pthread_mutex_unlock (&aio_request_queue.mutex);
40006834: 40 00 05 91 call 40007e78 <pthread_mutex_unlock>
40006838: 90 10 00 1c mov %i4, %o0
return AIO_CANCELED;
4000683c: 81 c7 e0 08 ret
40006840: 81 e8 00 00 restore
pthread_mutex_lock (&r_chain->mutex);
40006844: 40 00 04 ba call 40007b2c <pthread_mutex_lock>
40006848: 90 10 00 1b mov %i3, %o0
rtems_chain_extract (&r_chain->next_fd);
4000684c: 40 00 08 c9 call 40008b70 <rtems_chain_extract>
40006850: 90 10 00 1c mov %i4, %o0
rtems_aio_remove_fd (r_chain);
40006854: 40 00 01 8d call 40006e88 <rtems_aio_remove_fd>
40006858: 90 10 00 1c mov %i4, %o0
pthread_mutex_unlock (&r_chain->mutex);
4000685c: 40 00 05 87 call 40007e78 <pthread_mutex_unlock>
40006860: 90 10 00 1b mov %i3, %o0
return AIO_CANCELED;
40006864: b0 10 20 00 clr %i0
pthread_mutex_unlock (&aio_request_queue.mutex);
40006868: 40 00 05 84 call 40007e78 <pthread_mutex_unlock>
4000686c: 90 17 60 68 or %i5, 0x68, %o0
return AIO_CANCELED;
40006870: 81 c7 e0 08 ret
40006874: 81 e8 00 00 restore
return AIO_ALLDONE;
40006878: b0 10 20 02 mov 2, %i0
<== NOT EXECUTED
pthread_mutex_unlock(&aio_request_queue.mutex);
4000687c: 40 00 05 7f call 40007e78 <pthread_mutex_unlock>
40006880: 90 17 60 68 or %i5, 0x68, %o0
return AIO_ALLDONE;
40006884: 81 c7 e0 08 ret
40006888: 81 e8 00 00 restore
pthread_mutex_unlock (&aio_request_queue.mutex);
4000688c: 90 10 00 1b mov %i3, %o0
40006890: 40 00 05 7a call 40007e78 <pthread_mutex_unlock>
40006894: b0 10 3f ff mov -1, %i0
rtems_set_errno_and_return_minus_one (EINVAL);
40006898: 40 00 2a 93 call 400112e4 <__errno>
4000689c: 01 00 00 00 nop
400068a0: 82 10 20 16 mov 0x16, %g1 ! 16 <_TLS_Alignment+0x15>
400068a4: c2 22 00 00 st %g1, [ %o0 ]
400068a8: 81 c7 e0 08 ret
400068ac: 81 e8 00 00 restore
pthread_mutex_unlock(&aio_request_queue.mutex);
400068b0: 40 00 05 72 call 40007e78 <pthread_mutex_unlock>
400068b4: 90 17 60 68 or %i5, 0x68, %o0
rtems_set_errno_and_return_minus_one (EBADF);
400068b8: 40 00 2a 8b call 400112e4 <__errno>
400068bc: b0 10 3f ff mov -1, %i0
400068c0: 82 10 20 09 mov 9, %g1
400068c4: c2 22 00 00 st %g1, [ %o0 ]
400068c8: 81 c7 e0 08 ret
400068cc: 81 e8 00 00 restore
400068d8 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
400068d8: 9d e3 bf a0 save %sp, -96, %sp
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
400068dc: 03 00 00 08 sethi %hi(0x2000), %g1
400068e0: 80 a6 00 01 cmp %i0, %g1
400068e4: 12 80 00 14 bne 40006934 <aio_fsync+0x5c>
400068e8: ba 10 20 16 mov 0x16, %i5
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
400068ec: d0 06 40 00 ld [ %i1 ], %o0
400068f0: 40 00 25 36 call 4000fdc8 <fcntl>
400068f4: 92 10 20 03 mov 3, %o1
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
400068f8: 90 0a 20 03 and %o0, 3, %o0
400068fc: 90 02 3f ff add %o0, -1, %o0
40006900: 80 a2 20 01 cmp %o0, 1
40006904: 18 80 00 0c bgu 40006934 <aio_fsync+0x5c>
40006908: ba 10 20 09 mov 9, %i5
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
4000690c: 7f ff f9 96 call 40004f64 <malloc>
40006910: 90 10 20 18 mov 0x18, %o0
if (req == NULL)
40006914: 80 a2 20 00 cmp %o0, 0
40006918: 02 80 00 06 be 40006930 <aio_fsync+0x58>
<== NEVER TAKEN
4000691c: 82 10 20 03 mov 3, %g1
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
40006920: f2 22 20 14 st %i1, [ %o0 + 0x14 ]
req->aiocbp->aio_lio_opcode = LIO_SYNC;
40006924: c2 26 60 30 st %g1, [ %i1 + 0x30 ]
return rtems_aio_enqueue (req);
40006928: 40 00 01 8d call 40006f5c <rtems_aio_enqueue>
4000692c: 91 e8 00 08 restore %g0, %o0, %o0
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
40006930: ba 10 20 0b mov 0xb, %i5
<== NOT EXECUTED
40006934: 82 10 3f ff mov -1, %g1
40006938: fa 26 60 34 st %i5, [ %i1 + 0x34 ]
}
4000693c: b0 10 3f ff mov -1, %i0
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
40006940: 40 00 2a 69 call 400112e4 <__errno>
40006944: c2 26 60 38 st %g1, [ %i1 + 0x38 ]
40006948: fa 22 00 00 st %i5, [ %o0 ]
}
4000694c: 81 c7 e0 08 ret
40006950: 81 e8 00 00 restore
40007160 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
40007160: 9d e3 bf a0 save %sp, -96, %sp
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
40007164: d0 06 00 00 ld [ %i0 ], %o0
40007168: 92 10 20 03 mov 3, %o1
4000716c: 40 00 23 17 call 4000fdc8 <fcntl>
40007170: ba 10 00 18 mov %i0, %i5
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
40007174: 80 8a 20 01 btst 1, %o0
40007178: 12 80 00 14 bne 400071c8 <aio_read+0x68>
4000717c: b8 10 20 09 mov 9, %i4
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
40007180: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
40007184: 80 a0 60 00 cmp %g1, 0
40007188: 12 80 00 10 bne 400071c8 <aio_read+0x68>
4000718c: b8 10 20 16 mov 0x16, %i4
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
40007190: c2 06 20 08 ld [ %i0 + 8 ], %g1
40007194: 80 a0 60 00 cmp %g1, 0
40007198: 06 80 00 0d bl 400071cc <aio_read+0x6c>
4000719c: 82 10 3f ff mov -1, %g1
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
400071a0: 7f ff f7 71 call 40004f64 <malloc>
400071a4: 90 10 20 18 mov 0x18, %o0
if (req == NULL)
400071a8: 80 a2 20 00 cmp %o0, 0
400071ac: 02 80 00 06 be 400071c4 <aio_read+0x64>
<== NEVER TAKEN
400071b0: 82 10 20 01 mov 1, %g1
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
400071b4: fa 22 20 14 st %i5, [ %o0 + 0x14 ]
req->aiocbp->aio_lio_opcode = LIO_READ;
400071b8: c2 26 20 30 st %g1, [ %i0 + 0x30 ]
return rtems_aio_enqueue (req);
400071bc: 7f ff ff 68 call 40006f5c <rtems_aio_enqueue>
400071c0: 91 e8 00 08 restore %g0, %o0, %o0
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
400071c4: b8 10 20 0b mov 0xb, %i4
<== NOT EXECUTED
400071c8: 82 10 3f ff mov -1, %g1
400071cc: f8 27 60 34 st %i4, [ %i5 + 0x34 ]
}
400071d0: b0 10 3f ff mov -1, %i0
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
400071d4: 40 00 28 44 call 400112e4 <__errno>
400071d8: c2 27 60 38 st %g1, [ %i5 + 0x38 ]
400071dc: f8 22 00 00 st %i4, [ %o0 ]
}
400071e0: 81 c7 e0 08 ret
400071e4: 81 e8 00 00 restore
400071f0 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
400071f0: 9d e3 bf a0 save %sp, -96, %sp
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
400071f4: d0 06 00 00 ld [ %i0 ], %o0
400071f8: 40 00 22 f4 call 4000fdc8 <fcntl>
400071fc: 92 10 20 03 mov 3, %o1
{
40007200: ba 10 00 18 mov %i0, %i5
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
40007204: 90 0a 20 03 and %o0, 3, %o0
40007208: 90 02 3f ff add %o0, -1, %o0
4000720c: 80 a2 20 01 cmp %o0, 1
40007210: 18 80 00 14 bgu 40007260 <aio_write+0x70>
40007214: b8 10 20 09 mov 9, %i4
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
40007218: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
4000721c: 80 a0 60 00 cmp %g1, 0
40007220: 12 80 00 10 bne 40007260 <aio_write+0x70>
40007224: b8 10 20 16 mov 0x16, %i4
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
40007228: c2 06 20 08 ld [ %i0 + 8 ], %g1
4000722c: 80 a0 60 00 cmp %g1, 0
40007230: 06 80 00 0d bl 40007264 <aio_write+0x74>
40007234: 82 10 3f ff mov -1, %g1
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
40007238: 7f ff f7 4b call 40004f64 <malloc>
4000723c: 90 10 20 18 mov 0x18, %o0
if (req == NULL)
40007240: 80 a2 20 00 cmp %o0, 0
40007244: 02 80 00 06 be 4000725c <aio_write+0x6c>
<== NEVER TAKEN
40007248: 82 10 20 02 mov 2, %g1
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
4000724c: fa 22 20 14 st %i5, [ %o0 + 0x14 ]
req->aiocbp->aio_lio_opcode = LIO_WRITE;
40007250: c2 26 20 30 st %g1, [ %i0 + 0x30 ]
return rtems_aio_enqueue (req);
40007254: 7f ff ff 42 call 40006f5c <rtems_aio_enqueue>
40007258: 91 e8 00 08 restore %g0, %o0, %o0
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
4000725c: b8 10 20 0b mov 0xb, %i4
<== NOT EXECUTED
40007260: 82 10 3f ff mov -1, %g1
40007264: f8 27 60 34 st %i4, [ %i5 + 0x34 ]
}
40007268: b0 10 3f ff mov -1, %i0
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
4000726c: 40 00 28 1e call 400112e4 <__errno>
40007270: c2 27 60 38 st %g1, [ %i5 + 0x38 ]
40007274: f8 22 00 00 st %i4, [ %o0 ]
}
40007278: 81 c7 e0 08 ret
4000727c: 81 e8 00 00 restore
400074f4 <alarm>:
);
unsigned int alarm(
unsigned int seconds
)
{
400074f4: 9d e3 bf a0 save %sp, -96, %sp
uint64_t now;
uint32_t ticks_per_second;
uint32_t ticks;
the_watchdog = &_POSIX_signals_Alarm_watchdog;
ticks_per_second = TOD_TICKS_PER_SECOND;
400074f8: 40 00 05 d3 call 40008c44 <TOD_TICKS_PER_SECOND_method>
400074fc: 01 00 00 00 nop
40007500: ba 10 00 08 mov %o0, %i5
<== NOT EXECUTED
ticks = seconds * ticks_per_second;
40007504: b0 5a 00 18 smul %o0, %i0, %i0
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007508: 91 d0 20 09 ta 9
<== NOT EXECUTED
return psr;
4000750c: b2 10 00 01 mov %g1, %i1
&lock_context
);
cpu = _Watchdog_Get_CPU( the_watchdog );
_Watchdog_Per_CPU_acquire_critical( cpu, &lock_context2 );
now = cpu->Watchdog.ticks;
40007510: 03 10 00 79 sethi %hi(0x4001e400), %g1
)
{
uint64_t expire;
uint64_t remaining;
expire = the_watchdog->expire;
40007514: 37 10 00 71 sethi %hi(0x4001c400), %i3
40007518: e0 18 61 f0 ldd [ %g1 + 0x1f0 ], %l0
4000751c: 84 16 e3 f8 or %i3, 0x3f8, %g2
40007520: c2 00 a0 18 ld [ %g2 + 0x18 ], %g1
if ( now < expire ) {
40007524: 80 a0 40 10 cmp %g1, %l0
40007528: 18 80 00 1e bgu 400075a0 <alarm+0xac>
<== NEVER TAKEN
4000752c: f8 00 a0 1c ld [ %g2 + 0x1c ], %i4
40007530: 02 80 00 1a be 40007598 <alarm+0xa4>
<== ALWAYS TAKEN
40007534: 80 a7 00 11 cmp %i4, %l1
40007538: b8 10 20 00 clr %i4
<== NOT EXECUTED
remaining = expire - now;
} else {
remaining = 0;
}
_Watchdog_Remove( header, the_watchdog );
4000753c: 92 16 e3 f8 or %i3, 0x3f8, %o1
40007540: 35 10 00 79 sethi %hi(0x4001e400), %i2
40007544: 40 00 1c fc call 4000e934 <_Watchdog_Remove>
40007548: 90 16 a1 f8 or %i2, 0x1f8, %o0 ! 4001e5f8 <_Per_CPU_Information+0x38>
&cpu->Watchdog.Header[ PER_CPU_WATCHDOG_TICKS ],
the_watchdog,
now
);
if ( ticks != 0 ) {
4000754c: 80 a6 20 00 cmp %i0, 0
40007550: 02 80 00 06 be 40007568 <alarm+0x74>
40007554: 96 84 40 18 addcc %l1, %i0, %o3
_Watchdog_Insert(
40007558: 92 16 e3 f8 or %i3, 0x3f8, %o1
4000755c: 94 44 20 00 addx %l0, 0, %o2
40007560: 40 00 1c cd call 4000e894 <_Watchdog_Insert>
40007564: 90 16 a1 f8 or %i2, 0x1f8, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007568: 82 10 00 19 mov %i1, %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000756c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007570: 01 00 00 00 nop
_ISR_lock_Release_and_ISR_enable(
&_POSIX_signals_Alarm_lock,
&lock_context
);
return ( remaining + ticks_per_second - 1 ) / ticks_per_second;
40007574: b0 07 7f ff add %i5, -1, %i0
40007578: b0 06 00 1c add %i0, %i4, %i0
}
4000757c: 81 80 20 00 wr %g0, %y
40007580: 01 00 00 00 nop
40007584: 01 00 00 00 nop
40007588: 01 00 00 00 nop
4000758c: b0 76 00 1d udiv %i0, %i5, %i0
40007590: 81 c7 e0 08 ret
40007594: 81 e8 00 00 restore
if ( now < expire ) {
40007598: 28 bf ff e9 bleu,a 4000753c <alarm+0x48>
4000759c: b8 10 20 00 clr %i4
400075a0: 10 bf ff e7 b 4000753c <alarm+0x48>
400075a4: b8 27 00 11 sub %i4, %l1, %i4
40008444 <clock_nanosleep>:
if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) {
40008444: 80 a2 20 01 cmp %o0, 1
40008448: 02 80 00 04 be 40008458 <clock_nanosleep+0x14>
<== ALWAYS TAKEN
4000844c: 80 a2 20 04 cmp %o0, 4
40008450: 12 80 00 05 bne 40008464 <clock_nanosleep+0x20>
<== NOT EXECUTED
40008454: 01 00 00 00 nop
<== NOT EXECUTED
40008458: 82 13 c0 00 mov %o7, %g1
4000845c: 7f ff ff 7c call 4000824c <clock_nanosleep.part.6>
40008460: 9e 10 40 00 mov %g1, %o7
}
}
return eno;
}
40008464: 81 c3 e0 08 retl
<== NOT EXECUTED
40008468: 90 10 20 86 mov 0x86, %o0
<== NOT EXECUTED
400064a8 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
400064a8: 9d e3 bf 98 save %sp, -104, %sp
if ( !tp )
400064ac: 80 a6 60 00 cmp %i1, 0
400064b0: 02 80 00 2b be 4000655c <clock_settime+0xb4>
<== NEVER TAKEN
400064b4: 80 a6 20 01 cmp %i0, 1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
400064b8: 02 80 00 12 be 40006500 <clock_settime+0x58>
400064bc: 80 a6 20 02 cmp %i0, 2
_TOD_Acquire( &lock_context );
_TOD_Set( tp, &lock_context );
_TOD_Unlock();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
400064c0: 02 80 00 0a be 400064e8 <clock_settime+0x40>
400064c4: 80 a6 20 03 cmp %i0, 3
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME_ID )
400064c8: 02 80 00 08 be 400064e8 <clock_settime+0x40>
400064cc: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
400064d0: 40 00 27 2e call 40010188 <__errno>
400064d4: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
400064d8: 82 10 20 16 mov 0x16, %g1
400064dc: c2 22 00 00 st %g1, [ %o0 ]
return 0;
}
400064e0: 81 c7 e0 08 ret
400064e4: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( ENOSYS );
400064e8: 40 00 27 28 call 40010188 <__errno>
400064ec: b0 10 3f ff mov -1, %i0
400064f0: 82 10 20 58 mov 0x58, %g1
400064f4: c2 22 00 00 st %g1, [ %o0 ]
400064f8: 81 c7 e0 08 ret
400064fc: 81 e8 00 00 restore
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
40006500: c2 06 40 00 ld [ %i1 ], %g1
40006504: 80 a0 60 00 cmp %g1, 0
40006508: 04 80 00 0e ble 40006540 <clock_settime+0x98>
<== ALWAYS TAKEN
4000650c: 01 00 00 00 nop
_TOD_Lock();
40006510: 40 00 04 51 call 40007654 <_TOD_Lock>
40006514: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006518: 91 d0 20 09 ta 9
<== NOT EXECUTED
_Timecounter_Acquire( lock_context );
4000651c: c2 27 bf fc st %g1, [ %fp + -4 ]
_TOD_Set( tp, &lock_context );
40006520: 92 07 bf fc add %fp, -4, %o1
40006524: 90 10 00 19 mov %i1, %o0
40006528: 40 00 04 55 call 4000767c <_TOD_Set>
4000652c: b0 10 20 00 clr %i0
_TOD_Unlock();
40006530: 40 00 04 4e call 40007668 <_TOD_Unlock>
40006534: 01 00 00 00 nop
return 0;
40006538: 81 c7 e0 08 ret
4000653c: 81 e8 00 00 restore
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
40006540: 12 80 00 07 bne 4000655c <clock_settime+0xb4>
<== NEVER TAKEN
40006544: 03 08 76 b9 sethi %hi(0x21dae400), %g1
40006548: c4 06 60 04 ld [ %i1 + 4 ], %g2
4000654c: 82 10 60 ff or %g1, 0xff, %g1
40006550: 80 a0 80 01 cmp %g2, %g1
40006554: 18 bf ff ef bgu 40006510 <clock_settime+0x68>
40006558: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EINVAL );
4000655c: 40 00 27 0b call 40010188 <__errno>
40006560: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
40006564: 82 10 20 16 mov 0x16, %g1
40006568: c2 22 00 00 st %g1, [ %o0 ]
4000656c: 81 c7 e0 08 ret
40006570: 81 e8 00 00 restore
4000709c <mmap>:
CHAIN_DEFINE_EMPTY( mmap_mappings );
void *mmap(
void *addr, size_t len, int prot, int flags, int fildes, off_t off
)
{
4000709c: 9d e3 bf 38 save %sp, -200, %sp
400070a0: fa 27 a0 58 st %i5, [ %fp + 0x58 ]
map_anonymous = (flags & MAP_ANON) == MAP_ANON;
map_shared = (flags & MAP_SHARED) == MAP_SHARED;
map_private = (flags & MAP_PRIVATE) == MAP_PRIVATE;
/* Clear errno. */
errno = 0;
400070a4: 40 00 24 ed call 40010458 <__errno>
400070a8: e0 1f a0 58 ldd [ %fp + 0x58 ], %l0
iop = NULL;
if ( len == 0 ) {
400070ac: 80 a6 60 00 cmp %i1, 0
400070b0: 02 80 00 84 be 400072c0 <mmap+0x224>
<== NEVER TAKEN
400070b4: c0 22 00 00 clr [ %o0 ]
/*
* We can provide read, write and execute because the memory in RTEMS does
* not normally have protections but we cannot hide access to memory.
*/
if ( prot == PROT_NONE ) {
400070b8: 80 a6 a0 00 cmp %i2, 0
400070bc: 02 80 00 71 be 40007280 <mmap+0x1e4>
<== NEVER TAKEN
400070c0: 80 8e a0 02 btst 2, %i2
/*
* We can not normally provide restriction of write access. Reject any
* attempt to map without write permission, since we are not able to
* prevent a write from succeeding.
*/
if ( PROT_WRITE != (prot & PROT_WRITE) ) {
400070c4: 02 80 00 6f be 40007280 <mmap+0x1e4>
400070c8: 03 00 00 04 sethi %hi(0x1000), %g1
map_shared = (flags & MAP_SHARED) == MAP_SHARED;
400070cc: a4 0e e0 01 and %i3, 1, %l2
/*
* Anonymous mappings must have file descriptor set to -1 and the offset
* set to 0. Shared mappings are not supported with Anonymous mappings at
* this time
*/
if ( map_anonymous && (fildes != -1 || off != 0 || map_shared) ) {
400070d0: ba 8e c0 01 andcc %i3, %g1, %i5
400070d4: 02 80 00 72 be 4000729c <mmap+0x200>
400070d8: 86 0e e0 02 and %i3, 2, %g3
400070dc: 82 38 00 1c xnor %g0, %i4, %g1
400070e0: 80 a0 00 01 cmp %g0, %g1
400070e4: 84 14 00 11 or %l0, %l1, %g2
400070e8: 82 40 20 00 addx %g0, 0, %g1
400070ec: 80 a0 00 02 cmp %g0, %g2
400070f0: 84 40 20 00 addx %g0, 0, %g2
400070f4: 82 10 40 02 or %g1, %g2, %g1
400070f8: 82 10 40 12 or %g1, %l2, %g1
400070fc: 80 a0 60 00 cmp %g1, 0
40007100: 12 80 00 70 bne 400072c0 <mmap+0x224>
40007104: ac 10 00 01 mov %g1, %l6
40007108: 03 3f ff fb sethi %hi(0xffffec00), %g1
/*
* If MAP_ANON is declared without MAP_PRIVATE or MAP_SHARED,
* force MAP_PRIVATE
*/
if ( map_anonymous && !map_private && !map_shared ) {
4000710c: 80 a0 e0 00 cmp %g3, 0
40007110: 82 10 63 ec or %g1, 0x3ec, %g1
40007114: 12 80 01 06 bne 4000752c <mmap+0x490>
40007118: 82 0e c0 01 and %i3, %g1, %g1
flags |= MAP_PRIVATE;
map_private = true;
}
/* Check for supported flags */
if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) {
4000711c: 80 a0 60 00 cmp %g1, 0
40007120: 12 80 00 68 bne 400072c0 <mmap+0x224>
40007124: a8 8e e0 10 andcc %i3, 0x10, %l4
errno = EINVAL;
return MAP_FAILED;
}
/* Check for illegal addresses. Watch out for address wrap. */
if ( map_fixed ) {
40007128: 02 80 00 80 be 40007328 <mmap+0x28c>
<== ALWAYS TAKEN
4000712c: ae 16 e0 02 or %i3, 2, %l7
40007130: b6 10 00 17 mov %l7, %i3
<== NOT EXECUTED
40007134: a6 10 20 01 mov 1, %l3
<== NOT EXECUTED
if ((uintptr_t)addr & PAGE_MASK) {
40007138: 80 8e 2f ff btst 0xfff, %i0
<== NOT EXECUTED
4000713c: 12 80 00 61 bne 400072c0 <mmap+0x224>
40007140: 80 a6 20 00 cmp %i0, 0
errno = EINVAL;
return MAP_FAILED;
}
if ( addr == NULL ) {
40007144: 02 80 00 5f be 400072c0 <mmap+0x224>
40007148: 80 a6 60 00 cmp %i1, 0
errno = EINVAL;
return MAP_FAILED;
}
if (addr + len < addr) {
4000714c: 06 80 00 5d bl 400072c0 <mmap+0x224>
<== NEVER TAKEN
40007150: 80 a7 60 00 cmp %i5, 0
errno = EINVAL;
return MAP_FAILED;
}
}
if ( !map_anonymous ) {
40007154: 12 80 00 69 bne 400072f8 <mmap+0x25c>
40007158: 92 07 bf a0 add %fp, -96, %o1
* Get a stat of the file to get the dev + inode number and to make sure the
* fd is ok. The normal libio calls cannot be used because we need to return
* MAP_FAILED on error and they return -1 directly without coming back to
* here.
*/
if ( fstat( fildes, &sb ) < 0 ) {
4000715c: 40 00 1c cc call 4000e48c <fstat>
40007160: 90 10 00 1c mov %i4, %o0
40007164: 80 a2 20 00 cmp %o0, 0
40007168: 06 80 00 c9 bl 4000748c <mmap+0x3f0>
<== NEVER TAKEN
4000716c: 2d 00 00 3c sethi %hi(0xf000), %l6
/* fstat ensures we have a good file descriptor. Hold on to iop. */
iop = rtems_libio_iop( fildes );
/* Check the type of file we have and make sure it is supported. */
if ( S_ISDIR( sb.st_mode ) || S_ISLNK( sb.st_mode )) {
40007170: c2 07 bf ac ld [ %fp + -84 ], %g1
40007174: 05 00 00 10 sethi %hi(0x4000), %g2
40007178: ac 08 40 16 and %g1, %l6, %l6
4000717c: 80 a5 80 02 cmp %l6, %g2
40007180: 02 80 00 9c be 400073f0 <mmap+0x354>
<== NEVER TAKEN
40007184: 05 00 00 28 sethi %hi(0xa000), %g2
40007188: 80 a5 80 02 cmp %l6, %g2
4000718c: 02 80 00 99 be 400073f0 <mmap+0x354>
<== NEVER TAKEN
40007190: 05 00 00 20 sethi %hi(0x8000), %g2
errno = ENODEV;
return MAP_FAILED;
}
/* Check to see if the mapping is valid for a regular file. */
if ( S_ISREG( sb.st_mode )
40007194: 80 a5 80 02 cmp %l6, %g2
40007198: 02 80 00 9c be 40007408 <mmap+0x36c>
<== NEVER TAKEN
4000719c: 05 00 00 08 sethi %hi(0x2000), %g2
errno = EOVERFLOW;
return MAP_FAILED;
}
/* Check to see if the mapping is valid for other file/object types. */
if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) {
400071a0: 80 a5 80 02 cmp %l6, %g2
400071a4: 02 80 00 ad be 40007458 <mmap+0x3bc>
400071a8: 9a 84 40 19 addcc %l1, %i1, %o5
400071ac: c8 07 bf c0 ld [ %fp + -64 ], %g4
400071b0: 98 44 20 00 addx %l0, 0, %o4
400071b4: 80 a1 00 0c cmp %g4, %o4
400071b8: 06 80 00 d7 bl 40007514 <mmap+0x478>
<== NEVER TAKEN
400071bc: 01 00 00 00 nop
400071c0: 02 80 00 f5 be 40007594 <mmap+0x4f8>
<== ALWAYS TAKEN
400071c4: c4 07 bf c4 ld [ %fp + -60 ], %g2
errno = ENXIO;
return MAP_FAILED;
}
/* Do not seek on character devices, pipes, sockets, or memory objects. */
if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) ) {
400071c8: 05 3f ff e8 sethi %hi(0xffffa000), %g2
<== NOT EXECUTED
400071cc: 07 3f ff f4 sethi %hi(0xffffd000), %g3
400071d0: 84 05 80 02 add %l6, %g2, %g2
400071d4: 80 88 80 03 btst %g2, %g3
400071d8: 02 80 00 95 be 4000742c <mmap+0x390>
<== NEVER TAKEN
400071dc: 2f 00 00 2c sethi %hi(0xb000), %l7
return MAP_FAILED;
}
}
/* cdevs do not provide private mappings of any kind. */
if ( S_ISCHR( sb.st_mode ) && map_private ) {
400071e0: ae 08 40 17 and %g1, %l7, %l7
400071e4: 03 00 00 08 sethi %hi(0x2000), %g1
400071e8: 82 1d c0 01 xor %l7, %g1, %g1
400071ec: 80 a0 00 01 cmp %g0, %g1
400071f0: 84 60 3f ff subx %g0, -1, %g2
400071f4: 86 10 00 02 mov %g2, %g3
400071f8: c6 27 bf 9c st %g3, [ %fp + -100 ]
return MAP_FAILED;
}
}
/* Create the mapping */
mapping = malloc( sizeof( mmap_mapping ));
400071fc: 92 10 20 01 mov 1, %o1
40007200: 7f ff f7 37 call 40004edc <calloc>
40007204: 90 10 20 18 mov 0x18, %o0
if ( !mapping ) {
40007208: aa 92 20 00 orcc %o0, 0, %l5
4000720c: 02 80 00 41 be 40007310 <mmap+0x274>
<== NEVER TAKEN
40007210: c6 07 bf 9c ld [ %fp + -100 ], %g3
* HACK: We should have a better generic way to distinguish between
* shm objects and other mmap'd files. We need to know at munmap time
* if the mapping is to a shared memory object in order to refcnt shms.
* We could do this by providing mmap in the file operations if needed.
*/
if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) ||
40007214: 03 00 00 20 sethi %hi(0x8000), %g1
mapping->flags = flags;
40007218: f6 25 60 10 st %i3, [ %l5 + 0x10 ]
if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) ||
4000721c: 82 1d c0 01 xor %l7, %g1, %g1
mapping->len = len;
40007220: f2 25 60 0c st %i1, [ %l5 + 0xc ]
if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) ||
40007224: 80 a0 00 01 cmp %g0, %g1
S_ISCHR( sb.st_mode ) || S_ISFIFO( sb.st_mode ) ||
40007228: 03 00 00 04 sethi %hi(0x1000), %g1
if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) ||
4000722c: 84 60 3f ff subx %g0, -1, %g2
S_ISCHR( sb.st_mode ) || S_ISFIFO( sb.st_mode ) ||
40007230: ac 1d 80 01 xor %l6, %g1, %l6
40007234: 80 a0 00 16 cmp %g0, %l6
40007238: 84 10 80 03 or %g2, %g3, %g2
4000723c: 82 60 3f ff subx %g0, -1, %g1
return &rtems_libio_iops[ fd ];
40007240: b7 2f 20 01 sll %i4, 1, %i3
40007244: 07 10 00 77 sethi %hi(0x4001dc00), %g3
40007248: b6 06 c0 1c add %i3, %i4, %i3
4000724c: 86 10 e3 10 or %g3, 0x310, %g3
40007250: b7 2e e0 04 sll %i3, 4, %i3
40007254: 82 10 40 02 or %g1, %g2, %g1
40007258: b6 06 c0 03 add %i3, %g3, %i3
4000725c: 82 18 60 01 xor %g1, 1, %g1
}
} else {
is_shared_shm = false;
}
if ( map_fixed ) {
40007260: 80 a5 20 00 cmp %l4, 0
40007264: 02 80 00 3b be 40007350 <mmap+0x2b4>
<== ALWAYS TAKEN
40007268: ac 10 00 01 mov %g1, %l6
return MAP_FAILED;
}
}
/* MAP_FIXED is not supported for shared memory objects with MAP_SHARED. */
if ( map_fixed && is_shared_shm ) {
4000726c: 80 88 60 01 btst 1, %g1
<== NOT EXECUTED
40007270: 22 80 00 cf be,a 400075ac <mmap+0x510>
<== NOT EXECUTED
40007274: f0 25 60 08 st %i0, [ %l5 + 8 ]
<== NOT EXECUTED
free( mapping );
40007278: 7f ff f7 9e call 400050f0 <free>
<== NOT EXECUTED
4000727c: 01 00 00 00 nop
<== NOT EXECUTED
errno = ENOTSUP;
40007280: 40 00 24 76 call 40010458 <__errno>
40007284: 01 00 00 00 nop
return MAP_FAILED;
40007288: 82 10 3f ff mov -1, %g1 ! ffffffff <RAM_END+0xbfbfffff>
errno = ENOTSUP;
4000728c: 84 10 20 86 mov 0x86, %g2
40007290: c4 22 00 00 st %g2, [ %o0 ]
rtems_chain_append_unprotected( &mmap_mappings, &mapping->node );
mmap_mappings_lock_release( );
return mapping->addr;
}
40007294: 81 c7 e0 08 ret
40007298: 91 e8 00 01 restore %g0, %g1, %o0
if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) {
4000729c: 03 3f ff fb sethi %hi(0xffffec00), %g1
400072a0: 82 10 63 ec or %g1, 0x3ec, %g1 ! ffffefec <RAM_END+0xbfbfefec>
400072a4: 80 8e c0 01 btst %i3, %g1
400072a8: 12 80 00 06 bne 400072c0 <mmap+0x224>
<== NEVER TAKEN
400072ac: 80 a4 a0 00 cmp %l2, 0
if ( map_shared ) {
400072b0: 12 80 00 0b bne 400072dc <mmap+0x240>
400072b4: 80 a0 e0 00 cmp %g3, 0
} else if ( !map_private ) {
400072b8: 12 80 00 0b bne 400072e4 <mmap+0x248>
400072bc: a6 10 20 01 mov 1, %l3
errno = EINVAL;
400072c0: 40 00 24 66 call 40010458 <__errno>
400072c4: 01 00 00 00 nop
400072c8: 84 10 20 16 mov 0x16, %g2 ! 16 <_TLS_Alignment+0x15>
400072cc: c4 22 00 00 st %g2, [ %o0 ]
return MAP_FAILED;
400072d0: 82 10 3f ff mov -1, %g1
}
400072d4: 81 c7 e0 08 ret
400072d8: 91 e8 00 01 restore %g0, %g1, %o0
if ( map_private ) {
400072dc: 12 bf ff f9 bne 400072c0 <mmap+0x224>
400072e0: a6 10 20 00 clr %l3
if ( map_fixed ) {
400072e4: a8 8e e0 10 andcc %i3, 0x10, %l4
400072e8: 22 bf ff 9b be,a 40007154 <mmap+0xb8>
400072ec: 80 a7 60 00 cmp %i5, 0
if ((uintptr_t)addr & PAGE_MASK) {
400072f0: 10 bf ff 93 b 4000713c <mmap+0xa0>
400072f4: 80 8e 2f ff btst 0xfff, %i0
mapping = malloc( sizeof( mmap_mapping ));
400072f8: 92 10 20 01 mov 1, %o1
400072fc: 7f ff f6 f8 call 40004edc <calloc>
40007300: 90 10 20 18 mov 0x18, %o0
if ( !mapping ) {
40007304: aa 92 20 00 orcc %o0, 0, %l5
40007308: 32 80 00 34 bne,a 400073d8 <mmap+0x33c>
<== ALWAYS TAKEN
4000730c: f2 25 60 0c st %i1, [ %l5 + 0xc ]
errno = ENOMEM;
40007310: 40 00 24 52 call 40010458 <__errno>
<== NOT EXECUTED
40007314: 01 00 00 00 nop
<== NOT EXECUTED
40007318: 84 10 20 0c mov 0xc, %g2 ! c <_TLS_Alignment+0xb>
<== NOT EXECUTED
return MAP_FAILED;
4000731c: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
40007320: 10 bf ff ed b 400072d4 <mmap+0x238>
<== NOT EXECUTED
40007324: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
mapping = malloc( sizeof( mmap_mapping ));
40007328: 92 10 20 01 mov 1, %o1
4000732c: 7f ff f6 ec call 40004edc <calloc>
40007330: 90 10 20 18 mov 0x18, %o0
if ( !mapping ) {
40007334: aa 92 20 00 orcc %o0, 0, %l5
40007338: 02 bf ff f6 be 40007310 <mmap+0x274>
<== NEVER TAKEN
4000733c: 01 00 00 00 nop
mapping->len = len;
40007340: f2 25 60 0c st %i1, [ %l5 + 0xc ]
mapping->flags = flags;
40007344: a6 10 20 01 mov 1, %l3
40007348: ee 25 60 10 st %l7, [ %l5 + 0x10 ]
iop = NULL;
4000734c: b6 10 20 00 clr %i3
} else if ( map_private ) {
40007350: 80 8c e0 ff btst 0xff, %l3
40007354: 12 80 00 54 bne 400074a4 <mmap+0x408>
40007358: 94 10 00 19 mov %i1, %o2
extern rtems_chain_control mmap_mappings;
static inline void mmap_mappings_lock_obtain( void )
{
rtems_libio_lock();
4000735c: 7f ff f8 1c call 400053cc <rtems_libio_lock>
40007360: 01 00 00 00 nop
} else if ( map_shared ) {
40007364: 80 a4 a0 00 cmp %l2, 0
40007368: 02 80 00 12 be 400073b0 <mmap+0x314>
<== NEVER TAKEN
4000736c: 07 10 00 72 sethi %hi(0x4001c800), %g3
if ( is_shared_shm ) {
40007370: 80 8d a0 ff btst 0xff, %l6
40007374: 02 80 00 04 be 40007384 <mmap+0x2e8>
40007378: 98 10 00 10 mov %l0, %o4
mapping->shm = iop_to_shm( iop );
4000737c: c2 06 e0 28 ld [ %i3 + 0x28 ], %g1
40007380: c2 25 60 14 st %g1, [ %l5 + 0x14 ]
err = (*iop->pathinfo.handlers->mmap_h)(
40007384: c2 06 e0 1c ld [ %i3 + 0x1c ], %g1
40007388: c2 00 60 3c ld [ %g1 + 0x3c ], %g1
4000738c: 9a 10 00 11 mov %l1, %o5
40007390: 96 10 00 1a mov %i2, %o3
40007394: 94 10 00 19 mov %i1, %o2
40007398: 92 05 60 08 add %l5, 8, %o1
4000739c: 9f c0 40 00 call %g1
400073a0: 90 10 00 1b mov %i3, %o0
if ( err != 0 ) {
400073a4: 80 a2 20 00 cmp %o0, 0
400073a8: 12 80 00 a8 bne 40007648 <mmap+0x5ac>
400073ac: 07 10 00 72 sethi %hi(0x4001c800), %g3
400073b0: 86 10 e2 e0 or %g3, 0x2e0, %g3 ! 4001cae0 <mmap_mappings+0x4>
400073b4: 88 00 ff fc add %g3, -4, %g4
old_last = tail->previous;
400073b8: c2 01 20 08 ld [ %g4 + 8 ], %g1
the_node->next = tail;
400073bc: c6 25 40 00 st %g3, [ %l5 ]
tail->previous = the_node;
400073c0: ea 21 20 08 st %l5, [ %g4 + 8 ]
old_last->next = the_node;
400073c4: ea 20 40 00 st %l5, [ %g1 ]
}
static inline void mmap_mappings_lock_release( void )
{
rtems_libio_unlock();
400073c8: 7f ff f8 06 call 400053e0 <rtems_libio_unlock>
400073cc: c2 25 60 04 st %g1, [ %l5 + 4 ]
return mapping->addr;
400073d0: 10 bf ff c1 b 400072d4 <mmap+0x238>
400073d4: c2 05 60 08 ld [ %l5 + 8 ], %g1
if ( map_fixed ) {
400073d8: 80 a5 20 00 cmp %l4, 0
400073dc: 12 80 00 72 bne 400075a4 <mmap+0x508>
400073e0: f6 25 60 10 st %i3, [ %l5 + 0x10 ]
iop = NULL;
400073e4: b6 10 20 00 clr %i3
is_shared_shm = false;
400073e8: 10 bf ff da b 40007350 <mmap+0x2b4>
400073ec: ac 10 20 00 clr %l6
errno = ENODEV;
400073f0: 40 00 24 1a call 40010458 <__errno>
<== NOT EXECUTED
400073f4: 01 00 00 00 nop
<== NOT EXECUTED
400073f8: 84 10 20 13 mov 0x13, %g2 ! 13 <_TLS_Alignment+0x12>
<== NOT EXECUTED
return MAP_FAILED;
400073fc: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
40007400: 10 bf ff b5 b 400072d4 <mmap+0x238>
<== NOT EXECUTED
40007404: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
&& (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) {
40007408: c2 07 bf c0 ld [ %fp + -64 ], %g1
<== NOT EXECUTED
4000740c: 80 a0 40 10 cmp %g1, %l0
<== NOT EXECUTED
40007410: 04 80 00 55 ble 40007564 <mmap+0x4c8>
<== NOT EXECUTED
40007414: c8 07 bf c4 ld [ %fp + -60 ], %g4
<== NOT EXECUTED
40007418: 86 84 40 19 addcc %l1, %i1, %g3
<== NOT EXECUTED
4000741c: 84 44 20 00 addx %l0, 0, %g2
<== NOT EXECUTED
40007420: 80 a0 40 02 cmp %g1, %g2
<== NOT EXECUTED
40007424: 04 80 00 46 ble 4000753c <mmap+0x4a0>
<== NOT EXECUTED
40007428: 01 00 00 00 nop
<== NOT EXECUTED
if ( lseek( fildes, off, SEEK_SET ) < 0 ) {
4000742c: 96 10 20 00 clr %o3 ! 0 <PROM_START>
<== NOT EXECUTED
40007430: 92 10 00 10 mov %l0, %o1
<== NOT EXECUTED
40007434: 94 10 00 11 mov %l1, %o2
<== NOT EXECUTED
40007438: 40 00 1c 5c call 4000e5a8 <lseek>
<== NOT EXECUTED
4000743c: 90 10 00 1c mov %i4, %o0
<== NOT EXECUTED
40007440: 80 a2 20 00 cmp %o0, 0
<== NOT EXECUTED
40007444: 06 bf ff a4 bl 400072d4 <mmap+0x238>
<== NOT EXECUTED
40007448: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
4000744c: c2 07 bf ac ld [ %fp + -84 ], %g1
<== NOT EXECUTED
40007450: 2d 00 00 3c sethi %hi(0xf000), %l6
<== NOT EXECUTED
40007454: ac 08 40 16 and %g1, %l6, %l6
<== NOT EXECUTED
if ( S_ISCHR( sb.st_mode ) && map_private ) {
40007458: 09 00 00 08 sethi %hi(0x2000), %g4
4000745c: 2f 00 00 2c sethi %hi(0xb000), %l7
40007460: ae 08 40 17 and %g1, %l7, %l7
40007464: 82 1d c0 04 xor %l7, %g4, %g1
40007468: 80 a0 00 01 cmp %g0, %g1
4000746c: 84 60 3f ff subx %g0, -1, %g2
40007470: 80 a5 80 04 cmp %l6, %g4
40007474: 12 bf ff 61 bne 400071f8 <mmap+0x15c>
<== NEVER TAKEN
40007478: 86 10 00 02 mov %g2, %g3
4000747c: 80 8c e0 ff btst 0xff, %l3
40007480: 22 bf ff 5f be,a 400071fc <mmap+0x160>
40007484: c6 27 bf 9c st %g3, [ %fp + -100 ]
40007488: 30 bf ff 8e b,a 400072c0 <mmap+0x224>
errno = EBADF;
4000748c: 40 00 23 f3 call 40010458 <__errno>
<== NOT EXECUTED
40007490: 01 00 00 00 nop
<== NOT EXECUTED
40007494: 84 10 20 09 mov 9, %g2 ! 9 <_TLS_Alignment+0x8>
<== NOT EXECUTED
return MAP_FAILED;
40007498: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
4000749c: 10 bf ff 8e b 400072d4 <mmap+0x238>
<== NOT EXECUTED
400074a0: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
posix_memalign( &mapping->addr, PAGE_SIZE, len );
400074a4: 13 00 00 04 sethi %hi(0x1000), %o1
400074a8: 40 00 1c bf call 4000e7a4 <posix_memalign>
400074ac: 90 05 60 08 add %l5, 8, %o0
400074b0: c2 05 60 08 ld [ %l5 + 8 ], %g1
if ( !mapping->addr ) {
400074b4: 80 a0 60 00 cmp %g1, 0
400074b8: 02 80 00 6a be 40007660 <mmap+0x5c4>
<== NEVER TAKEN
400074bc: 01 00 00 00 nop
rtems_libio_lock();
400074c0: 7f ff f7 c3 call 400053cc <rtems_libio_lock>
400074c4: 01 00 00 00 nop
if ( !map_anonymous ) {
400074c8: 80 a7 60 00 cmp %i5, 0
400074cc: 32 80 00 2b bne,a 40007578 <mmap+0x4dc>
400074d0: d0 05 60 08 ld [ %l5 + 8 ], %o0
r = read( fildes, mapping->addr, len );
400074d4: d2 05 60 08 ld [ %l5 + 8 ], %o1
400074d8: 94 10 00 19 mov %i1, %o2
400074dc: 40 00 1c e7 call 4000e878 <read>
400074e0: 90 10 00 1c mov %i4, %o0
if ( r != len ) {
400074e4: 80 a2 00 19 cmp %o0, %i1
400074e8: 02 bf ff b2 be 400073b0 <mmap+0x314>
<== ALWAYS TAKEN
400074ec: 07 10 00 72 sethi %hi(0x4001c800), %g3
rtems_libio_unlock();
400074f0: 7f ff f7 bc call 400053e0 <rtems_libio_unlock>
<== NOT EXECUTED
400074f4: 01 00 00 00 nop
<== NOT EXECUTED
if ( !map_fixed ) {
400074f8: 80 a7 60 00 cmp %i5, 0
<== NOT EXECUTED
400074fc: 12 80 00 04 bne 4000750c <mmap+0x470>
<== NOT EXECUTED
40007500: 01 00 00 00 nop
<== NOT EXECUTED
free( mapping->addr );
40007504: 7f ff f6 fb call 400050f0 <free>
<== NOT EXECUTED
40007508: d0 05 60 08 ld [ %l5 + 8 ], %o0
<== NOT EXECUTED
free( mapping );
4000750c: 7f ff f6 f9 call 400050f0 <free>
<== NOT EXECUTED
40007510: 90 10 00 15 mov %l5, %o0
<== NOT EXECUTED
errno = ENXIO;
40007514: 40 00 23 d1 call 40010458 <__errno>
<== NOT EXECUTED
40007518: 01 00 00 00 nop
<== NOT EXECUTED
4000751c: 84 10 20 06 mov 6, %g2 ! 6 <_TLS_Alignment+0x5>
<== NOT EXECUTED
return MAP_FAILED;
40007520: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
40007524: 10 bf ff 6c b 400072d4 <mmap+0x238>
<== NOT EXECUTED
40007528: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) {
4000752c: 80 a0 60 00 cmp %g1, 0
40007530: 02 bf ff 62 be 400072b8 <mmap+0x21c>
<== ALWAYS TAKEN
40007534: 80 a0 e0 00 cmp %g3, 0
40007538: 30 bf ff 62 b,a 400072c0 <mmap+0x224>
<== NOT EXECUTED
&& (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) {
4000753c: 12 80 00 04 bne 4000754c <mmap+0x4b0>
<== NOT EXECUTED
40007540: 80 a1 00 03 cmp %g4, %g3
<== NOT EXECUTED
40007544: 18 bf ff bb bgu 40007430 <mmap+0x394>
<== NOT EXECUTED
40007548: 96 10 20 00 clr %o3
<== NOT EXECUTED
errno = EOVERFLOW;
4000754c: 40 00 23 c3 call 40010458 <__errno>
<== NOT EXECUTED
40007550: 01 00 00 00 nop
<== NOT EXECUTED
40007554: 84 10 20 8b mov 0x8b, %g2 ! 8b <_TLS_Alignment+0x8a>
<== NOT EXECUTED
return MAP_FAILED;
40007558: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
4000755c: 10 bf ff 5e b 400072d4 <mmap+0x238>
<== NOT EXECUTED
40007560: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
&& (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) {
40007564: 12 bf ff fa bne 4000754c <mmap+0x4b0>
<== NOT EXECUTED
40007568: 80 a1 00 11 cmp %g4, %l1
<== NOT EXECUTED
4000756c: 18 bf ff ac bgu 4000741c <mmap+0x380>
<== NOT EXECUTED
40007570: 86 84 40 19 addcc %l1, %i1, %g3
<== NOT EXECUTED
40007574: 30 bf ff f6 b,a 4000754c <mmap+0x4b0>
<== NOT EXECUTED
memset( mapping->addr, 0, len );
40007578: 94 10 00 19 mov %i1, %o2
4000757c: 40 00 25 64 call 40010b0c <memset>
40007580: 92 10 20 00 clr %o1
40007584: 07 10 00 72 sethi %hi(0x4001c800), %g3
40007588: 86 10 e2 e0 or %g3, 0x2e0, %g3 ! 4001cae0 <mmap_mappings+0x4>
4000758c: 10 bf ff 8b b 400073b8 <mmap+0x31c>
40007590: 88 00 ff fc add %g3, -4, %g4
if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) {
40007594: 80 a0 80 0d cmp %g2, %o5
40007598: 1a bf ff 0d bcc 400071cc <mmap+0x130>
<== ALWAYS TAKEN
4000759c: 05 3f ff e8 sethi %hi(0xffffa000), %g2
400075a0: 30 bf ff dd b,a 40007514 <mmap+0x478>
<== NOT EXECUTED
mapping->addr = addr;
400075a4: f0 25 60 08 st %i0, [ %l5 + 8 ]
iop = NULL;
400075a8: b6 10 20 00 clr %i3
rtems_libio_lock();
400075ac: 7f ff f7 88 call 400053cc <rtems_libio_lock>
400075b0: 01 00 00 00 nop
return _Chain_Immutable_head( the_chain )->next;
400075b4: 09 10 00 72 sethi %hi(0x4001c800), %g4
400075b8: c2 01 22 dc ld [ %g4 + 0x2dc ], %g1 ! 4001cadc <mmap_mappings>
400075bc: 88 11 22 dc or %g4, 0x2dc, %g4
while ( !rtems_chain_is_tail( &mmap_mappings, node )) {
400075c0: 86 01 20 04 add %g4, 4, %g3
400075c4: 80 a0 40 03 cmp %g1, %g3
400075c8: 02 80 00 10 be 40007608 <mmap+0x56c>
400075cc: 80 8c e0 ff btst 0xff, %l3
if ( ( addr >= current_mapping->addr ) &&
400075d0: c4 00 60 08 ld [ %g1 + 8 ], %g2
400075d4: 80 a0 80 18 cmp %g2, %i0
400075d8: 38 80 00 08 bgu,a 400075f8 <mmap+0x55c>
400075dc: c2 00 40 00 ld [ %g1 ], %g1
( addr < ( current_mapping->addr + current_mapping->len )) ) {
400075e0: de 00 60 0c ld [ %g1 + 0xc ], %o7
400075e4: 84 00 80 0f add %g2, %o7, %g2
if ( ( addr >= current_mapping->addr ) &&
400075e8: 80 a6 00 02 cmp %i0, %g2
400075ec: 0a 80 00 0d bcs 40007620 <mmap+0x584>
<== NEVER TAKEN
400075f0: 01 00 00 00 nop
400075f4: c2 00 40 00 ld [ %g1 ], %g1
while ( !rtems_chain_is_tail( &mmap_mappings, node )) {
400075f8: 80 a0 40 03 cmp %g1, %g3
400075fc: 32 bf ff f6 bne,a 400075d4 <mmap+0x538>
40007600: c4 00 60 08 ld [ %g1 + 8 ], %g2
if ( map_private ) {
40007604: 80 8c e0 ff btst 0xff, %l3
40007608: 02 80 00 19 be 4000766c <mmap+0x5d0>
<== NEVER TAKEN
4000760c: 80 a7 60 00 cmp %i5, 0
if ( !map_anonymous ) {
40007610: 32 bf ff 6b bne,a 400073bc <mmap+0x320>
<== ALWAYS TAKEN
40007614: c2 01 20 08 ld [ %g4 + 8 ], %g1
40007618: 10 bf ff af b 400074d4 <mmap+0x438>
<== NOT EXECUTED
4000761c: ba 10 00 14 mov %l4, %i5
<== NOT EXECUTED
free( mapping );
40007620: 7f ff f6 b4 call 400050f0 <free>
<== NOT EXECUTED
40007624: 90 10 00 15 mov %l5, %o0
<== NOT EXECUTED
rtems_libio_unlock();
40007628: 7f ff f7 6e call 400053e0 <rtems_libio_unlock>
<== NOT EXECUTED
4000762c: 01 00 00 00 nop
<== NOT EXECUTED
errno = ENXIO;
40007630: 40 00 23 8a call 40010458 <__errno>
<== NOT EXECUTED
40007634: 01 00 00 00 nop
<== NOT EXECUTED
40007638: 84 10 20 06 mov 6, %g2 ! 6 <_TLS_Alignment+0x5>
<== NOT EXECUTED
return MAP_FAILED;
4000763c: 82 10 3f ff mov -1, %g1
<== NOT EXECUTED
40007640: 10 bf ff 25 b 400072d4 <mmap+0x238>
<== NOT EXECUTED
40007644: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
40007648: 7f ff f7 66 call 400053e0 <rtems_libio_unlock>
4000764c: 01 00 00 00 nop
free( mapping );
40007650: 7f ff f6 a8 call 400050f0 <free>
40007654: 90 10 00 15 mov %l5, %o0
return MAP_FAILED;
40007658: 10 bf ff 1f b 400072d4 <mmap+0x238>
4000765c: 82 10 3f ff mov -1, %g1
free( mapping );
40007660: 7f ff f6 a4 call 400050f0 <free>
<== NOT EXECUTED
40007664: 90 10 00 15 mov %l5, %o0
<== NOT EXECUTED
40007668: 30 bf ff 2a b,a 40007310 <mmap+0x274>
<== NOT EXECUTED
} else if ( map_shared ) {
4000766c: 80 a4 a0 00 cmp %l2, 0
<== NOT EXECUTED
40007670: 12 bf ff 45 bne 40007384 <mmap+0x2e8>
<== NOT EXECUTED
40007674: 98 10 00 10 mov %l0, %o4
<== NOT EXECUTED
old_last = tail->previous;
40007678: 10 bf ff 51 b 400073bc <mmap+0x320>
<== NOT EXECUTED
4000767c: c2 01 20 08 ld [ %g4 + 8 ], %g1
<== NOT EXECUTED
400074d8 <mq_close>:
*/
int mq_close(
mqd_t mqdes
)
{
400074d8: 9d e3 bf 78 save %sp, -136, %sp
_RTEMS_Lock_allocator();
400074dc: 40 00 07 e0 call 4000945c <_RTEMS_Lock_allocator>
400074e0: 01 00 00 00 nop
Objects_Id id,
Thread_queue_Context *queue_context
)
{
_Thread_queue_Context_initialize( queue_context );
return (POSIX_Message_queue_Control *) _Objects_Get(
400074e4: 92 07 bf dc add %fp, -36, %o1
400074e8: 15 10 00 60 sethi %hi(0x40018000), %o2
400074ec: 90 10 00 18 mov %i0, %o0
400074f0: 40 00 12 76 call 4000bec8 <_Objects_Get>
400074f4: 94 12 a0 48 or %o2, 0x48, %o2
Thread_queue_Context queue_context;
_Objects_Allocator_lock();
the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context );
if ( the_mq == NULL ) {
400074f8: 84 92 20 00 orcc %o0, 0, %g2
400074fc: 02 80 00 11 be 40007540 <mq_close+0x68>
<== NEVER TAKEN
40007500: 01 00 00 00 nop
_CORE_message_queue_Acquire_critical(
&the_mq->Message_queue,
&queue_context
);
if ( the_mq->open_count == 0 ) {
40007504: c2 00 a0 50 ld [ %g2 + 0x50 ], %g1
40007508: 80 a0 60 00 cmp %g1, 0
4000750c: 02 80 00 0a be 40007534 <mq_close+0x5c>
40007510: 82 00 7f ff add %g1, -1, %g1
_CORE_message_queue_Release( &the_mq->Message_queue, &queue_context );
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq->open_count -= 1;
40007514: c2 20 a0 50 st %g1, [ %g2 + 0x50 ]
_POSIX_Message_queue_Delete( the_mq, &queue_context );
40007518: 92 07 bf dc add %fp, -36, %o1
4000751c: 40 00 00 11 call 40007560 <_POSIX_Message_queue_Delete>
40007520: b0 10 20 00 clr %i0
_RTEMS_Unlock_allocator();
40007524: 40 00 07 d3 call 40009470 <_RTEMS_Unlock_allocator>
40007528: 01 00 00 00 nop
_Objects_Allocator_unlock();
return 0;
}
4000752c: 81 c7 e0 08 ret
40007530: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007534: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007538: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000753c: 01 00 00 00 nop
40007540: 40 00 07 cc call 40009470 <_RTEMS_Unlock_allocator>
40007544: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
rtems_set_errno_and_return_minus_one( EBADF );
40007548: 40 00 2b 8e call 40012380 <__errno>
4000754c: 01 00 00 00 nop
40007550: 82 10 20 09 mov 9, %g1 ! 9 <_TLS_Alignment+0x8>
40007554: c2 22 00 00 st %g1, [ %o0 ]
40007558: 81 c7 e0 08 ret
4000755c: 81 e8 00 00 restore
4000b388 <mq_getattr>:
int mq_getattr(
mqd_t mqdes,
struct mq_attr *mqstat
)
{
4000b388: 9d e3 bf 78 save %sp, -136, %sp
POSIX_Message_queue_Control *the_mq;
Thread_queue_Context queue_context;
if ( mqstat == NULL ) {
4000b38c: 80 a6 60 00 cmp %i1, 0
4000b390: 02 80 00 23 be 4000b41c <mq_getattr+0x94>
4000b394: 92 07 bf dc add %fp, -36, %o1
return (POSIX_Message_queue_Control *) _Objects_Get(
4000b398: 15 10 00 ab sethi %hi(0x4002ac00), %o2
4000b39c: 90 10 00 18 mov %i0, %o0
4000b3a0: 40 00 10 4b call 4000f4cc <_Objects_Get>
4000b3a4: 94 12 a0 20 or %o2, 0x20, %o2
rtems_set_errno_and_return_minus_one( EINVAL );
}
the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context );
if ( the_mq == NULL ) {
4000b3a8: 80 a2 20 00 cmp %o0, 0
4000b3ac: 02 80 00 16 be 4000b404 <mq_getattr+0x7c>
<== NEVER TAKEN
4000b3b0: 01 00 00 00 nop
_CORE_message_queue_Acquire_critical(
&the_mq->Message_queue,
&queue_context
);
if ( the_mq->open_count == 0 ) {
4000b3b4: c2 02 20 50 ld [ %o0 + 0x50 ], %g1
4000b3b8: 80 a0 60 00 cmp %g1, 0
4000b3bc: 02 80 00 0f be 4000b3f8 <mq_getattr+0x70>
4000b3c0: 01 00 00 00 nop
}
/*
* Return the old values.
*/
mqstat->mq_flags = the_mq->oflag;
4000b3c4: c8 02 20 68 ld [ %o0 + 0x68 ], %g4
<== NOT EXECUTED
mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
4000b3c8: c6 02 20 28 ld [ %o0 + 0x28 ], %g3
<== NOT EXECUTED
mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
4000b3cc: c4 02 20 20 ld [ %o0 + 0x20 ], %g2
<== NOT EXECUTED
mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
4000b3d0: c2 02 20 24 ld [ %o0 + 0x24 ], %g1
<== NOT EXECUTED
4000b3d4: c2 26 60 0c st %g1, [ %i1 + 0xc ]
<== NOT EXECUTED
mqstat->mq_flags = the_mq->oflag;
4000b3d8: c8 26 40 00 st %g4, [ %i1 ]
<== NOT EXECUTED
mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
4000b3dc: c6 26 60 08 st %g3, [ %i1 + 8 ]
<== NOT EXECUTED
mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
4000b3e0: c4 26 60 04 st %g2, [ %i1 + 4 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000b3e4: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b3e8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b3ec: 01 00 00 00 nop
_CORE_message_queue_Release( &the_mq->Message_queue, &queue_context );
return 0;
}
4000b3f0: 81 c7 e0 08 ret
4000b3f4: 91 e8 20 00 restore %g0, 0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000b3f8: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b3fc: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b400: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
4000b404: 40 00 2b 90 call 40016244 <__errno>
4000b408: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
4000b40c: 82 10 20 09 mov 9, %g1
4000b410: c2 22 00 00 st %g1, [ %o0 ]
4000b414: 81 c7 e0 08 ret
4000b418: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( EINVAL );
4000b41c: 40 00 2b 8a call 40016244 <__errno>
4000b420: b0 10 3f ff mov -1, %i0
4000b424: 82 10 20 16 mov 0x16, %g1
4000b428: c2 22 00 00 st %g1, [ %o0 ]
4000b42c: 81 c7 e0 08 ret
4000b430: 81 e8 00 00 restore
4000b45c <mq_notify>:
int mq_notify(
mqd_t mqdes,
const struct sigevent *notification
)
{
4000b45c: 9d e3 bf 78 save %sp, -136, %sp
4000b460: 15 10 00 ab sethi %hi(0x4002ac00), %o2
4000b464: 92 07 bf dc add %fp, -36, %o1
4000b468: 94 12 a0 20 or %o2, 0x20, %o2
4000b46c: 40 00 10 18 call 4000f4cc <_Objects_Get>
4000b470: 90 10 00 18 mov %i0, %o0
POSIX_Message_queue_Control *the_mq;
Thread_queue_Context queue_context;
the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context );
if ( the_mq == NULL ) {
4000b474: 80 a2 20 00 cmp %o0, 0
4000b478: 02 80 00 2f be 4000b534 <mq_notify+0xd8>
<== NEVER TAKEN
4000b47c: 01 00 00 00 nop
_CORE_message_queue_Acquire_critical(
&the_mq->Message_queue,
&queue_context
);
if ( the_mq->open_count == 0 ) {
4000b480: c2 02 20 50 ld [ %o0 + 0x50 ], %g1
4000b484: 80 a0 60 00 cmp %g1, 0
4000b488: 02 80 00 28 be 4000b528 <mq_notify+0xcc>
4000b48c: 80 a6 60 00 cmp %i1, 0
_CORE_message_queue_Release( &the_mq->Message_queue, &queue_context );
rtems_set_errno_and_return_minus_one( EBADF );
}
if ( notification != NULL ) {
4000b490: 22 80 00 18 be,a 4000b4f0 <mq_notify+0x94>
4000b494: c0 22 20 3c clr [ %o0 + 0x3c ]
if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) {
4000b498: c2 02 20 3c ld [ %o0 + 0x3c ], %g1
4000b49c: 80 a0 60 00 cmp %g1, 0
4000b4a0: 12 80 00 19 bne 4000b504 <mq_notify+0xa8>
4000b4a4: 01 00 00 00 nop
_CORE_message_queue_Release( &the_mq->Message_queue, &queue_context );
rtems_set_errno_and_return_minus_one( EBUSY );
}
the_mq->notification = *notification;
4000b4a8: c2 06 40 00 ld [ %i1 ], %g1
<== NOT EXECUTED
4000b4ac: c2 22 20 54 st %g1, [ %o0 + 0x54 ]
<== NOT EXECUTED
4000b4b0: c2 06 60 04 ld [ %i1 + 4 ], %g1
<== NOT EXECUTED
4000b4b4: c2 22 20 58 st %g1, [ %o0 + 0x58 ]
<== NOT EXECUTED
4000b4b8: c2 06 60 08 ld [ %i1 + 8 ], %g1
<== NOT EXECUTED
4000b4bc: c2 22 20 5c st %g1, [ %o0 + 0x5c ]
<== NOT EXECUTED
4000b4c0: c2 06 60 0c ld [ %i1 + 0xc ], %g1
<== NOT EXECUTED
4000b4c4: c2 22 20 60 st %g1, [ %o0 + 0x60 ]
<== NOT EXECUTED
4000b4c8: c2 06 60 10 ld [ %i1 + 0x10 ], %g1
<== NOT EXECUTED
4000b4cc: c2 22 20 64 st %g1, [ %o0 + 0x64 ]
<== NOT EXECUTED
4000b4d0: 03 10 00 2d sethi %hi(0x4000b400), %g1
<== NOT EXECUTED
4000b4d4: 82 10 60 34 or %g1, 0x34, %g1 ! 4000b434 <_POSIX_Message_queue_Notify_handler>
<== NOT EXECUTED
4000b4d8: c2 22 20 3c st %g1, [ %o0 + 0x3c ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000b4dc: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b4e0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b4e4: 01 00 00 00 nop
_CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL );
}
_CORE_message_queue_Release( &the_mq->Message_queue, &queue_context );
return 0;
}
4000b4e8: 81 c7 e0 08 ret
4000b4ec: 91 e8 20 00 restore %g0, 0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000b4f0: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b4f4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b4f8: 01 00 00 00 nop
4000b4fc: 81 c7 e0 08 ret
4000b500: 91 e8 20 00 restore %g0, 0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000b504: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b508: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b50c: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBUSY );
4000b510: 40 00 2b 4d call 40016244 <__errno>
4000b514: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
4000b518: 82 10 20 10 mov 0x10, %g1
4000b51c: c2 22 00 00 st %g1, [ %o0 ]
4000b520: 81 c7 e0 08 ret
4000b524: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000b528: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b52c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b530: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
4000b534: 40 00 2b 44 call 40016244 <__errno>
4000b538: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
4000b53c: 82 10 20 09 mov 9, %g1
4000b540: c2 22 00 00 st %g1, [ %o0 ]
4000b544: 81 c7 e0 08 ret
4000b548: 81 e8 00 00 restore
4000b9b4 <mq_setattr>:
int mq_setattr(
mqd_t mqdes,
const struct mq_attr *__restrict mqstat,
struct mq_attr *__restrict omqstat
)
{
4000b9b4: 9d e3 bf 78 save %sp, -136, %sp
POSIX_Message_queue_Control *the_mq;
Thread_queue_Context queue_context;
if ( mqstat == NULL ) {
4000b9b8: 80 a6 60 00 cmp %i1, 0
4000b9bc: 02 80 00 27 be 4000ba58 <mq_setattr+0xa4>
4000b9c0: 92 07 bf dc add %fp, -36, %o1
4000b9c4: 15 10 00 ab sethi %hi(0x4002ac00), %o2
4000b9c8: 90 10 00 18 mov %i0, %o0
4000b9cc: 40 00 0e c0 call 4000f4cc <_Objects_Get>
4000b9d0: 94 12 a0 20 or %o2, 0x20, %o2
rtems_set_errno_and_return_minus_one( EINVAL );
}
the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context );
if ( the_mq == NULL ) {
4000b9d4: 80 a2 20 00 cmp %o0, 0
4000b9d8: 02 80 00 1a be 4000ba40 <mq_setattr+0x8c>
<== NEVER TAKEN
4000b9dc: 01 00 00 00 nop
_CORE_message_queue_Acquire_critical(
&the_mq->Message_queue,
&queue_context
);
if ( the_mq->open_count == 0 ) {
4000b9e0: c2 02 20 50 ld [ %o0 + 0x50 ], %g1
4000b9e4: 80 a0 60 00 cmp %g1, 0
4000b9e8: 02 80 00 13 be 4000ba34 <mq_setattr+0x80>
4000b9ec: 80 a6 a0 00 cmp %i2, 0
/*
* Return the old values.
*/
if ( omqstat != NULL ) {
4000b9f0: 22 80 00 0b be,a 4000ba1c <mq_setattr+0x68>
4000b9f4: c2 06 40 00 ld [ %i1 ], %g1
omqstat->mq_flags = the_mq->oflag;
4000b9f8: c8 02 20 68 ld [ %o0 + 0x68 ], %g4
<== NOT EXECUTED
omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
4000b9fc: c6 02 20 28 ld [ %o0 + 0x28 ], %g3
<== NOT EXECUTED
omqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
4000ba00: c4 02 20 20 ld [ %o0 + 0x20 ], %g2
<== NOT EXECUTED
omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
4000ba04: c2 02 20 24 ld [ %o0 + 0x24 ], %g1
<== NOT EXECUTED
omqstat->mq_flags = the_mq->oflag;
4000ba08: c8 26 80 00 st %g4, [ %i2 ]
<== NOT EXECUTED
omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
4000ba0c: c6 26 a0 08 st %g3, [ %i2 + 8 ]
<== NOT EXECUTED
omqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
4000ba10: c4 26 a0 04 st %g2, [ %i2 + 4 ]
<== NOT EXECUTED
omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
4000ba14: c2 26 a0 0c st %g1, [ %i2 + 0xc ]
<== NOT EXECUTED
}
the_mq->oflag = mqstat->mq_flags;
4000ba18: c2 06 40 00 ld [ %i1 ], %g1
<== NOT EXECUTED
4000ba1c: c2 22 20 68 st %g1, [ %o0 + 0x68 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000ba20: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000ba24: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000ba28: 01 00 00 00 nop
_CORE_message_queue_Release( &the_mq->Message_queue, &queue_context );
return 0;
}
4000ba2c: 81 c7 e0 08 ret
4000ba30: 91 e8 20 00 restore %g0, 0, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000ba34: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000ba38: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000ba3c: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EBADF );
4000ba40: 40 00 2a 01 call 40016244 <__errno>
4000ba44: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
4000ba48: 82 10 20 09 mov 9, %g1
4000ba4c: c2 22 00 00 st %g1, [ %o0 ]
4000ba50: 81 c7 e0 08 ret
4000ba54: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( EINVAL );
4000ba58: 40 00 29 fb call 40016244 <__errno>
4000ba5c: b0 10 3f ff mov -1, %i0
4000ba60: 82 10 20 16 mov 0x16, %g1
4000ba64: c2 22 00 00 st %g1, [ %o0 ]
4000ba68: 81 c7 e0 08 ret
4000ba6c: 81 e8 00 00 restore
40007a40 <mq_unlink>:
*/
int mq_unlink(
const char *name
)
{
40007a40: 9d e3 bf 78 save %sp, -136, %sp
_RTEMS_Lock_allocator();
40007a44: 40 00 06 86 call 4000945c <_RTEMS_Lock_allocator>
40007a48: 39 10 00 60 sethi %hi(0x40018000), %i4
return (POSIX_Message_queue_Control *) _Objects_Get_by_name(
40007a4c: 96 07 bf d8 add %fp, -40, %o3
40007a50: 94 10 20 00 clr %o2
40007a54: 92 10 00 18 mov %i0, %o1
40007a58: 40 00 11 81 call 4000c05c <_Objects_Get_by_name>
40007a5c: 90 17 20 48 or %i4, 0x48, %o0
Thread_queue_Context queue_context;
_Objects_Allocator_lock();
the_mq = _POSIX_Message_queue_Get_by_name( name, NULL, &error );
if ( the_mq == NULL ) {
40007a60: ba 92 20 00 orcc %o0, 0, %i5
40007a64: 02 80 00 0f be 40007aa0 <mq_unlink+0x60>
40007a68: 92 10 00 1d mov %i5, %o1
_Objects_Namespace_remove(
40007a6c: 40 00 11 72 call 4000c034 <_Objects_Namespace_remove>
40007a70: 90 17 20 48 or %i4, 0x48, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007a74: 91 d0 20 09 ta 9
<== NOT EXECUTED
Thread_queue_Control *the_thread_queue,
Thread_queue_Context *queue_context
)
{
(void) the_thread_queue;
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40007a78: c2 27 bf dc st %g1, [ %fp + -36 ]
_POSIX_Message_queue_Namespace_remove( the_mq );
_CORE_message_queue_Acquire( &the_mq->Message_queue, &queue_context );
the_mq->linked = false;
40007a7c: c0 2f 60 4c clrb [ %i5 + 0x4c ]
_POSIX_Message_queue_Delete( the_mq, &queue_context );
40007a80: 92 07 bf dc add %fp, -36, %o1
40007a84: 90 10 00 1d mov %i5, %o0
40007a88: 7f ff fe b6 call 40007560 <_POSIX_Message_queue_Delete>
40007a8c: b0 10 20 00 clr %i0
_RTEMS_Unlock_allocator();
40007a90: 40 00 06 78 call 40009470 <_RTEMS_Unlock_allocator>
40007a94: 01 00 00 00 nop
_Objects_Allocator_unlock();
return 0;
}
40007a98: 81 c7 e0 08 ret
40007a9c: 81 e8 00 00 restore
40007aa0: 40 00 06 74 call 40009470 <_RTEMS_Unlock_allocator>
40007aa4: b0 10 3f ff mov -1, %i0
rtems_set_errno_and_return_minus_one( _POSIX_Get_by_name_error( error ) );
40007aa8: 40 00 2a 36 call 40012380 <__errno>
40007aac: fa 07 bf d8 ld [ %fp + -40 ], %i5
return _POSIX_Get_by_name_error_table[ error ];
40007ab0: bb 2f 60 02 sll %i5, 2, %i5
40007ab4: 03 10 00 52 sethi %hi(0x40014800), %g1
40007ab8: 82 10 60 ac or %g1, 0xac, %g1 ! 400148ac <_POSIX_Get_by_name_error_table>
40007abc: c2 00 40 1d ld [ %g1 + %i5 ], %g1
40007ac0: c2 22 00 00 st %g1, [ %o0 ]
40007ac4: 81 c7 e0 08 ret
40007ac8: 81 e8 00 00 restore
40007680 <munmap>:
#include <rtems/posix/mmanimpl.h>
#include <rtems/posix/shmimpl.h>
int munmap(void *addr, size_t len)
{
40007680: 9d e3 bf 98 save %sp, -104, %sp
rtems_chain_node *node;
/*
* Clear errno.
*/
errno = 0;
40007684: 40 00 23 75 call 40010458 <__errno>
40007688: 01 00 00 00 nop
/*
* Length cannot be 0.
*/
if ( len == 0 ) {
4000768c: 80 a6 60 00 cmp %i1, 0
40007690: 02 80 00 52 be 400077d8 <munmap+0x158>
<== NEVER TAKEN
40007694: c0 22 00 00 clr [ %o0 ]
errno = EINVAL;
return -1;
}
/* Check for illegal addresses. Watch out for address wrap. */
if (addr + len < addr) {
40007698: 06 80 00 50 bl 400077d8 <munmap+0x158>
<== NEVER TAKEN
4000769c: 01 00 00 00 nop
rtems_libio_lock();
400076a0: 7f ff f7 4b call 400053cc <rtems_libio_lock>
400076a4: 01 00 00 00 nop
return _Chain_Immutable_head( the_chain )->next;
400076a8: 05 10 00 72 sethi %hi(0x4001c800), %g2
400076ac: fa 00 a2 dc ld [ %g2 + 0x2dc ], %i5 ! 4001cadc <mmap_mappings>
400076b0: 84 10 a2 dc or %g2, 0x2dc, %g2
}
mmap_mappings_lock_obtain();
node = rtems_chain_first (&mmap_mappings);
while ( !rtems_chain_is_tail( &mmap_mappings, node )) {
400076b4: 84 00 a0 04 add %g2, 4, %g2
400076b8: 80 a7 40 02 cmp %i5, %g2
400076bc: 02 80 00 0f be 400076f8 <munmap+0x78>
<== NEVER TAKEN
400076c0: 01 00 00 00 nop
mapping = (mmap_mapping*) node;
if ( ( addr >= mapping->addr ) &&
400076c4: c2 07 60 08 ld [ %i5 + 8 ], %g1
400076c8: 80 a0 40 18 cmp %g1, %i0
400076cc: 38 80 00 08 bgu,a 400076ec <munmap+0x6c>
400076d0: fa 07 40 00 ld [ %i5 ], %i5
( addr < ( mapping->addr + mapping->len )) ) {
400076d4: c6 07 60 0c ld [ %i5 + 0xc ], %g3
400076d8: 82 00 40 03 add %g1, %g3, %g1
if ( ( addr >= mapping->addr ) &&
400076dc: 80 a6 00 01 cmp %i0, %g1
400076e0: 2a 80 00 0a bcs,a 40007708 <munmap+0x88>
400076e4: c4 07 40 00 ld [ %i5 ], %g2
400076e8: fa 07 40 00 ld [ %i5 ], %i5
while ( !rtems_chain_is_tail( &mmap_mappings, node )) {
400076ec: 80 a7 40 02 cmp %i5, %g2
400076f0: 32 bf ff f6 bne,a 400076c8 <munmap+0x48>
<== ALWAYS TAKEN
400076f4: c2 07 60 08 ld [ %i5 + 8 ], %g1
rtems_libio_unlock();
400076f8: 7f ff f7 3a call 400053e0 <rtems_libio_unlock>
<== NOT EXECUTED
400076fc: b0 10 20 00 clr %i0
<== NOT EXECUTED
node = rtems_chain_next( node );
}
mmap_mappings_lock_release( );
return 0;
}
40007700: 81 c7 e0 08 ret
<== NOT EXECUTED
40007704: 81 e8 00 00 restore
<== NOT EXECUTED
previous = the_node->previous;
40007708: c2 07 60 04 ld [ %i5 + 4 ], %g1
next->previous = previous;
4000770c: c2 20 a0 04 st %g1, [ %g2 + 4 ]
previous->next = next;
40007710: c4 20 40 00 st %g2, [ %g1 ]
if ( mapping->shm != NULL ) {
40007714: f8 07 60 14 ld [ %i5 + 0x14 ], %i4
40007718: 80 a7 20 00 cmp %i4, 0
4000771c: 22 80 00 1b be,a 40007788 <munmap+0x108>
40007720: c2 07 60 10 ld [ %i5 + 0x10 ], %g1
_RTEMS_Lock_allocator();
40007724: 40 00 02 97 call 40008180 <_RTEMS_Lock_allocator>
40007728: 01 00 00 00 nop
int err;
err = 0;
_Objects_Allocator_lock();
--shm->reference_count;
4000772c: c2 07 20 1c ld [ %i4 + 0x1c ], %g1
40007730: 82 00 7f ff add %g1, -1, %g1
if ( shm->reference_count == 0 ) {
40007734: 80 a0 60 00 cmp %g1, 0
40007738: 12 80 00 06 bne 40007750 <munmap+0xd0>
<== ALWAYS TAKEN
4000773c: c2 27 20 1c st %g1, [ %i4 + 0x1c ]
if ( (*shm->shm_object.ops->object_delete)( &shm->shm_object ) != 0 ) {
40007740: c2 07 20 28 ld [ %i4 + 0x28 ], %g1
<== NOT EXECUTED
40007744: c2 00 60 08 ld [ %g1 + 8 ], %g1
<== NOT EXECUTED
40007748: 9f c0 40 00 call %g1
<== NOT EXECUTED
4000774c: 90 07 20 20 add %i4, 0x20, %o0
<== NOT EXECUTED
err = EIO;
}
}
/* check if the object has been unlinked yet. */
obj = _Objects_Get( shm->Object.id, &lock_ctx, &_POSIX_Shm_Information );
40007750: d0 07 20 08 ld [ %i4 + 8 ], %o0
40007754: 37 10 00 7d sethi %hi(0x4001f400), %i3
40007758: 92 07 bf fc add %fp, -4, %o1
4000775c: 40 00 0a fb call 4000a348 <_Objects_Get>
40007760: 94 16 e0 34 or %i3, 0x34, %o2
if ( obj == NULL ) {
40007764: 80 a2 20 00 cmp %o0, 0
40007768: 02 80 00 16 be 400077c0 <munmap+0x140>
<== NEVER TAKEN
4000776c: 92 10 00 1c mov %i4, %o1
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007770: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007774: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007778: 01 00 00 00 nop
_RTEMS_Unlock_allocator();
4000777c: 40 00 02 86 call 40008194 <_RTEMS_Unlock_allocator>
40007780: 01 00 00 00 nop
if (( mapping->flags & MAP_SHARED ) != MAP_SHARED ) {
40007784: c2 07 60 10 ld [ %i5 + 0x10 ], %g1
40007788: 80 88 60 11 btst 0x11, %g1
4000778c: 02 80 00 09 be 400077b0 <munmap+0x130>
40007790: 01 00 00 00 nop
free( mapping );
40007794: 90 10 00 1d mov %i5, %o0
40007798: 7f ff f6 56 call 400050f0 <free>
4000779c: b0 10 20 00 clr %i0
400077a0: 7f ff f7 10 call 400053e0 <rtems_libio_unlock>
400077a4: 01 00 00 00 nop
}
400077a8: 81 c7 e0 08 ret
400077ac: 81 e8 00 00 restore
free( mapping->addr );
400077b0: 7f ff f6 50 call 400050f0 <free>
400077b4: d0 07 60 08 ld [ %i5 + 8 ], %o0
free( mapping );
400077b8: 10 bf ff f8 b 40007798 <munmap+0x118>
400077bc: 90 10 00 1d mov %i5, %o0
_Objects_Free( &_POSIX_Shm_Information, &the_shm->Object );
400077c0: 40 00 0a b6 call 4000a298 <_Objects_Free>
<== NOT EXECUTED
400077c4: 90 16 e0 34 or %i3, 0x34, %o0
<== NOT EXECUTED
400077c8: 40 00 02 73 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
400077cc: 01 00 00 00 nop
<== NOT EXECUTED
if (( mapping->flags & MAP_SHARED ) != MAP_SHARED ) {
400077d0: 10 bf ff ee b 40007788 <munmap+0x108>
<== NOT EXECUTED
400077d4: c2 07 60 10 ld [ %i5 + 0x10 ], %g1
<== NOT EXECUTED
errno = EINVAL;
400077d8: 40 00 23 20 call 40010458 <__errno>
<== NOT EXECUTED
400077dc: b0 10 3f ff mov -1, %i0
<== NOT EXECUTED
400077e0: 82 10 20 16 mov 0x16, %g1
<== NOT EXECUTED
400077e4: c2 22 00 00 st %g1, [ %o0 ]
<== NOT EXECUTED
return -1;
400077e8: 81 c7 e0 08 ret
<== NOT EXECUTED
400077ec: 81 e8 00 00 restore
<== NOT EXECUTED
40006a10 <pthread_attr_getaffinity_np>:
const pthread_attr_t *attr,
size_t cpusetsize,
cpu_set_t *cpuset
)
{
if ( attr == NULL || !attr->is_initialized ) {
40006a10: 82 92 20 00 orcc %o0, 0, %g1
40006a14: 22 80 00 12 be,a 40006a5c <pthread_attr_getaffinity_np+0x4c>
<== NEVER TAKEN
40006a18: 90 10 20 16 mov 0x16, %o0
<== NOT EXECUTED
40006a1c: c4 00 40 00 ld [ %g1 ], %g2
return EINVAL;
}
if ( cpuset == NULL || cpusetsize != attr->affinitysetsize ) {
40006a20: 80 a0 a0 00 cmp %g2, 0
40006a24: 02 80 00 0d be 40006a58 <pthread_attr_getaffinity_np+0x48>
<== NEVER TAKEN
40006a28: 80 a2 a0 00 cmp %o2, 0
40006a2c: 02 80 00 0c be 40006a5c <pthread_attr_getaffinity_np+0x4c>
<== NEVER TAKEN
40006a30: 90 10 20 16 mov 0x16, %o0
40006a34: c4 00 60 54 ld [ %g1 + 0x54 ], %g2
40006a38: 80 a0 80 09 cmp %g2, %o1
40006a3c: 12 80 00 08 bne 40006a5c <pthread_attr_getaffinity_np+0x4c>
<== NEVER TAKEN
40006a40: 01 00 00 00 nop
return CPU_ISSET_S(cpu, sizeof(*set), set);
}
static __inline void CPU_COPY(const cpu_set_t *src, cpu_set_t *dest)
{
BIT_COPY(_cpu_set_bits(setsize), src, dest);
40006a44: c2 00 60 58 ld [ %g1 + 0x58 ], %g1
40006a48: c2 00 40 00 ld [ %g1 ], %g1
40006a4c: c2 22 80 00 st %g1, [ %o2 ]
return EINVAL;
}
CPU_COPY( attr->affinityset, cpuset );
return 0;
40006a50: 81 c3 e0 08 retl
40006a54: 90 10 20 00 clr %o0
return EINVAL;
40006a58: 90 10 20 16 mov 0x16, %o0
<== NOT EXECUTED
}
40006a5c: 81 c3 e0 08 retl
<== NOT EXECUTED
40006a60: 01 00 00 00 nop
<== NOT EXECUTED
400066fc <pthread_attr_setaffinity_np>:
pthread_attr_t *attr,
size_t cpusetsize,
const cpu_set_t *cpuset
)
{
if ( attr == NULL || !attr->is_initialized ) {
400066fc: 82 92 20 00 orcc %o0, 0, %g1
40006700: 22 80 00 12 be,a 40006748 <pthread_attr_setaffinity_np+0x4c>
<== NEVER TAKEN
40006704: 90 10 20 16 mov 0x16, %o0
<== NOT EXECUTED
40006708: c4 00 40 00 ld [ %g1 ], %g2
return EINVAL;
}
if ( cpuset == NULL || cpusetsize != attr->affinitysetsize ) {
4000670c: 80 a0 a0 00 cmp %g2, 0
40006710: 02 80 00 0d be 40006744 <pthread_attr_setaffinity_np+0x48>
<== NEVER TAKEN
40006714: 80 a2 a0 00 cmp %o2, 0
40006718: 02 80 00 0c be 40006748 <pthread_attr_setaffinity_np+0x4c>
<== NEVER TAKEN
4000671c: 90 10 20 16 mov 0x16, %o0
40006720: c4 00 60 54 ld [ %g1 + 0x54 ], %g2
40006724: 80 a0 80 09 cmp %g2, %o1
40006728: 12 80 00 08 bne 40006748 <pthread_attr_setaffinity_np+0x4c>
<== NEVER TAKEN
4000672c: 01 00 00 00 nop
40006730: c2 00 60 58 ld [ %g1 + 0x58 ], %g1
40006734: c4 02 80 00 ld [ %o2 ], %g2
40006738: c4 20 40 00 st %g2, [ %g1 ]
return EINVAL;
}
CPU_COPY( cpuset, attr->affinityset );
return 0;
4000673c: 81 c3 e0 08 retl
40006740: 90 10 20 00 clr %o0
return EINVAL;
40006744: 90 10 20 16 mov 0x16, %o0
<== NOT EXECUTED
}
40006748: 81 c3 e0 08 retl
<== NOT EXECUTED
4000674c: 01 00 00 00 nop
<== NOT EXECUTED
4000aaf4 <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
4000aaf4: 82 92 20 00 orcc %o0, 0, %g1
4000aaf8: 02 80 00 10 be 4000ab38 <pthread_attr_setschedpolicy+0x44>
4000aafc: 90 10 20 16 mov 0x16, %o0
4000ab00: c4 00 40 00 ld [ %g1 ], %g2
4000ab04: 80 a0 a0 00 cmp %g2, 0
4000ab08: 02 80 00 0c be 4000ab38 <pthread_attr_setschedpolicy+0x44>
4000ab0c: 80 a2 60 04 cmp %o1, 4
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
4000ab10: 18 80 00 0a bgu 4000ab38 <pthread_attr_setschedpolicy+0x44>
4000ab14: 90 10 20 86 mov 0x86, %o0
4000ab18: 84 10 20 01 mov 1, %g2
4000ab1c: 85 28 80 09 sll %g2, %o1, %g2
4000ab20: 80 88 a0 17 btst 0x17, %g2
4000ab24: 02 80 00 05 be 4000ab38 <pthread_attr_setschedpolicy+0x44>
<== NEVER TAKEN
4000ab28: 01 00 00 00 nop
attr->schedpolicy = policy;
4000ab2c: d2 20 60 14 st %o1, [ %g1 + 0x14 ]
return 0;
4000ab30: 81 c3 e0 08 retl
4000ab34: 90 10 20 00 clr %o0
}
}
4000ab38: 81 c3 e0 08 retl
4000ab3c: 01 00 00 00 nop
40006a74 <pthread_barrier_destroy>:
int pthread_barrier_destroy( pthread_barrier_t *_barrier )
{
POSIX_Barrier_Control *barrier;
Thread_queue_Context queue_context;
POSIX_BARRIER_VALIDATE_OBJECT( _barrier );
40006a74: 84 92 20 00 orcc %o0, 0, %g2
40006a78: 02 80 00 12 be 40006ac0 <pthread_barrier_destroy+0x4c>
40006a7c: 03 07 3c 0d sethi %hi(0x1cf03400), %g1
40006a80: c6 00 80 00 ld [ %g2 ], %g3
40006a84: 82 10 63 73 or %g1, 0x373, %g1
40006a88: 82 18 80 01 xor %g2, %g1, %g1
40006a8c: 80 a0 40 03 cmp %g1, %g3
40006a90: 12 80 00 0d bne 40006ac4 <pthread_barrier_destroy+0x50>
40006a94: 90 10 20 16 mov 0x16, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006a98: 91 d0 20 09 ta 9
<== NOT EXECUTED
barrier = _POSIX_Barrier_Get( _barrier );
_POSIX_Barrier_Queue_acquire( barrier, &queue_context );
if ( barrier->waiting_threads != 0 ) {
40006a9c: c6 00 a0 1c ld [ %g2 + 0x1c ], %g3
40006aa0: 80 a0 e0 00 cmp %g3, 0
40006aa4: 12 80 00 0a bne 40006acc <pthread_barrier_destroy+0x58>
40006aa8: 01 00 00 00 nop
_POSIX_Barrier_Queue_release( barrier, &queue_context );
return EBUSY;
}
barrier->flags = 0;
40006aac: c0 20 80 00 clr [ %g2 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006ab0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006ab4: 01 00 00 00 nop
_POSIX_Barrier_Queue_release( barrier, &queue_context );
return 0;
40006ab8: 81 c3 e0 08 retl
40006abc: 90 10 20 00 clr %o0 ! 0 <PROM_START>
POSIX_BARRIER_VALIDATE_OBJECT( _barrier );
40006ac0: 90 10 20 16 mov 0x16, %o0
}
40006ac4: 81 c3 e0 08 retl
40006ac8: 01 00 00 00 nop
40006acc: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006ad0: 01 00 00 00 nop
return EBUSY;
40006ad4: 81 c3 e0 08 retl
40006ad8: 90 10 20 10 mov 0x10, %o0 ! 10 <_TLS_Alignment+0xf>
40006b50 <pthread_barrier_wait>:
#include <rtems/posix/barrierimpl.h>
#include <rtems/posix/posixapi.h>
int pthread_barrier_wait( pthread_barrier_t *_barrier )
{
40006b50: 9d e3 bf 78 save %sp, -136, %sp
POSIX_Barrier_Control *barrier;
Thread_queue_Context queue_context;
Thread_Control *executing;
unsigned int waiting_threads;
POSIX_BARRIER_VALIDATE_OBJECT( _barrier );
40006b54: 84 96 20 00 orcc %i0, 0, %g2
40006b58: 02 80 00 1e be 40006bd0 <pthread_barrier_wait+0x80>
40006b5c: 03 07 3c 0d sethi %hi(0x1cf03400), %g1
40006b60: c6 00 80 00 ld [ %g2 ], %g3
40006b64: 82 10 63 73 or %g1, 0x373, %g1
40006b68: 82 18 80 01 xor %g2, %g1, %g1
40006b6c: 80 a0 40 03 cmp %g1, %g3
40006b70: 12 80 00 16 bne 40006bc8 <pthread_barrier_wait+0x78>
40006b74: b0 10 20 16 mov 0x16, %i0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006b78: 91 d0 20 09 ta 9
<== NOT EXECUTED
)
{
#if defined( RTEMS_SMP )
context->Lock_context.isr_level = level;
#else
context->isr_level = level;
40006b7c: c2 27 bf dc st %g1, [ %fp + -36 ]
40006b80: 90 00 a0 0c add %g2, 0xc, %o0
barrier = _POSIX_Barrier_Get( _barrier );
executing = _POSIX_Barrier_Queue_acquire( barrier, &queue_context );
waiting_threads = barrier->waiting_threads;
40006b84: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1
++waiting_threads;
if ( waiting_threads == barrier->count ) {
40006b88: c6 00 a0 18 ld [ %g2 + 0x18 ], %g3
++waiting_threads;
40006b8c: 82 00 60 01 inc %g1
if ( waiting_threads == barrier->count ) {
40006b90: 80 a0 c0 01 cmp %g3, %g1
40006b94: 02 80 00 11 be 40006bd8 <pthread_barrier_wait+0x88>
40006b98: d4 01 a0 20 ld [ %g6 + 0x20 ], %o2
_Thread_queue_Flush_default_filter,
&queue_context
);
return PTHREAD_BARRIER_SERIAL_THREAD;
} else {
barrier->waiting_threads = waiting_threads;
40006b9c: c2 20 a0 1c st %g1, [ %g2 + 0x1c ]
queue_context->thread_state = thread_state;
40006ba0: 82 10 28 00 mov 0x800, %g1
40006ba4: c2 27 bf e0 st %g1, [ %fp + -32 ]
queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing_extra;
40006ba8: 03 10 00 2d sethi %hi(0x4000b400), %g1
40006bac: 82 10 61 a8 or %g1, 0x1a8, %g1 ! 4000b5a8 <_Thread_queue_Enqueue_do_nothing_extra>
_Thread_queue_Context_set_thread_state(
&queue_context,
STATES_WAITING_FOR_BARRIER
);
_Thread_queue_Context_set_enqueue_do_nothing_extra( &queue_context );
_Thread_queue_Enqueue(
40006bb0: 96 07 bf dc add %fp, -36, %o3
40006bb4: c2 27 bf e4 st %g1, [ %fp + -28 ]
40006bb8: 13 10 00 47 sethi %hi(0x40011c00), %o1
&barrier->Queue.Queue,
POSIX_BARRIER_TQ_OPERATIONS,
executing,
&queue_context
);
return 0;
40006bbc: b0 10 20 00 clr %i0
_Thread_queue_Enqueue(
40006bc0: 40 00 12 80 call 4000b5c0 <_Thread_queue_Enqueue>
40006bc4: 92 12 63 0c or %o1, 0x30c, %o1
return 0;
40006bc8: 81 c7 e0 08 ret
40006bcc: 81 e8 00 00 restore
}
}
40006bd0: 81 c7 e0 08 ret
40006bd4: 91 e8 20 16 restore %g0, 0x16, %o0
barrier->waiting_threads = 0;
40006bd8: c0 20 a0 1c clr [ %g2 + 0x1c ]
_Thread_queue_Flush_critical(
40006bdc: 96 07 bf dc add %fp, -36, %o3
40006be0: 15 10 00 2e sethi %hi(0x4000b800), %o2
40006be4: 13 10 00 47 sethi %hi(0x40011c00), %o1
40006be8: 94 12 a1 5c or %o2, 0x15c, %o2
40006bec: 92 12 63 0c or %o1, 0x30c, %o1
40006bf0: 40 00 13 5d call 4000b964 <_Thread_queue_Flush_critical>
40006bf4: b0 10 3f ff mov -1, %i0
return PTHREAD_BARRIER_SERIAL_THREAD;
40006bf8: 81 c7 e0 08 ret
40006bfc: 81 e8 00 00 restore
4000719c <pthread_cancel>:
/*
* 18.2.1 Canceling Execution of a Thread, P1003.1c/Draft 10, p. 181
*/
int pthread_cancel( pthread_t thread )
{
4000719c: 9d e3 bf 90 save %sp, -112, %sp
/*
* Don't even think about deleting a resource from an ISR.
*/
if ( _ISR_Is_in_progress() ) {
400071a0: 40 00 09 d9 call 40009904 <_ISR_Is_in_progress>
400071a4: 01 00 00 00 nop
400071a8: 80 a2 20 00 cmp %o0, 0
400071ac: 12 80 00 1b bne 40007218 <pthread_cancel+0x7c>
400071b0: 82 10 20 47 mov 0x47, %g1
return EPROTO;
}
the_thread = _Thread_Get( thread, &lock_context );
400071b4: 92 07 bf fc add %fp, -4, %o1
400071b8: 40 00 14 23 call 4000c244 <_Thread_Get>
400071bc: 90 10 00 18 mov %i0, %o0
if ( the_thread == NULL ) {
400071c0: 84 92 20 00 orcc %o0, 0, %g2
400071c4: 02 80 00 15 be 40007218 <pthread_cancel+0x7c>
400071c8: 82 10 20 03 mov 3, %g1
const ISR_lock_Context *lock_context
)
{
uint32_t disable_level;
disable_level = cpu_self->thread_dispatch_disable_level;
400071cc: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
<== NOT EXECUTED
_Profiling_Thread_dispatch_disable_critical(
cpu_self,
disable_level,
lock_context
);
cpu_self->thread_dispatch_disable_level = disable_level + 1;
400071d0: 82 00 60 01 inc %g1
<== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Dispatch_disable_critical(
const ISR_lock_Context *lock_context
)
{
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
400071d4: ba 10 00 06 mov %g6, %i5
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
400071d8: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400071dc: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400071e0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400071e4: 01 00 00 00 nop
static inline struct _Thread_Control *_Per_CPU_Get_executing(
const Per_CPU_Control *cpu
)
{
return cpu->executing;
400071e8: d2 01 a0 20 ld [ %g6 + 0x20 ], %o1
cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
_ISR_lock_ISR_enable( &lock_context );
executing = _Per_CPU_Get_executing( cpu_self );
if ( the_thread == executing ) {
400071ec: 80 a0 80 09 cmp %g2, %o1
400071f0: 02 80 00 17 be 4000724c <pthread_cancel+0xb0>
<== NEVER TAKEN
400071f4: 94 10 3f ff mov -1, %o2
_Thread_Exit( executing, THREAD_LIFE_TERMINATING, PTHREAD_CANCELED );
} else {
_Thread_Cancel( the_thread, executing, PTHREAD_CANCELED );
400071f8: 40 00 1a 4c call 4000db28 <_Thread_Cancel>
400071fc: 01 00 00 00 nop
*
* @param[in] cpu_self The current processor.
*/
RTEMS_INLINE_ROUTINE void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
{
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
40007200: c2 07 60 18 ld [ %i5 + 0x18 ], %g1
if ( disable_level == 1 ) {
40007204: 80 a0 60 01 cmp %g1, 1
40007208: 02 80 00 06 be 40007220 <pthread_cancel+0x84>
<== ALWAYS TAKEN
4000720c: 84 00 7f ff add %g1, -1, %g2
}
_ISR_Local_enable( level );
} else {
_Assert( disable_level > 0 );
cpu_self->thread_dispatch_disable_level = disable_level - 1;
40007210: c4 27 60 18 st %g2, [ %i5 + 0x18 ]
<== NOT EXECUTED
}
_Thread_Dispatch_enable( cpu_self );
return 0;
40007214: 82 10 20 00 clr %g1
<== NOT EXECUTED
}
40007218: 81 c7 e0 08 ret
4000721c: 91 e8 00 01 restore %g0, %g1, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007220: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
40007224: c4 0f 60 1c ldub [ %i5 + 0x1c ], %g2
40007228: 80 a0 a0 00 cmp %g2, 0
4000722c: 32 80 00 0b bne,a 40007258 <pthread_cancel+0xbc>
40007230: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
40007234: c0 27 60 18 clr [ %i5 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007238: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000723c: 01 00 00 00 nop
return 0;
40007240: 82 10 20 00 clr %g1 ! 0 <PROM_START>
}
40007244: 81 c7 e0 08 ret
40007248: 91 e8 00 01 restore %g0, %g1, %o0
_Thread_Exit( executing, THREAD_LIFE_TERMINATING, PTHREAD_CANCELED );
4000724c: 40 00 1a a0 call 4000dccc <_Thread_Exit>
<== NOT EXECUTED
40007250: 92 10 20 04 mov 4, %o1
<== NOT EXECUTED
40007254: 30 bf ff eb b,a 40007200 <pthread_cancel+0x64>
<== NOT EXECUTED
_Thread_Do_dispatch( cpu_self, level );
40007258: c2 27 bf f4 st %g1, [ %fp + -12 ]
4000725c: 40 00 13 9a call 4000c0c4 <_Thread_Do_dispatch>
40007260: 90 10 00 1d mov %i5, %o0
40007264: 10 bf ff f5 b 40007238 <pthread_cancel+0x9c>
40007268: c2 07 bf f4 ld [ %fp + -12 ], %g1
400071b4 <pthread_cond_destroy>:
/**
* 11.4.2 Initializing and Destroying a Condition Variable,
* P1003.1c/Draft 10, p. 87
*/
int pthread_cond_destroy( pthread_cond_t *cond )
{
400071b4: 9d e3 bf a0 save %sp, -96, %sp
POSIX_Condition_variables_Control *the_cond;
unsigned long flags;
Thread_queue_Context queue_context;
the_cond = _POSIX_Condition_variables_Get( cond );
POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags );
400071b8: 80 a6 20 00 cmp %i0, 0
400071bc: 02 80 00 1e be 40007234 <pthread_cond_destroy+0x80>
400071c0: 05 06 37 ec sethi %hi(0x18dfb000), %g2
400071c4: c2 06 00 00 ld [ %i0 ], %g1
400071c8: 82 1e 00 01 xor %i0, %g1, %g1
400071cc: 84 10 a1 fe or %g2, 0x1fe, %g2
400071d0: 82 18 40 02 xor %g1, %g2, %g1
400071d4: 80 88 7f fe btst -2, %g1
400071d8: 12 80 00 12 bne 40007220 <pthread_cond_destroy+0x6c>
400071dc: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400071e0: 91 d0 20 09 ta 9
<== NOT EXECUTED
_Thread_queue_Context_initialize( &queue_context );
_POSIX_Condition_variables_Acquire( the_cond, &queue_context );
if ( !_Thread_queue_Is_empty( &the_cond->Queue.Queue ) ) {
400071e4: c4 06 20 0c ld [ %i0 + 0xc ], %g2
400071e8: 80 a0 a0 00 cmp %g2, 0
400071ec: 02 80 00 06 be 40007204 <pthread_cond_destroy+0x50>
400071f0: 01 00 00 00 nop
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400071f4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400071f8: 01 00 00 00 nop
_POSIX_Condition_variables_Release( the_cond, &queue_context );
return EBUSY;
400071fc: 81 c7 e0 08 ret
40007200: 91 e8 20 10 restore %g0, 0x10, %o0
40007204: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007208: 01 00 00 00 nop
RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Destroy(
POSIX_Condition_variables_Control *the_cond
)
{
the_cond->flags = ~the_cond->flags;
4000720c: c2 06 00 00 ld [ %i0 ], %g1
40007210: 82 38 00 01 xnor %g0, %g1, %g1
40007214: c2 26 00 00 st %g1, [ %i0 ]
}
_POSIX_Condition_variables_Release( the_cond, &queue_context );
_POSIX_Condition_variables_Destroy( the_cond );
return 0;
}
40007218: 81 c7 e0 08 ret
4000721c: 91 e8 20 00 restore %g0, 0, %o0
POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags );
40007220: 40 00 00 66 call 400073b8 <_POSIX_Condition_variables_Auto_initialization>
40007224: 90 10 00 18 mov %i0, %o0
40007228: 80 a2 20 00 cmp %o0, 0
4000722c: 12 bf ff ed bne 400071e0 <pthread_cond_destroy+0x2c>
40007230: 01 00 00 00 nop
40007234: 81 c7 e0 08 ret
40007238: 91 e8 20 16 restore %g0, 0x16, %o0
4000723c <pthread_cond_init>:
{
POSIX_Condition_variables_Control *the_cond;
the_cond = _POSIX_Condition_variables_Get( cond );
if ( the_cond == NULL ) {
4000723c: 82 92 20 00 orcc %o0, 0, %g1
40007240: 02 80 00 1a be 400072a8 <pthread_cond_init+0x6c>
40007244: 80 a2 60 00 cmp %o1, 0
return EINVAL;
}
if ( attr == NULL ) {
40007248: 22 80 00 1b be,a 400072b4 <pthread_cond_init+0x78>
4000724c: 13 10 00 4c sethi %hi(0x40013000), %o1
attr = &_POSIX_Condition_variables_Default_attributes;
}
if ( !attr->is_initialized ) {
40007250: c4 02 40 00 ld [ %o1 ], %g2
40007254: 80 a0 a0 00 cmp %g2, 0
40007258: 02 80 00 15 be 400072ac <pthread_cond_init+0x70>
4000725c: 90 10 20 16 mov 0x16, %o0
return EINVAL;
}
if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) {
40007260: c4 02 60 10 ld [ %o1 + 0x10 ], %g2
40007264: 80 a0 a0 01 cmp %g2, 1
40007268: 18 80 00 11 bgu 400072ac <pthread_cond_init+0x70>
4000726c: 05 06 37 ec sethi %hi(0x18dfb000), %g2
40007270: c6 02 60 08 ld [ %o1 + 8 ], %g3
40007274: c8 02 60 0c ld [ %o1 + 0xc ], %g4
)
{
#if defined(RTEMS_SMP)
_SMP_ticket_lock_Initialize( &queue->Lock );
#endif
queue->heads = NULL;
40007278: c0 20 60 0c clr [ %g1 + 0xc ]
queue->owner = NULL;
4000727c: c0 20 60 10 clr [ %g1 + 0x10 ]
flags = (uintptr_t) the_cond ^ POSIX_CONDITION_VARIABLES_MAGIC;
40007280: 84 10 a1 fe or %g2, 0x1fe, %g2
queue->name = name;
40007284: c0 20 60 14 clr [ %g1 + 0x14 ]
40007288: 84 18 40 02 xor %g1, %g2, %g2
the_cond->mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
4000728c: c0 20 60 18 clr [ %g1 + 0x18 ]
if ( the_attr->clock == CLOCK_MONOTONIC ) {
40007290: 80 a0 e0 00 cmp %g3, 0
40007294: 02 80 00 0a be 400072bc <pthread_cond_init+0x80>
<== ALWAYS TAKEN
40007298: 84 08 bf fe and %g2, -2, %g2
the_cond->flags = flags;
4000729c: c4 20 40 00 st %g2, [ %g1 ]
<== NOT EXECUTED
return EINVAL;
}
_POSIX_Condition_variables_Initialize( the_cond, attr );
return 0;
400072a0: 81 c3 e0 08 retl
400072a4: 90 10 20 00 clr %o0
return EINVAL;
400072a8: 90 10 20 16 mov 0x16, %o0
}
400072ac: 81 c3 e0 08 retl
400072b0: 01 00 00 00 nop
attr = &_POSIX_Condition_variables_Default_attributes;
400072b4: 10 bf ff e7 b 40007250 <pthread_cond_init+0x14>
400072b8: 92 12 62 e0 or %o1, 0x2e0, %o1
if ( the_attr->clock == CLOCK_MONOTONIC ) {
400072bc: 80 a1 20 04 cmp %g4, 4
400072c0: 32 bf ff f8 bne,a 400072a0 <pthread_cond_init+0x64>
<== ALWAYS TAKEN
400072c4: c4 20 40 00 st %g2, [ %g1 ]
flags |= POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC;
400072c8: 84 10 a0 01 or %g2, 1, %g2
<== NOT EXECUTED
return 0;
400072cc: 90 10 20 00 clr %o0
<== NOT EXECUTED
400072d0: 81 c3 e0 08 retl
<== NOT EXECUTED
400072d4: c4 20 40 00 st %g2, [ %g1 ]
<== NOT EXECUTED
400070e8 <pthread_condattr_destroy>:
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( attr == NULL || !attr->is_initialized )
400070e8: 82 92 20 00 orcc %o0, 0, %g1
400070ec: 02 80 00 09 be 40007110 <pthread_condattr_destroy+0x28>
400070f0: 90 10 20 16 mov 0x16, %o0
400070f4: c4 00 40 00 ld [ %g1 ], %g2
400070f8: 80 a0 a0 00 cmp %g2, 0
400070fc: 02 80 00 05 be 40007110 <pthread_condattr_destroy+0x28>
<== NEVER TAKEN
40007100: 01 00 00 00 nop
return EINVAL;
attr->is_initialized = false;
40007104: c0 20 40 00 clr [ %g1 ]
return 0;
40007108: 81 c3 e0 08 retl
4000710c: 90 10 20 00 clr %o0
}
40007110: 81 c3 e0 08 retl
40007114: 01 00 00 00 nop
40005f20 <pthread_condattr_getclock>:
{
if ( attr == NULL ) {
return EINVAL;
}
if ( clock == NULL ) {
40005f20: 80 a2 20 00 cmp %o0, 0
40005f24: 02 80 00 08 be 40005f44 <pthread_condattr_getclock+0x24>
40005f28: 80 a2 60 00 cmp %o1, 0
40005f2c: 02 80 00 06 be 40005f44 <pthread_condattr_getclock+0x24>
<== ALWAYS TAKEN
40005f30: 01 00 00 00 nop
return EINVAL;
}
*clock = attr->clock;
40005f34: c2 02 20 0c ld [ %o0 + 0xc ], %g1
<== NOT EXECUTED
40005f38: c2 22 40 00 st %g1, [ %o1 ]
<== NOT EXECUTED
return 0;
40005f3c: 81 c3 e0 08 retl
<== NOT EXECUTED
40005f40: 90 10 20 00 clr %o0
<== NOT EXECUTED
}
40005f44: 81 c3 e0 08 retl
40005f48: 90 10 20 16 mov 0x16, %o0
4000670c <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
4000670c: 9d e3 bf 20 save %sp, -224, %sp
Thread_Entry_information entry = {
40006710: 03 10 00 2b sethi %hi(0x4000ac00), %g1
40006714: 82 10 60 38 or %g1, 0x38, %g1 ! 4000ac38 <_Thread_Entry_adaptor_pointer>
40006718: f4 27 bf c8 st %i2, [ %fp + -56 ]
size_t stacksize;
Objects_Name name;
int error;
ISR_lock_Context lock_context;
if ( !start_routine )
4000671c: 80 a6 a0 00 cmp %i2, 0
Thread_Entry_information entry = {
40006720: c2 27 bf c4 st %g1, [ %fp + -60 ]
int schedpolicy = SCHED_RR;
40006724: 82 10 20 02 mov 2, %g1
Thread_Entry_information entry = {
40006728: f6 27 bf cc st %i3, [ %fp + -52 ]
if ( !start_routine )
4000672c: 02 80 00 b0 be 400069ec <pthread_create+0x2e0>
40006730: c2 27 bf bc st %g1, [ %fp + -68 ]
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
40006734: 80 a6 60 00 cmp %i1, 0
40006738: 22 80 00 a5 be,a 400069cc <pthread_create+0x2c0>
4000673c: 33 10 00 5f sethi %hi(0x40017c00), %i1
if ( !the_attr->is_initialized )
40006740: c2 06 40 00 ld [ %i1 ], %g1
40006744: 80 a0 60 00 cmp %g1, 0
40006748: 02 80 00 9e be 400069c0 <pthread_create+0x2b4>
4000674c: 03 10 00 65 sethi %hi(0x40019400), %g1
* 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 != NULL ) {
40006750: c4 06 60 04 ld [ %i1 + 4 ], %g2
40006754: e6 06 60 08 ld [ %i1 + 8 ], %l3
40006758: 80 a0 a0 00 cmp %g2, 0
4000675c: 02 80 00 9e be 400069d4 <pthread_create+0x2c8>
40006760: c2 00 60 40 ld [ %g1 + 0x40 ], %g1
if ( !_Stack_Is_enough(the_attr->stacksize) ) {
40006764: 80 a0 40 13 cmp %g1, %l3
40006768: 18 80 00 97 bgu 400069c4 <pthread_create+0x2b8>
4000676c: a0 10 20 16 mov 0x16, %l0
* 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 ) {
40006770: c2 06 60 10 ld [ %i1 + 0x10 ], %g1
40006774: 80 a0 60 01 cmp %g1, 1
40006778: 02 80 00 a1 be 400069fc <pthread_create+0x2f0>
4000677c: e4 01 a0 20 ld [ %g6 + 0x20 ], %l2
40006780: 80 a0 60 02 cmp %g1, 2
40006784: 12 80 00 90 bne 400069c4 <pthread_create+0x2b8>
40006788: a0 10 20 16 mov 0x16, %l0
);
_Assert( error == 0 );
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
4000678c: c2 06 60 14 ld [ %i1 + 0x14 ], %g1
schedparam = the_attr->schedparam;
40006790: d4 1e 60 18 ldd [ %i1 + 0x18 ], %o2
40006794: f4 1e 60 20 ldd [ %i1 + 0x20 ], %i2
40006798: f8 1e 60 28 ldd [ %i1 + 0x28 ], %i4
4000679c: c4 1e 60 30 ldd [ %i1 + 0x30 ], %g2
400067a0: d0 1e 60 38 ldd [ %i1 + 0x38 ], %o0
400067a4: e0 1e 60 40 ldd [ %i1 + 0x40 ], %l0
schedpolicy = the_attr->schedpolicy;
400067a8: c2 27 bf bc st %g1, [ %fp + -68 ]
schedparam = the_attr->schedparam;
400067ac: d4 3f bf d0 std %o2, [ %fp + -48 ]
400067b0: f4 3f bf d8 std %i2, [ %fp + -40 ]
400067b4: f8 3f bf e0 std %i4, [ %fp + -32 ]
400067b8: c4 3f bf e8 std %g2, [ %fp + -24 ]
400067bc: d0 3f bf f0 std %o0, [ %fp + -16 ]
400067c0: e0 3f bf f8 std %l0, [ %fp + -8 ]
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
return ENOTSUP;
400067c4: a0 10 20 86 mov 0x86, %l0
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
400067c8: c2 06 60 0c ld [ %i1 + 0xc ], %g1
400067cc: 80 a0 60 00 cmp %g1, 0
400067d0: 12 80 00 7d bne 400069c4 <pthread_create+0x2b8>
400067d4: d0 07 bf bc ld [ %fp + -68 ], %o0
error = _POSIX_Thread_Translate_sched_param(
400067d8: 96 07 bf b8 add %fp, -72, %o3
400067dc: 94 07 bf b4 add %fp, -76, %o2
400067e0: 40 00 1e 87 call 4000e1fc <_POSIX_Thread_Translate_sched_param>
400067e4: 92 07 bf d0 add %fp, -48, %o1
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( error != 0 ) {
400067e8: a0 92 20 00 orcc %o0, 0, %l0
400067ec: 32 80 00 82 bne,a 400069f4 <pthread_create+0x2e8>
400067f0: b0 10 00 10 mov %l0, %i0
return error;
}
normal_prio = schedparam.sched_priority;
400067f4: f6 07 bf d0 ld [ %fp + -48 ], %i3
scheduler = _Thread_Scheduler_get_home( executing );
core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid );
400067f8: 92 10 00 1b mov %i3, %o1
400067fc: 94 07 bf b3 add %fp, -77, %o2
40006800: 29 10 00 5c sethi %hi(0x40017000), %l4
40006804: 40 00 1e 4d call 4000e138 <_POSIX_Priority_To_core>
40006808: 90 15 22 f0 or %l4, 0x2f0, %o0 ! 400172f0 <_Scheduler_Table>
if ( !valid ) {
4000680c: c2 0f bf b3 ldub [ %fp + -77 ], %g1
core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid );
40006810: b8 10 00 08 mov %o0, %i4
if ( !valid ) {
40006814: 80 a0 60 00 cmp %g1, 0
40006818: 02 80 00 6a be 400069c0 <pthread_create+0x2b4>
<== NEVER TAKEN
4000681c: ba 10 00 09 mov %o1, %i5
return EINVAL;
}
if ( schedpolicy == SCHED_SPORADIC ) {
40006820: c2 07 bf bc ld [ %fp + -68 ], %g1
40006824: 80 a0 60 04 cmp %g1, 4
40006828: 22 80 00 02 be,a 40006830 <pthread_create+0x124>
4000682c: f6 07 bf d4 ld [ %fp + -44 ], %i3
low_prio = schedparam.sched_ss_low_priority;
} else {
low_prio = normal_prio;
}
core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio, &valid );
40006830: 92 10 00 1b mov %i3, %o1
40006834: 94 07 bf b3 add %fp, -77, %o2
40006838: 40 00 1e 40 call 4000e138 <_POSIX_Priority_To_core>
4000683c: 90 15 22 f0 or %l4, 0x2f0, %o0
if ( !valid ) {
40006840: c2 0f bf b3 ldub [ %fp + -77 ], %g1
core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio, &valid );
40006844: b4 10 00 08 mov %o0, %i2
if ( !valid ) {
40006848: 80 a0 60 00 cmp %g1, 0
4000684c: 02 80 00 5d be 400069c0 <pthread_create+0x2b4>
40006850: b6 10 00 09 mov %o1, %i3
return EINVAL;
}
if ( the_attr->affinityset == NULL ) {
40006854: c2 06 60 58 ld [ %i1 + 0x58 ], %g1
40006858: 80 a0 60 00 cmp %g1, 0
4000685c: 22 80 00 5a be,a 400069c4 <pthread_create+0x2b8>
<== NEVER TAKEN
40006860: a0 10 20 16 mov 0x16, %l0
<== NOT EXECUTED
_RTEMS_Lock_allocator();
40006864: 40 00 02 3d call 40007158 <_RTEMS_Lock_allocator>
40006868: 2b 10 00 6b sethi %hi(0x4001ac00), %l5
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate(void)
{
_Objects_Allocator_lock();
_Thread_Kill_zombies();
4000686c: 40 00 15 fd call 4000c060 <_Thread_Kill_zombies>
40006870: 01 00 00 00 nop
return (Thread_Control *)
40006874: 40 00 09 7f call 40008e70 <_Objects_Allocate_unprotected>
40006878: 90 15 61 70 or %l5, 0x170, %o0
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
4000687c: a2 92 20 00 orcc %o0, 0, %l1
40006880: 02 80 00 66 be 40006a18 <pthread_create+0x30c>
40006884: 82 07 bf ac add %fp, -84, %g1
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
40006888: c2 23 a0 74 st %g1, [ %sp + 0x74 ]
4000688c: 9a 10 20 01 mov 1, %o5
40006890: c2 07 bf b8 ld [ %fp + -72 ], %g1
40006894: f8 3f bf a0 std %i4, [ %fp + -96 ]
40006898: 98 10 00 13 mov %l3, %o4
4000689c: c2 23 a0 6c st %g1, [ %sp + 0x6c ]
400068a0: 94 15 22 f0 or %l4, 0x2f0, %o2
400068a4: c2 07 bf b4 ld [ %fp + -76 ], %g1
400068a8: c2 23 a0 68 st %g1, [ %sp + 0x68 ]
400068ac: 82 10 20 01 mov 1, %g1
400068b0: c2 23 a0 64 st %g1, [ %sp + 0x64 ]
400068b4: 92 10 00 11 mov %l1, %o1
400068b8: c2 07 bf a0 ld [ %fp + -96 ], %g1
400068bc: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
400068c0: 90 15 61 70 or %l5, 0x170, %o0
400068c4: c2 07 bf a4 ld [ %fp + -92 ], %g1
400068c8: c0 27 bf ac clr [ %fp + -84 ]
400068cc: c0 23 a0 70 clr [ %sp + 0x70 ]
400068d0: c2 23 a0 60 st %g1, [ %sp + 0x60 ]
400068d4: 40 00 11 1d call 4000ad48 <_Thread_Initialize>
400068d8: d6 06 60 04 ld [ %i1 + 4 ], %o3
budget_algorithm,
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
400068dc: 80 a2 20 00 cmp %o0, 0
400068e0: 02 80 00 52 be 40006a28 <pthread_create+0x31c>
400068e4: 92 10 00 11 mov %l1, %o1
_POSIX_Threads_Free( the_thread );
_Objects_Allocator_unlock();
return EAGAIN;
}
if ( the_attr->detachstate == PTHREAD_CREATE_DETACHED ) {
400068e8: c4 06 60 50 ld [ %i1 + 0x50 ], %g2
400068ec: 80 a0 a0 00 cmp %g2, 0
400068f0: 12 80 00 03 bne 400068fc <pthread_create+0x1f0>
400068f4: c2 04 61 70 ld [ %l1 + 0x170 ], %g1
the_thread->Life.state |= THREAD_LIFE_DETACHED;
400068f8: 82 10 60 10 or %g1, 0x10, %g1
<== NOT EXECUTED
}
the_thread->Life.state |= THREAD_LIFE_CHANGE_DEFERRED;
400068fc: 82 10 60 08 or %g1, 8, %g1
<== NOT EXECUTED
40006900: c2 24 61 70 st %g1, [ %l1 + 0x170 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006904: 91 d0 20 09 ta 9
<== NOT EXECUTED
_ISR_lock_ISR_disable( &lock_context );
40006908: c2 27 bf c0 st %g1, [ %fp + -64 ]
status = _Scheduler_Set_affinity(
4000690c: d4 06 60 58 ld [ %i1 + 0x58 ], %o2
40006910: d2 06 60 54 ld [ %i1 + 0x54 ], %o1
40006914: 40 00 0f 2a call 4000a5bc <_Scheduler_Set_affinity>
40006918: 90 10 00 11 mov %l1, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000691c: c2 07 bf c0 ld [ %fp + -64 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006920: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006924: 01 00 00 00 nop
the_thread,
the_attr->affinitysetsize,
the_attr->affinityset
);
_ISR_lock_ISR_enable( &lock_context );
if ( !status ) {
40006928: 80 a2 20 00 cmp %o0, 0
4000692c: 02 80 00 45 be 40006a40 <pthread_create+0x334>
<== NEVER TAKEN
40006930: 92 10 00 11 mov %l1, %o1
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
executing_api = executing->API_Extensions[ THREAD_API_POSIX ];
api->signals_unblocked = executing_api->signals_unblocked;
40006934: c2 04 a1 5c ld [ %l2 + 0x15c ], %g1
40006938: c4 00 60 68 ld [ %g1 + 0x68 ], %g2
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4000693c: d0 04 61 5c ld [ %l1 + 0x15c ], %o0
the_thread->was_created_with_inherited_scheduler =
( the_attr->inheritsched == PTHREAD_INHERIT_SCHED );
40006940: c2 06 60 10 ld [ %i1 + 0x10 ], %g1
40006944: 82 18 60 01 xor %g1, 1, %g1
api->signals_unblocked = executing_api->signals_unblocked;
40006948: c4 22 20 68 st %g2, [ %o0 + 0x68 ]
( the_attr->inheritsched == PTHREAD_INHERIT_SCHED );
4000694c: 80 a0 00 01 cmp %g0, %g1
40006950: 82 60 3f ff subx %g0, -1, %g1
40006954: c2 2c 60 8b stb %g1, [ %l1 + 0x8b ]
RTEMS_INLINE_ROUTINE void _Priority_Node_set_priority(
Priority_Node *node,
Priority_Control priority
)
{
node->priority = priority;
40006958: f4 3a 20 38 std %i2, [ %o0 + 0x38 ]
_Priority_Node_set_priority( &api->Sporadic.Low_priority, core_low_prio );
api->Sporadic.sched_ss_repl_period =
the_attr->schedparam.sched_ss_repl_period;
api->Sporadic.sched_ss_init_budget =
the_attr->schedparam.sched_ss_init_budget;
api->Sporadic.sched_ss_max_repl =
4000695c: c2 06 60 40 ld [ %i1 + 0x40 ], %g1
api->Sporadic.sched_ss_repl_period =
40006960: f4 1e 60 20 ldd [ %i1 + 0x20 ], %i2
40006964: f8 1e 60 28 ldd [ %i1 + 0x28 ], %i4
api->Sporadic.sched_ss_init_budget =
40006968: c4 1e 60 30 ldd [ %i1 + 0x30 ], %g2
4000696c: d8 1e 60 38 ldd [ %i1 + 0x38 ], %o4
40006970: d8 3a 20 58 std %o4, [ %o0 + 0x58 ]
api->Sporadic.sched_ss_max_repl =
40006974: c2 22 20 60 st %g1, [ %o0 + 0x60 ]
api->Sporadic.sched_ss_repl_period =
40006978: f4 3a 20 40 std %i2, [ %o0 + 0x40 ]
4000697c: f8 3a 20 48 std %i4, [ %o0 + 0x48 ]
api->Sporadic.sched_ss_init_budget =
40006980: c4 3a 20 50 std %g2, [ %o0 + 0x50 ]
the_attr->schedparam.sched_ss_max_repl;
if ( schedpolicy == SCHED_SPORADIC ) {
40006984: c2 07 bf bc ld [ %fp + -68 ], %g1
40006988: 80 a0 60 04 cmp %g1, 4
4000698c: 02 80 00 33 be 40006a58 <pthread_create+0x34c>
40006990: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006994: 91 d0 20 09 ta 9
<== NOT EXECUTED
}
/*
* POSIX threads are allocated and started in one operation.
*/
_ISR_lock_ISR_disable( &lock_context );
40006998: c2 27 bf c0 st %g1, [ %fp + -64 ]
status = _Thread_Start( the_thread, &entry, &lock_context );
4000699c: 94 07 bf c0 add %fp, -64, %o2
400069a0: 92 07 bf c4 add %fp, -60, %o1
400069a4: 40 00 16 7b call 4000c390 <_Thread_Start>
400069a8: 90 10 00 11 mov %l1, %o0
#endif
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
400069ac: c2 04 60 08 ld [ %l1 + 8 ], %g1
_RTEMS_Unlock_allocator();
400069b0: 40 00 01 ef call 4000716c <_RTEMS_Unlock_allocator>
400069b4: c2 26 00 00 st %g1, [ %i0 ]
_Objects_Allocator_unlock();
return 0;
400069b8: 81 c7 e0 08 ret
400069bc: 91 e8 00 10 restore %g0, %l0, %o0
return EINVAL;
400069c0: a0 10 20 16 mov 0x16, %l0
}
400069c4: 81 c7 e0 08 ret
400069c8: 91 e8 00 10 restore %g0, %l0, %o0
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
400069cc: 10 bf ff 5d b 40006740 <pthread_create+0x34>
400069d0: b2 16 60 60 or %i1, 0x60, %i1
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
400069d4: 83 28 60 01 sll %g1, 1, %g1
400069d8: 80 a4 c0 01 cmp %l3, %g1
400069dc: 2a bf ff 65 bcs,a 40006770 <pthread_create+0x64>
400069e0: a6 10 00 01 mov %g1, %l3
switch ( the_attr->inheritsched ) {
400069e4: 10 bf ff 64 b 40006774 <pthread_create+0x68>
400069e8: c2 06 60 10 ld [ %i1 + 0x10 ], %g1
return EFAULT;
400069ec: a0 10 20 0e mov 0xe, %l0
}
400069f0: b0 10 00 10 mov %l0, %i0
400069f4: 81 c7 e0 08 ret
400069f8: 81 e8 00 00 restore
error = pthread_getschedparam(
400069fc: 40 00 01 01 call 40006e00 <pthread_self>
40006a00: a0 10 20 86 mov 0x86, %l0
40006a04: 94 07 bf d0 add %fp, -48, %o2
40006a08: 40 00 00 27 call 40006aa4 <pthread_getschedparam>
40006a0c: 92 07 bf bc add %fp, -68, %o1
break;
40006a10: 10 bf ff 6f b 400067cc <pthread_create+0xc0>
40006a14: c2 06 60 0c ld [ %i1 + 0xc ], %g1
40006a18: 40 00 01 d5 call 4000716c <_RTEMS_Unlock_allocator>
40006a1c: a0 10 20 0b mov 0xb, %l0
return EAGAIN;
40006a20: 81 c7 e0 08 ret
40006a24: 91 e8 00 10 restore %g0, %l0, %o0
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information.Objects, &the_pthread->Object );
40006a28: 90 15 61 70 or %l5, 0x170, %o0
40006a2c: 40 00 0a 11 call 40009270 <_Objects_Free>
40006a30: a0 10 20 0b mov 0xb, %l0
40006a34: 40 00 01 ce call 4000716c <_RTEMS_Unlock_allocator>
40006a38: b0 10 00 10 mov %l0, %i0
return EAGAIN;
40006a3c: 30 bf ff ee b,a 400069f4 <pthread_create+0x2e8>
40006a40: 90 15 61 70 or %l5, 0x170, %o0
<== NOT EXECUTED
40006a44: 40 00 0a 0b call 40009270 <_Objects_Free>
<== NOT EXECUTED
40006a48: a0 10 20 16 mov 0x16, %l0
<== NOT EXECUTED
_RTEMS_Unlock_allocator();
40006a4c: 40 00 01 c8 call 4000716c <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40006a50: b0 10 00 10 mov %l0, %i0
<== NOT EXECUTED
return EINVAL;
40006a54: 30 bf ff e8 b,a 400069f4 <pthread_create+0x2e8>
<== NOT EXECUTED
_POSIX_Threads_Sporadic_timer( &api->Sporadic.Timer );
40006a58: 40 00 00 9d call 40006ccc <_POSIX_Threads_Sporadic_timer>
40006a5c: 90 02 20 08 add %o0, 8, %o0
40006a60: 30 bf ff cd b,a 40006994 <pthread_create+0x288>
40006a30 <pthread_detach>:
/**
* 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149
*/
int pthread_detach( pthread_t thread )
{
40006a30: 9d e3 bf 90 save %sp, -112, %sp
Thread_Control *the_thread;
ISR_lock_Context lock_context;
Per_CPU_Control *cpu_self;
the_thread = _Thread_Get( thread, &lock_context );
40006a34: 90 10 00 18 mov %i0, %o0
40006a38: 92 07 bf fc add %fp, -4, %o1
40006a3c: 40 00 11 7d call 4000b030 <_Thread_Get>
40006a40: b0 10 20 03 mov 3, %i0
if ( the_thread == NULL ) {
40006a44: 80 a2 20 00 cmp %o0, 0
40006a48: 02 80 00 14 be 40006a98 <pthread_detach+0x68>
40006a4c: 01 00 00 00 nop
return ESRCH;
}
_Thread_State_acquire_critical( the_thread, &lock_context );
the_thread->Life.state |= THREAD_LIFE_DETACHED;
40006a50: c4 02 21 70 ld [ %o0 + 0x170 ], %g2
40006a54: 84 10 a0 10 or %g2, 0x10, %g2
40006a58: c4 22 21 70 st %g2, [ %o0 + 0x170 ]
_Thread_Clear_state_locked( the_thread, STATES_WAITING_FOR_JOIN_AT_EXIT );
40006a5c: 40 00 10 af call 4000ad18 <_Thread_Clear_state_locked>
40006a60: 13 00 00 08 sethi %hi(0x2000), %o1
const ISR_lock_Context *lock_context
)
{
uint32_t disable_level;
disable_level = cpu_self->thread_dispatch_disable_level;
40006a64: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
<== NOT EXECUTED
_Profiling_Thread_dispatch_disable_critical(
cpu_self,
disable_level,
lock_context
);
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40006a68: 82 00 60 01 inc %g1
<== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Dispatch_disable_critical(
const ISR_lock_Context *lock_context
)
{
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
40006a6c: 90 10 00 06 mov %g6, %o0
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40006a70: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006a74: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006a78: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006a7c: 01 00 00 00 nop
*
* @param[in] cpu_self The current processor.
*/
RTEMS_INLINE_ROUTINE void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
{
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
40006a80: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
if ( disable_level == 1 ) {
40006a84: 80 a0 60 01 cmp %g1, 1
40006a88: 02 80 00 06 be 40006aa0 <pthread_detach+0x70>
<== ALWAYS TAKEN
40006a8c: 82 00 7f ff add %g1, -1, %g1
}
_ISR_Local_enable( level );
} else {
_Assert( disable_level > 0 );
cpu_self->thread_dispatch_disable_level = disable_level - 1;
40006a90: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
_Thread_State_release( the_thread, &lock_context );
_Thread_Dispatch_enable( cpu_self );
return 0;
40006a94: b0 10 20 00 clr %i0
<== NOT EXECUTED
}
40006a98: 81 c7 e0 08 ret
40006a9c: 81 e8 00 00 restore
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006aa0: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
40006aa4: c4 09 a0 1c ldub [ %g6 + 0x1c ], %g2
40006aa8: 80 a0 a0 00 cmp %g2, 0
40006aac: 12 80 00 07 bne 40006ac8 <pthread_detach+0x98>
40006ab0: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
40006ab4: c0 21 a0 18 clr [ %g6 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006ab8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006abc: 01 00 00 00 nop
return 0;
40006ac0: 81 c7 e0 08 ret
40006ac4: 91 e8 20 00 restore %g0, 0, %o0
_Thread_Do_dispatch( cpu_self, level );
40006ac8: 40 00 10 fa call 4000aeb0 <_Thread_Do_dispatch>
40006acc: c2 27 bf f4 st %g1, [ %fp + -12 ]
40006ad0: 10 bf ff fa b 40006ab8 <pthread_detach+0x88>
40006ad4: c2 07 bf f4 ld [ %fp + -12 ], %g1
40006a74 <pthread_exit>:
#include <pthread.h>
#include <rtems/score/threadimpl.h>
void pthread_exit( void *value_ptr )
{
40006a74: 9d e3 bf a0 save %sp, -96, %sp
const ISR_lock_Context *lock_context
)
{
uint32_t disable_level;
disable_level = cpu_self->thread_dispatch_disable_level;
40006a78: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
_Profiling_Thread_dispatch_disable_critical(
cpu_self,
disable_level,
lock_context
);
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40006a7c: 82 00 60 01 inc %g1
40006a80: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
*/
RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Dispatch_disable_critical(
const ISR_lock_Context *lock_context
)
{
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
40006a84: ba 10 00 06 mov %g6, %i5
Per_CPU_Control *cpu_self;
cpu_self = _Thread_Dispatch_disable();
executing = _Per_CPU_Get_executing( cpu_self );
_Thread_Exit( executing, THREAD_LIFE_TERMINATING, value_ptr );
40006a88: d0 01 a0 20 ld [ %g6 + 0x20 ], %o0
40006a8c: 94 10 00 18 mov %i0, %o2
40006a90: 40 00 15 bc call 4000c180 <_Thread_Exit>
40006a94: 92 10 20 04 mov 4, %o1
_Thread_Dispatch_direct( cpu_self );
40006a98: 40 00 10 57 call 4000abf4 <_Thread_Dispatch_direct>
40006a9c: 90 10 00 1d mov %i5, %o0
40006aa0: 01 00 00 00 nop
<== NOT EXECUTED
40006d28 <pthread_getattr_np>:
int pthread_getattr_np(
pthread_t thread,
pthread_attr_t *attr
)
{
40006d28: 9d e3 bf 98 save %sp, -104, %sp
ISR_lock_Context lock_context;
Thread_CPU_budget_algorithms budget_algorithm;
const Scheduler_Control *scheduler;
bool ok;
if ( attr == NULL ) {
40006d2c: 80 a6 60 00 cmp %i1, 0
40006d30: 02 80 00 4c be 40006e60 <pthread_getattr_np+0x138>
40006d34: 94 10 20 60 mov 0x60, %o2
return EINVAL;
}
attr = memset( attr, 0, sizeof( *attr ) );
40006d38: 92 10 20 00 clr %o1
40006d3c: 40 00 26 ff call 40010938 <memset>
40006d40: 90 10 00 19 mov %i1, %o0
the_thread = _Thread_Get( thread, &lock_context );
40006d44: 92 07 bf fc add %fp, -4, %o1
attr = memset( attr, 0, sizeof( *attr ) );
40006d48: a0 10 00 08 mov %o0, %l0
the_thread = _Thread_Get( thread, &lock_context );
40006d4c: 40 00 12 e6 call 4000b8e4 <_Thread_Get>
40006d50: 90 10 00 18 mov %i0, %o0
if ( the_thread == NULL ) {
40006d54: a2 92 20 00 orcc %o0, 0, %l1
40006d58: 02 80 00 44 be 40006e68 <pthread_getattr_np+0x140>
40006d5c: 01 00 00 00 nop
}
_Thread_State_acquire_critical( the_thread, &lock_context );
attr->stackaddr = the_thread->Start.Initial_stack.area;
attr->stacksize = the_thread->Start.Initial_stack.size;
40006d60: c2 04 60 cc ld [ %l1 + 0xcc ], %g1
attr->stackaddr = the_thread->Start.Initial_stack.area;
40006d64: c4 04 60 d0 ld [ %l1 + 0xd0 ], %g2
40006d68: c4 24 20 04 st %g2, [ %l0 + 4 ]
attr->stacksize = the_thread->Start.Initial_stack.size;
40006d6c: c2 24 20 08 st %g1, [ %l0 + 8 ]
if ( the_thread->was_created_with_inherited_scheduler ) {
40006d70: c2 0c 60 8b ldub [ %l1 + 0x8b ], %g1
40006d74: 80 a0 60 00 cmp %g1, 0
40006d78: 12 80 00 38 bne 40006e58 <pthread_getattr_np+0x130>
<== NEVER TAKEN
40006d7c: 82 10 20 01 mov 1, %g1
attr->inheritsched = PTHREAD_INHERIT_SCHED;
} else {
attr->inheritsched = PTHREAD_EXPLICIT_SCHED;
40006d80: 82 10 20 02 mov 2, %g1
40006d84: c2 24 20 10 st %g1, [ %l0 + 0x10 ]
}
scheduler = _Thread_Scheduler_get_home( the_thread );
attr->schedparam.sched_priority = _POSIX_Priority_From_core(
40006d88: 3b 10 00 48 sethi %hi(0x40012000), %i5
40006d8c: c2 04 60 38 ld [ %l1 + 0x38 ], %g1
40006d90: d2 00 60 18 ld [ %g1 + 0x18 ], %o1
40006d94: d4 00 60 1c ld [ %g1 + 0x1c ], %o2
40006d98: 40 00 22 a5 call 4000f82c <_POSIX_Priority_From_core>
40006d9c: 90 17 63 b8 or %i5, 0x3b8, %o0
40006da0: e4 04 61 5c ld [ %l1 + 0x15c ], %l2
40006da4: d0 24 20 18 st %o0, [ %l0 + 0x18 ]
)
{
const POSIX_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
param->sched_ss_low_priority = _POSIX_Priority_From_core(
40006da8: 90 17 63 b8 or %i5, 0x3b8, %o0
40006dac: d2 04 a0 38 ld [ %l2 + 0x38 ], %o1
40006db0: 40 00 22 9f call 4000f82c <_POSIX_Priority_From_core>
40006db4: d4 04 a0 3c ld [ %l2 + 0x3c ], %o2
scheduler,
api->Sporadic.Low_priority.priority
);
param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period;
param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget;
param->sched_ss_max_repl = api->Sporadic.sched_ss_max_repl;
40006db8: c2 04 a0 60 ld [ %l2 + 0x60 ], %g1
param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period;
40006dbc: f0 1c a0 40 ldd [ %l2 + 0x40 ], %i0
40006dc0: f4 1c a0 48 ldd [ %l2 + 0x48 ], %i2
param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget;
40006dc4: f8 1c a0 50 ldd [ %l2 + 0x50 ], %i4
40006dc8: c4 1c a0 58 ldd [ %l2 + 0x58 ], %g2
40006dcc: c4 3c 20 38 std %g2, [ %l0 + 0x38 ]
param->sched_ss_max_repl = api->Sporadic.sched_ss_max_repl;
40006dd0: c2 24 20 40 st %g1, [ %l0 + 0x40 ]
param->sched_ss_low_priority = _POSIX_Priority_From_core(
40006dd4: d0 24 20 1c st %o0, [ %l0 + 0x1c ]
param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period;
40006dd8: f0 3c 20 20 std %i0, [ %l0 + 0x20 ]
40006ddc: f4 3c 20 28 std %i2, [ %l0 + 0x28 ]
param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget;
40006de0: f8 3c 20 30 std %i4, [ %l0 + 0x30 ]
RTEMS_INLINE_ROUTINE bool _Thread_Is_joinable(
const Thread_Control *the_thread
)
{
_Assert( _Thread_State_is_owner( the_thread ) );
return ( the_thread->Life.state & THREAD_LIFE_DETACHED ) == 0;
40006de4: c2 04 61 70 ld [ %l1 + 0x170 ], %g1
the_thread,
scheduler,
&attr->schedparam
);
if ( _Thread_Is_joinable( the_thread ) ) {
40006de8: 80 88 60 10 btst 0x10, %g1
40006dec: 32 80 00 04 bne,a 40006dfc <pthread_getattr_np+0xd4>
40006df0: c0 24 20 50 clr [ %l0 + 0x50 ]
attr->detachstate = PTHREAD_CREATE_JOINABLE;
40006df4: 82 10 20 01 mov 1, %g1
40006df8: c2 24 20 50 st %g1, [ %l0 + 0x50 ]
} else {
attr->detachstate = PTHREAD_CREATE_DETACHED;
}
attr->affinityset = &attr->affinitysetpreallocated;
40006dfc: 94 04 20 5c add %l0, 0x5c, %o2
attr->affinitysetsize = sizeof( attr->affinitysetpreallocated );
40006e00: 82 10 20 04 mov 4, %g1
attr->affinityset = &attr->affinitysetpreallocated;
40006e04: d4 24 20 58 st %o2, [ %l0 + 0x58 ]
ok = _Scheduler_Get_affinity(
40006e08: 92 10 20 04 mov 4, %o1
attr->affinitysetsize = sizeof( attr->affinitysetpreallocated );
40006e0c: c2 24 20 54 st %g1, [ %l0 + 0x54 ]
ok = _Scheduler_Get_affinity(
40006e10: 40 00 0f 2e call 4000aac8 <_Scheduler_Get_affinity>
40006e14: 90 10 00 11 mov %l1, %o0
40006e18: ba 10 00 08 mov %o0, %i5
<== NOT EXECUTED
the_thread,
attr->affinitysetsize,
attr->affinityset
);
budget_algorithm = the_thread->budget_algorithm;
40006e1c: d0 04 60 90 ld [ %l1 + 0x90 ], %o0
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006e20: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006e24: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006e28: 01 00 00 00 nop
_Thread_State_release( the_thread, &lock_context );
attr->is_initialized = true;
40006e2c: 82 10 20 01 mov 1, %g1 ! 1 <_TLS_Alignment>
attr->contentionscope = PTHREAD_SCOPE_PROCESS;
40006e30: c0 24 20 0c clr [ %l0 + 0xc ]
attr->cputime_clock_allowed = 1;
attr->schedpolicy =
_POSIX_Thread_Translate_to_sched_policy( budget_algorithm );
return ok ? 0 : EINVAL;
40006e34: b0 10 20 00 clr %i0
attr->is_initialized = true;
40006e38: c2 24 00 00 st %g1, [ %l0 ]
_POSIX_Thread_Translate_to_sched_policy( budget_algorithm );
40006e3c: 40 00 22 86 call 4000f854 <_POSIX_Thread_Translate_to_sched_policy>
40006e40: c2 24 20 4c st %g1, [ %l0 + 0x4c ]
return ok ? 0 : EINVAL;
40006e44: 80 a7 60 00 cmp %i5, 0
40006e48: 02 80 00 06 be 40006e60 <pthread_getattr_np+0x138>
<== NEVER TAKEN
40006e4c: d0 24 20 14 st %o0, [ %l0 + 0x14 ]
}
40006e50: 81 c7 e0 08 ret
40006e54: 81 e8 00 00 restore
40006e58: 10 bf ff cc b 40006d88 <pthread_getattr_np+0x60>
<== NOT EXECUTED
40006e5c: c2 24 20 10 st %g1, [ %l0 + 0x10 ]
<== NOT EXECUTED
return ok ? 0 : EINVAL;
40006e60: 81 c7 e0 08 ret
40006e64: 91 e8 20 16 restore %g0, 0x16, %o0
}
40006e68: 81 c7 e0 08 ret
40006e6c: 91 e8 20 03 restore %g0, 3, %o0
400064a0 <pthread_getname_np>:
#include <string.h>
#include <rtems/score/threadimpl.h>
int pthread_getname_np( pthread_t thread, char *name, size_t len )
{
400064a0: 9d e3 bf 98 save %sp, -104, %sp
_RTEMS_Lock_allocator();
400064a4: 40 00 01 03 call 400068b0 <_RTEMS_Lock_allocator>
400064a8: 01 00 00 00 nop
Thread_Control *the_thread;
ISR_lock_Context lock_context;
size_t actual_len;
_Objects_Allocator_lock();
the_thread = _Thread_Get( thread, &lock_context );
400064ac: 92 07 bf fc add %fp, -4, %o1
400064b0: 40 00 0d cc call 40009be0 <_Thread_Get>
400064b4: 90 10 00 18 mov %i0, %o0
if ( the_thread == NULL ) {
400064b8: 80 a2 20 00 cmp %o0, 0
400064bc: 02 80 00 0f be 400064f8 <pthread_getname_np+0x58>
400064c0: 01 00 00 00 nop
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400064c4: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400064c8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400064cc: 01 00 00 00 nop
strlcpy(name, "", len);
return ESRCH;
}
_ISR_lock_ISR_enable( &lock_context );
actual_len = _Thread_Get_name( the_thread, name, len );
400064d0: 94 10 00 1a mov %i2, %o2
400064d4: 40 00 0e e7 call 4000a070 <_Thread_Get_name>
400064d8: 92 10 00 19 mov %i1, %o1
_RTEMS_Unlock_allocator();
400064dc: 40 00 00 fa call 400068c4 <_RTEMS_Unlock_allocator>
400064e0: ba 10 00 08 mov %o0, %i5
if ( actual_len >= len ) {
return ERANGE;
}
return 0;
400064e4: 80 a7 40 1a cmp %i5, %i2
400064e8: b0 40 3f ff addx %g0, -1, %i0
400064ec: b0 0e 20 22 and %i0, 0x22, %i0
}
400064f0: 81 c7 e0 08 ret
400064f4: 81 e8 00 00 restore
400064f8: 40 00 00 f3 call 400068c4 <_RTEMS_Unlock_allocator>
400064fc: b0 10 20 03 mov 3, %i0
strlcpy(name, "", len);
40006500: 94 10 00 1a mov %i2, %o2
40006504: 90 10 00 19 mov %i1, %o0
40006508: 13 10 00 3f sethi %hi(0x4000fc00), %o1
4000650c: 40 00 21 02 call 4000e914 <strlcpy>
40006510: 92 12 60 28 or %o1, 0x28, %o1 ! 4000fc28 <rtems_test_name+0x108>
return ESRCH;
40006514: 81 c7 e0 08 ret
40006518: 81 e8 00 00 restore
40006aa4 <pthread_getschedparam>:
int pthread_getschedparam(
pthread_t thread,
int *policy,
struct sched_param *param
)
{
40006aa4: 9d e3 bf 78 save %sp, -136, %sp
Thread_queue_Context queue_context;
Thread_CPU_budget_algorithms budget_algorithm;
const Scheduler_Control *scheduler;
Priority_Control priority;
if ( policy == NULL || param == NULL ) {
40006aa8: 80 a6 60 00 cmp %i1, 0
40006aac: 02 80 00 2b be 40006b58 <pthread_getschedparam+0xb4>
40006ab0: 80 a6 a0 00 cmp %i2, 0
40006ab4: 02 80 00 29 be 40006b58 <pthread_getschedparam+0xb4>
40006ab8: 90 10 00 18 mov %i0, %o0
return EINVAL;
}
_Thread_queue_Context_initialize( &queue_context );
the_thread = _Thread_Get( thread, &queue_context.Lock_context.Lock_context );
40006abc: 92 07 bf dc add %fp, -36, %o1
40006ac0: 40 00 10 65 call 4000ac54 <_Thread_Get>
40006ac4: b0 10 20 03 mov 3, %i0
if ( the_thread == NULL ) {
40006ac8: 80 a2 20 00 cmp %o0, 0
40006acc: 02 80 00 21 be 40006b50 <pthread_getschedparam+0xac>
40006ad0: a2 10 00 08 mov %o0, %l1
40006ad4: f6 02 21 5c ld [ %o0 + 0x15c ], %i3
)
{
const POSIX_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
param->sched_ss_low_priority = _POSIX_Priority_From_core(
40006ad8: d4 06 e0 3c ld [ %i3 + 0x3c ], %o2
40006adc: d2 06 e0 38 ld [ %i3 + 0x38 ], %o1
40006ae0: 25 10 00 5c sethi %hi(0x40017000), %l2
40006ae4: 40 00 1d b2 call 4000e1ac <_POSIX_Priority_From_core>
40006ae8: 90 14 a2 f0 or %l2, 0x2f0, %o0 ! 400172f0 <_Scheduler_Table>
scheduler,
api->Sporadic.Low_priority.priority
);
param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period;
param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget;
40006aec: c4 1e e0 58 ldd [ %i3 + 0x58 ], %g2
40006af0: f8 1e e0 50 ldd [ %i3 + 0x50 ], %i4
param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period;
40006af4: d8 1e e0 40 ldd [ %i3 + 0x40 ], %o4
40006af8: d4 1e e0 48 ldd [ %i3 + 0x48 ], %o2
<== NOT EXECUTED
param->sched_ss_max_repl = api->Sporadic.sched_ss_max_repl;
40006afc: c2 06 e0 60 ld [ %i3 + 0x60 ], %g1
<== NOT EXECUTED
40006b00: c2 26 a0 28 st %g1, [ %i2 + 0x28 ]
<== NOT EXECUTED
param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget;
40006b04: f8 3e a0 18 std %i4, [ %i2 + 0x18 ]
<== NOT EXECUTED
40006b08: c4 3e a0 20 std %g2, [ %i2 + 0x20 ]
<== NOT EXECUTED
param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period;
40006b0c: d8 3e a0 08 std %o4, [ %i2 + 8 ]
<== NOT EXECUTED
40006b10: d4 3e a0 10 std %o2, [ %i2 + 0x10 ]
<== NOT EXECUTED
param->sched_ss_low_priority = _POSIX_Priority_From_core(
40006b14: d0 26 a0 04 st %o0, [ %i2 + 4 ]
<== NOT EXECUTED
_Thread_Wait_acquire_critical( the_thread, &queue_context );
scheduler = _Thread_Scheduler_get_home( the_thread );
_POSIX_Threads_Get_sched_param_sporadic( the_thread, scheduler, param );
priority = the_thread->Real_priority.priority;
40006b18: c4 1c 60 30 ldd [ %l1 + 0x30 ], %g2
<== NOT EXECUTED
budget_algorithm = the_thread->budget_algorithm;
40006b1c: fa 04 60 90 ld [ %l1 + 0x90 ], %i5
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006b20: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006b24: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006b28: 01 00 00 00 nop
_Thread_Wait_release( the_thread, &queue_context );
param->sched_priority = _POSIX_Priority_From_core( scheduler, priority );
40006b2c: 92 10 00 02 mov %g2, %o1
40006b30: 94 10 00 03 mov %g3, %o2
40006b34: 40 00 1d 9e call 4000e1ac <_POSIX_Priority_From_core>
40006b38: 90 14 a2 f0 or %l2, 0x2f0, %o0
40006b3c: d0 26 80 00 st %o0, [ %i2 ]
*policy = _POSIX_Thread_Translate_to_sched_policy( budget_algorithm );
return 0;
40006b40: b0 10 20 00 clr %i0
*policy = _POSIX_Thread_Translate_to_sched_policy( budget_algorithm );
40006b44: 40 00 1d a4 call 4000e1d4 <_POSIX_Thread_Translate_to_sched_policy>
40006b48: 90 10 00 1d mov %i5, %o0
40006b4c: d0 26 40 00 st %o0, [ %i1 ]
return 0;
40006b50: 81 c7 e0 08 ret
40006b54: 81 e8 00 00 restore
return EINVAL;
40006b58: b0 10 20 16 mov 0x16, %i0
}
40006b5c: 81 c7 e0 08 ret
40006b60: 81 e8 00 00 restore
40006560 <pthread_getspecific>:
ISR_Level level;
_ISR_Local_disable( level );
#endif
executing = _Thread_Executing;
40006560: c6 01 a0 20 ld [ %g6 + 0x20 ], %g3
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006564: 91 d0 20 09 ta 9
<== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE RBTree_Node * const *_RBTree_Root_const_reference(
const RBTree_Control *the_rbtree
)
{
return &RB_ROOT( the_rbtree );
40006568: 86 00 e1 60 add %g3, 0x160, %g3
RBTree_Node *parent;
link = _RBTree_Root_const_reference( the_rbtree );
parent = NULL;
while ( *link != NULL ) {
4000656c: c4 00 c0 00 ld [ %g3 ], %g2
40006570: 80 a0 a0 00 cmp %g2, 0
40006574: 02 80 00 0d be 400065a8 <pthread_getspecific+0x48>
40006578: 86 00 bf f8 add %g2, -8, %g3
const POSIX_Keys_Key_value_pair *the_right;
the_left = left;
the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right );
return *the_left == the_right->key;
4000657c: c8 00 e0 18 ld [ %g3 + 0x18 ], %g4
parent = *link;
if ( ( *equal )( key, parent ) ) {
40006580: 80 a2 00 04 cmp %o0, %g4
40006584: 22 80 00 0e be,a 400065bc <pthread_getspecific+0x5c>
40006588: d0 00 e0 20 ld [ %g3 + 0x20 ], %o0
return ( *map )( parent );
} else if ( ( *less )( key, parent ) ) {
4000658c: 1a bf ff f8 bcc 4000656c <pthread_getspecific+0xc>
40006590: 86 00 a0 04 add %g2, 4, %g3
return &RB_LEFT( the_node, Node );
40006594: 86 10 00 02 mov %g2, %g3
while ( *link != NULL ) {
40006598: c4 00 c0 00 ld [ %g3 ], %g2
4000659c: 80 a0 a0 00 cmp %g2, 0
400065a0: 12 bf ff f7 bne 4000657c <pthread_getspecific+0x1c>
<== NEVER TAKEN
400065a4: 86 00 bf f8 add %g2, -8, %g3
<== NOT EXECUTED
key_value_pair = _POSIX_Keys_Key_value_find( key, executing );
if ( key_value_pair != NULL ) {
value = key_value_pair->value;
} else {
value = NULL;
400065a8: 90 10 20 00 clr %o0
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400065ac: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400065b0: 01 00 00 00 nop
}
_POSIX_Keys_Key_value_release( executing, &lock_context );
return value;
}
400065b4: 81 c3 e0 08 retl
400065b8: 01 00 00 00 nop
400065bc: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400065c0: 01 00 00 00 nop
400065c4: 81 c3 e0 08 retl
400065c8: 01 00 00 00 nop
4000a644 <pthread_join>:
return 0;
}
int pthread_join( pthread_t thread, void **value_ptr )
{
4000a644: 9d e3 bf 78 save %sp, -136, %sp
4000a648: 37 10 00 3c sethi %hi(0x4000f000), %i3
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_join_at_exit(
States_Control the_states
)
{
return ( the_states & STATES_WAITING_FOR_JOIN_AT_EXIT ) != 0;
4000a64c: 21 00 00 08 sethi %hi(0x2000), %l0
4000a650: b6 16 e3 5c or %i3, 0x35c, %i3
_Thread_Join(
4000a654: 35 04 00 10 sethi %hi(0x10004000), %i2
the_thread = _Thread_Get( thread, &queue_context.Lock_context.Lock_context );
4000a658: 92 07 bf dc add %fp, -36, %o1
queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing_extra;
4000a65c: f6 27 bf e4 st %i3, [ %fp + -28 ]
4000a660: 40 00 11 d4 call 4000edb0 <_Thread_Get>
4000a664: 90 10 00 18 mov %i0, %o0
if ( the_thread == NULL ) {
4000a668: 80 a2 20 00 cmp %o0, 0
4000a66c: 02 80 00 2e be 4000a724 <pthread_join+0xe0>
4000a670: b8 10 00 06 mov %g6, %i4
return cpu->executing;
4000a674: fa 01 a0 20 ld [ %g6 + 0x20 ], %i5
if ( executing == the_thread ) {
4000a678: 80 a2 00 1d cmp %o0, %i5
4000a67c: 02 80 00 2c be 4000a72c <pthread_join+0xe8>
4000a680: 01 00 00 00 nop
return ( the_thread->Life.state & THREAD_LIFE_DETACHED ) == 0;
4000a684: c4 02 21 70 ld [ %o0 + 0x170 ], %g2
if ( !_Thread_Is_joinable( the_thread ) ) {
4000a688: 80 88 a0 10 btst 0x10, %g2
4000a68c: 12 80 00 21 bne 4000a710 <pthread_join+0xcc>
4000a690: 96 07 bf dc add %fp, -36, %o3
4000a694: c4 02 20 1c ld [ %o0 + 0x1c ], %g2
_Thread_Join(
4000a698: 94 10 00 1d mov %i5, %o2
if ( _States_Is_waiting_for_join_at_exit( the_thread->current_state ) ) {
4000a69c: 80 88 80 10 btst %g2, %l0
4000a6a0: 02 80 00 13 be 4000a6ec <pthread_join+0xa8>
4000a6a4: 92 10 00 1a mov %i2, %o1
value = the_thread->Life.exit_value;
4000a6a8: fa 02 21 78 ld [ %o0 + 0x178 ], %i5
_Thread_Clear_state_locked( the_thread, STATES_WAITING_FOR_JOIN_AT_EXIT );
4000a6ac: 40 00 10 fb call 4000ea98 <_Thread_Clear_state_locked>
4000a6b0: 13 00 00 08 sethi %hi(0x2000), %o1
disable_level = cpu_self->thread_dispatch_disable_level;
4000a6b4: c2 07 20 18 ld [ %i4 + 0x18 ], %g1
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4000a6b8: 82 00 60 01 inc %g1
<== NOT EXECUTED
4000a6bc: c2 27 20 18 st %g1, [ %i4 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000a6c0: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000a6c4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000a6c8: 01 00 00 00 nop
_Thread_Dispatch_direct( cpu_self );
4000a6cc: 40 00 11 a1 call 4000ed50 <_Thread_Dispatch_direct>
4000a6d0: 90 10 00 1c mov %i4, %o0
if ( value_ptr != NULL ) {
4000a6d4: 80 a6 60 00 cmp %i1, 0
4000a6d8: 02 80 00 03 be 4000a6e4 <pthread_join+0xa0>
4000a6dc: b0 10 20 00 clr %i0
*value_ptr = value;
4000a6e0: fa 26 40 00 st %i5, [ %i1 ]
do {
error = _POSIX_Threads_Join( thread, value_ptr );
} while ( error == EINTR );
return error;
}
4000a6e4: 81 c7 e0 08 ret
4000a6e8: 81 e8 00 00 restore
_Thread_Join(
4000a6ec: 40 00 17 ad call 400105a0 <_Thread_Join>
4000a6f0: 01 00 00 00 nop
return _POSIX_Get_by_name_error_table[ error ];
}
RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status )
{
return STATUS_GET_POSIX( status );
4000a6f4: c2 07 60 4c ld [ %i5 + 0x4c ], %g1
4000a6f8: 83 38 60 08 sra %g1, 8, %g1
if ( _POSIX_Get_error_after_wait( executing ) != 0 ) {
4000a6fc: 80 a0 60 00 cmp %g1, 0
4000a700: 12 bf ff d7 bne 4000a65c <pthread_join+0x18>
4000a704: 92 07 bf dc add %fp, -36, %o1
value = executing->Wait.return_argument;
4000a708: 10 bf ff f3 b 4000a6d4 <pthread_join+0x90>
4000a70c: fa 07 60 40 ld [ %i5 + 0x40 ], %i5
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000a710: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000a714: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000a718: 01 00 00 00 nop
return EINVAL;
4000a71c: 81 c7 e0 08 ret
4000a720: 91 e8 20 16 restore %g0, 0x16, %o0
return ESRCH;
4000a724: 81 c7 e0 08 ret
4000a728: 91 e8 20 03 restore %g0, 3, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000a72c: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000a730: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000a734: 01 00 00 00 nop
return EDEADLK;
4000a738: 81 c7 e0 08 ret
4000a73c: 91 e8 20 2d restore %g0, 0x2d, %o0
4000653c <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
)
{
4000653c: 9d e3 bf 98 save %sp, -104, %sp
_RTEMS_Lock_allocator();
40006540: 40 00 03 74 call 40007310 <_RTEMS_Lock_allocator>
40006544: 33 10 00 68 sethi %hi(0x4001a000), %i1
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
}
RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get( pthread_key_t key )
{
return (POSIX_Keys_Control *)
40006548: 90 10 00 18 mov %i0, %o0
the_key = _POSIX_Keys_Get( key );
if ( the_key != NULL ) {
_POSIX_Keys_Destroy( the_key );
eno = 0;
} else {
eno = EINVAL;
4000654c: b0 10 20 16 mov 0x16, %i0
40006550: 40 00 0c a7 call 400097ec <_Objects_Get_no_protection>
40006554: 92 16 63 58 or %i1, 0x358, %o1
if ( the_key != NULL ) {
40006558: 80 a2 20 00 cmp %o0, 0
4000655c: 02 80 00 24 be 400065ec <pthread_key_delete+0xb0>
40006560: b8 10 00 08 mov %o0, %i4
_Objects_Close( &_POSIX_Keys_Information, &the_key->Object );
40006564: 92 10 00 08 mov %o0, %o1
40006568: 40 00 0b a9 call 4000940c <_Objects_Close>
4000656c: 90 16 63 58 or %i1, 0x358, %o0
return _Chain_Immutable_head( the_chain )->next;
40006570: fa 07 20 14 ld [ %i4 + 0x14 ], %i5
return &the_chain->Tail.Node;
40006574: b4 07 20 18 add %i4, 0x18, %i2
while ( !_Chain_Is_empty( &the_key->Key_value_pairs ) ) {
40006578: 80 a6 80 1d cmp %i2, %i5
4000657c: 02 80 00 19 be 400065e0 <pthread_key_delete+0xa4>
40006580: 92 10 00 1c mov %i4, %o1
40006584: 37 10 00 68 sethi %hi(0x4001a000), %i3
<== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _POSIX_Keys_Key_value_free(
POSIX_Keys_Key_value_pair *key_value_pair
)
{
_Chain_Extract_unprotected( &key_value_pair->Key_node );
_Freechain_Put( &_POSIX_Keys_Keypool, key_value_pair );
40006588: b6 16 e3 94 or %i3, 0x394, %i3 ! 4001a394 <_POSIX_Keys_Keypool>
<== NOT EXECUTED
the_thread = key_value_pair->thread;
4000658c: d0 07 60 1c ld [ %i5 + 0x1c ], %o0
<== NOT EXECUTED
40006590: 91 d0 20 09 ta 9
<== NOT EXECUTED
return psr;
40006594: c2 27 bf fc st %g1, [ %fp + -4 ]
_RBTree_Extract(
40006598: 92 07 60 08 add %i5, 8, %o1
4000659c: 40 00 0d 5c call 40009b0c <_RBTree_Extract>
400065a0: 90 02 21 60 add %o0, 0x160, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400065a4: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400065a8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400065ac: 01 00 00 00 nop
next = the_node->next;
400065b0: c4 07 40 00 ld [ %i5 ], %g2
previous = the_node->previous;
400065b4: c2 07 60 04 ld [ %i5 + 4 ], %g1
next->previous = previous;
400065b8: c2 20 a0 04 st %g1, [ %g2 + 4 ]
400065bc: 92 10 00 1d mov %i5, %o1
previous->next = next;
400065c0: c4 20 40 00 st %g2, [ %g1 ]
400065c4: 40 00 03 e9 call 40007568 <_Freechain_Put>
400065c8: 90 10 00 1b mov %i3, %o0
return _Chain_Immutable_head( the_chain )->next;
400065cc: fa 07 20 14 ld [ %i4 + 0x14 ], %i5
while ( !_Chain_Is_empty( &the_key->Key_value_pairs ) ) {
400065d0: 80 a7 40 1a cmp %i5, %i2
400065d4: 32 bf ff ef bne,a 40006590 <pthread_key_delete+0x54>
<== NEVER TAKEN
400065d8: d0 07 60 1c ld [ %i5 + 0x1c ], %o0
<== NOT EXECUTED
_Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
400065dc: 92 10 00 1c mov %i4, %o1
400065e0: 90 16 63 58 or %i1, 0x358, %o0
400065e4: 40 00 0c 56 call 4000973c <_Objects_Free>
400065e8: b0 10 20 00 clr %i0
_RTEMS_Unlock_allocator();
400065ec: 40 00 03 4e call 40007324 <_RTEMS_Unlock_allocator>
400065f0: 01 00 00 00 nop
}
_Objects_Allocator_unlock();
return eno;
}
400065f4: 81 c7 e0 08 ret
400065f8: 81 e8 00 00 restore
40006e44 <pthread_kill>:
#include <rtems/posix/threadsup.h>
#include <rtems/posix/psignalimpl.h>
#include <rtems/score/threadimpl.h>
int pthread_kill( pthread_t thread, int sig )
{
40006e44: 9d e3 bf 90 save %sp, -112, %sp
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
40006e48: ba 06 7f ff add %i1, -1, %i5
Thread_Control *the_thread;
ISR_lock_Context lock_context;
POSIX_API_Control *api;
Per_CPU_Control *cpu_self;
if ( !is_valid_signo( sig ) ) {
40006e4c: 80 a7 60 1f cmp %i5, 0x1f
40006e50: 18 80 00 28 bgu 40006ef0 <pthread_kill+0xac>
40006e54: 82 10 20 16 mov 0x16, %g1
return EINVAL;
}
the_thread = _Thread_Get( thread, &lock_context );
40006e58: 92 07 bf fc add %fp, -4, %o1
40006e5c: 40 00 11 61 call 4000b3e0 <_Thread_Get>
40006e60: 90 10 00 18 mov %i0, %o0
if ( the_thread == NULL ) {
40006e64: 86 92 20 00 orcc %o0, 0, %g3
40006e68: 02 80 00 22 be 40006ef0 <pthread_kill+0xac>
40006e6c: 82 10 20 03 mov 3, %g1
return ESRCH;
}
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
40006e70: 83 2e 60 01 sll %i1, 1, %g1
40006e74: 82 00 40 19 add %g1, %i1, %g1
40006e78: 85 28 60 02 sll %g1, 2, %g2
40006e7c: 03 10 00 74 sethi %hi(0x4001d000), %g1
40006e80: 82 10 63 88 or %g1, 0x388, %g1 ! 4001d388 <_POSIX_signals_Vectors>
40006e84: 82 00 40 02 add %g1, %g2, %g1
40006e88: c2 00 60 08 ld [ %g1 + 8 ], %g1
40006e8c: 80 a0 60 01 cmp %g1, 1
40006e90: 02 80 00 24 be 40006f20 <pthread_kill+0xdc>
40006e94: 01 00 00 00 nop
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
40006e98: c8 00 e1 5c ld [ %g3 + 0x15c ], %g4
<== NOT EXECUTED
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
40006e9c: c4 01 20 6c ld [ %g4 + 0x6c ], %g2
<== NOT EXECUTED
const ISR_lock_Context *lock_context
)
{
uint32_t disable_level;
disable_level = cpu_self->thread_dispatch_disable_level;
40006ea0: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
<== NOT EXECUTED
return 1u << (sig - 1);
40006ea4: 86 10 20 01 mov 1, %g3
<== NOT EXECUTED
40006ea8: bb 28 c0 1d sll %g3, %i5, %i5
<== NOT EXECUTED
40006eac: ba 10 80 1d or %g2, %i5, %i5
<== NOT EXECUTED
40006eb0: fa 21 20 6c st %i5, [ %g4 + 0x6c ]
<== NOT EXECUTED
_Profiling_Thread_dispatch_disable_critical(
cpu_self,
disable_level,
lock_context
);
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40006eb4: 82 00 60 01 inc %g1
<== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Dispatch_disable_critical(
const ISR_lock_Context *lock_context
)
{
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
40006eb8: b8 10 00 06 mov %g6, %i4
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40006ebc: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006ec0: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006ec4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006ec8: 01 00 00 00 nop
cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
_ISR_lock_ISR_enable( &lock_context );
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
40006ecc: 94 10 20 00 clr %o2 ! 0 <PROM_START>
40006ed0: 40 00 20 13 call 4000ef1c <_POSIX_signals_Unblock_thread>
40006ed4: 92 10 00 19 mov %i1, %o1
*
* @param[in] cpu_self The current processor.
*/
RTEMS_INLINE_ROUTINE void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
{
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
40006ed8: c2 07 20 18 ld [ %i4 + 0x18 ], %g1
if ( disable_level == 1 ) {
40006edc: 80 a0 60 01 cmp %g1, 1
40006ee0: 02 80 00 06 be 40006ef8 <pthread_kill+0xb4>
40006ee4: 84 00 7f ff add %g1, -1, %g2
}
_ISR_Local_enable( level );
} else {
_Assert( disable_level > 0 );
cpu_self->thread_dispatch_disable_level = disable_level - 1;
40006ee8: c4 27 20 18 st %g2, [ %i4 + 0x18 ]
_Thread_Dispatch_enable( cpu_self );
return 0;
40006eec: 82 10 20 00 clr %g1
}
40006ef0: 81 c7 e0 08 ret
40006ef4: 91 e8 00 01 restore %g0, %g1, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006ef8: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
40006efc: c4 0f 20 1c ldub [ %i4 + 0x1c ], %g2
40006f00: 80 a0 a0 00 cmp %g2, 0
40006f04: 12 80 00 0d bne 40006f38 <pthread_kill+0xf4>
<== ALWAYS TAKEN
40006f08: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
40006f0c: c0 27 20 18 clr [ %i4 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006f10: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006f14: 01 00 00 00 nop
return 0;
40006f18: 10 bf ff f6 b 40006ef0 <pthread_kill+0xac>
40006f1c: 82 10 20 00 clr %g1 ! 0 <PROM_START>
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006f20: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006f24: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006f28: 01 00 00 00 nop
return 0;
40006f2c: 82 10 20 00 clr %g1 ! 0 <PROM_START>
}
40006f30: 81 c7 e0 08 ret
40006f34: 91 e8 00 01 restore %g0, %g1, %o0
_Thread_Do_dispatch( cpu_self, level );
40006f38: c2 27 bf f4 st %g1, [ %fp + -12 ]
40006f3c: 40 00 10 ba call 4000b224 <_Thread_Do_dispatch>
40006f40: 90 10 00 1c mov %i4, %o0
40006f44: 10 bf ff f3 b 40006f10 <pthread_kill+0xcc>
40006f48: c2 07 bf f4 ld [ %fp + -12 ], %g1
4000971c <pthread_mutex_destroy>:
*/
int pthread_mutex_destroy(
pthread_mutex_t *mutex
)
{
4000971c: 9d e3 bf a0 save %sp, -96, %sp
unsigned long flags;
Thread_queue_Context queue_context;
int eno;
the_mutex = _POSIX_Mutex_Get( mutex );
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009720: 80 a6 20 00 cmp %i0, 0
40009724: 02 80 00 18 be 40009784 <pthread_mutex_destroy+0x68>
40009728: 05 25 87 04 sethi %hi(0x961c1000), %g2
4000972c: c2 06 00 00 ld [ %i0 ], %g1
40009730: 82 1e 00 01 xor %i0, %g1, %g1
40009734: 84 10 a3 b8 or %g2, 0x3b8, %g2
40009738: 82 18 40 02 xor %g1, %g2, %g1
4000973c: 80 88 7f f8 btst -8, %g1
40009740: 12 80 00 0c bne 40009770 <pthread_mutex_destroy+0x54>
40009744: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40009748: 91 d0 20 09 ta 9
<== NOT EXECUTED
_POSIX_Mutex_Acquire( the_mutex, &queue_context );
if ( _POSIX_Mutex_Get_owner( the_mutex ) == NULL ) {
4000974c: c4 06 20 10 ld [ %i0 + 0x10 ], %g2
40009750: 80 a0 a0 00 cmp %g2, 0
40009754: 22 80 00 0e be,a 4000978c <pthread_mutex_destroy+0x70>
40009758: c4 06 00 00 ld [ %i0 ], %g2
the_mutex->flags = ~the_mutex->flags;
eno = 0;
} else {
eno = EBUSY;
4000975c: b0 10 20 10 mov 0x10, %i0
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009760: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009764: 01 00 00 00 nop
}
_POSIX_Mutex_Release( the_mutex, &queue_context );
return eno;
}
40009768: 81 c7 e0 08 ret
4000976c: 81 e8 00 00 restore
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009770: 40 00 01 9a call 40009dd8 <_POSIX_Mutex_Auto_initialization>
40009774: 90 10 00 18 mov %i0, %o0
40009778: 80 a2 20 00 cmp %o0, 0
4000977c: 12 bf ff f3 bne 40009748 <pthread_mutex_destroy+0x2c>
40009780: 01 00 00 00 nop
40009784: 81 c7 e0 08 ret
40009788: 91 e8 20 16 restore %g0, 0x16, %o0
the_mutex->flags = ~the_mutex->flags;
4000978c: 84 38 00 02 xnor %g0, %g2, %g2
<== NOT EXECUTED
40009790: c4 26 00 00 st %g2, [ %i0 ]
<== NOT EXECUTED
eno = 0;
40009794: b0 10 20 00 clr %i0
<== NOT EXECUTED
40009798: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000979c: 01 00 00 00 nop
}
400097a0: 81 c7 e0 08 ret
400097a4: 81 e8 00 00 restore
400097a8 <pthread_mutex_getprioceiling>:
#else
pthread_mutex_t *mutex,
#endif
int *prioceiling
)
{
400097a8: 9d e3 bf 98 save %sp, -104, %sp
if ( prioceiling == NULL ) {
return EINVAL;
}
the_mutex = _POSIX_Mutex_Get( RTEMS_DECONST( pthread_mutex_t *, mutex ) );
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
400097ac: 80 a6 60 00 cmp %i1, 0
400097b0: 02 80 00 1a be 40009818 <pthread_mutex_getprioceiling+0x70>
400097b4: 80 a6 20 00 cmp %i0, 0
400097b8: 02 80 00 18 be 40009818 <pthread_mutex_getprioceiling+0x70>
400097bc: 05 25 87 04 sethi %hi(0x961c1000), %g2
400097c0: fa 06 00 00 ld [ %i0 ], %i5
400097c4: 82 1e 00 1d xor %i0, %i5, %g1
400097c8: 84 10 a3 b8 or %g2, 0x3b8, %g2
400097cc: 82 18 40 02 xor %g1, %g2, %g1
400097d0: 80 88 7f f8 btst -8, %g1
400097d4: 12 80 00 0c bne 40009804 <pthread_mutex_getprioceiling+0x5c>
400097d8: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400097dc: 91 d0 20 09 ta 9
<== NOT EXECUTED
RTEMS_INLINE_ROUTINE POSIX_Mutex_Protocol _POSIX_Mutex_Get_protocol(
unsigned long flags
)
{
return flags & POSIX_MUTEX_PROTOCOL_MASK;
400097e0: ba 0f 60 03 and %i5, 3, %i5
_POSIX_Mutex_Acquire( the_mutex, &queue_context );
if ( _POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_CEILING ) {
400097e4: 80 a7 60 02 cmp %i5, 2
400097e8: 22 80 00 0e be,a 40009820 <pthread_mutex_getprioceiling+0x78>
400097ec: d2 06 20 30 ld [ %i0 + 0x30 ], %o1
*prioceiling = _POSIX_Priority_From_core(
_POSIX_Mutex_Get_scheduler( the_mutex ),
_POSIX_Mutex_Get_priority( the_mutex )
);
} else {
*prioceiling = 0;
400097f0: c0 26 40 00 clr [ %i1 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400097f4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400097f8: 01 00 00 00 nop
}
_POSIX_Mutex_Release( the_mutex, &queue_context );
return 0;
}
400097fc: 81 c7 e0 08 ret
40009800: 91 e8 20 00 restore %g0, 0, %o0
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009804: 40 00 01 75 call 40009dd8 <_POSIX_Mutex_Auto_initialization>
40009808: 90 10 00 18 mov %i0, %o0
4000980c: 80 a2 20 00 cmp %o0, 0
40009810: 12 bf ff f3 bne 400097dc <pthread_mutex_getprioceiling+0x34>
<== ALWAYS TAKEN
40009814: 01 00 00 00 nop
40009818: 81 c7 e0 08 ret
4000981c: 91 e8 20 16 restore %g0, 0x16, %o0
*prioceiling = _POSIX_Priority_From_core(
40009820: d4 06 20 34 ld [ %i0 + 0x34 ], %o2
40009824: c2 27 bf fc st %g1, [ %fp + -4 ]
40009828: 11 10 00 6d sethi %hi(0x4001b400), %o0
4000982c: 40 00 02 41 call 4000a130 <_POSIX_Priority_From_core>
40009830: 90 12 21 08 or %o0, 0x108, %o0 ! 4001b508 <_Scheduler_Table>
40009834: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
40009838: d0 26 40 00 st %o0, [ %i1 ]
<== NOT EXECUTED
4000983c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009840: 01 00 00 00 nop
}
40009844: 81 c7 e0 08 ret
40009848: 91 e8 20 00 restore %g0, 0, %o0
4000984c <pthread_mutex_init>:
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
)
{
4000984c: 9d e3 bf 98 save %sp, -104, %sp
POSIX_Mutex_Protocol protocol;
unsigned long flags;
Priority_Control priority;
const Scheduler_Control *scheduler;
if ( attr ) the_attr = attr;
40009850: 80 a6 60 00 cmp %i1, 0
40009854: 02 80 00 0f be 40009890 <pthread_mutex_init+0x44>
40009858: ba 10 00 18 mov %i0, %i5
else the_attr = &_POSIX_Mutex_Default_attributes;
/* Check for NULL mutex */
if ( !mutex )
4000985c: 80 a6 20 00 cmp %i0, 0
40009860: 02 80 00 44 be 40009970 <pthread_mutex_init+0x124>
40009864: 01 00 00 00 nop
* value in an uninitialized variable to make this fail.
*
* Thus, we do not look at *mutex.
*/
if ( !the_attr->is_initialized )
40009868: c2 06 40 00 ld [ %i1 ], %g1
4000986c: 80 a0 60 00 cmp %g1, 0
40009870: 02 80 00 06 be 40009888 <pthread_mutex_init+0x3c>
40009874: b0 10 20 16 mov 0x16, %i0
return EINVAL;
if ( !_POSIX_Is_valid_pshared( the_attr->process_shared ) ) {
40009878: c2 06 60 04 ld [ %i1 + 4 ], %g1
4000987c: 80 a0 60 01 cmp %g1, 1
40009880: 28 80 00 16 bleu,a 400098d8 <pthread_mutex_init+0x8c>
40009884: c2 06 60 0c ld [ %i1 + 0xc ], %g1
);
the_mutex->Recursive.nest_level = 0;
_Priority_Node_initialize( &the_mutex->Priority_ceiling, priority );
the_mutex->scheduler = scheduler;
return 0;
}
40009888: 81 c7 e0 08 ret
4000988c: 81 e8 00 00 restore
if ( !mutex )
40009890: 80 a6 20 00 cmp %i0, 0
40009894: 02 80 00 37 be 40009970 <pthread_mutex_init+0x124>
40009898: 03 25 87 04 sethi %hi(0x961c1000), %g1
flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC;
4000989c: 82 10 63 b8 or %g1, 0x3b8, %g1 ! 961c13b8 <RAM_END+0x55dc13b8>
400098a0: 82 1e 00 01 xor %i0, %g1, %g1
flags &= ~POSIX_MUTEX_FLAGS_MASK;
400098a4: 82 08 7f f8 and %g1, -8, %g1
the_mutex->flags = flags;
400098a8: c2 26 00 00 st %g1, [ %i0 ]
scheduler = NULL;
400098ac: 84 10 20 00 clr %g2
priority = 0;
400098b0: 90 10 20 00 clr %o0
400098b4: 92 10 20 00 clr %o1
)
{
#if defined(RTEMS_SMP)
_SMP_ticket_lock_Initialize( &queue->Lock );
#endif
queue->heads = NULL;
400098b8: c0 27 60 0c clr [ %i5 + 0xc ]
queue->owner = NULL;
400098bc: c0 27 60 10 clr [ %i5 + 0x10 ]
queue->name = name;
400098c0: c0 27 60 14 clr [ %i5 + 0x14 ]
the_mutex->Recursive.nest_level = 0;
400098c4: c0 27 60 18 clr [ %i5 + 0x18 ]
RTEMS_INLINE_ROUTINE void _Priority_Node_initialize(
Priority_Node *node,
Priority_Control priority
)
{
node->priority = priority;
400098c8: d0 3f 60 30 std %o0, [ %i5 + 0x30 ]
the_mutex->scheduler = scheduler;
400098cc: c4 27 60 38 st %g2, [ %i5 + 0x38 ]
return 0;
400098d0: 81 c7 e0 08 ret
400098d4: 91 e8 20 00 restore %g0, 0, %o0
switch ( the_attr->protocol ) {
400098d8: 80 a0 60 01 cmp %g1, 1
400098dc: 02 80 00 27 be 40009978 <pthread_mutex_init+0x12c>
400098e0: 80 a0 60 02 cmp %g1, 2
400098e4: 02 80 00 27 be 40009980 <pthread_mutex_init+0x134>
400098e8: 80 a0 60 00 cmp %g1, 0
400098ec: 12 bf ff e7 bne 40009888 <pthread_mutex_init+0x3c>
400098f0: 84 10 20 00 clr %g2
switch ( the_attr->type ) {
400098f4: c2 06 60 10 ld [ %i1 + 0x10 ], %g1
400098f8: 80 a0 60 03 cmp %g1, 3
400098fc: 18 bf ff e3 bgu 40009888 <pthread_mutex_init+0x3c>
40009900: b0 10 20 16 mov 0x16, %i0
if ( the_attr->type == PTHREAD_MUTEX_RECURSIVE ) {
40009904: 80 a0 60 01 cmp %g1, 1
flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC;
40009908: 03 25 87 04 sethi %hi(0x961c1000), %g1
4000990c: 82 10 63 b8 or %g1, 0x3b8, %g1 ! 961c13b8 <RAM_END+0x55dc13b8>
40009910: 82 1f 40 01 xor %i5, %g1, %g1
flags &= ~POSIX_MUTEX_FLAGS_MASK;
40009914: 82 08 7f f8 and %g1, -8, %g1
if ( the_attr->type == PTHREAD_MUTEX_RECURSIVE ) {
40009918: 12 80 00 03 bne 40009924 <pthread_mutex_init+0xd8>
<== ALWAYS TAKEN
4000991c: 82 10 80 01 or %g2, %g1, %g1
flags |= POSIX_MUTEX_RECURSIVE;
40009920: 82 10 60 04 or %g1, 4, %g1
<== NOT EXECUTED
if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
40009924: 80 a0 a0 02 cmp %g2, 2
40009928: 12 80 00 18 bne 40009988 <pthread_mutex_init+0x13c>
4000992c: c2 27 40 00 st %g1, [ %i5 ]
prio_ceiling = the_attr->prio_ceiling;
40009930: d2 06 60 08 ld [ %i1 + 8 ], %o1
if ( prio_ceiling == INT_MAX ) {
40009934: 03 1f ff ff sethi %hi(0x7ffffc00), %g1
40009938: 82 10 63 ff or %g1, 0x3ff, %g1 ! 7fffffff <RAM_END+0x3fbfffff>
4000993c: 80 a2 40 01 cmp %o1, %g1
40009940: 12 80 00 05 bne 40009954 <pthread_mutex_init+0x108>
40009944: 39 10 00 6d sethi %hi(0x4001b400), %i4
RTEMS_INLINE_ROUTINE int _POSIX_Priority_Get_maximum(
const Scheduler_Control *scheduler
)
{
_Assert( (int) scheduler->maximum_priority > 1 );
return (int) scheduler->maximum_priority - 1;
40009948: 82 17 21 08 or %i4, 0x108, %g1 ! 4001b508 <_Scheduler_Table>
4000994c: d2 00 60 44 ld [ %g1 + 0x44 ], %o1
40009950: 92 02 7f ff add %o1, -1, %o1
priority = _POSIX_Priority_To_core( scheduler, prio_ceiling, &valid );
40009954: 94 07 bf ff add %fp, -1, %o2
40009958: 40 00 01 d9 call 4000a0bc <_POSIX_Priority_To_core>
4000995c: 90 17 21 08 or %i4, 0x108, %o0
if ( !valid ) {
40009960: c2 0f bf ff ldub [ %fp + -1 ], %g1
40009964: 80 a0 60 00 cmp %g1, 0
40009968: 12 bf ff d4 bne 400098b8 <pthread_mutex_init+0x6c>
4000996c: 84 17 21 08 or %i4, 0x108, %g2
return EINVAL;
40009970: 81 c7 e0 08 ret
40009974: 91 e8 20 16 restore %g0, 0x16, %o0
protocol = POSIX_MUTEX_PRIORITY_INHERIT;
40009978: 10 bf ff df b 400098f4 <pthread_mutex_init+0xa8>
4000997c: 84 10 20 01 mov 1, %g2
break;
40009980: 10 bf ff dd b 400098f4 <pthread_mutex_init+0xa8>
40009984: 84 10 20 02 mov 2, %g2
scheduler = NULL;
40009988: 84 10 20 00 clr %g2
priority = 0;
4000998c: 90 10 20 00 clr %o0
40009990: 10 bf ff ca b 400098b8 <pthread_mutex_init+0x6c>
40009994: 92 10 20 00 clr %o1
40009c48 <pthread_mutex_setprioceiling>:
int pthread_mutex_setprioceiling(
pthread_mutex_t *mutex,
int prioceiling,
int *old_ceiling
)
{
40009c48: 9d e3 bf 70 save %sp, -144, %sp
POSIX_Mutex_Control *the_mutex;
int error;
int unlock_error;
if ( old_ceiling == NULL ) {
40009c4c: 80 a6 a0 00 cmp %i2, 0
40009c50: 02 80 00 12 be 40009c98 <pthread_mutex_setprioceiling+0x50>
40009c54: ba 10 20 16 mov 0x16, %i5
/*
* Must acquire the mutex before we can change it's ceiling.
* POSIX says block until we acquire it.
*/
error = pthread_mutex_lock( mutex );
40009c58: 7f ff ff 50 call 40009998 <pthread_mutex_lock>
40009c5c: 90 10 00 18 mov %i0, %o0
if ( error != 0 ) {
40009c60: ba 92 20 00 orcc %o0, 0, %i5
40009c64: 32 80 00 0d bne,a 40009c98 <pthread_mutex_setprioceiling+0x50>
40009c68: ba 10 20 16 mov 0x16, %i5
return flags & POSIX_MUTEX_PROTOCOL_MASK;
40009c6c: c2 06 00 00 ld [ %i0 ], %g1
40009c70: 82 08 60 03 and %g1, 3, %g1
return EINVAL;
}
the_mutex = _POSIX_Mutex_Get( mutex );
if (
40009c74: 80 a0 60 02 cmp %g1, 2
40009c78: 22 80 00 0a be,a 40009ca0 <pthread_mutex_setprioceiling+0x58>
<== ALWAYS TAKEN
40009c7c: d2 06 20 30 ld [ %i0 + 0x30 ], %o1
error = 0;
} else {
error = EINVAL;
}
} else {
*old_ceiling = 0;
40009c80: c0 26 80 00 clr [ %i2 ]
<== NOT EXECUTED
error = 0;
}
unlock_error = pthread_mutex_unlock( mutex );
40009c84: 90 10 00 18 mov %i0, %o0
40009c88: 40 00 00 7b call 40009e74 <pthread_mutex_unlock>
40009c8c: b0 10 00 1d mov %i5, %i0
_Assert( unlock_error == 0 );
(void) unlock_error;
return error;
}
40009c90: 81 c7 e0 08 ret
40009c94: 81 e8 00 00 restore
40009c98: 81 c7 e0 08 ret
40009c9c: 91 e8 00 1d restore %g0, %i5, %o0
*old_ceiling = _POSIX_Priority_From_core( scheduler, old_priority );
40009ca0: d4 06 20 34 ld [ %i0 + 0x34 ], %o2
40009ca4: 39 10 00 6d sethi %hi(0x4001b400), %i4
40009ca8: 40 00 01 22 call 4000a130 <_POSIX_Priority_From_core>
40009cac: 90 17 21 08 or %i4, 0x108, %o0 ! 4001b508 <_Scheduler_Table>
40009cb0: d0 26 80 00 st %o0, [ %i2 ]
new_priority = _POSIX_Priority_To_core( scheduler, prioceiling, &valid );
40009cb4: 94 07 bf db add %fp, -37, %o2
40009cb8: 92 10 00 19 mov %i1, %o1
40009cbc: 40 00 01 00 call 4000a0bc <_POSIX_Priority_To_core>
40009cc0: 90 17 21 08 or %i4, 0x108, %o0
if ( valid ) {
40009cc4: c2 0f bf db ldub [ %fp + -37 ], %g1
40009cc8: 80 a0 60 00 cmp %g1, 0
40009ccc: 32 80 00 04 bne,a 40009cdc <pthread_mutex_setprioceiling+0x94>
40009cd0: c0 27 bf f0 clr [ %fp + -16 ]
error = EINVAL;
40009cd4: 10 bf ff ec b 40009c84 <pthread_mutex_setprioceiling+0x3c>
40009cd8: ba 10 20 16 mov 0x16, %i5
40009cdc: c4 06 20 10 ld [ %i0 + 0x10 ], %g2
if ( owner != NULL ) {
40009ce0: 80 a0 a0 00 cmp %g2, 0
40009ce4: 22 80 00 1b be,a 40009d50 <pthread_mutex_setprioceiling+0x108>
<== NEVER TAKEN
40009ce8: d0 3e 20 30 std %o0, [ %i0 + 0x30 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40009cec: 91 d0 20 09 ta 9
<== NOT EXECUTED
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40009cf0: c2 27 bf dc st %g1, [ %fp + -36 ]
RTEMS_INLINE_ROUTINE void _Priority_Node_set_priority(
Priority_Node *node,
Priority_Control priority
)
{
node->priority = priority;
40009cf4: d0 3e 20 30 std %o0, [ %i0 + 0x30 ]
_Thread_Priority_changed(
40009cf8: b6 07 bf dc add %fp, -36, %i3
40009cfc: 94 10 20 00 clr %o2
40009d00: 96 10 00 1b mov %i3, %o3
40009d04: 92 06 20 20 add %i0, 0x20, %o1
40009d08: 40 00 13 3c call 4000e9f8 <_Thread_Priority_changed>
40009d0c: 90 10 00 02 mov %g2, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009d10: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009d14: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009d18: 01 00 00 00 nop
disable_level = cpu_self->thread_dispatch_disable_level;
40009d1c: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40009d20: 82 00 60 01 inc %g1
40009d24: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
40009d28: b8 10 00 06 mov %g6, %i4
_Thread_Priority_update( &queue_context );
40009d2c: 40 00 13 3a call 4000ea14 <_Thread_Priority_update>
40009d30: 90 10 00 1b mov %i3, %o0
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
40009d34: c2 07 20 18 ld [ %i4 + 0x18 ], %g1
if ( disable_level == 1 ) {
40009d38: 80 a0 60 01 cmp %g1, 1
40009d3c: 02 80 00 07 be 40009d58 <pthread_mutex_setprioceiling+0x110>
<== ALWAYS TAKEN
40009d40: 82 00 7f ff add %g1, -1, %g1
cpu_self->thread_dispatch_disable_level = disable_level - 1;
40009d44: c2 27 20 18 st %g1, [ %i4 + 0x18 ]
<== NOT EXECUTED
unlock_error = pthread_mutex_unlock( mutex );
40009d48: 10 bf ff d0 b 40009c88 <pthread_mutex_setprioceiling+0x40>
<== NOT EXECUTED
40009d4c: 90 10 00 18 mov %i0, %o0
<== NOT EXECUTED
40009d50: 10 bf ff f3 b 40009d1c <pthread_mutex_setprioceiling+0xd4>
<== NOT EXECUTED
40009d54: b6 07 bf dc add %fp, -36, %i3
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40009d58: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
40009d5c: c4 0f 20 1c ldub [ %i4 + 0x1c ], %g2
40009d60: 80 a0 a0 00 cmp %g2, 0
40009d64: 12 80 00 07 bne 40009d80 <pthread_mutex_setprioceiling+0x138>
<== NEVER TAKEN
40009d68: 92 10 00 01 mov %g1, %o1
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = 0;
40009d6c: c0 27 20 18 clr [ %i4 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009d70: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009d74: 01 00 00 00 nop
40009d78: 10 bf ff c4 b 40009c88 <pthread_mutex_setprioceiling+0x40>
40009d7c: 90 10 00 18 mov %i0, %o0
_Thread_Do_dispatch( cpu_self, level );
40009d80: c2 27 bf d4 st %g1, [ %fp + -44 ]
<== NOT EXECUTED
40009d84: 40 00 13 ab call 4000ec30 <_Thread_Do_dispatch>
<== NOT EXECUTED
40009d88: 90 10 00 1c mov %i4, %o0
<== NOT EXECUTED
40009d8c: 10 bf ff f9 b 40009d70 <pthread_mutex_setprioceiling+0x128>
<== NOT EXECUTED
40009d90: c2 07 bf d4 ld [ %fp + -44 ], %g1
<== NOT EXECUTED
40009e74 <pthread_mutex_unlock>:
*/
int pthread_mutex_unlock(
pthread_mutex_t *mutex
)
{
40009e74: 9d e3 bf 70 save %sp, -144, %sp
Thread_queue_Context queue_context;
Thread_Control *executing;
Status_Control status;
the_mutex = _POSIX_Mutex_Get( mutex );
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009e78: 80 a6 20 00 cmp %i0, 0
40009e7c: 02 80 00 32 be 40009f44 <pthread_mutex_unlock+0xd0>
40009e80: 05 25 87 04 sethi %hi(0x961c1000), %g2
40009e84: fa 06 00 00 ld [ %i0 ], %i5
40009e88: 82 1e 00 1d xor %i0, %i5, %g1
40009e8c: 84 10 a3 b8 or %g2, 0x3b8, %g2
40009e90: 82 18 40 02 xor %g1, %g2, %g1
40009e94: 80 88 7f f8 btst -8, %g1
40009e98: 12 80 00 26 bne 40009f30 <pthread_mutex_unlock+0xbc>
40009e9c: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40009ea0: 91 d0 20 09 ta 9
<== NOT EXECUTED
40009ea4: c2 27 bf dc st %g1, [ %fp + -36 ]
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
40009ea8: ba 8f 60 03 andcc %i5, 3, %i5
40009eac: 02 80 00 28 be 40009f4c <pthread_mutex_unlock+0xd8>
40009eb0: d0 01 a0 20 ld [ %g6 + 0x20 ], %o0
40009eb4: 80 a7 60 02 cmp %i5, 2
40009eb8: 12 80 00 0a bne 40009ee0 <pthread_mutex_unlock+0x6c>
40009ebc: c2 06 20 10 ld [ %i0 + 0x10 ], %g1
unsigned int nest_level;
ISR_lock_Context lock_context;
Per_CPU_Control *cpu_self;
Thread_queue_Heads *heads;
if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) {
40009ec0: 80 a2 00 01 cmp %o0, %g1
40009ec4: 22 80 00 37 be,a 40009fa0 <pthread_mutex_unlock+0x12c>
<== ALWAYS TAKEN
40009ec8: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009ecc: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009ed0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009ed4: 01 00 00 00 nop
40009ed8: 81 c7 e0 08 ret
40009edc: 91 e8 20 01 restore %g0, 1, %o0
if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) {
40009ee0: 80 a2 00 01 cmp %o0, %g1
40009ee4: 12 bf ff fa bne 40009ecc <pthread_mutex_unlock+0x58>
40009ee8: 01 00 00 00 nop
nest_level = the_mutex->Recursive.nest_level;
40009eec: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
if ( nest_level > 0 ) {
40009ef0: 80 a0 60 00 cmp %g1, 0
40009ef4: 12 80 00 2e bne 40009fac <pthread_mutex_unlock+0x138>
<== NEVER TAKEN
40009ef8: 82 00 7f ff add %g1, -1, %g1
the_mutex->Recursive.Mutex.Queue.Queue.owner = owner;
40009efc: c0 26 20 10 clr [ %i0 + 0x10 ]
heads = the_mutex->Recursive.Mutex.Queue.Queue.heads;
40009f00: d2 06 20 0c ld [ %i0 + 0xc ], %o1
if ( heads == NULL ) {
40009f04: 80 a2 60 00 cmp %o1, 0
40009f08: 02 80 00 2f be 40009fc4 <pthread_mutex_unlock+0x150>
40009f0c: 94 10 00 08 mov %o0, %o2
_Thread_queue_Surrender(
40009f10: 96 07 bf dc add %fp, -36, %o3
40009f14: 90 06 20 0c add %i0, 0xc, %o0
40009f18: 19 10 00 6f sethi %hi(0x4001bc00), %o4
40009f1c: b0 10 20 00 clr %i0
40009f20: 40 00 15 d0 call 4000f660 <_Thread_queue_Surrender>
40009f24: 98 13 21 54 or %o4, 0x154, %o4
);
break;
}
return _POSIX_Get_error( status );
}
40009f28: 81 c7 e0 08 ret
40009f2c: 81 e8 00 00 restore
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
40009f30: 7f ff ff aa call 40009dd8 <_POSIX_Mutex_Auto_initialization>
40009f34: 90 10 00 18 mov %i0, %o0
40009f38: 80 a2 20 00 cmp %o0, 0
40009f3c: 12 bf ff d9 bne 40009ea0 <pthread_mutex_unlock+0x2c>
40009f40: 01 00 00 00 nop
40009f44: 81 c7 e0 08 ret
40009f48: 91 e8 20 16 restore %g0, 0x16, %o0
if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) {
40009f4c: c2 06 20 10 ld [ %i0 + 0x10 ], %g1
40009f50: 80 a2 00 01 cmp %o0, %g1
40009f54: 12 bf ff de bne 40009ecc <pthread_mutex_unlock+0x58>
40009f58: 01 00 00 00 nop
nest_level = the_mutex->Recursive.nest_level;
40009f5c: c2 06 20 18 ld [ %i0 + 0x18 ], %g1
if ( nest_level > 0 ) {
40009f60: 80 a0 60 00 cmp %g1, 0
40009f64: 12 80 00 12 bne 40009fac <pthread_mutex_unlock+0x138>
<== NEVER TAKEN
40009f68: 82 00 7f ff add %g1, -1, %g1
the_mutex->Recursive.Mutex.Queue.Queue.owner = owner;
40009f6c: c0 26 20 10 clr [ %i0 + 0x10 ]
heads = the_mutex->Recursive.Mutex.Queue.Queue.heads;
40009f70: d2 06 20 0c ld [ %i0 + 0xc ], %o1
if ( heads == NULL ) {
40009f74: 80 a2 60 00 cmp %o1, 0
40009f78: 02 80 00 13 be 40009fc4 <pthread_mutex_unlock+0x150>
<== ALWAYS TAKEN
40009f7c: 94 10 00 08 mov %o0, %o2
_Thread_queue_Surrender(
40009f80: 96 07 bf dc add %fp, -36, %o3
<== NOT EXECUTED
40009f84: 90 06 20 0c add %i0, 0xc, %o0
<== NOT EXECUTED
40009f88: 19 10 00 6f sethi %hi(0x4001bc00), %o4
<== NOT EXECUTED
40009f8c: b0 10 20 00 clr %i0
<== NOT EXECUTED
40009f90: 40 00 15 b4 call 4000f660 <_Thread_queue_Surrender>
<== NOT EXECUTED
40009f94: 98 13 21 7c or %o4, 0x17c, %o4
<== NOT EXECUTED
40009f98: 81 c7 e0 08 ret
<== NOT EXECUTED
40009f9c: 81 e8 00 00 restore
<== NOT EXECUTED
return STATUS_NOT_OWNER;
}
nest_level = the_mutex->Recursive.nest_level;
if ( nest_level > 0 ) {
40009fa0: 80 a0 60 00 cmp %g1, 0
40009fa4: 02 80 00 0d be 40009fd8 <pthread_mutex_unlock+0x164>
<== ALWAYS TAKEN
40009fa8: 82 00 7f ff add %g1, -1, %g1
the_mutex->Recursive.nest_level = nest_level - 1;
40009fac: c2 26 20 18 st %g1, [ %i0 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009fb0: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009fb4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009fb8: 01 00 00 00 nop
<== NOT EXECUTED
40009fbc: 81 c7 e0 08 ret
<== NOT EXECUTED
40009fc0: 91 e8 20 00 restore %g0, 0, %o0
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40009fc4: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40009fc8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40009fcc: 01 00 00 00 nop
40009fd0: 81 c7 e0 08 ret
40009fd4: 91 e8 20 00 restore %g0, 0, %o0
40009fd8: c0 27 bf f0 clr [ %fp + -16 ]
_Thread_Resource_count_decrement( executing );
_Thread_queue_Context_clear_priority_updates( queue_context );
_Thread_Wait_acquire_default_critical( executing, &lock_context );
_Thread_Priority_remove(
40009fdc: b6 06 20 20 add %i0, 0x20, %i3
40009fe0: 94 07 bf dc add %fp, -36, %o2
40009fe4: 40 00 12 80 call 4000e9e4 <_Thread_Priority_remove>
40009fe8: 92 10 00 1b mov %i3, %o1
disable_level = cpu_self->thread_dispatch_disable_level;
40009fec: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40009ff0: 82 00 60 01 inc %g1
40009ff4: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
);
_Thread_Wait_release_default_critical( executing, &lock_context );
cpu_self = _Thread_queue_Dispatch_disable( queue_context );
heads = the_mutex->Recursive.Mutex.Queue.Queue.heads;
40009ff8: d0 06 20 0c ld [ %i0 + 0xc ], %o0
if ( heads != NULL ) {
40009ffc: 80 a2 20 00 cmp %o0, 0
4000a000: 02 80 00 2a be 4000a0a8 <pthread_mutex_unlock+0x234>
4000a004: ba 10 00 06 mov %g6, %i5
const Thread_queue_Operations *operations;
Thread_Control *new_owner;
operations = POSIX_MUTEX_PRIORITY_CEILING_TQ_OPERATIONS;
new_owner = ( *operations->first )( heads );
4000a008: 39 10 00 6f sethi %hi(0x4001bc00), %i4
4000a00c: b8 17 21 68 or %i4, 0x168, %i4 ! 4001bd68 <_Thread_queue_Operations_priority>
4000a010: c2 07 20 10 ld [ %i4 + 0x10 ], %g1
4000a014: 9f c0 40 00 call %g1
4000a018: 01 00 00 00 nop
the_mutex->Recursive.Mutex.Queue.Queue.owner = owner;
4000a01c: d0 26 20 10 st %o0, [ %i0 + 0x10 ]
new_owner = ( *operations->first )( heads );
4000a020: b4 10 00 08 mov %o0, %i2
_POSIX_Mutex_Set_owner( the_mutex, new_owner );
_Thread_Resource_count_increment( new_owner );
_Thread_Priority_add(
4000a024: 94 07 bf dc add %fp, -36, %o2
4000a028: 40 00 12 6a call 4000e9d0 <_Thread_Priority_add>
4000a02c: 92 10 00 1b mov %i3, %o1
new_owner,
&the_mutex->Priority_ceiling,
queue_context
);
_Thread_queue_Extract_critical(
4000a030: 96 07 bf dc add %fp, -36, %o3
4000a034: 94 10 00 1a mov %i2, %o2
4000a038: 92 10 00 1c mov %i4, %o1
4000a03c: 40 00 15 48 call 4000f55c <_Thread_queue_Extract_critical>
4000a040: 90 06 20 0c add %i0, 0xc, %o0
} else {
_POSIX_Mutex_Set_owner( the_mutex, NULL );
_POSIX_Mutex_Release( the_mutex, queue_context );
}
_Thread_Priority_update( queue_context );
4000a044: 40 00 12 74 call 4000ea14 <_Thread_Priority_update>
4000a048: 90 07 bf dc add %fp, -36, %o0
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
4000a04c: c2 07 60 18 ld [ %i5 + 0x18 ], %g1
if ( disable_level == 1 ) {
4000a050: 80 a0 60 01 cmp %g1, 1
4000a054: 02 80 00 06 be 4000a06c <pthread_mutex_unlock+0x1f8>
<== ALWAYS TAKEN
4000a058: 82 00 7f ff add %g1, -1, %g1
cpu_self->thread_dispatch_disable_level = disable_level - 1;
4000a05c: b0 10 20 00 clr %i0
<== NOT EXECUTED
4000a060: c2 27 60 18 st %g1, [ %i5 + 0x18 ]
<== NOT EXECUTED
4000a064: 81 c7 e0 08 ret
<== NOT EXECUTED
4000a068: 81 e8 00 00 restore
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000a06c: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
4000a070: c4 0f 60 1c ldub [ %i5 + 0x1c ], %g2
4000a074: 80 a0 a0 00 cmp %g2, 0
4000a078: 12 80 00 07 bne 4000a094 <pthread_mutex_unlock+0x220>
4000a07c: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
4000a080: c0 27 60 18 clr [ %i5 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000a084: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000a088: 01 00 00 00 nop
4000a08c: 81 c7 e0 08 ret
4000a090: 91 e8 20 00 restore %g0, 0, %o0
_Thread_Do_dispatch( cpu_self, level );
4000a094: c2 27 bf d4 st %g1, [ %fp + -44 ]
4000a098: 40 00 12 e6 call 4000ec30 <_Thread_Do_dispatch>
4000a09c: 90 10 00 1d mov %i5, %o0
4000a0a0: 10 bf ff f9 b 4000a084 <pthread_mutex_unlock+0x210>
4000a0a4: c2 07 bf d4 ld [ %fp + -44 ], %g1
the_mutex->Recursive.Mutex.Queue.Queue.owner = owner;
4000a0a8: c0 26 20 10 clr [ %i0 + 0x10 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000a0ac: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000a0b0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000a0b4: 01 00 00 00 nop
4000a0b8: 30 bf ff e3 b,a 4000a044 <pthread_mutex_unlock+0x1d0>
40005e28 <pthread_mutexattr_gettype>:
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
if ( attr == NULL || !attr->is_initialized || type == NULL )
40005e28: 80 a2 20 00 cmp %o0, 0
40005e2c: 02 80 00 0c be 40005e5c <pthread_mutexattr_gettype+0x34>
40005e30: 01 00 00 00 nop
40005e34: c2 02 00 00 ld [ %o0 ], %g1
40005e38: 80 a0 60 00 cmp %g1, 0
40005e3c: 02 80 00 08 be 40005e5c <pthread_mutexattr_gettype+0x34>
40005e40: 80 a2 60 00 cmp %o1, 0
40005e44: 02 80 00 06 be 40005e5c <pthread_mutexattr_gettype+0x34>
<== NEVER TAKEN
40005e48: 01 00 00 00 nop
return EINVAL;
*type = attr->type;
40005e4c: c2 02 20 10 ld [ %o0 + 0x10 ], %g1
40005e50: c2 22 40 00 st %g1, [ %o1 ]
return 0;
40005e54: 81 c3 e0 08 retl
40005e58: 90 10 20 00 clr %o0
}
40005e5c: 81 c3 e0 08 retl
40005e60: 90 10 20 16 mov 0x16, %o0
400096e4 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
400096e4: 82 92 20 00 orcc %o0, 0, %g1
400096e8: 02 80 00 0b be 40009714 <pthread_mutexattr_setpshared+0x30>
400096ec: 90 10 20 16 mov 0x16, %o0
400096f0: c4 00 40 00 ld [ %g1 ], %g2
400096f4: 80 a0 a0 00 cmp %g2, 0
400096f8: 02 80 00 07 be 40009714 <pthread_mutexattr_setpshared+0x30>
400096fc: 80 a2 60 01 cmp %o1, 1
return EINVAL;
switch ( pshared ) {
40009700: 18 80 00 05 bgu 40009714 <pthread_mutexattr_setpshared+0x30>
<== NEVER TAKEN
40009704: 01 00 00 00 nop
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
40009708: d2 20 60 04 st %o1, [ %g1 + 4 ]
return 0;
4000970c: 81 c3 e0 08 retl
40009710: 90 10 20 00 clr %o0
default:
return EINVAL;
}
}
40009714: 81 c3 e0 08 retl
40009718: 01 00 00 00 nop
40005eb4 <pthread_mutexattr_settype>:
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
40005eb4: 82 92 20 00 orcc %o0, 0, %g1
40005eb8: 02 80 00 0b be 40005ee4 <pthread_mutexattr_settype+0x30>
40005ebc: 90 10 20 16 mov 0x16, %o0
40005ec0: c4 00 40 00 ld [ %g1 ], %g2
40005ec4: 80 a0 a0 00 cmp %g2, 0
40005ec8: 02 80 00 07 be 40005ee4 <pthread_mutexattr_settype+0x30>
<== NEVER TAKEN
40005ecc: 80 a2 60 03 cmp %o1, 3
return EINVAL;
switch ( type ) {
40005ed0: 18 80 00 05 bgu 40005ee4 <pthread_mutexattr_settype+0x30>
40005ed4: 01 00 00 00 nop
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
40005ed8: d2 20 60 10 st %o1, [ %g1 + 0x10 ]
return 0;
40005edc: 81 c3 e0 08 retl
40005ee0: 90 10 20 00 clr %o0
default:
return EINVAL;
}
}
40005ee4: 81 c3 e0 08 retl
40005ee8: 01 00 00 00 nop
4000846c <pthread_rwlock_destroy>:
#include <rtems/posix/rwlockimpl.h>
int pthread_rwlock_destroy(
pthread_rwlock_t *_rwlock
)
{
4000846c: 9d e3 bf a0 save %sp, -96, %sp
POSIX_RWLock_Control *the_rwlock;
Thread_queue_Context queue_context;
the_rwlock = _POSIX_RWLock_Get( _rwlock );
POSIX_RWLOCK_VALIDATE_OBJECT( the_rwlock );
40008470: 80 a6 20 00 cmp %i0, 0
40008474: 02 80 00 16 be 400084cc <pthread_rwlock_destroy+0x60>
40008478: 03 25 88 76 sethi %hi(0x9621d800), %g1
4000847c: c4 06 00 00 ld [ %i0 ], %g2
40008480: 82 10 62 bd or %g1, 0x2bd, %g1
40008484: 82 1e 00 01 xor %i0, %g1, %g1
40008488: 80 a0 40 02 cmp %g1, %g2
4000848c: 12 80 00 0b bne 400084b8 <pthread_rwlock_destroy+0x4c>
40008490: 01 00 00 00 nop
40008494: 91 d0 20 09 ta 9
<== NOT EXECUTED
/*
* If there is at least one thread waiting, then do not delete it.
*/
if ( !_Thread_queue_Is_empty( &the_rwlock->RWLock.Queue.Queue ) ) {
40008498: c4 06 20 0c ld [ %i0 + 0xc ], %g2
4000849c: 80 a0 a0 00 cmp %g2, 0
400084a0: 22 80 00 0d be,a 400084d4 <pthread_rwlock_destroy+0x68>
400084a4: c4 06 00 00 ld [ %i0 ], %g2
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400084a8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400084ac: 01 00 00 00 nop
_CORE_RWLock_Release( &the_rwlock->RWLock, &queue_context );
return EBUSY;
400084b0: 81 c7 e0 08 ret
400084b4: 91 e8 20 10 restore %g0, 0x10, %o0
POSIX_RWLOCK_VALIDATE_OBJECT( the_rwlock );
400084b8: 40 00 00 5c call 40008628 <_POSIX_RWLock_Auto_initialization>
400084bc: 90 10 00 18 mov %i0, %o0
400084c0: 80 a2 20 00 cmp %o0, 0
400084c4: 12 bf ff f4 bne 40008494 <pthread_rwlock_destroy+0x28>
400084c8: 01 00 00 00 nop
400084cc: 81 c7 e0 08 ret
400084d0: 91 e8 20 16 restore %g0, 0x16, %o0
/*
* POSIX doesn't require behavior when it is locked.
*/
the_rwlock->flags = ~the_rwlock->flags;
400084d4: 84 38 00 02 xnor %g0, %g2, %g2
<== NOT EXECUTED
400084d8: c4 26 00 00 st %g2, [ %i0 ]
<== NOT EXECUTED
400084dc: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400084e0: 01 00 00 00 nop
_CORE_RWLock_Release( &the_rwlock->RWLock, &queue_context );
return 0;
}
400084e4: 81 c7 e0 08 ret
400084e8: 91 e8 20 00 restore %g0, 0, %o0
400084ec <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
400084ec: 9d e3 bf a0 save %sp, -96, %sp
POSIX_RWLock_Control *the_rwlock;
the_rwlock = _POSIX_RWLock_Get( rwlock );
if ( the_rwlock == NULL ) {
400084f0: 90 96 20 00 orcc %i0, 0, %o0
400084f4: 02 80 00 14 be 40008544 <pthread_rwlock_init+0x58>
400084f8: 80 a6 60 00 cmp %i1, 0
return EINVAL;
}
if ( attr != NULL ) {
400084fc: 02 80 00 0a be 40008524 <pthread_rwlock_init+0x38>
40008500: 03 25 88 76 sethi %hi(0x9621d800), %g1
if ( !attr->is_initialized ) {
40008504: c2 06 40 00 ld [ %i1 ], %g1
40008508: 80 a0 60 00 cmp %g1, 0
4000850c: 02 80 00 0c be 4000853c <pthread_rwlock_init+0x50>
<== NEVER TAKEN
40008510: b0 10 20 16 mov 0x16, %i0
return EINVAL;
}
if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) {
40008514: c2 06 60 04 ld [ %i1 + 4 ], %g1
40008518: 80 a0 60 01 cmp %g1, 1
4000851c: 18 80 00 08 bgu 4000853c <pthread_rwlock_init+0x50>
40008520: 03 25 88 76 sethi %hi(0x9621d800), %g1
return EINVAL;
}
}
the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC;
40008524: 82 10 62 bd or %g1, 0x2bd, %g1 ! 9621dabd <RAM_END+0x55e1dabd>
40008528: 82 1a 00 01 xor %o0, %g1, %g1
4000852c: c2 22 00 00 st %g1, [ %o0 ]
_CORE_RWLock_Initialize( &the_rwlock->RWLock );
return 0;
40008530: b0 10 20 00 clr %i0
_CORE_RWLock_Initialize( &the_rwlock->RWLock );
40008534: 40 00 04 ef call 400098f0 <_CORE_RWLock_Initialize>
40008538: 90 02 20 04 add %o0, 4, %o0
return 0;
4000853c: 81 c7 e0 08 ret
40008540: 81 e8 00 00 restore
return EINVAL;
40008544: b0 10 20 16 mov 0x16, %i0
}
40008548: 81 c7 e0 08 ret
4000854c: 81 e8 00 00 restore
40008fe8 <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
40008fe8: 82 92 20 00 orcc %o0, 0, %g1
40008fec: 02 80 00 0b be 40009018 <pthread_rwlockattr_setpshared+0x30>
40008ff0: 90 10 20 16 mov 0x16, %o0
return EINVAL;
if ( !attr->is_initialized )
40008ff4: c4 00 40 00 ld [ %g1 ], %g2
40008ff8: 80 a0 a0 00 cmp %g2, 0
40008ffc: 02 80 00 07 be 40009018 <pthread_rwlockattr_setpshared+0x30>
40009000: 80 a2 60 01 cmp %o1, 1
return EINVAL;
switch ( pshared ) {
40009004: 18 80 00 05 bgu 40009018 <pthread_rwlockattr_setpshared+0x30>
<== NEVER TAKEN
40009008: 01 00 00 00 nop
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
4000900c: d2 20 60 04 st %o1, [ %g1 + 4 ]
return 0;
40009010: 81 c3 e0 08 retl
40009014: 90 10 20 00 clr %o0
default:
return EINVAL;
}
}
40009018: 81 c3 e0 08 retl
4000901c: 01 00 00 00 nop
40007f90 <pthread_setcancelstate>:
int pthread_setcancelstate(
int state,
int *oldstate
)
{
40007f90: 9d e3 bf a0 save %sp, -96, %sp
Thread_Life_state new_life_protection;
Thread_Life_state previous_life_state;
if ( _ISR_Is_in_progress() ) {
40007f94: 40 00 06 5c call 40009904 <_ISR_Is_in_progress>
40007f98: 01 00 00 00 nop
40007f9c: 80 a2 20 00 cmp %o0, 0
40007fa0: 12 80 00 10 bne 40007fe0 <pthread_setcancelstate+0x50>
40007fa4: 82 10 20 47 mov 0x47, %g1
return EPROTO;
}
if ( state == PTHREAD_CANCEL_DISABLE ) {
40007fa8: 80 a6 20 01 cmp %i0, 1
40007fac: 02 80 00 12 be 40007ff4 <pthread_setcancelstate+0x64>
<== NEVER TAKEN
40007fb0: 80 a6 20 00 cmp %i0, 0
new_life_protection = THREAD_LIFE_PROTECTED;
} else if ( state == PTHREAD_CANCEL_ENABLE ) {
40007fb4: 12 80 00 0b bne 40007fe0 <pthread_setcancelstate+0x50>
40007fb8: 82 10 20 16 mov 0x16, %g1
new_life_protection = 0;
} else {
return EINVAL;
}
previous_life_state = _Thread_Set_life_protection( new_life_protection );
40007fbc: 40 00 17 80 call 4000ddbc <_Thread_Set_life_protection>
40007fc0: 01 00 00 00 nop
if ( oldstate != NULL ) {
40007fc4: 80 a6 60 00 cmp %i1, 0
40007fc8: 02 80 00 06 be 40007fe0 <pthread_setcancelstate+0x50>
40007fcc: 82 10 20 00 clr %g1
if ( ( previous_life_state & THREAD_LIFE_PROTECTED ) != 0 ) {
40007fd0: 80 8a 20 01 btst 1, %o0
40007fd4: 12 80 00 05 bne 40007fe8 <pthread_setcancelstate+0x58>
<== NEVER TAKEN
40007fd8: 84 10 20 01 mov 1, %g2
*oldstate = PTHREAD_CANCEL_DISABLE;
} else {
*oldstate = PTHREAD_CANCEL_ENABLE;
40007fdc: c0 26 40 00 clr [ %i1 ]
}
}
return 0;
}
40007fe0: 81 c7 e0 08 ret
40007fe4: 91 e8 00 01 restore %g0, %g1, %o0
*oldstate = PTHREAD_CANCEL_DISABLE;
40007fe8: c4 26 40 00 st %g2, [ %i1 ]
<== NOT EXECUTED
}
40007fec: 81 c7 e0 08 ret
<== NOT EXECUTED
40007ff0: 91 e8 00 01 restore %g0, %g1, %o0
<== NOT EXECUTED
previous_life_state = _Thread_Set_life_protection( new_life_protection );
40007ff4: 40 00 17 72 call 4000ddbc <_Thread_Set_life_protection>
<== NOT EXECUTED
40007ff8: 90 10 20 01 mov 1, %o0
<== NOT EXECUTED
if ( oldstate != NULL ) {
40007ffc: 80 a6 60 00 cmp %i1, 0
<== NOT EXECUTED
40008000: 12 bf ff f4 bne 40007fd0 <pthread_setcancelstate+0x40>
<== NOT EXECUTED
40008004: 82 10 20 00 clr %g1
<== NOT EXECUTED
40008008: 30 bf ff f6 b,a 40007fe0 <pthread_setcancelstate+0x50>
<== NOT EXECUTED
4000800c <pthread_setcanceltype>:
int pthread_setcanceltype(
int type,
int *oldtype
)
{
4000800c: 9d e3 bf a0 save %sp, -96, %sp
Thread_Life_state set_life_state;
Thread_Life_state previous_life_state;
if ( _ISR_Is_in_progress() ) {
40008010: 40 00 06 3d call 40009904 <_ISR_Is_in_progress>
40008014: 01 00 00 00 nop
40008018: 80 a2 20 00 cmp %o0, 0
4000801c: 12 80 00 12 bne 40008064 <pthread_setcanceltype+0x58>
40008020: 82 10 20 47 mov 0x47, %g1
return EPROTO;
}
if ( type == PTHREAD_CANCEL_DEFERRED ) {
40008024: 80 a6 20 00 cmp %i0, 0
40008028: 02 80 00 11 be 4000806c <pthread_setcanceltype+0x60>
4000802c: 82 10 20 16 mov 0x16, %g1
set_life_state = THREAD_LIFE_CHANGE_DEFERRED;
} else if ( type == PTHREAD_CANCEL_ASYNCHRONOUS ) {
40008030: 80 a6 20 01 cmp %i0, 1
40008034: 12 80 00 0c bne 40008064 <pthread_setcanceltype+0x58>
40008038: 92 10 20 00 clr %o1
set_life_state = 0;
} else {
return EINVAL;
}
previous_life_state = _Thread_Change_life(
4000803c: 94 10 20 00 clr %o2
40008040: 40 00 17 33 call 4000dd0c <_Thread_Change_life>
40008044: 90 10 20 08 mov 8, %o0
THREAD_LIFE_CHANGE_DEFERRED,
set_life_state,
0
);
if ( oldtype != NULL ) {
40008048: 80 a6 60 00 cmp %i1, 0
4000804c: 02 80 00 06 be 40008064 <pthread_setcanceltype+0x58>
40008050: 82 10 20 00 clr %g1
if ( ( previous_life_state & THREAD_LIFE_CHANGE_DEFERRED ) != 0 ) {
40008054: 80 8a 20 08 btst 8, %o0
40008058: 12 80 00 07 bne 40008074 <pthread_setcanceltype+0x68>
<== ALWAYS TAKEN
4000805c: 84 10 20 01 mov 1, %g2
*oldtype = PTHREAD_CANCEL_DEFERRED;
} else {
*oldtype = PTHREAD_CANCEL_ASYNCHRONOUS;
40008060: c4 26 40 00 st %g2, [ %i1 ]
<== NOT EXECUTED
}
}
return 0;
}
40008064: 81 c7 e0 08 ret
40008068: 91 e8 00 01 restore %g0, %g1, %o0
set_life_state = THREAD_LIFE_CHANGE_DEFERRED;
4000806c: 10 bf ff f4 b 4000803c <pthread_setcanceltype+0x30>
40008070: 92 10 20 08 mov 8, %o1
*oldtype = PTHREAD_CANCEL_DEFERRED;
40008074: c0 26 40 00 clr [ %i1 ]
}
40008078: 81 c7 e0 08 ret
4000807c: 91 e8 00 01 restore %g0, %g1, %o0
40006528 <pthread_setname_np>:
#include <rtems/score/threadimpl.h>
#include <rtems/posix/posixapi.h>
int pthread_setname_np( pthread_t thread, const char *name )
{
40006528: 9d e3 bf 98 save %sp, -104, %sp
_RTEMS_Lock_allocator();
4000652c: 40 00 00 e1 call 400068b0 <_RTEMS_Lock_allocator>
40006530: 01 00 00 00 nop
Thread_Control *the_thread;
ISR_lock_Context lock_context;
Status_Control status;
_Objects_Allocator_lock();
the_thread = _Thread_Get( thread, &lock_context );
40006534: 92 07 bf fc add %fp, -4, %o1
40006538: 40 00 0d aa call 40009be0 <_Thread_Get>
4000653c: 90 10 00 18 mov %i0, %o0
if ( the_thread == NULL ) {
40006540: 80 a2 20 00 cmp %o0, 0
40006544: 02 80 00 0c be 40006574 <pthread_setname_np+0x4c>
40006548: 01 00 00 00 nop
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000654c: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006550: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006554: 01 00 00 00 nop
_Objects_Allocator_unlock();
return ESRCH;
}
_ISR_lock_ISR_enable( &lock_context );
status = _Thread_Set_name( the_thread, name );
40006558: 40 00 0e b6 call 4000a030 <_Thread_Set_name>
4000655c: 92 10 00 19 mov %i1, %o1
_RTEMS_Unlock_allocator();
40006560: 40 00 00 d9 call 400068c4 <_RTEMS_Unlock_allocator>
40006564: b0 10 00 09 mov %o1, %i0
return _POSIX_Get_by_name_error_table[ error ];
}
RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status )
{
return STATUS_GET_POSIX( status );
40006568: b1 3e 20 08 sra %i0, 8, %i0
_Objects_Allocator_unlock();
return _POSIX_Get_error( status );
}
4000656c: 81 c7 e0 08 ret
40006570: 81 e8 00 00 restore
40006574: 40 00 00 d4 call 400068c4 <_RTEMS_Unlock_allocator>
40006578: b0 10 20 03 mov 3, %i0
return ESRCH;
4000657c: 81 c7 e0 08 ret
40006580: 81 e8 00 00 restore
4000a944 <pthread_setschedparam>:
const struct sched_param *param
#else
struct sched_param *param
#endif
)
{
4000a944: 9d e3 bf 68 save %sp, -152, %sp
Thread_Control *the_thread;
Per_CPU_Control *cpu_self;
Thread_queue_Context queue_context;
int error;
if ( param == NULL ) {
4000a948: 80 a6 a0 00 cmp %i2, 0
4000a94c: 02 80 00 0a be 4000a974 <pthread_setschedparam+0x30>
4000a950: b6 10 20 16 mov 0x16, %i3
return EINVAL;
}
error = _POSIX_Thread_Translate_sched_param(
4000a954: 96 07 bf d8 add %fp, -40, %o3
4000a958: 94 07 bf d4 add %fp, -44, %o2
4000a95c: 92 10 00 1a mov %i2, %o1
4000a960: 40 00 1f 38 call 40012640 <_POSIX_Thread_Translate_sched_param>
4000a964: 90 10 00 19 mov %i1, %o0
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( error != 0 ) {
4000a968: b6 92 20 00 orcc %o0, 0, %i3
4000a96c: 02 80 00 04 be 4000a97c <pthread_setschedparam+0x38>
4000a970: 90 10 00 18 mov %i0, %o0
cpu_self = _Thread_queue_Dispatch_disable( &queue_context );
_Thread_Wait_release( the_thread, &queue_context );
_Thread_Priority_update( &queue_context );
_Thread_Dispatch_enable( cpu_self );
return error;
}
4000a974: 81 c7 e0 08 ret
4000a978: 91 e8 00 1b restore %g0, %i3, %o0
4000a97c: c0 27 bf f0 clr [ %fp + -16 ]
the_thread = _Thread_Get( thread, &queue_context.Lock_context.Lock_context );
4000a980: 40 00 11 0c call 4000edb0 <_Thread_Get>
4000a984: 92 07 bf dc add %fp, -36, %o1
if ( the_thread == NULL ) {
4000a988: b0 92 20 00 orcc %o0, 0, %i0
4000a98c: 02 80 00 41 be 4000aa90 <pthread_setschedparam+0x14c>
4000a990: ea 07 bf d4 ld [ %fp + -44 ], %l5
normal_prio = param->sched_priority;
4000a994: e0 06 80 00 ld [ %i2 ], %l0
error = _POSIX_Set_sched_param(
4000a998: e8 07 bf d8 ld [ %fp + -40 ], %l4
core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid );
4000a99c: 92 10 00 10 mov %l0, %o1
4000a9a0: 94 07 bf d3 add %fp, -45, %o2
4000a9a4: 23 10 00 6d sethi %hi(0x4001b400), %l1
4000a9a8: 7f ff fd c5 call 4000a0bc <_POSIX_Priority_To_core>
4000a9ac: 90 14 61 08 or %l1, 0x108, %o0 ! 4001b508 <_Scheduler_Table>
if ( !valid ) {
4000a9b0: c2 0f bf d3 ldub [ %fp + -45 ], %g1
core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid );
4000a9b4: b8 10 00 08 mov %o0, %i4
if ( !valid ) {
4000a9b8: 80 a0 60 00 cmp %g1, 0
4000a9bc: 02 80 00 37 be 4000aa98 <pthread_setschedparam+0x154>
<== NEVER TAKEN
4000a9c0: ba 10 00 09 mov %o1, %i5
if ( policy == SCHED_SPORADIC ) {
4000a9c4: 80 a6 60 04 cmp %i1, 4
4000a9c8: 22 80 00 02 be,a 4000a9d0 <pthread_setschedparam+0x8c>
4000a9cc: e0 06 a0 04 ld [ %i2 + 4 ], %l0
core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio, &valid );
4000a9d0: 94 07 bf d3 add %fp, -45, %o2
4000a9d4: 92 10 00 10 mov %l0, %o1
4000a9d8: 7f ff fd b9 call 4000a0bc <_POSIX_Priority_To_core>
4000a9dc: 90 14 61 08 or %l1, 0x108, %o0
if ( !valid ) {
4000a9e0: c2 0f bf d3 ldub [ %fp + -45 ], %g1
core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio, &valid );
4000a9e4: a4 10 00 08 mov %o0, %l2
if ( !valid ) {
4000a9e8: 80 a0 60 00 cmp %g1, 0
4000a9ec: 02 80 00 2b be 4000aa98 <pthread_setschedparam+0x154>
4000a9f0: a6 10 00 09 mov %o1, %l3
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
4000a9f4: e2 06 21 5c ld [ %i0 + 0x15c ], %l1
_Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
4000a9f8: a0 04 60 08 add %l1, 8, %l0
_Watchdog_Remove(
4000a9fc: 11 10 00 7d sethi %hi(0x4001f400), %o0
4000aa00: 92 10 00 10 mov %l0, %o1
4000aa04: 40 00 19 22 call 40010e8c <_Watchdog_Remove>
4000aa08: 90 12 22 b8 or %o0, 0x2b8, %o0
4000aa0c: f8 3e 20 30 std %i4, [ %i0 + 0x30 ]
if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
4000aa10: c2 04 60 34 ld [ %l1 + 0x34 ], %g1
4000aa14: 80 a0 7f ff cmp %g1, -1
4000aa18: 02 80 00 3b be 4000ab04 <pthread_setschedparam+0x1c0>
4000aa1c: 92 06 20 20 add %i0, 0x20, %o1
_Thread_Priority_add(
4000aa20: 90 10 00 18 mov %i0, %o0
4000aa24: 40 00 0f eb call 4000e9d0 <_Thread_Priority_add>
4000aa28: 94 07 bf dc add %fp, -36, %o2
_Thread_Priority_remove(
4000aa2c: 94 07 bf dc add %fp, -36, %o2
4000aa30: 92 04 60 28 add %l1, 0x28, %o1
4000aa34: 40 00 0f ec call 4000e9e4 <_Thread_Priority_remove>
4000aa38: 90 10 00 18 mov %i0, %o0
4000aa3c: 82 10 3f ff mov -1, %g1
4000aa40: c2 24 60 34 st %g1, [ %l1 + 0x34 ]
if ( policy == SCHED_SPORADIC ) {
4000aa44: 80 a6 60 04 cmp %i1, 4
the_thread->budget_algorithm = budget_algorithm;
4000aa48: ea 26 20 90 st %l5, [ %i0 + 0x90 ]
the_thread->budget_callout = budget_callout;
4000aa4c: e8 26 20 94 st %l4, [ %i0 + 0x94 ]
4000aa50: e4 3c 60 38 std %l2, [ %l1 + 0x38 ]
api->Sporadic.sched_ss_max_repl = param->sched_ss_max_repl;
4000aa54: c2 06 a0 28 ld [ %i2 + 0x28 ], %g1
api->Sporadic.sched_ss_repl_period = param->sched_ss_repl_period;
4000aa58: d4 1e a0 08 ldd [ %i2 + 8 ], %o2
4000aa5c: d8 1e a0 10 ldd [ %i2 + 0x10 ], %o4
api->Sporadic.sched_ss_init_budget = param->sched_ss_init_budget;
4000aa60: f8 1e a0 18 ldd [ %i2 + 0x18 ], %i4
4000aa64: c4 1e a0 20 ldd [ %i2 + 0x20 ], %g2
4000aa68: c4 3c 60 58 std %g2, [ %l1 + 0x58 ]
api->Sporadic.sched_ss_repl_period = param->sched_ss_repl_period;
4000aa6c: d4 3c 60 40 std %o2, [ %l1 + 0x40 ]
4000aa70: d8 3c 60 48 std %o4, [ %l1 + 0x48 ]
api->Sporadic.sched_ss_init_budget = param->sched_ss_init_budget;
4000aa74: f8 3c 60 50 std %i4, [ %l1 + 0x50 ]
if ( policy == SCHED_SPORADIC ) {
4000aa78: 02 80 00 2e be 4000ab30 <pthread_setschedparam+0x1ec>
4000aa7c: c2 24 60 60 st %g1, [ %l1 + 0x60 ]
rtems_configuration_get_ticks_per_timeslice();
4000aa80: 03 10 00 6d sethi %hi(0x4001b400), %g1
the_thread->cpu_time_budget =
4000aa84: c2 00 60 38 ld [ %g1 + 0x38 ], %g1 ! 4001b438 <Configuration+0x18>
4000aa88: 10 80 00 05 b 4000aa9c <pthread_setschedparam+0x158>
4000aa8c: c2 26 20 8c st %g1, [ %i0 + 0x8c ]
return ESRCH;
4000aa90: 10 bf ff b9 b 4000a974 <pthread_setschedparam+0x30>
4000aa94: b6 10 20 03 mov 3, %i3
return EINVAL;
4000aa98: b6 10 20 16 mov 0x16, %i3
<== NOT EXECUTED
disable_level = cpu_self->thread_dispatch_disable_level;
4000aa9c: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4000aaa0: 82 00 60 01 inc %g1
<== NOT EXECUTED
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
4000aaa4: ba 10 00 06 mov %g6, %i5
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4000aaa8: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000aaac: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000aab0: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000aab4: 01 00 00 00 nop
_Thread_Priority_update( &queue_context );
4000aab8: 40 00 0f d7 call 4000ea14 <_Thread_Priority_update>
4000aabc: 90 07 bf dc add %fp, -36, %o0
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
4000aac0: c2 07 60 18 ld [ %i5 + 0x18 ], %g1
if ( disable_level == 1 ) {
4000aac4: 80 a0 60 01 cmp %g1, 1
4000aac8: 02 80 00 06 be 4000aae0 <pthread_setschedparam+0x19c>
<== ALWAYS TAKEN
4000aacc: 82 00 7f ff add %g1, -1, %g1
}
4000aad0: b0 10 00 1b mov %i3, %i0
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level - 1;
4000aad4: c2 27 60 18 st %g1, [ %i5 + 0x18 ]
<== NOT EXECUTED
4000aad8: 81 c7 e0 08 ret
<== NOT EXECUTED
4000aadc: 81 e8 00 00 restore
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000aae0: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
4000aae4: c4 0f 60 1c ldub [ %i5 + 0x1c ], %g2
4000aae8: 80 a0 a0 00 cmp %g2, 0
4000aaec: 12 80 00 0c bne 4000ab1c <pthread_setschedparam+0x1d8>
4000aaf0: 92 10 00 01 mov %g1, %o1
cpu_self->thread_dispatch_disable_level = 0;
4000aaf4: c0 27 60 18 clr [ %i5 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000aaf8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000aafc: 01 00 00 00 nop
4000ab00: 30 bf ff 9d b,a 4000a974 <pthread_setschedparam+0x30>
_Thread_Priority_changed(
4000ab04: 96 07 bf dc add %fp, -36, %o3
4000ab08: 94 10 20 00 clr %o2
4000ab0c: 40 00 0f bb call 4000e9f8 <_Thread_Priority_changed>
4000ab10: 90 10 00 18 mov %i0, %o0
if ( policy == SCHED_SPORADIC ) {
4000ab14: 10 bf ff cd b 4000aa48 <pthread_setschedparam+0x104>
4000ab18: 80 a6 60 04 cmp %i1, 4
_Thread_Do_dispatch( cpu_self, level );
4000ab1c: c2 27 bf cc st %g1, [ %fp + -52 ]
4000ab20: 40 00 10 44 call 4000ec30 <_Thread_Do_dispatch>
4000ab24: 90 10 00 1d mov %i5, %o0
4000ab28: 10 bf ff f4 b 4000aaf8 <pthread_setschedparam+0x1b4>
4000ab2c: c2 07 bf cc ld [ %fp + -52 ], %g1
_Timespec_To_ticks( &api->Sporadic.sched_ss_init_budget );
4000ab30: 40 00 17 a7 call 400109cc <_Timespec_To_ticks>
4000ab34: 90 04 60 50 add %l1, 0x50, %o0
the_thread->cpu_time_budget =
4000ab38: d0 26 20 8c st %o0, [ %i0 + 0x8c ]
_Watchdog_Per_CPU_insert_ticks(
4000ab3c: ba 10 00 06 mov %g6, %i5
4000ab40: 40 00 17 a3 call 400109cc <_Timespec_To_ticks>
4000ab44: 90 04 60 40 add %l1, 0x40, %o0
expire = ticks + cpu->Watchdog.ticks;
4000ab48: d4 1f 60 30 ldd [ %i5 + 0x30 ], %o2
_Watchdog_Insert(header, the_watchdog, expire);
4000ab4c: 86 82 c0 08 addcc %o3, %o0, %g3
4000ab50: 84 42 a0 00 addx %o2, 0, %g2
4000ab54: 96 10 00 03 mov %g3, %o3
4000ab58: 94 10 00 02 mov %g2, %o2
4000ab5c: 92 10 00 10 mov %l0, %o1
4000ab60: 40 00 18 a3 call 40010dec <_Watchdog_Insert>
4000ab64: 90 07 60 38 add %i5, 0x38, %o0
4000ab68: 30 bf ff cd b,a 4000aa9c <pthread_setschedparam+0x158>
4000ab6c <pthread_setschedprio>:
#include <rtems/posix/threadsup.h>
#include <rtems/score/threadimpl.h>
#include <rtems/score/schedulerimpl.h>
int pthread_setschedprio( pthread_t thread, int prio )
{
4000ab6c: 9d e3 bf 70 save %sp, -144, %sp
Priority_Control new_priority;
bool valid;
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_clear_priority_updates( &queue_context );
the_thread = _Thread_Get( thread, &queue_context.Lock_context.Lock_context );
4000ab70: 90 10 00 18 mov %i0, %o0
4000ab74: c0 27 bf f0 clr [ %fp + -16 ]
4000ab78: 92 07 bf dc add %fp, -36, %o1
4000ab7c: 40 00 10 8d call 4000edb0 <_Thread_Get>
4000ab80: b0 10 20 03 mov 3, %i0
if ( the_thread == NULL ) {
4000ab84: 80 a2 20 00 cmp %o0, 0
4000ab88: 02 80 00 1f be 4000ac04 <pthread_setschedprio+0x98>
4000ab8c: ba 10 00 08 mov %o0, %i5
_Thread_Wait_acquire_critical( the_thread, &queue_context );
scheduler = _Thread_Scheduler_get_home( the_thread );
new_priority = _POSIX_Priority_To_core( scheduler, prio, &valid );
4000ab90: 94 07 bf db add %fp, -37, %o2
4000ab94: 92 10 00 19 mov %i1, %o1
4000ab98: 11 10 00 6d sethi %hi(0x4001b400), %o0
4000ab9c: 7f ff fd 48 call 4000a0bc <_POSIX_Priority_To_core>
4000aba0: 90 12 21 08 or %o0, 0x108, %o0 ! 4001b508 <_Scheduler_Table>
if ( !valid ) {
4000aba4: c2 0f bf db ldub [ %fp + -37 ], %g1
4000aba8: 80 a0 60 00 cmp %g1, 0
4000abac: 02 80 00 18 be 4000ac0c <pthread_setschedprio+0xa0>
4000abb0: 96 07 bf dc add %fp, -36, %o3
4000abb4: d0 3f 60 30 std %o0, [ %i5 + 0x30 ]
_Thread_Priority_changed(
4000abb8: 92 07 60 20 add %i5, 0x20, %o1
4000abbc: 90 10 00 1d mov %i5, %o0
4000abc0: 40 00 0f 8e call 4000e9f8 <_Thread_Priority_changed>
4000abc4: 94 10 20 01 mov 1, %o2
disable_level = cpu_self->thread_dispatch_disable_level;
4000abc8: c2 01 a0 18 ld [ %g6 + 0x18 ], %g1
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4000abcc: 82 00 60 01 inc %g1
<== NOT EXECUTED
return _Thread_Dispatch_disable_with_CPU( _Per_CPU_Get(), lock_context );
4000abd0: ba 10 00 06 mov %g6, %i5
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4000abd4: c2 21 a0 18 st %g1, [ %g6 + 0x18 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000abd8: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000abdc: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000abe0: 01 00 00 00 nop
);
cpu_self = _Thread_queue_Dispatch_disable( &queue_context );
_Thread_Wait_release( the_thread, &queue_context );
_Thread_Priority_update( &queue_context );
4000abe4: 40 00 0f 8c call 4000ea14 <_Thread_Priority_update>
4000abe8: 90 07 bf dc add %fp, -36, %o0
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
4000abec: c2 07 60 18 ld [ %i5 + 0x18 ], %g1
if ( disable_level == 1 ) {
4000abf0: 80 a0 60 01 cmp %g1, 1
4000abf4: 02 80 00 0b be 4000ac20 <pthread_setschedprio+0xb4>
<== ALWAYS TAKEN
4000abf8: 82 00 7f ff add %g1, -1, %g1
cpu_self->thread_dispatch_disable_level = disable_level - 1;
4000abfc: c2 27 60 18 st %g1, [ %i5 + 0x18 ]
<== NOT EXECUTED
_Thread_Dispatch_enable( cpu_self );
return 0;
4000ac00: b0 10 20 00 clr %i0
<== NOT EXECUTED
}
4000ac04: 81 c7 e0 08 ret
4000ac08: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
4000ac0c: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000ac10: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000ac14: 01 00 00 00 nop
return EINVAL;
4000ac18: 81 c7 e0 08 ret
4000ac1c: 91 e8 20 16 restore %g0, 0x16, %o0
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000ac20: 91 d0 20 09 ta 9
<== NOT EXECUTED
if (
4000ac24: c4 0f 60 1c ldub [ %i5 + 0x1c ], %g2
4000ac28: 80 a0 a0 00 cmp %g2, 0
4000ac2c: 12 80 00 07 bne 4000ac48 <pthread_setschedprio+0xdc>
<== NEVER TAKEN
4000ac30: 92 10 00 01 mov %g1, %o1
<== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = 0;
4000ac34: c0 27 60 18 clr [ %i5 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000ac38: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000ac3c: 01 00 00 00 nop
return 0;
4000ac40: 81 c7 e0 08 ret
4000ac44: 91 e8 20 00 restore %g0, 0, %o0
_Thread_Do_dispatch( cpu_self, level );
4000ac48: c2 27 bf d4 st %g1, [ %fp + -44 ]
<== NOT EXECUTED
4000ac4c: 40 00 0f f9 call 4000ec30 <_Thread_Do_dispatch>
<== NOT EXECUTED
4000ac50: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
4000ac54: 10 bf ff f9 b 4000ac38 <pthread_setschedprio+0xcc>
<== NOT EXECUTED
4000ac58: c2 07 bf d4 ld [ %fp + -44 ], %g1
<== NOT EXECUTED
400067e8 <pthread_setspecific>:
int pthread_setspecific(
pthread_key_t key,
const void *value
)
{
400067e8: 9d e3 bf 98 save %sp, -104, %sp
400067ec: ba 10 00 18 mov %i0, %i5
Thread_Control *executing;
int eno;
executing = _Thread_Get_executing();
if ( value != NULL ) {
400067f0: 80 a6 60 00 cmp %i1, 0
400067f4: 02 80 00 52 be 4000693c <pthread_setspecific+0x154>
400067f8: f8 01 a0 20 ld [ %g6 + 0x20 ], %i4
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400067fc: 91 d0 20 09 ta 9
<== NOT EXECUTED
return &RB_ROOT( the_rbtree );
40006800: b6 07 21 60 add %i4, 0x160, %i3
link = _RBTree_Root_const_reference( the_rbtree );
40006804: 86 10 00 1b mov %i3, %g3
while ( *link != NULL ) {
40006808: c4 00 c0 00 ld [ %g3 ], %g2
4000680c: 80 a0 a0 00 cmp %g2, 0
40006810: 02 80 00 0d be 40006844 <pthread_setspecific+0x5c>
40006814: 86 00 bf f8 add %g2, -8, %g3
return *the_left == the_right->key;
40006818: c8 00 e0 18 ld [ %g3 + 0x18 ], %g4
if ( ( *equal )( key, parent ) ) {
4000681c: 80 a7 40 04 cmp %i5, %g4
40006820: 22 80 00 31 be,a 400068e4 <pthread_setspecific+0xfc>
40006824: f2 20 e0 20 st %i1, [ %g3 + 0x20 ]
} else if ( ( *less )( key, parent ) ) {
40006828: 1a bf ff f8 bcc 40006808 <pthread_setspecific+0x20>
<== ALWAYS TAKEN
4000682c: 86 00 a0 04 add %g2, 4, %g3
return &RB_LEFT( the_node, Node );
40006830: 86 10 00 02 mov %g2, %g3
<== NOT EXECUTED
while ( *link != NULL ) {
40006834: c4 00 c0 00 ld [ %g3 ], %g2
<== NOT EXECUTED
40006838: 80 a0 a0 00 cmp %g2, 0
<== NOT EXECUTED
4000683c: 12 bf ff f7 bne 40006818 <pthread_setspecific+0x30>
<== NOT EXECUTED
40006840: 86 00 bf f8 add %g2, -8, %g3
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006844: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006848: 01 00 00 00 nop
_RTEMS_Lock_allocator();
4000684c: 40 00 02 b1 call 40007310 <_RTEMS_Lock_allocator>
40006850: b0 10 20 16 mov 0x16, %i0 ! 16 <_TLS_Alignment+0x15>
return (POSIX_Keys_Control *)
40006854: 90 10 00 1d mov %i5, %o0
40006858: 13 10 00 68 sethi %hi(0x4001a000), %o1
4000685c: 40 00 0b e4 call 400097ec <_Objects_Get_no_protection>
40006860: 92 12 63 58 or %o1, 0x358, %o1 ! 4001a358 <_POSIX_Keys_Information>
if ( the_key != NULL ) {
40006864: b4 92 20 00 orcc %o0, 0, %i2
40006868: 02 80 00 31 be 4000692c <pthread_setspecific+0x144>
4000686c: 01 00 00 00 nop
key_value_pair = _POSIX_Keys_Key_value_allocate();
40006870: 7f ff ff ce call 400067a8 <_POSIX_Keys_Key_value_allocate>
40006874: b0 10 20 0c mov 0xc, %i0 ! c <_TLS_Alignment+0xb>
if ( key_value_pair != NULL ) {
40006878: 80 a2 20 00 cmp %o0, 0
4000687c: 02 80 00 2c be 4000692c <pthread_setspecific+0x144>
<== NEVER TAKEN
40006880: 88 10 00 08 mov %o0, %g4
old_last = tail->previous;
40006884: c2 06 a0 1c ld [ %i2 + 0x1c ], %g1
return &the_chain->Tail.Node;
40006888: 84 06 a0 18 add %i2, 0x18, %g2
key_value_pair->key = key;
4000688c: fa 22 20 18 st %i5, [ %o0 + 0x18 ]
_RBTree_Initialize_node( &key_value_pair->Lookup_node );
40006890: b0 02 20 08 add %o0, 8, %i0
key_value_pair->thread = executing;
40006894: f8 22 20 1c st %i4, [ %o0 + 0x1c ]
<== NOT EXECUTED
key_value_pair->value = RTEMS_DECONST( void *, value );
40006898: f2 22 20 20 st %i1, [ %o0 + 0x20 ]
<== NOT EXECUTED
the_node->next = tail;
4000689c: c4 22 00 00 st %g2, [ %o0 ]
<== NOT EXECUTED
tail->previous = the_node;
400068a0: d0 26 a0 1c st %o0, [ %i2 + 0x1c ]
<== NOT EXECUTED
old_last->next = the_node;
400068a4: d0 20 40 00 st %o0, [ %g1 ]
<== NOT EXECUTED
the_node->previous = old_last;
400068a8: c2 22 20 04 st %g1, [ %o0 + 4 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400068ac: 91 d0 20 09 ta 9
<== NOT EXECUTED
parent = NULL;
400068b0: b8 10 20 00 clr %i4
link = _RBTree_Root_reference( the_rbtree );
400068b4: 86 10 00 1b mov %i3, %g3
while ( *link != NULL ) {
400068b8: c4 00 c0 00 ld [ %g3 ], %g2
400068bc: 80 a0 a0 00 cmp %g2, 0
400068c0: 22 80 00 41 be,a 400069c4 <pthread_setspecific+0x1dc>
400068c4: f8 21 20 10 st %i4, [ %g4 + 0x10 ]
if ( ( *less )( key, parent ) ) {
400068c8: f8 00 a0 10 ld [ %g2 + 0x10 ], %i4
400068cc: 80 a7 40 1c cmp %i5, %i4
400068d0: 1a 80 00 03 bcc 400068dc <pthread_setspecific+0xf4>
<== ALWAYS TAKEN
400068d4: 86 00 a0 04 add %g2, 4, %g3
return &RB_LEFT( the_node, Node );
400068d8: 86 10 00 02 mov %g2, %g3
<== NOT EXECUTED
link = _RBTree_Root_const_reference( the_rbtree );
400068dc: 10 bf ff f7 b 400068b8 <pthread_setspecific+0xd0>
400068e0: b8 10 00 02 mov %g2, %i4
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400068e4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400068e8: 01 00 00 00 nop
} else {
eno = _POSIX_Keys_Delete_value( key, executing );
}
return eno;
}
400068ec: 81 c7 e0 08 ret
400068f0: 91 e8 20 00 restore %g0, 0, %o0
_RBTree_Extract(
400068f4: 40 00 0c 86 call 40009b0c <_RBTree_Extract>
400068f8: c2 27 bf fc st %g1, [ %fp + -4 ]
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400068fc: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006900: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006904: 01 00 00 00 nop
next = the_node->next;
40006908: c4 07 00 00 ld [ %i4 ], %g2
previous = the_node->previous;
4000690c: c2 07 20 04 ld [ %i4 + 4 ], %g1
next->previous = previous;
40006910: c2 20 a0 04 st %g1, [ %g2 + 4 ]
_Freechain_Put( &_POSIX_Keys_Keypool, key_value_pair );
40006914: 11 10 00 68 sethi %hi(0x4001a000), %o0
previous->next = next;
40006918: c4 20 40 00 st %g2, [ %g1 ]
4000691c: 92 10 00 1c mov %i4, %o1
eno = 0;
40006920: b0 10 20 00 clr %i0
40006924: 40 00 03 11 call 40007568 <_Freechain_Put>
40006928: 90 12 23 94 or %o0, 0x394, %o0
_RTEMS_Unlock_allocator();
4000692c: 40 00 02 7e call 40007324 <_RTEMS_Unlock_allocator>
40006930: 01 00 00 00 nop
return eno;
40006934: 81 c7 e0 08 ret
40006938: 81 e8 00 00 restore
_RTEMS_Lock_allocator();
4000693c: 40 00 02 75 call 40007310 <_RTEMS_Lock_allocator>
40006940: 01 00 00 00 nop
return (POSIX_Keys_Control *)
40006944: 90 10 00 18 mov %i0, %o0
40006948: 13 10 00 68 sethi %hi(0x4001a000), %o1
eno = EINVAL;
4000694c: b0 10 20 16 mov 0x16, %i0
40006950: 40 00 0b a7 call 400097ec <_Objects_Get_no_protection>
40006954: 92 12 63 58 or %o1, 0x358, %o1
if ( the_key != NULL ) {
40006958: 80 a2 20 00 cmp %o0, 0
4000695c: 02 bf ff f4 be 4000692c <pthread_setspecific+0x144>
<== NEVER TAKEN
40006960: 01 00 00 00 nop
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40006964: 91 d0 20 09 ta 9
<== NOT EXECUTED
RTEMS_INLINE_ROUTINE POSIX_Keys_Key_value_pair *_POSIX_Keys_Key_value_find(
pthread_key_t key,
const Thread_Control *the_thread
)
{
return _RBTree_Find_inline(
40006968: 90 07 21 60 add %i4, 0x160, %o0
4000696c: 84 10 00 08 mov %o0, %g2
while ( *link != NULL ) {
40006970: d2 00 80 00 ld [ %g2 ], %o1
40006974: 80 a2 60 00 cmp %o1, 0
40006978: 02 80 00 0d be 400069ac <pthread_setspecific+0x1c4>
4000697c: b8 02 7f f8 add %o1, -8, %i4
return *the_left == the_right->key;
40006980: c4 07 20 18 ld [ %i4 + 0x18 ], %g2
if ( ( *equal )( key, parent ) ) {
40006984: 80 a7 40 02 cmp %i5, %g2
40006988: 02 bf ff db be 400068f4 <pthread_setspecific+0x10c>
<== ALWAYS TAKEN
4000698c: 01 00 00 00 nop
} else if ( ( *less )( key, parent ) ) {
40006990: 1a bf ff f8 bcc 40006970 <pthread_setspecific+0x188>
<== NOT EXECUTED
40006994: 84 02 60 04 add %o1, 4, %g2
<== NOT EXECUTED
return &RB_LEFT( the_node, Node );
40006998: 84 10 00 09 mov %o1, %g2
<== NOT EXECUTED
while ( *link != NULL ) {
4000699c: d2 00 80 00 ld [ %g2 ], %o1
<== NOT EXECUTED
400069a0: 80 a2 60 00 cmp %o1, 0
<== NOT EXECUTED
400069a4: 12 bf ff f7 bne 40006980 <pthread_setspecific+0x198>
<== NOT EXECUTED
400069a8: b8 02 7f f8 add %o1, -8, %i4
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400069ac: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400069b0: 01 00 00 00 nop
_RTEMS_Unlock_allocator();
400069b4: 40 00 02 5c call 40007324 <_RTEMS_Unlock_allocator>
400069b8: b0 10 20 00 clr %i0 ! 0 <PROM_START>
return eno;
400069bc: 81 c7 e0 08 ret
400069c0: 81 e8 00 00 restore
RB_SET( child, parent, Node );
400069c4: 84 10 20 01 mov 1, %g2
400069c8: c0 21 20 0c clr [ %g4 + 0xc ]
_RBTree_Insert_color( the_rbtree, the_node );
400069cc: 92 10 00 18 mov %i0, %o1
RB_SET( child, parent, Node );
400069d0: c0 21 20 08 clr [ %g4 + 8 ]
_RBTree_Insert_color( the_rbtree, the_node );
400069d4: 90 10 00 1b mov %i3, %o0
RB_SET( child, parent, Node );
400069d8: c4 21 20 14 st %g2, [ %g4 + 0x14 ]
*link = child;
400069dc: f0 20 c0 00 st %i0, [ %g3 ]
_RBTree_Insert_color( the_rbtree, the_node );
400069e0: 40 00 0d ad call 4000a094 <_RBTree_Insert_color>
400069e4: c2 27 bf fc st %g1, [ %fp + -4 ]
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400069e8: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400069ec: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400069f0: 01 00 00 00 nop
eno = 0;
400069f4: 10 bf ff ce b 4000692c <pthread_setspecific+0x144>
400069f8: b0 10 20 00 clr %i0 ! 0 <PROM_START>
40006518 <pthread_spin_lock>:
sizeof( POSIX_Spinlock_Control ) == sizeof( pthread_spinlock_t ),
POSIX_SPINLOCK_T_SIZE
);
int pthread_spin_lock( pthread_spinlock_t *spinlock )
{
40006518: 84 10 00 08 mov %o0, %g2
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000651c: 91 d0 20 09 ta 9
<== NOT EXECUTED
&cpu_self->Lock_stats_context
);
#endif
the_spinlock->interrupt_state = level;
return 0;
}
40006520: 90 10 20 00 clr %o0
40006524: 81 c3 e0 08 retl
40006528: c2 20 a0 08 st %g1, [ %g2 + 8 ]
4000652c <pthread_spin_unlock>:
{
POSIX_Spinlock_Control *the_spinlock;
ISR_Level level;
the_spinlock = _POSIX_Spinlock_Get( lock );
level = the_spinlock->interrupt_state;
4000652c: c2 02 20 08 ld [ %o0 + 8 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006530: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006534: 01 00 00 00 nop
&_Per_CPU_Get()->Lock_stats_context
);
#endif
_ISR_Local_enable( level );
return 0;
}
40006538: 81 c3 e0 08 retl
4000653c: 90 10 20 00 clr %o0 ! 0 <PROM_START>
40008080 <pthread_testcancel>:
/*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
40008080: 9d e3 bf a0 save %sp, -96, %sp
if ( _ISR_Is_in_progress() ) {
40008084: 40 00 06 20 call 40009904 <_ISR_Is_in_progress>
40008088: 01 00 00 00 nop
4000808c: 80 a2 20 00 cmp %o0, 0
40008090: 02 80 00 04 be 400080a0 <pthread_testcancel+0x20>
<== ALWAYS TAKEN
40008094: b4 10 20 08 mov 8, %i2
return;
}
_Thread_Change_life( 0, 0, THREAD_LIFE_CHANGE_DEFERRED );
}
40008098: 81 c7 e0 08 ret
<== NOT EXECUTED
4000809c: 81 e8 00 00 restore
<== NOT EXECUTED
_Thread_Change_life( 0, 0, THREAD_LIFE_CHANGE_DEFERRED );
400080a0: b2 10 20 00 clr %i1
400080a4: 40 00 17 1a call 4000dd0c <_Thread_Change_life>
400080a8: 91 e8 20 00 restore %g0, 0, %o0
40006f5c <rtems_aio_enqueue>:
{
40006f5c: 9d e3 bf 68 save %sp, -152, %sp
result = pthread_mutex_lock (&aio_request_queue.mutex);
40006f60: 3b 10 00 59 sethi %hi(0x40016400), %i5
40006f64: 40 00 02 f2 call 40007b2c <pthread_mutex_lock>
40006f68: 90 17 60 68 or %i5, 0x68, %o0 ! 40016468 <aio_request_queue>
if (result != 0) {
40006f6c: b8 92 20 00 orcc %o0, 0, %i4
40006f70: 12 80 00 30 bne 40007030 <rtems_aio_enqueue+0xd4>
<== NEVER TAKEN
40006f74: 90 10 00 18 mov %i0, %o0
pthread_getschedparam (pthread_self(), &policy, ¶m);
40006f78: 40 00 06 4f call 400088b4 <pthread_self>
40006f7c: b6 17 60 68 or %i5, 0x68, %i3
40006f80: 94 07 bf d0 add %fp, -48, %o2
40006f84: 40 00 05 75 call 40008558 <pthread_getschedparam>
40006f88: 92 07 bf cc add %fp, -52, %o1
req->caller_thread = pthread_self ();
40006f8c: 40 00 06 4a call 400088b4 <pthread_self>
40006f90: 01 00 00 00 nop
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
40006f94: c2 06 20 14 ld [ %i0 + 0x14 ], %g1
40006f98: c6 00 60 18 ld [ %g1 + 0x18 ], %g3
40006f9c: c4 07 bf d0 ld [ %fp + -48 ], %g2
40006fa0: 84 20 80 03 sub %g2, %g3, %g2
req->policy = policy;
40006fa4: c6 07 bf cc ld [ %fp + -52 ], %g3
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
40006fa8: c4 26 20 0c st %g2, [ %i0 + 0xc ]
req->aiocbp->error_code = EINPROGRESS;
40006fac: 84 10 20 77 mov 0x77, %g2
req->caller_thread = pthread_self ();
40006fb0: d0 26 20 10 st %o0, [ %i0 + 0x10 ]
req->policy = policy;
40006fb4: c6 26 20 08 st %g3, [ %i0 + 8 ]
req->aiocbp->error_code = EINPROGRESS;
40006fb8: c4 20 60 34 st %g2, [ %g1 + 0x34 ]
req->aiocbp->return_value = 0;
40006fbc: c0 20 60 38 clr [ %g1 + 0x38 ]
if ((aio_request_queue.idle_threads == 0) &&
40006fc0: c4 06 e0 e0 ld [ %i3 + 0xe0 ], %g2
40006fc4: 80 a0 a0 00 cmp %g2, 0
40006fc8: 12 80 00 1e bne 40007040 <rtems_aio_enqueue+0xe4>
<== NEVER TAKEN
40006fcc: d2 00 40 00 ld [ %g1 ], %o1
40006fd0: c4 06 e0 dc ld [ %i3 + 0xdc ], %g2
40006fd4: 80 a0 a0 04 cmp %g2, 4
40006fd8: 04 80 00 36 ble 400070b0 <rtems_aio_enqueue+0x154>
40006fdc: 94 10 20 00 clr %o2
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
40006fe0: 11 10 00 59 sethi %hi(0x40016400), %o0
40006fe4: 7f ff ff 69 call 40006d88 <rtems_aio_search_fd>
40006fe8: 90 12 21 28 or %o0, 0x128, %o0 ! 40016528 <aio_request_queue+0xc0>
if (r_chain != NULL)
40006fec: b4 92 20 00 orcc %o0, 0, %i2
40006ff0: 22 80 00 1c be,a 40007060 <rtems_aio_enqueue+0x104>
40006ff4: c2 06 20 14 ld [ %i0 + 0x14 ], %g1
pthread_mutex_lock (&r_chain->mutex);
40006ff8: b6 06 a0 20 add %i2, 0x20, %i3
40006ffc: 40 00 02 cc call 40007b2c <pthread_mutex_lock>
40007000: 90 10 00 1b mov %i3, %o0
rtems_aio_insert_prio (&r_chain->perfd, req);
40007004: 92 10 00 18 mov %i0, %o1
40007008: 7f ff fe 53 call 40006954 <rtems_aio_insert_prio>
4000700c: 90 06 a0 08 add %i2, 8, %o0
pthread_cond_signal (&r_chain->cond);
40007010: 40 00 01 0c call 40007440 <pthread_cond_signal>
40007014: 90 06 a0 60 add %i2, 0x60, %o0
pthread_mutex_unlock (&r_chain->mutex);
40007018: 40 00 03 98 call 40007e78 <pthread_mutex_unlock>
4000701c: 90 10 00 1b mov %i3, %o0
pthread_mutex_unlock (&aio_request_queue.mutex);
40007020: 40 00 03 96 call 40007e78 <pthread_mutex_unlock>
40007024: 90 17 60 68 or %i5, 0x68, %o0
}
40007028: 81 c7 e0 08 ret
4000702c: 91 e8 00 1c restore %g0, %i4, %o0
free (req);
40007030: 7f ff f6 79 call 40004a14 <free>
<== NOT EXECUTED
40007034: b0 10 00 1c mov %i4, %i0
<== NOT EXECUTED
}
40007038: 81 c7 e0 08 ret
<== NOT EXECUTED
4000703c: 81 e8 00 00 restore
<== NOT EXECUTED
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
40007040: 94 10 20 00 clr %o2
<== NOT EXECUTED
40007044: 11 10 00 59 sethi %hi(0x40016400), %o0
<== NOT EXECUTED
40007048: 7f ff ff 50 call 40006d88 <rtems_aio_search_fd>
<== NOT EXECUTED
4000704c: 90 12 21 28 or %o0, 0x128, %o0 ! 40016528 <aio_request_queue+0xc0>
<== NOT EXECUTED
if (r_chain != NULL)
40007050: b4 92 20 00 orcc %o0, 0, %i2
<== NOT EXECUTED
40007054: 32 bf ff ea bne,a 40006ffc <rtems_aio_enqueue+0xa0>
<== NOT EXECUTED
40007058: b6 06 a0 20 add %i2, 0x20, %i3
<== NOT EXECUTED
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
4000705c: c2 06 20 14 ld [ %i0 + 0x14 ], %g1
<== NOT EXECUTED
40007060: d2 00 40 00 ld [ %g1 ], %o1
40007064: 94 10 20 01 mov 1, %o2
40007068: 11 10 00 59 sethi %hi(0x40016400), %o0
4000706c: 7f ff ff 47 call 40006d88 <rtems_aio_search_fd>
40007070: 90 12 21 34 or %o0, 0x134, %o0 ! 40016534 <aio_request_queue+0xcc>
if (r_chain->new_fd == 1) {
40007074: c2 02 20 18 ld [ %o0 + 0x18 ], %g1
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
40007078: b4 10 00 08 mov %o0, %i2
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
4000707c: 92 10 00 18 mov %i0, %o1
if (r_chain->new_fd == 1) {
40007080: 80 a0 60 01 cmp %g1, 1
40007084: 02 80 00 29 be 40007128 <rtems_aio_enqueue+0x1cc>
40007088: 90 02 20 08 add %o0, 8, %o0
rtems_aio_insert_prio (&r_chain->perfd, req);
4000708c: 7f ff fe 32 call 40006954 <rtems_aio_insert_prio>
40007090: 01 00 00 00 nop
if (aio_request_queue.idle_threads > 0)
40007094: c2 06 e0 e0 ld [ %i3 + 0xe0 ], %g1
40007098: 80 a0 60 00 cmp %g1, 0
4000709c: 04 bf ff e1 ble 40007020 <rtems_aio_enqueue+0xc4>
<== ALWAYS TAKEN
400070a0: 01 00 00 00 nop
pthread_cond_signal (&aio_request_queue.new_req);
400070a4: 40 00 00 e7 call 40007440 <pthread_cond_signal>
<== NOT EXECUTED
400070a8: 90 06 e0 40 add %i3, 0x40, %o0
<== NOT EXECUTED
400070ac: 30 bf ff dd b,a 40007020 <rtems_aio_enqueue+0xc4>
<== NOT EXECUTED
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
400070b0: 94 10 20 01 mov 1, %o2
400070b4: 7f ff ff 35 call 40006d88 <rtems_aio_search_fd>
400070b8: 90 06 e0 c0 add %i3, 0xc0, %o0
if (r_chain->new_fd == 1) {
400070bc: c2 02 20 18 ld [ %o0 + 0x18 ], %g1
400070c0: 80 a0 60 01 cmp %g1, 1
400070c4: 12 bf ff cd bne 40006ff8 <rtems_aio_enqueue+0x9c>
400070c8: b4 10 00 08 mov %o0, %i2
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
400070cc: 92 10 00 18 mov %i0, %o1
400070d0: 40 00 06 bb call 40008bbc <rtems_chain_prepend>
400070d4: 90 02 20 08 add %o0, 8, %o0
r_chain->new_fd = 0;
400070d8: c0 26 a0 18 clr [ %i2 + 0x18 ]
pthread_mutex_init (&r_chain->mutex, NULL);
400070dc: 92 10 20 00 clr %o1
400070e0: 40 00 02 40 call 400079e0 <pthread_mutex_init>
400070e4: 90 06 a0 20 add %i2, 0x20, %o0
pthread_cond_init (&r_chain->cond, NULL);
400070e8: 92 10 20 00 clr %o1
400070ec: 40 00 00 ae call 400073a4 <pthread_cond_init>
400070f0: 90 06 a0 60 add %i2, 0x60, %o0
result = pthread_create (&thid, &aio_request_queue.attr,
400070f4: 96 10 00 1a mov %i2, %o3
400070f8: 92 06 e0 60 add %i3, 0x60, %o1
400070fc: 15 10 00 1a sethi %hi(0x40006800), %o2
40007100: 90 07 bf c8 add %fp, -56, %o0
40007104: 40 00 04 3f call 40008200 <pthread_create>
40007108: 94 12 a1 d8 or %o2, 0x1d8, %o2
if (result != 0) {
4000710c: 82 92 20 00 orcc %o0, 0, %g1
40007110: 12 80 00 11 bne 40007154 <rtems_aio_enqueue+0x1f8>
<== NEVER TAKEN
40007114: 90 10 00 1b mov %i3, %o0
++aio_request_queue.active_threads;
40007118: c2 06 e0 dc ld [ %i3 + 0xdc ], %g1
4000711c: 82 00 60 01 inc %g1
40007120: 10 bf ff c0 b 40007020 <rtems_aio_enqueue+0xc4>
40007124: c2 26 e0 dc st %g1, [ %i3 + 0xdc ]
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
40007128: 40 00 06 a5 call 40008bbc <rtems_chain_prepend>
4000712c: 01 00 00 00 nop
r_chain->new_fd = 0;
40007130: c0 26 a0 18 clr [ %i2 + 0x18 ]
pthread_mutex_init (&r_chain->mutex, NULL);
40007134: 92 10 20 00 clr %o1
40007138: 40 00 02 2a call 400079e0 <pthread_mutex_init>
4000713c: 90 06 a0 20 add %i2, 0x20, %o0
pthread_cond_init (&r_chain->cond, NULL);
40007140: 92 10 20 00 clr %o1
40007144: 40 00 00 98 call 400073a4 <pthread_cond_init>
40007148: 90 06 a0 60 add %i2, 0x60, %o0
4000714c: 10 bf ff d3 b 40007098 <rtems_aio_enqueue+0x13c>
40007150: c2 06 e0 e0 ld [ %i3 + 0xe0 ], %g1
pthread_mutex_unlock (&aio_request_queue.mutex);
40007154: 40 00 03 49 call 40007e78 <pthread_mutex_unlock>
<== NOT EXECUTED
40007158: b8 10 00 01 mov %g1, %i4
<== NOT EXECUTED
return result;
4000715c: 30 bf ff b3 b,a 40007028 <rtems_aio_enqueue+0xcc>
<== NOT EXECUTED
40006c80 <rtems_aio_init>:
{
40006c80: 9d e3 bf a0 save %sp, -96, %sp
result = pthread_attr_init (&aio_request_queue.attr);
40006c84: 39 10 00 59 sethi %hi(0x40016400), %i4
40006c88: 40 00 05 41 call 4000818c <pthread_attr_init>
40006c8c: 90 17 20 c8 or %i4, 0xc8, %o0 ! 400164c8 <aio_request_queue+0x60>
if (result != 0)
40006c90: b0 92 20 00 orcc %o0, 0, %i0
40006c94: 12 80 00 23 bne 40006d20 <rtems_aio_init+0xa0>
<== NEVER TAKEN
40006c98: 92 10 20 00 clr %o1
result =
40006c9c: 40 00 05 4b call 400081c8 <pthread_attr_setdetachstate>
40006ca0: 90 17 20 c8 or %i4, 0xc8, %o0
if (result != 0)
40006ca4: 80 a2 20 00 cmp %o0, 0
40006ca8: 12 80 00 20 bne 40006d28 <rtems_aio_init+0xa8>
<== NEVER TAKEN
40006cac: 92 10 20 00 clr %o1
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
40006cb0: 3b 10 00 59 sethi %hi(0x40016400), %i5
40006cb4: 40 00 03 4b call 400079e0 <pthread_mutex_init>
40006cb8: 90 17 60 68 or %i5, 0x68, %o0 ! 40016468 <aio_request_queue>
if (result != 0)
40006cbc: 80 a2 20 00 cmp %o0, 0
40006cc0: 12 80 00 23 bne 40006d4c <rtems_aio_init+0xcc>
<== NEVER TAKEN
40006cc4: 92 10 20 00 clr %o1
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
40006cc8: 11 10 00 59 sethi %hi(0x40016400), %o0
40006ccc: 40 00 01 b6 call 400073a4 <pthread_cond_init>
40006cd0: 90 12 20 a8 or %o0, 0xa8, %o0 ! 400164a8 <aio_request_queue+0x40>
if (result != 0) {
40006cd4: b0 92 20 00 orcc %o0, 0, %i0
40006cd8: 12 80 00 26 bne 40006d70 <rtems_aio_init+0xf0>
<== NEVER TAKEN
40006cdc: 01 00 00 00 nop
head->next = tail;
40006ce0: 82 17 60 68 or %i5, 0x68, %g1
tail->previous = head;
40006ce4: 84 00 60 cc add %g1, 0xcc, %g2
head->next = tail;
40006ce8: ba 00 60 c4 add %g1, 0xc4, %i5
tail->previous = head;
40006cec: 88 00 60 c0 add %g1, 0xc0, %g4
head->next = tail;
40006cf0: 86 00 60 d0 add %g1, 0xd0, %g3
tail->previous = head;
40006cf4: c4 20 60 d4 st %g2, [ %g1 + 0xd4 ]
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
40006cf8: 05 00 00 2c sethi %hi(0xb000), %g2
head->next = tail;
40006cfc: fa 20 60 c0 st %i5, [ %g1 + 0xc0 ]
40006d00: 84 10 a0 0b or %g2, 0xb, %g2
head->previous = NULL;
40006d04: c0 20 60 c4 clr [ %g1 + 0xc4 ]
tail->previous = head;
40006d08: c8 20 60 c8 st %g4, [ %g1 + 0xc8 ]
head->next = tail;
40006d0c: c6 20 60 cc st %g3, [ %g1 + 0xcc ]
head->previous = NULL;
40006d10: c0 20 60 d0 clr [ %g1 + 0xd0 ]
aio_request_queue.active_threads = 0;
40006d14: c0 20 60 dc clr [ %g1 + 0xdc ]
aio_request_queue.idle_threads = 0;
40006d18: c0 20 60 e0 clr [ %g1 + 0xe0 ]
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
40006d1c: c4 20 60 d8 st %g2, [ %g1 + 0xd8 ]
}
40006d20: 81 c7 e0 08 ret
40006d24: 81 e8 00 00 restore
pthread_attr_destroy (&aio_request_queue.attr);
40006d28: 40 00 05 0d call 4000815c <pthread_attr_destroy>
<== NOT EXECUTED
40006d2c: 90 17 20 c8 or %i4, 0xc8, %o0
<== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
40006d30: 92 10 20 00 clr %o1
<== NOT EXECUTED
40006d34: 3b 10 00 59 sethi %hi(0x40016400), %i5
<== NOT EXECUTED
40006d38: 40 00 03 2a call 400079e0 <pthread_mutex_init>
<== NOT EXECUTED
40006d3c: 90 17 60 68 or %i5, 0x68, %o0 ! 40016468 <aio_request_queue>
<== NOT EXECUTED
if (result != 0)
40006d40: 80 a2 20 00 cmp %o0, 0
<== NOT EXECUTED
40006d44: 02 bf ff e1 be 40006cc8 <rtems_aio_init+0x48>
<== NOT EXECUTED
40006d48: 92 10 20 00 clr %o1
<== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
40006d4c: 40 00 05 04 call 4000815c <pthread_attr_destroy>
<== NOT EXECUTED
40006d50: 90 17 20 c8 or %i4, 0xc8, %o0
<== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
40006d54: 92 10 20 00 clr %o1
<== NOT EXECUTED
40006d58: 11 10 00 59 sethi %hi(0x40016400), %o0
<== NOT EXECUTED
40006d5c: 40 00 01 92 call 400073a4 <pthread_cond_init>
<== NOT EXECUTED
40006d60: 90 12 20 a8 or %o0, 0xa8, %o0 ! 400164a8 <aio_request_queue+0x40>
<== NOT EXECUTED
if (result != 0) {
40006d64: b0 92 20 00 orcc %o0, 0, %i0
<== NOT EXECUTED
40006d68: 22 bf ff df be,a 40006ce4 <rtems_aio_init+0x64>
<== NOT EXECUTED
40006d6c: 82 17 60 68 or %i5, 0x68, %g1
<== NOT EXECUTED
pthread_mutex_destroy (&aio_request_queue.mutex);
40006d70: 40 00 02 f9 call 40007954 <pthread_mutex_destroy>
<== NOT EXECUTED
40006d74: 90 17 60 68 or %i5, 0x68, %o0
<== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
40006d78: 40 00 04 f9 call 4000815c <pthread_attr_destroy>
<== NOT EXECUTED
40006d7c: 90 17 20 c8 or %i4, 0xc8, %o0
<== NOT EXECUTED
head->next = tail;
40006d80: 10 bf ff d9 b 40006ce4 <rtems_aio_init+0x64>
<== NOT EXECUTED
40006d84: 82 17 60 68 or %i5, 0x68, %g1
<== NOT EXECUTED
40006e88 <rtems_aio_remove_fd>:
{
40006e88: 9d e3 bf a0 save %sp, -96, %sp
return _Chain_Immutable_head( the_chain )->next;
40006e8c: fa 06 20 08 ld [ %i0 + 8 ], %i5
return &the_chain->Tail.Node;
40006e90: b0 06 20 0c add %i0, 0xc, %i0
while (!rtems_chain_is_tail (chain, node))
40006e94: 80 a7 40 18 cmp %i5, %i0
40006e98: 02 80 00 0f be 40006ed4 <rtems_aio_remove_fd+0x4c>
<== NEVER TAKEN
40006e9c: b4 10 20 8c mov 0x8c, %i2
req->aiocbp->return_value = -1;
40006ea0: b6 10 3f ff mov -1, %i3
rtems_chain_extract (&req->next_prio);
40006ea4: 90 10 00 1d mov %i5, %o0
40006ea8: 40 00 07 32 call 40008b70 <rtems_chain_extract>
40006eac: f8 07 40 00 ld [ %i5 ], %i4
req->aiocbp->error_code = ECANCELED;
40006eb0: c2 07 60 14 ld [ %i5 + 0x14 ], %g1
40006eb4: f4 20 60 34 st %i2, [ %g1 + 0x34 ]
free (req);
40006eb8: 90 10 00 1d mov %i5, %o0
req->aiocbp->return_value = -1;
40006ebc: f6 20 60 38 st %i3, [ %g1 + 0x38 ]
free (req);
40006ec0: 7f ff f6 d5 call 40004a14 <free>
40006ec4: ba 10 00 1c mov %i4, %i5
while (!rtems_chain_is_tail (chain, node))
40006ec8: 80 a7 00 18 cmp %i4, %i0
40006ecc: 12 bf ff f7 bne 40006ea8 <rtems_aio_remove_fd+0x20>
40006ed0: 90 10 00 1d mov %i5, %o0
}
40006ed4: 81 c7 e0 08 ret
40006ed8: 81 e8 00 00 restore
40006edc <rtems_aio_remove_req>:
{
40006edc: 9d e3 bf a0 save %sp, -96, %sp
return _Chain_Immutable_head( the_chain )->next;
40006ee0: fa 06 00 00 ld [ %i0 ], %i5
return &the_chain->Tail.Node;
40006ee4: 84 06 20 04 add %i0, 4, %g2
if (rtems_chain_is_empty (chain))
40006ee8: 80 a0 80 1d cmp %g2, %i5
40006eec: 02 80 00 1a be 40006f54 <rtems_aio_remove_req+0x78>
40006ef0: 01 00 00 00 nop
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
40006ef4: c2 07 60 14 ld [ %i5 + 0x14 ], %g1
40006ef8: 80 a0 40 19 cmp %g1, %i1
40006efc: 02 80 00 08 be 40006f1c <rtems_aio_remove_req+0x40>
<== ALWAYS TAKEN
40006f00: 80 a0 80 1d cmp %g2, %i5
40006f04: fa 07 40 00 ld [ %i5 ], %i5
<== NOT EXECUTED
40006f08: 80 a7 40 02 cmp %i5, %g2
<== NOT EXECUTED
40006f0c: 32 bf ff fb bne,a 40006ef8 <rtems_aio_remove_req+0x1c>
<== NOT EXECUTED
40006f10: c2 07 60 14 ld [ %i5 + 0x14 ], %g1
<== NOT EXECUTED
}
40006f14: 81 c7 e0 08 ret
<== NOT EXECUTED
40006f18: 91 e8 20 01 restore %g0, 1, %o0
<== NOT EXECUTED
if (rtems_chain_is_tail (chain, node))
40006f1c: 02 80 00 0c be 40006f4c <rtems_aio_remove_req+0x70>
<== NEVER TAKEN
40006f20: b0 10 20 01 mov 1, %i0
rtems_chain_extract (node);
40006f24: 40 00 07 13 call 40008b70 <rtems_chain_extract>
40006f28: 90 10 00 1d mov %i5, %o0
current->aiocbp->error_code = ECANCELED;
40006f2c: c2 07 60 14 ld [ %i5 + 0x14 ], %g1
40006f30: 84 10 20 8c mov 0x8c, %g2
40006f34: c4 20 60 34 st %g2, [ %g1 + 0x34 ]
current->aiocbp->return_value = -1;
40006f38: 84 10 3f ff mov -1, %g2
40006f3c: c4 20 60 38 st %g2, [ %g1 + 0x38 ]
free (current);
40006f40: 90 10 00 1d mov %i5, %o0
40006f44: 7f ff f6 b4 call 40004a14 <free>
40006f48: b0 10 20 00 clr %i0
return AIO_CANCELED;
40006f4c: 81 c7 e0 08 ret
40006f50: 81 e8 00 00 restore
return AIO_ALLDONE;
40006f54: 81 c7 e0 08 ret
40006f58: 91 e8 20 02 restore %g0, 2, %o0
40006d88 <rtems_aio_search_fd>:
{
40006d88: 9d e3 bf a0 save %sp, -96, %sp
return _Chain_Immutable_head( the_chain )->next;
40006d8c: f6 06 00 00 ld [ %i0 ], %i3
while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) {
40006d90: c2 06 e0 14 ld [ %i3 + 0x14 ], %g1
40006d94: 80 a6 40 01 cmp %i1, %g1
40006d98: 04 80 00 10 ble 40006dd8 <rtems_aio_search_fd+0x50>
40006d9c: ba 10 00 1b mov %i3, %i5
return &the_chain->Tail.Node;
40006da0: b8 06 20 04 add %i0, 4, %i4
40006da4: 80 a6 c0 1c cmp %i3, %i4
40006da8: 02 80 00 27 be 40006e44 <rtems_aio_search_fd+0xbc>
40006dac: 80 a6 a0 00 cmp %i2, 0
40006db0: 10 80 00 05 b 40006dc4 <rtems_aio_search_fd+0x3c>
40006db4: fa 07 40 00 ld [ %i5 ], %i5
40006db8: 02 80 00 0e be 40006df0 <rtems_aio_search_fd+0x68>
40006dbc: 80 a6 a0 00 cmp %i2, 0
40006dc0: fa 07 40 00 ld [ %i5 ], %i5
40006dc4: c2 07 60 14 ld [ %i5 + 0x14 ], %g1
40006dc8: 80 a0 40 19 cmp %g1, %i1
40006dcc: 06 bf ff fb bl 40006db8 <rtems_aio_search_fd+0x30>
40006dd0: 80 a7 40 1c cmp %i5, %i4
if (r_chain->fildes == fildes)
40006dd4: 80 a6 40 01 cmp %i1, %g1
40006dd8: 32 80 00 05 bne,a 40006dec <rtems_aio_search_fd+0x64>
40006ddc: b8 10 00 1d mov %i5, %i4
r_chain->new_fd = 0;
40006de0: c0 27 60 18 clr [ %i5 + 0x18 ]
}
40006de4: 81 c7 e0 08 ret
40006de8: 91 e8 00 1d restore %g0, %i5, %o0
if (create == 0)
40006dec: 80 a6 a0 00 cmp %i2, 0
40006df0: 02 80 00 24 be 40006e80 <rtems_aio_search_fd+0xf8>
40006df4: ba 10 20 00 clr %i5
r_chain = malloc (sizeof (rtems_aio_request_chain));
40006df8: 7f ff f8 5b call 40004f64 <malloc>
40006dfc: 90 10 20 80 mov 0x80, %o0
return &the_chain->Tail.Node;
40006e00: 82 02 20 08 add %o0, 8, %g1
40006e04: 86 02 20 0c add %o0, 0xc, %g3
head->previous = NULL;
40006e08: c0 22 20 0c clr [ %o0 + 0xc ]
return &the_chain->Tail.Node;
40006e0c: 84 06 20 04 add %i0, 4, %g2
head->next = tail;
40006e10: c6 22 20 08 st %g3, [ %o0 + 8 ]
40006e14: ba 10 00 08 mov %o0, %i5
if (rtems_chain_is_empty (chain))
40006e18: 80 a6 c0 02 cmp %i3, %g2
40006e1c: 02 80 00 14 be 40006e6c <rtems_aio_search_fd+0xe4>
40006e20: c2 22 20 10 st %g1, [ %o0 + 0x10 ]
rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd);
40006e24: d0 07 20 04 ld [ %i4 + 4 ], %o0
40006e28: 40 00 07 5b call 40008b94 <rtems_chain_insert>
40006e2c: 92 10 00 1d mov %i5, %o1
r_chain->new_fd = 1;
40006e30: 82 10 20 01 mov 1, %g1
r_chain->fildes = fildes;
40006e34: f2 27 60 14 st %i1, [ %i5 + 0x14 ]
r_chain->new_fd = 1;
40006e38: c2 27 60 18 st %g1, [ %i5 + 0x18 ]
}
40006e3c: 81 c7 e0 08 ret
40006e40: 91 e8 00 1d restore %g0, %i5, %o0
if (create == 0)
40006e44: 22 80 00 0f be,a 40006e80 <rtems_aio_search_fd+0xf8>
<== NEVER TAKEN
40006e48: ba 10 20 00 clr %i5
<== NOT EXECUTED
r_chain = malloc (sizeof (rtems_aio_request_chain));
40006e4c: 7f ff f8 46 call 40004f64 <malloc>
40006e50: 90 10 20 80 mov 0x80, %o0
return &the_chain->Tail.Node;
40006e54: 82 02 20 08 add %o0, 8, %g1
40006e58: 84 02 20 0c add %o0, 0xc, %g2
head->previous = NULL;
40006e5c: c0 22 20 0c clr [ %o0 + 0xc ]
40006e60: ba 10 00 08 mov %o0, %i5
head->next = tail;
40006e64: c4 22 20 08 st %g2, [ %o0 + 8 ]
tail->previous = head;
40006e68: c2 22 20 10 st %g1, [ %o0 + 0x10 ]
rtems_chain_prepend (chain, &r_chain->next_fd);
40006e6c: 92 10 00 1d mov %i5, %o1
40006e70: 40 00 07 53 call 40008bbc <rtems_chain_prepend>
40006e74: 90 10 00 18 mov %i0, %o0
40006e78: 10 bf ff ef b 40006e34 <rtems_aio_search_fd+0xac>
40006e7c: 82 10 20 01 mov 1, %g1
}
40006e80: 81 c7 e0 08 ret
40006e84: 91 e8 00 1d restore %g0, %i5, %o0
40006e0c <sched_get_priority_max>:
#include <rtems/score/schedulerimpl.h>
int sched_get_priority_max(
int policy
)
{
40006e0c: 9d e3 bf a0 save %sp, -96, %sp
40006e10: 80 a6 20 04 cmp %i0, 4
40006e14: 18 80 00 09 bgu 40006e38 <sched_get_priority_max+0x2c>
40006e18: 82 10 20 01 mov 1, %g1
40006e1c: b1 28 40 18 sll %g1, %i0, %i0
40006e20: 80 8e 20 17 btst 0x17, %i0
RTEMS_INLINE_ROUTINE int _POSIX_Priority_Get_maximum(
const Scheduler_Control *scheduler
)
{
_Assert( (int) scheduler->maximum_priority > 1 );
return (int) scheduler->maximum_priority - 1;
40006e24: 02 80 00 05 be 40006e38 <sched_get_priority_max+0x2c>
<== NEVER TAKEN
40006e28: 03 10 00 5c sethi %hi(0x40017000), %g1
40006e2c: f0 00 63 34 ld [ %g1 + 0x334 ], %i0 ! 40017334 <_Scheduler_Table+0x44>
rtems_set_errno_and_return_minus_one( EINVAL );
}
scheduler = _Thread_Scheduler_get_home( _Thread_Get_executing() );
return _POSIX_Priority_Get_maximum( scheduler );
}
40006e30: 81 c7 e0 08 ret
40006e34: 91 ee 3f ff restore %i0, -1, %o0
rtems_set_errno_and_return_minus_one( EINVAL );
40006e38: 40 00 20 4c call 4000ef68 <__errno>
40006e3c: b0 10 3f ff mov -1, %i0
40006e40: 82 10 20 16 mov 0x16, %g1
40006e44: c2 22 00 00 st %g1, [ %o0 ]
40006e48: 81 c7 e0 08 ret
40006e4c: 81 e8 00 00 restore
40006e50 <sched_get_priority_min>:
* 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
*/
int sched_get_priority_min(
int policy
)
{
40006e50: 9d e3 bf a0 save %sp, -96, %sp
40006e54: 80 a6 20 04 cmp %i0, 4
40006e58: 18 80 00 08 bgu 40006e78 <sched_get_priority_min+0x28>
40006e5c: 82 10 20 01 mov 1, %g1
40006e60: 83 28 40 18 sll %g1, %i0, %g1
40006e64: 80 88 60 17 btst 0x17, %g1
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
40006e68: 02 80 00 04 be 40006e78 <sched_get_priority_min+0x28>
<== NEVER TAKEN
40006e6c: 84 10 20 01 mov 1, %g2
}
40006e70: 81 c7 e0 08 ret
40006e74: 91 e8 00 02 restore %g0, %g2, %o0
rtems_set_errno_and_return_minus_one( EINVAL );
40006e78: 40 00 20 3c call 4000ef68 <__errno>
40006e7c: 01 00 00 00 nop
40006e80: 82 10 20 16 mov 0x16, %g1 ! 16 <_TLS_Alignment+0x15>
40006e84: 84 10 3f ff mov -1, %g2
40006e88: 10 bf ff fa b 40006e70 <sched_get_priority_min+0x20>
40006e8c: c2 22 00 00 st %g1, [ %o0 ]
40006e90 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
40006e90: 9d e3 bf a0 save %sp, -96, %sp
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
40006e94: 80 a6 20 00 cmp %i0, 0
40006e98: 12 80 00 0a bne 40006ec0 <sched_rr_get_interval+0x30>
<== ALWAYS TAKEN
40006e9c: 80 a6 60 00 cmp %i1, 0
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
40006ea0: 02 80 00 13 be 40006eec <sched_rr_get_interval+0x5c>
40006ea4: 03 10 00 5c sethi %hi(0x40017000), %g1
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks(
40006ea8: d0 00 62 20 ld [ %g1 + 0x220 ], %o0 ! 40017220 <Configuration+0x18>
40006eac: 92 10 00 19 mov %i1, %o1
40006eb0: 40 00 15 83 call 4000c4bc <_Timespec_From_ticks>
40006eb4: b0 10 20 00 clr %i0
rtems_configuration_get_ticks_per_timeslice(),
interval
);
return 0;
}
40006eb8: 81 c7 e0 08 ret
40006ebc: 81 e8 00 00 restore
if ( pid && pid != getpid() )
40006ec0: 7f ff f6 9f call 4000493c <getpid>
40006ec4: 01 00 00 00 nop
40006ec8: 80 a2 00 18 cmp %o0, %i0
40006ecc: 02 bf ff f5 be 40006ea0 <sched_rr_get_interval+0x10>
40006ed0: 80 a6 60 00 cmp %i1, 0
rtems_set_errno_and_return_minus_one( ESRCH );
40006ed4: 40 00 20 25 call 4000ef68 <__errno>
40006ed8: b0 10 3f ff mov -1, %i0
40006edc: 82 10 20 03 mov 3, %g1
40006ee0: c2 22 00 00 st %g1, [ %o0 ]
40006ee4: 81 c7 e0 08 ret
40006ee8: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( EINVAL );
40006eec: 40 00 20 1f call 4000ef68 <__errno>
40006ef0: b0 10 3f ff mov -1, %i0
40006ef4: 82 10 20 16 mov 0x16, %g1
40006ef8: c2 22 00 00 st %g1, [ %o0 ]
40006efc: 81 c7 e0 08 ret
40006f00: 81 e8 00 00 restore
4000b4e0 <sem_close>:
#endif
#include <rtems/posix/semaphoreimpl.h>
int sem_close( sem_t *sem )
{
4000b4e0: 9d e3 bf a0 save %sp, -96, %sp
POSIX_Semaphore_Control *the_semaphore;
uint32_t open_count;
POSIX_SEMAPHORE_VALIDATE_OBJECT( sem );
4000b4e4: 80 a6 20 00 cmp %i0, 0
4000b4e8: 02 80 00 22 be 4000b570 <sem_close+0x90>
4000b4ec: 03 17 4d 9f sethi %hi(0x5d367c00), %g1
4000b4f0: c4 06 00 00 ld [ %i0 ], %g2
4000b4f4: 82 10 63 e7 or %g1, 0x3e7, %g1
4000b4f8: 82 1e 00 01 xor %i0, %g1, %g1
4000b4fc: 80 a0 40 02 cmp %g1, %g2
4000b500: 12 80 00 1c bne 4000b570 <sem_close+0x90>
4000b504: 01 00 00 00 nop
if ( !_POSIX_Semaphore_Is_named( sem ) ) {
4000b508: c2 06 20 14 ld [ %i0 + 0x14 ], %g1
4000b50c: 80 a0 60 00 cmp %g1, 0
4000b510: 02 80 00 18 be 4000b570 <sem_close+0x90>
<== NEVER TAKEN
4000b514: 01 00 00 00 nop
_RTEMS_Lock_allocator();
4000b518: 40 00 02 2f call 4000bdd4 <_RTEMS_Lock_allocator>
4000b51c: 01 00 00 00 nop
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get(
sem_t *sem
)
{
return RTEMS_CONTAINER_OF( sem, POSIX_Semaphore_Control, Semaphore );
4000b520: 90 06 3f f0 add %i0, -16, %o0
the_semaphore = _POSIX_Semaphore_Get( sem );
_Objects_Allocator_lock();
open_count = the_semaphore->open_count;
4000b524: c2 02 20 30 ld [ %o0 + 0x30 ], %g1
if ( open_count == 0 ) {
4000b528: 80 a0 60 00 cmp %g1, 0
4000b52c: 02 80 00 0f be 4000b568 <sem_close+0x88>
<== NEVER TAKEN
4000b530: 80 a0 60 01 cmp %g1, 1
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( open_count == 1 && _POSIX_Semaphore_Is_busy( sem ) ) {
4000b534: 12 80 00 06 bne 4000b54c <sem_close+0x6c>
4000b538: 82 00 7f ff add %g1, -1, %g1
4000b53c: c4 06 20 0c ld [ %i0 + 0xc ], %g2
4000b540: 80 a0 a0 00 cmp %g2, 0
4000b544: 12 80 00 11 bne 4000b588 <sem_close+0xa8>
4000b548: 01 00 00 00 nop
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( EBUSY );
}
the_semaphore->open_count = open_count - 1;
4000b54c: c2 22 20 30 st %g1, [ %o0 + 0x30 ]
_POSIX_Semaphore_Delete( the_semaphore );
4000b550: 40 00 1f e1 call 400134d4 <_POSIX_Semaphore_Delete>
4000b554: b0 10 20 00 clr %i0
_RTEMS_Unlock_allocator();
4000b558: 40 00 02 24 call 4000bde8 <_RTEMS_Unlock_allocator>
4000b55c: 01 00 00 00 nop
_Objects_Allocator_unlock();
return 0;
}
4000b560: 81 c7 e0 08 ret
4000b564: 81 e8 00 00 restore
4000b568: 40 00 02 20 call 4000bde8 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
4000b56c: 01 00 00 00 nop
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
4000b570: 40 00 22 bd call 40014064 <__errno>
4000b574: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
4000b578: 82 10 20 16 mov 0x16, %g1
4000b57c: c2 22 00 00 st %g1, [ %o0 ]
4000b580: 81 c7 e0 08 ret
4000b584: 81 e8 00 00 restore
4000b588: 40 00 02 18 call 4000bde8 <_RTEMS_Unlock_allocator>
4000b58c: b0 10 3f ff mov -1, %i0
rtems_set_errno_and_return_minus_one( EBUSY );
4000b590: 40 00 22 b5 call 40014064 <__errno>
4000b594: 01 00 00 00 nop
4000b598: 82 10 20 10 mov 0x10, %g1 ! 10 <_TLS_Alignment+0xf>
4000b59c: c2 22 00 00 st %g1, [ %o0 ]
4000b5a0: 81 c7 e0 08 ret
4000b5a4: 81 e8 00 00 restore
4000b62c <sem_getvalue>:
int sem_getvalue(
sem_t *__restrict _sem,
int *__restrict sval
)
{
4000b62c: 9d e3 bf a0 save %sp, -96, %sp
Sem_Control *sem;
ISR_Level level;
Thread_queue_Context queue_context;
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
4000b630: 80 a6 20 00 cmp %i0, 0
4000b634: 02 80 00 0f be 4000b670 <sem_getvalue+0x44>
4000b638: 03 17 4d 9f sethi %hi(0x5d367c00), %g1
4000b63c: c4 06 00 00 ld [ %i0 ], %g2
4000b640: 82 10 63 e7 or %g1, 0x3e7, %g1
4000b644: 82 1e 00 01 xor %i0, %g1, %g1
4000b648: 80 a0 40 02 cmp %g1, %g2
4000b64c: 12 80 00 09 bne 4000b670 <sem_getvalue+0x44>
4000b650: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000b654: 91 d0 20 09 ta 9
<== NOT EXECUTED
sem = _Sem_Get( &_sem->_Semaphore );
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_ISR_disable( &queue_context, level );
_Sem_Queue_acquire_critical( sem, &queue_context );
*sval = (int) sem->count;
4000b658: c4 06 20 18 ld [ %i0 + 0x18 ], %g2
<== NOT EXECUTED
4000b65c: c4 26 40 00 st %g2, [ %i1 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000b660: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000b664: 01 00 00 00 nop
_Sem_Queue_release( sem, level, &queue_context );
return 0;
}
4000b668: 81 c7 e0 08 ret
4000b66c: 91 e8 20 00 restore %g0, 0, %o0
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
4000b670: 40 00 22 7d call 40014064 <__errno>
4000b674: b0 10 3f ff mov -1, %i0
4000b678: 82 10 20 16 mov 0x16, %g1
4000b67c: c2 22 00 00 st %g1, [ %o0 ]
4000b680: 81 c7 e0 08 ret
4000b684: 81 e8 00 00 restore
40007970 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
40007970: 9d e3 bf 90 save %sp, -112, %sp
size_t name_len;
Objects_Get_by_name_error error;
sem_t *sem;
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
40007974: f4 27 a0 4c st %i2, [ %fp + 0x4c ]
if ( oflag & O_CREAT ) {
40007978: 80 8e 62 00 btst 0x200, %i1
va_start(arg, oflag);
4000797c: f6 27 a0 50 st %i3, [ %fp + 0x50 ]
40007980: f8 27 a0 54 st %i4, [ %fp + 0x54 ]
if ( oflag & O_CREAT ) {
40007984: 12 80 00 18 bne 400079e4 <sem_open+0x74>
40007988: fa 27 a0 58 st %i5, [ %fp + 0x58 ]
_RTEMS_Lock_allocator();
4000798c: 40 00 04 b8 call 40008c6c <_RTEMS_Lock_allocator>
40007990: 01 00 00 00 nop
const char *name,
size_t *name_length_p,
Objects_Get_by_name_error *error
)
{
return (POSIX_Semaphore_Control *) _Objects_Get_by_name(
40007994: 96 07 bf fc add %fp, -4, %o3
40007998: 94 07 bf f8 add %fp, -8, %o2
4000799c: 92 10 00 18 mov %i0, %o1
400079a0: 11 10 00 68 sethi %hi(0x4001a000), %o0
400079a4: 40 00 0e 65 call 4000b338 <_Objects_Get_by_name>
400079a8: 90 12 22 00 or %o0, 0x200, %o0 ! 4001a200 <_POSIX_Semaphore_Information>
* 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 ( the_semaphore == NULL ) {
400079ac: 80 a2 20 00 cmp %o0, 0
400079b0: 02 80 00 3f be 40007aac <sem_open+0x13c>
400079b4: 01 00 00 00 nop
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
400079b8: b2 0e 6a 00 and %i1, 0xa00, %i1
400079bc: 80 a6 6a 00 cmp %i1, 0xa00
400079c0: 02 80 00 46 be 40007ad8 <sem_open+0x168>
400079c4: 01 00 00 00 nop
_Objects_Allocator_unlock();
rtems_set_errno_and_return_value( EEXIST, SEM_FAILED );
}
the_semaphore->open_count += 1;
400079c8: c2 02 20 30 ld [ %o0 + 0x30 ], %g1
400079cc: 82 00 60 01 inc %g1
400079d0: c2 22 20 30 st %g1, [ %o0 + 0x30 ]
_RTEMS_Unlock_allocator();
400079d4: 40 00 04 ab call 40008c80 <_RTEMS_Unlock_allocator>
400079d8: b0 02 20 10 add %o0, 0x10, %i0
_Objects_Allocator_unlock();
return &the_semaphore->Semaphore;
400079dc: 81 c7 e0 08 ret
400079e0: 81 e8 00 00 restore
va_start(arg, oflag);
400079e4: 82 07 a0 4c add %fp, 0x4c, %g1
_RTEMS_Lock_allocator();
400079e8: 40 00 04 a1 call 40008c6c <_RTEMS_Lock_allocator>
400079ec: c2 27 bf f4 st %g1, [ %fp + -12 ]
400079f0: 3b 10 00 68 sethi %hi(0x4001a000), %i5
400079f4: 96 07 bf fc add %fp, -4, %o3
400079f8: 94 07 bf f8 add %fp, -8, %o2
400079fc: 92 10 00 18 mov %i0, %o1
40007a00: 40 00 0e 4e call 4000b338 <_Objects_Get_by_name>
40007a04: 90 17 62 00 or %i5, 0x200, %o0
if ( the_semaphore == NULL ) {
40007a08: 80 a2 20 00 cmp %o0, 0
40007a0c: 12 bf ff eb bne 400079b8 <sem_open+0x48>
40007a10: c2 07 bf fc ld [ %fp + -4 ], %g1
if ( !( error == OBJECTS_GET_BY_NAME_NO_OBJECT && (oflag & O_CREAT) ) ) {
40007a14: 80 a0 60 02 cmp %g1, 2
40007a18: 12 80 00 25 bne 40007aac <sem_open+0x13c>
40007a1c: 80 a6 e0 00 cmp %i3, 0
if ( value > SEM_VALUE_MAX ) {
40007a20: 06 80 00 36 bl 40007af8 <sem_open+0x188>
40007a24: d2 07 bf f8 ld [ %fp + -8 ], %o1
name = _Workspace_String_duplicate( name_arg, name_len );
40007a28: 40 00 1d 77 call 4000f004 <_Workspace_String_duplicate>
40007a2c: 90 10 00 18 mov %i0, %o0
if ( name == NULL ) {
40007a30: b8 92 20 00 orcc %o0, 0, %i4
40007a34: 02 80 00 36 be 40007b0c <sem_open+0x19c>
<== NEVER TAKEN
40007a38: 01 00 00 00 nop
return (POSIX_Semaphore_Control *)
40007a3c: 40 00 0c 71 call 4000ac00 <_Objects_Allocate_unprotected>
40007a40: 90 17 62 00 or %i5, 0x200, %o0
if ( the_semaphore == NULL ) {
40007a44: 80 a2 20 00 cmp %o0, 0
40007a48: 02 80 00 36 be 40007b20 <sem_open+0x1b0>
<== NEVER TAKEN
40007a4c: 82 10 20 01 mov 1, %g1
information->local_table[ index ] = the_object;
40007a50: c4 12 20 0a lduh [ %o0 + 0xa ], %g2
the_semaphore->open_count = 1;
40007a54: c2 22 20 30 st %g1, [ %o0 + 0x30 ]
_POSIX_Semaphore_Initialize( &the_semaphore->Semaphore, name, value );
40007a58: b0 02 20 10 add %o0, 0x10, %i0
the_semaphore->linked = true;
40007a5c: c2 2a 20 2c stb %g1, [ %o0 + 0x2c ]
sem->_flags = (uintptr_t) sem ^ POSIX_SEMAPHORE_MAGIC;
40007a60: 03 17 4d 9f sethi %hi(0x5d367c00), %g1
40007a64: 82 10 63 e7 or %g1, 0x3e7, %g1 ! 5d367fe7 <RAM_END+0x1cf67fe7>
40007a68: 82 1e 00 01 xor %i0, %g1, %g1
const char *_name, unsigned int _count)
{
struct _Semaphore_Control _init =
_SEMAPHORE_NAMED_INITIALIZER(_name, _count);
*_semaphore = _init;
40007a6c: c0 22 20 14 clr [ %o0 + 0x14 ]
40007a70: ba 17 62 00 or %i5, 0x200, %i5
40007a74: c2 22 20 10 st %g1, [ %o0 + 0x10 ]
40007a78: 83 28 a0 02 sll %g2, 2, %g1
40007a7c: c0 22 20 18 clr [ %o0 + 0x18 ]
40007a80: c0 22 20 1c clr [ %o0 + 0x1c ]
40007a84: c0 22 20 20 clr [ %o0 + 0x20 ]
40007a88: f8 22 20 24 st %i4, [ %o0 + 0x24 ]
40007a8c: f6 22 20 28 st %i3, [ %o0 + 0x28 ]
the_object->name.name_p = name;
40007a90: f8 22 20 0c st %i4, [ %o0 + 0xc ]
information->local_table[ index ] = the_object;
40007a94: c4 07 60 1c ld [ %i5 + 0x1c ], %g2
40007a98: d0 20 80 01 st %o0, [ %g2 + %g1 ]
_RTEMS_Unlock_allocator();
40007a9c: 40 00 04 79 call 40008c80 <_RTEMS_Unlock_allocator>
40007aa0: 01 00 00 00 nop
value
);
_Objects_Allocator_unlock();
return sem;
}
40007aa4: 81 c7 e0 08 ret
40007aa8: 81 e8 00 00 restore
40007aac: 40 00 04 75 call 40008c80 <_RTEMS_Unlock_allocator>
40007ab0: b0 10 20 00 clr %i0
rtems_set_errno_and_return_value(
40007ab4: 40 00 27 83 call 400118c0 <__errno>
40007ab8: fa 07 bf fc ld [ %fp + -4 ], %i5
40007abc: bb 2f 60 02 sll %i5, 2, %i5
40007ac0: 03 10 00 4f sethi %hi(0x40013c00), %g1
40007ac4: 82 10 61 d0 or %g1, 0x1d0, %g1 ! 40013dd0 <_POSIX_Get_by_name_error_table>
40007ac8: c2 00 40 1d ld [ %g1 + %i5 ], %g1
40007acc: c2 22 00 00 st %g1, [ %o0 ]
40007ad0: 81 c7 e0 08 ret
40007ad4: 81 e8 00 00 restore
40007ad8: 40 00 04 6a call 40008c80 <_RTEMS_Unlock_allocator>
40007adc: b0 10 20 00 clr %i0
rtems_set_errno_and_return_value( EEXIST, SEM_FAILED );
40007ae0: 40 00 27 78 call 400118c0 <__errno>
40007ae4: 01 00 00 00 nop
40007ae8: 82 10 20 11 mov 0x11, %g1 ! 11 <_TLS_Alignment+0x10>
40007aec: c2 22 00 00 st %g1, [ %o0 ]
40007af0: 81 c7 e0 08 ret
40007af4: 81 e8 00 00 restore
rtems_set_errno_and_return_value( EINVAL, SEM_FAILED );
40007af8: 40 00 27 72 call 400118c0 <__errno>
40007afc: b0 10 20 00 clr %i0
40007b00: 82 10 20 16 mov 0x16, %g1
40007b04: 10 bf ff e6 b 40007a9c <sem_open+0x12c>
40007b08: c2 22 00 00 st %g1, [ %o0 ]
rtems_set_errno_and_return_value( ENOMEM, SEM_FAILED );
40007b0c: 40 00 27 6d call 400118c0 <__errno>
<== NOT EXECUTED
40007b10: b0 10 20 00 clr %i0
<== NOT EXECUTED
40007b14: 82 10 20 0c mov 0xc, %g1
<== NOT EXECUTED
40007b18: 10 bf ff e1 b 40007a9c <sem_open+0x12c>
<== NOT EXECUTED
40007b1c: c2 22 00 00 st %g1, [ %o0 ]
<== NOT EXECUTED
_Workspace_Free( name );
40007b20: 40 00 1d 24 call 4000efb0 <_Workspace_Free>
<== NOT EXECUTED
40007b24: 90 10 00 1c mov %i4, %o0
<== NOT EXECUTED
rtems_set_errno_and_return_value( ENOSPC, SEM_FAILED );
40007b28: 40 00 27 66 call 400118c0 <__errno>
<== NOT EXECUTED
40007b2c: b0 10 20 00 clr %i0
<== NOT EXECUTED
40007b30: 82 10 20 1c mov 0x1c, %g1
<== NOT EXECUTED
40007b34: 10 bf ff da b 40007a9c <sem_open+0x12c>
<== NOT EXECUTED
40007b38: c2 22 00 00 st %g1, [ %o0 ]
<== NOT EXECUTED
40007e60 <sem_post>:
#include <rtems/posix/semaphoreimpl.h>
#include <limits.h>
int sem_post( sem_t *_sem )
{
40007e60: 9d e3 bf 78 save %sp, -136, %sp
ISR_Level level;
Thread_queue_Context queue_context;
Thread_queue_Heads *heads;
unsigned int count;
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
40007e64: 80 a6 20 00 cmp %i0, 0
40007e68: 02 80 00 27 be 40007f04 <sem_post+0xa4>
40007e6c: 03 17 4d 9f sethi %hi(0x5d367c00), %g1
40007e70: c4 06 00 00 ld [ %i0 ], %g2
40007e74: 82 10 63 e7 or %g1, 0x3e7, %g1
40007e78: 82 1e 00 01 xor %i0, %g1, %g1
40007e7c: 80 a0 40 02 cmp %g1, %g2
40007e80: 12 80 00 21 bne 40007f04 <sem_post+0xa4>
40007e84: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007e88: 91 d0 20 09 ta 9
<== NOT EXECUTED
return psr;
40007e8c: 88 10 00 01 mov %g1, %g4
sem = _Sem_Get( &_sem->_Semaphore );
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_ISR_disable( &queue_context, level );
_Sem_Queue_acquire_critical( sem, &queue_context );
heads = sem->Queue.Queue.heads;
40007e90: d0 06 20 0c ld [ %i0 + 0xc ], %o0
count = sem->count;
if ( __predict_true( heads == NULL && count < SEM_VALUE_MAX ) ) {
40007e94: 80 a2 20 00 cmp %o0, 0
40007e98: 12 80 00 0d bne 40007ecc <sem_post+0x6c>
40007e9c: c4 06 20 18 ld [ %i0 + 0x18 ], %g2
40007ea0: 07 1f ff ff sethi %hi(0x7ffffc00), %g3
40007ea4: 86 10 e3 fe or %g3, 0x3fe, %g3 ! 7ffffffe <RAM_END+0x3fbffffe>
40007ea8: 80 a0 c0 02 cmp %g3, %g2
40007eac: 0a 80 00 07 bcs 40007ec8 <sem_post+0x68>
40007eb0: 84 00 a0 01 inc %g2
sem->count = count + 1;
40007eb4: c4 26 20 18 st %g2, [ %i0 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007eb8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007ebc: 01 00 00 00 nop
_Sem_Queue_release( sem, level, &queue_context );
return 0;
40007ec0: 81 c7 e0 08 ret
40007ec4: 91 e8 20 00 restore %g0, 0, %o0
}
if ( __predict_true( heads != NULL ) ) {
40007ec8: 80 a2 20 00 cmp %o0, 0
40007ecc: 02 80 00 14 be 40007f1c <sem_post+0xbc>
40007ed0: 3b 10 00 55 sethi %hi(0x40015400), %i5
const Thread_queue_Operations *operations;
Thread_Control *first;
_Thread_queue_Context_set_ISR_level( &queue_context, level );
operations = SEMAPHORE_TQ_OPERATIONS;
first = ( *operations->first )( heads );
40007ed4: ba 17 62 e8 or %i5, 0x2e8, %i5 ! 400156e8 <_Thread_queue_Operations_priority>
40007ed8: c2 07 60 10 ld [ %i5 + 0x10 ], %g1
40007edc: 9f c0 40 00 call %g1
40007ee0: c8 27 bf dc st %g4, [ %fp + -36 ]
_Thread_queue_Extract_critical(
40007ee4: 96 07 bf dc add %fp, -36, %o3
40007ee8: 94 10 00 08 mov %o0, %o2
40007eec: 92 10 00 1d mov %i5, %o1
40007ef0: 90 06 20 0c add %i0, 0xc, %o0
40007ef4: 40 00 12 bb call 4000c9e0 <_Thread_queue_Extract_critical>
40007ef8: b0 10 20 00 clr %i0
&sem->Queue.Queue,
operations,
first,
&queue_context
);
return 0;
40007efc: 81 c7 e0 08 ret
40007f00: 81 e8 00 00 restore
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
40007f04: 40 00 22 cd call 40010a38 <__errno>
40007f08: b0 10 3f ff mov -1, %i0
40007f0c: 82 10 20 16 mov 0x16, %g1
40007f10: c2 22 00 00 st %g1, [ %o0 ]
40007f14: 81 c7 e0 08 ret
40007f18: 81 e8 00 00 restore
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007f1c: 82 10 00 04 mov %g4, %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007f20: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007f24: 01 00 00 00 nop
}
_Sem_Queue_release( sem, level, &queue_context );
rtems_set_errno_and_return_minus_one( EOVERFLOW );
40007f28: 40 00 22 c4 call 40010a38 <__errno>
40007f2c: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
40007f30: 82 10 20 8b mov 0x8b, %g1
40007f34: c2 22 00 00 st %g1, [ %o0 ]
}
40007f38: 81 c7 e0 08 ret
40007f3c: 81 e8 00 00 restore
40009080 <sem_timedwait>:
int sem_timedwait(
sem_t *__restrict _sem,
const struct timespec *__restrict abstime
)
{
40009080: 9d e3 bf 78 save %sp, -136, %sp
Thread_queue_Context queue_context;
ISR_Level level;
Thread_Control *executing;
unsigned int count;
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
40009084: 80 a6 20 00 cmp %i0, 0
40009088: 02 80 00 2a be 40009130 <sem_timedwait+0xb0>
4000908c: 03 17 4d 9f sethi %hi(0x5d367c00), %g1
40009090: c4 06 00 00 ld [ %i0 ], %g2
40009094: 82 10 63 e7 or %g1, 0x3e7, %g1
40009098: 82 1e 00 01 xor %i0, %g1, %g1
4000909c: 80 a0 40 02 cmp %g1, %g2
400090a0: 12 80 00 24 bne 40009130 <sem_timedwait+0xb0>
400090a4: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400090a8: 91 d0 20 09 ta 9
<== NOT EXECUTED
return psr;
400090ac: 86 10 00 01 mov %g1, %g3
sem = _Sem_Get( &_sem->_Semaphore );
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_ISR_disable( &queue_context, level );
executing = _Sem_Queue_acquire_critical( sem, &queue_context );
count = sem->count;
400090b0: c4 06 20 18 ld [ %i0 + 0x18 ], %g2
if ( __predict_true( count > 0 ) ) {
400090b4: 80 a0 a0 00 cmp %g2, 0
400090b8: 02 80 00 07 be 400090d4 <sem_timedwait+0x54>
400090bc: 84 00 bf ff add %g2, -1, %g2
sem->count = count - 1;
400090c0: c4 26 20 18 st %g2, [ %i0 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400090c4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400090c8: 01 00 00 00 nop
_Sem_Queue_release( sem, level, &queue_context );
return 0;
400090cc: 81 c7 e0 08 ret
400090d0: 91 e8 20 00 restore %g0, 0, %o0
queue_context->thread_state = thread_state;
400090d4: 82 10 20 02 mov 2, %g1
Thread_queue_Context *queue_context
)
{
Thread_Control *executing;
executing = _Thread_Executing;
400090d8: fa 01 a0 20 ld [ %g6 + 0x20 ], %i5
400090dc: c2 27 bf e0 st %g1, [ %fp + -32 ]
queue_context->enqueue_callout = _Thread_queue_Add_timeout_realtime_timespec;
400090e0: 03 10 00 3c sethi %hi(0x4000f000), %g1
400090e4: 82 10 60 14 or %g1, 0x14, %g1 ! 4000f014 <_Thread_queue_Add_timeout_realtime_timespec>
_Thread_queue_Context_set_enqueue_timeout_realtime_timespec(
&queue_context,
abstime
);
_Thread_queue_Context_set_ISR_level( &queue_context, level );
_Thread_queue_Enqueue(
400090e8: 94 10 00 1d mov %i5, %o2
400090ec: 90 06 20 0c add %i0, 0xc, %o0
queue_context->Timeout.arg = abstime;
400090f0: f2 27 bf e8 st %i1, [ %fp + -24 ]
400090f4: 96 07 bf dc add %fp, -36, %o3
400090f8: c6 27 bf dc st %g3, [ %fp + -36 ]
400090fc: 13 10 00 52 sethi %hi(0x40014800), %o1
queue_context->enqueue_callout = _Thread_queue_Add_timeout_realtime_timespec;
40009100: c2 27 bf e4 st %g1, [ %fp + -28 ]
40009104: 40 00 13 b9 call 4000dfe8 <_Thread_queue_Enqueue>
40009108: 92 12 61 40 or %o1, 0x140, %o1
4000910c: fa 07 60 4c ld [ %i5 + 0x4c ], %i5
if ( status == STATUS_SUCCESSFUL ) {
40009110: 80 a7 60 00 cmp %i5, 0
40009114: 02 80 00 0b be 40009140 <sem_timedwait+0xc0>
<== NEVER TAKEN
40009118: b0 10 20 00 clr %i0
rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) );
4000911c: 40 00 24 99 call 40012380 <__errno>
40009120: bb 3f 60 08 sra %i5, 8, %i5
40009124: fa 22 00 00 st %i5, [ %o0 ]
&queue_context
);
status = _Thread_Wait_get_status( executing );
return _POSIX_Zero_or_minus_one_plus_errno( status );
}
}
40009128: 81 c7 e0 08 ret
4000912c: 91 e8 3f ff restore %g0, -1, %o0
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
40009130: 40 00 24 94 call 40012380 <__errno>
40009134: b0 10 3f ff mov -1, %i0
40009138: 82 10 20 16 mov 0x16, %g1
4000913c: c2 22 00 00 st %g1, [ %o0 ]
40009140: 81 c7 e0 08 ret
40009144: 81 e8 00 00 restore
4000ba58 <sem_trywait>:
#endif
#include <rtems/posix/semaphoreimpl.h>
int sem_trywait( sem_t *_sem )
{
4000ba58: 9d e3 bf a0 save %sp, -96, %sp
Sem_Control *sem;
Thread_queue_Context queue_context;
ISR_Level level;
unsigned int count;
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
4000ba5c: 80 a6 20 00 cmp %i0, 0
4000ba60: 02 80 00 1a be 4000bac8 <sem_trywait+0x70>
4000ba64: 03 17 4d 9f sethi %hi(0x5d367c00), %g1
4000ba68: c4 06 00 00 ld [ %i0 ], %g2
4000ba6c: 82 10 63 e7 or %g1, 0x3e7, %g1
4000ba70: 82 1e 00 01 xor %i0, %g1, %g1
4000ba74: 80 a0 40 02 cmp %g1, %g2
4000ba78: 12 80 00 14 bne 4000bac8 <sem_trywait+0x70>
4000ba7c: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
4000ba80: 91 d0 20 09 ta 9
<== NOT EXECUTED
sem = _Sem_Get( &_sem->_Semaphore );
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_ISR_disable( &queue_context, level );
_Sem_Queue_acquire_critical( sem, &queue_context );
count = sem->count;
4000ba84: c4 06 20 18 ld [ %i0 + 0x18 ], %g2
if ( __predict_true( count > 0 ) ) {
4000ba88: 80 a0 a0 00 cmp %g2, 0
4000ba8c: 02 80 00 07 be 4000baa8 <sem_trywait+0x50>
4000ba90: 84 00 bf ff add %g2, -1, %g2
sem->count = count - 1;
4000ba94: c4 26 20 18 st %g2, [ %i0 + 0x18 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000ba98: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000ba9c: 01 00 00 00 nop
_Sem_Queue_release( sem, level, &queue_context );
return 0;
4000baa0: 81 c7 e0 08 ret
4000baa4: 91 e8 20 00 restore %g0, 0, %o0
4000baa8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000baac: 01 00 00 00 nop
} else {
_Sem_Queue_release( sem, level, &queue_context );
rtems_set_errno_and_return_minus_one( EAGAIN );
4000bab0: 40 00 21 6d call 40014064 <__errno>
4000bab4: b0 10 3f ff mov -1, %i0 ! ffffffff <RAM_END+0xbfbfffff>
4000bab8: 82 10 20 0b mov 0xb, %g1
4000babc: c2 22 00 00 st %g1, [ %o0 ]
}
}
4000bac0: 81 c7 e0 08 ret
4000bac4: 81 e8 00 00 restore
POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem );
4000bac8: 40 00 21 67 call 40014064 <__errno>
4000bacc: b0 10 3f ff mov -1, %i0
4000bad0: 82 10 20 16 mov 0x16, %g1
4000bad4: c2 22 00 00 st %g1, [ %o0 ]
4000bad8: 81 c7 e0 08 ret
4000badc: 81 e8 00 00 restore
40007b08 <shm_open>:
}
return 0;
}
int shm_open( const char *name, int oflag, mode_t mode )
{
40007b08: 9d e3 bf 88 save %sp, -120, %sp
if ( ( oflag & O_ACCMODE ) != O_RDONLY && ( oflag & O_ACCMODE ) != O_RDWR ) {
40007b0c: 82 0e 60 03 and %i1, 3, %g1
40007b10: 82 18 60 02 xor %g1, 2, %g1
40007b14: 80 a0 00 01 cmp %g0, %g1
40007b18: 82 40 20 00 addx %g0, 0, %g1
40007b1c: 80 8e 60 01 btst 1, %i1
40007b20: 12 80 00 9d bne 40007d94 <shm_open+0x28c>
<== NEVER TAKEN
40007b24: 80 8e 71 fd btst -3587, %i1
if ( ( oflag & ~( O_RDONLY | O_RDWR | O_CREAT | O_EXCL | O_TRUNC ) ) != 0 ) {
40007b28: 12 80 00 9b bne 40007d94 <shm_open+0x28c>
<== NEVER TAKEN
40007b2c: a0 8e 64 00 andcc %i1, 0x400, %l0
if ( ( oflag & O_TRUNC ) != 0 && ( oflag & O_ACCMODE ) != O_RDWR ) {
40007b30: 02 80 00 04 be 40007b40 <shm_open+0x38>
<== ALWAYS TAKEN
40007b34: 80 a0 60 00 cmp %g1, 0
40007b38: 12 80 00 97 bne 40007d94 <shm_open+0x28c>
<== NOT EXECUTED
40007b3c: 01 00 00 00 nop
<== NOT EXECUTED
if ( shm_check_oflag( oflag ) != 0 ) {
return -1;
}
iop = rtems_libio_allocate();
40007b40: 7f ff f6 3a call 40005428 <rtems_libio_allocate>
40007b44: 01 00 00 00 nop
if ( iop == NULL ) {
40007b48: ba 92 20 00 orcc %o0, 0, %i5
40007b4c: 02 80 00 9c be 40007dbc <shm_open+0x2b4>
<== NEVER TAKEN
40007b50: 01 00 00 00 nop
_RTEMS_Lock_allocator();
40007b54: 40 00 01 8b call 40008180 <_RTEMS_Lock_allocator>
40007b58: 37 10 00 7d sethi %hi(0x4001f400), %i3
return (POSIX_Shm_Control *) _Objects_Get_by_name(
40007b5c: 96 07 bf ec add %fp, -20, %o3
40007b60: 94 07 bf e8 add %fp, -24, %o2
40007b64: 92 10 00 18 mov %i0, %o1
40007b68: 40 00 0a 53 call 4000a4b4 <_Objects_Get_by_name>
40007b6c: 90 16 e0 34 or %i3, 0x34, %o0
}
_Objects_Allocator_lock();
shm = _POSIX_Shm_Get_by_name( name, &len, &obj_err );
if ( shm == NULL ) {
40007b70: b8 92 20 00 orcc %o0, 0, %i4
40007b74: 02 80 00 20 be 40007bf4 <shm_open+0xec>
<== ALWAYS TAKEN
40007b78: c2 07 bf ec ld [ %fp + -20 ], %g1
default:
shm = shm_allocate(name, len, oflag, mode, &err);
break;
}
} else { /* shm exists */
if ( ( oflag & ( O_EXCL | O_CREAT ) ) == ( O_EXCL | O_CREAT ) ) {
40007b7c: b2 0e 6a 00 and %i1, 0xa00, %i1
<== NOT EXECUTED
40007b80: 80 a6 6a 00 cmp %i1, 0xa00
<== NOT EXECUTED
40007b84: 32 80 00 0c bne,a 40007bb4 <shm_open+0xac>
<== NOT EXECUTED
40007b88: d6 17 20 2e lduh [ %i4 + 0x2e ], %o3
<== NOT EXECUTED
_RTEMS_Unlock_allocator();
40007b8c: 40 00 01 82 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007b90: b8 10 20 11 mov 0x11, %i4
<== NOT EXECUTED
++shm->reference_count;
}
}
_Objects_Allocator_unlock();
if ( err != 0 ) {
rtems_libio_free( iop );
40007b94: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
40007b98: 7f ff f6 39 call 4000547c <rtems_libio_free>
<== NOT EXECUTED
40007b9c: b0 10 3f ff mov -1, %i0
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( err );
40007ba0: 40 00 22 2e call 40010458 <__errno>
<== NOT EXECUTED
40007ba4: 01 00 00 00 nop
<== NOT EXECUTED
40007ba8: f8 22 00 00 st %i4, [ %o0 ]
<== NOT EXECUTED
40007bac: 81 c7 e0 08 ret
<== NOT EXECUTED
40007bb0: 81 e8 00 00 restore
<== NOT EXECUTED
return rtems_filesystem_check_access( flags, shm->mode, shm->uid, shm->gid );
40007bb4: d4 17 20 2c lduh [ %i4 + 0x2c ], %o2
<== NOT EXECUTED
40007bb8: d2 07 20 30 ld [ %i4 + 0x30 ], %o1
<== NOT EXECUTED
40007bbc: 7f ff f8 f3 call 40005f88 <rtems_filesystem_check_access>
<== NOT EXECUTED
40007bc0: 90 10 20 02 mov 2, %o0
<== NOT EXECUTED
} else if ( !shm_access_ok( shm, oflag ) ) {
40007bc4: 80 a2 20 00 cmp %o0, 0
<== NOT EXECUTED
40007bc8: 32 80 00 5f bne,a 40007d44 <shm_open+0x23c>
<== NOT EXECUTED
40007bcc: c2 07 20 1c ld [ %i4 + 0x1c ], %g1
<== NOT EXECUTED
40007bd0: 40 00 01 71 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007bd4: b8 10 20 0d mov 0xd, %i4
<== NOT EXECUTED
rtems_libio_free( iop );
40007bd8: 7f ff f6 29 call 4000547c <rtems_libio_free>
<== NOT EXECUTED
40007bdc: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( err );
40007be0: 40 00 22 1e call 40010458 <__errno>
<== NOT EXECUTED
40007be4: b0 10 3f ff mov -1, %i0
<== NOT EXECUTED
40007be8: f8 22 00 00 st %i4, [ %o0 ]
<== NOT EXECUTED
40007bec: 81 c7 e0 08 ret
<== NOT EXECUTED
40007bf0: 81 e8 00 00 restore
<== NOT EXECUTED
switch ( obj_err ) {
40007bf4: 80 a0 60 00 cmp %g1, 0
40007bf8: 02 80 00 5f be 40007d74 <shm_open+0x26c>
<== NEVER TAKEN
40007bfc: 80 a0 60 01 cmp %g1, 1
40007c00: 02 80 00 61 be 40007d84 <shm_open+0x27c>
<== NEVER TAKEN
40007c04: 01 00 00 00 nop
if ( name_arg[0] != '/' ) {
40007c08: c2 4e 00 00 ldsb [ %i0 ], %g1
40007c0c: 80 a0 60 2f cmp %g1, 0x2f
40007c10: 12 80 00 59 bne 40007d74 <shm_open+0x26c>
<== NEVER TAKEN
40007c14: 80 8e 62 00 btst 0x200, %i1
if ( ( oflag & O_CREAT ) != O_CREAT ) {
40007c18: 02 80 00 65 be 40007dac <shm_open+0x2a4>
<== NEVER TAKEN
40007c1c: d2 07 bf e8 ld [ %fp + -24 ], %o1
name = _Workspace_String_duplicate( name_arg, name_len );
40007c20: 40 00 17 1a call 4000d888 <_Workspace_String_duplicate>
40007c24: 90 10 00 18 mov %i0, %o0
if ( name == NULL ) {
40007c28: b0 92 20 00 orcc %o0, 0, %i0
40007c2c: 02 80 00 6a be 40007dd4 <shm_open+0x2cc>
<== NEVER TAKEN
40007c30: 01 00 00 00 nop
return (POSIX_Shm_Control *)
40007c34: 40 00 08 99 call 40009e98 <_Objects_Allocate_unprotected>
40007c38: 90 16 e0 34 or %i3, 0x34, %o0
if ( shm == NULL ) {
40007c3c: b8 92 20 00 orcc %o0, 0, %i4
40007c40: 02 80 00 69 be 40007de4 <shm_open+0x2dc>
<== NEVER TAKEN
40007c44: 92 10 20 00 clr %o1
gettimeofday( &tv, 0 );
40007c48: 7f ff f5 9b call 400052b4 <gettimeofday>
40007c4c: 90 07 bf f0 add %fp, -16, %o0
shm->reference_count = 1;
40007c50: 82 10 20 01 mov 1, %g1
shm->shm_object.handle = NULL;
40007c54: c0 27 20 20 clr [ %i4 + 0x20 ]
information->local_table[ index ] = the_object;
40007c58: b6 16 e0 34 or %i3, 0x34, %i3
shm->reference_count = 1;
40007c5c: c2 27 20 1c st %g1, [ %i4 + 0x1c ]
shm->shm_object.ops = &_POSIX_Shm_Object_operations;
40007c60: 03 10 00 6a sethi %hi(0x4001a800), %g1
shm->shm_object.size = 0;
40007c64: c0 27 20 24 clr [ %i4 + 0x24 ]
shm->shm_object.ops = &_POSIX_Shm_Object_operations;
40007c68: 82 10 60 4c or %g1, 0x4c, %g1
shm->mode = mode & ~rtems_filesystem_umask;
40007c6c: 7f ff f8 a4 call 40005efc <rtems_current_user_env_get>
40007c70: c2 27 20 28 st %g1, [ %i4 + 0x28 ]
40007c74: c2 02 20 08 ld [ %o0 + 8 ], %g1
40007c78: b4 2e 80 01 andn %i2, %g1, %i2
shm->oflag = oflag;
40007c7c: f2 27 20 34 st %i1, [ %i4 + 0x34 ]
shm->uid = geteuid();
40007c80: 7f ff f5 85 call 40005294 <geteuid>
40007c84: f4 27 20 30 st %i2, [ %i4 + 0x30 ]
shm->gid = getegid();
40007c88: 7f ff f5 7d call 4000527c <getegid>
40007c8c: d0 37 20 2c sth %o0, [ %i4 + 0x2c ]
shm->atime = (time_t) tv.tv_sec;
40007c90: c4 1f bf f0 ldd [ %fp + -16 ], %g2
40007c94: c2 17 20 0a lduh [ %i4 + 0xa ], %g1
40007c98: c4 3f 20 38 std %g2, [ %i4 + 0x38 ]
40007c9c: 83 28 60 02 sll %g1, 2, %g1
shm->mtime = (time_t) tv.tv_sec;
40007ca0: c4 3f 20 40 std %g2, [ %i4 + 0x40 ]
shm->ctime = (time_t) tv.tv_sec;
40007ca4: c4 3f 20 48 std %g2, [ %i4 + 0x48 ]
shm->gid = getegid();
40007ca8: d0 37 20 2e sth %o0, [ %i4 + 0x2e ]
the_object->name.name_p = name;
40007cac: f0 27 20 0c st %i0, [ %i4 + 0xc ]
information->local_table[ index ] = the_object;
40007cb0: c4 06 e0 1c ld [ %i3 + 0x1c ], %g2
_RTEMS_Unlock_allocator();
40007cb4: 40 00 01 38 call 40008194 <_RTEMS_Unlock_allocator>
40007cb8: f8 20 80 01 st %i4, [ %g2 + %g1 ]
}
if ( oflag & O_TRUNC ) {
40007cbc: 80 a4 20 00 cmp %l0, 0
40007cc0: 12 80 00 28 bne 40007d60 <shm_open+0x258>
<== NEVER TAKEN
40007cc4: 92 10 20 00 clr %o1
<== NOT EXECUTED
err = shm_ftruncate( iop, 0 );
(void) err; /* ignore truncate error */
}
fd = rtems_libio_iop_to_descriptor( iop );
40007cc8: 03 2a aa aa sethi %hi(0xaaaaa800), %g1
<== NOT EXECUTED
40007ccc: 82 10 62 ab or %g1, 0x2ab, %g1 ! aaaaaaab <RAM_END+0x6a6aaaab>
<== NOT EXECUTED
40007cd0: 31 10 00 77 sethi %hi(0x4001dc00), %i0
<== NOT EXECUTED
40007cd4: b0 16 23 10 or %i0, 0x310, %i0 ! 4001df10 <rtems_libio_iops>
<== NOT EXECUTED
40007cd8: b0 27 40 18 sub %i5, %i0, %i0
<== NOT EXECUTED
40007cdc: b1 3e 20 04 sra %i0, 4, %i0
<== NOT EXECUTED
40007ce0: b0 5e 00 01 smul %i0, %g1, %i0
<== NOT EXECUTED
iop->data0 = fd;
iop->data1 = shm;
iop->pathinfo.node_access = shm;
iop->pathinfo.handlers = &shm_handlers;
40007ce4: 03 10 00 6b sethi %hi(0x4001ac00), %g1
<== NOT EXECUTED
40007ce8: 82 10 62 a8 or %g1, 0x2a8, %g1 ! 4001aea8 <shm_handlers>
<== NOT EXECUTED
iop->data0 = fd;
40007cec: f0 27 60 24 st %i0, [ %i5 + 0x24 ]
<== NOT EXECUTED
iop->pathinfo.handlers = &shm_handlers;
40007cf0: c2 27 60 1c st %g1, [ %i5 + 0x1c ]
<== NOT EXECUTED
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
40007cf4: 03 10 00 72 sethi %hi(0x4001c800), %g1
<== NOT EXECUTED
iop->data1 = shm;
40007cf8: f8 27 60 28 st %i4, [ %i5 + 0x28 ]
<== NOT EXECUTED
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
40007cfc: 82 10 62 64 or %g1, 0x264, %g1
<== NOT EXECUTED
iop->pathinfo.node_access = shm;
40007d00: f8 27 60 14 st %i4, [ %i5 + 0x14 ]
<== NOT EXECUTED
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
40007d04: c2 27 60 20 st %g1, [ %i5 + 0x20 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007d08: 91 d0 20 09 ta 9
<== NOT EXECUTED
&loc->mt_entry->location_chain,
40007d0c: c4 07 60 20 ld [ %i5 + 0x20 ], %g2
<== NOT EXECUTED
old_last = tail->previous;
40007d10: c6 00 a0 1c ld [ %g2 + 0x1c ], %g3
<== NOT EXECUTED
return &the_chain->Tail.Node;
40007d14: 88 00 a0 18 add %g2, 0x18, %g4
<== NOT EXECUTED
the_node->next = tail;
40007d18: c8 27 60 0c st %g4, [ %i5 + 0xc ]
<== NOT EXECUTED
rtems_chain_append_unprotected(
40007d1c: 88 07 60 0c add %i5, 0xc, %g4
<== NOT EXECUTED
tail->previous = the_node;
40007d20: c8 20 a0 1c st %g4, [ %g2 + 0x1c ]
<== NOT EXECUTED
old_last->next = the_node;
40007d24: c8 20 c0 00 st %g4, [ %g3 ]
<== NOT EXECUTED
the_node->previous = old_last;
40007d28: c6 27 60 10 st %g3, [ %i5 + 0x10 ]
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007d2c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007d30: 01 00 00 00 nop
*obj = desired;
40007d34: 82 10 29 06 mov 0x906, %g1 ! 906 <SPARC_THREAD_CONTROL_FP_CONTEXT_OFFSET+0x7b6>
40007d38: c2 27 60 08 st %g1, [ %i5 + 8 ]
}
rtems_libio_iop_flags_initialize( iop, flags );
return fd;
}
40007d3c: 81 c7 e0 08 ret
40007d40: 81 e8 00 00 restore
++shm->reference_count;
40007d44: 82 00 60 01 inc %g1
<== NOT EXECUTED
40007d48: 40 00 01 13 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007d4c: c2 27 20 1c st %g1, [ %i4 + 0x1c ]
<== NOT EXECUTED
if ( oflag & O_TRUNC ) {
40007d50: 80 a4 20 00 cmp %l0, 0
<== NOT EXECUTED
40007d54: 22 bf ff de be,a 40007ccc <shm_open+0x1c4>
<== NOT EXECUTED
40007d58: 03 2a aa aa sethi %hi(0xaaaaa800), %g1
<== NOT EXECUTED
err = shm_ftruncate( iop, 0 );
40007d5c: 92 10 20 00 clr %o1
<== NOT EXECUTED
40007d60: 94 10 20 00 clr %o2
<== NOT EXECUTED
40007d64: 7f ff ff 11 call 400079a8 <shm_ftruncate>
<== NOT EXECUTED
40007d68: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
fd = rtems_libio_iop_to_descriptor( iop );
40007d6c: 10 bf ff d8 b 40007ccc <shm_open+0x1c4>
<== NOT EXECUTED
40007d70: 03 2a aa aa sethi %hi(0xaaaaa800), %g1
<== NOT EXECUTED
40007d74: 40 00 01 08 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007d78: b8 10 20 16 mov 0x16, %i4
<== NOT EXECUTED
rtems_libio_free( iop );
40007d7c: 10 bf ff 87 b 40007b98 <shm_open+0x90>
<== NOT EXECUTED
40007d80: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
40007d84: 40 00 01 04 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007d88: b8 10 20 5b mov 0x5b, %i4
<== NOT EXECUTED
40007d8c: 10 bf ff 83 b 40007b98 <shm_open+0x90>
<== NOT EXECUTED
40007d90: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EACCES );
40007d94: 40 00 21 b1 call 40010458 <__errno>
<== NOT EXECUTED
40007d98: b0 10 3f ff mov -1, %i0
<== NOT EXECUTED
40007d9c: 82 10 20 0d mov 0xd, %g1
<== NOT EXECUTED
40007da0: c2 22 00 00 st %g1, [ %o0 ]
<== NOT EXECUTED
40007da4: 81 c7 e0 08 ret
<== NOT EXECUTED
40007da8: 81 e8 00 00 restore
<== NOT EXECUTED
40007dac: 40 00 00 fa call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007db0: b8 10 20 02 mov 2, %i4
<== NOT EXECUTED
rtems_libio_free( iop );
40007db4: 10 bf ff 79 b 40007b98 <shm_open+0x90>
<== NOT EXECUTED
40007db8: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EMFILE );
40007dbc: 40 00 21 a7 call 40010458 <__errno>
<== NOT EXECUTED
40007dc0: b0 10 3f ff mov -1, %i0
<== NOT EXECUTED
40007dc4: 82 10 20 18 mov 0x18, %g1
<== NOT EXECUTED
40007dc8: c2 22 00 00 st %g1, [ %o0 ]
<== NOT EXECUTED
40007dcc: 81 c7 e0 08 ret
<== NOT EXECUTED
40007dd0: 81 e8 00 00 restore
<== NOT EXECUTED
40007dd4: 40 00 00 f0 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007dd8: b8 10 20 1c mov 0x1c, %i4
<== NOT EXECUTED
rtems_libio_free( iop );
40007ddc: 10 bf ff 6f b 40007b98 <shm_open+0x90>
<== NOT EXECUTED
40007de0: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
_Workspace_Free( name );
40007de4: 90 10 00 18 mov %i0, %o0
<== NOT EXECUTED
40007de8: 40 00 16 93 call 4000d834 <_Workspace_Free>
<== NOT EXECUTED
40007dec: b8 10 20 17 mov 0x17, %i4
<== NOT EXECUTED
40007df0: 40 00 00 e9 call 40008194 <_RTEMS_Unlock_allocator>
<== NOT EXECUTED
40007df4: 01 00 00 00 nop
<== NOT EXECUTED
rtems_libio_free( iop );
40007df8: 10 bf ff 68 b 40007b98 <shm_open+0x90>
<== NOT EXECUTED
40007dfc: 90 10 00 1d mov %i5, %o0
<== NOT EXECUTED
40007150 <sigaction>:
int sigaction(
int sig,
const struct sigaction *__restrict act,
struct sigaction *__restrict oact
)
{
40007150: 9d e3 bf 98 save %sp, -104, %sp
Thread_queue_Context queue_context;
if ( !sig )
40007154: 80 a6 20 00 cmp %i0, 0
40007158: 02 80 00 43 be 40007264 <sigaction+0x114>
4000715c: 82 06 3f ff add %i0, -1, %g1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
40007160: 80 a0 60 1f cmp %g1, 0x1f
40007164: 18 80 00 40 bgu 40007264 <sigaction+0x114>
40007168: 80 a6 20 09 cmp %i0, 9
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
4000716c: 02 80 00 3e be 40007264 <sigaction+0x114>
40007170: 01 00 00 00 nop
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007174: 91 d0 20 09 ta 9
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_queue_Context_initialize( &queue_context );
_POSIX_signals_Acquire( &queue_context );
if ( oact )
40007178: 80 a6 a0 00 cmp %i2, 0
4000717c: 02 80 00 0d be 400071b0 <sigaction+0x60>
40007180: 85 2e 20 01 sll %i0, 1, %g2
*oact = _POSIX_signals_Vectors[ sig ];
40007184: 07 10 00 74 sethi %hi(0x4001d000), %g3
40007188: 84 00 80 18 add %g2, %i0, %g2
4000718c: 86 10 e3 88 or %g3, 0x388, %g3
40007190: 85 28 a0 02 sll %g2, 2, %g2
40007194: fa 00 c0 02 ld [ %g3 + %g2 ], %i5
40007198: 88 00 c0 02 add %g3, %g2, %g4
4000719c: c6 01 20 04 ld [ %g4 + 4 ], %g3
400071a0: c4 01 20 08 ld [ %g4 + 8 ], %g2
400071a4: fa 26 80 00 st %i5, [ %i2 ]
400071a8: c6 26 a0 04 st %g3, [ %i2 + 4 ]
400071ac: c4 26 a0 08 st %g2, [ %i2 + 8 ]
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
400071b0: 80 a6 60 00 cmp %i1, 0
400071b4: 02 80 00 16 be 4000720c <sigaction+0xbc>
<== NEVER TAKEN
400071b8: 01 00 00 00 nop
/*
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
if ( act->sa_handler == SIG_DFL ) {
400071bc: c4 06 60 08 ld [ %i1 + 8 ], %g2
400071c0: 80 a0 a0 00 cmp %g2, 0
400071c4: 02 80 00 16 be 4000721c <sigaction+0xcc>
400071c8: 85 2e 20 01 sll %i0, 1, %g2
400071cc: c2 27 bf fc st %g1, [ %fp + -4 ]
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
400071d0: 40 00 1e aa call 4000ec78 <_POSIX_signals_Clear_process_signals>
400071d4: 90 10 00 18 mov %i0, %o0
_POSIX_signals_Vectors[ sig ] = *act;
400071d8: 87 2e 20 01 sll %i0, 1, %g3
<== NOT EXECUTED
400071dc: fa 06 40 00 ld [ %i1 ], %i5
<== NOT EXECUTED
400071e0: b0 00 c0 18 add %g3, %i0, %i0
<== NOT EXECUTED
400071e4: 05 10 00 74 sethi %hi(0x4001d000), %g2
<== NOT EXECUTED
400071e8: b1 2e 20 02 sll %i0, 2, %i0
<== NOT EXECUTED
400071ec: 84 10 a3 88 or %g2, 0x388, %g2
<== NOT EXECUTED
400071f0: c8 06 60 04 ld [ %i1 + 4 ], %g4
<== NOT EXECUTED
400071f4: fa 20 80 18 st %i5, [ %g2 + %i0 ]
<== NOT EXECUTED
400071f8: b0 00 80 18 add %g2, %i0, %i0
<== NOT EXECUTED
400071fc: c6 06 60 08 ld [ %i1 + 8 ], %g3
<== NOT EXECUTED
40007200: c8 26 20 04 st %g4, [ %i0 + 4 ]
<== NOT EXECUTED
40007204: c6 26 20 08 st %g3, [ %i0 + 8 ]
<== NOT EXECUTED
40007208: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000720c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007210: 01 00 00 00 nop
}
_POSIX_signals_Release( &queue_context );
return 0;
}
40007214: 81 c7 e0 08 ret
40007218: 91 e8 20 00 restore %g0, 0, %o0
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
4000721c: 07 10 00 66 sethi %hi(0x40019800), %g3
<== NOT EXECUTED
40007220: b0 00 80 18 add %g2, %i0, %i0
<== NOT EXECUTED
40007224: 86 10 e2 a0 or %g3, 0x2a0, %g3
<== NOT EXECUTED
40007228: b1 2e 20 02 sll %i0, 2, %i0
<== NOT EXECUTED
4000722c: fa 00 c0 18 ld [ %g3 + %i0 ], %i5
<== NOT EXECUTED
40007230: 05 10 00 74 sethi %hi(0x4001d000), %g2
<== NOT EXECUTED
40007234: 86 00 c0 18 add %g3, %i0, %g3
<== NOT EXECUTED
40007238: 84 10 a3 88 or %g2, 0x388, %g2
<== NOT EXECUTED
4000723c: c8 00 e0 04 ld [ %g3 + 4 ], %g4
<== NOT EXECUTED
40007240: fa 20 80 18 st %i5, [ %g2 + %i0 ]
<== NOT EXECUTED
40007244: b0 00 80 18 add %g2, %i0, %i0
<== NOT EXECUTED
40007248: c6 00 e0 08 ld [ %g3 + 8 ], %g3
<== NOT EXECUTED
4000724c: c8 26 20 04 st %g4, [ %i0 + 4 ]
<== NOT EXECUTED
40007250: c6 26 20 08 st %g3, [ %i0 + 8 ]
<== NOT EXECUTED
40007254: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40007258: 01 00 00 00 nop
}
4000725c: 81 c7 e0 08 ret
40007260: 91 e8 20 00 restore %g0, 0, %o0
rtems_set_errno_and_return_minus_one( EINVAL );
40007264: 40 00 23 c9 call 40010188 <__errno>
40007268: b0 10 3f ff mov -1, %i0
4000726c: 82 10 20 16 mov 0x16, %g1
40007270: c2 22 00 00 st %g1, [ %o0 ]
40007274: 81 c7 e0 08 ret
40007278: 81 e8 00 00 restore
400073e4 <sigtimedwait>:
int sigtimedwait(
const sigset_t *__restrict set,
siginfo_t *__restrict info,
const struct timespec *__restrict timeout
)
{
400073e4: 9d e3 bf 58 save %sp, -168, %sp
int error;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
400073e8: b8 96 20 00 orcc %i0, 0, %i4
400073ec: 02 80 00 9b be 40007658 <sigtimedwait+0x274>
400073f0: 80 a6 a0 00 cmp %i2, 0
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
if ( timeout != NULL ) {
400073f4: 02 80 00 50 be 40007534 <sigtimedwait+0x150>
400073f8: 03 10 00 2f sethi %hi(0x4000bc00), %g1
const struct timespec *end;
_Timecounter_Nanouptime( &uptime );
400073fc: 40 00 07 bb call 400092e8 <_Timecounter_Nanouptime>
40007400: 90 07 bf c8 add %fp, -56, %o0
&& (unsigned long) ts->tv_nsec < WATCHDOG_NANOSECONDS_PER_SECOND;
40007404: c2 06 a0 08 ld [ %i2 + 8 ], %g1
40007408: 05 0e e6 b2 sethi %hi(0x3b9ac800), %g2
4000740c: 84 10 a1 ff or %g2, 0x1ff, %g2 ! 3b9ac9ff <RAM_SIZE+0x3b5ac9ff>
40007410: 80 a0 40 02 cmp %g1, %g2
40007414: 28 80 00 37 bleu,a 400074f0 <sigtimedwait+0x10c>
40007418: d4 1e 80 00 ldd [ %i2 ], %o2
return NULL;
4000741c: 82 10 20 00 clr %g1
queue_context->Timeout.arg = abstime;
40007420: c2 27 bf e8 st %g1, [ %fp + -24 ]
queue_context->enqueue_callout =
40007424: 03 10 00 32 sethi %hi(0x4000c800), %g1
40007428: 82 10 62 80 or %g1, 0x280, %g1 ! 4000ca80 <_Thread_queue_Add_timeout_monotonic_timespec>
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
4000742c: 80 a6 60 00 cmp %i1, 0
40007430: 02 80 00 45 be 40007544 <sigtimedwait+0x160>
<== NEVER TAKEN
40007434: c2 27 bf e4 st %g1, [ %fp + -28 ]
<== NOT EXECUTED
40007438: fa 01 a0 20 ld [ %g6 + 0x20 ], %i5
<== NOT EXECUTED
executing = _Thread_Get_executing();
api = executing->API_Extensions[ THREAD_API_POSIX ];
4000743c: f6 07 61 5c ld [ %i5 + 0x15c ], %i3
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
40007440: 91 d0 20 09 ta 9
<== NOT EXECUTED
Thread_queue_Control *the_thread_queue,
Thread_queue_Context *queue_context
)
{
(void) the_thread_queue;
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40007444: c2 27 bf dc st %g1, [ %fp + -36 ]
*/
/* API signals pending? */
_POSIX_signals_Acquire( &queue_context );
if ( *set & api->signals_pending ) {
40007448: c2 07 00 00 ld [ %i4 ], %g1
4000744c: d0 06 e0 6c ld [ %i3 + 0x6c ], %o0
40007450: 80 88 40 08 btst %g1, %o0
40007454: 12 80 00 46 bne 4000756c <sigtimedwait+0x188>
40007458: 05 10 00 77 sethi %hi(0x4001dc00), %g2
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
4000745c: d0 00 a0 14 ld [ %g2 + 0x14 ], %o0 ! 4001dc14 <_POSIX_signals_Pending>
40007460: 80 88 40 08 btst %g1, %o0
40007464: 12 80 00 55 bne 400075b8 <sigtimedwait+0x1d4>
40007468: 84 10 3f ff mov -1, %g2
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
4000746c: c4 26 40 00 st %g2, [ %i1 ]
executing->Wait.return_argument = the_info;
_Thread_queue_Context_set_thread_state(
&queue_context,
STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_queue_Enqueue(
40007470: 94 10 00 1d mov %i5, %o2
executing->Wait.option = *set;
40007474: c2 27 60 48 st %g1, [ %i5 + 0x48 ]
queue_context->thread_state = thread_state;
40007478: 03 04 00 01 sethi %hi(0x10000400), %g1
executing->Wait.return_argument = the_info;
4000747c: f2 27 60 40 st %i1, [ %i5 + 0x40 ]
_Thread_queue_Enqueue(
40007480: 96 07 bf dc add %fp, -36, %o3
40007484: c2 27 bf e0 st %g1, [ %fp + -32 ]
40007488: 13 10 00 67 sethi %hi(0x40019c00), %o1
4000748c: 11 10 00 6f sethi %hi(0x4001bc00), %o0
40007490: 92 12 63 24 or %o1, 0x324, %o1
40007494: 40 00 12 0a call 4000bcbc <_Thread_queue_Enqueue>
40007498: 90 12 21 a4 or %o0, 0x1a4, %o0
/*
* When the thread is set free by a signal, it is need to eliminate
* the signal.
*/
_POSIX_signals_Clear_signals(
4000749c: d2 06 40 00 ld [ %i1 ], %o1
400074a0: 9a 10 20 01 mov 1, %o5
400074a4: 98 10 20 00 clr %o4
400074a8: 96 10 20 00 clr %o3
400074ac: 94 10 00 19 mov %i1, %o2
400074b0: 40 00 1f a0 call 4000f330 <_POSIX_signals_Clear_signals>
400074b4: 90 10 00 1b mov %i3, %o0
return _POSIX_Get_by_name_error_table[ error ];
}
RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status )
{
return STATUS_GET_POSIX( status );
400074b8: fa 07 60 4c ld [ %i5 + 0x4c ], %i5
400074bc: bb 3f 60 08 sra %i5, 8, %i5
* was not in our set.
*/
error = _POSIX_Get_error_after_wait( executing );
if (
400074c0: 80 a7 60 04 cmp %i5, 4
400074c4: 12 80 00 5d bne 40007638 <sigtimedwait+0x254>
400074c8: 82 10 20 01 mov 1, %g1
error != EINTR
|| ( *set & signo_to_mask( the_info->si_signo ) ) == 0
400074cc: f0 06 40 00 ld [ %i1 ], %i0
400074d0: c4 07 00 00 ld [ %i4 ], %g2
400074d4: 86 06 3f ff add %i0, -1, %g3
400074d8: 83 28 40 03 sll %g1, %g3, %g1
400074dc: 80 88 40 02 btst %g1, %g2
400074e0: 02 80 00 59 be 40007644 <sigtimedwait+0x260>
400074e4: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( error );
}
return the_info->si_signo;
}
400074e8: 81 c7 e0 08 ret
400074ec: 81 e8 00 00 restore
return _Watchdog_Is_valid_timespec( ts ) && ts->tv_sec >= 0;
400074f0: 80 a2 a0 00 cmp %o2, 0
400074f4: 06 bf ff ca bl 4000741c <sigtimedwait+0x38>
<== NEVER TAKEN
400074f8: c6 07 bf d0 ld [ %fp + -48 ], %g3
sec = (uint64_t) now->tv_sec;
400074fc: f4 1f bf c8 ldd [ %fp + -56 ], %i2
sec += (uint64_t) delta->tv_sec;
40007500: 9a 82 c0 1b addcc %o3, %i3, %o5
40007504: 98 42 80 1a addx %o2, %i2, %o4
now->tv_nsec += delta->tv_nsec;
40007508: 82 00 40 03 add %g1, %g3, %g1
if ( now->tv_nsec >= WATCHDOG_NANOSECONDS_PER_SECOND ) {
4000750c: 80 a0 40 02 cmp %g1, %g2
40007510: 34 80 00 3d bg,a 40007604 <sigtimedwait+0x220>
<== NEVER TAKEN
40007514: 05 31 19 4d sethi %hi(0xc4653400), %g2
<== NOT EXECUTED
if ( sec <= INT64_MAX ) {
40007518: 80 a3 20 00 cmp %o4, 0
4000751c: 06 80 00 41 bl 40007620 <sigtimedwait+0x23c>
<== NEVER TAKEN
40007520: c2 27 bf d0 st %g1, [ %fp + -48 ]
now->tv_sec = sec;
40007524: d8 27 bf c8 st %o4, [ %fp + -56 ]
return now;
40007528: 82 07 bf c8 add %fp, -56, %g1
now->tv_sec = sec;
4000752c: 10 bf ff bd b 40007420 <sigtimedwait+0x3c>
40007530: da 27 bf cc st %o5, [ %fp + -52 ]
queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing_extra;
40007534: 82 10 60 a4 or %g1, 0xa4, %g1
the_info = ( info ) ? info : &signal_information;
40007538: 80 a6 60 00 cmp %i1, 0
4000753c: 12 bf ff bf bne 40007438 <sigtimedwait+0x54>
40007540: c2 27 bf e4 st %g1, [ %fp + -28 ]
40007544: fa 01 a0 20 ld [ %g6 + 0x20 ], %i5
<== NOT EXECUTED
40007548: b2 07 bf bc add %fp, -68, %i1
<== NOT EXECUTED
api = executing->API_Extensions[ THREAD_API_POSIX ];
4000754c: f6 07 61 5c ld [ %i5 + 0x15c ], %i3
<== NOT EXECUTED
40007550: 91 d0 20 09 ta 9
<== NOT EXECUTED
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40007554: c2 27 bf dc st %g1, [ %fp + -36 ]
if ( *set & api->signals_pending ) {
40007558: c2 07 00 00 ld [ %i4 ], %g1
4000755c: d0 06 e0 6c ld [ %i3 + 0x6c ], %o0
40007560: 80 88 40 08 btst %g1, %o0
40007564: 02 bf ff be be 4000745c <sigtimedwait+0x78>
40007568: 05 10 00 77 sethi %hi(0x4001dc00), %g2
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
4000756c: 7f ff ff 78 call 4000734c <_POSIX_signals_Get_lowest>
40007570: 01 00 00 00 nop
40007574: d0 26 40 00 st %o0, [ %i1 ]
40007578: 92 10 00 08 mov %o0, %o1
_POSIX_signals_Clear_signals(
4000757c: 9a 10 20 00 clr %o5
40007580: 98 10 20 00 clr %o4
40007584: 96 10 20 00 clr %o3
40007588: 94 10 00 19 mov %i1, %o2
4000758c: 40 00 1f 69 call 4000f330 <_POSIX_signals_Clear_signals>
40007590: 90 10 00 1b mov %i3, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40007594: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40007598: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000759c: 01 00 00 00 nop
the_info->si_code = SI_USER;
400075a0: 82 10 20 01 mov 1, %g1 ! 1 <_TLS_Alignment>
the_info->si_value.sival_int = 0;
400075a4: c0 26 60 08 clr [ %i1 + 8 ]
the_info->si_code = SI_USER;
400075a8: c2 26 60 04 st %g1, [ %i1 + 4 ]
return the_info->si_signo;
400075ac: f0 06 40 00 ld [ %i1 ], %i0
400075b0: 81 c7 e0 08 ret
400075b4: 81 e8 00 00 restore
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
400075b8: 7f ff ff 65 call 4000734c <_POSIX_signals_Get_lowest>
400075bc: 01 00 00 00 nop
_POSIX_signals_Clear_signals( api, signo, the_info, true, false, false );
400075c0: 9a 10 20 00 clr %o5 ! 0 <PROM_START>
400075c4: 92 10 00 08 mov %o0, %o1
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
400075c8: b0 10 00 08 mov %o0, %i0
_POSIX_signals_Clear_signals( api, signo, the_info, true, false, false );
400075cc: 98 10 20 00 clr %o4
400075d0: 96 10 20 01 mov 1, %o3
400075d4: 94 10 00 19 mov %i1, %o2
400075d8: 40 00 1f 56 call 4000f330 <_POSIX_signals_Clear_signals>
400075dc: 90 10 00 1b mov %i3, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400075e0: c2 07 bf dc ld [ %fp + -36 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400075e4: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400075e8: 01 00 00 00 nop
the_info->si_code = SI_USER;
400075ec: 82 10 20 01 mov 1, %g1 ! 1 <_TLS_Alignment>
the_info->si_signo = signo;
400075f0: f0 26 40 00 st %i0, [ %i1 ]
the_info->si_code = SI_USER;
400075f4: c2 26 60 04 st %g1, [ %i1 + 4 ]
the_info->si_value.sival_int = 0;
400075f8: c0 26 60 08 clr [ %i1 + 8 ]
return signo;
400075fc: 81 c7 e0 08 ret
40007600: 81 e8 00 00 restore
now->tv_nsec -= WATCHDOG_NANOSECONDS_PER_SECOND;
40007604: 84 10 a2 00 or %g2, 0x200, %g2
<== NOT EXECUTED
40007608: 82 00 40 02 add %g1, %g2, %g1
<== NOT EXECUTED
++sec;
4000760c: 9a 83 60 01 inccc %o5
<== NOT EXECUTED
40007610: 98 43 20 00 addx %o4, 0, %o4
<== NOT EXECUTED
if ( sec <= INT64_MAX ) {
40007614: 80 a3 20 00 cmp %o4, 0
<== NOT EXECUTED
40007618: 16 bf ff c3 bge 40007524 <sigtimedwait+0x140>
<== NOT EXECUTED
4000761c: c2 27 bf d0 st %g1, [ %fp + -48 ]
<== NOT EXECUTED
now->tv_sec = INT64_MAX;
40007620: 05 1f ff ff sethi %hi(0x7ffffc00), %g2
<== NOT EXECUTED
40007624: 86 10 3f ff mov -1, %g3
<== NOT EXECUTED
40007628: 84 10 a3 ff or %g2, 0x3ff, %g2
<== NOT EXECUTED
return now;
4000762c: 82 07 bf c8 add %fp, -56, %g1
<== NOT EXECUTED
now->tv_sec = INT64_MAX;
40007630: 10 bf ff 7c b 40007420 <sigtimedwait+0x3c>
<== NOT EXECUTED
40007634: c4 3f bf c8 std %g2, [ %fp + -56 ]
<== NOT EXECUTED
if ( error == ETIMEDOUT ) {
40007638: 80 a7 60 74 cmp %i5, 0x74
4000763c: 22 80 00 02 be,a 40007644 <sigtimedwait+0x260>
40007640: ba 10 20 0b mov 0xb, %i5
rtems_set_errno_and_return_minus_one( error );
40007644: 40 00 24 62 call 400107cc <__errno>
40007648: b0 10 3f ff mov -1, %i0
4000764c: fa 22 00 00 st %i5, [ %o0 ]
40007650: 81 c7 e0 08 ret
40007654: 81 e8 00 00 restore
rtems_set_errno_and_return_minus_one( EINVAL );
40007658: 40 00 24 5d call 400107cc <__errno>
4000765c: b0 10 3f ff mov -1, %i0
40007660: 82 10 20 16 mov 0x16, %g1
40007664: c2 22 00 00 st %g1, [ %o0 ]
40007668: 81 c7 e0 08 ret
4000766c: 81 e8 00 00 restore
4000882c <sigwait>:
int sigwait(
const sigset_t *__restrict set,
int *__restrict sig
)
{
4000882c: 9d e3 bf a0 save %sp, -96, %sp
int status;
status = sigtimedwait( set, NULL, NULL );
40008830: 94 10 20 00 clr %o2
40008834: 92 10 20 00 clr %o1
40008838: 7f ff ff 56 call 40008590 <sigtimedwait>
4000883c: 90 10 00 18 mov %i0, %o0
if ( status != -1 ) {
40008840: 80 a2 3f ff cmp %o0, -1
40008844: 02 80 00 07 be 40008860 <sigwait+0x34>
40008848: 80 a6 60 00 cmp %i1, 0
if ( sig )
4000884c: 02 80 00 03 be 40008858 <sigwait+0x2c>
<== NEVER TAKEN
40008850: b0 10 20 00 clr %i0
*sig = status;
40008854: d0 26 40 00 st %o0, [ %i1 ]
40008858: 81 c7 e0 08 ret
4000885c: 81 e8 00 00 restore
return 0;
}
return errno;
40008860: 40 00 24 1e call 400118d8 <__errno>
40008864: 01 00 00 00 nop
40008868: f0 02 00 00 ld [ %o0 ], %i0
}
4000886c: 81 c7 e0 08 ret
40008870: 81 e8 00 00 restore
400064e0 <sysconf>:
*/
long sysconf(
int name
)
{
400064e0: 9d e3 bf a0 save %sp, -96, %sp
switch ( name ) {
400064e4: 80 a6 20 0a cmp %i0, 0xa
400064e8: 02 80 00 2f be 400065a4 <sysconf+0xc4>
400064ec: 01 00 00 00 nop
400064f0: 04 80 00 0f ble 4000652c <sysconf+0x4c>
400064f4: 80 a6 20 04 cmp %i0, 4
400064f8: 80 a6 20 4f cmp %i0, 0x4f
400064fc: 02 80 00 0a be 40006524 <sysconf+0x44>
<== NEVER TAKEN
40006500: 82 10 20 20 mov 0x20, %g1
40006504: 04 80 00 1a ble 4000656c <sysconf+0x8c>
40006508: 80 a6 20 8c cmp %i0, 0x8c
case _SC_NPROCESSORS_CONF:
return (long) rtems_configuration_get_maximum_processors();
case _SC_NPROCESSORS_ONLN:
return (long) rtems_get_processor_count();
case _SC_POSIX_26_VERSION:
return (long) _POSIX_26_VERSION;
4000650c: 03 00 00 c3 sethi %hi(0x30c00), %g1
switch ( name ) {
40006510: 02 80 00 05 be 40006524 <sysconf+0x44>
<== NEVER TAKEN
40006514: 82 10 62 78 or %g1, 0x278, %g1 ! 30e78 <_Configuration_Interrupt_stack_size+0x2fe78>
40006518: 80 a6 22 03 cmp %i0, 0x203
4000651c: 12 80 00 0d bne 40006550 <sysconf+0x70>
<== ALWAYS TAKEN
40006520: 82 10 20 00 clr %g1
return 0;
#endif
default:
rtems_set_errno_and_return_minus_one( EINVAL );
}
}
40006524: 81 c7 e0 08 ret
40006528: 91 e8 00 01 restore %g0, %g1, %o0
switch ( name ) {
4000652c: 02 80 00 1b be 40006598 <sysconf+0xb8>
40006530: 03 10 00 42 sethi %hi(0x40010800), %g1
40006534: 04 80 00 13 ble 40006580 <sysconf+0xa0>
40006538: 80 a6 20 08 cmp %i0, 8
4000653c: 02 bf ff fa be 40006524 <sysconf+0x44>
40006540: 03 00 00 04 sethi %hi(0x1000), %g1
40006544: 80 a6 20 09 cmp %i0, 9
40006548: 02 bf ff f7 be 40006524 <sysconf+0x44>
<== ALWAYS TAKEN
4000654c: 82 10 20 01 mov 1, %g1
rtems_set_errno_and_return_minus_one( EINVAL );
40006550: 40 00 21 b7 call 4000ec2c <__errno>
40006554: 01 00 00 00 nop
40006558: 82 10 20 16 mov 0x16, %g1 ! 16 <_TLS_Alignment+0x15>
4000655c: c2 22 00 00 st %g1, [ %o0 ]
40006560: 82 10 3f ff mov -1, %g1
}
40006564: 81 c7 e0 08 ret
40006568: 91 e8 00 01 restore %g0, %g1, %o0
switch ( name ) {
4000656c: 80 a6 20 33 cmp %i0, 0x33
40006570: 12 bf ff f8 bne 40006550 <sysconf+0x70>
<== NEVER TAKEN
40006574: 82 10 24 00 mov 0x400, %g1
}
40006578: 81 c7 e0 08 ret
4000657c: 91 e8 00 01 restore %g0, %g1, %o0
return (long) rtems_clock_get_ticks_per_second();
40006580: 03 10 00 42 sethi %hi(0x40010800), %g1
switch ( name ) {
40006584: 80 a6 20 02 cmp %i0, 2
40006588: 12 bf ff f2 bne 40006550 <sysconf+0x70>
4000658c: c2 00 61 e8 ld [ %g1 + 0x1e8 ], %g1
}
40006590: 81 c7 e0 08 ret
40006594: 91 e8 00 01 restore %g0, %g1, %o0
return rtems_libio_number_iops;
40006598: c2 00 63 78 ld [ %g1 + 0x378 ], %g1
}
4000659c: 81 c7 e0 08 ret
400065a0: 91 e8 00 01 restore %g0, %g1, %o0
return (long) rtems_get_processor_count();
400065a4: 40 00 00 02 call 400065ac <rtems_get_processor_count>
400065a8: 81 e8 00 00 restore
40007b3c <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *__restrict evp,
timer_t *__restrict timerid
)
{
40007b3c: 9d e3 bf a0 save %sp, -96, %sp
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
40007b40: 80 a6 20 01 cmp %i0, 1
40007b44: 12 80 00 43 bne 40007c50 <timer_create+0x114>
40007b48: 80 a6 a0 00 cmp %i2, 0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
40007b4c: 02 80 00 41 be 40007c50 <timer_create+0x114>
40007b50: 80 a6 60 00 cmp %i1, 0
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
40007b54: 02 80 00 35 be 40007c28 <timer_create+0xec>
40007b58: 3b 10 00 68 sethi %hi(0x4001a000), %i5
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
40007b5c: c2 06 40 00 ld [ %i1 ], %g1
40007b60: 82 00 7f ff add %g1, -1, %g1
40007b64: 80 a0 60 01 cmp %g1, 1
40007b68: 18 80 00 3a bgu 40007c50 <timer_create+0x114>
<== NEVER TAKEN
40007b6c: 01 00 00 00 nop
( 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 )
40007b70: c2 06 60 04 ld [ %i1 + 4 ], %g1
40007b74: 80 a0 60 00 cmp %g1, 0
40007b78: 02 80 00 36 be 40007c50 <timer_create+0x114>
<== NEVER TAKEN
40007b7c: 82 00 7f ff add %g1, -1, %g1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
40007b80: 80 a0 60 1f cmp %g1, 0x1f
40007b84: 18 80 00 33 bgu 40007c50 <timer_create+0x114>
<== NEVER TAKEN
40007b88: 01 00 00 00 nop
* This function allocates a timer control block from
* 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 );
40007b8c: 40 00 0c 53 call 4000acd8 <_Objects_Allocate>
40007b90: 90 17 61 c4 or %i5, 0x1c4, %o0
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
40007b94: 80 a2 20 00 cmp %o0, 0
40007b98: 02 80 00 34 be 40007c68 <timer_create+0x12c>
<== NEVER TAKEN
40007b9c: 82 10 20 02 mov 2, %g1
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;
40007ba0: c2 2a 20 34 stb %g1, [ %o0 + 0x34 ]
ptimer->thread_id = _Thread_Get_executing()->Object.id;
40007ba4: c2 01 a0 20 ld [ %g6 + 0x20 ], %g1
40007ba8: c8 00 60 08 ld [ %g1 + 8 ], %g4
if ( evp != NULL ) {
ptimer->inf.sigev_notify = evp->sigev_notify;
40007bac: c6 06 40 00 ld [ %i1 ], %g3
ptimer->inf.sigev_signo = evp->sigev_signo;
40007bb0: c4 06 60 04 ld [ %i1 + 4 ], %g2
ptimer->inf.sigev_value = evp->sigev_value;
40007bb4: c2 06 60 08 ld [ %i1 + 8 ], %g1
ptimer->thread_id = _Thread_Get_executing()->Object.id;
40007bb8: c8 22 20 30 st %g4, [ %o0 + 0x30 ]
ptimer->inf.sigev_notify = evp->sigev_notify;
40007bbc: c6 22 20 38 st %g3, [ %o0 + 0x38 ]
ptimer->inf.sigev_signo = evp->sigev_signo;
40007bc0: c4 22 20 3c st %g2, [ %o0 + 0x3c ]
ptimer->inf.sigev_value = evp->sigev_value;
40007bc4: c2 22 20 40 st %g1, [ %o0 + 0x40 ]
RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state;
40007bc8: 84 10 20 02 mov 2, %g2
40007bcc: c4 22 20 1c st %g2, [ %o0 + 0x1c ]
the_watchdog->routine = routine;
40007bd0: 05 10 00 1f sethi %hi(0x40007c00), %g2
40007bd4: 84 10 a0 88 or %g2, 0x88, %g2 ! 40007c88 <_POSIX_Timer_TSR>
information->local_table[ index ] = the_object;
40007bd8: c6 02 20 08 ld [ %o0 + 8 ], %g3
40007bdc: c2 12 20 0a lduh [ %o0 + 0xa ], %g1
40007be0: c4 22 20 20 st %g2, [ %o0 + 0x20 ]
40007be4: ba 17 61 c4 or %i5, 0x1c4, %i5
}
ptimer->overrun = 0;
ptimer->timer_data.it_value.tv_sec = 0;
40007be8: c0 22 20 60 clr [ %o0 + 0x60 ]
40007bec: 83 28 60 02 sll %g1, 2, %g1
40007bf0: c0 22 20 64 clr [ %o0 + 0x64 ]
_Watchdog_Initialize( &ptimer->Timer, _POSIX_Timer_TSR );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Objects_Allocator_unlock();
return 0;
40007bf4: b0 10 20 00 clr %i0
ptimer->overrun = 0;
40007bf8: c0 22 20 74 clr [ %o0 + 0x74 ]
ptimer->timer_data.it_interval.tv_sec = 0;
40007bfc: c0 22 20 50 clr [ %o0 + 0x50 ]
40007c00: c0 22 20 54 clr [ %o0 + 0x54 ]
ptimer->timer_data.it_value.tv_nsec = 0;
40007c04: c0 22 20 68 clr [ %o0 + 0x68 ]
ptimer->timer_data.it_interval.tv_nsec = 0;
40007c08: c0 22 20 58 clr [ %o0 + 0x58 ]
the_object->name.name_u32 = name;
40007c0c: c0 22 20 0c clr [ %o0 + 0xc ]
information->local_table[ index ] = the_object;
40007c10: c4 07 60 1c ld [ %i5 + 0x1c ], %g2
40007c14: d0 20 80 01 st %o0, [ %g2 + %g1 ]
_RTEMS_Unlock_allocator();
40007c18: 40 00 04 1a call 40008c80 <_RTEMS_Unlock_allocator>
40007c1c: c6 26 80 00 st %g3, [ %i2 ]
}
40007c20: 81 c7 e0 08 ret
40007c24: 81 e8 00 00 restore
40007c28: 40 00 0c 2c call 4000acd8 <_Objects_Allocate>
40007c2c: 90 17 61 c4 or %i5, 0x1c4, %o0
if ( !ptimer ) {
40007c30: 80 a2 20 00 cmp %o0, 0
40007c34: 02 80 00 0d be 40007c68 <timer_create+0x12c>
40007c38: 82 10 20 02 mov 2, %g1
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
40007c3c: c2 2a 20 34 stb %g1, [ %o0 + 0x34 ]
ptimer->thread_id = _Thread_Get_executing()->Object.id;
40007c40: c2 01 a0 20 ld [ %g6 + 0x20 ], %g1
40007c44: c2 00 60 08 ld [ %g1 + 8 ], %g1
40007c48: 10 bf ff e0 b 40007bc8 <timer_create+0x8c>
40007c4c: c2 22 20 30 st %g1, [ %o0 + 0x30 ]
rtems_set_errno_and_return_minus_one( EINVAL );
40007c50: 40 00 27 1c call 400118c0 <__errno>
40007c54: b0 10 3f ff mov -1, %i0
40007c58: 82 10 20 16 mov 0x16, %g1
40007c5c: c2 22 00 00 st %g1, [ %o0 ]
40007c60: 81 c7 e0 08 ret
40007c64: 81 e8 00 00 restore
40007c68: 40 00 04 06 call 40008c80 <_RTEMS_Unlock_allocator>
40007c6c: b0 10 3f ff mov -1, %i0
rtems_set_errno_and_return_minus_one( EAGAIN );
40007c70: 40 00 27 14 call 400118c0 <__errno>
40007c74: 01 00 00 00 nop
40007c78: 82 10 20 0b mov 0xb, %g1 ! b <_TLS_Alignment+0xa>
40007c7c: c2 22 00 00 st %g1, [ %o0 ]
40007c80: 81 c7 e0 08 ret
40007c84: 81 e8 00 00 restore
40006f0c <timer_delete>:
int timer_delete(
timer_t timerid
)
{
40006f0c: 9d e3 bf 98 save %sp, -104, %sp
_RTEMS_Lock_allocator();
40006f10: 40 00 01 af call 400075cc <_RTEMS_Lock_allocator>
40006f14: 39 10 00 59 sethi %hi(0x40016400), %i4
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Get (
timer_t id,
ISR_lock_Context *lock_context
)
{
return (POSIX_Timer_Control *) _Objects_Get(
40006f18: 92 07 bf fc add %fp, -4, %o1
40006f1c: 94 17 22 90 or %i4, 0x290, %o2
40006f20: 40 00 0a 77 call 400098fc <_Objects_Get>
40006f24: 90 10 00 18 mov %i0, %o0
ISR_lock_Context lock_context;
_Objects_Allocator_lock();
ptimer = _POSIX_Timer_Get( timerid, &lock_context );
if ( ptimer != NULL ) {
40006f28: ba 92 20 00 orcc %o0, 0, %i5
40006f2c: 02 80 00 15 be 40006f80 <timer_delete+0x74>
40006f30: 92 10 00 1d mov %i5, %o1
Per_CPU_Control *cpu;
_Objects_Close( &_POSIX_Timer_Information, &ptimer->Object );
40006f34: 40 00 09 7a call 4000951c <_Objects_Close>
40006f38: 90 17 22 90 or %i4, 0x290, %o0
cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
ptimer->state = POSIX_TIMER_STATE_FREE;
40006f3c: 82 10 20 01 mov 1, %g1
40006f40: c2 2f 60 34 stb %g1, [ %i5 + 0x34 ]
_Watchdog_Remove(
40006f44: 92 07 60 10 add %i5, 0x10, %o1
40006f48: 11 10 00 59 sethi %hi(0x40016400), %o0
40006f4c: 40 00 16 e4 call 4000cadc <_Watchdog_Remove>
40006f50: 90 12 21 78 or %o0, 0x178, %o0 ! 40016578 <_Per_CPU_Information+0x38>
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006f54: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006f58: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006f5c: 01 00 00 00 nop
_Objects_Free( &_POSIX_Timer_Information, &the_timer->Object );
40006f60: 92 10 00 1d mov %i5, %o1
40006f64: 90 17 22 90 or %i4, 0x290, %o0
40006f68: 40 00 0a 39 call 4000984c <_Objects_Free>
40006f6c: b0 10 20 00 clr %i0
_RTEMS_Unlock_allocator();
40006f70: 40 00 01 9c call 400075e0 <_RTEMS_Unlock_allocator>
40006f74: 01 00 00 00 nop
&ptimer->Timer
);
_POSIX_Timer_Release( cpu, &lock_context );
_POSIX_Timer_Free( ptimer );
_Objects_Allocator_unlock();
return 0;
40006f78: 81 c7 e0 08 ret
40006f7c: 81 e8 00 00 restore
40006f80: 40 00 01 98 call 400075e0 <_RTEMS_Unlock_allocator>
40006f84: b0 10 3f ff mov -1, %i0
}
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( EINVAL );
40006f88: 40 00 25 0a call 400103b0 <__errno>
40006f8c: 01 00 00 00 nop
40006f90: 82 10 20 16 mov 0x16, %g1 ! 16 <_TLS_Alignment+0x15>
40006f94: c2 22 00 00 st %g1, [ %o0 ]
}
40006f98: 81 c7 e0 08 ret
40006f9c: 81 e8 00 00 restore
400082f8 <timer_getoverrun>:
#include <rtems/posix/timerimpl.h>
int timer_getoverrun(
timer_t timerid
)
{
400082f8: 9d e3 bf 98 save %sp, -104, %sp
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Get (
timer_t id,
ISR_lock_Context *lock_context
)
{
return (POSIX_Timer_Control *) _Objects_Get(
400082fc: 15 10 00 9c sethi %hi(0x40027000), %o2
40008300: 92 07 bf fc add %fp, -4, %o1
40008304: 94 12 a1 98 or %o2, 0x198, %o2
40008308: 40 00 0a 70 call 4000acc8 <_Objects_Get>
4000830c: 90 10 00 18 mov %i0, %o0
POSIX_Timer_Control *ptimer;
ISR_lock_Context lock_context;
ptimer = _POSIX_Timer_Get( timerid, &lock_context );
if ( ptimer != NULL ) {
40008310: 80 a2 20 00 cmp %o0, 0
40008314: 02 80 00 09 be 40008338 <timer_getoverrun+0x40>
40008318: 01 00 00 00 nop
Per_CPU_Control *cpu;
int overrun;
cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
overrun = ptimer->overrun;
4000831c: f0 02 20 74 ld [ %o0 + 0x74 ], %i0
<== NOT EXECUTED
ptimer->overrun = 0;
40008320: c0 22 20 74 clr [ %o0 + 0x74 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40008324: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40008328: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
4000832c: 01 00 00 00 nop
_POSIX_Timer_Release( cpu, &lock_context );
return overrun;
40008330: 81 c7 e0 08 ret
40008334: 81 e8 00 00 restore
}
rtems_set_errno_and_return_minus_one( EINVAL );
40008338: 40 00 25 2a call 400117e0 <__errno>
4000833c: b0 10 3f ff mov -1, %i0
40008340: 82 10 20 16 mov 0x16, %g1
40008344: c2 22 00 00 st %g1, [ %o0 ]
}
40008348: 81 c7 e0 08 ret
4000834c: 81 e8 00 00 restore
40008350 <timer_gettime>:
int timer_gettime(
timer_t timerid,
struct itimerspec *value
)
{
40008350: 9d e3 bf 98 save %sp, -104, %sp
POSIX_Timer_Control *ptimer;
ISR_lock_Context lock_context;
uint64_t now;
uint32_t remaining;
if ( !value )
40008354: 80 a6 60 00 cmp %i1, 0
40008358: 02 80 00 22 be 400083e0 <timer_gettime+0x90>
4000835c: 92 07 bf fc add %fp, -4, %o1
40008360: 15 10 00 9c sethi %hi(0x40027000), %o2
40008364: 90 10 00 18 mov %i0, %o0
40008368: 40 00 0a 58 call 4000acc8 <_Objects_Get>
4000836c: 94 12 a1 98 or %o2, 0x198, %o2
rtems_set_errno_and_return_minus_one( EINVAL );
ptimer = _POSIX_Timer_Get( timerid, &lock_context );
if ( ptimer != NULL ) {
40008370: ba 92 20 00 orcc %o0, 0, %i5
40008374: 02 80 00 21 be 400083f8 <timer_gettime+0xa8>
40008378: 03 10 00 9b sethi %hi(0x40026c00), %g1
Per_CPU_Control *cpu;
cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
now = cpu->Watchdog.ticks;
if ( now < ptimer->Timer.expire ) {
4000837c: c6 07 60 28 ld [ %i5 + 0x28 ], %g3
now = cpu->Watchdog.ticks;
40008380: 82 10 61 80 or %g1, 0x180, %g1
40008384: c4 00 60 30 ld [ %g1 + 0x30 ], %g2
if ( now < ptimer->Timer.expire ) {
40008388: d0 07 60 2c ld [ %i5 + 0x2c ], %o0
4000838c: 80 a0 c0 02 cmp %g3, %g2
40008390: 08 80 00 0e bleu 400083c8 <timer_gettime+0x78>
<== ALWAYS TAKEN
40008394: c2 00 60 34 ld [ %g1 + 0x34 ], %g1
remaining = (uint32_t) ( ptimer->Timer.expire - now );
40008398: 90 22 00 01 sub %o0, %g1, %o0
<== NOT EXECUTED
} else {
remaining = 0;
}
_Timespec_From_ticks( remaining, &value->it_value );
4000839c: 40 00 17 de call 4000e314 <_Timespec_From_ticks>
400083a0: 92 06 60 10 add %i1, 0x10, %o1
value->it_interval = ptimer->timer_data.it_interval;
400083a4: c4 1f 60 50 ldd [ %i5 + 0x50 ], %g2
<== NOT EXECUTED
400083a8: c4 3e 40 00 std %g2, [ %i1 ]
<== NOT EXECUTED
400083ac: c4 1f 60 58 ldd [ %i5 + 0x58 ], %g2
<== NOT EXECUTED
400083b0: c4 3e 60 08 std %g2, [ %i1 + 8 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
400083b4: c2 07 bf fc ld [ %fp + -4 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
400083b8: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
400083bc: 01 00 00 00 nop
_POSIX_Timer_Release( cpu, &lock_context );
return 0;
400083c0: 81 c7 e0 08 ret
400083c4: 91 e8 20 00 restore %g0, 0, %o0
if ( now < ptimer->Timer.expire ) {
400083c8: 12 80 00 04 bne 400083d8 <timer_gettime+0x88>
<== NEVER TAKEN
400083cc: 80 a2 00 01 cmp %o0, %g1
400083d0: 38 bf ff f3 bgu,a 4000839c <timer_gettime+0x4c>
<== ALWAYS TAKEN
400083d4: 90 22 00 01 sub %o0, %g1, %o0
remaining = 0;
400083d8: 10 bf ff f1 b 4000839c <timer_gettime+0x4c>
<== NOT EXECUTED
400083dc: 90 10 20 00 clr %o0
<== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
400083e0: 40 00 25 00 call 400117e0 <__errno>
400083e4: b0 10 3f ff mov -1, %i0
400083e8: 82 10 20 16 mov 0x16, %g1
400083ec: c2 22 00 00 st %g1, [ %o0 ]
400083f0: 81 c7 e0 08 ret
400083f4: 81 e8 00 00 restore
}
rtems_set_errno_and_return_minus_one( EINVAL );
400083f8: 40 00 24 fa call 400117e0 <__errno>
400083fc: b0 10 3f ff mov -1, %i0
40008400: 82 10 20 16 mov 0x16, %g1
40008404: c2 22 00 00 st %g1, [ %o0 ]
}
40008408: 81 c7 e0 08 ret
4000840c: 81 e8 00 00 restore
40006980 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *__restrict value,
struct itimerspec *__restrict ovalue
)
{
40006980: 9d e3 bf 70 save %sp, -144, %sp
POSIX_Timer_Control *ptimer;
ISR_lock_Context lock_context;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
40006984: 80 a6 a0 00 cmp %i2, 0
40006988: 02 80 00 7d be 40006b7c <timer_settime+0x1fc>
<== NEVER TAKEN
4000698c: a0 10 00 18 mov %i0, %l0
/*
* 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) ) ) {
40006990: 40 00 15 be call 4000c088 <_Timespec_Is_valid>
40006994: 90 06 a0 10 add %i2, 0x10, %o0
40006998: 80 a2 20 00 cmp %o0, 0
4000699c: 02 80 00 78 be 40006b7c <timer_settime+0x1fc>
400069a0: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
400069a4: 40 00 15 b9 call 4000c088 <_Timespec_Is_valid>
400069a8: 90 10 00 1a mov %i2, %o0
400069ac: 80 a2 20 00 cmp %o0, 0
400069b0: 02 80 00 73 be 40006b7c <timer_settime+0x1fc>
<== NEVER TAKEN
400069b4: 01 00 00 00 nop
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
400069b8: b0 8e 7f fb andcc %i1, -5, %i0
400069bc: 12 80 00 70 bne 40006b7c <timer_settime+0x1fc>
400069c0: 80 a6 60 04 cmp %i1, 4
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
400069c4: d4 1e 80 00 ldd [ %i2 ], %o2
400069c8: d8 1e a0 08 ldd [ %i2 + 8 ], %o4
400069cc: f8 1e a0 10 ldd [ %i2 + 0x10 ], %i4
400069d0: c4 1e a0 18 ldd [ %i2 + 0x18 ], %g2
400069d4: d4 3f bf e0 std %o2, [ %fp + -32 ]
400069d8: d8 3f bf e8 std %o4, [ %fp + -24 ]
400069dc: f8 3f bf f0 std %i4, [ %fp + -16 ]
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
400069e0: 02 80 00 5a be 40006b48 <timer_settime+0x1c8>
400069e4: c4 3f bf f8 std %g2, [ %fp + -8 ]
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Get (
timer_t id,
ISR_lock_Context *lock_context
)
{
return (POSIX_Timer_Control *) _Objects_Get(
400069e8: 92 07 bf d0 add %fp, -48, %o1
400069ec: 15 10 00 5e sethi %hi(0x40017800), %o2
400069f0: 90 10 00 10 mov %l0, %o0
400069f4: 40 00 0a a2 call 4000947c <_Objects_Get>
400069f8: 94 12 a1 48 or %o2, 0x148, %o2
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &lock_context );
if ( ptimer != NULL ) {
400069fc: b2 92 20 00 orcc %o0, 0, %i1
40006a00: 02 80 00 65 be 40006b94 <timer_settime+0x214>
40006a04: ba 06 60 10 add %i1, 0x10, %i5
Per_CPU_Control *cpu;
cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
/* Stop the timer */
_Watchdog_Remove(
40006a08: 11 10 00 5e sethi %hi(0x40017800), %o0
40006a0c: 92 10 00 1d mov %i5, %o1
40006a10: 40 00 17 3d call 4000c704 <_Watchdog_Remove>
40006a14: 90 12 20 78 or %o0, 0x78, %o0
&cpu->Watchdog.Header[ PER_CPU_WATCHDOG_TICKS ],
&ptimer->Timer
);
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
40006a18: c4 07 bf f0 ld [ %fp + -16 ], %g2
40006a1c: c2 07 bf f4 ld [ %fp + -12 ], %g1
40006a20: 80 90 80 01 orcc %g2, %g1, %g0
40006a24: 12 80 00 1d bne 40006a98 <timer_settime+0x118>
40006a28: c2 07 bf f8 ld [ %fp + -8 ], %g1
40006a2c: 80 a0 60 00 cmp %g1, 0
40006a30: 12 80 00 1a bne 40006a98 <timer_settime+0x118>
40006a34: 80 a6 e0 00 cmp %i3, 0
/* The old data of the timer are returned */
if ( ovalue )
40006a38: 02 80 00 0a be 40006a60 <timer_settime+0xe0>
40006a3c: 82 10 20 04 mov 4, %g1
*ovalue = ptimer->timer_data;
40006a40: d8 1e 60 50 ldd [ %i1 + 0x50 ], %o4
<== NOT EXECUTED
40006a44: f8 1e 60 58 ldd [ %i1 + 0x58 ], %i4
<== NOT EXECUTED
40006a48: c4 1e 60 60 ldd [ %i1 + 0x60 ], %g2
<== NOT EXECUTED
40006a4c: d4 1e 60 68 ldd [ %i1 + 0x68 ], %o2
<== NOT EXECUTED
40006a50: d8 3e c0 00 std %o4, [ %i3 ]
<== NOT EXECUTED
40006a54: f8 3e e0 08 std %i4, [ %i3 + 8 ]
<== NOT EXECUTED
40006a58: c4 3e e0 10 std %g2, [ %i3 + 0x10 ]
<== NOT EXECUTED
40006a5c: d4 3e e0 18 std %o2, [ %i3 + 0x18 ]
<== NOT EXECUTED
/* The new data are set */
ptimer->timer_data = normalize;
40006a60: c4 1f bf e0 ldd [ %fp + -32 ], %g2
<== NOT EXECUTED
40006a64: c4 3e 60 50 std %g2, [ %i1 + 0x50 ]
<== NOT EXECUTED
40006a68: c4 1f bf e8 ldd [ %fp + -24 ], %g2
<== NOT EXECUTED
40006a6c: c4 3e 60 58 std %g2, [ %i1 + 0x58 ]
<== NOT EXECUTED
40006a70: c4 1f bf f0 ldd [ %fp + -16 ], %g2
<== NOT EXECUTED
40006a74: c4 3e 60 60 std %g2, [ %i1 + 0x60 ]
<== NOT EXECUTED
40006a78: c4 1f bf f8 ldd [ %fp + -8 ], %g2
<== NOT EXECUTED
40006a7c: c4 3e 60 68 std %g2, [ %i1 + 0x68 ]
<== NOT EXECUTED
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
40006a80: c2 2e 60 34 stb %g1, [ %i1 + 0x34 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006a84: c2 07 bf d0 ld [ %fp + -48 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006a88: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006a8c: 01 00 00 00 nop
/* Returns with success */
_POSIX_Timer_Release( cpu, &lock_context );
return 0;
40006a90: 81 c7 e0 08 ret
40006a94: 81 e8 00 00 restore
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
40006a98: 40 00 15 c0 call 4000c198 <_Timespec_To_ticks>
40006a9c: 90 10 00 1a mov %i2, %o0
40006aa0: d0 26 60 70 st %o0, [ %i1 + 0x70 ]
initial_period = _Timespec_To_ticks( &normalize.it_value );
40006aa4: 40 00 15 bd call 4000c198 <_Timespec_To_ticks>
40006aa8: 90 07 bf f0 add %fp, -16, %o0
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
40006aac: 82 10 20 03 mov 3, %g1
40006ab0: c2 2e 60 34 stb %g1, [ %i1 + 0x34 ]
initial_period = _Timespec_To_ticks( &normalize.it_value );
40006ab4: b8 10 00 08 mov %o0, %i4
40006ab8: 40 00 08 4b call 40008be4 <_Timecounter_Nanotime>
40006abc: 90 06 60 78 add %i1, 0x78, %o0
cpu->Watchdog.ticks + ticks
40006ac0: 11 10 00 5e sethi %hi(0x40017800), %o0
40006ac4: 90 12 20 40 or %o0, 0x40, %o0 ! 40017840 <_Per_CPU_Information>
_Watchdog_Insert(
40006ac8: d4 1a 20 30 ldd [ %o0 + 0x30 ], %o2
40006acc: 86 82 c0 1c addcc %o3, %i4, %g3
40006ad0: 84 42 a0 00 addx %o2, 0, %g2
40006ad4: 96 10 00 03 mov %g3, %o3
40006ad8: 94 10 00 02 mov %g2, %o2
40006adc: 92 10 00 1d mov %i5, %o1
40006ae0: 40 00 16 e1 call 4000c664 <_Watchdog_Insert>
40006ae4: 90 02 20 38 add %o0, 0x38, %o0
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
40006ae8: 80 a6 e0 00 cmp %i3, 0
40006aec: 02 80 00 0b be 40006b18 <timer_settime+0x198>
40006af0: c4 1f bf e0 ldd [ %fp + -32 ], %g2
*ovalue = ptimer->timer_data;
40006af4: d8 1e 60 50 ldd [ %i1 + 0x50 ], %o4
<== NOT EXECUTED
40006af8: f8 1e 60 58 ldd [ %i1 + 0x58 ], %i4
<== NOT EXECUTED
40006afc: c4 1e 60 60 ldd [ %i1 + 0x60 ], %g2
<== NOT EXECUTED
40006b00: d4 1e 60 68 ldd [ %i1 + 0x68 ], %o2
<== NOT EXECUTED
40006b04: d8 3e c0 00 std %o4, [ %i3 ]
<== NOT EXECUTED
40006b08: f8 3e e0 08 std %i4, [ %i3 + 8 ]
<== NOT EXECUTED
40006b0c: c4 3e e0 10 std %g2, [ %i3 + 0x10 ]
<== NOT EXECUTED
40006b10: d4 3e e0 18 std %o2, [ %i3 + 0x18 ]
<== NOT EXECUTED
ptimer->timer_data = normalize;
40006b14: c4 1f bf e0 ldd [ %fp + -32 ], %g2
<== NOT EXECUTED
40006b18: c4 3e 60 50 std %g2, [ %i1 + 0x50 ]
<== NOT EXECUTED
40006b1c: c4 1f bf e8 ldd [ %fp + -24 ], %g2
<== NOT EXECUTED
40006b20: c4 3e 60 58 std %g2, [ %i1 + 0x58 ]
<== NOT EXECUTED
40006b24: c4 1f bf f0 ldd [ %fp + -16 ], %g2
<== NOT EXECUTED
40006b28: c4 3e 60 60 std %g2, [ %i1 + 0x60 ]
<== NOT EXECUTED
40006b2c: c4 1f bf f8 ldd [ %fp + -8 ], %g2
<== NOT EXECUTED
40006b30: c4 3e 60 68 std %g2, [ %i1 + 0x68 ]
<== NOT EXECUTED
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006b34: c2 07 bf d0 ld [ %fp + -48 ], %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
40006b38: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006b3c: 01 00 00 00 nop
_POSIX_Timer_Release( cpu, &lock_context );
return 0;
40006b40: 81 c7 e0 08 ret
40006b44: 81 e8 00 00 restore
40006b48: 40 00 08 27 call 40008be4 <_Timecounter_Nanotime>
40006b4c: 90 07 bf d0 add %fp, -48, %o0
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
40006b50: 92 07 bf d0 add %fp, -48, %o1
40006b54: 40 00 15 5b call 4000c0c0 <_Timespec_Less_than>
40006b58: 90 07 bf f0 add %fp, -16, %o0
40006b5c: 80 a2 20 00 cmp %o0, 0
40006b60: 12 80 00 07 bne 40006b7c <timer_settime+0x1fc>
40006b64: 94 07 bf f0 add %fp, -16, %o2
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
40006b68: 90 07 bf d0 add %fp, -48, %o0
40006b6c: 40 00 15 73 call 4000c138 <_Timespec_Subtract>
40006b70: 92 10 00 0a mov %o2, %o1
40006b74: 10 bf ff 9e b 400069ec <timer_settime+0x6c>
40006b78: 92 07 bf d0 add %fp, -48, %o1
rtems_set_errno_and_return_minus_one( EINVAL );
40006b7c: 40 00 23 39 call 4000f860 <__errno>
40006b80: b0 10 3f ff mov -1, %i0
40006b84: 82 10 20 16 mov 0x16, %g1
40006b88: c2 22 00 00 st %g1, [ %o0 ]
40006b8c: 81 c7 e0 08 ret
40006b90: 81 e8 00 00 restore
}
rtems_set_errno_and_return_minus_one( EINVAL );
40006b94: 40 00 23 33 call 4000f860 <__errno>
40006b98: b0 10 3f ff mov -1, %i0
40006b9c: 82 10 20 16 mov 0x16, %g1
40006ba0: c2 22 00 00 st %g1, [ %o0 ]
}
40006ba4: 81 c7 e0 08 ret
40006ba8: 81 e8 00 00 restore
400068bc <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
400068bc: 9d e3 bf a0 save %sp, -96, %sp
<== NOT EXECUTED
uint32_t us_per_tick = rtems_configuration_get_microseconds_per_tick();
400068c0: 3b 10 00 5d sethi %hi(0x40017400), %i5
<== NOT EXECUTED
400068c4: ba 17 60 04 or %i5, 4, %i5 ! 40017404 <Configuration>
<== NOT EXECUTED
400068c8: e2 07 60 14 ld [ %i5 + 0x14 ], %l1
<== NOT EXECUTED
400068cc: a0 04 7f ff add %l1, -1, %l0
<== NOT EXECUTED
return ( us + us_per_tick - 1 ) / us_per_tick;
400068d0: b0 06 00 10 add %i0, %l0, %i0
<== NOT EXECUTED
400068d4: 81 80 20 00 wr %g0, %y
<== NOT EXECUTED
400068d8: 01 00 00 00 nop
<== NOT EXECUTED
400068dc: 01 00 00 00 nop
<== NOT EXECUTED
400068e0: 01 00 00 00 nop
<== NOT EXECUTED
400068e4: b4 76 00 11 udiv %i0, %l1, %i2
<== NOT EXECUTED
__asm__ volatile ( "ta %1\n\t" : "=r" (psr) : "i" (SPARC_SWTRAP_IRQDIS));
400068e8: 91 d0 20 09 ta 9
<== NOT EXECUTED
return psr;
400068ec: b0 10 00 01 mov %g1, %i0
&lock_context
);
cpu = _Watchdog_Get_CPU( the_watchdog );
_Watchdog_Per_CPU_acquire_critical( cpu, &lock_context2 );
now = cpu->Watchdog.ticks;
400068f0: 05 10 00 6c sethi %hi(0x4001b000), %g2
expire = the_watchdog->expire;
400068f4: 37 10 00 65 sethi %hi(0x40019400), %i3
400068f8: e4 18 a3 f0 ldd [ %g2 + 0x3f0 ], %l2
400068fc: 84 16 e2 d8 or %i3, 0x2d8, %g2
40006900: c6 00 a0 18 ld [ %g2 + 0x18 ], %g3
if ( now < expire ) {
40006904: 80 a0 c0 12 cmp %g3, %l2
40006908: 18 80 00 21 bgu 4000698c <ualarm+0xd0>
<== NEVER TAKEN
4000690c: f8 00 a0 1c ld [ %g2 + 0x1c ], %i4
40006910: 02 80 00 1d be 40006984 <ualarm+0xc8>
<== ALWAYS TAKEN
40006914: 80 a7 00 13 cmp %i4, %l3
40006918: b8 10 20 00 clr %i4
<== NOT EXECUTED
_Watchdog_Remove( header, the_watchdog );
4000691c: 92 16 e2 d8 or %i3, 0x2d8, %o1
40006920: 11 10 00 6c sethi %hi(0x4001b000), %o0
40006924: 40 00 16 15 call 4000c178 <_Watchdog_Remove>
40006928: 90 12 23 f8 or %o0, 0x3f8, %o0 ! 4001b3f8 <_Per_CPU_Information+0x38>
&cpu->Watchdog.Header[ PER_CPU_WATCHDOG_TICKS ],
the_watchdog,
now
);
if ( ticks_initial != 0 ) {
4000692c: 80 a6 a0 00 cmp %i2, 0
40006930: 02 80 00 0e be 40006968 <ualarm+0xac>
40006934: a0 06 40 10 add %i1, %l0, %l0
_POSIX_signals_Ualarm_interval = ticks_interval;
40006938: 03 10 00 6a sethi %hi(0x4001a800), %g1
return ( us + us_per_tick - 1 ) / us_per_tick;
4000693c: 81 80 20 00 wr %g0, %y
40006940: 01 00 00 00 nop
40006944: 01 00 00 00 nop
40006948: 01 00 00 00 nop
4000694c: 84 74 00 11 udiv %l0, %l1, %g2
cpu = _Per_CPU_Get();
_Watchdog_Set_CPU( the_watchdog, cpu );
_Watchdog_Insert(
40006950: 96 84 c0 1a addcc %l3, %i2, %o3
40006954: 92 16 e2 d8 or %i3, 0x2d8, %o1
40006958: 94 44 a0 00 addx %l2, 0, %o2
_POSIX_signals_Ualarm_interval = ticks_interval;
4000695c: c4 20 61 0c st %g2, [ %g1 + 0x10c ]
_Watchdog_Insert(
40006960: 40 00 15 de call 4000c0d8 <_Watchdog_Insert>
40006964: 90 01 a0 38 add %g6, 0x38, %o0
register uint32_t _psr __asm__("g1") = psr; /* input to trap handler */
40006968: 82 10 00 18 mov %i0, %g1
<== NOT EXECUTED
__asm__ volatile ( "ta %0\nnop\n" :: "i" (SPARC_SWTRAP_IRQEN), "r" (_psr));
4000696c: 91 d0 20 0a ta 0xa
<== NOT EXECUTED
40006970: 01 00 00 00 nop
_ISR_lock_Release_and_ISR_enable(
&_POSIX_signals_Ualarm_lock,
&lock_context
);
remaining *= rtems_configuration_get_microseconds_per_tick();
40006974: f0 07 60 14 ld [ %i5 + 0x14 ], %i0
return remaining;
}
40006978: b0 5f 00 18 smul %i4, %i0, %i0
4000697c: 81 c7 e0 08 ret
40006980: 81 e8 00 00 restore
if ( now < expire ) {
40006984: 28 bf ff e6 bleu,a 4000691c <ualarm+0x60>
40006988: b8 10 20 00 clr %i4
4000698c: 10 bf ff e4 b 4000691c <ualarm+0x60>
40006990: b8 27 00 13 sub %i4, %l3, %i4