POWER9 上的 DAWR 問題¶
在較舊的 POWER9 處理器上,資料地址監視點暫存器 (DAWR) 如果指向快取禁止 (CI) 記憶體,可能會導致校驗停止。目前,Linux 在配置 DAWR 時無法區分 CI 記憶體,因此在受影響的系統上,DAWR 已被停用。
受影響的處理器修訂版本¶
此問題僅存在於 v2.3 之前的處理器上。 修訂版本可在 /proc/cpuinfo 中找到
processor : 0
cpu : POWER9, altivec supported
clock : 3800.000000MHz
revision : 2.3 (pvr 004e 1203)
在存在問題的系統上,DAWR 將按照以下詳細說明停用。
技術細節:¶
DAWR 有 6 種不同的設定方式。 1) ptrace 2) h_set_mode(DAWR) 3) h_set_dabr() 4) kvmppc_set_one_reg() 5) xmon
對於 ptrace,我們現在透過 PPC_PTRACE_GETHWDBGINFO 呼叫在 POWER9 上公佈零個斷點。 這導致 GDB 回退到軟體模擬監視點(速度較慢)。
h_set_mode(DAWR) 和 h_set_dabr() 現在將向 POWER9 主機上的訪客返回錯誤。 當前的 Linux 訪客會忽略此錯誤,因此它們不會以靜默方式獲取 DAWR。
kvmppc_set_one_reg() 會將值儲存在 vcpu 中,但實際上不會在 POWER9 硬體上設定它。 這樣做是為了避免破壞從 POWER8 到 POWER9 的遷移,但代價是在遷移時靜默丟失 DAWR。
對於 xmon,“bd”命令將在 P9 上返回錯誤。
對使用者的影響¶
對於 POWER9 裸機上的 GDB 監視點(即“watch”命令),GDB 將接受該命令。 遺憾的是,由於沒有硬體支援監視點,GDB 將軟體模擬監視點,使其執行速度非常慢。
對於在 POWER9 主機上啟動的任何訪客來說,情況也是如此。 監視點將失敗,GDB 將回退到軟體模擬。
如果訪客在 POWER8 主機上啟動,GDB 將接受監視點並配置硬體以使用 DAWR。 由於可以使用硬體模擬,這將以全速執行。 遺憾的是,如果此訪客遷移到 POWER9 主機,監視點將在 POWER9 上丟失。 對監視點位置的載入和儲存不會在 GDB 中被捕獲。 監視點會被記住,因此如果訪客遷移回 POWER8 主機,它將再次開始工作。
強制啟用 DAWR¶
核心(自 ~v5.2 以來)可以選擇透過以下方式強制啟用 DAWR
echo Y > /sys/kernel/debug/powerpc/dawr_enable_dangerous
即使在 POWER9 上,這也會啟用 DAWR。
這是一個危險的設定,使用風險自負。
某些使用者可能不在意錯誤的使用者導致他們的計算機崩潰(即單使用者/桌面系統),並且確實想要 DAWR。 這允許他們強制啟用 DAWR。
此標誌也可用於停用 DAWR 訪問。 一旦清除此標誌,所有 DAWR 訪問應立即清除,並且您的機器再次免受崩潰影響。
使用者空間可能會被切換此標誌弄糊塗。 如果在獲取斷點數量(透過 PTRACE_GETHWDBGINFO)和設定斷點之間強制啟用/停用 DAWR,使用者空間將獲得可用內容的不一致檢視。 訪客也是如此。
要在 KVM 訪客中啟用 DAWR,需要在主機和訪客中都強制啟用 DAWR。 因此,這在 POWERVM 上不起作用,因為它不允許 HCALL 工作。 如果虛擬機器管理程式不支援寫入 DAWR,則寫入“dawr_enable_dangerous”檔案“Y”將失敗。
要仔細檢查 DAWR 是否正常工作,請執行此核心自檢
tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c
任何錯誤/失敗/跳過都意味著出現問題。