Nested Virtualization: function hooks
PATCH 4/15 Nested Virtualization: function hooks
Signed-off-by Christoph Egger <[email protected]>
Signature · 6 lines
---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
# HG changeset patch
# User cegger
# Date 1274774458 -7200
add nestedhvm function hooks for svm/vmx specific code
xen/arch/x86/hvm/hvm.c +73 -0
@@ -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
xen/include/asm-x86/hvm/hvm.h +32 -0
@@ -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__ */
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel