GDT init (load + flush)
This commit is contained in:
75
src/kmain.c
75
src/kmain.c
@@ -4,6 +4,8 @@
|
||||
#include "io/term.h"
|
||||
#include "io/printf.h"
|
||||
#include "io/serial.h"
|
||||
#include "mem/gdt.h"
|
||||
#include "mem/utils.h"
|
||||
|
||||
// Limine version used
|
||||
__attribute__((used, section(".limine_requests")))
|
||||
@@ -24,74 +26,6 @@ static volatile LIMINE_REQUESTS_END_MARKER;
|
||||
|
||||
struct limine_framebuffer* framebuffer;
|
||||
|
||||
// We won't be linked to standard library, but still need the basic mem* functions
|
||||
// so everything goes allright with the compiler
|
||||
|
||||
// We use the "restrict" keyword on pointers so that the compiler knows it can
|
||||
// do more optimization on them (and as it's a much used function, it's good to
|
||||
// be able to do that)
|
||||
void* memcpy(void* restrict dest, const void* restrict src, size_t n)
|
||||
{
|
||||
uint8_t* restrict pdest = (uint8_t* restrict)dest;
|
||||
const uint8_t* restrict psrc = (const uint8_t* restrict)src;
|
||||
|
||||
for (size_t i=0; i<n; i++)
|
||||
{
|
||||
pdest[i] = psrc[i];
|
||||
}
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
void* memset(void* s, int c, size_t n)
|
||||
{
|
||||
uint8_t* p = (uint8_t*)s;
|
||||
|
||||
for (size_t i=0; i<n; i++)
|
||||
{
|
||||
p[i] = (uint8_t)c;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void* memmove(void *dest, const void* src, size_t n)
|
||||
{
|
||||
uint8_t* pdest = (uint8_t*)dest;
|
||||
const uint8_t* psrc = (uint8_t*)src;
|
||||
|
||||
if (src > dest)
|
||||
{
|
||||
for (size_t i=0; i<n; i++)
|
||||
{
|
||||
pdest[i] = psrc[i];
|
||||
}
|
||||
} else if (src < dest)
|
||||
{
|
||||
for (size_t i=n; i>0; i--)
|
||||
{
|
||||
pdest[i-1] = psrc[i-1];
|
||||
}
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
int memcmp(const void* s1, const void* s2, size_t n)
|
||||
{
|
||||
const uint8_t* p1 = (const uint8_t*)s1;
|
||||
const uint8_t* p2 = (const uint8_t*)s2;
|
||||
|
||||
for (size_t i=0; i<n; i++)
|
||||
{
|
||||
if (p1[i] != p2[i])
|
||||
{
|
||||
return p1[i] < p2[i] ? -1 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Panic
|
||||
static void hcf()
|
||||
{
|
||||
@@ -114,7 +48,10 @@ void kmain()
|
||||
|
||||
if (serial_init()) kputs("kernel: serial: error: Cannot init serial communication!");
|
||||
|
||||
serial_kputs("\n\nkernel: serial: Hello, world from serial!");
|
||||
serial_kputs("\n\nkernel: serial: Hello, world from serial!\n");
|
||||
|
||||
gdt_init();
|
||||
serial_kputs("kernel: gdt: Initialized GDT!");
|
||||
|
||||
// Draw something
|
||||
printf("%s, %s!", "Hello", "world");
|
||||
|
||||
Reference in New Issue
Block a user