xref: /openbmc/linux/arch/loongarch/kernel/switch.S (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1803b0fc5SHuacai Chen/* SPDX-License-Identifier: GPL-2.0 */
2803b0fc5SHuacai Chen/*
3803b0fc5SHuacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4803b0fc5SHuacai Chen */
5803b0fc5SHuacai Chen#include <asm/asm.h>
6803b0fc5SHuacai Chen#include <asm/asmmacro.h>
7803b0fc5SHuacai Chen#include <asm/asm-offsets.h>
8803b0fc5SHuacai Chen#include <asm/loongarch.h>
9803b0fc5SHuacai Chen#include <asm/regdef.h>
10803b0fc5SHuacai Chen#include <asm/stackframe.h>
11803b0fc5SHuacai Chen#include <asm/thread_info.h>
12803b0fc5SHuacai Chen
13803b0fc5SHuacai Chen/*
14803b0fc5SHuacai Chen * task_struct *__switch_to(task_struct *prev, task_struct *next,
15803b0fc5SHuacai Chen *			    struct thread_info *next_ti)
16803b0fc5SHuacai Chen */
17803b0fc5SHuacai Chen	.align	5
18803b0fc5SHuacai ChenSYM_FUNC_START(__switch_to)
19803b0fc5SHuacai Chen	csrrd	t1, LOONGARCH_CSR_PRMD
20803b0fc5SHuacai Chen	stptr.d	t1, a0, THREAD_CSRPRMD
21803b0fc5SHuacai Chen
22803b0fc5SHuacai Chen	cpu_save_nonscratch a0
23803b0fc5SHuacai Chen	stptr.d	ra, a0, THREAD_REG01
2493a4fa62SQing Zhang	stptr.d a3, a0, THREAD_SCHED_RA
2593a4fa62SQing Zhang	stptr.d a4, a0, THREAD_SCHED_CFA
26*09f33601SHuacai Chen#if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_SMP)
27*09f33601SHuacai Chen	la	t7, __stack_chk_guard
28*09f33601SHuacai Chen	LONG_L	t8, a1, TASK_STACK_CANARY
29*09f33601SHuacai Chen	LONG_S	t8, t7, 0
30*09f33601SHuacai Chen#endif
31803b0fc5SHuacai Chen	move	tp, a2
32803b0fc5SHuacai Chen	cpu_restore_nonscratch a1
33803b0fc5SHuacai Chen
34b40fa75eSJinyang He	li.w		t0, _THREAD_SIZE
35803b0fc5SHuacai Chen	PTR_ADD		t0, t0, tp
36803b0fc5SHuacai Chen	set_saved_sp	t0, t1, t2
37803b0fc5SHuacai Chen
38803b0fc5SHuacai Chen	ldptr.d	t1, a1, THREAD_CSRPRMD
39803b0fc5SHuacai Chen	csrwr	t1, LOONGARCH_CSR_PRMD
40803b0fc5SHuacai Chen
41803b0fc5SHuacai Chen	jr	ra
42803b0fc5SHuacai ChenSYM_FUNC_END(__switch_to)
43