All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <lvivier@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: kvm@vger.kernel.org, kvm-ppc@vger.kernel.org, thuth@redhat.com,
	dgibson@redhat.com, agraf@suse.de, pbonzini@redhat.com
Subject: Re: [kvm-unit-tests PATCH v3 2/2] powerpc: select endianness
Date: Tue, 01 Mar 2016 08:12:19 +0000	[thread overview]
Message-ID: <56D54EE3.407@redhat.com> (raw)
In-Reply-To: <20160229194435.7bj42ap6fzfqgikd@hawk.localdomain>



On 29/02/2016 20:44, Andrew Jones wrote:
> On Mon, Feb 29, 2016 at 06:49:06PM +0100, Laurent Vivier wrote:
>> This patch allows to build tests for ppc64 little endian target
>> (ppc64le) on big and little endian hosts.
>>
>> We add a new parameter to configure to select the endianness of the
>> tests (--endian=little or --endian=big).
>>
>> I have built and tested big and little endian tests on a little
>> endian host, a big endian host, with kvm_hv and kvm_pr, and on
>> x86_64 with ppc64 as a TCG target.
>>
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>  configure                 | 11 +++++++++++
>>  lib/powerpc/asm/ppc_asm.h | 19 +++++++++++++++++++
>>  lib/ppc64/asm/io.h        |  8 ++++++++
>>  powerpc/Makefile.common   |  3 ++-
>>  powerpc/Makefile.ppc64    |  9 +++++++--
>>  powerpc/cstart64.S        | 20 ++++++++++++++++----
>>  6 files changed, 63 insertions(+), 7 deletions(-)
>>
>> diff --git a/configure b/configure
>> index a685cca..90e39d4 100755
>> --- a/configure
>> +++ b/configure
>> @@ -10,6 +10,7 @@ ar=ar
>>  arch=`uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/'`
>>  host=$arch
>>  cross_prefix>> +endian=""
>>  
>>  usage() {
>>      cat <<-EOF
>> @@ -23,6 +24,7 @@ usage() {
>>  	    --ld=LD		   ld linker to use ($ld)
>>  	    --prefix=PREFIX        where to install things ($prefix)
>>  	    --kerneldir=DIR        kernel build directory for kvm.h ($kerneldir)
>> +	    --endian=ENDIAN        endianness to compile for (little or big, ppc64 only)
>>  EOF
>>      exit 1
>>  }
>> @@ -50,6 +52,9 @@ while [[ "$1" = -* ]]; do
>>  	--cross-prefix)
>>  	    cross_prefix="$arg"
>>  	    ;;
>> +	--endian)
>> +	    endian="$arg"
>> +	    ;;
>>  	--cc)
>>  	    cc="$arg"
>>  	    ;;
>> @@ -84,6 +89,11 @@ elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
>>  elif [ "$arch" = "ppc64" ]; then
>>      testdir=powerpc
>>      firmware="$testdir/boot_rom.bin"
>> +    if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then
>> +        echo "You must provide endianness (big or little)!"
>> +        usage
>> +        exit 1
> 
> redundant 'exit 1', usage() already has one in it

OK

