tests/tcg/loongarch64: Add hello/memory test in loongarch64 system

- We write a very minimal softmmu harness.
- This is a very simple smoke test with no need to run a full Linux/kernel.
- The Makefile.softmmu-target record the rule to run.

Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20220606124333.2060567-43-yangxiaojuan@loongson.cn>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Xiaojuan Yang 2022-06-06 20:43:32 +08:00 committed by Richard Henderson
parent ca61e75071
commit c429333398
5 changed files with 206 additions and 0 deletions

View file

@ -217,6 +217,7 @@ M: Song Gao <gaosong@loongson.cn>
M: Xiaojuan Yang <yangxiaojuan@loongson.cn>
S: Maintained
F: target/loongarch/
F: tests/tcg/loongarch64/
M68K TCG CPUs
M: Laurent Vivier <laurent@vivier.eu>

View file

@ -0,0 +1,33 @@
#
# Loongarch64 system tests
#
LOONGARCH64_SYSTEM_SRC=$(SRC_PATH)/tests/tcg/loongarch64/system
VPATH+=$(LOONGARCH64_SYSTEM_SRC)
# These objects provide the basic boot code and helper functions for all tests
CRT_OBJS=boot.o
LOONGARCH64_TEST_SRCS=$(wildcard $(LOONGARCH64_SYSTEM_SRC)/*.c)
LOONGARCH64_TESTS = $(patsubst $(LOONGARCH64_SYSTEM_SRC)/%.c, %, $(LOONGARCH64_TEST_SRCS))
CRT_PATH=$(LOONGARCH64_SYSTEM_SRC)
LINK_SCRIPT=$(LOONGARCH64_SYSTEM_SRC)/kernel.ld
LDFLAGS=-Wl,-T$(LINK_SCRIPT)
TESTS+=$(LOONGARCH64_TESTS) $(MULTIARCH_TESTS)
CFLAGS+=-nostdlib -g -O1 -march=loongarch64 -mabi=lp64d $(MINILIB_INC)
LDFLAGS+=-static -nostdlib $(CRT_OBJS) $(MINILIB_OBJS) -lgcc
# building head blobs
.PRECIOUS: $(CRT_OBJS)
%.o: $(CRT_PATH)/%.S
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -x assembler-with-cpp -c $< -o $@
# Build and link the tests
%: %.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS)
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS)
memory: CFLAGS+=-DCHECK_UNALIGNED=0
# Running
QEMU_OPTS+=-serial chardev:output -kernel

View file

@ -0,0 +1,56 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Minimal LoongArch system boot code.
*
* Copyright (c) 2021 Loongson Technology Corporation Limited
*/
#include "regdef.h"
.global _start
.align 16
_start:
la.local t0, stack_end
move sp, t0
bl main
.type _start 2
.size _start, .-_start
.global _exit
.align 16
_exit:
2: /* QEMU ACPI poweroff */
li.w t0, 0xff
li.w t1, 0x10080010
st.w t0, t1, 0
idle 0
bl 2b
.type _exit 2
.size _exit, .-_exit
.global __sys_outc
__sys_outc:
li.d t1, 1000000
loop:
lu12i.w t2, 0x1fe00
ori t0, t2, 0x1e5
ld.bu t0, t0, 0
andi t0, t0, 0x20
ext.w.b t0, t0
bnez t0, in
addi.w t1, t1, -1
bnez t1, loop
in:
ext.w.b a0, a0
lu12i.w t0, 0x1fe00
ori t0, t0, 0x1e0
st.b a0, t0, 0
jirl $r0, ra, 0
.data
.align 4
stack:
.space 65536
stack_end:

View file

@ -0,0 +1,30 @@
ENTRY(_start)
SECTIONS
{
/* Linux kernel legacy start address. */
. = 0x9000000000200000;
_text = .;
.text : {
*(.text)
}
.rodata : {
*(.rodata)
}
_etext = .;
. = ALIGN(8192);
_data = .;
.got : {
*(.got)
}
.data : {
*(.sdata)
*(.data)
}
_edata = .;
.bss : {
*(.bss)
}
_end = .;
}

View file

@ -0,0 +1,86 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2021 Loongson Technology Corporation Limited
*/
#ifndef _ASM_REGDEF_H
#define _ASM_REGDEF_H
#define zero $r0 /* wired zero */
#define ra $r1 /* return address */
#define tp $r2
#define sp $r3 /* stack pointer */
#define v0 $r4 /* return value - caller saved */
#define v1 $r5
#define a0 $r4 /* argument registers */
#define a1 $r5
#define a2 $r6
#define a3 $r7
#define a4 $r8
#define a5 $r9
#define a6 $r10
#define a7 $r11
#define t0 $r12 /* caller saved */
#define t1 $r13
#define t2 $r14
#define t3 $r15
#define t4 $r16
#define t5 $r17
#define t6 $r18
#define t7 $r19
#define t8 $r20
/* $r21: Temporarily reserved */
#define fp $r22 /* frame pointer */
#define s0 $r23 /* callee saved */
#define s1 $r24
#define s2 $r25
#define s3 $r26
#define s4 $r27
#define s5 $r28
#define s6 $r29
#define s7 $r30
#define s8 $r31
#define gr0 $r0
#define gr1 $r1
#define gr2 $r2
#define gr3 $r3
#define gr4 $r4
#define gr5 $r5
#define gr6 $r6
#define gr7 $r7
#define gr8 $r8
#define gr9 $r9
#define gr10 $r10
#define gr11 $r11
#define gr12 $r12
#define gr13 $r13
#define gr14 $r14
#define gr15 $r15
#define gr16 $r16
#define gr17 $r17
#define gr18 $r18
#define gr19 $r19
#define gr20 $r20
#define gr21 $r21
#define gr22 $r22
#define gr23 $r23
#define gr24 $r24
#define gr25 $r25
#define gr26 $r26
#define gr27 $r27
#define gr28 $r28
#define gr29 $r29
#define gr30 $r30
#define gr31 $r31
#define STT_NOTYPE 0
#define STT_OBJECT 1
#define STT_FUNC 2
#define STT_SECTION 3
#define STT_FILE 4
#define STT_COMMON 5
#define STT_TLS 6
#define ASM_NL ;
#endif /* _ASM_REGDEF_H */