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>
13 #include <asm/thread_info.h>
16 #ifdef CONFIG_STACKTRACE
21 .macro context_tracking
22 #ifdef CONFIG_CONTEXT_TRACKING
26 jbsr context_tracking_user_exit
27 ldw a0, (sp, LSAVE_A0)
28 ldw a1, (sp, LSAVE_A1)
29 ldw a2, (sp, LSAVE_A2)
30 ldw a3, (sp, LSAVE_A3)
31 #if defined(__CSKYABIV1__)
32 ldw r6, (sp, LSAVE_A4)
33 ldw r7, (sp, LSAVE_A5)
47 jmpi ret_from_exception
49 ENTRY(csky_systemcall)
56 cmphs syscallid, r9 /* Check nr of syscall */
59 lrw r9, sys_call_table
66 bmaski r10, THREAD_SHIFT
68 ldw r10, (r9, TINFO_FLAGS)
69 lrw r9, _TIF_SYSCALL_WORK
73 #if defined(__CSKYABIV2__)
77 jsr syscallid /* Do system call */
82 stw a0, (sp, LSAVE_A0) /* Save return value */
84 #ifdef CONFIG_DEBUG_RSEQ
88 jmpi ret_from_exception
91 mov a0, sp /* sp = pt_regs pointer */
92 jbsr syscall_trace_enter
95 /* Prepare args before do system call */
96 ldw a0, (sp, LSAVE_A0)
97 ldw a1, (sp, LSAVE_A1)
98 ldw a2, (sp, LSAVE_A2)
99 ldw a3, (sp, LSAVE_A3)
100 #if defined(__CSKYABIV2__)
102 ldw r9, (sp, LSAVE_A4)
104 ldw r9, (sp, LSAVE_A5)
106 jsr syscallid /* Do system call */
109 ldw r6, (sp, LSAVE_A4)
110 ldw r7, (sp, LSAVE_A5)
111 jsr syscallid /* Do system call */
113 stw a0, (sp, LSAVE_A0) /* Save return value */
116 #ifdef CONFIG_DEBUG_RSEQ
120 mov a0, sp /* right now, sp --> pt_regs */
121 jbsr syscall_trace_exit
122 br ret_from_exception
124 ENTRY(ret_from_kernel_thread)
128 jbsr ret_from_exception
133 bmaski r10, THREAD_SHIFT
135 ldw r10, (r9, TINFO_FLAGS)
136 lrw r9, _TIF_SYSCALL_WORK
139 bf ret_from_exception
140 mov a0, sp /* sp = pt_regs pointer */
141 jbsr syscall_trace_exit
145 ld r9, (sp, LSAVE_PSR)
150 * Load address of current->thread_info, Then get address of task_struct
151 * Get task_needreshed in task_struct
154 bmaski r10, THREAD_SHIFT
157 ldw r10, (r9, TINFO_FLAGS)
158 lrw r9, _TIF_WORK_MASK
162 #ifdef CONFIG_CONTEXT_TRACKING
163 jbsr context_tracking_user_enter
166 #ifdef CONFIG_PREEMPTION
168 bmaski r10, THREAD_SHIFT
171 ldw r10, (r9, TINFO_PREEMPT)
174 jbsr preempt_schedule_irq /* irq en/disable is done inside */
178 #ifdef CONFIG_TRACE_IRQFLAGS
179 ld r10, (sp, LSAVE_PSR)
182 jbsr trace_hardirqs_on
188 lrw r9, ret_from_exception
191 btsti r10, TIF_NEED_RESCHED
197 jmpi do_notify_resume
207 mov a0, sp /* Push Stack pointer arg */
208 jbsr trap_c /* Call C-level trap handler */
209 jmpi ret_from_exception
212 * Prototype from libc for abiv1:
213 * register unsigned int __result asm("a0");
214 * asm( "trap 3" :"=r"(__result)::);
222 /* increase epc for continue */
227 /* get current task thread_info with kernel 8K stack */
228 bmaski a0, THREAD_SHIFT
235 ldw a0, (a0, TINFO_TP_VALUE)
246 #ifdef CONFIG_TRACE_IRQFLAGS
247 jbsr trace_hardirqs_off
252 jbsr generic_handle_arch_irq
254 jmpi ret_from_exception
257 * a0 = prev task_struct *
258 * a1 = next task_struct *
267 stw sp, (a3, THREAD_KSP)
269 /* Set up next process to run */
273 ldw sp, (a3, THREAD_KSP) /* Set next kernel sp */
275 #if defined(__CSKYABIV2__)
276 addi a3, a1, TASK_THREAD_INFO
277 ldw tls, (a3, TINFO_TP_VALUE)