Author: nwhitehorn
Date: Tue Jul 13 05:32:19 2010
New Revision: 209975
URL: http://svn.freebsd.org/changeset/base/209975

Log:
  MFppc64:
  
  Kernel sources for 64-bit PowerPC, along with build-system changes to keep
  32-bit kernels compiling (build system changes for 64-bit kernels are
  coming later). Existing 32-bit PowerPC kernel configurations must be
  updated after this change to specify their architecture.

Added:
  head/sys/powerpc/aim/locore32.S
     - copied, changed from r209910, head/sys/powerpc/aim/locore.S
  head/sys/powerpc/aim/locore64.S
     - copied, changed from r209910, head/sys/powerpc/aim/locore.S
  head/sys/powerpc/aim/slb.c   (contents, props changed)
  head/sys/powerpc/aim/swtch32.S
     - copied, changed from r209910, head/sys/powerpc/aim/swtch.S
  head/sys/powerpc/aim/swtch64.S
     - copied, changed from r209910, head/sys/powerpc/aim/swtch.S
  head/sys/powerpc/aim/trap_subr32.S
     - copied, changed from r209910, head/sys/powerpc/aim/trap_subr.S
  head/sys/powerpc/aim/trap_subr64.S
     - copied, changed from r209910, head/sys/powerpc/aim/trap_subr.S
  head/sys/powerpc/include/slb.h   (contents, props changed)
  head/sys/powerpc/powerpc/elf32_machdep.c
     - copied, changed from r209910, head/sys/powerpc/powerpc/elf_machdep.c
  head/sys/powerpc/powerpc/elf64_machdep.c
     - copied, changed from r209910, head/sys/powerpc/powerpc/elf_machdep.c
  head/sys/powerpc/powerpc/sigcode32.S
     - copied, changed from r209910, head/sys/powerpc/powerpc/sigcode.S
  head/sys/powerpc/powerpc/sigcode64.S
     - copied, changed from r209910, head/sys/powerpc/powerpc/sigcode.S
Deleted:
  head/sys/powerpc/aim/swtch.S
  head/sys/powerpc/powerpc/elf_machdep.c
  head/sys/powerpc/powerpc/sigcode.S
Modified:
  head/UPDATING
  head/sys/conf/Makefile.powerpc
  head/sys/conf/files.powerpc
  head/sys/conf/options.powerpc
  head/sys/powerpc/aim/copyinout.c
  head/sys/powerpc/aim/locore.S
  head/sys/powerpc/aim/machdep.c
  head/sys/powerpc/aim/mmu_oea.c
  head/sys/powerpc/aim/mmu_oea64.c
  head/sys/powerpc/aim/mp_cpudep.c
  head/sys/powerpc/aim/ofw_machdep.c
  head/sys/powerpc/aim/trap.c
  head/sys/powerpc/aim/vm_machdep.c
  head/sys/powerpc/booke/locore.S
  head/sys/powerpc/booke/machdep.c
  head/sys/powerpc/booke/swtch.S
  head/sys/powerpc/booke/vm_machdep.c
  head/sys/powerpc/conf/DEFAULTS
  head/sys/powerpc/conf/GENERIC
  head/sys/powerpc/conf/MPC85XX
  head/sys/powerpc/conf/NOTES
  head/sys/powerpc/cpufreq/pcr.c
  head/sys/powerpc/include/_align.h
  head/sys/powerpc/include/_bus.h
  head/sys/powerpc/include/_inttypes.h
  head/sys/powerpc/include/_limits.h
  head/sys/powerpc/include/_stdint.h
  head/sys/powerpc/include/_types.h
  head/sys/powerpc/include/asm.h
  head/sys/powerpc/include/atomic.h
  head/sys/powerpc/include/bus.h
  head/sys/powerpc/include/cpufunc.h
  head/sys/powerpc/include/db_machdep.h
  head/sys/powerpc/include/frame.h
  head/sys/powerpc/include/hid.h
  head/sys/powerpc/include/md_var.h
  head/sys/powerpc/include/param.h
  head/sys/powerpc/include/pcb.h
  head/sys/powerpc/include/pcpu.h
  head/sys/powerpc/include/pmap.h
  head/sys/powerpc/include/proc.h
  head/sys/powerpc/include/profile.h
  head/sys/powerpc/include/psl.h
  head/sys/powerpc/include/pte.h
  head/sys/powerpc/include/reg.h
  head/sys/powerpc/include/runq.h
  head/sys/powerpc/include/smp.h
  head/sys/powerpc/include/spr.h
  head/sys/powerpc/include/sr.h
  head/sys/powerpc/include/trap_aim.h
  head/sys/powerpc/include/ucontext.h
  head/sys/powerpc/include/vmparam.h
  head/sys/powerpc/powerpc/cpu.c
  head/sys/powerpc/powerpc/db_interface.c
  head/sys/powerpc/powerpc/db_trace.c
  head/sys/powerpc/powerpc/exec_machdep.c
  head/sys/powerpc/powerpc/genassym.c
  head/sys/powerpc/powerpc/in_cksum.c
  head/sys/powerpc/powerpc/mp_machdep.c
  head/sys/powerpc/powerpc/setjmp.S
  head/sys/powerpc/powerpc/stack_machdep.c
  head/sys/powerpc/powerpc/syncicache.c
  head/sys/powerpc/powerpc/sys_machdep.c

