passive_domain_destroy(v);
}
-static void svm_inject_trap(struct hvm_trap *trap)
+static void svm_inject_trap(const struct hvm_trap *trap)
{
struct vcpu *curr = current;
struct vmcb_struct *vmcb = curr->arch.hvm_svm.vmcb;
if ( !printed )
printk(" - none\n");
- svm_function_table.hap_supported = cpu_has_svm_npt;
+ svm_function_table.hap_supported = !!cpu_has_svm_npt;
svm_function_table.hap_capabilities = HVM_HAP_SUPERPAGE_2MB |
((cpuid_edx(0x80000001) & 0x04000000) ? HVM_HAP_SUPERPAGE_1GB : 0);
nvmx->intr.intr_info, nvmx->intr.error_code);
}
-static int nvmx_vmexit_trap(struct vcpu *v, struct hvm_trap *trap)
+static int nvmx_vmexit_trap(struct vcpu *v, const struct hvm_trap *trap)
{
nvmx_enqueue_n2_exceptions(v, trap->vector, trap->error_code,
hvm_intsrc_none);
* - #DB is X86_EVENTTYPE_HW_EXCEPTION, except when generated by
* opcode 0xf1 (which is X86_EVENTTYPE_PRI_SW_EXCEPTION)
*/
-static void vmx_inject_trap(struct hvm_trap *trap)
+static void vmx_inject_trap(const struct hvm_trap *trap)
{
unsigned long intr_info;
struct vcpu *curr = current;
#define HVM_HAP_SUPERPAGE_1GB 0x00000002
struct hvm_trap {
- int vector;
- unsigned int type; /* X86_EVENTTYPE_* */
- int error_code; /* HVM_DELIVER_NO_ERROR_CODE if n/a */
- int insn_len; /* Instruction length */
+ int16_t vector;
+ uint8_t type; /* X86_EVENTTYPE_* */
+ uint8_t insn_len; /* Instruction length */
+ uint32_t error_code; /* HVM_DELIVER_NO_ERROR_CODE if n/a */
unsigned long cr2; /* Only for TRAP_page_fault h/w exception */
};
char *name;
/* Support Hardware-Assisted Paging? */
- int hap_supported;
+ bool_t hap_supported;
/* Necessary hardware support for PVH mode? */
- int pvh_supported;
+ bool_t pvh_supported;
/* Necessary hardware support for alternate p2m's? */
bool_t altp2m_supported;
/* Indicate HAP capabilities. */
- int hap_capabilities;
-
+ unsigned int hap_capabilities;
/*
* Initialise/destroy HVM domain/vcpu resources
void (*set_tsc_offset)(struct vcpu *v, u64 offset, u64 at_tsc);
- void (*inject_trap)(struct hvm_trap *trap);
+ void (*inject_trap)(const struct hvm_trap *trap);
void (*init_hypercall_page)(struct domain *d, void *hypercall_page);
int (*nhvm_vcpu_initialise)(struct vcpu *v);
void (*nhvm_vcpu_destroy)(struct vcpu *v);
int (*nhvm_vcpu_reset)(struct vcpu *v);
- int (*nhvm_vcpu_vmexit_trap)(struct vcpu *v, struct hvm_trap *trap);
+ int (*nhvm_vcpu_vmexit_trap)(struct vcpu *v, const struct hvm_trap *trap);
uint64_t (*nhvm_vcpu_p2m_base)(struct vcpu *v);
bool_t (*nhvm_vmcx_guest_intercepts_trap)(struct vcpu *v,
unsigned int trapnr,
void hvm_do_resume(struct vcpu *v);
void hvm_migrate_pirqs(struct vcpu *v);
-void hvm_inject_trap(struct hvm_trap *trap);
+void hvm_inject_trap(const struct hvm_trap *trap);
void hvm_inject_hw_exception(unsigned int trapnr, int errcode);
void hvm_inject_page_fault(int errcode, unsigned long cr2);
/* inject vmexit into l1 guest. l1 guest will see a VMEXIT due to
* 'trapnr' exception.
*/
-static inline int nhvm_vcpu_vmexit_trap(struct vcpu *v, struct hvm_trap *trap)
+static inline int nhvm_vcpu_vmexit_trap(struct vcpu *v,
+ const struct hvm_trap *trap)
{
return hvm_funcs.nhvm_vcpu_vmexit_trap(v, trap);
}
int nsvm_vcpu_initialise(struct vcpu *v);
int nsvm_vcpu_reset(struct vcpu *v);
int nsvm_vcpu_vmrun(struct vcpu *v, struct cpu_user_regs *regs);
-int nsvm_vcpu_vmexit_trap(struct vcpu *v, struct hvm_trap *trap);
+int nsvm_vcpu_vmexit_trap(struct vcpu *v, const struct hvm_trap *trap);
uint64_t nsvm_vcpu_hostcr3(struct vcpu *v);
bool_t nsvm_vmcb_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr,
int errcode);