=============================================================================== 4000f554 <_Event_Seize>: rtems_event_set pending_events; bool success; Thread_Wait_flags intend_to_block; Per_CPU_Control *cpu_self; pending_events = event->pending_events; 4000f554: 0007ae03 lw t3,0(a5) { 4000f558: fd010113 addi sp,sp,-48 4000f55c: 02812423 sw s0,40(sp) 4000f560: 01312e23 sw s3,28(sp) 4000f564: 02112623 sw ra,44(sp) 4000f568: 02912223 sw s1,36(sp) 4000f56c: 03212023 sw s2,32(sp) 4000f570: 01412c23 sw s4,24(sp) RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get( rtems_event_set the_event_set, rtems_event_set the_event_condition ) { return ( the_event_set & the_event_condition ); 4000f574: 00ae7333 and t1,t3,a0 4000f578: 00070413 mv s0,a4 4000f57c: 00080993 mv s3,a6 seized_events = _Event_sets_Get( pending_events, event_in ); if ( !_Event_sets_Is_empty( seized_events ) && 4000f580: 00030a63 beqz t1,4000f594 <_Event_Seize+0x40> 4000f584: 0e650263 beq a0,t1,4000f668 <_Event_Seize+0x114> */ RTEMS_INLINE_ROUTINE bool _Options_Is_any ( rtems_option option_set ) { return (option_set & RTEMS_EVENT_ANY) ? true : false; 4000f588: 0015d713 srli a4,a1,0x1 (seized_events == event_in || _Options_Is_any( option_set )) ) { 4000f58c: 00177713 andi a4,a4,1 4000f590: 0c071c63 bnez a4,4000f668 <_Event_Seize+0x114> _Thread_Wait_release_default( executing, lock_context ); *event_out = seized_events; return RTEMS_SUCCESSFUL; } if ( _Options_Is_no_wait( option_set ) ) { 4000f594: 0015f793 andi a5,a1,1 4000f598: 18079063 bnez a5,4000f718 <_Event_Seize+0x1c4> _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; 4000f59c: 0019e913 ori s2,s3,1 disable_level = cpu_self->thread_dispatch_disable_level; 4000f5a0: 400234b7 lui s1,0x40023 * set properly when we are marked as in the event critical section. * * NOTE: Since interrupts are disabled, this isn't that much of an * issue but better safe than sorry. */ executing->Wait.return_code = STATUS_SUCCESSFUL; 4000f5a4: 04042623 sw zero,76(s0) executing->Wait.option = option_set; 4000f5a8: 04b42423 sw a1,72(s0) executing->Wait.count = event_in; 4000f5ac: 02a42e23 sw a0,60(s0) the_thread->Wait.flags = flags; 4000f5b0: 05242823 sw s2,80(s0) 4000f5b4: f8048713 addi a4,s1,-128 # 40022f80 <_Per_CPU_Information> 4000f5b8: 03072783 lw a5,48(a4) executing->Wait.return_argument = event_out; 4000f5bc: 04d42023 sw a3,64(s0) cpu_self->thread_dispatch_disable_level = disable_level + 1; 4000f5c0: 00178793 addi a5,a5,1 4000f5c4: 02f72823 sw a5,48(a4) 4000f5c8: 03012783 lw a5,48(sp) 4000f5cc: 0007a783 lw a5,0(a5) 4000f5d0: 3007a073 csrs mstatus,a5 _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 ) { 4000f5d4: 0c061a63 bnez a2,4000f6a8 <_Event_Seize+0x154> _Thread_Add_timeout_ticks( executing, cpu_self, ticks ); } _Thread_Set_state( executing, block_state ); 4000f5d8: 00088593 mv a1,a7 4000f5dc: 00040513 mv a0,s0 4000f5e0: a95fb0ef jal ra,4000b074 <_Thread_Set_state> __asm__ volatile ( 4000f5e4: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 4000f5e8: 0087f793 andi a5,a5,8 bool success = ( the_thread->Wait.flags == expected_flags ); 4000f5ec: 05042703 lw a4,80(s0) if ( success ) { 4000f5f0: 06e90263 beq s2,a4,4000f654 <_Event_Seize+0x100> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000f5f4: 3007a073 csrs mstatus,a5 success = _Thread_Wait_flags_try_change_acquire( executing, intend_to_block, wait_class | THREAD_WAIT_STATE_BLOCKED ); if ( !success ) { 4000f5f8: 02e91863 bne s2,a4,4000f628 <_Event_Seize+0xd4> _Thread_Timer_remove( executing ); _Thread_Unblock( executing ); } _Thread_Dispatch_direct( cpu_self ); 4000f5fc: f8048513 addi a0,s1,-128 4000f600: b04fa0ef jal ra,40009904 <_Thread_Dispatch_direct> RTEMS_INLINE_ROUTINE rtems_status_code _Status_Get( Status_Control status ) { return (rtems_status_code) STATUS_GET_CLASSIC( status ); 4000f604: 04c44503 lbu a0,76(s0) return _Status_Get_after_wait( executing ); } 4000f608: 02c12083 lw ra,44(sp) 4000f60c: 02812403 lw s0,40(sp) 4000f610: 02412483 lw s1,36(sp) 4000f614: 02012903 lw s2,32(sp) 4000f618: 01c12983 lw s3,28(sp) 4000f61c: 01812a03 lw s4,24(sp) 4000f620: 03010113 addi sp,sp,48 4000f624: 00008067 ret __asm__ volatile ( 4000f628: 30047973 csrrci s2,mstatus,8 _Watchdog_Remove( 4000f62c: 06042503 lw a0,96(s0) 4000f630: 06840593 addi a1,s0,104 4000f634: fddfb0ef jal ra,4000b610 <_Watchdog_Remove> return mstatus & RISCV_MSTATUS_MIE; 4000f638: 00897913 andi s2,s2,8 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000f63c: 30092073 csrs mstatus,s2 _Thread_Clear_state( the_thread, STATES_BLOCKED ); 4000f640: 300165b7 lui a1,0x30016 4000f644: fff58593 addi a1,a1,-1 # 30015fff 4000f648: 00040513 mv a0,s0 4000f64c: 7f4010ef jal ra,40010e40 <_Thread_Clear_state> } 4000f650: fadff06f j 4000f5fc <_Event_Seize+0xa8> success = _Thread_Wait_flags_try_change_acquire( 4000f654: 0029e813 ori a6,s3,2 the_thread->Wait.flags = desired_flags; 4000f658: 05042823 sw a6,80(s0) 4000f65c: 3007a073 csrs mstatus,a5 if ( !success ) { 4000f660: f8e90ee3 beq s2,a4,4000f5fc <_Event_Seize+0xa8> 4000f664: fc5ff06f j 4000f628 <_Event_Seize+0xd4> <== 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) ); 4000f668: fff34713 not a4,t1 4000f66c: 01c77e33 and t3,a4,t3 event->pending_events = 4000f670: 01c7a023 sw t3,0(a5) 4000f674: 03012783 lw a5,48(sp) 4000f678: 0007a783 lw a5,0(a5) 4000f67c: 3007a073 csrs mstatus,a5 } 4000f680: 02c12083 lw ra,44(sp) 4000f684: 02812403 lw s0,40(sp) *event_out = seized_events; 4000f688: 0066a023 sw t1,0(a3) } 4000f68c: 02412483 lw s1,36(sp) 4000f690: 02012903 lw s2,32(sp) 4000f694: 01c12983 lw s3,28(sp) 4000f698: 01812a03 lw s4,24(sp) return RTEMS_SUCCESSFUL; 4000f69c: 00000513 li a0,0 } 4000f6a0: 03010113 addi sp,sp,48 4000f6a4: 00008067 ret __asm__ volatile ( 4000f6a8: 01112623 sw a7,12(sp) 4000f6ac: 30047a73 csrrci s4,mstatus,8 expire = ticks + cpu->Watchdog.ticks; 4000f6b0: 04872783 lw a5,72(a4) 4000f6b4: 04c72683 lw a3,76(a4) the_thread->Timer.header = 4000f6b8: 40023537 lui a0,0x40023 4000f6bc: 00f60733 add a4,a2,a5 4000f6c0: 00c737b3 sltu a5,a4,a2 the_thread->Timer.Watchdog.routine = _Thread_Timeout; 4000f6c4: 4000b637 lui a2,0x4000b the_thread->Timer.header = 4000f6c8: fd050593 addi a1,a0,-48 # 40022fd0 <_Per_CPU_Information+0x50> the_thread->Timer.Watchdog.routine = _Thread_Timeout; 4000f6cc: 27c60613 addi a2,a2,636 # 4000b27c <_Thread_Timeout> the_thread->Timer.header = 4000f6d0: 06b42023 sw a1,96(s0) the_thread->Timer.Watchdog.routine = _Thread_Timeout; 4000f6d4: 06c42c23 sw a2,120(s0) _Watchdog_Insert(header, the_watchdog, expire); 4000f6d8: 00d786b3 add a3,a5,a3 4000f6dc: 00070613 mv a2,a4 4000f6e0: 06840593 addi a1,s0,104 4000f6e4: fd050513 addi a0,a0,-48 4000f6e8: eb9fb0ef jal ra,4000b5a0 <_Watchdog_Insert> return mstatus & RISCV_MSTATUS_MIE; 4000f6ec: 008a7a13 andi s4,s4,8 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000f6f0: 300a2073 csrs mstatus,s4 4000f6f4: 00c12883 lw a7,12(sp) _Thread_Set_state( executing, block_state ); 4000f6f8: 00040513 mv a0,s0 4000f6fc: 00088593 mv a1,a7 4000f700: 975fb0ef jal ra,4000b074 <_Thread_Set_state> __asm__ volatile ( 4000f704: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 4000f708: 0087f793 andi a5,a5,8 bool success = ( the_thread->Wait.flags == expected_flags ); 4000f70c: 05042703 lw a4,80(s0) if ( success ) { 4000f710: eee912e3 bne s2,a4,4000f5f4 <_Event_Seize+0xa0> 4000f714: f41ff06f j 4000f654 <_Event_Seize+0x100> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000f718: 03012783 lw a5,48(sp) 4000f71c: 0007a783 lw a5,0(a5) 4000f720: 3007a073 csrs mstatus,a5 } 4000f724: 02c12083 lw ra,44(sp) 4000f728: 02812403 lw s0,40(sp) *event_out = seized_events; 4000f72c: 0066a023 sw t1,0(a3) } 4000f730: 02412483 lw s1,36(sp) 4000f734: 02012903 lw s2,32(sp) 4000f738: 01c12983 lw s3,28(sp) 4000f73c: 01812a03 lw s4,24(sp) return RTEMS_UNSATISFIED; 4000f740: 00d00513 li a0,13 } 4000f744: 03010113 addi sp,sp,48 4000f748: 00008067 ret =============================================================================== 4001181c <_RTEMS_tasks_Create>: { 4001181c: fb010113 addi sp,sp,-80 40011820: 04812423 sw s0,72(sp) 40011824: 00050413 mv s0,a0 if ( !rtems_is_name_valid( config->name ) ) { 40011828: 00052503 lw a0,0(a0) { 4001182c: 05212023 sw s2,64(sp) 40011830: 04112623 sw ra,76(sp) 40011834: 04912223 sw s1,68(sp) 40011838: 03312e23 sw s3,60(sp) 4001183c: 03412c23 sw s4,56(sp) 40011840: 03512a23 sw s5,52(sp) return RTEMS_INVALID_NAME; 40011844: 00300913 li s2,3 if ( !rtems_is_name_valid( config->name ) ) { 40011848: 10050063 beqz a0,40011948 <_RTEMS_tasks_Create+0x12c> 4001184c: 00058493 mv s1,a1 if ( id == NULL ) { 40011850: 12058663 beqz a1,4001197c <_RTEMS_tasks_Create+0x160> thread_config.budget_algorithm = _Modes_Is_timeslice( config->initial_modes ) ? 40011854: 01842683 lw a3,24(s0) attributes = _Attributes_Set( config->attributes, ATTRIBUTES_REQUIRED ); 40011858: 01c42783 lw a5,28(s0) memset( &thread_config, 0, sizeof( thread_config ) ); 4001185c: 00060913 mv s2,a2 */ RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt ( rtems_mode mode_set ) { return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT; 40011860: 0086d713 srli a4,a3,0x8 */ RTEMS_INLINE_ROUTINE bool _Modes_Is_timeslice ( rtems_mode mode_set ) { return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE; 40011864: 0096d613 srli a2,a3,0x9 return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT; 40011868: 00174713 xori a4,a4,1 4001186c: 02012423 sw zero,40(sp) */ RTEMS_INLINE_ROUTINE bool _Attributes_Is_floating_point( rtems_attribute attribute_set ) { return ( attribute_set & RTEMS_FLOATING_POINT ) ? true : false; 40011870: 0017f593 andi a1,a5,1 return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE; 40011874: 00167613 andi a2,a2,1 */ RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level ( rtems_mode mode_set ) { return ( mode_set & RTEMS_INTERRUPT_MASK ); 40011878: 0016f693 andi a3,a3,1 return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT; 4001187c: 00177713 andi a4,a4,1 */ RTEMS_INLINE_ROUTINE bool _Attributes_Is_system_task( rtems_attribute attribute_set ) { return ( attribute_set & RTEMS_SYSTEM_TASK ) ? true : false; 40011880: 00f7d793 srli a5,a5,0xf thread_config.budget_algorithm = _Modes_Is_timeslice( config->initial_modes ) ? 40011884: 00c12c23 sw a2,24(sp) thread_config.isr_level = _Modes_Get_interrupt_level( config->initial_modes ); 40011888: 02d12223 sw a3,36(sp) thread_config.name.name_u32 = config->name; 4001188c: 02a12023 sw a0,32(sp) return ( attribute_set & RTEMS_FLOATING_POINT ) ? true : false; 40011890: 02b10423 sb a1,40(sp) thread_config.is_preemptible = _Modes_Is_preempt( config->initial_modes ); 40011894: 02e104a3 sb a4,41(sp) if ( !_Attributes_Is_system_task( attributes ) ) { 40011898: 0017f793 andi a5,a5,1 memset( &thread_config, 0, sizeof( thread_config ) ); 4001189c: 00012223 sw zero,4(sp) 400118a0: 00012423 sw zero,8(sp) 400118a4: 00012623 sw zero,12(sp) 400118a8: 00012823 sw zero,16(sp) 400118ac: 00012a23 sw zero,20(sp) 400118b0: 00012e23 sw zero,28(sp) 400118b4: 02012623 sw zero,44(sp) if ( config->initial_priority == PRIORITY_MINIMUM ) { 400118b8: 00442983 lw s3,4(s0) if ( !_Attributes_Is_system_task( attributes ) ) { 400118bc: 00079463 bnez a5,400118c4 <_RTEMS_tasks_Create+0xa8> if ( config->initial_priority == PRIORITY_MINIMUM ) { 400118c0: 0a098a63 beqz s3,40011974 <_RTEMS_tasks_Create+0x158> thread_config.scheduler = 400118c4: 4001e537 lui a0,0x4001e 400118c8: 37050793 addi a5,a0,880 # 4001e370 <_Scheduler_Table> return ( *scheduler->Operations.map_priority )( scheduler, priority ); 400118cc: 01c7a703 lw a4,28(a5) const Scheduler_Control *scheduler, rtems_task_priority priority, bool *valid ) { *valid = ( priority <= scheduler->maximum_priority ); 400118d0: 0447aa03 lw s4,68(a5) 400118d4: 00f12023 sw a5,0(sp) 400118d8: 00098593 mv a1,s3 400118dc: 00000613 li a2,0 400118e0: 37050513 addi a0,a0,880 400118e4: 0407aa83 lw s5,64(a5) 400118e8: 000700e7 jalr a4 thread_config.priority = _RTEMS_Priority_To_core( 400118ec: 00a12823 sw a0,16(sp) 400118f0: 00b12a23 sw a1,20(sp) if ( !valid ) { 400118f4: 060a0e63 beqz s4,40011970 <_RTEMS_tasks_Create+0x154> <== ALWAYS TAKEN _RTEMS_Lock_allocator(); 400118f8: 83df50ef jal ra,40007134 <_RTEMS_Lock_allocator> return ( *information->allocate )( information ); 400118fc: 40020a37 lui s4,0x40020 _Thread_Kill_zombies(); 40011900: a9cf90ef jal ra,4000ab9c <_Thread_Kill_zombies> 40011904: 648a0793 addi a5,s4,1608 # 40020648 <_RTEMS_tasks_Information> 40011908: 0087a783 lw a5,8(a5) 4001190c: 648a0513 addi a0,s4,1608 40011910: 000780e7 jalr a5 40011914: 00050993 mv s3,a0 if ( !the_thread ) { 40011918: 0a050863 beqz a0,400119c8 <_RTEMS_tasks_Create+0x1ac> status = ( *prepare_stack )( &thread_config, config ); 4001191c: 00040593 mv a1,s0 40011920: 00010513 mv a0,sp 40011924: 000900e7 jalr s2 40011928: 00050913 mv s2,a0 if ( status == RTEMS_SUCCESSFUL ) { 4001192c: 04050c63 beqz a0,40011984 <_RTEMS_tasks_Create+0x168> _Objects_Free( 40011930: 0089a503 lw a0,8(s3) 40011934: 885fe0ef jal ra,400101b8 <_Objects_Get_information_id> ( *information->deallocate )( information, the_object ); 40011938: 00c52783 lw a5,12(a0) 4001193c: 00098593 mv a1,s3 40011940: 000780e7 jalr a5 _RTEMS_Unlock_allocator(); 40011944: ffcf50ef jal ra,40007140 <_RTEMS_Unlock_allocator> } 40011948: 04c12083 lw ra,76(sp) 4001194c: 04812403 lw s0,72(sp) 40011950: 04412483 lw s1,68(sp) 40011954: 03c12983 lw s3,60(sp) 40011958: 03812a03 lw s4,56(sp) 4001195c: 03412a83 lw s5,52(sp) 40011960: 00090513 mv a0,s2 40011964: 04012903 lw s2,64(sp) 40011968: 05010113 addi sp,sp,80 4001196c: 00008067 ret if ( !valid ) { 40011970: f93af4e3 bgeu s5,s3,400118f8 <_RTEMS_tasks_Create+0xdc> return RTEMS_INVALID_PRIORITY; 40011974: 01300913 li s2,19 40011978: fd1ff06f j 40011948 <_RTEMS_tasks_Create+0x12c> return RTEMS_INVALID_ADDRESS; 4001197c: 00900913 li s2,9 40011980: fc9ff06f j 40011948 <_RTEMS_tasks_Create+0x12c> ok = _Thread_Initialize( 40011984: 00010613 mv a2,sp 40011988: 00098593 mv a1,s3 4001198c: 648a0513 addi a0,s4,1608 40011990: e60ff0ef jal ra,40010ff0 <_Thread_Initialize> if ( !ok ) { 40011994: 02050663 beqz a0,400119c0 <_RTEMS_tasks_Create+0x1a4> asr->is_enabled = !_Modes_Is_asr_disabled( config->initial_modes ); 40011998: 01842783 lw a5,24(s0) 4001199c: 1949a683 lw a3,404(s3) *id = the_thread->Object.id; 400119a0: 0089a703 lw a4,8(s3) asr->is_enabled = !_Modes_Is_asr_disabled( config->initial_modes ); 400119a4: 00a7d793 srli a5,a5,0xa 400119a8: 0017c793 xori a5,a5,1 400119ac: 0017f793 andi a5,a5,1 400119b0: 00f68423 sb a5,8(a3) *id = the_thread->Object.id; 400119b4: 00e4a023 sw a4,0(s1) 400119b8: f88f50ef jal ra,40007140 <_RTEMS_Unlock_allocator> return RTEMS_SUCCESSFUL; 400119bc: f8dff06f j 40011948 <_RTEMS_tasks_Create+0x12c> status = RTEMS_UNSATISFIED; 400119c0: 00d00913 li s2,13 400119c4: f6dff06f j 40011930 <_RTEMS_tasks_Create+0x114> 400119c8: f78f50ef jal ra,40007140 <_RTEMS_Unlock_allocator> return RTEMS_TOO_MANY; 400119cc: 00500913 li s2,5 400119d0: f79ff06f j 40011948 <_RTEMS_tasks_Create+0x12c> =============================================================================== 40006ee0 <_RTEMS_tasks_Initialize_user_task>: #include #include #include void _RTEMS_tasks_Initialize_user_task( void ) { 40006ee0: fe010113 addi sp,sp,-32 40006ee4: 00812c23 sw s0,24(sp) rtems_id id; rtems_status_code return_value; const rtems_initialization_tasks_table *user_task; user_task = &_RTEMS_tasks_User_task_table; return_value = rtems_task_create( 40006ee8: 4001e437 lui s0,0x4001e 40006eec: 35040413 addi s0,s0,848 # 4001e350 <_RTEMS_tasks_User_task_table> 40006ef0: 00c42703 lw a4,12(s0) 40006ef4: 01442683 lw a3,20(s0) 40006ef8: 00442603 lw a2,4(s0) 40006efc: 00842583 lw a1,8(s0) 40006f00: 00042503 lw a0,0(s0) 40006f04: 00c10793 addi a5,sp,12 { 40006f08: 00112e23 sw ra,28(sp) return_value = rtems_task_create( 40006f0c: 26d080ef jal ra,4000f978 user_task->stack_size, user_task->mode_set, user_task->attribute_set, &id ); if ( !rtems_is_status_successful( return_value ) ) { 40006f10: 02051663 bnez a0,40006f3c <_RTEMS_tasks_Initialize_user_task+0x5c><== NEVER TAKEN _Internal_error( INTERNAL_ERROR_RTEMS_INIT_TASK_CREATE_FAILED ); } return_value = rtems_task_start( 40006f14: 01842603 lw a2,24(s0) 40006f18: 01042583 lw a1,16(s0) 40006f1c: 00c12503 lw a0,12(sp) 40006f20: 024000ef jal ra,40006f44 ); _Assert( rtems_is_status_successful( return_value ) ); (void) return_value; _Assert( _Thread_Global_constructor == 0 ); _Thread_Global_constructor = id; 40006f24: 00c12703 lw a4,12(sp) } 40006f28: 01c12083 lw ra,28(sp) 40006f2c: 01812403 lw s0,24(sp) _Thread_Global_constructor = id; 40006f30: 92e1ac23 sw a4,-1736(gp) # 40020d78 <_Thread_Global_constructor> } 40006f34: 02010113 addi sp,sp,32 40006f38: 00008067 ret _Internal_error( INTERNAL_ERROR_RTEMS_INIT_TASK_CREATE_FAILED ); 40006f3c: 02000513 li a0,32 40006f40: 279000ef jal ra,400079b8 <_Internal_error> <== NOT EXECUTED =============================================================================== 4000d5f8 <_Signal_Action_handler>: void _Signal_Action_handler( Thread_Control *executing, Thread_Action *action, ISR_lock_Context *lock_context ) { 4000d5f8: fe010113 addi sp,sp,-32 4000d5fc: 00812c23 sw s0,24(sp) /* * Signal Processing */ api = executing->API_Extensions[ THREAD_API_RTEMS ]; 4000d600: 19452403 lw s0,404(a0) { 4000d604: 00912a23 sw s1,20(sp) 4000d608: 00112e23 sw ra,28(sp) 4000d60c: 01212823 sw s2,16(sp) ASR_Information *asr ) { rtems_signal_set signal_set; signal_set = asr->signals_posted; 4000d610: 01442483 lw s1,20(s0) asr->signals_posted = 0; 4000d614: 00042a23 sw zero,20(s0) 4000d618: 00062783 lw a5,0(a2) 4000d61c: 3007a073 csrs mstatus,a5 asr = &api->Signal; signal_set = _ASR_Get_posted_signals( asr ); _Thread_State_release( executing, lock_context ); if ( signal_set == 0 ) { 4000d620: 04048663 beqz s1,4000d66c <_Signal_Action_handler+0x74> <== NEVER TAKEN return; } asr->nest_level += 1; 4000d624: 01c42783 lw a5,28(s0) rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4000d628: 01042503 lw a0,16(s0) 4000d62c: 00010937 lui s2,0x10 asr->nest_level += 1; 4000d630: 00178793 addi a5,a5,1 rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4000d634: 00c10613 addi a2,sp,12 4000d638: fff90593 addi a1,s2,-1 # ffff asr->nest_level += 1; 4000d63c: 00f42e23 sw a5,28(s0) rtems_task_mode( asr->mode_set, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4000d640: ef4f90ef jal ra,40006d34 (*asr->handler)( signal_set ); 4000d644: 00c42783 lw a5,12(s0) 4000d648: 00048513 mv a0,s1 4000d64c: 000780e7 jalr a5 asr->nest_level -= 1; 4000d650: 01c42783 lw a5,28(s0) rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4000d654: 00c12503 lw a0,12(sp) 4000d658: 00c10613 addi a2,sp,12 asr->nest_level -= 1; 4000d65c: fff78793 addi a5,a5,-1 4000d660: 00f42e23 sw a5,28(s0) rtems_task_mode( prev_mode, RTEMS_ALL_MODE_MASKS, &prev_mode ); 4000d664: fff90593 addi a1,s2,-1 4000d668: eccf90ef jal ra,40006d34 } 4000d66c: 01c12083 lw ra,28(sp) 4000d670: 01812403 lw s0,24(sp) 4000d674: 01412483 lw s1,20(sp) 4000d678: 01012903 lw s2,16(sp) 4000d67c: 02010113 addi sp,sp,32 4000d680: 00008067 ret =============================================================================== 40004440 <_TOD_Validate>: ) { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / 40004440: 8181a683 lw a3,-2024(gp) # 40014408 <_Watchdog_Microseconds_per_tick> 40004444: 000f4737 lui a4,0xf4 40004448: 24070713 addi a4,a4,576 # f4240 4000444c: 02d75733 divu a4,a4,a3 { 40004450: 00050793 mv a5,a0 rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 40004454: 08050663 beqz a0,400044e0 <_TOD_Validate+0xa0> <== NEVER TAKEN 40004458: 01852683 lw a3,24(a0) (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; 4000445c: 00000513 li a0,0 if ((!the_tod) || 40004460: 08e6f263 bgeu a3,a4,400044e4 <_TOD_Validate+0xa4> (the_tod->ticks >= ticks_per_second) || 40004464: 0147a683 lw a3,20(a5) 40004468: 03b00713 li a4,59 4000446c: 06d76c63 bltu a4,a3,400044e4 <_TOD_Validate+0xa4> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || 40004470: 0107a683 lw a3,16(a5) 40004474: 06d76863 bltu a4,a3,400044e4 <_TOD_Validate+0xa4> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || 40004478: 00c7a683 lw a3,12(a5) 4000447c: 01700713 li a4,23 40004480: 06d76263 bltu a4,a3,400044e4 <_TOD_Validate+0xa4> (the_tod->month == 0) || 40004484: 0047a703 lw a4,4(a5) (the_tod->hour >= TOD_HOURS_PER_DAY) || 40004488: 00b00693 li a3,11 4000448c: fff70613 addi a2,a4,-1 40004490: 04c6ea63 bltu a3,a2,400044e4 <_TOD_Validate+0xa4> (the_tod->year < TOD_BASE_YEAR) || 40004494: 0007a683 lw a3,0(a5) (the_tod->month > TOD_MONTHS_PER_YEAR) || 40004498: 7c300613 li a2,1987 4000449c: 04d67463 bgeu a2,a3,400044e4 <_TOD_Validate+0xa4> (the_tod->day == 0) ) 400044a0: 0087a783 lw a5,8(a5) (the_tod->year < TOD_BASE_YEAR) || 400044a4: 04078063 beqz a5,400044e4 <_TOD_Validate+0xa4> <== NEVER TAKEN if (((the_tod->year % 4) == 0 && (the_tod->year % 100 != 0)) || 400044a8: 0036f613 andi a2,a3,3 400044ac: 02061e63 bnez a2,400044e8 <_TOD_Validate+0xa8> 400044b0: 06400613 li a2,100 400044b4: 02c6f633 remu a2,a3,a2 400044b8: 02060863 beqz a2,400044e8 <_TOD_Validate+0xa8> (the_tod->year % 400 == 0)) days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; 400044bc: 00d70713 addi a4,a4,13 else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; 400044c0: 400126b7 lui a3,0x40012 400044c4: 5c068693 addi a3,a3,1472 # 400125c0 <_TOD_Days_per_month> 400044c8: 00271713 slli a4,a4,0x2 400044cc: 00e68733 add a4,a3,a4 400044d0: 00072503 lw a0,0(a4) if ( the_tod->day > days_in_month ) 400044d4: 00f53533 sltu a0,a0,a5 400044d8: 00154513 xori a0,a0,1 400044dc: 00008067 ret return false; 400044e0: 00000513 li a0,0 <== NOT EXECUTED return false; return true; } 400044e4: 00008067 ret 400044e8: 19000613 li a2,400 400044ec: 02c6f6b3 remu a3,a3,a2 if (((the_tod->year % 4) == 0 && (the_tod->year % 100 != 0)) || 400044f0: fc0698e3 bnez a3,400044c0 <_TOD_Validate+0x80> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; 400044f4: 00d70713 addi a4,a4,13 400044f8: fc9ff06f j 400044c0 <_TOD_Validate+0x80> =============================================================================== 40003aac <_Timer_Cancel>: return RB_COLOR( &the_watchdog->Node.RBTree, Node ); 40003aac: 01c5a703 lw a4,28(a1) <== NOT EXECUTED if ( _Watchdog_Is_scheduled( &the_timer->Ticker ) ) { 40003ab0: 00100693 li a3,1 <== NOT EXECUTED the_class = the_timer->the_class; 40003ab4: 0305a783 lw a5,48(a1) <== NOT EXECUTED if ( _Watchdog_Is_scheduled( &the_timer->Ticker ) ) { 40003ab8: 02e6fe63 bgeu a3,a4,40003af4 <_Timer_Cancel+0x48> <== NOT EXECUTED return ( the_class & mask ) == mask; 40003abc: 0067f793 andi a5,a5,6 <== NOT EXECUTED } else if ( _Timer_Is_on_task_class( the_class ) ) { 40003ac0: 00600693 li a3,6 <== NOT EXECUTED 40003ac4: 00d78463 beq a5,a3,40003acc <_Timer_Cancel+0x20> <== NOT EXECUTED } 40003ac8: 00008067 ret <== NOT EXECUTED timer_server = _Timer_server; 40003acc: 8bc1a783 lw a5,-1860(gp) # 40010d54 <_Timer_server> <== NOT EXECUTED if ( _Watchdog_Get_state( &the_timer->Ticker ) == WATCHDOG_PENDING ) { 40003ad0: 00300793 li a5,3 <== NOT EXECUTED 40003ad4: fef71ae3 bne a4,a5,40003ac8 <_Timer_Cancel+0x1c> <== NOT EXECUTED next = the_node->next; 40003ad8: 0105a703 lw a4,16(a1) <== NOT EXECUTED previous = the_node->previous; 40003adc: 0145a783 lw a5,20(a1) <== NOT EXECUTED RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state; 40003ae0: 00200693 li a3,2 <== NOT EXECUTED 40003ae4: 00d5ae23 sw a3,28(a1) <== NOT EXECUTED next->previous = previous; 40003ae8: 00f72223 sw a5,4(a4) <== NOT EXECUTED previous->next = next; 40003aec: 00e7a023 sw a4,0(a5) <== NOT EXECUTED } 40003af0: 00008067 ret <== NOT EXECUTED return (Watchdog_Interval) cpu->Watchdog.ticks; 40003af4: 04852703 lw a4,72(a0) <== NOT EXECUTED return ( the_class & TIMER_CLASS_BIT_TIME_OF_DAY ); 40003af8: 0017f793 andi a5,a5,1 <== NOT EXECUTED _Watchdog_Remove( 40003afc: 00a78793 addi a5,a5,10 <== NOT EXECUTED 40003b00: 00379793 slli a5,a5,0x3 <== NOT EXECUTED return (Watchdog_Interval) cpu->Watchdog.ticks; 40003b04: 04e5a223 sw a4,68(a1) <== NOT EXECUTED 40003b08: 00f50533 add a0,a0,a5 <== NOT EXECUTED 40003b0c: 01058593 addi a1,a1,16 <== NOT EXECUTED 40003b10: 5540306f j 40007064 <_Watchdog_Remove> <== NOT EXECUTED =============================================================================== 40004134 : uint32_t day_secs; uint32_t year; uint32_t year_days; uint32_t leap_years; if ( !time_buffer ) 40004134: 1a050c63 beqz a0,400042ec return RTEMS_INVALID_ADDRESS; if ( !_TOD_Is_set() ) 40004138: 8d01c783 lbu a5,-1840(gp) # 400144c0 <_TOD> { 4000413c: fd010113 addi sp,sp,-48 40004140: 02912223 sw s1,36(sp) 40004144: 02112623 sw ra,44(sp) 40004148: 02812423 sw s0,40(sp) 4000414c: 03212023 sw s2,32(sp) 40004150: 01312e23 sw s3,28(sp) 40004154: 00050493 mv s1,a0 return RTEMS_NOT_DEFINED; 40004158: 00b00513 li a0,11 if ( !_TOD_Is_set() ) 4000415c: 12078663 beqz a5,40004288 */ RTEMS_INLINE_ROUTINE void _TOD_Get_timeval( struct timeval *time ) { _Timecounter_Microtime( time ); 40004160: 00010513 mv a0,sp 40004164: 59c010ef jal ra,40005700 <_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; 40004168: 00012903 lw s2,0(sp) 4000416c: 00412983 lw s3,4(sp) 40004170: 00015637 lui a2,0x15 40004174: 18060613 addi a2,a2,384 # 15180 40004178: 00000693 li a3,0 4000417c: 00090513 mv a0,s2 40004180: 00098593 mv a1,s3 40004184: 5540a0ef jal ra,4000e6d8 <__divdi3> day_secs = now.tv_sec % RTEMS_SECS_PER_DAY; 40004188: 00015637 lui a2,0x15 days = now.tv_sec / RTEMS_SECS_PER_DAY; 4000418c: 00050413 mv s0,a0 day_secs = now.tv_sec % RTEMS_SECS_PER_DAY; 40004190: 18060613 addi a2,a2,384 # 15180 40004194: 00000693 li a3,0 40004198: 00090513 mv a0,s2 4000419c: 00098593 mv a1,s3 400041a0: 2250a0ef jal ra,4000ebc4 <__moddi3> /* How many non-leap year years ? */ year = ( days / RTEMS_DAYS_PER_YEAR ) + RTEMS_YEAR_BASE; 400041a4: 16d00613 li a2,365 400041a8: 02c45333 divu t1,s0,a2 return (year / 4) - (year / 100) + (year / 400); 400041ac: 19000593 li a1,400 400041b0: 06400893 li a7,100 day_secs = now.tv_sec % RTEMS_SECS_PER_DAY; 400041b4: 00050813 mv a6,a0 year -= 1; 400041b8: 7b130793 addi a5,t1,1969 return (year / 4) - (year / 100) + (year / 400); 400041bc: 02b7d733 divu a4,a5,a1 400041c0: 0027d693 srli a3,a5,0x2 400041c4: 0317d533 divu a0,a5,a7 400041c8: 00e686b3 add a3,a3,a4 400041cc: e2368693 addi a3,a3,-477 /* Adjust the remaining number of days based on the leap years. */ year_days = ( days - leap_years ) % RTEMS_DAYS_PER_YEAR; /* Adjust the year and days in the year if in the leap year overflow. */ if ( leap_years > ( days % RTEMS_DAYS_PER_YEAR ) ) { 400041d0: 02c47e33 remu t3,s0,a2 year_days = ( days - leap_years ) % RTEMS_DAYS_PER_YEAR; 400041d4: 00a40733 add a4,s0,a0 400041d8: 40d70733 sub a4,a4,a3 return _Leap_years_before( to ) - _Leap_years_before( from + 1 ); 400041dc: 40a686b3 sub a3,a3,a0 year_days = ( days - leap_years ) % RTEMS_DAYS_PER_YEAR; 400041e0: 02c77733 remu a4,a4,a2 if ( leap_years > ( days % RTEMS_DAYS_PER_YEAR ) ) { 400041e4: 0cde6063 bltu t3,a3,400042a4 year = ( days / RTEMS_DAYS_PER_YEAR ) + RTEMS_YEAR_BASE; 400041e8: 7b230793 addi a5,t1,1970 return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); 400041ec: 0037f693 andi a3,a5,3 if ( _Leap_year( year ) ) { year_days += 1; } } time_buffer->year = year; 400041f0: 00f4a023 sw a5,0(s1) return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); 400041f4: 00069863 bnez a3,40004204 400041f8: 06400693 li a3,100 400041fc: 02d7f6b3 remu a3,a5,a3 40004200: 00069863 bnez a3,40004210 40004204: 19000693 li a3,400 40004208: 02d7f7b3 remu a5,a5,a3 4000420c: 0c079663 bnez a5,400042d8 days_to_date = _TOD_Days_to_date[1]; 40004210: 400127b7 lui a5,0x40012 40004214: 5a678793 addi a5,a5,1446 # 400125a6 <_TOD_Days_to_date+0x1a> days_to_date += 2; 40004218: 00478793 addi a5,a5,4 uint32_t month = 0; 4000421c: 00000693 li a3,0 while (month < 11) { 40004220: 00b00593 li a1,11 if (*day < *days_to_date) 40004224: 0007d603 lhu a2,0(a5) ++month; 40004228: 00168693 addi a3,a3,1 if (*day < *days_to_date) 4000422c: 08c76c63 bltu a4,a2,400042c4 ++days_to_date; 40004230: 00278793 addi a5,a5,2 while (month < 11) { 40004234: feb698e3 bne a3,a1,40004224 40004238: 00c00693 li a3,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; 4000423c: 000017b7 lui a5,0x1 40004240: e1078793 addi a5,a5,-496 # e10 time_buffer->minute = day_secs % RTEMS_SECS_PER_HOUR; 40004244: 02f875b3 remu a1,a6,a5 time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE; 40004248: 03c00893 li a7,60 time_buffer->day = year_days + 1; 4000424c: 00170713 addi a4,a4,1 40004250: 40c70633 sub a2,a4,a2 time_buffer->month = _Year_day_as_month( year, &year_days ) + 1; 40004254: 00d4a223 sw a3,4(s1) time_buffer->day = year_days + 1; 40004258: 00c4a423 sw a2,8(s1) time_buffer->minute = time_buffer->minute / RTEMS_SECS_PER_MINUTE; time_buffer->ticks = now.tv_usec / rtems_configuration_get_microseconds_per_tick( ); return RTEMS_SUCCESSFUL; 4000425c: 00000513 li a0,0 time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE; 40004260: 0315f733 remu a4,a1,a7 time_buffer->hour = day_secs / RTEMS_SECS_PER_HOUR; 40004264: 02f857b3 divu a5,a6,a5 time_buffer->second = time_buffer->minute % RTEMS_SECS_PER_MINUTE; 40004268: 00e4aa23 sw a4,20(s1) time_buffer->ticks = now.tv_usec / 4000426c: 8181a703 lw a4,-2024(gp) # 40014408 <_Watchdog_Microseconds_per_tick> time_buffer->hour = day_secs / RTEMS_SECS_PER_HOUR; 40004270: 00f4a623 sw a5,12(s1) time_buffer->ticks = now.tv_usec / 40004274: 00812783 lw a5,8(sp) time_buffer->minute = time_buffer->minute / RTEMS_SECS_PER_MINUTE; 40004278: 0315d5b3 divu a1,a1,a7 time_buffer->ticks = now.tv_usec / 4000427c: 02e7d7b3 divu a5,a5,a4 time_buffer->minute = time_buffer->minute / RTEMS_SECS_PER_MINUTE; 40004280: 00b4a823 sw a1,16(s1) time_buffer->ticks = now.tv_usec / 40004284: 00f4ac23 sw a5,24(s1) } 40004288: 02c12083 lw ra,44(sp) 4000428c: 02812403 lw s0,40(sp) 40004290: 02412483 lw s1,36(sp) 40004294: 02012903 lw s2,32(sp) 40004298: 01c12983 lw s3,28(sp) 4000429c: 03010113 addi sp,sp,48 400042a0: 00008067 ret return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); 400042a4: 0037f693 andi a3,a5,3 400042a8: 02069263 bnez a3,400042cc 400042ac: 0317f8b3 remu a7,a5,a7 400042b0: 02089a63 bnez a7,400042e4 400042b4: 02b7f5b3 remu a1,a5,a1 400042b8: 02058663 beqz a1,400042e4 time_buffer->year = year; 400042bc: 00f4a023 sw a5,0(s1) return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); 400042c0: f39ff06f j 400041f8 *day -= *(days_to_date - 1); 400042c4: ffe7d603 lhu a2,-2(a5) 400042c8: f75ff06f j 4000423c time_buffer->year = year; 400042cc: 02b7f5b3 remu a1,a5,a1 return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); 400042d0: 00058a63 beqz a1,400042e4 <== NEVER TAKEN time_buffer->year = year; 400042d4: 00f4a023 sw a5,0(s1) days_to_date = _TOD_Days_to_date[0]; 400042d8: 400127b7 lui a5,0x40012 400042dc: 58c78793 addi a5,a5,1420 # 4001258c <_TOD_Days_to_date> 400042e0: f39ff06f j 40004218 year_days += 1; 400042e4: 00170713 addi a4,a4,1 400042e8: f09ff06f j 400041f0 return RTEMS_INVALID_ADDRESS; 400042ec: 00900513 li a0,9 } 400042f0: 00008067 ret =============================================================================== 40004488 : #include #include #include rtems_status_code rtems_clock_tick( void ) { 40004488: fe010113 addi sp,sp,-32 4000448c: 00112e23 sw ra,28(sp) __asm__ volatile ( 40004490: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40004494: 0087f793 andi a5,a5,8 ISR_lock_Context lock_context; _Timecounter_Acquire( &lock_context ); 40004498: 00f12623 sw a5,12(sp) _Timecounter_Tick_simple( 4000449c: 8181a503 lw a0,-2024(gp) # 40013748 <_Watchdog_Microseconds_per_tick> 400044a0: 00c10613 addi a2,sp,12 400044a4: 00000593 li a1,0 400044a8: 269010ef jal ra,40005f10 <_Timecounter_Tick_simple> 400044ac: 400157b7 lui a5,0x40015 400044b0: 3c078793 addi a5,a5,960 # 400153c0 <_Per_CPU_Information> 400044b4: 0307a783 lw a5,48(a5) rtems_configuration_get_microseconds_per_tick(), 0, &lock_context ); if ( _Thread_Dispatch_is_enabled() ) { 400044b8: 00078a63 beqz a5,400044cc <== ALWAYS TAKEN _Thread_Dispatch(); } return RTEMS_SUCCESSFUL; } 400044bc: 01c12083 lw ra,28(sp) <== NOT EXECUTED 400044c0: 00000513 li a0,0 <== NOT EXECUTED 400044c4: 02010113 addi sp,sp,32 <== NOT EXECUTED 400044c8: 00008067 ret <== NOT EXECUTED _Thread_Dispatch(); 400044cc: 0e9020ef jal ra,40006db4 <_Thread_Dispatch> } 400044d0: 01c12083 lw ra,28(sp) 400044d4: 00000513 li a0,0 400044d8: 02010113 addi sp,sp,32 400044dc: 00008067 ret =============================================================================== 40004950 : int i; /* * Validate parameters and look up information structure. */ if ( !info ) 40004950: 08060a63 beqz a2,400049e4 return RTEMS_INVALID_ADDRESS; obj_info = _Objects_Get_information( the_api, the_class ); 40004954: 01059593 slli a1,a1,0x10 { 40004958: ff010113 addi sp,sp,-16 obj_info = _Objects_Get_information( the_api, the_class ); 4000495c: 0105d593 srli a1,a1,0x10 { 40004960: 00812423 sw s0,8(sp) 40004964: 00112623 sw ra,12(sp) 40004968: 00060413 mv s0,a2 obj_info = _Objects_Get_information( the_api, the_class ); 4000496c: 360010ef jal ra,40005ccc <_Objects_Get_information> if ( !obj_info ) 40004970: 06050e63 beqz a0,400049ec return RTEMS_INVALID_NUMBER; /* * Return information about this object class to the user. */ info->minimum_id = _Objects_Get_minimum_id( obj_info->maximum_id ); 40004974: 00052603 lw a2,0(a0) */ RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Is_auto_extend( const Objects_Information *information ) { return information->objects_per_block != 0; 40004978: 01255703 lhu a4,18(a0) id &= ~OBJECTS_INDEX_MASK; 4000497c: ffff07b7 lui a5,0xffff0 40004980: 00f677b3 and a5,a2,a5 return id; 40004984: 01061693 slli a3,a2,0x10 id += (Objects_Id) OBJECTS_INDEX_MINIMUM << OBJECTS_INDEX_START_BIT; 40004988: 00178793 addi a5,a5,1 # ffff0001 return information->objects_per_block != 0; 4000498c: 00e03733 snez a4,a4 40004990: 0106d693 srli a3,a3,0x10 40004994: 00f42023 sw a5,0(s0) info->maximum_id = obj_info->maximum_id; 40004998: 00c42223 sw a2,4(s0) 4000499c: 00e40623 sb a4,12(s0) info->auto_extend = _Objects_Is_auto_extend( obj_info ); info->maximum = _Objects_Get_maximum_index( obj_info ); 400049a0: 00d42423 sw a3,8(s0) for ( unallocated=0, i=1 ; i <= info->maximum ; i++ ) 400049a4: 02068463 beqz a3,400049cc <== NEVER TAKEN 400049a8: 00452783 lw a5,4(a0) 400049ac: 00269593 slli a1,a3,0x2 400049b0: 00000693 li a3,0 400049b4: 00f585b3 add a1,a1,a5 if ( !obj_info->local_table[i] ) 400049b8: 0047a703 lw a4,4(a5) for ( unallocated=0, i=1 ; i <= info->maximum ; i++ ) 400049bc: 00478793 addi a5,a5,4 unallocated++; 400049c0: 00173713 seqz a4,a4 400049c4: 00e686b3 add a3,a3,a4 for ( unallocated=0, i=1 ; i <= info->maximum ; i++ ) 400049c8: feb798e3 bne a5,a1,400049b8 info->unallocated = unallocated; 400049cc: 00d42823 sw a3,16(s0) return RTEMS_SUCCESSFUL; 400049d0: 00000513 li a0,0 } 400049d4: 00c12083 lw ra,12(sp) 400049d8: 00812403 lw s0,8(sp) 400049dc: 01010113 addi sp,sp,16 400049e0: 00008067 ret return RTEMS_INVALID_ADDRESS; 400049e4: 00900513 li a0,9 } 400049e8: 00008067 ret return RTEMS_INVALID_NUMBER; 400049ec: 00a00513 li a0,10 400049f0: fe5ff06f j 400049d4 =============================================================================== 4000364c : Objects_Information *information; Objects_Control *the_object; Objects_Id tmpId; Status_Control status; if ( !name ) 4000364c: 0a058863 beqz a1,400036fc { 40003650: ff010113 addi sp,sp,-16 40003654: 00812423 sw s0,8(sp) 40003658: 01212023 sw s2,0(sp) 4000365c: 00112623 sw ra,12(sp) 40003660: 00912223 sw s1,4(sp) 40003664: 00058913 mv s2,a1 40003668: 00050413 mv s0,a0 return RTEMS_INVALID_ADDRESS; tmpId = (id == OBJECTS_ID_OF_SELF) ? rtems_task_self() : id; 4000366c: 04050e63 beqz a0,400036c8 information = _Objects_Get_information_id( tmpId ); 40003670: 00040513 mv a0,s0 40003674: 345000ef jal ra,400041b8 <_Objects_Get_information_id> 40003678: 00050493 mv s1,a0 if ( !information ) 4000367c: 06050263 beqz a0,400036e0 * * @see _Objects_Allocator_unlock() and _Objects_Allocate(). */ RTEMS_INLINE_ROUTINE void _Objects_Allocator_lock( void ) { _RTEMS_Lock_allocator(); 40003680: 204000ef jal ra,40003884 <_RTEMS_Lock_allocator> return RTEMS_INVALID_ID; _Objects_Allocator_lock(); the_object = _Objects_Get_no_protection( tmpId, information ); 40003684: 00048593 mv a1,s1 40003688: 00040513 mv a0,s0 4000368c: 4fd000ef jal ra,40004388 <_Objects_Get_no_protection> 40003690: 00050593 mv a1,a0 if ( the_object == NULL ) { 40003694: 06050863 beqz a0,40003704 _Objects_Allocator_unlock(); return RTEMS_INVALID_ID; } status = _Objects_Set_name( information, the_object, name ); 40003698: 00090613 mv a2,s2 4000369c: 00048513 mv a0,s1 400036a0: 525000ef jal ra,400043c4 <_Objects_Set_name> 400036a4: 00050413 mv s0,a0 * 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(); 400036a8: 1e8000ef jal ra,40003890 <_RTEMS_Unlock_allocator> _Objects_Allocator_unlock(); return STATUS_GET_CLASSIC( status ); 400036ac: 0ff47513 andi a0,s0,255 } 400036b0: 00c12083 lw ra,12(sp) 400036b4: 00812403 lw s0,8(sp) 400036b8: 00412483 lw s1,4(sp) 400036bc: 00012903 lw s2,0(sp) 400036c0: 01010113 addi sp,sp,16 400036c4: 00008067 ret tmpId = (id == OBJECTS_ID_OF_SELF) ? rtems_task_self() : id; 400036c8: 0cc000ef jal ra,40003794 400036cc: 00050413 mv s0,a0 information = _Objects_Get_information_id( tmpId ); 400036d0: 00040513 mv a0,s0 400036d4: 2e5000ef jal ra,400041b8 <_Objects_Get_information_id> 400036d8: 00050493 mv s1,a0 if ( !information ) 400036dc: fa0512e3 bnez a0,40003680 <== ALWAYS TAKEN } 400036e0: 00c12083 lw ra,12(sp) 400036e4: 00812403 lw s0,8(sp) 400036e8: 00412483 lw s1,4(sp) 400036ec: 00012903 lw s2,0(sp) return RTEMS_INVALID_ID; 400036f0: 00400513 li a0,4 } 400036f4: 01010113 addi sp,sp,16 400036f8: 00008067 ret return RTEMS_INVALID_ADDRESS; 400036fc: 00900513 li a0,9 } 40003700: 00008067 ret 40003704: 18c000ef jal ra,40003890 <_RTEMS_Unlock_allocator> return RTEMS_INVALID_ID; 40003708: 00400513 li a0,4 4000370c: fa5ff06f j 400036b0 =============================================================================== 4000f570 : { 4000f570: fd010113 addi sp,sp,-48 4000f574: 03212023 sw s2,32(sp) 4000f578: 02112623 sw ra,44(sp) 4000f57c: 02812423 sw s0,40(sp) 4000f580: 02912223 sw s1,36(sp) 4000f584: 01312e23 sw s3,28(sp) 4000f588: 01412c23 sw s4,24(sp) 4000f58c: 01512a23 sw s5,20(sp) 4000f590: 00e12223 sw a4,4(sp) return RTEMS_INVALID_NAME; 4000f594: 00300913 li s2,3 if ( !rtems_is_name_valid( name ) ) { 4000f598: 0a050863 beqz a0,4000f648 4000f59c: 00078a93 mv s5,a5 if ( id == NULL ) { 4000f5a0: 0c078863 beqz a5,4000f670 <== NEVER TAKEN if ( starting_address == NULL ) { 4000f5a4: 0c058663 beqz a1,4000f670 4000f5a8: 00060413 mv s0,a2 return RTEMS_INVALID_SIZE; 4000f5ac: 00800913 li s2,8 if ( length == 0 ) 4000f5b0: 08060c63 beqz a2,4000f648 if ( buffer_size == 0 ) 4000f5b4: 00700613 li a2,7 4000f5b8: 08d67863 bgeu a2,a3,4000f648 if ( length < buffer_size ) 4000f5bc: 08d46663 bltu s0,a3,4000f648 if ( buffer_size % CPU_SIZEOF_POINTER != 0 ) { 4000f5c0: 0036f613 andi a2,a3,3 4000f5c4: 00d12423 sw a3,8(sp) 4000f5c8: 08061063 bnez a2,4000f648 <== NEVER TAKEN if ( (uintptr_t) starting_address % CPU_SIZEOF_POINTER != 0 ) { 4000f5cc: 0035f913 andi s2,a1,3 4000f5d0: 00b12623 sw a1,12(sp) 4000f5d4: 08091e63 bnez s2,4000f670 return (Partition_Control *) _Objects_Allocate( &_Partition_Information ); 4000f5d8: 4003ea37 lui s4,0x4003e 4000f5dc: 00050493 mv s1,a0 4000f5e0: 310a0513 addi a0,s4,784 # 4003e310 <_Partition_Information> 4000f5e4: 7dc020ef jal ra,40011dc0 <_Objects_Allocate> if ( !the_partition ) { 4000f5e8: 00c12583 lw a1,12(sp) 4000f5ec: 00812683 lw a3,8(sp) 4000f5f0: 00412703 lw a4,4(sp) return (Partition_Control *) _Objects_Allocate( &_Partition_Information ); 4000f5f4: 00050993 mv s3,a0 if ( !the_partition ) { 4000f5f8: 08050063 beqz a0,4000f678 _Chain_Initialize( 4000f5fc: 02d45633 divu a2,s0,a3 the_partition->buffer_size = buffer_size; 4000f600: 00d52c23 sw a3,24(a0) the_partition->attribute_set = attribute_set; 4000f604: 00e52e23 sw a4,28(a0) the_partition->starting_address = starting_address; 4000f608: 00b52823 sw a1,16(a0) the_partition->length = length; 4000f60c: 00852a23 sw s0,20(a0) the_partition->number_of_used_blocks = 0; 4000f610: 02052023 sw zero,32(a0) _Chain_Initialize( 4000f614: 02450513 addi a0,a0,36 information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 4000f618: 310a0a13 addi s4,s4,784 4000f61c: 669000ef jal ra,40010484 <_Chain_Initialize> _Objects_Get_index( the_object->id ), 4000f620: 0089a603 lw a2,8(s3) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 4000f624: 004a2703 lw a4,4(s4) the_object->name = name; 4000f628: 0099a623 sw s1,12(s3) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 4000f62c: 01061693 slli a3,a2,0x10 4000f630: 0106d693 srli a3,a3,0x10 4000f634: 00269693 slli a3,a3,0x2 4000f638: 00d70733 add a4,a4,a3 4000f63c: ff372e23 sw s3,-4(a4) *id = the_partition->Object.id; 4000f640: 00caa023 sw a2,0(s5) _RTEMS_Unlock_allocator(); 4000f644: 5a1000ef jal ra,400103e4 <_RTEMS_Unlock_allocator> } 4000f648: 02c12083 lw ra,44(sp) 4000f64c: 02812403 lw s0,40(sp) 4000f650: 02412483 lw s1,36(sp) 4000f654: 01c12983 lw s3,28(sp) 4000f658: 01812a03 lw s4,24(sp) 4000f65c: 01412a83 lw s5,20(sp) 4000f660: 00090513 mv a0,s2 4000f664: 02012903 lw s2,32(sp) 4000f668: 03010113 addi sp,sp,48 4000f66c: 00008067 ret return RTEMS_INVALID_ADDRESS; 4000f670: 00900913 li s2,9 4000f674: fd5ff06f j 4000f648 4000f678: 56d000ef jal ra,400103e4 <_RTEMS_Unlock_allocator> return RTEMS_TOO_MANY; 4000f67c: 00500913 li s2,5 4000f680: fc9ff06f j 4000f648 =============================================================================== 40003a1c : rtems_id id, void *segment, uintptr_t size, uintptr_t *old_size ) { 40003a1c: fd010113 addi sp,sp,-48 40003a20: 02112623 sw ra,44(sp) 40003a24: 02812423 sw s0,40(sp) 40003a28: 02912223 sw s1,36(sp) 40003a2c: 03212023 sw s2,32(sp) 40003a30: 01312e23 sw s3,28(sp) 40003a34: 01412c23 sw s4,24(sp) uintptr_t osize; rtems_status_code status; Heap_Resize_status resize_status; Region_Control *the_region; if ( old_size == NULL ) { 40003a38: 0a068063 beqz a3,40003ad8 40003a3c: 00068493 mv s1,a3 40003a40: 00050413 mv s0,a0 40003a44: 00058993 mv s3,a1 40003a48: 00060a13 mv s4,a2 _RTEMS_Lock_allocator(); 40003a4c: 45c000ef jal ra,40003ea8 <_RTEMS_Lock_allocator> _Objects_Get_no_protection( id, &_Region_Information ); 40003a50: 400125b7 lui a1,0x40012 40003a54: 8fc58593 addi a1,a1,-1796 # 400118fc <_Region_Information> 40003a58: 00040513 mv a0,s0 40003a5c: 7cc010ef jal ra,40005228 <_Objects_Get_no_protection> 40003a60: 00050913 mv s2,a0 if ( the_region != NULL ) { 40003a64: 06050e63 beqz a0,40003ae0 if ( the_region == NULL ) { return RTEMS_INVALID_ID; } resize_status = _Heap_Resize_block( 40003a68: 00810713 addi a4,sp,8 40003a6c: 00c10693 addi a3,sp,12 40003a70: 000a0613 mv a2,s4 40003a74: 00098593 mv a1,s3 40003a78: 02850513 addi a0,a0,40 40003a7c: 4f9000ef jal ra,40004774 <_Heap_Resize_block> segment, (uint32_t) size, &osize, &avail_size ); *old_size = (uint32_t) osize; 40003a80: 00c12783 lw a5,12(sp) resize_status = _Heap_Resize_block( 40003a84: 00050413 mv s0,a0 *old_size = (uint32_t) osize; 40003a88: 00f4a023 sw a5,0(s1) switch ( resize_status ) { 40003a8c: 04050063 beqz a0,40003acc 40003a90: 00100793 li a5,1 40003a94: 02f51863 bne a0,a5,40003ac4 /* Unlocks allocator */ _Region_Process_queue( the_region ); return RTEMS_SUCCESSFUL; case HEAP_RESIZE_UNSATISFIED: status = RTEMS_UNSATISFIED; 40003a98: 00d00413 li s0,13 <== NOT EXECUTED _RTEMS_Unlock_allocator(); 40003a9c: 418000ef jal ra,40003eb4 <_RTEMS_Unlock_allocator> break; } _Region_Unlock( the_region ); return status; } 40003aa0: 02c12083 lw ra,44(sp) 40003aa4: 00040513 mv a0,s0 40003aa8: 02812403 lw s0,40(sp) 40003aac: 02412483 lw s1,36(sp) 40003ab0: 02012903 lw s2,32(sp) 40003ab4: 01c12983 lw s3,28(sp) 40003ab8: 01812a03 lw s4,24(sp) 40003abc: 03010113 addi sp,sp,48 40003ac0: 00008067 ret switch ( resize_status ) { 40003ac4: 00900413 li s0,9 40003ac8: fd5ff06f j 40003a9c _Region_Process_queue( the_region ); 40003acc: 00090513 mv a0,s2 40003ad0: 424050ef jal ra,40008ef4 <_Region_Process_queue> return RTEMS_SUCCESSFUL; 40003ad4: fcdff06f j 40003aa0 return RTEMS_INVALID_ADDRESS; 40003ad8: 00900413 li s0,9 40003adc: fc5ff06f j 40003aa0 _RTEMS_Unlock_allocator(); 40003ae0: 3d4000ef jal ra,40003eb4 <_RTEMS_Unlock_allocator> return RTEMS_INVALID_ID; 40003ae4: 00400413 li s0,4 40003ae8: fb9ff06f j 40003aa0 =============================================================================== 40005d24 : rtems_status_code rtems_scheduler_ident_by_processor_set( size_t cpusetsize, const cpu_set_t *cpuset, rtems_id *id ) { 40005d24: fe010113 addi sp,sp,-32 40005d28: 00812c23 sw s0,24(sp) 40005d2c: 00112e23 sw ra,28(sp) 40005d30: 00912a23 sw s1,20(sp) 40005d34: 00060413 mv s0,a2 Processor_mask set; Processor_mask_Copy_status status; uint32_t cpu_index; const Scheduler_Control *scheduler; if ( id == NULL ) { 40005d38: 06060263 beqz a2,40005d9c return RTEMS_INVALID_ADDRESS; } status = _Processor_mask_From_cpu_set_t( &set, cpusetsize, cpuset ); 40005d3c: 00050693 mv a3,a0 40005d40: 00058613 mv a2,a1 Processor_mask *dst, size_t src_size, const cpu_set_t *src ) { return _Processor_mask_Copy( 40005d44: 00c10513 addi a0,sp,12 40005d48: 00400593 li a1,4 40005d4c: 334020ef jal ra,40008080 <_Processor_mask_Copy> if ( status == PROCESSOR_MASK_COPY_INVALID_SIZE ) { 40005d50: 00300793 li a5,3 40005d54: 06f50263 beq a0,a5,40005db8 BIT_AND2( CPU_MAXIMUM_PROCESSORS, a, b, c ); 40005d58: 8381a503 lw a0,-1992(gp) # 40015220 <_Processor_mask_The_one_and_only> 40005d5c: 00c12783 lw a5,12(sp) } _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; 40005d60: 00300493 li s1,3 40005d64: 00f57533 and a0,a0,a5 return (uint32_t) BIT_FLS( CPU_MAXIMUM_PROCESSORS, a ); 40005d68: 00050e63 beqz a0,40005d84 40005d6c: 5ac0c0ef jal ra,40012318 if ( cpu_index == 0 ) { 40005d70: 00050a63 beqz a0,40005d84 <== NEVER TAKEN } #else _Assert( scheduler != NULL ); #endif *id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) ); 40005d74: 0f0107b7 lui a5,0xf010 40005d78: 00178793 addi a5,a5,1 # f010001 40005d7c: 00f42023 sw a5,0(s0) return RTEMS_SUCCESSFUL; 40005d80: 00000493 li s1,0 } 40005d84: 01c12083 lw ra,28(sp) 40005d88: 01812403 lw s0,24(sp) 40005d8c: 00048513 mv a0,s1 40005d90: 01412483 lw s1,20(sp) 40005d94: 02010113 addi sp,sp,32 40005d98: 00008067 ret 40005d9c: 01c12083 lw ra,28(sp) 40005da0: 01812403 lw s0,24(sp) return RTEMS_INVALID_ADDRESS; 40005da4: 00900493 li s1,9 } 40005da8: 00048513 mv a0,s1 40005dac: 01412483 lw s1,20(sp) 40005db0: 02010113 addi sp,sp,32 40005db4: 00008067 ret 40005db8: 01c12083 lw ra,28(sp) 40005dbc: 01812403 lw s0,24(sp) return RTEMS_INVALID_SIZE; 40005dc0: 00800493 li s1,8 } 40005dc4: 00048513 mv a0,s1 40005dc8: 01412483 lw s1,20(sp) 40005dcc: 02010113 addi sp,sp,32 40005dd0: 00008067 ret =============================================================================== 40005e64 : int *posix_priority ) { const Scheduler_Control *scheduler; if ( posix_priority == NULL ) { 40005e64: 04060663 beqz a2,40005eb0 40005e68: 0f0107b7 lui a5,0xf010 40005e6c: 00178793 addi a5,a5,1 # f010001 40005e70: 02f51863 bne a0,a5,40005ea0 if ( scheduler == NULL ) { return RTEMS_INVALID_ID; } if ( priority < 1 ) { return RTEMS_INVALID_PRIORITY; 40005e74: 01300513 li a0,19 if ( priority < 1 ) { 40005e78: 02058663 beqz a1,40005ea4 } if ( priority >= scheduler->maximum_priority ) { 40005e7c: 400137b7 lui a5,0x40013 40005e80: 57878793 addi a5,a5,1400 # 40013578 <_Scheduler_Table> 40005e84: 0447a703 lw a4,68(a5) 40005e88: 0407a783 lw a5,64(a5) 40005e8c: 00070e63 beqz a4,40005ea8 <== ALWAYS TAKEN return RTEMS_INVALID_PRIORITY; } *posix_priority = (int) ( scheduler->maximum_priority - priority ); 40005e90: 40b785b3 sub a1,a5,a1 40005e94: 00b62023 sw a1,0(a2) return RTEMS_SUCCESSFUL; 40005e98: 00000513 li a0,0 40005e9c: 00008067 ret return RTEMS_INVALID_ID; 40005ea0: 00400513 li a0,4 } 40005ea4: 00008067 ret if ( priority >= scheduler->maximum_priority ) { 40005ea8: fef5e4e3 bltu a1,a5,40005e90 40005eac: ff9ff06f j 40005ea4 return RTEMS_INVALID_ADDRESS; 40005eb0: 00900513 li a0,9 40005eb4: 00008067 ret =============================================================================== 400098b0 : if ( !rtems_is_name_valid( name ) ) 400098b0: 16050263 beqz a0,40009a14 { 400098b4: f8010113 addi sp,sp,-128 400098b8: 07312623 sw s3,108(sp) 400098bc: 06112e23 sw ra,124(sp) 400098c0: 06812c23 sw s0,120(sp) 400098c4: 06912a23 sw s1,116(sp) 400098c8: 07212823 sw s2,112(sp) 400098cc: 07412423 sw s4,104(sp) 400098d0: 07512223 sw s5,100(sp) 400098d4: 07612023 sw s6,96(sp) 400098d8: 05712e23 sw s7,92(sp) 400098dc: 05812c23 sw s8,88(sp) 400098e0: 05912a23 sw s9,84(sp) 400098e4: 05a12823 sw s10,80(sp) 400098e8: 05b12623 sw s11,76(sp) 400098ec: 00070993 mv s3,a4 if ( !id ) 400098f0: 22070463 beqz a4,40009b18 maybe_global = attribute_set & SEMAPHORE_KIND_MASK; 400098f4: 1f067793 andi a5,a2,496 400098f8: 00050b13 mv s6,a0 400098fc: 00058b93 mv s7,a1 40009900: 00060413 mv s0,a2 40009904: 00068a13 mv s4,a3 if ( maybe_global == RTEMS_COUNTING_SEMAPHORE ) { 40009908: 04078463 beqz a5,40009950 } else if ( count > 1 ) { 4000990c: 00100713 li a4,1 return RTEMS_INVALID_NUMBER; 40009910: 00a00513 li a0,10 } else if ( count > 1 ) { 40009914: 0cb76263 bltu a4,a1,400099d8 } else if ( maybe_global == RTEMS_SIMPLE_BINARY_SEMAPHORE ) { 40009918: 02000713 li a4,32 4000991c: 1ee78a63 beq a5,a4,40009b10 } else if ( maybe_global == RTEMS_BINARY_SEMAPHORE ) { 40009920: 01000713 li a4,16 40009924: 0ee78c63 beq a5,a4,40009a1c mutex_with_protocol = 40009928: 1f667793 andi a5,a2,502 } else if ( 4000992c: 05400713 li a4,84 40009930: 1ee78863 beq a5,a4,40009b20 } else if ( 40009934: 09400713 li a4,148 40009938: 00e78863 beq a5,a4,40009948 } else if ( 4000993c: 11000713 li a4,272 return RTEMS_NOT_DEFINED; 40009940: 00b00513 li a0,11 } else if ( 40009944: 08e79a63 bne a5,a4,400099d8 variant = SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING; 40009948: 00100913 li s2,1 4000994c: 0080006f j 40009954 variant = SEMAPHORE_VARIANT_COUNTING; 40009950: 00400913 li s2,4 * This function allocates a semaphore control block from * the inactive chain of free semaphore control blocks. */ RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void ) { return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information ); 40009954: 4001dab7 lui s5,0x4001d 40009958: 6a4a8513 addi a0,s5,1700 # 4001d6a4 <_Semaphore_Information> 4000995c: 669010ef jal ra,4000b7c4 <_Objects_Allocate> 40009960: 00050493 mv s1,a0 if ( !the_semaphore ) { 40009964: 1c050263 beqz a0,40009b28 */ RTEMS_INLINE_ROUTINE bool _Attributes_Is_priority( rtems_attribute attribute_set ) { return ( attribute_set & RTEMS_PRIORITY ) ? true : false; 40009968: 00245413 srli s0,s0,0x2 if ( _Attributes_Is_priority( attribute_set ) ) { 4000996c: 00147413 andi s0,s0,1 40009970: 00090793 mv a5,s2 40009974: 00041463 bnez s0,4000997c return flags | ( discipline << 3 ); 40009978: 00896793 ori a5,s2,8 4000997c: 40021c37 lui s8,0x40021 40009980: 880c0413 addi s0,s8,-1920 # 40020880 <_Per_CPU_Information> the_semaphore->Object.Node.previous = (Chain_Node *) flags; 40009984: 00f4a223 sw a5,4(s1) switch ( variant ) { 40009988: 00100793 li a5,1 4000998c: 03842c83 lw s9,56(s0) 40009990: 0af90663 beq s2,a5,40009a3c 40009994: ffd97913 andi s2,s2,-3 40009998: 08090663 beqz s2,40009a24 _CORE_semaphore_Initialize( 4000999c: 000b8593 mv a1,s7 400099a0: 01048513 addi a0,s1,16 400099a4: 7b9000ef jal ra,4000a95c <_CORE_semaphore_Initialize> the_object->name = name; _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 400099a8: 0084a683 lw a3,8(s1) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 400099ac: 6a4a8793 addi a5,s5,1700 400099b0: 0047a783 lw a5,4(a5) 400099b4: 01069713 slli a4,a3,0x10 400099b8: 01075713 srli a4,a4,0x10 400099bc: 00271713 slli a4,a4,0x2 the_object->name = name; 400099c0: 0164a623 sw s6,12(s1) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 400099c4: 00e787b3 add a5,a5,a4 400099c8: fe97ae23 sw s1,-4(a5) *id = the_semaphore->Object.id; 400099cc: 00d9a023 sw a3,0(s3) * 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(); 400099d0: 559000ef jal ra,4000a728 <_RTEMS_Unlock_allocator> return RTEMS_SUCCESSFUL; 400099d4: 00000513 li a0,0 } 400099d8: 07c12083 lw ra,124(sp) 400099dc: 07812403 lw s0,120(sp) 400099e0: 07412483 lw s1,116(sp) 400099e4: 07012903 lw s2,112(sp) 400099e8: 06c12983 lw s3,108(sp) 400099ec: 06812a03 lw s4,104(sp) 400099f0: 06412a83 lw s5,100(sp) 400099f4: 06012b03 lw s6,96(sp) 400099f8: 05c12b83 lw s7,92(sp) 400099fc: 05812c03 lw s8,88(sp) 40009a00: 05412c83 lw s9,84(sp) 40009a04: 05012d03 lw s10,80(sp) 40009a08: 04c12d83 lw s11,76(sp) 40009a0c: 08010113 addi sp,sp,128 40009a10: 00008067 ret return RTEMS_INVALID_NAME; 40009a14: 00300513 li a0,3 } 40009a18: 00008067 ret variant = SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL; 40009a1c: 00200913 li s2,2 40009a20: f35ff06f j 40009954 */ RTEMS_INLINE_ROUTINE void _CORE_mutex_Initialize( CORE_mutex_Control *the_mutex ) { _Thread_queue_Object_initialize( &the_mutex->Wait_queue ); 40009a24: 01048513 addi a0,s1,16 40009a28: 220030ef jal ra,4000cc48 <_Thread_queue_Object_initialize> RTEMS_INLINE_ROUTINE void _CORE_recursive_mutex_Initialize( CORE_recursive_mutex_Control *the_mutex ) { _CORE_mutex_Initialize( &the_mutex->Mutex ); the_mutex->nest_level = 0; 40009a2c: 0004ae23 sw zero,28(s1) if ( count == 0 ) { 40009a30: f60b9ce3 bnez s7,400099a8 the_mutex->Wait_queue.Queue.owner = owner; 40009a34: 0194aa23 sw s9,20(s1) } 40009a38: f71ff06f j 400099a8 const Scheduler_Control *scheduler, rtems_task_priority priority, bool *valid ) { *valid = ( priority <= scheduler->maximum_priority ); 40009a3c: 4001b537 lui a0,0x4001b 40009a40: 55850793 addi a5,a0,1368 # 4001b558 <_Scheduler_Table> RTEMS_INLINE_ROUTINE Priority_Control _Scheduler_Map_priority( const Scheduler_Control *scheduler, Priority_Control priority ) { return ( *scheduler->Operations.map_priority )( scheduler, priority ); 40009a44: 01c7a683 lw a3,28(a5) 40009a48: 0447ad03 lw s10,68(a5) 40009a4c: 0407a783 lw a5,64(a5) 40009a50: 000a0593 mv a1,s4 40009a54: 00000613 li a2,0 40009a58: 55850513 addi a0,a0,1368 40009a5c: 00f12623 sw a5,12(sp) 40009a60: 000680e7 jalr a3 40009a64: 00050d93 mv s11,a0 40009a68: 00058913 mv s2,a1 if ( valid ) { 40009a6c: 020d1663 bnez s10,40009a98 <== NEVER TAKEN 40009a70: 00c12783 lw a5,12(sp) 40009a74: 0347f263 bgeu a5,s4,40009a98 Objects_Control *the_object ) { _Assert( _Objects_Allocator_is_owner() ); _Assert( information->deallocate != NULL ); ( *information->deallocate )( information, the_object ); 40009a78: 6a4a8793 addi a5,s5,1700 40009a7c: 00c7a783 lw a5,12(a5) 40009a80: 6a4a8513 addi a0,s5,1700 40009a84: 00048593 mv a1,s1 40009a88: 000780e7 jalr a5 _RTEMS_Unlock_allocator(); 40009a8c: 49d000ef jal ra,4000a728 <_RTEMS_Unlock_allocator> return _Status_Get( status ); 40009a90: 01300513 li a0,19 40009a94: f45ff06f j 400099d8 _Thread_queue_Object_initialize( &the_mutex->Wait_queue ); 40009a98: 01048513 addi a0,s1,16 40009a9c: 1ac030ef jal ra,4000cc48 <_Thread_queue_Object_initialize> the_mutex->nest_level = 0; 40009aa0: 0004ae23 sw zero,28(s1) RTEMS_INLINE_ROUTINE void _Priority_Node_initialize( Priority_Node *node, Priority_Control priority ) { node->priority = priority; 40009aa4: 03b4a823 sw s11,48(s1) 40009aa8: 0324aa23 sw s2,52(s1) if ( count == 0 ) { 40009aac: ee0b9ee3 bnez s7,400099a8 */ RTEMS_INLINE_ROUTINE void _Thread_queue_Context_clear_priority_updates( Thread_queue_Context *queue_context ) { queue_context->Priority.update_count = 0; 40009ab0: 02012823 sw zero,48(sp) __asm__ volatile ( 40009ab4: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40009ab8: 0087f793 andi a5,a5,8 _ISR_lock_ISR_disable( &queue_context.Lock_context.Lock_context ); 40009abc: 00f12e23 sw a5,28(sp) */ RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_priority( const Priority_Aggregation *aggregation ) { return aggregation->Node.priority; 40009ac0: 038ca683 lw a3,56(s9) _Thread_Wait_acquire_default_critical( owner, &lock_context ); scheduler_node = _Thread_Scheduler_get_home_node( owner ); if ( 40009ac4: 0344a703 lw a4,52(s1) 40009ac8: 01c6a783 lw a5,28(a3) 40009acc: 06e7ea63 bltu a5,a4,40009b40 40009ad0: 06f70263 beq a4,a5,40009b34 the_mutex->Wait_queue.Queue.owner = owner; 40009ad4: 0194aa23 sw s9,20(s1) return STATUS_MUTEX_CEILING_VIOLATED; } _CORE_mutex_Set_owner( &the_mutex->Recursive.Mutex, owner ); _Thread_Resource_count_increment( owner ); _Thread_Priority_add( 40009ad8: 01c10613 addi a2,sp,28 40009adc: 02048593 addi a1,s1,32 40009ae0: 000c8513 mv a0,s9 40009ae4: 38d020ef jal ra,4000c670 <_Thread_Priority_add> disable_level = cpu_self->thread_dispatch_disable_level; 40009ae8: 03042783 lw a5,48(s0) cpu_self->thread_dispatch_disable_level = disable_level + 1; 40009aec: 00178793 addi a5,a5,1 40009af0: 02f42823 sw a5,48(s0) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40009af4: 01c12783 lw a5,28(sp) 40009af8: 3007a073 csrs mstatus,a5 ); _Thread_Wait_release_default_critical( owner, &lock_context ); cpu_self = _Thread_queue_Dispatch_disable( queue_context ); _CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context ); _Thread_Priority_update( queue_context ); 40009afc: 01c10513 addi a0,sp,28 40009b00: 545020ef jal ra,4000c844 <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40009b04: 880c0513 addi a0,s8,-1920 40009b08: 7fd020ef jal ra,4000cb04 <_Thread_Dispatch_enable> if ( status != STATUS_SUCCESSFUL ) { 40009b0c: e9dff06f j 400099a8 variant = SEMAPHORE_VARIANT_SIMPLE_BINARY; 40009b10: 00300913 li s2,3 40009b14: e41ff06f j 40009954 return RTEMS_INVALID_ADDRESS; 40009b18: 00900513 li a0,9 40009b1c: ebdff06f j 400099d8 variant = SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY; 40009b20: 00000913 li s2,0 40009b24: e31ff06f j 40009954 40009b28: 401000ef jal ra,4000a728 <_RTEMS_Unlock_allocator> return RTEMS_TOO_MANY; 40009b2c: 00500513 li a0,5 40009b30: ea9ff06f j 400099d8 if ( 40009b34: 0304a703 lw a4,48(s1) 40009b38: 0186a783 lw a5,24(a3) 40009b3c: f8e7fce3 bgeu a5,a4,40009ad4 40009b40: 01c12783 lw a5,28(sp) 40009b44: 3007a073 csrs mstatus,a5 if ( status != STATUS_SUCCESSFUL ) { 40009b48: f31ff06f j 40009a78 =============================================================================== 400039d4 : #endif #include rtems_status_code rtems_semaphore_flush( rtems_id id ) { 400039d4: fc010113 addi sp,sp,-64 Objects_Id id, Thread_queue_Context *queue_context ) { _Thread_queue_Context_initialize( queue_context ); return (Semaphore_Control *) _Objects_Get( 400039d8: 40011637 lui a2,0x40011 400039dc: 2b460613 addi a2,a2,692 # 400112b4 <_Semaphore_Information> 400039e0: 00c10593 addi a1,sp,12 400039e4: 02112e23 sw ra,60(sp) 400039e8: 134010ef jal ra,40004b1c <_Objects_Get> uintptr_t flags; Semaphore_Variant variant; the_semaphore = _Semaphore_Get( id, &queue_context ); if ( the_semaphore == NULL ) { 400039ec: 06050063 beqz a0,40003a4c return (uintptr_t) the_semaphore->Object.Node.previous; 400039f0: 00452783 lw a5,4(a0) || variant == SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING || variant == SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL || variant == SEMAPHORE_VARIANT_SIMPLE_BINARY || variant == SEMAPHORE_VARIANT_COUNTING ); _Thread_queue_Flush_critical( 400039f4: 01050513 addi a0,a0,16 return (Semaphore_Discipline) ( flags & 0x7 ); 400039f8: 0077f713 andi a4,a5,7 if ( 400039fc: 04070263 beqz a4,40003a40 return (Semaphore_Discipline) ( ( flags >> 3 ) & 0x1 ); 40003a00: 0037d793 srli a5,a5,0x3 40003a04: 0017f793 andi a5,a5,1 if ( _Semaphore_Get_discipline( flags ) == SEMAPHORE_DISCIPLINE_PRIORITY ) { 40003a08: 02078663 beqz a5,40003a34 <== NEVER TAKEN return &_Thread_queue_Operations_FIFO; 40003a0c: 400105b7 lui a1,0x40010 40003a10: eec58593 addi a1,a1,-276 # 4000feec <_Thread_queue_Operations_FIFO> 40003a14: 40006637 lui a2,0x40006 40003a18: 00c10693 addi a3,sp,12 40003a1c: 09060613 addi a2,a2,144 # 40006090 <_Thread_queue_Flush_status_unavailable> 40003a20: 680020ef jal ra,400060a0 <_Thread_queue_Flush_critical> ); break; } return RTEMS_SUCCESSFUL; } 40003a24: 03c12083 lw ra,60(sp) return RTEMS_SUCCESSFUL; 40003a28: 00000513 li a0,0 } 40003a2c: 04010113 addi sp,sp,64 40003a30: 00008067 ret return &_Thread_queue_Operations_priority; 40003a34: 400105b7 lui a1,0x40010 <== NOT EXECUTED 40003a38: f1458593 addi a1,a1,-236 # 4000ff14 <_Thread_queue_Operations_priority><== NOT EXECUTED 40003a3c: fd9ff06f j 40003a14 <== NOT EXECUTED return &_Thread_queue_Operations_priority_inherit; 40003a40: 400105b7 lui a1,0x40010 40003a44: f2858593 addi a1,a1,-216 # 4000ff28 <_Thread_queue_Operations_priority_inherit> 40003a48: fcdff06f j 40003a14 40003a4c: 03c12083 lw ra,60(sp) return RTEMS_INVALID_ID; 40003a50: 00400513 li a0,4 } 40003a54: 04010113 addi sp,sp,64 40003a58: 00008067 ret =============================================================================== 40009e38 : #include #include rtems_status_code rtems_semaphore_release( rtems_id id ) { 40009e38: fa010113 addi sp,sp,-96 return (Semaphore_Control *) _Objects_Get( 40009e3c: 4001d637 lui a2,0x4001d 40009e40: 6a460613 addi a2,a2,1700 # 4001d6a4 <_Semaphore_Information> 40009e44: 00c10593 addi a1,sp,12 40009e48: 04112e23 sw ra,92(sp) 40009e4c: 04812c23 sw s0,88(sp) 40009e50: 04912a23 sw s1,84(sp) 40009e54: 05212823 sw s2,80(sp) 40009e58: 05312623 sw s3,76(sp) 40009e5c: 05412423 sw s4,72(sp) 40009e60: 05512223 sw s5,68(sp) 40009e64: 05612023 sw s6,64(sp) 40009e68: 03712e23 sw s7,60(sp) 40009e6c: 1cd010ef jal ra,4000b838 <_Objects_Get> Semaphore_Variant variant; Status_Control status; the_semaphore = _Semaphore_Get( id, &queue_context ); if ( the_semaphore == NULL ) { 40009e70: 22050863 beqz a0,4000a0a0 return (uintptr_t) the_semaphore->Object.Node.previous; 40009e74: 00452703 lw a4,4(a0) 40009e78: 400219b7 lui s3,0x40021 40009e7c: 00050413 mv s0,a0 40009e80: 88098913 addi s2,s3,-1920 # 40020880 <_Per_CPU_Information> return (Semaphore_Discipline) ( flags & 0x7 ); 40009e84: 00777793 andi a5,a4,7 _Semaphore_Core_mutex_mp_support ); flags = _Semaphore_Get_flags( the_semaphore ); variant = _Semaphore_Get_variant( flags ); switch ( variant ) { 40009e88: 00200693 li a3,2 40009e8c: 03892503 lw a0,56(s2) case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY: status = _CORE_recursive_mutex_Surrender( 40009e90: 01040a13 addi s4,s0,16 switch ( variant ) { 40009e94: 12d78863 beq a5,a3,40009fc4 40009e98: 08f6ec63 bltu a3,a5,40009f30 40009e9c: 1a078a63 beqz a5,4000a050 40009ea0: 00100693 li a3,1 40009ea4: 16d79263 bne a5,a3,4000a008 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 ) ) { 40009ea8: 01442783 lw a5,20(s0) 40009eac: 0cf51863 bne a0,a5,40009f7c _CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context ); return STATUS_NOT_OWNER; } nest_level = the_mutex->Recursive.nest_level; 40009eb0: 01c42483 lw s1,28(s0) if ( nest_level > 0 ) { 40009eb4: 1c049a63 bnez s1,4000a088 <== NEVER TAKEN _Thread_Resource_count_decrement( executing ); _Thread_queue_Context_clear_priority_updates( queue_context ); _Thread_Wait_acquire_default_critical( executing, &lock_context ); _Thread_Priority_remove( 40009eb8: 02040b13 addi s6,s0,32 40009ebc: 00c10613 addi a2,sp,12 40009ec0: 000b0593 mv a1,s6 40009ec4: 02012023 sw zero,32(sp) 40009ec8: 041020ef jal ra,4000c708 <_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; 40009ecc: 01042503 lw a0,16(s0) if ( heads != NULL ) { 40009ed0: 22050063 beqz a0,4000a0f0 return ( *operations->first )( heads ); 40009ed4: 4001cbb7 lui s7,0x4001c 40009ed8: edcb8793 addi a5,s7,-292 # 4001bedc <_Thread_queue_Operations_priority> 40009edc: 0107a783 lw a5,16(a5) 40009ee0: 000780e7 jalr a5 disable_level = cpu_self->thread_dispatch_disable_level; 40009ee4: 03092783 lw a5,48(s2) the_mutex->Wait_queue.Queue.owner = owner; 40009ee8: 00a42a23 sw a0,20(s0) 40009eec: 00050a93 mv s5,a0 cpu_self->thread_dispatch_disable_level = disable_level + 1; 40009ef0: 00178793 addi a5,a5,1 40009ef4: 02f92823 sw a5,48(s2) cpu_self = _Thread_Dispatch_disable_critical( &queue_context->Lock_context.Lock_context ); if ( new_owner != NULL ) { 40009ef8: 20050463 beqz a0,4000a100 <== 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( 40009efc: 000b0593 mv a1,s6 40009f00: 00c10613 addi a2,sp,12 40009f04: 76c020ef jal ra,4000c670 <_Thread_Priority_add> &the_mutex->Priority_ceiling, queue_context ); } _Thread_queue_Extract_critical( 40009f08: 00c10693 addi a3,sp,12 40009f0c: 000a8613 mv a2,s5 40009f10: edcb8593 addi a1,s7,-292 40009f14: 000a0513 mv a0,s4 40009f18: 7b1020ef jal ra,4000cec8 <_Thread_queue_Extract_critical> ); } else { _CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context ); } _Thread_Priority_update( queue_context ); 40009f1c: 00c10513 addi a0,sp,12 40009f20: 125020ef jal ra,4000c844 <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40009f24: 88098513 addi a0,s3,-1920 40009f28: 3dd020ef jal ra,4000cb04 <_Thread_Dispatch_enable> return STATUS_SUCCESSFUL; 40009f2c: 05c0006f j 40009f88 40009f30: 00300693 li a3,3 40009f34: 0cd79a63 bne a5,a3,4000a008 return (Semaphore_Discipline) ( ( flags >> 3 ) & 0x1 ); 40009f38: 00375713 srli a4,a4,0x3 40009f3c: 00177713 andi a4,a4,1 if ( _Semaphore_Get_discipline( flags ) == SEMAPHORE_DISCIPLINE_PRIORITY ) { 40009f40: 06070c63 beqz a4,40009fb8 return &_Thread_queue_Operations_FIFO; 40009f44: 4001c4b7 lui s1,0x4001c 40009f48: eb448493 addi s1,s1,-332 # 4001beb4 <_Thread_queue_Operations_FIFO> Thread_queue_Heads *heads = the_thread_queue->Queue.heads; 40009f4c: 01042503 lw a0,16(s0) if ( heads != NULL ) { 40009f50: 14050c63 beqz a0,4000a0a8 return ( *operations->first )( heads ); 40009f54: 0104a783 lw a5,16(s1) 40009f58: 000780e7 jalr a5 40009f5c: 00050613 mv a2,a0 if ( the_thread != NULL ) { 40009f60: 14050463 beqz a0,4000a0a8 <== NEVER TAKEN _Thread_queue_Extract_critical( 40009f64: 00048593 mv a1,s1 40009f68: 00c10693 addi a3,sp,12 40009f6c: 000a0513 mv a0,s4 40009f70: 759020ef jal ra,4000cec8 <_Thread_queue_Extract_critical> 40009f74: 00000493 li s1,0 40009f78: 0100006f j 40009f88 40009f7c: 00c12783 lw a5,12(sp) 40009f80: 3007a073 csrs mstatus,a5 return STATUS_NOT_OWNER; 40009f84: 01700493 li s1,23 ); break; } return _Status_Get( status ); } 40009f88: 05c12083 lw ra,92(sp) 40009f8c: 05812403 lw s0,88(sp) 40009f90: 05012903 lw s2,80(sp) 40009f94: 04c12983 lw s3,76(sp) 40009f98: 04812a03 lw s4,72(sp) 40009f9c: 04412a83 lw s5,68(sp) 40009fa0: 04012b03 lw s6,64(sp) 40009fa4: 03c12b83 lw s7,60(sp) 40009fa8: 00048513 mv a0,s1 40009fac: 05412483 lw s1,84(sp) 40009fb0: 06010113 addi sp,sp,96 40009fb4: 00008067 ret return &_Thread_queue_Operations_priority; 40009fb8: 4001c4b7 lui s1,0x4001c 40009fbc: edc48493 addi s1,s1,-292 # 4001bedc <_Thread_queue_Operations_priority> 40009fc0: f8dff06f j 40009f4c return (Semaphore_Discipline) ( ( flags >> 3 ) & 0x1 ); 40009fc4: 00375713 srli a4,a4,0x3 40009fc8: 00177713 andi a4,a4,1 if ( _Semaphore_Get_discipline( flags ) == SEMAPHORE_DISCIPLINE_PRIORITY ) { 40009fcc: 0e070e63 beqz a4,4000a0c8 return &_Thread_queue_Operations_FIFO; 40009fd0: 4001c737 lui a4,0x4001c 40009fd4: eb470713 addi a4,a4,-332 # 4001beb4 <_Thread_queue_Operations_FIFO> if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) { 40009fd8: 01442783 lw a5,20(s0) 40009fdc: faf510e3 bne a0,a5,40009f7c nest_level = the_mutex->nest_level; 40009fe0: 01c42483 lw s1,28(s0) if ( nest_level > 0 ) { 40009fe4: 0a049263 bnez s1,4000a088 <== NEVER TAKEN heads = the_mutex->Mutex.Wait_queue.Queue.heads; 40009fe8: 01042583 lw a1,16(s0) the_mutex->Wait_queue.Queue.owner = owner; 40009fec: 00042a23 sw zero,20(s0) if ( heads == NULL ) { 40009ff0: 04058a63 beqz a1,4000a044 _Thread_queue_Surrender( 40009ff4: 00050613 mv a2,a0 40009ff8: 00c10693 addi a3,sp,12 40009ffc: 000a0513 mv a0,s4 4000a000: 028030ef jal ra,4000d028 <_Thread_queue_Surrender> return STATUS_SUCCESSFUL; 4000a004: f85ff06f j 40009f88 return (Semaphore_Discipline) ( ( flags >> 3 ) & 0x1 ); 4000a008: 00375713 srli a4,a4,0x3 4000a00c: 00177713 andi a4,a4,1 if ( _Semaphore_Get_discipline( flags ) == SEMAPHORE_DISCIPLINE_PRIORITY ) { 4000a010: 0c070263 beqz a4,4000a0d4 return &_Thread_queue_Operations_FIFO; 4000a014: 4001c4b7 lui s1,0x4001c 4000a018: eb448493 addi s1,s1,-332 # 4001beb4 <_Thread_queue_Operations_FIFO> Thread_queue_Heads *heads = the_thread_queue->Queue.heads; 4000a01c: 01042503 lw a0,16(s0) if ( heads != NULL ) { 4000a020: 00050a63 beqz a0,4000a034 return ( *operations->first )( heads ); 4000a024: 0104a783 lw a5,16(s1) 4000a028: 000780e7 jalr a5 4000a02c: 00050613 mv a2,a0 if ( the_thread != NULL ) { 4000a030: f2051ae3 bnez a0,40009f64 <== ALWAYS TAKEN if ( the_semaphore->count < maximum_count ) 4000a034: 01c42783 lw a5,28(s0) 4000a038: fff00713 li a4,-1 4000a03c: 00d00493 li s1,13 4000a040: 0ae79063 bne a5,a4,4000a0e0 4000a044: 00c12783 lw a5,12(sp) 4000a048: 3007a073 csrs mstatus,a5 return _Status_Get( status ); 4000a04c: f3dff06f j 40009f88 if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) { 4000a050: 01442783 lw a5,20(s0) 4000a054: f2f514e3 bne a0,a5,40009f7c nest_level = the_mutex->nest_level; 4000a058: 01c42483 lw s1,28(s0) if ( nest_level > 0 ) { 4000a05c: 02049663 bnez s1,4000a088 heads = the_mutex->Mutex.Wait_queue.Queue.heads; 4000a060: 01042583 lw a1,16(s0) the_mutex->Wait_queue.Queue.owner = owner; 4000a064: 00042a23 sw zero,20(s0) if ( heads == NULL ) { 4000a068: fc058ee3 beqz a1,4000a044 _Thread_queue_Surrender( 4000a06c: 4001c737 lui a4,0x4001c 4000a070: 00050613 mv a2,a0 4000a074: ef070713 addi a4,a4,-272 # 4001bef0 <_Thread_queue_Operations_priority_inherit> 4000a078: 00c10693 addi a3,sp,12 4000a07c: 000a0513 mv a0,s4 4000a080: 7a9020ef jal ra,4000d028 <_Thread_queue_Surrender> return STATUS_SUCCESSFUL; 4000a084: f05ff06f j 40009f88 the_mutex->nest_level = nest_level - 1; 4000a088: fff48493 addi s1,s1,-1 4000a08c: 00942e23 sw s1,28(s0) 4000a090: 00c12783 lw a5,12(sp) 4000a094: 3007a073 csrs mstatus,a5 return STATUS_SUCCESSFUL; 4000a098: 00000493 li s1,0 4000a09c: eedff06f j 40009f88 return RTEMS_INVALID_ID; 4000a0a0: 00400493 li s1,4 4000a0a4: ee5ff06f j 40009f88 4000a0a8: 01c42783 lw a5,28(s0) 4000a0ac: 00079663 bnez a5,4000a0b8 the_semaphore->count += 1; 4000a0b0: 00100793 li a5,1 4000a0b4: 00f42e23 sw a5,28(s0) 4000a0b8: 00c12783 lw a5,12(sp) 4000a0bc: 3007a073 csrs mstatus,a5 4000a0c0: 00000493 li s1,0 4000a0c4: ec5ff06f j 40009f88 return &_Thread_queue_Operations_priority; 4000a0c8: 4001c737 lui a4,0x4001c 4000a0cc: edc70713 addi a4,a4,-292 # 4001bedc <_Thread_queue_Operations_priority> 4000a0d0: f09ff06f j 40009fd8 4000a0d4: 4001c4b7 lui s1,0x4001c 4000a0d8: edc48493 addi s1,s1,-292 # 4001bedc <_Thread_queue_Operations_priority> 4000a0dc: f41ff06f j 4000a01c 4000a0e0: 00178793 addi a5,a5,1 4000a0e4: 00f42e23 sw a5,28(s0) 4000a0e8: 00000493 li s1,0 4000a0ec: f59ff06f j 4000a044 disable_level = cpu_self->thread_dispatch_disable_level; 4000a0f0: 03092783 lw a5,48(s2) the_mutex->Wait_queue.Queue.owner = owner; 4000a0f4: 00042a23 sw zero,20(s0) cpu_self->thread_dispatch_disable_level = disable_level + 1; 4000a0f8: 00178793 addi a5,a5,1 4000a0fc: 02f92823 sw a5,48(s2) 4000a100: 00c12783 lw a5,12(sp) 4000a104: 3007a073 csrs mstatus,a5 } 4000a108: e15ff06f j 40009f1c =============================================================================== 40004560 : rtems_id semaphore_id, rtems_id scheduler_id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { 40004560: fb010113 addi sp,sp,-80 40004564: 04112623 sw ra,76(sp) 40004568: 04812423 sw s0,72(sp) 4000456c: 04912223 sw s1,68(sp) 40004570: 05212023 sw s2,64(sp) 40004574: 03312e23 sw s3,60(sp) 40004578: 03412c23 sw s4,56(sp) 4000457c: 03612a23 sw s6,52(sp) 40004580: 03712823 sw s7,48(sp) const Scheduler_Control *scheduler; Semaphore_Control *the_semaphore; Thread_queue_Context queue_context; if ( old_priority == NULL ) { 40004584: 16068063 beqz a3,400046e4 { uint32_t index; index = _Scheduler_Get_index_by_id( id ); if ( index >= _Scheduler_Count ) { 40004588: 0f0107b7 lui a5,0xf010 4000458c: 00178793 addi a5,a5,1 # f010001 40004590: 10f59263 bne a1,a5,40004694 40004594: 00060493 mv s1,a2 return (Semaphore_Control *) _Objects_Get( 40004598: 40012637 lui a2,0x40012 4000459c: 15460613 addi a2,a2,340 # 40012154 <_Semaphore_Information> 400045a0: 00c10593 addi a1,sp,12 400045a4: 00068413 mv s0,a3 400045a8: 234010ef jal ra,400057dc <_Objects_Get> 400045ac: 00050913 mv s2,a0 return RTEMS_INVALID_ID; } the_semaphore = _Semaphore_Get( semaphore_id, &queue_context ); if ( the_semaphore == NULL ) { 400045b0: 0e050263 beqz a0,40004694 400045b4: 40011a37 lui s4,0x40011 400045b8: 928a0993 addi s3,s4,-1752 # 40010928 <_Scheduler_Table> return ( *scheduler->Operations.map_priority )( scheduler, priority ); 400045bc: 01c9a783 lw a5,28(s3) 400045c0: 00048593 mv a1,s1 400045c4: 00000613 li a2,0 400045c8: 928a0513 addi a0,s4,-1752 400045cc: 0409ab83 lw s7,64(s3) 400045d0: 0449ab03 lw s6,68(s3) 400045d4: 000780e7 jalr a5 if ( new_priority != RTEMS_CURRENT_PRIORITY && !valid ) { 400045d8: 08048c63 beqz s1,40004670 400045dc: 100b0863 beqz s6,400046ec <== ALWAYS TAKEN return (Semaphore_Discipline) ( flags & 0x7 ); 400045e0: 00492783 lw a5,4(s2) switch ( variant ) { 400045e4: 00100713 li a4,1 queue_context->Priority.update_count = 0; 400045e8: 02012023 sw zero,32(sp) 400045ec: 0077f793 andi a5,a5,7 400045f0: 0ae78663 beq a5,a4,4000469c old_priority = 0; 400045f4: 00000b13 li s6,0 400045f8: 00000b93 li s7,0 sc = RTEMS_NOT_DEFINED; 400045fc: 00b00493 li s1,11 disable_level = cpu_self->thread_dispatch_disable_level; 40004600: 40014937 lui s2,0x40014 40004604: 20090713 addi a4,s2,512 # 40014200 <_Per_CPU_Information> 40004608: 03072783 lw a5,48(a4) cpu_self->thread_dispatch_disable_level = disable_level + 1; 4000460c: 00178793 addi a5,a5,1 40004610: 02f72823 sw a5,48(a4) 40004614: 00c12783 lw a5,12(sp) 40004618: 3007a073 csrs mstatus,a5 _Thread_Priority_update( queue_context ); 4000461c: 00c10513 addi a0,sp,12 40004620: 1a0020ef jal ra,400067c0 <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40004624: 20090513 addi a0,s2,512 40004628: 394020ef jal ra,400069bc <_Thread_Dispatch_enable> return ( *scheduler->Operations.unmap_priority )( scheduler, priority ); 4000462c: 0209a783 lw a5,32(s3) 40004630: 000b0593 mv a1,s6 40004634: 000b8613 mv a2,s7 40004638: 928a0513 addi a0,s4,-1752 4000463c: 000780e7 jalr a5 RTEMS_INLINE_ROUTINE rtems_task_priority _RTEMS_Priority_From_core( const Scheduler_Control *scheduler, Priority_Control priority ) { return (rtems_task_priority) 40004640: 00a42023 sw a0,0(s0) scheduler, new_priority, old_priority, &queue_context ); } 40004644: 04c12083 lw ra,76(sp) 40004648: 04812403 lw s0,72(sp) 4000464c: 04012903 lw s2,64(sp) 40004650: 03c12983 lw s3,60(sp) 40004654: 03812a03 lw s4,56(sp) 40004658: 03412b03 lw s6,52(sp) 4000465c: 03012b83 lw s7,48(sp) 40004660: 00048513 mv a0,s1 40004664: 04412483 lw s1,68(sp) 40004668: 05010113 addi sp,sp,80 4000466c: 00008067 ret 40004670: 00492783 lw a5,4(s2) switch ( variant ) { 40004674: 00100713 li a4,1 40004678: 02012023 sw zero,32(sp) 4000467c: 0077f793 andi a5,a5,7 40004680: f6e79ae3 bne a5,a4,400045f4 return the_mutex->Priority_ceiling.priority; 40004684: 03092b03 lw s6,48(s2) 40004688: 03492b83 lw s7,52(s2) sc = _Semaphore_Is_scheduler_valid( 4000468c: 00000493 li s1,0 40004690: f71ff06f j 40004600 return RTEMS_INVALID_ID; 40004694: 00400493 li s1,4 40004698: fadff06f j 40004644 return the_mutex->Wait_queue.Queue.owner; 4000469c: 01492783 lw a5,20(s2) return the_mutex->Priority_ceiling.priority; 400046a0: 03092b03 lw s6,48(s2) 400046a4: 03492b83 lw s7,52(s2) if ( owner != NULL ) { 400046a8: 04078c63 beqz a5,40004700 <== ALWAYS TAKEN __asm__ volatile ( 400046ac: 30047773 csrrci a4,mstatus,8 <== NOT EXECUTED return mstatus & RISCV_MSTATUS_MIE; 400046b0: 00877713 andi a4,a4,8 <== 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 ); 400046b4: 00e12623 sw a4,12(sp) <== NOT EXECUTED _Thread_Priority_changed( 400046b8: 00000613 li a2,0 <== NOT EXECUTED node->priority = priority; 400046bc: 02a92823 sw a0,48(s2) <== NOT EXECUTED 400046c0: 02b92a23 sw a1,52(s2) <== NOT EXECUTED 400046c4: 00c10693 addi a3,sp,12 <== NOT EXECUTED 400046c8: 02090593 addi a1,s2,32 <== NOT EXECUTED 400046cc: 00078513 mv a0,a5 <== NOT EXECUTED 400046d0: 050020ef jal ra,40006720 <_Thread_Priority_changed> <== NOT EXECUTED __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 400046d4: 00c12783 lw a5,12(sp) <== NOT EXECUTED 400046d8: 3007a073 csrs mstatus,a5 <== NOT EXECUTED sc = _Semaphore_Is_scheduler_valid( 400046dc: 00000493 li s1,0 <== NOT EXECUTED Thread_queue_Context *queue_context ) { _Thread_Wait_release_critical( the_thread, queue_context ); _ISR_lock_ISR_enable( &queue_context->Lock_context.Lock_context ); } 400046e0: f21ff06f j 40004600 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; 400046e4: 00900493 li s1,9 400046e8: f5dff06f j 40004644 if ( new_priority != RTEMS_CURRENT_PRIORITY && !valid ) { 400046ec: ee9bfae3 bgeu s7,s1,400045e0 400046f0: 00c12783 lw a5,12(sp) 400046f4: 3007a073 csrs mstatus,a5 return RTEMS_INVALID_PRIORITY; 400046f8: 01300493 li s1,19 400046fc: f49ff06f j 40004644 the_mutex->Priority_ceiling.priority = priority_ceiling; 40004700: 02a92823 sw a0,48(s2) 40004704: 02b92a23 sw a1,52(s2) sc = _Semaphore_Is_scheduler_valid( 40004708: 00000493 li s1,0 4000470c: ef5ff06f j 40004600 =============================================================================== 4000f9cc : #include rtems_status_code rtems_task_delete( rtems_id id ) { 4000f9cc: fc010113 addi sp,sp,-64 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 ); 4000f9d0: 00810593 addi a1,sp,8 { 4000f9d4: 02112e23 sw ra,60(sp) 4000f9d8: 02812c23 sw s0,56(sp) the_thread = _Thread_Get( id, &context.Base.Lock_context.Lock_context ); 4000f9dc: f9df90ef jal ra,40009978 <_Thread_Get> if ( the_thread == NULL ) { 4000f9e0: 06050663 beqz a0,4000fa4c 4000f9e4: 40023437 lui s0,0x40023 4000f9e8: f8040713 addi a4,s0,-128 # 40022f80 <_Per_CPU_Information> 4000f9ec: 03872583 lw a1,56(a4) return RTEMS_INVALID_ID; } executing = _Thread_Executing; if ( the_thread == executing ) { 4000f9f0: 02b50063 beq a0,a1,4000fa10 THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED, NULL ); _Thread_Dispatch_enable( cpu_self ); } else { _Thread_Close( the_thread, executing, &context ); 4000f9f4: 00810613 addi a2,sp,8 4000f9f8: cb4fb0ef jal ra,4000aeac <_Thread_Close> } return RTEMS_SUCCESSFUL; } 4000f9fc: 03c12083 lw ra,60(sp) 4000fa00: 03812403 lw s0,56(sp) return RTEMS_SUCCESSFUL; 4000fa04: 00000513 li a0,0 } 4000fa08: 04010113 addi sp,sp,64 4000fa0c: 00008067 ret disable_level = cpu_self->thread_dispatch_disable_level; 4000fa10: 03072783 lw a5,48(a4) cpu_self->thread_dispatch_disable_level = disable_level + 1; 4000fa14: 00178793 addi a5,a5,1 4000fa18: 02f72823 sw a5,48(a4) 4000fa1c: 00812783 lw a5,8(sp) 4000fa20: 3007a073 csrs mstatus,a5 _Thread_Exit( 4000fa24: 00000613 li a2,0 4000fa28: 01400593 li a1,20 4000fa2c: cb4fb0ef jal ra,4000aee0 <_Thread_Exit> _Thread_Dispatch_enable( cpu_self ); 4000fa30: f8040513 addi a0,s0,-128 4000fa34: ef9f90ef jal ra,4000992c <_Thread_Dispatch_enable> } 4000fa38: 03c12083 lw ra,60(sp) <== NOT EXECUTED 4000fa3c: 03812403 lw s0,56(sp) <== NOT EXECUTED return RTEMS_SUCCESSFUL; 4000fa40: 00000513 li a0,0 <== NOT EXECUTED } 4000fa44: 04010113 addi sp,sp,64 <== NOT EXECUTED 4000fa48: 00008067 ret <== NOT EXECUTED 4000fa4c: 03c12083 lw ra,60(sp) 4000fa50: 03812403 lw s0,56(sp) return RTEMS_INVALID_ID; 4000fa54: 00400513 li a0,4 } 4000fa58: 04010113 addi sp,sp,64 4000fa5c: 00008067 ret =============================================================================== 40006d34 : bool needs_asr_dispatching; rtems_mode old_mode; executing = _Thread_Get_executing(); if ( !previous_mode_set ) 40006d34: 1e060263 beqz a2,40006f18 { 40006d38: fd010113 addi sp,sp,-48 40006d3c: 02912223 sw s1,36(sp) 40006d40: 01412c23 sw s4,24(sp) 40006d44: 01512a23 sw s5,20(sp) 40006d48: 01612823 sw s6,16(sp) 40006d4c: 02112623 sw ra,44(sp) 40006d50: 02812423 sw s0,40(sp) 40006d54: 03212023 sw s2,32(sp) 40006d58: 01312e23 sw s3,28(sp) 40006d5c: 01712623 sw s7,12(sp) 40006d60: 01812423 sw s8,8(sp) 40006d64: 01912223 sw s9,4(sp) } #endif #if defined(RTEMS_SMP) || CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE if ( ( mask & RTEMS_INTERRUPT_MASK ) != 0 40006d68: 0015fa93 andi s5,a1,1 40006d6c: 00060a13 mv s4,a2 40006d70: 00050b13 mv s6,a0 40006d74: 00058493 mv s1,a1 if ( 40006d78: 000a8863 beqz s5,40006d88 */ RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level ( rtems_mode mode_set ) { return ( mode_set & RTEMS_INTERRUPT_MASK ); 40006d7c: 00157793 andi a5,a0,1 && _Modes_Get_interrupt_level( mode_set ) != 0 #if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE && _SMP_Need_inter_processor_interrupts() #endif ) { return RTEMS_NOT_IMPLEMENTED; 40006d80: 01800513 li a0,24 && _Modes_Get_interrupt_level( mode_set ) != 0 40006d84: 12079a63 bnez a5,40006eb8 40006d88: 400209b7 lui s3,0x40020 40006d8c: f0098c93 addi s9,s3,-256 # 4001ff00 <_Per_CPU_Information> 40006d90: 038cac03 lw s8,56(s9) */ api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 40006d94: 089c4403 lbu s0,137(s8) if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 40006d98: 090c2783 lw a5,144(s8) api = executing->API_Extensions[ THREAD_API_RTEMS ]; 40006d9c: 194c2b83 lw s7,404(s8) old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 40006da0: 00143913 seqz s2,s0 40006da4: 00891913 slli s2,s2,0x8 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 40006da8: 14079a63 bnez a5,40006efc old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 40006dac: 008bc403 lbu s0,8(s7) old_mode |= _ISR_Get_level(); 40006db0: 3d8050ef jal ra,4000c188 <_CPU_ISR_Get_level> /* * These are generic thread scheduling characteristics. */ preempt_enabled = false; if ( mask & RTEMS_PREEMPT_MASK ) { 40006db4: 1004f713 andi a4,s1,256 old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 40006db8: 00143413 seqz s0,s0 40006dbc: 00a41413 slli s0,s0,0xa old_mode |= _ISR_Get_level(); 40006dc0: 00a46433 or s0,s0,a0 40006dc4: 01246433 or s0,s0,s2 *previous_mode_set = old_mode; 40006dc8: 008a2023 sw s0,0(s4) preempt_enabled = false; 40006dcc: 00000693 li a3,0 if ( mask & RTEMS_PREEMPT_MASK ) { 40006dd0: 02070063 beqz a4,40006df0 bool is_preempt_enabled = _Modes_Is_preempt( mode_set ); preempt_enabled = !executing->is_preemptible && is_preempt_enabled; 40006dd4: 089c4783 lbu a5,137(s8) return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT; 40006dd8: 008b5713 srli a4,s6,0x8 40006ddc: 00174713 xori a4,a4,1 40006de0: 00177713 andi a4,a4,1 40006de4: 00079463 bnez a5,40006dec 40006de8: 00070693 mv a3,a4 executing->is_preemptible = is_preempt_enabled; 40006dec: 08ec04a3 sb a4,137(s8) } if ( mask & RTEMS_TIMESLICE_MASK ) { 40006df0: 2004f793 andi a5,s1,512 40006df4: 00078e63 beqz a5,40006e10 return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE; 40006df8: 200b7793 andi a5,s6,512 if ( _Modes_Is_timeslice(mode_set) ) { 40006dfc: 10078463 beqz a5,40006f04 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; executing->cpu_time_budget = 40006e00: 8ac1a783 lw a5,-1876(gp) # 4001d284 <_Watchdog_Ticks_per_timeslice> executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 40006e04: 00100713 li a4,1 40006e08: 08ec2823 sw a4,144(s8) executing->cpu_time_budget = 40006e0c: 08fc2623 sw a5,140(s8) } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) { 40006e10: 000a8863 beqz s5,40006e20 return ( mode_set & RTEMS_INTERRUPT_MASK ); 40006e14: 001b7793 andi a5,s6,1 return ( level & RISCV_MSTATUS_MIE ) != 0; } RTEMS_INLINE_ROUTINE void _CPU_ISR_Set_level( uint32_t level ) { if ( ( level & CPU_MODES_INTERRUPT_MASK) == 0 ) { 40006e18: 0e079c63 bnez a5,40006f10 <== NEVER TAKEN __asm__ volatile ( 40006e1c: 30046073 csrsi mstatus,8 /* * This is specific to the RTEMS API */ needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { 40006e20: 4004f493 andi s1,s1,1024 40006e24: 0c048663 beqz s1,40006ef0 bool is_asr_enabled = !_Modes_Is_asr_disabled( mode_set ); 40006e28: 00ab5793 srli a5,s6,0xa 40006e2c: 0017c793 xori a5,a5,1 40006e30: 0017f793 andi a5,a5,1 __asm__ volatile ( 40006e34: 30047773 csrrci a4,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40006e38: 00877713 andi a4,a4,8 _Thread_State_acquire( executing, &lock_context ); if ( is_asr_enabled != asr->is_enabled ) { 40006e3c: 008bc603 lbu a2,8(s7) 40006e40: 0af60663 beq a2,a5,40006eec RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Swap_signals( ASR_Information *asr ) { rtems_signal_set new_signals_posted; new_signals_posted = asr->signals_pending; 40006e44: 018ba603 lw a2,24(s7) asr->signals_pending = asr->signals_posted; 40006e48: 014ba583 lw a1,20(s7) asr->is_enabled = is_asr_enabled; 40006e4c: 00fb8423 sb a5,8(s7) asr->signals_posted = new_signals_posted; 40006e50: 00cbaa23 sw a2,20(s7) asr->signals_pending = asr->signals_posted; 40006e54: 00bbac23 sw a1,24(s7) if ( _ASR_Swap_signals( asr ) != 0 ) { 40006e58: 08060a63 beqz a2,40006eec action->handler = handler; 40006e5c: 4000d7b7 lui a5,0x4000d 40006e60: 5f878793 addi a5,a5,1528 # 4000d5f8 <_Signal_Action_handler> 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 ) ) { 40006e64: 020ba683 lw a3,32(s7) 40006e68: 02fba423 sw a5,40(s7) } 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; 40006e6c: 00100793 li a5,1 40006e70: 02fc8a23 sb a5,52(s9) 40006e74: 0a068663 beqz a3,40006f20 <== ALWAYS TAKEN __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006e78: 30072073 csrs mstatus,a4 <== NOT EXECUTED disable_level = cpu_self->thread_dispatch_disable_level; 40006e7c: 030ca783 lw a5,48(s9) cpu_self->thread_dispatch_disable_level = disable_level + 1; 40006e80: 00178793 addi a5,a5,1 40006e84: 02fca823 sw a5,48(s9) __asm__ volatile ( 40006e88: 30047473 csrrci s0,mstatus,8 ( *scheduler->Operations.schedule )( scheduler, the_thread ); 40006e8c: 4001a537 lui a0,0x4001a 40006e90: 7a850793 addi a5,a0,1960 # 4001a7a8 <_Scheduler_Table> 40006e94: 0087a783 lw a5,8(a5) 40006e98: 000c0593 mv a1,s8 40006e9c: 7a850513 addi a0,a0,1960 40006ea0: 000780e7 jalr a5 return mstatus & RISCV_MSTATUS_MIE; 40006ea4: 00847413 andi s0,s0,8 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006ea8: 30042073 csrs mstatus,s0 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 ); 40006eac: f0098513 addi a0,s3,-256 40006eb0: 77d020ef jal ra,40009e2c <_Thread_Dispatch_direct> } return RTEMS_SUCCESSFUL; 40006eb4: 00000513 li a0,0 } 40006eb8: 02c12083 lw ra,44(sp) 40006ebc: 02812403 lw s0,40(sp) 40006ec0: 02412483 lw s1,36(sp) 40006ec4: 02012903 lw s2,32(sp) 40006ec8: 01c12983 lw s3,28(sp) 40006ecc: 01812a03 lw s4,24(sp) 40006ed0: 01412a83 lw s5,20(sp) 40006ed4: 01012b03 lw s6,16(sp) 40006ed8: 00c12b83 lw s7,12(sp) 40006edc: 00812c03 lw s8,8(sp) 40006ee0: 00412c83 lw s9,4(sp) 40006ee4: 03010113 addi sp,sp,48 40006ee8: 00008067 ret 40006eec: 30072073 csrs mstatus,a4 return RTEMS_SUCCESSFUL; 40006ef0: 00000513 li a0,0 if ( preempt_enabled || needs_asr_dispatching ) { 40006ef4: fc0682e3 beqz a3,40006eb8 40006ef8: f85ff06f j 40006e7c old_mode |= RTEMS_TIMESLICE; 40006efc: 20096913 ori s2,s2,512 40006f00: eadff06f j 40006dac executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 40006f04: 080c2823 sw zero,144(s8) if ( mask & RTEMS_INTERRUPT_MASK ) { 40006f08: f00a8ce3 beqz s5,40006e20 40006f0c: f09ff06f j 40006e14 "csrrs zero, mstatus, " RTEMS_XSTRING( RISCV_MSTATUS_MIE ) ); } else { __asm__ volatile ( 40006f10: 30047073 csrci mstatus,8 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level ( rtems_mode mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); 40006f14: f0dff06f j 40006e20 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; 40006f18: 00900513 li a0,9 } 40006f1c: 00008067 ret old_last = tail->previous; 40006f20: 0e0c2783 lw a5,224(s8) return &the_chain->Tail.Node; 40006f24: 0dcc0613 addi a2,s8,220 _Chain_Append_if_is_off_chain_unprotected( 40006f28: 020b8693 addi a3,s7,32 the_node->next = tail; 40006f2c: 02cba023 sw a2,32(s7) tail->previous = the_node; 40006f30: 0edc2023 sw a3,224(s8) old_last->next = the_node; 40006f34: 00d7a023 sw a3,0(a5) the_node->previous = old_last; 40006f38: 02fba223 sw a5,36(s7) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006f3c: 30072073 csrs mstatus,a4 if ( preempt_enabled || needs_asr_dispatching ) { 40006f40: f3dff06f j 40006e7c =============================================================================== 4000816c : rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority_p ) { 4000816c: fa010113 addi sp,sp,-96 40008170: 04112e23 sw ra,92(sp) 40008174: 04812c23 sw s0,88(sp) 40008178: 04912a23 sw s1,84(sp) 4000817c: 05212823 sw s2,80(sp) 40008180: 05312623 sw s3,76(sp) 40008184: 05412423 sw s4,72(sp) 40008188: 05512223 sw s5,68(sp) 4000818c: 05612023 sw s6,64(sp) 40008190: 03712e23 sw s7,60(sp) 40008194: 03812c23 sw s8,56(sp) Thread_queue_Context queue_context; const Scheduler_Control *scheduler; Priority_Control old_priority; rtems_status_code status; if ( old_priority_p == NULL ) { 40008198: 10060e63 beqz a2,400082b4 4000819c: 00058913 mv s2,a1 return RTEMS_INVALID_ADDRESS; } _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_clear_priority_updates( &queue_context ); the_thread = _Thread_Get( id, &queue_context.Lock_context.Lock_context ); 400081a0: 00c10593 addi a1,sp,12 400081a4: 00060413 mv s0,a2 */ RTEMS_INLINE_ROUTINE void _Thread_queue_Context_clear_priority_updates( Thread_queue_Context *queue_context ) { queue_context->Priority.update_count = 0; 400081a8: 02012023 sw zero,32(sp) 400081ac: 460020ef jal ra,4000a60c <_Thread_Get> 400081b0: 00050493 mv s1,a0 if ( the_thread == NULL ) { 400081b4: 10050463 beqz a0,400082bc */ RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_priority( const Priority_Aggregation *aggregation ) { return aggregation->Node.priority; 400081b8: 03852783 lw a5,56(a0) 400081bc: 0187ab03 lw s6,24(a5) 400081c0: 01c7ab83 lw s7,28(a5) _Thread_Wait_acquire_critical( the_thread, &queue_context ); scheduler = _Thread_Scheduler_get_home( the_thread ); old_priority = _Thread_Get_priority( the_thread ); if ( new_priority != RTEMS_CURRENT_PRIORITY ) { 400081c4: 06091263 bnez s2,40008228 400081c8: 00c12783 lw a5,12(sp) 400081cc: 3007a073 csrs mstatus,a5 new_priority, &queue_context ); } else { _Thread_Wait_release( the_thread, &queue_context ); status = RTEMS_SUCCESSFUL; 400081d0: 400139b7 lui s3,0x40013 400081d4: 00000493 li s1,0 400081d8: 45098a13 addi s4,s3,1104 # 40013450 <_Scheduler_Table> RTEMS_INLINE_ROUTINE Priority_Control _Scheduler_Unmap_priority( const Scheduler_Control *scheduler, Priority_Control priority ) { return ( *scheduler->Operations.unmap_priority )( scheduler, priority ); 400081dc: 020a2783 lw a5,32(s4) 400081e0: 000b0593 mv a1,s6 400081e4: 000b8613 mv a2,s7 400081e8: 45098513 addi a0,s3,1104 400081ec: 000780e7 jalr a5 RTEMS_INLINE_ROUTINE rtems_task_priority _RTEMS_Priority_From_core( const Scheduler_Control *scheduler, Priority_Control priority ) { return (rtems_task_priority) 400081f0: 00a42023 sw a0,0(s0) } *old_priority_p = _RTEMS_Priority_From_core( scheduler, old_priority ); return status; } 400081f4: 05c12083 lw ra,92(sp) 400081f8: 05812403 lw s0,88(sp) 400081fc: 05012903 lw s2,80(sp) 40008200: 04c12983 lw s3,76(sp) 40008204: 04812a03 lw s4,72(sp) 40008208: 04412a83 lw s5,68(sp) 4000820c: 04012b03 lw s6,64(sp) 40008210: 03c12b83 lw s7,60(sp) 40008214: 03812c03 lw s8,56(sp) 40008218: 00048513 mv a0,s1 4000821c: 05412483 lw s1,84(sp) 40008220: 06010113 addi sp,sp,96 40008224: 00008067 ret *valid = ( priority <= scheduler->maximum_priority ); 40008228: 400139b7 lui s3,0x40013 4000822c: 45098a13 addi s4,s3,1104 # 40013450 <_Scheduler_Table> 40008230: 044a2c03 lw s8,68(s4) return ( *scheduler->Operations.map_priority )( scheduler, priority ); 40008234: 01ca2783 lw a5,28(s4) 40008238: 00090593 mv a1,s2 4000823c: 00000613 li a2,0 40008240: 45098513 addi a0,s3,1104 40008244: 040a2a83 lw s5,64(s4) 40008248: 000780e7 jalr a5 if ( !valid ) { 4000824c: 040c0a63 beqz s8,400082a0 <== ALWAYS TAKEN node->priority = priority; 40008250: 02a4a823 sw a0,48(s1) 40008254: 02b4aa23 sw a1,52(s1) _Thread_Priority_changed( 40008258: 00048513 mv a0,s1 4000825c: 02048593 addi a1,s1,32 40008260: 00c10693 addi a3,sp,12 40008264: 00000613 li a2,0 40008268: 7f9010ef jal ra,4000a260 <_Thread_Priority_changed> disable_level = cpu_self->thread_dispatch_disable_level; 4000826c: 400184b7 lui s1,0x40018 40008270: d0048713 addi a4,s1,-768 # 40017d00 <_Per_CPU_Information> 40008274: 03072783 lw a5,48(a4) cpu_self->thread_dispatch_disable_level = disable_level + 1; 40008278: 00178793 addi a5,a5,1 4000827c: 02f72823 sw a5,48(a4) 40008280: 00c12783 lw a5,12(sp) 40008284: 3007a073 csrs mstatus,a5 _Thread_Priority_update( queue_context ); 40008288: 00c10513 addi a0,sp,12 4000828c: 074020ef jal ra,4000a300 <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40008290: d0048513 addi a0,s1,-768 40008294: 32c020ef jal ra,4000a5c0 <_Thread_Dispatch_enable> return RTEMS_SUCCESSFUL; 40008298: 00000493 li s1,0 4000829c: f41ff06f j 400081dc if ( !valid ) { 400082a0: fb2af8e3 bgeu s5,s2,40008250 400082a4: 00c12783 lw a5,12(sp) 400082a8: 3007a073 csrs mstatus,a5 return RTEMS_INVALID_PRIORITY; 400082ac: 01300493 li s1,19 400082b0: f2dff06f j 400081dc return RTEMS_INVALID_ADDRESS; 400082b4: 00900493 li s1,9 400082b8: f3dff06f j 400081f4 return RTEMS_INVALID_ID; 400082bc: 00400493 li s1,4 400082c0: f35ff06f j 400081f4 =============================================================================== 40006f24 : rtems_status_code rtems_task_set_scheduler( rtems_id task_id, rtems_id scheduler_id, rtems_task_priority priority ) { 40006f24: fa010113 addi sp,sp,-96 if ( index >= _Scheduler_Count ) { 40006f28: 0f0107b7 lui a5,0xf010 40006f2c: 04112e23 sw ra,92(sp) 40006f30: 04812c23 sw s0,88(sp) 40006f34: 04912a23 sw s1,84(sp) 40006f38: 05212823 sw s2,80(sp) 40006f3c: 05312623 sw s3,76(sp) 40006f40: 05412423 sw s4,72(sp) 40006f44: 05512223 sw s5,68(sp) 40006f48: 05612023 sw s6,64(sp) 40006f4c: 03712e23 sw s7,60(sp) 40006f50: 03812c23 sw s8,56(sp) 40006f54: 00178793 addi a5,a5,1 # f010001 40006f58: 0af59a63 bne a1,a5,4000700c 40006f5c: 40013ab7 lui s5,0x40013 40006f60: 578a8913 addi s2,s5,1400 # 40013578 <_Scheduler_Table> return ( *scheduler->Operations.map_priority )( scheduler, priority ); 40006f64: 01c92783 lw a5,28(s2) 40006f68: 04492b03 lw s6,68(s2) 40006f6c: 00060593 mv a1,a2 40006f70: 00050493 mv s1,a0 40006f74: 00060413 mv s0,a2 40006f78: 578a8513 addi a0,s5,1400 40006f7c: 00000613 li a2,0 40006f80: 04092b83 lw s7,64(s2) 40006f84: 000780e7 jalr a5 40006f88: 00050993 mv s3,a0 40006f8c: 00058a13 mv s4,a1 if ( scheduler == NULL ) { return RTEMS_INVALID_ID; } core_priority = _RTEMS_Priority_To_core( scheduler, priority, &valid ); if ( !valid ) { 40006f90: 080b0263 beqz s6,40007014 <== ALWAYS TAKEN return RTEMS_INVALID_PRIORITY; } _Thread_queue_Context_initialize( &queue_context ); the_thread = _Thread_Get( task_id, &queue_context.Lock_context.Lock_context ); 40006f94: 00c10593 addi a1,sp,12 40006f98: 00048513 mv a0,s1 40006f9c: 0c9020ef jal ra,40009864 <_Thread_Get> 40006fa0: 00050413 mv s0,a0 if ( the_thread == NULL ) { 40006fa4: 06050463 beqz a0,4000700c disable_level = cpu_self->thread_dispatch_disable_level; 40006fa8: 400174b7 lui s1,0x40017 40006fac: e8048713 addi a4,s1,-384 # 40016e80 <_Per_CPU_Information> 40006fb0: 03072783 lw a5,48(a4) ISR_lock_Context lock_context; const Scheduler_Control *old_scheduler; #endif if ( the_thread->Wait.queue != NULL ) { 40006fb4: 05452683 lw a3,84(a0) 40006fb8: 00c00b13 li s6,12 cpu_self->thread_dispatch_disable_level = disable_level + 1; 40006fbc: 00178793 addi a5,a5,1 40006fc0: 02f72823 sw a5,48(a4) 40006fc4: 04068e63 beqz a3,40007020 40006fc8: 00c12783 lw a5,12(sp) 40006fcc: 3007a073 csrs mstatus,a5 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 ); 40006fd0: e8048513 addi a0,s1,-384 40006fd4: 045020ef jal ra,40009818 <_Thread_Dispatch_enable> return _Status_Get( status ); } 40006fd8: 05c12083 lw ra,92(sp) 40006fdc: 05812403 lw s0,88(sp) 40006fe0: 05412483 lw s1,84(sp) 40006fe4: 05012903 lw s2,80(sp) 40006fe8: 04c12983 lw s3,76(sp) 40006fec: 04812a03 lw s4,72(sp) 40006ff0: 04412a83 lw s5,68(sp) 40006ff4: 03c12b83 lw s7,60(sp) 40006ff8: 03812c03 lw s8,56(sp) 40006ffc: 000b0513 mv a0,s6 40007000: 04012b03 lw s6,64(sp) 40007004: 06010113 addi sp,sp,96 40007008: 00008067 ret return RTEMS_INVALID_ID; 4000700c: 00400b13 li s6,4 40007010: fc9ff06f j 40006fd8 return RTEMS_INVALID_PRIORITY; 40007014: 01300b13 li s6,19 if ( !valid ) { 40007018: f68bfee3 bgeu s7,s0,40006f94 4000701c: fbdff06f j 40006fd8 _Assert( !_Chain_Is_empty( &the_thread->Scheduler.Wait_nodes ) ); return SCHEDULER_NODE_OF_THREAD_WAIT_NODE( _Chain_First( &the_thread->Scheduler.Wait_nodes ) ); #else return the_thread->Scheduler.nodes; 40007020: 03852b03 lw s6,56(a0) RTEMS_INLINE_ROUTINE void _Priority_Plain_extract( Priority_Aggregation *aggregation, Priority_Node *node ) { _RBTree_Extract( &aggregation->Contributors, &node->Node.RBTree ); 40007024: 02050b93 addi s7,a0,32 40007028: 000b8593 mv a1,s7 4000702c: 020b0c13 addi s8,s6,32 40007030: 000c0513 mv a0,s8 40007034: 0e8010ef jal ra,4000811c <_RBTree_Extract> */ RTEMS_INLINE_ROUTINE bool _RBTree_Is_empty( const RBTree_Control *the_rbtree ) { return RB_EMPTY( the_rbtree ); 40007038: 020b2783 lw a5,32(s6) _Priority_Plain_extract( &old_scheduler_node->Wait.Priority, &the_thread->Real_priority ); if ( 4000703c: 04079c63 bnez a5,40007094 <== NEVER TAKEN _Thread_Scheduler_process_requests( the_thread ); #else new_scheduler_node = old_scheduler_node; #endif the_thread->Start.initial_priority = priority; 40007040: 0d342023 sw s3,192(s0) node->priority = priority; 40007044: 03342823 sw s3,48(s0) 40007048: 0d442223 sw s4,196(s0) 4000704c: 03442a23 sw s4,52(s0) node->priority = priority; 40007050: 013b2c23 sw s3,24(s6) 40007054: 014b2e23 sw s4,28(s6) RBTree_Control *the_rbtree, RBTree_Node *the_node ) { _Assert( _RBTree_Is_node_off_tree( the_node ) ); RB_ROOT( the_rbtree ) = the_node; 40007058: 037b2023 sw s7,32(s6) ( *scheduler->Operations.update_priority )( 4000705c: 03842603 lw a2,56(s0) 40007060: 01892783 lw a5,24(s2) RB_PARENT( the_node, Node ) = NULL; 40007064: 02042423 sw zero,40(s0) RB_LEFT( the_node, Node ) = NULL; 40007068: 02042023 sw zero,32(s0) RB_RIGHT( the_node, Node ) = NULL; 4000706c: 02042223 sw zero,36(s0) RB_COLOR( the_node, Node ) = RB_BLACK; 40007070: 02042623 sw zero,44(s0) unsigned int seq; seq = _SMP_sequence_lock_Write_begin( &node->Priority.Lock ); #endif new_priority |= ( prepend_it ? 0 : SCHEDULER_PRIORITY_APPEND_FLAG ); 40007074: 0019e993 ori s3,s3,1 40007078: 033b2823 sw s3,48(s6) 4000707c: 034b2a23 sw s4,52(s6) 40007080: 00040593 mv a1,s0 40007084: 578a8513 addi a0,s5,1400 40007088: 000780e7 jalr a5 } #endif _Scheduler_Node_set_priority( new_scheduler_node, priority, false ); _Scheduler_Update_priority( the_thread ); return STATUS_SUCCESSFUL; 4000708c: 00000b13 li s6,0 40007090: f39ff06f j 40006fc8 _Priority_Plain_insert( 40007094: 03042583 lw a1,48(s0) <== NOT EXECUTED 40007098: 03442603 lw a2,52(s0) <== NOT EXECUTED is_new_minimum = true; while ( *link != NULL ) { parent = *link; if ( ( *less )( key, parent ) ) { 4000709c: 0147a703 lw a4,20(a5) <== NOT EXECUTED return &RB_LEFT( the_node, Node ); 400070a0: 00078693 mv a3,a5 <== NOT EXECUTED if ( ( *less )( key, parent ) ) { 400070a4: 00e66863 bltu a2,a4,400070b4 <== NOT EXECUTED 400070a8: 00c71e63 bne a4,a2,400070c4 <== NOT EXECUTED 400070ac: 0107a703 lw a4,16(a5) <== NOT EXECUTED 400070b0: 00e5fa63 bgeu a1,a4,400070c4 <== NOT EXECUTED while ( *link != NULL ) { 400070b4: 0006a703 lw a4,0(a3) <== NOT EXECUTED 400070b8: 00070a63 beqz a4,400070cc <== NOT EXECUTED 400070bc: 00070793 mv a5,a4 <== NOT EXECUTED 400070c0: fddff06f j 4000709c <== NOT EXECUTED return &RB_RIGHT( the_node, Node ); 400070c4: 00478693 addi a3,a5,4 <== NOT EXECUTED link = _RBTree_Left_reference( parent ); } else { link = _RBTree_Right_reference( parent ); is_new_minimum = false; 400070c8: fedff06f j 400070b4 <== NOT EXECUTED RB_SET( child, parent, Node ); 400070cc: 02f42423 sw a5,40(s0) <== NOT EXECUTED 400070d0: 00100793 li a5,1 <== NOT EXECUTED 400070d4: 02042223 sw zero,36(s0) <== NOT EXECUTED 400070d8: 02042023 sw zero,32(s0) <== NOT EXECUTED 400070dc: 02f42623 sw a5,44(s0) <== NOT EXECUTED *link = child; 400070e0: 0176a023 sw s7,0(a3) <== NOT EXECUTED } } _RBTree_Add_child( the_node, parent, link ); _RBTree_Insert_color( the_rbtree, the_node ); 400070e4: 000b8593 mv a1,s7 <== NOT EXECUTED 400070e8: 000c0513 mv a0,s8 <== NOT EXECUTED 400070ec: 45c010ef jal ra,40008548 <_RBTree_Insert_color> <== NOT EXECUTED return STATUS_RESOURCE_IN_USE; 400070f0: 00c00b13 li s6,12 <== NOT EXECUTED 400070f4: ed5ff06f j 40006fc8 <== NOT EXECUTED