[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] merge with xen-unstable.hg (staging)
# HG changeset patch # User Alex Williamson <alex.williamson@xxxxxx> # Date 1194539826 25200 # Node ID ee935d2b8a632bad27fc1682daf9cda503e08277 # Parent d0cd18d780749482866ab4b21e3f77b40141230e # Parent 3e3b0418905f5900df24d1e1b6e916cff8a371ba merge with xen-unstable.hg (staging) --- tools/ioemu/target-i386-dm/helper2.c | 17 - tools/misc/xend | 14 - tools/python/xen/xm/main.py | 6 xen/arch/ia64/vmx/mmio.c | 3 xen/arch/ia64/vmx/save.c | 6 xen/arch/ia64/xen/mm.c | 2 xen/arch/x86/hvm/intercept.c | 18 - xen/arch/x86/hvm/save.c | 12 - xen/arch/x86/hvm/stdvga.c | 4 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c | 12 - xen/arch/x86/hvm/vmx/vtd/utils.c | 360 +++++++++++------------------- xen/arch/x86/hvm/vpt.c | 26 -- xen/arch/x86/mm.c | 8 xen/arch/x86/mm/shadow/multi.c | 5 xen/common/grant_table.c | 2 xen/common/hvm/save.c | 4 xen/common/page_alloc.c | 11 xen/include/asm-ia64/mm.h | 5 xen/include/asm-powerpc/mm.h | 3 xen/include/asm-x86/hvm/vmx/intel-iommu.h | 13 + xen/include/asm-x86/mm.h | 8 xen/include/public/hvm/ioreq.h | 11 xen/include/xen/hvm/save.h | 4 23 files changed, 236 insertions(+), 318 deletions(-) diff -r d0cd18d78074 -r ee935d2b8a63 tools/ioemu/target-i386-dm/helper2.c --- a/tools/ioemu/target-i386-dm/helper2.c Wed Nov 07 15:11:44 2007 -0700 +++ b/tools/ioemu/target-i386-dm/helper2.c Thu Nov 08 09:37:06 2007 -0700 @@ -541,27 +541,28 @@ void __handle_buffered_iopage(CPUState * { buf_ioreq_t *buf_req = NULL; ioreq_t req; - int qw = 0; + int qw; if (!buffered_io_page) return; while (buffered_io_page->read_pointer != buffered_io_page->write_pointer) { - memset(&req, 0, sizeof(req)); - buf_req = &buffered_io_page->buf_ioreq[buffered_io_page->read_pointer % - IOREQ_BUFFER_SLOT_NUM]; + buf_req = &buffered_io_page->buf_ioreq[ + buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM]; req.size = 1UL << buf_req->size; req.count = 1; req.addr = buf_req->addr; req.data = buf_req->data; req.state = STATE_IOREQ_READY; - req.dir = buf_req->dir; + req.dir = buf_req->dir; + req.df = buf_req->df; req.type = buf_req->type; - qw = req.size == 8; + req.data_is_ptr = 0; + qw = (req.size == 8); if (qw) { - buf_req = &buffered_io_page->buf_ioreq[(buffered_io_page->read_pointer+1) % - IOREQ_BUFFER_SLOT_NUM]; + buf_req = &buffered_io_page->buf_ioreq[ + (buffered_io_page->read_pointer+1) % IOREQ_BUFFER_SLOT_NUM]; req.data |= ((uint64_t)buf_req->data) << 32; } diff -r d0cd18d78074 -r ee935d2b8a63 tools/misc/xend --- a/tools/misc/xend Wed Nov 07 15:11:44 2007 -0700 +++ b/tools/misc/xend Thu Nov 08 09:37:06 2007 -0700 @@ -33,13 +33,13 @@ import time import time import commands -result = commands.getstatusoutput(os.path.join(os.path.dirname(sys.argv[0]), - 'xen-python-path')) -if result[0] != 0: - print >>sys.stderr, result[1] - sys.exit(1) - -sys.path.append(result[1]) +xpp = os.path.join(os.path.dirname(sys.argv[0]), 'xen-python-path') +if os.path.exists(xpp): + result = commands.getstatusoutput(xpp) + if result[0] != 0: + print >>sys.stderr, result[1] + sys.exit(1) + sys.path.append(result[1]) from xen.xend.server import SrvDaemon diff -r d0cd18d78074 -r ee935d2b8a63 tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Wed Nov 07 15:11:44 2007 -0700 +++ b/tools/python/xen/xm/main.py Thu Nov 08 09:37:06 2007 -0700 @@ -1529,11 +1529,11 @@ def xm_sched_credit(args): cap = None for o, a in opts: - if o == "-d": + if o in ["-d", "--domain"]: domid = a - elif o == "-w": + elif o in ["-w", "--weight"]: weight = int(a) - elif o == "-c": + elif o in ["-c", "--cap"]: cap = int(a); doms = filter(lambda x : domid_match(domid, x), diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/ia64/vmx/mmio.c --- a/xen/arch/ia64/vmx/mmio.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/ia64/vmx/mmio.c Thu Nov 08 09:37:06 2007 -0700 @@ -65,7 +65,7 @@ static int hvm_buffered_io_intercept(ior /* ignore READ ioreq_t and anything buffered io can't deal with */ if (p->dir == IOREQ_READ || p->addr > 0xFFFFFUL || - p->data_is_ptr || p->df || p->count != 1) + p->data_is_ptr || p->count != 1) return 0; for (i = 0; i < HVM_BUFFERED_IO_RANGE_NR; i++) { @@ -80,6 +80,7 @@ static int hvm_buffered_io_intercept(ior bp.type = p->type; bp.dir = p->dir; + bp.df = p->df; switch (p->size) { case 1: bp.size = 0; diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/ia64/vmx/save.c --- a/xen/arch/ia64/vmx/save.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/ia64/vmx/save.c Thu Nov 08 09:37:06 2007 -0700 @@ -23,8 +23,7 @@ #include <xen/types.h> #include <xen/hvm/save.h> -void -arch_hvm_save(struct hvm_save_header *hdr) +void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr) { unsigned int i; @@ -32,8 +31,7 @@ arch_hvm_save(struct hvm_save_header *hd hdr->cpuid[i] = ia64_get_cpuid(i); } -int -arch_hvm_load(struct hvm_save_header *hdr) +int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr) { unsigned int i; if (hdr->magic != HVM_FILE_MAGIC) { diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/ia64/xen/mm.c --- a/xen/arch/ia64/xen/mm.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/ia64/xen/mm.c Thu Nov 08 09:37:06 2007 -0700 @@ -2832,7 +2832,7 @@ arch_memory_op(int op, XEN_GUEST_HANDLE( /* Remove previously mapped page if it was present. */ if (prev_mfn && mfn_valid(prev_mfn)) { - if (is_xen_heap_frame(mfn_to_page(prev_mfn))) + if (is_xen_heap_mfn(prev_mfn)) /* Xen heap frames are simply unhooked from this phys slot. */ guest_physmap_remove_page(d, xatp.gpfn, prev_mfn); else diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/intercept.c --- a/xen/arch/x86/hvm/intercept.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/hvm/intercept.c Thu Nov 08 09:37:06 2007 -0700 @@ -163,18 +163,20 @@ int hvm_buffered_io_send(ioreq_t *p) /* Ensure buffered_iopage fits in a page */ BUILD_BUG_ON(sizeof(buffered_iopage_t) > PAGE_SIZE); - /* Return 0 for the cases we can't deal with. */ - if ( (p->addr > 0xffffful) || p->data_is_ptr || p->df || (p->count != 1) ) - { - gdprintk(XENLOG_DEBUG, "slow ioreq. type:%d size:%"PRIu64" addr:0x%" - PRIx64" dir:%d ptr:%d df:%d count:%"PRIu64"\n", - p->type, p->size, p->addr, !!p->dir, - !!p->data_is_ptr, !!p->df, p->count); + /* + * Return 0 for the cases we can't deal with: + * - 'addr' is only a 20-bit field, so we cannot address beyond 1MB + * - we cannot buffer accesses to guest memory buffers, as the guest + * may expect the memory buffer to be synchronously accessed + * - the count field is usually used with data_is_ptr and since we don't + * support data_is_ptr we do not waste space for the count field either + */ + if ( (p->addr > 0xffffful) || p->data_is_ptr || (p->count != 1) ) return 0; - } bp.type = p->type; bp.dir = p->dir; + bp.df = p->df; switch ( p->size ) { case 1: diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/save.c --- a/xen/arch/x86/hvm/save.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/hvm/save.c Thu Nov 08 09:37:06 2007 -0700 @@ -24,8 +24,7 @@ #include <asm/hvm/support.h> #include <public/hvm/save.h> -void -arch_hvm_save(struct hvm_save_header *hdr) +void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr) { uint32_t eax, ebx, ecx, edx; @@ -36,10 +35,10 @@ arch_hvm_save(struct hvm_save_header *hd hdr->pad0 = 0; } -int -arch_hvm_load(struct hvm_save_header *hdr) +int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr) { uint32_t eax, ebx, ecx, edx; + if ( hdr->magic != HVM_FILE_MAGIC ) { gdprintk(XENLOG_ERR, @@ -55,10 +54,13 @@ arch_hvm_load(struct hvm_save_header *hd } cpuid(1, &eax, &ebx, &ecx, &edx); - /*TODO: need to define how big a difference is acceptable */ + /* TODO: need to define how big a difference is acceptable? */ if ( hdr->cpuid != eax ) gdprintk(XENLOG_WARNING, "HVM restore: saved CPUID (%#"PRIx32") " "does not match host (%#"PRIx32").\n", hdr->cpuid, eax); + + /* VGA state is not saved/restored, so we nobble the cache. */ + d->arch.hvm_domain.stdvga.cache = 0; return 0; } diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/stdvga.c --- a/xen/arch/x86/hvm/stdvga.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/hvm/stdvga.c Thu Nov 08 09:37:06 2007 -0700 @@ -220,7 +220,9 @@ static void stdvga_outb(uint64_t addr, u gdprintk(XENLOG_INFO, "entering stdvga and caching modes\n"); } else if ( prev_stdvga && !s->stdvga ) + { gdprintk(XENLOG_INFO, "leaving stdvga\n"); + } } static void stdvga_outv(uint64_t addr, uint64_t data, uint32_t size) @@ -636,7 +638,7 @@ int stdvga_intercept_mmio(ioreq_t *p) buf = mmio_op(s, p); break; default: - gdprintk(XENLOG_ERR, "unsupported mmio request type:%d " + gdprintk(XENLOG_WARNING, "unsupported mmio request type:%d " "addr:0x%04x data:0x%04x size:%d count:%d state:%d " "isptr:%d dir:%d df:%d\n", p->type, (int)p->addr, (int)p->data, (int)p->size, diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c --- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c Thu Nov 08 09:37:06 2007 -0700 @@ -115,18 +115,6 @@ static int device_context_mapped(struct return ret; } -/* page table handling */ -#define LEVEL_STRIDE (9) -#define LEVEL_MASK ((1 << LEVEL_STRIDE) - 1) -#define agaw_to_level(val) ((val) + 2) -#define agaw_to_width(val) (30 + val * LEVEL_STRIDE) -#define width_to_agaw(w) ((w - 30)/LEVEL_STRIDE) -#define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE) -#define address_level_offset(addr, level) \ - ((addr >> level_to_offset_bits(level)) & LEVEL_MASK) -#define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l)) -#define level_size(l) (1 << level_to_offset_bits(l)) -#define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l)) static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr) { struct hvm_iommu *hd = domain_hvm_iommu(domain); diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/vmx/vtd/utils.c --- a/xen/arch/x86/hvm/vmx/vtd/utils.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/hvm/vmx/vtd/utils.c Thu Nov 08 09:37:06 2007 -0700 @@ -32,8 +32,9 @@ #include <xen/mm.h> #include <xen/xmalloc.h> - -#define VTDPREFIX "[VT-D]" +#include <xen/inttypes.h> + +#define VTDPREFIX "[VT-D]" #define INTEL 0x8086 #define SEABURG 0x4000 #define C_STEP 2 @@ -93,47 +94,57 @@ void disable_pmr(struct iommu *iommu) "Disabled protected memory registers\n"); } -#if defined(__x86_64__) + void print_iommu_regs(struct acpi_drhd_unit *drhd) { struct iommu *iommu = drhd->iommu; - - printk("---- print_iommu_regs ----\n"); + + printk("---- print_iommu_regs ----\n"); printk("print_iommu_regs: drhd->address = %lx\n", drhd->address); printk("print_iommu_regs: DMAR_VER_REG = %x\n", - dmar_readl(iommu->reg,DMAR_VER_REG)); - printk("print_iommu_regs: DMAR_CAP_REG = %lx\n", - dmar_readq(iommu->reg,DMAR_CAP_REG)); - printk("print_iommu_regs: n_fault_reg = %lx\n", - cap_num_fault_regs(dmar_readq(iommu->reg, DMAR_CAP_REG))); - printk("print_iommu_regs: fault_recording_offset_l = %lx\n", - cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG))); - printk("print_iommu_regs: fault_recording_offset_h = %lx\n", - cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8); - printk("print_iommu_regs: fault_recording_reg_l = %lx\n", - dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)))); - printk("print_iommu_regs: fault_recording_reg_h = %lx\n", - dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8)); - printk("print_iommu_regs: DMAR_ECAP_REG = %lx\n", - dmar_readq(iommu->reg,DMAR_ECAP_REG)); + dmar_readl(iommu->reg,DMAR_VER_REG)); + printk("print_iommu_regs: DMAR_CAP_REG = %"PRIx64"\n", + dmar_readq(iommu->reg,DMAR_CAP_REG)); + printk("print_iommu_regs: n_fault_reg = %"PRIx64"\n", + cap_num_fault_regs(dmar_readq(iommu->reg, DMAR_CAP_REG))); + printk("print_iommu_regs: fault_recording_offset_l = %"PRIx64"\n", + cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG))); + printk("print_iommu_regs: fault_recording_offset_h = %"PRIx64"\n", + cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8); + printk("print_iommu_regs: fault_recording_reg_l = %"PRIx64"\n", + dmar_readq(iommu->reg, + cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)))); + printk("print_iommu_regs: fault_recording_reg_h = %"PRIx64"\n", + dmar_readq(iommu->reg, + cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8)); + printk("print_iommu_regs: DMAR_ECAP_REG = %"PRIx64"\n", + dmar_readq(iommu->reg,DMAR_ECAP_REG)); printk("print_iommu_regs: DMAR_GCMD_REG = %x\n", - dmar_readl(iommu->reg,DMAR_GCMD_REG)); + dmar_readl(iommu->reg,DMAR_GCMD_REG)); printk("print_iommu_regs: DMAR_GSTS_REG = %x\n", - dmar_readl(iommu->reg,DMAR_GSTS_REG)); - printk("print_iommu_regs: DMAR_RTADDR_REG = %lx\n", - dmar_readq(iommu->reg,DMAR_RTADDR_REG)); - printk("print_iommu_regs: DMAR_CCMD_REG = %lx\n", - dmar_readq(iommu->reg,DMAR_CCMD_REG)); + dmar_readl(iommu->reg,DMAR_GSTS_REG)); + printk("print_iommu_regs: DMAR_RTADDR_REG = %"PRIx64"\n", + dmar_readq(iommu->reg,DMAR_RTADDR_REG)); + printk("print_iommu_regs: DMAR_CCMD_REG = %"PRIx64"\n", + dmar_readq(iommu->reg,DMAR_CCMD_REG)); printk("print_iommu_regs: DMAR_FSTS_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FSTS_REG)); + dmar_readl(iommu->reg,DMAR_FSTS_REG)); printk("print_iommu_regs: DMAR_FECTL_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FECTL_REG)); + dmar_readl(iommu->reg,DMAR_FECTL_REG)); printk("print_iommu_regs: DMAR_FEDATA_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FEDATA_REG)); + dmar_readl(iommu->reg,DMAR_FEDATA_REG)); printk("print_iommu_regs: DMAR_FEADDR_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FEADDR_REG)); + dmar_readl(iommu->reg,DMAR_FEADDR_REG)); printk("print_iommu_regs: DMAR_FEUADDR_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FEUADDR_REG)); + dmar_readl(iommu->reg,DMAR_FEUADDR_REG)); +} + +u32 get_level_index(unsigned long gmfn, int level) +{ + while ( --level ) + gmfn = gmfn >> LEVEL_STRIDE; + + return gmfn & LEVEL_MASK; } void print_vtd_entries(struct domain *d, int bus, int devfn, @@ -144,219 +155,120 @@ void print_vtd_entries(struct domain *d, struct iommu *iommu; struct context_entry *ctxt_entry; struct root_entry *root_entry; - u64 *l3, *l2, *l1; - u32 l3_index, l2_index, l1_index; + u64 *l4 = NULL, *l3, *l2, *l1; + u32 l4_index = 0, l3_index, l2_index, l1_index; u32 i = 0; - - printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x devfn = %x, gmfn = %lx\n", d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), devfn, gmfn); - - for_each_drhd_unit(drhd) { + int level = agaw_to_level(hd->agaw); + + printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x gmfn = %lx\n", + d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), gmfn); + + if ( hd->pgd == NULL ) + { + printk(" hg->pgd == NULL\n"); + return; + } + printk(" d->pgd = %p virt_to_maddr(hd->pgd) = %lx\n", + hd->pgd, virt_to_maddr(hd->pgd)); + + for_each_drhd_unit ( drhd ) + { printk("---- print_vtd_entries %d ----\n", i++); - - if (hd->pgd == NULL) { - printk(" hg->pgd == NULL\n"); - return; - } iommu = drhd->iommu; root_entry = iommu->root_entry; - printk(" hd->pgd = %p virt_to_maddr(hd->pgd) = %lx\n", - hd->pgd, virt_to_maddr(hd->pgd)); - printk(" root_entry = %p\n", root_entry); - if (root_entry == NULL) { + if ( root_entry == NULL ) + { printk(" root_entry == NULL\n"); - return; - } - - printk(" root_entry[%x] = %lx\n", bus, root_entry[bus].val); + continue; + } + + printk(" root_entry[%x] = %"PRIx64"\n", bus, root_entry[bus].val); printk(" maddr_to_virt(root_entry[%x]) = %p\n", - bus, maddr_to_virt(root_entry[bus].val)); - - if (root_entry[bus].val == 0) { + bus, maddr_to_virt(root_entry[bus].val)); + + if ( root_entry[bus].val == 0 ) + { printk(" root_entry[%x].lo == 0\n", bus); - return; - } - - ctxt_entry = maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << PAGE_SHIFT); - if (ctxt_entry == NULL) { + continue; + } + + ctxt_entry = + maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << PAGE_SHIFT); + if ( ctxt_entry == NULL ) + { printk(" ctxt_entry == NULL\n"); - return; - } - - if (ctxt_entry[devfn].lo == 0) { + continue; + } + + if ( ctxt_entry[devfn].lo == 0 ) + { printk(" ctxt_entry[%x].lo == 0\n", devfn); - return; + continue; } printk(" context = %p\n", ctxt_entry); - printk(" context[%x] = %lx %lx\n", + printk(" context[%x] = %"PRIx64" %"PRIx64"\n", devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo); printk(" maddr_to_virt(context[%x].lo) = %p\n", devfn, maddr_to_virt(ctxt_entry[devfn].lo)); - printk(" context[%x] = %lx\n", devfn, ctxt_entry[devfn].lo); - - l3 = maddr_to_virt(ctxt_entry[devfn].lo); - l3 = (u64*)(((u64) l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); - printk(" l3 = %p\n", l3); - if (l3 == NULL) return; - - l3_index = (gmfn >> 9 >> 9) & 0x1ff; - printk(" l3_index = %x\n", l3_index); - printk(" l3[%x] = %lx\n", l3_index, l3[l3_index]); + printk(" context[%x] = %"PRIx64"\n", devfn, ctxt_entry[devfn].lo); + + switch ( level ) + { + case VTD_PAGE_TABLE_LEVEL_3: + l3 = maddr_to_virt(ctxt_entry[devfn].lo); + l3 = (u64*)(((unsigned long)l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); + printk(" l3 = %p\n", l3); + if ( l3 == NULL ) + continue; + l3_index = get_level_index(gmfn, 3); + printk(" l3_index = %x\n", l3_index); + printk(" l3[%x] = %"PRIx64"\n", l3_index, l3[l3_index]); + + break; + case VTD_PAGE_TABLE_LEVEL_4: + l4 = maddr_to_virt(ctxt_entry[devfn].lo); + l4 = (u64*)(((unsigned long)l4 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); + printk(" l4 = %p\n", l4); + if ( l4 == NULL ) + continue; + l4_index = get_level_index(gmfn, 4); + printk(" l4_index = %x\n", l4_index); + printk(" l4[%x] = %"PRIx64"\n", l4_index, l4[l4_index]); + + l3 = maddr_to_virt(l4[l4_index]); + l3 = (u64*)(((unsigned long)l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); + printk(" l3 = %p\n", l3); + if ( l3 == NULL ) + continue; + l3_index = get_level_index(gmfn, 3); + printk(" l3_index = %x\n", l3_index); + printk(" l3[%x] = %"PRIx64"\n", l3_index, l3[l3_index]); + + break; + default: + printk("Unsupported VTD page table level (%d)!\n", level); + continue; + } l2 = maddr_to_virt(l3[l3_index]); - l2 = (u64*)(((u64) l2 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); - printk(" l2 = %p\n", l2); - if (l2 == NULL) return; - - l2_index = (gmfn >> 9) & 0x1ff; - printk(" gmfn = %lx\n", gmfn); - printk(" gmfn >> 9= %lx\n", gmfn >> 9); + l2 = (u64*)(((unsigned long)l2 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); + printk(" l2 = %p\n", l2); + if ( l2 == NULL ) + continue; + l2_index = get_level_index(gmfn, 2); printk(" l2_index = %x\n", l2_index); - printk(" l2[%x] = %lx\n", l2_index, l2[l2_index]); + printk(" l2[%x] = %"PRIx64"\n", l2_index, l2[l2_index]); l1 = maddr_to_virt(l2[l2_index]); - l1 = (u64*)(((u64) l1 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); - if (l1 == NULL) return; - l1_index = gmfn & 0x1ff; - printk(" l1 = %p\n", l1); + l1 = (u64*)(((unsigned long)l1 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); + printk(" l1 = %p\n", l1); + if ( l1 == NULL ) + continue; + l1_index = get_level_index(gmfn, 1); printk(" l1_index = %x\n", l1_index); - printk(" l1[%x] = %lx\n", l1_index, l1[l1_index]); - } -} - -#else // !m64 - -void print_iommu_regs(struct acpi_drhd_unit *drhd) -{ - struct iommu *iommu = drhd->iommu; - - printk("---- print_iommu_regs ----\n"); - printk("print_iommu_regs: drhd->address = %lx\n", drhd->address); - printk("print_iommu_regs: DMAR_VER_REG = %x\n", - dmar_readl(iommu->reg,DMAR_VER_REG)); - printk("print_iommu_regs: DMAR_CAP_REG = %llx\n", - dmar_readq(iommu->reg,DMAR_CAP_REG)); - printk("print_iommu_regs: n_fault_reg = %llx\n", - cap_num_fault_regs(dmar_readq(iommu->reg, DMAR_CAP_REG))); - printk("print_iommu_regs: fault_recording_offset_l = %llx\n", - cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG))); - printk("print_iommu_regs: fault_recording_offset_h = %llx\n", - cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8); - printk("print_iommu_regs: fault_recording_reg_l = %llx\n", - dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)))); - printk("print_iommu_regs: fault_recording_reg_h = %llx\n", - dmar_readq(iommu->reg, cap_fault_reg_offset(dmar_readq(iommu->reg, DMAR_CAP_REG)) + 8)); - printk("print_iommu_regs: DMAR_ECAP_REG = %llx\n", - dmar_readq(iommu->reg,DMAR_ECAP_REG)); - printk("print_iommu_regs: DMAR_GCMD_REG = %x\n", - dmar_readl(iommu->reg,DMAR_GCMD_REG)); - printk("print_iommu_regs: DMAR_GSTS_REG = %x\n", - dmar_readl(iommu->reg,DMAR_GSTS_REG)); - printk("print_iommu_regs: DMAR_RTADDR_REG = %llx\n", - dmar_readq(iommu->reg,DMAR_RTADDR_REG)); - printk("print_iommu_regs: DMAR_CCMD_REG = %llx\n", - dmar_readq(iommu->reg,DMAR_CCMD_REG)); - printk("print_iommu_regs: DMAR_FSTS_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FSTS_REG)); - printk("print_iommu_regs: DMAR_FECTL_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FECTL_REG)); - printk("print_iommu_regs: DMAR_FEDATA_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FEDATA_REG)); - printk("print_iommu_regs: DMAR_FEADDR_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FEADDR_REG)); - printk("print_iommu_regs: DMAR_FEUADDR_REG = %x\n", - dmar_readl(iommu->reg,DMAR_FEUADDR_REG)); -} - -void print_vtd_entries(struct domain *d, int bus, int devfn, - unsigned long gmfn) -{ - struct hvm_iommu *hd = domain_hvm_iommu(d); - struct acpi_drhd_unit *drhd; - struct iommu *iommu; - struct context_entry *ctxt_entry; - struct root_entry *root_entry; - u64 *l3, *l2, *l1; - u32 l3_index, l2_index, l1_index; - u32 i = 0; - - printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x devfn = %x, gmfn = %lx\n", d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), devfn, gmfn); - - for_each_drhd_unit(drhd) { - printk("---- print_vtd_entries %d ----\n", i++); - - if (hd->pgd == NULL) { - printk(" hg->pgd == NULL\n"); - return; - } - - iommu = drhd->iommu; - root_entry = iommu->root_entry; - printk(" d->pgd = %p virt_to_maddr(hd->pgd) = %lx\n", - hd->pgd, virt_to_maddr(hd->pgd)); - - printk(" root_entry = %p\n", root_entry); - if (root_entry == NULL) { - printk(" root_entry == NULL\n"); - return; - } - - printk(" root_entry[%x] = %llx\n", bus, root_entry[bus].val); - printk(" maddr_to_virt(root_entry[%x]) = %p\n", - bus, maddr_to_virt(root_entry[bus].val)); - - if (root_entry[bus].val == 0) { - printk(" root_entry[%x].lo == 0\n", bus); - return; - } - - ctxt_entry = maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << PAGE_SHIFT); - if (ctxt_entry == NULL) { - printk(" ctxt_entry == NULL\n"); - return; - } - - if (ctxt_entry[devfn].lo == 0) { - printk(" ctxt_entry[%x].lo == 0\n", devfn); - return; - } - - printk(" context = %p\n", ctxt_entry); - printk(" context[%x] = %llx %llx\n", - devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo); - printk(" maddr_to_virt(context[%x].lo) = %p\n", - devfn, maddr_to_virt(ctxt_entry[devfn].lo)); - printk(" context[%x] = %llx\n", devfn, ctxt_entry[devfn].lo); - - l3 = maddr_to_virt(ctxt_entry[devfn].lo); - l3 = (u64*)(((u32) l3 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); - printk(" l3 = %p\n", l3); - if (l3 == NULL) return; - - l3_index = (gmfn >> 9 >> 9) & 0x1ff; - printk(" l3_index = %x\n", l3_index); - printk(" l3[%x] = %llx\n", l3_index, l3[l3_index]); - - l2 = maddr_to_virt(l3[l3_index]); - l2 = (u64*)(((u32) l2 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); - printk(" l2 = %p\n", l2); - if (l2 == NULL) return; - - l2_index = (gmfn >> 9) & 0x1ff; - printk(" gmfn = %lx\n", gmfn); - printk(" gmfn >> 9= %lx\n", gmfn >> 9); - printk(" l2_index = %x\n", l2_index); - printk(" l2[%x] = %llx\n", l2_index, l2[l2_index]); - - l1 = maddr_to_virt(l2[l2_index]); - l1 = (u64*)(((u32) l1 >> PAGE_SHIFT_4K) << PAGE_SHIFT_4K); - if (l1 == NULL) return; - l1_index = gmfn & 0x1ff; - printk(" l1 = %p\n", l1); - printk(" l1_index = %x\n", l1_index); - printk(" l1[%x] = %llx\n", l1_index, l1[l1_index]); - } -} -#endif // !m64 + printk(" l1[%x] = %"PRIx64"\n", l1_index, l1[l1_index]); + } +} diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/hvm/vpt.c --- a/xen/arch/x86/hvm/vpt.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/hvm/vpt.c Thu Nov 08 09:37:06 2007 -0700 @@ -56,17 +56,9 @@ static void pt_process_missed_ticks(stru if ( missed_ticks <= 0 ) return; - if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) ) - { - pt->pending_intr_nr = 1; - pt->scheduled = now + pt->period; - } - else - { - missed_ticks = missed_ticks / (s_time_t) pt->period + 1; - pt->pending_intr_nr += missed_ticks; - pt->scheduled += missed_ticks * pt->period; - } + missed_ticks = missed_ticks / (s_time_t) pt->period + 1; + pt->pending_intr_nr += missed_ticks; + pt->scheduled += missed_ticks * pt->period; } static void pt_freeze_time(struct vcpu *v) @@ -131,10 +123,7 @@ static void pt_timer_fn(void *data) pt_lock(pt); - if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) ) - pt->pending_intr_nr = 1; - else - pt->pending_intr_nr++; + pt->pending_intr_nr++; if ( !pt->one_shot ) { @@ -235,11 +224,16 @@ void pt_intr_post(struct vcpu *v, struct } else { - pt->pending_intr_nr--; if ( mode_is(v->domain, no_missed_tick_accounting) ) + { pt->last_plt_gtime = hvm_get_guest_time(v); + pt->pending_intr_nr = 0; /* 'collapse' all missed ticks */ + } else + { pt->last_plt_gtime += pt->period_cycles; + pt->pending_intr_nr--; + } } if ( mode_is(v->domain, delay_for_missed_ticks) && diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/mm.c Thu Nov 08 09:37:06 2007 -0700 @@ -674,7 +674,7 @@ get_page_from_l1e( uint32_t x, nx, y = page->count_info; uint32_t cacheattr = pte_flags_to_cacheattr(l1f); - if ( is_xen_heap_frame(page) ) + if ( is_xen_heap_page(page) ) { if ( (l1f & _PAGE_RW) && !(unlikely(paging_mode_external(d) && @@ -1866,7 +1866,7 @@ void cleanup_page_cacheattr(struct page_ page->count_info &= ~PGC_cacheattr_mask; - BUG_ON(is_xen_heap_frame(page)); + BUG_ON(is_xen_heap_page(page)); #ifdef __x86_64__ map_pages_to_xen((unsigned long)page_to_virt(page), page_to_mfn(page), @@ -3200,7 +3200,7 @@ long arch_memory_op(int op, XEN_GUEST_HA prev_mfn = gmfn_to_mfn(d, xatp.gpfn); if ( mfn_valid(prev_mfn) ) { - if ( is_xen_heap_frame(mfn_to_page(prev_mfn)) ) + if ( is_xen_heap_mfn(prev_mfn) ) /* Xen heap frames are simply unhooked from this phys slot. */ guest_physmap_remove_page(d, xatp.gpfn, prev_mfn); else @@ -3583,7 +3583,7 @@ void free_xen_pagetable(void *v) BUG_ON(early_boot); - if ( is_xen_heap_frame(virt_to_page(v)) ) + if ( is_xen_heap_page(virt_to_page(v)) ) free_xenheap_page(v); else free_domheap_page(virt_to_page(v)); diff -r d0cd18d78074 -r ee935d2b8a63 xen/arch/x86/mm/shadow/multi.c --- a/xen/arch/x86/mm/shadow/multi.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/arch/x86/mm/shadow/multi.c Thu Nov 08 09:37:06 2007 -0700 @@ -745,10 +745,11 @@ _sh_propagate(struct vcpu *v, /* * For HVM domains with direct access to MMIO areas, set the correct - * caching attributes in the shadows to match what was asked for + * caching attributes in the shadows to match what was asked for. */ if ( (level == 1) && is_hvm_domain(d) && - !list_empty(&(domain_hvm_iommu(d)->pdev_list)) ) + !list_empty(&(domain_hvm_iommu(d)->pdev_list)) && + !is_xen_heap_mfn(mfn_x(target_mfn)) ) { unsigned int type; if ( hvm_get_mem_pinned_cacheattr(d, gfn_x(target_gfn), &type) ) diff -r d0cd18d78074 -r ee935d2b8a63 xen/common/grant_table.c --- a/xen/common/grant_table.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/common/grant_table.c Thu Nov 08 09:37:06 2007 -0700 @@ -1057,7 +1057,7 @@ gnttab_transfer( } page = mfn_to_page(mfn); - if ( unlikely(is_xen_heap_frame(page)) ) + if ( unlikely(is_xen_heap_page(page)) ) { gdprintk(XENLOG_INFO, "gnttab_transfer: xen frame %lx\n", (unsigned long)gop.mfn); diff -r d0cd18d78074 -r ee935d2b8a63 xen/common/hvm/save.c --- a/xen/common/hvm/save.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/common/hvm/save.c Thu Nov 08 09:37:06 2007 -0700 @@ -94,7 +94,7 @@ int hvm_save(struct domain *d, hvm_domai else hdr.changeset = -1ULL; /* Unknown */ - arch_hvm_save(&hdr); + arch_hvm_save(d, &hdr); if ( hvm_save_entry(HEADER, 0, h, &hdr) != 0 ) { @@ -144,7 +144,7 @@ int hvm_load(struct domain *d, hvm_domai if ( hvm_load_entry(HEADER, h, &hdr) != 0 ) return -1; - if ( arch_hvm_load(&hdr) ) + if ( arch_hvm_load(d, &hdr) ) return -1; c = strrchr(xen_changeset(), ':'); diff -r d0cd18d78074 -r ee935d2b8a63 xen/common/page_alloc.c --- a/xen/common/page_alloc.c Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/common/page_alloc.c Thu Nov 08 09:37:06 2007 -0700 @@ -559,8 +559,7 @@ static unsigned long avail_heap_pages( return free_pages; } -#define avail_for_domheap(mfn) \ - (!allocated_in_map(mfn) && !is_xen_heap_frame(mfn_to_page(mfn))) +#define avail_for_domheap(mfn) !(allocated_in_map(mfn) || is_xen_heap_mfn(mfn)) void __init end_boot_allocator(void) { unsigned long i; @@ -615,7 +614,7 @@ void __init scrub_heap_pages(void) /* Re-check page status with lock held. */ if ( !allocated_in_map(mfn) ) { - if ( is_xen_heap_frame(mfn_to_page(mfn)) ) + if ( is_xen_heap_mfn(mfn) ) { p = page_to_virt(mfn_to_page(mfn)); memguard_unguard_range(p, PAGE_SIZE); @@ -655,9 +654,9 @@ void init_xenheap_pages(paddr_t ps, padd * Yuk! Ensure there is a one-page buffer between Xen and Dom zones, to * prevent merging of power-of-two blocks across the zone boundary. */ - if ( ps && !is_xen_heap_frame(maddr_to_page(ps)-1) ) + if ( ps && !is_xen_heap_mfn(paddr_to_pfn(ps)-1) ) ps += PAGE_SIZE; - if ( !is_xen_heap_frame(maddr_to_page(pe)) ) + if ( !is_xen_heap_mfn(paddr_to_pfn(pe)) ) pe -= PAGE_SIZE; init_heap_pages(MEMZONE_XEN, maddr_to_page(ps), (pe - ps) >> PAGE_SHIFT); @@ -838,7 +837,7 @@ void free_domheap_pages(struct page_info ASSERT(!in_irq()); - if ( unlikely(is_xen_heap_frame(pg)) ) + if ( unlikely(is_xen_heap_page(pg)) ) { /* NB. May recursively lock from relinquish_memory(). */ spin_lock_recursive(&d->page_alloc_lock); diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-ia64/mm.h --- a/xen/include/asm-ia64/mm.h Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/include/asm-ia64/mm.h Thu Nov 08 09:37:06 2007 -0700 @@ -115,8 +115,9 @@ struct page_info /* 29-bit count of references to this frame. */ #define PGC_count_mask ((1UL<<29)-1) -#define is_xen_heap_frame(pfn) ((page_to_maddr(pfn) < xenheap_phys_end) \ - && (page_to_maddr(pfn) >= xen_pstart)) +#define is_xen_heap_mfn(mfn) (((mfn) < paddr_to_pfn(xenheap_phys_end)) \ + && ((mfn) >= paddr_to_pfn(xen_pstart))) +#define is_xen_heap_page(page) is_xen_heap_mfn(page_to_mfn(page)) extern void* xen_pickle_offset; #define __pickle(a) ((unsigned long)a - (unsigned long)xen_pickle_offset) diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-powerpc/mm.h --- a/xen/include/asm-powerpc/mm.h Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/include/asm-powerpc/mm.h Thu Nov 08 09:37:06 2007 -0700 @@ -111,7 +111,8 @@ struct page_info /* 29-bit count of references to this frame. */ #define PGC_count_mask ((1UL<<28)-1) -#define is_xen_heap_frame(pfn) (page_to_maddr(pfn) < xenheap_phys_end) +#define is_xen_heap_mfn(mfn) ((mfn) < paddr_to_pfn(xenheap_phys_end)) +#define is_xen_heap_page(page) (page_to_maddr(page) < xenheap_phys_end) static inline struct domain *unpickle_domptr(u32 _domain) { return ((_domain == 0) || (_domain & 1)) ? NULL : __va(_domain); } diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-x86/hvm/vmx/intel-iommu.h --- a/xen/include/asm-x86/hvm/vmx/intel-iommu.h Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/include/asm-x86/hvm/vmx/intel-iommu.h Thu Nov 08 09:37:06 2007 -0700 @@ -230,6 +230,19 @@ struct context_entry { do {(c).hi &= 0xff; (c).hi |= ((val + 1) & ((1 << 16) - 1)) << 8;} while(0) #define context_clear_entry(c) do {(c).lo = 0; (c).hi = 0;} while(0) +/* page table handling */ +#define LEVEL_STRIDE (9) +#define LEVEL_MASK ((1 << LEVEL_STRIDE) - 1) +#define agaw_to_level(val) ((val) + 2) +#define agaw_to_width(val) (30 + val * LEVEL_STRIDE) +#define width_to_agaw(w) ((w - 30)/LEVEL_STRIDE) +#define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE) +#define address_level_offset(addr, level) \ + ((addr >> level_to_offset_bits(level)) & LEVEL_MASK) +#define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l)) +#define level_size(l) (1 << level_to_offset_bits(l)) +#define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l)) + /* * 0: readable * 1: writable diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/asm-x86/mm.h --- a/xen/include/asm-x86/mm.h Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/include/asm-x86/mm.h Thu Nov 08 09:37:06 2007 -0700 @@ -102,9 +102,11 @@ struct page_info /* 26-bit count of references to this frame. */ #define PGC_count_mask ((1U<<26)-1) -#define is_xen_heap_frame(pfn) ({ \ - paddr_t maddr = page_to_maddr(pfn); \ - ((maddr >= xenheap_phys_start) && (maddr < xenheap_phys_end)); \ +#define is_xen_heap_page(page) is_xen_heap_mfn(page_to_mfn(page)) +#define is_xen_heap_mfn(mfn) ({ \ + unsigned long _mfn = (mfn); \ + ((_mfn >= paddr_to_pfn(xenheap_phys_start)) && \ + (_mfn < paddr_to_pfn(xenheap_phys_end))); \ }) #if defined(__i386__) diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/public/hvm/ioreq.h --- a/xen/include/public/hvm/ioreq.h Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/include/public/hvm/ioreq.h Thu Nov 08 09:37:06 2007 -0700 @@ -78,11 +78,12 @@ typedef struct shared_iopage shared_iopa typedef struct shared_iopage shared_iopage_t; struct buf_ioreq { - uint8_t type; /* I/O type */ - uint8_t dir:1; /* 1=read, 0=write */ - uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */ - uint32_t addr:20;/* physical address */ - uint32_t data; /* data */ + uint8_t type; /* I/O type */ + uint8_t df:1; /* EFLAGS.DF */ + uint8_t dir:1; /* 1=read, 0=write */ + uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */ + uint32_t addr:20;/* physical address */ + uint32_t data; /* data */ }; typedef struct buf_ioreq buf_ioreq_t; diff -r d0cd18d78074 -r ee935d2b8a63 xen/include/xen/hvm/save.h --- a/xen/include/xen/hvm/save.h Wed Nov 07 15:11:44 2007 -0700 +++ b/xen/include/xen/hvm/save.h Thu Nov 08 09:37:06 2007 -0700 @@ -155,7 +155,7 @@ int hvm_load(struct domain *d, hvm_domai /* Arch-specific definitions. */ struct hvm_save_header; -void arch_hvm_save(struct hvm_save_header *hdr); -int arch_hvm_load(struct hvm_save_header *hdr); +void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr); +int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr); #endif /* __XEN_HVM_SAVE_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |