From: Christoph Egger Subject: [PATCH 4/15] Nested Virtualization: function hooks Date: Thu, 3 Jun 2010 18:08:19 +0200 Message-ID: <201006031808.19414.Christoph.Egger@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_zN9BMxE8VBWAGIs" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --Boundary-00=_zN9BMxE8VBWAGIs Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Signed-off-by: Christoph Egger -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --Boundary-00=_zN9BMxE8VBWAGIs Content-Type: text/x-diff; charset="iso 8859-15"; name="xen_nh04_hooks.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen_nh04_hooks.diff" # HG changeset patch # User cegger # Date 1274774458 -7200 add nestedhvm function hooks for svm/vmx specific code diff -r 9dd987bc025b -r 66478f884c4b xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3198,6 +3198,79 @@ int hvm_debug_op(struct vcpu *v, int32_t } +int hvm_nestedhvm_vcpu_initialise(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vcpu_initialise) + return hvm_funcs.nestedhvm_vcpu_initialise(v); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_destroy(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vcpu_destroy) + return hvm_funcs.nestedhvm_vcpu_destroy(v); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_features(struct vcpu *v, + uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) +{ + if (hvm_funcs.nestedhvm_vcpu_features) + return hvm_funcs.nestedhvm_vcpu_features(v, eax, ebx, ecx, edx); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_hostsave(struct vcpu *v, unsigned int inst_len) +{ + if (hvm_funcs.nestedhvm_vcpu_hostsave) + return hvm_funcs.nestedhvm_vcpu_hostsave(v, inst_len); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_hostrestore(struct vcpu *v, struct cpu_user_regs *regs) +{ + if (hvm_funcs.nestedhvm_vcpu_hostrestore) + return hvm_funcs.nestedhvm_vcpu_hostrestore(v, regs); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_vmsave(struct vcpu *v, uint64_t vmcbaddr) +{ + if (hvm_funcs.nestedhvm_vcpu_vmsave) + return hvm_funcs.nestedhvm_vcpu_vmsave(v, vmcbaddr); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_vmload(struct vcpu *v, uint64_t vmcbaddr) +{ + if (hvm_funcs.nestedhvm_vcpu_vmload) + return hvm_funcs.nestedhvm_vcpu_vmload(v, vmcbaddr); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vmcb_prepare4vmrun(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vmcb_prepare4vmrun) + return hvm_funcs.nestedhvm_vmcb_prepare4vmrun(v); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_vmrun(struct vcpu *v, struct cpu_user_regs *regs, + unsigned int flags) +{ + if (hvm_funcs.nestedhvm_vcpu_vmrun) + return hvm_funcs.nestedhvm_vcpu_vmrun(v, regs, flags); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vmcb_prepare4vmexit(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vmcb_prepare4vmexit) + return hvm_funcs.nestedhvm_vmcb_prepare4vmexit(v); + return -EOPNOTSUPP; +} + + /* * Local variables: * mode: C diff -r 9dd987bc025b -r 66478f884c4b xen/include/asm-x86/hvm/hvm.h --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -134,6 +134,21 @@ 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 (*nestedhvm_vcpu_initialise)(struct vcpu *v); + int (*nestedhvm_vcpu_destroy)(struct vcpu *v); + int (*nestedhvm_vcpu_features)(struct vcpu *v, + uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); + int (*nestedhvm_vcpu_hostsave)(struct vcpu *v, unsigned int inst_len); + int (*nestedhvm_vcpu_hostrestore)(struct vcpu *v, + struct cpu_user_regs *regs); + int (*nestedhvm_vcpu_vmload)(struct vcpu *v, uint64_t vmcbaddr); + int (*nestedhvm_vcpu_vmsave)(struct vcpu *v, uint64_t vmcbaddr); + int (*nestedhvm_vcpu_vmrun)(struct vcpu *v, struct cpu_user_regs *regs, + unsigned int flags); + int (*nestedhvm_vmcb_prepare4vmrun)(struct vcpu *v); + int (*nestedhvm_vmcb_prepare4vmexit)(struct vcpu *v); }; extern struct hvm_function_table hvm_funcs; @@ -347,4 +362,21 @@ bool_t hvm_hap_nested_page_fault(unsigne ? (u32)__d->arch.incarnation : (u32)(v)->arch.hvm_vcpu.msr_tsc_aux; \ }) +/* Nested HVM */ +int hvm_nestedhvm_vcpu_initialise(struct vcpu *v); +int hvm_nestedhvm_vcpu_destroy(struct vcpu *v); +int hvm_nestedhvm_vcpu_features(struct vcpu *v, + uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); +int hvm_nestedhvm_vcpu_hostsave(struct vcpu *v, unsigned int inst_len); +int hvm_nestedhvm_vcpu_hostrestore(struct vcpu *v, struct cpu_user_regs *regs); +int hvm_nestedhvm_vcpu_vmsave(struct vcpu *v, uint64_t vmcbaddr); +int hvm_nestedhvm_vcpu_vmload(struct vcpu *v, uint64_t vmcbaddr); +#define NESTEDHVM_VMRUN_INTERCEPT (1U << 0) /* VMRUN intercept */ +#define NESTEDHVM_VMRUN_VMEXIT (1U << 1) /* resume from VMEXIT */ +int hvm_nestedhvm_vcpu_vmrun(struct vcpu *v, struct cpu_user_regs *regs, + unsigned int flags); +int hvm_nestedhvm_vmcb_eventinject(struct vcpu *v, uint64_t exitcode); +int hvm_nestedhvm_vmcb_prepare4vmrun(struct vcpu *v); +int hvm_nestedhvm_vmcb_prepare4vmexit(struct vcpu *v); + #endif /* __ASM_X86_HVM_HVM_H__ */ --Boundary-00=_zN9BMxE8VBWAGIs Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --Boundary-00=_zN9BMxE8VBWAGIs--