# 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__ */