- 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>master
parent
ca61e75071
commit
c429333398
@ -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
|
@ -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: |
@ -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 = .; |
||||
} |
@ -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 */ |
Loading…
Reference in new issue