From 40cc5e32663cd0350b791b8e54825f564489343f Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Wed, 22 Jul 2020 18:26:56 +0200
Subject: Imported some things from master

---
 src/drivers/cpu.c    | 40 ++++++++++++++++++++++++++++++++++++++++
 src/drivers/serial.c | 32 ++++++++++++++++++++++++++++++++
 src/inc/boot.h       | 16 ++++++++++++++++
 src/inc/cpu.h        | 16 ++++++++++++++++
 src/inc/serial.h     |  9 +++++++++
 src/inc/vesa.h       |  7 ++-----
 src/lib/def.h        | 18 ------------------
 src/lib/inc/def.h    | 20 ++++++++++++++++++++
 src/lib/inc/string.h | 10 ++++++++++
 src/lib/string.c     | 11 +++++++++++
 src/main.c           | 11 +++++++++--
 11 files changed, 165 insertions(+), 25 deletions(-)
 create mode 100644 src/drivers/cpu.c
 create mode 100644 src/drivers/serial.c
 create mode 100644 src/inc/boot.h
 create mode 100644 src/inc/cpu.h
 create mode 100644 src/inc/serial.h
 delete mode 100644 src/lib/def.h
 create mode 100644 src/lib/inc/def.h
 create mode 100644 src/lib/inc/string.h
 create mode 100644 src/lib/string.c

(limited to 'src')

diff --git a/src/drivers/cpu.c b/src/drivers/cpu.c
new file mode 100644
index 0000000..eb96562
--- /dev/null
+++ b/src/drivers/cpu.c
@@ -0,0 +1,40 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+// This file is a wrapper around some CPU asm calls
+
+#include <def.h>
+
+u8 inb(u16 port)
+{
+	u8 value;
+	__asm__ volatile("inb %1, %0" : "=a"(value) : "Nd"(port));
+	return value;
+}
+
+u16 inw(u16 port)
+{
+	u16 value;
+	__asm__ volatile("inw %1, %0" : "=a"(value) : "Nd"(port));
+	return value;
+}
+
+u32 inl(u16 port)
+{
+	u32 value;
+	__asm__ volatile("inl %1, %0" : "=a"(value) : "Nd"(port));
+	return value;
+}
+
+void outb(u16 port, u8 data)
+{
+	__asm__ volatile("outb %0, %1" ::"a"(data), "Nd"(port));
+}
+
+void outw(u16 port, u16 data)
+{
+	__asm__ volatile("outw %0, %1" ::"a"(data), "Nd"(port));
+}
+
+void outl(u16 port, u32 data)
+{
+	__asm__ volatile("outl %0, %1" ::"a"(data), "Nd"(port));
+}
diff --git a/src/drivers/serial.c b/src/drivers/serial.c
new file mode 100644
index 0000000..1ef424a
--- /dev/null
+++ b/src/drivers/serial.c
@@ -0,0 +1,32 @@
+#include <cpu.h>
+#include <def.h>
+#include <string.h>
+
+void serial_install()
+{
+	outb(0x3f8 + 1, 0x00);
+	outb(0x3f8 + 3, 0x80);
+	outb(0x3f8 + 0, 0x03);
+	outb(0x3f8 + 1, 0x00);
+	outb(0x3f8 + 3, 0x03);
+	outb(0x3f8 + 2, 0xC7);
+	outb(0x3f8 + 4, 0x0B);
+}
+
+int is_transmit_empty()
+{
+	return inb(0x3f8 + 5) & 0x20;
+}
+
+void serial_put(char ch)
+{
+	while (is_transmit_empty() == 0)
+		;
+	outb(0x3f8, (u8)ch);
+}
+
+void serial_print(const char *data)
+{
+	for (u32 i = 0; i < strlen(data); i++)
+		serial_put(data[i]);
+}
diff --git a/src/inc/boot.h b/src/inc/boot.h
new file mode 100644
index 0000000..30ddfb7
--- /dev/null
+++ b/src/inc/boot.h
@@ -0,0 +1,16 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+// This file specifies the structs passed by the bootloader
+
+#include <def.h>
+#include <vesa.h>
+
+struct vid_info {
+	u32 mode;
+	struct vbe *info;
+};
+
+struct mem_info {
+	u64 base;
+	u64 len;
+	u64 type;
+};
diff --git a/src/inc/cpu.h b/src/inc/cpu.h
new file mode 100644
index 0000000..ad83896
--- /dev/null
+++ b/src/inc/cpu.h
@@ -0,0 +1,16 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
+#ifndef CPU_H
+#define CPU_H
+
+#include <def.h>
+
+u8 inb(u16 port);
+u16 inw(u16 port);
+u32 inl(u16 port);
+
+void outb(u16 port, u8 data);
+void outw(u16 port, u16 data);
+void outl(u16 port, u32 data);
+
+#endif
diff --git a/src/inc/serial.h b/src/inc/serial.h
new file mode 100644
index 0000000..6511952
--- /dev/null
+++ b/src/inc/serial.h
@@ -0,0 +1,9 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
+#ifndef SERIAL_H
+#define SERIAL_H
+
+void serial_install();
+void serial_print(const char *data);
+
+#endif
diff --git a/src/inc/vesa.h b/src/inc/vesa.h
index e2ac4e5..661ab16 100644
--- a/src/inc/vesa.h
+++ b/src/inc/vesa.h
@@ -1,3 +1,5 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
 #ifndef VBE_H
 #define VBE_H
 
