Since the decode functionality is meant to be more generic looking that pure KVM related, we change the hxfar field to be the fault_addr field. Also create accessors for the registers and the cpsr like we do in the main kvm code, which should make things easier if anyone's brave enough to implement this for arm64. Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> --- arch/arm/include/asm/kvm_decode.h | 12 +++++++++++- arch/arm/kvm/decode.c | 18 +++++++++--------- arch/arm/kvm/emulate.c | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/arch/arm/include/asm/kvm_decode.h b/arch/arm/include/asm/kvm_decode.h index 6fd1e39..3c37cb9 100644 --- a/arch/arm/include/asm/kvm_decode.h +++ b/arch/arm/include/asm/kvm_decode.h @@ -26,7 +26,7 @@ struct kvm_exit_mmio; struct kvm_decode { struct pt_regs *regs; - unsigned long hxfar; + unsigned long fault_addr; unsigned long rt; bool sign_extend; }; @@ -34,4 +34,14 @@ struct kvm_decode { int kvm_decode_load_store(struct kvm_decode *decode, unsigned long instr, struct kvm_exit_mmio *mmio); +static inline unsigned long *kvm_decode_reg(struct kvm_decode *decode, int reg) +{ + return &decode->regs->uregs[reg]; +} + +static inline unsigned long *kvm_decode_cpsr(struct kvm_decode *decode) +{ + return &decode->regs->ARM_cpsr; +} + #endif /* __ARM_KVM_DECODE_H__ */ diff --git a/arch/arm/kvm/decode.c b/arch/arm/kvm/decode.c index 48e6bef..aedddfc 100644 --- a/arch/arm/kvm/decode.c +++ b/arch/arm/kvm/decode.c @@ -124,7 +124,7 @@ static bool decode_arm_wb(struct kvm_decode *decode, struct kvm_exit_mmio *mmio, u8 W = (instr >> 21) & 1; u8 U = (instr >> 23) & 1; u8 P = (instr >> 24) & 1; - u32 base_addr = decode->regs->uregs[Rn]; + u32 base_addr = *kvm_decode_reg(decode, Rn); u32 offset_addr, offset; /* @@ -145,8 +145,8 @@ static bool decode_arm_wb(struct kvm_decode *decode, struct kvm_exit_mmio *mmio, /* Register operation */ enum SRType s_type; u8 shift_n = 0; - bool c_bit = decode->regs->ARM_cpsr & PSR_C_BIT; - u32 s_reg = decode->regs->uregs[ai->Rm]; + bool c_bit = *kvm_decode_cpsr(decode) & PSR_C_BIT; + u32 s_reg = *kvm_decode_reg(decode, ai->Rm); s_type = decode_imm_shift(ai->type, ai->shift_n, &shift_n); offset = shift(s_reg, 5, s_type, shift_n, c_bit); @@ -160,7 +160,7 @@ static bool decode_arm_wb(struct kvm_decode *decode, struct kvm_exit_mmio *mmio, offset_addr = base_addr + offset; else offset_addr = base_addr - offset; - decode->regs->uregs[Rn] = offset_addr; + *kvm_decode_reg(decode, Rn) = offset_addr; return true; } @@ -305,7 +305,7 @@ static bool decode_thumb_wb(struct kvm_decode *decode, bool P = (instr >> 10) & 1; bool U = (instr >> 9) & 1; u8 imm8 = instr & 0xff; - u32 offset_addr = decode->hxfar; + u32 offset_addr = decode->fault_addr; u8 Rn = (instr >> 16) & 0xf; decode->rt = (instr >> 12) & 0xf; @@ -315,9 +315,9 @@ static bool decode_thumb_wb(struct kvm_decode *decode, /* Handle Writeback */ if (!P && U) - decode->regs->uregs[Rn] = offset_addr + imm8; + *kvm_decode_reg(decode, Rn) = offset_addr + imm8; else if (!P && !U) - decode->regs->uregs[Rn] = offset_addr - imm8; + *kvm_decode_reg(decode, Rn) = offset_addr - imm8; return true; } @@ -441,7 +441,7 @@ static bool kvm_decode_thumb_ls(struct kvm_decode *decode, unsigned long instr, /** * kvm_decode_load_store - decodes load/store instructions - * @decode: reads regs and hxfar, writes rt and sign_extend + * @decode: reads regs and fault_addr, writes rt and sign_extend * @instr: instruction to decode * @mmio: fills in len and is_write * @@ -455,7 +455,7 @@ int kvm_decode_load_store(struct kvm_decode *decode, unsigned long instr, { bool is_thumb; - is_thumb = !!(decode->regs->ARM_cpsr & PSR_T_BIT); + is_thumb = !!(*kvm_decode_cpsr(decode) & PSR_T_BIT); if (!is_thumb) return kvm_decode_arm_ls(decode, instr, mmio) ? 0 : 1; else diff --git a/arch/arm/kvm/emulate.c b/arch/arm/kvm/emulate.c index fff1199..4e8a127 100644 --- a/arch/arm/kvm/emulate.c +++ b/arch/arm/kvm/emulate.c @@ -321,7 +321,7 @@ int kvm_emulate_mmio_ls(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, current_regs.ARM_lr = *vcpu_reg(vcpu, 14); decode->regs = ¤t_regs; - decode->hxfar = vcpu->arch.hxfar; + decode->fault_addr = vcpu->arch.hxfar; ret = kvm_decode_load_store(decode, instr, mmio); if (ret) { kvm_debug("Insrn. decode error: %#08lx (cpsr: %#08x" -- 1.7.9.5 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm