diff options
| -rw-r--r-- | sys/arch/amd64/cpu/boot.S | 10 | ||||
| -rw-r--r-- | sys/arch/amd64/io/uart.S | 69 |
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 : +*/ |
