RTEMS-6
Annotated Report
score
Mon Mar 1 00:11:09 2021
00000000400274f0 <_CORE_message_queue_Broadcast>:
const void *buffer,
size_t size,
uint32_t *count,
Thread_queue_Context *queue_context
)
{
400274f0: a9bb7bfd stp x29, x30, [sp, #-80]!
400274f4: 910003fd mov x29, sp
400274f8: a90153f3 stp x19, x20, [sp, #16]
400274fc: aa0003f4 mov x20, x0
Thread_Control *the_thread;
uint32_t number_broadcasted;
if ( size > the_message_queue->maximum_message_size ) {
40027500: f9401400 ldr x0, [x0, #40]
{
40027504: a9025bf5 stp x21, x22, [sp, #32]
40027508: aa0403f5 mov x21, x4
if ( size > the_message_queue->maximum_message_size ) {
4002750c: eb02001f cmp x0, x2
40027510: 54000543 b.cc 400275b8 <_CORE_message_queue_Broadcast+0xc8> // b.lo, b.ul, b.last
number_broadcasted = 0;
_CORE_message_queue_Acquire_critical( the_message_queue, queue_context );
while (
40027514: a90363f7 stp x23, x24, [sp, #48]
40027518: aa0203f6 mov x22, x2
*
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
4002751c: b9402697 ldr w23, [x20, #36]
40027520: f90023f9 str x25, [sp, #64]
40027524: aa0103f8 mov x24, x1
40027528: aa0303f9 mov x25, x3
4002752c: 35000557 cbnz w23, 400275d4 <_CORE_message_queue_Broadcast+0xe4>
RTEMS_INLINE_ROUTINE Thread_Control *_Thread_queue_First_locked(
Thread_queue_Control *the_thread_queue,
const Thread_queue_Operations *operations
)
{
Thread_queue_Heads *heads = the_thread_queue->Queue.heads;
40027530: f9400280 ldr x0, [x20]
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
the_thread = _Thread_queue_First_locked(
40027534: f9400e81 ldr x1, [x20, #24]
if ( heads != NULL ) {
40027538: b40002c0 cbz x0, 40027590 <_CORE_message_queue_Broadcast+0xa0>
return ( *operations->first )( heads );
4002753c: f9401021 ldr x1, [x1, #32]
40027540: d63f0020 blr x1
40027544: aa0003f3 mov x19, x0
memcpy(destination, source, size);
40027548: aa1803e1 mov x1, x24
4002754c: aa1603e2 mov x2, x22
&the_message_queue->Wait_queue,
the_message_queue->operations
);
if ( the_thread == NULL ) {
40027550: b4000200 cbz x0, 40027590 <_CORE_message_queue_Broadcast+0xa0> <== NEVER TAKEN
memcpy(destination, source, size);
40027554: a9478003 ldp x3, x0, [x0, #120]
return NULL;
}
*(size_t *) the_thread->Wait.return_argument = size;
40027558: f9000076 str x22, [x3]
the_thread->Wait.count = (uint32_t) submit_type;
4002755c: b900727f str wzr, [x19, #112]
0,
queue_context
)
)
) {
number_broadcasted += 1;
40027560: 110006f7 add w23, w23, #0x1
memcpy(destination, source, size);
40027564: 94002c04 bl 40032574 <memcpy>
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
_Thread_queue_Extract_critical(
40027568: f9400e81 ldr x1, [x20, #24]
4002756c: aa1503e3 mov x3, x21
40027570: aa1303e2 mov x2, x19
40027574: aa1403e0 mov x0, x20
40027578: 9400076e bl 40029330 <_Thread_queue_Extract_critical>
__asm__ volatile (
4002757c: d53b4220 mrs x0, daif
40027580: d50342df msr daifset, #0x2
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40027584: b90002a0 str w0, [x21]
if ( the_message_queue->number_of_pending_messages != 0 ) {
40027588: b9402680 ldr w0, [x20, #36]
4002758c: 34fffd20 cbz w0, 40027530 <_CORE_message_queue_Broadcast+0x40> <== ALWAYS TAKEN
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
40027590: b94002a0 ldr w0, [x21]
__asm__ volatile (
40027594: d51b4220 msr daif, x0
_CORE_message_queue_Acquire( the_message_queue, queue_context );
}
_CORE_message_queue_Release( the_message_queue, queue_context );
*count = number_broadcasted;
40027598: b9000337 str w23, [x25]
return STATUS_SUCCESSFUL;
4002759c: 52800000 mov w0, #0x0 // #0
}
400275a0: a94153f3 ldp x19, x20, [sp, #16]
400275a4: a9425bf5 ldp x21, x22, [sp, #32]
*count = number_broadcasted;
400275a8: a94363f7 ldp x23, x24, [sp, #48]
400275ac: f94023f9 ldr x25, [sp, #64]
}
400275b0: a8c57bfd ldp x29, x30, [sp], #80
400275b4: d65f03c0 ret
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
400275b8: b9400080 ldr w0, [x4]
400275bc: d51b4220 msr daif, x0
return STATUS_MESSAGE_INVALID_SIZE;
400275c0: 528f4100 mov w0, #0x7a08 // #31240
}
400275c4: a94153f3 ldp x19, x20, [sp, #16]
400275c8: a9425bf5 ldp x21, x22, [sp, #32]
400275cc: a8c57bfd ldp x29, x30, [sp], #80
400275d0: d65f03c0 ret
number_broadcasted = 0;
400275d4: 52800017 mov w23, #0x0 // #0
400275d8: 17ffffee b 40027590 <_CORE_message_queue_Broadcast+0xa0>
400275dc: 00000000 udf #0
000000004002e460 <_CORE_message_queue_Seize>:
void *buffer,
size_t *size_p,
bool wait,
Thread_queue_Context *queue_context
)
{
4002e460: a9bd7bfd stp x29, x30, [sp, #-48]!
return &the_chain->Tail.Node;
4002e464: 9100e006 add x6, x0, #0x38
4002e468: 910003fd mov x29, sp
4002e46c: a90153f3 stp x19, x20, [sp, #16]
4002e470: aa0003f3 mov x19, x0
return _Chain_Immutable_head( the_chain )->next;
4002e474: f9401814 ldr x20, [x0, #48]
4002e478: a9025bf5 stp x21, x22, [sp, #32]
4002e47c: aa0103f5 mov x21, x1
4002e480: aa0503f6 mov x22, x5
if ( !_Chain_Is_empty(the_chain))
4002e484: eb06029f cmp x20, x6
4002e488: 54000660 b.eq 4002e554 <_CORE_message_queue_Seize+0xf4> // b.none
new_first = old_first->next;
4002e48c: f9400284 ldr x4, [x20]
head->next = new_first;
4002e490: 9100c005 add x5, x0, #0x30
CORE_message_queue_Buffer *the_message;
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
4002e494: b9402661 ldr w1, [x19, #36]
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
4002e498: aa0203e0 mov x0, x2
*size_p = the_message->size;
4002e49c: f9400a82 ldr x2, [x20, #16]
4002e4a0: f9001a64 str x4, [x19, #48]
new_first->previous = head;
4002e4a4: f9000485 str x5, [x4, #8]
the_message_queue->number_of_pending_messages -= 1;
4002e4a8: 51000421 sub w1, w1, #0x1
4002e4ac: b9002661 str w1, [x19, #36]
4002e4b0: 91008281 add x1, x20, #0x20
*size_p = the_message->size;
4002e4b4: f9000062 str x2, [x3]
executing->Wait.count =
4002e4b8: b9401a83 ldr w3, [x20, #24]
4002e4bc: b90072a3 str w3, [x21, #112]
4002e4c0: 94002a3f bl 40038dbc <memcpy>
Thread_queue_Heads *heads = the_thread_queue->Queue.heads;
4002e4c4: f9400260 ldr x0, [x19]
* is not, then we can go ahead and free the buffer.
*
* NOTE: If we note that the queue was not full before this receive,
* then we can avoid this dequeue.
*/
the_thread = _Thread_queue_First_locked(
4002e4c8: f9400e61 ldr x1, [x19, #24]
if ( heads != NULL ) {
4002e4cc: b40002a0 cbz x0, 4002e520 <_CORE_message_queue_Seize+0xc0>
return ( *operations->first )( heads );
4002e4d0: f9401021 ldr x1, [x1, #32]
4002e4d4: d63f0020 blr x1
4002e4d8: aa0003f5 mov x21, x0
&the_message_queue->Wait_queue,
the_message_queue->operations
);
if ( the_thread == NULL ) {
4002e4dc: b4000220 cbz x0, 4002e520 <_CORE_message_queue_Seize+0xc0> <== NEVER TAKEN
/*
* There was a thread waiting to send a message. This code
* puts the messages in the message queue on behalf of the
* waiting task.
*/
_CORE_message_queue_Insert_message(
4002e4e0: b94072a4 ldr w4, [x21, #112]
4002e4e4: aa1403e1 mov x1, x20
4002e4e8: b9408aa3 ldr w3, [x21, #136]
4002e4ec: aa1303e0 mov x0, x19
4002e4f0: f94042a2 ldr x2, [x21, #128]
4002e4f4: 9400198b bl 40034b20 <_CORE_message_queue_Insert_message>
the_message,
the_thread->Wait.return_argument_second.immutable_object,
(size_t) the_thread->Wait.option,
(CORE_message_queue_Submit_types) the_thread->Wait.count
);
_Thread_queue_Extract_critical(
4002e4f8: f9400e61 ldr x1, [x19, #24]
4002e4fc: aa1303e0 mov x0, x19
4002e500: aa1603e3 mov x3, x22
4002e504: aa1503e2 mov x2, x21
4002e508: 94000cf2 bl 400318d0 <_Thread_queue_Extract_critical>
&the_message_queue->Wait_queue.Queue,
the_message_queue->operations,
the_thread,
queue_context
);
return STATUS_SUCCESSFUL;
4002e50c: 52800000 mov w0, #0x0 // #0
the_message_queue->operations,
executing,
queue_context
);
return _Thread_Wait_get_status( executing );
}
4002e510: a94153f3 ldp x19, x20, [sp, #16]
4002e514: a9425bf5 ldp x21, x22, [sp, #32]
4002e518: a8c37bfd ldp x29, x30, [sp], #48
4002e51c: d65f03c0 ret
old_last = tail->previous;
4002e520: 9101a273 add x19, x19, #0x68
4002e524: f9400660 ldr x0, [x19, #8]
the_node->next = tail;
4002e528: f9000293 str x19, [x20]
tail->previous = the_node;
4002e52c: f9000674 str x20, [x19, #8]
old_last->next = the_node;
4002e530: f9000014 str x20, [x0]
the_node->previous = old_last;
4002e534: f9000680 str x0, [x20, #8]
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002e538: b94002c0 ldr w0, [x22]
4002e53c: d51b4220 msr daif, x0
return STATUS_SUCCESSFUL;
4002e540: 52800000 mov w0, #0x0 // #0
}
4002e544: a94153f3 ldp x19, x20, [sp, #16]
4002e548: a9425bf5 ldp x21, x22, [sp, #32]
4002e54c: a8c37bfd ldp x29, x30, [sp], #48
4002e550: d65f03c0 ret
if ( !wait ) {
4002e554: 12001c84 and w4, w4, #0xff
4002e558: 34000144 cbz w4, 4002e580 <_CORE_message_queue_Seize+0x120>
_Thread_queue_Enqueue(
4002e55c: f9400c01 ldr x1, [x0, #24]
executing->Wait.return_argument_second.mutable_object = buffer;
4002e560: a9078aa3 stp x3, x2, [x21, #120]
queue_context->thread_state = thread_state;
4002e564: 52800202 mov w2, #0x10 // #16
4002e568: b90004a2 str w2, [x5, #4]
_Thread_queue_Enqueue(
4002e56c: aa0503e3 mov x3, x5
4002e570: aa1503e2 mov x2, x21
4002e574: 94000c63 bl 40031700 <_Thread_queue_Enqueue>
return (Status_Control) the_thread->Wait.return_code;
4002e578: b9408ea0 ldr w0, [x21, #140]
return _Thread_Wait_get_status( executing );
4002e57c: 17ffffe5 b 4002e510 <_CORE_message_queue_Seize+0xb0>
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002e580: b94000a0 ldr w0, [x5]
4002e584: d51b4220 msr daif, x0
return STATUS_UNSATISFIED;
4002e588: 528161a0 mov w0, #0xb0d // #2829
4002e58c: 17ffffe1 b 4002e510 <_CORE_message_queue_Seize+0xb0>
000000004002e590 <_CORE_message_queue_Submit>:
size_t size,
CORE_message_queue_Submit_types submit_type,
bool wait,
Thread_queue_Context *queue_context
)
{
4002e590: a9bb7bfd stp x29, x30, [sp, #-80]!
4002e594: 910003fd mov x29, sp
4002e598: a90153f3 stp x19, x20, [sp, #16]
4002e59c: aa0003f3 mov x19, x0
CORE_message_queue_Buffer *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
4002e5a0: f9401400 ldr x0, [x0, #40]
{
4002e5a4: a9025bf5 stp x21, x22, [sp, #32]
4002e5a8: aa0603f5 mov x21, x6
if ( size > the_message_queue->maximum_message_size ) {
4002e5ac: eb03001f cmp x0, x3
4002e5b0: 54000783 b.cc 4002e6a0 <_CORE_message_queue_Submit+0x110> // b.lo, b.ul, b.last
*
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
4002e5b4: b9402660 ldr w0, [x19, #36]
4002e5b8: aa0303f4 mov x20, x3
4002e5bc: a90363f7 stp x23, x24, [sp, #48]
4002e5c0: 2a0403f6 mov w22, w4
4002e5c4: aa0103f8 mov x24, x1
4002e5c8: a9046bf9 stp x25, x26, [sp, #64]
4002e5cc: aa0203f9 mov x25, x2
4002e5d0: 12001cba and w26, w5, #0xff
4002e5d4: 35000340 cbnz w0, 4002e63c <_CORE_message_queue_Submit+0xac>
Thread_queue_Heads *heads = the_thread_queue->Queue.heads;
4002e5d8: f9400260 ldr x0, [x19]
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
the_thread = _Thread_queue_First_locked(
4002e5dc: f9400e61 ldr x1, [x19, #24]
if ( heads != NULL ) {
4002e5e0: b40002e0 cbz x0, 4002e63c <_CORE_message_queue_Submit+0xac>
return ( *operations->first )( heads );
4002e5e4: f9401021 ldr x1, [x1, #32]
4002e5e8: d63f0020 blr x1
4002e5ec: aa0003f7 mov x23, x0
&the_message_queue->Wait_queue,
the_message_queue->operations
);
if ( the_thread == NULL ) {
4002e5f0: b4000260 cbz x0, 4002e63c <_CORE_message_queue_Submit+0xac> <== NEVER TAKEN
memcpy(destination, source, size);
4002e5f4: a9478003 ldp x3, x0, [x0, #120]
return NULL;
}
*(size_t *) the_thread->Wait.return_argument = size;
4002e5f8: f9000074 str x20, [x3]
the_thread->Wait.count = (uint32_t) submit_type;
4002e5fc: b90072f6 str w22, [x23, #112]
memcpy(destination, source, size);
4002e600: aa1903e1 mov x1, x25
4002e604: aa1403e2 mov x2, x20
4002e608: 940029ed bl 40038dbc <memcpy>
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
_Thread_queue_Extract_critical(
4002e60c: f9400e61 ldr x1, [x19, #24]
4002e610: aa1703e2 mov x2, x23
4002e614: aa1303e0 mov x0, x19
4002e618: aa1503e3 mov x3, x21
4002e61c: 94000cad bl 400318d0 <_Thread_queue_Extract_critical>
buffer,
size,
submit_type,
queue_context
);
if ( the_thread != NULL ) {
4002e620: a94363f7 ldp x23, x24, [sp, #48]
return STATUS_SUCCESSFUL;
4002e624: 52800000 mov w0, #0x0 // #0
4002e628: a9446bf9 ldp x25, x26, [sp, #64]
executing,
queue_context
);
return _Thread_Wait_get_status( executing );
#endif
}
4002e62c: a94153f3 ldp x19, x20, [sp, #16]
4002e630: a9425bf5 ldp x21, x22, [sp, #32]
4002e634: a8c57bfd ldp x29, x30, [sp], #80
4002e638: d65f03c0 ret
return _Chain_Immutable_head( the_chain )->next;
4002e63c: f9403261 ldr x1, [x19, #96]
return &the_chain->Tail.Node;
4002e640: 9101a260 add x0, x19, #0x68
return _Chain_Immutable_head( the_chain )->next;
4002e644: 91018265 add x5, x19, #0x60
if ( !_Chain_Is_empty(the_chain))
4002e648: eb00003f cmp x1, x0
4002e64c: 540004a0 b.eq 4002e6e0 <_CORE_message_queue_Submit+0x150> // b.none
new_first = old_first->next;
4002e650: f9400020 ldr x0, [x1]
head->next = new_first;
4002e654: f9003260 str x0, [x19, #96]
_CORE_message_queue_Insert_message(
4002e658: 2a1603e4 mov w4, w22
4002e65c: aa1403e3 mov x3, x20
4002e660: aa1903e2 mov x2, x25
new_first->previous = head;
4002e664: f9000405 str x5, [x0, #8]
4002e668: aa1303e0 mov x0, x19
4002e66c: 9400192d bl 40034b20 <_CORE_message_queue_Insert_message>
if (
4002e670: b9402660 ldr w0, [x19, #36]
4002e674: 7100041f cmp w0, #0x1
4002e678: 54000220 b.eq 4002e6bc <_CORE_message_queue_Submit+0x12c> // b.none
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002e67c: b94002a0 ldr w0, [x21]
4002e680: d51b4220 msr daif, x0
return STATUS_SUCCESSFUL;
4002e684: 52800000 mov w0, #0x0 // #0
}
4002e688: a94153f3 ldp x19, x20, [sp, #16]
4002e68c: a9425bf5 ldp x21, x22, [sp, #32]
}
4002e690: a94363f7 ldp x23, x24, [sp, #48]
4002e694: a9446bf9 ldp x25, x26, [sp, #64]
4002e698: a8c57bfd ldp x29, x30, [sp], #80
4002e69c: d65f03c0 ret
4002e6a0: b94000c0 ldr w0, [x6]
4002e6a4: d51b4220 msr daif, x0
return STATUS_MESSAGE_INVALID_SIZE;
4002e6a8: 528f4100 mov w0, #0x7a08 // #31240
}
4002e6ac: a94153f3 ldp x19, x20, [sp, #16]
4002e6b0: a9425bf5 ldp x21, x22, [sp, #32]
4002e6b4: a8c57bfd ldp x29, x30, [sp], #80
4002e6b8: d65f03c0 ret
&& the_message_queue->notify_handler != NULL
4002e6bc: f9402e62 ldr x2, [x19, #88]
4002e6c0: b4fffde2 cbz x2, 4002e67c <_CORE_message_queue_Submit+0xec>
( *the_message_queue->notify_handler )(
4002e6c4: aa1303e0 mov x0, x19
4002e6c8: aa1503e1 mov x1, x21
4002e6cc: d63f0040 blr x2
return STATUS_SUCCESSFUL;
4002e6d0: 52800000 mov w0, #0x0 // #0
( *the_message_queue->notify_handler )(
4002e6d4: a94363f7 ldp x23, x24, [sp, #48]
4002e6d8: a9446bf9 ldp x25, x26, [sp, #64]
4002e6dc: 17ffffd4 b 4002e62c <_CORE_message_queue_Submit+0x9c>
if ( !wait ) {
4002e6e0: 3400025a cbz w26, 4002e728 <_CORE_message_queue_Submit+0x198>
if ( _ISR_Is_in_progress() ) {
4002e6e4: 9400058b bl 4002fd10 <_ISR_Is_in_progress>
4002e6e8: 72001c1f tst w0, #0xff
4002e6ec: 540002a1 b.ne 4002e740 <_CORE_message_queue_Submit+0x1b0> // b.any
_Thread_queue_Enqueue(
4002e6f0: f9400e61 ldr x1, [x19, #24]
executing->Wait.count = submit_type;
4002e6f4: b9007316 str w22, [x24, #112]
executing->Wait.return_argument_second.immutable_object = buffer;
4002e6f8: f9004319 str x25, [x24, #128]
queue_context->thread_state = thread_state;
4002e6fc: 52800200 mov w0, #0x10 // #16
executing->Wait.option = (uint32_t) size;
4002e700: b9008b14 str w20, [x24, #136]
_Thread_queue_Enqueue(
4002e704: aa1803e2 mov x2, x24
4002e708: b90006a0 str w0, [x21, #4]
4002e70c: aa1503e3 mov x3, x21
4002e710: aa1303e0 mov x0, x19
4002e714: 94000bfb bl 40031700 <_Thread_queue_Enqueue>
4002e718: b9408f00 ldr w0, [x24, #140]
4002e71c: a94363f7 ldp x23, x24, [sp, #48]
4002e720: a9446bf9 ldp x25, x26, [sp, #64]
return _Thread_Wait_get_status( executing );
4002e724: 17ffffc2 b 4002e62c <_CORE_message_queue_Submit+0x9c>
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002e728: b94002a0 ldr w0, [x21]
4002e72c: d51b4220 msr daif, x0
return STATUS_TOO_MANY;
4002e730: 528160a0 mov w0, #0xb05 // #2821
4002e734: a94363f7 ldp x23, x24, [sp, #48]
4002e738: a9446bf9 ldp x25, x26, [sp, #64]
4002e73c: 17ffffbc b 4002e62c <_CORE_message_queue_Submit+0x9c>
4002e740: b94002a0 ldr w0, [x21]
4002e744: d51b4220 msr daif, x0
return STATUS_MESSAGE_QUEUE_WAIT_IN_ISR;
4002e748: 528161a0 mov w0, #0xb0d // #2829
4002e74c: a94363f7 ldp x23, x24, [sp, #48]
4002e750: a9446bf9 ldp x25, x26, [sp, #64]
4002e754: 17ffffb6 b 4002e62c <_CORE_message_queue_Submit+0x9c>
...
0000000040024c50 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
40024c50: a9bd7bfd stp x29, x30, [sp, #-48]!
40024c54: 910003fd mov x29, sp
40024c58: a90153f3 stp x19, x20, [sp, #16]
40024c5c: aa0003f4 mov x20, x0
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
40024c60: f9401009 ldr x9, [x0, #32]
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
40024c64: b1002020 adds x0, x1, #0x8
40024c68: 54000d22 b.cs 40024e0c <_Heap_Allocate_aligned_with_boundary+0x1bc> // b.hs, b.nlast
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
40024c6c: aa0103e7 mov x7, x1
40024c70: 91003d2a add x10, x9, #0xf
40024c74: b5000c23 cbnz x3, 40024df8 <_Heap_Allocate_aligned_with_boundary+0x1a8>
*
* @return The first block of the free list.
*/
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Free_list_first( Heap_Control *heap )
{
return _Heap_Free_list_head(heap)->next;
40024c78: f9400a81 ldr x1, [x20, #16]
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
40024c7c: eb01029f cmp x20, x1
40024c80: 54000ce0 b.eq 40024e1c <_Heap_Allocate_aligned_with_boundary+0x1cc> // b.none
uintptr_t alloc_begin = alloc_end - alloc_size;
40024c84: d2800108 mov x8, #0x8 // #8
40024c88: cb070108 sub x8, x8, x7
while ( block != free_list_tail ) {
40024c8c: 52800013 mov w19, #0x0 // #0
uintptr_t const free_size = alloc_block_begin - block_begin;
40024c90: 928001eb mov x11, #0xfffffffffffffff0 // #-16
40024c94: f90013f5 str x21, [sp, #32]
/*
* The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag
* field. Thus the value is about one unit larger than the real block
* size. The greater than operator takes this into account.
*/
if ( block->size_and_flag > block_size_floor ) {
40024c98: f9400424 ldr x4, [x1, #8]
);
}
}
/* Statistics */
++search_count;
40024c9c: 11000673 add w19, w19, #0x1
if ( block->size_and_flag > block_size_floor ) {
40024ca0: eb00009f cmp x4, x0
40024ca4: 54000089 b.ls 40024cb4 <_Heap_Allocate_aligned_with_boundary+0x64> // b.plast
*/
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
40024ca8: 91004035 add x21, x1, #0x10
if ( alignment == 0 ) {
40024cac: b5000242 cbnz x2, 40024cf4 <_Heap_Allocate_aligned_with_boundary+0xa4>
if ( alloc_begin != 0 ) {
40024cb0: b5000815 cbnz x21, 40024db0 <_Heap_Allocate_aligned_with_boundary+0x160><== ALWAYS TAKEN
break;
}
block = block->next;
40024cb4: f9400821 ldr x1, [x1, #16]
while ( block != free_list_tail ) {
40024cb8: eb01029f cmp x20, x1
40024cbc: 54fffee1 b.ne 40024c98 <_Heap_Allocate_aligned_with_boundary+0x48> // b.any
40024cc0: f94013f5 ldr x21, [sp, #32]
++stats->allocs;
stats->searches += search_count;
stats->lifetime_allocated += _Heap_Block_size( block );
} else {
/* Statistics */
++stats->failed_allocs;
40024cc4: 91014281 add x1, x20, #0x50
40024cc8: b9404022 ldr w2, [x1, #64]
40024ccc: d2800000 mov x0, #0x0 // #0
40024cd0: 11000442 add w2, w2, #0x1
40024cd4: b9004022 str w2, [x1, #64]
}
/* Statistics */
if ( stats->max_search < search_count ) {
40024cd8: b9403422 ldr w2, [x1, #52]
40024cdc: 6b13005f cmp w2, w19
40024ce0: 54000042 b.cs 40024ce8 <_Heap_Allocate_aligned_with_boundary+0x98> // b.hs, b.nlast
stats->max_search = search_count;
40024ce4: b9003433 str w19, [x1, #52]
}
return (void *) alloc_begin;
}
40024ce8: a94153f3 ldp x19, x20, [sp, #16]
40024cec: a8c37bfd ldp x29, x30, [sp], #48
40024cf0: d65f03c0 ret
*
* @return The block size.
*/
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40024cf4: 927ff885 and x5, x4, #0xfffffffffffffffe
uintptr_t const block_end = block_begin + block_size;
40024cf8: 8b0100a5 add x5, x5, x1
uintptr_t alloc_begin = alloc_end - alloc_size;
40024cfc: 8b050104 add x4, x8, x5
40024d00: f940168d ldr x13, [x20, #40]
return value - (value % alignment);
40024d04: 9ac20886 udiv x6, x4, x2
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
40024d08: cb0d00a5 sub x5, x5, x13
40024d0c: 8b0a00a5 add x5, x5, x10
40024d10: 9b0290c6 msub x6, x6, x2, x4
40024d14: cb060086 sub x6, x4, x6
if ( alloc_begin > alloc_begin_ceiling ) {
40024d18: eb0600bf cmp x5, x6
40024d1c: 54000082 b.cs 40024d2c <_Heap_Allocate_aligned_with_boundary+0xdc> // b.hs, b.nlast
40024d20: 9ac208a4 udiv x4, x5, x2
40024d24: 9b029484 msub x4, x4, x2, x5
40024d28: cb0400a6 sub x6, x5, x4
if ( boundary != 0 ) {
40024d2c: b40002c3 cbz x3, 40024d84 <_Heap_Allocate_aligned_with_boundary+0x134>
alloc_end = alloc_begin + alloc_size;
40024d30: 8b0600ee add x14, x7, x6
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
40024d34: 8b1500ec add x12, x7, x21
40024d38: 9ac309c5 udiv x5, x14, x3
40024d3c: 9b03b8a5 msub x5, x5, x3, x14
40024d40: cb0501c4 sub x4, x14, x5
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
40024d44: eb0401df cmp x14, x4
40024d48: fa4480c2 ccmp x6, x4, #0x2, hi // hi = pmore
40024d4c: 540001c2 b.cs 40024d84 <_Heap_Allocate_aligned_with_boundary+0x134> // b.hs, b.nlast
if ( boundary_line < boundary_floor ) {
40024d50: eb04019f cmp x12, x4
40024d54: 54fffb08 b.hi 40024cb4 <_Heap_Allocate_aligned_with_boundary+0x64> // b.pmore
alloc_begin = boundary_line - alloc_size;
40024d58: cb070084 sub x4, x4, x7
40024d5c: 9ac20886 udiv x6, x4, x2
40024d60: 9b0290c6 msub x6, x6, x2, x4
40024d64: cb060086 sub x6, x4, x6
alloc_end = alloc_begin + alloc_size;
40024d68: 8b0600e5 add x5, x7, x6
40024d6c: 9ac308a4 udiv x4, x5, x3
40024d70: 9b039484 msub x4, x4, x3, x5
40024d74: cb0400a4 sub x4, x5, x4
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
40024d78: eb0400df cmp x6, x4
40024d7c: fa4430a0 ccmp x5, x4, #0x0, cc // cc = lo, ul, last
40024d80: 54fffe88 b.hi 40024d50 <_Heap_Allocate_aligned_with_boundary+0x100> // b.pmore
if ( alloc_begin >= alloc_begin_floor ) {
40024d84: eb1500df cmp x6, x21
40024d88: 54fff963 b.cc 40024cb4 <_Heap_Allocate_aligned_with_boundary+0x64> // b.lo, b.ul, b.last
40024d8c: 9ac908c4 udiv x4, x6, x9
uintptr_t const free_size = alloc_block_begin - block_begin;
40024d90: cb010165 sub x5, x11, x1
40024d94: 9b091484 madd x4, x4, x9, x5
if ( free_size >= min_block_size || free_size == 0 ) {
40024d98: f100009f cmp x4, #0x0
40024d9c: fa4411a0 ccmp x13, x4, #0x0, ne // ne = any
40024da0: 54fff8a8 b.hi 40024cb4 <_Heap_Allocate_aligned_with_boundary+0x64> // b.pmore
40024da4: aa0603f5 mov x21, x6
if ( alloc_begin != 0 ) {
40024da8: b4fff875 cbz x21, 40024cb4 <_Heap_Allocate_aligned_with_boundary+0x64> <== NEVER TAKEN
40024dac: d503201f nop
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
40024db0: aa1503e2 mov x2, x21
40024db4: aa0703e3 mov x3, x7
40024db8: aa1403e0 mov x0, x20
40024dbc: 940000d9 bl 40025120 <_Heap_Block_allocate>
++stats->allocs;
40024dc0: 91014281 add x1, x20, #0x50
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
40024dc4: aa0003e2 mov x2, x0
stats->lifetime_allocated += _Heap_Block_size( block );
40024dc8: f9402a85 ldr x5, [x20, #80]
return (void *) alloc_begin;
40024dcc: aa1503e0 mov x0, x21
++stats->allocs;
40024dd0: 29470c24 ldp w4, w3, [x1, #56]
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40024dd4: f9400442 ldr x2, [x2, #8]
stats->searches += search_count;
40024dd8: 0b130084 add w4, w4, w19
++stats->allocs;
40024ddc: 11000463 add w3, w3, #0x1
40024de0: 927ff842 and x2, x2, #0xfffffffffffffffe
40024de4: f94013f5 ldr x21, [sp, #32]
40024de8: 29070c24 stp w4, w3, [x1, #56]
stats->lifetime_allocated += _Heap_Block_size( block );
40024dec: 8b050042 add x2, x2, x5
40024df0: f9002a82 str x2, [x20, #80]
40024df4: 17ffffb9 b 40024cd8 <_Heap_Allocate_aligned_with_boundary+0x88>
if ( boundary < alloc_size ) {
40024df8: eb03003f cmp x1, x3
40024dfc: 54000088 b.hi 40024e0c <_Heap_Allocate_aligned_with_boundary+0x1bc> // b.pmore
alignment = page_size;
40024e00: f100005f cmp x2, #0x0
40024e04: 9a891042 csel x2, x2, x9, ne // ne = any
40024e08: 17ffff9c b 40024c78 <_Heap_Allocate_aligned_with_boundary+0x28>
return NULL;
40024e0c: d2800000 mov x0, #0x0 // #0
}
40024e10: a94153f3 ldp x19, x20, [sp, #16]
40024e14: a8c37bfd ldp x29, x30, [sp], #48
40024e18: d65f03c0 ret
while ( block != free_list_tail ) {
40024e1c: 52800013 mov w19, #0x0 // #0
40024e20: 17ffffa9 b 40024cc4 <_Heap_Allocate_aligned_with_boundary+0x74>
...
0000000040028ff0 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t unused RTEMS_UNUSED
)
{
40028ff0: a9b87bfd stp x29, x30, [sp, #-128]!
40028ff4: 910003fd mov x29, sp
40028ff8: a90153f3 stp x19, x20, [sp, #16]
40028ffc: aa0103f3 mov x19, x1
40029000: a9025bf5 stp x21, x22, [sp, #32]
40029004: ab020036 adds x22, x1, x2
40029008: a9046bf9 stp x25, x26, [sp, #64]
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
4002900c: a9077fff stp xzr, xzr, [sp, #112]
Heap_Block *const first_block = heap->first_block;
40029010: f9402019 ldr x25, [x0, #64]
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
40029014: 54000482 b.cs 400290a4 <_Heap_Extend+0xb4> // b.hs, b.nlast
40029018: a90363f7 stp x23, x24, [sp, #48]
4002901c: aa0003f7 mov x23, x0
40029020: aa0203e1 mov x1, x2
uintptr_t const free_size = stats->free_size;
40029024: 9101401a add x26, x0, #0x50
if ( extend_area_end < extend_area_begin ) {
return 0;
}
extend_area_ok = _Heap_Get_first_and_last_block(
40029028: 9101e3e5 add x5, sp, #0x78
4002902c: a9420ef8 ldp x24, x3, [x23, #32]
40029030: 9101c3e4 add x4, sp, #0x70
40029034: aa1303e0 mov x0, x19
uintptr_t const free_size = stats->free_size;
40029038: f9400f55 ldr x21, [x26, #24]
extend_area_ok = _Heap_Get_first_and_last_block(
4002903c: aa1803e2 mov x2, x24
40029040: 97ffefb4 bl 40024f10 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
40029044: 72001c1f tst w0, #0xff
40029048: 540013e0 b.eq 400292c4 <_Heap_Extend+0x2d4> // b.none
4002904c: a90573fb stp x27, x28, [sp, #80]
Heap_Block *const first_block = heap->first_block;
40029050: aa1903e3 mov x3, x25
40029054: aa1303f4 mov x20, x19
return 0;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
40029058: eb19007f cmp x3, x25
4002905c: aa0303e0 mov x0, x3
Heap_Block *link_above_block = NULL;
40029060: d280001b mov x27, #0x0 // #0
Heap_Block *link_below_block = NULL;
40029064: d2800002 mov x2, #0x0 // #0
Heap_Block *merge_above_block = NULL;
40029068: d280001c mov x28, #0x0 // #0
Heap_Block *merge_below_block = NULL;
4002906c: d2800006 mov x6, #0x0 // #0
(uintptr_t) start_block : heap->area_begin;
40029070: 54000401 b.ne 400290f0 <_Heap_Extend+0x100> // b.any <== NEVER TAKEN
40029074: d503201f nop
uintptr_t const sub_area_end = start_block->prev_size;
40029078: f9400064 ldr x4, [x3]
(uintptr_t) start_block : heap->area_begin;
4002907c: f9401ae0 ldr x0, [x23, #48]
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
40029080: eb04027f cmp x19, x4
return value - (value % alignment);
40029084: 9ad80881 udiv x1, x4, x24
- HEAP_BLOCK_HEADER_SIZE);
40029088: d1004085 sub x5, x4, #0x10
if (
4002908c: fa563002 ccmp x0, x22, #0x2, cc // cc = lo, ul, last
return value - (value % alignment);
40029090: 9b189021 msub x1, x1, x24, x4
- HEAP_BLOCK_HEADER_SIZE);
40029094: cb0100a5 sub x5, x5, x1
40029098: 540003c2 b.cs 40029110 <_Heap_Extend+0x120> // b.hs, b.nlast
4002909c: a94363f7 ldp x23, x24, [sp, #48]
400290a0: a94573fb ldp x27, x28, [sp, #80]
return 0;
400290a4: d2800000 mov x0, #0x0 // #0
/* Statistics */
stats->size += extended_size;
return extended_size;
}
400290a8: a94153f3 ldp x19, x20, [sp, #16]
400290ac: a9425bf5 ldp x21, x22, [sp, #32]
400290b0: a9446bf9 ldp x25, x26, [sp, #64]
400290b4: a8c87bfd ldp x29, x30, [sp], #128
400290b8: d65f03c0 ret
} else if ( extend_area_end < sub_area_end ) {
400290bc: eb0402df cmp x22, x4
400290c0: 9a832042 csel x2, x2, x3, cs // cs = hs, nlast
if ( sub_area_end == extend_area_begin ) {
400290c4: eb04027f cmp x19, x4
400290c8: 540002e0 b.eq 40029124 <_Heap_Extend+0x134> // b.none
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
400290cc: f94004a3 ldr x3, [x5, #8]
link_above_block = end_block;
400290d0: 9a85937b csel x27, x27, x5, ls // ls = plast
400290d4: 927ff863 and x3, x3, #0xfffffffffffffffe
return (Heap_Block *) ((uintptr_t) block + offset);
400290d8: 8b050063 add x3, x3, x5
} while ( start_block != first_block );
400290dc: eb03033f cmp x25, x3
400290e0: 54000300 b.eq 40029140 <_Heap_Extend+0x150> // b.none
(uintptr_t) start_block : heap->area_begin;
400290e4: eb19007f cmp x3, x25
400290e8: aa0303e0 mov x0, x3
400290ec: 54fffc60 b.eq 40029078 <_Heap_Extend+0x88> // b.none <== NEVER TAKEN
uintptr_t const sub_area_end = start_block->prev_size;
400290f0: f9400064 ldr x4, [x3]
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
400290f4: eb04027f cmp x19, x4
- HEAP_BLOCK_HEADER_SIZE);
400290f8: d1004085 sub x5, x4, #0x10
return value - (value % alignment);
400290fc: 9ad80881 udiv x1, x4, x24
if (
40029100: fa563002 ccmp x0, x22, #0x2, cc // cc = lo, ul, last
40029104: 9b189021 msub x1, x1, x24, x4
- HEAP_BLOCK_HEADER_SIZE);
40029108: cb0100a5 sub x5, x5, x1
4002910c: 54fffc83 b.cc 4002909c <_Heap_Extend+0xac> // b.lo, b.ul, b.last
if ( extend_area_end == sub_area_begin ) {
40029110: eb16001f cmp x0, x22
40029114: 54fffd41 b.ne 400290bc <_Heap_Extend+0xcc> // b.any
40029118: aa0303e6 mov x6, x3
if ( sub_area_end == extend_area_begin ) {
4002911c: eb04027f cmp x19, x4
40029120: 54fffd61 b.ne 400290cc <_Heap_Extend+0xdc> // b.any <== ALWAYS TAKEN
start_block->prev_size = extend_area_end;
40029124: f9000076 str x22, [x3]
merge_above_block = end_block;
40029128: aa0503fc mov x28, x5
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
4002912c: f94004a3 ldr x3, [x5, #8]
40029130: 927ff863 and x3, x3, #0xfffffffffffffffe
return (Heap_Block *) ((uintptr_t) block + offset);
40029134: 8b050063 add x3, x3, x5
} while ( start_block != first_block );
40029138: eb03033f cmp x25, x3
4002913c: 54fffd41 b.ne 400290e4 <_Heap_Extend+0xf4> // b.any
if ( extend_area_begin < heap->area_begin ) {
40029140: f9401ae0 ldr x0, [x23, #48]
40029144: eb13001f cmp x0, x19
40029148: 54000cc9 b.ls 400292e0 <_Heap_Extend+0x2f0> // b.plast
heap->area_begin = extend_area_begin;
4002914c: f9001af3 str x19, [x23, #48]
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
40029150: a94707e0 ldp x0, x1, [sp, #112]
extend_first_block_size =
40029154: cb000023 sub x3, x1, x0
extend_first_block_size | HEAP_PREV_BLOCK_USED;
40029158: b2400064 orr x4, x3, #0x1
extend_first_block->size_and_flag =
4002915c: a9001016 stp x22, x4, [x0]
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
40029160: f94022e4 ldr x4, [x23, #64]
extend_last_block->size_and_flag = 0;
40029164: a9007c23 stp x3, xzr, [x1]
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
40029168: eb00009f cmp x4, x0
4002916c: 54000b09 b.ls 400292cc <_Heap_Extend+0x2dc> // b.plast
heap->first_block = extend_first_block;
40029170: f90022e0 str x0, [x23, #64]
if ( merge_below_block != NULL ) {
40029174: b4000c06 cbz x6, 400292f4 <_Heap_Extend+0x304>
uintptr_t const page_size = heap->page_size;
40029178: f94012e2 ldr x2, [x23, #32]
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
4002917c: 91004261 add x1, x19, #0x10
uintptr_t remainder = value % alignment;
40029180: 9ac20820 udiv x0, x1, x2
40029184: 9b028400 msub x0, x0, x2, x1
if ( remainder != 0 ) {
40029188: b40000a0 cbz x0, 4002919c <_Heap_Extend+0x1ac>
return value - remainder + alignment;
4002918c: 8b010041 add x1, x2, x1
40029190: cb000021 sub x1, x1, x0
uintptr_t const new_first_block_begin =
40029194: d1004034 sub x20, x1, #0x10
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
40029198: aa1403f3 mov x19, x20
++stats->used_blocks;
4002919c: b9403343 ldr w3, [x26, #48]
uintptr_t const new_first_block_size =
400291a0: cb1400c0 sub x0, x6, x20
--stats->frees;
400291a4: b9404742 ldr w2, [x26, #68]
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
400291a8: b2400000 orr x0, x0, #0x1
new_first_block->prev_size = first_block->prev_size;
400291ac: f94000c4 ldr x4, [x6]
--stats->frees;
400291b0: 51000442 sub w2, w2, #0x1
++stats->used_blocks;
400291b4: 11000463 add w3, w3, #0x1
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
400291b8: a9000264 stp x4, x0, [x19]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
400291bc: aa1703e0 mov x0, x23
++stats->used_blocks;
400291c0: b9003343 str w3, [x26, #48]
--stats->frees;
400291c4: b9004742 str w2, [x26, #68]
new_first_block->prev_size = first_block->prev_size;
400291c8: f90037e6 str x6, [sp, #104]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
400291cc: 94000065 bl 40029360 <_Heap_Free>
return _Heap_Free_list_head(heap)->next;
400291d0: f9400ae0 ldr x0, [x23, #16]
}
400291d4: f94037e6 ldr x6, [sp, #104]
Heap_Block *prev = block->prev;
400291d8: a9410801 ldp x1, x2, [x0, #16]
prev->next = next;
400291dc: f9000841 str x1, [x2, #16]
next->prev = prev;
400291e0: f9000c22 str x2, [x1, #24]
Heap_Block *prev = block_next->prev;
400291e4: f9400ee1 ldr x1, [x23, #24]
new_block->prev = prev;
400291e8: a9010417 stp x23, x1, [x0, #16]
prev->next = new_block;
400291ec: f9000820 str x0, [x1, #16]
block_next->prev = new_block;
400291f0: f9000ee0 str x0, [x23, #24]
if ( merge_above_block != NULL ) {
400291f4: b40008bc cbz x28, 40029308 <_Heap_Extend+0x318>
uintptr_t const last_block_new_size = _Heap_Align_down(
400291f8: d10042d6 sub x22, x22, #0x10
++stats->used_blocks;
400291fc: b9403346 ldr w6, [x26, #48]
return value - (value % alignment);
40029200: f94012e7 ldr x7, [x23, #32]
uintptr_t const last_block_new_size = _Heap_Align_down(
40029204: cb1c02c3 sub x3, x22, x28
(last_block->size_and_flag - last_block_new_size)
40029208: f9400782 ldr x2, [x28, #8]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
4002920c: 91004381 add x1, x28, #0x10
40029210: 9ac70864 udiv x4, x3, x7
--stats->frees;
40029214: b9404745 ldr w5, [x26, #68]
(last_block->size_and_flag - last_block_new_size)
40029218: 8b020382 add x2, x28, x2
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
4002921c: aa1703e0 mov x0, x23
++stats->used_blocks;
40029220: 110004c6 add w6, w6, #0x1
--stats->frees;
40029224: 510004a5 sub w5, w5, #0x1
40029228: 9b078c84 msub x4, x4, x7, x3
4002922c: cb040063 sub x3, x3, x4
(last_block->size_and_flag - last_block_new_size)
40029230: cb160096 sub x22, x4, x22
new_last_block->size_and_flag =
40029234: 8b030384 add x4, x28, x3
(last_block->size_and_flag - last_block_new_size)
40029238: 8b160042 add x2, x2, x22
| HEAP_PREV_BLOCK_USED;
4002923c: b2400042 orr x2, x2, #0x1
new_last_block->size_and_flag =
40029240: f9000482 str x2, [x4, #8]
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
40029244: f9400782 ldr x2, [x28, #8]
40029248: 92400042 and x2, x2, #0x1
block->size_and_flag = size | flag;
4002924c: aa030043 orr x3, x2, x3
40029250: f9000783 str x3, [x28, #8]
++stats->used_blocks;
40029254: b9003346 str w6, [x26, #48]
--stats->frees;
40029258: b9004745 str w5, [x26, #68]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
4002925c: 94000041 bl 40029360 <_Heap_Free>
return _Heap_Free_list_head(heap)->next;
40029260: f9400ae0 ldr x0, [x23, #16]
Heap_Block *prev = block->prev;
40029264: a9410801 ldp x1, x2, [x0, #16]
prev->next = next;
40029268: f9000841 str x1, [x2, #16]
next->prev = prev;
4002926c: f9000c22 str x2, [x1, #24]
Heap_Block *prev = block_next->prev;
40029270: f9400ee1 ldr x1, [x23, #24]
new_block->prev = prev;
40029274: a9010417 stp x23, x1, [x0, #16]
prev->next = new_block;
40029278: f9000820 str x0, [x1, #16]
block_next->prev = new_block;
4002927c: f9000ee0 str x0, [x23, #24]
_Heap_Block_set_size(
40029280: a9440ee1 ldp x1, x3, [x23, #64]
extended_size = stats->free_size - free_size;
40029284: a9410342 ldp x2, x0, [x26, #16]
stats->size += extended_size;
40029288: a94363f7 ldp x23, x24, [sp, #48]
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
4002928c: f9400464 ldr x4, [x3, #8]
_Heap_Block_set_size(
40029290: cb030021 sub x1, x1, x3
extended_size = stats->free_size - free_size;
40029294: cb150000 sub x0, x0, x21
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
40029298: 92400084 and x4, x4, #0x1
block->size_and_flag = size | flag;
4002929c: aa040021 orr x1, x1, x4
stats->size += extended_size;
400292a0: a94573fb ldp x27, x28, [sp, #80]
400292a4: f9000461 str x1, [x3, #8]
400292a8: 8b000041 add x1, x2, x0
400292ac: f9000b41 str x1, [x26, #16]
}
400292b0: a94153f3 ldp x19, x20, [sp, #16]
400292b4: a9425bf5 ldp x21, x22, [sp, #32]
400292b8: a9446bf9 ldp x25, x26, [sp, #64]
400292bc: a8c87bfd ldp x29, x30, [sp], #128
400292c0: d65f03c0 ret
400292c4: a94363f7 ldp x23, x24, [sp, #48]
400292c8: 17ffff77 b 400290a4 <_Heap_Extend+0xb4>
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
400292cc: f94026e0 ldr x0, [x23, #72]
400292d0: eb01001f cmp x0, x1
400292d4: 54fff502 b.cs 40029174 <_Heap_Extend+0x184> // b.hs, b.nlast
heap->last_block = extend_last_block;
400292d8: f90026e1 str x1, [x23, #72]
400292dc: 17ffffa6 b 40029174 <_Heap_Extend+0x184>
} else if ( heap->area_end < extend_area_end ) {
400292e0: f9401ee0 ldr x0, [x23, #56]
400292e4: eb16001f cmp x0, x22
400292e8: 54fff342 b.cs 40029150 <_Heap_Extend+0x160> // b.hs, b.nlast
heap->area_end = extend_area_end;
400292ec: f9001ef6 str x22, [x23, #56]
400292f0: 17ffff98 b 40029150 <_Heap_Extend+0x160>
} else if ( link_below_block != NULL ) {
400292f4: b4fff802 cbz x2, 400291f4 <_Heap_Extend+0x204>
(link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED;
400292f8: cb010040 sub x0, x2, x1
400292fc: b2400000 orr x0, x0, #0x1
last_block->size_and_flag =
40029300: f9000420 str x0, [x1, #8]
}
40029304: 17ffffbc b 400291f4 <_Heap_Extend+0x204>
} else if ( link_above_block != NULL ) {
40029308: b400015b cbz x27, 40029330 <_Heap_Extend+0x340>
_Heap_Link_above(
4002930c: a9470be0 ldp x0, x2, [sp, #112]
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
40029310: f9400761 ldr x1, [x27, #8]
40029314: 92400021 and x1, x1, #0x1
_Heap_Block_set_size( link, first_block_begin - link_begin );
40029318: cb1b0000 sub x0, x0, x27
block->size_and_flag = size | flag;
4002931c: aa010000 orr x0, x0, x1
40029320: f9000760 str x0, [x27, #8]
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
40029324: f9400440 ldr x0, [x2, #8]
40029328: b2400000 orr x0, x0, #0x1
4002932c: f9000440 str x0, [x2, #8]
if ( merge_below_block == NULL && merge_above_block == NULL ) {
40029330: b5fffa86 cbnz x6, 40029280 <_Heap_Extend+0x290>
_Heap_Free_block( heap, extend_first_block );
40029334: f9403be1 ldr x1, [sp, #112]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
40029338: aa1703e0 mov x0, x23
++stats->used_blocks;
4002933c: b9403343 ldr w3, [x26, #48]
--stats->frees;
40029340: b9404742 ldr w2, [x26, #68]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ) );
40029344: 91004021 add x1, x1, #0x10
++stats->used_blocks;
40029348: 11000463 add w3, w3, #0x1
4002934c: b9003343 str w3, [x26, #48]
--stats->frees;
40029350: 51000442 sub w2, w2, #0x1
40029354: b9004742 str w2, [x26, #68]
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
40029358: 17ffffc1 b 4002925c <_Heap_Extend+0x26c>
4002935c: 00000000 udf #0
0000000040029360 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
40029360: aa0003e2 mov x2, x0
/*
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
40029364: b4000a21 cbz x1, 400294a8 <_Heap_Free+0x148>
return value - (value % alignment);
40029368: f9401044 ldr x4, [x2, #32]
- HEAP_BLOCK_HEADER_SIZE);
4002936c: d1004026 sub x6, x1, #0x10
return (uintptr_t) block >= (uintptr_t) heap->first_block
40029370: f9402045 ldr x5, [x2, #64]
alloc_begin = (uintptr_t) alloc_begin_ptr;
block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
40029374: 52800000 mov w0, #0x0 // #0
return value - (value % alignment);
40029378: 9ac40823 udiv x3, x1, x4
4002937c: 9b048461 msub x1, x3, x4, x1
- HEAP_BLOCK_HEADER_SIZE);
40029380: cb0100c1 sub x1, x6, x1
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
40029384: eb05003f cmp x1, x5
40029388: 54000583 b.cc 40029438 <_Heap_Free+0xd8> // b.lo, b.ul, b.last
4002938c: f9402448 ldr x8, [x2, #72]
40029390: eb08003f cmp x1, x8
40029394: 54000528 b.hi 40029438 <_Heap_Free+0xd8> // b.pmore
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40029398: f9400426 ldr x6, [x1, #8]
4002939c: 927ff8c7 and x7, x6, #0xfffffffffffffffe
return (Heap_Block *) ((uintptr_t) block + offset);
400293a0: 8b070024 add x4, x1, x7
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
400293a4: eb0400bf cmp x5, x4
400293a8: 54000488 b.hi 40029438 <_Heap_Free+0xd8> // b.pmore <== NEVER TAKEN
400293ac: eb04011f cmp x8, x4
400293b0: 54000443 b.cc 40029438 <_Heap_Free+0xd8> // b.lo, b.ul, b.last
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
400293b4: f9400483 ldr x3, [x4, #8]
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
400293b8: 12000060 and w0, w3, #0x1
400293bc: 360003e3 tbz w3, #0, 40029438 <_Heap_Free+0xd8> <== NEVER TAKEN
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
400293c0: 927ff863 and x3, x3, #0xfffffffffffffffe
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
400293c4: 120000c6 and w6, w6, #0x1
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
400293c8: eb04011f cmp x8, x4
400293cc: 54000380 b.eq 4002943c <_Heap_Free+0xdc> // b.none
400293d0: 8b030089 add x9, x4, x3
400293d4: f9400529 ldr x9, [x9, #8]
400293d8: 37000329 tbnz w9, #0, 4002943c <_Heap_Free+0xdc>
400293dc: 5280002a mov w10, #0x1 // #1
if ( !_Heap_Is_prev_used( block ) ) {
400293e0: 34000326 cbz w6, 40029444 <_Heap_Free+0xe4>
Heap_Block *prev = old_block->prev;
400293e4: a9411085 ldp x5, x4, [x4, #16]
new_block->prev = prev;
400293e8: a9011025 stp x5, x4, [x1, #16]
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
400293ec: 8b0300e3 add x3, x7, x3
next->prev = new_block;
400293f0: f9000ca1 str x1, [x5, #24]
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
400293f4: b2400066 orr x6, x3, #0x1
400293f8: 91014042 add x2, x2, #0x50
prev->next = new_block;
400293fc: f9000881 str x1, [x4, #16]
40029400: f9000426 str x6, [x1, #8]
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
40029404: f8236823 str x3, [x1, x3]
/* Statistics */
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
stats->lifetime_freed += block_size;
40029408: f9400445 ldr x5, [x2, #8]
stats->free_size += block_size;
4002940c: f9400c44 ldr x4, [x2, #24]
stats->lifetime_freed += block_size;
40029410: 8b0700a5 add x5, x5, x7
--stats->used_blocks;
40029414: b9403043 ldr w3, [x2, #48]
++stats->frees;
40029418: b9404441 ldr w1, [x2, #68]
stats->free_size += block_size;
4002941c: 8b070087 add x7, x4, x7
--stats->used_blocks;
40029420: 51000463 sub w3, w3, #0x1
stats->lifetime_freed += block_size;
40029424: f9000445 str x5, [x2, #8]
++stats->frees;
40029428: 11000421 add w1, w1, #0x1
stats->free_size += block_size;
4002942c: f9000c47 str x7, [x2, #24]
--stats->used_blocks;
40029430: b9003043 str w3, [x2, #48]
++stats->frees;
40029434: b9004441 str w1, [x2, #68]
return( true );
}
40029438: d65f03c0 ret
if ( !_Heap_Is_prev_used( block ) ) {
4002943c: 5280000a mov w10, #0x0 // #0
40029440: 35000386 cbnz w6, 400294b0 <_Heap_Free+0x150>
uintptr_t const prev_size = block->prev_size;
40029444: f9400029 ldr x9, [x1]
return (Heap_Block *) ((uintptr_t) block + offset);
40029448: cb090026 sub x6, x1, x9
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
4002944c: eb0500df cmp x6, x5
40029450: 54000283 b.cc 400294a0 <_Heap_Free+0x140> // b.lo, b.ul, b.last <== NEVER TAKEN
40029454: eb0800df cmp x6, x8
40029458: 54000248 b.hi 400294a0 <_Heap_Free+0x140> // b.pmore <== NEVER TAKEN
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
4002945c: f94004c5 ldr x5, [x6, #8]
if ( !_Heap_Is_prev_used ( prev_block) ) {
40029460: 36000205 tbz w5, #0, 400294a0 <_Heap_Free+0x140> <== NEVER TAKEN
uintptr_t const size = block_size + prev_size + next_block_size;
40029464: 8b070129 add x9, x9, x7
if ( next_is_free ) { /* coalesce both */
40029468: 340004aa cbz w10, 400294fc <_Heap_Free+0x19c>
Heap_Block *prev = block->prev;
4002946c: f9400c85 ldr x5, [x4, #24]
uintptr_t const size = block_size + prev_size + next_block_size;
40029470: 8b090063 add x3, x3, x9
Heap_Block *next = block->next;
40029474: f9400884 ldr x4, [x4, #16]
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
40029478: b2400068 orr x8, x3, #0x1
stats->free_blocks -= 1;
4002947c: b9407841 ldr w1, [x2, #120]
40029480: 91014042 add x2, x2, #0x50
prev->next = next;
40029484: f90008a4 str x4, [x5, #16]
next->prev = prev;
40029488: f9000c85 str x5, [x4, #24]
4002948c: 51000421 sub w1, w1, #0x1
40029490: b9002841 str w1, [x2, #40]
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
40029494: f90004c8 str x8, [x6, #8]
next_block->prev_size = size;
40029498: f82368c3 str x3, [x6, x3]
4002949c: 17ffffdb b 40029408 <_Heap_Free+0xa8>
return false;
400294a0: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
}
400294a4: d65f03c0 ret <== NOT EXECUTED
return true;
400294a8: 52800020 mov w0, #0x1 // #1
}
400294ac: d65f03c0 ret
Heap_Block *next = block_before->next;
400294b0: f9400845 ldr x5, [x2, #16]
new_block->prev = block_before;
400294b4: a9010825 stp x5, x2, [x1, #16]
++stats->free_blocks;
400294b8: 91014042 add x2, x2, #0x50
block_before->next = new_block;
400294bc: f81c0041 stur x1, [x2, #-64]
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
400294c0: b24000e3 orr x3, x7, #0x1
if ( stats->max_free_blocks < stats->free_blocks ) {
400294c4: b9402c46 ldr w6, [x2, #44]
next->prev = new_block;
400294c8: f9000ca1 str x1, [x5, #24]
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
400294cc: f9000423 str x3, [x1, #8]
++stats->free_blocks;
400294d0: b9402843 ldr w3, [x2, #40]
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
400294d4: f9400485 ldr x5, [x4, #8]
++stats->free_blocks;
400294d8: 11000463 add w3, w3, #0x1
if ( stats->max_free_blocks < stats->free_blocks ) {
400294dc: 6b06007f cmp w3, w6
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
400294e0: 927ff8a5 and x5, x5, #0xfffffffffffffffe
400294e4: f9000485 str x5, [x4, #8]
next_block->prev_size = block_size;
400294e8: f8276827 str x7, [x1, x7]
++stats->free_blocks;
400294ec: b9002843 str w3, [x2, #40]
if ( stats->max_free_blocks < stats->free_blocks ) {
400294f0: 54fff8c9 b.ls 40029408 <_Heap_Free+0xa8> // b.plast
stats->max_free_blocks = stats->free_blocks;
400294f4: b9002c43 str w3, [x2, #44]
400294f8: 17ffffc4 b 40029408 <_Heap_Free+0xa8>
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
400294fc: b2400123 orr x3, x9, #0x1
40029500: f90004c3 str x3, [x6, #8]
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
40029504: 91014042 add x2, x2, #0x50
40029508: f9400483 ldr x3, [x4, #8]
4002950c: 927ff863 and x3, x3, #0xfffffffffffffffe
40029510: f9000483 str x3, [x4, #8]
next_block->prev_size = size;
40029514: f8276829 str x9, [x1, x7]
40029518: 17ffffbc b 40029408 <_Heap_Free+0xa8>
4002951c: 00000000 udf #0
000000004002d310 <_Heap_Get_free_information>:
return _Heap_Free_list_head(heap)->next;
4002d310: f9400803 ldr x3, [x0, #16]
{
Heap_Block *the_block;
Heap_Block *const tail = _Heap_Free_list_tail(the_heap);
info->number = 0;
info->largest = 0;
4002d314: a9007c3f stp xzr, xzr, [x1]
info->total = 0;
4002d318: f900083f str xzr, [x1, #16]
for(the_block = _Heap_Free_list_first(the_heap);
4002d31c: eb03001f cmp x0, x3
4002d320: 54000260 b.eq 4002d36c <_Heap_Get_free_information+0x5c> // b.none <== NEVER TAKEN
4002d324: d2800025 mov x5, #0x1 // #1
4002d328: d2800006 mov x6, #0x0 // #0
4002d32c: d2800004 mov x4, #0x0 // #0
4002d330: 14000003 b 4002d33c <_Heap_Get_free_information+0x2c>
/* As we always coalesce free blocks, prev block must have been used. */
_HAssert(_Heap_Is_prev_used(the_block));
info->number++;
info->total += the_size;
if ( info->largest < the_size )
4002d334: f9400426 ldr x6, [x1, #8]
4002d338: aa0703e5 mov x5, x7
the_block = the_block->next)
4002d33c: f9400462 ldr x2, [x3, #8]
for(the_block = _Heap_Free_list_first(the_heap);
4002d340: 910004a7 add x7, x5, #0x1
4002d344: 927f7842 and x2, x2, #0xfffffffe
info->total += the_size;
4002d348: 8b020084 add x4, x4, x2
if ( info->largest < the_size )
4002d34c: eb06005f cmp x2, x6
4002d350: 54000049 b.ls 4002d358 <_Heap_Get_free_information+0x48> // b.plast
info->largest = the_size;
4002d354: f9000422 str x2, [x1, #8]
the_block = the_block->next)
4002d358: f9400863 ldr x3, [x3, #16]
for(the_block = _Heap_Free_list_first(the_heap);
4002d35c: eb03001f cmp x0, x3
4002d360: 54fffea1 b.ne 4002d334 <_Heap_Get_free_information+0x24> // b.any
4002d364: f9000025 str x5, [x1]
4002d368: f9000824 str x4, [x1, #16]
}
}
4002d36c: d65f03c0 ret
0000000040026c60 <_Heap_Greedy_allocate>:
Heap_Block *_Heap_Greedy_allocate(
Heap_Control *heap,
const uintptr_t *block_sizes,
size_t block_count
)
{
40026c60: a9bc7bfd stp x29, x30, [sp, #-64]!
40026c64: 910003fd mov x29, sp
40026c68: a90153f3 stp x19, x20, [sp, #16]
40026c6c: aa0003f4 mov x20, x0
40026c70: a9025bf5 stp x21, x22, [sp, #32]
Heap_Block *current;
size_t i;
_Heap_Protection_free_all_delayed_blocks( heap );
for (i = 0; i < block_count; ++i) {
40026c74: b40006a2 cbz x2, 40026d48 <_Heap_Greedy_allocate+0xe8>
40026c78: aa0203f6 mov x22, x2
40026c7c: f9001bf7 str x23, [sp, #48]
40026c80: aa0103f7 mov x23, x1
40026c84: d2800013 mov x19, #0x0 // #0
Heap_Block *allocated_blocks = NULL;
40026c88: d2800015 mov x21, #0x0 // #0
40026c8c: d503201f nop
* @retval pointer The starting address of the allocated memory area.
* @retval NULL No memory is available of the parameters are inconsistent.
*/
RTEMS_INLINE_ROUTINE void *_Heap_Allocate( Heap_Control *heap, uintptr_t size )
{
return _Heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
40026c90: f8737ae1 ldr x1, [x23, x19, lsl #3]
40026c94: aa1403e0 mov x0, x20
for (i = 0; i < block_count; ++i) {
40026c98: 91000673 add x19, x19, #0x1
40026c9c: d2800003 mov x3, #0x0 // #0
40026ca0: d2800002 mov x2, #0x0 // #0
40026ca4: 940013bf bl 4002bba0 <_Heap_Allocate_aligned_with_boundary>
void *next = _Heap_Allocate( heap, block_sizes [i] );
if ( next != NULL ) {
40026ca8: b4000100 cbz x0, 40026cc8 <_Heap_Greedy_allocate+0x68>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
40026cac: f9401282 ldr x2, [x20, #32]
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
40026cb0: d1004003 sub x3, x0, #0x10
return value - (value % alignment);
40026cb4: 9ac20801 udiv x1, x0, x2
40026cb8: 9b028020 msub x0, x1, x2, x0
- HEAP_BLOCK_HEADER_SIZE);
40026cbc: cb000060 sub x0, x3, x0
Heap_Block *next_block = _Heap_Block_of_alloc_area(
(uintptr_t) next,
heap->page_size
);
next_block->next = allocated_blocks;
40026cc0: f9000815 str x21, [x0, #16]
40026cc4: aa0003f5 mov x21, x0
for (i = 0; i < block_count; ++i) {
40026cc8: eb1302df cmp x22, x19
40026ccc: 54fffe21 b.ne 40026c90 <_Heap_Greedy_allocate+0x30> // b.any
return _Heap_Free_list_head(heap)->next;
40026cd0: f9400a93 ldr x19, [x20, #16]
allocated_blocks = next_block;
}
}
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
40026cd4: eb13029f cmp x20, x19
40026cd8: 54000440 b.eq 40026d60 <_Heap_Greedy_allocate+0x100> // b.none
40026cdc: f9401bf7 ldr x23, [sp, #48]
Heap_Block *blocks = NULL;
40026ce0: d2800016 mov x22, #0x0 // #0
40026ce4: d503201f nop
*
* @return The block size.
*/
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40026ce8: f9400663 ldr x3, [x19, #8]
_Heap_Block_allocate(
40026cec: 91004262 add x2, x19, #0x10
40026cf0: aa1303e1 mov x1, x19
40026cf4: aa1403e0 mov x0, x20
40026cf8: 927ff863 and x3, x3, #0xfffffffffffffffe
40026cfc: d1004063 sub x3, x3, #0x10
40026d00: 940014dc bl 4002c070 <_Heap_Block_allocate>
current,
_Heap_Alloc_area_of_block( current ),
_Heap_Block_size( current ) - HEAP_BLOCK_HEADER_SIZE
);
current->next = blocks;
40026d04: f9000a76 str x22, [x19, #16]
return &heap->free_list;
40026d08: aa1303f6 mov x22, x19
return _Heap_Free_list_head(heap)->next;
40026d0c: f9400a93 ldr x19, [x20, #16]
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
40026d10: eb13029f cmp x20, x19
40026d14: 54fffea1 b.ne 40026ce8 <_Heap_Greedy_allocate+0x88> // b.any
blocks = current;
}
while ( allocated_blocks != NULL ) {
40026d18: b40000f5 cbz x21, 40026d34 <_Heap_Greedy_allocate+0xd4>
40026d1c: d503201f nop
current = allocated_blocks;
allocated_blocks = allocated_blocks->next;
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
40026d20: 910042a1 add x1, x21, #0x10
40026d24: aa1403e0 mov x0, x20
allocated_blocks = allocated_blocks->next;
40026d28: f9400ab5 ldr x21, [x21, #16]
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( current ) );
40026d2c: 940015f5 bl 4002c500 <_Heap_Free>
while ( allocated_blocks != NULL ) {
40026d30: b5ffff95 cbnz x21, 40026d20 <_Heap_Greedy_allocate+0xc0>
}
return blocks;
}
40026d34: aa1603e0 mov x0, x22
40026d38: a94153f3 ldp x19, x20, [sp, #16]
40026d3c: a9425bf5 ldp x21, x22, [sp, #32]
40026d40: a8c47bfd ldp x29, x30, [sp], #64
40026d44: d65f03c0 ret
40026d48: f9400813 ldr x19, [x0, #16]
Heap_Block *allocated_blocks = NULL;
40026d4c: d2800015 mov x21, #0x0 // #0
Heap_Block *blocks = NULL;
40026d50: d2800016 mov x22, #0x0 // #0
while ( (current = _Heap_Free_list_first( heap )) != free_list_tail ) {
40026d54: eb00027f cmp x19, x0
40026d58: 54fffc41 b.ne 40026ce0 <_Heap_Greedy_allocate+0x80> // b.any <== ALWAYS TAKEN
40026d5c: 17fffff6 b 40026d34 <_Heap_Greedy_allocate+0xd4> <== NOT EXECUTED
Heap_Block *blocks = NULL;
40026d60: d2800016 mov x22, #0x0 // #0
40026d64: f9401bf7 ldr x23, [sp, #48]
40026d68: 17ffffec b 40026d18 <_Heap_Greedy_allocate+0xb8>
40026d6c: 00000000 udf #0
0000000040028330 <_Heap_Iterate>:
void _Heap_Iterate(
Heap_Control *heap,
Heap_Block_visitor visitor,
void *visitor_arg
)
{
40028330: a9bd7bfd stp x29, x30, [sp, #-48]!
40028334: 910003fd mov x29, sp
40028338: a90153f3 stp x19, x20, [sp, #16]
4002833c: a9025bf5 stp x21, x22, [sp, #32]
Heap_Block *current = heap->first_block;
Heap_Block *end = heap->last_block;
40028340: a9445413 ldp x19, x21, [x0, #64]
bool stop = false;
while ( !stop && current != end ) {
40028344: eb15027f cmp x19, x21
40028348: 54000240 b.eq 40028390 <_Heap_Iterate+0x60> // b.none <== NEVER TAKEN
4002834c: aa0103f4 mov x20, x1
40028350: aa0203f6 mov x22, x2
40028354: d503201f nop
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40028358: f9400661 ldr x1, [x19, #8]
4002835c: aa1303e0 mov x0, x19
uintptr_t size = _Heap_Block_size( current );
Heap_Block *next = _Heap_Block_at( current, size );
bool used = _Heap_Is_prev_used( next );
stop = (*visitor)( current, size, used, visitor_arg );
40028360: aa1603e3 mov x3, x22
40028364: 927ff821 and x1, x1, #0xfffffffffffffffe
return (Heap_Block *) ((uintptr_t) block + offset);
40028368: 8b010273 add x19, x19, x1
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
4002836c: f9400662 ldr x2, [x19, #8]
40028370: 12000042 and w2, w2, #0x1
40028374: d63f0280 blr x20
while ( !stop && current != end ) {
40028378: eb1302bf cmp x21, x19
stop = (*visitor)( current, size, used, visitor_arg );
4002837c: 12001c00 and w0, w0, #0xff
while ( !stop && current != end ) {
40028380: 1a9f07e4 cset w4, ne // ne = any
40028384: 52000000 eor w0, w0, #0x1
40028388: 6a00009f tst w4, w0
4002838c: 54fffe61 b.ne 40028358 <_Heap_Iterate+0x28> // b.any
current = next;
}
}
40028390: a94153f3 ldp x19, x20, [sp, #16]
40028394: a9425bf5 ldp x21, x22, [sp, #32]
40028398: a8c37bfd ldp x29, x30, [sp], #48
4002839c: d65f03c0 ret
0000000040025be0 <_Heap_Size_of_alloc_area>:
return value - (value % alignment);
40025be0: f9401005 ldr x5, [x0, #32]
- HEAP_BLOCK_HEADER_SIZE);
40025be4: d1004023 sub x3, x1, #0x10
return (uintptr_t) block >= (uintptr_t) heap->first_block
40025be8: f9402006 ldr x6, [x0, #64]
return value - (value % alignment);
40025bec: 9ac50824 udiv x4, x1, x5
40025bf0: 9b058484 msub x4, x4, x5, x1
- HEAP_BLOCK_HEADER_SIZE);
40025bf4: cb040064 sub x4, x3, x4
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
40025bf8: eb0400df cmp x6, x4
40025bfc: 54000248 b.hi 40025c44 <_Heap_Size_of_alloc_area+0x64> // b.pmore <== NEVER TAKEN
40025c00: f9402400 ldr x0, [x0, #72]
40025c04: eb04001f cmp x0, x4
40025c08: 540001e3 b.cc 40025c44 <_Heap_Size_of_alloc_area+0x64> // b.lo, b.ul, b.last<== NEVER TAKEN
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40025c0c: f9400483 ldr x3, [x4, #8]
40025c10: 927ff863 and x3, x3, #0xfffffffffffffffe
return (Heap_Block *) ((uintptr_t) block + offset);
40025c14: 8b040063 add x3, x3, x4
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
40025c18: eb0300df cmp x6, x3
40025c1c: 54000148 b.hi 40025c44 <_Heap_Size_of_alloc_area+0x64> // b.pmore <== NEVER TAKEN
40025c20: eb03001f cmp x0, x3
40025c24: 54000103 b.cc 40025c44 <_Heap_Size_of_alloc_area+0x64> // b.lo, b.ul, b.last<== NEVER TAKEN
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
40025c28: f9400464 ldr x4, [x3, #8]
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
40025c2c: 12000080 and w0, w4, #0x1
40025c30: 36000084 tbz w4, #0, 40025c40 <_Heap_Size_of_alloc_area+0x60> <== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
40025c34: cb010061 sub x1, x3, x1
40025c38: 91002021 add x1, x1, #0x8
40025c3c: f9000041 str x1, [x2]
return true;
}
40025c40: d65f03c0 ret
return false;
40025c44: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
}
40025c48: d65f03c0 ret <== NOT EXECUTED
40025c4c: 00000000 udf #0
0000000040024c80 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
40024c80: d10283ff sub sp, sp, #0xa0
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
40024c84: 72001c5f tst w2, #0xff
{
40024c88: a9027bfd stp x29, x30, [sp, #32]
40024c8c: 910083fd add x29, sp, #0x20
return _System_state_Current;
40024c90: d0000703 adrp x3, 40106000 <_Thread_Objects+0x510>
if ( !_System_state_Is_up( _System_state_Get() ) ) {
40024c94: b9427063 ldr w3, [x3, #624]
{
40024c98: a90353f3 stp x19, x20, [sp, #48]
_Heap_Walk_print : _Heap_Walk_print_nothing;
40024c9c: 90000014 adrp x20, 40024000 <IMFS_node_initialize_sym_link>
40024ca0: 912f0282 add x2, x20, #0xbc0
{
40024ca4: a9066bf9 stp x25, x26, [sp, #96]
_Heap_Walk_print : _Heap_Walk_print_nothing;
40024ca8: 90000014 adrp x20, 40024000 <IMFS_node_initialize_sym_link>
40024cac: 912f4294 add x20, x20, #0xbd0
40024cb0: 9a821294 csel x20, x20, x2, ne // ne = any
if ( !_System_state_Is_up( _System_state_Get() ) ) {
40024cb4: 7100087f cmp w3, #0x2
40024cb8: 54000100 b.eq 40024cd8 <_Heap_Walk+0x58> // b.none
return true;
40024cbc: 5280003a mov w26, #0x1 // #1
block = next_block;
} while ( block != first_block );
return true;
}
40024cc0: 2a1a03e0 mov w0, w26
40024cc4: a9427bfd ldp x29, x30, [sp, #32]
40024cc8: a94353f3 ldp x19, x20, [sp, #48]
40024ccc: a9466bf9 ldp x25, x26, [sp, #96]
40024cd0: 910283ff add sp, sp, #0xa0
40024cd4: d65f03c0 ret
40024cd8: a90563f7 stp x23, x24, [sp, #80]
40024cdc: aa0003f8 mov x24, x0
40024ce0: 2a0103f9 mov w25, w1
(*printer)(
40024ce4: 2a0103e0 mov w0, w1
40024ce8: a9045bf5 stp x21, x22, [sp, #64]
40024cec: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024cf0: 91042042 add x2, x2, #0x108
40024cf4: a90773fb stp x27, x28, [sp, #112]
40024cf8: f9400b01 ldr x1, [x24, #16]
uintptr_t const page_size = heap->page_size;
40024cfc: f9401316 ldr x22, [x24, #32]
(*printer)(
40024d00: a9431b05 ldp x5, x6, [x24, #48]
40024d04: f90007e1 str x1, [sp, #8]
40024d08: aa1603e3 mov x3, x22
40024d0c: f9400f01 ldr x1, [x24, #24]
40024d10: f9000be1 str x1, [sp, #16]
40024d14: 52800001 mov w1, #0x0 // #0
Heap_Block *const last_block = heap->last_block;
40024d18: a944571b ldp x27, x21, [x24, #64]
uintptr_t const min_block_size = heap->min_block_size;
40024d1c: f9401717 ldr x23, [x24, #40]
(*printer)(
40024d20: f90003f5 str x21, [sp]
40024d24: aa1703e4 mov x4, x23
40024d28: aa1b03e7 mov x7, x27
40024d2c: d63f0280 blr x20
if ( page_size == 0 ) {
40024d30: b4000596 cbz x22, 40024de0 <_Heap_Walk+0x160>
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
40024d34: f2400edf tst x22, #0xf
40024d38: 54000341 b.ne 40024da0 <_Heap_Walk+0x120> // b.any
return (value % alignment) == 0;
40024d3c: 9ad60ae1 udiv x1, x23, x22
40024d40: 9b16dc21 msub x1, x1, x22, x23
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
40024d44: b50007e1 cbnz x1, 40024e40 <_Heap_Walk+0x1c0>
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
40024d48: 91004362 add x2, x27, #0x10
return (value % alignment) == 0;
40024d4c: 9ad60841 udiv x1, x2, x22
40024d50: 9b168821 msub x1, x1, x22, x2
if (
40024d54: b5000821 cbnz x1, 40024e58 <_Heap_Walk+0x1d8>
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
40024d58: f9400761 ldr x1, [x27, #8]
if ( !_Heap_Is_prev_used( first_block ) ) {
40024d5c: 1200003a and w26, w1, #0x1
40024d60: 360005e1 tbz w1, #0, 40024e1c <_Heap_Walk+0x19c>
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40024d64: f94006a0 ldr x0, [x21, #8]
40024d68: 927ff800 and x0, x0, #0xfffffffffffffffe
return (Heap_Block *) ((uintptr_t) block + offset);
40024d6c: 8b0002a0 add x0, x21, x0
40024d70: f90043e0 str x0, [sp, #128]
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
40024d74: f9400413 ldr x19, [x0, #8]
40024d78: 1200026a and w10, w19, #0x1
if ( _Heap_Is_free( last_block ) ) {
40024d7c: 2a0a03fa mov w26, w10
40024d80: 36000793 tbz w19, #0, 40024e70 <_Heap_Walk+0x1f0>
if (
40024d84: f94043e0 ldr x0, [sp, #128]
40024d88: eb00037f cmp x27, x0
40024d8c: 540007a0 b.eq 40024e80 <_Heap_Walk+0x200> // b.none
(*printer)(
40024d90: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024d94: 910a0042 add x2, x2, #0x280
40024d98: 2a1903e0 mov w0, w25
40024d9c: 14000014 b 40024dec <_Heap_Walk+0x16c>
(*printer)(
40024da0: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024da4: aa1603e3 mov x3, x22
40024da8: 2a1903e0 mov w0, w25
40024dac: 9106e042 add x2, x2, #0x1b8
40024db0: 52800021 mov w1, #0x1 // #1
(*printer)(
40024db4: d63f0280 blr x20
return false;
40024db8: 5280001a mov w26, #0x0 // #0
}
40024dbc: 2a1a03e0 mov w0, w26
40024dc0: a9427bfd ldp x29, x30, [sp, #32]
40024dc4: a94353f3 ldp x19, x20, [sp, #48]
40024dc8: a9445bf5 ldp x21, x22, [sp, #64]
40024dcc: a94563f7 ldp x23, x24, [sp, #80]
40024dd0: a9466bf9 ldp x25, x26, [sp, #96]
40024dd4: a94773fb ldp x27, x28, [sp, #112]
40024dd8: 910283ff add sp, sp, #0xa0
40024ddc: d65f03c0 ret
(*printer)( source, true, "page size is zero\n" );
40024de0: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024de4: 91068042 add x2, x2, #0x1a0
40024de8: 2a1903e0 mov w0, w25
(*printer)(
40024dec: 52800021 mov w1, #0x1 // #1
return false;
40024df0: 5280001a mov w26, #0x0 // #0
(*printer)(
40024df4: d63f0280 blr x20
}
40024df8: 2a1a03e0 mov w0, w26
40024dfc: a9427bfd ldp x29, x30, [sp, #32]
40024e00: a94353f3 ldp x19, x20, [sp, #48]
40024e04: a9445bf5 ldp x21, x22, [sp, #64]
40024e08: a94563f7 ldp x23, x24, [sp, #80]
40024e0c: a9466bf9 ldp x25, x26, [sp, #96]
40024e10: a94773fb ldp x27, x28, [sp, #112]
40024e14: 910283ff add sp, sp, #0xa0
40024e18: d65f03c0 ret
(*printer)(
40024e1c: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024e20: 9108e042 add x2, x2, #0x238
40024e24: 2a1903e0 mov w0, w25
(*printer)(
40024e28: 52800021 mov w1, #0x1 // #1
40024e2c: d63f0280 blr x20
return false;
40024e30: a9445bf5 ldp x21, x22, [sp, #64]
40024e34: a94563f7 ldp x23, x24, [sp, #80]
40024e38: a94773fb ldp x27, x28, [sp, #112]
40024e3c: 17ffffa1 b 40024cc0 <_Heap_Walk+0x40>
(*printer)(
40024e40: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024e44: aa1703e3 mov x3, x23
40024e48: 2a1903e0 mov w0, w25
40024e4c: 91076042 add x2, x2, #0x1d8
40024e50: 52800021 mov w1, #0x1 // #1
40024e54: 17ffffd8 b 40024db4 <_Heap_Walk+0x134>
(*printer)(
40024e58: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024e5c: aa1b03e3 mov x3, x27
40024e60: 2a1903e0 mov w0, w25
40024e64: 91080042 add x2, x2, #0x200
40024e68: 52800021 mov w1, #0x1 // #1
40024e6c: 17ffffd2 b 40024db4 <_Heap_Walk+0x134>
(*printer)(
40024e70: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024e74: 9109a042 add x2, x2, #0x268
40024e78: 2a1903e0 mov w0, w25
40024e7c: 17ffffeb b 40024e28 <_Heap_Walk+0x1a8>
return _Heap_Free_list_head(heap)->next;
40024e80: f9400b03 ldr x3, [x24, #16]
uintptr_t const page_size = heap->page_size;
40024e84: f9401305 ldr x5, [x24, #32]
while ( free_block != free_list_tail ) {
40024e88: eb03031f cmp x24, x3
return (uintptr_t) block >= (uintptr_t) heap->first_block
40024e8c: f9402301 ldr x1, [x24, #64]
40024e90: 540003c0 b.eq 40024f08 <_Heap_Walk+0x288> // b.none
40024e94: aa1803e6 mov x6, x24
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
40024e98: eb01007f cmp x3, x1
40024e9c: 540000c2 b.cs 40024eb4 <_Heap_Walk+0x234> // b.hs, b.nlast
(*printer)(
40024ea0: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024ea4: 2a1903e0 mov w0, w25
40024ea8: 9112e042 add x2, x2, #0x4b8
40024eac: 52800021 mov w1, #0x1 // #1
40024eb0: 17ffffc1 b 40024db4 <_Heap_Walk+0x134>
40024eb4: f9402702 ldr x2, [x24, #72]
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
40024eb8: 91004064 add x4, x3, #0x10
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
40024ebc: eb03005f cmp x2, x3
40024ec0: 54ffff03 b.cc 40024ea0 <_Heap_Walk+0x220> // b.lo, b.ul, b.last <== NEVER TAKEN
return (value % alignment) == 0;
40024ec4: 9ac50882 udiv x2, x4, x5
40024ec8: 9b059042 msub x2, x2, x5, x4
if (
40024ecc: b5001962 cbnz x2, 400251f8 <_Heap_Walk+0x578>
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40024ed0: f9400462 ldr x2, [x3, #8]
40024ed4: 927ff842 and x2, x2, #0xfffffffffffffffe
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
40024ed8: 8b030042 add x2, x2, x3
40024edc: f9400442 ldr x2, [x2, #8]
if ( _Heap_Is_used( free_block ) ) {
40024ee0: 1200005a and w26, w2, #0x1
40024ee4: 37001802 tbnz w2, #0, 400251e4 <_Heap_Walk+0x564>
if ( free_block->prev != prev_block ) {
40024ee8: f9400c64 ldr x4, [x3, #24]
40024eec: eb06009f cmp x4, x6
40024ef0: 540018e1 b.ne 4002520c <_Heap_Walk+0x58c> // b.any
free_block = free_block->next;
40024ef4: f9400862 ldr x2, [x3, #16]
while ( free_block != free_list_tail ) {
40024ef8: aa0303e6 mov x6, x3
40024efc: eb02031f cmp x24, x2
40024f00: aa0203e3 mov x3, x2
40024f04: 54fffca1 b.ne 40024e98 <_Heap_Walk+0x218> // b.any
40024f08: f94043fc ldr x28, [sp, #128]
(*printer)(
40024f0c: f0000080 adrp x0, 40037000 <IMFS_mknod_control_memfile+0x20>
40024f10: 91124000 add x0, x0, #0x490
40024f14: f9004be0 str x0, [sp, #144]
(*printer)(
40024f18: f0000080 adrp x0, 40037000 <IMFS_mknod_control_memfile+0x20>
40024f1c: 9111e000 add x0, x0, #0x478
40024f20: f9004fe0 str x0, [sp, #152]
40024f24: d503201f nop
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40024f28: 927ffa73 and x19, x19, #0xfffffffffffffffe
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
40024f2c: 12001d4a and w10, w10, #0xff
return (Heap_Block *) ((uintptr_t) block + offset);
40024f30: 8b13039b add x27, x28, x19
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
40024f34: eb1b003f cmp x1, x27
40024f38: 540001a9 b.ls 40024f6c <_Heap_Walk+0x2ec> // b.plast <== ALWAYS TAKEN
(*printer)(
40024f3c: f0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40024f40: aa1b03e4 mov x4, x27
40024f44: aa1c03e3 mov x3, x28
40024f48: 2a1903e0 mov w0, w25
40024f4c: 91142042 add x2, x2, #0x508
40024f50: 52800021 mov w1, #0x1 // #1
40024f54: d63f0280 blr x20
return false;
40024f58: 5280001a mov w26, #0x0 // #0
40024f5c: a9445bf5 ldp x21, x22, [sp, #64]
40024f60: a94563f7 ldp x23, x24, [sp, #80]
40024f64: a94773fb ldp x27, x28, [sp, #112]
40024f68: 17ffff56 b 40024cc0 <_Heap_Walk+0x40>
40024f6c: f9402701 ldr x1, [x24, #72]
40024f70: eb1b003f cmp x1, x27
40024f74: 54fffe43 b.cc 40024f3c <_Heap_Walk+0x2bc> // b.lo, b.ul, b.last
return (value % alignment) == 0;
40024f78: 9ad60a62 udiv x2, x19, x22
40024f7c: 9b16cc42 msub x2, x2, x22, x19
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
40024f80: b40002a2 cbz x2, 40024fd4 <_Heap_Walk+0x354>
40024f84: eb15039f cmp x28, x21
40024f88: 54001201 b.ne 400251c8 <_Heap_Walk+0x548> // b.any
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
40024f8c: f9400761 ldr x1, [x27, #8]
if ( !_Heap_Is_prev_used( next_block ) ) {
40024f90: 1200003a and w26, w1, #0x1
40024f94: 36000581 tbz w1, #0, 40025044 <_Heap_Walk+0x3c4>
} else if (prev_used) {
40024f98: 3400046a cbz w10, 40025024 <_Heap_Walk+0x3a4>
(*printer)(
40024f9c: f9404fe2 ldr x2, [sp, #152]
40024fa0: aa1303e4 mov x4, x19
40024fa4: aa1c03e3 mov x3, x28
40024fa8: 2a1903e0 mov w0, w25
40024fac: 52800001 mov w1, #0x0 // #0
40024fb0: d63f0280 blr x20
} while ( block != first_block );
40024fb4: f94043e0 ldr x0, [sp, #128]
40024fb8: eb00037f cmp x27, x0
40024fbc: 54000fe0 b.eq 400251b8 <_Heap_Walk+0x538> // b.none
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
40024fc0: f9400773 ldr x19, [x27, #8]
40024fc4: aa1b03fc mov x28, x27
return (uintptr_t) block >= (uintptr_t) heap->first_block
40024fc8: f9402301 ldr x1, [x24, #64]
40024fcc: 1200026a and w10, w19, #0x1
40024fd0: 17ffffd6 b 40024f28 <_Heap_Walk+0x2a8>
bool const is_not_last_block = block != last_block;
40024fd4: eb15039f cmp x28, x21
40024fd8: 1a9f07e1 cset w1, ne // ne = any
if ( block_size < min_block_size && is_not_last_block ) {
40024fdc: eb1302ff cmp x23, x19
40024fe0: 1a9f97e9 cset w9, hi // hi = pmore
40024fe4: 6a09003a ands w26, w1, w9
40024fe8: 54000ce1 b.ne 40025184 <_Heap_Walk+0x504> // b.any
if ( next_block_begin <= block_begin && is_not_last_block ) {
40024fec: 7100003f cmp w1, #0x0
40024ff0: fa5b1380 ccmp x28, x27, #0x0, ne // ne = any
40024ff4: 54fffcc3 b.cc 40024f8c <_Heap_Walk+0x30c> // b.lo, b.ul, b.last
(*printer)(
40024ff8: aa1b03e4 mov x4, x27
40024ffc: aa1c03e3 mov x3, x28
40025000: 2a1903e0 mov w0, w25
40025004: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40025008: 52800021 mov w1, #0x1 // #1
4002500c: 910e6042 add x2, x2, #0x398
40025010: d63f0280 blr x20
return false;
40025014: a9445bf5 ldp x21, x22, [sp, #64]
40025018: a94563f7 ldp x23, x24, [sp, #80]
4002501c: a94773fb ldp x27, x28, [sp, #112]
40025020: 17ffff28 b 40024cc0 <_Heap_Walk+0x40>
(*printer)(
40025024: f9400385 ldr x5, [x28]
40025028: aa1303e4 mov x4, x19
4002502c: f9404be2 ldr x2, [sp, #144]
40025030: aa1c03e3 mov x3, x28
40025034: 2a1903e0 mov w0, w25
40025038: 52800001 mov w1, #0x0 // #0
4002503c: d63f0280 blr x20
40025040: 17ffffdd b 40024fb4 <_Heap_Walk+0x334>
return _Heap_Free_list_tail(heap)->prev;
40025044: a9410b01 ldp x1, x2, [x24, #16]
(*printer)(
40025048: f9400f85 ldr x5, [x28, #24]
4002504c: eb05003f cmp x1, x5
40025050: 54000880 b.eq 40025160 <_Heap_Walk+0x4e0> // b.none
: (block->prev == free_list_head ? " (= head)" : ""),
40025054: d0000086 adrp x6, 40037000 <IMFS_mknod_control_memfile+0x20>
40025058: 911100c1 add x1, x6, #0x440
4002505c: eb05031f cmp x24, x5
40025060: d0000086 adrp x6, 40037000 <IMFS_mknod_control_memfile+0x20>
40025064: 910360c6 add x6, x6, #0xd8
40025068: 9a8100c6 csel x6, x6, x1, eq // eq = none
(*printer)(
4002506c: f9400b87 ldr x7, [x28, #16]
40025070: eb07005f cmp x2, x7
40025074: 54000700 b.eq 40025154 <_Heap_Walk+0x4d4> // b.none
: (block->next == free_list_tail ? " (= tail)" : "")
40025078: d0000081 adrp x1, 40037000 <IMFS_mknod_control_memfile+0x20>
4002507c: 91110022 add x2, x1, #0x440
40025080: eb07031f cmp x24, x7
40025084: d0000081 adrp x1, 40037000 <IMFS_mknod_control_memfile+0x20>
40025088: 9103e021 add x1, x1, #0xf8
4002508c: 9a820021 csel x1, x1, x2, eq // eq = none
(*printer)(
40025090: f90003e1 str x1, [sp]
40025094: d0000080 adrp x0, 40037000 <IMFS_mknod_control_memfile+0x20>
40025098: 910f4002 add x2, x0, #0x3d0
4002509c: aa1303e4 mov x4, x19
400250a0: aa1c03e3 mov x3, x28
400250a4: 2a1903e0 mov w0, w25
400250a8: 52800001 mov w1, #0x0 // #0
400250ac: b9008fea str w10, [sp, #140]
400250b0: d63f0280 blr x20
if ( block_size != next_block->prev_size ) {
400250b4: f9400365 ldr x5, [x27]
400250b8: b9408fea ldr w10, [sp, #140]
400250bc: eb05027f cmp x19, x5
400250c0: 54000240 b.eq 40025108 <_Heap_Walk+0x488> // b.none
(*printer)(
400250c4: aa1b03e6 mov x6, x27
400250c8: aa1303e4 mov x4, x19
400250cc: aa1c03e3 mov x3, x28
400250d0: 2a1903e0 mov w0, w25
400250d4: 52800021 mov w1, #0x1 // #1
400250d8: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
400250dc: 91102042 add x2, x2, #0x408
400250e0: d63f0280 blr x20
}
400250e4: 2a1a03e0 mov w0, w26
400250e8: a9427bfd ldp x29, x30, [sp, #32]
400250ec: a94353f3 ldp x19, x20, [sp, #48]
400250f0: a9445bf5 ldp x21, x22, [sp, #64]
400250f4: a94563f7 ldp x23, x24, [sp, #80]
400250f8: a9466bf9 ldp x25, x26, [sp, #96]
400250fc: a94773fb ldp x27, x28, [sp, #112]
40025100: 910283ff add sp, sp, #0xa0
40025104: d65f03c0 ret
if ( !prev_used ) {
40025108: 3400032a cbz w10, 4002516c <_Heap_Walk+0x4ec>
return _Heap_Free_list_head(heap)->next;
4002510c: f9400b02 ldr x2, [x24, #16]
while ( free_block != free_list_tail ) {
40025110: eb02031f cmp x24, x2
40025114: 540000c0 b.eq 4002512c <_Heap_Walk+0x4ac> // b.none <== NEVER TAKEN
if ( free_block == block ) {
40025118: eb02039f cmp x28, x2
4002511c: 54fff4c0 b.eq 40024fb4 <_Heap_Walk+0x334> // b.none
free_block = free_block->next;
40025120: f9400842 ldr x2, [x2, #16]
while ( free_block != free_list_tail ) {
40025124: eb02031f cmp x24, x2
40025128: 54ffff81 b.ne 40025118 <_Heap_Walk+0x498> // b.any
(*printer)(
4002512c: aa1c03e3 mov x3, x28
40025130: 2a1903e0 mov w0, w25
40025134: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40025138: 52800021 mov w1, #0x1 // #1
4002513c: 91136042 add x2, x2, #0x4d8
40025140: d63f0280 blr x20
return false;
40025144: a9445bf5 ldp x21, x22, [sp, #64]
40025148: a94563f7 ldp x23, x24, [sp, #80]
4002514c: a94773fb ldp x27, x28, [sp, #112]
40025150: 17fffedc b 40024cc0 <_Heap_Walk+0x40>
(*printer)(
40025154: d0000081 adrp x1, 40037000 <IMFS_mknod_control_memfile+0x20>
40025158: 9103a021 add x1, x1, #0xe8
4002515c: 17ffffcd b 40025090 <_Heap_Walk+0x410>
40025160: d0000086 adrp x6, 40037000 <IMFS_mknod_control_memfile+0x20>
40025164: 910320c6 add x6, x6, #0xc8
40025168: 17ffffc1 b 4002506c <_Heap_Walk+0x3ec>
(*printer)(
4002516c: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40025170: aa1c03e3 mov x3, x28
40025174: 2a1903e0 mov w0, w25
40025178: 91112042 add x2, x2, #0x448
4002517c: 52800021 mov w1, #0x1 // #1
40025180: 17ffff0d b 40024db4 <_Heap_Walk+0x134>
(*printer)(
40025184: aa1703e5 mov x5, x23
40025188: aa1c03e3 mov x3, x28
4002518c: aa1303e4 mov x4, x19
40025190: 2a1903e0 mov w0, w25
40025194: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40025198: 52800021 mov w1, #0x1 // #1
4002519c: 910da042 add x2, x2, #0x368
return false;
400251a0: 5280001a mov w26, #0x0 // #0
(*printer)(
400251a4: d63f0280 blr x20
return false;
400251a8: a9445bf5 ldp x21, x22, [sp, #64]
400251ac: a94563f7 ldp x23, x24, [sp, #80]
400251b0: a94773fb ldp x27, x28, [sp, #112]
400251b4: 17fffec3 b 40024cc0 <_Heap_Walk+0x40>
400251b8: a9445bf5 ldp x21, x22, [sp, #64]
400251bc: a94563f7 ldp x23, x24, [sp, #80]
400251c0: a94773fb ldp x27, x28, [sp, #112]
400251c4: 17fffebe b 40024cbc <_Heap_Walk+0x3c>
(*printer)(
400251c8: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
400251cc: aa1303e4 mov x4, x19
400251d0: aa1c03e3 mov x3, x28
400251d4: 2a1903e0 mov w0, w25
400251d8: 910ce042 add x2, x2, #0x338
400251dc: 52800021 mov w1, #0x1 // #1
400251e0: 17ffff5d b 40024f54 <_Heap_Walk+0x2d4>
(*printer)(
400251e4: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
400251e8: 2a1903e0 mov w0, w25
400251ec: 910b8042 add x2, x2, #0x2e0
400251f0: 52800021 mov w1, #0x1 // #1
400251f4: 17fffef0 b 40024db4 <_Heap_Walk+0x134>
(*printer)(
400251f8: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
400251fc: 2a1903e0 mov w0, w25
40025200: 910ac042 add x2, x2, #0x2b0
40025204: 52800021 mov w1, #0x1 // #1
40025208: 17fffeeb b 40024db4 <_Heap_Walk+0x134>
(*printer)(
4002520c: 2a1903e0 mov w0, w25
40025210: d0000082 adrp x2, 40037000 <IMFS_mknod_control_memfile+0x20>
40025214: 52800021 mov w1, #0x1 // #1
40025218: 910c0042 add x2, x2, #0x300
4002521c: d63f0280 blr x20
return false;
40025220: a9445bf5 ldp x21, x22, [sp, #64]
40025224: a94563f7 ldp x23, x24, [sp, #80]
40025228: a94773fb ldp x27, x28, [sp, #112]
4002522c: 17fffea5 b 40024cc0 <_Heap_Walk+0x40>
000000004002a700 <_IO_Base64>:
}
int
_IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen,
const char *wordbreak, int wordlen)
{
4002a700: a9ba7bfd stp x29, x30, [sp, #-96]!
4002a704: 710010bf cmp w5, #0x4
4002a708: 910003fd mov x29, sp
4002a70c: a90153f3 stp x19, x20, [sp, #16]
4002a710: aa0003f4 mov x20, x0
4002a714: aa0203f3 mov x19, x2
4002a718: a9025bf5 stp x21, x22, [sp, #32]
4002a71c: aa0103f5 mov x21, x1
4002a720: a90363f7 stp x23, x24, [sp, #48]
4002a724: a9046bf9 stp x25, x26, [sp, #64]
4002a728: 5280009a mov w26, #0x4 // #4
4002a72c: aa0303f9 mov x25, x3
4002a730: 1a9aa0ba csel w26, w5, w26, ge // ge = tcont
if (wordlen < 4) {
wordlen = 4;
}
while (srclen > 2) {
4002a734: f100087f cmp x3, #0x2
4002a738: 54000ea9 b.ls 4002a90c <_IO_Base64+0x20c> // b.plast
4002a73c: d00000d8 adrp x24, 40044000 <event_text+0x1bf0>
4002a740: 91146318 add x24, x24, #0x518
4002a744: a90573fb stp x27, x28, [sp, #80]
4002a748: aa0403fb mov x27, x4
4002a74c: 52800016 mov w22, #0x0 // #0
4002a750: 52800017 mov w23, #0x0 // #0
4002a754: d503201f nop
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
4002a758: 39400260 ldrb w0, [x19]
(*put_char)(c, arg);
4002a75c: aa1503e1 mov x1, x21
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
4002a760: d3421c00 ubfx x0, x0, #2, #6
(*put_char)(c, arg);
4002a764: 38786800 ldrb w0, [x0, x24]
4002a768: d63f0280 blr x20
_IO_Put(base64[((in[0]<<4)&0x30)|
4002a76c: 39400262 ldrb w2, [x19]
(*put_char)(c, arg);
4002a770: aa1503e1 mov x1, x21
((in[1]>>4)&0x0f)], arg, put_char);
4002a774: 39400660 ldrb w0, [x19, #1]
_IO_Put(base64[((in[0]<<4)&0x30)|
4002a778: 531c0442 ubfiz w2, w2, #4, #2
4002a77c: 2a401040 orr w0, w2, w0, lsr #4
4002a780: 3860cb00 ldrb w0, [x24, w0, sxtw]
(*put_char)(c, arg);
4002a784: d63f0280 blr x20
_IO_Put(base64[((in[1]<<2)&0x3c)|
4002a788: 39400662 ldrb w2, [x19, #1]
(*put_char)(c, arg);
4002a78c: aa1503e1 mov x1, x21
((in[2]>>6)&0x03)], arg, put_char);
4002a790: 39400a60 ldrb w0, [x19, #2]
_IO_Put(base64[((in[1]<<2)&0x3c)|
4002a794: 531e0c42 ubfiz w2, w2, #2, #4
4002a798: 2a401840 orr w0, w2, w0, lsr #6
4002a79c: 3860cb00 ldrb w0, [x24, w0, sxtw]
(*put_char)(c, arg);
4002a7a0: d63f0280 blr x20
_IO_Put(base64[in[2]&0x3f], arg, put_char);
4002a7a4: 39400a60 ldrb w0, [x19, #2]
(*put_char)(c, arg);
4002a7a8: aa1503e1 mov x1, x21
_IO_Put(base64[in[2]&0x3f], arg, put_char);
4002a7ac: 92401400 and x0, x0, #0x3f
(*put_char)(c, arg);
4002a7b0: 38786800 ldrb w0, [x0, x24]
4002a7b4: d63f0280 blr x20
in += 3;
srclen -= 3;
out += 4;
4002a7b8: 110012c1 add w1, w22, #0x4
loops++;
if (srclen != 0 &&
4002a7bc: f1000f39 subs x25, x25, #0x3
4002a7c0: 54000540 b.eq 4002a868 <_IO_Base64+0x168> // b.none
(int)((loops + 1) * 4) >= wordlen)
4002a7c4: 11000ae0 add w0, w23, #0x2
if (srclen != 0 &&
4002a7c8: 6b000b5f cmp w26, w0, lsl #2
4002a7cc: 540005ed b.le 4002a888 <_IO_Base64+0x188>
loops++;
4002a7d0: 110006f7 add w23, w23, #0x1
out += 4;
4002a7d4: 2a0103f6 mov w22, w1
in += 3;
4002a7d8: 91000e73 add x19, x19, #0x3
while (srclen > 2) {
4002a7dc: f1000b3f cmp x25, #0x2
4002a7e0: 54fffbc8 b.hi 4002a758 <_IO_Base64+0x58> // b.pmore
4002a7e4: a94573fb ldp x27, x28, [sp, #80]
++w;
++out;
}
}
}
if (srclen == 2) {
4002a7e8: f1000b3f cmp x25, #0x2
4002a7ec: 54000681 b.ne 4002a8bc <_IO_Base64+0x1bc> // b.any
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
4002a7f0: 39400260 ldrb w0, [x19]
4002a7f4: d00000d7 adrp x23, 40044000 <event_text+0x1bf0>
4002a7f8: 911462f7 add x23, x23, #0x518
(*put_char)(c, arg);
4002a7fc: aa1503e1 mov x1, x21
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
4002a800: d3421c00 ubfx x0, x0, #2, #6
(*put_char)(c, arg);
4002a804: 38776800 ldrb w0, [x0, x23]
4002a808: d63f0280 blr x20
_IO_Put(base64[((in[0]<<4)&0x30)|
4002a80c: 39400262 ldrb w2, [x19]
(*put_char)(c, arg);
4002a810: aa1503e1 mov x1, x21
((in[1]>>4)&0x0f)], arg, put_char);
4002a814: 39400660 ldrb w0, [x19, #1]
_IO_Put(base64[((in[0]<<4)&0x30)|
4002a818: 531c0442 ubfiz w2, w2, #4, #2
4002a81c: 2a401040 orr w0, w2, w0, lsr #4
4002a820: 3860cae0 ldrb w0, [x23, w0, sxtw]
(*put_char)(c, arg);
4002a824: d63f0280 blr x20
_IO_Put(base64[((in[1]<<2)&0x3c)], arg, put_char);
4002a828: 39400660 ldrb w0, [x19, #1]
(*put_char)(c, arg);
4002a82c: aa1503e1 mov x1, x21
_IO_Put(base64[((in[1]<<2)&0x3c)], arg, put_char);
4002a830: 531e0c00 ubfiz w0, w0, #2, #4
(*put_char)(c, arg);
4002a834: 38604ae0 ldrb w0, [x23, w0, uxtw]
4002a838: d63f0280 blr x20
4002a83c: aa1503e1 mov x1, x21
4002a840: 528007a0 mov w0, #0x3d // #61
4002a844: d63f0280 blr x20
} else if (srclen == 1) {
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
_IO_Put(base64[((in[0]<<4)&0x30)], arg, put_char);
_IO_Put('=', arg, put_char);
_IO_Put('=', arg, put_char);
out += 4;
4002a848: 110012c1 add w1, w22, #0x4
}
return out;
}
4002a84c: 2a0103e0 mov w0, w1
4002a850: a94153f3 ldp x19, x20, [sp, #16]
4002a854: a9425bf5 ldp x21, x22, [sp, #32]
4002a858: a94363f7 ldp x23, x24, [sp, #48]
4002a85c: a9446bf9 ldp x25, x26, [sp, #64]
4002a860: a8c67bfd ldp x29, x30, [sp], #96
4002a864: d65f03c0 ret
4002a868: a94573fb ldp x27, x28, [sp, #80]
4002a86c: 2a0103e0 mov w0, w1
4002a870: a94153f3 ldp x19, x20, [sp, #16]
4002a874: a9425bf5 ldp x21, x22, [sp, #32]
4002a878: a94363f7 ldp x23, x24, [sp, #48]
4002a87c: a9446bf9 ldp x25, x26, [sp, #64]
4002a880: a8c67bfd ldp x29, x30, [sp], #96
4002a884: d65f03c0 ret
while (*w != '\0') {
4002a888: 39400360 ldrb w0, [x27]
4002a88c: 340003a0 cbz w0, 4002a900 <_IO_Base64+0x200> <== NEVER TAKEN
4002a890: 4b1b02dc sub w28, w22, w27
4002a894: aa1b03f7 mov x23, x27
++w;
4002a898: 910006f7 add x23, x23, #0x1
(*put_char)(c, arg);
4002a89c: aa1503e1 mov x1, x21
4002a8a0: d63f0280 blr x20
++out;
4002a8a4: 110012f6 add w22, w23, #0x4
4002a8a8: 0b1c02d6 add w22, w22, w28
while (*w != '\0') {
4002a8ac: 394002e0 ldrb w0, [x23]
4002a8b0: 35ffff40 cbnz w0, 4002a898 <_IO_Base64+0x198> <== NEVER TAKEN
loops = 0;
4002a8b4: 52800017 mov w23, #0x0 // #0
4002a8b8: 17ffffc8 b 4002a7d8 <_IO_Base64+0xd8>
} else if (srclen == 1) {
4002a8bc: f100073f cmp x25, #0x1
4002a8c0: 540002a1 b.ne 4002a914 <_IO_Base64+0x214> // b.any
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
4002a8c4: 39400260 ldrb w0, [x19]
4002a8c8: d00000d7 adrp x23, 40044000 <event_text+0x1bf0>
4002a8cc: 911462f7 add x23, x23, #0x518
(*put_char)(c, arg);
4002a8d0: aa1503e1 mov x1, x21
_IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char);
4002a8d4: d3421c00 ubfx x0, x0, #2, #6
(*put_char)(c, arg);
4002a8d8: 38776800 ldrb w0, [x0, x23]
4002a8dc: d63f0280 blr x20
_IO_Put(base64[((in[0]<<4)&0x30)], arg, put_char);
4002a8e0: 39400260 ldrb w0, [x19]
(*put_char)(c, arg);
4002a8e4: aa1503e1 mov x1, x21
_IO_Put(base64[((in[0]<<4)&0x30)], arg, put_char);
4002a8e8: 531c0400 ubfiz w0, w0, #4, #2
(*put_char)(c, arg);
4002a8ec: 38604ae0 ldrb w0, [x23, w0, uxtw]
4002a8f0: d63f0280 blr x20
4002a8f4: aa1503e1 mov x1, x21
4002a8f8: 528007a0 mov w0, #0x3d // #61
4002a8fc: 17ffffcf b 4002a838 <_IO_Base64+0x138>
out += 4;
4002a900: 2a0103f6 mov w22, w1 <== NOT EXECUTED
loops = 0;
4002a904: 52800017 mov w23, #0x0 // #0 <== NOT EXECUTED
4002a908: 17ffffb4 b 4002a7d8 <_IO_Base64+0xd8> <== NOT EXECUTED
while (srclen > 2) {
4002a90c: 52800016 mov w22, #0x0 // #0
4002a910: 17ffffb6 b 4002a7e8 <_IO_Base64+0xe8>
4002a914: 2a1603e1 mov w1, w22
return out;
4002a918: 17ffffd5 b 4002a86c <_IO_Base64+0x16c>
4002a91c: 00000000 udf #0
000000004002c6b0 <_IO_Vprintf>:
return (p);
}
int
_IO_Vprintf(IO_Put_char put_char, void *arg, char const *fmt, va_list ap)
{
4002c6b0: a9b47bfd stp x29, x30, [sp, #-192]!
4002c6b4: 910003fd mov x29, sp
4002c6b8: a90153f3 stp x19, x20, [sp, #16]
4002c6bc: aa0003f3 mov x19, x0
4002c6c0: f9400060 ldr x0, [x3]
4002c6c4: f90033e0 str x0, [sp, #96]
4002c6c8: f9400460 ldr x0, [x3, #8]
4002c6cc: f9003fe0 str x0, [sp, #120]
4002c6d0: b9401860 ldr w0, [x3, #24]
4002c6d4: a9025bf5 stp x21, x22, [sp, #32]
4002c6d8: a90363f7 stp x23, x24, [sp, #48]
4002c6dc: a9046bf9 stp x25, x26, [sp, #64]
4002c6e0: a90573fb stp x27, x28, [sp, #80]
4002c6e4: aa0103fb mov x27, x1
4002c6e8: b90093e0 str w0, [sp, #144]
char padc;
int stop = 0, retval = 0;
num = 0;
if (fmt == NULL)
4002c6ec: b4000942 cbz x2, 4002c814 <_IO_Vprintf+0x164> <== NEVER TAKEN
fmt = "(fmt null)\n";
for (;;) {
padc = ' ';
width = 0;
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002c6f0: 39400040 ldrb w0, [x2]
4002c6f4: aa0203f4 mov x20, x2
4002c6f8: b0000099 adrp x25, 4003d000 <access_modes_assoc+0x10>
4002c6fc: 91394321 add x1, x25, #0xe50
width -= n;
if (!ladjust && width > 0)
while (width--)
PCHAR(padc);
while (n--)
4002c700: 52800015 mov w21, #0x0 // #0
4002c704: 52800019 mov w25, #0x0 // #0
4002c708: f90043e1 str x1, [sp, #128]
4002c70c: b0000097 adrp x23, 4003d000 <access_modes_assoc+0x10>
4002c710: 913c02e1 add x1, x23, #0xf00
4002c714: f9003be1 str x1, [sp, #112]
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002c718: aa1403f6 mov x22, x20
4002c71c: 4b140339 sub w25, w25, w20
4002c720: 14000006 b 4002c738 <_IO_Vprintf+0x88>
if (ch == '\0')
4002c724: 34000440 cbz w0, 4002c7ac <_IO_Vprintf+0xfc>
PCHAR(ch);
4002c728: aa1b03e1 mov x1, x27
4002c72c: d63f0260 blr x19
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002c730: 394002e0 ldrb w0, [x23]
4002c734: aa1703f6 mov x22, x23
4002c738: 7100941f cmp w0, #0x25
4002c73c: 0b16033c add w28, w25, w22
4002c740: 910006d7 add x23, x22, #0x1
4002c744: 54ffff01 b.ne 4002c724 <_IO_Vprintf+0x74> // b.any
4002c748: 35ffff15 cbnz w21, 4002c728 <_IO_Vprintf+0x78> <== NEVER TAKEN
reswitch: switch (ch = (u_char)*fmt++) {
4002c74c: 394006c0 ldrb w0, [x22, #1]
sign = 0; dot = 0; dwidth = 0; upper = 0;
4002c750: 5280000a mov w10, #0x0 // #0
cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0;
4002c754: 52800019 mov w25, #0x0 // #0
4002c758: 5280000b mov w11, #0x0 // #0
4002c75c: 5280000d mov w13, #0x0 // #0
sign = 0; dot = 0; dwidth = 0; upper = 0;
4002c760: 5280000e mov w14, #0x0 // #0
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002c764: 5280000c mov w12, #0x0 // #0
width = 0;
4002c768: 52800008 mov w8, #0x0 // #0
cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0;
4002c76c: 52800007 mov w7, #0x0 // #0
padc = ' ';
4002c770: 52800418 mov w24, #0x20 // #32
n = n * 10 + ch - '0';
4002c774: 52800146 mov w6, #0xa // #10
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002c778: b9008bff str wzr, [sp, #136]
reswitch: switch (ch = (u_char)*fmt++) {
4002c77c: 51008c04 sub w4, w0, #0x23
4002c780: 910006f4 add x20, x23, #0x1
4002c784: 71015c9f cmp w4, #0x57
4002c788: 540003c9 b.ls 4002c800 <_IO_Vprintf+0x150> // b.plast <== ALWAYS TAKEN
while (width-- > 0)
PCHAR(' ');
break;
default:
while (percent < fmt)
4002c78c: eb1402df cmp x22, x20
4002c790: aa1603f5 mov x21, x22
4002c794: 528004a0 mov w0, #0x25 // #37
4002c798: 540001c3 b.cc 4002c7d0 <_IO_Vprintf+0x120> // b.lo, b.ul, b.last <== ALWAYS TAKEN
4002c79c: 2a1c03f9 mov w25, w28 <== NOT EXECUTED
* Since we ignore a formatting argument it is no
* longer safe to obey the remaining formatting
* arguments as the arguments will no longer match
* the format specs.
*/
stop = 1;
4002c7a0: 52800035 mov w21, #0x1 // #1 <== NOT EXECUTED
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002c7a4: 394006e0 ldrb w0, [x23, #1]
4002c7a8: 17ffffdc b 4002c718 <_IO_Vprintf+0x68>
break;
}
}
#undef PCHAR
}
4002c7ac: 2a1c03e0 mov w0, w28
4002c7b0: a94153f3 ldp x19, x20, [sp, #16]
4002c7b4: a9425bf5 ldp x21, x22, [sp, #32]
4002c7b8: a94363f7 ldp x23, x24, [sp, #48]
4002c7bc: a9446bf9 ldp x25, x26, [sp, #64]
4002c7c0: a94573fb ldp x27, x28, [sp, #80]
4002c7c4: a8cc7bfd ldp x29, x30, [sp], #192
4002c7c8: d65f03c0 ret
PCHAR(*percent++);
4002c7cc: 394002a0 ldrb w0, [x21]
4002c7d0: 910006b5 add x21, x21, #0x1
4002c7d4: aa1b03e1 mov x1, x27
4002c7d8: d63f0260 blr x19
while (percent < fmt)
4002c7dc: eb15029f cmp x20, x21
4002c7e0: 54ffff61 b.ne 4002c7cc <_IO_Vprintf+0x11c> // b.any
PCHAR(*percent++);
4002c7e4: aa3603e0 mvn x0, x22
4002c7e8: 11000783 add w3, w28, #0x1
4002c7ec: 8b000280 add x0, x20, x0
stop = 1;
4002c7f0: 52800035 mov w21, #0x1 // #1
PCHAR(*percent++);
4002c7f4: 0b000079 add w25, w3, w0
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002c7f8: 394006e0 ldrb w0, [x23, #1]
4002c7fc: 17ffffc7 b 4002c718 <_IO_Vprintf+0x68>
4002c800: f94043e1 ldr x1, [sp, #128]
4002c804: 78645821 ldrh w1, [x1, w4, uxtw #1]
4002c808: 10000062 adr x2, 4002c814 <_IO_Vprintf+0x164>
4002c80c: 8b21a841 add x1, x2, w1, sxth #2
4002c810: d61f0020 br x1
fmt = "(fmt null)\n";
4002c814: b0000094 adrp x20, 4003d000 <access_modes_assoc+0x10> <== NOT EXECUTED
4002c818: 9138e294 add x20, x20, #0xe38 <== NOT EXECUTED
4002c81c: 52800500 mov w0, #0x28 // #40 <== NOT EXECUTED
4002c820: 17ffffb6 b 4002c6f8 <_IO_Vprintf+0x48> <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002c824: 394006e0 ldrb w0, [x23, #1]
zflag = 1;
4002c828: 52800027 mov w7, #0x1 // #1
reswitch: switch (ch = (u_char)*fmt++) {
4002c82c: aa1403f7 mov x23, x20
goto reswitch;
4002c830: 17ffffd3 b 4002c77c <_IO_Vprintf+0xcc>
if (!dot) {
4002c834: 35004aee cbnz w14, 4002d190 <_IO_Vprintf+0xae0> <== NEVER TAKEN
padc = '0';
4002c838: 2a0003f8 mov w24, w0
reswitch: switch (ch = (u_char)*fmt++) {
4002c83c: 394006e0 ldrb w0, [x23, #1]
4002c840: aa1403f7 mov x23, x20
4002c844: 17ffffce b 4002c77c <_IO_Vprintf+0xcc>
n = n * 10 + ch - '0';
4002c848: 5100c004 sub w4, w0, #0x30
ch = *fmt;
4002c84c: 394006e0 ldrb w0, [x23, #1]
if (ch < '0' || ch > '9')
4002c850: 5100c002 sub w2, w0, #0x30
ch = *fmt;
4002c854: 2a0003e5 mov w5, w0
if (ch < '0' || ch > '9')
4002c858: 7100245f cmp w2, #0x9
4002c85c: 54002e68 b.hi 4002ce28 <_IO_Vprintf+0x778> // b.pmore
reswitch: switch (ch = (u_char)*fmt++) {
4002c860: aa1403f7 mov x23, x20
4002c864: d503201f nop
n = n * 10 + ch - '0';
4002c868: 1b061484 madd w4, w4, w6, w5
ch = *fmt;
4002c86c: 38401ee5 ldrb w5, [x23, #1]!
if (ch < '0' || ch > '9')
4002c870: 5100c0a0 sub w0, w5, #0x30
n = n * 10 + ch - '0';
4002c874: 5100c084 sub w4, w4, #0x30
if (ch < '0' || ch > '9')
4002c878: 7100241f cmp w0, #0x9
ch = *fmt;
4002c87c: 2a0503e0 mov w0, w5
if (ch < '0' || ch > '9')
4002c880: 54ffff49 b.ls 4002c868 <_IO_Vprintf+0x1b8> // b.plast <== NEVER TAKEN
if (dot)
4002c884: 710001df cmp w14, #0x0
4002c888: 1a841108 csel w8, w8, w4, ne // ne = any
4002c88c: 1a8a108a csel w10, w4, w10, ne // ne = any
4002c890: 17ffffbb b 4002c77c <_IO_Vprintf+0xcc>
reswitch: switch (ch = (u_char)*fmt++) {
4002c894: d2800144 mov x4, #0xa // #10
base = 10;
4002c898: b9009fe4 str w4, [sp, #156]
num = va_arg(ap, intmax_t);
4002c89c: b94093e0 ldr w0, [sp, #144]
if (jflag)
4002c8a0: 35003099 cbnz w25, 4002ceb0 <_IO_Vprintf+0x800>
else if (tflag)
4002c8a4: 35003067 cbnz w7, 4002ceb0 <_IO_Vprintf+0x800>
else if (hflag)
4002c8a8: 3400482b cbz w11, 4002d1ac <_IO_Vprintf+0xafc> <== ALWAYS TAKEN
num = (short)va_arg(ap, int);
4002c8ac: 37f85320 tbnz w0, #31, 4002d310 <_IO_Vprintf+0xc60> <== NOT EXECUTED
4002c8b0: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002c8b4: 91002c05 add x5, x0, #0xb <== NOT EXECUTED
4002c8b8: 927df0a1 and x1, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002c8bc: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002c8c0: 7980000d ldrsh x13, [x0] <== NOT EXECUTED
if (sign && (intmax_t)num < 0) {
4002c8c4: aa0d03e0 mov x0, x13 <== NOT EXECUTED
4002c8c8: b6f86200 tbz x0, #63, 4002d508 <_IO_Vprintf+0xe58>
num = -(intmax_t)num;
4002c8cc: cb0003ed neg x13, x0
neg = 1;
4002c8d0: 52800039 mov w25, #0x1 // #1
num = -(intmax_t)num;
4002c8d4: 52800000 mov w0, #0x0 // #0
*++p = hex2ascii_data[upper][num % base];
4002c8d8: f9403be1 ldr x1, [sp, #112]
4002c8dc: d37c0000 ubfiz x0, x0, #4, #1
p = nbuf;
4002c8e0: 9102a3eb add x11, sp, #0xa8
*p = '\0';
4002c8e4: 3902a3ff strb wzr, [sp, #168]
*++p = hex2ascii_data[upper][num % base];
4002c8e8: 8b000027 add x7, x1, x0
p = nbuf;
4002c8ec: aa0b03f6 mov x22, x11
*p = '\0';
4002c8f0: aa0d03e0 mov x0, x13
4002c8f4: d503201f nop
*++p = hex2ascii_data[upper][num % base];
4002c8f8: 9ac40805 udiv x5, x0, x4
} while (num /= base);
4002c8fc: eb00009f cmp x4, x0
*++p = hex2ascii_data[upper][num % base];
4002c900: 9b0480a6 msub x6, x5, x4, x0
} while (num /= base);
4002c904: aa0503e0 mov x0, x5
*++p = hex2ascii_data[upper][num % base];
4002c908: 386668fa ldrb w26, [x7, x6]
4002c90c: 38001eda strb w26, [x22, #1]!
} while (num /= base);
4002c910: 54ffff49 b.ls 4002c8f8 <_IO_Vprintf+0x248> // b.plast
if (sharpflag && num != 0) {
4002c914: f10001bf cmp x13, #0x0
*lenp = p - nbuf;
4002c918: cb0b02c0 sub x0, x22, x11
if (sharpflag && num != 0) {
4002c91c: 1a9f07e5 cset w5, ne // ne = any
tmp = 0;
4002c920: 52800004 mov w4, #0x0 // #0
if (sharpflag && num != 0) {
4002c924: 6a050181 ands w1, w12, w5
4002c928: b9009be1 str w1, [sp, #152]
4002c92c: 54000100 b.eq 4002c94c <_IO_Vprintf+0x29c> // b.none
if (base == 8)
4002c930: b9409fe1 ldr w1, [sp, #156]
tmp++;
4002c934: 52800024 mov w4, #0x1 // #1
if (base == 8)
4002c938: 7100203f cmp w1, #0x8
4002c93c: 54000080 b.eq 4002c94c <_IO_Vprintf+0x29c> // b.none <== NEVER TAKEN
tmp = 0;
4002c940: 7100403f cmp w1, #0x10
4002c944: 1a9f17e4 cset w4, eq // eq = none
4002c948: 531f7884 lsl w4, w4, #1
tmp++;
4002c94c: 7100033f cmp w25, #0x0
if (!ladjust && padc == '0')
4002c950: b9408be1 ldr w1, [sp, #136]
tmp++;
4002c954: 1a840484 cinc w4, w4, ne // ne = any
if (!ladjust && padc == '0')
4002c958: 7100c31f cmp w24, #0x30
4002c95c: 1a9f17e7 cset w7, eq // eq = none
4002c960: 52000025 eor w5, w1, #0x1
4002c964: 6a0700bf tst w5, w7
4002c968: 54002640 b.eq 4002ce30 <_IO_Vprintf+0x780> // b.none
dwidth = width - tmp;
4002c96c: 4b040105 sub w5, w8, w4
dwidth -= n;
4002c970: 6b0000a1 subs w1, w5, w0
4002c974: b90097e1 str w1, [sp, #148]
static inline int imax(int a, int b) { return (a > b ? a : b); }
4002c978: 1a80a0b8 csel w24, w5, w0, ge // ge = tcont
width -= tmp + imax(dwidth, n);
4002c97c: 0b040318 add w24, w24, w4
4002c980: 4b180100 sub w0, w8, w24
4002c984: b9006be0 str w0, [sp, #104]
while (width-- > 0)
4002c988: b9406be0 ldr w0, [sp, #104]
4002c98c: 51000418 sub w24, w0, #0x1
4002c990: b9006bf8 str w24, [sp, #104]
4002c994: 7100001f cmp w0, #0x0
4002c998: 540001ad b.le 4002c9cc <_IO_Vprintf+0x31c>
4002c99c: d503201f nop
4002c9a0: b9406be0 ldr w0, [sp, #104]
PCHAR(' ');
4002c9a4: aa1b03e1 mov x1, x27
while (width-- > 0)
4002c9a8: 51000400 sub w0, w0, #0x1
4002c9ac: b9006be0 str w0, [sp, #104]
PCHAR(' ');
4002c9b0: 52800400 mov w0, #0x20 // #32
4002c9b4: d63f0260 blr x19
while (width-- > 0)
4002c9b8: b9406be0 ldr w0, [sp, #104]
4002c9bc: 3100041f cmn w0, #0x1
4002c9c0: 54ffff01 b.ne 4002c9a0 <_IO_Vprintf+0x2f0> // b.any
PCHAR(' ');
4002c9c4: 11000783 add w3, w28, #0x1
4002c9c8: 0b18007c add w28, w3, w24
if (neg)
4002c9cc: 340000b9 cbz w25, 4002c9e0 <_IO_Vprintf+0x330>
PCHAR('-');
4002c9d0: 1100079c add w28, w28, #0x1
4002c9d4: aa1b03e1 mov x1, x27
4002c9d8: 528005a0 mov w0, #0x2d // #45
4002c9dc: d63f0260 blr x19
if (sharpflag && num != 0) {
4002c9e0: b9409be0 ldr w0, [sp, #152]
4002c9e4: 340001e0 cbz w0, 4002ca20 <_IO_Vprintf+0x370>
if (base == 8) {
4002c9e8: b9409fe0 ldr w0, [sp, #156]
4002c9ec: 7100201f cmp w0, #0x8
4002c9f0: 54002700 b.eq 4002ced0 <_IO_Vprintf+0x820> // b.none <== NEVER TAKEN
} else if (base == 16) {
4002c9f4: b9409fe0 ldr w0, [sp, #156]
4002c9f8: 7100401f cmp w0, #0x10
4002c9fc: 54000121 b.ne 4002ca20 <_IO_Vprintf+0x370> // b.any <== NEVER TAKEN
PCHAR('0');
4002ca00: aa1b03e1 mov x1, x27
4002ca04: 52800600 mov w0, #0x30 // #48
4002ca08: d63f0260 blr x19
PCHAR('x');
4002ca0c: 11000b9c add w28, w28, #0x2
4002ca10: aa1b03e1 mov x1, x27
4002ca14: 52800f00 mov w0, #0x78 // #120
4002ca18: d63f0260 blr x19
4002ca1c: d503201f nop
while (dwidth-- > 0)
4002ca20: b94097e0 ldr w0, [sp, #148]
4002ca24: 7100001f cmp w0, #0x0
4002ca28: 51000418 sub w24, w0, #0x1
4002ca2c: 5400016d b.le 4002ca58 <_IO_Vprintf+0x3a8>
4002ca30: 2a1803f9 mov w25, w24
4002ca34: d503201f nop
4002ca38: 51000739 sub w25, w25, #0x1
PCHAR('0');
4002ca3c: aa1b03e1 mov x1, x27
4002ca40: 52800600 mov w0, #0x30 // #48
4002ca44: d63f0260 blr x19
while (dwidth-- > 0)
4002ca48: 3100073f cmn w25, #0x1
4002ca4c: 54ffff61 b.ne 4002ca38 <_IO_Vprintf+0x388> // b.any
4002ca50: 11000783 add w3, w28, #0x1
PCHAR('0');
4002ca54: 0b03031c add w28, w24, w3
while (*p)
4002ca58: 340026da cbz w26, 4002cf30 <_IO_Vprintf+0x880> <== NEVER TAKEN
*++p = hex2ascii_data[upper][num % base];
4002ca5c: aa1603f8 mov x24, x22
PCHAR(*p--);
4002ca60: d1000718 sub x24, x24, #0x1
4002ca64: 2a1a03e0 mov w0, w26
4002ca68: aa1b03e1 mov x1, x27
4002ca6c: d63f0260 blr x19
4002ca70: 4b1802c4 sub w4, w22, w24
while (*p)
4002ca74: 3940031a ldrb w26, [x24]
4002ca78: 0b1c0099 add w25, w4, w28
4002ca7c: 35ffff3a cbnz w26, 4002ca60 <_IO_Vprintf+0x3b0>
if (ladjust)
4002ca80: b9408be0 ldr w0, [sp, #136]
4002ca84: 35001f80 cbnz w0, 4002ce74 <_IO_Vprintf+0x7c4>
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002ca88: 394006e0 ldrb w0, [x23, #1]
4002ca8c: 52800015 mov w21, #0x0 // #0
4002ca90: 17ffff22 b 4002c718 <_IO_Vprintf+0x68>
PCHAR(ch);
4002ca94: 528004a0 mov w0, #0x25 // #37
4002ca98: aa1b03e1 mov x1, x27
4002ca9c: d63f0260 blr x19
4002caa0: 11000799 add w25, w28, #0x1
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002caa4: 394006e0 ldrb w0, [x23, #1]
4002caa8: 17ffff1c b 4002c718 <_IO_Vprintf+0x68>
num = (uintptr_t)va_arg(ap, void *);
4002caac: b94093e0 ldr w0, [sp, #144]
sharpflag = (width == 0);
4002cab0: 7100011f cmp w8, #0x0
4002cab4: 1a9f17ec cset w12, eq // eq = none
num = (uintptr_t)va_arg(ap, void *);
4002cab8: 37f82d80 tbnz w0, #31, 4002d068 <_IO_Vprintf+0x9b8> <== ALWAYS TAKEN
4002cabc: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002cac0: 91003ca0 add x0, x5, #0xf <== NOT EXECUTED
4002cac4: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002cac8: f90033e0 str x0, [sp, #96] <== NOT EXECUTED
goto number;
4002cacc: d2800204 mov x4, #0x10 // #16
base = 16;
4002cad0: b9009fe4 str w4, [sp, #156]
sign = 0; dot = 0; dwidth = 0; upper = 0;
4002cad4: 52800000 mov w0, #0x0 // #0
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002cad8: 52800019 mov w25, #0x0 // #0
num = (uintptr_t)va_arg(ap, void *);
4002cadc: f94000ad ldr x13, [x5]
goto number;
4002cae0: 17ffff7e b 4002c8d8 <_IO_Vprintf+0x228>
p = va_arg(ap, char *);
4002cae4: b94093e0 ldr w0, [sp, #144]
4002cae8: 37f82900 tbnz w0, #31, 4002d008 <_IO_Vprintf+0x958>
4002caec: f94033e0 ldr x0, [sp, #96]
4002caf0: 91003c04 add x4, x0, #0xf
4002caf4: 927df081 and x1, x4, #0xfffffffffffffff8
4002caf8: f90033e1 str x1, [sp, #96]
4002cafc: f9400019 ldr x25, [x0]
p = "(null)";
4002cb00: b0000080 adrp x0, 4003d000 <access_modes_assoc+0x10>
4002cb04: 91392000 add x0, x0, #0xe48
if (!ladjust && width > 0)
4002cb08: b9408be1 ldr w1, [sp, #136]
p = "(null)";
4002cb0c: f100033f cmp x25, #0x0
if (!ladjust && width > 0)
4002cb10: 52000036 eor w22, w1, #0x1
p = "(null)";
4002cb14: 9a990019 csel x25, x0, x25, eq // eq = none
if (!ladjust && width > 0)
4002cb18: 120002d6 and w22, w22, #0x1
if (!dot)
4002cb1c: 3500304e cbnz w14, 4002d124 <_IO_Vprintf+0xa74>
n = strlen (p);
4002cb20: aa1903e0 mov x0, x25
4002cb24: b9006be8 str w8, [sp, #104]
4002cb28: 94000a9c bl 4002f598 <strlen>
4002cb2c: 2a0003e5 mov w5, w0
4002cb30: b9406be8 ldr w8, [sp, #104]
width -= n;
4002cb34: 4b050108 sub w8, w8, w5
while (n--)
4002cb38: 510004a0 sub w0, w5, #0x1
if (!ladjust && width > 0)
4002cb3c: 7100011f cmp w8, #0x0
while (n--)
4002cb40: b90097e0 str w0, [sp, #148]
if (!ladjust && width > 0)
4002cb44: 1a9fd7e0 cset w0, gt
4002cb48: 7100001f cmp w0, #0x0
4002cb4c: 7a401ac4 ccmp w22, #0x0, #0x4, ne // ne = any
4002cb50: 540034a1 b.ne 4002d1e4 <_IO_Vprintf+0xb34> // b.any
if (ladjust && width > 0)
4002cb54: b9408be1 ldr w1, [sp, #136]
4002cb58: 0a000020 and w0, w1, w0
4002cb5c: 2a0003fa mov w26, w0
while (n--)
4002cb60: 34004445 cbz w5, 4002d3e8 <_IO_Vprintf+0xd38>
4002cb64: b94097f6 ldr w22, [sp, #148]
4002cb68: 910006d6 add x22, x22, #0x1
4002cb6c: 8b160336 add x22, x25, x22
PCHAR(*p++);
4002cb70: 38401720 ldrb w0, [x25], #1
4002cb74: aa1b03e1 mov x1, x27
4002cb78: b9006be8 str w8, [sp, #104]
4002cb7c: d63f0260 blr x19
while (n--)
4002cb80: b9406be8 ldr w8, [sp, #104]
4002cb84: eb1902df cmp x22, x25
4002cb88: 54ffff41 b.ne 4002cb70 <_IO_Vprintf+0x4c0> // b.any
PCHAR(*p++);
4002cb8c: b94097e0 ldr w0, [sp, #148]
4002cb90: 11000783 add w3, w28, #0x1
4002cb94: 0b030019 add w25, w0, w3
if (ladjust && width > 0)
4002cb98: 34ffe07a cbz w26, 4002c7a4 <_IO_Vprintf+0xf4>
while (width--)
4002cb9c: 51000516 sub w22, w8, #0x1
4002cba0: 2a0803fa mov w26, w8
PCHAR(padc);
4002cba4: aa1b03e1 mov x1, x27
4002cba8: 2a1803e0 mov w0, w24
4002cbac: d63f0260 blr x19
while (width--)
4002cbb0: 7100075a subs w26, w26, #0x1
4002cbb4: 54ffff81 b.ne 4002cba4 <_IO_Vprintf+0x4f4> // b.any
4002cbb8: 11000724 add w4, w25, #0x1
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002cbbc: 394006e0 ldrb w0, [x23, #1]
PCHAR(padc);
4002cbc0: 0b160099 add w25, w4, w22
4002cbc4: 17fffed5 b 4002c718 <_IO_Vprintf+0x68>
up = va_arg(ap, u_char *);
4002cbc8: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002cbcc: 37f81f60 tbnz w0, #31, 4002cfb8 <_IO_Vprintf+0x908> <== NOT EXECUTED
4002cbd0: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002cbd4: 91003c00 add x0, x0, #0xf <== NOT EXECUTED
4002cbd8: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002cbdc: f94033e1 ldr x1, [sp, #96] <== NOT EXECUTED
4002cbe0: f9400036 ldr x22, [x1] <== NOT EXECUTED
p = va_arg(ap, char *);
4002cbe4: 91003c1a add x26, x0, #0xf <== NOT EXECUTED
4002cbe8: 927df341 and x1, x26, #0xfffffffffffffff8 <== NOT EXECUTED
4002cbec: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cbf0: f9400001 ldr x1, [x0] <== NOT EXECUTED
while(width--) {
4002cbf4: 7100011f cmp w8, #0x0 <== NOT EXECUTED
4002cbf8: 51000500 sub w0, w8, #0x1 <== NOT EXECUTED
4002cbfc: 528001e4 mov w4, #0xf // #15 <== NOT EXECUTED
4002cc00: 52800078 mov w24, #0x3 // #3 <== NOT EXECUTED
4002cc04: 1a841000 csel w0, w0, w4, ne // ne = any <== NOT EXECUTED
4002cc08: 4b010318 sub w24, w24, w1 <== NOT EXECUTED
4002cc0c: 8b0002c0 add x0, x22, x0 <== NOT EXECUTED
4002cc10: f90037e0 str x0, [sp, #104] <== NOT EXECUTED
p = va_arg(ap, char *);
4002cc14: f90047e1 str x1, [sp, #136] <== NOT EXECUTED
PCHAR(hex2ascii(*up >> 4));
4002cc18: 394002c0 ldrb w0, [x22] <== NOT EXECUTED
4002cc1c: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002cc20: f9403bfa ldr x26, [sp, #112] <== NOT EXECUTED
PCHAR(hex2ascii(*up & 0x0f));
4002cc24: 11000b99 add w25, w28, #0x2 <== NOT EXECUTED
PCHAR(hex2ascii(*up >> 4));
4002cc28: d3441c00 ubfx x0, x0, #4, #4 <== NOT EXECUTED
4002cc2c: 387a6800 ldrb w0, [x0, x26] <== NOT EXECUTED
4002cc30: d63f0260 blr x19 <== NOT EXECUTED
PCHAR(hex2ascii(*up & 0x0f));
4002cc34: 394002c0 ldrb w0, [x22] <== NOT EXECUTED
4002cc38: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002cc3c: 92400c00 and x0, x0, #0xf <== NOT EXECUTED
4002cc40: 387a6800 ldrb w0, [x0, x26] <== NOT EXECUTED
4002cc44: d63f0260 blr x19 <== NOT EXECUTED
if (width)
4002cc48: f94037e0 ldr x0, [sp, #104] <== NOT EXECUTED
4002cc4c: eb16001f cmp x0, x22 <== NOT EXECUTED
4002cc50: 54ffdaa0 b.eq 4002c7a4 <_IO_Vprintf+0xf4> // b.none <== NOT EXECUTED
for (q=p;*q;q++)
4002cc54: f94047fa ldr x26, [sp, #136] <== NOT EXECUTED
4002cc58: 39400340 ldrb w0, [x26] <== NOT EXECUTED
4002cc5c: 340000e0 cbz w0, 4002cc78 <_IO_Vprintf+0x5c8> <== NOT EXECUTED
PCHAR(*q);
4002cc60: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002cc64: d63f0260 blr x19 <== NOT EXECUTED
4002cc68: 0b1a0384 add w4, w28, w26 <== NOT EXECUTED
for (q=p;*q;q++)
4002cc6c: 38401f40 ldrb w0, [x26, #1]! <== NOT EXECUTED
4002cc70: 0b040319 add w25, w24, w4 <== NOT EXECUTED
4002cc74: 35ffff60 cbnz w0, 4002cc60 <_IO_Vprintf+0x5b0> <== NOT EXECUTED
up++;
4002cc78: 910006d6 add x22, x22, #0x1 <== NOT EXECUTED
4002cc7c: 2a1903fc mov w28, w25 <== NOT EXECUTED
4002cc80: 17ffffe6 b 4002cc18 <_IO_Vprintf+0x568> <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cc84: d2800204 mov x4, #0x10 // #16
upper = 1;
4002cc88: 52800020 mov w0, #0x1 // #1
base = 16;
4002cc8c: b9009fe4 str w4, [sp, #156]
num = va_arg(ap, uintmax_t);
4002cc90: b94093e1 ldr w1, [sp, #144]
if (jflag)
4002cc94: 34000e19 cbz w25, 4002ce54 <_IO_Vprintf+0x7a4>
num = va_arg(ap, uintmax_t);
4002cc98: 37f81381 tbnz w1, #31, 4002cf08 <_IO_Vprintf+0x858> <== ALWAYS TAKEN
4002cc9c: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002cca0: 91003ca6 add x6, x5, #0xf <== NOT EXECUTED
4002cca4: 927df0c1 and x1, x6, #0xfffffffffffffff8 <== NOT EXECUTED
4002cca8: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002ccac: 52800019 mov w25, #0x0 // #0
num = va_arg(ap, uintmax_t);
4002ccb0: f94000ad ldr x13, [x5]
4002ccb4: 17ffff09 b 4002c8d8 <_IO_Vprintf+0x228>
if (!ladjust && width > 0)
4002ccb8: b9408be0 ldr w0, [sp, #136]
4002ccbc: 7100051f cmp w8, #0x1
4002ccc0: 1a9fd7f6 cset w22, gt
4002ccc4: 52000000 eor w0, w0, #0x1
4002ccc8: 6a16001f tst w0, w22
4002cccc: 54002001 b.ne 4002d0cc <_IO_Vprintf+0xa1c> // b.any <== NEVER TAKEN
PCHAR(va_arg(ap, int));
4002ccd0: b94093e0 ldr w0, [sp, #144]
4002ccd4: 37f81e80 tbnz w0, #31, 4002d0a4 <_IO_Vprintf+0x9f4> <== ALWAYS TAKEN
4002ccd8: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002ccdc: 91002c04 add x4, x0, #0xb <== NOT EXECUTED
4002cce0: 927df081 and x1, x4, #0xfffffffffffffff8 <== NOT EXECUTED
4002cce4: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cce8: b9400000 ldr w0, [x0]
4002ccec: aa1b03e1 mov x1, x27
4002ccf0: b9006be8 str w8, [sp, #104]
4002ccf4: 11000799 add w25, w28, #0x1
4002ccf8: d63f0260 blr x19
if (ladjust && width > 0)
4002ccfc: b9408be0 ldr w0, [sp, #136]
4002cd00: b9406be8 ldr w8, [sp, #104]
4002cd04: 6a16001f tst w0, w22
4002cd08: 54ffd4e0 b.eq 4002c7a4 <_IO_Vprintf+0xf4> // b.none <== ALWAYS TAKEN
while (width--)
4002cd0c: 51000919 sub w25, w8, #0x2 <== NOT EXECUTED
4002cd10: 51000916 sub w22, w8, #0x2 <== NOT EXECUTED
PCHAR(padc);
4002cd14: d280001a mov x26, #0x0 // #0 <== NOT EXECUTED
PCHAR(padc);
4002cd18: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002cd1c: 2a1803e0 mov w0, w24 <== NOT EXECUTED
4002cd20: d63f0260 blr x19 <== NOT EXECUTED
while (width--)
4002cd24: eb16035f cmp x26, x22 <== NOT EXECUTED
4002cd28: 9100075a add x26, x26, #0x1 <== NOT EXECUTED
4002cd2c: 54ffff61 b.ne 4002cd18 <_IO_Vprintf+0x668> // b.any <== NOT EXECUTED
PCHAR(padc);
4002cd30: 11000b83 add w3, w28, #0x2 <== NOT EXECUTED
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002cd34: 394006e0 ldrb w0, [x23, #1] <== NOT EXECUTED
PCHAR(padc);
4002cd38: 0b190079 add w25, w3, w25 <== NOT EXECUTED
4002cd3c: 17fffe77 b 4002c718 <_IO_Vprintf+0x68> <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cd40: 394006e0 ldrb w0, [x23, #1] <== NOT EXECUTED
sharpflag = 1;
4002cd44: 5280002c mov w12, #0x1 // #1 <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cd48: aa1403f7 mov x23, x20 <== NOT EXECUTED
goto reswitch;
4002cd4c: 17fffe8c b 4002c77c <_IO_Vprintf+0xcc> <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cd50: 394006e0 ldrb w0, [x23, #1]
if (hflag) {
4002cd54: 3500106b cbnz w11, 4002cf60 <_IO_Vprintf+0x8b0>
reswitch: switch (ch = (u_char)*fmt++) {
4002cd58: aa1403f7 mov x23, x20
hflag = 1;
4002cd5c: 5280002b mov w11, #0x1 // #1
4002cd60: 17fffe87 b 4002c77c <_IO_Vprintf+0xcc>
reswitch: switch (ch = (u_char)*fmt++) {
4002cd64: 394006e0 ldrb w0, [x23, #1]
jflag = 1;
4002cd68: 52800039 mov w25, #0x1 // #1
reswitch: switch (ch = (u_char)*fmt++) {
4002cd6c: aa1403f7 mov x23, x20
goto reswitch;
4002cd70: 17fffe83 b 4002c77c <_IO_Vprintf+0xcc>
width = va_arg(ap, int);
4002cd74: b94093e0 ldr w0, [sp, #144]
if (!dot) {
4002cd78: 350010ee cbnz w14, 4002cf94 <_IO_Vprintf+0x8e4> <== ALWAYS TAKEN
width = va_arg(ap, int);
4002cd7c: 37f826e0 tbnz w0, #31, 4002d258 <_IO_Vprintf+0xba8> <== NOT EXECUTED
4002cd80: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002cd84: 91002c04 add x4, x0, #0xb <== NOT EXECUTED
4002cd88: 927df081 and x1, x4, #0xfffffffffffffff8 <== NOT EXECUTED
4002cd8c: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cd90: b9400008 ldr w8, [x0] <== NOT EXECUTED
if (width < 0) {
4002cd94: 36ffd548 tbz w8, #31, 4002c83c <_IO_Vprintf+0x18c> <== NOT EXECUTED
ladjust = !ladjust;
4002cd98: b9408be1 ldr w1, [sp, #136] <== NOT EXECUTED
width = -width;
4002cd9c: 4b0803e8 neg w8, w8 <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cda0: 394006e0 ldrb w0, [x23, #1] <== NOT EXECUTED
4002cda4: aa1403f7 mov x23, x20 <== NOT EXECUTED
4002cda8: 52000021 eor w1, w1, #0x1 <== NOT EXECUTED
4002cdac: b9008be1 str w1, [sp, #136] <== NOT EXECUTED
width = -width;
4002cdb0: 17fffe73 b 4002c77c <_IO_Vprintf+0xcc> <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cdb4: 394006e0 ldrb w0, [x23, #1]
ladjust = 1;
4002cdb8: 52800021 mov w1, #0x1 // #1
reswitch: switch (ch = (u_char)*fmt++) {
4002cdbc: aa1403f7 mov x23, x20
ladjust = 1;
4002cdc0: b9008be1 str w1, [sp, #136]
goto reswitch;
4002cdc4: 17fffe6e b 4002c77c <_IO_Vprintf+0xcc>
reswitch: switch (ch = (u_char)*fmt++) {
4002cdc8: 394006e0 ldrb w0, [x23, #1]
dot = 1;
4002cdcc: 5280002e mov w14, #0x1 // #1
reswitch: switch (ch = (u_char)*fmt++) {
4002cdd0: aa1403f7 mov x23, x20
4002cdd4: 17fffe6a b 4002c77c <_IO_Vprintf+0xcc>
if (lflag) {
4002cdd8: 34ffd267 cbz w7, 4002c824 <_IO_Vprintf+0x174>
reswitch: switch (ch = (u_char)*fmt++) {
4002cddc: 394006e0 ldrb w0, [x23, #1]
jflag = 1;
4002cde0: 2a0703f9 mov w25, w7
reswitch: switch (ch = (u_char)*fmt++) {
4002cde4: aa1403f7 mov x23, x20
4002cde8: 17fffe65 b 4002c77c <_IO_Vprintf+0xcc>
4002cdec: d2800104 mov x4, #0x8 // #8
sign = 0; dot = 0; dwidth = 0; upper = 0;
4002cdf0: 52800000 mov w0, #0x0 // #0
base = 8;
4002cdf4: b9009fe4 str w4, [sp, #156]
4002cdf8: 17ffffa6 b 4002cc90 <_IO_Vprintf+0x5e0>
reswitch: switch (ch = (u_char)*fmt++) {
4002cdfc: d2800144 mov x4, #0xa // #10
sign = 0; dot = 0; dwidth = 0; upper = 0;
4002ce00: 52800000 mov w0, #0x0 // #0
base = 10;
4002ce04: b9009fe4 str w4, [sp, #156]
4002ce08: 17ffffa2 b 4002cc90 <_IO_Vprintf+0x5e0>
reswitch: switch (ch = (u_char)*fmt++) {
4002ce0c: d2800204 mov x4, #0x10 // #16
4002ce10: 52800000 mov w0, #0x0 // #0
4002ce14: b9009fe4 str w4, [sp, #156]
4002ce18: 17ffff9e b 4002cc90 <_IO_Vprintf+0x5e0>
4002ce1c: d2800204 mov x4, #0x10 // #16 <== NOT EXECUTED
4002ce20: b9009fe4 str w4, [sp, #156] <== NOT EXECUTED
4002ce24: 17fffe9e b 4002c89c <_IO_Vprintf+0x1ec> <== NOT EXECUTED
4002ce28: aa1403f7 mov x23, x20
4002ce2c: 17fffe96 b 4002c884 <_IO_Vprintf+0x1d4>
dwidth -= n;
4002ce30: 6b000141 subs w1, w10, w0
4002ce34: b90097e1 str w1, [sp, #148]
static inline int imax(int a, int b) { return (a > b ? a : b); }
4002ce38: 1a80a158 csel w24, w10, w0, ge // ge = tcont
width -= tmp + imax(dwidth, n);
4002ce3c: 0b040318 add w24, w24, w4
4002ce40: 4b180100 sub w0, w8, w24
4002ce44: b9006be0 str w0, [sp, #104]
if (!ladjust)
4002ce48: b9408be0 ldr w0, [sp, #136]
4002ce4c: 35ffdc00 cbnz w0, 4002c9cc <_IO_Vprintf+0x31c>
4002ce50: 17fffece b 4002c988 <_IO_Vprintf+0x2d8>
else if (lflag)
4002ce54: 34000487 cbz w7, 4002cee4 <_IO_Vprintf+0x834>
num = va_arg(ap, u_long);
4002ce58: 37f80c21 tbnz w1, #31, 4002cfdc <_IO_Vprintf+0x92c>
4002ce5c: f94033e5 ldr x5, [sp, #96]
4002ce60: 91003ca6 add x6, x5, #0xf
4002ce64: 927df0c1 and x1, x6, #0xfffffffffffffff8
4002ce68: f90033e1 str x1, [sp, #96]
4002ce6c: f94000ad ldr x13, [x5]
4002ce70: 17fffe9a b 4002c8d8 <_IO_Vprintf+0x228>
while (width-- > 0)
4002ce74: b9406be0 ldr w0, [sp, #104]
4002ce78: 7100001f cmp w0, #0x0
4002ce7c: 51000418 sub w24, w0, #0x1
4002ce80: 54ffc92d b.le 4002c7a4 <_IO_Vprintf+0xf4>
4002ce84: 2a1803f6 mov w22, w24
4002ce88: 510006d6 sub w22, w22, #0x1
PCHAR(' ');
4002ce8c: aa1b03e1 mov x1, x27
4002ce90: 52800400 mov w0, #0x20 // #32
4002ce94: d63f0260 blr x19
while (width-- > 0)
4002ce98: 310006df cmn w22, #0x1
4002ce9c: 54ffff61 b.ne 4002ce88 <_IO_Vprintf+0x7d8> // b.any <== NEVER TAKEN
4002cea0: 11000724 add w4, w25, #0x1
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002cea4: 394006e0 ldrb w0, [x23, #1]
PCHAR(' ');
4002cea8: 0b040319 add w25, w24, w4
4002ceac: 17fffe1b b 4002c718 <_IO_Vprintf+0x68>
num = va_arg(ap, ptrdiff_t);
4002ceb0: 37f80440 tbnz w0, #31, 4002cf38 <_IO_Vprintf+0x888> <== ALWAYS TAKEN
4002ceb4: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002ceb8: 91003c05 add x5, x0, #0xf <== NOT EXECUTED
4002cebc: 927df0a1 and x1, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002cec0: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cec4: f9400000 ldr x0, [x0]
4002cec8: aa0003ed mov x13, x0
4002cecc: 17fffe7f b 4002c8c8 <_IO_Vprintf+0x218>
PCHAR('0');
4002ced0: 1100079c add w28, w28, #0x1 <== NOT EXECUTED
4002ced4: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002ced8: 52800600 mov w0, #0x30 // #48 <== NOT EXECUTED
4002cedc: d63f0260 blr x19 <== NOT EXECUTED
4002cee0: 17fffed0 b 4002ca20 <_IO_Vprintf+0x370> <== NOT EXECUTED
else if (hflag)
4002cee4: 3400046b cbz w11, 4002cf70 <_IO_Vprintf+0x8c0> <== ALWAYS TAKEN
num = (u_short)va_arg(ap, int);
4002cee8: 37f81f61 tbnz w1, #31, 4002d2d4 <_IO_Vprintf+0xc24> <== NOT EXECUTED
4002ceec: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002cef0: 91002ca6 add x6, x5, #0xb <== NOT EXECUTED
4002cef4: 927df0c1 and x1, x6, #0xfffffffffffffff8 <== NOT EXECUTED
4002cef8: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cefc: 794000ad ldrh w13, [x5] <== NOT EXECUTED
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002cf00: 52800019 mov w25, #0x0 // #0 <== NOT EXECUTED
4002cf04: 17fffe75 b 4002c8d8 <_IO_Vprintf+0x228> <== NOT EXECUTED
num = va_arg(ap, uintmax_t);
4002cf08: b94093e1 ldr w1, [sp, #144]
4002cf0c: 11002026 add w6, w1, #0x8
4002cf10: 710000df cmp w6, #0x0
4002cf14: 54000bed b.le 4002d090 <_IO_Vprintf+0x9e0> <== ALWAYS TAKEN
4002cf18: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002cf1c: b90093e6 str w6, [sp, #144] <== NOT EXECUTED
4002cf20: 91003ca7 add x7, x5, #0xf <== NOT EXECUTED
4002cf24: 927df0e1 and x1, x7, #0xfffffffffffffff8 <== NOT EXECUTED
4002cf28: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cf2c: 17ffff60 b 4002ccac <_IO_Vprintf+0x5fc> <== NOT EXECUTED
while (*p)
4002cf30: 2a1c03f9 mov w25, w28 <== NOT EXECUTED
4002cf34: 17fffed3 b 4002ca80 <_IO_Vprintf+0x3d0> <== NOT EXECUTED
num = va_arg(ap, ptrdiff_t);
4002cf38: b94093e0 ldr w0, [sp, #144]
4002cf3c: 11002005 add w5, w0, #0x8
4002cf40: 710000bf cmp w5, #0x0
4002cf44: 540011cd b.le 4002d17c <_IO_Vprintf+0xacc> <== ALWAYS TAKEN
4002cf48: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002cf4c: b90093e5 str w5, [sp, #144] <== NOT EXECUTED
4002cf50: 91003c06 add x6, x0, #0xf <== NOT EXECUTED
4002cf54: 927df0c1 and x1, x6, #0xfffffffffffffff8 <== NOT EXECUTED
4002cf58: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cf5c: 17ffffda b 4002cec4 <_IO_Vprintf+0x814> <== NOT EXECUTED
cflag = 1;
4002cf60: 2a0b03ed mov w13, w11
reswitch: switch (ch = (u_char)*fmt++) {
4002cf64: aa1403f7 mov x23, x20
hflag = 0;
4002cf68: 5280000b mov w11, #0x0 // #0
4002cf6c: 17fffe04 b 4002c77c <_IO_Vprintf+0xcc>
else if (cflag)
4002cf70: 340015ed cbz w13, 4002d22c <_IO_Vprintf+0xb7c>
num = (u_char)va_arg(ap, int);
4002cf74: 37f81e21 tbnz w1, #31, 4002d338 <_IO_Vprintf+0xc88> <== ALWAYS TAKEN
4002cf78: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002cf7c: 91002ca6 add x6, x5, #0xb <== NOT EXECUTED
4002cf80: 927df0c1 and x1, x6, #0xfffffffffffffff8 <== NOT EXECUTED
4002cf84: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002cf88: 394000ad ldrb w13, [x5]
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002cf8c: 52800019 mov w25, #0x0 // #0
4002cf90: 17fffe52 b 4002c8d8 <_IO_Vprintf+0x228>
dwidth = va_arg(ap, int);
4002cf94: 37f818c0 tbnz w0, #31, 4002d2ac <_IO_Vprintf+0xbfc> <== ALWAYS TAKEN
4002cf98: f94033e4 ldr x4, [sp, #96] <== NOT EXECUTED
4002cf9c: 91002c80 add x0, x4, #0xb <== NOT EXECUTED
4002cfa0: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002cfa4: f90033e0 str x0, [sp, #96] <== NOT EXECUTED
reswitch: switch (ch = (u_char)*fmt++) {
4002cfa8: 394006e0 ldrb w0, [x23, #1]
4002cfac: aa1403f7 mov x23, x20
dwidth = va_arg(ap, int);
4002cfb0: b940008a ldr w10, [x4]
4002cfb4: 17fffdf2 b 4002c77c <_IO_Vprintf+0xcc>
up = va_arg(ap, u_char *);
4002cfb8: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002cfbc: 11002000 add w0, w0, #0x8 <== NOT EXECUTED
4002cfc0: 7100001f cmp w0, #0x0 <== NOT EXECUTED
4002cfc4: 5400036d b.le 4002d030 <_IO_Vprintf+0x980> <== NOT EXECUTED
4002cfc8: f94033e1 ldr x1, [sp, #96] <== NOT EXECUTED
4002cfcc: b90093e0 str w0, [sp, #144] <== NOT EXECUTED
4002cfd0: 91003c24 add x4, x1, #0xf <== NOT EXECUTED
4002cfd4: 927df080 and x0, x4, #0xfffffffffffffff8 <== NOT EXECUTED
4002cfd8: 17ffff01 b 4002cbdc <_IO_Vprintf+0x52c> <== NOT EXECUTED
num = va_arg(ap, u_long);
4002cfdc: b94093e1 ldr w1, [sp, #144]
4002cfe0: 11002026 add w6, w1, #0x8
4002cfe4: 710000df cmp w6, #0x0
4002cfe8: 5400156d b.le 4002d294 <_IO_Vprintf+0xbe4> <== ALWAYS TAKEN
4002cfec: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002cff0: b90093e6 str w6, [sp, #144] <== NOT EXECUTED
4002cff4: 91003ca7 add x7, x5, #0xf <== NOT EXECUTED
4002cff8: 927df0e1 and x1, x7, #0xfffffffffffffff8 <== NOT EXECUTED
4002cffc: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d000: f94000ad ldr x13, [x5] <== NOT EXECUTED
4002d004: 17fffe35 b 4002c8d8 <_IO_Vprintf+0x228> <== NOT EXECUTED
p = va_arg(ap, char *);
4002d008: b94093e0 ldr w0, [sp, #144]
4002d00c: 11002004 add w4, w0, #0x8
4002d010: 7100009f cmp w4, #0x0
4002d014: 5400174d b.le 4002d2fc <_IO_Vprintf+0xc4c> <== ALWAYS TAKEN
4002d018: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d01c: b90093e4 str w4, [sp, #144] <== NOT EXECUTED
4002d020: 91003c05 add x5, x0, #0xf <== NOT EXECUTED
4002d024: 927df0a1 and x1, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002d028: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d02c: 17fffeb4 b 4002cafc <_IO_Vprintf+0x44c> <== NOT EXECUTED
up = va_arg(ap, u_char *);
4002d030: b94093e2 ldr w2, [sp, #144] <== NOT EXECUTED
4002d034: f9403fe1 ldr x1, [sp, #120] <== NOT EXECUTED
4002d038: f862c836 ldr x22, [x1, w2, sxtw] <== NOT EXECUTED
p = va_arg(ap, char *);
4002d03c: 54002600 b.eq 4002d4fc <_IO_Vprintf+0xe4c> // b.none <== NOT EXECUTED
4002d040: b94093e1 ldr w1, [sp, #144] <== NOT EXECUTED
4002d044: 11004021 add w1, w1, #0x10 <== NOT EXECUTED
4002d048: b90093e1 str w1, [sp, #144] <== NOT EXECUTED
4002d04c: 7100003f cmp w1, #0x0 <== NOT EXECUTED
4002d050: 54000fed b.le 4002d24c <_IO_Vprintf+0xb9c> <== NOT EXECUTED
4002d054: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d058: 91003c04 add x4, x0, #0xf <== NOT EXECUTED
4002d05c: 927df081 and x1, x4, #0xfffffffffffffff8 <== NOT EXECUTED
4002d060: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d064: 17fffee3 b 4002cbf0 <_IO_Vprintf+0x540> <== NOT EXECUTED
num = (uintptr_t)va_arg(ap, void *);
4002d068: b94093e0 ldr w0, [sp, #144]
4002d06c: 11002000 add w0, w0, #0x8
4002d070: 7100001f cmp w0, #0x0
4002d074: 5400106d b.le 4002d280 <_IO_Vprintf+0xbd0> <== ALWAYS TAKEN
4002d078: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002d07c: b90093e0 str w0, [sp, #144] <== NOT EXECUTED
4002d080: 91003ca4 add x4, x5, #0xf <== NOT EXECUTED
4002d084: 927df080 and x0, x4, #0xfffffffffffffff8 <== NOT EXECUTED
4002d088: f90033e0 str x0, [sp, #96] <== NOT EXECUTED
4002d08c: 17fffe90 b 4002cacc <_IO_Vprintf+0x41c> <== NOT EXECUTED
num = va_arg(ap, uintmax_t);
4002d090: f9403fe2 ldr x2, [sp, #120]
4002d094: b94093e1 ldr w1, [sp, #144]
4002d098: b90093e6 str w6, [sp, #144]
4002d09c: 8b21c045 add x5, x2, w1, sxtw
4002d0a0: 17ffff03 b 4002ccac <_IO_Vprintf+0x5fc>
PCHAR(va_arg(ap, int));
4002d0a4: b94093e0 ldr w0, [sp, #144]
4002d0a8: 11002004 add w4, w0, #0x8
4002d0ac: 7100009f cmp w4, #0x0
4002d0b0: 5400192d b.le 4002d3d4 <_IO_Vprintf+0xd24> <== ALWAYS TAKEN
4002d0b4: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d0b8: b90093e4 str w4, [sp, #144] <== NOT EXECUTED
4002d0bc: 91002c05 add x5, x0, #0xb <== NOT EXECUTED
4002d0c0: 927df0a1 and x1, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002d0c4: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d0c8: 17ffff08 b 4002cce8 <_IO_Vprintf+0x638> <== NOT EXECUTED
while (width--)
4002d0cc: 51000919 sub w25, w8, #0x2 <== NOT EXECUTED
4002d0d0: 51000916 sub w22, w8, #0x2 <== NOT EXECUTED
PCHAR(padc);
4002d0d4: d280001a mov x26, #0x0 // #0 <== NOT EXECUTED
4002d0d8: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002d0dc: 2a1803e0 mov w0, w24 <== NOT EXECUTED
4002d0e0: d63f0260 blr x19 <== NOT EXECUTED
while (width--)
4002d0e4: eb16035f cmp x26, x22 <== NOT EXECUTED
4002d0e8: 9100075a add x26, x26, #0x1 <== NOT EXECUTED
4002d0ec: 54ffff61 b.ne 4002d0d8 <_IO_Vprintf+0xa28> // b.any <== NOT EXECUTED
PCHAR(va_arg(ap, int));
4002d0f0: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d0f4: 0b1c0323 add w3, w25, w28 <== NOT EXECUTED
4002d0f8: 37f81340 tbnz w0, #31, 4002d360 <_IO_Vprintf+0xcb0> <== NOT EXECUTED
4002d0fc: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d100: 91002c04 add x4, x0, #0xb <== NOT EXECUTED
4002d104: 927df081 and x1, x4, #0xfffffffffffffff8 <== NOT EXECUTED
4002d108: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d10c: b9400000 ldr w0, [x0] <== NOT EXECUTED
4002d110: 11000879 add w25, w3, #0x2 <== NOT EXECUTED
4002d114: aa1b03e1 mov x1, x27 <== NOT EXECUTED
4002d118: d63f0260 blr x19 <== NOT EXECUTED
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002d11c: 394006e0 ldrb w0, [x23, #1] <== NOT EXECUTED
4002d120: 17fffd7e b 4002c718 <_IO_Vprintf+0x68> <== NOT EXECUTED
for (n = 0; n < dwidth && p[n]; n++)
4002d124: 7100015f cmp w10, #0x0
4002d128: d2800006 mov x6, #0x0 // #0
4002d12c: 54001fad b.le 4002d520 <_IO_Vprintf+0xe70> <== NEVER TAKEN
4002d130: 38666b27 ldrb w7, [x25, x6]
4002d134: 2a0603e0 mov w0, w6
4002d138: 2a0603e5 mov w5, w6
4002d13c: 34ffcfc7 cbz w7, 4002cb34 <_IO_Vprintf+0x484>
4002d140: 110004c7 add w7, w6, #0x1
4002d144: 910004c6 add x6, x6, #0x1
4002d148: 6b06015f cmp w10, w6
4002d14c: 54ffff2c b.gt 4002d130 <_IO_Vprintf+0xa80>
width -= n;
4002d150: 4b070108 sub w8, w8, w7
if (!ladjust && width > 0)
4002d154: 7100011f cmp w8, #0x0
4002d158: 1a9fd7e6 cset w6, gt
4002d15c: 710002df cmp w22, #0x0
4002d160: 7a4018c4 ccmp w6, #0x0, #0x4, ne // ne = any
4002d164: 54001f21 b.ne 4002d548 <_IO_Vprintf+0xe98> // b.any <== NEVER TAKEN
if (ladjust && width > 0)
4002d168: b9408be1 ldr w1, [sp, #136]
4002d16c: b90097e0 str w0, [sp, #148]
4002d170: 0a060021 and w1, w1, w6
4002d174: 2a0103fa mov w26, w1
4002d178: 17fffe7b b 4002cb64 <_IO_Vprintf+0x4b4>
num = va_arg(ap, ptrdiff_t);
4002d17c: f9403fe1 ldr x1, [sp, #120]
4002d180: b94093e0 ldr w0, [sp, #144]
4002d184: b90093e5 str w5, [sp, #144]
4002d188: 8b20c020 add x0, x1, w0, sxtw
4002d18c: 17ffff4e b 4002cec4 <_IO_Vprintf+0x814>
ch = *fmt;
4002d190: 394006e5 ldrb w5, [x23, #1] <== NOT EXECUTED
if (ch < '0' || ch > '9')
4002d194: 5100c0a2 sub w2, w5, #0x30 <== NOT EXECUTED
ch = *fmt;
4002d198: 2a0503e0 mov w0, w5 <== NOT EXECUTED
if (ch < '0' || ch > '9')
4002d19c: 7100245f cmp w2, #0x9 <== NOT EXECUTED
4002d1a0: 54001ba8 b.hi 4002d514 <_IO_Vprintf+0xe64> // b.pmore <== NOT EXECUTED
n = n * 10 + ch - '0';
4002d1a4: 52800004 mov w4, #0x0 // #0 <== NOT EXECUTED
4002d1a8: 17fffdae b 4002c860 <_IO_Vprintf+0x1b0> <== NOT EXECUTED
else if (cflag)
4002d1ac: 34000eed cbz w13, 4002d388 <_IO_Vprintf+0xcd8> <== ALWAYS TAKEN
num = (char)va_arg(ap, int);
4002d1b0: 37f81480 tbnz w0, #31, 4002d440 <_IO_Vprintf+0xd90> <== NOT EXECUTED
4002d1b4: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d1b8: 91002c00 add x0, x0, #0xb <== NOT EXECUTED
4002d1bc: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002d1c0: f94033e1 ldr x1, [sp, #96] <== NOT EXECUTED
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002d1c4: 52800019 mov w25, #0x0 // #0 <== NOT EXECUTED
if (sharpflag && num != 0) {
4002d1c8: f90033e0 str x0, [sp, #96] <== NOT EXECUTED
4002d1cc: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
num = (char)va_arg(ap, int);
4002d1d0: 3940002d ldrb w13, [x1] <== NOT EXECUTED
if (sign && (intmax_t)num < 0) {
4002d1d4: 17fffdc1 b 4002c8d8 <_IO_Vprintf+0x228> <== NOT EXECUTED
if (!ladjust && width > 0)
4002d1d8: 12800000 mov w0, #0xffffffff // #-1 <== NOT EXECUTED
for (n = 0; n < dwidth && p[n]; n++)
4002d1dc: 52800005 mov w5, #0x0 // #0 <== NOT EXECUTED
if (!ladjust && width > 0)
4002d1e0: b90097e0 str w0, [sp, #148] <== NOT EXECUTED
while (width--)
4002d1e4: 51000516 sub w22, w8, #0x1
4002d1e8: 2a0803fa mov w26, w8
PCHAR(padc);
4002d1ec: b9006be5 str w5, [sp, #104]
4002d1f0: aa1b03e1 mov x1, x27
4002d1f4: 2a1803e0 mov w0, w24
4002d1f8: d63f0260 blr x19
while (width--)
4002d1fc: b9406be5 ldr w5, [sp, #104]
4002d200: 7100075a subs w26, w26, #0x1
4002d204: 54ffff41 b.ne 4002d1ec <_IO_Vprintf+0xb3c> // b.any
PCHAR(padc);
4002d208: 11000783 add w3, w28, #0x1
while (n--)
4002d20c: 5280001a mov w26, #0x0 // #0
PCHAR(padc);
4002d210: 0b16007c add w28, w3, w22
while (n--)
4002d214: 12800008 mov w8, #0xffffffff // #-1
4002d218: 35ffca65 cbnz w5, 4002cb64 <_IO_Vprintf+0x4b4> <== ALWAYS TAKEN
while ((ch = (u_char)*fmt++) != '%' || stop) {
4002d21c: 394006e0 ldrb w0, [x23, #1] <== NOT EXECUTED
PCHAR(padc);
4002d220: 2a1c03f9 mov w25, w28 <== NOT EXECUTED
while (n--)
4002d224: 52800015 mov w21, #0x0 // #0 <== NOT EXECUTED
4002d228: 17fffd3c b 4002c718 <_IO_Vprintf+0x68> <== NOT EXECUTED
num = va_arg(ap, u_int);
4002d22c: 37f80c01 tbnz w1, #31, 4002d3ac <_IO_Vprintf+0xcfc>
4002d230: f94033e5 ldr x5, [sp, #96]
4002d234: 91002ca6 add x6, x5, #0xb
4002d238: 927df0c1 and x1, x6, #0xfffffffffffffff8
4002d23c: f90033e1 str x1, [sp, #96]
4002d240: b94000ad ldr w13, [x5]
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002d244: 52800019 mov w25, #0x0 // #0
4002d248: 17fffda4 b 4002c8d8 <_IO_Vprintf+0x228>
p = va_arg(ap, char *);
4002d24c: f9403fe1 ldr x1, [sp, #120] <== NOT EXECUTED
4002d250: 8b20c020 add x0, x1, w0, sxtw <== NOT EXECUTED
4002d254: 17fffe67 b 4002cbf0 <_IO_Vprintf+0x540> <== NOT EXECUTED
width = va_arg(ap, int);
4002d258: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d25c: 11002004 add w4, w0, #0x8 <== NOT EXECUTED
4002d260: 7100009f cmp w4, #0x0 <== NOT EXECUTED
4002d264: 54000c6d b.le 4002d3f0 <_IO_Vprintf+0xd40> <== NOT EXECUTED
4002d268: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d26c: b90093e4 str w4, [sp, #144] <== NOT EXECUTED
4002d270: 91002c05 add x5, x0, #0xb <== NOT EXECUTED
4002d274: 927df0a1 and x1, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002d278: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d27c: 17fffec5 b 4002cd90 <_IO_Vprintf+0x6e0> <== NOT EXECUTED
num = (uintptr_t)va_arg(ap, void *);
4002d280: f9403fe2 ldr x2, [sp, #120]
4002d284: b94093e1 ldr w1, [sp, #144]
4002d288: b90093e0 str w0, [sp, #144]
4002d28c: 8b21c045 add x5, x2, w1, sxtw
4002d290: 17fffe0f b 4002cacc <_IO_Vprintf+0x41c>
num = va_arg(ap, u_long);
4002d294: f9403fe2 ldr x2, [sp, #120]
4002d298: b94093e1 ldr w1, [sp, #144]
4002d29c: b90093e6 str w6, [sp, #144]
4002d2a0: 8b21c045 add x5, x2, w1, sxtw
4002d2a4: f94000ad ldr x13, [x5]
4002d2a8: 17fffd8c b 4002c8d8 <_IO_Vprintf+0x228>
dwidth = va_arg(ap, int);
4002d2ac: b94093e0 ldr w0, [sp, #144]
4002d2b0: 11002000 add w0, w0, #0x8
4002d2b4: 7100001f cmp w0, #0x0
4002d2b8: 54000b0d b.le 4002d418 <_IO_Vprintf+0xd68> <== ALWAYS TAKEN
4002d2bc: f94033e4 ldr x4, [sp, #96] <== NOT EXECUTED
4002d2c0: b90093e0 str w0, [sp, #144] <== NOT EXECUTED
4002d2c4: 91002c85 add x5, x4, #0xb <== NOT EXECUTED
4002d2c8: 927df0a0 and x0, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002d2cc: f90033e0 str x0, [sp, #96] <== NOT EXECUTED
4002d2d0: 17ffff36 b 4002cfa8 <_IO_Vprintf+0x8f8> <== NOT EXECUTED
num = (u_short)va_arg(ap, int);
4002d2d4: b94093e1 ldr w1, [sp, #144] <== NOT EXECUTED
4002d2d8: 11002026 add w6, w1, #0x8 <== NOT EXECUTED
4002d2dc: 710000df cmp w6, #0x0 <== NOT EXECUTED
4002d2e0: 54000a6d b.le 4002d42c <_IO_Vprintf+0xd7c> <== NOT EXECUTED
4002d2e4: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002d2e8: b90093e6 str w6, [sp, #144] <== NOT EXECUTED
4002d2ec: 91002ca7 add x7, x5, #0xb <== NOT EXECUTED
4002d2f0: 927df0e1 and x1, x7, #0xfffffffffffffff8 <== NOT EXECUTED
4002d2f4: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d2f8: 17ffff01 b 4002cefc <_IO_Vprintf+0x84c> <== NOT EXECUTED
p = va_arg(ap, char *);
4002d2fc: f9403fe1 ldr x1, [sp, #120]
4002d300: b94093e0 ldr w0, [sp, #144]
4002d304: b90093e4 str w4, [sp, #144]
4002d308: 8b20c020 add x0, x1, w0, sxtw
4002d30c: 17fffdfc b 4002cafc <_IO_Vprintf+0x44c>
num = (short)va_arg(ap, int);
4002d310: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d314: 11002005 add w5, w0, #0x8 <== NOT EXECUTED
4002d318: 710000bf cmp w5, #0x0 <== NOT EXECUTED
4002d31c: 5400074d b.le 4002d404 <_IO_Vprintf+0xd54> <== NOT EXECUTED
4002d320: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d324: b90093e5 str w5, [sp, #144] <== NOT EXECUTED
4002d328: 91002c06 add x6, x0, #0xb <== NOT EXECUTED
4002d32c: 927df0c1 and x1, x6, #0xfffffffffffffff8 <== NOT EXECUTED
4002d330: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d334: 17fffd63 b 4002c8c0 <_IO_Vprintf+0x210> <== NOT EXECUTED
num = (u_char)va_arg(ap, int);
4002d338: b94093e1 ldr w1, [sp, #144]
4002d33c: 11002026 add w6, w1, #0x8
4002d340: 710000df cmp w6, #0x0
4002d344: 54000acd b.le 4002d49c <_IO_Vprintf+0xdec> <== ALWAYS TAKEN
4002d348: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002d34c: b90093e6 str w6, [sp, #144] <== NOT EXECUTED
4002d350: 91002ca7 add x7, x5, #0xb <== NOT EXECUTED
4002d354: 927df0e1 and x1, x7, #0xfffffffffffffff8 <== NOT EXECUTED
4002d358: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d35c: 17ffff0b b 4002cf88 <_IO_Vprintf+0x8d8> <== NOT EXECUTED
PCHAR(va_arg(ap, int));
4002d360: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d364: 11002004 add w4, w0, #0x8 <== NOT EXECUTED
4002d368: 7100009f cmp w4, #0x0 <== NOT EXECUTED
4002d36c: 540007cd b.le 4002d464 <_IO_Vprintf+0xdb4> <== NOT EXECUTED
4002d370: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d374: b90093e4 str w4, [sp, #144] <== NOT EXECUTED
4002d378: 91002c05 add x5, x0, #0xb <== NOT EXECUTED
4002d37c: 927df0a1 and x1, x5, #0xfffffffffffffff8 <== NOT EXECUTED
4002d380: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d384: 17ffff62 b 4002d10c <_IO_Vprintf+0xa5c> <== NOT EXECUTED
num = va_arg(ap, int);
4002d388: 37f80780 tbnz w0, #31, 4002d478 <_IO_Vprintf+0xdc8> <== ALWAYS TAKEN
4002d38c: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d390: 91002c00 add x0, x0, #0xb <== NOT EXECUTED
4002d394: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002d398: f94033e1 ldr x1, [sp, #96]
if (sign && (intmax_t)num < 0) {
4002d39c: f90033e0 str x0, [sp, #96]
num = va_arg(ap, int);
4002d3a0: b980002d ldrsw x13, [x1]
if (sign && (intmax_t)num < 0) {
4002d3a4: aa0d03e0 mov x0, x13
4002d3a8: 17fffd48 b 4002c8c8 <_IO_Vprintf+0x218>
num = va_arg(ap, u_int);
4002d3ac: b94093e1 ldr w1, [sp, #144]
4002d3b0: 11002026 add w6, w1, #0x8
4002d3b4: 710000df cmp w6, #0x0
4002d3b8: 540007cd b.le 4002d4b0 <_IO_Vprintf+0xe00> <== ALWAYS TAKEN
4002d3bc: f94033e5 ldr x5, [sp, #96] <== NOT EXECUTED
4002d3c0: b90093e6 str w6, [sp, #144] <== NOT EXECUTED
4002d3c4: 91002ca7 add x7, x5, #0xb <== NOT EXECUTED
4002d3c8: 927df0e1 and x1, x7, #0xfffffffffffffff8 <== NOT EXECUTED
4002d3cc: f90033e1 str x1, [sp, #96] <== NOT EXECUTED
4002d3d0: 17ffff9c b 4002d240 <_IO_Vprintf+0xb90> <== NOT EXECUTED
PCHAR(va_arg(ap, int));
4002d3d4: f9403fe1 ldr x1, [sp, #120]
4002d3d8: b94093e0 ldr w0, [sp, #144]
4002d3dc: b90093e4 str w4, [sp, #144]
4002d3e0: 8b20c020 add x0, x1, w0, sxtw
4002d3e4: 17fffe41 b 4002cce8 <_IO_Vprintf+0x638>
while (n--)
4002d3e8: 2a1c03f9 mov w25, w28
4002d3ec: 17fffdeb b 4002cb98 <_IO_Vprintf+0x4e8>
width = va_arg(ap, int);
4002d3f0: f9403fe1 ldr x1, [sp, #120] <== NOT EXECUTED
4002d3f4: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d3f8: b90093e4 str w4, [sp, #144] <== NOT EXECUTED
4002d3fc: 8b20c020 add x0, x1, w0, sxtw <== NOT EXECUTED
4002d400: 17fffe64 b 4002cd90 <_IO_Vprintf+0x6e0> <== NOT EXECUTED
num = (short)va_arg(ap, int);
4002d404: f9403fe1 ldr x1, [sp, #120] <== NOT EXECUTED
4002d408: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d40c: b90093e5 str w5, [sp, #144] <== NOT EXECUTED
4002d410: 8b20c020 add x0, x1, w0, sxtw <== NOT EXECUTED
4002d414: 17fffd2b b 4002c8c0 <_IO_Vprintf+0x210> <== NOT EXECUTED
dwidth = va_arg(ap, int);
4002d418: f9403fe2 ldr x2, [sp, #120]
4002d41c: b94093e1 ldr w1, [sp, #144]
4002d420: b90093e0 str w0, [sp, #144]
4002d424: 8b21c044 add x4, x2, w1, sxtw
4002d428: 17fffee0 b 4002cfa8 <_IO_Vprintf+0x8f8>
num = (u_short)va_arg(ap, int);
4002d42c: f9403fe2 ldr x2, [sp, #120] <== NOT EXECUTED
4002d430: b94093e1 ldr w1, [sp, #144] <== NOT EXECUTED
4002d434: b90093e6 str w6, [sp, #144] <== NOT EXECUTED
4002d438: 8b21c045 add x5, x2, w1, sxtw <== NOT EXECUTED
4002d43c: 17fffeb0 b 4002cefc <_IO_Vprintf+0x84c> <== NOT EXECUTED
num = (char)va_arg(ap, int);
4002d440: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d444: 11002005 add w5, w0, #0x8 <== NOT EXECUTED
4002d448: 710000bf cmp w5, #0x0 <== NOT EXECUTED
4002d44c: 540004ad b.le 4002d4e0 <_IO_Vprintf+0xe30> <== NOT EXECUTED
4002d450: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d454: b90093e5 str w5, [sp, #144] <== NOT EXECUTED
4002d458: 91002c00 add x0, x0, #0xb <== NOT EXECUTED
4002d45c: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002d460: 17ffff58 b 4002d1c0 <_IO_Vprintf+0xb10> <== NOT EXECUTED
PCHAR(va_arg(ap, int));
4002d464: f9403fe1 ldr x1, [sp, #120] <== NOT EXECUTED
4002d468: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d46c: b90093e4 str w4, [sp, #144] <== NOT EXECUTED
4002d470: 8b20c020 add x0, x1, w0, sxtw <== NOT EXECUTED
4002d474: 17ffff26 b 4002d10c <_IO_Vprintf+0xa5c> <== NOT EXECUTED
num = va_arg(ap, int);
4002d478: b94093e0 ldr w0, [sp, #144]
4002d47c: 11002005 add w5, w0, #0x8
4002d480: 710000bf cmp w5, #0x0
4002d484: 5400020d b.le 4002d4c4 <_IO_Vprintf+0xe14> <== ALWAYS TAKEN
4002d488: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d48c: b90093e5 str w5, [sp, #144] <== NOT EXECUTED
4002d490: 91002c00 add x0, x0, #0xb <== NOT EXECUTED
4002d494: 927df000 and x0, x0, #0xfffffffffffffff8 <== NOT EXECUTED
4002d498: 17ffffc0 b 4002d398 <_IO_Vprintf+0xce8> <== NOT EXECUTED
num = (u_char)va_arg(ap, int);
4002d49c: f9403fe2 ldr x2, [sp, #120]
4002d4a0: b94093e1 ldr w1, [sp, #144]
4002d4a4: b90093e6 str w6, [sp, #144]
4002d4a8: 8b21c045 add x5, x2, w1, sxtw
4002d4ac: 17fffeb7 b 4002cf88 <_IO_Vprintf+0x8d8>
num = va_arg(ap, u_int);
4002d4b0: f9403fe2 ldr x2, [sp, #120]
4002d4b4: b94093e1 ldr w1, [sp, #144]
4002d4b8: b90093e6 str w6, [sp, #144]
4002d4bc: 8b21c045 add x5, x2, w1, sxtw
4002d4c0: 17ffff60 b 4002d240 <_IO_Vprintf+0xb90>
num = va_arg(ap, int);
4002d4c4: f9403fe1 ldr x1, [sp, #120]
4002d4c8: b94093e0 ldr w0, [sp, #144]
4002d4cc: b90093e5 str w5, [sp, #144]
4002d4d0: 8b20c026 add x6, x1, w0, sxtw
4002d4d4: f94033e0 ldr x0, [sp, #96]
4002d4d8: f90033e6 str x6, [sp, #96]
4002d4dc: 17ffffaf b 4002d398 <_IO_Vprintf+0xce8>
num = (char)va_arg(ap, int);
4002d4e0: f9403fe1 ldr x1, [sp, #120] <== NOT EXECUTED
4002d4e4: b94093e0 ldr w0, [sp, #144] <== NOT EXECUTED
4002d4e8: b90093e5 str w5, [sp, #144] <== NOT EXECUTED
4002d4ec: 8b20c026 add x6, x1, w0, sxtw <== NOT EXECUTED
4002d4f0: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d4f4: f90033e6 str x6, [sp, #96] <== NOT EXECUTED
4002d4f8: 17ffff32 b 4002d1c0 <_IO_Vprintf+0xb10> <== NOT EXECUTED
up = va_arg(ap, u_char *);
4002d4fc: b90093ff str wzr, [sp, #144] <== NOT EXECUTED
p = va_arg(ap, char *);
4002d500: f94033e0 ldr x0, [sp, #96] <== NOT EXECUTED
4002d504: 17fffdb8 b 4002cbe4 <_IO_Vprintf+0x534> <== NOT EXECUTED
4002d508: 52800000 mov w0, #0x0 // #0
lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
4002d50c: 52800019 mov w25, #0x0 // #0
4002d510: 17fffcf2 b 4002c8d8 <_IO_Vprintf+0x228>
reswitch: switch (ch = (u_char)*fmt++) {
4002d514: aa1403f7 mov x23, x20 <== NOT EXECUTED
n = n * 10 + ch - '0';
4002d518: 5280000a mov w10, #0x0 // #0 <== NOT EXECUTED
4002d51c: 17fffc98 b 4002c77c <_IO_Vprintf+0xcc> <== NOT EXECUTED
if (!ladjust && width > 0)
4002d520: 7100011f cmp w8, #0x0 <== NOT EXECUTED
4002d524: 1a9fd7e0 cset w0, gt <== NOT EXECUTED
4002d528: 710002df cmp w22, #0x0 <== NOT EXECUTED
4002d52c: 7a401804 ccmp w0, #0x0, #0x4, ne // ne = any <== NOT EXECUTED
4002d530: 54ffe541 b.ne 4002d1d8 <_IO_Vprintf+0xb28> // b.any <== NOT EXECUTED
if (ladjust && width > 0)
4002d534: b9408be1 ldr w1, [sp, #136] <== NOT EXECUTED
4002d538: 2a1c03f9 mov w25, w28 <== NOT EXECUTED
4002d53c: 0a000020 and w0, w1, w0 <== NOT EXECUTED
4002d540: 2a0003fa mov w26, w0 <== NOT EXECUTED
4002d544: 17fffd95 b 4002cb98 <_IO_Vprintf+0x4e8> <== NOT EXECUTED
if (!ladjust && width > 0)
4002d548: b90097e5 str w5, [sp, #148] <== NOT EXECUTED
4002d54c: 2a0703e5 mov w5, w7 <== NOT EXECUTED
4002d550: 17ffff25 b 4002d1e4 <_IO_Vprintf+0xb34> <== NOT EXECUTED
...
000000004002e390 <_Memory_Allocate>:
{
Memory_Area *area;
const Memory_Area *end;
uintptr_t alignment_mask;
area = &information->areas[ 0 ];
4002e390: a9400c06 ldp x6, x3, [x0]
end = &information->areas[ information->count ];
4002e394: d2800304 mov x4, #0x18 // #24
alignment_mask = alignment - 1;
4002e398: d1000447 sub x7, x2, #0x1
end = &information->areas[ information->count ];
4002e39c: 9b040cc6 madd x6, x6, x4, x3
while ( area != end ) {
4002e3a0: eb06007f cmp x3, x6
4002e3a4: 54000200 b.eq 4002e3e4 <_Memory_Allocate+0x54> // b.none <== NEVER TAKEN
4002e3a8: cb0203e5 neg x5, x2
4002e3ac: 14000004 b 4002e3bc <_Memory_Allocate+0x2c>
area->free = (void *) alloc_end;
return (void *) alloc_begin;
}
++area;
4002e3b0: 91006063 add x3, x3, #0x18 <== NOT EXECUTED
while ( area != end ) {
4002e3b4: eb0300df cmp x6, x3 <== NOT EXECUTED
4002e3b8: 54000160 b.eq 4002e3e4 <_Memory_Allocate+0x54> // b.none <== NOT EXECUTED
alloc_begin = (uintptr_t) area->free;
4002e3bc: f9400460 ldr x0, [x3, #8]
alloc_begin += alignment_mask;
4002e3c0: 8b0000e0 add x0, x7, x0
alloc_begin &= ~alignment_mask;
4002e3c4: 8a050000 and x0, x0, x5
alloc_end = alloc_begin + size;
4002e3c8: ab010002 adds x2, x0, x1
4002e3cc: 54ffff22 b.cs 4002e3b0 <_Memory_Allocate+0x20> // b.hs, b.nlast <== NEVER TAKEN
if ( alloc_begin <= alloc_end && alloc_end <= (uintptr_t) area->end ) {
4002e3d0: f9400864 ldr x4, [x3, #16]
4002e3d4: eb02009f cmp x4, x2
4002e3d8: 54fffec3 b.cc 4002e3b0 <_Memory_Allocate+0x20> // b.lo, b.ul, b.last<== NEVER TAKEN
area->free = (void *) alloc_end;
4002e3dc: f9000462 str x2, [x3, #8]
}
return NULL;
}
4002e3e0: d65f03c0 ret
return NULL;
4002e3e4: d2800000 mov x0, #0x0 // #0 <== NOT EXECUTED
}
4002e3e8: d65f03c0 ret <== NOT EXECUTED
4002e3ec: 00000000 udf #0
0000000040024470 <_Memory_Fill>:
#include <rtems/score/memory.h>
#include <string.h>
void _Memory_Fill( const Memory_Information *information, int c )
{
40024470: a9bd7bfd stp x29, x30, [sp, #-48]!
Memory_Area *area;
const Memory_Area *end;
area = &information->areas[ 0 ];
end = &information->areas[ information->count ];
40024474: d2800302 mov x2, #0x18 // #24
{
40024478: 910003fd mov x29, sp
4002447c: a90153f3 stp x19, x20, [sp, #16]
area = &information->areas[ 0 ];
40024480: a9404c14 ldp x20, x19, [x0]
end = &information->areas[ information->count ];
40024484: 9b024e94 madd x20, x20, x2, x19
while ( area != end ) {
40024488: eb14027f cmp x19, x20
4002448c: 54000160 b.eq 400244b8 <_Memory_Fill+0x48> // b.none <== NEVER TAKEN
40024490: f90013f5 str x21, [sp, #32]
40024494: 2a0103f5 mov w21, w1
*
* @return The free memory area size in bytes of the memory area.
*/
RTEMS_INLINE_ROUTINE uintptr_t _Memory_Get_free_size( const Memory_Area *area )
{
return (uintptr_t) area->end - (uintptr_t) area->free;
40024498: a9408a60 ldp x0, x2, [x19, #8]
memset( _Memory_Get_free_begin( area ), c, _Memory_Get_free_size( area ) );
4002449c: 2a1503e1 mov w1, w21
++area;
400244a0: 91006273 add x19, x19, #0x18
memset( _Memory_Get_free_begin( area ), c, _Memory_Get_free_size( area ) );
400244a4: cb000042 sub x2, x2, x0
400244a8: 94002413 bl 4002d4f4 <memset>
while ( area != end ) {
400244ac: eb13029f cmp x20, x19
400244b0: 54ffff41 b.ne 40024498 <_Memory_Fill+0x28> // b.any <== NEVER TAKEN
400244b4: f94013f5 ldr x21, [sp, #32]
}
}
400244b8: a94153f3 ldp x19, x20, [sp, #16]
400244bc: a8c37bfd ldp x29, x30, [sp], #48
400244c0: d65f03c0 ret
...
0000000040028ee0 <_Objects_Extend_information>:
#include <string.h> /* for memcpy() */
Objects_Maximum _Objects_Extend_information(
Objects_Information *information
)
{
40028ee0: a9b97bfd stp x29, x30, [sp, #-112]!
40028ee4: 910003fd mov x29, sp
*/
do_extend = true;
index_base = extend_count;
block = 1;
if ( information->object_blocks == NULL ) {
40028ee8: f9402402 ldr x2, [x0, #72]
{
40028eec: a90363f7 stp x23, x24, [sp, #48]
*/
RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Extend_size(
const Objects_Information *information
)
{
return information->objects_per_block;
40028ef0: 79404417 ldrh w23, [x0, #34]
40028ef4: a9046bf9 stp x25, x26, [sp, #64]
*/
RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Get_maximum_index(
const Objects_Information *information
)
{
return _Objects_Get_index( information->maximum_id );
40028ef8: b9400019 ldr w25, [x0]
40028efc: a90153f3 stp x19, x20, [sp, #16]
40028f00: 0b1702f3 add w19, w23, w23
RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Get_index(
Objects_Id id
)
{
return
(Objects_Maximum)((id >> OBJECTS_INDEX_START_BIT) &
40028f04: 12003f23 and w3, w25, #0xffff
40028f08: a9025bf5 stp x21, x22, [sp, #32]
new_maximum = (uint32_t) old_maximum + extend_count;
40028f0c: 0b3922fa add w26, w23, w25, uxth
{
40028f10: aa0003f6 mov x22, x0
40028f14: a90573fb stp x27, x28, [sp, #80]
if ( information->object_blocks == NULL ) {
40028f18: b40009a2 cbz x2, 4002904c <_Objects_Extend_information+0x16c>
block_count = 1;
} else {
block_count = old_maximum / extend_count;
40028f1c: 1ad70878 udiv w24, w3, w23
for ( ; block < block_count; block++ ) {
40028f20: 7100071f cmp w24, #0x1
40028f24: 54001129 b.ls 40029148 <_Objects_Extend_information+0x268> // b.plast<== NEVER TAKEN
index_base = extend_count;
40028f28: 2a1703f3 mov w19, w23
for ( ; block < block_count; block++ ) {
40028f2c: d2800021 mov x1, #0x1 // #1
40028f30: 14000005 b 40028f44 <_Objects_Extend_information+0x64>
40028f34: 1100043c add w28, w1, #0x1
40028f38: 91000421 add x1, x1, #0x1
40028f3c: 6b01031f cmp w24, w1
40028f40: 540007e9 b.ls 4002903c <_Objects_Extend_information+0x15c> // b.plast
if ( information->object_blocks[ block ] == NULL ) {
40028f44: f8617840 ldr x0, [x2, x1, lsl #3]
40028f48: 2a1303f5 mov w21, w19
40028f4c: 2a0103fc mov w28, w1
do_extend = false;
break;
} else
index_base += extend_count;
40028f50: 0b170273 add w19, w19, w23
if ( information->object_blocks[ block ] == NULL ) {
40028f54: b5ffff00 cbnz x0, 40028f34 <_Objects_Extend_information+0x54>
do_extend = false;
40028f58: 5280001b mov w27, #0x0 // #0
/*
* We need to limit the number of objects to the maximum number
* representable in the index portion of the object Id. In the
* case of 16-bit Ids, this is only 256 object instances.
*/
if ( new_maximum > OBJECTS_ID_FINAL_INDEX ) {
40028f5c: 529fffe0 mov w0, #0xffff // #65535
40028f60: 6b00035f cmp w26, w0
40028f64: 540005c8 b.hi 4002901c <_Objects_Extend_information+0x13c> // b.pmore
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
object_block_size = extend_count * information->object_size;
40028f68: 79404ac0 ldrh w0, [x22, #36]
40028f6c: b90063e3 str w3, [sp, #96]
40028f70: 1b177c00 mul w0, w0, w23
new_object_block = _Workspace_Allocate( object_block_size );
40028f74: 93407c00 sxtw x0, w0
40028f78: 94000b5e bl 4002bcf0 <_Workspace_Allocate>
40028f7c: aa0003f4 mov x20, x0
if ( new_object_block == NULL ) {
40028f80: b40004e0 cbz x0, 4002901c <_Objects_Extend_information+0x13c> <== NEVER TAKEN
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
40028f84: b94063e3 ldr w3, [sp, #96]
api_class_and_node = information->maximum_id & ~OBJECTS_INDEX_MASK;
40028f88: 12103f39 and w25, w25, #0xffff0000
if ( do_extend ) {
40028f8c: 350006bb cbnz w27, 40029060 <_Objects_Extend_information+0x180>
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
40028f90: a9440ec1 ldp x1, x3, [x22, #64]
40028f94: 2a1c03e0 mov w0, w28
information->inactive_per_block[ block ] = information->objects_per_block;
40028f98: 794046c2 ldrh w2, [x22, #34]
/*
* Append to inactive chain.
*/
the_object = new_object_block;
for ( index = index_base ; index < index_end ; ++index ) {
40028f9c: 6b1302bf cmp w21, w19
information->object_blocks[ block ] = new_object_block;
40028fa0: f8207874 str x20, [x3, x0, lsl #3]
information->inactive_per_block[ block ] = information->objects_per_block;
40028fa4: 78207822 strh w2, [x1, x0, lsl #1]
information->inactive += information->objects_per_block;
40028fa8: 794042c0 ldrh w0, [x22, #32]
40028fac: 794046c1 ldrh w1, [x22, #34]
40028fb0: 0b010000 add w0, w0, w1
40028fb4: 790042c0 strh w0, [x22, #32]
for ( index = index_base ; index < index_end ; ++index ) {
40028fb8: 540001e2 b.cs 40028ff4 <_Objects_Extend_information+0x114> // b.hs, b.nlast<== NEVER TAKEN
| ( ( index + OBJECTS_INDEX_MINIMUM ) << OBJECTS_INDEX_START_BIT );
_Chain_Initialize_node( &the_object->Node );
_Chain_Append_unprotected( &information->Inactive, &the_object->Node );
the_object = _Addresses_Add_offset( the_object, information->object_size );
40028fbc: 79404ac3 ldrh w3, [x22, #36]
return &the_chain->Tail.Node;
40028fc0: 9100c2c0 add x0, x22, #0x30
40028fc4: d503201f nop
old_last = tail->previous;
40028fc8: f9400401 ldr x1, [x0, #8]
| ( ( index + OBJECTS_INDEX_MINIMUM ) << OBJECTS_INDEX_START_BIT );
40028fcc: 110006b5 add w21, w21, #0x1
40028fd0: 2a1902a2 orr w2, w21, w25
the_node->next = tail;
40028fd4: f9000280 str x0, [x20]
the_object->id = api_class_and_node
40028fd8: b9001282 str w2, [x20, #16]
for ( index = index_base ; index < index_end ; ++index ) {
40028fdc: 6b1302bf cmp w21, w19
tail->previous = the_node;
40028fe0: f9000414 str x20, [x0, #8]
old_last->next = the_node;
40028fe4: f9000034 str x20, [x1]
the_node->previous = old_last;
40028fe8: f9000681 str x1, [x20, #8]
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
40028fec: 8b030294 add x20, x20, x3
40028ff0: 54fffec1 b.ne 40028fc8 <_Objects_Extend_information+0xe8> // b.any
}
return block;
40028ff4: 12003f80 and w0, w28, #0xffff
}
40028ff8: a94153f3 ldp x19, x20, [sp, #16]
40028ffc: a9425bf5 ldp x21, x22, [sp, #32]
40029000: a94363f7 ldp x23, x24, [sp, #48]
40029004: a9446bf9 ldp x25, x26, [sp, #64]
40029008: a94573fb ldp x27, x28, [sp, #80]
4002900c: a8c77bfd ldp x29, x30, [sp], #112
40029010: d65f03c0 ret
_Workspace_Free( new_object_block );
40029014: aa1403e0 mov x0, x20 <== NOT EXECUTED
40029018: 94000b3e bl 4002bd10 <_Workspace_Free> <== NOT EXECUTED
return 0;
4002901c: 52800000 mov w0, #0x0 // #0
}
40029020: a94153f3 ldp x19, x20, [sp, #16]
40029024: a9425bf5 ldp x21, x22, [sp, #32]
40029028: a94363f7 ldp x23, x24, [sp, #48]
4002902c: a9446bf9 ldp x25, x26, [sp, #64]
40029030: a94573fb ldp x27, x28, [sp, #80]
40029034: a8c77bfd ldp x29, x30, [sp], #112
40029038: d65f03c0 ret
index_base += extend_count;
4002903c: 2a1303f5 mov w21, w19
do_extend = true;
40029040: 5280003b mov w27, #0x1 // #1
index_end = index_base + extend_count;
40029044: 0b1302f3 add w19, w23, w19
40029048: 17ffffc5 b 40028f5c <_Objects_Extend_information+0x7c>
do_extend = true;
4002904c: 5280003b mov w27, #0x1 // #1
index_base = extend_count;
40029050: 2a1703f5 mov w21, w23
block = 1;
40029054: 2a1b03fc mov w28, w27
block_count = 1;
40029058: 2a1b03f8 mov w24, w27
4002905c: 17ffffc0 b 40028f5c <_Objects_Extend_information+0x7c>
local_table_size = new_maximum * sizeof( *local_table );
40029060: d37d4341 ubfiz x1, x26, #3, #17
block_count++;
40029064: 11000700 add w0, w24, #0x1
table_size = object_blocks_size
40029068: 52800142 mov w2, #0xa // #10
object_blocks = _Workspace_Allocate( table_size );
4002906c: f90033e1 str x1, [sp, #96]
object_blocks_size = block_count * sizeof( *object_blocks );
40029070: d37d401b ubfiz x27, x0, #3, #17
object_blocks = _Workspace_Allocate( table_size );
40029074: b9006fe3 str w3, [sp, #108]
40029078: 9ba20400 umaddl x0, w0, w2, x1
4002907c: 94000b1d bl 4002bcf0 <_Workspace_Allocate>
40029080: aa0003e4 mov x4, x0
if ( object_blocks == NULL ) {
40029084: b9406fe3 ldr w3, [sp, #108]
40029088: f94033e1 ldr x1, [sp, #96]
4002908c: b4fffc40 cbz x0, 40029014 <_Objects_Extend_information+0x134> <== NEVER TAKEN
40029090: 8b1b001b add x27, x0, x27
if ( old_maximum > extend_count ) {
40029094: 6b0302ff cmp w23, w3
40029098: 8b1b0037 add x23, x1, x27
4002909c: 540003e3 b.cc 40029118 <_Objects_Extend_information+0x238> // b.lo, b.ul, b.last
object_blocks[ 0 ] = NULL;
400290a0: f900001f str xzr, [x0]
inactive_per_block[ 0 ] = 0;
400290a4: 783b683f strh wzr, [x1, x27]
memcpy(
400290a8: f94006c1 ldr x1, [x22, #8]
400290ac: d37d3c62 ubfiz x2, x3, #3, #16
400290b0: aa1b03e0 mov x0, x27
400290b4: f90033e4 str x4, [sp, #96]
400290b8: 940048da bl 4003b420 <memcpy>
for ( index = index_base ; index < index_end ; ++index ) {
400290bc: 6b1302bf cmp w21, w19
400290c0: f94033e4 ldr x4, [sp, #96]
400290c4: 54000142 b.cs 400290ec <_Objects_Extend_information+0x20c> // b.hs, b.nlast<== NEVER TAKEN
local_table[ index ] = NULL;
400290c8: 51000662 sub w2, w19, #0x1
400290cc: 8b354f60 add x0, x27, w21, uxtw #3
400290d0: 4b150042 sub w2, w2, w21
400290d4: 52800001 mov w1, #0x0 // #0
400290d8: 91000442 add x2, x2, #0x1
400290dc: f90033e4 str x4, [sp, #96]
400290e0: d37df042 lsl x2, x2, #3
400290e4: 940048ea bl 4003b48c <memset>
400290e8: f94033e4 ldr x4, [sp, #96]
__asm__ volatile (
400290ec: d53b4221 mrs x1, daif
400290f0: d50342df msr daifset, #0x2
| (new_maximum << OBJECTS_INDEX_START_BIT);
400290f4: 2a19035a orr w26, w26, w25
information->maximum_id = api_class_and_node
400290f8: b90002da str w26, [x22]
information->local_table = local_table;
400290fc: f90006db str x27, [x22, #8]
old_tables = information->object_blocks;
40029100: f94026c0 ldr x0, [x22, #72]
information->object_blocks = object_blocks;
40029104: a90412d7 stp x23, x4, [x22, #64]
__asm__ volatile (
40029108: 92407c21 and x1, x1, #0xffffffff
4002910c: d51b4221 msr daif, x1
_Workspace_Free( old_tables );
40029110: 94000b00 bl 4002bd10 <_Workspace_Free>
block_count++;
40029114: 17ffff9f b 40028f90 <_Objects_Extend_information+0xb0>
memcpy(
40029118: f94026c1 ldr x1, [x22, #72]
4002911c: d37d3f02 ubfiz x2, x24, #3, #16
40029120: f90033e0 str x0, [sp, #96]
40029124: b9006fe3 str w3, [sp, #108]
40029128: 940048be bl 4003b420 <memcpy>
memcpy(
4002912c: f94022c1 ldr x1, [x22, #64]
40029130: d37ffb02 lsl x2, x24, #1
40029134: aa1703e0 mov x0, x23
40029138: 940048ba bl 4003b420 <memcpy>
4002913c: b9406fe3 ldr w3, [sp, #108]
40029140: f94033e4 ldr x4, [sp, #96]
40029144: 17ffffd9 b 400290a8 <_Objects_Extend_information+0x1c8>
do_extend = true;
40029148: 5280003b mov w27, #0x1 // #1 <== NOT EXECUTED
index_base = extend_count;
4002914c: 2a1703f5 mov w21, w23 <== NOT EXECUTED
block = 1;
40029150: 2a1b03fc mov w28, w27 <== NOT EXECUTED
40029154: 17ffff82 b 40028f5c <_Objects_Extend_information+0x7c> <== NOT EXECUTED
...
00000000400291f0 <_Objects_Free_objects_block>:
void _Objects_Free_objects_block(
Objects_Information *information,
Objects_Maximum block
)
{
400291f0: a9bd7bfd stp x29, x30, [sp, #-48]!
400291f4: 12003c21 and w1, w1, #0xffff
return &the_chain->Tail.Node;
400291f8: 9100c004 add x4, x0, #0x30
400291fc: 910003fd mov x29, sp
return _Chain_Immutable_head( the_chain )->next;
40029200: f9401402 ldr x2, [x0, #40]
40029204: f90013f5 str x21, [sp, #32]
Objects_Maximum index_base;
Objects_Maximum index_end;
Chain_Node *node;
const Chain_Node *tail;
objects_per_block = information->objects_per_block;
40029208: 79404415 ldrh w21, [x0, #34]
{
4002920c: a90153f3 stp x19, x20, [sp, #16]
index_base = block * objects_per_block;
index_end = index_base + objects_per_block;
node = _Chain_First( &information->Inactive );
tail = _Chain_Immutable_tail( &information->Inactive );
while ( node != tail ) {
40029210: eb04005f cmp x2, x4
{
40029214: aa0003f3 mov x19, x0
index_base = block * objects_per_block;
40029218: 1b017ea5 mul w5, w21, w1
4002921c: 12003ca6 and w6, w5, #0xffff
index_end = index_base + objects_per_block;
40029220: 0b2522a5 add w5, w21, w5, uxth
while ( node != tail ) {
40029224: 54000200 b.eq 40029264 <_Objects_Free_objects_block+0x74> // b.none<== NEVER TAKEN
40029228: 12003ca5 and w5, w5, #0xffff
4002922c: d503201f nop
Objects_Control *object;
uint32_t index;
object = (Objects_Control *) node;
index = _Objects_Get_index( object->id ) - OBJECTS_INDEX_MINIMUM;
40029230: 79402043 ldrh w3, [x2, #16]
40029234: aa0203e0 mov x0, x2
return the_node->next;
40029238: f9400042 ldr x2, [x2]
4002923c: 51000463 sub w3, w3, #0x1
/*
* Get the next node before the node is extracted
*/
node = _Chain_Next( node );
if ( index >= index_base && index < index_end ) {
40029240: 6b06007f cmp w3, w6
40029244: 540000c3 b.cc 4002925c <_Objects_Free_objects_block+0x6c> // b.lo, b.ul, b.last
40029248: 6b0300bf cmp w5, w3
4002924c: 54000089 b.ls 4002925c <_Objects_Free_objects_block+0x6c> // b.plast
previous = the_node->previous;
40029250: f9400400 ldr x0, [x0, #8]
next->previous = previous;
40029254: f9000440 str x0, [x2, #8]
previous->next = next;
40029258: f9000002 str x2, [x0]
while ( node != tail ) {
4002925c: eb04005f cmp x2, x4
40029260: 54fffe81 b.ne 40029230 <_Objects_Free_objects_block+0x40> // b.any
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
40029264: f9402660 ldr x0, [x19, #72]
40029268: 2a0103f4 mov w20, w1
4002926c: f8747800 ldr x0, [x0, x20, lsl #3]
40029270: 94000aa8 bl 4002bd10 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
40029274: a9440660 ldp x0, x1, [x19, #64]
40029278: f834783f str xzr, [x1, x20, lsl #3]
information->inactive_per_block[ block ] = 0;
4002927c: 7834781f strh wzr, [x0, x20, lsl #1]
information->inactive -= objects_per_block;
40029280: 79404260 ldrh w0, [x19, #32]
40029284: 4b150015 sub w21, w0, w21
40029288: 79004275 strh w21, [x19, #32]
}
4002928c: a94153f3 ldp x19, x20, [sp, #16]
40029290: f94013f5 ldr x21, [sp, #32]
40029294: a8c37bfd ldp x29, x30, [sp], #48
40029298: d65f03c0 ret
4002929c: 00000000 udf #0
0000000040029160 <_Objects_Free_unlimited>:
old_last = tail->previous;
40029160: f9401c05 ldr x5, [x0, #56]
40029164: 9100c003 add x3, x0, #0x30
*/
RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Is_auto_extend(
const Objects_Information *information
)
{
return information->objects_per_block != 0;
40029168: 79404404 ldrh w4, [x0, #34]
the_node->next = tail;
4002916c: f9000023 str x3, [x1]
tail->previous = the_node;
40029170: f9001c01 str x1, [x0, #56]
old_last->next = the_node;
40029174: f90000a1 str x1, [x5]
the_node->previous = old_last;
40029178: f9000425 str x5, [x1, #8]
Objects_Control *the_object
)
{
_Chain_Append_unprotected( &information->Inactive, &the_object->Node );
if ( _Objects_Is_auto_extend( information ) ) {
4002917c: 34000264 cbz w4, 400291c8 <_Objects_Free_unlimited+0x68> <== NEVER TAKEN
40029180: b9401021 ldr w1, [x1, #16]
Objects_Maximum objects_per_block;
Objects_Maximum block;
Objects_Maximum inactive;
objects_per_block = information->objects_per_block;
block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
40029184: 51000421 sub w1, w1, #0x1
40029188: 12003c23 and w3, w1, #0xffff
if ( block > objects_per_block ) {
4002918c: 6b21209f cmp w4, w1, uxth
40029190: 540001c2 b.cs 400291c8 <_Objects_Free_unlimited+0x68> // b.hs, b.nlast
block /= objects_per_block;
++information->inactive_per_block[ block ];
40029194: 1ac40861 udiv w1, w3, w4
/*
* Check if the threshold level has been met of
* 1.5 x objects_per_block are free.
*/
if ( inactive > ( objects_per_block + ( objects_per_block >> 1 ) ) ) {
40029198: 0b440484 add w4, w4, w4, lsr #1
++information->inactive_per_block[ block ];
4002919c: f9402005 ldr x5, [x0, #64]
400291a0: d37f3c21 ubfiz x1, x1, #1, #16
400291a4: 786168a3 ldrh w3, [x5, x1]
400291a8: 11000463 add w3, w3, #0x1
400291ac: 782168a3 strh w3, [x5, x1]
inactive = information->inactive;
400291b0: 79404001 ldrh w1, [x0, #32]
++inactive;
400291b4: 11000421 add w1, w1, #0x1
400291b8: 12003c21 and w1, w1, #0xffff
information->inactive = inactive;
400291bc: 79004001 strh w1, [x0, #32]
if ( inactive > ( objects_per_block + ( objects_per_block >> 1 ) ) ) {
400291c0: 6b04003f cmp w1, w4
400291c4: 5400004c b.gt 400291cc <_Objects_Free_unlimited+0x6c>
_Objects_Shrink_information( information );
}
}
}
}
400291c8: d65f03c0 ret
_Objects_Shrink_information( information );
400291cc: 14000035 b 400292a0 <_Objects_Shrink_information>
000000004002aef0 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
4002aef0: a9be7bfd stp x29, x30, [sp, #-32]!
4002aef4: 910003fd mov x29, sp
4002aef8: a90153f3 stp x19, x20, [sp, #16]
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
4002aefc: 72003c34 ands w20, w1, #0xffff
4002af00: 54000200 b.eq 4002af40 <_Objects_Get_information+0x50> // b.none
/*
* This call implicitly validates the_api so we do not call
* _Objects_Is_api_valid above here.
*/
the_class_api_maximum = _Objects_API_maximum_class( the_api );
4002af04: 2a0003f3 mov w19, w0
4002af08: 9400019e bl 4002b580 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
4002af0c: 340001a0 cbz w0, 4002af40 <_Objects_Get_information+0x50>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
4002af10: 6b14001f cmp w0, w20
4002af14: 54000163 b.cc 4002af40 <_Objects_Get_information+0x50> // b.lo, b.ul, b.last
return NULL;
if ( !_Objects_Information_table[ the_api ] )
4002af18: d0000080 adrp x0, 4003c000 <_Scheduler_Table+0x48>
4002af1c: 913be000 add x0, x0, #0xef8
4002af20: f8735800 ldr x0, [x0, w19, uxtw #3]
4002af24: b40000e0 cbz x0, 4002af40 <_Objects_Get_information+0x50> <== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
4002af28: 2a1403f4 mov w20, w20
4002af2c: f8747800 ldr x0, [x0, x20, lsl #3]
if ( !info )
4002af30: b4000080 cbz x0, 4002af40 <_Objects_Get_information+0x50>
* In a multprocessing configuration, we may access remote objects.
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( _Objects_Get_maximum_index( info ) == 0 )
4002af34: 79400001 ldrh w1, [x0]
4002af38: 35000061 cbnz w1, 4002af44 <_Objects_Get_information+0x54>
4002af3c: d503201f nop
return NULL;
4002af40: d2800000 mov x0, #0x0 // #0
#endif
return info;
}
4002af44: a94153f3 ldp x19, x20, [sp, #16]
4002af48: a8c27bfd ldp x29, x30, [sp], #32
4002af4c: d65f03c0 ret
0000000040029110 <_Objects_Get_name_as_string>:
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
40029110: f100003f cmp x1, #0x0
40029114: fa401844 ccmp x2, #0x0, #0x4, ne // ne = any
40029118: 54000580 b.eq 400291c8 <_Objects_Get_name_as_string+0xb8> // b.none
{
4002911c: a9bc7bfd stp x29, x30, [sp, #-64]!
40029120: 910003fd mov x29, sp
40029124: a90153f3 stp x19, x20, [sp, #16]
40029128: aa0203f3 mov x19, x2
4002912c: 2a0003f4 mov w20, w0
40029130: a9025bf5 stp x21, x22, [sp, #32]
40029134: aa0103f5 mov x21, x1
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Get_executing()->Object.id : id;
40029138: 34000300 cbz w0, 40029198 <_Objects_Get_name_as_string+0x88>
information = _Objects_Get_information_id( tmpId );
4002913c: 2a1403e0 mov w0, w20
40029140: 940016a4 bl 4002ebd0 <_Objects_Get_information_id>
40029144: aa0003f6 mov x22, x0
if ( !information )
40029148: b4000360 cbz x0, 400291b4 <_Objects_Get_name_as_string+0xa4>
return NULL;
the_object = _Objects_Get( tmpId, &lock_context, information );
4002914c: 2a1403e0 mov w0, w20
40029150: aa1603e2 mov x2, x22
40029154: 9100e3e1 add x1, sp, #0x38
40029158: 97ffff9e bl 40028fd0 <_Objects_Get>
if ( the_object == NULL ) {
4002915c: b40002c0 cbz x0, 400291b4 <_Objects_Get_name_as_string+0xa4>
return information->name_length > 0;
40029160: 79404ec1 ldrh w1, [x22, #38]
return NULL;
}
_Objects_Name_to_string(
40029164: aa1503e3 mov x3, x21
40029168: f9400c00 ldr x0, [x0, #24]
4002916c: 7100003f cmp w1, #0x0
40029170: 1a9f07e1 cset w1, ne // ne = any
40029174: aa1303e2 mov x2, x19
40029178: 97ffffaa bl 40029020 <_Objects_Name_to_string>
_Objects_Has_string_name( information ),
name,
length
);
_ISR_lock_ISR_enable( &lock_context );
4002917c: b9403be0 ldr w0, [sp, #56]
40029180: d51b4220 msr daif, x0
return name;
40029184: aa1303e0 mov x0, x19
}
40029188: a94153f3 ldp x19, x20, [sp, #16]
4002918c: a9425bf5 ldp x21, x22, [sp, #32]
40029190: a8c47bfd ldp x29, x30, [sp], #64
40029194: d65f03c0 ret
40029198: 900006e0 adrp x0, 40105000 <rtems_libio_iops+0x58>
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Get_executing()->Object.id : id;
4002919c: f9411000 ldr x0, [x0, #544]
400291a0: b9401014 ldr w20, [x0, #16]
information = _Objects_Get_information_id( tmpId );
400291a4: 2a1403e0 mov w0, w20
400291a8: 9400168a bl 4002ebd0 <_Objects_Get_information_id>
400291ac: aa0003f6 mov x22, x0
if ( !information )
400291b0: b5fffce0 cbnz x0, 4002914c <_Objects_Get_name_as_string+0x3c> <== ALWAYS TAKEN
return NULL;
400291b4: d2800000 mov x0, #0x0 // #0
}
400291b8: a94153f3 ldp x19, x20, [sp, #16]
400291bc: a9425bf5 ldp x21, x22, [sp, #32]
400291c0: a8c47bfd ldp x29, x30, [sp], #64
400291c4: d65f03c0 ret
return NULL;
400291c8: d2800000 mov x0, #0x0 // #0
}
400291cc: d65f03c0 ret
00000000400291d0 <_Objects_Id_to_name>:
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
400291d0: a9bd7bfd stp x29, x30, [sp, #-48]!
400291d4: 910003fd mov x29, sp
400291d8: a90153f3 stp x19, x20, [sp, #16]
400291dc: aa0103f4 mov x20, x1
400291e0: 2a0003f3 mov w19, w0
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Get_executing()->Object.id : id;
400291e4: 35000080 cbnz w0, 400291f4 <_Objects_Id_to_name+0x24>
400291e8: 900006e0 adrp x0, 40105000 <rtems_libio_iops+0x58>
400291ec: f9411000 ldr x0, [x0, #544]
400291f0: b9401013 ldr w19, [x0, #16]
information = _Objects_Get_information_id( tmpId );
400291f4: 2a1303e0 mov w0, w19
400291f8: 94001676 bl 4002ebd0 <_Objects_Get_information_id>
400291fc: aa0003e2 mov x2, x0
if ( !information )
40029200: b40001e0 cbz x0, 4002923c <_Objects_Id_to_name+0x6c>
return OBJECTS_INVALID_ID;
if ( _Objects_Has_string_name( information ) )
40029204: 79404c00 ldrh w0, [x0, #38]
40029208: 350001a0 cbnz w0, 4002923c <_Objects_Id_to_name+0x6c> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
the_object = _Objects_Get(
4002920c: 2a1303e0 mov w0, w19
40029210: 9100a3e1 add x1, sp, #0x28
40029214: 97ffff6f bl 40028fd0 <_Objects_Get>
tmpId,
&lock_context,
information
);
if ( !the_object )
40029218: b4000120 cbz x0, 4002923c <_Objects_Id_to_name+0x6c>
return OBJECTS_INVALID_ID;
*name = the_object->name;
4002921c: f9400c00 ldr x0, [x0, #24]
40029220: f9000280 str x0, [x20]
_ISR_lock_ISR_enable( &lock_context );
40029224: b9402be0 ldr w0, [sp, #40]
40029228: d51b4220 msr daif, x0
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
4002922c: 52800000 mov w0, #0x0 // #0
}
40029230: a94153f3 ldp x19, x20, [sp, #16]
40029234: a8c37bfd ldp x29, x30, [sp], #48
40029238: d65f03c0 ret
return OBJECTS_INVALID_ID;
4002923c: 52800060 mov w0, #0x3 // #3
}
40029240: a94153f3 ldp x19, x20, [sp, #16]
40029244: a8c37bfd ldp x29, x30, [sp], #48
40029248: d65f03c0 ret
4002924c: 00000000 udf #0
000000004002e770 <_Objects_Name_to_string>:
char lname[ 5 ];
const char *s;
char *d;
size_t i;
if ( is_string ) {
4002e770: 72001c3f tst w1, #0xff
4002e774: 54000320 b.eq 4002e7d8 <_Objects_Name_to_string+0x68> // b.none <== ALWAYS TAKEN
}
d = buffer;
i = 1;
if ( s != NULL ) {
4002e778: b50000a0 cbnz x0, 4002e78c <_Objects_Name_to_string+0x1c> <== NOT EXECUTED
while ( *s != '\0' ) {
if ( i < buffer_size ) {
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e77c: d2800000 mov x0, #0x0 // #0 <== NOT EXECUTED
++s;
++i;
}
}
if ( buffer_size > 0 ) {
4002e780: b40002a3 cbz x3, 4002e7d4 <_Objects_Name_to_string+0x64> <== NOT EXECUTED
*d = '\0';
4002e784: 3900005f strb wzr, [x2] <== NOT EXECUTED
}
return i - 1;
4002e788: d65f03c0 ret <== NOT EXECUTED
while ( *s != '\0' ) {
4002e78c: 39400001 ldrb w1, [x0] <== NOT EXECUTED
4002e790: 34ffff61 cbz w1, 4002e77c <_Objects_Name_to_string+0xc> <== NOT EXECUTED
4002e794: d1000406 sub x6, x0, #0x1 <== NOT EXECUTED
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e798: 52800547 mov w7, #0x2a // #42 <== NOT EXECUTED
while ( *s != '\0' ) {
4002e79c: d2800020 mov x0, #0x1 // #1 <== NOT EXECUTED
4002e7a0: 14000002 b 4002e7a8 <_Objects_Name_to_string+0x38> <== NOT EXECUTED
++i;
4002e7a4: aa0503e0 mov x0, x5 <== NOT EXECUTED
return uc >= ' ' && uc <= '~';
4002e7a8: 51008024 sub w4, w1, #0x20 <== NOT EXECUTED
++i;
4002e7ac: 91000405 add x5, x0, #0x1 <== NOT EXECUTED
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e7b0: 12001c84 and w4, w4, #0xff <== NOT EXECUTED
if ( i < buffer_size ) {
4002e7b4: eb00007f cmp x3, x0 <== NOT EXECUTED
4002e7b8: 54000089 b.ls 4002e7c8 <_Objects_Name_to_string+0x58> // b.plast <== NOT EXECUTED
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e7bc: 71017c9f cmp w4, #0x5f <== NOT EXECUTED
4002e7c0: 1a873021 csel w1, w1, w7, cc // cc = lo, ul, last <== NOT EXECUTED
4002e7c4: 38001441 strb w1, [x2], #1 <== NOT EXECUTED
while ( *s != '\0' ) {
4002e7c8: 386568c1 ldrb w1, [x6, x5] <== NOT EXECUTED
4002e7cc: 35fffec1 cbnz w1, 4002e7a4 <_Objects_Name_to_string+0x34> <== NOT EXECUTED
if ( buffer_size > 0 ) {
4002e7d0: b5fffda3 cbnz x3, 4002e784 <_Objects_Name_to_string+0x14> <== NOT EXECUTED
}
4002e7d4: d65f03c0 ret <== NOT EXECUTED
{
4002e7d8: d10043ff sub sp, sp, #0x10
lname[ 0 ] = (name.name_u32 >> 24) & 0xff;
4002e7dc: 53187c01 lsr w1, w0, #24
lname[ 1 ] = (name.name_u32 >> 16) & 0xff;
4002e7e0: 53107c05 lsr w5, w0, #16
lname[ 2 ] = (name.name_u32 >> 8) & 0xff;
4002e7e4: 53087c04 lsr w4, w0, #8
s = lname;
4002e7e8: 910023e6 add x6, sp, #0x8
lname[ 0 ] = (name.name_u32 >> 24) & 0xff;
4002e7ec: 390023e1 strb w1, [sp, #8]
lname[ 1 ] = (name.name_u32 >> 16) & 0xff;
4002e7f0: 390027e5 strb w5, [sp, #9]
lname[ 2 ] = (name.name_u32 >> 8) & 0xff;
4002e7f4: 39002be4 strb w4, [sp, #10]
lname[ 3 ] = (name.name_u32 >> 0) & 0xff;
4002e7f8: 39002fe0 strb w0, [sp, #11]
lname[ 4 ] = '\0';
4002e7fc: 390033ff strb wzr, [sp, #12]
while ( *s != '\0' ) {
4002e800: 34000281 cbz w1, 4002e850 <_Objects_Name_to_string+0xe0>
4002e804: d10004c6 sub x6, x6, #0x1
4002e808: d2800020 mov x0, #0x1 // #1
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e80c: 52800547 mov w7, #0x2a // #42
4002e810: 14000002 b 4002e818 <_Objects_Name_to_string+0xa8>
++i;
4002e814: aa0503e0 mov x0, x5
return uc >= ' ' && uc <= '~';
4002e818: 51008024 sub w4, w1, #0x20
++i;
4002e81c: 91000405 add x5, x0, #0x1
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e820: 12001c84 and w4, w4, #0xff
if ( i < buffer_size ) {
4002e824: eb00007f cmp x3, x0
4002e828: 54000089 b.ls 4002e838 <_Objects_Name_to_string+0xc8> // b.plast
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e82c: 71017c9f cmp w4, #0x5f
4002e830: 1a873021 csel w1, w1, w7, cc // cc = lo, ul, last
4002e834: 38001441 strb w1, [x2], #1
while ( *s != '\0' ) {
4002e838: 386568c1 ldrb w1, [x6, x5]
4002e83c: 35fffec1 cbnz w1, 4002e814 <_Objects_Name_to_string+0xa4>
if ( buffer_size > 0 ) {
4002e840: b4000043 cbz x3, 4002e848 <_Objects_Name_to_string+0xd8>
*d = '\0';
4002e844: 3900005f strb wzr, [x2]
}
4002e848: 910043ff add sp, sp, #0x10
4002e84c: d65f03c0 ret
*d = _Objects_Name_char_is_printable(*s) ? *s : '*';
4002e850: d2800000 mov x0, #0x0 // #0
4002e854: 17fffffb b 4002e840 <_Objects_Name_to_string+0xd0>
...
0000000040024a10 <_Objects_Set_name>:
Status_Control _Objects_Set_name(
const Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
40024a10: a9bd7bfd stp x29, x30, [sp, #-48]!
40024a14: 910003fd mov x29, sp
40024a18: a90153f3 stp x19, x20, [sp, #16]
40024a1c: aa0103f4 mov x20, x1
40024a20: 79404c01 ldrh w1, [x0, #38]
40024a24: aa0203f3 mov x19, x2
if ( _Objects_Has_string_name( information ) ) {
40024a28: 34000201 cbz w1, 40024a68 <_Objects_Set_name+0x58>
size_t length;
char *dup;
length = strnlen( name, information->name_length );
40024a2c: 92403c21 and x1, x1, #0xffff
40024a30: aa0203e0 mov x0, x2
40024a34: 9400292d bl 4002eee8 <strnlen>
dup = _Workspace_String_duplicate( name, length );
40024a38: aa0003e1 mov x1, x0
40024a3c: aa1303e0 mov x0, x19
40024a40: 94000938 bl 40026f20 <_Workspace_String_duplicate>
40024a44: aa0003f3 mov x19, x0
if ( dup == NULL ) {
40024a48: b4000360 cbz x0, 40024ab4 <_Objects_Set_name+0xa4> <== ALWAYS TAKEN
return STATUS_NO_MEMORY;
}
_Workspace_Free( RTEMS_DECONST( char *, the_object->name.name_p ) );
40024a4c: f9400e80 ldr x0, [x20, #24] <== NOT EXECUTED
40024a50: 94000930 bl 40026f10 <_Workspace_Free> <== NOT EXECUTED
the_object->name.name_p = dup;
40024a54: f9000e93 str x19, [x20, #24] <== NOT EXECUTED
the_object->name.name_u32 =
_Objects_Build_name( c[ 0 ], c[ 1 ], c[ 2 ], c[ 3 ] );
}
return STATUS_SUCCESSFUL;
40024a58: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
}
40024a5c: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
40024a60: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
40024a64: d65f03c0 ret <== NOT EXECUTED
memset( c, ' ', sizeof( c ) );
40024a68: d1000453 sub x19, x2, #0x1
40024a6c: 3203c3e0 mov w0, #0x20202020 // #538976288
40024a70: d2800023 mov x3, #0x1 // #1
40024a74: b9002be0 str w0, [sp, #40]
c[ i ] = name[ i ];
40024a78: 9100a3e0 add x0, sp, #0x28
40024a7c: 8b000061 add x1, x3, x0
if ( name[ i ] == '\0') {
40024a80: 38636a60 ldrb w0, [x19, x3]
for ( i = 0; i < 4; ++i ) {
40024a84: 91000463 add x3, x3, #0x1
40024a88: f100147f cmp x3, #0x5
if ( name[ i ] == '\0') {
40024a8c: 34000060 cbz w0, 40024a98 <_Objects_Set_name+0x88>
c[ i ] = name[ i ];
40024a90: 381ff020 sturb w0, [x1, #-1]
for ( i = 0; i < 4; ++i ) {
40024a94: 54ffff21 b.ne 40024a78 <_Objects_Set_name+0x68> // b.any
the_object->name.name_u32 =
40024a98: b9402be1 ldr w1, [sp, #40]
return STATUS_SUCCESSFUL;
40024a9c: 52800000 mov w0, #0x0 // #0
40024aa0: 5ac00821 rev w1, w1
the_object->name.name_u32 =
40024aa4: b9001a81 str w1, [x20, #24]
}
40024aa8: a94153f3 ldp x19, x20, [sp, #16]
40024aac: a8c37bfd ldp x29, x30, [sp], #48
40024ab0: d65f03c0 ret
return STATUS_NO_MEMORY;
40024ab4: 5282c340 mov w0, #0x161a // #5658
40024ab8: 17fffffc b 40024aa8 <_Objects_Set_name+0x98>
40024abc: 00000000 udf #0
00000000400292a0 <_Objects_Shrink_information>:
/*
* Search the list to find block or chunk with all objects inactive.
*/
objects_per_block = information->objects_per_block;
400292a0: 79404405 ldrh w5, [x0, #34]
block_count = _Objects_Get_maximum_index( information ) / objects_per_block;
400292a4: 79400004 ldrh w4, [x0]
400292a8: 1ac50884 udiv w4, w4, w5
for ( block = 1; block < block_count; block++ ) {
400292ac: 7100049f cmp w4, #0x1
400292b0: 540001a9 b.ls 400292e4 <_Objects_Shrink_information+0x44> // b.plast<== NEVER TAKEN
if ( information->inactive_per_block[ block ] == objects_per_block ) {
400292b4: d2800022 mov x2, #0x1 // #1
400292b8: 2a0203e1 mov w1, w2
400292bc: f9402006 ldr x6, [x0, #64]
400292c0: 14000004 b 400292d0 <_Objects_Shrink_information+0x30>
for ( block = 1; block < block_count; block++ ) {
400292c4: 6b22209f cmp w4, w2, uxth
400292c8: 12003c41 and w1, w2, #0xffff
400292cc: 540000c9 b.ls 400292e4 <_Objects_Shrink_information+0x44> // b.plast<== NEVER TAKEN
if ( information->inactive_per_block[ block ] == objects_per_block ) {
400292d0: 786278c3 ldrh w3, [x6, x2, lsl #1]
for ( block = 1; block < block_count; block++ ) {
400292d4: 91000442 add x2, x2, #0x1
if ( information->inactive_per_block[ block ] == objects_per_block ) {
400292d8: 6b05007f cmp w3, w5
400292dc: 54ffff41 b.ne 400292c4 <_Objects_Shrink_information+0x24> // b.any
_Objects_Free_objects_block( information, block );
400292e0: 17ffffc4 b 400291f0 <_Objects_Free_objects_block>
return;
}
}
}
400292e4: d65f03c0 ret <== NOT EXECUTED
...
0000000040025980 <_Once>:
.Mutex = RTEMS_MUTEX_INITIALIZER( "_Once" ),
.State = RTEMS_CONDITION_VARIABLE_INITIALIZER( "_Once" )
};
int _Once( unsigned char *once_state, void ( *init_routine )( void ) )
{
40025980: a9bd7bfd stp x29, x30, [sp, #-48]!
40025984: 910003fd mov x29, sp
40025988: a90153f3 stp x19, x20, [sp, #16]
4002598c: aa0003f3 mov x19, x0
_Atomic_Fence( ATOMIC_ORDER_ACQUIRE );
if ( RTEMS_PREDICT_FALSE( *once_state != ONCE_STATE_COMPLETE ) ) {
40025990: 39400000 ldrb w0, [x0]
40025994: 7100081f cmp w0, #0x2
40025998: 540000a1 b.ne 400259ac <_Once+0x2c> // b.any
_Once_Unlock( thread_life_state );
}
return 0;
}
4002599c: 52800000 mov w0, #0x0 // #0
400259a0: a94153f3 ldp x19, x20, [sp, #16]
400259a4: a8c37bfd ldp x29, x30, [sp], #48
400259a8: d65f03c0 ret
Thread_Life_state _Once_Lock( void )
{
Thread_Life_state thread_life_state;
thread_life_state = _Thread_Set_life_protection( THREAD_LIFE_PROTECTED );
400259ac: aa0103f4 mov x20, x1
400259b0: 52800020 mov w0, #0x1 // #1
400259b4: a9025bf5 stp x21, x22, [sp, #32]
400259b8: 940006f2 bl 40027580 <_Thread_Set_life_protection>
mutex->_Queue._name = name;
}
static __inline void rtems_mutex_lock( rtems_mutex *mutex )
{
_Mutex_Acquire( mutex );
400259bc: f00006d5 adrp x21, 40100000 <_RTEMS_tasks_Information>
400259c0: 910e02b5 add x21, x21, #0x380
400259c4: 2a0003f6 mov w22, w0
400259c8: aa1503e0 mov x0, x21
400259cc: 97ffff69 bl 40025770 <_Mutex_Acquire>
if ( *once_state == ONCE_STATE_INIT ) {
400259d0: 39400260 ldrb w0, [x19]
400259d4: 34000280 cbz w0, 40025a24 <_Once+0xa4> <== ALWAYS TAKEN
while ( *once_state != ONCE_STATE_COMPLETE ) {
400259d8: 7100081f cmp w0, #0x2 <== NOT EXECUTED
static __inline void rtems_condition_variable_wait(
rtems_condition_variable *condition_variable,
rtems_mutex *mutex
)
{
_Condition_Wait( condition_variable, mutex );
400259dc: 910082b4 add x20, x21, #0x20 <== NOT EXECUTED
400259e0: 54000100 b.eq 40025a00 <_Once+0x80> // b.none <== NOT EXECUTED
400259e4: d503201f nop <== NOT EXECUTED
400259e8: aa1503e1 mov x1, x21 <== NOT EXECUTED
400259ec: aa1403e0 mov x0, x20 <== NOT EXECUTED
400259f0: 94000d4c bl 40028f20 <_Condition_Wait> <== NOT EXECUTED
400259f4: 39400261 ldrb w1, [x19] <== NOT EXECUTED
400259f8: 7100083f cmp w1, #0x2 <== NOT EXECUTED
400259fc: 54ffff61 b.ne 400259e8 <_Once+0x68> // b.any <== NOT EXECUTED
_Mutex_Release( mutex );
40025a00: aa1503e0 mov x0, x21
40025a04: 97ffff77 bl 400257e0 <_Mutex_Release>
}
void _Once_Unlock( Thread_Life_state thread_life_state )
{
rtems_mutex_unlock( &_Once_Information.Mutex );
_Thread_Set_life_protection( thread_life_state );
40025a08: 2a1603e0 mov w0, w22
40025a0c: 940006dd bl 40027580 <_Thread_Set_life_protection>
}
40025a10: 52800000 mov w0, #0x0 // #0
40025a14: a94153f3 ldp x19, x20, [sp, #16]
_Thread_Set_life_protection( thread_life_state );
40025a18: a9425bf5 ldp x21, x22, [sp, #32]
}
40025a1c: a8c37bfd ldp x29, x30, [sp], #48
40025a20: d65f03c0 ret
*once_state = ONCE_STATE_RUNNING;
40025a24: 52800020 mov w0, #0x1 // #1
40025a28: 39000260 strb w0, [x19]
40025a2c: aa1503e0 mov x0, x21
40025a30: 97ffff6c bl 400257e0 <_Mutex_Release>
_Thread_Set_life_protection( thread_life_state );
40025a34: 52800020 mov w0, #0x1 // #1
40025a38: 940006d2 bl 40027580 <_Thread_Set_life_protection>
( *init_routine )();
40025a3c: d63f0280 blr x20
thread_life_state = _Thread_Set_life_protection( THREAD_LIFE_PROTECTED );
40025a40: 52800020 mov w0, #0x1 // #1
40025a44: 940006cf bl 40027580 <_Thread_Set_life_protection>
_Mutex_Acquire( mutex );
40025a48: aa1503e0 mov x0, x21
40025a4c: 97ffff49 bl 40025770 <_Mutex_Acquire>
*once_state = ONCE_STATE_COMPLETE;
40025a50: 52800040 mov w0, #0x2 // #2
40025a54: 39000260 strb w0, [x19]
static __inline void rtems_condition_variable_broadcast(
rtems_condition_variable *condition_variable
)
{
_Condition_Broadcast( condition_variable );
40025a58: 910082a0 add x0, x21, #0x20
40025a5c: 94000d4d bl 40028f90 <_Condition_Broadcast>
}
40025a60: 17ffffe8 b 40025a00 <_Once+0x80>
...
000000004002c410 <_Processor_mask_Copy>:
)
{
long inclusive = 0;
long exclusive = 0;
if ( ( dst_size | src_size ) % sizeof( long ) != 0 ) {
4002c410: aa030024 orr x4, x1, x3
4002c414: f240089f tst x4, #0x7
4002c418: 54000401 b.ne 4002c498 <_Processor_mask_Copy+0x88> // b.any
return PROCESSOR_MASK_COPY_INVALID_SIZE;
}
while ( dst_size > 0 && src_size > 0 ) {
4002c41c: f100007f cmp x3, #0x0
long inclusive = 0;
4002c420: d2800005 mov x5, #0x0 // #0
while ( dst_size > 0 && src_size > 0 ) {
4002c424: fa401824 ccmp x1, #0x0, #0x4, ne // ne = any
4002c428: 54000120 b.eq 4002c44c <_Processor_mask_Copy+0x3c> // b.none
4002c42c: d503201f nop
long bits = *src;
4002c430: f8408444 ldr x4, [x2], #8
inclusive |= bits;
*dst = bits;
4002c434: f8008404 str x4, [x0], #8
++dst;
++src;
dst_size -= sizeof( long );
src_size -= sizeof( long );
4002c438: d1002063 sub x3, x3, #0x8
while ( dst_size > 0 && src_size > 0 ) {
4002c43c: f1002021 subs x1, x1, #0x8
4002c440: fa401864 ccmp x3, #0x0, #0x4, ne // ne = any
inclusive |= bits;
4002c444: aa0400a5 orr x5, x5, x4
while ( dst_size > 0 && src_size > 0 ) {
4002c448: 54ffff41 b.ne 4002c430 <_Processor_mask_Copy+0x20> // b.any <== NEVER TAKEN
}
while ( dst_size > 0 ) {
4002c44c: b40000c1 cbz x1, 4002c464 <_Processor_mask_Copy+0x54>
4002c450: 8b010001 add x1, x0, x1
4002c454: d503201f nop
*dst = 0;
4002c458: f800841f str xzr, [x0], #8
while ( dst_size > 0 ) {
4002c45c: eb01001f cmp x0, x1
4002c460: 54ffffc1 b.ne 4002c458 <_Processor_mask_Copy+0x48> // b.any <== NEVER TAKEN
++dst;
dst_size -= sizeof( long );
}
while ( src_size > 0 ) {
4002c464: b40001e3 cbz x3, 4002c4a0 <_Processor_mask_Copy+0x90>
4002c468: 8b030043 add x3, x2, x3
long exclusive = 0;
4002c46c: d2800001 mov x1, #0x0 // #0
exclusive |= *src;
4002c470: f8408440 ldr x0, [x2], #8
4002c474: aa000021 orr x1, x1, x0
while ( src_size > 0 ) {
4002c478: eb03005f cmp x2, x3
4002c47c: 54ffffa1 b.ne 4002c470 <_Processor_mask_Copy+0x60> // b.any <== NEVER TAKEN
} else {
return PROCESSOR_MASK_COPY_COMPLETE_LOSS;
}
}
return PROCESSOR_MASK_COPY_LOSSLESS;
4002c480: 52800000 mov w0, #0x0 // #0
if ( exclusive != 0 ) {
4002c484: b4000081 cbz x1, 4002c494 <_Processor_mask_Copy+0x84>
return PROCESSOR_MASK_COPY_COMPLETE_LOSS;
4002c488: f10000bf cmp x5, #0x0
4002c48c: 1a9f17e0 cset w0, eq // eq = none
4002c490: 11000400 add w0, w0, #0x1
}
4002c494: d65f03c0 ret
return PROCESSOR_MASK_COPY_INVALID_SIZE;
4002c498: 52800060 mov w0, #0x3 // #3
}
4002c49c: d65f03c0 ret
return PROCESSOR_MASK_COPY_LOSSLESS;
4002c4a0: 52800000 mov w0, #0x0 // #0
}
4002c4a4: d65f03c0 ret
...
0000000040029610 <_RBTree_Extract>:
#include <rtems/score/rbtreeimpl.h>
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
RB_GENERATE_REMOVE( RBTree_Control, RBTree_Node, Node, static )
40029610: a9400823 ldp x3, x2, [x1]
40029614: b40012e3 cbz x3, 40029870 <_RBTree_Extract+0x260>
40029618: b4000542 cbz x2, 400296c0 <_RBTree_Extract+0xb0>
4002961c: d503201f nop
40029620: aa0203e4 mov x4, x2
40029624: f9400042 ldr x2, [x2]
40029628: b5ffffc2 cbnz x2, 40029620 <_RBTree_Extract+0x10>
4002962c: a9408c82 ldp x2, x3, [x4, #8]
40029630: b9401885 ldr w5, [x4, #24]
40029634: aa0303e6 mov x6, x3
40029638: b4000062 cbz x2, 40029644 <_RBTree_Extract+0x34>
4002963c: f9000843 str x3, [x2, #16]
40029640: f9400886 ldr x6, [x4, #16]
40029644: b40013c3 cbz x3, 400298bc <_RBTree_Extract+0x2ac> <== NEVER TAKEN
40029648: f9400067 ldr x7, [x3]
4002964c: eb07009f cmp x4, x7
40029650: 54001240 b.eq 40029898 <_RBTree_Extract+0x288> // b.none
40029654: f9000462 str x2, [x3, #8]
40029658: f9400027 ldr x7, [x1]
4002965c: f9000087 str x7, [x4]
40029660: eb06003f cmp x1, x6
40029664: f9400426 ldr x6, [x1, #8]
40029668: f9000486 str x6, [x4, #8]
4002966c: 9a841063 csel x3, x3, x4, ne // ne = any
40029670: f9400826 ldr x6, [x1, #16]
40029674: f9000886 str x6, [x4, #16]
40029678: a9411c26 ldp x6, x7, [x1, #16]
4002967c: f9000c87 str x7, [x4, #24]
40029680: b40011a6 cbz x6, 400298b4 <_RBTree_Extract+0x2a4>
40029684: f94000c7 ldr x7, [x6]
40029688: eb07003f cmp x1, x7
4002968c: 54001200 b.eq 400298cc <_RBTree_Extract+0x2bc> // b.none
40029690: f90004c4 str x4, [x6, #8]
40029694: a9400426 ldp x6, x1, [x1]
40029698: f90008c4 str x4, [x6, #16]
4002969c: b4000041 cbz x1, 400296a4 <_RBTree_Extract+0x94>
400296a0: f9000824 str x4, [x1, #16]
400296a4: b40000a3 cbz x3, 400296b8 <_RBTree_Extract+0xa8> <== NEVER TAKEN
400296a8: aa0303e1 mov x1, x3
400296ac: d503201f nop
400296b0: f9400821 ldr x1, [x1, #16]
400296b4: b5ffffe1 cbnz x1, 400296b0 <_RBTree_Extract+0xa0>
400296b8: 34000185 cbz w5, 400296e8 <_RBTree_Extract+0xd8>
)
{
_Assert( _RBTree_Find_root( the_node ) == _RBTree_Root( the_rbtree ) );
RB_REMOVE( RBTree_Control, the_rbtree, the_node );
_RBTree_Initialize_node( the_node );
}
400296bc: d65f03c0 ret
RB_GENERATE_REMOVE( RBTree_Control, RBTree_Node, Node, static )
400296c0: aa0303e2 mov x2, x3
400296c4: b9401825 ldr w5, [x1, #24]
400296c8: f9400823 ldr x3, [x1, #16]
400296cc: f9000843 str x3, [x2, #16]
400296d0: b4000d83 cbz x3, 40029880 <_RBTree_Extract+0x270>
400296d4: f9400064 ldr x4, [x3]
400296d8: eb04003f cmp x1, x4
400296dc: 54000e60 b.eq 400298a8 <_RBTree_Extract+0x298> // b.none
400296e0: f9000462 str x2, [x3, #8]
400296e4: 35fffec5 cbnz w5, 400296bc <_RBTree_Extract+0xac>
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
400296e8: 52800025 mov w5, #0x1 // #1
400296ec: d503201f nop
400296f0: b4000062 cbz x2, 400296fc <_RBTree_Extract+0xec>
400296f4: b9401841 ldr w1, [x2, #24]
400296f8: 35000ee1 cbnz w1, 400298d4 <_RBTree_Extract+0x2c4>
400296fc: f9400001 ldr x1, [x0]
40029700: eb01005f cmp x2, x1
40029704: 54000660 b.eq 400297d0 <_RBTree_Extract+0x1c0> // b.none
40029708: f9400061 ldr x1, [x3]
4002970c: eb02003f cmp x1, x2
40029710: 54000220 b.eq 40029754 <_RBTree_Extract+0x144> // b.none
40029714: b9401822 ldr w2, [x1, #24]
40029718: 7100045f cmp w2, #0x1
4002971c: 54000840 b.eq 40029824 <_RBTree_Extract+0x214> // b.none
40029720: f9400022 ldr x2, [x1]
40029724: b4000062 cbz x2, 40029730 <_RBTree_Extract+0x120>
40029728: b9401844 ldr w4, [x2, #24]
4002972c: 35000e04 cbnz w4, 400298ec <_RBTree_Extract+0x2dc>
40029730: f9400424 ldr x4, [x1, #8]
40029734: b4000064 cbz x4, 40029740 <_RBTree_Extract+0x130>
40029738: b9401886 ldr w6, [x4, #24]
4002973c: 35000d26 cbnz w6, 400298e0 <_RBTree_Extract+0x2d0>
40029740: b9001825 str w5, [x1, #24]
40029744: aa0303e2 mov x2, x3
40029748: f9400861 ldr x1, [x3, #16]
4002974c: aa0103e3 mov x3, x1
40029750: 17ffffe8 b 400296f0 <_RBTree_Extract+0xe0>
40029754: f9400461 ldr x1, [x3, #8]
40029758: b9401824 ldr w4, [x1, #24]
4002975c: f9400022 ldr x2, [x1]
40029760: 7100049f cmp w4, #0x1
40029764: 540003c0 b.eq 400297dc <_RBTree_Extract+0x1cc> // b.none
40029768: b4000062 cbz x2, 40029774 <_RBTree_Extract+0x164>
4002976c: b9401844 ldr w4, [x2, #24]
40029770: 35001224 cbnz w4, 400299b4 <_RBTree_Extract+0x3a4>
40029774: f9400424 ldr x4, [x1, #8]
40029778: b4fffe44 cbz x4, 40029740 <_RBTree_Extract+0x130>
4002977c: b9401882 ldr w2, [x4, #24]
40029780: 34fffe02 cbz w2, 40029740 <_RBTree_Extract+0x130>
40029784: b9401865 ldr w5, [x3, #24]
40029788: f9400462 ldr x2, [x3, #8]
4002978c: b9001825 str w5, [x1, #24]
40029790: b900187f str wzr, [x3, #24]
40029794: b900189f str wzr, [x4, #24]
40029798: f9400041 ldr x1, [x2]
4002979c: f9000461 str x1, [x3, #8]
400297a0: b4000041 cbz x1, 400297a8 <_RBTree_Extract+0x198>
400297a4: f9000823 str x3, [x1, #16]
400297a8: f9400861 ldr x1, [x3, #16]
400297ac: f9000841 str x1, [x2, #16]
400297b0: b4001421 cbz x1, 40029a34 <_RBTree_Extract+0x424>
400297b4: f9400024 ldr x4, [x1]
400297b8: eb04007f cmp x3, x4
400297bc: 54001420 b.eq 40029a40 <_RBTree_Extract+0x430> // b.none
400297c0: f9000422 str x2, [x1, #8]
400297c4: f9400001 ldr x1, [x0]
400297c8: f9000043 str x3, [x2]
400297cc: f9000862 str x2, [x3, #16]
400297d0: b4fff761 cbz x1, 400296bc <_RBTree_Extract+0xac>
400297d4: b900183f str wzr, [x1, #24]
}
400297d8: d65f03c0 ret
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
400297dc: b900183f str wzr, [x1, #24]
400297e0: f9000462 str x2, [x3, #8]
400297e4: b9001864 str w4, [x3, #24]
400297e8: b4000042 cbz x2, 400297f0 <_RBTree_Extract+0x1e0> <== NEVER TAKEN
400297ec: f9000843 str x3, [x2, #16]
400297f0: f9400864 ldr x4, [x3, #16]
400297f4: f9000824 str x4, [x1, #16]
400297f8: b4000544 cbz x4, 400298a0 <_RBTree_Extract+0x290>
400297fc: f9400086 ldr x6, [x4]
40029800: eb06007f cmp x3, x6
40029804: 54000600 b.eq 400298c4 <_RBTree_Extract+0x2b4> // b.none
40029808: f9000481 str x1, [x4, #8]
4002980c: f9400462 ldr x2, [x3, #8]
40029810: f9000023 str x3, [x1]
40029814: f9000861 str x1, [x3, #16]
40029818: aa0203e1 mov x1, x2
4002981c: f9400042 ldr x2, [x2]
40029820: 17ffffd2 b 40029768 <_RBTree_Extract+0x158>
40029824: f9400424 ldr x4, [x1, #8]
40029828: b900183f str wzr, [x1, #24]
4002982c: f9000064 str x4, [x3]
40029830: b9001862 str w2, [x3, #24]
40029834: b4000044 cbz x4, 4002983c <_RBTree_Extract+0x22c> <== NEVER TAKEN
40029838: f9000883 str x3, [x4, #16]
4002983c: f9400862 ldr x2, [x3, #16]
40029840: f9000822 str x2, [x1, #16]
40029844: b4000122 cbz x2, 40029868 <_RBTree_Extract+0x258>
40029848: f9400046 ldr x6, [x2]
4002984c: eb06007f cmp x3, x6
40029850: 540001e0 b.eq 4002988c <_RBTree_Extract+0x27c> // b.none
40029854: f9000441 str x1, [x2, #8]
40029858: f9000423 str x3, [x1, #8]
4002985c: f9000861 str x1, [x3, #16]
40029860: aa0403e1 mov x1, x4
40029864: 17ffffaf b 40029720 <_RBTree_Extract+0x110>
40029868: f9000001 str x1, [x0]
4002986c: 17fffffb b 40029858 <_RBTree_Extract+0x248>
RB_GENERATE_REMOVE( RBTree_Control, RBTree_Node, Node, static )
40029870: b9401825 ldr w5, [x1, #24]
40029874: f9400823 ldr x3, [x1, #16]
40029878: b5fff2a2 cbnz x2, 400296cc <_RBTree_Extract+0xbc>
4002987c: b5fff2c3 cbnz x3, 400296d4 <_RBTree_Extract+0xc4>
40029880: f9000002 str x2, [x0]
40029884: 35fff1c5 cbnz w5, 400296bc <_RBTree_Extract+0xac> <== NEVER TAKEN
40029888: 17ffff98 b 400296e8 <_RBTree_Extract+0xd8>
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
4002988c: f9000041 str x1, [x2]
40029890: f9400064 ldr x4, [x3]
40029894: 17fffff1 b 40029858 <_RBTree_Extract+0x248>
RB_GENERATE_REMOVE( RBTree_Control, RBTree_Node, Node, static )
40029898: f9000062 str x2, [x3]
4002989c: 17ffff6f b 40029658 <_RBTree_Extract+0x48>
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
400298a0: f9000001 str x1, [x0]
400298a4: 17ffffdb b 40029810 <_RBTree_Extract+0x200>
RB_GENERATE_REMOVE( RBTree_Control, RBTree_Node, Node, static )
400298a8: f9000062 str x2, [x3]
400298ac: 35fff085 cbnz w5, 400296bc <_RBTree_Extract+0xac>
400298b0: 17ffff8e b 400296e8 <_RBTree_Extract+0xd8>
400298b4: f9000004 str x4, [x0]
400298b8: 17ffff77 b 40029694 <_RBTree_Extract+0x84>
400298bc: f9000002 str x2, [x0] <== NOT EXECUTED
400298c0: 17ffff66 b 40029658 <_RBTree_Extract+0x48> <== NOT EXECUTED
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
400298c4: f9000081 str x1, [x4]
400298c8: 17ffffd2 b 40029810 <_RBTree_Extract+0x200>
RB_GENERATE_REMOVE( RBTree_Control, RBTree_Node, Node, static )
400298cc: f90000c4 str x4, [x6]
400298d0: 17ffff71 b 40029694 <_RBTree_Extract+0x84>
400298d4: aa0203e1 mov x1, x2
RB_GENERATE_REMOVE_COLOR( RBTree_Control, RBTree_Node, Node, static )
400298d8: b900183f str wzr, [x1, #24]
(void) the_node;
400298dc: 17ffffbf b 400297d8 <_RBTree_Extract+0x1c8>
400298e0: b4000322 cbz x2, 40029944 <_RBTree_Extract+0x334>
400298e4: b9401845 ldr w5, [x2, #24]
400298e8: 340002e5 cbz w5, 40029944 <_RBTree_Extract+0x334> <== ALWAYS TAKEN
400298ec: b9401865 ldr w5, [x3, #24]
400298f0: f9400064 ldr x4, [x3]
400298f4: b9001825 str w5, [x1, #24]
400298f8: b900187f str wzr, [x3, #24]
400298fc: b900185f str wzr, [x2, #24]
40029900: f9400481 ldr x1, [x4, #8]
40029904: f9000061 str x1, [x3]
40029908: b4000041 cbz x1, 40029910 <_RBTree_Extract+0x300>
4002990c: f9000823 str x3, [x1, #16]
40029910: f9400861 ldr x1, [x3, #16]
40029914: f9000881 str x1, [x4, #16]
40029918: b4000481 cbz x1, 400299a8 <_RBTree_Extract+0x398>
4002991c: f9400862 ldr x2, [x3, #16]
40029920: f9400042 ldr x2, [x2]
40029924: eb02007f cmp x3, x2
40029928: 540007c0 b.eq 40029a20 <_RBTree_Extract+0x410> // b.none
4002992c: f9000424 str x4, [x1, #8]
40029930: f9400001 ldr x1, [x0]
40029934: f9000483 str x3, [x4, #8]
40029938: f9000864 str x4, [x3, #16]
4002993c: b5fff4c1 cbnz x1, 400297d4 <_RBTree_Extract+0x1c4> <== ALWAYS TAKEN
40029940: 17ffff5f b 400296bc <_RBTree_Extract+0xac> <== NOT EXECUTED
40029944: f9400082 ldr x2, [x4]
40029948: b900189f str wzr, [x4, #24]
4002994c: 52800025 mov w5, #0x1 // #1
40029950: f9000422 str x2, [x1, #8]
40029954: b9001825 str w5, [x1, #24]
40029958: b4000042 cbz x2, 40029960 <_RBTree_Extract+0x350>
4002995c: f9000841 str x1, [x2, #16]
40029960: f9400822 ldr x2, [x1, #16]
40029964: f9000882 str x2, [x4, #16]
40029968: b40001c2 cbz x2, 400299a0 <_RBTree_Extract+0x390> <== NEVER TAKEN
4002996c: f9400045 ldr x5, [x2]
40029970: eb05003f cmp x1, x5
40029974: 540005c0 b.eq 40029a2c <_RBTree_Extract+0x41c> // b.none <== ALWAYS TAKEN
40029978: f9000444 str x4, [x2, #8] <== NOT EXECUTED
4002997c: f9000081 str x1, [x4]
40029980: f9000824 str x4, [x1, #16]
40029984: f9400064 ldr x4, [x3]
40029988: b9401861 ldr w1, [x3, #24]
4002998c: f9400082 ldr x2, [x4]
40029990: b9001881 str w1, [x4, #24]
40029994: b900187f str wzr, [x3, #24]
40029998: b4fffb42 cbz x2, 40029900 <_RBTree_Extract+0x2f0> <== NEVER TAKEN
4002999c: 17ffffd8 b 400298fc <_RBTree_Extract+0x2ec>
400299a0: f9000004 str x4, [x0] <== NOT EXECUTED
400299a4: 17fffff6 b 4002997c <_RBTree_Extract+0x36c> <== NOT EXECUTED
400299a8: aa0403e1 mov x1, x4
400299ac: f9000004 str x4, [x0]
400299b0: 17ffffe1 b 40029934 <_RBTree_Extract+0x324>
400299b4: f9400424 ldr x4, [x1, #8]
400299b8: b4000064 cbz x4, 400299c4 <_RBTree_Extract+0x3b4>
400299bc: b9401885 ldr w5, [x4, #24]
400299c0: 35ffee25 cbnz w5, 40029784 <_RBTree_Extract+0x174>
400299c4: f9400444 ldr x4, [x2, #8]
400299c8: b900185f str wzr, [x2, #24]
400299cc: 52800025 mov w5, #0x1 // #1
400299d0: f9000024 str x4, [x1]
400299d4: b9001825 str w5, [x1, #24]
400299d8: b4000044 cbz x4, 400299e0 <_RBTree_Extract+0x3d0>
400299dc: f9000881 str x1, [x4, #16]
400299e0: f9400824 ldr x4, [x1, #16]
400299e4: f9000844 str x4, [x2, #16]
400299e8: b4000324 cbz x4, 40029a4c <_RBTree_Extract+0x43c> <== NEVER TAKEN
400299ec: f9400085 ldr x5, [x4]
400299f0: eb05003f cmp x1, x5
400299f4: 54000300 b.eq 40029a54 <_RBTree_Extract+0x444> // b.none <== NEVER TAKEN
400299f8: f9000482 str x2, [x4, #8]
400299fc: f9000441 str x1, [x2, #8]
40029a00: f9000822 str x2, [x1, #16]
40029a04: f9400462 ldr x2, [x3, #8]
40029a08: b9401861 ldr w1, [x3, #24]
40029a0c: f9400444 ldr x4, [x2, #8]
40029a10: b9001841 str w1, [x2, #24]
40029a14: b900187f str wzr, [x3, #24]
40029a18: b4ffec04 cbz x4, 40029798 <_RBTree_Extract+0x188> <== NEVER TAKEN
40029a1c: 17ffff5e b 40029794 <_RBTree_Extract+0x184>
40029a20: f9000024 str x4, [x1]
40029a24: f9400001 ldr x1, [x0]
40029a28: 17ffffc3 b 40029934 <_RBTree_Extract+0x324>
40029a2c: f9000044 str x4, [x2]
40029a30: 17ffffd3 b 4002997c <_RBTree_Extract+0x36c>
40029a34: aa0203e1 mov x1, x2
40029a38: f9000002 str x2, [x0]
40029a3c: 17ffff63 b 400297c8 <_RBTree_Extract+0x1b8>
40029a40: f9000022 str x2, [x1]
40029a44: f9400001 ldr x1, [x0]
40029a48: 17ffff60 b 400297c8 <_RBTree_Extract+0x1b8>
40029a4c: f9000002 str x2, [x0] <== NOT EXECUTED
40029a50: 17ffffeb b 400299fc <_RBTree_Extract+0x3ec> <== NOT EXECUTED
40029a54: f9000082 str x2, [x4] <== NOT EXECUTED
40029a58: 17ffffe9 b 400299fc <_RBTree_Extract+0x3ec> <== NOT EXECUTED
40029a5c: 00000000 udf #0
0000000040029a60 <_RBTree_Insert_color>:
#include "config.h"
#endif
#include <rtems/score/rbtreeimpl.h>
RB_GENERATE_INSERT_COLOR( RBTree_Control, RBTree_Node, Node, static inline )
40029a60: 52800026 mov w6, #0x1 // #1
40029a64: f9400822 ldr x2, [x1, #16]
40029a68: b4000422 cbz x2, 40029aec <_RBTree_Insert_color+0x8c>
40029a6c: b9401843 ldr w3, [x2, #24]
40029a70: 7100047f cmp w3, #0x1
40029a74: 540003c1 b.ne 40029aec <_RBTree_Insert_color+0x8c> // b.any
40029a78: f9400843 ldr x3, [x2, #16]
40029a7c: f9400064 ldr x4, [x3]
40029a80: eb02009f cmp x4, x2
40029a84: 540003a0 b.eq 40029af8 <_RBTree_Insert_color+0x98> // b.none
40029a88: b4000084 cbz x4, 40029a98 <_RBTree_Insert_color+0x38>
40029a8c: b9401885 ldr w5, [x4, #24]
40029a90: 710004bf cmp w5, #0x1
40029a94: 540008a0 b.eq 40029ba8 <_RBTree_Insert_color+0x148> // b.none
40029a98: f9400044 ldr x4, [x2]
40029a9c: eb01009f cmp x4, x1
40029aa0: 54000620 b.eq 40029b64 <_RBTree_Insert_color+0x104> // b.none
40029aa4: f9400464 ldr x4, [x3, #8]
40029aa8: b900185f str wzr, [x2, #24]
40029aac: f9400082 ldr x2, [x4]
40029ab0: f9000462 str x2, [x3, #8]
40029ab4: b9001866 str w6, [x3, #24]
40029ab8: b4000042 cbz x2, 40029ac0 <_RBTree_Insert_color+0x60>
40029abc: f9000843 str x3, [x2, #16]
40029ac0: f9400862 ldr x2, [x3, #16]
40029ac4: f9000882 str x2, [x4, #16]
40029ac8: b40004a2 cbz x2, 40029b5c <_RBTree_Insert_color+0xfc>
40029acc: f9400045 ldr x5, [x2]
40029ad0: eb05007f cmp x3, x5
40029ad4: 54000740 b.eq 40029bbc <_RBTree_Insert_color+0x15c> // b.none
40029ad8: f9000444 str x4, [x2, #8]
40029adc: f9000083 str x3, [x4]
40029ae0: f9000864 str x4, [x3, #16]
40029ae4: f9400822 ldr x2, [x1, #16]
40029ae8: b5fffc22 cbnz x2, 40029a6c <_RBTree_Insert_color+0xc> <== ALWAYS TAKEN
40029aec: f9400000 ldr x0, [x0]
40029af0: b900181f str wzr, [x0, #24]
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Control_RB_INSERT_COLOR( the_rbtree, the_node );
}
40029af4: d65f03c0 ret
RB_GENERATE_INSERT_COLOR( RBTree_Control, RBTree_Node, Node, static inline )
40029af8: f9400464 ldr x4, [x3, #8]
40029afc: b4000084 cbz x4, 40029b0c <_RBTree_Insert_color+0xac>
40029b00: b9401885 ldr w5, [x4, #24]
40029b04: 710004bf cmp w5, #0x1
40029b08: 54000500 b.eq 40029ba8 <_RBTree_Insert_color+0x148> // b.none
40029b0c: f9400445 ldr x5, [x2, #8]
40029b10: aa0203e4 mov x4, x2
40029b14: eb0100bf cmp x5, x1
40029b18: 54000560 b.eq 40029bc4 <_RBTree_Insert_color+0x164> // b.none
40029b1c: f9400485 ldr x5, [x4, #8]
40029b20: b900185f str wzr, [x2, #24]
40029b24: f9000065 str x5, [x3]
40029b28: b9001866 str w6, [x3, #24]
40029b2c: b4000045 cbz x5, 40029b34 <_RBTree_Insert_color+0xd4>
40029b30: f90008a3 str x3, [x5, #16]
40029b34: f9400862 ldr x2, [x3, #16]
40029b38: f9000882 str x2, [x4, #16]
40029b3c: b4000682 cbz x2, 40029c0c <_RBTree_Insert_color+0x1ac>
40029b40: f9400045 ldr x5, [x2]
40029b44: eb05007f cmp x3, x5
40029b48: 54000660 b.eq 40029c14 <_RBTree_Insert_color+0x1b4> // b.none
40029b4c: f9000444 str x4, [x2, #8]
40029b50: f9000483 str x3, [x4, #8]
40029b54: f9000864 str x4, [x3, #16]
40029b58: 17ffffc3 b 40029a64 <_RBTree_Insert_color+0x4>
40029b5c: f9000004 str x4, [x0]
40029b60: 17ffffdf b 40029adc <_RBTree_Insert_color+0x7c>
40029b64: f9400424 ldr x4, [x1, #8]
40029b68: f9000044 str x4, [x2]
40029b6c: b40005c4 cbz x4, 40029c24 <_RBTree_Insert_color+0x1c4>
40029b70: f9000882 str x2, [x4, #16]
40029b74: f9400844 ldr x4, [x2, #16]
40029b78: f9000824 str x4, [x1, #16]
40029b7c: b4000504 cbz x4, 40029c1c <_RBTree_Insert_color+0x1bc> <== NEVER TAKEN
40029b80: f9400085 ldr x5, [x4]
40029b84: eb0200bf cmp x5, x2
40029b88: 54000580 b.eq 40029c38 <_RBTree_Insert_color+0x1d8> // b.none <== NEVER TAKEN
40029b8c: f9000481 str x1, [x4, #8]
40029b90: aa0103e4 mov x4, x1
40029b94: f9000422 str x2, [x1, #8]
40029b98: f9000841 str x1, [x2, #16]
40029b9c: aa0203e1 mov x1, x2
40029ba0: aa0403e2 mov x2, x4
40029ba4: 17ffffc0 b 40029aa4 <_RBTree_Insert_color+0x44>
40029ba8: b900189f str wzr, [x4, #24]
40029bac: aa0303e1 mov x1, x3
40029bb0: b900185f str wzr, [x2, #24]
40029bb4: b9001865 str w5, [x3, #24]
40029bb8: 17ffffab b 40029a64 <_RBTree_Insert_color+0x4>
40029bbc: f9000044 str x4, [x2]
40029bc0: 17ffffc7 b 40029adc <_RBTree_Insert_color+0x7c>
40029bc4: f9400024 ldr x4, [x1]
40029bc8: f9000444 str x4, [x2, #8]
40029bcc: b40003a4 cbz x4, 40029c40 <_RBTree_Insert_color+0x1e0>
40029bd0: f9000882 str x2, [x4, #16]
40029bd4: f9400844 ldr x4, [x2, #16]
40029bd8: f9000824 str x4, [x1, #16]
40029bdc: b40003a4 cbz x4, 40029c50 <_RBTree_Insert_color+0x1f0> <== NEVER TAKEN
40029be0: f9400085 ldr x5, [x4]
40029be4: eb0200bf cmp x5, x2
40029be8: 54000300 b.eq 40029c48 <_RBTree_Insert_color+0x1e8> // b.none <== ALWAYS TAKEN
40029bec: f9000481 str x1, [x4, #8] <== NOT EXECUTED
40029bf0: f9000022 str x2, [x1]
40029bf4: aa0103e5 mov x5, x1
40029bf8: f9400064 ldr x4, [x3]
40029bfc: f9000841 str x1, [x2, #16]
40029c00: aa0203e1 mov x1, x2
40029c04: aa0503e2 mov x2, x5
40029c08: 17ffffc5 b 40029b1c <_RBTree_Insert_color+0xbc>
40029c0c: f9000004 str x4, [x0]
40029c10: 17ffffd0 b 40029b50 <_RBTree_Insert_color+0xf0>
40029c14: f9000044 str x4, [x2]
40029c18: 17ffffce b 40029b50 <_RBTree_Insert_color+0xf0>
40029c1c: f9000001 str x1, [x0] <== NOT EXECUTED
40029c20: 17ffffdc b 40029b90 <_RBTree_Insert_color+0x130> <== NOT EXECUTED
40029c24: aa0303e4 mov x4, x3
40029c28: f9000823 str x3, [x1, #16]
40029c2c: f9400085 ldr x5, [x4]
40029c30: eb0200bf cmp x5, x2
40029c34: 54fffac1 b.ne 40029b8c <_RBTree_Insert_color+0x12c> // b.any <== ALWAYS TAKEN
40029c38: f9000081 str x1, [x4] <== NOT EXECUTED
40029c3c: 17ffffd5 b 40029b90 <_RBTree_Insert_color+0x130> <== NOT EXECUTED
40029c40: aa0303e4 mov x4, x3
40029c44: f9000823 str x3, [x1, #16]
40029c48: f9000081 str x1, [x4]
40029c4c: 17ffffe9 b 40029bf0 <_RBTree_Insert_color+0x190>
40029c50: f9000001 str x1, [x0] <== NOT EXECUTED
40029c54: 17ffffe7 b 40029bf0 <_RBTree_Insert_color+0x190> <== NOT EXECUTED
...
0000000040026430 <_RBTree_Postorder_first>:
return RB_ROOT( the_rbtree );
40026430: f9400000 ldr x0, [x0]
)
{
const RBTree_Node *the_node;
the_node = _RBTree_Root( the_rbtree );
if ( the_node == NULL ) {
40026434: b40000e0 cbz x0, 40026450 <_RBTree_Postorder_first+0x20>
return RB_LEFT( the_node, Node );
40026438: aa0003e2 mov x2, x0
4002643c: f9400000 ldr x0, [x0]
if ( _RBTree_Left( the_node ) != NULL ) {
40026440: b5ffffc0 cbnz x0, 40026438 <_RBTree_Postorder_first+0x8> <== NEVER TAKEN
return RB_RIGHT( the_node, Node );
40026444: f9400440 ldr x0, [x2, #8]
} else if ( _RBTree_Right( the_node ) != NULL ) {
40026448: b5ffff80 cbnz x0, 40026438 <_RBTree_Postorder_first+0x8> <== NEVER TAKEN
return (void *) ( (uintptr_t) the_node - offset );
4002644c: cb010040 sub x0, x2, x1
return NULL;
}
return _RBTree_Postorder_dive_left( the_node, offset );
}
40026450: d65f03c0 ret
...
0000000040025c20 <_RBTree_Predecessor>:
RB_GENERATE_PREV( RBTree_Control, RBTree_Node, Node, static )
40025c20: f9400001 ldr x1, [x0]
RBTree_Node *_RBTree_Predecessor( const RBTree_Node *node )
{
40025c24: aa0003e2 mov x2, x0
RB_GENERATE_PREV( RBTree_Control, RBTree_Node, Node, static )
40025c28: b40000c1 cbz x1, 40025c40 <_RBTree_Predecessor+0x20>
40025c2c: d503201f nop
40025c30: aa0103e0 mov x0, x1
40025c34: f9400421 ldr x1, [x1, #8]
40025c38: b5ffffc1 cbnz x1, 40025c30 <_RBTree_Predecessor+0x10>
return RB_PREV( RBTree_Control, NULL, RTEMS_DECONST( RBTree_Node *, node ) );
}
40025c3c: d65f03c0 ret
RB_GENERATE_PREV( RBTree_Control, RBTree_Node, Node, static )
40025c40: f9400800 ldr x0, [x0, #16]
40025c44: b4ffffc0 cbz x0, 40025c3c <_RBTree_Predecessor+0x1c>
40025c48: f9400401 ldr x1, [x0, #8]
40025c4c: eb01005f cmp x2, x1
40025c50: 54ffff60 b.eq 40025c3c <_RBTree_Predecessor+0x1c> // b.none
40025c54: f9400001 ldr x1, [x0]
40025c58: eb02003f cmp x1, x2
40025c5c: 54ffff01 b.ne 40025c3c <_RBTree_Predecessor+0x1c> // b.any <== NEVER TAKEN
40025c60: f9400801 ldr x1, [x0, #16]
40025c64: aa0003e2 mov x2, x0
40025c68: aa0103e0 mov x0, x1
40025c6c: b40000a1 cbz x1, 40025c80 <_RBTree_Predecessor+0x60> <== NEVER TAKEN
40025c70: f9400001 ldr x1, [x0]
40025c74: eb02003f cmp x1, x2
40025c78: 54ffff40 b.eq 40025c60 <_RBTree_Predecessor+0x40> // b.none <== NEVER TAKEN
}
40025c7c: d65f03c0 ret
40025c80: d2800000 mov x0, #0x0 // #0 <== NOT EXECUTED
40025c84: d65f03c0 ret <== NOT EXECUTED
...
0000000040025bb0 <_RBTree_Successor>:
RB_GENERATE_NEXT( RBTree_Control, RBTree_Node, Node, static )
40025bb0: f9400401 ldr x1, [x0, #8]
{
return RB_MAX( RBTree_Control, RTEMS_DECONST( RBTree_Control *, tree ) );
}
RBTree_Node *_RBTree_Successor( const RBTree_Node *node )
{
40025bb4: aa0003e2 mov x2, x0
RB_GENERATE_NEXT( RBTree_Control, RBTree_Node, Node, static )
40025bb8: b40000c1 cbz x1, 40025bd0 <_RBTree_Successor+0x20>
40025bbc: d503201f nop
40025bc0: aa0103e0 mov x0, x1
40025bc4: f9400021 ldr x1, [x1]
40025bc8: b5ffffc1 cbnz x1, 40025bc0 <_RBTree_Successor+0x10>
return RB_NEXT( RBTree_Control, NULL, RTEMS_DECONST( RBTree_Node *, node ) );
}
40025bcc: d65f03c0 ret
RB_GENERATE_NEXT( RBTree_Control, RBTree_Node, Node, static )
40025bd0: f9400800 ldr x0, [x0, #16]
40025bd4: b4ffffc0 cbz x0, 40025bcc <_RBTree_Successor+0x1c>
40025bd8: f9400001 ldr x1, [x0]
40025bdc: eb01005f cmp x2, x1
40025be0: 54ffff60 b.eq 40025bcc <_RBTree_Successor+0x1c> // b.none
40025be4: f9400401 ldr x1, [x0, #8]
40025be8: eb02003f cmp x1, x2
40025bec: 54ffff01 b.ne 40025bcc <_RBTree_Successor+0x1c> // b.any <== NEVER TAKEN
40025bf0: f9400801 ldr x1, [x0, #16]
40025bf4: aa0003e2 mov x2, x0
40025bf8: aa0103e0 mov x0, x1
40025bfc: b40000a1 cbz x1, 40025c10 <_RBTree_Successor+0x60>
40025c00: f9400401 ldr x1, [x0, #8]
40025c04: eb02003f cmp x1, x2
40025c08: 54ffff40 b.eq 40025bf0 <_RBTree_Successor+0x40> // b.none
}
40025c0c: d65f03c0 ret
40025c10: d2800000 mov x0, #0x0 // #0
40025c14: d65f03c0 ret
...
000000004002d720 <_SMP_barrier_Wait>:
SMP_barrier_Control *control,
SMP_barrier_State *state,
unsigned int count
)
{
unsigned int sense = ~state->sense;
4002d720: b9400024 ldr w4, [x1]
{
4002d724: aa0003e3 mov x3, x0
unsigned int sense = ~state->sense;
4002d728: 2a2403e4 mvn w4, w4
unsigned int previous_value;
bool performed_release;
state->sense = sense;
4002d72c: b9000024 str w4, [x1]
__asm__ volatile (
4002d730: d53b4221 mrs x1, daif
4002d734: d50342df msr daifset, #0x2
*obj = val + arg;
4002d738: b9400000 ldr w0, [x0]
4002d73c: 11000400 add w0, w0, #0x1
4002d740: b9000060 str w0, [x3]
__asm__ volatile (
4002d744: 92407c21 and x1, x1, #0xffffffff
4002d748: d51b4221 msr daif, x1
&control->value,
1U,
ATOMIC_ORDER_RELAXED
);
if ( previous_value + 1U == count ) {
4002d74c: 6b00005f cmp w2, w0
4002d750: 540000e0 b.eq 4002d76c <_SMP_barrier_Wait+0x4c> // b.none <== ALWAYS TAKEN
4002d754: d503201f nop
val = *obj;
4002d758: b9400461 ldr w1, [x3, #4] <== NOT EXECUTED
_Atomic_Store_uint( &control->value, 0U, ATOMIC_ORDER_RELAXED );
_Atomic_Store_uint( &control->sense, sense, ATOMIC_ORDER_RELEASE );
performed_release = true;
} else {
while (
4002d75c: 6b01009f cmp w4, w1 <== NOT EXECUTED
4002d760: 54ffffc1 b.ne 4002d758 <_SMP_barrier_Wait+0x38> // b.any <== NOT EXECUTED
_Atomic_Load_uint( &control->sense, ATOMIC_ORDER_ACQUIRE ) != sense
) {
/* Wait */
}
performed_release = false;
4002d764: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
}
return performed_release;
}
4002d768: d65f03c0 ret <== NOT EXECUTED
*obj = desired;
4002d76c: b900007f str wzr, [x3]
performed_release = true;
4002d770: 52800020 mov w0, #0x1 // #1
4002d774: b9000464 str w4, [x3, #4]
}
4002d778: d65f03c0 ret
4002d77c: 00000000 udf #0
0000000040025c30 <_Scheduler_CBS_Attach_thread>:
Scheduler_CBS_Server *server;
ISR_lock_Context lock_context;
Thread_Control *the_thread;
Scheduler_CBS_Node *node;
if ( server_id >= _Scheduler_CBS_Maximum_servers ) {
40025c30: f0000082 adrp x2, 40038000 <_Heap_Resize_block+0xf0>
40025c34: b9487042 ldr w2, [x2, #2160]
40025c38: 6b00005f cmp w2, w0
40025c3c: 54000689 b.ls 40025d0c <_Scheduler_CBS_Attach_thread+0xdc> // b.plast
{
40025c40: a9bc7bfd stp x29, x30, [sp, #-64]!
40025c44: 910003fd mov x29, sp
40025c48: a9025bf5 stp x21, x22, [sp, #32]
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
}
server = &_Scheduler_CBS_Server_list[ server_id ];
if ( !server->initialized ) {
40025c4c: 2a0003f5 mov w21, w0
40025c50: 2a0103f6 mov w22, w1
40025c54: d2800501 mov x1, #0x28 // #40
{
40025c58: a90153f3 stp x19, x20, [sp, #16]
server = &_Scheduler_CBS_Server_list[ server_id ];
40025c5c: b00006f4 adrp x20, 40102000 <_Rate_monotonic_Objects+0x120>
40025c60: 911fc294 add x20, x20, #0x7f0
if ( !server->initialized ) {
40025c64: 9b017eb5 mul x21, x21, x1
server = &_Scheduler_CBS_Server_list[ server_id ];
40025c68: 52800513 mov w19, #0x28 // #40
40025c6c: 9bb35013 umaddl x19, w0, w19, x20
if ( !server->initialized ) {
40025c70: 8b150280 add x0, x20, x21
40025c74: 39408000 ldrb w0, [x0, #32]
40025c78: 34000460 cbz w0, 40025d04 <_Scheduler_CBS_Attach_thread+0xd4>
return SCHEDULER_CBS_ERROR_NOSERVER;
}
if ( server->task_id != -1 ) {
40025c7c: b8756a80 ldr w0, [x20, x21]
40025c80: 3100041f cmn w0, #0x1
40025c84: 54000301 b.ne 40025ce4 <_Scheduler_CBS_Attach_thread+0xb4> // b.any
return SCHEDULER_CBS_ERROR_FULL;
}
the_thread = _Thread_Get( task_id, &lock_context );
40025c88: 9100e3e1 add x1, sp, #0x38
40025c8c: 2a1603e0 mov w0, w22
40025c90: 94000508 bl 400270b0 <_Thread_Get>
if ( the_thread == NULL ) {
40025c94: b4000340 cbz x0, 40025cfc <_Scheduler_CBS_Attach_thread+0xcc>
return the_thread->Scheduler.nodes;
40025c98: f9403401 ldr x1, [x0, #104]
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
}
node = _Scheduler_CBS_Thread_get_node( the_thread );
if ( node->cbs_server != NULL ) {
40025c9c: f9403c22 ldr x2, [x1, #120]
40025ca0: b5000262 cbnz x2, 40025cec <_Scheduler_CBS_Attach_thread+0xbc> <== NEVER TAKEN
_ISR_lock_ISR_enable( &lock_context );
return SCHEDULER_CBS_ERROR_FULL;
}
node->cbs_server = server;
40025ca4: f9003c33 str x19, [x1, #120]
server->task_id = task_id;
the_thread->budget_callout = _Scheduler_CBS_Budget_callout;
the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
40025ca8: 52800062 mov w2, #0x3 // #3
server->task_id = task_id;
40025cac: b8356a96 str w22, [x20, x21]
the_thread->is_preemptible = true;
40025cb0: 52800023 mov w3, #0x1 // #1
the_thread->budget_callout = _Scheduler_CBS_Budget_callout;
40025cb4: 90000001 adrp x1, 40025000 <_Rate_monotonic_Timeout+0x80>
40025cb8: 91348021 add x1, x1, #0xd20
the_thread->is_preemptible = true;
40025cbc: 3903a403 strb w3, [x0, #233]
the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
40025cc0: b900f002 str w2, [x0, #240]
the_thread->budget_callout = _Scheduler_CBS_Budget_callout;
40025cc4: f9007c01 str x1, [x0, #248]
_ISR_lock_ISR_enable( &lock_context );
40025cc8: b9403be0 ldr w0, [sp, #56]
40025ccc: d51b4220 msr daif, x0
return SCHEDULER_CBS_OK;
40025cd0: 52800000 mov w0, #0x0 // #0
}
40025cd4: a94153f3 ldp x19, x20, [sp, #16]
40025cd8: a9425bf5 ldp x21, x22, [sp, #32]
40025cdc: a8c47bfd ldp x29, x30, [sp], #64
40025ce0: d65f03c0 ret
return SCHEDULER_CBS_ERROR_FULL;
40025ce4: 12800320 mov w0, #0xffffffe6 // #-26
40025ce8: 17fffffb b 40025cd4 <_Scheduler_CBS_Attach_thread+0xa4>
_ISR_lock_ISR_enable( &lock_context );
40025cec: b9403be0 ldr w0, [sp, #56] <== NOT EXECUTED
40025cf0: d51b4220 msr daif, x0 <== NOT EXECUTED
return SCHEDULER_CBS_ERROR_FULL;
40025cf4: 12800320 mov w0, #0xffffffe6 // #-26 <== NOT EXECUTED
40025cf8: 17fffff7 b 40025cd4 <_Scheduler_CBS_Attach_thread+0xa4> <== NOT EXECUTED
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
40025cfc: 12800220 mov w0, #0xffffffee // #-18
40025d00: 17fffff5 b 40025cd4 <_Scheduler_CBS_Attach_thread+0xa4>
return SCHEDULER_CBS_ERROR_NOSERVER;
40025d04: 12800300 mov w0, #0xffffffe7 // #-25
40025d08: 17fffff3 b 40025cd4 <_Scheduler_CBS_Attach_thread+0xa4>
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
40025d0c: 12800220 mov w0, #0xffffffee // #-18
}
40025d10: d65f03c0 ret
...
0000000040025d20 <_Scheduler_CBS_Budget_callout>:
#include <rtems/score/schedulercbsimpl.h>
void _Scheduler_CBS_Budget_callout(
Thread_Control *the_thread
)
{
40025d20: a9b97bfd stp x29, x30, [sp, #-112]!
40025d24: aa0003e1 mov x1, x0
node = _Scheduler_CBS_Thread_get_node( the_thread );
/* Put violating task to background until the end of period. */
_Thread_queue_Context_clear_priority_updates( &queue_context );
_Scheduler_CBS_Cancel_job(
40025d28: d2800000 mov x0, #0x0 // #0
{
40025d2c: 910003fd mov x29, sp
40025d30: f9000bf3 str x19, [sp, #16]
_Scheduler_CBS_Cancel_job(
40025d34: 9100c3e3 add x3, sp, #0x30
40025d38: f9403433 ldr x19, [x1, #104]
queue_context->Priority.update_count = 0;
40025d3c: f9002bff str xzr, [sp, #80]
40025d40: f9404262 ldr x2, [x19, #128]
40025d44: 94000163 bl 400262d0 <_Scheduler_CBS_Cancel_job>
NULL,
the_thread,
node->deadline_node,
&queue_context
);
_Thread_Priority_update( &queue_context );
40025d48: 9100c3e0 add x0, sp, #0x30
40025d4c: 94000419 bl 40026db0 <_Thread_Priority_update>
/* Invoke callback function if any. */
if ( node->cbs_server->cbs_budget_overrun ) {
40025d50: f9403e60 ldr x0, [x19, #120]
40025d54: f9400c01 ldr x1, [x0, #24]
40025d58: b4000101 cbz x1, 40025d78 <_Scheduler_CBS_Budget_callout+0x58> <== NEVER TAKEN
_Scheduler_CBS_Get_server_id(
40025d5c: b9400000 ldr w0, [x0]
40025d60: 9100b3e1 add x1, sp, #0x2c
40025d64: 94000133 bl 40026230 <_Scheduler_CBS_Get_server_id>
node->cbs_server->task_id,
&server_id
);
node->cbs_server->cbs_budget_overrun( server_id );
40025d68: f9403e61 ldr x1, [x19, #120]
40025d6c: b9402fe0 ldr w0, [sp, #44]
40025d70: f9400c21 ldr x1, [x1, #24]
40025d74: d63f0020 blr x1
}
}
40025d78: f9400bf3 ldr x19, [sp, #16]
40025d7c: a8c77bfd ldp x29, x30, [sp], #112
40025d80: d65f03c0 ret
...
0000000040025da0 <_Scheduler_CBS_Cleanup>:
#include <rtems/score/schedulercbs.h>
#include <rtems/score/wkspace.h>
int _Scheduler_CBS_Cleanup (void)
{
40025da0: a9bd7bfd stp x29, x30, [sp, #-48]!
40025da4: 910003fd mov x29, sp
40025da8: f90013f5 str x21, [sp, #32]
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40025dac: f0000080 adrp x0, 40038000 <_Heap_Resize_block+0xf0>
40025db0: b9487015 ldr w21, [x0, #2160]
40025db4: 34000255 cbz w21, 40025dfc <_Scheduler_CBS_Cleanup+0x5c> <== NEVER TAKEN
40025db8: a90153f3 stp x19, x20, [sp, #16]
40025dbc: b00006f4 adrp x20, 40102000 <_Rate_monotonic_Objects+0x120>
40025dc0: 911fc294 add x20, x20, #0x7f0
40025dc4: 52800013 mov w19, #0x0 // #0
40025dc8: 14000004 b 40025dd8 <_Scheduler_CBS_Cleanup+0x38>
40025dcc: 11000673 add w19, w19, #0x1
40025dd0: 6b15027f cmp w19, w21
40025dd4: 54000120 b.eq 40025df8 <_Scheduler_CBS_Cleanup+0x58> // b.none
if ( _Scheduler_CBS_Server_list[ i ].initialized )
40025dd8: 39408280 ldrb w0, [x20, #32]
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40025ddc: 9100a294 add x20, x20, #0x28
if ( _Scheduler_CBS_Server_list[ i ].initialized )
40025de0: 34ffff60 cbz w0, 40025dcc <_Scheduler_CBS_Cleanup+0x2c>
_Scheduler_CBS_Destroy_server( i );
40025de4: 2a1303e0 mov w0, w19
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40025de8: 11000673 add w19, w19, #0x1
_Scheduler_CBS_Destroy_server( i );
40025dec: 94000035 bl 40025ec0 <_Scheduler_CBS_Destroy_server>
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40025df0: 6b15027f cmp w19, w21
40025df4: 54ffff21 b.ne 40025dd8 <_Scheduler_CBS_Cleanup+0x38> // b.any <== ALWAYS TAKEN
40025df8: a94153f3 ldp x19, x20, [sp, #16]
}
return SCHEDULER_CBS_OK;
}
40025dfc: 52800000 mov w0, #0x0 // #0
40025e00: f94013f5 ldr x21, [sp, #32]
40025e04: a8c37bfd ldp x29, x30, [sp], #48
40025e08: d65f03c0 ret
40025e0c: 00000000 udf #0
0000000040025e10 <_Scheduler_CBS_Create_server>:
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
40025e10: aa0003e7 mov x7, x0
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
40025e14: f9400400 ldr x0, [x0, #8]
40025e18: f100001f cmp x0, #0x0
40025e1c: 5400048d b.le 40025eac <_Scheduler_CBS_Create_server+0x9c>
40025e20: f94000e0 ldr x0, [x7]
40025e24: f100001f cmp x0, #0x0
40025e28: 5400042d b.le 40025eac <_Scheduler_CBS_Create_server+0x9c>
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40025e2c: f0000080 adrp x0, 40038000 <_Heap_Resize_block+0xf0>
40025e30: b9487006 ldr w6, [x0, #2160]
40025e34: 34000386 cbz w6, 40025ea4 <_Scheduler_CBS_Create_server+0x94> <== NEVER TAKEN
40025e38: b00006e8 adrp x8, 40102000 <_Rate_monotonic_Objects+0x120>
40025e3c: 911fc108 add x8, x8, #0x7f0
40025e40: aa0803e4 mov x4, x8
40025e44: 52800003 mov w3, #0x0 // #0
40025e48: 14000004 b 40025e58 <_Scheduler_CBS_Create_server+0x48>
40025e4c: 11000463 add w3, w3, #0x1
40025e50: 6b0300df cmp w6, w3
40025e54: 54000280 b.eq 40025ea4 <_Scheduler_CBS_Create_server+0x94> // b.none
if ( !_Scheduler_CBS_Server_list[i].initialized )
40025e58: 39408085 ldrb w5, [x4, #32]
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40025e5c: 9100a084 add x4, x4, #0x28
if ( !_Scheduler_CBS_Server_list[i].initialized )
40025e60: 35ffff65 cbnz w5, 40025e4c <_Scheduler_CBS_Create_server+0x3c>
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
the_server = &_Scheduler_CBS_Server_list[*server_id];
the_server->parameters = *params;
40025e64: 2a0303e0 mov w0, w3
40025e68: d2800504 mov x4, #0x28 // #40
40025e6c: f94000e6 ldr x6, [x7]
*server_id = i;
40025e70: b9000043 str w3, [x2]
the_server->parameters = *params;
40025e74: 9b047c03 mul x3, x0, x4
the_server->task_id = -1;
40025e78: 12800005 mov w5, #0xffffffff // #-1
the_server->cbs_budget_overrun = budget_overrun_callback;
the_server->initialized = true;
40025e7c: 52800024 mov w4, #0x1 // #1
return SCHEDULER_CBS_OK;
40025e80: 52800000 mov w0, #0x0 // #0
the_server->parameters = *params;
40025e84: 8b030102 add x2, x8, x3
40025e88: f9000446 str x6, [x2, #8]
40025e8c: f94004e6 ldr x6, [x7, #8]
40025e90: f9000846 str x6, [x2, #16]
the_server->task_id = -1;
40025e94: b8236905 str w5, [x8, x3]
the_server->cbs_budget_overrun = budget_overrun_callback;
40025e98: f9000c41 str x1, [x2, #24]
the_server->initialized = true;
40025e9c: 39008044 strb w4, [x2, #32]
}
40025ea0: d65f03c0 ret
return SCHEDULER_CBS_ERROR_FULL;
40025ea4: 12800320 mov w0, #0xffffffe6 // #-26
}
40025ea8: d65f03c0 ret
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
40025eac: 12800220 mov w0, #0xffffffee // #-18
}
40025eb0: d65f03c0 ret
...
0000000040026230 <_Scheduler_CBS_Get_server_id>:
rtems_id task_id,
Scheduler_CBS_Server_id *server_id
)
{
unsigned int i;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
40026230: d0000082 adrp x2, 40038000 <_Heap_Resize_block+0xf0>
40026234: b9487045 ldr w5, [x2, #2160]
40026238: 340001a5 cbz w5, 4002626c <_Scheduler_CBS_Get_server_id+0x3c> <== NEVER TAKEN
4002623c: 900006e2 adrp x2, 40102000 <_Rate_monotonic_Objects+0x120>
40026240: 911fc042 add x2, x2, #0x7f0
40026244: 52800003 mov w3, #0x0 // #0
if ( _Scheduler_CBS_Server_list[i].initialized &&
40026248: 39408044 ldrb w4, [x2, #32]
4002624c: 34000084 cbz w4, 4002625c <_Scheduler_CBS_Get_server_id+0x2c>
40026250: b9400044 ldr w4, [x2]
40026254: 6b00009f cmp w4, w0
40026258: 540000e0 b.eq 40026274 <_Scheduler_CBS_Get_server_id+0x44> // b.none
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
4002625c: 11000463 add w3, w3, #0x1
40026260: 9100a042 add x2, x2, #0x28
40026264: 6b05007f cmp w3, w5
40026268: 54ffff01 b.ne 40026248 <_Scheduler_CBS_Get_server_id+0x18> // b.any
_Scheduler_CBS_Server_list[i].task_id == task_id ) {
*server_id = i;
return SCHEDULER_CBS_OK;
}
}
return SCHEDULER_CBS_ERROR_NOSERVER;
4002626c: 12800300 mov w0, #0xffffffe7 // #-25
}
40026270: d65f03c0 ret
return SCHEDULER_CBS_OK;
40026274: 52800000 mov w0, #0x0 // #0
*server_id = i;
40026278: b9000023 str w3, [x1]
}
4002627c: d65f03c0 ret
00000000400255b0 <_Scheduler_CBS_Unblock>:
void _Scheduler_CBS_Unblock(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
400255b0: a9b97bfd stp x29, x30, [sp, #-112]!
400255b4: 910003fd mov x29, sp
400255b8: a90153f3 stp x19, x20, [sp, #16]
400255bc: aa0203f3 mov x19, x2
400255c0: aa0103f4 mov x20, x1
Priority_Control priority;
the_node = _Scheduler_CBS_Node_downcast( node );
serv_info = the_node->cbs_server;
priority = _Scheduler_Node_get_priority( &the_node->Base.Base );
priority = SCHEDULER_PRIORITY_PURIFY( priority );
400255c4: f9402443 ldr x3, [x2, #72]
serv_info = the_node->cbs_server;
400255c8: f9403c42 ldr x2, [x2, #120]
{
400255cc: f90013f5 str x21, [sp, #32]
priority = SCHEDULER_PRIORITY_PURIFY( priority );
400255d0: 927ff863 and x3, x3, #0xfffffffffffffffe
{
400255d4: aa0003f5 mov x21, x0
* Late unblock rule for deadline-driven tasks. The remaining time to
* deadline must be sufficient to serve the remaining computation time
* without increased utilization of this task. It might cause a deadline
* miss of another task.
*/
if ( serv_info != NULL && ( priority & SCHEDULER_EDF_PRIO_MSB ) == 0 ) {
400255d8: f100005f cmp x2, #0x0
400255dc: fa401861 ccmp x3, #0x0, #0x1, ne // ne = any
400255e0: 5400014b b.lt 40025608 <_Scheduler_CBS_Unblock+0x58> // b.tstop
time_t deadline = serv_info->parameters.deadline;
time_t budget = serv_info->parameters.budget;
uint32_t deadline_left = the_thread->cpu_time_budget;
Priority_Control budget_left = priority - _Watchdog_Ticks_since_boot;
400255e4: d00006e4 adrp x4, 40103000 <config+0x8>
400255e8: b9410886 ldr w6, [x4, #264]
if ( deadline * budget_left > budget * deadline_left ) {
400255ec: a9408845 ldp x5, x2, [x2, #8]
400255f0: b940ec24 ldr w4, [x1, #236]
Priority_Control budget_left = priority - _Watchdog_Ticks_since_boot;
400255f4: cb264063 sub x3, x3, w6, uxtw
if ( deadline * budget_left > budget * deadline_left ) {
400255f8: 9b027c82 mul x2, x4, x2
400255fc: 9b057c63 mul x3, x3, x5
40025600: eb02007f cmp x3, x2
40025604: 54000108 b.hi 40025624 <_Scheduler_CBS_Unblock+0x74> // b.pmore <== ALWAYS TAKEN
&queue_context
);
}
}
_Scheduler_EDF_Unblock( scheduler, the_thread, &the_node->Base.Base );
40025608: aa1303e2 mov x2, x19
4002560c: aa1403e1 mov x1, x20
40025610: aa1503e0 mov x0, x21
}
40025614: a94153f3 ldp x19, x20, [sp, #16]
40025618: f94013f5 ldr x21, [sp, #32]
4002561c: a8c77bfd ldp x29, x30, [sp], #112
_Scheduler_EDF_Unblock( scheduler, the_thread, &the_node->Base.Base );
40025620: 14000104 b 40025a30 <_Scheduler_EDF_Unblock>
_Scheduler_CBS_Cancel_job(
40025624: f9404262 ldr x2, [x19, #128]
40025628: 9100c3e3 add x3, sp, #0x30
*/
RTEMS_INLINE_ROUTINE void _Thread_queue_Context_clear_priority_updates(
Thread_queue_Context *queue_context
)
{
queue_context->Priority.update_count = 0;
4002562c: f9002bff str xzr, [sp, #80]
40025630: 97ffffd8 bl 40025590 <_Scheduler_CBS_Cancel_job>
_Scheduler_EDF_Unblock( scheduler, the_thread, &the_node->Base.Base );
40025634: aa1303e2 mov x2, x19
40025638: aa1403e1 mov x1, x20
4002563c: aa1503e0 mov x0, x21
}
40025640: a94153f3 ldp x19, x20, [sp, #16]
40025644: f94013f5 ldr x21, [sp, #32]
40025648: a8c77bfd ldp x29, x30, [sp], #112
_Scheduler_EDF_Unblock( scheduler, the_thread, &the_node->Base.Base );
4002564c: 140000f9 b 40025a30 <_Scheduler_EDF_Unblock>
0000000040025710 <_Scheduler_EDF_Block>:
void _Scheduler_EDF_Block(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40025710: a9bd7bfd stp x29, x30, [sp, #-48]!
40025714: 910003fd mov x29, sp
40025718: a9025bf5 stp x21, x22, [sp, #32]
4002571c: aa0003f5 mov x21, x0
RTEMS_INLINE_ROUTINE void _Scheduler_EDF_Extract(
Scheduler_EDF_Context *context,
Scheduler_EDF_Node *node
)
{
_RBTree_Extract( &context->Ready, &node->Node );
40025720: f9400000 ldr x0, [x0]
40025724: a90153f3 stp x19, x20, [sp, #16]
40025728: d00006f3 adrp x19, 40103000 <config+0x8>
4002572c: 91020273 add x19, x19, #0x80
40025730: aa0103f4 mov x20, x1
40025734: 91014041 add x1, x2, #0x50
40025738: 9400100a bl 40029760 <_RBTree_Extract>
{
( *extract )( scheduler, the_thread, node );
/* TODO: flash critical section? */
if ( _Thread_Is_executing( the_thread ) || _Thread_Is_heir( the_thread ) ) {
4002573c: f9401260 ldr x0, [x19, #32]
40025740: eb00029f cmp x20, x0
40025744: 54000100 b.eq 40025764 <_Scheduler_EDF_Block+0x54> // b.none
40025748: f9401660 ldr x0, [x19, #40]
4002574c: eb00029f cmp x20, x0
40025750: 540000a0 b.eq 40025764 <_Scheduler_EDF_Block+0x54> // b.none <== NEVER TAKEN
the_thread,
node,
_Scheduler_EDF_Extract_body,
_Scheduler_EDF_Schedule_body
);
}
40025754: a94153f3 ldp x19, x20, [sp, #16]
40025758: a9425bf5 ldp x21, x22, [sp, #32]
4002575c: a8c37bfd ldp x29, x30, [sp], #48
40025760: d65f03c0 ret
Scheduler_EDF_Node *node;
(void) the_thread;
context = _Scheduler_EDF_Get_context( scheduler );
first = _RBTree_Minimum( &context->Ready );
40025764: f94002a0 ldr x0, [x21]
40025768: 94001192 bl 40029db0 <_RBTree_Minimum>
node = RTEMS_CONTAINER_OF( first, Scheduler_EDF_Node, Node );
_Scheduler_Update_heir( node->Base.owner, force_dispatch );
4002576c: f85b0015 ldur x21, [x0, #-80]
RTEMS_INLINE_ROUTINE void _Scheduler_Update_heir(
Thread_Control *new_heir,
bool force_dispatch
)
{
Thread_Control *heir = _Thread_Heir;
40025770: f9401674 ldr x20, [x19, #40]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40025774: eb1402bf cmp x21, x20
40025778: 54fffee0 b.eq 40025754 <_Scheduler_EDF_Block+0x44> // b.none <== NEVER TAKEN
last = cpu->cpu_usage_timestamp;
4002577c: f9401a76 ldr x22, [x19, #48]
*time = _Timecounter_Sbinuptime();
40025780: 97fffe50 bl 400250c0 <_Timecounter_Sbinuptime>
40025784: f9001a60 str x0, [x19, #48]
heir->Scheduler.state = THREAD_SCHEDULER_BLOCKED;
new_heir->Scheduler.state = THREAD_SCHEDULER_SCHEDULED;
#endif
_Thread_Update_CPU_time_used( heir, _Thread_Get_CPU( heir ) );
_Thread_Heir = new_heir;
_Thread_Dispatch_necessary = true;
40025788: 52800022 mov w2, #0x1 // #1
const Timestamp_Control *_start,
const Timestamp_Control *_end,
Timestamp_Control *_result
)
{
*_result = *_end - *_start;
4002578c: cb160000 sub x0, x0, x22
*_time += *_add;
40025790: f9408281 ldr x1, [x20, #256]
40025794: 8b000020 add x0, x1, x0
40025798: f9008280 str x0, [x20, #256]
4002579c: 39007262 strb w2, [x19, #28]
_Thread_Heir = new_heir;
400257a0: f9001675 str x21, [x19, #40]
400257a4: a94153f3 ldp x19, x20, [sp, #16]
400257a8: a9425bf5 ldp x21, x22, [sp, #32]
400257ac: a8c37bfd ldp x29, x30, [sp], #48
400257b0: d65f03c0 ret
...
00000000400259b0 <_Scheduler_EDF_Schedule>:
void _Scheduler_EDF_Schedule(
const Scheduler_Control *scheduler,
Thread_Control *the_thread
)
{
400259b0: a9bd7bfd stp x29, x30, [sp, #-48]!
400259b4: 910003fd mov x29, sp
first = _RBTree_Minimum( &context->Ready );
400259b8: f9400000 ldr x0, [x0]
400259bc: a90153f3 stp x19, x20, [sp, #16]
Thread_Control *heir = _Thread_Heir;
400259c0: d00006f3 adrp x19, 40103000 <config+0x8>
400259c4: 91020273 add x19, x19, #0x80
400259c8: a9025bf5 stp x21, x22, [sp, #32]
400259cc: 940010f9 bl 40029db0 <_RBTree_Minimum>
_Scheduler_Update_heir( node->Base.owner, force_dispatch );
400259d0: f85b0015 ldur x21, [x0, #-80]
400259d4: f9401674 ldr x20, [x19, #40]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
400259d8: eb1402bf cmp x21, x20
400259dc: 54000060 b.eq 400259e8 <_Scheduler_EDF_Schedule+0x38> // b.none <== ALWAYS TAKEN
400259e0: 3943a680 ldrb w0, [x20, #233] <== NOT EXECUTED
400259e4: 350000a0 cbnz w0, 400259f8 <_Scheduler_EDF_Schedule+0x48> <== NOT EXECUTED
_Scheduler_EDF_Schedule_body( scheduler, the_thread, false );
}
400259e8: a94153f3 ldp x19, x20, [sp, #16]
400259ec: a9425bf5 ldp x21, x22, [sp, #32]
400259f0: a8c37bfd ldp x29, x30, [sp], #48
400259f4: d65f03c0 ret
400259f8: f9401a76 ldr x22, [x19, #48] <== NOT EXECUTED
400259fc: 97fffdb1 bl 400250c0 <_Timecounter_Sbinuptime> <== NOT EXECUTED
40025a00: f9001a60 str x0, [x19, #48] <== NOT EXECUTED
_Thread_Dispatch_necessary = true;
40025a04: 52800022 mov w2, #0x1 // #1 <== NOT EXECUTED
*_result = *_end - *_start;
40025a08: cb160000 sub x0, x0, x22 <== NOT EXECUTED
*_time += *_add;
40025a0c: f9408281 ldr x1, [x20, #256] <== NOT EXECUTED
40025a10: 8b000020 add x0, x1, x0 <== NOT EXECUTED
40025a14: f9008280 str x0, [x20, #256] <== NOT EXECUTED
40025a18: 39007262 strb w2, [x19, #28] <== NOT EXECUTED
_Thread_Heir = new_heir;
40025a1c: f9001675 str x21, [x19, #40] <== NOT EXECUTED
40025a20: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
40025a24: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
40025a28: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
40025a2c: d65f03c0 ret <== NOT EXECUTED
0000000040025a30 <_Scheduler_EDF_Unblock>:
void _Scheduler_EDF_Unblock(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40025a30: a9bc7bfd stp x29, x30, [sp, #-64]!
40025a34: 910003fd mov x29, sp
return scheduler->context;
40025a38: f9400000 ldr x0, [x0]
40025a3c: a90153f3 stp x19, x20, [sp, #16]
40025a40: aa0103f3 mov x19, x1
Priority_Control insert_priority;
context = _Scheduler_EDF_Get_context( scheduler );
the_node = _Scheduler_EDF_Node_downcast( node );
priority = _Scheduler_Node_get_priority( &the_node->Base );
priority = SCHEDULER_PRIORITY_PURIFY( priority );
40025a44: f9402446 ldr x6, [x2, #72]
{
40025a48: a9025bf5 stp x21, x22, [sp, #32]
_RBTree_Insert_inline(
40025a4c: 91014041 add x1, x2, #0x50
while ( *link != NULL ) {
40025a50: f9400004 ldr x4, [x0]
priority = SCHEDULER_PRIORITY_PURIFY( priority );
40025a54: 927ff8d5 and x21, x6, #0xfffffffffffffffe
{
40025a58: f9001bf7 str x23, [sp, #48]
40025a5c: b24000c6 orr x6, x6, #0x1
insert_priority = SCHEDULER_PRIORITY_APPEND( priority );
the_node->priority = priority;
40025a60: f9003855 str x21, [x2, #112]
40025a64: b5000064 cbnz x4, 40025a70 <_Scheduler_EDF_Unblock+0x40>
40025a68: 1400002c b 40025b18 <_Scheduler_EDF_Unblock+0xe8>
40025a6c: aa0503e4 mov x4, x5
if ( ( *less )( key, parent ) ) {
40025a70: f9401085 ldr x5, [x4, #32]
return &RB_LEFT( the_node, Node );
40025a74: 91002083 add x3, x4, #0x8
40025a78: eb0500df cmp x6, x5
40025a7c: 9a848063 csel x3, x3, x4, hi // hi = pmore
while ( *link != NULL ) {
40025a80: f9400065 ldr x5, [x3]
40025a84: b5ffff45 cbnz x5, 40025a6c <_Scheduler_EDF_Unblock+0x3c>
RB_SET( child, parent, Node );
40025a88: a900903f stp xzr, x4, [x1, #8]
40025a8c: 52800036 mov w22, #0x1 // #1
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( priority < _Thread_Get_priority( _Thread_Heir ) ) {
40025a90: d00006f4 adrp x20, 40103000 <config+0x8>
40025a94: 91020294 add x20, x20, #0x80
40025a98: f900285f str xzr, [x2, #80]
40025a9c: b9001836 str w22, [x1, #24]
*link = child;
40025aa0: f9000061 str x1, [x3]
_RBTree_Insert_color( the_rbtree, the_node );
40025aa4: 94001043 bl 40029bb0 <_RBTree_Insert_color>
40025aa8: f9401697 ldr x23, [x20, #40]
*/
RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_priority(
const Priority_Aggregation *aggregation
)
{
return aggregation->Node.priority;
40025aac: f94036e0 ldr x0, [x23, #104]
40025ab0: f9401400 ldr x0, [x0, #40]
40025ab4: eb15001f cmp x0, x21
40025ab8: 540000c8 b.hi 40025ad0 <_Scheduler_EDF_Unblock+0xa0> // b.pmore
_Scheduler_Update_heir(
the_thread,
priority == ( SCHEDULER_EDF_PRIO_MSB | PRIORITY_PSEUDO_ISR )
);
}
}
40025abc: a94153f3 ldp x19, x20, [sp, #16]
40025ac0: a9425bf5 ldp x21, x22, [sp, #32]
40025ac4: f9401bf7 ldr x23, [sp, #48]
40025ac8: a8c47bfd ldp x29, x30, [sp], #64
40025acc: d65f03c0 ret
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40025ad0: eb1302ff cmp x23, x19
40025ad4: 54ffff40 b.eq 40025abc <_Scheduler_EDF_Unblock+0x8c> // b.none <== NEVER TAKEN
_Scheduler_Update_heir(
40025ad8: d2f00001 mov x1, #0x8000000000000000 // #-9223372036854775808
40025adc: 3943a6e0 ldrb w0, [x23, #233]
40025ae0: eb0102bf cmp x21, x1
40025ae4: 1a9f17e1 cset w1, eq // eq = none
40025ae8: 2a010000 orr w0, w0, w1
40025aec: 34fffe80 cbz w0, 40025abc <_Scheduler_EDF_Unblock+0x8c>
40025af0: f9401a95 ldr x21, [x20, #48]
40025af4: 97fffd73 bl 400250c0 <_Timecounter_Sbinuptime>
40025af8: f9001a80 str x0, [x20, #48]
*_result = *_end - *_start;
40025afc: cb150000 sub x0, x0, x21
*_time += *_add;
40025b00: f94082e1 ldr x1, [x23, #256]
40025b04: 8b000020 add x0, x1, x0
40025b08: f90082e0 str x0, [x23, #256]
_Thread_Dispatch_necessary = true;
40025b0c: 39007296 strb w22, [x20, #28]
_Thread_Heir = new_heir;
40025b10: f9001693 str x19, [x20, #40]
}
40025b14: 17ffffea b 40025abc <_Scheduler_EDF_Unblock+0x8c>
link = _RBTree_Root_reference( the_rbtree );
40025b18: aa0003e3 mov x3, x0
40025b1c: 17ffffdb b 40025a88 <_Scheduler_EDF_Unblock+0x58>
0000000040025910 <_Scheduler_EDF_Unmap_priority>:
const Scheduler_Control *scheduler,
Priority_Control priority
)
{
return SCHEDULER_PRIORITY_UNMAP( priority & ~SCHEDULER_EDF_PRIO_MSB );
}
40025910: d341f820 ubfx x0, x1, #1, #62 <== NOT EXECUTED
40025914: d65f03c0 ret <== NOT EXECUTED
...
00000000400257d0 <_Scheduler_EDF_Update_priority>:
void _Scheduler_EDF_Update_priority(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
400257d0: a9bc7bfd stp x29, x30, [sp, #-64]!
400257d4: 910003fd mov x29, sp
400257d8: a9025bf5 stp x21, x22, [sp, #32]
400257dc: aa0003f5 mov x21, x0
Scheduler_EDF_Context *context;
Scheduler_EDF_Node *the_node;
Priority_Control priority;
Priority_Control insert_priority;
if ( !_Thread_Is_ready( the_thread ) ) {
400257e0: b9403820 ldr w0, [x1, #56]
400257e4: 350005a0 cbnz w0, 40025898 <_Scheduler_EDF_Update_priority+0xc8>
400257e8: a90153f3 stp x19, x20, [sp, #16]
400257ec: aa0203f3 mov x19, x2
do {
seq = _SMP_sequence_lock_Read_begin( &node->Priority.Lock );
#endif
priority = node->Priority.value;
400257f0: f9402454 ldr x20, [x2, #72]
the_node = _Scheduler_EDF_Node_downcast( node );
insert_priority = _Scheduler_Node_get_priority( &the_node->Base );
priority = SCHEDULER_PRIORITY_PURIFY( insert_priority );
if ( priority == the_node->priority ) {
400257f4: f9403841 ldr x1, [x2, #112]
priority = SCHEDULER_PRIORITY_PURIFY( insert_priority );
400257f8: 927ffa80 and x0, x20, #0xfffffffffffffffe
if ( priority == the_node->priority ) {
400257fc: eb00003f cmp x1, x0
40025800: 54000520 b.eq 400258a4 <_Scheduler_EDF_Update_priority+0xd4> // b.none<== NEVER TAKEN
/* Nothing to do */
return;
}
the_node->priority = priority;
40025804: a90363f7 stp x23, x24, [sp, #48]
_RBTree_Extract( &context->Ready, &node->Node );
40025808: 91014056 add x22, x2, #0x50
4002580c: aa1603e1 mov x1, x22
return scheduler->context;
40025810: f94002b7 ldr x23, [x21]
40025814: f9003840 str x0, [x2, #112]
40025818: aa1703e0 mov x0, x23
4002581c: 94000fd1 bl 40029760 <_RBTree_Extract>
link = _RBTree_Root_reference( the_rbtree );
parent = NULL;
is_new_minimum = true;
while ( *link != NULL ) {
40025820: f94002e4 ldr x4, [x23]
40025824: b5000064 cbnz x4, 40025830 <_Scheduler_EDF_Update_priority+0x60> <== ALWAYS TAKEN
40025828: 1400002f b 400258e4 <_Scheduler_EDF_Update_priority+0x114> <== NOT EXECUTED
4002582c: aa0503e4 mov x4, x5
parent = *link;
if ( ( *less )( key, parent ) ) {
40025830: f9401085 ldr x5, [x4, #32]
return &RB_LEFT( the_node, Node );
40025834: 91002083 add x3, x4, #0x8
40025838: eb05029f cmp x20, x5
4002583c: 9a848063 csel x3, x3, x4, hi // hi = pmore
while ( *link != NULL ) {
40025840: f9400065 ldr x5, [x3]
40025844: b5ffff45 cbnz x5, 4002582c <_Scheduler_EDF_Update_priority+0x5c>
RB_SET( child, parent, Node );
40025848: a90092df stp xzr, x4, [x22, #8]
4002584c: 52800038 mov w24, #0x1 // #1
is_new_minimum = false;
}
}
_RBTree_Add_child( the_node, parent, link );
_RBTree_Insert_color( the_rbtree, the_node );
40025850: aa1703e0 mov x0, x23
RB_SET( child, parent, Node );
40025854: f9002a7f str xzr, [x19, #80]
_RBTree_Insert_color( the_rbtree, the_node );
40025858: aa1603e1 mov x1, x22
RB_SET( child, parent, Node );
4002585c: b9001ad8 str w24, [x22, #24]
Thread_Control *heir = _Thread_Heir;
40025860: d00006f3 adrp x19, 40103000 <config+0x8>
40025864: 91020273 add x19, x19, #0x80
*link = child;
40025868: f9000076 str x22, [x3]
_RBTree_Insert_color( the_rbtree, the_node );
4002586c: 940010d1 bl 40029bb0 <_RBTree_Insert_color>
first = _RBTree_Minimum( &context->Ready );
40025870: f94002a0 ldr x0, [x21]
40025874: 9400114f bl 40029db0 <_RBTree_Minimum>
_Scheduler_Update_heir( node->Base.owner, force_dispatch );
40025878: f85b0015 ldur x21, [x0, #-80]
4002587c: f9401674 ldr x20, [x19, #40]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40025880: eb1402bf cmp x21, x20
40025884: 54000060 b.eq 40025890 <_Scheduler_EDF_Update_priority+0xc0> // b.none
40025888: 3943a680 ldrb w0, [x20, #233]
4002588c: 35000140 cbnz w0, 400258b4 <_Scheduler_EDF_Update_priority+0xe4> <== ALWAYS TAKEN
40025890: a94153f3 ldp x19, x20, [sp, #16]
40025894: a94363f7 ldp x23, x24, [sp, #48]
context = _Scheduler_EDF_Get_context( scheduler );
_Scheduler_EDF_Extract( context, the_node );
_Scheduler_EDF_Enqueue( context, the_node, insert_priority );
_Scheduler_EDF_Schedule_body( scheduler, the_thread, false );
}
40025898: a9425bf5 ldp x21, x22, [sp, #32]
4002589c: a8c47bfd ldp x29, x30, [sp], #64
400258a0: d65f03c0 ret
400258a4: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
400258a8: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
400258ac: a8c47bfd ldp x29, x30, [sp], #64 <== NOT EXECUTED
400258b0: d65f03c0 ret <== NOT EXECUTED
400258b4: f9401a76 ldr x22, [x19, #48]
400258b8: 97fffe02 bl 400250c0 <_Timecounter_Sbinuptime>
400258bc: f9001a60 str x0, [x19, #48]
*_result = *_end - *_start;
400258c0: cb160000 sub x0, x0, x22
*_time += *_add;
400258c4: f9408281 ldr x1, [x20, #256]
400258c8: 8b000020 add x0, x1, x0
400258cc: f9008280 str x0, [x20, #256]
_Thread_Dispatch_necessary = true;
400258d0: 39007278 strb w24, [x19, #28]
_Thread_Heir = new_heir;
400258d4: a94363f7 ldp x23, x24, [sp, #48]
400258d8: f9001675 str x21, [x19, #40]
400258dc: a94153f3 ldp x19, x20, [sp, #16]
400258e0: 17ffffee b 40025898 <_Scheduler_EDF_Update_priority+0xc8>
link = _RBTree_Root_reference( the_rbtree );
400258e4: aa1703e3 mov x3, x23 <== NOT EXECUTED
400258e8: 17ffffd8 b 40025848 <_Scheduler_EDF_Update_priority+0x78> <== NOT EXECUTED
400258ec: 00000000 udf #0
0000000040025b20 <_Scheduler_EDF_Yield>:
void _Scheduler_EDF_Yield(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40025b20: a9bc7bfd stp x29, x30, [sp, #-64]!
40025b24: 910003fd mov x29, sp
40025b28: f9001bf7 str x23, [sp, #48]
return scheduler->context;
40025b2c: f9400017 ldr x23, [x0]
40025b30: a90153f3 stp x19, x20, [sp, #16]
_RBTree_Extract( &context->Ready, &node->Node );
40025b34: 91014053 add x19, x2, #0x50
40025b38: aa0203f4 mov x20, x2
40025b3c: aa1303e1 mov x1, x19
40025b40: a9025bf5 stp x21, x22, [sp, #32]
40025b44: aa0003f5 mov x21, x0
40025b48: aa1703e0 mov x0, x23
40025b4c: 94000f05 bl 40029760 <_RBTree_Extract>
while ( *link != NULL ) {
40025b50: f94002e4 ldr x4, [x23]
context = _Scheduler_EDF_Get_context( scheduler );
the_node = _Scheduler_EDF_Node_downcast( node );
_Scheduler_EDF_Extract( context, the_node );
_Scheduler_EDF_Enqueue( context, the_node, the_node->priority );
40025b54: f9403a86 ldr x6, [x20, #112]
40025b58: b5000064 cbnz x4, 40025b64 <_Scheduler_EDF_Yield+0x44> <== ALWAYS TAKEN
40025b5c: 14000026 b 40025bf4 <_Scheduler_EDF_Yield+0xd4> <== NOT EXECUTED
40025b60: aa0503e4 mov x4, x5
if ( ( *less )( key, parent ) ) {
40025b64: f9401085 ldr x5, [x4, #32]
return &RB_LEFT( the_node, Node );
40025b68: 91002083 add x3, x4, #0x8
40025b6c: eb0500df cmp x6, x5
40025b70: 9a848063 csel x3, x3, x4, hi // hi = pmore
while ( *link != NULL ) {
40025b74: f9400065 ldr x5, [x3]
40025b78: b5ffff45 cbnz x5, 40025b60 <_Scheduler_EDF_Yield+0x40>
RB_SET( child, parent, Node );
40025b7c: a900927f stp xzr, x4, [x19, #8]
40025b80: 52800036 mov w22, #0x1 // #1
_RBTree_Insert_color( the_rbtree, the_node );
40025b84: aa1303e1 mov x1, x19
RB_SET( child, parent, Node );
40025b88: f9002a9f str xzr, [x20, #80]
_RBTree_Insert_color( the_rbtree, the_node );
40025b8c: aa1703e0 mov x0, x23
RB_SET( child, parent, Node );
40025b90: b9001a76 str w22, [x19, #24]
*link = child;
40025b94: f9000073 str x19, [x3]
Thread_Control *heir = _Thread_Heir;
40025b98: d00006f3 adrp x19, 40103000 <config+0x8>
40025b9c: 91020273 add x19, x19, #0x80
_RBTree_Insert_color( the_rbtree, the_node );
40025ba0: 94001004 bl 40029bb0 <_RBTree_Insert_color>
first = _RBTree_Minimum( &context->Ready );
40025ba4: f94002a0 ldr x0, [x21]
40025ba8: 94001082 bl 40029db0 <_RBTree_Minimum>
_Scheduler_Update_heir( node->Base.owner, force_dispatch );
40025bac: f85b0015 ldur x21, [x0, #-80]
40025bb0: f9401674 ldr x20, [x19, #40]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40025bb4: eb1402bf cmp x21, x20
40025bb8: 54000140 b.eq 40025be0 <_Scheduler_EDF_Yield+0xc0> // b.none <== NEVER TAKEN
40025bbc: f9401a77 ldr x23, [x19, #48]
40025bc0: 97fffd40 bl 400250c0 <_Timecounter_Sbinuptime>
40025bc4: f9001a60 str x0, [x19, #48]
*_result = *_end - *_start;
40025bc8: cb170000 sub x0, x0, x23
*_time += *_add;
40025bcc: f9408281 ldr x1, [x20, #256]
40025bd0: 8b000020 add x0, x1, x0
40025bd4: f9008280 str x0, [x20, #256]
_Thread_Dispatch_necessary = true;
40025bd8: 39007276 strb w22, [x19, #28]
_Thread_Heir = new_heir;
40025bdc: f9001675 str x21, [x19, #40]
_Scheduler_EDF_Schedule_body( scheduler, the_thread, true );
}
40025be0: a94153f3 ldp x19, x20, [sp, #16]
40025be4: a9425bf5 ldp x21, x22, [sp, #32]
40025be8: f9401bf7 ldr x23, [sp, #48]
40025bec: a8c47bfd ldp x29, x30, [sp], #64
40025bf0: d65f03c0 ret
link = _RBTree_Root_reference( the_rbtree );
40025bf4: aa1703e3 mov x3, x23 <== NOT EXECUTED
40025bf8: 17ffffe1 b 40025b7c <_Scheduler_EDF_Yield+0x5c> <== NOT EXECUTED
40025bfc: 00000000 udf #0
0000000040028030 <_Scheduler_Set_affinity>:
bool _Scheduler_Set_affinity(
Thread_Control *the_thread,
size_t cpusetsize,
const cpu_set_t *cpuset
)
{
40028030: a9be7bfd stp x29, x30, [sp, #-32]!
Processor_mask *dst,
size_t src_size,
const cpu_set_t *src
)
{
return _Processor_mask_Copy(
40028034: aa0103e3 mov x3, x1
40028038: d2800101 mov x1, #0x8 // #8
4002803c: 910003fd mov x29, sp
40028040: 910063e0 add x0, sp, #0x18
40028044: 940010f3 bl 4002c410 <_Processor_mask_Copy>
Scheduler_Node *node;
ISR_lock_Context lock_context;
bool ok;
status = _Processor_mask_From_cpu_set_t( &affinity, cpusetsize, cpuset );
if ( !_Processor_mask_Is_at_most_partial_loss( status ) ) {
40028048: 7100041f cmp w0, #0x1
4002804c: 54000108 b.hi 4002806c <_Scheduler_Set_affinity+0x3c> // b.pmore <== NEVER TAKEN
BIT_AND2( CPU_MAXIMUM_PROCESSORS, a, b, c );
40028050: f00003e0 adrp x0, 400a7000 <status_code_text+0x100>
40028054: f940d400 ldr x0, [x0, #424]
40028058: f9400fe1 ldr x1, [sp, #24]
);
#endif
_Scheduler_Release_critical( scheduler, &lock_context );
return ok;
}
4002805c: a8c27bfd ldp x29, x30, [sp], #32
return BIT_SUBSET( CPU_MAXIMUM_PROCESSORS, big, small );
40028060: ea21001f bics xzr, x0, x1
40028064: 1a9f17e0 cset w0, eq // eq = none
40028068: d65f03c0 ret
4002806c: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
40028070: a8c27bfd ldp x29, x30, [sp], #32 <== NOT EXECUTED
40028074: d65f03c0 ret <== NOT EXECUTED
...
0000000040025ae0 <_Scheduler_default_Tick>:
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
40025ae0: 3943a420 ldrb w0, [x1, #233]
40025ae4: 340000e0 cbz w0, 40025b00 <_Scheduler_default_Tick+0x20>
return;
if ( !_States_Is_ready( executing->current_state ) )
40025ae8: b9403820 ldr w0, [x1, #56]
40025aec: 350000a0 cbnz w0, 40025b00 <_Scheduler_default_Tick+0x20>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
40025af0: b940f020 ldr w0, [x1, #240]
40025af4: 7100081f cmp w0, #0x2
40025af8: 54000068 b.hi 40025b04 <_Scheduler_default_Tick+0x24> // b.pmore
40025afc: 35000180 cbnz w0, 40025b2c <_Scheduler_default_Tick+0x4c>
40025b00: d65f03c0 ret
40025b04: 71000c1f cmp w0, #0x3
40025b08: 54000321 b.ne 40025b6c <_Scheduler_default_Tick+0x8c> // b.any <== NEVER TAKEN
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
40025b0c: b940ec20 ldr w0, [x1, #236]
40025b10: 51000400 sub w0, w0, #0x1
40025b14: b900ec20 str w0, [x1, #236]
40025b18: 35ffff40 cbnz w0, 40025b00 <_Scheduler_default_Tick+0x20>
(*executing->budget_callout)( executing );
40025b1c: f9407c22 ldr x2, [x1, #248]
40025b20: aa0103e0 mov x0, x1
40025b24: aa0203f0 mov x16, x2
40025b28: d61f0200 br x16
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
40025b2c: b940ec20 ldr w0, [x1, #236]
40025b30: 51000400 sub w0, w0, #0x1
40025b34: b900ec20 str w0, [x1, #236]
40025b38: 7100001f cmp w0, #0x0
40025b3c: 54fffe2c b.gt 40025b00 <_Scheduler_default_Tick+0x20>
{
40025b40: a9be7bfd stp x29, x30, [sp, #-32]!
_Thread_Yield( executing );
40025b44: aa0103e0 mov x0, x1
{
40025b48: 910003fd mov x29, sp
_Thread_Yield( executing );
40025b4c: f9000fe1 str x1, [sp, #24]
40025b50: 94000754 bl 400278a0 <_Thread_Yield>
executing->cpu_time_budget =
40025b54: f9400fe1 ldr x1, [sp, #24]
40025b58: f00000a0 adrp x0, 4003c000 <_Scheduler_Table+0x48>
40025b5c: b94e9000 ldr w0, [x0, #3728]
40025b60: b900ec20 str w0, [x1, #236]
break;
#endif
}
}
40025b64: a8c27bfd ldp x29, x30, [sp], #32
40025b68: d65f03c0 ret
40025b6c: d65f03c0 ret <== NOT EXECUTED
0000000040025f60 <_Scheduler_priority_Schedule>:
void _Scheduler_priority_Schedule(
const Scheduler_Control *scheduler,
Thread_Control *the_thread
)
{
40025f60: a9bd7bfd stp x29, x30, [sp, #-48]!
40025f64: 52800303 mov w3, #0x18 // #24
40025f68: 910003fd mov x29, sp
40025f6c: f9400001 ldr x1, [x0]
40025f70: a90153f3 stp x19, x20, [sp, #16]
Thread_Control *heir = _Thread_Heir;
40025f74: 90000713 adrp x19, 40105000 <Arr_2_Glob+0x1e68>
40025f78: 91290273 add x19, x19, #0xa40
40025f7c: a9025bf5 stp x21, x22, [sp, #32]
major = _Bitfield_Find_first_bit( bit_map->major_bit_map );
40025f80: 79400020 ldrh w0, [x1]
bit_number = (unsigned int) __builtin_clz( value )
40025f84: 5ac01000 clz w0, w0
minor = _Bitfield_Find_first_bit( bit_map->bit_map[ major ] );
40025f88: 51004002 sub w2, w0, #0x10
40025f8c: f9401674 ldr x20, [x19, #40]
40025f90: 8b020422 add x2, x1, x2, lsl #1
40025f94: 79400442 ldrh w2, [x2, #2]
bit_number = (unsigned int) __builtin_clz( value )
40025f98: 5ac01042 clz w2, w2
40025f9c: 0b001040 add w0, w2, w0, lsl #4
return (_Priority_Bits_index( major ) << 4) +
40025fa0: 51044000 sub w0, w0, #0x110
return _Chain_Immutable_head( the_chain )->next;
40025fa4: 9ba30400 umaddl x0, w0, w3, x1
40025fa8: f9401415 ldr x21, [x0, #40]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40025fac: eb15029f cmp x20, x21
40025fb0: 54000060 b.eq 40025fbc <_Scheduler_priority_Schedule+0x5c> // b.none
40025fb4: 3943a680 ldrb w0, [x20, #233]
40025fb8: 350000a0 cbnz w0, 40025fcc <_Scheduler_priority_Schedule+0x6c> <== ALWAYS TAKEN
_Scheduler_priority_Schedule_body( scheduler, the_thread, false );
}
40025fbc: a94153f3 ldp x19, x20, [sp, #16]
40025fc0: a9425bf5 ldp x21, x22, [sp, #32]
40025fc4: a8c37bfd ldp x29, x30, [sp], #48
40025fc8: d65f03c0 ret
40025fcc: f9401a76 ldr x22, [x19, #48]
40025fd0: 97fffd38 bl 400254b0 <_Timecounter_Sbinuptime>
40025fd4: f9001a60 str x0, [x19, #48]
_Thread_Dispatch_necessary = true;
40025fd8: 52800022 mov w2, #0x1 // #1
*_result = *_end - *_start;
40025fdc: cb160000 sub x0, x0, x22
*_time += *_add;
40025fe0: f9408281 ldr x1, [x20, #256]
40025fe4: 8b000020 add x0, x1, x0
40025fe8: f9008280 str x0, [x20, #256]
40025fec: 39007262 strb w2, [x19, #28]
_Thread_Heir = new_heir;
40025ff0: f9001675 str x21, [x19, #40]
40025ff4: a94153f3 ldp x19, x20, [sp, #16]
40025ff8: a9425bf5 ldp x21, x22, [sp, #32]
40025ffc: a8c37bfd ldp x29, x30, [sp], #48
40026000: d65f03c0 ret
...
0000000040026010 <_Scheduler_priority_Unblock>:
void _Scheduler_priority_Unblock (
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40026010: a9bd7bfd stp x29, x30, [sp, #-48]!
40026014: 910003fd mov x29, sp
do {
seq = _SMP_sequence_lock_Read_begin( &node->Priority.Lock );
#endif
priority = node->Priority.value;
40026018: f9402449 ldr x9, [x2, #72]
4002601c: a90153f3 stp x19, x20, [sp, #16]
40026020: aa0103f3 mov x19, x1
40026024: a9025bf5 stp x21, x22, [sp, #32]
unsigned int unmapped_priority;
context = _Scheduler_priority_Get_context( scheduler );
the_node = _Scheduler_priority_Node_downcast( node );
priority = (unsigned int ) _Scheduler_Node_get_priority( &the_node->Base );
unmapped_priority = SCHEDULER_PRIORITY_UNMAP( priority );
40026028: 53017d26 lsr w6, w9, #1
return scheduler->context;
4002602c: f9400007 ldr x7, [x0]
if ( unmapped_priority != the_node->Ready_queue.current_priority ) {
40026030: b9405040 ldr w0, [x2, #80]
40026034: 6b06001f cmp w0, w6
40026038: 54000381 b.ne 400260a8 <_Scheduler_priority_Unblock+0x98> // b.any
*bit_map_info->minor |= bit_map_info->ready_minor;
4002603c: a9458440 ldp x0, x1, [x2, #88]
40026040: 91018048 add x8, x2, #0x60
40026044: 7940d443 ldrh w3, [x2, #106]
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( priority < _Thread_Get_priority( _Thread_Heir ) ) {
40026048: f00006f4 adrp x20, 40105000 <Arr_2_Glob+0x1e68>
4002604c: 91290294 add x20, x20, #0xa40
40026050: 79400024 ldrh w4, [x1]
old_last = tail->previous;
40026054: 91002000 add x0, x0, #0x8
40026058: f9400402 ldr x2, [x0, #8]
4002605c: 2a040063 orr w3, w3, w4
40026060: f9401695 ldr x21, [x20, #40]
*/
RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_priority(
const Priority_Aggregation *aggregation
)
{
return aggregation->Node.priority;
40026064: f94036a4 ldr x4, [x21, #104]
the_node->next = tail;
40026068: f9000260 str x0, [x19]
tail->previous = the_node;
4002606c: f9000413 str x19, [x0, #8]
old_last->next = the_node;
40026070: f9000053 str x19, [x2]
the_node->previous = old_last;
40026074: f9000662 str x2, [x19, #8]
40026078: 79000023 strh w3, [x1]
4002607c: f9401481 ldr x1, [x4, #40]
bit_map->major_bit_map |= bit_map_info->ready_major;
40026080: 794000e0 ldrh w0, [x7]
40026084: 79401102 ldrh w2, [x8, #8]
40026088: eb29403f cmp x1, w9, uxtw
4002608c: 2a020000 orr w0, w0, w2
40026090: 790000e0 strh w0, [x7]
40026094: 54000388 b.hi 40026104 <_Scheduler_priority_Unblock+0xf4> // b.pmore
_Scheduler_Update_heir( the_thread, priority == PRIORITY_PSEUDO_ISR );
}
}
40026098: a94153f3 ldp x19, x20, [sp, #16]
4002609c: a9425bf5 ldp x21, x22, [sp, #32]
400260a0: a8c37bfd ldp x29, x30, [sp], #48
400260a4: d65f03c0 ret
return the_priority / 16;
400260a8: 53057d25 lsr w5, w9, #5
_Scheduler_priority_Ready_queue_update(
400260ac: 9100a0e0 add x0, x7, #0x28
bit_map_info->minor = &bit_map->bit_map[ _Priority_Bits_index( major ) ];
400260b0: 110004a1 add w1, w5, #0x1
return the_priority % 16;
400260b4: 12000cca and w10, w6, #0xf
ready_queue->ready_chain = &ready_queues[ new_priority ];
400260b8: 52800303 mov w3, #0x18 // #24
return (Priority_bit_map_Word) ( 0x8000u >> bit_number );
400260bc: 52900004 mov w4, #0x8000 // #32768
400260c0: 1ac52485 lsr w5, w4, w5
bit_map_info->minor = &bit_map->bit_map[ _Priority_Bits_index( major ) ];
400260c4: d37f6c21 ubfiz x1, x1, #1, #28
400260c8: 9ba300c0 umaddl x0, w6, w3, x0
return (Priority_bit_map_Word) ( 0x8000u >> bit_number );
400260cc: 12003ca5 and w5, w5, #0xffff
400260d0: 1aca2483 lsr w3, w4, w10
400260d4: 12003c63 and w3, w3, #0xffff
bit_map_info->minor = &bit_map->bit_map[ _Priority_Bits_index( major ) ];
400260d8: 8b0100e1 add x1, x7, x1
bit_map_info->block_minor = (Priority_bit_map_Word) ~mask;
400260dc: 2a2303e4 mvn w4, w3
bit_map_info->minor = &bit_map->bit_map[ _Priority_Bits_index( major ) ];
400260e0: 91018048 add x8, x2, #0x60
ready_queue->current_priority = new_priority;
400260e4: b9005046 str w6, [x2, #80]
bit_map_info->block_major = (Priority_bit_map_Word) ~mask;
400260e8: 2a2503e6 mvn w6, w5
bit_map_info->minor = &bit_map->bit_map[ _Priority_Bits_index( major ) ];
400260ec: a9058440 stp x0, x1, [x2, #88]
bit_map_info->ready_major = mask;
400260f0: 7900d045 strh w5, [x2, #104]
bit_map_info->ready_minor = mask;
400260f4: 7900d443 strh w3, [x2, #106]
bit_map_info->block_major = (Priority_bit_map_Word) ~mask;
400260f8: 7900d846 strh w6, [x2, #108]
bit_map_info->block_minor = (Priority_bit_map_Word) ~mask;
400260fc: 7900dc44 strh w4, [x2, #110]
_Priority_bit_map_Initialize_information(
bit_map,
&ready_queue->Priority_map,
new_priority
);
}
40026100: 17ffffd2 b 40026048 <_Scheduler_priority_Unblock+0x38>
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40026104: eb1302bf cmp x21, x19
40026108: 54fffc80 b.eq 40026098 <_Scheduler_priority_Unblock+0x88> // b.none<== NEVER TAKEN
4002610c: 3943a6a0 ldrb w0, [x21, #233]
_Scheduler_Update_heir( the_thread, priority == PRIORITY_PSEUDO_ISR );
40026110: 7100013f cmp w9, #0x0
40026114: 1a9f17e1 cset w1, eq // eq = none
40026118: 2a010000 orr w0, w0, w1
4002611c: 34fffbe0 cbz w0, 40026098 <_Scheduler_priority_Unblock+0x88>
40026120: f9401a96 ldr x22, [x20, #48]
40026124: 97fffce3 bl 400254b0 <_Timecounter_Sbinuptime>
40026128: f9001a80 str x0, [x20, #48]
_Thread_Dispatch_necessary = true;
4002612c: 52800022 mov w2, #0x1 // #1
*_result = *_end - *_start;
40026130: cb160000 sub x0, x0, x22
*_time += *_add;
40026134: f94082a1 ldr x1, [x21, #256]
40026138: 8b000020 add x0, x1, x0
4002613c: f90082a0 str x0, [x21, #256]
40026140: 39007282 strb w2, [x20, #28]
_Thread_Heir = new_heir;
40026144: f9001693 str x19, [x20, #40]
}
40026148: 17ffffd4 b 40026098 <_Scheduler_priority_Unblock+0x88>
4002614c: 00000000 udf #0
0000000040025530 <_Scheduler_simple_Block>:
void _Scheduler_simple_Block(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40025530: a9bd7bfd stp x29, x30, [sp, #-48]!
40025534: 910003fd mov x29, sp
40025538: a90153f3 stp x19, x20, [sp, #16]
return ( the_thread == _Thread_Heir );
4002553c: b00006f3 adrp x19, 40102000 <_RTEMS_tasks_Objects+0x13b8>
40025540: 91320273 add x19, x19, #0xc80
previous = the_node->previous;
40025544: a9400823 ldp x3, x2, [x1]
40025548: a9425264 ldp x4, x20, [x19, #32]
next->previous = previous;
4002554c: f9000462 str x2, [x3, #8]
previous->next = next;
40025550: f9000043 str x3, [x2]
{
( *extract )( scheduler, the_thread, node );
/* TODO: flash critical section? */
if ( _Thread_Is_executing( the_thread ) || _Thread_Is_heir( the_thread ) ) {
40025554: eb04003f cmp x1, x4
40025558: 540000c0 b.eq 40025570 <_Scheduler_simple_Block+0x40> // b.none
4002555c: eb14003f cmp x1, x20
40025560: 54000080 b.eq 40025570 <_Scheduler_simple_Block+0x40> // b.none <== NEVER TAKEN
the_thread,
node,
_Scheduler_simple_Extract,
_Scheduler_simple_Schedule_body
);
}
40025564: a94153f3 ldp x19, x20, [sp, #16]
40025568: a8c37bfd ldp x29, x30, [sp], #48
4002556c: d65f03c0 ret
return _Chain_Immutable_head( the_chain )->next;
40025570: f9400000 ldr x0, [x0]
40025574: a9025bf5 stp x21, x22, [sp, #32]
40025578: f9400015 ldr x21, [x0]
bool force_dispatch
)
{
Thread_Control *heir = _Thread_Heir;
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
4002557c: eb1402bf cmp x21, x20
40025580: 540001e0 b.eq 400255bc <_Scheduler_simple_Block+0x8c> // b.none <== NEVER TAKEN
last = cpu->cpu_usage_timestamp;
40025584: f9401a76 ldr x22, [x19, #48]
*time = _Timecounter_Sbinuptime();
40025588: 97fffe86 bl 40024fa0 <_Timecounter_Sbinuptime>
4002558c: f9001a60 str x0, [x19, #48]
heir->Scheduler.state = THREAD_SCHEDULER_BLOCKED;
new_heir->Scheduler.state = THREAD_SCHEDULER_SCHEDULED;
#endif
_Thread_Update_CPU_time_used( heir, _Thread_Get_CPU( heir ) );
_Thread_Heir = new_heir;
_Thread_Dispatch_necessary = true;
40025590: 52800022 mov w2, #0x1 // #1
const Timestamp_Control *_start,
const Timestamp_Control *_end,
Timestamp_Control *_result
)
{
*_result = *_end - *_start;
40025594: cb160000 sub x0, x0, x22
*_time += *_add;
40025598: f9408281 ldr x1, [x20, #256]
4002559c: 8b000020 add x0, x1, x0
400255a0: f9008280 str x0, [x20, #256]
400255a4: 39007262 strb w2, [x19, #28]
_Thread_Heir = new_heir;
400255a8: f9001675 str x21, [x19, #40]
400255ac: a94153f3 ldp x19, x20, [sp, #16]
400255b0: a9425bf5 ldp x21, x22, [sp, #32]
400255b4: a8c37bfd ldp x29, x30, [sp], #48
400255b8: d65f03c0 ret
400255bc: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
400255c0: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
400255c4: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
400255c8: d65f03c0 ret <== NOT EXECUTED
400255cc: 00000000 udf #0
00000000400256e0 <_Scheduler_simple_Schedule>:
void _Scheduler_simple_Schedule(
const Scheduler_Control *scheduler,
Thread_Control *the_thread
)
{
400256e0: a9bd7bfd stp x29, x30, [sp, #-48]! <== NOT EXECUTED
400256e4: 910003fd mov x29, sp <== NOT EXECUTED
return _Chain_Immutable_head( the_chain )->next;
400256e8: f9400000 ldr x0, [x0] <== NOT EXECUTED
400256ec: a90153f3 stp x19, x20, [sp, #16] <== NOT EXECUTED
Thread_Control *heir = _Thread_Heir;
400256f0: b00006f3 adrp x19, 40102000 <_RTEMS_tasks_Objects+0x13b8> <== NOT EXECUTED
400256f4: 91320273 add x19, x19, #0xc80 <== NOT EXECUTED
400256f8: a9025bf5 stp x21, x22, [sp, #32] <== NOT EXECUTED
400256fc: f9400015 ldr x21, [x0] <== NOT EXECUTED
40025700: f9401674 ldr x20, [x19, #40] <== NOT EXECUTED
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
40025704: eb1402bf cmp x21, x20 <== NOT EXECUTED
40025708: 54000060 b.eq 40025714 <_Scheduler_simple_Schedule+0x34> // b.none <== NOT EXECUTED
4002570c: 3943a680 ldrb w0, [x20, #233] <== NOT EXECUTED
40025710: 350000a0 cbnz w0, 40025724 <_Scheduler_simple_Schedule+0x44> <== NOT EXECUTED
_Scheduler_simple_Schedule_body( scheduler, the_thread, false );
}
40025714: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
40025718: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
4002571c: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
40025720: d65f03c0 ret <== NOT EXECUTED
40025724: f9401a76 ldr x22, [x19, #48] <== NOT EXECUTED
40025728: 97fffe1e bl 40024fa0 <_Timecounter_Sbinuptime> <== NOT EXECUTED
4002572c: f9001a60 str x0, [x19, #48] <== NOT EXECUTED
_Thread_Dispatch_necessary = true;
40025730: 52800022 mov w2, #0x1 // #1 <== NOT EXECUTED
*_result = *_end - *_start;
40025734: cb160000 sub x0, x0, x22 <== NOT EXECUTED
*_time += *_add;
40025738: f9408281 ldr x1, [x20, #256] <== NOT EXECUTED
4002573c: 8b000020 add x0, x1, x0 <== NOT EXECUTED
40025740: f9008280 str x0, [x20, #256] <== NOT EXECUTED
40025744: 39007262 strb w2, [x19, #28] <== NOT EXECUTED
_Thread_Heir = new_heir;
40025748: f9001675 str x21, [x19, #40] <== NOT EXECUTED
4002574c: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
40025750: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
40025754: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
40025758: d65f03c0 ret <== NOT EXECUTED
4002575c: 00000000 udf #0
0000000040025760 <_Scheduler_simple_Unblock>:
void _Scheduler_simple_Unblock(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40025760: a9bd7bfd stp x29, x30, [sp, #-48]!
40025764: 910003fd mov x29, sp
return &the_chain->Tail.Node;
40025768: f9400003 ldr x3, [x0]
4002576c: a90153f3 stp x19, x20, [sp, #16]
40025770: aa0103f3 mov x19, x1
40025774: f9403421 ldr x1, [x1, #104]
40025778: a9025bf5 stp x21, x22, [sp, #32]
return _Chain_Immutable_head( the_chain )->next;
4002577c: f8408460 ldr x0, [x3], #8
40025780: f9401421 ldr x1, [x1, #40]
while ( next != tail && !( *order )( left, next ) ) {
40025784: eb00007f cmp x3, x0
40025788: 54000140 b.eq 400257b0 <_Scheduler_simple_Unblock+0x50> // b.none
4002578c: 32000024 orr w4, w1, #0x1
40025790: 14000004 b 400257a0 <_Scheduler_simple_Unblock+0x40>
return the_node->next;
40025794: f9400000 ldr x0, [x0]
while ( next != tail && !( *order )( left, next ) ) {
40025798: eb00007f cmp x3, x0
4002579c: 540000a0 b.eq 400257b0 <_Scheduler_simple_Unblock+0x50> // b.none
400257a0: f9403402 ldr x2, [x0, #104]
400257a4: f9401442 ldr x2, [x2, #40]
400257a8: eb04005f cmp x2, x4
400257ac: 54ffff43 b.cc 40025794 <_Scheduler_simple_Unblock+0x34> // b.lo, b.ul, b.last
* a context switch.
* Pseudo-ISR case:
* Even if the thread isn't preemptible, if the new heir is
* a pseudo-ISR system task, we need to do a context switch.
*/
if ( priority < _Thread_Get_priority( _Thread_Heir ) ) {
400257b0: b00006f4 adrp x20, 40102000 <_RTEMS_tasks_Objects+0x13b8>
400257b4: 91320294 add x20, x20, #0xc80
return the_node->previous;
400257b8: f9400400 ldr x0, [x0, #8]
400257bc: f9401695 ldr x21, [x20, #40]
before_node = after_node->next;
400257c0: f9400002 ldr x2, [x0]
the_node->previous = after_node;
400257c4: f9000660 str x0, [x19, #8]
after_node->next = the_node;
400257c8: f9000013 str x19, [x0]
400257cc: f94036a0 ldr x0, [x21, #104]
400257d0: f9401400 ldr x0, [x0, #40]
the_node->next = before_node;
400257d4: f9000262 str x2, [x19]
before_node->previous = the_node;
400257d8: f9000453 str x19, [x2, #8]
400257dc: eb21401f cmp x0, w1, uxtw
400257e0: 540000a8 b.hi 400257f4 <_Scheduler_simple_Unblock+0x94> // b.pmore
_Scheduler_Update_heir(
the_thread,
priority == PRIORITY_PSEUDO_ISR
);
}
}
400257e4: a94153f3 ldp x19, x20, [sp, #16]
400257e8: a9425bf5 ldp x21, x22, [sp, #32]
400257ec: a8c37bfd ldp x29, x30, [sp], #48
400257f0: d65f03c0 ret
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
400257f4: eb1302bf cmp x21, x19
400257f8: 54ffff60 b.eq 400257e4 <_Scheduler_simple_Unblock+0x84> // b.none <== NEVER TAKEN
400257fc: 3943a6a0 ldrb w0, [x21, #233]
_Scheduler_Update_heir(
40025800: 7100003f cmp w1, #0x0
40025804: 1a9f17e1 cset w1, eq // eq = none
40025808: 2a010000 orr w0, w0, w1
4002580c: 34fffec0 cbz w0, 400257e4 <_Scheduler_simple_Unblock+0x84>
40025810: f9401a96 ldr x22, [x20, #48]
40025814: 97fffde3 bl 40024fa0 <_Timecounter_Sbinuptime>
40025818: f9001a80 str x0, [x20, #48]
_Thread_Dispatch_necessary = true;
4002581c: 52800022 mov w2, #0x1 // #1
*_result = *_end - *_start;
40025820: cb160000 sub x0, x0, x22
*_time += *_add;
40025824: f94082a1 ldr x1, [x21, #256]
40025828: 8b000020 add x0, x1, x0
4002582c: f90082a0 str x0, [x21, #256]
40025830: 39007282 strb w2, [x20, #28]
_Thread_Heir = new_heir;
40025834: f9001693 str x19, [x20, #40]
}
40025838: 17ffffeb b 400257e4 <_Scheduler_simple_Unblock+0x84>
4002583c: 00000000 udf #0
00000000400255f0 <_Scheduler_simple_Update_priority>:
)
{
Scheduler_simple_Context *context;
unsigned int new_priority;
if ( !_Thread_Is_ready( the_thread ) ) {
400255f0: b9403823 ldr w3, [x1, #56]
400255f4: 34000043 cbz w3, 400255fc <_Scheduler_simple_Update_priority+0xc> <== ALWAYS TAKEN
400255f8: d65f03c0 ret <== NOT EXECUTED
{
400255fc: a9bd7bfd stp x29, x30, [sp, #-48]!
40025600: 910003fd mov x29, sp
40025604: f9400005 ldr x5, [x0]
40025608: a90153f3 stp x19, x20, [sp, #16]
previous = the_node->previous;
4002560c: a9400026 ldp x6, x0, [x1]
40025610: a9025bf5 stp x21, x22, [sp, #32]
return &the_chain->Tail.Node;
40025614: aa0503e3 mov x3, x5
do {
seq = _SMP_sequence_lock_Read_begin( &node->Priority.Lock );
#endif
priority = node->Priority.value;
40025618: f9402444 ldr x4, [x2, #72]
next->previous = previous;
4002561c: f90004c0 str x0, [x6, #8]
previous->next = next;
40025620: f9000006 str x6, [x0]
return _Chain_Immutable_head( the_chain )->next;
40025624: f8408460 ldr x0, [x3], #8
)
{
const Chain_Node *tail = _Chain_Immutable_tail( the_chain );
Chain_Node *next = _Chain_First( the_chain );
while ( next != tail && !( *order )( left, next ) ) {
40025628: eb00007f cmp x3, x0
4002562c: 54000140 b.eq 40025654 <_Scheduler_simple_Update_priority+0x64> // b.none<== NEVER TAKEN
40025630: 92407c84 and x4, x4, #0xffffffff
40025634: 14000004 b 40025644 <_Scheduler_simple_Update_priority+0x54>
return the_node->next;
40025638: f9400000 ldr x0, [x0]
while ( next != tail && !( *order )( left, next ) ) {
4002563c: eb00007f cmp x3, x0
40025640: 540000a0 b.eq 40025654 <_Scheduler_simple_Update_priority+0x64> // b.none
return aggregation->Node.priority;
40025644: f9403402 ldr x2, [x0, #104]
40025648: f9401442 ldr x2, [x2, #40]
4002564c: eb02009f cmp x4, x2
40025650: 54ffff48 b.hi 40025638 <_Scheduler_simple_Update_priority+0x48> // b.pmore
return the_node->previous;
40025654: f9400400 ldr x0, [x0, #8]
Thread_Control *heir = _Thread_Heir;
40025658: b00006f3 adrp x19, 40102000 <_RTEMS_tasks_Objects+0x13b8>
4002565c: 91320273 add x19, x19, #0xc80
before_node = after_node->next;
40025660: f9400002 ldr x2, [x0]
40025664: f9401674 ldr x20, [x19, #40]
the_node->previous = after_node;
40025668: f9000420 str x0, [x1, #8]
after_node->next = the_node;
4002566c: f9000001 str x1, [x0]
the_node->next = before_node;
40025670: f9000022 str x2, [x1]
return _Chain_Immutable_head( the_chain )->next;
40025674: f94000b5 ldr x21, [x5]
before_node->previous = the_node;
40025678: f9000441 str x1, [x2, #8]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
4002567c: eb1402bf cmp x21, x20
40025680: 54000060 b.eq 4002568c <_Scheduler_simple_Update_priority+0x9c> // b.none
40025684: 3943a680 ldrb w0, [x20, #233]
40025688: 350000a0 cbnz w0, 4002569c <_Scheduler_simple_Update_priority+0xac> <== NEVER TAKEN
new_priority = (unsigned int ) _Scheduler_Node_get_priority( node );
_Scheduler_simple_Extract( scheduler, the_thread, node );
_Scheduler_simple_Insert( &context->Ready, the_thread, new_priority );
_Scheduler_simple_Schedule_body( scheduler, the_thread, false );
}
4002568c: a94153f3 ldp x19, x20, [sp, #16]
40025690: a9425bf5 ldp x21, x22, [sp, #32]
40025694: a8c37bfd ldp x29, x30, [sp], #48
40025698: d65f03c0 ret
4002569c: f9401a76 ldr x22, [x19, #48] <== NOT EXECUTED
400256a0: 97fffe40 bl 40024fa0 <_Timecounter_Sbinuptime> <== NOT EXECUTED
400256a4: f9001a60 str x0, [x19, #48] <== NOT EXECUTED
_Thread_Dispatch_necessary = true;
400256a8: 52800022 mov w2, #0x1 // #1 <== NOT EXECUTED
*_result = *_end - *_start;
400256ac: cb160000 sub x0, x0, x22 <== NOT EXECUTED
*_time += *_add;
400256b0: f9408281 ldr x1, [x20, #256] <== NOT EXECUTED
400256b4: 8b000020 add x0, x1, x0 <== NOT EXECUTED
400256b8: f9008280 str x0, [x20, #256] <== NOT EXECUTED
400256bc: 39007262 strb w2, [x19, #28] <== NOT EXECUTED
_Thread_Heir = new_heir;
400256c0: f9001675 str x21, [x19, #40] <== NOT EXECUTED
400256c4: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
400256c8: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
400256cc: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
400256d0: d65f03c0 ret <== NOT EXECUTED
...
0000000040025840 <_Scheduler_simple_Yield>:
void _Scheduler_simple_Yield(
const Scheduler_Control *scheduler,
Thread_Control *the_thread,
Scheduler_Node *node
)
{
40025840: a9bd7bfd stp x29, x30, [sp, #-48]!
40025844: 910003fd mov x29, sp
return scheduler->context;
40025848: f9400005 ldr x5, [x0]
4002584c: a90153f3 stp x19, x20, [sp, #16]
previous = the_node->previous;
40025850: a9400022 ldp x2, x0, [x1]
40025854: a9025bf5 stp x21, x22, [sp, #32]
return &the_chain->Tail.Node;
40025858: aa0503e4 mov x4, x5
4002585c: f9403423 ldr x3, [x1, #104]
context = _Scheduler_simple_Get_context( scheduler );
(void) node;
_Chain_Extract_unprotected( &the_thread->Object.Node );
insert_priority = (unsigned int) _Thread_Get_priority( the_thread );
40025860: f9401463 ldr x3, [x3, #40]
next->previous = previous;
40025864: f9000440 str x0, [x2, #8]
previous->next = next;
40025868: f9000002 str x2, [x0]
return _Chain_Immutable_head( the_chain )->next;
4002586c: f8408480 ldr x0, [x4], #8
while ( next != tail && !( *order )( left, next ) ) {
40025870: eb00009f cmp x4, x0
40025874: 54000140 b.eq 4002589c <_Scheduler_simple_Yield+0x5c> // b.none <== NEVER TAKEN
40025878: 32000063 orr w3, w3, #0x1
4002587c: 14000004 b 4002588c <_Scheduler_simple_Yield+0x4c>
return the_node->next;
40025880: f9400000 ldr x0, [x0]
while ( next != tail && !( *order )( left, next ) ) {
40025884: eb00009f cmp x4, x0
40025888: 540000a0 b.eq 4002589c <_Scheduler_simple_Yield+0x5c> // b.none <== NEVER TAKEN
4002588c: f9403402 ldr x2, [x0, #104]
40025890: f9401442 ldr x2, [x2, #40]
40025894: eb02007f cmp x3, x2
40025898: 54ffff48 b.hi 40025880 <_Scheduler_simple_Yield+0x40> // b.pmore
return the_node->previous;
4002589c: f9400400 ldr x0, [x0, #8]
Thread_Control *heir = _Thread_Heir;
400258a0: b00006f3 adrp x19, 40102000 <_RTEMS_tasks_Objects+0x13b8>
400258a4: 91320273 add x19, x19, #0xc80
before_node = after_node->next;
400258a8: f9400002 ldr x2, [x0]
400258ac: f9401674 ldr x20, [x19, #40]
the_node->previous = after_node;
400258b0: f9000420 str x0, [x1, #8]
after_node->next = the_node;
400258b4: f9000001 str x1, [x0]
the_node->next = before_node;
400258b8: f9000022 str x2, [x1]
return _Chain_Immutable_head( the_chain )->next;
400258bc: f94000b5 ldr x21, [x5]
before_node->previous = the_node;
400258c0: f9000441 str x1, [x2, #8]
if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
400258c4: eb1402bf cmp x21, x20
400258c8: 54000060 b.eq 400258d4 <_Scheduler_simple_Yield+0x94> // b.none
400258cc: 3943a680 ldrb w0, [x20, #233]
400258d0: 350000a0 cbnz w0, 400258e4 <_Scheduler_simple_Yield+0xa4> <== NEVER TAKEN
insert_priority = SCHEDULER_PRIORITY_APPEND( insert_priority );
_Scheduler_simple_Insert( &context->Ready, the_thread, insert_priority );
_Scheduler_simple_Schedule_body( scheduler, the_thread, false );
}
400258d4: a94153f3 ldp x19, x20, [sp, #16]
400258d8: a9425bf5 ldp x21, x22, [sp, #32]
400258dc: a8c37bfd ldp x29, x30, [sp], #48
400258e0: d65f03c0 ret
400258e4: f9401a76 ldr x22, [x19, #48] <== NOT EXECUTED
400258e8: 97fffdae bl 40024fa0 <_Timecounter_Sbinuptime> <== NOT EXECUTED
400258ec: f9001a60 str x0, [x19, #48] <== NOT EXECUTED
_Thread_Dispatch_necessary = true;
400258f0: 52800022 mov w2, #0x1 // #1 <== NOT EXECUTED
*_result = *_end - *_start;
400258f4: cb160000 sub x0, x0, x22 <== NOT EXECUTED
*_time += *_add;
400258f8: f9408281 ldr x1, [x20, #256] <== NOT EXECUTED
400258fc: 8b000020 add x0, x1, x0 <== NOT EXECUTED
40025900: f9008280 str x0, [x20, #256] <== NOT EXECUTED
40025904: 39007262 strb w2, [x19, #28] <== NOT EXECUTED
_Thread_Heir = new_heir;
40025908: f9001675 str x21, [x19, #40] <== NOT EXECUTED
4002590c: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
40025910: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
40025914: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
40025918: d65f03c0 ret <== NOT EXECUTED
4002591c: 00000000 udf #0
0000000040025940 <_TOD_Set>:
Status_Control _TOD_Set(
const struct timespec *tod,
ISR_lock_Context *lock_context
)
{
40025940: a9bb7bfd stp x29, x30, [sp, #-80]!
40025944: 910003fd mov x29, sp
40025948: a90153f3 stp x19, x20, [sp, #16]
4002594c: aa0103f4 mov x20, x1
40025950: f90013f5 str x21, [sp, #32]
&& (unsigned long) ts->tv_nsec < WATCHDOG_NANOSECONDS_PER_SECOND;
40025954: b40000e0 cbz x0, 40025970 <_TOD_Set+0x30> <== NEVER TAKEN
40025958: aa0003f3 mov x19, x0
4002595c: d2993fe0 mov x0, #0xc9ff // #51711
40025960: f2a77340 movk x0, #0x3b9a, lsl #16
40025964: f9400661 ldr x1, [x19, #8]
40025968: eb00003f cmp x1, x0
4002596c: 54000129 b.ls 40025990 <_TOD_Set+0x50> // b.plast
return STATUS_INVALID_NUMBER;
40025970: 5282c155 mov w21, #0x160a // #5642
_Timecounter_Release( lock_context );
40025974: b9400280 ldr w0, [x20]
40025978: d51b4220 msr daif, x0
}
_TOD.is_set = true;
return STATUS_SUCCESSFUL;
}
4002597c: 2a1503e0 mov w0, w21
40025980: a94153f3 ldp x19, x20, [sp, #16]
40025984: f94013f5 ldr x21, [sp, #32]
40025988: a8c57bfd ldp x29, x30, [sp], #80
4002598c: d65f03c0 ret
if ( _Watchdog_Is_far_future_timespec( tod ) ) {
40025990: f9400260 ldr x0, [x19]
40025994: 929c9fe2 mov x2, #0xffffffffffff1b00 // #-58624
40025998: f2bbc4a2 movk x2, #0xde25, lsl #16
4002599c: d2835fe1 mov x1, #0x1aff // #6911
400259a0: f2bbc4a1 movk x1, #0xde25, lsl #16
400259a4: 8b020000 add x0, x0, x2
400259a8: f2c00061 movk x1, #0x3, lsl #32
400259ac: eb01001f cmp x0, x1
400259b0: 54fffe08 b.hi 40025970 <_TOD_Set+0x30> // b.pmore
return _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod );
400259b4: aa1303e1 mov x1, x19
400259b8: 52800000 mov w0, #0x0 // #0
400259bc: 9400112d bl 40029e70 <_TOD_Hook_Run>
400259c0: 2a0003f5 mov w21, w0
if ( status != STATUS_SUCCESSFUL ) {
400259c4: 35fffd80 cbnz w0, 40025974 <_TOD_Set+0x34>
_bt->frac = _ts->tv_nsec * (uint64_t)18446744073LL;
400259c8: a9400a63 ldp x3, x2, [x19]
400259cc: d29f4120 mov x0, #0xfa09 // #64009
400259d0: f2a97040 movk x0, #0x4b82, lsl #16
_Timecounter_Set_clock( &tod_as_bintime, lock_context );
400259d4: aa1403e1 mov x1, x20
400259d8: f2c00080 movk x0, #0x4, lsl #32
400259dc: 9b007c42 mul x2, x2, x0
400259e0: 910103e0 add x0, sp, #0x40
400259e4: a9040be3 stp x3, x2, [sp, #64]
400259e8: 94000182 bl 40025ff0 <_Timecounter_Set_clock>
ticks |= (uint32_t) ts->tv_nsec;
400259ec: a9400262 ldp x2, x0, [x19]
__asm__ volatile (
400259f0: d53b4221 mrs x1, daif
400259f4: d50342df msr daifset, #0x2
_ISR_lock_ISR_disable_and_acquire( &cpu->Watchdog.Lock, &lock_context );
400259f8: b9003be1 str w1, [sp, #56]
return (Watchdog_Control *) header->first;
400259fc: f00006e1 adrp x1, 40104000 <_RTEMS_tasks_Objects+0x1760>
40025a00: f946ac21 ldr x1, [x1, #3416]
if ( first != NULL ) {
40025a04: b40000e1 cbz x1, 40025a20 <_TOD_Set+0xe0>
ticks |= (uint32_t) ts->tv_nsec;
40025a08: 92407c00 and x0, x0, #0xffffffff
_Watchdog_Tickle(
40025a0c: 9100e3e3 add x3, sp, #0x38
40025a10: aa027802 orr x2, x0, x2, lsl #30
40025a14: f00006e0 adrp x0, 40104000 <_RTEMS_tasks_Objects+0x1760>
40025a18: 91354000 add x0, x0, #0xd50
40025a1c: 94000b69 bl 400287c0 <_Watchdog_Do_tickle>
_ISR_lock_Release_and_ISR_enable( &cpu->Watchdog.Lock, &lock_context );
40025a20: b9403be0 ldr w0, [sp, #56]
__asm__ volatile (
40025a24: d51b4220 msr daif, x0
_TOD.is_set = true;
40025a28: f00006e0 adrp x0, 40104000 <_RTEMS_tasks_Objects+0x1760>
40025a2c: 52800021 mov w1, #0x1 // #1
}
40025a30: a94153f3 ldp x19, x20, [sp, #16]
_TOD.is_set = true;
40025a34: 39336001 strb w1, [x0, #3288]
}
40025a38: 2a1503e0 mov w0, w21
40025a3c: f94013f5 ldr x21, [sp, #32]
40025a40: a8c57bfd ldp x29, x30, [sp], #80
40025a44: d65f03c0 ret
...
0000000040025240 <_Terminate>:
void _Terminate(
Internal_errors_Source the_source,
Internal_errors_t the_error
)
{
40025240: a9bd7bfd stp x29, x30, [sp, #-48]!
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, error };
_User_extensions_Iterate(
40025244: 52800002 mov w2, #0x0 // #0
40025248: 910003fd mov x29, sp
4002524c: a90153f3 stp x19, x20, [sp, #16]
40025250: 2a0003f4 mov w20, w0
40025254: aa0103f3 mov x19, x1
40025258: 910083e0 add x0, sp, #0x20
4002525c: d0000001 adrp x1, 40027000 <_Thread_queue_Priority_enqueue+0xa0>
40025260: 91294021 add x1, x1, #0xa50
User_extensions_Fatal_context ctx = { source, error };
40025264: b90023f4 str w20, [sp, #32]
40025268: f90017f3 str x19, [sp, #40]
_User_extensions_Iterate(
4002526c: 94000a0d bl 40027aa0 <_User_extensions_Iterate>
_User_extensions_Fatal( the_source, the_error );
_Internal_errors_What_happened.the_source = the_source;
40025270: 90000700 adrp x0, 40105000 <Arr_2_Glob+0x1e68> <== NOT EXECUTED
40025274: 9127e001 add x1, x0, #0x9f8 <== NOT EXECUTED
_System_state_Current = state;
40025278: 90000702 adrp x2, 40105000 <Arr_2_Glob+0x1e68> <== NOT EXECUTED
4002527c: 52800063 mov w3, #0x3 // #3 <== NOT EXECUTED
40025280: b909f814 str w20, [x0, #2552] <== NOT EXECUTED
40025284: b90a0843 str w3, [x2, #2568] <== NOT EXECUTED
_Internal_errors_What_happened.the_error = the_error;
40025288: f9000433 str x19, [x1, #8] <== NOT EXECUTED
__asm__ volatile (
4002528c: d53b4220 mrs x0, daif <== NOT EXECUTED
40025290: d50342df msr daifset, #0x2 <== NOT EXECUTED
_System_state_Set( SYSTEM_STATE_TERMINATED );
_SMP_Request_shutdown();
_CPU_Fatal_halt( the_source, the_error );
40025294: aa1303e0 mov x0, x19 <== NOT EXECUTED
40025298: 14000000 b 40025298 <_Terminate+0x58> <== NOT EXECUTED
4002529c: 00000000 udf #0
0000000040029ae0 <_Thread_Allocate_unlimited>:
}
}
}
Objects_Control *_Thread_Allocate_unlimited( Objects_Information *information )
{
40029ae0: a9bd7bfd stp x29, x30, [sp, #-48]!
40029ae4: 910003fd mov x29, sp
return _Chain_Immutable_head( the_chain )->next;
40029ae8: f9401401 ldr x1, [x0, #40]
40029aec: a90153f3 stp x19, x20, [sp, #16]
return &the_chain->Tail.Node;
40029af0: 9100c014 add x20, x0, #0x30
40029af4: a9025bf5 stp x21, x22, [sp, #32]
40029af8: aa0003f3 mov x19, x0
return _Chain_Immutable_head( the_chain )->next;
40029afc: 9100a015 add x21, x0, #0x28
if ( !_Chain_Is_empty(the_chain))
40029b00: eb14003f cmp x1, x20
40029b04: 54000300 b.eq 40029b64 <_Thread_Allocate_unlimited+0x84> // b.none
new_first = old_first->next;
40029b08: f9400020 ldr x0, [x1]
head->next = new_first;
40029b0c: f9001660 str x0, [x19, #40]
Objects_Maximum objects_per_block;
Objects_Maximum block;
_Assert( _Objects_Is_auto_extend( information ) );
objects_per_block = information->objects_per_block;
40029b10: 79404663 ldrh w3, [x19, #34]
new_first->previous = head;
40029b14: f9000415 str x21, [x0, #8]
40029b18: b9401020 ldr w0, [x1, #16]
block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
40029b1c: 51000400 sub w0, w0, #0x1
40029b20: 12003c02 and w2, w0, #0xffff
if ( block > objects_per_block ) {
40029b24: 6b20207f cmp w3, w0, uxth
40029b28: 54000142 b.cs 40029b50 <_Thread_Allocate_unlimited+0x70> // b.hs, b.nlast
block /= objects_per_block;
information->inactive_per_block[ block ]--;
40029b2c: 1ac30842 udiv w2, w2, w3
40029b30: f9402263 ldr x3, [x19, #64]
40029b34: d37f3c42 ubfiz x2, x2, #1, #16
40029b38: 78626860 ldrh w0, [x3, x2]
40029b3c: 51000400 sub w0, w0, #0x1
40029b40: 78226860 strh w0, [x3, x2]
information->inactive--;
40029b44: 79404260 ldrh w0, [x19, #32]
40029b48: 51000400 sub w0, w0, #0x1
40029b4c: 79004260 strh w0, [x19, #32]
return _Objects_Allocate_with_extend(
information,
_Thread_Extend_information
);
}
40029b50: aa0103e0 mov x0, x1
40029b54: a94153f3 ldp x19, x20, [sp, #16]
40029b58: a9425bf5 ldp x21, x22, [sp, #32]
40029b5c: a8c37bfd ldp x29, x30, [sp], #48
40029b60: d65f03c0 ret
block = _Objects_Extend_information( &information->Objects );
40029b64: 97fffcdf bl 40028ee0 <_Objects_Extend_information>
40029b68: 2a0003f6 mov w22, w0
if ( block > 0 ) {
40029b6c: 72003c1f tst w0, #0xffff
40029b70: 540000c1 b.ne 40029b88 <_Thread_Allocate_unlimited+0xa8> // b.any <== ALWAYS TAKEN
return _Chain_Immutable_head( the_chain )->next;
40029b74: f9401661 ldr x1, [x19, #40]
if ( !_Chain_Is_empty(the_chain))
40029b78: eb01029f cmp x20, x1
40029b7c: 54fffc61 b.ne 40029b08 <_Thread_Allocate_unlimited+0x28> // b.any <== ALWAYS TAKEN
return NULL;
40029b80: d2800001 mov x1, #0x0 // #0 <== NOT EXECUTED
40029b84: 17fffff3 b 40029b50 <_Thread_Allocate_unlimited+0x70> <== NOT EXECUTED
new_heads = _Freechain_Extend(
40029b88: 79404662 ldrh w2, [x19, #34]
40029b8c: d0000001 adrp x1, 4002b000 <_Thread_Cancel+0x70>
40029b90: 91016260 add x0, x19, #0x58
40029b94: 9133c021 add x1, x1, #0xcf0
40029b98: d2800e03 mov x3, #0x70 // #112
40029b9c: 94002395 bl 400329f0 <_Freechain_Extend>
if ( new_heads == NULL ) {
40029ba0: b5fffea0 cbnz x0, 40029b74 <_Thread_Allocate_unlimited+0x94> <== ALWAYS TAKEN
_Objects_Free_objects_block( &information->Objects, block );
40029ba4: 2a1603e1 mov w1, w22 <== NOT EXECUTED
40029ba8: aa1303e0 mov x0, x19 <== NOT EXECUTED
40029bac: 97fffd91 bl 400291f0 <_Objects_Free_objects_block> <== NOT EXECUTED
40029bb0: 17fffff1 b 40029b74 <_Thread_Allocate_unlimited+0x94> <== NOT EXECUTED
...
000000004002b6f0 <_Thread_Cancel>:
void _Thread_Cancel(
Thread_Control *the_thread,
Thread_Control *executing,
void *exit_value
)
{
4002b6f0: a9bd7bfd stp x29, x30, [sp, #-48]!
4002b6f4: 910003fd mov x29, sp
4002b6f8: a90153f3 stp x19, x20, [sp, #16]
4002b6fc: aa0003f3 mov x19, x0
4002b700: a9025bf5 stp x21, x22, [sp, #32]
__asm__ volatile (
4002b704: d53b4235 mrs x21, daif
4002b708: d50342df msr daifset, #0x2
previous = the_thread->Life.state;
4002b70c: b9426803 ldr w3, [x0, #616]
if (
4002b710: 52800124 mov w4, #0x9 // #9
the_thread->Life.exit_value = exit_value;
4002b714: f9013802 str x2, [x0, #624]
state |= set;
4002b718: 321e0062 orr w2, w3, #0x4
the_thread->Life.state = state;
4002b71c: b9026802 str w2, [x0, #616]
if (
4002b720: 6a04007f tst w3, w4
4002b724: 540004c1 b.ne 4002b7bc <_Thread_Cancel+0xcc> // b.any
the_thread->is_preemptible = the_thread->Start.is_preemptible;
4002b728: 39448003 ldrb w3, [x0, #288]
cpu_self->dispatch_necessary = true;
4002b72c: b00006d4 adrp x20, 40104000 <rtems_libio_iops+0x260>
4002b730: 91080294 add x20, x20, #0x200
4002b734: 3903a663 strb w3, [x19, #233]
the_thread->budget_callout = the_thread->Start.budget_callout;
4002b738: f9409663 ldr x3, [x19, #296]
4002b73c: f9007e63 str x3, [x19, #248]
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
4002b740: b9412664 ldr w4, [x19, #292]
action->handler = handler;
4002b744: 91094002 add x2, x0, #0x250
if ( _Chain_Is_node_off_chain( the_node ) ) {
4002b748: f9412a63 ldr x3, [x19, #592]
4002b74c: 90000000 adrp x0, 4002b000 <_Thread_queue_FIFO_enqueue+0x30>
4002b750: 91120000 add x0, x0, #0x480
4002b754: b900f264 str w4, [x19, #240]
4002b758: f9013260 str x0, [x19, #608]
4002b75c: 52800024 mov w4, #0x1 // #1
4002b760: 39007284 strb w4, [x20, #28]
4002b764: b4000823 cbz x3, 4002b868 <_Thread_Cancel+0x178>
return aggregation->Node.priority;
4002b768: f9403421 ldr x1, [x1, #104]
disable_level = cpu_self->thread_dispatch_disable_level;
4002b76c: b9401a80 ldr w0, [x20, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4002b770: 11000400 add w0, w0, #0x1
4002b774: f9401436 ldr x22, [x1, #40]
4002b778: b9001a80 str w0, [x20, #24]
);
cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
priority = _Thread_Get_priority( executing );
if ( _States_Is_dormant( the_thread->current_state ) ) {
4002b77c: b9403a60 ldr w0, [x19, #56]
4002b780: 37f80620 tbnz w0, #31, 4002b844 <_Thread_Cancel+0x154>
pending_requests = the_thread->Life.pending_life_change_requests;
4002b784: b9426e60 ldr w0, [x19, #620]
the_thread->Life.pending_life_change_requests = pending_requests + 1;
4002b788: 11000401 add w1, w0, #0x1
4002b78c: b9026e61 str w1, [x19, #620]
if ( pending_requests == 0 ) {
4002b790: 34000840 cbz w0, 4002b898 <_Thread_Cancel+0x1a8> <== ALWAYS TAKEN
__asm__ volatile (
4002b794: 92407eb5 and x21, x21, #0xffffffff
4002b798: d51b4235 msr daif, x21
_Thread_queue_Extract_with_proxy( the_thread );
4002b79c: aa1303e0 mov x0, x19
4002b7a0: 940018ec bl 40031b50 <_Thread_queue_Extract_with_proxy>
__asm__ volatile (
4002b7a4: d53b4235 mrs x21, daif
4002b7a8: d50342df msr daifset, #0x2
4002b7ac: f9405a60 ldr x0, [x19, #176]
4002b7b0: 9102e261 add x1, x19, #0xb8
4002b7b4: 94000247 bl 4002c0d0 <_Watchdog_Remove>
_Per_CPU_Get(),
#endif
the_thread->Timer.header
);
_ISR_lock_Release_and_ISR_enable( &the_thread->Timer.Lock, &lock_context );
4002b7b8: 14000011 b 4002b7fc <_Thread_Cancel+0x10c>
disable_level = cpu_self->thread_dispatch_disable_level;
4002b7bc: b00006d4 adrp x20, 40104000 <rtems_libio_iops+0x260>
4002b7c0: 91080294 add x20, x20, #0x200
4002b7c4: b9401a82 ldr w2, [x20, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4002b7c8: 11000442 add w2, w2, #0x1
4002b7cc: b9001a82 str w2, [x20, #24]
if ( _States_Is_dormant( the_thread->current_state ) ) {
4002b7d0: b9403802 ldr w2, [x0, #56]
4002b7d4: 37f80382 tbnz w2, #31, 4002b844 <_Thread_Cancel+0x154> <== NEVER TAKEN
4002b7d8: f9403423 ldr x3, [x1, #104]
pending_requests = the_thread->Life.pending_life_change_requests;
4002b7dc: b9426e61 ldr w1, [x19, #620]
the_thread->Life.pending_life_change_requests = pending_requests + 1;
4002b7e0: 11000422 add w2, w1, #0x1
4002b7e4: f9401476 ldr x22, [x3, #40]
4002b7e8: b9026e62 str w2, [x19, #620]
if ( pending_requests == 0 ) {
4002b7ec: 340005e1 cbz w1, 4002b8a8 <_Thread_Cancel+0x1b8> <== ALWAYS TAKEN
_Thread_State_release( the_thread, &lock_context );
_Thread_Finalize_life_change( the_thread, priority );
} else {
_Thread_Add_life_change_request( the_thread );
_Thread_Clear_state_locked( the_thread, STATES_SUSPENDED );
4002b7f0: aa1303e0 mov x0, x19
4002b7f4: 52900001 mov w1, #0x8000 // #32768
4002b7f8: 940017be bl 400316f0 <_Thread_Clear_state_locked>
__asm__ volatile (
4002b7fc: 92407eb5 and x21, x21, #0xffffffff
4002b800: d51b4235 msr daif, x21
_Thread_State_release( the_thread, &lock_context );
_Thread_Raise_real_priority( the_thread, priority );
4002b804: aa1603e1 mov x1, x22
4002b808: aa1303e0 mov x0, x19
4002b80c: 97fffead bl 4002b2c0 <_Thread_Raise_real_priority>
__asm__ volatile (
4002b810: d53b4235 mrs x21, daif
4002b814: d50342df msr daifset, #0x2
pending_requests = the_thread->Life.pending_life_change_requests;
4002b818: b9426e60 ldr w0, [x19, #620]
if ( pending_requests == 1 ) {
4002b81c: 71000401 subs w1, w0, #0x1
the_thread->Life.pending_life_change_requests = pending_requests - 1;
4002b820: b9026e61 str w1, [x19, #620]
if ( pending_requests == 1 ) {
4002b824: 54000300 b.eq 4002b884 <_Thread_Cancel+0x194> // b.none <== ALWAYS TAKEN
__asm__ volatile (
4002b828: 92407eb5 and x21, x21, #0xffffffff
4002b82c: d51b4235 msr daif, x21
_Thread_Remove_life_change_request( the_thread );
}
_Thread_Dispatch_enable( cpu_self );
4002b830: aa1403e0 mov x0, x20
}
4002b834: a94153f3 ldp x19, x20, [sp, #16]
4002b838: a9425bf5 ldp x21, x22, [sp, #32]
4002b83c: a8c37bfd ldp x29, x30, [sp], #48
_Thread_Dispatch_enable( cpu_self );
4002b840: 17fffb18 b 4002a4a0 <_Thread_Dispatch_enable>
4002b844: 92407eb5 and x21, x21, #0xffffffff
4002b848: d51b4235 msr daif, x21
_Thread_Make_zombie( the_thread );
4002b84c: aa1303e0 mov x0, x19
4002b850: 97fffedc bl 4002b3c0 <_Thread_Make_zombie>
_Thread_Dispatch_enable( cpu_self );
4002b854: aa1403e0 mov x0, x20
}
4002b858: a94153f3 ldp x19, x20, [sp, #16]
4002b85c: a9425bf5 ldp x21, x22, [sp, #32]
4002b860: a8c37bfd ldp x29, x30, [sp], #48
_Thread_Dispatch_enable( cpu_self );
4002b864: 17fffb0f b 4002a4a0 <_Thread_Dispatch_enable>
old_last = tail->previous;
4002b868: f940ba63 ldr x3, [x19, #368]
4002b86c: 9105a260 add x0, x19, #0x168
tail->previous = the_node;
4002b870: f900ba62 str x2, [x19, #368]
the_node->next = tail;
4002b874: f9012a60 str x0, [x19, #592]
old_last->next = the_node;
4002b878: f9000062 str x2, [x3]
the_node->previous = old_last;
4002b87c: f9012e63 str x3, [x19, #600]
}
4002b880: 17ffffba b 4002b768 <_Thread_Cancel+0x78>
_Thread_Clear_state_locked(
4002b884: aa1303e0 mov x0, x19
4002b888: 52906181 mov w1, #0x830c // #33548
4002b88c: 72a60041 movk w1, #0x3002, lsl #16
4002b890: 94001798 bl 400316f0 <_Thread_Clear_state_locked>
4002b894: 17ffffe5 b 4002b828 <_Thread_Cancel+0x138>
_Thread_Set_state_locked( the_thread, STATES_LIFE_IS_CHANGING );
4002b898: aa1303e0 mov x0, x19
4002b89c: 52a00041 mov w1, #0x20000 // #131072
4002b8a0: 94000074 bl 4002ba70 <_Thread_Set_state_locked>
4002b8a4: 17ffffbc b 4002b794 <_Thread_Cancel+0xa4>
4002b8a8: 52a00041 mov w1, #0x20000 // #131072
4002b8ac: 94000071 bl 4002ba70 <_Thread_Set_state_locked>
4002b8b0: 17ffffd0 b 4002b7f0 <_Thread_Cancel+0x100>
...
0000000040029050 <_Thread_Change_life>:
Thread_Life_state _Thread_Change_life(
Thread_Life_state clear,
Thread_Life_state set,
Thread_Life_state ignore
)
{
40029050: a9be7bfd stp x29, x30, [sp, #-32]!
40029054: 2a0003e4 mov w4, w0
40029058: 910003fd mov x29, sp
4002905c: f9000bf3 str x19, [sp, #16]
__asm__ volatile (
40029060: d53b4225 mrs x5, daif
40029064: d50342df msr daifset, #0x2
40029068: d00006c3 adrp x3, 40103000 <_POSIX_Threads_Objects+0xb38>
4002906c: 912c0060 add x0, x3, #0xb00
& ( THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED ) ) == 0;
40029070: 52800126 mov w6, #0x9 // #9
40029074: f9401003 ldr x3, [x0, #32]
previous = the_thread->Life.state;
40029078: b9426873 ldr w19, [x3, #616]
state &= ~clear;
4002907c: 0a240264 bic w4, w19, w4
state |= set;
40029080: 2a040021 orr w1, w1, w4
the_thread->Life.state = state;
40029084: b9026861 str w1, [x3, #616]
state &= ~ignore;
40029088: 0a220021 bic w1, w1, w2
if (
4002908c: 6a06003f tst w1, w6
40029090: 54000221 b.ne 400290d4 <_Thread_Change_life+0x84> // b.any
&& _Thread_Is_life_changing( state )
40029094: 721f043f tst w1, #0x6
40029098: 540001e0 b.eq 400290d4 <_Thread_Change_life+0x84> // b.none
the_thread->is_preemptible = the_thread->Start.is_preemptible;
4002909c: 39448064 ldrb w4, [x3, #288]
action->handler = handler;
400290a0: f0ffffe1 adrp x1, 40028000 <_Thread_queue_Priority_priority_actions+0x50>
400290a4: 912d8021 add x1, x1, #0xb60
400290a8: 3903a464 strb w4, [x3, #233]
the_thread->budget_callout = the_thread->Start.budget_callout;
400290ac: f9409464 ldr x4, [x3, #296]
400290b0: f9007c64 str x4, [x3, #248]
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
400290b4: b9412466 ldr w6, [x3, #292]
400290b8: 91094062 add x2, x3, #0x250
if ( _Chain_Is_node_off_chain( the_node ) ) {
400290bc: f9412864 ldr x4, [x3, #592]
400290c0: b900f066 str w6, [x3, #240]
400290c4: f9013061 str x1, [x3, #608]
400290c8: 52800026 mov w6, #0x1 // #1
400290cc: 39007006 strb w6, [x0, #28]
400290d0: b4000164 cbz x4, 400290fc <_Thread_Change_life+0xac> <== ALWAYS TAKEN
disable_level = cpu_self->thread_dispatch_disable_level;
400290d4: b9401801 ldr w1, [x0, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
400290d8: 11000421 add w1, w1, #0x1
400290dc: b9001801 str w1, [x0, #24]
__asm__ volatile (
400290e0: 92407ca1 and x1, x5, #0xffffffff
400290e4: d51b4221 msr daif, x1
previous = _Thread_Change_life_locked( executing, clear, set, ignore );
cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
_Thread_State_release( executing, &lock_context );
_Thread_Dispatch_enable( cpu_self );
400290e8: 97fff986 bl 40027700 <_Thread_Dispatch_enable>
return previous;
}
400290ec: 2a1303e0 mov w0, w19
400290f0: f9400bf3 ldr x19, [sp, #16]
400290f4: a8c27bfd ldp x29, x30, [sp], #32
400290f8: d65f03c0 ret
old_last = tail->previous;
400290fc: f940b864 ldr x4, [x3, #368]
40029100: 9105a061 add x1, x3, #0x168
tail->previous = the_node;
40029104: f900b862 str x2, [x3, #368]
the_node->next = tail;
40029108: f9012861 str x1, [x3, #592]
old_last->next = the_node;
4002910c: f9000082 str x2, [x4]
the_node->previous = old_last;
40029110: f9012c64 str x4, [x3, #600]
}
40029114: 17fffff0 b 400290d4 <_Thread_Change_life+0x84>
...
0000000040029fd0 <_Thread_Clear_state_locked>:
States_Control _Thread_Clear_state_locked(
Thread_Control *the_thread,
States_Control state
)
{
40029fd0: a9be7bfd stp x29, x30, [sp, #-32]!
40029fd4: 910003fd mov x29, sp
40029fd8: f9000bf3 str x19, [sp, #16]
States_Control previous_state;
_Assert( state != 0 );
_Assert( _Thread_State_is_owner( the_thread ) );
previous_state = the_thread->current_state;
40029fdc: b9403813 ldr w19, [x0, #56]
if ( ( previous_state & state ) != 0 ) {
40029fe0: 6a01027f tst w19, w1
40029fe4: 54000160 b.eq 4002a010 <_Thread_Clear_state_locked+0x40> // b.none
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
40029fe8: 0a210262 bic w2, w19, w1
States_Control next_state;
next_state = _States_Clear( state, previous_state );
the_thread->current_state = next_state;
40029fec: b9003802 str w2, [x0, #56]
*/
RTEMS_INLINE_ROUTINE bool _States_Is_ready (
States_Control the_states
)
{
return (the_states == STATES_READY);
40029ff0: aa0003e3 mov x3, x0
if ( _States_Is_ready( next_state ) ) {
40029ff4: 350000e2 cbnz w2, 4002a010 <_Thread_Clear_state_locked+0x40> <== NEVER TAKEN
( *scheduler->Operations.unblock )( scheduler, the_thread, scheduler_node );
40029ff8: d0000080 adrp x0, 4003b000 <__sfvwrite_r+0x5d4>
40029ffc: 913ee000 add x0, x0, #0xfb8
4002a000: f9403462 ldr x2, [x3, #104]
4002a004: aa0303e1 mov x1, x3
4002a008: f9401404 ldr x4, [x0, #40]
4002a00c: d63f0080 blr x4
_Scheduler_Unblock( the_thread );
}
}
return previous_state;
}
4002a010: 2a1303e0 mov w0, w19
4002a014: f9400bf3 ldr x19, [sp, #16]
4002a018: a8c27bfd ldp x29, x30, [sp], #32
4002a01c: d65f03c0 ret
00000000400263a0 <_Thread_Dispatch_enable>:
}
void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
{
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
400263a0: b9401801 ldr w1, [x0, #24]
if ( disable_level == 1 ) {
400263a4: 7100043f cmp w1, #0x1
400263a8: 54000080 b.eq 400263b8 <_Thread_Dispatch_enable+0x18> // b.none
_Profiling_Thread_dispatch_enable( cpu_self, 0 );
_ISR_Local_enable( level );
}
} else {
_Assert( disable_level > 0 );
cpu_self->thread_dispatch_disable_level = disable_level - 1;
400263ac: 51000421 sub w1, w1, #0x1
400263b0: b9001801 str w1, [x0, #24]
}
}
400263b4: d65f03c0 ret
400263b8: d53b4221 mrs x1, daif
400263bc: d50342df msr daifset, #0x2
cpu_self->dispatch_necessary
400263c0: 39407002 ldrb w2, [x0, #28]
if (
400263c4: 72001c5f tst w2, #0xff
400263c8: 54000061 b.ne 400263d4 <_Thread_Dispatch_enable+0x34> // b.any
|| !_ISR_Is_enabled( level )
400263cc: 92407c22 and x2, x1, #0xffffffff
400263d0: 34000041 cbz w1, 400263d8 <_Thread_Dispatch_enable+0x38> <== ALWAYS TAKEN
_Thread_Do_dispatch( cpu_self, level );
400263d4: 17ffff93 b 40026220 <_Thread_Do_dispatch>
cpu_self->thread_dispatch_disable_level = 0;
400263d8: b900181f str wzr, [x0, #24]
__asm__ volatile (
400263dc: d51b4222 msr daif, x2
}
400263e0: d65f03c0 ret
...
0000000040026220 <_Thread_Do_dispatch>:
_Thread_State_release( executing, &lock_context );
}
void _Thread_Do_dispatch( Per_CPU_Control *cpu_self, ISR_Level level )
{
40026220: a9bb7bfd stp x29, x30, [sp, #-80]!
40026224: 910003fd mov x29, sp
40026228: a90153f3 stp x19, x20, [sp, #16]
4002622c: a9025bf5 stp x21, x22, [sp, #32]
40026230: a90363f7 stp x23, x24, [sp, #48]
Thread_Control *executing;
_Assert( cpu_self->thread_dispatch_disable_level == 1 );
#if defined(RTEMS_SCORE_ROBUST_THREAD_DISPATCH)
if (
40026234: 350009a1 cbnz w1, 40026368 <_Thread_Do_dispatch+0x148> <== NEVER TAKEN
return _Chain_Immutable_head( the_chain )->next;
40026238: d00006d7 adrp x23, 40100000 <_RTEMS_tasks_Information>
4002623c: 910f02f7 add x23, x23, #0x3c0
) {
_Internal_error( INTERNAL_ERROR_BAD_THREAD_DISPATCH_ENVIRONMENT );
}
#endif
executing = cpu_self->executing;
40026240: f9401015 ldr x21, [x0, #32]
/*
* Since heir and executing are not the same, we need to do a real
* context switch.
*/
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = rtems_configuration_get_ticks_per_timeslice();
40026244: d00000b8 adrp x24, 4003c000 <_Scheduler_Table+0x48>
40026248: 913a4318 add x24, x24, #0xe90
if ( node != tail ) {
4002624c: 910022f6 add x22, x23, #0x8
heir = cpu_self->heir;
40026250: f9401414 ldr x20, [x0, #40]
cpu_self->dispatch_necessary = false;
40026254: 3900701f strb wzr, [x0, #28]
cpu_self->executing = heir;
40026258: f9001014 str x20, [x0, #32]
if ( heir == executing )
4002625c: eb1402bf cmp x21, x20
40026260: 540003c0 b.eq 400262d8 <_Thread_Do_dispatch+0xb8> // b.none
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
40026264: b940f280 ldr w0, [x20, #240]
40026268: 7100041f cmp w0, #0x1
4002626c: 54000061 b.ne 40026278 <_Thread_Do_dispatch+0x58> // b.any
heir->cpu_time_budget = rtems_configuration_get_ticks_per_timeslice();
40026270: b9400300 ldr w0, [x24]
40026274: b900ee80 str w0, [x20, #236]
_ISR_Local_enable( level );
40026278: 2a0103e1 mov w1, w1
4002627c: d51b4221 msr daif, x1
40026280: f94002f3 ldr x19, [x23]
40026284: eb16027f cmp x19, x22
40026288: 54000120 b.eq 400262ac <_Thread_Do_dispatch+0x8c> // b.none
4002628c: d503201f nop
(*extension->thread_switch)( executing, heir );
40026290: f9400a62 ldr x2, [x19, #16]
40026294: aa1403e1 mov x1, x20
return the_node->next;
40026298: f9400273 ldr x19, [x19]
4002629c: aa1503e0 mov x0, x21
400262a0: d63f0040 blr x2
while ( node != tail ) {
400262a4: eb16027f cmp x19, x22
400262a8: 54ffff41 b.ne 40026290 <_Thread_Do_dispatch+0x70> // b.any
#if !defined(RTEMS_SMP)
_User_extensions_Thread_switch( executing, heir );
#endif
_Thread_Save_fp( executing );
_Context_Switch( &executing->Registers, &heir->Registers );
400262ac: 9105e281 add x1, x20, #0x178
400262b0: 9105e2a0 add x0, x21, #0x178
400262b4: 94000753 bl 40028000 <_CPU_Context_switch>
__asm__ volatile (
400262b8: d53b4221 mrs x1, daif
400262bc: d50342df msr daifset, #0x2
* stack or non-volatile registers reflect the old execution environment.
*/
cpu_self = _Per_CPU_Get();
_ISR_Local_disable( level );
} while ( cpu_self->dispatch_necessary );
400262c0: f00006e2 adrp x2, 40105000 <Arr_2_Glob+0x1e68>
400262c4: 91290042 add x2, x2, #0xa40
cpu_self = _Per_CPU_Get();
400262c8: aa0203e0 mov x0, x2
} while ( cpu_self->dispatch_necessary );
400262cc: 39407042 ldrb w2, [x2, #28]
400262d0: 72001c5f tst w2, #0xff
400262d4: 54fffbe1 b.ne 40026250 <_Thread_Do_dispatch+0x30> // b.any
post_switch:
_Assert( cpu_self->thread_dispatch_disable_level == 1 );
cpu_self->thread_dispatch_disable_level = 0;
400262d8: b900181f str wzr, [x0, #24]
_Profiling_Thread_dispatch_enable( cpu_self, 0 );
_ISR_Local_enable( level );
400262dc: 2a0103e1 mov w1, w1
__asm__ volatile (
400262e0: d51b4221 msr daif, x1
__asm__ volatile (
400262e4: d53b4220 mrs x0, daif
400262e8: d50342df msr daifset, #0x2
_ISR_lock_ISR_disable( lock_context );
400262ec: b9004be0 str w0, [sp, #72]
return _Chain_Immutable_head( the_chain )->next;
400262f0: f940b2a1 ldr x1, [x21, #352]
return &the_chain->Tail.Node;
400262f4: 9105a2b4 add x20, x21, #0x168
return _Chain_Immutable_head( the_chain )->next;
400262f8: 910582b3 add x19, x21, #0x160
if ( !_Chain_Is_empty(the_chain))
400262fc: eb14003f cmp x1, x20
40026300: 54000260 b.eq 4002634c <_Thread_Do_dispatch+0x12c> // b.none
new_first = old_first->next;
40026304: f9400020 ldr x0, [x1]
head->next = new_first;
40026308: f900b2a0 str x0, [x21, #352]
new_first->previous = head;
4002630c: f9000413 str x19, [x0, #8]
while ( action != NULL ) {
40026310: 14000004 b 40026320 <_Thread_Do_dispatch+0x100>
new_first = old_first->next;
40026314: f9400020 ldr x0, [x1] <== NOT EXECUTED
head->next = new_first;
40026318: f9000260 str x0, [x19] <== NOT EXECUTED
new_first->previous = head;
4002631c: f9000413 str x19, [x0, #8] <== NOT EXECUTED
( *action->handler )( executing, action, &lock_context );
40026320: f9400823 ldr x3, [x1, #16]
node->next = NULL;
40026324: f900003f str xzr, [x1]
40026328: 910123e2 add x2, sp, #0x48
4002632c: aa1503e0 mov x0, x21
40026330: d63f0060 blr x3
40026334: d53b4220 mrs x0, daif
40026338: d50342df msr daifset, #0x2
4002633c: b9004be0 str w0, [sp, #72]
return _Chain_Immutable_head( the_chain )->next;
40026340: f9400261 ldr x1, [x19]
if ( !_Chain_Is_empty(the_chain))
40026344: eb01029f cmp x20, x1
40026348: 54fffe61 b.ne 40026314 <_Thread_Do_dispatch+0xf4> // b.any <== NEVER TAKEN
_ISR_lock_ISR_enable( lock_context );
4002634c: b9404be0 ldr w0, [sp, #72]
__asm__ volatile (
40026350: d51b4220 msr daif, x0
_Thread_Run_post_switch_actions( executing );
}
40026354: a94153f3 ldp x19, x20, [sp, #16]
40026358: a9425bf5 ldp x21, x22, [sp, #32]
4002635c: a94363f7 ldp x23, x24, [sp, #48]
40026360: a8c57bfd ldp x29, x30, [sp], #80
40026364: d65f03c0 ret
_Internal_error( INTERNAL_ERROR_BAD_THREAD_DISPATCH_ENVIRONMENT );
40026368: 528003e0 mov w0, #0x1f // #31 <== NOT EXECUTED
4002636c: 97fffbcd bl 400252a0 <_Internal_error> <== NOT EXECUTED
000000004002b910 <_Thread_Exit>:
__asm__ volatile (
4002b910: d53b4223 mrs x3, daif
4002b914: d50342df msr daifset, #0x2
state |= set;
4002b918: b9426804 ldr w4, [x0, #616]
the_thread->Life.exit_value = exit_value;
4002b91c: f9013802 str x2, [x0, #624]
state |= set;
4002b920: 2a040021 orr w1, w1, w4
the_thread->Life.state = state;
4002b924: b9026801 str w1, [x0, #616]
&& _Thread_Is_life_changing( state )
4002b928: 721f043f tst w1, #0x6
4002b92c: 54000220 b.eq 4002b970 <_Thread_Exit+0x60> // b.none <== NEVER TAKEN
the_thread->is_preemptible = the_thread->Start.is_preemptible;
4002b930: 39448005 ldrb w5, [x0, #288]
cpu_self->dispatch_necessary = true;
4002b934: b00006c1 adrp x1, 40104000 <rtems_libio_iops+0x260>
4002b938: 91080021 add x1, x1, #0x200
4002b93c: 3903a405 strb w5, [x0, #233]
the_thread->budget_callout = the_thread->Start.budget_callout;
4002b940: f9409405 ldr x5, [x0, #296]
4002b944: f9007c05 str x5, [x0, #248]
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
4002b948: b9412406 ldr w6, [x0, #292]
action->handler = handler;
4002b94c: 90000002 adrp x2, 4002b000 <_Thread_queue_FIFO_enqueue+0x30>
4002b950: 91120042 add x2, x2, #0x480
4002b954: b900f006 str w6, [x0, #240]
if ( _Chain_Is_node_off_chain( the_node ) ) {
4002b958: f9412805 ldr x5, [x0, #592]
4002b95c: f9013002 str x2, [x0, #608]
4002b960: 52800026 mov w6, #0x1 // #1
4002b964: 39007026 strb w6, [x1, #28]
4002b968: 91094004 add x4, x0, #0x250
4002b96c: b4000085 cbz x5, 4002b97c <_Thread_Exit+0x6c> <== ALWAYS TAKEN
__asm__ volatile (
4002b970: 92407c60 and x0, x3, #0xffffffff
4002b974: d51b4220 msr daif, x0
0,
set,
THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED
);
_Thread_State_release( executing, &lock_context );
}
4002b978: d65f03c0 ret
old_last = tail->previous;
4002b97c: f940b802 ldr x2, [x0, #368]
4002b980: 9105a001 add x1, x0, #0x168
tail->previous = the_node;
4002b984: f900b804 str x4, [x0, #368]
the_node->next = tail;
4002b988: f9012801 str x1, [x0, #592]
old_last->next = the_node;
4002b98c: f9000044 str x4, [x2]
the_node->previous = old_last;
4002b990: f9012c02 str x2, [x0, #600]
}
4002b994: 17fffff7 b 4002b970 <_Thread_Exit+0x60>
...
000000004002d580 <_Thread_Get_name>:
size_t _Thread_Get_name(
const Thread_Control *the_thread,
char *buffer,
size_t buffer_size
)
{
4002d580: aa0103e4 mov x4, x1
4002d584: aa0203e3 mov x3, x2
const char *name;
name = the_thread->Join_queue.Queue.name;
4002d588: f9401801 ldr x1, [x0, #48]
if ( name != NULL && name[ 0 ] != '\0' ) {
4002d58c: b4000061 cbz x1, 4002d598 <_Thread_Get_name+0x18> <== NEVER TAKEN
4002d590: 39400025 ldrb w5, [x1]
4002d594: 350000a5 cbnz w5, 4002d5a8 <_Thread_Get_name+0x28>
return strlcpy( buffer, name, buffer_size );
} else {
return _Objects_Name_to_string(
4002d598: f9400c00 ldr x0, [x0, #24]
4002d59c: aa0403e2 mov x2, x4
4002d5a0: 52800001 mov w1, #0x0 // #0
4002d5a4: 14000473 b 4002e770 <_Objects_Name_to_string>
return strlcpy( buffer, name, buffer_size );
4002d5a8: aa0403e0 mov x0, x4
4002d5ac: 140007ce b 4002f4e4 <strlcpy>
...
000000004002a1b0 <_Thread_Initialize>:
bool _Thread_Initialize(
Thread_Information *information,
Thread_Control *the_thread,
const Thread_Configuration *config
)
{
4002a1b0: a9bb7bfd stp x29, x30, [sp, #-80]!
4002a1b4: 910003fd mov x29, sp
4002a1b8: a9025bf5 stp x21, x22, [sp, #32]
4002a1bc: aa0003f5 mov x21, x0
const Scheduler_Control *scheduler_for_index;
#endif
size_t scheduler_index;
Per_CPU_Control *cpu = _Per_CPU_Get_by_index( 0 );
memset(
4002a1c0: 91008020 add x0, x1, #0x20
{
4002a1c4: a90153f3 stp x19, x20, [sp, #16]
4002a1c8: aa0203f4 mov x20, x2
&the_thread->Join_queue,
0,
information->Objects.object_size - offsetof( Thread_Control, Join_queue )
4002a1cc: 79404aa2 ldrh w2, [x21, #36]
{
4002a1d0: aa0103f3 mov x19, x1
memset(
4002a1d4: 52800001 mov w1, #0x0 // #0
4002a1d8: d1008042 sub x2, x2, #0x20
4002a1dc: 94001346 bl 4002eef4 <memset>
);
for ( i = 0 ; i < _Thread_Control_add_on_count ; ++i ) {
4002a1e0: d0000080 adrp x0, 4003c000 <_Scheduler_Table+0x48>
4002a1e4: f9402402 ldr x2, [x0, #72]
4002a1e8: d0000083 adrp x3, 4003c000 <_Scheduler_Table+0x48>
4002a1ec: 91014063 add x3, x3, #0x50
4002a1f0: d2800004 mov x4, #0x0 // #0
4002a1f4: b4000102 cbz x2, 4002a214 <_Thread_Initialize+0x64> <== NEVER TAKEN
const Thread_Control_add_on *add_on = &_Thread_Control_add_ons[ i ];
*(void **) ( (char *) the_thread + add_on->destination_offset ) =
(char *) the_thread + add_on->source_offset;
4002a1f8: a9400465 ldp x5, x1, [x3]
for ( i = 0 ; i < _Thread_Control_add_on_count ; ++i ) {
4002a1fc: 91000484 add x4, x4, #0x1
4002a200: eb02009f cmp x4, x2
4002a204: 91004063 add x3, x3, #0x10
(char *) the_thread + add_on->source_offset;
4002a208: 8b010261 add x1, x19, x1
*(void **) ( (char *) the_thread + add_on->destination_offset ) =
4002a20c: f8256a61 str x1, [x19, x5]
for ( i = 0 ; i < _Thread_Control_add_on_count ; ++i ) {
4002a210: 54ffff41 b.ne 4002a1f8 <_Thread_Initialize+0x48> // b.any
goto failed;
}
#endif
#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
if (
4002a214: b9404280 ldr w0, [x20, #64]
the_thread->Start.stack_free = config->stack_free;
4002a218: f9400e81 ldr x1, [x20, #24]
4002a21c: f900a261 str x1, [x19, #320]
if (
4002a220: 34000100 cbz w0, 4002a240 <_Thread_Initialize+0x90> <== ALWAYS TAKEN
#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
failed:
#endif
( *the_thread->Start.stack_free )( the_thread->Start.Initial_stack.area );
4002a224: f940aa60 ldr x0, [x19, #336]
4002a228: d63f0020 blr x1
return false;
4002a22c: 52800000 mov w0, #0x0 // #0
}
4002a230: a94153f3 ldp x19, x20, [sp, #16]
4002a234: a9425bf5 ldp x21, x22, [sp, #32]
4002a238: a8c57bfd ldp x29, x30, [sp], #80
4002a23c: d65f03c0 ret
stack_end = stack_begin + config->stack_size;
4002a240: f9400a96 ldr x22, [x20, #16]
4002a244: f9001bf7 str x23, [sp, #48]
stack_begin = config->stack_area;
4002a248: f9400697 ldr x23, [x20, #8]
stack_end = stack_begin + config->stack_size;
4002a24c: 8b1602f6 add x22, x23, x22
tls_size = _TLS_Get_allocation_size();
4002a250: 940000f8 bl 4002a630 <_TLS_Get_allocation_size>
if ( tls_size > 0 ) {
4002a254: b4000120 cbz x0, 4002a278 <_Thread_Initialize+0xc8>
tls_align = (uintptr_t) _TLS_Alignment;
4002a258: d0dffea1 adrp x1, 0 <HeapSize>
4002a25c: 91000421 add x1, x1, #0x1
stack_end -= tls_size;
4002a260: cb0002d6 sub x22, x22, x0
( ( (uintptr_t) stack_end + tls_align - 1 ) & ~( tls_align - 1 ) );
4002a264: d1000420 sub x0, x1, #0x1
4002a268: 8b0002c0 add x0, x22, x0
4002a26c: cb0103e1 neg x1, x1
4002a270: 8a010001 and x1, x0, x1
the_thread->Start.tls_area = (void *)
4002a274: f900ae61 str x1, [x19, #344]
old_first = head->next;
4002a278: f9402ea0 ldr x0, [x21, #88]
stack_end - stack_begin
4002a27c: cb1702d6 sub x22, x22, x23
the_thread->Start.budget_algorithm = config->budget_algorithm;
4002a280: b9402a82 ldr w2, [x20, #40]
RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state;
4002a284: 52800046 mov w6, #0x2 // #2
the_thread->Start.budget_callout = config->budget_callout;
4002a288: f9401a85 ldr x5, [x20, #48]
head->next = tail;
4002a28c: 91012004 add x4, x0, #0x48
new_first = old_first->next;
4002a290: f9400001 ldr x1, [x0]
the_stack->area = starting_address;
4002a294: a914de76 stp x22, x23, [x19, #328]
return &the_chain->Head.Node;
4002a298: 910162b6 add x22, x21, #0x58
head->next = new_first;
4002a29c: f9002ea1 str x1, [x21, #88]
return &the_chain->Tail.Node;
4002a2a0: 91014003 add x3, x0, #0x50
new_first->previous = head;
4002a2a4: f9000436 str x22, [x1, #8]
timer->header = &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_TICKS ];
4002a2a8: f00006c1 adrp x1, 40105000 <Arr_2_Glob+0x1e68>
4002a2ac: 912a0021 add x1, x1, #0xa80
the_thread->Wait.spare_heads = _Freechain_Pop(
4002a2b0: f9005660 str x0, [x19, #168]
head->previous = NULL;
4002a2b4: a904fc03 stp x3, xzr, [x0, #72]
switch ( config->budget_algorithm ) {
4002a2b8: 6b06005f cmp w2, w6
the_thread->Start.is_preemptible = config->is_preemptible;
4002a2bc: 39411683 ldrb w3, [x20, #69]
tail->previous = head;
4002a2c0: f9002c04 str x4, [x0, #88]
the_thread->is_fp = config->is_fp;
4002a2c4: 39411284 ldrb w4, [x20, #68]
the_thread->Start.isr_level = config->isr_level;
4002a2c8: b9404280 ldr w0, [x20, #64]
4002a2cc: f9005a61 str x1, [x19, #176]
4002a2d0: b900d266 str w6, [x19, #208]
the_thread->is_fp = config->is_fp;
4002a2d4: 3903aa64 strb w4, [x19, #234]
the_thread->Start.is_preemptible = config->is_preemptible;
4002a2d8: 39048263 strb w3, [x19, #288]
the_thread->Start.budget_algorithm = config->budget_algorithm;
4002a2dc: b9012662 str w2, [x19, #292]
the_thread->Start.budget_callout = config->budget_callout;
4002a2e0: f9009665 str x5, [x19, #296]
the_thread->Start.isr_level = config->isr_level;
4002a2e4: b9013260 str w0, [x19, #304]
switch ( config->budget_algorithm ) {
4002a2e8: 54000081 b.ne 4002a2f8 <_Thread_Initialize+0x148> // b.any
the_thread->cpu_time_budget =
4002a2ec: d0000080 adrp x0, 4003c000 <_Scheduler_Table+0x48>
4002a2f0: b94e9000 ldr w0, [x0, #3728]
4002a2f4: b900ee60 str w0, [x19, #236]
config->scheduler,
4002a2f8: f9400280 ldr x0, [x20]
( *scheduler->Operations.node_initialize )(
4002a2fc: aa1303e2 mov x2, x19
4002a300: f9401283 ldr x3, [x20, #32]
4002a304: f9402404 ldr x4, [x0, #72]
return the_thread->Scheduler.nodes;
4002a308: f9403677 ldr x23, [x19, #104]
4002a30c: aa1703e1 mov x1, x23
4002a310: d63f0080 blr x4
_Priority_Node_initialize( &the_thread->Real_priority, config->priority );
4002a314: f9401286 ldr x6, [x20, #32]
node->priority = priority;
4002a318: f9003266 str x6, [x19, #96]
information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object;
4002a31c: 79402265 ldrh w5, [x19, #16]
4002a320: 91010260 add x0, x19, #0x40
RB_ROOT( the_rbtree ) = the_node;
4002a324: a90282e6 stp x6, x0, [x23, #40]
return &the_chain->Tail.Node;
4002a328: 9105a263 add x3, x19, #0x168
4002a32c: 510004a5 sub w5, w5, #0x1
the_thread->Start.initial_priority = config->priority;
4002a330: f9009e66 str x6, [x19, #312]
head->next = tail;
4002a334: 91058264 add x4, x19, #0x160
4002a338: f94006a6 ldr x6, [x21, #8]
4002a33c: f900b263 str x3, [x19, #352]
4002a340: f9401e83 ldr x3, [x20, #56]
the_thread->current_state = STATES_DORMANT;
4002a344: 52b00009 mov w9, #0x80000000 // #-2147483648
the_thread->Wait.operations = &_Thread_queue_Operations_default;
4002a348: d0000087 adrp x7, 4003c000 <_Scheduler_Table+0x48>
4002a34c: 913860e7 add x7, x7, #0xe18
the_object->name = name;
4002a350: f9000e63 str x3, [x19, #24]
User_extensions_Thread_create_context ctx = { created, true };
4002a354: 52800028 mov w8, #0x1 // #1
the_thread->current_state = STATES_DORMANT;
4002a358: b9003a69 str w9, [x19, #56]
_User_extensions_Iterate(
4002a35c: 910103e0 add x0, sp, #0x40
RB_RIGHT( the_node, Node ) = NULL;
4002a360: a9047e7f stp xzr, xzr, [x19, #64]
4002a364: b0ffffe1 adrp x1, 40027000 <_Thread_queue_Priority_enqueue+0xa0>
4002a368: 52800002 mov w2, #0x0 // #0
RB_PARENT( the_node, Node ) = NULL;
4002a36c: f9002a7f str xzr, [x19, #80]
4002a370: 9125c021 add x1, x1, #0x970
RB_COLOR( the_node, Node ) = RB_BLACK;
4002a374: b9005a7f str wzr, [x19, #88]
the_thread->Wait.operations = &_Thread_queue_Operations_default;
4002a378: f9005267 str x7, [x19, #160]
tail->previous = head;
4002a37c: a916927f stp xzr, x4, [x19, #360]
RB_INIT( the_rbtree );
4002a380: f901267f str xzr, [x19, #584]
information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object;
4002a384: f82578d3 str x19, [x6, x5, lsl #3]
User_extensions_Thread_create_context ctx = { created, true };
4002a388: f90023f3 str x19, [sp, #64]
4002a38c: 390123e8 strb w8, [sp, #72]
_User_extensions_Iterate(
4002a390: 97fff5c4 bl 40027aa0 <_User_extensions_Iterate>
return ctx.ok;
4002a394: 394123e0 ldrb w0, [sp, #72]
if ( extension_status )
4002a398: 350001c0 cbnz w0, 4002a3d0 <_Thread_Initialize+0x220>
_Scheduler_Node_destroy( config->scheduler, scheduler_node );
4002a39c: f9400280 ldr x0, [x20]
( *scheduler->Operations.node_destroy )( scheduler, node );
4002a3a0: aa1703e1 mov x1, x23
4002a3a4: f9402802 ldr x2, [x0, #80]
4002a3a8: d63f0040 blr x2
the_thread->Wait.spare_heads
4002a3ac: f9405660 ldr x0, [x19, #168]
before_node = after_node->next;
4002a3b0: f9402ea2 ldr x2, [x21, #88]
before_node->previous = the_node;
4002a3b4: f9401bf7 ldr x23, [sp, #48]
( *the_thread->Start.stack_free )( the_thread->Start.Initial_stack.area );
4002a3b8: f940a261 ldr x1, [x19, #320]
the_node->previous = after_node;
4002a3bc: f9000416 str x22, [x0, #8]
after_node->next = the_node;
4002a3c0: f9002ea0 str x0, [x21, #88]
the_node->next = before_node;
4002a3c4: f9000002 str x2, [x0]
before_node->previous = the_node;
4002a3c8: f9000440 str x0, [x2, #8]
void *node
)
{
_Chain_Initialize_node( node );
_Chain_Prepend_unprotected( &freechain->Free, node );
}
4002a3cc: 17ffff96 b 4002a224 <_Thread_Initialize+0x74>
}
4002a3d0: a94153f3 ldp x19, x20, [sp, #16]
4002a3d4: a9425bf5 ldp x21, x22, [sp, #32]
4002a3d8: f9401bf7 ldr x23, [sp, #48]
4002a3dc: a8c57bfd ldp x29, x30, [sp], #80
4002a3e0: d65f03c0 ret
...
000000004002a4a0 <_Thread_Iterate>:
void _Thread_Iterate(
Thread_Visitor visitor,
void *arg
)
{
4002a4a0: a9bb7bfd stp x29, x30, [sp, #-80]!
4002a4a4: 910003fd mov x29, sp
4002a4a8: a9025bf5 stp x21, x22, [sp, #32]
4002a4ac: aa0003f6 mov x22, x0
4002a4b0: a90363f7 stp x23, x24, [sp, #48]
4002a4b4: f00000b8 adrp x24, 40041000 <status_code_text+0x98>
4002a4b8: 9109c318 add x24, x24, #0x270
4002a4bc: f90023f9 str x25, [sp, #64]
4002a4c0: aa0103f9 mov x25, x1
4002a4c4: d2800037 mov x23, #0x1 // #1
4002a4c8: a90153f3 stp x19, x20, [sp, #16]
const Objects_Information *information;
Objects_Maximum maximum;
Objects_Maximum index;
_Assert( _Objects_Information_table[ api_index ] != NULL );
information = _Objects_Information_table[ api_index ][ 1 ];
4002a4cc: f8777b00 ldr x0, [x24, x23, lsl #3]
4002a4d0: f9400414 ldr x20, [x0, #8]
if ( information == NULL ) {
4002a4d4: b40001f4 cbz x20, 4002a510 <_Thread_Iterate+0x70>
(Objects_Maximum)((id >> OBJECTS_INDEX_START_BIT) &
4002a4d8: 79400295 ldrh w21, [x20]
continue;
}
maximum = _Objects_Get_maximum_index( information );
for ( index = 0 ; index < maximum ; ++index ) {
4002a4dc: 340001b5 cbz w21, 4002a510 <_Thread_Iterate+0x70> <== NEVER TAKEN
4002a4e0: d37d3eb5 ubfiz x21, x21, #3, #16
4002a4e4: d2800013 mov x19, #0x0 // #0
Thread_Control *the_thread;
the_thread = (Thread_Control *) information->local_table[ index ];
4002a4e8: f9400682 ldr x2, [x20, #8]
if ( the_thread != NULL ) {
bool done;
done = (* visitor )( the_thread, arg );
4002a4ec: aa1903e1 mov x1, x25
the_thread = (Thread_Control *) information->local_table[ index ];
4002a4f0: f8736840 ldr x0, [x2, x19]
for ( index = 0 ; index < maximum ; ++index ) {
4002a4f4: 91002273 add x19, x19, #0x8
if ( the_thread != NULL ) {
4002a4f8: b4000080 cbz x0, 4002a508 <_Thread_Iterate+0x68>
done = (* visitor )( the_thread, arg );
4002a4fc: d63f02c0 blr x22
if ( done ) {
4002a500: 72001c1f tst w0, #0xff
4002a504: 540000c1 b.ne 4002a51c <_Thread_Iterate+0x7c> // b.any <== NEVER TAKEN
for ( index = 0 ; index < maximum ; ++index ) {
4002a508: eb1302bf cmp x21, x19
4002a50c: 54fffee1 b.ne 4002a4e8 <_Thread_Iterate+0x48> // b.any
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; ++api_index ) {
4002a510: 910006f7 add x23, x23, #0x1
4002a514: f10012ff cmp x23, #0x4
4002a518: 54fffda1 b.ne 4002a4cc <_Thread_Iterate+0x2c> // b.any
return;
}
}
}
}
}
4002a51c: a94153f3 ldp x19, x20, [sp, #16]
4002a520: a9425bf5 ldp x21, x22, [sp, #32]
4002a524: a94363f7 ldp x23, x24, [sp, #48]
4002a528: f94023f9 ldr x25, [sp, #64]
4002a52c: a8c57bfd ldp x29, x30, [sp], #80
4002a530: d65f03c0 ret
...
0000000040027450 <_Thread_Kill_zombies>:
{
40027450: a9bc7bfd stp x29, x30, [sp, #-64]!
40027454: 910003fd mov x29, sp
40027458: a90153f3 stp x19, x20, [sp, #16]
4002745c: a9025bf5 stp x21, x22, [sp, #32]
40027460: a90363f7 stp x23, x24, [sp, #48]
__asm__ volatile (
40027464: d53b4220 mrs x0, daif
40027468: d50342df msr daifset, #0x2
return _Chain_Immutable_head( the_chain )->next;
4002746c: b00006c1 adrp x1, 40100000 <_RTEMS_tasks_Information>
40027470: 910f6035 add x21, x1, #0x3d8
if ( !_Chain_Is_empty(the_chain))
40027474: 910022b8 add x24, x21, #0x8
return _Chain_Immutable_head( the_chain )->next;
40027478: f941ec33 ldr x19, [x1, #984]
if ( !_Chain_Is_empty(the_chain))
4002747c: eb18027f cmp x19, x24
40027480: 54000700 b.eq 40027560 <_Thread_Kill_zombies+0x110> // b.none
new_first = old_first->next;
40027484: f9400262 ldr x2, [x19]
head->next = new_first;
40027488: 90000017 adrp x23, 40027000 <_Thread_queue_Priority_enqueue+0xa0>
4002748c: 9126c2f7 add x23, x23, #0x9b0
40027490: 900000b6 adrp x22, 4003b000 <__sfvwrite_r+0x5d4>
40027494: 913ee2d6 add x22, x22, #0xfb8
40027498: f901ec22 str x2, [x1, #984]
new_first->previous = head;
4002749c: f9000455 str x21, [x2, #8]
_ISR_lock_Release_and_ISR_enable( &zombies->Lock, &lock_context );
400274a0: 2a0003e0 mov w0, w0
__asm__ volatile (
400274a4: d51b4220 msr daif, x0
_Objects_Get_information_id( the_thread->Object.id );
400274a8: b9401260 ldr w0, [x19, #16]
400274ac: 94000831 bl 40029570 <_Objects_Get_information_id>
400274b0: aa0003f4 mov x20, x0
_User_extensions_Iterate(
400274b4: aa1703e1 mov x1, x23
400274b8: aa1303e0 mov x0, x19
400274bc: 52800022 mov w2, #0x1 // #1
400274c0: 94000178 bl 40027aa0 <_User_extensions_Iterate>
__asm__ volatile (
400274c4: d53b4220 mrs x0, daif
400274c8: d50342df msr daifset, #0x2
iter = the_thread->last_user_extensions_iterator;
400274cc: f9414e61 ldr x1, [x19, #664]
while ( iter != NULL ) {
400274d0: b40000e1 cbz x1, 400274ec <_Thread_Kill_zombies+0x9c>
400274d4: d503201f nop
previous = the_node->previous;
400274d8: a9400823 ldp x3, x2, [x1]
iter = iter->previous;
400274dc: f9401021 ldr x1, [x1, #32]
next->previous = previous;
400274e0: f9000462 str x2, [x3, #8]
previous->next = next;
400274e4: f9000043 str x3, [x2]
while ( iter != NULL ) {
400274e8: b5ffff81 cbnz x1, 400274d8 <_Thread_Kill_zombies+0x88> <== NEVER TAKEN
__asm__ volatile (
400274ec: 92407c00 and x0, x0, #0xffffffff
400274f0: d51b4220 msr daif, x0
( *scheduler->Operations.node_destroy )( scheduler, node );
400274f4: f9402ac2 ldr x2, [x22, #80]
400274f8: aa1603e0 mov x0, x22
400274fc: f9403661 ldr x1, [x19, #104]
40027500: d63f0040 blr x2
the_thread->Wait.spare_heads
40027504: f9405661 ldr x1, [x19, #168]
return &the_chain->Head.Node;
40027508: 91016280 add x0, x20, #0x58
before_node = after_node->next;
4002750c: f9402e82 ldr x2, [x20, #88]
( *the_thread->Start.stack_free )( the_thread->Start.Initial_stack.area );
40027510: f940a263 ldr x3, [x19, #320]
the_node->previous = after_node;
40027514: f9000420 str x0, [x1, #8]
40027518: f940aa60 ldr x0, [x19, #336]
after_node->next = the_node;
4002751c: f9002e81 str x1, [x20, #88]
the_node->next = before_node;
40027520: f9000022 str x2, [x1]
before_node->previous = the_node;
40027524: f9000441 str x1, [x2, #8]
40027528: d63f0060 blr x3
Objects_Control *the_object
)
{
_Assert( _Objects_Allocator_is_owner() );
_Assert( information->deallocate != NULL );
( *information->deallocate )( information, the_object );
4002752c: f9400e82 ldr x2, [x20, #24]
40027530: aa1303e1 mov x1, x19
40027534: aa1403e0 mov x0, x20
40027538: d63f0040 blr x2
__asm__ volatile (
4002753c: d53b4220 mrs x0, daif
40027540: d50342df msr daifset, #0x2
return _Chain_Immutable_head( the_chain )->next;
40027544: f94002b3 ldr x19, [x21]
if ( !_Chain_Is_empty(the_chain))
40027548: eb18027f cmp x19, x24
4002754c: 540000a0 b.eq 40027560 <_Thread_Kill_zombies+0x110> // b.none
new_first = old_first->next;
40027550: f9400261 ldr x1, [x19]
head->next = new_first;
40027554: f90002a1 str x1, [x21]
new_first->previous = head;
40027558: f9000435 str x21, [x1, #8]
4002755c: 17ffffd1 b 400274a0 <_Thread_Kill_zombies+0x50>
_ISR_lock_Release_and_ISR_enable( &zombies->Lock, &lock_context );
40027560: 2a0003e0 mov w0, w0
__asm__ volatile (
40027564: d51b4220 msr daif, x0
}
40027568: a94153f3 ldp x19, x20, [sp, #16]
4002756c: a9425bf5 ldp x21, x22, [sp, #32]
40027570: a94363f7 ldp x23, x24, [sp, #48]
40027574: a8c47bfd ldp x29, x30, [sp], #64
40027578: d65f03c0 ret
4002757c: 00000000 udf #0
000000004002c870 <_Thread_Priority_add>:
void _Thread_Priority_add(
Thread_Control *the_thread,
Priority_Node *priority_node,
Thread_queue_Context *queue_context
)
{
4002c870: a9bd7bfd stp x29, x30, [sp, #-48]!
_Thread_Priority_do_perform_actions(
4002c874: aa0203e4 mov x4, x2
4002c878: 52800003 mov w3, #0x0 // #0
{
4002c87c: 910003fd mov x29, sp
return the_thread->Scheduler.nodes;
4002c880: f9403405 ldr x5, [x0, #104]
4002c884: a90153f3 stp x19, x20, [sp, #16]
4002c888: aa0203f3 mov x19, x2
_Thread_Priority_do_perform_actions(
4002c88c: a9498814 ldp x20, x2, [x0, #152]
aggregation->Action.node = node;
4002c890: 910020a5 add x5, x5, #0x8
4002c894: f90018a1 str x1, [x5, #48]
aggregation->Action.type = type;
4002c898: b90038bf str wzr, [x5, #56]
actions->actions = aggregation;
4002c89c: f9000e65 str x5, [x19, #24]
4002c8a0: aa1403e1 mov x1, x20
4002c8a4: 97ffff5f bl 4002c620 <_Thread_Priority_do_perform_actions>
if ( !_Priority_Actions_is_empty( &queue_context->Priority.Actions ) ) {
4002c8a8: f9400e60 ldr x0, [x19, #24]
4002c8ac: b40001e0 cbz x0, 4002c8e8 <_Thread_Priority_add+0x78> <== ALWAYS TAKEN
_Thread_Priority_perform_actions( queue->owner, queue_context );
4002c8b0: f9400680 ldr x0, [x20, #8] <== NOT EXECUTED
return queue_context->Priority.update_count;
4002c8b4: f90013f5 str x21, [sp, #32] <== NOT EXECUTED
4002c8b8: f9401275 ldr x21, [x19, #32] <== NOT EXECUTED
4002c8bc: 14000003 b 4002c8c8 <_Thread_Priority_add+0x58> <== NOT EXECUTED
the_thread = queue->owner;
4002c8c0: f9400680 ldr x0, [x20, #8] <== NOT EXECUTED
queue_context->Priority.update_count = update_count;
4002c8c4: f9001275 str x21, [x19, #32] <== NOT EXECUTED
_Thread_Priority_do_perform_actions(
4002c8c8: a9498814 ldp x20, x2, [x0, #152] <== NOT EXECUTED
4002c8cc: aa1303e4 mov x4, x19 <== NOT EXECUTED
4002c8d0: 52800003 mov w3, #0x0 // #0 <== NOT EXECUTED
4002c8d4: aa1403e1 mov x1, x20 <== NOT EXECUTED
4002c8d8: 97ffff52 bl 4002c620 <_Thread_Priority_do_perform_actions> <== NOT EXECUTED
if ( _Priority_Actions_is_empty( &queue_context->Priority.Actions ) ) {
4002c8dc: f9400e60 ldr x0, [x19, #24] <== NOT EXECUTED
4002c8e0: b5ffff00 cbnz x0, 4002c8c0 <_Thread_Priority_add+0x50> <== NOT EXECUTED
4002c8e4: f94013f5 ldr x21, [sp, #32] <== NOT EXECUTED
priority_node,
queue_context,
false,
PRIORITY_ACTION_ADD
);
}
4002c8e8: a94153f3 ldp x19, x20, [sp, #16]
4002c8ec: a8c37bfd ldp x29, x30, [sp], #48
4002c8f0: d65f03c0 ret
...
000000004002c900 <_Thread_Priority_remove>:
void _Thread_Priority_remove(
Thread_Control *the_thread,
Priority_Node *priority_node,
Thread_queue_Context *queue_context
)
{
4002c900: a9bd7bfd stp x29, x30, [sp, #-48]!
_Thread_Priority_do_perform_actions(
4002c904: aa0203e4 mov x4, x2
aggregation->Action.type = type;
4002c908: 52800047 mov w7, #0x2 // #2
{
4002c90c: 910003fd mov x29, sp
4002c910: f9403405 ldr x5, [x0, #104]
4002c914: a90153f3 stp x19, x20, [sp, #16]
4002c918: aa0203f3 mov x19, x2
_Thread_Priority_do_perform_actions(
4002c91c: a9498814 ldp x20, x2, [x0, #152]
aggregation->Action.node = node;
4002c920: 910020a5 add x5, x5, #0x8
4002c924: f90018a1 str x1, [x5, #48]
4002c928: 52800023 mov w3, #0x1 // #1
aggregation->Action.type = type;
4002c92c: b90038a7 str w7, [x5, #56]
actions->actions = aggregation;
4002c930: f9000e65 str x5, [x19, #24]
4002c934: aa1403e1 mov x1, x20
4002c938: 97ffff3a bl 4002c620 <_Thread_Priority_do_perform_actions>
if ( !_Priority_Actions_is_empty( &queue_context->Priority.Actions ) ) {
4002c93c: f9400e60 ldr x0, [x19, #24]
4002c940: b40001e0 cbz x0, 4002c97c <_Thread_Priority_remove+0x7c> <== ALWAYS TAKEN
_Thread_Priority_perform_actions( queue->owner, queue_context );
4002c944: f9400680 ldr x0, [x20, #8] <== NOT EXECUTED
return queue_context->Priority.update_count;
4002c948: f90013f5 str x21, [sp, #32] <== NOT EXECUTED
4002c94c: f9401275 ldr x21, [x19, #32] <== NOT EXECUTED
4002c950: 14000003 b 4002c95c <_Thread_Priority_remove+0x5c> <== NOT EXECUTED
the_thread = queue->owner;
4002c954: f9400680 ldr x0, [x20, #8] <== NOT EXECUTED
queue_context->Priority.update_count = update_count;
4002c958: f9001275 str x21, [x19, #32] <== NOT EXECUTED
_Thread_Priority_do_perform_actions(
4002c95c: a9498814 ldp x20, x2, [x0, #152] <== NOT EXECUTED
4002c960: aa1303e4 mov x4, x19 <== NOT EXECUTED
4002c964: 52800003 mov w3, #0x0 // #0 <== NOT EXECUTED
4002c968: aa1403e1 mov x1, x20 <== NOT EXECUTED
4002c96c: 97ffff2d bl 4002c620 <_Thread_Priority_do_perform_actions> <== NOT EXECUTED
if ( _Priority_Actions_is_empty( &queue_context->Priority.Actions ) ) {
4002c970: f9400e60 ldr x0, [x19, #24] <== NOT EXECUTED
4002c974: b5ffff00 cbnz x0, 4002c954 <_Thread_Priority_remove+0x54> <== NOT EXECUTED
4002c978: f94013f5 ldr x21, [sp, #32] <== NOT EXECUTED
priority_node,
queue_context,
true,
PRIORITY_ACTION_REMOVE
);
}
4002c97c: a94153f3 ldp x19, x20, [sp, #16]
4002c980: a8c37bfd ldp x29, x30, [sp], #48
4002c984: d65f03c0 ret
...
0000000040025d60 <_Thread_Restart_other>:
bool _Thread_Restart_other(
Thread_Control *the_thread,
const Thread_Entry_information *entry,
ISR_lock_Context *lock_context
)
{
40025d60: a9bd7bfd stp x29, x30, [sp, #-48]!
40025d64: 910003fd mov x29, sp
Thread_Life_state previous;
Per_CPU_Control *cpu_self;
_Thread_State_acquire_critical( the_thread, lock_context );
if ( _States_Is_dormant( the_thread->current_state ) ) {
40025d68: b9403803 ldr w3, [x0, #56]
{
40025d6c: a9025bf5 stp x21, x22, [sp, #32]
40025d70: aa0203f5 mov x21, x2
if ( _States_Is_dormant( the_thread->current_state ) ) {
40025d74: 37f809c3 tbnz w3, #31, 40025eac <_Thread_Restart_other+0x14c>
_Thread_State_release( the_thread, lock_context );
return false;
}
the_thread->Start.Entry = *entry;
40025d78: a90153f3 stp x19, x20, [sp, #16]
if (
40025d7c: 52800125 mov w5, #0x9 // #9
40025d80: aa0003f3 mov x19, x0
the_thread->Start.Entry = *entry;
40025d84: f9400023 ldr x3, [x1]
40025d88: f9008403 str x3, [x0, #264]
previous = the_thread->Life.state;
40025d8c: b9426803 ldr w3, [x0, #616]
the_thread->Start.Entry = *entry;
40025d90: f9400424 ldr x4, [x1, #8]
40025d94: f9008804 str x4, [x0, #272]
state |= set;
40025d98: 321f0064 orr w4, w3, #0x2
if (
40025d9c: 6a05007f tst w3, w5
the_thread->Start.Entry = *entry;
40025da0: f9400821 ldr x1, [x1, #16]
40025da4: f9008c01 str x1, [x0, #280]
the_thread->Life.state = state;
40025da8: b9026804 str w4, [x0, #616]
if (
40025dac: 54000220 b.eq 40025df0 <_Thread_Restart_other+0x90> // b.none <== ALWAYS TAKEN
disable_level = cpu_self->thread_dispatch_disable_level;
40025db0: d00006f4 adrp x20, 40103000 <_RTEMS_tasks_Objects+0x590> <== NOT EXECUTED
40025db4: 91230294 add x20, x20, #0x8c0 <== NOT EXECUTED
_Thread_Finalize_life_change(
the_thread,
the_thread->Start.initial_priority
);
} else {
_Thread_Clear_state_locked( the_thread, STATES_SUSPENDED );
40025db8: 52900001 mov w1, #0x8000 // #32768 <== NOT EXECUTED
40025dbc: b9401a82 ldr w2, [x20, #24] <== NOT EXECUTED
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40025dc0: 11000442 add w2, w2, #0x1 <== NOT EXECUTED
40025dc4: b9001a82 str w2, [x20, #24] <== NOT EXECUTED
40025dc8: 94000dba bl 400294b0 <_Thread_Clear_state_locked> <== NOT EXECUTED
_ISR_lock_ISR_enable( lock_context );
40025dcc: b94002a0 ldr w0, [x21] <== NOT EXECUTED
40025dd0: d51b4220 msr daif, x0 <== NOT EXECUTED
_Thread_State_release( the_thread, lock_context );
}
_Thread_Dispatch_enable( cpu_self );
40025dd4: aa1403e0 mov x0, x20
40025dd8: 97fffdd2 bl 40025520 <_Thread_Dispatch_enable>
return true;
40025ddc: 52800020 mov w0, #0x1 // #1
40025de0: a94153f3 ldp x19, x20, [sp, #16]
}
40025de4: a9425bf5 ldp x21, x22, [sp, #32]
40025de8: a8c37bfd ldp x29, x30, [sp], #48
40025dec: d65f03c0 ret
the_thread->is_preemptible = the_thread->Start.is_preemptible;
40025df0: 39448002 ldrb w2, [x0, #288]
cpu_self->dispatch_necessary = true;
40025df4: d00006f4 adrp x20, 40103000 <_RTEMS_tasks_Objects+0x590>
40025df8: 91230294 add x20, x20, #0x8c0
40025dfc: 3903a662 strb w2, [x19, #233]
the_thread->budget_callout = the_thread->Start.budget_callout;
40025e00: f9409662 ldr x2, [x19, #296]
40025e04: f9007e62 str x2, [x19, #248]
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
40025e08: b9412663 ldr w3, [x19, #292]
action->handler = handler;
40025e0c: 91094001 add x1, x0, #0x250
if ( _Chain_Is_node_off_chain( the_node ) ) {
40025e10: f9412a62 ldr x2, [x19, #592]
40025e14: 90000000 adrp x0, 40025000 <_Thread_Priority_do_perform_actions+0xd0>
40025e18: 91210000 add x0, x0, #0x840
40025e1c: b900f263 str w3, [x19, #240]
40025e20: f9013260 str x0, [x19, #608]
40025e24: 52800023 mov w3, #0x1 // #1
40025e28: 39007283 strb w3, [x20, #28]
40025e2c: b40005e2 cbz x2, 40025ee8 <_Thread_Restart_other+0x188> <== ALWAYS TAKEN
disable_level = cpu_self->thread_dispatch_disable_level;
40025e30: b9401a80 ldr w0, [x20, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40025e34: 11000400 add w0, w0, #0x1
40025e38: b9001a80 str w0, [x20, #24]
pending_requests = the_thread->Life.pending_life_change_requests;
40025e3c: b9426e60 ldr w0, [x19, #620]
the_thread->Life.pending_life_change_requests = pending_requests + 1;
40025e40: 11000401 add w1, w0, #0x1
40025e44: b9026e61 str w1, [x19, #620]
if ( pending_requests == 0 ) {
40025e48: 340003e0 cbz w0, 40025ec4 <_Thread_Restart_other+0x164> <== ALWAYS TAKEN
_ISR_lock_ISR_enable( lock_context );
40025e4c: b94002a0 ldr w0, [x21]
40025e50: d51b4220 msr daif, x0
_Thread_queue_Extract_with_proxy( the_thread );
40025e54: aa1303e0 mov x0, x19
_Thread_Finalize_life_change(
40025e58: f9409e76 ldr x22, [x19, #312]
_Thread_queue_Extract_with_proxy( the_thread );
40025e5c: 94000fb1 bl 40029d20 <_Thread_queue_Extract_with_proxy>
__asm__ volatile (
40025e60: d53b4235 mrs x21, daif
40025e64: d50342df msr daifset, #0x2
40025e68: f9405a60 ldr x0, [x19, #176]
40025e6c: 9102e261 add x1, x19, #0xb8
40025e70: 94000268 bl 40026810 <_Watchdog_Remove>
__asm__ volatile (
40025e74: 92407eb5 and x21, x21, #0xffffffff
40025e78: d51b4235 msr daif, x21
_Thread_Raise_real_priority( the_thread, priority );
40025e7c: aa1603e1 mov x1, x22
40025e80: aa1303e0 mov x0, x19
40025e84: 97fffdff bl 40025680 <_Thread_Raise_real_priority>
__asm__ volatile (
40025e88: d53b4235 mrs x21, daif
40025e8c: d50342df msr daifset, #0x2
pending_requests = the_thread->Life.pending_life_change_requests;
40025e90: b9426e60 ldr w0, [x19, #620]
if ( pending_requests == 1 ) {
40025e94: 71000401 subs w1, w0, #0x1
the_thread->Life.pending_life_change_requests = pending_requests - 1;
40025e98: b9026e61 str w1, [x19, #620]
if ( pending_requests == 1 ) {
40025e9c: 540001c0 b.eq 40025ed4 <_Thread_Restart_other+0x174> // b.none <== ALWAYS TAKEN
__asm__ volatile (
40025ea0: 92407eb5 and x21, x21, #0xffffffff
40025ea4: d51b4235 msr daif, x21
}
40025ea8: 17ffffcb b 40025dd4 <_Thread_Restart_other+0x74>
40025eac: b9400040 ldr w0, [x2]
40025eb0: d51b4220 msr daif, x0
return false;
40025eb4: 52800000 mov w0, #0x0 // #0
}
40025eb8: a9425bf5 ldp x21, x22, [sp, #32]
40025ebc: a8c37bfd ldp x29, x30, [sp], #48
40025ec0: d65f03c0 ret
_Thread_Set_state_locked( the_thread, STATES_LIFE_IS_CHANGING );
40025ec4: aa1303e0 mov x0, x19
40025ec8: 52a00041 mov w1, #0x20000 // #131072
40025ecc: 9400006d bl 40026080 <_Thread_Set_state_locked>
40025ed0: 17ffffdf b 40025e4c <_Thread_Restart_other+0xec>
_Thread_Clear_state_locked(
40025ed4: aa1303e0 mov x0, x19
40025ed8: 52906181 mov w1, #0x830c // #33548
40025edc: 72a60041 movk w1, #0x3002, lsl #16
40025ee0: 94000d74 bl 400294b0 <_Thread_Clear_state_locked>
40025ee4: 17ffffef b 40025ea0 <_Thread_Restart_other+0x140>
old_last = tail->previous;
40025ee8: f940ba62 ldr x2, [x19, #368]
40025eec: 9105a260 add x0, x19, #0x168
tail->previous = the_node;
40025ef0: f900ba61 str x1, [x19, #368]
the_node->next = tail;
40025ef4: f9012a60 str x0, [x19, #592]
old_last->next = the_node;
40025ef8: f9000041 str x1, [x2]
the_node->previous = old_last;
40025efc: f9012e62 str x2, [x19, #600]
}
40025f00: 17ffffcc b 40025e30 <_Thread_Restart_other+0xd0>
...
0000000040027580 <_Thread_Set_life_protection>:
return previous;
}
Thread_Life_state _Thread_Set_life_protection( Thread_Life_state state )
{
40027580: a9be7bfd stp x29, x30, [sp, #-32]!
40027584: 2a0003e3 mov w3, w0
40027588: 910003fd mov x29, sp
4002758c: f9000bf3 str x19, [sp, #16]
__asm__ volatile (
40027590: d53b4222 mrs x2, daif
40027594: d50342df msr daifset, #0x2
40027598: d00006e1 adrp x1, 40105000 <Arr_2_Glob+0x1e68>
4002759c: 91290020 add x0, x1, #0xa40
& ( THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED ) ) == 0;
400275a0: 52800125 mov w5, #0x9 // #9
400275a4: f9401001 ldr x1, [x0, #32]
previous = the_thread->Life.state;
400275a8: b9426833 ldr w19, [x1, #616]
state |= set;
400275ac: 2a1303e4 mov w4, w19
400275b0: 33000064 bfxil w4, w3, #0, #1
the_thread->Life.state = state;
400275b4: b9026824 str w4, [x1, #616]
if (
400275b8: 6a05009f tst w4, w5
400275bc: 54000221 b.ne 40027600 <_Thread_Set_life_protection+0x80> // b.any
&& _Thread_Is_life_changing( state )
400275c0: 721f049f tst w4, #0x6
400275c4: 540001e0 b.eq 40027600 <_Thread_Set_life_protection+0x80> // b.none
the_thread->is_preemptible = the_thread->Start.is_preemptible;
400275c8: 39448025 ldrb w5, [x1, #288]
action->handler = handler;
400275cc: 90000003 adrp x3, 40027000 <_Thread_queue_Priority_enqueue+0xa0>
400275d0: 910c4063 add x3, x3, #0x310
400275d4: 3903a425 strb w5, [x1, #233]
the_thread->budget_callout = the_thread->Start.budget_callout;
400275d8: f9409425 ldr x5, [x1, #296]
400275dc: f9007c25 str x5, [x1, #248]
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
400275e0: b9412426 ldr w6, [x1, #292]
400275e4: 91094024 add x4, x1, #0x250
if ( _Chain_Is_node_off_chain( the_node ) ) {
400275e8: f9412825 ldr x5, [x1, #592]
400275ec: b900f026 str w6, [x1, #240]
400275f0: f9013023 str x3, [x1, #608]
cpu_self->dispatch_necessary = true;
400275f4: 52800026 mov w6, #0x1 // #1
400275f8: 39007006 strb w6, [x0, #28]
400275fc: b4000165 cbz x5, 40027628 <_Thread_Set_life_protection+0xa8> <== ALWAYS TAKEN
disable_level = cpu_self->thread_dispatch_disable_level;
40027600: b9401801 ldr w1, [x0, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40027604: 11000421 add w1, w1, #0x1
40027608: b9001801 str w1, [x0, #24]
__asm__ volatile (
4002760c: 92407c41 and x1, x2, #0xffffffff
40027610: d51b4221 msr daif, x1
_Thread_Dispatch_enable( cpu_self );
40027614: 97fffb63 bl 400263a0 <_Thread_Dispatch_enable>
return _Thread_Change_life(
THREAD_LIFE_PROTECTED,
state & THREAD_LIFE_PROTECTED,
0
);
}
40027618: 2a1303e0 mov w0, w19
4002761c: f9400bf3 ldr x19, [sp, #16]
40027620: a8c27bfd ldp x29, x30, [sp], #32
40027624: d65f03c0 ret
old_last = tail->previous;
40027628: f940b825 ldr x5, [x1, #368]
4002762c: 9105a023 add x3, x1, #0x168
tail->previous = the_node;
40027630: f900b824 str x4, [x1, #368]
the_node->next = tail;
40027634: f9012823 str x3, [x1, #592]
old_last->next = the_node;
40027638: f90000a4 str x4, [x5]
the_node->previous = old_last;
4002763c: f9012c25 str x5, [x1, #600]
}
40027640: 17fffff0 b 40027600 <_Thread_Set_life_protection+0x80>
...
00000000400285c0 <_Thread_Wait_get_id>:
if ( _States_Is_waiting_for_rpc_reply( the_thread->current_state ) ) {
return the_thread->Wait.remote_id;
}
#endif
queue = the_thread->Wait.queue;
400285c0: f9404c01 ldr x1, [x0, #152]
queue_object = THREAD_QUEUE_QUEUE_TO_OBJECT( queue );
return queue_object->Object.id;
}
return 0;
400285c4: 52800000 mov w0, #0x0 // #0
if ( queue != NULL && queue->name == _Thread_queue_Object_name ) {
400285c8: b40000e1 cbz x1, 400285e4 <_Thread_Wait_get_id+0x24>
400285cc: f9400823 ldr x3, [x1, #16]
400285d0: f0000062 adrp x2, 40037000 <_Heap_Resize_block+0x40>
400285d4: 9131c042 add x2, x2, #0xc70
return 0;
400285d8: 52800000 mov w0, #0x0 // #0
if ( queue != NULL && queue->name == _Thread_queue_Object_name ) {
400285dc: eb02007f cmp x3, x2
400285e0: 54000040 b.eq 400285e8 <_Thread_Wait_get_id+0x28> // b.none <== ALWAYS TAKEN
}
400285e4: d65f03c0 ret
return queue_object->Object.id;
400285e8: b85f0020 ldur w0, [x1, #-16]
}
400285ec: d65f03c0 ret
00000000400278a0 <_Thread_Yield>:
#include <rtems/score/threadimpl.h>
#include <rtems/score/schedulerimpl.h>
void _Thread_Yield( Thread_Control *executing )
{
400278a0: a9be7bfd stp x29, x30, [sp, #-32]!
400278a4: aa0003e1 mov x1, x0
400278a8: 910003fd mov x29, sp
400278ac: f9000bf3 str x19, [sp, #16]
__asm__ volatile (
400278b0: d53b4233 mrs x19, daif
400278b4: d50342df msr daifset, #0x2
ISR_lock_Context lock_context;
_Thread_State_acquire( executing, &lock_context );
if ( _States_Is_ready( executing->current_state ) ) {
400278b8: b9403800 ldr w0, [x0, #56]
400278bc: 350000c0 cbnz w0, 400278d4 <_Thread_Yield+0x34> <== NEVER TAKEN
( *scheduler->Operations.yield )(
400278c0: 900000a0 adrp x0, 4003b000 <__sfvwrite_r+0x5d4>
400278c4: 913ee000 add x0, x0, #0xfb8
400278c8: f9403422 ldr x2, [x1, #104]
400278cc: f9400c03 ldr x3, [x0, #24]
400278d0: d63f0060 blr x3
__asm__ volatile (
400278d4: 92407e73 and x19, x19, #0xffffffff
400278d8: d51b4233 msr daif, x19
_Scheduler_Yield( executing );
}
_Thread_State_release( executing, &lock_context );
}
400278dc: f9400bf3 ldr x19, [sp, #16]
400278e0: a8c27bfd ldp x29, x30, [sp], #32
400278e4: d65f03c0 ret
...
0000000040026580 <_Thread_queue_Enqueue>:
{
40026580: a9bd7bfd stp x29, x30, [sp, #-48]!
}
40026584: aa0003e4 mov x4, x0
40026588: 910003fd mov x29, sp
4002658c: a90153f3 stp x19, x20, [sp, #16]
40026590: aa0203f3 mov x19, x2
40026594: aa0303f4 mov x20, x3
40026598: a9025bf5 stp x21, x22, [sp, #32]
4002659c: aa0003f5 mov x21, x0
the_thread->Wait.queue = queue;
400265a0: f9004c40 str x0, [x2, #152]
}
400265a4: 14000004 b 400265b4 <_Thread_queue_Enqueue+0x34>
if ( owner == the_thread ) {
400265a8: 540008e0 b.eq 400266c4 <_Thread_queue_Enqueue+0x144> // b.none
queue = owner->Wait.queue;
400265ac: f9404c84 ldr x4, [x4, #152]
} while ( queue != NULL );
400265b0: b4000084 cbz x4, 400265c0 <_Thread_queue_Enqueue+0x40>
owner = queue->owner;
400265b4: f9400484 ldr x4, [x4, #8]
if ( owner == the_thread ) {
400265b8: eb04027f cmp x19, x4
if ( owner == NULL ) {
400265bc: b5ffff64 cbnz x4, 400265a8 <_Thread_queue_Enqueue+0x28>
( *operations->enqueue )( queue, the_thread, queue_context );
400265c0: f9400423 ldr x3, [x1, #8]
queue_context->Priority.update_count = 0;
400265c4: f900129f str xzr, [x20, #32]
the_thread->Wait.operations = operations;
400265c8: f9005261 str x1, [x19, #160]
400265cc: aa1503e0 mov x0, x21
400265d0: aa1403e2 mov x2, x20
400265d4: aa1303e1 mov x1, x19
disable_level = cpu_self->thread_dispatch_disable_level;
400265d8: f00006f6 adrp x22, 40105000 <Arr_2_Glob+0x1e68>
400265dc: 912902d6 add x22, x22, #0xa40
400265e0: d63f0060 blr x3
the_thread->Wait.flags = flags;
400265e4: 52808020 mov w0, #0x401 // #1025
400265e8: 2911827f stp wzr, w0, [x19, #140]
400265ec: b9401ac0 ldr w0, [x22, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
400265f0: 11000400 add w0, w0, #0x1
400265f4: b9001ac0 str w0, [x22, #24]
_ISR_lock_ISR_enable( lock_context );
400265f8: b9400280 ldr w0, [x20]
400265fc: d51b4220 msr daif, x0
( *queue_context->enqueue_callout )(
40026600: f9400684 ldr x4, [x20, #8]
40026604: aa1503e0 mov x0, x21
40026608: aa1403e3 mov x3, x20
4002660c: aa1603e2 mov x2, x22
40026610: aa1303e1 mov x1, x19
40026614: d63f0080 blr x4
_Thread_Set_state( the_thread, queue_context->thread_state );
40026618: b9400681 ldr w1, [x20, #4]
4002661c: aa1303e0 mov x0, x19
40026620: 94000420 bl 400276a0 <_Thread_Set_state>
__asm__ volatile (
40026624: d53b4220 mrs x0, daif
40026628: d50342df msr daifset, #0x2
bool success = ( the_thread->Wait.flags == expected_flags );
4002662c: b9409261 ldr w1, [x19, #144]
if ( success ) {
40026630: 7110043f cmp w1, #0x401
40026634: 54000180 b.eq 40026664 <_Thread_queue_Enqueue+0xe4> // b.none
__asm__ volatile (
40026638: 92407c00 and x0, x0, #0xffffffff
4002663c: d51b4220 msr daif, x0
if ( !success ) {
40026640: 7110043f cmp w1, #0x401
40026644: 540001c1 b.ne 4002667c <_Thread_queue_Enqueue+0xfc> // b.any <== ALWAYS TAKEN
_Thread_Priority_update( queue_context );
40026648: aa1403e0 mov x0, x20
4002664c: 94000e45 bl 40029f60 <_Thread_Priority_update>
_Thread_Dispatch_direct( cpu_self );
40026650: aa1603e0 mov x0, x22
}
40026654: a94153f3 ldp x19, x20, [sp, #16]
40026658: a9425bf5 ldp x21, x22, [sp, #32]
4002665c: a8c37bfd ldp x29, x30, [sp], #48
_Thread_Dispatch_direct( cpu_self );
40026660: 17ffff44 b 40026370 <_Thread_Dispatch_direct>
the_thread->Wait.flags = desired_flags;
40026664: 52808042 mov w2, #0x402 // #1026
40026668: b9009262 str w2, [x19, #144]
4002666c: 92407c00 and x0, x0, #0xffffffff
40026670: d51b4220 msr daif, x0
if ( !success ) {
40026674: 7110043f cmp w1, #0x401
40026678: 54fffe80 b.eq 40026648 <_Thread_queue_Enqueue+0xc8> // b.none <== ALWAYS TAKEN
__asm__ volatile (
4002667c: d53b4235 mrs x21, daif
40026680: d50342df msr daifset, #0x2
40026684: f9405a60 ldr x0, [x19, #176]
40026688: 9102e261 add x1, x19, #0xb8
4002668c: 94000589 bl 40027cb0 <_Watchdog_Remove>
__asm__ volatile (
40026690: 92407eb5 and x21, x21, #0xffffffff
40026694: d51b4235 msr daif, x21
_Thread_Clear_state( the_thread, STATES_BLOCKED );
40026698: 528bffe1 mov w1, #0x5fff // #24575
4002669c: 72a60021 movk w1, #0x3001, lsl #16
400266a0: aa1303e0 mov x0, x19
400266a4: 94000e5f bl 4002a020 <_Thread_Clear_state>
_Thread_Priority_update( queue_context );
400266a8: aa1403e0 mov x0, x20
400266ac: 94000e2d bl 40029f60 <_Thread_Priority_update>
_Thread_Dispatch_direct( cpu_self );
400266b0: aa1603e0 mov x0, x22
}
400266b4: a94153f3 ldp x19, x20, [sp, #16]
400266b8: a9425bf5 ldp x21, x22, [sp, #32]
400266bc: a8c37bfd ldp x29, x30, [sp], #48
_Thread_Dispatch_direct( cpu_self );
400266c0: 17ffff2c b 40026370 <_Thread_Dispatch_direct>
the_thread->Wait.operations = &_Thread_queue_Operations_default;
400266c4: d00000a0 adrp x0, 4003c000 <_Scheduler_Table+0x48>
400266c8: 91386000 add x0, x0, #0xe18
400266cc: a909827f stp xzr, x0, [x19, #152]
400266d0: b9400280 ldr w0, [x20]
400266d4: d51b4220 msr daif, x0
( *queue_context->deadlock_callout )( the_thread );
400266d8: aa1303e0 mov x0, x19
}
400266dc: a9425bf5 ldp x21, x22, [sp, #32]
( *queue_context->deadlock_callout )( the_thread );
400266e0: f9401e81 ldr x1, [x20, #56]
}
400266e4: a94153f3 ldp x19, x20, [sp, #16]
( *queue_context->deadlock_callout )( the_thread );
400266e8: aa0103f0 mov x16, x1
}
400266ec: a8c37bfd ldp x29, x30, [sp], #48
( *queue_context->deadlock_callout )( the_thread );
400266f0: d61f0200 br x16
...
0000000040026750 <_Thread_queue_Extract>:
&queue_context->Lock_context.Lock_context
);
}
void _Thread_queue_Extract( Thread_Control *the_thread )
{
40026750: a9ba7bfd stp x29, x30, [sp, #-96]!
40026754: 910003fd mov x29, sp
40026758: f9000bf3 str x19, [sp, #16]
4002675c: aa0003f3 mov x19, x0
queue_context->Priority.update_count = 0;
40026760: f90023ff str xzr, [sp, #64]
__asm__ volatile (
40026764: d53b4220 mrs x0, daif
40026768: d50342df msr daifset, #0x2
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
4002676c: b90023e0 str w0, [sp, #32]
_Thread_queue_Context_initialize( &queue_context );
_Thread_queue_Context_clear_priority_updates( &queue_context );
_Thread_Wait_acquire( the_thread, &queue_context );
queue = the_thread->Wait.queue;
40026770: f9404e60 ldr x0, [x19, #152]
if ( queue != NULL ) {
40026774: b4000360 cbz x0, 400267e0 <_Thread_queue_Extract+0x90>
( *operations->extract )( queue, the_thread, queue_context );
40026778: f9405263 ldr x3, [x19, #160]
4002677c: aa1303e1 mov x1, x19
40026780: 910083e2 add x2, sp, #0x20
40026784: f9400863 ldr x3, [x3, #16]
40026788: d63f0060 blr x3
the_thread->Wait.queue = NULL;
4002678c: f9004e7f str xzr, [x19, #152]
if ( success ) {
40026790: b9409260 ldr w0, [x19, #144]
the_thread->Wait.flags = desired_flags;
40026794: 52808081 mov w1, #0x404 // #1028
40026798: b9009261 str w1, [x19, #144]
if ( success ) {
4002679c: 7110041f cmp w0, #0x401
the_thread->Wait.operations = &_Thread_queue_Operations_default;
400267a0: d00000a0 adrp x0, 4003c000 <_Scheduler_Table+0x48>
400267a4: 91386000 add x0, x0, #0xe18
if ( success ) {
400267a8: 54000100 b.eq 400267c8 <_Thread_queue_Extract+0x78> // b.none <== NEVER TAKEN
the_thread->Wait.operations = &_Thread_queue_Operations_default;
400267ac: f9005260 str x0, [x19, #160]
if ( unblock ) {
400267b0: 910083e1 add x1, sp, #0x20
400267b4: aa1303e0 mov x0, x19
400267b8: 97ffff4e bl 400264f0 <_Thread_queue_Unblock_critical.part.0>
&queue_context.Lock_context.Lock_context
);
} else {
_Thread_Wait_release( the_thread, &queue_context );
}
}
400267bc: f9400bf3 ldr x19, [sp, #16]
400267c0: a8c67bfd ldp x29, x30, [sp], #96
400267c4: d65f03c0 ret
400267c8: f9005260 str x0, [x19, #160] <== NOT EXECUTED
_ISR_lock_ISR_enable( lock_context );
400267cc: b94023e0 ldr w0, [sp, #32] <== NOT EXECUTED
__asm__ volatile (
400267d0: d51b4220 msr daif, x0 <== NOT EXECUTED
400267d4: f9400bf3 ldr x19, [sp, #16] <== NOT EXECUTED
400267d8: a8c67bfd ldp x29, x30, [sp], #96 <== NOT EXECUTED
400267dc: d65f03c0 ret <== NOT EXECUTED
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
400267e0: b94023e0 ldr w0, [sp, #32]
400267e4: d51b4220 msr daif, x0
400267e8: f9400bf3 ldr x19, [sp, #16]
400267ec: a8c67bfd ldp x29, x30, [sp], #96
400267f0: d65f03c0 ret
...
0000000040029bd0 <_Thread_queue_Queue_get_name_and_id>:
const Thread_queue_Queue *queue,
char *buffer,
size_t buffer_size,
Objects_Id *id
)
{
40029bd0: aa0003e5 mov x5, x0 <== NOT EXECUTED
40029bd4: aa0103e0 mov x0, x1 <== NOT EXECUTED
const char *name;
name = queue->name;
if ( name == _Thread_queue_Object_name ) {
40029bd8: f00000a4 adrp x4, 40040000 <IMFS_LIMITS_AND_OPTIONS+0x5c0> <== NOT EXECUTED
40029bdc: 91356084 add x4, x4, #0xd58 <== NOT EXECUTED
{
40029be0: aa0303e6 mov x6, x3 <== NOT EXECUTED
40029be4: aa0203e3 mov x3, x2 <== NOT EXECUTED
name = queue->name;
40029be8: f94008a1 ldr x1, [x5, #16] <== NOT EXECUTED
if ( name == _Thread_queue_Object_name ) {
40029bec: eb04003f cmp x1, x4 <== NOT EXECUTED
40029bf0: 540000a0 b.eq 40029c04 <_Thread_queue_Queue_get_name_and_id+0x34> // b.none<== NOT EXECUTED
} else {
if ( name == NULL ) {
name = _Thread_queue_Object_name;
}
*id = 0;
40029bf4: b90000df str wzr, [x6] <== NOT EXECUTED
name = _Thread_queue_Object_name;
40029bf8: f100003f cmp x1, #0x0 <== NOT EXECUTED
return strlcpy( buffer, name, buffer_size );
40029bfc: 9a841021 csel x1, x1, x4, ne // ne = any <== NOT EXECUTED
40029c00: 140028d5 b 40033f54 <strlcpy> <== NOT EXECUTED
return _Objects_Name_to_string(
40029c04: aa0003e2 mov x2, x0 <== NOT EXECUTED
*id = queue_object->Object.id;
40029c08: b85f00a0 ldur w0, [x5, #-16] <== NOT EXECUTED
40029c0c: b90000c0 str w0, [x6] <== NOT EXECUTED
return _Objects_Name_to_string(
40029c10: 52800001 mov w1, #0x0 // #0 <== NOT EXECUTED
40029c14: f85f80a0 ldur x0, [x5, #-8] <== NOT EXECUTED
40029c18: 17fffbe6 b 40028bb0 <_Objects_Name_to_string> <== NOT EXECUTED
40029c1c: 00000000 udf #0
0000000040026800 <_Thread_queue_Surrender>:
Thread_queue_Heads *heads,
Thread_Control *previous_owner,
Thread_queue_Context *queue_context,
const Thread_queue_Operations *operations
)
{
40026800: a9bd7bfd stp x29, x30, [sp, #-48]!
40026804: 910003fd mov x29, sp
Per_CPU_Control *cpu_self;
_Assert( heads != NULL );
_Thread_queue_Context_clear_priority_updates( queue_context );
new_owner = ( *operations->surrender )(
40026808: f9400c84 ldr x4, [x4, #24]
{
4002680c: a90153f3 stp x19, x20, [sp, #16]
disable_level = cpu_self->thread_dispatch_disable_level;
40026810: f00006f4 adrp x20, 40105000 <Arr_2_Glob+0x1e68>
40026814: 91290294 add x20, x20, #0xa40
40026818: a9025bf5 stp x21, x22, [sp, #32]
4002681c: aa0003f6 mov x22, x0
queue_context->Priority.update_count = 0;
40026820: f900107f str xzr, [x3, #32]
40026824: aa0303f5 mov x21, x3
new_owner = ( *operations->surrender )(
40026828: d63f0080 blr x4
4002682c: aa0003f3 mov x19, x0
queue,
heads,
previous_owner,
queue_context
);
queue->owner = new_owner;
40026830: f90006c0 str x0, [x22, #8]
bool success = ( the_thread->Wait.flags == expected_flags );
40026834: 52808080 mov w0, #0x404 // #1028
the_thread->Wait.operations = &_Thread_queue_Operations_default;
40026838: d00000a1 adrp x1, 4003c000 <_Scheduler_Table+0x48>
4002683c: 91386021 add x1, x1, #0xe18
bool success = ( the_thread->Wait.flags == expected_flags );
40026840: b9409276 ldr w22, [x19, #144]
if ( success ) {
40026844: b9009260 str w0, [x19, #144]
the_thread->Wait.queue = NULL;
40026848: f9004e7f str xzr, [x19, #152]
4002684c: b9401a80 ldr w0, [x20, #24]
the_thread->Wait.operations = &_Thread_queue_Operations_default;
40026850: f9005261 str x1, [x19, #160]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40026854: 11000400 add w0, w0, #0x1
40026858: b9001a80 str w0, [x20, #24]
_ISR_lock_ISR_enable( lock_context );
4002685c: b94002a0 ldr w0, [x21]
40026860: d51b4220 msr daif, x0
_Thread_queue_Queue_release(
queue,
&queue_context->Lock_context.Lock_context
);
_Thread_Priority_update( queue_context );
40026864: aa1503e0 mov x0, x21
40026868: 94000dbe bl 40029f60 <_Thread_Priority_update>
if ( unblock ) {
4002686c: 711006df cmp w22, #0x401
40026870: 540000c1 b.ne 40026888 <_Thread_queue_Surrender+0x88> // b.any <== ALWAYS TAKEN
_Thread_Remove_timer_and_unblock( new_owner, queue );
}
_Thread_Dispatch_enable( cpu_self );
40026874: aa1403e0 mov x0, x20 <== NOT EXECUTED
}
40026878: a94153f3 ldp x19, x20, [sp, #16] <== NOT EXECUTED
4002687c: a9425bf5 ldp x21, x22, [sp, #32] <== NOT EXECUTED
40026880: a8c37bfd ldp x29, x30, [sp], #48 <== NOT EXECUTED
_Thread_Dispatch_enable( cpu_self );
40026884: 17fffec7 b 400263a0 <_Thread_Dispatch_enable> <== NOT EXECUTED
__asm__ volatile (
40026888: d53b4235 mrs x21, daif
4002688c: d50342df msr daifset, #0x2
40026890: f9405a60 ldr x0, [x19, #176]
40026894: 9102e261 add x1, x19, #0xb8
40026898: 94000506 bl 40027cb0 <_Watchdog_Remove>
__asm__ volatile (
4002689c: 92407eb5 and x21, x21, #0xffffffff
400268a0: d51b4235 msr daif, x21
_Thread_Clear_state( the_thread, STATES_BLOCKED );
400268a4: 528bffe1 mov w1, #0x5fff // #24575
400268a8: 72a60021 movk w1, #0x3001, lsl #16
400268ac: aa1303e0 mov x0, x19
400268b0: 94000ddc bl 4002a020 <_Thread_Clear_state>
400268b4: aa1403e0 mov x0, x20
}
400268b8: a94153f3 ldp x19, x20, [sp, #16]
400268bc: a9425bf5 ldp x21, x22, [sp, #32]
400268c0: a8c37bfd ldp x29, x30, [sp], #48
_Thread_Dispatch_enable( cpu_self );
400268c4: 17fffeb7 b 400263a0 <_Thread_Dispatch_enable>
...
0000000040025540 <_Timecounter_Bintime>:
{
40025540: a9bc7bfd stp x29, x30, [sp, #-64]!
40025544: 910003fd mov x29, sp
40025548: a90153f3 stp x19, x20, [sp, #16]
4002554c: aa0003f4 mov x20, x0
40025550: a9025bf5 stp x21, x22, [sp, #32]
40025554: f00006d6 adrp x22, 40100000 <_RTEMS_tasks_Information>
40025558: 910de2d6 add x22, x22, #0x378
4002555c: a90363f7 stp x23, x24, [sp, #48]
th = timehands;
40025560: f94002d3 ldr x19, [x22]
40025564: b9407277 ldr w23, [x19, #112]
tc = th->th_counter;
40025568: f9400275 ldr x21, [x19]
*bt = th->th_bintime;
4002556c: f9401a60 ldr x0, [x19, #48]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
40025570: f94002a1 ldr x1, [x21]
bintime_addx(bt, th->th_scale * tc_delta(th));
40025574: f9400a78 ldr x24, [x19, #16]
*bt = th->th_bintime;
40025578: f9000280 str x0, [x20]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
4002557c: aa1503e0 mov x0, x21
*bt = th->th_bintime;
40025580: f9401e62 ldr x2, [x19, #56]
40025584: f9000682 str x2, [x20, #8]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
40025588: d63f0020 blr x1
4002558c: b9401a61 ldr w1, [x19, #24]
40025590: b9400aa2 ldr w2, [x21, #8]
40025594: 4b010001 sub w1, w0, w1
bintime_addx(bt, th->th_scale * tc_delta(th));
40025598: 0a020021 and w1, w1, w2
4002559c: f9400680 ldr x0, [x20, #8]
400255a0: 9b187c21 mul x1, x1, x24
400255a4: ab000021 adds x1, x1, x0
_bt->frac += _x;
400255a8: f9000681 str x1, [x20, #8]
if (_u > _bt->frac)
400255ac: 54000083 b.cc 400255bc <_Timecounter_Bintime+0x7c> // b.lo, b.ul, b.last
_bt->sec++;
400255b0: f9400280 ldr x0, [x20]
400255b4: 91000400 add x0, x0, #0x1
400255b8: f9000280 str x0, [x20]
} while (gen == 0 || gen != th->th_generation);
400255bc: 34fffd37 cbz w23, 40025560 <_Timecounter_Bintime+0x20> <== NEVER TAKEN
400255c0: b9407260 ldr w0, [x19, #112]
400255c4: 6b17001f cmp w0, w23
400255c8: 54fffcc1 b.ne 40025560 <_Timecounter_Bintime+0x20> // b.any
}
400255cc: a94153f3 ldp x19, x20, [sp, #16]
400255d0: a9425bf5 ldp x21, x22, [sp, #32]
400255d4: a94363f7 ldp x23, x24, [sp, #48]
400255d8: a8c47bfd ldp x29, x30, [sp], #64
400255dc: d65f03c0 ret
0000000040027520 <_Timecounter_Binuptime>:
{
40027520: a9bc7bfd stp x29, x30, [sp, #-64]!
40027524: 910003fd mov x29, sp
40027528: a90153f3 stp x19, x20, [sp, #16]
4002752c: aa0003f4 mov x20, x0
40027530: a9025bf5 stp x21, x22, [sp, #32]
40027534: b00006d6 adrp x22, 40100000 <_RTEMS_tasks_Information>
40027538: 911122d6 add x22, x22, #0x448
4002753c: a90363f7 stp x23, x24, [sp, #48]
th = timehands;
40027540: f94002d3 ldr x19, [x22]
val = *obj;
40027544: b9407277 ldr w23, [x19, #112]
tc = th->th_counter;
40027548: f9400275 ldr x21, [x19]
*bt = th->th_offset;
4002754c: f9401260 ldr x0, [x19, #32]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
40027550: f94002a1 ldr x1, [x21]
bintime_addx(bt, th->th_scale * tc_delta(th));
40027554: f9400a78 ldr x24, [x19, #16]
*bt = th->th_offset;
40027558: f9000280 str x0, [x20]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
4002755c: aa1503e0 mov x0, x21
*bt = th->th_offset;
40027560: f9401662 ldr x2, [x19, #40]
40027564: f9000682 str x2, [x20, #8]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
40027568: d63f0020 blr x1
4002756c: b9401a61 ldr w1, [x19, #24]
40027570: b9400aa2 ldr w2, [x21, #8]
40027574: 4b010001 sub w1, w0, w1
bintime_addx(bt, th->th_scale * tc_delta(th));
40027578: 0a020021 and w1, w1, w2
4002757c: f9400680 ldr x0, [x20, #8]
40027580: 9b187c21 mul x1, x1, x24
40027584: ab000021 adds x1, x1, x0
_bt->frac += _x;
40027588: f9000681 str x1, [x20, #8]
if (_u > _bt->frac)
4002758c: 54000083 b.cc 4002759c <_Timecounter_Binuptime+0x7c> // b.lo, b.ul, b.last
_bt->sec++;
40027590: f9400280 ldr x0, [x20]
40027594: 91000400 add x0, x0, #0x1
40027598: f9000280 str x0, [x20]
} while (gen == 0 || gen != th->th_generation);
4002759c: 34fffd37 cbz w23, 40027540 <_Timecounter_Binuptime+0x20> <== NEVER TAKEN
400275a0: b9407260 ldr w0, [x19, #112]
400275a4: 6b17001f cmp w0, w23
400275a8: 54fffcc1 b.ne 40027540 <_Timecounter_Binuptime+0x20> // b.any
}
400275ac: a94153f3 ldp x19, x20, [sp, #16]
400275b0: a9425bf5 ldp x21, x22, [sp, #32]
400275b4: a94363f7 ldp x23, x24, [sp, #48]
400275b8: a8c47bfd ldp x29, x30, [sp], #64
400275bc: d65f03c0 ret
0000000040025660 <_Timecounter_Getbintime>:
{
40025660: f00006c4 adrp x4, 40100000 <_RTEMS_tasks_Information>
40025664: 910de084 add x4, x4, #0x378
th = timehands;
40025668: f9400081 ldr x1, [x4]
4002566c: b9407022 ldr w2, [x1, #112]
*bt = th->th_bintime;
40025670: f9401823 ldr x3, [x1, #48]
40025674: f9000003 str x3, [x0]
40025678: f9401c23 ldr x3, [x1, #56]
4002567c: f9000403 str x3, [x0, #8]
} while (gen == 0 || gen != th->th_generation);
40025680: 34ffff42 cbz w2, 40025668 <_Timecounter_Getbintime+0x8> <== NEVER TAKEN
40025684: b9407021 ldr w1, [x1, #112]
40025688: 6b02003f cmp w1, w2
4002568c: 54fffee1 b.ne 40025668 <_Timecounter_Getbintime+0x8> // b.any <== NEVER TAKEN
}
40025690: d65f03c0 ret
...
00000000400228d0 <_Timecounter_Getbinuptime>:
{
400228d0: d00006e4 adrp x4, 40100000 <_Thread_Information>
400228d4: 9104c084 add x4, x4, #0x130
th = timehands;
400228d8: f9400081 ldr x1, [x4]
400228dc: b9407022 ldr w2, [x1, #112]
*bt = th->th_offset;
400228e0: f9401023 ldr x3, [x1, #32]
400228e4: f9000003 str x3, [x0]
400228e8: f9401423 ldr x3, [x1, #40]
400228ec: f9000403 str x3, [x0, #8]
} while (gen == 0 || gen != th->th_generation);
400228f0: 34ffff42 cbz w2, 400228d8 <_Timecounter_Getbinuptime+0x8> <== NEVER TAKEN
400228f4: b9407021 ldr w1, [x1, #112]
400228f8: 6b02003f cmp w1, w2
400228fc: 54fffee1 b.ne 400228d8 <_Timecounter_Getbinuptime+0x8> // b.any <== NEVER TAKEN
}
40022900: d65f03c0 ret
...
0000000040022a10 <_Timecounter_Getmicrotime>:
{
40022a10: d00006e4 adrp x4, 40100000 <_Thread_Information>
40022a14: 9104c084 add x4, x4, #0x130
th = timehands;
40022a18: f9400081 ldr x1, [x4]
40022a1c: b9407022 ldr w2, [x1, #112]
*tvp = th->th_microtime;
40022a20: f9402023 ldr x3, [x1, #64]
40022a24: f9000003 str x3, [x0]
40022a28: f9402423 ldr x3, [x1, #72]
40022a2c: f9000403 str x3, [x0, #8]
} while (gen == 0 || gen != th->th_generation);
40022a30: 34ffff42 cbz w2, 40022a18 <_Timecounter_Getmicrotime+0x8> <== NEVER TAKEN
40022a34: b9407021 ldr w1, [x1, #112]
40022a38: 6b02003f cmp w1, w2
40022a3c: 54fffee1 b.ne 40022a18 <_Timecounter_Getmicrotime+0x8> // b.any <== NEVER TAKEN
}
40022a40: d65f03c0 ret
...
0000000040022950 <_Timecounter_Getmicrouptime>:
{
40022950: d00006e5 adrp x5, 40100000 <_Thread_Information>
40022954: 9104c0a5 add x5, x5, #0x130
_tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32;
40022958: d2884806 mov x6, #0x4240 // #16960
4002295c: f2a001e6 movk x6, #0xf, lsl #16
th = timehands;
40022960: f94000a2 ldr x2, [x5]
40022964: b9407043 ldr w3, [x2, #112]
40022968: b9402c41 ldr w1, [x2, #44]
_tv->tv_sec = _bt->sec;
4002296c: f9401044 ldr x4, [x2, #32]
_tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32;
40022970: 9b067c21 mul x1, x1, x6
40022974: d360fc21 lsr x1, x1, #32
40022978: a9000404 stp x4, x1, [x0]
} while (gen == 0 || gen != th->th_generation);
4002297c: 34ffff23 cbz w3, 40022960 <_Timecounter_Getmicrouptime+0x10> <== NEVER TAKEN
40022980: b9407041 ldr w1, [x2, #112]
40022984: 6b03003f cmp w1, w3
40022988: 54fffec1 b.ne 40022960 <_Timecounter_Getmicrouptime+0x10> // b.any <== NEVER TAKEN
}
4002298c: d65f03c0 ret
00000000400256a0 <_Timecounter_Getnanotime>:
{
400256a0: f00006c4 adrp x4, 40100000 <_RTEMS_tasks_Information>
400256a4: 910de084 add x4, x4, #0x378
th = timehands;
400256a8: f9400081 ldr x1, [x4]
400256ac: b9407022 ldr w2, [x1, #112]
*tsp = th->th_nanotime;
400256b0: f9402823 ldr x3, [x1, #80]
400256b4: f9000003 str x3, [x0]
400256b8: f9402c23 ldr x3, [x1, #88]
400256bc: f9000403 str x3, [x0, #8]
} while (gen == 0 || gen != th->th_generation);
400256c0: 34ffff42 cbz w2, 400256a8 <_Timecounter_Getnanotime+0x8> <== NEVER TAKEN
400256c4: b9407021 ldr w1, [x1, #112]
400256c8: 6b02003f cmp w1, w2
400256cc: 54fffee1 b.ne 400256a8 <_Timecounter_Getnanotime+0x8> // b.any <== NEVER TAKEN
}
400256d0: d65f03c0 ret
...
0000000040025620 <_Timecounter_Getnanouptime>:
{
40025620: f00006c5 adrp x5, 40100000 <_RTEMS_tasks_Information>
40025624: 910de0a5 add x5, x5, #0x378
_ts->tv_nsec = ((uint64_t)1000000000 *
40025628: d2994006 mov x6, #0xca00 // #51712
4002562c: f2a77346 movk x6, #0x3b9a, lsl #16
th = timehands;
40025630: f94000a2 ldr x2, [x5]
40025634: b9407043 ldr w3, [x2, #112]
(uint32_t)(_bt->frac >> 32)) >> 32;
40025638: b9402c41 ldr w1, [x2, #44]
_ts->tv_sec = _bt->sec;
4002563c: f9401044 ldr x4, [x2, #32]
_ts->tv_nsec = ((uint64_t)1000000000 *
40025640: 9b067c21 mul x1, x1, x6
(uint32_t)(_bt->frac >> 32)) >> 32;
40025644: d360fc21 lsr x1, x1, #32
_ts->tv_nsec = ((uint64_t)1000000000 *
40025648: a9000404 stp x4, x1, [x0]
} while (gen == 0 || gen != th->th_generation);
4002564c: 34ffff23 cbz w3, 40025630 <_Timecounter_Getnanouptime+0x10> <== NEVER TAKEN
40025650: b9407041 ldr w1, [x2, #112]
40025654: 6b03003f cmp w1, w3
40025658: 54fffec1 b.ne 40025630 <_Timecounter_Getnanouptime+0x10> // b.any <== NEVER TAKEN
}
4002565c: d65f03c0 ret
00000000400256e0 <_Timecounter_Install>:
if (tc->tc_quality < timecounter->tc_quality)
400256e0: f00006c1 adrp x1, 40100000 <_RTEMS_tasks_Information>
400256e4: f9415c22 ldr x2, [x1, #696]
400256e8: b9402004 ldr w4, [x0, #32]
400256ec: b9402043 ldr w3, [x2, #32]
400256f0: 6b03009f cmp w4, w3
400256f4: 5400022b b.lt 40025738 <_Timecounter_Install+0x58> // b.tstop <== NEVER TAKEN
if (tc->tc_quality == timecounter->tc_quality &&
400256f8: 540000a1 b.ne 4002570c <_Timecounter_Install+0x2c> // b.any
400256fc: f9400803 ldr x3, [x0, #16]
40025700: f9400842 ldr x2, [x2, #16]
40025704: eb02007f cmp x3, x2
40025708: 54000183 b.cc 40025738 <_Timecounter_Install+0x58> // b.lo, b.ul, b.last
{
4002570c: a9be7bfd stp x29, x30, [sp, #-32]!
40025710: 910003fd mov x29, sp
timecounter = tc;
40025714: f9015c20 str x0, [x1, #696]
__asm__ volatile (
40025718: d53b4220 mrs x0, daif
4002571c: d50342df msr daifset, #0x2
_Timecounter_Acquire(&lock_context);
40025720: b9001be0 str w0, [sp, #24]
_Timecounter_Windup(new_boottimebin, &lock_context);
40025724: d2800000 mov x0, #0x0 // #0
40025728: 910063e1 add x1, sp, #0x18
4002572c: 97fffee9 bl 400252d0 <_Timecounter_Windup>
}
40025730: a8c27bfd ldp x29, x30, [sp], #32
40025734: d65f03c0 ret
40025738: d65f03c0 ret
4002573c: 00000000 udf #0
00000000400254b0 <_Timecounter_Sbinuptime>:
{
400254b0: a9bb7bfd stp x29, x30, [sp, #-80]!
400254b4: 910003fd mov x29, sp
400254b8: f90023f9 str x25, [sp, #64]
400254bc: f00006d9 adrp x25, 40100000 <_RTEMS_tasks_Information>
400254c0: 910de339 add x25, x25, #0x378
400254c4: a90153f3 stp x19, x20, [sp, #16]
400254c8: a9025bf5 stp x21, x22, [sp, #32]
400254cc: a90363f7 stp x23, x24, [sp, #48]
th = timehands;
400254d0: f9400333 ldr x19, [x25]
val = *obj;
400254d4: b9407275 ldr w21, [x19, #112]
tc = th->th_counter;
400254d8: f9400274 ldr x20, [x19]
sbt += (th->th_scale * tc_delta(th)) >> 32;
400254dc: f9400a77 ldr x23, [x19, #16]
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
400254e0: aa1403e0 mov x0, x20
400254e4: f9400281 ldr x1, [x20]
400254e8: a9426276 ldp x22, x24, [x19, #32]
400254ec: d63f0020 blr x1
400254f0: b9401a62 ldr w2, [x19, #24]
tc->tc_counter_mask);
400254f4: b9400a81 ldr w1, [x20, #8]
} while (gen == 0 || gen != th->th_generation);
400254f8: 34fffed5 cbz w21, 400254d0 <_Timecounter_Sbinuptime+0x20> <== NEVER TAKEN
400254fc: b9407263 ldr w3, [x19, #112]
40025500: 6b15007f cmp w3, w21
40025504: 54fffe61 b.ne 400254d0 <_Timecounter_Sbinuptime+0x20> // b.any
return ((tc->tc_get_timecount(tc) - th->th_offset_count) &
40025508: 4b020000 sub w0, w0, w2
return (((sbintime_t)_bt.sec << 32) + (_bt.frac >> 32));
4002550c: d360ff18 lsr x24, x24, #32
sbt += (th->th_scale * tc_delta(th)) >> 32;
40025510: 0a010000 and w0, w0, w1
40025514: 8b168316 add x22, x24, x22, lsl #32
}
40025518: a94153f3 ldp x19, x20, [sp, #16]
sbt += (th->th_scale * tc_delta(th)) >> 32;
4002551c: 9b177c00 mul x0, x0, x23
}
40025520: a94363f7 ldp x23, x24, [sp, #48]
40025524: 8b4082c0 add x0, x22, x0, lsr #32
40025528: a9425bf5 ldp x21, x22, [sp, #32]
4002552c: f94023f9 ldr x25, [sp, #64]
40025530: a8c57bfd ldp x29, x30, [sp], #80
40025534: d65f03c0 ret
...
0000000040026730 <_Timecounter_Tick_simple>:
{
struct bintime bt;
struct timehands *th;
uint32_t ogen;
th = timehands;
40026730: d00006c3 adrp x3, 40100000 <_RTEMS_tasks_Information>
40026734: f9420063 ldr x3, [x3, #1024]
ogen = th->th_generation;
th->th_offset_count = offset;
bintime_addx(&th->th_offset, th->th_scale * delta);
40026738: 2a0003e0 mov w0, w0
4002673c: f9400866 ldr x6, [x3, #16]
th->th_offset_count = offset;
40026740: b9001861 str w1, [x3, #24]
40026744: a9421467 ldp x7, x5, [x3, #32]
bintime_addx(&th->th_offset, th->th_scale * delta);
40026748: 9b067c00 mul x0, x0, x6
ogen = th->th_generation;
4002674c: b9407061 ldr w1, [x3, #112]
if (_u > _bt->frac)
40026750: ab050000 adds x0, x0, x5
_bt->frac += _x;
40026754: f9001460 str x0, [x3, #40]
if (_u > _bt->frac)
40026758: 54000063 b.cc 40026764 <_Timecounter_Tick_simple+0x34> // b.lo, b.ul, b.last<== ALWAYS TAKEN
_bt->sec++;
4002675c: 910004e7 add x7, x7, #0x1 <== NOT EXECUTED
40026760: f9001067 str x7, [x3, #32] <== NOT EXECUTED
_bt->frac += _bt2->frac;
40026764: f9403464 ldr x4, [x3, #104]
40026768: ab000080 adds x0, x4, x0
4002676c: 54000382 b.cs 400267dc <_Timecounter_Tick_simple+0xac> // b.hs, b.nlast
bt = th->th_offset;
40026770: aa0703e5 mov x5, x7
_tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32;
40026774: d360fc04 lsr x4, x0, #32
40026778: d2884806 mov x6, #0x4240 // #16960
4002677c: f2a001e6 movk x6, #0xf, lsl #16
_ts->tv_nsec = ((uint64_t)1000000000 *
40026780: d2994008 mov x8, #0xca00 // #51712
40026784: f2a77348 movk x8, #0x3b9a, lsl #16
if (++ogen == 0)
ogen = 1;
th->th_generation = ogen;
/* Go live with the new struct timehands. */
time_second = th->th_microtime.tv_sec;
40026788: d00006c9 adrp x9, 40100000 <_RTEMS_tasks_Information>
_bt->sec += _bt2->sec;
4002678c: f940306a ldr x10, [x3, #96]
_tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32;
40026790: 9b067c86 mul x6, x4, x6
_ts->tv_nsec = ((uint64_t)1000000000 *
40026794: 9b087c84 mul x4, x4, x8
time_uptime = th->th_offset.sec;
40026798: d00006c8 adrp x8, 40100000 <_RTEMS_tasks_Information>
_bt->sec += _bt2->sec;
4002679c: 8b0a00a5 add x5, x5, x10
th->th_generation = ogen;
400267a0: 31000421 adds w1, w1, #0x1
time_second = th->th_microtime.tv_sec;
400267a4: f901a525 str x5, [x9, #840]
th->th_generation = ogen;
400267a8: 1a9f1421 csinc w1, w1, wzr, ne // ne = any
_tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32;
400267ac: d360fcc6 lsr x6, x6, #32
(uint32_t)(_bt->frac >> 32)) >> 32;
400267b0: d360fc84 lsr x4, x4, #32
time_uptime = th->th_offset.sec;
400267b4: b9035107 str w7, [x8, #848]
th->th_bintime = bt;
400267b8: a9030065 stp x5, x0, [x3, #48]
_tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32;
400267bc: a9041865 stp x5, x6, [x3, #64]
_ts->tv_nsec = ((uint64_t)1000000000 *
400267c0: a9051065 stp x5, x4, [x3, #80]
th->th_generation = ogen;
400267c4: b9007061 str w1, [x3, #112]
_Timecounter_Release(lock_context);
400267c8: b9400040 ldr w0, [x2]
__asm__ volatile (
400267cc: d51b4220 msr daif, x0
_Watchdog_Tick(_Per_CPU_Get_snapshot());
400267d0: b00006e0 adrp x0, 40103000 <_Thread_Heads+0x28>
400267d4: 91220000 add x0, x0, #0x880
400267d8: 14000a52 b 40029120 <_Watchdog_Tick>
_bt->sec++;
400267dc: 910004e5 add x5, x7, #0x1
400267e0: 17ffffe5 b 40026774 <_Timecounter_Tick_simple+0x44>
...
00000000400255a0 <_Timespec_Add_to>:
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
400255a0: aa0003e7 mov x7, x0
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
400255a4: d2993fe4 mov x4, #0xc9ff // #51711
400255a8: f2a77344 movk x4, #0x3b9a, lsl #16
time->tv_nsec += add->tv_nsec;
400255ac: a9400820 ldp x0, x2, [x1]
400255b0: a94004e3 ldp x3, x1, [x7]
uint32_t seconds = add->tv_sec;
400255b4: 2a0003e5 mov w5, w0
time->tv_nsec += add->tv_nsec;
400255b8: 8b020021 add x1, x1, x2
time->tv_sec += add->tv_sec;
400255bc: 8b030003 add x3, x0, x3
time->tv_nsec += add->tv_nsec;
400255c0: a90004e3 stp x3, x1, [x7]
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
400255c4: eb04003f cmp x1, x4
400255c8: 5400016d b.le 400255f4 <_Timespec_Add_to+0x54>
400255cc: aa0303e2 mov x2, x3
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
400255d0: 92993fe6 mov x6, #0xffffffffffff3600 // #-51712
400255d4: f2b88ca6 movk x6, #0xc465, lsl #16
time->tv_sec++;
400255d8: 91000442 add x2, x2, #0x1
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
400255dc: 8b060021 add x1, x1, x6
seconds++;
400255e0: 0b0200a0 add w0, w5, w2
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
400255e4: eb04003f cmp x1, x4
400255e8: 4b030000 sub w0, w0, w3
400255ec: 54ffff6c b.gt 400255d8 <_Timespec_Add_to+0x38> <== NEVER TAKEN
400255f0: a90004e2 stp x2, x1, [x7]
}
return seconds;
}
400255f4: d65f03c0 ret
...
00000000400278f0 <_User_extensions_Handler_initialization>:
size_t n;
size_t i;
initial_table = _User_extensions_Initial_extensions;
initial_switch_controls = _User_extensions_Initial_switch_controls;
n = _User_extensions_Initial_count;
400278f0: b00000a0 adrp x0, 4003c000 <_Scheduler_Table+0x48>
400278f4: f9405c04 ldr x4, [x0, #184]
for ( i = 0 ; i < n ; ++i ) {
400278f8: b4000384 cbz x4, 40027968 <_User_extensions_Handler_initialization+0x78><== NEVER TAKEN
400278fc: b00006c7 adrp x7, 40100000 <_RTEMS_tasks_Information>
40027900: 910f00e7 add x7, x7, #0x3c0
40027904: f00006c0 adrp x0, 40102000 <_Configuration_Scheduler_priority_dflt+0x15d0>
40027908: 913e6000 add x0, x0, #0xf98
4002790c: d2800302 mov x2, #0x18 // #24
40027910: b00000a1 adrp x1, 4003c000 <_Scheduler_Table+0x48>
40027914: 91030021 add x1, x1, #0xc0
the_node->next = tail;
40027918: b00006c5 adrp x5, 40100000 <_RTEMS_tasks_Information>
4002791c: 910f20a5 add x5, x5, #0x3c8
40027920: 9b020084 madd x4, x4, x2, x0
40027924: f94008e3 ldr x3, [x7, #16]
40027928: 52800006 mov w6, #0x0 // #0
4002792c: d503201f nop
User_extensions_thread_switch_extension callout;
callout = initial_table[ i ].thread_switch;
40027930: f9401022 ldr x2, [x1, #32]
for ( i = 0 ; i < n ; ++i ) {
40027934: 91012021 add x1, x1, #0x48
if ( callout != NULL ) {
40027938: b40000e2 cbz x2, 40027954 <_User_extensions_Handler_initialization+0x64>
4002793c: f9000005 str x5, [x0]
}
40027940: 52800026 mov w6, #0x1 // #1
User_extensions_Switch_control *c;
c = &initial_switch_controls[ i ];
c->thread_switch = callout;
40027944: f9000802 str x2, [x0, #16]
old_last->next = the_node;
40027948: f9000060 str x0, [x3]
the_node->previous = old_last;
4002794c: f9000403 str x3, [x0, #8]
}
40027950: aa0003e3 mov x3, x0
for ( i = 0 ; i < n ; ++i ) {
40027954: 91006000 add x0, x0, #0x18
40027958: eb04001f cmp x0, x4
4002795c: 54fffea1 b.ne 40027930 <_User_extensions_Handler_initialization+0x40> // b.any
40027960: 34000046 cbz w6, 40027968 <_User_extensions_Handler_initialization+0x78>
40027964: f90008e3 str x3, [x7, #16]
_Chain_Initialize_node( &c->Node );
_Chain_Append_unprotected( &_User_extensions_Switches_list, &c->Node );
}
}
}
40027968: d65f03c0 ret
4002796c: 00000000 udf #0
0000000040027aa0 <_User_extensions_Iterate>:
void _User_extensions_Iterate(
void *arg,
User_extensions_Visitor visitor,
Chain_Iterator_direction direction
)
{
40027aa0: a9b87bfd stp x29, x30, [sp, #-128]!
40027aa4: 910003fd mov x29, sp
40027aa8: a90153f3 stp x19, x20, [sp, #16]
ISR_lock_Context lock_context;
executing = _Thread_Get_executing();
initial_begin = _User_extensions_Initial_extensions;
initial_end = initial_begin + _User_extensions_Initial_count;
40027aac: b00000a3 adrp x3, 4003c000 <_Scheduler_Table+0x48>
40027ab0: f9405c73 ldr x19, [x3, #184]
{
40027ab4: a9025bf5 stp x21, x22, [sp, #32]
initial_end = initial_begin + _User_extensions_Initial_count;
40027ab8: b00000b6 adrp x22, 4003c000 <_Scheduler_Table+0x48>
40027abc: 910302d6 add x22, x22, #0xc0
40027ac0: d2800903 mov x3, #0x48 // #72
{
40027ac4: a90363f7 stp x23, x24, [sp, #48]
40027ac8: aa0103f4 mov x20, x1
40027acc: aa0003f8 mov x24, x0
40027ad0: f90023f9 str x25, [sp, #64]
initial_end = initial_begin + _User_extensions_Initial_count;
40027ad4: 9b035a73 madd x19, x19, x3, x22
40027ad8: d00006e0 adrp x0, 40105000 <Arr_2_Glob+0x1e68>
40027adc: f9453019 ldr x25, [x0, #2656]
{
40027ae0: 2a0203f7 mov w23, w2
if ( direction == CHAIN_ITERATOR_FORWARD ) {
40027ae4: 350009e2 cbnz w2, 40027c20 <_User_extensions_Iterate+0x180>
initial_current = initial_begin;
while ( initial_current != initial_end ) {
40027ae8: eb16027f cmp x19, x22
initial_current = initial_begin;
40027aec: aa1603f5 mov x21, x22
while ( initial_current != initial_end ) {
40027af0: 54000120 b.eq 40027b14 <_User_extensions_Iterate+0x74> // b.none <== NEVER TAKEN
40027af4: d503201f nop
(*visitor)( executing, arg, initial_current );
40027af8: aa1503e2 mov x2, x21
40027afc: aa1803e1 mov x1, x24
++initial_current;
40027b00: 910122b5 add x21, x21, #0x48
(*visitor)( executing, arg, initial_current );
40027b04: aa1903e0 mov x0, x25
40027b08: d63f0280 blr x20
while ( initial_current != initial_end ) {
40027b0c: eb15027f cmp x19, x21
40027b10: 54ffff41 b.ne 40027af8 <_User_extensions_Iterate+0x58> // b.any
}
end = _Chain_Immutable_tail( &_User_extensions_List.Active );
40027b14: b00006c1 adrp x1, 40100000 <_RTEMS_tasks_Information>
40027b18: 910fc020 add x0, x1, #0x3f0
40027b1c: 91002015 add x21, x0, #0x8
__asm__ volatile (
40027b20: d53b4223 mrs x3, daif
40027b24: d50342df msr daifset, #0x2
old_last = tail->previous;
40027b28: f9401404 ldr x4, [x0, #40]
the_node->next = tail;
40027b2c: 91008001 add x1, x0, #0x20
tail->previous = the_node;
40027b30: 910163e2 add x2, sp, #0x58
40027b34: f9001402 str x2, [x0, #40]
the_node->next = tail;
40027b38: f9002fe1 str x1, [sp, #88]
);
the_iterator->direction = direction;
if ( direction == CHAIN_ITERATOR_FORWARD ) {
the_iterator->position = _Chain_Head( the_chain );
40027b3c: 710002ff cmp w23, #0x0
40027b40: 91002001 add x1, x0, #0x8
old_last->next = the_node;
40027b44: f9000082 str x2, [x4]
the_iterator->position = _Chain_Head( the_chain );
40027b48: 9a801021 csel x1, x1, x0, ne // ne = any
the_node->previous = old_last;
40027b4c: f90033e4 str x4, [sp, #96]
the_iterator->direction = direction;
40027b50: b9006bf7 str w23, [sp, #104]
if ( direction == CHAIN_ITERATOR_FORWARD ) {
40027b54: f9003be1 str x1, [sp, #112]
&_User_extensions_List.Iterators,
&iter.Iterator,
direction
);
if ( executing != NULL ) {
40027b58: b4000099 cbz x25, 40027b68 <_User_extensions_Iterate+0xc8>
iter.previous = executing->last_user_extensions_iterator;
40027b5c: f9414f20 ldr x0, [x25, #664]
40027b60: f9003fe0 str x0, [sp, #120]
executing->last_user_extensions_iterator = &iter;
40027b64: f9014f22 str x2, [x25, #664]
the_iterator->position = _Chain_Head( the_chain );
40027b68: 2a1703e0 mov w0, w23
40027b6c: 1400000b b 40027b98 <_User_extensions_Iterate+0xf8>
RTEMS_INLINE_ROUTINE void _Chain_Iterator_set_position(
Chain_Iterator *the_iterator,
Chain_Node *the_node
)
{
the_iterator->position = the_node;
40027b70: f9003be2 str x2, [sp, #112]
__asm__ volatile (
40027b74: d51b4223 msr daif, x3
_Chain_Iterator_set_position( &iter.Iterator, node );
_User_extensions_Release( &lock_context );
extension = (const User_extensions_Control *) node;
( *visitor )( executing, arg, &extension->Callouts );
40027b78: 9100a042 add x2, x2, #0x28
40027b7c: aa1803e1 mov x1, x24
40027b80: aa1903e0 mov x0, x25
40027b84: d63f0280 blr x20
__asm__ volatile (
40027b88: d53b4223 mrs x3, daif
40027b8c: d50342df msr daifset, #0x2
if ( the_iterator->direction == CHAIN_ITERATOR_FORWARD ) {
40027b90: b9406be0 ldr w0, [sp, #104]
return _Chain_Next( the_iterator->position );
40027b94: f9403be1 ldr x1, [sp, #112]
return _Chain_Previous( the_iterator->position );
40027b98: 7100001f cmp w0, #0x0
return the_node->previous;
40027b9c: a9400022 ldp x2, x0, [x1]
_ISR_lock_Release_and_ISR_enable(
40027ba0: 2a0303e3 mov w3, w3
return _Chain_Previous( the_iterator->position );
40027ba4: 9a800042 csel x2, x2, x0, eq // eq = none
while ( ( node = _Chain_Iterator_next( &iter.Iterator ) ) != end ) {
40027ba8: eb0202bf cmp x21, x2
40027bac: 54fffe21 b.ne 40027b70 <_User_extensions_Iterate+0xd0> // b.any
_User_extensions_Acquire( &lock_context );
}
if ( executing != NULL ) {
40027bb0: b4000079 cbz x25, 40027bbc <_User_extensions_Iterate+0x11c>
executing->last_user_extensions_iterator = iter.previous;
40027bb4: f9403fe0 ldr x0, [sp, #120]
40027bb8: f9014f20 str x0, [x25, #664]
previous = the_node->previous;
40027bbc: a94583e1 ldp x1, x0, [sp, #88]
next->previous = previous;
40027bc0: f9000420 str x0, [x1, #8]
previous->next = next;
40027bc4: f9000001 str x1, [x0]
__asm__ volatile (
40027bc8: d51b4223 msr daif, x3
_Chain_Iterator_destroy( &iter.Iterator );
_User_extensions_Release( &lock_context );
if ( direction == CHAIN_ITERATOR_BACKWARD ) {
40027bcc: 710006ff cmp w23, #0x1
40027bd0: 54000180 b.eq 40027c00 <_User_extensions_Iterate+0x160> // b.none
while ( initial_current != initial_begin ) {
--initial_current;
(*visitor)( executing, arg, initial_current );
}
}
}
40027bd4: a94153f3 ldp x19, x20, [sp, #16]
40027bd8: a9425bf5 ldp x21, x22, [sp, #32]
40027bdc: a94363f7 ldp x23, x24, [sp, #48]
40027be0: f94023f9 ldr x25, [sp, #64]
40027be4: a8c87bfd ldp x29, x30, [sp], #128
40027be8: d65f03c0 ret
--initial_current;
40027bec: d1012273 sub x19, x19, #0x48
(*visitor)( executing, arg, initial_current );
40027bf0: aa1803e1 mov x1, x24
40027bf4: aa1303e2 mov x2, x19
40027bf8: aa1903e0 mov x0, x25
40027bfc: d63f0280 blr x20
while ( initial_current != initial_begin ) {
40027c00: eb16027f cmp x19, x22
40027c04: 54ffff41 b.ne 40027bec <_User_extensions_Iterate+0x14c> // b.any
}
40027c08: a94153f3 ldp x19, x20, [sp, #16]
40027c0c: a9425bf5 ldp x21, x22, [sp, #32]
40027c10: a94363f7 ldp x23, x24, [sp, #48]
40027c14: f94023f9 ldr x25, [sp, #64]
40027c18: a8c87bfd ldp x29, x30, [sp], #128
40027c1c: d65f03c0 ret
end = _Chain_Immutable_head( &_User_extensions_List.Active );
40027c20: b00006c1 adrp x1, 40100000 <_RTEMS_tasks_Information>
40027c24: 910fc020 add x0, x1, #0x3f0
40027c28: aa0003f5 mov x21, x0
40027c2c: 17ffffbd b 40027b20 <_User_extensions_Iterate+0x80>
0000000040031500 <_User_extensions_Remove_set>:
__asm__ volatile (
40031500: d53b4226 mrs x6, daif
40031504: d50342df msr daifset, #0x2
return the_node->next;
40031508: f0000661 adrp x1, 40100000 <T_case_instance_TestInterruptBlocked>
4003150c: f9421021 ldr x1, [x1, #1056]
while ( ( iter_node = _Chain_Next( iter_node ) ) != iter_tail ) {
40031510: f0000663 adrp x3, 40100000 <T_case_instance_TestInterruptBlocked>
40031514: 9110a063 add x3, x3, #0x428
40031518: eb03003f cmp x1, x3
4003151c: a9401005 ldp x5, x4, [x0]
40031520: 540000a1 b.ne 40031534 <_User_extensions_Remove_set+0x34> // b.any <== NEVER TAKEN
40031524: 1400000e b 4003155c <_User_extensions_Remove_set+0x5c>
return the_node->next;
40031528: f9400021 ldr x1, [x1] <== NOT EXECUTED
while ( ( iter_node = _Chain_Next( iter_node ) ) != iter_tail ) {
4003152c: eb03003f cmp x1, x3 <== NOT EXECUTED
40031530: 54000160 b.eq 4003155c <_User_extensions_Remove_set+0x5c> // b.none<== NOT EXECUTED
if ( iter->position == the_node_to_extract ) {
40031534: f9400c22 ldr x2, [x1, #24] <== NOT EXECUTED
40031538: eb02001f cmp x0, x2 <== NOT EXECUTED
4003153c: 54ffff61 b.ne 40031528 <_User_extensions_Remove_set+0x28> // b.any <== NOT EXECUTED
if ( iter->direction == CHAIN_ITERATOR_FORWARD ) {
40031540: b9401022 ldr w2, [x1, #16] <== NOT EXECUTED
iter->position = _Chain_Previous( the_node_to_extract );
40031544: 7100005f cmp w2, #0x0 <== NOT EXECUTED
40031548: 9a8410a2 csel x2, x5, x4, ne // ne = any <== NOT EXECUTED
4003154c: f9000c22 str x2, [x1, #24] <== NOT EXECUTED
return the_node->next;
40031550: f9400021 ldr x1, [x1] <== NOT EXECUTED
while ( ( iter_node = _Chain_Next( iter_node ) ) != iter_tail ) {
40031554: eb03003f cmp x1, x3 <== NOT EXECUTED
40031558: 54fffee1 b.ne 40031534 <_User_extensions_Remove_set+0x34> // b.any <== NOT EXECUTED
next->previous = previous;
4003155c: f90004a4 str x4, [x5, #8]
previous->next = next;
40031560: f9000085 str x5, [x4]
__asm__ volatile (
40031564: 92407cc1 and x1, x6, #0xffffffff
40031568: d51b4221 msr daif, x1
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL ) {
4003156c: f9402401 ldr x1, [x0, #72]
40031570: b4000101 cbz x1, 40031590 <_User_extensions_Remove_set+0x90>
__asm__ volatile (
40031574: d53b4221 mrs x1, daif
40031578: d50342df msr daifset, #0x2
previous = the_node->previous;
4003157c: a9410002 ldp x2, x0, [x0, #16]
next->previous = previous;
40031580: f9000440 str x0, [x2, #8]
previous->next = next;
40031584: f9000002 str x2, [x0]
__asm__ volatile (
40031588: 92407c20 and x0, x1, #0xffffffff
4003158c: d51b4220 msr daif, x0
_Per_CPU_Acquire_all( &lock_context );
_Chain_Extract_unprotected( &the_extension->Switch.Node );
_Per_CPU_Release_all( &lock_context );
}
}
40031590: d65f03c0 ret
...
0000000040027970 <_User_extensions_Thread_create_visitor>:
Thread_Control *executing,
void *arg,
const User_extensions_Table *callouts
)
{
User_extensions_thread_create_extension callout = callouts->thread_create;
40027970: f9400042 ldr x2, [x2]
if ( callout != NULL ) {
40027974: b40001c2 cbz x2, 400279ac <_User_extensions_Thread_create_visitor+0x3c>
{
40027978: a9be7bfd stp x29, x30, [sp, #-32]!
4002797c: 910003fd mov x29, sp
40027980: f9000bf3 str x19, [sp, #16]
40027984: aa0103f3 mov x19, x1
User_extensions_Thread_create_context *ctx = arg;
ctx->ok = ctx->ok && (*callout)( executing, ctx->created );
40027988: 39402021 ldrb w1, [x1, #8]
4002798c: 34000081 cbz w1, 4002799c <_User_extensions_Thread_create_visitor+0x2c><== NEVER TAKEN
40027990: f9400261 ldr x1, [x19]
40027994: d63f0040 blr x2
40027998: 12001c01 and w1, w0, #0xff
4002799c: 39002261 strb w1, [x19, #8]
}
}
400279a0: f9400bf3 ldr x19, [sp, #16]
400279a4: a8c27bfd ldp x29, x30, [sp], #32
400279a8: d65f03c0 ret
400279ac: d65f03c0 ret
0000000040027d30 <_Watchdog_Do_tickle>:
#ifdef RTEMS_SMP
ISR_lock_Control *lock,
#endif
ISR_lock_Context *lock_context
)
{
40027d30: a9bc7bfd stp x29, x30, [sp, #-64]!
40027d34: 910003fd mov x29, sp
40027d38: a90153f3 stp x19, x20, [sp, #16]
40027d3c: aa0003f4 mov x20, x0
40027d40: aa0103f3 mov x19, x1
40027d44: a9025bf5 stp x21, x22, [sp, #32]
40027d48: aa0203f6 mov x22, x2
40027d4c: aa0303f5 mov x21, x3
40027d50: f9001bf7 str x23, [sp, #48]
RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state;
40027d54: 52800057 mov w23, #0x2 // #2
do {
if ( first->expire <= now ) {
40027d58: f9401660 ldr x0, [x19, #40]
40027d5c: eb16001f cmp x0, x22
40027d60: 540002c8 b.hi 40027db8 <_Watchdog_Do_tickle+0x88> // b.pmore
return RB_RIGHT( the_node, Node );
40027d64: f9400664 ldr x4, [x19, #8]
if ( node != NULL ) {
40027d68: b4000324 cbz x4, 40027dcc <_Watchdog_Do_tickle+0x9c>
40027d6c: d503201f nop
return RB_LEFT( the_node, Node );
40027d70: aa0403e1 mov x1, x4
40027d74: f9400084 ldr x4, [x4]
while ( ( left = _RBTree_Left( node ) ) != NULL ) {
40027d78: b5ffffc4 cbnz x4, 40027d70 <_Watchdog_Do_tickle+0x40> <== NEVER TAKEN
header->first = node;
40027d7c: f9000681 str x1, [x20, #8]
Watchdog_Service_routine_entry routine;
_Watchdog_Next_first( header, first );
_RBTree_Extract( &header->Watchdogs, &first->Node.RBTree );
40027d80: aa1303e1 mov x1, x19
40027d84: aa1403e0 mov x0, x20
40027d88: 94000622 bl 40029610 <_RBTree_Extract>
RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state;
40027d8c: b9001a77 str w23, [x19, #24]
_Watchdog_Set_state( first, WATCHDOG_INACTIVE );
routine = first->routine;
40027d90: f9401261 ldr x1, [x19, #32]
_ISR_lock_Release_and_ISR_enable( lock, lock_context );
40027d94: b94002a0 ldr w0, [x21]
40027d98: d51b4220 msr daif, x0
( *routine )( first );
40027d9c: aa1303e0 mov x0, x19
40027da0: d63f0020 blr x1
__asm__ volatile (
40027da4: d53b4220 mrs x0, daif
40027da8: d50342df msr daifset, #0x2
_ISR_lock_ISR_disable_and_acquire( lock, lock_context );
40027dac: b90002a0 str w0, [x21]
return (Watchdog_Control *) header->first;
40027db0: f9400693 ldr x19, [x20, #8]
} else {
break;
}
first = _Watchdog_Header_first( header );
} while ( first != NULL );
40027db4: b5fffd33 cbnz x19, 40027d58 <_Watchdog_Do_tickle+0x28>
}
40027db8: a94153f3 ldp x19, x20, [sp, #16]
40027dbc: a9425bf5 ldp x21, x22, [sp, #32]
40027dc0: f9401bf7 ldr x23, [sp, #48]
40027dc4: a8c47bfd ldp x29, x30, [sp], #64
40027dc8: d65f03c0 ret
header->first = _RBTree_Parent( &the_watchdog->Node.RBTree );
40027dcc: f9400a60 ldr x0, [x19, #16]
40027dd0: f9000680 str x0, [x20, #8]
40027dd4: 17ffffeb b 40027d80 <_Watchdog_Do_tickle+0x50>
...
0000000040027cb0 <_Watchdog_Remove>:
void _Watchdog_Remove(
Watchdog_Header *header,
Watchdog_Control *the_watchdog
)
{
40027cb0: a9be7bfd stp x29, x30, [sp, #-32]!
40027cb4: 910003fd mov x29, sp
40027cb8: f9000bf3 str x19, [sp, #16]
40027cbc: aa0103f3 mov x19, x1
if ( _Watchdog_Is_scheduled( the_watchdog ) ) {
40027cc0: b9401821 ldr w1, [x1, #24]
40027cc4: 7100043f cmp w1, #0x1
40027cc8: 54000089 b.ls 40027cd8 <_Watchdog_Remove+0x28> // b.plast
}
_RBTree_Extract( &header->Watchdogs, &the_watchdog->Node.RBTree );
_Watchdog_Set_state( the_watchdog, WATCHDOG_INACTIVE );
}
}
40027ccc: f9400bf3 ldr x19, [sp, #16]
40027cd0: a8c27bfd ldp x29, x30, [sp], #32
40027cd4: d65f03c0 ret
if ( header->first == &the_watchdog->Node.RBTree ) {
40027cd8: f9400401 ldr x1, [x0, #8]
40027cdc: eb13003f cmp x1, x19
40027ce0: 54000100 b.eq 40027d00 <_Watchdog_Remove+0x50> // b.none
_RBTree_Extract( &header->Watchdogs, &the_watchdog->Node.RBTree );
40027ce4: aa1303e1 mov x1, x19
40027ce8: 9400064a bl 40029610 <_RBTree_Extract>
RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state;
40027cec: 52800040 mov w0, #0x2 // #2
40027cf0: b9001a60 str w0, [x19, #24]
}
40027cf4: f9400bf3 ldr x19, [sp, #16]
40027cf8: a8c27bfd ldp x29, x30, [sp], #32
40027cfc: d65f03c0 ret
return RB_RIGHT( the_node, Node );
40027d00: f9400661 ldr x1, [x19, #8]
if ( node != NULL ) {
40027d04: b40000c1 cbz x1, 40027d1c <_Watchdog_Remove+0x6c>
return RB_LEFT( the_node, Node );
40027d08: aa0103e2 mov x2, x1
40027d0c: f9400021 ldr x1, [x1]
while ( ( left = _RBTree_Left( node ) ) != NULL ) {
40027d10: b5ffffc1 cbnz x1, 40027d08 <_Watchdog_Remove+0x58> <== NEVER TAKEN
header->first = node;
40027d14: f9000402 str x2, [x0, #8]
40027d18: 17fffff3 b 40027ce4 <_Watchdog_Remove+0x34>
header->first = _RBTree_Parent( &the_watchdog->Node.RBTree );
40027d1c: f9400a61 ldr x1, [x19, #16]
40027d20: f9000401 str x1, [x0, #8]
40027d24: 17fffff0 b 40027ce4 <_Watchdog_Remove+0x34>
...
000000004002b060 <_Workspace_Handler_initialization>:
void _Workspace_Handler_initialization(
const Memory_Information *mem,
Heap_Initialization_or_extend_handler extend
)
{
4002b060: a9ba7bfd stp x29, x30, [sp, #-96]!
4002b064: 910003fd mov x29, sp
uintptr_t page_size;
uintptr_t overhead;
size_t i;
page_size = CPU_HEAP_ALIGNMENT;
remaining = rtems_configuration_get_work_space_size();
4002b068: b0000082 adrp x2, 4003c000 <_Scheduler_Table+0x48>
4002b06c: 397ec042 ldrb w2, [x2, #4016]
{
4002b070: a90363f7 stp x23, x24, [sp, #48]
4002b074: aa0103f7 mov x23, x1
4002b078: a9046bf9 stp x25, x26, [sp, #64]
4002b07c: d280001a mov x26, #0x0 // #0
4002b080: f9002bfb str x27, [sp, #80]
4002b084: aa0003fb mov x27, x0
remaining = rtems_configuration_get_work_space_size();
4002b088: 34000862 cbz w2, 4002b194 <_Workspace_Handler_initialization+0x134> <== ALWAYS TAKEN
init_or_extend = _Heap_Initialize;
unified = rtems_configuration_get_unified_work_area();
overhead = _Heap_Area_overhead( page_size );
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b08c: f9400360 ldr x0, [x27]
remaining = rtems_configuration_get_work_space_size();
4002b090: b0000081 adrp x1, 4003c000 <_Scheduler_Table+0x48>
4002b094: f940d021 ldr x1, [x1, #416]
unified = rtems_configuration_get_unified_work_area();
4002b098: b0000082 adrp x2, 4003c000 <_Scheduler_Table+0x48>
4002b09c: 397ec459 ldrb w25, [x2, #4017]
remaining = rtems_configuration_get_work_space_size();
4002b0a0: 8b01035a add x26, x26, x1
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b0a4: b40005e0 cbz x0, 4002b160 <_Workspace_Handler_initialization+0x100> <== NEVER TAKEN
init_or_extend = _Heap_Initialize;
4002b0a8: b0ffffc4 adrp x4, 40024000 <memfile_read+0xe0>
4002b0ac: 913e0084 add x4, x4, #0xf80
} else {
size = 0;
}
}
space_available = ( *init_or_extend )(
4002b0b0: d00006d8 adrp x24, 40105000 <Arr_2_Glob+0x1e68>
4002b0b4: 91304318 add x24, x24, #0xc10
4002b0b8: a90153f3 stp x19, x20, [sp, #16]
4002b0bc: a9025bf5 stp x21, x22, [sp, #32]
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b0c0: d2800016 mov x22, #0x0 // #0
4002b0c4: d2800015 mov x21, #0x0 // #0
4002b0c8: 14000008 b 4002b0e8 <_Workspace_Handler_initialization+0x88>
);
_Memory_Consume( area, size );
if ( space_available < remaining ) {
remaining -= space_available;
4002b0cc: cb00035a sub x26, x26, x0 <== NOT EXECUTED
} else {
remaining = 0;
}
init_or_extend = extend;
4002b0d0: aa1703e4 mov x4, x23 <== NOT EXECUTED
4002b0d4: f9400360 ldr x0, [x27] <== NOT EXECUTED
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b0d8: 910006b5 add x21, x21, #0x1
4002b0dc: 910062d6 add x22, x22, #0x18
4002b0e0: eb0002bf cmp x21, x0
4002b0e4: 540003a2 b.cs 4002b158 <_Workspace_Handler_initialization+0xf8> // b.hs, b.nlast<== ALWAYS TAKEN
return &information->areas[ index ];
4002b0e8: f9400773 ldr x19, [x27, #8]
4002b0ec: 8b160273 add x19, x19, x22
return (uintptr_t) area->end - (uintptr_t) area->free;
4002b0f0: a940d261 ldp x1, x20, [x19, #8]
4002b0f4: cb010294 sub x20, x20, x1
if ( free_size > overhead ) {
4002b0f8: f100ba9f cmp x20, #0x2e
4002b0fc: 54fffee9 b.ls 4002b0d8 <_Workspace_Handler_initialization+0x78> // b.plast
if ( unified ) {
4002b100: 350000d9 cbnz w25, 4002b118 <_Workspace_Handler_initialization+0xb8>
if ( remaining > 0 ) {
4002b104: b40003ba cbz x26, 4002b178 <_Workspace_Handler_initialization+0x118> <== NEVER TAKEN
size = remaining < free_size - overhead ?
4002b108: d100ba82 sub x2, x20, #0x2e
remaining + overhead : free_size;
4002b10c: 9100bb40 add x0, x26, #0x2e
4002b110: eb1a005f cmp x2, x26
4002b114: 9a948014 csel x20, x0, x20, hi // hi = pmore
space_available = ( *init_or_extend )(
4002b118: aa1403e2 mov x2, x20
4002b11c: aa1803e0 mov x0, x24
4002b120: d2800203 mov x3, #0x10 // #16
4002b124: d63f0080 blr x4
area->free = (char *) area->free + consume;
4002b128: f9400661 ldr x1, [x19, #8]
if ( space_available < remaining ) {
4002b12c: eb1a001f cmp x0, x26
4002b130: 8b140021 add x1, x1, x20
4002b134: f9000661 str x1, [x19, #8]
4002b138: 54fffca3 b.cc 4002b0cc <_Workspace_Handler_initialization+0x6c> // b.lo, b.ul, b.last<== NEVER TAKEN
4002b13c: f9400360 ldr x0, [x27]
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b140: 910006b5 add x21, x21, #0x1
init_or_extend = extend;
4002b144: aa1703e4 mov x4, x23
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b148: 910062d6 add x22, x22, #0x18
4002b14c: eb0002bf cmp x21, x0
remaining = 0;
4002b150: d280001a mov x26, #0x0 // #0
for ( i = 0; i < _Memory_Get_count( mem ); ++i ) {
4002b154: 54fffca3 b.cc 4002b0e8 <_Workspace_Handler_initialization+0x88> // b.lo, b.ul, b.last<== NEVER TAKEN
4002b158: a94153f3 ldp x19, x20, [sp, #16]
4002b15c: a9425bf5 ldp x21, x22, [sp, #32]
}
}
if ( remaining > 0 ) {
4002b160: b500021a cbnz x26, 4002b1a0 <_Workspace_Handler_initialization+0x140>
_Internal_error( INTERNAL_ERROR_TOO_LITTLE_WORKSPACE );
}
_Heap_Protection_set_delayed_free_fraction( &_Workspace_Area, 1 );
}
4002b164: a94363f7 ldp x23, x24, [sp, #48]
4002b168: a9446bf9 ldp x25, x26, [sp, #64]
4002b16c: f9402bfb ldr x27, [sp, #80]
4002b170: a8c67bfd ldp x29, x30, [sp], #96
4002b174: d65f03c0 ret
space_available = ( *init_or_extend )(
4002b178: aa1803e0 mov x0, x24 <== NOT EXECUTED
4002b17c: d2800203 mov x3, #0x10 // #16 <== NOT EXECUTED
4002b180: d2800002 mov x2, #0x0 // #0 <== NOT EXECUTED
4002b184: d63f0080 blr x4 <== NOT EXECUTED
init_or_extend = extend;
4002b188: aa1703e4 mov x4, x23 <== NOT EXECUTED
4002b18c: f9400360 ldr x0, [x27] <== NOT EXECUTED
4002b190: 17ffffd2 b 4002b0d8 <_Workspace_Handler_initialization+0x78> <== NOT EXECUTED
remaining = rtems_configuration_get_work_space_size();
4002b194: 940000ef bl 4002b550 <rtems_configuration_get_stack_space_size>
4002b198: aa0003fa mov x26, x0
4002b19c: 17ffffbc b 4002b08c <_Workspace_Handler_initialization+0x2c>
_Internal_error( INTERNAL_ERROR_TOO_LITTLE_WORKSPACE );
4002b1a0: 52800040 mov w0, #0x2 // #2
4002b1a4: a90153f3 stp x19, x20, [sp, #16]
4002b1a8: a9025bf5 stp x21, x22, [sp, #32]
4002b1ac: 97ffe83d bl 400252a0 <_Internal_error>