xref: /linux/arch/arc/include/asm/entry.h (revision 4232da23d75d173195c6766729e51947b64f83cd)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
29d42c84fSVineet Gupta /*
36d1a20b1SVineet Gupta  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
49d42c84fSVineet Gupta  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
59d42c84fSVineet Gupta  */
69d42c84fSVineet Gupta 
79d42c84fSVineet Gupta #ifndef __ASM_ARC_ENTRY_H
89d42c84fSVineet Gupta #define __ASM_ARC_ENTRY_H
99d42c84fSVineet Gupta 
10*ebfc2fd8SBjorn Helgaas #include <asm/unistd.h>		/* For NR_syscalls definition */
119d42c84fSVineet Gupta #include <asm/arcregs.h>
129d42c84fSVineet Gupta #include <asm/ptrace.h>
13080c3747SVineet Gupta #include <asm/processor.h>	/* For VMALLOC_START */
144ffd9e2cSVineet Gupta #include <asm/mmu.h>
159d42c84fSVineet Gupta 
164d369680SVineet Gupta #ifdef __ASSEMBLY__
174d369680SVineet Gupta 
181f6ccfffSVineet Gupta #ifdef CONFIG_ISA_ARCOMPACT
196d1a20b1SVineet Gupta #include <asm/entry-compact.h>	/* ISA specific bits */
201f6ccfffSVineet Gupta #else
211f6ccfffSVineet Gupta #include <asm/entry-arcv2.h>
221f6ccfffSVineet Gupta #endif
236d1a20b1SVineet Gupta 
24cfca4b5aSVineet Gupta /*
25cfca4b5aSVineet Gupta  * save user mode callee regs as struct callee_regs
26cfca4b5aSVineet Gupta  *  - needed by fork/do_signal/unaligned-access-emulation.
27cfca4b5aSVineet Gupta  */
289d42c84fSVineet Gupta .macro SAVE_CALLEE_SAVED_USER
299de7fc30SVineet Gupta 	SAVE_ABI_CALLEE_REGS
309d42c84fSVineet Gupta .endm
319d42c84fSVineet Gupta 
32cfca4b5aSVineet Gupta /*
33cfca4b5aSVineet Gupta  * restore user mode callee regs as struct callee_regs
34cfca4b5aSVineet Gupta  *  - could have been changed by ptrace tracer or unaligned-access fixup
35cfca4b5aSVineet Gupta  */
36c3581039SVineet Gupta .macro RESTORE_CALLEE_SAVED_USER
379de7fc30SVineet Gupta 	RESTORE_ABI_CALLEE_REGS
38cfca4b5aSVineet Gupta .endm
39c3581039SVineet Gupta 
40cfca4b5aSVineet Gupta /*
41cfca4b5aSVineet Gupta  * save/restore kernel mode callee regs at the time of context switch
42cfca4b5aSVineet Gupta  */
43cfca4b5aSVineet Gupta .macro SAVE_CALLEE_SAVED_KERNEL
449de7fc30SVineet Gupta 	SAVE_ABI_CALLEE_REGS
45cfca4b5aSVineet Gupta .endm
460d7b8855SVineet Gupta 
47cfca4b5aSVineet Gupta .macro RESTORE_CALLEE_SAVED_KERNEL
489de7fc30SVineet Gupta 	RESTORE_ABI_CALLEE_REGS
49c3581039SVineet Gupta .endm
50c3581039SVineet Gupta 
51c3581039SVineet Gupta /*--------------------------------------------------------------
529d42c84fSVineet Gupta  * Super FAST Restore callee saved regs by simply re-adjusting SP
539d42c84fSVineet Gupta  *-------------------------------------------------------------*/
549d42c84fSVineet Gupta .macro DISCARD_CALLEE_SAVED_USER
5516f9afe6SVineet Gupta 	add     sp, sp, SZ_CALLEE_REGS
569d42c84fSVineet Gupta .endm
579d42c84fSVineet Gupta 
589d42c84fSVineet Gupta /*-------------------------------------------------------------
59*ebfc2fd8SBjorn Helgaas  * given a tsk struct, get to the base of its kernel mode stack
609d42c84fSVineet Gupta  * tsk->thread_info is really a PAGE, whose bottom hoists stack
619d42c84fSVineet Gupta  * which grows upwards towards thread_info
629d42c84fSVineet Gupta  *------------------------------------------------------------*/
639d42c84fSVineet Gupta 
649d42c84fSVineet Gupta .macro GET_TSK_STACK_BASE tsk, out
659d42c84fSVineet Gupta 
669d42c84fSVineet Gupta 	/* Get task->thread_info (this is essentially start of a PAGE) */
679d42c84fSVineet Gupta 	ld  \out, [\tsk, TASK_THREAD_INFO]
689d42c84fSVineet Gupta 
699d42c84fSVineet Gupta 	/* Go to end of page where stack begins (grows upwards) */
70283237a0SVineet Gupta 	add2 \out, \out, (THREAD_SIZE)/4
719d42c84fSVineet Gupta 
729d42c84fSVineet Gupta .endm
739d42c84fSVineet Gupta 
749d42c84fSVineet Gupta /*
759d42c84fSVineet Gupta  * @reg [OUT] thread_info->flags of "current"
769d42c84fSVineet Gupta  */
779d42c84fSVineet Gupta .macro GET_CURR_THR_INFO_FLAGS  reg
789d42c84fSVineet Gupta 	GET_CURR_THR_INFO_FROM_SP  \reg
799d42c84fSVineet Gupta 	ld  \reg, [\reg, THREAD_INFO_FLAGS]
809d42c84fSVineet Gupta .endm
819d42c84fSVineet Gupta 
8241195d23SVineet Gupta #ifdef CONFIG_SMP
8341195d23SVineet Gupta 
84cfca4b5aSVineet Gupta /*
8541195d23SVineet Gupta  * Retrieve the current running task on this CPU
86cfca4b5aSVineet Gupta  *  - loads it from backing _current_task[] (and can't use the
87cfca4b5aSVineet Gupta  *    caching reg for current task
8841195d23SVineet Gupta  */
8941195d23SVineet Gupta .macro  GET_CURR_TASK_ON_CPU   reg
9041195d23SVineet Gupta 	GET_CPU_ID  \reg
9141195d23SVineet Gupta 	ld.as  \reg, [@_current_task, \reg]
9241195d23SVineet Gupta .endm
9341195d23SVineet Gupta 
9441195d23SVineet Gupta /*-------------------------------------------------
9541195d23SVineet Gupta  * Save a new task as the "current" task on this CPU
9641195d23SVineet Gupta  * 1. Determine curr CPU id.
9741195d23SVineet Gupta  * 2. Use it to index into _current_task[ ]
9841195d23SVineet Gupta  *
9941195d23SVineet Gupta  * Coded differently than GET_CURR_TASK_ON_CPU (which uses LD.AS)
10041195d23SVineet Gupta  * because ST r0, [r1, offset] can ONLY have s9 @offset
10141195d23SVineet Gupta  * while   LD can take s9 (4 byte insn) or LIMM (8 byte insn)
10241195d23SVineet Gupta  */
10341195d23SVineet Gupta 
10441195d23SVineet Gupta .macro  SET_CURR_TASK_ON_CPU    tsk, tmp
10541195d23SVineet Gupta 	GET_CPU_ID  \tmp
10641195d23SVineet Gupta 	add2 \tmp, @_current_task, \tmp
10741195d23SVineet Gupta 	st   \tsk, [\tmp]
10841195d23SVineet Gupta #ifdef CONFIG_ARC_CURR_IN_REG
109cfca4b5aSVineet Gupta 	mov gp, \tsk
11041195d23SVineet Gupta #endif
11141195d23SVineet Gupta 
11241195d23SVineet Gupta .endm
11341195d23SVineet Gupta 
11441195d23SVineet Gupta 
11541195d23SVineet Gupta #else   /* Uniprocessor implementation of macros */
11641195d23SVineet Gupta 
1179d42c84fSVineet Gupta .macro  GET_CURR_TASK_ON_CPU    reg
1189d42c84fSVineet Gupta 	ld  \reg, [@_current_task]
1199d42c84fSVineet Gupta .endm
1209d42c84fSVineet Gupta 
1219d42c84fSVineet Gupta .macro  SET_CURR_TASK_ON_CPU    tsk, tmp
1229d42c84fSVineet Gupta 	st  \tsk, [@_current_task]
123080c3747SVineet Gupta #ifdef CONFIG_ARC_CURR_IN_REG
124cfca4b5aSVineet Gupta 	mov gp, \tsk
125080c3747SVineet Gupta #endif
1269d42c84fSVineet Gupta .endm
1279d42c84fSVineet Gupta 
12841195d23SVineet Gupta #endif /* SMP / UNI */
12941195d23SVineet Gupta 
130cfca4b5aSVineet Gupta /*
1319d42c84fSVineet Gupta  * Get the ptr to some field of Current Task at @off in task struct
132cfca4b5aSVineet Gupta  *  - Uses current task cached in reg if enabled
1339d42c84fSVineet Gupta  */
134080c3747SVineet Gupta #ifdef CONFIG_ARC_CURR_IN_REG
135080c3747SVineet Gupta 
136080c3747SVineet Gupta .macro GET_CURR_TASK_FIELD_PTR  off,  reg
137cfca4b5aSVineet Gupta 	add \reg, gp, \off
138080c3747SVineet Gupta .endm
139080c3747SVineet Gupta 
140080c3747SVineet Gupta #else
141080c3747SVineet Gupta 
1429d42c84fSVineet Gupta .macro GET_CURR_TASK_FIELD_PTR  off,  reg
1439d42c84fSVineet Gupta 	GET_CURR_TASK_ON_CPU  \reg
1449d42c84fSVineet Gupta 	add \reg, \reg, \off
1459d42c84fSVineet Gupta .endm
1469d42c84fSVineet Gupta 
147080c3747SVineet Gupta #endif	/* CONFIG_ARC_CURR_IN_REG */
148080c3747SVineet Gupta 
1494d369680SVineet Gupta #else	/* !__ASSEMBLY__ */
1504d369680SVineet Gupta 
1514d369680SVineet Gupta extern void do_signal(struct pt_regs *);
1524d369680SVineet Gupta extern void do_notify_resume(struct pt_regs *);
1534d369680SVineet Gupta extern int do_privilege_fault(unsigned long, struct pt_regs *);
1544d369680SVineet Gupta extern int do_extension_fault(unsigned long, struct pt_regs *);
1554d369680SVineet Gupta extern int insterror_is_error(unsigned long, struct pt_regs *);
1564d369680SVineet Gupta extern int do_memory_error(unsigned long, struct pt_regs *);
1574d369680SVineet Gupta extern int trap_is_brkpt(unsigned long, struct pt_regs *);
1584d369680SVineet Gupta extern int do_misaligned_error(unsigned long, struct pt_regs *);
1594d369680SVineet Gupta extern int do_trap5_error(unsigned long, struct pt_regs *);
1604d369680SVineet Gupta extern int do_misaligned_access(unsigned long, struct pt_regs *, struct callee_regs *);
1614d369680SVineet Gupta extern void do_machine_check_fault(unsigned long, struct pt_regs *);
1624d369680SVineet Gupta extern void do_non_swi_trap(unsigned long, struct pt_regs *);
1634d369680SVineet Gupta extern void do_insterror_or_kprobe(unsigned long, struct pt_regs *);
1644d369680SVineet Gupta extern void do_page_fault(unsigned long, struct pt_regs *);
1654d369680SVineet Gupta 
1664d369680SVineet Gupta #endif
1674d369680SVineet Gupta 
1689d42c84fSVineet Gupta #endif  /* __ASM_ARC_ENTRY_H */
169