types.h

来自「xen虚拟机源代码安装包」· C头文件 代码 · 共 556 行 · 第 1/2 页

H
556
字号
#define GUEST_L1_PAGETABLE_SHIFT         12#define GUEST_L2_PAGETABLE_SHIFT         21#define GUEST_L3_PAGETABLE_SHIFT         30#define GUEST_L4_PAGETABLE_SHIFT         39#endif/* Types of the guest's page tables */typedef l1_pgentry_t guest_l1e_t;typedef l2_pgentry_t guest_l2e_t;typedef l3_pgentry_t guest_l3e_t;#if GUEST_PAGING_LEVELS >= 4typedef l4_pgentry_t guest_l4e_t;#endiftypedef intpte_t guest_intpte_t;/* Access functions for them */static inline paddr_t guest_l1e_get_paddr(guest_l1e_t gl1e){ return l1e_get_paddr(gl1e); }static inline paddr_t guest_l2e_get_paddr(guest_l2e_t gl2e){ return l2e_get_paddr(gl2e); }static inline paddr_t guest_l3e_get_paddr(guest_l3e_t gl3e){ return l3e_get_paddr(gl3e); }#if GUEST_PAGING_LEVELS >= 4static inline paddr_t guest_l4e_get_paddr(guest_l4e_t gl4e){ return l4e_get_paddr(gl4e); }#endifstatic inline gfn_t guest_l1e_get_gfn(guest_l1e_t gl1e){ return _gfn(l1e_get_paddr(gl1e) >> PAGE_SHIFT); }static inline gfn_t guest_l2e_get_gfn(guest_l2e_t gl2e){ return _gfn(l2e_get_paddr(gl2e) >> PAGE_SHIFT); }static inline gfn_t guest_l3e_get_gfn(guest_l3e_t gl3e){ return _gfn(l3e_get_paddr(gl3e) >> PAGE_SHIFT); }#if GUEST_PAGING_LEVELS >= 4static inline gfn_t guest_l4e_get_gfn(guest_l4e_t gl4e){ return _gfn(l4e_get_paddr(gl4e) >> PAGE_SHIFT); }#endifstatic inline u32 guest_l1e_get_flags(guest_l1e_t gl1e){ return l1e_get_flags(gl1e); }static inline u32 guest_l2e_get_flags(guest_l2e_t gl2e){ return l2e_get_flags(gl2e); }static inline u32 guest_l3e_get_flags(guest_l3e_t gl3e){ return l3e_get_flags(gl3e); }#if GUEST_PAGING_LEVELS >= 4static inline u32 guest_l4e_get_flags(guest_l4e_t gl4e){ return l4e_get_flags(gl4e); }#endifstatic inline guest_l1e_t guest_l1e_add_flags(guest_l1e_t gl1e, u32 flags){ l1e_add_flags(gl1e, flags); return gl1e; }static inline guest_l2e_t guest_l2e_add_flags(guest_l2e_t gl2e, u32 flags){ l2e_add_flags(gl2e, flags); return gl2e; }static inline guest_l3e_t guest_l3e_add_flags(guest_l3e_t gl3e, u32 flags){ l3e_add_flags(gl3e, flags); return gl3e; }#if GUEST_PAGING_LEVELS >= 4static inline guest_l4e_t guest_l4e_add_flags(guest_l4e_t gl4e, u32 flags){ l4e_add_flags(gl4e, flags); return gl4e; }#endifstatic inline guest_l1e_t guest_l1e_from_gfn(gfn_t gfn, u32 flags){ return l1e_from_pfn(gfn_x(gfn), flags); }static inline guest_l2e_t guest_l2e_from_gfn(gfn_t gfn, u32 flags){ return l2e_from_pfn(gfn_x(gfn), flags); }static inline guest_l3e_t guest_l3e_from_gfn(gfn_t gfn, u32 flags){ return l3e_from_pfn(gfn_x(gfn), flags); }#if GUEST_PAGING_LEVELS >= 4static inline guest_l4e_t guest_l4e_from_gfn(gfn_t gfn, u32 flags){ return l4e_from_pfn(gfn_x(gfn), flags); }#endif#define guest_l1_table_offset(a) l1_table_offset(a)#define guest_l2_table_offset(a) l2_table_offset(a)#define guest_l3_table_offset(a) l3_table_offset(a)#define guest_l4_table_offset(a) l4_table_offset(a)/* The shadow types needed for the various levels. */#if GUEST_PAGING_LEVELS == 3#define SH_type_l1_shadow  SH_type_l1_pae_shadow#define SH_type_fl1_shadow SH_type_fl1_pae_shadow#define SH_type_l2_shadow  SH_type_l2_pae_shadow#define SH_type_l2h_shadow SH_type_l2h_pae_shadow#else#define SH_type_l1_shadow  SH_type_l1_64_shadow#define SH_type_fl1_shadow SH_type_fl1_64_shadow#define SH_type_l2_shadow  SH_type_l2_64_shadow#define SH_type_l2h_shadow SH_type_l2h_64_shadow#define SH_type_l3_shadow  SH_type_l3_64_shadow#define SH_type_l4_shadow  SH_type_l4_64_shadow#endif#endif /* GUEST_PAGING_LEVELS != 2 *//* Type used for recording a walk through guest pagetables.  It is * filled in by the pagetable walk function, and also used as a cache * for later walks.  When we encounter a suporpage l2e, we fabricate an * l1e for propagation to the shadow (for splintering guest superpages * into many shadow l1 entries).  */typedef struct shadow_walk_t walk_t;struct shadow_walk_t {    unsigned long va;           /* Address we were looking for */#if GUEST_PAGING_LEVELS >= 3#if GUEST_PAGING_LEVELS >= 4    guest_l4e_t l4e;            /* Guest's level 4 entry */#endif    guest_l3e_t l3e;            /* Guest's level 3 entry */#endif    guest_l2e_t l2e;            /* Guest's level 2 entry */    guest_l1e_t l1e;            /* Guest's level 1 entry (or fabrication) */#if GUEST_PAGING_LEVELS >= 4    mfn_t l4mfn;                /* MFN that the level 4 entry was in */    mfn_t l3mfn;                /* MFN that the level 3 entry was in */#endif    mfn_t l2mfn;                /* MFN that the level 2 entry was in */    mfn_t l1mfn;                /* MFN that the level 1 entry was in */    int version;                /* Saved guest dirty version */};/* macros for dealing with the naming of the internal function names of the * shadow code's external entry points. */#define INTERNAL_NAME(name) SHADOW_INTERNAL_NAME(name, GUEST_PAGING_LEVELS)/* macros for renaming the primary entry points, so that they are more * easily distinguished from a debugger */#define sh_page_fault              INTERNAL_NAME(sh_page_fault)#define sh_invlpg                  INTERNAL_NAME(sh_invlpg)#define sh_gva_to_gfn              INTERNAL_NAME(sh_gva_to_gfn)#define sh_update_cr3              INTERNAL_NAME(sh_update_cr3)#define sh_rm_write_access_from_l1 INTERNAL_NAME(sh_rm_write_access_from_l1)#define sh_rm_mappings_from_l1     INTERNAL_NAME(sh_rm_mappings_from_l1)#define sh_remove_l1_shadow        INTERNAL_NAME(sh_remove_l1_shadow)#define sh_remove_l2_shadow        INTERNAL_NAME(sh_remove_l2_shadow)#define sh_remove_l3_shadow        INTERNAL_NAME(sh_remove_l3_shadow)#define sh_map_and_validate_gl4e   INTERNAL_NAME(sh_map_and_validate_gl4e)#define sh_map_and_validate_gl3e   INTERNAL_NAME(sh_map_and_validate_gl3e)#define sh_map_and_validate_gl2e   INTERNAL_NAME(sh_map_and_validate_gl2e)#define sh_map_and_validate_gl2he  INTERNAL_NAME(sh_map_and_validate_gl2he)#define sh_map_and_validate_gl1e   INTERNAL_NAME(sh_map_and_validate_gl1e)#define sh_destroy_l4_shadow       INTERNAL_NAME(sh_destroy_l4_shadow)#define sh_destroy_l3_shadow       INTERNAL_NAME(sh_destroy_l3_shadow)#define sh_destroy_l2_shadow       INTERNAL_NAME(sh_destroy_l2_shadow)#define sh_destroy_l1_shadow       INTERNAL_NAME(sh_destroy_l1_shadow)#define sh_unhook_32b_mappings     INTERNAL_NAME(sh_unhook_32b_mappings)#define sh_unhook_pae_mappings     INTERNAL_NAME(sh_unhook_pae_mappings)#define sh_unhook_64b_mappings     INTERNAL_NAME(sh_unhook_64b_mappings)#define sh_paging_mode             INTERNAL_NAME(sh_paging_mode)#define sh_detach_old_tables       INTERNAL_NAME(sh_detach_old_tables)#define sh_x86_emulate_write       INTERNAL_NAME(sh_x86_emulate_write)#define sh_x86_emulate_cmpxchg     INTERNAL_NAME(sh_x86_emulate_cmpxchg)#define sh_x86_emulate_cmpxchg8b   INTERNAL_NAME(sh_x86_emulate_cmpxchg8b)#define sh_audit_l1_table          INTERNAL_NAME(sh_audit_l1_table)#define sh_audit_fl1_table         INTERNAL_NAME(sh_audit_fl1_table)#define sh_audit_l2_table          INTERNAL_NAME(sh_audit_l2_table)#define sh_audit_l3_table          INTERNAL_NAME(sh_audit_l3_table)#define sh_audit_l4_table          INTERNAL_NAME(sh_audit_l4_table)#define sh_guess_wrmap             INTERNAL_NAME(sh_guess_wrmap)#define sh_clear_shadow_entry      INTERNAL_NAME(sh_clear_shadow_entry)#if SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC#define sh_resync_l1               INTERNAL_NAME(sh_resync_l1)#define sh_safe_not_to_sync        INTERNAL_NAME(sh_safe_not_to_sync)#define sh_rm_write_access_from_sl1p INTERNAL_NAME(sh_rm_write_access_from_sl1p)#endif/* The sh_guest_(map|get)_* functions depends on Xen's paging levels */#define sh_guest_map_l1e \        SHADOW_INTERNAL_NAME(sh_guest_map_l1e, CONFIG_PAGING_LEVELS)#define sh_guest_get_eff_l1e \        SHADOW_INTERNAL_NAME(sh_guest_get_eff_l1e, CONFIG_PAGING_LEVELS)/* sh_make_monitor_table depends only on the number of shadow levels */#define sh_make_monitor_table \        SHADOW_INTERNAL_NAME(sh_make_monitor_table, SHADOW_PAGING_LEVELS)#define sh_destroy_monitor_table \        SHADOW_INTERNAL_NAME(sh_destroy_monitor_table, SHADOW_PAGING_LEVELS)#if SHADOW_PAGING_LEVELS == 3#define MFN_FITS_IN_HVM_CR3(_MFN) !(mfn_x(_MFN) >> 20)#endif#define SH_PRI_pte PRIpte#if GUEST_PAGING_LEVELS == 2#define SH_PRI_gpte "08x"#else /* GUEST_PAGING_LEVELS >= 3 */#ifndef __x86_64__#define SH_PRI_gpte "016llx"#else#define SH_PRI_gpte "016lx"#endif#endif /* GUEST_PAGING_LEVELS >= 3 */#if (SHADOW_OPTIMIZATIONS & SHOPT_FAST_FAULT_PATH)/****************************************************************************** * We implement a "fast path" for two special cases: faults that require * MMIO emulation, and faults where the guest PTE is not present.  We * record these as shadow l1 entries that have reserved bits set in * them, so we can spot them immediately in the fault handler and handle * them without needing to hold the shadow lock or walk the guest * pagetables. * * This is only feasible for PAE and 64bit Xen: 32-bit non-PAE PTEs don't * have reserved bits that we can use for this. */#define SH_L1E_MAGIC 0xffffffff00000001ULLstatic inline int sh_l1e_is_magic(shadow_l1e_t sl1e){    return ((sl1e.l1 & SH_L1E_MAGIC) == SH_L1E_MAGIC);}/* Guest not present: a single magic value */static inline shadow_l1e_t sh_l1e_gnp(void) {    return (shadow_l1e_t){ -1ULL };}static inline int sh_l1e_is_gnp(shadow_l1e_t sl1e) {    return (sl1e.l1 == sh_l1e_gnp().l1);}/* MMIO: an invalid PTE that contains the GFN of the equivalent guest l1e. * We store 28 bits of GFN in bits 4:32 of the entry. * The present bit is set, and the U/S and R/W bits are taken from the guest. * Bit 3 is always 0, to differentiate from gnp above.  */#define SH_L1E_MMIO_MAGIC       0xffffffff00000001ULL#define SH_L1E_MMIO_MAGIC_MASK  0xffffffff00000009ULL#define SH_L1E_MMIO_GFN_MASK    0x00000000fffffff0ULL#define SH_L1E_MMIO_GFN_SHIFT   4static inline shadow_l1e_t sh_l1e_mmio(gfn_t gfn, u32 gflags) {    return (shadow_l1e_t) { (SH_L1E_MMIO_MAGIC                              | (gfn_x(gfn) << SH_L1E_MMIO_GFN_SHIFT)                              | (gflags & (_PAGE_USER|_PAGE_RW))) };}static inline int sh_l1e_is_mmio(shadow_l1e_t sl1e) {    return ((sl1e.l1 & SH_L1E_MMIO_MAGIC_MASK) == SH_L1E_MMIO_MAGIC);}static inline gfn_t sh_l1e_mmio_get_gfn(shadow_l1e_t sl1e) {    return _gfn((sl1e.l1 & SH_L1E_MMIO_GFN_MASK) >> SH_L1E_MMIO_GFN_SHIFT);}static inline u32 sh_l1e_mmio_get_flags(shadow_l1e_t sl1e) {    return (u32)((sl1e.l1 & (_PAGE_USER|_PAGE_RW)));}#else#define sh_l1e_gnp() shadow_l1e_empty()#define sh_l1e_mmio(_gfn, _flags) shadow_l1e_empty()#define sh_l1e_is_magic(_e) (0)#endif /* SHOPT_FAST_FAULT_PATH */#endif /* _XEN_SHADOW_TYPES_H *//* * Local variables: * mode: C * c-set-style: "BSD" * c-basic-offset: 4 * indent-tabs-mode: nil * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?