1 /* $NetBSD: cpu.h,v 1.13 2001/06/24 05:34:07 msaitoh Exp $ */ 2 3 /*- 4 * Copyright (c) 1990 The Regents of the University of California. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * William Jolitz. 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 5.4 (Berkeley) 5/9/91 39 */ 40 41 /* 42 * SH3 Version 43 * 44 * T.Horiuchi Brains Corp. 5/22/98 45 */ 46 47 #ifndef _SH3_CPU_H_ 48 #define _SH3_CPU_H_ 49 50 #if defined(_KERNEL_OPT) 51 #include "opt_lockdebug.h" 52 #endif 53 54 /* 55 * Definitions unique to sh3 cpu support. 56 */ 57 #include <machine/psl.h> 58 #include <machine/frame.h> 59 #include <machine/segments.h> 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 #endif 75 76 /* 77 * definitions of cpu-dependent requirements 78 * referenced in generic code 79 */ 80 #define cpu_swapin(p) /* nothing */ 81 #define cpu_wait(p) /* nothing */ 82 #define cpu_number() 0 83 84 /* 85 * Arguments to hardclock, softclock and statclock 86 * encapsulate the previous machine state in an opaque 87 * clockframe; for now, use generic intrframe. 88 * 89 * XXX intrframe has a lot of gunk we don't need. 90 */ 91 #define clockframe intrframe 92 93 #define CLKF_USERMODE(frame) (!KERNELMODE((frame)->if_r15, (frame)->if_ssr)) 94 #if 0 95 #define CLKF_BASEPRI(frame) ((frame)->if_pri == 0) 96 #else 97 /* XXX we should fix this */ 98 #define CLKF_BASEPRI(frame) (0) 99 #endif 100 #define CLKF_PC(frame) ((frame)->if_spc) 101 #define CLKF_INTR(frame) (0) /* XXX should have an interrupt stack */ 102 103 /* 104 * Preempt the current process if in interrupt from user mode, 105 * or after the current trap/syscall if in system mode. 106 */ 107 int want_resched; /* resched() was called */ 108 #define need_resched(ci) (want_resched = 1, setsoftast()) 109 110 /* 111 * Give a profiling tick to the current process when the user profiling 112 * buffer pages are invalid. On the i386, request an ast to send us 113 * through trap(), marking the proc as needing a profiling tick. 114 */ 115 #define need_proftick(p) ((p)->p_flag |= P_OWEUPC, setsoftast()) 116 117 /* 118 * Notify the current process (p) that it has a signal pending, 119 * process as soon as possible. 120 */ 121 #define signotify(p) setsoftast() 122 123 /* 124 * We need a machine-independent name for this. 125 */ 126 #define DELAY(x) delay(x) 127 void delay __P((int)); 128 129 /* 130 * Logical address space of SH3 CPU. 131 */ 132 #define SH3_P0SEG_BASE 0x00000000 /* TLB mapped, also U0SEG */ 133 #define SH3_P0SEG_END 0x7fffffff 134 #define SH3_P1SEG_BASE 0x80000000 /* pa == va */ 135 #define SH3_P1SEG_END 0x9fffffff 136 #define SH3_P2SEG_BASE 0xa0000000 /* pa == va, non-cacheable */ 137 #define SH3_P2SEG_END 0xbfffffff 138 #define SH3_P3SEG_BASE 0xc0000000 /* TLB mapped, supervisor mode */ 139 #define SH3_P3SEG_END 0xdfffffff 140 #define SH3_P4SEG_BASE 0xe0000000 /* peripheral space */ 141 #define SH3_P4SEG_END 0xffffffff 142 143 #define SH3_PHYS_MASK 0x1fffffff 144 #define SH3_P1234SEG_SIZE 0x20000000 145 146 #define SH3_P1SEG_TO_PHYS(x) ((unsigned)(x) & SH3_PHYS_MASK) 147 #define SH3_P2SEG_TO_PHYS(x) ((unsigned)(x) & SH3_PHYS_MASK) 148 #define SH3_PHYS_TO_P1SEG(x) ((unsigned)(x) | SH3_P1SEG_BASE) 149 #define SH3_PHYS_TO_P2SEG(x) ((unsigned)(x) | SH3_P2SEG_BASE) 150 #define SH3_P1SEG_TO_P2SEG(x) ((unsigned)(x) | SH3_P1234SEG_SIZE) 151 152 /* 153 * pull in #defines for kinds of processors 154 */ 155 #include <machine/cputypes.h> 156 157 158 #ifdef _KERNEL 159 extern int cpu; 160 extern int cpu_class; 161 extern struct cpu_nocpuid_nameclass sh3_nocpuid_cpus[]; 162 extern struct cpu_cpuid_nameclass sh3_cpuid_cpus[]; 163 164 /* autoconf.c */ 165 void configure __P((void)); 166 167 /* sh3_machdep.c */ 168 void sh3_startup __P((void)); 169 170 /* machdep.c */ 171 void delay __P((int)); 172 void dumpconf __P((void)); 173 void cpu_reset __P((void)); 174 175 /* locore.s */ 176 struct region_descriptor; 177 void lgdt __P((struct region_descriptor *)); 178 void fillw __P((short, void *, size_t)); 179 void 180 bcopyb __P((caddr_t from, caddr_t to, size_t len)); 181 void 182 bcopyw __P((caddr_t from, caddr_t to, size_t len)); 183 void 184 setPageDirReg __P((int pgdir)); 185 186 187 struct pcb; 188 void savectx __P((struct pcb *)); 189 void switch_exit __P((struct proc *)); 190 void proc_trampoline __P((void)); 191 192 /* clock.c */ 193 void startrtclock __P((void)); 194 195 /* npx.c */ 196 void npxdrop __P((void)); 197 void npxsave __P((void)); 198 199 /* vm_machdep.c */ 200 int kvtop __P((caddr_t)); 201 202 #ifdef MATH_EMULATE 203 /* math_emulate.c */ 204 int math_emulate __P((struct trapframe *)); 205 #endif 206 207 #endif /* _KERNEL */ 208 209 /* 210 * CTL_MACHDEP definitions. 211 */ 212 #define CPU_CONSDEV 1 /* dev_t: console terminal device */ 213 #define CPU_NKPDE 2 /* int: number of kernel PDEs */ 214 #define CPU_BOOTED_KERNEL 3 /* string: booted kernel name */ 215 #define CPU_SETPRIVPROC 4 /* set current proc to piviledged proc 216 */ 217 #define CPU_DEBUGMODE 5 /* set debug mode */ 218 #define CPU_LOADANDRESET 6 /* load kernel image and reset */ 219 #define CPU_MAXID 7 /* number of valid machdep ids */ 220 221 #define CTL_MACHDEP_NAMES { \ 222 { 0, 0 }, \ 223 { "console_device", CTLTYPE_STRUCT }, \ 224 { "nkpde", CTLTYPE_INT }, \ 225 { "booted_kernel", CTLTYPE_STRING }, \ 226 { "set_priv_proc", CTLTYPE_INT }, \ 227 { "debug_mode", CTLTYPE_INT }, \ 228 { "load_and_reset", CTLTYPE_INT }, \ 229 } 230 231 #endif /* !_SH3_CPU_H_ */ 232