/**************************************************************************************
Copyright (c) 2002
The UbixOS Project
$Id: exec.c,v 1.8 2002/04/27 12:21:54 reddawg Exp $
**************************************************************************************/
#include <ubixfs/ubixfs.h>
#include <ubixos/schedule.h>
#include <mm/paging.h>
#include <ubixos/video.h>
void execThread(void (* tproc)(void),int stack,char *descr) {
int pid = 0;
pid = findTask();
taskList[pid].tss.back_link = 0x0;
taskList[pid].tss.esp0 = stack;
taskList[pid].tss.ss0 = 0x10;
taskList[pid].tss.esp1 = 0x0;
taskList[pid].tss.ss1 = 0x10;
taskList[pid].tss.esp2 = 0x0;
taskList[pid].tss.ss2 = 0x10;
taskList[pid].tss.cr3 = (unsigned int)pageDir;
taskList[pid].tss.eip = (unsigned int)tproc;
taskList[pid].tss.eflags = 0x206;
taskList[pid].tss.esp = stack;
taskList[pid].tss.ebp = stack;
taskList[pid].tss.esi = 0x0;
taskList[pid].tss.edi = 0x0;
taskList[pid].tss.es = 0x10;
taskList[pid].tss.cs = 0x08;
taskList[pid].tss.ss = 0x10;
taskList[pid].tss.ds = 0x10;
taskList[pid].tss.fs = 0x10;
taskList[pid].tss.gs = 0x10;
taskList[pid].tss.ldt = 0x18;
taskList[pid].tss.trace_bitmap = 0x80000000;
taskList[pid].status = RUNABLE;
}
void execFile(char *file) {
int result,e_start,e_offset,i,pid;
char *buf = 0x0,*BINARY = 0x0;
pid = findTask();
result = getdata(file,0,49152,buf);
if (result > 0) {
if (buf[1] == 'E' && buf[2] == 'L' && buf[3] == 'F') {
e_start = 0;
e_offset = 0;
e_start += buf[27]* 256 * 256 * 256;
e_start += buf[26] * 256 * 256;
e_start += buf[25]* 256;
e_start += buf[24];
e_offset += buf[63] * 256 * 256 * 256;
e_offset += buf[62] * 256 * 256;
e_offset += buf[61] * 256;
e_offset += buf[60];
(int)BINARY = e_offset;
for (i=0;i<result;i++) {
BINARY[i] = buf[i];
}
taskList[pid].tss.back_link = 0x0;
taskList[pid].tss.esp0 = 0x300000;
taskList[pid].tss.ss0 = 0x10;
taskList[pid].tss.esp1 = 0x0;
taskList[pid].tss.ss1 = 0x10;
taskList[pid].tss.esp2 = 0x0;
taskList[pid].tss.ss2 = 0x10;
taskList[pid].tss.cr3 = (unsigned int)pageDir;
taskList[pid].tss.eip = (unsigned int)e_start;
taskList[pid].tss.eflags = 0x206;
taskList[pid].tss.esp = 0x300000;
taskList[pid].tss.ebp = 0x300000;
taskList[pid].tss.esi = 0x0;
taskList[pid].tss.edi = 0x0;
taskList[pid].tss.es = 0x10;
taskList[pid].tss.cs = 0x08;
taskList[pid].tss.ss = 0x10;
taskList[pid].tss.ds = 0x10;
taskList[pid].tss.fs = 0x10;
taskList[pid].tss.gs = 0x10;
taskList[pid].tss.ldt = 0x18;
taskList[pid].tss.trace_bitmap = 0x80000000;
taskList[pid].status = RUNABLE;
}
}
}