摘要
在房客身上設定陷阱。
宣告
#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_BELL
、ZX_GUEST_TRAP_MEM
或
ZX_GUEST_TRAP_IO
。如果 ZX_GUEST_TRAP_BELL
或 ZX_GUEST_TRAP_MEM
為
因此,addr 和 size 都必須與頁面對齊。
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_MEM
、ZX_PKT_TYPE_GUEST_IO
、ZX_PKT_TYPE_GUEST_BELL
、
和 ZX_PKT_TYPE_GUEST_VCPU
。ZX_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
handle 或 port_handle 沒有
右ZX_RIGHT_WRITE
。
ZX_ERR_ALREADY_EXISTS
Kind 與
addr 和 size。
ZX_ERR_BAD_HANDLE
handle 或 port_handle 是無效的帳號代碼。
ZX_ERR_INVALID_ARGS
Kind 不是有效的位址空間,或
ZX_GUEST_TRAP_MEM
已透過 port_handle 指定。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。
使用者空間無法妥善處理這種 (異常) 錯誤。
在日後的版本中不會再發生這個錯誤。
ZX_ERR_OUT_OF_RANGE
addr 和 size 指定的區域不在
位址空間的有效邊界為 Kind。
ZX_ERR_WRONG_TYPE
handle 不是訪客的控制代碼,或 port_handle 為
而非通訊埠的控制代碼
附註
ZX_GUEST_TRAP_BELL
與 ZX_GUEST_TRAP_MEM
共用相同的位址空間。
在 x86-64 中,如果 Kind 為 ZX_GUEST_TRAP_BELL
或 ZX_GUEST_TRAP_MEM
和 addr
是本機 APIC 的位址,則 size 必須等於
網頁。這是因為系統會在
本機 APIC 的位址這讓我們能運用硬體
加速。
另請參閱
zx_guest_create()
zx_port_create()
zx_port_wait()
zx_vcpu_create()
zx_vcpu_enter()
zx_vcpu_interrupt()
zx_vcpu_kick()
zx_vcpu_read_state()
zx_vcpu_write_state()