Modified: head/UPDATING
==============================================================================
--- head/UPDATING       Tue Jul 13 05:12:14 2010        (r209974)
+++ head/UPDATING       Tue Jul 13 05:32:19 2010        (r209975)
@@ -24,6 +24,14 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.
 
 
 20100713:
+       Due to the import of powerpc64 support, all existing powerpc kernel
+       configuration files must be updated with a machine directive like this:
+           machine powerpc powerpc
+
+       In addition, an updated config(8) is required to build powerpc kernels
+       after this change.
+
+20100713:
        A new version of ZFS (version 15) has been merged to -HEAD.
        This version uses a python library for the following subcommands:
        zfs allow, zfs unallow, zfs groupspace, zfs userspace.

Modified: head/sys/conf/Makefile.powerpc
==============================================================================
--- head/sys/conf/Makefile.powerpc      Tue Jul 13 05:12:14 2010        
(r209974)
+++ head/sys/conf/Makefile.powerpc      Tue Jul 13 05:32:19 2010        
(r209975)
@@ -17,7 +17,7 @@
 #
 
 # Which version of config(8) is required.
-%VERSREQ=      600004
+%VERSREQ=      600010
 
 STD8X16FONT?=  iso
 
@@ -28,6 +28,9 @@ S=    ./@
 S=     ../../..
 .endif
 .endif
+
+LDSCRIPT_NAME?= ldscript.${MACHINE_ARCH}
+
 .include "$S/conf/kern.pre.mk"
 
 INCLUDES+= -I$S/contrib/libfdt

Modified: head/sys/conf/files.powerpc
==============================================================================
--- head/sys/conf/files.powerpc Tue Jul 13 05:12:14 2010        (r209974)
+++ head/sys/conf/files.powerpc Tue Jul 13 05:32:19 2010        (r209975)
@@ -36,7 +36,7 @@ dev/ofw/ofw_console.c         optional        aim
 dev/ofw/ofw_disk.c             optional        ofwd aim
 dev/ofw/ofw_fdt.c              optional        fdt
 dev/ofw/ofw_iicbus.c           optional        iicbus aim
-dev/ofw/ofw_standard.c         optional        aim
+dev/ofw/ofw_standard.c         optional        aim powerpc
 dev/powermac_nvram/powermac_nvram.c optional   powermac_nvram powermac
 dev/quicc/quicc_bfe_fdt.c      optional        quicc mpc85xx
 dev/scc/scc_bfe_macio.c                optional        scc powermac
@@ -53,37 +53,39 @@ dev/tsec/if_tsec.c          optional        tsec
 dev/tsec/if_tsec_fdt.c         optional        tsec fdt
 dev/uart/uart_cpu_powerpc.c    optional        uart aim
 kern/syscalls.c                        optional        ktr
-libkern/ashldi3.c              standard
-libkern/ashrdi3.c              standard
+libkern/ashldi3.c              optional        powerpc
+libkern/ashrdi3.c              optional        powerpc
 libkern/bcmp.c                 standard
-libkern/cmpdi2.c               standard
-libkern/divdi3.c               standard
+libkern/cmpdi2.c               optional        powerpc
+libkern/divdi3.c               optional        powerpc
 libkern/ffs.c                  standard
 libkern/ffsl.c                 standard
 libkern/fls.c                  standard
 libkern/flsl.c                 standard
-libkern/lshrdi3.c              standard
+libkern/lshrdi3.c              optional        powerpc
 libkern/memchr.c               optional        fdt
 libkern/memmove.c              standard
 libkern/memset.c               standard
-libkern/moddi3.c               standard
-libkern/qdivrem.c              standard
-libkern/ucmpdi2.c              standard
-libkern/udivdi3.c              standard
-libkern/umoddi3.c              standard
+libkern/moddi3.c               optional        powerpc
+libkern/qdivrem.c              optional        powerpc
+libkern/ucmpdi2.c              optional        powerpc
+libkern/udivdi3.c              optional        powerpc
+libkern/umoddi3.c              optional        powerpc
 powerpc/aim/clock.c            optional        aim
 powerpc/aim/copyinout.c                optional        aim
 powerpc/aim/interrupt.c                optional        aim
 powerpc/aim/locore.S           optional        aim no-obj
 powerpc/aim/machdep.c          optional        aim
-powerpc/aim/mmu_oea.c          optional        aim
+powerpc/aim/mmu_oea.c          optional        aim powerpc
 powerpc/aim/mmu_oea64.c                optional        aim
 powerpc/aim/mp_cpudep.c                optional        aim smp
 powerpc/aim/nexus.c            optional        aim
 powerpc/aim/ofw_machdep.c      optional        aim
 powerpc/aim/ofwmagic.S         optional        aim
 powerpc/aim/platform_chrp.c    optional        aim
