feat(gdt): add gdt loading

Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
juju committed 2021-07-13 21:38:19 +02:00
1 parent 67ec69bdde
commit e862a4185b
4 files changed
+104 -3

No files matched your search

+2 -1
View File
@@ -30,7 +30,8 @@ OBJS = \
libvga.o \
list.o \
memory.o \
serial.o
serial.o \
gdt.o
DEPS = $(OBJS:.o=.d)
+74
View File
@@ -0,0 +1,74 @@
#include "gdt.h"
static struct gdt gdt = { 0 };
static void create_kernel_ds()
{
}
static void create_kernel_cs()
{
}
static void create_gdt()
{
create_kernel_ds();
create_kernel_cs();
}
static void load_gdt()
{
struct gdt_r gdtr;
gdtr.addr = (uint32_t)&gdt;
gdtr.limit = GDT_SIZE - 1;
asm volatile("lgdt %0\n"
:
: "m" (gdtr)
: "memory");
}
static void load_ds()
{
struct segment_selector selector;
selector.index = KERNEL_DS_INDEX;
selector.table_indicator = 0;
selector.rpl = 0;
asm volatile("movw %0, %%ax\n"
"movw %%ax, %%ds\n"
"movw %%ax, %%fs\n"
"movw %%ax, %%gs\n"
"movw %%ax, %%ss\n"
:
: "m" (selector)
: "ax");
}
static void load_cs()
{
struct segment_selector selector;
selector.index = KERNEL_CS_INDEX;
selector.table_indicator = 0;
selector.rpl = 0;
asm volatile("pushl %0\n"
"pushl $1f\n"
"lret\n"
"1:\n"
:
: "m" (selector));
}
static void reload_segment_selectors()
{
load_ds();
load_cs();
}
void init_gdt()
{
create_gdt();
load_gdt();
reload_segment_selectors();
}
+26
View File
@@ -3,6 +3,12 @@
#include <stdint.h>
#define GDT_NB_ENTRIES 3
#define GDT_SIZE (GDT_NB_ENTRIES * sizeof(struct gdt_entry))
#define KERNEL_CS_INDEX 1
#define KERNEL_DS_INDEX 2
struct gdt_entry
{
uint16_t limit_1 : 16;
@@ -20,4 +26,24 @@ struct gdt_entry
uint8_t base_3 : 8;
} __attribute__ ((packed));
struct gdt
{
struct gdt_entry entries[GDT_NB_ENTRIES];
};
struct gdt_r
{
uint32_t addr;
uint16_t limit;
} __attribute__ ((packed));
struct segment_selector
{
uint8_t rpl : 2;
uint8_t table_indicator : 1;
uint16_t index : 13;
} __attribute__ ((packed));
void init_gdt();
#endif /* !GDT_H */
+2 -2
View File
@@ -24,12 +24,12 @@ void init_serial(void)
int write(const char *buf, size_t count)
{
int sent;
size_t sent;
for(sent = 0; sent < count; ++sent)
{
u8 line_status = inb(COM1 + 5);
if (!line_status & EMPTY_TRANSMITTER)
if (!(line_status & EMPTY_TRANSMITTER))
break;
outb(COM1, buf[sent]);
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.