|
@@ -11,11 +11,13 @@
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <string.h>
|
|
|
-#include <malloc.h>
|
|
|
+/* #include <malloc.h> */
|
|
|
+#include <errno.h>
|
|
|
+#include <fcntl.h>
|
|
|
|
|
|
/* the exact size (in bytes) of the executable part of the file. */
|
|
|
/* this constant needs to be updated everytime a change is made to this file */
|
|
|
-#define exeSize 16860
|
|
|
+#define exeSize 17028
|
|
|
|
|
|
|
|
|
#define pageSize 4096
|
|
@@ -116,6 +118,8 @@ BootInfo* bootInfo;
|
|
|
int newRecAdr, newArrAdr;
|
|
|
int newRecFP, newArrFP;
|
|
|
|
|
|
+int zerofd;
|
|
|
+
|
|
|
int donothing(char* fmt, ...)
|
|
|
{
|
|
|
}
|
|
@@ -355,6 +359,19 @@ int ReadBootHeader()
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+void * MEMALLOC (size_t len)
|
|
|
+{
|
|
|
+ void * res;
|
|
|
+
|
|
|
+ res = mmap(0, len, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, zerofd, 0);
|
|
|
+ if (res == MAP_FAILED) {
|
|
|
+ res = NULL;
|
|
|
+ } else {
|
|
|
+ bzero(res, len);
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
int ReadHeader ()
|
|
|
{
|
|
|
int ofTag, i, nofImps, processor;
|
|
@@ -385,7 +402,7 @@ int ReadHeader ()
|
|
|
mod.imp = NULL;
|
|
|
for (i = 0; i < nofImps; i++)
|
|
|
{
|
|
|
- imp = (ImpList*)calloc(1, sizeof(ImpList));
|
|
|
+ imp = (ImpList*)MEMALLOC(sizeof(ImpList));
|
|
|
ReadName(imp->name);
|
|
|
if (mod.imp == NULL)
|
|
|
mod.imp = imp;
|
|
@@ -421,8 +438,8 @@ int ReadModule ()
|
|
|
int isLib;
|
|
|
char* im;
|
|
|
|
|
|
- mod.dad = (int) calloc(1, mod.ds);
|
|
|
- mod.mad = (int) calloc(1, mod.ms + mod.cs + mod.vs);
|
|
|
+ mod.dad = (int) MEMALLOC(mod.ds);
|
|
|
+ mod.mad = (int) MEMALLOC(mod.ms + mod.cs + mod.vs);
|
|
|
if ((mod.dad == 0) || (mod.mad == 0))
|
|
|
{
|
|
|
printf("BootLoader: Couldn't initalize heap\n");
|
|
@@ -570,8 +587,15 @@ int main (int argc, char *argv[])
|
|
|
int callBackAdr;
|
|
|
Module *k, *m;
|
|
|
|
|
|
+ zerofd = open("/dev/zero", O_RDWR);
|
|
|
+ if (zerofd == -1) {
|
|
|
+ printf("open /dev/zero failed: %s\n", strerror(errno));
|
|
|
+ return 101;
|
|
|
+ }
|
|
|
+
|
|
|
modlist = NULL;
|
|
|
dprintf("initializing BlackBox for Linux...\n");
|
|
|
+
|
|
|
/*f = fopen(bbfile, "rb");*/
|
|
|
f = fopen(argv[0], "r");
|
|
|
if (f != NULL)
|
|
@@ -604,7 +628,7 @@ int main (int argc, char *argv[])
|
|
|
else
|
|
|
{
|
|
|
/* assign the boot info to first variable in Kernel */
|
|
|
- bootInfo = calloc(1, sizeof(BootInfo));
|
|
|
+ bootInfo = MEMALLOC(sizeof(BootInfo));
|
|
|
bootInfo->modList = modlist;
|
|
|
bootInfo->argc = argc;
|
|
|
bootInfo->argv = argv;
|
|
@@ -612,14 +636,16 @@ int main (int argc, char *argv[])
|
|
|
dprintf("before body\n");
|
|
|
body = (BodyProc)(m->code);
|
|
|
k->opts = k->opts | init; /* include init in opts */
|
|
|
+ /*
|
|
|
ok = mprotect(
|
|
|
- (void *)(((m->code) / pageSize) * pageSize),
|
|
|
- (((m->csize) + MOD(m->code, pageSize) - 1) / pageSize) * pageSize + pageSize,
|
|
|
- PROT_READ|PROT_WRITE|PROT_EXEC);
|
|
|
+ (void *)(((m->code) / pageSize) * pageSize),
|
|
|
+ (((m->csize) + MOD(m->code, pageSize) - 1) / pageSize) * pageSize + pageSize,
|
|
|
+ PROT_READ|PROT_WRITE|PROT_EXEC);
|
|
|
if (ok != 0){
|
|
|
- printf("mprotect failed!\n");
|
|
|
- return 100;
|
|
|
+ printf("mprotect failed: %s\n", strerror(errno));
|
|
|
+ return 100;
|
|
|
}
|
|
|
+ */
|
|
|
body();
|
|
|
dprintf("after body\n");
|
|
|
}
|