Add a new misc test suite with addpcis tests
authorShawn Anastasio <shawn@anastas.io>
Tue, 26 May 2020 01:08:59 +0000 (20:08 -0500)
committerShawn Anastasio <shawn@anastas.io>
Tue, 26 May 2020 04:49:42 +0000 (23:49 -0500)
The two tests obtain NIA with bl+mflr+addi and then compare it
against addpcis with the minimum and maximum immediate operand values.

They were also tested on a real POWER9 system (in userspace) for good
measure.

Signed-off-by: Shawn Anastasio <shawn@anastas.io>
tests/misc/Makefile [new file with mode: 0644]
tests/misc/head.S [new file with mode: 0644]
tests/misc/misc.c [new file with mode: 0644]
tests/misc/powerpc.lds [new file with mode: 0644]
tests/test_misc.bin [new file with mode: 0755]
tests/test_misc.console_out [new file with mode: 0644]
tests/update_console_tests

diff --git a/tests/misc/Makefile b/tests/misc/Makefile
new file mode 100644 (file)
index 0000000..3f92384
--- /dev/null
@@ -0,0 +1,3 @@
+TEST=misc
+
+include ../Makefile.test
diff --git a/tests/misc/head.S b/tests/misc/head.S
new file mode 100644 (file)
index 0000000..9eb752c
--- /dev/null
@@ -0,0 +1,102 @@
+/* Copyright 2013-2014 IBM Corp.
+ * Copyrignt 2020 Shawn Anastasio
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define STACK_TOP 0x2000
+
+/* Load an immediate 64-bit value into a register */
+#define LOAD_IMM64(r, e)                       \
+       lis     r,(e)@highest;                  \
+       ori     r,r,(e)@higher;                 \
+       rldicr  r,r, 32, 31;                    \
+       oris    r,r, (e)@h;                     \
+       ori     r,r, (e)@l;
+
+       .section ".head","ax"
+
+       /*
+        * Microwatt currently enters in LE mode at 0x0, so we don't need to
+        * do any endian fix ups
+        */
+       . = 0
+.global _start
+_start:
+       b       boot_entry
+
+.global boot_entry
+boot_entry:
+       /* setup stack */
+       LOAD_IMM64(%r1, STACK_TOP - 0x100)
+       LOAD_IMM64(%r12, main)
+       mtctr   %r12
+       bctrl
+       attn // terminate on exit
+       b .
+
+
+/* Test addpcis with an immediate operand of 0 (min) */
+.global test_addpcis_1
+test_addpcis_1:
+    mflr %r0
+    std %r0, 16(%r1)
+    stdu %r1, -32(%r1)
+
+    /* get address of 1 */
+    bl 1f
+    1: mflr %r4
+    addpcis %r5, 0
+
+    /*
+     * At this point, r5 should equal r4 + 2*4
+     * return 0 if they're equal.
+     */
+    addi %r4, %r4, 8
+
+    sub %r3, %r4, %r5
+
+    addi %r1, %r1, 32
+    ld %r0, 16(%r1)
+    mtlr %r0
+
+    blr
+
+/* Test addpcis with an immediate operand of 0xFFFF (max) */
+.global test_addpcis_2
+test_addpcis_2:
+    mflr %r0
+    std %r0, 16(%r1)
+    stdu %r1, -32(%r1)
+
+    /* get address of 1 */
+    bl 1f
+    1: mflr %r4
+    addpcis %r5, 0xFFFF
+
+    /*
+     * Add 8 to r4 to bring it in line with addpcis' NIA.
+     * Then add 0xFFFF shifted and compare.
+     */
+    addi %r4, %r4, 8
+    addis %r4, %r4, 0xFFFF
+
+    sub %r3, %r4, %r5
+
+    addi %r1, %r1, 32
+    ld %r0, 16(%r1)
+    mtlr %r0
+
+    blr
+
diff --git a/tests/misc/misc.c b/tests/misc/misc.c
new file mode 100644 (file)
index 0000000..0b9079c
--- /dev/null
@@ -0,0 +1,44 @@
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "console.h"
+
+#define TEST "Test "
+#define PASS "PASS\n"
+#define FAIL "FAIL\n"
+
+extern long test_addpcis_1(void);
+extern long test_addpcis_2(void);
+
+// i < 100
+void print_test_number(int i)
+{
+       puts(TEST);
+       putchar(48 + i/10);
+       putchar(48 + i%10);
+       putchar(':');
+}
+
+int main(void)
+{
+       int fail = 0;
+
+       potato_uart_init();
+
+       print_test_number(1);
+       if (test_addpcis_1() != 0) {
+               fail = 1;
+               puts(FAIL);
+       } else
+               puts(PASS);
+
+       print_test_number(2);
+       if (test_addpcis_2() != 0) {
+               fail = 1;
+               puts(FAIL);
+       } else
+               puts(PASS);
+
+       return fail;
+}
diff --git a/tests/misc/powerpc.lds b/tests/misc/powerpc.lds
new file mode 100644 (file)
index 0000000..0b65470
--- /dev/null
@@ -0,0 +1,13 @@
+SECTIONS
+{
+       _start = .;
+       . = 0;
+       .head : {
+               KEEP(*(.head))
+       }
+       . = 0x1000;
+       .text : { *(.text) }
+       . = 0x2000;
+       .data : { *(.data) }
+       .bss : { *(.bss) }
+}
diff --git a/tests/test_misc.bin b/tests/test_misc.bin
new file mode 100755 (executable)
index 0000000..a32d52c
Binary files /dev/null and b/tests/test_misc.bin differ
diff --git a/tests/test_misc.console_out b/tests/test_misc.console_out
new file mode 100644 (file)
index 0000000..9b718c5
--- /dev/null
@@ -0,0 +1,2 @@
+Test 01:PASS\r
+Test 02:PASS\r
index d8fb44e7c6d608e1703d7f0e9f3ea8f1e0380bdf..57ac0b0a6ba65d88f5764a86f7e5ffabfdf82fef 100755 (executable)
@@ -3,7 +3,7 @@
 # Script to update console related tests from source
 #
 
-for i in sc illegal decrementer xics privileged mmu ; do
+for i in sc illegal decrementer xics privileged mmu misc ; do
     cd $i
     make
     cd -