| 1 | /* SPDX-License-Identifier: GPL-2.0 */
|
| 2 | /*
|
| 3 | * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
| 4 | *
|
| 5 | * Derived from MIPS:
|
| 6 | * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle
|
| 7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
|
| 8 | * Copyright (C) 2001 MIPS Technologies, Inc.
|
| 9 | */
|
| 10 |
|
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 |
|
| 19 | .text
|
| 20 | .cfi_sections .debug_frame
|
| 21 | .align 5
|
| 22 | SYM_CODE_START(handle_syscall)
|
| 23 | UNWIND_HINT_UNDEFINED
|
| 24 | csrrd t0, PERCPU_BASE_KS
|
| 25 | la.pcrel t1, kernelsp
|
| 26 | PTR_ADD t1, t1, t0
|
| 27 | move t2, sp
|
| 28 | PTR_L sp, t1, 0
|
| 29 |
|
| 30 | PTR_ADDI sp, sp, -PT_SIZE
|
| 31 | cfi_st t2, PT_R3
|
| 32 | cfi_rel_offset sp, PT_R3
|
| 33 | LONG_S zero, sp, PT_R0
|
| 34 | csrrd t2, LOONGARCH_CSR_PRMD
|
| 35 | LONG_S t2, sp, PT_PRMD
|
| 36 | csrrd t2, LOONGARCH_CSR_CRMD
|
| 37 | LONG_S t2, sp, PT_CRMD
|
| 38 | csrrd t2, LOONGARCH_CSR_EUEN
|
| 39 | LONG_S t2, sp, PT_EUEN
|
| 40 | csrrd t2, LOONGARCH_CSR_ECFG
|
| 41 | LONG_S t2, sp, PT_ECFG
|
| 42 | csrrd t2, LOONGARCH_CSR_ESTAT
|
| 43 | LONG_S t2, sp, PT_ESTAT
|
| 44 | cfi_st ra, PT_R1
|
| 45 | cfi_st a0, PT_R4
|
| 46 | cfi_st a1, PT_R5
|
| 47 | cfi_st a2, PT_R6
|
| 48 | cfi_st a3, PT_R7
|
| 49 | cfi_st a4, PT_R8
|
| 50 | cfi_st a5, PT_R9
|
| 51 | cfi_st a6, PT_R10
|
| 52 | cfi_st a7, PT_R11
|
| 53 | csrrd ra, LOONGARCH_CSR_ERA
|
| 54 | LONG_S ra, sp, PT_ERA
|
| 55 | cfi_rel_offset ra, PT_ERA
|
| 56 |
|
| 57 | cfi_st tp, PT_R2
|
| 58 | cfi_st u0, PT_R21
|
| 59 | cfi_st fp, PT_R22
|
| 60 |
|
| 61 | SAVE_STATIC
|
| 62 | UNWIND_HINT_REGS
|
| 63 |
|
| 64 | |
| 65 | li.w t1, CSR_CRMD_WE
|
| 66 | csrxchg t1, t1, LOONGARCH_CSR_CRMD
|
| 67 | |
| 68 |
|
| 69 | move u0, t0
|
| 70 | la_abs t1, cpu_tasks
|
| 71 | |
| 72 | LONG_ADD t1, t1, u0
|
| 73 | |
| 74 | LONG_L tp, t1, 0
|
| 75 |
|
| 76 | move a0, sp
|
| 77 | bl do_syscall
|
| 78 |
|
| 79 | STACKLEAK_ERASE
|
| 80 | RESTORE_ALL_AND_RET
|
| 81 | SYM_CODE_END(handle_syscall)
|
| 82 | _ASM_NOKPROBE(handle_syscall)
|
| 83 |
|
| 84 | SYM_CODE_START(ret_from_fork_asm)
|
| 85 | UNWIND_HINT_REGS
|
| 86 | move a1, sp
|
| 87 | bl ret_from_fork
|
| 88 | STACKLEAK_ERASE
|
| 89 | RESTORE_STATIC
|
| 90 | RESTORE_SOME
|
| 91 | RESTORE_SP_AND_RET
|
| 92 | SYM_CODE_END(ret_from_fork_asm)
|
| 93 |
|
| 94 | SYM_CODE_START(ret_from_kernel_thread_asm)
|
| 95 | UNWIND_HINT_REGS
|
| 96 | move a1, sp
|
| 97 | move a2, s0
|
| 98 | move a3, s1
|
| 99 | bl ret_from_kernel_thread
|
| 100 | STACKLEAK_ERASE
|
| 101 | RESTORE_STATIC
|
| 102 | RESTORE_SOME
|
| 103 | RESTORE_SP_AND_RET
|
| 104 | SYM_CODE_END(ret_from_kernel_thread_asm)
|