#include <sys/tss.h> #include <ubixos/schedule.h> #include <vmm/paging.h> #include <lib/kmalloc.h> #include <lib/bioscall.h> #include <lib/string.h> #include <sys/video.h> asm ( ".globl bios16Code\n" "bios16Code: \n" "int $0x10 \n" "int $0x69 \n" ); int biosCall(int biosInt,int eax,int ebx,int ecx,int edx,int esi,int edi,int es,int ds) { short segment = 0x0,offset = 0x0; uInt32 tmpAddr = (uInt32)&bios16Code; kTask_t *newProcess = 0x0; offset = tmpAddr & 0xFFFF; segment = (tmpAddr >> 4) & 0xF000; newProcess = findTask(); newProcess->tss.back_link = 0x0; newProcess->tss.esp0 = (uInt32)kmalloc(4096,newProcess->id)+4096; newProcess->tss.ss0 = 0x10; newProcess->tss.esp1 = 0x0; newProcess->tss.ss1 = 0x0; newProcess->tss.esp2 = 0x0; newProcess->tss.ss2 = 0x0; newProcess->tss.cr3 = (uInt32)createVirtualSpace(newProcess->id); //(unsigned int)kernelPageDirectory; newProcess->tss.eip = offset & 0xFFFF; newProcess->tss.eflags = 2 | EFLAG_IF | EFLAG_VM; newProcess->tss.eax = eax & 0xFFFF; newProcess->tss.ebx = ebx & 0xFFFF; newProcess->tss.ecx = ecx & 0xFFFF; newProcess->tss.edx = edx & 0xFFFF; newProcess->tss.esp = 0x1000 & 0xFFFF; newProcess->tss.ebp = 0x1000 & 0xFFFF; newProcess->tss.esi = esi & 0xFFFF; newProcess->tss.edi = edi & 0xFFFF; newProcess->tss.es = es & 0xFFFF; newProcess->tss.cs = segment & 0xFFFF; newProcess->tss.ss = 0x1000 & 0xFFFF; newProcess->tss.ds = ds & 0xFFFF; newProcess->tss.fs = 0x0 & 0xFFFF; newProcess->tss.gs = 0x0 & 0xFFFF; newProcess->tss.ldt = 0x0 & 0xFFFF; newProcess->tss.trace_bitmap = 0x0 & 0xFFFF; //newProcess->tss.io_map = sizeof(struct tssStruct)-8192; newProcess->oInfo.v86Task = 0x1; //kmemset(&newProcess->tss.io_space,0,8192); setTaskStatus(newProcess->id, READY); while (newProcess->status != EXITING) sched_yield(); return(1); }