> 
>> +    fi
>>  else
>>      testdir=$arch
>>  fi
>> @@ -139,4 +149,5 @@ AR=$cross_prefix$ar
>>  API=$api
>>  TEST_DIR=$testdir
>>  FIRMWARE=$firmware
>> +ENDIAN=$endian
>>  EOF
>> diff --git a/lib/powerpc/asm/ppc_asm.h b/lib/powerpc/asm/ppc_asm.h
>> index f63bb72..f18100e 100644
>> --- a/lib/powerpc/asm/ppc_asm.h
>> +++ b/lib/powerpc/asm/ppc_asm.h
>> @@ -11,4 +11,23 @@
>>  #define LOAD_REG_ADDR(reg,name)			\
>>  	ld	reg,name@got(r2)
>>  
>> +#if __BYTE_ORDER__ = __ORDER_BIG_ENDIAN__
>> +
>> +#define FIXUP_ENDIAN
>> +
>> +#elif __BYTE_ORDER__ = __ORDER_LITTLE_ENDIAN__
>> +
>> +#define FIXUP_ENDIAN				\
>> +	.long 0x05000048; /* bl . + 4        */ \
>> +	.long 0xa602487d; /* mflr r10        */	\
>> +	.long 0x20004a39; /* addi r10,r10,32 */	\
>> +	.long 0xa600607d; /* mfmsr r11       */	\
>> +	.long 0x01006b69; /* xori r11,r11,1  */	\
>> +	.long 0xa6035a7d; /* mtsrr0 r10	     */	\
>> +	.long 0xa6037b7d; /* mtsrr1 r11      */	\
>> +	.long 0x2400004c; /* rfid            */ \
>> +	.long 0x00000048; /* b .             */ \
>> +
>> +#endif /* __BYTE_ORDER__ */
>> +
>>  #endif /* _ASMPOWERPC_PPC_ASM_H */
>> diff --git a/lib/ppc64/asm/io.h b/lib/ppc64/asm/io.h
>> index c0801d4..4f2c31b 100644
>> --- a/lib/ppc64/asm/io.h
>> +++ b/lib/ppc64/asm/io.h
>> @@ -1,5 +1,13 @@
>>  #ifndef _ASMPPC64_IO_H_
>>  #define _ASMPPC64_IO_H_
>> +
>> +#if __BYTE_ORDER__ = __ORDER_LITTLE_ENDIAN__
>> +#define __cpu_is_be() (0)
>> +#elif __BYTE_ORDER__ = __ORDER_BIG_ENDIAN__
>>  #define __cpu_is_be() (1)
>> +#else
>> +#error Undefined byte order
>> +#endif
>> +
>>  #include <asm-generic/io.h>
>>  #endif
>> diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
>> index cc27ac8..b526668 100644
>> --- a/powerpc/Makefile.common
>> +++ b/powerpc/Makefile.common
>> @@ -11,7 +11,6 @@ all: $(TEST_DIR)/boot_rom.bin test_cases
>>  
>>  ##################################################################
>>  
>> -CFLAGS += $(arch_CFLAGS)
>>  CFLAGS += -std=gnu99
>>  CFLAGS += -ffreestanding
>>  CFLAGS += -Wextra
>> @@ -32,6 +31,7 @@ cflatobjs += lib/powerpc/setup.o
>>  cflatobjs += lib/powerpc/rtas.o
>>  
>>  FLATLIBS = $(libcflat) $(LIBFDT_archive)
>> +%.elf: CFLAGS += $(arch_CFLAGS)
>>  %.elf: LDFLAGS = $(arch_LDFLAGS) -nostdlib -pie
>>  %.elf: %.o $(FLATLIBS) powerpc/flat.lds
>>  	$(LD) $(LDFLAGS) -o $@ \
>> @@ -48,6 +48,7 @@ $(TEST_DIR)/boot_rom.bin: $(TEST_DIR)/boot_rom.elf
>>  	dd if=/dev/zero of=$@ bs%6 count=1
>>  	$(OBJCOPY) -O binary $^ >(cat - >>$@)
>>  
>> +$(TEST_DIR)/boot_rom.elf: CFLAGS = -mbig-endian
>>  $(TEST_DIR)/boot_rom.elf: $(TEST_DIR)/boot_rom.o
>>  	$(LD) -EB -nostdlib -Ttext=0x100 --entry=start --build-id=none -o $@ $<
>>  
>> diff --git a/powerpc/Makefile.ppc64 b/powerpc/Makefile.ppc64
>> index 2df44d4..3da3a83 100644
>> --- a/powerpc/Makefile.ppc64
>> +++ b/powerpc/Makefile.ppc64
>> @@ -5,8 +5,13 @@
>>  #
>>  bits = 64
>>  
>> -arch_CFLAGS = -mbig-endian
>> -arch_LDFLAGS = -EB
>> +ifeq ($(ENDIAN),little)
>> +    arch_CFLAGS = -mlittle-endian
>> +    arch_LDFLAGS = -EL
>> +else
>> +    arch_CFLAGS = -mbig-endian
>> +    arch_LDFLAGS = -EB
>> +endif
>>  
>>  cstart.o = $(TEST_DIR)/cstart64.o
>>  reloc.o  = $(TEST_DIR)/reloc64.o
>> diff --git a/powerpc/cstart64.S b/powerpc/cstart64.S
>> index 6072597..62078a4 100644
>> --- a/powerpc/cstart64.S
>> +++ b/powerpc/cstart64.S
>> @@ -16,6 +16,7 @@
>>   */
>>  .globl start
>>  start:
>> +	FIXUP_ENDIAN
>>  	/*
>>  	 * We were loaded at QEMU's kernel load address, but we're not
>>  	 * allowed to link there due to how QEMU deals with linker VMAs,
>> @@ -84,12 +85,23 @@ halt:
>>  enter_rtas:
>>  	mflr	r0
>>  	std	r0, 16(r1)
>> +
>> +	LOAD_REG_ADDR(r10, rtas_return_loc)
>> +	mtlr	r10
>>  	LOAD_REG_ADDR(r11, rtas_entry)
>>  	ld	r10, 0(r11)
>> -//FIXME: change this bctrl to an rtas-prep, rfid, rtas-return sequence
>> -	mtctr	r10
>> -	nop
>> -	bctrl
>> +
>> +	mfmsr	r11
>> +#if __BYTE_ORDER__ = __ORDER_LITTLE_ENDIAN__
>> +	xori	r11,r11,1
>> +#endif
> 
> We can avoid the #if.
> 
>  LOAD_REG_IMMEDIATE(r9, RTAS_MSR_MASK)
>  and	r11, r11, r9
> 
> Right now we'll define RTAS_MSR_MASK to the boring value of
> 0xfffffffffffffffe, but presumably that'll change some day.

OK

>> +	mtsrr0	r10
>> +	mtsrr1	r11
>> +	rfid
>> +	b       .
>> +
>> +rtas_return_loc:
>> +	FIXUP_ENDIAN
>>  	ld	r0, 16(r1)
>>  	mtlr	r0
>>  	blr
>> -- 
>> 2.5.0
> 
> Thanks,
> drew
> 

Thanks,
Laurent

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Vivier <lvivier@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: kvm@vger.kernel.org, kvm-ppc@vger.kernel.org, thuth@redhat.com,
	dgibson@redhat.com, agraf@suse.de, pbonzini@redhat.com
Subject: Re: [kvm-unit-tests PATCH v3 2/2] powerpc: select endianness
Date: Tue, 1 Mar 2016 09:12:19 +0100	[thread overview]
Message-ID: <56D54EE3.407@redhat.com> (raw)
In-Reply-To: <20160229194435.7bj42ap6fzfqgikd@hawk.localdomain>



On 29/02/2016 20:44, Andrew Jones wrote:
> On Mon, Feb 29, 2016 at 06:49:06PM +0100, Laurent Vivier wrote:
>> This patch allows to build tests for ppc64 little endian target
>> (ppc64le) on big and little endian hosts.
>>
>> We add a new parameter to configure to select the endianness of the
>> tests (--endian=little or --endian=big).
>>
>> I have built and tested big and little endian tests on a little
>> endian host, a big endian host, with kvm_hv and kvm_pr, and on
>> x86_64 with ppc64 as a TCG target.
>>
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>  configure                 | 11 +++++++++++
>>  lib/powerpc/asm/ppc_asm.h | 19 +++++++++++++++++++
>>  lib/ppc64/asm/io.h        |  8 ++++++++
>>  powerpc/Makefile.common   |  3 ++-
>>  powerpc/Makefile.ppc64    |  9 +++++++--
>>  powerpc/cstart64.S        | 20 ++++++++++++++++----
>>  6 files changed, 63 insertions(+), 7 deletions(-)
>>
>> diff --git a/configure b/configure
>> index a685cca..90e39d4 100755
>> --- a/configure
>> +++ b/configure
>> @@ -10,6 +10,7 @@ ar=ar
>>  arch=`uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/'`
>>  host=$arch
>>  cross_prefix=
>> +endian=""
>>  
>>  usage() {
>>      cat <<-EOF
>> @@ -23,6 +24,7 @@ usage() {
>>  	    --ld=LD		   ld linker to use ($ld)
>>  	    --prefix=PREFIX        where to install things ($prefix)
>>  	    --kerneldir=DIR        kernel build directory for kvm.h ($kerneldir)
>> +	    --endian=ENDIAN        endianness to compile for (little or big, ppc64 only)
>>  EOF
>>      exit 1
>>  }
>> @@ -50,6 +52,9 @@ while [[ "$1" = -* ]]; do
>>  	--cross-prefix)
>>  	    cross_prefix="$arg"
>>  	    ;;
>> +	--endian)
>> +	    endian="$arg"
>> +	    ;;
>>  	--cc)
>>  	    cc="$arg"
>>  	    ;;
>> @@ -84,6 +89,11 @@ elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
>>  elif [ "$arch" = "ppc64" ]; then
>>      testdir=powerpc
>>      firmware="$testdir/boot_rom.bin"
>> +    if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then
>> +        echo "You must provide endianness (big or little)!"
>> +        usage
>> +        exit 1
> 
> redundant 'exit 1', usage() already has one in it

OK

> 
>> +    fi
>>  else
>>      testdir=$arch
>>  fi
>> @@ -139,4 +149,5 @@ AR=$cross_prefix$ar
>>  API=$api
>>  TEST_DIR=$testdir
>>  FIRMWARE=$firmware
>> +ENDIAN=$endian
>>  EOF
>> diff --git a/lib/powerpc/asm/ppc_asm.h b/lib/powerpc/asm/ppc_asm.h
>> index f63bb72..f18100e 100644
>> --- a/lib/powerpc/asm/ppc_asm.h
>> +++ b/lib/powerpc/asm/ppc_asm.h
>> @@ -11,4 +11,23 @@
>>  #define LOAD_REG_ADDR(reg,name)			\
>>  	ld	reg,name@got(r2)
>>  
>> +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
>> +
>> +#define FIXUP_ENDIAN
>> +
>> +#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
>> +
>> +#define FIXUP_ENDIAN				\
>> +	.long 0x05000048; /* bl . + 4        */ \
>> +	.long 0xa602487d; /* mflr r10        */	\
>> +	.long 0x20004a39; /* addi r10,r10,32 */	\
>> +	.long 0xa600607d; /* mfmsr r11       */	\
>> +	.long 0x01006b69; /* xori r11,r11,1  */	\
>> +	.long 0xa6035a7d; /* mtsrr0 r10	     */	\
>> +	.long 0xa6037b7d; /* mtsrr1 r11      */	\
>> +	.long 0x2400004c; /* rfid            */ \
>> +	.long 0x00000048; /* b .             */ \
>> +
>> +#endif /* __BYTE_ORDER__ */
>> +
>>  #endif /* _ASMPOWERPC_PPC_ASM_H */
>> diff --git a/lib/ppc64/asm/io.h b/lib/ppc64/asm/io.h
>> index c0801d4..4f2c31b 100644
>> --- a/lib/ppc64/asm/io.h
>> +++ b/lib/ppc64/asm/io.h
>> @@ -1,5 +1,13 @@
>>  #ifndef _ASMPPC64_IO_H_
>>  #define _ASMPPC64_IO_H_
>> +
>> +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
>> +#define __cpu_is_be() (0)
>> +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
>>  #define __cpu_is_be() (1)
>> +#else
>> +#error Undefined byte order
>> +#endif
>> +
>>  #include <asm-generic/io.h>
>>  #endif
>> diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
>> index cc27ac8..b526668 100644
>> --- a/powerpc/Makefile.common
>> +++ b/powerpc/Makefile.common
>> @@ -11,7 +11,6 @@ all: $(TEST_DIR)/boot_rom.bin test_cases
>>  
>>  ##################################################################
>>  
>> -CFLAGS += $(arch_CFLAGS)
>>  CFLAGS += -std=gnu99
>>  CFLAGS += -ffreestanding
>>  CFLAGS += -Wextra
>> @@ -32,6 +31,7 @@ cflatobjs += lib/powerpc/setup.o
>>  cflatobjs += lib/powerpc/rtas.o
>>  
>>  FLATLIBS = $(libcflat) $(LIBFDT_archive)
>> +%.elf: CFLAGS += $(arch_CFLAGS)
>>  %.elf: LDFLAGS = $(arch_LDFLAGS) -nostdlib -pie
>>  %.elf: %.o $(FLATLIBS) powerpc/flat.lds
>>  	$(LD) $(LDFLAGS) -o $@ \
>> @@ -48,6 +48,7 @@ $(TEST_DIR)/boot_rom.bin: $(TEST_DIR)/boot_rom.elf
>>  	dd if=/dev/zero of=$@ bs=256 count=1
>>  	$(OBJCOPY) -O binary $^ >(cat - >>$@)
>>  
>> +$(TEST_DIR)/boot_rom.elf: CFLAGS = -mbig-endian
>>  $(TEST_DIR)/boot_rom.elf: $(TEST_DIR)/boot_rom.o
>>  	$(LD) -EB -nostdlib -Ttext=0x100 --entry=start --build-id=none -o $@ $<
>>  
>> diff --git a/powerpc/Makefile.ppc64 b/powerpc/Makefile.ppc64
>> index 2df44d4..3da3a83 100644
>> --- a/powerpc/Makefile.ppc64
>> +++ b/powerpc/Makefile.ppc64
>> @@ -5,8 +5,13 @@
>>  #
>>  bits = 64
>>  
>> -arch_CFLAGS = -mbig-endian
>> -arch_LDFLAGS = -EB
>> +ifeq ($(ENDIAN),little)
>> +    arch_CFLAGS = -mlittle-endian
>> +    arch_LDFLAGS = -EL
>> +else
>> +    arch_CFLAGS = -mbig-endian
>> +    arch_LDFLAGS = -EB
>> +endif
>>  
>>  cstart.o = $(TEST_DIR)/cstart64.o
>>  reloc.o  = $(TEST_DIR)/reloc64.o
>> diff --git a/powerpc/cstart64.S b/powerpc/cstart64.S
>> index 6072597..62078a4 100644
>> --- a/powerpc/cstart64.S
>> +++ b/powerpc/cstart64.S
>> @@ -16,6 +16,7 @@
>>   */
>>  .globl start
>>  start:
>> +	FIXUP_ENDIAN
>>  	/*
>>  	 * We were loaded at QEMU's kernel load address, but we're not
>>  	 * allowed to link there due to how QEMU deals with linker VMAs,
>> @@ -84,12 +85,23 @@ halt:
>>  enter_rtas:
>>  	mflr	r0
>>  	std	r0, 16(r1)
>> +
>> +	LOAD_REG_ADDR(r10, rtas_return_loc)
>> +	mtlr	r10
>>  	LOAD_REG_ADDR(r11, rtas_entry)
>>  	ld	r10, 0(r11)
>> -//FIXME: change this bctrl to an rtas-prep, rfid, rtas-return sequence
>> -	mtctr	r10
>> -	nop
>> -	bctrl
>> +
>> +	mfmsr	r11
>> +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
>> +	xori	r11,r11,1
>> +#endif
> 
> We can avoid the #if.
> 
>  LOAD_REG_IMMEDIATE(r9, RTAS_MSR_MASK)
>  and	r11, r11, r9
> 
> Right now we'll define RTAS_MSR_MASK to the boring value of
> 0xfffffffffffffffe, but presumably that'll change some day.

OK

>> +	mtsrr0	r10
>> +	mtsrr1	r11
>> +	rfid
>> +	b       .
>> +
>> +rtas_return_loc:
>> +	FIXUP_ENDIAN
>>  	ld	r0, 16(r1)
>>  	mtlr	r0
>>  	blr
>> -- 
>> 2.5.0
> 
> Thanks,
> drew
> 

Thanks,
Laurent

  reply	other threads:[~2016-03-01  8:12 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-29 17:49 [kvm-unit-tests PATCH v3 0/2] powerpc: add little-endian support Laurent Vivier
2016-02-29 17:49 ` Laurent Vivier
2016-02-29 17:49 ` [kvm-unit-tests PATCH v3 1/2] powerpc: add asm/ppc_asm.h Laurent Vivier
2016-02-29 17:49   ` Laurent Vivier
2016-02-29 18:56   ` Andrew Jones
2016-02-29 18:56     ` Andrew Jones
2016-03-01  8:30   ` Thomas Huth
2016-03-01  8:30     ` Thomas Huth
2016-02-29 17:49 ` [kvm-unit-tests PATCH v3 2/2] powerpc: select endianness Laurent Vivier
2016-02-29 17:49   ` Laurent Vivier
2016-02-29 19:44   ` Andrew Jones
2016-02-29 19:44     ` Andrew Jones
2016-03-01  8:12     ` Laurent Vivier [this message]
2016-03-01  8:12       ` Laurent Vivier
2016-03-01  8:40   ` Thomas Huth
2016-03-01  8:40     ` Thomas Huth
2016-03-01  8:54     ` Laurent Vivier
2016-03-01  8:54       ` Laurent Vivier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56D54EE3.407@redhat.com \
    --to=lvivier@redhat.com \
    --cc=agraf@suse.de \
    --cc=dgibson@redhat.com \
    --cc=drjones@redhat.com \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.