os/kernel/kernel.c

113 lines
3.1 KiB
C
Raw Normal View History

2019-04-26 10:03:16 -05:00
#include <grub/text_fb_info.h>
2019-04-27 09:51:32 -05:00
#include <stdlib.h>
2019-05-06 08:38:02 -05:00
#include <tasking.h>
2019-04-27 09:51:32 -05:00
#include <string.h>
#include <memory.h>
#include <grub/multiboot2.h>
2019-04-27 09:51:32 -05:00
#include <stdint.h>
2019-05-06 08:38:02 -05:00
#include "../cpu/cpu_init.h"
#include "../drivers/vga.h"
#include "elf.h"
2019-04-27 09:51:32 -05:00
static long initrd_sz;
static char* initrd;
typedef int (*func_ptr)();
2019-05-01 09:39:23 -05:00
static struct multiboot_boot_header_tag* tags;
2019-05-01 09:39:23 -05:00
static void read_initrd(struct multiboot_boot_header_tag* tags) {
struct multiboot_tag* tag=(struct multiboot_tag*)(tags+1);
while (tag->type!=0) {
switch (tag->type) {
case MULTIBOOT_TAG_TYPE_MODULE: {
struct multiboot_tag_module* mod=(struct multiboot_tag_module*) tag;
initrd=malloc(sizeof(char)*(mod->mod_end-mod->mod_start));
initrd_sz=mod->mod_end-mod->mod_start;
memcpy(initrd,(void*)(mod->mod_start+0xC0000000),mod->mod_end-mod->mod_start);
2019-05-01 09:39:23 -05:00
}
}
tag=(struct multiboot_tag*)((char*)tag+((tag->size+7)&0xFFFFFFF8));
}
}
2019-04-27 09:51:32 -05:00
2019-05-03 08:34:22 -05:00
void kmain(struct multiboot_boot_header_tag* hdr) {
tags=hdr;
cpu_init(tags);
text_fb_info info;
info.address=(char*)0xC00B8000;
info.width=80;
info.height=25;
vga_init(info);
2019-05-01 09:39:23 -05:00
read_initrd(tags);
2019-05-03 08:34:22 -05:00
int pos=0;
uint32_t datapos;
for (uint32_t i=0;i<1;i++) {
uint32_t name_size;
char* name_sz_ptr=(char*)&name_size;
name_sz_ptr[0]=initrd[pos];
name_sz_ptr[1]=initrd[pos+1];
name_sz_ptr[2]=initrd[pos+2];
name_sz_ptr[3]=initrd[pos+3];
pos+=4;
if (name_size==0) {
break;
}
if (strcmp("init",&initrd[pos])==0) {
pos+=5;
uint32_t contents_size;
char* cont_sz_ptr=(char*)&contents_size;
cont_sz_ptr[0]=initrd[pos];
cont_sz_ptr[1]=initrd[pos+1];
cont_sz_ptr[2]=initrd[pos+2];
cont_sz_ptr[3]=initrd[pos+3];
pos+=4;
datapos=pos;
pos+=contents_size;
break;
}
uint32_t contents_size;
char* cont_sz_ptr=(char*)&contents_size;
cont_sz_ptr[0]=initrd[pos];
cont_sz_ptr[1]=initrd[pos+1];
cont_sz_ptr[2]=initrd[pos+2];
cont_sz_ptr[3]=initrd[pos+3];
pos+=4;
pos+=contents_size;
2019-04-30 17:11:26 -05:00
}
2019-05-01 09:39:23 -05:00
elf_header header;
2019-05-03 08:34:22 -05:00
pos=datapos;
char* hdr_ptr=(char*)&header;
for (size_t i=0;i<sizeof(elf_header);i++) {
2019-05-03 08:34:22 -05:00
hdr_ptr[i]=initrd[pos];
pos++;
}
2019-05-01 09:39:23 -05:00
if (header.magic!=ELF_MAGIC) {
2019-05-03 08:34:22 -05:00
vga_write_string("[INFO] Invalid magic number for prog.elf\n");
2019-05-01 09:39:23 -05:00
} else {
2019-05-06 08:24:57 -05:00
void* cr3=new_address_space();
2019-05-01 09:39:23 -05:00
for (int i=0;i<header.pheader_ent_nm;i++) {
elf_pheader pheader;
2019-05-03 08:34:22 -05:00
pos=(header.prog_hdr)+(header.pheader_ent_sz*i)+datapos;
char* phdr_ptr=(char*)&pheader;
for (size_t i=0;i<sizeof(elf_pheader);i++) {
2019-05-03 08:34:22 -05:00
phdr_ptr[i]=initrd[pos];
pos++;
}
2019-05-06 08:24:57 -05:00
char* ptr=alloc_memory(((pheader.memsz)/4096)+1);
memset(ptr,0,pheader.memsz);
2019-05-01 09:39:23 -05:00
if (pheader.filesz>0) {
2019-05-03 08:34:22 -05:00
pos=pheader.offset+datapos;
for (size_t i=0;i<pheader.filesz;i++) {
2019-05-06 08:24:57 -05:00
ptr[i]=initrd[pos];
2019-05-03 08:34:22 -05:00
pos++;
}
2019-05-01 09:39:23 -05:00
}
2019-05-06 08:38:02 -05:00
copy_data(cr3,ptr,pheader.memsz,(void*)pheader.vaddr);
2019-05-06 08:24:57 -05:00
}
2019-05-06 08:38:02 -05:00
createTaskCr3((void*)header.entry,cr3);
2019-05-06 08:24:57 -05:00
for(;;) {
yield();
2019-05-01 09:39:23 -05:00
}
2019-04-30 17:11:26 -05:00
}
2019-02-09 12:52:45 -06:00
}