aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64/linux32/linux32_sysvec.c
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2011-03-13 14:58:02 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2011-03-13 14:58:02 +0000
commit8f1e49a63851dd6485b00e07d952f926626ee6d8 (patch)
tree2cdc92ede096878311ecd5f49a49943453092d6e /sys/amd64/linux32/linux32_sysvec.c
parent3a8a826af387e3cd529b2b01dec3e314538b5de2 (diff)
downloadsrc-8f1e49a63851dd6485b00e07d952f926626ee6d8.tar.gz
src-8f1e49a63851dd6485b00e07d952f926626ee6d8.zip
Enable shared page use for amd64/linux32 and i386/linux binaries.
Move signal trampoline code from the top of the stack to the shared page. MFC after: 2 Weeks
Notes
Notes: svn path=/head/; revision=219609
Diffstat (limited to 'sys/amd64/linux32/linux32_sysvec.c')
-rw-r--r--sys/amd64/linux32/linux32_sysvec.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
index 12153ee5b9c2..c42f4d4ac53c 100644
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -411,8 +411,7 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
* Build context to run handler in.
*/
regs->tf_rsp = PTROUT(fp);
- regs->tf_rip = LINUX32_PS_STRINGS - *(p->p_sysent->sv_szsigcode) +
- linux_sznonrtsigcode;
+ regs->tf_rip = p->p_sysent->sv_sigcode_base + linux_sznonrtsigcode;
regs->tf_rflags &= ~(PSL_T | PSL_D);
regs->tf_cs = _ucode32sel;
regs->tf_ss = _udatasel;
@@ -535,7 +534,7 @@ linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
* Build context to run handler in.
*/
regs->tf_rsp = PTROUT(fp);
- regs->tf_rip = LINUX32_PS_STRINGS - *(p->p_sysent->sv_szsigcode);
+ regs->tf_rip = p->p_sysent->sv_sigcode_base;
regs->tf_rflags &= ~(PSL_T | PSL_D);
regs->tf_cs = _ucode32sel;
regs->tf_ss = _udatasel;
@@ -890,21 +889,15 @@ linux_copyout_strings(struct image_params *imgp)
* Also deal with signal trampoline code for this exec type.
*/
arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
- destp = (caddr_t)arginfo - linux_szsigcode - SPARE_USRSPACE -
- linux_szplatform - roundup((ARG_MAX - imgp->args->stringspace),
+ destp = (caddr_t)arginfo - SPARE_USRSPACE - linux_szplatform -
+ roundup((ARG_MAX - imgp->args->stringspace),
sizeof(char *));
/*
- * install sigcode
- */
- copyout(imgp->proc->p_sysent->sv_sigcode,
- ((caddr_t)arginfo - linux_szsigcode), linux_szsigcode);
-
- /*
* Install LINUX_PLATFORM
*/
- copyout(linux_platform, ((caddr_t)arginfo - linux_szsigcode -
- linux_szplatform), linux_szplatform);
+ copyout(linux_platform, ((caddr_t)arginfo - linux_szplatform),
+ linux_szplatform);
/*
* If we have a valid auxargs ptr, prepare some room
@@ -1050,7 +1043,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_minsigstksz = LINUX_MINSIGSTKSZ,
.sv_pagesize = PAGE_SIZE,
.sv_minuser = VM_MIN_ADDRESS,
- .sv_maxuser = LINUX32_USRSTACK,
+ .sv_maxuser = LINUX32_MAXUSER,
.sv_usrstack = LINUX32_USRSTACK,
.sv_psstrings = LINUX32_PS_STRINGS,
.sv_stackprot = VM_PROT_ALL,
@@ -1058,12 +1051,15 @@ struct sysentvec elf_linux_sysvec = {
.sv_setregs = exec_linux_setregs,
.sv_fixlimit = linux32_fixlimit,
.sv_maxssiz = &linux32_maxssiz,
- .sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_IA32,
+ .sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_IA32 | SV_SHP,
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = linux32_fetch_syscall_args,
.sv_syscallnames = NULL,
+ .sv_shared_page_base = LINUX32_SHAREDPAGE,
+ .sv_shared_page_len = PAGE_SIZE,
.sv_schedtail = linux_schedtail,
};
+INIT_SYSENTVEC(elf_sysvec, &elf_linux_sysvec);
static char GNU_ABI_VENDOR[] = "GNU";
static int GNULINUX_ABI_DESC = 0;