-powerpc/aim/swtch.S            optional        aim
+powerpc/aim/slb.c              optional        aim powerpc64
+powerpc/aim/swtch32.S          optional        aim powerpc
+powerpc/aim/swtch64.S          optional        aim powerpc64
 powerpc/aim/trap.c             optional        aim
 powerpc/aim/uma_machdep.c      optional        aim
 powerpc/aim/vm_machdep.c       optional        aim
@@ -156,7 +158,8 @@ powerpc/powerpc/db_hwwatch.c        optional        dd
 powerpc/powerpc/db_interface.c optional        ddb
 powerpc/powerpc/db_trace.c     optional        ddb
 powerpc/powerpc/dump_machdep.c standard
-powerpc/powerpc/elf_machdep.c  standard
+powerpc/powerpc/elf32_machdep.c        optional        powerpc | 
compat_freebsd32
+powerpc/powerpc/elf64_machdep.c        optional        powerpc64
 powerpc/powerpc/exec_machdep.c standard
 powerpc/powerpc/fpu.c          optional        aim
 powerpc/powerpc/fuswintr.c     standard
@@ -173,7 +176,8 @@ powerpc/powerpc/platform.c  standard
 powerpc/powerpc/platform_if.m  standard
 powerpc/powerpc/sc_machdep.c   optional        sc
 powerpc/powerpc/setjmp.S       standard
-powerpc/powerpc/sigcode.S      standard
+powerpc/powerpc/sigcode32.S    optional        powerpc | compat_freebsd32
+powerpc/powerpc/sigcode64.S    optional        powerpc64
 powerpc/powerpc/stack_machdep.c        optional        ddb | stack
 powerpc/powerpc/suswintr.c     standard
 powerpc/powerpc/syncicache.c   standard
@@ -183,3 +187,10 @@ powerpc/psim/iobus.c               optional        psim
 powerpc/psim/ata_iobus.c       optional        ata psim
 powerpc/psim/openpic_iobus.c   optional        psim
 powerpc/psim/uart_iobus.c      optional        uart psim
+
+compat/freebsd32/freebsd32_ioctl.c     optional        compat_freebsd32
+compat/freebsd32/freebsd32_misc.c      optional        compat_freebsd32
+compat/freebsd32/freebsd32_syscalls.c  optional        compat_freebsd32
+compat/freebsd32/freebsd32_sysent.c    optional        compat_freebsd32
+kern/imgact_elf32.c                    optional        compat_freebsd32
+

Modified: head/sys/conf/options.powerpc
==============================================================================
--- head/sys/conf/options.powerpc       Tue Jul 13 05:12:14 2010        
(r209974)
+++ head/sys/conf/options.powerpc       Tue Jul 13 05:32:19 2010        
(r209975)
@@ -4,8 +4,13 @@
 AIM                    opt_global.h
 E500                   opt_global.h
 
+POWERPC
+POWERPC64
+
 FPU_EMU
 
+COMPAT_FREEBSD32       opt_compat.h
+
 GFB_DEBUG              opt_gfb.h
 GFB_NO_FONT_LOADING    opt_gfb.h
 GFB_NO_MODE_CHANGE     opt_gfb.h

Modified: head/sys/powerpc/aim/copyinout.c
==============================================================================
--- head/sys/powerpc/aim/copyinout.c    Tue Jul 13 05:12:14 2010        
(r209974)
+++ head/sys/powerpc/aim/copyinout.c    Tue Jul 13 05:32:19 2010        
(r209975)
@@ -57,6 +57,8 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
 
@@ -66,20 +68,45 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/pcb.h>
 #include <machine/sr.h>
+#include <machine/slb.h>
 
 int    setfault(faultbuf);     /* defined in locore.S */
 
 /*
  * Makes sure that the right segment of userspace is mapped in.
  */
+
+#ifdef __powerpc64__
+static __inline void
+set_user_sr(pmap_t pm, const void *addr)
+{
+       register_t esid, vsid, slb1, slb2;
+
+       esid = USER_ADDR >> ADDR_SR_SHFT;
+       PMAP_LOCK(pm);
+       vsid = va_to_vsid(pm, (vm_offset_t)addr);
+       PMAP_UNLOCK(pm);
+
+       slb1 = vsid << SLBV_VSID_SHIFT;
+       slb2 = (esid << SLBE_ESID_SHIFT) | SLBE_VALID | USER_SR;
+
+       __asm __volatile ("slbie %0; slbmte %1, %2" :: "r"(esid << 28),
+           "r"(slb1), "r"(slb2));
+       isync();
+}
+#else
 static __inline void
-set_user_sr(register_t vsid)
+set_user_sr(pmap_t pm, const void *addr)
 {
+       register_t vsid;
+
+       vsid = va_to_vsid(pm, (vm_offset_t)addr);
 
        isync();
        __asm __volatile ("mtsr %0,%1" :: "n"(USER_SR), "r"(vsid));
        isync();
 }
