aboutsummaryrefslogtreecommitdiff
path: root/include/03.gdt
diff options
context:
space:
mode:
authorAleksa Vučković <aleksav013@gmail.com>2022-01-02 22:56:02 +0100
committerAleksa Vučković <aleksav013@gmail.com>2022-01-02 22:56:02 +0100
commite2b78d20b80d89321d8d9df3ab8ade8407642dfc (patch)
tree148cb3bc894b974ae91290e493046120d04987b0 /include/03.gdt
parentead31873b971044cd3ecb7e40ae03bdb2e6f7642 (diff)
Adding code
Diffstat (limited to 'include/03.gdt')
-rw-r--r--include/03.gdt/gdt00.c1
-rw-r--r--include/03.gdt/gdt01.c9
-rw-r--r--include/03.gdt/gdt02.c5
-rw-r--r--include/03.gdt/gdt03.c3
-rw-r--r--include/03.gdt/gdt04.c9
-rw-r--r--include/03.gdt/gdt05.c13
6 files changed, 40 insertions, 0 deletions
diff --git a/include/03.gdt/gdt00.c b/include/03.gdt/gdt00.c
new file mode 100644
index 0000000..c45e28b
--- /dev/null
+++ b/include/03.gdt/gdt00.c
@@ -0,0 +1 @@
+#include<types.h>
diff --git a/include/03.gdt/gdt01.c b/include/03.gdt/gdt01.c
new file mode 100644
index 0000000..cbc5e1d
--- /dev/null
+++ b/include/03.gdt/gdt01.c
@@ -0,0 +1,9 @@
+struct gdt_entry
+{
+ uint16_t limit;
+ uint16_t base1;
+ uint8_t base2;
+ uint8_t access;
+ uint8_t limit_flags;
+ uint8_t base3;
+} __attribute__((packed));
diff --git a/include/03.gdt/gdt02.c b/include/03.gdt/gdt02.c
new file mode 100644
index 0000000..e708661
--- /dev/null
+++ b/include/03.gdt/gdt02.c
@@ -0,0 +1,5 @@
+struct gdt_pointer
+{
+ uint16_t size;
+ uint32_t offset;
+} __attribute__((packed));
diff --git a/include/03.gdt/gdt03.c b/include/03.gdt/gdt03.c
new file mode 100644
index 0000000..94c8cd3
--- /dev/null
+++ b/include/03.gdt/gdt03.c
@@ -0,0 +1,3 @@
+extern void load_gdt(struct gdt_pointer *gdtp);
+struct gdt_entry gdt[5];
+struct gdt_pointer gdtp;
diff --git a/include/03.gdt/gdt04.c b/include/03.gdt/gdt04.c
new file mode 100644
index 0000000..8d6a1f0
--- /dev/null
+++ b/include/03.gdt/gdt04.c
@@ -0,0 +1,9 @@
+void init_gdt_entry(size_t num, uint32_t limit, uint32_t base, uint8_t access, uint8_t limit_flags)
+{
+ gdt[num].limit=limit;
+ gdt[num].base1=(base & 0xffff);
+ gdt[num].base2=(base & 0xff0000) >> 16;
+ gdt[num].access=access;
+ gdt[num].limit_flags=limit_flags;
+ gdt[num].base3=(base & 0xff000000) >> 24;
+}
diff --git a/include/03.gdt/gdt05.c b/include/03.gdt/gdt05.c
new file mode 100644
index 0000000..d525a13
--- /dev/null
+++ b/include/03.gdt/gdt05.c
@@ -0,0 +1,13 @@
+void init_gdt_table()
+{
+ gdtp.size=sizeof(gdt)-1;
+ gdtp.offset=(uint32_t)&gdt;
+
+ init_gdt_entry(0,0,0,0,0); // null segment
+ init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment
+ init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment
+ init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment
+ init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment
+
+ load_gdt(&gdtp);
+}