root/arch/loongarch/kernel/entry.S
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
 *
 * Derived from MIPS:
 * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle
 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
 * Copyright (C) 2001 MIPS Technologies, Inc.
 */

#include <asm/asm.h>
#include <asm/asmmacro.h>
#include <asm/loongarch.h>
#include <asm/regdef.h>
#include <asm/stackframe.h>
#include <asm/thread_info.h>
#include <asm/unwind_hints.h>

        .text
        .cfi_sections   .debug_frame
        .align  5
SYM_CODE_START(handle_syscall)
        UNWIND_HINT_UNDEFINED
        csrrd           t0, PERCPU_BASE_KS
        la.pcrel        t1, kernelsp
        PTR_ADD         t1, t1, t0
        move            t2, sp
        PTR_L           sp, t1, 0

        PTR_ADDI        sp, sp, -PT_SIZE
        cfi_st          t2, PT_R3
        cfi_rel_offset  sp, PT_R3
        LONG_S          zero, sp, PT_R0
        csrrd           t2, LOONGARCH_CSR_PRMD
        LONG_S          t2, sp, PT_PRMD
        csrrd           t2, LOONGARCH_CSR_CRMD
        LONG_S          t2, sp, PT_CRMD
        csrrd           t2, LOONGARCH_CSR_EUEN
        LONG_S          t2, sp, PT_EUEN
        csrrd           t2, LOONGARCH_CSR_ECFG
        LONG_S          t2, sp, PT_ECFG
        csrrd           t2, LOONGARCH_CSR_ESTAT
        LONG_S          t2, sp, PT_ESTAT
        cfi_st          ra, PT_R1
        cfi_st          a0, PT_R4
        cfi_st          a1, PT_R5
        cfi_st          a2, PT_R6
        cfi_st          a3, PT_R7
        cfi_st          a4, PT_R8
        cfi_st          a5, PT_R9
        cfi_st          a6, PT_R10
        cfi_st          a7, PT_R11
        csrrd           ra, LOONGARCH_CSR_ERA
        LONG_S          ra, sp, PT_ERA
        cfi_rel_offset  ra, PT_ERA

        cfi_st          tp, PT_R2
        cfi_st          u0, PT_R21
        cfi_st          fp, PT_R22

        SAVE_STATIC
        UNWIND_HINT_REGS

#ifdef CONFIG_KGDB
        li.w            t1, CSR_CRMD_WE
        csrxchg         t1, t1, LOONGARCH_CSR_CRMD
#endif

        move            u0, t0
        LONG_LI         tp, ~_THREAD_MASK
        and             tp, tp, sp

        move            a0, sp
        bl              do_syscall

        STACKLEAK_ERASE
        RESTORE_ALL_AND_RET
SYM_CODE_END(handle_syscall)
_ASM_NOKPROBE(handle_syscall)

SYM_CODE_START(ret_from_fork_asm)
        UNWIND_HINT_REGS
        move            a1, sp
        bl              ret_from_fork
        STACKLEAK_ERASE
        RESTORE_STATIC
        RESTORE_SOME
        RESTORE_SP_AND_RET
SYM_CODE_END(ret_from_fork_asm)

SYM_CODE_START(ret_from_kernel_thread_asm)
        UNWIND_HINT_REGS
        move            a1, sp
        move            a2, s0
        move            a3, s1
        bl              ret_from_kernel_thread
        STACKLEAK_ERASE
        RESTORE_STATIC
        RESTORE_SOME
        RESTORE_SP_AND_RET
SYM_CODE_END(ret_from_kernel_thread_asm)