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>
16 #define PTE_INDX_MSK 0xffc
17 #define PTE_INDX_SHIFT 10
18 #define _PGDIR_SHIFT 22
21 #ifdef CONFIG_STACKTRACE
26 .macro tlbop_begin name, val0, val1, val2
34 #ifdef CONFIG_CPU_HAS_TLBI
65 lsri a3, PTE_INDX_SHIFT
71 movi a2, (_PAGE_PRESENT | \val0)
76 /* First read/write the page, just update the flags */
78 bgeni a2, PAGE_VALID_BIT
79 bseti a2, PAGE_ACCESSED_BIT
85 /* Some cpu tlb-hardrefill bypass the cache */
86 #ifdef CONFIG_CPU_NEED_TLBSYNC
104 .macro tlbop_end is_write
111 jmpi ret_from_exception
116 tlbop_begin tlbinvalidl, _PAGE_READ, PAGE_VALID_BIT, PAGE_ACCESSED_BIT
119 tlbop_begin tlbinvalids, _PAGE_WRITE, PAGE_DIRTY_BIT, PAGE_MODIFIED_BIT
122 tlbop_begin tlbmodified, _PAGE_WRITE, PAGE_DIRTY_BIT, PAGE_MODIFIED_BIT
123 #ifndef CONFIG_CPU_HAS_LDSTEX
124 jbsr csky_cmpxchg_fixup
128 ENTRY(csky_systemcall)
131 #ifdef CONFIG_RSEQ_DEBUG
137 lrw r11, __NR_syscalls
138 cmphs syscallid, r11 /* Check nr of syscall */
139 bt ret_from_exception
141 lrw r13, sys_call_table
145 bf ret_from_exception
148 bmaski r10, THREAD_SHIFT
150 ldw r12, (r9, TINFO_FLAGS)
151 ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
153 bt csky_syscall_trace
154 #if defined(__CSKYABIV2__)
158 jsr r11 /* Do system call */
163 stw a0, (sp, LSAVE_A0) /* Save return value */
164 jmpi ret_from_exception
167 mov a0, sp /* sp = pt_regs pointer */
168 jbsr syscall_trace_enter
169 /* Prepare args before do system call */
170 ldw a0, (sp, LSAVE_A0)
171 ldw a1, (sp, LSAVE_A1)
172 ldw a2, (sp, LSAVE_A2)
173 ldw a3, (sp, LSAVE_A3)
174 #if defined(__CSKYABIV2__)
179 ldw r6, (sp, LSAVE_A4)
180 ldw r7, (sp, LSAVE_A5)
182 jsr r11 /* Do system call */
183 #if defined(__CSKYABIV2__)
186 stw a0, (sp, LSAVE_A0) /* Save return value */
188 mov a0, sp /* right now, sp --> pt_regs */
189 jbsr syscall_trace_exit
190 br ret_from_exception
192 ENTRY(ret_from_kernel_thread)
196 jbsr ret_from_exception
201 bmaski r10, THREAD_SHIFT
203 ldw r12, (r9, TINFO_FLAGS)
204 ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
206 bf ret_from_exception
207 mov a0, sp /* sp = pt_regs pointer */
208 jbsr syscall_trace_exit
211 ld syscallid, (sp, LSAVE_PSR)
216 * Load address of current->thread_info, Then get address of task_struct
217 * Get task_needreshed in task_struct
220 bmaski r10, THREAD_SHIFT
223 ldw r12, (r9, TINFO_FLAGS)
224 andi r12, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | _TIF_UPROBE)
228 #ifdef CONFIG_TRACE_IRQFLAGS
229 ld r10, (sp, LSAVE_PSR)
232 jbsr trace_hardirqs_on
238 lrw syscallid, ret_from_exception
241 btsti r12, TIF_NEED_RESCHED
246 jmpi do_notify_resume
255 mov a0, sp /* Push Stack pointer arg */
256 jbsr trap_c /* Call C-level trap handler */
257 jmpi ret_from_exception
260 * Prototype from libc for abiv1:
261 * register unsigned int __result asm("a0");
262 * asm( "trap 3" :"=r"(__result)::);
267 /* increase epc for continue */
272 /* get current task thread_info with kernel 8K stack */
273 bmaski a0, THREAD_SHIFT
280 ldw a0, (a0, TINFO_TP_VALUE)
290 #ifdef CONFIG_TRACE_IRQFLAGS
291 jbsr trace_hardirqs_off
294 #ifdef CONFIG_PREEMPTION
295 mov r9, sp /* Get current stack pointer */
296 bmaski r10, THREAD_SHIFT
297 andn r9, r10 /* Get thread_info */
300 * Get task_struct->stack.preempt_count for current,
303 ldw r12, (r9, TINFO_PREEMPT)
305 stw r12, (r9, TINFO_PREEMPT)
311 #ifdef CONFIG_PREEMPTION
313 stw r12, (r9, TINFO_PREEMPT)
316 ldw r12, (r9, TINFO_FLAGS)
317 btsti r12, TIF_NEED_RESCHED
319 jbsr preempt_schedule_irq /* irq en/disable is done inside */
322 jmpi ret_from_exception
325 * a0 = prev task_struct *
326 * a1 = next task_struct *
335 stw sp, (a3, THREAD_KSP)
337 /* Set up next process to run */
341 ldw sp, (a3, THREAD_KSP) /* Set next kernel sp */
343 #if defined(__CSKYABIV2__)
344 addi a3, a1, TASK_THREAD_INFO
345 ldw tls, (a3, TINFO_TP_VALUE)