aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarvin Borner2020-07-22 18:26:56 +0200
committerMarvin Borner2020-07-22 18:26:56 +0200
commit40cc5e32663cd0350b791b8e54825f564489343f (patch)
tree3561c2f379b98ac3c3005f9048bb5535a0d3952d /src
parentc0a2074864e668b005eea8f50c6719bceb66bf20 (diff)
Imported some things from master
Diffstat (limited to 'src')
-rw-r--r--src/drivers/cpu.c40
-rw-r--r--src/drivers/serial.c32
-rw-r--r--src/inc/boot.h16
-rw-r--r--src/inc/cpu.h16
-rw-r--r--src/inc/serial.h9
-rw-r--r--src/inc/vesa.h7
-rw-r--r--src/lib/inc/def.h (renamed from src/lib/def.h)2
-rw-r--r--src/lib/inc/string.h10
-rw-r--r--src/lib/string.c11
-rw-r--r--src/main.c11
10 files changed, 147 insertions, 7 deletions
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/inc/def.h
index dc3cc55..69b43e3 100644
--- a/src/lib/def.h
+++ b/src/lib/inc/def.h
@@ -1,3 +1,5 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+
#ifndef DEF_H
#define DEF_H
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) {
};
}