RTEMS-6
Annotated Report
rtems
Mon Mar 1 00:12:13 2021
000000004002fee0 <_Event_Seize>:
Event_Control *event,
Thread_Wait_flags wait_class,
States_Control block_state,
ISR_lock_Context *lock_context
)
{
4002fee0: a9bc7bfd stp x29, x30, [sp, #-64]!
4002fee4: 910003fd mov x29, sp
rtems_event_set pending_events;
bool success;
Thread_Wait_flags intend_to_block;
Per_CPU_Control *cpu_self;
pending_events = event->pending_events;
4002fee8: b94000a8 ldr w8, [x5]
{
4002feec: a90153f3 stp x19, x20, [sp, #16]
4002fef0: aa0403f3 mov x19, x4
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
4002fef4: 6a000104 ands w4, w8, w0
{
4002fef8: a9025bf5 stp x21, x22, [sp, #32]
4002fefc: 2a0703f5 mov w21, w7
4002ff00: a90363f7 stp x23, x24, [sp, #48]
4002ff04: 2a0603f7 mov w23, w6
if ( !_Event_sets_Is_empty( seized_events ) &&
4002ff08: 54000080 b.eq 4002ff18 <_Event_Seize+0x38> // b.none
4002ff0c: 6b04001f cmp w0, w4
4002ff10: 54000580 b.eq 4002ffc0 <_Event_Seize+0xe0> // b.none
(seized_events == event_in || _Options_Is_any( option_set )) ) {
4002ff14: 37080561 tbnz w1, #1, 4002ffc0 <_Event_Seize+0xe0>
_Thread_Wait_release_default( executing, lock_context );
*event_out = seized_events;
return RTEMS_SUCCESSFUL;
}
if ( _Options_Is_no_wait( option_set ) ) {
4002ff18: 37000a21 tbnz w1, #0, 4003005c <_Event_Seize+0x17c>
disable_level = cpu_self->thread_dispatch_disable_level;
4002ff1c: b00006b4 adrp x20, 40104000 <rtems_libio_iops+0x260>
4002ff20: 91080294 add x20, x20, #0x200
_Thread_Wait_release_default( executing, lock_context );
*event_out = seized_events;
return RTEMS_UNSATISFIED;
}
intend_to_block = wait_class | THREAD_WAIT_STATE_INTEND_TO_BLOCK;
4002ff24: 320002f6 orr w22, w23, #0x1
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.return_code = STATUS_SUCCESSFUL;
executing->Wait.option = option_set;
executing->Wait.count = event_in;
4002ff28: b9007260 str w0, [x19, #112]
executing->Wait.return_code = STATUS_SUCCESSFUL;
4002ff2c: 29117e61 stp w1, wzr, [x19, #136]
the_thread->Wait.flags = flags;
4002ff30: b9009276 str w22, [x19, #144]
executing->Wait.return_argument = event_out;
4002ff34: f9003e63 str x3, [x19, #120]
4002ff38: b9401a80 ldr w0, [x20, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4002ff3c: 11000400 add w0, w0, #0x1
4002ff40: b9001a80 str w0, [x20, #24]
_ISR_lock_ISR_enable( lock_context );
4002ff44: f94023e0 ldr x0, [sp, #64]
4002ff48: b9400000 ldr w0, [x0]
4002ff4c: d51b4220 msr daif, x0
_Thread_Wait_flags_set( executing, intend_to_block );
cpu_self = _Thread_Dispatch_disable_critical( lock_context );
_Thread_Wait_release_default( executing, lock_context );
if ( ticks ) {
4002ff50: 35000682 cbnz w2, 40030020 <_Event_Seize+0x140>
_Thread_Add_timeout_ticks( executing, cpu_self, ticks );
}
_Thread_Set_state( executing, block_state );
4002ff54: 2a1503e1 mov w1, w21
4002ff58: aa1303e0 mov x0, x19
4002ff5c: 97ffeed9 bl 4002bac0 <_Thread_Set_state>
__asm__ volatile (
4002ff60: d53b4220 mrs x0, daif
4002ff64: d50342df msr daifset, #0x2
bool success = ( the_thread->Wait.flags == expected_flags );
4002ff68: b9409261 ldr w1, [x19, #144]
if ( success ) {
4002ff6c: 6b0102df cmp w22, w1
4002ff70: 540001a0 b.eq 4002ffa4 <_Event_Seize+0xc4> // b.none
__asm__ volatile (
4002ff74: 92407c00 and x0, x0, #0xffffffff
4002ff78: d51b4220 msr daif, x0
success = _Thread_Wait_flags_try_change_acquire(
executing,
intend_to_block,
wait_class | THREAD_WAIT_STATE_BLOCKED
);
if ( !success ) {
4002ff7c: 6b0102df cmp w22, w1
4002ff80: 54000381 b.ne 4002fff0 <_Event_Seize+0x110> // b.any <== ALWAYS TAKEN
_Thread_Timer_remove( executing );
_Thread_Unblock( executing );
}
_Thread_Dispatch_direct( cpu_self );
4002ff84: aa1403e0 mov x0, x20
4002ff88: 97ffe93a bl 4002a470 <_Thread_Dispatch_direct>
RTEMS_INLINE_ROUTINE rtems_status_code _Status_Get(
Status_Control status
)
{
return (rtems_status_code) STATUS_GET_CLASSIC( status );
4002ff8c: 39423260 ldrb w0, [x19, #140]
return _Status_Get_after_wait( executing );
}
4002ff90: a94153f3 ldp x19, x20, [sp, #16]
4002ff94: a9425bf5 ldp x21, x22, [sp, #32]
4002ff98: a94363f7 ldp x23, x24, [sp, #48]
4002ff9c: a8c47bfd ldp x29, x30, [sp], #64
4002ffa0: d65f03c0 ret
success = _Thread_Wait_flags_try_change_acquire(
4002ffa4: 321f02e6 orr w6, w23, #0x2
the_thread->Wait.flags = desired_flags;
4002ffa8: b9009266 str w6, [x19, #144]
4002ffac: 92407c00 and x0, x0, #0xffffffff
4002ffb0: d51b4220 msr daif, x0
if ( !success ) {
4002ffb4: 6b0102df cmp w22, w1
4002ffb8: 54fffe60 b.eq 4002ff84 <_Event_Seize+0xa4> // b.none <== ALWAYS TAKEN
4002ffbc: 1400000d b 4002fff0 <_Event_Seize+0x110> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
4002ffc0: 0a240108 bic w8, w8, w4
event->pending_events =
4002ffc4: b90000a8 str w8, [x5]
_ISR_lock_ISR_enable( lock_context );
4002ffc8: f94023e0 ldr x0, [sp, #64]
4002ffcc: b9400000 ldr w0, [x0]
4002ffd0: d51b4220 msr daif, x0
*event_out = seized_events;
4002ffd4: b9000064 str w4, [x3]
return RTEMS_SUCCESSFUL;
4002ffd8: 52800000 mov w0, #0x0 // #0
}
4002ffdc: a94153f3 ldp x19, x20, [sp, #16]
4002ffe0: a9425bf5 ldp x21, x22, [sp, #32]
4002ffe4: a94363f7 ldp x23, x24, [sp, #48]
4002ffe8: a8c47bfd ldp x29, x30, [sp], #64
4002ffec: d65f03c0 ret
__asm__ volatile (
4002fff0: d53b4235 mrs x21, daif
4002fff4: d50342df msr daifset, #0x2
_Watchdog_Remove(
4002fff8: f9405a60 ldr x0, [x19, #176]
4002fffc: 9102e261 add x1, x19, #0xb8
40030000: 97fff034 bl 4002c0d0 <_Watchdog_Remove>
__asm__ volatile (
40030004: 92407eb5 and x21, x21, #0xffffffff
40030008: d51b4235 msr daif, x21
_Thread_Clear_state( the_thread, STATES_BLOCKED );
4003000c: 528bffe1 mov w1, #0x5fff // #24575
40030010: 72a60021 movk w1, #0x3001, lsl #16
40030014: aa1303e0 mov x0, x19
40030018: 940005ca bl 40031740 <_Thread_Clear_state>
}
4003001c: 17ffffda b 4002ff84 <_Event_Seize+0xa4>
__asm__ volatile (
40030020: d53b4238 mrs x24, daif
40030024: d50342df msr daifset, #0x2
expire = ticks + cpu->Watchdog.ticks;
40030028: f9401e83 ldr x3, [x20, #56]
the_thread->Timer.Watchdog.routine = _Thread_Timeout;
4003002c: f0ffffc1 adrp x1, 4002b000 <_Thread_queue_FIFO_enqueue+0x30>
40030030: 9132c021 add x1, x1, #0xcb0
the_thread->Timer.header =
40030034: 900006a0 adrp x0, 40104000 <rtems_libio_iops+0x260>
40030038: 91090000 add x0, x0, #0x240
4003003c: f9005a60 str x0, [x19, #176]
the_thread->Timer.Watchdog.routine = _Thread_Timeout;
40030040: f9006e61 str x1, [x19, #216]
_Watchdog_Insert(header, the_watchdog, expire);
40030044: 8b224062 add x2, x3, w2, uxtw
40030048: 9102e261 add x1, x19, #0xb8
4003004c: 97fff001 bl 4002c050 <_Watchdog_Insert>
__asm__ volatile (
40030050: 92407f18 and x24, x24, #0xffffffff
40030054: d51b4238 msr daif, x24
}
40030058: 17ffffbf b 4002ff54 <_Event_Seize+0x74>
_ISR_lock_ISR_enable( lock_context );
4003005c: f94023e0 ldr x0, [sp, #64]
40030060: b9400000 ldr w0, [x0]
40030064: d51b4220 msr daif, x0
*event_out = seized_events;
40030068: b9000064 str w4, [x3]
return RTEMS_UNSATISFIED;
4003006c: 528001a0 mov w0, #0xd // #13
}
40030070: a94153f3 ldp x19, x20, [sp, #16]
40030074: a9425bf5 ldp x21, x22, [sp, #32]
40030078: a94363f7 ldp x23, x24, [sp, #48]
4003007c: a8c47bfd ldp x29, x30, [sp], #64
40030080: d65f03c0 ret
...
000000004002d840 <_Signal_Action_handler>:
void _Signal_Action_handler(
Thread_Control *executing,
Thread_Action *action,
ISR_lock_Context *lock_context
)
{
4002d840: a9bd7bfd stp x29, x30, [sp, #-48]!
4002d844: 910003fd mov x29, sp
4002d848: a90153f3 stp x19, x20, [sp, #16]
/*
* Signal Processing
*/
api = executing->API_Extensions[ THREAD_API_RTEMS ];
4002d84c: f9411c13 ldr x19, [x0, #568]
ASR_Information *asr
)
{
rtems_signal_set signal_set;
signal_set = asr->signals_posted;
4002d850: 91002273 add x19, x19, #0x8
4002d854: b9401674 ldr w20, [x19, #20]
asr->signals_posted = 0;
4002d858: b900167f str wzr, [x19, #20]
_ISR_lock_ISR_enable( lock_context );
4002d85c: b9400040 ldr w0, [x2]
4002d860: d51b4220 msr daif, x0
asr = &api->Signal;
signal_set = _ASR_Get_posted_signals( asr );
_Thread_State_release( executing, lock_context );
if ( signal_set == 0 ) {
4002d864: 34000254 cbz w20, 4002d8ac <_Signal_Action_handler+0x6c> <== NEVER TAKEN
return;
}
asr->nest_level += 1;
4002d868: b9401e63 ldr w3, [x19, #28]
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
4002d86c: 9100b3e2 add x2, sp, #0x2c
4002d870: b9401260 ldr w0, [x19, #16]
4002d874: 529fffe1 mov w1, #0xffff // #65535
asr->nest_level += 1;
4002d878: 11000463 add w3, w3, #0x1
4002d87c: b9001e63 str w3, [x19, #28]
rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode );
4002d880: 97ffe680 bl 40027280 <rtems_task_mode>
(*asr->handler)( signal_set );
4002d884: f9400661 ldr x1, [x19, #8]
4002d888: 2a1403e0 mov w0, w20
4002d88c: d63f0020 blr x1
asr->nest_level -= 1;
4002d890: b9401e61 ldr w1, [x19, #28]
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
4002d894: 9100b3e2 add x2, sp, #0x2c
4002d898: b9402fe0 ldr w0, [sp, #44]
asr->nest_level -= 1;
4002d89c: 51000421 sub w1, w1, #0x1
4002d8a0: b9001e61 str w1, [x19, #28]
rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode );
4002d8a4: 529fffe1 mov w1, #0xffff // #65535
4002d8a8: 97ffe676 bl 40027280 <rtems_task_mode>
}
4002d8ac: a94153f3 ldp x19, x20, [sp, #16]
4002d8b0: a8c37bfd ldp x29, x30, [sp], #48
4002d8b4: d65f03c0 ret
...
0000000040024ec0 <_TOD_Validate>:
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
40024ec0: 900000a1 adrp x1, 40038000 <__assert_func+0x50>
40024ec4: 52884802 mov w2, #0x4240 // #16960
40024ec8: 72a001e2 movk w2, #0xf, lsl #16
40024ecc: b94da823 ldr w3, [x1, #3496]
{
40024ed0: aa0003e1 mov x1, x0
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
40024ed4: 1ac30842 udiv w2, w2, w3
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
40024ed8: b4000500 cbz x0, 40024f78 <_TOD_Validate+0xb8> <== NEVER TAKEN
40024edc: b9401823 ldr w3, [x1, #24]
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
40024ee0: 52800000 mov w0, #0x0 // #0
if ((!the_tod) ||
40024ee4: 6b02007f cmp w3, w2
40024ee8: 54000462 b.cs 40024f74 <_TOD_Validate+0xb4> // b.hs, b.nlast
(the_tod->ticks >= ticks_per_second) ||
40024eec: b9401422 ldr w2, [x1, #20]
40024ef0: 7100ec5f cmp w2, #0x3b
40024ef4: 54000408 b.hi 40024f74 <_TOD_Validate+0xb4> // b.pmore
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
40024ef8: b9401022 ldr w2, [x1, #16]
40024efc: 7100ec5f cmp w2, #0x3b
40024f00: 540003a8 b.hi 40024f74 <_TOD_Validate+0xb4> // b.pmore
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
40024f04: b9400c22 ldr w2, [x1, #12]
40024f08: 71005c5f cmp w2, #0x17
40024f0c: 54000348 b.hi 40024f74 <_TOD_Validate+0xb4> // b.pmore
(the_tod->month == 0) ||
40024f10: b9400422 ldr w2, [x1, #4]
40024f14: 51000443 sub w3, w2, #0x1
40024f18: 71002c7f cmp w3, #0xb
40024f1c: 540002c8 b.hi 40024f74 <_TOD_Validate+0xb4> // b.pmore
(the_tod->year < TOD_BASE_YEAR) ||
40024f20: b9400023 ldr w3, [x1]
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
40024f24: 711f0c7f cmp w3, #0x7c3
40024f28: 54000269 b.ls 40024f74 <_TOD_Validate+0xb4> // b.plast
(the_tod->day == 0) )
40024f2c: b9400821 ldr w1, [x1, #8]
(the_tod->year < TOD_BASE_YEAR) ||
40024f30: 34000221 cbz w1, 40024f74 <_TOD_Validate+0xb4> <== NEVER TAKEN
if (((the_tod->year % 4) == 0 && (the_tod->year % 100 != 0)) ||
40024f34: f240047f tst x3, #0x3
40024f38: 54000241 b.ne 40024f80 <_TOD_Validate+0xc0> // b.any
40024f3c: 528b8520 mov w0, #0x5c29 // #23593
40024f40: 72b851e0 movk w0, #0xc28f, lsl #16
40024f44: 528b8504 mov w4, #0x5c28 // #23592
40024f48: 72a051e4 movk w4, #0x28f, lsl #16
40024f4c: 1b007c60 mul w0, w3, w0
40024f50: 13800800 ror w0, w0, #2
40024f54: 6b04001f cmp w0, w4
40024f58: 54000149 b.ls 40024f80 <_TOD_Validate+0xc0> // b.plast
(the_tod->year % 400 == 0))
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
40024f5c: b00000a0 adrp x0, 40039000 <rtems_test_name+0x1e8>
40024f60: 91238000 add x0, x0, #0x8e0
40024f64: 8b224802 add x2, x0, w2, uxtw #2
40024f68: b9403440 ldr w0, [x2, #52]
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
if ( the_tod->day > days_in_month )
40024f6c: 6b00003f cmp w1, w0
40024f70: 1a9f87e0 cset w0, ls // ls = plast
return false;
return true;
}
40024f74: d65f03c0 ret
return false;
40024f78: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
}
40024f7c: d65f03c0 ret <== NOT EXECUTED
40024f80: 528b8520 mov w0, #0x5c29 // #23593
40024f84: 72b851e0 movk w0, #0xc28f, lsl #16
if (((the_tod->year % 4) == 0 && (the_tod->year % 100 != 0)) ||
40024f88: 529ae144 mov w4, #0xd70a // #55050
40024f8c: 72a01464 movk w4, #0xa3, lsl #16
40024f90: 1b007c60 mul w0, w3, w0
40024f94: 13801000 ror w0, w0, #4
40024f98: 6b04001f cmp w0, w4
40024f9c: 54fffe09 b.ls 40024f5c <_TOD_Validate+0x9c> // b.plast
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
40024fa0: b00000a0 adrp x0, 40039000 <rtems_test_name+0x1e8>
40024fa4: 91238000 add x0, x0, #0x8e0
40024fa8: b8625800 ldr w0, [x0, w2, uxtw #2]
40024fac: 17fffff0 b 40024f6c <_TOD_Validate+0xac>
0000000040024b50 <rtems_clock_get_tod>:
uint32_t day_secs;
uint32_t year;
uint32_t year_days;
uint32_t leap_years;
if ( !time_buffer )
40024b50: b4001180 cbz x0, 40024d80 <rtems_clock_get_tod+0x230>
{
40024b54: a9bd7bfd stp x29, x30, [sp, #-48]!
40024b58: 910003fd mov x29, sp
40024b5c: f9000bf3 str x19, [sp, #16]
40024b60: aa0003f3 mov x19, x0
return _TOD.is_set;
40024b64: 90000700 adrp x0, 40104000 <_RTEMS_tasks_Objects+0x1760>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set() )
40024b68: 39736001 ldrb w1, [x0, #3288]
return RTEMS_NOT_DEFINED;
40024b6c: 52800160 mov w0, #0xb // #11
if ( !_TOD_Is_set() )
40024b70: 34000be1 cbz w1, 40024cec <rtems_clock_get_tod+0x19c>
_Timecounter_Microtime( time );
40024b74: 910083e0 add x0, sp, #0x20
40024b78: 940004c6 bl 40025e90 <_Timecounter_Microtime>
/* Obtain the current time */
_TOD_Get_timeval( &now );
/* How many days and how many seconds in the day ? */
days = now.tv_sec / RTEMS_SECS_PER_DAY;
40024b7c: f94013e0 ldr x0, [sp, #32]
40024b80: d28956e1 mov x1, #0x4ab7 // #19127
40024b84: f2ae5121 movk x1, #0x7289, lsl #16
day_secs = now.tv_sec % RTEMS_SECS_PER_DAY;
/* How many non-leap year years ? */
year = ( days / RTEMS_DAYS_PER_YEAR ) + RTEMS_YEAR_BASE;
40024b88: 529e6c25 mov w5, #0xf361 // #62305
40024b8c: 72ace325 movk w5, #0x6719, lsl #16
days = now.tv_sec / RTEMS_SECS_PER_DAY;
40024b90: f2c8a0c1 movk x1, #0x4506, lsl #32
40024b94: f2f845c1 movk x1, #0xc22e, lsl #48
day_secs = now.tv_sec % RTEMS_SECS_PER_DAY;
40024b98: d28a3006 mov x6, #0x5180 // #20864
40024b9c: f2a00026 movk x6, #0x1, lsl #16
return (year / 4) - (year / 100) + (year / 400);
40024ba0: 5290a3e2 mov w2, #0x851f // #34079
40024ba4: 72aa3d62 movk w2, #0x51eb, lsl #16
days = now.tv_sec / RTEMS_SECS_PER_DAY;
40024ba8: 9bc17c01 umulh x1, x0, x1
/* Determine the number of leap years. */
leap_years = _Leap_years_between( RTEMS_YEAR_BASE, year );
/* Adjust the remaining number of days based on the leap years. */
year_days = ( days - leap_years ) % RTEMS_DAYS_PER_YEAR;
40024bac: 52802da3 mov w3, #0x16d // #365
days = now.tv_sec / RTEMS_SECS_PER_DAY;
40024bb0: d350fc21 lsr x1, x1, #16
year = ( days / RTEMS_DAYS_PER_YEAR ) + RTEMS_YEAR_BASE;
40024bb4: 9ba57c25 umull x5, w1, w5
day_secs = now.tv_sec % RTEMS_SECS_PER_DAY;
40024bb8: 9b068026 msub x6, x1, x6, x0
year = ( days / RTEMS_DAYS_PER_YEAR ) + RTEMS_YEAR_BASE;
40024bbc: d360fca0 lsr x0, x5, #32
40024bc0: 4b000025 sub w5, w1, w0
40024bc4: 0b450405 add w5, w0, w5, lsr #1
40024bc8: 53087ca5 lsr w5, w5, #8
year -= 1;
40024bcc: 111ec4a4 add w4, w5, #0x7b1
/* Adjust the year and days in the year if in the leap year overflow. */
if ( leap_years > ( days % RTEMS_DAYS_PER_YEAR ) ) {
40024bd0: 1b0384a7 msub w7, w5, w3, w1
return (year / 4) - (year / 100) + (year / 400);
40024bd4: 9ba27c82 umull x2, w4, w2
40024bd8: d367fc40 lsr x0, x2, #39
40024bdc: d365fc42 lsr x2, x2, #37
40024be0: 0b440800 add w0, w0, w4, lsr #2
year_days = ( days - leap_years ) % RTEMS_DAYS_PER_YEAR;
40024be4: 0b010041 add w1, w2, w1
40024be8: 51077400 sub w0, w0, #0x1dd
40024bec: 4b000021 sub w1, w1, w0
return _Leap_years_before( to ) - _Leap_years_before( from + 1 );
40024bf0: 4b020000 sub w0, w0, w2
if ( leap_years > ( days % RTEMS_DAYS_PER_YEAR ) ) {
40024bf4: 6b0000ff cmp w7, w0
year_days = ( days - leap_years ) % RTEMS_DAYS_PER_YEAR;
40024bf8: 1ac30820 udiv w0, w1, w3
40024bfc: 1b038403 msub w3, w0, w3, w1
if ( leap_years > ( days % RTEMS_DAYS_PER_YEAR ) ) {
40024c00: 540007c3 b.cc 40024cf8 <rtems_clock_get_tod+0x1a8> // b.lo, b.ul, b.last
year = ( days / RTEMS_DAYS_PER_YEAR ) + RTEMS_YEAR_BASE;
40024c04: 111ec8a4 add w4, w5, #0x7b2
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024c08: 12000480 and w0, w4, #0x3
if ( _Leap_year( year ) ) {
year_days += 1;
}
}
time_buffer->year = year;
40024c0c: b9000264 str w4, [x19]
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024c10: 35000120 cbnz w0, 40024c34 <rtems_clock_get_tod+0xe4>
40024c14: 528b8520 mov w0, #0x5c29 // #23593
40024c18: 72b851e0 movk w0, #0xc28f, lsl #16
40024c1c: 528b8501 mov w1, #0x5c28 // #23592
40024c20: 72a051e1 movk w1, #0x28f, lsl #16
40024c24: 1b007c80 mul w0, w4, w0
40024c28: 13800800 ror w0, w0, #2
40024c2c: 6b01001f cmp w0, w1
40024c30: 540009a8 b.hi 40024d64 <rtems_clock_get_tod+0x214> // b.pmore
40024c34: 528b8520 mov w0, #0x5c29 // #23593
40024c38: 72b851e0 movk w0, #0xc28f, lsl #16
days_to_date = _TOD_Days_to_date[0];
40024c3c: b00000a1 adrp x1, 40039000 <rtems_test_name+0x1e8>
40024c40: 9122a022 add x2, x1, #0x8a8
40024c44: 1b007c84 mul w4, w4, w0
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024c48: 529ae145 mov w5, #0xd70a // #55050
40024c4c: 72a01465 movk w5, #0xa3, lsl #16
days_to_date = _TOD_Days_to_date[0];
40024c50: b00000a1 adrp x1, 40039000 <rtems_test_name+0x1e8>
40024c54: 91230821 add x1, x1, #0x8c2
40024c58: 13841084 ror w4, w4, #4
40024c5c: 6b05009f cmp w4, w5
40024c60: 9a829021 csel x1, x1, x2, ls // ls = plast
days_to_date += 2;
40024c64: 91001021 add x1, x1, #0x4
uint32_t month = 0;
40024c68: 52800002 mov w2, #0x0 // #0
40024c6c: d503201f nop
if (*day < *days_to_date)
40024c70: 79400024 ldrh w4, [x1]
++month;
40024c74: 11000442 add w2, w2, #0x1
if (*day < *days_to_date)
40024c78: 6b03009f cmp w4, w3
40024c7c: 54000608 b.hi 40024d3c <rtems_clock_get_tod+0x1ec> // b.pmore
++days_to_date;
40024c80: 91000821 add x1, x1, #0x2
while (month < 11) {
40024c84: 71002c5f cmp w2, #0xb
40024c88: 54ffff41 b.ne 40024c70 <rtems_clock_get_tod+0x120> // b.any
40024c8c: 52800182 mov w2, #0xc // #12
time_buffer->month = _Year_day_as_month( year, &year_days ) + 1;
time_buffer->day = year_days + 1;
time_buffer->hour = day_secs / RTEMS_SECS_PER_HOUR;
40024c90: 529678a5 mov w5, #0xb3c5 // #46021
40024c94: 72b23445 movk w5, #0x91a2, lsl #16
time_buffer->minute = day_secs % RTEMS_SECS_PER_HOUR;
40024c98: 5281c207 mov w7, #0xe10 // #3600
time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE;
40024c9c: 52911121 mov w1, #0x8889 // #34953
40024ca0: 72b11101 movk w1, #0x8888, lsl #16
time_buffer->hour = day_secs / RTEMS_SECS_PER_HOUR;
40024ca4: 9ba57cc5 umull x5, w6, w5
time_buffer->minute = time_buffer->minute / RTEMS_SECS_PER_MINUTE;
time_buffer->ticks = now.tv_usec /
40024ca8: 900000a0 adrp x0, 40038000 <__assert_func+0x50>
40024cac: b94da80a ldr w10, [x0, #3496]
40024cb0: f94017e8 ldr x8, [sp, #40]
time_buffer->hour = day_secs / RTEMS_SECS_PER_HOUR;
40024cb4: d36bfca5 lsr x5, x5, #43
time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE;
40024cb8: 52800789 mov w9, #0x3c // #60
time_buffer->day = year_days + 1;
40024cbc: 11000463 add w3, w3, #0x1
40024cc0: 4b040064 sub w4, w3, w4
rtems_configuration_get_microseconds_per_tick( );
return RTEMS_SUCCESSFUL;
40024cc4: 52800000 mov w0, #0x0 // #0
time_buffer->minute = day_secs % RTEMS_SECS_PER_HOUR;
40024cc8: 1b0798a6 msub w6, w5, w7, w6
time_buffer->day = year_days + 1;
40024ccc: 29009262 stp w2, w4, [x19, #4]
time_buffer->ticks = now.tv_usec /
40024cd0: 9aca0d08 sdiv x8, x8, x10
time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE;
40024cd4: 9ba17cc1 umull x1, w6, w1
time_buffer->ticks = now.tv_usec /
40024cd8: b9001a68 str w8, [x19, #24]
time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE;
40024cdc: d365fc21 lsr x1, x1, #37
time_buffer->minute = time_buffer->minute / RTEMS_SECS_PER_MINUTE;
40024ce0: 29018665 stp w5, w1, [x19, #12]
time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE;
40024ce4: 1b099821 msub w1, w1, w9, w6
40024ce8: b9001661 str w1, [x19, #20]
}
40024cec: f9400bf3 ldr x19, [sp, #16]
40024cf0: a8c37bfd ldp x29, x30, [sp], #48
40024cf4: d65f03c0 ret
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024cf8: 528b8521 mov w1, #0x5c29 // #23593
40024cfc: 72b851e1 movk w1, #0xc28f, lsl #16
40024d00: 72000480 ands w0, w4, #0x3
40024d04: 54000201 b.ne 40024d44 <rtems_clock_get_tod+0x1f4> // b.any
40024d08: 1b017c81 mul w1, w4, w1
40024d0c: 528b8502 mov w2, #0x5c28 // #23592
40024d10: 72a051e2 movk w2, #0x28f, lsl #16
40024d14: 13810825 ror w5, w1, #2
40024d18: 6b0200bf cmp w5, w2
40024d1c: 54000208 b.hi 40024d5c <rtems_clock_get_tod+0x20c> // b.pmore
40024d20: 529ae142 mov w2, #0xd70a // #55050
40024d24: 72a01462 movk w2, #0xa3, lsl #16
40024d28: 13811021 ror w1, w1, #4
40024d2c: 6b02003f cmp w1, w2
40024d30: 54000169 b.ls 40024d5c <rtems_clock_get_tod+0x20c> // b.plast
time_buffer->year = year;
40024d34: b9000264 str w4, [x19]
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024d38: 17ffffb7 b 40024c14 <rtems_clock_get_tod+0xc4>
*day -= *(days_to_date - 1);
40024d3c: 785fe024 ldurh w4, [x1, #-2]
40024d40: 17ffffd4 b 40024c90 <rtems_clock_get_tod+0x140>
time_buffer->year = year;
40024d44: 1b017c81 mul w1, w4, w1
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024d48: 529ae142 mov w2, #0xd70a // #55050
40024d4c: 72a01462 movk w2, #0xa3, lsl #16
time_buffer->year = year;
40024d50: 13811021 ror w1, w1, #4
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024d54: 6b02003f cmp w1, w2
40024d58: 540000c8 b.hi 40024d70 <rtems_clock_get_tod+0x220> // b.pmore <== ALWAYS TAKEN
year_days += 1;
40024d5c: 11000463 add w3, w3, #0x1
40024d60: 17ffffab b 40024c0c <rtems_clock_get_tod+0xbc>
days_to_date = _TOD_Days_to_date[1];
40024d64: b00000a1 adrp x1, 40039000 <rtems_test_name+0x1e8>
40024d68: 91230821 add x1, x1, #0x8c2
40024d6c: 17ffffbe b 40024c64 <rtems_clock_get_tod+0x114>
days_to_date = _TOD_Days_to_date[0];
40024d70: b00000a1 adrp x1, 40039000 <rtems_test_name+0x1e8>
40024d74: 9122a021 add x1, x1, #0x8a8
time_buffer->year = year;
40024d78: b9000264 str w4, [x19]
return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0);
40024d7c: 17ffffba b 40024c64 <rtems_clock_get_tod+0x114>
return RTEMS_INVALID_ADDRESS;
40024d80: 52800120 mov w0, #0x9 // #9
}
40024d84: d65f03c0 ret
...
0000000040024f90 <rtems_clock_tick>:
#include <rtems/rtems/clock.h>
#include <rtems/score/timecounter.h>
#include <rtems/score/threadimpl.h>
rtems_status_code rtems_clock_tick( void )
{
40024f90: a9be7bfd stp x29, x30, [sp, #-32]!
40024f94: 910003fd mov x29, sp
40024f98: d53b4220 mrs x0, daif
40024f9c: d50342df msr daifset, #0x2
ISR_lock_Context lock_context;
_Timecounter_Acquire( &lock_context );
40024fa0: b9001be0 str w0, [sp, #24]
_Timecounter_Tick_simple(
40024fa4: 900000a0 adrp x0, 40038000 <bsp_section_rodata_begin+0x6a8>
40024fa8: 910063e2 add x2, sp, #0x18
40024fac: 52800001 mov w1, #0x0 // #0
40024fb0: b9472000 ldr w0, [x0, #1824]
40024fb4: 940005df bl 40026730 <_Timecounter_Tick_simple>
40024fb8: f00006e0 adrp x0, 40103000 <_Thread_Heads+0x28>
40024fbc: 91220000 add x0, x0, #0x880
40024fc0: b9401800 ldr w0, [x0, #24]
rtems_configuration_get_microseconds_per_tick(),
0,
&lock_context
);
if ( _Thread_Dispatch_is_enabled() ) {
40024fc4: 34000080 cbz w0, 40024fd4 <rtems_clock_tick+0x44> <== ALWAYS TAKEN
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
40024fc8: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
40024fcc: a8c27bfd ldp x29, x30, [sp], #32 <== NOT EXECUTED
40024fd0: d65f03c0 ret <== NOT EXECUTED
_Thread_Dispatch();
40024fd4: 9400090b bl 40027400 <_Thread_Dispatch>
}
40024fd8: 52800000 mov w0, #0x0 // #0
40024fdc: a8c27bfd ldp x29, x30, [sp], #32
40024fe0: d65f03c0 ret
...
0000000040025400 <rtems_object_get_class_information>:
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
40025400: b4000442 cbz x2, 40025488 <rtems_object_get_class_information+0x88>
{
40025404: a9be7bfd stp x29, x30, [sp, #-32]!
40025408: 910003fd mov x29, sp
4002540c: f9000bf3 str x19, [sp, #16]
40025410: aa0203f3 mov x19, x2
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
40025414: 94000473 bl 400265e0 <_Objects_Get_information>
if ( !obj_info )
40025418: b40003c0 cbz x0, 40025490 <rtems_object_get_class_information+0x90>
*/
RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Is_auto_extend(
const Objects_Information *information
)
{
return information->objects_per_block != 0;
4002541c: 79404401 ldrh w1, [x0, #34]
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = _Objects_Get_minimum_id( obj_info->maximum_id );
40025420: b9400003 ldr w3, [x0]
40025424: 7100003f cmp w1, #0x0
id &= ~OBJECTS_INDEX_MASK;
40025428: 12103c61 and w1, w3, #0xffff0000
return information->objects_per_block != 0;
4002542c: 1a9f07e2 cset w2, ne // ne = any
id += (Objects_Id) OBJECTS_INDEX_MINIMUM << OBJECTS_INDEX_START_BIT;
40025430: 11000421 add w1, w1, #0x1
info->maximum_id = obj_info->maximum_id;
40025434: 29000e61 stp w1, w3, [x19]
40025438: 12003c63 and w3, w3, #0xffff
info->auto_extend = _Objects_Is_auto_extend( obj_info );
info->maximum = _Objects_Get_maximum_index( obj_info );
4002543c: b9000a63 str w3, [x19, #8]
return information->objects_per_block != 0;
40025440: 39003262 strb w2, [x19, #12]
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
40025444: 34000183 cbz w3, 40025474 <rtems_object_get_class_information+0x74> <== NEVER TAKEN
40025448: 52800001 mov w1, #0x0 // #0
if ( !obj_info->local_table[i] )
4002544c: f9400402 ldr x2, [x0, #8]
40025450: d2800020 mov x0, #0x1 // #1
40025454: d503201f nop
40025458: f8607844 ldr x4, [x2, x0, lsl #3]
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
4002545c: 91000400 add x0, x0, #0x1
unallocated++;
40025460: f100009f cmp x4, #0x0
40025464: 1a811421 cinc w1, w1, eq // eq = none
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
40025468: 6b00007f cmp w3, w0
4002546c: 54ffff62 b.cs 40025458 <rtems_object_get_class_information+0x58> // b.hs, b.nlast
info->unallocated = unallocated;
40025470: 2a0103e3 mov w3, w1
return RTEMS_SUCCESSFUL;
40025474: 52800000 mov w0, #0x0 // #0
info->unallocated = unallocated;
40025478: b9001263 str w3, [x19, #16]
}
4002547c: f9400bf3 ldr x19, [sp, #16]
40025480: a8c27bfd ldp x29, x30, [sp], #32
40025484: d65f03c0 ret
return RTEMS_INVALID_ADDRESS;
40025488: 52800120 mov w0, #0x9 // #9
}
4002548c: d65f03c0 ret
return RTEMS_INVALID_NUMBER;
40025490: 52800140 mov w0, #0xa // #10
40025494: 17fffffa b 4002547c <rtems_object_get_class_information+0x7c>
...
0000000040023e20 <rtems_object_set_name>:
Objects_Information *information;
Objects_Control *the_object;
Objects_Id tmpId;
Status_Control status;
if ( !name )
40023e20: b40004e1 cbz x1, 40023ebc <rtems_object_set_name+0x9c>
{
40023e24: a9bd7bfd stp x29, x30, [sp, #-48]!
40023e28: 910003fd mov x29, sp
40023e2c: a90153f3 stp x19, x20, [sp, #16]
40023e30: 2a0003f3 mov w19, w0
40023e34: f90013f5 str x21, [sp, #32]
40023e38: aa0103f5 mov x21, x1
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? rtems_task_self() : id;
40023e3c: 340002a0 cbz w0, 40023e90 <rtems_object_set_name+0x70>
information = _Objects_Get_information_id( tmpId );
40023e40: 2a1303e0 mov w0, w19
40023e44: 94000273 bl 40024810 <_Objects_Get_information_id>
40023e48: aa0003f4 mov x20, x0
if ( !information )
40023e4c: b40002e0 cbz x0, 40023ea8 <rtems_object_set_name+0x88>
*
* @see _Objects_Allocator_unlock() and _Objects_Allocate().
*/
RTEMS_INLINE_ROUTINE void _Objects_Allocator_lock( void )
{
_RTEMS_Lock_allocator();
40023e50: 9400007c bl 40024040 <_RTEMS_Lock_allocator>
return RTEMS_INVALID_ID;
_Objects_Allocator_lock();
the_object = _Objects_Get_no_protection( tmpId, information );
40023e54: aa1403e1 mov x1, x20
40023e58: 2a1303e0 mov w0, w19
40023e5c: 940002dd bl 400249d0 <_Objects_Get_no_protection>
40023e60: aa0003e1 mov x1, x0
if ( the_object == NULL ) {
40023e64: b4000300 cbz x0, 40023ec4 <rtems_object_set_name+0xa4>
_Objects_Allocator_unlock();
return RTEMS_INVALID_ID;
}
status = _Objects_Set_name( information, the_object, name );
40023e68: aa1503e2 mov x2, x21
40023e6c: aa1403e0 mov x0, x20
40023e70: 940002e8 bl 40024a10 <_Objects_Set_name>
40023e74: 2a0003f3 mov w19, w0
* previous thread life protection state and thus may not return if the
* executing thread was restarted or deleted in the mean-time.
*/
RTEMS_INLINE_ROUTINE void _Objects_Allocator_unlock( void )
{
_RTEMS_Unlock_allocator();
40023e78: 94000076 bl 40024050 <_RTEMS_Unlock_allocator>
_Objects_Allocator_unlock();
return STATUS_GET_CLASSIC( status );
40023e7c: 12001e60 and w0, w19, #0xff
}
40023e80: a94153f3 ldp x19, x20, [sp, #16]
40023e84: f94013f5 ldr x21, [sp, #32]
40023e88: a8c37bfd ldp x29, x30, [sp], #48
40023e8c: d65f03c0 ret
tmpId = (id == OBJECTS_ID_OF_SELF) ? rtems_task_self() : id;
40023e90: 94000030 bl 40023f50 <rtems_task_self>
40023e94: 2a0003f3 mov w19, w0
information = _Objects_Get_information_id( tmpId );
40023e98: 2a1303e0 mov w0, w19
40023e9c: 9400025d bl 40024810 <_Objects_Get_information_id>
40023ea0: aa0003f4 mov x20, x0
if ( !information )
40023ea4: b5fffd60 cbnz x0, 40023e50 <rtems_object_set_name+0x30> <== ALWAYS TAKEN
return RTEMS_INVALID_ID;
40023ea8: 52800080 mov w0, #0x4 // #4
}
40023eac: a94153f3 ldp x19, x20, [sp, #16]
40023eb0: f94013f5 ldr x21, [sp, #32]
40023eb4: a8c37bfd ldp x29, x30, [sp], #48
40023eb8: d65f03c0 ret
return RTEMS_INVALID_ADDRESS;
40023ebc: 52800120 mov w0, #0x9 // #9
}
40023ec0: d65f03c0 ret
40023ec4: 94000063 bl 40024050 <_RTEMS_Unlock_allocator>
return RTEMS_INVALID_ID;
40023ec8: 52800080 mov w0, #0x4 // #4
40023ecc: 17ffffed b 40023e80 <rtems_object_set_name+0x60>
000000004002f660 <rtems_partition_create>:
{
4002f660: a9b97bfd stp x29, x30, [sp, #-112]!
4002f664: 910003fd mov x29, sp
4002f668: b9004fe4 str w4, [sp, #76]
if ( !rtems_is_name_valid( name ) ) {
4002f66c: 340007a0 cbz w0, 4002f760 <rtems_partition_create+0x100>
if ( starting_address == NULL ) {
4002f670: a90263f7 stp x23, x24, [sp, #32]
4002f674: f10000bf cmp x5, #0x0
4002f678: aa0503f7 mov x23, x5
4002f67c: fa401824 ccmp x1, #0x0, #0x4, ne // ne = any
4002f680: 54000760 b.eq 4002f76c <rtems_partition_create+0x10c> // b.none
if ( length < buffer_size )
4002f684: f100005f cmp x2, #0x0
4002f688: a9015bf4 stp x20, x22, [sp, #16]
4002f68c: fa4f1860 ccmp x3, #0xf, #0x0, ne // ne = any
4002f690: a9036bf9 stp x25, x26, [sp, #48]
4002f694: fa438040 ccmp x2, x3, #0x0, hi // hi = pmore
4002f698: 2a0003f6 mov w22, w0
4002f69c: aa0203f4 mov x20, x2
4002f6a0: 1a9f27f9 cset w25, cc // cc = lo, ul, last
return RTEMS_INVALID_SIZE;
4002f6a4: 52800100 mov w0, #0x8 // #8
if ( length < buffer_size )
4002f6a8: 540000c2 b.cs 4002f6c0 <rtems_partition_create+0x60> // b.hs, b.nlast
4002f6ac: a9415bf4 ldp x20, x22, [sp, #16]
4002f6b0: a94263f7 ldp x23, x24, [sp, #32]
4002f6b4: a9436bf9 ldp x25, x26, [sp, #48]
}
4002f6b8: a8c77bfd ldp x29, x30, [sp], #112
4002f6bc: d65f03c0 ret
if ( buffer_size < sizeof( Chain_Node ) )
4002f6c0: f9002be3 str x3, [sp, #80]
4002f6c4: f240087f tst x3, #0x7
4002f6c8: 54ffff21 b.ne 4002f6ac <rtems_partition_create+0x4c> // b.any <== NEVER TAKEN
if ( (uintptr_t) starting_address % CPU_SIZEOF_POINTER != 0 ) {
4002f6cc: f9002fe1 str x1, [sp, #88]
4002f6d0: f240083f tst x1, #0x7
return RTEMS_INVALID_ADDRESS;
4002f6d4: 52800120 mov w0, #0x9 // #9
if ( (uintptr_t) starting_address % CPU_SIZEOF_POINTER != 0 ) {
4002f6d8: 54fffea1 b.ne 4002f6ac <rtems_partition_create+0x4c> // b.any
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
4002f6dc: b000069a adrp x26, 40100000 <_Barrier_Information>
4002f6e0: 9105835a add x26, x26, #0x160
4002f6e4: aa1a03e0 mov x0, x26
4002f6e8: 94000a76 bl 400320c0 <_Objects_Allocate>
if ( !the_partition ) {
4002f6ec: b9404fe4 ldr w4, [sp, #76]
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
4002f6f0: aa0003f8 mov x24, x0
if ( !the_partition ) {
4002f6f4: a94507e3 ldp x3, x1, [sp, #80]
4002f6f8: b4000420 cbz x0, 4002f77c <rtems_partition_create+0x11c>
_Chain_Initialize(
4002f6fc: 9ac30a82 udiv x2, x20, x3
the_partition->length = length;
4002f700: a9025301 stp x1, x20, [x24, #32]
_Chain_Initialize(
4002f704: 91012000 add x0, x0, #0x48
the_partition->buffer_size = buffer_size;
4002f708: f9001b03 str x3, [x24, #48]
the_partition->attribute_set = attribute_set;
4002f70c: b9003b04 str w4, [x24, #56]
the_partition->number_of_used_blocks = 0;
4002f710: f900231f str xzr, [x24, #64]
_Chain_Initialize(
4002f714: 94000363 bl 400304a0 <_Chain_Initialize>
_Objects_Open(
4002f718: b90063ff str wzr, [sp, #96]
4002f71c: d2800001 mov x1, #0x0 // #0
_Objects_Get_index( the_object->id ),
4002f720: b9401302 ldr w2, [x24, #16]
4002f724: b3607f21 bfi x1, x25, #32, #32
information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object;
4002f728: f9400743 ldr x3, [x26, #8]
4002f72c: 12003c40 and w0, w2, #0xffff
4002f730: 51000400 sub w0, w0, #0x1
4002f734: b3407ec1 bfxil x1, x22, #0, #32
the_object->name = name;
4002f738: f9000f01 str x1, [x24, #24]
information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object;
4002f73c: f8207878 str x24, [x3, x0, lsl #3]
*id = the_partition->Object.id;
4002f740: b90002e2 str w2, [x23]
_RTEMS_Unlock_allocator();
4002f744: 94000333 bl 40030410 <_RTEMS_Unlock_allocator>
return RTEMS_SUCCESSFUL;
4002f748: 52800000 mov w0, #0x0 // #0
4002f74c: a9415bf4 ldp x20, x22, [sp, #16]
4002f750: a94263f7 ldp x23, x24, [sp, #32]
4002f754: a9436bf9 ldp x25, x26, [sp, #48]
}
4002f758: a8c77bfd ldp x29, x30, [sp], #112
4002f75c: d65f03c0 ret
return RTEMS_INVALID_NAME;
4002f760: 52800060 mov w0, #0x3 // #3
}
4002f764: a8c77bfd ldp x29, x30, [sp], #112
4002f768: d65f03c0 ret
return RTEMS_INVALID_ADDRESS;
4002f76c: 52800120 mov w0, #0x9 // #9
4002f770: a94263f7 ldp x23, x24, [sp, #32]
}
4002f774: a8c77bfd ldp x29, x30, [sp], #112
4002f778: d65f03c0 ret
4002f77c: 94000325 bl 40030410 <_RTEMS_Unlock_allocator>
return RTEMS_TOO_MANY;
4002f780: 528000a0 mov w0, #0x5 // #5
4002f784: a9415bf4 ldp x20, x22, [sp, #16]
4002f788: a94263f7 ldp x23, x24, [sp, #32]
4002f78c: a9436bf9 ldp x25, x26, [sp, #48]
4002f790: 17ffffca b 4002f6b8 <rtems_partition_create+0x58>
...
0000000040024cb0 <rtems_rate_monotonic_report_statistics_with_plugin>:
#define NANOSECONDS_FMT "%06ld"
void rtems_rate_monotonic_report_statistics_with_plugin(
const rtems_printer *printer
)
{
40024cb0: a9b17bfd stp x29, x30, [sp, #-240]!
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
rtems_printf( printer, "Period information by period\n" );
40024cb4: b00000a1 adrp x1, 40039000 <rtems_test_name+0x228>
40024cb8: 91178021 add x1, x1, #0x5e0
{
40024cbc: 910003fd mov x29, sp
40024cc0: a90153f3 stp x19, x20, [sp, #16]
40024cc4: a9025bf5 stp x21, x22, [sp, #32]
40024cc8: aa0003f5 mov x21, x0
rtems_printf( printer, "Period information by period\n" );
40024ccc: 94001111 bl 40029110 <rtems_printf>
rtems_printf( printer, "--- CPU times are in seconds ---\n" );
40024cd0: aa1503e0 mov x0, x21
40024cd4: b00000a1 adrp x1, 40039000 <rtems_test_name+0x228>
40024cd8: 91180021 add x1, x1, #0x600
40024cdc: 9400110d bl 40029110 <rtems_printf>
rtems_printf( printer, "--- Wall times are in seconds ---\n" );
40024ce0: aa1503e0 mov x0, x21
40024ce4: b00000a1 adrp x1, 40039000 <rtems_test_name+0x228>
40024ce8: 9118a021 add x1, x1, #0x628
40024cec: 94001109 bl 40029110 <rtems_printf>
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
rtems_printf( printer,
40024cf0: aa1503e0 mov x0, x21
40024cf4: b00000a1 adrp x1, 40039000 <rtems_test_name+0x228>
40024cf8: 91194021 add x1, x1, #0x650
40024cfc: 94001105 bl 40029110 <rtems_printf>
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
maximum_id = _Rate_monotonic_Information.maximum_id;
40024d00: 900006e0 adrp x0, 40100000 <_RTEMS_tasks_Information>
40024d04: b9407016 ldr w22, [x0, #112]
id &= ~OBJECTS_INDEX_MASK;
40024d08: 12103ed3 and w19, w22, #0xffff0000
id += (Objects_Id) OBJECTS_INDEX_MINIMUM << OBJECTS_INDEX_START_BIT;
40024d0c: 11000673 add w19, w19, #0x1
for (
40024d10: 6b1302df cmp w22, w19
40024d14: 54000a03 b.cc 40024e54 <rtems_rate_monotonic_report_statistics_with_plugin+0x1a4> // b.lo, b.ul, b.last<== NEVER TAKEN
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
rtems_printf( printer,
40024d18: d29ef9f4 mov x20, #0xf7cf // #63439
40024d1c: f2bc6a74 movk x20, #0xe353, lsl #16
40024d20: f2d374b4 movk x20, #0x9ba5, lsl #32
40024d24: f2e41894 movk x20, #0x20c4, lsl #48
40024d28: a90363f7 stp x23, x24, [sp, #48]
rtems_printf( printer,
40024d2c: b00000b7 adrp x23, 40039000 <rtems_test_name+0x228>
40024d30: 911ba2f7 add x23, x23, #0x6e8
rtems_printf( printer,
40024d34: b00000b8 adrp x24, 40039000 <rtems_test_name+0x228>
40024d38: 911c0318 add x24, x24, #0x700
40024d3c: 14000028 b 40024ddc <rtems_rate_monotonic_report_statistics_with_plugin+0x12c>
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
40024d40: 94000d18 bl 400281a0 <_Timespec_Divide_by_integer>
rtems_printf( printer,
40024d44: a944abe6 ldp x6, x10, [sp, #72]
40024d48: aa1803e1 mov x1, x24
40024d4c: a94923e2 ldp x2, x8, [sp, #144]
40024d50: aa1503e0 mov x0, x21
40024d54: a94a27e4 ldp x4, x9, [sp, #160]
40024d58: 9b547d47 smulh x7, x10, x20
40024d5c: 9b547d03 smulh x3, x8, x20
40024d60: 9347fce7 asr x7, x7, #7
40024d64: 9b547d25 smulh x5, x9, x20
40024d68: cb8afce7 sub x7, x7, x10, asr #63
40024d6c: 9347fc63 asr x3, x3, #7
40024d70: cb88fc63 sub x3, x3, x8, asr #63
40024d74: 9347fca5 asr x5, x5, #7
40024d78: cb89fca5 sub x5, x5, x9, asr #63
40024d7c: 940010e5 bl 40029110 <rtems_printf>
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
40024d80: b9408be1 ldr w1, [sp, #136]
40024d84: 910123e2 add x2, sp, #0x48
40024d88: 910383e0 add x0, sp, #0xe0
40024d8c: 94000d05 bl 400281a0 <_Timespec_Divide_by_integer>
rtems_printf( printer,
40024d90: a944abe6 ldp x6, x10, [sp, #72]
40024d94: b00000a1 adrp x1, 40039000 <rtems_test_name+0x228>
40024d98: 911c8021 add x1, x1, #0x720
40024d9c: aa1503e0 mov x0, x21
40024da0: a94c23e2 ldp x2, x8, [sp, #192]
40024da4: a94d27e4 ldp x4, x9, [sp, #208]
40024da8: 9b547d47 smulh x7, x10, x20
40024dac: 9b547d03 smulh x3, x8, x20
40024db0: 9347fce7 asr x7, x7, #7
40024db4: cb8afce7 sub x7, x7, x10, asr #63
40024db8: 9b547d25 smulh x5, x9, x20
40024dbc: 9347fc63 asr x3, x3, #7
40024dc0: cb88fc63 sub x3, x3, x8, asr #63
40024dc4: 9347fca5 asr x5, x5, #7
40024dc8: cb89fca5 sub x5, x5, x9, asr #63
40024dcc: 940010d1 bl 40029110 <rtems_printf>
++id
40024dd0: 11000673 add w19, w19, #0x1
for (
40024dd4: 6b1302df cmp w22, w19
40024dd8: 540003c3 b.cc 40024e50 <rtems_rate_monotonic_report_statistics_with_plugin+0x1a0> // b.lo, b.ul, b.last
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
40024ddc: 910223e1 add x1, sp, #0x88
40024de0: 2a1303e0 mov w0, w19
40024de4: 94001327 bl 40029a80 <rtems_rate_monotonic_get_statistics>
40024de8: 2a0003e2 mov w2, w0
(void) rtems_rate_monotonic_get_status( id, &the_status );
40024dec: 910163e1 add x1, sp, #0x58
40024df0: 2a1303e0 mov w0, w19
if ( status != RTEMS_SUCCESSFUL )
40024df4: 35fffee2 cbnz w2, 40024dd0 <rtems_rate_monotonic_report_statistics_with_plugin+0x120>
(void) rtems_rate_monotonic_get_status( id, &the_status );
40024df8: 9400135e bl 40029b70 <rtems_rate_monotonic_get_status>
rtems_object_get_name( the_status.owner, sizeof(name), name );
40024dfc: b9405be0 ldr w0, [sp, #88]
40024e00: 910103e2 add x2, sp, #0x40
40024e04: d28000a1 mov x1, #0x5 // #5
40024e08: 94000092 bl 40025050 <rtems_object_get_name>
rtems_printf( printer,
40024e0c: 295117e4 ldp w4, w5, [sp, #136]
40024e10: 2a1303e2 mov w2, w19
40024e14: aa1703e1 mov x1, x23
40024e18: 910103e3 add x3, sp, #0x40
40024e1c: aa1503e0 mov x0, x21
40024e20: 940010bc bl 40029110 <rtems_printf>
if (the_stats.count == 0) {
40024e24: b9408be1 ldr w1, [sp, #136]
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
40024e28: 910123e2 add x2, sp, #0x48
40024e2c: 9102c3e0 add x0, sp, #0xb0
if (the_stats.count == 0) {
40024e30: 35fff881 cbnz w1, 40024d40 <rtems_rate_monotonic_report_statistics_with_plugin+0x90>
rtems_printf( printer, "\n" );
40024e34: aa1503e0 mov x0, x21
++id
40024e38: 11000673 add w19, w19, #0x1
rtems_printf( printer, "\n" );
40024e3c: d00000a1 adrp x1, 4003a000 <_Memory_Information+0x38>
40024e40: 91038021 add x1, x1, #0xe0
40024e44: 940010b3 bl 40029110 <rtems_printf>
for (
40024e48: 6b1302df cmp w22, w19
40024e4c: 54fffc82 b.cs 40024ddc <rtems_rate_monotonic_report_statistics_with_plugin+0x12c> // b.hs, b.nlast<== ALWAYS TAKEN
40024e50: a94363f7 ldp x23, x24, [sp, #48]
_Timespec_Get_seconds( &wall_average ),
_Timespec_Get_nanoseconds( &wall_average ) / NANOSECONDS_DIVIDER
);
}
}
}
40024e54: a94153f3 ldp x19, x20, [sp, #16]
40024e58: a9425bf5 ldp x21, x22, [sp, #32]
40024e5c: a8cf7bfd ldp x29, x30, [sp], #240
40024e60: d65f03c0 ret
...
0000000040024e90 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
40024e90: a9be7bfd stp x29, x30, [sp, #-32]!
40024e94: 910003fd mov x29, sp
40024e98: a90153f3 stp x19, x20, [sp, #16]
_RTEMS_Lock_allocator();
40024e9c: 940001b9 bl 40025580 <_RTEMS_Lock_allocator>
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
maximum_id = _Rate_monotonic_Information.maximum_id;
40024ea0: 900006e0 adrp x0, 40100000 <_RTEMS_tasks_Information>
40024ea4: b9407014 ldr w20, [x0, #112]
id &= ~OBJECTS_INDEX_MASK;
40024ea8: 12103e93 and w19, w20, #0xffff0000
id += (Objects_Id) OBJECTS_INDEX_MINIMUM << OBJECTS_INDEX_START_BIT;
40024eac: 11000673 add w19, w19, #0x1
for (
40024eb0: 6b13029f cmp w20, w19
40024eb4: 540000c3 b.cc 40024ecc <rtems_rate_monotonic_reset_all_statistics+0x3c> // b.lo, b.ul, b.last<== NEVER TAKEN
id = _Objects_Get_minimum_id( maximum_id ) ;
id <= maximum_id ;
++id
) {
(void) rtems_rate_monotonic_reset_statistics( id );
40024eb8: 2a1303e0 mov w0, w19
++id
40024ebc: 11000673 add w19, w19, #0x1
(void) rtems_rate_monotonic_reset_statistics( id );
40024ec0: 94000008 bl 40024ee0 <rtems_rate_monotonic_reset_statistics>
for (
40024ec4: 6b13029f cmp w20, w19
40024ec8: 54ffff82 b.cs 40024eb8 <rtems_rate_monotonic_reset_all_statistics+0x28> // b.hs, b.nlast
}
_Objects_Allocator_unlock();
}
40024ecc: a94153f3 ldp x19, x20, [sp, #16]
40024ed0: a8c27bfd ldp x29, x30, [sp], #32
_RTEMS_Unlock_allocator();
40024ed4: 140001af b 40025590 <_RTEMS_Unlock_allocator>
...
0000000040026390 <rtems_scheduler_ident_by_processor_set>:
rtems_status_code rtems_scheduler_ident_by_processor_set(
size_t cpusetsize,
const cpu_set_t *cpuset,
rtems_id *id
)
{
40026390: a9bd7bfd stp x29, x30, [sp, #-48]!
40026394: 910003fd mov x29, sp
40026398: a90153f3 stp x19, x20, [sp, #16]
Processor_mask set;
Processor_mask_Copy_status status;
uint32_t cpu_index;
const Scheduler_Control *scheduler;
if ( id == NULL ) {
4002639c: b4000322 cbz x2, 40026400 <rtems_scheduler_ident_by_processor_set+0x70>
return RTEMS_INVALID_ADDRESS;
}
status = _Processor_mask_From_cpu_set_t( &set, cpusetsize, cpuset );
400263a0: aa0003e3 mov x3, x0
Processor_mask *dst,
size_t src_size,
const cpu_set_t *src
)
{
return _Processor_mask_Copy(
400263a4: aa0203f3 mov x19, x2
400263a8: 9100a3e0 add x0, sp, #0x28
400263ac: aa0103e2 mov x2, x1
400263b0: d2800101 mov x1, #0x8 // #8
400263b4: 94000823 bl 40028440 <_Processor_mask_Copy>
if ( status == PROCESSOR_MASK_COPY_INVALID_SIZE ) {
400263b8: 71000c1f cmp w0, #0x3
400263bc: 540002c0 b.eq 40026414 <rtems_scheduler_ident_by_processor_set+0x84> // b.none
BIT_AND2( CPU_MAXIMUM_PROCESSORS, a, b, c );
400263c0: 900000a0 adrp x0, 4003a000 <_User_extensions_Initial_extensions+0xc0>
400263c4: f9434400 ldr x0, [x0, #1672]
}
_Processor_mask_And( &set, &set, _SMP_Get_online_processors() );
cpu_index = _Processor_mask_Find_last_set( &set );
if ( cpu_index == 0 ) {
return RTEMS_INVALID_NAME;
400263c8: 52800074 mov w20, #0x3 // #3
400263cc: f94017e1 ldr x1, [sp, #40]
return (uint32_t) BIT_FLS( CPU_MAXIMUM_PROCESSORS, a );
400263d0: ea010000 ands x0, x0, x1
400263d4: 540000e0 b.eq 400263f0 <rtems_scheduler_ident_by_processor_set+0x60> // b.none
400263d8: 94002f0c bl 40032008 <flsl>
if ( cpu_index == 0 ) {
400263dc: 340000a0 cbz w0, 400263f0 <rtems_scheduler_ident_by_processor_set+0x60><== NEVER TAKEN
}
#else
_Assert( scheduler != NULL );
#endif
*id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) );
400263e0: 52800020 mov w0, #0x1 // #1
400263e4: 72a1e020 movk w0, #0xf01, lsl #16
return RTEMS_SUCCESSFUL;
400263e8: 52800014 mov w20, #0x0 // #0
*id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) );
400263ec: b9000260 str w0, [x19]
}
400263f0: 2a1403e0 mov w0, w20
400263f4: a94153f3 ldp x19, x20, [sp, #16]
400263f8: a8c37bfd ldp x29, x30, [sp], #48
400263fc: d65f03c0 ret
return RTEMS_INVALID_ADDRESS;
40026400: 52800134 mov w20, #0x9 // #9
}
40026404: 2a1403e0 mov w0, w20
40026408: a94153f3 ldp x19, x20, [sp, #16]
4002640c: a8c37bfd ldp x29, x30, [sp], #48
40026410: d65f03c0 ret
return RTEMS_INVALID_SIZE;
40026414: 52800114 mov w20, #0x8 // #8
}
40026418: 2a1403e0 mov w0, w20
4002641c: a94153f3 ldp x19, x20, [sp, #16]
40026420: a8c37bfd ldp x29, x30, [sp], #48
40026424: d65f03c0 ret
...
000000004002a0f0 <rtems_semaphore_obtain>:
rtems_status_code rtems_semaphore_obtain(
rtems_id id,
rtems_option option_set,
rtems_interval timeout
)
{
4002a0f0: a9b97bfd stp x29, x30, [sp, #-112]!
4002a0f4: 910003fd mov x29, sp
4002a0f8: a90153f3 stp x19, x20, [sp, #16]
4002a0fc: 2a0103f3 mov w19, w1
Objects_Id id,
Thread_queue_Context *queue_context
)
{
_Thread_queue_Context_initialize( queue_context );
return (Semaphore_Control *) _Objects_Get(
4002a100: 9100c3e1 add x1, sp, #0x30
4002a104: f90013f5 str x21, [sp, #32]
4002a108: 2a0203f5 mov w21, w2
4002a10c: d00006a2 adrp x2, 40100000 <_RTEMS_tasks_Information>
4002a110: 9101c042 add x2, x2, #0x70
4002a114: 940006d3 bl 4002bc60 <_Objects_Get>
Semaphore_Variant variant;
Status_Control status;
the_semaphore = _Semaphore_Get( id, &queue_context );
if ( the_semaphore == NULL ) {
4002a118: b4000da0 cbz x0, 4002a2cc <rtems_semaphore_obtain+0x1dc>
4002a11c: d00006d4 adrp x20, 40104000 <_RTEMS_tasks_Objects+0x1b10>
4002a120: 913d0294 add x20, x20, #0xf40
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
4002a124: 12000261 and w1, w19, #0x1
return RTEMS_INVALID_ID;
#endif
}
executing = _Thread_Executing;
wait = !_Options_Is_no_wait( option_set );
4002a128: 52000023 eor w3, w1, #0x1
4002a12c: f9401293 ldr x19, [x20, #32]
if ( wait ) {
4002a130: 340003a1 cbz w1, 4002a1a4 <rtems_semaphore_obtain+0xb4>
queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing_extra;
4002a134: d0000001 adrp x1, 4002c000 <_Scheduler_priority_Block+0x90>
4002a138: 913a8021 add x1, x1, #0xea0
4002a13c: f9001fe1 str x1, [sp, #56]
flags = _Semaphore_Get_flags( the_semaphore );
variant = _Semaphore_Get_variant( flags );
switch ( variant ) {
case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY:
status = _CORE_recursive_mutex_Seize(
4002a140: 91008005 add x5, x0, #0x20
return (uintptr_t) the_semaphore->Object.Node.previous;
4002a144: f9400401 ldr x1, [x0, #8]
return (Semaphore_Discipline) ( flags & 0x7 );
4002a148: 12000820 and w0, w1, #0x7
switch ( variant ) {
4002a14c: 7100041f cmp w0, #0x1
4002a150: 540003c0 b.eq 4002a1c8 <rtems_semaphore_obtain+0xd8> // b.none
4002a154: 7100081f cmp w0, #0x2
4002a158: 54000740 b.eq 4002a240 <rtems_semaphore_obtain+0x150> // b.none
4002a15c: 34000540 cbz w0, 4002a204 <rtems_semaphore_obtain+0x114>
)
{
_Assert( _ISR_Get_level() != 0 );
_CORE_semaphore_Acquire_critical( the_semaphore, queue_context );
if ( the_semaphore->count != 0 ) {
4002a160: b94018a2 ldr w2, [x5, #24]
return &_Thread_queue_Operations_FIFO;
4002a164: 721d003f tst w1, #0x8
4002a168: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a16c: 91360020 add x0, x1, #0xd80
4002a170: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a174: 91374021 add x1, x1, #0xdd0
4002a178: 9a800021 csel x1, x1, x0, eq // eq = none
4002a17c: 350009c2 cbnz w2, 4002a2b4 <rtems_semaphore_obtain+0x1c4>
the_semaphore->count -= 1;
_CORE_semaphore_Release( the_semaphore, queue_context );
return STATUS_SUCCESSFUL;
}
if ( !wait ) {
4002a180: 34000bc3 cbz w3, 4002a2f8 <rtems_semaphore_obtain+0x208>
queue_context->thread_state = thread_state;
4002a184: 52800044 mov w4, #0x2 // #2
_Thread_queue_Context_set_thread_state(
queue_context,
STATES_WAITING_FOR_SEMAPHORE
);
_Thread_queue_Enqueue(
4002a188: aa0503e0 mov x0, x5
4002a18c: 9100c3e3 add x3, sp, #0x30
4002a190: aa1303e2 mov x2, x19
4002a194: b90037e4 str w4, [sp, #52]
4002a198: 94000b4e bl 4002ced0 <_Thread_queue_Enqueue>
4002a19c: 39423260 ldrb w0, [x19, #140]
&queue_context
);
break;
}
return _Status_Get( status );
4002a1a0: 14000037 b 4002a27c <rtems_semaphore_obtain+0x18c>
queue_context->enqueue_callout = _Thread_queue_Add_timeout_ticks;
4002a1a4: f0000001 adrp x1, 4002d000 <_Thread_queue_Enqueue+0x130>
4002a1a8: 9135c021 add x1, x1, #0xd70
4002a1ac: f9001fe1 str x1, [sp, #56]
status = _CORE_recursive_mutex_Seize(
4002a1b0: 91008005 add x5, x0, #0x20
return (uintptr_t) the_semaphore->Object.Node.previous;
4002a1b4: f9400401 ldr x1, [x0, #8]
queue_context->Timeout.ticks = ticks;
4002a1b8: b90043f5 str w21, [sp, #64]
return (Semaphore_Discipline) ( flags & 0x7 );
4002a1bc: 12000820 and w0, w1, #0x7
switch ( variant ) {
4002a1c0: 7100041f cmp w0, #0x1
4002a1c4: 54fffc81 b.ne 4002a154 <rtems_semaphore_obtain+0x64> // b.any
return the_mutex->Wait_queue.Queue.owner;
4002a1c8: f94004a0 ldr x0, [x5, #8]
_CORE_mutex_Acquire_critical( &the_mutex->Recursive.Mutex, queue_context );
owner = _CORE_mutex_Get_owner( &the_mutex->Recursive.Mutex );
if ( owner == NULL ) {
4002a1cc: b4000b00 cbz x0, 4002a32c <rtems_semaphore_obtain+0x23c>
executing,
queue_context
);
}
if ( owner == executing ) {
4002a1d0: eb00027f cmp x19, x0
4002a1d4: 540005c0 b.eq 4002a28c <rtems_semaphore_obtain+0x19c> // b.none <== NEVER TAKEN
status = ( *nested )( &the_mutex->Recursive );
_CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context );
return status;
}
return _CORE_mutex_Seize_slow(
4002a1d8: 9100c3e4 add x4, sp, #0x30
4002a1dc: aa1303e2 mov x2, x19
4002a1e0: aa0503e0 mov x0, x5
4002a1e4: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a1e8: 91374021 add x1, x1, #0xdd0
4002a1ec: 94000321 bl 4002ae70 <_CORE_mutex_Seize_slow>
4002a1f0: 12001c00 and w0, w0, #0xff
}
4002a1f4: a94153f3 ldp x19, x20, [sp, #16]
4002a1f8: f94013f5 ldr x21, [sp, #32]
4002a1fc: a8c77bfd ldp x29, x30, [sp], #112
4002a200: d65f03c0 ret
return the_mutex->Wait_queue.Queue.owner;
4002a204: f94004a1 ldr x1, [x5, #8]
if ( owner == NULL ) {
4002a208: b40008a1 cbz x1, 4002a31c <rtems_semaphore_obtain+0x22c>
if ( owner == executing ) {
4002a20c: eb01027f cmp x19, x1
4002a210: 54000680 b.eq 4002a2e0 <rtems_semaphore_obtain+0x1f0> // b.none
return _CORE_mutex_Seize_slow(
4002a214: 9100c3e4 add x4, sp, #0x30
4002a218: aa1303e2 mov x2, x19
4002a21c: aa0503e0 mov x0, x5
4002a220: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a224: 9137e021 add x1, x1, #0xdf8
4002a228: 94000312 bl 4002ae70 <_CORE_mutex_Seize_slow>
4002a22c: 12001c00 and w0, w0, #0xff
4002a230: a94153f3 ldp x19, x20, [sp, #16]
4002a234: f94013f5 ldr x21, [sp, #32]
4002a238: a8c77bfd ldp x29, x30, [sp], #112
4002a23c: d65f03c0 ret
return the_mutex->Wait_queue.Queue.owner;
4002a240: f94004a2 ldr x2, [x5, #8]
return &_Thread_queue_Operations_priority;
4002a244: 721d003f tst w1, #0x8
4002a248: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a24c: 91374020 add x0, x1, #0xdd0
4002a250: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a254: 91360021 add x1, x1, #0xd80
4002a258: 9a801021 csel x1, x1, x0, ne // ne = any
if ( owner == NULL ) {
4002a25c: b4000562 cbz x2, 4002a308 <rtems_semaphore_obtain+0x218>
if ( owner == executing ) {
4002a260: eb02027f cmp x19, x2
4002a264: 54000140 b.eq 4002a28c <rtems_semaphore_obtain+0x19c> // b.none
return _CORE_mutex_Seize_slow(
4002a268: 9100c3e4 add x4, sp, #0x30
4002a26c: aa1303e2 mov x2, x19
4002a270: aa0503e0 mov x0, x5
4002a274: 940002ff bl 4002ae70 <_CORE_mutex_Seize_slow>
4002a278: 12001c00 and w0, w0, #0xff
4002a27c: a94153f3 ldp x19, x20, [sp, #16]
4002a280: f94013f5 ldr x21, [sp, #32]
4002a284: a8c77bfd ldp x29, x30, [sp], #112
4002a288: d65f03c0 ret
++the_mutex->nest_level;
4002a28c: b94018a0 ldr w0, [x5, #24]
4002a290: 11000400 add w0, w0, #0x1
4002a294: b90018a0 str w0, [x5, #24]
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002a298: b94033e0 ldr w0, [sp, #48]
4002a29c: d51b4220 msr daif, x0
4002a2a0: 52800000 mov w0, #0x0 // #0
4002a2a4: a94153f3 ldp x19, x20, [sp, #16]
4002a2a8: f94013f5 ldr x21, [sp, #32]
4002a2ac: a8c77bfd ldp x29, x30, [sp], #112
4002a2b0: d65f03c0 ret
the_semaphore->count -= 1;
4002a2b4: 51000442 sub w2, w2, #0x1
4002a2b8: b90018a2 str w2, [x5, #24]
4002a2bc: b94033e0 ldr w0, [sp, #48]
4002a2c0: d51b4220 msr daif, x0
return STATUS_SUCCESSFUL;
4002a2c4: 52800000 mov w0, #0x0 // #0
4002a2c8: 17ffffed b 4002a27c <rtems_semaphore_obtain+0x18c>
return RTEMS_INVALID_ID;
4002a2cc: 52800080 mov w0, #0x4 // #4
}
4002a2d0: a94153f3 ldp x19, x20, [sp, #16]
4002a2d4: f94013f5 ldr x21, [sp, #32]
4002a2d8: a8c77bfd ldp x29, x30, [sp], #112
4002a2dc: d65f03c0 ret
4002a2e0: b94018a1 ldr w1, [x5, #24]
4002a2e4: 11000421 add w1, w1, #0x1
4002a2e8: b90018a1 str w1, [x5, #24]
4002a2ec: b94033e1 ldr w1, [sp, #48]
4002a2f0: d51b4221 msr daif, x1
return status;
4002a2f4: 17ffffe2 b 4002a27c <rtems_semaphore_obtain+0x18c>
4002a2f8: b94033e0 ldr w0, [sp, #48]
4002a2fc: d51b4220 msr daif, x0
return STATUS_UNSATISFIED;
4002a300: 528001a0 mov w0, #0xd // #13
4002a304: 17ffffde b 4002a27c <rtems_semaphore_obtain+0x18c>
the_mutex->Wait_queue.Queue.owner = owner;
4002a308: f90004b3 str x19, [x5, #8]
4002a30c: b94033e0 ldr w0, [sp, #48]
4002a310: d51b4220 msr daif, x0
return STATUS_SUCCESSFUL;
4002a314: 52800000 mov w0, #0x0 // #0
4002a318: 17ffffd9 b 4002a27c <rtems_semaphore_obtain+0x18c>
the_mutex->Wait_queue.Queue.owner = owner;
4002a31c: f90004b3 str x19, [x5, #8]
4002a320: b94033e1 ldr w1, [sp, #48]
4002a324: d51b4221 msr daif, x1
return STATUS_SUCCESSFUL;
4002a328: 17ffffd5 b 4002a27c <rtems_semaphore_obtain+0x18c>
4002a32c: f9403661 ldr x1, [x19, #104]
queue_context->Priority.update_count = 0;
4002a330: f9002bff str xzr, [sp, #80]
if (
4002a334: f94020a0 ldr x0, [x5, #64]
4002a338: f9401421 ldr x1, [x1, #40]
4002a33c: eb00003f cmp x1, x0
4002a340: 54000223 b.cc 4002a384 <rtems_semaphore_obtain+0x294> // b.lo, b.ul, b.last
the_mutex->Wait_queue.Queue.owner = owner;
4002a344: f90004b3 str x19, [x5, #8]
_Thread_Priority_add(
4002a348: aa1303e0 mov x0, x19
4002a34c: 910080a1 add x1, x5, #0x20
4002a350: 9100c3e2 add x2, sp, #0x30
4002a354: 94000947 bl 4002c870 <_Thread_Priority_add>
disable_level = cpu_self->thread_dispatch_disable_level;
4002a358: b9401a80 ldr w0, [x20, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4002a35c: 11000400 add w0, w0, #0x1
4002a360: b9001a80 str w0, [x20, #24]
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002a364: b94033e0 ldr w0, [sp, #48]
4002a368: d51b4220 msr daif, x0
_Thread_Priority_update( queue_context );
4002a36c: 9100c3e0 add x0, sp, #0x30
4002a370: 940009ac bl 4002ca20 <_Thread_Priority_update>
_Thread_Dispatch_enable( cpu_self );
4002a374: aa1403e0 mov x0, x20
4002a378: 94000a52 bl 4002ccc0 <_Thread_Dispatch_enable>
return STATUS_SUCCESSFUL;
4002a37c: 52800000 mov w0, #0x0 // #0
4002a380: 17ffffbf b 4002a27c <rtems_semaphore_obtain+0x18c>
4002a384: b94033e0 ldr w0, [sp, #48]
4002a388: d51b4220 msr daif, x0
return STATUS_MUTEX_CEILING_VIOLATED;
4002a38c: 52800260 mov w0, #0x13 // #19
4002a390: 17ffffbb b 4002a27c <rtems_semaphore_obtain+0x18c>
...
000000004002a3a0 <rtems_semaphore_release>:
#include <rtems/rtems/semimpl.h>
#include <rtems/rtems/statusimpl.h>
rtems_status_code rtems_semaphore_release( rtems_id id )
{
4002a3a0: a9b87bfd stp x29, x30, [sp, #-128]!
return (Semaphore_Control *) _Objects_Get(
4002a3a4: d00006a2 adrp x2, 40100000 <_RTEMS_tasks_Information>
4002a3a8: 9101c042 add x2, x2, #0x70
4002a3ac: 910003fd mov x29, sp
4002a3b0: 910103e1 add x1, sp, #0x40
4002a3b4: a9025bf5 stp x21, x22, [sp, #32]
4002a3b8: 9400062a bl 4002bc60 <_Objects_Get>
Semaphore_Variant variant;
Status_Control status;
the_semaphore = _Semaphore_Get( id, &queue_context );
if ( the_semaphore == NULL ) {
4002a3bc: b4001440 cbz x0, 4002a644 <rtems_semaphore_release+0x2a4>
return (uintptr_t) the_semaphore->Object.Node.previous;
4002a3c0: f9400403 ldr x3, [x0, #8]
4002a3c4: a90153f3 stp x19, x20, [sp, #16]
4002a3c8: d00006d4 adrp x20, 40104000 <_RTEMS_tasks_Objects+0x1b10>
4002a3cc: 913d0294 add x20, x20, #0xf40
return (Semaphore_Discipline) ( flags & 0x7 );
4002a3d0: 12000861 and w1, w3, #0x7
4002a3d4: aa0003f3 mov x19, x0
flags = _Semaphore_Get_flags( the_semaphore );
variant = _Semaphore_Get_variant( flags );
switch ( variant ) {
case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY:
status = _CORE_recursive_mutex_Surrender(
4002a3d8: 91008016 add x22, x0, #0x20
switch ( variant ) {
4002a3dc: 7100083f cmp w1, #0x2
4002a3e0: f9401282 ldr x2, [x20, #32]
4002a3e4: 54000b00 b.eq 4002a544 <rtems_semaphore_release+0x1a4> // b.none
4002a3e8: 54000568 b.hi 4002a494 <rtems_semaphore_release+0xf4> // b.pmore
4002a3ec: 34001001 cbz w1, 4002a5ec <rtems_semaphore_release+0x24c>
4002a3f0: 7100043f cmp w1, #0x1
4002a3f4: 54000ce1 b.ne 4002a590 <rtems_semaphore_release+0x1f0> // b.any <== NEVER TAKEN
Per_CPU_Control *cpu_self;
Thread_Control *new_owner;
_CORE_mutex_Acquire_critical( &the_mutex->Recursive.Mutex, queue_context );
if ( !_CORE_mutex_Is_owner( &the_mutex->Recursive.Mutex, executing ) ) {
4002a3f8: f94006c0 ldr x0, [x22, #8]
4002a3fc: eb00005f cmp x2, x0
4002a400: 540007a1 b.ne 4002a4f4 <rtems_semaphore_release+0x154> // b.any
_CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context );
return STATUS_NOT_OWNER;
}
nest_level = the_mutex->Recursive.nest_level;
4002a404: b9401ad5 ldr w21, [x22, #24]
if ( nest_level > 0 ) {
4002a408: 35001115 cbnz w21, 4002a628 <rtems_semaphore_release+0x288> <== NEVER TAKEN
queue_context->Priority.update_count = 0;
4002a40c: a90363f7 stp x23, x24, [sp, #48]
_Thread_Resource_count_decrement( executing );
_Thread_queue_Context_clear_priority_updates( queue_context );
_Thread_Wait_acquire_default_critical( executing, &lock_context );
_Thread_Priority_remove(
4002a410: 910082d8 add x24, x22, #0x20
4002a414: aa0203e0 mov x0, x2
4002a418: aa1803e1 mov x1, x24
4002a41c: 910103e2 add x2, sp, #0x40
4002a420: f90033ff str xzr, [sp, #96]
4002a424: 94000937 bl 4002c900 <_Thread_Priority_remove>
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;
4002a428: f9401260 ldr x0, [x19, #32]
if ( heads != NULL ) {
4002a42c: b40011e0 cbz x0, 4002a668 <rtems_semaphore_release+0x2c8>
return ( *operations->first )( heads );
4002a430: f0000097 adrp x23, 4003d000 <_Thread_Control_add_ons+0x20>
4002a434: 913742f7 add x23, x23, #0xdd0
4002a438: f94012e1 ldr x1, [x23, #32]
4002a43c: d63f0020 blr x1
4002a440: aa0003f3 mov x19, x0
disable_level = cpu_self->thread_dispatch_disable_level;
4002a444: b9401a82 ldr w2, [x20, #24]
the_mutex->Wait_queue.Queue.owner = owner;
4002a448: f90006c0 str x0, [x22, #8]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4002a44c: 11000442 add w2, w2, #0x1
4002a450: b9001a82 str w2, [x20, #24]
cpu_self = _Thread_Dispatch_disable_critical(
&queue_context->Lock_context.Lock_context
);
if ( new_owner != NULL ) {
4002a454: b4001120 cbz x0, 4002a678 <rtems_semaphore_release+0x2d8> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
if ( _Objects_Is_local_id( new_owner->Object.id ) )
#endif
{
_Thread_Resource_count_increment( new_owner );
_Thread_Priority_add(
4002a458: aa1803e1 mov x1, x24
4002a45c: 910103e2 add x2, sp, #0x40
4002a460: 94000904 bl 4002c870 <_Thread_Priority_add>
&the_mutex->Priority_ceiling,
queue_context
);
}
_Thread_queue_Extract_critical(
4002a464: 910103e3 add x3, sp, #0x40
4002a468: aa1303e2 mov x2, x19
4002a46c: aa1703e1 mov x1, x23
4002a470: aa1603e0 mov x0, x22
4002a474: 94000b0b bl 4002d0a0 <_Thread_queue_Extract_critical>
);
} else {
_CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context );
}
_Thread_Priority_update( queue_context );
4002a478: 910103e0 add x0, sp, #0x40
4002a47c: 94000969 bl 4002ca20 <_Thread_Priority_update>
_Thread_Dispatch_enable( cpu_self );
4002a480: aa1403e0 mov x0, x20
4002a484: 94000a0f bl 4002ccc0 <_Thread_Dispatch_enable>
return STATUS_SUCCESSFUL;
4002a488: a94153f3 ldp x19, x20, [sp, #16]
4002a48c: a94363f7 ldp x23, x24, [sp, #48]
4002a490: 1400001d b 4002a504 <rtems_semaphore_release+0x164>
4002a494: 71000c3f cmp w1, #0x3
4002a498: 540007c1 b.ne 4002a590 <rtems_semaphore_release+0x1f0> // b.any
Thread_queue_Heads *heads = the_thread_queue->Queue.heads;
4002a49c: f9401000 ldr x0, [x0, #32]
return &_Thread_queue_Operations_priority;
4002a4a0: 721d007f tst w3, #0x8
4002a4a4: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a4a8: 91374021 add x1, x1, #0xdd0
4002a4ac: f0000093 adrp x19, 4003d000 <_Thread_Control_add_ons+0x20>
4002a4b0: 91360273 add x19, x19, #0xd80
4002a4b4: 9a811273 csel x19, x19, x1, ne // ne = any
if ( heads != NULL ) {
4002a4b8: b40002e0 cbz x0, 4002a514 <rtems_semaphore_release+0x174>
return ( *operations->first )( heads );
4002a4bc: f9401261 ldr x1, [x19, #32]
4002a4c0: d63f0020 blr x1
4002a4c4: aa0003e2 mov x2, x0
if ( the_thread != NULL ) {
4002a4c8: b4000260 cbz x0, 4002a514 <rtems_semaphore_release+0x174> <== NEVER TAKEN
_Thread_queue_Extract_critical(
4002a4cc: 910103e3 add x3, sp, #0x40
4002a4d0: aa1303e1 mov x1, x19
4002a4d4: aa1603e0 mov x0, x22
4002a4d8: 52800015 mov w21, #0x0 // #0
4002a4dc: 94000af1 bl 4002d0a0 <_Thread_queue_Extract_critical>
);
break;
}
return _Status_Get( status );
}
4002a4e0: 2a1503e0 mov w0, w21
4002a4e4: a94153f3 ldp x19, x20, [sp, #16]
4002a4e8: a9425bf5 ldp x21, x22, [sp, #32]
4002a4ec: a8c87bfd ldp x29, x30, [sp], #128
4002a4f0: d65f03c0 ret
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002a4f4: b94043e0 ldr w0, [sp, #64]
4002a4f8: d51b4220 msr daif, x0
return STATUS_NOT_OWNER;
4002a4fc: a94153f3 ldp x19, x20, [sp, #16]
4002a500: 528002f5 mov w21, #0x17 // #23
4002a504: 2a1503e0 mov w0, w21
4002a508: a9425bf5 ldp x21, x22, [sp, #32]
4002a50c: a8c87bfd ldp x29, x30, [sp], #128
4002a510: d65f03c0 ret
if ( the_semaphore->count < maximum_count )
4002a514: b9401ac0 ldr w0, [x22, #24]
4002a518: 35000060 cbnz w0, 4002a524 <rtems_semaphore_release+0x184>
the_semaphore->count += 1;
4002a51c: 52800020 mov w0, #0x1 // #1
4002a520: b9001ac0 str w0, [x22, #24]
4002a524: b94043e0 ldr w0, [sp, #64]
4002a528: d51b4220 msr daif, x0
return status;
4002a52c: a94153f3 ldp x19, x20, [sp, #16]
4002a530: 52800015 mov w21, #0x0 // #0
4002a534: 2a1503e0 mov w0, w21
4002a538: a9425bf5 ldp x21, x22, [sp, #32]
4002a53c: a8c87bfd ldp x29, x30, [sp], #128
4002a540: d65f03c0 ret
if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) {
4002a544: f94006c1 ldr x1, [x22, #8]
4002a548: f0000084 adrp x4, 4003d000 <_Thread_Control_add_ons+0x20>
4002a54c: 91374080 add x0, x4, #0xdd0
4002a550: 721d007f tst w3, #0x8
4002a554: f0000084 adrp x4, 4003d000 <_Thread_Control_add_ons+0x20>
4002a558: 91360084 add x4, x4, #0xd80
4002a55c: 9a801084 csel x4, x4, x0, ne // ne = any
4002a560: eb01005f cmp x2, x1
4002a564: 54fffc81 b.ne 4002a4f4 <rtems_semaphore_release+0x154> // b.any <== NEVER TAKEN
nest_level = the_mutex->nest_level;
4002a568: b9401ad5 ldr w21, [x22, #24]
if ( nest_level > 0 ) {
4002a56c: 350005f5 cbnz w21, 4002a628 <rtems_semaphore_release+0x288> <== NEVER TAKEN
heads = the_mutex->Mutex.Wait_queue.Queue.heads;
4002a570: f9401261 ldr x1, [x19, #32]
the_mutex->Wait_queue.Queue.owner = owner;
4002a574: f90006df str xzr, [x22, #8]
if ( heads == NULL ) {
4002a578: b40002c1 cbz x1, 4002a5d0 <rtems_semaphore_release+0x230>
_Thread_queue_Surrender(
4002a57c: 910103e3 add x3, sp, #0x40
4002a580: aa1603e0 mov x0, x22
4002a584: 94000b27 bl 4002d220 <_Thread_queue_Surrender>
return STATUS_SUCCESSFUL;
4002a588: a94153f3 ldp x19, x20, [sp, #16]
4002a58c: 17ffffde b 4002a504 <rtems_semaphore_release+0x164>
Thread_queue_Heads *heads = the_thread_queue->Queue.heads;
4002a590: f9401260 ldr x0, [x19, #32]
4002a594: 721d007f tst w3, #0x8
4002a598: f0000081 adrp x1, 4003d000 <_Thread_Control_add_ons+0x20>
4002a59c: 91374021 add x1, x1, #0xdd0
4002a5a0: f0000093 adrp x19, 4003d000 <_Thread_Control_add_ons+0x20>
4002a5a4: 91360273 add x19, x19, #0xd80
4002a5a8: 9a811273 csel x19, x19, x1, ne // ne = any
if ( heads != NULL ) {
4002a5ac: b40000a0 cbz x0, 4002a5c0 <rtems_semaphore_release+0x220>
return ( *operations->first )( heads );
4002a5b0: f9401261 ldr x1, [x19, #32]
4002a5b4: d63f0020 blr x1
4002a5b8: aa0003e2 mov x2, x0
if ( the_thread != NULL ) {
4002a5bc: b5fff880 cbnz x0, 4002a4cc <rtems_semaphore_release+0x12c> <== ALWAYS TAKEN
if ( the_semaphore->count < maximum_count )
4002a5c0: b9401ac0 ldr w0, [x22, #24]
4002a5c4: 528001b5 mov w21, #0xd // #13
4002a5c8: 3100041f cmn w0, #0x1
4002a5cc: 54000461 b.ne 4002a658 <rtems_semaphore_release+0x2b8> // b.any
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
4002a5d0: b94043e0 ldr w0, [sp, #64]
4002a5d4: d51b4220 msr daif, x0
4002a5d8: 2a1503e0 mov w0, w21
return _Status_Get( status );
4002a5dc: a94153f3 ldp x19, x20, [sp, #16]
}
4002a5e0: a9425bf5 ldp x21, x22, [sp, #32]
4002a5e4: a8c87bfd ldp x29, x30, [sp], #128
4002a5e8: d65f03c0 ret
if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) {
4002a5ec: f94006c0 ldr x0, [x22, #8]
4002a5f0: eb00005f cmp x2, x0
4002a5f4: 54fff801 b.ne 4002a4f4 <rtems_semaphore_release+0x154> // b.any
nest_level = the_mutex->nest_level;
4002a5f8: b9401ad5 ldr w21, [x22, #24]
if ( nest_level > 0 ) {
4002a5fc: 35000175 cbnz w21, 4002a628 <rtems_semaphore_release+0x288>
heads = the_mutex->Mutex.Wait_queue.Queue.heads;
4002a600: f9401261 ldr x1, [x19, #32]
the_mutex->Wait_queue.Queue.owner = owner;
4002a604: f90006df str xzr, [x22, #8]
if ( heads == NULL ) {
4002a608: b4fffe41 cbz x1, 4002a5d0 <rtems_semaphore_release+0x230>
_Thread_queue_Surrender(
4002a60c: 910103e3 add x3, sp, #0x40
4002a610: aa1603e0 mov x0, x22
4002a614: f0000084 adrp x4, 4003d000 <_Thread_Control_add_ons+0x20>
4002a618: 9137e084 add x4, x4, #0xdf8
4002a61c: 94000b01 bl 4002d220 <_Thread_queue_Surrender>
return STATUS_SUCCESSFUL;
4002a620: a94153f3 ldp x19, x20, [sp, #16]
4002a624: 17ffffb8 b 4002a504 <rtems_semaphore_release+0x164>
the_mutex->nest_level = nest_level - 1;
4002a628: 510006b5 sub w21, w21, #0x1
4002a62c: b9001ad5 str w21, [x22, #24]
4002a630: b94043e0 ldr w0, [sp, #64]
4002a634: d51b4220 msr daif, x0
4002a638: 52800015 mov w21, #0x0 // #0
4002a63c: a94153f3 ldp x19, x20, [sp, #16]
4002a640: 17ffffbd b 4002a534 <rtems_semaphore_release+0x194>
return RTEMS_INVALID_ID;
4002a644: 52800095 mov w21, #0x4 // #4
}
4002a648: 2a1503e0 mov w0, w21
4002a64c: a9425bf5 ldp x21, x22, [sp, #32]
4002a650: a8c87bfd ldp x29, x30, [sp], #128
4002a654: d65f03c0 ret
the_semaphore->count += 1;
4002a658: 11000400 add w0, w0, #0x1
4002a65c: 52800015 mov w21, #0x0 // #0
4002a660: b9001ac0 str w0, [x22, #24]
4002a664: 17ffffdb b 4002a5d0 <rtems_semaphore_release+0x230>
disable_level = cpu_self->thread_dispatch_disable_level;
4002a668: b9401a80 ldr w0, [x20, #24]
the_mutex->Wait_queue.Queue.owner = owner;
4002a66c: f90006df str xzr, [x22, #8]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
4002a670: 11000400 add w0, w0, #0x1
4002a674: b9001a80 str w0, [x20, #24]
4002a678: b94043e0 ldr w0, [sp, #64]
4002a67c: d51b4220 msr daif, x0
}
4002a680: 17ffff7e b 4002a478 <rtems_semaphore_release+0xd8>
...
0000000040024dc0 <rtems_semaphore_set_priority>:
rtems_id semaphore_id,
rtems_id scheduler_id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
40024dc0: a9b87bfd stp x29, x30, [sp, #-128]!
40024dc4: 910003fd mov x29, sp
40024dc8: a90363f7 stp x23, x24, [sp, #48]
const Scheduler_Control *scheduler;
Semaphore_Control *the_semaphore;
Thread_queue_Context queue_context;
if ( old_priority == NULL ) {
40024dcc: b4000ae3 cbz x3, 40024f28 <rtems_semaphore_set_priority+0x168>
40024dd0: a9025bf5 stp x21, x22, [sp, #32]
40024dd4: 2a0203f5 mov w21, w2
{
uint32_t index;
index = _Scheduler_Get_index_by_id( id );
if ( index >= _Scheduler_Count ) {
40024dd8: 52800022 mov w2, #0x1 // #1
40024ddc: 72a1e022 movk w2, #0xf01, lsl #16
40024de0: 6b02003f cmp w1, w2
40024de4: 54000741 b.ne 40024ecc <rtems_semaphore_set_priority+0x10c> // b.any
return (Semaphore_Control *) _Objects_Get(
40024de8: 910103e1 add x1, sp, #0x40
40024dec: 900006e2 adrp x2, 40100000 <_RTEMS_tasks_Information>
40024df0: 9101c042 add x2, x2, #0x70
40024df4: a90153f3 stp x19, x20, [sp, #16]
40024df8: aa0303f4 mov x20, x3
40024dfc: 94000419 bl 40025e60 <_Objects_Get>
40024e00: aa0003f6 mov x22, x0
return RTEMS_INVALID_ID;
}
the_semaphore = _Semaphore_Get( semaphore_id, &queue_context );
if ( the_semaphore == NULL ) {
40024e04: b4000620 cbz x0, 40024ec8 <rtems_semaphore_set_priority+0x108>
40024e08: f0000093 adrp x19, 40037000 <_init>
40024e0c: 910f6273 add x19, x19, #0x3d8
40024e10: 2a1503f7 mov w23, w21
return ( *scheduler->Operations.map_priority )( scheduler, priority );
40024e14: aa1303e0 mov x0, x19
40024e18: aa1703e1 mov x1, x23
40024e1c: f9401e62 ldr x2, [x19, #56]
40024e20: f9403e78 ldr x24, [x19, #120]
40024e24: d63f0040 blr x2
if ( new_priority != RTEMS_CURRENT_PRIORITY && !valid ) {
40024e28: 34000415 cbz w21, 40024ea8 <rtems_semaphore_set_priority+0xe8>
40024e2c: eb1802ff cmp x23, x24
40024e30: 54000868 b.hi 40024f3c <rtems_semaphore_set_priority+0x17c> // b.pmore
return (Semaphore_Discipline) ( flags & 0x7 );
40024e34: f94006c1 ldr x1, [x22, #8]
queue_context->Priority.update_count = 0;
40024e38: f90033ff str xzr, [sp, #96]
40024e3c: 12000821 and w1, w1, #0x7
switch ( variant ) {
40024e40: 7100043f cmp w1, #0x1
40024e44: 54000500 b.eq 40024ee4 <rtems_semaphore_set_priority+0x124> // b.none
old_priority = 0;
40024e48: d2800018 mov x24, #0x0 // #0
sc = RTEMS_NOT_DEFINED;
40024e4c: 52800177 mov w23, #0xb // #11
disable_level = cpu_self->thread_dispatch_disable_level;
40024e50: f00006f5 adrp x21, 40103000 <_RTEMS_tasks_Objects+0xc38>
40024e54: 912302b5 add x21, x21, #0x8c0
40024e58: b9401aa0 ldr w0, [x21, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40024e5c: 11000400 add w0, w0, #0x1
40024e60: b9001aa0 str w0, [x21, #24]
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
40024e64: b94043e0 ldr w0, [sp, #64]
40024e68: d51b4220 msr daif, x0
_Thread_Priority_update( queue_context );
40024e6c: 910103e0 add x0, sp, #0x40
40024e70: 94000760 bl 40026bf0 <_Thread_Priority_update>
_Thread_Dispatch_enable( cpu_self );
40024e74: aa1503e0 mov x0, x21
40024e78: 940007da bl 40026de0 <_Thread_Dispatch_enable>
return ( *scheduler->Operations.unmap_priority )( scheduler, priority );
40024e7c: f9402262 ldr x2, [x19, #64]
40024e80: aa1303e0 mov x0, x19
40024e84: aa1803e1 mov x1, x24
40024e88: d63f0040 blr x2
return sc;
40024e8c: a9425bf5 ldp x21, x22, [sp, #32]
RTEMS_INLINE_ROUTINE rtems_task_priority _RTEMS_Priority_From_core(
const Scheduler_Control *scheduler,
Priority_Control priority
)
{
return (rtems_task_priority)
40024e90: b9000280 str w0, [x20]
40024e94: a94153f3 ldp x19, x20, [sp, #16]
scheduler,
new_priority,
old_priority,
&queue_context
);
}
40024e98: 2a1703e0 mov w0, w23
40024e9c: a94363f7 ldp x23, x24, [sp, #48]
40024ea0: a8c87bfd ldp x29, x30, [sp], #128
40024ea4: d65f03c0 ret
40024ea8: f94006c0 ldr x0, [x22, #8]
queue_context->Priority.update_count = 0;
40024eac: f90033ff str xzr, [sp, #96]
40024eb0: 12000800 and w0, w0, #0x7
switch ( variant ) {
40024eb4: 7100041f cmp w0, #0x1
40024eb8: 54fffc81 b.ne 40024e48 <rtems_semaphore_set_priority+0x88> // b.any<== NEVER TAKEN
sc = _Semaphore_Is_scheduler_valid(
40024ebc: 52800017 mov w23, #0x0 // #0
return the_mutex->Priority_ceiling.priority;
40024ec0: f94032d8 ldr x24, [x22, #96]
if ( sc == RTEMS_SUCCESSFUL && new_priority != RTEMS_CURRENT_PRIORITY ) {
40024ec4: 17ffffe3 b 40024e50 <rtems_semaphore_set_priority+0x90>
40024ec8: a94153f3 ldp x19, x20, [sp, #16]
return RTEMS_INVALID_ID;
40024ecc: 52800097 mov w23, #0x4 // #4
}
40024ed0: 2a1703e0 mov w0, w23
40024ed4: a9425bf5 ldp x21, x22, [sp, #32]
40024ed8: a94363f7 ldp x23, x24, [sp, #48]
40024edc: a8c87bfd ldp x29, x30, [sp], #128
40024ee0: d65f03c0 ret
return the_mutex->Wait_queue.Queue.owner;
40024ee4: f94016c2 ldr x2, [x22, #40]
return the_mutex->Priority_ceiling.priority;
40024ee8: 910082c1 add x1, x22, #0x20
40024eec: f9402038 ldr x24, [x1, #64]
if ( owner != NULL ) {
40024ef0: b4000322 cbz x2, 40024f54 <rtems_semaphore_set_priority+0x194> <== ALWAYS TAKEN
__asm__ volatile (
40024ef4: d53b4223 mrs x3, daif <== NOT EXECUTED
40024ef8: d50342df msr daifset, #0x2 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_Wait_acquire(
Thread_Control *the_thread,
Thread_queue_Context *queue_context
)
{
_ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context );
40024efc: b90043e3 str w3, [sp, #64] <== NOT EXECUTED
node->priority = priority;
40024f00: f90032c0 str x0, [x22, #96] <== NOT EXECUTED
_Thread_Priority_changed(
40024f04: 91008021 add x1, x1, #0x20 <== NOT EXECUTED
40024f08: aa0203e0 mov x0, x2 <== NOT EXECUTED
40024f0c: 910103e3 add x3, sp, #0x40 <== NOT EXECUTED
40024f10: 52800002 mov w2, #0x0 // #0 <== NOT EXECUTED
40024f14: 94000713 bl 40026b60 <_Thread_Priority_changed> <== NOT EXECUTED
Thread_Control *the_thread,
Thread_queue_Context *queue_context
)
{
_Thread_Wait_release_critical( the_thread, queue_context );
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
40024f18: b94043e0 ldr w0, [sp, #64] <== NOT EXECUTED
__asm__ volatile (
40024f1c: d51b4220 msr daif, x0 <== NOT EXECUTED
sc = _Semaphore_Is_scheduler_valid(
40024f20: 52800017 mov w23, #0x0 // #0 <== NOT EXECUTED
}
40024f24: 17ffffcb b 40024e50 <rtems_semaphore_set_priority+0x90> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
40024f28: 52800137 mov w23, #0x9 // #9
}
40024f2c: 2a1703e0 mov w0, w23
40024f30: a94363f7 ldp x23, x24, [sp, #48]
40024f34: a8c87bfd ldp x29, x30, [sp], #128
40024f38: d65f03c0 ret
_ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context );
40024f3c: b94043e0 ldr w0, [sp, #64]
40024f40: d51b4220 msr daif, x0
return RTEMS_INVALID_PRIORITY;
40024f44: 52800277 mov w23, #0x13 // #19
40024f48: a94153f3 ldp x19, x20, [sp, #16]
40024f4c: a9425bf5 ldp x21, x22, [sp, #32]
40024f50: 17ffffd2 b 40024e98 <rtems_semaphore_set_priority+0xd8>
sc = _Semaphore_Is_scheduler_valid(
40024f54: 52800017 mov w23, #0x0 // #0
the_mutex->Priority_ceiling.priority = priority_ceiling;
40024f58: f9002020 str x0, [x1, #64]
40024f5c: 17ffffbd b 40024e50 <rtems_semaphore_set_priority+0x90>
000000004002ab20 <rtems_status_code_to_errno>:
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_status_code_to_errno(rtems_status_code sc)
{
if (sc == RTEMS_SUCCESSFUL) {
4002ab20: 35000060 cbnz w0, 4002ab2c <rtems_status_code_to_errno+0xc>
return 0;
4002ab24: 52800000 mov w0, #0x0 // #0
errno = eno;
return -1;
}
}
4002ab28: d65f03c0 ret
{
4002ab2c: a9be7bfd stp x29, x30, [sp, #-32]!
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
4002ab30: 7100741f cmp w0, #0x1d
{
4002ab34: 910003fd mov x29, sp
4002ab38: f9000bf3 str x19, [sp, #16]
int eno = EINVAL;
4002ab3c: 528002d3 mov w19, #0x16 // #22
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
4002ab40: 54000088 b.hi 4002ab50 <rtems_status_code_to_errno+0x30> // b.pmore<== NEVER TAKEN
eno = status_code_to_errno [sc];
4002ab44: d0000081 adrp x1, 4003c000 <_Scheduler_Table+0x48>
4002ab48: 913c8021 add x1, x1, #0xf20
4002ab4c: b8605833 ldr w19, [x1, w0, uxtw #2]
errno = eno;
4002ab50: 94000f5c bl 4002e8c0 <__errno>
4002ab54: aa0003e1 mov x1, x0
return -1;
4002ab58: 12800000 mov w0, #0xffffffff // #-1
errno = eno;
4002ab5c: b9000033 str w19, [x1]
}
4002ab60: f9400bf3 ldr x19, [sp, #16]
4002ab64: a8c27bfd ldp x29, x30, [sp], #32
4002ab68: d65f03c0 ret
4002ab6c: 00000000 udf #0
00000000400302f0 <rtems_task_delete>:
#include <rtems/score/threadimpl.h>
rtems_status_code rtems_task_delete(
rtems_id id
)
{
400302f0: a9b97bfd stp x29, x30, [sp, #-112]!
400302f4: 910003fd mov x29, sp
Thread_Control *the_thread;
Thread_Close_context context;
Thread_Control *executing;
_Thread_queue_Context_initialize( &context.Base );
the_thread = _Thread_Get( id, &context.Base.Lock_context.Lock_context );
400302f8: 9100a3e1 add x1, sp, #0x28
400302fc: 97ffe881 bl 4002a500 <_Thread_Get>
if ( the_thread == NULL ) {
40030300: b4000360 cbz x0, 4003036c <rtems_task_delete+0x7c>
40030304: f9000bf3 str x19, [sp, #16]
40030308: 900006b3 adrp x19, 40104000 <rtems_libio_iops+0x260>
4003030c: 91080273 add x19, x19, #0x200
40030310: f9401261 ldr x1, [x19, #32]
return RTEMS_INVALID_ID;
}
executing = _Thread_Executing;
if ( the_thread == executing ) {
40030314: eb01001f cmp x0, x1
40030318: 540000e0 b.eq 40030334 <rtems_task_delete+0x44> // b.none
THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED,
NULL
);
_Thread_Dispatch_enable( cpu_self );
} else {
_Thread_Close( the_thread, executing, &context );
4003031c: 9100a3e2 add x2, sp, #0x28
40030320: 97ffed6c bl 4002b8d0 <_Thread_Close>
}
return RTEMS_SUCCESSFUL;
40030324: 52800000 mov w0, #0x0 // #0
40030328: f9400bf3 ldr x19, [sp, #16]
}
4003032c: a8c77bfd ldp x29, x30, [sp], #112
40030330: d65f03c0 ret
disable_level = cpu_self->thread_dispatch_disable_level;
40030334: b9401a61 ldr w1, [x19, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40030338: 11000421 add w1, w1, #0x1
4003033c: b9001a61 str w1, [x19, #24]
_ISR_lock_ISR_enable( &context.Base.Lock_context.Lock_context );
40030340: b9402be1 ldr w1, [sp, #40]
40030344: d51b4221 msr daif, x1
_Thread_Exit(
40030348: d2800002 mov x2, #0x0 // #0
4003034c: 52800281 mov w1, #0x14 // #20
40030350: 97ffed70 bl 4002b910 <_Thread_Exit>
_Thread_Dispatch_enable( cpu_self );
40030354: aa1303e0 mov x0, x19
40030358: 97ffe852 bl 4002a4a0 <_Thread_Dispatch_enable>
return RTEMS_SUCCESSFUL;
4003035c: 52800000 mov w0, #0x0 // #0 <== NOT EXECUTED
40030360: f9400bf3 ldr x19, [sp, #16] <== NOT EXECUTED
}
40030364: a8c77bfd ldp x29, x30, [sp], #112 <== NOT EXECUTED
40030368: d65f03c0 ret <== NOT EXECUTED
return RTEMS_INVALID_ID;
4003036c: 52800080 mov w0, #0x4 // #4
}
40030370: a8c77bfd ldp x29, x30, [sp], #112
40030374: d65f03c0 ret
...
0000000040027280 <rtems_task_mode>:
bool needs_asr_dispatching;
rtems_mode old_mode;
executing = _Thread_Get_executing();
if ( !previous_mode_set )
40027280: b4000de2 cbz x2, 4002743c <rtems_task_mode+0x1bc>
{
40027284: a9ba7bfd stp x29, x30, [sp, #-96]!
40027288: 910003fd mov x29, sp
4002728c: a90153f3 stp x19, x20, [sp, #16]
40027290: 2a0103f4 mov w20, w1
40027294: a9025bf5 stp x21, x22, [sp, #32]
40027298: aa0203f5 mov x21, x2
4002729c: a90363f7 stp x23, x24, [sp, #48]
400272a0: 2a0003f7 mov w23, w0
400272a4: f9002bfb str x27, [sp, #80]
return RTEMS_NOT_IMPLEMENTED;
}
#endif
#if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
if (
400272a8: 1200003b and w27, w1, #0x1
400272ac: 36000074 tbz w20, #0, 400272b8 <rtems_task_mode+0x38>
&& _Modes_Get_interrupt_level( mode_set ) != 0
#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE
&& _SMP_Need_inter_processor_interrupts()
#endif
) {
return RTEMS_NOT_IMPLEMENTED;
400272b0: 52800300 mov w0, #0x18 // #24
&& _Modes_Get_interrupt_level( mode_set ) != 0
400272b4: 37000ab7 tbnz w23, #0, 40027408 <rtems_task_mode+0x188>
400272b8: a9046bf9 stp x25, x26, [sp, #64]
400272bc: d00006f9 adrp x25, 40105000 <rtems_libio_iops+0x58>
400272c0: 91080339 add x25, x25, #0x200
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
preempt_enabled = false;
400272c4: 52800016 mov w22, #0x0 // #0
400272c8: f9401338 ldr x24, [x25, #32]
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
400272cc: 3943a700 ldrb w0, [x24, #233]
api = executing->API_Extensions[ THREAD_API_RTEMS ];
400272d0: f9411f1a ldr x26, [x24, #568]
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
400272d4: 7100001f cmp w0, #0x0
400272d8: 1a9f17f3 cset w19, eq // eq = none
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
400272dc: b940f302 ldr w2, [x24, #240]
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
400272e0: 53185e73 lsl w19, w19, #8
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
400272e4: 39402340 ldrb w0, [x26, #8]
old_mode |= RTEMS_TIMESLICE;
400272e8: 7100005f cmp w2, #0x0
400272ec: 32170261 orr w1, w19, #0x200
400272f0: 1a931033 csel w19, w1, w19, ne // ne = any
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
400272f4: 7100001f cmp w0, #0x0
400272f8: 32160260 orr w0, w19, #0x400
400272fc: 1a930013 csel w19, w0, w19, eq // eq = none
old_mode |= _ISR_Get_level();
40027300: 940014d8 bl 4002c660 <_CPU_ISR_Get_level>
40027304: 2a000273 orr w19, w19, w0
*previous_mode_set = old_mode;
40027308: b90002b3 str w19, [x21]
if ( mask & RTEMS_PREEMPT_MASK ) {
4002730c: 364000f4 tbz w20, #8, 40027328 <rtems_task_mode+0xa8>
bool is_preempt_enabled = _Modes_Is_preempt( mode_set );
preempt_enabled = !executing->is_preemptible && is_preempt_enabled;
40027310: 3943a716 ldrb w22, [x24, #233]
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt (
rtems_mode mode_set
)
{
return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
40027314: d27802e3 eor x3, x23, #0x100
40027318: 520002d6 eor w22, w22, #0x1
4002731c: 53082063 ubfx w3, w3, #8, #1
40027320: 0a160076 and w22, w3, w22
executing->is_preemptible = is_preempt_enabled;
40027324: 3903a703 strb w3, [x24, #233]
}
if ( mask & RTEMS_TIMESLICE_MASK ) {
40027328: 364800d4 tbz w20, #9, 40027340 <rtems_task_mode+0xc0>
if ( _Modes_Is_timeslice(mode_set) ) {
4002732c: 36480837 tbz w23, #9, 40027430 <rtems_task_mode+0x1b0>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget =
40027330: d00000c0 adrp x0, 40041000 <status_code_text+0x98>
40027334: b9420801 ldr w1, [x0, #520]
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
40027338: 52800020 mov w0, #0x1 // #1
4002733c: 291d8301 stp w1, w0, [x24, #236]
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK ) {
40027340: 3500071b cbnz w27, 40027420 <rtems_task_mode+0x1a0>
/*
* This is specific to the RTEMS API
*/
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
40027344: 365005d4 tbz w20, #10, 400273fc <rtems_task_mode+0x17c>
bool is_asr_enabled = !_Modes_Is_asr_disabled( mode_set );
40027348: d27602e2 eor x2, x23, #0x400
4002734c: 530a2842 ubfx w2, w2, #10, #1
__asm__ volatile (
40027350: d53b4220 mrs x0, daif
40027354: d50342df msr daifset, #0x2
_Thread_State_acquire( executing, &lock_context );
if ( is_asr_enabled != asr->is_enabled ) {
40027358: 39402343 ldrb w3, [x26, #8]
4002735c: 6b02007f cmp w3, w2
40027360: 540004a0 b.eq 400273f4 <rtems_task_mode+0x174> // b.none
asr->is_enabled = is_asr_enabled;
40027364: 39002342 strb w2, [x26, #8]
RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Swap_signals( ASR_Information *asr )
{
rtems_signal_set new_signals_posted;
new_signals_posted = asr->signals_pending;
40027368: 29438f42 ldp w2, w3, [x26, #28]
asr->signals_pending = asr->signals_posted;
4002736c: 29038b43 stp w3, w2, [x26, #28]
if ( _ASR_Swap_signals( asr ) != 0 ) {
40027370: 34000423 cbz w3, 400273f4 <rtems_task_mode+0x174>
RTEMS_INLINE_ROUTINE void _Chain_Append_if_is_off_chain_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
if ( _Chain_Is_node_off_chain( the_node ) ) {
40027374: f9401743 ldr x3, [x26, #40]
action->handler = handler;
40027378: d0000021 adrp x1, 4002d000 <rtems_filesystem_eval_path_generic+0x20>
4002737c: 91210021 add x1, x1, #0x840
40027380: f9001f41 str x1, [x26, #56]
} else {
_Atomic_Fetch_or_ulong( &cpu_target->message, 0, ATOMIC_ORDER_RELEASE );
_CPU_SMP_Send_interrupt( _Per_CPU_Get_index( cpu_target ) );
}
#else
cpu_self->dispatch_necessary = true;
40027384: 52800024 mov w4, #0x1 // #1
40027388: 39007324 strb w4, [x25, #28]
4002738c: 9100a342 add x2, x26, #0x28
40027390: b40005a3 cbz x3, 40027444 <rtems_task_mode+0x1c4> <== ALWAYS TAKEN
__asm__ volatile (
40027394: 92407c00 and x0, x0, #0xffffffff <== NOT EXECUTED
40027398: d51b4220 msr daif, x0 <== NOT EXECUTED
disable_level = cpu_self->thread_dispatch_disable_level;
4002739c: b9401b20 ldr w0, [x25, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
400273a0: 11000400 add w0, w0, #0x1
400273a4: b9001b20 str w0, [x25, #24]
__asm__ volatile (
400273a8: d53b4233 mrs x19, daif
400273ac: d50342df msr daifset, #0x2
( *scheduler->Operations.schedule )( scheduler, the_thread );
400273b0: 900000c0 adrp x0, 4003f000 <__fputwc+0x60>
400273b4: 913c6000 add x0, x0, #0xf18
400273b8: aa1803e1 mov x1, x24
400273bc: f9400802 ldr x2, [x0, #16]
400273c0: d63f0040 blr x2
__asm__ volatile (
400273c4: 92407e73 and x19, x19, #0xffffffff
400273c8: d51b4233 msr daif, x19
cpu_self = _Thread_Dispatch_disable();
_Thread_State_acquire( executing, &lock_context );
_Scheduler_Schedule( executing );
_Thread_State_release( executing, &lock_context );
_Thread_Dispatch_direct( cpu_self );
400273cc: aa1903e0 mov x0, x25
400273d0: 94000bd4 bl 4002a320 <_Thread_Dispatch_direct>
}
return RTEMS_SUCCESSFUL;
400273d4: 52800000 mov w0, #0x0 // #0
}
400273d8: a94153f3 ldp x19, x20, [sp, #16]
400273dc: a9425bf5 ldp x21, x22, [sp, #32]
400273e0: a94363f7 ldp x23, x24, [sp, #48]
400273e4: a9446bf9 ldp x25, x26, [sp, #64]
400273e8: f9402bfb ldr x27, [sp, #80]
400273ec: a8c67bfd ldp x29, x30, [sp], #96
400273f0: d65f03c0 ret
400273f4: 92407c00 and x0, x0, #0xffffffff
400273f8: d51b4220 msr daif, x0
return RTEMS_SUCCESSFUL;
400273fc: 52800000 mov w0, #0x0 // #0
if ( preempt_enabled || needs_asr_dispatching ) {
40027400: 35fffcf6 cbnz w22, 4002739c <rtems_task_mode+0x11c>
40027404: a9446bf9 ldp x25, x26, [sp, #64]
}
40027408: a94153f3 ldp x19, x20, [sp, #16]
4002740c: a9425bf5 ldp x21, x22, [sp, #32]
40027410: a94363f7 ldp x23, x24, [sp, #48]
40027414: f9402bfb ldr x27, [sp, #80]
40027418: a8c67bfd ldp x29, x30, [sp], #96
4002741c: d65f03c0 ret
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
rtems_mode mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
40027420: 924002e0 and x0, x23, #0x1
40027424: 94001487 bl 4002c640 <_CPU_ISR_Set_level>
if ( mask & RTEMS_ASR_MASK ) {
40027428: 3657feb4 tbz w20, #10, 400273fc <rtems_task_mode+0x17c> <== NEVER TAKEN
4002742c: 17ffffc7 b 40027348 <rtems_task_mode+0xc8>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
40027430: b900f31f str wzr, [x24, #240]
if ( mask & RTEMS_INTERRUPT_MASK ) {
40027434: 34fff89b cbz w27, 40027344 <rtems_task_mode+0xc4>
40027438: 17fffffa b 40027420 <rtems_task_mode+0x1a0>
return RTEMS_INVALID_ADDRESS;
4002743c: 52800120 mov w0, #0x9 // #9
}
40027440: d65f03c0 ret
old_last = tail->previous;
40027444: f940bb03 ldr x3, [x24, #368]
40027448: 9105a301 add x1, x24, #0x168
the_node->next = tail;
4002744c: f9001741 str x1, [x26, #40]
tail->previous = the_node;
40027450: f900bb02 str x2, [x24, #368]
old_last->next = the_node;
40027454: f9000062 str x2, [x3]
the_node->previous = old_last;
40027458: f9001b43 str x3, [x26, #48]
4002745c: 92407c00 and x0, x0, #0xffffffff
40027460: d51b4220 msr daif, x0
if ( preempt_enabled || needs_asr_dispatching ) {
40027464: 17ffffce b 4002739c <rtems_task_mode+0x11c>
...
00000000400274f0 <rtems_task_set_scheduler>:
rtems_status_code rtems_task_set_scheduler(
rtems_id task_id,
rtems_id scheduler_id,
rtems_task_priority priority
)
{
400274f0: a9b77bfd stp x29, x30, [sp, #-144]!
400274f4: 910003fd mov x29, sp
400274f8: a9025bf5 stp x21, x22, [sp, #32]
400274fc: 2a0003f5 mov w21, w0
if ( index >= _Scheduler_Count ) {
40027500: 52800020 mov w0, #0x1 // #1
40027504: 72a1e020 movk w0, #0xf01, lsl #16
40027508: a90363f7 stp x23, x24, [sp, #48]
4002750c: 6b00003f cmp w1, w0
40027510: 54000581 b.ne 400275c0 <rtems_task_set_scheduler+0xd0> // b.any
40027514: a90153f3 stp x19, x20, [sp, #16]
40027518: d0000094 adrp x20, 40039000 <__ascii_mbtowc+0x68>
4002751c: 9138e294 add x20, x20, #0xe38
40027520: 2a0203f3 mov w19, w2
return ( *scheduler->Operations.map_priority )( scheduler, priority );
40027524: aa1403e0 mov x0, x20
40027528: aa1303e1 mov x1, x19
return RTEMS_INVALID_ID;
}
core_priority = _RTEMS_Priority_To_core( scheduler, priority, &valid );
if ( !valid ) {
return RTEMS_INVALID_PRIORITY;
4002752c: 52800277 mov w23, #0x13 // #19
40027530: f9401e82 ldr x2, [x20, #56]
40027534: f9403e96 ldr x22, [x20, #120]
40027538: d63f0040 blr x2
if ( !valid ) {
4002753c: eb1302df cmp x22, x19
40027540: aa0003f6 mov x22, x0
40027544: 54000303 b.cc 400275a4 <rtems_task_set_scheduler+0xb4> // b.lo, b.ul, b.last
}
_Thread_queue_Context_initialize( &queue_context );
the_thread = _Thread_Get( task_id, &queue_context.Lock_context.Lock_context );
40027548: 2a1503e0 mov w0, w21
4002754c: 910143e1 add x1, sp, #0x50
40027550: 94000944 bl 40029a60 <_Thread_Get>
40027554: aa0003f3 mov x19, x0
if ( the_thread == NULL ) {
40027558: b4000320 cbz x0, 400275bc <rtems_task_set_scheduler+0xcc>
disable_level = cpu_self->thread_dispatch_disable_level;
4002755c: 900006f5 adrp x21, 40103000 <_RTEMS_tasks_Objects+0xc38>
40027560: 912302b5 add x21, x21, #0x8c0
ISR_lock_Context lock_context;
const Scheduler_Control *old_scheduler;
#endif
if ( the_thread->Wait.queue != NULL ) {
40027564: f9404e61 ldr x1, [x19, #152]
40027568: 52800197 mov w23, #0xc // #12
4002756c: b9401aa0 ldr w0, [x21, #24]
cpu_self->thread_dispatch_disable_level = disable_level + 1;
40027570: 11000400 add w0, w0, #0x1
40027574: b9001aa0 str w0, [x21, #24]
40027578: b4000301 cbz x1, 400275d8 <rtems_task_set_scheduler+0xe8>
4002757c: b94053e0 ldr w0, [sp, #80]
40027580: d51b4220 msr daif, x0
status = _Scheduler_Set( scheduler, the_thread, core_priority );
_Thread_State_release_critical( the_thread, &state_context );
_Thread_Wait_release( the_thread, &queue_context );
_Thread_Dispatch_enable( cpu_self );
40027584: aa1503e0 mov x0, x21
40027588: 9400091e bl 40029a00 <_Thread_Dispatch_enable>
return _Status_Get( status );
}
4002758c: 2a1703e0 mov w0, w23
_Thread_Dispatch_enable( cpu_self );
40027590: a94153f3 ldp x19, x20, [sp, #16]
}
40027594: a9425bf5 ldp x21, x22, [sp, #32]
40027598: a94363f7 ldp x23, x24, [sp, #48]
4002759c: a8c97bfd ldp x29, x30, [sp], #144
400275a0: d65f03c0 ret
400275a4: 2a1703e0 mov w0, w23
400275a8: a94153f3 ldp x19, x20, [sp, #16]
400275ac: a9425bf5 ldp x21, x22, [sp, #32]
400275b0: a94363f7 ldp x23, x24, [sp, #48]
400275b4: a8c97bfd ldp x29, x30, [sp], #144
400275b8: d65f03c0 ret
400275bc: a94153f3 ldp x19, x20, [sp, #16]
return RTEMS_INVALID_ID;
400275c0: 52800097 mov w23, #0x4 // #4
}
400275c4: 2a1703e0 mov w0, w23
400275c8: a9425bf5 ldp x21, x22, [sp, #32]
400275cc: a94363f7 ldp x23, x24, [sp, #48]
400275d0: a8c97bfd ldp x29, x30, [sp], #144
400275d4: d65f03c0 ret
return the_thread->Scheduler.nodes;
400275d8: a9046bf9 stp x25, x26, [sp, #64]
RTEMS_INLINE_ROUTINE void _Priority_Plain_extract(
Priority_Aggregation *aggregation,
Priority_Node *node
)
{
_RBTree_Extract( &aggregation->Contributors, &node->Node.RBTree );
400275dc: 91010278 add x24, x19, #0x40
400275e0: aa1803e1 mov x1, x24
400275e4: f9403679 ldr x25, [x19, #104]
400275e8: 9100c337 add x23, x25, #0x30
400275ec: 9100233a add x26, x25, #0x8
400275f0: aa1703e0 mov x0, x23
400275f4: 940003bb bl 400284e0 <_RBTree_Extract>
*/
RTEMS_INLINE_ROUTINE bool _RBTree_Is_empty(
const RBTree_Control *the_rbtree
)
{
return RB_EMPTY( the_rbtree );
400275f8: f9401b21 ldr x1, [x25, #48]
_Priority_Plain_extract(
&old_scheduler_node->Wait.Priority,
&the_thread->Real_priority
);
if (
400275fc: b5000261 cbnz x1, 40027648 <rtems_task_set_scheduler+0x158> <== NEVER TAKEN
_Thread_Scheduler_process_requests( the_thread );
#else
new_scheduler_node = old_scheduler_node;
#endif
the_thread->Start.initial_priority = priority;
40027600: f9009e76 str x22, [x19, #312]
unsigned int seq;
seq = _SMP_sequence_lock_Write_begin( &node->Priority.Lock );
#endif
new_priority |= ( prepend_it ? 0 : SCHEDULER_PRIORITY_APPEND_FLAG );
40027604: b24002c4 orr x4, x22, #0x1
( *scheduler->Operations.update_priority )(
40027608: f9403662 ldr x2, [x19, #104]
node->priority = priority;
4002760c: f9001316 str x22, [x24, #32]
node->priority = priority;
40027610: f9001356 str x22, [x26, #32]
40027614: aa1403e0 mov x0, x20
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
_Assert( _RBTree_Is_node_off_tree( the_node ) );
RB_ROOT( the_rbtree ) = the_node;
40027618: f9001b38 str x24, [x25, #48]
4002761c: aa1303e1 mov x1, x19
RB_PARENT( the_node, Node ) = NULL;
40027620: f9000b1f str xzr, [x24, #16]
}
#endif
_Scheduler_Node_set_priority( new_scheduler_node, priority, false );
_Scheduler_Update_priority( the_thread );
return STATUS_SUCCESSFUL;
40027624: 52800017 mov w23, #0x0 // #0
RB_LEFT( the_node, Node ) = NULL;
40027628: f900227f str xzr, [x19, #64]
( *scheduler->Operations.update_priority )(
4002762c: f9401a83 ldr x3, [x20, #48]
RB_RIGHT( the_node, Node ) = NULL;
40027630: f900071f str xzr, [x24, #8]
RB_COLOR( the_node, Node ) = RB_BLACK;
40027634: b9001b1f str wzr, [x24, #24]
node->Priority.value = new_priority;
40027638: f9002724 str x4, [x25, #72]
4002763c: d63f0060 blr x3
40027640: a9446bf9 ldp x25, x26, [sp, #64]
return STATUS_SUCCESSFUL;
40027644: 17ffffce b 4002757c <rtems_task_set_scheduler+0x8c>
_Priority_Plain_insert(
40027648: f9403260 ldr x0, [x19, #96] <== NOT EXECUTED
link = _RBTree_Root_reference( the_rbtree );
parent = NULL;
is_new_minimum = true;
while ( *link != NULL ) {
4002764c: 14000002 b 40027654 <rtems_task_set_scheduler+0x164> <== NOT EXECUTED
40027650: aa0303e1 mov x1, x3 <== NOT EXECUTED
parent = *link;
if ( ( *less )( key, parent ) ) {
40027654: f9401023 ldr x3, [x1, #32] <== NOT EXECUTED
return &RB_LEFT( the_node, Node );
40027658: 91002022 add x2, x1, #0x8 <== NOT EXECUTED
4002765c: eb03001f cmp x0, x3 <== NOT EXECUTED
40027660: 9a812042 csel x2, x2, x1, cs // cs = hs, nlast <== NOT EXECUTED
while ( *link != NULL ) {
40027664: f9400043 ldr x3, [x2] <== NOT EXECUTED
40027668: b5ffff43 cbnz x3, 40027650 <rtems_task_set_scheduler+0x160> <== NOT EXECUTED
RB_SET( child, parent, Node );
4002766c: a900871f stp xzr, x1, [x24, #8] <== NOT EXECUTED
40027670: 52800023 mov w3, #0x1 // #1 <== NOT EXECUTED
is_new_minimum = false;
}
}
_RBTree_Add_child( the_node, parent, link );
_RBTree_Insert_color( the_rbtree, the_node );
40027674: aa1703e0 mov x0, x23 <== NOT EXECUTED
RB_SET( child, parent, Node );
40027678: f900227f str xzr, [x19, #64] <== NOT EXECUTED
_RBTree_Insert_color( the_rbtree, the_node );
4002767c: aa1803e1 mov x1, x24 <== NOT EXECUTED
RB_SET( child, parent, Node );
40027680: b9001b03 str w3, [x24, #24] <== NOT EXECUTED
return STATUS_RESOURCE_IN_USE;
40027684: 52800197 mov w23, #0xc // #12 <== NOT EXECUTED
*link = child;
40027688: f9000058 str x24, [x2] <== NOT EXECUTED
_RBTree_Insert_color( the_rbtree, the_node );
4002768c: 940004a9 bl 40028930 <_RBTree_Insert_color> <== NOT EXECUTED
40027690: a9446bf9 ldp x25, x26, [sp, #64] <== NOT EXECUTED
40027694: 17ffffba b 4002757c <rtems_task_set_scheduler+0x8c> <== NOT EXECUTED
...