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