Index: sys/conf/config.mk =================================================================== --- sys/conf/config.mk (revision 361635) +++ sys/conf/config.mk (working copy) @@ -30,8 +30,10 @@ opt_inet6.h: @echo "#define INET6 1" > ${.TARGET} .endif +.if ${MK_IPSEC_SUPPORT} != "no" opt_ipsec.h: @echo "#define IPSEC_SUPPORT 1" > ${.TARGET} +.endif .if ${MK_RATELIMIT} != "no" opt_ratelimit.h: @echo "#define RATELIMIT 1" > ${.TARGET} @@ -60,6 +62,9 @@ .if ${MK_INET6_SUPPORT} != "no" KERN_OPTS+= INET6 .endif +.if ${MK_IPSEC_SUPPORT} != "no" +KERN_OPTS+= IPSEC_SUPPORT +.endif .elif !defined(KERN_OPTS) # Add all the options that are mentioned in any opt_*.h file when we # have a kernel build directory to pull them from. Index: sys/conf/files.powerpc =================================================================== --- sys/conf/files.powerpc (revision 361635) +++ sys/conf/files.powerpc (working copy) @@ -274,6 +274,7 @@ powerpc/powerpc/swtch32.S optional powerpc | powerpcspe powerpc/powerpc/swtch64.S optional powerpc64 powerpc/powerpc/stack_machdep.c optional ddb | stack +powerpc/powerpc/support.S standard powerpc/powerpc/syncicache.c standard powerpc/powerpc/sys_machdep.c standard powerpc/powerpc/trap.c standard Index: sys/modules/Makefile =================================================================== --- sys/modules/Makefile (revision 361635) +++ sys/modules/Makefile (working copy) @@ -427,7 +427,7 @@ _if_gif= if_gif _if_gre= if_gre _ipfw_pmod= ipfw_pmod -.if ${MK_IPSEC_SUPPORT} != "no" +.if ${KERN_OPTS:MIPSEC_SUPPORT} _ipsec= ipsec .endif .endif Index: sys/modules/tcp/Makefile =================================================================== --- sys/modules/tcp/Makefile (revision 361635) +++ sys/modules/tcp/Makefile (working copy) @@ -2,8 +2,7 @@ # $FreeBSD$ # -SYSDIR?=${SRCTOP}/sys -.include "${SYSDIR}/conf/kern.opts.mk" +.include SUBDIR= \ ${_tcp_bbr} \ @@ -17,7 +16,7 @@ .if (${MK_INET_SUPPORT} != "no" || ${MK_INET6_SUPPORT} != "no") || \ defined(ALL_MODULES) -.if ${MK_IPSEC_SUPPORT} != "no" +.if ${KERN_OPTS:MIPSEC_SUPPORT} _tcpmd5= tcpmd5 .endif .endif Index: sys/powerpc/aim/mmu_radix.c =================================================================== --- sys/powerpc/aim/mmu_radix.c (revision 361635) +++ sys/powerpc/aim/mmu_radix.c (working copy) @@ -412,9 +412,6 @@ vm_size_t); void mmu_radix_clear_modify(vm_page_t); void mmu_radix_copy(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t); -int mmu_radix_map_user_ptr(pmap_t pm, - volatile const void *uaddr, void **kaddr, size_t ulen, size_t *klen); -int mmu_radix_decode_kernel_ptr(vm_offset_t, int *, vm_offset_t *); int mmu_radix_enter(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, u_int, int8_t); void mmu_radix_enter_object(pmap_t, vm_offset_t, vm_offset_t, vm_page_t, vm_prot_t); @@ -538,8 +535,6 @@ .kextract = mmu_radix_kextract, .kremove = mmu_radix_kremove, .change_attr = mmu_radix_change_attr, - .map_user_ptr = mmu_radix_map_user_ptr, - .decode_kernel_ptr = mmu_radix_decode_kernel_ptr, .tlbie_all = mmu_radix_tlbie_all, }; @@ -2327,6 +2322,7 @@ printf("%s done\n", __func__); pmap_bootstrapped = 1; dmaplimit = roundup2(powerpc_ptob(Maxmem), L2_PAGE_SIZE); + PCPU_SET(flags, PCPU_GET(flags) | PC_FLAG_NOSRS); } static void Index: sys/powerpc/aim/trap_subr64.S =================================================================== --- sys/powerpc/aim/trap_subr64.S (revision 361635) +++ sys/powerpc/aim/trap_subr64.S (working copy) @@ -87,6 +87,9 @@ */ restore_kernsrs: GET_CPUINFO(%r28) + lwz %r29, PC_FLAGS(%r28) + mtcr %r29 + btlr 0 addi %r28,%r28,PC_KERNSLB ld %r29,16(%r28) /* One past USER_SLB_SLOT */ cmpdi %r29,0 @@ -270,9 +273,13 @@ std %r29,(savearea+CPUSAVE_R29)(%r3); \ std %r30,(savearea+CPUSAVE_R30)(%r3); \ std %r31,(savearea+CPUSAVE_R31)(%r3); \ + lwz %r28,PC_FLAGS(%r3); \ + mtcr %r28; \ + bt 0, 0f; /* Check to skip restoring SRs. */ \ mflr %r27; /* preserve LR */ \ bl restore_usersrs; /* uses r28-r31 */ \ mtlr %r27; \ +0: \ ld %r31,(savearea+CPUSAVE_R31)(%r3); \ ld %r30,(savearea+CPUSAVE_R30)(%r3); \ ld %r29,(savearea+CPUSAVE_R29)(%r3); \ Index: sys/powerpc/booke/pmap.c =================================================================== --- sys/powerpc/booke/pmap.c (revision 361635) +++ sys/powerpc/booke/pmap.c (working copy) @@ -410,7 +410,9 @@ .kremove = mmu_booke_kremove, .unmapdev = mmu_booke_unmapdev, .change_attr = mmu_booke_change_attr, +#ifndef __powerpc64__ .map_user_ptr = mmu_booke_map_user_ptr, +#endif .decode_kernel_ptr = mmu_booke_decode_kernel_ptr, /* dumpsys() support */ Index: sys/powerpc/conf/GENERIC =================================================================== --- sys/powerpc/conf/GENERIC (revision 361635) +++ sys/powerpc/conf/GENERIC (working copy) @@ -26,6 +26,8 @@ makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols makeoptions WITH_CTF=1 +options BOOTP_NFSV3 + # Platform support options POWERMAC #NewWorld Apple PowerMacs options PSIM #GDB PSIM ppc simulator Index: sys/powerpc/include/mmuvar.h =================================================================== --- sys/powerpc/include/mmuvar.h (revision 361635) +++ sys/powerpc/include/mmuvar.h (working copy) @@ -182,6 +182,26 @@ typedef struct mmu_kobj *mmu_t; +/* The currently installed pmap object. */ +extern mmu_t mmu_obj; + +/* + * Resolve a given pmap function. + * 'func' is the function name less the 'pmap_' * prefix. + */ +#define PMAP_RESOLVE_FUNC(func) \ + ({ \ + pmap_##func##_t f; \ + const struct mmu_kobj *mmu = mmu_obj; \ + do { \ + f = mmu->funcs->func; \ + if (f != NULL) break; \ + mmu = mmu->base; \ + } while (mmu != NULL); \ + printf("Resolved %s to %p\n", #func, f); \ + f;}) + + #define MMU_DEF(name, ident, methods) \ \ const struct mmu_kobj name = { \ Index: sys/powerpc/include/param.h =================================================================== --- sys/powerpc/include/param.h (revision 361635) +++ sys/powerpc/include/param.h (working copy) @@ -134,6 +134,9 @@ #define KSTACK_GUARD_PAGES 1 /* pages of kstack guard; 0 disables */ #define USPACE (kstack_pages * PAGE_SIZE) /* total size of pcb */ +#define COPYFAULT 0x1 +#define FUSUFAULT 0x2 + /* * Mach derived conversion macros */ Index: sys/powerpc/include/pcpu.h =================================================================== --- sys/powerpc/include/pcpu.h (revision 361635) +++ sys/powerpc/include/pcpu.h (working copy) @@ -50,11 +50,12 @@ int pc_bsp; \ volatile int pc_awake; \ uint32_t pc_ipimask; \ + uint32_t pc_flags; /* cpu feature flags */ \ register_t pc_tempsave[CPUSAVE_LEN]; \ register_t pc_disisave[CPUSAVE_LEN]; \ register_t pc_dbsave[CPUSAVE_LEN]; \ void *pc_restore; \ - vm_offset_t pc_qmap_addr; + vm_offset_t pc_qmap_addr; \ #define PCPU_MD_AIM32_FIELDS \ struct pvo_entry *qmap_pvo; \ @@ -77,6 +78,9 @@ #define PCPU_MD_AIM_FIELDS PCPU_MD_AIM32_FIELDS #endif +/* CPU feature flags, can be used for cached flow control. */ +#define PC_FLAG_NOSRS 0x00000001 + #define BOOKE_CRITSAVE_LEN (CPUSAVE_LEN + 2) #define BOOKE_TLB_MAXNEST 4 #define BOOKE_TLB_SAVELEN 16 Index: sys/powerpc/powerpc/copyinout.c =================================================================== --- sys/powerpc/powerpc/copyinout.c (revision 361635) +++ sys/powerpc/powerpc/copyinout.c (working copy) @@ -66,13 +66,82 @@ #include #include +#include #include +#include #include #include +#include +int subyte_remap(volatile void *addr, int byte); +int subyte_direct(volatile void *addr, int byte); +int copyinstr_remap(const void *udaddr, void *kaddr, size_t len, size_t *done); +int copyinstr_direct(const void *udaddr, void *kaddr, size_t len, size_t *done); +int copyout_remap(const void *kaddr, void *udaddr, size_t len); +int copyout_direct(const void *kaddr, void *udaddr, size_t len); +int copyin_remap(const void *uaddr, void *kaddr, size_t len); +int copyin_direct(const void *uaddr, void *kaddr, size_t len); +int suword32_remap(volatile void *addr, int word); +int suword32_direct(volatile void *addr, int word); +int suword_remap(volatile void *addr, long word); +int suword_direct(volatile void *addr, long word); +#ifdef __powerpc64__ +int suword64_remap(volatile void *addr, int64_t word); +int suword64_direct(volatile void *addr, int64_t word); +#endif + +int fubyte_remap(volatile const void *addr); +int fubyte_direct(volatile const void *addr); +int fuword16_remap(volatile const void *addr); +int fuword16_direct(volatile const void *addr); +int fueword32_remap(volatile const void *addr, int32_t *val); +int fueword32_direct(volatile const void *addr, int32_t *val); +#ifdef __powerpc64__ +int fueword64_remap(volatile const void *addr, int64_t *val); +int fueword64_direct(volatile const void *addr, int64_t *val); +#endif +int fueword_remap(volatile const void *addr, long *val); +int fueword_direct(volatile const void *addr, long *val); +int casueword32_remap(volatile uint32_t *addr, uint32_t old, uint32_t *oldvalp, + uint32_t new); +int casueword32_direct(volatile uint32_t *addr, uint32_t old, uint32_t *oldvalp, + uint32_t new); +int casueword_remap(volatile u_long *addr, u_long old, u_long *oldvalp, + u_long new); +int casueword_direct(volatile u_long *addr, u_long old, u_long *oldvalp, + u_long new); +#define FUNCNAME(x) x ## _remap + +#define DEFINE_COPY_FUNC(ret, func, args) \ + DEFINE_IFUNC(, ret, func, args) \ + { \ + return (PMAP_RESOLVE_FUNC(map_user_ptr) ? \ + func##_remap : func##_direct); \ + } +DEFINE_COPY_FUNC(int, subyte, (volatile void *, int)) +DEFINE_COPY_FUNC(int, copyinstr, (const void *, void *, size_t, size_t *)) +DEFINE_COPY_FUNC(int, copyin, (const void *, void *, size_t)) +DEFINE_COPY_FUNC(int, copyout, (const void *, void *, size_t)) +DEFINE_COPY_FUNC(int, suword, (volatile void *, long)) +DEFINE_COPY_FUNC(int, suword32, (volatile void *, int)) +#ifdef __powerpc64__ +DEFINE_COPY_FUNC(int, suword64, (volatile void *, int64_t)) +#endif +DEFINE_COPY_FUNC(int, fubyte, (volatile const void *)) +DEFINE_COPY_FUNC(int, fuword16, (volatile const void *)) +DEFINE_COPY_FUNC(int, fueword32, (volatile const void *, int32_t *)) +#ifdef __powerpc64__ +DEFINE_COPY_FUNC(int, fueword64, (volatile const void *, int64_t *)) +#endif +DEFINE_COPY_FUNC(int, fueword, (volatile const void *, long *)) +DEFINE_COPY_FUNC(int, casueword32, + (volatile uint32_t *, uint32_t, uint32_t *, uint32_t)) +DEFINE_COPY_FUNC(int, casueword, (volatile u_long *, u_long, u_long *, u_long)) + + int -copyout(const void *kaddr, void *udaddr, size_t len) +FUNCNAME(copyout)(const void *kaddr, void *udaddr, size_t len) { struct thread *td; pmap_t pm; @@ -111,7 +180,7 @@ } int -copyin(const void *udaddr, void *kaddr, size_t len) +FUNCNAME(copyin)(const void *udaddr, void *kaddr, size_t len) { struct thread *td; pmap_t pm; @@ -150,7 +219,7 @@ } int -copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done) +FUNCNAME(copyinstr)(const void *udaddr, void *kaddr, size_t len, size_t *done) { const char *up; char *kp; @@ -183,7 +252,7 @@ } int -subyte(volatile void *addr, int byte) +FUNCNAME(subyte)(volatile void *addr, int byte) { struct thread *td; pmap_t pm; @@ -212,7 +281,7 @@ #ifdef __powerpc64__ int -suword32(volatile void *addr, int word) +suword32_remap(volatile void *addr, int word) { struct thread *td; pmap_t pm; @@ -238,10 +307,16 @@ td->td_pcb->pcb_onfault = NULL; return (0); } +#else +int +suword32_remap(volatile void *addr, int32_t word) +{ + return (suword_remap(addr, (long)word)); +} #endif int -suword(volatile void *addr, long word) +FUNCNAME(suword)(volatile void *addr, long word) { struct thread *td; pmap_t pm; @@ -270,20 +345,14 @@ #ifdef __powerpc64__ int -suword64(volatile void *addr, int64_t word) +suword64_remap(volatile void *addr, int64_t word) { - return (suword(addr, (long)word)); + return (suword_remap(addr, (long)word)); } -#else -int -suword32(volatile void *addr, int32_t word) -{ - return (suword(addr, (long)word)); -} #endif int -fubyte(volatile const void *addr) +FUNCNAME(fubyte)(volatile const void *addr) { struct thread *td; pmap_t pm; @@ -312,7 +381,7 @@ } int -fuword16(volatile const void *addr) +FUNCNAME(fuword16)(volatile const void *addr) { struct thread *td; pmap_t pm; @@ -340,7 +409,7 @@ } int -fueword32(volatile const void *addr, int32_t *val) +FUNCNAME(fueword32)(volatile const void *addr, int32_t *val) { struct thread *td; pmap_t pm; @@ -369,7 +438,7 @@ #ifdef __powerpc64__ int -fueword64(volatile const void *addr, int64_t *val) +fueword64_remap(volatile const void *addr, int64_t *val) { struct thread *td; pmap_t pm; @@ -398,7 +467,7 @@ #endif int -fueword(volatile const void *addr, long *val) +FUNCNAME(fueword)(volatile const void *addr, long *val) { struct thread *td; pmap_t pm; @@ -426,7 +495,7 @@ } int -casueword32(volatile uint32_t *addr, uint32_t old, uint32_t *oldvalp, +FUNCNAME(casueword32)(volatile uint32_t *addr, uint32_t old, uint32_t *oldvalp, uint32_t new) { struct thread *td; @@ -474,7 +543,7 @@ #ifndef __powerpc64__ int -casueword(volatile u_long *addr, u_long old, u_long *oldvalp, u_long new) +casueword_remap(volatile u_long *addr, u_long old, u_long *oldvalp, u_long new) { return (casueword32((volatile uint32_t *)addr, old, @@ -482,7 +551,7 @@ } #else int -casueword(volatile u_long *addr, u_long old, u_long *oldvalp, u_long new) +casueword_remap(volatile u_long *addr, u_long old, u_long *oldvalp, u_long new) { struct thread *td; pmap_t pm; Index: sys/powerpc/powerpc/db_interface.c =================================================================== --- sys/powerpc/powerpc/db_interface.c (revision 361635) +++ sys/powerpc/powerpc/db_interface.c (working copy) @@ -91,4 +91,5 @@ db_printf("PPC: hwref = %#zx\n", pc->pc_hwref); db_printf("PPC: ipimask = %#x\n", pc->pc_ipimask); + db_printf("PPC: flags = %#x\n", pc->pc_flags); } Index: sys/powerpc/powerpc/genassym.c =================================================================== --- sys/powerpc/powerpc/genassym.c (revision 361635) +++ sys/powerpc/powerpc/genassym.c (working copy) @@ -64,6 +64,7 @@ ASSYM(PC_DISISAVE, offsetof(struct pcpu, pc_disisave)); ASSYM(PC_DBSAVE, offsetof(struct pcpu, pc_dbsave)); ASSYM(PC_RESTORE, offsetof(struct pcpu, pc_restore)); +ASSYM(PC_FLAGS, offsetof(struct pcpu, pc_flags)); #if defined(BOOKE) ASSYM(PC_BOOKE_CRITSAVE, offsetof(struct pcpu, pc_booke.critsave)); @@ -106,6 +107,7 @@ ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock)); +ASSYM(PC_FLAG_NOSRS, PC_FLAG_NOSRS); #if defined(AIM) ASSYM(USER_ADDR, USER_ADDR); #ifdef __powerpc64__ Index: sys/powerpc/powerpc/mp_machdep.c =================================================================== --- sys/powerpc/powerpc/mp_machdep.c (revision 361635) +++ sys/powerpc/powerpc/mp_machdep.c (working copy) @@ -246,6 +246,7 @@ printf("Waking up CPU %d (dev=%x)\n", pc->pc_cpuid, (int)pc->pc_hwref); + pc->pc_flags = PCPU_GET(flags); /* Copy cached CPU flags */ ret = platform_smp_start_cpu(pc); if (ret == 0) { timeout = 2000; /* wait 2sec for the AP */ Index: sys/powerpc/powerpc/pmap_dispatch.c =================================================================== --- sys/powerpc/powerpc/pmap_dispatch.c (revision 361635) +++ sys/powerpc/powerpc/pmap_dispatch.c (working copy) @@ -62,7 +62,7 @@ #include #include -static mmu_t mmu_obj; +mmu_t mmu_obj; /* * pmap globals @@ -99,24 +99,14 @@ #define DEFINE_PMAP_IFUNC(ret, func, args) \ DEFINE_IFUNC(, ret, pmap_##func, args) { \ - const struct mmu_kobj *mmu = mmu_obj; \ pmap_##func##_t f; \ - do { \ - f = mmu->funcs->func; \ - if (f != NULL) break; \ - mmu = mmu->base; \ - } while (mmu != NULL); \ + f = PMAP_RESOLVE_FUNC(func); \ return (f != NULL ? f : (pmap_##func##_t)pmap_nomethod);\ } #define DEFINE_DUMPSYS_IFUNC(ret, func, args) \ DEFINE_IFUNC(, ret, dumpsys_##func, args) { \ - const struct mmu_kobj *mmu = mmu_obj; \ pmap_dumpsys_##func##_t f; \ - do { \ - f = mmu->funcs->dumpsys_##func; \ - if (f != NULL) break; \ - mmu = mmu->base; \ - } while (mmu != NULL); \ + f = PMAP_RESOLVE_FUNC(dumpsys_##func); \ return (f != NULL ? f : (pmap_dumpsys_##func##_t)pmap_nomethod);\ } Index: sys/powerpc/powerpc/trap.c =================================================================== --- sys/powerpc/powerpc/trap.c (revision 361635) +++ sys/powerpc/powerpc/trap.c (working copy) @@ -98,6 +98,9 @@ extern vm_offset_t __startkernel; +extern int copy_fault(void); +extern int fusufault(void); + #ifdef KDB int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */ #endif @@ -589,6 +592,19 @@ struct thread *td; jmp_buf *fb; + uint64_t dispatch = (uintptr_t)curthread->td_pcb->pcb_onfault; + + /* Short-circuit radix and Book-E paths. */ + switch (dispatch) { + case COPYFAULT: + frame->srr0 = (uintptr_t)copy_fault; + return (1); + case FUSUFAULT: + frame->srr0 = (uintptr_t)fusufault; + return (1); + default: + break; + } td = curthread; fb = td->td_pcb->pcb_onfault; if (fb != NULL) {