summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot/entry.S28
-rw-r--r--src/drivers/uart.cc57
-rw-r--r--src/kernel/main.cc20
3 files changed, 105 insertions, 0 deletions
diff --git a/src/boot/entry.S b/src/boot/entry.S
new file mode 100644
index 0000000..1a6f6b8
--- /dev/null
+++ b/src/boot/entry.S
@@ -0,0 +1,28 @@
+.section .text.entry
+.globl _start
+
+_start:
+ csrr t0, mhartid
+ bnez t0, .L_park_harts
+
+ la sp, _stack_top
+
+ la a0, _bss_start
+ la a1, _bss_end
+ bge a0, a1, .L_call_main
+
+.L_clear_bss:
+ sd zero, (a0)
+ addi a0, a0, 8
+ blt a0, a1, .L_clear_bss
+
+.L_call_main:
+ call kernel_main
+
+.L_infinite_loop:
+ wfi
+ j .L_infinite_loop
+
+.L_park_harts:
+ wfi
+ j .L_park_harts \ No newline at end of file
diff --git a/src/drivers/uart.cc b/src/drivers/uart.cc
new file mode 100644
index 0000000..758abd9
--- /dev/null
+++ b/src/drivers/uart.cc
@@ -0,0 +1,57 @@
+#include "drivers/uart.h"
+#include "common/types.h"
+
+#define UART0_BASE 0x10000000L
+
+#define UART_RBR 0x00 // Receiver Buffer Register (Read)
+#define UART_THR 0x00 // Transmitter Holding Register (Write)
+#define UART_IER 0x01 // Interrupt Enable Register
+#define UART_FCR 0x02 // FIFO Control Register
+#define UART_LCR 0x03 // Line Control Register
+#define UART_LSR 0x05 // Line Status Register
+
+#define UART_LSR_RX_READY 0x01
+#define UART_LSR_TX_EMPTY 0x20
+
+namespace Drivers{
+ inline volatile uint8_t &reg(uint32_t offset)
+ {
+ return *reinterpret_cast<volatile uint8_t *>(UART0_BASE + offset);
+ }
+
+ void uart_init()
+ {
+ reg(UART_IER) = 0x00;
+
+ reg(UART_LCR) = 0x80;
+ reg(0x00) = 0x03;
+ reg(0x01) = 0x00;
+
+ reg(UART_LCR) = 0x03;
+
+ reg(UART_FCR) = 0x07; // Enable FIFO, clear TX/RX queues
+ }
+
+ void uart_putc(char c)
+ {
+ if (c == '\n')
+ {
+ uart_putc('\r');
+ }
+
+ while ((reg(UART_LSR) & UART_LSR_TX_EMPTY) == 0)
+ {
+
+ }
+
+ reg(UART_THR) = c;
+ }
+
+ void uart_puts(const char *s)
+ {
+ while (*s)
+ {
+ uart_putc(*s++);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/kernel/main.cc b/src/kernel/main.cc
new file mode 100644
index 0000000..49adf2b
--- /dev/null
+++ b/src/kernel/main.cc
@@ -0,0 +1,20 @@
+#include "drivers/uart.h"
+
+extern "C" void kernel_main()
+{
+
+ Drivers::uart_init();
+
+ Drivers::uart_puts("\n");
+ Drivers::uart_puts("Modern DOS v1.0 [RISC-V 64]\n");
+ Drivers::uart_puts("2025 Richard Qin\n");
+ Drivers::uart_puts("\n");
+
+ Drivers::uart_puts("A:\\> ");
+
+
+ while (1)
+ {
+
+ }
+} \ No newline at end of file