zx_thread_set_rseq

摘要

為執行緒註冊可重新啟動的序列。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_thread_set_rseq(zx_handle_t vmo, uint64_t offset, uint64_t size);

說明

zx_thread_set_rseq() 會為目前執行緒註冊可重新啟動的序列。可重新啟動的序列是由 VMO 中的 zx_rseq_t 結構定義,從偏移開始,長度為大小。

Zircon 會將 zx_rseq_t 結構中的 cpu_id 欄位,更新為執行緒目前的 CPU ID。如果指令指標位於 start_ip 和 post_commit_offset 欄位定義的可重新啟動序列中,而執行緒遷移至其他 CPU,則執行緒會在 abort_ip 欄位指定的位址繼續執行。

使用者空間應使用 volatile 讀取和寫入來存取 zx_rseq_t 結構,因為核心可能隨時修改 cpu_id 欄位,且核心可能隨時讀取 start_ip、post_commit_offset 和 abort_ip 欄位。

一次最多只能註冊一個可重新啟動的序列。如果執行緒已註冊可重新啟動的序列,zx_thread_set_rseq() 會傳回 ZX_ERR_ALREADY_EXISTS。

offset 必須為 0 mod alignof(zx_rseq_t),且從 offset 開始的大小 sizeof(zx_rseq_t) 區域不得跨越頁面邊界。

如要取消註冊可重新啟動的序列,請呼叫 zx_thread_set_rseq(),並將 vmo 引數設為 ZX_HANDLE_INVALID。

傳回值

zx_thread_set_rseq() 成功時會傳回 ZX_OK。如果失敗,則會傳回負錯誤值。

錯誤

ZX_ERR_INVALID_ARGS offset 不是 alignof(zx_rseq_t) 的倍數、size 不是 sizeof(zx_rseq_t),或由 offset 和 size 定義的記憶體區域跨越頁面邊界。

ZX_ERR_INVALID_ARGS vmo 無法直接寫入、已標示為未快取,或由使用者分頁器支援。

ZX_ERR_ALREADY_EXISTS 執行緒已註冊可重新啟動的序列。

ZX_ERR_BAD_HANDLE vmo 不是有效的控制代碼,也不是 ZX_HANDLE_INVALID。

ZX_ERR_WRONG_TYPE vmo 不是 VMO。

ZX_ERR_ACCESS_DENIED vmo 缺少 ZX_RIGHT_READ、ZX_RIGHT_WRITE 或 ZX_RIGHT_DUPLICATE。