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