Currently we patch the whole code include paravirt template code. This doesn't lead into issue for now, but it makes some previlege instructions branch to paravirt code twice. Signed-off-by: Liu Yu <yu.liu@xxxxxxxxxxxxx> --- arch/powerpc/kernel/kvm.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c index 3953fbd..485748c 100644 --- a/arch/powerpc/kernel/kvm.c +++ b/arch/powerpc/kernel/kvm.c @@ -171,6 +171,10 @@ static void kvm_patch_ins_mtmsrd(u32 *inst, u32 rt) if (!p) return; + if ((inst > kvm_emulate_mtmsrd) && + (inst < kvm_emulate_mtmsrd + kvm_emulate_mtmsrd_len)) + return; + /* Find out where we are and put everything there */ distance_start = (ulong)p - (ulong)inst; next_inst = ((ulong)inst + 4); @@ -220,6 +224,11 @@ static void kvm_patch_ins_mtmsr(u32 *inst, u32 rt) int distance_end; ulong next_inst; + if ((inst > kvm_emulate_mtmsr) && + (inst < kvm_emulate_mtmsr + kvm_emulate_mtmsr_len)) + return; + + p = kvm_alloc(kvm_emulate_mtmsr_len * 4); if (!p) return; @@ -281,6 +290,10 @@ static void kvm_patch_ins_wrtee(u32 *inst, u32 rt, int imm_one) int distance_end; ulong next_inst; + if ((inst > kvm_emulate_wrtee) && + (inst < kvm_emulate_wrtee + kvm_emulate_wrtee_len)) + return; + p = kvm_alloc(kvm_emulate_wrtee_len * 4); if (!p) return; @@ -338,6 +351,10 @@ static void kvm_patch_ins_wrteei_0(u32 *inst) int distance_end; ulong next_inst; + if ((inst > kvm_emulate_wrteei_0) && + (inst < kvm_emulate_wrteei_0 + kvm_emulate_wrteei_0_len)) + return; + p = kvm_alloc(kvm_emulate_wrteei_0_len * 4); if (!p) return; -- 1.6.4 -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html