Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.13 2276 lines 64 kB view raw
1/* $Id: sun4c.c,v 1.212 2001/12/21 04:56:15 davem Exp $ 2 * sun4c.c: Doing in software what should be done in hardware. 3 * 4 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 5 * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) 6 * Copyright (C) 1996 Andrew Tridgell (Andrew.Tridgell@anu.edu.au) 7 * Copyright (C) 1997-2000 Anton Blanchard (anton@samba.org) 8 * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 9 */ 10 11#define NR_TASK_BUCKETS 512 12 13#include <linux/config.h> 14#include <linux/kernel.h> 15#include <linux/mm.h> 16#include <linux/init.h> 17#include <linux/bootmem.h> 18#include <linux/highmem.h> 19#include <linux/fs.h> 20#include <linux/seq_file.h> 21 22#include <asm/scatterlist.h> 23#include <asm/page.h> 24#include <asm/pgalloc.h> 25#include <asm/pgtable.h> 26#include <asm/vaddrs.h> 27#include <asm/idprom.h> 28#include <asm/machines.h> 29#include <asm/memreg.h> 30#include <asm/processor.h> 31#include <asm/auxio.h> 32#include <asm/io.h> 33#include <asm/oplib.h> 34#include <asm/openprom.h> 35#include <asm/mmu_context.h> 36#include <asm/sun4paddr.h> 37#include <asm/highmem.h> 38#include <asm/btfixup.h> 39#include <asm/cacheflush.h> 40#include <asm/tlbflush.h> 41 42/* Because of our dynamic kernel TLB miss strategy, and how 43 * our DVMA mapping allocation works, you _MUST_: 44 * 45 * 1) Disable interrupts _and_ not touch any dynamic kernel 46 * memory while messing with kernel MMU state. By 47 * dynamic memory I mean any object which is not in 48 * the kernel image itself or a thread_union (both of 49 * which are locked into the MMU). 50 * 2) Disable interrupts while messing with user MMU state. 51 */ 52 53extern int num_segmaps, num_contexts; 54 55extern unsigned long page_kernel; 56 57#ifdef CONFIG_SUN4 58#define SUN4C_VAC_SIZE sun4c_vacinfo.num_bytes 59#else 60/* That's it, we prom_halt() on sun4c if the cache size is something other than 65536. 61 * So let's save some cycles and just use that everywhere except for that bootup 62 * sanity check. 63 */ 64#define SUN4C_VAC_SIZE 65536 65#endif 66 67#define SUN4C_KERNEL_BUCKETS 32 68 69/* Flushing the cache. */ 70struct sun4c_vac_props sun4c_vacinfo; 71unsigned long sun4c_kernel_faults; 72 73/* Invalidate every sun4c cache line tag. */ 74static void __init sun4c_flush_all(void) 75{ 76 unsigned long begin, end; 77 78 if (sun4c_vacinfo.on) 79 panic("SUN4C: AIEEE, trying to invalidate vac while it is on."); 80 81 /* Clear 'valid' bit in all cache line tags */ 82 begin = AC_CACHETAGS; 83 end = (AC_CACHETAGS + SUN4C_VAC_SIZE); 84 while (begin < end) { 85 __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : 86 "r" (begin), "i" (ASI_CONTROL)); 87 begin += sun4c_vacinfo.linesize; 88 } 89} 90 91static void sun4c_flush_context_hw(void) 92{ 93 unsigned long end = SUN4C_VAC_SIZE; 94 95 __asm__ __volatile__( 96 "1: addcc %0, -4096, %0\n\t" 97 " bne 1b\n\t" 98 " sta %%g0, [%0] %2" 99 : "=&r" (end) 100 : "0" (end), "i" (ASI_HWFLUSHCONTEXT) 101 : "cc"); 102} 103 104/* Must be called minimally with IRQs disabled. */ 105static void sun4c_flush_segment_hw(unsigned long addr) 106{ 107 if (sun4c_get_segmap(addr) != invalid_segment) { 108 unsigned long vac_size = SUN4C_VAC_SIZE; 109 110 __asm__ __volatile__( 111 "1: addcc %0, -4096, %0\n\t" 112 " bne 1b\n\t" 113 " sta %%g0, [%2 + %0] %3" 114 : "=&r" (vac_size) 115 : "0" (vac_size), "r" (addr), "i" (ASI_HWFLUSHSEG) 116 : "cc"); 117 } 118} 119 120/* File local boot time fixups. */ 121BTFIXUPDEF_CALL(void, sun4c_flush_page, unsigned long) 122BTFIXUPDEF_CALL(void, sun4c_flush_segment, unsigned long) 123BTFIXUPDEF_CALL(void, sun4c_flush_context, void) 124 125#define sun4c_flush_page(addr) BTFIXUP_CALL(sun4c_flush_page)(addr) 126#define sun4c_flush_segment(addr) BTFIXUP_CALL(sun4c_flush_segment)(addr) 127#define sun4c_flush_context() BTFIXUP_CALL(sun4c_flush_context)() 128 129/* Must be called minimally with interrupts disabled. */ 130static void sun4c_flush_page_hw(unsigned long addr) 131{ 132 addr &= PAGE_MASK; 133 if ((int)sun4c_get_pte(addr) < 0) 134 __asm__ __volatile__("sta %%g0, [%0] %1" 135 : : "r" (addr), "i" (ASI_HWFLUSHPAGE)); 136} 137 138/* Don't inline the software version as it eats too many cache lines if expanded. */ 139static void sun4c_flush_context_sw(void) 140{ 141 unsigned long nbytes = SUN4C_VAC_SIZE; 142 unsigned long lsize = sun4c_vacinfo.linesize; 143 144 __asm__ __volatile__( 145 "add %2, %2, %%g1\n\t" 146 "add %2, %%g1, %%g2\n\t" 147 "add %2, %%g2, %%g3\n\t" 148 "add %2, %%g3, %%g4\n\t" 149 "add %2, %%g4, %%g5\n\t" 150 "add %2, %%g5, %%o4\n\t" 151 "add %2, %%o4, %%o5\n" 152 "1:\n\t" 153 "subcc %0, %%o5, %0\n\t" 154 "sta %%g0, [%0] %3\n\t" 155 "sta %%g0, [%0 + %2] %3\n\t" 156 "sta %%g0, [%0 + %%g1] %3\n\t" 157 "sta %%g0, [%0 + %%g2] %3\n\t" 158 "sta %%g0, [%0 + %%g3] %3\n\t" 159 "sta %%g0, [%0 + %%g4] %3\n\t" 160 "sta %%g0, [%0 + %%g5] %3\n\t" 161 "bg 1b\n\t" 162 " sta %%g0, [%1 + %%o4] %3\n" 163 : "=&r" (nbytes) 164 : "0" (nbytes), "r" (lsize), "i" (ASI_FLUSHCTX) 165 : "g1", "g2", "g3", "g4", "g5", "o4", "o5", "cc"); 166} 167 168/* Don't inline the software version as it eats too many cache lines if expanded. */ 169static void sun4c_flush_segment_sw(unsigned long addr) 170{ 171 if (sun4c_get_segmap(addr) != invalid_segment) { 172 unsigned long nbytes = SUN4C_VAC_SIZE; 173 unsigned long lsize = sun4c_vacinfo.linesize; 174 175 __asm__ __volatile__( 176 "add %2, %2, %%g1\n\t" 177 "add %2, %%g1, %%g2\n\t" 178 "add %2, %%g2, %%g3\n\t" 179 "add %2, %%g3, %%g4\n\t" 180 "add %2, %%g4, %%g5\n\t" 181 "add %2, %%g5, %%o4\n\t" 182 "add %2, %%o4, %%o5\n" 183 "1:\n\t" 184 "subcc %1, %%o5, %1\n\t" 185 "sta %%g0, [%0] %6\n\t" 186 "sta %%g0, [%0 + %2] %6\n\t" 187 "sta %%g0, [%0 + %%g1] %6\n\t" 188 "sta %%g0, [%0 + %%g2] %6\n\t" 189 "sta %%g0, [%0 + %%g3] %6\n\t" 190 "sta %%g0, [%0 + %%g4] %6\n\t" 191 "sta %%g0, [%0 + %%g5] %6\n\t" 192 "sta %%g0, [%0 + %%o4] %6\n\t" 193 "bg 1b\n\t" 194 " add %0, %%o5, %0\n" 195 : "=&r" (addr), "=&r" (nbytes), "=&r" (lsize) 196 : "0" (addr), "1" (nbytes), "2" (lsize), 197 "i" (ASI_FLUSHSEG) 198 : "g1", "g2", "g3", "g4", "g5", "o4", "o5", "cc"); 199 } 200} 201 202/* Don't inline the software version as it eats too many cache lines if expanded. */ 203static void sun4c_flush_page_sw(unsigned long addr) 204{ 205 addr &= PAGE_MASK; 206 if ((sun4c_get_pte(addr) & (_SUN4C_PAGE_NOCACHE | _SUN4C_PAGE_VALID)) == 207 _SUN4C_PAGE_VALID) { 208 unsigned long left = PAGE_SIZE; 209 unsigned long lsize = sun4c_vacinfo.linesize; 210 211 __asm__ __volatile__( 212 "add %2, %2, %%g1\n\t" 213 "add %2, %%g1, %%g2\n\t" 214 "add %2, %%g2, %%g3\n\t" 215 "add %2, %%g3, %%g4\n\t" 216 "add %2, %%g4, %%g5\n\t" 217 "add %2, %%g5, %%o4\n\t" 218 "add %2, %%o4, %%o5\n" 219 "1:\n\t" 220 "subcc %1, %%o5, %1\n\t" 221 "sta %%g0, [%0] %6\n\t" 222 "sta %%g0, [%0 + %2] %6\n\t" 223 "sta %%g0, [%0 + %%g1] %6\n\t" 224 "sta %%g0, [%0 + %%g2] %6\n\t" 225 "sta %%g0, [%0 + %%g3] %6\n\t" 226 "sta %%g0, [%0 + %%g4] %6\n\t" 227 "sta %%g0, [%0 + %%g5] %6\n\t" 228 "sta %%g0, [%0 + %%o4] %6\n\t" 229 "bg 1b\n\t" 230 " add %0, %%o5, %0\n" 231 : "=&r" (addr), "=&r" (left), "=&r" (lsize) 232 : "0" (addr), "1" (left), "2" (lsize), 233 "i" (ASI_FLUSHPG) 234 : "g1", "g2", "g3", "g4", "g5", "o4", "o5", "cc"); 235 } 236} 237 238/* The sun4c's do have an on chip store buffer. And the way you 239 * clear them out isn't so obvious. The only way I can think of 240 * to accomplish this is to read the current context register, 241 * store the same value there, then read an external hardware 242 * register. 243 */ 244void sun4c_complete_all_stores(void) 245{ 246 volatile int _unused; 247 248 _unused = sun4c_get_context(); 249 sun4c_set_context(_unused); 250#ifdef CONFIG_SUN_AUXIO 251 _unused = get_auxio(); 252#endif 253} 254 255/* Bootup utility functions. */ 256static inline void sun4c_init_clean_segmap(unsigned char pseg) 257{ 258 unsigned long vaddr; 259 260 sun4c_put_segmap(0, pseg); 261 for (vaddr = 0; vaddr < SUN4C_REAL_PGDIR_SIZE; vaddr += PAGE_SIZE) 262 sun4c_put_pte(vaddr, 0); 263 sun4c_put_segmap(0, invalid_segment); 264} 265 266static inline void sun4c_init_clean_mmu(unsigned long kernel_end) 267{ 268 unsigned long vaddr; 269 unsigned char savectx, ctx; 270 271 savectx = sun4c_get_context(); 272 kernel_end = SUN4C_REAL_PGDIR_ALIGN(kernel_end); 273 for (ctx = 0; ctx < num_contexts; ctx++) { 274 sun4c_set_context(ctx); 275 for (vaddr = 0; vaddr < 0x20000000; vaddr += SUN4C_REAL_PGDIR_SIZE) 276 sun4c_put_segmap(vaddr, invalid_segment); 277 for (vaddr = 0xe0000000; vaddr < KERNBASE; vaddr += SUN4C_REAL_PGDIR_SIZE) 278 sun4c_put_segmap(vaddr, invalid_segment); 279 for (vaddr = kernel_end; vaddr < KADB_DEBUGGER_BEGVM; vaddr += SUN4C_REAL_PGDIR_SIZE) 280 sun4c_put_segmap(vaddr, invalid_segment); 281 for (vaddr = LINUX_OPPROM_ENDVM; vaddr; vaddr += SUN4C_REAL_PGDIR_SIZE) 282 sun4c_put_segmap(vaddr, invalid_segment); 283 } 284 sun4c_set_context(savectx); 285} 286 287void __init sun4c_probe_vac(void) 288{ 289 sun4c_disable_vac(); 290 291 if (ARCH_SUN4) { 292 switch (idprom->id_machtype) { 293 294 case (SM_SUN4|SM_4_110): 295 sun4c_vacinfo.type = VAC_NONE; 296 sun4c_vacinfo.num_bytes = 0; 297 sun4c_vacinfo.linesize = 0; 298 sun4c_vacinfo.do_hwflushes = 0; 299 prom_printf("No VAC. Get some bucks and buy a real computer."); 300 prom_halt(); 301 break; 302 303 case (SM_SUN4|SM_4_260): 304 sun4c_vacinfo.type = VAC_WRITE_BACK; 305 sun4c_vacinfo.num_bytes = 128 * 1024; 306 sun4c_vacinfo.linesize = 16; 307 sun4c_vacinfo.do_hwflushes = 0; 308 break; 309 310 case (SM_SUN4|SM_4_330): 311 sun4c_vacinfo.type = VAC_WRITE_THROUGH; 312 sun4c_vacinfo.num_bytes = 128 * 1024; 313 sun4c_vacinfo.linesize = 16; 314 sun4c_vacinfo.do_hwflushes = 0; 315 break; 316 317 case (SM_SUN4|SM_4_470): 318 sun4c_vacinfo.type = VAC_WRITE_BACK; 319 sun4c_vacinfo.num_bytes = 128 * 1024; 320 sun4c_vacinfo.linesize = 32; 321 sun4c_vacinfo.do_hwflushes = 0; 322 break; 323 324 default: 325 prom_printf("Cannot initialize VAC - weird sun4 model idprom->id_machtype = %d", idprom->id_machtype); 326 prom_halt(); 327 }; 328 } else { 329 sun4c_vacinfo.type = VAC_WRITE_THROUGH; 330 331 if ((idprom->id_machtype == (SM_SUN4C | SM_4C_SS1)) || 332 (idprom->id_machtype == (SM_SUN4C | SM_4C_SS1PLUS))) { 333 /* PROM on SS1 lacks this info, to be super safe we 334 * hard code it here since this arch is cast in stone. 335 */ 336 sun4c_vacinfo.num_bytes = 65536; 337 sun4c_vacinfo.linesize = 16; 338 } else { 339 sun4c_vacinfo.num_bytes = 340 prom_getintdefault(prom_root_node, "vac-size", 65536); 341 sun4c_vacinfo.linesize = 342 prom_getintdefault(prom_root_node, "vac-linesize", 16); 343 } 344 sun4c_vacinfo.do_hwflushes = 345 prom_getintdefault(prom_root_node, "vac-hwflush", 0); 346 347 if (sun4c_vacinfo.do_hwflushes == 0) 348 sun4c_vacinfo.do_hwflushes = 349 prom_getintdefault(prom_root_node, "vac_hwflush", 0); 350 351 if (sun4c_vacinfo.num_bytes != 65536) { 352 prom_printf("WEIRD Sun4C VAC cache size, " 353 "tell sparclinux@vger.kernel.org"); 354 prom_halt(); 355 } 356 } 357 358 sun4c_vacinfo.num_lines = 359 (sun4c_vacinfo.num_bytes / sun4c_vacinfo.linesize); 360 switch (sun4c_vacinfo.linesize) { 361 case 16: 362 sun4c_vacinfo.log2lsize = 4; 363 break; 364 case 32: 365 sun4c_vacinfo.log2lsize = 5; 366 break; 367 default: 368 prom_printf("probe_vac: Didn't expect vac-linesize of %d, halting\n", 369 sun4c_vacinfo.linesize); 370 prom_halt(); 371 }; 372 373 sun4c_flush_all(); 374 sun4c_enable_vac(); 375} 376 377/* Patch instructions for the low level kernel fault handler. */ 378extern unsigned long invalid_segment_patch1, invalid_segment_patch1_ff; 379extern unsigned long invalid_segment_patch2, invalid_segment_patch2_ff; 380extern unsigned long invalid_segment_patch1_1ff, invalid_segment_patch2_1ff; 381extern unsigned long num_context_patch1, num_context_patch1_16; 382extern unsigned long num_context_patch2_16; 383extern unsigned long vac_linesize_patch, vac_linesize_patch_32; 384extern unsigned long vac_hwflush_patch1, vac_hwflush_patch1_on; 385extern unsigned long vac_hwflush_patch2, vac_hwflush_patch2_on; 386 387#define PATCH_INSN(src, dst) do { \ 388 daddr = &(dst); \ 389 iaddr = &(src); \ 390 *daddr = *iaddr; \ 391 } while (0) 392 393static void __init patch_kernel_fault_handler(void) 394{ 395 unsigned long *iaddr, *daddr; 396 397 switch (num_segmaps) { 398 case 128: 399 /* Default, nothing to do. */ 400 break; 401 case 256: 402 PATCH_INSN(invalid_segment_patch1_ff, 403 invalid_segment_patch1); 404 PATCH_INSN(invalid_segment_patch2_ff, 405 invalid_segment_patch2); 406 break; 407 case 512: 408 PATCH_INSN(invalid_segment_patch1_1ff, 409 invalid_segment_patch1); 410 PATCH_INSN(invalid_segment_patch2_1ff, 411 invalid_segment_patch2); 412 break; 413 default: 414 prom_printf("Unhandled number of segmaps: %d\n", 415 num_segmaps); 416 prom_halt(); 417 }; 418 switch (num_contexts) { 419 case 8: 420 /* Default, nothing to do. */ 421 break; 422 case 16: 423 PATCH_INSN(num_context_patch1_16, 424 num_context_patch1); 425 break; 426 default: 427 prom_printf("Unhandled number of contexts: %d\n", 428 num_contexts); 429 prom_halt(); 430 }; 431 432 if (sun4c_vacinfo.do_hwflushes != 0) { 433 PATCH_INSN(vac_hwflush_patch1_on, vac_hwflush_patch1); 434 PATCH_INSN(vac_hwflush_patch2_on, vac_hwflush_patch2); 435 } else { 436 switch (sun4c_vacinfo.linesize) { 437 case 16: 438 /* Default, nothing to do. */ 439 break; 440 case 32: 441 PATCH_INSN(vac_linesize_patch_32, vac_linesize_patch); 442 break; 443 default: 444 prom_printf("Impossible VAC linesize %d, halting...\n", 445 sun4c_vacinfo.linesize); 446 prom_halt(); 447 }; 448 } 449} 450 451static void __init sun4c_probe_mmu(void) 452{ 453 if (ARCH_SUN4) { 454 switch (idprom->id_machtype) { 455 case (SM_SUN4|SM_4_110): 456 prom_printf("No support for 4100 yet\n"); 457 prom_halt(); 458 num_segmaps = 256; 459 num_contexts = 8; 460 break; 461 462 case (SM_SUN4|SM_4_260): 463 /* should be 512 segmaps. when it get fixed */ 464 num_segmaps = 256; 465 num_contexts = 16; 466 break; 467 468 case (SM_SUN4|SM_4_330): 469 num_segmaps = 256; 470 num_contexts = 16; 471 break; 472 473 case (SM_SUN4|SM_4_470): 474 /* should be 1024 segmaps. when it get fixed */ 475 num_segmaps = 256; 476 num_contexts = 64; 477 break; 478 default: 479 prom_printf("Invalid SUN4 model\n"); 480 prom_halt(); 481 }; 482 } else { 483 if ((idprom->id_machtype == (SM_SUN4C | SM_4C_SS1)) || 484 (idprom->id_machtype == (SM_SUN4C | SM_4C_SS1PLUS))) { 485 /* Hardcode these just to be safe, PROM on SS1 does 486 * not have this info available in the root node. 487 */ 488 num_segmaps = 128; 489 num_contexts = 8; 490 } else { 491 num_segmaps = 492 prom_getintdefault(prom_root_node, "mmu-npmg", 128); 493 num_contexts = 494 prom_getintdefault(prom_root_node, "mmu-nctx", 0x8); 495 } 496 } 497 patch_kernel_fault_handler(); 498} 499 500volatile unsigned long *sun4c_memerr_reg = NULL; 501 502void __init sun4c_probe_memerr_reg(void) 503{ 504 int node; 505 struct linux_prom_registers regs[1]; 506 507 if (ARCH_SUN4) { 508 sun4c_memerr_reg = ioremap(sun4_memreg_physaddr, PAGE_SIZE); 509 } else { 510 node = prom_getchild(prom_root_node); 511 node = prom_searchsiblings(prom_root_node, "memory-error"); 512 if (!node) 513 return; 514 if (prom_getproperty(node, "reg", (char *)regs, sizeof(regs)) <= 0) 515 return; 516 /* hmm I think regs[0].which_io is zero here anyways */ 517 sun4c_memerr_reg = ioremap(regs[0].phys_addr, regs[0].reg_size); 518 } 519} 520 521static inline void sun4c_init_ss2_cache_bug(void) 522{ 523 extern unsigned long start; 524 525 if ((idprom->id_machtype == (SM_SUN4C | SM_4C_SS2)) || 526 (idprom->id_machtype == (SM_SUN4C | SM_4C_IPX)) || 527 (idprom->id_machtype == (SM_SUN4 | SM_4_330)) || 528 (idprom->id_machtype == (SM_SUN4C | SM_4C_ELC))) { 529 /* Whee.. */ 530 printk("SS2 cache bug detected, uncaching trap table page\n"); 531 sun4c_flush_page((unsigned int) &start); 532 sun4c_put_pte(((unsigned long) &start), 533 (sun4c_get_pte((unsigned long) &start) | _SUN4C_PAGE_NOCACHE)); 534 } 535} 536 537/* Addr is always aligned on a page boundary for us already. */ 538static int sun4c_map_dma_area(dma_addr_t *pba, unsigned long va, 539 unsigned long addr, int len) 540{ 541 unsigned long page, end; 542 543 *pba = addr; 544 545 end = PAGE_ALIGN((addr + len)); 546 while (addr < end) { 547 page = va; 548 sun4c_flush_page(page); 549 page -= PAGE_OFFSET; 550 page >>= PAGE_SHIFT; 551 page |= (_SUN4C_PAGE_VALID | _SUN4C_PAGE_DIRTY | 552 _SUN4C_PAGE_NOCACHE | _SUN4C_PAGE_PRIV); 553 sun4c_put_pte(addr, page); 554 addr += PAGE_SIZE; 555 va += PAGE_SIZE; 556 } 557 558 return 0; 559} 560 561static struct page *sun4c_translate_dvma(unsigned long busa) 562{ 563 /* Fortunately for us, bus_addr == uncached_virt in sun4c. */ 564 unsigned long pte = sun4c_get_pte(busa); 565 return pfn_to_page(pte & SUN4C_PFN_MASK); 566} 567 568static void sun4c_unmap_dma_area(unsigned long busa, int len) 569{ 570 /* Fortunately for us, bus_addr == uncached_virt in sun4c. */ 571 /* XXX Implement this */ 572} 573 574/* TLB management. */ 575 576/* Don't change this struct without changing entry.S. This is used 577 * in the in-window kernel fault handler, and you don't want to mess 578 * with that. (See sun4c_fault in entry.S). 579 */ 580struct sun4c_mmu_entry { 581 struct sun4c_mmu_entry *next; 582 struct sun4c_mmu_entry *prev; 583 unsigned long vaddr; 584 unsigned char pseg; 585 unsigned char locked; 586 587 /* For user mappings only, and completely hidden from kernel 588 * TLB miss code. 589 */ 590 unsigned char ctx; 591 struct sun4c_mmu_entry *lru_next; 592 struct sun4c_mmu_entry *lru_prev; 593}; 594 595static struct sun4c_mmu_entry mmu_entry_pool[SUN4C_MAX_SEGMAPS]; 596 597static void __init sun4c_init_mmu_entry_pool(void) 598{ 599 int i; 600 601 for (i=0; i < SUN4C_MAX_SEGMAPS; i++) { 602 mmu_entry_pool[i].pseg = i; 603 mmu_entry_pool[i].next = NULL; 604 mmu_entry_pool[i].prev = NULL; 605 mmu_entry_pool[i].vaddr = 0; 606 mmu_entry_pool[i].locked = 0; 607 mmu_entry_pool[i].ctx = 0; 608 mmu_entry_pool[i].lru_next = NULL; 609 mmu_entry_pool[i].lru_prev = NULL; 610 } 611 mmu_entry_pool[invalid_segment].locked = 1; 612} 613 614static inline void fix_permissions(unsigned long vaddr, unsigned long bits_on, 615 unsigned long bits_off) 616{ 617 unsigned long start, end; 618 619 end = vaddr + SUN4C_REAL_PGDIR_SIZE; 620 for (start = vaddr; start < end; start += PAGE_SIZE) 621 if (sun4c_get_pte(start) & _SUN4C_PAGE_VALID) 622 sun4c_put_pte(start, (sun4c_get_pte(start) | bits_on) & 623 ~bits_off); 624} 625 626static inline void sun4c_init_map_kernelprom(unsigned long kernel_end) 627{ 628 unsigned long vaddr; 629 unsigned char pseg, ctx; 630#ifdef CONFIG_SUN4 631 /* sun4/110 and 260 have no kadb. */ 632 if ((idprom->id_machtype != (SM_SUN4 | SM_4_260)) && 633 (idprom->id_machtype != (SM_SUN4 | SM_4_110))) { 634#endif 635 for (vaddr = KADB_DEBUGGER_BEGVM; 636 vaddr < LINUX_OPPROM_ENDVM; 637 vaddr += SUN4C_REAL_PGDIR_SIZE) { 638 pseg = sun4c_get_segmap(vaddr); 639 if (pseg != invalid_segment) { 640 mmu_entry_pool[pseg].locked = 1; 641 for (ctx = 0; ctx < num_contexts; ctx++) 642 prom_putsegment(ctx, vaddr, pseg); 643 fix_permissions(vaddr, _SUN4C_PAGE_PRIV, 0); 644 } 645 } 646#ifdef CONFIG_SUN4 647 } 648#endif 649 for (vaddr = KERNBASE; vaddr < kernel_end; vaddr += SUN4C_REAL_PGDIR_SIZE) { 650 pseg = sun4c_get_segmap(vaddr); 651 mmu_entry_pool[pseg].locked = 1; 652 for (ctx = 0; ctx < num_contexts; ctx++) 653 prom_putsegment(ctx, vaddr, pseg); 654 fix_permissions(vaddr, _SUN4C_PAGE_PRIV, _SUN4C_PAGE_NOCACHE); 655 } 656} 657 658static void __init sun4c_init_lock_area(unsigned long start, unsigned long end) 659{ 660 int i, ctx; 661 662 while (start < end) { 663 for (i = 0; i < invalid_segment; i++) 664 if (!mmu_entry_pool[i].locked) 665 break; 666 mmu_entry_pool[i].locked = 1; 667 sun4c_init_clean_segmap(i); 668 for (ctx = 0; ctx < num_contexts; ctx++) 669 prom_putsegment(ctx, start, mmu_entry_pool[i].pseg); 670 start += SUN4C_REAL_PGDIR_SIZE; 671 } 672} 673 674/* Don't change this struct without changing entry.S. This is used 675 * in the in-window kernel fault handler, and you don't want to mess 676 * with that. (See sun4c_fault in entry.S). 677 */ 678struct sun4c_mmu_ring { 679 struct sun4c_mmu_entry ringhd; 680 int num_entries; 681}; 682 683static struct sun4c_mmu_ring sun4c_context_ring[SUN4C_MAX_CONTEXTS]; /* used user entries */ 684static struct sun4c_mmu_ring sun4c_ufree_ring; /* free user entries */ 685static struct sun4c_mmu_ring sun4c_ulru_ring; /* LRU user entries */ 686struct sun4c_mmu_ring sun4c_kernel_ring; /* used kernel entries */ 687struct sun4c_mmu_ring sun4c_kfree_ring; /* free kernel entries */ 688 689static inline void sun4c_init_rings(void) 690{ 691 int i; 692 693 for (i = 0; i < SUN4C_MAX_CONTEXTS; i++) { 694 sun4c_context_ring[i].ringhd.next = 695 sun4c_context_ring[i].ringhd.prev = 696 &sun4c_context_ring[i].ringhd; 697 sun4c_context_ring[i].num_entries = 0; 698 } 699 sun4c_ufree_ring.ringhd.next = sun4c_ufree_ring.ringhd.prev = 700 &sun4c_ufree_ring.ringhd; 701 sun4c_ufree_ring.num_entries = 0; 702 sun4c_ulru_ring.ringhd.lru_next = sun4c_ulru_ring.ringhd.lru_prev = 703 &sun4c_ulru_ring.ringhd; 704 sun4c_ulru_ring.num_entries = 0; 705 sun4c_kernel_ring.ringhd.next = sun4c_kernel_ring.ringhd.prev = 706 &sun4c_kernel_ring.ringhd; 707 sun4c_kernel_ring.num_entries = 0; 708 sun4c_kfree_ring.ringhd.next = sun4c_kfree_ring.ringhd.prev = 709 &sun4c_kfree_ring.ringhd; 710 sun4c_kfree_ring.num_entries = 0; 711} 712 713static void add_ring(struct sun4c_mmu_ring *ring, 714 struct sun4c_mmu_entry *entry) 715{ 716 struct sun4c_mmu_entry *head = &ring->ringhd; 717 718 entry->prev = head; 719 (entry->next = head->next)->prev = entry; 720 head->next = entry; 721 ring->num_entries++; 722} 723 724static __inline__ void add_lru(struct sun4c_mmu_entry *entry) 725{ 726 struct sun4c_mmu_ring *ring = &sun4c_ulru_ring; 727 struct sun4c_mmu_entry *head = &ring->ringhd; 728 729 entry->lru_next = head; 730 (entry->lru_prev = head->lru_prev)->lru_next = entry; 731 head->lru_prev = entry; 732} 733 734static void add_ring_ordered(struct sun4c_mmu_ring *ring, 735 struct sun4c_mmu_entry *entry) 736{ 737 struct sun4c_mmu_entry *head = &ring->ringhd; 738 unsigned long addr = entry->vaddr; 739 740 while ((head->next != &ring->ringhd) && (head->next->vaddr < addr)) 741 head = head->next; 742 743 entry->prev = head; 744 (entry->next = head->next)->prev = entry; 745 head->next = entry; 746 ring->num_entries++; 747 748 add_lru(entry); 749} 750 751static __inline__ void remove_ring(struct sun4c_mmu_ring *ring, 752 struct sun4c_mmu_entry *entry) 753{ 754 struct sun4c_mmu_entry *next = entry->next; 755 756 (next->prev = entry->prev)->next = next; 757 ring->num_entries--; 758} 759 760static void remove_lru(struct sun4c_mmu_entry *entry) 761{ 762 struct sun4c_mmu_entry *next = entry->lru_next; 763 764 (next->lru_prev = entry->lru_prev)->lru_next = next; 765} 766 767static void free_user_entry(int ctx, struct sun4c_mmu_entry *entry) 768{ 769 remove_ring(sun4c_context_ring+ctx, entry); 770 remove_lru(entry); 771 add_ring(&sun4c_ufree_ring, entry); 772} 773 774static void free_kernel_entry(struct sun4c_mmu_entry *entry, 775 struct sun4c_mmu_ring *ring) 776{ 777 remove_ring(ring, entry); 778 add_ring(&sun4c_kfree_ring, entry); 779} 780 781static void __init sun4c_init_fill_kernel_ring(int howmany) 782{ 783 int i; 784 785 while (howmany) { 786 for (i = 0; i < invalid_segment; i++) 787 if (!mmu_entry_pool[i].locked) 788 break; 789 mmu_entry_pool[i].locked = 1; 790 sun4c_init_clean_segmap(i); 791 add_ring(&sun4c_kfree_ring, &mmu_entry_pool[i]); 792 howmany--; 793 } 794} 795 796static void __init sun4c_init_fill_user_ring(void) 797{ 798 int i; 799 800 for (i = 0; i < invalid_segment; i++) { 801 if (mmu_entry_pool[i].locked) 802 continue; 803 sun4c_init_clean_segmap(i); 804 add_ring(&sun4c_ufree_ring, &mmu_entry_pool[i]); 805 } 806} 807 808static void sun4c_kernel_unmap(struct sun4c_mmu_entry *kentry) 809{ 810 int savectx, ctx; 811 812 savectx = sun4c_get_context(); 813 for (ctx = 0; ctx < num_contexts; ctx++) { 814 sun4c_set_context(ctx); 815 sun4c_put_segmap(kentry->vaddr, invalid_segment); 816 } 817 sun4c_set_context(savectx); 818} 819 820static void sun4c_kernel_map(struct sun4c_mmu_entry *kentry) 821{ 822 int savectx, ctx; 823 824 savectx = sun4c_get_context(); 825 for (ctx = 0; ctx < num_contexts; ctx++) { 826 sun4c_set_context(ctx); 827 sun4c_put_segmap(kentry->vaddr, kentry->pseg); 828 } 829 sun4c_set_context(savectx); 830} 831 832#define sun4c_user_unmap(__entry) \ 833 sun4c_put_segmap((__entry)->vaddr, invalid_segment) 834 835static void sun4c_demap_context(struct sun4c_mmu_ring *crp, unsigned char ctx) 836{ 837 struct sun4c_mmu_entry *head = &crp->ringhd; 838 unsigned long flags; 839 840 local_irq_save(flags); 841 if (head->next != head) { 842 struct sun4c_mmu_entry *entry = head->next; 843 int savectx = sun4c_get_context(); 844 845 flush_user_windows(); 846 sun4c_set_context(ctx); 847 sun4c_flush_context(); 848 do { 849 struct sun4c_mmu_entry *next = entry->next; 850 851 sun4c_user_unmap(entry); 852 free_user_entry(ctx, entry); 853 854 entry = next; 855 } while (entry != head); 856 sun4c_set_context(savectx); 857 } 858 local_irq_restore(flags); 859} 860 861static int sun4c_user_taken_entries; /* This is how much we have. */ 862static int max_user_taken_entries; /* This limits us and prevents deadlock. */ 863 864static struct sun4c_mmu_entry *sun4c_kernel_strategy(void) 865{ 866 struct sun4c_mmu_entry *this_entry; 867 868 /* If some are free, return first one. */ 869 if (sun4c_kfree_ring.num_entries) { 870 this_entry = sun4c_kfree_ring.ringhd.next; 871 return this_entry; 872 } 873 874 /* Else free one up. */ 875 this_entry = sun4c_kernel_ring.ringhd.prev; 876 sun4c_flush_segment(this_entry->vaddr); 877 sun4c_kernel_unmap(this_entry); 878 free_kernel_entry(this_entry, &sun4c_kernel_ring); 879 this_entry = sun4c_kfree_ring.ringhd.next; 880 881 return this_entry; 882} 883 884/* Using this method to free up mmu entries eliminates a lot of 885 * potential races since we have a kernel that incurs tlb 886 * replacement faults. There may be performance penalties. 887 * 888 * NOTE: Must be called with interrupts disabled. 889 */ 890static struct sun4c_mmu_entry *sun4c_user_strategy(void) 891{ 892 struct sun4c_mmu_entry *entry; 893 unsigned char ctx; 894 int savectx; 895 896 /* If some are free, return first one. */ 897 if (sun4c_ufree_ring.num_entries) { 898 entry = sun4c_ufree_ring.ringhd.next; 899 goto unlink_out; 900 } 901 902 if (sun4c_user_taken_entries) { 903 entry = sun4c_kernel_strategy(); 904 sun4c_user_taken_entries--; 905 goto kunlink_out; 906 } 907 908 /* Grab from the beginning of the LRU list. */ 909 entry = sun4c_ulru_ring.ringhd.lru_next; 910 ctx = entry->ctx; 911 912 savectx = sun4c_get_context(); 913 flush_user_windows(); 914 sun4c_set_context(ctx); 915 sun4c_flush_segment(entry->vaddr); 916 sun4c_user_unmap(entry); 917 remove_ring(sun4c_context_ring + ctx, entry); 918 remove_lru(entry); 919 sun4c_set_context(savectx); 920 921 return entry; 922 923unlink_out: 924 remove_ring(&sun4c_ufree_ring, entry); 925 return entry; 926kunlink_out: 927 remove_ring(&sun4c_kfree_ring, entry); 928 return entry; 929} 930 931/* NOTE: Must be called with interrupts disabled. */ 932void sun4c_grow_kernel_ring(void) 933{ 934 struct sun4c_mmu_entry *entry; 935 936 /* Prevent deadlock condition. */ 937 if (sun4c_user_taken_entries >= max_user_taken_entries) 938 return; 939 940 if (sun4c_ufree_ring.num_entries) { 941 entry = sun4c_ufree_ring.ringhd.next; 942 remove_ring(&sun4c_ufree_ring, entry); 943 add_ring(&sun4c_kfree_ring, entry); 944 sun4c_user_taken_entries++; 945 } 946} 947 948/* 2 page buckets for task struct and kernel stack allocation. 949 * 950 * TASK_STACK_BEGIN 951 * bucket[0] 952 * bucket[1] 953 * [ ... ] 954 * bucket[NR_TASK_BUCKETS-1] 955 * TASK_STACK_BEGIN + (sizeof(struct task_bucket) * NR_TASK_BUCKETS) 956 * 957 * Each slot looks like: 958 * 959 * page 1 -- task struct + beginning of kernel stack 960 * page 2 -- rest of kernel stack 961 */ 962 963union task_union *sun4c_bucket[NR_TASK_BUCKETS]; 964 965static int sun4c_lowbucket_avail; 966 967#define BUCKET_EMPTY ((union task_union *) 0) 968#define BUCKET_SHIFT (PAGE_SHIFT + 1) /* log2(sizeof(struct task_bucket)) */ 969#define BUCKET_SIZE (1 << BUCKET_SHIFT) 970#define BUCKET_NUM(addr) ((((addr) - SUN4C_LOCK_VADDR) >> BUCKET_SHIFT)) 971#define BUCKET_ADDR(num) (((num) << BUCKET_SHIFT) + SUN4C_LOCK_VADDR) 972#define BUCKET_PTE(page) \ 973 ((((page) - PAGE_OFFSET) >> PAGE_SHIFT) | pgprot_val(SUN4C_PAGE_KERNEL)) 974#define BUCKET_PTE_PAGE(pte) \ 975 (PAGE_OFFSET + (((pte) & SUN4C_PFN_MASK) << PAGE_SHIFT)) 976 977static void get_locked_segment(unsigned long addr) 978{ 979 struct sun4c_mmu_entry *stolen; 980 unsigned long flags; 981 982 local_irq_save(flags); 983 addr &= SUN4C_REAL_PGDIR_MASK; 984 stolen = sun4c_user_strategy(); 985 max_user_taken_entries--; 986 stolen->vaddr = addr; 987 flush_user_windows(); 988 sun4c_kernel_map(stolen); 989 local_irq_restore(flags); 990} 991 992static void free_locked_segment(unsigned long addr) 993{ 994 struct sun4c_mmu_entry *entry; 995 unsigned long flags; 996 unsigned char pseg; 997 998 local_irq_save(flags); 999 addr &= SUN4C_REAL_PGDIR_MASK; 1000 pseg = sun4c_get_segmap(addr); 1001 entry = &mmu_entry_pool[pseg]; 1002 1003 flush_user_windows(); 1004 sun4c_flush_segment(addr); 1005 sun4c_kernel_unmap(entry); 1006 add_ring(&sun4c_ufree_ring, entry); 1007 max_user_taken_entries++; 1008 local_irq_restore(flags); 1009} 1010 1011static inline void garbage_collect(int entry) 1012{ 1013 int start, end; 1014 1015 /* 32 buckets per segment... */ 1016 entry &= ~31; 1017 start = entry; 1018 for (end = (start + 32); start < end; start++) 1019 if (sun4c_bucket[start] != BUCKET_EMPTY) 1020 return; 1021 1022 /* Entire segment empty, release it. */ 1023 free_locked_segment(BUCKET_ADDR(entry)); 1024} 1025 1026static struct thread_info *sun4c_alloc_thread_info(void) 1027{ 1028 unsigned long addr, pages; 1029 int entry; 1030 1031 pages = __get_free_pages(GFP_KERNEL, THREAD_INFO_ORDER); 1032 if (!pages) 1033 return NULL; 1034 1035 for (entry = sun4c_lowbucket_avail; entry < NR_TASK_BUCKETS; entry++) 1036 if (sun4c_bucket[entry] == BUCKET_EMPTY) 1037 break; 1038 if (entry == NR_TASK_BUCKETS) { 1039 free_pages(pages, THREAD_INFO_ORDER); 1040 return NULL; 1041 } 1042 if (entry >= sun4c_lowbucket_avail) 1043 sun4c_lowbucket_avail = entry + 1; 1044 1045 addr = BUCKET_ADDR(entry); 1046 sun4c_bucket[entry] = (union task_union *) addr; 1047 if(sun4c_get_segmap(addr) == invalid_segment) 1048 get_locked_segment(addr); 1049 1050 /* We are changing the virtual color of the page(s) 1051 * so we must flush the cache to guarantee consistency. 1052 */ 1053 sun4c_flush_page(pages); 1054#ifndef CONFIG_SUN4 1055 sun4c_flush_page(pages + PAGE_SIZE); 1056#endif 1057 1058 sun4c_put_pte(addr, BUCKET_PTE(pages)); 1059#ifndef CONFIG_SUN4 1060 sun4c_put_pte(addr + PAGE_SIZE, BUCKET_PTE(pages + PAGE_SIZE)); 1061#endif 1062 1063#ifdef CONFIG_DEBUG_STACK_USAGE 1064 memset((void *)addr, 0, PAGE_SIZE << THREAD_INFO_ORDER); 1065#endif /* DEBUG_STACK_USAGE */ 1066 1067 return (struct thread_info *) addr; 1068} 1069 1070static void sun4c_free_thread_info(struct thread_info *ti) 1071{ 1072 unsigned long tiaddr = (unsigned long) ti; 1073 unsigned long pages = BUCKET_PTE_PAGE(sun4c_get_pte(tiaddr)); 1074 int entry = BUCKET_NUM(tiaddr); 1075 1076 /* We are deleting a mapping, so the flush here is mandatory. */ 1077 sun4c_flush_page(tiaddr); 1078#ifndef CONFIG_SUN4 1079 sun4c_flush_page(tiaddr + PAGE_SIZE); 1080#endif 1081 sun4c_put_pte(tiaddr, 0); 1082#ifndef CONFIG_SUN4 1083 sun4c_put_pte(tiaddr + PAGE_SIZE, 0); 1084#endif 1085 sun4c_bucket[entry] = BUCKET_EMPTY; 1086 if (entry < sun4c_lowbucket_avail) 1087 sun4c_lowbucket_avail = entry; 1088 1089 free_pages(pages, THREAD_INFO_ORDER); 1090 garbage_collect(entry); 1091} 1092 1093static void __init sun4c_init_buckets(void) 1094{ 1095 int entry; 1096 1097 if (sizeof(union thread_union) != (PAGE_SIZE << THREAD_INFO_ORDER)) { 1098 extern void thread_info_size_is_bolixed_pete(void); 1099 thread_info_size_is_bolixed_pete(); 1100 } 1101 1102 for (entry = 0; entry < NR_TASK_BUCKETS; entry++) 1103 sun4c_bucket[entry] = BUCKET_EMPTY; 1104 sun4c_lowbucket_avail = 0; 1105} 1106 1107static unsigned long sun4c_iobuffer_start; 1108static unsigned long sun4c_iobuffer_end; 1109static unsigned long sun4c_iobuffer_high; 1110static unsigned long *sun4c_iobuffer_map; 1111static int iobuffer_map_size; 1112 1113/* 1114 * Alias our pages so they do not cause a trap. 1115 * Also one page may be aliased into several I/O areas and we may 1116 * finish these I/O separately. 1117 */ 1118static char *sun4c_lockarea(char *vaddr, unsigned long size) 1119{ 1120 unsigned long base, scan; 1121 unsigned long npages; 1122 unsigned long vpage; 1123 unsigned long pte; 1124 unsigned long apage; 1125 unsigned long high; 1126 unsigned long flags; 1127 1128 npages = (((unsigned long)vaddr & ~PAGE_MASK) + 1129 size + (PAGE_SIZE-1)) >> PAGE_SHIFT; 1130 1131 scan = 0; 1132 local_irq_save(flags); 1133 for (;;) { 1134 scan = find_next_zero_bit(sun4c_iobuffer_map, 1135 iobuffer_map_size, scan); 1136 if ((base = scan) + npages > iobuffer_map_size) goto abend; 1137 for (;;) { 1138 if (scan >= base + npages) goto found; 1139 if (test_bit(scan, sun4c_iobuffer_map)) break; 1140 scan++; 1141 } 1142 } 1143 1144found: 1145 high = ((base + npages) << PAGE_SHIFT) + sun4c_iobuffer_start; 1146 high = SUN4C_REAL_PGDIR_ALIGN(high); 1147 while (high > sun4c_iobuffer_high) { 1148 get_locked_segment(sun4c_iobuffer_high); 1149 sun4c_iobuffer_high += SUN4C_REAL_PGDIR_SIZE; 1150 } 1151 1152 vpage = ((unsigned long) vaddr) & PAGE_MASK; 1153 for (scan = base; scan < base+npages; scan++) { 1154 pte = ((vpage-PAGE_OFFSET) >> PAGE_SHIFT); 1155 pte |= pgprot_val(SUN4C_PAGE_KERNEL); 1156 pte |= _SUN4C_PAGE_NOCACHE; 1157 set_bit(scan, sun4c_iobuffer_map); 1158 apage = (scan << PAGE_SHIFT) + sun4c_iobuffer_start; 1159 1160 /* Flush original mapping so we see the right things later. */ 1161 sun4c_flush_page(vpage); 1162 1163 sun4c_put_pte(apage, pte); 1164 vpage += PAGE_SIZE; 1165 } 1166 local_irq_restore(flags); 1167 return (char *) ((base << PAGE_SHIFT) + sun4c_iobuffer_start + 1168 (((unsigned long) vaddr) & ~PAGE_MASK)); 1169 1170abend: 1171 local_irq_restore(flags); 1172 printk("DMA vaddr=0x%p size=%08lx\n", vaddr, size); 1173 panic("Out of iobuffer table"); 1174 return NULL; 1175} 1176 1177static void sun4c_unlockarea(char *vaddr, unsigned long size) 1178{ 1179 unsigned long vpage, npages; 1180 unsigned long flags; 1181 int scan, high; 1182 1183 vpage = (unsigned long)vaddr & PAGE_MASK; 1184 npages = (((unsigned long)vaddr & ~PAGE_MASK) + 1185 size + (PAGE_SIZE-1)) >> PAGE_SHIFT; 1186 1187 local_irq_save(flags); 1188 while (npages != 0) { 1189 --npages; 1190 1191 /* This mapping is marked non-cachable, no flush necessary. */ 1192 sun4c_put_pte(vpage, 0); 1193 clear_bit((vpage - sun4c_iobuffer_start) >> PAGE_SHIFT, 1194 sun4c_iobuffer_map); 1195 vpage += PAGE_SIZE; 1196 } 1197 1198 /* garbage collect */ 1199 scan = (sun4c_iobuffer_high - sun4c_iobuffer_start) >> PAGE_SHIFT; 1200 while (scan >= 0 && !sun4c_iobuffer_map[scan >> 5]) 1201 scan -= 32; 1202 scan += 32; 1203 high = sun4c_iobuffer_start + (scan << PAGE_SHIFT); 1204 high = SUN4C_REAL_PGDIR_ALIGN(high) + SUN4C_REAL_PGDIR_SIZE; 1205 while (high < sun4c_iobuffer_high) { 1206 sun4c_iobuffer_high -= SUN4C_REAL_PGDIR_SIZE; 1207 free_locked_segment(sun4c_iobuffer_high); 1208 } 1209 local_irq_restore(flags); 1210} 1211 1212/* Note the scsi code at init time passes to here buffers 1213 * which sit on the kernel stack, those are already locked 1214 * by implication and fool the page locking code above 1215 * if passed to by mistake. 1216 */ 1217static __u32 sun4c_get_scsi_one(char *bufptr, unsigned long len, struct sbus_bus *sbus) 1218{ 1219 unsigned long page; 1220 1221 page = ((unsigned long)bufptr) & PAGE_MASK; 1222 if (!virt_addr_valid(page)) { 1223 sun4c_flush_page(page); 1224 return (__u32)bufptr; /* already locked */ 1225 } 1226 return (__u32)sun4c_lockarea(bufptr, len); 1227} 1228 1229static void sun4c_get_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_bus *sbus) 1230{ 1231 while (sz != 0) { 1232 --sz; 1233 sg[sz].dvma_address = (__u32)sun4c_lockarea(page_address(sg[sz].page) + sg[sz].offset, sg[sz].length); 1234 sg[sz].dvma_length = sg[sz].length; 1235 } 1236} 1237 1238static void sun4c_release_scsi_one(__u32 bufptr, unsigned long len, struct sbus_bus *sbus) 1239{ 1240 if (bufptr < sun4c_iobuffer_start) 1241 return; /* On kernel stack or similar, see above */ 1242 sun4c_unlockarea((char *)bufptr, len); 1243} 1244 1245static void sun4c_release_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_bus *sbus) 1246{ 1247 while (sz != 0) { 1248 --sz; 1249 sun4c_unlockarea((char *)sg[sz].dvma_address, sg[sz].length); 1250 } 1251} 1252 1253#define TASK_ENTRY_SIZE BUCKET_SIZE /* see above */ 1254#define LONG_ALIGN(x) (((x)+(sizeof(long))-1)&~((sizeof(long))-1)) 1255 1256struct vm_area_struct sun4c_kstack_vma; 1257 1258static void __init sun4c_init_lock_areas(void) 1259{ 1260 unsigned long sun4c_taskstack_start; 1261 unsigned long sun4c_taskstack_end; 1262 int bitmap_size; 1263 1264 sun4c_init_buckets(); 1265 sun4c_taskstack_start = SUN4C_LOCK_VADDR; 1266 sun4c_taskstack_end = (sun4c_taskstack_start + 1267 (TASK_ENTRY_SIZE * NR_TASK_BUCKETS)); 1268 if (sun4c_taskstack_end >= SUN4C_LOCK_END) { 1269 prom_printf("Too many tasks, decrease NR_TASK_BUCKETS please.\n"); 1270 prom_halt(); 1271 } 1272 1273 sun4c_iobuffer_start = sun4c_iobuffer_high = 1274 SUN4C_REAL_PGDIR_ALIGN(sun4c_taskstack_end); 1275 sun4c_iobuffer_end = SUN4C_LOCK_END; 1276 bitmap_size = (sun4c_iobuffer_end - sun4c_iobuffer_start) >> PAGE_SHIFT; 1277 bitmap_size = (bitmap_size + 7) >> 3; 1278 bitmap_size = LONG_ALIGN(bitmap_size); 1279 iobuffer_map_size = bitmap_size << 3; 1280 sun4c_iobuffer_map = __alloc_bootmem(bitmap_size, SMP_CACHE_BYTES, 0UL); 1281 memset((void *) sun4c_iobuffer_map, 0, bitmap_size); 1282 1283 sun4c_kstack_vma.vm_mm = &init_mm; 1284 sun4c_kstack_vma.vm_start = sun4c_taskstack_start; 1285 sun4c_kstack_vma.vm_end = sun4c_taskstack_end; 1286 sun4c_kstack_vma.vm_page_prot = PAGE_SHARED; 1287 sun4c_kstack_vma.vm_flags = VM_READ | VM_WRITE | VM_EXEC; 1288 insert_vm_struct(&init_mm, &sun4c_kstack_vma); 1289} 1290 1291/* Cache flushing on the sun4c. */ 1292static void sun4c_flush_cache_all(void) 1293{ 1294 unsigned long begin, end; 1295 1296 flush_user_windows(); 1297 begin = (KERNBASE + SUN4C_REAL_PGDIR_SIZE); 1298 end = (begin + SUN4C_VAC_SIZE); 1299 1300 if (sun4c_vacinfo.linesize == 32) { 1301 while (begin < end) { 1302 __asm__ __volatile__( 1303 "ld [%0 + 0x00], %%g0\n\t" 1304 "ld [%0 + 0x20], %%g0\n\t" 1305 "ld [%0 + 0x40], %%g0\n\t" 1306 "ld [%0 + 0x60], %%g0\n\t" 1307 "ld [%0 + 0x80], %%g0\n\t" 1308 "ld [%0 + 0xa0], %%g0\n\t" 1309 "ld [%0 + 0xc0], %%g0\n\t" 1310 "ld [%0 + 0xe0], %%g0\n\t" 1311 "ld [%0 + 0x100], %%g0\n\t" 1312 "ld [%0 + 0x120], %%g0\n\t" 1313 "ld [%0 + 0x140], %%g0\n\t" 1314 "ld [%0 + 0x160], %%g0\n\t" 1315 "ld [%0 + 0x180], %%g0\n\t" 1316 "ld [%0 + 0x1a0], %%g0\n\t" 1317 "ld [%0 + 0x1c0], %%g0\n\t" 1318 "ld [%0 + 0x1e0], %%g0\n" 1319 : : "r" (begin)); 1320 begin += 512; 1321 } 1322 } else { 1323 while (begin < end) { 1324 __asm__ __volatile__( 1325 "ld [%0 + 0x00], %%g0\n\t" 1326 "ld [%0 + 0x10], %%g0\n\t" 1327 "ld [%0 + 0x20], %%g0\n\t" 1328 "ld [%0 + 0x30], %%g0\n\t" 1329 "ld [%0 + 0x40], %%g0\n\t" 1330 "ld [%0 + 0x50], %%g0\n\t" 1331 "ld [%0 + 0x60], %%g0\n\t" 1332 "ld [%0 + 0x70], %%g0\n\t" 1333 "ld [%0 + 0x80], %%g0\n\t" 1334 "ld [%0 + 0x90], %%g0\n\t" 1335 "ld [%0 + 0xa0], %%g0\n\t" 1336 "ld [%0 + 0xb0], %%g0\n\t" 1337 "ld [%0 + 0xc0], %%g0\n\t" 1338 "ld [%0 + 0xd0], %%g0\n\t" 1339 "ld [%0 + 0xe0], %%g0\n\t" 1340 "ld [%0 + 0xf0], %%g0\n" 1341 : : "r" (begin)); 1342 begin += 256; 1343 } 1344 } 1345} 1346 1347static void sun4c_flush_cache_mm(struct mm_struct *mm) 1348{ 1349 int new_ctx = mm->context; 1350 1351 if (new_ctx != NO_CONTEXT) { 1352 flush_user_windows(); 1353 1354 if (sun4c_context_ring[new_ctx].num_entries) { 1355 struct sun4c_mmu_entry *head = &sun4c_context_ring[new_ctx].ringhd; 1356 unsigned long flags; 1357 1358 local_irq_save(flags); 1359 if (head->next != head) { 1360 struct sun4c_mmu_entry *entry = head->next; 1361 int savectx = sun4c_get_context(); 1362 1363 sun4c_set_context(new_ctx); 1364 sun4c_flush_context(); 1365 do { 1366 struct sun4c_mmu_entry *next = entry->next; 1367 1368 sun4c_user_unmap(entry); 1369 free_user_entry(new_ctx, entry); 1370 1371 entry = next; 1372 } while (entry != head); 1373 sun4c_set_context(savectx); 1374 } 1375 local_irq_restore(flags); 1376 } 1377 } 1378} 1379 1380static void sun4c_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) 1381{ 1382 struct mm_struct *mm = vma->vm_mm; 1383 int new_ctx = mm->context; 1384 1385 if (new_ctx != NO_CONTEXT) { 1386 struct sun4c_mmu_entry *head = &sun4c_context_ring[new_ctx].ringhd; 1387 struct sun4c_mmu_entry *entry; 1388 unsigned long flags; 1389 1390 flush_user_windows(); 1391 1392 local_irq_save(flags); 1393 /* All user segmap chains are ordered on entry->vaddr. */ 1394 for (entry = head->next; 1395 (entry != head) && ((entry->vaddr+SUN4C_REAL_PGDIR_SIZE) < start); 1396 entry = entry->next) 1397 ; 1398 1399 /* Tracing various job mixtures showed that this conditional 1400 * only passes ~35% of the time for most worse case situations, 1401 * therefore we avoid all of this gross overhead ~65% of the time. 1402 */ 1403 if ((entry != head) && (entry->vaddr < end)) { 1404 int octx = sun4c_get_context(); 1405 sun4c_set_context(new_ctx); 1406 1407 /* At this point, always, (start >= entry->vaddr) and 1408 * (entry->vaddr < end), once the latter condition 1409 * ceases to hold, or we hit the end of the list, we 1410 * exit the loop. The ordering of all user allocated 1411 * segmaps makes this all work out so beautifully. 1412 */ 1413 do { 1414 struct sun4c_mmu_entry *next = entry->next; 1415 unsigned long realend; 1416 1417 /* "realstart" is always >= entry->vaddr */ 1418 realend = entry->vaddr + SUN4C_REAL_PGDIR_SIZE; 1419 if (end < realend) 1420 realend = end; 1421 if ((realend - entry->vaddr) <= (PAGE_SIZE << 3)) { 1422 unsigned long page = entry->vaddr; 1423 while (page < realend) { 1424 sun4c_flush_page(page); 1425 page += PAGE_SIZE; 1426 } 1427 } else { 1428 sun4c_flush_segment(entry->vaddr); 1429 sun4c_user_unmap(entry); 1430 free_user_entry(new_ctx, entry); 1431 } 1432 entry = next; 1433 } while ((entry != head) && (entry->vaddr < end)); 1434 sun4c_set_context(octx); 1435 } 1436 local_irq_restore(flags); 1437 } 1438} 1439 1440static void sun4c_flush_cache_page(struct vm_area_struct *vma, unsigned long page) 1441{ 1442 struct mm_struct *mm = vma->vm_mm; 1443 int new_ctx = mm->context; 1444 1445 /* Sun4c has no separate I/D caches so cannot optimize for non 1446 * text page flushes. 1447 */ 1448 if (new_ctx != NO_CONTEXT) { 1449 int octx = sun4c_get_context(); 1450 unsigned long flags; 1451 1452 flush_user_windows(); 1453 local_irq_save(flags); 1454 sun4c_set_context(new_ctx); 1455 sun4c_flush_page(page); 1456 sun4c_set_context(octx); 1457 local_irq_restore(flags); 1458 } 1459} 1460 1461static void sun4c_flush_page_to_ram(unsigned long page) 1462{ 1463 unsigned long flags; 1464 1465 local_irq_save(flags); 1466 sun4c_flush_page(page); 1467 local_irq_restore(flags); 1468} 1469 1470/* Sun4c cache is unified, both instructions and data live there, so 1471 * no need to flush the on-stack instructions for new signal handlers. 1472 */ 1473static void sun4c_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr) 1474{ 1475} 1476 1477/* TLB flushing on the sun4c. These routines count on the cache 1478 * flushing code to flush the user register windows so that we need 1479 * not do so when we get here. 1480 */ 1481 1482static void sun4c_flush_tlb_all(void) 1483{ 1484 struct sun4c_mmu_entry *this_entry, *next_entry; 1485 unsigned long flags; 1486 int savectx, ctx; 1487 1488 local_irq_save(flags); 1489 this_entry = sun4c_kernel_ring.ringhd.next; 1490 savectx = sun4c_get_context(); 1491 flush_user_windows(); 1492 while (sun4c_kernel_ring.num_entries) { 1493 next_entry = this_entry->next; 1494 sun4c_flush_segment(this_entry->vaddr); 1495 for (ctx = 0; ctx < num_contexts; ctx++) { 1496 sun4c_set_context(ctx); 1497 sun4c_put_segmap(this_entry->vaddr, invalid_segment); 1498 } 1499 free_kernel_entry(this_entry, &sun4c_kernel_ring); 1500 this_entry = next_entry; 1501 } 1502 sun4c_set_context(savectx); 1503 local_irq_restore(flags); 1504} 1505 1506static void sun4c_flush_tlb_mm(struct mm_struct *mm) 1507{ 1508 int new_ctx = mm->context; 1509 1510 if (new_ctx != NO_CONTEXT) { 1511 struct sun4c_mmu_entry *head = &sun4c_context_ring[new_ctx].ringhd; 1512 unsigned long flags; 1513 1514 local_irq_save(flags); 1515 if (head->next != head) { 1516 struct sun4c_mmu_entry *entry = head->next; 1517 int savectx = sun4c_get_context(); 1518 1519 sun4c_set_context(new_ctx); 1520 sun4c_flush_context(); 1521 do { 1522 struct sun4c_mmu_entry *next = entry->next; 1523 1524 sun4c_user_unmap(entry); 1525 free_user_entry(new_ctx, entry); 1526 1527 entry = next; 1528 } while (entry != head); 1529 sun4c_set_context(savectx); 1530 } 1531 local_irq_restore(flags); 1532 } 1533} 1534 1535static void sun4c_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) 1536{ 1537 struct mm_struct *mm = vma->vm_mm; 1538 int new_ctx = mm->context; 1539 1540 if (new_ctx != NO_CONTEXT) { 1541 struct sun4c_mmu_entry *head = &sun4c_context_ring[new_ctx].ringhd; 1542 struct sun4c_mmu_entry *entry; 1543 unsigned long flags; 1544 1545 local_irq_save(flags); 1546 /* See commentary in sun4c_flush_cache_range(). */ 1547 for (entry = head->next; 1548 (entry != head) && ((entry->vaddr+SUN4C_REAL_PGDIR_SIZE) < start); 1549 entry = entry->next) 1550 ; 1551 1552 if ((entry != head) && (entry->vaddr < end)) { 1553 int octx = sun4c_get_context(); 1554 1555 sun4c_set_context(new_ctx); 1556 do { 1557 struct sun4c_mmu_entry *next = entry->next; 1558 1559 sun4c_flush_segment(entry->vaddr); 1560 sun4c_user_unmap(entry); 1561 free_user_entry(new_ctx, entry); 1562 1563 entry = next; 1564 } while ((entry != head) && (entry->vaddr < end)); 1565 sun4c_set_context(octx); 1566 } 1567 local_irq_restore(flags); 1568 } 1569} 1570 1571static void sun4c_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) 1572{ 1573 struct mm_struct *mm = vma->vm_mm; 1574 int new_ctx = mm->context; 1575 1576 if (new_ctx != NO_CONTEXT) { 1577 int savectx = sun4c_get_context(); 1578 unsigned long flags; 1579 1580 local_irq_save(flags); 1581 sun4c_set_context(new_ctx); 1582 page &= PAGE_MASK; 1583 sun4c_flush_page(page); 1584 sun4c_put_pte(page, 0); 1585 sun4c_set_context(savectx); 1586 local_irq_restore(flags); 1587 } 1588} 1589 1590static inline void sun4c_mapioaddr(unsigned long physaddr, unsigned long virt_addr) 1591{ 1592 unsigned long page_entry; 1593 1594 page_entry = ((physaddr >> PAGE_SHIFT) & SUN4C_PFN_MASK); 1595 page_entry |= ((pg_iobits | _SUN4C_PAGE_PRIV) & ~(_SUN4C_PAGE_PRESENT)); 1596 sun4c_put_pte(virt_addr, page_entry); 1597} 1598 1599static void sun4c_mapiorange(unsigned int bus, unsigned long xpa, 1600 unsigned long xva, unsigned int len) 1601{ 1602 while (len != 0) { 1603 len -= PAGE_SIZE; 1604 sun4c_mapioaddr(xpa, xva); 1605 xva += PAGE_SIZE; 1606 xpa += PAGE_SIZE; 1607 } 1608} 1609 1610static void sun4c_unmapiorange(unsigned long virt_addr, unsigned int len) 1611{ 1612 while (len != 0) { 1613 len -= PAGE_SIZE; 1614 sun4c_put_pte(virt_addr, 0); 1615 virt_addr += PAGE_SIZE; 1616 } 1617} 1618 1619static void sun4c_alloc_context(struct mm_struct *old_mm, struct mm_struct *mm) 1620{ 1621 struct ctx_list *ctxp; 1622 1623 ctxp = ctx_free.next; 1624 if (ctxp != &ctx_free) { 1625 remove_from_ctx_list(ctxp); 1626 add_to_used_ctxlist(ctxp); 1627 mm->context = ctxp->ctx_number; 1628 ctxp->ctx_mm = mm; 1629 return; 1630 } 1631 ctxp = ctx_used.next; 1632 if (ctxp->ctx_mm == old_mm) 1633 ctxp = ctxp->next; 1634 remove_from_ctx_list(ctxp); 1635 add_to_used_ctxlist(ctxp); 1636 ctxp->ctx_mm->context = NO_CONTEXT; 1637 ctxp->ctx_mm = mm; 1638 mm->context = ctxp->ctx_number; 1639 sun4c_demap_context(&sun4c_context_ring[ctxp->ctx_number], 1640 ctxp->ctx_number); 1641} 1642 1643/* Switch the current MM context. */ 1644static void sun4c_switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, struct task_struct *tsk, int cpu) 1645{ 1646 struct ctx_list *ctx; 1647 int dirty = 0; 1648 1649 if (mm->context == NO_CONTEXT) { 1650 dirty = 1; 1651 sun4c_alloc_context(old_mm, mm); 1652 } else { 1653 /* Update the LRU ring of contexts. */ 1654 ctx = ctx_list_pool + mm->context; 1655 remove_from_ctx_list(ctx); 1656 add_to_used_ctxlist(ctx); 1657 } 1658 if (dirty || old_mm != mm) 1659 sun4c_set_context(mm->context); 1660} 1661 1662static void sun4c_destroy_context(struct mm_struct *mm) 1663{ 1664 struct ctx_list *ctx_old; 1665 1666 if (mm->context != NO_CONTEXT) { 1667 sun4c_demap_context(&sun4c_context_ring[mm->context], mm->context); 1668 ctx_old = ctx_list_pool + mm->context; 1669 remove_from_ctx_list(ctx_old); 1670 add_to_free_ctxlist(ctx_old); 1671 mm->context = NO_CONTEXT; 1672 } 1673} 1674 1675static void sun4c_mmu_info(struct seq_file *m) 1676{ 1677 int used_user_entries, i; 1678 1679 used_user_entries = 0; 1680 for (i = 0; i < num_contexts; i++) 1681 used_user_entries += sun4c_context_ring[i].num_entries; 1682 1683 seq_printf(m, 1684 "vacsize\t\t: %d bytes\n" 1685 "vachwflush\t: %s\n" 1686 "vaclinesize\t: %d bytes\n" 1687 "mmuctxs\t\t: %d\n" 1688 "mmupsegs\t: %d\n" 1689 "kernelpsegs\t: %d\n" 1690 "kfreepsegs\t: %d\n" 1691 "usedpsegs\t: %d\n" 1692 "ufreepsegs\t: %d\n" 1693 "user_taken\t: %d\n" 1694 "max_taken\t: %d\n", 1695 sun4c_vacinfo.num_bytes, 1696 (sun4c_vacinfo.do_hwflushes ? "yes" : "no"), 1697 sun4c_vacinfo.linesize, 1698 num_contexts, 1699 (invalid_segment + 1), 1700 sun4c_kernel_ring.num_entries, 1701 sun4c_kfree_ring.num_entries, 1702 used_user_entries, 1703 sun4c_ufree_ring.num_entries, 1704 sun4c_user_taken_entries, 1705 max_user_taken_entries); 1706} 1707 1708/* Nothing below here should touch the mmu hardware nor the mmu_entry 1709 * data structures. 1710 */ 1711 1712/* First the functions which the mid-level code uses to directly 1713 * manipulate the software page tables. Some defines since we are 1714 * emulating the i386 page directory layout. 1715 */ 1716#define PGD_PRESENT 0x001 1717#define PGD_RW 0x002 1718#define PGD_USER 0x004 1719#define PGD_ACCESSED 0x020 1720#define PGD_DIRTY 0x040 1721#define PGD_TABLE (PGD_PRESENT | PGD_RW | PGD_USER | PGD_ACCESSED | PGD_DIRTY) 1722 1723static void sun4c_set_pte(pte_t *ptep, pte_t pte) 1724{ 1725 *ptep = pte; 1726} 1727 1728static void sun4c_pgd_set(pgd_t * pgdp, pmd_t * pmdp) 1729{ 1730} 1731 1732static void sun4c_pmd_set(pmd_t * pmdp, pte_t * ptep) 1733{ 1734 pmdp->pmdv[0] = PGD_TABLE | (unsigned long) ptep; 1735} 1736 1737static void sun4c_pmd_populate(pmd_t * pmdp, struct page * ptep) 1738{ 1739 if (page_address(ptep) == NULL) BUG(); /* No highmem on sun4c */ 1740 pmdp->pmdv[0] = PGD_TABLE | (unsigned long) page_address(ptep); 1741} 1742 1743static int sun4c_pte_present(pte_t pte) 1744{ 1745 return ((pte_val(pte) & (_SUN4C_PAGE_PRESENT | _SUN4C_PAGE_PRIV)) != 0); 1746} 1747static void sun4c_pte_clear(pte_t *ptep) { *ptep = __pte(0); } 1748 1749static int sun4c_pte_read(pte_t pte) 1750{ 1751 return (pte_val(pte) & _SUN4C_PAGE_READ); 1752} 1753 1754static int sun4c_pmd_bad(pmd_t pmd) 1755{ 1756 return (((pmd_val(pmd) & ~PAGE_MASK) != PGD_TABLE) || 1757 (!virt_addr_valid(pmd_val(pmd)))); 1758} 1759 1760static int sun4c_pmd_present(pmd_t pmd) 1761{ 1762 return ((pmd_val(pmd) & PGD_PRESENT) != 0); 1763} 1764 1765#if 0 /* if PMD takes one word */ 1766static void sun4c_pmd_clear(pmd_t *pmdp) { *pmdp = __pmd(0); } 1767#else /* if pmd_t is a longish aggregate */ 1768static void sun4c_pmd_clear(pmd_t *pmdp) { 1769 memset((void *)pmdp, 0, sizeof(pmd_t)); 1770} 1771#endif 1772 1773static int sun4c_pgd_none(pgd_t pgd) { return 0; } 1774static int sun4c_pgd_bad(pgd_t pgd) { return 0; } 1775static int sun4c_pgd_present(pgd_t pgd) { return 1; } 1776static void sun4c_pgd_clear(pgd_t * pgdp) { } 1777 1778/* 1779 * The following only work if pte_present() is true. 1780 * Undefined behaviour if not.. 1781 */ 1782static pte_t sun4c_pte_mkwrite(pte_t pte) 1783{ 1784 pte = __pte(pte_val(pte) | _SUN4C_PAGE_WRITE); 1785 if (pte_val(pte) & _SUN4C_PAGE_MODIFIED) 1786 pte = __pte(pte_val(pte) | _SUN4C_PAGE_SILENT_WRITE); 1787 return pte; 1788} 1789 1790static pte_t sun4c_pte_mkdirty(pte_t pte) 1791{ 1792 pte = __pte(pte_val(pte) | _SUN4C_PAGE_MODIFIED); 1793 if (pte_val(pte) & _SUN4C_PAGE_WRITE) 1794 pte = __pte(pte_val(pte) | _SUN4C_PAGE_SILENT_WRITE); 1795 return pte; 1796} 1797 1798static pte_t sun4c_pte_mkyoung(pte_t pte) 1799{ 1800 pte = __pte(pte_val(pte) | _SUN4C_PAGE_ACCESSED); 1801 if (pte_val(pte) & _SUN4C_PAGE_READ) 1802 pte = __pte(pte_val(pte) | _SUN4C_PAGE_SILENT_READ); 1803 return pte; 1804} 1805 1806/* 1807 * Conversion functions: convert a page and protection to a page entry, 1808 * and a page entry and page directory to the page they refer to. 1809 */ 1810static pte_t sun4c_mk_pte(struct page *page, pgprot_t pgprot) 1811{ 1812 return __pte(page_to_pfn(page) | pgprot_val(pgprot)); 1813} 1814 1815static pte_t sun4c_mk_pte_phys(unsigned long phys_page, pgprot_t pgprot) 1816{ 1817 return __pte((phys_page >> PAGE_SHIFT) | pgprot_val(pgprot)); 1818} 1819 1820static pte_t sun4c_mk_pte_io(unsigned long page, pgprot_t pgprot, int space) 1821{ 1822 return __pte(((page - PAGE_OFFSET) >> PAGE_SHIFT) | pgprot_val(pgprot)); 1823} 1824 1825static unsigned long sun4c_pte_pfn(pte_t pte) 1826{ 1827 return pte_val(pte) & SUN4C_PFN_MASK; 1828} 1829 1830static pte_t sun4c_pgoff_to_pte(unsigned long pgoff) 1831{ 1832 return __pte(pgoff | _SUN4C_PAGE_FILE); 1833} 1834 1835static unsigned long sun4c_pte_to_pgoff(pte_t pte) 1836{ 1837 return pte_val(pte) & ((1UL << PTE_FILE_MAX_BITS) - 1); 1838} 1839 1840 1841static __inline__ unsigned long sun4c_pmd_page_v(pmd_t pmd) 1842{ 1843 return (pmd_val(pmd) & PAGE_MASK); 1844} 1845 1846static struct page *sun4c_pmd_page(pmd_t pmd) 1847{ 1848 return virt_to_page(sun4c_pmd_page_v(pmd)); 1849} 1850 1851static unsigned long sun4c_pgd_page(pgd_t pgd) { return 0; } 1852 1853/* to find an entry in a page-table-directory */ 1854static inline pgd_t *sun4c_pgd_offset(struct mm_struct * mm, unsigned long address) 1855{ 1856 return mm->pgd + (address >> SUN4C_PGDIR_SHIFT); 1857} 1858 1859/* Find an entry in the second-level page table.. */ 1860static pmd_t *sun4c_pmd_offset(pgd_t * dir, unsigned long address) 1861{ 1862 return (pmd_t *) dir; 1863} 1864 1865/* Find an entry in the third-level page table.. */ 1866pte_t *sun4c_pte_offset_kernel(pmd_t * dir, unsigned long address) 1867{ 1868 return (pte_t *) sun4c_pmd_page_v(*dir) + 1869 ((address >> PAGE_SHIFT) & (SUN4C_PTRS_PER_PTE - 1)); 1870} 1871 1872static unsigned long sun4c_swp_type(swp_entry_t entry) 1873{ 1874 return (entry.val & SUN4C_SWP_TYPE_MASK); 1875} 1876 1877static unsigned long sun4c_swp_offset(swp_entry_t entry) 1878{ 1879 return (entry.val >> SUN4C_SWP_OFF_SHIFT) & SUN4C_SWP_OFF_MASK; 1880} 1881 1882static swp_entry_t sun4c_swp_entry(unsigned long type, unsigned long offset) 1883{ 1884 return (swp_entry_t) { 1885 (offset & SUN4C_SWP_OFF_MASK) << SUN4C_SWP_OFF_SHIFT 1886 | (type & SUN4C_SWP_TYPE_MASK) }; 1887} 1888 1889static void sun4c_free_pte_slow(pte_t *pte) 1890{ 1891 free_page((unsigned long)pte); 1892} 1893 1894static void sun4c_free_pgd_slow(pgd_t *pgd) 1895{ 1896 free_page((unsigned long)pgd); 1897} 1898 1899static pgd_t *sun4c_get_pgd_fast(void) 1900{ 1901 unsigned long *ret; 1902 1903 if ((ret = pgd_quicklist) != NULL) { 1904 pgd_quicklist = (unsigned long *)(*ret); 1905 ret[0] = ret[1]; 1906 pgtable_cache_size--; 1907 } else { 1908 pgd_t *init; 1909 1910 ret = (unsigned long *)__get_free_page(GFP_KERNEL); 1911 memset (ret, 0, (KERNBASE / SUN4C_PGDIR_SIZE) * sizeof(pgd_t)); 1912 init = sun4c_pgd_offset(&init_mm, 0); 1913 memcpy (((pgd_t *)ret) + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, 1914 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); 1915 } 1916 return (pgd_t *)ret; 1917} 1918 1919static void sun4c_free_pgd_fast(pgd_t *pgd) 1920{ 1921 *(unsigned long *)pgd = (unsigned long) pgd_quicklist; 1922 pgd_quicklist = (unsigned long *) pgd; 1923 pgtable_cache_size++; 1924} 1925 1926 1927static __inline__ pte_t * 1928sun4c_pte_alloc_one_fast(struct mm_struct *mm, unsigned long address) 1929{ 1930 unsigned long *ret; 1931 1932 if ((ret = (unsigned long *)pte_quicklist) != NULL) { 1933 pte_quicklist = (unsigned long *)(*ret); 1934 ret[0] = ret[1]; 1935 pgtable_cache_size--; 1936 } 1937 return (pte_t *)ret; 1938} 1939 1940static pte_t *sun4c_pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) 1941{ 1942 pte_t *pte; 1943 1944 if ((pte = sun4c_pte_alloc_one_fast(mm, address)) != NULL) 1945 return pte; 1946 1947 pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); 1948 if (pte) 1949 memset(pte, 0, PAGE_SIZE); 1950 return pte; 1951} 1952 1953static struct page *sun4c_pte_alloc_one(struct mm_struct *mm, unsigned long address) 1954{ 1955 pte_t *pte = sun4c_pte_alloc_one_kernel(mm, address); 1956 if (pte == NULL) 1957 return NULL; 1958 return virt_to_page(pte); 1959} 1960 1961static __inline__ void sun4c_free_pte_fast(pte_t *pte) 1962{ 1963 *(unsigned long *)pte = (unsigned long) pte_quicklist; 1964 pte_quicklist = (unsigned long *) pte; 1965 pgtable_cache_size++; 1966} 1967 1968static void sun4c_pte_free(struct page *pte) 1969{ 1970 sun4c_free_pte_fast(page_address(pte)); 1971} 1972 1973/* 1974 * allocating and freeing a pmd is trivial: the 1-entry pmd is 1975 * inside the pgd, so has no extra memory associated with it. 1976 */ 1977static pmd_t *sun4c_pmd_alloc_one(struct mm_struct *mm, unsigned long address) 1978{ 1979 BUG(); 1980 return NULL; 1981} 1982 1983static void sun4c_free_pmd_fast(pmd_t * pmd) { } 1984 1985static void sun4c_check_pgt_cache(int low, int high) 1986{ 1987 if (pgtable_cache_size > high) { 1988 do { 1989 if (pgd_quicklist) 1990 sun4c_free_pgd_slow(sun4c_get_pgd_fast()); 1991 if (pte_quicklist) 1992 sun4c_free_pte_slow(sun4c_pte_alloc_one_fast(NULL, 0)); 1993 } while (pgtable_cache_size > low); 1994 } 1995} 1996 1997/* An experiment, turn off by default for now... -DaveM */ 1998#define SUN4C_PRELOAD_PSEG 1999 2000void sun4c_update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) 2001{ 2002 unsigned long flags; 2003 int pseg; 2004 2005 local_irq_save(flags); 2006 address &= PAGE_MASK; 2007 if ((pseg = sun4c_get_segmap(address)) == invalid_segment) { 2008 struct sun4c_mmu_entry *entry = sun4c_user_strategy(); 2009 struct mm_struct *mm = vma->vm_mm; 2010 unsigned long start, end; 2011 2012 entry->vaddr = start = (address & SUN4C_REAL_PGDIR_MASK); 2013 entry->ctx = mm->context; 2014 add_ring_ordered(sun4c_context_ring + mm->context, entry); 2015 sun4c_put_segmap(entry->vaddr, entry->pseg); 2016 end = start + SUN4C_REAL_PGDIR_SIZE; 2017 while (start < end) { 2018#ifdef SUN4C_PRELOAD_PSEG 2019 pgd_t *pgdp = sun4c_pgd_offset(mm, start); 2020 pte_t *ptep; 2021 2022 if (!pgdp) 2023 goto no_mapping; 2024 ptep = sun4c_pte_offset_kernel((pmd_t *) pgdp, start); 2025 if (!ptep || !(pte_val(*ptep) & _SUN4C_PAGE_PRESENT)) 2026 goto no_mapping; 2027 sun4c_put_pte(start, pte_val(*ptep)); 2028 goto next; 2029 2030 no_mapping: 2031#endif 2032 sun4c_put_pte(start, 0); 2033#ifdef SUN4C_PRELOAD_PSEG 2034 next: 2035#endif 2036 start += PAGE_SIZE; 2037 } 2038#ifndef SUN4C_PRELOAD_PSEG 2039 sun4c_put_pte(address, pte_val(pte)); 2040#endif 2041 local_irq_restore(flags); 2042 return; 2043 } else { 2044 struct sun4c_mmu_entry *entry = &mmu_entry_pool[pseg]; 2045 2046 remove_lru(entry); 2047 add_lru(entry); 2048 } 2049 2050 sun4c_put_pte(address, pte_val(pte)); 2051 local_irq_restore(flags); 2052} 2053 2054extern void sparc_context_init(int); 2055extern unsigned long end; 2056extern unsigned long bootmem_init(unsigned long *pages_avail); 2057extern unsigned long last_valid_pfn; 2058 2059void __init sun4c_paging_init(void) 2060{ 2061 int i, cnt; 2062 unsigned long kernel_end, vaddr; 2063 extern struct resource sparc_iomap; 2064 unsigned long end_pfn, pages_avail; 2065 2066 kernel_end = (unsigned long) &end; 2067 kernel_end += (SUN4C_REAL_PGDIR_SIZE * 4); 2068 kernel_end = SUN4C_REAL_PGDIR_ALIGN(kernel_end); 2069 2070 pages_avail = 0; 2071 last_valid_pfn = bootmem_init(&pages_avail); 2072 end_pfn = last_valid_pfn; 2073 2074 sun4c_probe_mmu(); 2075 invalid_segment = (num_segmaps - 1); 2076 sun4c_init_mmu_entry_pool(); 2077 sun4c_init_rings(); 2078 sun4c_init_map_kernelprom(kernel_end); 2079 sun4c_init_clean_mmu(kernel_end); 2080 sun4c_init_fill_kernel_ring(SUN4C_KERNEL_BUCKETS); 2081 sun4c_init_lock_area(sparc_iomap.start, IOBASE_END); 2082 sun4c_init_lock_area(DVMA_VADDR, DVMA_END); 2083 sun4c_init_lock_areas(); 2084 sun4c_init_fill_user_ring(); 2085 2086 sun4c_set_context(0); 2087 memset(swapper_pg_dir, 0, PAGE_SIZE); 2088 memset(pg0, 0, PAGE_SIZE); 2089 memset(pg1, 0, PAGE_SIZE); 2090 memset(pg2, 0, PAGE_SIZE); 2091 memset(pg3, 0, PAGE_SIZE); 2092 2093 /* Save work later. */ 2094 vaddr = VMALLOC_START; 2095 swapper_pg_dir[vaddr>>SUN4C_PGDIR_SHIFT] = __pgd(PGD_TABLE | (unsigned long) pg0); 2096 vaddr += SUN4C_PGDIR_SIZE; 2097 swapper_pg_dir[vaddr>>SUN4C_PGDIR_SHIFT] = __pgd(PGD_TABLE | (unsigned long) pg1); 2098 vaddr += SUN4C_PGDIR_SIZE; 2099 swapper_pg_dir[vaddr>>SUN4C_PGDIR_SHIFT] = __pgd(PGD_TABLE | (unsigned long) pg2); 2100 vaddr += SUN4C_PGDIR_SIZE; 2101 swapper_pg_dir[vaddr>>SUN4C_PGDIR_SHIFT] = __pgd(PGD_TABLE | (unsigned long) pg3); 2102 sun4c_init_ss2_cache_bug(); 2103 sparc_context_init(num_contexts); 2104 2105 { 2106 unsigned long zones_size[MAX_NR_ZONES]; 2107 unsigned long zholes_size[MAX_NR_ZONES]; 2108 unsigned long npages; 2109 int znum; 2110 2111 for (znum = 0; znum < MAX_NR_ZONES; znum++) 2112 zones_size[znum] = zholes_size[znum] = 0; 2113 2114 npages = max_low_pfn - pfn_base; 2115 2116 zones_size[ZONE_DMA] = npages; 2117 zholes_size[ZONE_DMA] = npages - pages_avail; 2118 2119 npages = highend_pfn - max_low_pfn; 2120 zones_size[ZONE_HIGHMEM] = npages; 2121 zholes_size[ZONE_HIGHMEM] = npages - calc_highpages(); 2122 2123 free_area_init_node(0, &contig_page_data, zones_size, 2124 pfn_base, zholes_size); 2125 } 2126 2127 cnt = 0; 2128 for (i = 0; i < num_segmaps; i++) 2129 if (mmu_entry_pool[i].locked) 2130 cnt++; 2131 2132 max_user_taken_entries = num_segmaps - cnt - 40 - 1; 2133 2134 printk("SUN4C: %d mmu entries for the kernel\n", cnt); 2135} 2136 2137/* Load up routines and constants for sun4c mmu */ 2138void __init ld_mmu_sun4c(void) 2139{ 2140 extern void ___xchg32_sun4c(void); 2141 2142 printk("Loading sun4c MMU routines\n"); 2143 2144 /* First the constants */ 2145 BTFIXUPSET_SIMM13(pgdir_shift, SUN4C_PGDIR_SHIFT); 2146 BTFIXUPSET_SETHI(pgdir_size, SUN4C_PGDIR_SIZE); 2147 BTFIXUPSET_SETHI(pgdir_mask, SUN4C_PGDIR_MASK); 2148 2149 BTFIXUPSET_SIMM13(ptrs_per_pmd, SUN4C_PTRS_PER_PMD); 2150 BTFIXUPSET_SIMM13(ptrs_per_pgd, SUN4C_PTRS_PER_PGD); 2151 BTFIXUPSET_SIMM13(user_ptrs_per_pgd, KERNBASE / SUN4C_PGDIR_SIZE); 2152 2153 BTFIXUPSET_INT(page_none, pgprot_val(SUN4C_PAGE_NONE)); 2154 BTFIXUPSET_INT(page_shared, pgprot_val(SUN4C_PAGE_SHARED)); 2155 BTFIXUPSET_INT(page_copy, pgprot_val(SUN4C_PAGE_COPY)); 2156 BTFIXUPSET_INT(page_readonly, pgprot_val(SUN4C_PAGE_READONLY)); 2157 BTFIXUPSET_INT(page_kernel, pgprot_val(SUN4C_PAGE_KERNEL)); 2158 page_kernel = pgprot_val(SUN4C_PAGE_KERNEL); 2159 pg_iobits = _SUN4C_PAGE_PRESENT | _SUN4C_READABLE | _SUN4C_WRITEABLE | 2160 _SUN4C_PAGE_IO | _SUN4C_PAGE_NOCACHE; 2161 2162 /* Functions */ 2163 BTFIXUPSET_CALL(___xchg32, ___xchg32_sun4c, BTFIXUPCALL_NORM); 2164 BTFIXUPSET_CALL(do_check_pgt_cache, sun4c_check_pgt_cache, BTFIXUPCALL_NORM); 2165 2166 BTFIXUPSET_CALL(flush_cache_all, sun4c_flush_cache_all, BTFIXUPCALL_NORM); 2167 2168 if (sun4c_vacinfo.do_hwflushes) { 2169 BTFIXUPSET_CALL(sun4c_flush_page, sun4c_flush_page_hw, BTFIXUPCALL_NORM); 2170 BTFIXUPSET_CALL(sun4c_flush_segment, sun4c_flush_segment_hw, BTFIXUPCALL_NORM); 2171 BTFIXUPSET_CALL(sun4c_flush_context, sun4c_flush_context_hw, BTFIXUPCALL_NORM); 2172 } else { 2173 BTFIXUPSET_CALL(sun4c_flush_page, sun4c_flush_page_sw, BTFIXUPCALL_NORM); 2174 BTFIXUPSET_CALL(sun4c_flush_segment, sun4c_flush_segment_sw, BTFIXUPCALL_NORM); 2175 BTFIXUPSET_CALL(sun4c_flush_context, sun4c_flush_context_sw, BTFIXUPCALL_NORM); 2176 } 2177 2178 BTFIXUPSET_CALL(flush_tlb_mm, sun4c_flush_tlb_mm, BTFIXUPCALL_NORM); 2179 BTFIXUPSET_CALL(flush_cache_mm, sun4c_flush_cache_mm, BTFIXUPCALL_NORM); 2180 BTFIXUPSET_CALL(destroy_context, sun4c_destroy_context, BTFIXUPCALL_NORM); 2181 BTFIXUPSET_CALL(switch_mm, sun4c_switch_mm, BTFIXUPCALL_NORM); 2182 BTFIXUPSET_CALL(flush_cache_page, sun4c_flush_cache_page, BTFIXUPCALL_NORM); 2183 BTFIXUPSET_CALL(flush_tlb_page, sun4c_flush_tlb_page, BTFIXUPCALL_NORM); 2184 BTFIXUPSET_CALL(flush_tlb_range, sun4c_flush_tlb_range, BTFIXUPCALL_NORM); 2185 BTFIXUPSET_CALL(flush_cache_range, sun4c_flush_cache_range, BTFIXUPCALL_NORM); 2186 BTFIXUPSET_CALL(__flush_page_to_ram, sun4c_flush_page_to_ram, BTFIXUPCALL_NORM); 2187 BTFIXUPSET_CALL(flush_tlb_all, sun4c_flush_tlb_all, BTFIXUPCALL_NORM); 2188 2189 BTFIXUPSET_CALL(flush_sig_insns, sun4c_flush_sig_insns, BTFIXUPCALL_NOP); 2190 2191 BTFIXUPSET_CALL(set_pte, sun4c_set_pte, BTFIXUPCALL_STO1O0); 2192 2193 /* The 2.4.18 code does not set this on sun4c, how does it work? XXX */ 2194 /* BTFIXUPSET_SETHI(none_mask, 0x00000000); */ /* Defaults to zero? */ 2195 2196 BTFIXUPSET_CALL(pte_pfn, sun4c_pte_pfn, BTFIXUPCALL_NORM); 2197#if 0 /* PAGE_SHIFT <= 12 */ /* Eek. Investigate. XXX */ 2198 BTFIXUPSET_CALL(pmd_page, sun4c_pmd_page, BTFIXUPCALL_ANDNINT(PAGE_SIZE - 1)); 2199#else 2200 BTFIXUPSET_CALL(pmd_page, sun4c_pmd_page, BTFIXUPCALL_NORM); 2201#endif 2202 BTFIXUPSET_CALL(pmd_set, sun4c_pmd_set, BTFIXUPCALL_NORM); 2203 BTFIXUPSET_CALL(pmd_populate, sun4c_pmd_populate, BTFIXUPCALL_NORM); 2204 2205 BTFIXUPSET_CALL(pte_present, sun4c_pte_present, BTFIXUPCALL_NORM); 2206 BTFIXUPSET_CALL(pte_clear, sun4c_pte_clear, BTFIXUPCALL_STG0O0); 2207 BTFIXUPSET_CALL(pte_read, sun4c_pte_read, BTFIXUPCALL_NORM); 2208 2209 BTFIXUPSET_CALL(pmd_bad, sun4c_pmd_bad, BTFIXUPCALL_NORM); 2210 BTFIXUPSET_CALL(pmd_present, sun4c_pmd_present, BTFIXUPCALL_NORM); 2211 BTFIXUPSET_CALL(pmd_clear, sun4c_pmd_clear, BTFIXUPCALL_STG0O0); 2212 2213 BTFIXUPSET_CALL(pgd_none, sun4c_pgd_none, BTFIXUPCALL_RETINT(0)); 2214 BTFIXUPSET_CALL(pgd_bad, sun4c_pgd_bad, BTFIXUPCALL_RETINT(0)); 2215 BTFIXUPSET_CALL(pgd_present, sun4c_pgd_present, BTFIXUPCALL_RETINT(1)); 2216 BTFIXUPSET_CALL(pgd_clear, sun4c_pgd_clear, BTFIXUPCALL_NOP); 2217 2218 BTFIXUPSET_CALL(mk_pte, sun4c_mk_pte, BTFIXUPCALL_NORM); 2219 BTFIXUPSET_CALL(mk_pte_phys, sun4c_mk_pte_phys, BTFIXUPCALL_NORM); 2220 BTFIXUPSET_CALL(mk_pte_io, sun4c_mk_pte_io, BTFIXUPCALL_NORM); 2221 2222 BTFIXUPSET_INT(pte_modify_mask, _SUN4C_PAGE_CHG_MASK); 2223 BTFIXUPSET_CALL(pmd_offset, sun4c_pmd_offset, BTFIXUPCALL_NORM); 2224 BTFIXUPSET_CALL(pte_offset_kernel, sun4c_pte_offset_kernel, BTFIXUPCALL_NORM); 2225 BTFIXUPSET_CALL(free_pte_fast, sun4c_free_pte_fast, BTFIXUPCALL_NORM); 2226 BTFIXUPSET_CALL(pte_free, sun4c_pte_free, BTFIXUPCALL_NORM); 2227 BTFIXUPSET_CALL(pte_alloc_one_kernel, sun4c_pte_alloc_one_kernel, BTFIXUPCALL_NORM); 2228 BTFIXUPSET_CALL(pte_alloc_one, sun4c_pte_alloc_one, BTFIXUPCALL_NORM); 2229 BTFIXUPSET_CALL(free_pmd_fast, sun4c_free_pmd_fast, BTFIXUPCALL_NOP); 2230 BTFIXUPSET_CALL(pmd_alloc_one, sun4c_pmd_alloc_one, BTFIXUPCALL_RETO0); 2231 BTFIXUPSET_CALL(free_pgd_fast, sun4c_free_pgd_fast, BTFIXUPCALL_NORM); 2232 BTFIXUPSET_CALL(get_pgd_fast, sun4c_get_pgd_fast, BTFIXUPCALL_NORM); 2233 2234 BTFIXUPSET_HALF(pte_writei, _SUN4C_PAGE_WRITE); 2235 BTFIXUPSET_HALF(pte_dirtyi, _SUN4C_PAGE_MODIFIED); 2236 BTFIXUPSET_HALF(pte_youngi, _SUN4C_PAGE_ACCESSED); 2237 BTFIXUPSET_HALF(pte_filei, _SUN4C_PAGE_FILE); 2238 BTFIXUPSET_HALF(pte_wrprotecti, _SUN4C_PAGE_WRITE|_SUN4C_PAGE_SILENT_WRITE); 2239 BTFIXUPSET_HALF(pte_mkcleani, _SUN4C_PAGE_MODIFIED|_SUN4C_PAGE_SILENT_WRITE); 2240 BTFIXUPSET_HALF(pte_mkoldi, _SUN4C_PAGE_ACCESSED|_SUN4C_PAGE_SILENT_READ); 2241 BTFIXUPSET_CALL(pte_mkwrite, sun4c_pte_mkwrite, BTFIXUPCALL_NORM); 2242 BTFIXUPSET_CALL(pte_mkdirty, sun4c_pte_mkdirty, BTFIXUPCALL_NORM); 2243 BTFIXUPSET_CALL(pte_mkyoung, sun4c_pte_mkyoung, BTFIXUPCALL_NORM); 2244 BTFIXUPSET_CALL(update_mmu_cache, sun4c_update_mmu_cache, BTFIXUPCALL_NORM); 2245 2246 BTFIXUPSET_CALL(pte_to_pgoff, sun4c_pte_to_pgoff, BTFIXUPCALL_NORM); 2247 BTFIXUPSET_CALL(pgoff_to_pte, sun4c_pgoff_to_pte, BTFIXUPCALL_NORM); 2248 2249 BTFIXUPSET_CALL(mmu_lockarea, sun4c_lockarea, BTFIXUPCALL_NORM); 2250 BTFIXUPSET_CALL(mmu_unlockarea, sun4c_unlockarea, BTFIXUPCALL_NORM); 2251 2252 BTFIXUPSET_CALL(mmu_get_scsi_one, sun4c_get_scsi_one, BTFIXUPCALL_NORM); 2253 BTFIXUPSET_CALL(mmu_get_scsi_sgl, sun4c_get_scsi_sgl, BTFIXUPCALL_NORM); 2254 BTFIXUPSET_CALL(mmu_release_scsi_one, sun4c_release_scsi_one, BTFIXUPCALL_NORM); 2255 BTFIXUPSET_CALL(mmu_release_scsi_sgl, sun4c_release_scsi_sgl, BTFIXUPCALL_NORM); 2256 2257 BTFIXUPSET_CALL(mmu_map_dma_area, sun4c_map_dma_area, BTFIXUPCALL_NORM); 2258 BTFIXUPSET_CALL(mmu_unmap_dma_area, sun4c_unmap_dma_area, BTFIXUPCALL_NORM); 2259 BTFIXUPSET_CALL(mmu_translate_dvma, sun4c_translate_dvma, BTFIXUPCALL_NORM); 2260 2261 BTFIXUPSET_CALL(sparc_mapiorange, sun4c_mapiorange, BTFIXUPCALL_NORM); 2262 BTFIXUPSET_CALL(sparc_unmapiorange, sun4c_unmapiorange, BTFIXUPCALL_NORM); 2263 2264 BTFIXUPSET_CALL(__swp_type, sun4c_swp_type, BTFIXUPCALL_NORM); 2265 BTFIXUPSET_CALL(__swp_offset, sun4c_swp_offset, BTFIXUPCALL_NORM); 2266 BTFIXUPSET_CALL(__swp_entry, sun4c_swp_entry, BTFIXUPCALL_NORM); 2267 2268 BTFIXUPSET_CALL(alloc_thread_info, sun4c_alloc_thread_info, BTFIXUPCALL_NORM); 2269 BTFIXUPSET_CALL(free_thread_info, sun4c_free_thread_info, BTFIXUPCALL_NORM); 2270 2271 BTFIXUPSET_CALL(mmu_info, sun4c_mmu_info, BTFIXUPCALL_NORM); 2272 2273 /* These should _never_ get called with two level tables. */ 2274 BTFIXUPSET_CALL(pgd_set, sun4c_pgd_set, BTFIXUPCALL_NOP); 2275 BTFIXUPSET_CALL(pgd_page, sun4c_pgd_page, BTFIXUPCALL_RETO0); 2276}