svn commit: r205087 - in projects/ppc64/sys/powerpc: aim include
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Fri Mar 12 17:15:45 UTC 2010
Author: nwhitehorn
Date: Fri Mar 12 17:15:44 2010
New Revision: 205087
URL: http://svn.freebsd.org/changeset/base/205087
Log:
Move USER_ADDR into high memory, too. With the exception of possible OF
mappings, all memory below 2^32 is now used for direct mapped quantities
only, paving the way for a large-page direct map in this region, and
removing assumptions about where physical memory happens to have been
mapped.
Modified:
projects/ppc64/sys/powerpc/aim/copyinout.c
projects/ppc64/sys/powerpc/aim/trap.c
projects/ppc64/sys/powerpc/include/sr.h
projects/ppc64/sys/powerpc/include/vmparam.h
Modified: projects/ppc64/sys/powerpc/aim/copyinout.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/copyinout.c Fri Mar 12 16:08:52 2010 (r205086)
+++ projects/ppc64/sys/powerpc/aim/copyinout.c Fri Mar 12 17:15:44 2010 (r205087)
@@ -82,7 +82,7 @@ set_user_sr(pmap_t pm, const void *addr)
{
register_t esid, vsid, slb1, slb2;
- esid = USER_SR;
+ esid = USER_ADDR >> ADDR_SR_SHFT;
PMAP_LOCK(pm);
vsid = va_to_vsid(pm, (vm_offset_t)addr);
PMAP_UNLOCK(pm);
@@ -245,7 +245,7 @@ subyte(void *addr, int byte)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (char *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (char *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -271,7 +271,7 @@ suword32(void *addr, int word)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (int *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (int *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -297,7 +297,7 @@ suword(void *addr, long word)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (long *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -337,8 +337,7 @@ fubyte(const void *addr)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (u_char *)((uintptr_t)USER_ADDR +
- ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (u_char *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -364,7 +363,7 @@ fuword32(const void *addr)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (int32_t *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (int32_t *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -390,7 +389,7 @@ fuword(const void *addr)
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (long *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -423,8 +422,7 @@ casuword32(volatile uint32_t *addr, uint
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (uint32_t *)((uintptr_t)USER_ADDR +
- ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (uint32_t *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
set_user_sr(pm,(const void *)(vm_offset_t)addr);
@@ -469,8 +467,7 @@ casuword(volatile u_long *addr, u_long o
td = PCPU_GET(curthread);
pm = &td->td_proc->p_vmspace->vm_pmap;
- p = (u_long *)((uintptr_t)USER_ADDR +
- ((uintptr_t)addr & ~SEGMENT_MASK));
+ p = (u_long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
set_user_sr(pm,(const void *)(vm_offset_t)addr);
Modified: projects/ppc64/sys/powerpc/aim/trap.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/trap.c Fri Mar 12 16:08:52 2010 (r205086)
+++ projects/ppc64/sys/powerpc/aim/trap.c Fri Mar 12 17:15:44 2010 (r205087)
@@ -560,7 +560,7 @@ trap_pfault(struct trapframe *frame, int
if (user) {
map = &p->p_vmspace->vm_map;
} else {
- if ((eva >> ADDR_SR_SHFT) == USER_SR) {
+ if ((eva >> ADDR_SR_SHFT) == (USER_ADDR >> ADDR_SR_SHFT)) {
if (p->p_vmspace == NULL)
return (SIGSEGV);
Modified: projects/ppc64/sys/powerpc/include/sr.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/sr.h Fri Mar 12 16:08:52 2010 (r205086)
+++ projects/ppc64/sys/powerpc/include/sr.h Fri Mar 12 17:15:44 2010 (r205087)
@@ -50,7 +50,11 @@
#define KERNEL_SEGMENT (0xfffff0 + KERNEL_SR)
#define KERNEL2_SEGMENT (0xfffff0 + KERNEL2_SR)
#define EMPTY_SEGMENT 0xfffff0
-#define USER_ADDR ((void *)((register_t)USER_SR << ADDR_SR_SHFT))
+#ifdef __powerpc64__
+#define USER_ADDR 0xcffffffff0000000UL
+#else
+#define USER_ADDR ((uintptr_t)USER_SR << ADDR_SR_SHFT)
+#endif
#define SEGMENT_LENGTH 0x10000000UL
#define SEGMENT_INVMASK 0x0fffffffUL
#define SEGMENT_MASK ~SEGMENT_INVMASK
Modified: projects/ppc64/sys/powerpc/include/vmparam.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/vmparam.h Fri Mar 12 16:08:52 2010 (r205086)
+++ projects/ppc64/sys/powerpc/include/vmparam.h Fri Mar 12 17:15:44 2010 (r205087)
@@ -100,7 +100,7 @@
#ifdef __powerpc64__
#define VM_MIN_KERNEL_ADDRESS 0xc000000000000000UL
-#define VM_MAX_KERNEL_ADDRESS 0xcfffffffffffffffUL
+#define VM_MAX_KERNEL_ADDRESS 0xcfffffffefffffffUL
#define VM_MAX_SAFE_KERNEL_ADDRESS VM_MAX_KERNEL_ADDRESS
#else
#define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)KERNEL_SR << ADDR_SR_SHFT)
More information about the svn-src-projects
mailing list