aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/arch/x86_64/limine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/arch/x86_64/limine.cpp')
-rw-r--r--kernel/arch/x86_64/limine.cpp44
1 files changed, 37 insertions, 7 deletions
diff --git a/kernel/arch/x86_64/limine.cpp b/kernel/arch/x86_64/limine.cpp
index 9ea2bbc..6d7984e 100644
--- a/kernel/arch/x86_64/limine.cpp
+++ b/kernel/arch/x86_64/limine.cpp
@@ -3,6 +3,8 @@
#include <stdio.h>
#include <arch/x86_64/serial.h>
#include "limine.h"
+#include "gdt.h"
+#include "idt.h"
#include <framebuffer.h>
namespace {
@@ -42,10 +44,26 @@ extern void (*__init_array_end[])();
extern "C" void kernel_main();
extern "C" void _start() {
+ asm("cli");
if (!LIMINE_BASE_REVISION_SUPPORTED) {
hcf();
}
+ // setup gdt
+ SegDesc segs[5];
+ GDTR gdtr{sizeof(struct SegDesc) * 5 - 1, (uint64_t)&segs};
+
+ gdt_entry(&segs[0], 0, 0, 0, 0); // null desc
+ gdt_entry(&segs[1], 0, 0xFFFFF, 0x9A, 0xA); // kcode
+ gdt_entry(&segs[2], 0, 0xFFFFF, 0x92, 0xA); // kdata
+ gdt_entry(&segs[3], 0, 0xFFFFF, 0xFA, 0xA); // ucode
+ gdt_entry(&segs[4], 0, 0xFFFFF, 0xF2, 0xA); // udata
+
+ load_gdt(&gdtr);
+ reload_segments();
+
+ setup_idt();
+
// initialize global constructors
for (size_t i = 0; &__init_array[i] != __init_array_end; i++) {
__init_array[i]();
@@ -61,15 +79,27 @@ extern "C" void _start() {
limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0];
// Note: we assume the framebuffer model is RGB with 32-bit pixels.
- for (size_t i = 0; i < 100; i++) {
- volatile uint32_t *fb_ptr = static_cast<volatile uint32_t *>(framebuffer->address);
- fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff;
- }
+ // for (size_t i = 0; i < 100; i++) {
+ // volatile uint32_t *fb_ptr = static_cast<volatile uint32_t *>(framebuffer->address);
+ // fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff;
+ // }
- Framebuffer fb((uint32_t*)framebuffer->address, framebuffer->width, framebuffer->height);
- fb.drawpixel(727, 727, 0x9528fd);
+ asm("xchgw %bx, %bx");
+ fb_init((uint32_t*)framebuffer->address, framebuffer->width, framebuffer->height);
+ draw_pixel(727, 727, 0x9528fd);
+ draw_pixel(0, 0, 0xff0000);
+ draw_pixel(1919, 1079, 0x00ff00);
+ // for (size_t i = 0; i < framebuffer->mode_count; i++) {
+ // printf("Mode %d\n", i);
+ // printf("Pitch %d\nWidth %d\nHeight %d\nbpp %d\nmem_model %d\n",
+ // framebuffer->modes[i]->pitch, framebuffer->modes[i]->width, framebuffer->modes[i]->height,
+ // framebuffer->modes[i]->bpp, framebuffer->modes[i]->memory_model);
+ // }
- printf("video modes: %lx", framebuffer->mode_count);
+ printf("Actual framebuffer:\n");
+ printf("Pitch %d\nWidth %d\nHeight %d\nbpp %d\nmem_model %d\n",
+ framebuffer->pitch, framebuffer->width, framebuffer->height,
+ framebuffer->bpp, framebuffer->memory_model);
kernel_main();