+#endif
 
 int
 copyout(const void *kaddr, void *udaddr, size_t len)
@@ -103,13 +130,13 @@ copyout(const void *kaddr, void *udaddr,
        up = udaddr;
 
        while (len > 0) {
-               p = (char *)USER_ADDR + ((u_int)up & ~SEGMENT_MASK);
+               p = (char *)USER_ADDR + ((uintptr_t)up & ~SEGMENT_MASK);
 
                l = ((char *)USER_ADDR + SEGMENT_LENGTH) - p;
                if (l > len)
                        l = len;
 
-               set_user_sr(pm->pm_sr[(u_int)up >> ADDR_SR_SHFT]);
+               set_user_sr(pm,up);
 
                bcopy(kp, p, l);
 
@@ -144,13 +171,13 @@ copyin(const void *udaddr, void *kaddr, 
        up = udaddr;
 
        while (len > 0) {
-               p = (char *)USER_ADDR + ((u_int)up & ~SEGMENT_MASK);
+               p = (char *)USER_ADDR + ((uintptr_t)up & ~SEGMENT_MASK);
 
                l = ((char *)USER_ADDR + SEGMENT_LENGTH) - p;
                if (l > len)
                        l = len;
 
-               set_user_sr(pm->pm_sr[(u_int)up >> ADDR_SR_SHFT]);
+               set_user_sr(pm,up);
 
                bcopy(p, kp, l);
 
@@ -218,14 +245,14 @@ subyte(void *addr, int byte)
 
        td = PCPU_GET(curthread);
        pm = &td->td_proc->p_vmspace->vm_pmap;
-       p = (char *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+       p = (char *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
 
        if (setfault(env)) {
                td->td_pcb->pcb_onfault = NULL;
                return (-1);
        }
 
-       set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+       set_user_sr(pm,addr);
 
        *p = (char)byte;
 
@@ -233,6 +260,33 @@ subyte(void *addr, int byte)
        return (0);
 }
 
+#ifdef __powerpc64__
+int
+suword32(void *addr, int word)
+{
+       struct          thread *td;
+       pmap_t          pm;
+       faultbuf        env;
+       int             *p;
+
+       td = PCPU_GET(curthread);
+       pm = &td->td_proc->p_vmspace->vm_pmap;
+       p = (int *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+
+       if (setfault(env)) {
+               td->td_pcb->pcb_onfault = NULL;
+               return (-1);
+       }
+
+       set_user_sr(pm,addr);
+
+       *p = word;
+
+       td->td_pcb->pcb_onfault = NULL;
+       return (0);
+}
+#endif
+
 int
 suword(void *addr, long word)
 {
@@ -243,14 +297,14 @@ suword(void *addr, long word)
 
        td = PCPU_GET(curthread);
        pm = &td->td_proc->p_vmspace->vm_pmap;
-       p = (long *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+       p = (long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
 
        if (setfault(env)) {
                td->td_pcb->pcb_onfault = NULL;
                return (-1);
        }
 
-       set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+       set_user_sr(pm,addr);
 
        *p = word;
 
@@ -258,12 +312,19 @@ suword(void *addr, long word)
        return (0);
 }
 
+#ifdef __powerpc64__
+int
+suword64(void *addr, int64_t word)
+{
+       return (suword(addr, (long)word));
+}
+#else
 int
 suword32(void *addr, int32_t word)
 {
        return (suword(addr, (long)word));
 }
-
+#endif
 
 int
 fubyte(const void *addr)
@@ -276,20 +337,47 @@ fubyte(const void *addr)
 
        td = PCPU_GET(curthread);
        pm = &td->td_proc->p_vmspace->vm_pmap;
-       p = (u_char *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+       p = (u_char *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+
+       if (setfault(env)) {
+               td->td_pcb->pcb_onfault = NULL;
+               return (-1);
+       }
+
+       set_user_sr(pm,addr);
+
+       val = *p;
+
+       td->td_pcb->pcb_onfault = NULL;
+       return (val);
+}
+
+#ifdef __powerpc64__
+int32_t
+fuword32(const void *addr)
+{
+       struct          thread *td;
+       pmap_t          pm;
+       faultbuf        env;
+       int32_t         *p, val;
+
+       td = PCPU_GET(curthread);
+       pm = &td->td_proc->p_vmspace->vm_pmap;
+       p = (int32_t *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
 
        if (setfault(env)) {
                td->td_pcb->pcb_onfault = NULL;
                return (-1);
        }
 
-       set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+       set_user_sr(pm,addr);
 
        val = *p;
 
        td->td_pcb->pcb_onfault = NULL;
        return (val);
 }
+#endif
 
 long
 fuword(const void *addr)
@@ -301,14 +389,14 @@ fuword(const void *addr)
 
        td = PCPU_GET(curthread);
        pm = &td->td_proc->p_vmspace->vm_pmap;
-       p = (long *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+       p = (long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
 
        if (setfault(env)) {
                td->td_pcb->pcb_onfault = NULL;
                return (-1);
        }
 
-       set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+       set_user_sr(pm,addr);
 
        val = *p;
 
@@ -316,18 +404,59 @@ fuword(const void *addr)
        return (val);
 }
 
+#ifndef __powerpc64__
 int32_t
 fuword32(const void *addr)
 {
        return ((int32_t)fuword(addr));
 }
+#endif
 
 uint32_t
-casuword32(volatile uint32_t *base, uint32_t oldval, uint32_t newval)
+casuword32(volatile uint32_t *addr, uint32_t old, uint32_t new)
 {
-       return (casuword((volatile u_long *)base, oldval, newval));
+       struct thread *td;
+       pmap_t pm;
+       faultbuf env;
+       uint32_t *p, val;
+
+       td = PCPU_GET(curthread);
+       pm = &td->td_proc->p_vmspace->vm_pmap;
+       p = (uint32_t *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
+
+       set_user_sr(pm,(const void *)(vm_offset_t)addr);
+
+       if (setfault(env)) {
+               td->td_pcb->pcb_onfault = NULL;
+               return (-1);
+       }
+
+       __asm __volatile (
+               "1:\tlwarx %0, 0, %2\n\t"       /* load old value */
+               "cmplw %3, %0\n\t"              /* compare */
+               "bne 2f\n\t"                    /* exit if not equal */
+               "stwcx. %4, 0, %2\n\t"          /* attempt to store */
+               "bne- 1b\n\t"                   /* spin if failed */
+               "b 3f\n\t"                      /* we've succeeded */
+               "2:\n\t"
+               "stwcx. %0, 0, %2\n\t"          /* clear reservation (74xx) */
+               "3:\n\t"
+               : "=&r" (val), "=m" (*p)
+               : "r" (p), "r" (old), "r" (new), "m" (*p)
+               : "cc", "memory");
+
+       td->td_pcb->pcb_onfault = NULL;
+
+       return (val);
 }
 
+#ifndef __powerpc64__
+u_long
+casuword(volatile u_long *addr, u_long old, u_long new)
+{
+       return (casuword32((volatile uint32_t *)addr, old, new));
+}
+#else
 u_long
 casuword(volatile u_long *addr, u_long old, u_long new)
 {
@@ -338,9 +467,9 @@ casuword(volatile u_long *addr, u_long o
 
        td = PCPU_GET(curthread);
        pm = &td->td_proc->p_vmspace->vm_pmap;
-       p = (u_long *)((u_int)USER_ADDR + ((u_int)addr & ~SEGMENT_MASK));
+       p = (u_long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
 
-       set_user_sr(pm->pm_sr[(u_int)addr >> ADDR_SR_SHFT]);
+       set_user_sr(pm,(const void *)(vm_offset_t)addr);
 
        if (setfault(env)) {
                td->td_pcb->pcb_onfault = NULL;
@@ -348,14 +477,14 @@ casuword(volatile u_long *addr, u_long o
        }
 
        __asm __volatile (
-               "1:\tlwarx %0, 0, %2\n\t"       /* load old value */
-               "cmplw %3, %0\n\t"              /* compare */
+               "1:\tldarx %0, 0, %2\n\t"       /* load old value */
+               "cmpld %3, %0\n\t"              /* compare */
                "bne 2f\n\t"                    /* exit if not equal */
-               "stwcx. %4, 0, %2\n\t"          /* attempt to store */
+               "stdcx. %4, 0, %2\n\t"          /* attempt to store */
                "bne- 1b\n\t"                   /* spin if failed */
                "b 3f\n\t"                      /* we've succeeded */
                "2:\n\t"
-               "stwcx. %0, 0, %2\n\t"          /* clear reservation (74xx) */
+               "stdcx. %0, 0, %2\n\t"          /* clear reservation (74xx) */
                "3:\n\t"
                : "=&r" (val), "=m" (*p)
                : "r" (p), "r" (old), "r" (new), "m" (*p)
@@ -365,3 +494,5 @@ casuword(volatile u_long *addr, u_long o
 
        return (val);
 }
+#endif
+

Modified: head/sys/powerpc/aim/locore.S
==============================================================================
--- head/sys/powerpc/aim/locore.S       Tue Jul 13 05:12:14 2010        
(r209974)
+++ head/sys/powerpc/aim/locore.S       Tue Jul 13 05:32:19 2010        
(r209975)
@@ -1,209 +1,8 @@
 /* $FreeBSD$ */
-/* $NetBSD: locore.S,v 1.24 2000/05/31 05:09:17 thorpej Exp $ */
 
-/*-
- * Copyright (C) 2001 Benno Rice
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/*-
- * Copyright (C) 1995, 1996 Wolfgang Solfrank.
- * Copyright (C) 1995, 1996 TooLs GmbH.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by TooLs GmbH.
- * 4. The name of TooLs GmbH may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
+#ifdef __powerpc64__
+#include <powerpc/aim/locore64.S>
+#else
+#include <powerpc/aim/locore32.S>
+#endif
 
-#include "assym.s"
-
-#include <sys/syscall.h>
-
-#include <machine/trap.h>
-#include <machine/param.h>
-#include <machine/sr.h>
-#include <machine/spr.h>
-#include <machine/psl.h>
-#include <machine/asm.h>
-
-/* Locate the per-CPU data structure */
-#define GET_CPUINFO(r)  \
-        mfsprg0  r
-
-/*
- * Compiled KERNBASE location and the kernel load address
- */
-        .globl  kernbase
-        .set    kernbase, KERNBASE
-
-#define        TMPSTKSZ        8192            /* 8K temporary stack */
-
-/*
- * Globals
- */
-       .data
-       .align  4
-GLOBAL(tmpstk)
-       .space  TMPSTKSZ
-GLOBAL(esym)
-       .long   0                       /* end of symbol table */
-
-GLOBAL(ofmsr)
-       .long   0, 0, 0, 0, 0           /* msr/sprg0-3 used in Open Firmware */
-
-#define        INTRCNT_COUNT   256             /* 
max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */
-GLOBAL(intrnames)
-       .space  INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-GLOBAL(eintrnames)
-       .align 4
-GLOBAL(intrcnt)
-       .space  INTRCNT_COUNT * 4 * 2
-GLOBAL(eintrcnt)
-
-/*
- * File-scope for locore.S
- */
-idle_u:
-       .long   0                       /* fake uarea during idle after exit */
-openfirmware_entry:
-       .long   0                       /* Open Firmware entry point */
-srsave:
-       .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-       .text
-       .globl  btext
-btext:
-
-/*
- * This symbol is here for the benefit of kvm_mkdb, and is supposed to
- * mark the start of kernel text.
- */
-       .globl  kernel_text
-kernel_text:
-
-/*
- * Startup entry.  Note, this must be the first thing in the text
- * segment!
- */
-       .text
-       .globl  __start
-__start:
-       li      8,0
-       li      9,0x100
-       mtctr   9
-1:
-       dcbf    0,8
-       icbi    0,8
-       addi    8,8,0x20
-       bdnz    1b
-       sync
-       isync
-
-       /* Save the argument pointer and length */
-       mr      20,6
-       mr      21,7
-
-       lis     8,openfirmware_en...@ha
-       stw     5,openfirmware_en...@l(8) /* save client interface handler */
-
-       lis     1,(tmpstk+TMPSTKSZ-16)@ha
-       addi    1,1,(tmpstk+TMPSTKSZ-16)@l
-
-       mfmsr   0
-       lis     9,of...@ha
-       stwu    0,of...@l(9)
-
-       mfsprg0 0                       /* save SPRG0-3 */
-       stw     0,4(9)                  /* ofmsr[1] = sprg0 */
-       mfsprg1 0
-       stw     0,8(9)                  /* ofmsr[2] = sprg1 */
-       mfsprg2 0
-       stw     0,12(9)                 /* ofmsr[3] = sprg2 */
-       mfsprg3 0
-       stw     0,16(9)                 /* ofmsr[4] = sprg3 */
-       
-       bl      OF_initial_setup
-
-       lis     4,e...@ha
-       addi    4,4,e...@l
-       mr      5,4
-
-       lis     3,kernel_t...@ha
-       addi    3,3,kernel_t...@l
-
-       /* Restore the argument pointer and length */
-       mr      6,20
-       mr      7,21
-
-       bl      powerpc_init
-       mr      %r1, %r3
-       li      %r3, 0
-       stw     %r3, 0(%r1)
-       bl      mi_startup
-       b       OF_exit
-
-/*
- * int setfault()
- *
- * Similar to setjmp to setup for handling faults on accesses to user memory.
- * Any routine using this may only call bcopy, either the form below,
- * or the (currently used) C code optimized, so it doesn't use any non-volatile
- * registers.
- */
-       .globl  setfault
-setfault:
-       mflr    0
-       mfcr    12
-       mfsprg  4,0
-       lwz     4,PC_CURTHREAD(4)
-       lwz     4,TD_PCB(4)
-       stw     3,PCB_ONFAULT(4)
-       stw     0,0(3)
-       stw     1,4(3)
-       stw     2,8(3)
-       stmw    12,12(3)
-       xor     3,3,3
-       blr
-
-#include <powerpc/aim/trap_subr.S>

Copied and modified: head/sys/powerpc/aim/locore32.S (from r209910, 
head/sys/powerpc/aim/locore.S)
==============================================================================
--- head/sys/powerpc/aim/locore.S       Sun Jul 11 21:12:42 2010        
(r209910, copy source)
+++ head/sys/powerpc/aim/locore32.S     Tue Jul 13 05:32:19 2010        
(r209975)
@@ -62,9 +62,7 @@
 
 #include <machine/trap.h>
 #include <machine/param.h>
-#include <machine/sr.h>
 #include <machine/spr.h>
-#include <machine/psl.h>
 #include <machine/asm.h>
 
 /* Locate the per-CPU data structure */
@@ -206,4 +204,4 @@ setfault:
        xor     3,3,3
        blr
 
-#include <powerpc/aim/trap_subr.S>
+#include <powerpc/aim/trap_subr32.S>

Copied and modified: head/sys/powerpc/aim/locore64.S (from r209910, 
head/sys/powerpc/aim/locore.S)
==============================================================================
--- head/sys/powerpc/aim/locore.S       Sun Jul 11 21:12:42 2010        
(r209910, copy source)
+++ head/sys/powerpc/aim/locore64.S     Tue Jul 13 05:32:19 2010        
(r209975)
@@ -62,9 +62,7 @@
 
 #include <machine/trap.h>
 #include <machine/param.h>
-#include <machine/sr.h>
 #include <machine/spr.h>
-#include <machine/psl.h>
 #include <machine/asm.h>
 
 /* Locate the per-CPU data structure */
@@ -78,6 +76,7 @@
         .set    kernbase, KERNBASE
 
 #define        TMPSTKSZ        8192            /* 8K temporary stack */
+#define        OFWSTKSZ        4096            /* 4K Open Firmware stack */
 
 /*
  * Globals
@@ -86,11 +85,13 @@
        .align  4
 GLOBAL(tmpstk)
        .space  TMPSTKSZ
+GLOBAL(ofwstk)
+       .space  OFWSTKSZ
 GLOBAL(esym)
-       .long   0                       /* end of symbol table */
+       .llong  0                       /* end of symbol table */
 
 GLOBAL(ofmsr)
-       .long   0, 0, 0, 0, 0           /* msr/sprg0-3 used in Open Firmware */
+       .llong  0, 0, 0, 0, 0           /* msr/sprg0-3 used in Open Firmware */
 
 #define        INTRCNT_COUNT   256             /* 
max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */
 GLOBAL(intrnames)
@@ -105,11 +106,11 @@ GLOBAL(eintrcnt)
  * File-scope for locore.S
  */
 idle_u:
-       .long   0                       /* fake uarea during idle after exit */
+       .llong  0                       /* fake uarea during idle after exit */
 openfirmware_entry:
-       .long   0                       /* Open Firmware entry point */
+       .llong  0                       /* Open Firmware entry point */
 srsave:
-       .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+       .llong  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 
        .text
        .globl  btext
@@ -127,8 +128,7 @@ kernel_text:
  * segment!
  */
        .text
-       .globl  __start
-__start:
+ASENTRY(__start)
        li      8,0
        li      9,0x100
        mtctr   9
@@ -145,43 +145,183 @@ __start:
        mr      21,7
 
        lis     8,openfirmware_en...@ha
-       stw     5,openfirmware_en...@l(8) /* save client interface handler */
+       std     5,openfirmware_en...@l(8) /* save client interface handler */
 
-       lis     1,(tmpstk+TMPSTKSZ-16)@ha
-       addi    1,1,(tmpstk+TMPSTKSZ-16)@l
+       /* Set up the stack pointer */
+       lis     1,(tmpstk+TMPSTKSZ-48)@ha
+       addi    1,1,(tmpstk+TMPSTKSZ-48)@l
+
+       /* Set up the TOC pointer */
+       lis     2,tocb...@ha
+       ld      2,tocb...@l(2)
 
        mfmsr   0
        lis     9,of...@ha
-       stwu    0,of...@l(9)
+       stdu    0,of...@l(9)
 
        mfsprg0 0                       /* save SPRG0-3 */
-       stw     0,4(9)                  /* ofmsr[1] = sprg0 */
+       std     0,8(9)                  /* ofmsr[1] = sprg0 */
        mfsprg1 0
-       stw     0,8(9)                  /* ofmsr[2] = sprg1 */
+       std     0,16(9)                 /* ofmsr[2] = sprg1 */
        mfsprg2 0
-       stw     0,12(9)                 /* ofmsr[3] = sprg2 */
+       std     0,24(9)                 /* ofmsr[3] = sprg2 */
        mfsprg3 0
-       stw     0,16(9)                 /* ofmsr[4] = sprg3 */
+       std     0,32(9)                 /* ofmsr[4] = sprg3 */
+
+       /* Switch to 64-bit mode */
+       mfmsr   9
+       li      8,1
+       insrdi  9,8,1,0
+       mtmsrd  9
        
-       bl      OF_initial_setup
+       bl      .OF_initial_setup
+       nop
 
        lis     4,e...@ha
        addi    4,4,e...@l
        mr      5,4
 
-       lis     3,kernel_t...@ha
-       addi    3,3,kernel_t...@l
+       lis     3,kernb...@ha
+       addi    3,3,kernb...@l
 
        /* Restore the argument pointer and length */
        mr      6,20
        mr      7,21
 
-       bl      powerpc_init
+       bl      .powerpc_init
+       nop
        mr      %r1, %r3
        li      %r3, 0
-       stw     %r3, 0(%r1)
-       bl      mi_startup
-       b       OF_exit
+       std     %r3, 0(%r1)
+       bl      .mi_startup
+       nop
+       b       .OF_exit
+       nop
+
+/*
+ * PPC64 ABI TOC base
+ */
+
+        .align  3
+       .globl  tocbase
+tocbase:
+        .llong  .t...@tocbase
+
+/*
+ * Open Firmware Real-mode Entry Point. This is a huge pain.
+ */
+
+ASENTRY(ofw_32bit_mode_entry)
+       mflr    %r0
+       std     %r0,16(%r1)
+       stdu    %r1,-208(%r1)
+
+       /*
+        * We need to save the following, because OF's register save/
+        * restore code assumes that the contents of registers are
+        * at most 32 bits wide: lr, cr, r2, r13-r31, the old MSR. These
+        * get placed in that order in the stack.
+        */
+
+       mfcr    %r4
+       std     %r4,48(%r1)
+       std     %r13,56(%r1)
+       std     %r14,64(%r1)
+       std     %r15,72(%r1)
+       std     %r16,80(%r1)
+       std     %r17,88(%r1)
+       std     %r18,96(%r1)
+       std     %r19,104(%r1)
+       std     %r20,112(%r1)
+       std     %r21,120(%r1)
+       std     %r22,128(%r1)
+       std     %r23,136(%r1)
+       std     %r24,144(%r1)
+       std     %r25,152(%r1)
+       std     %r26,160(%r1)
+       std     %r27,168(%r1)
+       std     %r28,176(%r1)
+       std     %r29,184(%r1)
+       std     %r30,192(%r1)
+       std     %r31,200(%r1)
+
+       /* Record the old MSR */
+       mfmsr   %r6
+
+       /* read client interface handler */
+       lis     %r4,openfirmware_en...@ha
+       ld      %r4,openfirmware_en...@l(%r4)
+
+       /*
+        * Set the MSR to the OF value. This has the side effect of disabling
+        * exceptions, which is important for the next few steps.
+        */
+
+       lis     %r5,of...@ha
+       ld      %r5,of...@l(%r5)
+       mtmsrd  %r5
+       isync
+
+       /*
+        * Set up OF stack. This needs to be accessible in real mode and
+        * use the 32-bit ABI stack frame format. The pointer to the current
+        * kernel stack is placed at the very top of the stack along with
+        * the old MSR so we can get them back later.
+        */
+       mr      %r5,%r1
+       lis     %r1,(ofwstk+OFWSTKSZ-32)@ha
+       addi    %r1,%r1,(ofwstk+OFWSTKSZ-32)@l
+       std     %r5,8(%r1)      /* Save real stack pointer */
+       std     %r2,16(%r1)     /* Save old TOC */
+       std     %r6,24(%r1)     /* Save old MSR */
+       li      %r5,0
+       stw     %r5,4(%r1)
+       stw     %r5,0(%r1)
+
+       /* Finally, branch to OF */
+       mtctr   %r4
+       bctrl
+
+       /* Reload stack pointer and MSR from the OFW stack */
+       ld      %r6,24(%r1)
+       ld      %r2,16(%r1)
+       ld      %r1,8(%r1)
+
+       /* Now set the real MSR */
+       mtmsrd  %r6
+       isync
+
+       /* Sign-extend the return value from OF */
+       extsw   %r3,%r3
+
+       /* Restore all the non-volatile registers */
+       ld      %r5,48(%r1)
+       mtcr    %r5
+       ld      %r13,56(%r1)
+       ld      %r14,64(%r1)
+       ld      %r15,72(%r1)
+       ld      %r16,80(%r1)
+       ld      %r17,88(%r1)
+       ld      %r18,96(%r1)
+       ld      %r19,104(%r1)
+       ld      %r20,112(%r1)
+       ld      %r21,120(%r1)
+       ld      %r22,128(%r1)
+       ld      %r23,136(%r1)
+       ld      %r24,144(%r1)
+       ld      %r25,152(%r1)
+       ld      %r26,160(%r1)
+       ld      %r27,168(%r1)
+       ld      %r28,176(%r1)
+       ld      %r29,184(%r1)
+       ld      %r30,192(%r1)
+       ld      %r31,200(%r1)
+
+       /* Restore the stack and link register */
+       ld      %r1,0(%r1)
+       ld      %r0,16(%r1)
+       mtlr    %r0
+       blr
 
 /*
  * int setfault()
@@ -191,19 +331,39 @@ __start:
  * or the (currently used) C code optimized, so it doesn't use any non-volatile
  * registers.
  */
-       .globl  setfault
-setfault:
+ASENTRY(setfault)
        mflr    0
        mfcr    12
        mfsprg  4,0
-       lwz     4,PC_CURTHREAD(4)
-       lwz     4,TD_PCB(4)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to