1 /* SPDX-License-Identifier: GPL-2.0 */
2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
4 #include <linux/linkage.h>
6 #include <abi/pgtable-bits.h>
9 #include <asm/unistd.h>
10 #include <asm/asm-offsets.h>
11 #include <linux/threads.h>
12 #include <asm/setup.h>
14 #include <asm/thread_info.h>
17 #ifdef CONFIG_STACKTRACE
22 .macro context_tracking
23 #ifdef CONFIG_CONTEXT_TRACKING
27 jbsr context_tracking_user_exit
28 ldw a0, (sp, LSAVE_A0)
29 ldw a1, (sp, LSAVE_A1)
30 ldw a2, (sp, LSAVE_A2)
31 ldw a3, (sp, LSAVE_A3)
32 #if defined(__CSKYABIV1__)
33 ldw r6, (sp, LSAVE_A4)
34 ldw r7, (sp, LSAVE_A5)
48 jmpi ret_from_exception
50 ENTRY(csky_systemcall)
57 cmphs syscallid, r9 /* Check nr of syscall */
60 lrw r9, sys_call_table
67 bmaski r10, THREAD_SHIFT
69 ldw r10, (r9, TINFO_FLAGS)
70 lrw r9, _TIF_SYSCALL_WORK
74 #if defined(__CSKYABIV2__)
78 jsr syscallid /* Do system call */
83 stw a0, (sp, LSAVE_A0) /* Save return value */
85 #ifdef CONFIG_DEBUG_RSEQ
89 jmpi ret_from_exception
92 mov a0, sp /* sp = pt_regs pointer */
93 jbsr syscall_trace_enter
96 /* Prepare args before do system call */
97 ldw a0, (sp, LSAVE_A0)
98 ldw a1, (sp, LSAVE_A1)
99 ldw a2, (sp, LSAVE_A2)
100 ldw a3, (sp, LSAVE_A3)
101 #if defined(__CSKYABIV2__)
103 ldw r9, (sp, LSAVE_A4)
105 ldw r9, (sp, LSAVE_A5)
107 jsr syscallid /* Do system call */
110 ldw r6, (sp, LSAVE_A4)
111 ldw r7, (sp, LSAVE_A5)
112 jsr syscallid /* Do system call */
114 stw a0, (sp, LSAVE_A0) /* Save return value */
117 #ifdef CONFIG_DEBUG_RSEQ
121 mov a0, sp /* right now, sp --> pt_regs */
122 jbsr syscall_trace_exit
123 br ret_from_exception
125 ENTRY(ret_from_kernel_thread)
129 jbsr ret_from_exception
134 bmaski r10, THREAD_SHIFT
136 ldw r10, (r9, TINFO_FLAGS)
137 lrw r9, _TIF_SYSCALL_WORK
140 bf ret_from_exception
141 mov a0, sp /* sp = pt_regs pointer */
142 jbsr syscall_trace_exit
146 ld r9, (sp, LSAVE_PSR)
151 * Load address of current->thread_info, Then get address of task_struct
152 * Get task_needreshed in task_struct
155 bmaski r10, THREAD_SHIFT
158 ldw r10, (r9, TINFO_FLAGS)
159 lrw r9, _TIF_WORK_MASK
163 #ifdef CONFIG_CONTEXT_TRACKING
164 jbsr context_tracking_user_enter
167 #ifdef CONFIG_PREEMPTION
169 bmaski r10, THREAD_SHIFT
172 ldw r10, (r9, TINFO_PREEMPT)
175 jbsr preempt_schedule_irq /* irq en/disable is done inside */
179 #ifdef CONFIG_TRACE_IRQFLAGS
180 ld r10, (sp, LSAVE_PSR)
183 jbsr trace_hardirqs_on
189 lrw r9, ret_from_exception
192 btsti r10, TIF_NEED_RESCHED
198 jmpi do_notify_resume
208 mov a0, sp /* Push Stack pointer arg */
209 jbsr trap_c /* Call C-level trap handler */
210 jmpi ret_from_exception
213 * Prototype from libc for abiv1:
214 * register unsigned int __result asm("a0");
215 * asm( "trap 3" :"=r"(__result)::);
223 /* increase epc for continue */
228 /* get current task thread_info with kernel 8K stack */
229 bmaski a0, THREAD_SHIFT
236 ldw a0, (a0, TINFO_TP_VALUE)
247 #ifdef CONFIG_TRACE_IRQFLAGS
248 jbsr trace_hardirqs_off
255 jmpi ret_from_exception
258 * a0 = prev task_struct *
259 * a1 = next task_struct *
268 stw sp, (a3, THREAD_KSP)
270 /* Set up next process to run */
274 ldw sp, (a3, THREAD_KSP) /* Set next kernel sp */
276 #if defined(__CSKYABIV2__)
277 addi a3, a1, TASK_THREAD_INFO
278 ldw tls, (a3, TINFO_TP_VALUE)