types.h
来自「xen虚拟机源代码安装包」· C头文件 代码 · 共 556 行 · 第 1/2 页
H
556 行
/****************************************************************************** * arch/x86/mm/shadow/types.h * * Parts of this code are Copyright (c) 2006 by XenSource Inc. * Parts of this code are Copyright (c) 2006 by Michael A Fetterman * Parts based on earlier work by Michael A Fetterman, Ian Pratt et al. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifndef _XEN_SHADOW_TYPES_H#define _XEN_SHADOW_TYPES_H/* The number of levels in the shadow pagetable is entirely determined * by the number of levels in the guest pagetable */#if GUEST_PAGING_LEVELS == 4#define SHADOW_PAGING_LEVELS 4#else#define SHADOW_PAGING_LEVELS 3#endif/* * Define various types for handling pagetabels, based on these options: * SHADOW_PAGING_LEVELS : Number of levels of shadow pagetables * GUEST_PAGING_LEVELS : Number of levels of guest pagetables */#if SHADOW_PAGING_LEVELS == 3#define SHADOW_L1_PAGETABLE_ENTRIES 512#define SHADOW_L2_PAGETABLE_ENTRIES 512#define SHADOW_L3_PAGETABLE_ENTRIES 4#define SHADOW_L1_PAGETABLE_SHIFT 12#define SHADOW_L2_PAGETABLE_SHIFT 21#define SHADOW_L3_PAGETABLE_SHIFT 30#else /* SHADOW_PAGING_LEVELS == 4 */#define SHADOW_L1_PAGETABLE_ENTRIES 512#define SHADOW_L2_PAGETABLE_ENTRIES 512#define SHADOW_L3_PAGETABLE_ENTRIES 512#define SHADOW_L4_PAGETABLE_ENTRIES 512#define SHADOW_L1_PAGETABLE_SHIFT 12#define SHADOW_L2_PAGETABLE_SHIFT 21#define SHADOW_L3_PAGETABLE_SHIFT 30#define SHADOW_L4_PAGETABLE_SHIFT 39#endif/* Types of the shadow page tables */typedef l1_pgentry_t shadow_l1e_t;typedef l2_pgentry_t shadow_l2e_t;typedef l3_pgentry_t shadow_l3e_t;#if SHADOW_PAGING_LEVELS >= 4typedef l4_pgentry_t shadow_l4e_t;#endif/* Access functions for them */static inline paddr_t shadow_l1e_get_paddr(shadow_l1e_t sl1e){ return l1e_get_paddr(sl1e); }static inline paddr_t shadow_l2e_get_paddr(shadow_l2e_t sl2e){ return l2e_get_paddr(sl2e); }static inline paddr_t shadow_l3e_get_paddr(shadow_l3e_t sl3e){ return l3e_get_paddr(sl3e); }#if SHADOW_PAGING_LEVELS >= 4static inline paddr_t shadow_l4e_get_paddr(shadow_l4e_t sl4e){ return l4e_get_paddr(sl4e); }#endifstatic inline mfn_t shadow_l1e_get_mfn(shadow_l1e_t sl1e){ return _mfn(l1e_get_pfn(sl1e)); }static inline mfn_t shadow_l2e_get_mfn(shadow_l2e_t sl2e){ return _mfn(l2e_get_pfn(sl2e)); }static inline mfn_t shadow_l3e_get_mfn(shadow_l3e_t sl3e){ return _mfn(l3e_get_pfn(sl3e)); }#if SHADOW_PAGING_LEVELS >= 4static inline mfn_t shadow_l4e_get_mfn(shadow_l4e_t sl4e){ return _mfn(l4e_get_pfn(sl4e)); }#endifstatic inline u32 shadow_l1e_get_flags(shadow_l1e_t sl1e){ return l1e_get_flags(sl1e); }static inline u32 shadow_l2e_get_flags(shadow_l2e_t sl2e){ return l2e_get_flags(sl2e); }static inline u32 shadow_l3e_get_flags(shadow_l3e_t sl3e){ return l3e_get_flags(sl3e); }#if SHADOW_PAGING_LEVELS >= 4static inline u32 shadow_l4e_get_flags(shadow_l4e_t sl4e){ return l4e_get_flags(sl4e); }#endifstatic inline shadow_l1e_tshadow_l1e_remove_flags(shadow_l1e_t sl1e, u32 flags){ l1e_remove_flags(sl1e, flags); return sl1e; }static inline shadow_l1e_t shadow_l1e_empty(void) { return l1e_empty(); }static inline shadow_l2e_t shadow_l2e_empty(void) { return l2e_empty(); }static inline shadow_l3e_t shadow_l3e_empty(void) { return l3e_empty(); }#if SHADOW_PAGING_LEVELS >= 4static inline shadow_l4e_t shadow_l4e_empty(void) { return l4e_empty(); }#endifstatic inline shadow_l1e_t shadow_l1e_from_mfn(mfn_t mfn, u32 flags){ return l1e_from_pfn(mfn_x(mfn), flags); }static inline shadow_l2e_t shadow_l2e_from_mfn(mfn_t mfn, u32 flags){ return l2e_from_pfn(mfn_x(mfn), flags); }static inline shadow_l3e_t shadow_l3e_from_mfn(mfn_t mfn, u32 flags){ return l3e_from_pfn(mfn_x(mfn), flags); }#if SHADOW_PAGING_LEVELS >= 4static inline shadow_l4e_t shadow_l4e_from_mfn(mfn_t mfn, u32 flags){ return l4e_from_pfn(mfn_x(mfn), flags); }#endif#define shadow_l1_table_offset(a) l1_table_offset(a)#define shadow_l2_table_offset(a) l2_table_offset(a)#define shadow_l3_table_offset(a) l3_table_offset(a)#define shadow_l4_table_offset(a) l4_table_offset(a)/**************************************************************************//* Access to the linear mapping of shadow page tables. *//* Offsets into each level of the linear mapping for a virtual address. */#define shadow_l1_linear_offset(_a) \ (((_a) & VADDR_MASK) >> SHADOW_L1_PAGETABLE_SHIFT)#define shadow_l2_linear_offset(_a) \ (((_a) & VADDR_MASK) >> SHADOW_L2_PAGETABLE_SHIFT)#define shadow_l3_linear_offset(_a) \ (((_a) & VADDR_MASK) >> SHADOW_L3_PAGETABLE_SHIFT)#define shadow_l4_linear_offset(_a) \ (((_a) & VADDR_MASK) >> SHADOW_L4_PAGETABLE_SHIFT)/* Where to find each level of the linear mapping. For PV guests, we use * the shadow linear-map self-entry as many times as we need. For HVM * guests, the shadow doesn't have a linear-map self-entry so we must use * the monitor-table's linear-map entry N-1 times and then the shadow-map * entry once. */#define __sh_linear_l1_table ((shadow_l1e_t *)(SH_LINEAR_PT_VIRT_START))#define __sh_linear_l2_table ((shadow_l2e_t *) \ (__sh_linear_l1_table + shadow_l1_linear_offset(SH_LINEAR_PT_VIRT_START)))// shadow linear L3 and L4 tables only exist in 4 level paging...#if SHADOW_PAGING_LEVELS == 4#define __sh_linear_l3_table ((shadow_l3e_t *) \ (__sh_linear_l2_table + shadow_l2_linear_offset(SH_LINEAR_PT_VIRT_START)))#define __sh_linear_l4_table ((shadow_l4e_t *) \ (__sh_linear_l3_table + shadow_l3_linear_offset(SH_LINEAR_PT_VIRT_START)))#endif#define sh_linear_l1_table(v) ({ \ ASSERT(current == (v)); \ __sh_linear_l1_table; \})// XXX -- these should not be conditional on is_hvm_vcpu(v), but rather on// shadow_mode_external(d)...//#define sh_linear_l2_table(v) ({ \ ASSERT(current == (v)); \ ((shadow_l2e_t *) \ (is_hvm_vcpu(v) ? __linear_l1_table : __sh_linear_l1_table) + \ shadow_l1_linear_offset(SH_LINEAR_PT_VIRT_START)); \})#if SHADOW_PAGING_LEVELS >= 4#define sh_linear_l3_table(v) ({ \ ASSERT(current == (v)); \ ((shadow_l3e_t *) \ (is_hvm_vcpu(v) ? __linear_l2_table : __sh_linear_l2_table) + \ shadow_l2_linear_offset(SH_LINEAR_PT_VIRT_START)); \})// we use l4_pgentry_t instead of shadow_l4e_t below because shadow_l4e_t is// not defined for when xen_levels==4 & shadow_levels==3...#define sh_linear_l4_table(v) ({ \ ASSERT(current == (v)); \ ((l4_pgentry_t *) \ (is_hvm_vcpu(v) ? __linear_l3_table : __sh_linear_l3_table) + \ shadow_l3_linear_offset(SH_LINEAR_PT_VIRT_START)); \})#endif/* Type of the guest's frame numbers */TYPE_SAFE(unsigned long,gfn)#define SH_PRI_gfn "05lx"#define VALID_GFN(m) (m != INVALID_GFN)static inline intvalid_gfn(gfn_t m){ return VALID_GFN(gfn_x(m));}static inline paddr_tgfn_to_paddr(gfn_t gfn){ return ((paddr_t)gfn_x(gfn)) << PAGE_SHIFT;}/* Override gfn_to_mfn to work with gfn_t */#undef gfn_to_mfn#define gfn_to_mfn(d, g, t) _gfn_to_mfn((d), gfn_x(g), (t))#if GUEST_PAGING_LEVELS == 2#include "../page-guest32.h"#define GUEST_L1_PAGETABLE_ENTRIES 1024#define GUEST_L2_PAGETABLE_ENTRIES 1024#define GUEST_L1_PAGETABLE_SHIFT 12#define GUEST_L2_PAGETABLE_SHIFT 22/* Types of the guest's page tables */typedef l1_pgentry_32_t guest_l1e_t;typedef l2_pgentry_32_t guest_l2e_t;typedef intpte_32_t guest_intpte_t;/* Access functions for them */static inline paddr_t guest_l1e_get_paddr(guest_l1e_t gl1e){ return l1e_get_paddr_32(gl1e); }static inline paddr_t guest_l2e_get_paddr(guest_l2e_t gl2e){ return l2e_get_paddr_32(gl2e); }static inline gfn_t guest_l1e_get_gfn(guest_l1e_t gl1e){ return _gfn(l1e_get_paddr_32(gl1e) >> PAGE_SHIFT); }static inline gfn_t guest_l2e_get_gfn(guest_l2e_t gl2e){ return _gfn(l2e_get_paddr_32(gl2e) >> PAGE_SHIFT); }static inline u32 guest_l1e_get_flags(guest_l1e_t gl1e){ return l1e_get_flags_32(gl1e); }static inline u32 guest_l2e_get_flags(guest_l2e_t gl2e){ return l2e_get_flags_32(gl2e); }static inline guest_l1e_t guest_l1e_add_flags(guest_l1e_t gl1e, u32 flags){ l1e_add_flags_32(gl1e, flags); return gl1e; }static inline guest_l2e_t guest_l2e_add_flags(guest_l2e_t gl2e, u32 flags){ l2e_add_flags_32(gl2e, flags); return gl2e; }static inline guest_l1e_t guest_l1e_from_gfn(gfn_t gfn, u32 flags){ return l1e_from_pfn_32(gfn_x(gfn), flags); }static inline guest_l2e_t guest_l2e_from_gfn(gfn_t gfn, u32 flags){ return l2e_from_pfn_32(gfn_x(gfn), flags); }#define guest_l1_table_offset(a) l1_table_offset_32(a)#define guest_l2_table_offset(a) l2_table_offset_32(a)/* The shadow types needed for the various levels. */#define SH_type_l1_shadow SH_type_l1_32_shadow#define SH_type_l2_shadow SH_type_l2_32_shadow#define SH_type_fl1_shadow SH_type_fl1_32_shadow#else /* GUEST_PAGING_LEVELS != 2 */#if GUEST_PAGING_LEVELS == 3#define GUEST_L1_PAGETABLE_ENTRIES 512#define GUEST_L2_PAGETABLE_ENTRIES 512#define GUEST_L3_PAGETABLE_ENTRIES 4#define GUEST_L1_PAGETABLE_SHIFT 12#define GUEST_L2_PAGETABLE_SHIFT 21#define GUEST_L3_PAGETABLE_SHIFT 30#else /* GUEST_PAGING_LEVELS == 4 */#define GUEST_L1_PAGETABLE_ENTRIES 512#define GUEST_L2_PAGETABLE_ENTRIES 512#define GUEST_L3_PAGETABLE_ENTRIES 512#define GUEST_L4_PAGETABLE_ENTRIES 512
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?