Re: [kvm-unit-tests PATCH v2 5/5] powerpc: Check lswx in little-endian mode.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 21 Mar 2016 12:33:34 +0100
Laurent Vivier <lvivier@xxxxxxxxxx> wrote:

> For lswx in little-endian mode, an alignment interrupt occurs.
> 
> Signed-off-by: Laurent Vivier <lvivier@xxxxxxxxxx>
> Reviewed-by: Thomas Huth <thuth@xxxxxxxxxx>

I'm not entirely clear here; will the test fail if the alignment
exception doesn't occur in little endian mode?

The general trend in Power has been for less and less things to trigger
alignment exceptions, so failing to cause an alignment exception
shouldn't cause a test failure (as long as the unaligned case is
correctly processed, of course).

> ---
>  powerpc/emulator.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/powerpc/emulator.c b/powerpc/emulator.c
> index 8d0dde2..87ef4a9 100644
> --- a/powerpc/emulator.c
> +++ b/powerpc/emulator.c
> @@ -7,6 +7,7 @@
>  
>  static int verbose;
>  static int volatile is_invalid;
> +static int volatile alignment;
>  
>  static void program_check_handler(struct pt_regs *regs, void *opaque)
>  {
> @@ -30,6 +31,18 @@ static void program_check_handler(struct pt_regs *regs, void *opaque)
>  	regs->nip += 4;
>  }
>  
> +static void alignment_handler(struct pt_regs *regs, void *opaque)
> +{
> +	int *data = opaque;
> +
> +	printf("Detected alignment exception 0x%016lx: %08x\n",
> +	       regs->nip, *(uint32_t*)regs->nip);
> +
> +	*data = 1;
> +
> +	regs->nip += 4;
> +}
> +
>  static void test_illegal(void)
>  {
>  	report_prefix_push("invalid");
> @@ -73,6 +86,8 @@ static void test_64bit(void)
>   * - RT <= RA or RB < RT + (n + 4) is invalid or result is undefined
>   * - RT == RA == 0 is invalid
>   *
> + * For lswx in little-endian mode, an alignment interrupt always occurs.
> + *
>   */
>  
>  static void test_lswx(void)
> @@ -90,6 +105,7 @@ static void test_lswx(void)
>  
>  	/* check incomplete register filling */
>  
> +	alignment = 0;
>  	asm volatile ("mtxer %[len];"
>  		      "li r12,-1;"
>  		      "mr r11, r12;"
> @@ -103,7 +119,12 @@ static void test_lswx(void)
>  		      :
>  		      "xer", "r11", "r12", "memory");
>  
> +#if  __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
> +	report("alignment", alignment);
> +	return;
> +#else
>  	report("partial", regs[0] == 0x01020300 && regs[1] == (uint64_t)-1);
> +#endif
>  
>  	/* check an old know bug: the number of bytes is used as
>  	 * the number of registers, so try 32 bytes.
> @@ -200,6 +221,7 @@ int main(int argc, char **argv)
>  	int i;
>  
>  	handle_exception(0x700, program_check_handler, (void *)&is_invalid);
> +	handle_exception(0x600, alignment_handler, (void *)&alignment);
>  
>  	for (i = 0; i < argc; i++) {
>  		if (strcmp(argv[i], "-v") == 0) {
> -- 
> 2.5.0
> 


-- 
David Gibson <dgibson@xxxxxxxxxx>
Senior Software Engineer, Virtualization, Red Hat

Attachment: pgpJI7QD4GgUc.pgp
Description: OpenPGP digital signature


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux