![](https://secure.gravatar.com/avatar/cc13150cabd87c26f35cb4b0ea78d66d.jpg?s=120&d=mm&r=g)
Raymond Toy pushed to branch rtoy-mmap-anon-control-and-binding-stacks at cmucl / cmucl Commits: 1869d093 by Raymond Toy at 2015-10-03T07:55:34Z Updates to handle random stack locations better. * Print out some better messages from os_protect * Add make_hole to actually make a hole * make_holes only does the read-only and static spaces. * make_stack_holes handles the binding and control stacks. - - - - - 4b838e3f by Raymond Toy at 2015-10-03T07:56:07Z Make holes in the stacks, as before. - - - - - 2 changed files: - src/lisp/solaris-os.c - src/lisp/validate.c Changes: ===================================== src/lisp/solaris-os.c ===================================== --- a/src/lisp/solaris-os.c +++ b/src/lisp/solaris-os.c @@ -169,8 +169,14 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) void os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) { - if (mprotect((void *) address, length, prot) == -1) - perror("mprotect"); + if (mprotect((void *) address, length, prot) == -1) { + char msg[1000]; + + snprintf(msg, sizeof(msg), "mprotect: os_protect(0x%p, %u, 0x%x): ", + address, length, prot); + + perror(msg); + } } static boolean @@ -430,27 +436,37 @@ static unsigned long *space_size[] = { #define HOLE_SIZE 0x2000 void -make_holes(void) +make_hole(int index) { - int k; os_vm_address_t hole; /* Make holes of the appropriate size for desired spaces */ - for (k = 0; k < sizeof(spaces) / sizeof(spaces[0]); ++k) { - - hole = spaces[k] + *space_size[k]; + hole = spaces[k] + *space_size[k]; - if (os_validate(hole, HOLE_SIZE) == NULL) { - fprintf(stderr, - "ensure_space: Failed to validate hole of %d bytes at 0x%08lX\n", - HOLE_SIZE, (unsigned long) hole); - exit(1); - } - /* Make it inaccessible */ - os_protect(hole, HOLE_SIZE, 0); + if (os_validate(hole, HOLE_SIZE) == NULL) { + fprintf(stderr, + "ensure_space: Failed to validate hole of %d bytes at 0x%08lX\n", + HOLE_SIZE, (unsigned long) hole); + exit(1); } + /* Make it inaccessible */ + os_protect(hole, HOLE_SIZE, 0); +} + +void +make_holes(void) +{ + os_vm_address_t hole; + + /* + * Make holes of the appropriate size for desired spaces. The + * stacks are handled in make_stack_holes. + */ + make_hole(0); /* Read-only space */ + make_hole(1); /* Static space */ + /* Round up the dynamic_space_size to the nearest SPARSE_BLOCK_SIZE */ dynamic_space_size = round_up_sparse_size(dynamic_space_size); @@ -477,6 +493,13 @@ make_holes(void) #endif } +void +make_stack_holes(void) +{ + make_hole(2); + make_hole(3); +} + void * os_dlsym(const char *sym_name, lispobj lib_list) { ===================================== src/lisp/validate.c ===================================== --- a/src/lisp/validate.c +++ b/src/lisp/validate.c @@ -18,6 +18,7 @@ #ifdef sparc extern void make_holes(void); +extern void make_stack_holes(void); #endif static void @@ -124,6 +125,10 @@ validate_stacks() /* Binding Stack */ binding_stack = os_validate(NULL, binding_stack_size); +#ifdef sparc + make_stack_holes(); +#endif + #ifdef RED_ZONE_HIT os_guard_control_stack(0, 1); #endif View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/compare/586ca74df2c5289c9154e688e...
participants (1)
-
Raymond Toy