From owner-svn-src-projects@FreeBSD.ORG Fri Mar 12 15:57:56 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C495A106564A; Fri, 12 Mar 2010 15:57:56 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B28B78FC17; Fri, 12 Mar 2010 15:57:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o2CFvuAI044814; Fri, 12 Mar 2010 15:57:56 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o2CFvuJM044810; Fri, 12 Mar 2010 15:57:56 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201003121557.o2CFvuJM044810@svn.freebsd.org> From: Nathan Whitehorn Date: Fri, 12 Mar 2010 15:57:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r205085 - in projects/ppc64/sys/powerpc: aim include ofw powerpc X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 12 Mar 2010 15:57:56 -0000 Author: nwhitehorn Date: Fri Mar 12 15:57:56 2010 New Revision: 205085 URL: http://svn.freebsd.org/changeset/base/205085 Log: Don't pretend we are limited to a 32-bit address space any more, and move KVA from its previous cramped 512 MB slot to an expansive 1024 TB domain in high memory. Next on the list is actually worrying about SLB replacement so we can use more than 16 GB of it. Modified: projects/ppc64/sys/powerpc/aim/machdep.c projects/ppc64/sys/powerpc/aim/mmu_oea64.c projects/ppc64/sys/powerpc/aim/trap.c projects/ppc64/sys/powerpc/aim/trap_subr64.S projects/ppc64/sys/powerpc/include/vmparam.h projects/ppc64/sys/powerpc/ofw/ofw_real.c projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Modified: projects/ppc64/sys/powerpc/aim/machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/machdep.c Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/aim/machdep.c Fri Mar 12 15:57:56 2010 (r205085) @@ -493,7 +493,7 @@ powerpc_init(vm_offset_t startkernel, vm bcopy(&dsitrap, (void *)(EXC_DSI + trap_offset), (size_t)&dsisize); bcopy(generictrap, (void *)EXC_ISI, (size_t)&trapsize); #ifdef __powerpc64__ - bcopy(&dsitrap, (void *)EXC_DSE, (size_t)&dsisize); + bcopy(generictrap, (void *)EXC_DSE, (size_t)&trapsize); bcopy(generictrap, (void *)EXC_ISE, (size_t)&trapsize); #endif bcopy(generictrap, (void *)EXC_EXI, (size_t)&trapsize); @@ -851,9 +851,18 @@ va_to_vsid(pmap_t pm, vm_offset_t va) if (slbv == 0) { slbv = moea64_get_unique_vsid() << SLBV_VSID_SHIFT; for (i = 0; i < sizeof(pm->pm_slb)/sizeof(pm->pm_slb[0]); i++) { + if (pm == kernel_pmap && i == USER_SR) + continue; + if (!(pm->pm_slb[i].slbe & SLBE_VALID)) { pm->pm_slb[i].slbv = slbv; pm->pm_slb[i].slbe = slbe | i; + + if (pm == kernel_pmap && pmap_bootstrapped) { + __asm __volatile ("slbmte %0, %1" :: + "r"(kernel_pmap->pm_slb[i].slbv), + "r"(kernel_pmap->pm_slb[i].slbe)); + } break; } } Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/mmu_oea64.c Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/aim/mmu_oea64.c Fri Mar 12 15:57:56 2010 (r205085) @@ -946,13 +946,14 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o * Initialize the kernel pmap (which is statically allocated). */ #ifdef __powerpc64__ - for (i = 0; i < 16; i++) { - kernel_pmap->pm_slb[i].slbv = ((KERNEL_VSIDBITS << 17) | i) << - SLBV_VSID_SHIFT; - kernel_pmap->pm_slb[i].slbe = ((uint64_t)i << SLBE_ESID_SHIFT) | - SLBE_VALID | i; - } - kernel_pmap->pm_slb[USER_SR].slbe = 0; + for (i = 0; i < 64; i++) { + kernel_pmap->pm_slb[i].slbv = 0; + kernel_pmap->pm_slb[i].slbe = 0; + } + /* prefault some bits */ + (void)va_to_vsid(kernel_pmap, VM_MAX_KERNEL_ADDRESS); + (void)va_to_vsid(kernel_pmap, VM_MIN_KERNEL_ADDRESS); + (void)va_to_vsid(kernel_pmap, kernelstart); #else for (i = 0; i < 16; i++) kernel_pmap->pm_sr[i] = EMPTY_SEGMENT + i; @@ -1054,11 +1055,13 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o * step on. */ + #ifndef __powerpc64__ /* KVA is in high memory on PPC64 */ PMAP_LOCK(kernel_pmap); while (virtual_end < VM_MAX_KERNEL_ADDRESS && moea64_pvo_find_va(kernel_pmap, virtual_end+1, NULL) == NULL) virtual_end += PAGE_SIZE; PMAP_UNLOCK(kernel_pmap); + #endif /* * Allocate some things for page zeroing. We put this directly Modified: projects/ppc64/sys/powerpc/aim/trap.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/trap.c Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/aim/trap.c Fri Mar 12 15:57:56 2010 (r205085) @@ -256,6 +256,16 @@ trap(struct trapframe *frame) if (trap_pfault(frame, 0) == 0) return; break; +#ifdef __powerpc64__ + case EXC_ISE: + case EXC_DSE: + PMAP_LOCK(kernel_pmap); + (void)va_to_vsid(kernel_pmap, + (type == EXC_ISE) ? frame->srr0 : + frame->cpu.aim.dar); + PMAP_UNLOCK(kernel_pmap); + return; +#endif case EXC_MCHK: if (handle_onfault(frame)) return; Modified: projects/ppc64/sys/powerpc/aim/trap_subr64.S ============================================================================== --- projects/ppc64/sys/powerpc/aim/trap_subr64.S Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/aim/trap_subr64.S Fri Mar 12 15:57:56 2010 (r205085) @@ -446,6 +446,8 @@ generictrap: std %r29,(PC_TEMPSAVE+CPUSAVE_R29)(%r1) std %r30,(PC_TEMPSAVE+CPUSAVE_R30)(%r1) std %r31,(PC_TEMPSAVE+CPUSAVE_R31)(%r1) + mfdar %r30 + std %r30,(PC_TEMPSAVE+CPUSAVE_AIM_DAR)(%r1) mfsprg1 %r1 /* restore SP, in case of branch */ mfsprg2 %r28 /* save LR */ mfcr %r29 /* save CR */ Modified: projects/ppc64/sys/powerpc/include/vmparam.h ============================================================================== --- projects/ppc64/sys/powerpc/include/vmparam.h Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/include/vmparam.h Fri Mar 12 15:57:56 2010 (r205085) @@ -80,14 +80,14 @@ */ #if !defined(LOCORE) #define VM_MIN_ADDRESS ((vm_offset_t)0) - +#ifdef __powerpc64__ +#define VM_MAXUSER_ADDRESS ((vm_offset_t)0x4fffff000) +#else #define VM_MAXUSER_ADDRESS ((vm_offset_t)0x7ffff000) - +#endif #else #define VM_MIN_ADDRESS 0 - #define VM_MAXUSER_ADDRESS 0x7ffff000 - #endif /* LOCORE */ #define VM_MAX_ADDRESS VM_MAXUSER_ADDRESS @@ -98,9 +98,15 @@ #define KERNBASE 0x00100000UL /* start of kernel virtual */ +#ifdef __powerpc64__ +#define VM_MIN_KERNEL_ADDRESS 0xc000000000000000UL +#define VM_MAX_KERNEL_ADDRESS 0xcfffffffffffffffUL +#define VM_MAX_SAFE_KERNEL_ADDRESS VM_MAX_KERNEL_ADDRESS +#else #define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)KERNEL_SR << ADDR_SR_SHFT) #define VM_MAX_SAFE_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 2*SEGMENT_LENGTH -1) #define VM_MAX_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 3*SEGMENT_LENGTH - 1) +#endif /* * Use the direct-mapped BAT registers for UMA small allocs. This Modified: projects/ppc64/sys/powerpc/ofw/ofw_real.c ============================================================================== --- projects/ppc64/sys/powerpc/ofw/ofw_real.c Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/ofw/ofw_real.c Fri Mar 12 15:57:56 2010 (r205085) @@ -68,10 +68,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include -#include +#include #include +#include +#include #include #include @@ -212,16 +213,16 @@ ofw_real_bounce_alloc(void *junk) of_bounce_virt = contigmalloc(PAGE_SIZE, M_OFWREAL, 0, 0, BUS_SPACE_MAXADDR_32BIT, PAGE_SIZE, PAGE_SIZE); + of_bounce_phys = vtophys(of_bounce_virt); + of_bounce_size = PAGE_SIZE; + /* - * XXX: Use of_bounce_virt in 32-bit mode. This assumes that kernel - * VA space is always < 0xffffffff. + * For virtual-mode OF, direct map this physical address so that + * we have a 32-bit virtual address to give OF. */ - if (ofw_real_mode) - of_bounce_phys = vtophys(of_bounce_virt); - else - of_bounce_phys = (vm_offset_t)of_bounce_virt; - of_bounce_size = PAGE_SIZE; + if (!ofw_real_mode && !hw_direct_map) + pmap_kenter(of_bounce_phys, of_bounce_phys); mtx_unlock(&of_bounce_mtx); } Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Fri Mar 12 15:21:13 2010 (r205084) +++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Fri Mar 12 15:57:56 2010 (r205085) @@ -919,7 +919,7 @@ cpu_thread_alloc(struct thread *td) struct pcb *pcb; pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE - - sizeof(struct pcb)) & ~0x2fU); + sizeof(struct pcb)) & ~0x2fUL); td->td_pcb = pcb; td->td_frame = (struct trapframe *)pcb - 1; }