xref: /netbsd-src/sys/arch/amiga/include/cpu.h (revision 3b01aba77a7a698587faaae455bbfe740923c1f5)
1 /*	$NetBSD: cpu.h,v 1.52 2001/05/30 12:28:39 mrg Exp $	*/
2 
3 /*
4  * Copyright (c) 1988 University of Utah.
5  * Copyright (c) 1982, 1990 The Regents of the University of California.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * the Systems Programming Group of the University of Utah Computer
10  * Science Department.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. All advertising materials mentioning features or use of this software
21  *    must display the following acknowledgement:
22  *	This product includes software developed by the University of
23  *	California, Berkeley and its contributors.
24  * 4. Neither the name of the University nor the names of its contributors
25  *    may be used to endorse or promote products derived from this software
26  *    without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38  * SUCH DAMAGE.
39  *
40  * from: Utah $Hdr: cpu.h 1.16 91/03/25$
41  *
42  *	@(#)cpu.h	7.7 (Berkeley) 6/27/91
43  */
44 #ifndef _MACHINE_CPU_H_
45 #define _MACHINE_CPU_H_
46 
47 /*
48  * Exported definitions unique to amiga/68k cpu support.
49  */
50 
51 #if defined(_KERNEL_OPT)
52 #include "opt_lockdebug.h"
53 #endif
54 
55 /*
56  * Get common m68k CPU definitions.
57  */
58 #include <m68k/cpu.h>
59 #define	M68K_MMU_MOTOROLA
60 
61 #include <sys/sched.h>
62 struct cpu_info {
63 	struct schedstate_percpu ci_schedstate; /* scheduler state */
64 #if defined(DIAGNOSTIC) || defined(LOCKDEBUG)
65 	u_long ci_spin_locks;		/* # of spin locks held */
66 	u_long ci_simple_locks;		/* # of simple locks held */
67 #endif
68 };
69 
70 #ifdef _KERNEL
71 extern struct cpu_info cpu_info_store;
72 
73 #define	curcpu()	(&cpu_info_store)
74 
75 /*
76  * definitions of cpu-dependent requirements
77  * referenced in generic code
78  */
79 #define	cpu_swapin(p)			/* nothing */
80 #define	cpu_wait(p)			/* nothing */
81 #define	cpu_swapout(p)			/* nothing */
82 #define	cpu_number()			0
83 
84 /*
85  * Arguments to hardclock and gatherstats encapsulate the previous
86  * machine state in an opaque clockframe.  One the hp300, we use
87  * what the hardware pushes on an interrupt (frame format 0).
88  */
89 struct clockframe {
90 	u_short	sr;		/* sr at time of interrupt */
91 	u_long	pc;		/* pc at time of interrupt */
92 	u_short	vo;		/* vector offset (4-word frame) */
93 };
94 
95 #define	CLKF_USERMODE(framep)	(((framep)->sr & PSL_S) == 0)
96 /*#define	CLKF_BASEPRI(framep)	(((framep)->sr & PSL_IPL) == 0)*/
97 #define	CLKF_BASEPRI(framep)	(0)
98 #define	CLKF_PC(framep)		((framep)->pc)
99 #if 0
100 /* We would like to do it this way... */
101 #define	CLKF_INTR(framep)	(((framep)->sr & PSL_M) == 0)
102 #else
103 /* but until we start using PSL_M, we have to do this instead */
104 #define	CLKF_INTR(framep)	(0)	/* XXX */
105 #endif
106 
107 
108 /*
109  * Preempt the current process if in interrupt from user mode,
110  * or after the current trap/syscall if in system mode.
111  */
112 extern int want_resched;	/* resched() was called */
113 #define	need_resched(ci)	{want_resched = 1; setsoftast();}
114 
115 /*
116  * Give a profiling tick to the current process from the softclock
117  * interrupt.  On hp300, request an ast to send us through trap(),
118  * marking the proc as needing a profiling tick.
119  */
120 #define	profile_tick(p, framep)	((p)->p_flag |= P_OWEUPC, setsoftast())
121 #define	need_proftick(p)	((p)->p_flag |= P_OWEUPC, setsoftast())
122 
123 /*
124  * Notify the current process (p) that it has a signal pending,
125  * process as soon as possible.
126  */
127 #define	signotify(p)	setsoftast()
128 
129 extern int astpending;		/* need trap before returning to user mode */
130 #define setsoftast()	(astpending = 1)
131 
132 #endif /* _KERNEL */
133 
134 /* include support for software interrupts */
135 #include <machine/mtpr.h>
136 
137 /*
138  * The rest of this should probably be moved to ../amiga/amigacpu.h,
139  * although some of it could probably be put into generic 68k headers.
140  */
141 
142 /* values for machineid (happen to be AFF_* settings of AttnFlags) */
143 #define AMIGA_68020	(1L<<1)
144 #define AMIGA_68030	(1L<<2)
145 #define AMIGA_68040	(1L<<3)
146 #define AMIGA_68881	(1L<<4)
147 #define AMIGA_68882	(1L<<5)
148 #define	AMIGA_FPU40	(1L<<6)
149 #define AMIGA_68060	(1L<<7)
150 
151 #ifdef _KERNEL
152 int machineid;
153 #endif
154 
155 /*
156  * CTL_MACHDEP definitions.
157  */
158 #define CPU_CONSDEV	1	/* dev_t: console terminal device */
159 #define CPU_MAXID	2	/* number of valid machdep ids */
160 
161 #define CTL_MACHDEP_NAMES { \
162 	{ 0, 0 }, \
163 	{ "console_device", CTLTYPE_STRUCT }, \
164 }
165 
166 #ifdef _KERNEL
167 /*
168  * Prototypes from amiga_init.c
169  */
170 void	*alloc_z2mem __P((long));
171 
172 /*
173  * Prototypes from autoconf.c
174  */
175 int	is_a1200 __P((void));
176 int	is_a3000 __P((void));
177 int	is_a4000 __P((void));
178 #ifdef DRACO
179 #define	is_draco() ((machineid >> 24) == 0x7d ? (machineid >> 16) & 0xff : 0)
180 #endif
181 
182 /*
183  * Prototypes from clock.c
184  */
185 u_long	clkread __P((void));
186 
187 #ifdef DRACO
188 /*
189  * Prototypes from kbd.c
190  */
191 void	drkbdintr __P((void));
192 
193 /*
194  * Prototypes from drsc.c
195  */
196 void	drsc_handler __P((void));
197 #endif
198 
199 /*
200  * Prototypes from locore.s
201  */
202 struct fpframe;
203 struct user;
204 struct pcb;
205 
206 void	clearseg __P((vm_offset_t));
207 void	doboot __P((void)) __attribute__((__noreturn__));
208 void	loadustp __P((int));
209 #ifdef FPCOPROC
210 void	m68881_save __P((struct fpframe *));
211 void	m68881_restore __P((struct fpframe *));
212 #endif
213 void	physcopyseg __P((vm_offset_t, vm_offset_t));
214 u_int	probeva __P((u_int, u_int));
215 void	proc_trampoline __P((void));
216 void	savectx __P((struct pcb *));
217 void	switch_exit __P((struct proc *));
218 
219 /*
220  * Prototypes from machdep.c
221  */
222 int	badaddr __P((caddr_t));
223 int	badbaddr __P((caddr_t));
224 void	bootsync __P((void));
225 void	dumpconf __P((void));
226 
227 /*
228  * Prototypes from sys_machdep.c:
229  */
230 int	cachectl1 __P((unsigned long, vaddr_t, size_t, struct proc *));
231 int	dma_cachectl __P((caddr_t, int));
232 
233 /*
234  * Prototypes from vm_machdep.c
235  */
236 int	kvtop __P((caddr_t));
237 void	physaccess __P((caddr_t,  caddr_t, int, int));
238 void	physunaccess __P((caddr_t, int));
239 void	setredzone __P((u_int *, caddr_t));
240 
241 /*
242  * Prototypes from pmap.c:
243  */
244 void	pmap_bootstrap __P((vm_offset_t, vm_offset_t));
245 
246 #endif /* _KERNEL */
247 
248 #endif /* !_MACHINE_CPU_H_ */
249