1 /* $NetBSD: cpu.h,v 1.43 2000/07/13 07:37:11 jeffs Exp $ */ 2 3 /*- 4 * Copyright (c) 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Ralph Campbell and Rick Macklem. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)cpu.h 8.4 (Berkeley) 1/4/94 39 */ 40 41 #ifndef _CPU_H_ 42 #define _CPU_H_ 43 44 /* 45 * Exported definitions unique to NetBSD/mips cpu support. 46 */ 47 48 /* 49 * CTL_MACHDEP definitions. 50 */ 51 #define CPU_CONSDEV 1 /* dev_t: console terminal device */ 52 #define CPU_BOOTED_KERNEL 2 /* string: booted kernel name */ 53 #define CPU_ROOT_DEVICE 3 /* string: root device name */ 54 55 /* 56 * Platform can override, but note this breaks userland compatability 57 * with other mips platforms. 58 */ 59 #ifndef CPU_MAXID 60 #define CPU_MAXID 4 /* number of valid machdep ids */ 61 62 #define CTL_MACHDEP_NAMES { \ 63 { 0, 0 }, \ 64 { "console_device", CTLTYPE_STRUCT }, \ 65 { "booted_kernel", CTLTYPE_STRING }, \ 66 { "root_device", CTLTYPE_STRING }, \ 67 } 68 #endif 69 70 #ifdef _KERNEL 71 #ifndef _LOCORE 72 73 /* 74 * Macros to find the CPU architecture we're on at run-time, 75 * or if possible, at compile-time. 76 */ 77 78 #if (MIPS1 + MIPS3) == 1 79 #ifdef MIPS1 80 # define CPUISMIPS3 0 81 #endif /* mips1 */ 82 83 #ifdef MIPS3 84 # define CPUISMIPS3 1 85 #endif /* mips1 */ 86 87 #else /* run-time test */ 88 extern int cpu_arch; 89 #define CPUISMIPS3 (cpu_arch >= 3) 90 #endif /* run-time test */ 91 92 /* 93 * definitions of cpu-dependent requirements 94 * referenced in generic code 95 */ 96 #define cpu_wait(p) /* nothing */ 97 #define cpu_swapout(p) panic("cpu_swapout: can't get here"); 98 99 void cpu_intr __P((u_int32_t, u_int32_t, u_int32_t, u_int32_t)); 100 101 /* 102 * Arguments to hardclock and gatherstats encapsulate the previous 103 * machine state in an opaque clockframe. 104 */ 105 struct clockframe { 106 int pc; /* program counter at time of interrupt */ 107 int sr; /* status register at time of interrupt */ 108 }; 109 110 /* 111 * A port must provde CLKF_USERMODE() and CLKF_BASEPRI() for use 112 * in machine-independent code. These differ on r4000 and r3000 systems; 113 * provide them in the port-dependent file that includes this one, using 114 * the macros below. 115 */ 116 117 /* mips1 versions */ 118 #define MIPS1_CLKF_USERMODE(framep) ((framep)->sr & MIPS_SR_KU_PREV) 119 #define MIPS1_CLKF_BASEPRI(framep) \ 120 ((~(framep)->sr & (MIPS_INT_MASK | MIPS_SR_INT_ENA_PREV)) == 0) 121 122 /* mips3 versions */ 123 #define MIPS3_CLKF_USERMODE(framep) ((framep)->sr & MIPS_SR_KSU_USER) 124 #define MIPS3_CLKF_BASEPRI(framep) \ 125 ((~(framep)->sr & (MIPS_INT_MASK | MIPS_SR_INT_IE)) == 0) 126 127 #define CLKF_PC(framep) ((framep)->pc) 128 #define CLKF_INTR(framep) (0) 129 130 #if defined(MIPS3) && !defined(MIPS1) 131 #define CLKF_USERMODE(framep) MIPS3_CLKF_USERMODE(framep) 132 #define CLKF_BASEPRI(framep) MIPS3_CLKF_BASEPRI(framep) 133 #endif 134 135 #if !defined(MIPS3) && defined(MIPS1) 136 #define CLKF_USERMODE(framep) MIPS1_CLKF_USERMODE(framep) 137 #define CLKF_BASEPRI(framep) MIPS1_CLKF_BASEPRI(framep) 138 #endif 139 140 141 #if defined(MIPS3) && defined(MIPS1) 142 #define CLKF_USERMODE(framep) \ 143 ((CPUISMIPS3) ? MIPS3_CLKF_USERMODE(framep): MIPS1_CLKF_USERMODE(framep)) 144 #define CLKF_BASEPRI(framep) \ 145 ((CPUISMIPS3) ? MIPS3_CLKF_BASEPRI(framep): MIPS1_CLKF_BASEPRI(framep)) 146 #endif 147 148 149 /* 150 * Preempt the current process if in interrupt from user mode, 151 * or after the current trap/syscall if in system mode. 152 */ 153 #define need_resched() { want_resched = 1; aston(); } 154 155 /* 156 * Give a profiling tick to the current process when the user profiling 157 * buffer pages are invalid. On the MIPS, request an ast to send us 158 * through trap, marking the proc as needing a profiling tick. 159 */ 160 #define need_proftick(p) { (p)->p_flag |= P_OWEUPC; aston(); } 161 162 /* 163 * Notify the current process (p) that it has a signal pending, 164 * process as soon as possible. 165 */ 166 #define signotify(p) aston() 167 168 #define aston() (astpending = 1) 169 170 extern int astpending; /* need to trap before returning to user mode */ 171 extern int want_resched; /* resched() was called */ 172 #ifdef MIPS3 173 extern u_int mips_L2CacheSize; 174 extern int mips_L2CacheIsSnooping; /* L2 cache snoops uncached writes ? */ 175 extern int mips_L2CacheMixed; 176 #endif /* MIPS3 */ 177 178 /* 179 * Misc prototypes and variable declarations. 180 */ 181 struct proc; 182 struct user; 183 184 extern struct proc *fpcurproc; 185 186 /* trap.c */ 187 void child_return __P((void *)); 188 void netintr __P((void)); 189 int kdbpeek __P((vaddr_t)); 190 191 /* mips_machdep.c */ 192 void dumpsys __P((void)); 193 int savectx __P((struct user *)); 194 void mips_init_msgbuf __P((void)); 195 void savefpregs __P((struct proc *)); 196 void loadfpregs __P((struct proc *)); 197 198 /* locore.S */ 199 int badaddr __P((void *, size_t)); 200 201 /* mips_machdep.c */ 202 void cpu_identify __P((void)); 203 void mips_vector_init __P((void)); 204 205 #endif /* ! _LOCORE */ 206 #endif /* _KERNEL */ 207 208 #endif /* _CPU_H_ */ 209