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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

optee中的panic函数实现

發布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 optee中的panic函数实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

optee3.14中的panic、TEE_Panic、panic、panic實現

★★★ 個人博客導讀首頁—點擊此處 ★★★
.
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構,optee3.14版本

文章目錄

        • 1、optee os中的panic函數
        • 2、TA中的panic函數
        • 3、ldelf中的panic

1、optee os中的panic函數

在optee os有兩種方式調用panic,帶參數的和不帶參數的,示例如下:

  • panic();
  • panic(“Written PRIBLOB and read PRIBLOB do not match!”);

對應的這兩種中調用,到底層實現

  • 無參數的調用: __panic((void *)0)
  • 有參數的調用: __panic(s)
(optee_os/core/include/kernel/panic.h)/* panic() can get a string or no argument */ #define _panic0() __panic((void *)0) #define _panic1(s) __panic(s) #define _panic_fn(a, b, name, ...) name #define panic(...) _panic_fn("", ##__VA_ARGS__, _panic1, _panic0)(__VA_ARGS__)/* debug disabled => __FILE__, ... and panic message are not built. */ #if defined(CFG_TEE_CORE_DEBUG) #define __panic(str) __do_panic(__FILE__, __LINE__, __func__, str) #else #define __panic(str) __do_panic((void *)0, 0, (void *)0, str) #endif

__panic又調用了__do_panic,然后我們再看__do_panic在底層的實現

  • 打印log,無參數的打印"panic",有參數的打印您的參數
  • print_kernel_stack()
  • while(1)死循環. 所以這也就是為什么,一旦optee os特權默認發生了panic就再也恢復不了了。死循環了還怎么恢復。
(optee_os/core/kernel/panic.c)void __do_panic(const char *file __maybe_unused,const int line __maybe_unused,const char *func __maybe_unused,const char *msg __maybe_unused) {/* disable prehemption */(void)thread_mask_exceptions(THREAD_EXCP_ALL);/* TODO: notify other cores *//* trace: Panic ['panic-string-message' ]at FILE:LINE [<FUNCTION>]" */if (!file && !func && !msg)EMSG_RAW("Panic");elseEMSG_RAW("Panic %s%s%sat %s:%d %s%s%s",msg ? "'" : "", msg ? msg : "", msg ? "' " : "",file ? file : "?", file ? line : 0,func ? "<" : "", func ? func : "", func ? ">" : "");print_kernel_stack();/* abort current execution */while (1); }

2、TA中的panic函數

對于TA,panic的用法也是有兩種:

  • TEE_Panic(0)
  • TEE_Panic(非0)

TEE_Panic()是GP定義的一個接口,當然GP也對panic發生的條件做出了要求,這里我們就不細展開討論

(optee_os/lib/libutee/tee_api_panic.c)void TEE_Panic(TEE_Result panicCode) {_utee_panic(panicCode); #ifdef __COVERITY____coverity_panic__(); #endif } (optee_os/lib/libutee/arch/arm/utee_syscalls_a64.S)FUNC _utee_panic, :stp x29, x30, [sp, #-16]!mov x1, spbl __utee_panic/* Not reached */END_FUNC _utee_panic#include "utee_syscalls_asm.S" (optee_os/core/arch/arm/tee/arch_svc_a64.S)FUNC syscall_panic , :mov x1, #1 /* panic = true */mov x2, x0 /* code */ldr w0, =TEE_ERROR_TARGET_DEADldr x3, [x19, #SC_REC_X0] /* pointer to struct thread_svc_regs */b tee_svc_sys_return_helper END_FUNC syscall_panic (optee_os/core/arch/arm/tee/arch_svc.c)uint32_t tee_svc_sys_return_helper(uint32_t ret, bool panic,uint32_t panic_code,struct thread_svc_regs *regs) {if (panic) {TAMSG_RAW("");TAMSG_RAW("TA panicked with code 0x%" PRIx32, panic_code);save_panic_stack(regs);}#ifdef ARM32regs->r1 = panic;regs->r2 = panic_code; #endif #ifdef ARM64regs->x1 = panic;regs->x2 = panic_code; #endifreturn ret; }

3、ldelf中的panic

底層的實現,其實就是回收這個elf(或叫TA,或叫userspace),注意注釋/*NOTREACHED*/,說明這里不會走到while(true)

(optee_os/ldelf/sys.c)void __panic(const char *file __maybe_unused, const int line __maybe_unused,const char *func __maybe_unused) {if (!file && !func)EMSG_RAW("Panic");elseEMSG_RAW("Panic at %s:%d %s%s%s",file ? file : "?", file ? line : 0,func ? "<" : "", func ? func : "", func ? ">" : "");_ldelf_panic(1);/*NOTREACHED*/while (true); }

總結

以上是生活随笔為你收集整理的optee中的panic函数实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。