1 /* SPDX-License-Identifier: GPL-2.0-or-later !! 1 /* $Id: head.S,v 1.105 2001/08/12 09:08:56 davem Exp $ 2 ** -*- mode: asm -*- !! 2 * head.S: The initial boot code for the Sparc port of Linux. 3 ** << 4 ** head.S -- This file contains the initial bo << 5 ** Linux/68k kernel. << 6 ** << 7 ** Copyright 1993 by Hamish Macdonald << 8 ** << 9 ** 68040 fixes by Michael Rausch << 10 ** 68060 fixes by Roman Hodek << 11 ** MMU cleanup by Randy Thelen << 12 ** Final MMU cleanup by Roman Zippel << 13 ** << 14 ** Atari support by Andreas Schwab, using idea << 15 ** and Bjoern Brauel << 16 ** VME Support by Richard Hirst << 17 ** << 18 ** 94/11/14 Andreas Schwab: put kernel at PAGE << 19 ** 94/11/18 Andreas Schwab: remove identity ma << 20 ** ++ Bjoern & Roman: ATARI-68040 support for << 21 ** 95/11/18 Richard Hirst: Added MVME166 suppo << 22 ** 96/04/26 Guenther Kelleter: fixed identity << 23 ** Magnum- and FX-a << 24 ** 98/04/25 Phil Blundell: added HP300 support << 25 ** 1998/08/30 David Kilzer: Added support for << 26 ** for linux-2.1.115 << 27 ** 1999/02/11 Richard Zidlicky: added Q40 sup << 28 ** 2004/05/13 Kars de Jong: Finalised HP300 su << 29 */ << 30 << 31 /* << 32 * Linux startup code. << 33 * << 34 * At this point, the boot loader has: << 35 * Disabled interrupts << 36 * Disabled caches << 37 * Put us in supervisor state. << 38 * << 39 * The kernel setup code takes the following s << 40 * . Raise interrupt level << 41 * . Set up initial kernel memory mapping. << 42 * . This sets up a mapping of the 4M of m << 43 * . It also does a mapping of any initial << 44 * . Enable the MMU << 45 * . Enable cache memories << 46 * . Jump to kernel startup << 47 * << 48 * Much of the file restructuring was to accom << 49 * 1) Remove register dependency through-out t << 50 * 2) Increase use of subroutines to perform f << 51 * 3) Increase readability of the code << 52 * << 53 * Of course, readability is a subjective issu << 54 * argued that that goal was accomplished. It << 55 * A key way to help make code more readable i << 56 * documentation. So, the first thing you wil << 57 * write-ups on the structure of the file, and << 58 * functional subroutines. << 59 * << 60 * General Structure: << 61 * ------------------ << 62 * Without a doubt the single largest chu << 63 * mapping the kernel and I/O physical space i << 64 * for the kernel. << 65 * There are new subroutines and data str << 66 * support cleaner and easier to understand. << 67 * First, you will find a routine call "m << 68 * a logical to a physical region for some len << 69 * type on behalf of the caller. This routine << 70 * actual per-machine specific code very simpl << 71 * A central part of the code, but not a << 72 * is the mmu_init code which is broken down i << 73 * (the same for all machines) and mapping mac << 74 * regions. << 75 * Also, there will be a description of e << 76 * caches. << 77 * You will notice that there is a chunk << 78 * can emit the entire MMU mapping of the mach << 79 * only in debug modes and can be very helpful << 80 * Further, there is a new console driver << 81 * also only engaged in debug mode. Currently << 82 * on the Macintosh class of machines. Howeve << 83 * others will plug-in support for specific ma << 84 * << 85 * ########################################### << 86 * << 87 * mmu_map << 88 * ------- << 89 * mmu_map was written for two key reason << 90 * that it was very difficult to read the prev << 91 * regions of memory. Second, the Macintosh r << 92 * memory allocations that it didn't make sens << 93 * existing code any further. << 94 * mmu_map requires some parameters: << 95 * << 96 * mmu_map (logical, physical, length, ca << 97 * << 98 * While this essentially describes the f << 99 * find more indepth description of other para << 100 * << 101 * mmu_get_root_table_entry << 102 * ------------------------ << 103 * mmu_get_ptr_table_entry << 104 * ----------------------- << 105 * mmu_get_page_table_entry << 106 * ------------------------ << 107 * << 108 * These routines are used by other mmu r << 109 * a table, if necessary a new table is alloca << 110 * basically like pmd_alloc() and pte_alloc() << 111 * table needs of course only to be allocated << 112 * so that here also some mmu specific initial << 113 * at the start of the kernel (the first page << 114 * the kernel_pg_dir. It must be at a position << 115 * to initialize the init task struct) and sin << 116 * settings, it's the easiest to use this page << 117 * for further pointer tables. << 118 * mmu_get_page_table_entry allocates always a << 119 * means 1024 pages and so 4MB of memory can b << 120 * to manage page tables in smaller pieces as << 121 * size. << 122 * << 123 * ########################################### << 124 * << 125 * << 126 * ########################################### << 127 * << 128 * mmu_engage << 129 * ---------- << 130 * Thanks to a small helping routine enab << 131 * and there is only one way left. mmu_engage << 132 * that only includes the absolute necessary t << 133 * position and to restore the original mappin << 134 * As this code doesn't need a transparent tra << 135 * means all registers are free to be used by << 136 * other purposes. << 137 * << 138 * ########################################### << 139 * << 140 * mmu_print << 141 * --------- << 142 * This algorithm will print out the page << 143 * appropriate for an 030 or an 040. This is << 144 * and as such is enclosed in #ifdef MMU_PRINT << 145 * << 146 * ########################################### << 147 * << 148 * console_init << 149 * ------------ << 150 * The console is also able to be turned << 151 * is specifically for debugging and can be ve << 152 * #ifdef / #endif clauses so it doesn't have << 153 * kernels. It's basic algorithm is to determ << 154 * (in height/width and bit depth) and then us << 155 * displaying an 8x8 font or an 8x16 (widthxhe << 156 * debugging so I can see more good data. But << 157 * for both fonts, so I included it. << 158 * Also, the algorithm for plotting pixel << 159 * theory other platforms could add support fo << 160 * buffers. This could be very useful. << 161 * << 162 * console_put_penguin << 163 * ------------------- << 164 * An important part of any Linux bring u << 165 * nothing like getting the Penguin on the scr << 166 * on any machine for which there is a console << 167 * << 168 * console_scroll << 169 * -------------- << 170 * My hope is that the scroll algorithm d << 171 * various platforms, but it wouldn't be hard << 172 * and new code if it doesn't. << 173 * << 174 * console_putc << 175 * ------------- << 176 * << 177 * ########################################### << 178 * << 179 * Register usage has greatly simplified << 180 * saves and restores all registers that it mo << 181 * value in there of course). So the only regi << 182 * is the stack pointer. << 183 * All other init code and data is now placed << 184 * be automatically freed at the end of the ke << 185 * << 186 * ########################################### << 187 * << 188 * options << 189 * ------- << 190 * There are many options available in a << 191 * taken the time to describe them here to sav << 192 * for them and trying to understand what they << 193 * << 194 * CONFIG_xxx: These are the obvious machine << 195 * during configuration. These are defined in << 196 * << 197 * CONSOLE_DEBUG: Only supports a Mac frame b << 198 * extended to support other platforms. << 199 * << 200 * TEST_MMU: This is a test harness for run << 201 * getting an MMU dump for another class of ma << 202 * that can be tested are any of the makes (At << 203 * and any of the models (030, 040, 060, etc.) << 204 * << 205 * NOTE: TEST_MMU is NOT permanent! It << 206 * When head.S boots on Atari, Am << 207 * machines. At that point the u << 208 * believed to be solid enough to << 209 * can be dropped. Do note that << 210 * head.S code significantly as l << 211 * clauses can be removed. << 212 * << 213 * MMU_NOCACHE_KERNEL: On the Macintosh platf << 214 * determing why devices don't appear to work. << 215 * the cacheability of the kernel bits. << 216 * << 217 * MMU_PRINT: There is a routine built into << 218 * MMU data structures. It outputs its result << 219 * interface. So where ever that winds up dri << 220 * mmu struct will appear. << 221 * << 222 * SERIAL_DEBUG: There are a series of << 223 * scattered through out the code to give prog << 224 * person sitting at the console. This consta << 225 * are used. << 226 * 3 * 227 * DEBUG: This is the standard DEBUG fla !! 4 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 228 * the kernel. It has the effect !! 5 * Copyright (C) 1995,1999 Pete Zaitcev (zaitcev@yahoo.com) 229 * the code. !! 6 * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) >> 7 * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) >> 8 * Copyright (C) 1997 Michael A. Griffith (grif@acm.org) 230 * 9 * 231 * FONT_6x11: !! 10 * CompactPCI platform by Eric Brower, 1999. 232 * FONT_8x8: << 233 * FONT_8x16: << 234 * In theory these could be deter << 235 * over by the booter. But, let' << 236 * coded value. (But, you will n << 237 * flexible!) A pointer to the f << 238 * is kept locally in Lconsole_fo << 239 * font size information dynamica << 240 * << 241 * Atari constants: << 242 * USE_PRINTER: Use the printer port for seria << 243 * USE_SCC_B: Use the SCC port A (Serial2) f << 244 * USE_SCC_A: Use the SCC port B (Modem2) fo << 245 * USE_MFP: Use the ST-MFP port (Modem1) f << 246 * << 247 * Macintosh constants: << 248 * MAC_USE_SCC_A: Use SCC port A (modem) for s << 249 * MAC_USE_SCC_B: Use SCC port B (printer) for << 250 */ 11 */ 251 12 252 #include <linux/linkage.h> !! 13 #include <linux/version.h> >> 14 #include <linux/config.h> 253 #include <linux/init.h> 15 #include <linux/init.h> 254 #include <linux/pgtable.h> << 255 #include <asm/bootinfo.h> << 256 #include <asm/bootinfo-amiga.h> << 257 #include <asm/bootinfo-atari.h> << 258 #include <asm/bootinfo-hp300.h> << 259 #include <asm/bootinfo-mac.h> << 260 #include <asm/bootinfo-q40.h> << 261 #include <asm/bootinfo-virt.h> << 262 #include <asm/bootinfo-vme.h> << 263 #include <asm/setup.h> << 264 #include <asm/entry.h> << 265 #include <asm/page.h> << 266 #include <asm/asm-offsets.h> << 267 #ifdef CONFIG_MAC << 268 # include <asm/machw.h> << 269 #endif << 270 << 271 #ifdef CONFIG_EARLY_PRINTK << 272 # define SERIAL_DEBUG << 273 # if defined(CONFIG_MAC) && defined(CONFIG_FO << 274 # define CONSOLE_DEBUG << 275 # endif << 276 #endif << 277 << 278 #undef MMU_PRINT << 279 #undef MMU_NOCACHE_KERNEL << 280 #undef DEBUG << 281 << 282 /* << 283 * For the head.S console, there are three sup << 284 * The 8x8 font is harder to read but fits mor << 285 */ << 286 #define FONT_8x8 /* default */ << 287 /* #define FONT_8x16 */ /* 2nd choice */ << 288 /* #define FONT_6x11 */ /* 3rd choice */ << 289 << 290 .globl kernel_pg_dir << 291 .globl availmem << 292 .globl m68k_init_mapped_size << 293 .globl m68k_pgtable_cachemode << 294 .globl m68k_supervisor_cachemode << 295 #ifdef CONFIG_MVME16x << 296 .globl mvme_bdid << 297 #endif << 298 #ifdef CONFIG_Q40 << 299 .globl q40_mem_cptr << 300 #endif << 301 << 302 CPUTYPE_040 = 1 /* indicates an 040 */ << 303 CPUTYPE_060 = 2 /* indicates an 060 */ << 304 CPUTYPE_0460 = 3 /* if either above are << 305 CPUTYPE_020 = 4 /* indicates an 020 */ << 306 << 307 /* Translation control register */ << 308 TC_ENABLE = 0x8000 << 309 TC_PAGE8K = 0x4000 << 310 TC_PAGE4K = 0x0000 << 311 << 312 /* Transparent translation registers */ << 313 TTR_ENABLE = 0x8000 /* enable tran << 314 TTR_ANYMODE = 0x4000 /* user and ke << 315 TTR_KERNELMODE = 0x2000 /* only kernel << 316 TTR_USERMODE = 0x0000 /* only user m << 317 TTR_CI = 0x0400 /* inhibit cac << 318 TTR_RW = 0x0200 /* read/write << 319 TTR_RWM = 0x0100 /* read/write << 320 TTR_FCB2 = 0x0040 /* function co << 321 TTR_FCB1 = 0x0020 /* function co << 322 TTR_FCB0 = 0x0010 /* function co << 323 TTR_FCM2 = 0x0004 /* function co << 324 TTR_FCM1 = 0x0002 /* function co << 325 TTR_FCM0 = 0x0001 /* function co << 326 << 327 /* Cache Control registers */ << 328 CC6_ENABLE_D = 0x80000000 /* enable data << 329 CC6_FREEZE_D = 0x40000000 /* freeze data << 330 CC6_ENABLE_SB = 0x20000000 /* enable stor << 331 CC6_PUSH_DPI = 0x10000000 /* disable CPU << 332 CC6_HALF_D = 0x08000000 /* half-cache << 333 CC6_ENABLE_B = 0x00800000 /* enable bran << 334 CC6_CLRA_B = 0x00400000 /* clear all e << 335 CC6_CLRU_B = 0x00200000 /* clear user << 336 CC6_ENABLE_I = 0x00008000 /* enable inst << 337 CC6_FREEZE_I = 0x00004000 /* freeze inst << 338 CC6_HALF_I = 0x00002000 /* half-cache << 339 CC3_ALLOC_WRITE = 0x00002000 /* write alloc << 340 CC3_ENABLE_DB = 0x00001000 /* enable data << 341 CC3_CLR_D = 0x00000800 /* clear data << 342 CC3_CLRE_D = 0x00000400 /* clear entry << 343 CC3_FREEZE_D = 0x00000200 /* freeze data << 344 CC3_ENABLE_D = 0x00000100 /* enable data << 345 CC3_ENABLE_IB = 0x00000010 /* enable inst << 346 CC3_CLR_I = 0x00000008 /* clear instr << 347 CC3_CLRE_I = 0x00000004 /* clear entry << 348 CC3_FREEZE_I = 0x00000002 /* freeze inst << 349 CC3_ENABLE_I = 0x00000001 /* enable inst << 350 << 351 /* Miscellaneous definitions */ << 352 PAGESIZE = 4096 << 353 PAGESHIFT = 12 << 354 << 355 ROOT_TABLE_SIZE = 128 << 356 PTR_TABLE_SIZE = 128 << 357 PAGE_TABLE_SIZE = 64 << 358 ROOT_INDEX_SHIFT = 25 << 359 PTR_INDEX_SHIFT = 18 << 360 PAGE_INDEX_SHIFT = 12 << 361 << 362 #ifdef DEBUG << 363 /* When debugging use readable names for label << 364 #ifdef __STDC__ << 365 #define L(name) .head.S.##name << 366 #else << 367 #define L(name) .head.S./**/name << 368 #endif << 369 #else << 370 #ifdef __STDC__ << 371 #define L(name) .L##name << 372 #else << 373 #define L(name) .L/**/name << 374 #endif << 375 #endif << 376 << 377 /* The __INITDATA stuff is a no-op when ftrace << 378 #ifndef __INITDATA << 379 #define __INITDATA .data << 380 #define __FINIT .previous << 381 #endif << 382 << 383 /* Several macros to make the writing of subro << 384 * - func_start marks the beginning of the rou << 385 * register and saves the registers, it also << 386 * to automatically restore the registers ag << 387 * - func_return marks the end of the routine << 388 * macro to restore registers and jump back << 389 * - func_define generates another macro to au << 390 * onto the stack call the subroutine and cl << 391 */ << 392 << 393 /* Within subroutines these macros can be used << 394 * on the stack. With STACK some allocated mem << 395 * accessed and ARG0 points to the return addr << 396 */ << 397 #define STACK %a6@(stackstart) << 398 #define ARG0 %a6@(4) << 399 #define ARG1 %a6@(8) << 400 #define ARG2 %a6@(12) << 401 #define ARG3 %a6@(16) << 402 #define ARG4 %a6@(20) << 403 << 404 .macro func_start name,saveregs,stack=0 << 405 L(\name): << 406 linkw %a6,#-\stack << 407 moveml \saveregs,%sp@- << 408 .set stackstart,-\stack << 409 << 410 .macro func_return_\name << 411 moveml %sp@+,\saveregs << 412 unlk %a6 << 413 rts << 414 .endm << 415 .endm << 416 << 417 .macro func_return name << 418 func_return_\name << 419 .endm << 420 << 421 .macro func_call name << 422 jbsr L(\name) << 423 .endm << 424 << 425 .macro move_stack nr,arg1,arg2,arg3,arg4 << 426 .if \nr << 427 move_stack "(\nr-1)",\arg2,\arg3, << 428 movel \arg1,%sp@- << 429 .endif << 430 .endm << 431 << 432 .macro func_define name,nr=0 << 433 .macro \name arg1,arg2,arg3,arg4 << 434 move_stack \nr,\arg1,\arg2,\arg3, << 435 func_call \name << 436 .if \nr << 437 lea %sp@(\nr*4),%sp << 438 .endif << 439 .endm << 440 .endm << 441 << 442 func_define mmu_map,4 << 443 func_define mmu_map_tt,4 << 444 func_define mmu_fixup_page_mmu_cache,1 << 445 func_define mmu_temp_map,2 << 446 func_define mmu_engage << 447 func_define mmu_get_root_table_entry,1 << 448 func_define mmu_get_ptr_table_entry,2 << 449 func_define mmu_get_page_table_entry,2 << 450 func_define mmu_print << 451 func_define get_new_page << 452 #if defined(CONFIG_HP300) || defined(CONFIG_AP << 453 func_define set_leds << 454 #endif << 455 << 456 .macro mmu_map_eq arg1,arg2,arg3 << 457 mmu_map \arg1,\arg1,\arg2,\arg3 << 458 .endm << 459 << 460 .macro get_bi_record record << 461 pea \record << 462 func_call get_bi_record << 463 addql #4,%sp << 464 .endm << 465 << 466 func_define serial_putc,1 << 467 func_define console_putc,1 << 468 << 469 func_define console_init << 470 func_define console_put_penguin << 471 func_define console_plot_pixel,3 << 472 func_define console_scroll << 473 << 474 .macro putc ch << 475 #if defined(CONSOLE_DEBUG) || defined(SERIAL_D << 476 pea \ch << 477 #endif << 478 #ifdef CONSOLE_DEBUG << 479 func_call console_putc << 480 #endif << 481 #ifdef SERIAL_DEBUG << 482 func_call serial_putc << 483 #endif << 484 #if defined(CONSOLE_DEBUG) || defined(SERIAL_D << 485 addql #4,%sp << 486 #endif << 487 .endm << 488 << 489 .macro dputc ch << 490 #ifdef DEBUG << 491 putc \ch << 492 #endif << 493 .endm << 494 << 495 func_define putn,1 << 496 << 497 .macro dputn nr << 498 #ifdef DEBUG << 499 putn \nr << 500 #endif << 501 .endm << 502 << 503 .macro puts string << 504 #if defined(CONSOLE_DEBUG) || defined(SERIAL_D << 505 __INITDATA << 506 .Lstr\@: << 507 .string "\string" << 508 __FINIT << 509 pea %pc@(.Lstr\@) << 510 func_call puts << 511 addql #4,%sp << 512 #endif << 513 .endm << 514 << 515 .macro dputs string << 516 #ifdef DEBUG << 517 puts "\string" << 518 #endif << 519 .endm << 520 << 521 #define is_not_amiga(lab) cmpl &MACH_AMIGA,%pc << 522 #define is_not_atari(lab) cmpl &MACH_ATARI,%pc << 523 #define is_not_mac(lab) cmpl &MACH_MAC,%pc@(m6 << 524 #define is_not_mvme147(lab) cmpl &MACH_MVME147 << 525 #define is_not_mvme16x(lab) cmpl &MACH_MVME16x << 526 #define is_not_bvme6000(lab) cmpl &MACH_BVME60 << 527 #define is_mvme147(lab) cmpl &MACH_MVME147,%pc << 528 #define is_mvme16x(lab) cmpl &MACH_MVME16x,%pc << 529 #define is_bvme6000(lab) cmpl &MACH_BVME6000,% << 530 #define is_not_hp300(lab) cmpl &MACH_HP300,%pc << 531 #define is_not_apollo(lab) cmpl &MACH_APOLLO,% << 532 #define is_not_q40(lab) cmpl &MACH_Q40,%pc@(m6 << 533 #define is_not_sun3x(lab) cmpl &MACH_SUN3X,%pc << 534 #define is_not_virt(lab) cmpl &MACH_VIRT,%pc@( << 535 << 536 #define hasnt_leds(lab) cmpl &MACH_HP300,%pc@( << 537 jeq 42f; \ << 538 cmpl &MACH_APOLLO,%pc@ << 539 jne lab ;\ << 540 42:\ << 541 << 542 #define is_040_or_060(lab) btst &CPUTYPE_ << 543 #define is_not_040_or_060(lab) btst &CPUTYPE_ << 544 #define is_040(lab) btst &CPUTYPE_ << 545 #define is_060(lab) btst &CPUTYPE_ << 546 #define is_not_060(lab) btst &CPUTYPE_ << 547 #define is_020(lab) btst &CPUTYPE_ << 548 #define is_not_020(lab) btst &CPUTYPE_ << 549 << 550 /* On the HP300 we use the on-board LEDs for d << 551 the console is running. Writing a 1 bit tu << 552 _off_ - on the 340 bit 7 is towards the bac << 553 .macro leds mask << 554 #if defined(CONFIG_HP300) || defined(CONFIG_AP << 555 hasnt_leds(.Lled\@) << 556 pea \mask << 557 func_call set_leds << 558 addql #4,%sp << 559 .Lled\@: << 560 #endif << 561 .endm << 562 << 563 __HEAD << 564 ENTRY(_stext) << 565 /* << 566 * Version numbers of the bootinfo interface << 567 * The area from _stext to _start will later b << 568 */ << 569 bras 1f /* Jump over bootinfo << 570 << 571 .long BOOTINFOV_MAGIC << 572 .long MACH_AMIGA, AMIGA_BOOTI_VERSIO << 573 .long MACH_ATARI, ATARI_BOOTI_VERSIO << 574 .long MACH_MVME147, MVME147_BOOTI_VE << 575 .long MACH_MVME16x, MVME16x_BOOTI_VE << 576 .long MACH_BVME6000, BVME6000_BOOTI_ << 577 .long MACH_MAC, MAC_BOOTI_VERSION << 578 .long MACH_Q40, Q40_BOOTI_VERSION << 579 .long MACH_HP300, HP300_BOOTI_VERSIO << 580 .long 0 << 581 1: jra __start << 582 << 583 .equ kernel_pg_dir,_stext << 584 << 585 .equ .,_stext+PAGESIZE << 586 << 587 ENTRY(_start) << 588 jra __start << 589 __INIT << 590 ENTRY(__start) << 591 /* << 592 * Setup initial stack pointer << 593 */ << 594 lea %pc@(_stext),%sp << 595 << 596 /* << 597 * Record the CPU and machine type. << 598 */ << 599 get_bi_record BI_MACHTYPE << 600 lea %pc@(m68k_machtype),%a1 << 601 movel %a0@,%a1@ << 602 << 603 get_bi_record BI_FPUTYPE << 604 lea %pc@(m68k_fputype),%a1 << 605 movel %a0@,%a1@ << 606 << 607 get_bi_record BI_MMUTYPE << 608 lea %pc@(m68k_mmutype),%a1 << 609 movel %a0@,%a1@ << 610 << 611 get_bi_record BI_CPUTYPE << 612 lea %pc@(m68k_cputype),%a1 << 613 movel %a0@,%a1@ << 614 << 615 leds 0x1 << 616 << 617 #ifdef CONFIG_MAC << 618 /* << 619 * For Macintosh, we need to determine the dis << 620 * while debugging it). << 621 */ << 622 << 623 is_not_mac(L(test_notmac)) << 624 << 625 get_bi_record BI_MAC_VADDR << 626 lea %pc@(L(mac_videobase)),%a1 << 627 movel %a0@,%a1@ << 628 << 629 get_bi_record BI_MAC_VDEPTH << 630 lea %pc@(L(mac_videodepth)),%a1 << 631 movel %a0@,%a1@ << 632 << 633 get_bi_record BI_MAC_VDIM << 634 lea %pc@(L(mac_dimensions)),%a1 << 635 movel %a0@,%a1@ << 636 << 637 get_bi_record BI_MAC_VROW << 638 lea %pc@(L(mac_rowbytes)),%a1 << 639 movel %a0@,%a1@ << 640 << 641 get_bi_record BI_MAC_SCCBASE << 642 lea %pc@(L(mac_sccbase)),%a1 << 643 movel %a0@,%a1@ << 644 << 645 L(test_notmac): << 646 #endif /* CONFIG_MAC */ << 647 << 648 #ifdef CONFIG_VIRT << 649 is_not_virt(L(test_notvirt)) << 650 << 651 get_bi_record BI_VIRT_GF_TTY_BASE << 652 lea %pc@(L(virt_gf_tty_base)),%a1 << 653 movel %a0@,%a1@ << 654 L(test_notvirt): << 655 #endif /* CONFIG_VIRT */ << 656 << 657 /* << 658 * There are ultimately two pieces of informat << 659 * processors CpuType and CacheBits. The CPUT << 660 * and is converted here from a booter type de << 661 * number which allows for the standard is_0x0 << 662 */ << 663 movel %pc@(m68k_cputype),%d0 << 664 /* << 665 * Assume it's an 030 << 666 */ << 667 clrl %d1 << 668 << 669 /* << 670 * Test the BootInfo cputype for 060 << 671 */ << 672 btst #CPUB_68060,%d0 << 673 jeq 1f << 674 bset #CPUTYPE_060,%d1 << 675 bset #CPUTYPE_0460,%d1 << 676 jra 3f << 677 1: << 678 /* << 679 * Test the BootInfo cputype for 040 << 680 */ << 681 btst #CPUB_68040,%d0 << 682 jeq 2f << 683 bset #CPUTYPE_040,%d1 << 684 bset #CPUTYPE_0460,%d1 << 685 jra 3f << 686 2: << 687 /* << 688 * Test the BootInfo cputype for 020 << 689 */ << 690 btst #CPUB_68020,%d0 << 691 jeq 3f << 692 bset #CPUTYPE_020,%d1 << 693 jra 3f << 694 3: << 695 /* << 696 * Record the cpu type << 697 */ << 698 lea %pc@(L(cputype)),%a0 << 699 movel %d1,%a0@ << 700 << 701 /* << 702 * NOTE: << 703 * << 704 * Now the macros are valid: << 705 * is_040_or_060 << 706 * is_not_040_or_060 << 707 * is_040 << 708 * is_060 << 709 * is_not_060 << 710 */ << 711 << 712 /* << 713 * Determine the cache mode for pages << 714 * and for supervisor mode, unused for << 715 */ << 716 clrl %d0 << 717 clrl %d1 << 718 << 719 is_not_040_or_060(L(save_cachetype)) << 720 << 721 /* << 722 * '040 or '060 << 723 * d1 := cacheable write-through << 724 * NOTE: The 68040 manual strongly rec << 725 * but we have been using write-throug << 726 * guess it is OK. << 727 */ << 728 #ifdef CONFIG_060_WRITETHROUGH << 729 /* << 730 * If this is a 68060 board using driv << 731 * problems, then supervisor memory ac << 732 * also; otherwise, we want copyback. << 733 */ << 734 << 735 is_not_060(1f) << 736 movel #_PAGE_CACHE040W,%d0 << 737 jra L(save_cachetype) << 738 #endif /* CONFIG_060_WRITETHROUGH */ << 739 1: << 740 movew #_PAGE_CACHE040,%d0 << 741 << 742 movel #_PAGE_CACHE040W,%d1 << 743 << 744 L(save_cachetype): << 745 /* Save cache mode for supervisor mode << 746 */ << 747 lea %pc@(m68k_supervisor_cachemode << 748 movel %d0,%a0@ << 749 lea %pc@(m68k_pgtable_cachemode),% << 750 movel %d1,%a0@ << 751 << 752 /* << 753 * raise interrupt level << 754 */ << 755 movew #0x2700,%sr << 756 << 757 /* << 758 If running on an Atari, determine the I/O b << 759 serial port and test if we are running on a << 760 This test is necessary here, because on the << 761 port is only accessible in the high I/O mem << 762 << 763 The test whether it is a Medusa is done by << 764 phys. 0x0. This should result in a bus erro << 765 << 766 ...should, but doesn't. The Afterburner040 << 767 same behaviour (0x0..0x7 are no ROM shadow) << 768 another test to distinguish Medusa and AB04 << 769 read attempt for 0x00ff82fe phys. that shou << 770 (+AB040), but is in the range where the Med << 771 << 772 The test for the Hades is done by reading a << 773 should give a bus error on the Medusa. << 774 */ << 775 << 776 #ifdef CONFIG_ATARI << 777 is_not_atari(L(notypetest)) << 778 << 779 /* get special machine type (Medusa/Ha << 780 moveq #0,%d3 /* default if tag doesn << 781 get_bi_record BI_ATARI_MCH_TYPE << 782 tstl %d0 << 783 jbmi 1f << 784 movel %a0@,%d3 << 785 lea %pc@(atari_mch_type),%a0 << 786 movel %d3,%a0@ << 787 1: << 788 /* On the Hades, the iobase must be se << 789 * serial port. There are no I/O regs << 790 moveq #0,%d0 << 791 cmpl #ATARI_MACH_HADES,%d3 << 792 jbne 1f << 793 movel #0xff000000,%d0 /* Had << 794 1: lea %pc@(L(iobase)),%a0 << 795 movel %d0,%a0@ << 796 << 797 L(notypetest): << 798 #endif << 799 << 800 #ifdef CONFIG_VME << 801 is_mvme147(L(getvmetype)) << 802 is_bvme6000(L(getvmetype)) << 803 is_not_mvme16x(L(gvtdone)) << 804 << 805 /* See if the loader has specified the << 806 * versions of VMELILO and TFTPLILO do << 807 * early so we know how to handle cons << 808 * doesn't exist then we use the Bug f << 809 */ << 810 L(getvmetype): << 811 get_bi_record BI_VME_TYPE << 812 tstl %d0 << 813 jbmi 1f << 814 movel %a0@,%d3 << 815 lea %pc@(vme_brdtype),%a0 << 816 movel %d3,%a0@ << 817 1: << 818 #ifdef CONFIG_MVME16x << 819 is_not_mvme16x(L(gvtdone)) << 820 << 821 /* Need to get the BRD_ID info to diff << 822 * etc. This is available as a BI_VME << 823 * versions of VMELILO and TFTPLILO, o << 824 */ << 825 get_bi_record BI_VME_BRDINFO << 826 tstl %d0 << 827 jpl 1f << 828 << 829 /* Get pointer to board ID data from B << 830 movel %d2,%sp@- << 831 trap #15 << 832 .word 0x70 /* trap 0x70 - << 833 movel %sp@+,%a0 << 834 1: << 835 lea %pc@(mvme_bdid),%a1 << 836 /* Structure is 32 bytes long */ << 837 movel %a0@+,%a1@+ << 838 movel %a0@+,%a1@+ << 839 movel %a0@+,%a1@+ << 840 movel %a0@+,%a1@+ << 841 movel %a0@+,%a1@+ << 842 movel %a0@+,%a1@+ << 843 movel %a0@+,%a1@+ << 844 movel %a0@+,%a1@+ << 845 #endif << 846 << 847 L(gvtdone): << 848 << 849 #endif << 850 << 851 #ifdef CONFIG_HP300 << 852 is_not_hp300(L(nothp)) << 853 << 854 /* Get the address of the UART for ser << 855 get_bi_record BI_HP300_UART_ADDR << 856 tstl %d0 << 857 jbmi 1f << 858 movel %a0@,%d3 << 859 lea %pc@(L(uartbase)),%a0 << 860 movel %d3,%a0@ << 861 get_bi_record BI_HP300_UART_SCODE << 862 tstl %d0 << 863 jbmi 1f << 864 movel %a0@,%d3 << 865 lea %pc@(L(uart_scode)),%a0 << 866 movel %d3,%a0@ << 867 1: << 868 L(nothp): << 869 #endif << 870 << 871 /* << 872 * Initialize serial port << 873 */ << 874 jbsr L(serial_init) << 875 << 876 /* << 877 * Initialize console << 878 */ << 879 #ifdef CONFIG_MAC << 880 is_not_mac(L(nocon)) << 881 # ifdef CONSOLE_DEBUG << 882 console_init << 883 # ifdef CONFIG_LOGO << 884 console_put_penguin << 885 # endif /* CONFIG_LOGO */ << 886 # endif /* CONSOLE_DEBUG */ << 887 L(nocon): << 888 #endif /* CONFIG_MAC */ << 889 << 890 << 891 putc '\n' << 892 putc 'A' << 893 leds 0x2 << 894 dputn %pc@(L(cputype)) << 895 dputn %pc@(m68k_supervisor_cachemode << 896 dputn %pc@(m68k_pgtable_cachemode) << 897 dputc '\n' << 898 << 899 /* << 900 * Save physical start address of kernel << 901 */ << 902 lea %pc@(L(phys_kernel_start)),%a0 << 903 lea %pc@(_stext),%a1 << 904 subl #_stext,%a1 << 905 addl #PAGE_OFFSET,%a1 << 906 movel %a1,%a0@ << 907 << 908 putc 'B' << 909 << 910 leds 0x4 << 911 << 912 /* << 913 * mmu_init << 914 * << 915 * This block of code does what's necessa << 916 * of machines for execution of Linux. << 917 * First map the first 4, 8, or 16 MB of << 918 */ << 919 << 920 get_bi_record BI_MEMCHUNK << 921 movel %a0@(4),%d0 << 922 movel #16*1024*1024,%d1 << 923 cmpl %d0,%d1 << 924 jls 1f << 925 lsrl #1,%d1 << 926 cmpl %d0,%d1 << 927 jls 1f << 928 lsrl #1,%d1 << 929 1: << 930 lea %pc@(m68k_init_mapped_size),%a << 931 movel %d1,%a0@ << 932 mmu_map #PAGE_OFFSET,%pc@(L(phys_kerne << 933 %pc@(m68k_supervisor_cachemode << 934 << 935 putc 'C' << 936 << 937 #ifdef CONFIG_AMIGA << 938 << 939 L(mmu_init_amiga): << 940 << 941 is_not_amiga(L(mmu_init_not_amiga)) << 942 /* << 943 * mmu_init_amiga << 944 */ << 945 << 946 putc 'D' << 947 << 948 is_not_040_or_060(1f) << 949 << 950 /* << 951 * 040: Map the 16Meg range physical 0 << 952 */ << 953 mmu_map #0x80000000,#0,#0x0100 << 954 /* << 955 * Map the Zorro III I/O space with tr << 956 * for frame buffer memory etc. << 957 */ << 958 mmu_map_tt #1,#0x40000000,#0x2000 << 959 << 960 jbra L(mmu_init_done) << 961 << 962 1: << 963 /* << 964 * 030: Map the 32Meg range physical 0 << 965 */ << 966 mmu_map #0x80000000,#0,#0x0200 << 967 mmu_map_tt #1,#0x40000000,#0x2000 << 968 << 969 jbra L(mmu_init_done) << 970 << 971 L(mmu_init_not_amiga): << 972 #endif << 973 << 974 #ifdef CONFIG_ATARI << 975 << 976 L(mmu_init_atari): << 977 << 978 is_not_atari(L(mmu_init_not_atari)) << 979 << 980 putc 'E' << 981 << 982 /* On the Atari, we map the I/O region (phys. << 983 the last 16 MB of virtual address space to << 984 0xffxxxxxx -> 0x00xxxxxx). For this, an add << 985 needed. I/O ranges are marked non-cachable. << 986 << 987 For the Medusa it is better to map the I/O << 988 (i.e. 0xffxxxxxx -> 0xffxxxxxx), because so << 989 accessible only in the high area. << 990 << 991 On the Hades all I/O registers are only acc << 992 area. << 993 */ << 994 << 995 /* I/O base addr for non-Medusa, non-H << 996 moveq #0,%d0 << 997 movel %pc@(atari_mch_type),%d3 << 998 cmpl #ATARI_MACH_MEDUSA,%d3 << 999 jbeq 2f << 1000 cmpl #ATARI_MACH_HADES,%d3 << 1001 jbne 1f << 1002 2: movel #0xff000000,%d0 /* Medusa/Had << 1003 1: movel %d0,%d3 << 1004 << 1005 is_040_or_060(L(spata68040)) << 1006 << 1007 /* Map everything non-cacheable, thou << 1008 * need to disable caches (crucial on << 1009 * (standard I/O) and 0xf00000..0xf3f << 1010 * isn't really used, except for some << 1011 * ROMs (mirror at phys. 0x0), so cac << 1012 * this. */ << 1013 mmu_map #0xff000000,%d3,#0x01000000,# << 1014 << 1015 jbra L(mmu_init_done) << 1016 << 1017 L(spata68040): << 1018 << 1019 mmu_map #0xff000000,%d3,#0x01000000,# << 1020 << 1021 jbra L(mmu_init_done) << 1022 << 1023 L(mmu_init_not_atari): << 1024 #endif << 1025 << 1026 #ifdef CONFIG_Q40 << 1027 is_not_q40(L(notq40)) << 1028 /* << 1029 * add transparent mapping for 0xff00 << 1030 * non-cached serialized etc.. << 1031 * this includes master chip, DAC, RT << 1032 * 0xfe000000-0xfeffffff is for scree << 1033 */ << 1034 << 1035 putc 'Q' << 1036 << 1037 mmu_map_tt #0,#0xfe000000,#0x010 << 1038 mmu_map_tt #1,#0xff000000,#0x010 << 1039 << 1040 jbra L(mmu_init_done) << 1041 << 1042 L(notq40): << 1043 #endif << 1044 << 1045 #ifdef CONFIG_HP300 << 1046 is_not_hp300(L(nothp300)) << 1047 << 1048 /* On the HP300, we map the ROM, INTI << 1049 * by mapping 32MB (on 020/030) or 16 << 1050 * The ROM mapping is needed because << 1051 */ << 1052 << 1053 is_040(1f) << 1054 << 1055 /* << 1056 * 030: Map the 32Meg range physical << 1057 */ << 1058 mmu_map #0xf0000000,#0,#0x02000000,#_ << 1059 << 1060 jbra L(mmu_init_done) << 1061 << 1062 1: << 1063 /* << 1064 * 040: Map the 16Meg range physical << 1065 */ << 1066 mmu_map #0xf0000000,#0,#0x01000000,#_ << 1067 << 1068 jbra L(mmu_init_done) << 1069 << 1070 L(nothp300): << 1071 #endif /* CONFIG_HP300 */ << 1072 << 1073 #ifdef CONFIG_MVME147 << 1074 << 1075 is_not_mvme147(L(not147)) << 1076 << 1077 /* << 1078 * On MVME147 we have already created << 1079 * 4MB of RAM at address 0, so now ne << 1080 * mapping of the top of memory space << 1081 * so we can access on-board i/o area << 1082 */ << 1083 << 1084 mmu_map_tt #1,#0xe0000000,#0x200 << 1085 << 1086 jbra L(mmu_init_done) << 1087 << 1088 L(not147): << 1089 #endif /* CONFIG_MVME147 */ << 1090 << 1091 #ifdef CONFIG_MVME16x << 1092 << 1093 is_not_mvme16x(L(not16x)) << 1094 << 1095 /* << 1096 * On MVME16x we have already created << 1097 * 4MB of RAM at address 0, so now ne << 1098 * mapping of the top of memory space << 1099 * Supervisor only access, so transpa << 1100 * clash with User code virtual addre << 1101 * this covers IO devices, PROM and S << 1102 * mapping is needed to allow 167Bug << 1103 * IO is in the range 0xfff00000 to 0 << 1104 * PROM is 0xff800000->0xffbfffff and << 1105 * 0xffe00000->0xffe1ffff. << 1106 */ << 1107 << 1108 mmu_map_tt #1,#0xe0000000,#0x200 << 1109 << 1110 jbra L(mmu_init_done) << 1111 << 1112 L(not16x): << 1113 #endif /* CONFIG_MVME162 | CONFIG_MVME167 */ << 1114 << 1115 #ifdef CONFIG_BVME6000 << 1116 << 1117 is_not_bvme6000(L(not6000)) << 1118 << 1119 /* << 1120 * On BVME6000 we have already create << 1121 * 4MB of RAM at address 0, so now ne << 1122 * mapping of the top of memory space << 1123 * so we can access on-board i/o area << 1124 * Supervisor only access, so transpa << 1125 * clash with User code virtual addre << 1126 */ << 1127 << 1128 mmu_map_tt #1,#0xe0000000,#0x200 << 1129 << 1130 jbra L(mmu_init_done) << 1131 << 1132 L(not6000): << 1133 #endif /* CONFIG_BVME6000 */ << 1134 << 1135 /* << 1136 * mmu_init_mac << 1137 * << 1138 * The Macintosh mappings are less clear. << 1139 * << 1140 * Even as of this writing, it is unclear how << 1141 * Macintosh mappings will be done. However, << 1142 * the first author of this code I'm proposin << 1143 * following model: << 1144 * << 1145 * Map the kernel (that's already done), << 1146 * Map the I/O (on most machines that's the << 1147 * 0x5000.0000 ... 0x5300.0000 range, << 1148 * Map the video frame buffer using as few pa << 1149 * as absolutely (this requirement mostly ste << 1150 * the fact that when the frame buffer is at << 1151 * 0x0000.0000 then we know there is valid RA << 1152 * above the screen that we don't want to was << 1153 * << 1154 * By the way, if the frame buffer is at 0x00 << 1155 * then the Macintosh is known as an RBV base << 1156 * << 1157 * By the way 2, the code currently maps in a << 1158 * regions. But I'd like to cut that out. ( << 1159 * of the mappings up into the kernel proper << 1160 * map what's necessary.) << 1161 */ << 1162 << 1163 #ifdef CONFIG_MAC << 1164 << 1165 L(mmu_init_mac): << 1166 << 1167 is_not_mac(L(mmu_init_not_mac)) << 1168 << 1169 putc 'F' << 1170 << 1171 is_not_040_or_060(1f) << 1172 << 1173 moveq #_PAGE_NOCACHE_S,%d3 << 1174 jbra 2f << 1175 1: << 1176 moveq #_PAGE_NOCACHE030,%d3 << 1177 2: << 1178 /* << 1179 * Mac Note: screen address of logica << 1180 * we simply map the 4MB th << 1181 */ << 1182 << 1183 movel #VIDEOMEMMASK,%d0 << 1184 andl %pc@(L(mac_videobase)),%d0 << 1185 << 1186 mmu_map #VIDEOMEMBASE,%d0,#VI << 1187 /* ROM from 4000 0000 to 4200 0000 (o << 1188 mmu_map_eq #0x40000000,#0x020000 << 1189 /* IO devices (incl. serial port) fro << 1190 mmu_map_eq #0x50000000,#0x030000 << 1191 /* Nubus slot space (video at 0xF0000 << 1192 mmu_map_tt #1,#0xf8000000,#0x080 << 1193 << 1194 jbra L(mmu_init_done) << 1195 << 1196 L(mmu_init_not_mac): << 1197 #endif << 1198 << 1199 #ifdef CONFIG_SUN3X << 1200 is_not_sun3x(L(notsun3x)) << 1201 << 1202 /* oh, the pain.. We're gonna want t << 1203 * starting the MMU, so we copy the m << 1204 * from 8k -> 4k pages as we go. << 1205 */ << 1206 << 1207 /* copy maps from 0xfee00000 to 0xff0 << 1208 movel #0xfee00000, %d0 << 1209 moveq #ROOT_INDEX_SHIFT, %d1 << 1210 lsrl %d1,%d0 << 1211 mmu_get_root_table_entry %d0 << 1212 << 1213 movel #0xfee00000, %d0 << 1214 moveq #PTR_INDEX_SHIFT, %d1 << 1215 lsrl %d1,%d0 << 1216 andl #PTR_TABLE_SIZE-1, %d0 << 1217 mmu_get_ptr_table_entry %a0,% << 1218 << 1219 movel #0xfee00000, %d0 << 1220 moveq #PAGE_INDEX_SHIFT, %d1 << 1221 lsrl %d1,%d0 << 1222 andl #PAGE_TABLE_SIZE-1, %d0 << 1223 mmu_get_page_table_entry %a0,% << 1224 << 1225 /* this is where the prom page table << 1226 movel 0xfefe00d4, %a1 << 1227 movel %a1@, %a1 << 1228 << 1229 movel #((0x200000 >> 13)-1), %d1 << 1230 << 1231 1: << 1232 movel %a1@+, %d3 << 1233 movel %d3,%a0@+ << 1234 addl #0x1000,%d3 << 1235 movel %d3,%a0@+ << 1236 << 1237 dbra %d1,1b << 1238 << 1239 /* setup tt1 for I/O */ << 1240 mmu_map_tt #1,#0x40000000,#0x400 << 1241 jbra L(mmu_init_done) << 1242 << 1243 L(notsun3x): << 1244 #endif << 1245 << 1246 #ifdef CONFIG_VIRT << 1247 is_not_virt(L(novirt)) << 1248 mmu_map_tt #1,#0xFF000000,#0x010 << 1249 jbra L(mmu_init_done) << 1250 L(novirt): << 1251 #endif << 1252 << 1253 #ifdef CONFIG_APOLLO << 1254 is_not_apollo(L(notapollo)) << 1255 << 1256 putc 'P' << 1257 mmu_map #0x80000000,#0,#0x020 << 1258 << 1259 L(notapollo): << 1260 jbra L(mmu_init_done) << 1261 #endif << 1262 << 1263 L(mmu_init_done): << 1264 << 1265 putc 'G' << 1266 leds 0x8 << 1267 << 1268 /* << 1269 * mmu_fixup << 1270 * << 1271 * On the 040 class machines, all pages that << 1272 * mmu have to be fixed up. According to Moto << 1273 * tables should be non-cacheable on a '040 a << 1274 * '060. But analysis of the reasons for this << 1275 * experience, showed that write-through also << 1276 * << 1277 * Allocated memory so far goes from kernel_e << 1278 * is used for all kind of tables, for that t << 1279 * are now fixed. << 1280 */ << 1281 L(mmu_fixup): << 1282 << 1283 is_not_040_or_060(L(mmu_fixup_done)) << 1284 << 1285 #ifdef MMU_NOCACHE_KERNEL << 1286 jbra L(mmu_fixup_done) << 1287 #endif << 1288 << 1289 /* first fix the page at the start of << 1290 * contains also kernel_pg_dir. << 1291 */ << 1292 movel %pc@(L(phys_kernel_start)),%d << 1293 subl #PAGE_OFFSET,%d0 << 1294 lea %pc@(_stext),%a0 << 1295 subl %d0,%a0 << 1296 mmu_fixup_page_mmu_cache %a0 << 1297 << 1298 movel %pc@(L(kernel_end)),%a0 << 1299 subl %d0,%a0 << 1300 movel %pc@(L(memory_start)),%a1 << 1301 subl %d0,%a1 << 1302 bra 2f << 1303 1: << 1304 mmu_fixup_page_mmu_cache %a0 << 1305 addw #PAGESIZE,%a0 << 1306 2: << 1307 cmpl %a0,%a1 << 1308 jgt 1b << 1309 << 1310 L(mmu_fixup_done): << 1311 << 1312 #ifdef MMU_PRINT << 1313 mmu_print << 1314 #endif << 1315 << 1316 /* << 1317 * mmu_engage << 1318 * << 1319 * This chunk of code performs the gruesome t << 1320 * The reason it's gruesome is because when t << 1321 * maps logical addresses to physical address << 1322 * register is then passed through the MMU be << 1323 * is fetched (the instruction following the << 1324 * This may mean one of two things: << 1325 * 1. The Program Counter falls within the lo << 1326 * the kernel of which there are two sub-p << 1327 * A. The PC maps to the correct instructi << 1328 * code location), or << 1329 * B. The PC does not map through and the << 1330 * data (or instruction) which is not t << 1331 * As you can imagine, A is good and B is << 1332 * Alternatively, << 1333 * 2. The Program Counter does not map throug << 1334 * will take a Bus Error. << 1335 * Clearly, 2 is bad. << 1336 * It doesn't take a wiz kid to figure you wa << 1337 * This code creates that possibility. << 1338 * There are two possible 1.A. states (we now << 1339 * A. The kernel is located at physical memor << 1340 * the logical memory for the kernel, i.e. << 1341 * B. The kernel is located some where else. << 1342 * << 1343 * Under some conditions the Macintosh can << 1344 * [A friend and I once noted that Apple hard << 1345 * wacked twice each day: once when they show << 1346 * "This is for the screwy hardware we know y << 1347 * and also at the end of the day (as in, Wha << 1348 * you designed today, but I'm sure it wasn't << 1349 * << 1350 * This code works on the following premise: << 1351 * If the kernel start (%d5) is within the fi << 1352 * then create a mapping for the kernel at lo << 1353 * the physical location of the pc. And, cre << 1354 * translation register for the first 16 Meg. << 1355 * is engaged, the PC can be moved up into th << 1356 * and then the transparent translation can b << 1357 * the PC can jump to the correct logical loc << 1358 * home (finally). This is essentially the c << 1359 * to use. Now, it's generalized for all pro << 1360 * that a fresh (but temporary) mapping has t << 1361 * is made in page 0 (an as of yet unused loc << 1362 * stack!). This temporary mapping will only << 1363 * and a single page table (it can map 256K). << 1364 * << 1365 * OK, alternatively, imagine that the Progra << 1366 * the first 16 Meg. Then, just use Transpar << 1367 * to do the right thing. << 1368 * << 1369 * Last, if _start is already at 0x01000, the << 1370 * to do (in other words, in a degenerate cas << 1371 * do nothing). << 1372 * << 1373 * Let's do it. << 1374 * << 1375 * << 1376 */ << 1377 << 1378 putc 'H' << 1379 << 1380 mmu_engage << 1381 << 1382 /* << 1383 * After this point no new memory is allocate << 1384 * the start of available memory is stored in << 1385 * (The bootmem allocator requires now the ph << 1386 */ << 1387 << 1388 movel L(memory_start),availmem << 1389 << 1390 #ifdef CONFIG_AMIGA << 1391 is_not_amiga(1f) << 1392 /* fixup the Amiga custom register lo << 1393 clrl L(custom) << 1394 1: << 1395 #endif << 1396 << 1397 #ifdef CONFIG_ATARI << 1398 is_not_atari(1f) << 1399 /* fixup the Atari iobase register lo << 1400 movel #0xff000000,L(iobase) << 1401 1: << 1402 #endif << 1403 << 1404 #ifdef CONFIG_MAC << 1405 is_not_mac(1f) << 1406 movel #~VIDEOMEMMASK,%d0 << 1407 andl L(mac_videobase),%d0 << 1408 addl #VIDEOMEMBASE,%d0 << 1409 movel %d0,L(mac_videobase) << 1410 #ifdef CONSOLE_DEBUG << 1411 movel %pc@(L(phys_kernel_start)),%d << 1412 subl #PAGE_OFFSET,%d0 << 1413 subl %d0,L(console_font) << 1414 subl %d0,L(console_font_data) << 1415 #endif << 1416 orl #0x50000000,L(mac_sccbase) << 1417 1: << 1418 #endif << 1419 << 1420 #ifdef CONFIG_HP300 << 1421 is_not_hp300(2f) << 1422 /* << 1423 * Fix up the iobase register to poin << 1424 */ << 1425 movel #0xf0000000,L(iobase) << 1426 << 1427 /* << 1428 * Energise the FPU and caches. << 1429 */ << 1430 is_040(1f) << 1431 movel #0x60,0xf05f400c << 1432 jbra 2f << 1433 << 1434 /* << 1435 * 040: slightly different, apparentl << 1436 */ << 1437 1: movew #0,0xf05f400e << 1438 movew #0x64,0xf05f400e << 1439 2: << 1440 #endif << 1441 << 1442 #ifdef CONFIG_SUN3X << 1443 is_not_sun3x(1f) << 1444 << 1445 /* enable copro */ << 1446 oriw #0x4000,0x61000000 << 1447 1: << 1448 #endif << 1449 << 1450 #ifdef CONFIG_APOLLO << 1451 is_not_apollo(1f) << 1452 << 1453 /* << 1454 * Fix up the iobase before printing << 1455 */ << 1456 movel #0x80000000,L(iobase) << 1457 1: << 1458 #endif << 1459 << 1460 putc 'I' << 1461 leds 0x10 << 1462 << 1463 /* << 1464 * Enable caches << 1465 */ << 1466 << 1467 is_not_040_or_060(L(cache_not_680460) << 1468 << 1469 L(cache680460): << 1470 .chip 68040 << 1471 nop << 1472 cpusha %bc << 1473 nop << 1474 << 1475 is_060(L(cache68060)) << 1476 << 1477 movel #CC6_ENABLE_D+CC6_ENABLE_I,%d << 1478 /* MMU stuff works in copyback mode n << 1479 movec %d0,%cacr << 1480 jra L(cache_done) << 1481 << 1482 L(cache68060): << 1483 movel #CC6_ENABLE_D+CC6_ENABLE_I+CC << 1484 /* MMU stuff works in copyback mode n << 1485 movec %d0,%cacr << 1486 /* enable superscalar dispatch in PCR << 1487 moveq #1,%d0 << 1488 .chip 68060 << 1489 movec %d0,%pcr << 1490 << 1491 jbra L(cache_done) << 1492 L(cache_not_680460): << 1493 L(cache68030): << 1494 .chip 68030 << 1495 movel #CC3_ENABLE_DB+CC3_CLR_D+CC3_ << 1496 movec %d0,%cacr << 1497 << 1498 jra L(cache_done) << 1499 .chip 68k << 1500 L(cache_done): << 1501 << 1502 putc 'J' << 1503 << 1504 /* << 1505 * Setup initial stack pointer << 1506 */ << 1507 lea init_task,%curptr << 1508 lea init_thread_union+THREAD_SIZE << 1509 << 1510 putc 'K' << 1511 << 1512 subl %a6,%a6 /* clear a6 f << 1513 << 1514 /* << 1515 * The new 64bit printf support requires an e << 1516 */ << 1517 jbsr base_trap_init << 1518 << 1519 /* jump to the kernel start */ << 1520 << 1521 putc '\n' << 1522 leds 0x55 << 1523 << 1524 jbsr start_kernel << 1525 << 1526 /* << 1527 * Find a tag record in the bootinfo structur << 1528 * The bootinfo structure is located right af << 1529 * Returns: d0: size (-1 if not found) << 1530 * a0: data pointer (end-of-records << 1531 */ << 1532 func_start get_bi_record,%d1 << 1533 << 1534 movel ARG1,%d0 << 1535 lea %pc@(_end),%a0 << 1536 1: tstw %a0@(BIR_TAG) << 1537 jeq 3f << 1538 cmpw %a0@(BIR_TAG),%d0 << 1539 jeq 2f << 1540 addw %a0@(BIR_SIZE),%a0 << 1541 jra 1b << 1542 2: moveq #0,%d0 << 1543 movew %a0@(BIR_SIZE),%d0 << 1544 lea %a0@(BIR_DATA),%a0 << 1545 jra 4f << 1546 3: moveq #-1,%d0 << 1547 lea %a0@(BIR_SIZE),%a0 << 1548 4: << 1549 func_return get_bi_record << 1550 << 1551 << 1552 /* << 1553 * MMU Initialization Begins Here << 1554 * << 1555 * The structure of the MMU tables on th << 1556 * is thus: << 1557 * Root Table << 1558 * Logical addresses are transla << 1559 * a hierarchical translation mechanism << 1560 * seven bits of the logical address (LA << 1561 * index into the "root table." Each en << 1562 * table has a bit which specifies if it << 1563 * pointer table. Each entry defines a << 1564 * If an entry is invalid then that logi << 1565 * invalid and references to that range << 1566 * is enabled) will fault. If the entry << 1567 * one of two things. On 040/060 class << 1568 * a pointer table which then describes << 1569 * within that 32M range. On 020/030 cl << 1570 * called "early terminating descriptors << 1571 * allows an entire 32Meg to be describe << 1572 * root table. Thus, this entry in the << 1573 * physical address of the memory or I/O << 1574 * which the entry represents and it als << 1575 * cache bits for this region. << 1576 * << 1577 * Pointer Tables << 1578 * Per the Root Table, there wil << 1579 * pointer tables. Each pointer table d << 1580 * Not all of the 32M range need be defi << 1581 * seven bits of the logical address are << 1582 * the pointer table to point to page ta << 1583 * is valid). There will undoubtedly be << 1584 * pointer table for the kernel because << 1585 * defines a range of only 32M. Valid p << 1586 * point to page tables, or are early te << 1587 * themselves. << 1588 * << 1589 * Page Tables << 1590 * Per the Pointer Tables, each << 1591 * to the physical page in memory that s << 1592 * address that translates to the partic << 1593 * << 1594 * In short, the Logical Address gets tr << 1595 * bits 31..26 - index into the << 1596 * bits 25..18 - index into the << 1597 * bits 17..12 - index into the << 1598 * bits 11..0 - offset into a p << 1599 * << 1600 * The algorithms which follow do one th << 1601 * the MMU hardware. For example, there << 1602 * cache settings that are relevant. Ei << 1603 * being mapped in which case it is eith << 1604 * the RamDisk) or it is MMU data. On t << 1605 * option also describes the kernel. Or << 1606 * in which case it has its own kind of << 1607 * are constants which abstract these no << 1608 * actually makes the call to map some r << 1609 * << 1610 * << 1611 * << 1612 */ << 1613 << 1614 #ifdef MMU_PRINT << 1615 /* << 1616 * mmu_print << 1617 * << 1618 * This algorithm will print out the cur << 1619 * << 1620 * Input: << 1621 * %a5 points to the root table. << 1622 * from this. << 1623 */ << 1624 << 1625 #define mmu_next_valid 0 << 1626 #define mmu_start_logical 4 << 1627 #define mmu_next_logical 8 << 1628 #define mmu_start_physical 12 << 1629 #define mmu_next_physical 16 << 1630 << 1631 #define MMU_PRINT_INVALID -1 << 1632 #define MMU_PRINT_VALID 1 << 1633 #define MMU_PRINT_UNINITED 0 << 1634 << 1635 #define putZc(z,n) jbne 1f; putc << 1636 << 1637 func_start mmu_print,%a0-%a6/%d0-%d7 << 1638 << 1639 movel %pc@(L(kernel_pgdir_ptr)),%a5 << 1640 lea %pc@(L(mmu_print_data)),%a0 << 1641 movel #MMU_PRINT_UNINITED,%a0@(mmu_ << 1642 << 1643 is_not_040_or_060(mmu_030_print) << 1644 << 1645 mmu_040_print: << 1646 puts "\nMMU040\n" << 1647 puts "rp:" << 1648 putn %a5 << 1649 putc '\n' << 1650 #if 0 << 1651 /* << 1652 * The following #if/#endif block is << 1653 * MMU Map in gory detail. It really << 1654 * MMU Map algorithm appears to go aw << 1655 * entry per entry level. << 1656 */ << 1657 movel #ROOT_TABLE_SIZE,%d5 << 1658 #if 0 << 1659 movel %a5@+,%d7 | Bur << 1660 subql #1,%d5 | the << 1661 #endif << 1662 1: tstl %d5 << 1663 jbeq mmu_print_done << 1664 subq #1,%d5 << 1665 movel %a5@+,%d7 << 1666 btst #1,%d7 << 1667 jbeq 1b << 1668 << 1669 2: putn %d7 << 1670 andil #0xFFFFFE00,%d7 << 1671 movel %d7,%a4 << 1672 movel #PTR_TABLE_SIZE,%d4 << 1673 putc ' ' << 1674 3: tstl %d4 << 1675 jbeq 11f << 1676 subq #1,%d4 << 1677 movel %a4@+,%d7 << 1678 btst #1,%d7 << 1679 jbeq 3b << 1680 << 1681 4: putn %d7 << 1682 andil #0xFFFFFF00,%d7 << 1683 movel %d7,%a3 << 1684 movel #PAGE_TABLE_SIZE,%d3 << 1685 5: movel #8,%d2 << 1686 6: tstl %d3 << 1687 jbeq 31f << 1688 subq #1,%d3 << 1689 movel %a3@+,%d6 << 1690 btst #0,%d6 << 1691 jbeq 6b << 1692 7: tstl %d2 << 1693 jbeq 8f << 1694 subq #1,%d2 << 1695 putc ' ' << 1696 jbra 91f << 1697 8: putc '\n' << 1698 movel #8+1+8+1+1,%d2 << 1699 9: putc ' ' << 1700 dbra %d2,9b << 1701 movel #7,%d2 << 1702 91: putn %d6 << 1703 jbra 6b << 1704 << 1705 31: putc '\n' << 1706 movel #8+1,%d2 << 1707 32: putc ' ' << 1708 dbra %d2,32b << 1709 jbra 3b << 1710 << 1711 11: putc '\n' << 1712 jbra 1b << 1713 #endif /* MMU 040 Dumping code that's gory an << 1714 << 1715 lea %pc@(kernel_pg_dir),%a5 << 1716 movel %a5,%a0 /* a0 << 1717 movel #0x00000000,%a4 /* lo << 1718 moveql #0,%d0 << 1719 40: << 1720 /* Increment the logical address and << 1721 movel %a4,%d5 << 1722 addil #PAGESIZE<<13,%d5 << 1723 movel %a0@+,%d6 << 1724 btst #1,%d6 << 1725 jbne 41f << 1726 jbsr mmu_print_tuple_invalidate << 1727 jbra 48f << 1728 41: << 1729 movel #0,%d1 << 1730 andil #0xfffffe00,%d6 << 1731 movel %d6,%a1 << 1732 42: << 1733 movel %a4,%d5 << 1734 addil #PAGESIZE<<6,%d5 << 1735 movel %a1@+,%d6 << 1736 btst #1,%d6 << 1737 jbne 43f << 1738 jbsr mmu_print_tuple_invalidate << 1739 jbra 47f << 1740 43: << 1741 movel #0,%d2 << 1742 andil #0xffffff00,%d6 << 1743 movel %d6,%a2 << 1744 44: << 1745 movel %a4,%d5 << 1746 addil #PAGESIZE,%d5 << 1747 movel %a2@+,%d6 << 1748 btst #0,%d6 << 1749 jbne 45f << 1750 jbsr mmu_print_tuple_invalidate << 1751 jbra 46f << 1752 45: << 1753 moveml %d0-%d1,%sp@- << 1754 movel %a4,%d0 << 1755 movel %d6,%d1 << 1756 andil #0xfffff4e0,%d1 << 1757 lea %pc@(mmu_040_print_flags),%a6 << 1758 jbsr mmu_print_tuple << 1759 moveml %sp@+,%d0-%d1 << 1760 46: << 1761 movel %d5,%a4 << 1762 addq #1,%d2 << 1763 cmpib #64,%d2 << 1764 jbne 44b << 1765 47: << 1766 movel %d5,%a4 << 1767 addq #1,%d1 << 1768 cmpib #128,%d1 << 1769 jbne 42b << 1770 48: << 1771 movel %d5,%a4 /* mo << 1772 addq #1,%d0 << 1773 cmpib #128,%d0 << 1774 jbne 40b << 1775 << 1776 .chip 68040 << 1777 movec %dtt1,%d0 << 1778 movel %d0,%d1 << 1779 andiw #0x8000,%d1 /* is << 1780 jbeq 1f /* No << 1781 << 1782 movel %d0,%d1 << 1783 andil #0xff000000,%d1 /* Ge << 1784 putn %d1 << 1785 puts "==" << 1786 putn %d1 << 1787 << 1788 movel %d0,%d6 << 1789 jbsr mmu_040_print_flags_tt << 1790 1: << 1791 movec %dtt0,%d0 << 1792 movel %d0,%d1 << 1793 andiw #0x8000,%d1 /* is << 1794 jbeq 1f /* No << 1795 << 1796 movel %d0,%d1 << 1797 andil #0xff000000,%d1 /* Ge << 1798 putn %d1 << 1799 puts "==" << 1800 putn %d1 << 1801 << 1802 movel %d0,%d6 << 1803 jbsr mmu_040_print_flags_tt << 1804 1: << 1805 .chip 68k << 1806 << 1807 jbra mmu_print_done << 1808 << 1809 mmu_040_print_flags: << 1810 btstl #10,%d6 << 1811 putZc(' ','G') /* global bit */ << 1812 btstl #7,%d6 << 1813 putZc(' ','S') /* supervisor bit */ << 1814 mmu_040_print_flags_tt: << 1815 btstl #6,%d6 << 1816 jbne 3f << 1817 putc 'C' << 1818 btstl #5,%d6 << 1819 putZc('w','c') /* write through or c << 1820 jbra 4f << 1821 3: << 1822 putc 'N' << 1823 btstl #5,%d6 << 1824 putZc('s',' ') /* serialized non-cac << 1825 4: << 1826 rts << 1827 << 1828 mmu_030_print_flags: << 1829 btstl #6,%d6 << 1830 putZc('C','I') /* write through or c << 1831 rts << 1832 << 1833 mmu_030_print: << 1834 puts "\nMMU030\n" << 1835 puts "\nrp:" << 1836 putn %a5 << 1837 putc '\n' << 1838 movel %a5,%d0 << 1839 andil #0xfffffff0,%d0 << 1840 movel %d0,%a0 << 1841 movel #0x00000000,%a4 /* lo << 1842 movel #0,%d0 << 1843 30: << 1844 movel %a4,%d5 << 1845 addil #PAGESIZE<<13,%d5 << 1846 movel %a0@+,%d6 << 1847 btst #1,%d6 /* is << 1848 jbne 31f /* ye << 1849 btst #0,%d6 /* is << 1850 jbeq 1f /* no << 1851 jbsr mmu_030_print_helper << 1852 jbra 38f << 1853 1: << 1854 jbsr mmu_print_tuple_invalidate << 1855 jbra 38f << 1856 31: << 1857 movel #0,%d1 << 1858 andil #0xfffffff0,%d6 << 1859 movel %d6,%a1 << 1860 32: << 1861 movel %a4,%d5 << 1862 addil #PAGESIZE<<6,%d5 << 1863 movel %a1@+,%d6 << 1864 btst #1,%d6 /* is << 1865 jbne 33f /* ye << 1866 btst #0,%d6 /* is << 1867 jbeq 1f /* no << 1868 jbsr mmu_030_print_helper << 1869 jbra 37f << 1870 1: << 1871 jbsr mmu_print_tuple_invalidate << 1872 jbra 37f << 1873 33: << 1874 movel #0,%d2 << 1875 andil #0xfffffff0,%d6 << 1876 movel %d6,%a2 << 1877 34: << 1878 movel %a4,%d5 << 1879 addil #PAGESIZE,%d5 << 1880 movel %a2@+,%d6 << 1881 btst #0,%d6 << 1882 jbne 35f << 1883 jbsr mmu_print_tuple_invalidate << 1884 jbra 36f << 1885 35: << 1886 jbsr mmu_030_print_helper << 1887 36: << 1888 movel %d5,%a4 << 1889 addq #1,%d2 << 1890 cmpib #64,%d2 << 1891 jbne 34b << 1892 37: << 1893 movel %d5,%a4 << 1894 addq #1,%d1 << 1895 cmpib #128,%d1 << 1896 jbne 32b << 1897 38: << 1898 movel %d5,%a4 /* mo << 1899 addq #1,%d0 << 1900 cmpib #128,%d0 << 1901 jbne 30b << 1902 << 1903 mmu_print_done: << 1904 puts "\n" << 1905 << 1906 func_return mmu_print << 1907 << 1908 << 1909 mmu_030_print_helper: << 1910 moveml %d0-%d1,%sp@- << 1911 movel %a4,%d0 << 1912 movel %d6,%d1 << 1913 lea %pc@(mmu_030_print_flags),%a6 << 1914 jbsr mmu_print_tuple << 1915 moveml %sp@+,%d0-%d1 << 1916 rts << 1917 << 1918 mmu_print_tuple_invalidate: << 1919 moveml %a0/%d7,%sp@- << 1920 << 1921 lea %pc@(L(mmu_print_data)),%a0 << 1922 tstl %a0@(mmu_next_valid) << 1923 jbmi mmu_print_tuple_invalidate_ex << 1924 << 1925 movel #MMU_PRINT_INVALID,%a0@(mmu_n << 1926 << 1927 putn %a4 << 1928 << 1929 puts "##\n" << 1930 << 1931 mmu_print_tuple_invalidate_exit: << 1932 moveml %sp@+,%a0/%d7 << 1933 rts << 1934 << 1935 << 1936 mmu_print_tuple: << 1937 moveml %d0-%d7/%a0,%sp@- << 1938 << 1939 lea %pc@(L(mmu_print_data)),%a0 << 1940 << 1941 tstl %a0@(mmu_next_valid) << 1942 jble mmu_print_tuple_print << 1943 << 1944 cmpl %a0@(mmu_next_physical),%d1 << 1945 jbeq mmu_print_tuple_increment << 1946 << 1947 mmu_print_tuple_print: << 1948 putn %d0 << 1949 puts "->" << 1950 putn %d1 << 1951 << 1952 movel %d1,%d6 << 1953 jbsr %a6@ << 1954 << 1955 mmu_print_tuple_record: << 1956 movel #MMU_PRINT_VALID,%a0@(mmu_nex << 1957 << 1958 movel %d1,%a0@(mmu_next_physical) << 1959 << 1960 mmu_print_tuple_increment: << 1961 movel %d5,%d7 << 1962 subl %a4,%d7 << 1963 addl %d7,%a0@(mmu_next_physical) << 1964 << 1965 mmu_print_tuple_exit: << 1966 moveml %sp@+,%d0-%d7/%a0 << 1967 rts << 1968 << 1969 mmu_print_machine_cpu_types: << 1970 puts "machine: " << 1971 << 1972 is_not_amiga(1f) << 1973 puts "amiga" << 1974 jbra 9f << 1975 1: << 1976 is_not_atari(2f) << 1977 puts "atari" << 1978 jbra 9f << 1979 2: << 1980 is_not_mac(3f) << 1981 puts "macintosh" << 1982 jbra 9f << 1983 3: puts "unknown" << 1984 9: putc '\n' << 1985 << 1986 puts "cputype: 0" << 1987 is_not_060(1f) << 1988 putc '6' << 1989 jbra 9f << 1990 1: << 1991 is_not_040_or_060(2f) << 1992 putc '4' << 1993 jbra 9f << 1994 2: putc '3' << 1995 9: putc '0' << 1996 putc '\n' << 1997 << 1998 rts << 1999 #endif /* MMU_PRINT */ << 2000 << 2001 /* << 2002 * mmu_map_tt << 2003 * << 2004 * This is a specific function which works on << 2005 * On 030, 040 & 060 it will attempt to use T << 2006 * registers (tt1). << 2007 * On 020 it will call the standard mmu_map w << 2008 * terminating descriptors. << 2009 */ << 2010 func_start mmu_map_tt,%d0/%d1/%a0,4 << 2011 << 2012 dputs "mmu_map_tt:" << 2013 dputn ARG1 << 2014 dputn ARG2 << 2015 dputn ARG3 << 2016 dputn ARG4 << 2017 dputc '\n' << 2018 << 2019 is_020(L(do_map)) << 2020 << 2021 /* Extract the highest bit set << 2022 */ << 2023 bfffo ARG3{#0,#32},%d1 << 2024 cmpw #8,%d1 << 2025 jcc L(do_map) << 2026 << 2027 /* And get the mask << 2028 */ << 2029 moveq #-1,%d0 << 2030 lsrl %d1,%d0 << 2031 lsrl #1,%d0 << 2032 << 2033 /* Mask the address << 2034 */ << 2035 movel %d0,%d1 << 2036 notl %d1 << 2037 andl ARG2,%d1 << 2038 << 2039 /* Generate the upper 16bit of the tt << 2040 */ << 2041 lsrl #8,%d0 << 2042 orl %d0,%d1 << 2043 clrw %d1 << 2044 << 2045 is_040_or_060(L(mmu_map_tt_040)) << 2046 << 2047 /* set 030 specific bits (read/write << 2048 * (highest function code set, lower << 2049 */ << 2050 orw #TTR_ENABLE+TTR_RWM+TTR_FCB2+ << 2051 movel ARG4,%d0 << 2052 btst #6,%d0 << 2053 jeq 1f << 2054 orw #TTR_CI,%d1 << 2055 << 2056 1: lea STACK,%a0 << 2057 dputn %d1 << 2058 movel %d1,%a0@ << 2059 .chip 68030 << 2060 tstl ARG1 << 2061 jne 1f << 2062 pmove %a0@,%tt0 << 2063 jra 2f << 2064 1: pmove %a0@,%tt1 << 2065 2: .chip 68k << 2066 jra L(mmu_map_tt_done) << 2067 << 2068 /* set 040 specific bits << 2069 */ << 2070 L(mmu_map_tt_040): << 2071 orw #TTR_ENABLE+TTR_KERNELMODE,%d << 2072 orl ARG4,%d1 << 2073 dputn %d1 << 2074 << 2075 .chip 68040 << 2076 tstl ARG1 << 2077 jne 1f << 2078 movec %d1,%itt0 << 2079 movec %d1,%dtt0 << 2080 jra 2f << 2081 1: movec %d1,%itt1 << 2082 movec %d1,%dtt1 << 2083 2: .chip 68k << 2084 << 2085 jra L(mmu_map_tt_done) << 2086 << 2087 L(do_map): << 2088 mmu_map_eq ARG2,ARG3,ARG4 << 2089 << 2090 L(mmu_map_tt_done): << 2091 << 2092 func_return mmu_map_tt << 2093 << 2094 /* << 2095 * mmu_map << 2096 * << 2097 * This routine will map a range of memo << 2098 * table and allocate the pages on the f << 2099 * The pointer table does not have to be << 2100 * the root table, this routine will do << 2101 * << 2102 * NOTE << 2103 * This routine will assert failure and << 2104 * routines in the case of a run-time er << 2105 * if the address is already mapped. << 2106 * << 2107 * NOTE-2 << 2108 * This routine will use early terminati << 2109 * where possible for the 68020+68851 an << 2110 * processors. << 2111 */ << 2112 func_start mmu_map,%d0-%d4/%a0-%a4 << 2113 << 2114 dputs "\nmmu_map:" << 2115 dputn ARG1 << 2116 dputn ARG2 << 2117 dputn ARG3 << 2118 dputn ARG4 << 2119 dputc '\n' << 2120 << 2121 /* Get logical address and round it d << 2122 */ << 2123 movel ARG1,%d0 << 2124 andl #-(PAGESIZE*PAGE_TABLE_SIZE), << 2125 movel %d0,%a3 << 2126 << 2127 /* Get the end address << 2128 */ << 2129 movel ARG1,%a4 << 2130 addl ARG3,%a4 << 2131 subql #1,%a4 << 2132 << 2133 /* Get physical address and round it << 2134 */ << 2135 movel ARG2,%d0 << 2136 andl #-(PAGESIZE*PAGE_TABLE_SIZE), << 2137 movel %d0,%a2 << 2138 << 2139 /* Add page attributes to the physica << 2140 */ << 2141 movel ARG4,%d0 << 2142 orw #_PAGE_PRESENT+_PAGE_ACCESSED << 2143 addw %d0,%a2 << 2144 << 2145 dputn %a2 << 2146 dputn %a3 << 2147 dputn %a4 << 2148 << 2149 is_not_040_or_060(L(mmu_map_030)) << 2150 << 2151 addw #_PAGE_GLOBAL040,%a2 << 2152 /* << 2153 * MMU 040 & 060 Support << 2154 * << 2155 * The MMU usage for the 040 and 060 is << 2156 * the 030 and 68851 that there is separ << 2157 * block describes the data structures a << 2158 * this code. << 2159 * << 2160 * The 040 does not support early termin << 2161 * the 030 does. Therefore, a third lev << 2162 * for the 040, and that would be the pa << 2163 * page tables are allocated directly fr << 2164 * kernel. << 2165 * << 2166 */ << 2167 << 2168 L(mmu_map_040): << 2169 /* Calculate the offset into the root << 2170 */ << 2171 movel %a3,%d0 << 2172 moveq #ROOT_INDEX_SHIFT,%d1 << 2173 lsrl %d1,%d0 << 2174 mmu_get_root_table_entry %d0 << 2175 << 2176 /* Calculate the offset into the poin << 2177 */ << 2178 movel %a3,%d0 << 2179 moveq #PTR_INDEX_SHIFT,%d1 << 2180 lsrl %d1,%d0 << 2181 andl #PTR_TABLE_SIZE-1,%d0 << 2182 mmu_get_ptr_table_entry %a0,% << 2183 << 2184 /* Calculate the offset into the page << 2185 */ << 2186 movel %a3,%d0 << 2187 moveq #PAGE_INDEX_SHIFT,%d1 << 2188 lsrl %d1,%d0 << 2189 andl #PAGE_TABLE_SIZE-1,%d0 << 2190 mmu_get_page_table_entry %a0,% << 2191 << 2192 /* The page table entry must not no b << 2193 */ << 2194 tstl %a0@ << 2195 jne L(mmu_map_error) << 2196 << 2197 /* Do the mapping and advance the poi << 2198 */ << 2199 movel %a2,%a0@ << 2200 2: << 2201 addw #PAGESIZE,%a2 << 2202 addw #PAGESIZE,%a3 << 2203 << 2204 /* Ready with mapping? << 2205 */ << 2206 lea %a3@(-1),%a0 << 2207 cmpl %a0,%a4 << 2208 jhi L(mmu_map_040) << 2209 jra L(mmu_map_done) << 2210 << 2211 L(mmu_map_030): << 2212 /* Calculate the offset into the root << 2213 */ << 2214 movel %a3,%d0 << 2215 moveq #ROOT_INDEX_SHIFT,%d1 << 2216 lsrl %d1,%d0 << 2217 mmu_get_root_table_entry %d0 << 2218 << 2219 /* Check if logical address 32MB alig << 2220 * so we can try to map it once << 2221 */ << 2222 movel %a3,%d0 << 2223 andl #(PTR_TABLE_SIZE*PAGE_TABLE_S << 2224 jne 1f << 2225 << 2226 /* Is there enough to map for 32MB at << 2227 */ << 2228 lea %a3@(PTR_TABLE_SIZE*PAGE_TABL << 2229 cmpl %a1,%a4 << 2230 jcs 1f << 2231 << 2232 addql #1,%a1 << 2233 << 2234 /* The root table entry must not no b << 2235 */ << 2236 tstl %a0@ << 2237 jne L(mmu_map_error) << 2238 << 2239 /* Do the mapping and advance the poi << 2240 */ << 2241 dputs "early term1" << 2242 dputn %a2 << 2243 dputn %a3 << 2244 dputn %a1 << 2245 dputc '\n' << 2246 movel %a2,%a0@ << 2247 << 2248 movel %a1,%a3 << 2249 lea %a2@(PTR_TABLE_SIZE*PAGE_TABL << 2250 jra L(mmu_mapnext_030) << 2251 1: << 2252 /* Calculate the offset into the poin << 2253 */ << 2254 movel %a3,%d0 << 2255 moveq #PTR_INDEX_SHIFT,%d1 << 2256 lsrl %d1,%d0 << 2257 andl #PTR_TABLE_SIZE-1,%d0 << 2258 mmu_get_ptr_table_entry %a0,% << 2259 << 2260 /* The pointer table entry must not n << 2261 */ << 2262 tstl %a0@ << 2263 jne L(mmu_map_error) << 2264 << 2265 /* Do the mapping and advance the poi << 2266 */ << 2267 dputs "early term2" << 2268 dputn %a2 << 2269 dputn %a3 << 2270 dputc '\n' << 2271 movel %a2,%a0@ << 2272 << 2273 addl #PAGE_TABLE_SIZE*PAGESIZE,%a2 << 2274 addl #PAGE_TABLE_SIZE*PAGESIZE,%a3 << 2275 << 2276 L(mmu_mapnext_030): << 2277 /* Ready with mapping? << 2278 */ << 2279 lea %a3@(-1),%a0 << 2280 cmpl %a0,%a4 << 2281 jhi L(mmu_map_030) << 2282 jra L(mmu_map_done) << 2283 << 2284 L(mmu_map_error): << 2285 << 2286 dputs "mmu_map error:" << 2287 dputn %a2 << 2288 dputn %a3 << 2289 dputc '\n' << 2290 << 2291 L(mmu_map_done): << 2292 << 2293 func_return mmu_map << 2294 << 2295 /* << 2296 * mmu_fixup << 2297 * << 2298 * On the 040 class machines, all pages << 2299 * mmu have to be fixed up. << 2300 */ << 2301 << 2302 func_start mmu_fixup_page_mmu_cache,%d0/ << 2303 << 2304 dputs "mmu_fixup_page_mmu_cache" << 2305 dputn ARG1 << 2306 << 2307 /* Calculate the offset into the root << 2308 */ << 2309 movel ARG1,%d0 << 2310 moveq #ROOT_INDEX_SHIFT,%d1 << 2311 lsrl %d1,%d0 << 2312 mmu_get_root_table_entry %d0 << 2313 << 2314 /* Calculate the offset into the poin << 2315 */ << 2316 movel ARG1,%d0 << 2317 moveq #PTR_INDEX_SHIFT,%d1 << 2318 lsrl %d1,%d0 << 2319 andl #PTR_TABLE_SIZE-1,%d0 << 2320 mmu_get_ptr_table_entry %a0,% << 2321 << 2322 /* Calculate the offset into the page << 2323 */ << 2324 movel ARG1,%d0 << 2325 moveq #PAGE_INDEX_SHIFT,%d1 << 2326 lsrl %d1,%d0 << 2327 andl #PAGE_TABLE_SIZE-1,%d0 << 2328 mmu_get_page_table_entry %a0,% << 2329 << 2330 movel %a0@,%d0 << 2331 andil #_CACHEMASK040,%d0 << 2332 orl %pc@(m68k_pgtable_cachemode), << 2333 movel %d0,%a0@ << 2334 << 2335 dputc '\n' << 2336 << 2337 func_return mmu_fixup_page_mmu_cache << 2338 << 2339 /* << 2340 * mmu_temp_map << 2341 * << 2342 * create a temporary mapping to enable << 2343 * this we don't need any transparation << 2344 */ << 2345 << 2346 func_start mmu_temp_map,%d0/%d1/%a0/%a1 << 2347 << 2348 dputs "mmu_temp_map" << 2349 dputn ARG1 << 2350 dputn ARG2 << 2351 dputc '\n' << 2352 << 2353 lea %pc@(L(temp_mmap_mem)),%a1 << 2354 << 2355 /* Calculate the offset in the root t << 2356 */ << 2357 movel ARG2,%d0 << 2358 moveq #ROOT_INDEX_SHIFT,%d1 << 2359 lsrl %d1,%d0 << 2360 mmu_get_root_table_entry %d0 << 2361 << 2362 /* Check if the table is temporary al << 2363 */ << 2364 movel %a0@,%d0 << 2365 cmpl %pc@(L(memory_start)),%d0 << 2366 jcc 1f << 2367 << 2368 /* Temporary allocate a ptr table and << 2369 */ << 2370 movel %a1@,%d0 << 2371 addl #PTR_TABLE_SIZE*4,%a1@ << 2372 orw #_PAGE_TABLE+_PAGE_ACCESSED,% << 2373 movel %d0,%a0@ << 2374 dputs " (new)" << 2375 1: << 2376 dputn %d0 << 2377 /* Mask the root table entry for the << 2378 */ << 2379 andw #-ROOT_TABLE_SIZE,%d0 << 2380 movel %d0,%a0 << 2381 << 2382 /* Calculate the offset into the poin << 2383 */ << 2384 movel ARG2,%d0 << 2385 moveq #PTR_INDEX_SHIFT,%d1 << 2386 lsrl %d1,%d0 << 2387 andl #PTR_TABLE_SIZE-1,%d0 << 2388 lea %a0@(%d0*4),%a0 << 2389 dputn %a0 << 2390 << 2391 /* Check if a temporary page table is << 2392 */ << 2393 movel %a0@,%d0 << 2394 jne 1f << 2395 << 2396 /* Temporary allocate a page table an << 2397 */ << 2398 movel %a1@,%d0 << 2399 /* The 512 should be PAGE_TABLE_SIZE* << 2400 alignment restriction for pointer << 2401 addl #512,%a1@ << 2402 orw #_PAGE_TABLE+_PAGE_ACCESSED,% << 2403 movel %d0,%a0@ << 2404 dputs " (new)" << 2405 1: << 2406 dputn %d0 << 2407 /* Mask the ptr table entry for the p << 2408 */ << 2409 andw #-PTR_TABLE_SIZE,%d0 << 2410 movel %d0,%a0 << 2411 << 2412 /* Calculate the offset into the page << 2413 */ << 2414 movel ARG2,%d0 << 2415 moveq #PAGE_INDEX_SHIFT,%d1 << 2416 lsrl %d1,%d0 << 2417 andl #PAGE_TABLE_SIZE-1,%d0 << 2418 lea %a0@(%d0*4),%a0 << 2419 dputn %a0 << 2420 << 2421 /* Insert the address into the page t << 2422 */ << 2423 movel ARG1,%d0 << 2424 andw #-PAGESIZE,%d0 << 2425 orw #_PAGE_PRESENT+_PAGE_ACCESSED << 2426 movel %d0,%a0@ << 2427 dputn %d0 << 2428 << 2429 dputc '\n' << 2430 << 2431 func_return mmu_temp_map << 2432 << 2433 func_start mmu_engage,%d0-%d2/%a0-%a3 << 2434 << 2435 moveq #ROOT_TABLE_SIZE-1,%d0 << 2436 /* Temporarily use a different root t << 2437 lea %pc@(L(kernel_pgdir_ptr)),%a0 << 2438 movel %a0@,%a2 << 2439 movel %pc@(L(memory_start)),%a1 << 2440 movel %a1,%a0@ << 2441 movel %a2,%a0 << 2442 1: << 2443 movel %a0@+,%a1@+ << 2444 dbra %d0,1b << 2445 << 2446 lea %pc@(L(temp_mmap_mem)),%a0 << 2447 movel %a1,%a0@ << 2448 << 2449 movew #PAGESIZE-1,%d0 << 2450 1: << 2451 clrl %a1@+ << 2452 dbra %d0,1b << 2453 << 2454 lea %pc@(1b),%a0 << 2455 movel #1b,%a1 << 2456 /* Skip temp mappings if phys == virt << 2457 cmpl %a0,%a1 << 2458 jeq 1f << 2459 << 2460 mmu_temp_map %a0,%a0 << 2461 mmu_temp_map %a0,%a1 << 2462 << 2463 addw #PAGESIZE,%a0 << 2464 addw #PAGESIZE,%a1 << 2465 mmu_temp_map %a0,%a0 << 2466 mmu_temp_map %a0,%a1 << 2467 1: << 2468 movel %pc@(L(memory_start)),%a3 << 2469 movel %pc@(L(phys_kernel_start)),%d << 2470 << 2471 is_not_040_or_060(L(mmu_engage_030)) << 2472 << 2473 L(mmu_engage_040): << 2474 .chip 68040 << 2475 nop << 2476 cinva %bc << 2477 nop << 2478 pflusha << 2479 nop << 2480 movec %a3,%srp << 2481 movel #TC_ENABLE+TC_PAGE4K,%d0 << 2482 movec %d0,%tc /* enable the << 2483 jmp 1f:l << 2484 1: nop << 2485 movec %a2,%srp << 2486 nop << 2487 cinva %bc << 2488 nop << 2489 pflusha << 2490 .chip 68k << 2491 jra L(mmu_engage_cleanup) << 2492 << 2493 L(mmu_engage_030_temp): << 2494 .space 12 << 2495 L(mmu_engage_030): << 2496 .chip 68030 << 2497 lea %pc@(L(mmu_engage_030_temp)), << 2498 movel #0x80000002,%a0@ << 2499 movel %a3,%a0@(4) << 2500 movel #0x0808,%d0 << 2501 movec %d0,%cacr << 2502 pmove %a0@,%srp << 2503 pflusha << 2504 /* << 2505 * enable,super root enable,4096 byte << 2506 * 7 bit pointer index, 6 bit page ta << 2507 */ << 2508 movel #0x82c07760,%a0@(8) << 2509 pmove %a0@(8),%tc /* enable the << 2510 jmp 1f:l << 2511 1: movel %a2,%a0@(4) << 2512 movel #0x0808,%d0 << 2513 movec %d0,%cacr << 2514 pmove %a0@,%srp << 2515 pflusha << 2516 .chip 68k << 2517 << 2518 L(mmu_engage_cleanup): << 2519 subl #PAGE_OFFSET,%d2 << 2520 subl %d2,%a2 << 2521 movel %a2,L(kernel_pgdir_ptr) << 2522 subl %d2,%fp << 2523 subl %d2,%sp << 2524 subl %d2,ARG0 << 2525 << 2526 func_return mmu_engage << 2527 << 2528 func_start mmu_get_root_table_entry,%d0/ << 2529 << 2530 #if 0 << 2531 dputs "mmu_get_root_table_entry:" << 2532 dputn ARG1 << 2533 dputs " =" << 2534 #endif << 2535 << 2536 movel %pc@(L(kernel_pgdir_ptr)),%a0 << 2537 tstl %a0 << 2538 jne 2f << 2539 << 2540 dputs "\nmmu_init:" << 2541 << 2542 /* Find the start of free memory, get << 2543 * as the bootinfo structure is locat << 2544 * we simply search for the last entr << 2545 */ << 2546 get_bi_record BI_LAST << 2547 addw #PAGESIZE-1,%a0 << 2548 movel %a0,%d0 << 2549 andw #-PAGESIZE,%d0 << 2550 << 2551 dputn %d0 << 2552 << 2553 lea %pc@(L(memory_start)),%a0 << 2554 movel %d0,%a0@ << 2555 lea %pc@(L(kernel_end)),%a0 << 2556 movel %d0,%a0@ << 2557 << 2558 /* we have to return the first page a << 2559 * in mm/init.c simply expects kernel << 2560 * page is used for further ptr table << 2561 */ << 2562 lea %pc@(_stext),%a0 << 2563 lea %pc@(L(mmu_cached_pointer_tab << 2564 movel %a0,%a1@ << 2565 addl #ROOT_TABLE_SIZE*4,%a1@ << 2566 << 2567 lea %pc@(L(mmu_num_pointer_tables << 2568 addql #1,%a1@ << 2569 << 2570 /* clear the page << 2571 */ << 2572 movel %a0,%a1 << 2573 movew #PAGESIZE/4-1,%d0 << 2574 1: << 2575 clrl %a1@+ << 2576 dbra %d0,1b << 2577 << 2578 lea %pc@(L(kernel_pgdir_ptr)),%a1 << 2579 movel %a0,%a1@ << 2580 << 2581 dputn %a0 << 2582 dputc '\n' << 2583 2: << 2584 movel ARG1,%d0 << 2585 lea %a0@(%d0*4),%a0 << 2586 << 2587 #if 0 << 2588 dputn %a0 << 2589 dputc '\n' << 2590 #endif << 2591 << 2592 func_return mmu_get_root_table_entry << 2593 << 2594 << 2595 << 2596 func_start mmu_get_ptr_table_entry,%d0/% << 2597 << 2598 #if 0 << 2599 dputs "mmu_get_ptr_table_entry:" << 2600 dputn ARG1 << 2601 dputn ARG2 << 2602 dputs " =" << 2603 #endif << 2604 << 2605 movel ARG1,%a0 << 2606 movel %a0@,%d0 << 2607 jne 2f << 2608 << 2609 /* Keep track of the number of pointe << 2610 */ << 2611 dputs "\nmmu_get_new_ptr_table:" << 2612 lea %pc@(L(mmu_num_pointer_tables << 2613 movel %a0@,%d0 << 2614 addql #1,%a0@ << 2615 << 2616 /* See if there is a free pointer tab << 2617 */ << 2618 lea %pc@(L(mmu_cached_pointer_tab << 2619 andw #7,%d0 << 2620 jne 1f << 2621 << 2622 /* Get a new pointer table page from << 2623 */ << 2624 get_new_page << 2625 movel %a0,%a1@ << 2626 1: << 2627 /* There is an unused pointer table i << 2628 */ << 2629 movel %a1@,%d0 << 2630 addl #PTR_TABLE_SIZE*4,%a1@ << 2631 << 2632 dputn %d0 << 2633 dputc '\n' << 2634 << 2635 /* Insert the new pointer table into << 2636 */ << 2637 movel ARG1,%a0 << 2638 orw #_PAGE_TABLE+_PAGE_ACCESSED,% << 2639 movel %d0,%a0@ << 2640 2: << 2641 /* Extract the pointer table entry << 2642 */ << 2643 andw #-PTR_TABLE_SIZE,%d0 << 2644 movel %d0,%a0 << 2645 movel ARG2,%d0 << 2646 lea %a0@(%d0*4),%a0 << 2647 << 2648 #if 0 << 2649 dputn %a0 << 2650 dputc '\n' << 2651 #endif << 2652 << 2653 func_return mmu_get_ptr_table_entry << 2654 << 2655 << 2656 func_start mmu_get_page_table_entry,%d0/ << 2657 << 2658 #if 0 << 2659 dputs "mmu_get_page_table_entry:" << 2660 dputn ARG1 << 2661 dputn ARG2 << 2662 dputs " =" << 2663 #endif << 2664 << 2665 movel ARG1,%a0 << 2666 movel %a0@,%d0 << 2667 jne 2f << 2668 << 2669 /* If the page table entry doesn't ex << 2670 * page and use it as one continuous << 2671 * 4MB of memory, nearly almost all m << 2672 */ << 2673 get_new_page << 2674 addw #_PAGE_TABLE+_PAGE_ACCESSED,% << 2675 << 2676 /* align pointer table entry for a pa << 2677 */ << 2678 movel ARG1,%d0 << 2679 andw #-(PAGESIZE/PAGE_TABLE_SIZE), << 2680 movel %d0,%a1 << 2681 << 2682 /* Insert the page tables into the po << 2683 */ << 2684 moveq #PAGESIZE/PAGE_TABLE_SIZE/4-1 << 2685 1: << 2686 movel %a0,%a1@+ << 2687 lea %a0@(PAGE_TABLE_SIZE*4),%a0 << 2688 dbra %d0,1b << 2689 << 2690 /* Now we can get the initialized poi << 2691 */ << 2692 movel ARG1,%a0 << 2693 movel %a0@,%d0 << 2694 2: << 2695 /* Extract the page table entry << 2696 */ << 2697 andw #-PAGE_TABLE_SIZE,%d0 << 2698 movel %d0,%a0 << 2699 movel ARG2,%d0 << 2700 lea %a0@(%d0*4),%a0 << 2701 << 2702 #if 0 << 2703 dputn %a0 << 2704 dputc '\n' << 2705 #endif << 2706 << 2707 func_return mmu_get_page_table_entry << 2708 << 2709 /* << 2710 * get_new_page << 2711 * << 2712 * Return a new page from the memory sta << 2713 */ << 2714 func_start get_new_page,%d0/%a1 << 2715 << 2716 dputs "\nget_new_page:" << 2717 << 2718 /* allocate the page and adjust memor << 2719 */ << 2720 lea %pc@(L(memory_start)),%a0 << 2721 movel %a0@,%a1 << 2722 addl #PAGESIZE,%a0@ << 2723 << 2724 /* clear the new page << 2725 */ << 2726 movel %a1,%a0 << 2727 movew #PAGESIZE/4-1,%d0 << 2728 1: << 2729 clrl %a1@+ << 2730 dbra %d0,1b << 2731 << 2732 dputn %a0 << 2733 dputc '\n' << 2734 << 2735 func_return get_new_page << 2736 << 2737 16 >> 17 #include <asm/cprefix.h> >> 18 #include <asm/head.h> >> 19 #include <asm/asi.h> >> 20 #include <asm/contregs.h> >> 21 #include <asm/ptrace.h> >> 22 #include <asm/psr.h> >> 23 #include <asm/page.h> >> 24 #include <asm/kdebug.h> >> 25 #include <asm/winmacro.h> >> 26 #include <asm/thread_info.h> /* TI_UWINMASK */ >> 27 #include <asm/errno.h> >> 28 #include <asm/pgtsrmmu.h> /* SRMMU_PGDIR_SHIFT */ 2738 29 2739 /* !! 30 .data 2740 * Debug output support !! 31 /* 2741 * Atarians have a choice between the paralle !! 32 * The following are used with the prom_vector node-ops to figure out 2742 * from the MFP or a serial port of the SCC !! 33 * the cpu-type 2743 */ 34 */ 2744 35 2745 #ifdef CONFIG_MAC !! 36 .align 4 2746 /* You may define either or both of these. */ !! 37 .globl C_LABEL(cputyp) 2747 #define MAC_USE_SCC_A /* Modem port */ !! 38 C_LABEL(cputyp): 2748 #define MAC_USE_SCC_B /* Printer port */ !! 39 .word 1 2749 << 2750 #if defined(MAC_USE_SCC_A) || defined(MAC_USE << 2751 /* Initialisation table for SCC with 3.6864 M << 2752 L(scc_initable_mac): << 2753 .byte 4,0x44 /* x16, 1 sto << 2754 .byte 3,0xc0 /* receiver: << 2755 .byte 5,0xe2 /* transmitte << 2756 .byte 10,0 /* NRZ */ << 2757 .byte 11,0x50 /* use baud r << 2758 .byte 12,1,13,0 /* 38400 baud << 2759 .byte 14,1 /* Baud rate << 2760 .byte 3,0xc1 /* enable rec << 2761 .byte 5,0xea /* enable tra << 2762 .byte -1 << 2763 .even << 2764 #endif << 2765 #endif /* CONFIG_MAC */ << 2766 << 2767 #ifdef CONFIG_ATARI << 2768 /* #define USE_PRINTER */ << 2769 /* #define USE_SCC_B */ << 2770 /* #define USE_SCC_A */ << 2771 #define USE_MFP << 2772 << 2773 #if defined(USE_SCC_A) || defined(USE_SCC_B) << 2774 /* Initialisation table for SCC with 7.9872 M << 2775 /* PCLK == 8.0539 gives baud == 9680.1 */ << 2776 L(scc_initable_atari): << 2777 .byte 4,0x44 /* x16, 1 sto << 2778 .byte 3,0xc0 /* receiver: << 2779 .byte 5,0xe2 /* transmitte << 2780 .byte 10,0 /* NRZ */ << 2781 .byte 11,0x50 /* use baud r << 2782 .byte 12,24,13,0 /* 9600 baud << 2783 .byte 14,2,14,3 /* use master << 2784 .byte 3,0xc1 /* enable rec << 2785 .byte 5,0xea /* enable tra << 2786 .byte -1 << 2787 .even << 2788 #endif << 2789 40 2790 #ifdef USE_PRINTER !! 41 .align 4 >> 42 .globl C_LABEL(cputypval) >> 43 C_LABEL(cputypval): >> 44 .asciz "sun4c" >> 45 .ascii " " 2791 46 2792 LPSG_SELECT = 0xff8800 !! 47 C_LABEL(cputypvalend): 2793 LPSG_READ = 0xff8800 !! 48 C_LABEL(cputypvallen) = C_LABEL(cputypvar) - C_LABEL(cputypval) 2794 LPSG_WRITE = 0xff8802 << 2795 LPSG_IO_A = 14 << 2796 LPSG_IO_B = 15 << 2797 LPSG_CONTROL = 7 << 2798 LSTMFP_GPIP = 0xfffa01 << 2799 LSTMFP_DDR = 0xfffa05 << 2800 LSTMFP_IERB = 0xfffa09 << 2801 << 2802 #elif defined(USE_SCC_B) << 2803 << 2804 LSCC_CTRL = 0xff8c85 << 2805 LSCC_DATA = 0xff8c87 << 2806 << 2807 #elif defined(USE_SCC_A) << 2808 << 2809 LSCC_CTRL = 0xff8c81 << 2810 LSCC_DATA = 0xff8c83 << 2811 << 2812 #elif defined(USE_MFP) << 2813 << 2814 LMFP_UCR = 0xfffa29 << 2815 LMFP_TDCDR = 0xfffa1d << 2816 LMFP_TDDR = 0xfffa25 << 2817 LMFP_TSR = 0xfffa2d << 2818 LMFP_UDR = 0xfffa2f << 2819 << 2820 #endif << 2821 #endif /* CONFIG_ATARI */ << 2822 49 >> 50 .align 4 2823 /* 51 /* 2824 * Serial port output support. !! 52 * Sun people can't spell worth damn. "compatability" indeed. >> 53 * At least we *know* we can't spell, and use a spell-checker. 2825 */ 54 */ 2826 55 2827 /* !! 56 /* Uh, actually Linus it is I who cannot spell. Too much murky 2828 * Initialize serial port hardware !! 57 * Sparc assembly will do this to ya. 2829 */ 58 */ 2830 func_start serial_init,%d0/%d1/%a0/%a1 !! 59 C_LABEL(cputypvar): 2831 /* !! 60 .asciz "compatability" 2832 * Some of the register usage th << 2833 * CONFIG_AMIGA << 2834 * a0 = pointer to boot << 2835 * d0 = boot info offset << 2836 * CONFIG_ATARI << 2837 * a0 = address of SCC << 2838 * a1 = Liobase address/ << 2839 * d0 = init data for se << 2840 * CONFIG_MAC << 2841 * a0 = address of SCC << 2842 * a1 = address of scc_i << 2843 * d0 = init data for se << 2844 */ << 2845 << 2846 #ifdef CONFIG_AMIGA << 2847 #define SERIAL_DTR 7 << 2848 #define SERIAL_CNTRL CIABBASE+C_PRA << 2849 << 2850 is_not_amiga(1f) << 2851 lea %pc@(L(custom)),%a0 << 2852 movel #-ZTWOBASE,%a0@ << 2853 bclr #SERIAL_DTR,SERIAL_CNTRL-ZTWO << 2854 get_bi_record BI_AMIGA_SERPER << 2855 movew %a0@,CUSTOMBASE+C_SERPER-ZTWO << 2856 | movew #61,CUSTOMBASE+C_SERPER-ZTWOB << 2857 1: << 2858 #endif << 2859 << 2860 #ifdef CONFIG_ATARI << 2861 is_not_atari(4f) << 2862 movel %pc@(L(iobase)),%a1 << 2863 #if defined(USE_PRINTER) << 2864 bclr #0,%a1@(LSTMFP_IERB) << 2865 bclr #0,%a1@(LSTMFP_DDR) << 2866 moveb #LPSG_CONTROL,%a1@(LPSG_SELEC << 2867 moveb #0xff,%a1@(LPSG_WRITE) << 2868 moveb #LPSG_IO_B,%a1@(LPSG_SELECT) << 2869 clrb %a1@(LPSG_WRITE) << 2870 moveb #LPSG_IO_A,%a1@(LPSG_SELECT) << 2871 moveb %a1@(LPSG_READ),%d0 << 2872 bset #5,%d0 << 2873 moveb %d0,%a1@(LPSG_WRITE) << 2874 #elif defined(USE_SCC_A) || defined(USE_SCC_B << 2875 lea %a1@(LSCC_CTRL),%a0 << 2876 /* Reset SCC register pointer */ << 2877 moveb %a0@,%d0 << 2878 /* Reset SCC device: write register p << 2879 moveb #9,%a0@ << 2880 moveb #0xc0,%a0@ << 2881 /* Wait for 5 PCLK cycles, which is a << 2882 /* 5 / 7.9872 MHz = approx. 0.63 us = << 2883 movel #32,%d0 << 2884 2: << 2885 subq #1,%d0 << 2886 jne 2b << 2887 /* Initialize channel */ << 2888 lea %pc@(L(scc_initable_atari)),% << 2889 2: moveb %a1@+,%d0 << 2890 jmi 3f << 2891 moveb %d0,%a0@ << 2892 moveb %a1@+,%a0@ << 2893 jra 2b << 2894 3: clrb %a0@ << 2895 #elif defined(USE_MFP) << 2896 bclr #1,%a1@(LMFP_TSR) << 2897 moveb #0x88,%a1@(LMFP_UCR) << 2898 andb #0x70,%a1@(LMFP_TDCDR) << 2899 moveb #2,%a1@(LMFP_TDDR) << 2900 orb #1,%a1@(LMFP_TDCDR) << 2901 bset #1,%a1@(LMFP_TSR) << 2902 #endif << 2903 jra L(serial_init_done) << 2904 4: << 2905 #endif << 2906 61 2907 #ifdef CONFIG_MAC !! 62 /* Tested on SS-5, SS-10. Probably someone at Sun applied a spell-checker. */ 2908 is_not_mac(L(serial_init_not_mac)) !! 63 .align 4 2909 #if defined(MAC_USE_SCC_A) || defined(MAC_USE !! 64 C_LABEL(cputypvar_sun4m): 2910 #define mac_scc_cha_b_ctrl_offset 0x0 !! 65 .asciz "compatible" 2911 #define mac_scc_cha_a_ctrl_offset 0x2 << 2912 #define mac_scc_cha_b_data_offset 0x4 << 2913 #define mac_scc_cha_a_data_offset 0x6 << 2914 movel %pc@(L(mac_sccbase)),%a0 << 2915 /* Reset SCC register pointer */ << 2916 moveb %a0@(mac_scc_cha_a_ctrl_offse << 2917 /* Reset SCC device: write register p << 2918 moveb #9,%a0@(mac_scc_cha_a_ctrl_of << 2919 moveb #0xc0,%a0@(mac_scc_cha_a_ctrl << 2920 /* Wait for 5 PCLK cycles, which is a << 2921 /* 5 / 3.6864 MHz = approx. 1.36 us = << 2922 movel #35,%d0 << 2923 5: << 2924 subq #1,%d0 << 2925 jne 5b << 2926 #endif << 2927 #ifdef MAC_USE_SCC_A << 2928 /* Initialize channel A */ << 2929 lea %pc@(L(scc_initable_mac)),%a1 << 2930 5: moveb %a1@+,%d0 << 2931 jmi 6f << 2932 moveb %d0,%a0@(mac_scc_cha_a_ctrl_o << 2933 moveb %a1@+,%a0@(mac_scc_cha_a_ctrl << 2934 jra 5b << 2935 6: << 2936 #endif /* MAC_USE_SCC_A */ << 2937 #ifdef MAC_USE_SCC_B << 2938 /* Initialize channel B */ << 2939 lea %pc@(L(scc_initable_mac)),%a1 << 2940 7: moveb %a1@+,%d0 << 2941 jmi 8f << 2942 moveb %d0,%a0@(mac_scc_cha_b_ctrl_o << 2943 moveb %a1@+,%a0@(mac_scc_cha_b_ctrl << 2944 jra 7b << 2945 8: << 2946 #endif /* MAC_USE_SCC_B */ << 2947 jra L(serial_init_done) << 2948 L(serial_init_not_mac): << 2949 #endif /* CONFIG_MAC */ << 2950 << 2951 #ifdef CONFIG_Q40 << 2952 is_not_q40(2f) << 2953 /* debug output goes into SRAM, so we don't d << 2954 - check for '%LX$' signature in SRAM */ << 2955 lea %pc@(q40_mem_cptr),%a1 << 2956 move.l #0xff020010,%a1@ /* must be << 2957 move.l #0xff020000,%a1 << 2958 cmp.b #'%',%a1@ << 2959 bne 2f /*nodbg*/ << 2960 addq.w #4,%a1 << 2961 cmp.b #'L',%a1@ << 2962 bne 2f /*nodbg*/ << 2963 addq.w #4,%a1 << 2964 cmp.b #'X',%a1@ << 2965 bne 2f /*nodbg*/ << 2966 addq.w #4,%a1 << 2967 cmp.b #'$',%a1@ << 2968 bne 2f /*nodbg*/ << 2969 /* signature OK */ << 2970 lea %pc@(L(q40_do_debug)),%a1 << 2971 tas %a1@ << 2972 /*nodbg: q40_do_debug is 0 by default*/ << 2973 2: << 2974 #endif << 2975 66 2976 #ifdef CONFIG_MVME16x !! 67 .align 4 2977 is_not_mvme16x(L(serial_init_not_mvme << 2978 moveb #0x10,M167_PCSCCMICR << 2979 moveb #0x10,M167_PCSCCTICR << 2980 moveb #0x10,M167_PCSCCRICR << 2981 jra L(serial_init_done) << 2982 L(serial_init_not_mvme16x): << 2983 #endif << 2984 68 2985 #ifdef CONFIG_APOLLO !! 69 #ifndef CONFIG_SUN4 2986 /* We count on the PROM initializing SIO1 */ !! 70 sun4_notsup: 2987 #endif !! 71 .asciz "Sparc-Linux sun4 needs a specially compiled kernel, turn CONFIG_SUN4 on.\n\n" 2988 !! 72 .align 4 2989 #ifdef CONFIG_HP300 !! 73 #else 2990 /* We count on the boot loader initialising t !! 74 sun4cdm_notsup: >> 75 .asciz "Kernel compiled with CONFIG_SUN4 cannot run on SUN4C/SUN4M/SUN4D\nTurn CONFIG_SUN4 off.\n\n" >> 76 .align 4 >> 77 #endif >> 78 >> 79 sun4e_notsup: >> 80 .asciz "Sparc-Linux sun4e support does not exist\n\n" >> 81 .align 4 >> 82 >> 83 #ifndef CONFIG_SUNOS_EMUL >> 84 #undef SUNOS_SYSCALL_TRAP >> 85 #define SUNOS_SYSCALL_TRAP SUNOS_NO_SYSCALL_TRAP >> 86 #endif >> 87 >> 88 /* The Sparc trap table, bootloader gives us control at _start. */ >> 89 .text >> 90 .globl start, _stext, _start, __stext >> 91 .globl C_LABEL(trapbase) >> 92 _start: /* danger danger */ >> 93 __stext: >> 94 _stext: >> 95 start: >> 96 C_LABEL(trapbase): >> 97 #ifdef CONFIG_SMP >> 98 C_LABEL(trapbase_cpu0): >> 99 #endif >> 100 /* We get control passed to us here at t_zero. */ >> 101 t_zero: b gokernel; nop; nop; nop; >> 102 t_tflt: SPARC_TFAULT /* Inst. Access Exception */ >> 103 t_bins: TRAP_ENTRY(0x2, bad_instruction) /* Illegal Instruction */ >> 104 t_pins: TRAP_ENTRY(0x3, priv_instruction) /* Privileged Instruction */ >> 105 t_fpd: TRAP_ENTRY(0x4, fpd_trap_handler) /* Floating Point Disabled */ >> 106 t_wovf: WINDOW_SPILL /* Window Overflow */ >> 107 t_wunf: WINDOW_FILL /* Window Underflow */ >> 108 t_mna: TRAP_ENTRY(0x7, mna_handler) /* Memory Address Not Aligned */ >> 109 t_fpe: TRAP_ENTRY(0x8, fpe_trap_handler) /* Floating Point Exception */ >> 110 t_dflt: SPARC_DFAULT /* Data Miss Exception */ >> 111 t_tio: TRAP_ENTRY(0xa, do_tag_overflow) /* Tagged Instruction Ovrflw */ >> 112 t_wpt: TRAP_ENTRY(0xb, do_watchpoint) /* Watchpoint Detected */ >> 113 t_badc: BAD_TRAP(0xc) BAD_TRAP(0xd) BAD_TRAP(0xe) BAD_TRAP(0xf) BAD_TRAP(0x10) >> 114 t_irq1: TRAP_ENTRY_INTERRUPT(1) /* IRQ Software/SBUS Level 1 */ >> 115 t_irq2: TRAP_ENTRY_INTERRUPT(2) /* IRQ SBUS Level 2 */ >> 116 t_irq3: TRAP_ENTRY_INTERRUPT(3) /* IRQ SCSI/DMA/SBUS Level 3 */ >> 117 t_irq4: TRAP_ENTRY_INTERRUPT(4) /* IRQ Software Level 4 */ >> 118 t_irq5: TRAP_ENTRY_INTERRUPT(5) /* IRQ SBUS/Ethernet Level 5 */ >> 119 t_irq6: TRAP_ENTRY_INTERRUPT(6) /* IRQ Software Level 6 */ >> 120 t_irq7: TRAP_ENTRY_INTERRUPT(7) /* IRQ Video/SBUS Level 5 */ >> 121 t_irq8: TRAP_ENTRY_INTERRUPT(8) /* IRQ SBUS Level 6 */ >> 122 t_irq9: TRAP_ENTRY_INTERRUPT(9) /* IRQ SBUS Level 7 */ >> 123 t_irq10:TRAP_ENTRY_INTERRUPT(10) /* IRQ Timer #1 (one we use) */ >> 124 t_irq11:TRAP_ENTRY_INTERRUPT(11) /* IRQ Floppy Intr. */ >> 125 t_irq12:TRAP_ENTRY_INTERRUPT(12) /* IRQ Zilog serial chip */ >> 126 t_irq13:TRAP_ENTRY_INTERRUPT(13) /* IRQ Audio Intr. */ >> 127 t_irq14:TRAP_ENTRY_INTERRUPT(14) /* IRQ Timer #2 */ >> 128 .globl t_nmi >> 129 #ifndef CONFIG_SMP >> 130 t_nmi: NMI_TRAP /* Level 15 (NMI) */ >> 131 #else >> 132 t_nmi: TRAP_ENTRY(0x1f, linux_trap_ipi15_sun4m) 2991 #endif 133 #endif 2992 !! 134 t_racc: TRAP_ENTRY(0x20, do_reg_access) /* General Register Access Error */ 2993 L(serial_init_done): !! 135 t_iacce:BAD_TRAP(0x21) /* Instr Access Error */ 2994 func_return serial_init !! 136 t_bad22:BAD_TRAP(0x22) BAD_TRAP(0x23) 2995 !! 137 t_cpdis:TRAP_ENTRY(0x24, do_cp_disabled) /* Co-Processor Disabled */ 2996 /* !! 138 t_uflsh:SKIP_TRAP(0x25, unimp_flush) /* Unimplemented FLUSH inst. */ 2997 * Output character on serial port. !! 139 t_bad26:BAD_TRAP(0x26) BAD_TRAP(0x27) >> 140 t_cpexc:TRAP_ENTRY(0x28, do_cp_exception) /* Co-Processor Exception */ >> 141 t_dacce:SPARC_DFAULT /* Data Access Error */ >> 142 t_hwdz: TRAP_ENTRY(0x2a, do_hw_divzero) /* Division by zero, you lose... */ >> 143 t_dserr:BAD_TRAP(0x2b) /* Data Store Error */ >> 144 t_daccm:BAD_TRAP(0x2c) /* Data Access MMU-Miss */ >> 145 t_bad2d:BAD_TRAP(0x2d) BAD_TRAP(0x2e) BAD_TRAP(0x2f) BAD_TRAP(0x30) BAD_TRAP(0x31) >> 146 t_bad32:BAD_TRAP(0x32) BAD_TRAP(0x33) BAD_TRAP(0x34) BAD_TRAP(0x35) BAD_TRAP(0x36) >> 147 t_bad37:BAD_TRAP(0x37) BAD_TRAP(0x38) BAD_TRAP(0x39) BAD_TRAP(0x3a) BAD_TRAP(0x3b) >> 148 t_iaccm:BAD_TRAP(0x3c) /* Instr Access MMU-Miss */ >> 149 t_bad3d:BAD_TRAP(0x3d) BAD_TRAP(0x3e) BAD_TRAP(0x3f) BAD_TRAP(0x40) BAD_TRAP(0x41) >> 150 t_bad42:BAD_TRAP(0x42) BAD_TRAP(0x43) BAD_TRAP(0x44) BAD_TRAP(0x45) BAD_TRAP(0x46) >> 151 t_bad47:BAD_TRAP(0x47) BAD_TRAP(0x48) BAD_TRAP(0x49) BAD_TRAP(0x4a) BAD_TRAP(0x4b) >> 152 t_bad4c:BAD_TRAP(0x4c) BAD_TRAP(0x4d) BAD_TRAP(0x4e) BAD_TRAP(0x4f) BAD_TRAP(0x50) >> 153 t_bad51:BAD_TRAP(0x51) BAD_TRAP(0x52) BAD_TRAP(0x53) BAD_TRAP(0x54) BAD_TRAP(0x55) >> 154 t_bad56:BAD_TRAP(0x56) BAD_TRAP(0x57) BAD_TRAP(0x58) BAD_TRAP(0x59) BAD_TRAP(0x5a) >> 155 t_bad5b:BAD_TRAP(0x5b) BAD_TRAP(0x5c) BAD_TRAP(0x5d) BAD_TRAP(0x5e) BAD_TRAP(0x5f) >> 156 t_bad60:BAD_TRAP(0x60) BAD_TRAP(0x61) BAD_TRAP(0x62) BAD_TRAP(0x63) BAD_TRAP(0x64) >> 157 t_bad65:BAD_TRAP(0x65) BAD_TRAP(0x66) BAD_TRAP(0x67) BAD_TRAP(0x68) BAD_TRAP(0x69) >> 158 t_bad6a:BAD_TRAP(0x6a) BAD_TRAP(0x6b) BAD_TRAP(0x6c) BAD_TRAP(0x6d) BAD_TRAP(0x6e) >> 159 t_bad6f:BAD_TRAP(0x6f) BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x73) >> 160 t_bad74:BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) >> 161 t_bad79:BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) >> 162 t_bad7e:BAD_TRAP(0x7e) BAD_TRAP(0x7f) >> 163 t_sunos:SUNOS_SYSCALL_TRAP /* SunOS System Call */ >> 164 t_sbkpt:BREAKPOINT_TRAP /* Software Breakpoint/KGDB */ >> 165 t_divz: TRAP_ENTRY(0x82, do_hw_divzero) /* Divide by zero trap */ >> 166 t_flwin:TRAP_ENTRY(0x83, do_flush_windows) /* Flush Windows Trap */ >> 167 t_clwin:BAD_TRAP(0x84) /* Clean Windows Trap */ >> 168 t_rchk: BAD_TRAP(0x85) /* Range Check */ >> 169 t_funal:BAD_TRAP(0x86) /* Fix Unaligned Access Trap */ >> 170 t_iovf: BAD_TRAP(0x87) /* Integer Overflow Trap */ >> 171 t_slowl:SOLARIS_SYSCALL_TRAP /* Slowaris System Call */ >> 172 t_netbs:NETBSD_SYSCALL_TRAP /* Net-B.S. System Call */ >> 173 t_bad8a:BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) BAD_TRAP(0x8d) BAD_TRAP(0x8e) >> 174 t_bad8f:BAD_TRAP(0x8f) >> 175 t_linux:LINUX_SYSCALL_TRAP /* Linux System Call */ >> 176 t_bad91:BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94) BAD_TRAP(0x95) >> 177 t_bad96:BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99) BAD_TRAP(0x9a) >> 178 t_bad9b:BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e) BAD_TRAP(0x9f) >> 179 t_getcc:GETCC_TRAP /* Get Condition Codes */ >> 180 t_setcc:SETCC_TRAP /* Set Condition Codes */ >> 181 t_getpsr:GETPSR_TRAP /* Get PSR Register */ >> 182 t_bada3:BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6) >> 183 t_slowi:INDIRECT_SOLARIS_SYSCALL(156) >> 184 t_bada8:BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab) >> 185 t_badac:BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0) >> 186 t_badb1:BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5) >> 187 t_badb6:BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba) >> 188 t_badbb:BAD_TRAP(0xbb) BAD_TRAP(0xbc) BAD_TRAP(0xbd) BAD_TRAP(0xbe) BAD_TRAP(0xbf) >> 189 t_badc0:BAD_TRAP(0xc0) BAD_TRAP(0xc1) BAD_TRAP(0xc2) BAD_TRAP(0xc3) BAD_TRAP(0xc4) >> 190 t_badc5:BAD_TRAP(0xc5) BAD_TRAP(0xc6) BAD_TRAP(0xc7) BAD_TRAP(0xc8) BAD_TRAP(0xc9) >> 191 t_badca:BAD_TRAP(0xca) BAD_TRAP(0xcb) BAD_TRAP(0xcc) BAD_TRAP(0xcd) BAD_TRAP(0xce) >> 192 t_badcf:BAD_TRAP(0xcf) BAD_TRAP(0xd0) BAD_TRAP(0xd1) BAD_TRAP(0xd2) BAD_TRAP(0xd3) >> 193 t_badd4:BAD_TRAP(0xd4) BAD_TRAP(0xd5) BAD_TRAP(0xd6) BAD_TRAP(0xd7) BAD_TRAP(0xd8) >> 194 t_badd9:BAD_TRAP(0xd9) BAD_TRAP(0xda) BAD_TRAP(0xdb) BAD_TRAP(0xdc) BAD_TRAP(0xdd) >> 195 t_badde:BAD_TRAP(0xde) BAD_TRAP(0xdf) BAD_TRAP(0xe0) BAD_TRAP(0xe1) BAD_TRAP(0xe2) >> 196 t_bade3:BAD_TRAP(0xe3) BAD_TRAP(0xe4) BAD_TRAP(0xe5) BAD_TRAP(0xe6) BAD_TRAP(0xe7) >> 197 t_bade8:BAD_TRAP(0xe8) BAD_TRAP(0xe9) BAD_TRAP(0xea) BAD_TRAP(0xeb) BAD_TRAP(0xec) >> 198 t_baded:BAD_TRAP(0xed) BAD_TRAP(0xee) BAD_TRAP(0xef) BAD_TRAP(0xf0) BAD_TRAP(0xf1) >> 199 t_badf2:BAD_TRAP(0xf2) BAD_TRAP(0xf3) BAD_TRAP(0xf4) BAD_TRAP(0xf5) BAD_TRAP(0xf6) >> 200 t_badf7:BAD_TRAP(0xf7) BAD_TRAP(0xf8) BAD_TRAP(0xf9) BAD_TRAP(0xfa) BAD_TRAP(0xfb) >> 201 t_badfc:BAD_TRAP(0xfc) BAD_TRAP(0xfd) >> 202 dbtrap: BAD_TRAP(0xfe) /* Debugger/PROM breakpoint #1 */ >> 203 dbtrap2:BAD_TRAP(0xff) /* Debugger/PROM breakpoint #2 */ >> 204 >> 205 .globl C_LABEL(end_traptable) >> 206 C_LABEL(end_traptable): >> 207 >> 208 #ifdef CONFIG_SMP >> 209 /* Trap tables for the other cpus. */ >> 210 .globl C_LABEL(trapbase_cpu1), C_LABEL(trapbase_cpu2), C_LABEL(trapbase_cpu3) >> 211 C_LABEL(trapbase_cpu1): >> 212 BAD_TRAP(0x0) SRMMU_TFAULT TRAP_ENTRY(0x2, bad_instruction) >> 213 TRAP_ENTRY(0x3, priv_instruction) TRAP_ENTRY(0x4, fpd_trap_handler) >> 214 WINDOW_SPILL WINDOW_FILL TRAP_ENTRY(0x7, mna_handler) >> 215 TRAP_ENTRY(0x8, fpe_trap_handler) SRMMU_DFAULT >> 216 TRAP_ENTRY(0xa, do_tag_overflow) TRAP_ENTRY(0xb, do_watchpoint) >> 217 BAD_TRAP(0xc) BAD_TRAP(0xd) BAD_TRAP(0xe) BAD_TRAP(0xf) BAD_TRAP(0x10) >> 218 TRAP_ENTRY_INTERRUPT(1) TRAP_ENTRY_INTERRUPT(2) >> 219 TRAP_ENTRY_INTERRUPT(3) TRAP_ENTRY_INTERRUPT(4) >> 220 TRAP_ENTRY_INTERRUPT(5) TRAP_ENTRY_INTERRUPT(6) >> 221 TRAP_ENTRY_INTERRUPT(7) TRAP_ENTRY_INTERRUPT(8) >> 222 TRAP_ENTRY_INTERRUPT(9) TRAP_ENTRY_INTERRUPT(10) >> 223 TRAP_ENTRY_INTERRUPT(11) TRAP_ENTRY_INTERRUPT(12) >> 224 TRAP_ENTRY_INTERRUPT(13) TRAP_ENTRY_INTERRUPT(14) >> 225 TRAP_ENTRY(0x1f, linux_trap_ipi15_sun4m) >> 226 TRAP_ENTRY(0x20, do_reg_access) BAD_TRAP(0x21) BAD_TRAP(0x22) >> 227 BAD_TRAP(0x23) TRAP_ENTRY(0x24, do_cp_disabled) SKIP_TRAP(0x25, unimp_flush) >> 228 BAD_TRAP(0x26) BAD_TRAP(0x27) TRAP_ENTRY(0x28, do_cp_exception) >> 229 SRMMU_DFAULT TRAP_ENTRY(0x2a, do_hw_divzero) BAD_TRAP(0x2b) BAD_TRAP(0x2c) >> 230 BAD_TRAP(0x2d) BAD_TRAP(0x2e) BAD_TRAP(0x2f) BAD_TRAP(0x30) BAD_TRAP(0x31) >> 231 BAD_TRAP(0x32) BAD_TRAP(0x33) BAD_TRAP(0x34) BAD_TRAP(0x35) BAD_TRAP(0x36) >> 232 BAD_TRAP(0x37) BAD_TRAP(0x38) BAD_TRAP(0x39) BAD_TRAP(0x3a) BAD_TRAP(0x3b) >> 233 BAD_TRAP(0x3c) BAD_TRAP(0x3d) BAD_TRAP(0x3e) BAD_TRAP(0x3f) BAD_TRAP(0x40) >> 234 BAD_TRAP(0x41) BAD_TRAP(0x42) BAD_TRAP(0x43) BAD_TRAP(0x44) BAD_TRAP(0x45) >> 235 BAD_TRAP(0x46) BAD_TRAP(0x47) BAD_TRAP(0x48) BAD_TRAP(0x49) BAD_TRAP(0x4a) >> 236 BAD_TRAP(0x4b) BAD_TRAP(0x4c) BAD_TRAP(0x4d) BAD_TRAP(0x4e) BAD_TRAP(0x4f) >> 237 BAD_TRAP(0x50) >> 238 BAD_TRAP(0x51) BAD_TRAP(0x52) BAD_TRAP(0x53) BAD_TRAP(0x54) BAD_TRAP(0x55) >> 239 BAD_TRAP(0x56) BAD_TRAP(0x57) BAD_TRAP(0x58) BAD_TRAP(0x59) BAD_TRAP(0x5a) >> 240 BAD_TRAP(0x5b) BAD_TRAP(0x5c) BAD_TRAP(0x5d) BAD_TRAP(0x5e) BAD_TRAP(0x5f) >> 241 BAD_TRAP(0x60) BAD_TRAP(0x61) BAD_TRAP(0x62) BAD_TRAP(0x63) BAD_TRAP(0x64) >> 242 BAD_TRAP(0x65) BAD_TRAP(0x66) BAD_TRAP(0x67) BAD_TRAP(0x68) BAD_TRAP(0x69) >> 243 BAD_TRAP(0x6a) BAD_TRAP(0x6b) BAD_TRAP(0x6c) BAD_TRAP(0x6d) BAD_TRAP(0x6e) >> 244 BAD_TRAP(0x6f) BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x73) >> 245 BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) >> 246 BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) >> 247 BAD_TRAP(0x7e) BAD_TRAP(0x7f) >> 248 SUNOS_SYSCALL_TRAP >> 249 BREAKPOINT_TRAP >> 250 TRAP_ENTRY(0x82, do_hw_divzero) >> 251 TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85) >> 252 BAD_TRAP(0x86) BAD_TRAP(0x87) SOLARIS_SYSCALL_TRAP >> 253 NETBSD_SYSCALL_TRAP BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) >> 254 BAD_TRAP(0x8d) BAD_TRAP(0x8e) BAD_TRAP(0x8f) >> 255 LINUX_SYSCALL_TRAP BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94) >> 256 BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99) >> 257 BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e) >> 258 BAD_TRAP(0x9f) GETCC_TRAP SETCC_TRAP GETPSR_TRAP >> 259 BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6) >> 260 INDIRECT_SOLARIS_SYSCALL(156) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab) >> 261 BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0) >> 262 BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5) >> 263 BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba) >> 264 BAD_TRAP(0xbb) BAD_TRAP(0xbc) BAD_TRAP(0xbd) BAD_TRAP(0xbe) BAD_TRAP(0xbf) >> 265 BAD_TRAP(0xc0) BAD_TRAP(0xc1) BAD_TRAP(0xc2) BAD_TRAP(0xc3) BAD_TRAP(0xc4) >> 266 BAD_TRAP(0xc5) BAD_TRAP(0xc6) BAD_TRAP(0xc7) BAD_TRAP(0xc8) BAD_TRAP(0xc9) >> 267 BAD_TRAP(0xca) BAD_TRAP(0xcb) BAD_TRAP(0xcc) BAD_TRAP(0xcd) BAD_TRAP(0xce) >> 268 BAD_TRAP(0xcf) BAD_TRAP(0xd0) BAD_TRAP(0xd1) BAD_TRAP(0xd2) BAD_TRAP(0xd3) >> 269 BAD_TRAP(0xd4) BAD_TRAP(0xd5) BAD_TRAP(0xd6) BAD_TRAP(0xd7) BAD_TRAP(0xd8) >> 270 BAD_TRAP(0xd9) BAD_TRAP(0xda) BAD_TRAP(0xdb) BAD_TRAP(0xdc) BAD_TRAP(0xdd) >> 271 BAD_TRAP(0xde) BAD_TRAP(0xdf) BAD_TRAP(0xe0) BAD_TRAP(0xe1) BAD_TRAP(0xe2) >> 272 BAD_TRAP(0xe3) BAD_TRAP(0xe4) BAD_TRAP(0xe5) BAD_TRAP(0xe6) BAD_TRAP(0xe7) >> 273 BAD_TRAP(0xe8) BAD_TRAP(0xe9) BAD_TRAP(0xea) BAD_TRAP(0xeb) BAD_TRAP(0xec) >> 274 BAD_TRAP(0xed) BAD_TRAP(0xee) BAD_TRAP(0xef) BAD_TRAP(0xf0) BAD_TRAP(0xf1) >> 275 BAD_TRAP(0xf2) BAD_TRAP(0xf3) BAD_TRAP(0xf4) BAD_TRAP(0xf5) BAD_TRAP(0xf6) >> 276 BAD_TRAP(0xf7) BAD_TRAP(0xf8) BAD_TRAP(0xf9) BAD_TRAP(0xfa) BAD_TRAP(0xfb) >> 277 BAD_TRAP(0xfc) BAD_TRAP(0xfd) BAD_TRAP(0xfe) BAD_TRAP(0xff) >> 278 >> 279 C_LABEL(trapbase_cpu2): >> 280 BAD_TRAP(0x0) SRMMU_TFAULT TRAP_ENTRY(0x2, bad_instruction) >> 281 TRAP_ENTRY(0x3, priv_instruction) TRAP_ENTRY(0x4, fpd_trap_handler) >> 282 WINDOW_SPILL WINDOW_FILL TRAP_ENTRY(0x7, mna_handler) >> 283 TRAP_ENTRY(0x8, fpe_trap_handler) SRMMU_DFAULT >> 284 TRAP_ENTRY(0xa, do_tag_overflow) TRAP_ENTRY(0xb, do_watchpoint) >> 285 BAD_TRAP(0xc) BAD_TRAP(0xd) BAD_TRAP(0xe) BAD_TRAP(0xf) BAD_TRAP(0x10) >> 286 TRAP_ENTRY_INTERRUPT(1) TRAP_ENTRY_INTERRUPT(2) >> 287 TRAP_ENTRY_INTERRUPT(3) TRAP_ENTRY_INTERRUPT(4) >> 288 TRAP_ENTRY_INTERRUPT(5) TRAP_ENTRY_INTERRUPT(6) >> 289 TRAP_ENTRY_INTERRUPT(7) TRAP_ENTRY_INTERRUPT(8) >> 290 TRAP_ENTRY_INTERRUPT(9) TRAP_ENTRY_INTERRUPT(10) >> 291 TRAP_ENTRY_INTERRUPT(11) TRAP_ENTRY_INTERRUPT(12) >> 292 TRAP_ENTRY_INTERRUPT(13) TRAP_ENTRY_INTERRUPT(14) >> 293 TRAP_ENTRY(0x1f, linux_trap_ipi15_sun4m) >> 294 TRAP_ENTRY(0x20, do_reg_access) BAD_TRAP(0x21) BAD_TRAP(0x22) >> 295 BAD_TRAP(0x23) TRAP_ENTRY(0x24, do_cp_disabled) SKIP_TRAP(0x25, unimp_flush) >> 296 BAD_TRAP(0x26) BAD_TRAP(0x27) TRAP_ENTRY(0x28, do_cp_exception) >> 297 SRMMU_DFAULT TRAP_ENTRY(0x2a, do_hw_divzero) BAD_TRAP(0x2b) BAD_TRAP(0x2c) >> 298 BAD_TRAP(0x2d) BAD_TRAP(0x2e) BAD_TRAP(0x2f) BAD_TRAP(0x30) BAD_TRAP(0x31) >> 299 BAD_TRAP(0x32) BAD_TRAP(0x33) BAD_TRAP(0x34) BAD_TRAP(0x35) BAD_TRAP(0x36) >> 300 BAD_TRAP(0x37) BAD_TRAP(0x38) BAD_TRAP(0x39) BAD_TRAP(0x3a) BAD_TRAP(0x3b) >> 301 BAD_TRAP(0x3c) BAD_TRAP(0x3d) BAD_TRAP(0x3e) BAD_TRAP(0x3f) BAD_TRAP(0x40) >> 302 BAD_TRAP(0x41) BAD_TRAP(0x42) BAD_TRAP(0x43) BAD_TRAP(0x44) BAD_TRAP(0x45) >> 303 BAD_TRAP(0x46) BAD_TRAP(0x47) BAD_TRAP(0x48) BAD_TRAP(0x49) BAD_TRAP(0x4a) >> 304 BAD_TRAP(0x4b) BAD_TRAP(0x4c) BAD_TRAP(0x4d) BAD_TRAP(0x4e) BAD_TRAP(0x4f) >> 305 BAD_TRAP(0x50) >> 306 BAD_TRAP(0x51) BAD_TRAP(0x52) BAD_TRAP(0x53) BAD_TRAP(0x54) BAD_TRAP(0x55) >> 307 BAD_TRAP(0x56) BAD_TRAP(0x57) BAD_TRAP(0x58) BAD_TRAP(0x59) BAD_TRAP(0x5a) >> 308 BAD_TRAP(0x5b) BAD_TRAP(0x5c) BAD_TRAP(0x5d) BAD_TRAP(0x5e) BAD_TRAP(0x5f) >> 309 BAD_TRAP(0x60) BAD_TRAP(0x61) BAD_TRAP(0x62) BAD_TRAP(0x63) BAD_TRAP(0x64) >> 310 BAD_TRAP(0x65) BAD_TRAP(0x66) BAD_TRAP(0x67) BAD_TRAP(0x68) BAD_TRAP(0x69) >> 311 BAD_TRAP(0x6a) BAD_TRAP(0x6b) BAD_TRAP(0x6c) BAD_TRAP(0x6d) BAD_TRAP(0x6e) >> 312 BAD_TRAP(0x6f) BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x73) >> 313 BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) >> 314 BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) >> 315 BAD_TRAP(0x7e) BAD_TRAP(0x7f) >> 316 SUNOS_SYSCALL_TRAP >> 317 BREAKPOINT_TRAP >> 318 TRAP_ENTRY(0x82, do_hw_divzero) >> 319 TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85) >> 320 BAD_TRAP(0x86) BAD_TRAP(0x87) SOLARIS_SYSCALL_TRAP >> 321 NETBSD_SYSCALL_TRAP BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) >> 322 BAD_TRAP(0x8d) BAD_TRAP(0x8e) BAD_TRAP(0x8f) >> 323 LINUX_SYSCALL_TRAP BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94) >> 324 BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99) >> 325 BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e) >> 326 BAD_TRAP(0x9f) GETCC_TRAP SETCC_TRAP GETPSR_TRAP >> 327 BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6) >> 328 INDIRECT_SOLARIS_SYSCALL(156) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab) >> 329 BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0) >> 330 BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5) >> 331 BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba) >> 332 BAD_TRAP(0xbb) BAD_TRAP(0xbc) BAD_TRAP(0xbd) BAD_TRAP(0xbe) BAD_TRAP(0xbf) >> 333 BAD_TRAP(0xc0) BAD_TRAP(0xc1) BAD_TRAP(0xc2) BAD_TRAP(0xc3) BAD_TRAP(0xc4) >> 334 BAD_TRAP(0xc5) BAD_TRAP(0xc6) BAD_TRAP(0xc7) BAD_TRAP(0xc8) BAD_TRAP(0xc9) >> 335 BAD_TRAP(0xca) BAD_TRAP(0xcb) BAD_TRAP(0xcc) BAD_TRAP(0xcd) BAD_TRAP(0xce) >> 336 BAD_TRAP(0xcf) BAD_TRAP(0xd0) BAD_TRAP(0xd1) BAD_TRAP(0xd2) BAD_TRAP(0xd3) >> 337 BAD_TRAP(0xd4) BAD_TRAP(0xd5) BAD_TRAP(0xd6) BAD_TRAP(0xd7) BAD_TRAP(0xd8) >> 338 BAD_TRAP(0xd9) BAD_TRAP(0xda) BAD_TRAP(0xdb) BAD_TRAP(0xdc) BAD_TRAP(0xdd) >> 339 BAD_TRAP(0xde) BAD_TRAP(0xdf) BAD_TRAP(0xe0) BAD_TRAP(0xe1) BAD_TRAP(0xe2) >> 340 BAD_TRAP(0xe3) BAD_TRAP(0xe4) BAD_TRAP(0xe5) BAD_TRAP(0xe6) BAD_TRAP(0xe7) >> 341 BAD_TRAP(0xe8) BAD_TRAP(0xe9) BAD_TRAP(0xea) BAD_TRAP(0xeb) BAD_TRAP(0xec) >> 342 BAD_TRAP(0xed) BAD_TRAP(0xee) BAD_TRAP(0xef) BAD_TRAP(0xf0) BAD_TRAP(0xf1) >> 343 BAD_TRAP(0xf2) BAD_TRAP(0xf3) BAD_TRAP(0xf4) BAD_TRAP(0xf5) BAD_TRAP(0xf6) >> 344 BAD_TRAP(0xf7) BAD_TRAP(0xf8) BAD_TRAP(0xf9) BAD_TRAP(0xfa) BAD_TRAP(0xfb) >> 345 BAD_TRAP(0xfc) BAD_TRAP(0xfd) BAD_TRAP(0xfe) BAD_TRAP(0xff) >> 346 >> 347 C_LABEL(trapbase_cpu3): >> 348 BAD_TRAP(0x0) SRMMU_TFAULT TRAP_ENTRY(0x2, bad_instruction) >> 349 TRAP_ENTRY(0x3, priv_instruction) TRAP_ENTRY(0x4, fpd_trap_handler) >> 350 WINDOW_SPILL WINDOW_FILL TRAP_ENTRY(0x7, mna_handler) >> 351 TRAP_ENTRY(0x8, fpe_trap_handler) SRMMU_DFAULT >> 352 TRAP_ENTRY(0xa, do_tag_overflow) TRAP_ENTRY(0xb, do_watchpoint) >> 353 BAD_TRAP(0xc) BAD_TRAP(0xd) BAD_TRAP(0xe) BAD_TRAP(0xf) BAD_TRAP(0x10) >> 354 TRAP_ENTRY_INTERRUPT(1) TRAP_ENTRY_INTERRUPT(2) >> 355 TRAP_ENTRY_INTERRUPT(3) TRAP_ENTRY_INTERRUPT(4) >> 356 TRAP_ENTRY_INTERRUPT(5) TRAP_ENTRY_INTERRUPT(6) >> 357 TRAP_ENTRY_INTERRUPT(7) TRAP_ENTRY_INTERRUPT(8) >> 358 TRAP_ENTRY_INTERRUPT(9) TRAP_ENTRY_INTERRUPT(10) >> 359 TRAP_ENTRY_INTERRUPT(11) TRAP_ENTRY_INTERRUPT(12) >> 360 TRAP_ENTRY_INTERRUPT(13) TRAP_ENTRY_INTERRUPT(14) >> 361 TRAP_ENTRY(0x1f, linux_trap_ipi15_sun4m) >> 362 TRAP_ENTRY(0x20, do_reg_access) BAD_TRAP(0x21) BAD_TRAP(0x22) >> 363 BAD_TRAP(0x23) TRAP_ENTRY(0x24, do_cp_disabled) SKIP_TRAP(0x25, unimp_flush) >> 364 BAD_TRAP(0x26) BAD_TRAP(0x27) TRAP_ENTRY(0x28, do_cp_exception) >> 365 SRMMU_DFAULT TRAP_ENTRY(0x2a, do_hw_divzero) BAD_TRAP(0x2b) BAD_TRAP(0x2c) >> 366 BAD_TRAP(0x2d) BAD_TRAP(0x2e) BAD_TRAP(0x2f) BAD_TRAP(0x30) BAD_TRAP(0x31) >> 367 BAD_TRAP(0x32) BAD_TRAP(0x33) BAD_TRAP(0x34) BAD_TRAP(0x35) BAD_TRAP(0x36) >> 368 BAD_TRAP(0x37) BAD_TRAP(0x38) BAD_TRAP(0x39) BAD_TRAP(0x3a) BAD_TRAP(0x3b) >> 369 BAD_TRAP(0x3c) BAD_TRAP(0x3d) BAD_TRAP(0x3e) BAD_TRAP(0x3f) BAD_TRAP(0x40) >> 370 BAD_TRAP(0x41) BAD_TRAP(0x42) BAD_TRAP(0x43) BAD_TRAP(0x44) BAD_TRAP(0x45) >> 371 BAD_TRAP(0x46) BAD_TRAP(0x47) BAD_TRAP(0x48) BAD_TRAP(0x49) BAD_TRAP(0x4a) >> 372 BAD_TRAP(0x4b) BAD_TRAP(0x4c) BAD_TRAP(0x4d) BAD_TRAP(0x4e) BAD_TRAP(0x4f) >> 373 BAD_TRAP(0x50) >> 374 BAD_TRAP(0x51) BAD_TRAP(0x52) BAD_TRAP(0x53) BAD_TRAP(0x54) BAD_TRAP(0x55) >> 375 BAD_TRAP(0x56) BAD_TRAP(0x57) BAD_TRAP(0x58) BAD_TRAP(0x59) BAD_TRAP(0x5a) >> 376 BAD_TRAP(0x5b) BAD_TRAP(0x5c) BAD_TRAP(0x5d) BAD_TRAP(0x5e) BAD_TRAP(0x5f) >> 377 BAD_TRAP(0x60) BAD_TRAP(0x61) BAD_TRAP(0x62) BAD_TRAP(0x63) BAD_TRAP(0x64) >> 378 BAD_TRAP(0x65) BAD_TRAP(0x66) BAD_TRAP(0x67) BAD_TRAP(0x68) BAD_TRAP(0x69) >> 379 BAD_TRAP(0x6a) BAD_TRAP(0x6b) BAD_TRAP(0x6c) BAD_TRAP(0x6d) BAD_TRAP(0x6e) >> 380 BAD_TRAP(0x6f) BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x73) >> 381 BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) >> 382 BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) >> 383 BAD_TRAP(0x7e) BAD_TRAP(0x7f) >> 384 SUNOS_SYSCALL_TRAP >> 385 BREAKPOINT_TRAP >> 386 TRAP_ENTRY(0x82, do_hw_divzero) >> 387 TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85) >> 388 BAD_TRAP(0x86) BAD_TRAP(0x87) SOLARIS_SYSCALL_TRAP >> 389 NETBSD_SYSCALL_TRAP BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) >> 390 BAD_TRAP(0x8d) BAD_TRAP(0x8e) BAD_TRAP(0x8f) >> 391 LINUX_SYSCALL_TRAP BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94) >> 392 BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99) >> 393 BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e) >> 394 BAD_TRAP(0x9f) GETCC_TRAP SETCC_TRAP GETPSR_TRAP >> 395 BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6) >> 396 INDIRECT_SOLARIS_SYSCALL(156) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab) >> 397 BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0) >> 398 BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5) >> 399 BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba) >> 400 BAD_TRAP(0xbb) BAD_TRAP(0xbc) BAD_TRAP(0xbd) BAD_TRAP(0xbe) BAD_TRAP(0xbf) >> 401 BAD_TRAP(0xc0) BAD_TRAP(0xc1) BAD_TRAP(0xc2) BAD_TRAP(0xc3) BAD_TRAP(0xc4) >> 402 BAD_TRAP(0xc5) BAD_TRAP(0xc6) BAD_TRAP(0xc7) BAD_TRAP(0xc8) BAD_TRAP(0xc9) >> 403 BAD_TRAP(0xca) BAD_TRAP(0xcb) BAD_TRAP(0xcc) BAD_TRAP(0xcd) BAD_TRAP(0xce) >> 404 BAD_TRAP(0xcf) BAD_TRAP(0xd0) BAD_TRAP(0xd1) BAD_TRAP(0xd2) BAD_TRAP(0xd3) >> 405 BAD_TRAP(0xd4) BAD_TRAP(0xd5) BAD_TRAP(0xd6) BAD_TRAP(0xd7) BAD_TRAP(0xd8) >> 406 BAD_TRAP(0xd9) BAD_TRAP(0xda) BAD_TRAP(0xdb) BAD_TRAP(0xdc) BAD_TRAP(0xdd) >> 407 BAD_TRAP(0xde) BAD_TRAP(0xdf) BAD_TRAP(0xe0) BAD_TRAP(0xe1) BAD_TRAP(0xe2) >> 408 BAD_TRAP(0xe3) BAD_TRAP(0xe4) BAD_TRAP(0xe5) BAD_TRAP(0xe6) BAD_TRAP(0xe7) >> 409 BAD_TRAP(0xe8) BAD_TRAP(0xe9) BAD_TRAP(0xea) BAD_TRAP(0xeb) BAD_TRAP(0xec) >> 410 BAD_TRAP(0xed) BAD_TRAP(0xee) BAD_TRAP(0xef) BAD_TRAP(0xf0) BAD_TRAP(0xf1) >> 411 BAD_TRAP(0xf2) BAD_TRAP(0xf3) BAD_TRAP(0xf4) BAD_TRAP(0xf5) BAD_TRAP(0xf6) >> 412 BAD_TRAP(0xf7) BAD_TRAP(0xf8) BAD_TRAP(0xf9) BAD_TRAP(0xfa) BAD_TRAP(0xfb) >> 413 BAD_TRAP(0xfc) BAD_TRAP(0xfd) BAD_TRAP(0xfe) BAD_TRAP(0xff) >> 414 >> 415 #endif >> 416 .align PAGE_SIZE >> 417 >> 418 /* This was the only reasonable way I could think of to properly align >> 419 * these page-table data structures. >> 420 */ >> 421 .globl C_LABEL(pg0), C_LABEL(pg1), C_LABEL(pg2), C_LABEL(pg3) >> 422 .globl C_LABEL(empty_bad_page) >> 423 .globl C_LABEL(empty_bad_page_table) >> 424 .globl C_LABEL(empty_zero_page) >> 425 .globl C_LABEL(swapper_pg_dir) >> 426 C_LABEL(swapper_pg_dir): .skip PAGE_SIZE >> 427 C_LABEL(pg0): .skip PAGE_SIZE >> 428 C_LABEL(pg1): .skip PAGE_SIZE >> 429 C_LABEL(pg2): .skip PAGE_SIZE >> 430 C_LABEL(pg3): .skip PAGE_SIZE >> 431 C_LABEL(empty_bad_page): .skip PAGE_SIZE >> 432 C_LABEL(empty_bad_page_table): .skip PAGE_SIZE >> 433 C_LABEL(empty_zero_page): .skip PAGE_SIZE >> 434 >> 435 .global C_LABEL(root_flags) >> 436 .global C_LABEL(ram_flags) >> 437 .global C_LABEL(root_dev) >> 438 .global C_LABEL(sparc_ramdisk_image) >> 439 .global C_LABEL(sparc_ramdisk_size) >> 440 >> 441 /* This stuff has to be in sync with SILO and other potential boot loaders >> 442 * Fields should be kept upward compatible and whenever any change is made, >> 443 * HdrS version should be incremented. >> 444 */ >> 445 .ascii "HdrS" >> 446 .word LINUX_VERSION_CODE >> 447 .half 0x0203 /* HdrS version */ >> 448 C_LABEL(root_flags): >> 449 .half 1 >> 450 C_LABEL(root_dev): >> 451 .half 0 >> 452 C_LABEL(ram_flags): >> 453 .half 0 >> 454 C_LABEL(sparc_ramdisk_image): >> 455 .word 0 >> 456 C_LABEL(sparc_ramdisk_size): >> 457 .word 0 >> 458 .word C_LABEL(reboot_command) >> 459 .word 0, 0, 0 >> 460 .word _end >> 461 >> 462 /* Cool, here we go. Pick up the romvec pointer in %o0 and stash it in >> 463 * %g7 and at prom_vector_p. And also quickly check whether we are on >> 464 * a v0, v2, or v3 prom. >> 465 */ >> 466 gokernel: >> 467 /* Ok, it's nice to know, as early as possible, if we >> 468 * are already mapped where we expect to be in virtual >> 469 * memory. The Solaris /boot elf format bootloader >> 470 * will peek into our elf header and load us where >> 471 * we want to be, otherwise we have to re-map. >> 472 * >> 473 * Some boot loaders don't place the jmp'rs address >> 474 * in %o7, so we do a pc-relative call to a local >> 475 * label, then see what %o7 has. >> 476 */ >> 477 >> 478 mov %o7, %g4 ! Save %o7 >> 479 >> 480 /* Jump to it, and pray... */ >> 481 current_pc: >> 482 call 1f >> 483 nop >> 484 >> 485 1: >> 486 mov %o7, %g3 >> 487 >> 488 tst %o0 >> 489 be no_sun4u_here >> 490 mov %g4, %o7 /* Previous %o7. */ >> 491 >> 492 mov %o0, %l0 ! stash away romvec >> 493 mov %o0, %g7 ! put it here too >> 494 mov %o1, %l1 ! stash away debug_vec too >> 495 >> 496 /* Ok, let's check out our run time program counter. */ >> 497 set current_pc, %g5 >> 498 cmp %g3, %g5 >> 499 be already_mapped >> 500 nop >> 501 >> 502 /* %l6 will hold the offset we have to subtract >> 503 * from absolute symbols in order to access areas >> 504 * in our own image. If already mapped this is >> 505 * just plain zero, else it is KERNBASE. >> 506 */ >> 507 set KERNBASE, %l6 >> 508 b copy_prom_lvl14 >> 509 nop >> 510 >> 511 already_mapped: >> 512 mov 0, %l6 >> 513 >> 514 /* Copy over the Prom's level 14 clock handler. */ >> 515 copy_prom_lvl14: >> 516 #if 1 >> 517 /* DJHR >> 518 * preserve our linked/calculated instructions >> 519 */ >> 520 set C_LABEL(lvl14_save), %g1 >> 521 set t_irq14, %g3 >> 522 sub %g1, %l6, %g1 ! translate to physical >> 523 sub %g3, %l6, %g3 ! translate to physical >> 524 ldd [%g3], %g4 >> 525 std %g4, [%g1] >> 526 ldd [%g3+8], %g4 >> 527 std %g4, [%g1+8] >> 528 #endif >> 529 rd %tbr, %g1 >> 530 andn %g1, 0xfff, %g1 ! proms trap table base >> 531 or %g0, (0x1e<<4), %g2 ! offset to lvl14 intr >> 532 or %g1, %g2, %g2 >> 533 set t_irq14, %g3 >> 534 sub %g3, %l6, %g3 >> 535 ldd [%g2], %g4 >> 536 std %g4, [%g3] >> 537 ldd [%g2 + 0x8], %g4 >> 538 std %g4, [%g3 + 0x8] ! Copy proms handler >> 539 >> 540 /* Must determine whether we are on a sun4c MMU, SRMMU, or SUN4/400 MUTANT >> 541 * MMU so we can remap ourselves properly. DON'T TOUCH %l0 thru %l5 in these >> 542 * remapping routines, we need their values afterwards! >> 543 */ >> 544 /* Now check whether we are already mapped, if we >> 545 * are we can skip all this garbage coming up. >> 546 */ >> 547 copy_prom_done: >> 548 cmp %l6, 0 >> 549 be go_to_highmem ! this will be a nop then >> 550 nop >> 551 >> 552 set LOAD_ADDR, %g6 >> 553 cmp %g7, %g6 >> 554 bne remap_not_a_sun4 ! This is not a Sun4 >> 555 nop >> 556 >> 557 or %g0, 0x1, %g1 >> 558 lduba [%g1] ASI_CONTROL, %g1 ! Only safe to try on Sun4. >> 559 subcc %g1, 0x24, %g0 ! Is this a mutant Sun4/400??? >> 560 be sun4_mutant_remap ! Ugh, it is... >> 561 nop >> 562 >> 563 b sun4_normal_remap ! regular sun4, 2 level mmu >> 564 nop >> 565 >> 566 remap_not_a_sun4: >> 567 lda [%g0] ASI_M_MMUREGS, %g1 ! same as ASI_PTE on sun4c >> 568 and %g1, 0x1, %g1 ! Test SRMMU Enable bit ;-) >> 569 cmp %g1, 0x0 >> 570 be sun4c_remap ! A sun4c MMU or normal Sun4 >> 571 nop >> 572 srmmu_remap: >> 573 /* First, check for a viking (TI) module. */ >> 574 set 0x40000000, %g2 >> 575 rd %psr, %g3 >> 576 and %g2, %g3, %g3 >> 577 subcc %g3, 0x0, %g0 >> 578 bz srmmu_nviking >> 579 nop >> 580 >> 581 /* Figure out what kind of viking we are on. >> 582 * We need to know if we have to play with the >> 583 * AC bit and disable traps or not. >> 584 */ >> 585 >> 586 /* I've only seen MicroSparc's on SparcClassics with this >> 587 * bit set. >> 588 */ >> 589 set 0x800, %g2 >> 590 lda [%g0] ASI_M_MMUREGS, %g3 ! peek in the control reg >> 591 and %g2, %g3, %g3 >> 592 subcc %g3, 0x0, %g0 >> 593 bnz srmmu_nviking ! is in mbus mode >> 594 nop >> 595 >> 596 rd %psr, %g3 ! DO NOT TOUCH %g3 >> 597 andn %g3, PSR_ET, %g2 >> 598 wr %g2, 0x0, %psr >> 599 WRITE_PAUSE >> 600 >> 601 /* Get context table pointer, then convert to >> 602 * a physical address, which is 36 bits. >> 603 */ >> 604 set AC_M_CTPR, %g4 >> 605 lda [%g4] ASI_M_MMUREGS, %g4 >> 606 sll %g4, 0x4, %g4 ! We use this below >> 607 ! DO NOT TOUCH %g4 >> 608 >> 609 /* Set the AC bit in the Viking's MMU control reg. */ >> 610 lda [%g0] ASI_M_MMUREGS, %g5 ! DO NOT TOUCH %g5 >> 611 set 0x8000, %g6 ! AC bit mask >> 612 or %g5, %g6, %g6 ! Or it in... >> 613 sta %g6, [%g0] ASI_M_MMUREGS ! Close your eyes... >> 614 >> 615 /* Grrr, why does it seem like every other load/store >> 616 * on the sun4m is in some ASI space... >> 617 * Fine with me, let's get the pointer to the level 1 >> 618 * page table directory and fetch its entry. >> 619 */ >> 620 lda [%g4] ASI_M_BYPASS, %o1 ! This is a level 1 ptr >> 621 srl %o1, 0x4, %o1 ! Clear low 4 bits >> 622 sll %o1, 0x8, %o1 ! Make physical >> 623 >> 624 /* Ok, pull in the PTD. */ >> 625 lda [%o1] ASI_M_BYPASS, %o2 ! This is the 0x0 16MB pgd >> 626 >> 627 /* Calculate to KERNBASE entry. */ >> 628 add %o1, KERNBASE >> (SRMMU_PGDIR_SHIFT - 2), %o3 >> 629 >> 630 /* Poke the entry into the calculated address. */ >> 631 sta %o2, [%o3] ASI_M_BYPASS >> 632 >> 633 /* I don't get it Sun, if you engineered all these >> 634 * boot loaders and the PROM (thank you for the debugging >> 635 * features btw) why did you not have them load kernel >> 636 * images up in high address space, since this is necessary >> 637 * for ABI compliance anyways? Does this low-mapping provide >> 638 * enhanced interoperability? >> 639 * >> 640 * "The PROM is the computer." >> 641 */ >> 642 >> 643 /* Ok, restore the MMU control register we saved in %g5 */ >> 644 sta %g5, [%g0] ASI_M_MMUREGS ! POW... ouch >> 645 >> 646 /* Turn traps back on. We saved it in %g3 earlier. */ >> 647 wr %g3, 0x0, %psr ! tick tock, tick tock >> 648 >> 649 /* Now we burn precious CPU cycles due to bad engineering. */ >> 650 WRITE_PAUSE >> 651 >> 652 /* Wow, all that just to move a 32-bit value from one >> 653 * place to another... Jump to high memory. >> 654 */ >> 655 b go_to_highmem >> 656 nop >> 657 >> 658 /* This works on viking's in Mbus mode and all >> 659 * other MBUS modules. It is virtually the same as >> 660 * the above madness sans turning traps off and flipping >> 661 * the AC bit. >> 662 */ >> 663 srmmu_nviking: >> 664 set AC_M_CTPR, %g1 >> 665 lda [%g1] ASI_M_MMUREGS, %g1 ! get ctx table ptr >> 666 sll %g1, 0x4, %g1 ! make physical addr >> 667 lda [%g1] ASI_M_BYPASS, %g1 ! ptr to level 1 pg_table >> 668 srl %g1, 0x4, %g1 >> 669 sll %g1, 0x8, %g1 ! make phys addr for l1 tbl >> 670 >> 671 lda [%g1] ASI_M_BYPASS, %g2 ! get level1 entry for 0x0 >> 672 add %g1, KERNBASE >> (SRMMU_PGDIR_SHIFT - 2), %g3 >> 673 sta %g2, [%g3] ASI_M_BYPASS ! place at KERNBASE entry >> 674 b go_to_highmem >> 675 nop ! wheee.... >> 676 >> 677 /* This remaps the kernel on Sun4/4xx machines >> 678 * that have the Sun Mutant Three Level MMU. >> 679 * It's like a platypus, Sun didn't have the >> 680 * SRMMU in conception so they kludged the three >> 681 * level logic in the regular Sun4 MMU probably. >> 682 * >> 683 * Basically, you take each entry in the top level >> 684 * directory that maps the low 3MB starting at >> 685 * address zero and put the mapping in the KERNBASE >> 686 * slots. These top level pgd's are called regmaps. >> 687 */ >> 688 sun4_mutant_remap: >> 689 or %g0, %g0, %g3 ! source base >> 690 sethi %hi(KERNBASE), %g4 ! destination base >> 691 or %g4, %lo(KERNBASE), %g4 >> 692 sethi %hi(0x300000), %g5 >> 693 or %g5, %lo(0x300000), %g5 ! upper bound 3MB >> 694 or %g0, 0x1, %l6 >> 695 sll %l6, 24, %l6 ! Regmap mapping size >> 696 add %g3, 0x2, %g3 ! Base magic >> 697 add %g4, 0x2, %g4 ! Base magic >> 698 >> 699 /* Main remapping loop on Sun4-Mutant-MMU. >> 700 * "I am not an animal..." -Famous Mutant Person >> 701 */ >> 702 sun4_mutant_loop: >> 703 lduha [%g3] ASI_REGMAP, %g2 ! Get lower entry >> 704 stha %g2, [%g4] ASI_REGMAP ! Store in high entry >> 705 add %g4, %l6, %g4 ! Move up high memory ptr >> 706 subcc %g3, %g5, %g0 ! Reached our limit? >> 707 blu sun4_mutant_loop ! Nope, loop again >> 708 add %g3, %l6, %g3 ! delay, Move up low ptr >> 709 b go_to_highmem ! Jump to high memory. >> 710 nop >> 711 >> 712 /* The following is for non-4/4xx sun4 MMU's. */ >> 713 sun4_normal_remap: >> 714 mov 0, %g3 ! source base >> 715 set KERNBASE, %g4 ! destination base >> 716 set 0x300000, %g5 ! upper bound 3MB >> 717 mov 1, %l6 >> 718 sll %l6, 18, %l6 ! sun4 mmu segmap size >> 719 sun4_normal_loop: >> 720 lduha [%g3] ASI_SEGMAP, %g6 ! load phys_seg >> 721 stha %g6, [%g4] ASI_SEGMAP ! stort new virt mapping >> 722 add %g3, %l6, %g3 ! increment source pointer >> 723 subcc %g3, %g5, %g0 ! reached limit? >> 724 blu sun4_normal_loop ! nope, loop again >> 725 add %g4, %l6, %g4 ! delay, increment dest ptr >> 726 b go_to_highmem >> 727 nop >> 728 >> 729 /* The following works for Sun4c MMU's */ >> 730 sun4c_remap: >> 731 mov 0, %g3 ! source base >> 732 set KERNBASE, %g4 ! destination base >> 733 set 0x300000, %g5 ! upper bound 3MB >> 734 mov 1, %l6 >> 735 sll %l6, 18, %l6 ! sun4c mmu segmap size >> 736 sun4c_remap_loop: >> 737 lda [%g3] ASI_SEGMAP, %g6 ! load phys_seg >> 738 sta %g6, [%g4] ASI_SEGMAP ! store new virt mapping >> 739 add %g3, %l6, %g3 ! Increment source ptr >> 740 subcc %g3, %g5, %g0 ! Reached limit? >> 741 bl sun4c_remap_loop ! Nope, loop again >> 742 add %g4, %l6, %g4 ! delay, Increment dest ptr >> 743 >> 744 /* Now do a non-relative jump so that PC is in high-memory */ >> 745 go_to_highmem: >> 746 set execute_in_high_mem, %g1 >> 747 jmpl %g1, %g0 >> 748 nop >> 749 >> 750 /* This is to align init_thread_union properly, be careful. -DaveM */ >> 751 .align 8192 >> 752 >> 753 /* The code above should be at beginning and we have to take care about >> 754 * short jumps, as branching to .text.init section from .text is usually >> 755 * impossible */ >> 756 __INIT >> 757 /* Acquire boot time privileged register values, this will help debugging. >> 758 * I figure out and store nwindows and nwindowsm1 later on. >> 759 */ >> 760 execute_in_high_mem: >> 761 mov %l0, %o0 ! put back romvec >> 762 mov %l1, %o1 ! and debug_vec >> 763 >> 764 sethi %hi( C_LABEL(prom_vector_p) ), %g1 >> 765 st %o0, [%g1 + %lo( C_LABEL(prom_vector_p) )] >> 766 >> 767 sethi %hi( C_LABEL(linux_dbvec) ), %g1 >> 768 st %o1, [%g1 + %lo( C_LABEL(linux_dbvec) )] >> 769 >> 770 ld [%o0 + 0x4], %o3 >> 771 and %o3, 0x3, %o5 ! get the version >> 772 >> 773 cmp %o3, 0x2 ! a v2 prom? >> 774 be found_version >> 775 nop >> 776 >> 777 /* paul@sfe.com.au */ >> 778 cmp %o3, 0x3 ! a v3 prom? >> 779 be found_version >> 780 nop >> 781 >> 782 /* Old sun4's pass our load address into %o0 instead of the prom >> 783 * pointer. On sun4's you have to hard code the romvec pointer into >> 784 * your code. Sun probably still does that because they don't even >> 785 * trust their own "OpenBoot" specifications. >> 786 */ >> 787 set LOAD_ADDR, %g6 >> 788 cmp %o0, %g6 ! an old sun4? >> 789 be sun4_init >> 790 nop >> 791 >> 792 found_version: >> 793 #ifdef CONFIG_SUN4 >> 794 /* For people who try sun4 kernels, even if Configure.help advises them. */ >> 795 ld [%g7 + 0x68], %o1 >> 796 set sun4cdm_notsup, %o0 >> 797 call %o1 >> 798 nop >> 799 b halt_me >> 800 nop >> 801 #endif >> 802 /* Get the machine type via the mysterious romvec node operations. */ >> 803 >> 804 add %g7, 0x1c, %l1 >> 805 ld [%l1], %l0 >> 806 ld [%l0], %l0 >> 807 call %l0 >> 808 or %g0, %g0, %o0 ! next_node(0) = first_node >> 809 or %o0, %g0, %g6 >> 810 >> 811 sethi %hi( C_LABEL(cputypvar) ), %o1 ! First node has cpu-arch >> 812 or %o1, %lo( C_LABEL(cputypvar) ), %o1 >> 813 sethi %hi( C_LABEL(cputypval) ), %o2 ! information, the string >> 814 or %o2, %lo( C_LABEL(cputypval) ), %o2 >> 815 ld [%l1], %l0 ! 'compatibility' tells >> 816 ld [%l0 + 0xc], %l0 ! that we want 'sun4x' where >> 817 call %l0 ! x is one of '', 'c', 'm', >> 818 nop ! 'd' or 'e'. %o2 holds pointer >> 819 ! to a buf where above string >> 820 ! will get stored by the prom. >> 821 >> 822 subcc %o0, %g0, %g0 >> 823 bpos got_prop ! Got the property >> 824 nop >> 825 >> 826 or %g6, %g0, %o0 >> 827 sethi %hi( C_LABEL(cputypvar_sun4m) ), %o1 >> 828 or %o1, %lo( C_LABEL(cputypvar_sun4m) ), %o1 >> 829 sethi %hi( C_LABEL(cputypval) ), %o2 >> 830 or %o2, %lo( C_LABEL(cputypval) ), %o2 >> 831 ld [%l1], %l0 >> 832 ld [%l0 + 0xc], %l0 >> 833 call %l0 >> 834 nop >> 835 >> 836 got_prop: >> 837 set C_LABEL(cputypval), %o2 >> 838 ldub [%o2 + 0x4], %l1 >> 839 >> 840 cmp %l1, ' ' >> 841 be 1f >> 842 cmp %l1, 'c' >> 843 be 1f >> 844 cmp %l1, 'm' >> 845 be 1f >> 846 cmp %l1, 's' >> 847 be 1f >> 848 cmp %l1, 'd' >> 849 be 1f >> 850 cmp %l1, 'e' >> 851 be no_sun4e_here ! Could be a sun4e. >> 852 nop >> 853 b no_sun4u_here ! AIEEE, a V9 sun4u... Get our BIG BROTHER kernel :)) >> 854 nop >> 855 >> 856 1: set C_LABEL(cputypval), %l1 >> 857 ldub [%l1 + 0x4], %l1 >> 858 cmp %l1, 'm' ! Test for sun4d, sun4e ? >> 859 be sun4m_init >> 860 cmp %l1, 's' ! Treat sun4s as sun4m >> 861 be sun4m_init >> 862 cmp %l1, 'd' ! Let us see how the beast will die >> 863 be sun4d_init >> 864 nop >> 865 >> 866 /* Jump into mmu context zero. */ >> 867 set AC_CONTEXT, %g1 >> 868 stba %g0, [%g1] ASI_CONTROL >> 869 >> 870 b sun4c_continue_boot >> 871 nop >> 872 >> 873 /* CPUID in bootbus can be found at PA 0xff0140000 */ >> 874 #define SUN4D_BOOTBUS_CPUID 0xf0140000 >> 875 >> 876 sun4d_init: >> 877 /* Need to patch call to handler_irq */ >> 878 set C_LABEL(patch_handler_irq), %g4 >> 879 set C_LABEL(sun4d_handler_irq), %g5 >> 880 sethi %hi(0x40000000), %g3 ! call >> 881 sub %g5, %g4, %g5 >> 882 srl %g5, 2, %g5 >> 883 or %g5, %g3, %g5 >> 884 st %g5, [%g4] >> 885 >> 886 #ifdef CONFIG_SMP >> 887 /* Get our CPU id out of bootbus */ >> 888 set SUN4D_BOOTBUS_CPUID, %g3 >> 889 lduba [%g3] ASI_M_CTL, %g3 >> 890 and %g3, 0xf8, %g3 >> 891 srl %g3, 3, %g4 >> 892 sta %g4, [%g0] ASI_M_VIKING_TMP1 >> 893 sethi %hi(boot_cpu_id), %g5 >> 894 stb %g4, [%g5 + %lo(boot_cpu_id)] >> 895 sll %g4, 2, %g4 >> 896 sethi %hi(boot_cpu_id4), %g5 >> 897 stb %g4, [%g5 + %lo(boot_cpu_id4)] >> 898 #endif >> 899 >> 900 /* Fall through to sun4m_init */ >> 901 >> 902 sun4m_init: >> 903 /* XXX Fucking Cypress... */ >> 904 lda [%g0] ASI_M_MMUREGS, %g5 >> 905 srl %g5, 28, %g4 >> 906 >> 907 cmp %g4, 1 >> 908 bne 1f >> 909 srl %g5, 24, %g4 >> 910 >> 911 and %g4, 0xf, %g4 >> 912 cmp %g4, 7 /* This would be a HyperSparc. */ >> 913 >> 914 bne 2f >> 915 nop >> 916 >> 917 1: >> 918 >> 919 #define PATCH_IT(dst, src) \ >> 920 set (dst), %g5; \ >> 921 set (src), %g4; \ >> 922 ld [%g4], %g3; \ >> 923 st %g3, [%g5]; \ >> 924 ld [%g4+0x4], %g3; \ >> 925 st %g3, [%g5+0x4]; >> 926 >> 927 /* Signed multiply. */ >> 928 PATCH_IT(.mul, .mul_patch) >> 929 PATCH_IT(.mul+0x08, .mul_patch+0x08) >> 930 >> 931 /* Signed remainder. */ >> 932 PATCH_IT(.rem, .rem_patch) >> 933 PATCH_IT(.rem+0x08, .rem_patch+0x08) >> 934 PATCH_IT(.rem+0x10, .rem_patch+0x10) >> 935 PATCH_IT(.rem+0x18, .rem_patch+0x18) >> 936 PATCH_IT(.rem+0x20, .rem_patch+0x20) >> 937 PATCH_IT(.rem+0x28, .rem_patch+0x28) >> 938 >> 939 /* Signed division. */ >> 940 PATCH_IT(.div, .div_patch) >> 941 PATCH_IT(.div+0x08, .div_patch+0x08) >> 942 PATCH_IT(.div+0x10, .div_patch+0x10) >> 943 PATCH_IT(.div+0x18, .div_patch+0x18) >> 944 PATCH_IT(.div+0x20, .div_patch+0x20) >> 945 >> 946 /* Unsigned multiply. */ >> 947 PATCH_IT(.umul, .umul_patch) >> 948 PATCH_IT(.umul+0x08, .umul_patch+0x08) >> 949 >> 950 /* Unsigned remainder. */ >> 951 PATCH_IT(.urem, .urem_patch) >> 952 PATCH_IT(.urem+0x08, .urem_patch+0x08) >> 953 PATCH_IT(.urem+0x10, .urem_patch+0x10) >> 954 PATCH_IT(.urem+0x18, .urem_patch+0x18) >> 955 >> 956 /* Unsigned division. */ >> 957 PATCH_IT(.udiv, .udiv_patch) >> 958 PATCH_IT(.udiv+0x08, .udiv_patch+0x08) >> 959 PATCH_IT(.udiv+0x10, .udiv_patch+0x10) >> 960 >> 961 #undef PATCH_IT >> 962 >> 963 /* Ok, the PROM could have done funny things and apple cider could still >> 964 * be sitting in the fault status/address registers. Read them all to >> 965 * clear them so we don't get magic faults later on. 2998 */ 966 */ 2999 func_start serial_putc,%d0/%d1/%a0/%a1 !! 967 /* This sucks, apparently this makes Vikings call prom panic, will fix later */ 3000 << 3001 movel ARG1,%d0 << 3002 cmpib #'\n',%d0 << 3003 jbne 1f << 3004 << 3005 /* A little safe recursion is good fo << 3006 serial_putc #'\r' << 3007 1: << 3008 << 3009 #ifdef CONFIG_AMIGA << 3010 is_not_amiga(2f) << 3011 andw #0x00ff,%d0 << 3012 oriw #0x0100,%d0 << 3013 movel %pc@(L(custom)),%a0 << 3014 movew %d0,%a0@(CUSTOMBASE+C_SERDAT) << 3015 1: movew %a0@(CUSTOMBASE+C_SERDATR),%d << 3016 andw #0x2000,%d0 << 3017 jeq 1b << 3018 jra L(serial_putc_done) << 3019 2: 968 2: 3020 #endif !! 969 rd %psr, %o1 >> 970 srl %o1, 28, %o1 ! Get a type of the CPU 3021 971 3022 #ifdef CONFIG_MAC !! 972 subcc %o1, 4, %g0 ! TI: Viking or MicroSPARC 3023 is_not_mac(5f) !! 973 be sun4c_continue_boot 3024 #if defined(MAC_USE_SCC_A) || defined(MAC_USE !! 974 nop 3025 movel %pc@(L(mac_sccbase)),%a1 !! 975 3026 #endif !! 976 set AC_M_SFSR, %o0 3027 #ifdef MAC_USE_SCC_A !! 977 lda [%o0] ASI_M_MMUREGS, %g0 3028 3: btst #2,%a1@(mac_scc_cha_a_ctrl_of !! 978 set AC_M_SFAR, %o0 3029 jeq 3b !! 979 lda [%o0] ASI_M_MMUREGS, %g0 3030 moveb %d0,%a1@(mac_scc_cha_a_data_o !! 980 3031 #endif /* MAC_USE_SCC_A */ !! 981 /* Fujitsu MicroSPARC-II has no asynchronous flavors of FARs */ 3032 #ifdef MAC_USE_SCC_B !! 982 subcc %o1, 0, %g0 3033 4: btst #2,%a1@(mac_scc_cha_b_ctrl_of !! 983 be sun4c_continue_boot 3034 jeq 4b !! 984 nop 3035 moveb %d0,%a1@(mac_scc_cha_b_data_o !! 985 3036 #endif /* MAC_USE_SCC_B */ !! 986 set AC_M_AFSR, %o0 3037 jra L(serial_putc_done) !! 987 lda [%o0] ASI_M_MMUREGS, %g0 3038 5: !! 988 set AC_M_AFAR, %o0 3039 #endif /* CONFIG_MAC */ !! 989 lda [%o0] ASI_M_MMUREGS, %g0 3040 !! 990 nop 3041 #ifdef CONFIG_ATARI !! 991 3042 is_not_atari(4f) !! 992 3043 movel %pc@(L(iobase)),%a1 !! 993 sun4c_continue_boot: 3044 #if defined(USE_PRINTER) !! 994 3045 3: btst #0,%a1@(LSTMFP_GPIP) !! 995 3046 jne 3b !! 996 /* Aieee, now set PC and nPC, enable traps, give ourselves a stack and it's 3047 moveb #LPSG_IO_B,%a1@(LPSG_SELECT) !! 997 * show-time! 3048 moveb %d0,%a1@(LPSG_WRITE) !! 998 */ 3049 moveb #LPSG_IO_A,%a1@(LPSG_SELECT) !! 999 3050 moveb %a1@(LPSG_READ),%d0 !! 1000 sethi %hi( C_LABEL(cputyp) ), %o0 3051 bclr #5,%d0 !! 1001 st %g4, [%o0 + %lo( C_LABEL(cputyp) )] 3052 moveb %d0,%a1@(LPSG_WRITE) !! 1002 3053 nop !! 1003 /* Turn on Supervisor, EnableFloating, and all the PIL bits. 3054 nop !! 1004 * Also puts us in register window zero with traps off. 3055 bset #5,%d0 !! 1005 */ 3056 moveb %d0,%a1@(LPSG_WRITE) !! 1006 set (PSR_PS | PSR_S | PSR_PIL | PSR_EF), %g2 3057 #elif defined(USE_SCC_A) || defined(USE_SCC_B !! 1007 wr %g2, 0x0, %psr 3058 3: btst #2,%a1@(LSCC_CTRL) !! 1008 WRITE_PAUSE 3059 jeq 3b !! 1009 3060 moveb %d0,%a1@(LSCC_DATA) !! 1010 /* I want a kernel stack NOW! */ 3061 #elif defined(USE_MFP) !! 1011 set C_LABEL(init_thread_union), %g1 3062 3: btst #7,%a1@(LMFP_TSR) !! 1012 set (THREAD_SIZE - STACKFRAME_SZ), %g2 3063 jeq 3b !! 1013 add %g1, %g2, %sp 3064 moveb %d0,%a1@(LMFP_UDR) !! 1014 mov 0, %fp /* And for good luck */ 3065 #endif !! 1015 3066 jra L(serial_putc_done) !! 1016 /* Zero out our BSS section. */ 3067 4: !! 1017 set C_LABEL(__bss_start) , %o0 ! First address of BSS 3068 #endif /* CONFIG_ATARI */ !! 1018 set C_LABEL(end) , %o1 ! Last address of BSS 3069 !! 1019 add %o0, 0x1, %o0 3070 #ifdef CONFIG_MVME147 !! 1020 1: 3071 is_not_mvme147(2f) !! 1021 stb %g0, [%o0] 3072 1: btst #2,M147_SCC_CTRL_A !! 1022 subcc %o0, %o1, %g0 3073 jeq 1b !! 1023 bl 1b 3074 moveb %d0,M147_SCC_DATA_A !! 1024 add %o0, 0x1, %o0 3075 jbra L(serial_putc_done) !! 1025 3076 2: !! 1026 /* Initialize the uwinmask value for init task just in case. 3077 #endif !! 1027 * But first make current_set[boot_cpu_id] point to something useful. >> 1028 */ >> 1029 set C_LABEL(init_thread_union), %g6 >> 1030 set C_LABEL(current_set), %g2 >> 1031 #ifdef CONFIG_SMP >> 1032 sethi %hi(C_LABEL(boot_cpu_id4)), %g3 >> 1033 ldub [%g3 + %lo(C_LABEL(boot_cpu_id4))], %g3 >> 1034 st %g6, [%g2] >> 1035 add %g2, %g3, %g2 >> 1036 #endif >> 1037 st %g6, [%g2] >> 1038 >> 1039 st %g0, [%g6 + TI_UWINMASK] >> 1040 >> 1041 /* Compute NWINDOWS and stash it away. Now uses %wim trick explained >> 1042 * in the V8 manual. Ok, this method seems to work, Sparc is cool... >> 1043 * No, it doesn't work, have to play the save/readCWP/restore trick. >> 1044 */ >> 1045 >> 1046 wr %g0, 0x0, %wim ! so we do not get a trap >> 1047 WRITE_PAUSE >> 1048 >> 1049 save >> 1050 >> 1051 rd %psr, %g3 >> 1052 >> 1053 restore >> 1054 >> 1055 and %g3, 0x1f, %g3 >> 1056 add %g3, 0x1, %g3 >> 1057 >> 1058 mov 2, %g1 >> 1059 wr %g1, 0x0, %wim ! make window 1 invalid >> 1060 WRITE_PAUSE >> 1061 >> 1062 cmp %g3, 0x7 >> 1063 bne 2f >> 1064 nop >> 1065 >> 1066 /* Adjust our window handling routines to >> 1067 * do things correctly on 7 window Sparcs. >> 1068 */ >> 1069 >> 1070 #define PATCH_INSN(src, dest) \ >> 1071 set src, %g5; \ >> 1072 set dest, %g2; \ >> 1073 ld [%g5], %g4; \ >> 1074 st %g4, [%g2]; >> 1075 >> 1076 /* Patch for window spills... */ >> 1077 PATCH_INSN(spnwin_patch1_7win, spnwin_patch1) >> 1078 PATCH_INSN(spnwin_patch2_7win, spnwin_patch2) >> 1079 PATCH_INSN(spnwin_patch3_7win, spnwin_patch3) >> 1080 >> 1081 /* Patch for window fills... */ >> 1082 PATCH_INSN(fnwin_patch1_7win, fnwin_patch1) >> 1083 PATCH_INSN(fnwin_patch2_7win, fnwin_patch2) >> 1084 >> 1085 /* Patch for trap entry setup... */ >> 1086 PATCH_INSN(tsetup_7win_patch1, tsetup_patch1) >> 1087 PATCH_INSN(tsetup_7win_patch2, tsetup_patch2) >> 1088 PATCH_INSN(tsetup_7win_patch3, tsetup_patch3) >> 1089 PATCH_INSN(tsetup_7win_patch4, tsetup_patch4) >> 1090 PATCH_INSN(tsetup_7win_patch5, tsetup_patch5) >> 1091 PATCH_INSN(tsetup_7win_patch6, tsetup_patch6) >> 1092 >> 1093 /* Patch for returning from traps... */ >> 1094 PATCH_INSN(rtrap_7win_patch1, rtrap_patch1) >> 1095 PATCH_INSN(rtrap_7win_patch2, rtrap_patch2) >> 1096 PATCH_INSN(rtrap_7win_patch3, rtrap_patch3) >> 1097 PATCH_INSN(rtrap_7win_patch4, rtrap_patch4) >> 1098 PATCH_INSN(rtrap_7win_patch5, rtrap_patch5) >> 1099 >> 1100 /* Patch for killing user windows from the register file. */ >> 1101 PATCH_INSN(kuw_patch1_7win, kuw_patch1) >> 1102 >> 1103 /* Now patch the kernel window flush sequences. >> 1104 * This saves 2 traps on every switch and fork. >> 1105 */ >> 1106 set 0x01000000, %g4 >> 1107 set flush_patch_one, %g5 >> 1108 st %g4, [%g5 + 0x18] >> 1109 st %g4, [%g5 + 0x1c] >> 1110 set flush_patch_two, %g5 >> 1111 st %g4, [%g5 + 0x18] >> 1112 st %g4, [%g5 + 0x1c] >> 1113 set flush_patch_three, %g5 >> 1114 st %g4, [%g5 + 0x18] >> 1115 st %g4, [%g5 + 0x1c] >> 1116 set flush_patch_four, %g5 >> 1117 st %g4, [%g5 + 0x18] >> 1118 st %g4, [%g5 + 0x1c] >> 1119 set flush_patch_exception, %g5 >> 1120 st %g4, [%g5 + 0x18] >> 1121 st %g4, [%g5 + 0x1c] >> 1122 set flush_patch_switch, %g5 >> 1123 st %g4, [%g5 + 0x18] >> 1124 st %g4, [%g5 + 0x1c] >> 1125 >> 1126 2: >> 1127 sethi %hi( C_LABEL(nwindows) ), %g4 >> 1128 st %g3, [%g4 + %lo( C_LABEL(nwindows) )] ! store final value >> 1129 sub %g3, 0x1, %g3 >> 1130 sethi %hi( C_LABEL(nwindowsm1) ), %g4 >> 1131 st %g3, [%g4 + %lo( C_LABEL(nwindowsm1) )] >> 1132 >> 1133 /* Here we go, start using Linux's trap table... */ >> 1134 set C_LABEL(trapbase), %g3 >> 1135 wr %g3, 0x0, %tbr >> 1136 WRITE_PAUSE >> 1137 >> 1138 /* Finally, turn on traps so that we can call c-code. */ >> 1139 rd %psr, %g3 >> 1140 wr %g3, 0x0, %psr >> 1141 WRITE_PAUSE >> 1142 >> 1143 wr %g3, PSR_ET, %psr >> 1144 WRITE_PAUSE >> 1145 >> 1146 /* First we call prom_init() to set up PROMLIB, then >> 1147 * off to start_kernel(). >> 1148 */ >> 1149 >> 1150 sethi %hi( C_LABEL(prom_vector_p) ), %g5 >> 1151 ld [%g5 + %lo( C_LABEL(prom_vector_p) )], %o0 >> 1152 call C_LABEL(prom_init) >> 1153 nop >> 1154 >> 1155 call C_LABEL(start_kernel) >> 1156 nop >> 1157 >> 1158 /* We should not get here. */ >> 1159 call halt_me >> 1160 nop >> 1161 >> 1162 sun4_init: >> 1163 #ifdef CONFIG_SUN4 >> 1164 /* There, happy now Adrian? */ >> 1165 set C_LABEL(cputypval), %o2 ! Let everyone know we >> 1166 set ' ', %o0 ! are a "sun4 " architecture >> 1167 stb %o0, [%o2 + 0x4] 3078 1168 3079 #ifdef CONFIG_MVME16x !! 1169 b got_prop 3080 is_not_mvme16x(2f) !! 1170 nop 3081 /* !! 1171 #else 3082 * If the loader gave us a board type !! 1172 sethi %hi(SUN4_PROM_VECTOR+0x84), %o1 3083 * select an appropriate output routi !! 1173 ld [%o1 + %lo(SUN4_PROM_VECTOR+0x84)], %o1 3084 * the Bug code. If we have to use t !! 1174 set sun4_notsup, %o0 3085 * workspace has to be valid, which m !! 1175 call %o1 /* printf */ 3086 * the SRAM, which is non-standard. !! 1176 nop 3087 */ !! 1177 sethi %hi(SUN4_PROM_VECTOR+0xc4), %o1 3088 moveml %d0-%d7/%a2-%a6,%sp@- !! 1178 ld [%o1 + %lo(SUN4_PROM_VECTOR+0xc4)], %o1 3089 movel vme_brdtype,%d1 !! 1179 call %o1 /* exittomon */ 3090 jeq 1f | No !! 1180 nop 3091 cmpi #VME_TYPE_MVME162,%d1 !! 1181 1: ba 1b ! Cannot exit into KMON 3092 jeq 6f !! 1182 nop 3093 cmpi #VME_TYPE_MVME172,%d1 !! 1183 #endif 3094 jne 5f !! 1184 no_sun4e_here: 3095 /* 162/172; it's an SCC */ !! 1185 ld [%g7 + 0x68], %o1 3096 6: btst #2,M162_SCC_CTRL_A !! 1186 set sun4e_notsup, %o0 3097 nop !! 1187 call %o1 3098 nop !! 1188 nop 3099 nop !! 1189 b halt_me 3100 jeq 6b !! 1190 nop 3101 moveb #8,M162_SCC_CTRL_A !! 1191 3102 nop !! 1192 __INITDATA 3103 nop !! 1193 3104 nop !! 1194 sun4u_1: 3105 moveb %d0,M162_SCC_CTRL_A !! 1195 .asciz "finddevice" 3106 jra 3f !! 1196 .align 4 3107 5: !! 1197 sun4u_2: 3108 /* 166/167/177; it's a CD2401 */ !! 1198 .asciz "/chosen" 3109 moveb #0,M167_CYCAR !! 1199 .align 4 3110 moveb M167_CYIER,%d2 !! 1200 sun4u_3: 3111 moveb #0x02,M167_CYIER !! 1201 .asciz "getprop" 3112 7: !! 1202 .align 4 3113 btst #5,M167_PCSCCTICR !! 1203 sun4u_4: 3114 jeq 7b !! 1204 .asciz "stdout" 3115 moveb M167_PCTPIACKR,%d1 !! 1205 .align 4 3116 moveb M167_CYLICR,%d1 !! 1206 sun4u_5: 3117 jeq 8f !! 1207 .asciz "write" 3118 moveb #0x08,M167_CYTEOIR !! 1208 .align 4 3119 jra 7b !! 1209 sun4u_6: 3120 8: !! 1210 .asciz "\n\rOn sun4u you have to use UltraLinux (64bit) kernel\n\rand not a 32bit sun4[cdem] version\n\r\n\r" 3121 moveb %d0,M167_CYTDR !! 1211 sun4u_6e: 3122 moveb #0,M167_CYTEOIR !! 1212 .align 4 3123 moveb %d2,M167_CYIER !! 1213 sun4u_7: 3124 jra 3f !! 1214 .asciz "exit" 3125 1: !! 1215 .align 8 3126 moveb %d0,%sp@- !! 1216 sun4u_a1: 3127 trap #15 !! 1217 .word 0, sun4u_1, 0, 1, 0, 1, 0, sun4u_2, 0 3128 .word 0x0020 /* TRAP 0x020 */ !! 1218 sun4u_r1: 3129 3: !! 1219 .word 0 3130 moveml %sp@+,%d0-%d7/%a2-%a6 !! 1220 sun4u_a2: 3131 jbra L(serial_putc_done) !! 1221 .word 0, sun4u_3, 0, 4, 0, 1, 0 3132 2: !! 1222 sun4u_i2: 3133 #endif /* CONFIG_MVME16x */ !! 1223 .word 0, 0, sun4u_4, 0, sun4u_1, 0, 8, 0 3134 !! 1224 sun4u_r2: 3135 #ifdef CONFIG_BVME6000 !! 1225 .word 0 3136 is_not_bvme6000(2f) !! 1226 sun4u_a3: 3137 /* !! 1227 .word 0, sun4u_5, 0, 3, 0, 1, 0 3138 * The BVME6000 machine has a serial !! 1228 sun4u_i3: 3139 */ !! 1229 .word 0, 0, sun4u_6, 0, sun4u_6e - sun4u_6 - 1, 0 3140 1: btst #2,BVME_SCC_CTRL_A !! 1230 sun4u_r3: 3141 jeq 1b !! 1231 .word 0 3142 moveb %d0,BVME_SCC_DATA_A !! 1232 sun4u_a4: 3143 jbra L(serial_putc_done) !! 1233 .word 0, sun4u_7, 0, 0, 0, 0 3144 2: !! 1234 sun4u_r4: 3145 #endif !! 1235 3146 !! 1236 __INIT 3147 #ifdef CONFIG_SUN3X !! 1237 no_sun4u_here: 3148 is_not_sun3x(2f) !! 1238 set sun4u_a1, %o0 3149 movel %d0,-(%sp) !! 1239 set current_pc, %l2 3150 movel 0xFEFE0018,%a1 !! 1240 cmp %l2, %g3 3151 jbsr (%a1) !! 1241 be 1f 3152 addq #4,%sp !! 1242 mov %o4, %l0 3153 jbra L(serial_putc_done) !! 1243 sub %g3, %l2, %l6 3154 2: !! 1244 add %o0, %l6, %o0 3155 #endif !! 1245 mov %o0, %l4 3156 !! 1246 mov sun4u_r4 - sun4u_a1, %l3 3157 #ifdef CONFIG_Q40 !! 1247 ld [%l4], %l5 3158 is_not_q40(2f) << 3159 tst.l %pc@(L(q40_do_debug)) /* on << 3160 beq 2f << 3161 lea %pc@(q40_mem_cptr),%a1 << 3162 move.l %a1@,%a0 << 3163 move.b %d0,%a0@ << 3164 addq.l #4,%a0 << 3165 move.l %a0,%a1@ << 3166 jbra L(serial_putc_done) << 3167 2: << 3168 #endif << 3169 << 3170 #ifdef CONFIG_APOLLO << 3171 is_not_apollo(2f) << 3172 movl %pc@(L(iobase)),%a1 << 3173 moveb %d0,%a1@(LTHRB0) << 3174 1: moveb %a1@(LSRB0),%d0 << 3175 andb #0x4,%d0 << 3176 beq 1b << 3177 jbra L(serial_putc_done) << 3178 2: 1248 2: 3179 #endif !! 1249 add %l4, 4, %l4 3180 !! 1250 cmp %l5, %l2 3181 #ifdef CONFIG_HP300 !! 1251 add %l5, %l6, %l5 3182 is_not_hp300(3f) !! 1252 bgeu,a 3f 3183 movl %pc@(L(iobase)),%a1 !! 1253 st %l5, [%l4 - 4] 3184 addl %pc@(L(uartbase)),%a1 << 3185 movel %pc@(L(uart_scode)),%d1 /* Ch << 3186 jmi 3f /* Un << 3187 cmpi #256,%d1 /* AP << 3188 jeq 2f << 3189 1: moveb %a1@(DCALSR),%d1 /* Ou << 3190 andb #0x20,%d1 << 3191 beq 1b << 3192 moveb %d0,%a1@(DCADATA) << 3193 jbra L(serial_putc_done) << 3194 2: moveb %a1@(APCILSR),%d1 /* Ou << 3195 andb #0x20,%d1 << 3196 beq 2b << 3197 moveb %d0,%a1@(APCIDATA) << 3198 jbra L(serial_putc_done) << 3199 3: 1254 3: 3200 #endif !! 1255 subcc %l3, 4, %l3 3201 !! 1256 bne 2b 3202 #ifdef CONFIG_VIRT !! 1257 ld [%l4], %l5 3203 is_not_virt(1f) !! 1258 1: 3204 !! 1259 call %l0 3205 movel L(virt_gf_tty_base),%a1 !! 1260 mov %o0, %l1 3206 movel %d0,%a1@(GF_PUT_CHAR) !! 1261 3207 1: !! 1262 ld [%l1 + (sun4u_r1 - sun4u_a1)], %o1 3208 #endif !! 1263 add %l1, (sun4u_a2 - sun4u_a1), %o0 3209 !! 1264 call %l0 3210 L(serial_putc_done): !! 1265 st %o1, [%o0 + (sun4u_i2 - sun4u_a2)] 3211 func_return serial_putc !! 1266 3212 !! 1267 ld [%l1 + (sun4u_1 - sun4u_a1)], %o1 3213 /* !! 1268 add %l1, (sun4u_a3 - sun4u_a1), %o0 3214 * Output a string. !! 1269 call %l0 3215 */ !! 1270 st %o1, [%o0 + (sun4u_i3 - sun4u_a3)] 3216 func_start puts,%d0/%a0 !! 1271 >> 1272 call %l0 >> 1273 add %l1, (sun4u_a4 - sun4u_a1), %o0 >> 1274 >> 1275 /* Not reached */ >> 1276 halt_me: >> 1277 ld [%g7 + 0x74], %o0 >> 1278 call %o0 ! Get us out of here... >> 1279 nop ! Apparently Solaris is better. 3217 1280 3218 movel ARG1,%a0 !! 1281 /* Ok, now we continue in the .data/.text sections */ 3219 jra 2f << 3220 1: << 3221 #ifdef CONSOLE_DEBUG << 3222 console_putc %d0 << 3223 #endif << 3224 #ifdef SERIAL_DEBUG << 3225 serial_putc %d0 << 3226 #endif << 3227 2: moveb %a0@+,%d0 << 3228 jne 1b << 3229 << 3230 func_return puts << 3231 << 3232 /* << 3233 * Output number in hex notation. << 3234 */ << 3235 1282 3236 func_start putn,%d0-%d2 !! 1283 .data 3237 !! 1284 .align 4 3238 putc ' ' << 3239 << 3240 movel ARG1,%d0 << 3241 moveq #7,%d1 << 3242 1: roll #4,%d0 << 3243 move %d0,%d2 << 3244 andb #0x0f,%d2 << 3245 addb #'0',%d2 << 3246 cmpb #'9',%d2 << 3247 jls 2f << 3248 addb #'A'-('9'+1),%d2 << 3249 2: << 3250 #ifdef CONSOLE_DEBUG << 3251 console_putc %d2 << 3252 #endif << 3253 #ifdef SERIAL_DEBUG << 3254 serial_putc %d2 << 3255 #endif << 3256 dbra %d1,1b << 3257 << 3258 func_return putn << 3259 << 3260 #ifdef CONFIG_EARLY_PRINTK << 3261 /* << 3262 * This routine takes its parameters on << 3263 * turns around and calls the internal r << 3264 * is used by the boot console. << 3265 * << 3266 * The calling parameters are: << 3267 * void debug_cons_nputs(const c << 3268 * << 3269 * This routine does NOT understand vari << 3270 * simple strings! << 3271 */ << 3272 ENTRY(debug_cons_nputs) << 3273 moveml %d0/%d1/%a0,%sp@- << 3274 movew %sr,%sp@- << 3275 ori #0x0700,%sr << 3276 movel %sp@(18),%a0 /* fe << 3277 movel %sp@(22),%d1 /* fe << 3278 jra 2f << 3279 1: << 3280 #ifdef CONSOLE_DEBUG << 3281 console_putc %d0 << 3282 #endif << 3283 #ifdef SERIAL_DEBUG << 3284 serial_putc %d0 << 3285 #endif << 3286 subq #1,%d1 << 3287 2: jeq 3f << 3288 moveb %a0@+,%d0 << 3289 jne 1b << 3290 3: << 3291 movew %sp@+,%sr << 3292 moveml %sp@+,%d0/%d1/%a0 << 3293 rts << 3294 #endif /* CONFIG_EARLY_PRINTK */ << 3295 << 3296 #if defined(CONFIG_HP300) || defined(CONFIG_A << 3297 func_start set_leds,%d0/%a0 << 3298 movel ARG1,%d0 << 3299 #ifdef CONFIG_HP300 << 3300 is_not_hp300(1f) << 3301 movel %pc@(L(iobase)),%a0 << 3302 moveb %d0,%a0@(0x1ffff) << 3303 jra 2f << 3304 #endif << 3305 1: << 3306 #ifdef CONFIG_APOLLO << 3307 movel %pc@(L(iobase)),%a0 << 3308 lsll #8,%d0 << 3309 eorw #0xff00,%d0 << 3310 moveb %d0,%a0@(LCPUCTRL) << 3311 #endif << 3312 2: << 3313 func_return set_leds << 3314 #endif << 3315 1285 3316 #ifdef CONSOLE_DEBUG << 3317 /* 1286 /* 3318 * For continuity, see the data alignmen !! 1287 * Fill up the prom vector, note in particular the kind first element, 3319 * to which this structure is tied. !! 1288 * no joke. I don't need all of them in here as the entire prom vector >> 1289 * gets initialized in c-code so all routines can use it. 3320 */ 1290 */ 3321 #define Lconsole_struct_cur_column 0 << 3322 #define Lconsole_struct_cur_row 4 << 3323 #define Lconsole_struct_num_columns 8 << 3324 #define Lconsole_struct_num_rows 12 << 3325 #define Lconsole_struct_left_edge 16 << 3326 << 3327 func_start console_init,%a0-%a4/%d0-%d7 << 3328 /* << 3329 * Some of the register usage th << 3330 * a0 = pointer to boot_ << 3331 * a1 = pointer to scree << 3332 * a2 = pointer to conso << 3333 * d3 = pixel width of s << 3334 * d4 = pixel height of << 3335 * (d3,d4) ~= (x,y) of a << 3336 * and to the ri << 3337 * NOT on the sc << 3338 * d5 = number of bytes << 3339 * d6 = number of bytes << 3340 */ << 3341 << 3342 lea %pc@(L(console_globals)),%a2 << 3343 movel %pc@(L(mac_videobase)),%a1 << 3344 movel %pc@(L(mac_rowbytes)),%d5 << 3345 movel %pc@(L(mac_dimensions)),%d3 << 3346 movel %d3,%d4 << 3347 swap %d4 /* -> high by << 3348 andl #0xffff,%d3 /* d3 = scree << 3349 andl #0xffff,%d4 /* d4 = scree << 3350 << 3351 movel %d5,%d6 << 3352 | subl #20,%d6 << 3353 mulul %d4,%d6 /* scan line << 3354 divul #8,%d6 /* we'll clea << 3355 moveq #-1,%d0 /* Mac_black << 3356 subq #1,%d6 << 3357 << 3358 L(console_clear_loop): << 3359 movel %d0,%a1@+ << 3360 movel %d0,%a1@+ << 3361 dbra %d6,L(console_clear_loop) << 3362 << 3363 /* Calculate font size */ << 3364 << 3365 #if defined(FONT_8x8) && defined(CONFIG_FON << 3366 lea %pc@(font_vga_8x8),%a0 << 3367 #elif defined(FONT_8x16) && defined(CONFIG_FO << 3368 lea %pc@(font_vga_8x16),%a0 << 3369 #elif defined(FONT_6x11) && defined(CONFIG_FO << 3370 lea %pc@(font_vga_6x11),%a0 << 3371 #elif defined(CONFIG_FONT_8x8) /* default */ << 3372 lea %pc@(font_vga_8x8),%a0 << 3373 #else /* no compiled-in font */ << 3374 lea 0,%a0 << 3375 #endif << 3376 << 3377 /* << 3378 * At this point we make a shift << 3379 * a1 = address of console_font << 3380 */ << 3381 lea %pc@(L(console_font)),%a1 << 3382 movel %a0,%a1@ /* store poin << 3383 tstl %a0 << 3384 jeq 1f << 3385 lea %pc@(L(console_font_data)),%a << 3386 movel %a0@(FONT_DESC_DATA),%d0 << 3387 subl #L(console_font),%a1 << 3388 addl %a1,%d0 << 3389 movel %d0,%a4@ << 3390 << 3391 /* << 3392 * Calculate global maxs << 3393 * Note - we can use either an << 3394 * 8 x 16 or 8 x 8 character fon << 3395 * 6 x 11 also supported << 3396 */ << 3397 /* ASSERT: a0 = contents of L << 3398 movel %d3,%d0 << 3399 divul %a0@(FONT_DESC_WIDTH),%d0 << 3400 << 3401 movel %d4,%d1 << 3402 divul %a0@(FONT_DESC_HEIGHT),%d1 << 3403 << 3404 movel %d0,%a2@(Lconsole_struct_num_ << 3405 movel %d1,%a2@(Lconsole_struct_num_ << 3406 << 3407 /* << 3408 * Clear the current row and col << 3409 */ << 3410 clrl %a2@(Lconsole_struct_cur_colu << 3411 clrl %a2@(Lconsole_struct_cur_row) << 3412 clrl %a2@(Lconsole_struct_left_edg << 3413 << 3414 /* << 3415 * Initialization is complete << 3416 */ << 3417 1: << 3418 func_return console_init << 3419 << 3420 #ifdef CONFIG_LOGO << 3421 func_start console_put_penguin,%a0-%a1/% << 3422 /* << 3423 * Get 'that_penguin' onto the s << 3424 * penguin is 64 x 74 pixels, al << 3425 */ << 3426 lea %pc@(L(mac_dimensions)),%a0 << 3427 movel %a0@,%d0 << 3428 andil #0xffff,%d0 << 3429 subil #64,%d0 /* snug up ag << 3430 clrl %d1 /* start at t << 3431 movel #73,%d7 << 3432 lea %pc@(L(that_penguin)),%a1 << 3433 L(console_penguin_row): << 3434 movel #31,%d6 << 3435 L(console_penguin_pixel_pair): << 3436 moveb %a1@,%d2 << 3437 lsrb #4,%d2 << 3438 console_plot_pixel %d0,%d1,%d2 << 3439 addq #1,%d0 << 3440 moveb %a1@+,%d2 << 3441 console_plot_pixel %d0,%d1,%d2 << 3442 addq #1,%d0 << 3443 dbra %d6,L(console_penguin_pixel_p << 3444 << 3445 subil #64,%d0 << 3446 addq #1,%d1 << 3447 dbra %d7,L(console_penguin_row) << 3448 << 3449 func_return console_put_penguin << 3450 << 3451 /* include penguin bitmap */ << 3452 L(that_penguin): << 3453 #include "../mac/mac_penguin.S" << 3454 #endif << 3455 << 3456 /* << 3457 * Calculate source and destination a << 3458 * output a1 = dest << 3459 * a2 = source << 3460 */ << 3461 << 3462 func_start console_scroll,%a0-%a4/%d0-%d << 3463 lea %pc@(L(mac_videobase)),%a0 << 3464 movel %a0@,%a1 << 3465 movel %a1,%a2 << 3466 lea %pc@(L(mac_rowbytes)),%a0 << 3467 movel %a0@,%d5 << 3468 movel %pc@(L(console_font)),%a0 << 3469 tstl %a0 << 3470 jeq 1f << 3471 mulul %a0@(FONT_DESC_HEIGHT),%d5 << 3472 addal %d5,%a2 << 3473 << 3474 /* << 3475 * Get dimensions << 3476 */ << 3477 lea %pc@(L(mac_dimensions)),%a0 << 3478 movel %a0@,%d3 << 3479 movel %d3,%d4 << 3480 swap %d4 << 3481 andl #0xffff,%d3 /* d3 = scree << 3482 andl #0xffff,%d4 /* d4 = scree << 3483 << 3484 /* << 3485 * Calculate number of bytes to move << 3486 */ << 3487 lea %pc@(L(mac_rowbytes)),%a0 << 3488 movel %a0@,%d6 << 3489 movel %pc@(L(console_font)),%a0 << 3490 subl %a0@(FONT_DESC_HEIGHT),%d4 << 3491 mulul %d4,%d6 /* scan line << 3492 divul #32,%d6 /* we'll move << 3493 subq #1,%d6 << 3494 << 3495 L(console_scroll_loop): << 3496 movel %a2@+,%a1@+ << 3497 movel %a2@+,%a1@+ << 3498 movel %a2@+,%a1@+ << 3499 movel %a2@+,%a1@+ << 3500 movel %a2@+,%a1@+ << 3501 movel %a2@+,%a1@+ << 3502 movel %a2@+,%a1@+ << 3503 movel %a2@+,%a1@+ << 3504 dbra %d6,L(console_scroll_loop) << 3505 << 3506 lea %pc@(L(mac_rowbytes)),%a0 << 3507 movel %a0@,%d6 << 3508 movel %pc@(L(console_font)),%a0 << 3509 mulul %a0@(FONT_DESC_HEIGHT),%d6 << 3510 divul #32,%d6 /* we << 3511 subq #1,%d6 << 3512 << 3513 moveq #-1,%d0 << 3514 L(console_scroll_clear_loop): << 3515 movel %d0,%a1@+ << 3516 movel %d0,%a1@+ << 3517 movel %d0,%a1@+ << 3518 movel %d0,%a1@+ << 3519 movel %d0,%a1@+ << 3520 movel %d0,%a1@+ << 3521 movel %d0,%a1@+ << 3522 movel %d0,%a1@+ << 3523 dbra %d6,L(console_scroll_clear_lo << 3524 << 3525 1: << 3526 func_return console_scroll << 3527 << 3528 << 3529 func_start console_putc,%a0/%a1/%d0-%d7 << 3530 << 3531 is_not_mac(L(console_exit)) << 3532 tstl %pc@(L(console_font)) << 3533 jeq L(console_exit) << 3534 << 3535 /* Output character in d7 on console. << 3536 */ << 3537 movel ARG1,%d7 << 3538 cmpib #'\n',%d7 << 3539 jbne 1f << 3540 << 3541 /* A little safe recursion is good fo << 3542 console_putc #'\r' << 3543 1: << 3544 lea %pc@(L(console_globals)),%a0 << 3545 << 3546 cmpib #10,%d7 << 3547 jne L(console_not_lf) << 3548 movel %a0@(Lconsole_struct_cur_row) << 3549 addil #1,%d0 << 3550 movel %d0,%a0@(Lconsole_struct_cur_ << 3551 movel %a0@(Lconsole_struct_num_rows << 3552 cmpl %d1,%d0 << 3553 jcs 1f << 3554 subil #1,%d0 << 3555 movel %d0,%a0@(Lconsole_struct_cur_ << 3556 console_scroll << 3557 1: << 3558 jra L(console_exit) << 3559 1291 3560 L(console_not_lf): !! 1292 .globl C_LABEL(prom_vector_p) 3561 cmpib #13,%d7 !! 1293 C_LABEL(prom_vector_p): 3562 jne L(console_not_cr) !! 1294 .word 0 3563 clrl %a0@(Lconsole_struct_cur_colu << 3564 jra L(console_exit) << 3565 << 3566 L(console_not_cr): << 3567 cmpib #1,%d7 << 3568 jne L(console_not_home) << 3569 clrl %a0@(Lconsole_struct_cur_row) << 3570 clrl %a0@(Lconsole_struct_cur_colu << 3571 jra L(console_exit) << 3572 1295 3573 /* !! 1296 /* We calculate the following at boot time, window fills/spills and trap entry 3574 * At this point we know that the %d7 ch !! 1297 * code uses these to keep track of the register windows. 3575 * rendered on the screen. Register usa << 3576 * a0 = pointer to console globa << 3577 * a1 = font data << 3578 * d0 = cursor column << 3579 * d1 = cursor row to draw the c << 3580 * d7 = character number << 3581 */ 1298 */ 3582 L(console_not_home): << 3583 movel %a0@(Lconsole_struct_cur_colu << 3584 addql #1,%a0@(Lconsole_struct_cur_c << 3585 movel %a0@(Lconsole_struct_num_colu << 3586 cmpl %d1,%d0 << 3587 jcs 1f << 3588 console_putc #'\n' /* recursion << 3589 1: << 3590 movel %a0@(Lconsole_struct_cur_row) << 3591 1299 3592 /* !! 1300 .align 4 3593 * At this point we make a shift !! 1301 .globl C_LABEL(nwindows) 3594 * a0 = address of pointer to fo !! 1302 .globl C_LABEL(nwindowsm1) 3595 */ !! 1303 C_LABEL(nwindows): 3596 movel %pc@(L(console_font)),%a0 !! 1304 .word 8 3597 movel %pc@(L(console_font_data)),%a !! 1305 C_LABEL(nwindowsm1): 3598 andl #0x000000ff,%d7 !! 1306 .word 7 3599 /* ASSERT: a0 = contents of L << 3600 mulul %a0@(FONT_DESC_HEIGHT),%d7 << 3601 addl %d7,%a1 /* a1 << 3602 << 3603 /* << 3604 * At this point we make a shift << 3605 * d0 = pixel coordinate, x << 3606 * d1 = pixel coordinate, y << 3607 * d2 = (bit 0) 1/0 for white/bl << 3608 * d3 = font scan line data (8 p << 3609 * d6 = count down for the font' << 3610 * d7 = count down for the font' << 3611 */ << 3612 /* ASSERT: a0 = contents of L << 3613 mulul %a0@(FONT_DESC_WIDTH),%d0 << 3614 mulul %a0@(FONT_DESC_HEIGHT),%d1 << 3615 movel %a0@(FONT_DESC_HEIGHT),%d7 << 3616 subq #1,%d7 << 3617 L(console_read_char_scanline): << 3618 moveb %a1@+,%d3 << 3619 << 3620 /* ASSERT: a0 = contents of L << 3621 movel %a0@(FONT_DESC_WIDTH),%d6 << 3622 subql #1,%d6 << 3623 << 3624 L(console_do_font_scanline): << 3625 lslb #1,%d3 << 3626 scsb %d2 /* convert 1 << 3627 console_plot_pixel %d0,%d1,%d2 << 3628 addq #1,%d0 << 3629 dbra %d6,L(console_do_font_scanlin << 3630 << 3631 /* ASSERT: a0 = contents of L << 3632 subl %a0@(FONT_DESC_WIDTH),%d0 << 3633 addq #1,%d1 << 3634 dbra %d7,L(console_read_char_scanl << 3635 << 3636 L(console_exit): << 3637 func_return console_putc << 3638 << 3639 /* << 3640 * Input: << 3641 * d0 = x coordinate << 3642 * d1 = y coordinate << 3643 * d2 = (bit 0) 1/0 for << 3644 * All registers are preserved << 3645 */ << 3646 func_start console_plot_pixel,%a0-%a1/%d << 3647 << 3648 movel %pc@(L(mac_videobase)),%a1 << 3649 movel %pc@(L(mac_videodepth)),%d3 << 3650 movel ARG1,%d0 << 3651 movel ARG2,%d1 << 3652 mulul %pc@(L(mac_rowbytes)),%d1 << 3653 movel ARG3,%d2 << 3654 << 3655 /* << 3656 * Register usage: << 3657 * d0 = x coord becomes << 3658 * d1 = y coord << 3659 * d2 = black or white ( << 3660 * d3 = video depth << 3661 * d4 = temp of x (d0) f << 3662 */ << 3663 L(test_1bit): << 3664 cmpb #1,%d3 << 3665 jbne L(test_2bit) << 3666 movel %d0,%d4 /* we need th << 3667 divul #8,%d0 << 3668 addal %d0,%a1 << 3669 addal %d1,%a1 << 3670 andb #7,%d4 << 3671 eorb #7,%d4 /* reverse th << 3672 andb #1,%d2 << 3673 jbne L(white_1) << 3674 bsetb %d4,%a1@ << 3675 jbra L(console_plot_pixel_exit) << 3676 L(white_1): << 3677 bclrb %d4,%a1@ << 3678 jbra L(console_plot_pixel_exit) << 3679 << 3680 L(test_2bit): << 3681 cmpb #2,%d3 << 3682 jbne L(test_4bit) << 3683 movel %d0,%d4 /* we need th << 3684 divul #4,%d0 << 3685 addal %d0,%a1 << 3686 addal %d1,%a1 << 3687 andb #3,%d4 << 3688 eorb #3,%d4 /* reverse th << 3689 lsll #1,%d4 /* ! */ << 3690 andb #1,%d2 << 3691 jbne L(white_2) << 3692 bsetb %d4,%a1@ << 3693 addq #1,%d4 << 3694 bsetb %d4,%a1@ << 3695 jbra L(console_plot_pixel_exit) << 3696 L(white_2): << 3697 bclrb %d4,%a1@ << 3698 addq #1,%d4 << 3699 bclrb %d4,%a1@ << 3700 jbra L(console_plot_pixel_exit) << 3701 << 3702 L(test_4bit): << 3703 cmpb #4,%d3 << 3704 jbne L(test_8bit) << 3705 movel %d0,%d4 /* we need th << 3706 divul #2,%d0 << 3707 addal %d0,%a1 << 3708 addal %d1,%a1 << 3709 andb #1,%d4 << 3710 eorb #1,%d4 << 3711 lsll #2,%d4 /* ! */ << 3712 andb #1,%d2 << 3713 jbne L(white_4) << 3714 bsetb %d4,%a1@ << 3715 addq #1,%d4 << 3716 bsetb %d4,%a1@ << 3717 addq #1,%d4 << 3718 bsetb %d4,%a1@ << 3719 addq #1,%d4 << 3720 bsetb %d4,%a1@ << 3721 jbra L(console_plot_pixel_exit) << 3722 L(white_4): << 3723 bclrb %d4,%a1@ << 3724 addq #1,%d4 << 3725 bclrb %d4,%a1@ << 3726 addq #1,%d4 << 3727 bclrb %d4,%a1@ << 3728 addq #1,%d4 << 3729 bclrb %d4,%a1@ << 3730 jbra L(console_plot_pixel_exit) << 3731 << 3732 L(test_8bit): << 3733 cmpb #8,%d3 << 3734 jbne L(test_16bit) << 3735 addal %d0,%a1 << 3736 addal %d1,%a1 << 3737 andb #1,%d2 << 3738 jbne L(white_8) << 3739 moveb #0xff,%a1@ << 3740 jbra L(console_plot_pixel_exit) << 3741 L(white_8): << 3742 clrb %a1@ << 3743 jbra L(console_plot_pixel_exit) << 3744 << 3745 L(test_16bit): << 3746 cmpb #16,%d3 << 3747 jbne L(console_plot_pixel_exit) << 3748 addal %d0,%a1 << 3749 addal %d0,%a1 << 3750 addal %d1,%a1 << 3751 andb #1,%d2 << 3752 jbne L(white_16) << 3753 clrw %a1@ << 3754 jbra L(console_plot_pixel_exit) << 3755 L(white_16): << 3756 movew #0x0fff,%a1@ << 3757 jbra L(console_plot_pixel_exit) << 3758 << 3759 L(console_plot_pixel_exit): << 3760 func_return console_plot_pixel << 3761 #endif /* CONSOLE_DEBUG */ << 3762 << 3763 << 3764 __INITDATA << 3765 .align 4 << 3766 << 3767 m68k_init_mapped_size: << 3768 .long 0 << 3769 << 3770 #if defined(CONFIG_ATARI) || defined(CONFIG_A << 3771 defined(CONFIG_HP300) || defined(CONFIG_A << 3772 L(custom): << 3773 L(iobase): << 3774 .long 0 << 3775 #endif << 3776 1307 3777 #ifdef CONSOLE_DEBUG !! 1308 /* Boot time debugger vector value. We need this later on. */ 3778 L(console_globals): << 3779 .long 0 /* cursor col << 3780 .long 0 /* cursor row << 3781 .long 0 /* max num co << 3782 .long 0 /* max num ro << 3783 .long 0 /* left edge << 3784 L(console_font): << 3785 .long 0 /* pointer to << 3786 L(console_font_data): << 3787 .long 0 /* pointer to << 3788 #endif /* CONSOLE_DEBUG */ << 3789 << 3790 #if defined(MMU_PRINT) << 3791 L(mmu_print_data): << 3792 .long 0 /* valid flag << 3793 .long 0 /* start logi << 3794 .long 0 /* next logic << 3795 .long 0 /* start phys << 3796 .long 0 /* next physi << 3797 #endif /* MMU_PRINT */ << 3798 << 3799 L(cputype): << 3800 .long 0 << 3801 L(mmu_cached_pointer_tables): << 3802 .long 0 << 3803 L(mmu_num_pointer_tables): << 3804 .long 0 << 3805 L(phys_kernel_start): << 3806 .long 0 << 3807 L(kernel_end): << 3808 .long 0 << 3809 L(memory_start): << 3810 .long 0 << 3811 L(kernel_pgdir_ptr): << 3812 .long 0 << 3813 L(temp_mmap_mem): << 3814 .long 0 << 3815 << 3816 #if defined (CONFIG_MVME147) << 3817 M147_SCC_CTRL_A = 0xfffe3002 << 3818 M147_SCC_DATA_A = 0xfffe3003 << 3819 #endif << 3820 1309 3821 #if defined (CONFIG_MVME16x) !! 1310 .align 4 3822 M162_SCC_CTRL_A = 0xfff45005 !! 1311 .globl C_LABEL(linux_dbvec) 3823 M167_CYCAR = 0xfff450ee !! 1312 C_LABEL(linux_dbvec): 3824 M167_CYIER = 0xfff45011 !! 1313 .word 0 3825 M167_CYLICR = 0xfff45026 !! 1314 .word 0 3826 M167_CYTEOIR = 0xfff45085 << 3827 M167_CYTDR = 0xfff450f8 << 3828 M167_PCSCCMICR = 0xfff4201d << 3829 M167_PCSCCTICR = 0xfff4201e << 3830 M167_PCSCCRICR = 0xfff4201f << 3831 M167_PCTPIACKR = 0xfff42025 << 3832 #endif << 3833 1315 3834 #if defined (CONFIG_BVME6000) !! 1316 .align 8 3835 BVME_SCC_CTRL_A = 0xffb0000b << 3836 BVME_SCC_DATA_A = 0xffb0000f << 3837 #endif << 3838 1317 3839 #if defined(CONFIG_MAC) !! 1318 .globl C_LABEL(lvl14_save) 3840 L(mac_videobase): !! 1319 C_LABEL(lvl14_save): 3841 .long 0 !! 1320 .word 0 3842 L(mac_videodepth): !! 1321 .word 0 3843 .long 0 !! 1322 .word 0 3844 L(mac_dimensions): !! 1323 .word 0 3845 .long 0 !! 1324 .word t_irq14 3846 L(mac_rowbytes): << 3847 .long 0 << 3848 L(mac_sccbase): << 3849 .long 0 << 3850 #endif /* CONFIG_MAC */ << 3851 << 3852 #if defined (CONFIG_APOLLO) << 3853 LSRB0 = 0x10412 << 3854 LTHRB0 = 0x10416 << 3855 LCPUCTRL = 0x10100 << 3856 #endif << 3857 << 3858 #if defined(CONFIG_HP300) << 3859 DCADATA = 0x11 << 3860 DCALSR = 0x1b << 3861 APCIDATA = 0x00 << 3862 APCILSR = 0x14 << 3863 L(uartbase): << 3864 .long 0 << 3865 L(uart_scode): << 3866 .long -1 << 3867 #endif << 3868 << 3869 __FINIT << 3870 .data << 3871 .align 4 << 3872 << 3873 availmem: << 3874 .long 0 << 3875 m68k_pgtable_cachemode: << 3876 .long 0 << 3877 m68k_supervisor_cachemode: << 3878 .long 0 << 3879 #if defined(CONFIG_MVME16x) << 3880 mvme_bdid: << 3881 .long 0,0,0,0,0,0,0,0 << 3882 #endif << 3883 #if defined(CONFIG_Q40) << 3884 q40_mem_cptr: << 3885 .long 0 << 3886 L(q40_do_debug): << 3887 .long 0 << 3888 #endif << 3889 1325 3890 #if defined(CONFIG_VIRT) !! 1326 .section ".fixup",#alloc,#execinstr 3891 GF_PUT_CHAR = 0x00 !! 1327 .globl __ret_efault 3892 L(virt_gf_tty_base): !! 1328 __ret_efault: 3893 .long 0 !! 1329 ret 3894 #endif /* CONFIG_VIRT */ !! 1330 restore %g0, -EFAULT, %o0
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.