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