kernel/src/kernel.c

84 lines
2.7 KiB
C

#include "multiboot.h"
#include "framebuffer.h"
#include "serial.h"
#include "xtoa.h"
static inline void outb(unsigned short port, unsigned char val) {
asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
}
static inline unsigned char inb(unsigned short port) {
unsigned char ret;
asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port) : "memory");
return ret;
}
void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
// Cursor disabling
outb(0x3D4, 0x0A);
outb(0x3D5, 0x20);
int serial_initialized = serial_init();
serial_write_string("\n=== KoalemOS ===\n");
// Check multiboot header
if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
return;
}
serial_write_string("\nMultiboot flags: ");
serial_write_string(itoa(mbootinfo->flags, 2));
// Check videomode
if (mbootinfo->flags & MULTIBOOT_INFO_VBE_INFO) {
serial_write_string("\nVBE Mode: 0x");
serial_write_string(itoa(mbootinfo->vbe_mode, 16));
}
if (!(mbootinfo->flags & MULTIBOOT_INFO_FRAMEBUFFER_INFO)) {
serial_write_string("\nVideo info not available");
return;
}
serial_write_string("\nFramebuffer: ");
serial_write_string("\n Address: 0x");
serial_write_string(ultoa(mbootinfo->framebuffer_addr, 16));
serial_write_string("\n Dimensions: ");
serial_write_string(itoa(mbootinfo->framebuffer_width, 10));
serial_write_string("X");
serial_write_string(itoa(mbootinfo->framebuffer_height, 10));
serial_write_string("x");
serial_write_string(itoa(mbootinfo->framebuffer_bpp, 10));
serial_write_string("\n Pitch: ");
serial_write_string(itoa(mbootinfo->framebuffer_pitch, 10));
serial_write_string("\n RPos:");
serial_write_string(itoa(mbootinfo->framebuffer_red_field_position, 10));
serial_write_string("\n GPos:");
serial_write_string(itoa(mbootinfo->framebuffer_green_field_position, 10));
serial_write_string("\n BPos:");
serial_write_string(itoa(mbootinfo->framebuffer_blue_field_position, 10));
serial_write_string("\nMemory: ");
serial_write_string("\n lower: ");
serial_write_string(uitoa(mbootinfo->mem_lower, 10));
serial_write_string(" k");
serial_write_string("\n upper: ");
serial_write_string(uitoa(mbootinfo->mem_upper/1024, 10));
serial_write_string(" M");
initfb(mbootinfo->framebuffer_addr, mbootinfo->framebuffer_width, mbootinfo->framebuffer_height, mbootinfo->framebuffer_bpp, mbootinfo->framebuffer_pitch, mbootinfo->framebuffer_red_field_position, mbootinfo->framebuffer_green_field_position, mbootinfo->framebuffer_blue_field_position);
int x, y, i;
unsigned char c = 0;
for(;;) {
for(y=0; y < mbootinfo->framebuffer_height; y++) {
for(x=0; x < mbootinfo->framebuffer_width; x++) {
putpixel(x, y, c, c, c, 0xff);
}
}
c+=4;
}
serial_write_string("\nExecution finished, halting...");
}