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)
133 lrw r9, __NR_syscalls
134 cmphs syscallid, r9 /* Check nr of syscall */
137 lrw r9, sys_call_table
141 bf ret_from_exception
144 bmaski r10, THREAD_SHIFT
146 ldw r10, (r9, TINFO_FLAGS)
147 lrw r9, _TIF_SYSCALL_WORK
150 bt csky_syscall_trace
151 #if defined(__CSKYABIV2__)
155 jsr syscallid /* Do system call */
160 stw a0, (sp, LSAVE_A0) /* Save return value */
162 #ifdef CONFIG_DEBUG_RSEQ
166 jmpi ret_from_exception
169 mov a0, sp /* sp = pt_regs pointer */
170 jbsr syscall_trace_enter
171 /* Prepare args before do system call */
172 ldw a0, (sp, LSAVE_A0)
173 ldw a1, (sp, LSAVE_A1)
174 ldw a2, (sp, LSAVE_A2)
175 ldw a3, (sp, LSAVE_A3)
176 #if defined(__CSKYABIV2__)
178 ldw r9, (sp, LSAVE_A4)
180 ldw r9, (sp, LSAVE_A5)
182 jsr syscallid /* Do system call */
185 ldw r6, (sp, LSAVE_A4)
186 ldw r7, (sp, LSAVE_A5)
187 jsr syscallid /* Do system call */
189 stw a0, (sp, LSAVE_A0) /* Save return value */
191 #ifdef CONFIG_DEBUG_RSEQ
195 mov a0, sp /* right now, sp --> pt_regs */
196 jbsr syscall_trace_exit
197 br ret_from_exception
199 ENTRY(ret_from_kernel_thread)
203 jbsr ret_from_exception
208 bmaski r10, THREAD_SHIFT
210 ldw r10, (r9, TINFO_FLAGS)
211 lrw r9, _TIF_SYSCALL_WORK
214 bf ret_from_exception
215 mov a0, sp /* sp = pt_regs pointer */
216 jbsr syscall_trace_exit
220 ld r9, (sp, LSAVE_PSR)
225 * Load address of current->thread_info, Then get address of task_struct
226 * Get task_needreshed in task_struct
229 bmaski r10, THREAD_SHIFT
232 ldw r10, (r9, TINFO_FLAGS)
233 lrw r9, _TIF_WORK_MASK
238 #ifdef CONFIG_PREEMPTION
240 bmaski r10, THREAD_SHIFT
243 ldw r10, (r9, TINFO_PREEMPT)
246 jbsr preempt_schedule_irq /* irq en/disable is done inside */
250 #ifdef CONFIG_TRACE_IRQFLAGS
251 ld r10, (sp, LSAVE_PSR)
254 jbsr trace_hardirqs_on
260 lrw r9, ret_from_exception
263 btsti r10, TIF_NEED_RESCHED
269 jmpi do_notify_resume
278 mov a0, sp /* Push Stack pointer arg */
279 jbsr trap_c /* Call C-level trap handler */
280 jmpi ret_from_exception
283 * Prototype from libc for abiv1:
284 * register unsigned int __result asm("a0");
285 * asm( "trap 3" :"=r"(__result)::);
290 /* increase epc for continue */
295 /* get current task thread_info with kernel 8K stack */
296 bmaski a0, THREAD_SHIFT
303 ldw a0, (a0, TINFO_TP_VALUE)
313 #ifdef CONFIG_TRACE_IRQFLAGS
314 jbsr trace_hardirqs_off
321 jmpi ret_from_exception
324 * a0 = prev task_struct *
325 * a1 = next task_struct *
334 stw sp, (a3, THREAD_KSP)
336 /* Set up next process to run */
340 ldw sp, (a3, THREAD_KSP) /* Set next kernel sp */
342 #if defined(__CSKYABIV2__)
343 addi a3, a1, TASK_THREAD_INFO
344 ldw tls, (a3, TINFO_TP_VALUE)