Message ID | 1322042732-10285-1-git-send-email-yu.liu@freescale.com |
---|---|
State | New, archived |
Headers | show |
On 11/23/2011 04:05 AM, Liu Yu wrote: > 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. Ouch. This will do bad things to the scratch area. > Signed-off-by: Liu Yu <yu.liu@freescale.com> > --- > 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; Instead of excluding only the template code for the instruction type being patched, we should exclude the entire template region in the main loop. -Scott -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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;
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@freescale.com> --- arch/powerpc/kernel/kvm.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-)