On Mon, 17 Jun 2019 21:12:05 +1000
David Gibson <da...@gibson.dropbear.id.au> wrote:

> On Mon, Jun 17, 2019 at 10:25:10AM +0200, Greg Kurz wrote:
> 65;5603;1c> On Wed, 12 Jun 2019 12:07:23 +1000
> > Alexey Kardashevskiy <a...@ozlabs.ru> wrote:
> >   
> > > At the moment the rtas's Makefile uses generic QEMU rules which means
> > > that when QEMU is compiled on a little endian system, the spapr-rtas.bin
> > > is compiled as little endian too which is incorrect as it is always
> > > executed in big endian mode.  
> > 
> > I'm naively thinking that executing code compiled as little endian
> > in big endian mode would result in an exception... Can you explain
> > how/why this ever worked ?  
> 
> Because basically nobody actually built the rtas blob from the
> sources, they just used the pre-compiled blob, which is correctly
> built BE.
> 

Ah ! Everyone has been using blob from this pre-ppc64le commit:

commit d818bfc5c34c59e9c6d03b3b9983bb5435967292
Author: Aurelien Jarno <aurel...@aurel32.net>
Date:   Fri Apr 1 20:04:24 2011 +0200

    pc-bios/spapr-rtas.bin: remove executable flag
    
    Signed-off-by: Aurelien Jarno <aurel...@aurel32.net>

> That said executing LE code in BE mode won't necessarily result in an
> exception - it'll just execute whatever the instructions are you get
> when you byte reverse the ones you inteded, which may or may not be
> valid.  It's *likely* to cause an exception fairly soon, but the
> opcode space is densely populated enough that there's a good chance it
> won't cause an immediate illegal instruction.
> 

In theory yes, but in this precise case, the first instruction of the
rtas blob is 7c641b78 ('mr r4, r3') and I've manually checked that
781b647c raises an exception on both POWER8 and POWER9.

Attachment: pgpIlbwxNNe8T.pgp
Description: OpenPGP digital signature

Reply via email to