summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-01-14 11:36:44 +0000
committerkib <kib@FreeBSD.org>2011-01-14 11:36:44 +0000
commita8f14f7c92063bb4b5e271afb698921204865fbc (patch)
tree30475bdc175495750f46766cd96f06001f9e52fa /sys/powerpc
parent8ffb81ed62bfb8466b2865c8ebd16c406d608551 (diff)
downloadFreeBSD-src-a8f14f7c92063bb4b5e271afb698921204865fbc.zip
FreeBSD-src-a8f14f7c92063bb4b5e271afb698921204865fbc.tar.gz
Enable shared page for the signal trampolines on PowerPC.
Reviewed and tested by: nwhitehorn
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/include/vmparam.h8
-rw-r--r--sys/powerpc/powerpc/elf32_machdep.c5
-rw-r--r--sys/powerpc/powerpc/elf64_machdep.c6
-rw-r--r--sys/powerpc/powerpc/exec_machdep.c3
4 files changed, 14 insertions, 8 deletions
diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h
index b92ce70..d72e0ea 100644
--- a/sys/powerpc/include/vmparam.h
+++ b/sys/powerpc/include/vmparam.h
@@ -35,7 +35,7 @@
#ifndef _MACHINE_VMPARAM_H_
#define _MACHINE_VMPARAM_H_
-#define USRSTACK VM_MAXUSER_ADDRESS
+#define USRSTACK SHAREDPAGE
#ifndef MAXTSIZ
#define MAXTSIZ (64*1024*1024) /* max text size */
@@ -64,10 +64,12 @@
#ifdef __powerpc64__
#define VM_MIN_ADDRESS (0x0000000000000000UL)
#define VM_MAXUSER_ADDRESS (0x7ffffffffffff000UL)
+#define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE)
#define VM_MAX_ADDRESS (0xffffffffffffffffUL)
#else
#define VM_MIN_ADDRESS ((vm_offset_t)0)
#define VM_MAXUSER_ADDRESS ((vm_offset_t)0x7ffff000)
+#define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE)
#define VM_MAX_ADDRESS VM_MAXUSER_ADDRESS
#endif
#else /* LOCORE */
@@ -77,8 +79,8 @@
#endif
#endif /* LOCORE */
-#define FREEBSD32_USRSTACK 0x7ffff000
-
+#define FREEBSD32_SHAREDPAGE (0x7ffff000 - PAGE_SIZE)
+#define FREEBSD32_USRSTACK FREEBSD32_SHAREDPAGE
#ifdef AIM
#define KERNBASE 0x00100000UL /* start of kernel virtual */
diff --git a/sys/powerpc/powerpc/elf32_machdep.c b/sys/powerpc/powerpc/elf32_machdep.c
index 1761215..e35bd19 100644
--- a/sys/powerpc/powerpc/elf32_machdep.c
+++ b/sys/powerpc/powerpc/elf32_machdep.c
@@ -101,10 +101,13 @@ struct sysentvec elf32_freebsd_sysvec = {
#endif
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
- .sv_flags = SV_ABI_FREEBSD | SV_ILP32,
+ .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | SV_SHP,
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
+ .sv_shared_page_base = FREEBSD32_SHAREDPAGE,
+ .sv_shared_page_len = PAGE_SIZE,
};
+INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec);
static Elf32_Brandinfo freebsd_brand_info = {
.brand = ELFOSABI_FREEBSD,
diff --git a/sys/powerpc/powerpc/elf64_machdep.c b/sys/powerpc/powerpc/elf64_machdep.c
index 1b51920..af5b12d 100644
--- a/sys/powerpc/powerpc/elf64_machdep.c
+++ b/sys/powerpc/powerpc/elf64_machdep.c
@@ -76,11 +76,14 @@ struct sysentvec elf64_freebsd_sysvec = {
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
- .sv_flags = SV_ABI_FREEBSD | SV_LP64,
+ .sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_SHP,
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
+ .sv_shared_page_base = SHAREDPAGE,
+ .sv_shared_page_len = PAGE_SIZE,
};
+INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec);
static Elf64_Brandinfo freebsd_brand_info = {
.brand = ELFOSABI_FREEBSD,
@@ -114,7 +117,6 @@ SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY,
(sysinit_cfunc_t) elf64_insert_brand_entry,
&freebsd_brand_oinfo);
-
void
elf64_dump_thread(struct thread *td __unused, void *dst __unused,
size_t *off __unused)
diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c
index efcd805..9d38d70 100644
--- a/sys/powerpc/powerpc/exec_machdep.c
+++ b/sys/powerpc/powerpc/exec_machdep.c
@@ -290,8 +290,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
mtx_unlock(&psp->ps_mtx);
PROC_UNLOCK(p);
- tf->srr0 = (register_t)(p->p_sysent->sv_psstrings -
- *(p->p_sysent->sv_szsigcode));
+ tf->srr0 = (register_t)p->p_sysent->sv_sigcode_base;
/*
* copy the frame out to userland.
OpenPOWER on IntegriCloud