From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Xen-devel@lists.xensource.com
Subject: [PATCH 09/24] PVH xen: Introduce PVH guest type and some basic changes.
Date: Wed, 17 Jul 2013 19:32:53 -0700 [thread overview]
Message-ID: <1374114788-27652-10-git-send-email-mukesh.rathor@oracle.com> (raw)
In-Reply-To: <1374114788-27652-1-git-send-email-mukesh.rathor@oracle.com>
This patch introduces the concept of a pvh guest. There are other basic
changes like creating macros to check for pv/pvh vcpu/domain, and also
modifying copy-macros to account for pvh. Finally, guest_kernel_mode is
changed to boast that a PVH doesn't need to check for TF_kernel_mode
flag since the kernel runs in ring 0.
Chagnes in V2:
- make is_pvh/is_hvm enum instead of adding is_pvh as a new flag.
- fix indentation and spacing in guest_kernel_mode macro.
- add debug only BUG() in GUEST_KERNEL_RPL macro as it should no longer
be called in any PVH paths.
Chagnes in V3:
- Rename enum fields, and add is_pv to it.
- Get rid if is_hvm_or_pvh_* macros.
Chagnes in V4:
- Move e820 fields out of pv_domain struct.
Chagnes in V5:
- Move e820 changes above in V4, to a separate patch.
Chagnes in V5:
- Rename enum guest_type from is_pv, ... to guest_type_pv, ....
Chagnes in V8:
- Got to VMCS for DPL check instead of checking the rpl in
guest_kernel_mode. Note, we drop the const qualifier from
vcpu_show_registers() to accomodate the hvm function call in
guest_kernel_mode().
- Also, hvm_kernel_mode is put in hvm.c because it's called from
guest_kernel_mode in regs.h which is a pretty early header include.
Hence, we can't place it in hvm.h like other similar functions.
Signed-off-by: Mukesh Rathor <mukesh.rathor@oracle.com>
---
xen/arch/x86/debug.c | 2 +-
xen/arch/x86/hvm/hvm.c | 8 ++++++++
xen/arch/x86/x86_64/traps.c | 2 +-
xen/common/domain.c | 2 +-
xen/include/asm-x86/desc.h | 4 +++-
xen/include/asm-x86/domain.h | 2 +-
xen/include/asm-x86/guest_access.h | 12 ++++++------
xen/include/asm-x86/x86_64/regs.h | 11 +++++++----
xen/include/public/domctl.h | 3 +++
xen/include/xen/sched.h | 21 ++++++++++++++++++---
10 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/xen/arch/x86/debug.c b/xen/arch/x86/debug.c
index e67473e..167421d 100644
--- a/xen/arch/x86/debug.c
+++ b/xen/arch/x86/debug.c
@@ -158,7 +158,7 @@ dbg_rw_guest_mem(dbgva_t addr, dbgbyte_t *buf, int len, struct domain *dp,
pagecnt = min_t(long, PAGE_SIZE - (addr & ~PAGE_MASK), len);
- mfn = (dp->is_hvm
+ mfn = (!is_pv_domain(dp)
? dbg_hvm_va2mfn(addr, dp, toaddr, &gfn)
: dbg_pv_va2mfn(addr, dp, pgd3));
if ( mfn == INVALID_MFN )
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 8284b3b..bac4708 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -4642,6 +4642,14 @@ enum hvm_intblk nhvm_interrupt_blocked(struct vcpu *v)
return hvm_funcs.nhvm_intr_blocked(v);
}
+bool_t hvm_kernel_mode(struct vcpu *v)
+{
+ struct segment_register seg;
+
+ hvm_get_segment_register(v, x86_seg_ss, &seg);
+ return (seg.attr.fields.dpl == 0);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c
index 9e0571d..feb50ff 100644
--- a/xen/arch/x86/x86_64/traps.c
+++ b/xen/arch/x86/x86_64/traps.c
@@ -141,7 +141,7 @@ void show_registers(struct cpu_user_regs *regs)
}
}
-void vcpu_show_registers(const struct vcpu *v)
+void vcpu_show_registers(struct vcpu *v)
{
const struct cpu_user_regs *regs = &v->arch.user_regs;
unsigned long crs[8];
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 6c264a5..38b1bad 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -236,7 +236,7 @@ struct domain *domain_create(
goto fail;
if ( domcr_flags & DOMCRF_hvm )
- d->is_hvm = 1;
+ d->guest_type = guest_type_hvm;
if ( domid == 0 )
{
diff --git a/xen/include/asm-x86/desc.h b/xen/include/asm-x86/desc.h
index 354b889..a4d4326 100644
--- a/xen/include/asm-x86/desc.h
+++ b/xen/include/asm-x86/desc.h
@@ -38,7 +38,9 @@
#ifndef __ASSEMBLY__
-#define GUEST_KERNEL_RPL(d) (is_pv_32bit_domain(d) ? 1 : 3)
+/* PVH 32bitfixme : see emulate_gate_op call from do_general_protection */
+#define GUEST_KERNEL_RPL(d) ({ ASSERT(!is_pvh_domain(d)); \
+ is_pv_32bit_domain(d) ? 1 : 3; })
/* Fix up the RPL of a guest segment selector. */
#define __fixup_guest_selector(d, sel) \
diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
index c3f9f8e..22a72df 100644
--- a/xen/include/asm-x86/domain.h
+++ b/xen/include/asm-x86/domain.h
@@ -447,7 +447,7 @@ struct arch_vcpu
#define hvm_svm hvm_vcpu.u.svm
void vcpu_show_execution_state(struct vcpu *);
-void vcpu_show_registers(const struct vcpu *);
+void vcpu_show_registers(struct vcpu *);
/* Clean up CR4 bits that are not under guest control. */
unsigned long pv_guest_cr4_fixup(const struct vcpu *, unsigned long guest_cr4);
diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h
index ca700c9..675dda1 100644
--- a/xen/include/asm-x86/guest_access.h
+++ b/xen/include/asm-x86/guest_access.h
@@ -14,27 +14,27 @@
/* Raw access functions: no type checking. */
#define raw_copy_to_guest(dst, src, len) \
- (is_hvm_vcpu(current) ? \
+ (!is_pv_vcpu(current) ? \
copy_to_user_hvm((dst), (src), (len)) : \
copy_to_user((dst), (src), (len)))
#define raw_copy_from_guest(dst, src, len) \
- (is_hvm_vcpu(current) ? \
+ (!is_pv_vcpu(current) ? \
copy_from_user_hvm((dst), (src), (len)) : \
copy_from_user((dst), (src), (len)))
#define raw_clear_guest(dst, len) \
- (is_hvm_vcpu(current) ? \
+ (!is_pv_vcpu(current) ? \
clear_user_hvm((dst), (len)) : \
clear_user((dst), (len)))
#define __raw_copy_to_guest(dst, src, len) \
- (is_hvm_vcpu(current) ? \
+ (!is_pv_vcpu(current) ? \
copy_to_user_hvm((dst), (src), (len)) : \
__copy_to_user((dst), (src), (len)))
#define __raw_copy_from_guest(dst, src, len) \
- (is_hvm_vcpu(current) ? \
+ (!is_pv_vcpu(current) ? \
copy_from_user_hvm((dst), (src), (len)) : \
__copy_from_user((dst), (src), (len)))
#define __raw_clear_guest(dst, len) \
- (is_hvm_vcpu(current) ? \
+ (!is_pv_vcpu(current) ? \
clear_user_hvm((dst), (len)) : \
clear_user((dst), (len)))
diff --git a/xen/include/asm-x86/x86_64/regs.h b/xen/include/asm-x86/x86_64/regs.h
index 3cdc702..63cb51a 100644
--- a/xen/include/asm-x86/x86_64/regs.h
+++ b/xen/include/asm-x86/x86_64/regs.h
@@ -10,10 +10,13 @@
#define ring_2(r) (((r)->cs & 3) == 2)
#define ring_3(r) (((r)->cs & 3) == 3)
-#define guest_kernel_mode(v, r) \
- (!is_pv_32bit_vcpu(v) ? \
- (ring_3(r) && ((v)->arch.flags & TF_kernel_mode)) : \
- (ring_1(r)))
+bool_t hvm_kernel_mode(struct vcpu *);
+
+#define guest_kernel_mode(v, r) \
+ (is_pvh_vcpu(v) ? (hvm_kernel_mode(v)) : \
+ (!is_pv_32bit_vcpu(v) ? \
+ (ring_3(r) && ((v)->arch.flags & TF_kernel_mode)) : \
+ (ring_1(r))))
#define permit_softint(dpl, v, r) \
((dpl) >= (guest_kernel_mode(v, r) ? 1 : 3))
diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
index 4c5b2bb..6b1aa11 100644
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -89,6 +89,9 @@ struct xen_domctl_getdomaininfo {
/* Being debugged. */
#define _XEN_DOMINF_debugged 6
#define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged)
+/* domain is PVH */
+#define _XEN_DOMINF_pvh_guest 7
+#define XEN_DOMINF_pvh_guest (1U<<_XEN_DOMINF_pvh_guest)
/* XEN_DOMINF_shutdown guest-supplied code. */
#define XEN_DOMINF_shutdownmask 255
#define XEN_DOMINF_shutdownshift 16
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index ae6a3b8..2d48d22 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -238,6 +238,14 @@ struct mem_event_per_domain
struct mem_event_domain access;
};
+/*
+ * PVH is a PV guest running in an HVM container. While is_hvm_* checks are
+ * false for it, it uses many of the HVM data structs.
+ */
+enum guest_type {
+ guest_type_pv, guest_type_pvh, guest_type_hvm
+};
+
struct domain
{
domid_t domain_id;
@@ -285,8 +293,8 @@ struct domain
struct rangeset *iomem_caps;
struct rangeset *irq_caps;
- /* Is this an HVM guest? */
- bool_t is_hvm;
+ enum guest_type guest_type;
+
#ifdef HAS_PASSTHROUGH
/* Does this guest need iommu mappings? */
bool_t need_iommu;
@@ -464,6 +472,9 @@ struct domain *domain_create(
/* DOMCRF_oos_off: dont use out-of-sync optimization for shadow page tables */
#define _DOMCRF_oos_off 4
#define DOMCRF_oos_off (1U<<_DOMCRF_oos_off)
+ /* DOMCRF_pvh: Create PV domain in HVM container. */
+#define _DOMCRF_pvh 5
+#define DOMCRF_pvh (1U<<_DOMCRF_pvh)
/*
* rcu_lock_domain_by_id() is more efficient than get_domain_by_id().
@@ -732,8 +743,12 @@ void watchdog_domain_destroy(struct domain *d);
#define VM_ASSIST(_d,_t) (test_bit((_t), &(_d)->vm_assist))
-#define is_hvm_domain(d) ((d)->is_hvm)
+#define is_pv_domain(d) ((d)->guest_type == guest_type_pv)
+#define is_pv_vcpu(v) (is_pv_domain((v)->domain))
+#define is_hvm_domain(d) ((d)->guest_type == guest_type_hvm)
#define is_hvm_vcpu(v) (is_hvm_domain(v->domain))
+#define is_pvh_domain(d) ((d)->guest_type == guest_type_pvh)
+#define is_pvh_vcpu(v) (is_pvh_domain((v)->domain))
#define is_pinned_vcpu(v) ((v)->domain->is_pinned || \
cpumask_weight((v)->cpu_affinity) == 1)
#ifdef HAS_PASSTHROUGH
--
1.7.2.3
next prev parent reply other threads:[~2013-07-18 2:32 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-18 2:32 [PATCH 00/24][V8]PVH xen: Phase I, Version 8 patches Mukesh Rathor
2013-07-18 2:32 ` [PATCH 01/24] PVH xen: Add readme docs/misc/pvh-readme.txt Mukesh Rathor
2013-07-18 10:09 ` Ian Campbell
2013-07-18 18:21 ` Mukesh Rathor
2013-07-19 9:16 ` Ian Campbell
2013-07-19 21:33 ` Mukesh Rathor
2013-07-22 18:21 ` Ian Campbell
2013-07-18 10:32 ` Jan Beulich
2013-07-18 10:40 ` Ian Campbell
2013-07-22 19:29 ` Konrad Rzeszutek Wilk
2013-07-18 2:32 ` [PATCH 02/24] PVH xen: update __XEN_LATEST_INTERFACE_VERSION__ Mukesh Rathor
2013-07-18 10:33 ` Jan Beulich
2013-07-18 2:32 ` [PATCH 03/24] PVH xen: turn gdb_frames/gdt_ents into union Mukesh Rathor
2013-07-22 19:22 ` Konrad Rzeszutek Wilk
2013-07-18 2:32 ` [PATCH 04/24] PVH xen: add params to read_segment_register Mukesh Rathor
2013-07-18 2:32 ` [PATCH 05/24] PVH xen: Move e820 fields out of pv_domain struct Mukesh Rathor
2013-07-18 2:32 ` [PATCH 06/24] PVH xen: hvm related preparatory changes for PVH Mukesh Rathor
2013-07-18 10:37 ` Jan Beulich
2013-07-18 2:32 ` [PATCH 07/24] PVH xen: vmx " Mukesh Rathor
2013-07-18 12:29 ` Jan Beulich
2013-07-18 2:32 ` [PATCH 08/24] PVH xen: vmcs " Mukesh Rathor
2013-07-18 12:32 ` Jan Beulich
2013-07-18 2:32 ` Mukesh Rathor [this message]
2013-07-18 12:43 ` [PATCH 09/24] PVH xen: Introduce PVH guest type and some basic changes Jan Beulich
2013-07-18 18:28 ` Mukesh Rathor
2013-07-18 2:32 ` [PATCH 10/24] PVH xen: introduce pvh_set_vcpu_info() and vmx_pvh_set_vcpu_info() Mukesh Rathor
2013-07-18 13:14 ` Jan Beulich
2013-07-18 18:37 ` Mukesh Rathor
2013-07-18 2:32 ` [PATCH 11/24] PVH xen: domain create, schedular related code changes Mukesh Rathor
2013-07-18 13:16 ` Jan Beulich
2013-07-18 2:32 ` [PATCH 12/24] PVH xen: support invalid op emulation for PVH Mukesh Rathor
2013-07-18 13:17 ` Jan Beulich
2013-07-18 2:32 ` [PATCH 13/24] PVH xen: Support privileged " Mukesh Rathor
2013-07-18 13:29 ` Jan Beulich
2013-07-18 2:32 ` [PATCH 14/24] PVH xen: interrupt/event-channel delivery to PVH Mukesh Rathor
2013-07-22 19:21 ` Konrad Rzeszutek Wilk
2013-07-18 2:32 ` [PATCH 15/24] PVH xen: additional changes to support PVH guest creation and execution Mukesh Rathor
2013-07-22 19:25 ` Konrad Rzeszutek Wilk
2013-07-18 2:33 ` [PATCH 16/24] PVH xen: mapcache and show registers Mukesh Rathor
2013-07-18 2:33 ` [PATCH 17/24] PVH xen: mtrr, tsc, grant changes Mukesh Rathor
2013-07-18 2:33 ` [PATCH 18/24] PVH xen: Checks, asserts, and limitations for PVH Mukesh Rathor
2013-07-18 13:49 ` Jan Beulich
2013-07-18 2:33 ` [PATCH 19/24] PVH xen: add hypercall support " Mukesh Rathor
2013-07-18 13:56 ` Jan Beulich
2013-07-18 2:33 ` [PATCH 20/24] PVH xen: vmcs related changes Mukesh Rathor
2013-07-18 2:33 ` [PATCH 21/24] PVH xen: HVM support of PVH guest creation/destruction Mukesh Rathor
2013-07-22 19:22 ` Konrad Rzeszutek Wilk
2013-07-18 2:33 ` [PATCH 22/24] PVH xen: VMX " Mukesh Rathor
2013-07-22 19:15 ` Konrad Rzeszutek Wilk
2013-07-18 2:33 ` [PATCH 23/24] PVH xen: preparatory patch for the pvh vmexit handler patch Mukesh Rathor
2013-07-22 19:24 ` Konrad Rzeszutek Wilk
2013-07-18 2:33 ` [PATCH 24/24] PVH xen: introduce vmexit handler for PVH Mukesh Rathor
2013-07-18 10:47 ` [PATCH 00/24][V8]PVH xen: Phase I, Version 8 patches Roger Pau Monné
2013-07-19 1:23 ` 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=1374114788-27652-10-git-send-email-mukesh.rathor@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).