37 #include <lib/string.h> 
   40 #define STACK_ADDR 0xC800000 
   54 #define AUXARGS_ENTRY(pos, id, val) {*pos = id;pos++; *pos = val;pos++;} 
   73     kpanic(
"exec: stack not in valid area: [0x%X]\n", stack);
 
   84   newProcess->
tss.
eip = (
unsigned int) tproc;
 
   86   newProcess->
tss.
esp = stack;
 
   87   newProcess->
tss.
ebp = stack;
 
  101   newProcess->
tss.
es = 0x10;
 
  102   newProcess->
tss.
cs = 0x08;
 
  103   newProcess->
tss.
ss = 0x10;
 
  104   newProcess->
tss.
ds = 0x10;
 
  105   newProcess->
tss.
fs = 0x10;
 
  106   newProcess->
tss.
gs = 0x10;
 
  108   newProcess->
tss.
ldt = 0x18;
 
  118     "movl   %%esp,%%ecx  \n" 
  120     "movl   %%eax,%%esp  \n" 
  124     "movl   %%esp,%%eax  \n" 
  126     "movl   %%ecx,%%esp  \n" 
  129     : 
"b" (arg),
"m" (newProcess->
tss.
esp)
 
  136   return ((
uInt32) newProcess);
 
  155 void execFile(
char *
file, 
int argc, 
char **argv, 
int console) {
 
  162   elfHeader *binaryHeader = 0x0;
 
  163   elfProgramHeader *programHeader = 0x0;
 
  172     kprintf(
"Error: invalid console\n");
 
  183     "movl %%eax,%%cr3       \n" 
  192     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  196   if (tmpFd->
perms == 0x0) {
 
  197     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  203   binaryHeader = (elfHeader *) 
kmalloc(
sizeof(elfHeader));
 
  206   fread(binaryHeader, 
sizeof(elfHeader), 1, tmpFd);
 
  209   if ((binaryHeader->eIdent[1] != 
'E') && (binaryHeader->eIdent[2] != 
'L') && (binaryHeader->eIdent[3] != 
'F')) {
 
  210     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  215   else if (binaryHeader->eType != 2) {
 
  216     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  221   else if (binaryHeader->eEntry == 0x300000) {
 
  222     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  229   programHeader = (elfProgramHeader *) 
kmalloc(
sizeof(elfProgramHeader) * binaryHeader->ePhnum);
 
  230   fseek(tmpFd, binaryHeader->ePhoff, 0);
 
  233   fread(programHeader, (
sizeof(elfProgramHeader) * binaryHeader->ePhnum), 1, tmpFd);
 
  237   for (i = 0; i < binaryHeader->ePhnum; i++) {
 
  238     if (programHeader[i].phType == 1) {
 
  243       for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
 
  248         memset((
void *) ((programHeader[i].phVaddr & 0xFFFFF000) + x), 0x0, 0x1000);
 
  253       fseek(tmpFd, programHeader[i].phOffset, 0);
 
  254       fread((
void *) programHeader[i].phVaddr, programHeader[i].phFilesz, 1, tmpFd);
 
  255       if ((programHeader[i].phFlags & 0x2) != 0x2) {
 
  256         kprintf(
"pH: [0x%X]\n", programHeader[i].phMemsz);
 
  257         for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
 
  259             kpanic(
"Error: vmm_setPageAttributes failed, File: %s, Line: %i\n", __FILE__, __LINE__);
 
  270   for (x = 1; x < 100; x++) {
 
  308   kfree(programHeader);
 
  312   tmp[0] = binaryHeader->eEntry;
 
  318     kprintf(
"argv[0]: [%s]\n", argv[0]);
 
  319   kprintf(
"argv: [0x%X]\n", argv);
 
  326     "movl %%eax,%%cr3       \n" 
  347   unsigned int *tmp = 0x0;
 
  353   char **argvNew = 0x0;
 
  357   elfHeader *binaryHeader = 0x0;
 
  358   elfProgramHeader *programHeader = 0x0;
 
  359   elfSectionHeader *sectionHeader = 0x0;
 
  360   elfDynamic *elfDynamicS = 0x0;
 
  369   if (tmpFd->
perms == 0) {
 
  370     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  377   if ((binaryHeader = (elfHeader *) 
kmalloc(
sizeof(elfHeader))) == 0x0)
 
  379   fread(binaryHeader, 
sizeof(elfHeader), 1, tmpFd);
 
  383   if ((binaryHeader->eIdent[1] != 
'E') && (binaryHeader->eIdent[2] != 
'L') && (binaryHeader->eIdent[3] != 
'F')) {
 
  384     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  390   else if (binaryHeader->eType != 2) {
 
  391     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  396   else if (binaryHeader->eEntry == 0x300000) {
 
  397     kprintf(
"Exec Format Error: Binary File Not Executable.\n");
 
  404   if ((programHeader = (elfProgramHeader *) 
kmalloc(
sizeof(elfProgramHeader) * binaryHeader->ePhnum)) == 0x0)
 
  408   fseek(tmpFd, binaryHeader->ePhoff, 0);
 
  409   fread(programHeader, (
sizeof(elfProgramHeader) * binaryHeader->ePhnum), 1, tmpFd);
 
  411   if ((sectionHeader = (elfSectionHeader *) 
kmalloc(
sizeof(elfSectionHeader) * binaryHeader->eShnum)) == 0x0)
 
  415   fseek(tmpFd, binaryHeader->eShoff, 0);
 
  416   fread(sectionHeader, 
sizeof(elfSectionHeader) * binaryHeader->eShnum, 1, tmpFd);
 
  419   for (i = 0; i < binaryHeader->ePhnum; i++) {
 
  420     switch (programHeader[i].phType) {
 
  422         seg_addr = 
trunc_page(programHeader[i].phVaddr);
 
  423         seg_size = 
round_page(programHeader[i].phMemsz + programHeader[i].phVaddr - seg_addr);
 
  429         for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
 
  432             K_PANIC(
"Error: Remap Page Failed");
 
  433           memset((
void *) ((programHeader[i].phVaddr & 0xFFFFF000) + x), 0x0, 0x1000);
 
  437         fseek(tmpFd, programHeader[i].phOffset, 0);
 
  438         fread((
void *) programHeader[i].phVaddr, programHeader[i].phFilesz, 1, tmpFd);
 
  439         if ((programHeader[i].phFlags & 0x2) != 0x2) {
 
  440           for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
 
  442               kpanic(
"Error: vmm_setPageAttributes failed, File: %s,Line: %i\n", __FILE__, __LINE__);
 
  446         if (binaryHeader->eEntry >= programHeader[i].phVaddr && binaryHeader->eEntry < (programHeader[i].phVaddr + programHeader[i].phMemsz)) {
 
  458         elfDynamicS = (elfDynamic *) programHeader[i].phVaddr;
 
  459         fseek(tmpFd, programHeader[i].phOffset, 0);
 
  460         fread((
void *) programHeader[i].phVaddr, programHeader[i].phFilesz, 1, tmpFd);
 
  463         interp = (
char *) 
kmalloc(programHeader[i].phFilesz);
 
  464         fseek(tmpFd, programHeader[i].phOffset, 0);
 
  465         fread((
void *) interp, programHeader[i].phFilesz, 1, tmpFd);
 
  466         kprintf(
"Interp: [%s]\n", interp);
 
  475   if (elfDynamicS != 0x0) {
 
  476     for (i = 0; i < 12; i++) {
 
  477       if (elfDynamicS[i].dynVal == 0x3) {
 
  478         tmp = (
void *) elfDynamicS[i].dynPtr;
 
  498   if (argv[1] != 0x0) {
 
  499     argc = (int) argv[0];
 
  501     memset(args, 0x0, 0x1000);
 
  503     argvNew = (
char **) 
kmalloc(
sizeof(
char *) * argc);
 
  504     for (i = 0x0; i < argc; i++) {
 
  505       strcpy(args + x, argv[i + 1]);
 
  506       argvNew[i] = args + x;
 
  507       x += 
strlen(argv[i + 1]) + 1;
 
  520   iFrame->
eip = binaryHeader->eEntry;
 
  530   for (i = 0; i < argc; i++) {
 
  531     tmp[i + 1] = (
u_int) argv[i];
 
  545   kfree(programHeader);
 
  568   char **argvNew = 0x0;
 
  569   elfHeader *binaryHeader = 0x0;
 
  570   elfProgramHeader *programHeader = 0x0;
 
  579   if ((binaryHeader = (elfHeader *) 
kmalloc(
sizeof(elfHeader))) == 0x0)
 
  584   if (((binaryHeader->eIdent[1] != 
'E') && (binaryHeader->eIdent[2] != 
'L') && (binaryHeader->eIdent[3] != 
'F')) || (binaryHeader->eType != 
ET_EXEC)) {
 
  591   if ((programHeader = (elfProgramHeader *) 
kmalloc(
sizeof(elfProgramHeader) * binaryHeader->ePhnum)) == 0x0)
 
  594   fread(programHeader, (
sizeof(elfProgramHeader) * binaryHeader->ePhnum), 1, 
_current->
files[0]);
 
  597   for (i = 0x0; i < binaryHeader->ePhnum; i++) {
 
  598     switch (programHeader[i].phType) {
 
  600         seg_addr = 
trunc_page(programHeader[i].phVaddr);
 
  601         seg_size = 
round_page(programHeader[i].phMemsz + programHeader[i].phVaddr - seg_addr);
 
  607         for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
 
  610             K_PANIC(
"Error: Remap Page Failed");
 
  611           memset((
void *) ((programHeader[i].phVaddr & 0xFFFFF000) + x), 0x0, 0x1000);
 
  616         fread((
void *) programHeader[i].phVaddr, programHeader[i].phFilesz, 1, 
_current->
files[0]);
 
  617         if ((programHeader[i].phFlags & 0x2) != 0x2) {
 
  618           for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
 
  620               K_PANIC(
"vmm_setPageAttributes failed");
 
  623         if (binaryHeader->eEntry >= programHeader[i].phVaddr && binaryHeader->eEntry < (programHeader[i].phVaddr + programHeader[i].phMemsz)) {
 
  634         interp = (
char *) 
kmalloc(programHeader[i].phFilesz);
 
  641         kprintf(
"Interp: [%s]\n", interp);
 
  645         proghdr = programHeader[i].phVaddr;
 
  666   if (argv[1] != 0x0) {
 
  669     memset(args, 0x0, 0x1000);
 
  671     argvNew = (
char **) 
kmalloc(
sizeof(
char *) * argc);
 
  672     for (i = 0x0; i < argc; i++) {
 
  673       strcpy(args + x, argv[i + 1]);
 
  674       argvNew[i] = args + x;
 
  675       x += 
strlen(argv[i + 1]) + 1;
 
  696   for (i = 0; i < argc; i++) {
 
  697     tmp[i + 1] = argv[i];
 
  701   memset(args, 0x0, 0x1000);
 
  702   strcpy(args, 
"LIBRARY_PATH=/lib");
 
  703   tmp[argc + 2] = args;
 
  704   kprintf(
"env: [0x%X][0x%X]\n", (
uInt32) tmp + argc + 2, tmp[argc + 2]);
 
  706   kprintf(
"env: [0x%X][0x%X]\n", (
uInt32) tmp + argc + 2, tmp[argc + 2]);