13 #include <linux/kvm_host.h>
14 #include <asm/kvm_emulate.h>
15 #include <asm/kvm_hyp.h>
25 static const unsigned short cc_map[16] = {
54 if (kvm_vcpu_get_esr(vcpu) >> 30)
58 cond = kvm_vcpu_get_condition(vcpu);
62 cpsr = *vcpu_cpsr(vcpu);
68 it = ((cpsr >> 8) & 0xFC) | ((cpsr >> 25) & 0x3);
78 cpsr_cond = cpsr >> 28;
80 if (!((
cc_map[cond] >> cpsr_cond) & 1))
98 unsigned long itbits, cond;
99 unsigned long cpsr = *vcpu_cpsr(vcpu);
100 bool is_arm = !(cpsr & PSR_AA32_T_BIT);
102 if (is_arm || !(cpsr & PSR_AA32_IT_MASK))
105 cond = (cpsr & 0xe000) >> 13;
106 itbits = (cpsr & 0x1c00) >> (10 - 2);
107 itbits |= (cpsr & (0x3 << 25)) >> 25;
110 if ((itbits & 0x7) == 0)
113 itbits = (itbits << 1) & 0x1f;
115 cpsr &= ~PSR_AA32_IT_MASK;
117 cpsr |= (itbits & 0x1c) << (10 - 2);
118 cpsr |= (itbits & 0x3) << 25;
119 *vcpu_cpsr(vcpu) = cpsr;
128 u32 pc = *vcpu_pc(vcpu);
131 is_thumb = !!(*vcpu_cpsr(vcpu) & PSR_AA32_T_BIT);
132 if (is_thumb && !kvm_vcpu_trap_il_is32bit(vcpu))
void kvm_skip_instr32(struct kvm_vcpu *vcpu)
static void kvm_adjust_itstate(struct kvm_vcpu *vcpu)
bool kvm_condition_valid32(const struct kvm_vcpu *vcpu)
static const unsigned short cc_map[16]