From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
Subject: [RFC PATCH 12/16]: PVH xen: return PVH features during creation, etc...
Date: Fri, 11 Jan 2013 18:07:36 -0800 [thread overview]
Message-ID: <20130111180736.36c662d6@mantra.us.oracle.com> (raw)
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@oracle.com>
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);
next reply other threads:[~2013-01-12 2:07 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-12 2:07 Mukesh Rathor [this message]
2013-01-14 12:20 ` [RFC PATCH 12/16]: PVH xen: return PVH features during creation, etc Jan Beulich
2013-01-17 23:36 ` Mukesh Rathor
2013-01-18 2:29 ` Mukesh Rathor
2013-01-18 9:23 ` Jan Beulich
2013-01-18 20:41 ` Mukesh Rathor
2013-01-24 16:57 ` Tim Deegan
2013-01-25 2:08 ` Mukesh Rathor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130111180736.36c662d6@mantra.us.oracle.com \
--to=mukesh.rathor@oracle.com \
--cc=Xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).