zx_thread_write_state

摘要

撰寫執行緒狀態的一個方面。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_thread_write_state(zx_handle_t handle,
                                  uint32_t kind,
                                  const void* buffer,
                                  size_t buffer_size);

說明

zx_thread_write_state() 會寫入執行緒狀態的一個方面。只有在執行緒因例外狀況或暫停執行緒而暫停時,才能寫入執行緒狀態。

執行緒狀態專屬於高處理器。請參閱 zircon/syscalls/debug.h 中的結構,瞭解每個平台上的結構內容。

如要搭配 ZX_THREAD_STATE_DEBUG_REGS 標記使用 zx_thread_write_state() 函式,您必須在核心指令列中指定 kernel.enable-serial-syscalls=true。否則,函式會傳回 ZX_ERR_NOT_SUPPORTED

狀態

如需可用狀態清單及其對應值,請參閱 zx_thread_read_state()

ZX_THREAD_STATE_DEBUG_REGS

啟動

ARM 包含數量不一的偵錯中斷點和觀察點。就這個架構而言,zx_thread_state_debug_regs_t 夠大,可容納最多中斷點的數量上限。但在大多數情況下,指定的 CPU 實作項目數量較低,這表示系統不會使用超過上限的值。

核心會將所有可用登錄作業寫入硬體中,而不受指定的中斷點/觀察點計數值影響。這表示必須為呼叫設定所有正確的狀態。

您可以呼叫 zx_thread_read_state() 來取得註冊的目前狀態。

ARM 偵錯硬體偵錯註冊

您可以透過 DBGBCR 註冊檔設定高度設定 ARM 偵錯註冊機制。 不過,Zircon 會將功能限制為「取消連結的位址比對」中斷點。也就是說,HW 中斷點只會在對應的 DBGBVR 註冊表中的指定位址例外狀況時發出例外狀況。

因此,系統會忽略 DBGBCR 中的所有值,除了 Ebit 以外,用於判斷是否啟用該特定中斷點。換句話說,如要啟用 HW 中斷點,只需在 DBGBVR 中設定正確的位址,並將 1 寫入 DBGBCR 即可。

權限

handle 必須是 ZX_OBJ_TYPE_THREAD 類型,且具有 ZX_RIGHT_WRITE

傳回值

zx_thread_write_state() 會在成功時傳回 ZX_OK。如果失敗,系統會傳回負值錯誤值。

錯誤

ZX_ERR_BAD_HANDLE 帳號代碼不是有效的帳號代碼。

ZX_ERR_WRONG_TYPE「處理常式」不是執行緒的那一個。

ZX_ERR_ACCESS_DENIED 帳號代碼缺少 ZX_RIGHT_WRITE

ZX_ERR_INVALID_ARGS Kind 無效,buffer 為無效指標。buffer_sizeKind 預期的結構大小不符,或指定設定的值無效。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。

ZX_ERR_BAD_STATE 執行緒未於具有狀態的時間點停止。只有在執行緒因例外狀況而停止時,才能讀取執行緒狀態。

ZX_ERR_NOT_SUPPORTED 不支援 Kind 類型。例如,嘗試讀取執行程式的硬體不支援的註冊集,或者使用 ZX_THREAD_STATE_DEBUG_REGS 種類時沒有在核心指令列指定 kernel.enable-serial-syscalls=true 時,就可能會發生這種情況。

啟動

ZX_ERR_INVALID_ARGS如果提供給 DBGBVR 註冊資料庫的位址無效 (即無法從使用者空間解析),此外,如果為其他 HW 中斷點設定的值,則超出平台提供的數字 (請參閱上方說明,瞭解如何擷取該號碼)。

另請參閱