summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-11-15 14:22:52 -0500
committerIan Moffett <ian@osmora.org>2025-11-15 14:27:15 -0500
commit8c7e3ccd911c7e90cb577ce9d98226bfe2be7d7f (patch)
tree6104af32e2e44ae5b500b0929e582d21d105b70c
parent7235966ea34c87724aee65792d2f183e653faabb (diff)
kern/amd64: io: Add serial UART driver
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/arch/amd64/cpu/boot.S10
-rw-r--r--sys/arch/amd64/io/uart.S69
2 files changed, 79 insertions, 0 deletions
diff --git a/sys/arch/amd64/cpu/boot.S b/sys/arch/amd64/cpu/boot.S
index 0d2e0d2..493a436 100644
--- a/sys/arch/amd64/cpu/boot.S
+++ b/sys/arch/amd64/cpu/boot.S
@@ -1,5 +1,15 @@
.globl _start
+ .extern uart_init
_start:
+ cli
+ cld
+
+ xor %rbp, %rbp
+ call uart_init
+
1: cli
hlt
jmp 1b
+
+/* vim: ft=gas :
+*/
diff --git a/sys/arch/amd64/io/uart.S b/sys/arch/amd64/io/uart.S
new file mode 100644
index 0000000..4a536f5
--- /dev/null
+++ b/sys/arch/amd64/io/uart.S
@@ -0,0 +1,69 @@
+ .set UART_COM1, 0x3F8
+
+.macro bus_outb port, val
+ mov $\port, %rdi
+ mov $\val, %rsi
+ call pio_outb
+.endm
+
+ .text
+ .globl uart_init
+uart_init:
+ /*
+ * void uart_init(void);
+ */
+
+ push %r12
+ push %r13
+ push %r14
+ push %r15
+ push %rbx
+ push %rbp
+
+ bus_outb UART_COM1+1, 0x00 /* Disable interrupts */
+ bus_outb UART_COM1+3, 1<<7 /* Set DLAB */
+ bus_outb UART_COM1+0, 0x02 /* 57600 buad */
+ bus_outb UART_COM1+1, 0x00 /* High bits */
+ bus_outb UART_COM1+3, 0x03 /* Line control [data+stop,no parity] */
+ bus_outb UART_COM1+2, 0x00 /* Set FIFO, 14-byte threshold */
+ bus_outb UART_COM1+4, 0x0B /* DTR+RTS */
+
+ pop %rbp
+ pop %rbx
+ pop %r15
+ pop %r14
+ pop %r13
+ pop %r12
+ retq
+
+uart_write:
+ /*
+ * void uart_write(const char *s, size_t len);
+ */
+
+ push %r12
+ push %r13
+ push %r14
+ push %r15
+ push %rbx
+ push %rbp
+
+ mov %rsi, %rcx
+ mov %rdi, %rsi
+.strloop:
+ lodsb
+ mov $UART_COM1, %dx
+ out %al, %dx
+ loop .strloop
+
+ pop %rbp
+ pop %rbx
+ pop %r15
+ pop %r14
+ pop %r13
+ pop %r12
+.done:
+ retq
+
+/* vim: ft=gas :
+*/