version 1.33, 2000/04/29 13:07:35
|
version 1.34, 2000/05/30 09:34:22
|
Line 219 void after_alloc(Address r, Cell size)
|
Line 219 void after_alloc(Address r, Cell size)
|
} |
} |
} |
} |
|
|
Address my_alloc(Cell size) |
#ifndef MAP_FAILED |
|
#define MAP_FAILED ((Address) -1) |
|
#endif |
|
#ifndef MAP_FILE |
|
# define MAP_FILE 0 |
|
#endif |
|
#ifndef MAP_PRIVATE |
|
# define MAP_PRIVATE 0 |
|
#endif |
|
|
|
#if defined(HAVE_MMAP) |
|
static Address alloc_mmap(Cell size) |
{ |
{ |
#if HAVE_MMAP |
|
Address r; |
Address r; |
|
|
#if defined(MAP_ANON) |
#if defined(MAP_ANON) |
if (debug) |
if (debug) |
fprintf(stderr,"try mmap($%lx, $%lx, ..., MAP_ANON, ...); ", (long)next_address, (long)size); |
fprintf(stderr,"try mmap($%lx, $%lx, ..., MAP_ANON, ...); ", (long)next_address, (long)size); |
r=mmap(next_address, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); |
r = mmap(next_address, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); |
#else /* !defined(MAP_ANON) */ |
#else /* !defined(MAP_ANON) */ |
/* Ultrix (at least) does not define MAP_FILE and MAP_PRIVATE (both are |
/* Ultrix (at least) does not define MAP_FILE and MAP_PRIVATE (both are |
apparently defaults) */ |
apparently defaults) */ |
#ifndef MAP_FILE |
|
# define MAP_FILE 0 |
|
#endif |
|
#ifndef MAP_PRIVATE |
|
# define MAP_PRIVATE 0 |
|
#endif |
|
static int dev_zero=-1; |
static int dev_zero=-1; |
|
|
if (dev_zero == -1) |
if (dev_zero == -1) |
dev_zero = open("/dev/zero", O_RDONLY); |
dev_zero = open("/dev/zero", O_RDONLY); |
if (dev_zero == -1) { |
if (dev_zero == -1) { |
r = (Address)-1; |
r = MAP_FAILED; |
if (debug) |
if (debug) |
fprintf(stderr, "open(\"/dev/zero\"...) failed (%s), no mmap; ", |
fprintf(stderr, "open(\"/dev/zero\"...) failed (%s), no mmap; ", |
strerror(errno)); |
strerror(errno)); |
Line 252 Address my_alloc(Cell size)
|
Line 256 Address my_alloc(Cell size)
|
r=mmap(next_address, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, dev_zero, 0); |
r=mmap(next_address, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, dev_zero, 0); |
} |
} |
#endif /* !defined(MAP_ANON) */ |
#endif /* !defined(MAP_ANON) */ |
after_alloc(r,size); |
after_alloc(r, size); |
if (r!=(Address)-1) |
return r; |
|
} |
|
#endif |
|
|
|
Address my_alloc(Cell size) |
|
{ |
|
#if HAVE_MMAP |
|
Address r; |
|
|
|
r=alloc_mmap(size); |
|
if (r!=MAP_FAILED) |
return r; |
return r; |
#endif /* HAVE_MMAP */ |
#endif /* HAVE_MMAP */ |
/* use malloc as fallback */ |
/* use malloc as fallback */ |
Line 269 Address my_alloc(Cell size)
|
Line 283 Address my_alloc(Cell size)
|
#define dict_alloc(size) my_alloc(size) |
#define dict_alloc(size) my_alloc(size) |
#endif |
#endif |
|
|
Address dict_alloc_read(FILE *file, Cell size, Cell offset) |
Address dict_alloc_read(FILE *file, Cell imagesize, Cell dictsize, Cell offset) |
{ |
{ |
Address image = (Address) -1; |
Address image = MAP_FAILED; |
|
|
#ifndef mips_dict_alloc |
#if defined(HAVE_MMAP) && !defined(mips_dict_alloc) |
if (offset==0) { |
if (offset==0) { |
|
image=alloc_mmap(dictsize); |
if (debug) |
if (debug) |
fprintf(stderr,"try mmap(0, $%lx, ..., MAP_FILE, imagefile, 0); ", (long)size); |
fprintf(stderr,"try mmap($%lx, $%lx, ..., MAP_FIXED|MAP_FILE, imagefile, 0); ", (long)image, (long)imagesize); |
image = mmap(0, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fileno(file), 0); |
image = mmap(image, imagesize, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FIXED|MAP_FILE|MAP_PRIVATE, fileno(file), 0); |
after_alloc(image,size); |
after_alloc(image,dictsize); |
} |
} |
#endif /* defined(mips_dict_alloc) */ |
#endif /* defined(MAP_ANON) && !defined(mips_dict_alloc) */ |
if (image == (Address)-1) { |
if (image == MAP_FAILED) { |
image = dict_alloc(size+offset)+offset; |
image = dict_alloc(dictsize+offset)+offset; |
rewind(file); /* fseek(imagefile,0L,SEEK_SET); */ |
rewind(file); /* fseek(imagefile,0L,SEEK_SET); */ |
fread(image, 1, size, file); |
fread(image, 1, imagesize, file); |
} |
} |
return image; |
return image; |
} |
} |
Line 459 Address loader(FILE *imagefile, char* fi
|
Line 474 Address loader(FILE *imagefile, char* fi
|
if (debug) |
if (debug) |
fprintf(stderr,"pagesize=%ld\n",(unsigned long) pagesize); |
fprintf(stderr,"pagesize=%ld\n",(unsigned long) pagesize); |
|
|
image = dict_alloc_read(imagefile, preamblesize+dictsize, data_offset); |
image = dict_alloc_read(imagefile, preamblesize+header.image_size, |
|
preamblesize+dictsize, data_offset); |
imp=image+preamblesize; |
imp=image+preamblesize; |
if (clear_dictionary) |
if (clear_dictionary) |
memset(imp+header.image_size, 0, dictsize-header.image_size); |
memset(imp+header.image_size, 0, dictsize-header.image_size); |