OpenSBI: OP-TEE
2024-10-12
| 2025-1-12
本文字數 403閱讀時長 2 分鐘
type
status
date
slug
summary
tags
category
icon
password
⚠️
The code is based on: https://gitlab.com/riseproject/riscv-optee/opensbi/-/tree/dev-optee-mpxy Commit ID: 7d4c90953afe3bd86f9e2501bd4c2501e8db1898
  • mpxy_opteed_init()
    • Match compatible string: "riscv,sbi-mpxy-opteed".
    • Allocate channel.
    • opteed_domain_setup()
      • Setup domain for OP-TEE dispatcher by looking up the domain specified by opensbi-domain-instance phandle in DTS.
      • Assign the domain name to opteed_domain_name.
    • Get channel ID from DTS property: riscv,sbi-mpxy-channel-id.
    • Initialize channel:
      • Register channel: sbi_mpxy_register_channel()
      • Assign tdomain (Trusted domain).
        • Look up the domain with the name specified in opteed_domain_name.
      • Assign udomain (Untrusted domain).
        • Look up the domain with the name "untrusted-domain".
    • mpxy_opteed_send_message()
      • If message ID is OPTEED_MSG_COMMUNICATE (0x1) (Called from udomain):
        • If tdomain’s shared memory is NOT valid, return SBI_EINVAL.
        • Otherwise:
          • Direction: udomain -> OpenSBI
          • Copy the source data from udomain to tdomain’s shared memory.
        • Call sbi_ecall_tee_domain_enter() to switch to tdomain.
          • Direction: udomain -> tdomain.
          • The entry point to be switched to is defined by the function type:
            • Function type is defined by the first unsigned long in udomain’s shared memory: ((ulong *)shmem_base)[0].
            • If function type is: ABI_ENTRY_TYPE_FAST (i.e. ARM_SMCCC_FAST_CALL)
            • Otherwise:
      • If message ID is OPTEED_MSG_COMPLETE (0x2) (Called from tdomain):
        • If udomain’s shared memory is NOT valid:
          • Direction: tdomain -> OpenSBI.
          • If ((ulong *)msgbuf)[0] (from tdomain’s shared memory, i.e. $a0) is TEEABI_OPTEED_RETURN_CALL_DONE (0xbe000000):
            • Register OP-TEE entry table:
              • Set entry_vector_table to ((ulong *)msgbuf)[1] (i.e. $a1), i.e. thread_vector_table defined in OP-TEE.
        • Otherwise, copy the source data from tdomain to udomain’s shared memory.
          • Direction: tdomain -> udomain.
          • Only $a1 ~ $a4 (from tdomain’s shared memory) are copied to udomain’s shared memory, $a0 is skipped.
        • Call sbi_ecall_tee_domain_exit() to exit from the current tdomain.
          • The domain to switch to:
            • Switch to the previous domain
            • Switch to the use-define next domain.
            • Fallback to the root domain.
      • P.S. Domain switching only involves domain contexts save and restore. The mode is switched by mret in the trap handler.

    • sbi_mpxy_register_channel()
      • Initialize channel’s attributes: mpxy_std_attrs_init()
        • Check whether MSI, SSE and Events State capabilities are available in the domain.
      • Add the allocated channel to mpxy_channel_list list.
    • sbi_mpxy_set_shmem()
      • Validate passed in shared memory address and size.
      • Set current hart’s sbi_domain shared memory address and size.

    • sbi_ecall_tee_domain_enter()
      • The domain is tdomain.
      • sbi_domain_context_set_mepc()
        • Set mepc to the entry point.
      • sbi_domain_context_enter()
        • Switch to tdomain.

    • Example DTS:
    • OpenSBI
    • OP-TEE
    • Linux Kernel: TEEOpenSBI: MPXY
      Loading...
      目錄