|
@@ -457,3 +457,149 @@ struct kvm_vm_stat {
|
|
u64 remote_tlb_flush;
|
|
u64 remote_tlb_flush;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+struct kvm_sal_data {
|
|
|
|
+ unsigned long boot_ip;
|
|
|
|
+ unsigned long boot_gp;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct kvm_arch_memory_slot {
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct kvm_arch {
|
|
|
|
+ spinlock_t dirty_log_lock;
|
|
|
|
+
|
|
|
|
+ unsigned long vm_base;
|
|
|
|
+ unsigned long metaphysical_rr0;
|
|
|
|
+ unsigned long metaphysical_rr4;
|
|
|
|
+ unsigned long vmm_init_rr;
|
|
|
|
+
|
|
|
|
+ int is_sn2;
|
|
|
|
+
|
|
|
|
+ struct kvm_ioapic *vioapic;
|
|
|
|
+ struct kvm_vm_stat stat;
|
|
|
|
+ struct kvm_sal_data rdv_sal_data;
|
|
|
|
+
|
|
|
|
+ struct list_head assigned_dev_head;
|
|
|
|
+ struct iommu_domain *iommu_domain;
|
|
|
|
+ int iommu_flags;
|
|
|
|
+
|
|
|
|
+ unsigned long irq_sources_bitmap;
|
|
|
|
+ unsigned long irq_states[KVM_IOAPIC_NUM_PINS];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+union cpuid3_t {
|
|
|
|
+ u64 value;
|
|
|
|
+ struct {
|
|
|
|
+ u64 number : 8;
|
|
|
|
+ u64 revision : 8;
|
|
|
|
+ u64 model : 8;
|
|
|
|
+ u64 family : 8;
|
|
|
|
+ u64 archrev : 8;
|
|
|
|
+ u64 rv : 24;
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct kvm_pt_regs {
|
|
|
|
+ /* The following registers are saved by SAVE_MIN: */
|
|
|
|
+ unsigned long b6; /* scratch */
|
|
|
|
+ unsigned long b7; /* scratch */
|
|
|
|
+
|
|
|
|
+ unsigned long ar_csd; /* used by cmp8xchg16 (scratch) */
|
|
|
|
+ unsigned long ar_ssd; /* reserved for future use (scratch) */
|
|
|
|
+
|
|
|
|
+ unsigned long r8; /* scratch (return value register 0) */
|
|
|
|
+ unsigned long r9; /* scratch (return value register 1) */
|
|
|
|
+ unsigned long r10; /* scratch (return value register 2) */
|
|
|
|
+ unsigned long r11; /* scratch (return value register 3) */
|
|
|
|
+
|
|
|
|
+ unsigned long cr_ipsr; /* interrupted task's psr */
|
|
|
|
+ unsigned long cr_iip; /* interrupted task's instruction pointer */
|
|
|
|
+ unsigned long cr_ifs; /* interrupted task's function state */
|
|
|
|
+
|
|
|
|
+ unsigned long ar_unat; /* interrupted task's NaT register (preserved) */
|
|
|
|
+ unsigned long ar_pfs; /* prev function state */
|
|
|
|
+ unsigned long ar_rsc; /* RSE configuration */
|
|
|
|
+ /* The following two are valid only if cr_ipsr.cpl > 0: */
|
|
|
|
+ unsigned long ar_rnat; /* RSE NaT */
|
|
|
|
+ unsigned long ar_bspstore; /* RSE bspstore */
|
|
|
|
+
|
|
|
|
+ unsigned long pr; /* 64 predicate registers (1 bit each) */
|
|
|
|
+ unsigned long b0; /* return pointer (bp) */
|
|
|
|
+ unsigned long loadrs; /* size of dirty partition << 16 */
|
|
|
|
+
|
|
|
|
+ unsigned long r1; /* the gp pointer */
|
|
|
|
+ unsigned long r12; /* interrupted task's memory stack pointer */
|
|
|
|
+ unsigned long r13; /* thread pointer */
|
|
|
|
+
|
|
|
|
+ unsigned long ar_fpsr; /* floating point status (preserved) */
|
|
|
|
+ unsigned long r15; /* scratch */
|
|
|
|
+
|
|
|
|
+ /* The remaining registers are NOT saved for system calls. */
|
|
|
|
+ unsigned long r14; /* scratch */
|
|
|
|
+ unsigned long r2; /* scratch */
|
|
|
|
+ unsigned long r3; /* scratch */
|
|
|
|
+ unsigned long r16; /* scratch */
|
|
|
|
+ unsigned long r17; /* scratch */
|
|
|
|
+ unsigned long r18; /* scratch */
|
|
|
|
+ unsigned long r19; /* scratch */
|
|
|
|
+ unsigned long r20; /* scratch */
|
|
|
|
+ unsigned long r21; /* scratch */
|
|
|
|
+ unsigned long r22; /* scratch */
|
|
|
|
+ unsigned long r23; /* scratch */
|
|
|
|
+ unsigned long r24; /* scratch */
|
|
|
|
+ unsigned long r25; /* scratch */
|
|
|
|
+ unsigned long r26; /* scratch */
|
|
|
|
+ unsigned long r27; /* scratch */
|
|
|
|
+ unsigned long r28; /* scratch */
|
|
|
|
+ unsigned long r29; /* scratch */
|
|
|
|
+ unsigned long r30; /* scratch */
|
|
|
|
+ unsigned long r31; /* scratch */
|
|
|
|
+ unsigned long ar_ccv; /* compare/exchange value (scratch) */
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Floating point registers that the kernel considers scratch:
|
|
|
|
+ */
|
|
|
|
+ struct ia64_fpreg f6; /* scratch */
|
|
|
|
+ struct ia64_fpreg f7; /* scratch */
|
|
|
|
+ struct ia64_fpreg f8; /* scratch */
|
|
|
|
+ struct ia64_fpreg f9; /* scratch */
|
|
|
|
+ struct ia64_fpreg f10; /* scratch */
|
|
|
|
+ struct ia64_fpreg f11; /* scratch */
|
|
|
|
+
|
|
|
|
+ unsigned long r4; /* preserved */
|
|
|
|
+ unsigned long r5; /* preserved */
|
|
|
|
+ unsigned long r6; /* preserved */
|
|
|
|
+ unsigned long r7; /* preserved */
|
|
|
|
+ unsigned long eml_unat; /* used for emulating instruction */
|
|
|
|
+ unsigned long pad0; /* alignment pad */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static inline struct kvm_pt_regs *vcpu_regs(struct kvm_vcpu *v)
|
|
|
|
+{
|
|
|
|
+ return (struct kvm_pt_regs *) ((unsigned long) v + KVM_STK_OFFSET) - 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+typedef int kvm_vmm_entry(void);
|
|
|
|
+typedef void kvm_tramp_entry(union context *host, union context *guest);
|
|
|
|
+
|
|
|
|
+struct kvm_vmm_info{
|
|
|
|
+ struct module *module;
|
|
|
|
+ kvm_vmm_entry *vmm_entry;
|
|
|
|
+ kvm_tramp_entry *tramp_entry;
|
|
|
|
+ unsigned long vmm_ivt;
|
|
|
|
+ unsigned long patch_mov_ar;
|
|
|
|
+ unsigned long patch_mov_ar_sn2;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+int kvm_highest_pending_irq(struct kvm_vcpu *vcpu);
|
|
|
|
+int kvm_emulate_halt(struct kvm_vcpu *vcpu);
|
|
|
|
+int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run);
|
|
|
|
+void kvm_sal_emul(struct kvm_vcpu *vcpu);
|
|
|
|
+
|
|
|
|
+#define __KVM_HAVE_ARCH_VM_ALLOC 1
|
|
|
|
+struct kvm *kvm_arch_alloc_vm(void);
|
|
|
|
+void kvm_arch_free_vm(struct kvm *kvm);
|
|
|
|
+
|
|
|
|
+#endif /* __ASSEMBLY__*/
|
|
|
|
+
|
|
|
|
+#endif
|