diff mbox

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

Message ID 1458141183-27207-6-git-send-email-lvivier@redhat.com
State Superseded
Headers show

Commit Message

Laurent Vivier March 16, 2016, 3:13 p.m. UTC
For lswx in little-endian mode, an alignment interrupt occurs.

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
 powerpc/emulator.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

Comments

Thomas Huth March 18, 2016, 9:54 a.m. UTC | #1
On 16.03.2016 16:13, Laurent Vivier wrote:
> For lswx in little-endian mode, an alignment interrupt occurs.
> 
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
>  powerpc/emulator.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/powerpc/emulator.c b/powerpc/emulator.c
> index dfe5859..3a8f17e 100644
> --- a/powerpc/emulator.c
> +++ b/powerpc/emulator.c
> @@ -6,6 +6,7 @@
>  #include <asm/processor.h>
>  
>  static int volatile is_invalid;
> +static int volatile alignment;
>  
>  static void program_check_handler(struct pt_regs *regs, void *opaque)
>  {
> @@ -19,6 +20,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");
> @@ -62,6 +75,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.
> + *
>   */
>  
>  #define SPR_XER	1
> @@ -81,6 +96,7 @@ static void test_lswx(void)
>  
>  	/* check incomplete register filling */
>  
> +	alignment = 0;
>  	asm volatile ("mtspr %[XER], %[len];"
>  		      "li r12,-1;"
>  		      "mr r11, r12;"
> @@ -98,7 +114,12 @@ static void test_lswx(void)
>  		       */
>  		      "xer", "r11", "r12");
>  
> +#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.
> @@ -195,6 +216,7 @@ static void test_lswx(void)
>  int main(void)
>  {
>  	handle_exception(0x700, program_check_handler, (void *)&is_invalid);
> +	handle_exception(0x600, alignment_handler, (void *)&alignment);
>  
>  	report_prefix_push("emulator");
>  

Reviewed-by: Thomas Huth <thuth@redhat.com>

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/powerpc/emulator.c b/powerpc/emulator.c
index dfe5859..3a8f17e 100644
--- a/powerpc/emulator.c
+++ b/powerpc/emulator.c
@@ -6,6 +6,7 @@ 
 #include <asm/processor.h>
 
 static int volatile is_invalid;
+static int volatile alignment;
 
 static void program_check_handler(struct pt_regs *regs, void *opaque)
 {
@@ -19,6 +20,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");
@@ -62,6 +75,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.
+ *
  */
 
 #define SPR_XER	1
@@ -81,6 +96,7 @@  static void test_lswx(void)
 
 	/* check incomplete register filling */
 
+	alignment = 0;
 	asm volatile ("mtspr %[XER], %[len];"
 		      "li r12,-1;"
 		      "mr r11, r12;"
@@ -98,7 +114,12 @@  static void test_lswx(void)
 		       */
 		      "xer", "r11", "r12");
 
+#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.
@@ -195,6 +216,7 @@  static void test_lswx(void)
 int main(void)
 {
 	handle_exception(0x700, program_check_handler, (void *)&is_invalid);
+	handle_exception(0x600, alignment_handler, (void *)&alignment);
 
 	report_prefix_push("emulator");