#include #include #include #include #include #include #include #include "../cpu/cpu_init.h" #include "vga_err.h" #include "elf.h" static long initrd_sz; static char* initrd; typedef int (*func_ptr)(); static struct multiboot_boot_header_tag* tags; 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); } } tag=(struct multiboot_tag*)((char*)tag+((tag->size+7)&0xFFFFFFF8)); } } void kmain(struct multiboot_boot_header_tag* hdr) { tags=hdr; cpu_init(tags); vga_init((char*)0xC00B8000); read_initrd(tags); 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; } elf_header header; pos=datapos; char* hdr_ptr=(char*)&header; for (size_t i=0;i0) { pos=pheader.offset+datapos; for (size_t i=0;i