diff --git a/contrib/gcc/config/rs6000/freebsd.h b/contrib/gcc/config/rs6000/freebsd.h index 34c93b8..fe8e0b6 100644 --- a/contrib/gcc/config/rs6000/freebsd.h +++ b/contrib/gcc/config/rs6000/freebsd.h @@ -242,3 +242,5 @@ #define PROFILE_HOOK(LABEL) \ do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0) +#undef NEED_INDICATE_EXEC_STACK +#define NEED_INDICATE_EXEC_STACK 1 diff --git a/lib/csu/powerpc/crti.S b/lib/csu/powerpc/crti.S index 544bfa9..da83d1d 100644 --- a/lib/csu/powerpc/crti.S +++ b/lib/csu/powerpc/crti.S @@ -47,3 +47,5 @@ _fini: stw 31,12(1) stw 0,20(1) mr 31,1 + + .section .note.GNU-stack,"",%progbits diff --git a/lib/csu/powerpc/crtn.S b/lib/csu/powerpc/crtn.S index d3baa70..7430118 100644 --- a/lib/csu/powerpc/crtn.S +++ b/lib/csu/powerpc/crtn.S @@ -42,3 +42,5 @@ __FBSDID("$FreeBSD$"); lwz 31,-4(11) mr 1,11 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/csu/powerpc64/crti.S b/lib/csu/powerpc64/crti.S index edca7ba..16a22c2 100644 --- a/lib/csu/powerpc64/crti.S +++ b/lib/csu/powerpc64/crti.S @@ -59,3 +59,5 @@ _fini: stdu 1,-48(1) mflr 0 std 0,64(1) + + .section .note.GNU-stack,"",%progbits diff --git a/lib/csu/powerpc64/crtn.S b/lib/csu/powerpc64/crtn.S index c62f913..39f21ae 100644 --- a/lib/csu/powerpc64/crtn.S +++ b/lib/csu/powerpc64/crtn.S @@ -38,3 +38,5 @@ __FBSDID("$FreeBSD$"); ld 0,16(%r1) mtlr 0 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/gen/_ctx_start.S b/lib/libc/powerpc/gen/_ctx_start.S index a269e86..2d3cfcf 100644 --- a/lib/libc/powerpc/gen/_ctx_start.S +++ b/lib/libc/powerpc/gen/_ctx_start.S @@ -41,3 +41,5 @@ * above branch. */ bl PIC_PLT(CNAME(abort)) /* abort */ + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/gen/_setjmp.S b/lib/libc/powerpc/gen/_setjmp.S index 6d6e5e0..9b9f86e 100644 --- a/lib/libc/powerpc/gen/_setjmp.S +++ b/lib/libc/powerpc/gen/_setjmp.S @@ -69,3 +69,5 @@ ENTRY(_longjmp) bnelr li %r3,1 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/gen/fabs.S b/lib/libc/powerpc/gen/fabs.S index 79475ca..7891012 100644 --- a/lib/libc/powerpc/gen/fabs.S +++ b/lib/libc/powerpc/gen/fabs.S @@ -33,3 +33,5 @@ __FBSDID("$FreeBSD$"); ENTRY(fabs) fabs %f1,%f1 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/gen/setjmp.S b/lib/libc/powerpc/gen/setjmp.S index a796120..6aaf81c 100644 --- a/lib/libc/powerpc/gen/setjmp.S +++ b/lib/libc/powerpc/gen/setjmp.S @@ -89,3 +89,4 @@ ENTRY(__longjmp) li %r3,1 blr + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/gen/sigsetjmp.S b/lib/libc/powerpc/gen/sigsetjmp.S index 3d5d1e5..5a6fd21 100644 --- a/lib/libc/powerpc/gen/sigsetjmp.S +++ b/lib/libc/powerpc/gen/sigsetjmp.S @@ -95,3 +95,5 @@ ENTRY(siglongjmp) bnelr li %r3,1 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/brk.S b/lib/libc/powerpc/sys/brk.S index 9223db3..018eec9 100644 --- a/lib/libc/powerpc/sys/brk.S +++ b/lib/libc/powerpc/sys/brk.S @@ -71,3 +71,5 @@ ENTRY(brk) 1: b PIC_PLT(HIDENAME(cerror)) + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/cerror.S b/lib/libc/powerpc/sys/cerror.S index 91a3006..7667cb8 100644 --- a/lib/libc/powerpc/sys/cerror.S +++ b/lib/libc/powerpc/sys/cerror.S @@ -54,4 +54,4 @@ HIDENAME(cerror): li %r4,-1 blr /* return to callers caller */ - + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/exect.S b/lib/libc/powerpc/sys/exect.S index d5f9c20..3c39b3c 100644 --- a/lib/libc/powerpc/sys/exect.S +++ b/lib/libc/powerpc/sys/exect.S @@ -37,3 +37,5 @@ ENTRY(exect) blr 1: b PIC_PLT(HIDENAME(cerror)) + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/pipe.S b/lib/libc/powerpc/sys/pipe.S index 3ca2358..3f6d9a4 100644 --- a/lib/libc/powerpc/sys/pipe.S +++ b/lib/libc/powerpc/sys/pipe.S @@ -41,3 +41,5 @@ ENTRY(pipe) blr /* and return 0 */ 1: b PIC_PLT(HIDENAME(cerror)) + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/ptrace.S b/lib/libc/powerpc/sys/ptrace.S index f47fc67..0bc25c9 100644 --- a/lib/libc/powerpc/sys/ptrace.S +++ b/lib/libc/powerpc/sys/ptrace.S @@ -56,3 +56,5 @@ ENTRY(ptrace) blr 1: b PIC_PLT(HIDENAME(cerror)) + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/sbrk.S b/lib/libc/powerpc/sys/sbrk.S index 47fc0fe..a5e4020 100644 --- a/lib/libc/powerpc/sys/sbrk.S +++ b/lib/libc/powerpc/sys/sbrk.S @@ -68,3 +68,5 @@ ENTRY(sbrk) blr 2: b PIC_PLT(HIDENAME(cerror)) + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc/sys/setlogin.S b/lib/libc/powerpc/sys/setlogin.S index c65e639..e0d6d3c 100644 --- a/lib/libc/powerpc/sys/setlogin.S +++ b/lib/libc/powerpc/sys/setlogin.S @@ -47,3 +47,5 @@ SYSCALL(setlogin) stw %r5,CNAME(_logname_valid)@l(%r4) #endif blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/gen/_ctx_start.S b/lib/libc/powerpc64/gen/_ctx_start.S index 4dabd13..6e373c8 100644 --- a/lib/libc/powerpc64/gen/_ctx_start.S +++ b/lib/libc/powerpc64/gen/_ctx_start.S @@ -45,3 +45,5 @@ */ nop bl PIC_PLT(CNAME(abort)) /* abort */ + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/gen/_setjmp.S b/lib/libc/powerpc64/gen/_setjmp.S index e7ea5f7..a5c247d 100644 --- a/lib/libc/powerpc64/gen/_setjmp.S +++ b/lib/libc/powerpc64/gen/_setjmp.S @@ -114,3 +114,5 @@ ENTRY(_longjmp) bnelr li %r3,1 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/gen/fabs.S b/lib/libc/powerpc64/gen/fabs.S index 79475ca..7891012 100644 --- a/lib/libc/powerpc64/gen/fabs.S +++ b/lib/libc/powerpc64/gen/fabs.S @@ -33,3 +33,5 @@ __FBSDID("$FreeBSD$"); ENTRY(fabs) fabs %f1,%f1 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/gen/setjmp.S b/lib/libc/powerpc64/gen/setjmp.S index fff8aee..0f33ab2 100644 --- a/lib/libc/powerpc64/gen/setjmp.S +++ b/lib/libc/powerpc64/gen/setjmp.S @@ -137,3 +137,4 @@ ENTRY(__longjmp) li %r3,1 blr + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/gen/sigsetjmp.S b/lib/libc/powerpc64/gen/sigsetjmp.S index 9a26a8f..7b50f9f 100644 --- a/lib/libc/powerpc64/gen/sigsetjmp.S +++ b/lib/libc/powerpc64/gen/sigsetjmp.S @@ -142,3 +142,5 @@ ENTRY(siglongjmp) bnelr li %r3,1 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/brk.S b/lib/libc/powerpc64/sys/brk.S index 59b891c..1e71663 100644 --- a/lib/libc/powerpc64/sys/brk.S +++ b/lib/libc/powerpc64/sys/brk.S @@ -69,3 +69,5 @@ ENTRY(brk) ld %r0,16(%r1) mtlr %r0 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/cerror.S b/lib/libc/powerpc64/sys/cerror.S index 9afb0f4..db7a10f 100644 --- a/lib/libc/powerpc64/sys/cerror.S +++ b/lib/libc/powerpc64/sys/cerror.S @@ -57,4 +57,4 @@ ENTRY(HIDENAME(cerror)) li %r4,-1 blr - + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/exect.S b/lib/libc/powerpc64/sys/exect.S index eecbd11..b752fb8 100644 --- a/lib/libc/powerpc64/sys/exect.S +++ b/lib/libc/powerpc64/sys/exect.S @@ -45,3 +45,5 @@ ENTRY(exect) ld %r0,16(%r1) mtlr %r0 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/pipe.S b/lib/libc/powerpc64/sys/pipe.S index fe115b0..0a92df5 100644 --- a/lib/libc/powerpc64/sys/pipe.S +++ b/lib/libc/powerpc64/sys/pipe.S @@ -49,3 +49,5 @@ ENTRY(pipe) ld %r0,16(%r1) mtlr %r0 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/ptrace.S b/lib/libc/powerpc64/sys/ptrace.S index 3ec4915..bda17e8 100644 --- a/lib/libc/powerpc64/sys/ptrace.S +++ b/lib/libc/powerpc64/sys/ptrace.S @@ -63,3 +63,5 @@ ENTRY(ptrace) ld %r0,16(%r1) mtlr %r0 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/sbrk.S b/lib/libc/powerpc64/sys/sbrk.S index a7a9c77..c767049 100644 --- a/lib/libc/powerpc64/sys/sbrk.S +++ b/lib/libc/powerpc64/sys/sbrk.S @@ -64,3 +64,5 @@ ENTRY(sbrk) ld %r0,16(%r1) mtlr %r0 blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/powerpc64/sys/setlogin.S b/lib/libc/powerpc64/sys/setlogin.S index 19e3212..6183407 100644 --- a/lib/libc/powerpc64/sys/setlogin.S +++ b/lib/libc/powerpc64/sys/setlogin.S @@ -37,3 +37,5 @@ SYSCALL(setlogin) li %r5,0 stw %r5,CNAME(_logname_valid)@toc@l(%r4) blr + + .section .note.GNU-stack,"",%progbits diff --git a/lib/libcompiler_rt/Makefile b/lib/libcompiler_rt/Makefile index a43672a..dcfcf74 100644 --- a/lib/libcompiler_rt/Makefile +++ b/lib/libcompiler_rt/Makefile @@ -156,7 +156,8 @@ SYMLINKS+=libcompiler_rt_p.a ${LIBDIR}/libgcc_p.a . endif .endif -.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" +.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" || \ + ${MACHINE_CPUARCH} == "powerpc" AFLAGS+=--noexecstack ACFLAGS+=-Wa,--noexecstack .endif diff --git a/libexec/rtld-elf/powerpc/rtld_start.S b/libexec/rtld-elf/powerpc/rtld_start.S index 00692d2..28ec19b 100644 --- a/libexec/rtld-elf/powerpc/rtld_start.S +++ b/libexec/rtld-elf/powerpc/rtld_start.S @@ -197,4 +197,4 @@ _ENTRY(_rtld_powerpc_pltcall) mtctr %r11 bctr # (*jmptab[index])() - + .section .note.GNU-stack,"",%progbits diff --git a/libexec/rtld-elf/powerpc64/rtld_start.S b/libexec/rtld-elf/powerpc64/rtld_start.S index 3c962c2..0694de1 100644 --- a/libexec/rtld-elf/powerpc64/rtld_start.S +++ b/libexec/rtld-elf/powerpc64/rtld_start.S @@ -159,3 +159,4 @@ _ENTRY(_rtld_bind_start) bctr # jump to target + .section .note.GNU-stack,"",%progbits diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 38029b0..9ce984e 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -115,7 +115,12 @@ static int elf_legacy_coredump = 0; SYSCTL_INT(_debug, OID_AUTO, __elfN(legacy_coredump), CTLFLAG_RW, &elf_legacy_coredump, 0, ""); -static int __elfN(nxstack) = 0; +static int __elfN(nxstack) = +#ifdef __amd64__ /* both 64 and 32 bit */ + 1; +#else + 0; +#endif SYSCTL_INT(__CONCAT(_kern_elf, __ELF_WORD_SIZE), OID_AUTO, nxstack, CTLFLAG_RW, &__elfN(nxstack), 0, __XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) ": enable non-executable stack"); diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h index b92ce70..96ba194 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 +#define FREEBSD32_USRSTACK (FREEBSD32_SHAREDPAGE - PAGE_SIZE) #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.