18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * arch/alpha/kernel/entry.S
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Kernel entry-points.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h>
98c2ecf20Sopenharmony_ci#include <asm/thread_info.h>
108c2ecf20Sopenharmony_ci#include <asm/pal.h>
118c2ecf20Sopenharmony_ci#include <asm/errno.h>
128c2ecf20Sopenharmony_ci#include <asm/unistd.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci	.text
158c2ecf20Sopenharmony_ci	.set noat
168c2ecf20Sopenharmony_ci	.cfi_sections	.debug_frame
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci/* Stack offsets.  */
198c2ecf20Sopenharmony_ci#define SP_OFF			184
208c2ecf20Sopenharmony_ci#define SWITCH_STACK_SIZE	320
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci.macro	CFI_START_OSF_FRAME	func
238c2ecf20Sopenharmony_ci	.align	4
248c2ecf20Sopenharmony_ci	.globl	\func
258c2ecf20Sopenharmony_ci	.type	\func,@function
268c2ecf20Sopenharmony_ci\func:
278c2ecf20Sopenharmony_ci	.cfi_startproc simple
288c2ecf20Sopenharmony_ci	.cfi_return_column 64
298c2ecf20Sopenharmony_ci	.cfi_def_cfa	$sp, 48
308c2ecf20Sopenharmony_ci	.cfi_rel_offset	64, 8
318c2ecf20Sopenharmony_ci	.cfi_rel_offset	$gp, 16
328c2ecf20Sopenharmony_ci	.cfi_rel_offset	$16, 24
338c2ecf20Sopenharmony_ci	.cfi_rel_offset	$17, 32
348c2ecf20Sopenharmony_ci	.cfi_rel_offset	$18, 40
358c2ecf20Sopenharmony_ci.endm
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci.macro	CFI_END_OSF_FRAME	func
388c2ecf20Sopenharmony_ci	.cfi_endproc
398c2ecf20Sopenharmony_ci	.size	\func, . - \func
408c2ecf20Sopenharmony_ci.endm
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/*
438c2ecf20Sopenharmony_ci * This defines the normal kernel pt-regs layout.
448c2ecf20Sopenharmony_ci *
458c2ecf20Sopenharmony_ci * regs 9-15 preserved by C code
468c2ecf20Sopenharmony_ci * regs 16-18 saved by PAL-code
478c2ecf20Sopenharmony_ci * regs 29-30 saved and set up by PAL-code
488c2ecf20Sopenharmony_ci * JRP - Save regs 16-18 in a special area of the stack, so that
498c2ecf20Sopenharmony_ci * the palcode-provided values are available to the signal handler.
508c2ecf20Sopenharmony_ci */
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci.macro	SAVE_ALL
538c2ecf20Sopenharmony_ci	subq	$sp, SP_OFF, $sp
548c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	SP_OFF
558c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
568c2ecf20Sopenharmony_ci	stq	$1, 8($sp)
578c2ecf20Sopenharmony_ci	stq	$2, 16($sp)
588c2ecf20Sopenharmony_ci	stq	$3, 24($sp)
598c2ecf20Sopenharmony_ci	stq	$4, 32($sp)
608c2ecf20Sopenharmony_ci	stq	$28, 144($sp)
618c2ecf20Sopenharmony_ci	.cfi_rel_offset	$0, 0
628c2ecf20Sopenharmony_ci	.cfi_rel_offset $1, 8
638c2ecf20Sopenharmony_ci	.cfi_rel_offset	$2, 16
648c2ecf20Sopenharmony_ci	.cfi_rel_offset	$3, 24
658c2ecf20Sopenharmony_ci	.cfi_rel_offset	$4, 32
668c2ecf20Sopenharmony_ci	.cfi_rel_offset	$28, 144
678c2ecf20Sopenharmony_ci	lda	$2, alpha_mv
688c2ecf20Sopenharmony_ci	stq	$5, 40($sp)
698c2ecf20Sopenharmony_ci	stq	$6, 48($sp)
708c2ecf20Sopenharmony_ci	stq	$7, 56($sp)
718c2ecf20Sopenharmony_ci	stq	$8, 64($sp)
728c2ecf20Sopenharmony_ci	stq	$19, 72($sp)
738c2ecf20Sopenharmony_ci	stq	$20, 80($sp)
748c2ecf20Sopenharmony_ci	stq	$21, 88($sp)
758c2ecf20Sopenharmony_ci	ldq	$2, HAE_CACHE($2)
768c2ecf20Sopenharmony_ci	stq	$22, 96($sp)
778c2ecf20Sopenharmony_ci	stq	$23, 104($sp)
788c2ecf20Sopenharmony_ci	stq	$24, 112($sp)
798c2ecf20Sopenharmony_ci	stq	$25, 120($sp)
808c2ecf20Sopenharmony_ci	stq	$26, 128($sp)
818c2ecf20Sopenharmony_ci	stq	$27, 136($sp)
828c2ecf20Sopenharmony_ci	stq	$2, 152($sp)
838c2ecf20Sopenharmony_ci	stq	$16, 160($sp)
848c2ecf20Sopenharmony_ci	stq	$17, 168($sp)
858c2ecf20Sopenharmony_ci	stq	$18, 176($sp)
868c2ecf20Sopenharmony_ci	.cfi_rel_offset	$5, 40
878c2ecf20Sopenharmony_ci	.cfi_rel_offset	$6, 48
888c2ecf20Sopenharmony_ci	.cfi_rel_offset	$7, 56
898c2ecf20Sopenharmony_ci	.cfi_rel_offset	$8, 64
908c2ecf20Sopenharmony_ci	.cfi_rel_offset $19, 72
918c2ecf20Sopenharmony_ci	.cfi_rel_offset	$20, 80
928c2ecf20Sopenharmony_ci	.cfi_rel_offset	$21, 88
938c2ecf20Sopenharmony_ci	.cfi_rel_offset $22, 96
948c2ecf20Sopenharmony_ci	.cfi_rel_offset	$23, 104
958c2ecf20Sopenharmony_ci	.cfi_rel_offset	$24, 112
968c2ecf20Sopenharmony_ci	.cfi_rel_offset	$25, 120
978c2ecf20Sopenharmony_ci	.cfi_rel_offset	$26, 128
988c2ecf20Sopenharmony_ci	.cfi_rel_offset	$27, 136
998c2ecf20Sopenharmony_ci.endm
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci.macro	RESTORE_ALL
1028c2ecf20Sopenharmony_ci	lda	$19, alpha_mv
1038c2ecf20Sopenharmony_ci	ldq	$0, 0($sp)
1048c2ecf20Sopenharmony_ci	ldq	$1, 8($sp)
1058c2ecf20Sopenharmony_ci	ldq	$2, 16($sp)
1068c2ecf20Sopenharmony_ci	ldq	$3, 24($sp)
1078c2ecf20Sopenharmony_ci	ldq	$21, 152($sp)
1088c2ecf20Sopenharmony_ci	ldq	$20, HAE_CACHE($19)
1098c2ecf20Sopenharmony_ci	ldq	$4, 32($sp)
1108c2ecf20Sopenharmony_ci	ldq	$5, 40($sp)
1118c2ecf20Sopenharmony_ci	ldq	$6, 48($sp)
1128c2ecf20Sopenharmony_ci	ldq	$7, 56($sp)
1138c2ecf20Sopenharmony_ci	subq	$20, $21, $20
1148c2ecf20Sopenharmony_ci	ldq	$8, 64($sp)
1158c2ecf20Sopenharmony_ci	beq	$20, 99f
1168c2ecf20Sopenharmony_ci	ldq	$20, HAE_REG($19)
1178c2ecf20Sopenharmony_ci	stq	$21, HAE_CACHE($19)
1188c2ecf20Sopenharmony_ci	stq	$21, 0($20)
1198c2ecf20Sopenharmony_ci99:	ldq	$19, 72($sp)
1208c2ecf20Sopenharmony_ci	ldq	$20, 80($sp)
1218c2ecf20Sopenharmony_ci	ldq	$21, 88($sp)
1228c2ecf20Sopenharmony_ci	ldq	$22, 96($sp)
1238c2ecf20Sopenharmony_ci	ldq	$23, 104($sp)
1248c2ecf20Sopenharmony_ci	ldq	$24, 112($sp)
1258c2ecf20Sopenharmony_ci	ldq	$25, 120($sp)
1268c2ecf20Sopenharmony_ci	ldq	$26, 128($sp)
1278c2ecf20Sopenharmony_ci	ldq	$27, 136($sp)
1288c2ecf20Sopenharmony_ci	ldq	$28, 144($sp)
1298c2ecf20Sopenharmony_ci	addq	$sp, SP_OFF, $sp
1308c2ecf20Sopenharmony_ci	.cfi_restore	$0
1318c2ecf20Sopenharmony_ci	.cfi_restore	$1
1328c2ecf20Sopenharmony_ci	.cfi_restore	$2
1338c2ecf20Sopenharmony_ci	.cfi_restore	$3
1348c2ecf20Sopenharmony_ci	.cfi_restore	$4
1358c2ecf20Sopenharmony_ci	.cfi_restore	$5
1368c2ecf20Sopenharmony_ci	.cfi_restore	$6
1378c2ecf20Sopenharmony_ci	.cfi_restore	$7
1388c2ecf20Sopenharmony_ci	.cfi_restore	$8
1398c2ecf20Sopenharmony_ci	.cfi_restore	$19
1408c2ecf20Sopenharmony_ci	.cfi_restore	$20
1418c2ecf20Sopenharmony_ci	.cfi_restore	$21
1428c2ecf20Sopenharmony_ci	.cfi_restore	$22
1438c2ecf20Sopenharmony_ci	.cfi_restore	$23
1448c2ecf20Sopenharmony_ci	.cfi_restore	$24
1458c2ecf20Sopenharmony_ci	.cfi_restore	$25
1468c2ecf20Sopenharmony_ci	.cfi_restore	$26
1478c2ecf20Sopenharmony_ci	.cfi_restore	$27
1488c2ecf20Sopenharmony_ci	.cfi_restore	$28
1498c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	-SP_OFF
1508c2ecf20Sopenharmony_ci.endm
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci.macro	DO_SWITCH_STACK
1538c2ecf20Sopenharmony_ci	bsr	$1, do_switch_stack
1548c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	SWITCH_STACK_SIZE
1558c2ecf20Sopenharmony_ci	.cfi_rel_offset	$9, 0
1568c2ecf20Sopenharmony_ci	.cfi_rel_offset	$10, 8
1578c2ecf20Sopenharmony_ci	.cfi_rel_offset	$11, 16
1588c2ecf20Sopenharmony_ci	.cfi_rel_offset	$12, 24
1598c2ecf20Sopenharmony_ci	.cfi_rel_offset	$13, 32
1608c2ecf20Sopenharmony_ci	.cfi_rel_offset	$14, 40
1618c2ecf20Sopenharmony_ci	.cfi_rel_offset	$15, 48
1628c2ecf20Sopenharmony_ci	/* We don't really care about the FP registers for debugging.  */
1638c2ecf20Sopenharmony_ci.endm
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci.macro	UNDO_SWITCH_STACK
1668c2ecf20Sopenharmony_ci	bsr	$1, undo_switch_stack
1678c2ecf20Sopenharmony_ci	.cfi_restore	$9
1688c2ecf20Sopenharmony_ci	.cfi_restore	$10
1698c2ecf20Sopenharmony_ci	.cfi_restore	$11
1708c2ecf20Sopenharmony_ci	.cfi_restore	$12
1718c2ecf20Sopenharmony_ci	.cfi_restore	$13
1728c2ecf20Sopenharmony_ci	.cfi_restore	$14
1738c2ecf20Sopenharmony_ci	.cfi_restore	$15
1748c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	-SWITCH_STACK_SIZE
1758c2ecf20Sopenharmony_ci.endm
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci/*
1788c2ecf20Sopenharmony_ci * Non-syscall kernel entry points.
1798c2ecf20Sopenharmony_ci */
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ciCFI_START_OSF_FRAME entInt
1828c2ecf20Sopenharmony_ci	SAVE_ALL
1838c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
1848c2ecf20Sopenharmony_ci	lda	$26, ret_from_sys_call
1858c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
1868c2ecf20Sopenharmony_ci	mov	$sp, $19
1878c2ecf20Sopenharmony_ci	jsr	$31, do_entInt
1888c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entInt
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ciCFI_START_OSF_FRAME entArith
1918c2ecf20Sopenharmony_ci	SAVE_ALL
1928c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
1938c2ecf20Sopenharmony_ci	lda	$26, ret_from_sys_call
1948c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
1958c2ecf20Sopenharmony_ci	mov	$sp, $18
1968c2ecf20Sopenharmony_ci	jsr	$31, do_entArith
1978c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entArith
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ciCFI_START_OSF_FRAME entMM
2008c2ecf20Sopenharmony_ci	SAVE_ALL
2018c2ecf20Sopenharmony_ci/* save $9 - $15 so the inline exception code can manipulate them.  */
2028c2ecf20Sopenharmony_ci	subq	$sp, 56, $sp
2038c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	56
2048c2ecf20Sopenharmony_ci	stq	$9, 0($sp)
2058c2ecf20Sopenharmony_ci	stq	$10, 8($sp)
2068c2ecf20Sopenharmony_ci	stq	$11, 16($sp)
2078c2ecf20Sopenharmony_ci	stq	$12, 24($sp)
2088c2ecf20Sopenharmony_ci	stq	$13, 32($sp)
2098c2ecf20Sopenharmony_ci	stq	$14, 40($sp)
2108c2ecf20Sopenharmony_ci	stq	$15, 48($sp)
2118c2ecf20Sopenharmony_ci	.cfi_rel_offset	$9, 0
2128c2ecf20Sopenharmony_ci	.cfi_rel_offset	$10, 8
2138c2ecf20Sopenharmony_ci	.cfi_rel_offset	$11, 16
2148c2ecf20Sopenharmony_ci	.cfi_rel_offset	$12, 24
2158c2ecf20Sopenharmony_ci	.cfi_rel_offset	$13, 32
2168c2ecf20Sopenharmony_ci	.cfi_rel_offset	$14, 40
2178c2ecf20Sopenharmony_ci	.cfi_rel_offset	$15, 48
2188c2ecf20Sopenharmony_ci	addq	$sp, 56, $19
2198c2ecf20Sopenharmony_ci/* handle the fault */
2208c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
2218c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
2228c2ecf20Sopenharmony_ci	jsr	$26, do_page_fault
2238c2ecf20Sopenharmony_ci/* reload the registers after the exception code played.  */
2248c2ecf20Sopenharmony_ci	ldq	$9, 0($sp)
2258c2ecf20Sopenharmony_ci	ldq	$10, 8($sp)
2268c2ecf20Sopenharmony_ci	ldq	$11, 16($sp)
2278c2ecf20Sopenharmony_ci	ldq	$12, 24($sp)
2288c2ecf20Sopenharmony_ci	ldq	$13, 32($sp)
2298c2ecf20Sopenharmony_ci	ldq	$14, 40($sp)
2308c2ecf20Sopenharmony_ci	ldq	$15, 48($sp)
2318c2ecf20Sopenharmony_ci	addq	$sp, 56, $sp
2328c2ecf20Sopenharmony_ci	.cfi_restore	$9
2338c2ecf20Sopenharmony_ci	.cfi_restore	$10
2348c2ecf20Sopenharmony_ci	.cfi_restore	$11
2358c2ecf20Sopenharmony_ci	.cfi_restore	$12
2368c2ecf20Sopenharmony_ci	.cfi_restore	$13
2378c2ecf20Sopenharmony_ci	.cfi_restore	$14
2388c2ecf20Sopenharmony_ci	.cfi_restore	$15
2398c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	-56
2408c2ecf20Sopenharmony_ci/* finish up the syscall as normal.  */
2418c2ecf20Sopenharmony_ci	br	ret_from_sys_call
2428c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entMM
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ciCFI_START_OSF_FRAME entIF
2458c2ecf20Sopenharmony_ci	SAVE_ALL
2468c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
2478c2ecf20Sopenharmony_ci	lda	$26, ret_from_sys_call
2488c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
2498c2ecf20Sopenharmony_ci	mov	$sp, $17
2508c2ecf20Sopenharmony_ci	jsr	$31, do_entIF
2518c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entIF
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ciCFI_START_OSF_FRAME entUna
2548c2ecf20Sopenharmony_ci	lda	$sp, -256($sp)
2558c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	256
2568c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
2578c2ecf20Sopenharmony_ci	.cfi_rel_offset	$0, 0
2588c2ecf20Sopenharmony_ci	.cfi_remember_state
2598c2ecf20Sopenharmony_ci	ldq	$0, 256($sp)	/* get PS */
2608c2ecf20Sopenharmony_ci	stq	$1, 8($sp)
2618c2ecf20Sopenharmony_ci	stq	$2, 16($sp)
2628c2ecf20Sopenharmony_ci	stq	$3, 24($sp)
2638c2ecf20Sopenharmony_ci	and	$0, 8, $0		/* user mode? */
2648c2ecf20Sopenharmony_ci	stq	$4, 32($sp)
2658c2ecf20Sopenharmony_ci	bne	$0, entUnaUser	/* yup -> do user-level unaligned fault */
2668c2ecf20Sopenharmony_ci	stq	$5, 40($sp)
2678c2ecf20Sopenharmony_ci	stq	$6, 48($sp)
2688c2ecf20Sopenharmony_ci	stq	$7, 56($sp)
2698c2ecf20Sopenharmony_ci	stq	$8, 64($sp)
2708c2ecf20Sopenharmony_ci	stq	$9, 72($sp)
2718c2ecf20Sopenharmony_ci	stq	$10, 80($sp)
2728c2ecf20Sopenharmony_ci	stq	$11, 88($sp)
2738c2ecf20Sopenharmony_ci	stq	$12, 96($sp)
2748c2ecf20Sopenharmony_ci	stq	$13, 104($sp)
2758c2ecf20Sopenharmony_ci	stq	$14, 112($sp)
2768c2ecf20Sopenharmony_ci	stq	$15, 120($sp)
2778c2ecf20Sopenharmony_ci	/* 16-18 PAL-saved */
2788c2ecf20Sopenharmony_ci	stq	$19, 152($sp)
2798c2ecf20Sopenharmony_ci	stq	$20, 160($sp)
2808c2ecf20Sopenharmony_ci	stq	$21, 168($sp)
2818c2ecf20Sopenharmony_ci	stq	$22, 176($sp)
2828c2ecf20Sopenharmony_ci	stq	$23, 184($sp)
2838c2ecf20Sopenharmony_ci	stq	$24, 192($sp)
2848c2ecf20Sopenharmony_ci	stq	$25, 200($sp)
2858c2ecf20Sopenharmony_ci	stq	$26, 208($sp)
2868c2ecf20Sopenharmony_ci	stq	$27, 216($sp)
2878c2ecf20Sopenharmony_ci	stq	$28, 224($sp)
2888c2ecf20Sopenharmony_ci	mov	$sp, $19
2898c2ecf20Sopenharmony_ci	stq	$gp, 232($sp)
2908c2ecf20Sopenharmony_ci	.cfi_rel_offset	$1, 1*8
2918c2ecf20Sopenharmony_ci	.cfi_rel_offset	$2, 2*8
2928c2ecf20Sopenharmony_ci	.cfi_rel_offset	$3, 3*8
2938c2ecf20Sopenharmony_ci	.cfi_rel_offset	$4, 4*8
2948c2ecf20Sopenharmony_ci	.cfi_rel_offset	$5, 5*8
2958c2ecf20Sopenharmony_ci	.cfi_rel_offset	$6, 6*8
2968c2ecf20Sopenharmony_ci	.cfi_rel_offset	$7, 7*8
2978c2ecf20Sopenharmony_ci	.cfi_rel_offset	$8, 8*8
2988c2ecf20Sopenharmony_ci	.cfi_rel_offset	$9, 9*8
2998c2ecf20Sopenharmony_ci	.cfi_rel_offset	$10, 10*8
3008c2ecf20Sopenharmony_ci	.cfi_rel_offset	$11, 11*8
3018c2ecf20Sopenharmony_ci	.cfi_rel_offset	$12, 12*8
3028c2ecf20Sopenharmony_ci	.cfi_rel_offset	$13, 13*8
3038c2ecf20Sopenharmony_ci	.cfi_rel_offset	$14, 14*8
3048c2ecf20Sopenharmony_ci	.cfi_rel_offset	$15, 15*8
3058c2ecf20Sopenharmony_ci	.cfi_rel_offset	$19, 19*8
3068c2ecf20Sopenharmony_ci	.cfi_rel_offset	$20, 20*8
3078c2ecf20Sopenharmony_ci	.cfi_rel_offset	$21, 21*8
3088c2ecf20Sopenharmony_ci	.cfi_rel_offset	$22, 22*8
3098c2ecf20Sopenharmony_ci	.cfi_rel_offset	$23, 23*8
3108c2ecf20Sopenharmony_ci	.cfi_rel_offset	$24, 24*8
3118c2ecf20Sopenharmony_ci	.cfi_rel_offset	$25, 25*8
3128c2ecf20Sopenharmony_ci	.cfi_rel_offset	$26, 26*8
3138c2ecf20Sopenharmony_ci	.cfi_rel_offset	$27, 27*8
3148c2ecf20Sopenharmony_ci	.cfi_rel_offset	$28, 28*8
3158c2ecf20Sopenharmony_ci	.cfi_rel_offset	$29, 29*8
3168c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
3178c2ecf20Sopenharmony_ci	stq	$31, 248($sp)
3188c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
3198c2ecf20Sopenharmony_ci	jsr	$26, do_entUna
3208c2ecf20Sopenharmony_ci	ldq	$0, 0($sp)
3218c2ecf20Sopenharmony_ci	ldq	$1, 8($sp)
3228c2ecf20Sopenharmony_ci	ldq	$2, 16($sp)
3238c2ecf20Sopenharmony_ci	ldq	$3, 24($sp)
3248c2ecf20Sopenharmony_ci	ldq	$4, 32($sp)
3258c2ecf20Sopenharmony_ci	ldq	$5, 40($sp)
3268c2ecf20Sopenharmony_ci	ldq	$6, 48($sp)
3278c2ecf20Sopenharmony_ci	ldq	$7, 56($sp)
3288c2ecf20Sopenharmony_ci	ldq	$8, 64($sp)
3298c2ecf20Sopenharmony_ci	ldq	$9, 72($sp)
3308c2ecf20Sopenharmony_ci	ldq	$10, 80($sp)
3318c2ecf20Sopenharmony_ci	ldq	$11, 88($sp)
3328c2ecf20Sopenharmony_ci	ldq	$12, 96($sp)
3338c2ecf20Sopenharmony_ci	ldq	$13, 104($sp)
3348c2ecf20Sopenharmony_ci	ldq	$14, 112($sp)
3358c2ecf20Sopenharmony_ci	ldq	$15, 120($sp)
3368c2ecf20Sopenharmony_ci	/* 16-18 PAL-saved */
3378c2ecf20Sopenharmony_ci	ldq	$19, 152($sp)
3388c2ecf20Sopenharmony_ci	ldq	$20, 160($sp)
3398c2ecf20Sopenharmony_ci	ldq	$21, 168($sp)
3408c2ecf20Sopenharmony_ci	ldq	$22, 176($sp)
3418c2ecf20Sopenharmony_ci	ldq	$23, 184($sp)
3428c2ecf20Sopenharmony_ci	ldq	$24, 192($sp)
3438c2ecf20Sopenharmony_ci	ldq	$25, 200($sp)
3448c2ecf20Sopenharmony_ci	ldq	$26, 208($sp)
3458c2ecf20Sopenharmony_ci	ldq	$27, 216($sp)
3468c2ecf20Sopenharmony_ci	ldq	$28, 224($sp)
3478c2ecf20Sopenharmony_ci	ldq	$gp, 232($sp)
3488c2ecf20Sopenharmony_ci	lda	$sp, 256($sp)
3498c2ecf20Sopenharmony_ci	.cfi_restore	$1
3508c2ecf20Sopenharmony_ci	.cfi_restore	$2
3518c2ecf20Sopenharmony_ci	.cfi_restore	$3
3528c2ecf20Sopenharmony_ci	.cfi_restore	$4
3538c2ecf20Sopenharmony_ci	.cfi_restore	$5
3548c2ecf20Sopenharmony_ci	.cfi_restore	$6
3558c2ecf20Sopenharmony_ci	.cfi_restore	$7
3568c2ecf20Sopenharmony_ci	.cfi_restore	$8
3578c2ecf20Sopenharmony_ci	.cfi_restore	$9
3588c2ecf20Sopenharmony_ci	.cfi_restore	$10
3598c2ecf20Sopenharmony_ci	.cfi_restore	$11
3608c2ecf20Sopenharmony_ci	.cfi_restore	$12
3618c2ecf20Sopenharmony_ci	.cfi_restore	$13
3628c2ecf20Sopenharmony_ci	.cfi_restore	$14
3638c2ecf20Sopenharmony_ci	.cfi_restore	$15
3648c2ecf20Sopenharmony_ci	.cfi_restore	$19
3658c2ecf20Sopenharmony_ci	.cfi_restore	$20
3668c2ecf20Sopenharmony_ci	.cfi_restore	$21
3678c2ecf20Sopenharmony_ci	.cfi_restore	$22
3688c2ecf20Sopenharmony_ci	.cfi_restore	$23
3698c2ecf20Sopenharmony_ci	.cfi_restore	$24
3708c2ecf20Sopenharmony_ci	.cfi_restore	$25
3718c2ecf20Sopenharmony_ci	.cfi_restore	$26
3728c2ecf20Sopenharmony_ci	.cfi_restore	$27
3738c2ecf20Sopenharmony_ci	.cfi_restore	$28
3748c2ecf20Sopenharmony_ci	.cfi_restore	$29
3758c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	-256
3768c2ecf20Sopenharmony_ci	call_pal PAL_rti
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ci	.align	4
3798c2ecf20Sopenharmony_cientUnaUser:
3808c2ecf20Sopenharmony_ci	.cfi_restore_state
3818c2ecf20Sopenharmony_ci	ldq	$0, 0($sp)	/* restore original $0 */
3828c2ecf20Sopenharmony_ci	lda	$sp, 256($sp)	/* pop entUna's stack frame */
3838c2ecf20Sopenharmony_ci	.cfi_restore	$0
3848c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	-256
3858c2ecf20Sopenharmony_ci	SAVE_ALL		/* setup normal kernel stack */
3868c2ecf20Sopenharmony_ci	lda	$sp, -56($sp)
3878c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	56
3888c2ecf20Sopenharmony_ci	stq	$9, 0($sp)
3898c2ecf20Sopenharmony_ci	stq	$10, 8($sp)
3908c2ecf20Sopenharmony_ci	stq	$11, 16($sp)
3918c2ecf20Sopenharmony_ci	stq	$12, 24($sp)
3928c2ecf20Sopenharmony_ci	stq	$13, 32($sp)
3938c2ecf20Sopenharmony_ci	stq	$14, 40($sp)
3948c2ecf20Sopenharmony_ci	stq	$15, 48($sp)
3958c2ecf20Sopenharmony_ci	.cfi_rel_offset	$9, 0
3968c2ecf20Sopenharmony_ci	.cfi_rel_offset	$10, 8
3978c2ecf20Sopenharmony_ci	.cfi_rel_offset	$11, 16
3988c2ecf20Sopenharmony_ci	.cfi_rel_offset	$12, 24
3998c2ecf20Sopenharmony_ci	.cfi_rel_offset	$13, 32
4008c2ecf20Sopenharmony_ci	.cfi_rel_offset	$14, 40
4018c2ecf20Sopenharmony_ci	.cfi_rel_offset	$15, 48
4028c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
4038c2ecf20Sopenharmony_ci	addq	$sp, 56, $19
4048c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
4058c2ecf20Sopenharmony_ci	jsr	$26, do_entUnaUser
4068c2ecf20Sopenharmony_ci	ldq	$9, 0($sp)
4078c2ecf20Sopenharmony_ci	ldq	$10, 8($sp)
4088c2ecf20Sopenharmony_ci	ldq	$11, 16($sp)
4098c2ecf20Sopenharmony_ci	ldq	$12, 24($sp)
4108c2ecf20Sopenharmony_ci	ldq	$13, 32($sp)
4118c2ecf20Sopenharmony_ci	ldq	$14, 40($sp)
4128c2ecf20Sopenharmony_ci	ldq	$15, 48($sp)
4138c2ecf20Sopenharmony_ci	lda	$sp, 56($sp)
4148c2ecf20Sopenharmony_ci	.cfi_restore	$9
4158c2ecf20Sopenharmony_ci	.cfi_restore	$10
4168c2ecf20Sopenharmony_ci	.cfi_restore	$11
4178c2ecf20Sopenharmony_ci	.cfi_restore	$12
4188c2ecf20Sopenharmony_ci	.cfi_restore	$13
4198c2ecf20Sopenharmony_ci	.cfi_restore	$14
4208c2ecf20Sopenharmony_ci	.cfi_restore	$15
4218c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	-56
4228c2ecf20Sopenharmony_ci	br	ret_from_sys_call
4238c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entUna
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ciCFI_START_OSF_FRAME entDbg
4268c2ecf20Sopenharmony_ci	SAVE_ALL
4278c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
4288c2ecf20Sopenharmony_ci	lda	$26, ret_from_sys_call
4298c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
4308c2ecf20Sopenharmony_ci	mov	$sp, $16
4318c2ecf20Sopenharmony_ci	jsr	$31, do_entDbg
4328c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entDbg
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci/*
4358c2ecf20Sopenharmony_ci * The system call entry point is special.  Most importantly, it looks
4368c2ecf20Sopenharmony_ci * like a function call to userspace as far as clobbered registers.  We
4378c2ecf20Sopenharmony_ci * do preserve the argument registers (for syscall restarts) and $26
4388c2ecf20Sopenharmony_ci * (for leaf syscall functions).
4398c2ecf20Sopenharmony_ci *
4408c2ecf20Sopenharmony_ci * So much for theory.  We don't take advantage of this yet.
4418c2ecf20Sopenharmony_ci *
4428c2ecf20Sopenharmony_ci * Note that a0-a2 are not saved by PALcode as with the other entry points.
4438c2ecf20Sopenharmony_ci */
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci	.align	4
4468c2ecf20Sopenharmony_ci	.globl	entSys
4478c2ecf20Sopenharmony_ci	.type	entSys, @function
4488c2ecf20Sopenharmony_ci	.cfi_startproc simple
4498c2ecf20Sopenharmony_ci	.cfi_return_column 64
4508c2ecf20Sopenharmony_ci	.cfi_def_cfa	$sp, 48
4518c2ecf20Sopenharmony_ci	.cfi_rel_offset	64, 8
4528c2ecf20Sopenharmony_ci	.cfi_rel_offset	$gp, 16
4538c2ecf20Sopenharmony_cientSys:
4548c2ecf20Sopenharmony_ci	SAVE_ALL
4558c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
4568c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
4578c2ecf20Sopenharmony_ci	lda	$4, NR_SYSCALLS($31)
4588c2ecf20Sopenharmony_ci	stq	$16, SP_OFF+24($sp)
4598c2ecf20Sopenharmony_ci	lda	$5, sys_call_table
4608c2ecf20Sopenharmony_ci	lda	$27, sys_ni_syscall
4618c2ecf20Sopenharmony_ci	cmpult	$0, $4, $4
4628c2ecf20Sopenharmony_ci	ldl	$3, TI_FLAGS($8)
4638c2ecf20Sopenharmony_ci	stq	$17, SP_OFF+32($sp)
4648c2ecf20Sopenharmony_ci	s8addq	$0, $5, $5
4658c2ecf20Sopenharmony_ci	stq	$18, SP_OFF+40($sp)
4668c2ecf20Sopenharmony_ci	.cfi_rel_offset	$16, SP_OFF+24
4678c2ecf20Sopenharmony_ci	.cfi_rel_offset	$17, SP_OFF+32
4688c2ecf20Sopenharmony_ci	.cfi_rel_offset	$18, SP_OFF+40
4698c2ecf20Sopenharmony_ci#ifdef CONFIG_AUDITSYSCALL
4708c2ecf20Sopenharmony_ci	lda     $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
4718c2ecf20Sopenharmony_ci	and     $3, $6, $3
4728c2ecf20Sopenharmony_ci	bne     $3, strace
4738c2ecf20Sopenharmony_ci#else
4748c2ecf20Sopenharmony_ci	blbs    $3, strace		/* check for SYSCALL_TRACE in disguise */
4758c2ecf20Sopenharmony_ci#endif
4768c2ecf20Sopenharmony_ci	beq	$4, 1f
4778c2ecf20Sopenharmony_ci	ldq	$27, 0($5)
4788c2ecf20Sopenharmony_ci1:	jsr	$26, ($27), sys_ni_syscall
4798c2ecf20Sopenharmony_ci	ldgp	$gp, 0($26)
4808c2ecf20Sopenharmony_ci	blt	$0, $syscall_error	/* the call failed */
4818c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
4828c2ecf20Sopenharmony_ci	stq	$31, 72($sp)		/* a3=0 => no error */
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	.align	4
4858c2ecf20Sopenharmony_ci	.globl	ret_from_sys_call
4868c2ecf20Sopenharmony_ciret_from_sys_call:
4878c2ecf20Sopenharmony_ci	cmovne	$26, 0, $18		/* $18 = 0 => non-restartable */
4888c2ecf20Sopenharmony_ci	ldq	$0, SP_OFF($sp)
4898c2ecf20Sopenharmony_ci	and	$0, 8, $0
4908c2ecf20Sopenharmony_ci	beq	$0, ret_to_kernel
4918c2ecf20Sopenharmony_ciret_to_user:
4928c2ecf20Sopenharmony_ci	/* Make sure need_resched and sigpending don't change between
4938c2ecf20Sopenharmony_ci		sampling and the rti.  */
4948c2ecf20Sopenharmony_ci	lda	$16, 7
4958c2ecf20Sopenharmony_ci	call_pal PAL_swpipl
4968c2ecf20Sopenharmony_ci	ldl	$17, TI_FLAGS($8)
4978c2ecf20Sopenharmony_ci	and	$17, _TIF_WORK_MASK, $2
4988c2ecf20Sopenharmony_ci	bne	$2, work_pending
4998c2ecf20Sopenharmony_cirestore_all:
5008c2ecf20Sopenharmony_ci	.cfi_remember_state
5018c2ecf20Sopenharmony_ci	RESTORE_ALL
5028c2ecf20Sopenharmony_ci	call_pal PAL_rti
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ciret_to_kernel:
5058c2ecf20Sopenharmony_ci	.cfi_restore_state
5068c2ecf20Sopenharmony_ci	lda	$16, 7
5078c2ecf20Sopenharmony_ci	call_pal PAL_swpipl
5088c2ecf20Sopenharmony_ci	br restore_all
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci	.align 3
5118c2ecf20Sopenharmony_ci$syscall_error:
5128c2ecf20Sopenharmony_ci	/*
5138c2ecf20Sopenharmony_ci	 * Some system calls (e.g., ptrace) can return arbitrary
5148c2ecf20Sopenharmony_ci	 * values which might normally be mistaken as error numbers.
5158c2ecf20Sopenharmony_ci	 * Those functions must zero $0 (v0) directly in the stack
5168c2ecf20Sopenharmony_ci	 * frame to indicate that a negative return value wasn't an
5178c2ecf20Sopenharmony_ci	 * error number..
5188c2ecf20Sopenharmony_ci	 */
5198c2ecf20Sopenharmony_ci	ldq	$18, 0($sp)	/* old syscall nr (zero if success) */
5208c2ecf20Sopenharmony_ci	beq	$18, $ret_success
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_ci	ldq	$19, 72($sp)	/* .. and this a3 */
5238c2ecf20Sopenharmony_ci	subq	$31, $0, $0	/* with error in v0 */
5248c2ecf20Sopenharmony_ci	addq	$31, 1, $1	/* set a3 for errno return */
5258c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
5268c2ecf20Sopenharmony_ci	mov	$31, $26	/* tell "ret_from_sys_call" we can restart */
5278c2ecf20Sopenharmony_ci	stq	$1, 72($sp)	/* a3 for return */
5288c2ecf20Sopenharmony_ci	br	ret_from_sys_call
5298c2ecf20Sopenharmony_ci
5308c2ecf20Sopenharmony_ci$ret_success:
5318c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
5328c2ecf20Sopenharmony_ci	stq	$31, 72($sp)	/* a3=0 => no error */
5338c2ecf20Sopenharmony_ci	br	ret_from_sys_call
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_ci/*
5368c2ecf20Sopenharmony_ci * Do all cleanup when returning from all interrupts and system calls.
5378c2ecf20Sopenharmony_ci *
5388c2ecf20Sopenharmony_ci * Arguments:
5398c2ecf20Sopenharmony_ci *       $8: current.
5408c2ecf20Sopenharmony_ci *      $17: TI_FLAGS.
5418c2ecf20Sopenharmony_ci *      $18: The old syscall number, or zero if this is not a return
5428c2ecf20Sopenharmony_ci *           from a syscall that errored and is possibly restartable.
5438c2ecf20Sopenharmony_ci *      $19: The old a3 value
5448c2ecf20Sopenharmony_ci */
5458c2ecf20Sopenharmony_ci
5468c2ecf20Sopenharmony_ci	.align	4
5478c2ecf20Sopenharmony_ci	.type	work_pending, @function
5488c2ecf20Sopenharmony_ciwork_pending:
5498c2ecf20Sopenharmony_ci	and	$17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL, $2
5508c2ecf20Sopenharmony_ci	bne	$2, $work_notifysig
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_ci$work_resched:
5538c2ecf20Sopenharmony_ci	/*
5548c2ecf20Sopenharmony_ci	 * We can get here only if we returned from syscall without SIGPENDING
5558c2ecf20Sopenharmony_ci	 * or got through work_notifysig already.  Either case means no syscall
5568c2ecf20Sopenharmony_ci	 * restarts for us, so let $18 and $19 burn.
5578c2ecf20Sopenharmony_ci	 */
5588c2ecf20Sopenharmony_ci	jsr	$26, schedule
5598c2ecf20Sopenharmony_ci	mov	0, $18
5608c2ecf20Sopenharmony_ci	br	ret_to_user
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_ci$work_notifysig:
5638c2ecf20Sopenharmony_ci	mov	$sp, $16
5648c2ecf20Sopenharmony_ci	DO_SWITCH_STACK
5658c2ecf20Sopenharmony_ci	jsr	$26, do_work_pending
5668c2ecf20Sopenharmony_ci	UNDO_SWITCH_STACK
5678c2ecf20Sopenharmony_ci	br	restore_all
5688c2ecf20Sopenharmony_ci
5698c2ecf20Sopenharmony_ci/*
5708c2ecf20Sopenharmony_ci * PTRACE syscall handler
5718c2ecf20Sopenharmony_ci */
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_ci	.align	4
5748c2ecf20Sopenharmony_ci	.type	strace, @function
5758c2ecf20Sopenharmony_cistrace:
5768c2ecf20Sopenharmony_ci	/* set up signal stack, call syscall_trace */
5778c2ecf20Sopenharmony_ci	DO_SWITCH_STACK
5788c2ecf20Sopenharmony_ci	jsr	$26, syscall_trace_enter /* returns the syscall number */
5798c2ecf20Sopenharmony_ci	UNDO_SWITCH_STACK
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ci	/* get the arguments back.. */
5828c2ecf20Sopenharmony_ci	ldq	$16, SP_OFF+24($sp)
5838c2ecf20Sopenharmony_ci	ldq	$17, SP_OFF+32($sp)
5848c2ecf20Sopenharmony_ci	ldq	$18, SP_OFF+40($sp)
5858c2ecf20Sopenharmony_ci	ldq	$19, 72($sp)
5868c2ecf20Sopenharmony_ci	ldq	$20, 80($sp)
5878c2ecf20Sopenharmony_ci	ldq	$21, 88($sp)
5888c2ecf20Sopenharmony_ci
5898c2ecf20Sopenharmony_ci	/* get the system call pointer.. */
5908c2ecf20Sopenharmony_ci	lda	$1, NR_SYSCALLS($31)
5918c2ecf20Sopenharmony_ci	lda	$2, sys_call_table
5928c2ecf20Sopenharmony_ci	lda	$27, sys_ni_syscall
5938c2ecf20Sopenharmony_ci	cmpult	$0, $1, $1
5948c2ecf20Sopenharmony_ci	s8addq	$0, $2, $2
5958c2ecf20Sopenharmony_ci	beq	$1, 1f
5968c2ecf20Sopenharmony_ci	ldq	$27, 0($2)
5978c2ecf20Sopenharmony_ci1:	jsr	$26, ($27), sys_gettimeofday
5988c2ecf20Sopenharmony_ciret_from_straced:
5998c2ecf20Sopenharmony_ci	ldgp	$gp, 0($26)
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	/* check return.. */
6028c2ecf20Sopenharmony_ci	blt	$0, $strace_error	/* the call failed */
6038c2ecf20Sopenharmony_ci	stq	$31, 72($sp)		/* a3=0 => no error */
6048c2ecf20Sopenharmony_ci$strace_success:
6058c2ecf20Sopenharmony_ci	stq	$0, 0($sp)		/* save return value */
6068c2ecf20Sopenharmony_ci
6078c2ecf20Sopenharmony_ci	DO_SWITCH_STACK
6088c2ecf20Sopenharmony_ci	jsr	$26, syscall_trace_leave
6098c2ecf20Sopenharmony_ci	UNDO_SWITCH_STACK
6108c2ecf20Sopenharmony_ci	br	$31, ret_from_sys_call
6118c2ecf20Sopenharmony_ci
6128c2ecf20Sopenharmony_ci	.align	3
6138c2ecf20Sopenharmony_ci$strace_error:
6148c2ecf20Sopenharmony_ci	ldq	$18, 0($sp)	/* old syscall nr (zero if success) */
6158c2ecf20Sopenharmony_ci	beq	$18, $strace_success
6168c2ecf20Sopenharmony_ci	ldq	$19, 72($sp)	/* .. and this a3 */
6178c2ecf20Sopenharmony_ci
6188c2ecf20Sopenharmony_ci	subq	$31, $0, $0	/* with error in v0 */
6198c2ecf20Sopenharmony_ci	addq	$31, 1, $1	/* set a3 for errno return */
6208c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
6218c2ecf20Sopenharmony_ci	stq	$1, 72($sp)	/* a3 for return */
6228c2ecf20Sopenharmony_ci
6238c2ecf20Sopenharmony_ci	DO_SWITCH_STACK
6248c2ecf20Sopenharmony_ci	mov	$18, $9		/* save old syscall number */
6258c2ecf20Sopenharmony_ci	mov	$19, $10	/* save old a3 */
6268c2ecf20Sopenharmony_ci	jsr	$26, syscall_trace_leave
6278c2ecf20Sopenharmony_ci	mov	$9, $18
6288c2ecf20Sopenharmony_ci	mov	$10, $19
6298c2ecf20Sopenharmony_ci	UNDO_SWITCH_STACK
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_ci	mov	$31, $26	/* tell "ret_from_sys_call" we can restart */
6328c2ecf20Sopenharmony_ci	br	ret_from_sys_call
6338c2ecf20Sopenharmony_ciCFI_END_OSF_FRAME entSys
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci/*
6368c2ecf20Sopenharmony_ci * Save and restore the switch stack -- aka the balance of the user context.
6378c2ecf20Sopenharmony_ci */
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	.align	4
6408c2ecf20Sopenharmony_ci	.type	do_switch_stack, @function
6418c2ecf20Sopenharmony_ci	.cfi_startproc simple
6428c2ecf20Sopenharmony_ci	.cfi_return_column 64
6438c2ecf20Sopenharmony_ci	.cfi_def_cfa $sp, 0
6448c2ecf20Sopenharmony_ci	.cfi_register 64, $1
6458c2ecf20Sopenharmony_cido_switch_stack:
6468c2ecf20Sopenharmony_ci	lda	$sp, -SWITCH_STACK_SIZE($sp)
6478c2ecf20Sopenharmony_ci	.cfi_adjust_cfa_offset	SWITCH_STACK_SIZE
6488c2ecf20Sopenharmony_ci	stq	$9, 0($sp)
6498c2ecf20Sopenharmony_ci	stq	$10, 8($sp)
6508c2ecf20Sopenharmony_ci	stq	$11, 16($sp)
6518c2ecf20Sopenharmony_ci	stq	$12, 24($sp)
6528c2ecf20Sopenharmony_ci	stq	$13, 32($sp)
6538c2ecf20Sopenharmony_ci	stq	$14, 40($sp)
6548c2ecf20Sopenharmony_ci	stq	$15, 48($sp)
6558c2ecf20Sopenharmony_ci	stq	$26, 56($sp)
6568c2ecf20Sopenharmony_ci	stt	$f0, 64($sp)
6578c2ecf20Sopenharmony_ci	stt	$f1, 72($sp)
6588c2ecf20Sopenharmony_ci	stt	$f2, 80($sp)
6598c2ecf20Sopenharmony_ci	stt	$f3, 88($sp)
6608c2ecf20Sopenharmony_ci	stt	$f4, 96($sp)
6618c2ecf20Sopenharmony_ci	stt	$f5, 104($sp)
6628c2ecf20Sopenharmony_ci	stt	$f6, 112($sp)
6638c2ecf20Sopenharmony_ci	stt	$f7, 120($sp)
6648c2ecf20Sopenharmony_ci	stt	$f8, 128($sp)
6658c2ecf20Sopenharmony_ci	stt	$f9, 136($sp)
6668c2ecf20Sopenharmony_ci	stt	$f10, 144($sp)
6678c2ecf20Sopenharmony_ci	stt	$f11, 152($sp)
6688c2ecf20Sopenharmony_ci	stt	$f12, 160($sp)
6698c2ecf20Sopenharmony_ci	stt	$f13, 168($sp)
6708c2ecf20Sopenharmony_ci	stt	$f14, 176($sp)
6718c2ecf20Sopenharmony_ci	stt	$f15, 184($sp)
6728c2ecf20Sopenharmony_ci	stt	$f16, 192($sp)
6738c2ecf20Sopenharmony_ci	stt	$f17, 200($sp)
6748c2ecf20Sopenharmony_ci	stt	$f18, 208($sp)
6758c2ecf20Sopenharmony_ci	stt	$f19, 216($sp)
6768c2ecf20Sopenharmony_ci	stt	$f20, 224($sp)
6778c2ecf20Sopenharmony_ci	stt	$f21, 232($sp)
6788c2ecf20Sopenharmony_ci	stt	$f22, 240($sp)
6798c2ecf20Sopenharmony_ci	stt	$f23, 248($sp)
6808c2ecf20Sopenharmony_ci	stt	$f24, 256($sp)
6818c2ecf20Sopenharmony_ci	stt	$f25, 264($sp)
6828c2ecf20Sopenharmony_ci	stt	$f26, 272($sp)
6838c2ecf20Sopenharmony_ci	stt	$f27, 280($sp)
6848c2ecf20Sopenharmony_ci	mf_fpcr	$f0		# get fpcr
6858c2ecf20Sopenharmony_ci	stt	$f28, 288($sp)
6868c2ecf20Sopenharmony_ci	stt	$f29, 296($sp)
6878c2ecf20Sopenharmony_ci	stt	$f30, 304($sp)
6888c2ecf20Sopenharmony_ci	stt	$f0, 312($sp)	# save fpcr in slot of $f31
6898c2ecf20Sopenharmony_ci	ldt	$f0, 64($sp)	# dont let "do_switch_stack" change fp state.
6908c2ecf20Sopenharmony_ci	ret	$31, ($1), 1
6918c2ecf20Sopenharmony_ci	.cfi_endproc
6928c2ecf20Sopenharmony_ci	.size	do_switch_stack, .-do_switch_stack
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci	.align	4
6958c2ecf20Sopenharmony_ci	.type	undo_switch_stack, @function
6968c2ecf20Sopenharmony_ci	.cfi_startproc simple
6978c2ecf20Sopenharmony_ci	.cfi_def_cfa $sp, 0
6988c2ecf20Sopenharmony_ci	.cfi_register 64, $1
6998c2ecf20Sopenharmony_ciundo_switch_stack:
7008c2ecf20Sopenharmony_ci	ldq	$9, 0($sp)
7018c2ecf20Sopenharmony_ci	ldq	$10, 8($sp)
7028c2ecf20Sopenharmony_ci	ldq	$11, 16($sp)
7038c2ecf20Sopenharmony_ci	ldq	$12, 24($sp)
7048c2ecf20Sopenharmony_ci	ldq	$13, 32($sp)
7058c2ecf20Sopenharmony_ci	ldq	$14, 40($sp)
7068c2ecf20Sopenharmony_ci	ldq	$15, 48($sp)
7078c2ecf20Sopenharmony_ci	ldq	$26, 56($sp)
7088c2ecf20Sopenharmony_ci	ldt	$f30, 312($sp)	# get saved fpcr
7098c2ecf20Sopenharmony_ci	ldt	$f0, 64($sp)
7108c2ecf20Sopenharmony_ci	ldt	$f1, 72($sp)
7118c2ecf20Sopenharmony_ci	ldt	$f2, 80($sp)
7128c2ecf20Sopenharmony_ci	ldt	$f3, 88($sp)
7138c2ecf20Sopenharmony_ci	mt_fpcr	$f30		# install saved fpcr
7148c2ecf20Sopenharmony_ci	ldt	$f4, 96($sp)
7158c2ecf20Sopenharmony_ci	ldt	$f5, 104($sp)
7168c2ecf20Sopenharmony_ci	ldt	$f6, 112($sp)
7178c2ecf20Sopenharmony_ci	ldt	$f7, 120($sp)
7188c2ecf20Sopenharmony_ci	ldt	$f8, 128($sp)
7198c2ecf20Sopenharmony_ci	ldt	$f9, 136($sp)
7208c2ecf20Sopenharmony_ci	ldt	$f10, 144($sp)
7218c2ecf20Sopenharmony_ci	ldt	$f11, 152($sp)
7228c2ecf20Sopenharmony_ci	ldt	$f12, 160($sp)
7238c2ecf20Sopenharmony_ci	ldt	$f13, 168($sp)
7248c2ecf20Sopenharmony_ci	ldt	$f14, 176($sp)
7258c2ecf20Sopenharmony_ci	ldt	$f15, 184($sp)
7268c2ecf20Sopenharmony_ci	ldt	$f16, 192($sp)
7278c2ecf20Sopenharmony_ci	ldt	$f17, 200($sp)
7288c2ecf20Sopenharmony_ci	ldt	$f18, 208($sp)
7298c2ecf20Sopenharmony_ci	ldt	$f19, 216($sp)
7308c2ecf20Sopenharmony_ci	ldt	$f20, 224($sp)
7318c2ecf20Sopenharmony_ci	ldt	$f21, 232($sp)
7328c2ecf20Sopenharmony_ci	ldt	$f22, 240($sp)
7338c2ecf20Sopenharmony_ci	ldt	$f23, 248($sp)
7348c2ecf20Sopenharmony_ci	ldt	$f24, 256($sp)
7358c2ecf20Sopenharmony_ci	ldt	$f25, 264($sp)
7368c2ecf20Sopenharmony_ci	ldt	$f26, 272($sp)
7378c2ecf20Sopenharmony_ci	ldt	$f27, 280($sp)
7388c2ecf20Sopenharmony_ci	ldt	$f28, 288($sp)
7398c2ecf20Sopenharmony_ci	ldt	$f29, 296($sp)
7408c2ecf20Sopenharmony_ci	ldt	$f30, 304($sp)
7418c2ecf20Sopenharmony_ci	lda	$sp, SWITCH_STACK_SIZE($sp)
7428c2ecf20Sopenharmony_ci	ret	$31, ($1), 1
7438c2ecf20Sopenharmony_ci	.cfi_endproc
7448c2ecf20Sopenharmony_ci	.size	undo_switch_stack, .-undo_switch_stack
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_ci/*
7478c2ecf20Sopenharmony_ci * The meat of the context switch code.
7488c2ecf20Sopenharmony_ci */
7498c2ecf20Sopenharmony_ci
7508c2ecf20Sopenharmony_ci	.align	4
7518c2ecf20Sopenharmony_ci	.globl	alpha_switch_to
7528c2ecf20Sopenharmony_ci	.type	alpha_switch_to, @function
7538c2ecf20Sopenharmony_ci	.cfi_startproc
7548c2ecf20Sopenharmony_cialpha_switch_to:
7558c2ecf20Sopenharmony_ci	DO_SWITCH_STACK
7568c2ecf20Sopenharmony_ci	call_pal PAL_swpctx
7578c2ecf20Sopenharmony_ci	lda	$8, 0x3fff
7588c2ecf20Sopenharmony_ci	UNDO_SWITCH_STACK
7598c2ecf20Sopenharmony_ci	bic	$sp, $8, $8
7608c2ecf20Sopenharmony_ci	mov	$17, $0
7618c2ecf20Sopenharmony_ci	ret
7628c2ecf20Sopenharmony_ci	.cfi_endproc
7638c2ecf20Sopenharmony_ci	.size	alpha_switch_to, .-alpha_switch_to
7648c2ecf20Sopenharmony_ci
7658c2ecf20Sopenharmony_ci/*
7668c2ecf20Sopenharmony_ci * New processes begin life here.
7678c2ecf20Sopenharmony_ci */
7688c2ecf20Sopenharmony_ci
7698c2ecf20Sopenharmony_ci	.globl	ret_from_fork
7708c2ecf20Sopenharmony_ci	.align	4
7718c2ecf20Sopenharmony_ci	.ent	ret_from_fork
7728c2ecf20Sopenharmony_ciret_from_fork:
7738c2ecf20Sopenharmony_ci	lda	$26, ret_from_sys_call
7748c2ecf20Sopenharmony_ci	mov	$17, $16
7758c2ecf20Sopenharmony_ci	jmp	$31, schedule_tail
7768c2ecf20Sopenharmony_ci.end ret_from_fork
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_ci/*
7798c2ecf20Sopenharmony_ci * ... and new kernel threads - here
7808c2ecf20Sopenharmony_ci */
7818c2ecf20Sopenharmony_ci	.align 4
7828c2ecf20Sopenharmony_ci	.globl	ret_from_kernel_thread
7838c2ecf20Sopenharmony_ci	.ent	ret_from_kernel_thread
7848c2ecf20Sopenharmony_ciret_from_kernel_thread:
7858c2ecf20Sopenharmony_ci	mov	$17, $16
7868c2ecf20Sopenharmony_ci	jsr	$26, schedule_tail
7878c2ecf20Sopenharmony_ci	mov	$9, $27
7888c2ecf20Sopenharmony_ci	mov	$10, $16
7898c2ecf20Sopenharmony_ci	jsr	$26, ($9)
7908c2ecf20Sopenharmony_ci	br	$31, ret_to_user
7918c2ecf20Sopenharmony_ci.end ret_from_kernel_thread
7928c2ecf20Sopenharmony_ci
7938c2ecf20Sopenharmony_ci
7948c2ecf20Sopenharmony_ci/*
7958c2ecf20Sopenharmony_ci * Special system calls.  Most of these are special in that they either
7968c2ecf20Sopenharmony_ci * have to play switch_stack games.
7978c2ecf20Sopenharmony_ci */
7988c2ecf20Sopenharmony_ci
7998c2ecf20Sopenharmony_ci.macro	fork_like name
8008c2ecf20Sopenharmony_ci	.align	4
8018c2ecf20Sopenharmony_ci	.globl	alpha_\name
8028c2ecf20Sopenharmony_ci	.ent	alpha_\name
8038c2ecf20Sopenharmony_cialpha_\name:
8048c2ecf20Sopenharmony_ci	.prologue 0
8058c2ecf20Sopenharmony_ci	bsr	$1, do_switch_stack
8068c2ecf20Sopenharmony_ci	jsr	$26, sys_\name
8078c2ecf20Sopenharmony_ci	ldq	$26, 56($sp)
8088c2ecf20Sopenharmony_ci	lda	$sp, SWITCH_STACK_SIZE($sp)
8098c2ecf20Sopenharmony_ci	ret
8108c2ecf20Sopenharmony_ci.end	alpha_\name
8118c2ecf20Sopenharmony_ci.endm
8128c2ecf20Sopenharmony_ci
8138c2ecf20Sopenharmony_cifork_like fork
8148c2ecf20Sopenharmony_cifork_like vfork
8158c2ecf20Sopenharmony_cifork_like clone
8168c2ecf20Sopenharmony_ci
8178c2ecf20Sopenharmony_ci.macro	sigreturn_like name
8188c2ecf20Sopenharmony_ci	.align	4
8198c2ecf20Sopenharmony_ci	.globl	sys_\name
8208c2ecf20Sopenharmony_ci	.ent	sys_\name
8218c2ecf20Sopenharmony_cisys_\name:
8228c2ecf20Sopenharmony_ci	.prologue 0
8238c2ecf20Sopenharmony_ci	lda	$9, ret_from_straced
8248c2ecf20Sopenharmony_ci	cmpult	$26, $9, $9
8258c2ecf20Sopenharmony_ci	lda	$sp, -SWITCH_STACK_SIZE($sp)
8268c2ecf20Sopenharmony_ci	jsr	$26, do_\name
8278c2ecf20Sopenharmony_ci	bne	$9, 1f
8288c2ecf20Sopenharmony_ci	jsr	$26, syscall_trace_leave
8298c2ecf20Sopenharmony_ci1:	br	$1, undo_switch_stack
8308c2ecf20Sopenharmony_ci	br	ret_from_sys_call
8318c2ecf20Sopenharmony_ci.end sys_\name
8328c2ecf20Sopenharmony_ci.endm
8338c2ecf20Sopenharmony_ci
8348c2ecf20Sopenharmony_cisigreturn_like sigreturn
8358c2ecf20Sopenharmony_cisigreturn_like rt_sigreturn
8368c2ecf20Sopenharmony_ci
8378c2ecf20Sopenharmony_ci	.align	4
8388c2ecf20Sopenharmony_ci	.globl	alpha_syscall_zero
8398c2ecf20Sopenharmony_ci	.ent	alpha_syscall_zero
8408c2ecf20Sopenharmony_cialpha_syscall_zero:
8418c2ecf20Sopenharmony_ci	.prologue 0
8428c2ecf20Sopenharmony_ci	/* Special because it needs to do something opposite to
8438c2ecf20Sopenharmony_ci	   force_successful_syscall_return().  We use the saved
8448c2ecf20Sopenharmony_ci	   syscall number for that, zero meaning "not an error".
8458c2ecf20Sopenharmony_ci	   That works nicely, but for real syscall 0 we need to
8468c2ecf20Sopenharmony_ci	   make sure that this logics doesn't get confused.
8478c2ecf20Sopenharmony_ci	   Store a non-zero there - -ENOSYS we need in register
8488c2ecf20Sopenharmony_ci	   for our return value will do just fine.
8498c2ecf20Sopenharmony_ci	  */
8508c2ecf20Sopenharmony_ci	lda	$0, -ENOSYS
8518c2ecf20Sopenharmony_ci	unop
8528c2ecf20Sopenharmony_ci	stq	$0, 0($sp)
8538c2ecf20Sopenharmony_ci	ret
8548c2ecf20Sopenharmony_ci.end alpha_syscall_zero
855