locore.h revision 1.58.2.2 1 1.58.2.2 nathanw /* $NetBSD: locore.h,v 1.58.2.2 2002/04/01 07:40:58 nathanw Exp $ */
2 1.58.2.2 nathanw
3 1.58.2.2 nathanw /*
4 1.58.2.2 nathanw * Copyright 1996 The Board of Trustees of The Leland Stanford
5 1.58.2.2 nathanw * Junior University. All Rights Reserved.
6 1.58.2.2 nathanw *
7 1.58.2.2 nathanw * Permission to use, copy, modify, and distribute this
8 1.58.2.2 nathanw * software and its documentation for any purpose and without
9 1.58.2.2 nathanw * fee is hereby granted, provided that the above copyright
10 1.58.2.2 nathanw * notice appear in all copies. Stanford University
11 1.58.2.2 nathanw * makes no representations about the suitability of this
12 1.58.2.2 nathanw * software for any purpose. It is provided "as is" without
13 1.58.2.2 nathanw * express or implied warranty.
14 1.58.2.2 nathanw */
15 1.58.2.2 nathanw
16 1.58.2.2 nathanw /*
17 1.58.2.2 nathanw * Jump table for MIPS cpu locore functions that are implemented
18 1.58.2.2 nathanw * differently on different generations, or instruction-level
19 1.58.2.2 nathanw * archtecture (ISA) level, the Mips family.
20 1.58.2.2 nathanw *
21 1.58.2.2 nathanw * We currently provide support for MIPS I and MIPS III.
22 1.58.2.2 nathanw */
23 1.58.2.2 nathanw
24 1.58.2.2 nathanw #ifndef _MIPS_LOCORE_H
25 1.58.2.2 nathanw #define _MIPS_LOCORE_H
26 1.58.2.2 nathanw
27 1.58.2.2 nathanw #ifndef _LKM
28 1.58.2.2 nathanw #include "opt_cputype.h"
29 1.58.2.2 nathanw #include "opt_mips_cache.h"
30 1.58.2.2 nathanw #endif
31 1.58.2.2 nathanw
32 1.58.2.2 nathanw #include <mips/cpuregs.h>
33 1.58.2.2 nathanw
34 1.58.2.2 nathanw struct tlb;
35 1.58.2.2 nathanw
36 1.58.2.2 nathanw /*
37 1.58.2.2 nathanw * locore service routine for exception vectors. Used outside locore
38 1.58.2.2 nathanw * only to print them by name in stack tracebacks
39 1.58.2.2 nathanw */
40 1.58.2.2 nathanw
41 1.58.2.2 nathanw uint32_t mips_cp0_cause_read(void);
42 1.58.2.2 nathanw void mips_cp0_cause_write(uint32_t);
43 1.58.2.2 nathanw uint32_t mips_cp0_status_read(void);
44 1.58.2.2 nathanw void mips_cp0_status_write(uint32_t);
45 1.58.2.2 nathanw
46 1.58.2.2 nathanw #ifdef MIPS1
47 1.58.2.2 nathanw void mips1_SetPID(int);
48 1.58.2.2 nathanw void mips1_TBIA(int);
49 1.58.2.2 nathanw void mips1_TBIAP(int);
50 1.58.2.2 nathanw void mips1_TBIS(vaddr_t);
51 1.58.2.2 nathanw int mips1_TLBUpdate(u_int, u_int);
52 1.58.2.2 nathanw void mips1_wbflush(void);
53 1.58.2.2 nathanw void mips1_proc_trampoline(void);
54 1.58.2.2 nathanw void mips1_cpu_switch_resume(void);
55 1.58.2.2 nathanw
56 1.58.2.2 nathanw uint32_t tx3900_cp0_config_read(void);
57 1.58.2.2 nathanw #endif
58 1.58.2.2 nathanw
59 1.58.2.2 nathanw #if defined(MIPS3) || defined(MIPS4)
60 1.58.2.2 nathanw void mips3_SetPID(int);
61 1.58.2.2 nathanw void mips3_TBIA(int);
62 1.58.2.2 nathanw void mips3_TBIAP(int);
63 1.58.2.2 nathanw void mips3_TBIS(vaddr_t);
64 1.58.2.2 nathanw int mips3_TLBUpdate(u_int, u_int);
65 1.58.2.2 nathanw void mips3_TLBRead(int, struct tlb *);
66 1.58.2.2 nathanw void mips3_wbflush(void);
67 1.58.2.2 nathanw void mips3_proc_trampoline(void);
68 1.58.2.2 nathanw void mips3_cpu_switch_resume(void);
69 1.58.2.2 nathanw
70 1.58.2.2 nathanw #ifdef MIPS3_5900
71 1.58.2.2 nathanw void mips5900_SetPID(int);
72 1.58.2.2 nathanw void mips5900_TBIA(int);
73 1.58.2.2 nathanw void mips5900_TBIAP(int);
74 1.58.2.2 nathanw void mips5900_TBIS(vaddr_t);
75 1.58.2.2 nathanw int mips5900_TLBUpdate(u_int, u_int);
76 1.58.2.2 nathanw void mips5900_TLBRead(int, struct tlb *);
77 1.58.2.2 nathanw void mips5900_wbflush(void);
78 1.58.2.2 nathanw void mips5900_proc_trampoline(void);
79 1.58.2.2 nathanw void mips5900_cpu_switch_resume(void);
80 1.58.2.2 nathanw #endif
81 1.58.2.2 nathanw #endif
82 1.58.2.2 nathanw
83 1.58.2.2 nathanw #ifdef MIPS32
84 1.58.2.2 nathanw void mips32_SetPID(int);
85 1.58.2.2 nathanw void mips32_TBIA(int);
86 1.58.2.2 nathanw void mips32_TBIAP(int);
87 1.58.2.2 nathanw void mips32_TBIS(vaddr_t);
88 1.58.2.2 nathanw int mips32_TLBUpdate(u_int, u_int);
89 1.58.2.2 nathanw void mips32_TLBRead(int, struct tlb *);
90 1.58.2.2 nathanw void mips32_wbflush(void);
91 1.58.2.2 nathanw void mips32_proc_trampoline(void);
92 1.58.2.2 nathanw void mips32_cpu_switch_resume(void);
93 1.58.2.2 nathanw #endif
94 1.58.2.2 nathanw
95 1.58.2.2 nathanw #ifdef MIPS64
96 1.58.2.2 nathanw void mips64_SetPID(int);
97 1.58.2.2 nathanw void mips64_TBIA(int);
98 1.58.2.2 nathanw void mips64_TBIAP(int);
99 1.58.2.2 nathanw void mips64_TBIS(vaddr_t);
100 1.58.2.2 nathanw int mips64_TLBUpdate(u_int, u_int);
101 1.58.2.2 nathanw void mips64_TLBRead(int, struct tlb *);
102 1.58.2.2 nathanw void mips64_wbflush(void);
103 1.58.2.2 nathanw void mips64_proc_trampoline(void);
104 1.58.2.2 nathanw void mips64_cpu_switch_resume(void);
105 1.58.2.2 nathanw #endif
106 1.58.2.2 nathanw
107 1.58.2.2 nathanw uint32_t mips3_cp0_compare_read(void);
108 1.58.2.2 nathanw void mips3_cp0_compare_write(uint32_t);
109 1.58.2.2 nathanw
110 1.58.2.2 nathanw uint32_t mips3_cp0_config_read(void);
111 1.58.2.2 nathanw void mips3_cp0_config_write(uint32_t);
112 1.58.2.2 nathanw uint32_t mipsNN_cp0_config1_read(void);
113 1.58.2.2 nathanw void mipsNN_cp0_config1_write(uint32_t);
114 1.58.2.2 nathanw
115 1.58.2.2 nathanw uint32_t mips3_cp0_count_read(void);
116 1.58.2.2 nathanw void mips3_cp0_count_write(uint32_t);
117 1.58.2.2 nathanw
118 1.58.2.2 nathanw uint32_t mips3_cp0_wired_read(void);
119 1.58.2.2 nathanw void mips3_cp0_wired_write(uint32_t);
120 1.58.2.2 nathanw
121 1.58.2.2 nathanw uint64_t mips3_ld(uint64_t *);
122 1.58.2.2 nathanw void mips3_sd(uint64_t *, uint64_t);
123 1.58.2.2 nathanw
124 1.58.2.2 nathanw static inline uint32_t mips3_lw_a64(uint64_t addr)
125 1.58.2.2 nathanw __attribute__((__unused__));
126 1.58.2.2 nathanw static inline void mips3_sw_a64(uint64_t addr, uint32_t val)
127 1.58.2.2 nathanw __attribute__ ((__unused__));
128 1.58.2.2 nathanw
129 1.58.2.2 nathanw static inline uint32_t
130 1.58.2.2 nathanw mips3_lw_a64(uint64_t addr)
131 1.58.2.2 nathanw {
132 1.58.2.2 nathanw uint32_t addrlo, addrhi;
133 1.58.2.2 nathanw uint32_t rv;
134 1.58.2.2 nathanw uint32_t sr;
135 1.58.2.2 nathanw
136 1.58.2.2 nathanw sr = mips_cp0_status_read();
137 1.58.2.2 nathanw mips_cp0_status_write(sr | MIPS3_SR_KX);
138 1.58.2.2 nathanw
139 1.58.2.2 nathanw addrlo = addr & 0xffffffff;
140 1.58.2.2 nathanw addrhi = addr >> 32;
141 1.58.2.2 nathanw __asm__ __volatile__ (" \n\
142 1.58.2.2 nathanw .set push \n\
143 1.58.2.2 nathanw .set mips3 \n\
144 1.58.2.2 nathanw .set noreorder \n\
145 1.58.2.2 nathanw .set noat \n\
146 1.58.2.2 nathanw dsll32 $3, %1, 0 \n\
147 1.58.2.2 nathanw dsll32 $1, %2, 0 \n\
148 1.58.2.2 nathanw dsrl32 $3, $3, 0 \n\
149 1.58.2.2 nathanw or $1, $1, $3 \n\
150 1.58.2.2 nathanw lw %0, 0($1) \n\
151 1.58.2.2 nathanw .set pop \n\
152 1.58.2.2 nathanw " : "=r"(rv) : "r"(addrlo), "r"(addrhi) : "$1", "$3" );
153 1.58.2.2 nathanw
154 1.58.2.2 nathanw mips_cp0_status_write(sr);
155 1.58.2.2 nathanw
156 1.58.2.2 nathanw return (rv);
157 1.58.2.2 nathanw }
158 1.58.2.2 nathanw
159 1.58.2.2 nathanw static inline void
160 1.58.2.2 nathanw mips3_sw_a64(uint64_t addr, uint32_t val)
161 1.58.2.2 nathanw {
162 1.58.2.2 nathanw uint32_t addrlo, addrhi;
163 1.58.2.2 nathanw uint32_t sr;
164 1.58.2.2 nathanw
165 1.58.2.2 nathanw sr = mips_cp0_status_read();
166 1.58.2.2 nathanw mips_cp0_status_write(sr | MIPS3_SR_KX);
167 1.58.2.2 nathanw
168 1.58.2.2 nathanw addrlo = addr & 0xffffffff;
169 1.58.2.2 nathanw addrhi = addr >> 32;
170 1.58.2.2 nathanw __asm__ __volatile__ (" \n\
171 1.58.2.2 nathanw .set push \n\
172 1.58.2.2 nathanw .set mips3 \n\
173 1.58.2.2 nathanw .set noreorder \n\
174 1.58.2.2 nathanw .set noat \n\
175 1.58.2.2 nathanw dsll32 $3, %1, 0 \n\
176 1.58.2.2 nathanw dsll32 $1, %2, 0 \n\
177 1.58.2.2 nathanw dsrl32 $3, $3, 0 \n\
178 1.58.2.2 nathanw or $1, $1, $3 \n\
179 1.58.2.2 nathanw sw %0, 0($1) \n\
180 1.58.2.2 nathanw .set pop \n\
181 1.58.2.2 nathanw " : : "r"(val), "r"(addrlo), "r"(addrhi) : "$1", "$3" );
182 1.58.2.2 nathanw
183 1.58.2.2 nathanw mips_cp0_status_write(sr);
184 1.58.2.2 nathanw }
185 1.58.2.2 nathanw
186 1.58.2.2 nathanw /*
187 1.58.2.2 nathanw * A vector with an entry for each mips-ISA-level dependent
188 1.58.2.2 nathanw * locore function, and macros which jump through it.
189 1.58.2.2 nathanw *
190 1.58.2.2 nathanw * XXX the macro names are chosen to be compatible with the old
191 1.58.2.2 nathanw * XXX Sprite coding-convention names used in 4.4bsd/pmax.
192 1.58.2.2 nathanw */
193 1.58.2.2 nathanw typedef struct {
194 1.58.2.2 nathanw void (*setTLBpid)(int pid);
195 1.58.2.2 nathanw void (*TBIAP)(int);
196 1.58.2.2 nathanw void (*TBIS)(vaddr_t);
197 1.58.2.2 nathanw int (*tlbUpdate)(u_int highreg, u_int lowreg);
198 1.58.2.2 nathanw void (*wbflush)(void);
199 1.58.2.2 nathanw } mips_locore_jumpvec_t;
200 1.58.2.2 nathanw
201 1.58.2.2 nathanw /* Override writebuffer-drain method. */
202 1.58.2.2 nathanw void mips_set_wbflush(void (*)(void));
203 1.58.2.2 nathanw
204 1.58.2.2 nathanw /* stacktrace() -- print a stack backtrace to the console */
205 1.58.2.2 nathanw void stacktrace(void);
206 1.58.2.2 nathanw /* logstacktrace() -- log a stack traceback to msgbuf */
207 1.58.2.2 nathanw void logstacktrace(void);
208 1.58.2.2 nathanw
209 1.58.2.2 nathanw /*
210 1.58.2.2 nathanw * The "active" locore-fuction vector, and
211 1.58.2.2 nathanw */
212 1.58.2.2 nathanw extern mips_locore_jumpvec_t mips_locore_jumpvec;
213 1.58.2.2 nathanw extern long *mips_locoresw[];
214 1.58.2.2 nathanw
215 1.58.2.2 nathanw #if defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64)
216 1.58.2.2 nathanw #define MachSetPID mips1_SetPID
217 1.58.2.2 nathanw #define MIPS_TBIAP() mips1_TBIAP(mips_num_tlb_entries)
218 1.58.2.2 nathanw #define MIPS_TBIS mips1_TBIS
219 1.58.2.2 nathanw #define MachTLBUpdate mips1_TLBUpdate
220 1.58.2.2 nathanw #define wbflush() mips1_wbflush()
221 1.58.2.2 nathanw #define proc_trampoline mips1_proc_trampoline
222 1.58.2.2 nathanw #elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && !defined(MIPS3_5900)
223 1.58.2.2 nathanw #define MachSetPID mips3_SetPID
224 1.58.2.2 nathanw #define MIPS_TBIAP() mips3_TBIAP(mips_num_tlb_entries)
225 1.58.2.2 nathanw #define MIPS_TBIS mips3_TBIS
226 1.58.2.2 nathanw #define MachTLBUpdate mips3_TLBUpdate
227 1.58.2.2 nathanw #define proc_trampoline mips3_proc_trampoline
228 1.58.2.2 nathanw #define wbflush() mips3_wbflush()
229 1.58.2.2 nathanw #elif !defined(MIPS1) && !defined(MIPS3) && defined(MIPS32) && !defined(MIPS64)
230 1.58.2.2 nathanw #define MachSetPID mips32_SetPID
231 1.58.2.2 nathanw #define MIPS_TBIAP() mips32_TBIAP(mips_num_tlb_entries)
232 1.58.2.2 nathanw #define MIPS_TBIS mips32_TBIS
233 1.58.2.2 nathanw #define MachTLBUpdate mips32_TLBUpdate
234 1.58.2.2 nathanw #define proc_trampoline mips32_proc_trampoline
235 1.58.2.2 nathanw #define wbflush() mips32_wbflush()
236 1.58.2.2 nathanw #elif !defined(MIPS1) && !defined(MIPS3) && !defined(MIPS32) && defined(MIPS64)
237 1.58.2.2 nathanw /* all common with mips3 */
238 1.58.2.2 nathanw #define MachSetPID mips64_SetPID
239 1.58.2.2 nathanw #define MIPS_TBIAP() mips64_TBIAP(mips_num_tlb_entries)
240 1.58.2.2 nathanw #define MIPS_TBIS mips64_TBIS
241 1.58.2.2 nathanw #define MachTLBUpdate mips64_TLBUpdate
242 1.58.2.2 nathanw #define proc_trampoline mips64_proc_trampoline
243 1.58.2.2 nathanw #define wbflush() mips64_wbflush()
244 1.58.2.2 nathanw #elif !defined(MIPS1) && defined(MIPS3) && !defined(MIPS32) && !defined(MIPS64) && defined(MIPS3_5900)
245 1.58.2.2 nathanw #define MachSetPID mips5900_SetPID
246 1.58.2.2 nathanw #define MIPS_TBIAP() mips5900_TBIAP(mips_num_tlb_entries)
247 1.58.2.2 nathanw #define MIPS_TBIS mips5900_TBIS
248 1.58.2.2 nathanw #define MachTLBUpdate mips5900_TLBUpdate
249 1.58.2.2 nathanw #define proc_trampoline mips5900_proc_trampoline
250 1.58.2.2 nathanw #define wbflush() mips5900_wbflush()
251 1.58.2.2 nathanw #else
252 1.58.2.2 nathanw #define MachSetPID (*(mips_locore_jumpvec.setTLBpid))
253 1.58.2.2 nathanw #define MIPS_TBIAP() (*(mips_locore_jumpvec.TBIAP))(mips_num_tlb_entries)
254 1.58.2.2 nathanw #define MIPS_TBIS (*(mips_locore_jumpvec.TBIS))
255 1.58.2.2 nathanw #define MachTLBUpdate (*(mips_locore_jumpvec.tlbUpdate))
256 1.58.2.2 nathanw #define wbflush() (*(mips_locore_jumpvec.wbflush))()
257 1.58.2.2 nathanw #define proc_trampoline (mips_locoresw[1])
258 1.58.2.2 nathanw #endif
259 1.58.2.2 nathanw
260 1.58.2.2 nathanw #define CPU_IDLE (mips_locoresw[2])
261 1.58.2.2 nathanw
262 1.58.2.2 nathanw /* cpu_switch_resume is called inside locore.S */
263 1.58.2.2 nathanw
264 1.58.2.2 nathanw /*
265 1.58.2.2 nathanw * CPU identification, from PRID register.
266 1.58.2.2 nathanw */
267 1.58.2.2 nathanw typedef int mips_prid_t;
268 1.58.2.2 nathanw
269 1.58.2.2 nathanw #define MIPS_PRID_REV(x) (((x) >> 0) & 0x00ff)
270 1.58.2.2 nathanw #define MIPS_PRID_IMPL(x) (((x) >> 8) & 0x00ff)
271 1.58.2.2 nathanw
272 1.58.2.2 nathanw /* pre-MIPS32/64 */
273 1.58.2.2 nathanw #define MIPS_PRID_RSVD(x) (((x) >> 16) & 0xffff)
274 1.58.2.2 nathanw #define MIPS_PRID_REV_MIN(x) ((MIPS_PRID_REV(x) >> 0) & 0x0f)
275 1.58.2.2 nathanw #define MIPS_PRID_REV_MAJ(x) ((MIPS_PRID_REV(x) >> 4) & 0x0f)
276 1.58.2.2 nathanw
277 1.58.2.2 nathanw /* MIPS32/64 */
278 1.58.2.2 nathanw #define MIPS_PRID_CID(x) (((x) >> 16) & 0x00ff) /* Company ID */
279 1.58.2.2 nathanw #define MIPS_PRID_CID_PREHISTORIC 0x00 /* Not MIPS32/64 */
280 1.58.2.2 nathanw #define MIPS_PRID_CID_MTI 0x01 /* MIPS Technologies, Inc. */
281 1.58.2.2 nathanw #define MIPS_PRID_CID_BROADCOM 0x02 /* Broadcom */
282 1.58.2.2 nathanw #define MIPS_PRID_CID_ALCHEMY 0x03 /* Alchemy Semiconductor */
283 1.58.2.2 nathanw #define MIPS_PRID_CID_SIBYTE 0x04 /* SiByte */
284 1.58.2.2 nathanw #define MIPS_PRID_CID_SANDCRAFT 0x05 /* SandCraft */
285 1.58.2.2 nathanw #define MIPS_PRID_COPTS(x) (((x) >> 24) & 0x00ff) /* Company Options */
286 1.58.2.2 nathanw
287 1.58.2.2 nathanw #ifdef _KERNEL
288 1.58.2.2 nathanw /*
289 1.58.2.2 nathanw * Global variables used to communicate CPU type, and parameters
290 1.58.2.2 nathanw * such as cache size, from locore to higher-level code (e.g., pmap).
291 1.58.2.2 nathanw */
292 1.58.2.2 nathanw
293 1.58.2.2 nathanw extern mips_prid_t cpu_id;
294 1.58.2.2 nathanw extern mips_prid_t fpu_id;
295 1.58.2.2 nathanw extern int mips_num_tlb_entries;
296 1.58.2.2 nathanw
297 1.58.2.2 nathanw void mips_pagecopy(caddr_t dst, caddr_t src);
298 1.58.2.2 nathanw void mips_pagezero(caddr_t dst);
299 1.58.2.2 nathanw
300 1.58.2.2 nathanw #ifdef __HAVE_MIPS_MACHDEP_CACHE_CONFIG
301 1.58.2.2 nathanw void mips_machdep_cache_config(void);
302 1.58.2.2 nathanw #endif
303 1.58.2.2 nathanw
304 1.58.2.2 nathanw /*
305 1.58.2.2 nathanw * trapframe argument passed to trap()
306 1.58.2.2 nathanw */
307 1.58.2.2 nathanw struct trapframe {
308 1.58.2.2 nathanw mips_reg_t tf_regs[17];
309 1.58.2.2 nathanw mips_reg_t tf_ra;
310 1.58.2.2 nathanw mips_reg_t tf_sr;
311 1.58.2.2 nathanw mips_reg_t tf_mullo;
312 1.58.2.2 nathanw mips_reg_t tf_mulhi;
313 1.58.2.2 nathanw mips_reg_t tf_epc; /* may be changed by trap() call */
314 1.58.2.2 nathanw u_int32_t tf_ppl; /* previous priority level */
315 1.58.2.2 nathanw int32_t tf_pad; /* for 8 byte aligned */
316 1.58.2.2 nathanw };
317 1.58.2.2 nathanw
318 1.58.2.2 nathanw /*
319 1.58.2.2 nathanw * Stack frame for kernel traps. four args passed in registers.
320 1.58.2.2 nathanw * A trapframe is pointed to by the 5th arg, and a dummy sixth argument
321 1.58.2.2 nathanw * is used to avoid alignment problems
322 1.58.2.2 nathanw */
323 1.58.2.2 nathanw
324 1.58.2.2 nathanw struct kernframe {
325 1.58.2.2 nathanw register_t cf_args[4 + 1];
326 1.58.2.2 nathanw register_t cf_pad; /* (for 8 word alignment) */
327 1.58.2.2 nathanw register_t cf_sp;
328 1.58.2.2 nathanw register_t cf_ra;
329 1.58.2.2 nathanw struct trapframe cf_frame;
330 1.58.2.2 nathanw };
331 1.58.2.2 nathanw #endif
332 1.58.2.2 nathanw #endif /* _MIPS_LOCORE_H */
333