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
_start()
- Run a lottery to decide the primary hart.
- Use
amoadd.w
to decide which core is the primary hart. - For primary hart:
- For secondary hart:
reset_primary()
- Zero .bss section.
set_tp()
- Set
$tp
tothread_core_local[hartid]
. - Save current hart ID to
thread_core_local[hartid].hart_id
. thread_init_thread_core_local()
- Set
thread_core_local.curr_thread
toTHREAD_ID_INVALID
for all cores (CFG_TEE_CORE_NB_CORE
). - Set
thread_core_local.flag
toTHREAD_CLF_TMP
to indicate that it’s using the temporary stack for all cores (CFG_TEE_CORE_NB_CORE
). - Set first core’s
thread_core_local[0].tmp_stack_va_end
tostack_tmp[0]
. plat_primary_init_early()
- Do nothing right now.
console_init()
- In Andes’ demo, semihosting is used to print out the console.
core_init_mmu_map()
set_satp()
- Set
$satp
tocore_mmu_config.satp[hartid]
. core_mmu_config.satp[]
is configured incore_init_mmu_map()
.boot_init_primary_early()
boot_init_primary_late()
- Sync boot core and secondary cores.
thread_clr_boot_thread()
- Set current thread (
l->curr_thread
)’s state toTHREAD_STATE_FREE
. - Set
l->curr_thread
toTHREAD_ID_INVALID
. - thread_return_to_udomain()
- Before calling:
$a0
is set toTEEABI_OPTEED_RETURN_ENTRY_DONE
.$a1
is set tothread_vector_table
.$a3
~$a5
are set to 0.- This will eventually set
entry_vector_table
in OpenSBI.
reset_secondary()
- Wait for primary hart:
set_tp()
- Set
$tp
tothread_core_local[hartid]
. - Save current hart ID to
thread_core_local[hartid].hart_id
. set_satp()
- Set
$satp
tocore_mmu_config.satp[hartid]
. core_mmu_config.satp[]
is configured incore_init_mmu_map()
.- Set
sem_cpu_sync[hartid]
to1
to indicate that current hart is ready. boot_init_secondary()
boot_init_primary_early()
init_primary()
thread_init_core_local_stacks()
- Set
thread_core_local.tmp_stack_va_end
to the per-corestack_tmp
for all cores (CFG_TEE_CORE_NB_CORE
). - Temporary stack (
stack_tmp
) is used in the non-thread context, e.g. interrupt_from_kernel()
interrupt_from_user()
thread_std_abi_entry()
thread_rpc_xstatus()
- Set
thread_core_local.abt_stack_va_end
to the per-corestack_abt
for all cores (CFG_TEE_CORE_NB_CORE
). - Abort stack (
stack_abt
) is used in the non-thread context for exception (except for ecall), e.g. exception_from_kernel()
exception_from_user()
- Call
thread_set_exceptions()
withTHREAD_EXCP_ALL
to mask both native and foreign interrupts. init_runtime()
- Add heap section to the malloc pool.
thread_init_boot_thread()
thread_init_threads()
init_thread_stacks()
- Call
thread_init_stack()
to setthread_ctx.stack_va_end
to the per-thread stack (#ifndef CFG_WITH_PAGER
:stack_thread
;#else
: dynamically allocated stack) for all threads (CFG_NUM_THREADS
). - P.S.
$sp
will be set tothreads[0].stack_va_end
afterboot_init_primary_early()
is returned, before jumping toboot_init_primary_late()
. pgt_init()
- Set
l->curr_thread
to Thread 0. - Set Thread 0’s state to
Active
. thread_init_primary()
thread_init_canaries()
init_user_kcode()
- Do nothing in RISC-V.
thread_init_per_cpu()
- Set
mtvec
/stvec
tothread_trap_vect()
. - Set
mscratch
/sscratch
to0
to indicate that the following traps are from kernel. init_sec_mon()
- Do nothing as RISC-V doesn't have a secure monitor.
- Secure monitor is OpenSBI.
boot_init_primary_late()
init_external_dt()
- Initialize the external DTB located at the given address:
- Add MMU mapping of the external DTB.
- Initialize device tree overlay.
discover_nsec_memory()
- Call
get_nsec_memory()
to find all non-secure memories from DT. - Lookup for the DT nodes with
device_type = “memory”
. - Call
core_mmu_set_discovered_nsec_ddr()
to set: discovered_nsec_ddr_start
to the first non-secure memory.- Non-secure memories are sorted by the physical address in ascending order.
discovered_nsec_ddr_nelems
to the number of the non-secure memories.update_external_dt()
- Call
add_optee_dt_node()
to add/firmware/optee
DT node. compatible = "linaro,optee-tz";
- Call
mark_tddram_as_reserved()
to add/reserved-memory/optee_core
DT node. - Reserve the secure memory regions in DRAM used by OP-TEE (
CFG_TDDRAM_START
~(CFG_TDDRAM_START + CFG_TDDRAM_SIZE - 1)
) to prevent Linux from using it. - If
CFG_WITH_PAGER
is set andCFG_TDSRAM_START
is defined, TEE core secure RAM (TEE_RAM) is allocated in SRAM, instead of DRAM. We don’t need to reserve the memory region for it. - However, we still need to reserve other secure memory regions in DRAM (TA_RAM) used by OP-TEE.
#ifdef CFG_RISCV_S_MODE
mpxy_opteed_channel_init()
- Check if MPXY extension is supported by OpenSBI.
- Extract MPXY channel ID from DT:
compatible = “riscv,sbi-mpxy-opteed";
riscv,sbi-mpxy-channel-id
← Defines MPXY channel ID.- Save MPXY channel ID to
mpxy_opteed_ctx.channel_id
. opensbi-domain-instance
← Defines the OpenSBI domain used by OP-TEE (not used by OP-TEE).sbi_mpxy_setup_shmem()
- Allocates 4KB MPXY shared memory (4KB aligned).
- Call
sbi_mpxy_set_shmem
SBI call to set up the allocated MPXY shared memory for the current core. This will invoke OpenSBI’ssbi_mpxy_set_shmem()
to save the shared memory address and size into current harttdomain
’smpxy_state
. boot_primary_init_intc()
plic_init()
- Initialize interrupt controller, e.g. PLIC.
init_tee_runtime()
core_mmu_init_ta_ram()
- Initialize the memory region for static TAs.
MEM_AREA_TA_RAM
: Secure RAM where teecore loads/exec TA instances.call_preinitcalls()
- Call the preinitcalls defined in
.scattered_array_preinitcall
section. - e.g.
mobj_mapped_shm_init()
- … etc
call_initcalls()
- Call the initcalls defined in
.scattered_array_initcall
section. - e.g.
probe_dt_drivers_early()
check_ta_store()
early_ta_init()
verify_pseudo_tas_conformance()
tee_cryp_init()
- … etc
call_finalcalls()
- Call the finalcalls defined in
scattered_array_call_finalcall
section. - e.g.
release_external_dt()
- … etc
#ifdef CFG_RISCV_S_MODE
start_secondary_cores()
- Call
sbi_hsm_hart_start()
to start the secondary cores. - Start address =
start_addr
=_start
boot_init_secondary()
init_secondary_helper()
thread_init_per_cpu()
- Set
mtvec
/stvec
tothread_trap_vect()
. - Set
mscratch
/sscratch
to0
to indicate that the following traps are from kernel. init_sec_mon()
- Do nothing as RISC-V doesn't have a secure monitor.
- Secure monitor is OpenSBI.
boot_secondary_init_intc()
plic_hart_init()
- Do nothing.
sbi_mpxy_setup_shmem()
- Allocates 4KB MPXY shared memory (4KB aligned).
- Call
sbi_mpxy_set_shmem
SBI call to set up the allocated MPXY shared memory for the current core. This will invoke OpenSBI’ssbi_mpxy_set_shmem()
to save the shared memory address and size into current harttdomain
’smpxy_state
.
- How to sync boot core and secondary cores during boot up (
#ifdef CFG_BOOT_SYNC_CPU
):