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