1 /* $NetBSD: cpu.h,v 1.52 2000/06/11 07:50:13 ragge Exp $ */ 2 3 /* 4 * Copyright (c) 1994 Ludd, University of Lule}, Sweden 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed at Ludd, University of Lule} 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifndef _VAX_CPU_H_ 34 #define _VAX_CPU_H_ 35 36 #if defined(_KERNEL) && !defined(_LKM) 37 #include "opt_multiprocessor.h" 38 #include "opt_lockdebug.h" 39 #endif 40 41 #ifdef _KERNEL 42 43 #include <sys/cdefs.h> 44 #include <sys/device.h> 45 #include <sys/lock.h> 46 #include <sys/sched.h> 47 48 #include <machine/mtpr.h> 49 #include <machine/pcb.h> 50 #include <machine/uvax.h> 51 #include <machine/psl.h> 52 53 #define enablertclock() 54 #define cpu_wait(p) 55 #define cpu_swapout(p) 56 57 /* 58 * All cpu-dependent info is kept in this struct. Pointer to the 59 * struct for the current cpu is set up in locore.c. 60 */ 61 struct cpu_info; 62 63 struct cpu_dep { 64 void (*cpu_steal_pages)(void); /* pmap init before mm is on */ 65 int (*cpu_mchk)(caddr_t); /* Machine check handling */ 66 void (*cpu_memerr)(void); /* Memory subsystem errors */ 67 /* Autoconfiguration */ 68 void (*cpu_conf)(void); 69 int (*cpu_clkread)(time_t); /* Read cpu clock time */ 70 void (*cpu_clkwrite)(void); /* Write system time to cpu */ 71 short cpu_vups; /* speed of cpu */ 72 short cpu_scbsz; /* (estimated) size of system control block */ 73 void (*cpu_halt)(void); /* Cpu dependent halt call */ 74 void (*cpu_reboot)(int); /* Cpu dependent reboot call */ 75 void (*cpu_clrf)(void); /* Clear cold/warm start flags */ 76 void (*cpu_subconf)(struct device *);/*config cpu dep. devs */ 77 int cpu_flags; 78 #if defined(MULTIPROCESSOR) 79 /* Kick off slave cpu */ 80 void (*cpu_startslave)(struct device *, struct cpu_info *); 81 #endif 82 }; 83 84 #define CPU_RAISEIPL 1 /* Must raise IPL until intr is handled */ 85 86 extern struct cpu_dep *dep_call; /* Holds pointer to current CPU struct. */ 87 88 struct clockframe { 89 int pc; 90 int ps; 91 }; 92 93 struct cpu_info { 94 /* 95 * Public members. 96 */ 97 struct schedstate_percpu ci_schedstate; /* scheduler state */ 98 #if defined(DIAGNOSTIC) || defined(LOCKDEBUG) 99 u_long ci_spin_locks; /* # of spin locks held */ 100 u_long ci_simple_locks; /* # of simple locks held */ 101 #endif 102 103 struct proc *ci_curproc; /* current owner of the processor */ 104 105 /* 106 * Private members. 107 */ 108 int ci_want_resched; /* Should change process */ 109 struct device *ci_dev; /* device struct for this cpu */ 110 long ci_exit; /* Page to use while exiting */ 111 #if defined(MULTIPROCESSOR) 112 struct pcb *ci_pcb; /* Idle PCB for this CPU */ 113 vaddr_t ci_istack; /* Interrupt stack location */ 114 int ci_flags; /* See below */ 115 #endif 116 }; 117 #define CI_MASTERCPU 1 /* Set if master CPU */ 118 #define CI_RUNNING 2 /* Set when a slave CPU is running */ 119 120 #define curcpu() ((struct cpu_info *)mfpr(PR_SSP)) 121 #define curproc (curcpu()->ci_curproc) 122 #define cpu_number() (curcpu()->ci_dev->dv_unit) 123 #define need_resched() {curcpu()->ci_want_resched++; mtpr(AST_OK,PR_ASTLVL); } 124 #if defined(MULTIPROCESSOR) 125 #define CPU_IS_PRIMARY(ci) (ci->ci_flags & CI_MASTERCPU) 126 127 extern char tramp; 128 #endif 129 130 extern int mastercpu; 131 132 /* 133 * Notify the current process (p) that it has a signal pending, 134 * process as soon as possible. 135 */ 136 137 #define signotify(p) mtpr(AST_OK,PR_ASTLVL); 138 139 140 /* 141 * Give a profiling tick to the current process when the user profiling 142 * buffer pages are invalid. On the hp300, request an ast to send us 143 * through trap, marking the proc as needing a profiling tick. 144 */ 145 #define need_proftick(p) {(p)->p_flag |= P_OWEUPC; mtpr(AST_OK,PR_ASTLVL); } 146 147 /* 148 * This defines the I/O device register space size in pages. 149 */ 150 #define IOSPSZ ((64*1024) / VAX_NBPG) /* 64k == 128 pages */ 151 152 struct device; 153 154 /* Some low-level prototypes */ 155 #if defined(MULTIPROCESSOR) 156 struct cpu_info *cpu_slavesetup(struct device *); 157 void cpu_boot_secondary_processors(void); 158 #endif 159 int badaddr(caddr_t, int); 160 void cpu_swapin(struct proc *); 161 void dumpconf(void); 162 void dumpsys(void); 163 void swapconf(void); 164 void disk_printtype(int, int); 165 void disk_reallymapin(struct buf *, struct pte *, int, int); 166 vaddr_t vax_map_physmem(paddr_t, int); 167 void vax_unmap_physmem(vaddr_t, int); 168 void ioaccess(vaddr_t, paddr_t, int); 169 void iounaccess(vaddr_t, int); 170 void findcpu(void); 171 void child_return(void *); 172 #ifdef DDB 173 int kdbrint(int); 174 #endif 175 #endif /* _KERNEL */ 176 #ifdef _STANDALONE 177 void findcpu(void); 178 #endif 179 #endif /* _VAX_CPU_H_ */ 180