=============================================================================== 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 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 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 (*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 } 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 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 40024fa4: 91238000 add x0, x0, #0x8e0 40024fa8: b8625800 ldr w0, [x0, w2, uxtw #2] 40024fac: 17fffff0 b 40024f6c <_TOD_Validate+0xac> =============================================================================== 0000000040024b50 : uint32_t day_secs; uint32_t year; uint32_t year_days; uint32_t leap_years; if ( !time_buffer ) 40024b50: b4001180 cbz x0, 40024d80 { 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 _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 // 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 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 // 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 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 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 // b.pmore ++days_to_date; 40024c80: 91000821 add x1, x1, #0x2 while (month < 11) { 40024c84: 71002c5f cmp w2, #0xb 40024c88: 54ffff41 b.ne 40024c70 // 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 // 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 // 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 // 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 *day -= *(days_to_date - 1); 40024d3c: 785fe024 ldurh w4, [x1, #-2] 40024d40: 17ffffd4 b 40024c90 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 // b.pmore <== ALWAYS TAKEN year_days += 1; 40024d5c: 11000463 add w3, w3, #0x1 40024d60: 17ffffab b 40024c0c days_to_date = _TOD_Days_to_date[1]; 40024d64: b00000a1 adrp x1, 40039000 40024d68: 91230821 add x1, x1, #0x8c2 40024d6c: 17ffffbe b 40024c64 days_to_date = _TOD_Days_to_date[0]; 40024d70: b00000a1 adrp x1, 40039000 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 return RTEMS_INVALID_ADDRESS; 40024d80: 52800120 mov w0, #0x9 // #9 } 40024d84: d65f03c0 ret ... =============================================================================== 0000000040024f90 : #include #include #include 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 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 <== 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 : int i; /* * Validate parameters and look up information structure. */ if ( !info ) 40025400: b4000442 cbz x2, 40025488 { 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_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 <== 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 // 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 ... =============================================================================== 0000000040023e20 : Objects_Information *information; Objects_Control *the_object; Objects_Id tmpId; Status_Control status; if ( !name ) 40023e20: b40004e1 cbz x1, 40023ebc { 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 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 * * @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 _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 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 <== 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 =============================================================================== 000000004002f660 : { 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 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 // 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 // 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 // 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 // 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 _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 ... =============================================================================== 0000000040024cb0 : #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 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( printer, "--- CPU times are in seconds ---\n" ); 40024cd0: aa1503e0 mov x0, x21 40024cd4: b00000a1 adrp x1, 40039000 40024cd8: 91180021 add x1, x1, #0x600 40024cdc: 9400110d bl 40029110 rtems_printf( printer, "--- Wall times are in seconds ---\n" ); 40024ce0: aa1503e0 mov x0, x21 40024ce4: b00000a1 adrp x1, 40039000 40024ce8: 9118a021 add x1, x1, #0x628 40024cec: 94001109 bl 40029110 Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ rtems_printf( printer, 40024cf0: aa1503e0 mov x0, x21 40024cf4: b00000a1 adrp x1, 40039000 40024cf8: 91194021 add x1, x1, #0x650 40024cfc: 94001105 bl 40029110 /* * 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 // 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 40024d30: 911ba2f7 add x23, x23, #0x6e8 rtems_printf( printer, 40024d34: b00000b8 adrp x24, 40039000 40024d38: 911c0318 add x24, x24, #0x700 40024d3c: 14000028 b 40024ddc _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 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 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 ++id 40024dd0: 11000673 add w19, w19, #0x1 for ( 40024dd4: 6b1302df cmp w22, w19 40024dd8: 540003c3 b.cc 40024e50 // 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 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 (void) rtems_rate_monotonic_get_status( id, &the_status ); 40024df8: 9400135e bl 40029b70 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_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 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_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 for ( 40024e48: 6b1302df cmp w22, w19 40024e4c: 54fffc82 b.cs 40024ddc // 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 */ 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 // 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 for ( 40024ec4: 6b13029f cmp w20, w19 40024ec8: 54ffff82 b.cs 40024eb8 // 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_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 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 // 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 // b.none 400263d8: 94002f0c bl 40032008 if ( cpu_index == 0 ) { 400263dc: 340000a0 cbz w0, 400263f0 <== 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_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 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 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 // b.none 4002a154: 7100081f cmp w0, #0x2 4002a158: 54000740 b.eq 4002a240 // b.none 4002a15c: 34000540 cbz w0, 4002a204 ) { _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 the_semaphore->count -= 1; _CORE_semaphore_Release( the_semaphore, queue_context ); return STATUS_SUCCESSFUL; } if ( !wait ) { 4002a180: 34000bc3 cbz w3, 4002a2f8 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 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 // 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 executing, queue_context ); } if ( owner == executing ) { 4002a1d0: eb00027f cmp x19, x0 4002a1d4: 540005c0 b.eq 4002a28c // 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 if ( owner == executing ) { 4002a20c: eb01027f cmp x19, x1 4002a210: 54000680 b.eq 4002a2e0 // 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 if ( owner == executing ) { 4002a260: eb02027f cmp x19, x2 4002a264: 54000140 b.eq 4002a28c // 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 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 4002a2f8: b94033e0 ldr w0, [sp, #48] 4002a2fc: d51b4220 msr daif, x0 return STATUS_UNSATISFIED; 4002a300: 528001a0 mov w0, #0xd // #13 4002a304: 17ffffde b 4002a27c 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 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 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 // 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 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 ... =============================================================================== 000000004002a3a0 : #include #include 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 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 // b.none 4002a3e8: 54000568 b.hi 4002a494 // b.pmore 4002a3ec: 34001001 cbz w1, 4002a5ec 4002a3f0: 7100043f cmp w1, #0x1 4002a3f4: 54000ce1 b.ne 4002a590 // 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 // 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 <== 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 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 <== 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 4002a494: 71000c3f cmp w1, #0x3 4002a498: 540007c1 b.ne 4002a590 // 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 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 <== 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 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 // 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 <== 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 _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 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 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 <== 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 // 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 // b.any nest_level = the_mutex->nest_level; 4002a5f8: b9401ad5 ldr w21, [x22, #24] if ( nest_level > 0 ) { 4002a5fc: 35000175 cbnz w21, 4002a628 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 _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 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 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 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 ... =============================================================================== 0000000040024dc0 : 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 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 // 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 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 40024e2c: eb1802ff cmp x23, x24 40024e30: 54000868 b.hi 40024f3c // 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 // 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 // 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 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 <== 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 <== 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 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 =============================================================================== 000000004002ab20 : [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_status_code_to_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { 4002ab20: 35000060 cbnz w0, 4002ab2c 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 // 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 : #include 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 40030304: f9000bf3 str x19, [sp, #16] 40030308: 900006b3 adrp x19, 40104000 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 // 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 : bool needs_asr_dispatching; rtems_mode old_mode; executing = _Thread_Get_executing(); if ( !previous_mode_set ) 40027280: b4000de2 cbz x2, 4002743c { 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 && _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 400272b8: a9046bf9 stp x25, x26, [sp, #64] 400272bc: d00006f9 adrp x25, 40105000 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 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 if ( _Modes_Is_timeslice(mode_set) ) { 4002732c: 36480837 tbz w23, #9, 40027430 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; executing->cpu_time_budget = 40027330: d00000c0 adrp x0, 40041000 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 /* * This is specific to the RTEMS API */ needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { 40027344: 365005d4 tbz w20, #10, 400273fc 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 // 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_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 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 <== 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 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 <== NEVER TAKEN 4002742c: 17ffffc7 b 40027348 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 40027430: b900f31f str wzr, [x24, #240] if ( mask & RTEMS_INTERRUPT_MASK ) { 40027434: 34fff89b cbz w27, 40027344 40027438: 17fffffa b 40027420 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 ... =============================================================================== 00000000400274f0 : 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 // 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 // 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 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 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 <== 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 _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 <== 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 <== 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 <== NOT EXECUTED ...