test: lm32: use semihosting for testing

Instead of the lm32-sys device, use semihosting to print to the host
console and exit the test.

Signed-off-by: Michael Walle <michael@walle.cc>
This commit is contained in:
Michael Walle 2014-04-22 20:18:43 +02:00
parent f7bbcfb5c3
commit 4e7d30a22a
5 changed files with 103 additions and 22 deletions

View File

@ -3,7 +3,7 @@
CROSS=lm32-elf- CROSS=lm32-elf-
SIM = qemu-system-lm32 SIM = qemu-system-lm32
SIMFLAGS = -M lm32-evr -nographic -device lm32-sys -net none -kernel SIMFLAGS = -M lm32-evr -nographic -semihosting -net none -kernel
CC = $(CROSS)gcc CC = $(CROSS)gcc
AS = $(CROSS)as AS = $(CROSS)as
@ -18,6 +18,7 @@ LDFLAGS = -T$(TSRC_PATH)/linker.ld
ASFLAGS += -Wa,-I,$(TSRC_PATH)/ ASFLAGS += -Wa,-I,$(TSRC_PATH)/
CRT = crt.o CRT = crt.o
HELPER = helper.o
TESTCASES += test_add.tst TESTCASES += test_add.tst
TESTCASES += test_addi.tst TESTCASES += test_addi.tst
TESTCASES += test_and.tst TESTCASES += test_and.tst
@ -91,15 +92,15 @@ all: build
%.o: $(TSRC_PATH)/%.S %.o: $(TSRC_PATH)/%.S
$(AS) $(ASFLAGS) -c $< -o $@ $(AS) $(ASFLAGS) -c $< -o $@
%.tst: %.o $(TSRC_PATH)/macros.inc $(CRT) %.tst: %.o $(TSRC_PATH)/macros.inc $(CRT) $(HELPER)
$(LD) $(LDFLAGS) $(NOSTDFLAGS) $(CRT) $< -o $@ $(LD) $(LDFLAGS) $(NOSTDFLAGS) $(CRT) $(HELPER) $< -o $@
build: $(CRT) $(TESTCASES) build: $(TESTCASES)
check: $(TESTCASES:test_%.tst=check_%) check: $(TESTCASES:test_%.tst=check_%)
check_%: test_%.tst $(CRT) $(SYS) check_%: test_%.tst
$(SIM) $(SIMFLAGS) $< @$(SIM) $(SIMFLAGS) $<
clean: clean:
$(RM) -fr $(TESTCASES) $(CRT) $(RM) -fr $(TESTCASES) $(CRT) $(HELPER)

View File

@ -8,9 +8,9 @@ _reset_handler:
ori r1, r1, lo(_start) ori r1, r1, lo(_start)
wcsr eba, r1 wcsr eba, r1
wcsr deba, r1 wcsr deba, r1
mvhi sp, hi(_fstack)
ori sp, sp, lo(_fstack)
bi _main bi _main
nop
nop
_breakpoint_handler: _breakpoint_handler:
ori r25, r25, 1 ori r25, r25, 1

65
tests/tcg/lm32/helper.S Normal file
View File

@ -0,0 +1,65 @@
.text
.global _start, _write, _exit
.global _tc_fail, _tc_pass
_write:
addi sp, sp, -4
sw (sp+4), r8
mvi r8, 5
scall
lw r8, (sp+4)
addi sp, sp, 4
ret
_exit:
mvi r8, 1
scall
1:
bi 1b
_tc_pass:
.data
1:
.ascii "OK\n"
2:
.text
addi sp, sp, -16
sw (sp+4), ra
sw (sp+8), r1
sw (sp+12), r2
sw (sp+16), r3
mvi r1, 1
mvhi r2, hi(1b)
ori r2, r2, lo(1b)
mvi r3, (2b - 1b)
calli _write
lw r3, (sp+16)
lw r2, (sp+12)
lw r1, (sp+8)
lw ra, (sp+4)
addi sp, sp, 16
ret
_tc_fail:
.data
1:
.ascii "FAILED\n"
2:
.text
addi sp, sp, -16
sw (sp+4), ra
sw (sp+8), r1
sw (sp+12), r2
sw (sp+16), r3
sw (sp+4), ra
mvi r1, 1
mvhi r2, hi(1b)
ori r2, r2, lo(1b)
mvi r3, (2b - 1b)
calli _write
lw r3, (sp+16)
lw r2, (sp+12)
lw r1, (sp+8)
lw ra, (sp+4)
addi sp, sp, 16
ret

View File

@ -1,12 +1,26 @@
.equ MAX_TESTNAME_LEN, 32
.macro test_name name .macro test_name name
.data .data
tn_\name: tn_\name:
.asciz "\name" .ascii "\name"
.space MAX_TESTNAME_LEN - (. - tn_\name), ' '
.text .text
mvhi r13, hi(tn_\name) .global \name
ori r13, r13, lo(tn_\name) \name:
sw (r12+8), r13 addi sp, sp, -12
sw (sp+4), r1
sw (sp+8), r2
sw (sp+12), r3
mvi r1, 1
mvhi r2, hi(tn_\name)
ori r2, r2, lo(tn_\name)
mvi r3, MAX_TESTNAME_LEN
calli _write
lw r3, (sp+12)
lw r2, (sp+8)
lw r1, (sp+4)
addi sp, sp, 12
.endm .endm
.macro load reg val .macro load reg val
@ -15,13 +29,12 @@ tn_\name:
.endm .endm
.macro tc_pass .macro tc_pass
mvi r13, 0 calli _tc_pass
sw (r12+4), r13
.endm .endm
.macro tc_fail .macro tc_fail
mvi r13, 1 addi r12, r12, 1
sw (r12+4), r13 calli _tc_fail
.endm .endm
.macro check_r3 val .macro check_r3 val
@ -63,14 +76,12 @@ tn_\name:
.global _main .global _main
.text .text
_main: _main:
mvhi r12, hi(0xffff0000) # base address of test block mvi r12, 0
ori r12, r12, lo(0xffff0000)
.endm .endm
.macro end .macro end
sw (r12+0), r0 mv r1, r12
1: calli _exit
bi 1b
.endm .endm
# base + # base +

View File

@ -5,6 +5,10 @@ start
test_name SCALL_1 test_name SCALL_1
mvi r1, 1 mvi r1, 1
wcsr IE, r1 wcsr IE, r1
# we are running in a semi hosted environment
# therefore we have to set r8 to some unused system
# call
mvi r8, 0
insn: insn:
scall scall
check_excp 64 check_excp 64