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