[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 01/25] x86emul: make decode_register() return unsigned long *
Quite a few casts can be dropped this way, and type-safeness is being increased by not using void * (same goes for decode_vex_gpr()). Drop casts and no longer needed intermediate variables where possible. Take the opportunity and also switch the last parameter to bool. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- v3: New. --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -347,18 +347,14 @@ enum vmx_insn_errno set_vvmcs_real_safe( static unsigned long reg_read(struct cpu_user_regs *regs, enum vmx_regs_enc index) { - unsigned long *pval = decode_register(index, regs, 0); - - return *pval; + return *decode_register(index, regs, false); } static void reg_write(struct cpu_user_regs *regs, enum vmx_regs_enc index, unsigned long value) { - unsigned long *pval = decode_register(index, regs, 0); - - *pval = value; + *decode_register(index, regs, false) = value; } static inline u32 __n2_pin_exec_control(struct vcpu *v) --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -1935,9 +1935,9 @@ load_seg( return rc; } -void * +unsigned long * decode_register( - uint8_t modrm_reg, struct cpu_user_regs *regs, int highbyte_regs) + uint8_t modrm_reg, struct cpu_user_regs *regs, bool highbyte_regs) { void *p; @@ -1967,10 +1967,11 @@ decode_register( return p; } -static void *decode_vex_gpr(unsigned int vex_reg, struct cpu_user_regs *regs, - const struct x86_emulate_ctxt *ctxt) +static unsigned long *decode_vex_gpr(unsigned int vex_reg, + struct cpu_user_regs *regs, + const struct x86_emulate_ctxt *ctxt) { - return decode_register(~vex_reg & (mode_64bit() ? 0xf : 7), regs, 0); + return decode_register(~vex_reg & (mode_64bit() ? 0xf : 7), regs, false); } static bool is_aligned(enum x86_segment seg, unsigned long offs, @@ -2779,8 +2780,8 @@ x86_decode( sib_index = ((sib >> 3) & 7) | ((rex_prefix << 2) & 8); sib_base = (sib & 7) | ((rex_prefix << 3) & 8); if ( sib_index != 4 && !(d & vSIB) ) - ea.mem.off = *(long *)decode_register(sib_index, - state->regs, 0); + ea.mem.off = *decode_register(sib_index, state->regs, + false); ea.mem.off <<= (sib >> 6) & 3; if ( (modrm_mod == 0) && ((sib_base & 7) == 5) ) ea.mem.off += insn_fetch_type(int32_t); @@ -2799,15 +2800,14 @@ x86_decode( ea.mem.off += state->regs->r(bp); } else - ea.mem.off += *(long *)decode_register(sib_base, - state->regs, 0); + ea.mem.off += *decode_register(sib_base, state->regs, + false); } else { generate_exception_if(d & vSIB, EXC_UD); modrm_rm |= (rex_prefix & 1) << 3; - ea.mem.off = *(long *)decode_register(modrm_rm, - state->regs, 0); + ea.mem.off = *decode_register(modrm_rm, state->regs, false); if ( (modrm_rm == 5) && (modrm_mod != 0) ) ea.mem.seg = x86_seg_ss; } @@ -3329,8 +3329,8 @@ x86_emulate( break; case 0x50 ... 0x57: /* push reg */ - src.val = *(unsigned long *)decode_register( - (b & 7) | ((rex_prefix & 1) << 3), &_regs, 0); + src.val = *decode_register((b & 7) | ((rex_prefix & 1) << 3), + &_regs, false); goto push; case 0x58 ... 0x5f: /* pop reg */ --- a/xen/arch/x86/x86_emulate/x86_emulate.h +++ b/xen/arch/x86/x86_emulate/x86_emulate.h @@ -606,9 +606,9 @@ int x86_emulate_wrapper( * pointer into the block that addresses the relevant register. * @highbyte_regs specifies whether to decode AH,CH,DH,BH. */ -void * +unsigned long * decode_register( - uint8_t modrm_reg, struct cpu_user_regs *regs, int highbyte_regs); + uint8_t modrm_reg, struct cpu_user_regs *regs, bool highbyte_regs); /* Unhandleable read, write or instruction fetch */ int _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |