#include #include #include #include #include #include #include #include #include #include #include #include typedef struct { char filename[100]; char mode[8]; char uid[8]; char gid[8]; char size[12]; char mtime[12]; char chksum[8]; char typeflag[1]; } tar_header; uint32_t getsize(const char *in) { uint32_t size=0; uint32_t j; uint32_t count=1; for (j=11;j>0;j--,count*=8) { size+=((in[j-1]-'0')*count); } return size; } uint32_t find_loc(char* name,char* initrd) { uint32_t pos=0; tar_header tar_hdr; for (int i=0;;i++) { char* tar_hdr_ptr=(char*)&tar_hdr; for (size_t i=0;i0) { pos=pheader.offset+datapos; for (size_t i=0;i0) { fseek(initrd,pheader.offset+datapos,SEEK_SET); fread(ptr,sizeof(char),pheader.filesz,initrd); } copy_data(cr3,ptr,pheader.memsz,(void*)pheader.vaddr); } createTaskCr3((void*)header.entry,cr3); } return 1; } int main() { serial_print("IN INIT\n"); blockTask(TASK_BLOCKED); for (int i=0;i<4;i++) { yield(); } // long size=initrd_sz(); // char* initrd=malloc(size); // initrd_get(initrd); // exit(0); // uint32_t datapos=find_loc("vfs",initrd); // load_task(datapos,initrd); // yield(); // Bochs fails here // rescan_vfs(); // datapos=find_loc("devfs",initrd); // load_task(datapos,initrd); // yieldToPID(3); // datapos=find_loc("initrd_drv",initrd); // load_task(datapos,initrd); // yieldToPID(4); // mount("","devfs","/dev/"); // datapos=find_loc("vga_drv",initrd); // serial_print("Making vga task\n"); // load_task_devfs(datapos); // serial_print("Made vga task\n"); // yieldToPID(5); // FILE* file; // do { // file=fopen("/dev/vga","w"); // } while(file==NULL); // do { // file=fopen("/dev/vga","w"); // } while(file==NULL); // datapos=find_loc("pci",initrd); // load_task(datapos,initrd); // free(initrd); // yieldToPID(4); // fputs("FPUTS String\n",file); // char str[3]={0,0,0}; // fgets(str,2,stdin); // char str2[3]={0,0,0}; // fgets(str2,2,stdin); // printf("Printf %s,%s\n",str,str2); }