summaryrefslogtreecommitdiff
path: root/kernel/amd64/io/com1.cxx
diff options
context:
space:
mode:
authorSamuel Johnson <[email protected]>2025-07-01 10:33:05 -0400
committerSamuel Johnson <[email protected]>2025-07-01 10:33:05 -0400
commit571a656a6bd9b4b9d5c595c578d15ba79bb19ef7 (patch)
tree46f75b47f4edab4281de14ffa1c4a91a5a84f8f1 /kernel/amd64/io/com1.cxx
parent12fd3a91f138bf90520134682e38bf3b0341e660 (diff)
Add serial loggingHEADtrunkdev
Diffstat (limited to 'kernel/amd64/io/com1.cxx')
-rw-r--r--kernel/amd64/io/com1.cxx44
1 files changed, 44 insertions, 0 deletions
diff --git a/kernel/amd64/io/com1.cxx b/kernel/amd64/io/com1.cxx
new file mode 100644
index 0000000..fc67b65
--- /dev/null
+++ b/kernel/amd64/io/com1.cxx
@@ -0,0 +1,44 @@
+#include <amd64/io/com1.h>
+#include <amd64/io/ports.h>
+#include <utils.h>
+
+#define COM1 0x3f8
+
+int is_transmit_empty ()
+{
+ return hos::io::inb(COM1 + 5) & 0x20;
+}
+
+namespace hos::io
+{
+ com_logger::com_logger (enum log_level level)
+ : logger (level)
+ {
+ outb(COM1 + 1, 0x00);
+ outb(COM1 + 3, 0x80);
+ outb(COM1 + 0, 0x03);
+ outb(COM1 + 1, 0x00);
+ outb(COM1 + 3, 0x03);
+ outb(COM1 + 2, 0xc7);
+ outb(COM1 + 4, 0x0b);
+ outb(COM1 + 4, 0x1e);
+ outb(COM1 + 0, 0xae);
+
+ if (inb(COM1 + 0) != 0xae)
+ {
+ return;
+ }
+
+ outb(COM1 + 4, 0x0f);
+ }
+
+ void com_logger::flush ()
+ {
+ std::size_t len = strlen(this->buffer);
+ for (std::size_t i = 0; i < len; i++)
+ {
+ while (is_transmit_empty() == 0);
+ outb(COM1 + 0, this->buffer[i]);
+ }
+ }
+}