|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] VMX: also use proper instruction mnemonic for VMREAD
On Mon, Sep 16, 2013 at 4:06 AM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
> ... when assembler supports it, following commit cfd54835 ("VMX: use
> proper instruction mnemonics if assembler supports them"). This merely
> got split off from the earlier change becase of the significant number
> of call sites needing to be changed.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -163,11 +163,11 @@ long_mode_do_msr_read(unsigned int msr,
> switch ( msr )
> {
> case MSR_FS_BASE:
> - *msr_content = __vmread(GUEST_FS_BASE);
> + __vmread(GUEST_FS_BASE, msr_content);
> break;
>
> case MSR_GS_BASE:
> - *msr_content = __vmread(GUEST_GS_BASE);
> + __vmread(GUEST_GS_BASE, msr_content);
> break;
>
> case MSR_SHADOW_GS_BASE:
> @@ -348,13 +348,13 @@ void vmx_update_exception_bitmap(struct
>
> static int vmx_guest_x86_mode(struct vcpu *v)
> {
> - unsigned int cs_ar_bytes;
> + unsigned long cs_ar_bytes;
>
> if ( unlikely(!(v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PE)) )
> return 0;
> if ( unlikely(guest_cpu_user_regs()->eflags & X86_EFLAGS_VM) )
> return 1;
> - cs_ar_bytes = __vmread(GUEST_CS_AR_BYTES);
> + __vmread(GUEST_CS_AR_BYTES, &cs_ar_bytes);
> if ( hvm_long_mode_enabled(v) &&
> likely(cs_ar_bytes & X86_SEG_AR_CS_LM_ACTIVE) )
> return 8;
> @@ -377,7 +377,7 @@ static void vmx_save_dr(struct vcpu *v)
> v->arch.debugreg[3] = read_debugreg(3);
> v->arch.debugreg[6] = read_debugreg(6);
> /* DR7 must be saved as it is used by vmx_restore_dr(). */
> - v->arch.debugreg[7] = __vmread(GUEST_DR7);
> + __vmread(GUEST_DR7, &v->arch.debugreg[7]);
> }
>
> static void __restore_debug_registers(struct vcpu *v)
> @@ -410,7 +410,7 @@ static void vmx_restore_dr(struct vcpu *
>
> static void vmx_vmcs_save(struct vcpu *v, struct hvm_hw_cpu *c)
> {
> - uint32_t ev;
> + unsigned long ev;
>
> vmx_vmcs_enter(v);
>
> @@ -421,17 +421,19 @@ static void vmx_vmcs_save(struct vcpu *v
>
> c->msr_efer = v->arch.hvm_vcpu.guest_efer;
>
> - c->sysenter_cs = __vmread(GUEST_SYSENTER_CS);
> - c->sysenter_esp = __vmread(GUEST_SYSENTER_ESP);
> - c->sysenter_eip = __vmread(GUEST_SYSENTER_EIP);
> + __vmread(GUEST_SYSENTER_CS, &c->sysenter_cs);
> + __vmread(GUEST_SYSENTER_ESP, &c->sysenter_esp);
> + __vmread(GUEST_SYSENTER_EIP, &c->sysenter_eip);
>
> c->pending_event = 0;
> c->error_code = 0;
> - if ( ((ev = __vmread(VM_ENTRY_INTR_INFO)) & INTR_INFO_VALID_MASK) &&
> + __vmread(VM_ENTRY_INTR_INFO, &ev);
> + if ( (ev & INTR_INFO_VALID_MASK) &&
> hvm_event_needs_reinjection((ev >> 8) & 7, ev & 0xff) )
> {
> c->pending_event = ev;
> - c->error_code = __vmread(VM_ENTRY_EXCEPTION_ERROR_CODE);
> + __vmread(VM_ENTRY_EXCEPTION_ERROR_CODE, &ev);
> + c->error_code = ev;
> }
>
> vmx_vmcs_exit(v);
> @@ -667,74 +669,78 @@ static void vmx_ctxt_switch_to(struct vc
> void vmx_get_segment_register(struct vcpu *v, enum x86_segment seg,
> struct segment_register *reg)
> {
> - uint32_t attr = 0;
> + unsigned long attr = 0, sel = 0, limit;
This is a minor thing, but why do you initialize 'attr' and 'sel', but
not 'limit'?
>
> vmx_vmcs_enter(v);
>
> switch ( seg )
> {
> case x86_seg_cs:
> - reg->sel = __vmread(GUEST_CS_SELECTOR);
> - reg->limit = __vmread(GUEST_CS_LIMIT);
> - reg->base = __vmread(GUEST_CS_BASE);
> - attr = __vmread(GUEST_CS_AR_BYTES);
> + __vmread(GUEST_CS_SELECTOR, &sel);
> + __vmread(GUEST_CS_LIMIT, &limit);
> + __vmread(GUEST_CS_BASE, ®->base);
> + __vmread(GUEST_CS_AR_BYTES, &attr);
> break;
> case x86_seg_ds:
> - reg->sel = __vmread(GUEST_DS_SELECTOR);
> - reg->limit = __vmread(GUEST_DS_LIMIT);
> - reg->base = __vmread(GUEST_DS_BASE);
> - attr = __vmread(GUEST_DS_AR_BYTES);
> + __vmread(GUEST_DS_SELECTOR, &sel);
> + __vmread(GUEST_DS_LIMIT, &limit);
> + __vmread(GUEST_DS_BASE, ®->base);
> + __vmread(GUEST_DS_AR_BYTES, &attr);
> break;
> case x86_seg_es:
> - reg->sel = __vmread(GUEST_ES_SELECTOR);
> - reg->limit = __vmread(GUEST_ES_LIMIT);
> - reg->base = __vmread(GUEST_ES_BASE);
> - attr = __vmread(GUEST_ES_AR_BYTES);
> + __vmread(GUEST_ES_SELECTOR, &sel);
> + __vmread(GUEST_ES_LIMIT, &limit);
> + __vmread(GUEST_ES_BASE, ®->base);
> + __vmread(GUEST_ES_AR_BYTES, &attr);
> break;
> case x86_seg_fs:
> - reg->sel = __vmread(GUEST_FS_SELECTOR);
> - reg->limit = __vmread(GUEST_FS_LIMIT);
> - reg->base = __vmread(GUEST_FS_BASE);
> - attr = __vmread(GUEST_FS_AR_BYTES);
> + __vmread(GUEST_FS_SELECTOR, &sel);
> + __vmread(GUEST_FS_LIMIT, &limit);
> + __vmread(GUEST_FS_BASE, ®->base);
> + __vmread(GUEST_FS_AR_BYTES, &attr);
> break;
> case x86_seg_gs:
> - reg->sel = __vmread(GUEST_GS_SELECTOR);
> - reg->limit = __vmread(GUEST_GS_LIMIT);
> - reg->base = __vmread(GUEST_GS_BASE);
> - attr = __vmread(GUEST_GS_AR_BYTES);
> + __vmread(GUEST_GS_SELECTOR, &sel);
> + __vmread(GUEST_GS_LIMIT, &limit);
> + __vmread(GUEST_GS_BASE, ®->base);
> + __vmread(GUEST_GS_AR_BYTES, &attr);
> break;
> case x86_seg_ss:
> - reg->sel = __vmread(GUEST_SS_SELECTOR);
> - reg->limit = __vmread(GUEST_SS_LIMIT);
> - reg->base = __vmread(GUEST_SS_BASE);
> - attr = __vmread(GUEST_SS_AR_BYTES);
> + __vmread(GUEST_SS_SELECTOR, &sel);
> + __vmread(GUEST_SS_LIMIT, &limit);
> + __vmread(GUEST_SS_BASE, ®->base);
> + __vmread(GUEST_SS_AR_BYTES, &attr);
> break;
> case x86_seg_tr:
> - reg->sel = __vmread(GUEST_TR_SELECTOR);
> - reg->limit = __vmread(GUEST_TR_LIMIT);
> - reg->base = __vmread(GUEST_TR_BASE);
> - attr = __vmread(GUEST_TR_AR_BYTES);
> + __vmread(GUEST_TR_SELECTOR, &sel);
> + __vmread(GUEST_TR_LIMIT, &limit);
> + __vmread(GUEST_TR_BASE, ®->base);
> + __vmread(GUEST_TR_AR_BYTES, &attr);
> break;
> case x86_seg_gdtr:
> - reg->limit = __vmread(GUEST_GDTR_LIMIT);
> - reg->base = __vmread(GUEST_GDTR_BASE);
> + __vmread(GUEST_GDTR_LIMIT, &limit);
> + __vmread(GUEST_GDTR_BASE, ®->base);
> break;
> case x86_seg_idtr:
> - reg->limit = __vmread(GUEST_IDTR_LIMIT);
> - reg->base = __vmread(GUEST_IDTR_BASE);
> + __vmread(GUEST_IDTR_LIMIT, &limit);
> + __vmread(GUEST_IDTR_BASE, ®->base);
> break;
> case x86_seg_ldtr:
> - reg->sel = __vmread(GUEST_LDTR_SELECTOR);
> - reg->limit = __vmread(GUEST_LDTR_LIMIT);
> - reg->base = __vmread(GUEST_LDTR_BASE);
> - attr = __vmread(GUEST_LDTR_AR_BYTES);
> + __vmread(GUEST_LDTR_SELECTOR, &sel);
> + __vmread(GUEST_LDTR_LIMIT, &limit);
> + __vmread(GUEST_LDTR_BASE, ®->base);
> + __vmread(GUEST_LDTR_AR_BYTES, &attr);
> break;
> default:
> BUG();
> + return;
> }
>
> vmx_vmcs_exit(v);
>
> + reg->sel = sel;
> + reg->limit = limit;
> +
> reg->attr.bytes = (attr & 0xff) | ((attr >> 4) & 0xf00);
> /* Unusable flag is folded into Present flag. */
> if ( attr & (1u<<16) )
--
Jun
Intel Open Source Technology Center
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |