summaryrefslogtreecommitdiffstats
path: root/include/asm-m68k/entry.h
blob: b1c102ce2a4151c7e83e32a764c7687dc1c3a096 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#ifndef __M68K_ENTRY_H
#define __M68K_ENTRY_H

#include <linux/config.h>
#include <asm/setup.h>
#ifdef CONFIG_KGDB
#include <asm/kgdb.h>
#endif

/*
 * Stack layout in 'ret_from_exception':
 *
 *	This allows access to the syscall arguments in registers d1-d5
 *
 *	 0(sp) - d1
 *	 4(sp) - d2
 *	 8(sp) - d3
 *	 C(sp) - d4
 *	10(sp) - d5
 *	14(sp) - a0
 *	18(sp) - a1
 *	1C(sp) - a2
 *	20(sp) - d0
 *	24(sp) - orig_d0
 *	28(sp) - stack adjustment
 *	2C(sp) - sr
 *	2E(sp) - pc
 *	32(sp) - format & vector
 */

/*
 * 97/05/14 Andreas: Register %a2 is now set to the current task throughout
 *		     the whole kernel.
 */

#ifdef __ASSEMBLY__

#define curptr a2

/*
 * these are offsets into the task-struct
 */
LTASK_STATE	 =  0
LTASK_FLAGS	 =  4
LTASK_SIGPENDING =  8
LTASK_ADDRLIMIT	 = 12
LTASK_EXECDOMAIN = 16
LTASK_NEEDRESCHED = 20

LTSS_KSP	= 0
LTSS_USP	= 4
LTSS_SR		= 8
LTSS_FS		= 10
LTSS_CRP	= 12
LTSS_FPCTXT	= 24

/* the following macro is used when enabling interrupts */
#if defined(CONFIG_ATARI_ONLY) && !defined(CONFIG_HADES)
	/* block out HSYNC on the atari */
#define ALLOWINT 0xfbff
#define	MAX_NOINT_IPL	3
#else
	/* portable version */
#define ALLOWINT 0xf8ff
#define	MAX_NOINT_IPL	0
#endif /* machine compilation types */ 

LPT_OFF_D0	  = 0x20
LPT_OFF_ORIG_D0	  = 0x24
LPT_OFF_SR	  = 0x2C
LPT_OFF_FORMATVEC = 0x32

LFLUSH_I_AND_D = 0x00000808
LENOSYS = 38
LSIGTRAP = 5

LPF_TRACESYS_OFF = 3
LPF_TRACESYS_BIT = 5
LPF_PTRACED_OFF = 3
LPF_PTRACED_BIT = 4
LPF_DTRACE_OFF = 1
LPF_DTRACE_BIT = 5

/*
 * This defines the normal kernel pt-regs layout.
 *
 * regs a3-a6 and d6-d7 are preserved by C code
 * the kernel doesn't mess with usp unless it needs to
 */
#ifndef CONFIG_KGDB
/*
 * a -1 in the orig_d0 field signifies
 * that the stack frame is NOT for syscall
 */
#define SAVE_ALL_INT				\
	clrl	%sp@-;		/* stk_adj */	\
	pea	-1:w;		/* orig d0 */	\
	movel	%d0,%sp@-;	/* d0 */	\
	moveml	%d1-%d5/%a0-%a1/%curptr,%sp@-

#define SAVE_ALL_SYS				\
	clrl	%sp@-;		/* stk_adj */	\
	movel	%d0,%sp@-;	/* orig d0 */	\
	movel	%d0,%sp@-;	/* d0 */	\
	moveml  %d1-%d5/%a0-%a1/%curptr,%sp@-
#else
/* Need to save the "missing" registers for kgdb...
 */
#define SAVE_ALL_INT					\
	clrl	%sp@-;		/* stk_adj */		\
	pea	-1:w;		/* orig d0 */		\
	movel	%d0,%sp@-;	/* d0 */		\
	moveml	%d1-%d5/%a0-%a1/%curptr,%sp@-;		\
	moveml	%d6-%d7,kgdb_registers+GDBOFFA_D6;	\
	moveml	%a3-%a6,kgdb_registers+GDBOFFA_A3

#define SAVE_ALL_SYS					\
	clrl	%sp@-;		/* stk_adj */		\
	movel	%d0,%sp@-;	/* orig d0 */		\
	movel	%d0,%sp@-;	/* d0 */		\
	moveml	%d1-%d5/%a0-%a1/%curptr,%sp@-;		\
	moveml	%d6-%d7,kgdb_registers+GDBOFFA_D6;	\
	moveml	%a3-%a6,kgdb_registers+GDBOFFA_A3
#endif

#define RESTORE_ALL			\
	moveml	%sp@+,%a0-%a1/%curptr/%d1-%d5;	\
	movel	%sp@+,%d0;		\
	addql	#4,%sp;	 /* orig d0 */	\
	addl	%sp@+,%sp; /* stk adj */	\
	rte

#define SWITCH_STACK_SIZE (6*4+4)	/* includes return address */

#define SAVE_SWITCH_STACK \
	moveml	%a3-%a6/%d6-%d7,%sp@-

#define RESTORE_SWITCH_STACK \
	moveml	%sp@+,%a3-%a6/%d6-%d7

#define GET_CURRENT(tmp) \
	movel	%sp,tmp; \
	andw	&-8192,tmp; \
	movel	tmp,%curptr;

#else /* C source */

#define STR(X) STR1(X)
#define STR1(X) #X

#define PT_OFF_ORIG_D0	 0x24
#define PT_OFF_FORMATVEC 0x32
#define PT_OFF_SR	 0x2C
#ifndef CONFIG_KGDB
#define SAVE_ALL_INT				\
	"clrl	%%sp@-;"    /* stk_adj */	\
	"pea	-1:w;"	    /* orig d0 = -1 */	\
	"movel	%%d0,%%sp@-;" /* d0 */		\
	"moveml	%%d1-%%d5/%%a0-%%a2,%%sp@-"
#else
#define SAVE_ALL_INT				\
	"clrl	%%sp@-\n\t" /* stk_adj */	\
	"pea	-1:w\n\t"   /* orig d0 = -1 */	\
	"movel	%%d0,%%sp@-\n\t" /* d0 */	\
	"moveml	%%d1-%%d5/%%a0-%%a2,%%sp@-\n\t"	\
	"moveml	%%d6-%%d7,kgdb_registers+"STR(GDBOFFA_D6)"\n\t" \
	"moveml	%%a3-%%a6,kgdb_registers+"STR(GDBOFFA_A3)
#endif
#define GET_CURRENT(tmp) \
	"movel	%%sp,"#tmp"\n\t" \
	"andw	#-8192,"#tmp"\n\t" \
	"movel	"#tmp",%%a2"

#endif

#endif /* __M68K_ENTRY_H */