Home | History | Annotate | Line # | Download | only in mac68k
      1  1.371       rin /*	$NetBSD: machdep.c,v 1.371 2025/09/24 14:12:49 rin Exp $	*/
      2   1.29       cgd 
      3    1.1    briggs /*
      4  1.338     rmind  * Copyright (c) 1988 University of Utah.
      5    1.1    briggs  * Copyright (c) 1982, 1990 The Regents of the University of California.
      6    1.1    briggs  * All rights reserved.
      7    1.1    briggs  *
      8    1.1    briggs  * This code is derived from software contributed to Berkeley by
      9    1.1    briggs  * the Systems Programming Group of the University of Utah Computer
     10    1.1    briggs  * Science Department.
     11    1.1    briggs  *
     12    1.1    briggs  * Redistribution and use in source and binary forms, with or without
     13    1.1    briggs  * modification, are permitted provided that the following conditions
     14    1.1    briggs  * are met:
     15    1.1    briggs  * 1. Redistributions of source code must retain the above copyright
     16    1.1    briggs  *    notice, this list of conditions and the following disclaimer.
     17    1.1    briggs  * 2. Redistributions in binary form must reproduce the above copyright
     18    1.1    briggs  *    notice, this list of conditions and the following disclaimer in the
     19    1.1    briggs  *    documentation and/or other materials provided with the distribution.
     20  1.292       agc  * 3. Neither the name of the University nor the names of its contributors
     21  1.292       agc  *    may be used to endorse or promote products derived from this software
     22  1.292       agc  *    without specific prior written permission.
     23  1.292       agc  *
     24  1.292       agc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     25  1.292       agc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     26  1.292       agc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     27  1.292       agc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     28  1.292       agc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     29  1.292       agc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     30  1.292       agc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31  1.292       agc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     32  1.292       agc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     33  1.292       agc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34  1.292       agc  * SUCH DAMAGE.
     35  1.292       agc  */
     36  1.338     rmind 
     37    1.1    briggs /*-
     38    1.1    briggs  * Copyright (C) 1993	Allen K. Briggs, Chris P. Caputo,
     39    1.1    briggs  *			Michael L. Finch, Bradley A. Grantham, and
     40    1.1    briggs  *			Lawrence A. Kesteloot
     41    1.1    briggs  * All rights reserved.
     42    1.1    briggs  *
     43    1.1    briggs  * Redistribution and use in source and binary forms, with or without
     44    1.1    briggs  * modification, are permitted provided that the following conditions
     45    1.1    briggs  * are met:
     46    1.1    briggs  * 1. Redistributions of source code must retain the above copyright
     47    1.1    briggs  *    notice, this list of conditions and the following disclaimer.
     48    1.1    briggs  * 2. Redistributions in binary form must reproduce the above copyright
     49    1.1    briggs  *    notice, this list of conditions and the following disclaimer in the
     50    1.1    briggs  *    documentation and/or other materials provided with the distribution.
     51    1.1    briggs  * 3. All advertising materials mentioning features or use of this software
     52    1.1    briggs  *    must display the following acknowledgement:
     53    1.1    briggs  *	This product includes software developed by the Alice Group.
     54    1.1    briggs  * 4. The names of the Alice Group or any of its members may not be used
     55    1.1    briggs  *    to endorse or promote products derived from this software without
     56    1.1    briggs  *    specific prior written permission.
     57    1.1    briggs  *
     58    1.1    briggs  * THIS SOFTWARE IS PROVIDED BY THE ALICE GROUP ``AS IS'' AND ANY EXPRESS OR
     59    1.1    briggs  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     60    1.1    briggs  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     61    1.1    briggs  * IN NO EVENT SHALL THE ALICE GROUP BE LIABLE FOR ANY DIRECT, INDIRECT,
     62    1.1    briggs  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     63    1.1    briggs  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     64    1.1    briggs  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     65    1.1    briggs  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     66    1.1    briggs  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     67    1.1    briggs  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     68    1.1    briggs  *
     69    1.1    briggs  */
     70    1.1    briggs /*
     71    1.1    briggs  * from: Utah $Hdr: machdep.c 1.63 91/04/24$
     72    1.1    briggs  *
     73   1.29       cgd  *	@(#)machdep.c	7.16 (Berkeley) 6/3/91
     74    1.1    briggs  */
     75  1.291     lukem 
     76  1.291     lukem #include <sys/cdefs.h>
     77  1.371       rin __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.371 2025/09/24 14:12:49 rin Exp $");
     78  1.144    scottr 
     79  1.181    scottr #include "opt_adb.h"
     80  1.359       rin #include "opt_compat_netbsd.h"
     81  1.349  uebayasi #include "opt_copy_symtab.h"
     82  1.201  jonathan #include "opt_ddb.h"
     83  1.282     itohy #include "opt_ddbparam.h"
     84  1.263     lukem #include "opt_kgdb.h"
     85  1.360       rin #include "opt_mac68k.h"
     86  1.328       apb #include "opt_modular.h"
     87  1.359       rin 
     88  1.243    scottr #include "akbd.h"
     89  1.353       rin #include "genfb.h"
     90  1.243    scottr #include "macfb.h"
     91  1.194    scottr #include "zsc.h"
     92    1.1    briggs 
     93   1.88   mycroft #include <sys/param.h>
     94    1.4    briggs #include <sys/systm.h>
     95    1.4    briggs #include <sys/buf.h>
     96  1.244    scottr #include <sys/conf.h>
     97  1.244    scottr #include <sys/core.h>
     98    1.4    briggs #include <sys/exec.h>
     99  1.331      matt #include <sys/exec_aout.h>		/* for MID_* */
    100  1.244    scottr #include <sys/extent.h>
    101  1.244    scottr #include <sys/file.h>
    102  1.146    scottr #include <sys/kcore.h>
    103  1.244    scottr #include <sys/kernel.h>
    104    1.4    briggs #include <sys/malloc.h>
    105    1.4    briggs #include <sys/mbuf.h>
    106  1.244    scottr #include <sys/mount.h>
    107    1.4    briggs #include <sys/msgbuf.h>
    108  1.245    scottr #include <sys/pool.h>
    109  1.244    scottr #include <sys/proc.h>
    110  1.245    scottr #include <sys/queue.h>
    111  1.244    scottr #include <sys/reboot.h>
    112  1.244    scottr #include <sys/signalvar.h>
    113  1.244    scottr #include <sys/syscallargs.h>
    114  1.244    scottr #include <sys/vnode.h>
    115  1.286     ragge #include <sys/ksyms.h>
    116  1.336   tsutsui #include <sys/module.h>
    117  1.195    scottr #ifdef	KGDB
    118  1.195    scottr #include <sys/kgdb.h>
    119  1.195    scottr #endif
    120  1.266       chs #include <sys/exec_elf.h>
    121  1.323    dyoung #include <sys/device.h>
    122  1.347  christos #include <sys/cpu.h>
    123  1.281       chs 
    124  1.281       chs #include <m68k/cacheops.h>
    125  1.366   thorpej #include <m68k/mmu_40.h>
    126    1.1    briggs 
    127   1.95    briggs #include <machine/db_machdep.h>
    128   1.95    briggs #include <ddb/db_sym.h>
    129   1.95    briggs #include <ddb/db_extern.h>
    130   1.95    briggs 
    131   1.95    briggs #include <machine/autoconf.h>
    132    1.4    briggs #include <machine/cpu.h>
    133    1.4    briggs #include <machine/reg.h>
    134  1.337   tsutsui #include <machine/pcb.h>
    135    1.4    briggs #include <machine/psl.h>
    136    1.4    briggs #include <machine/pte.h>
    137  1.146    scottr #include <machine/kcore.h>	/* XXX should be pulled in by sys/kcore.h */
    138  1.318      jmmv #include <machine/video.h>
    139    1.1    briggs 
    140  1.240     ragge #define	MAXMEM	64*1024	/* XXX - from cmap.h */
    141  1.190    scottr #include <uvm/uvm_extern.h>
    142  1.170    briggs 
    143  1.255       mrg #include <sys/sysctl.h>
    144    1.1    briggs 
    145   1.20    briggs #include <dev/cons.h>
    146  1.341     rmind #include <dev/mm.h>
    147   1.20    briggs 
    148  1.237    briggs #include <machine/iopreg.h>
    149  1.190    scottr #include <machine/psc.h>
    150   1.93    briggs #include <machine/viareg.h>
    151  1.157    scottr #include <mac68k/mac68k/macrom.h>
    152  1.157    scottr #include <mac68k/dev/adbvar.h>
    153  1.243    scottr #if NAKBD > 0
    154  1.243    scottr #include <mac68k/dev/akbdvar.h>
    155  1.243    scottr #endif
    156  1.243    scottr #if NMACFB > 0
    157  1.243    scottr #include <mac68k/dev/macfbvar.h>
    158  1.243    scottr #endif
    159  1.370       nat #include <mac68k/dev/pm_direct.h>
    160  1.194    scottr #include <mac68k/dev/zs_cons.h>
    161    1.8    briggs 
    162  1.286     ragge #include "ksyms.h"
    163  1.286     ragge 
    164  1.267       chs int symsize, end, *ssym, *esym;
    165  1.267       chs 
    166   1.16    briggs /* The following is used externally (sysctl_hw) */
    167  1.147     veego char	machine[] = MACHINE;	/* from <machine/param.h> */
    168   1.16    briggs 
    169   1.55    briggs struct mac68k_machine_S mac68k_machine;
    170   1.21    briggs 
    171  1.174    briggs volatile u_char *Via1Base, *Via2Base, *PSCBase = NULL;
    172  1.216    scottr u_long	NuBusBase = NBBASE;
    173  1.216    scottr u_long	IOBase;
    174   1.25   lkestel 
    175  1.216    scottr vaddr_t	SCSIBase;
    176   1.25   lkestel 
    177   1.25   lkestel /* These are used to map kernel space: */
    178   1.55    briggs extern int numranges;
    179   1.55    briggs extern u_long low[8];
    180   1.55    briggs extern u_long high[8];
    181  1.346     jklos extern int machineid;
    182   1.25   lkestel 
    183   1.25   lkestel /* These are used to map NuBus space: */
    184   1.55    briggs #define	NBMAXRANGES	16
    185  1.183    scottr int	nbnumranges;		/* = 0 == don't use the ranges */
    186  1.183    scottr u_long	nbphys[NBMAXRANGES];	/* Start physical addr of this range */
    187  1.183    scottr u_long	nblog[NBMAXRANGES];	/* Start logical addr of this range */
    188  1.183    scottr long	nblen[NBMAXRANGES];	/* Length of this range If the length is */
    189   1.55    briggs 				/* negative, all phys addrs are the same. */
    190   1.55    briggs 
    191  1.318      jmmv /* Definitions for the variables defined in machine/video.h */
    192  1.319      jmmv struct mac68k_video mac68k_video;
    193   1.55    briggs 
    194  1.131    scottr /* Callback and cookie to run bell */
    195  1.301       chs int	(*mac68k_bell_callback)(void *, int, int, int);
    196  1.313  christos void *	mac68k_bell_cookie;
    197  1.131    scottr 
    198  1.264       chs struct vm_map *phys_map = NULL;
    199   1.52    briggs 
    200  1.183    scottr int	maxmem;			/* max memory per process */
    201   1.55    briggs 
    202    1.1    briggs /*
    203  1.132    scottr  * Extent maps to manage all memory space, including I/O ranges.  Allocate
    204  1.132    scottr  * storage for 8 regions in each, initially.  Later, iomem_malloc_safe
    205  1.132    scottr  * will indicate that it's safe to use malloc() to dynamically allocate
    206  1.132    scottr  * region descriptors.
    207  1.132    scottr  *
    208  1.132    scottr  * The extent maps are not static!  Machine-dependent NuBus and on-board
    209  1.132    scottr  * I/O routines need access to them for bus address space allocation.
    210  1.132    scottr  */
    211  1.186    scottr static long iomem_ex_storage[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
    212  1.186    scottr struct extent *iomem_ex;
    213  1.186    scottr int iomem_malloc_safe;
    214  1.251   thorpej 
    215  1.251   thorpej /* Our exported CPU info; we can have only one. */
    216  1.251   thorpej struct cpu_info cpu_info_store;
    217  1.132    scottr 
    218  1.301       chs static void	identifycpu(void);
    219  1.301       chs static u_long	get_physical(u_int, u_long *);
    220   1.21    briggs 
    221  1.301       chs void	initcpu(void);
    222  1.301       chs int	cpu_dumpsize(void);
    223  1.313  christos int	cpu_dump(int (*)(dev_t, daddr_t, void *, size_t), daddr_t *);
    224  1.301       chs void	cpu_init_kcore_hdr(void);
    225  1.190    scottr 
    226  1.301       chs void		getenvvars(u_long, char *);
    227  1.305       jmc static long	getenv(const char *);
    228  1.267       chs 
    229  1.190    scottr /* functions called from locore.s */
    230  1.301       chs void	dumpsys(void);
    231  1.301       chs void	mac68k_init(void);
    232  1.301       chs void	straytrap(int, int);
    233  1.301       chs void	nmihand(struct frame);
    234  1.146    scottr 
    235  1.146    scottr /*
    236  1.146    scottr  * Machine-dependent crash dump header info.
    237  1.146    scottr  */
    238  1.146    scottr cpu_kcore_hdr_t cpu_kcore_hdr;
    239  1.133    scottr 
    240    1.1    briggs /*
    241  1.300  christos  * XXX: For zs serial driver. We always initialize the base address
    242  1.300  christos  * to avoid a bunch of #ifdefs.
    243  1.300  christos  */
    244  1.300  christos volatile unsigned char *sccA = 0;
    245  1.300  christos 
    246  1.300  christos /*
    247  1.190    scottr  * Early initialization, before main() is called.
    248  1.190    scottr  */
    249  1.190    scottr void
    250  1.301       chs mac68k_init(void)
    251  1.190    scottr {
    252  1.190    scottr 	int i;
    253  1.216    scottr 	extern vaddr_t avail_start;
    254  1.190    scottr 
    255  1.190    scottr 	/*
    256  1.190    scottr 	 * Tell the VM system about available physical memory.
    257  1.191    scottr 	 * Notice that we don't need to worry about avail_end here
    258  1.191    scottr 	 * since it's equal to high[numranges-1].
    259  1.190    scottr 	 */
    260  1.190    scottr 	for (i = 0; i < numranges; i++) {
    261  1.192    scottr 		if (low[i] <= avail_start && avail_start < high[i])
    262  1.190    scottr 			uvm_page_physload(atop(avail_start), atop(high[i]),
    263  1.207   thorpej 			    atop(avail_start), atop(high[i]),
    264  1.207   thorpej 			    VM_FREELIST_DEFAULT);
    265  1.190    scottr 		else
    266  1.190    scottr 			uvm_page_physload(atop(low[i]), atop(high[i]),
    267  1.207   thorpej 			    atop(low[i]), atop(high[i]),
    268  1.207   thorpej 			    VM_FREELIST_DEFAULT);
    269  1.190    scottr 	}
    270  1.190    scottr 
    271  1.232    scottr 	/*
    272  1.232    scottr 	 * Initialize the I/O mem extent map.
    273  1.232    scottr 	 * Note: we don't have to check the return value since
    274  1.232    scottr 	 * creation of a fixed extent map will never fail (since
    275  1.232    scottr 	 * descriptor storage has already been allocated).
    276  1.232    scottr 	 *
    277  1.232    scottr 	 * N.B. The iomem extent manages _all_ physical addresses
    278  1.232    scottr 	 * on the machine.  When the amount of RAM is found, all
    279  1.232    scottr 	 * extents of RAM are allocated from the map.
    280  1.232    scottr 	 */
    281  1.343      para 	iomem_ex = extent_create("iomem", 0x0, 0xffffffff,
    282  1.313  christos 	    (void *)iomem_ex_storage, sizeof(iomem_ex_storage),
    283  1.232    scottr 	    EX_NOCOALESCE|EX_NOWAIT);
    284  1.232    scottr 
    285  1.223    scottr 	/* Initialize the interrupt handlers. */
    286  1.223    scottr 	intr_init();
    287  1.246    scottr 
    288  1.246    scottr 	/* Initialize the IOPs (if present) */
    289  1.246    scottr 	iop_init(1);
    290  1.190    scottr 
    291  1.190    scottr 	/*
    292  1.190    scottr 	 * Initialize error message buffer (at end of core).
    293  1.190    scottr 	 * high[numranges-1] was decremented in pmap_bootstrap.
    294  1.190    scottr 	 */
    295  1.190    scottr 	for (i = 0; i < btoc(MSGBUFSIZE); i++)
    296  1.285   thorpej 		pmap_enter(pmap_kernel(), (vaddr_t)msgbufaddr + i * PAGE_SIZE,
    297  1.285   thorpej 		    high[numranges - 1] + i * PAGE_SIZE,
    298  1.285   thorpej 		    VM_PROT_READ|VM_PROT_WRITE,
    299  1.239   thorpej 		    VM_PROT_READ|VM_PROT_WRITE|PMAP_WIRED);
    300  1.190    scottr 	initmsgbuf(msgbufaddr, m68k_round_page(MSGBUFSIZE));
    301  1.265     chris 	pmap_update(pmap_kernel());
    302  1.190    scottr }
    303  1.190    scottr 
    304  1.190    scottr /*
    305    1.1    briggs  * Console initialization: called early on from main,
    306    1.1    briggs  * before vm init or startup.  Do enough configuration
    307    1.1    briggs  * to choose and initialize a console.
    308    1.1    briggs  */
    309    1.1    briggs void
    310    1.1    briggs consinit(void)
    311    1.1    briggs {
    312   1.23    briggs 	/*
    313   1.23    briggs 	 * Generic console: sys/dev/cons.c
    314   1.23    briggs 	 *	Initializes either ite or ser as console.
    315  1.243    scottr 	 *	Can be called from locore.s and init_main.c.  (Ugh.)
    316   1.23    briggs 	 */
    317   1.55    briggs 	static int init;	/* = 0 */
    318   1.25   lkestel 
    319   1.25   lkestel 	if (!init) {
    320   1.25   lkestel 		cninit();
    321  1.195    scottr 		init = 1;
    322  1.195    scottr 	} else {
    323  1.353       rin #if NAKBD > 0 && (NMACFB + NGENFB) > 0
    324  1.243    scottr 		/*
    325  1.243    scottr 		 * XXX  This is an evil hack on top of an evil hack!
    326  1.243    scottr 		 *
    327  1.243    scottr 		 * With the graybar stuff, we've got a catch-22:  we need
    328  1.243    scottr 		 * to do at least some console setup really early on, even
    329  1.243    scottr 		 * before we're running with the mappings we need.  On
    330  1.243    scottr 		 * the other hand, we're not nearly ready to do anything
    331  1.243    scottr 		 * with wscons or the ADB driver at that point.
    332  1.243    scottr 		 *
    333  1.243    scottr 		 * To get around this, maccninit() ignores the first call
    334  1.243    scottr 		 * it gets (from cninit(), if not on a serial console).
    335  1.243    scottr 		 * Once we're here, we call maccninit() again, which sets
    336  1.243    scottr 		 * up the console devices and does the appropriate wscons
    337  1.243    scottr 		 * initialization.
    338  1.243    scottr 		 */
    339  1.243    scottr 		if (mac68k_machine.serial_console == 0) {
    340  1.301       chs 			void maccninit(struct consdev *);
    341  1.243    scottr 			maccninit(NULL);
    342  1.243    scottr 		}
    343  1.243    scottr #endif
    344  1.243    scottr 
    345  1.195    scottr 		mac68k_calibrate_delay();
    346  1.195    scottr 
    347  1.194    scottr #if NZSC > 0 && defined(KGDB)
    348  1.194    scottr 		zs_kgdb_init();
    349  1.194    scottr #endif
    350  1.324        ad #if NKSYMS || defined(DDB) || defined(MODULAR)
    351   1.25   lkestel 		/*
    352   1.25   lkestel 		 * Initialize kernel debugger, if compiled in.
    353   1.25   lkestel 		 */
    354  1.199        tv 
    355  1.325    martin 		ksyms_addsyms_elf(symsize, ssym, esym);
    356   1.11    briggs #endif
    357  1.195    scottr 
    358  1.195    scottr 		if (boothowto & RB_KDB) {
    359  1.195    scottr #ifdef KGDB
    360  1.195    scottr 			/* XXX - Ask on console for kgdb_dev? */
    361  1.195    scottr 			/* Note: this will just return if kgdb_dev==NODEV */
    362  1.195    scottr 			kgdb_connect(1);
    363  1.195    scottr #else	/* KGDB */
    364  1.195    scottr #ifdef DDB
    365  1.195    scottr 			/* Enter DDB.  We don't have a monitor PROM. */
    366  1.195    scottr 			Debugger();
    367  1.195    scottr #endif /* DDB */
    368  1.195    scottr #endif	/* KGDB */
    369  1.195    scottr 		}
    370  1.195    scottr 	}
    371    1.1    briggs }
    372    1.1    briggs 
    373  1.164    scottr #define CURRENTBOOTERVER	111
    374   1.31    briggs 
    375    1.1    briggs /*
    376  1.299    scottr  * cpu_startup: allocate memory for variable-sized tables, make
    377  1.299    scottr  * (most of) kernel text read-only, and other miscellaneous bits
    378    1.1    briggs  */
    379    1.1    briggs void
    380    1.1    briggs cpu_startup(void)
    381    1.1    briggs {
    382  1.183    scottr 	int vers;
    383  1.216    scottr 	vaddr_t minaddr, maxaddr;
    384  1.305       jmc 	int xdelay;
    385  1.233     lukem 	char pbuf[9];
    386    1.1    briggs 
    387    1.1    briggs 	/*
    388  1.146    scottr 	 * Initialize the kernel crash dump header.
    389  1.146    scottr 	 */
    390  1.146    scottr 	cpu_init_kcore_hdr();
    391  1.146    scottr 
    392  1.146    scottr 	/*
    393    1.1    briggs 	 * Good {morning,afternoon,evening,night}.
    394    1.1    briggs 	 */
    395  1.304     lukem 	printf("%s%s", copyright, version);
    396    1.1    briggs 	identifycpu();
    397   1.31    briggs 
    398   1.31    briggs 	vers = mac68k_machine.booter_version;
    399   1.31    briggs 	if (vers < CURRENTBOOTERVER) {
    400  1.367    andvar 		/* fix older booters with indices, not versions */
    401   1.55    briggs 		if (vers < 100)
    402   1.55    briggs 			vers += 99;
    403   1.31    briggs 
    404  1.121  christos 		printf("\nYou booted with booter version %d.%d.\n",
    405   1.55    briggs 		    vers / 100, vers % 100);
    406  1.121  christos 		printf("Booter version %d.%d is necessary to fully support\n",
    407   1.55    briggs 		    CURRENTBOOTERVER / 100, CURRENTBOOTERVER % 100);
    408  1.121  christos 		printf("this kernel.\n\n");
    409  1.305       jmc 		for (xdelay = 0; xdelay < 1000000; xdelay++);
    410   1.31    briggs 	}
    411  1.233     lukem 	format_bytes(pbuf, sizeof(pbuf), ctob(physmem));
    412  1.233     lukem 	printf("total memory = %s\n", pbuf);
    413    1.2    briggs 
    414  1.295        pk 	minaddr = 0;
    415    1.5    briggs 	/*
    416    1.1    briggs 	 * Allocate a submap for physio
    417    1.1    briggs 	 */
    418  1.190    scottr 	phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
    419  1.312   thorpej 	    VM_PHYS_SIZE, 0, false, NULL);
    420    1.1    briggs 
    421  1.358        ad 	format_bytes(pbuf, sizeof(pbuf), ptoa(uvm_availmem(false)));
    422  1.233     lukem 	printf("avail memory = %s\n", pbuf);
    423  1.288   thorpej 
    424  1.288   thorpej 	/*
    425  1.151    scottr 	 * Set up CPU-specific registers, cache, etc.
    426  1.151    scottr 	 */
    427  1.151    scottr 	initcpu();
    428  1.151    scottr 
    429  1.227   thorpej 	/* Safe for extent allocation to use malloc now. */
    430  1.132    scottr 	iomem_malloc_safe = 1;
    431  1.151    scottr }
    432  1.151    scottr 
    433  1.151    scottr void
    434  1.301       chs initcpu(void)
    435  1.151    scottr {
    436  1.298    scottr 	/* Invalidate supervisor mode data cache. */
    437  1.151    scottr 	DCIS();
    438    1.1    briggs }
    439    1.1    briggs 
    440  1.303       chs void doboot(void) __attribute__((__noreturn__));
    441   1.95    briggs 
    442  1.183    scottr int	waittime = -1;
    443   1.48    briggs struct pcb dumppcb;
    444    1.1    briggs 
    445    1.1    briggs void
    446  1.301       chs cpu_reboot(int howto, char *bootstr)
    447    1.1    briggs {
    448  1.333     rmind 	struct pcb *pcb = lwp_getpcb(curlwp);
    449  1.197    scottr 	extern u_long maxaddr;
    450   1.71    briggs 
    451    1.1    briggs 	/* take a snap shot before clobbering any registers */
    452  1.333     rmind 	if (pcb != NULL)
    453  1.333     rmind 		savectx(pcb);
    454  1.145    scottr 
    455  1.145    scottr 	/* If system is cold, just halt. */
    456  1.145    scottr 	if (cold) {
    457  1.145    scottr 		howto |= RB_HALT;
    458  1.145    scottr 		goto haltsys;
    459  1.145    scottr 	}
    460    1.1    briggs 
    461    1.1    briggs 	boothowto = howto;
    462   1.55    briggs 	if ((howto & RB_NOSYNC) == 0 && waittime < 0) {
    463    1.1    briggs 		waittime = 0;
    464   1.41    briggs 		vfs_shutdown();
    465   1.92    scottr # ifdef DIAGNOSTIC
    466  1.121  christos 		printf("NetBSD/mac68k does not trust itself to update the "
    467   1.92    scottr 		    "RTC on shutdown.\n");
    468   1.92    scottr # endif
    469    1.1    briggs 	}
    470  1.145    scottr 
    471  1.145    scottr 	/* Disable interrupts. */
    472  1.145    scottr 	splhigh();
    473  1.145    scottr 
    474  1.145    scottr 	/* If rebooting and a dump is requested, do it. */
    475  1.146    scottr 	if (howto & RB_DUMP)
    476  1.145    scottr 		dumpsys();
    477  1.145    scottr 
    478  1.145    scottr  haltsys:
    479  1.145    scottr 	/* Run any shutdown hooks. */
    480  1.145    scottr 	doshutdownhooks();
    481  1.145    scottr 
    482  1.323    dyoung 	pmf_system_shutdown(boothowto);
    483  1.323    dyoung 
    484  1.219    scottr 	if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
    485  1.219    scottr 		/* First try to power down under VIA control. */
    486  1.218    scottr 		via_powerdown();
    487  1.219    scottr 
    488  1.140    scottr #ifndef MRG_ADB
    489  1.140    scottr 		/*
    490  1.140    scottr 		 * Shut down machines whose power functions are accessed
    491  1.140    scottr 		 * via modified ADB calls.  adb_poweroff() is available
    492  1.140    scottr 		 * only when the MRG ADB is not being used.
    493  1.140    scottr 		 */
    494  1.140    scottr 		adb_poweroff();
    495  1.140    scottr #endif
    496  1.219    scottr 		/*
    497  1.370       nat 		 * Try to shutdown via the power manager (PowerBooks mainly).
    498  1.370       nat 		 */
    499  1.370       nat 		pm_poweroff();
    500  1.370       nat 
    501  1.370       nat 		/*
    502  1.219    scottr 		 * RB_POWERDOWN implies RB_HALT... fall into it...
    503  1.219    scottr 		 */
    504  1.219    scottr 	}
    505  1.219    scottr 
    506  1.219    scottr 	if (howto & RB_HALT) {
    507  1.219    scottr 		printf("\n");
    508  1.219    scottr 		printf("The operating system has halted.\n");
    509  1.219    scottr 		printf("Please press any key to reboot.\n\n");
    510  1.363   tsutsui 		cnpollc(1);
    511  1.145    scottr 		(void)cngetc();
    512  1.363   tsutsui 		cnpollc(0);
    513  1.145    scottr 	}
    514   1.81    briggs 
    515  1.197    scottr 	/* Map the last physical page VA = PA for doboot() */
    516  1.216    scottr 	pmap_enter(pmap_kernel(), (vaddr_t)maxaddr, (vaddr_t)maxaddr,
    517  1.239   thorpej 	    VM_PROT_ALL, VM_PROT_ALL|PMAP_WIRED);
    518  1.265     chris 	pmap_update(pmap_kernel());
    519  1.145    scottr 
    520  1.145    scottr 	printf("rebooting...\n");
    521  1.145    scottr 	DELAY(1000000);
    522  1.145    scottr 	doboot();
    523   1.55    briggs 	/* NOTREACHED */
    524    1.1    briggs }
    525    1.1    briggs 
    526   1.48    briggs /*
    527  1.146    scottr  * Initialize the kernel crash dump header.
    528   1.48    briggs  */
    529  1.146    scottr void
    530  1.301       chs cpu_init_kcore_hdr(void)
    531  1.146    scottr {
    532  1.200    scottr 	extern int end;
    533  1.146    scottr 	cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
    534  1.146    scottr 	struct m68k_kcore_hdr *m = &h->un._m68k;
    535  1.188    scottr 	int i;
    536  1.146    scottr 
    537  1.329    cegger 	memset(&cpu_kcore_hdr, 0, sizeof(cpu_kcore_hdr));
    538  1.146    scottr 
    539  1.146    scottr 	/*
    540  1.146    scottr 	 * Initialize the `dispatcher' portion of the header.
    541  1.146    scottr 	 */
    542  1.146    scottr 	strcpy(h->name, machine);
    543  1.285   thorpej 	h->page_size = PAGE_SIZE;
    544  1.146    scottr 	h->kernbase = KERNBASE;
    545  1.146    scottr 
    546  1.146    scottr 	/*
    547  1.146    scottr 	 * Fill in information about our MMU configuration.
    548  1.146    scottr 	 */
    549  1.146    scottr 	m->mmutype	= mmutype;
    550  1.146    scottr 	m->sg_v		= SG_V;
    551  1.146    scottr 	m->sg_frame	= SG_FRAME;
    552  1.146    scottr 	m->sg_ishift	= SG_ISHIFT;
    553  1.146    scottr 	m->sg_pmask	= SG_PMASK;
    554  1.146    scottr 	m->sg40_shift1	= SG4_SHIFT1;
    555  1.146    scottr 	m->sg40_mask2	= SG4_MASK2;
    556  1.146    scottr 	m->sg40_shift2	= SG4_SHIFT2;
    557  1.146    scottr 	m->sg40_mask3	= SG4_MASK3;
    558  1.146    scottr 	m->sg40_shift3	= SG4_SHIFT3;
    559  1.146    scottr 	m->sg40_addr1	= SG4_ADDR1;
    560  1.146    scottr 	m->sg40_addr2	= SG4_ADDR2;
    561  1.146    scottr 	m->pg_v		= PG_V;
    562  1.146    scottr 	m->pg_frame	= PG_FRAME;
    563  1.146    scottr 
    564  1.146    scottr 	/*
    565  1.146    scottr 	 * Initialize pointer to kernel segment table.
    566  1.146    scottr 	 */
    567  1.146    scottr 	m->sysseg_pa = (u_int32_t)(pmap_kernel()->pm_stpa);
    568  1.146    scottr 
    569  1.146    scottr 	/*
    570  1.146    scottr 	 * Initialize relocation value such that:
    571  1.146    scottr 	 *
    572  1.146    scottr 	 *	pa = (va - KERNBASE) + reloc
    573  1.146    scottr 	 */
    574  1.146    scottr 	m->reloc = load_addr;
    575  1.146    scottr 
    576  1.146    scottr 	/*
    577  1.146    scottr 	 * Define the end of the relocatable range.
    578  1.146    scottr 	 */
    579  1.200    scottr 	m->relocend = (u_int32_t)&end;
    580  1.146    scottr 
    581  1.146    scottr 	/*
    582  1.146    scottr 	 * mac68k has multiple RAM segments on some models.
    583  1.146    scottr 	 */
    584  1.188    scottr 	for (i = 0; i < numranges; i++) {
    585  1.188    scottr 		m->ram_segs[i].start = low[i];
    586  1.188    scottr 		m->ram_segs[i].size  = high[i] - low[i];
    587  1.146    scottr 	}
    588  1.146    scottr }
    589   1.95    briggs 
    590  1.146    scottr /*
    591  1.146    scottr  * Compute the size of the machine-dependent crash dump header.
    592  1.146    scottr  * Returns size in disk blocks.
    593  1.146    scottr  */
    594  1.306       chs 
    595  1.306       chs #define CHDRSIZE (ALIGN(sizeof(kcore_seg_t)) + ALIGN(sizeof(cpu_kcore_hdr_t)))
    596  1.306       chs #define MDHDRSIZE roundup(CHDRSIZE, dbtob(1))
    597  1.306       chs 
    598  1.146    scottr int
    599  1.301       chs cpu_dumpsize(void)
    600   1.48    briggs {
    601  1.146    scottr 
    602  1.306       chs 	return btodb(MDHDRSIZE);
    603  1.146    scottr }
    604   1.48    briggs 
    605  1.146    scottr /*
    606  1.146    scottr  * Called by dumpsys() to dump the machine-dependent header.
    607  1.146    scottr  */
    608  1.146    scottr int
    609  1.313  christos cpu_dump(int (*dump)(dev_t, daddr_t, void *, size_t), daddr_t *blknop)
    610  1.146    scottr {
    611  1.306       chs 	int buf[MDHDRSIZE / sizeof(int)];
    612  1.146    scottr 	cpu_kcore_hdr_t *chdr;
    613  1.146    scottr 	kcore_seg_t *kseg;
    614  1.146    scottr 	int error;
    615  1.146    scottr 
    616  1.146    scottr 	kseg = (kcore_seg_t *)buf;
    617  1.146    scottr 	chdr = (cpu_kcore_hdr_t *)&buf[ALIGN(sizeof(kcore_seg_t)) /
    618  1.146    scottr 	    sizeof(int)];
    619  1.146    scottr 
    620  1.146    scottr 	/* Create the segment header. */
    621  1.146    scottr 	CORE_SETMAGIC(*kseg, KCORE_MAGIC, MID_MACHINE, CORE_CPU);
    622  1.306       chs 	kseg->c_size = MDHDRSIZE - ALIGN(sizeof(kcore_seg_t));
    623  1.146    scottr 
    624  1.332    cegger 	memcpy(chdr, &cpu_kcore_hdr, sizeof(cpu_kcore_hdr_t));
    625  1.313  christos 	error = (*dump)(dumpdev, *blknop, (void *)buf, sizeof(buf));
    626  1.146    scottr 	*blknop += btodb(sizeof(buf));
    627  1.146    scottr 	return (error);
    628   1.48    briggs }
    629    1.1    briggs 
    630   1.48    briggs /*
    631  1.146    scottr  * These variables are needed by /sbin/savecore
    632  1.146    scottr  */
    633  1.268   tsutsui u_int32_t dumpmag = 0x8fca0101;	/* magic number */
    634  1.183    scottr int	dumpsize = 0;		/* pages */
    635  1.183    scottr long	dumplo = 0;		/* blocks */
    636  1.146    scottr 
    637  1.146    scottr /*
    638  1.137       gwr  * This is called by main to set dumplo and dumpsize.
    639  1.285   thorpej  * Dumps always skip the first PAGE_SIZE of disk space in
    640   1.48    briggs  * case there might be a disk label stored there.  If there
    641   1.48    briggs  * is extra space, put dump at the end to reduce the chance
    642   1.48    briggs  * that swapping trashes it.
    643   1.48    briggs  */
    644   1.48    briggs void
    645  1.301       chs cpu_dumpconf(void)
    646    1.1    briggs {
    647  1.146    scottr 	cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
    648  1.146    scottr 	struct m68k_kcore_hdr *m = &h->un._m68k;
    649  1.146    scottr 	int chdrsize;	/* size of dump header */
    650  1.146    scottr 	int nblks;	/* size of dump area */
    651  1.146    scottr 	int i;
    652   1.48    briggs 
    653   1.48    briggs 	if (dumpdev == NODEV)
    654   1.48    briggs 		return;
    655   1.48    briggs 
    656  1.342       mrg 	nblks = bdev_size(dumpdev);
    657  1.146    scottr 	chdrsize = cpu_dumpsize();
    658    1.1    briggs 
    659  1.146    scottr 	dumpsize = 0;
    660  1.350  christos 	for (i = 0; i < M68K_NPHYS_RAM_SEGS && m->ram_segs[i].size; i++)
    661  1.146    scottr 		dumpsize += btoc(m->ram_segs[i].size);
    662   1.48    briggs 
    663  1.146    scottr 	/*
    664  1.146    scottr 	 * Check to see if we will fit.  Note we always skip the
    665  1.285   thorpej 	 * first PAGE_SIZE in case there is a disk label there.
    666  1.146    scottr 	 */
    667  1.146    scottr 	if (nblks < (ctod(dumpsize) + chdrsize + ctod(1))) {
    668  1.146    scottr 		dumpsize = 0;
    669  1.146    scottr 		dumplo = -1;
    670  1.146    scottr 		return;
    671  1.146    scottr 	}
    672    1.1    briggs 
    673  1.146    scottr 	/*
    674  1.146    scottr 	 * Put dump at the end of the partition.
    675  1.146    scottr 	 */
    676  1.146    scottr 	dumplo = (nblks - 1) - ctod(dumpsize) - chdrsize;
    677   1.48    briggs }
    678   1.48    briggs 
    679   1.48    briggs void
    680  1.301       chs dumpsys(void)
    681    1.1    briggs {
    682  1.146    scottr 	cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
    683  1.146    scottr 	struct m68k_kcore_hdr *m = &h->un._m68k;
    684  1.279   gehenna 	const struct bdevsw *bdev;
    685  1.146    scottr 	daddr_t blkno;		/* current block to write */
    686  1.146    scottr 				/* dump routine */
    687  1.313  christos 	int (*dump)(dev_t, daddr_t, void *, size_t);
    688  1.146    scottr 	int pg;			/* page being dumped */
    689  1.216    scottr 	paddr_t maddr;		/* PA being dumped */
    690  1.146    scottr 	int seg;		/* RAM segment being dumped */
    691  1.146    scottr 	int error;		/* error code from (*dump)() */
    692  1.146    scottr 
    693  1.146    scottr 	/* XXX initialized here because of gcc lossage */
    694  1.146    scottr 	seg = 0;
    695  1.146    scottr 	maddr = m->ram_segs[seg].start;
    696  1.146    scottr 	pg = 0;
    697  1.146    scottr 
    698  1.146    scottr 	/* Make sure dump device is valid. */
    699    1.1    briggs 	if (dumpdev == NODEV)
    700    1.1    briggs 		return;
    701  1.279   gehenna 	bdev = bdevsw_lookup(dumpdev);
    702  1.279   gehenna 	if (bdev == NULL)
    703  1.279   gehenna 		return;
    704  1.146    scottr 	if (dumpsize == 0) {
    705  1.137       gwr 		cpu_dumpconf();
    706  1.146    scottr 		if (dumpsize == 0)
    707  1.146    scottr 			return;
    708  1.146    scottr 	}
    709  1.179   mycroft 	if (dumplo <= 0) {
    710  1.327        he 		printf("\ndump to dev %u,%u not possible\n",
    711  1.326    martin 		    major(dumpdev), minor(dumpdev));
    712    1.1    briggs 		return;
    713  1.179   mycroft 	}
    714  1.279   gehenna 	dump = bdev->d_dump;
    715  1.146    scottr 	blkno = dumplo;
    716  1.146    scottr 
    717  1.327        he 	printf("\ndumping to dev %u,%u offset %ld\n",
    718  1.326    martin 	    major(dumpdev), minor(dumpdev), dumplo);
    719   1.48    briggs 
    720  1.121  christos 	printf("dump ");
    721  1.146    scottr 
    722  1.146    scottr 	/* Write the dump header. */
    723  1.146    scottr 	error = cpu_dump(dump, &blkno);
    724  1.146    scottr 	if (error)
    725  1.146    scottr 		goto bad;
    726  1.146    scottr 
    727  1.146    scottr 	for (pg = 0; pg < dumpsize; pg++) {
    728  1.285   thorpej #define NPGMB	(1024*1024/PAGE_SIZE)
    729  1.146    scottr 		/* print out how many MBs we have dumped */
    730  1.146    scottr 		if (pg && (pg % NPGMB) == 0)
    731  1.146    scottr 			printf("%d ", pg / NPGMB);
    732  1.146    scottr #undef NPGMB
    733  1.146    scottr 		while (maddr >=
    734  1.146    scottr 		    (m->ram_segs[seg].start + m->ram_segs[seg].size)) {
    735  1.146    scottr 			if (++seg >= M68K_NPHYS_RAM_SEGS ||
    736  1.146    scottr 			    m->ram_segs[seg].size == 0) {
    737  1.146    scottr 				error = EINVAL;		/* XXX ?? */
    738  1.146    scottr 				goto bad;
    739   1.48    briggs 			}
    740  1.146    scottr 			maddr = m->ram_segs[seg].start;
    741   1.48    briggs 		}
    742  1.216    scottr 		pmap_enter(pmap_kernel(), (vaddr_t)vmmap, maddr,
    743  1.239   thorpej 		    VM_PROT_READ, VM_PROT_READ|PMAP_WIRED);
    744  1.265     chris 		pmap_update(pmap_kernel());
    745  1.146    scottr 
    746  1.285   thorpej 		error = (*dump)(dumpdev, blkno, vmmap, PAGE_SIZE);
    747  1.146    scottr  bad:
    748  1.146    scottr 		switch (error) {
    749  1.146    scottr 		case 0:
    750  1.285   thorpej 			maddr += PAGE_SIZE;
    751  1.285   thorpej 			blkno += btodb(PAGE_SIZE);
    752   1.48    briggs 			break;
    753  1.146    scottr 
    754  1.146    scottr 		case ENXIO:
    755  1.146    scottr 			printf("device bad\n");
    756  1.146    scottr 			return;
    757  1.146    scottr 
    758  1.146    scottr 		case EFAULT:
    759  1.146    scottr 			printf("device not ready\n");
    760  1.146    scottr 			return;
    761  1.146    scottr 
    762  1.146    scottr 		case EINVAL:
    763  1.146    scottr 			printf("area improper\n");
    764  1.146    scottr 			return;
    765  1.146    scottr 
    766  1.146    scottr 		case EIO:
    767  1.146    scottr 			printf("i/o error\n");
    768  1.146    scottr 			return;
    769  1.146    scottr 
    770  1.146    scottr 		case EINTR:
    771  1.146    scottr 			printf("aborted from console\n");
    772  1.146    scottr 			return;
    773  1.146    scottr 
    774  1.146    scottr 		default:
    775  1.146    scottr 			printf("error %d\n", error);
    776  1.146    scottr 			return;
    777  1.146    scottr 		}
    778   1.48    briggs 	}
    779  1.146    scottr 	printf("succeeded\n");
    780  1.146    scottr }
    781   1.48    briggs 
    782  1.301       chs void straytrap(int, int);
    783   1.95    briggs 
    784   1.95    briggs void
    785  1.301       chs straytrap(int pc, int evec)
    786   1.31    briggs {
    787  1.121  christos 	printf("unexpected trap; vector offset 0x%x from 0x%x.\n",
    788  1.183    scottr 	    (int)(evec & 0xfff), pc);
    789  1.122    scottr #ifdef DDB
    790  1.122    scottr 	Debugger();
    791    1.1    briggs #endif
    792    1.1    briggs }
    793    1.1    briggs 
    794    1.1    briggs /*
    795    1.1    briggs  * Level 7 interrupts can be caused by the keyboard or parity errors.
    796    1.1    briggs  */
    797  1.301       chs void	nmihand(struct frame);
    798   1.95    briggs 
    799   1.55    briggs void
    800  1.301       chs nmihand(struct frame frame)
    801    1.1    briggs {
    802   1.55    briggs 	static int nmihanddeep = 0;
    803    1.1    briggs 
    804   1.55    briggs 	if (nmihanddeep++)
    805   1.55    briggs 		return;
    806  1.142   thorpej /*	regdump((struct trapframe *)&frame, 128);
    807   1.34    briggs 	dumptrace(); */
    808  1.206    scottr #ifdef DDB
    809  1.121  christos 	printf("Panic switch: PC is 0x%x.\n", frame.f_pc);
    810   1.65    briggs 	Debugger();
    811   1.65    briggs #endif
    812   1.55    briggs 	nmihanddeep = 0;
    813    1.1    briggs }
    814    1.1    briggs 
    815   1.55    briggs /*
    816   1.55    briggs  * It should be possible to probe for the top of RAM, but Apple has
    817   1.55    briggs  * memory structured so that in at least some cases, it's possible
    818   1.55    briggs  * for RAM to be aliased across all memory--or for it to appear that
    819   1.55    briggs  * there is more RAM than there really is.
    820   1.55    briggs  */
    821  1.301       chs int	get_top_of_ram(void);
    822   1.95    briggs 
    823   1.55    briggs int
    824  1.301       chs get_top_of_ram(void)
    825    1.1    briggs {
    826  1.354       rin 	return ((mac68k_machine.mach_memsize * (1024 * 1024)) - PAGE_SIZE);
    827    1.1    briggs }
    828    1.1    briggs 
    829   1.21    briggs /*
    830   1.21    briggs  * machine dependent system variables.
    831   1.21    briggs  */
    832  1.294    atatat SYSCTL_SETUP(sysctl_machdep_setup, "sysctl machdep subtree setup")
    833   1.21    briggs {
    834   1.21    briggs 
    835  1.297    atatat 	sysctl_createv(clog, 0, NULL, NULL,
    836  1.297    atatat 		       CTLFLAG_PERMANENT,
    837  1.294    atatat 		       CTLTYPE_NODE, "machdep", NULL,
    838  1.294    atatat 		       NULL, 0, NULL, 0,
    839  1.294    atatat 		       CTL_MACHDEP, CTL_EOL);
    840  1.294    atatat 
    841  1.297    atatat 	sysctl_createv(clog, 0, NULL, NULL,
    842  1.297    atatat 		       CTLFLAG_PERMANENT,
    843  1.294    atatat 		       CTLTYPE_STRUCT, "console_device", NULL,
    844  1.294    atatat 		       sysctl_consdev, 0, NULL, sizeof(dev_t),
    845  1.294    atatat 		       CTL_MACHDEP, CPU_CONSDEV, CTL_EOL);
    846   1.21    briggs }
    847   1.21    briggs 
    848   1.95    briggs int
    849  1.307  christos cpu_exec_aout_makecmds(struct lwp *l, struct exec_package *epp)
    850    1.1    briggs {
    851  1.183    scottr 	int error = ENOEXEC;
    852    1.9    briggs 
    853    1.1    briggs #ifdef COMPAT_NOMID
    854  1.124    briggs 	/* Check to see if MID == 0. */
    855  1.183    scottr 	if (((struct exec *)epp->ep_hdr)->a_midmag == ZMAGIC)
    856  1.365    andvar 		return exec_aout_prep_oldzmagic(l, epp);
    857    1.9    briggs #endif
    858    1.4    briggs 
    859    1.4    briggs 	return error;
    860    1.1    briggs }
    861    1.1    briggs 
    862  1.336   tsutsui #ifdef MODULAR
    863  1.336   tsutsui /*
    864  1.336   tsutsui  * Push any modules loaded by the bootloader etc.
    865  1.336   tsutsui  */
    866  1.336   tsutsui void
    867  1.336   tsutsui module_init_md(void)
    868  1.336   tsutsui {
    869  1.336   tsutsui }
    870  1.336   tsutsui #endif
    871  1.336   tsutsui 
    872   1.55    briggs static char *envbuf = NULL;
    873    1.8    briggs 
    874  1.129    scottr /*
    875  1.129    scottr  * getenvvars: Grab a few useful variables
    876  1.129    scottr  */
    877   1.95    briggs 
    878   1.46    briggs void
    879  1.301       chs getenvvars(u_long flag, char *buf)
    880    1.8    briggs {
    881  1.243    scottr 	extern u_long bootdev;
    882  1.129    scottr 	extern u_long macos_boottime, MacOSROMBase;
    883  1.129    scottr 	extern long macos_gmtbias;
    884  1.164    scottr 	int root_scsi_id;
    885  1.272     shiba 	u_long root_ata_dev;
    886  1.267       chs 	int i;
    887  1.267       chs 	Elf_Ehdr *ehdr;
    888  1.267       chs 	Elf_Shdr *shp;
    889  1.267       chs 	vaddr_t minsym;
    890  1.129    scottr 
    891   1.55    briggs 	/*
    892  1.183    scottr 	 * If flag & 0x80000000 == 0, then we're booting with the old booter
    893  1.183    scottr 	 * and we should freak out.
    894  1.183    scottr 	 */
    895   1.55    briggs 	if ((flag & 0x80000000) == 0) {
    896   1.55    briggs 		/* Freak out; print something if that becomes available */
    897  1.129    scottr 	} else
    898   1.55    briggs 		envbuf = buf;
    899  1.129    scottr 
    900  1.129    scottr 	/* These next two should give us mapped video & serial */
    901  1.129    scottr 	/* We need these for pre-mapping graybars & echo, but probably */
    902  1.129    scottr 	/* only on MacII or LC.  --  XXX */
    903  1.319      jmmv 	/* mac68k_video.mv_kvaddr = getenv("MACOS_VIDEO"); */
    904  1.129    scottr 
    905  1.319      jmmv 	mac68k_video.mv_kvaddr = getenv("VIDEO_ADDR");
    906  1.319      jmmv 	mac68k_video.mv_stride = getenv("ROW_BYTES");
    907  1.319      jmmv 	mac68k_video.mv_depth = getenv("SCREEN_DEPTH");
    908  1.319      jmmv 	mac68k_video.mv_width = getenv("DIMENSIONS") & 0xffff;
    909  1.319      jmmv 	mac68k_video.mv_height = (getenv("DIMENSIONS") >> 16) & 0xffff;
    910  1.129    scottr 
    911  1.129    scottr 	/*
    912  1.183    scottr 	 * More misc stuff from booter.
    913  1.183    scottr 	 */
    914  1.346     jklos 	mac68k_machine.machineid = machineid = getenv("MACHINEID");
    915  1.129    scottr 	mac68k_machine.mach_processor = getenv("PROCESSOR");
    916  1.360       rin #ifndef MAC68K_MEMSIZE
    917  1.129    scottr 	mac68k_machine.mach_memsize = getenv("MEMSIZE");
    918  1.360       rin #else
    919  1.360       rin 	mac68k_machine.mach_memsize = MAC68K_MEMSIZE;
    920  1.360       rin #endif
    921  1.129    scottr 	mac68k_machine.do_graybars = getenv("GRAYBARS");
    922  1.129    scottr 	mac68k_machine.serial_boot_echo = getenv("SERIALECHO");
    923  1.129    scottr 	mac68k_machine.serial_console = getenv("SERIALCONSOLE");
    924  1.129    scottr 
    925  1.129    scottr 	mac68k_machine.modem_flags = getenv("SERIAL_MODEM_FLAGS");
    926  1.129    scottr 	mac68k_machine.modem_cts_clk = getenv("SERIAL_MODEM_HSKICLK");
    927  1.129    scottr 	mac68k_machine.modem_dcd_clk = getenv("SERIAL_MODEM_GPICLK");
    928  1.171    scottr 	mac68k_machine.modem_d_speed = getenv("SERIAL_MODEM_DSPEED");
    929  1.129    scottr 	mac68k_machine.print_flags = getenv("SERIAL_PRINT_FLAGS");
    930  1.129    scottr 	mac68k_machine.print_cts_clk = getenv("SERIAL_PRINT_HSKICLK");
    931  1.129    scottr 	mac68k_machine.print_dcd_clk = getenv("SERIAL_PRINT_GPICLK");
    932  1.171    scottr 	mac68k_machine.print_d_speed = getenv("SERIAL_PRINT_DSPEED");
    933  1.129    scottr 	mac68k_machine.booter_version = getenv("BOOTERVER");
    934  1.164    scottr 
    935  1.164    scottr 	/*
    936  1.183    scottr 	 * For now, we assume that the boot device is off the first controller.
    937  1.164    scottr 	 * Booter versions 1.11.0 and later set a flag to tell us to construct
    938  1.164    scottr 	 * bootdev using the SCSI ID passed in via the environment.
    939  1.183    scottr 	 */
    940  1.164    scottr 	root_scsi_id = getenv("ROOT_SCSI_ID");
    941  1.272     shiba 	root_ata_dev = getenv("ROOT_ATA_DEV");
    942  1.164    scottr 	if (((mac68k_machine.booter_version < CURRENTBOOTERVER) ||
    943  1.272     shiba 	    (flag & 0x40000)) && bootdev == 0) {
    944  1.272     shiba 		if (root_ata_dev) {
    945  1.272     shiba 			/*
    946  1.272     shiba 			 * Consider only internal IDE drive.
    947  1.272     shiba 			 * Buses(=channel) will be always 0.
    948  1.272     shiba 			 * Because 68k Mac has only single channel.
    949  1.272     shiba 			 */
    950  1.272     shiba 			switch (root_ata_dev) {
    951  1.272     shiba 			default: /* fall through */
    952  1.272     shiba 			case 0xffffffe0: /* buses,drive = 0,0 */
    953  1.272     shiba 			case 0x20: /* buses,drive = 1,0 */
    954  1.272     shiba 			case 0x21: /* buses,drive = 1,1 */
    955  1.272     shiba 				bootdev = MAKEBOOTDEV(22, 0, 0, 0, 0);
    956  1.272     shiba 				break;
    957  1.272     shiba 			case 0xffffffe1: /* buses,drive = 0,1 */
    958  1.272     shiba 				bootdev = MAKEBOOTDEV(22, 0, 0, 1, 0);
    959  1.272     shiba 				break;
    960  1.272     shiba 			}
    961  1.272     shiba 		} else {
    962  1.272     shiba 			bootdev = MAKEBOOTDEV(4, 0, 0, root_scsi_id, 0);
    963  1.272     shiba 		}
    964  1.272     shiba 	}
    965  1.164    scottr 
    966  1.197    scottr 	/*
    967  1.197    scottr 	 * Booter 1.11.3 and later pass a BOOTHOWTO variable with the
    968  1.197    scottr 	 * appropriate bits set.
    969  1.197    scottr 	 */
    970  1.197    scottr 	boothowto = getenv("BOOTHOWTO");
    971  1.164    scottr 	if (boothowto == 0)
    972  1.164    scottr 		boothowto = getenv("SINGLE_USER");
    973  1.129    scottr 
    974  1.129    scottr 	/*
    975  1.183    scottr 	 * Get end of symbols for kernel debugging
    976  1.183    scottr 	 */
    977  1.200    scottr 	esym = (int *)getenv("END_SYM");
    978  1.349  uebayasi #ifndef makeoptions_COPY_SYMTAB
    979  1.200    scottr 	if (esym == (int *)0)
    980  1.129    scottr #endif
    981  1.200    scottr 		esym = (int *)&end;
    982  1.129    scottr 
    983  1.129    scottr 	/* Get MacOS time */
    984  1.129    scottr 	macos_boottime = getenv("BOOTTIME");
    985  1.129    scottr 
    986  1.129    scottr 	/* Save GMT BIAS saved in Booter parameters dialog box */
    987  1.129    scottr 	macos_gmtbias = getenv("GMTBIAS");
    988  1.129    scottr 
    989  1.129    scottr 	/*
    990  1.183    scottr 	 * Save globals stolen from MacOS
    991  1.183    scottr 	 */
    992  1.129    scottr 
    993  1.313  christos 	ROMBase = (void *)getenv("ROMBASE");
    994  1.313  christos 	if (ROMBase == (void *)0) {
    995  1.313  christos 		ROMBase = (void *)ROMBASE;
    996   1.55    briggs 	}
    997  1.183    scottr 	MacOSROMBase = (unsigned long)ROMBase;
    998  1.129    scottr 	TimeDBRA = getenv("TIMEDBRA");
    999  1.183    scottr 	ADBDelay = (u_short)getenv("ADBDELAY");
   1000  1.129    scottr 	HwCfgFlags  = getenv("HWCFGFLAGS");
   1001  1.129    scottr 	HwCfgFlags2 = getenv("HWCFGFLAG2");
   1002  1.129    scottr 	HwCfgFlags3 = getenv("HWCFGFLAG3");
   1003  1.129    scottr  	ADBReInit_JTBL = getenv("ADBREINIT_JTBL");
   1004  1.313  christos  	mrg_ADBIntrPtr = (void *)getenv("ADBINTERRUPT");
   1005  1.267       chs 
   1006  1.267       chs 	/*
   1007  1.267       chs 	 * Check the ELF headers.
   1008  1.267       chs 	 */
   1009  1.267       chs 
   1010  1.267       chs 	ehdr = (void *)getenv("MARK_SYM");
   1011  1.267       chs 	if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0 ||
   1012  1.267       chs 	    ehdr->e_ident[EI_CLASS] != ELFCLASS32) {
   1013  1.267       chs 		return;
   1014  1.267       chs 	}
   1015  1.267       chs 
   1016  1.267       chs 	/*
   1017  1.267       chs 	 * Find the end of the symbols and strings.
   1018  1.267       chs 	 */
   1019  1.267       chs 
   1020  1.267       chs 	minsym = ~0;
   1021  1.267       chs 	shp = (Elf_Shdr *)(end + ehdr->e_shoff);
   1022  1.267       chs 	for (i = 0; i < ehdr->e_shnum; i++) {
   1023  1.267       chs 		if (shp[i].sh_type != SHT_SYMTAB &&
   1024  1.267       chs 		    shp[i].sh_type != SHT_STRTAB) {
   1025  1.267       chs 			continue;
   1026  1.267       chs 		}
   1027  1.267       chs 		minsym = MIN(minsym, (vaddr_t)end + shp[i].sh_offset);
   1028  1.267       chs 	}
   1029  1.267       chs 
   1030  1.267       chs 	symsize = 1;
   1031  1.267       chs 	ssym = (int *)ehdr;
   1032    1.8    briggs }
   1033    1.8    briggs 
   1034   1.55    briggs static long
   1035  1.305       jmc getenv(const char *str)
   1036    1.8    briggs {
   1037   1.55    briggs 	/*
   1038  1.183    scottr 	 * Returns the value of the environment variable "str".
   1039  1.183    scottr 	 *
   1040  1.183    scottr 	 * Format of the buffer is "var=val\0var=val\0...\0var=val\0\0".
   1041  1.183    scottr 	 *
   1042  1.183    scottr 	 * Returns 0 if the variable is not there, and 1 if the variable is
   1043  1.183    scottr 	 * there without an "=val".
   1044  1.183    scottr 	 */
   1045   1.55    briggs 
   1046  1.305       jmc 	char *s;
   1047  1.305       jmc 	const char *s1;
   1048  1.183    scottr 	int val, base;
   1049   1.55    briggs 
   1050   1.55    briggs 	s = envbuf;
   1051   1.55    briggs 	while (1) {
   1052   1.55    briggs 		for (s1 = str; *s1 && *s && *s != '='; s1++, s++) {
   1053   1.55    briggs 			if (toupper(*s1) != toupper(*s)) {
   1054   1.55    briggs 				break;
   1055   1.55    briggs 			}
   1056   1.55    briggs 		}
   1057   1.55    briggs 		if (*s1) {	/* No match */
   1058   1.55    briggs 			while (*s) {
   1059   1.55    briggs 				s++;
   1060   1.55    briggs 			}
   1061   1.55    briggs 			s++;
   1062   1.55    briggs 			if (*s == '\0') {	/* Not found */
   1063  1.312   thorpej 				/* Boolean flags are false (0) if not there */
   1064   1.55    briggs 				return 0;
   1065   1.55    briggs 			}
   1066   1.55    briggs 			continue;
   1067   1.55    briggs 		}
   1068   1.55    briggs 		if (*s == '=') {/* Has a value */
   1069   1.55    briggs 			s++;
   1070   1.55    briggs 			val = 0;
   1071   1.55    briggs 			base = 10;
   1072   1.55    briggs 			if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
   1073   1.55    briggs 				base = 16;
   1074   1.55    briggs 				s += 2;
   1075   1.55    briggs 			} else
   1076   1.55    briggs 				if (*s == '0') {
   1077   1.55    briggs 					base = 8;
   1078   1.55    briggs 				}
   1079   1.55    briggs 			while (*s) {
   1080   1.55    briggs 				if (toupper(*s) >= 'A' && toupper(*s) <= 'F') {
   1081   1.55    briggs 					val = val * base + toupper(*s) - 'A' + 10;
   1082   1.55    briggs 				} else {
   1083   1.55    briggs 					val = val * base + (*s - '0');
   1084   1.55    briggs 				}
   1085   1.55    briggs 				s++;
   1086   1.55    briggs 			}
   1087   1.55    briggs 			return val;
   1088   1.55    briggs 		} else {	/* TRUE (1) */
   1089   1.55    briggs 			return 1;
   1090   1.55    briggs 		}
   1091   1.55    briggs 	}
   1092    1.8    briggs }
   1093    1.8    briggs 
   1094   1.55    briggs /*
   1095  1.101    briggs  * ROM Vector information for calling drivers in ROMs
   1096  1.101    briggs  *
   1097  1.122    scottr  * According to information published on the Web by Apple, there have
   1098  1.122    scottr  * been 9 different ROM families used in the Mac since the introduction
   1099  1.122    scottr  * of the Lisa/XL through the latest PowerMacs (May 96).  Each family
   1100  1.122    scottr  * has zero or more version variants and in some cases a version variant
   1101  1.122    scottr  * may exist in one than one length format.  Generally any one specific
   1102  1.122    scottr  * Mac will use a common set of routines within the ROM and a model-specific
   1103  1.122    scottr  * set also in the ROM.  Luckily most of the routines used by NetBSD fall
   1104  1.122    scottr  * into the common set and can therefore be defined in the ROM Family.
   1105  1.122    scottr  * The offset addresses (address minus the ROM Base) of these common routines
   1106  1.122    scottr  * is the same for all machines which use that ROM.  The offset addresses of
   1107  1.122    scottr  * the machine-specific routines is generally different for each machine.
   1108  1.122    scottr  * The machine-specific routines currently used by NetBSD/mac68k include:
   1109  1.368    andvar  *       ADB_interrupt, PM_interrupt, ADBBase+130_interrupt,
   1110  1.122    scottr  *       PMgrOp, jClkNoMem, Egret, InitEgret, and ADBReInit_JTBL
   1111  1.122    scottr  *
   1112  1.122    scottr  * It is possible that the routine at "jClkNoMem" is a common routine, but
   1113  1.122    scottr  * some variation in addresses has been seen.  Also, execept for the very
   1114  1.122    scottr  * earliest machines which used Egret, the machine-specific value of the
   1115  1.122    scottr  * Egret routine may be unimportant as the machine-specific InitEgret code
   1116  1.122    scottr  * seems to always set the OS Trap vector for Egret.
   1117  1.122    scottr  *
   1118  1.122    scottr  * Only three of the nine different ROMs are important to NetBSD/mac68k.
   1119  1.122    scottr  * All other ROMs are used in early model Macs which are unable to run
   1120  1.122    scottr  * NetBSD due to other hardware limitations such as 68000 CPU, no MMU
   1121  1.122    scottr  * capability, or used only in PowerMacs.  The three that we are interested
   1122  1.122    scottr  * in are:
   1123  1.122    scottr  *
   1124  1.122    scottr  * ROM Family $0178 - used in the II, IIx, IIcx, and SE/30
   1125  1.122    scottr  *            All machines which use this ROM are now supported by NetBSD.
   1126  1.122    scottr  *            There are no machine-dependent routines in these ROMs used by
   1127  1.122    scottr  *            NetBSD/mac68k.  This ROM is always 256K in length.
   1128  1.122    scottr  *
   1129  1.122    scottr  * ROM Family $067c - used in Classic, Color Classic, Color Classic II,
   1130  1.122    scottr  *                      IIci, IIsi, IIvi, IIvx, IIfx, LC, LC II, LC III,
   1131  1.122    scottr  *                      LC III+, LC475, LC520, LC550, LC575, LC580, LC630,
   1132  1.122    scottr  *                      MacTV, P200, P250, P275, P400/405/410/430, P450,
   1133  1.122    scottr  *                      P460/466/467, P475/476, P520, P550/560, P575/577/578,
   1134  1.122    scottr  *                      P580/588, P600, P630/631/635/636/637/638/640, Q605,
   1135  1.122    scottr  *                      Q610, C610, Q630, C650, Q650, Q700, Q800, Q900, Q950,
   1136  1.122    scottr  *                      PB140, PB145/145B, PB150, PB160, PB165, PB165c, PB170,
   1137  1.122    scottr  *                      PB180, PB180c, Duo 210, Duo 230, Duo 250, Duo 270c,
   1138  1.122    scottr  *                      Duo280, Duo 280c, PB 520/520c/540/540c/550
   1139  1.122    scottr  *             This is the so-called "Universal" ROM used in almost all 68K
   1140  1.122    scottr  *             machines. There are machine-dependent and machine-independent
   1141  1.122    scottr  *             routines used by NetBSD/mac68k in this ROM, and except for the
   1142  1.122    scottr  *             PowerBooks and the Duos, this ROM seems to be fairly well
   1143  1.122    scottr  *             known by NetBSD/mac68k.  Desktop machines listed here that are
   1144  1.122    scottr  *             not yet running NetBSD probably only lack the necessary
   1145  1.122    scottr  *             addresses for the machine-dependent routines, or are waiting
   1146  1.122    scottr  *             for IDE disk support.  This ROM is generally 1Meg in length,
   1147  1.122    scottr  *             however when used in the IIci, IIfx, IIsi, LC, Classic II, and
   1148  1.122    scottr  *             P400/405/410/430 it is 512K in length, and when used in the
   1149  1.122    scottr  *             PB 520/520c/540/540c/550 it is 2Meg in length.
   1150  1.122    scottr  *
   1151  1.122    scottr  * ROM Family - $077d - used in C660AV/Q660AV, Q840AV
   1152  1.122    scottr  *             The "Universal" ROM used on the PowerMacs and used in the
   1153  1.122    scottr  *             68K line for the AV Macs only.  When used in the 68K AV
   1154  1.122    scottr  *             machines the ROM is 2Meg in length; all uses in the PowerMac
   1155  1.122    scottr  *             use a length of 4Meg.
   1156  1.101    briggs  *
   1157  1.101    briggs  *		Bob Nestor - <rnestor (at) metronet.com>
   1158   1.55    briggs  */
   1159   1.55    briggs static romvec_t romvecs[] =
   1160    1.8    briggs {
   1161   1.55    briggs 	/* Vectors verified for II, IIx, IIcx, SE/30 */
   1162   1.55    briggs 	{			/* 0 */
   1163   1.55    briggs 		"Mac II class ROMs",
   1164  1.313  christos 		(void *)0x40807002,	/* where does ADB interrupt */
   1165  1.313  christos 		(void *)0x0,		/* PM interrupt (?) */
   1166  1.313  christos 		(void *)0x4080a4d8,	/* ADBBase + 130 interrupt; whatzit? */
   1167  1.313  christos 		(void *)0x40807778,	/* CountADBs */
   1168  1.313  christos 		(void *)0x40807792,	/* GetIndADB */
   1169  1.313  christos 		(void *)0x408077be,	/* GetADBInfo */
   1170  1.313  christos 		(void *)0x408077c4,	/* SetADBInfo */
   1171  1.313  christos 		(void *)0x40807704,	/* ADBReInit */
   1172  1.313  christos 		(void *)0x408072fa,	/* ADBOp */
   1173  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1174  1.313  christos 		(void *)0x4080d6d0,	/* WriteParam */
   1175  1.313  christos 		(void *)0x4080d6fa,	/* SetDateTime */
   1176  1.313  christos 		(void *)0x4080dbe8,	/* InitUtil */
   1177  1.313  christos 		(void *)0x4080dd78,	/* ReadXPRam */
   1178  1.313  christos 		(void *)0x4080dd82,	/* WriteXPRam */
   1179  1.313  christos 		(void *)0x4080ddd6,	/* jClkNoMem */
   1180  1.313  christos 		(void *)0x0,		/* ADBAlternateInit */
   1181  1.313  christos 		(void *)0x0,		/* Egret */
   1182  1.313  christos 		(void *)0x0,		/* InitEgret */
   1183  1.313  christos 		(void *)0x0,		/* ADBReInit_JTBL */
   1184  1.313  christos 		(void *)0x0,		/* ROMResourceMap List Head */
   1185  1.313  christos 		(void *)0x40814c58,	/* FixDiv */
   1186  1.313  christos 		(void *)0x40814b64,	/* FixMul */
   1187   1.31    briggs 	},
   1188   1.31    briggs 	/*
   1189   1.91    briggs 	 * Vectors verified for PB 140, PB 145, PB 170
   1190   1.31    briggs 	 * (PB 100?)
   1191   1.31    briggs 	 */
   1192   1.55    briggs 	{			/* 1 */
   1193   1.31    briggs 		"Powerbook class ROMs",
   1194  1.313  christos 		(void *)0x4088ae5e,	/* ADB interrupt */
   1195  1.313  christos 		(void *)0x408885ec,	/* PB ADB interrupt */
   1196  1.313  christos 		(void *)0x4088ae0e,	/* ADBBase + 130 interrupt; whatzit? */
   1197  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1198  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1199  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1200  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1201  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1202  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1203  1.313  christos 		(void *)0x408888ec,	/* PMgrOp */
   1204  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1205  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1206  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1207  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1208  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1209  1.313  christos 		(void *)0x4080b1e4,	/* jClkNoMem */
   1210  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1211  1.313  christos 		(void *)0x40814800,	/* Egret */
   1212  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1213  1.313  christos 		(void *)0x0,		/* ADBReInit_JTBL */
   1214  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1215  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1216  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1217   1.31    briggs 	},
   1218   1.31    briggs 	/*
   1219   1.31    briggs 	 * Vectors verified for IIsi, IIvx, IIvi
   1220   1.31    briggs 	 */
   1221   1.55    briggs 	{			/* 2 */
   1222   1.31    briggs 		"Mac IIsi class ROMs",
   1223  1.313  christos 		(void *)0x40814912,	/* ADB interrupt */
   1224  1.313  christos 		(void *)0x0,		/* PM ADB interrupt */
   1225  1.313  christos 		(void *)0x408150f0,	/* ADBBase + 130 interrupt; whatzit? */
   1226  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1227  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1228  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1229  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1230  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1231  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1232  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1233  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1234  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1235  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1236  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1237  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1238  1.313  christos 		(void *)0x4080b1e4,	/* jClkNoMem */
   1239  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1240  1.313  christos 		(void *)0x40814800,	/* Egret */
   1241  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1242  1.313  christos 		(void *)0x0,		/* ADBReInit_JTBL */
   1243  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1244  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1245  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1246   1.31    briggs 	},
   1247   1.31    briggs 	/*
   1248   1.31    briggs 	 * Vectors verified for Mac Classic II and LC II
   1249  1.118    scottr 	 * (Other LC's?  680x0 Performas?)
   1250   1.31    briggs 	 */
   1251   1.55    briggs 	{			/* 3 */
   1252   1.31    briggs 		"Mac Classic II ROMs",
   1253  1.313  christos 		(void *)0x40a14912,	/* ADB interrupt */
   1254  1.313  christos 		(void *)0x0,		/* PM ADB interrupt */
   1255  1.313  christos 		(void *)0x40a150f0,	/* ADBBase + 130 interrupt; whatzit? */
   1256  1.313  christos 		(void *)0x40a0a360,	/* CountADBs */
   1257  1.313  christos 		(void *)0x40a0a37a,	/* GetIndADB */
   1258  1.313  christos 		(void *)0x40a0a3a6,	/* GetADBInfo */
   1259  1.313  christos 		(void *)0x40a0a3ac,	/* SetADBInfo */
   1260  1.313  christos 		(void *)0x40a0a752,	/* ADBReInit */
   1261  1.313  christos 		(void *)0x40a0a3dc,	/* ADBOp */
   1262  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1263  1.313  christos 		(void *)0x40a0c05c,	/* WriteParam */
   1264  1.313  christos 		(void *)0x40a0c086,	/* SetDateTime */
   1265  1.313  christos 		(void *)0x40a0c5cc,	/* InitUtil */
   1266  1.313  christos 		(void *)0x40a0b186,	/* ReadXPRam */
   1267  1.313  christos 		(void *)0x40a0b190,	/* WriteXPRam */
   1268  1.313  christos 		(void *)0x40a0b1e4,	/* jClkNoMem */
   1269  1.313  christos 		(void *)0x40a0a818,	/* ADBAlternateInit */
   1270  1.313  christos 		(void *)0x40a14800,	/* Egret */
   1271  1.313  christos 		(void *)0x40a147c4,	/* InitEgret */
   1272  1.313  christos 		(void *)0x40a03ba6,	/* ADBReInit_JTBL */
   1273  1.313  christos 		(void *)0x40a7eb90,	/* ROMResourceMap List Head */
   1274  1.313  christos 		(void *)0x40a1c406,	/* FixDiv, wild guess */
   1275  1.313  christos 		(void *)0x40a1c312,	/* FixMul, wild guess */
   1276   1.31    briggs 	},
   1277   1.31    briggs 	/*
   1278   1.70    briggs 	 * Vectors verified for IIci, Q700
   1279   1.31    briggs 	 */
   1280   1.55    briggs 	{			/* 4 */
   1281   1.70    briggs 		"Mac IIci/Q700 ROMs",
   1282  1.313  christos 		(void *)0x4080a700,	/* ADB interrupt */
   1283  1.313  christos 		(void *)0x0,		/* PM ADB interrupt */
   1284  1.313  christos 		(void *)0x4080a5aa,	/* ADBBase + 130 interrupt; whatzit? */
   1285  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1286  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1287  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1288  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1289  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1290  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1291  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1292  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1293  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1294  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1295  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1296  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1297  1.313  christos 		(void *)0x4080b1e4,	/* jClkNoMem */
   1298  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1299  1.313  christos 		(void *)0x0,		/* Egret */
   1300  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1301  1.313  christos 		(void *)0x0,		/* ADBReInit_JTBL */
   1302  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1303  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1304  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1305   1.31    briggs 	},
   1306   1.31    briggs 	/*
   1307  1.122    scottr 	 * Vectors verified for Duo 230, PB 180, PB 160, PB 165/165C
   1308  1.122    scottr 	 * (Duo 210?  Duo 250?  Duo 270?)
   1309   1.31    briggs 	 */
   1310   1.55    briggs 	{			/* 5 */
   1311   1.31    briggs 		"2nd Powerbook class ROMs",
   1312  1.313  christos 		(void *)0x408b2eec,	/* ADB interrupt */
   1313  1.313  christos 		(void *)0x408885ec,	/* PB ADB interrupt */
   1314  1.313  christos 		(void *)0x408b2e76,	/* ADBBase + 130 interrupt; whatzit? */
   1315  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1316  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1317  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1318  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1319  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1320  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1321  1.313  christos 		(void *)0x408888ec,	/* PMgrOp */
   1322  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1323  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1324  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1325  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1326  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1327  1.313  christos 		(void *)0x408b39b2,	/* jClkNoMem */	/* From PB180 */
   1328  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1329  1.313  christos 		(void *)0x40814800,	/* Egret */
   1330  1.313  christos 		(void *)0x40888400,	/* InitPwrMgr */ /* From PB180 */
   1331  1.313  christos 		(void *)0x408cce28,	/* ADBReInit_JTBL -- from PB160*/
   1332  1.313  christos 		(void *)0x4087eb90,	/* ROMRsrcMap List Head -- from PB160*/
   1333  1.313  christos 		(void *)0x4081c406,	/* FixDiv, wild guess */
   1334  1.313  christos 		(void *)0x4081c312,	/* FixMul, wild guess */
   1335   1.31    briggs 	},
   1336   1.31    briggs 	/*
   1337  1.122    scottr 	 * Vectors verified for the Quadra, Centris 650
   1338  1.122    scottr 	 *  (610, Q800?)
   1339   1.31    briggs 	 */
   1340   1.55    briggs 	{			/* 6 */
   1341   1.31    briggs 		"Quadra/Centris ROMs",
   1342  1.313  christos 		(void *)0x408b2dea,	/* ADB int */
   1343  1.313  christos 		(void *)0x0,		/* PM intr */
   1344  1.313  christos  		(void *)0x408b2c72,	/* ADBBase + 130 */
   1345  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1346  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1347  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1348  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1349  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1350  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1351  1.313  christos 		(void *)0x40809ae6,	/* PMgrOp */
   1352  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1353  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1354  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1355  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1356  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1357  1.313  christos 		(void *)0x408b39b6,	/* jClkNoMem */
   1358  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1359  1.313  christos 		(void *)0x40814800,	/* Egret */
   1360  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1361  1.313  christos 		(void *)0x408d2b64,	/* ADBReInit_JTBL */
   1362  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1363  1.313  christos 		(void *)0x4081c406,	/* FixDiv, wild guess */
   1364  1.313  christos 		(void *)0x4081c312,	/* FixMul, wild guess */
   1365   1.31    briggs 	},
   1366   1.31    briggs 	/*
   1367  1.122    scottr 	 * Vectors verified for the Quadra 660AV
   1368  1.122    scottr 	 *  (Quadra 840AV?)
   1369   1.31    briggs 	 */
   1370   1.55    briggs 	{			/* 7 */
   1371   1.31    briggs 		"Quadra AV ROMs",
   1372  1.313  christos 		(void *)0x4080cac6,	/* ADB int */
   1373  1.313  christos 		(void *)0x0,		/* PM int */
   1374  1.313  christos 		(void *)0x40805cd4,	/* ADBBase + 130 */
   1375  1.313  christos 		(void *)0x40839600,	/* CountADBs */
   1376  1.313  christos 		(void *)0x4083961a,	/* GetIndADB */
   1377  1.313  christos 		(void *)0x40839646,	/* GetADBInfo */
   1378  1.313  christos 		(void *)0x4083964c,	/* SetADBInfo */
   1379  1.313  christos 		(void *)0x408397b8,	/* ADBReInit */
   1380  1.313  christos 		(void *)0x4083967c,	/* ADBOp */
   1381  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1382  1.313  christos 		(void *)0x4081141c,	/* WriteParam */
   1383  1.313  christos 		(void *)0x4081144e,	/* SetDateTime */
   1384  1.313  christos 		(void *)0x40811930,	/* InitUtil */
   1385  1.313  christos 		(void *)0x4080b624,	/* ReadXPRam */
   1386  1.313  christos 		(void *)0x4080b62e,	/* WriteXPRam */
   1387  1.313  christos 		(void *)0x40806884,	/* jClkNoMem */
   1388  1.313  christos 		(void *)0x408398c2,	/* ADBAlternateInit */
   1389  1.313  christos 		(void *)0x4080cada,	/* Egret */
   1390  1.313  christos 		(void *)0x4080de14,	/* InitEgret */
   1391  1.313  christos 		(void *)0x408143b8,	/* ADBReInit_JTBL */
   1392  1.313  christos 		(void *)0x409bdb60,	/* ROMResourceMap List Head */
   1393  1.313  christos 		(void *)0x4083b3d8,	/* FixDiv */
   1394  1.313  christos 		(void *)0x4083b2e4,	/* FixMul */
   1395   1.31    briggs 	},
   1396   1.31    briggs 	/*
   1397  1.109    scottr 	 * PB 540, PB 550
   1398   1.31    briggs 	 * (PB 520?  Duo 280?)
   1399   1.31    briggs 	 */
   1400   1.55    briggs 	{			/* 8 */
   1401   1.31    briggs 		"68040 PowerBook ROMs",
   1402  1.313  christos 		(void *)0x400b2efc,	/* ADB int */
   1403  1.313  christos 		(void *)0x400d8e66,	/* PM int */
   1404  1.313  christos 		(void *)0x400b2e86,	/* ADBBase + 130 */
   1405  1.313  christos 		(void *)0x4000a360,	/* CountADBs */
   1406  1.313  christos 		(void *)0x4000a37a,	/* GetIndADB */
   1407  1.313  christos 		(void *)0x4000a3a6,	/* GetADBInfo */
   1408  1.313  christos 		(void *)0x4000a3ac,	/* SetADBInfo */
   1409  1.313  christos 		(void *)0x4000a752,	/* ADBReInit */
   1410  1.313  christos 		(void *)0x4000a3dc,	/* ADBOp */
   1411  1.313  christos 		(void *)0x400d9302,	/* PmgrOp */
   1412  1.313  christos 		(void *)0x4000c05c,	/* WriteParam */
   1413  1.313  christos 		(void *)0x4000c086,	/* SetDateTime */
   1414  1.313  christos 		(void *)0x4000c5cc,	/* InitUtil */
   1415  1.313  christos 		(void *)0x4000b186,	/* ReadXPRam */
   1416  1.313  christos 		(void *)0x4000b190,	/* WriteXPRam */
   1417  1.313  christos 		(void *)0x400b3c08,	/* jClkNoMem */
   1418  1.313  christos 		(void *)0x4000a818,	/* ADBAlternateInit */
   1419  1.313  christos 		(void *)0x40009ae6,	/* Egret */ /* From PB520 */
   1420  1.313  christos 		(void *)0x400147c4,	/* InitEgret */
   1421  1.313  christos 		(void *)0x400a7a5c,	/* ADBReInit_JTBL */
   1422  1.313  christos 		(void *)0x4007eb90,	/* ROMResourceMap List Head */
   1423  1.313  christos 		(void *)0x4001c406,	/* FixDiv, wild guess */
   1424  1.313  christos 		(void *)0x4001c312,	/* FixMul, wild guess */
   1425   1.31    briggs 	},
   1426   1.31    briggs 	/*
   1427  1.122    scottr 	 * Verified for the Q605
   1428   1.31    briggs 	 */
   1429   1.55    briggs 	{			/* 9 */
   1430   1.31    briggs 		"Quadra/Centris 605 ROMs",
   1431  1.313  christos 		(void *)0x408a9b56,	/* ADB int */
   1432  1.313  christos 		(void *)0x0,		/* PM int */
   1433  1.313  christos 		(void *)0x408b2f94,	/* ADBBase + 130 */
   1434  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1435  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1436  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1437  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1438  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1439  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1440  1.313  christos 		(void *)0x0,		/* PmgrOp */
   1441  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1442  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1443  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1444  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1445  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1446  1.313  christos 		(void *)0x408b3bf8,	/* jClkNoMem */
   1447  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1448  1.313  christos 		(void *)0x408a99c0,	/* Egret */
   1449  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1450  1.313  christos 		(void *)0x408a82c0,	/* ADBReInit_JTBL */
   1451  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1452  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1453  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1454   1.31    briggs 	},
   1455   1.31    briggs 	/*
   1456   1.91    briggs 	 * Vectors verified for Duo 270c, PB150
   1457   1.31    briggs 	 */
   1458   1.55    briggs 	{			/* 10 */
   1459   1.31    briggs 		"Duo 270C ROMs",
   1460  1.313  christos 		(void *)0x408b2efc,	/* ADB interrupt */
   1461  1.313  christos 		(void *)0x408885ec,	/* PB ADB interrupt */
   1462  1.313  christos 		(void *)0x408b2e86,	/* ADBBase + 130 interrupt; whatzit? */
   1463  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1464  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1465  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1466  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1467  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1468  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1469  1.313  christos 		(void *)0x408888ec,	/* PMgrOp */
   1470  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1471  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1472  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1473  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1474  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1475  1.313  christos 		(void *)0x408b3bf8,	/* jClkNoMem */ /* from PB 150 */
   1476  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1477  1.313  christos 		(void *)0x40814800,	/* Egret */
   1478  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1479  1.313  christos 		(void *)0x0,		/* ADBReInit_JTBL */
   1480  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1481  1.313  christos 		(void *)0x4081c406,	/* FixDiv, wild guess */
   1482  1.313  christos 		(void *)0x4081c312,	/* FixMul, wild guess */
   1483   1.91    briggs 	},
   1484   1.91    briggs 	/*
   1485   1.91    briggs 	 * Vectors verified for Performa/LC 550
   1486   1.91    briggs 	 */
   1487   1.91    briggs 	{			/* 11 */
   1488   1.91    briggs 		"P/LC 550 ROMs",
   1489  1.313  christos 		(void *)0x408d16d6,	/* ADB interrupt */
   1490  1.313  christos 		(void *)0x0,		/* PB ADB interrupt */
   1491  1.313  christos 		(void *)0x408b2f84,	/* ADBBase + 130 interrupt; whatzit? */
   1492  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1493  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1494  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1495  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1496  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1497  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1498  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1499  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1500  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1501  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1502  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1503  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1504  1.313  christos 		(void *)0x408b3c04,	/* jClkNoMem */
   1505  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1506  1.313  christos 		(void *)0x408d1450,	/* Egret */
   1507  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1508  1.313  christos 		(void *)0x408d24a4,	/* ADBReInit_JTBL */
   1509  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1510  1.313  christos 		(void *)0x4081c406,	/* FixDiv for P550 */
   1511  1.313  christos 		(void *)0x4081c312,	/* FixMul for P550 */
   1512   1.31    briggs 	},
   1513   1.99    briggs 	/*
   1514  1.122    scottr 	 * Vectors verified for the MacTV
   1515   1.99    briggs 	 */
   1516   1.99    briggs 	{			/* 12 */
   1517   1.99    briggs 		"MacTV ROMs",
   1518  1.313  christos 		(void *)0x40acfed6,	/* ADB interrupt */
   1519  1.313  christos 		(void *)0x0,		/* PB ADB interrupt */
   1520  1.313  christos 		(void *)0x40ab2f84,	/* ADBBase + 130 interrupt; whatzit? */
   1521  1.313  christos 		(void *)0x40a0a360,	/* CountADBs */
   1522  1.313  christos 		(void *)0x40a0a37a,	/* GetIndADB */
   1523  1.313  christos 		(void *)0x40a0a3a6,	/* GetADBInfo */
   1524  1.313  christos 		(void *)0x40a0a3ac,	/* SetADBInfo */
   1525  1.313  christos 		(void *)0x40a0a752,	/* ADBReInit */
   1526  1.313  christos 		(void *)0x40a0a3dc,	/* ADBOp */
   1527  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1528  1.313  christos 		(void *)0x40a0c05c,	/* WriteParam */
   1529  1.313  christos 		(void *)0x40a0c086,	/* SetDateTime */
   1530  1.313  christos 		(void *)0x40a0c5cc,	/* InitUtil */
   1531  1.313  christos 		(void *)0x40a0b186,	/* ReadXPRam */
   1532  1.313  christos 		(void *)0x40a0b190,	/* WriteXPRam */
   1533  1.313  christos 		(void *)0x40ab3bf4,	/* jClkNoMem */
   1534  1.313  christos 		(void *)0x40a0a818,	/* ADBAlternateInit */
   1535  1.313  christos 		(void *)0x40acfd40,	/* Egret */
   1536  1.313  christos 		(void *)0x40a147c4,	/* InitEgret */
   1537  1.313  christos 		(void *)0x40a038a0,	/* ADBReInit_JTBL */
   1538  1.313  christos 		(void *)0x40a7eb90,	/* ROMResourceMap List Head */
   1539  1.313  christos 		(void *)0x40a1c406,	/* FixDiv */
   1540  1.313  christos 		(void *)0x40a1c312,	/* FixMul */
   1541   1.99    briggs 	},
   1542  1.112    scottr 	/*
   1543  1.122    scottr 	 * Vectors verified for the Quadra630
   1544  1.112    scottr 	 */
   1545  1.112    scottr 	{			/* 13 */
   1546  1.112    scottr 		"Quadra630 ROMs",
   1547  1.313  christos 		(void *)0x408a9bd2,	/* ADB int */
   1548  1.313  christos 		(void *)0x0,		/* PM intr */
   1549  1.313  christos  		(void *)0x408b2f94,	/* ADBBase + 130 */
   1550  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1551  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1552  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1553  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1554  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1555  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1556  1.313  christos 		(void *)0,		/* PMgrOp */
   1557  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1558  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1559  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1560  1.313  christos 		(void *)0x4080b186,	/* Wild guess at ReadXPRam */
   1561  1.313  christos 		(void *)0x4080b190,	/* Wild guess at WriteXPRam */
   1562  1.313  christos 		(void *)0x408b39f4,	/* jClkNoMem */
   1563  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1564  1.313  christos 		(void *)0x408a99c0,	/* Egret */
   1565  1.313  christos 		(void *)0x408147c8,	/* InitEgret */
   1566  1.313  christos 		(void *)0x408a7ef8,	/* ADBReInit_JTBL */
   1567  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1568  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1569  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1570  1.112    scottr 	},
   1571  1.118    scottr 	/*
   1572  1.118    scottr 	 * Vectors verified for LC III
   1573  1.118    scottr 	 */
   1574  1.118    scottr 	{			/* 14 */
   1575  1.118    scottr 		"LC III ROMs",
   1576  1.313  christos 		(void *)0x40814912,	/* ADB interrupt */
   1577  1.313  christos 		(void *)0x0,		/* PM ADB interrupt */
   1578  1.313  christos 		(void *)0x408b2f94,	/* ADBBase + 130 interrupt */
   1579  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1580  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1581  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1582  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1583  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1584  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1585  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1586  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1587  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1588  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1589  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1590  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1591  1.313  christos 		(void *)0x408b39b6,	/* jClkNoMem */
   1592  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1593  1.313  christos 		(void *)0x40814800,	/* Egret */
   1594  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1595  1.313  christos 		(void *)0x408d2918,	/* ADBReInit_JTBL */
   1596  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1597  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1598  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1599  1.118    scottr 	},
   1600  1.122    scottr 	/*
   1601  1.122    scottr 	 * Vectors verified for the LC520
   1602  1.122    scottr 	 */
   1603  1.122    scottr 	{			/* 15 */
   1604  1.122    scottr 		"MacLC520 ROMs",
   1605  1.313  christos 		(void *)0x408d16d6,	/* ADB interrupt */
   1606  1.313  christos 		(void *)0x0,		/* PB ADB interrupt */
   1607  1.313  christos 		(void *)0x408b2f84,	/* ADBBase + 130 interrupt; whatzit? */
   1608  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1609  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1610  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1611  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1612  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1613  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1614  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1615  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1616  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1617  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1618  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1619  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1620  1.313  christos 		(void *)0x408b3c04,	/* jClkNoMem */
   1621  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1622  1.313  christos 		(void *)0x408d1450,	/* Egret */
   1623  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1624  1.313  christos 		(void *)0x408d2460,	/* ADBReInit_JTBL */
   1625  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1626  1.313  christos 		(void *)0x4081c406,	/* FixDiv for P520 */
   1627  1.313  christos 		(void *)0x4081c312,	/* FixMul for P520 */
   1628  1.122    scottr 	},
   1629  1.122    scottr 	/*
   1630  1.122    scottr 	 * Vectors verified for the LC 575/577/578
   1631  1.122    scottr 	 */
   1632  1.122    scottr 	{			/* 16 */
   1633  1.122    scottr 		"MacLC575 ROMs",
   1634  1.313  christos 		(void *)0x408a9b56,	/* ADB interrupt */
   1635  1.313  christos 		(void *)0x0,		/* PB ADB interrupt */
   1636  1.313  christos 		(void *)0x408b2f94,	/* ADBBase + 130 interrupt; whatzit? */
   1637  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1638  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1639  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1640  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1641  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1642  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1643  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1644  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1645  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1646  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1647  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1648  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1649  1.313  christos 		(void *)0x408b3bf8,	/* jClkNoMem */
   1650  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1651  1.313  christos 		(void *)0x408a99c0,	/* Egret */
   1652  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1653  1.313  christos 		(void *)0x408a81a0,	/* ADBReInit_JTBL */
   1654  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1655  1.313  christos 		(void *)0x4081c406,	/* FixDiv for P520 */
   1656  1.313  christos 		(void *)0x4081c312,	/* FixMul for P520 */
   1657  1.122    scottr 	},
   1658  1.122    scottr 	/*
   1659  1.122    scottr 	 * Vectors verified for the Quadra 950
   1660  1.122    scottr 	 */
   1661  1.122    scottr 	{			/* 17 */
   1662  1.122    scottr 		"Quadra950 class ROMs",
   1663  1.313  christos 		(void *)0x40814912,	/* ADB interrupt */
   1664  1.313  christos 		(void *)0x0,		/* PM ADB interrupt */
   1665  1.313  christos 		(void *)0x4080a4d8,	/* ADBBase + 130 interrupt; whatzit? */
   1666  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1667  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1668  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1669  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1670  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1671  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1672  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1673  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1674  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1675  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1676  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1677  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1678  1.313  christos 		(void *)0x4080b1e4,	/* jClkNoMem */
   1679  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1680  1.313  christos 		(void *)0x40814800,	/* Egret */
   1681  1.313  christos 		(void *)0x408147c4,	/* InitEgret */
   1682  1.313  christos 		(void *)0x408038bc,	/* ADBReInit_JTBL */
   1683  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1684  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1685  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1686  1.122    scottr 	},
   1687  1.160    scottr 	/*
   1688  1.160    scottr 	 * Vectors verified for the Mac IIfx
   1689  1.160    scottr 	 */
   1690  1.160    scottr 	{			/* 18 */
   1691  1.160    scottr 		"Mac IIfx ROMs",
   1692  1.313  christos 		(void *)0x40809f4a,	/* ADB interrupt */
   1693  1.313  christos 		(void *)0x0,		/* PM ADB interrupt */
   1694  1.313  christos 		(void *)0x4080a4d8,	/* ADBBase + 130 interrupt */
   1695  1.313  christos 		(void *)0x4080a360,	/* CountADBs */
   1696  1.313  christos 		(void *)0x4080a37a,	/* GetIndADB */
   1697  1.313  christos 		(void *)0x4080a3a6,	/* GetADBInfo */
   1698  1.313  christos 		(void *)0x4080a3ac,	/* SetADBInfo */
   1699  1.313  christos 		(void *)0x4080a752,	/* ADBReInit */
   1700  1.313  christos 		(void *)0x4080a3dc,	/* ADBOp */
   1701  1.313  christos 		(void *)0x0,		/* PMgrOp */
   1702  1.313  christos 		(void *)0x4080c05c,	/* WriteParam */
   1703  1.313  christos 		(void *)0x4080c086,	/* SetDateTime */
   1704  1.313  christos 		(void *)0x4080c5cc,	/* InitUtil */
   1705  1.313  christos 		(void *)0x4080b186,	/* ReadXPRam */
   1706  1.313  christos 		(void *)0x4080b190,	/* WriteXPRam */
   1707  1.313  christos 		(void *)0x4080b1e4,	/* jClkNoMem */
   1708  1.313  christos 		(void *)0x4080a818,	/* ADBAlternateInit */
   1709  1.313  christos 		(void *)0x0,		/* Egret */
   1710  1.313  christos 		(void *)0x0,		/* InitEgret */
   1711  1.313  christos 		(void *)0x408037c0,	/* ADBReInit_JTBL */
   1712  1.313  christos 		(void *)0x4087eb90,	/* ROMResourceMap List Head */
   1713  1.313  christos 		(void *)0x4081c406,	/* FixDiv */
   1714  1.313  christos 		(void *)0x4081c312,	/* FixMul */
   1715  1.160    scottr 	},
   1716  1.184    scottr 	/*
   1717  1.184    scottr 	 * Vectors verified for the Performa 588 (and 580?)
   1718  1.184    scottr 	 */
   1719  1.184    scottr 	{			/* 19 */
   1720  1.184    scottr 		"Performa 580 ROMs",
   1721  1.313  christos 		(void *) 0x4089a8be,	/* ADB interrupt */
   1722  1.313  christos 		(void *) 0x0,		/* PM ADB interrupt */
   1723  1.313  christos 		(void *) 0x408b2f94,	/* ADBBase + 130 interrupt */
   1724  1.313  christos 		(void *) 0x4080a360,	/* CountADBs */
   1725  1.313  christos 		(void *) 0x4080a37a,	/* GetIndADB */
   1726  1.313  christos 		(void *) 0x4080a3a6,	/* GetADBInfo */
   1727  1.313  christos 		(void *) 0x4080a3ac,	/* SetADBInfo */
   1728  1.313  christos 		(void *) 0x4080a752,	/* ADBReInit */
   1729  1.313  christos 		(void *) 0x4080a3dc,	/* ADBOp */
   1730  1.313  christos 		(void *) 0x0,		/* PMgrOp */
   1731  1.313  christos 		(void *) 0x4080c05c,	/* WriteParam */
   1732  1.313  christos 		(void *) 0x4080c086,	/* SetDateTime */
   1733  1.313  christos 		(void *) 0x4080c5cc,	/* InitUtil */
   1734  1.313  christos 		(void *) 0x4080b186,	/* ReadXPRam */
   1735  1.313  christos 		(void *) 0x4080b190,	/* WriteXPRam */
   1736  1.313  christos 		(void *) 0x408b3bf4,	/* jClkNoMem */
   1737  1.313  christos 		(void *) 0x4080a818,	/* ADBAlternateInit */
   1738  1.313  christos 		(void *) 0x408a99c0,	/* Egret */
   1739  1.313  christos 		(void *) 0x408147c8,	/* InitEgret */
   1740  1.313  christos 		(void *) 0x408a7f74,	/* ADBReInit_JTBL */
   1741  1.313  christos 		(void *) 0x4087eb90,	/* ROMResourceMap List Head */
   1742  1.313  christos 		(void *) 0x4081c406,	/* FixDiv */
   1743  1.313  christos 		(void *) 0x4081c312,	/* FixMul */
   1744  1.184    scottr 	},
   1745   1.31    briggs 	/* Please fill these in! -BG */
   1746   1.31    briggs };
   1747   1.31    briggs 
   1748   1.31    briggs 
   1749   1.31    briggs struct cpu_model_info cpu_models[] = {
   1750   1.21    briggs 
   1751   1.21    briggs /* The first four. */
   1752   1.55    briggs 	{MACH_MACII, "II ", "", MACH_CLASSII, &romvecs[0]},
   1753   1.55    briggs 	{MACH_MACIIX, "IIx ", "", MACH_CLASSII, &romvecs[0]},
   1754   1.55    briggs 	{MACH_MACIICX, "IIcx ", "", MACH_CLASSII, &romvecs[0]},
   1755   1.55    briggs 	{MACH_MACSE30, "SE/30 ", "", MACH_CLASSII, &romvecs[0]},
   1756   1.21    briggs 
   1757   1.21    briggs /* The rest of the II series... */
   1758   1.55    briggs 	{MACH_MACIICI, "IIci ", "", MACH_CLASSIIci, &romvecs[4]},
   1759   1.55    briggs 	{MACH_MACIISI, "IIsi ", "", MACH_CLASSIIsi, &romvecs[2]},
   1760   1.69    briggs 	{MACH_MACIIVI, "IIvi ", "", MACH_CLASSIIvx, &romvecs[2]},
   1761   1.69    briggs 	{MACH_MACIIVX, "IIvx ", "", MACH_CLASSIIvx, &romvecs[2]},
   1762  1.160    scottr 	{MACH_MACIIFX, "IIfx ", "", MACH_CLASSIIfx, &romvecs[18]},
   1763   1.21    briggs 
   1764   1.21    briggs /* The Centris/Quadra series. */
   1765   1.70    briggs 	{MACH_MACQ700, "Quadra", " 700 ", MACH_CLASSQ, &romvecs[4]},
   1766   1.55    briggs 	{MACH_MACQ900, "Quadra", " 900 ", MACH_CLASSQ, &romvecs[6]},
   1767  1.122    scottr 	{MACH_MACQ950, "Quadra", " 950 ", MACH_CLASSQ, &romvecs[17]},
   1768   1.55    briggs 	{MACH_MACQ800, "Quadra", " 800 ", MACH_CLASSQ, &romvecs[6]},
   1769   1.55    briggs 	{MACH_MACQ650, "Quadra", " 650 ", MACH_CLASSQ, &romvecs[6]},
   1770   1.55    briggs 	{MACH_MACC650, "Centris", " 650 ", MACH_CLASSQ, &romvecs[6]},
   1771  1.122    scottr 	{MACH_MACQ605, "Quadra", " 605 ", MACH_CLASSQ, &romvecs[9]},
   1772  1.172    briggs 	{MACH_MACQ605_33, "Quadra", " 605/33 ", MACH_CLASSQ, &romvecs[9]},
   1773   1.55    briggs 	{MACH_MACC610, "Centris", " 610 ", MACH_CLASSQ, &romvecs[6]},
   1774   1.55    briggs 	{MACH_MACQ610, "Quadra", " 610 ", MACH_CLASSQ, &romvecs[6]},
   1775  1.173    briggs 	{MACH_MACQ630, "Quadra", " 630 ", MACH_CLASSQ2, &romvecs[13]},
   1776  1.105    briggs 	{MACH_MACC660AV, "Centris", " 660AV ", MACH_CLASSAV, &romvecs[7]},
   1777  1.105    briggs 	{MACH_MACQ840AV, "Quadra", " 840AV ", MACH_CLASSAV, &romvecs[7]},
   1778   1.21    briggs 
   1779   1.21    briggs /* The Powerbooks/Duos... */
   1780   1.55    briggs 	{MACH_MACPB100, "PowerBook", " 100 ", MACH_CLASSPB, &romvecs[1]},
   1781   1.31    briggs 	/* PB 100 has no MMU! */
   1782   1.55    briggs 	{MACH_MACPB140, "PowerBook", " 140 ", MACH_CLASSPB, &romvecs[1]},
   1783   1.55    briggs 	{MACH_MACPB145, "PowerBook", " 145 ", MACH_CLASSPB, &romvecs[1]},
   1784  1.158    scottr 	{MACH_MACPB150, "PowerBook", " 150 ", MACH_CLASSDUO, &romvecs[10]},
   1785   1.55    briggs 	{MACH_MACPB160, "PowerBook", " 160 ", MACH_CLASSPB, &romvecs[5]},
   1786   1.55    briggs 	{MACH_MACPB165, "PowerBook", " 165 ", MACH_CLASSPB, &romvecs[5]},
   1787   1.55    briggs 	{MACH_MACPB165C, "PowerBook", " 165c ", MACH_CLASSPB, &romvecs[5]},
   1788   1.55    briggs 	{MACH_MACPB170, "PowerBook", " 170 ", MACH_CLASSPB, &romvecs[1]},
   1789   1.55    briggs 	{MACH_MACPB180, "PowerBook", " 180 ", MACH_CLASSPB, &romvecs[5]},
   1790   1.55    briggs 	{MACH_MACPB180C, "PowerBook", " 180c ", MACH_CLASSPB, &romvecs[5]},
   1791  1.211    scottr 	{MACH_MACPB190, "PowerBook", " 190 ", MACH_CLASSPB, &romvecs[8]},
   1792  1.271     shiba 	{MACH_MACPB190CS, "PowerBook", " 190cs ", MACH_CLASSPB, &romvecs[8]},
   1793  1.109    scottr 	{MACH_MACPB500, "PowerBook", " 500 ", MACH_CLASSPB, &romvecs[8]},
   1794  1.104    briggs 
   1795  1.104    briggs /* The Duos */
   1796  1.104    briggs 	{MACH_MACPB210, "PowerBook Duo", " 210 ", MACH_CLASSDUO, &romvecs[5]},
   1797  1.104    briggs 	{MACH_MACPB230, "PowerBook Duo", " 230 ", MACH_CLASSDUO, &romvecs[5]},
   1798  1.104    briggs 	{MACH_MACPB250, "PowerBook Duo", " 250 ", MACH_CLASSDUO, &romvecs[5]},
   1799  1.122    scottr 	{MACH_MACPB270, "PowerBook Duo", " 270C ", MACH_CLASSDUO, &romvecs[5]},
   1800  1.104    briggs 	{MACH_MACPB280, "PowerBook Duo", " 280 ", MACH_CLASSDUO, &romvecs[5]},
   1801  1.104    briggs 	{MACH_MACPB280C, "PowerBook Duo", " 280C ", MACH_CLASSDUO, &romvecs[5]},
   1802   1.21    briggs 
   1803   1.21    briggs /* The Performas... */
   1804   1.69    briggs 	{MACH_MACP600, "Performa", " 600 ", MACH_CLASSIIvx, &romvecs[2]},
   1805  1.127    scottr 	{MACH_MACP460, "Performa", " 460 ", MACH_CLASSLC, &romvecs[14]},
   1806   1.91    briggs 	{MACH_MACP550, "Performa", " 550 ", MACH_CLASSLC, &romvecs[11]},
   1807  1.184    scottr 	{MACH_MACP580, "Performa", " 580 ", MACH_CLASSQ2, &romvecs[19]},
   1808   1.99    briggs 	{MACH_MACTV,   "TV ",      "",      MACH_CLASSLC, &romvecs[12]},
   1809   1.21    briggs 
   1810   1.21    briggs /* The LCs... */
   1811   1.57    briggs 	{MACH_MACLCII,  "LC", " II ",  MACH_CLASSLC, &romvecs[3]},
   1812  1.118    scottr 	{MACH_MACLCIII, "LC", " III ", MACH_CLASSLC, &romvecs[14]},
   1813   1.98    briggs 	{MACH_MACLC475, "LC", " 475 ", MACH_CLASSQ,  &romvecs[9]},
   1814  1.172    briggs 	{MACH_MACLC475_33, "LC", " 475/33 ", MACH_CLASSQ,  &romvecs[9]},
   1815  1.122    scottr 	{MACH_MACLC520, "LC", " 520 ", MACH_CLASSLC, &romvecs[15]},
   1816  1.122    scottr 	{MACH_MACLC575, "LC", " 575 ", MACH_CLASSQ2, &romvecs[16]},
   1817   1.77    briggs 	{MACH_MACCCLASSIC, "Color Classic ", "", MACH_CLASSLC, &romvecs[3]},
   1818  1.122    scottr 	{MACH_MACCCLASSICII, "Color Classic"," II ", MACH_CLASSLC, &romvecs[3]},
   1819   1.21    briggs /* Does this belong here? */
   1820   1.55    briggs 	{MACH_MACCLASSICII, "Classic", " II ", MACH_CLASSLC, &romvecs[3]},
   1821   1.21    briggs 
   1822   1.21    briggs /* The unknown one and the end... */
   1823   1.55    briggs 	{0, "Unknown", "", MACH_CLASSII, NULL},
   1824   1.55    briggs 	{0, NULL, NULL, 0, NULL},
   1825   1.55    briggs };				/* End of cpu_models[] initialization. */
   1826   1.21    briggs 
   1827  1.248    scottr struct intvid_info_t {
   1828  1.129    scottr 	int	machineid;
   1829  1.248    scottr 	u_long	fbbase;
   1830  1.248    scottr 	u_long	fbmask;
   1831  1.129    scottr 	u_long	fblen;
   1832  1.208    scottr } intvid_info[] = {
   1833  1.250    scottr 	{ MACH_MACCLASSICII,	0x009f9a80,	0x0,		21888 },
   1834  1.273    scottr 	{ MACH_MACPB140,	0xfee08000,	0x0,		32 * 1024 },
   1835  1.273    scottr 	{ MACH_MACPB145,	0xfee08000,	0x0,		32 * 1024 },
   1836  1.273    scottr 	{ MACH_MACPB170,	0xfee08000,	0x0,		32 * 1024 },
   1837  1.248    scottr 	{ MACH_MACPB150,	0x60000000,	0x0,		128 * 1024 },
   1838  1.248    scottr 	{ MACH_MACPB160,	0x60000000,	0x0ffe0000,	128 * 1024 },
   1839  1.248    scottr 	{ MACH_MACPB165,	0x60000000,	0x0ffe0000,	128 * 1024 },
   1840  1.248    scottr 	{ MACH_MACPB180,	0x60000000,	0x0ffe0000,	128 * 1024 },
   1841  1.270     shiba 	{ MACH_MACPB210,	0x60000000,	0x0,		128 * 1024 },
   1842  1.270     shiba 	{ MACH_MACPB230,	0x60000000,	0x0,		128 * 1024 },
   1843  1.275    scottr 	{ MACH_MACPB250,	0x60000000,	0x0,		128 * 1024 },
   1844  1.275    scottr 	{ MACH_MACPB270,	0x60000000,	0x0,		128 * 1024 },
   1845  1.275    scottr 	{ MACH_MACPB280,	0x60000000,	0x0,		128 * 1024 },
   1846  1.275    scottr 	{ MACH_MACPB280C,	0x60000000,	0x0,		128 * 1024 },
   1847  1.248    scottr 	{ MACH_MACIICI,		0x0,		0x0,		320 * 1024 },
   1848  1.248    scottr 	{ MACH_MACIISI,		0x0,		0x0,		320 * 1024 },
   1849  1.248    scottr 	{ MACH_MACCCLASSIC,	0x50f40000,	0x0,		512 * 1024 },
   1850  1.248    scottr /*??*/	{ MACH_MACLCII,		0x50f40000,	0x0,		512 * 1024 },
   1851  1.248    scottr 	{ MACH_MACPB165C,	0xfc040000,	0x0,		512 * 1024 },
   1852  1.248    scottr 	{ MACH_MACPB180C,	0xfc040000,	0x0,		512 * 1024 },
   1853  1.248    scottr 	{ MACH_MACPB190,	0x60000000,	0x0,		512 * 1024 },
   1854  1.271     shiba 	{ MACH_MACPB190CS,	0x60000000,	0x0,		512 * 1024 },
   1855  1.248    scottr 	{ MACH_MACPB500,	0x60000000,	0x0,		512 * 1024 },
   1856  1.248    scottr 	{ MACH_MACLCIII,	0x60b00000,	0x0,		768 * 1024 },
   1857  1.248    scottr 	{ MACH_MACLC520,	0x60000000,	0x0,		1024 * 1024 },
   1858  1.257    scottr 	{ MACH_MACP550,		0x60000000,	0x0,		1024 * 1024 },
   1859  1.257    scottr 	{ MACH_MACTV,		0x60000000,	0x0,		1024 * 1024 },
   1860  1.248    scottr 	{ MACH_MACLC475,	0xf9000000,	0x0,		1024 * 1024 },
   1861  1.248    scottr 	{ MACH_MACLC475_33,	0xf9000000,	0x0,		1024 * 1024 },
   1862  1.248    scottr 	{ MACH_MACLC575,	0xf9000000,	0x0,		1024 * 1024 },
   1863  1.248    scottr 	{ MACH_MACC610,		0xf9000000,	0x0,		1024 * 1024 },
   1864  1.248    scottr 	{ MACH_MACC650,		0xf9000000,	0x0,		1024 * 1024 },
   1865  1.248    scottr 	{ MACH_MACP580,		0xf9000000,	0x0,		1024 * 1024 },
   1866  1.248    scottr 	{ MACH_MACQ605,		0xf9000000,	0x0,		1024 * 1024 },
   1867  1.248    scottr 	{ MACH_MACQ605_33,	0xf9000000,	0x0,		1024 * 1024 },
   1868  1.248    scottr 	{ MACH_MACQ610,		0xf9000000,	0x0,		1024 * 1024 },
   1869  1.248    scottr 	{ MACH_MACQ630,		0xf9000000,	0x0,		1024 * 1024 },
   1870  1.248    scottr 	{ MACH_MACQ650,		0xf9000000,	0x0,		1024 * 1024 },
   1871  1.248    scottr 	{ MACH_MACC660AV,	0x50100000,	0x0,		1024 * 1024 },
   1872  1.248    scottr 	{ MACH_MACQ700,		0xf9000000,	0x0,		1024 * 1024 },
   1873  1.248    scottr 	{ MACH_MACQ800,		0xf9000000,	0x0,		1024 * 1024 },
   1874  1.248    scottr 	{ MACH_MACQ900,		0xf9000000,	0x0,		1024 * 1024 },
   1875  1.248    scottr 	{ MACH_MACQ950,		0xf9000000,	0x0,		1024 * 1024 },
   1876  1.248    scottr 	{ MACH_MACQ840AV,	0x50100000,	0x0,		2048 * 1024 },
   1877  1.248    scottr 	{ 0,			0x0,		0x0,		0 },
   1878  1.129    scottr };				/* End of intvid_info[] initialization. */
   1879  1.129    scottr 
   1880   1.31    briggs /*
   1881   1.31    briggs  * Missing Mac Models:
   1882   1.31    briggs  *	PowerMac 6100
   1883   1.31    briggs  *	PowerMac 7100
   1884   1.31    briggs  *	PowerMac 8100
   1885   1.31    briggs  *	PowerBook 540
   1886   1.31    briggs  *	PowerBook 520
   1887   1.31    briggs  *	PowerBook 150
   1888   1.31    briggs  *	Duo 280
   1889   1.31    briggs  *	Performa 6000s
   1890   1.31    briggs  * 	...?
   1891   1.31    briggs  */
   1892   1.31    briggs 
   1893  1.301       chs int	mach_cputype(void);
   1894   1.95    briggs 
   1895   1.31    briggs int
   1896  1.301       chs mach_cputype(void)
   1897   1.31    briggs {
   1898   1.55    briggs 	return (mac68k_machine.mach_processor);
   1899   1.31    briggs }
   1900   1.31    briggs 
   1901   1.21    briggs static void
   1902  1.301       chs identifycpu(void)
   1903    1.8    briggs {
   1904  1.159    scottr 	extern u_int delay_factor;
   1905  1.305       jmc 	const char *mpu;
   1906    1.8    briggs 
   1907  1.129    scottr 	switch (cputype) {
   1908  1.129    scottr 	case CPU_68020:
   1909  1.129    scottr 		mpu = ("(68020)");
   1910   1.55    briggs 		break;
   1911  1.129    scottr 	case CPU_68030:
   1912  1.129    scottr 		mpu = ("(68030)");
   1913   1.55    briggs 		break;
   1914  1.129    scottr 	case CPU_68040:
   1915  1.129    scottr 		mpu = ("(68040)");
   1916   1.55    briggs 		break;
   1917   1.55    briggs 	default:
   1918  1.129    scottr 		mpu = ("(unknown processor)");
   1919   1.55    briggs 		break;
   1920   1.21    briggs 	}
   1921  1.347  christos 	cpu_setmodel("Apple Macintosh %s%s %s",
   1922   1.55    briggs 	    cpu_models[mac68k_machine.cpu_model_index].model_major,
   1923   1.55    briggs 	    cpu_models[mac68k_machine.cpu_model_index].model_minor,
   1924  1.129    scottr 	    mpu);
   1925  1.347  christos 	printf("%s\n", cpu_getmodel());
   1926  1.159    scottr 	printf("cpu: delay factor %d\n", delay_factor);
   1927  1.316   tsutsui 	initfpu();
   1928   1.21    briggs }
   1929   1.21    briggs 
   1930  1.301       chs static void	get_machine_info(void);
   1931   1.95    briggs 
   1932   1.21    briggs static void
   1933  1.301       chs get_machine_info(void)
   1934   1.21    briggs {
   1935  1.183    scottr 	int i;
   1936   1.21    briggs 
   1937  1.129    scottr 	for (i = 0; cpu_models[i].model_major; i++)
   1938   1.21    briggs 		if (mac68k_machine.machineid == cpu_models[i].machineid)
   1939   1.21    briggs 			break;
   1940   1.21    briggs 
   1941   1.21    briggs 	if (cpu_models[i].model_major == NULL)
   1942   1.21    briggs 		i--;
   1943   1.21    briggs 
   1944   1.21    briggs 	mac68k_machine.cpu_model_index = i;
   1945   1.21    briggs }
   1946   1.21    briggs 
   1947   1.31    briggs struct cpu_model_info *current_mac_model;
   1948  1.101    briggs romvec_t *mrg_MacOSROMVectors = 0;
   1949   1.31    briggs 
   1950   1.21    briggs /*
   1951   1.21    briggs  * Sets a bunch of machine-specific variables
   1952   1.21    briggs  */
   1953  1.301       chs void	setmachdep(void);
   1954   1.95    briggs 
   1955   1.16    briggs void
   1956  1.301       chs setmachdep(void)
   1957    1.8    briggs {
   1958   1.55    briggs 	struct cpu_model_info *cpui;
   1959   1.16    briggs 
   1960   1.21    briggs 	/*
   1961   1.21    briggs 	 * First, set things that need to be set on the first pass only
   1962   1.21    briggs 	 * Ideally, we'd only call this once, but for some reason, the
   1963   1.21    briggs 	 * VIAs need interrupts turned off twice !?
   1964   1.21    briggs 	 */
   1965  1.189    scottr 	get_machine_info();
   1966    1.8    briggs 
   1967  1.189    scottr 	load_addr = 0;
   1968   1.21    briggs 	cpui = &(cpu_models[mac68k_machine.cpu_model_index]);
   1969   1.31    briggs 	current_mac_model = cpui;
   1970   1.31    briggs 
   1971  1.237    briggs 	mac68k_machine.via1_ipl = 1;
   1972  1.237    briggs 	mac68k_machine.via2_ipl = 2;
   1973  1.237    briggs 	mac68k_machine.aux_interrupts = 0;
   1974  1.237    briggs 
   1975   1.31    briggs 	/*
   1976   1.21    briggs 	 * Set up any machine specific stuff that we have to before
   1977   1.21    briggs 	 * ANYTHING else happens
   1978   1.21    briggs 	 */
   1979   1.55    briggs 	switch (cpui->class) {	/* Base this on class of machine... */
   1980   1.46    briggs 	case MACH_CLASSII:
   1981  1.247    scottr 		VIA2 = VIA2OFF;
   1982   1.46    briggs 		IOBase = 0x50f00000;
   1983  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   1984   1.46    briggs 		mac68k_machine.scsi80 = 1;
   1985  1.171    scottr 		mac68k_machine.zs_chip = 0;
   1986   1.46    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   1987   1.46    briggs 		via_reg(VIA2, vIER) = 0x7f;	/* disable VIA2 int */
   1988   1.46    briggs 		break;
   1989   1.46    briggs 	case MACH_CLASSPB:
   1990  1.247    scottr 		VIA2 = VIA2OFF;
   1991   1.46    briggs 		IOBase = 0x50f00000;
   1992  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   1993   1.46    briggs 		mac68k_machine.scsi80 = 1;
   1994  1.171    scottr 		mac68k_machine.zs_chip = 0;
   1995   1.46    briggs 		/* Disable everything but PM; we need it. */
   1996   1.46    briggs 		via_reg(VIA1, vIER) = 0x6f;	/* disable VIA1 int */
   1997   1.46    briggs 		/* Are we disabling something important? */
   1998   1.46    briggs 		via_reg(VIA2, vIER) = 0x7f;	/* disable VIA2 int */
   1999  1.136    briggs 		if (cputype == CPU_68040)
   2000  1.136    briggs 			mac68k_machine.sonic = 1;
   2001  1.104    briggs 		break;
   2002  1.104    briggs 	case MACH_CLASSDUO:
   2003  1.104    briggs 		/*
   2004  1.104    briggs 		 * The Duo definitely does not use a VIA2, but it looks
   2005  1.104    briggs 		 * like the VIA2 functions might be on the MSC at the RBV
   2006  1.104    briggs 		 * locations.  The rest is copied from the Powerbooks.
   2007  1.104    briggs 		 */
   2008  1.247    scottr 		VIA2 = RBVOFF;
   2009  1.104    briggs 		IOBase = 0x50f00000;
   2010  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2011  1.104    briggs 		mac68k_machine.scsi80 = 1;
   2012  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2013  1.104    briggs 		/* Disable everything but PM; we need it. */
   2014  1.104    briggs 		via_reg(VIA1, vIER) = 0x6f;	/* disable VIA1 int */
   2015  1.104    briggs 		/* Are we disabling something important? */
   2016  1.104    briggs 		via_reg(VIA2, rIER) = 0x7f;	/* disable VIA2 int */
   2017   1.46    briggs 		break;
   2018   1.46    briggs 	case MACH_CLASSQ:
   2019  1.183    scottr 	case MACH_CLASSQ2:
   2020  1.247    scottr 		VIA2 = VIA2OFF;
   2021  1.237    briggs 		IOBase = 0x50f00000;
   2022  1.237    briggs 		Via1Base = (volatile u_char *)IOBase;
   2023  1.136    briggs 		mac68k_machine.sonic = 1;
   2024  1.237    briggs 		mac68k_machine.scsi96 = 1;
   2025  1.237    briggs 		mac68k_machine.zs_chip = 0;
   2026  1.237    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   2027  1.237    briggs 		via_reg(VIA2, vIER) = 0x7f;	/* disable VIA2 int */
   2028  1.237    briggs 
   2029  1.237    briggs #if 1
   2030  1.237    briggs 		switch (current_mac_model->machineid) {
   2031  1.237    briggs 		default:
   2032  1.237    briggs 	/*	case MACH_MACQ900: These three, at least, support the
   2033  1.237    briggs 		case MACH_MACQ950: A/UX interrupts.  What Quadras don't?
   2034  1.237    briggs 		case MACH_MACQ700: */
   2035  1.237    briggs 			/* Enable A/UX interrupt scheme */
   2036  1.237    briggs 			mac68k_machine.aux_interrupts = 1;
   2037  1.237    briggs 
   2038  1.237    briggs 			via_reg(VIA1, vBufB) &= (0xff ^ DB1O_AuxIntEnb);
   2039  1.237    briggs 			via_reg(VIA1, vDirB) |= DB1O_AuxIntEnb;
   2040  1.237    briggs 			mac68k_machine.via1_ipl = 6;
   2041  1.237    briggs 			mac68k_machine.via2_ipl = 2;
   2042  1.237    briggs 			break;
   2043  1.237    briggs 		}
   2044  1.237    briggs #endif
   2045  1.237    briggs 
   2046  1.237    briggs 		break;
   2047  1.105    briggs 	case MACH_CLASSAV:
   2048  1.184    scottr 	case MACH_CLASSP580:
   2049  1.247    scottr 		VIA2 = VIA2OFF;
   2050   1.46    briggs 		IOBase = 0x50f00000;
   2051  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2052   1.46    briggs 		mac68k_machine.scsi96 = 1;
   2053  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2054   1.46    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   2055   1.46    briggs 		via_reg(VIA2, vIER) = 0x7f;	/* disable VIA2 int */
   2056   1.46    briggs 		break;
   2057   1.46    briggs 	case MACH_CLASSIIci:
   2058  1.247    scottr 		VIA2 = RBVOFF;
   2059   1.46    briggs 		IOBase = 0x50f00000;
   2060  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2061   1.46    briggs 		mac68k_machine.scsi80 = 1;
   2062  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2063   1.46    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   2064   1.46    briggs 		via_reg(VIA2, rIER) = 0x7f;	/* disable RBV int */
   2065   1.46    briggs 		break;
   2066   1.46    briggs 	case MACH_CLASSIIsi:
   2067  1.247    scottr 		VIA2 = RBVOFF;
   2068   1.46    briggs 		IOBase = 0x50f00000;
   2069  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2070   1.46    briggs 		mac68k_machine.scsi80 = 1;
   2071  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2072   1.46    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   2073   1.46    briggs 		via_reg(VIA2, rIER) = 0x7f;	/* disable RBV int */
   2074   1.46    briggs 		break;
   2075   1.69    briggs 	case MACH_CLASSIIvx:
   2076  1.247    scottr 		VIA2 = RBVOFF;
   2077   1.69    briggs 		IOBase = 0x50f00000;
   2078  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2079   1.69    briggs 		mac68k_machine.scsi80 = 1;
   2080  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2081   1.69    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   2082   1.69    briggs 		via_reg(VIA2, rIER) = 0x7f;	/* disable RBV int */
   2083   1.69    briggs 		break;
   2084   1.46    briggs 	case MACH_CLASSLC:
   2085  1.247    scottr 		VIA2 = RBVOFF;
   2086   1.46    briggs 		IOBase = 0x50f00000;
   2087  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2088   1.46    briggs 		mac68k_machine.scsi80 = 1;
   2089  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2090   1.46    briggs 		via_reg(VIA1, vIER) = 0x7f;	/* disable VIA1 int */
   2091   1.46    briggs 		via_reg(VIA2, rIER) = 0x7f;	/* disable RBV int */
   2092   1.46    briggs 		break;
   2093  1.160    scottr 	case MACH_CLASSIIfx:
   2094  1.247    scottr 		VIA2 = OSSOFF;
   2095  1.160    scottr 		IOBase = 0x50f00000;
   2096  1.183    scottr 		Via1Base = (volatile u_char *)IOBase;
   2097  1.160    scottr 		mac68k_machine.scsi80 = 1;
   2098  1.171    scottr 		mac68k_machine.zs_chip = 0;
   2099  1.160    scottr 		via_reg(VIA1, vIER) = 0x7f;  /* disable VIA1 int */
   2100  1.160    scottr 		break;
   2101   1.46    briggs 	default:
   2102   1.46    briggs 	case MACH_CLASSH:
   2103   1.46    briggs 		break;
   2104    1.8    briggs 	}
   2105  1.111    scottr 
   2106  1.111    scottr 	/*
   2107  1.111    scottr 	 * Set up current ROM Glue vectors.  Actually now all we do
   2108  1.111    scottr 	 * is save the address of the ROM Glue Vector table. This gets
   2109  1.111    scottr 	 * used later when we re-map the vectors from MacOS Address
   2110  1.111    scottr 	 * Space to NetBSD Address Space.
   2111  1.111    scottr 	 */
   2112  1.250    scottr 	mrg_MacOSROMVectors = cpui->rom_vectors;
   2113    1.8    briggs }
   2114    1.8    briggs 
   2115   1.46    briggs /*
   2116   1.46    briggs  * Set IO offsets.
   2117   1.46    briggs  */
   2118   1.46    briggs void
   2119  1.301       chs mac68k_set_io_offsets(vaddr_t base)
   2120   1.46    briggs {
   2121  1.132    scottr 
   2122  1.361       rin 	Via1Base = (volatile u_char *)base;
   2123  1.361       rin 	Via2Base = Via1Base + 0x2000 * VIA2;
   2124   1.55    briggs 	switch (current_mac_model->class) {
   2125   1.46    briggs 	case MACH_CLASSQ:
   2126  1.125    briggs 		switch (current_mac_model->machineid) {
   2127  1.125    briggs 		case MACH_MACQ900:
   2128  1.125    briggs 		case MACH_MACQ950:
   2129  1.361       rin 			sccA = (volatile u_char *)base + 0xc020;
   2130  1.361       rin 			SCSIBase = base + 0xf000;
   2131  1.126    briggs 			mac68k_machine.scsi96_2 = 1;
   2132  1.237    briggs 			iop_init(0);	/* For console */
   2133  1.236    briggs 			break;
   2134  1.362       rin 		case MACH_MACQ800:
   2135  1.362       rin 			/*
   2136  1.362       rin 			 * The H/W partially decode address for sccA; it is
   2137  1.362       rin 			 * available at offsets 0xc000, 0xc020, .... Here,
   2138  1.362       rin 			 * we choose 0xc020, where Mac toolbox ROM uses.
   2139  1.362       rin 			 */
   2140  1.362       rin 			sccA = (volatile u_char *)base + 0xc020;
   2141  1.362       rin 			SCSIBase = base + 0x10000;
   2142  1.362       rin 			break;
   2143  1.125    briggs 		case MACH_MACQ700:
   2144  1.361       rin 			sccA = (volatile u_char *)base + 0xc000;
   2145  1.361       rin 			SCSIBase = base + 0xf000;
   2146  1.125    briggs 			break;
   2147  1.125    briggs 		default:
   2148  1.361       rin 			sccA = (volatile u_char *)base + 0xc000;
   2149  1.125    briggs 			SCSIBase = base + 0x10000;
   2150  1.125    briggs 			break;
   2151  1.125    briggs 		}
   2152   1.46    briggs 		break;
   2153  1.122    scottr 	case MACH_CLASSQ2:
   2154  1.122    scottr 		/*
   2155  1.122    scottr 		 * Note the different offset for sccA for this class of
   2156  1.122    scottr 		 * machines.  This seems to be common on many of the
   2157  1.122    scottr 		 * Quadra-type machines.
   2158  1.122    scottr 		 */
   2159  1.183    scottr 		sccA = (volatile u_char *)base + 0xc020;
   2160  1.125    briggs 		SCSIBase = base + 0x10000;
   2161  1.184    scottr 		break;
   2162  1.184    scottr 	case MACH_CLASSP580:
   2163  1.184    scottr 		/*
   2164  1.184    scottr 		 * Here's a queer bird... it seems to be a cross between
   2165  1.184    scottr 		 * the two different Quadra classes.
   2166  1.184    scottr 		 */
   2167  1.361       rin 		sccA = (volatile u_char *)base + 0xc020;
   2168  1.184    scottr 		SCSIBase = base;
   2169  1.124    briggs 		break;
   2170  1.124    briggs 	case MACH_CLASSAV:
   2171  1.183    scottr 		sccA = (volatile u_char *)base + 0x4000;
   2172  1.124    briggs 		SCSIBase = base + 0x18000;
   2173  1.183    scottr 		PSCBase = (volatile u_char *)base + 0x31000;
   2174  1.122    scottr 		break;
   2175  1.105    briggs 	case MACH_CLASSII:
   2176  1.105    briggs 	case MACH_CLASSPB:
   2177  1.158    scottr 	case MACH_CLASSDUO:
   2178   1.46    briggs 	case MACH_CLASSIIci:
   2179   1.46    briggs 	case MACH_CLASSIIsi:
   2180   1.69    briggs 	case MACH_CLASSIIvx:
   2181   1.46    briggs 	case MACH_CLASSLC:
   2182  1.361       rin 		sccA = (volatile u_char *)base + 0x4000;
   2183   1.46    briggs 		SCSIBase = base;
   2184   1.46    briggs 		break;
   2185  1.160    scottr 	case MACH_CLASSIIfx:
   2186  1.165    scottr 		/*
   2187  1.165    scottr 		 * Note that sccA base address is based on having
   2188  1.165    scottr 		 * the serial port in `compatible' mode (set in
   2189  1.165    scottr 		 * the Serial Switch control panel before booting).
   2190  1.165    scottr 		 */
   2191  1.183    scottr 		sccA = (volatile u_char *)base + 0x4020;
   2192  1.160    scottr 		SCSIBase = base;
   2193  1.237    briggs 		iop_init(0);	/* For console */
   2194  1.160    scottr 		break;
   2195   1.46    briggs 	default:
   2196   1.46    briggs 	case MACH_CLASSH:
   2197  1.160    scottr 		panic("Unknown/unsupported machine class (%d).",
   2198  1.160    scottr 		    current_mac_model->class);
   2199   1.46    briggs 		break;
   2200   1.46    briggs 	}
   2201   1.46    briggs }
   2202   1.46    briggs 
   2203   1.55    briggs #if GRAYBARS
   2204   1.55    briggs static u_long gray_nextaddr = 0;
   2205   1.21    briggs 
   2206   1.21    briggs void
   2207  1.301       chs gray_bar(void)
   2208   1.16    briggs {
   2209   1.55    briggs 	static int i = 0;
   2210   1.55    briggs 	static int flag = 0;
   2211   1.21    briggs 
   2212   1.21    briggs /* MF basic premise as I see it:
   2213   1.21    briggs 	1) Save the scratch regs as they are not saved by the compilier.
   2214   1.21    briggs    	2) Check to see if we want gray bars, if so,
   2215   1.21    briggs 		display some lines of gray,
   2216   1.21    briggs 		a couple of lines of white(about 8),
   2217   1.21    briggs 		and loop to slow this down.
   2218   1.21    briggs    	3) restore regs
   2219   1.21    briggs */
   2220   1.21    briggs 
   2221  1.308     perry 	__asm volatile (
   2222  1.277   thorpej 			"	movl %a0,%sp@-;"
   2223  1.277   thorpej 			"	movl %a1,%sp@-;"
   2224  1.277   thorpej 			"	movl %d0,%sp@-;"
   2225  1.277   thorpej 			"	movl %d1,%sp@-");
   2226   1.16    briggs 
   2227   1.21    briggs /* check to see if gray bars are turned off */
   2228   1.55    briggs 	if (mac68k_machine.do_graybars) {
   2229  1.319      jmmv 		/* MF the 10*stride/4 is done lots, but we want this to be
   2230   1.55    briggs 		 * slow */
   2231  1.319      jmmv 		for (i = 0; i < 10 * mac68k_video.mv_stride / 4; i++)
   2232  1.319      jmmv 			((u_long *)mac68k_video.mv_kvaddr)
   2233  1.319      jmmv 			    [gray_nextaddr++] = 0xaaaaaaaa;
   2234  1.319      jmmv 		for (i = 0; i < 2 * mac68k_video.mv_stride / 4; i++)
   2235  1.319      jmmv 			((u_long *)mac68k_video.mv_kvaddr)
   2236  1.319      jmmv 			    [gray_nextaddr++] = 0x00000000;
   2237   1.55    briggs 	}
   2238  1.129    scottr 
   2239  1.308     perry 	__asm volatile (
   2240  1.277   thorpej 			"	movl %sp@+,%d1;"
   2241  1.277   thorpej 			"	movl %sp@+,%d0;"
   2242  1.277   thorpej 			"	movl %sp@+,%a1;"
   2243  1.277   thorpej 			"	movl %sp@+,%a0");
   2244   1.25   lkestel }
   2245   1.55    briggs #endif
   2246   1.25   lkestel 
   2247   1.55    briggs /* in locore */
   2248  1.313  christos extern u_long ptest040(void *, u_int);
   2249  1.301       chs extern int get_pte(u_int, u_long *, u_short *);
   2250   1.25   lkestel 
   2251   1.25   lkestel /*
   2252   1.25   lkestel  * LAK (7/24/94): given a logical address, puts the physical address
   2253   1.25   lkestel  *  in *phys and return 1, or returns 0 on failure.  This is intended
   2254   1.25   lkestel  *  to look through MacOS page tables.
   2255   1.25   lkestel  */
   2256   1.95    briggs 
   2257   1.95    briggs static u_long
   2258   1.55    briggs get_physical(u_int addr, u_long * phys)
   2259   1.25   lkestel {
   2260  1.208    scottr 	extern u_int macos_tc;
   2261  1.183    scottr 	u_long pte[2], ph, mask;
   2262   1.55    briggs 	u_short psr;
   2263  1.183    scottr 	int i, numbits;
   2264  1.117    briggs 
   2265  1.122    scottr 	if (mmutype == MMU_68040) {
   2266  1.313  christos 		ph = ptest040((void *)addr, FC_SUPERD);
   2267  1.366   thorpej 		if ((ph & MMUSR40_R) == 0) {
   2268  1.313  christos 			ph = ptest040((void *)addr, FC_USERD);
   2269  1.366   thorpej 			if ((ph & MMUSR40_R) == 0)
   2270  1.129    scottr 				return 0;
   2271  1.129    scottr 		}
   2272  1.366   thorpej 		if ((ph & MMUSR40_T) != 0)
   2273  1.215    scottr 			ph = addr;
   2274   1.25   lkestel 
   2275  1.366   thorpej 		mask = (macos_tc & TCR40_P) ? 0x00001fff : 0x00000fff;
   2276  1.129    scottr 		ph &= (~mask);
   2277  1.122    scottr 	} else {
   2278  1.249    scottr 		switch (get_pte(addr, pte, &psr)) {
   2279  1.249    scottr 		case (-1):
   2280  1.122    scottr 			return 0;
   2281  1.122    scottr 		case 0:
   2282  1.122    scottr 			ph = pte[0] & 0xFFFFFF00;
   2283  1.122    scottr 			break;
   2284  1.122    scottr 		case 1:
   2285  1.122    scottr 			ph = pte[1] & 0xFFFFFF00;
   2286  1.122    scottr 			break;
   2287  1.122    scottr 		default:
   2288  1.122    scottr 			panic("get_physical(): bad get_pte()");
   2289  1.122    scottr 		}
   2290   1.25   lkestel 
   2291  1.122    scottr 		/*
   2292  1.122    scottr 		 * We must now figure out how many levels down we went and
   2293  1.122    scottr 		 * mask the bits appropriately -- the returned value may only
   2294  1.122    scottr 		 * be the upper n bits, and we have to take the rest from addr.
   2295  1.122    scottr 		 */
   2296  1.122    scottr 		numbits = 0;
   2297  1.122    scottr 		psr &= 0x0007;		/* Number of levels we went */
   2298  1.122    scottr 		for (i = 0; i < psr; i++)
   2299  1.122    scottr 			numbits += (macos_tc >> (12 - i * 4)) & 0x0f;
   2300   1.25   lkestel 
   2301  1.122    scottr 		/*
   2302  1.122    scottr 		 * We have to take the most significant "numbits" from
   2303  1.122    scottr 		 * the returned value "ph", and the rest from our addr.
   2304  1.122    scottr 		 * Assume that numbits != 0.
   2305  1.122    scottr 		 */
   2306  1.122    scottr 		mask = (1 << (32 - numbits)) - 1;
   2307  1.122    scottr 	}
   2308  1.129    scottr 	*phys = ph + (addr & mask);
   2309   1.25   lkestel 
   2310   1.25   lkestel 	return 1;
   2311   1.25   lkestel }
   2312   1.25   lkestel 
   2313  1.305       jmc static void	check_video(const char *, u_long, u_long);
   2314   1.95    briggs 
   2315   1.95    briggs static void
   2316  1.305       jmc check_video(const char *id, u_long limit, u_long maxm)
   2317   1.55    briggs {
   2318  1.183    scottr 	u_long addr, phys;
   2319   1.55    briggs 
   2320  1.319      jmmv 	if (!get_physical(mac68k_video.mv_kvaddr, &phys)) {
   2321  1.243    scottr 		if (mac68k_machine.do_graybars)
   2322  1.243    scottr 			printf("get_mapping(): %s.  False start.\n", id);
   2323  1.243    scottr 	} else {
   2324  1.319      jmmv 		mac68k_video.mv_log = mac68k_video.mv_kvaddr;
   2325  1.319      jmmv 		mac68k_video.mv_phys = phys;
   2326  1.319      jmmv 		mac68k_video.mv_len = 32768;
   2327  1.319      jmmv 		addr = mac68k_video.mv_kvaddr + 32768;
   2328   1.55    briggs 		while (get_physical(addr, &phys)) {
   2329  1.319      jmmv 			if ((phys - mac68k_video.mv_phys)
   2330  1.319      jmmv 			    != mac68k_video.mv_len)
   2331   1.55    briggs 				break;
   2332  1.319      jmmv 			if (mac68k_video.mv_len + 32768 > limit) {
   2333  1.243    scottr 				if (mac68k_machine.do_graybars) {
   2334  1.243    scottr 					printf("mapping: %s.  Does it never end?\n",
   2335  1.243    scottr 					    id);
   2336  1.243    scottr 					printf("    Forcing VRAM size ");
   2337  1.243    scottr 					printf("to a conservative %ldK.\n",
   2338  1.243    scottr 					    maxm/1024);
   2339  1.243    scottr 				}
   2340  1.319      jmmv 				mac68k_video.mv_len = maxm;
   2341   1.55    briggs 				break;
   2342   1.55    briggs 			}
   2343  1.319      jmmv 			mac68k_video.mv_len += 32768;
   2344   1.55    briggs 			addr += 32768;
   2345   1.55    briggs 		}
   2346  1.243    scottr 		if (mac68k_machine.do_graybars) {
   2347  1.355       rin 			printf("  %s internal video at addr %p (phys %p), ",
   2348  1.319      jmmv 			    id, (void *)mac68k_video.mv_log,
   2349  1.319      jmmv 			    (void *)mac68k_video.mv_phys);
   2350  1.319      jmmv 			printf("len 0x%x.\n", mac68k_video.mv_len);
   2351  1.243    scottr 		}
   2352   1.55    briggs 	}
   2353   1.55    briggs }
   2354   1.55    briggs 
   2355   1.25   lkestel /*
   2356   1.25   lkestel  * Find out how MacOS has mapped itself so we can do the same thing.
   2357   1.25   lkestel  * Returns the address of logical 0 so that locore can map the kernel
   2358   1.25   lkestel  * properly.
   2359   1.25   lkestel  */
   2360   1.55    briggs u_int
   2361   1.55    briggs get_mapping(void)
   2362   1.25   lkestel {
   2363  1.248    scottr 	struct intvid_info_t *iip;
   2364  1.248    scottr 	u_long addr, lastpage, phys, len, limit;
   2365  1.188    scottr 	int i, last, same;
   2366   1.25   lkestel 
   2367   1.25   lkestel 	numranges = 0;
   2368   1.25   lkestel 	for (i = 0; i < 8; i++) {
   2369   1.25   lkestel 		low[i] = 0;
   2370   1.25   lkestel 		high[i] = 0;
   2371   1.25   lkestel 	}
   2372   1.25   lkestel 
   2373   1.55    briggs 	lastpage = get_top_of_ram();
   2374   1.27   lkestel 
   2375   1.46    briggs 	get_physical(0, &load_addr);
   2376   1.46    briggs 
   2377  1.248    scottr 	if (mac68k_machine.do_graybars)
   2378  1.248    scottr 		printf("Loaded at 0x%0lx\n", load_addr);
   2379  1.248    scottr 
   2380  1.188    scottr 	last = 0;
   2381   1.55    briggs 	for (addr = 0; addr <= lastpage && get_physical(addr, &phys);
   2382  1.285   thorpej 	    addr += PAGE_SIZE) {
   2383  1.188    scottr 		if (numranges > 0 && phys != high[last]) {
   2384  1.188    scottr 			/*
   2385  1.188    scottr 			 * Attempt to find if this page is already
   2386  1.188    scottr 			 * accounted for in an existing physical segment.
   2387  1.188    scottr 			 */
   2388  1.188    scottr 			for (i = 0; i < numranges; i++) {
   2389  1.188    scottr 				if (low[i] <= phys && phys <= high[i]) {
   2390  1.188    scottr 					last = i;
   2391  1.188    scottr 					break;
   2392  1.188    scottr 				}
   2393  1.188    scottr 			}
   2394  1.188    scottr 			if (i >= numranges)
   2395  1.188    scottr 				last = numranges - 1;
   2396  1.188    scottr 
   2397  1.188    scottr 			if (low[last] <= phys && phys < high[last])
   2398  1.188    scottr 				continue;	/* Skip pages we've seen. */
   2399  1.188    scottr 		}
   2400  1.188    scottr 
   2401  1.188    scottr 		if (numranges > 0 && phys == high[last]) {
   2402  1.188    scottr 			/* Common case:  extend existing segment on high end */
   2403  1.285   thorpej 			high[last] += PAGE_SIZE;
   2404   1.25   lkestel 		} else {
   2405  1.188    scottr 			/* This is a new physical segment. */
   2406  1.188    scottr 			for (last = 0; last < numranges; last++)
   2407  1.188    scottr 				if (phys < low[last])
   2408  1.188    scottr 					break;
   2409  1.188    scottr 
   2410  1.188    scottr 			/* Create space for segment, if necessary */
   2411  1.188    scottr 			if (last < numranges && phys < low[last]) {
   2412  1.188    scottr 				for (i = numranges; i > last; i--) {
   2413  1.188    scottr 					low[i] = low[i - 1];
   2414  1.188    scottr 					high[i] = high[i - 1];
   2415  1.188    scottr 				}
   2416  1.188    scottr 			}
   2417  1.188    scottr 
   2418   1.25   lkestel 			numranges++;
   2419  1.188    scottr 			low[last] = phys;
   2420  1.285   thorpej 			high[last] = phys + PAGE_SIZE;
   2421  1.188    scottr 		}
   2422  1.188    scottr 
   2423  1.188    scottr 		/* Coalesce adjoining segments as appropriate */
   2424  1.188    scottr 		if (last < (numranges - 1) && high[last] == low[last + 1] &&
   2425  1.188    scottr 		    low[last + 1] != load_addr) {
   2426  1.188    scottr 			high[last] = high[last + 1];
   2427  1.188    scottr 			for (i = last + 1; i < numranges; i++) {
   2428  1.188    scottr 				low[i] = low[i + 1];
   2429  1.188    scottr 				high[i] = high[i + 1];
   2430  1.188    scottr 			}
   2431  1.188    scottr 			--numranges;
   2432   1.25   lkestel 		}
   2433   1.25   lkestel 	}
   2434  1.243    scottr 	if (mac68k_machine.do_graybars) {
   2435  1.243    scottr 		printf("System RAM: %ld bytes in %ld pages.\n",
   2436  1.285   thorpej 		    addr, addr / PAGE_SIZE);
   2437  1.243    scottr 		for (i = 0; i < numranges; i++) {
   2438  1.243    scottr 			printf("     Low = 0x%lx, high = 0x%lx\n",
   2439  1.243    scottr 			    low[i], high[i]);
   2440  1.243    scottr 		}
   2441   1.25   lkestel 	}
   2442   1.25   lkestel 
   2443  1.208    scottr 	/*
   2444  1.249    scottr 	 * If we can't figure out the PA of the frame buffer by groveling
   2445  1.249    scottr 	 * the page tables, assume that we already have the correct
   2446  1.249    scottr 	 * address.  This is the case on several of the PowerBook 1xx
   2447  1.249    scottr 	 * series, in particular.
   2448  1.249    scottr 	 */
   2449  1.319      jmmv 	if (!get_physical(mac68k_video.mv_kvaddr, &phys))
   2450  1.319      jmmv 		phys = mac68k_video.mv_kvaddr;
   2451  1.249    scottr 
   2452  1.249    scottr 	/*
   2453  1.208    scottr 	 * Find on-board video, if we have an idea of where to look
   2454  1.208    scottr 	 * on this system.
   2455  1.208    scottr 	 */
   2456  1.248    scottr 	for (iip = intvid_info; iip->machineid; iip++)
   2457  1.248    scottr 		if (mac68k_machine.machineid == iip->machineid)
   2458  1.208    scottr 			break;
   2459  1.208    scottr 
   2460  1.248    scottr 	if (mac68k_machine.machineid == iip->machineid &&
   2461  1.248    scottr 	    (phys & ~iip->fbmask) >= iip->fbbase &&
   2462  1.248    scottr 	    (phys & ~iip->fbmask) < (iip->fbbase + iip->fblen)) {
   2463  1.319      jmmv 		mac68k_video.mv_phys = phys & ~iip->fbmask;
   2464  1.319      jmmv 		mac68k_video.mv_len = 32768 - (phys & 0x7fff);
   2465  1.210    scottr 
   2466  1.319      jmmv 		limit = iip->fbbase + iip->fblen - mac68k_video.mv_phys;
   2467  1.319      jmmv 		if (mac68k_video.mv_len > limit) {
   2468  1.319      jmmv 			mac68k_video.mv_len = limit;
   2469  1.208    scottr 		} else {
   2470  1.319      jmmv 			addr = mac68k_video.mv_kvaddr + mac68k_video.mv_len;
   2471  1.208    scottr 			while (get_physical(addr, &phys)) {
   2472  1.248    scottr 				phys &= ~iip->fbmask;
   2473  1.319      jmmv 				if ((phys - mac68k_video.mv_phys) !=
   2474  1.319      jmmv 				    mac68k_video.mv_len)
   2475  1.208    scottr 					break;
   2476  1.319      jmmv 				if ((mac68k_video.mv_phys + 32768) > limit) {
   2477  1.319      jmmv 					mac68k_video.mv_len = limit;
   2478  1.208    scottr 					break;
   2479  1.208    scottr 				}
   2480  1.319      jmmv 				mac68k_video.mv_len += 32768;
   2481  1.208    scottr 				addr += 32768;
   2482  1.208    scottr 			}
   2483  1.208    scottr 		}
   2484  1.208    scottr 	}
   2485  1.208    scottr 
   2486  1.319      jmmv 	if (mac68k_video.mv_len > 0) {
   2487  1.187    scottr 		/*
   2488  1.208    scottr 		 * We've already figured out where internal video is.
   2489  1.208    scottr 		 * Tell the user what we know.
   2490  1.187    scottr 		 */
   2491  1.243    scottr 		if (mac68k_machine.do_graybars)
   2492  1.355       rin 			printf("On-board video at addr %p (phys %p), "
   2493  1.319      jmmv 			    "len 0x%x.\n",
   2494  1.319      jmmv 			    (void *)mac68k_video.mv_kvaddr,
   2495  1.319      jmmv 			    (void *)mac68k_video.mv_phys,
   2496  1.319      jmmv 			    mac68k_video.mv_len);
   2497  1.187    scottr 	} else {
   2498  1.187    scottr 		/*
   2499  1.187    scottr 		 * We should now look through all of NuBus space to find where
   2500  1.187    scottr 		 * the internal video is being mapped.  Just to be sure we
   2501  1.187    scottr 		 * handle all the cases, we simply map our NuBus space exactly
   2502  1.187    scottr 		 * how MacOS did it.  As above, we find a bunch of ranges that
   2503  1.187    scottr 		 * are contiguously mapped.  Since there are a lot of pages
   2504  1.187    scottr 		 * that are all mapped to 0, we handle that as a special case
   2505  1.187    scottr 		 * where the length is negative.  We search in increments of
   2506  1.187    scottr 		 * 32768 because that's the page size that MacOS uses.
   2507  1.187    scottr 		 */
   2508  1.187    scottr 		nbnumranges = 0;
   2509  1.187    scottr 		for (i = 0; i < NBMAXRANGES; i++) {
   2510  1.187    scottr 			nbphys[i] = 0;
   2511  1.187    scottr 			nblog[i] = 0;
   2512  1.187    scottr 			nblen[i] = 0;
   2513   1.25   lkestel 		}
   2514  1.187    scottr 
   2515  1.187    scottr 		same = 0;
   2516  1.187    scottr 		for (addr = 0xF9000000; addr < 0xFF000000; addr += 32768) {
   2517  1.187    scottr 			if (!get_physical(addr, &phys)) {
   2518  1.187    scottr 				continue;
   2519  1.187    scottr 			}
   2520  1.187    scottr 			len = nbnumranges == 0 ? 0 : nblen[nbnumranges - 1];
   2521   1.46    briggs 
   2522  1.248    scottr #ifdef __debug_mondo_verbose__
   2523  1.243    scottr 			if (mac68k_machine.do_graybars)
   2524  1.243    scottr 				printf ("0x%lx --> 0x%lx\n", addr, phys);
   2525  1.248    scottr #endif
   2526  1.243    scottr 
   2527  1.187    scottr 			if (nbnumranges > 0
   2528  1.187    scottr 			    && addr == nblog[nbnumranges - 1] + len
   2529  1.187    scottr 			    && phys == nbphys[nbnumranges - 1]) {
   2530  1.187    scottr 				/* Same as last one */
   2531   1.55    briggs 				nblen[nbnumranges - 1] += 32768;
   2532  1.187    scottr 				same = 1;
   2533   1.55    briggs 			} else {
   2534  1.187    scottr 				if ((nbnumranges > 0)
   2535  1.187    scottr 				    && !same
   2536  1.187    scottr 				    && (addr == nblog[nbnumranges - 1] + len)
   2537  1.187    scottr 				    && (phys == nbphys[nbnumranges - 1] + len))
   2538  1.187    scottr 					nblen[nbnumranges - 1] += 32768;
   2539  1.187    scottr 				else {
   2540  1.371       rin 					if (same &&
   2541  1.371       rin 					    nbnumranges > 0 /* XXXGCC14 */) {
   2542  1.187    scottr 						nblen[nbnumranges - 1] = -len;
   2543  1.187    scottr 						same = 0;
   2544  1.187    scottr 					}
   2545  1.187    scottr 					if (nbnumranges == NBMAXRANGES) {
   2546  1.243    scottr 						if (mac68k_machine.do_graybars)
   2547  1.243    scottr 							printf("get_mapping(): Too many NuBus ranges.\n");
   2548  1.187    scottr 						break;
   2549  1.187    scottr 					}
   2550  1.187    scottr 					nbnumranges++;
   2551  1.187    scottr 					nblog[nbnumranges - 1] = addr;
   2552  1.187    scottr 					nbphys[nbnumranges - 1] = phys;
   2553  1.187    scottr 					nblen[nbnumranges - 1] = 32768;
   2554   1.55    briggs 				}
   2555   1.25   lkestel 			}
   2556   1.57    briggs 		}
   2557  1.187    scottr 		if (same) {
   2558  1.187    scottr 			nblen[nbnumranges - 1] = -nblen[nbnumranges - 1];
   2559  1.187    scottr 			same = 0;
   2560  1.187    scottr 		}
   2561  1.243    scottr 		if (mac68k_machine.do_graybars) {
   2562  1.243    scottr 			printf("Non-system RAM (nubus, etc.):\n");
   2563  1.243    scottr 			for (i = 0; i < nbnumranges; i++) {
   2564  1.243    scottr 				printf("     Log = 0x%lx, Phys = 0x%lx, Len = 0x%lx (%lu)\n",
   2565  1.243    scottr 				    nblog[i], nbphys[i], nblen[i], nblen[i]);
   2566  1.243    scottr 			}
   2567  1.187    scottr 		}
   2568   1.25   lkestel 
   2569  1.187    scottr 		/*
   2570  1.187    scottr 		 * We must now find the logical address of internal video in the
   2571  1.187    scottr 		 * ranges we made above.  Internal video is at physical 0, but
   2572  1.187    scottr 		 * a lot of pages map there.  Instead, we look for the logical
   2573  1.187    scottr 		 * page that maps to 32768 and go back one page.
   2574  1.187    scottr 		 */
   2575  1.187    scottr 		for (i = 0; i < nbnumranges; i++) {
   2576  1.187    scottr 			if (nblen[i] > 0
   2577  1.187    scottr 			    && nbphys[i] <= 32768
   2578  1.187    scottr 			    && 32768 <= nbphys[i] + nblen[i]) {
   2579  1.319      jmmv 				mac68k_video.mv_log = nblog[i] - nbphys[i];
   2580  1.319      jmmv 				mac68k_video.mv_len = nblen[i] + nbphys[i];
   2581  1.319      jmmv 				mac68k_video.mv_phys = 0;
   2582  1.187    scottr 				break;
   2583  1.187    scottr 			}
   2584   1.25   lkestel 		}
   2585  1.187    scottr 		if (i == nbnumranges) {
   2586  1.319      jmmv 			if (0x60000000 <= mac68k_video.mv_kvaddr
   2587  1.319      jmmv 			    && mac68k_video.mv_kvaddr < 0x70000000) {
   2588  1.243    scottr 				if (mac68k_machine.do_graybars)
   2589  1.243    scottr 					printf("Checking for Internal Video ");
   2590  1.187    scottr 				/*
   2591  1.187    scottr 				 * Kludge for IIvx internal video (60b0 0000).
   2592  1.187    scottr 				 * PB 520 (6000 0000)
   2593  1.187    scottr 				 */
   2594  1.187    scottr 				check_video("PB/IIvx (0x60?00000)",
   2595  1.187    scottr 				    1 * 1024 * 1024, 1 * 1024 * 1024);
   2596  1.319      jmmv 			} else if (0x50F40000 <= mac68k_video.mv_kvaddr
   2597  1.319      jmmv 			    && mac68k_video.mv_kvaddr < 0x50FBFFFF) {
   2598  1.187    scottr 				/*
   2599  1.187    scottr 				 * Kludge for LC internal video
   2600  1.187    scottr 				 */
   2601  1.187    scottr 				check_video("LC video (0x50f40000)",
   2602  1.187    scottr 				    512 * 1024, 512 * 1024);
   2603  1.319      jmmv 			} else if (0x50100100 <= mac68k_video.mv_kvaddr
   2604  1.319      jmmv 			    && mac68k_video.mv_kvaddr < 0x50400000) {
   2605  1.187    scottr 				/*
   2606  1.187    scottr 				 * Kludge for AV internal video
   2607  1.187    scottr 				 */
   2608  1.187    scottr 				check_video("AV video (0x50100100)",
   2609  1.187    scottr 				    1 * 1024 * 1024, 1 * 1024 * 1024);
   2610  1.187    scottr 			} else {
   2611  1.243    scottr 				if (mac68k_machine.do_graybars)
   2612  1.319      jmmv 					printf("  no internal video at "
   2613  1.319      jmmv 					    "address 0 -- "
   2614  1.319      jmmv 					    "mac68k_video.mv_kvaddr is "
   2615  1.319      jmmv 					    "0x%lx.\n",
   2616  1.319      jmmv 					    mac68k_video.mv_kvaddr);
   2617  1.187    scottr 			}
   2618  1.243    scottr 		} else if (mac68k_machine.do_graybars) {
   2619  1.355       rin 			printf("  Video address = %p\n",
   2620  1.319      jmmv 			    (void *)mac68k_video.mv_kvaddr);
   2621  1.355       rin 			printf("  Int video starts at %p\n",
   2622  1.319      jmmv 			    (void *)mac68k_video.mv_log);
   2623  1.187    scottr 			printf("  Length = 0x%x (%d) bytes\n",
   2624  1.319      jmmv 			    mac68k_video.mv_len, mac68k_video.mv_len);
   2625   1.57    briggs 		}
   2626   1.25   lkestel 	}
   2627  1.364       nat 	/* mv_len sanity check */
   2628  1.364       nat 	int reqsize = mac68k_video.mv_height * mac68k_video.mv_stride;
   2629  1.369       nat 	if (mac68k_video.mv_len < reqsize)
   2630  1.364       nat 		mac68k_video.mv_len = reqsize;
   2631   1.25   lkestel 
   2632  1.188    scottr 	return load_addr;	/* Return physical address of logical 0 */
   2633   1.25   lkestel }
   2634   1.25   lkestel 
   2635   1.27   lkestel /*
   2636   1.46    briggs  * Debugging code for locore page-traversal routine.
   2637   1.27   lkestel  */
   2638  1.301       chs void printstar(void);
   2639   1.46    briggs void
   2640   1.46    briggs printstar(void)
   2641   1.25   lkestel {
   2642   1.46    briggs 	/*
   2643   1.46    briggs 	 * Be careful as we assume that no registers are clobbered
   2644   1.46    briggs 	 * when we call this from assembly.
   2645   1.46    briggs 	 */
   2646  1.308     perry 	__asm volatile (
   2647  1.277   thorpej 			"	movl %a0,%sp@-;"
   2648  1.277   thorpej 			"	movl %a1,%sp@-;"
   2649  1.277   thorpej 			"	movl %d0,%sp@-;"
   2650  1.277   thorpej 			"	movl %d1,%sp@-");
   2651   1.25   lkestel 
   2652  1.121  christos 	/* printf("*"); */
   2653   1.25   lkestel 
   2654  1.308     perry 	__asm volatile (
   2655  1.277   thorpej 			"	movl %sp@+,%d1;"
   2656  1.277   thorpej 			"	movl %sp@+,%d0;"
   2657  1.277   thorpej 			"	movl %sp@+,%a1;"
   2658  1.277   thorpej 			"	movl %sp@+,%a0");
   2659  1.130    scottr }
   2660  1.131    scottr 
   2661  1.132    scottr /*
   2662  1.132    scottr  * Console bell callback; modularizes the console terminal emulator
   2663  1.132    scottr  * and the audio system, so neither requires direct knowledge of the
   2664  1.132    scottr  * other.
   2665  1.132    scottr  */
   2666  1.132    scottr 
   2667  1.131    scottr void
   2668  1.301       chs mac68k_set_bell_callback(int (*callback)(void *, int, int, int), void *cookie)
   2669  1.131    scottr {
   2670  1.131    scottr 	mac68k_bell_callback = callback;
   2671  1.313  christos 	mac68k_bell_cookie = (void *)cookie;
   2672  1.131    scottr }
   2673  1.131    scottr 
   2674  1.131    scottr int
   2675  1.301       chs mac68k_ring_bell(int freq, int length, int volume)
   2676  1.131    scottr {
   2677  1.131    scottr 	if (mac68k_bell_callback)
   2678  1.131    scottr 		return ((*mac68k_bell_callback)(mac68k_bell_cookie,
   2679  1.131    scottr 		    freq, length, volume));
   2680  1.131    scottr 	else
   2681  1.131    scottr 		return (ENXIO);
   2682    1.1    briggs }
   2683  1.341     rmind 
   2684  1.341     rmind int
   2685  1.341     rmind mm_md_physacc(paddr_t pa, vm_prot_t prot)
   2686  1.341     rmind {
   2687  1.341     rmind 	extern u_long maxaddr;
   2688  1.341     rmind 
   2689  1.341     rmind 	return (pa < maxaddr) ? 0 : EFAULT;
   2690  1.341     rmind }
   2691