1、将pte_t等类型转换为unsigned long 的函数
pgd_val,pud_val,pmd_val,pte_val,pgprot_val
以下是ptd_val的代码:
点击(此处)折叠或打开
- static inline pteval_t pte_val(pte_t pte)
- {
- pteval_t ret;
- if (sizeof(pteval_t) > sizeof(long))
- ret = PVOP_CALLEE2(pteval_t, pv_mmu_ops.pte_val,
- pte.pte, (u64)pte.pte >> 32);
- else
- ret = PVOP_CALLEE1(pteval_t, pv_mmu_ops.pte_val,
- pte.pte);
- return ret;
- }
点击(此处)折叠或打开
- #define PVOP_CALLEE2(rettype, op, arg1, arg2) \
- __PVOP_CALLEESAVE(rettype, op, "", "", PVOP_CALL_ARG1(arg1), \
- PVOP_CALL_ARG2(arg2))
2、以上的逆转换,将unsigned long转为pgd_t,pud_t,pmd_t,pte_t,pgprot_t
这里也用到了那个神奇的调用
点击(此处)折叠或打开
- static inline pgd_t __pgd(pgdval_t val)
- {
- pgdval_t ret;
-
- if (sizeof(pgdval_t) > sizeof(long))
- ret = PVOP_CALLEE2(pgdval_t, pv_mmu_ops.make_pgd,
- val, (u64)val >> 32);
- else
- ret = PVOP_CALLEE1(pgdval_t, pv_mmu_ops.make_pgd,
- val);
- return (pgd_t) { ret };
- }