日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux和optee双系统中1020-1023号的中断号的使用

發(fā)布時(shí)間:2025/3/21 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux和optee双系统中1020-1023号的中断号的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈

文章目錄

        • 1、1020-1023號(hào)的中斷的介紹
        • 2、linux/optee雙系統(tǒng)irq/fiq的處理流程
        • 3、1020中斷號(hào)的的使用示例


1、1020-1023號(hào)的中斷的介紹

在gic的文檔中,理出了一些特殊的中斷號(hào),其中1020/1021和安全密切相關(guān)。

  • 1020 : for Trusted OS
  • 1021 : for rich OS

2、linux/optee雙系統(tǒng)irq/fiq的處理流程

環(huán)境:在linux/optee雙系統(tǒng)環(huán)境下, linux系統(tǒng)的SCR.IRQ=0、SCR.FIQ=1, optee系統(tǒng)的SCR.IRQ=0、SCR.FIQ=0

我們回歸下在gicv3架構(gòu)下,在linux/optee雙系統(tǒng)中IRQ FIQ中斷的處理過程:
(1)、當(dāng)cpu運(yùn)行在tee,來(lái)了一個(gè)tee中斷,該中斷被標(biāo)記為irq,tee處理這個(gè)中斷;
(2)、當(dāng)cpu運(yùn)行在tee,來(lái)了一個(gè)linux中斷,該中斷被標(biāo)記為fiq,tee調(diào)用smc切回到linux,在linux中該中斷被標(biāo)記為IRQ,linux中處理完該中斷后,再切回tee;
(3)、當(dāng)cpu運(yùn)行在linux,來(lái)了一個(gè)linux中斷,該中斷被標(biāo)記為irq,linux處理這個(gè)中斷;
(4)、當(dāng)cpu運(yùn)行在linux,來(lái)了一個(gè)tee中斷,該中斷被標(biāo)記為fiq,由于SCR.FIQ=1,該中斷被target到了EL3,進(jìn)入ATF的異步異常向量表,在ATF的fiq_aarch64函數(shù)中, cpu讀取icc_hppir0_el1寄存器(1020表示secure中斷,1021表示no-secure中斷),由于是tee中斷,所以讀到是數(shù)值是1020,然調(diào)用opteed_sel1_interrupt_handler切入到tee,在tee中該中斷又被標(biāo)記為IRQ,tee中處理這個(gè)中斷;

注意第4點(diǎn),就是本文所要關(guān)注的,第四點(diǎn)無(wú)非就是想進(jìn)行一個(gè)判斷,以下三選一:

  • 這個(gè)中斷是想給ATF處理的(如G0中斷)
  • 這個(gè)中斷是想給secure os處理的(如S-G1中斷),icc_hppir0_el1讀出的值應(yīng)該是1020
  • 這個(gè)中斷是想給rich os處理的(如NS-G1中斷),icc_hppir0_el1讀出的值應(yīng)該是1021

然后ATF就會(huì)根據(jù)icc_hppir0_el1的值,走3個(gè)不同的分支。

3、1020中斷號(hào)的的使用示例

以“當(dāng)cpu運(yùn)行在linux,來(lái)了一個(gè)tee中斷”做一個(gè)代碼解剖
(1)、在optee startup接受后,調(diào)用TEESMC_OPTEED_RETURN_ENTRY_DONE 回到ATF,再回到REE,我們看下在ATF干了什么事

case TEESMC_OPTEED_RETURN_ENTRY_DONE:/** Stash the OPTEE entry points information. This is done* only once on the primary cpu*/assert(optee_vectors == NULL);optee_vectors = (optee_vectors_t *) x1;if (optee_vectors) {set_optee_pstate(optee_ctx->state, OPTEE_PSTATE_ON);/** OPTEE has been successfully initialized.* Register power management hooks with PSCI*/psci_register_spd_pm_hook(&opteed_pm);/** Register an interrupt handler for S-EL1 interrupts* when generated during code executing in the* non-secure state.*/flags = 0;set_interrupt_rm_flag(flags, NON_SECURE);rc = register_interrupt_type_handler(INTR_TYPE_S_EL1,opteed_sel1_interrupt_handler,flags);if (rc)panic();}
  • 將optee傳來(lái)的線程向量表,保存在了ATF的全局變量中;
  • 注冊(cè)一個(gè)為optee服務(wù)的中斷:register_interrupt_type_handler(INTR_TYPE_S_EL1,opteed_sel1_interrupt_handler, flags),其中flag=0表示該中斷函數(shù)會(huì)切到TEE處理,flag=1表示切回linux中處理
#define INTR_TYPE_S_EL1 0 #define INTR_TYPE_EL3 1 #define INTR_TYPE_NS 2 #define MAX_INTR_TYPES 3 #define INTR_TYPE_INVAL MAX_INTR_TYPES

(2)、在runtime_exceptions.S中的異常向量表中:fiq_aarch64

fiq_aarch64:handle_interrupt_exception fiq_aarch64check_vector_size fiq_aarch64

代碼片段

.macro handle_interrupt_exception label ......bl plat_ic_get_pending_interrupt_typecmp x0, #INTR_TYPE_INVALb.eq interrupt_exit_\label //讀取icc_hppir0_el1,如果是1020返回INTR_TYPE_S_EL1,如果是1021則返回INTR_TYPE_NS,返回的type保存在了x0中 ......bl get_interrupt_type_handler //x0做為type參數(shù)傳入,調(diào)用在opteed_main.c中注冊(cè)的flag=0的中斷 ......

總結(jié)

以上是生活随笔為你收集整理的Linux和optee双系统中1020-1023号的中断号的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。