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