KVM: use desc_ptr struct instead of kvm private descriptor_table
x86 arch defines desc_ptr for idt/gdt pointers, no need to define another structure in kvm code.
Signed-off-by Gleb Natapov <[email protected]>
arch/x86/include/asm/kvm_host.h +6 -11
@@ -461,11 +461,6 @@ struct kvm_vcpu_stat {u32 nmi_injections; }; -struct descriptor_table { -u16 limit; -unsigned long base; -} __attribute__((packed)); -struct kvm_x86_ops {int (*cpu_has_kvm_support)(void );/* __init */ int (*disabled_by_bios)(void );/* __init */
@@ -503,10 +498,10 @@ struct kvm_x86_ops {void (*set_cr3)(struct kvm_vcpu *vcpu,unsigned long cr3);void (*set_cr4)(struct kvm_vcpu *vcpu,unsigned long cr4);void (*set_efer)(struct kvm_vcpu *vcpu,u64 efer); -void (*get_idt)(struct kvm_vcpu *vcpu,struct descriptor_table *dt); -void (*set_idt)(struct kvm_vcpu *vcpu,struct descriptor_table *dt); -void (*get_gdt)(struct kvm_vcpu *vcpu,struct descriptor_table *dt); -void (*set_gdt)(struct kvm_vcpu *vcpu,struct descriptor_table *dt); +void (*get_idt)(struct kvm_vcpu *vcpu,struct desc_ptr *dt); +void (*set_idt)(struct kvm_vcpu *vcpu,struct desc_ptr *dt); +void (*get_gdt)(struct kvm_vcpu *vcpu,struct desc_ptr *dt); +void (*set_gdt)(struct kvm_vcpu *vcpu,struct desc_ptr *dt);int (*get_dr)(struct kvm_vcpu *vcpu,int dr,unsigned long *dest);int (*set_dr)(struct kvm_vcpu *vcpu,int dr,unsigned long value);void (*cache_reg)(struct kvm_vcpu *vcpu,enum kvm_reg reg);
@@ -725,12 +720,12 @@ static inline void kvm_load_ldt(u16 sel) asm("lldt %0" : :"rm" (sel)); } -static inline void kvm_get_idt (struct descriptor_table *table) +static inline void kvm_get_idt (struct desc_ptr *table) { asm("sidt %0" :"=m" (*table)); } -static inline void kvm_get_gdt (struct descriptor_table *table) +static inline void kvm_get_gdt (struct desc_ptr *table) { asm("sgdt %0" :"=m" (*table)); }
arch/x86/kvm/svm.c +14 -14
@@ -318,7 +318,7 @@ static int svm_hardware_enable(void *garbage)struct svm_cpu_data *sd;uint64_t efer; -struct descriptor_table gdt_descr; +struct desc_ptr gdt_descr;struct desc_struct *gdt;int me =raw_smp_processor_id ();
@@ -344,7 +344,7 @@ static int svm_hardware_enable(void *garbage) sd->next_asid = sd->max_asid +1 ;kvm_get_gdt (&gdt_descr); - gdt = (struct desc_struct *)gdt_descr.base; + gdt = (struct desc_struct *)gdt_descr.address; sd->tss_desc = (struct kvm_ldttss_desc *)(gdt +GDT_ENTRY_TSS );wrmsrl (MSR_EFER , efer |EFER_SVME );
@@ -930,36 +930,36 @@ static int svm_get_cpl(struct kvm_vcpu *vcpu)return save->cpl; } -static void svm_get_idt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void svm_get_idt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) {struct vcpu_svm *svm =to_svm (vcpu); - dt->limit = svm->vmcb->save.idtr.limit; - dt->base = svm->vmcb->save.idtr.base; + dt->size = svm->vmcb->save.idtr.limit; + dt->address = svm->vmcb->save.idtr.base; } -static void svm_set_idt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void svm_set_idt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) {struct vcpu_svm *svm =to_svm (vcpu); - svm->vmcb->save.idtr.limit = dt->limit; - svm->vmcb->save.idtr.base = dt->base ; + svm->vmcb->save.idtr.limit = dt->size; + svm->vmcb->save.idtr.base = dt->address ; } -static void svm_get_gdt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void svm_get_gdt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) {struct vcpu_svm *svm =to_svm (vcpu); - dt->limit = svm->vmcb->save.gdtr.limit; - dt->base = svm->vmcb->save.gdtr.base; + dt->size = svm->vmcb->save.gdtr.limit; + dt->address = svm->vmcb->save.gdtr.base; } -static void svm_set_gdt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void svm_set_gdt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) {struct vcpu_svm *svm =to_svm (vcpu); - svm->vmcb->save.gdtr.limit = dt->limit; - svm->vmcb->save.gdtr.base = dt->base ; + svm->vmcb->save.gdtr.limit = dt->size; + svm->vmcb->save.gdtr.base = dt->address ; }static void svm_decache_cr0_guest_bits (struct kvm_vcpu *vcpu)
arch/x86/kvm/vmx.c +18 -18
@@ -597,11 +597,11 @@ static void reload_tss(void)/* * VT restores TR but not its size. Useless. */ -struct descriptor_table gdt; +struct desc_ptr gdt;struct desc_struct *descs;kvm_get_gdt (&gdt); - descs = (void *)gdt.base; + descs = (void *)gdt.address; descs[GDT_ENTRY_TSS ].type =9 ;/* available TSS */ load_TR_desc (); }
@@ -755,7 +755,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) }if (vcpu->cpu != cpu) { -struct descriptor_table dt; +struct desc_ptr dt;unsigned long sysenter_esp; vcpu->cpu = cpu;
@@ -765,7 +765,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)*/ vmcs_writel (HOST_TR_BASE ,kvm_read_tr_base ());/* 22.2.4 */ kvm_get_gdt (&dt); -vmcs_writel (HOST_GDTR_BASE , dt.base);/* 22.2.4 */ +vmcs_writel (HOST_GDTR_BASE , dt.address);/* 22.2.4 */ rdmsrl (MSR_IA32_SYSENTER_ESP , sysenter_esp);vmcs_writel (HOST_IA32_SYSENTER_ESP , sysenter_esp);/* 22.2.3 */
@@ -1927,28 +1927,28 @@ static void vmx_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l) *l = (ar >>13 ) &1 ; } -static void vmx_get_idt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void vmx_get_idt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) { - dt->limit =vmcs_read32 (GUEST_IDTR_LIMIT ); - dt->base =vmcs_readl (GUEST_IDTR_BASE ); + dt->size =vmcs_read32 (GUEST_IDTR_LIMIT ); + dt->address =vmcs_readl (GUEST_IDTR_BASE ); } -static void vmx_set_idt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void vmx_set_idt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) { -vmcs_write32 (GUEST_IDTR_LIMIT , dt->limit); -vmcs_writel (GUEST_IDTR_BASE , dt->base); +vmcs_write32 (GUEST_IDTR_LIMIT , dt->size); +vmcs_writel (GUEST_IDTR_BASE , dt->address); } -static void vmx_get_gdt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void vmx_get_gdt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) { - dt->limit =vmcs_read32 (GUEST_GDTR_LIMIT ); - dt->base =vmcs_readl (GUEST_GDTR_BASE ); + dt->size =vmcs_read32 (GUEST_GDTR_LIMIT ); + dt->address =vmcs_readl (GUEST_GDTR_BASE ); } -static void vmx_set_gdt (struct kvm_vcpu *vcpu,struct descriptor_table *dt) +static void vmx_set_gdt (struct kvm_vcpu *vcpu,struct desc_ptr *dt) { -vmcs_write32 (GUEST_GDTR_LIMIT , dt->limit); -vmcs_writel (GUEST_GDTR_BASE , dt->base); +vmcs_write32 (GUEST_GDTR_LIMIT , dt->size); +vmcs_writel (GUEST_GDTR_BASE , dt->address); }static bool rmode_segment_valid (struct kvm_vcpu *vcpu,int seg)
@@ -2327,7 +2327,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)u32 junk;u64 host_pat, tsc_this, tsc_base;unsigned long a; -struct descriptor_table dt; +struct desc_ptr dt;int i;unsigned long kvm_vmx_return;u32 exec_control;
@@ -2409,7 +2409,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)vmcs_write16 (HOST_TR_SELECTOR ,GDT_ENTRY_TSS *8 );/* 22.2.4 */ kvm_get_idt (&dt); -vmcs_writel (HOST_IDTR_BASE , dt.base);/* 22.2.4 */ +vmcs_writel (HOST_IDTR_BASE , dt.address);/* 22.2.4 */ asm("mov $.Lkvm_vmx_return, %0" :"=r" (kvm_vmx_return));vmcs_writel (HOST_RIP , kvm_vmx_return);/* 22.2.5 */
arch/x86/kvm/x86.c +24 -24
132 lines not on this page · raw message
--
Gleb.
Avi Kivity
AppliedQuoted 3 lines · Gleb Natapov
x86 arch defines
desc_ptrfor idt/gdt pointers, no need to define another structure in kvm code.
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function