Index: sys/conf/options.mips =================================================================== --- sys/conf/options.mips +++ sys/conf/options.mips @@ -47,6 +47,8 @@ CPU_XBURST opt_global.h CPU_MALTA opt_global.h +MIPS_ALLOW_PAGE_ALIASING opt_global.h + # which MACHINE_ARCH architecture MIPS MIPSHF Index: sys/kern/vfs_bio.c =================================================================== --- sys/kern/vfs_bio.c +++ sys/kern/vfs_bio.c @@ -4933,7 +4933,7 @@ * Once the MIPS pmap/cache code grows to support this function on * earlier chips, it should be flipped back off. */ -#ifdef __mips__ +#if defined(__mips__) || !defined(MIPS_ALLOW_PAGE_ALIASING) static int buf_pager_relbuf = 1; #else static int buf_pager_relbuf = 0; Index: sys/mips/conf/std.MALTA =================================================================== --- sys/mips/conf/std.MALTA +++ sys/mips/conf/std.MALTA @@ -28,6 +28,7 @@ options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions options CAPABILITY_MODE # Capsicum capability mode options CAPABILITIES # Capsicum capabilities +options MIPS_ALLOW_PAGE_ALIASING #Support features requing page aliasing options TMPFS #Efficient memory filesystem Index: sys/mips/include/vmparam.h =================================================================== --- sys/mips/include/vmparam.h +++ sys/mips/include/vmparam.h @@ -97,9 +97,11 @@ * and some QED CPUs perform some virtual address checks before the * offset is calculated. */ -#define USRSTACK (VM_MAXUSER_ADDRESS - PAGE_SIZE) +#define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) +#define USRSTACK SHAREDPAGE #ifdef __mips_n64 -#define FREEBSD32_USRSTACK (((vm_offset_t)0x80000000) - PAGE_SIZE) +#define FREEBSD32_SHAREDPAGE (((vm_offset_t)0x80000000) - PAGE_SIZE) +#define FREEBSD32_USRSTACK FREEBSD32_SHAREDPAGE #endif /* Index: sys/mips/mips/elf_machdep.c =================================================================== --- sys/mips/mips/elf_machdep.c +++ sys/mips/mips/elf_machdep.c @@ -77,14 +77,24 @@ .sv_setregs = exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_LP64, + .sv_flags = SV_ABI_FREEBSD | SV_LP64 | +#ifdef MIPS_ALLOW_PAGE_ALIASING + SV_SHP, +#else + 0, +#endif .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, +#ifdef MIPS_ALLOW_PAGE_ALIASING + .sv_shared_page_base = SHAREDPAGE, + .sv_shared_page_len = PAGE_SIZE, +#endif .sv_schedtail = NULL, .sv_thread_detach = NULL, .sv_trap = NULL, }; +INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec); static Elf64_Brandinfo freebsd_brand_info = { .brand = ELFOSABI_FREEBSD, @@ -133,14 +143,24 @@ .sv_setregs = exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_ILP32, + .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | +#ifdef MIPS_ALLOW_PAGE_ALIASING + SV_SHP, +#else + 0, +#endif .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, +#ifdef MIPS_ALLOW_PAGE_ALIASING + .sv_shared_page_base = SHAREDPAGE, + .sv_shared_page_len = PAGE_SIZE, +#endif .sv_schedtail = NULL, .sv_thread_detach = NULL, .sv_trap = NULL, }; +INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec); static Elf32_Brandinfo freebsd_brand_info = { .brand = ELFOSABI_FREEBSD, Index: sys/mips/mips/freebsd32_machdep.c =================================================================== --- sys/mips/mips/freebsd32_machdep.c +++ sys/mips/mips/freebsd32_machdep.c @@ -101,10 +101,19 @@ .sv_setregs = freebsd32_exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_ILP32, + .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | +#ifdef MIPS_ALLOW_PAGE_ALIASING + SV_SHP, +#else + 0, +#endif .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = freebsd32_syscallnames, +#ifdef MIPS_ALLOW_PAGE_ALIASING + .sv_shared_page_base = FREEBSD32_SHAREDPAGE, + .sv_shared_page_len = PAGE_SIZE, +#endif .sv_schedtail = NULL, .sv_thread_detach = NULL, .sv_trap = NULL, Index: sys/mips/mips/pm_machdep.c =================================================================== --- sys/mips/mips/pm_machdep.c +++ sys/mips/mips/pm_machdep.c @@ -176,10 +176,15 @@ regs->pc = (register_t)(intptr_t)catcher; regs->t9 = (register_t)(intptr_t)catcher; regs->sp = (register_t)(intptr_t)sfp; - /* - * Signal trampoline code is at base of user stack. - */ - regs->ra = (register_t)(intptr_t)PS_STRINGS - *(p->p_sysent->sv_szsigcode); + if (p->p_sysent->sv_sigcode_base != 0) { + /* Signal trampoline code is in the shared page */ + regs->ra = p->p_sysent->sv_sigcode_base; + } else { + /* Signal trampoline code is at base of user stack. */ + /* XXX: GC this code path once shared page is stable */ + regs->ra = (register_t)(intptr_t)PS_STRINGS - + *(p->p_sysent->sv_szsigcode); + } PROC_LOCK(p); mtx_lock(&psp->ps_mtx); }