Module Name: src Committed By: christos Date: Fri Mar 4 04:25:58 UTC 2011
Modified Files: src/sys/kern: exec_subr.c Log Message: PR/44673: Arna Clauson: Latest MAXSSIZ bump broke netbsd32 emulation on amd64. - Use MAXSSIZ32 instead of MAXSSIZ for 32 bit binaries - Default MAXXSIZ32 to a quarter of MAXSSIZ (good enough?) - Add debugging XXX: Note that: - sparc32 MAXSSIZ is larger than sparc64 MAXSSIZ - sparc64 MAXSSIZ32 != sparc32 MAXSSIZ To generate a diff of this commit: cvs rdiff -u -r1.67 -r1.68 src/sys/kern/exec_subr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/exec_subr.c diff -u src/sys/kern/exec_subr.c:1.67 src/sys/kern/exec_subr.c:1.68 --- src/sys/kern/exec_subr.c:1.67 Mon Jan 17 02:13:31 2011 +++ src/sys/kern/exec_subr.c Thu Mar 3 23:25:58 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: exec_subr.c,v 1.67 2011/01/17 07:13:31 uebayasi Exp $ */ +/* $NetBSD: exec_subr.c,v 1.68 2011/03/04 04:25:58 christos Exp $ */ /* * Copyright (c) 1993, 1994, 1996 Christopher G. Demetriou @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.67 2011/01/17 07:13:31 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.68 2011/03/04 04:25:58 christos Exp $"); #include "opt_pax.h" @@ -64,6 +64,12 @@ VMCMD_EVCNT_DECL(extends); VMCMD_EVCNT_DECL(kills); +#ifdef DEBUG_STACK +#define DPRINTF(a) uprintf a +#else +#define DPRINTF(a) +#endif + /* * new_vmcmd(): * create a new vmcmd structure and fill in its fields based @@ -382,14 +388,22 @@ #ifndef USRSTACK32 #define USRSTACK32 (0x00000000ffffffffL&~PGOFSET) #endif +#ifndef MAXSSIZ32 +#define MAXSSIZ32 (MAXSSIZ >> 2) +#endif if (epp->ep_flags & EXEC_32) { epp->ep_minsaddr = USRSTACK32; - max_stack_size = MAXSSIZ; + max_stack_size = MAXSSIZ32; } else { epp->ep_minsaddr = USRSTACK; max_stack_size = MAXSSIZ; } + + DPRINTF(("ep_minsaddr=%llx max_stack_size=%llx\n", + (unsigned long long)epp->ep_minsaddr, + (unsigned long long)max_stack_size)); + epp->ep_ssize = l->l_proc->p_rlimit[RLIMIT_STACK].rlim_cur; #ifdef PAX_ASLR @@ -401,6 +415,10 @@ epp->ep_maxsaddr = (vaddr_t)STACK_GROW(epp->ep_minsaddr, max_stack_size); + DPRINTF(("ep_ssize=%llx ep_maxsaddr=%llx\n", + (unsigned long long)epp->ep_ssize, + (unsigned long long)epp->ep_maxsaddr)); + /* * set up commands for stack. note that this takes *two*, one to * map the part of the stack which we can access, and one to map @@ -414,6 +432,14 @@ noaccess_size = max_stack_size - access_size; noaccess_linear_min = (vaddr_t)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr, access_size), noaccess_size); + + DPRINTF(("access_size=%llx, access_linear_min=%llx, " + "noaccess_size=%llx, noaccess_linear_min=%llx\n", + (unsigned long long)access_size, + (unsigned long long)access_linear_min, + (unsigned long long)noaccess_size, + (unsigned long long)noaccess_linear_min)); + if (noaccess_size > 0 && noaccess_size <= MAXSSIZ) { NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size, noaccess_linear_min, NULL, 0, VM_PROT_NONE, VMCMD_STACK);