index 50dab7321053814bd9b0aada642cf4cec58c964c..07ad35a726a33c88a3560277222d6171518d1565 100644 (file)
#include <stdio.h>
#include <stdlib.h>
#include <string.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
-
/* fixup types */
#define absolute 100
#define relative 101
int newRecAdr, newArrAdr;
int newRecFP, newArrFP;
+int zerofd;
+
int donothing(char* fmt, ...)
{
}
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;
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;
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");
return 1;
}
-int MOD (int x, int y)
-{
- int res;
-
- if (x >= 0) {
- res = x % y;
- } else {
- res = x - y * ((x + 1) / y - 1);
- }
- return res;
-}
-
int main (int argc, char *argv[])
{
int i, ok;
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");*/
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;
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);
- if (ok != 0){
- printf("mprotect failed!\n");
- return 100;
- }
body();
dprintf("after body\n");
}