parent
b4833e9c49
commit
7691085176
@ -1,2 +0,0 @@
|
||||
output/
|
||||
*.img
|
@ -1,14 +0,0 @@
|
||||
#!/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
|
@ -1,43 +0,0 @@
|
||||
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)
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
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)
|
||||
}
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
#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);
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
/* Simple linker script for ucore user-level programs.
|
||||
See the GNU ld 'info' manual ("info ld") to learn the syntax. */
|
||||
|
||||
OUTPUT_ARCH(aarch64)
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS {
|
||||
/* Load programs at this address: "." means the current address */
|
||||
. = 0xffff000000000000;
|
||||
|
||||
.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)
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
/* Simple linker script for ucore user-level programs.
|
||||
See the GNU ld 'info' manual ("info ld") to learn the syntax. */
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
/* Simple linker script for ucore user-level programs.
|
||||
See the GNU ld 'info' manual ("info ld") to learn the syntax. */
|
||||
|
||||
OUTPUT_ARCH(x86_64)
|
||||
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)
|
||||
}
|
||||
}
|
Loading…
Reference in new issue