zx_guest_set_trap

摘要

在房客身上設定陷阱。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_guest_set_trap(zx_handle_t handle,
                              uint32_t kind,
                              zx_vaddr_t addr,
                              size_t size,
                              zx_handle_t port_handle,
                              uint64_t key);

說明

zx_guest_set_trap() 會在客體中設定陷阱,在何時產生封包 在 addr 定義的位址範圍內,CPU 會獲得存取權 size 會在 Kind 定義的位址空間內。

「Kind」可以是 ZX_GUEST_TRAP_BELLZX_GUEST_TRAP_MEMZX_GUEST_TRAP_IO。如果 ZX_GUEST_TRAP_BELLZX_GUEST_TRAP_MEM 為 因此,addrsize 都必須與頁面對齊。 ZX_GUEST_TRAP_BELL 是非同步追蹤,且 ZX_GUEST_TRAP_MEM 兩者 和 ZX_GUEST_TRAP_IO 是同步陷阱。

同步陷阱的封包會透過 zx_vcpu_enter() 傳送, 非同步陷阱的封包會透過 port_handle 傳送。

如為同步陷阱,port_handle 必須為 ZX_HANDLE_INVALID。適用對象 非同步陷阱 port_handle 必須有效,且陷阱的封包將 每次觸發陷阱時透過 port_handle 傳送。固定數字 的封包數會預先分配到每個陷阱如果所有封包都已耗盡 讓造成陷阱的 vCPU 執行暫停。至少一個 封包已排入佇列,將繼續執行 VCPU。如何將封包從佇列中移除 port_handle,使用 zx_port_wait()。多個執行緒可能會 zx_port_wait() 用來將封包移出佇列,以便使用執行緒集區 處理陷阱

key 的用途為設定 zx_port_packet_t 中的鍵欄位,並可用來 區分不同陷阱的封包。

ZX_GUEST_TRAP_BELL 是定義門鈴的陷阱。如果有 存取心率指定的記憶體區域,然後產生封包 不會擷取與存取權相關的指示。封包會 然後透過 port_handle 以非同步方式傳送。

如要找出產生封包的種類,請使用 ZX_PKT_TYPE_GUEST_MEMZX_PKT_TYPE_GUEST_IOZX_PKT_TYPE_GUEST_BELL、 和 ZX_PKT_TYPE_GUEST_VCPUZX_PKT_TYPE_GUEST_VCPU 是特殊封包 並非由陷阱引起,因此表示房客要 額外的 vCPU 數量

權限

handle 必須是 ZX_OBJ_TYPE_GUEST 類型,且包含 ZX_RIGHT_WRITE

port_handle 必須是 ZX_OBJ_TYPE_PORT 類型,且包含 ZX_RIGHT_WRITE

傳回值

zx_guest_set_trap() 會在成功時傳回 ZX_OK。失敗時,錯誤值為 。

錯誤

ZX_ERR_ACCESS_DENIED handleport_handle 沒有 右ZX_RIGHT_WRITE

ZX_ERR_ALREADY_EXISTS Kindaddrsize

ZX_ERR_BAD_HANDLE handleport_handle 是無效的帳號代碼。

ZX_ERR_INVALID_ARGS Kind 不是有效的位址空間,或 ZX_GUEST_TRAP_MEM 已透過 port_handle 指定。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。 使用者空間無法妥善處理這種 (異常) 錯誤。 在日後的版本中不會再發生這個錯誤。

ZX_ERR_OUT_OF_RANGE addrsize 指定的區域不在 位址空間的有效邊界為 Kind

ZX_ERR_WRONG_TYPE handle 不是訪客的控制代碼,或 port_handle 為 而非通訊埠的控制代碼

附註

ZX_GUEST_TRAP_BELLZX_GUEST_TRAP_MEM 共用相同的位址空間。

在 x86-64 中,如果 KindZX_GUEST_TRAP_BELLZX_GUEST_TRAP_MEMaddr 是本機 APIC 的位址,則 size 必須等於 網頁。這是因為系統會在 本機 APIC 的位址這讓我們能運用硬體 加速。

另請參閱