Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arc/include/asm/entry.h
26481 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
4
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
5
*/
6
7
#ifndef __ASM_ARC_ENTRY_H
8
#define __ASM_ARC_ENTRY_H
9
10
#include <asm/unistd.h> /* For NR_syscalls definition */
11
#include <asm/arcregs.h>
12
#include <asm/ptrace.h>
13
#include <asm/processor.h> /* For VMALLOC_START */
14
#include <asm/mmu.h>
15
16
#ifdef __ASSEMBLER__
17
18
#ifdef CONFIG_ISA_ARCOMPACT
19
#include <asm/entry-compact.h> /* ISA specific bits */
20
#else
21
#include <asm/entry-arcv2.h>
22
#endif
23
24
/*
25
* save user mode callee regs as struct callee_regs
26
* - needed by fork/do_signal/unaligned-access-emulation.
27
*/
28
.macro SAVE_CALLEE_SAVED_USER
29
SAVE_ABI_CALLEE_REGS
30
.endm
31
32
/*
33
* restore user mode callee regs as struct callee_regs
34
* - could have been changed by ptrace tracer or unaligned-access fixup
35
*/
36
.macro RESTORE_CALLEE_SAVED_USER
37
RESTORE_ABI_CALLEE_REGS
38
.endm
39
40
/*
41
* save/restore kernel mode callee regs at the time of context switch
42
*/
43
.macro SAVE_CALLEE_SAVED_KERNEL
44
SAVE_ABI_CALLEE_REGS
45
.endm
46
47
.macro RESTORE_CALLEE_SAVED_KERNEL
48
RESTORE_ABI_CALLEE_REGS
49
.endm
50
51
/*--------------------------------------------------------------
52
* Super FAST Restore callee saved regs by simply re-adjusting SP
53
*-------------------------------------------------------------*/
54
.macro DISCARD_CALLEE_SAVED_USER
55
add sp, sp, SZ_CALLEE_REGS
56
.endm
57
58
/*-------------------------------------------------------------
59
* given a tsk struct, get to the base of its kernel mode stack
60
* tsk->thread_info is really a PAGE, whose bottom hoists stack
61
* which grows upwards towards thread_info
62
*------------------------------------------------------------*/
63
64
.macro GET_TSK_STACK_BASE tsk, out
65
66
/* Get task->thread_info (this is essentially start of a PAGE) */
67
ld \out, [\tsk, TASK_THREAD_INFO]
68
69
/* Go to end of page where stack begins (grows upwards) */
70
add2 \out, \out, (THREAD_SIZE)/4
71
72
.endm
73
74
/*
75
* @reg [OUT] thread_info->flags of "current"
76
*/
77
.macro GET_CURR_THR_INFO_FLAGS reg
78
GET_CURR_THR_INFO_FROM_SP \reg
79
ld \reg, [\reg, THREAD_INFO_FLAGS]
80
.endm
81
82
#ifdef CONFIG_SMP
83
84
/*
85
* Retrieve the current running task on this CPU
86
* - loads it from backing _current_task[] (and can't use the
87
* caching reg for current task
88
*/
89
.macro GET_CURR_TASK_ON_CPU reg
90
GET_CPU_ID \reg
91
ld.as \reg, [@_current_task, \reg]
92
.endm
93
94
/*-------------------------------------------------
95
* Save a new task as the "current" task on this CPU
96
* 1. Determine curr CPU id.
97
* 2. Use it to index into _current_task[ ]
98
*
99
* Coded differently than GET_CURR_TASK_ON_CPU (which uses LD.AS)
100
* because ST r0, [r1, offset] can ONLY have s9 @offset
101
* while LD can take s9 (4 byte insn) or LIMM (8 byte insn)
102
*/
103
104
.macro SET_CURR_TASK_ON_CPU tsk, tmp
105
GET_CPU_ID \tmp
106
add2 \tmp, @_current_task, \tmp
107
st \tsk, [\tmp]
108
#ifdef CONFIG_ARC_CURR_IN_REG
109
mov gp, \tsk
110
#endif
111
112
.endm
113
114
115
#else /* Uniprocessor implementation of macros */
116
117
.macro GET_CURR_TASK_ON_CPU reg
118
ld \reg, [@_current_task]
119
.endm
120
121
.macro SET_CURR_TASK_ON_CPU tsk, tmp
122
st \tsk, [@_current_task]
123
#ifdef CONFIG_ARC_CURR_IN_REG
124
mov gp, \tsk
125
#endif
126
.endm
127
128
#endif /* SMP / UNI */
129
130
/*
131
* Get the ptr to some field of Current Task at @off in task struct
132
* - Uses current task cached in reg if enabled
133
*/
134
#ifdef CONFIG_ARC_CURR_IN_REG
135
136
.macro GET_CURR_TASK_FIELD_PTR off, reg
137
add \reg, gp, \off
138
.endm
139
140
#else
141
142
.macro GET_CURR_TASK_FIELD_PTR off, reg
143
GET_CURR_TASK_ON_CPU \reg
144
add \reg, \reg, \off
145
.endm
146
147
#endif /* CONFIG_ARC_CURR_IN_REG */
148
149
#else /* !__ASSEMBLER__ */
150
151
extern void do_signal(struct pt_regs *);
152
extern void do_notify_resume(struct pt_regs *);
153
extern int do_privilege_fault(unsigned long, struct pt_regs *);
154
extern int do_extension_fault(unsigned long, struct pt_regs *);
155
extern int insterror_is_error(unsigned long, struct pt_regs *);
156
extern int do_memory_error(unsigned long, struct pt_regs *);
157
extern int trap_is_brkpt(unsigned long, struct pt_regs *);
158
extern int do_misaligned_error(unsigned long, struct pt_regs *);
159
extern int do_trap5_error(unsigned long, struct pt_regs *);
160
extern int do_misaligned_access(unsigned long, struct pt_regs *, struct callee_regs *);
161
extern void do_machine_check_fault(unsigned long, struct pt_regs *);
162
extern void do_non_swi_trap(unsigned long, struct pt_regs *);
163
extern void do_insterror_or_kprobe(unsigned long, struct pt_regs *);
164
extern void do_page_fault(unsigned long, struct pt_regs *);
165
166
#endif
167
168
#endif /* __ASM_ARC_ENTRY_H */
169
170