1/* 2 * Linux/PA-RISC Project (http://www.parisc-linux.org/) 3 * 4 * kernel entry points (interruptions, system call wrappers) 5 * Copyright (C) 1999,2000 Philipp Rumpf 6 * Copyright (C) 1999 SuSE GmbH Nuernberg 7 * Copyright (C) 2000 Hewlett-Packard (John Marvin) 8 * Copyright (C) 1999 Hewlett-Packard (Frank Rowand) 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2, or (at your option) 13 * any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 */ 24 25#include <asm/asm-offsets.h> 26 27/* we have the following possibilities to act on an interruption: 28 * - handle in assembly and use shadowed registers only 29 * - save registers to kernel stack and handle in assembly or C */ 30 31 32#include <asm/psw.h> 33#include <asm/cache.h> /* for L1_CACHE_SHIFT */ 34#include <asm/assembly.h> /* for LDREG/STREG defines */ 35#include <asm/pgtable.h> 36#include <asm/signal.h> 37#include <asm/unistd.h> 38#include <asm/ldcw.h> 39#include <asm/traps.h> 40#include <asm/thread_info.h> 41#include <asm/alternative.h> 42 43#include <linux/linkage.h> 44 45#ifdef CONFIG_64BIT 46 .level 2.0w 47#else 48 .level 2.0 49#endif 50 51 .import pa_tlb_lock,data 52 .macro load_pa_tlb_lock reg 53#if __PA_LDCW_ALIGNMENT > 4 54 load32 PA(pa_tlb_lock) + __PA_LDCW_ALIGNMENT-1, \reg 55 depi 0,31,__PA_LDCW_ALIGN_ORDER, \reg 56#else 57 load32 PA(pa_tlb_lock), \reg 58#endif 59 .endm 60 61 /* space_to_prot macro creates a prot id from a space id */ 62 63#if (SPACEID_SHIFT) == 0 64 .macro space_to_prot spc prot 65 depd,z \spc,62,31,\prot 66 .endm 67#else 68 .macro space_to_prot spc prot 69 extrd,u \spc,(64 - (SPACEID_SHIFT)),32,\prot 70 .endm 71#endif 72 73 /* Switch to virtual mapping, trashing only %r1 */ 74 .macro virt_map 75 /* pcxt_ssm_bug */ 76 rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */ 77 mtsp %r0, %sr4 78 mtsp %r0, %sr5 79 mtsp %r0, %sr6 80 tovirt_r1 %r29 81 load32 KERNEL_PSW, %r1 82 83 rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */ 84 mtctl %r0, %cr17 /* Clear IIASQ tail */ 85 mtctl %r0, %cr17 /* Clear IIASQ head */ 86 mtctl %r1, %ipsw 87 load32 4f, %r1 88 mtctl %r1, %cr18 /* Set IIAOQ tail */ 89 ldo 4(%r1), %r1 90 mtctl %r1, %cr18 /* Set IIAOQ head */ 91 rfir 92 nop 934: 94 .endm 95 96 /* 97 * The "get_stack" macros are responsible for determining the 98 * kernel stack value. 99 * 100 * If sr7 == 0 101 * Already using a kernel stack, so call the 102 * get_stack_use_r30 macro to push a pt_regs structure 103 * on the stack, and store registers there. 104 * else 105 * Need to set up a kernel stack, so call the 106 * get_stack_use_cr30 macro to set up a pointer 107 * to the pt_regs structure contained within the 108 * task pointer pointed to by cr30. Set the stack 109 * pointer to point to the end of the task structure. 110 * 111 * Note that we use shadowed registers for temps until 112 * we can save %r26 and %r29. %r26 is used to preserve 113 * %r8 (a shadowed register) which temporarily contained 114 * either the fault type ("code") or the eirr. We need 115 * to use a non-shadowed register to carry the value over 116 * the rfir in virt_map. We use %r26 since this value winds 117 * up being passed as the argument to either do_cpu_irq_mask 118 * or handle_interruption. %r29 is used to hold a pointer 119 * the register save area, and once again, it needs to 120 * be a non-shadowed register so that it survives the rfir. 121 * 122 * N.B. TASK_SZ_ALGN and PT_SZ_ALGN include space for a stack frame. 123 */ 124 125 .macro get_stack_use_cr30 126 127 /* we save the registers in the task struct */ 128 129 copy %r30, %r17 130 mfctl %cr30, %r1 131 ldo THREAD_SZ_ALGN(%r1), %r30 132 mtsp %r0,%sr7 133 mtsp %r16,%sr3 134 tophys %r1,%r9 135 LDREG TI_TASK(%r9), %r1 /* thread_info -> task_struct */ 136 tophys %r1,%r9 137 ldo TASK_REGS(%r9),%r9 138 STREG %r17,PT_GR30(%r9) 139 STREG %r29,PT_GR29(%r9) 140 STREG %r26,PT_GR26(%r9) 141 STREG %r16,PT_SR7(%r9) 142 copy %r9,%r29 143 .endm 144 145 .macro get_stack_use_r30 146 147 /* we put a struct pt_regs on the stack and save the registers there */ 148 149 tophys %r30,%r9 150 copy %r30,%r1 151 ldo PT_SZ_ALGN(%r30),%r30 152 STREG %r1,PT_GR30(%r9) 153 STREG %r29,PT_GR29(%r9) 154 STREG %r26,PT_GR26(%r9) 155 STREG %r16,PT_SR7(%r9) 156 copy %r9,%r29 157 .endm 158 159 .macro rest_stack 160 LDREG PT_GR1(%r29), %r1 161 LDREG PT_GR30(%r29),%r30 162 LDREG PT_GR29(%r29),%r29 163 .endm 164 165 /* default interruption handler 166 * (calls traps.c:handle_interruption) */ 167 .macro def code 168 b intr_save 169 ldi \code, %r8 170 .align 32 171 .endm 172 173 /* Interrupt interruption handler 174 * (calls irq.c:do_cpu_irq_mask) */ 175 .macro extint code 176 b intr_extint 177 mfsp %sr7,%r16 178 .align 32 179 .endm 180 181 .import os_hpmc, code 182 183 /* HPMC handler */ 184 .macro hpmc code 185 nop /* must be a NOP, will be patched later */ 186 load32 PA(os_hpmc), %r3 187 bv,n 0(%r3) 188 nop 189 .word 0 /* checksum (will be patched) */ 190 .word 0 /* address of handler */ 191 .word 0 /* length of handler */ 192 .endm 193 194 /* 195 * Performance Note: Instructions will be moved up into 196 * this part of the code later on, once we are sure 197 * that the tlb miss handlers are close to final form. 198 */ 199 200 /* Register definitions for tlb miss handler macros */ 201 202 va = r8 /* virtual address for which the trap occurred */ 203 spc = r24 /* space for which the trap occurred */ 204 205#ifndef CONFIG_64BIT 206 207 /* 208 * itlb miss interruption handler (parisc 1.1 - 32 bit) 209 */ 210 211 .macro itlb_11 code 212 213 mfctl %pcsq, spc 214 b itlb_miss_11 215 mfctl %pcoq, va 216 217 .align 32 218 .endm 219#endif 220 221 /* 222 * itlb miss interruption handler (parisc 2.0) 223 */ 224 225 .macro itlb_20 code 226 mfctl %pcsq, spc 227#ifdef CONFIG_64BIT 228 b itlb_miss_20w 229#else 230 b itlb_miss_20 231#endif 232 mfctl %pcoq, va 233 234 .align 32 235 .endm 236 237#ifndef CONFIG_64BIT 238 /* 239 * naitlb miss interruption handler (parisc 1.1 - 32 bit) 240 */ 241 242 .macro naitlb_11 code 243 244 mfctl %isr,spc 245 b naitlb_miss_11 246 mfctl %ior,va 247 248 .align 32 249 .endm 250#endif 251 252 /* 253 * naitlb miss interruption handler (parisc 2.0) 254 */ 255 256 .macro naitlb_20 code 257 258 mfctl %isr,spc 259#ifdef CONFIG_64BIT 260 b naitlb_miss_20w 261#else 262 b naitlb_miss_20 263#endif 264 mfctl %ior,va 265 266 .align 32 267 .endm 268 269#ifndef CONFIG_64BIT 270 /* 271 * dtlb miss interruption handler (parisc 1.1 - 32 bit) 272 */ 273 274 .macro dtlb_11 code 275 276 mfctl %isr, spc 277 b dtlb_miss_11 278 mfctl %ior, va 279 280 .align 32 281 .endm 282#endif 283 284 /* 285 * dtlb miss interruption handler (parisc 2.0) 286 */ 287 288 .macro dtlb_20 code 289 290 mfctl %isr, spc 291#ifdef CONFIG_64BIT 292 b dtlb_miss_20w 293#else 294 b dtlb_miss_20 295#endif 296 mfctl %ior, va 297 298 .align 32 299 .endm 300 301#ifndef CONFIG_64BIT 302 /* nadtlb miss interruption handler (parisc 1.1 - 32 bit) */ 303 304 .macro nadtlb_11 code 305 306 mfctl %isr,spc 307 b nadtlb_miss_11 308 mfctl %ior,va 309 310 .align 32 311 .endm 312#endif 313 314 /* nadtlb miss interruption handler (parisc 2.0) */ 315 316 .macro nadtlb_20 code 317 318 mfctl %isr,spc 319#ifdef CONFIG_64BIT 320 b nadtlb_miss_20w 321#else 322 b nadtlb_miss_20 323#endif 324 mfctl %ior,va 325 326 .align 32 327 .endm 328 329#ifndef CONFIG_64BIT 330 /* 331 * dirty bit trap interruption handler (parisc 1.1 - 32 bit) 332 */ 333 334 .macro dbit_11 code 335 336 mfctl %isr,spc 337 b dbit_trap_11 338 mfctl %ior,va 339 340 .align 32 341 .endm 342#endif 343 344 /* 345 * dirty bit trap interruption handler (parisc 2.0) 346 */ 347 348 .macro dbit_20 code 349 350 mfctl %isr,spc 351#ifdef CONFIG_64BIT 352 b dbit_trap_20w 353#else 354 b dbit_trap_20 355#endif 356 mfctl %ior,va 357 358 .align 32 359 .endm 360 361 /* In LP64, the space contains part of the upper 32 bits of the 362 * fault. We have to extract this and place it in the va, 363 * zeroing the corresponding bits in the space register */ 364 .macro space_adjust spc,va,tmp 365#ifdef CONFIG_64BIT 366 extrd,u \spc,63,SPACEID_SHIFT,\tmp 367 depd %r0,63,SPACEID_SHIFT,\spc 368 depd \tmp,31,SPACEID_SHIFT,\va 369#endif 370 .endm 371 372 .import swapper_pg_dir,code 373 374 /* Get the pgd. For faults on space zero (kernel space), this 375 * is simply swapper_pg_dir. For user space faults, the 376 * pgd is stored in %cr25 */ 377 .macro get_pgd spc,reg 378 ldil L%PA(swapper_pg_dir),\reg 379 ldo R%PA(swapper_pg_dir)(\reg),\reg 380 or,COND(=) %r0,\spc,%r0 381 mfctl %cr25,\reg 382 .endm 383 384 /* 385 space_check(spc,tmp,fault) 386 387 spc - The space we saw the fault with. 388 tmp - The place to store the current space. 389 fault - Function to call on failure. 390 391 Only allow faults on different spaces from the 392 currently active one if we're the kernel 393 394 */ 395 .macro space_check spc,tmp,fault 396 mfsp %sr7,\tmp 397 /* check against %r0 which is same value as LINUX_GATEWAY_SPACE */ 398 or,COND(<>) %r0,\spc,%r0 /* user may execute gateway page 399 * as kernel, so defeat the space 400 * check if it is */ 401 copy \spc,\tmp 402 or,COND(=) %r0,\tmp,%r0 /* nullify if executing as kernel */ 403 cmpb,COND(<>),n \tmp,\spc,\fault 404 .endm 405 406 /* Look up a PTE in a 2-Level scheme (faulting at each 407 * level if the entry isn't present 408 * 409 * NOTE: we use ldw even for LP64, since the short pointers 410 * can address up to 1TB 411 */ 412 .macro L2_ptep pmd,pte,index,va,fault 413#if CONFIG_PGTABLE_LEVELS == 3 414 extru \va,31-ASM_PMD_SHIFT,ASM_BITS_PER_PMD,\index 415#else 416# if defined(CONFIG_64BIT) 417 extrd,u \va,63-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index 418 #else 419 # if PAGE_SIZE > 4096 420 extru \va,31-ASM_PGDIR_SHIFT,32-ASM_PGDIR_SHIFT,\index 421 # else 422 extru \va,31-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index 423 # endif 424# endif 425#endif 426 dep %r0,31,PAGE_SHIFT,\pmd /* clear offset */ 427 copy %r0,\pte 428 ldw,s \index(\pmd),\pmd 429 bb,>=,n \pmd,_PxD_PRESENT_BIT,\fault 430 dep %r0,31,PxD_FLAG_SHIFT,\pmd /* clear flags */ 431 SHLREG \pmd,PxD_VALUE_SHIFT,\pmd 432 extru \va,31-PAGE_SHIFT,ASM_BITS_PER_PTE,\index 433 dep %r0,31,PAGE_SHIFT,\pmd /* clear offset */ 434 shladd \index,BITS_PER_PTE_ENTRY,\pmd,\pmd /* pmd is now pte */ 435 .endm 436 437 /* Look up PTE in a 3-Level scheme. 438 * 439 * Here we implement a Hybrid L2/L3 scheme: we allocate the 440 * first pmd adjacent to the pgd. This means that we can 441 * subtract a constant offset to get to it. The pmd and pgd 442 * sizes are arranged so that a single pmd covers 4GB (giving 443 * a full LP64 process access to 8TB) so our lookups are 444 * effectively L2 for the first 4GB of the kernel (i.e. for 445 * all ILP32 processes and all the kernel for machines with 446 * under 4GB of memory) */ 447 .macro L3_ptep pgd,pte,index,va,fault 448#if CONFIG_PGTABLE_LEVELS == 3 /* we might have a 2-Level scheme, e.g. with 16kb page size */ 449 extrd,u \va,63-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index 450 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0 451 ldw,s \index(\pgd),\pgd 452 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0 453 bb,>=,n \pgd,_PxD_PRESENT_BIT,\fault 454 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0 455 shld \pgd,PxD_VALUE_SHIFT,\index 456 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0 457 copy \index,\pgd 458 extrd,u,*<> \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0 459 ldo ASM_PGD_PMD_OFFSET(\pgd),\pgd 460#endif 461 L2_ptep \pgd,\pte,\index,\va,\fault 462 .endm 463 464 /* Acquire pa_tlb_lock lock and check page is present. */ 465 .macro tlb_lock spc,ptp,pte,tmp,tmp1,fault 466#ifdef CONFIG_SMP 46798: cmpib,COND(=),n 0,\spc,2f 468 load_pa_tlb_lock \tmp 4691: LDCW 0(\tmp),\tmp1 470 cmpib,COND(=) 0,\tmp1,1b 471 nop 472 LDREG 0(\ptp),\pte 473 bb,<,n \pte,_PAGE_PRESENT_BIT,3f 474 b \fault 475 stw,ma \spc,0(\tmp) 47699: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) 477#endif 4782: LDREG 0(\ptp),\pte 479 bb,>=,n \pte,_PAGE_PRESENT_BIT,\fault 4803: 481 .endm 482 483 /* Release pa_tlb_lock lock without reloading lock address. */ 484 .macro tlb_unlock0 spc,tmp 485#ifdef CONFIG_SMP 48698: or,COND(=) %r0,\spc,%r0 487 stw,ma \spc,0(\tmp) 48899: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) 489#endif 490 .endm 491 492 /* Release pa_tlb_lock lock. */ 493 .macro tlb_unlock1 spc,tmp 494#ifdef CONFIG_SMP 49598: load_pa_tlb_lock \tmp 49699: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) 497 tlb_unlock0 \spc,\tmp 498#endif 499 .endm 500 501 /* Set the _PAGE_ACCESSED bit of the PTE. Be clever and 502 * don't needlessly dirty the cache line if it was already set */ 503 .macro update_accessed ptp,pte,tmp,tmp1 504 ldi _PAGE_ACCESSED,\tmp1 505 or \tmp1,\pte,\tmp 506 and,COND(<>) \tmp1,\pte,%r0 507 STREG \tmp,0(\ptp) 508 .endm 509 510 /* Set the dirty bit (and accessed bit). No need to be 511 * clever, this is only used from the dirty fault */ 512 .macro update_dirty ptp,pte,tmp 513 ldi _PAGE_ACCESSED|_PAGE_DIRTY,\tmp 514 or \tmp,\pte,\pte 515 STREG \pte,0(\ptp) 516 .endm 517 518 /* We have (depending on the page size): 519 * - 38 to 52-bit Physical Page Number 520 * - 12 to 26-bit page offset 521 */ 522 /* bitshift difference between a PFN (based on kernel's PAGE_SIZE) 523 * to a CPU TLB 4k PFN (4k => 12 bits to shift) */ 524 #define PAGE_ADD_SHIFT (PAGE_SHIFT-12) 525 #define PAGE_ADD_HUGE_SHIFT (REAL_HPAGE_SHIFT-12) 526 527 /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ 528 .macro convert_for_tlb_insert20 pte,tmp 529#ifdef CONFIG_HUGETLB_PAGE 530 copy \pte,\tmp 531 extrd,u \tmp,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\ 532 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte 533 534 depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\ 535 (63-58)+PAGE_ADD_SHIFT,\pte 536 extrd,u,*= \tmp,_PAGE_HPAGE_BIT+32,1,%r0 537 depdi _HUGE_PAGE_SIZE_ENCODING_DEFAULT,63,\ 538 (63-58)+PAGE_ADD_HUGE_SHIFT,\pte 539#else /* Huge pages disabled */ 540 extrd,u \pte,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\ 541 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte 542 depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\ 543 (63-58)+PAGE_ADD_SHIFT,\pte 544#endif 545 .endm 546 547 /* Convert the pte and prot to tlb insertion values. How 548 * this happens is quite subtle, read below */ 549 .macro make_insert_tlb spc,pte,prot,tmp 550 space_to_prot \spc \prot /* create prot id from space */ 551 /* The following is the real subtlety. This is depositing 552 * T <-> _PAGE_REFTRAP 553 * D <-> _PAGE_DIRTY 554 * B <-> _PAGE_DMB (memory break) 555 * 556 * Then incredible subtlety: The access rights are 557 * _PAGE_GATEWAY, _PAGE_EXEC and _PAGE_WRITE 558 * See 3-14 of the parisc 2.0 manual 559 * 560 * Finally, _PAGE_READ goes in the top bit of PL1 (so we 561 * trigger an access rights trap in user space if the user 562 * tries to read an unreadable page */ 563 depd \pte,8,7,\prot 564 565 /* PAGE_USER indicates the page can be read with user privileges, 566 * so deposit X1|11 to PL1|PL2 (remember the upper bit of PL1 567 * contains _PAGE_READ) */ 568 extrd,u,*= \pte,_PAGE_USER_BIT+32,1,%r0 569 depdi 7,11,3,\prot 570 /* If we're a gateway page, drop PL2 back to zero for promotion 571 * to kernel privilege (so we can execute the page as kernel). 572 * Any privilege promotion page always denys read and write */ 573 extrd,u,*= \pte,_PAGE_GATEWAY_BIT+32,1,%r0 574 depd %r0,11,2,\prot /* If Gateway, Set PL2 to 0 */ 575 576 /* Enforce uncacheable pages. 577 * This should ONLY be use for MMIO on PA 2.0 machines. 578 * Memory/DMA is cache coherent on all PA2.0 machines we support 579 * (that means T-class is NOT supported) and the memory controllers 580 * on most of those machines only handles cache transactions. 581 */ 582 extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0 583 depdi 1,12,1,\prot 584 585 /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ 586 convert_for_tlb_insert20 \pte \tmp 587 .endm 588 589 /* Identical macro to make_insert_tlb above, except it 590 * makes the tlb entry for the differently formatted pa11 591 * insertion instructions */ 592 .macro make_insert_tlb_11 spc,pte,prot 593 zdep \spc,30,15,\prot 594 dep \pte,8,7,\prot 595 extru,= \pte,_PAGE_NO_CACHE_BIT,1,%r0 596 depi 1,12,1,\prot 597 extru,= \pte,_PAGE_USER_BIT,1,%r0 598 depi 7,11,3,\prot /* Set for user space (1 rsvd for read) */ 599 extru,= \pte,_PAGE_GATEWAY_BIT,1,%r0 600 depi 0,11,2,\prot /* If Gateway, Set PL2 to 0 */ 601 602 /* Get rid of prot bits and convert to page addr for iitlba */ 603 604 depi 0,31,ASM_PFN_PTE_SHIFT,\pte 605 SHRREG \pte,(ASM_PFN_PTE_SHIFT-(31-26)),\pte 606 .endm 607 608 /* This is for ILP32 PA2.0 only. The TLB insertion needs 609 * to extend into I/O space if the address is 0xfXXXXXXX 610 * so we extend the f's into the top word of the pte in 611 * this case */ 612 .macro f_extend pte,tmp 613 extrd,s \pte,42,4,\tmp 614 addi,<> 1,\tmp,%r0 615 extrd,s \pte,63,25,\pte 616 .endm 617 618 /* The alias region is an 8MB aligned 16MB to do clear and 619 * copy user pages at addresses congruent with the user 620 * virtual address. 621 * 622 * To use the alias page, you set %r26 up with the to TLB 623 * entry (identifying the physical page) and %r23 up with 624 * the from tlb entry (or nothing if only a to entry---for 625 * clear_user_page_asm) */ 626 .macro do_alias spc,tmp,tmp1,va,pte,prot,fault,patype 627 cmpib,COND(<>),n 0,\spc,\fault 628 ldil L%(TMPALIAS_MAP_START),\tmp 629#if defined(CONFIG_64BIT) && (TMPALIAS_MAP_START >= 0x80000000) 630 /* on LP64, ldi will sign extend into the upper 32 bits, 631 * which is behaviour we don't want */ 632 depdi 0,31,32,\tmp 633#endif 634 copy \va,\tmp1 635 depi 0,31,23,\tmp1 636 cmpb,COND(<>),n \tmp,\tmp1,\fault 637 mfctl %cr19,\tmp /* iir */ 638 /* get the opcode (first six bits) into \tmp */ 639 extrw,u \tmp,5,6,\tmp 640 /* 641 * Only setting the T bit prevents data cache movein 642 * Setting access rights to zero prevents instruction cache movein 643 * 644 * Note subtlety here: _PAGE_GATEWAY, _PAGE_EXEC and _PAGE_WRITE go 645 * to type field and _PAGE_READ goes to top bit of PL1 646 */ 647 ldi (_PAGE_REFTRAP|_PAGE_READ|_PAGE_WRITE),\prot 648 /* 649 * so if the opcode is one (i.e. this is a memory management 650 * instruction) nullify the next load so \prot is only T. 651 * Otherwise this is a normal data operation 652 */ 653 cmpiclr,= 0x01,\tmp,%r0 654 ldi (_PAGE_DIRTY|_PAGE_READ|_PAGE_WRITE),\prot 655.ifc \patype,20 656 depd,z \prot,8,7,\prot 657.else 658.ifc \patype,11 659 depw,z \prot,8,7,\prot 660.else 661 .error "undefined PA type to do_alias" 662.endif 663.endif 664 /* 665 * OK, it is in the temp alias region, check whether "from" or "to". 666 * Check "subtle" note in pacache.S re: r23/r26. 667 */ 668#ifdef CONFIG_64BIT 669 extrd,u,*= \va,41,1,%r0 670#else 671 extrw,u,= \va,9,1,%r0 672#endif 673 or,COND(tr) %r23,%r0,\pte 674 or %r26,%r0,\pte 675 .endm 676 677 678 /* 679 * Fault_vectors are architecturally required to be aligned on a 2K 680 * boundary 681 */ 682 683 .section .text.hot 684 .align 2048 685 686ENTRY(fault_vector_20) 687 /* First vector is invalid (0) */ 688 .ascii "cows can fly" 689 .byte 0 690 .align 32 691 692 hpmc 1 693 def 2 694 def 3 695 extint 4 696 def 5 697 itlb_20 PARISC_ITLB_TRAP 698 def 7 699 def 8 700 def 9 701 def 10 702 def 11 703 def 12 704 def 13 705 def 14 706 dtlb_20 15 707 naitlb_20 16 708 nadtlb_20 17 709 def 18 710 def 19 711 dbit_20 20 712 def 21 713 def 22 714 def 23 715 def 24 716 def 25 717 def 26 718 def 27 719 def 28 720 def 29 721 def 30 722 def 31 723END(fault_vector_20) 724 725#ifndef CONFIG_64BIT 726 727 .align 2048 728 729ENTRY(fault_vector_11) 730 /* First vector is invalid (0) */ 731 .ascii "cows can fly" 732 .byte 0 733 .align 32 734 735 hpmc 1 736 def 2 737 def 3 738 extint 4 739 def 5 740 itlb_11 PARISC_ITLB_TRAP 741 def 7 742 def 8 743 def 9 744 def 10 745 def 11 746 def 12 747 def 13 748 def 14 749 dtlb_11 15 750 naitlb_11 16 751 nadtlb_11 17 752 def 18 753 def 19 754 dbit_11 20 755 def 21 756 def 22 757 def 23 758 def 24 759 def 25 760 def 26 761 def 27 762 def 28 763 def 29 764 def 30 765 def 31 766END(fault_vector_11) 767 768#endif 769 /* Fault vector is separately protected and *must* be on its own page */ 770 .align PAGE_SIZE 771 772 .import handle_interruption,code 773 .import do_cpu_irq_mask,code 774 775 /* 776 * Child Returns here 777 * 778 * copy_thread moved args into task save area. 779 */ 780 781ENTRY(ret_from_kernel_thread) 782 /* Call schedule_tail first though */ 783 BL schedule_tail, %r2 784 nop 785 786 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 787 LDREG TASK_PT_GR25(%r1), %r26 788#ifdef CONFIG_64BIT 789 LDREG TASK_PT_GR27(%r1), %r27 790#endif 791 LDREG TASK_PT_GR26(%r1), %r1 792 ble 0(%sr7, %r1) 793 copy %r31, %r2 794 b finish_child_return 795 nop 796END(ret_from_kernel_thread) 797 798 799 /* 800 * struct task_struct *_switch_to(struct task_struct *prev, 801 * struct task_struct *next) 802 * 803 * switch kernel stacks and return prev */ 804ENTRY_CFI(_switch_to) 805 STREG %r2, -RP_OFFSET(%r30) 806 807 callee_save_float 808 callee_save 809 810 load32 _switch_to_ret, %r2 811 812 STREG %r2, TASK_PT_KPC(%r26) 813 LDREG TASK_PT_KPC(%r25), %r2 814 815 STREG %r30, TASK_PT_KSP(%r26) 816 LDREG TASK_PT_KSP(%r25), %r30 817 LDREG TASK_THREAD_INFO(%r25), %r25 818 bv %r0(%r2) 819 mtctl %r25,%cr30 820 821ENTRY(_switch_to_ret) 822 mtctl %r0, %cr0 /* Needed for single stepping */ 823 callee_rest 824 callee_rest_float 825 826 LDREG -RP_OFFSET(%r30), %r2 827 bv %r0(%r2) 828 copy %r26, %r28 829ENDPROC_CFI(_switch_to) 830 831 /* 832 * Common rfi return path for interruptions, kernel execve, and 833 * sys_rt_sigreturn (sometimes). The sys_rt_sigreturn syscall will 834 * return via this path if the signal was received when the process 835 * was running; if the process was blocked on a syscall then the 836 * normal syscall_exit path is used. All syscalls for traced 837 * proceses exit via intr_restore. 838 * 839 * XXX If any syscalls that change a processes space id ever exit 840 * this way, then we will need to copy %sr3 in to PT_SR[3..7], and 841 * adjust IASQ[0..1]. 842 * 843 */ 844 845 .align PAGE_SIZE 846 847ENTRY_CFI(syscall_exit_rfi) 848 mfctl %cr30,%r16 849 LDREG TI_TASK(%r16), %r16 /* thread_info -> task_struct */ 850 ldo TASK_REGS(%r16),%r16 851 /* Force iaoq to userspace, as the user has had access to our current 852 * context via sigcontext. Also Filter the PSW for the same reason. 853 */ 854 LDREG PT_IAOQ0(%r16),%r19 855 depi 3,31,2,%r19 856 STREG %r19,PT_IAOQ0(%r16) 857 LDREG PT_IAOQ1(%r16),%r19 858 depi 3,31,2,%r19 859 STREG %r19,PT_IAOQ1(%r16) 860 LDREG PT_PSW(%r16),%r19 861 load32 USER_PSW_MASK,%r1 862#ifdef CONFIG_64BIT 863 load32 USER_PSW_HI_MASK,%r20 864 depd %r20,31,32,%r1 865#endif 866 and %r19,%r1,%r19 /* Mask out bits that user shouldn't play with */ 867 load32 USER_PSW,%r1 868 or %r19,%r1,%r19 /* Make sure default USER_PSW bits are set */ 869 STREG %r19,PT_PSW(%r16) 870 871 /* 872 * If we aren't being traced, we never saved space registers 873 * (we don't store them in the sigcontext), so set them 874 * to "proper" values now (otherwise we'll wind up restoring 875 * whatever was last stored in the task structure, which might 876 * be inconsistent if an interrupt occurred while on the gateway 877 * page). Note that we may be "trashing" values the user put in 878 * them, but we don't support the user changing them. 879 */ 880 881 STREG %r0,PT_SR2(%r16) 882 mfsp %sr3,%r19 883 STREG %r19,PT_SR0(%r16) 884 STREG %r19,PT_SR1(%r16) 885 STREG %r19,PT_SR3(%r16) 886 STREG %r19,PT_SR4(%r16) 887 STREG %r19,PT_SR5(%r16) 888 STREG %r19,PT_SR6(%r16) 889 STREG %r19,PT_SR7(%r16) 890 891ENTRY(intr_return) 892 /* check for reschedule */ 893 mfctl %cr30,%r1 894 LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */ 895 bb,<,n %r19,31-TIF_NEED_RESCHED,intr_do_resched /* forward */ 896 897 .import do_notify_resume,code 898intr_check_sig: 899 /* As above */ 900 mfctl %cr30,%r1 901 LDREG TI_FLAGS(%r1),%r19 902 ldi (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME), %r20 903 and,COND(<>) %r19, %r20, %r0 904 b,n intr_restore /* skip past if we've nothing to do */ 905 906 /* This check is critical to having LWS 907 * working. The IASQ is zero on the gateway 908 * page and we cannot deliver any signals until 909 * we get off the gateway page. 910 * 911 * Only do signals if we are returning to user space 912 */ 913 LDREG PT_IASQ0(%r16), %r20 914 cmpib,COND(=),n LINUX_GATEWAY_SPACE, %r20, intr_restore /* backward */ 915 LDREG PT_IASQ1(%r16), %r20 916 cmpib,COND(=),n LINUX_GATEWAY_SPACE, %r20, intr_restore /* backward */ 917 918 /* NOTE: We need to enable interrupts if we have to deliver 919 * signals. We used to do this earlier but it caused kernel 920 * stack overflows. */ 921 ssm PSW_SM_I, %r0 922 923 copy %r0, %r25 /* long in_syscall = 0 */ 924#ifdef CONFIG_64BIT 925 ldo -16(%r30),%r29 /* Reference param save area */ 926#endif 927 928 BL do_notify_resume,%r2 929 copy %r16, %r26 /* struct pt_regs *regs */ 930 931 b,n intr_check_sig 932 933intr_restore: 934 copy %r16,%r29 935 ldo PT_FR31(%r29),%r1 936 rest_fp %r1 937 rest_general %r29 938 939 /* inverse of virt_map */ 940 pcxt_ssm_bug 941 rsm PSW_SM_QUIET,%r0 /* prepare for rfi */ 942 tophys_r1 %r29 943 944 /* Restore space id's and special cr's from PT_REGS 945 * structure pointed to by r29 946 */ 947 rest_specials %r29 948 949 /* IMPORTANT: rest_stack restores r29 last (we are using it)! 950 * It also restores r1 and r30. 951 */ 952 rest_stack 953 954 rfi 955 nop 956 957#ifndef CONFIG_PREEMPT 958# define intr_do_preempt intr_restore 959#endif /* !CONFIG_PREEMPT */ 960 961 .import schedule,code 962intr_do_resched: 963 /* Only call schedule on return to userspace. If we're returning 964 * to kernel space, we may schedule if CONFIG_PREEMPT, otherwise 965 * we jump back to intr_restore. 966 */ 967 LDREG PT_IASQ0(%r16), %r20 968 cmpib,COND(=) 0, %r20, intr_do_preempt 969 nop 970 LDREG PT_IASQ1(%r16), %r20 971 cmpib,COND(=) 0, %r20, intr_do_preempt 972 nop 973 974 /* NOTE: We need to enable interrupts if we schedule. We used 975 * to do this earlier but it caused kernel stack overflows. */ 976 ssm PSW_SM_I, %r0 977 978#ifdef CONFIG_64BIT 979 ldo -16(%r30),%r29 /* Reference param save area */ 980#endif 981 982 ldil L%intr_check_sig, %r2 983#ifndef CONFIG_64BIT 984 b schedule 985#else 986 load32 schedule, %r20 987 bv %r0(%r20) 988#endif 989 ldo R%intr_check_sig(%r2), %r2 990 991 /* preempt the current task on returning to kernel 992 * mode from an interrupt, iff need_resched is set, 993 * and preempt_count is 0. otherwise, we continue on 994 * our merry way back to the current running task. 995 */ 996#ifdef CONFIG_PREEMPT 997 .import preempt_schedule_irq,code 998intr_do_preempt: 999 rsm PSW_SM_I, %r0 /* disable interrupts */ 1000 1001 /* current_thread_info()->preempt_count */ 1002 mfctl %cr30, %r1 1003 LDREG TI_PRE_COUNT(%r1), %r19 1004 cmpib,COND(<>) 0, %r19, intr_restore /* if preempt_count > 0 */ 1005 nop /* prev insn branched backwards */ 1006 1007 /* check if we interrupted a critical path */ 1008 LDREG PT_PSW(%r16), %r20 1009 bb,<,n %r20, 31 - PSW_SM_I, intr_restore 1010 nop 1011 1012 BL preempt_schedule_irq, %r2 1013 nop 1014 1015 b,n intr_restore /* ssm PSW_SM_I done by intr_restore */ 1016#endif /* CONFIG_PREEMPT */ 1017 1018 /* 1019 * External interrupts. 1020 */ 1021 1022intr_extint: 1023 cmpib,COND(=),n 0,%r16,1f 1024 1025 get_stack_use_cr30 1026 b,n 2f 1027 10281: 1029 get_stack_use_r30 10302: 1031 save_specials %r29 1032 virt_map 1033 save_general %r29 1034 1035 ldo PT_FR0(%r29), %r24 1036 save_fp %r24 1037 1038 loadgp 1039 1040 copy %r29, %r26 /* arg0 is pt_regs */ 1041 copy %r29, %r16 /* save pt_regs */ 1042 1043 ldil L%intr_return, %r2 1044 1045#ifdef CONFIG_64BIT 1046 ldo -16(%r30),%r29 /* Reference param save area */ 1047#endif 1048 1049 b do_cpu_irq_mask 1050 ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ 1051ENDPROC_CFI(syscall_exit_rfi) 1052 1053 1054 /* Generic interruptions (illegal insn, unaligned, page fault, etc) */ 1055 1056ENTRY_CFI(intr_save) /* for os_hpmc */ 1057 mfsp %sr7,%r16 1058 cmpib,COND(=),n 0,%r16,1f 1059 get_stack_use_cr30 1060 b 2f 1061 copy %r8,%r26 1062 10631: 1064 get_stack_use_r30 1065 copy %r8,%r26 1066 10672: 1068 save_specials %r29 1069 1070 /* If this trap is a itlb miss, skip saving/adjusting isr/ior */ 1071 cmpib,COND(=),n PARISC_ITLB_TRAP,%r26,skip_save_ior 1072 1073 1074 mfctl %isr, %r16 1075 nop /* serialize mfctl on PA 2.0 to avoid 4 cycle penalty */ 1076 mfctl %ior, %r17 1077 1078 1079#ifdef CONFIG_64BIT 1080 /* 1081 * If the interrupted code was running with W bit off (32 bit), 1082 * clear the b bits (bits 0 & 1) in the ior. 1083 * save_specials left ipsw value in r8 for us to test. 1084 */ 1085 extrd,u,*<> %r8,PSW_W_BIT,1,%r0 1086 depdi 0,1,2,%r17 1087 1088 /* adjust isr/ior: get high bits from isr and deposit in ior */ 1089 space_adjust %r16,%r17,%r1 1090#endif 1091 STREG %r16, PT_ISR(%r29) 1092 STREG %r17, PT_IOR(%r29) 1093 1094#if 0 && defined(CONFIG_64BIT) 1095 /* Revisit when we have 64-bit code above 4Gb */ 1096 b,n intr_save2 1097 1098skip_save_ior: 1099 /* We have a itlb miss, and when executing code above 4 Gb on ILP64, we 1100 * need to adjust iasq/iaoq here in the same way we adjusted isr/ior 1101 * above. 1102 */ 1103 extrd,u,* %r8,PSW_W_BIT,1,%r1 1104 cmpib,COND(=),n 1,%r1,intr_save2 1105 LDREG PT_IASQ0(%r29), %r16 1106 LDREG PT_IAOQ0(%r29), %r17 1107 /* adjust iasq/iaoq */ 1108 space_adjust %r16,%r17,%r1 1109 STREG %r16, PT_IASQ0(%r29) 1110 STREG %r17, PT_IAOQ0(%r29) 1111#else 1112skip_save_ior: 1113#endif 1114 1115intr_save2: 1116 virt_map 1117 save_general %r29 1118 1119 ldo PT_FR0(%r29), %r25 1120 save_fp %r25 1121 1122 loadgp 1123 1124 copy %r29, %r25 /* arg1 is pt_regs */ 1125#ifdef CONFIG_64BIT 1126 ldo -16(%r30),%r29 /* Reference param save area */ 1127#endif 1128 1129 ldil L%intr_check_sig, %r2 1130 copy %r25, %r16 /* save pt_regs */ 1131 1132 b handle_interruption 1133 ldo R%intr_check_sig(%r2), %r2 1134ENDPROC_CFI(intr_save) 1135 1136 1137 /* 1138 * Note for all tlb miss handlers: 1139 * 1140 * cr24 contains a pointer to the kernel address space 1141 * page directory. 1142 * 1143 * cr25 contains a pointer to the current user address 1144 * space page directory. 1145 * 1146 * sr3 will contain the space id of the user address space 1147 * of the current running thread while that thread is 1148 * running in the kernel. 1149 */ 1150 1151 /* 1152 * register number allocations. Note that these are all 1153 * in the shadowed registers 1154 */ 1155 1156 t0 = r1 /* temporary register 0 */ 1157 va = r8 /* virtual address for which the trap occurred */ 1158 t1 = r9 /* temporary register 1 */ 1159 pte = r16 /* pte/phys page # */ 1160 prot = r17 /* prot bits */ 1161 spc = r24 /* space for which the trap occurred */ 1162 ptp = r25 /* page directory/page table pointer */ 1163 1164#ifdef CONFIG_64BIT 1165 1166dtlb_miss_20w: 1167 space_adjust spc,va,t0 1168 get_pgd spc,ptp 1169 space_check spc,t0,dtlb_fault 1170 1171 L3_ptep ptp,pte,t0,va,dtlb_check_alias_20w 1172 1173 tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_20w 1174 update_accessed ptp,pte,t0,t1 1175 1176 make_insert_tlb spc,pte,prot,t1 1177 1178 idtlbt pte,prot 1179 1180 tlb_unlock1 spc,t0 1181 rfir 1182 nop 1183 1184dtlb_check_alias_20w: 1185 do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20 1186 1187 idtlbt pte,prot 1188 1189 rfir 1190 nop 1191 1192nadtlb_miss_20w: 1193 space_adjust spc,va,t0 1194 get_pgd spc,ptp 1195 space_check spc,t0,nadtlb_fault 1196 1197 L3_ptep ptp,pte,t0,va,nadtlb_check_alias_20w 1198 1199 tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_20w 1200 update_accessed ptp,pte,t0,t1 1201 1202 make_insert_tlb spc,pte,prot,t1 1203 1204 idtlbt pte,prot 1205 1206 tlb_unlock1 spc,t0 1207 rfir 1208 nop 1209 1210nadtlb_check_alias_20w: 1211 do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20 1212 1213 idtlbt pte,prot 1214 1215 rfir 1216 nop 1217 1218#else 1219 1220dtlb_miss_11: 1221 get_pgd spc,ptp 1222 1223 space_check spc,t0,dtlb_fault 1224 1225 L2_ptep ptp,pte,t0,va,dtlb_check_alias_11 1226 1227 tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_11 1228 update_accessed ptp,pte,t0,t1 1229 1230 make_insert_tlb_11 spc,pte,prot 1231 1232 mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */ 1233 mtsp spc,%sr1 1234 1235 idtlba pte,(%sr1,va) 1236 idtlbp prot,(%sr1,va) 1237 1238 mtsp t1, %sr1 /* Restore sr1 */ 1239 1240 tlb_unlock1 spc,t0 1241 rfir 1242 nop 1243 1244dtlb_check_alias_11: 1245 do_alias spc,t0,t1,va,pte,prot,dtlb_fault,11 1246 1247 idtlba pte,(va) 1248 idtlbp prot,(va) 1249 1250 rfir 1251 nop 1252 1253nadtlb_miss_11: 1254 get_pgd spc,ptp 1255 1256 space_check spc,t0,nadtlb_fault 1257 1258 L2_ptep ptp,pte,t0,va,nadtlb_check_alias_11 1259 1260 tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_11 1261 update_accessed ptp,pte,t0,t1 1262 1263 make_insert_tlb_11 spc,pte,prot 1264 1265 mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */ 1266 mtsp spc,%sr1 1267 1268 idtlba pte,(%sr1,va) 1269 idtlbp prot,(%sr1,va) 1270 1271 mtsp t1, %sr1 /* Restore sr1 */ 1272 1273 tlb_unlock1 spc,t0 1274 rfir 1275 nop 1276 1277nadtlb_check_alias_11: 1278 do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,11 1279 1280 idtlba pte,(va) 1281 idtlbp prot,(va) 1282 1283 rfir 1284 nop 1285 1286dtlb_miss_20: 1287 space_adjust spc,va,t0 1288 get_pgd spc,ptp 1289 space_check spc,t0,dtlb_fault 1290 1291 L2_ptep ptp,pte,t0,va,dtlb_check_alias_20 1292 1293 tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_20 1294 update_accessed ptp,pte,t0,t1 1295 1296 make_insert_tlb spc,pte,prot,t1 1297 1298 f_extend pte,t1 1299 1300 idtlbt pte,prot 1301 1302 tlb_unlock1 spc,t0 1303 rfir 1304 nop 1305 1306dtlb_check_alias_20: 1307 do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20 1308 1309 idtlbt pte,prot 1310 1311 rfir 1312 nop 1313 1314nadtlb_miss_20: 1315 get_pgd spc,ptp 1316 1317 space_check spc,t0,nadtlb_fault 1318 1319 L2_ptep ptp,pte,t0,va,nadtlb_check_alias_20 1320 1321 tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_20 1322 update_accessed ptp,pte,t0,t1 1323 1324 make_insert_tlb spc,pte,prot,t1 1325 1326 f_extend pte,t1 1327 1328 idtlbt pte,prot 1329 1330 tlb_unlock1 spc,t0 1331 rfir 1332 nop 1333 1334nadtlb_check_alias_20: 1335 do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20 1336 1337 idtlbt pte,prot 1338 1339 rfir 1340 nop 1341 1342#endif 1343 1344nadtlb_emulate: 1345 1346 /* 1347 * Non access misses can be caused by fdc,fic,pdc,lpa,probe and 1348 * probei instructions. We don't want to fault for these 1349 * instructions (not only does it not make sense, it can cause 1350 * deadlocks, since some flushes are done with the mmap 1351 * semaphore held). If the translation doesn't exist, we can't 1352 * insert a translation, so have to emulate the side effects 1353 * of the instruction. Since we don't insert a translation 1354 * we can get a lot of faults during a flush loop, so it makes 1355 * sense to try to do it here with minimum overhead. We only 1356 * emulate fdc,fic,pdc,probew,prober instructions whose base 1357 * and index registers are not shadowed. We defer everything 1358 * else to the "slow" path. 1359 */ 1360 1361 mfctl %cr19,%r9 /* Get iir */ 1362 1363 /* PA 2.0 Arch Ref. Book pg 382 has a good description of the insn bits. 1364 Checks for fdc,fdce,pdc,"fic,4f",prober,probeir,probew, probeiw */ 1365 1366 /* Checks for fdc,fdce,pdc,"fic,4f" only */ 1367 ldi 0x280,%r16 1368 and %r9,%r16,%r17 1369 cmpb,<>,n %r16,%r17,nadtlb_probe_check 1370 bb,>=,n %r9,26,nadtlb_nullify /* m bit not set, just nullify */ 1371 BL get_register,%r25 1372 extrw,u %r9,15,5,%r8 /* Get index register # */ 1373 cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */ 1374 copy %r1,%r24 1375 BL get_register,%r25 1376 extrw,u %r9,10,5,%r8 /* Get base register # */ 1377 cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */ 1378 BL set_register,%r25 1379 add,l %r1,%r24,%r1 /* doesn't affect c/b bits */ 1380 1381nadtlb_nullify: 1382 mfctl %ipsw,%r8 1383 ldil L%PSW_N,%r9 1384 or %r8,%r9,%r8 /* Set PSW_N */ 1385 mtctl %r8,%ipsw 1386 1387 rfir 1388 nop 1389 1390 /* 1391 When there is no translation for the probe address then we 1392 must nullify the insn and return zero in the target register. 1393 This will indicate to the calling code that it does not have 1394 write/read privileges to this address. 1395 1396 This should technically work for prober and probew in PA 1.1, 1397 and also probe,r and probe,w in PA 2.0 1398 1399 WARNING: USE ONLY NON-SHADOW REGISTERS WITH PROBE INSN! 1400 THE SLOW-PATH EMULATION HAS NOT BEEN WRITTEN YET. 1401 1402 */ 1403nadtlb_probe_check: 1404 ldi 0x80,%r16 1405 and %r9,%r16,%r17 1406 cmpb,<>,n %r16,%r17,nadtlb_fault /* Must be probe,[rw]*/ 1407 BL get_register,%r25 /* Find the target register */ 1408 extrw,u %r9,31,5,%r8 /* Get target register */ 1409 cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */ 1410 BL set_register,%r25 1411 copy %r0,%r1 /* Write zero to target register */ 1412 b nadtlb_nullify /* Nullify return insn */ 1413 nop 1414 1415 1416#ifdef CONFIG_64BIT 1417itlb_miss_20w: 1418 1419 /* 1420 * I miss is a little different, since we allow users to fault 1421 * on the gateway page which is in the kernel address space. 1422 */ 1423 1424 space_adjust spc,va,t0 1425 get_pgd spc,ptp 1426 space_check spc,t0,itlb_fault 1427 1428 L3_ptep ptp,pte,t0,va,itlb_fault 1429 1430 tlb_lock spc,ptp,pte,t0,t1,itlb_fault 1431 update_accessed ptp,pte,t0,t1 1432 1433 make_insert_tlb spc,pte,prot,t1 1434 1435 iitlbt pte,prot 1436 1437 tlb_unlock1 spc,t0 1438 rfir 1439 nop 1440 1441naitlb_miss_20w: 1442 1443 /* 1444 * I miss is a little different, since we allow users to fault 1445 * on the gateway page which is in the kernel address space. 1446 */ 1447 1448 space_adjust spc,va,t0 1449 get_pgd spc,ptp 1450 space_check spc,t0,naitlb_fault 1451 1452 L3_ptep ptp,pte,t0,va,naitlb_check_alias_20w 1453 1454 tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_20w 1455 update_accessed ptp,pte,t0,t1 1456 1457 make_insert_tlb spc,pte,prot,t1 1458 1459 iitlbt pte,prot 1460 1461 tlb_unlock1 spc,t0 1462 rfir 1463 nop 1464 1465naitlb_check_alias_20w: 1466 do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20 1467 1468 iitlbt pte,prot 1469 1470 rfir 1471 nop 1472 1473#else 1474 1475itlb_miss_11: 1476 get_pgd spc,ptp 1477 1478 space_check spc,t0,itlb_fault 1479 1480 L2_ptep ptp,pte,t0,va,itlb_fault 1481 1482 tlb_lock spc,ptp,pte,t0,t1,itlb_fault 1483 update_accessed ptp,pte,t0,t1 1484 1485 make_insert_tlb_11 spc,pte,prot 1486 1487 mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */ 1488 mtsp spc,%sr1 1489 1490 iitlba pte,(%sr1,va) 1491 iitlbp prot,(%sr1,va) 1492 1493 mtsp t1, %sr1 /* Restore sr1 */ 1494 1495 tlb_unlock1 spc,t0 1496 rfir 1497 nop 1498 1499naitlb_miss_11: 1500 get_pgd spc,ptp 1501 1502 space_check spc,t0,naitlb_fault 1503 1504 L2_ptep ptp,pte,t0,va,naitlb_check_alias_11 1505 1506 tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_11 1507 update_accessed ptp,pte,t0,t1 1508 1509 make_insert_tlb_11 spc,pte,prot 1510 1511 mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */ 1512 mtsp spc,%sr1 1513 1514 iitlba pte,(%sr1,va) 1515 iitlbp prot,(%sr1,va) 1516 1517 mtsp t1, %sr1 /* Restore sr1 */ 1518 1519 tlb_unlock1 spc,t0 1520 rfir 1521 nop 1522 1523naitlb_check_alias_11: 1524 do_alias spc,t0,t1,va,pte,prot,itlb_fault,11 1525 1526 iitlba pte,(%sr0, va) 1527 iitlbp prot,(%sr0, va) 1528 1529 rfir 1530 nop 1531 1532 1533itlb_miss_20: 1534 get_pgd spc,ptp 1535 1536 space_check spc,t0,itlb_fault 1537 1538 L2_ptep ptp,pte,t0,va,itlb_fault 1539 1540 tlb_lock spc,ptp,pte,t0,t1,itlb_fault 1541 update_accessed ptp,pte,t0,t1 1542 1543 make_insert_tlb spc,pte,prot,t1 1544 1545 f_extend pte,t1 1546 1547 iitlbt pte,prot 1548 1549 tlb_unlock1 spc,t0 1550 rfir 1551 nop 1552 1553naitlb_miss_20: 1554 get_pgd spc,ptp 1555 1556 space_check spc,t0,naitlb_fault 1557 1558 L2_ptep ptp,pte,t0,va,naitlb_check_alias_20 1559 1560 tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_20 1561 update_accessed ptp,pte,t0,t1 1562 1563 make_insert_tlb spc,pte,prot,t1 1564 1565 f_extend pte,t1 1566 1567 iitlbt pte,prot 1568 1569 tlb_unlock1 spc,t0 1570 rfir 1571 nop 1572 1573naitlb_check_alias_20: 1574 do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20 1575 1576 iitlbt pte,prot 1577 1578 rfir 1579 nop 1580 1581#endif 1582 1583#ifdef CONFIG_64BIT 1584 1585dbit_trap_20w: 1586 space_adjust spc,va,t0 1587 get_pgd spc,ptp 1588 space_check spc,t0,dbit_fault 1589 1590 L3_ptep ptp,pte,t0,va,dbit_fault 1591 1592 tlb_lock spc,ptp,pte,t0,t1,dbit_fault 1593 update_dirty ptp,pte,t1 1594 1595 make_insert_tlb spc,pte,prot,t1 1596 1597 idtlbt pte,prot 1598 1599 tlb_unlock0 spc,t0 1600 rfir 1601 nop 1602#else 1603 1604dbit_trap_11: 1605 1606 get_pgd spc,ptp 1607 1608 space_check spc,t0,dbit_fault 1609 1610 L2_ptep ptp,pte,t0,va,dbit_fault 1611 1612 tlb_lock spc,ptp,pte,t0,t1,dbit_fault 1613 update_dirty ptp,pte,t1 1614 1615 make_insert_tlb_11 spc,pte,prot 1616 1617 mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */ 1618 mtsp spc,%sr1 1619 1620 idtlba pte,(%sr1,va) 1621 idtlbp prot,(%sr1,va) 1622 1623 mtsp t1, %sr1 /* Restore sr1 */ 1624 1625 tlb_unlock0 spc,t0 1626 rfir 1627 nop 1628 1629dbit_trap_20: 1630 get_pgd spc,ptp 1631 1632 space_check spc,t0,dbit_fault 1633 1634 L2_ptep ptp,pte,t0,va,dbit_fault 1635 1636 tlb_lock spc,ptp,pte,t0,t1,dbit_fault 1637 update_dirty ptp,pte,t1 1638 1639 make_insert_tlb spc,pte,prot,t1 1640 1641 f_extend pte,t1 1642 1643 idtlbt pte,prot 1644 1645 tlb_unlock0 spc,t0 1646 rfir 1647 nop 1648#endif 1649 1650 .import handle_interruption,code 1651 1652kernel_bad_space: 1653 b intr_save 1654 ldi 31,%r8 /* Use an unused code */ 1655 1656dbit_fault: 1657 b intr_save 1658 ldi 20,%r8 1659 1660itlb_fault: 1661 b intr_save 1662 ldi PARISC_ITLB_TRAP,%r8 1663 1664nadtlb_fault: 1665 b intr_save 1666 ldi 17,%r8 1667 1668naitlb_fault: 1669 b intr_save 1670 ldi 16,%r8 1671 1672dtlb_fault: 1673 b intr_save 1674 ldi 15,%r8 1675 1676 /* Register saving semantics for system calls: 1677 1678 %r1 clobbered by system call macro in userspace 1679 %r2 saved in PT_REGS by gateway page 1680 %r3 - %r18 preserved by C code (saved by signal code) 1681 %r19 - %r20 saved in PT_REGS by gateway page 1682 %r21 - %r22 non-standard syscall args 1683 stored in kernel stack by gateway page 1684 %r23 - %r26 arg3-arg0, saved in PT_REGS by gateway page 1685 %r27 - %r30 saved in PT_REGS by gateway page 1686 %r31 syscall return pointer 1687 */ 1688 1689 /* Floating point registers (FIXME: what do we do with these?) 1690 1691 %fr0 - %fr3 status/exception, not preserved 1692 %fr4 - %fr7 arguments 1693 %fr8 - %fr11 not preserved by C code 1694 %fr12 - %fr21 preserved by C code 1695 %fr22 - %fr31 not preserved by C code 1696 */ 1697 1698 .macro reg_save regs 1699 STREG %r3, PT_GR3(\regs) 1700 STREG %r4, PT_GR4(\regs) 1701 STREG %r5, PT_GR5(\regs) 1702 STREG %r6, PT_GR6(\regs) 1703 STREG %r7, PT_GR7(\regs) 1704 STREG %r8, PT_GR8(\regs) 1705 STREG %r9, PT_GR9(\regs) 1706 STREG %r10,PT_GR10(\regs) 1707 STREG %r11,PT_GR11(\regs) 1708 STREG %r12,PT_GR12(\regs) 1709 STREG %r13,PT_GR13(\regs) 1710 STREG %r14,PT_GR14(\regs) 1711 STREG %r15,PT_GR15(\regs) 1712 STREG %r16,PT_GR16(\regs) 1713 STREG %r17,PT_GR17(\regs) 1714 STREG %r18,PT_GR18(\regs) 1715 .endm 1716 1717 .macro reg_restore regs 1718 LDREG PT_GR3(\regs), %r3 1719 LDREG PT_GR4(\regs), %r4 1720 LDREG PT_GR5(\regs), %r5 1721 LDREG PT_GR6(\regs), %r6 1722 LDREG PT_GR7(\regs), %r7 1723 LDREG PT_GR8(\regs), %r8 1724 LDREG PT_GR9(\regs), %r9 1725 LDREG PT_GR10(\regs),%r10 1726 LDREG PT_GR11(\regs),%r11 1727 LDREG PT_GR12(\regs),%r12 1728 LDREG PT_GR13(\regs),%r13 1729 LDREG PT_GR14(\regs),%r14 1730 LDREG PT_GR15(\regs),%r15 1731 LDREG PT_GR16(\regs),%r16 1732 LDREG PT_GR17(\regs),%r17 1733 LDREG PT_GR18(\regs),%r18 1734 .endm 1735 1736 .macro fork_like name 1737ENTRY_CFI(sys_\name\()_wrapper) 1738 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 1739 ldo TASK_REGS(%r1),%r1 1740 reg_save %r1 1741 mfctl %cr27, %r28 1742 ldil L%sys_\name, %r31 1743 be R%sys_\name(%sr4,%r31) 1744 STREG %r28, PT_CR27(%r1) 1745ENDPROC_CFI(sys_\name\()_wrapper) 1746 .endm 1747 1748fork_like clone 1749fork_like fork 1750fork_like vfork 1751 1752 /* Set the return value for the child */ 1753ENTRY(child_return) 1754 BL schedule_tail, %r2 1755 nop 1756finish_child_return: 1757 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1 1758 ldo TASK_REGS(%r1),%r1 /* get pt regs */ 1759 1760 LDREG PT_CR27(%r1), %r3 1761 mtctl %r3, %cr27 1762 reg_restore %r1 1763 b syscall_exit 1764 copy %r0,%r28 1765END(child_return) 1766 1767ENTRY_CFI(sys_rt_sigreturn_wrapper) 1768 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 1769 ldo TASK_REGS(%r26),%r26 /* get pt regs */ 1770 /* Don't save regs, we are going to restore them from sigcontext. */ 1771 STREG %r2, -RP_OFFSET(%r30) 1772#ifdef CONFIG_64BIT 1773 ldo FRAME_SIZE(%r30), %r30 1774 BL sys_rt_sigreturn,%r2 1775 ldo -16(%r30),%r29 /* Reference param save area */ 1776#else 1777 BL sys_rt_sigreturn,%r2 1778 ldo FRAME_SIZE(%r30), %r30 1779#endif 1780 1781 ldo -FRAME_SIZE(%r30), %r30 1782 LDREG -RP_OFFSET(%r30), %r2 1783 1784 /* FIXME: I think we need to restore a few more things here. */ 1785 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 1786 ldo TASK_REGS(%r1),%r1 /* get pt regs */ 1787 reg_restore %r1 1788 1789 /* If the signal was received while the process was blocked on a 1790 * syscall, then r2 will take us to syscall_exit; otherwise r2 will 1791 * take us to syscall_exit_rfi and on to intr_return. 1792 */ 1793 bv %r0(%r2) 1794 LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ 1795ENDPROC_CFI(sys_rt_sigreturn_wrapper) 1796 1797ENTRY(syscall_exit) 1798 /* NOTE: Not all syscalls exit this way. rt_sigreturn will exit 1799 * via syscall_exit_rfi if the signal was received while the process 1800 * was running. 1801 */ 1802 1803 /* save return value now */ 1804 1805 mfctl %cr30, %r1 1806 LDREG TI_TASK(%r1),%r1 1807 STREG %r28,TASK_PT_GR28(%r1) 1808 1809 /* Seems to me that dp could be wrong here, if the syscall involved 1810 * calling a module, and nothing got round to restoring dp on return. 1811 */ 1812 loadgp 1813 1814syscall_check_resched: 1815 1816 /* check for reschedule */ 1817 1818 LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 /* long */ 1819 bb,<,n %r19, 31-TIF_NEED_RESCHED, syscall_do_resched /* forward */ 1820 1821 .import do_signal,code 1822syscall_check_sig: 1823 LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 1824 ldi (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME), %r26 1825 and,COND(<>) %r19, %r26, %r0 1826 b,n syscall_restore /* skip past if we've nothing to do */ 1827 1828syscall_do_signal: 1829 /* Save callee-save registers (for sigcontext). 1830 * FIXME: After this point the process structure should be 1831 * consistent with all the relevant state of the process 1832 * before the syscall. We need to verify this. 1833 */ 1834 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 1835 ldo TASK_REGS(%r1), %r26 /* struct pt_regs *regs */ 1836 reg_save %r26 1837 1838#ifdef CONFIG_64BIT 1839 ldo -16(%r30),%r29 /* Reference param save area */ 1840#endif 1841 1842 BL do_notify_resume,%r2 1843 ldi 1, %r25 /* long in_syscall = 1 */ 1844 1845 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 1846 ldo TASK_REGS(%r1), %r20 /* reload pt_regs */ 1847 reg_restore %r20 1848 1849 b,n syscall_check_sig 1850 1851syscall_restore: 1852 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 1853 1854 /* Are we being ptraced? */ 1855 ldw TASK_FLAGS(%r1),%r19 1856 ldi _TIF_SYSCALL_TRACE_MASK,%r2 1857 and,COND(=) %r19,%r2,%r0 1858 b,n syscall_restore_rfi 1859 1860 ldo TASK_PT_FR31(%r1),%r19 /* reload fpregs */ 1861 rest_fp %r19 1862 1863 LDREG TASK_PT_SAR(%r1),%r19 /* restore SAR */ 1864 mtsar %r19 1865 1866 LDREG TASK_PT_GR2(%r1),%r2 /* restore user rp */ 1867 LDREG TASK_PT_GR19(%r1),%r19 1868 LDREG TASK_PT_GR20(%r1),%r20 1869 LDREG TASK_PT_GR21(%r1),%r21 1870 LDREG TASK_PT_GR22(%r1),%r22 1871 LDREG TASK_PT_GR23(%r1),%r23 1872 LDREG TASK_PT_GR24(%r1),%r24 1873 LDREG TASK_PT_GR25(%r1),%r25 1874 LDREG TASK_PT_GR26(%r1),%r26 1875 LDREG TASK_PT_GR27(%r1),%r27 /* restore user dp */ 1876 LDREG TASK_PT_GR28(%r1),%r28 /* syscall return value */ 1877 LDREG TASK_PT_GR29(%r1),%r29 1878 LDREG TASK_PT_GR31(%r1),%r31 /* restore syscall rp */ 1879 1880 /* NOTE: We use rsm/ssm pair to make this operation atomic */ 1881 LDREG TASK_PT_GR30(%r1),%r1 /* Get user sp */ 1882 rsm PSW_SM_I, %r0 1883 copy %r1,%r30 /* Restore user sp */ 1884 mfsp %sr3,%r1 /* Get user space id */ 1885 mtsp %r1,%sr7 /* Restore sr7 */ 1886 ssm PSW_SM_I, %r0 1887 1888 /* Set sr2 to zero for userspace syscalls to work. */ 1889 mtsp %r0,%sr2 1890 mtsp %r1,%sr4 /* Restore sr4 */ 1891 mtsp %r1,%sr5 /* Restore sr5 */ 1892 mtsp %r1,%sr6 /* Restore sr6 */ 1893 1894 depi 3,31,2,%r31 /* ensure return to user mode. */ 1895 1896#ifdef CONFIG_64BIT 1897 /* decide whether to reset the wide mode bit 1898 * 1899 * For a syscall, the W bit is stored in the lowest bit 1900 * of sp. Extract it and reset W if it is zero */ 1901 extrd,u,*<> %r30,63,1,%r1 1902 rsm PSW_SM_W, %r0 1903 /* now reset the lowest bit of sp if it was set */ 1904 xor %r30,%r1,%r30 1905#endif 1906 be,n 0(%sr3,%r31) /* return to user space */ 1907 1908 /* We have to return via an RFI, so that PSW T and R bits can be set 1909 * appropriately. 1910 * This sets up pt_regs so we can return via intr_restore, which is not 1911 * the most efficient way of doing things, but it works. 1912 */ 1913syscall_restore_rfi: 1914 ldo -1(%r0),%r2 /* Set recovery cntr to -1 */ 1915 mtctl %r2,%cr0 /* for immediate trap */ 1916 LDREG TASK_PT_PSW(%r1),%r2 /* Get old PSW */ 1917 ldi 0x0b,%r20 /* Create new PSW */ 1918 depi -1,13,1,%r20 /* C, Q, D, and I bits */ 1919 1920 /* The values of SINGLESTEP_BIT and BLOCKSTEP_BIT are 1921 * set in thread_info.h and converted to PA bitmap 1922 * numbers in asm-offsets.c */ 1923 1924 /* if ((%r19.SINGLESTEP_BIT)) { %r20.27=1} */ 1925 extru,= %r19,TIF_SINGLESTEP_PA_BIT,1,%r0 1926 depi -1,27,1,%r20 /* R bit */ 1927 1928 /* if ((%r19.BLOCKSTEP_BIT)) { %r20.7=1} */ 1929 extru,= %r19,TIF_BLOCKSTEP_PA_BIT,1,%r0 1930 depi -1,7,1,%r20 /* T bit */ 1931 1932 STREG %r20,TASK_PT_PSW(%r1) 1933 1934 /* Always store space registers, since sr3 can be changed (e.g. fork) */ 1935 1936 mfsp %sr3,%r25 1937 STREG %r25,TASK_PT_SR3(%r1) 1938 STREG %r25,TASK_PT_SR4(%r1) 1939 STREG %r25,TASK_PT_SR5(%r1) 1940 STREG %r25,TASK_PT_SR6(%r1) 1941 STREG %r25,TASK_PT_SR7(%r1) 1942 STREG %r25,TASK_PT_IASQ0(%r1) 1943 STREG %r25,TASK_PT_IASQ1(%r1) 1944 1945 /* XXX W bit??? */ 1946 /* Now if old D bit is clear, it means we didn't save all registers 1947 * on syscall entry, so do that now. This only happens on TRACEME 1948 * calls, or if someone attached to us while we were on a syscall. 1949 * We could make this more efficient by not saving r3-r18, but 1950 * then we wouldn't be able to use the common intr_restore path. 1951 * It is only for traced processes anyway, so performance is not 1952 * an issue. 1953 */ 1954 bb,< %r2,30,pt_regs_ok /* Branch if D set */ 1955 ldo TASK_REGS(%r1),%r25 1956 reg_save %r25 /* Save r3 to r18 */ 1957 1958 /* Save the current sr */ 1959 mfsp %sr0,%r2 1960 STREG %r2,TASK_PT_SR0(%r1) 1961 1962 /* Save the scratch sr */ 1963 mfsp %sr1,%r2 1964 STREG %r2,TASK_PT_SR1(%r1) 1965 1966 /* sr2 should be set to zero for userspace syscalls */ 1967 STREG %r0,TASK_PT_SR2(%r1) 1968 1969 LDREG TASK_PT_GR31(%r1),%r2 1970 depi 3,31,2,%r2 /* ensure return to user mode. */ 1971 STREG %r2,TASK_PT_IAOQ0(%r1) 1972 ldo 4(%r2),%r2 1973 STREG %r2,TASK_PT_IAOQ1(%r1) 1974 b intr_restore 1975 copy %r25,%r16 1976 1977pt_regs_ok: 1978 LDREG TASK_PT_IAOQ0(%r1),%r2 1979 depi 3,31,2,%r2 /* ensure return to user mode. */ 1980 STREG %r2,TASK_PT_IAOQ0(%r1) 1981 LDREG TASK_PT_IAOQ1(%r1),%r2 1982 depi 3,31,2,%r2 1983 STREG %r2,TASK_PT_IAOQ1(%r1) 1984 b intr_restore 1985 copy %r25,%r16 1986 1987syscall_do_resched: 1988 load32 syscall_check_resched,%r2 /* if resched, we start over again */ 1989 load32 schedule,%r19 1990 bv %r0(%r19) /* jumps to schedule() */ 1991#ifdef CONFIG_64BIT 1992 ldo -16(%r30),%r29 /* Reference param save area */ 1993#else 1994 nop 1995#endif 1996END(syscall_exit) 1997 1998 1999#ifdef CONFIG_FUNCTION_TRACER 2000 2001 .import ftrace_function_trampoline,code 2002 .align L1_CACHE_BYTES 2003ENTRY_CFI(mcount, caller) 2004_mcount: 2005 .export _mcount,data 2006 /* 2007 * The 64bit mcount() function pointer needs 4 dwords, of which the 2008 * first two are free. We optimize it here and put 2 instructions for 2009 * calling mcount(), and 2 instructions for ftrace_stub(). That way we 2010 * have all on one L1 cacheline. 2011 */ 2012 b ftrace_function_trampoline 2013 copy %r3, %arg2 /* caller original %sp */ 2014ftrace_stub: 2015 .globl ftrace_stub 2016 .type ftrace_stub, @function 2017#ifdef CONFIG_64BIT 2018 bve (%rp) 2019#else 2020 bv %r0(%rp) 2021#endif 2022 nop 2023#ifdef CONFIG_64BIT 2024 .dword mcount 2025 .dword 0 /* code in head.S puts value of global gp here */ 2026#endif 2027ENDPROC_CFI(mcount) 2028 2029#ifdef CONFIG_FUNCTION_GRAPH_TRACER 2030 .align 8 2031ENTRY_CFI(return_to_handler, caller,frame=FRAME_SIZE) 2032 .export parisc_return_to_handler,data 2033parisc_return_to_handler: 2034 copy %r3,%r1 2035 STREG %r0,-RP_OFFSET(%sp) /* store 0 as %rp */ 2036 copy %sp,%r3 2037 STREGM %r1,FRAME_SIZE(%sp) 2038 STREG %ret0,8(%r3) 2039 STREG %ret1,16(%r3) 2040 2041#ifdef CONFIG_64BIT 2042 loadgp 2043#endif 2044 2045 /* call ftrace_return_to_handler(0) */ 2046 .import ftrace_return_to_handler,code 2047 load32 ftrace_return_to_handler,%ret0 2048 load32 .Lftrace_ret,%r2 2049#ifdef CONFIG_64BIT 2050 ldo -16(%sp),%ret1 /* Reference param save area */ 2051 bve (%ret0) 2052#else 2053 bv %r0(%ret0) 2054#endif 2055 ldi 0,%r26 2056.Lftrace_ret: 2057 copy %ret0,%rp 2058 2059 /* restore original return values */ 2060 LDREG 8(%r3),%ret0 2061 LDREG 16(%r3),%ret1 2062 2063 /* return from function */ 2064#ifdef CONFIG_64BIT 2065 bve (%rp) 2066#else 2067 bv %r0(%rp) 2068#endif 2069 LDREGM -FRAME_SIZE(%sp),%r3 2070ENDPROC_CFI(return_to_handler) 2071 2072#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ 2073 2074#endif /* CONFIG_FUNCTION_TRACER */ 2075 2076#ifdef CONFIG_IRQSTACKS 2077/* void call_on_stack(unsigned long param1, void *func, 2078 unsigned long new_stack) */ 2079ENTRY_CFI(call_on_stack, FRAME=2*FRAME_SIZE,CALLS,SAVE_RP,SAVE_SP) 2080ENTRY(_call_on_stack) 2081 copy %sp, %r1 2082 2083 /* Regarding the HPPA calling conventions for function pointers, 2084 we assume the PIC register is not changed across call. For 2085 CONFIG_64BIT, the argument pointer is left to point at the 2086 argument region allocated for the call to call_on_stack. */ 2087 2088 /* Switch to new stack. We allocate two frames. */ 2089 ldo 2*FRAME_SIZE(%arg2), %sp 2090# ifdef CONFIG_64BIT 2091 /* Save previous stack pointer and return pointer in frame marker */ 2092 STREG %rp, -FRAME_SIZE-RP_OFFSET(%sp) 2093 /* Calls always use function descriptor */ 2094 LDREG 16(%arg1), %arg1 2095 bve,l (%arg1), %rp 2096 STREG %r1, -FRAME_SIZE-REG_SZ(%sp) 2097 LDREG -FRAME_SIZE-RP_OFFSET(%sp), %rp 2098 bve (%rp) 2099 LDREG -FRAME_SIZE-REG_SZ(%sp), %sp 2100# else 2101 /* Save previous stack pointer and return pointer in frame marker */ 2102 STREG %r1, -FRAME_SIZE-REG_SZ(%sp) 2103 STREG %rp, -FRAME_SIZE-RP_OFFSET(%sp) 2104 /* Calls use function descriptor if PLABEL bit is set */ 2105 bb,>=,n %arg1, 30, 1f 2106 depwi 0,31,2, %arg1 2107 LDREG 0(%arg1), %arg1 21081: 2109 be,l 0(%sr4,%arg1), %sr0, %r31 2110 copy %r31, %rp 2111 LDREG -FRAME_SIZE-RP_OFFSET(%sp), %rp 2112 bv (%rp) 2113 LDREG -FRAME_SIZE-REG_SZ(%sp), %sp 2114# endif /* CONFIG_64BIT */ 2115ENDPROC_CFI(call_on_stack) 2116#endif /* CONFIG_IRQSTACKS */ 2117 2118ENTRY_CFI(get_register) 2119 /* 2120 * get_register is used by the non access tlb miss handlers to 2121 * copy the value of the general register specified in r8 into 2122 * r1. This routine can't be used for shadowed registers, since 2123 * the rfir will restore the original value. So, for the shadowed 2124 * registers we put a -1 into r1 to indicate that the register 2125 * should not be used (the register being copied could also have 2126 * a -1 in it, but that is OK, it just means that we will have 2127 * to use the slow path instead). 2128 */ 2129 blr %r8,%r0 2130 nop 2131 bv %r0(%r25) /* r0 */ 2132 copy %r0,%r1 2133 bv %r0(%r25) /* r1 - shadowed */ 2134 ldi -1,%r1 2135 bv %r0(%r25) /* r2 */ 2136 copy %r2,%r1 2137 bv %r0(%r25) /* r3 */ 2138 copy %r3,%r1 2139 bv %r0(%r25) /* r4 */ 2140 copy %r4,%r1 2141 bv %r0(%r25) /* r5 */ 2142 copy %r5,%r1 2143 bv %r0(%r25) /* r6 */ 2144 copy %r6,%r1 2145 bv %r0(%r25) /* r7 */ 2146 copy %r7,%r1 2147 bv %r0(%r25) /* r8 - shadowed */ 2148 ldi -1,%r1 2149 bv %r0(%r25) /* r9 - shadowed */ 2150 ldi -1,%r1 2151 bv %r0(%r25) /* r10 */ 2152 copy %r10,%r1 2153 bv %r0(%r25) /* r11 */ 2154 copy %r11,%r1 2155 bv %r0(%r25) /* r12 */ 2156 copy %r12,%r1 2157 bv %r0(%r25) /* r13 */ 2158 copy %r13,%r1 2159 bv %r0(%r25) /* r14 */ 2160 copy %r14,%r1 2161 bv %r0(%r25) /* r15 */ 2162 copy %r15,%r1 2163 bv %r0(%r25) /* r16 - shadowed */ 2164 ldi -1,%r1 2165 bv %r0(%r25) /* r17 - shadowed */ 2166 ldi -1,%r1 2167 bv %r0(%r25) /* r18 */ 2168 copy %r18,%r1 2169 bv %r0(%r25) /* r19 */ 2170 copy %r19,%r1 2171 bv %r0(%r25) /* r20 */ 2172 copy %r20,%r1 2173 bv %r0(%r25) /* r21 */ 2174 copy %r21,%r1 2175 bv %r0(%r25) /* r22 */ 2176 copy %r22,%r1 2177 bv %r0(%r25) /* r23 */ 2178 copy %r23,%r1 2179 bv %r0(%r25) /* r24 - shadowed */ 2180 ldi -1,%r1 2181 bv %r0(%r25) /* r25 - shadowed */ 2182 ldi -1,%r1 2183 bv %r0(%r25) /* r26 */ 2184 copy %r26,%r1 2185 bv %r0(%r25) /* r27 */ 2186 copy %r27,%r1 2187 bv %r0(%r25) /* r28 */ 2188 copy %r28,%r1 2189 bv %r0(%r25) /* r29 */ 2190 copy %r29,%r1 2191 bv %r0(%r25) /* r30 */ 2192 copy %r30,%r1 2193 bv %r0(%r25) /* r31 */ 2194 copy %r31,%r1 2195ENDPROC_CFI(get_register) 2196 2197 2198ENTRY_CFI(set_register) 2199 /* 2200 * set_register is used by the non access tlb miss handlers to 2201 * copy the value of r1 into the general register specified in 2202 * r8. 2203 */ 2204 blr %r8,%r0 2205 nop 2206 bv %r0(%r25) /* r0 (silly, but it is a place holder) */ 2207 copy %r1,%r0 2208 bv %r0(%r25) /* r1 */ 2209 copy %r1,%r1 2210 bv %r0(%r25) /* r2 */ 2211 copy %r1,%r2 2212 bv %r0(%r25) /* r3 */ 2213 copy %r1,%r3 2214 bv %r0(%r25) /* r4 */ 2215 copy %r1,%r4 2216 bv %r0(%r25) /* r5 */ 2217 copy %r1,%r5 2218 bv %r0(%r25) /* r6 */ 2219 copy %r1,%r6 2220 bv %r0(%r25) /* r7 */ 2221 copy %r1,%r7 2222 bv %r0(%r25) /* r8 */ 2223 copy %r1,%r8 2224 bv %r0(%r25) /* r9 */ 2225 copy %r1,%r9 2226 bv %r0(%r25) /* r10 */ 2227 copy %r1,%r10 2228 bv %r0(%r25) /* r11 */ 2229 copy %r1,%r11 2230 bv %r0(%r25) /* r12 */ 2231 copy %r1,%r12 2232 bv %r0(%r25) /* r13 */ 2233 copy %r1,%r13 2234 bv %r0(%r25) /* r14 */ 2235 copy %r1,%r14 2236 bv %r0(%r25) /* r15 */ 2237 copy %r1,%r15 2238 bv %r0(%r25) /* r16 */ 2239 copy %r1,%r16 2240 bv %r0(%r25) /* r17 */ 2241 copy %r1,%r17 2242 bv %r0(%r25) /* r18 */ 2243 copy %r1,%r18 2244 bv %r0(%r25) /* r19 */ 2245 copy %r1,%r19 2246 bv %r0(%r25) /* r20 */ 2247 copy %r1,%r20 2248 bv %r0(%r25) /* r21 */ 2249 copy %r1,%r21 2250 bv %r0(%r25) /* r22 */ 2251 copy %r1,%r22 2252 bv %r0(%r25) /* r23 */ 2253 copy %r1,%r23 2254 bv %r0(%r25) /* r24 */ 2255 copy %r1,%r24 2256 bv %r0(%r25) /* r25 */ 2257 copy %r1,%r25 2258 bv %r0(%r25) /* r26 */ 2259 copy %r1,%r26 2260 bv %r0(%r25) /* r27 */ 2261 copy %r1,%r27 2262 bv %r0(%r25) /* r28 */ 2263 copy %r1,%r28 2264 bv %r0(%r25) /* r29 */ 2265 copy %r1,%r29 2266 bv %r0(%r25) /* r30 */ 2267 copy %r1,%r30 2268 bv %r0(%r25) /* r31 */ 2269 copy %r1,%r31 2270ENDPROC_CFI(set_register) 2271 2272