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]);