diff --git a/tests/misc/Makefile b/tests/misc/Makefile new file mode 100644 index 0000000..3f92384 --- /dev/null +++ b/tests/misc/Makefile @@ -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 index 0000000..9eb752c --- /dev/null +++ b/tests/misc/head.S @@ -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 index 0000000..0b9079c --- /dev/null +++ b/tests/misc/misc.c @@ -0,0 +1,44 @@ +#include +#include +#include + +#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 index 0000000..0b65470 --- /dev/null +++ b/tests/misc/powerpc.lds @@ -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 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 index 0000000..9b718c5 --- /dev/null +++ b/tests/test_misc.console_out @@ -0,0 +1,2 @@ +Test 01:PASS +Test 02:PASS diff --git a/tests/update_console_tests b/tests/update_console_tests index d8fb44e..57ac0b0 100755 --- a/tests/update_console_tests +++ b/tests/update_console_tests @@ -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 -