From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Egger Subject: [PATCH 04/14] Nested Virtualization: function hooks Date: Thu, 5 Aug 2010 17:01:03 +0200 Message-ID: <201008051701.04015.Christoph.Egger@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_wItWM6/zUhrmJTD" 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=_wItWM6/zUhrmJTD 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: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --Boundary-00=_wItWM6/zUhrmJTD 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 1280925498 -7200 add nestedhvm function hooks for svm/vmx specific code diff -r 79a75ef7b7d0 -r c19b4e3959c5 xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3257,6 +3257,96 @@ 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_reset(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vcpu_reset) + return hvm_funcs.nestedhvm_vcpu_reset(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_vmentry(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vcpu_vmentry) + return hvm_funcs.nestedhvm_vcpu_vmentry(v); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vcpu_vmexit(struct vcpu *v, struct cpu_user_regs *regs, + uint64_t exitcode) +{ + if (hvm_funcs.nestedhvm_vcpu_vmexit) + return hvm_funcs.nestedhvm_vcpu_vmexit(v, regs, exitcode); + return -EOPNOTSUPP; +} + +uint64_t hvm_nestedhvm_vm_exitcode_native2generic(struct vcpu *v, + struct cpu_user_regs *regs, uint64_t exitcode, + uint64_t *info1, uint64_t *info2) +{ + if (hvm_funcs.nestedhvm_vm_exitcode_native2generic) + return hvm_funcs.nestedhvm_vm_exitcode_native2generic(v, regs, + exitcode, info1, info2); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vm_intercepted_by_guest(struct vcpu *v, uint64_t exitcode) +{ + if (hvm_funcs.nestedhvm_vm_intercepted_by_guest) + return hvm_funcs.nestedhvm_vm_intercepted_by_guest(v, exitcode); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vm_prepare4vmentry(struct vcpu *v, struct cpu_user_regs *regs) +{ + if (hvm_funcs.nestedhvm_vm_prepare4vmentry) + return hvm_funcs.nestedhvm_vm_prepare4vmentry(v, regs); + return -EOPNOTSUPP; +} + +int hvm_nestedhvm_vm_prepare4vmexit(struct vcpu *v) +{ + if (hvm_funcs.nestedhvm_vm_prepare4vmexit) + return hvm_funcs.nestedhvm_vm_prepare4vmexit(v); + return -EOPNOTSUPP; +} + + /* * Local variables: * mode: C diff -r 79a75ef7b7d0 -r c19b4e3959c5 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,26 @@ 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_reset)(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_vmentry)(struct vcpu *v); + int (*nestedhvm_vcpu_vmexit)(struct vcpu *v, struct cpu_user_regs *regs, + uint64_t exitcode); + uint64_t (*nestedhvm_vm_exitcode_native2generic)(struct vcpu *v, + struct cpu_user_regs *regs, uint64_t exitcode, + uint64_t *info1, uint64_t *info2); + int (*nestedhvm_vm_intercepted_by_guest)(struct vcpu *v, uint64_t exitcode); + int (*nestedhvm_vm_prepare4vmentry)(struct vcpu *v, + struct cpu_user_regs *regs); + int (*nestedhvm_vm_prepare4vmexit)(struct vcpu *v); }; extern struct hvm_function_table hvm_funcs; @@ -363,4 +383,22 @@ 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_reset(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_vmentry(struct vcpu *v); +int hvm_nestedhvm_vcpu_vmexit(struct vcpu *v, struct cpu_user_regs *regs, + uint64_t exitcode); +uint64_t hvm_nestedhvm_vm_exitcode_native2generic(struct vcpu *v, + struct cpu_user_regs *regs, uint64_t exitcode, + uint64_t *info1, uint64_t *info2); +int hvm_nestedhvm_vm_intercepted_by_guest(struct vcpu *v, uint64_t exitcode); +int hvm_nestedhvm_vm_prepare4vmentry(struct vcpu *v, struct cpu_user_regs *regs); +int hvm_nestedhvm_vm_prepare4vmexit(struct vcpu *v); + #endif /* __ASM_X86_HVM_HVM_H__ */ --Boundary-00=_wItWM6/zUhrmJTD 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=_wItWM6/zUhrmJTD--