Message ID | 761ea48b0909210527i6ed97be5s4208d7a0227d9de5@mail.gmail.com |
---|---|
State | Superseded |
Headers | show |
On Mon, Sep 21, 2009 at 02:27:59PM +0200, Laurent Desnogues wrote: > Hello, > > this patch fixes the linking of generated blocks on an ARM host. > No need to say this brings a very nice speedup :-) > > > Laurent > > Signed-off-by: Laurent Desnogues <laurent.desnogues@gmail.com> Thanks, applied. Do you think it also apply to stable? > diff --git a/exec-all.h b/exec-all.h > index 51519ff..daafc78 100644 > --- a/exec-all.h > +++ b/exec-all.h > @@ -208,7 +208,9 @@ static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long addr > #endif > > /* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */ > - *(uint32_t *)jmp_addr |= ((addr - (jmp_addr + 8)) >> 2) & 0xffffff; > + *(uint32_t *)jmp_addr = > + (*(uint32_t *)jmp_addr & ~0xffffff) > + | (((addr - (jmp_addr + 8)) >> 2) & 0xffffff); > > #if QEMU_GNUC_PREREQ(4, 1) > __clear_cache((char *) jmp_addr, (char *) jmp_addr + 4);
On Fri, Sep 25, 2009 at 5:27 PM, Aurelien Jarno <aurelien@aurel32.net> wrote: > On Mon, Sep 21, 2009 at 02:27:59PM +0200, Laurent Desnogues wrote: >> Hello, >> >> this patch fixes the linking of generated blocks on an ARM host. >> No need to say this brings a very nice speedup :-) >> >> >> Laurent >> >> Signed-off-by: Laurent Desnogues <laurent.desnogues@gmail.com> > > Thanks, applied. Do you think it also apply to stable? Well it used to work by accident; it's fundamentally broken since it just 'or' some new bits with existing ones (which are there due to internal relocation). So I think, it should be applied to stable too. Laurent >> diff --git a/exec-all.h b/exec-all.h >> index 51519ff..daafc78 100644 >> --- a/exec-all.h >> +++ b/exec-all.h >> @@ -208,7 +208,9 @@ static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long addr >> #endif >> >> /* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */ >> - *(uint32_t *)jmp_addr |= ((addr - (jmp_addr + 8)) >> 2) & 0xffffff; >> + *(uint32_t *)jmp_addr = >> + (*(uint32_t *)jmp_addr & ~0xffffff) >> + | (((addr - (jmp_addr + 8)) >> 2) & 0xffffff); >> >> #if QEMU_GNUC_PREREQ(4, 1) >> __clear_cache((char *) jmp_addr, (char *) jmp_addr + 4); > > > -- > Aurelien Jarno GPG: 1024D/F1BCDB73 > aurelien@aurel32.net http://www.aurel32.net >
diff --git a/exec-all.h b/exec-all.h index 51519ff..daafc78 100644 --- a/exec-all.h +++ b/exec-all.h @@ -208,7 +208,9 @@ static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long addr #endif /* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */ - *(uint32_t *)jmp_addr |= ((addr - (jmp_addr + 8)) >> 2) & 0xffffff; + *(uint32_t *)jmp_addr = + (*(uint32_t *)jmp_addr & ~0xffffff) + | (((addr - (jmp_addr + 8)) >> 2) & 0xffffff); #if QEMU_GNUC_PREREQ(4, 1) __clear_cache((char *) jmp_addr, (char *) jmp_addr + 4);
Hello, this patch fixes the linking of generated blocks on an ARM host. No need to say this brings a very nice speedup :-) Laurent Signed-off-by: Laurent Desnogues <laurent.desnogues@gmail.com>