From mboxrd@z Thu Jan 1 00:00:00 1970 From: Scott Wood Date: Mon, 28 Nov 2011 17:32:02 +0000 Subject: Re: [PATCH] KVM: PPC: paravirt: Avoid patching paravirt template Message-Id: <4ED3C592.8070907@freescale.com> List-Id: References: <1322042732-10285-1-git-send-email-yu.liu@freescale.com> In-Reply-To: <1322042732-10285-1-git-send-email-yu.liu@freescale.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: kvm-ppc@vger.kernel.org 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 > --- > 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