type
status
date
slug
summary
tags
category
icon
password
The code is based on: https://gitlab.com/riseproject/riscv-optee/optee_os/-/tree/dev-optee-mpxy
Commit ID:
75df9ba41a404aec897399ead0ff0aebcbff48ca
thread_handle_std_abi()
- If
args->a0 == OPTEE_ABI_CALL_RETURN_FROM_RPC
: - Otherwise:
thread_alloc_and_run()
- Call
__thread_alloc_and_run()
withpc
parameter set to thread_std_abi_entry(). So when thread is resumed, thread_std_abi_entry() will be executed.
__thread_alloc_and_run()
- Find the free thread whose state is
THREAD_STATE_FREE
. - If found, set thread’s state to
THREAD_STATE_ACTIVE
. - Set the current thread ID (
l->curr_thread
) to the founded thread ID. - Call
init_regs()
to initialize the registers to be restored of the thread. thread->regs.epc
is set topc
.- Call thread_resume() to resume the thread.
thread_resume_from_rpc()
- Check if the state of the thread to be resumed (indicated by
thread_id
) isTHREAD_STATE_SUSPENDED
. - If yes, set thread’s state to
THREAD_STATE_ACTIVE
. - Set the current thread ID (
l->curr_thread
) tothread_id
. - Call thread_resume() to resume the thread.
- Otherwise, return and do nothing.
__thread_std_abi_entry()
- Call
std_abi_entry()
thread_handle_fast_abi()
tee_entry_fast()
__tee_entry_fast()
- If
args->a0
: OPTEE_ABI_CALLS_COUNT
:tee_entry_get_api_call_count()
OPTEE_ABI_CALLS_UID
:tee_entry_get_api_uuid()
- …
thread_enter_user_mode()
- Disable all interrupts.
- Call
xstatus_for_xret()
to getxstatus
withxstatus.PIE
set to1
,xstatus.PP
set toU-mode
. - The returned
xstatus
will be saved along with$a0
,$a1
,$a2
,$a3
,user_sp
,entry_func
, and$xie
to current thread’s reg context (struct thread_ctx_regs
). - Call
__thread_enter_user_mode()
to switch to U-mode.entry_func
is set tothread_ctx_regs.ra
and then set to$xepc
so that whenxret
is called to return to U-mode,entry_func
will be executed. - Re-enable original interrupts.
thread_state_suspend()
- Current thread's context (
struct thread_ctx
) will be updated with: flags |= THREAD_FLAGS_COPY_ARGS_ON_RETURN
regs.status = xstatus to return
regs.epc =
.thread_rpc_return
(defined withinthread_rpc_xstatus()
)- So when the thread is returned from RPC by
thread_resume_from_rpc()
,.thread_rpc_return
will be called. state = THREAD_STATE_SUSPENDED
- Current thread ID (
l->curr_thread
) is set toTHREAD_ID_INVALID
to indicate no active current thread.
thread_mask_exceptions()
- Mask the interrupts.
thread_unmask_exceptions()
- Unmask the interrupts.