From: Christoph Egger <Christoph.Egger@amd.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [PATCH 03/12] Nested Virtualization: function hooks
Date: Mon, 20 Dec 2010 17:04:40 +0100 [thread overview]
Message-ID: <201012201704.40249.Christoph.Egger@amd.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 264 bytes --]
--
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
[-- Attachment #2: xen_nh03_hooks.diff --]
[-- Type: text/x-diff, Size: 5740 bytes --]
# HG changeset patch
# User cegger
# Date 1292839430 -3600
add nestedhvm function hooks for svm/vmx specific code
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
diff -r 0797c3ecd8fd -r e43ab6fb0ee2 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -3485,6 +3485,89 @@ int hvm_debug_op(struct vcpu *v, int32_t
}
+int nhvm_vcpu_initialise(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vcpu_initialise)
+ return hvm_funcs.nhvm_vcpu_initialise(v);
+ return -EOPNOTSUPP;
+}
+
+int nhvm_vcpu_destroy(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vcpu_destroy)
+ return hvm_funcs.nhvm_vcpu_destroy(v);
+ return -EOPNOTSUPP;
+}
+
+int nhvm_vcpu_reset(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vcpu_reset)
+ return hvm_funcs.nhvm_vcpu_reset(v);
+ return -EOPNOTSUPP;
+}
+
+int nhvm_vcpu_hostrestore(struct vcpu *v, struct cpu_user_regs *regs)
+{
+ if (hvm_funcs.nhvm_vcpu_hostrestore)
+ return hvm_funcs.nhvm_vcpu_hostrestore(v, regs);
+ return -EOPNOTSUPP;
+}
+
+int nhvm_vcpu_vmexit(struct vcpu *v, struct cpu_user_regs *regs,
+ uint64_t exitcode)
+{
+ if (hvm_funcs.nhvm_vcpu_vmexit)
+ return hvm_funcs.nhvm_vcpu_vmexit(v, regs, exitcode);
+ return -EOPNOTSUPP;
+}
+
+int
+nhvm_vcpu_vmexit_trap(struct vcpu *v, unsigned int trapnr,
+ int errcode, unsigned long cr2)
+{
+ return hvm_funcs.nhvm_vcpu_vmexit_trap(v, trapnr, errcode, cr2);
+}
+
+uint64_t nhvm_vcpu_guestcr3(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vcpu_guestcr3)
+ return hvm_funcs.nhvm_vcpu_guestcr3(v);
+ return -EOPNOTSUPP;
+}
+
+uint64_t nhvm_vcpu_hostcr3(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vcpu_hostcr3)
+ return hvm_funcs.nhvm_vcpu_hostcr3(v);
+ return -EOPNOTSUPP;
+}
+
+uint32_t nhvm_vcpu_asid(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vcpu_asid)
+ return hvm_funcs.nhvm_vcpu_asid(v);
+ return -EOPNOTSUPP;
+}
+
+int nhvm_vmcx_guest_intercepts_trap(struct vcpu *v, unsigned int trap)
+{
+ if (hvm_funcs.nhvm_vmcx_guest_intercepts_trap)
+ return hvm_funcs.nhvm_vmcx_guest_intercepts_trap(v, trap);
+ return -EOPNOTSUPP;
+}
+
+bool_t nhvm_vmcx_hap_enabled(struct vcpu *v)
+{
+ if (hvm_funcs.nhvm_vmcx_hap_enabled)
+ return hvm_funcs.nhvm_vmcx_hap_enabled(v);
+ return -EOPNOTSUPP;
+}
+
+enum hvm_intblk nhvm_interrupt_blocked(struct vcpu *v)
+{
+ return hvm_funcs.nhvm_intr_blocked(v);
+}
+
/*
* Local variables:
* mode: C
diff -r 0797c3ecd8fd -r e43ab6fb0ee2 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -145,6 +145,27 @@ struct hvm_function_table {
void (*set_uc_mode)(struct vcpu *v);
void (*set_info_guest)(struct vcpu *v);
void (*set_rdtsc_exiting)(struct vcpu *v, bool_t);
+
+ /* Nested HVM */
+ int (*nhvm_vcpu_initialise)(struct vcpu *v);
+ int (*nhvm_vcpu_destroy)(struct vcpu *v);
+ int (*nhvm_vcpu_reset)(struct vcpu *v);
+ int (*nhvm_vcpu_hostrestore)(struct vcpu *v,
+ struct cpu_user_regs *regs);
+ int (*nhvm_vcpu_vmexit)(struct vcpu *v, struct cpu_user_regs *regs,
+ uint64_t exitcode);
+ int (*nhvm_vcpu_vmexit_trap)(struct vcpu *v,
+ unsigned int trapnr,
+ int errcode,
+ unsigned long cr2);
+ uint64_t (*nhvm_vcpu_guestcr3)(struct vcpu *v);
+ uint64_t (*nhvm_vcpu_hostcr3)(struct vcpu *v);
+ uint32_t (*nhvm_vcpu_asid)(struct vcpu *v);
+ int (*nhvm_vmcx_guest_intercepts_trap)(struct vcpu *v, unsigned int trapnr);
+
+ bool_t (*nhvm_vmcx_hap_enabled)(struct vcpu *v);
+
+ enum hvm_intblk (*nhvm_intr_blocked)(struct vcpu *v);
};
extern struct hvm_function_table hvm_funcs;
@@ -368,4 +389,44 @@ bool_t hvm_hap_nested_page_fault(unsigne
int hvm_x2apic_msr_read(struct vcpu *v, unsigned int msr, uint64_t *msr_content);
int hvm_x2apic_msr_write(struct vcpu *v, unsigned int msr, uint64_t msr_content);
+/*
+ * Nested HVM
+ */
+
+/* Initialize vcpu's struct nestedhvm */
+int nhvm_vcpu_initialise(struct vcpu *v);
+/* Destroy and free vcpu's struct nestedhvm */
+int nhvm_vcpu_destroy(struct vcpu *v);
+/* Reset vcpu's state when l1 guest disables nested virtualization */
+int nhvm_vcpu_reset(struct vcpu *v);
+/* Restores l1 guest state */
+int nhvm_vcpu_hostrestore(struct vcpu *v, struct cpu_user_regs *regs);
+/* Fill l1 guest's VMCB/VMCS with data provided by generic exit codes
+ * (do conversion as needed), other misc SVM/VMX specific tweaks to make
+ * it work */
+int nhvm_vcpu_vmexit(struct vcpu *v, struct cpu_user_regs *regs,
+ uint64_t exitcode);
+/* inject vmexit into l1 guest. l1 guest will see a VMEXIT due to
+ * 'trapnr' exception.
+ */
+int nhvm_vcpu_vmexit_trap(struct vcpu *v,
+ unsigned int trapnr, int errcode, unsigned long cr2);
+
+/* returns l2 guest cr3 in l2 guest physical address space. */
+uint64_t nhvm_vcpu_guestcr3(struct vcpu *v);
+/* returns l1 guest's cr3 that points to the page table used to
+ * translate l2 guest physical address to l1 guest physical address.
+ */
+uint64_t nhvm_vcpu_hostcr3(struct vcpu *v);
+/* returns the asid number l1 guest wants to use to run the l2 guest */
+uint32_t nhvm_vcpu_asid(struct vcpu *v);
+
+/* returns true, when l1 guest intercepts the specified trap */
+int nhvm_vmcx_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr);
+
+/* returns true when l1 guest wants to use hap to run l2 guest */
+bool_t nhvm_vmcx_hap_enabled(struct vcpu *v);
+/* interrupt */
+enum hvm_intblk nhvm_interrupt_blocked(struct vcpu *v);
+
#endif /* __ASM_X86_HVM_HVM_H__ */
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2010-12-20 16:04 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-20 16:04 Christoph Egger [this message]
-- strict thread matches above, loose matches on Subject: below --
2011-03-09 14:23 [PATCH 03/12] Nested Virtualization: function hooks Christoph Egger
2011-03-28 14:03 ` Dong, Eddie
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=201012201704.40249.Christoph.Egger@amd.com \
--to=christoph.egger@amd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.