Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/powerpc Add IBM40x specific machdep functions.



details:   https://anonhg.NetBSD.org/src/rev/6783d7cc8cb7
branches:  trunk
changeset: 552327:6783d7cc8cb7
user:      shige <shige%NetBSD.org@localhost>
date:      Tue Sep 23 15:14:02 2003 +0000

description:
Add IBM40x specific machdep functions.

diffstat:

 sys/arch/powerpc/ibm4xx/ibm40x_machdep.c |  507 +++++++++++++++++++++++++++++++
 sys/arch/powerpc/include/ibm4xx/cpu.h    |    8 +-
 2 files changed, 514 insertions(+), 1 deletions(-)

diffs (truncated from 533 to 300 lines):

diff -r 97fddb836ce0 -r 6783d7cc8cb7 sys/arch/powerpc/ibm4xx/ibm40x_machdep.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/powerpc/ibm4xx/ibm40x_machdep.c  Tue Sep 23 15:14:02 2003 +0000
@@ -0,0 +1,507 @@
+/*     $NetBSD: ibm40x_machdep.c,v 1.1 2003/09/23 15:14:02 shige Exp $ */
+
+/*
+ * Copyright 2001, 2002 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
+ *
+ * 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 for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: ibm40x_machdep.c,v 1.1 2003/09/23 15:14:02 shige Exp $");
+
+#include "opt_compat_netbsd.h"
+#include "opt_ddb.h"
+#include "opt_kgdb.h"
+#include "opt_ipkdb.h"
+
+#include <sys/param.h>
+#include <sys/buf.h>
+#include <sys/exec.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/mount.h>
+#include <sys/msgbuf.h>
+#include <sys/proc.h>
+#include <sys/reboot.h>
+#include <sys/sa.h>
+#include <sys/syscallargs.h>
+#include <sys/syslog.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/user.h>
+#include <sys/boot_flag.h>
+#include <sys/properties.h>
+#include <sys/ksyms.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <net/netisr.h>
+
+#if defined(DDB)
+#include <machine/db_machdep.h>
+#include <ddb/db_extern.h>
+#endif
+
+#if defined(KGDB)
+#include <sys/kgdb.h>
+#endif
+
+#if defined(IPKDB)
+#include <ipkdb/ipkdb.h>
+#endif
+
+#include <machine/bus.h>
+#include <machine/trap.h>
+#include <machine/powerpc.h>
+#include <powerpc/spr.h>
+#include <powerpc/ibm4xx/dcr405gp.h>
+
+/*
+ * Global variables used here and there
+ */
+struct vm_map *exec_map = NULL;
+struct vm_map *mb_map = NULL;
+struct vm_map *phys_map = NULL;
+
+char machine[] = MACHINE;              /* from <machine/param.h> */
+char machine_arch[] = MACHINE_ARCH;    /* from <machine/param.h> */
+
+#define MEMREGIONS     8
+struct mem_region physmemr[MEMREGIONS];        /* Hard code memory */
+struct mem_region availmemr[MEMREGIONS];/* Who's supposed to set these up? */
+
+struct board_cfg_data board_data;
+struct propdb *board_info = NULL;
+
+extern struct user *proc0paddr;
+
+paddr_t msgbuf_paddr;
+vaddr_t msgbuf_vaddr;
+
+
+void
+ibm4xx_init_board_data(void *info_block, u_int startkernel)
+{
+        /* Initialize cache info for memcpy, etc. */
+        cpu_probe_cache();
+
+       /* Save info block */
+       memcpy(&board_data, info_block, sizeof(board_data));
+
+       memset(physmemr, 0, sizeof physmemr);
+       memset(availmemr, 0, sizeof availmemr);
+       physmemr[0].start = 0;
+       physmemr[0].size = board_data.mem_size & ~PGOFSET;
+       /* Lower memory reserved by eval board BIOS */
+       availmemr[0].start = startkernel; 
+       availmemr[0].size = board_data.mem_size - availmemr[0].start;
+}
+
+void
+ibm4xx_init(void (*handler)(void))
+{
+       extern int defaulttrap, defaultsize;
+       extern int sctrap, scsize;
+       extern int alitrap, alisize;
+       extern int dsitrap, dsisize;
+       extern int isitrap, isisize;
+       extern int mchktrap, mchksize;
+       extern int tlbimiss4xx, tlbim4size;
+       extern int tlbdmiss4xx, tlbdm4size;
+       extern int pitfitwdog, pitfitwdogsize;
+       extern int debugtrap, debugsize;
+       extern int errata51handler, errata51size;
+#ifdef DDB
+       extern int ddblow, ddbsize;
+#endif
+#ifdef IPKDB
+       extern int ipkdblow, ipkdbsize;
+#endif
+       uintptr_t exc;
+       struct cpu_info * const ci = curcpu();
+
+        /* Initialize cache info for memcpy, etc. */
+       cpu_probe_cache();
+
+       /*
+        * Initialize lwp0 and current pcb and pmap pointers.
+        */
+        KASSERT(ci != NULL);
+        KASSERT(curcpu() == ci);
+       lwp0.l_cpu = ci;
+       lwp0.l_addr = proc0paddr;
+       memset(lwp0.l_addr, 0, sizeof *lwp0.l_addr);
+        KASSERT(lwp0.l_cpu != NULL);
+
+       curpcb = &proc0paddr->u_pcb;
+        memset(curpcb, 0, sizeof(*curpcb));
+       curpcb->pcb_pm = pmap_kernel();
+
+       /*
+        * Set up trap vectors
+        */
+       for (exc = EXC_RSVD; exc <= EXC_LAST; exc += 0x100)
+               switch (exc) {
+               default:
+                       memcpy((void *)exc, &defaulttrap, (size_t)&defaultsize);
+                       break;
+               case EXC_EXI:
+                       /*
+                        * This one is (potentially) installed during autoconf
+                        */
+                       break;
+               case EXC_SC:
+                       memcpy((void *)EXC_SC, &sctrap, (size_t)&scsize);
+                       break;
+               case EXC_ALI:
+                       memcpy((void *)EXC_ALI, &alitrap, (size_t)&alisize);
+                       break;
+               case EXC_DSI:
+                       memcpy((void *)EXC_DSI, &dsitrap, (size_t)&dsisize);
+                       break;
+               case EXC_ISI:
+                       memcpy((void *)EXC_ISI, &isitrap, (size_t)&isisize);
+                       break;
+               case EXC_MCHK:
+                       memcpy((void *)EXC_MCHK, &mchktrap, (size_t)&mchksize);
+                       break;
+               case EXC_ITMISS:
+                       memcpy((void *)EXC_ITMISS, &tlbimiss4xx,
+                               (size_t)&tlbim4size);
+                       break;
+               case EXC_DTMISS:
+                       memcpy((void *)EXC_DTMISS, &tlbdmiss4xx,
+                               (size_t)&tlbdm4size);
+                       break;
+               /* 
+                * EXC_PIT, EXC_FIT, EXC_WDOG handlers 
+                * are spaced by 0x10 bytes only.. 
+                */
+               case EXC_PIT:   
+                       memcpy((void *)EXC_PIT, &pitfitwdog,
+                               (size_t)&pitfitwdogsize);
+                       break;
+               case EXC_DEBUG:
+                       memcpy((void *)EXC_DEBUG, &debugtrap,
+                               (size_t)&debugsize);
+                       break;
+               case EXC_DTMISS|EXC_ALI:
+                        /* PPC405GP Rev D errata item 51 */    
+                       memcpy((void *)(EXC_DTMISS|EXC_ALI), &errata51handler,
+                               (size_t)&errata51size);
+                       break;
+#if defined(DDB) || defined(IPKDB)
+               case EXC_PGM:
+#if defined(DDB)
+                       memcpy((void *)exc, &ddblow, (size_t)&ddbsize);
+#elif defined(IPKDB)
+                       memcpy((void *)exc, &ipkdblow, (size_t)&ipkdbsize);
+#endif
+#endif /* DDB | IPKDB */
+                       break;
+               }
+
+       __syncicache((void *)EXC_RST, EXC_LAST - EXC_RST + 0x100);
+       mtspr(SPR_EVPR, 0);             /* Set Exception vector base */
+
+       consinit();
+
+       /* Handle trap instruction as PGM exception */
+       {
+         int dbcr0;
+         asm volatile("mfspr %0,%1":"=r"(dbcr0):"K"(SPR_DBCR0));
+         asm volatile("mtspr %0,%1"::"K"(SPR_DBCR0),"r"(dbcr0 & ~DBCR0_TDE));
+       }
+
+       /*
+        * external interrupt handler install
+        */
+        if (handler)
+           ibm4xx_install_extint(handler);
+
+       /*
+        * Now enable translation (and machine checks/recoverable interrupts).
+        */
+       asm volatile ("mfmsr %0; ori %0,%0,%1; mtmsr %0; isync"
+                     : : "r"(0), "K"(PSL_IR|PSL_DR)); 
+       /* XXXX PSL_ME - With ME set kernel gets stuck... */
+
+       KASSERT(curcpu() == ci);
+}
+
+void
+ibm4xx_install_extint(void (*handler)(void))
+{
+       extern int extint, extsize;
+       extern u_long extint_call;



Home | Main Index | Thread Index | Old Index