01_SMC_Calling_Convention(SMCCC)
引流關(guān)鍵詞: PSCI ,Power State Coordination Interface, TF-A,TF-M,ATF,TrustedFirmware,trustzone,TEE,optee,trusty,tlk,lk,armv8,armv9,arm,secureboot,BL31,BL32,BL1,BL2,hypervisor,終端安全,secureboot,security,virtulization
快速鏈接:
.
👉👉👉 個人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
說明:
官方文檔看著也沒啥意思,屬于規(guī)范性文檔,用到時去查詢即可。學(xué)習(xí)的話只看本篇就行了
目錄
- 1. 簡介
- 2 SMC and HVC calling的規(guī)定
- 2.1 Secure Monitor Calls
- 2.2 Hypervisor Calls
- 2.3 Fast Calls and Yielding Calls
- 2.4 32-bit and 64-bit的規(guī)定
- 2.5 Function Identifiers
- 2.5.1 Fast Calls
- 2.5.2 Yielding Calls
- 2.5.3 Conduits
- 2.6 SMC32/HVC32參數(shù)傳遞
- 2.7 SMC64/HVC64參數(shù)傳遞
- 2.8 SVE, SIMD and floating-point registers
- 2.9 SMC and HVC immediate value
- 2.10 Client ID (optional)
- 2.10.1 SMC calls
- 2.10.2 HVC calls
- 2.11 Secure OS ID (optional)
- 2.12 Session ID (optional)
- 3 AArch64 SMC and HVC calling conventions
1. 簡介
本文檔定義了在 Armv7 和 Armv8 架構(gòu)中與安全監(jiān)視器調(diào)用 (SMC) 和管理程序調(diào)用 (HVC) 指令一起使用的通用調(diào)用機(jī)制。
SMC 指令用于生成同步異常,該異常由運(yùn)行在 EL3 中的 Secure Monitor 代碼處理。參數(shù)和返回值在寄存器中傳遞。由安全監(jiān)視器處理后,由指令產(chǎn)生的調(diào)用可以傳遞到受信任的操作系統(tǒng)或安全軟件堆棧中的某個其他實(shí)體。
HVC 指令用于生成同步異常,該異常由運(yùn)行在 EL2 中的管理程序處理。參數(shù)和返回值在寄存器中傳遞。管理程序還可以捕獲由來賓操作系統(tǒng)(在 EL1 處)發(fā)出的 SMC 調(diào)用,從而允許根據(jù)需要模擬、傳遞或拒絕調(diào)用。
該規(guī)范旨在簡化軟件層之間的集成并減少碎片,例如操作系統(tǒng)、管理程序、可信操作系統(tǒng)、安全監(jiān)視器和系統(tǒng)固件。
2 SMC and HVC calling的規(guī)定
2.1 Secure Monitor Calls
在 Arm 架構(gòu)中,同步控制通過 Secure Monitor Call (SMC) 異常 [1.][2.] 在正常的 Non-secure 狀態(tài)和 Secure 狀態(tài)之間轉(zhuǎn)移。 SMC 異常由 SMC 指令 [1.][2.] 生成,并由安全監(jiān)視器處理。 Secure Monitor 的操作由通過寄存器傳入的參數(shù)決定。
2.2 Hypervisor Calls
由操作系統(tǒng)在 EL1 進(jìn)行的管理程序調(diào)用 (HVC) 導(dǎo)致控制同步轉(zhuǎn)移到 EL2 管理程序,并被視為 HVC 異常。 管理程序的操作由通過寄存器傳入的參數(shù)決定。
2.3 Fast Calls and Yielding Calls
定義了兩種類型的調(diào)用:
- Fast Calls 執(zhí)行原子操作。 從調(diào)用 PE 的角度來看,調(diào)用似乎是原子的,并在請求的操作完成時返回
- Yielding Calls 啟動可以被非安全中斷搶占的操作。 調(diào)用可以在請求的操作完成之前返回。 附錄 A:Yielding Service提供了一個Yielding call的示例。
2.4 32-bit and 64-bit的規(guī)定
對于 SMC 和 HVC,定義了兩個調(diào)用約定指令:
- SMC32/HVC32:32 位接口,可由 32 位或 64 位客戶端代碼使用,最多可傳遞七個 32 位參數(shù)。 因?yàn)橹挥?SMC32 和 HVC32 調(diào)用用于識別功能標(biāo)識符范圍,所以 32 位調(diào)用約定對于所有兼容系統(tǒng)都是強(qiáng)制性的,無論它們是 32 位還是 64 位系統(tǒng)。 有關(guān)更多信息,請參閱第 6.2 節(jié)。
- SMC64/HVC64:64 位接口,只能由 64 位客戶端代碼使用,最多可傳遞 17 個 64 位參數(shù)。 SMC64/HVC64 調(diào)用預(yù)期為 64 位等效于 32 位調(diào)用(如果適用)。
2.5 Function Identifiers
函數(shù)標(biāo)識符(Function Identifiers)在每次 SMC 和 HVC 調(diào)用的 W0 上傳遞。 它的 32 位整數(shù)值指示調(diào)用者正在請求哪個函數(shù)。 它始終作為第一個參數(shù)傳遞給 R0 或 W0 中的每個 SMC 或 HVC 調(diào)用。 位 W0[31] 確定調(diào)用是快速 (W0[31]==1) 還是屈服 (W0[31]==0)。
2.5.1 Fast Calls
在Fast Calls情況下 (W0[31]==1),位 W0[30:0] 確定:
- 要調(diào)用的服務(wù)
- 要調(diào)用的函數(shù)
- 正在使用的調(diào)用約定(32 位或 64 位)
32 位值中的幾個位定義了對 Fast Calls 有效的含義,如下圖 所示
2.5.2 Yielding Calls
在 Yielding Call 情況下 (W0[31]==0),可信操作系統(tǒng) Yielding Calls 被放置在 0x02000000-0x1FFFFFFF 范圍內(nèi)。
2.5.3 Conduits
除了標(biāo)準(zhǔn)管理程序調(diào)用和供應(yīng)商特定管理程序調(diào)用外,預(yù)計(jì)服務(wù)調(diào)用將通過 SMC 指令調(diào)用。 但是,在某些平臺上,SMC 指令不可用,可以通過 HVC 指令訪問服務(wù)。 用于調(diào)用服務(wù)的方法稱為管道。 表 2-2 描述了哪些管道可用,以及它們?nèi)绾我蕾囉?br /> 實(shí)施的。
但是,SMC 調(diào)用約定并未指定使用哪個指令(SMC 或 HVC)來調(diào)用特定服務(wù)。
2.6 SMC32/HVC32參數(shù)傳遞
當(dāng)使用 SMC32/HVC32 約定時,SMC 或 HVC 指令采用函數(shù)標(biāo)識符和最多七個 32 位寄存器值作為參數(shù),并返回狀態(tài)和最多七個 32 位寄存器值。
當(dāng)從 AArch32 發(fā)出 SMC32/HVC32 調(diào)用時:
- A Function Identifier is passed in register R0.
- Arguments are passed in registers R1-R7.
- Results are returned in R0-R7.
- The registers R4-R7 must be preserved unless they contain results, as specified in the function definition.
- Registers R8-R14 are saved by the function that is called, and must be preserved over the SMC or HVC call.
當(dāng)從 AArch64 發(fā)出 SMC32/HVC32 調(diào)用時:
- A Function Identifier is passed in register W0.
- Arguments are passed in registers W1-W7.
- Results are returned in W0-W7.
- Registers W4-W7 must be preserved unless they contain results, as specified in the function definition.
- Registers X8-X30 and stack pointers SP_EL0 and SP_ELx are saved by the function that is called, and must be preserved over the SMC or HVC call.
在 SMC 或 HVC 調(diào)用后,未使用的結(jié)果寄存器和暫存寄存器可能會泄漏信息。 實(shí)現(xiàn)可以通過在調(diào)用期間保留寄存器狀態(tài)或在每個寄存器中返回常量值(例如零)來降低這種風(fēng)險(xiǎn)。
來自 AArch32 和 AArch64 的 SMC32/HVC32 調(diào)用對參數(shù)和結(jié)果使用相同的物理寄存器,因?yàn)?AArch64 中的寄存器名稱 W0-W7 映射到 AArch32 中的寄存器名稱 R0-R7。
2.7 SMC64/HVC64參數(shù)傳遞
當(dāng)使用 SMC64/HVC64 約定時,SMC 或 HVC 指令采用函數(shù)標(biāo)識符,最多可達(dá)寄存器中的 17 個 64 位參數(shù),并在寄存器中返回狀態(tài)和最多 17 個 64 位值。當(dāng)從 AArch64 發(fā)出 SMC64/HVC64 調(diào)用時:
- 函數(shù)標(biāo)識符在寄存器 W0 中傳遞。
- 參數(shù)在寄存器 X1-X17 中傳遞。
- 結(jié)果在 X0-X17 中返回。
- 寄存器 X4-X17 必須保留,除非它們包含函數(shù)定義中指定的結(jié)果。
- 寄存器 X18-X30 和堆棧指針 SP_EL0 和 SP_ELx 由被調(diào)用的函數(shù)保存,并且必須通過 SMC 或 HVC 調(diào)用保留。
在 AArch32 狀態(tài)下執(zhí)行的代碼不能使用此調(diào)用約定。 任何來自 AArch32 狀態(tài)的 SMC64/HVC64 調(diào)用都會收到“Unknown Function Identifier”結(jié)果。
未使用做為結(jié)果寄存器的寄存器,在 SMC 或 HVC 返回后有泄露信息的風(fēng)險(xiǎn),未使用做為返回結(jié)果的這些寄存器,可以在SMC 或 HVC返回之前,給它們清0來規(guī)避這種風(fēng)險(xiǎn)。
2.8 SVE, SIMD and floating-point registers
SVE、SIMD 和浮點(diǎn)寄存器不得用于向任何 SMC/HVC 傳遞參數(shù)或接受參數(shù)。
SMCCC 實(shí)現(xiàn)必須確保所有 SVE、Advanced SIMD、floating-point registers的實(shí)時狀態(tài),在所有 SMC 和 HVC 調(diào)用中保留。要保留的實(shí)時狀態(tài)存在于以下寄存器中:
- Z0-Z31、P0-P15、FFR、FPSR 和 FPCR,如果實(shí)現(xiàn)了 SVE 且 FID[16] 為 0
- V0-V31、FPSR 和 FPCR,如果未實(shí)現(xiàn)SVE 或 FID[16] 為 1
2.9 SMC and HVC immediate value
SMC 和 HVC 指令編碼一個立即值(如 smc #0), 它必需是0。 非0的smc調(diào)用是reserved的,非0的hyc調(diào)用是給hypervisor vendor用的。以下為arm官方的描述:
- For all compliant calls, an SMC or HVC immediate value of zero must be used.
- Nonzero immediate values in SMC instructions are reserved.
- Nonzero immediate values in HVC instructions are designated for use by hypervisor vendors
2.10 Client ID (optional)
這是為 Secure 軟件提供了跟蹤和索引客戶端 ID 的規(guī)定
2.10.1 SMC calls
如果一個實(shí)現(xiàn)包括在 EL2 執(zhí)行的管理程序或類似的監(jiān)控軟件,它可能是需要識別發(fā)起 SMC 調(diào)用的客戶端操作系統(tǒng)。
- 一個 16 位客戶端 ID 參數(shù)可選地為 SMC定義。
- 在AArch32 中,客戶端ID 在R7 寄存器中傳遞。
- 在AArch64 中,客戶端ID 在W7 寄存器中傳遞。
- 客戶端 ID 0x0000 指定用于來自管理程序本身的 SMC 調(diào)用。
客戶端 ID 應(yīng)在虛擬機(jī)管理程序中創(chuàng)建并用于注冊、引用和取消注冊客戶端操作系統(tǒng)到可信操作系統(tǒng)。它不應(yīng)與 MMU 使用的 VMID 對應(yīng)。如果實(shí)現(xiàn)了客戶端 ID,則在 EL1 處執(zhí)行的軟件生成的所有 SMC 調(diào)用必須由管理程序。在轉(zhuǎn)發(fā)任何 SMC 之前,必須將標(biāo)識信息插入到 R7 或 W7 寄存器中調(diào)用安全監(jiān)視器。
如果未實(shí)施虛擬機(jī)管理程序,則不需要來賓操作系統(tǒng)設(shè)置客戶端 ID 值
2.10.2 HVC calls
HVC 調(diào)用約定會忽略客戶端 ID
2.11 Secure OS ID (optional)
在 S-EL1 存在多個安全操作系統(tǒng)的情況下,調(diào)用者必須指定其安全操作系統(tǒng),其目的在于;
- 可以為SMC 調(diào)用定義一個可選的16 位安全操作系統(tǒng)ID 參數(shù)。
- 在AArch32 中,安全操作系統(tǒng)ID 在R7 寄存器中傳遞。
- 在AArch64 狀態(tài)下,安全操作系統(tǒng)ID 在W7 寄存器中傳遞。
2.12 Session ID (optional)
要在受信任的操作系統(tǒng)或管理程序中支持多個會話,可能需要識別多個相同 SMC 或 HVC 調(diào)用的實(shí)例:
- 可以為SMC 和HVC 呼叫定義一個可選的32 位會話ID。
- 在AArch32 中,會話ID 在R6 寄存器中傳遞
- 在AArch64 中,會話ID 在W6 寄存器中傳遞
會話 ID 預(yù)計(jì)由受信任的操作系統(tǒng)或管理程序提供,并由其客戶端使用后續(xù)調(diào)用
3 AArch64 SMC and HVC calling conventions
本規(guī)范定義了用于 SMC 和 HVC 指令的通用調(diào)用機(jī)制。這些調(diào)用機(jī)制被稱為 SMC32/HVC32 和 SMC64/HVC64。對于 Arm AArch64:
- 所有可信任的操作系統(tǒng)和安全監(jiān)視器的實(shí)現(xiàn)都必須符合此規(guī)范。
- 所有hypervisor程序必須符合安全和管理程序服務(wù)的調(diào)用規(guī)范。
總結(jié)
以上是生活随笔為你收集整理的01_SMC_Calling_Convention(SMCCC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16-Understanding the
- 下一篇: Introduction to the