@@ -41,11 +43,6 @@ struct vbe {
 	u8 reserved1[206];
 };
 
-struct vid_info {
-	u32 mode;
-	struct vbe *info;
-};
-
 struct vbe *vbe;
 
 void vesa_clear(const u32 color[3]);
diff --git a/src/lib/def.h b/src/lib/def.h
deleted file mode 100644
index dc3cc55..0000000
--- a/src/lib/def.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef DEF_H
-#define DEF_H
-
-typedef signed char s8;
-typedef unsigned char u8;
-
-typedef signed short s16;
-typedef unsigned short u16;
-
-typedef signed int s32;
-typedef unsigned int u32;
-
-typedef signed long long s64;
-typedef unsigned long long u64;
-
-#define NULL ((void *)0)
-
-#endif
diff --git a/src/lib/inc/def.h b/src/lib/inc/def.h
new file mode 100644
index 0000000..69b43e3
--- /dev/null
+++ b/src/lib/inc/def.h
@@ -0,0 +1,20 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
+#ifndef DEF_H
+#define DEF_H
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+
+#define NULL ((void *)0)
+
+#endif
diff --git a/src/lib/inc/string.h b/src/lib/inc/string.h
new file mode 100644
index 0000000..c97fada
--- /dev/null
+++ b/src/lib/inc/string.h
@@ -0,0 +1,10 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
+#ifndef STRING_H
+#define STRING_H
+
+#include <def.h>
+
+u32 strlen(const char *str);
+
+#endif
diff --git a/src/lib/string.c b/src/lib/string.c
new file mode 100644
index 0000000..1b7a2b8
--- /dev/null
+++ b/src/lib/string.c
@@ -0,0 +1,11 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
+#include <def.h>
+
+u32 strlen(const char *str)
+{
+	u32 len = 0;
+	while (str[len])
+		len++;
+	return len;
+}
diff --git a/src/main.c b/src/main.c
index 78a2315..cf4fc75 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,14 +1,21 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
+#include <boot.h>
 #include <def.h>
+#include <serial.h>
 #include <vesa.h>
 
-void main(u32 *mem_info, struct vid_info *vid_info)
+void main(struct mem_info *mem_info, struct vid_info *vid_info)
 {
-	mem_info++; // TODO: Use the mmap!
+	mem_info++; // TODO: Use the mmap (or remove)!
 	vbe = vid_info->info;
 
 	u32 terminal_background[3] = { 0x1d, 0x1f, 0x24 };
 	vesa_clear(terminal_background);
 
+	serial_install();
+	serial_print("hello\n");
+
 	while (1) {
 	};
 }
-- 
cgit v1.2.3