parent
e74f749ff3
commit
4b17055f30
@ -0,0 +1,2 @@
|
||||
output/
|
||||
*.img
|
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
ARCH=riscv64
|
||||
|
||||
CC=${ARCH}-unknown-elf-gcc
|
||||
CFLAGS="-nostartfiles -nostdlib -nodefaultlibs -o output/a.out -T ${ARCH}.ld -fno-builtin"
|
||||
if ! [[ -d output ]]
|
||||
then
|
||||
mkdir output
|
||||
fi
|
||||
|
||||
#CFLAGS="${CFLAGS} -DRISCV_QEMU"
|
||||
|
||||
${CC} ${CFLAGS} test.c
|
||||
mksfs zip output ./user-${ARCH}.img
|
@ -0,0 +1,43 @@
|
||||
OUTPUT_ARCH(riscv)
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS {
|
||||
/* Load programs at this address: "." means the current address */
|
||||
. = 0x00800020;
|
||||
|
||||
.text : {
|
||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||
}
|
||||
|
||||
PROVIDE(etext = .); /* Define the 'etext' symbol to this value */
|
||||
|
||||
.rodata : {
|
||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||
}
|
||||
|
||||
/* Adjust the address for the data segment to the next page */
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
/* The data segment */
|
||||
.data : {
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
}
|
||||
|
||||
.sdata : {
|
||||
*(.sdata)
|
||||
*(.sdata.*)
|
||||
}
|
||||
|
||||
PROVIDE(edata = .);
|
||||
|
||||
.bss : {
|
||||
*(.bss)
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.eh_frame .note.GNU-stack .comment)
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
OUTPUT_ARCH(riscv)
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS {
|
||||
/* Load programs at this address: "." means the current address */
|
||||
. = 0x800020;
|
||||
|
||||
.text : {
|
||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||
}
|
||||
|
||||
PROVIDE(etext = .); /* Define the 'etext' symbol to this value */
|
||||
|
||||
.rodata : {
|
||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||
}
|
||||
|
||||
/* Adjust the address for the data segment to the next page */
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
/* The data segment */
|
||||
.data : {
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
}
|
||||
|
||||
.sdata : {
|
||||
*(.sdata)
|
||||
*(.sdata.*)
|
||||
}
|
||||
|
||||
PROVIDE(edata = .);
|
||||
|
||||
.bss : {
|
||||
*(.bss)
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.eh_frame .note.GNU-stack .comment)
|
||||
}
|
||||
}
|
@ -0,0 +1,87 @@
|
||||
#ifdef RISCV_QEMU
|
||||
# define SYS_write 64
|
||||
# define SYS_exit 93
|
||||
long syscall(long a0, long a1, long a2, long a3, long a4, long a5, long a6) {
|
||||
register long _0 __asm__("a7") = a0;
|
||||
register long _1 __asm__("a0") = a1;
|
||||
register long _2 __asm__("a1") = a2;
|
||||
register long _3 __asm__("a2") = a3;
|
||||
register long _4 __asm__("a3") = a4;
|
||||
register long _5 __asm__("a4") = a5;
|
||||
register long _6 __asm__("a5") = a6;
|
||||
__asm__ __volatile__("ecall":::);
|
||||
return _1;
|
||||
}
|
||||
|
||||
#else
|
||||
# define SYS_write 103
|
||||
# define SYS_exit 1
|
||||
# define SYS_fork 2
|
||||
# define SYS_putc 30
|
||||
# define SYS_getpid 18
|
||||
# define SYS_sleep 11
|
||||
|
||||
long syscall(long a0, long a1, long a2, long a3, long a4, long a5, long a6) {
|
||||
register long _0 __asm__("x10") = a0;
|
||||
register long _1 __asm__("x11") = a1;
|
||||
register long _2 __asm__("x12") = a2;
|
||||
register long _3 __asm__("x13") = a3;
|
||||
register long _4 __asm__("x14") = a4;
|
||||
register long _5 __asm__("x15") = a5;
|
||||
register long _6 __asm__("x16") = a6;
|
||||
__asm__ __volatile__("ecall":::);
|
||||
return _0;
|
||||
}
|
||||
#endif
|
||||
|
||||
const char* welcome_msg = "hello world!\n";
|
||||
const char* hexch = "0123456789ABCDEF";
|
||||
|
||||
void putc(char c) {
|
||||
syscall(SYS_putc, c, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
void putstr(const char* s) {
|
||||
for (; *s; s++)
|
||||
syscall(SYS_putc, *s, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
void putint_hex(long v) {
|
||||
char ch[18];
|
||||
ch[16] = 'H';
|
||||
ch[17] = 0;
|
||||
for (int i = 15; i >= 0; i--) {
|
||||
ch[i] = hexch[v & 15];
|
||||
v >>= 4;
|
||||
}
|
||||
putstr(ch);
|
||||
}
|
||||
|
||||
void _start() {
|
||||
putstr(welcome_msg);
|
||||
putc('\n');
|
||||
|
||||
putstr("my pid is ");
|
||||
long v = syscall(SYS_getpid, 0, 0, 0, 0, 0, 0);
|
||||
putint_hex(v);
|
||||
putc('\n');
|
||||
|
||||
long v1 = syscall(SYS_fork, 0, 0, 0, 0, 0, 0);
|
||||
putstr("fork returned: ");
|
||||
putint_hex(v1);
|
||||
putc('\n');
|
||||
if (v1 != 0) {
|
||||
putstr("parent sleeping");
|
||||
putc('\n');
|
||||
syscall(SYS_sleep, 200, 0, 0, 0, 0, 0);
|
||||
}
|
||||
putstr("my pid is ");
|
||||
v = syscall(SYS_getpid, 0, 0, 0, 0, 0, 0);
|
||||
putint_hex(v);
|
||||
putc('\n');
|
||||
|
||||
putint_hex(v);
|
||||
putstr(" is exiting");
|
||||
putc('\n');
|
||||
syscall(SYS_exit, 0, 0, 0, 0, 0, 0);
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
{
|
||||
"llvm-target": "riscv64",
|
||||
"data-layout": "e-m:e-p:64:64-i64:64-n64-S128",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "64",
|
||||
"target-c-int-width": "32",
|
||||
"os": "none",
|
||||
"arch": "riscv64",
|
||||
"cpu": "generic-rv64",
|
||||
"features": "",
|
||||
"max-atomic-width": "32",
|
||||
"linker": "rust-lld",
|
||||
"linker-flavor": "ld.lld",
|
||||
"pre-link-args": {
|
||||
"ld.lld": [
|
||||
"-Tsrc/arch/riscv32/boot/linker64.ld"
|
||||
]
|
||||
},
|
||||
"executables": true,
|
||||
"panic-strategy": "abort",
|
||||
"relocation-model": "static",
|
||||
"abi-blacklist": [
|
||||
"cdecl",
|
||||
"stdcall",
|
||||
"fastcall",
|
||||
"vectorcall",
|
||||
"thiscall",
|
||||
"aapcs",
|
||||
"win64",
|
||||
"sysv64",
|
||||
"ptx-kernel",
|
||||
"msp430-interrupt",
|
||||
"x86-interrupt"
|
||||
]
|
||||
}
|
Loading…
Reference in new issue