KVM: PPC: Allow kvmppc_get_last_inst() to fail
On book3e, guest last instruction is read on the exit path using load external pid (lwepx) dedicated instruction. This load operation may fail due to TLB eviction and execute-but-not-read entries. This patch lay down the path for an alternative solution to read the guest last instruction, by allowing kvmppc_get_lat_inst() function to fail. Architecture specific implmentations of kvmppc_load_last_inst() may read last guest instruction and instruct the emulation layer to re-execute the guest in case of failure. Make kvmppc_get_last_inst() definition common between architectures. Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:

committed by
Alexander Graf

parent
9a26af64d6
commit
51f047261e
@@ -224,19 +224,25 @@ static int kvmppc_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
|
||||
* from opcode tables in the future. */
|
||||
int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||
{
|
||||
u32 inst = kvmppc_get_last_inst(vcpu);
|
||||
int ra = get_ra(inst);
|
||||
int rs = get_rs(inst);
|
||||
int rt = get_rt(inst);
|
||||
int sprn = get_sprn(inst);
|
||||
enum emulation_result emulated = EMULATE_DONE;
|
||||
u32 inst;
|
||||
int ra, rs, rt, sprn;
|
||||
enum emulation_result emulated;
|
||||
int advance = 1;
|
||||
|
||||
/* this default type might be overwritten by subcategories */
|
||||
kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS);
|
||||
|
||||
emulated = kvmppc_get_last_inst(vcpu, false, &inst);
|
||||
if (emulated != EMULATE_DONE)
|
||||
return emulated;
|
||||
|
||||
pr_debug("Emulating opcode %d / %d\n", get_op(inst), get_xop(inst));
|
||||
|
||||
ra = get_ra(inst);
|
||||
rs = get_rs(inst);
|
||||
rt = get_rt(inst);
|
||||
sprn = get_sprn(inst);
|
||||
|
||||
switch (get_op(inst)) {
|
||||
case OP_TRAP:
|
||||
#ifdef CONFIG_PPC_BOOK3S
|
||||
|
Reference in New Issue
Block a user