From e8ea9ebcc0d6201f3e7770ffdd0a223bed7f57ec Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sat, 9 Mar 2024 15:46:20 +0100 Subject: [PATCH] Added utility functions in system.h --- src/kernel/entry.asm | 6 ++++++ src/kernel/idt.c | 2 ++ src/kernel/idt.h | 1 + src/kernel/main_c.swp | Bin 0 -> 12288 bytes src/kernel/screen_c.swp | Bin 0 -> 12288 bytes src/kernel/screen_h.swp | Bin 0 -> 12288 bytes src/kernel/system.c | 24 ++++++++++++++++++++++++ src/kernel/system.h | 15 +++++++++++++++ 8 files changed, 48 insertions(+) create mode 100644 src/kernel/main_c.swp create mode 100644 src/kernel/screen_c.swp create mode 100644 src/kernel/screen_h.swp diff --git a/src/kernel/entry.asm b/src/kernel/entry.asm index 737e646..46e2283 100644 --- a/src/kernel/entry.asm +++ b/src/kernel/entry.asm @@ -2,8 +2,14 @@ [global _start] [extern main] +[extern idtp] _start: call main cli hlt + +[global idtLoad] +idtLoad: + lidt [idtp] + ret diff --git a/src/kernel/idt.c b/src/kernel/idt.c index 9e78727..b1aa4d9 100644 --- a/src/kernel/idt.c +++ b/src/kernel/idt.c @@ -28,5 +28,7 @@ void idtSetGate(uint8_t i, uint32_t offset, uint16_t selector, uint8_t typeAttr) void setupIdt() { idtp.limit = sizeof(struct idtEntry) * 256; idtp.base = (uint32_t)&idt; + + idtLoad(); } diff --git a/src/kernel/idt.h b/src/kernel/idt.h index 89e7e97..bc394c6 100644 --- a/src/kernel/idt.h +++ b/src/kernel/idt.h @@ -5,6 +5,7 @@ void setupIdt(); void idtSetGate(uint8_t i, uint32_t offset, uint16_t selector, uint8_t typeAttr); +extern void idtLoad(); #endif diff --git a/src/kernel/main_c.swp b/src/kernel/main_c.swp new file mode 100644 index 0000000000000000000000000000000000000000..745ad5a631893f2d9bc40c57d27158186c2c8f00 GIT binary patch literal 12288 zcmeI&PfElv6bA4&g5X9Jy+G`^=zug;7b5P3S-8_#x#^$i1lzQP(djCYE%K;#<9}2; zFUX1{%I40Lqatf^Rm<}ud9CfZiRF!|jI67qy-=CVBW;3Y?kczm0SGK6uug{u`|YdV z_jbhg*2QAW;3)_|00Izz00bZa0SG`~DFtlVqX*vkO1Jy9uI>G5yDl0CKmY;|fB*y_ z009U<00Izz00fp$AWDhU2GKLe{r{hR|9^4+gY(XL<4ifPoEMIp`@}&(00Izz00bZa z0SG_<0uX=z1R(Gq0{0}i%1RsSd+w}!aA~|f5#EJYgOm1Nt!z^cQ|oj8w$Q0?C+Piw am=N`~NwOwY!qce@#@>&CI;oU0ZtNROY(wq< literal 0 HcmV?d00001 diff --git a/src/kernel/screen_c.swp b/src/kernel/screen_c.swp new file mode 100644 index 0000000000000000000000000000000000000000..90291f2a9ceb8e1ce1d034e225de7da28149e265 GIT binary patch literal 12288 zcmeI2zi!h|6o*d`3=Gh!h=u7i8Dhs(oP+_Ps1tvrw(?fO&@S%HRbt`Tk*`fFRTYoG zyD-txi8pA+zCye32Apd<0(B@NTczKXzFgL+9{JPsC8LLEZK3?k| z4~gDCBFfWQXzcnwMp@U5Qx(Q{R{EnfE@s;JyRZC7luwHT|C7!V-(;%1(6Mh+rghR) zcjjOd24G+r15fDXpkF@ft>!vETl=s~2+qI&48Q;kzyJ)u01UtY4BS%#`Mg12r1uAP z|Ih2Waci#MVuAq}fB_hQ0T_S*7=Qs7fB_hQ0T{T42Es8>@RaCOu)qH=zW?8>5M2wG z!iDfn_$nL;`@)_O2s^^I;0iB<$HFhkx)Od0=fas_^S=uiFaQHE00S@p126ysFaQHE z00S`ae+Ev7WmK>BO7SLl9K#-aUgQqRuGuj!a^t=<&PPekk>vJ<^f`^jJkMmsv1J`L8&!RoD*;rsqKeFM}CB&33Zl`aeaz|Y(c1M@)^A#qK+Yl$P>ByP(@Yl9DY&?GvYCsJw8$;uYA+;h+% z009U<00Izz00bZa0SG_<0ucC9Kr5R}{3swAq>(TBS(K;^FLbgkk#CD~ARMK#&EtB% wP+qkyyq~+I`7($SDeUfv)v<&*bX%s$|M`yBFWVQL&iTz5X;F}Ht@vK}0=!dE$^ZZW literal 0 HcmV?d00001 diff --git a/src/kernel/system.c b/src/kernel/system.c index 43c43e3..78e1f69 100644 --- a/src/kernel/system.c +++ b/src/kernel/system.c @@ -1,3 +1,27 @@ #include "system.h" +#include "stdint.h" +uint8_t inb(uint16_t port) { + uint8_t result; + asm volatile("in %1, %0" : "=a"(result) : "Nd"(port)); + return result; +} + +void outb(uint16_t port, uint8_t data) { + asm volatile("out %0, %1" :: "a"(data), "Nd"(port)); +} + +char* memcopy(char* src, char* dst, uint16_t length) { + for (int i = 0; i < length; i++) { + *(dst + i) = *(src + i); + } + return dst; +} + +char* memset(char* dst, char value, uint16_t length) { + for (int i = 0; i < length; i++) { + *(dst + i) = value; + } + return dst; +} diff --git a/src/kernel/system.h b/src/kernel/system.h index 1305e5b..c0311f8 100644 --- a/src/kernel/system.h +++ b/src/kernel/system.h @@ -1,6 +1,21 @@ #ifndef SYSTEM_H #define SYSTEM_H +#include "stdint.h" +// Port functions +uint8_t inb(uint16_t port); +void outb(uint16_t port, uint8_t data); + +// Memory functions +char* memcopy(char* src, char* dst, uint16_t length); +char* memset(char* dst, char data, uint16_t length); + +struct regs { + unsigned int gs, fs, es, ds; + unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax; + unsigned int intNo, errCode; + unsigned int eip, cs, eflags, useresp, ss; +}; #endif