=============================================================================== 40004934 <_POSIX_Condition_variables_Wait_support>: int _POSIX_Condition_variables_Wait_support( pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime ) { 40004934: fb010113 addi sp,sp,-80 40004938: 04112623 sw ra,76(sp) 4000493c: 04812423 sw s0,72(sp) 40004940: 04912223 sw s1,68(sp) 40004944: 05212023 sw s2,64(sp) 40004948: 03312e23 sw s3,60(sp) Thread_queue_Context queue_context; int error; Thread_Control *executing; the_cond = _POSIX_Condition_variables_Get( cond ); POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags ); 4000494c: 0e050063 beqz a0,40004a2c <_POSIX_Condition_variables_Wait_support+0xf8> 40004950: 00052903 lw s2,0(a0) 40004954: 18dfb7b7 lui a5,0x18dfb 40004958: 1fe78793 addi a5,a5,510 # 18dfb1fe 4000495c: 01254733 xor a4,a0,s2 40004960: ffe77713 andi a4,a4,-2 40004964: 00050413 mv s0,a0 40004968: 00058993 mv s3,a1 4000496c: 00060493 mv s1,a2 40004970: 0af71a63 bne a4,a5,40004a24 <_POSIX_Condition_variables_Wait_support+0xf0> _Thread_queue_Context_initialize( &queue_context ); if ( abstime != NULL ) { 40004974: 10048463 beqz s1,40004a7c <_POSIX_Condition_variables_Wait_support+0x148> queue_context->Timeout.arg = arg; 40004978: 00912c23 sw s1,24(sp) RTEMS_INLINE_ROUTINE clockid_t _POSIX_Condition_variables_Get_clock( unsigned long flags ) { if ( ( flags & POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC ) != 0 ) { 4000497c: 00197913 andi s2,s2,1 40004980: 10091663 bnez s2,40004a8c <_POSIX_Condition_variables_Wait_support+0x158><== NEVER TAKEN queue_context->enqueue_callout = enqueue_callout; 40004984: 400057b7 lui a5,0x40005 40004988: 84078793 addi a5,a5,-1984 # 40004840 <_POSIX_Condition_variables_Enqueue_with_timeout_realtime> 4000498c: 00f12a23 sw a5,20(sp) __asm__ volatile ( 40004990: 300477f3 csrrci a5,mstatus,8 } executing = _POSIX_Condition_variables_Acquire( the_cond, &queue_context ); if ( the_cond->mutex != POSIX_CONDITION_VARIABLES_NO_MUTEX 40004994: 01842703 lw a4,24(s0) return mstatus & RISCV_MSTATUS_MIE; 40004998: 0087f793 andi a5,a5,8 4000499c: 00f12623 sw a5,12(sp) if ( 400049a0: 00070463 beqz a4,400049a8 <_POSIX_Condition_variables_Wait_support+0x74> && the_cond->mutex != mutex 400049a4: 0b371663 bne a4,s3,40004a50 <_POSIX_Condition_variables_Wait_support+0x11c> static inline struct _Thread_Control *_Per_CPU_Get_executing( const Per_CPU_Control *cpu ) { return cpu->executing; 400049a8: 400167b7 lui a5,0x40016 400049ac: 3787a483 lw s1,888(a5) # 40016378 <_Per_CPU_Information+0x38> _Thread_queue_Context_set_thread_state( &queue_context, STATES_WAITING_FOR_CONDITION_VARIABLE ); _Thread_queue_Enqueue( 400049b0: 400125b7 lui a1,0x40012 queue_context->thread_state = thread_state; 400049b4: 02000793 li a5,32 the_cond->mutex = mutex; 400049b8: 01342c23 sw s3,24(s0) _Thread_queue_Enqueue( 400049bc: 00c40513 addi a0,s0,12 400049c0: 00c10693 addi a3,sp,12 400049c4: 00048613 mv a2,s1 400049c8: 57458593 addi a1,a1,1396 # 40012574 <_Thread_queue_Operations_FIFO> 400049cc: 00f12823 sw a5,16(sp) 400049d0: 01c030ef jal ra,400079ec <_Thread_queue_Enqueue> return _POSIX_Get_by_name_error_table[ error ]; } RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status ) { return STATUS_GET_POSIX( status ); 400049d4: 04c4a783 lw a5,76(s1) * according to the POSIX standard. It means that pthread_cond_wait * returns a success status, except for the fact that it was not * woken up a pthread_cond_signal() or a pthread_cond_broadcast(). */ if ( error == EINTR ) { 400049d8: 00400713 li a4,4 400049dc: 41f7d413 srai s0,a5,0x1f 400049e0: 0ff47413 andi s0,s0,255 400049e4: 00f40433 add s0,s0,a5 400049e8: 40845413 srai s0,s0,0x8 400049ec: 0ae40863 beq s0,a4,40004a9c <_POSIX_Condition_variables_Wait_support+0x168> /* * When we get here the dispatch disable level is 0. */ if ( error != EPERM ) { 400049f0: 00100793 li a5,1 400049f4: 00f40863 beq s0,a5,40004a04 <_POSIX_Condition_variables_Wait_support+0xd0> int mutex_error; mutex_error = pthread_mutex_lock( mutex ); 400049f8: 00098513 mv a0,s3 400049fc: 274000ef jal ra,40004c70 if ( mutex_error != 0 ) { 40004a00: 02051663 bnez a0,40004a2c <_POSIX_Condition_variables_Wait_support+0xf8> error = EINVAL; } } return error; } 40004a04: 04c12083 lw ra,76(sp) 40004a08: 00040513 mv a0,s0 40004a0c: 04812403 lw s0,72(sp) 40004a10: 04412483 lw s1,68(sp) 40004a14: 04012903 lw s2,64(sp) 40004a18: 03c12983 lw s3,60(sp) 40004a1c: 05010113 addi sp,sp,80 40004a20: 00008067 ret POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags ); 40004a24: d9dff0ef jal ra,400047c0 <_POSIX_Condition_variables_Auto_initialization> 40004a28: f40516e3 bnez a0,40004974 <_POSIX_Condition_variables_Wait_support+0x40> error = EINVAL; 40004a2c: 01600413 li s0,22 } 40004a30: 04c12083 lw ra,76(sp) 40004a34: 00040513 mv a0,s0 40004a38: 04812403 lw s0,72(sp) 40004a3c: 04412483 lw s1,68(sp) 40004a40: 04012903 lw s2,64(sp) 40004a44: 03c12983 lw s3,60(sp) 40004a48: 05010113 addi sp,sp,80 40004a4c: 00008067 ret __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40004a50: 00c12783 lw a5,12(sp) 40004a54: 3007a073 csrs mstatus,a5 return EINVAL; 40004a58: 01600413 li s0,22 } 40004a5c: 04c12083 lw ra,76(sp) 40004a60: 00040513 mv a0,s0 40004a64: 04812403 lw s0,72(sp) 40004a68: 04412483 lw s1,68(sp) 40004a6c: 04012903 lw s2,64(sp) 40004a70: 03c12983 lw s3,60(sp) 40004a74: 05010113 addi sp,sp,80 40004a78: 00008067 ret queue_context->enqueue_callout = enqueue_callout; 40004a7c: 400057b7 lui a5,0x40005 40004a80: 89878793 addi a5,a5,-1896 # 40004898 <_POSIX_Condition_variables_Enqueue_no_timeout> 40004a84: 00f12a23 sw a5,20(sp) } 40004a88: f09ff06f j 40004990 <_POSIX_Condition_variables_Wait_support+0x5c> queue_context->enqueue_callout = enqueue_callout; 40004a8c: 400057b7 lui a5,0x40005 <== NOT EXECUTED 40004a90: 8dc78793 addi a5,a5,-1828 # 400048dc <_POSIX_Condition_variables_Enqueue_with_timeout_monotonic><== NOT EXECUTED 40004a94: 00f12a23 sw a5,20(sp) <== NOT EXECUTED } 40004a98: ef9ff06f j 40004990 <_POSIX_Condition_variables_Wait_support+0x5c><== NOT EXECUTED error = 0; 40004a9c: 00000413 li s0,0 <== NOT EXECUTED 40004aa0: f59ff06f j 400049f8 <_POSIX_Condition_variables_Wait_support+0xc4><== NOT EXECUTED =============================================================================== 40004be8 <_POSIX_Message_queue_Receive_support>: size_t msg_len, unsigned int *msg_prio, const struct timespec *abstime, Thread_queue_Enqueue_callout enqueue_callout ) { 40004be8: fb010113 addi sp,sp,-80 40004bec: 03312e23 sw s3,60(sp) 40004bf0: 00060993 mv s3,a2 return (POSIX_Message_queue_Control *) _Objects_Get( 40004bf4: 40016637 lui a2,0x40016 40004bf8: 03412c23 sw s4,56(sp) 40004bfc: da860613 addi a2,a2,-600 # 40015da8 <_POSIX_Message_queue_Information> 40004c00: 00058a13 mv s4,a1 40004c04: 00c10593 addi a1,sp,12 40004c08: 04812423 sw s0,72(sp) 40004c0c: 04912223 sw s1,68(sp) 40004c10: 05212023 sw s2,64(sp) 40004c14: 04112623 sw ra,76(sp) 40004c18: 00068413 mv s0,a3 40004c1c: 00070913 mv s2,a4 40004c20: 00078493 mv s1,a5 40004c24: 1d4030ef jal ra,40007df8 <_Objects_Get> Thread_Control *executing; Status_Control status; the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context ); if ( the_mq == NULL ) { 40004c28: 0a050663 beqz a0,40004cd4 <_POSIX_Message_queue_Receive_support+0xec> rtems_set_errno_and_return_minus_one( EBADF ); } if ( ( the_mq->oflag & O_ACCMODE ) == O_WRONLY ) { 40004c2c: 06c52803 lw a6,108(a0) 40004c30: 00100793 li a5,1 40004c34: 00387713 andi a4,a6,3 40004c38: 08f70a63 beq a4,a5,40004ccc <_POSIX_Message_queue_Receive_support+0xe4> _ISR_lock_ISR_enable( &queue_context.Lock_context.Lock_context ); rtems_set_errno_and_return_minus_one( EBADF ); } if ( msg_len < the_mq->Message_queue.maximum_message_size ) { 40004c3c: 02852783 lw a5,40(a0) 40004c40: 0af9e463 bltu s3,a5,40004ce8 <_POSIX_Message_queue_Receive_support+0x100> _CORE_message_queue_Acquire_critical( &the_mq->Message_queue, &queue_context ); if ( the_mq->open_count == 0 ) { 40004c44: 05452783 lw a5,84(a0) length_out = -1; 40004c48: fff00713 li a4,-1 queue_context->enqueue_callout = enqueue_callout; 40004c4c: 00912a23 sw s1,20(sp) queue_context->Timeout.arg = arg; 40004c50: 01212c23 sw s2,24(sp) 40004c54: 00e12423 sw a4,8(sp) _CORE_message_queue_Acquire_critical( 40004c58: 01050513 addi a0,a0,16 if ( the_mq->open_count == 0 ) { 40004c5c: 06078863 beqz a5,40004ccc <_POSIX_Message_queue_Receive_support+0xe4> 40004c60: 400187b7 lui a5,0x40018 40004c64: 0f87a903 lw s2,248(a5) # 400180f8 <_Per_CPU_Information+0x38> /* * Now perform the actual message receive */ executing = _Thread_Executing; status = _CORE_message_queue_Seize( 40004c68: 00e85713 srli a4,a6,0xe 40004c6c: 00174713 xori a4,a4,1 40004c70: 00c10793 addi a5,sp,12 40004c74: 00177713 andi a4,a4,1 40004c78: 00810693 addi a3,sp,8 40004c7c: 000a0613 mv a2,s4 40004c80: 00090593 mv a1,s2 40004c84: 038020ef jal ra,40006cbc <_CORE_message_queue_Seize> 40004c88: 00050493 mv s1,a0 &length_out, ( the_mq->oflag & O_NONBLOCK ) == 0, &queue_context ); if ( status != STATUS_SUCCESSFUL ) { 40004c8c: 06051c63 bnez a0,40004d04 <_POSIX_Message_queue_Receive_support+0x11c> rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); } if ( msg_prio != NULL ) { 40004c90: 00040c63 beqz s0,40004ca8 <_POSIX_Message_queue_Receive_support+0xc0><== NEVER TAKEN return (unsigned int) ((priority >= 0) ? priority : -priority); 40004c94: 03c92783 lw a5,60(s2) 40004c98: 41f7d713 srai a4,a5,0x1f 40004c9c: 00f747b3 xor a5,a4,a5 40004ca0: 40e787b3 sub a5,a5,a4 *msg_prio = _POSIX_Message_queue_Priority_from_core( 40004ca4: 00f42023 sw a5,0(s0) executing->Wait.count ); } return length_out; 40004ca8: 00812503 lw a0,8(sp) } 40004cac: 04c12083 lw ra,76(sp) 40004cb0: 04812403 lw s0,72(sp) 40004cb4: 04412483 lw s1,68(sp) 40004cb8: 04012903 lw s2,64(sp) 40004cbc: 03c12983 lw s3,60(sp) 40004cc0: 03812a03 lw s4,56(sp) 40004cc4: 05010113 addi sp,sp,80 40004cc8: 00008067 ret 40004ccc: 00c12783 lw a5,12(sp) 40004cd0: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EBADF ); 40004cd4: 0890d0ef jal ra,4001255c <__errno> 40004cd8: 00900793 li a5,9 40004cdc: 00f52023 sw a5,0(a0) 40004ce0: fff00513 li a0,-1 40004ce4: fc9ff06f j 40004cac <_POSIX_Message_queue_Receive_support+0xc4> 40004ce8: 00c12783 lw a5,12(sp) 40004cec: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EMSGSIZE ); 40004cf0: 06d0d0ef jal ra,4001255c <__errno> 40004cf4: 07a00793 li a5,122 40004cf8: 00f52023 sw a5,0(a0) 40004cfc: fff00513 li a0,-1 40004d00: fadff06f j 40004cac <_POSIX_Message_queue_Receive_support+0xc4> rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); 40004d04: 0590d0ef jal ra,4001255c <__errno> return STATUS_GET_POSIX( status ); 40004d08: 41f4d793 srai a5,s1,0x1f 40004d0c: 0ff7f793 andi a5,a5,255 40004d10: 009787b3 add a5,a5,s1 40004d14: 4087d793 srai a5,a5,0x8 40004d18: 00f52023 sw a5,0(a0) 40004d1c: fff00513 li a0,-1 40004d20: f8dff06f j 40004cac <_POSIX_Message_queue_Receive_support+0xc4> =============================================================================== 40004d34 <_POSIX_Message_queue_Send_support>: size_t msg_len, unsigned int msg_prio, const struct timespec *abstime, Thread_queue_Enqueue_callout enqueue_callout ) { 40004d34: fb010113 addi sp,sp,-80 40004d38: 04812423 sw s0,72(sp) 40004d3c: 04112623 sw ra,76(sp) 40004d40: 00068413 mv s0,a3 40004d44: 04912223 sw s1,68(sp) 40004d48: 05212023 sw s2,64(sp) 40004d4c: 03312e23 sw s3,60(sp) 40004d50: 03412c23 sw s4,56(sp) /* * Validate the priority. * XXX - Do not validate msg_prio is not less than 0. */ if ( msg_prio > MQ_PRIO_MAX ) { 40004d54: 02000693 li a3,32 40004d58: 0c86ec63 bltu a3,s0,40004e30 <_POSIX_Message_queue_Send_support+0xfc> 40004d5c: 00060a13 mv s4,a2 return (POSIX_Message_queue_Control *) _Objects_Get( 40004d60: 40016637 lui a2,0x40016 40004d64: 00058993 mv s3,a1 40004d68: da860613 addi a2,a2,-600 # 40015da8 <_POSIX_Message_queue_Information> 40004d6c: 00c10593 addi a1,sp,12 40004d70: 00070493 mv s1,a4 40004d74: 00078913 mv s2,a5 40004d78: 080030ef jal ra,40007df8 <_Objects_Get> rtems_set_errno_and_return_minus_one( EINVAL ); } the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context ); if ( the_mq == NULL ) { 40004d7c: 0a050063 beqz a0,40004e1c <_POSIX_Message_queue_Send_support+0xe8><== NEVER TAKEN rtems_set_errno_and_return_minus_one( EBADF ); } if ( ( the_mq->oflag & O_ACCMODE ) == O_RDONLY ) { 40004d80: 06c52803 lw a6,108(a0) 40004d84: 00387793 andi a5,a6,3 40004d88: 08078663 beqz a5,40004e14 <_POSIX_Message_queue_Send_support+0xe0> _CORE_message_queue_Acquire_critical( &the_mq->Message_queue, &queue_context ); if ( the_mq->open_count == 0 ) { 40004d8c: 05452783 lw a5,84(a0) queue_context->enqueue_callout = enqueue_callout; 40004d90: 01212a23 sw s2,20(sp) queue_context->Timeout.arg = arg; 40004d94: 00912c23 sw s1,24(sp) _CORE_message_queue_Acquire_critical( 40004d98: 01050513 addi a0,a0,16 if ( the_mq->open_count == 0 ) { 40004d9c: 06078c63 beqz a5,40004e14 <_POSIX_Message_queue_Send_support+0xe0> /* * Now perform the actual message receive */ executing = _Thread_Executing; status = _CORE_message_queue_Submit( 40004da0: 40018737 lui a4,0x40018 40004da4: 0f872583 lw a1,248(a4) # 400180f8 <_Per_CPU_Information+0x38> 40004da8: 00e85793 srli a5,a6,0xe 40004dac: 0017c793 xori a5,a5,1 40004db0: 40800733 neg a4,s0 40004db4: 00c10813 addi a6,sp,12 40004db8: 0017f793 andi a5,a5,1 40004dbc: 000a0693 mv a3,s4 40004dc0: 00098613 mv a2,s3 40004dc4: 04c020ef jal ra,40006e10 <_CORE_message_queue_Submit> 40004dc8: 00050413 mv s0,a0 RTEMS_INLINE_ROUTINE int _POSIX_Zero_or_minus_one_plus_errno( Status_Control status ) { if ( status == STATUS_SUCCESSFUL ) { 40004dcc: 02051463 bnez a0,40004df4 <_POSIX_Message_queue_Send_support+0xc0> _POSIX_Message_queue_Priority_to_core( msg_prio ), ( the_mq->oflag & O_NONBLOCK ) == 0, &queue_context ); return _POSIX_Zero_or_minus_one_plus_errno( status ); } 40004dd0: 04c12083 lw ra,76(sp) 40004dd4: 00040513 mv a0,s0 40004dd8: 04812403 lw s0,72(sp) 40004ddc: 04412483 lw s1,68(sp) 40004de0: 04012903 lw s2,64(sp) 40004de4: 03c12983 lw s3,60(sp) 40004de8: 03812a03 lw s4,56(sp) 40004dec: 05010113 addi sp,sp,80 40004df0: 00008067 ret return 0; } rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); 40004df4: 7680d0ef jal ra,4001255c <__errno> return STATUS_GET_POSIX( status ); 40004df8: 41f45793 srai a5,s0,0x1f 40004dfc: 0ff7f793 andi a5,a5,255 40004e00: 00878433 add s0,a5,s0 40004e04: 40845413 srai s0,s0,0x8 rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); 40004e08: 00852023 sw s0,0(a0) 40004e0c: fff00413 li s0,-1 40004e10: fc1ff06f j 40004dd0 <_POSIX_Message_queue_Send_support+0x9c> 40004e14: 00c12783 lw a5,12(sp) 40004e18: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EBADF ); 40004e1c: 7400d0ef jal ra,4001255c <__errno> 40004e20: 00900793 li a5,9 40004e24: 00f52023 sw a5,0(a0) 40004e28: fff00413 li s0,-1 40004e2c: fa5ff06f j 40004dd0 <_POSIX_Message_queue_Send_support+0x9c> rtems_set_errno_and_return_minus_one( EINVAL ); 40004e30: 72c0d0ef jal ra,4001255c <__errno> 40004e34: 01600793 li a5,22 40004e38: 00f52023 sw a5,0(a0) 40004e3c: fff00413 li s0,-1 40004e40: f91ff06f j 40004dd0 <_POSIX_Message_queue_Send_support+0x9c> =============================================================================== 40006aa8 <_POSIX_Mutex_Lock_support>: Thread_queue_Context queue_context; Thread_Control *executing; Status_Control status; the_mutex = _POSIX_Mutex_Get( mutex ); POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006aa8: 1e050863 beqz a0,40006c98 <_POSIX_Mutex_Lock_support+0x1f0> { 40006aac: fb010113 addi sp,sp,-80 40006ab0: 03312e23 sw s3,60(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006ab4: 00052983 lw s3,0(a0) 40006ab8: 961c17b7 lui a5,0x961c1 { 40006abc: 04812423 sw s0,72(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006ac0: 01354733 xor a4,a0,s3 { 40006ac4: 04912223 sw s1,68(sp) 40006ac8: 05212023 sw s2,64(sp) 40006acc: 04112623 sw ra,76(sp) 40006ad0: 03412c23 sw s4,56(sp) 40006ad4: 03512a23 sw s5,52(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006ad8: 3b878793 addi a5,a5,952 # 961c13b8 40006adc: ff877713 andi a4,a4,-8 40006ae0: 00050413 mv s0,a0 40006ae4: 00058493 mv s1,a1 40006ae8: 00060913 mv s2,a2 40006aec: 10f71263 bne a4,a5,40006bf0 <_POSIX_Mutex_Lock_support+0x148> __asm__ volatile ( 40006af0: 300477f3 csrrci a5,mstatus,8 static inline struct _Thread_Control *_Per_CPU_Get_executing( const Per_CPU_Control *cpu ) { return cpu->executing; 40006af4: 4001eab7 lui s5,0x4001e return mstatus & RISCV_MSTATUS_MIE; 40006af8: 0087f793 andi a5,a5,8 40006afc: bc0a8a13 addi s4,s5,-1088 # 4001dbc0 <_Per_CPU_Information> ) { #if defined( RTEMS_SMP ) context->Lock_context.isr_level = level; #else context->isr_level = level; 40006b00: 00f12623 sw a5,12(sp) queue_context->enqueue_callout = enqueue_callout; 40006b04: 01212a23 sw s2,20(sp) queue_context->Timeout.arg = arg; 40006b08: 00912c23 sw s1,24(sp) 40006b0c: 0039f793 andi a5,s3,3 40006b10: 038a2903 lw s2,56(s4) executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context ); _Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout); _Thread_queue_Context_set_timeout_argument( &queue_context, abstime ); switch ( _POSIX_Mutex_Get_protocol( flags ) ) { 40006b14: 08078463 beqz a5,40006b9c <_POSIX_Mutex_Lock_support+0xf4> 40006b18: 00200713 li a4,2 40006b1c: 02e78663 beq a5,a4,40006b48 <_POSIX_Mutex_Lock_support+0xa0> RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Mutex_Get_owner( const POSIX_Mutex_Control *the_mutex ) { return the_mutex->Recursive.Mutex.Queue.Queue.owner; 40006b20: 01042783 lw a5,16(s0) { Thread_Control *owner; owner = _POSIX_Mutex_Get_owner( the_mutex ); if ( owner == NULL ) { 40006b24: 10078463 beqz a5,40006c2c <_POSIX_Mutex_Lock_support+0x184> _Thread_Resource_count_increment( executing ); _POSIX_Mutex_Release( the_mutex, queue_context ); return STATUS_SUCCESSFUL; } if ( owner == executing ) { 40006b28: 08f90063 beq s2,a5,40006ba8 <_POSIX_Mutex_Lock_support+0x100> if ( (uintptr_t) abstime != POSIX_MUTEX_ABSTIME_TRY_LOCK ) { 40006b2c: 00100793 li a5,1 40006b30: 0ef48663 beq s1,a5,40006c1c <_POSIX_Mutex_Lock_support+0x174> _Thread_queue_Enqueue( 40006b34: 400195b7 lui a1,0x40019 40006b38: 00c10693 addi a3,sp,12 40006b3c: 00090613 mv a2,s2 40006b40: 6c858593 addi a1,a1,1736 # 400196c8 <_Thread_queue_Operations_priority_inherit> 40006b44: 0280006f j 40006b6c <_POSIX_Mutex_Lock_support+0xc4> return the_mutex->Recursive.Mutex.Queue.Queue.owner; 40006b48: 01042783 lw a5,16(s0) { Thread_Control *owner; owner = _POSIX_Mutex_Get_owner( the_mutex ); if ( owner == NULL ) { 40006b4c: 0e078a63 beqz a5,40006c40 <_POSIX_Mutex_Lock_support+0x198> executing, queue_context ); } if ( owner == executing ) { 40006b50: 04f90c63 beq s2,a5,40006ba8 <_POSIX_Mutex_Lock_support+0x100> if ( (uintptr_t) abstime != POSIX_MUTEX_ABSTIME_TRY_LOCK ) { 40006b54: 00100793 li a5,1 40006b58: 0cf48263 beq s1,a5,40006c1c <_POSIX_Mutex_Lock_support+0x174> _Thread_queue_Enqueue( 40006b5c: 400195b7 lui a1,0x40019 40006b60: 00c10693 addi a3,sp,12 40006b64: 00090613 mv a2,s2 40006b68: 6b458593 addi a1,a1,1716 # 400196b4 <_Thread_queue_Operations_priority> queue_context->thread_state = thread_state; 40006b6c: 00f12823 sw a5,16(sp) queue_context->deadlock_callout = deadlock_callout; 40006b70: 4000a7b7 lui a5,0x4000a 40006b74: 29478793 addi a5,a5,660 # 4000a294 <_Thread_queue_Deadlock_status> 40006b78: 00c40513 addi a0,s0,12 40006b7c: 02f12623 sw a5,44(sp) 40006b80: 734030ef jal ra,4000a2b4 <_Thread_queue_Enqueue> return _POSIX_Get_by_name_error_table[ error ]; } RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status ) { return STATUS_GET_POSIX( status ); 40006b84: 04c92783 lw a5,76(s2) 40006b88: 41f7d513 srai a0,a5,0x1f 40006b8c: 0ff57513 andi a0,a0,255 40006b90: 00f50533 add a0,a0,a5 40006b94: 40855513 srai a0,a0,0x8 40006b98: 0340006f j 40006bcc <_POSIX_Mutex_Lock_support+0x124> return the_mutex->Recursive.Mutex.Queue.Queue.owner; 40006b9c: 01042783 lw a5,16(s0) if ( owner == NULL ) { 40006ba0: 08078663 beqz a5,40006c2c <_POSIX_Mutex_Lock_support+0x184> if ( owner == executing ) { 40006ba4: 04f91e63 bne s2,a5,40006c00 <_POSIX_Mutex_Lock_support+0x158> return ( flags & POSIX_MUTEX_RECURSIVE ) != 0; 40006ba8: 0049f993 andi s3,s3,4 40006bac: 02d00513 li a0,45 if ( _POSIX_Mutex_Is_recursive( flags ) ) { 40006bb0: 00098a63 beqz s3,40006bc4 <_POSIX_Mutex_Lock_support+0x11c> <== ALWAYS TAKEN ++the_mutex->Recursive.nest_level; 40006bb4: 01842783 lw a5,24(s0) <== NOT EXECUTED return STATUS_SUCCESSFUL; 40006bb8: 00000513 li a0,0 <== NOT EXECUTED ++the_mutex->Recursive.nest_level; 40006bbc: 00178793 addi a5,a5,1 <== NOT EXECUTED 40006bc0: 00f42c23 sw a5,24(s0) <== NOT EXECUTED __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006bc4: 00c12783 lw a5,12(sp) 40006bc8: 3007a073 csrs mstatus,a5 ); break; } return _POSIX_Get_error( status ); } 40006bcc: 04c12083 lw ra,76(sp) 40006bd0: 04812403 lw s0,72(sp) 40006bd4: 04412483 lw s1,68(sp) 40006bd8: 04012903 lw s2,64(sp) 40006bdc: 03c12983 lw s3,60(sp) 40006be0: 03812a03 lw s4,56(sp) 40006be4: 03412a83 lw s5,52(sp) 40006be8: 05010113 addi sp,sp,80 40006bec: 00008067 ret POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006bf0: 240000ef jal ra,40006e30 <_POSIX_Mutex_Auto_initialization> 40006bf4: ee051ee3 bnez a0,40006af0 <_POSIX_Mutex_Lock_support+0x48> return STATUS_MUTEX_CEILING_VIOLATED; 40006bf8: 01600513 li a0,22 40006bfc: fd1ff06f j 40006bcc <_POSIX_Mutex_Lock_support+0x124> if ( (uintptr_t) abstime != POSIX_MUTEX_ABSTIME_TRY_LOCK ) { 40006c00: 00100793 li a5,1 40006c04: 00f48c63 beq s1,a5,40006c1c <_POSIX_Mutex_Lock_support+0x174> _Thread_queue_Enqueue( 40006c08: 400195b7 lui a1,0x40019 40006c0c: 00c10693 addi a3,sp,12 40006c10: 00090613 mv a2,s2 40006c14: 68c58593 addi a1,a1,1676 # 4001968c <_Thread_queue_Operations_FIFO> 40006c18: f55ff06f j 40006b6c <_POSIX_Mutex_Lock_support+0xc4> 40006c1c: 00c12783 lw a5,12(sp) 40006c20: 3007a073 csrs mstatus,a5 return STATUS_UNAVAILABLE; 40006c24: 01000513 li a0,16 return _POSIX_Get_error( status ); 40006c28: fa5ff06f j 40006bcc <_POSIX_Mutex_Lock_support+0x124> the_mutex->Recursive.Mutex.Queue.Queue.owner = owner; 40006c2c: 01242823 sw s2,16(s0) 40006c30: 00c12783 lw a5,12(sp) 40006c34: 3007a073 csrs mstatus,a5 return STATUS_SUCCESSFUL; 40006c38: 00000513 li a0,0 40006c3c: f91ff06f j 40006bcc <_POSIX_Mutex_Lock_support+0x124> */ RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_priority( const Priority_Aggregation *aggregation ) { return aggregation->Node.priority; 40006c40: 03892683 lw a3,56(s2) if ( 40006c44: 03442703 lw a4,52(s0) queue_context->Priority.update_count = 0; 40006c48: 02012023 sw zero,32(sp) 40006c4c: 01c6a783 lw a5,28(a3) # 401c 40006c50: 04e7ee63 bltu a5,a4,40006cac <_POSIX_Mutex_Lock_support+0x204> 40006c54: 04f70663 beq a4,a5,40006ca0 <_POSIX_Mutex_Lock_support+0x1f8> the_mutex->Recursive.Mutex.Queue.Queue.owner = owner; 40006c58: 01242823 sw s2,16(s0) _Thread_Priority_add( 40006c5c: 00c10613 addi a2,sp,12 40006c60: 02040593 addi a1,s0,32 40006c64: 00090513 mv a0,s2 40006c68: 561020ef jal ra,400099c8 <_Thread_Priority_add> const ISR_lock_Context *lock_context ) { uint32_t disable_level; disable_level = cpu_self->thread_dispatch_disable_level; 40006c6c: 030a2783 lw a5,48(s4) _Profiling_Thread_dispatch_disable_critical( cpu_self, disable_level, lock_context ); cpu_self->thread_dispatch_disable_level = disable_level + 1; 40006c70: 00178793 addi a5,a5,1 40006c74: 02fa2823 sw a5,48(s4) 40006c78: 00c12783 lw a5,12(sp) 40006c7c: 3007a073 csrs mstatus,a5 _Thread_Priority_update( queue_context ); 40006c80: 00c10513 addi a0,sp,12 40006c84: 719020ef jal ra,40009b9c <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40006c88: bc0a8513 addi a0,s5,-1088 40006c8c: 1d0030ef jal ra,40009e5c <_Thread_Dispatch_enable> return STATUS_SUCCESSFUL; 40006c90: 00000513 li a0,0 40006c94: f39ff06f j 40006bcc <_POSIX_Mutex_Lock_support+0x124> POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006c98: 01600513 li a0,22 } 40006c9c: 00008067 ret if ( 40006ca0: 03042703 lw a4,48(s0) 40006ca4: 0186a783 lw a5,24(a3) 40006ca8: fae7f8e3 bgeu a5,a4,40006c58 <_POSIX_Mutex_Lock_support+0x1b0> 40006cac: 00c12783 lw a5,12(sp) 40006cb0: 3007a073 csrs mstatus,a5 return STATUS_MUTEX_CEILING_VIOLATED; 40006cb4: 01600513 li a0,22 40006cb8: f15ff06f j 40006bcc <_POSIX_Mutex_Lock_support+0x124> =============================================================================== 40005a4c <_POSIX_RWLock_Auto_initialization>: #include #include bool _POSIX_RWLock_Auto_initialization( POSIX_RWLock_Control *the_rwlock ) { 40005a4c: fd010113 addi sp,sp,-48 <== NOT EXECUTED POSIX_RWLock_Control zero; memset( &zero, 0, sizeof( zero ) ); if ( memcmp( the_rwlock, &zero, sizeof( *the_rwlock ) ) != 0 ) { 40005a50: 02000613 li a2,32 <== NOT EXECUTED 40005a54: 00010593 mv a1,sp <== NOT EXECUTED { 40005a58: 02812423 sw s0,40(sp) <== NOT EXECUTED 40005a5c: 02112623 sw ra,44(sp) <== NOT EXECUTED 40005a60: 00050413 mv s0,a0 <== NOT EXECUTED memset( &zero, 0, sizeof( zero ) ); 40005a64: 00012023 sw zero,0(sp) <== NOT EXECUTED 40005a68: 00012223 sw zero,4(sp) <== NOT EXECUTED 40005a6c: 00012423 sw zero,8(sp) <== NOT EXECUTED 40005a70: 00012623 sw zero,12(sp) <== NOT EXECUTED 40005a74: 00012823 sw zero,16(sp) <== NOT EXECUTED 40005a78: 00012a23 sw zero,20(sp) <== NOT EXECUTED 40005a7c: 00012c23 sw zero,24(sp) <== NOT EXECUTED 40005a80: 00012e23 sw zero,28(sp) <== NOT EXECUTED if ( memcmp( the_rwlock, &zero, sizeof( *the_rwlock ) ) != 0 ) { 40005a84: 38d0c0ef jal ra,40012610 <== NOT EXECUTED 40005a88: 02051463 bnez a0,40005ab0 <_POSIX_RWLock_Auto_initialization+0x64><== NOT EXECUTED return false; } the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC; 40005a8c: 9621e7b7 lui a5,0x9621e <== NOT EXECUTED 40005a90: abd78793 addi a5,a5,-1347 # 9621dabd <== NOT EXECUTED 40005a94: 00f447b3 xor a5,s0,a5 <== NOT EXECUTED return true; } 40005a98: 02c12083 lw ra,44(sp) <== NOT EXECUTED the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC; 40005a9c: 00f42023 sw a5,0(s0) <== NOT EXECUTED } 40005aa0: 02812403 lw s0,40(sp) <== NOT EXECUTED return true; 40005aa4: 00100513 li a0,1 <== NOT EXECUTED } 40005aa8: 03010113 addi sp,sp,48 <== NOT EXECUTED 40005aac: 00008067 ret <== NOT EXECUTED 40005ab0: 02c12083 lw ra,44(sp) <== NOT EXECUTED 40005ab4: 02812403 lw s0,40(sp) <== NOT EXECUTED return false; 40005ab8: 00000513 li a0,0 <== NOT EXECUTED } 40005abc: 03010113 addi sp,sp,48 <== NOT EXECUTED 40005ac0: 00008067 ret <== NOT EXECUTED =============================================================================== 40003fcc <_POSIX_Shm_Object_create_from_heap>: int _POSIX_Shm_Object_create_from_heap( POSIX_Shm_Object *shm_obj, size_t size ) { 40003fcc: ff010113 addi sp,sp,-16 <== NOT EXECUTED 40003fd0: 00812423 sw s0,8(sp) <== NOT EXECUTED 40003fd4: 00050413 mv s0,a0 <== NOT EXECUTED void *p = calloc( 1, size ); /* get zero'd memory */ 40003fd8: 00100513 li a0,1 <== NOT EXECUTED { 40003fdc: 00912223 sw s1,4(sp) <== NOT EXECUTED 40003fe0: 00112623 sw ra,12(sp) <== NOT EXECUTED 40003fe4: 00058493 mv s1,a1 <== NOT EXECUTED void *p = calloc( 1, size ); /* get zero'd memory */ 40003fe8: 7a5030ef jal ra,40007f8c <== NOT EXECUTED if ( p != NULL ) { 40003fec: 02050263 beqz a0,40004010 <_POSIX_Shm_Object_create_from_heap+0x44><== NOT EXECUTED shm_obj->handle = p; 40003ff0: 00a42023 sw a0,0(s0) <== NOT EXECUTED shm_obj->size = size; 40003ff4: 00942223 sw s1,4(s0) <== NOT EXECUTED } else { errno = EIO; } return 0; } 40003ff8: 00c12083 lw ra,12(sp) <== NOT EXECUTED 40003ffc: 00812403 lw s0,8(sp) <== NOT EXECUTED 40004000: 00412483 lw s1,4(sp) <== NOT EXECUTED 40004004: 00000513 li a0,0 <== NOT EXECUTED 40004008: 01010113 addi sp,sp,16 <== NOT EXECUTED 4000400c: 00008067 ret <== NOT EXECUTED errno = EIO; 40004010: 2110b0ef jal ra,4000fa20 <__errno> <== NOT EXECUTED 40004014: 00500793 li a5,5 <== NOT EXECUTED 40004018: 00f52023 sw a5,0(a0) <== NOT EXECUTED 4000401c: fddff06f j 40003ff8 <_POSIX_Shm_Object_create_from_heap+0x2c> <== NOT EXECUTED =============================================================================== 40005178 <_POSIX_Shm_Object_create_from_workspace>: int _POSIX_Shm_Object_create_from_workspace( POSIX_Shm_Object *shm_obj, size_t size ) { 40005178: ff010113 addi sp,sp,-16 <== NOT EXECUTED 4000517c: 00912223 sw s1,4(sp) <== NOT EXECUTED 40005180: 00050493 mv s1,a0 <== NOT EXECUTED shm_obj->handle = _Workspace_Allocate( size ); 40005184: 00058513 mv a0,a1 <== NOT EXECUTED { 40005188: 00812423 sw s0,8(sp) <== NOT EXECUTED 4000518c: 00112623 sw ra,12(sp) <== NOT EXECUTED 40005190: 00058413 mv s0,a1 <== NOT EXECUTED shm_obj->handle = _Workspace_Allocate( size ); 40005194: 4e4030ef jal ra,40008678 <_Workspace_Allocate> <== NOT EXECUTED 40005198: 00a4a023 sw a0,0(s1) <== NOT EXECUTED if ( shm_obj->handle == NULL ) { 4000519c: 02050663 beqz a0,400051c8 <_POSIX_Shm_Object_create_from_workspace+0x50><== NOT EXECUTED return ENOMEM; } memset( shm_obj->handle, 0, size ); 400051a0: 00040613 mv a2,s0 <== NOT EXECUTED 400051a4: 00000593 li a1,0 <== NOT EXECUTED 400051a8: 5e40b0ef jal ra,4001078c <== NOT EXECUTED shm_obj->size = size; return 0; } 400051ac: 00c12083 lw ra,12(sp) <== NOT EXECUTED shm_obj->size = size; 400051b0: 0084a223 sw s0,4(s1) <== NOT EXECUTED } 400051b4: 00812403 lw s0,8(sp) <== NOT EXECUTED 400051b8: 00412483 lw s1,4(sp) <== NOT EXECUTED return 0; 400051bc: 00000513 li a0,0 <== NOT EXECUTED } 400051c0: 01010113 addi sp,sp,16 <== NOT EXECUTED 400051c4: 00008067 ret <== NOT EXECUTED 400051c8: 00c12083 lw ra,12(sp) <== NOT EXECUTED 400051cc: 00812403 lw s0,8(sp) <== NOT EXECUTED 400051d0: 00412483 lw s1,4(sp) <== NOT EXECUTED return ENOMEM; 400051d4: 00c00513 li a0,12 <== NOT EXECUTED } 400051d8: 01010113 addi sp,sp,16 <== NOT EXECUTED 400051dc: 00008067 ret <== NOT EXECUTED =============================================================================== 4000414c <_POSIX_Shm_Object_mmap_from_heap>: POSIX_Shm_Object *shm_obj, size_t len, int prot, off_t off ) { 4000414c: 00050793 mv a5,a0 if ( shm_obj == NULL || shm_obj->handle == NULL ) 40004150: 02050863 beqz a0,40004180 <_POSIX_Shm_Object_mmap_from_heap+0x34><== NEVER TAKEN 40004154: 00052503 lw a0,0(a0) 40004158: 02050663 beqz a0,40004184 <_POSIX_Shm_Object_mmap_from_heap+0x38><== NEVER TAKEN return 0; /* This is already checked by mmap. Maybe make it a debug assert? */ if ( shm_obj->size < len + off ) { 4000415c: 00d58633 add a2,a1,a3 40004160: 00b635b3 sltu a1,a2,a1 40004164: 00e585b3 add a1,a1,a4 40004168: 0047a783 lw a5,4(a5) 4000416c: 00b04a63 bgtz a1,40004180 <_POSIX_Shm_Object_mmap_from_heap+0x34><== NEVER TAKEN 40004170: 00058663 beqz a1,4000417c <_POSIX_Shm_Object_mmap_from_heap+0x30><== ALWAYS TAKEN return NULL; } return (char*)shm_obj->handle + off; 40004174: 00d50533 add a0,a0,a3 40004178: 00008067 ret if ( shm_obj->size < len + off ) { 4000417c: fec7fce3 bgeu a5,a2,40004174 <_POSIX_Shm_Object_mmap_from_heap+0x28> return 0; 40004180: 00000513 li a0,0 <== NOT EXECUTED } 40004184: 00008067 ret <== NOT EXECUTED =============================================================================== 4000533c <_POSIX_Shm_Object_mmap_from_workspace>: POSIX_Shm_Object *shm_obj, size_t len, int prot, off_t off ) { 4000533c: 00050793 mv a5,a0 if ( shm_obj == NULL || shm_obj->handle == NULL ) 40005340: 02050863 beqz a0,40005370 <_POSIX_Shm_Object_mmap_from_workspace+0x34><== NEVER TAKEN 40005344: 00052503 lw a0,0(a0) 40005348: 02050663 beqz a0,40005374 <_POSIX_Shm_Object_mmap_from_workspace+0x38><== NEVER TAKEN return 0; /* This is already checked by mmap. Maybe make it a debug assert? */ if ( shm_obj->size < len + off ) { 4000534c: 00d58633 add a2,a1,a3 40005350: 00b635b3 sltu a1,a2,a1 40005354: 00e585b3 add a1,a1,a4 40005358: 0047a783 lw a5,4(a5) 4000535c: 00b04a63 bgtz a1,40005370 <_POSIX_Shm_Object_mmap_from_workspace+0x34><== NEVER TAKEN 40005360: 00058663 beqz a1,4000536c <_POSIX_Shm_Object_mmap_from_workspace+0x30><== ALWAYS TAKEN return NULL; } return (char*)shm_obj->handle + off; 40005364: 00d50533 add a0,a0,a3 40005368: 00008067 ret if ( shm_obj->size < len + off ) { 4000536c: fec7fce3 bgeu a5,a2,40005364 <_POSIX_Shm_Object_mmap_from_workspace+0x28> return 0; 40005370: 00000513 li a0,0 <== NOT EXECUTED } 40005374: 00008067 ret <== NOT EXECUTED =============================================================================== 400040ec <_POSIX_Shm_Object_read_from_heap>: POSIX_Shm_Object *shm_obj, void *buf, size_t count ) { if ( shm_obj == NULL || shm_obj->handle == NULL ) 400040ec: 04050c63 beqz a0,40004144 <_POSIX_Shm_Object_read_from_heap+0x58><== NOT EXECUTED 400040f0: 00058713 mv a4,a1 <== NOT EXECUTED 400040f4: 00052583 lw a1,0(a0) <== NOT EXECUTED 400040f8: 00050793 mv a5,a0 <== NOT EXECUTED return 0; 400040fc: 00000513 li a0,0 <== NOT EXECUTED if ( shm_obj == NULL || shm_obj->handle == NULL ) 40004100: 04058063 beqz a1,40004140 <_POSIX_Shm_Object_read_from_heap+0x54><== NOT EXECUTED { 40004104: ff010113 addi sp,sp,-16 <== NOT EXECUTED 40004108: 00812423 sw s0,8(sp) <== NOT EXECUTED 4000410c: 0047a403 lw s0,4(a5) <== NOT EXECUTED 40004110: 00112623 sw ra,12(sp) <== NOT EXECUTED 40004114: 02866263 bltu a2,s0,40004138 <_POSIX_Shm_Object_read_from_heap+0x4c><== NOT EXECUTED if ( shm_obj->size < count ) { count = shm_obj->size; } memcpy( buf, shm_obj->handle, count ); 40004118: 00040613 mv a2,s0 <== NOT EXECUTED 4000411c: 00070513 mv a0,a4 <== NOT EXECUTED 40004120: 22d0b0ef jal ra,4000fb4c <== NOT EXECUTED return count; } 40004124: 00c12083 lw ra,12(sp) <== NOT EXECUTED return count; 40004128: 00040513 mv a0,s0 <== NOT EXECUTED } 4000412c: 00812403 lw s0,8(sp) <== NOT EXECUTED 40004130: 01010113 addi sp,sp,16 <== NOT EXECUTED 40004134: 00008067 ret <== NOT EXECUTED 40004138: 00060413 mv s0,a2 <== NOT EXECUTED 4000413c: fddff06f j 40004118 <_POSIX_Shm_Object_read_from_heap+0x2c> <== NOT EXECUTED 40004140: 00008067 ret <== NOT EXECUTED return 0; 40004144: 00000513 li a0,0 <== NOT EXECUTED 40004148: 00008067 ret <== NOT EXECUTED =============================================================================== 400052dc <_POSIX_Shm_Object_read_from_workspace>: POSIX_Shm_Object *shm_obj, void *buf, size_t count ) { if ( shm_obj == NULL || shm_obj->handle == NULL ) 400052dc: 04050c63 beqz a0,40005334 <_POSIX_Shm_Object_read_from_workspace+0x58><== NEVER TAKEN 400052e0: 00058713 mv a4,a1 400052e4: 00052583 lw a1,0(a0) 400052e8: 00050793 mv a5,a0 return 0; 400052ec: 00000513 li a0,0 if ( shm_obj == NULL || shm_obj->handle == NULL ) 400052f0: 04058063 beqz a1,40005330 <_POSIX_Shm_Object_read_from_workspace+0x54><== NEVER TAKEN { 400052f4: ff010113 addi sp,sp,-16 400052f8: 00812423 sw s0,8(sp) 400052fc: 0047a403 lw s0,4(a5) 40005300: 00112623 sw ra,12(sp) 40005304: 02866263 bltu a2,s0,40005328 <_POSIX_Shm_Object_read_from_workspace+0x4c> if ( shm_obj->size < count ) { count = shm_obj->size; } memcpy( buf, shm_obj->handle, count ); 40005308: 00040613 mv a2,s0 4000530c: 00070513 mv a0,a4 40005310: 3540b0ef jal ra,40010664 return count; } 40005314: 00c12083 lw ra,12(sp) return count; 40005318: 00040513 mv a0,s0 } 4000531c: 00812403 lw s0,8(sp) 40005320: 01010113 addi sp,sp,16 40005324: 00008067 ret 40005328: 00060413 mv s0,a2 <== NOT EXECUTED 4000532c: fddff06f j 40005308 <_POSIX_Shm_Object_read_from_workspace+0x2c> <== NOT EXECUTED 40005330: 00008067 ret <== NOT EXECUTED return 0; 40005334: 00000513 li a0,0 <== NOT EXECUTED 40005338: 00008067 ret <== NOT EXECUTED =============================================================================== 40004064 <_POSIX_Shm_Object_resize_from_heap>: ) { void *p; int err = 0; if ( size < shm_obj->size ) { 40004064: 00452603 lw a2,4(a0) { 40004068: ff010113 addi sp,sp,-16 4000406c: 00812423 sw s0,8(sp) 40004070: 00912223 sw s1,4(sp) 40004074: 00112623 sw ra,12(sp) 40004078: 00050413 mv s0,a0 4000407c: 00058493 mv s1,a1 /* zero out if shrinking */ p = (void*)((uintptr_t)shm_obj->handle + (uintptr_t)size); 40004080: 00052503 lw a0,0(a0) if ( size < shm_obj->size ) { 40004084: 02c5ec63 bltu a1,a2,400040bc <_POSIX_Shm_Object_resize_from_heap+0x58> memset( p, 0, shm_obj->size - size ); } p = realloc( shm_obj->handle, size ); 40004088: 00048593 mv a1,s1 4000408c: 149040ef jal ra,400089d4 if ( p != NULL ) { 40004090: 04050a63 beqz a0,400040e4 <_POSIX_Shm_Object_resize_from_heap+0x80><== NEVER TAKEN shm_obj->handle = p; if ( size > shm_obj->size ) { 40004094: 00442603 lw a2,4(s0) shm_obj->handle = p; 40004098: 00a42023 sw a0,0(s0) if ( size > shm_obj->size ) { 4000409c: 02966c63 bltu a2,s1,400040d4 <_POSIX_Shm_Object_resize_from_heap+0x70> /* initialize added memory */ memset( p, 0, size - shm_obj->size ); } shm_obj->size = size; 400040a0: 00942223 sw s1,4(s0) int err = 0; 400040a4: 00000513 li a0,0 } else { err = EIO; } return err; } 400040a8: 00c12083 lw ra,12(sp) 400040ac: 00812403 lw s0,8(sp) 400040b0: 00412483 lw s1,4(sp) 400040b4: 01010113 addi sp,sp,16 400040b8: 00008067 ret memset( p, 0, shm_obj->size - size ); 400040bc: 00b50533 add a0,a0,a1 <== NOT EXECUTED 400040c0: 40b60633 sub a2,a2,a1 <== NOT EXECUTED 400040c4: 00000593 li a1,0 <== NOT EXECUTED 400040c8: 3ad0b0ef jal ra,4000fc74 <== NOT EXECUTED p = realloc( shm_obj->handle, size ); 400040cc: 00042503 lw a0,0(s0) <== NOT EXECUTED 400040d0: fb9ff06f j 40004088 <_POSIX_Shm_Object_resize_from_heap+0x24> <== NOT EXECUTED memset( p, 0, size - shm_obj->size ); 400040d4: 40c48633 sub a2,s1,a2 400040d8: 00000593 li a1,0 400040dc: 3990b0ef jal ra,4000fc74 400040e0: fc1ff06f j 400040a0 <_POSIX_Shm_Object_resize_from_heap+0x3c> err = EIO; 400040e4: 00500513 li a0,5 <== NOT EXECUTED return err; 400040e8: fc1ff06f j 400040a8 <_POSIX_Shm_Object_resize_from_heap+0x44> <== NOT EXECUTED =============================================================================== 40005224 <_POSIX_Shm_Object_resize_from_workspace>: int _POSIX_Shm_Object_resize_from_workspace( POSIX_Shm_Object *shm_obj, size_t size ) { 40005224: ff010113 addi sp,sp,-16 40005228: 00812423 sw s0,8(sp) 4000522c: 00112623 sw ra,12(sp) 40005230: 00912223 sw s1,4(sp) memset( shm_obj->handle, 0, shm_obj->size ); 40005234: 00052783 lw a5,0(a0) { 40005238: 00050413 mv s0,a0 int err; if ( size == 0 ) { 4000523c: 06058263 beqz a1,400052a0 <_POSIX_Shm_Object_resize_from_workspace+0x7c><== NEVER TAKEN err = _POSIX_Shm_Object_delete_from_workspace( shm_obj ); } else if ( shm_obj->handle == NULL && shm_obj->size == 0 ) { err = _POSIX_Shm_Object_create_from_workspace( shm_obj, size ); } else { /* Refuse to resize a workspace object. */ err = EIO; 40005240: 00500513 li a0,5 } else if ( shm_obj->handle == NULL && shm_obj->size == 0 ) { 40005244: 00078c63 beqz a5,4000525c <_POSIX_Shm_Object_resize_from_workspace+0x38><== ALWAYS TAKEN } return err; } 40005248: 00c12083 lw ra,12(sp) <== NOT EXECUTED 4000524c: 00812403 lw s0,8(sp) <== NOT EXECUTED 40005250: 00412483 lw s1,4(sp) <== NOT EXECUTED 40005254: 01010113 addi sp,sp,16 <== NOT EXECUTED 40005258: 00008067 ret <== NOT EXECUTED } else if ( shm_obj->handle == NULL && shm_obj->size == 0 ) { 4000525c: 00442783 lw a5,4(s0) 40005260: fe0794e3 bnez a5,40005248 <_POSIX_Shm_Object_resize_from_workspace+0x24><== NEVER TAKEN shm_obj->handle = _Workspace_Allocate( size ); 40005264: 00058513 mv a0,a1 40005268: 00058493 mv s1,a1 4000526c: 40c030ef jal ra,40008678 <_Workspace_Allocate> 40005270: 00a42023 sw a0,0(s0) if ( shm_obj->handle == NULL ) { 40005274: 06050063 beqz a0,400052d4 <_POSIX_Shm_Object_resize_from_workspace+0xb0><== NEVER TAKEN memset( shm_obj->handle, 0, size ); 40005278: 00048613 mv a2,s1 4000527c: 00000593 li a1,0 40005280: 50c0b0ef jal ra,4001078c } 40005284: 00c12083 lw ra,12(sp) shm_obj->size = size; 40005288: 00942223 sw s1,4(s0) } 4000528c: 00812403 lw s0,8(sp) 40005290: 00412483 lw s1,4(sp) return 0; 40005294: 00000513 li a0,0 } 40005298: 01010113 addi sp,sp,16 4000529c: 00008067 ret memset( shm_obj->handle, 0, shm_obj->size ); 400052a0: 00452603 lw a2,4(a0) <== NOT EXECUTED 400052a4: 00078513 mv a0,a5 <== NOT EXECUTED 400052a8: 4e40b0ef jal ra,4001078c <== NOT EXECUTED _Workspace_Free( shm_obj->handle ); 400052ac: 00042503 lw a0,0(s0) <== NOT EXECUTED 400052b0: 3e0030ef jal ra,40008690 <_Workspace_Free> <== NOT EXECUTED } 400052b4: 00c12083 lw ra,12(sp) <== NOT EXECUTED shm_obj->handle = NULL; 400052b8: 00042023 sw zero,0(s0) <== NOT EXECUTED shm_obj->size = 0; 400052bc: 00042223 sw zero,4(s0) <== NOT EXECUTED } 400052c0: 00812403 lw s0,8(sp) <== NOT EXECUTED 400052c4: 00412483 lw s1,4(sp) <== NOT EXECUTED err = _POSIX_Shm_Object_delete_from_workspace( shm_obj ); 400052c8: 00000513 li a0,0 <== NOT EXECUTED } 400052cc: 01010113 addi sp,sp,16 <== NOT EXECUTED 400052d0: 00008067 ret <== NOT EXECUTED return ENOMEM; 400052d4: 00c00513 li a0,12 <== NOT EXECUTED return err; 400052d8: f71ff06f j 40005248 <_POSIX_Shm_Object_resize_from_workspace+0x24><== NOT EXECUTED =============================================================================== 4000b734 <_POSIX_Timer_TSR>: /* * This is the operation that is run when a timer expires */ void _POSIX_Timer_TSR( Watchdog_Control *the_watchdog ) { 4000b734: ff010113 addi sp,sp,-16 4000b738: 00812423 sw s0,8(sp) 4000b73c: 00112623 sw ra,12(sp) 4000b740: 00912223 sw s1,4(sp) 4000b744: 01212023 sw s2,0(sp) POSIX_Timer_Control *ptimer; ISR_lock_Context lock_context; Per_CPU_Control *cpu; ptimer = RTEMS_CONTAINER_OF( the_watchdog, POSIX_Timer_Control, Timer ); 4000b748: ff050413 addi s0,a0,-16 __asm__ volatile ( 4000b74c: 300474f3 csrrci s1,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 4000b750: 0084f493 andi s1,s1,8 _ISR_lock_ISR_disable( &lock_context ); cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context ); /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 4000b754: 07442703 lw a4,116(s0) /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 4000b758: 05042783 lw a5,80(s0) 4000b75c: 05442683 lw a3,84(s0) ptimer->overrun = ptimer->overrun + 1; 4000b760: 00170713 addi a4,a4,1 4000b764: 06e42a23 sw a4,116(s0) if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 4000b768: 00d7e7b3 or a5,a5,a3 4000b76c: 00079663 bnez a5,4000b778 <_POSIX_Timer_TSR+0x44> 4000b770: 05842783 lw a5,88(s0) 4000b774: 06078863 beqz a5,4000b7e4 <_POSIX_Timer_TSR+0xb0> <== NEVER TAKEN ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 4000b778: 00300793 li a5,3 _Timecounter_Nanotime( tod ); 4000b77c: 07840513 addi a0,s0,120 4000b780: 02f40a23 sb a5,52(s0) ( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) { _POSIX_Timer_Insert( ptimer, cpu, ptimer->ticks ); 4000b784: 07042903 lw s2,112(s0) 4000b788: 8c1fb0ef jal ra,40007048 <_Timecounter_Nanotime> cpu->Watchdog.ticks + ticks 4000b78c: 400267b7 lui a5,0x40026 4000b790: 6c078793 addi a5,a5,1728 # 400266c0 <_Per_CPU_Information> _Watchdog_Insert( 4000b794: 0487a603 lw a2,72(a5) 4000b798: 04c7a683 lw a3,76(a5) 4000b79c: 40026537 lui a0,0x40026 4000b7a0: 00c90633 add a2,s2,a2 4000b7a4: 01263933 sltu s2,a2,s2 4000b7a8: 00d906b3 add a3,s2,a3 4000b7ac: 01040593 addi a1,s0,16 4000b7b0: 71050513 addi a0,a0,1808 # 40026710 <_Per_CPU_Information+0x50> 4000b7b4: d20ff0ef jal ra,4000acd4 <_Watchdog_Insert> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000b7b8: 3004a073 csrs mstatus,s1 /* * The sending of the signal to the process running the handling function * specified for that signal is simulated */ if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) { 4000b7bc: 03c42583 lw a1,60(s0) 4000b7c0: 03042503 lw a0,48(s0) 4000b7c4: 484020ef jal ra,4000dc48 /* After the signal handler returns, the count of expirations of the * timer must be set to 0. */ ptimer->overrun = 0; } 4000b7c8: 00c12083 lw ra,12(sp) ptimer->overrun = 0; 4000b7cc: 06042a23 sw zero,116(s0) } 4000b7d0: 00812403 lw s0,8(sp) 4000b7d4: 00412483 lw s1,4(sp) 4000b7d8: 00012903 lw s2,0(sp) 4000b7dc: 01010113 addi sp,sp,16 4000b7e0: 00008067 ret ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 4000b7e4: 00400793 li a5,4 <== NOT EXECUTED 4000b7e8: 02f40a23 sb a5,52(s0) <== NOT EXECUTED 4000b7ec: fcdff06f j 4000b7b8 <_POSIX_Timer_TSR+0x84> <== NOT EXECUTED =============================================================================== 40022a60 <_POSIX_signals_Clear_process_signals>: _Assert( _ISR_Get_level() != 0 ); clear_signal = true; mask = signo_to_mask( signo ); if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 40022a60: 00151793 slli a5,a0,0x1 40022a64: 00a787b3 add a5,a5,a0 40022a68: 4002d737 lui a4,0x4002d 40022a6c: 00279793 slli a5,a5,0x2 40022a70: 8a470713 addi a4,a4,-1884 # 4002c8a4 <_POSIX_signals_Vectors> 40022a74: 00f70733 add a4,a4,a5 40022a78: 00072603 lw a2,0(a4) 40022a7c: fff50513 addi a0,a0,-1 40022a80: 00100713 li a4,1 40022a84: 00200693 li a3,2 40022a88: 00a71533 sll a0,a4,a0 40022a8c: 00d60c63 beq a2,a3,40022aa4 <_POSIX_signals_Clear_process_signals+0x44> if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) clear_signal = false; } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; 40022a90: 9dc1a703 lw a4,-1572(gp) # 40027b04 <_POSIX_signals_Pending> 40022a94: fff54513 not a0,a0 40022a98: 00e57533 and a0,a0,a4 40022a9c: 9ca1ae23 sw a0,-1572(gp) # 40027b04 <_POSIX_signals_Pending> } } 40022aa0: 00008067 ret return _Chain_Immutable_head( the_chain )->next; 40022aa4: 4002c737 lui a4,0x4002c 40022aa8: 72470713 addi a4,a4,1828 # 4002c724 <_POSIX_signals_Siginfo> 40022aac: 00e786b3 add a3,a5,a4 if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) 40022ab0: 0006a683 lw a3,0(a3) return &the_chain->Tail.Node; 40022ab4: 00478793 addi a5,a5,4 40022ab8: 00e787b3 add a5,a5,a4 40022abc: fcf68ae3 beq a3,a5,40022a90 <_POSIX_signals_Clear_process_signals+0x30> } 40022ac0: 00008067 ret <== NOT EXECUTED =============================================================================== 40022030 <_POSIX_signals_Send>: int _POSIX_signals_Send( pid_t pid, int sig, const union sigval *value ) { 40022030: fd010113 addi sp,sp,-48 40022034: 02812423 sw s0,40(sp) 40022038: 02912223 sw s1,36(sp) 4002203c: 03212023 sw s2,32(sp) 40022040: 02112623 sw ra,44(sp) 40022044: 01312e23 sw s3,28(sp) 40022048: 01412c23 sw s4,24(sp) 4002204c: 00050493 mv s1,a0 40022050: 00058413 mv s0,a1 40022054: 00060913 mv s2,a2 Per_CPU_Control *cpu_self; /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) 40022058: d9dff0ef jal ra,40021df4 4002205c: 2e951c63 bne a0,s1,40022354 <_POSIX_signals_Send+0x324> rtems_set_errno_and_return_minus_one( ESRCH ); /* * Validate the signal passed. */ if ( !sig ) 40022060: 2e040063 beqz s0,40022340 <_POSIX_signals_Send+0x310> static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 40022064: fff40713 addi a4,s0,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 40022068: 01f00793 li a5,31 4002206c: 2ce7ea63 bltu a5,a4,40022340 <_POSIX_signals_Send+0x310> rtems_set_errno_and_return_minus_one( EINVAL ); /* * If the signal is being ignored, then we are out of here. */ if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) 40022070: 00141a13 slli s4,s0,0x1 40022074: 008a07b3 add a5,s4,s0 40022078: 4002d9b7 lui s3,0x4002d 4002207c: 8a498993 addi s3,s3,-1884 # 4002c8a4 <_POSIX_signals_Vectors> 40022080: 00279793 slli a5,a5,0x2 40022084: 00f987b3 add a5,s3,a5 40022088: 0087a783 lw a5,8(a5) 4002208c: 00100493 li s1,1 40022090: 24978c63 beq a5,s1,400222e8 <_POSIX_signals_Send+0x2b8> /* * P1003.1c/Draft 10, p. 33 says that certain signals should always * be directed to the executing thread such as those caused by hardware * faults. */ if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) ) 40022094: ffc40793 addi a5,s0,-4 40022098: ffb7f793 andi a5,a5,-5 4002209c: 20078463 beqz a5,400222a4 <_POSIX_signals_Send+0x274> 400220a0: 00b00793 li a5,11 400220a4: 20f40063 beq s0,a5,400222a4 <_POSIX_signals_Send+0x274> /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; siginfo->si_code = SI_USER; 400220a8: 00912423 sw s1,8(sp) siginfo->si_signo = sig; 400220ac: 00812223 sw s0,4(sp) return 1u << (sig - 1); 400220b0: 00e494b3 sll s1,s1,a4 if ( !value ) { 400220b4: 24090c63 beqz s2,4002230c <_POSIX_signals_Send+0x2dc> siginfo->si_value.sival_int = 0; } else { siginfo->si_value = *value; 400220b8: 00092783 lw a5,0(s2) 400220bc: 00f12623 sw a5,12(sp) disable_level = cpu_self->thread_dispatch_disable_level; 400220c0: 4002c937 lui s2,0x4002c 400220c4: ac090793 addi a5,s2,-1344 # 4002bac0 <_Per_CPU_Information> 400220c8: 0387a503 lw a0,56(a5) 400220cc: 0307a703 lw a4,48(a5) * get it an execute it as soon as the dispatcher executes. */ the_thread = _Per_CPU_Get_executing( cpu_self ); api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { 400220d0: 19852683 lw a3,408(a0) cpu_self->thread_dispatch_disable_level = disable_level + 1; 400220d4: 00170713 addi a4,a4,1 400220d8: 02e7a823 sw a4,48(a5) 400220dc: 0686a783 lw a5,104(a3) 400220e0: 00f4f7b3 and a5,s1,a5 400220e4: 0c079463 bnez a5,400221ac <_POSIX_signals_Send+0x17c> * There is no requirement on the order of threads pending on a sigwait(). */ /* XXX violation of visibility -- need to define thread queue support */ heads = _POSIX_signals_Wait_queue.Queue.heads; 400220e8: 400287b7 lui a5,0x40028 400220ec: 91c7a603 lw a2,-1764(a5) # 4002791c <_POSIX_signals_Wait_queue> if ( heads != NULL ) { 400220f0: 00060863 beqz a2,40022100 <_POSIX_signals_Send+0xd0> return _Chain_Immutable_head( the_chain )->next; 400220f4: 00062783 lw a5,0(a2) return &the_chain->Tail.Node; 400220f8: 00460613 addi a2,a2,4 Chain_Control *the_chain = &heads->Heads.Fifo; for ( the_node = _Chain_First( the_chain ); 400220fc: 18c79863 bne a5,a2,4002228c <_POSIX_signals_Send+0x25c> 40022100: 40025337 lui t1,0x40025 40022104: aac30313 addi t1,t1,-1364 # 40024aac <_Objects_Information_table> 40022108: 00010eb7 lui t4,0x10 4002210c: 00830f13 addi t5,t1,8 { 40022110: fff00e13 li t3,-1 40022114: fff00593 li a1,-1 40022118: 00000513 li a0,0 4002211c: fffe8e93 addi t4,t4,-1 # ffff */ RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal ( States_Control the_states ) { return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL); 40022120: 10000fb7 lui t6,0x10000 interested = NULL; interested_priority = UINT64_MAX; for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) { _Assert( _Objects_Information_table[ the_api ] != NULL ); the_info = _Objects_Information_table[ the_api ][ 1 ]; 40022124: 00832783 lw a5,8(t1) 40022128: 0047a783 lw a5,4(a5) if ( !the_info ) 4002212c: 06078a63 beqz a5,400221a0 <_POSIX_signals_Send+0x170> return 40022130: 0007a803 lw a6,0(a5) continue; maximum = _Objects_Get_maximum_index( the_info ); object_table = the_info->local_table; 40022134: 0047a783 lw a5,4(a5) 40022138: 01d87833 and a6,a6,t4 for ( index = 0 ; index < maximum ; ++index ) { 4002213c: 06080263 beqz a6,400221a0 <_POSIX_signals_Send+0x170> <== NEVER TAKEN 40022140: 00281813 slli a6,a6,0x2 40022144: 01078833 add a6,a5,a6 the_thread = (Thread_Control *) object_table[ index ]; 40022148: 0007a703 lw a4,0(a5) if ( !the_thread ) 4002214c: 04070663 beqz a4,40022198 <_POSIX_signals_Send+0x168> return aggregation->Node.priority; 40022150: 03872603 lw a2,56(a4) 40022154: 01c62683 lw a3,28(a2) 40022158: 01862883 lw a7,24(a2) /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( _Thread_Get_priority( the_thread ) > interested_priority ) 4002215c: 02d5ee63 bltu a1,a3,40022198 <_POSIX_signals_Send+0x168> 40022160: 18b68063 beq a3,a1,400222e0 <_POSIX_signals_Send+0x2b0> #if defined(RTEMS_DEBUG) if ( !api ) continue; #endif if ( !_POSIX_signals_Is_interested( api, mask ) ) 40022164: 19872603 lw a2,408(a4) 40022168: 06862603 lw a2,104(a2) 4002216c: 00c4f633 and a2,s1,a2 40022170: 02060463 beqz a2,40022198 <_POSIX_signals_Send+0x168> * * NOTE: We initialized interested_priority to PRIORITY_MAXIMUM + 1 * so we never have to worry about deferencing a NULL * interested thread. */ if ( _Thread_Get_priority( the_thread ) < interested_priority ) { 40022174: 14b6ee63 bltu a3,a1,400222d0 <_POSIX_signals_Send+0x2a0> 40022178: 14d58a63 beq a1,a3,400222cc <_POSIX_signals_Send+0x29c> * and blocking interruptibutable by signal. * * If the interested thread is ready, don't think about changing. */ if ( interested && !_States_Is_ready( interested->current_state ) ) { 4002217c: 00050e63 beqz a0,40022198 <_POSIX_signals_Send+0x168> <== NEVER TAKEN 40022180: 01c52603 lw a2,28(a0) 40022184: 00060a63 beqz a2,40022198 <_POSIX_signals_Send+0x168> /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 40022188: 01c72283 lw t0,28(a4) 4002218c: 14028263 beqz t0,400222d0 <_POSIX_signals_Send+0x2a0> 40022190: 01f67633 and a2,a2,t6 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { 40022194: 18060063 beqz a2,40022314 <_POSIX_signals_Send+0x2e4> for ( index = 0 ; index < maximum ; ++index ) { 40022198: 00478793 addi a5,a5,4 4002219c: faf816e3 bne a6,a5,40022148 <_POSIX_signals_Send+0x118> for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) { 400221a0: 00430313 addi t1,t1,4 400221a4: f9e310e3 bne t1,t5,40022124 <_POSIX_signals_Send+0xf4> } } } } if ( interested ) { 400221a8: 00050a63 beqz a0,400221bc <_POSIX_signals_Send+0x18c> /* * Returns true if the signal was synchronously given to a thread * blocked waiting for the signal. */ if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) { 400221ac: 00410613 addi a2,sp,4 400221b0: 00040593 mv a1,s0 400221b4: 440000ef jal ra,400225f4 <_POSIX_signals_Unblock_thread> 400221b8: 08051a63 bnez a0,4002224c <_POSIX_signals_Send+0x21c> /* * We may have woken up a thread but we definitely need to post the * signal to the process wide information set. */ _POSIX_signals_Set_process_signals( mask ); 400221bc: 00048513 mv a0,s1 400221c0: 254000ef jal ra,40022414 <_POSIX_signals_Set_process_signals> __asm__ volatile ( 400221c4: 30047773 csrrci a4,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 400221c8: 00877713 andi a4,a4,8 _Thread_queue_Context_initialize( &queue_context ); _POSIX_signals_Acquire( &queue_context ); if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { 400221cc: 008a0433 add s0,s4,s0 400221d0: 00241413 slli s0,s0,0x2 400221d4: 008989b3 add s3,s3,s0 400221d8: 0009a683 lw a3,0(s3) 400221dc: 00200793 li a5,2 400221e0: 06f69463 bne a3,a5,40022248 <_POSIX_signals_Send+0x218> return _Chain_Immutable_head( the_chain )->next; 400221e4: 4002c6b7 lui a3,0x4002c 400221e8: 71868693 addi a3,a3,1816 # 4002c718 <_POSIX_signals_Inactive_siginfo> 400221ec: 0006a783 lw a5,0(a3) if ( !_Chain_Is_empty(the_chain)) 400221f0: 4002c637 lui a2,0x4002c 400221f4: 71c60613 addi a2,a2,1820 # 4002c71c <_POSIX_signals_Inactive_siginfo+0x4> 400221f8: 12c78463 beq a5,a2,40022320 <_POSIX_signals_Send+0x2f0> new_first = old_first->next; 400221fc: 0007a803 lw a6,0(a5) rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; _Chain_Append_unprotected( 40022200: 4002c637 lui a2,0x4002c psiginfo->Info = *siginfo; 40022204: 00c12883 lw a7,12(sp) 40022208: 00812303 lw t1,8(sp) 4002220c: 00412e03 lw t3,4(sp) _Chain_Append_unprotected( 40022210: 72460613 addi a2,a2,1828 # 4002c724 <_POSIX_signals_Siginfo> new_first->previous = head; 40022214: 00d82223 sw a3,4(a6) 40022218: 00c40533 add a0,s0,a2 return &the_chain->Tail.Node; 4002221c: 00440413 addi s0,s0,4 old_last = tail->previous; 40022220: 00852583 lw a1,8(a0) head->next = new_first; 40022224: 0106a023 sw a6,0(a3) return &the_chain->Tail.Node; 40022228: 00c40433 add s0,s0,a2 psiginfo->Info = *siginfo; 4002222c: 01c7a423 sw t3,8(a5) 40022230: 0067a623 sw t1,12(a5) 40022234: 0117a823 sw a7,16(a5) the_node->next = tail; 40022238: 0087a023 sw s0,0(a5) tail->previous = the_node; 4002223c: 00f52423 sw a5,8(a0) old_last->next = the_node; 40022240: 00f5a023 sw a5,0(a1) the_node->previous = old_last; 40022244: 00b7a223 sw a1,4(a5) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40022248: 30072073 csrs mstatus,a4 ); } _POSIX_signals_Release( &queue_context ); DEBUG_STEP("\n"); _Thread_Dispatch_enable( cpu_self ); 4002224c: ac090513 addi a0,s2,-1344 40022250: ca8e50ef jal ra,400076f8 <_Thread_Dispatch_enable> return 0; 40022254: 00000513 li a0,0 } 40022258: 02c12083 lw ra,44(sp) 4002225c: 02812403 lw s0,40(sp) 40022260: 02412483 lw s1,36(sp) 40022264: 02012903 lw s2,32(sp) 40022268: 01c12983 lw s3,28(sp) 4002226c: 01812a03 lw s4,24(sp) 40022270: 03010113 addi sp,sp,48 40022274: 00008067 ret if (api->signals_unblocked & mask) 40022278: 0686a703 lw a4,104(a3) 4002227c: 00e4f733 and a4,s1,a4 40022280: f20716e3 bnez a4,400221ac <_POSIX_signals_Send+0x17c> the_node = the_node->next ) { 40022284: 0007a783 lw a5,0(a5) for ( the_node = _Chain_First( the_chain ); 40022288: e6c78ce3 beq a5,a2,40022100 <_POSIX_signals_Send+0xd0> return node->owner; 4002228c: ff87a503 lw a0,-8(a5) if (the_thread->Wait.option & mask) 40022290: 04852703 lw a4,72(a0) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 40022294: 19852683 lw a3,408(a0) if (the_thread->Wait.option & mask) 40022298: 00e4f733 and a4,s1,a4 4002229c: fc070ee3 beqz a4,40022278 <_POSIX_signals_Send+0x248> 400222a0: f0dff06f j 400221ac <_POSIX_signals_Send+0x17c> return pthread_kill( pthread_self(), sig ); 400222a4: 604000ef jal ra,400228a8 400222a8: 00040593 mv a1,s0 } 400222ac: 02812403 lw s0,40(sp) 400222b0: 02c12083 lw ra,44(sp) 400222b4: 02412483 lw s1,36(sp) 400222b8: 02012903 lw s2,32(sp) 400222bc: 01c12983 lw s3,28(sp) 400222c0: 01812a03 lw s4,24(sp) 400222c4: 03010113 addi sp,sp,48 return pthread_kill( pthread_self(), sig ); 400222c8: 4e40006f j 400227ac if ( _Thread_Get_priority( the_thread ) < interested_priority ) { 400222cc: ebc8f8e3 bgeu a7,t3,4002217c <_POSIX_signals_Send+0x14c> 400222d0: 00088e13 mv t3,a7 400222d4: 00068593 mv a1,a3 400222d8: 00070513 mv a0,a4 400222dc: ebdff06f j 40022198 <_POSIX_signals_Send+0x168> if ( _Thread_Get_priority( the_thread ) > interested_priority ) 400222e0: e91e72e3 bgeu t3,a7,40022164 <_POSIX_signals_Send+0x134> 400222e4: eb5ff06f j 40022198 <_POSIX_signals_Send+0x168> } 400222e8: 02c12083 lw ra,44(sp) 400222ec: 02812403 lw s0,40(sp) 400222f0: 02412483 lw s1,36(sp) 400222f4: 02012903 lw s2,32(sp) 400222f8: 01c12983 lw s3,28(sp) 400222fc: 01812a03 lw s4,24(sp) return 0; 40022300: 00000513 li a0,0 } 40022304: 03010113 addi sp,sp,48 40022308: 00008067 ret siginfo->si_value.sival_int = 0; 4002230c: 00012623 sw zero,12(sp) 40022310: db1ff06f j 400220c0 <_POSIX_signals_Send+0x90> 40022314: 01f2f2b3 and t0,t0,t6 if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) { 40022318: e80280e3 beqz t0,40022198 <_POSIX_signals_Send+0x168> 4002231c: fb5ff06f j 400222d0 <_POSIX_signals_Send+0x2a0> 40022320: 30072073 csrs mstatus,a4 _Thread_Dispatch_enable( cpu_self ); 40022324: ac090513 addi a0,s2,-1344 40022328: bd0e50ef jal ra,400076f8 <_Thread_Dispatch_enable> rtems_set_errno_and_return_minus_one( EAGAIN ); 4002232c: d80f30ef jal ra,400158ac <__errno> 40022330: 00b00793 li a5,11 40022334: 00f52023 sw a5,0(a0) 40022338: fff00513 li a0,-1 4002233c: f1dff06f j 40022258 <_POSIX_signals_Send+0x228> rtems_set_errno_and_return_minus_one( EINVAL ); 40022340: d6cf30ef jal ra,400158ac <__errno> 40022344: 01600793 li a5,22 40022348: 00f52023 sw a5,0(a0) 4002234c: fff00513 li a0,-1 40022350: f09ff06f j 40022258 <_POSIX_signals_Send+0x228> rtems_set_errno_and_return_minus_one( ESRCH ); 40022354: d58f30ef jal ra,400158ac <__errno> 40022358: 00300793 li a5,3 4002235c: 00f52023 sw a5,0(a0) 40022360: fff00513 li a0,-1 40022364: ef5ff06f j 40022258 <_POSIX_signals_Send+0x228> =============================================================================== 400225f4 <_POSIX_signals_Unblock_thread>: bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 400225f4: ff010113 addi sp,sp,-16 /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 400225f8: 01c52683 lw a3,28(a0) { 400225fc: 00912223 sw s1,4(sp) if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 40022600: 10000837 lui a6,0x10000 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 40022604: 19852483 lw s1,408(a0) if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 40022608: 40080713 addi a4,a6,1024 # 10000400 { 4002260c: 00812423 sw s0,8(sp) 40022610: 01212023 sw s2,0(sp) 40022614: fff58793 addi a5,a1,-1 40022618: 00100893 li a7,1 4002261c: 00112623 sw ra,12(sp) if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 40022620: 00e6f333 and t1,a3,a4 { 40022624: 00050413 mv s0,a0 40022628: 00f897b3 sll a5,a7,a5 _Chain_Append_if_is_off_chain_unprotected( 4002262c: 07048913 addi s2,s1,112 if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 40022630: 06e30263 beq t1,a4,40022694 <_POSIX_signals_Unblock_thread+0xa0> } /* * Thread is not waiting due to a sigwait. */ if ( api->signals_unblocked & mask ) { 40022634: 0684a703 lw a4,104(s1) 40022638: 00e7f7b3 and a5,a5,a4 4002263c: 00078663 beqz a5,40022648 <_POSIX_signals_Unblock_thread+0x54> 40022640: 0106f6b3 and a3,a3,a6 * it is not blocked, THEN * we need to dispatch at the end of this ISR. * + Any other combination, do nothing. */ if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) { 40022644: 12069463 bnez a3,4002276c <_POSIX_signals_Unblock_thread+0x178> __asm__ volatile ( 40022648: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 4002264c: 0087f793 andi a5,a5,8 action->handler = handler; 40022650: 40022737 lui a4,0x40022 40022654: 4e470713 addi a4,a4,1252 # 400224e4 <_POSIX_signals_Action_handler> 40022658: 06e4ac23 sw a4,120(s1) if ( _Chain_Is_node_off_chain( the_node ) ) { 4002265c: 0704a683 lw a3,112(s1) cpu_self->dispatch_necessary = true; 40022660: 4002c737 lui a4,0x4002c 40022664: ac070713 addi a4,a4,-1344 # 4002bac0 <_Per_CPU_Information> 40022668: 00100613 li a2,1 4002266c: 02c70a23 sb a2,52(a4) 40022670: 06068263 beqz a3,400226d4 <_POSIX_signals_Unblock_thread+0xe0> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40022674: 3007a073 csrs mstatus,a5 the_thread->Wait.return_code = STATUS_INTERRUPTED; _Thread_queue_Extract_with_proxy( the_thread ); } } return _POSIX_signals_Unblock_thread_done( the_thread, api, false ); } 40022678: 00c12083 lw ra,12(sp) 4002267c: 00812403 lw s0,8(sp) 40022680: 00412483 lw s1,4(sp) 40022684: 00012903 lw s2,0(sp) return _POSIX_signals_Unblock_thread_done( the_thread, api, false ); 40022688: 00000513 li a0,0 } 4002268c: 01010113 addi sp,sp,16 40022690: 00008067 ret if ( (the_thread->Wait.option & mask) || (api->signals_unblocked & mask) ) { 40022694: 04852703 lw a4,72(a0) 40022698: 00e7f733 and a4,a5,a4 4002269c: 04071a63 bnez a4,400226f0 <_POSIX_signals_Unblock_thread+0xfc> 400226a0: 0684a703 lw a4,104(s1) 400226a4: 00e7f7b3 and a5,a5,a4 400226a8: 04079463 bnez a5,400226f0 <_POSIX_signals_Unblock_thread+0xfc> __asm__ volatile ( 400226ac: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 400226b0: 0087f793 andi a5,a5,8 400226b4: 40022737 lui a4,0x40022 400226b8: 4e470713 addi a4,a4,1252 # 400224e4 <_POSIX_signals_Action_handler> 400226bc: 06e4ac23 sw a4,120(s1) 400226c0: 0704a683 lw a3,112(s1) 400226c4: 4002c737 lui a4,0x4002c 400226c8: ac070713 addi a4,a4,-1344 # 4002bac0 <_Per_CPU_Information> 400226cc: 03170a23 sb a7,52(a4) 400226d0: fa0692e3 bnez a3,40022674 <_POSIX_signals_Unblock_thread+0x80> <== NEVER TAKEN old_last = tail->previous; 400226d4: 0e042703 lw a4,224(s0) return &the_chain->Tail.Node; 400226d8: 0dc40693 addi a3,s0,220 the_node->next = tail; 400226dc: 06d4a823 sw a3,112(s1) tail->previous = the_node; 400226e0: 0f242023 sw s2,224(s0) old_last->next = the_node; 400226e4: 01272023 sw s2,0(a4) the_node->previous = old_last; 400226e8: 06e4aa23 sw a4,116(s1) } 400226ec: f89ff06f j 40022674 <_POSIX_signals_Unblock_thread+0x80> the_thread->Wait.return_code = STATUS_INTERRUPTED; 400226f0: 40d00793 li a5,1037 400226f4: 04f42623 sw a5,76(s0) the_info = (siginfo_t *) the_thread->Wait.return_argument; 400226f8: 04042783 lw a5,64(s0) if ( !info ) { 400226fc: 08060063 beqz a2,4002277c <_POSIX_signals_Unblock_thread+0x188> *the_info = *info; 40022700: 00062703 lw a4,0(a2) 40022704: 00e7a023 sw a4,0(a5) 40022708: 00462703 lw a4,4(a2) 4002270c: 00e7a223 sw a4,4(a5) 40022710: 00862703 lw a4,8(a2) 40022714: 00e7a423 sw a4,8(a5) _Thread_queue_Extract_with_proxy( the_thread ); 40022718: 00040513 mv a0,s0 4002271c: ff4eb0ef jal ra,4000df10 <_Thread_queue_Extract_with_proxy> __asm__ volatile ( 40022720: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40022724: 0087f793 andi a5,a5,8 40022728: 40022737 lui a4,0x40022 4002272c: 4e470713 addi a4,a4,1252 # 400224e4 <_POSIX_signals_Action_handler> 40022730: 06e4ac23 sw a4,120(s1) if ( _Chain_Is_node_off_chain( the_node ) ) { 40022734: 0704a683 lw a3,112(s1) 40022738: 4002c737 lui a4,0x4002c 4002273c: ac070713 addi a4,a4,-1344 # 4002bac0 <_Per_CPU_Information> 40022740: 00100613 li a2,1 40022744: 02c70a23 sb a2,52(a4) 40022748: 04068463 beqz a3,40022790 <_POSIX_signals_Unblock_thread+0x19c> <== ALWAYS TAKEN __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4002274c: 3007a073 csrs mstatus,a5 } 40022750: 00c12083 lw ra,12(sp) 40022754: 00812403 lw s0,8(sp) 40022758: 00412483 lw s1,4(sp) 4002275c: 00012903 lw s2,0(sp) return _POSIX_signals_Unblock_thread_done( the_thread, api, true ); 40022760: 00100513 li a0,1 } 40022764: 01010113 addi sp,sp,16 40022768: 00008067 ret the_thread->Wait.return_code = STATUS_INTERRUPTED; 4002276c: 40d00793 li a5,1037 40022770: 04f52623 sw a5,76(a0) _Thread_queue_Extract_with_proxy( the_thread ); 40022774: f9ceb0ef jal ra,4000df10 <_Thread_queue_Extract_with_proxy> 40022778: ed1ff06f j 40022648 <_POSIX_signals_Unblock_thread+0x54> the_info->si_code = SI_USER; 4002277c: 00100713 li a4,1 the_info->si_signo = signo; 40022780: 00b7a023 sw a1,0(a5) the_info->si_code = SI_USER; 40022784: 00e7a223 sw a4,4(a5) the_info->si_value.sival_int = 0; 40022788: 0007a423 sw zero,8(a5) 4002278c: f8dff06f j 40022718 <_POSIX_signals_Unblock_thread+0x124> old_last = tail->previous; 40022790: 0e042703 lw a4,224(s0) return &the_chain->Tail.Node; 40022794: 0dc40693 addi a3,s0,220 the_node->next = tail; 40022798: 06d4a823 sw a3,112(s1) tail->previous = the_node; 4002279c: 0f242023 sw s2,224(s0) old_last->next = the_node; 400227a0: 01272023 sw s2,0(a4) the_node->previous = old_last; 400227a4: 06e4aa23 sw a4,116(s1) } 400227a8: fa5ff06f j 4002274c <_POSIX_signals_Unblock_thread+0x158> =============================================================================== 4000828c : int aio_fsync( int op, struct aiocb *aiocbp ) { 4000828c: ff010113 addi sp,sp,-16 40008290: 00812423 sw s0,8(sp) 40008294: 00912223 sw s1,4(sp) 40008298: 00112623 sw ra,12(sp) rtems_aio_request *req; int mode; if (op != O_SYNC) 4000829c: 000027b7 lui a5,0x2 { 400082a0: 00058413 mv s0,a1 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 400082a4: 01600493 li s1,22 if (op != O_SYNC) 400082a8: 04f51a63 bne a0,a5,400082fc mode = fcntl (aiocbp->aio_fildes, F_GETFL); 400082ac: 0005a503 lw a0,0(a1) 400082b0: 00300593 li a1,3 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 400082b4: 00900493 li s1,9 mode = fcntl (aiocbp->aio_fildes, F_GETFL); 400082b8: 44d000ef jal ra,40008f04 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 400082bc: 00357513 andi a0,a0,3 400082c0: fff50513 addi a0,a0,-1 400082c4: 00100793 li a5,1 400082c8: 02a7ea63 bltu a5,a0,400082fc req = malloc (sizeof (rtems_aio_request)); 400082cc: 01800513 li a0,24 400082d0: 989f80ef jal ra,40000c58 if (req == NULL) 400082d4: 02050263 beqz a0,400082f8 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_SYNC; 400082d8: 00300713 li a4,3 400082dc: 02e42823 sw a4,48(s0) req->aiocbp = aiocbp; 400082e0: 00852a23 sw s0,20(a0) return rtems_aio_enqueue (req); } 400082e4: 00812403 lw s0,8(sp) 400082e8: 00c12083 lw ra,12(sp) 400082ec: 00412483 lw s1,4(sp) 400082f0: 01010113 addi sp,sp,16 return rtems_aio_enqueue (req); 400082f4: 6cc0006f j 400089c0 rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 400082f8: 00b00493 li s1,11 <== NOT EXECUTED 400082fc: fff00793 li a5,-1 40008300: 02942a23 sw s1,52(s0) 40008304: 02f42c23 sw a5,56(s0) 40008308: 431080ef jal ra,40010f38 <__errno> } 4000830c: 00c12083 lw ra,12(sp) 40008310: 00812403 lw s0,8(sp) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008314: 00952023 sw s1,0(a0) } 40008318: 00412483 lw s1,4(sp) 4000831c: fff00513 li a0,-1 40008320: 01010113 addi sp,sp,16 40008324: 00008067 ret =============================================================================== 40008bcc : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { 40008bcc: ff010113 addi sp,sp,-16 40008bd0: 00812423 sw s0,8(sp) 40008bd4: 00050413 mv s0,a0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 40008bd8: 00052503 lw a0,0(a0) 40008bdc: 00300593 li a1,3 { 40008be0: 00912223 sw s1,4(sp) 40008be4: 00112623 sw ra,12(sp) mode = fcntl (aiocbp->aio_fildes, F_GETFL); 40008be8: 31c000ef jal ra,40008f04 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) 40008bec: 00157513 andi a0,a0,1 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 40008bf0: 00900493 li s1,9 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) 40008bf4: 02050863 beqz a0,40008c24 if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008bf8: fff00793 li a5,-1 40008bfc: 02942a23 sw s1,52(s0) 40008c00: 02f42c23 sw a5,56(s0) 40008c04: 334080ef jal ra,40010f38 <__errno> req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_READ; return rtems_aio_enqueue (req); } 40008c08: 00c12083 lw ra,12(sp) 40008c0c: 00812403 lw s0,8(sp) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008c10: 00952023 sw s1,0(a0) } 40008c14: 00412483 lw s1,4(sp) 40008c18: fff00513 li a0,-1 40008c1c: 01010113 addi sp,sp,16 40008c20: 00008067 ret if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 40008c24: 01842783 lw a5,24(s0) 40008c28: 02079c63 bnez a5,40008c60 if (aiocbp->aio_offset < 0) 40008c2c: 00c42783 lw a5,12(s0) 40008c30: 0207c863 bltz a5,40008c60 req = malloc (sizeof (rtems_aio_request)); 40008c34: 01800513 li a0,24 40008c38: 820f80ef jal ra,40000c58 if (req == NULL) 40008c3c: 02050663 beqz a0,40008c68 <== NEVER TAKEN req->aiocbp->aio_lio_opcode = LIO_READ; 40008c40: 00100713 li a4,1 40008c44: 02e42823 sw a4,48(s0) req->aiocbp = aiocbp; 40008c48: 00852a23 sw s0,20(a0) } 40008c4c: 00812403 lw s0,8(sp) 40008c50: 00c12083 lw ra,12(sp) 40008c54: 00412483 lw s1,4(sp) 40008c58: 01010113 addi sp,sp,16 return rtems_aio_enqueue (req); 40008c5c: d65ff06f j 400089c0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 40008c60: 01600493 li s1,22 40008c64: f95ff06f j 40008bf8 rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008c68: 00b00493 li s1,11 <== NOT EXECUTED 40008c6c: f8dff06f j 40008bf8 <== NOT EXECUTED =============================================================================== 40008c78 : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { 40008c78: ff010113 addi sp,sp,-16 40008c7c: 00812423 sw s0,8(sp) 40008c80: 00050413 mv s0,a0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 40008c84: 00052503 lw a0,0(a0) 40008c88: 00300593 li a1,3 { 40008c8c: 00912223 sw s1,4(sp) 40008c90: 00112623 sw ra,12(sp) mode = fcntl (aiocbp->aio_fildes, F_GETFL); 40008c94: 270000ef jal ra,40008f04 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 40008c98: 00357513 andi a0,a0,3 40008c9c: fff50513 addi a0,a0,-1 40008ca0: 00100793 li a5,1 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 40008ca4: 00900493 li s1,9 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 40008ca8: 04a7e263 bltu a5,a0,40008cec if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 40008cac: 01842783 lw a5,24(s0) 40008cb0: 02079c63 bnez a5,40008ce8 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 40008cb4: 00c42783 lw a5,12(s0) 40008cb8: 0207c863 bltz a5,40008ce8 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 40008cbc: 01800513 li a0,24 40008cc0: f99f70ef jal ra,40000c58 if (req == NULL) 40008cc4: 04050a63 beqz a0,40008d18 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_WRITE; 40008cc8: 00200713 li a4,2 40008ccc: 02e42823 sw a4,48(s0) req->aiocbp = aiocbp; 40008cd0: 00852a23 sw s0,20(a0) return rtems_aio_enqueue (req); } 40008cd4: 00812403 lw s0,8(sp) 40008cd8: 00c12083 lw ra,12(sp) 40008cdc: 00412483 lw s1,4(sp) 40008ce0: 01010113 addi sp,sp,16 return rtems_aio_enqueue (req); 40008ce4: cddff06f j 400089c0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 40008ce8: 01600493 li s1,22 rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008cec: fff00793 li a5,-1 40008cf0: 02942a23 sw s1,52(s0) 40008cf4: 02f42c23 sw a5,56(s0) 40008cf8: 240080ef jal ra,40010f38 <__errno> } 40008cfc: 00c12083 lw ra,12(sp) 40008d00: 00812403 lw s0,8(sp) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008d04: 00952023 sw s1,0(a0) } 40008d08: 00412483 lw s1,4(sp) 40008d0c: fff00513 li a0,-1 40008d10: 01010113 addi sp,sp,16 40008d14: 00008067 ret rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 40008d18: 00b00493 li s1,11 <== NOT EXECUTED 40008d1c: fd1ff06f j 40008cec <== NOT EXECUTED =============================================================================== 4000fe2c : clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp ) { 4000fe2c: f9010113 addi sp,sp,-112 4000fe30: 07212023 sw s2,96(sp) 4000fe34: 05312e23 sw s3,92(sp) 4000fe38: 06112623 sw ra,108(sp) 4000fe3c: 06812423 sw s0,104(sp) 4000fe40: 06912223 sw s1,100(sp) struct timespec uptime; const struct timespec *end; Thread_Control *executing; int eno; if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) { 4000fe44: 00100793 li a5,1 { 4000fe48: 00060913 mv s2,a2 4000fe4c: 00068993 mv s3,a3 if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) { 4000fe50: 0cf50c63 beq a0,a5,4000ff28 4000fe54: 00400793 li a5,4 <== NOT EXECUTED return ENOTSUP; 4000fe58: 08600413 li s0,134 <== NOT EXECUTED if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) { 4000fe5c: 0af51663 bne a0,a5,4000ff08 <== NOT EXECUTED queue_context->thread_state = thread_state; 4000fe60: 100007b7 lui a5,0x10000 <== NOT EXECUTED 4000fe64: 10078793 addi a5,a5,256 # 10000100 <== NOT EXECUTED 4000fe68: 02f12823 sw a5,48(sp) <== NOT EXECUTED _Thread_queue_Context_set_thread_state( &queue_context, STATES_WAITING_FOR_TIME | STATES_INTERRUPTIBLE_BY_SIGNAL ); if ( ( flags & TIMER_ABSTIME ) != 0 ) { 4000fe6c: 0045f493 andi s1,a1,4 <== NOT EXECUTED 4000fe70: 0e048063 beqz s1,4000ff50 <== NOT EXECUTED queue_context->enqueue_callout = 4000fe74: 400097b7 lui a5,0x40009 <== NOT EXECUTED 4000fe78: 8cc78793 addi a5,a5,-1844 # 400088cc <_Thread_queue_Add_timeout_monotonic_timespec><== NOT EXECUTED queue_context->Timeout.arg = abstime; 4000fe7c: 03212c23 sw s2,56(sp) <== NOT EXECUTED queue_context->enqueue_callout = 4000fe80: 02f12a23 sw a5,52(sp) <== NOT EXECUTED __asm__ volatile ( 4000fe84: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 4000fe88: 0087f793 andi a5,a5,8 _ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context ); 4000fe8c: 02f12623 sw a5,44(sp) 4000fe90: 400177b7 lui a5,0x40017 4000fe94: 8387a403 lw s0,-1992(a5) # 40016838 <_Per_CPU_Information+0x38> ); } _Thread_queue_Acquire( &_Nanosleep_Pseudo_queue, &queue_context ); executing = _Thread_Executing; _Thread_queue_Enqueue( 4000fe98: 400115b7 lui a1,0x40011 4000fe9c: 40012537 lui a0,0x40012 4000fea0: 00040613 mv a2,s0 4000fea4: 02c10693 addi a3,sp,44 4000fea8: c9c58593 addi a1,a1,-868 # 40010c9c <_Thread_queue_Operations_FIFO> 4000feac: 0e050513 addi a0,a0,224 # 400120e0 <_Nanosleep_Pseudo_queue> 4000feb0: bb5f70ef jal ra,40007a64 <_Thread_queue_Enqueue> return _POSIX_Get_by_name_error_table[ error ]; } RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status ) { return STATUS_GET_POSIX( status ); 4000feb4: 04c42783 lw a5,76(s0) executing, &queue_context ); eno = _POSIX_Get_error_after_wait( executing ); if ( eno == ETIMEDOUT ) { 4000feb8: 07400713 li a4,116 4000febc: 41f7d413 srai s0,a5,0x1f 4000fec0: 0ff47413 andi s0,s0,255 4000fec4: 00f40433 add s0,s0,a5 4000fec8: 40845413 srai s0,s0,0x8 4000fecc: 10e40463 beq s0,a4,4000ffd4 eno = 0; } if ( rmtp != NULL && ( flags & TIMER_ABSTIME ) == 0 ) { 4000fed0: 02098c63 beqz s3,4000ff08 4000fed4: 02049a63 bnez s1,4000ff08 <== NEVER TAKEN if ( eno == EINTR ) { 4000fed8: 00400793 li a5,4 4000fedc: 10f41263 bne s0,a5,4000ffe0 struct timespec actual_end; _Timecounter_Nanouptime( &actual_end ); 4000fee0: 01810513 addi a0,sp,24 4000fee4: acdf60ef jal ra,400069b0 <_Timecounter_Nanouptime> if ( _Timespec_Less_than( &actual_end, end ) ) { 4000fee8: 00090593 mv a1,s2 4000feec: 01810513 addi a0,sp,24 4000fef0: 1b0000ef jal ra,400100a0 <_Timespec_Less_than> 4000fef4: 0e050663 beqz a0,4000ffe0 <== NEVER TAKEN _Timespec_Subtract( &actual_end, end, rmtp ); 4000fef8: 00098613 mv a2,s3 4000fefc: 00090593 mv a1,s2 4000ff00: 01810513 addi a0,sp,24 4000ff04: 1e4000ef jal ra,400100e8 <_Timespec_Subtract> _Timespec_Set_to_zero( rmtp ); } } return eno; } 4000ff08: 06c12083 lw ra,108(sp) 4000ff0c: 00040513 mv a0,s0 4000ff10: 06812403 lw s0,104(sp) 4000ff14: 06412483 lw s1,100(sp) 4000ff18: 06012903 lw s2,96(sp) 4000ff1c: 05c12983 lw s3,92(sp) 4000ff20: 07010113 addi sp,sp,112 4000ff24: 00008067 ret queue_context->thread_state = thread_state; 4000ff28: 100007b7 lui a5,0x10000 4000ff2c: 10078793 addi a5,a5,256 # 10000100 4000ff30: 02f12823 sw a5,48(sp) if ( ( flags & TIMER_ABSTIME ) != 0 ) { 4000ff34: 0045f493 andi s1,a1,4 4000ff38: 00048c63 beqz s1,4000ff50 queue_context->enqueue_callout = _Thread_queue_Add_timeout_realtime_timespec; 4000ff3c: 400097b7 lui a5,0x40009 4000ff40: 92078793 addi a5,a5,-1760 # 40008920 <_Thread_queue_Add_timeout_realtime_timespec> queue_context->Timeout.arg = abstime; 4000ff44: 03212c23 sw s2,56(sp) queue_context->enqueue_callout = _Thread_queue_Add_timeout_realtime_timespec; 4000ff48: 02f12a23 sw a5,52(sp) } 4000ff4c: f39ff06f j 4000fe84 _Timecounter_Nanouptime( &uptime ); 4000ff50: 00810513 addi a0,sp,8 4000ff54: a5df60ef jal ra,400069b0 <_Timecounter_Nanouptime> && (unsigned long) ts->tv_nsec < WATCHDOG_NANOSECONDS_PER_SECOND; 4000ff58: 06090263 beqz s2,4000ffbc 4000ff5c: 00892683 lw a3,8(s2) 4000ff60: 3b9ad637 lui a2,0x3b9ad 4000ff64: 9ff60613 addi a2,a2,-1537 # 3b9ac9ff 4000ff68: 0ad66663 bltu a2,a3,40010014 return _Watchdog_Is_valid_timespec( ts ) && ts->tv_sec >= 0; 4000ff6c: 00492583 lw a1,4(s2) 4000ff70: 00092783 lw a5,0(s2) 4000ff74: 0a05c063 bltz a1,40010014 sec += (uint64_t) delta->tv_sec; 4000ff78: 00c12503 lw a0,12(sp) 4000ff7c: 00812703 lw a4,8(sp) 4000ff80: 00a585b3 add a1,a1,a0 now->tv_nsec += delta->tv_nsec; 4000ff84: 01012503 lw a0,16(sp) sec += (uint64_t) delta->tv_sec; 4000ff88: 00e78733 add a4,a5,a4 4000ff8c: 00f737b3 sltu a5,a4,a5 now->tv_nsec += delta->tv_nsec; 4000ff90: 00a686b3 add a3,a3,a0 sec += (uint64_t) delta->tv_sec; 4000ff94: 00b787b3 add a5,a5,a1 if ( now->tv_nsec >= WATCHDOG_NANOSECONDS_PER_SECOND ) { 4000ff98: 08d64c63 blt a2,a3,40010030 now->tv_nsec += delta->tv_nsec; 4000ff9c: 00d12823 sw a3,16(sp) if ( sec <= INT64_MAX ) { 4000ffa0: 0007d863 bgez a5,4000ffb0 now->tv_sec = INT64_MAX; 4000ffa4: 800007b7 lui a5,0x80000 4000ffa8: fff00713 li a4,-1 4000ffac: fff7c793 not a5,a5 4000ffb0: 00e12423 sw a4,8(sp) 4000ffb4: 00f12623 sw a5,12(sp) return now; 4000ffb8: 00810913 addi s2,sp,8 queue_context->enqueue_callout = 4000ffbc: 400097b7 lui a5,0x40009 4000ffc0: 8cc78793 addi a5,a5,-1844 # 400088cc <_Thread_queue_Add_timeout_monotonic_timespec> queue_context->Timeout.arg = abstime; 4000ffc4: 03212c23 sw s2,56(sp) queue_context->enqueue_callout = 4000ffc8: 02f12a23 sw a5,52(sp) } 4000ffcc: 00000493 li s1,0 4000ffd0: eb5ff06f j 4000fe84 eno = 0; 4000ffd4: 00000413 li s0,0 if ( rmtp != NULL && ( flags & TIMER_ABSTIME ) == 0 ) { 4000ffd8: f20988e3 beqz s3,4000ff08 4000ffdc: f20496e3 bnez s1,4000ff08 <== NEVER TAKEN } 4000ffe0: 06c12083 lw ra,108(sp) 4000ffe4: 00040513 mv a0,s0 4000ffe8: 06812403 lw s0,104(sp) _Timespec_Set_to_zero( rmtp ); 4000ffec: 00000793 li a5,0 4000fff0: 00000813 li a6,0 4000fff4: 00f9a023 sw a5,0(s3) 4000fff8: 0109a223 sw a6,4(s3) 4000fffc: 0009a423 sw zero,8(s3) } 40010000: 06412483 lw s1,100(sp) 40010004: 06012903 lw s2,96(sp) 40010008: 05c12983 lw s3,92(sp) 4001000c: 07010113 addi sp,sp,112 40010010: 00008067 ret queue_context->enqueue_callout = 40010014: 400097b7 lui a5,0x40009 return NULL; 40010018: 00000913 li s2,0 4001001c: 8cc78793 addi a5,a5,-1844 # 400088cc <_Thread_queue_Add_timeout_monotonic_timespec> queue_context->Timeout.arg = abstime; 40010020: 03212c23 sw s2,56(sp) queue_context->enqueue_callout = 40010024: 02f12a23 sw a5,52(sp) } 40010028: 00000493 li s1,0 4001002c: e59ff06f j 4000fe84 ++sec; 40010030: 00170613 addi a2,a4,1 40010034: 00e635b3 sltu a1,a2,a4 now->tv_nsec -= WATCHDOG_NANOSECONDS_PER_SECOND; 40010038: c4653737 lui a4,0xc4653 4001003c: 60070713 addi a4,a4,1536 # c4653600 40010040: 00e686b3 add a3,a3,a4 40010044: 00d12823 sw a3,16(sp) ++sec; 40010048: 00060713 mv a4,a2 4001004c: 00f587b3 add a5,a1,a5 40010050: f51ff06f j 4000ffa0 =============================================================================== 400038ac : int clock_settime( clockid_t clock_id, const struct timespec *tp ) { 400038ac: fe010113 addi sp,sp,-32 400038b0: 00112e23 sw ra,28(sp) 400038b4: 00812c23 sw s0,24(sp) Status_Control status; if ( !tp ) 400038b8: 00058e63 beqz a1,400038d4 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 400038bc: 00100793 li a5,1 400038c0: 04f50e63 beq a0,a5,4000391c if ( status != STATUS_SUCCESSFUL ) { rtems_set_errno_and_return_minus_one( STATUS_GET_POSIX( status ) ); } } #ifdef _POSIX_CPUTIME else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID ) { 400038c4: 00200793 li a5,2 400038c8: 02f50863 beq a0,a5,400038f8 rtems_set_errno_and_return_minus_one( ENOSYS ); } #endif #ifdef _POSIX_THREAD_CPUTIME else if ( clock_id == CLOCK_THREAD_CPUTIME_ID ) { 400038cc: 00300793 li a5,3 400038d0: 02f50463 beq a0,a5,400038f8 rtems_set_errno_and_return_minus_one( ENOSYS ); } #endif else { rtems_set_errno_and_return_minus_one( EINVAL ); 400038d4: 5600c0ef jal ra,4000fe34 <__errno> 400038d8: 01600793 li a5,22 400038dc: 00f52023 sw a5,0(a0) 400038e0: fff00413 li s0,-1 } return 0; } 400038e4: 01c12083 lw ra,28(sp) 400038e8: 00040513 mv a0,s0 400038ec: 01812403 lw s0,24(sp) 400038f0: 02010113 addi sp,sp,32 400038f4: 00008067 ret rtems_set_errno_and_return_minus_one( ENOSYS ); 400038f8: 53c0c0ef jal ra,4000fe34 <__errno> 400038fc: fff00413 li s0,-1 40003900: 05800793 li a5,88 } 40003904: 01c12083 lw ra,28(sp) rtems_set_errno_and_return_minus_one( ENOSYS ); 40003908: 00f52023 sw a5,0(a0) } 4000390c: 00040513 mv a0,s0 40003910: 01812403 lw s0,24(sp) 40003914: 02010113 addi sp,sp,32 40003918: 00008067 ret _TOD_Lock(); 4000391c: 00058413 mv s0,a1 40003920: 5a5000ef jal ra,400046c4 <_TOD_Lock> __asm__ volatile ( 40003924: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40003928: 0087f793 andi a5,a5,8 _Timecounter_Acquire( lock_context ); 4000392c: 00f12623 sw a5,12(sp) status = _TOD_Set( tp, &lock_context ); 40003930: 00040513 mv a0,s0 40003934: 00c10593 addi a1,sp,12 40003938: 5a5000ef jal ra,400046dc <_TOD_Set> 4000393c: 00050413 mv s0,a0 _TOD_Unlock(); 40003940: 591000ef jal ra,400046d0 <_TOD_Unlock> if ( status != STATUS_SUCCESSFUL ) { 40003944: fa0400e3 beqz s0,400038e4 rtems_set_errno_and_return_minus_one( STATUS_GET_POSIX( status ) ); 40003948: 4ec0c0ef jal ra,4000fe34 <__errno> 4000394c: 41f45793 srai a5,s0,0x1f 40003950: 0ff7f793 andi a5,a5,255 40003954: 008787b3 add a5,a5,s0 40003958: 4087d793 srai a5,a5,0x8 4000395c: 00f52023 sw a5,0(a0) 40003960: fff00413 li s0,-1 40003964: f81ff06f j 400038e4 =============================================================================== 40004470 : CHAIN_DEFINE_EMPTY( mmap_mappings ); void *mmap( void *addr, size_t len, int prot, int flags, int fildes, off_t off ) { 40004470: f4010113 addi sp,sp,-192 40004474: 0a812c23 sw s0,184(sp) 40004478: 0b212823 sw s2,176(sp) 4000447c: 0b312623 sw s3,172(sp) 40004480: 0b412423 sw s4,168(sp) 40004484: 0b512223 sw s5,164(sp) 40004488: 0b612023 sw s6,160(sp) 4000448c: 09712e23 sw s7,156(sp) 40004490: 0a112e23 sw ra,188(sp) 40004494: 0a912a23 sw s1,180(sp) 40004498: 09812c23 sw s8,152(sp) 4000449c: 09912a23 sw s9,148(sp) 400044a0: 09a12823 sw s10,144(sp) 400044a4: 09b12623 sw s11,140(sp) 400044a8: 00050a13 mv s4,a0 400044ac: 00058993 mv s3,a1 400044b0: 00060913 mv s2,a2 400044b4: 00068413 mv s0,a3 400044b8: 00070a93 mv s5,a4 400044bc: 00078b93 mv s7,a5 400044c0: 00080b13 mv s6,a6 map_anonymous = (flags & MAP_ANON) == MAP_ANON; map_shared = (flags & MAP_SHARED) == MAP_SHARED; map_private = (flags & MAP_PRIVATE) == MAP_PRIVATE; /* Clear errno. */ errno = 0; 400044c4: 5390b0ef jal ra,400101fc <__errno> 400044c8: 00052023 sw zero,0(a0) iop = NULL; if ( len == 0 ) { 400044cc: 18098c63 beqz s3,40004664 <== NEVER TAKEN /* * We can provide read, write and execute because the memory in RTEMS does * not normally have protections but we cannot hide access to memory. */ if ( prot == PROT_NONE ) { 400044d0: 1e090263 beqz s2,400046b4 <== NEVER TAKEN /* * We can not normally provide restriction of write access. Reject any * attempt to map without write permission, since we are not able to * prevent a write from succeeding. */ if ( PROT_WRITE != (prot & PROT_WRITE) ) { 400044d4: 00297793 andi a5,s2,2 400044d8: 1c078e63 beqz a5,400046b4 map_anonymous = (flags & MAP_ANON) == MAP_ANON; 400044dc: 000014b7 lui s1,0x1 400044e0: 009474b3 and s1,s0,s1 map_fixed = (flags & MAP_FIXED) == MAP_FIXED; 400044e4: 01047d93 andi s11,s0,16 map_shared = (flags & MAP_SHARED) == MAP_SHARED; 400044e8: 00147c13 andi s8,s0,1 map_private = (flags & MAP_PRIVATE) == MAP_PRIVATE; 400044ec: 00247693 andi a3,s0,2 /* * Anonymous mappings must have file descriptor set to -1 and the offset * set to 0. Shared mappings are not supported with Anonymous mappings at * this time */ if ( map_anonymous && (fildes != -1 || off != 0 || map_shared) ) { 400044f0: 16049663 bnez s1,4000465c flags |= MAP_PRIVATE; map_private = true; } /* Check for supported flags */ if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) { 400044f4: fffff7b7 lui a5,0xfffff 400044f8: fec78793 addi a5,a5,-20 # ffffefec 400044fc: 00f477b3 and a5,s0,a5 40004500: 16079263 bnez a5,40004664 <== NEVER TAKEN errno = EINVAL; return MAP_FAILED; } /* Either MAP_SHARED or MAP_PRIVATE must be defined, but not both */ if ( map_shared ) { 40004504: 360c0063 beqz s8,40004864 if ( map_private ) { 40004508: 14069e63 bnez a3,40004664 errno = EINVAL; return MAP_FAILED; } /* Check for illegal addresses. Watch out for address wrap. */ if ( map_fixed ) { 4000450c: 00012423 sw zero,8(sp) 40004510: 1e0d9463 bnez s11,400046f8 <== NEVER TAKEN * Get a stat of the file to get the dev + inode number and to make sure the * fd is ok. The normal libio calls cannot be used because we need to return * MAP_FAILED on error and they return -1 directly without coming back to * here. */ if ( fstat( fildes, &sb ) < 0 ) { 40004514: 01810593 addi a1,sp,24 40004518: 000a8513 mv a0,s5 4000451c: 0a1040ef jal ra,40008dbc 40004520: 42054463 bltz a0,40004948 <== NEVER TAKEN /* fstat ensures we have a good file descriptor. Hold on to iop. */ iop = rtems_libio_iop( fildes ); /* Check the type of file we have and make sure it is supported. */ if ( S_ISDIR( sb.st_mode ) || S_ISLNK( sb.st_mode )) { 40004524: 02812783 lw a5,40(sp) 40004528: 0000f637 lui a2,0xf 4000452c: 000046b7 lui a3,0x4 40004530: 00f677b3 and a5,a2,a5 40004534: 2ad78c63 beq a5,a3,400047ec 40004538: 0000a6b7 lui a3,0xa 4000453c: 2ad78863 beq a5,a3,400047ec errno = ENODEV; return MAP_FAILED; } /* Check to see if the mapping is valid for a regular file. */ if ( S_ISREG( sb.st_mode ) 40004540: 000086b7 lui a3,0x8 40004544: 36d78663 beq a5,a3,400048b0 errno = EOVERFLOW; return MAP_FAILED; } /* Check to see if the mapping is valid for other file/object types. */ if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) { 40004548: 000026b7 lui a3,0x2 4000454c: 2ad78a63 beq a5,a3,40004800 && (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) { 40004550: 017985b3 add a1,s3,s7 if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) { 40004554: 04412603 lw a2,68(sp) && (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) { 40004558: 0135b6b3 sltu a3,a1,s3 4000455c: 016686b3 add a3,a3,s6 if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) { 40004560: 3cd64a63 blt a2,a3,40004934 40004564: 42d60263 beq a2,a3,40004988 errno = ENXIO; return MAP_FAILED; } /* Do not seek on character devices, pipes, sockets, or memory objects. */ if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) ) { 40004568: ffffa6b7 lui a3,0xffffa 4000456c: 00d786b3 add a3,a5,a3 40004570: ffffd637 lui a2,0xffffd 40004574: 00c6f6b3 and a3,a3,a2 40004578: 30068663 beqz a3,40004884 <== NEVER TAKEN return &rtems_libio_iops[ fd ]; 4000457c: 001a9c93 slli s9,s5,0x1 40004580: 015c8cb3 add s9,s9,s5 40004584: 4001c6b7 lui a3,0x4001c 40004588: 004c9c93 slli s9,s9,0x4 4000458c: b9868693 addi a3,a3,-1128 # 4001bb98 return MAP_FAILED; } } /* cdevs do not provide private mappings of any kind. */ if ( S_ISCHR( sb.st_mode ) && map_private ) { 40004590: 00002637 lui a2,0x2 40004594: 00dc8cb3 add s9,s9,a3 40004598: 28c78063 beq a5,a2,40004818 return MAP_FAILED; } } /* Create the mapping */ mapping = malloc( sizeof( mmap_mapping )); 4000459c: 00100593 li a1,1 400045a0: 01800513 li a0,24 400045a4: 00f12623 sw a5,12(sp) 400045a8: 628040ef jal ra,40008bd0 if ( !mapping ) { 400045ac: 00c12783 lw a5,12(sp) mapping = malloc( sizeof( mmap_mapping )); 400045b0: 00050d13 mv s10,a0 if ( !mapping ) { 400045b4: 22050263 beqz a0,400047d8 <== NEVER TAKEN errno = ENOMEM; return MAP_FAILED; } memset( mapping, 0, sizeof( mmap_mapping )); mapping->len = len; 400045b8: 013d2623 sw s3,12(s10) mapping->flags = flags; 400045bc: 008d2823 sw s0,16(s10) * HACK: We should have a better generic way to distinguish between * shm objects and other mmap'd files. We need to know at munmap time * if the mapping is to a shared memory object in order to refcnt shms. * We could do this by providing mmap in the file operations if needed. */ if ( S_ISREG( sb.st_mode ) || S_ISBLK( sb.st_mode ) || 400045c0: 000086b7 lui a3,0x8 400045c4: 2ad78463 beq a5,a3,4000486c 400045c8: 000066b7 lui a3,0x6 400045cc: 2ad78063 beq a5,a3,4000486c S_ISCHR( sb.st_mode ) || S_ISFIFO( sb.st_mode ) || 400045d0: 000016b7 lui a3,0x1 400045d4: 28d78c63 beq a5,a3,4000486c 400045d8: 0000c6b7 lui a3,0xc 400045dc: 28d78863 beq a5,a3,4000486c } } else { is_shared_shm = false; } if ( map_fixed ) { 400045e0: 0c0d9863 bnez s11,400046b0 <== NEVER TAKEN is_shared_shm = true; 400045e4: 00100413 li s0,1 mapping->addr = addr; } else if ( map_private ) { 400045e8: 00812783 lw a5,8(sp) 400045ec: 1c079863 bnez a5,400047bc extern rtems_chain_control mmap_mappings; static inline void mmap_mappings_lock_obtain( void ) { rtems_libio_lock(); 400045f0: 87dfc0ef jal ra,40000e6c return MAP_FAILED; } } else if ( !map_fixed ) { memset( mapping->addr, 0, len ); } } else if ( map_shared ) { 400045f4: 020c0c63 beqz s8,4000462c <== NEVER TAKEN if ( is_shared_shm ) { 400045f8: 00040663 beqz s0,40004604 <== NEVER TAKEN /* FIXME: This use of implementation details is a hack. */ mapping->shm = iop_to_shm( iop ); 400045fc: 02cca783 lw a5,44(s9) 40004600: 00fd2a23 sw a5,20(s10) } err = (*iop->pathinfo.handlers->mmap_h)( 40004604: 020ca683 lw a3,32(s9) 40004608: 000b8713 mv a4,s7 4000460c: 000b0793 mv a5,s6 40004610: 03c6a803 lw a6,60(a3) # c03c 40004614: 00098613 mv a2,s3 40004618: 00090693 mv a3,s2 4000461c: 008d0593 addi a1,s10,8 40004620: 000c8513 mv a0,s9 40004624: 000800e7 jalr a6 # 4000 iop, &mapping->addr, len, prot, off ); if ( err != 0 ) { 40004628: 34051063 bnez a0,40004968 4000462c: 4001a5b7 lui a1,0x4001a 40004630: 4001a6b7 lui a3,0x4001a 40004634: fb058593 addi a1,a1,-80 # 40019fb0 40004638: fb468693 addi a3,a3,-76 # 40019fb4 old_last = tail->previous; 4000463c: 0085a783 lw a5,8(a1) the_node->next = tail; 40004640: 00dd2023 sw a3,0(s10) tail->previous = the_node; 40004644: 01a5a423 sw s10,8(a1) old_last->next = the_node; 40004648: 01a7a023 sw s10,0(a5) the_node->previous = old_last; 4000464c: 00fd2223 sw a5,4(s10) } static inline void mmap_mappings_lock_release( void ) { rtems_libio_unlock(); 40004650: 829fc0ef jal ra,40000e78 rtems_chain_append_unprotected( &mmap_mappings, &mapping->node ); mmap_mappings_lock_release( ); return mapping->addr; 40004654: 008d2503 lw a0,8(s10) 40004658: 01c0006f j 40004674 if ( map_anonymous && (fildes != -1 || off != 0 || map_shared) ) { 4000465c: fff00793 li a5,-1 40004660: 06fa8463 beq s5,a5,400046c8 errno = EINVAL; 40004664: 3990b0ef jal ra,400101fc <__errno> 40004668: 01600793 li a5,22 4000466c: 00f52023 sw a5,0(a0) return MAP_FAILED; 40004670: fff00513 li a0,-1 } 40004674: 0bc12083 lw ra,188(sp) 40004678: 0b812403 lw s0,184(sp) 4000467c: 0b412483 lw s1,180(sp) 40004680: 0b012903 lw s2,176(sp) 40004684: 0ac12983 lw s3,172(sp) 40004688: 0a812a03 lw s4,168(sp) 4000468c: 0a412a83 lw s5,164(sp) 40004690: 0a012b03 lw s6,160(sp) 40004694: 09c12b83 lw s7,156(sp) 40004698: 09812c03 lw s8,152(sp) 4000469c: 09412c83 lw s9,148(sp) 400046a0: 09012d03 lw s10,144(sp) 400046a4: 08c12d83 lw s11,140(sp) 400046a8: 0c010113 addi sp,sp,192 400046ac: 00008067 ret free( mapping ); 400046b0: 5c4040ef jal ra,40008c74 <== NOT EXECUTED errno = ENOTSUP; 400046b4: 3490b0ef jal ra,400101fc <__errno> 400046b8: 08600793 li a5,134 400046bc: 00f52023 sw a5,0(a0) return MAP_FAILED; 400046c0: fff00513 li a0,-1 400046c4: fb1ff06f j 40004674 if ( map_anonymous && (fildes != -1 || off != 0 || map_shared) ) { 400046c8: 016be7b3 or a5,s7,s6 400046cc: f8079ce3 bnez a5,40004664 <== NEVER TAKEN 400046d0: f80c1ae3 bnez s8,40004664 if ( map_anonymous && !map_private && !map_shared ) { 400046d4: fffff7b7 lui a5,0xfffff 400046d8: fec78793 addi a5,a5,-20 # ffffefec 400046dc: 00f477b3 and a5,s0,a5 400046e0: 0a069663 bnez a3,4000478c flags |= MAP_PRIVATE; 400046e4: 00246413 ori s0,s0,2 if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) { 400046e8: f6079ee3 bnez a5,40004664 if ( map_fixed ) { 400046ec: 0a0d8a63 beqz s11,400047a0 <== ALWAYS TAKEN map_private = true; 400046f0: 00100793 li a5,1 <== NOT EXECUTED 400046f4: 00f12423 sw a5,8(sp) <== NOT EXECUTED if ((uintptr_t)addr & PAGE_MASK) { 400046f8: 014a1793 slli a5,s4,0x14 400046fc: f60794e3 bnez a5,40004664 if ( addr == NULL ) { 40004700: f60a02e3 beqz s4,40004664 if (addr + len < addr) { 40004704: f609c0e3 bltz s3,40004664 <== NEVER TAKEN if ( !map_anonymous ) { 40004708: e00486e3 beqz s1,40004514 mapping = malloc( sizeof( mmap_mapping )); 4000470c: 00100593 li a1,1 40004710: 01800513 li a0,24 40004714: 4bc040ef jal ra,40008bd0 40004718: 00050d13 mv s10,a0 if ( !mapping ) { 4000471c: 0a050e63 beqz a0,400047d8 <== NEVER TAKEN mapping->len = len; 40004720: 013d2623 sw s3,12(s10) mapping->flags = flags; 40004724: 008d2823 sw s0,16(s10) if ( map_fixed ) { 40004728: 140d8863 beqz s11,40004878 mapping->addr = addr; 4000472c: 014d2423 sw s4,8(s10) iop = NULL; 40004730: 00000c93 li s9,0 rtems_libio_lock(); 40004734: f38fc0ef jal ra,40000e6c return _Chain_Immutable_head( the_chain )->next; 40004738: 4001a5b7 lui a1,0x4001a 4000473c: fb058593 addi a1,a1,-80 # 40019fb0 40004740: 0005a883 lw a7,0(a1) while ( !rtems_chain_is_tail( &mmap_mappings, node )) { 40004744: 00458693 addi a3,a1,4 40004748: 02d88063 beq a7,a3,40004768 if ( ( addr >= current_mapping->addr ) && 4000474c: 0088a783 lw a5,8(a7) 40004750: 00fa6863 bltu s4,a5,40004760 ( addr < ( current_mapping->addr + current_mapping->len )) ) { 40004754: 00c8a603 lw a2,12(a7) 40004758: 00c787b3 add a5,a5,a2 if ( ( addr >= current_mapping->addr ) && 4000475c: 18fa6663 bltu s4,a5,400048e8 return the_node->next; 40004760: 0008a883 lw a7,0(a7) while ( !rtems_chain_is_tail( &mmap_mappings, node )) { 40004764: fed894e3 bne a7,a3,4000474c if ( map_private ) { 40004768: 00812783 lw a5,8(sp) 4000476c: 0e078863 beqz a5,4000485c <== NEVER TAKEN if ( !map_anonymous ) { 40004770: 1a048063 beqz s1,40004910 } else if ( !map_fixed ) { 40004774: ea0d9ce3 bnez s11,4000462c memset( mapping->addr, 0, len ); 40004778: 008d2503 lw a0,8(s10) 4000477c: 00098613 mv a2,s3 40004780: 00000593 li a1,0 40004784: 0080c0ef jal ra,4001078c 40004788: ea5ff06f j 4000462c if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) { 4000478c: ec079ce3 bnez a5,40004664 <== NEVER TAKEN if ( map_fixed ) { 40004790: 00100793 li a5,1 40004794: 00f12423 sw a5,8(sp) 40004798: f60d88e3 beqz s11,40004708 4000479c: f5dff06f j 400046f8 mapping = malloc( sizeof( mmap_mapping )); 400047a0: 00100593 li a1,1 400047a4: 01800513 li a0,24 400047a8: 428040ef jal ra,40008bd0 400047ac: 00050d13 mv s10,a0 if ( !mapping ) { 400047b0: 02050463 beqz a0,400047d8 <== NEVER TAKEN mapping->len = len; 400047b4: 013d2623 sw s3,12(s10) mapping->flags = flags; 400047b8: 008d2823 sw s0,16(s10) err = posix_memalign( &mapping->addr, PAGE_SIZE, len ); 400047bc: 00098613 mv a2,s3 400047c0: 000015b7 lui a1,0x1 400047c4: 008d0513 addi a0,s10,8 400047c8: 2a1040ef jal ra,40009268 400047cc: 12050e63 beqz a0,40004908 <== ALWAYS TAKEN free( mapping ); 400047d0: 000d0513 mv a0,s10 <== NOT EXECUTED 400047d4: 4a0040ef jal ra,40008c74 <== NOT EXECUTED errno = ENOMEM; 400047d8: 2250b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 400047dc: 00c00793 li a5,12 <== NOT EXECUTED 400047e0: 00f52023 sw a5,0(a0) <== NOT EXECUTED return MAP_FAILED; 400047e4: fff00513 li a0,-1 <== NOT EXECUTED 400047e8: e8dff06f j 40004674 <== NOT EXECUTED errno = ENODEV; 400047ec: 2110b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 400047f0: 01300793 li a5,19 <== NOT EXECUTED 400047f4: 00f52023 sw a5,0(a0) <== NOT EXECUTED return MAP_FAILED; 400047f8: fff00513 li a0,-1 <== NOT EXECUTED 400047fc: e79ff06f j 40004674 <== NOT EXECUTED 40004800: 001a9c93 slli s9,s5,0x1 40004804: 015c8cb3 add s9,s9,s5 40004808: 4001c7b7 lui a5,0x4001c 4000480c: 004c9c93 slli s9,s9,0x4 40004810: b9878793 addi a5,a5,-1128 # 4001bb98 40004814: 00fc8cb3 add s9,s9,a5 if ( S_ISCHR( sb.st_mode ) && map_private ) { 40004818: 00812783 lw a5,8(sp) 4000481c: e40794e3 bnez a5,40004664 mapping = malloc( sizeof( mmap_mapping )); 40004820: 00100593 li a1,1 40004824: 01800513 li a0,24 40004828: 3a8040ef jal ra,40008bd0 4000482c: 00050d13 mv s10,a0 if ( !mapping ) { 40004830: fa0504e3 beqz a0,400047d8 <== NEVER TAKEN mapping->len = len; 40004834: 013d2623 sw s3,12(s10) mapping->flags = flags; 40004838: 008d2823 sw s0,16(s10) if ( map_fixed ) { 4000483c: 120d8063 beqz s11,4000495c <== ALWAYS TAKEN mapping->addr = addr; 40004840: 014d2423 sw s4,8(s10) <== NOT EXECUTED 40004844: e28fc0ef jal ra,40000e6c <== NOT EXECUTED return _Chain_Immutable_head( the_chain )->next; 40004848: 4001a5b7 lui a1,0x4001a <== NOT EXECUTED 4000484c: fb058593 addi a1,a1,-80 # 40019fb0 <== NOT EXECUTED 40004850: 0005a883 lw a7,0(a1) <== NOT EXECUTED while ( !rtems_chain_is_tail( &mmap_mappings, node )) { 40004854: 00458693 addi a3,a1,4 <== NOT EXECUTED 40004858: eed89ae3 bne a7,a3,4000474c <== NOT EXECUTED } else if ( map_shared ) { 4000485c: da0c14e3 bnez s8,40004604 <== NOT EXECUTED 40004860: dddff06f j 4000463c <== NOT EXECUTED } else if ( !map_private ) { 40004864: e00680e3 beqz a3,40004664 40004868: f29ff06f j 40004790 if ( map_fixed ) { 4000486c: 000d8863 beqz s11,4000487c <== NOT EXECUTED mapping->addr = addr; 40004870: 014d2423 sw s4,8(s10) <== NOT EXECUTED if ( map_fixed && is_shared_shm ) { 40004874: ec1ff06f j 40004734 <== NOT EXECUTED iop = NULL; 40004878: 00000c93 li s9,0 is_shared_shm = false; 4000487c: 00000413 li s0,0 40004880: d69ff06f j 400045e8 if ( lseek( fildes, off, SEEK_SET ) < 0 ) { 40004884: 00000693 li a3,0 <== NOT EXECUTED 40004888: 000b8593 mv a1,s7 <== NOT EXECUTED 4000488c: 000b0613 mv a2,s6 <== NOT EXECUTED 40004890: 000a8513 mv a0,s5 <== NOT EXECUTED 40004894: 704040ef jal ra,40008f98 <== NOT EXECUTED return MAP_FAILED; 40004898: fff00513 li a0,-1 <== NOT EXECUTED if ( lseek( fildes, off, SEEK_SET ) < 0 ) { 4000489c: dc05cce3 bltz a1,40004674 <== NOT EXECUTED if ( S_ISCHR( sb.st_mode ) && map_private ) { 400048a0: 02812783 lw a5,40(sp) <== NOT EXECUTED 400048a4: 0000f6b7 lui a3,0xf <== NOT EXECUTED 400048a8: 00f6f7b3 and a5,a3,a5 <== NOT EXECUTED 400048ac: cd1ff06f j 4000457c <== NOT EXECUTED && (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) { 400048b0: 04412683 lw a3,68(sp) <== NOT EXECUTED 400048b4: 04012583 lw a1,64(sp) <== NOT EXECUTED 400048b8: 0cdb5263 bge s6,a3,4000497c <== NOT EXECUTED 400048bc: 01798633 add a2,s3,s7 <== NOT EXECUTED 400048c0: 013637b3 sltu a5,a2,s3 <== NOT EXECUTED 400048c4: 016787b3 add a5,a5,s6 <== NOT EXECUTED 400048c8: fad7cee3 blt a5,a3,40004884 <== NOT EXECUTED 400048cc: 00f69463 bne a3,a5,400048d4 <== NOT EXECUTED 400048d0: fab66ae3 bltu a2,a1,40004884 <== NOT EXECUTED errno = EOVERFLOW; 400048d4: 1290b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 400048d8: 08b00793 li a5,139 <== NOT EXECUTED 400048dc: 00f52023 sw a5,0(a0) <== NOT EXECUTED return MAP_FAILED; 400048e0: fff00513 li a0,-1 <== NOT EXECUTED 400048e4: d91ff06f j 40004674 <== NOT EXECUTED free( mapping ); 400048e8: 000d0513 mv a0,s10 <== NOT EXECUTED 400048ec: 388040ef jal ra,40008c74 <== NOT EXECUTED rtems_libio_unlock(); 400048f0: d88fc0ef jal ra,40000e78 <== NOT EXECUTED errno = ENXIO; 400048f4: 1090b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 400048f8: 00600793 li a5,6 <== NOT EXECUTED 400048fc: 00f52023 sw a5,0(a0) <== NOT EXECUTED return MAP_FAILED; 40004900: fff00513 li a0,-1 <== NOT EXECUTED 40004904: d71ff06f j 40004674 <== NOT EXECUTED rtems_libio_lock(); 40004908: d64fc0ef jal ra,40000e6c if ( map_private ) { 4000490c: e65ff06f j 40004770 r = read( fildes, mapping->addr, len ); 40004910: 008d2583 lw a1,8(s10) 40004914: 00098613 mv a2,s3 40004918: 000a8513 mv a0,s5 4000491c: 225040ef jal ra,40009340 if ( r != len ) { 40004920: d13506e3 beq a0,s3,4000462c rtems_libio_unlock(); 40004924: d54fc0ef jal ra,40000e78 <== NOT EXECUTED if ( !map_fixed ) { 40004928: 060d8663 beqz s11,40004994 <== NOT EXECUTED free( mapping ); 4000492c: 000d0513 mv a0,s10 <== NOT EXECUTED 40004930: 344040ef jal ra,40008c74 <== NOT EXECUTED errno = ENXIO; 40004934: 0c90b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 40004938: 00600793 li a5,6 <== NOT EXECUTED 4000493c: 00f52023 sw a5,0(a0) <== NOT EXECUTED return MAP_FAILED; 40004940: fff00513 li a0,-1 <== NOT EXECUTED 40004944: d31ff06f j 40004674 <== NOT EXECUTED errno = EBADF; 40004948: 0b50b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 4000494c: 00900793 li a5,9 <== NOT EXECUTED 40004950: 00f52023 sw a5,0(a0) <== NOT EXECUTED return MAP_FAILED; 40004954: fff00513 li a0,-1 <== NOT EXECUTED 40004958: d1dff06f j 40004674 <== NOT EXECUTED rtems_libio_lock(); 4000495c: d10fc0ef jal ra,40000e6c } else if ( map_shared ) { 40004960: ca0c12e3 bnez s8,40004604 <== ALWAYS TAKEN 40004964: cc9ff06f j 4000462c <== NOT EXECUTED rtems_libio_unlock(); 40004968: d10fc0ef jal ra,40000e78 free( mapping ); 4000496c: 000d0513 mv a0,s10 40004970: 304040ef jal ra,40008c74 return MAP_FAILED; 40004974: fff00513 li a0,-1 40004978: cfdff06f j 40004674 && (( off >= sb.st_size ) || (( off + len ) >= sb.st_size ))) { 4000497c: f5669ce3 bne a3,s6,400048d4 <== NOT EXECUTED 40004980: f2bbeee3 bltu s7,a1,400048bc <== NOT EXECUTED 40004984: f51ff06f j 400048d4 <== NOT EXECUTED if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) { 40004988: 04012683 lw a3,64(sp) 4000498c: bcb6fee3 bgeu a3,a1,40004568 40004990: fa5ff06f j 40004934 <== NOT EXECUTED free( mapping->addr ); 40004994: 008d2503 lw a0,8(s10) <== NOT EXECUTED 40004998: 2dc040ef jal ra,40008c74 <== NOT EXECUTED 4000499c: f91ff06f j 4000492c <== NOT EXECUTED =============================================================================== 400048a4 : */ int mq_close( mqd_t mqdes ) { 400048a4: fc010113 addi sp,sp,-64 400048a8: 02812c23 sw s0,56(sp) 400048ac: 02112e23 sw ra,60(sp) 400048b0: 00050413 mv s0,a0 * * @see _Objects_Allocator_unlock() and _Objects_Allocate(). */ RTEMS_INLINE_ROUTINE void _Objects_Allocator_lock( void ) { _RTEMS_Lock_allocator(); 400048b4: 158020ef jal ra,40006a0c <_RTEMS_Lock_allocator> Objects_Id id, Thread_queue_Context *queue_context ) { _Thread_queue_Context_initialize( queue_context ); return (POSIX_Message_queue_Control *) _Objects_Get( 400048b8: 40016637 lui a2,0x40016 400048bc: da860613 addi a2,a2,-600 # 40015da8 <_POSIX_Message_queue_Information> 400048c0: 00c10593 addi a1,sp,12 400048c4: 00040513 mv a0,s0 400048c8: 530030ef jal ra,40007df8 <_Objects_Get> Thread_queue_Context queue_context; _Objects_Allocator_lock(); the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context ); if ( the_mq == NULL ) { 400048cc: 02050e63 beqz a0,40004908 <== NEVER TAKEN _CORE_message_queue_Acquire_critical( &the_mq->Message_queue, &queue_context ); if ( the_mq->open_count == 0 ) { 400048d0: 05452703 lw a4,84(a0) 400048d4: 02070663 beqz a4,40004900 _CORE_message_queue_Release( &the_mq->Message_queue, &queue_context ); _Objects_Allocator_unlock(); rtems_set_errno_and_return_minus_one( EBADF ); } the_mq->open_count -= 1; 400048d8: fff70713 addi a4,a4,-1 400048dc: 04e52a23 sw a4,84(a0) _POSIX_Message_queue_Delete( the_mq, &queue_context ); 400048e0: 00c10593 addi a1,sp,12 400048e4: 03c000ef jal ra,40004920 <_POSIX_Message_queue_Delete> * 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(); 400048e8: 130020ef jal ra,40006a18 <_RTEMS_Unlock_allocator> _Objects_Allocator_unlock(); return 0; 400048ec: 00000513 li a0,0 } 400048f0: 03c12083 lw ra,60(sp) 400048f4: 03812403 lw s0,56(sp) 400048f8: 04010113 addi sp,sp,64 400048fc: 00008067 ret 40004900: 00c12783 lw a5,12(sp) 40004904: 3007a073 csrs mstatus,a5 40004908: 110020ef jal ra,40006a18 <_RTEMS_Unlock_allocator> rtems_set_errno_and_return_minus_one( EBADF ); 4000490c: 4510d0ef jal ra,4001255c <__errno> 40004910: 00900793 li a5,9 40004914: 00f52023 sw a5,0(a0) 40004918: fff00513 li a0,-1 4000491c: fd5ff06f j 400048f0 =============================================================================== 40008274 : int mq_getattr( mqd_t mqdes, struct mq_attr *mqstat ) { 40008274: fc010113 addi sp,sp,-64 40008278: 02112e23 sw ra,60(sp) 4000827c: 02812c23 sw s0,56(sp) POSIX_Message_queue_Control *the_mq; Thread_queue_Context queue_context; if ( mqstat == NULL ) { 40008280: 06058e63 beqz a1,400082fc 40008284: 40026637 lui a2,0x40026 40008288: 00058413 mv s0,a1 4000828c: fb460613 addi a2,a2,-76 # 40025fb4 <_POSIX_Message_queue_Information> 40008290: 00c10593 addi a1,sp,12 40008294: 338020ef jal ra,4000a5cc <_Objects_Get> rtems_set_errno_and_return_minus_one( EINVAL ); } the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context ); if ( the_mq == NULL ) { 40008298: 04050863 beqz a0,400082e8 <== NEVER TAKEN _CORE_message_queue_Acquire_critical( &the_mq->Message_queue, &queue_context ); if ( the_mq->open_count == 0 ) { 4000829c: 05452783 lw a5,84(a0) 400082a0: 04078063 beqz a5,400082e0 } /* * Return the old values. */ mqstat->mq_flags = the_mq->oflag; 400082a4: 06c52603 lw a2,108(a0) mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size; 400082a8: 02852683 lw a3,40(a0) mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages; 400082ac: 02052703 lw a4,32(a0) mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages; 400082b0: 02452783 lw a5,36(a0) mqstat->mq_flags = the_mq->oflag; 400082b4: 00c42023 sw a2,0(s0) mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size; 400082b8: 00d42423 sw a3,8(s0) mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages; 400082bc: 00e42223 sw a4,4(s0) mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages; 400082c0: 00f42623 sw a5,12(s0) 400082c4: 00c12783 lw a5,12(sp) 400082c8: 3007a073 csrs mstatus,a5 _CORE_message_queue_Release( &the_mq->Message_queue, &queue_context ); return 0; 400082cc: 00000513 li a0,0 } 400082d0: 03c12083 lw ra,60(sp) 400082d4: 03812403 lw s0,56(sp) 400082d8: 04010113 addi sp,sp,64 400082dc: 00008067 ret 400082e0: 00c12783 lw a5,12(sp) 400082e4: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EBADF ); 400082e8: 0350d0ef jal ra,40015b1c <__errno> 400082ec: 00900793 li a5,9 400082f0: 00f52023 sw a5,0(a0) 400082f4: fff00513 li a0,-1 400082f8: fd9ff06f j 400082d0 rtems_set_errno_and_return_minus_one( EINVAL ); 400082fc: 0210d0ef jal ra,40015b1c <__errno> 40008300: 01600793 li a5,22 40008304: 00f52023 sw a5,0(a0) 40008308: fff00513 li a0,-1 4000830c: fc5ff06f j 400082d0 =============================================================================== 4000e2d8 : int mq_notify( mqd_t mqdes, const struct sigevent *notification ) { 4000e2d8: fc010113 addi sp,sp,-64 return (POSIX_Message_queue_Control *) _Objects_Get( 4000e2dc: 40026637 lui a2,0x40026 4000e2e0: 02812c23 sw s0,56(sp) 4000e2e4: fb460613 addi a2,a2,-76 # 40025fb4 <_POSIX_Message_queue_Information> 4000e2e8: 00058413 mv s0,a1 4000e2ec: 00c10593 addi a1,sp,12 4000e2f0: 02112e23 sw ra,60(sp) 4000e2f4: ad8fc0ef jal ra,4000a5cc <_Objects_Get> POSIX_Message_queue_Control *the_mq; Thread_queue_Context queue_context; the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context ); if ( the_mq == NULL ) { 4000e2f8: 08050a63 beqz a0,4000e38c <== NEVER TAKEN _CORE_message_queue_Acquire_critical( &the_mq->Message_queue, &queue_context ); if ( the_mq->open_count == 0 ) { 4000e2fc: 05452783 lw a5,84(a0) 4000e300: 08078263 beqz a5,4000e384 _CORE_message_queue_Release( &the_mq->Message_queue, &queue_context ); rtems_set_errno_and_return_minus_one( EBADF ); } if ( notification != NULL ) { 4000e304: 04040e63 beqz s0,4000e360 if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) { 4000e308: 04052783 lw a5,64(a0) 4000e30c: 04079e63 bnez a5,4000e368 _CORE_message_queue_Release( &the_mq->Message_queue, &queue_context ); rtems_set_errno_and_return_minus_one( EBUSY ); } the_mq->notification = *notification; 4000e310: 01042783 lw a5,16(s0) 4000e314: 00042583 lw a1,0(s0) 4000e318: 00442603 lw a2,4(s0) 4000e31c: 00842683 lw a3,8(s0) 4000e320: 00c42703 lw a4,12(s0) 4000e324: 06f52423 sw a5,104(a0) 4000e328: 4000e7b7 lui a5,0x4000e 4000e32c: 2a478793 addi a5,a5,676 # 4000e2a4 <_POSIX_Message_queue_Notify_handler> 4000e330: 04b52c23 sw a1,88(a0) 4000e334: 04c52e23 sw a2,92(a0) 4000e338: 06d52023 sw a3,96(a0) 4000e33c: 06e52223 sw a4,100(a0) 4000e340: 04f52023 sw a5,64(a0) 4000e344: 00c12783 lw a5,12(sp) 4000e348: 3007a073 csrs mstatus,a5 } else { _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL ); } _CORE_message_queue_Release( &the_mq->Message_queue, &queue_context ); return 0; 4000e34c: 00000513 li a0,0 } 4000e350: 03c12083 lw ra,60(sp) 4000e354: 03812403 lw s0,56(sp) 4000e358: 04010113 addi sp,sp,64 4000e35c: 00008067 ret 4000e360: 04052023 sw zero,64(a0) } 4000e364: fe1ff06f j 4000e344 4000e368: 00c12783 lw a5,12(sp) 4000e36c: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EBUSY ); 4000e370: 7ac070ef jal ra,40015b1c <__errno> 4000e374: 01000793 li a5,16 4000e378: 00f52023 sw a5,0(a0) 4000e37c: fff00513 li a0,-1 4000e380: fd1ff06f j 4000e350 4000e384: 00c12783 lw a5,12(sp) 4000e388: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EBADF ); 4000e38c: 790070ef jal ra,40015b1c <__errno> 4000e390: 00900793 li a5,9 4000e394: 00f52023 sw a5,0(a0) 4000e398: fff00513 li a0,-1 4000e39c: fb5ff06f j 4000e350 =============================================================================== 400087c4 : int mq_setattr( mqd_t mqdes, const struct mq_attr *__restrict mqstat, struct mq_attr *__restrict omqstat ) { 400087c4: fc010113 addi sp,sp,-64 400087c8: 02112e23 sw ra,60(sp) 400087cc: 02812c23 sw s0,56(sp) 400087d0: 02912a23 sw s1,52(sp) POSIX_Message_queue_Control *the_mq; Thread_queue_Context queue_context; if ( mqstat == NULL ) { 400087d4: 08058863 beqz a1,40008864 400087d8: 00060413 mv s0,a2 400087dc: 40026637 lui a2,0x40026 400087e0: 00058493 mv s1,a1 400087e4: fb460613 addi a2,a2,-76 # 40025fb4 <_POSIX_Message_queue_Information> 400087e8: 00c10593 addi a1,sp,12 400087ec: 5e1010ef jal ra,4000a5cc <_Objects_Get> rtems_set_errno_and_return_minus_one( EINVAL ); } the_mq = _POSIX_Message_queue_Get( mqdes, &queue_context ); if ( the_mq == NULL ) { 400087f0: 06050063 beqz a0,40008850 <== NEVER TAKEN _CORE_message_queue_Acquire_critical( &the_mq->Message_queue, &queue_context ); if ( the_mq->open_count == 0 ) { 400087f4: 05452783 lw a5,84(a0) 400087f8: 04078863 beqz a5,40008848 /* * Return the old values. */ if ( omqstat != NULL ) { 400087fc: 02040263 beqz s0,40008820 omqstat->mq_flags = the_mq->oflag; 40008800: 06c52603 lw a2,108(a0) omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size; 40008804: 02852683 lw a3,40(a0) omqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages; 40008808: 02052703 lw a4,32(a0) omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages; 4000880c: 02452783 lw a5,36(a0) omqstat->mq_flags = the_mq->oflag; 40008810: 00c42023 sw a2,0(s0) omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size; 40008814: 00d42423 sw a3,8(s0) omqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages; 40008818: 00e42223 sw a4,4(s0) omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages; 4000881c: 00f42623 sw a5,12(s0) } the_mq->oflag = mqstat->mq_flags; 40008820: 0004a783 lw a5,0(s1) 40008824: 06f52623 sw a5,108(a0) 40008828: 00c12783 lw a5,12(sp) 4000882c: 3007a073 csrs mstatus,a5 _CORE_message_queue_Release( &the_mq->Message_queue, &queue_context ); return 0; 40008830: 00000513 li a0,0 } 40008834: 03c12083 lw ra,60(sp) 40008838: 03812403 lw s0,56(sp) 4000883c: 03412483 lw s1,52(sp) 40008840: 04010113 addi sp,sp,64 40008844: 00008067 ret 40008848: 00c12783 lw a5,12(sp) 4000884c: 3007a073 csrs mstatus,a5 rtems_set_errno_and_return_minus_one( EBADF ); 40008850: 2cc0d0ef jal ra,40015b1c <__errno> 40008854: 00900793 li a5,9 40008858: 00f52023 sw a5,0(a0) 4000885c: fff00513 li a0,-1 40008860: fd5ff06f j 40008834 rtems_set_errno_and_return_minus_one( EINVAL ); 40008864: 2b80d0ef jal ra,40015b1c <__errno> 40008868: 01600793 li a5,22 4000886c: 00f52023 sw a5,0(a0) 40008870: fff00513 li a0,-1 40008874: fc1ff06f j 40008834 =============================================================================== 400049a0 : #include #include int munmap(void *addr, size_t len) { 400049a0: fe010113 addi sp,sp,-32 400049a4: 00812c23 sw s0,24(sp) 400049a8: 00912a23 sw s1,20(sp) 400049ac: 00112e23 sw ra,28(sp) 400049b0: 01212823 sw s2,16(sp) 400049b4: 00050493 mv s1,a0 400049b8: 00058413 mv s0,a1 rtems_chain_node *node; /* * Clear errno. */ errno = 0; 400049bc: 0410b0ef jal ra,400101fc <__errno> 400049c0: 00052023 sw zero,0(a0) /* * Length cannot be 0. */ if ( len == 0 ) { 400049c4: 0e040c63 beqz s0,40004abc <== NEVER TAKEN errno = EINVAL; return -1; } /* Check for illegal addresses. Watch out for address wrap. */ if (addr + len < addr) { 400049c8: 0e044a63 bltz s0,40004abc <== NEVER TAKEN rtems_libio_lock(); 400049cc: ca0fc0ef jal ra,40000e6c 400049d0: 4001a7b7 lui a5,0x4001a 400049d4: fb07a403 lw s0,-80(a5) # 40019fb0 } mmap_mappings_lock_obtain(); node = rtems_chain_first (&mmap_mappings); while ( !rtems_chain_is_tail( &mmap_mappings, node )) { 400049d8: 4001a737 lui a4,0x4001a 400049dc: fb470713 addi a4,a4,-76 # 40019fb4 400049e0: 02e40063 beq s0,a4,40004a00 mapping = (mmap_mapping*) node; if ( ( addr >= mapping->addr ) && 400049e4: 00842783 lw a5,8(s0) 400049e8: 00f4e863 bltu s1,a5,400049f8 ( addr < ( mapping->addr + mapping->len )) ) { 400049ec: 00c42683 lw a3,12(s0) 400049f0: 00d787b3 add a5,a5,a3 if ( ( addr >= mapping->addr ) && 400049f4: 02f4e663 bltu s1,a5,40004a20 return the_node->next; 400049f8: 00042403 lw s0,0(s0) while ( !rtems_chain_is_tail( &mmap_mappings, node )) { 400049fc: fee414e3 bne s0,a4,400049e4 rtems_libio_unlock(); 40004a00: c78fc0ef jal ra,40000e78 } node = rtems_chain_next( node ); } mmap_mappings_lock_release( ); return 0; 40004a04: 00000513 li a0,0 } 40004a08: 01c12083 lw ra,28(sp) 40004a0c: 01812403 lw s0,24(sp) 40004a10: 01412483 lw s1,20(sp) 40004a14: 01012903 lw s2,16(sp) 40004a18: 02010113 addi sp,sp,32 40004a1c: 00008067 ret next = the_node->next; 40004a20: 00042703 lw a4,0(s0) previous = the_node->previous; 40004a24: 00442783 lw a5,4(s0) if ( mapping->shm != NULL ) { 40004a28: 01442483 lw s1,20(s0) next->previous = previous; 40004a2c: 00f72223 sw a5,4(a4) previous->next = next; 40004a30: 00e7a023 sw a4,0(a5) 40004a34: 04048663 beqz s1,40004a80 * * @see _Objects_Allocator_unlock() and _Objects_Allocate(). */ RTEMS_INLINE_ROUTINE void _Objects_Allocator_lock( void ) { _RTEMS_Lock_allocator(); 40004a38: 305000ef jal ra,4000553c <_RTEMS_Lock_allocator> int err; err = 0; _Objects_Allocator_lock(); --shm->reference_count; 40004a3c: 01c4a783 lw a5,28(s1) # 101c <_ISR_Stack_size+0x1c> 40004a40: fff78793 addi a5,a5,-1 40004a44: 00f4ae23 sw a5,28(s1) if ( shm->reference_count == 0 ) { 40004a48: 00079a63 bnez a5,40004a5c <== ALWAYS TAKEN if ( (*shm->shm_object.ops->object_delete)( &shm->shm_object ) != 0 ) { 40004a4c: 0284a783 lw a5,40(s1) <== NOT EXECUTED 40004a50: 02048513 addi a0,s1,32 <== NOT EXECUTED 40004a54: 0087a783 lw a5,8(a5) <== NOT EXECUTED 40004a58: 000780e7 jalr a5 <== NOT EXECUTED err = EIO; } } /* check if the object has been unlinked yet. */ obj = _Objects_Get( shm->Object.id, &lock_ctx, &_POSIX_Shm_Information ); 40004a5c: 0084a503 lw a0,8(s1) 40004a60: 4001a937 lui s2,0x4001a 40004a64: de890613 addi a2,s2,-536 # 40019de8 <_POSIX_Shm_Information> 40004a68: 00c10593 addi a1,sp,12 40004a6c: 3b4010ef jal ra,40005e20 <_Objects_Get> if ( obj == NULL ) { 40004a70: 02050a63 beqz a0,40004aa4 <== NEVER TAKEN 40004a74: 00c12783 lw a5,12(sp) 40004a78: 3007a073 csrs mstatus,a5 * 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(); 40004a7c: 2cd000ef jal ra,40005548 <_RTEMS_Unlock_allocator> if (( mapping->flags & MAP_SHARED ) != MAP_SHARED ) { 40004a80: 01042783 lw a5,16(s0) 40004a84: 0117f793 andi a5,a5,17 40004a88: 00078863 beqz a5,40004a98 free( mapping ); 40004a8c: 00040513 mv a0,s0 40004a90: 1e4040ef jal ra,40008c74 break; 40004a94: f6dff06f j 40004a00 free( mapping->addr ); 40004a98: 00842503 lw a0,8(s0) 40004a9c: 1d8040ef jal ra,40008c74 40004aa0: fedff06f j 40004a8c Objects_Control *the_object ) { _Assert( _Objects_Allocator_is_owner() ); _Assert( information->deallocate != NULL ); ( *information->deallocate )( information, the_object ); 40004aa4: de890793 addi a5,s2,-536 <== NOT EXECUTED 40004aa8: 00c7a783 lw a5,12(a5) <== NOT EXECUTED 40004aac: 00048593 mv a1,s1 <== NOT EXECUTED 40004ab0: de890513 addi a0,s2,-536 <== NOT EXECUTED 40004ab4: 000780e7 jalr a5 <== NOT EXECUTED } 40004ab8: fc5ff06f j 40004a7c <== NOT EXECUTED errno = EINVAL; 40004abc: 7400b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 40004ac0: 01600793 li a5,22 <== NOT EXECUTED 40004ac4: 00f52023 sw a5,0(a0) <== NOT EXECUTED return -1; 40004ac8: fff00513 li a0,-1 <== NOT EXECUTED 40004acc: f3dff06f j 40004a08 <== NOT EXECUTED =============================================================================== 40003b58 : int pthread_attr_getaffinity_np( const pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset ) { 40003b58: 00050793 mv a5,a0 if ( attr == NULL || !attr->is_initialized ) { 40003b5c: 02050863 beqz a0,40003b8c <== NEVER TAKEN 40003b60: 00052703 lw a4,0(a0) return EINVAL; 40003b64: 01600513 li a0,22 if ( attr == NULL || !attr->is_initialized ) { 40003b68: 02070463 beqz a4,40003b90 <== NEVER TAKEN } if ( cpuset == NULL || cpusetsize != attr->affinitysetsize ) { 40003b6c: 02060263 beqz a2,40003b90 <== NEVER TAKEN 40003b70: 0547a703 lw a4,84(a5) 40003b74: 00b71e63 bne a4,a1,40003b90 return CPU_ISSET_S(cpu, sizeof(*set), set); } static __inline void CPU_COPY(const cpu_set_t *src, cpu_set_t *dest) { BIT_COPY(_cpu_set_bits(setsize), src, dest); 40003b78: 0587a783 lw a5,88(a5) return EINVAL; } CPU_COPY( attr->affinityset, cpuset ); return 0; 40003b7c: 00000513 li a0,0 40003b80: 0007a783 lw a5,0(a5) 40003b84: 00f62023 sw a5,0(a2) 40003b88: 00008067 ret return EINVAL; 40003b8c: 01600513 li a0,22 <== NOT EXECUTED } 40003b90: 00008067 ret <== NOT EXECUTED =============================================================================== 40003d2c : int pthread_attr_setaffinity_np( pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset ) { 40003d2c: 00050793 mv a5,a0 if ( attr == NULL || !attr->is_initialized ) { 40003d30: 02050863 beqz a0,40003d60 <== NEVER TAKEN 40003d34: 00052703 lw a4,0(a0) return EINVAL; 40003d38: 01600513 li a0,22 if ( attr == NULL || !attr->is_initialized ) { 40003d3c: 02070463 beqz a4,40003d64 <== NEVER TAKEN } if ( cpuset == NULL || cpusetsize != attr->affinitysetsize ) { 40003d40: 02060263 beqz a2,40003d64 <== NEVER TAKEN 40003d44: 0547a703 lw a4,84(a5) 40003d48: 00b71e63 bne a4,a1,40003d64 40003d4c: 0587a783 lw a5,88(a5) 40003d50: 00062703 lw a4,0(a2) return EINVAL; } CPU_COPY( cpuset, attr->affinityset ); return 0; 40003d54: 00000513 li a0,0 40003d58: 00e7a023 sw a4,0(a5) 40003d5c: 00008067 ret return EINVAL; 40003d60: 01600513 li a0,22 <== NOT EXECUTED } 40003d64: 00008067 ret <== NOT EXECUTED =============================================================================== 40004314 : /* * 18.2.1 Canceling Execution of a Thread, P1003.1c/Draft 10, p. 181 */ int pthread_cancel( pthread_t thread ) { 40004314: fe010113 addi sp,sp,-32 40004318: 00812c23 sw s0,24(sp) 4000431c: 00112e23 sw ra,28(sp) 40004320: 00050413 mv s0,a0 /* * Don't even think about deleting a resource from an ISR. */ if ( _ISR_Is_in_progress() ) { 40004324: 25c010ef jal ra,40005580 <_ISR_Is_in_progress> 40004328: 04051e63 bnez a0,40004384 return EPROTO; } the_thread = _Thread_Get( thread, &lock_context ); 4000432c: 00c10593 addi a1,sp,12 40004330: 00040513 mv a0,s0 40004334: 745020ef jal ra,40007278 <_Thread_Get> if ( the_thread == NULL ) { 40004338: 06050663 beqz a0,400043a4 const ISR_lock_Context *lock_context ) { uint32_t disable_level; disable_level = cpu_self->thread_dispatch_disable_level; 4000433c: 40017437 lui s0,0x40017 40004340: 30040713 addi a4,s0,768 # 40017300 <_Per_CPU_Information> 40004344: 03072683 lw a3,48(a4) _Profiling_Thread_dispatch_disable_critical( cpu_self, disable_level, lock_context ); cpu_self->thread_dispatch_disable_level = disable_level + 1; 40004348: 00168693 addi a3,a3,1 # 4001 4000434c: 02d72823 sw a3,48(a4) 40004350: 00c12683 lw a3,12(sp) 40004354: 3006a073 csrs mstatus,a3 static inline struct _Thread_Control *_Per_CPU_Get_executing( const Per_CPU_Control *cpu ) { return cpu->executing; 40004358: 03872583 lw a1,56(a4) _ISR_lock_ISR_enable( &lock_context ); executing = _Per_CPU_Get_executing( cpu_self ); if ( the_thread == executing ) { _Thread_Exit( executing, THREAD_LIFE_TERMINATING, PTHREAD_CANCELED ); 4000435c: fff00613 li a2,-1 if ( the_thread == executing ) { 40004360: 02b50c63 beq a0,a1,40004398 } else { _Thread_Cancel( the_thread, executing, PTHREAD_CANCELED ); 40004364: 6f8040ef jal ra,40008a5c <_Thread_Cancel> } _Thread_Dispatch_enable( cpu_self ); 40004368: 30040513 addi a0,s0,768 4000436c: 69d020ef jal ra,40007208 <_Thread_Dispatch_enable> return 0; 40004370: 00000513 li a0,0 } 40004374: 01c12083 lw ra,28(sp) 40004378: 01812403 lw s0,24(sp) 4000437c: 02010113 addi sp,sp,32 40004380: 00008067 ret 40004384: 01c12083 lw ra,28(sp) 40004388: 01812403 lw s0,24(sp) return EPROTO; 4000438c: 04700513 li a0,71 } 40004390: 02010113 addi sp,sp,32 40004394: 00008067 ret _Thread_Exit( executing, THREAD_LIFE_TERMINATING, PTHREAD_CANCELED ); 40004398: 00400593 li a1,4 <== NOT EXECUTED 4000439c: 08d040ef jal ra,40008c28 <_Thread_Exit> <== NOT EXECUTED 400043a0: fc9ff06f j 40004368 <== NOT EXECUTED return ESRCH; 400043a4: 00300513 li a0,3 400043a8: fcdff06f j 40004374 =============================================================================== 40004644 : */ int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { 40004644: 00050793 mv a5,a0 POSIX_Condition_variables_Control *the_cond; the_cond = _POSIX_Condition_variables_Get( cond ); if ( the_cond == NULL ) { 40004648: 04050c63 beqz a0,400046a0 return EINVAL; } if ( attr == NULL ) { 4000464c: 04058e63 beqz a1,400046a8 attr = &_POSIX_Condition_variables_Default_attributes; } if ( !attr->is_initialized ) { 40004650: 0005a703 lw a4,0(a1) return EINVAL; 40004654: 01600513 li a0,22 if ( !attr->is_initialized ) { 40004658: 04070663 beqz a4,400046a4 return EINVAL; } if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) { 4000465c: 0105a683 lw a3,16(a1) 40004660: 00100713 li a4,1 40004664: 04d76063 bltu a4,a3,400046a4 if ( the_attr->clock == CLOCK_MONOTONIC ) { 40004668: 0085a603 lw a2,8(a1) flags = (uintptr_t) the_cond ^ POSIX_CONDITION_VARIABLES_MAGIC; 4000466c: 18dfb737 lui a4,0x18dfb 40004670: 1fe70713 addi a4,a4,510 # 18dfb1fe 40004674: 00e7c733 xor a4,a5,a4 ) { #if defined(RTEMS_SMP) _SMP_ticket_lock_Initialize( &queue->Lock ); #endif queue->heads = NULL; 40004678: 0007a623 sw zero,12(a5) queue->owner = NULL; 4000467c: 0007a823 sw zero,16(a5) queue->name = name; 40004680: 0007aa23 sw zero,20(a5) the_cond->mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; 40004684: 0007ac23 sw zero,24(a5) if ( the_attr->clock == CLOCK_MONOTONIC ) { 40004688: 00400693 li a3,4 flags &= ~POSIX_CONDITION_VARIABLES_FLAGS_MASK; 4000468c: ffe77713 andi a4,a4,-2 if ( the_attr->clock == CLOCK_MONOTONIC ) { 40004690: 02d60263 beq a2,a3,400046b4 the_cond->flags = flags; 40004694: 00e7a023 sw a4,0(a5) return EINVAL; } _POSIX_Condition_variables_Initialize( the_cond, attr ); return 0; 40004698: 00000513 li a0,0 4000469c: 00008067 ret return EINVAL; 400046a0: 01600513 li a0,22 } 400046a4: 00008067 ret attr = &_POSIX_Condition_variables_Default_attributes; 400046a8: 400125b7 lui a1,0x40012 400046ac: 54858593 addi a1,a1,1352 # 40012548 <_POSIX_Condition_variables_Default_attributes> 400046b0: fa1ff06f j 40004650 if ( the_attr->clock == CLOCK_MONOTONIC ) { 400046b4: 00c5a683 lw a3,12(a1) <== NOT EXECUTED 400046b8: fc069ee3 bnez a3,40004694 <== NOT EXECUTED flags |= POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC; 400046bc: 00176713 ori a4,a4,1 <== NOT EXECUTED the_cond->flags = flags; 400046c0: 00e7a023 sw a4,0(a5) <== NOT EXECUTED return 0; 400046c4: 00000513 li a0,0 <== NOT EXECUTED 400046c8: 00008067 ret <== NOT EXECUTED =============================================================================== 400044e8 : */ int pthread_condattr_destroy( pthread_condattr_t *attr ) { 400044e8: 00050793 mv a5,a0 if ( attr == NULL || !attr->is_initialized ) 400044ec: 00050e63 beqz a0,40004508 400044f0: 00052703 lw a4,0(a0) return EINVAL; 400044f4: 01600513 li a0,22 if ( attr == NULL || !attr->is_initialized ) 400044f8: 00070a63 beqz a4,4000450c <== NEVER TAKEN attr->is_initialized = false; 400044fc: 0007a023 sw zero,0(a5) # f000 return 0; 40004500: 00000513 li a0,0 40004504: 00008067 ret return EINVAL; 40004508: 01600513 li a0,22 } 4000450c: 00008067 ret =============================================================================== 400037a4 : int pthread_condattr_getclock( const pthread_condattr_t *__restrict attr, clockid_t *__restrict clock ) { if ( attr == NULL ) { 400037a4: 00050c63 beqz a0,400037bc return EINVAL; } if ( clock == NULL ) { 400037a8: 00058a63 beqz a1,400037bc <== ALWAYS TAKEN return EINVAL; } *clock = attr->clock; 400037ac: 00852783 lw a5,8(a0) <== NOT EXECUTED return 0; 400037b0: 00000513 li a0,0 <== NOT EXECUTED *clock = attr->clock; 400037b4: 00f5a023 sw a5,0(a1) <== NOT EXECUTED return 0; 400037b8: 00008067 ret <== NOT EXECUTED return EINVAL; 400037bc: 01600513 li a0,22 } 400037c0: 00008067 ret =============================================================================== 40006c30 : Thread_Entry_information entry = { 40006c30: 4000a7b7 lui a5,0x4000a { 40006c34: f5010113 addi sp,sp,-176 Thread_Entry_information entry = { 40006c38: 85478793 addi a5,a5,-1964 # 40009854 <_Thread_Entry_adaptor_pointer> 40006c3c: 00f12a23 sw a5,20(sp) int schedpolicy = SCHED_RR; 40006c40: 00200793 li a5,2 { 40006c44: 0a112623 sw ra,172(sp) 40006c48: 0a812423 sw s0,168(sp) 40006c4c: 0a912223 sw s1,164(sp) 40006c50: 0b212023 sw s2,160(sp) 40006c54: 09312e23 sw s3,156(sp) 40006c58: 09412c23 sw s4,152(sp) 40006c5c: 09512a23 sw s5,148(sp) 40006c60: 09612823 sw s6,144(sp) 40006c64: 09712623 sw s7,140(sp) Thread_Entry_information entry = { 40006c68: 00c12c23 sw a2,24(sp) 40006c6c: 00d12e23 sw a3,28(sp) int schedpolicy = SCHED_RR; 40006c70: 00f12623 sw a5,12(sp) if ( !start_routine ) 40006c74: 32060663 beqz a2,40006fa0 40006c78: 00050913 mv s2,a0 40006c7c: 00058413 mv s0,a1 the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 40006c80: 2c058c63 beqz a1,40006f58 if ( !the_attr->is_initialized ) 40006c84: 00042783 lw a5,0(s0) 40006c88: 28078e63 beqz a5,40006f24 if ( the_attr->stackaddr != NULL ) { 40006c8c: 00442783 lw a5,4(s0) memset( &config, 0, sizeof( config ) ); 40006c90: 04012423 sw zero,72(sp) config.is_fp = true; 40006c94: 10100713 li a4,257 memset( &config, 0, sizeof( config ) ); 40006c98: 02012023 sw zero,32(sp) config.is_fp = true; 40006c9c: 04e11423 sh a4,72(sp) memset( &config, 0, sizeof( config ) ); 40006ca0: 02012223 sw zero,36(sp) 40006ca4: 02012423 sw zero,40(sp) 40006ca8: 02012623 sw zero,44(sp) 40006cac: 02012823 sw zero,48(sp) 40006cb0: 02012a23 sw zero,52(sp) 40006cb4: 02012c23 sw zero,56(sp) 40006cb8: 02012e23 sw zero,60(sp) 40006cbc: 04012023 sw zero,64(sp) 40006cc0: 04012223 sw zero,68(sp) 40006cc4: 04012623 sw zero,76(sp) if ( !_Stack_Is_enough( the_attr->stacksize, config.is_fp ) ) { 40006cc8: 00842483 lw s1,8(s0) if ( the_attr->stackaddr != NULL ) { 40006ccc: 28078c63 beqz a5,40006f64 bool is_fp ) { size_t minimum; minimum = _TLS_Get_allocation_size(); 40006cd0: 02d040ef jal ra,4000b4fc <_TLS_Get_allocation_size> minimum += _Stack_Minimum(); 40006cd4: a481a783 lw a5,-1464(gp) # 400b2a90 40006cd8: 00f50533 add a0,a0,a5 if ( !_Stack_Is_enough( the_attr->stacksize, config.is_fp ) ) { 40006cdc: 24a4e463 bltu s1,a0,40006f24 config.stack_size = the_attr->stacksize; 40006ce0: 00842783 lw a5,8(s0) config.stack_area = the_attr->stackaddr; 40006ce4: 00442703 lw a4,4(s0) config.stack_size = the_attr->stacksize; 40006ce8: 02f12423 sw a5,40(sp) switch ( the_attr->inheritsched ) { 40006cec: 01042783 lw a5,16(s0) config.stack_area = the_attr->stackaddr; 40006cf0: 02e12223 sw a4,36(sp) switch ( the_attr->inheritsched ) { 40006cf4: 00100713 li a4,1 40006cf8: 28e78a63 beq a5,a4,40006f8c 40006cfc: 00200713 li a4,2 40006d00: 22e79263 bne a5,a4,40006f24 schedpolicy = the_attr->schedpolicy; 40006d04: 01442f83 lw t6,20(s0) schedparam = the_attr->schedparam; 40006d08: 01842f03 lw t5,24(s0) 40006d0c: 01c42e83 lw t4,28(s0) 40006d10: 02042e03 lw t3,32(s0) 40006d14: 02442303 lw t1,36(s0) 40006d18: 02842883 lw a7,40(s0) 40006d1c: 02c42803 lw a6,44(s0) 40006d20: 03042503 lw a0,48(s0) 40006d24: 03442583 lw a1,52(s0) 40006d28: 03842603 lw a2,56(s0) 40006d2c: 03c42683 lw a3,60(s0) 40006d30: 04042703 lw a4,64(s0) 40006d34: 04442783 lw a5,68(s0) schedpolicy = the_attr->schedpolicy; 40006d38: 01f12623 sw t6,12(sp) schedparam = the_attr->schedparam; 40006d3c: 05e12823 sw t5,80(sp) 40006d40: 05d12a23 sw t4,84(sp) 40006d44: 05c12c23 sw t3,88(sp) 40006d48: 04612e23 sw t1,92(sp) 40006d4c: 07112023 sw a7,96(sp) 40006d50: 07012223 sw a6,100(sp) 40006d54: 06a12423 sw a0,104(sp) 40006d58: 06b12623 sw a1,108(sp) 40006d5c: 06c12823 sw a2,112(sp) 40006d60: 06d12a23 sw a3,116(sp) 40006d64: 06e12c23 sw a4,120(sp) 40006d68: 06f12e23 sw a5,124(sp) if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) 40006d6c: 00c42783 lw a5,12(s0) return ENOTSUP; 40006d70: 08600493 li s1,134 if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) 40006d74: 1a079a63 bnez a5,40006f28 error = _POSIX_Thread_Translate_sched_param( 40006d78: 00c12503 lw a0,12(sp) 40006d7c: 03c10693 addi a3,sp,60 40006d80: 03810613 addi a2,sp,56 40006d84: 05010593 addi a1,sp,80 40006d88: 7dd050ef jal ra,4000cd64 <_POSIX_Thread_Translate_sched_param> 40006d8c: 00050493 mv s1,a0 if ( error != 0 ) { 40006d90: 18051c63 bnez a0,40006f28 normal_prio = schedparam.sched_priority; 40006d94: 05012983 lw s3,80(sp) config.scheduler = _Thread_Scheduler_get_home( executing ); 40006d98: 40091537 lui a0,0x40091 40006d9c: 02850793 addi a5,a0,40 # 40091028 <_Scheduler_Table> config.priority = _POSIX_Priority_To_core( 40006da0: 00b10613 addi a2,sp,11 40006da4: 00098593 mv a1,s3 40006da8: 02850513 addi a0,a0,40 config.scheduler = _Thread_Scheduler_get_home( executing ); 40006dac: 02f12023 sw a5,32(sp) config.priority = _POSIX_Priority_To_core( 40006db0: 168050ef jal ra,4000bf18 <_POSIX_Priority_To_core> if ( !valid ) { 40006db4: 00b14783 lbu a5,11(sp) config.priority = _POSIX_Priority_To_core( 40006db8: 02a12823 sw a0,48(sp) 40006dbc: 02b12a23 sw a1,52(sp) if ( !valid ) { 40006dc0: 16078263 beqz a5,40006f24 <== NEVER TAKEN if ( schedpolicy == SCHED_SPORADIC ) { 40006dc4: 00c12703 lw a4,12(sp) 40006dc8: 00400793 li a5,4 40006dcc: 00f71463 bne a4,a5,40006dd4 low_prio = schedparam.sched_ss_low_priority; 40006dd0: 05412983 lw s3,84(sp) core_low_prio = _POSIX_Priority_To_core( config.scheduler, low_prio, &valid ); 40006dd4: 02012503 lw a0,32(sp) 40006dd8: 00b10613 addi a2,sp,11 40006ddc: 00098593 mv a1,s3 40006de0: 138050ef jal ra,4000bf18 <_POSIX_Priority_To_core> if ( !valid ) { 40006de4: 00b14783 lbu a5,11(sp) core_low_prio = _POSIX_Priority_To_core( config.scheduler, low_prio, &valid ); 40006de8: 00050a93 mv s5,a0 40006dec: 00058a13 mv s4,a1 if ( !valid ) { 40006df0: 12078a63 beqz a5,40006f24 if ( the_attr->affinityset == NULL ) { 40006df4: 05842783 lw a5,88(s0) 40006df8: 12078663 beqz a5,40006f24 <== NEVER TAKEN _Assert( _Objects_Allocator_is_owner() || !_System_state_Is_up( _System_state_Get() ) ); return ( *information->allocate )( information ); 40006dfc: 400b2b37 lui s6,0x400b2 _RTEMS_Lock_allocator(); 40006e00: 59d000ef jal ra,40007b9c <_RTEMS_Lock_allocator> return ( *information->allocate )( information ); 40006e04: 0c8b0b93 addi s7,s6,200 # 400b20c8 <_POSIX_Threads_Information> RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate(void) { _Objects_Allocator_lock(); _Thread_Kill_zombies(); 40006e08: 080040ef jal ra,4000ae88 <_Thread_Kill_zombies> 40006e0c: 008ba783 lw a5,8(s7) 40006e10: 0c8b0513 addi a0,s6,200 40006e14: 000780e7 jalr a5 40006e18: 00050993 mv s3,a0 if ( !the_thread ) { 40006e1c: 1e050663 beqz a0,40007008 if ( config.stack_area == NULL ) { 40006e20: 02412783 lw a5,36(sp) 40006e24: 18078263 beqz a5,40006fa8 config.stack_free = _Stack_Free_nothing; 40006e28: 400097b7 lui a5,0x40009 40006e2c: 00078793 mv a5,a5 40006e30: 02f12623 sw a5,44(sp) status = _Thread_Initialize( 40006e34: 02010613 addi a2,sp,32 40006e38: 00098593 mv a1,s3 40006e3c: 0c8b0513 addi a0,s6,200 40006e40: 33d020ef jal ra,4000997c <_Thread_Initialize> if ( !status ) { 40006e44: 18050063 beqz a0,40006fc4 <== NEVER TAKEN if ( the_attr->detachstate == PTHREAD_CREATE_DETACHED ) { 40006e48: 05042703 lw a4,80(s0) the_thread->Life.state |= THREAD_LIFE_DETACHED; 40006e4c: 1ac9a783 lw a5,428(s3) if ( the_attr->detachstate == PTHREAD_CREATE_DETACHED ) { 40006e50: 00071463 bnez a4,40006e58 <== ALWAYS TAKEN the_thread->Life.state |= THREAD_LIFE_DETACHED; 40006e54: 0107e793 ori a5,a5,16 <== NOT EXECUTED the_thread->Life.state |= THREAD_LIFE_CHANGE_DEFERRED; 40006e58: 0087e793 ori a5,a5,8 40006e5c: 1af9a623 sw a5,428(s3) __asm__ volatile ( 40006e60: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40006e64: 0087f793 andi a5,a5,8 _ISR_lock_ISR_disable( &lock_context ); 40006e68: 00f12823 sw a5,16(sp) status = _Scheduler_Set_affinity( 40006e6c: 05842603 lw a2,88(s0) 40006e70: 05442583 lw a1,84(s0) 40006e74: 00098513 mv a0,s3 40006e78: 140020ef jal ra,40008fb8 <_Scheduler_Set_affinity> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006e7c: 01012783 lw a5,16(sp) 40006e80: 3007a073 csrs mstatus,a5 if ( !status ) { 40006e84: 14050e63 beqz a0,40006fe0 <== NEVER TAKEN ( the_attr->inheritsched == PTHREAD_INHERIT_SCHED ); 40006e88: 01042703 lw a4,16(s0) api->Sporadic.sched_ss_repl_period = 40006e8c: 02042f03 lw t5,32(s0) 40006e90: 02442e83 lw t4,36(s0) 40006e94: 02842e03 lw t3,40(s0) 40006e98: 02c42303 lw t1,44(s0) api->Sporadic.sched_ss_init_budget = 40006e9c: 03042883 lw a7,48(s0) 40006ea0: 03442803 lw a6,52(s0) 40006ea4: 03842503 lw a0,56(s0) 40006ea8: 03c42583 lw a1,60(s0) api->Sporadic.sched_ss_max_repl = 40006eac: 04042603 lw a2,64(s0) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 40006eb0: 1989a783 lw a5,408(s3) ( the_attr->inheritsched == PTHREAD_INHERIT_SCHED ); 40006eb4: fff70713 addi a4,a4,-1 40006eb8: 00173713 seqz a4,a4 if ( schedpolicy == SCHED_SPORADIC ) { 40006ebc: 00c12683 lw a3,12(sp) ( the_attr->inheritsched == PTHREAD_INHERIT_SCHED ); 40006ec0: 08e985a3 sb a4,139(s3) RTEMS_INLINE_ROUTINE void _Priority_Node_set_priority( Priority_Node *node, Priority_Control priority ) { node->priority = priority; 40006ec4: 0357ac23 sw s5,56(a5) # 40009038 <_Thread_Handler_initialization> 40006ec8: 0347ae23 sw s4,60(a5) api->Sporadic.sched_ss_repl_period = 40006ecc: 05e7a023 sw t5,64(a5) 40006ed0: 05d7a223 sw t4,68(a5) 40006ed4: 05c7a423 sw t3,72(a5) 40006ed8: 0467a623 sw t1,76(a5) api->Sporadic.sched_ss_init_budget = 40006edc: 0517a823 sw a7,80(a5) 40006ee0: 0507aa23 sw a6,84(a5) 40006ee4: 04a7ac23 sw a0,88(a5) 40006ee8: 04b7ae23 sw a1,92(a5) api->Sporadic.sched_ss_max_repl = 40006eec: 06c7a023 sw a2,96(a5) if ( schedpolicy == SCHED_SPORADIC ) { 40006ef0: 00400713 li a4,4 40006ef4: 10e68463 beq a3,a4,40006ffc __asm__ volatile ( 40006ef8: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40006efc: 0087f793 andi a5,a5,8 _ISR_lock_ISR_disable( &lock_context ); 40006f00: 00f12823 sw a5,16(sp) status = _Thread_Start( the_thread, &entry, &lock_context ); 40006f04: 01010613 addi a2,sp,16 40006f08: 01410593 addi a1,sp,20 40006f0c: 00098513 mv a0,s3 40006f10: 2cc040ef jal ra,4000b1dc <_Thread_Start> *thread = the_thread->Object.id; 40006f14: 0089a783 lw a5,8(s3) 40006f18: 00f92023 sw a5,0(s2) _RTEMS_Unlock_allocator(); 40006f1c: 48d000ef jal ra,40007ba8 <_RTEMS_Unlock_allocator> return 0; 40006f20: 0080006f j 40006f28 switch ( the_attr->inheritsched ) { 40006f24: 01600493 li s1,22 } 40006f28: 0ac12083 lw ra,172(sp) 40006f2c: 0a812403 lw s0,168(sp) 40006f30: 0a012903 lw s2,160(sp) 40006f34: 09c12983 lw s3,156(sp) 40006f38: 09812a03 lw s4,152(sp) 40006f3c: 09412a83 lw s5,148(sp) 40006f40: 09012b03 lw s6,144(sp) 40006f44: 08c12b83 lw s7,140(sp) 40006f48: 00048513 mv a0,s1 40006f4c: 0a412483 lw s1,164(sp) 40006f50: 0b010113 addi sp,sp,176 40006f54: 00008067 ret the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 40006f58: 40092437 lui s0,0x40092 40006f5c: c8840413 addi s0,s0,-888 # 40091c88 <_POSIX_Threads_Default_attributes> 40006f60: d25ff06f j 40006c84 if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) 40006f64: 8fc1a983 lw s3,-1796(gp) # 400b2944 <_POSIX_Threads_Minimum_stack_size> 40006f68: 0099f463 bgeu s3,s1,40006f70 40006f6c: 00048993 mv s3,s1 config.stack_size = _POSIX_Threads_Ensure_minimum_stack( 40006f70: 03312423 sw s3,40(sp) } #else (void) is_fp; #endif stack_size += _TLS_Get_allocation_size(); 40006f74: 588040ef jal ra,4000b4fc <_TLS_Get_allocation_size> switch ( the_attr->inheritsched ) { 40006f78: 01042783 lw a5,16(s0) 40006f7c: 013509b3 add s3,a0,s3 config.stack_size = _Stack_Extend_size( config.stack_size, config.is_fp ); 40006f80: 03312423 sw s3,40(sp) switch ( the_attr->inheritsched ) { 40006f84: 00100713 li a4,1 40006f88: d6e79ae3 bne a5,a4,40006cfc error = pthread_getschedparam( 40006f8c: 648000ef jal ra,400075d4 40006f90: 05010613 addi a2,sp,80 40006f94: 00c10593 addi a1,sp,12 40006f98: 3d4000ef jal ra,4000736c break; 40006f9c: dd1ff06f j 40006d6c return EFAULT; 40006fa0: 00e00493 li s1,14 40006fa4: f85ff06f j 40006f28 config.stack_area = _Stack_Allocate( config.stack_size ); 40006fa8: 02812503 lw a0,40(sp) config.stack_free = _Stack_Free; 40006fac: 4000b7b7 lui a5,0x4000b 40006fb0: 1d478793 addi a5,a5,468 # 4000b1d4 <_Stack_Free> 40006fb4: 02f12623 sw a5,44(sp) config.stack_area = _Stack_Allocate( config.stack_size ); 40006fb8: 214040ef jal ra,4000b1cc <_Stack_Allocate> 40006fbc: 02a12223 sw a0,36(sp) if ( status ) { 40006fc0: e6051ae3 bnez a0,40006e34 Objects_Control *the_object ) { _Assert( _Objects_Allocator_is_owner() ); _Assert( information->deallocate != NULL ); ( *information->deallocate )( information, the_object ); 40006fc4: 00cba783 lw a5,12(s7) 40006fc8: 00098593 mv a1,s3 40006fcc: 0c8b0513 addi a0,s6,200 40006fd0: 000780e7 jalr a5 return EAGAIN; 40006fd4: 00b00493 li s1,11 _RTEMS_Unlock_allocator(); 40006fd8: 3d1000ef jal ra,40007ba8 <_RTEMS_Unlock_allocator> 40006fdc: f4dff06f j 40006f28 ( *information->deallocate )( information, the_object ); 40006fe0: 00cba783 lw a5,12(s7) 40006fe4: 00098593 mv a1,s3 <== NOT EXECUTED 40006fe8: 0c8b0513 addi a0,s6,200 <== NOT EXECUTED 40006fec: 000780e7 jalr a5 <== NOT EXECUTED return EINVAL; 40006ff0: 01600493 li s1,22 <== NOT EXECUTED _RTEMS_Unlock_allocator(); 40006ff4: 3b5000ef jal ra,40007ba8 <_RTEMS_Unlock_allocator> <== NOT EXECUTED return EINVAL; 40006ff8: f31ff06f j 40006f28 <== NOT EXECUTED _POSIX_Threads_Sporadic_timer( &api->Sporadic.Timer ); 40006ffc: 00878513 addi a0,a5,8 <== NOT EXECUTED 40007000: b05ff0ef jal ra,40006b04 <_POSIX_Threads_Sporadic_timer> 40007004: ef5ff06f j 40006ef8 _RTEMS_Unlock_allocator(); 40007008: 3a1000ef jal ra,40007ba8 <_RTEMS_Unlock_allocator> return EAGAIN; 4000700c: 00b00493 li s1,11 40007010: f19ff06f j 40006f28 =============================================================================== 4000712c : Thread_CPU_budget_algorithms budget_algorithm; const Scheduler_Control *scheduler; Priority_Control priority; bool ok; if ( attr == NULL ) { 4000712c: 18058263 beqz a1,400072b0 { 40007130: fd010113 addi sp,sp,-48 40007134: 00058793 mv a5,a1 40007138: 02912223 sw s1,36(sp) return EINVAL; } attr = memset( attr, 0, sizeof( *attr ) ); 4000713c: 06000613 li a2,96 40007140: 00050493 mv s1,a0 40007144: 00000593 li a1,0 40007148: 00078513 mv a0,a5 { 4000714c: 02112623 sw ra,44(sp) 40007150: 02812423 sw s0,40(sp) 40007154: 03212023 sw s2,32(sp) 40007158: 01312e23 sw s3,28(sp) 4000715c: 01412c23 sw s4,24(sp) 40007160: 01512a23 sw s5,20(sp) attr = memset( attr, 0, sizeof( *attr ) ); 40007164: 209740ef jal ra,4007bb6c 40007168: 00050413 mv s0,a0 the_thread = _Thread_Get( thread, &lock_context ); 4000716c: 00c10593 addi a1,sp,12 40007170: 00048513 mv a0,s1 40007174: 710020ef jal ra,40009884 <_Thread_Get> 40007178: 00050493 mv s1,a0 if ( the_thread == NULL ) { 4000717c: 12050e63 beqz a0,400072b8 ) { #if defined(RTEMS_POSIX_API) const POSIX_API_Control *api; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 40007180: 19852903 lw s2,408(a0) _Thread_State_acquire_critical( the_thread, &lock_context ); attr->stackaddr = the_thread->Start.Initial_stack.area; attr->stacksize = the_thread->Start.Initial_stack.size; if ( the_thread->was_created_with_inherited_scheduler ) { 40007184: 08b54783 lbu a5,139(a0) attr->stackaddr = the_thread->Start.Initial_stack.area; 40007188: 0d052683 lw a3,208(a0) attr->stacksize = the_thread->Start.Initial_stack.size; 4000718c: 0cc52703 lw a4,204(a0) param->sched_ss_low_priority = _POSIX_Priority_From_core( 40007190: 03892583 lw a1,56(s2) 40007194: 03c92603 lw a2,60(s2) attr->inheritsched = PTHREAD_INHERIT_SCHED; } else { attr->inheritsched = PTHREAD_EXPLICIT_SCHED; 40007198: 0017b793 seqz a5,a5 4000719c: 00178793 addi a5,a5,1 400071a0: 400919b7 lui s3,0x40091 attr->stackaddr = the_thread->Start.Initial_stack.area; 400071a4: 00d42223 sw a3,4(s0) attr->stacksize = the_thread->Start.Initial_stack.size; 400071a8: 00e42423 sw a4,8(s0) if ( the_thread->was_created_with_inherited_scheduler ) { 400071ac: 00f42823 sw a5,16(s0) 400071b0: 02898513 addi a0,s3,40 # 40091028 <_Scheduler_Table> 400071b4: 5c1040ef jal ra,4000bf74 <_POSIX_Priority_From_core> scheduler, &attr->schedparam ); priority = the_thread->Real_priority.priority; if ( _Thread_Is_joinable( the_thread ) ) { 400071b8: 1ac4a783 lw a5,428(s1) scheduler, api->Sporadic.Low_priority.priority ); param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period; 400071bc: 04092f03 lw t5,64(s2) 400071c0: 04492e83 lw t4,68(s2) 400071c4: 0047d793 srli a5,a5,0x4 400071c8: 04892e03 lw t3,72(s2) 400071cc: 04c92303 lw t1,76(s2) param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget; 400071d0: 05092883 lw a7,80(s2) 400071d4: 05492803 lw a6,84(s2) 400071d8: 05892583 lw a1,88(s2) 400071dc: 05c92683 lw a3,92(s2) param->sched_ss_max_repl = api->Sporadic.sched_ss_max_repl; 400071e0: 06092703 lw a4,96(s2) 400071e4: 0017c793 xori a5,a5,1 400071e8: 0017f793 andi a5,a5,1 priority = the_thread->Real_priority.priority; 400071ec: 0304aa03 lw s4,48(s1) 400071f0: 0344aa83 lw s5,52(s1) attr->detachstate = PTHREAD_CREATE_JOINABLE; } else { attr->detachstate = PTHREAD_CREATE_DETACHED; } attr->affinityset = &attr->affinitysetpreallocated; 400071f4: 05c40613 addi a2,s0,92 400071f8: 04f42823 sw a5,80(s0) attr->affinitysetsize = sizeof( attr->affinitysetpreallocated ); 400071fc: 00400793 li a5,4 param->sched_ss_low_priority = _POSIX_Priority_From_core( 40007200: 00a42e23 sw a0,28(s0) param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget; 40007204: 02b42c23 sw a1,56(s0) param->sched_ss_repl_period = api->Sporadic.sched_ss_repl_period; 40007208: 03e42023 sw t5,32(s0) 4000720c: 03d42223 sw t4,36(s0) 40007210: 03c42423 sw t3,40(s0) 40007214: 02642623 sw t1,44(s0) param->sched_ss_init_budget = api->Sporadic.sched_ss_init_budget; 40007218: 03142823 sw a7,48(s0) 4000721c: 03042a23 sw a6,52(s0) 40007220: 02d42e23 sw a3,60(s0) param->sched_ss_max_repl = api->Sporadic.sched_ss_max_repl; 40007224: 04e42023 sw a4,64(s0) attr->affinityset = &attr->affinitysetpreallocated; 40007228: 04c42c23 sw a2,88(s0) attr->affinitysetsize = sizeof( attr->affinitysetpreallocated ); 4000722c: 04f42a23 sw a5,84(s0) ok = _Scheduler_Get_affinity( 40007230: 00400593 li a1,4 40007234: 00048513 mv a0,s1 40007238: 530010ef jal ra,40008768 <_Scheduler_Get_affinity> 4000723c: 00050913 mv s2,a0 the_thread, attr->affinitysetsize, attr->affinityset ); budget_algorithm = the_thread->budget_algorithm; 40007240: 0904a483 lw s1,144(s1) 40007244: 00c12783 lw a5,12(sp) 40007248: 3007a073 csrs mstatus,a5 _Thread_State_release( the_thread, &lock_context ); attr->is_initialized = true; 4000724c: 00100793 li a5,1 attr->contentionscope = PTHREAD_SCOPE_PROCESS; attr->cputime_clock_allowed = 1; attr->schedparam.sched_priority = _POSIX_Priority_From_core( 40007250: 000a0593 mv a1,s4 40007254: 000a8613 mv a2,s5 attr->is_initialized = true; 40007258: 00f42023 sw a5,0(s0) attr->cputime_clock_allowed = 1; 4000725c: 04f42623 sw a5,76(s0) attr->contentionscope = PTHREAD_SCOPE_PROCESS; 40007260: 00042623 sw zero,12(s0) attr->schedparam.sched_priority = _POSIX_Priority_From_core( 40007264: 02898513 addi a0,s3,40 40007268: 50d040ef jal ra,4000bf74 <_POSIX_Priority_From_core> 4000726c: 00a42c23 sw a0,24(s0) scheduler, priority ); attr->schedpolicy = _POSIX_Thread_Translate_to_sched_policy( budget_algorithm ); 40007270: 00048513 mv a0,s1 40007274: 2d1050ef jal ra,4000cd44 <_POSIX_Thread_Translate_to_sched_policy> attr->schedpolicy = 40007278: 00a42a23 sw a0,20(s0) return ok ? 0 : EINVAL; 4000727c: 00000513 li a0,0 40007280: 02090463 beqz s2,400072a8 <== NEVER TAKEN } 40007284: 02c12083 lw ra,44(sp) 40007288: 02812403 lw s0,40(sp) 4000728c: 02412483 lw s1,36(sp) 40007290: 02012903 lw s2,32(sp) 40007294: 01c12983 lw s3,28(sp) 40007298: 01812a03 lw s4,24(sp) 4000729c: 01412a83 lw s5,20(sp) 400072a0: 03010113 addi sp,sp,48 400072a4: 00008067 ret return ok ? 0 : EINVAL; 400072a8: 01600513 li a0,22 <== NOT EXECUTED 400072ac: fd9ff06f j 40007284 <== NOT EXECUTED 400072b0: 01600513 li a0,22 } 400072b4: 00008067 ret return ESRCH; 400072b8: 00300513 li a0,3 400072bc: fc9ff06f j 40007284 =============================================================================== 40004148 : static inline struct _Thread_Control *_Per_CPU_Get_executing( const Per_CPU_Control *cpu ) { return cpu->executing; 40004148: 400147b7 lui a5,0x40014 4000414c: fb87a783 lw a5,-72(a5) # 40013fb8 <_Per_CPU_Information+0x38> */ void *pthread_getspecific( pthread_key_t key ) { 40004150: 00050693 mv a3,a0 __asm__ volatile ( 40004154: 300475f3 csrrci a1,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40004158: 0085f593 andi a1,a1,8 RBTree_Node *parent; link = _RBTree_Root_const_reference( the_rbtree ); parent = NULL; while ( *link != NULL ) { 4000415c: 19c7a503 lw a0,412(a5) 40004160: 00051c63 bnez a0,40004178 40004164: 0280006f j 4000418c parent = *link; if ( ( *equal )( key, parent ) ) { return ( *map )( parent ); } else if ( ( *less )( key, parent ) ) { 40004168: 00f6f463 bgeu a3,a5,40004170 return &RB_LEFT( the_node, Node ); 4000416c: 00050713 mv a4,a0 <== NOT EXECUTED while ( *link != NULL ) { 40004170: 00072503 lw a0,0(a4) 40004174: 00050c63 beqz a0,4000418c <== NEVER TAKEN const POSIX_Keys_Key_value_pair *the_right; the_left = left; the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right ); return *the_left == the_right->key; 40004178: 01052783 lw a5,16(a0) the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right ); 4000417c: ff850613 addi a2,a0,-8 return &RB_RIGHT( the_node, Node ); 40004180: 00450713 addi a4,a0,4 if ( ( *equal )( key, parent ) ) { 40004184: fef692e3 bne a3,a5,40004168 _POSIX_Keys_Key_value_acquire( executing, &lock_context ); key_value_pair = _POSIX_Keys_Key_value_find( key, executing ); if ( key_value_pair != NULL ) { value = key_value_pair->value; 40004188: 02062503 lw a0,32(a2) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000418c: 3005a073 csrs mstatus,a1 } _POSIX_Keys_Key_value_release( executing, &lock_context ); return value; } 40004190: 00008067 ret =============================================================================== 40006890 : { POSIX_Mutex_Control *the_mutex; unsigned long flags; Thread_queue_Context queue_context; if ( prioceiling == NULL ) { 40006890: 0c058063 beqz a1,40006950 { 40006894: fe010113 addi sp,sp,-32 40006898: 00812c23 sw s0,24(sp) 4000689c: 00112e23 sw ra,28(sp) 400068a0: 00912a23 sw s1,20(sp) 400068a4: 01212823 sw s2,16(sp) 400068a8: 01312623 sw s3,12(sp) 400068ac: 00050413 mv s0,a0 return EINVAL; } the_mutex = _POSIX_Mutex_Get( RTEMS_DECONST( pthread_mutex_t *, mutex ) ); POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 400068b0: 06050263 beqz a0,40006914 400068b4: 00052903 lw s2,0(a0) 400068b8: 961c17b7 lui a5,0x961c1 400068bc: 3b878793 addi a5,a5,952 # 961c13b8 400068c0: 01254733 xor a4,a0,s2 400068c4: ff877713 andi a4,a4,-8 400068c8: 00058493 mv s1,a1 400068cc: 04f71063 bne a4,a5,4000690c __asm__ volatile ( 400068d0: 300479f3 csrrci s3,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 400068d4: 0089f993 andi s3,s3,8 _POSIX_Mutex_Acquire( the_mutex, &queue_context ); if ( _POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_CEILING ) { 400068d8: 00200793 li a5,2 RTEMS_INLINE_ROUTINE POSIX_Mutex_Protocol _POSIX_Mutex_Get_protocol( unsigned long flags ) { return flags & POSIX_MUTEX_PROTOCOL_MASK; 400068dc: 00397913 andi s2,s2,3 400068e0: 04f90a63 beq s2,a5,40006934 *prioceiling = _POSIX_Priority_From_core( _POSIX_Mutex_Get_scheduler( the_mutex ), _POSIX_Mutex_Get_priority( the_mutex ) ); } else { *prioceiling = 0; 400068e4: 0004a023 sw zero,0(s1) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 400068e8: 3009a073 csrs mstatus,s3 } _POSIX_Mutex_Release( the_mutex, &queue_context ); return 0; } 400068ec: 01c12083 lw ra,28(sp) 400068f0: 01812403 lw s0,24(sp) 400068f4: 01412483 lw s1,20(sp) 400068f8: 01012903 lw s2,16(sp) 400068fc: 00c12983 lw s3,12(sp) return 0; 40006900: 00000513 li a0,0 } 40006904: 02010113 addi sp,sp,32 40006908: 00008067 ret POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 4000690c: 524000ef jal ra,40006e30 <_POSIX_Mutex_Auto_initialization> 40006910: fc0510e3 bnez a0,400068d0 <== ALWAYS TAKEN } 40006914: 01c12083 lw ra,28(sp) 40006918: 01812403 lw s0,24(sp) 4000691c: 01412483 lw s1,20(sp) 40006920: 01012903 lw s2,16(sp) 40006924: 00c12983 lw s3,12(sp) return EINVAL; 40006928: 01600513 li a0,22 } 4000692c: 02010113 addi sp,sp,32 40006930: 00008067 ret *prioceiling = _POSIX_Priority_From_core( 40006934: 03042583 lw a1,48(s0) 40006938: 03442603 lw a2,52(s0) 4000693c: 40019537 lui a0,0x40019 40006940: 04850513 addi a0,a0,72 # 40019048 <_Scheduler_Table> 40006944: 7ec000ef jal ra,40007130 <_POSIX_Priority_From_core> 40006948: 00a4a023 sw a0,0(s1) 4000694c: f9dff06f j 400068e8 return EINVAL; 40006950: 01600513 li a0,22 } 40006954: 00008067 ret =============================================================================== 40006958 : int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutexattr_t *attr ) { 40006958: fe010113 addi sp,sp,-32 4000695c: 00912a23 sw s1,20(sp) 40006960: 00112e23 sw ra,28(sp) 40006964: 00812c23 sw s0,24(sp) 40006968: 00050493 mv s1,a0 POSIX_Mutex_Protocol protocol; unsigned long flags; Priority_Control priority; const Scheduler_Control *scheduler; if ( attr ) the_attr = attr; 4000696c: 04058063 beqz a1,400069ac else the_attr = &_POSIX_Mutex_Default_attributes; /* Check for NULL mutex */ if ( !mutex ) 40006970: 10050063 beqz a0,40006a70 * value in an uninitialized variable to make this fail. * * Thus, we do not look at *mutex. */ if ( !the_attr->is_initialized ) 40006974: 0005a783 lw a5,0(a1) return EINVAL; 40006978: 01600513 li a0,22 if ( !the_attr->is_initialized ) 4000697c: 00078e63 beqz a5,40006998 return EINVAL; if ( !_POSIX_Is_valid_pshared( the_attr->process_shared ) ) { 40006980: 0045a703 lw a4,4(a1) 40006984: 00100793 li a5,1 40006988: 00e7e863 bltu a5,a4,40006998 4000698c: 00c5a703 lw a4,12(a1) } /* * Determine the discipline of the mutex */ switch ( the_attr->protocol ) { 40006990: 00200693 li a3,2 40006994: 06e6f663 bgeu a3,a4,40006a00 ); the_mutex->Recursive.nest_level = 0; _Priority_Node_initialize( &the_mutex->Priority_ceiling, priority ); the_mutex->scheduler = scheduler; return 0; } 40006998: 01c12083 lw ra,28(sp) 4000699c: 01812403 lw s0,24(sp) 400069a0: 01412483 lw s1,20(sp) 400069a4: 02010113 addi sp,sp,32 400069a8: 00008067 ret if ( !mutex ) 400069ac: 0c050263 beqz a0,40006a70 flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC; 400069b0: 961c17b7 lui a5,0x961c1 400069b4: 3b878793 addi a5,a5,952 # 961c13b8 400069b8: 00f547b3 xor a5,a0,a5 flags &= ~POSIX_MUTEX_FLAGS_MASK; 400069bc: ff87f793 andi a5,a5,-8 the_mutex->flags = flags; 400069c0: 00f52023 sw a5,0(a0) priority = 0; 400069c4: 00000513 li a0,0 400069c8: 00000793 li a5,0 } 400069cc: 01c12083 lw ra,28(sp) 400069d0: 01812403 lw s0,24(sp) RTEMS_INLINE_ROUTINE void _Priority_Node_initialize( Priority_Node *node, Priority_Control priority ) { node->priority = priority; 400069d4: 02a4a823 sw a0,48(s1) ) { #if defined(RTEMS_SMP) _SMP_ticket_lock_Initialize( &queue->Lock ); #endif queue->heads = NULL; 400069d8: 0004a623 sw zero,12(s1) queue->owner = NULL; 400069dc: 0004a823 sw zero,16(s1) queue->name = name; 400069e0: 0004aa23 sw zero,20(s1) the_mutex->Recursive.nest_level = 0; 400069e4: 0004ac23 sw zero,24(s1) 400069e8: 02f4aa23 sw a5,52(s1) the_mutex->scheduler = scheduler; 400069ec: 02b4ac23 sw a1,56(s1) return 0; 400069f0: 00000513 li a0,0 } 400069f4: 01412483 lw s1,20(sp) 400069f8: 02010113 addi sp,sp,32 400069fc: 00008067 ret switch ( the_attr->type ) { 40006a00: 0105a683 lw a3,16(a1) 40006a04: 00300613 li a2,3 40006a08: f8d668e3 bltu a2,a3,40006998 flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC; 40006a0c: 961c1637 lui a2,0x961c1 40006a10: 3b860613 addi a2,a2,952 # 961c13b8 40006a14: 00c4c633 xor a2,s1,a2 flags &= ~POSIX_MUTEX_FLAGS_MASK; 40006a18: ff867613 andi a2,a2,-8 flags |= protocol; 40006a1c: 00e66633 or a2,a2,a4 if ( the_attr->type == PTHREAD_MUTEX_RECURSIVE ) { 40006a20: 00f69463 bne a3,a5,40006a28 flags |= POSIX_MUTEX_RECURSIVE; 40006a24: 00466613 ori a2,a2,4 <== NOT EXECUTED the_mutex->flags = flags; 40006a28: 00c4a023 sw a2,0(s1) if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) { 40006a2c: 00200793 li a5,2 40006a30: 04f71c63 bne a4,a5,40006a88 prio_ceiling = the_attr->prio_ceiling; 40006a34: 0085a583 lw a1,8(a1) if ( prio_ceiling == INT_MAX ) { 40006a38: 800007b7 lui a5,0x80000 40006a3c: fff7c793 not a5,a5 40006a40: 40019437 lui s0,0x40019 40006a44: 00f59863 bne a1,a5,40006a54 RTEMS_INLINE_ROUTINE int _POSIX_Priority_Get_maximum( const Scheduler_Control *scheduler ) { _Assert( (int) scheduler->maximum_priority > 1 ); return (int) scheduler->maximum_priority - 1; 40006a48: 04840793 addi a5,s0,72 # 40019048 <_Scheduler_Table> 40006a4c: 0407a583 lw a1,64(a5) # 80000040 40006a50: fff58593 addi a1,a1,-1 priority = _POSIX_Priority_To_core( scheduler, prio_ceiling, &valid ); 40006a54: 00f10613 addi a2,sp,15 40006a58: 04840513 addi a0,s0,72 40006a5c: 678000ef jal ra,400070d4 <_POSIX_Priority_To_core> if ( !valid ) { 40006a60: 00f14703 lbu a4,15(sp) priority = _POSIX_Priority_To_core( scheduler, prio_ceiling, &valid ); 40006a64: 00058793 mv a5,a1 scheduler = _Thread_Scheduler_get_home( _Thread_Get_executing() ); 40006a68: 04840593 addi a1,s0,72 if ( !valid ) { 40006a6c: f60710e3 bnez a4,400069cc } 40006a70: 01c12083 lw ra,28(sp) 40006a74: 01812403 lw s0,24(sp) 40006a78: 01412483 lw s1,20(sp) return EINVAL; 40006a7c: 01600513 li a0,22 } 40006a80: 02010113 addi sp,sp,32 40006a84: 00008067 ret scheduler = NULL; 40006a88: 00000593 li a1,0 priority = 0; 40006a8c: 00000513 li a0,0 40006a90: 00000793 li a5,0 40006a94: f39ff06f j 400069cc =============================================================================== 40006cbc : int pthread_mutex_setprioceiling( pthread_mutex_t *mutex, int prioceiling, int *old_ceiling ) { 40006cbc: fb010113 addi sp,sp,-80 40006cc0: 04112623 sw ra,76(sp) 40006cc4: 04812423 sw s0,72(sp) 40006cc8: 04912223 sw s1,68(sp) 40006ccc: 05212023 sw s2,64(sp) 40006cd0: 03312e23 sw s3,60(sp) 40006cd4: 03412c23 sw s4,56(sp) POSIX_Mutex_Control *the_mutex; int error; int unlock_error; if ( old_ceiling == NULL ) { 40006cd8: 04060e63 beqz a2,40006d34 40006cdc: 00060493 mv s1,a2 40006ce0: 00050913 mv s2,a0 40006ce4: 00058993 mv s3,a1 /* * Must acquire the mutex before we can change it's ceiling. * POSIX says block until we acquire it. */ error = pthread_mutex_lock( mutex ); 40006ce8: db1ff0ef jal ra,40006a98 40006cec: 00050413 mv s0,a0 if ( error != 0 ) { 40006cf0: 04051263 bnez a0,40006d34 return flags & POSIX_MUTEX_PROTOCOL_MASK; 40006cf4: 00092783 lw a5,0(s2) return EINVAL; } the_mutex = _POSIX_Mutex_Get( mutex ); if ( 40006cf8: 00200713 li a4,2 40006cfc: 0037f793 andi a5,a5,3 40006d00: 02e78e63 beq a5,a4,40006d3c error = 0; } else { error = EINVAL; } } else { *old_ceiling = 0; 40006d04: 0004a023 sw zero,0(s1) error = 0; } unlock_error = pthread_mutex_unlock( mutex ); 40006d08: 00090513 mv a0,s2 40006d0c: 1b8000ef jal ra,40006ec4 _Assert( unlock_error == 0 ); (void) unlock_error; return error; } 40006d10: 04c12083 lw ra,76(sp) 40006d14: 00040513 mv a0,s0 40006d18: 04812403 lw s0,72(sp) 40006d1c: 04412483 lw s1,68(sp) 40006d20: 04012903 lw s2,64(sp) 40006d24: 03c12983 lw s3,60(sp) 40006d28: 03812a03 lw s4,56(sp) 40006d2c: 05010113 addi sp,sp,80 40006d30: 00008067 ret return EINVAL; 40006d34: 01600413 li s0,22 40006d38: fd9ff06f j 40006d10 *old_ceiling = _POSIX_Priority_From_core( scheduler, old_priority ); 40006d3c: 03092583 lw a1,48(s2) 40006d40: 03492603 lw a2,52(s2) 40006d44: 40019a37 lui s4,0x40019 40006d48: 048a0513 addi a0,s4,72 # 40019048 <_Scheduler_Table> 40006d4c: 3e4000ef jal ra,40007130 <_POSIX_Priority_From_core> 40006d50: 00a4a023 sw a0,0(s1) new_priority = _POSIX_Priority_To_core( scheduler, prioceiling, &valid ); 40006d54: 00b10613 addi a2,sp,11 40006d58: 00098593 mv a1,s3 40006d5c: 048a0513 addi a0,s4,72 40006d60: 374000ef jal ra,400070d4 <_POSIX_Priority_To_core> if ( valid ) { 40006d64: 00b14783 lbu a5,11(sp) 40006d68: 00079663 bnez a5,40006d74 error = EINVAL; 40006d6c: 01600413 li s0,22 40006d70: f99ff06f j 40006d08 return the_mutex->Recursive.Mutex.Queue.Queue.owner; 40006d74: 01092783 lw a5,16(s2) 40006d78: 02012023 sw zero,32(sp) if ( owner != NULL ) { 40006d7c: 06078063 beqz a5,40006ddc <== NEVER TAKEN __asm__ volatile ( 40006d80: 30047773 csrrci a4,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40006d84: 00877713 andi a4,a4,8 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 ); 40006d88: 00e12623 sw a4,12(sp) _Thread_Priority_changed( 40006d8c: 00c10993 addi s3,sp,12 node->priority = priority; 40006d90: 02a92823 sw a0,48(s2) 40006d94: 02b92a23 sw a1,52(s2) 40006d98: 00098693 mv a3,s3 40006d9c: 00000613 li a2,0 40006da0: 02090593 addi a1,s2,32 40006da4: 00078513 mv a0,a5 40006da8: 555020ef jal ra,40009afc <_Thread_Priority_changed> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006dac: 00c12783 lw a5,12(sp) 40006db0: 3007a073 csrs mstatus,a5 disable_level = cpu_self->thread_dispatch_disable_level; 40006db4: 4001e4b7 lui s1,0x4001e 40006db8: bc048713 addi a4,s1,-1088 # 4001dbc0 <_Per_CPU_Information> 40006dbc: 03072783 lw a5,48(a4) _Thread_Priority_update( &queue_context ); 40006dc0: 00098513 mv a0,s3 cpu_self->thread_dispatch_disable_level = disable_level + 1; 40006dc4: 00178793 addi a5,a5,1 40006dc8: 02f72823 sw a5,48(a4) 40006dcc: 5d1020ef jal ra,40009b9c <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40006dd0: bc048513 addi a0,s1,-1088 40006dd4: 088030ef jal ra,40009e5c <_Thread_Dispatch_enable> error = 0; 40006dd8: f31ff06f j 40006d08 the_mutex->Priority_ceiling.priority = priority_ceiling; 40006ddc: 02a92823 sw a0,48(s2) <== NOT EXECUTED 40006de0: 02b92a23 sw a1,52(s2) <== NOT EXECUTED 40006de4: 00c10993 addi s3,sp,12 <== NOT EXECUTED 40006de8: fcdff06f j 40006db4 <== NOT EXECUTED =============================================================================== 40006ec4 : Thread_queue_Context queue_context; Thread_Control *executing; Status_Control status; the_mutex = _POSIX_Mutex_Get( mutex ); POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006ec4: 20050463 beqz a0,400070cc { 40006ec8: fb010113 addi sp,sp,-80 40006ecc: 04912223 sw s1,68(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006ed0: 00052483 lw s1,0(a0) 40006ed4: 961c17b7 lui a5,0x961c1 { 40006ed8: 04812423 sw s0,72(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006edc: 00954733 xor a4,a0,s1 { 40006ee0: 04112623 sw ra,76(sp) 40006ee4: 05212023 sw s2,64(sp) 40006ee8: 03312e23 sw s3,60(sp) 40006eec: 03412c23 sw s4,56(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 40006ef0: 3b878793 addi a5,a5,952 # 961c13b8 40006ef4: ff877713 andi a4,a4,-8 40006ef8: 00050413 mv s0,a0 40006efc: 10f71863 bne a4,a5,4000700c __asm__ volatile ( 40006f00: 300477f3 csrrci a5,mstatus,8 40006f04: 4001e9b7 lui s3,0x4001e return mstatus & RISCV_MSTATUS_MIE; 40006f08: 0087f793 andi a5,a5,8 40006f0c: bc098913 addi s2,s3,-1088 # 4001dbc0 <_Per_CPU_Information> 40006f10: 00f12623 sw a5,12(sp) return flags & POSIX_MUTEX_PROTOCOL_MASK; 40006f14: 0034f493 andi s1,s1,3 40006f18: 03892503 lw a0,56(s2) executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context ); switch ( _POSIX_Mutex_Get_protocol( flags ) ) { 40006f1c: 0a048e63 beqz s1,40006fd8 40006f20: 00200793 li a5,2 40006f24: 02f48663 beq s1,a5,40006f50 if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) { 40006f28: 01042783 lw a5,16(s0) 40006f2c: 0af51a63 bne a0,a5,40006fe0 nest_level = the_mutex->Recursive.nest_level; 40006f30: 01842783 lw a5,24(s0) if ( nest_level > 0 ) { 40006f34: 14079a63 bnez a5,40007088 <== NEVER TAKEN heads = the_mutex->Recursive.Mutex.Queue.Queue.heads; 40006f38: 00c42583 lw a1,12(s0) the_mutex->Recursive.Mutex.Queue.Queue.owner = owner; 40006f3c: 00042823 sw zero,16(s0) if ( heads == NULL ) { 40006f40: 14058863 beqz a1,40007090 _Thread_queue_Surrender( 40006f44: 40019737 lui a4,0x40019 40006f48: 6c870713 addi a4,a4,1736 # 400196c8 <_Thread_queue_Operations_priority_inherit> 40006f4c: 1080006f j 40007054 unsigned int nest_level; ISR_lock_Context lock_context; Per_CPU_Control *cpu_self; Thread_queue_Heads *heads; if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) { 40006f50: 01042783 lw a5,16(s0) 40006f54: 08f51663 bne a0,a5,40006fe0 _POSIX_Mutex_Release( the_mutex, queue_context ); return STATUS_NOT_OWNER; } nest_level = the_mutex->Recursive.nest_level; 40006f58: 01842783 lw a5,24(s0) if ( nest_level > 0 ) { 40006f5c: 12079663 bnez a5,40007088 <== 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( 40006f60: 02040a13 addi s4,s0,32 40006f64: 00c10613 addi a2,sp,12 40006f68: 000a0593 mv a1,s4 40006f6c: 02012023 sw zero,32(sp) 40006f70: 2f1020ef jal ra,40009a60 <_Thread_Priority_remove> disable_level = cpu_self->thread_dispatch_disable_level; 40006f74: 03092783 lw a5,48(s2) ); _Thread_Wait_release_default_critical( executing, &lock_context ); cpu_self = _Thread_queue_Dispatch_disable( queue_context ); heads = the_mutex->Recursive.Mutex.Queue.Queue.heads; 40006f78: 00c42503 lw a0,12(s0) cpu_self->thread_dispatch_disable_level = disable_level + 1; 40006f7c: 00178793 addi a5,a5,1 40006f80: 02f92823 sw a5,48(s2) if ( heads != NULL ) { 40006f84: 12050c63 beqz a0,400070bc const Thread_queue_Operations *operations; Thread_Control *new_owner; operations = POSIX_MUTEX_PRIORITY_CEILING_TQ_OPERATIONS; new_owner = ( *operations->first )( heads ); 40006f88: 40019937 lui s2,0x40019 40006f8c: 6b490793 addi a5,s2,1716 # 400196b4 <_Thread_queue_Operations_priority> 40006f90: 0107a783 lw a5,16(a5) 40006f94: 000780e7 jalr a5 _POSIX_Mutex_Set_owner( the_mutex, new_owner ); _Thread_Resource_count_increment( new_owner ); _Thread_Priority_add( 40006f98: 000a0593 mv a1,s4 the_mutex->Recursive.Mutex.Queue.Queue.owner = owner; 40006f9c: 00a42823 sw a0,16(s0) _Thread_Priority_add( 40006fa0: 00c10613 addi a2,sp,12 new_owner = ( *operations->first )( heads ); 40006fa4: 00050493 mv s1,a0 _Thread_Priority_add( 40006fa8: 221020ef jal ra,400099c8 <_Thread_Priority_add> new_owner, &the_mutex->Priority_ceiling, queue_context ); _Thread_queue_Extract_critical( 40006fac: 00c10693 addi a3,sp,12 40006fb0: 00048613 mv a2,s1 40006fb4: 6b490593 addi a1,s2,1716 40006fb8: 00c40513 addi a0,s0,12 40006fbc: 4c8030ef jal ra,4000a484 <_Thread_queue_Extract_critical> } else { _POSIX_Mutex_Set_owner( the_mutex, NULL ); _POSIX_Mutex_Release( the_mutex, queue_context ); } _Thread_Priority_update( queue_context ); 40006fc0: 00c10513 addi a0,sp,12 40006fc4: 3d9020ef jal ra,40009b9c <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40006fc8: bc098513 addi a0,s3,-1088 40006fcc: 691020ef jal ra,40009e5c <_Thread_Dispatch_enable> return STATUS_SUCCESSFUL; 40006fd0: 00000513 li a0,0 40006fd4: 0180006f j 40006fec if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) { 40006fd8: 01042783 lw a5,16(s0) 40006fdc: 04f50e63 beq a0,a5,40007038 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40006fe0: 00c12783 lw a5,12(sp) 40006fe4: 3007a073 csrs mstatus,a5 return STATUS_NOT_OWNER; 40006fe8: 00100513 li a0,1 ); break; } return _POSIX_Get_error( status ); } 40006fec: 04c12083 lw ra,76(sp) 40006ff0: 04812403 lw s0,72(sp) 40006ff4: 04412483 lw s1,68(sp) 40006ff8: 04012903 lw s2,64(sp) 40006ffc: 03c12983 lw s3,60(sp) 40007000: 03812a03 lw s4,56(sp) 40007004: 05010113 addi sp,sp,80 40007008: 00008067 ret POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 4000700c: e25ff0ef jal ra,40006e30 <_POSIX_Mutex_Auto_initialization> 40007010: ee0518e3 bnez a0,40006f00 } 40007014: 04c12083 lw ra,76(sp) 40007018: 04812403 lw s0,72(sp) 4000701c: 04412483 lw s1,68(sp) 40007020: 04012903 lw s2,64(sp) 40007024: 03c12983 lw s3,60(sp) 40007028: 03812a03 lw s4,56(sp) POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 4000702c: 01600513 li a0,22 } 40007030: 05010113 addi sp,sp,80 40007034: 00008067 ret nest_level = the_mutex->Recursive.nest_level; 40007038: 01842783 lw a5,24(s0) if ( nest_level > 0 ) { 4000703c: 04079663 bnez a5,40007088 <== NEVER TAKEN heads = the_mutex->Recursive.Mutex.Queue.Queue.heads; 40007040: 00c42583 lw a1,12(s0) the_mutex->Recursive.Mutex.Queue.Queue.owner = owner; 40007044: 00042823 sw zero,16(s0) if ( heads == NULL ) { 40007048: 04058463 beqz a1,40007090 _Thread_queue_Surrender( 4000704c: 40019737 lui a4,0x40019 40007050: 68c70713 addi a4,a4,1676 # 4001968c <_Thread_queue_Operations_FIFO> 40007054: 00c10693 addi a3,sp,12 40007058: 00050613 mv a2,a0 4000705c: 00c40513 addi a0,s0,12 40007060: 584030ef jal ra,4000a5e4 <_Thread_queue_Surrender> 40007064: 04c12083 lw ra,76(sp) 40007068: 04812403 lw s0,72(sp) 4000706c: 04412483 lw s1,68(sp) 40007070: 04012903 lw s2,64(sp) 40007074: 03c12983 lw s3,60(sp) 40007078: 03812a03 lw s4,56(sp) return STATUS_SUCCESSFUL; 4000707c: 00000513 li a0,0 40007080: 05010113 addi sp,sp,80 40007084: 00008067 ret the_mutex->Recursive.nest_level = nest_level - 1; 40007088: fff78793 addi a5,a5,-1 <== NOT EXECUTED 4000708c: 00f42c23 sw a5,24(s0) <== NOT EXECUTED 40007090: 00c12783 lw a5,12(sp) 40007094: 3007a073 csrs mstatus,a5 40007098: 04c12083 lw ra,76(sp) 4000709c: 04812403 lw s0,72(sp) 400070a0: 04412483 lw s1,68(sp) 400070a4: 04012903 lw s2,64(sp) 400070a8: 03c12983 lw s3,60(sp) 400070ac: 03812a03 lw s4,56(sp) return STATUS_SUCCESSFUL; 400070b0: 00000513 li a0,0 400070b4: 05010113 addi sp,sp,80 400070b8: 00008067 ret the_mutex->Recursive.Mutex.Queue.Queue.owner = owner; 400070bc: 00042823 sw zero,16(s0) 400070c0: 00c12783 lw a5,12(sp) 400070c4: 3007a073 csrs mstatus,a5 } 400070c8: ef9ff06f j 40006fc0 POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ); 400070cc: 01600513 li a0,22 } 400070d0: 00008067 ret =============================================================================== 4000357c : #if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) int pthread_mutexattr_gettype( const pthread_mutexattr_t *attr, int *type ) { 4000357c: 00050793 mv a5,a0 if ( attr == NULL || !attr->is_initialized || type == NULL ) 40003580: 02050263 beqz a0,400035a4 40003584: 00052703 lw a4,0(a0) return EINVAL; 40003588: 01600513 li a0,22 if ( attr == NULL || !attr->is_initialized || type == NULL ) 4000358c: 00070e63 beqz a4,400035a8 40003590: 00058c63 beqz a1,400035a8 <== NEVER TAKEN *type = attr->type; 40003594: 0107a783 lw a5,16(a5) # f010 return 0; 40003598: 00000513 li a0,0 *type = attr->type; 4000359c: 00f5a023 sw a5,0(a1) return 0; 400035a0: 00008067 ret return EINVAL; 400035a4: 01600513 li a0,22 } 400035a8: 00008067 ret =============================================================================== 400035f8 : #if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { 400035f8: 00050793 mv a5,a0 if ( !attr || !attr->is_initialized ) 400035fc: 02050263 beqz a0,40003620 40003600: 00052703 lw a4,0(a0) return EINVAL; 40003604: 01600513 li a0,22 if ( !attr || !attr->is_initialized ) 40003608: 00070e63 beqz a4,40003624 <== NEVER TAKEN switch ( type ) { 4000360c: 00300713 li a4,3 40003610: 00b76a63 bltu a4,a1,40003624 case PTHREAD_MUTEX_NORMAL: case PTHREAD_MUTEX_RECURSIVE: case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_DEFAULT: attr->type = type; 40003614: 00b7a823 sw a1,16(a5) return 0; 40003618: 00000513 li a0,0 4000361c: 00008067 ret return EINVAL; 40003620: 01600513 li a0,22 default: return EINVAL; } } 40003624: 00008067 ret =============================================================================== 400058b4 : { POSIX_RWLock_Control *the_rwlock; the_rwlock = _POSIX_RWLock_Get( rwlock ); if ( the_rwlock == NULL ) { 400058b4: 04050c63 beqz a0,4000590c 400058b8: 00050793 mv a5,a0 return EINVAL; } if ( attr != NULL ) { 400058bc: 00058e63 beqz a1,400058d8 if ( !attr->is_initialized ) { 400058c0: 0005a703 lw a4,0(a1) return EINVAL; 400058c4: 01600513 li a0,22 if ( !attr->is_initialized ) { 400058c8: 04070063 beqz a4,40005908 <== NEVER TAKEN return EINVAL; } if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) { 400058cc: 0045a683 lw a3,4(a1) 400058d0: 00100713 li a4,1 400058d4: 02d76a63 bltu a4,a3,40005908 return EINVAL; } } the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC; 400058d8: 9621e737 lui a4,0x9621e { 400058dc: ff010113 addi sp,sp,-16 the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC; 400058e0: abd70713 addi a4,a4,-1347 # 9621dabd { 400058e4: 00112623 sw ra,12(sp) the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC; 400058e8: 00e7c733 xor a4,a5,a4 _CORE_RWLock_Initialize( &the_rwlock->RWLock ); 400058ec: 00478513 addi a0,a5,4 the_rwlock->flags = (uintptr_t) the_rwlock ^ POSIX_RWLOCK_MAGIC; 400058f0: 00e7a023 sw a4,0(a5) _CORE_RWLock_Initialize( &the_rwlock->RWLock ); 400058f4: 6e0010ef jal ra,40006fd4 <_CORE_RWLock_Initialize> return 0; } 400058f8: 00c12083 lw ra,12(sp) return 0; 400058fc: 00000513 li a0,0 } 40005900: 01010113 addi sp,sp,16 40005904: 00008067 ret 40005908: 00008067 ret return EINVAL; 4000590c: 01600513 li a0,22 40005910: 00008067 ret =============================================================================== 40004fe8 : int pthread_setcancelstate( int state, int *oldstate ) { 40004fe8: ff010113 addi sp,sp,-16 40004fec: 00812423 sw s0,8(sp) 40004ff0: 00912223 sw s1,4(sp) 40004ff4: 00112623 sw ra,12(sp) 40004ff8: 00050413 mv s0,a0 40004ffc: 00058493 mv s1,a1 Thread_Life_state new_life_protection; Thread_Life_state previous_life_state; if ( _ISR_Is_in_progress() ) { 40005000: 580000ef jal ra,40005580 <_ISR_Is_in_progress> 40005004: 06051263 bnez a0,40005068 return EPROTO; } if ( state == PTHREAD_CANCEL_DISABLE ) { 40005008: 00100793 li a5,1 4000500c: 06f40a63 beq s0,a5,40005080 new_life_protection = THREAD_LIFE_PROTECTED; } else if ( state == PTHREAD_CANCEL_ENABLE ) { new_life_protection = 0; } else { return EINVAL; 40005010: 01600513 li a0,22 } else if ( state == PTHREAD_CANCEL_ENABLE ) { 40005014: 02041463 bnez s0,4000503c new_life_protection = 0; 40005018: 00000513 li a0,0 } previous_life_state = _Thread_Set_life_protection( new_life_protection ); 4000501c: 55d030ef jal ra,40008d78 <_Thread_Set_life_protection> 40005020: 00050793 mv a5,a0 } else { *oldstate = PTHREAD_CANCEL_ENABLE; } } return 0; 40005024: 00000513 li a0,0 if ( oldstate != NULL ) { 40005028: 00048a63 beqz s1,4000503c if ( ( previous_life_state & THREAD_LIFE_PROTECTED ) != 0 ) { 4000502c: 0017f793 andi a5,a5,1 40005030: 02078063 beqz a5,40005050 <== ALWAYS TAKEN *oldstate = PTHREAD_CANCEL_DISABLE; 40005034: 00100793 li a5,1 <== NOT EXECUTED 40005038: 00f4a023 sw a5,0(s1) <== NOT EXECUTED } 4000503c: 00c12083 lw ra,12(sp) 40005040: 00812403 lw s0,8(sp) 40005044: 00412483 lw s1,4(sp) 40005048: 01010113 addi sp,sp,16 4000504c: 00008067 ret 40005050: 00c12083 lw ra,12(sp) 40005054: 00812403 lw s0,8(sp) *oldstate = PTHREAD_CANCEL_ENABLE; 40005058: 0004a023 sw zero,0(s1) } 4000505c: 00412483 lw s1,4(sp) 40005060: 01010113 addi sp,sp,16 40005064: 00008067 ret 40005068: 00c12083 lw ra,12(sp) 4000506c: 00812403 lw s0,8(sp) 40005070: 00412483 lw s1,4(sp) return EPROTO; 40005074: 04700513 li a0,71 } 40005078: 01010113 addi sp,sp,16 4000507c: 00008067 ret new_life_protection = THREAD_LIFE_PROTECTED; 40005080: 00100513 li a0,1 <== NOT EXECUTED 40005084: f99ff06f j 4000501c <== NOT EXECUTED =============================================================================== 40005088 : int pthread_setcanceltype( int type, int *oldtype ) { 40005088: ff010113 addi sp,sp,-16 4000508c: 00812423 sw s0,8(sp) 40005090: 00912223 sw s1,4(sp) 40005094: 00112623 sw ra,12(sp) 40005098: 00050413 mv s0,a0 4000509c: 00058493 mv s1,a1 Thread_Life_state set_life_state; Thread_Life_state previous_life_state; if ( _ISR_Is_in_progress() ) { 400050a0: 4e0000ef jal ra,40005580 <_ISR_Is_in_progress> 400050a4: 06051863 bnez a0,40005114 return EPROTO; } if ( type == PTHREAD_CANCEL_DEFERRED ) { 400050a8: 04040663 beqz s0,400050f4 set_life_state = THREAD_LIFE_CHANGE_DEFERRED; } else if ( type == PTHREAD_CANCEL_ASYNCHRONOUS ) { 400050ac: 00100793 li a5,1 set_life_state = 0; } else { return EINVAL; 400050b0: 01600513 li a0,22 set_life_state = 0; 400050b4: 00000593 li a1,0 } else if ( type == PTHREAD_CANCEL_ASYNCHRONOUS ) { 400050b8: 02f41463 bne s0,a5,400050e0 } previous_life_state = _Thread_Change_life( 400050bc: 00000613 li a2,0 400050c0: 00800513 li a0,8 400050c4: 3e9030ef jal ra,40008cac <_Thread_Change_life> 400050c8: 00050793 mv a5,a0 } else { *oldtype = PTHREAD_CANCEL_ASYNCHRONOUS; } } return 0; 400050cc: 00000513 li a0,0 if ( oldtype != NULL ) { 400050d0: 00048863 beqz s1,400050e0 if ( ( previous_life_state & THREAD_LIFE_CHANGE_DEFERRED ) != 0 ) { 400050d4: 0087f793 andi a5,a5,8 400050d8: 04078a63 beqz a5,4000512c <== NEVER TAKEN *oldtype = PTHREAD_CANCEL_DEFERRED; 400050dc: 0004a023 sw zero,0(s1) } 400050e0: 00c12083 lw ra,12(sp) 400050e4: 00812403 lw s0,8(sp) 400050e8: 00412483 lw s1,4(sp) 400050ec: 01010113 addi sp,sp,16 400050f0: 00008067 ret set_life_state = THREAD_LIFE_CHANGE_DEFERRED; 400050f4: 00800593 li a1,8 previous_life_state = _Thread_Change_life( 400050f8: 00000613 li a2,0 400050fc: 00800513 li a0,8 40005100: 3ad030ef jal ra,40008cac <_Thread_Change_life> 40005104: 00050793 mv a5,a0 return 0; 40005108: 00000513 li a0,0 if ( oldtype != NULL ) { 4000510c: fc0494e3 bnez s1,400050d4 40005110: fd1ff06f j 400050e0 } 40005114: 00c12083 lw ra,12(sp) 40005118: 00812403 lw s0,8(sp) 4000511c: 00412483 lw s1,4(sp) return EPROTO; 40005120: 04700513 li a0,71 } 40005124: 01010113 addi sp,sp,16 40005128: 00008067 ret 4000512c: 00c12083 lw ra,12(sp) <== NOT EXECUTED 40005130: 00812403 lw s0,8(sp) <== NOT EXECUTED *oldtype = PTHREAD_CANCEL_ASYNCHRONOUS; 40005134: 00100793 li a5,1 <== NOT EXECUTED 40005138: 00f4a023 sw a5,0(s1) <== NOT EXECUTED } 4000513c: 00412483 lw s1,4(sp) <== NOT EXECUTED 40005140: 01010113 addi sp,sp,16 <== NOT EXECUTED 40005144: 00008067 ret <== NOT EXECUTED =============================================================================== 40007668 : const struct sched_param *param #else struct sched_param *param #endif ) { 40007668: f9010113 addi sp,sp,-112 4000766c: 06112623 sw ra,108(sp) 40007670: 06812423 sw s0,104(sp) 40007674: 06912223 sw s1,100(sp) 40007678: 07212023 sw s2,96(sp) 4000767c: 05312e23 sw s3,92(sp) 40007680: 05412c23 sw s4,88(sp) 40007684: 05512a23 sw s5,84(sp) 40007688: 05612823 sw s6,80(sp) 4000768c: 05712623 sw s7,76(sp) 40007690: 05812423 sw s8,72(sp) 40007694: 05912223 sw s9,68(sp) 40007698: 05a12023 sw s10,64(sp) 4000769c: 03b12e23 sw s11,60(sp) Thread_Control *the_thread; Per_CPU_Control *cpu_self; Thread_queue_Context queue_context; int error; if ( param == NULL ) { 400076a0: 1c060e63 beqz a2,4000787c return EINVAL; } error = _POSIX_Thread_Translate_sched_param( 400076a4: 00060413 mv s0,a2 400076a8: 00058993 mv s3,a1 400076ac: 00050493 mv s1,a0 400076b0: 00810693 addi a3,sp,8 400076b4: 00410613 addi a2,sp,4 400076b8: 00040593 mv a1,s0 400076bc: 00098513 mv a0,s3 400076c0: 6a4050ef jal ra,4000cd64 <_POSIX_Thread_Translate_sched_param> 400076c4: 00050d13 mv s10,a0 policy, param, &budget_algorithm, &budget_callout ); if ( error != 0 ) { 400076c8: 04050263 beqz a0,4000770c cpu_self = _Thread_queue_Dispatch_disable( &queue_context ); _Thread_Wait_release( the_thread, &queue_context ); _Thread_Priority_update( &queue_context ); _Thread_Dispatch_enable( cpu_self ); return error; } 400076cc: 06c12083 lw ra,108(sp) 400076d0: 06812403 lw s0,104(sp) 400076d4: 06412483 lw s1,100(sp) 400076d8: 06012903 lw s2,96(sp) 400076dc: 05c12983 lw s3,92(sp) 400076e0: 05812a03 lw s4,88(sp) 400076e4: 05412a83 lw s5,84(sp) 400076e8: 05012b03 lw s6,80(sp) 400076ec: 04c12b83 lw s7,76(sp) 400076f0: 04812c03 lw s8,72(sp) 400076f4: 04412c83 lw s9,68(sp) 400076f8: 03c12d83 lw s11,60(sp) 400076fc: 000d0513 mv a0,s10 40007700: 04012d03 lw s10,64(sp) 40007704: 07010113 addi sp,sp,112 40007708: 00008067 ret the_thread = _Thread_Get( thread, &queue_context.Lock_context.Lock_context ); 4000770c: 00048513 mv a0,s1 40007710: 00c10593 addi a1,sp,12 queue_context->Priority.update_count = 0; 40007714: 02012023 sw zero,32(sp) 40007718: 16c020ef jal ra,40009884 <_Thread_Get> 4000771c: 00050493 mv s1,a0 if ( the_thread == NULL ) { 40007720: 16050263 beqz a0,40007884 normal_prio = param->sched_priority; 40007724: 00042903 lw s2,0(s0) core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid ); 40007728: 40091b37 lui s6,0x40091 4000772c: 00310613 addi a2,sp,3 40007730: 00090593 mv a1,s2 40007734: 028b0513 addi a0,s6,40 # 40091028 <_Scheduler_Table> error = _POSIX_Set_sched_param( 40007738: 00412c83 lw s9,4(sp) 4000773c: 00812c03 lw s8,8(sp) core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid ); 40007740: 7d8040ef jal ra,4000bf18 <_POSIX_Priority_To_core> if ( !valid ) { 40007744: 00314703 lbu a4,3(sp) core_normal_prio = _POSIX_Priority_To_core( scheduler, normal_prio, &valid ); 40007748: 00050a93 mv s5,a0 4000774c: 00058a13 mv s4,a1 if ( !valid ) { 40007750: 10070a63 beqz a4,40007864 <== NEVER TAKEN if ( policy == SCHED_SPORADIC ) { 40007754: 00400713 li a4,4 40007758: 10e98e63 beq s3,a4,40007874 core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio, &valid ); 4000775c: 028b0513 addi a0,s6,40 40007760: 00310613 addi a2,sp,3 40007764: 00090593 mv a1,s2 40007768: 7b0040ef jal ra,4000bf18 <_POSIX_Priority_To_core> if ( !valid ) { 4000776c: 00314703 lbu a4,3(sp) core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio, &valid ); 40007770: 00050b93 mv s7,a0 40007774: 00058b13 mv s6,a1 if ( !valid ) { 40007778: 0e070663 beqz a4,40007864 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000777c: 1984a903 lw s2,408(s1) _Watchdog_Remove( 40007780: 400b67b7 lui a5,0x400b6 40007784: cd078513 addi a0,a5,-816 # 400b5cd0 <_Per_CPU_Information+0x50> _Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer ); 40007788: 00890d93 addi s11,s2,8 4000778c: 000d8593 mv a1,s11 40007790: 1a0040ef jal ra,4000b930 <_Watchdog_Remove> if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) { 40007794: 03492703 lw a4,52(s2) 40007798: 0344aa23 sw s4,52(s1) 4000779c: 0354a823 sw s5,48(s1) 400077a0: fff00a13 li s4,-1 _Thread_Priority_add( 400077a4: 02048593 addi a1,s1,32 if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) { 400077a8: 0f470263 beq a4,s4,4000788c _Thread_Priority_add( 400077ac: 00048513 mv a0,s1 400077b0: 00c10613 addi a2,sp,12 400077b4: 3c1010ef jal ra,40009374 <_Thread_Priority_add> _Thread_Priority_remove( 400077b8: 00c10613 addi a2,sp,12 400077bc: 02890593 addi a1,s2,40 400077c0: 00048513 mv a0,s1 400077c4: 449010ef jal ra,4000940c <_Thread_Priority_remove> 400077c8: 03492a23 sw s4,52(s2) api->Sporadic.sched_ss_max_repl = param->sched_ss_max_repl; 400077cc: 02842703 lw a4,40(s0) api->Sporadic.sched_ss_repl_period = param->sched_ss_repl_period; 400077d0: 00842e03 lw t3,8(s0) 400077d4: 00c42303 lw t1,12(s0) 400077d8: 01042883 lw a7,16(s0) 400077dc: 01442803 lw a6,20(s0) api->Sporadic.sched_ss_init_budget = param->sched_ss_init_budget; 400077e0: 01842503 lw a0,24(s0) 400077e4: 01c42583 lw a1,28(s0) 400077e8: 02042603 lw a2,32(s0) 400077ec: 02442683 lw a3,36(s0) the_thread->budget_algorithm = budget_algorithm; 400077f0: 0994a823 sw s9,144(s1) the_thread->budget_callout = budget_callout; 400077f4: 0984aa23 sw s8,148(s1) api->Sporadic.sched_ss_max_repl = param->sched_ss_max_repl; 400077f8: 06e92023 sw a4,96(s2) 400077fc: 03792c23 sw s7,56(s2) 40007800: 03692e23 sw s6,60(s2) api->Sporadic.sched_ss_repl_period = param->sched_ss_repl_period; 40007804: 05c92023 sw t3,64(s2) 40007808: 04692223 sw t1,68(s2) 4000780c: 05192423 sw a7,72(s2) 40007810: 05092623 sw a6,76(s2) api->Sporadic.sched_ss_init_budget = param->sched_ss_init_budget; 40007814: 04a92823 sw a0,80(s2) 40007818: 04b92a23 sw a1,84(s2) 4000781c: 04c92c23 sw a2,88(s2) 40007820: 04d92e23 sw a3,92(s2) if ( policy == SCHED_SPORADIC ) { 40007824: 00400713 li a4,4 40007828: 06e98c63 beq s3,a4,400078a0 the_thread->cpu_time_budget = 4000782c: 9501a703 lw a4,-1712(gp) # 400b2998 <_Watchdog_Ticks_per_timeslice> 40007830: 400b69b7 lui s3,0x400b6 40007834: c8098413 addi s0,s3,-896 # 400b5c80 <_Per_CPU_Information> 40007838: 08e4a623 sw a4,140(s1) disable_level = cpu_self->thread_dispatch_disable_level; 4000783c: 03042703 lw a4,48(s0) cpu_self->thread_dispatch_disable_level = disable_level + 1; 40007840: 00170713 addi a4,a4,1 40007844: 02e42823 sw a4,48(s0) 40007848: 00c12703 lw a4,12(sp) 4000784c: 30072073 csrs mstatus,a4 _Thread_Priority_update( &queue_context ); 40007850: 00c10513 addi a0,sp,12 40007854: 4f5010ef jal ra,40009548 <_Thread_Priority_update> _Thread_Dispatch_enable( cpu_self ); 40007858: c8098513 addi a0,s3,-896 4000785c: 7ad010ef jal ra,40009808 <_Thread_Dispatch_enable> return error; 40007860: e6dff06f j 400076cc 40007864: 400b69b7 lui s3,0x400b6 return EINVAL; 40007868: 01600d13 li s10,22 4000786c: c8098413 addi s0,s3,-896 # 400b5c80 <_Per_CPU_Information> 40007870: fcdff06f j 4000783c low_prio = param->sched_ss_low_priority; 40007874: 00442903 lw s2,4(s0) 40007878: ee5ff06f j 4000775c return EINVAL; 4000787c: 01600d13 li s10,22 40007880: e4dff06f j 400076cc return ESRCH; 40007884: 00300d13 li s10,3 40007888: e45ff06f j 400076cc _Thread_Priority_changed( 4000788c: 00c10693 addi a3,sp,12 40007890: 00000613 li a2,0 40007894: 00048513 mv a0,s1 40007898: 411010ef jal ra,400094a8 <_Thread_Priority_changed> 4000789c: f31ff06f j 400077cc _Timespec_To_ticks( &api->Sporadic.sched_ss_init_budget ); 400078a0: 05090513 addi a0,s2,80 400078a4: 3f1030ef jal ra,4000b494 <_Timespec_To_ticks> the_thread->cpu_time_budget = 400078a8: 08a4a623 sw a0,140(s1) expire = ticks + cpu->Watchdog.ticks; 400078ac: 400b69b7 lui s3,0x400b6 _Watchdog_Per_CPU_insert_ticks( 400078b0: 04090513 addi a0,s2,64 400078b4: 3e1030ef jal ra,4000b494 <_Timespec_To_ticks> 400078b8: c8098413 addi s0,s3,-896 # 400b5c80 <_Per_CPU_Information> 400078bc: 04842603 lw a2,72(s0) 400078c0: 04c42683 lw a3,76(s0) _Watchdog_Insert(header, the_watchdog, expire); 400078c4: 400b67b7 lui a5,0x400b6 expire = ticks + cpu->Watchdog.ticks; 400078c8: 00c50633 add a2,a0,a2 400078cc: 00a63533 sltu a0,a2,a0 _Watchdog_Insert(header, the_watchdog, expire); 400078d0: 00d506b3 add a3,a0,a3 400078d4: 000d8593 mv a1,s11 400078d8: cd078513 addi a0,a5,-816 # 400b5cd0 <_Per_CPU_Information+0x50> 400078dc: 7e5030ef jal ra,4000b8c0 <_Watchdog_Insert> } 400078e0: f5dff06f j 4000783c =============================================================================== 40004194 : int pthread_setspecific( pthread_key_t key, const void *value ) { 40004194: fe010113 addi sp,sp,-32 40004198: 00812c23 sw s0,24(sp) 4000419c: 01312623 sw s3,12(sp) 400041a0: 400147b7 lui a5,0x40014 400041a4: 00112e23 sw ra,28(sp) 400041a8: 00912a23 sw s1,20(sp) 400041ac: 01212823 sw s2,16(sp) 400041b0: 01412423 sw s4,8(sp) 400041b4: fb87a983 lw s3,-72(a5) # 40013fb8 <_Per_CPU_Information+0x38> 400041b8: 00050413 mv s0,a0 Thread_Control *executing; int eno; executing = _Thread_Get_executing(); if ( value != NULL ) { 400041bc: 06058663 beqz a1,40004228 400041c0: 00058493 mv s1,a1 __asm__ volatile ( 400041c4: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 400041c8: 0087f593 andi a1,a5,8 while ( *link != NULL ) { 400041cc: 19c9a783 lw a5,412(s3) 400041d0: 00079c63 bnez a5,400041e8 400041d4: 0e80006f j 400042bc } else if ( ( *less )( key, parent ) ) { 400041d8: 00e47463 bgeu s0,a4,400041e0 return &RB_LEFT( the_node, Node ); 400041dc: 00078693 mv a3,a5 <== NOT EXECUTED while ( *link != NULL ) { 400041e0: 0006a783 lw a5,0(a3) # 4000 400041e4: 0c078c63 beqz a5,400042bc return *the_left == the_right->key; 400041e8: 0107a703 lw a4,16(a5) the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right ); 400041ec: ff878613 addi a2,a5,-8 return &RB_RIGHT( the_node, Node ); 400041f0: 00478693 addi a3,a5,4 if ( ( *equal )( key, parent ) ) { 400041f4: fee412e3 bne s0,a4,400041d8 key_value_pair->value = RTEMS_DECONST( void *, value ); 400041f8: 02962023 sw s1,32(a2) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 400041fc: 3005a073 csrs mstatus,a1 _POSIX_Keys_Key_value_acquire( executing, &lock_context ); key_value_pair = _POSIX_Keys_Key_value_find( key, executing ); if ( key_value_pair != NULL ) { eno = _POSIX_Keys_Set_value( key_value_pair, value ); 40004200: 00000913 li s2,0 } else { eno = _POSIX_Keys_Delete_value( key, executing ); } return eno; } 40004204: 01c12083 lw ra,28(sp) 40004208: 01812403 lw s0,24(sp) 4000420c: 01412483 lw s1,20(sp) 40004210: 00c12983 lw s3,12(sp) 40004214: 00812a03 lw s4,8(sp) 40004218: 00090513 mv a0,s2 4000421c: 01012903 lw s2,16(sp) 40004220: 02010113 addi sp,sp,32 40004224: 00008067 ret _RTEMS_Lock_allocator(); 40004228: 4e1000ef jal ra,40004f08 <_RTEMS_Lock_allocator> _Objects_Get_no_protection( (Objects_Id) key, &_POSIX_Keys_Information ); 4000422c: 400125b7 lui a1,0x40012 40004230: 22058593 addi a1,a1,544 # 40012220 <_POSIX_Keys_Information> 40004234: 00040513 mv a0,s0 40004238: 611010ef jal ra,40006048 <_Objects_Get_no_protection> eno = EINVAL; 4000423c: 01600913 li s2,22 if ( the_key != NULL ) { 40004240: 00050e63 beqz a0,4000425c __asm__ volatile ( 40004244: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40004248: 0087f913 andi s2,a5,8 while ( *link != NULL ) { 4000424c: 19c9a583 lw a1,412(s3) 40004250: 02059263 bnez a1,40004274 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40004254: 30092073 csrs mstatus,s2 eno = 0; 40004258: 00000913 li s2,0 _RTEMS_Unlock_allocator(); 4000425c: 4b9000ef jal ra,40004f14 <_RTEMS_Unlock_allocator> return eno; 40004260: fa5ff06f j 40004204 } else if ( ( *less )( key, parent ) ) { 40004264: 00f47463 bgeu s0,a5,4000426c <== NOT EXECUTED return &RB_LEFT( the_node, Node ); 40004268: 00058713 mv a4,a1 <== NOT EXECUTED while ( *link != NULL ) { 4000426c: 00072583 lw a1,0(a4) <== NOT EXECUTED 40004270: fe0582e3 beqz a1,40004254 <== NOT EXECUTED return *the_left == the_right->key; 40004274: 0105a783 lw a5,16(a1) the_right = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( right ); 40004278: ff858493 addi s1,a1,-8 return &RB_RIGHT( the_node, Node ); 4000427c: 00458713 addi a4,a1,4 if ( ( *equal )( key, parent ) ) { 40004280: fef412e3 bne s0,a5,40004264 _RBTree_Extract( 40004284: 19c98513 addi a0,s3,412 40004288: 7a1010ef jal ra,40006228 <_RBTree_Extract> 4000428c: 30092073 csrs mstatus,s2 next = the_node->next; 40004290: 0004a703 lw a4,0(s1) previous = the_node->previous; 40004294: 0044a783 lw a5,4(s1) _Freechain_Put( &_POSIX_Keys_Keypool, key_value_pair ); 40004298: 40014537 lui a0,0x40014 4000429c: 00048593 mv a1,s1 next->previous = previous; 400042a0: 00f72223 sw a5,4(a4) previous->next = next; 400042a4: 00e7a023 sw a4,0(a5) 400042a8: f4850513 addi a0,a0,-184 # 40013f48 <_POSIX_Keys_Keypool> 400042ac: 64d000ef jal ra,400050f8 <_Freechain_Put> eno = 0; 400042b0: 00000913 li s2,0 400042b4: 461000ef jal ra,40004f14 <_RTEMS_Unlock_allocator> return eno; 400042b8: f4dff06f j 40004204 400042bc: 3005a073 csrs mstatus,a1 _RTEMS_Lock_allocator(); 400042c0: 449000ef jal ra,40004f08 <_RTEMS_Lock_allocator> _Objects_Get_no_protection( (Objects_Id) key, &_POSIX_Keys_Information ); 400042c4: 400125b7 lui a1,0x40012 400042c8: 22058593 addi a1,a1,544 # 40012220 <_POSIX_Keys_Information> 400042cc: 00040513 mv a0,s0 400042d0: 579010ef jal ra,40006048 <_Objects_Get_no_protection> 400042d4: 00050a13 mv s4,a0 eno = EINVAL; 400042d8: 01600913 li s2,22 if ( the_key != NULL ) { 400042dc: f80500e3 beqz a0,4000425c key_value_pair = _POSIX_Keys_Key_value_allocate(); 400042e0: d55ff0ef jal ra,40004034 <_POSIX_Keys_Key_value_allocate> 400042e4: 00050613 mv a2,a0 eno = ENOMEM; 400042e8: 00c00913 li s2,12 if ( key_value_pair != NULL ) { 400042ec: f60508e3 beqz a0,4000425c <== NEVER TAKEN old_last = tail->previous; 400042f0: 01ca2783 lw a5,28(s4) return &the_chain->Tail.Node; 400042f4: 018a0713 addi a4,s4,24 key_value_pair->key = key; 400042f8: 00852c23 sw s0,24(a0) key_value_pair->thread = executing; 400042fc: 01352e23 sw s3,28(a0) key_value_pair->value = RTEMS_DECONST( void *, value ); 40004300: 02952023 sw s1,32(a0) the_node->next = tail; 40004304: 00e52023 sw a4,0(a0) tail->previous = the_node; 40004308: 00aa2e23 sw a0,28(s4) old_last->next = the_node; 4000430c: 00a7a023 sw a0,0(a5) _RBTree_Initialize_node( &key_value_pair->Lookup_node ); 40004310: 00860593 addi a1,a2,8 return &RB_ROOT( the_rbtree ); 40004314: 19c98513 addi a0,s3,412 the_node->previous = old_last; 40004318: 00f62223 sw a5,4(a2) __asm__ volatile ( 4000431c: 300474f3 csrrci s1,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 40004320: 0084f493 andi s1,s1,8 while ( *link != NULL ) { 40004324: 19c9a783 lw a5,412(s3) 40004328: 00079663 bnez a5,40004334 4000432c: 0480006f j 40004374 40004330: 00070793 mv a5,a4 if ( ( *less )( key, parent ) ) { 40004334: 0107a703 lw a4,16(a5) return &RB_RIGHT( the_node, Node ); 40004338: 00478693 addi a3,a5,4 if ( ( *less )( key, parent ) ) { 4000433c: 00e47463 bgeu s0,a4,40004344 return &RB_LEFT( the_node, Node ); 40004340: 00078693 mv a3,a5 <== NOT EXECUTED while ( *link != NULL ) { 40004344: 0006a703 lw a4,0(a3) 40004348: fe0714e3 bnez a4,40004330 RB_SET( child, parent, Node ); 4000434c: 00f62823 sw a5,16(a2) 40004350: 00100793 li a5,1 40004354: 00062623 sw zero,12(a2) 40004358: 00062423 sw zero,8(a2) 4000435c: 00f62a23 sw a5,20(a2) *link = child; 40004360: 00b6a023 sw a1,0(a3) _RBTree_Insert_color( the_rbtree, the_node ); 40004364: 2f0020ef jal ra,40006654 <_RBTree_Insert_color> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40004368: 3004a073 csrs mstatus,s1 eno = 0; 4000436c: 00000913 li s2,0 _RTEMS_Unlock_allocator(); 40004370: eedff06f j 4000425c link = _RBTree_Root_reference( the_rbtree ); 40004374: 00050693 mv a3,a0 40004378: fd5ff06f j 4000434c =============================================================================== 40005148 : /* * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { 40005148: ff010113 addi sp,sp,-16 4000514c: 00112623 sw ra,12(sp) if ( _ISR_Is_in_progress() ) { 40005150: 430000ef jal ra,40005580 <_ISR_Is_in_progress> 40005154: 00050863 beqz a0,40005164 <== ALWAYS TAKEN return; } _Thread_Change_life( 0, 0, THREAD_LIFE_CHANGE_DEFERRED ); } 40005158: 00c12083 lw ra,12(sp) <== NOT EXECUTED 4000515c: 01010113 addi sp,sp,16 <== NOT EXECUTED 40005160: 00008067 ret <== NOT EXECUTED 40005164: 00c12083 lw ra,12(sp) _Thread_Change_life( 0, 0, THREAD_LIFE_CHANGE_DEFERRED ); 40005168: 00800613 li a2,8 4000516c: 00000593 li a1,0 } 40005170: 01010113 addi sp,sp,16 _Thread_Change_life( 0, 0, THREAD_LIFE_CHANGE_DEFERRED ); 40005174: 3390306f j 40008cac <_Thread_Change_life> =============================================================================== 400089c0 : { 400089c0: fa010113 addi sp,sp,-96 400089c4: 05312623 sw s3,76(sp) result = pthread_mutex_lock (&aio_request_queue.mutex); 400089c8: 400189b7 lui s3,0x40018 { 400089cc: 04912a23 sw s1,84(sp) 400089d0: 00050493 mv s1,a0 result = pthread_mutex_lock (&aio_request_queue.mutex); 400089d4: 5b098513 addi a0,s3,1456 # 400185b0 { 400089d8: 05412423 sw s4,72(sp) 400089dc: 04112e23 sw ra,92(sp) 400089e0: 04812c23 sw s0,88(sp) 400089e4: 05212823 sw s2,80(sp) result = pthread_mutex_lock (&aio_request_queue.mutex); 400089e8: 455010ef jal ra,4000a63c 400089ec: 00050a13 mv s4,a0 if (result != 0) { 400089f0: 12051063 bnez a0,40008b10 <== NEVER TAKEN pthread_getschedparam (pthread_self(), &policy, ¶m); 400089f4: 255020ef jal ra,4000b448 400089f8: 01010613 addi a2,sp,16 400089fc: 00c10593 addi a1,sp,12 40008a00: 109020ef jal ra,4000b308 req->caller_thread = pthread_self (); 40008a04: 245020ef jal ra,4000b448 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 40008a08: 0144a783 lw a5,20(s1) 40008a0c: 01012703 lw a4,16(sp) 40008a10: 5b098913 addi s2,s3,1456 40008a14: 0187a603 lw a2,24(a5) if ((aio_request_queue.idle_threads == 0) && 40008a18: 0e092683 lw a3,224(s2) req->caller_thread = pthread_self (); 40008a1c: 00a4a823 sw a0,16(s1) req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 40008a20: 40c70733 sub a4,a4,a2 40008a24: 00e4a623 sw a4,12(s1) req->policy = policy; 40008a28: 00c12703 lw a4,12(sp) 40008a2c: 00e4a423 sw a4,8(s1) req->aiocbp->error_code = EINPROGRESS; 40008a30: 07700713 li a4,119 40008a34: 02e7aa23 sw a4,52(a5) req->aiocbp->return_value = 0; 40008a38: 0207ac23 sw zero,56(a5) if ((aio_request_queue.idle_threads == 0) && 40008a3c: 08069863 bnez a3,40008acc <== NEVER TAKEN 40008a40: 0dc92683 lw a3,220(s2) 40008a44: 00400713 li a4,4 r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 40008a48: 0007a583 lw a1,0(a5) if ((aio_request_queue.idle_threads == 0) && 40008a4c: 0cd75863 bge a4,a3,40008b1c return _Chain_Immutable_head( the_chain )->next; 40008a50: 0c092403 lw s0,192(s2) while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 40008a54: 01442783 lw a5,20(s0) 40008a58: 00b7dc63 bge a5,a1,40008a70 40008a5c: 0c490713 addi a4,s2,196 40008a60: 06e40a63 beq s0,a4,40008ad4 return the_node->next; 40008a64: 00042403 lw s0,0(s0) 40008a68: 01442783 lw a5,20(s0) 40008a6c: feb7cae3 blt a5,a1,40008a60 if (r_chain->fildes == fildes) 40008a70: 06f59263 bne a1,a5,40008ad4 pthread_mutex_lock (&r_chain->mutex); 40008a74: 02040913 addi s2,s0,32 r_chain->new_fd = 0; 40008a78: 00042c23 sw zero,24(s0) pthread_mutex_lock (&r_chain->mutex); 40008a7c: 00090513 mv a0,s2 40008a80: 3bd010ef jal ra,4000a63c rtems_aio_insert_prio (&r_chain->perfd, req); 40008a84: 00048593 mv a1,s1 40008a88: 00840513 addi a0,s0,8 40008a8c: 89dff0ef jal ra,40008328 pthread_cond_signal (&r_chain->cond); 40008a90: 06040513 addi a0,s0,96 40008a94: 60c010ef jal ra,4000a0a0 pthread_mutex_unlock (&r_chain->mutex); 40008a98: 00090513 mv a0,s2 40008a9c: 659010ef jal ra,4000a8f4 pthread_mutex_unlock (&aio_request_queue.mutex); 40008aa0: 5b098513 addi a0,s3,1456 40008aa4: 651010ef jal ra,4000a8f4 } 40008aa8: 05c12083 lw ra,92(sp) 40008aac: 05812403 lw s0,88(sp) 40008ab0: 05412483 lw s1,84(sp) 40008ab4: 05012903 lw s2,80(sp) 40008ab8: 04c12983 lw s3,76(sp) 40008abc: 000a0513 mv a0,s4 40008ac0: 04812a03 lw s4,72(sp) 40008ac4: 06010113 addi sp,sp,96 40008ac8: 00008067 ret r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 40008acc: 0007a583 lw a1,0(a5) <== NOT EXECUTED 40008ad0: f81ff06f j 40008a50 <== NOT EXECUTED r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 40008ad4: 00100613 li a2,1 40008ad8: 0cc90513 addi a0,s2,204 40008adc: c91ff0ef jal ra,4000876c if (r_chain->new_fd == 1) { 40008ae0: 01852703 lw a4,24(a0) 40008ae4: 00100793 li a5,1 r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 40008ae8: 00050413 mv s0,a0 rtems_chain_prepend (&r_chain->perfd, &req->next_prio); 40008aec: 00048593 mv a1,s1 40008af0: 00850513 addi a0,a0,8 if (r_chain->new_fd == 1) { 40008af4: 04f70663 beq a4,a5,40008b40 rtems_aio_insert_prio (&r_chain->perfd, req); 40008af8: 831ff0ef jal ra,40008328 if (aio_request_queue.idle_threads > 0) 40008afc: 0e092783 lw a5,224(s2) 40008b00: faf050e3 blez a5,40008aa0 <== ALWAYS TAKEN pthread_cond_signal (&aio_request_queue.new_req); 40008b04: 04090513 addi a0,s2,64 <== NOT EXECUTED 40008b08: 598010ef jal ra,4000a0a0 <== NOT EXECUTED 40008b0c: f95ff06f j 40008aa0 <== NOT EXECUTED free (req); 40008b10: 00048513 mv a0,s1 <== NOT EXECUTED 40008b14: e69f70ef jal ra,4000097c <== NOT EXECUTED return result; 40008b18: f91ff06f j 40008aa8 <== NOT EXECUTED r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 40008b1c: 00100613 li a2,1 40008b20: 0c090513 addi a0,s2,192 40008b24: c49ff0ef jal ra,4000876c if (r_chain->new_fd == 1) { 40008b28: 01852703 lw a4,24(a0) 40008b2c: 00100793 li a5,1 r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 40008b30: 00050413 mv s0,a0 if (r_chain->new_fd == 1) { 40008b34: 02f70863 beq a4,a5,40008b64 pthread_mutex_lock (&r_chain->mutex); 40008b38: 02050913 addi s2,a0,32 40008b3c: f41ff06f j 40008a7c rtems_chain_prepend (&r_chain->perfd, &req->next_prio); 40008b40: 4d5020ef jal ra,4000b814 pthread_mutex_init (&r_chain->mutex, NULL); 40008b44: 00000593 li a1,0 r_chain->new_fd = 0; 40008b48: 00042c23 sw zero,24(s0) pthread_mutex_init (&r_chain->mutex, NULL); 40008b4c: 02040513 addi a0,s0,32 40008b50: 1ad010ef jal ra,4000a4fc pthread_cond_init (&r_chain->cond, NULL); 40008b54: 00000593 li a1,0 40008b58: 06040513 addi a0,s0,96 40008b5c: 4bc010ef jal ra,4000a018 40008b60: f9dff06f j 40008afc rtems_chain_prepend (&r_chain->perfd, &req->next_prio); 40008b64: 00048593 mv a1,s1 40008b68: 00850513 addi a0,a0,8 40008b6c: 4a9020ef jal ra,4000b814 pthread_mutex_init (&r_chain->mutex, NULL); 40008b70: 00000593 li a1,0 r_chain->new_fd = 0; 40008b74: 00042c23 sw zero,24(s0) pthread_mutex_init (&r_chain->mutex, NULL); 40008b78: 02040513 addi a0,s0,32 40008b7c: 181010ef jal ra,4000a4fc pthread_cond_init (&r_chain->cond, NULL); 40008b80: 00000593 li a1,0 40008b84: 06040513 addi a0,s0,96 40008b88: 490010ef jal ra,4000a018 result = pthread_create (&thid, &aio_request_queue.attr, 40008b8c: 40008637 lui a2,0x40008 40008b90: 00040693 mv a3,s0 40008b94: 37460613 addi a2,a2,884 # 40008374 40008b98: 06090593 addi a1,s2,96 40008b9c: 00810513 addi a0,sp,8 40008ba0: 2d4020ef jal ra,4000ae74 40008ba4: 00050413 mv s0,a0 if (result != 0) { 40008ba8: 00051a63 bnez a0,40008bbc <== NEVER TAKEN ++aio_request_queue.active_threads; 40008bac: 0dc92783 lw a5,220(s2) 40008bb0: 00178793 addi a5,a5,1 40008bb4: 0cf92e23 sw a5,220(s2) 40008bb8: ee9ff06f j 40008aa0 pthread_mutex_unlock (&aio_request_queue.mutex); 40008bbc: 5b098513 addi a0,s3,1456 <== NOT EXECUTED 40008bc0: 535010ef jal ra,4000a8f4 <== NOT EXECUTED return result; 40008bc4: 00040a13 mv s4,s0 <== NOT EXECUTED 40008bc8: ee1ff06f j 40008aa8 <== NOT EXECUTED =============================================================================== 40008640 : { 40008640: fe010113 addi sp,sp,-32 40008644: 01312623 sw s3,12(sp) result = pthread_attr_init (&aio_request_queue.attr); 40008648: 400189b7 lui s3,0x40018 { 4000864c: 00812c23 sw s0,24(sp) result = pthread_attr_init (&aio_request_queue.attr); 40008650: 5b098413 addi s0,s3,1456 # 400185b0 { 40008654: 01212823 sw s2,16(sp) result = pthread_attr_init (&aio_request_queue.attr); 40008658: 06040913 addi s2,s0,96 4000865c: 00090513 mv a0,s2 { 40008660: 00912a23 sw s1,20(sp) 40008664: 00112e23 sw ra,28(sp) result = pthread_attr_init (&aio_request_queue.attr); 40008668: 550020ef jal ra,4000abb8 if (result != 0) 4000866c: 00050493 mv s1,a0 40008670: 02050263 beqz a0,40008694 <== ALWAYS TAKEN } 40008674: 01c12083 lw ra,28(sp) <== NOT EXECUTED 40008678: 01812403 lw s0,24(sp) <== NOT EXECUTED 4000867c: 01012903 lw s2,16(sp) <== NOT EXECUTED 40008680: 00c12983 lw s3,12(sp) <== NOT EXECUTED 40008684: 00048513 mv a0,s1 <== NOT EXECUTED 40008688: 01412483 lw s1,20(sp) <== NOT EXECUTED 4000868c: 02010113 addi sp,sp,32 <== NOT EXECUTED 40008690: 00008067 ret <== NOT EXECUTED pthread_attr_setdetachstate (&aio_request_queue.attr, 40008694: 00000593 li a1,0 40008698: 00090513 mv a0,s2 4000869c: 574020ef jal ra,4000ac10 if (result != 0) 400086a0: 08051263 bnez a0,40008724 <== NEVER TAKEN result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 400086a4: 00000593 li a1,0 400086a8: 5b098513 addi a0,s3,1456 400086ac: 651010ef jal ra,4000a4fc if (result != 0) 400086b0: 08051663 bnez a0,4000873c <== NEVER TAKEN result = pthread_cond_init (&aio_request_queue.new_req, NULL); 400086b4: 00000593 li a1,0 400086b8: 04040513 addi a0,s0,64 400086bc: 15d010ef jal ra,4000a018 400086c0: 00050493 mv s1,a0 if (result != 0) { 400086c4: 08051a63 bnez a0,40008758 <== NEVER TAKEN tail->previous = head; 400086c8: 0cc40793 addi a5,s0,204 400086cc: 0cf42a23 sw a5,212(s0) aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; 400086d0: 0000b7b7 lui a5,0xb head->next = tail; 400086d4: 0c440613 addi a2,s0,196 tail->previous = head; 400086d8: 0c040693 addi a3,s0,192 head->next = tail; 400086dc: 0d040713 addi a4,s0,208 400086e0: 00b78793 addi a5,a5,11 # b00b } 400086e4: 01c12083 lw ra,28(sp) 400086e8: 0cc42023 sw a2,192(s0) head->previous = NULL; 400086ec: 0c042223 sw zero,196(s0) tail->previous = head; 400086f0: 0cd42423 sw a3,200(s0) head->next = tail; 400086f4: 0ce42623 sw a4,204(s0) head->previous = NULL; 400086f8: 0c042823 sw zero,208(s0) aio_request_queue.active_threads = 0; 400086fc: 0c042e23 sw zero,220(s0) aio_request_queue.idle_threads = 0; 40008700: 0e042023 sw zero,224(s0) aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; 40008704: 0cf42c23 sw a5,216(s0) } 40008708: 01812403 lw s0,24(sp) 4000870c: 01012903 lw s2,16(sp) 40008710: 00c12983 lw s3,12(sp) 40008714: 00048513 mv a0,s1 40008718: 01412483 lw s1,20(sp) 4000871c: 02010113 addi sp,sp,32 40008720: 00008067 ret pthread_attr_destroy (&aio_request_queue.attr); 40008724: 00090513 mv a0,s2 <== NOT EXECUTED 40008728: 468020ef jal ra,4000ab90 <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 4000872c: 00000593 li a1,0 <== NOT EXECUTED 40008730: 5b098513 addi a0,s3,1456 <== NOT EXECUTED 40008734: 5c9010ef jal ra,4000a4fc <== NOT EXECUTED if (result != 0) 40008738: f6050ee3 beqz a0,400086b4 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 4000873c: 00090513 mv a0,s2 <== NOT EXECUTED 40008740: 450020ef jal ra,4000ab90 <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); 40008744: 00000593 li a1,0 <== NOT EXECUTED 40008748: 04040513 addi a0,s0,64 <== NOT EXECUTED 4000874c: 0cd010ef jal ra,4000a018 <== NOT EXECUTED 40008750: 00050493 mv s1,a0 <== NOT EXECUTED if (result != 0) { 40008754: f6050ae3 beqz a0,400086c8 <== NOT EXECUTED pthread_mutex_destroy (&aio_request_queue.mutex); 40008758: 5b098513 addi a0,s3,1456 <== NOT EXECUTED 4000875c: 515010ef jal ra,4000a470 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 40008760: 00090513 mv a0,s2 <== NOT EXECUTED 40008764: 42c020ef jal ra,4000ab90 <== NOT EXECUTED 40008768: f61ff06f j 400086c8 <== NOT EXECUTED =============================================================================== 40008934 : { 40008934: ff010113 addi sp,sp,-16 40008938: 00812423 sw s0,8(sp) return _Chain_Immutable_head( the_chain )->next; 4000893c: 00052403 lw s0,0(a0) 40008940: 00112623 sw ra,12(sp) return &the_chain->Tail.Node; 40008944: 00450513 addi a0,a0,4 if (rtems_chain_is_empty (chain)) 40008948: 06850263 beq a0,s0,400089ac while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { 4000894c: 01442783 lw a5,20(s0) 40008950: 02b78063 beq a5,a1,40008970 return the_node->next; 40008954: 00042403 lw s0,0(s0) <== NOT EXECUTED 40008958: fea41ae3 bne s0,a0,4000894c <== NOT EXECUTED } 4000895c: 00c12083 lw ra,12(sp) <== NOT EXECUTED 40008960: 00812403 lw s0,8(sp) <== NOT EXECUTED return AIO_NOTCANCELED; 40008964: 00100513 li a0,1 <== NOT EXECUTED } 40008968: 01010113 addi sp,sp,16 <== NOT EXECUTED 4000896c: 00008067 ret <== NOT EXECUTED if (rtems_chain_is_tail (chain, node)) 40008970: fe8506e3 beq a0,s0,4000895c rtems_chain_extract (node); 40008974: 00040513 mv a0,s0 40008978: 659020ef jal ra,4000b7d0 current->aiocbp->error_code = ECANCELED; 4000897c: 01442783 lw a5,20(s0) 40008980: 08c00713 li a4,140 free (current); 40008984: 00040513 mv a0,s0 current->aiocbp->error_code = ECANCELED; 40008988: 02e7aa23 sw a4,52(a5) current->aiocbp->return_value = -1; 4000898c: fff00713 li a4,-1 40008990: 02e7ac23 sw a4,56(a5) free (current); 40008994: fe9f70ef jal ra,4000097c } 40008998: 00c12083 lw ra,12(sp) 4000899c: 00812403 lw s0,8(sp) return AIO_CANCELED; 400089a0: 00000513 li a0,0 } 400089a4: 01010113 addi sp,sp,16 400089a8: 00008067 ret 400089ac: 00c12083 lw ra,12(sp) 400089b0: 00812403 lw s0,8(sp) return AIO_ALLDONE; 400089b4: 00200513 li a0,2 } 400089b8: 01010113 addi sp,sp,16 400089bc: 00008067 ret =============================================================================== 4000876c : { 4000876c: fe010113 addi sp,sp,-32 40008770: 01412423 sw s4,8(sp) return _Chain_Immutable_head( the_chain )->next; 40008774: 00052a03 lw s4,0(a0) 40008778: 00912a23 sw s1,20(sp) 4000877c: 01312623 sw s3,12(sp) while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 40008780: 014a2783 lw a5,20(s4) { 40008784: 00112e23 sw ra,28(sp) 40008788: 00812c23 sw s0,24(sp) 4000878c: 01212823 sw s2,16(sp) 40008790: 00050993 mv s3,a0 40008794: 00058493 mv s1,a1 while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 40008798: 0cb7de63 bge a5,a1,40008874 return &the_chain->Tail.Node; 4000879c: 00450913 addi s2,a0,4 400087a0: 0f2a0063 beq s4,s2,40008880 400087a4: 000a0413 mv s0,s4 400087a8: 0080006f j 400087b0 400087ac: 03240e63 beq s0,s2,400087e8 return the_node->next; 400087b0: 00042403 lw s0,0(s0) 400087b4: 01442783 lw a5,20(s0) 400087b8: fe97cae3 blt a5,s1,400087ac if (r_chain->fildes == fildes) 400087bc: 06f49863 bne s1,a5,4000882c r_chain->new_fd = 0; 400087c0: 00042c23 sw zero,24(s0) } 400087c4: 01c12083 lw ra,28(sp) 400087c8: 00040513 mv a0,s0 400087cc: 01812403 lw s0,24(sp) 400087d0: 01412483 lw s1,20(sp) 400087d4: 01012903 lw s2,16(sp) 400087d8: 00c12983 lw s3,12(sp) 400087dc: 00812a03 lw s4,8(sp) 400087e0: 02010113 addi sp,sp,32 400087e4: 00008067 ret r_chain = NULL; 400087e8: 00000413 li s0,0 if (create == 0) 400087ec: fc060ce3 beqz a2,400087c4 r_chain = malloc (sizeof (rtems_aio_request_chain)); 400087f0: 08000513 li a0,128 400087f4: c64f80ef jal ra,40000c58 return &the_chain->Tail.Node; 400087f8: 00850793 addi a5,a0,8 400087fc: 00c50713 addi a4,a0,12 40008800: 00050413 mv s0,a0 head->next = tail; 40008804: 00e52423 sw a4,8(a0) head->previous = NULL; 40008808: 00052623 sw zero,12(a0) tail->previous = head; 4000880c: 00f52823 sw a5,16(a0) rtems_chain_initialize_node (&r_chain->next_fd); 40008810: 00050593 mv a1,a0 rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd); 40008814: 00492503 lw a0,4(s2) 40008818: 7d9020ef jal ra,4000b7f0 r_chain->new_fd = 1; 4000881c: 00100793 li a5,1 40008820: 00f42c23 sw a5,24(s0) r_chain->fildes = fildes; 40008824: 00942a23 sw s1,20(s0) 40008828: f9dff06f j 400087c4 if (create == 0) 4000882c: 04060063 beqz a2,4000886c r_chain = malloc (sizeof (rtems_aio_request_chain)); 40008830: 08000513 li a0,128 40008834: c24f80ef jal ra,40000c58 return &the_chain->Tail.Node; 40008838: 00850793 addi a5,a0,8 4000883c: 00c50713 addi a4,a0,12 tail->previous = head; 40008840: 00f52823 sw a5,16(a0) head->next = tail; 40008844: 00e52423 sw a4,8(a0) head->previous = NULL; 40008848: 00052623 sw zero,12(a0) return &the_chain->Tail.Node; 4000884c: 00498793 addi a5,s3,4 40008850: 00050913 mv s2,a0 rtems_chain_initialize_node (&r_chain->next_fd); 40008854: 00050593 mv a1,a0 if (rtems_chain_is_empty (chain)) 40008858: 04fa1c63 bne s4,a5,400088b0 rtems_chain_prepend (chain, &r_chain->next_fd); 4000885c: 00098513 mv a0,s3 40008860: 7b5020ef jal ra,4000b814 40008864: 00090413 mv s0,s2 40008868: fb5ff06f j 4000881c r_chain = NULL; 4000886c: 00000413 li s0,0 40008870: f55ff06f j 400087c4 while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { 40008874: 000a0413 mv s0,s4 if (r_chain->fildes == fildes) 40008878: f4f484e3 beq s1,a5,400087c0 4000887c: fb1ff06f j 4000882c r_chain = NULL; 40008880: 00000413 li s0,0 if (create == 0) 40008884: f40600e3 beqz a2,400087c4 <== NEVER TAKEN r_chain = malloc (sizeof (rtems_aio_request_chain)); 40008888: 08000513 li a0,128 4000888c: bccf80ef jal ra,40000c58 return &the_chain->Tail.Node; 40008890: 00850793 addi a5,a0,8 40008894: 00c50713 addi a4,a0,12 40008898: 00050913 mv s2,a0 head->next = tail; 4000889c: 00e52423 sw a4,8(a0) head->previous = NULL; 400088a0: 00052623 sw zero,12(a0) tail->previous = head; 400088a4: 00f52823 sw a5,16(a0) rtems_chain_initialize_node (&r_chain->next_fd); 400088a8: 00050593 mv a1,a0 return &the_chain->Tail.Node; 400088ac: fb1ff06f j 4000885c 400088b0: 00040913 mv s2,s0 400088b4: 00050413 mv s0,a0 400088b8: f5dff06f j 40008814 =============================================================================== 400040e0 : */ int sched_get_priority_min( int policy ) { switch ( policy ) { 400040e0: 00200713 li a4,2 { 400040e4: 00050793 mv a5,a0 switch ( policy ) { 400040e8: 02a74863 blt a4,a0,40004118 400040ec: 00100513 li a0,1 400040f0: 0207dc63 bgez a5,40004128 { 400040f4: ff010113 addi sp,sp,-16 400040f8: 00112623 sw ra,12(sp) case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 400040fc: 03d0a0ef jal ra,4000e938 <__errno> } return POSIX_SCHEDULER_MINIMUM_PRIORITY; } 40004100: 00c12083 lw ra,12(sp) rtems_set_errno_and_return_minus_one( EINVAL ); 40004104: 01600793 li a5,22 40004108: 00f52023 sw a5,0(a0) 4000410c: fff00513 li a0,-1 } 40004110: 01010113 addi sp,sp,16 40004114: 00008067 ret switch ( policy ) { 40004118: 00400713 li a4,4 <== NOT EXECUTED 4000411c: 00100513 li a0,1 <== NOT EXECUTED 40004120: fce79ae3 bne a5,a4,400040f4 <== NOT EXECUTED } 40004124: 00008067 ret <== NOT EXECUTED 40004128: 00008067 ret =============================================================================== 4000412c : int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { 4000412c: fe010113 addi sp,sp,-32 40004130: 00112e23 sw ra,28(sp) 40004134: 00812c23 sw s0,24(sp) /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) 40004138: 02051263 bnez a0,4000415c <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ESRCH ); if ( !interval ) 4000413c: 04058463 beqz a1,40004184 rtems_set_errno_and_return_minus_one( EINVAL ); _Timespec_From_ticks( 40004140: 8b81a503 lw a0,-1864(gp) # 40017160 <_Watchdog_Ticks_per_timeslice> 40004144: 2f8030ef jal ra,4000743c <_Timespec_From_ticks> rtems_configuration_get_ticks_per_timeslice(), interval ); return 0; 40004148: 00000513 li a0,0 } 4000414c: 01c12083 lw ra,28(sp) 40004150: 01812403 lw s0,24(sp) 40004154: 02010113 addi sp,sp,32 40004158: 00008067 ret 4000415c: 00b12623 sw a1,12(sp) 40004160: 00050413 mv s0,a0 if ( pid && pid != getpid() ) 40004164: ddcfc0ef jal ra,40000740 40004168: 00c12583 lw a1,12(sp) 4000416c: fc8508e3 beq a0,s0,4000413c rtems_set_errno_and_return_minus_one( ESRCH ); 40004170: 7c80a0ef jal ra,4000e938 <__errno> 40004174: 00300793 li a5,3 40004178: 00f52023 sw a5,0(a0) 4000417c: fff00513 li a0,-1 40004180: fcdff06f j 4000414c rtems_set_errno_and_return_minus_one( EINVAL ); 40004184: 7b40a0ef jal ra,4000e938 <__errno> 40004188: 01600793 li a5,22 4000418c: 00f52023 sw a5,0(a0) 40004190: fff00513 li a0,-1 40004194: fb9ff06f j 4000414c =============================================================================== 40008184 : #endif #include int sem_close( sem_t *sem ) { 40008184: ff010113 addi sp,sp,-16 40008188: 00112623 sw ra,12(sp) 4000818c: 00812423 sw s0,8(sp) 40008190: 00912223 sw s1,4(sp) POSIX_Semaphore_Control *the_semaphore; uint32_t open_count; POSIX_SEMAPHORE_VALIDATE_OBJECT( sem ); 40008194: 08050663 beqz a0,40008220 40008198: 5d3687b7 lui a5,0x5d368 4000819c: 00052703 lw a4,0(a0) 400081a0: fe778793 addi a5,a5,-25 # 5d367fe7 400081a4: 00f547b3 xor a5,a0,a5 400081a8: 00050413 mv s0,a0 400081ac: 06e79a63 bne a5,a4,40008220 if ( !_POSIX_Semaphore_Is_named( sem ) ) { 400081b0: 01452783 lw a5,20(a0) 400081b4: 06078663 beqz a5,40008220 <== NEVER TAKEN RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get( sem_t *sem ) { return RTEMS_CONTAINER_OF( sem, POSIX_Semaphore_Control, Semaphore ); 400081b8: ff050493 addi s1,a0,-16 _RTEMS_Lock_allocator(); 400081bc: 7c0000ef jal ra,4000897c <_RTEMS_Lock_allocator> the_semaphore = _POSIX_Semaphore_Get( sem ); _Objects_Allocator_lock(); open_count = the_semaphore->open_count; 400081c0: 0304a783 lw a5,48(s1) if ( open_count == 0 ) { 400081c4: 04078c63 beqz a5,4000821c <== NEVER TAKEN _Objects_Allocator_unlock(); rtems_set_errno_and_return_minus_one( EINVAL ); } if ( open_count == 1 && _POSIX_Semaphore_Is_busy( sem ) ) { 400081c8: 00100713 li a4,1 400081cc: 00e79663 bne a5,a4,400081d8 400081d0: 00c42703 lw a4,12(s0) 400081d4: 02071863 bnez a4,40008204 _Objects_Allocator_unlock(); rtems_set_errno_and_return_minus_one( EBUSY ); } the_semaphore->open_count = open_count - 1; 400081d8: fff78793 addi a5,a5,-1 _POSIX_Semaphore_Delete( the_semaphore ); 400081dc: 00048513 mv a0,s1 the_semaphore->open_count = open_count - 1; 400081e0: 02f4a823 sw a5,48(s1) _POSIX_Semaphore_Delete( the_semaphore ); 400081e4: 209050ef jal ra,4000dbec <_POSIX_Semaphore_Delete> _RTEMS_Unlock_allocator(); 400081e8: 7a0000ef jal ra,40008988 <_RTEMS_Unlock_allocator> _Objects_Allocator_unlock(); return 0; 400081ec: 00000513 li a0,0 } 400081f0: 00c12083 lw ra,12(sp) 400081f4: 00812403 lw s0,8(sp) 400081f8: 00412483 lw s1,4(sp) 400081fc: 01010113 addi sp,sp,16 40008200: 00008067 ret 40008204: 784000ef jal ra,40008988 <_RTEMS_Unlock_allocator> rtems_set_errno_and_return_minus_one( EBUSY ); 40008208: 16c0b0ef jal ra,40013374 <__errno> 4000820c: 01000793 li a5,16 40008210: 00f52023 sw a5,0(a0) 40008214: fff00513 li a0,-1 40008218: fd9ff06f j 400081f0 4000821c: 76c000ef jal ra,40008988 <_RTEMS_Unlock_allocator> <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EINVAL ); 40008220: 1540b0ef jal ra,40013374 <__errno> 40008224: 01600793 li a5,22 40008228: 00f52023 sw a5,0(a0) 4000822c: fff00513 li a0,-1 40008230: fc1ff06f j 400081f0 =============================================================================== 400052e0 : { 400052e0: fb010113 addi sp,sp,-80 400052e4: 02912223 sw s1,36(sp) 400052e8: 03212023 sw s2,32(sp) 400052ec: 01412c23 sw s4,24(sp) 400052f0: 01512a23 sw s5,20(sp) 400052f4: 02112623 sw ra,44(sp) 400052f8: 02812423 sw s0,40(sp) 400052fc: 01312e23 sw s3,28(sp) 40005300: 02c12c23 sw a2,56(sp) 40005304: 02d12e23 sw a3,60(sp) 40005308: 04e12023 sw a4,64(sp) 4000530c: 04f12223 sw a5,68(sp) 40005310: 05012423 sw a6,72(sp) 40005314: 05112623 sw a7,76(sp) if ( oflag & O_CREAT ) { 40005318: 2005fa13 andi s4,a1,512 { 4000531c: 00058493 mv s1,a1 40005320: 00050913 mv s2,a0 40005324: 00000a93 li s5,0 if ( oflag & O_CREAT ) { 40005328: 060a1a63 bnez s4,4000539c _RTEMS_Lock_allocator(); 4000532c: 721000ef jal ra,4000624c <_RTEMS_Lock_allocator> const char *name, size_t *name_length_p, Objects_Get_by_name_error *error ) { return (POSIX_Semaphore_Control *) _Objects_Get_by_name( 40005330: 400159b7 lui s3,0x40015 40005334: 00c10693 addi a3,sp,12 40005338: 00810613 addi a2,sp,8 4000533c: 00090593 mv a1,s2 40005340: 2d098513 addi a0,s3,720 # 400152d0 <_POSIX_Semaphore_Information> 40005344: 330020ef jal ra,40007674 <_Objects_Get_by_name> 40005348: 00050413 mv s0,a0 if ( the_semaphore == NULL ) { 4000534c: 06050063 beqz a0,400053ac if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { 40005350: 000017b7 lui a5,0x1 40005354: a0078793 addi a5,a5,-1536 # a00 40005358: 00f4f4b3 and s1,s1,a5 4000535c: 10f48663 beq s1,a5,40005468 the_semaphore->open_count += 1; 40005360: 03052783 lw a5,48(a0) return &the_semaphore->Semaphore; 40005364: 01050413 addi s0,a0,16 the_semaphore->open_count += 1; 40005368: 00178793 addi a5,a5,1 4000536c: 02f42023 sw a5,32(s0) _RTEMS_Unlock_allocator(); 40005370: 6e9000ef jal ra,40006258 <_RTEMS_Unlock_allocator> } 40005374: 02c12083 lw ra,44(sp) 40005378: 00040513 mv a0,s0 4000537c: 02812403 lw s0,40(sp) 40005380: 02412483 lw s1,36(sp) 40005384: 02012903 lw s2,32(sp) 40005388: 01c12983 lw s3,28(sp) 4000538c: 01812a03 lw s4,24(sp) 40005390: 01412a83 lw s5,20(sp) 40005394: 05010113 addi sp,sp,80 40005398: 00008067 ret va_start(arg, oflag); 4000539c: 03810793 addi a5,sp,56 value = va_arg( arg, unsigned int ); 400053a0: 00068a93 mv s5,a3 va_start(arg, oflag); 400053a4: 00f12223 sw a5,4(sp) va_end(arg); 400053a8: f85ff06f j 4000532c if ( !( error == OBJECTS_GET_BY_NAME_NO_OBJECT && (oflag & O_CREAT) ) ) { 400053ac: 00c12703 lw a4,12(sp) 400053b0: 00200793 li a5,2 400053b4: 08f71663 bne a4,a5,40005440 400053b8: 080a0463 beqz s4,40005440 sem = _POSIX_Semaphore_Create_support( 400053bc: 00812583 lw a1,8(sp) if ( value > SEM_VALUE_MAX ) { 400053c0: 0c0ac063 bltz s5,40005480 name = _Workspace_String_duplicate( name_arg, name_len ); 400053c4: 00090513 mv a0,s2 400053c8: 56d050ef jal ra,4000b134 <_Workspace_String_duplicate> 400053cc: 00050493 mv s1,a0 if ( name == NULL ) { 400053d0: 0c050063 beqz a0,40005490 <== NEVER TAKEN return ( *information->allocate )( information ); 400053d4: 2d098913 addi s2,s3,720 400053d8: 00892783 lw a5,8(s2) 400053dc: 2d098513 addi a0,s3,720 400053e0: 000780e7 jalr a5 if ( the_semaphore == NULL ) { 400053e4: 0a050e63 beqz a0,400054a0 <== NEVER TAKEN information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 400053e8: 00855683 lhu a3,8(a0) 400053ec: 00492703 lw a4,4(s2) sem->_flags = (uintptr_t) sem ^ POSIX_SEMAPHORE_MAGIC; 400053f0: 5d3687b7 lui a5,0x5d368 _POSIX_Semaphore_Initialize( &the_semaphore->Semaphore, name, value ); 400053f4: 01050413 addi s0,a0,16 400053f8: fe778793 addi a5,a5,-25 # 5d367fe7 the_semaphore->open_count = 1; 400053fc: 00100613 li a2,1 40005400: 00f447b3 xor a5,s0,a5 40005404: 00269693 slli a3,a3,0x2 40005408: 00f52823 sw a5,16(a0) 4000540c: 02c52823 sw a2,48(a0) the_semaphore->linked = true; 40005410: 02c50623 sb a2,44(a0) const char *_name, unsigned int _count) { struct _Semaphore_Control _init = _SEMAPHORE_NAMED_INITIALIZER(_name, _count); *_semaphore = _init; 40005414: 00052a23 sw zero,20(a0) 40005418: 00052c23 sw zero,24(a0) 4000541c: 00052e23 sw zero,28(a0) 40005420: 02052023 sw zero,32(a0) 40005424: 02952223 sw s1,36(a0) 40005428: 03552423 sw s5,40(a0) the_object->name.name_p = name; 4000542c: 00952623 sw s1,12(a0) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 40005430: 00d707b3 add a5,a4,a3 40005434: fea7ae23 sw a0,-4(a5) _RTEMS_Unlock_allocator(); 40005438: 621000ef jal ra,40006258 <_RTEMS_Unlock_allocator> return sem; 4000543c: f39ff06f j 40005374 40005440: 619000ef jal ra,40006258 <_RTEMS_Unlock_allocator> rtems_set_errno_and_return_value( 40005444: 00c12483 lw s1,12(sp) 40005448: 7c40c0ef jal ra,40011c0c <__errno> 4000544c: 400147b7 lui a5,0x40014 40005450: 00249493 slli s1,s1,0x2 40005454: 91078793 addi a5,a5,-1776 # 40013910 <_POSIX_Get_by_name_error_table> 40005458: 009787b3 add a5,a5,s1 4000545c: 0007a783 lw a5,0(a5) 40005460: 00f52023 sw a5,0(a0) 40005464: f11ff06f j 40005374 40005468: 5f1000ef jal ra,40006258 <_RTEMS_Unlock_allocator> rtems_set_errno_and_return_value( EEXIST, SEM_FAILED ); 4000546c: 7a00c0ef jal ra,40011c0c <__errno> 40005470: 01100793 li a5,17 40005474: 00f52023 sw a5,0(a0) 40005478: 00000413 li s0,0 4000547c: ef9ff06f j 40005374 rtems_set_errno_and_return_value( EINVAL, SEM_FAILED ); 40005480: 78c0c0ef jal ra,40011c0c <__errno> 40005484: 01600793 li a5,22 40005488: 00f52023 sw a5,0(a0) 4000548c: fadff06f j 40005438 rtems_set_errno_and_return_value( ENOMEM, SEM_FAILED ); 40005490: 77c0c0ef jal ra,40011c0c <__errno> <== NOT EXECUTED 40005494: 00c00793 li a5,12 <== NOT EXECUTED 40005498: 00f52023 sw a5,0(a0) <== NOT EXECUTED 4000549c: f9dff06f j 40005438 <== NOT EXECUTED _Workspace_Free( name ); 400054a0: 00048513 mv a0,s1 <== NOT EXECUTED 400054a4: 481050ef jal ra,4000b124 <_Workspace_Free> <== NOT EXECUTED rtems_set_errno_and_return_value( ENOSPC, SEM_FAILED ); 400054a8: 7640c0ef jal ra,40011c0c <__errno> <== NOT EXECUTED 400054ac: 01c00793 li a5,28 <== NOT EXECUTED 400054b0: 00f52023 sw a5,0(a0) <== NOT EXECUTED 400054b4: f85ff06f j 40005438 <== NOT EXECUTED =============================================================================== 400066a0 : int sem_timedwait( sem_t *__restrict _sem, const struct timespec *__restrict abstime ) { 400066a0: fc010113 addi sp,sp,-64 400066a4: 02112e23 sw ra,60(sp) 400066a8: 02812c23 sw s0,56(sp) Thread_queue_Context queue_context; ISR_Level level; Thread_Control *executing; unsigned int count; POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem ); 400066ac: 0a050a63 beqz a0,40006760 400066b0: 5d3687b7 lui a5,0x5d368 400066b4: 00052703 lw a4,0(a0) 400066b8: fe778793 addi a5,a5,-25 # 5d367fe7 400066bc: 00f547b3 xor a5,a0,a5 400066c0: 0ae79063 bne a5,a4,40006760 __asm__ volatile ( 400066c4: 30047773 csrrci a4,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 400066c8: 00877713 andi a4,a4,8 sem = _Sem_Get( &_sem->_Semaphore ); _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_ISR_disable( &queue_context, level ); executing = _Sem_Queue_acquire_critical( sem, &queue_context ); count = sem->count; 400066cc: 01852783 lw a5,24(a0) if ( RTEMS_PREDICT_TRUE( count > 0 ) ) { 400066d0: 02078463 beqz a5,400066f8 sem->count = count - 1; 400066d4: fff78793 addi a5,a5,-1 400066d8: 00f52c23 sw a5,24(a0) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 400066dc: 30072073 csrs mstatus,a4 _Sem_Queue_release( sem, level, &queue_context ); return 0; 400066e0: 00000413 li s0,0 &queue_context ); status = _Thread_Wait_get_status( executing ); return _POSIX_Zero_or_minus_one_plus_errno( status ); } } 400066e4: 03c12083 lw ra,60(sp) 400066e8: 00040513 mv a0,s0 400066ec: 03812403 lw s0,56(sp) 400066f0: 04010113 addi sp,sp,64 400066f4: 00008067 ret 400066f8: 400187b7 lui a5,0x40018 400066fc: 0f87a403 lw s0,248(a5) # 400180f8 <_Per_CPU_Information+0x38> queue_context->thread_state = thread_state; 40006700: 00200793 li a5,2 40006704: 00058813 mv a6,a1 40006708: 00f12823 sw a5,16(sp) _Thread_queue_Enqueue( 4000670c: 400145b7 lui a1,0x40014 queue_context->enqueue_callout = _Thread_queue_Add_timeout_realtime_timespec; 40006710: 4000a7b7 lui a5,0x4000a 40006714: 00040613 mv a2,s0 40006718: 68878793 addi a5,a5,1672 # 4000a688 <_Thread_queue_Add_timeout_realtime_timespec> 4000671c: 00c10693 addi a3,sp,12 40006720: 09058593 addi a1,a1,144 # 40014090 <_Thread_queue_Operations_priority> 40006724: 00c50513 addi a0,a0,12 queue_context->Timeout.arg = abstime; 40006728: 01012c23 sw a6,24(sp) queue_context->enqueue_callout = _Thread_queue_Add_timeout_realtime_timespec; 4000672c: 00f12a23 sw a5,20(sp) 40006730: 00e12623 sw a4,12(sp) 40006734: 66d020ef jal ra,400095a0 <_Thread_queue_Enqueue> */ RTEMS_INLINE_ROUTINE Status_Control _Thread_Wait_get_status( const Thread_Control *the_thread ) { return (Status_Control) the_thread->Wait.return_code; 40006738: 04c42403 lw s0,76(s0) if ( status == STATUS_SUCCESSFUL ) { 4000673c: fa0404e3 beqz s0,400066e4 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); 40006740: 61d0b0ef jal ra,4001255c <__errno> return STATUS_GET_POSIX( status ); 40006744: 41f45793 srai a5,s0,0x1f 40006748: 0ff7f793 andi a5,a5,255 4000674c: 008787b3 add a5,a5,s0 40006750: 4087d793 srai a5,a5,0x8 rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); 40006754: 00f52023 sw a5,0(a0) 40006758: fff00413 li s0,-1 4000675c: f89ff06f j 400066e4 POSIX_SEMAPHORE_VALIDATE_OBJECT( _sem ); 40006760: 5fd0b0ef jal ra,4001255c <__errno> 40006764: 01600793 li a5,22 40006768: 00f52023 sw a5,0(a0) 4000676c: fff00413 li s0,-1 40006770: f75ff06f j 400066e4 =============================================================================== 40004e48 : { 40004e48: fb010113 addi sp,sp,-80 40004e4c: 04112623 sw ra,76(sp) 40004e50: 04812423 sw s0,72(sp) 40004e54: 04912223 sw s1,68(sp) 40004e58: 05212023 sw s2,64(sp) 40004e5c: 03312e23 sw s3,60(sp) 40004e60: 03412c23 sw s4,56(sp) 40004e64: 03512a23 sw s5,52(sp) 40004e68: 03612823 sw s6,48(sp) 40004e6c: 03712623 sw s7,44(sp) 40004e70: 03812423 sw s8,40(sp) 40004e74: 03912223 sw s9,36(sp) if ( ( oflag & O_ACCMODE ) != O_RDONLY && ( oflag & O_ACCMODE ) != O_RDWR ) { 40004e78: 0015f793 andi a5,a1,1 40004e7c: 04078463 beqz a5,40004ec4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EACCES ); 40004e80: 37c0b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 40004e84: 00d00793 li a5,13 <== NOT EXECUTED 40004e88: 00f52023 sw a5,0(a0) <== NOT EXECUTED return -1; 40004e8c: fff00513 li a0,-1 <== NOT EXECUTED } 40004e90: 04c12083 lw ra,76(sp) 40004e94: 04812403 lw s0,72(sp) 40004e98: 04412483 lw s1,68(sp) 40004e9c: 04012903 lw s2,64(sp) 40004ea0: 03c12983 lw s3,60(sp) 40004ea4: 03812a03 lw s4,56(sp) 40004ea8: 03412a83 lw s5,52(sp) 40004eac: 03012b03 lw s6,48(sp) 40004eb0: 02c12b83 lw s7,44(sp) 40004eb4: 02812c03 lw s8,40(sp) 40004eb8: 02412c83 lw s9,36(sp) 40004ebc: 05010113 addi sp,sp,80 40004ec0: 00008067 ret if ( ( oflag & ~( O_RDONLY | O_RDWR | O_CREAT | O_EXCL | O_TRUNC ) ) != 0 ) { 40004ec4: fffff7b7 lui a5,0xfffff 40004ec8: 1fd78793 addi a5,a5,509 # fffff1fd 40004ecc: 00f5f7b3 and a5,a1,a5 40004ed0: 00058493 mv s1,a1 40004ed4: fa0796e3 bnez a5,40004e80 <== NEVER TAKEN if ( ( oflag & O_TRUNC ) != 0 && ( oflag & O_ACCMODE ) != O_RDWR ) { 40004ed8: 4005fb13 andi s6,a1,1024 40004edc: 00050a13 mv s4,a0 40004ee0: 00060a93 mv s5,a2 40004ee4: 0035f913 andi s2,a1,3 40004ee8: 060b1263 bnez s6,40004f4c <== NEVER TAKEN iop = rtems_libio_allocate(); 40004eec: e59fb0ef jal ra,40000d44 40004ef0: 00050413 mv s0,a0 if ( iop == NULL ) { 40004ef4: 24050863 beqz a0,40005144 <== NEVER TAKEN _RTEMS_Lock_allocator(); 40004ef8: 644000ef jal ra,4000553c <_RTEMS_Lock_allocator> return (POSIX_Shm_Control *) _Objects_Get_by_name( 40004efc: 4001abb7 lui s7,0x4001a 40004f00: 00c10693 addi a3,sp,12 40004f04: 00810613 addi a2,sp,8 40004f08: 000a0593 mv a1,s4 40004f0c: de8b8513 addi a0,s7,-536 # 40019de8 <_POSIX_Shm_Information> 40004f10: 008010ef jal ra,40005f18 <_Objects_Get_by_name> 40004f14: 00050993 mv s3,a0 if ( shm == NULL ) { 40004f18: 06050663 beqz a0,40004f84 <== ALWAYS TAKEN if ( ( oflag & ( O_EXCL | O_CREAT ) ) == ( O_EXCL | O_CREAT ) ) { 40004f1c: 000017b7 lui a5,0x1 <== NOT EXECUTED 40004f20: a0078793 addi a5,a5,-1536 # a00 <== NOT EXECUTED 40004f24: 00f4f4b3 and s1,s1,a5 <== NOT EXECUTED 40004f28: 02f49863 bne s1,a5,40004f58 <== NOT EXECUTED _RTEMS_Unlock_allocator(); 40004f2c: 61c000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED err = EEXIST; 40004f30: 01100493 li s1,17 <== NOT EXECUTED rtems_libio_free( iop ); 40004f34: 00040513 mv a0,s0 <== NOT EXECUTED 40004f38: e69fb0ef jal ra,40000da0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( err ); 40004f3c: 2c00b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 40004f40: 00952023 sw s1,0(a0) <== NOT EXECUTED 40004f44: fff00513 li a0,-1 <== NOT EXECUTED 40004f48: f49ff06f j 40004e90 <== NOT EXECUTED if ( ( oflag & O_TRUNC ) != 0 && ( oflag & O_ACCMODE ) != O_RDWR ) { 40004f4c: 00200793 li a5,2 <== NOT EXECUTED 40004f50: f8f90ee3 beq s2,a5,40004eec <== NOT EXECUTED 40004f54: f2dff06f j 40004e80 <== NOT EXECUTED return rtems_filesystem_check_access( flags, shm->mode, shm->uid, shm->gid ); 40004f58: 02e55683 lhu a3,46(a0) <== NOT EXECUTED 40004f5c: 02c55603 lhu a2,44(a0) <== NOT EXECUTED 40004f60: 03052583 lw a1,48(a0) <== NOT EXECUTED flags = RTEMS_FS_PERMS_WRITE; 40004f64: 00193513 seqz a0,s2 <== NOT EXECUTED 40004f68: 00151513 slli a0,a0,0x1 <== NOT EXECUTED return rtems_filesystem_check_access( flags, shm->mode, shm->uid, shm->gid ); 40004f6c: 00250513 addi a0,a0,2 <== NOT EXECUTED 40004f70: 4fc040ef jal ra,4000946c <== NOT EXECUTED } else if ( !shm_access_ok( shm, oflag ) ) { 40004f74: 18051263 bnez a0,400050f8 <== NOT EXECUTED 40004f78: 5d0000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED err = EACCES; 40004f7c: 00d00493 li s1,13 <== NOT EXECUTED 40004f80: fb5ff06f j 40004f34 <== NOT EXECUTED switch ( obj_err ) { 40004f84: 00c12783 lw a5,12(sp) 40004f88: 1a078263 beqz a5,4000512c <== NEVER TAKEN 40004f8c: 00100c13 li s8,1 40004f90: 19878863 beq a5,s8,40005120 if ( name_arg[0] != '/' ) { 40004f94: 000a4703 lbu a4,0(s4) 40004f98: 02f00793 li a5,47 40004f9c: 18f71863 bne a4,a5,4000512c if ( ( oflag & O_CREAT ) != O_CREAT ) { 40004fa0: 2004f793 andi a5,s1,512 40004fa4: 18078a63 beqz a5,40005138 <== NEVER TAKEN name = _Workspace_String_duplicate( name_arg, name_len ); 40004fa8: 00812583 lw a1,8(sp) 40004fac: 000a0513 mv a0,s4 40004fb0: 6f0030ef jal ra,400086a0 <_Workspace_String_duplicate> 40004fb4: 00050a13 mv s4,a0 if ( name == NULL ) { 40004fb8: 1a050063 beqz a0,40005158 <== NEVER TAKEN return ( *information->allocate )( information ); 40004fbc: de8b8c93 addi s9,s7,-536 40004fc0: 008ca783 lw a5,8(s9) 40004fc4: de8b8513 addi a0,s7,-536 40004fc8: 000780e7 jalr a5 40004fcc: 00050993 mv s3,a0 if ( shm == NULL ) { 40004fd0: 18050a63 beqz a0,40005164 <== NEVER TAKEN gettimeofday( &tv, 0 ); 40004fd4: 00000593 li a1,0 40004fd8: 01010513 addi a0,sp,16 40004fdc: 729030ef jal ra,40008f04 shm->shm_object.ops = &_POSIX_Shm_Object_operations; 40004fe0: 400187b7 lui a5,0x40018 40004fe4: 58878793 addi a5,a5,1416 # 40018588 <_POSIX_Shm_Object_operations> 40004fe8: 02f9a423 sw a5,40(s3) shm->reference_count = 1; 40004fec: 0189ae23 sw s8,28(s3) shm->shm_object.handle = NULL; 40004ff0: 0209a023 sw zero,32(s3) shm->shm_object.size = 0; 40004ff4: 0209a223 sw zero,36(s3) shm->mode = mode & ~rtems_filesystem_umask; 40004ff8: cc0fd0ef jal ra,400024b8 40004ffc: 00852603 lw a2,8(a0) shm->oflag = oflag; 40005000: 0299aa23 sw s1,52(s3) shm->mode = mode & ~rtems_filesystem_umask; 40005004: fff64613 not a2,a2 40005008: 01567633 and a2,a2,s5 4000500c: 02c9a823 sw a2,48(s3) shm->uid = geteuid(); 40005010: 6d9030ef jal ra,40008ee8 40005014: 02a99623 sh a0,44(s3) shm->gid = getegid(); 40005018: 6b5030ef jal ra,40008ecc information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 4000501c: 0089d703 lhu a4,8(s3) shm->atime = (time_t) tv.tv_sec; 40005020: 01012603 lw a2,16(sp) 40005024: 01412683 lw a3,20(sp) 40005028: 004ca783 lw a5,4(s9) 4000502c: 00271713 slli a4,a4,0x2 shm->gid = getegid(); 40005030: 02a99723 sh a0,46(s3) shm->atime = (time_t) tv.tv_sec; 40005034: 02c9ac23 sw a2,56(s3) 40005038: 02d9ae23 sw a3,60(s3) shm->mtime = (time_t) tv.tv_sec; 4000503c: 04c9a023 sw a2,64(s3) 40005040: 04d9a223 sw a3,68(s3) shm->ctime = (time_t) tv.tv_sec; 40005044: 04c9a423 sw a2,72(s3) 40005048: 04d9a623 sw a3,76(s3) the_object->name.name_p = name; 4000504c: 0149a623 sw s4,12(s3) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 40005050: 00e787b3 add a5,a5,a4 40005054: ff37ae23 sw s3,-4(a5) _RTEMS_Unlock_allocator(); 40005058: 4f0000ef jal ra,40005548 <_RTEMS_Unlock_allocator> if ( oflag & O_TRUNC ) { 4000505c: 0a0b1863 bnez s6,4000510c <== NEVER TAKEN fd = rtems_libio_iop_to_descriptor( iop ); 40005060: 4001c7b7 lui a5,0x4001c 40005064: b9878793 addi a5,a5,-1128 # 4001bb98 40005068: 40f407b3 sub a5,s0,a5 4000506c: aaaab737 lui a4,0xaaaab 40005070: 4047d793 srai a5,a5,0x4 40005074: aab70713 addi a4,a4,-1365 # aaaaaaab 40005078: 02e78533 mul a0,a5,a4 iop->pathinfo.handlers = &shm_handlers; 4000507c: 400187b7 lui a5,0x40018 40005080: 54878793 addi a5,a5,1352 # 40018548 40005084: 02f42023 sw a5,32(s0) iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry; 40005088: 4001a7b7 lui a5,0x4001a 4000508c: f2878793 addi a5,a5,-216 # 40019f28 40005090: 02f42223 sw a5,36(s0) iop->data1 = shm; 40005094: 03342623 sw s3,44(s0) iop->pathinfo.node_access = shm; 40005098: 01342c23 sw s3,24(s0) rtems_filesystem_location_add_to_mt_entry( &iop->pathinfo ); 4000509c: 01040793 addi a5,s0,16 iop->data0 = fd; 400050a0: 02a42423 sw a0,40(s0) __asm__ volatile ( 400050a4: 30047773 csrrci a4,mstatus,8 &loc->mt_entry->location_chain, 400050a8: 02442683 lw a3,36(s0) old_last = tail->previous; 400050ac: 01c6a603 lw a2,28(a3) # f01c return &the_chain->Tail.Node; 400050b0: 01868593 addi a1,a3,24 the_node->next = tail; 400050b4: 00b42823 sw a1,16(s0) tail->previous = the_node; 400050b8: 00f6ae23 sw a5,28(a3) old_last->next = the_node; 400050bc: 00f62023 sw a5,0(a2) # 2000 the_node->previous = old_last; 400050c0: 00c42a23 sw a2,20(s0) return mstatus & RISCV_MSTATUS_MIE; 400050c4: 00877793 andi a5,a4,8 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 400050c8: 3007a073 csrs mstatus,a5 flags |= LIBIO_FLAGS_READ; 400050cc: 00001737 lui a4,0x1 flags |= LIBIO_FLAGS_READ_WRITE; 400050d0: 90670693 addi a3,a4,-1786 # 906 if ( (oflag & O_ACCMODE) == O_RDONLY ) { 400050d4: 00091463 bnez s2,400050dc <== ALWAYS TAKEN flags |= LIBIO_FLAGS_READ; 400050d8: 90270693 addi a3,a4,-1790 <== NOT EXECUTED __asm__ volatile ( 400050dc: 300477f3 csrrci a5,mstatus,8 *obj = val | arg; 400050e0: 00042703 lw a4,0(s0) 400050e4: 00d76733 or a4,a4,a3 400050e8: 00e42023 sw a4,0(s0) return mstatus & RISCV_MSTATUS_MIE; 400050ec: 0087f793 andi a5,a5,8 __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 400050f0: 3007a073 csrs mstatus,a5 return fd; 400050f4: d9dff06f j 40004e90 ++shm->reference_count; 400050f8: 01c9a783 lw a5,28(s3) <== NOT EXECUTED 400050fc: 00178793 addi a5,a5,1 <== NOT EXECUTED 40005100: 00f9ae23 sw a5,28(s3) <== NOT EXECUTED 40005104: 444000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED if ( oflag & O_TRUNC ) { 40005108: f40b0ce3 beqz s6,40005060 <== NOT EXECUTED err = shm_ftruncate( iop, 0 ); 4000510c: 00000593 li a1,0 <== NOT EXECUTED 40005110: 00000613 li a2,0 <== NOT EXECUTED 40005114: 00040513 mv a0,s0 <== NOT EXECUTED 40005118: b81ff0ef jal ra,40004c98 <== NOT EXECUTED 4000511c: f45ff06f j 40005060 <== NOT EXECUTED 40005120: 428000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED err = ENAMETOOLONG; 40005124: 05b00493 li s1,91 <== NOT EXECUTED 40005128: e0dff06f j 40004f34 <== NOT EXECUTED 4000512c: 41c000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED *error = EINVAL; 40005130: 01600493 li s1,22 <== NOT EXECUTED 40005134: e01ff06f j 40004f34 <== NOT EXECUTED 40005138: 410000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED *error = ENOENT; 4000513c: 00200493 li s1,2 <== NOT EXECUTED 40005140: df5ff06f j 40004f34 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EMFILE ); 40005144: 0b80b0ef jal ra,400101fc <__errno> <== NOT EXECUTED 40005148: 01800793 li a5,24 <== NOT EXECUTED 4000514c: 00f52023 sw a5,0(a0) <== NOT EXECUTED 40005150: fff00513 li a0,-1 <== NOT EXECUTED 40005154: d3dff06f j 40004e90 <== NOT EXECUTED 40005158: 3f0000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED *error = ENOSPC; 4000515c: 01c00493 li s1,28 <== NOT EXECUTED 40005160: dd5ff06f j 40004f34 <== NOT EXECUTED _Workspace_Free( name ); 40005164: 000a0513 mv a0,s4 <== NOT EXECUTED 40005168: 528030ef jal ra,40008690 <_Workspace_Free> <== NOT EXECUTED *error = ENFILE; 4000516c: 01700493 li s1,23 <== NOT EXECUTED 40005170: 3d8000ef jal ra,40005548 <_RTEMS_Unlock_allocator> <== NOT EXECUTED if ( err != 0 ) { 40005174: dc1ff06f j 40004f34 <== NOT EXECUTED =============================================================================== 40006ef4 : #include #include int shm_unlink( const char *name ) { 40006ef4: fe010113 addi sp,sp,-32 40006ef8: 00812c23 sw s0,24(sp) 40006efc: 00912a23 sw s1,20(sp) 40006f00: 00050413 mv s0,a0 40006f04: 00112e23 sw ra,28(sp) 40006f08: 01212823 sw s2,16(sp) 40006f0c: 4001a4b7 lui s1,0x4001a _RTEMS_Lock_allocator(); 40006f10: 488020ef jal ra,40009398 <_RTEMS_Lock_allocator> 40006f14: 00c10693 addi a3,sp,12 40006f18: 00000613 li a2,0 40006f1c: 00040593 mv a1,s0 40006f20: 9f048513 addi a0,s1,-1552 # 400199f0 <_POSIX_Shm_Information> 40006f24: 461030ef jal ra,4000ab84 <_Objects_Get_by_name> POSIX_Shm_Control *shm; _Objects_Allocator_lock(); shm = _POSIX_Shm_Get_by_name( name, 0, &obj_err ); if ( shm ) { 40006f28: 06050a63 beqz a0,40006f9c <== NEVER TAKEN 40006f2c: 00050413 mv s0,a0 _Objects_Namespace_remove_string( 40006f30: 00050593 mv a1,a0 40006f34: 9f048513 addi a0,s1,-1552 40006f38: 441030ef jal ra,4000ab78 <_Objects_Namespace_remove_string> &_POSIX_Shm_Information, &shm->Object ); if ( shm->reference_count == 0 ) { 40006f3c: 01c42903 lw s2,28(s0) 40006f40: 02091c63 bnez s2,40006f78 <== NEVER TAKEN ( *information->deallocate )( information, the_object ); 40006f44: 9f048793 addi a5,s1,-1552 40006f48: 00c7a783 lw a5,12(a5) 40006f4c: 00040593 mv a1,s0 40006f50: 9f048513 addi a0,s1,-1552 40006f54: 000780e7 jalr a5 _RTEMS_Unlock_allocator(); 40006f58: 44c020ef jal ra,400093a4 <_RTEMS_Unlock_allocator> _Objects_Allocator_unlock(); if ( err != 0 ) rtems_set_errno_and_return_minus_one( err ); return 0; } 40006f5c: 01c12083 lw ra,28(sp) 40006f60: 01812403 lw s0,24(sp) 40006f64: 01412483 lw s1,20(sp) 40006f68: 00090513 mv a0,s2 40006f6c: 01012903 lw s2,16(sp) 40006f70: 02010113 addi sp,sp,32 40006f74: 00008067 ret 40006f78: 42c020ef jal ra,400093a4 <_RTEMS_Unlock_allocator> <== NOT EXECUTED 40006f7c: 01c12083 lw ra,28(sp) <== NOT EXECUTED 40006f80: 01812403 lw s0,24(sp) <== NOT EXECUTED return 0; 40006f84: 00000913 li s2,0 <== NOT EXECUTED } 40006f88: 01412483 lw s1,20(sp) <== NOT EXECUTED 40006f8c: 00090513 mv a0,s2 <== NOT EXECUTED 40006f90: 01012903 lw s2,16(sp) <== NOT EXECUTED 40006f94: 02010113 addi sp,sp,32 <== NOT EXECUTED 40006f98: 00008067 ret <== NOT EXECUTED switch ( obj_err ) { 40006f9c: 00c12703 lw a4,12(sp) <== NOT EXECUTED 40006fa0: 00100793 li a5,1 <== NOT EXECUTED 40006fa4: 00f70e63 beq a4,a5,40006fc0 <== NOT EXECUTED 40006fa8: 3fc020ef jal ra,400093a4 <_RTEMS_Unlock_allocator> <== NOT EXECUTED err = ENOENT; 40006fac: 00200413 li s0,2 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( err ); 40006fb0: 2640e0ef jal ra,40015214 <__errno> <== NOT EXECUTED 40006fb4: 00852023 sw s0,0(a0) <== NOT EXECUTED 40006fb8: fff00913 li s2,-1 <== NOT EXECUTED 40006fbc: fa1ff06f j 40006f5c <== NOT EXECUTED 40006fc0: 3e4020ef jal ra,400093a4 <_RTEMS_Unlock_allocator> <== NOT EXECUTED err = ENAMETOOLONG; 40006fc4: 05b00413 li s0,91 <== NOT EXECUTED 40006fc8: fe9ff06f j 40006fb0 <== NOT EXECUTED =============================================================================== 4000eb34 : int sigaction( int sig, const struct sigaction *__restrict act, struct sigaction *__restrict oact ) { 4000eb34: ff010113 addi sp,sp,-16 4000eb38: 00112623 sw ra,12(sp) 4000eb3c: 00812423 sw s0,8(sp) 4000eb40: 00912223 sw s1,4(sp) 4000eb44: 01212023 sw s2,0(sp) Thread_queue_Context queue_context; if ( !sig ) 4000eb48: 0e050663 beqz a0,4000ec34 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 4000eb4c: fff50793 addi a5,a0,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 4000eb50: 01f00713 li a4,31 4000eb54: 00050413 mv s0,a0 4000eb58: 0cf76e63 bltu a4,a5,4000ec34 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) 4000eb5c: 00900793 li a5,9 4000eb60: 0cf50a63 beq a0,a5,4000ec34 4000eb64: 00058493 mv s1,a1 __asm__ volatile ( 4000eb68: 30047973 csrrci s2,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 4000eb6c: 00897913 andi s2,s2,8 rtems_set_errno_and_return_minus_one( EINVAL ); _Thread_queue_Context_initialize( &queue_context ); _POSIX_signals_Acquire( &queue_context ); if ( oact ) 4000eb70: 02060a63 beqz a2,4000eba4 *oact = _POSIX_signals_Vectors[ sig ]; 4000eb74: 00151713 slli a4,a0,0x1 4000eb78: 00a70733 add a4,a4,a0 4000eb7c: 400187b7 lui a5,0x40018 4000eb80: 00271713 slli a4,a4,0x2 4000eb84: 1d478793 addi a5,a5,468 # 400181d4 <_POSIX_signals_Vectors> 4000eb88: 00e787b3 add a5,a5,a4 4000eb8c: 0007a683 lw a3,0(a5) 4000eb90: 0047a703 lw a4,4(a5) 4000eb94: 0087a783 lw a5,8(a5) 4000eb98: 00d62023 sw a3,0(a2) 4000eb9c: 00e62223 sw a4,4(a2) 4000eba0: 00f62423 sw a5,8(a2) /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { 4000eba4: 04048263 beqz s1,4000ebe8 <== NEVER TAKEN /* * Unless the user is installing the default signal actions, then * we can just copy the provided sigaction structure into the vectors. */ if ( act->sa_handler == SIG_DFL ) { 4000eba8: 0084a783 lw a5,8(s1) 4000ebac: 04078e63 beqz a5,4000ec08 _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; } else { _POSIX_signals_Clear_process_signals( sig ); 4000ebb0: 00040513 mv a0,s0 4000ebb4: 591000ef jal ra,4000f944 <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; 4000ebb8: 00141513 slli a0,s0,0x1 4000ebbc: 0004a683 lw a3,0(s1) 4000ebc0: 0044a703 lw a4,4(s1) 4000ebc4: 0084a783 lw a5,8(s1) 4000ebc8: 00850533 add a0,a0,s0 4000ebcc: 00251513 slli a0,a0,0x2 4000ebd0: 40018437 lui s0,0x40018 4000ebd4: 1d440413 addi s0,s0,468 # 400181d4 <_POSIX_signals_Vectors> 4000ebd8: 00a40433 add s0,s0,a0 4000ebdc: 00d42023 sw a3,0(s0) 4000ebe0: 00e42223 sw a4,4(s0) 4000ebe4: 00f42423 sw a5,8(s0) __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 4000ebe8: 30092073 csrs mstatus,s2 } } _POSIX_signals_Release( &queue_context ); return 0; 4000ebec: 00000513 li a0,0 } 4000ebf0: 00c12083 lw ra,12(sp) 4000ebf4: 00812403 lw s0,8(sp) 4000ebf8: 00412483 lw s1,4(sp) 4000ebfc: 00012903 lw s2,0(sp) 4000ec00: 01010113 addi sp,sp,16 4000ec04: 00008067 ret _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; 4000ec08: 00141513 slli a0,s0,0x1 4000ec0c: 00850533 add a0,a0,s0 4000ec10: 400157b7 lui a5,0x40015 4000ec14: 00251513 slli a0,a0,0x2 4000ec18: 9f878793 addi a5,a5,-1544 # 400149f8 <_POSIX_signals_Default_vectors> 4000ec1c: 00a787b3 add a5,a5,a0 4000ec20: 0007a683 lw a3,0(a5) 4000ec24: 0047a703 lw a4,4(a5) 4000ec28: 40018437 lui s0,0x40018 4000ec2c: 0087a783 lw a5,8(a5) 4000ec30: fa5ff06f j 4000ebd4 rtems_set_errno_and_return_minus_one( EINVAL ); 4000ec34: 1d9030ef jal ra,4001260c <__errno> 4000ec38: 01600793 li a5,22 4000ec3c: 00f52023 sw a5,0(a0) 4000ec40: fff00513 li a0,-1 4000ec44: fadff06f j 4000ebf0 =============================================================================== 40009364 : int sigtimedwait( const sigset_t *__restrict set, siginfo_t *__restrict info, const struct timespec *__restrict timeout ) { 40009364: f9010113 addi sp,sp,-112 40009368: 06112623 sw ra,108(sp) 4000936c: 06812423 sw s0,104(sp) 40009370: 06912223 sw s1,100(sp) 40009374: 07212023 sw s2,96(sp) 40009378: 05312e23 sw s3,92(sp) int error; /* * Error check parameters before disabling interrupts. */ if ( !set ) 4000937c: 30050863 beqz a0,4000968c 40009380: 00050913 mv s2,a0 40009384: 00058493 mv s1,a1 40009388: 00060413 mv s0,a2 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ if ( timeout != NULL ) { 4000938c: 16060463 beqz a2,400094f4 const struct timespec *end; _Timecounter_Nanouptime( &uptime ); 40009390: 01810513 addi a0,sp,24 40009394: 945fb0ef jal ra,40004cd8 <_Timecounter_Nanouptime> && (unsigned long) ts->tv_nsec < WATCHDOG_NANOSECONDS_PER_SECOND; 40009398: 00842683 lw a3,8(s0) # 4001c008 <__sf+0x40> 4000939c: 3b9ad637 lui a2,0x3b9ad 400093a0: 9ff60613 addi a2,a2,-1537 # 3b9ac9ff 400093a4: 0ed67e63 bgeu a2,a3,400094a0 return NULL; 400093a8: 00000793 li a5,0 queue_context->Timeout.arg = abstime; 400093ac: 02f12c23 sw a5,56(sp) queue_context->enqueue_callout = 400093b0: 400077b7 lui a5,0x40007 400093b4: 5a478793 addi a5,a5,1444 # 400075a4 <_Thread_queue_Add_timeout_monotonic_timespec> 400093b8: 02f12a23 sw a5,52(sp) /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; 400093bc: 14048463 beqz s1,40009504 <== NEVER TAKEN 400093c0: 4001b7b7 lui a5,0x4001b 400093c4: 6b87a403 lw s0,1720(a5) # 4001b6b8 <_Per_CPU_Information+0x38> executing = _Thread_Get_executing(); api = executing->API_Extensions[ THREAD_API_POSIX ]; 400093c8: 19842983 lw s3,408(s0) __asm__ volatile ( 400093cc: 300477f3 csrrci a5,mstatus,8 return mstatus & RISCV_MSTATUS_MIE; 400093d0: 0087f793 andi a5,a5,8 _ISR_lock_ISR_disable( &queue_context->Lock_context.Lock_context ); 400093d4: 02f12623 sw a5,44(sp) */ /* API signals pending? */ _POSIX_signals_Acquire( &queue_context ); if ( *set & api->signals_pending ) { 400093d8: 00092783 lw a5,0(s2) 400093dc: 06c9a703 lw a4,108(s3) 400093e0: 00e7f6b3 and a3,a5,a4 400093e4: 1e069663 bnez a3,400095d0 return the_info->si_signo; } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { 400093e8: 9081a703 lw a4,-1784(gp) # 40019688 <_POSIX_signals_Pending> 400093ec: 00e7f6b3 and a3,a5,a4 400093f0: 10069e63 bnez a3,4000950c the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; return signo; } the_info->si_signo = -1; 400093f4: fff00713 li a4,-1 400093f8: 00e4a023 sw a4,0(s1) executing->Wait.option = *set; 400093fc: 04f42423 sw a5,72(s0) executing->Wait.return_argument = the_info; _Thread_queue_Context_set_thread_state( &queue_context, STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL ); _Thread_queue_Enqueue( 40009400: 400175b7 lui a1,0x40017 40009404: 40019537 lui a0,0x40019 queue_context->thread_state = thread_state; 40009408: 100007b7 lui a5,0x10000 4000940c: 40078793 addi a5,a5,1024 # 10000400 40009410: 02c10693 addi a3,sp,44 40009414: 00040613 mv a2,s0 40009418: 30058593 addi a1,a1,768 # 40017300 <_Thread_queue_Operations_FIFO> 4000941c: 21050513 addi a0,a0,528 # 40019210 <_POSIX_signals_Wait_queue> executing->Wait.return_argument = the_info; 40009420: 04942023 sw s1,64(s0) 40009424: 02f12823 sw a5,48(sp) _Thread_queue_Enqueue( 40009428: b14fd0ef jal ra,4000673c <_Thread_queue_Enqueue> /* * When the thread is set free by a signal, it is need to eliminate * the signal. */ _POSIX_signals_Clear_signals( 4000942c: 0004a583 lw a1,0(s1) 40009430: 00100793 li a5,1 40009434: 00000713 li a4,0 40009438: 00098513 mv a0,s3 4000943c: 00000693 li a3,0 40009440: 00048613 mv a2,s1 40009444: 105020ef jal ra,4000bd48 <_POSIX_signals_Clear_signals> return _POSIX_Get_by_name_error_table[ error ]; } RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status ) { return STATUS_GET_POSIX( status ); 40009448: 04c42783 lw a5,76(s0) * was not in our set. */ error = _POSIX_Get_error_after_wait( executing ); if ( 4000944c: 00400713 li a4,4 40009450: 41f7d993 srai s3,a5,0x1f 40009454: 0ff9f993 andi s3,s3,255 40009458: 00f989b3 add s3,s3,a5 4000945c: 4089d993 srai s3,s3,0x8 40009460: 20e99863 bne s3,a4,40009670 error != EINTR || ( *set & signo_to_mask( the_info->si_signo ) ) == 0 40009464: 0004a403 lw s0,0(s1) 40009468: 00092703 lw a4,0(s2) return 1u << (sig - 1); 4000946c: 00100793 li a5,1 40009470: fff40693 addi a3,s0,-1 40009474: 00d797b3 sll a5,a5,a3 40009478: 00e7f7b3 and a5,a5,a4 4000947c: 20078063 beqz a5,4000967c rtems_set_errno_and_return_minus_one( error ); } return the_info->si_signo; } 40009480: 06c12083 lw ra,108(sp) 40009484: 00040513 mv a0,s0 40009488: 06812403 lw s0,104(sp) 4000948c: 06412483 lw s1,100(sp) 40009490: 06012903 lw s2,96(sp) 40009494: 05c12983 lw s3,92(sp) 40009498: 07010113 addi sp,sp,112 4000949c: 00008067 ret return _Watchdog_Is_valid_timespec( ts ) && ts->tv_sec >= 0; 400094a0: 00442583 lw a1,4(s0) 400094a4: 00042783 lw a5,0(s0) 400094a8: f005c0e3 bltz a1,400093a8 <== NEVER TAKEN sec += (uint64_t) delta->tv_sec; 400094ac: 01c12503 lw a0,28(sp) 400094b0: 01812703 lw a4,24(sp) 400094b4: 00a585b3 add a1,a1,a0 now->tv_nsec += delta->tv_nsec; 400094b8: 02012503 lw a0,32(sp) sec += (uint64_t) delta->tv_sec; 400094bc: 00e78733 add a4,a5,a4 400094c0: 00f737b3 sltu a5,a4,a5 now->tv_nsec += delta->tv_nsec; 400094c4: 00a686b3 add a3,a3,a0 sec += (uint64_t) delta->tv_sec; 400094c8: 00b787b3 add a5,a5,a1 if ( now->tv_nsec >= WATCHDOG_NANOSECONDS_PER_SECOND ) { 400094cc: 0ed64063 blt a2,a3,400095ac now->tv_nsec += delta->tv_nsec; 400094d0: 02d12023 sw a3,32(sp) if ( sec <= INT64_MAX ) { 400094d4: 0007d863 bgez a5,400094e4 <== ALWAYS TAKEN now->tv_sec = INT64_MAX; 400094d8: 800007b7 lui a5,0x80000 <== NOT EXECUTED 400094dc: fff00713 li a4,-1 <== NOT EXECUTED 400094e0: fff7c793 not a5,a5 <== NOT EXECUTED 400094e4: 00f12e23 sw a5,28(sp) 400094e8: 00e12c23 sw a4,24(sp) return now; 400094ec: 01810793 addi a5,sp,24 400094f0: ebdff06f j 400093ac queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing_extra; 400094f4: 400067b7 lui a5,0x40006 400094f8: 72878793 addi a5,a5,1832 # 40006728 <_Thread_queue_Enqueue_do_nothing_extra> 400094fc: 02f12a23 sw a5,52(sp) the_info = ( info ) ? info : &signal_information; 40009500: ec0490e3 bnez s1,400093c0 40009504: 00c10493 addi s1,sp,12 40009508: eb9ff06f j 400093c0 for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 4000950c: 01b00413 li s0,27 40009510: 00100693 li a3,1 40009514: 02000613 li a2,32 40009518: fff40793 addi a5,s0,-1 4000951c: 00f697b3 sll a5,a3,a5 if ( set & signo_to_mask( signo ) ) { 40009520: 00e7f7b3 and a5,a5,a4 40009524: 02079a63 bnez a5,40009558 <== NEVER TAKEN for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 40009528: 00140413 addi s0,s0,1 4000952c: fec416e3 bne s0,a2,40009518 for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 40009530: 00100413 li s0,1 40009534: 00100693 li a3,1 40009538: 01b00613 li a2,27 4000953c: 00c0006f j 40009548 40009540: 00140413 addi s0,s0,1 40009544: 00c40a63 beq s0,a2,40009558 40009548: fff40793 addi a5,s0,-1 4000954c: 00f697b3 sll a5,a3,a5 if ( set & signo_to_mask( signo ) ) { 40009550: 00e7f7b3 and a5,a5,a4 40009554: fe0786e3 beqz a5,40009540 _POSIX_signals_Clear_signals( api, signo, the_info, true, false, false ); 40009558: 00000793 li a5,0 4000955c: 00000713 li a4,0 40009560: 00100693 li a3,1 40009564: 00048613 mv a2,s1 40009568: 00040593 mv a1,s0 4000956c: 00098513 mv a0,s3 40009570: 7d8020ef jal ra,4000bd48 <_POSIX_signals_Clear_signals> __asm__ volatile ( "csrrs zero, mstatus, %0" : : "r" ( level ) ); 40009574: 02c12783 lw a5,44(sp) 40009578: 3007a073 csrs mstatus,a5 the_info->si_signo = signo; 4000957c: 0084a023 sw s0,0(s1) } 40009580: 06c12083 lw ra,108(sp) 40009584: 00040513 mv a0,s0 40009588: 06812403 lw s0,104(sp) the_info->si_code = SI_USER; 4000958c: 00100793 li a5,1 40009590: 00f4a223 sw a5,4(s1) the_info->si_value.sival_int = 0; 40009594: 0004a423 sw zero,8(s1) } 40009598: 06012903 lw s2,96(sp) 4000959c: 06412483 lw s1,100(sp) 400095a0: 05c12983 lw s3,92(sp) 400095a4: 07010113 addi sp,sp,112 400095a8: 00008067 ret ++sec; 400095ac: 00170613 addi a2,a4,1 <== NOT EXECUTED 400095b0: 00e635b3 sltu a1,a2,a4 <== NOT EXECUTED now->tv_nsec -= WATCHDOG_NANOSECONDS_PER_SECOND; 400095b4: c4653737 lui a4,0xc4653 <== NOT EXECUTED 400095b8: 60070713 addi a4,a4,1536 # c4653600 <== NOT EXECUTED 400095bc: 00e686b3 add a3,a3,a4 <== NOT EXECUTED 400095c0: 02d12023 sw a3,32(sp) <== NOT EXECUTED ++sec; 400095c4: 00060713 mv a4,a2 <== NOT EXECUTED 400095c8: 00f587b3 add a5,a1,a5 <== NOT EXECUTED 400095cc: f09ff06f j 400094d4 <== NOT EXECUTED for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 400095d0: 01b00593 li a1,27 400095d4: 00100693 li a3,1 400095d8: 02000613 li a2,32 400095dc: fff58793 addi a5,a1,-1 400095e0: 00f697b3 sll a5,a3,a5 if ( set & signo_to_mask( signo ) ) { 400095e4: 00e7f7b3 and a5,a5,a4 400095e8: 02079a63 bnez a5,4000961c <== NEVER TAKEN for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 400095ec: 00158593 addi a1,a1,1 400095f0: fec596e3 bne a1,a2,400095dc for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 400095f4: 00100593 li a1,1 400095f8: 00100693 li a3,1 400095fc: 01b00613 li a2,27 40009600: 00c0006f j 4000960c 40009604: 00158593 addi a1,a1,1 40009608: 00c58a63 beq a1,a2,4000961c 4000960c: fff58793 addi a5,a1,-1 40009610: 00f697b3 sll a5,a3,a5 if ( set & signo_to_mask( signo ) ) { 40009614: 00e7f7b3 and a5,a5,a4 40009618: fe0786e3 beqz a5,40009604 the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); 4000961c: 00b4a023 sw a1,0(s1) _POSIX_signals_Clear_signals( 40009620: 00000793 li a5,0 40009624: 00000713 li a4,0 40009628: 00000693 li a3,0 4000962c: 00048613 mv a2,s1 40009630: 00098513 mv a0,s3 40009634: 714020ef jal ra,4000bd48 <_POSIX_signals_Clear_signals> 40009638: 02c12783 lw a5,44(sp) 4000963c: 3007a073 csrs mstatus,a5 return the_info->si_signo; 40009640: 0004a403 lw s0,0(s1) } 40009644: 06c12083 lw ra,108(sp) the_info->si_code = SI_USER; 40009648: 00100793 li a5,1 } 4000964c: 00040513 mv a0,s0 40009650: 06812403 lw s0,104(sp) the_info->si_code = SI_USER; 40009654: 00f4a223 sw a5,4(s1) the_info->si_value.sival_int = 0; 40009658: 0004a423 sw zero,8(s1) } 4000965c: 06012903 lw s2,96(sp) 40009660: 06412483 lw s1,100(sp) 40009664: 05c12983 lw s3,92(sp) 40009668: 07010113 addi sp,sp,112 4000966c: 00008067 ret if ( error == ETIMEDOUT ) { 40009670: 07400793 li a5,116 40009674: 00f99463 bne s3,a5,4000967c error = EAGAIN; 40009678: 00b00993 li s3,11 rtems_set_errno_and_return_minus_one( error ); 4000967c: 479060ef jal ra,400102f4 <__errno> 40009680: 01352023 sw s3,0(a0) 40009684: fff00413 li s0,-1 40009688: df9ff06f j 40009480 rtems_set_errno_and_return_minus_one( EINVAL ); 4000968c: 469060ef jal ra,400102f4 <__errno> 40009690: 01600793 li a5,22 40009694: 00f52023 sw a5,0(a0) 40009698: fff00413 li s0,-1 4000969c: de5ff06f j 40009480 =============================================================================== 4000a920 : int sigwait( const sigset_t *__restrict set, int *__restrict sig ) { 4000a920: ff010113 addi sp,sp,-16 4000a924: 00812423 sw s0,8(sp) int status; status = sigtimedwait( set, NULL, NULL ); 4000a928: 00000613 li a2,0 { 4000a92c: 00058413 mv s0,a1 status = sigtimedwait( set, NULL, NULL ); 4000a930: 00000593 li a1,0 { 4000a934: 00112623 sw ra,12(sp) status = sigtimedwait( set, NULL, NULL ); 4000a938: cadff0ef jal ra,4000a5e4 if ( status != -1 ) { 4000a93c: fff00713 li a4,-1 4000a940: 02e50263 beq a0,a4,4000a964 4000a944: 00050793 mv a5,a0 if ( sig ) *sig = status; return 0; 4000a948: 00000513 li a0,0 if ( sig ) 4000a94c: 00040463 beqz s0,4000a954 <== NEVER TAKEN *sig = status; 4000a950: 00f42023 sw a5,0(s0) } return errno; } 4000a954: 00c12083 lw ra,12(sp) 4000a958: 00812403 lw s0,8(sp) 4000a95c: 01010113 addi sp,sp,16 4000a960: 00008067 ret return errno; 4000a964: 445060ef jal ra,400115a8 <__errno> } 4000a968: 00c12083 lw ra,12(sp) 4000a96c: 00812403 lw s0,8(sp) return errno; 4000a970: 00052503 lw a0,0(a0) } 4000a974: 01010113 addi sp,sp,16 4000a978: 00008067 ret =============================================================================== 4000b5bc : { 4000b5bc: ff010113 addi sp,sp,-16 4000b5c0: 00112623 sw ra,12(sp) 4000b5c4: 00812423 sw s0,8(sp) 4000b5c8: 00912223 sw s1,4(sp) 4000b5cc: 01212023 sw s2,0(sp) if ( clock_id != CLOCK_REALTIME ) 4000b5d0: 00100793 li a5,1 4000b5d4: 14f51663 bne a0,a5,4000b720 4000b5d8: 00060493 mv s1,a2 if ( !timerid ) 4000b5dc: 14060263 beqz a2,4000b720 4000b5e0: 00058413 mv s0,a1 if (evp != NULL) { 4000b5e4: 0e058263 beqz a1,4000b6c8 if ( ( evp->sigev_notify != SIGEV_NONE ) && 4000b5e8: 0005a783 lw a5,0(a1) 4000b5ec: fff78793 addi a5,a5,-1 4000b5f0: 12f56863 bltu a0,a5,4000b720 if ( !evp->sigev_signo ) 4000b5f4: 0045a783 lw a5,4(a1) 4000b5f8: 12078463 beqz a5,4000b720 <== NEVER TAKEN static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 4000b5fc: fff78793 addi a5,a5,-1 if ( !is_valid_signo(evp->sigev_signo) ) 4000b600: 01f00713 li a4,31 4000b604: 10f76e63 bltu a4,a5,4000b720 * This function allocates a timer control block from * the inactive chain of free timer control blocks. */ RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Allocate( void ) { return (POSIX_Timer_Control *) _Objects_Allocate( &_POSIX_Timer_Information ); 4000b608: 40015937 lui s2,0x40015 4000b60c: 33c90513 addi a0,s2,828 # 4001533c <_POSIX_Timer_Information> 4000b610: d4dfb0ef jal ra,4000735c <_Objects_Allocate> if ( !ptimer ) { 4000b614: 0e050063 beqz a0,4000b6f4 <== NEVER TAKEN ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; 4000b618: 00200793 li a5,2 4000b61c: 02f50a23 sb a5,52(a0) ptimer->thread_id = _Thread_Get_executing()->Object.id; 4000b620: 400267b7 lui a5,0x40026 4000b624: 6f87a783 lw a5,1784(a5) # 400266f8 <_Per_CPU_Information+0x38> ptimer->inf.sigev_notify = evp->sigev_notify; 4000b628: 00042603 lw a2,0(s0) ptimer->inf.sigev_signo = evp->sigev_signo; 4000b62c: 00442703 lw a4,4(s0) ptimer->thread_id = _Thread_Get_executing()->Object.id; 4000b630: 0087a683 lw a3,8(a5) ptimer->inf.sigev_value = evp->sigev_value; 4000b634: 00842783 lw a5,8(s0) ptimer->inf.sigev_notify = evp->sigev_notify; 4000b638: 02c52c23 sw a2,56(a0) ptimer->thread_id = _Thread_Get_executing()->Object.id; 4000b63c: 02d52823 sw a3,48(a0) ptimer->inf.sigev_signo = evp->sigev_signo; 4000b640: 02e52e23 sw a4,60(a0) ptimer->inf.sigev_value = evp->sigev_value; 4000b644: 04f52023 sw a5,64(a0) _Objects_Get_index( the_object->id ), 4000b648: 00852603 lw a2,8(a0) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 4000b64c: 33c90913 addi s2,s2,828 4000b650: 00492783 lw a5,4(s2) 4000b654: 01061713 slli a4,a2,0x10 RB_COLOR( &the_watchdog->Node.RBTree, Node ) = state; 4000b658: 00200693 li a3,2 4000b65c: 00d52e23 sw a3,28(a0) 4000b660: 01075713 srli a4,a4,0x10 the_watchdog->routine = routine; 4000b664: 4000b6b7 lui a3,0x4000b ptimer->timer_data.it_value.tv_sec = 0; 4000b668: 00000813 li a6,0 4000b66c: 00000893 li a7,0 4000b670: 00271713 slli a4,a4,0x2 4000b674: 73468693 addi a3,a3,1844 # 4000b734 <_POSIX_Timer_TSR> ptimer->overrun = 0; 4000b678: 06052a23 sw zero,116(a0) ptimer->timer_data.it_value.tv_sec = 0; 4000b67c: 07052023 sw a6,96(a0) 4000b680: 07152223 sw a7,100(a0) ptimer->timer_data.it_value.tv_nsec = 0; 4000b684: 06052423 sw zero,104(a0) ptimer->timer_data.it_interval.tv_sec = 0; 4000b688: 05052823 sw a6,80(a0) 4000b68c: 05152a23 sw a7,84(a0) ptimer->timer_data.it_interval.tv_nsec = 0; 4000b690: 04052c23 sw zero,88(a0) 4000b694: 02d52023 sw a3,32(a0) the_object->name.name_u32 = name; 4000b698: 00052623 sw zero,12(a0) information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object; 4000b69c: 00e787b3 add a5,a5,a4 4000b6a0: fea7ae23 sw a0,-4(a5) *timerid = ptimer->Object.id; 4000b6a4: 00c4a023 sw a2,0(s1) _RTEMS_Unlock_allocator(); 4000b6a8: bb1fa0ef jal ra,40006258 <_RTEMS_Unlock_allocator> return 0; 4000b6ac: 00000513 li a0,0 } 4000b6b0: 00c12083 lw ra,12(sp) 4000b6b4: 00812403 lw s0,8(sp) 4000b6b8: 00412483 lw s1,4(sp) 4000b6bc: 00012903 lw s2,0(sp) 4000b6c0: 01010113 addi sp,sp,16 4000b6c4: 00008067 ret 4000b6c8: 40015937 lui s2,0x40015 4000b6cc: 33c90513 addi a0,s2,828 # 4001533c <_POSIX_Timer_Information> 4000b6d0: c8dfb0ef jal ra,4000735c <_Objects_Allocate> if ( !ptimer ) { 4000b6d4: 02050063 beqz a0,4000b6f4 ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; 4000b6d8: 00200793 li a5,2 4000b6dc: 02f50a23 sb a5,52(a0) ptimer->thread_id = _Thread_Get_executing()->Object.id; 4000b6e0: 400267b7 lui a5,0x40026 4000b6e4: 6f87a783 lw a5,1784(a5) # 400266f8 <_Per_CPU_Information+0x38> 4000b6e8: 0087a783 lw a5,8(a5) 4000b6ec: 02f52823 sw a5,48(a0) if ( evp != NULL ) { 4000b6f0: f59ff06f j 4000b648 4000b6f4: b65fa0ef jal ra,40006258 <_RTEMS_Unlock_allocator> rtems_set_errno_and_return_minus_one( EAGAIN ); 4000b6f8: 514060ef jal ra,40011c0c <__errno> } 4000b6fc: 00c12083 lw ra,12(sp) 4000b700: 00812403 lw s0,8(sp) rtems_set_errno_and_return_minus_one( EAGAIN ); 4000b704: 00b00793 li a5,11 4000b708: 00f52023 sw a5,0(a0) } 4000b70c: 00412483 lw s1,4(sp) 4000b710: 00012903 lw s2,0(sp) rtems_set_errno_and_return_minus_one( EAGAIN ); 4000b714: fff00513 li a0,-1 } 4000b718: 01010113 addi sp,sp,16 4000b71c: 00008067 ret rtems_set_errno_and_return_minus_one( EINVAL ); 4000b720: 4ec060ef jal ra,40011c0c <__errno> 4000b724: 01600793 li a5,22 4000b728: 00f52023 sw a5,0(a0) 4000b72c: fff00513 li a0,-1 4000b730: f81ff06f j 4000b6b0 =============================================================================== 40009a64 : int timer_gettime( timer_t timerid, struct itimerspec *value ) { 40009a64: fe010113 addi sp,sp,-32 40009a68: 00112e23 sw ra,28(sp) 40009a6c: 00812c23 sw s0,24(sp) 40009a70: 00912a23 sw s1,20(sp) POSIX_Timer_Control *ptimer; ISR_lock_Context lock_context; uint64_t now; uint32_t remaining; if ( !value ) 40009a74: 08058c63 beqz a1,40009b0c 40009a78: 40022637 lui a2,0x40022 40009a7c: 00058493 mv s1,a1 40009a80: 83c60613 addi a2,a2,-1988 # 4002183c <_POSIX_Timer_Information> 40009a84: 00c10593 addi a1,sp,12 40009a88: 341010ef jal ra,4000b5c8 <_Objects_Get> 40009a8c: 00050413 mv s0,a0 rtems_set_errno_and_return_minus_one( EINVAL ); ptimer = _POSIX_Timer_Get( timerid, &lock_context ); if ( ptimer != NULL ) { 40009a90: 06050e63 beqz a0,40009b0c Per_CPU_Control *cpu; cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context ); now = cpu->Watchdog.ticks; 40009a94: 400257b7 lui a5,0x40025 40009a98: bc078793 addi a5,a5,-1088 # 40024bc0 <_Per_CPU_Information> 40009a9c: 04c7a703 lw a4,76(a5) if ( now < ptimer->Timer.expire ) { 40009aa0: 02c52683 lw a3,44(a0) now = cpu->Watchdog.ticks; 40009aa4: 0487a783 lw a5,72(a5) if ( now < ptimer->Timer.expire ) { 40009aa8: 02852503 lw a0,40(a0) 40009aac: 04d77863 bgeu a4,a3,40009afc remaining = (uint32_t) ( ptimer->Timer.expire - now ); 40009ab0: 40f50533 sub a0,a0,a5 } else { remaining = 0; } _Timespec_From_ticks( remaining, &value->it_value ); 40009ab4: 01048593 addi a1,s1,16 40009ab8: 71c020ef jal ra,4000c1d4 <_Timespec_From_ticks> value->it_interval = ptimer->timer_data.it_interval; 40009abc: 05042603 lw a2,80(s0) 40009ac0: 05442683 lw a3,84(s0) 40009ac4: 05842703 lw a4,88(s0) 40009ac8: 05c42783 lw a5,92(s0) 40009acc: 00c4a023 sw a2,0(s1) 40009ad0: 00d4a223 sw a3,4(s1) 40009ad4: 00e4a423 sw a4,8(s1) 40009ad8: 00f4a623 sw a5,12(s1) 40009adc: 00c12783 lw a5,12(sp) 40009ae0: 3007a073 csrs mstatus,a5 _POSIX_Timer_Release( cpu, &lock_context ); return 0; 40009ae4: 00000513 li a0,0 } rtems_set_errno_and_return_minus_one( EINVAL ); } 40009ae8: 01c12083 lw ra,28(sp) 40009aec: 01812403 lw s0,24(sp) 40009af0: 01412483 lw s1,20(sp) 40009af4: 02010113 addi sp,sp,32 40009af8: 00008067 ret if ( now < ptimer->Timer.expire ) { 40009afc: 00e69463 bne a3,a4,40009b04 40009b00: faa7e8e3 bltu a5,a0,40009ab0 remaining = 0; 40009b04: 00000513 li a0,0 <== NOT EXECUTED 40009b08: fadff06f j 40009ab4 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EINVAL ); 40009b0c: 0ad070ef jal ra,400113b8 <__errno> 40009b10: 01600793 li a5,22 40009b14: 00f52023 sw a5,0(a0) 40009b18: fff00513 li a0,-1 40009b1c: fcdff06f j 40009ae8 =============================================================================== 40005904 : timer_t timerid, int flags, const struct itimerspec *__restrict value, struct itimerspec *__restrict ovalue ) { 40005904: fb010113 addi sp,sp,-80 40005908: 04112623 sw ra,76(sp) 4000590c: 04812423 sw s0,72(sp) 40005910: 04912223 sw s1,68(sp) 40005914: 05212023 sw s2,64(sp) 40005918: 03312e23 sw s3,60(sp) 4000591c: 03412c23 sw s4,56(sp) POSIX_Timer_Control *ptimer; ISR_lock_Context lock_context; uint32_t initial_period; struct itimerspec normalize; if ( !value ) 40005920: 2e060463 beqz a2,40005c08 <== NEVER TAKEN /* * First, it verifies if the structure "value" is correct * if the number of nanoseconds is not correct return EINVAL */ if ( !_Timespec_Is_valid( &(value->it_value) ) ) { 40005924: 00050993 mv s3,a0 40005928: 01060513 addi a0,a2,16 4000592c: 00060913 mv s2,a2 40005930: 00058413 mv s0,a1 40005934: 00068493 mv s1,a3 40005938: 4bd030ef jal ra,400095f4 <_Timespec_Is_valid> 4000593c: 2c050663 beqz a0,40005c08 rtems_set_errno_and_return_minus_one( EINVAL ); } if ( !_Timespec_Is_valid( &(value->it_interval) ) ) { 40005940: 00090513 mv a0,s2 40005944: 4b1030ef jal ra,400095f4 <_Timespec_Is_valid> 40005948: 2c050063 beqz a0,40005c08 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); } if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { 4000594c: 00400793 li a5,4 40005950: 24f40463 beq s0,a5,40005b98 40005954: 2a041a63 bnez s0,40005c08 rtems_set_errno_and_return_minus_one( EINVAL ); } normalize = *value; 40005958: 00092883 lw a7,0(s2) 4000595c: 00492803 lw a6,4(s2) 40005960: 00892503 lw a0,8(s2) 40005964: 00c92583 lw a1,12(s2) 40005968: 01092603 lw a2,16(s2) 4000596c: 01492683 lw a3,20(s2) 40005970: 01892703 lw a4,24(s2) 40005974: 01c92783 lw a5,28(s2) 40005978: 01112823 sw a7,16(sp) 4000597c: 01012a23 sw a6,20(sp) 40005980: 00a12c23 sw a0,24(sp) 40005984: 00b12e23 sw a1,28(sp) 40005988: 02c12023 sw a2,32(sp) 4000598c: 02d12223 sw a3,36(sp) 40005990: 02e12423 sw a4,40(sp) 40005994: 02f12623 sw a5,44(sp) /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { 40005998: 00010413 mv s0,sp 4000599c: 40018637 lui a2,0x40018 400059a0: 00040593 mv a1,s0 400059a4: bd060613 addi a2,a2,-1072 # 40017bd0 <_POSIX_Timer_Information> 400059a8: 00098513 mv a0,s3 400059ac: 235010ef jal ra,400073e0 <_Objects_Get> 400059b0: 00050413 mv s0,a0 * something with the structure of times of the timer: to stop, start * or start it again */ ptimer = _POSIX_Timer_Get( timerid, &lock_context ); if ( ptimer != NULL ) { 400059b4: 24050a63 beqz a0,40005c08 Per_CPU_Control *cpu; cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context ); /* Stop the timer */ _Watchdog_Remove( 400059b8: 01050a13 addi s4,a0,16 400059bc: 4001a9b7 lui s3,0x4001a 400059c0: 000a0593 mv a1,s4 400059c4: 9d098513 addi a0,s3,-1584 # 400199d0 <_Per_CPU_Information+0x50> 400059c8: 601030ef jal ra,400097c8 <_Watchdog_Remove> &cpu->Watchdog.Header[ PER_CPU_WATCHDOG_TICKS ], &ptimer->Timer ); /* First, it verifies if the timer must be stopped */ if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) { 400059cc: 02012783 lw a5,32(sp) 400059d0: 02412703 lw a4,36(sp) 400059d4: 00e7e7b3 or a5,a5,a4 400059d8: 0c079063 bnez a5,40005a98 400059dc: 02812503 lw a0,40(sp) 400059e0: 0a051c63 bnez a0,40005a98 /* The old data of the timer are returned */ if ( ovalue ) 400059e4: 04048263 beqz s1,40005a28 *ovalue = ptimer->timer_data; 400059e8: 05042303 lw t1,80(s0) 400059ec: 05442883 lw a7,84(s0) 400059f0: 05842803 lw a6,88(s0) 400059f4: 05c42583 lw a1,92(s0) 400059f8: 06042603 lw a2,96(s0) 400059fc: 06442683 lw a3,100(s0) 40005a00: 06842703 lw a4,104(s0) 40005a04: 06c42783 lw a5,108(s0) 40005a08: 0064a023 sw t1,0(s1) 40005a0c: 0114a223 sw a7,4(s1) 40005a10: 0104a423 sw a6,8(s1) 40005a14: 00b4a623 sw a1,12(s1) 40005a18: 00c4a823 sw a2,16(s1) 40005a1c: 00d4aa23 sw a3,20(s1) 40005a20: 00e4ac23 sw a4,24(s1) 40005a24: 00f4ae23 sw a5,28(s1) /* The new data are set */ ptimer->timer_data = normalize; 40005a28: 01012783 lw a5,16(sp) 40005a2c: 04f42823 sw a5,80(s0) 40005a30: 01412783 lw a5,20(sp) 40005a34: 04f42a23 sw a5,84(s0) 40005a38: 01812783 lw a5,24(sp) 40005a3c: 04f42c23 sw a5,88(s0) 40005a40: 01c12783 lw a5,28(sp) 40005a44: 04f42e23 sw a5,92(s0) 40005a48: 02012783 lw a5,32(sp) 40005a4c: 06f42023 sw a5,96(s0) 40005a50: 02412783 lw a5,36(sp) 40005a54: 06f42223 sw a5,100(s0) 40005a58: 02812783 lw a5,40(sp) 40005a5c: 06f42423 sw a5,104(s0) 40005a60: 02c12783 lw a5,44(sp) 40005a64: 06f42623 sw a5,108(s0) /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 40005a68: 00400793 li a5,4 40005a6c: 02f40a23 sb a5,52(s0) 40005a70: 00012783 lw a5,0(sp) 40005a74: 3007a073 csrs mstatus,a5 _POSIX_Timer_Release( cpu, &lock_context ); return 0; } rtems_set_errno_and_return_minus_one( EINVAL ); } 40005a78: 04c12083 lw ra,76(sp) 40005a7c: 04812403 lw s0,72(sp) 40005a80: 04412483 lw s1,68(sp) 40005a84: 04012903 lw s2,64(sp) 40005a88: 03c12983 lw s3,60(sp) 40005a8c: 03812a03 lw s4,56(sp) 40005a90: 05010113 addi sp,sp,80 40005a94: 00008067 ret ptimer->ticks = _Timespec_To_ticks( &value->it_interval ); 40005a98: 00090513 mv a0,s2 40005a9c: 43d030ef jal ra,400096d8 <_Timespec_To_ticks> 40005aa0: 06a42823 sw a0,112(s0) initial_period = _Timespec_To_ticks( &normalize.it_value ); 40005aa4: 02010513 addi a0,sp,32 40005aa8: 431030ef jal ra,400096d8 <_Timespec_To_ticks> ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 40005aac: 00300793 li a5,3 initial_period = _Timespec_To_ticks( &normalize.it_value ); 40005ab0: 00050913 mv s2,a0 ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 40005ab4: 02f40a23 sb a5,52(s0) 40005ab8: 07840513 addi a0,s0,120 40005abc: a18fe0ef jal ra,40003cd4 <_Timecounter_Nanotime> cpu->Watchdog.ticks + ticks 40005ac0: 4001a7b7 lui a5,0x4001a 40005ac4: 98078793 addi a5,a5,-1664 # 40019980 <_Per_CPU_Information> _Watchdog_Insert( 40005ac8: 0487a603 lw a2,72(a5) 40005acc: 04c7a683 lw a3,76(a5) 40005ad0: 000a0593 mv a1,s4 40005ad4: 00c90633 add a2,s2,a2 40005ad8: 01263933 sltu s2,a2,s2 40005adc: 00d906b3 add a3,s2,a3 40005ae0: 9d098513 addi a0,s3,-1584 40005ae4: d50ff0ef jal ra,40005034 <_Watchdog_Insert> if ( ovalue ) 40005ae8: 04048263 beqz s1,40005b2c *ovalue = ptimer->timer_data; 40005aec: 05042883 lw a7,80(s0) 40005af0: 05442803 lw a6,84(s0) 40005af4: 05842503 lw a0,88(s0) 40005af8: 05c42583 lw a1,92(s0) 40005afc: 06042603 lw a2,96(s0) 40005b00: 06442683 lw a3,100(s0) 40005b04: 06842703 lw a4,104(s0) 40005b08: 06c42783 lw a5,108(s0) 40005b0c: 0114a023 sw a7,0(s1) 40005b10: 0104a223 sw a6,4(s1) 40005b14: 00a4a423 sw a0,8(s1) 40005b18: 00b4a623 sw a1,12(s1) 40005b1c: 00c4a823 sw a2,16(s1) 40005b20: 00d4aa23 sw a3,20(s1) 40005b24: 00e4ac23 sw a4,24(s1) 40005b28: 00f4ae23 sw a5,28(s1) ptimer->timer_data = normalize; 40005b2c: 01012783 lw a5,16(sp) 40005b30: 04f42823 sw a5,80(s0) 40005b34: 01412783 lw a5,20(sp) 40005b38: 04f42a23 sw a5,84(s0) 40005b3c: 01812783 lw a5,24(sp) 40005b40: 04f42c23 sw a5,88(s0) 40005b44: 01c12783 lw a5,28(sp) 40005b48: 04f42e23 sw a5,92(s0) 40005b4c: 02012783 lw a5,32(sp) 40005b50: 06f42023 sw a5,96(s0) 40005b54: 02412783 lw a5,36(sp) 40005b58: 06f42223 sw a5,100(s0) 40005b5c: 02812783 lw a5,40(sp) 40005b60: 06f42423 sw a5,104(s0) 40005b64: 02c12783 lw a5,44(sp) 40005b68: 06f42623 sw a5,108(s0) 40005b6c: 00012783 lw a5,0(sp) 40005b70: 3007a073 csrs mstatus,a5 return 0; 40005b74: 00000513 li a0,0 } 40005b78: 04c12083 lw ra,76(sp) 40005b7c: 04812403 lw s0,72(sp) 40005b80: 04412483 lw s1,68(sp) 40005b84: 04012903 lw s2,64(sp) 40005b88: 03c12983 lw s3,60(sp) 40005b8c: 03812a03 lw s4,56(sp) 40005b90: 05010113 addi sp,sp,80 40005b94: 00008067 ret normalize = *value; 40005b98: 00c92583 lw a1,12(s2) 40005b9c: 00092303 lw t1,0(s2) 40005ba0: 00492883 lw a7,4(s2) 40005ba4: 00892803 lw a6,8(s2) 40005ba8: 01092603 lw a2,16(s2) 40005bac: 01492683 lw a3,20(s2) 40005bb0: 01892703 lw a4,24(s2) 40005bb4: 01c92783 lw a5,28(s2) 40005bb8: 00010413 mv s0,sp 40005bbc: 00040513 mv a0,s0 40005bc0: 00b12e23 sw a1,28(sp) 40005bc4: 00612823 sw t1,16(sp) 40005bc8: 01112a23 sw a7,20(sp) 40005bcc: 01012c23 sw a6,24(sp) 40005bd0: 02c12023 sw a2,32(sp) 40005bd4: 02d12223 sw a3,36(sp) 40005bd8: 02e12423 sw a4,40(sp) 40005bdc: 02f12623 sw a5,44(sp) 40005be0: 8f4fe0ef jal ra,40003cd4 <_Timecounter_Nanotime> if ( _Timespec_Greater_than( &now, &normalize.it_value ) ) 40005be4: 00040593 mv a1,s0 40005be8: 02010513 addi a0,sp,32 40005bec: 239030ef jal ra,40009624 <_Timespec_Less_than> 40005bf0: 00051c63 bnez a0,40005c08 _Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value ); 40005bf4: 02010613 addi a2,sp,32 40005bf8: 00060593 mv a1,a2 40005bfc: 00040513 mv a0,s0 40005c00: 26d030ef jal ra,4000966c <_Timespec_Subtract> 40005c04: d99ff06f j 4000599c rtems_set_errno_and_return_minus_one( EINVAL ); 40005c08: 5c40e0ef jal ra,400141cc <__errno> 40005c0c: 01600793 li a5,22 40005c10: 00f52023 sw a5,0(a0) 40005c14: fff00513 li a0,-1 40005c18: f61ff06f j 40005b78 =============================================================================== 4000013c : rtems_test_assert(sc == RTEMS_SUCCESSFUL); 4000013c: 400176b7 lui a3,0x40017 40000140: 400175b7 lui a1,0x40017 40000144: 40017537 lui a0,0x40017 static void wait(void) 40000148: ff010113 addi sp,sp,-16 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 4000014c: 45068693 addi a3,a3,1104 # 40017450 40000150: 05c00613 li a2,92 40000154: 46858593 addi a1,a1,1128 # 40017468 40000158: 49850513 addi a0,a0,1176 # 40017498 static void wait(void) 4000015c: 00112623 sw ra,12(sp) rtems_test_assert(sc == RTEMS_SUCCESSFUL); 40000160: 481000ef jal ra,40000de0 <__wrap_printf> 40000164: 00000513 li a0,0 40000168: 465000ef jal ra,40000dcc <== NOT EXECUTED