⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 domain.h

📁 xen 3.2.2 源码
💻 H
字号:
#ifndef __ASM_DOMAIN_H__#define __ASM_DOMAIN_H__#include <xen/config.h>#include <xen/mm.h>#include <asm/hvm/vcpu.h>#include <asm/hvm/domain.h>#include <asm/e820.h>#define has_32bit_shinfo(d)    ((d)->arch.has_32bit_shinfo)#define is_pv_32bit_domain(d)  ((d)->arch.is_32bit_pv)#define is_pv_32bit_vcpu(v)    (is_pv_32bit_domain((v)->domain))#ifdef __x86_64__#define is_pv_32on64_domain(d) (is_pv_32bit_domain(d))#else#define is_pv_32on64_domain(d) (0)#endif#define is_pv_32on64_vcpu(v)   (is_pv_32on64_domain((v)->domain))#define IS_COMPAT(d)           (is_pv_32on64_domain(d))struct trap_bounce {    uint32_t      error_code;    uint8_t       flags; /* TBF_ */    uint16_t      cs;    unsigned long eip;};#define MAPHASH_ENTRIES 8#define MAPHASH_HASHFN(pfn) ((pfn) & (MAPHASH_ENTRIES-1))#define MAPHASHENT_NOTINUSE ((u16)~0U)struct mapcache_vcpu {    /* Shadow of mapcache_domain.epoch. */    unsigned int shadow_epoch;    /* Lock-free per-VCPU hash of recently-used mappings. */    struct vcpu_maphash_entry {        unsigned long mfn;        uint16_t      idx;        uint16_t      refcnt;    } hash[MAPHASH_ENTRIES];};#define MAPCACHE_ORDER   10#define MAPCACHE_ENTRIES (1 << MAPCACHE_ORDER)struct mapcache_domain {    /* The PTEs that provide the mappings, and a cursor into the array. */    l1_pgentry_t *l1tab;    unsigned int cursor;    /* Protects map_domain_page(). */    spinlock_t lock;    /* Garbage mappings are flushed from TLBs in batches called 'epochs'. */    unsigned int epoch;    u32 tlbflush_timestamp;    /* Which mappings are in use, and which are garbage to reap next epoch? */    unsigned long inuse[BITS_TO_LONGS(MAPCACHE_ENTRIES)];    unsigned long garbage[BITS_TO_LONGS(MAPCACHE_ENTRIES)];};void mapcache_domain_init(struct domain *);void mapcache_vcpu_init(struct vcpu *);/* x86/64: toggle guest between kernel and user modes. */void toggle_guest_mode(struct vcpu *);/* * Initialise a hypercall-transfer page. The given pointer must be mapped * in Xen virtual address space (accesses are not validated or checked). */void hypercall_page_initialise(struct domain *d, void *);/************************************************//*          shadow paging extension             *//************************************************/struct shadow_domain {    spinlock_t        lock;  /* shadow domain lock */    int               locker; /* processor which holds the lock */    const char       *locker_function; /* Func that took it */    unsigned int      opt_flags;    /* runtime tunable optimizations on/off */    struct list_head  pinned_shadows;    /* Memory allocation */    struct list_head  freelists[SHADOW_MAX_ORDER + 1];    struct list_head  p2m_freelist;    unsigned int      total_pages;  /* number of pages allocated */    unsigned int      free_pages;   /* number of pages on freelists */    unsigned int      p2m_pages;    /* number of pages allocates to p2m */    /* 1-to-1 map for use when HVM vcpus have paging disabled */    pagetable_t unpaged_pagetable;    /* Shadow hashtable */    struct shadow_page_info **hash_table;    int hash_walking;  /* Some function is walking the hash table */    /* Fast MMIO path heuristic */    int has_fast_mmio_entries;};struct shadow_vcpu {#if CONFIG_PAGING_LEVELS >= 3    /* PAE guests: per-vcpu shadow top-level table */    l3_pgentry_t l3table[4] __attribute__((__aligned__(32)));    /* PAE guests: per-vcpu cache of the top-level *guest* entries */    l3_pgentry_t gl3e[4] __attribute__((__aligned__(32)));#endif    /* Non-PAE guests: pointer to guest top-level pagetable */    void *guest_vtable;    /* Last MFN that we emulated a write to. */    unsigned long last_emulated_mfn;    /* MFN of the last shadow that we shot a writeable mapping in */    unsigned long last_writeable_pte_smfn;};/************************************************//*            hardware assisted paging          *//************************************************/struct hap_domain {    spinlock_t        lock;    int               locker;    const char       *locker_function;    struct list_head  freelist;    unsigned int      total_pages;  /* number of pages allocated */    unsigned int      free_pages;   /* number of pages on freelists */    unsigned int      p2m_pages;    /* number of pages allocates to p2m */};/************************************************//*       p2m handling                           *//************************************************/struct p2m_domain {    /* Lock that protects updates to the p2m */    spinlock_t         lock;    int                locker;   /* processor which holds the lock */    const char        *locker_function; /* Func that took it */    /* Pages used to construct the p2m */    struct list_head   pages;    /* Functions to call to get or free pages for the p2m */    struct page_info * (*alloc_page  )(struct domain *d);    void               (*free_page   )(struct domain *d,                                       struct page_info *pg);    /* Highest guest frame that's ever been mapped in the p2m */    unsigned long max_mapped_pfn;};/************************************************//*       common paging data structure           *//************************************************/struct log_dirty_domain {    /* log-dirty lock */    spinlock_t     lock;    int            locker; /* processor that holds the lock */    const char    *locker_function; /* func that took it */    /* log-dirty radix tree to record dirty pages */    mfn_t          top;    unsigned int   allocs;    unsigned int   failed_allocs;    /* log-dirty mode stats */    unsigned int   fault_count;    unsigned int   dirty_count;    /* functions which are paging mode specific */    int            (*enable_log_dirty   )(struct domain *d);    int            (*disable_log_dirty  )(struct domain *d);    void           (*clean_dirty_bitmap )(struct domain *d);};struct paging_domain {    /* flags to control paging operation */    u32                     mode;    /* extension for shadow paging support */    struct shadow_domain    shadow;    /* extension for hardware-assited paging */    struct hap_domain       hap;    /* log dirty support */    struct log_dirty_domain log_dirty;};struct paging_vcpu {    /* Pointers to mode-specific entry points. */    struct paging_mode *mode;    /* HVM guest: last emulate was to a pagetable */    unsigned int last_write_was_pt:1;    /* Translated guest: virtual TLB */    struct shadow_vtlb *vtlb;    spinlock_t          vtlb_lock;    /* paging support extension */    struct shadow_vcpu shadow;};struct arch_domain{    l1_pgentry_t *mm_perdomain_pt;#ifdef CONFIG_X86_64    l2_pgentry_t *mm_perdomain_l2;    l3_pgentry_t *mm_perdomain_l3;#endif#ifdef CONFIG_X86_32    /* map_domain_page() mapping cache. */    struct mapcache_domain mapcache;#endif#ifdef CONFIG_COMPAT    unsigned int hv_compat_vstart;    l3_pgentry_t *mm_arg_xlat_l3;#endif    /* I/O-port admin-specified access capabilities. */    struct rangeset *ioport_caps;    struct hvm_domain hvm_domain;    struct paging_domain paging;    struct p2m_domain p2m ;    /* Shadow translated domain: P2M mapping */    pagetable_t phys_table;    /* Pseudophysical e820 map (XENMEM_memory_map).  */    struct e820entry e820[3];    unsigned int nr_e820;    /* Maximum physical-address bitwidth supported by this guest. */    unsigned int physaddr_bitsize;    /* Is a 32-bit PV (non-HVM) guest? */    bool_t is_32bit_pv;    /* Is shared-info page in 32-bit format? */    bool_t has_32bit_shinfo;    /* Continuable domain_relinquish_resources(). */    enum {        RELMEM_not_started,        RELMEM_xen_l4,        RELMEM_dom_l4,        RELMEM_xen_l3,        RELMEM_dom_l3,        RELMEM_xen_l2,        RELMEM_dom_l2,        RELMEM_done,    } relmem;    struct list_head relmem_list;} __cacheline_aligned;#ifdef CONFIG_X86_PAEstruct pae_l3_cache {    /*     * Two low-memory (<4GB) PAE L3 tables, used as fallback when the guest     * supplies a >=4GB PAE L3 table. We need two because we cannot set up     * an L3 table while we are currently running on it (without using     * expensive atomic 64-bit operations).     */    l3_pgentry_t  table[2][4] __attribute__((__aligned__(32)));    unsigned long high_mfn;  /* The >=4GB MFN being shadowed. */    unsigned int  inuse_idx; /* Which of the two cache slots is in use? */    spinlock_t    lock;};#define pae_l3_cache_init(c) spin_lock_init(&(c)->lock)#else /* !CONFIG_X86_PAE */struct pae_l3_cache { };#define pae_l3_cache_init(c) ((void)0)#endifstruct arch_vcpu{    /* Needs 16-byte aligment for FXSAVE/FXRSTOR. */    struct vcpu_guest_context guest_context    __attribute__((__aligned__(16)));    struct pae_l3_cache pae_l3_cache;    unsigned long      flags; /* TF_ */    void (*schedule_tail) (struct vcpu *);    void (*ctxt_switch_from) (struct vcpu *);    void (*ctxt_switch_to) (struct vcpu *);    /* Record information required to continue execution after migration */    void *continue_info;    /* Bounce information for propagating an exception to guest OS. */    struct trap_bounce trap_bounce;    /* I/O-port access bitmap. */    XEN_GUEST_HANDLE(uint8) iobmp; /* Guest kernel vaddr of the bitmap. */    int iobmp_limit;  /* Number of ports represented in the bitmap.  */    int iopl;         /* Current IOPL for this VCPU. */#ifdef CONFIG_X86_32    struct desc_struct int80_desc;#endif#ifdef CONFIG_X86_64    struct trap_bounce int80_bounce;    unsigned long      syscall32_callback_eip;    unsigned long      sysenter_callback_eip;    unsigned short     syscall32_callback_cs;    unsigned short     sysenter_callback_cs;    bool_t             syscall32_disables_events;    bool_t             sysenter_disables_events;#endif    /* Virtual Machine Extensions */    struct hvm_vcpu hvm_vcpu;    /*     * Every domain has a L1 pagetable of its own. Per-domain mappings     * are put in this table (eg. the current GDT is mapped here).     */    l1_pgentry_t *perdomain_ptes;#ifdef CONFIG_X86_64    pagetable_t guest_table_user;       /* (MFN) x86/64 user-space pagetable */#endif    pagetable_t guest_table;            /* (MFN) guest notion of cr3 */    /* guest_table holds a ref to the page, and also a type-count unless     * shadow refcounts are in use */    pagetable_t shadow_table[4];        /* (MFN) shadow(s) of guest */    pagetable_t monitor_table;          /* (MFN) hypervisor PT (for HVM) */    unsigned long cr3;                  /* (MA) value to install in HW CR3 */    /* Current LDT details. */    unsigned long shadow_ldt_mapcnt;    struct paging_vcpu paging;    /* Guest-specified relocation of vcpu_info. */    unsigned long vcpu_info_mfn;#ifdef CONFIG_X86_32    /* map_domain_page() mapping cache. */    struct mapcache_vcpu mapcache;#endif} __cacheline_aligned;/* Shorthands to improve code legibility. */#define hvm_vmx         hvm_vcpu.u.vmx#define hvm_svm         hvm_vcpu.u.svm/* Continue the current hypercall via func(data) on specified cpu. */int continue_hypercall_on_cpu(int cpu, long (*func)(void *data), void *data);/* Clean up CR4 bits that are not under guest control. */unsigned long pv_guest_cr4_fixup(unsigned long guest_cr4);/* Convert between guest-visible and real CR4 values. */#define pv_guest_cr4_to_real_cr4(c) \    (((c) | (mmu_cr4_features & (X86_CR4_PGE | X86_CR4_PSE))) & ~X86_CR4_DE)#define real_cr4_to_pv_guest_cr4(c) \    ((c) & ~(X86_CR4_PGE | X86_CR4_PSE))#endif /* __ASM_DOMAIN_H__ *//* * Local variables: * mode: C * c-set-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil * End: */

⌨️ 快捷键说明

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