From c107fe2feeb70bbf34ae082ba8d1a0984939d6b9 Mon Sep 17 00:00:00 2001 From: Michael Neuling Date: Tue, 17 Mar 2020 16:05:27 +1100 Subject: [PATCH] Add tests for the decremeter, rfid and mtmsrd and sprg This adds a bunch of test which report their status via the console. Adds a new make check scheme which compares console for a known output. Signed-off-by: Michael Neuling --- .gitignore | 5 +- Makefile | 8 +- scripts/run_test_console.sh | 38 ++++++ tests/decrementer/Makefile | 28 +++++ tests/decrementer/decrementer.c | 54 +++++++++ tests/decrementer/head.S | 184 +++++++++++++++++++++++++++++ tests/decrementer/powerpc.lds | 13 ++ tests/test_decrementer.bin | Bin 0 -> 5220 bytes tests/test_decrementer.console_out | 3 + 9 files changed, 330 insertions(+), 3 deletions(-) create mode 100755 scripts/run_test_console.sh create mode 100644 tests/decrementer/Makefile create mode 100644 tests/decrementer/decrementer.c create mode 100644 tests/decrementer/head.S create mode 100644 tests/decrementer/powerpc.lds create mode 100755 tests/test_decrementer.bin create mode 100644 tests/test_decrementer.console_out diff --git a/.gitignore b/.gitignore index 3c7c0b5..4da9f83 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,7 @@ *.cf *.s *_tb -main_ram.bin \ No newline at end of file +main_ram.bin +tests/decrementer/decrementer.bin +tests/decrementer/decrementer.hex +tests/decrementer/decrementer.elf \ No newline at end of file diff --git a/Makefile b/Makefile index a1658d4..2f90f22 100644 --- a/Makefile +++ b/Makefile @@ -128,14 +128,18 @@ dmi_dtm_tb: dmi_dtm_tb.o sim_vhpi_c.o sim_bram_helpers_c.o $(GHDL) -e $(GHDLFLAGS) -Wl,sim_vhpi_c.o -Wl,sim_bram_helpers_c.o $@ tests = $(sort $(patsubst tests/%.out,%,$(wildcard tests/*.out))) +tests_console = $(sort $(patsubst tests/%.console_out,%,$(wildcard tests/*.console_out))) -check: $(tests) test_micropython test_micropython_long +check: $(tests) $(test_console) test_micropython test_micropython_long -check_light: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 test_micropython test_micropython_long +check_light: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 test_micropython test_micropython_long $(tests_console) $(tests): core_tb @./scripts/run_test.sh $@ +$(tests_console): core_tb + @./scripts/run_test_console.sh $@ + test_micropython: core_tb @./scripts/test_micropython.py diff --git a/scripts/run_test_console.sh b/scripts/run_test_console.sh new file mode 100755 index 0000000..1aaa2bb --- /dev/null +++ b/scripts/run_test_console.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Runs a test and checks the console output against known good output + +if [ $# -ne 1 ]; then + echo "Usage: run_test.sh " + exit 1 +fi + +TEST=$1 + +TMPDIR=$(mktemp -d) + +function finish { + rm -rf "$TMPDIR" +} + +trap finish EXIT + +MICROWATT_DIR=$PWD + +cd $TMPDIR + +cp ${MICROWATT_DIR}/tests/${TEST}.bin main_ram.bin + +${MICROWATT_DIR}/core_tb > /dev/null 2> test1.out || true + +grep -v "Failed to bind debug socket" test1.out > test.out + +cp ${MICROWATT_DIR}/tests/${TEST}.console_out exp.out + +cp test.out /tmp +cp exp.out /tmp + +diff -q test.out exp.out && echo "$TEST PASS" && exit 0 + +echo "$TEST FAIL ********" +exit 1 diff --git a/tests/decrementer/Makefile b/tests/decrementer/Makefile new file mode 100644 index 0000000..5a97b41 --- /dev/null +++ b/tests/decrementer/Makefile @@ -0,0 +1,28 @@ +ARCH = $(shell uname -m) +ifneq ("$(ARCH)", "ppc64") +ifneq ("$(ARCH)", "ppc64le") + CROSS_COMPILE = powerpc64le-linux- + endif + endif + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)ld +OBJCOPY = $(CROSS_COMPILE)objcopy + +CFLAGS = -Os -g -Wall -std=c99 -msoft-float -mno-string -mno-multiple -mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector -mstrict-align -ffreestanding -fdata-sections -ffunction-sections -I ../../hello_world +ASFLAGS = $(CFLAGS) +LDFLAGS = -T powerpc.lds + +all: decrementer.hex + +decrementer.elf: decrementer.o head.o ../../hello_world/console.o + $(LD) $(LDFLAGS) -o decrementer.elf decrementer.o head.o ../../hello_world/console.o + +decrementer.bin: decrementer.elf + $(OBJCOPY) -O binary decrementer.elf decrementer.bin + +decrementer.hex: decrementer.bin + ../../scripts/bin2hex.py decrementer.bin > decrementer.hex + +clean: + @rm -f *.o decrementer.elf decrementer.bin decrementer.hex diff --git a/tests/decrementer/decrementer.c b/tests/decrementer/decrementer.c new file mode 100644 index 0000000..36ac922 --- /dev/null +++ b/tests/decrementer/decrementer.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#include "console.h" + +#define TEST "Test " +#define PASS "PASS\r\n" +#define FAIL "FAIL\r\n" + +extern int dec_test_1(void); +extern int dec_test_2(void); +extern int dec_test_3(void); + +// i < 100 +void print_test_number(int i) +{ + putstr(TEST, strlen(TEST)); + putchar(48 + i/10); + putchar(48 + i%10); + putstr(":", 1); +} + +int main(void) +{ + int fail = 0; + + potato_uart_init(); + + print_test_number(1); + if (dec_test_1() != 0) { + fail = 1; + putstr(FAIL, strlen(FAIL)); + } else + putstr(PASS, strlen(PASS)); + + print_test_number(2); + if (dec_test_2() != 0) { + fail = 1; + putstr(FAIL, strlen(FAIL)); + } else + putstr(PASS, strlen(PASS)); + + + print_test_number(3); + if (dec_test_3() != 0) { + fail = 1; + putstr(FAIL, strlen(FAIL)); + } else + putstr(PASS, strlen(PASS)); + + return fail; +} diff --git a/tests/decrementer/head.S b/tests/decrementer/head.S new file mode 100644 index 0000000..81431c1 --- /dev/null +++ b/tests/decrementer/head.S @@ -0,0 +1,184 @@ +/* Copyright 2013-2014 IBM Corp. + * + * 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 + +#define FIXUP_ENDIAN \ + tdi 0,0,0x48; /* Reverse endian of b . + 8 */ \ + b 191f; /* Skip trampoline if endian is good */ \ + .long 0xa600607d; /* mfmsr r11 */ \ + .long 0x01006b69; /* xori r11,r11,1 */ \ + .long 0x05009f42; /* bcl 20,31,$+4 */ \ + .long 0xa602487d; /* mflr r10 */ \ + .long 0x14004a39; /* addi r10,r10,20 */ \ + .long 0xa64b5a7d; /* mthsrr0 r10 */ \ + .long 0xa64b7b7d; /* mthsrr1 r11 */ \ + .long 0x2402004c; /* hrfid */ \ +191: + + +/* 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 + + /* QEMU enters at 0x10 */ + . = 0x10 + FIXUP_ENDIAN + b boot_entry + + . = 0x100 + FIXUP_ENDIAN + b boot_entry + +.global boot_entry +boot_entry: + /* setup stack */ + LOAD_IMM64(%r1, STACK_TOP - 0x100) + LOAD_IMM64(%r12, main) + mtctr %r12, + bctrl + .long 0x0 // illegal to terminate on exit + b . + +/* test to see if end up at the instruction after the rfid */ +.global dec_test_1 +dec_test_1: + li %r3, 0 + mtdec %r3 + LOAD_IMM64(%r3, dec_test_1_rfid) + mtsrr0 %r3 + LOAD_IMM64(%r3, 0x9000000000008003) + mtsrr1 %r3 + li %r3, 1 // preload with a fail code + rfid +dec_test_1_rfid: + b 1f // should be skipped + b 1f // should be skipped + li %r3, 0 + blr +1: + li %r3, 1 + blr + + +/* test to see if end up at the instruction after the rfid */ +.global dec_test_2 +dec_test_2: + li %r3, 0x100 + mtdec %r3 + LOAD_IMM64(%r3, dec_test_2_rfid) + mtsrr0 %r3 + LOAD_IMM64(%r3, 0x9000000000008003) + mtsrr1 %r3 + li %r3, 1 // preload with a fail code + rfid +dec_test_2_rfid: + b . // should wait here and then be skipped + b 1f // should be skipped + li %r3, 0 + blr +1: + li %r3, 1 + blr + + +/* test mtmsrd */ +.global dec_test_3 +dec_test_3: + LOAD_IMM64(%r3, 0x9000000000000003) + mtmsrd %r3 // EE off + li %r3, 0x0 // shouldn't fire right away + mtdec %r3 + b 2f + nop + b 1f // shouln't get here +2: + LOAD_IMM64(%r3, 0x9000000000008003) + mtmsrd %r3 // EE on + b 1f // shouln't get here + b 1f // shouln't get here + + li %r3, 0 + blr +1: + li %r3, 1 + blr + +#define EXCEPTION(nr) \ + .= nr ;\ + b . + + /* More exception stubs */ + EXCEPTION(0x300) + EXCEPTION(0x380) + EXCEPTION(0x400) + EXCEPTION(0x480) + EXCEPTION(0x500) + EXCEPTION(0x600) + EXCEPTION(0x700) + EXCEPTION(0x800) + + . = 0x900 + mtsprg0 %r3 + LOAD_IMM64(%r3, 0x000000000ffffff) + mtdec %r3 + mfsrr0 %r3 + addi %r3, %r3, 8 // skip 2 instructions + mtsrr0 %r3 + mfsprg0 %r3 + rfid + + EXCEPTION(0x980) + EXCEPTION(0xa00) + EXCEPTION(0xb00) + EXCEPTION(0xc00) + EXCEPTION(0xd00) + EXCEPTION(0xe00) + EXCEPTION(0xe20) + EXCEPTION(0xe40) + EXCEPTION(0xe60) + EXCEPTION(0xe80) + EXCEPTION(0xf00) + EXCEPTION(0xf20) + EXCEPTION(0xf40) + EXCEPTION(0xf60) + EXCEPTION(0xf80) +#if 0 + EXCEPTION(0x1000) + EXCEPTION(0x1100) + EXCEPTION(0x1200) + EXCEPTION(0x1300) + EXCEPTION(0x1400) + EXCEPTION(0x1500) + EXCEPTION(0x1600) +#endif + + diff --git a/tests/decrementer/powerpc.lds b/tests/decrementer/powerpc.lds new file mode 100644 index 0000000..0b65470 --- /dev/null +++ b/tests/decrementer/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_decrementer.bin b/tests/test_decrementer.bin new file mode 100755 index 0000000000000000000000000000000000000000..f2820d14bac71b7191e4c3507829874128ea4a2f GIT binary patch literal 5220 zcmeHLO=uHA6#iz@YK*l+@E}$(sTNug?7>4~swSzet*Is29>mksMDXXLL?x{ocM*ju zJ?K%8wqjZEA|CbRPf@&h=*6S|hl-bi3X#^1?`=1lhFU8ntV#!l+5P5y?|tvhklD-@ zfi@I1dhu=s+Hw-su@eySAynqtG%LIpYjTGYR_VUTSGuaf;{@KTc=38Os8)yQ8 z^6Bzmmc}$T1|?wb00w%VE+6Qn@yK2OK#%3QoC{W%ola3GgbZ1pvpS8$PZ2*w{8V~G zq@?BP({Xh+?lBoZrwiiIT6Fj+c9k7ph5|4<8RrpVZog9t^h^5Y_FJllG^d4R{dOKR zS|GQurcztd&bGhQ{P*n?xA*ZK)4fR1nb)UV@sm2A#br?I_WpA_ei=&oM=qE0|D$sKcg9QWKmU^cu0G|S zpI_bLXUnaBvHlmI;XEED)T57ni1EC7^U?Bn^_l;d(IyPXLzd>%X?~LCCY5@-OJ-Cg zTXSB|PQEjUlOI#T{2R@_2awsCw2k}lI&#UuUQA9KjW9wxm!-OQIG7K{`s74PZ=`dT z@j3@r>Tr{Q89JItg<2e}5y6mDD&fc%rUnT7)W*74UqMUH%w2}$|Hm!FyF6iYWp9n4 z-@}C%=aA$aNPmM9qo8~22lsVEBYq|EZ#sP7*4AMR&fR7{UUyU z3IBEpe}565^Ja}{@}bn@T?aESBiT=*#+hOcy>D>dlccrSZeNMrmzi&Td9=i?uEg%S zV`q}xTs6nT0Nr&!BGAwiKtnIg+OLeQLo~d$fT8`XeK+Aa;GwW)^eAD*KltGb1NBtG zhEsWUA?n5Pao!6H<#`<*a6JDjPVwGdQ#)#8X%7_kNp#|YQH8-M*BRe9SEFA*MXpoc z?@MwA0^vJt%{k!8R_0_An{phJw1>xk+WyG4HP+s-$_FH4U0pnOAIY2!(Cl`{g6>7^ zCi)JbA{!GmRRZ)~iM7=Gr