[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 12/16]: PVH xen: return PVH features during creation, etc...
Debug.c: we don't need to lock the page, as no path it's called from requires that. traps.c: need to inject PF or other exception in PVH case. Signed-off-by: Mukesh Rathor <mukesh.rathor@xxxxxxxxxx> diff -r 33fc5356ad7c -r 31a145002453 xen/arch/x86/debug.c --- a/xen/arch/x86/debug.c Fri Jan 11 16:35:48 2013 -0800 +++ b/xen/arch/x86/debug.c Fri Jan 11 16:38:07 2013 -0800 @@ -59,7 +59,7 @@ dbg_hvm_va2mfn(dbgva_t vaddr, struct dom return INVALID_MFN; } - mfn = mfn_x(get_gfn(dp, *gfn, &gfntype)); + mfn = mfn_x(get_gfn_query_unlocked(dp, *gfn, &gfntype)); if ( p2m_is_readonly(gfntype) && toaddr ) { DBGP2("kdb:p2m_is_readonly: gfntype:%x\n", gfntype); @@ -153,7 +153,7 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t pagecnt = min_t(long, PAGE_SIZE - (addr & ~PAGE_MASK), len); - mfn = (dp->is_hvm + mfn = (is_hvm_or_pvh_domain(dp) ? dbg_hvm_va2mfn(addr, dp, toaddr, &gfn) : dbg_pv_va2mfn(addr, dp, pgd3)); if ( mfn == INVALID_MFN ) @@ -173,8 +173,6 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t } unmap_domain_page(va); - if ( gfn != INVALID_GFN ) - put_gfn(dp, gfn); addr += pagecnt; buf += pagecnt; diff -r 33fc5356ad7c -r 31a145002453 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Fri Jan 11 16:35:48 2013 -0800 +++ b/xen/arch/x86/traps.c Fri Jan 11 16:38:07 2013 -0800 @@ -470,6 +470,11 @@ static unsigned int check_guest_io_break unsigned int width, i, match = 0; unsigned long start; + if ( is_pvh_vcpu(v) ) { + /* for pvh, ctrlreg field is not implemented/used unless we need to */ + /* printk("PVH: fixme: (ctrlreg) check_guest_io_breakpoint\n"); */ + return 0; + } if ( !(v->arch.debugreg[5]) || !(v->arch.pv_vcpu.ctrlreg[4] & X86_CR4_DE) ) return 0; @@ -910,6 +915,10 @@ int emulate_forced_invalid_op(struct cpu /* Check for forced emulation signature: ud2 ; .ascii "xen". */ if ( (rc = copy_from_user(sig, (char *)eip, sizeof(sig))) != 0 ) { + /* PVH: fixme: hmm... what do we do for PVH? */ + if ( is_pvh_vcpu(current) ) + return 0; + propagate_page_fault(eip + sizeof(sig) - rc, 0); return EXCRET_fault_fixed; } @@ -920,6 +929,10 @@ int emulate_forced_invalid_op(struct cpu /* We only emulate CPUID. */ if ( ( rc = copy_from_user(instr, (char *)eip, sizeof(instr))) != 0 ) { + /* PVH: fixme: hmm... what do we do for PVH? */ + if ( is_pvh_vcpu(current) ) + return 0; + propagate_page_fault(eip + sizeof(instr) - rc, 0); return EXCRET_fault_fixed; } @@ -1063,6 +1076,10 @@ void propagate_page_fault(unsigned long struct vcpu *v = current; struct trap_bounce *tb = &v->arch.pv_vcpu.trap_bounce; + /* PVH should not get here. ctrlreg is not implemented amongst other + * things */ + NO_PVH_ASSERT_VCPU(v); + v->arch.pv_vcpu.ctrlreg[2] = addr; arch_set_cr2(v, addr); @@ -1448,6 +1465,9 @@ static int read_descriptor(unsigned int { struct desc_struct desc; + if ( is_pvh_vcpu(v) ) + return hvm_pvh_read_descriptor(sel, v, regs, base, limit, ar); + if ( !vm86_mode(regs) ) { if ( sel < 4) @@ -1566,6 +1586,10 @@ static int guest_io_okay( int user_mode = !(v->arch.flags & TF_kernel_mode); #define TOGGLE_MODE() if ( user_mode ) toggle_guest_mode(v) + /* for PVH we check this in vmexit for EXIT_REASON_IO_INSTRUCTION */ + if (is_pvh_vcpu(v)) + return 1; + if ( !vm86_mode(regs) && (v->arch.pv_vcpu.iopl >= (guest_kernel_mode(v, regs) ? 1 : 3)) ) return 1; @@ -1811,8 +1835,9 @@ static inline uint64_t guest_misc_enable _ptr = (unsigned int)_ptr; \ if ( (limit) < sizeof(_x) - 1 || (eip) > (limit) - (sizeof(_x) - 1) ) \ goto fail; \ - if ( (_rc = copy_from_user(&_x, (type *)_ptr, sizeof(_x))) != 0 ) \ + if ( (_rc = raw_copy_from_guest(&_x, (type *)_ptr, sizeof(_x))) != 0 ) \ { \ + /* PVH: fixme: probably return -EFAULT ??? */ \ propagate_page_fault(_ptr + sizeof(_x) - _rc, 0); \ goto skip; \ } \ @@ -2132,7 +2157,8 @@ int emulate_privileged_op(struct cpu_use case 0xfa: /* CLI */ case 0xfb: /* STI */ - if ( v->arch.pv_vcpu.iopl < (guest_kernel_mode(v, regs) ? 1 : 3) ) + if ( !is_pvh_vcpu(v) && + v->arch.pv_vcpu.iopl < (guest_kernel_mode(v, regs) ? 1 : 3) ) goto fail; /* * This is just too dangerous to allow, in my opinion. Consider if the @@ -3224,6 +3250,9 @@ void do_device_not_available(struct cpu_ BUG_ON(!guest_mode(regs)); + /* PVH should not get here. ctrlreg is not implemented */ + NO_PVH_ASSERT_VCPU(curr); + vcpu_restore_fpu_lazy(curr); if ( curr->arch.pv_vcpu.ctrlreg[0] & X86_CR0_TS ) diff -r 33fc5356ad7c -r 31a145002453 xen/arch/x86/x86_64/traps.c --- a/xen/arch/x86/x86_64/traps.c Fri Jan 11 16:35:48 2013 -0800 +++ b/xen/arch/x86/x86_64/traps.c Fri Jan 11 16:38:07 2013 -0800 @@ -152,7 +152,7 @@ void vcpu_show_registers(const struct vc unsigned long crs[8]; /* No need to handle HVM for now. */ - if ( is_hvm_vcpu(v) ) + if ( is_hvm_or_pvh_vcpu(v) ) return; crs[0] = v->arch.pv_vcpu.ctrlreg[0]; @@ -444,6 +444,8 @@ static long register_guest_callback(stru long ret = 0; struct vcpu *v = current; + NO_PVH_ASSERT_VCPU(v); + if ( !is_canonical_address(reg->address) ) return -EINVAL; @@ -624,7 +626,7 @@ static void hypercall_page_initialise_ri void hypercall_page_initialise(struct domain *d, void *hypercall_page) { memset(hypercall_page, 0xCC, PAGE_SIZE); - if ( is_hvm_domain(d) ) + if ( is_hvm_or_pvh_domain(d) ) hvm_hypercall_page_initialise(d, hypercall_page); else if ( !is_pv_32bit_domain(d) ) hypercall_page_initialise_ring3_kernel(hypercall_page); diff -r 33fc5356ad7c -r 31a145002453 xen/common/domain.c --- a/xen/common/domain.c Fri Jan 11 16:35:48 2013 -0800 +++ b/xen/common/domain.c Fri Jan 11 16:38:07 2013 -0800 @@ -232,6 +232,14 @@ struct domain *domain_create( if ( domcr_flags & DOMCRF_hvm ) d->is_hvm = 1; + else if ( domcr_flags & DOMCRF_pvh ) { + d->is_pvh = 1; + if ( !(domcr_flags & DOMCRF_hap) ) { + printk("PVH guest must have HAP on\n"); + goto fail; + } else + printk("Yay... PVH guest. domid:%d\n", domid); + } if ( domid == 0 ) { diff -r 33fc5356ad7c -r 31a145002453 xen/common/domctl.c --- a/xen/common/domctl.c Fri Jan 11 16:35:48 2013 -0800 +++ b/xen/common/domctl.c Fri Jan 11 16:38:07 2013 -0800 @@ -149,6 +149,8 @@ void getdomaininfo(struct domain *d, str if ( is_hvm_domain(d) ) info->flags |= XEN_DOMINF_hvm_guest; + else if ( is_pvh_domain(d) ) + info->flags |= XEN_DOMINF_pvh_guest; xsm_security_domaininfo(d, info); @@ -449,6 +451,8 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xe domcr_flags = 0; if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hvm_guest ) domcr_flags |= DOMCRF_hvm; + else if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hap ) + domcr_flags |= DOMCRF_pvh; /* PV with HAP is a PVH guest */ if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_hap ) domcr_flags |= DOMCRF_hap; if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_s3_integrity ) diff -r 33fc5356ad7c -r 31a145002453 xen/common/kernel.c --- a/xen/common/kernel.c Fri Jan 11 16:35:48 2013 -0800 +++ b/xen/common/kernel.c Fri Jan 11 16:38:07 2013 -0800 @@ -289,7 +289,11 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDL if ( current->domain == dom0 ) fi.submap |= 1U << XENFEAT_dom0; #ifdef CONFIG_X86 - if ( !is_hvm_vcpu(current) ) + if ( is_pvh_vcpu(current) ) + fi.submap |= (1U << XENFEAT_hvm_safe_pvclock) | + (1U << XENFEAT_supervisor_mode_kernel) | + (1U << XENFEAT_hvm_callback_vector); + else if ( !is_hvm_vcpu(current) ) fi.submap |= (1U << XENFEAT_mmu_pt_update_preserve_ad) | (1U << XENFEAT_highmem_assist) | (1U << XENFEAT_gnttab_map_avail_bits); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |