1 /* $OpenBSD: cpufunc.h,v 1.27 2005/04/07 00:19:28 mickey Exp $ */ 2 3 /* 4 * Copyright (c) 1998-2004 Michael Shalayeff 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 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 25 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26 * THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 /* 29 * (c) Copyright 1988 HEWLETT-PACKARD COMPANY 30 * 31 * To anyone who acknowledges that this file is provided "AS IS" 32 * without any express or implied warranty: 33 * permission to use, copy, modify, and distribute this file 34 * for any purpose is hereby granted without fee, provided that 35 * the above copyright notice and this notice appears in all 36 * copies, and that the name of Hewlett-Packard Company not be 37 * used in advertising or publicity pertaining to distribution 38 * of the software without specific, written prior permission. 39 * Hewlett-Packard Company makes no representations about the 40 * suitability of this software for any purpose. 41 */ 42 /* 43 * Copyright (c) 1990,1994 The University of Utah and 44 * the Computer Systems Laboratory (CSL). All rights reserved. 45 * 46 * THE UNIVERSITY OF UTAH AND CSL PROVIDE THIS SOFTWARE IN ITS "AS IS" 47 * CONDITION, AND DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES 48 * WHATSOEVER RESULTING FROM ITS USE. 49 * 50 * CSL requests users of this software to return to csl-dist@cs.utah.edu any 51 * improvements that they make and grant CSL redistribution rights. 52 * 53 * Utah $Hdr: c_support.s 1.8 94/12/14$ 54 * Author: Bob Wheeler, University of Utah CSL 55 */ 56 57 #ifndef _MACHINE_CPUFUNC_H_ 58 #define _MACHINE_CPUFUNC_H_ 59 60 #include <machine/psl.h> 61 #include <machine/pte.h> 62 63 #define tlbbtop(b) ((b) >> (PGSHIFT - 5)) 64 #define tlbptob(p) ((p) << (PGSHIFT - 5)) 65 66 #define hptbtop(b) ((b) >> 17) 67 68 /* Get space register for an address */ 69 static __inline register_t ldsid(vaddr_t p) { 70 register_t ret; 71 __asm __volatile("ldsid (%1),%0" : "=r" (ret) : "r" (p)); 72 return ret; 73 } 74 75 #define mtctl(v,r) __asm __volatile("mtctl %0,%1":: "r" (v), "i" (r)) 76 #define mfctl(r,v) __asm __volatile("mfctl %1,%0": "=r" (v): "i" (r)) 77 78 #define mfcpu(r,v) /* XXX for the lack of the mnemonics */ \ 79 __asm __volatile(".word %1\n\t" \ 80 "copy %%r22, %0" \ 81 : "=r" (v) : "i" ((0x14001400 | ((r) << 21) | (22))) \ 82 : "r22") 83 84 #define mtsp(v,r) __asm __volatile("mtsp %0,%1":: "r" (v), "i" (r)) 85 #define mfsp(r,v) __asm __volatile("mfsp %1,%0": "=r" (v): "i" (r)) 86 87 #define ssm(v,r) __asm __volatile("ssm %1,%0": "=r" (r): "i" (v)) 88 #define rsm(v,r) __asm __volatile("rsm %1,%0": "=r" (r): "i" (v)) 89 90 /* Move to system mask. Old value of system mask is returned. */ 91 static __inline register_t 92 mtsm(register_t mask) { 93 register_t ret; 94 __asm __volatile("ssm 0,%0\n\t" 95 "mtsm %1": "=&r" (ret) : "r" (mask)); 96 return ret; 97 } 98 99 #define fdce(sp,off) __asm __volatile("fdce 0(%0,%1)":: "i" (sp), "r" (off)) 100 #define fice(sp,off) __asm __volatile("fice 0(%0,%1)":: "i" (sp), "r" (off)) 101 #define sync_caches() __asm __volatile(\ 102 "sync\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop":::"memory") 103 104 static __inline void 105 iitlba(u_int pg, pa_space_t sp, vaddr_t va) 106 { 107 mtsp(sp, 1); 108 __asm volatile("iitlba %0,(%%sr1, %1)":: "r" (pg), "r" (va)); 109 } 110 111 static __inline void 112 idtlba(u_int pg, pa_space_t sp, vaddr_t va) 113 { 114 mtsp(sp, 1); 115 __asm volatile("idtlba %0,(%%sr1, %1)":: "r" (pg), "r" (va)); 116 } 117 118 static __inline void 119 iitlbp(u_int prot, pa_space_t sp, vaddr_t va) 120 { 121 mtsp(sp, 1); 122 __asm volatile("iitlbp %0,(%%sr1, %1)":: "r" (prot), "r" (va)); 123 } 124 125 static __inline void 126 idtlbp(u_int prot, pa_space_t sp, vaddr_t va) 127 { 128 mtsp(sp, 1); 129 __asm volatile("idtlbp %0,(%%sr1, %1)":: "r" (prot), "r" (va)); 130 } 131 132 static __inline void 133 pitlb(pa_space_t sp, vaddr_t va) 134 { 135 mtsp(sp, 1); 136 __asm volatile("pitlb %%r0(%%sr1, %0)":: "r" (va)); 137 } 138 139 static __inline void 140 pdtlb(pa_space_t sp, vaddr_t va) 141 { 142 mtsp(sp, 1); 143 __asm volatile("pdtlb %%r0(%%sr1, %0)":: "r" (va)); 144 } 145 146 static __inline void 147 pitlbe(pa_space_t sp, vaddr_t va) 148 { 149 mtsp(sp, 1); 150 __asm volatile("pitlbe %%r0(%%sr1, %0)":: "r" (va)); 151 } 152 153 static __inline void 154 pdtlbe(pa_space_t sp, vaddr_t va) 155 { 156 mtsp(sp, 1); 157 __asm volatile("pdtlbe %%r0(%%sr1, %0)":: "r" (va)); 158 } 159 160 #ifdef USELEDS 161 #define PALED_NETSND 0x01 162 #define PALED_NETRCV 0x02 163 #define PALED_DISK 0x04 164 #define PALED_HEARTBEAT 0x08 165 #define PALED_LOADMASK 0xf0 166 167 #define PALED_DATA 0x01 168 #define PALED_STROBE 0x02 169 170 extern volatile u_int8_t *machine_ledaddr; 171 extern int machine_ledword, machine_leds; 172 173 static __inline void 174 ledctl(int on, int off, int toggle) 175 { 176 if (machine_ledaddr) { 177 int r; 178 179 if (on) 180 machine_leds |= on; 181 if (off) 182 machine_leds &= ~off; 183 if (toggle) 184 machine_leds ^= toggle; 185 186 r = ~machine_leds; /* it seems they should be reversed */ 187 188 if (machine_ledword) 189 *machine_ledaddr = r; 190 else { 191 register int b; 192 for (b = 0x80; b; b >>= 1) { 193 *machine_ledaddr = (r & b)? PALED_DATA : 0; 194 DELAY(1); 195 *machine_ledaddr = ((r & b)? PALED_DATA : 0) | 196 PALED_STROBE; 197 } 198 } 199 } 200 } 201 #endif 202 203 #ifdef _KERNEL 204 extern int (*cpu_hpt_init)(vaddr_t hpt, vsize_t hptsize); 205 206 void fpu_save(vaddr_t va); 207 void fpu_exit(void); 208 void ficache(pa_space_t sp, vaddr_t va, vsize_t size); 209 void fdcache(pa_space_t sp, vaddr_t va, vsize_t size); 210 void pdcache(pa_space_t sp, vaddr_t va, vsize_t size); 211 void ficacheall(void); 212 void fdcacheall(void); 213 void ptlball(void); 214 int btlb_insert(pa_space_t space, vaddr_t va, paddr_t pa, vsize_t *lenp, u_int prot); 215 hppa_hpa_t cpu_gethpa(int n); 216 void eaio_l2(int i); 217 #endif 218 219 #endif /* _MACHINE_CPUFUNC_H_ */ 220