From owner-svn-src-all@FreeBSD.ORG Mon Mar 21 01:09:50 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 744E9106566B; Mon, 21 Mar 2011 01:09:50 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 65E178FC18; Mon, 21 Mar 2011 01:09:50 +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 p2L19oHd094686; Mon, 21 Mar 2011 01:09:50 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2L19oa8094680; Mon, 21 Mar 2011 01:09:50 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103210109.p2L19oa8094680@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 21 Mar 2011 01:09:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219808 - in head/sys/ia64: ia64 include X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Mar 2011 01:09:50 -0000 Author: marcel Date: Mon Mar 21 01:09:50 2011 New Revision: 219808 URL: http://svn.freebsd.org/changeset/base/219808 Log: Change region 4 to be part of the kernel. This serves 2 purposes: 1. The PBVM is in region 4, so if we want to make use of it, we need region 4 freed up. 2. Region 4 and above cannot be represented by an off_t by virtue of that type being signed. This is problematic for truss(1), ktrace(1) and other such programs. Modified: head/sys/ia64/ia64/db_machdep.c head/sys/ia64/ia64/gdb_machdep.c head/sys/ia64/ia64/pmap.c head/sys/ia64/include/pmap.h head/sys/ia64/include/vmparam.h Modified: head/sys/ia64/ia64/db_machdep.c ============================================================================== --- head/sys/ia64/ia64/db_machdep.c Mon Mar 21 01:05:20 2011 (r219807) +++ head/sys/ia64/ia64/db_machdep.c Mon Mar 21 01:09:50 2011 (r219808) @@ -260,7 +260,7 @@ db_backtrace(struct thread *td, struct p sym = db_search_symbol(ip, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); db_printf("%s(", name); - if (bsp >= IA64_RR_BASE(5)) { + if (bsp >= VM_MAXUSER_ADDRESS) { for (i = 0; i < args; i++) { if ((bsp & 0x1ff) == 0x1f8) bsp += 8; @@ -279,12 +279,12 @@ db_backtrace(struct thread *td, struct p if (error != ERESTART) continue; - if (sp < IA64_RR_BASE(5)) + if (sp < VM_MAXUSER_ADDRESS) break; tf = (struct trapframe *)(sp + 16); if ((tf->tf_flags & FRAME_SYSCALL) != 0 || - tf->tf_special.iip < IA64_RR_BASE(5)) + tf->tf_special.iip < VM_MAXUSER_ADDRESS) break; /* XXX ask if we should unwind across the trapframe. */ Modified: head/sys/ia64/ia64/gdb_machdep.c ============================================================================== --- head/sys/ia64/ia64/gdb_machdep.c Mon Mar 21 01:05:20 2011 (r219807) +++ head/sys/ia64/ia64/gdb_machdep.c Mon Mar 21 01:09:50 2011 (r219808) @@ -177,7 +177,7 @@ gdb_cpu_query(void) * kernel stack address. See also ptrace_machdep(). */ bspstore = kdb_frame->tf_special.bspstore; - kstack = (bspstore >= IA64_RR_BASE(5)) ? (uint64_t*)bspstore : + kstack = (bspstore >= VM_MAXUSER_ADDRESS) ? (uint64_t*)bspstore : (uint64_t*)(kdb_thread->td_kstack + (bspstore & 0x1ffUL)); gdb_tx_begin('\0'); gdb_tx_mem((void*)(kstack + slot), 8); Modified: head/sys/ia64/ia64/pmap.c ============================================================================== --- head/sys/ia64/ia64/pmap.c Mon Mar 21 01:05:20 2011 (r219807) +++ head/sys/ia64/ia64/pmap.c Mon Mar 21 01:09:50 2011 (r219808) @@ -102,17 +102,11 @@ __FBSDID("$FreeBSD$"); * We reserve region ID 0 for the kernel and allocate the remaining * IDs for user pmaps. * - * Region 0..4 - * User virtually mapped - * - * Region 5 - * Kernel virtually mapped - * - * Region 6 - * Kernel physically mapped uncacheable - * - * Region 7 - * Kernel physically mapped cacheable + * Region 0-3: User virtually mapped + * Region 4: PBVM and special mappings + * Region 5: Kernel virtual memory + * Region 6: Direct-mapped uncacheable + * Region 7: Direct-mapped cacheable */ /* XXX move to a header. */ @@ -346,9 +340,9 @@ pmap_bootstrap() * Setup RIDs. RIDs 0..7 are reserved for the kernel. * * We currently need at least 19 bits in the RID because PID_MAX - * can only be encoded in 17 bits and we need RIDs for 5 regions + * can only be encoded in 17 bits and we need RIDs for 4 regions * per process. With PID_MAX equalling 99999 this means that we - * need to be able to encode 499995 (=5*PID_MAX). + * need to be able to encode 399996 (=4*PID_MAX). * The Itanium processor only has 18 bits and the architected * minimum is exactly that. So, we cannot use a PID based scheme * in those cases. Enter pmap_ridmap... @@ -390,7 +384,7 @@ pmap_bootstrap() */ ia64_kptdir = (void *)pmap_steal_memory(PAGE_SIZE); nkpt = 0; - kernel_vm_end = VM_MIN_KERNEL_ADDRESS - VM_GATEWAY_SIZE; + kernel_vm_end = VM_MIN_KERNEL_ADDRESS; for (i = 0; phys_avail[i+2]; i+= 2) ; @@ -451,16 +445,13 @@ pmap_bootstrap() * Initialize the kernel pmap (which is statically allocated). */ PMAP_LOCK_INIT(kernel_pmap); - for (i = 0; i < 5; i++) + for (i = 0; i < IA64_VM_MINKERN_REGION; i++) kernel_pmap->pm_rid[i] = 0; TAILQ_INIT(&kernel_pmap->pm_pvlist); PCPU_SET(md.current_pmap, kernel_pmap); - /* - * Region 5 is mapped via the vhpt. - */ - ia64_set_rr(IA64_RR_BASE(5), - (5 << 8) | (PAGE_SHIFT << 2) | 1); + /* Region 5 is mapped via the VHPT. */ + ia64_set_rr(IA64_RR_BASE(5), (5 << 8) | (PAGE_SHIFT << 2) | 1); /* * Region 6 is direct mapped UC and region 7 is direct mapped @@ -678,7 +669,7 @@ pmap_pinit(struct pmap *pmap) int i; PMAP_LOCK_INIT(pmap); - for (i = 0; i < 5; i++) + for (i = 0; i < IA64_VM_MINKERN_REGION; i++) pmap->pm_rid[i] = pmap_allocate_rid(); TAILQ_INIT(&pmap->pm_pvlist); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -699,7 +690,7 @@ pmap_release(pmap_t pmap) { int i; - for (i = 0; i < 5; i++) + for (i = 0; i < IA64_VM_MINKERN_REGION; i++) if (pmap->pm_rid[i]) pmap_free_rid(pmap->pm_rid[i]); PMAP_LOCK_DESTROY(pmap); @@ -1221,7 +1212,7 @@ pmap_kextract(vm_offset_t va) struct ia64_lpte *pte; vm_offset_t gwpage; - KASSERT(va >= IA64_RR_BASE(5), ("Must be kernel VA")); + KASSERT(va >= VM_MAXUSER_ADDRESS, ("Must be kernel VA")); /* Regions 6 and 7 are direct mapped. */ if (va >= IA64_RR_BASE(6)) @@ -1229,7 +1220,7 @@ pmap_kextract(vm_offset_t va) /* EPC gateway page? */ gwpage = (vm_offset_t)ia64_get_k5(); - if (va >= gwpage && va < gwpage + VM_GATEWAY_SIZE) + if (va >= gwpage && va < gwpage + PAGE_SIZE) return (IA64_RR_MASK((vm_offset_t)ia64_gateway_page)); /* Bail out if the virtual address is beyond our limits. */ @@ -2285,12 +2276,12 @@ pmap_switch(pmap_t pm) if (prevpm == pm) goto out; if (pm == NULL) { - for (i = 0; i < 5; i++) { + for (i = 0; i < IA64_VM_MINKERN_REGION; i++) { ia64_set_rr(IA64_RR_BASE(i), (i << 8)|(PAGE_SHIFT << 2)|1); } } else { - for (i = 0; i < 5; i++) { + for (i = 0; i < IA64_VM_MINKERN_REGION; i++) { ia64_set_rr(IA64_RR_BASE(i), (pm->pm_rid[i] << 8)|(PAGE_SHIFT << 2)|1); } Modified: head/sys/ia64/include/pmap.h ============================================================================== --- head/sys/ia64/include/pmap.h Mon Mar 21 01:05:20 2011 (r219807) +++ head/sys/ia64/include/pmap.h Mon Mar 21 01:09:50 2011 (r219808) @@ -50,6 +50,7 @@ #include #include #include +#include #ifdef _KERNEL @@ -75,7 +76,7 @@ struct md_page { struct pmap { struct mtx pm_mtx; TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */ - uint32_t pm_rid[5]; /* base RID for pmap */ + uint32_t pm_rid[IA64_VM_MINKERN_REGION]; struct pmap_statistics pm_stats; /* pmap statistics */ }; Modified: head/sys/ia64/include/vmparam.h ============================================================================== --- head/sys/ia64/include/vmparam.h Mon Mar 21 01:05:20 2011 (r219807) +++ head/sys/ia64/include/vmparam.h Mon Mar 21 01:09:50 2011 (r219808) @@ -42,12 +42,6 @@ #define _MACHINE_VMPARAM_H_ /* - * USRSTACK is the top (end) of the user stack. Immediately above the user - * stack resides the syscall gateway page. - */ -#define USRSTACK VM_MAXUSER_ADDRESS - -/* * Virtual memory related constants, all in bytes */ #ifndef MAXTSIZ @@ -122,6 +116,8 @@ #define VM_NRESERVLEVEL 0 #endif +#define IA64_VM_MINKERN_REGION 4 + /* * Manipulating region bits of an address. */ @@ -138,7 +134,8 @@ * to 0x1ffbffffffffffff. We define the top half of a region in terms of * this worst-case gap. */ -#define IA64_REGION_TOP_HALF 0x1ffc000000000000 +#define IA64_REGION_GAP_START 0x0004000000000000 +#define IA64_REGION_GAP_EXTEND 0x1ffc000000000000 /* * Page size of the identity mappings in region 7. @@ -151,7 +148,6 @@ #define IA64_ID_PAGE_SIZE (1<<(LOG2_ID_PAGE_SIZE)) #define IA64_ID_PAGE_MASK (IA64_ID_PAGE_SIZE-1) -#define IA64_BACKINGSTORE IA64_RR_BASE(4) /* * Parameters for Pre-Boot Virtual Memory (PBVM). @@ -177,9 +173,9 @@ * and wired into the CPU, but does not assume that the mapping covers the * whole of PBVM. */ -#define IA64_PBVM_RR 4 +#define IA64_PBVM_RR IA64_VM_MINKERN_REGION #define IA64_PBVM_BASE \ - (IA64_RR_BASE(IA64_PBVM_RR) + IA64_REGION_TOP_HALF) + (IA64_RR_BASE(IA64_PBVM_RR) + IA64_REGION_GAP_EXTEND) #define IA64_PBVM_PGTBL_MAXSZ 1048576 #define IA64_PBVM_PGTBL \ @@ -194,15 +190,21 @@ */ /* user/kernel map constants */ -#define VM_MIN_ADDRESS 0 -#define VM_MAXUSER_ADDRESS IA64_RR_BASE(5) -#define VM_GATEWAY_SIZE PAGE_SIZE -#define VM_MIN_KERNEL_ADDRESS (VM_MAXUSER_ADDRESS + VM_GATEWAY_SIZE) -#define VM_MAX_KERNEL_ADDRESS (IA64_RR_BASE(6) - 1) +#define VM_MIN_ADDRESS 0 +#define VM_MAXUSER_ADDRESS IA64_RR_BASE(IA64_VM_MINKERN_REGION) +#define VM_MIN_KERNEL_ADDRESS IA64_RR_BASE(IA64_VM_MINKERN_REGION + 1) +#define VM_MAX_KERNEL_ADDRESS (IA64_RR_BASE(IA64_VM_MINKERN_REGION + 2) - 1) #define VM_MAX_ADDRESS ~0UL #define KERNBASE VM_MAXUSER_ADDRESS +/* + * USRSTACK is the top (end) of the user stack. Immediately above the user + * stack resides the syscall gateway page. + */ +#define USRSTACK VM_MAXUSER_ADDRESS +#define IA64_BACKINGSTORE (USRSTACK - (2 * MAXSSIZ) - PAGE_SIZE) + /* virtual sizes (bytes) for various kernel submaps */ #ifndef VM_KMEM_SIZE #define VM_KMEM_SIZE (12 * 1024 * 1024)