v1
2026-09-14
arm64 区分 HW/SW PTE 指针 · v1
arm64 启用 ARCH_HAS_HW_PTE_T,把硬件 PTE 指针改为 hw_pte_t *,与表示软件 PTE 值的 pte_t * 在类型上区分。
原始补丁链接
子 Patch(6)
1/6
arm64: use hw_pte_t for HW PTE pointers
arm64 把 HW PTE 指针由 pte_t * 改为 hw_pte_t *,SW PTE 值仍用 pte_t;PMD/PUD 共用函数暂加显式转换,pi.h 包含 pgtable_types.h 使 hw_pte_t 可见。
2/6
arm64: use hw_pte_val for HW PTE atomics
新增 hw_pte_val(),ARCH_HAS_HW_PTE_T 下对 wrapper 的 __pte 取 pte_val,否则直接 pte_val,使原子 PTE 更新能取得 HW PTE 位域左值地址;原子操作与内存序不变。
3/6
arm64: convert between HW PTEs and SW PTE values
适配 __ptep_get()/__set_pte_nosync():READ_ONCE() 后用 __pte_from_hw 得 SW PTE 值,WRITE_ONCE() 前用 __hw_pte 转 HW PTE,并让 wrapper/alias 两种配置都定义 __hw_pte。
4/6
arm64: use hw_pte_t for fixmap HW PTEs
将 fixmap 的 bm_pte[] 元素类型改为 hw_pte_t,使其与 fixmap_pte() 返回及 early_fixmap_init_pte() 传递的 HW PTE 指针一致,避免后续 HW/SW PTE 类型区分后不匹配;数组尺寸和布局不变。
5/6
arm64: use HW PTE accessors in early map_range()
early map_range() 构建各级页表时,改用 __ptep_get() 读取空项和子表地址,__set_pte_nosync() 写回 HW PTE,避免直接解引用 *tbl 混用 HW/SW PTE;写入仅 WRITE_ONCE,不引入 __set_pte 屏障。
6/6
arm64: enable a distinct type for HW PTEs
前置转换完成后,arm64 选择 ARCH_HAS_HW_PTE_T,改用通用 hw_pte_t wrapper 而非 pte_t 别名,使硬件 PTE 与软件 PTE 值成为不同 C 类型,获得编译期类型检查。