From 83e58b0ac26a8f3cfabecae118690f059da111a8 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sun, 10 Aug 2025 21:38:09 +0200 Subject: [PATCH] Move assembly code for x86 64 IO to io.S --- kernel/hal/x86_64/{serial1.S => io.S} | 8 +++---- kernel/hal/x86_64/io.h | 7 ++++++ kernel/hal/x86_64/serial.c | 34 +++++++++++++-------------- 3 files changed, 27 insertions(+), 22 deletions(-) rename kernel/hal/x86_64/{serial1.S => io.S} (62%) create mode 100644 kernel/hal/x86_64/io.h diff --git a/kernel/hal/x86_64/serial1.S b/kernel/hal/x86_64/io.S similarity index 62% rename from kernel/hal/x86_64/serial1.S rename to kernel/hal/x86_64/io.S index 689b5bb..bb8e42e 100644 --- a/kernel/hal/x86_64/serial1.S +++ b/kernel/hal/x86_64/io.S @@ -1,12 +1,12 @@ -.global serial_outb -serial_outb: +.global io_outb +io_outb: mov %di, %dx mov %sil, %al out %al, %dx ret -.global serial_inb -serial_inb: +.global io_inb +io_inb: mov %di, %dx in %dx, %al movzx %al, %rax diff --git a/kernel/hal/x86_64/io.h b/kernel/hal/x86_64/io.h new file mode 100644 index 0000000..29eac71 --- /dev/null +++ b/kernel/hal/x86_64/io.h @@ -0,0 +1,7 @@ +#ifndef HAL_IO_H_ +#define HAL_IO_H_ + +extern uint8_t io_inb(uint16_t port); +extern void io_outb(uint16_t port, uint8_t value); + +#endif // HAL_IO_H_ diff --git a/kernel/hal/x86_64/serial.c b/kernel/hal/x86_64/serial.c index f22f6aa..b7000bf 100644 --- a/kernel/hal/x86_64/serial.c +++ b/kernel/hal/x86_64/serial.c @@ -1,46 +1,44 @@ #include #include +#include "io.h" #define SERIAL_PORT 0x3f8 -extern uint8_t serial_inb(uint16_t port); -extern void serial_outb(uint16_t port, uint8_t value); - static int serial_received(void) { - return serial_inb(SERIAL_PORT + 5) & 1; + return io_inb(SERIAL_PORT + 5) & 1; } static uint8_t serial_read(void) { while (serial_received() == 0); - return serial_inb(SERIAL_PORT); + return io_inb(SERIAL_PORT); } static int serial_trans_empty(void) { - return serial_inb(SERIAL_PORT + 5) & 0x20; + return io_inb(SERIAL_PORT + 5) & 0x20; } static void serial_write(uint8_t value) { while (!serial_trans_empty()); - serial_outb(SERIAL_PORT, value); + io_outb(SERIAL_PORT, value); } // REFERENCE: https://wiki.osdev.org/Serial_Ports bool serial_init(void) { - serial_outb(SERIAL_PORT + 1, 0x00); - serial_outb(SERIAL_PORT + 3, 0x80); - serial_outb(SERIAL_PORT + 0, 0x03); - serial_outb(SERIAL_PORT + 1, 0x00); - serial_outb(SERIAL_PORT + 3, 0x03); - serial_outb(SERIAL_PORT + 2, 0xc7); - serial_outb(SERIAL_PORT + 4, 0x0b); - serial_outb(SERIAL_PORT + 4, 0x1e); - serial_outb(SERIAL_PORT + 0, 0xae); + io_outb(SERIAL_PORT + 1, 0x00); + io_outb(SERIAL_PORT + 3, 0x80); + io_outb(SERIAL_PORT + 0, 0x03); + io_outb(SERIAL_PORT + 1, 0x00); + io_outb(SERIAL_PORT + 3, 0x03); + io_outb(SERIAL_PORT + 2, 0xc7); + io_outb(SERIAL_PORT + 4, 0x0b); + io_outb(SERIAL_PORT + 4, 0x1e); + io_outb(SERIAL_PORT + 0, 0xae); - if (serial_inb(SERIAL_PORT + 0) != 0xae) { + if (io_inb(SERIAL_PORT + 0) != 0xae) { return false; } - serial_outb(SERIAL_PORT + 4, 0x0f); + io_outb(SERIAL_PORT + 4, 0x0f); return true; }