mirror of https://github.com/tailix/libkernaux.git
Add RISC-V kernel example
This commit is contained in:
parent
61afab81ba
commit
00f748d64b
|
@ -1,7 +1,7 @@
|
||||||
OUTPUT_ARCH("i386")
|
OUTPUT_ARCH("i386")
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
|
|
||||||
_kernel_offset = 0xC0000000; /* 3 GB */
|
_kernel_offset = 0xC0000000; /* 3 GiB */
|
||||||
|
|
||||||
_kernel_phys_base = 4M;
|
_kernel_phys_base = 4M;
|
||||||
_kernel_virt_base = (_kernel_phys_base + _kernel_offset);
|
_kernel_virt_base = (_kernel_phys_base + _kernel_offset);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
OUTPUT_ARCH("i386")
|
OUTPUT_ARCH("i386")
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
|
|
||||||
_kernel_offset = 0xC0000000; /* 3 GB */
|
_kernel_offset = 0xC0000000; /* 3 GiB */
|
||||||
|
|
||||||
_kernel_phys_base = 4M;
|
_kernel_phys_base = 4M;
|
||||||
_kernel_virt_base = (_kernel_phys_base + _kernel_offset);
|
_kernel_virt_base = (_kernel_phys_base + _kernel_offset);
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
/kernel.elf
|
|
@ -7,5 +7,31 @@ CC = $(CCPREFIX)gcc
|
||||||
|
|
||||||
QEMU = qemu-system-riscv64
|
QEMU = qemu-system-riscv64
|
||||||
|
|
||||||
run:
|
KERNEL = kernel.elf
|
||||||
$(QEMU) -machine virt -serial stdio
|
LINKERSCR = linker.ld
|
||||||
|
|
||||||
|
CFLAGS = \
|
||||||
|
-std=c99 \
|
||||||
|
-pedantic \
|
||||||
|
-Wall \
|
||||||
|
-Wextra \
|
||||||
|
-Werror \
|
||||||
|
-ffreestanding \
|
||||||
|
-mcmodel=medany
|
||||||
|
|
||||||
|
OBJS = main.c.o start.S.o
|
||||||
|
|
||||||
|
run: $(KERNEL)
|
||||||
|
$(QEMU) -machine virt -bios $< -serial stdio -display none
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(KERNEL) $(OBJS)
|
||||||
|
|
||||||
|
$(KERNEL): $(LINKERSCR) $(OBJS)
|
||||||
|
$(CC) -T $(LINKERSCR) -o $@ $(OBJS) -nostdlib -lgcc
|
||||||
|
|
||||||
|
%.c.o: %.c
|
||||||
|
$(CC) -c $< -o $@ $(CFLAGS)
|
||||||
|
|
||||||
|
%.S.o: %.S
|
||||||
|
$(AS) $< -o $@
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
ENTRY(_start);
|
||||||
|
|
||||||
|
. = 0x80000000;
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
/* Include entry point at start of binary */
|
||||||
|
.text : ALIGN(4K) {
|
||||||
|
*(.init);
|
||||||
|
*(.text);
|
||||||
|
}
|
||||||
|
.bss : ALIGN(4K) {
|
||||||
|
PROVIDE(bss_start = .);
|
||||||
|
*(.bss);
|
||||||
|
. += 4096;
|
||||||
|
PROVIDE(stack_top = .);
|
||||||
|
. += 4096;
|
||||||
|
PROVIDE(global_pointer = .);
|
||||||
|
PROVIDE(bss_end = .);
|
||||||
|
}
|
||||||
|
.rodata : ALIGN(4K) {
|
||||||
|
*(.rodata);
|
||||||
|
}
|
||||||
|
.data : ALIGN(4K) {
|
||||||
|
*(.data);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static unsigned char *const uart = (unsigned char*)0x10000000;
|
||||||
|
|
||||||
|
static void putchar(char c) {
|
||||||
|
*uart = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print(const char * str) {
|
||||||
|
while (*str != '\0') {
|
||||||
|
putchar(*str);
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
print("Hello world!\r\n");
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
.section .init
|
||||||
|
|
||||||
|
.option norvc
|
||||||
|
|
||||||
|
.type _start, @function
|
||||||
|
.global _start
|
||||||
|
_start:
|
||||||
|
.cfi_startproc
|
||||||
|
|
||||||
|
.option push
|
||||||
|
.option norelax
|
||||||
|
la gp, global_pointer
|
||||||
|
.option pop
|
||||||
|
|
||||||
|
/* Reset satp */
|
||||||
|
csrw satp, zero
|
||||||
|
|
||||||
|
/* Setup stack */
|
||||||
|
la sp, stack_top
|
||||||
|
|
||||||
|
/* Clear the BSS section */
|
||||||
|
la t5, bss_start
|
||||||
|
la t6, bss_end
|
||||||
|
bss_clear:
|
||||||
|
sd zero, (t5)
|
||||||
|
addi t5, t5, 8
|
||||||
|
bgeu t5, t6, bss_clear
|
||||||
|
|
||||||
|
la t0, main
|
||||||
|
csrw mepc, t0
|
||||||
|
|
||||||
|
/* Jump to kernel! */
|
||||||
|
tail main
|
||||||
|
|
||||||
|
.cfi_endproc
|
||||||
|
|
||||||
|
.end
|
Loading…
Reference in New Issue