1 1.4 skrll /* $NetBSD: ia64_cpu.h,v 1.4 2023/10/06 11:45:37 skrll Exp $ */ 2 1.1 cherry 3 1.1 cherry /*- 4 1.3 scole * Copyright (c) 2007 Marcel Moolenaar 5 1.1 cherry * Copyright (c) 2000 Doug Rabson 6 1.1 cherry * All rights reserved. 7 1.1 cherry * 8 1.1 cherry * Redistribution and use in source and binary forms, with or without 9 1.1 cherry * modification, are permitted provided that the following conditions 10 1.1 cherry * are met: 11 1.1 cherry * 1. Redistributions of source code must retain the above copyright 12 1.1 cherry * notice, this list of conditions and the following disclaimer. 13 1.1 cherry * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 cherry * notice, this list of conditions and the following disclaimer in the 15 1.1 cherry * documentation and/or other materials provided with the distribution. 16 1.1 cherry * 17 1.1 cherry * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 1.1 cherry * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 1.1 cherry * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 1.1 cherry * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 1.1 cherry * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 cherry * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 1.1 cherry * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 cherry * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 1.1 cherry * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 cherry * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 cherry * SUCH DAMAGE. 28 1.1 cherry * 29 1.3 scole * $FreeBSD: releng/10.1/sys/ia64/include/ia64_cpu.h 223170 2011-06-17 04:26:03Z marcel $ 30 1.1 cherry */ 31 1.1 cherry 32 1.1 cherry #ifndef _MACHINE_IA64_CPU_H_ 33 1.1 cherry #define _MACHINE_IA64_CPU_H_ 34 1.1 cherry 35 1.1 cherry /* 36 1.3 scole * Local Interrupt ID. 37 1.3 scole */ 38 1.3 scole #define IA64_LID_GET_SAPIC_ID(x) ((u_int)((x) >> 16) & 0xffff) 39 1.3 scole #define IA64_LID_SET_SAPIC_ID(x) ((u_int)((x) & 0xffff) << 16) 40 1.3 scole 41 1.3 scole /* 42 1.3 scole * Definition of DCR bits. 43 1.3 scole */ 44 1.3 scole #define IA64_DCR_PP 0x0000000000000001 45 1.3 scole #define IA64_DCR_BE 0x0000000000000002 46 1.3 scole #define IA64_DCR_LC 0x0000000000000004 47 1.3 scole #define IA64_DCR_DM 0x0000000000000100 48 1.3 scole #define IA64_DCR_DP 0x0000000000000200 49 1.3 scole #define IA64_DCR_DK 0x0000000000000400 50 1.3 scole #define IA64_DCR_DX 0x0000000000000800 51 1.3 scole #define IA64_DCR_DR 0x0000000000001000 52 1.3 scole #define IA64_DCR_DA 0x0000000000002000 53 1.3 scole #define IA64_DCR_DD 0x0000000000004000 54 1.3 scole 55 1.3 scole #define IA64_DCR_DEFAULT \ 56 1.3 scole (IA64_DCR_DM | IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | \ 57 1.3 scole IA64_DCR_DR | IA64_DCR_DA | IA64_DCR_DD) 58 1.3 scole 59 1.3 scole /* 60 1.1 cherry * Definition of PSR and IPSR bits. 61 1.1 cherry */ 62 1.1 cherry #define IA64_PSR_BE 0x0000000000000002 63 1.1 cherry #define IA64_PSR_UP 0x0000000000000004 64 1.1 cherry #define IA64_PSR_AC 0x0000000000000008 65 1.1 cherry #define IA64_PSR_MFL 0x0000000000000010 66 1.1 cherry #define IA64_PSR_MFH 0x0000000000000020 67 1.1 cherry #define IA64_PSR_IC 0x0000000000002000 68 1.1 cherry #define IA64_PSR_I 0x0000000000004000 69 1.1 cherry #define IA64_PSR_PK 0x0000000000008000 70 1.1 cherry #define IA64_PSR_DT 0x0000000000020000 71 1.1 cherry #define IA64_PSR_DFL 0x0000000000040000 72 1.1 cherry #define IA64_PSR_DFH 0x0000000000080000 73 1.1 cherry #define IA64_PSR_SP 0x0000000000100000 74 1.1 cherry #define IA64_PSR_PP 0x0000000000200000 75 1.1 cherry #define IA64_PSR_DI 0x0000000000400000 76 1.1 cherry #define IA64_PSR_SI 0x0000000000800000 77 1.1 cherry #define IA64_PSR_DB 0x0000000001000000 78 1.1 cherry #define IA64_PSR_LP 0x0000000002000000 79 1.1 cherry #define IA64_PSR_TB 0x0000000004000000 80 1.1 cherry #define IA64_PSR_RT 0x0000000008000000 81 1.1 cherry #define IA64_PSR_CPL 0x0000000300000000 82 1.1 cherry #define IA64_PSR_CPL_KERN 0x0000000000000000 83 1.1 cherry #define IA64_PSR_CPL_1 0x0000000100000000 84 1.1 cherry #define IA64_PSR_CPL_2 0x0000000200000000 85 1.1 cherry #define IA64_PSR_CPL_USER 0x0000000300000000 86 1.1 cherry #define IA64_PSR_IS 0x0000000400000000 87 1.1 cherry #define IA64_PSR_MC 0x0000000800000000 88 1.1 cherry #define IA64_PSR_IT 0x0000001000000000 89 1.1 cherry #define IA64_PSR_ID 0x0000002000000000 90 1.1 cherry #define IA64_PSR_DA 0x0000004000000000 91 1.1 cherry #define IA64_PSR_DD 0x0000008000000000 92 1.1 cherry #define IA64_PSR_SS 0x0000010000000000 93 1.1 cherry #define IA64_PSR_RI 0x0000060000000000 94 1.1 cherry #define IA64_PSR_RI_0 0x0000000000000000 95 1.1 cherry #define IA64_PSR_RI_1 0x0000020000000000 96 1.1 cherry #define IA64_PSR_RI_2 0x0000040000000000 97 1.1 cherry #define IA64_PSR_ED 0x0000080000000000 98 1.1 cherry #define IA64_PSR_BN 0x0000100000000000 99 1.1 cherry #define IA64_PSR_IA 0x0000200000000000 100 1.1 cherry 101 1.1 cherry /* 102 1.1 cherry * Definition of ISR bits. 103 1.1 cherry */ 104 1.1 cherry #define IA64_ISR_CODE 0x000000000000ffff 105 1.1 cherry #define IA64_ISR_VECTOR 0x0000000000ff0000 106 1.1 cherry #define IA64_ISR_X 0x0000000100000000 107 1.1 cherry #define IA64_ISR_W 0x0000000200000000 108 1.1 cherry #define IA64_ISR_R 0x0000000400000000 109 1.1 cherry #define IA64_ISR_NA 0x0000000800000000 110 1.1 cherry #define IA64_ISR_SP 0x0000001000000000 111 1.1 cherry #define IA64_ISR_RS 0x0000002000000000 112 1.1 cherry #define IA64_ISR_IR 0x0000004000000000 113 1.1 cherry #define IA64_ISR_NI 0x0000008000000000 114 1.1 cherry #define IA64_ISR_SO 0x0000010000000000 115 1.1 cherry #define IA64_ISR_EI 0x0000060000000000 116 1.1 cherry #define IA64_ISR_EI_0 0x0000000000000000 117 1.1 cherry #define IA64_ISR_EI_1 0x0000020000000000 118 1.1 cherry #define IA64_ISR_EI_2 0x0000040000000000 119 1.1 cherry #define IA64_ISR_ED 0x0000080000000000 120 1.1 cherry 121 1.1 cherry /* 122 1.1 cherry * Vector numbers for various ia64 interrupts. 123 1.1 cherry */ 124 1.1 cherry #define IA64_VEC_VHPT 0 125 1.1 cherry #define IA64_VEC_ITLB 1 126 1.1 cherry #define IA64_VEC_DTLB 2 127 1.1 cherry #define IA64_VEC_ALT_ITLB 3 128 1.1 cherry #define IA64_VEC_ALT_DTLB 4 129 1.1 cherry #define IA64_VEC_NESTED_DTLB 5 130 1.1 cherry #define IA64_VEC_IKEY_MISS 6 131 1.1 cherry #define IA64_VEC_DKEY_MISS 7 132 1.1 cherry #define IA64_VEC_DIRTY_BIT 8 133 1.1 cherry #define IA64_VEC_INST_ACCESS 9 134 1.1 cherry #define IA64_VEC_DATA_ACCESS 10 135 1.1 cherry #define IA64_VEC_BREAK 11 136 1.1 cherry #define IA64_VEC_EXT_INTR 12 137 1.1 cherry #define IA64_VEC_PAGE_NOT_PRESENT 20 138 1.1 cherry #define IA64_VEC_KEY_PERMISSION 21 139 1.1 cherry #define IA64_VEC_INST_ACCESS_RIGHTS 22 140 1.1 cherry #define IA64_VEC_DATA_ACCESS_RIGHTS 23 141 1.1 cherry #define IA64_VEC_GENERAL_EXCEPTION 24 142 1.1 cherry #define IA64_VEC_DISABLED_FP 25 143 1.1 cherry #define IA64_VEC_NAT_CONSUMPTION 26 144 1.1 cherry #define IA64_VEC_SPECULATION 27 145 1.1 cherry #define IA64_VEC_DEBUG 29 146 1.1 cherry #define IA64_VEC_UNALIGNED_REFERENCE 30 147 1.1 cherry #define IA64_VEC_UNSUPP_DATA_REFERENCE 31 148 1.1 cherry #define IA64_VEC_FLOATING_POINT_FAULT 32 149 1.1 cherry #define IA64_VEC_FLOATING_POINT_TRAP 33 150 1.1 cherry #define IA64_VEC_LOWER_PRIVILEGE_TRANSFER 34 151 1.1 cherry #define IA64_VEC_TAKEN_BRANCH_TRAP 35 152 1.1 cherry #define IA64_VEC_SINGLE_STEP_TRAP 36 153 1.1 cherry #define IA64_VEC_IA32_EXCEPTION 45 154 1.1 cherry #define IA64_VEC_IA32_INTERCEPT 46 155 1.1 cherry #define IA64_VEC_IA32_INTERRUPT 47 156 1.1 cherry 157 1.1 cherry /* 158 1.1 cherry * IA-32 exceptions. 159 1.1 cherry */ 160 1.1 cherry #define IA32_EXCEPTION_DIVIDE 0 161 1.1 cherry #define IA32_EXCEPTION_DEBUG 1 162 1.1 cherry #define IA32_EXCEPTION_BREAK 3 163 1.1 cherry #define IA32_EXCEPTION_OVERFLOW 4 164 1.1 cherry #define IA32_EXCEPTION_BOUND 5 165 1.1 cherry #define IA32_EXCEPTION_DNA 7 166 1.1 cherry #define IA32_EXCEPTION_NOT_PRESENT 11 167 1.1 cherry #define IA32_EXCEPTION_STACK_FAULT 12 168 1.1 cherry #define IA32_EXCEPTION_GPFAULT 13 169 1.1 cherry #define IA32_EXCEPTION_FPERROR 16 170 1.1 cherry #define IA32_EXCEPTION_ALIGNMENT_CHECK 17 171 1.1 cherry #define IA32_EXCEPTION_STREAMING_SIMD 19 172 1.1 cherry 173 1.1 cherry #define IA32_INTERCEPT_INSTRUCTION 0 174 1.1 cherry #define IA32_INTERCEPT_GATE 1 175 1.1 cherry #define IA32_INTERCEPT_SYSTEM_FLAG 2 176 1.1 cherry #define IA32_INTERCEPT_LOCK 4 177 1.1 cherry 178 1.1 cherry #ifndef _LOCORE 179 1.1 cherry 180 1.1 cherry /* 181 1.1 cherry * Various special ia64 instructions. 182 1.1 cherry */ 183 1.1 cherry 184 1.1 cherry /* 185 1.1 cherry * Memory Fence. 186 1.1 cherry */ 187 1.1 cherry static __inline void 188 1.1 cherry ia64_mf(void) 189 1.1 cherry { 190 1.1 cherry __asm __volatile("mf"); 191 1.1 cherry } 192 1.1 cherry 193 1.1 cherry static __inline void 194 1.1 cherry ia64_mf_a(void) 195 1.1 cherry { 196 1.1 cherry __asm __volatile("mf.a"); 197 1.1 cherry } 198 1.1 cherry 199 1.1 cherry /* 200 1.1 cherry * Flush Cache. 201 1.1 cherry */ 202 1.1 cherry static __inline void 203 1.2 kiyohara ia64_fc(uint64_t va) 204 1.1 cherry { 205 1.1 cherry __asm __volatile("fc %0" :: "r"(va)); 206 1.1 cherry } 207 1.1 cherry 208 1.1 cherry static __inline void 209 1.2 kiyohara ia64_fc_i(uint64_t va) 210 1.1 cherry { 211 1.1 cherry __asm __volatile("fc.i %0" :: "r"(va)); 212 1.1 cherry } 213 1.1 cherry 214 1.1 cherry /* 215 1.1 cherry * Sync instruction stream. 216 1.1 cherry */ 217 1.1 cherry static __inline void 218 1.1 cherry ia64_sync_i(void) 219 1.1 cherry { 220 1.1 cherry __asm __volatile("sync.i"); 221 1.1 cherry } 222 1.1 cherry 223 1.1 cherry /* 224 1.1 cherry * Calculate address in VHPT for va. 225 1.1 cherry */ 226 1.2 kiyohara static __inline uint64_t 227 1.2 kiyohara ia64_thash(uint64_t va) 228 1.1 cherry { 229 1.2 kiyohara uint64_t result; 230 1.1 cherry __asm __volatile("thash %0=%1" : "=r" (result) : "r" (va)); 231 1.1 cherry return result; 232 1.1 cherry } 233 1.1 cherry 234 1.1 cherry /* 235 1.1 cherry * Calculate VHPT tag for va. 236 1.1 cherry */ 237 1.2 kiyohara static __inline uint64_t 238 1.2 kiyohara ia64_ttag(uint64_t va) 239 1.1 cherry { 240 1.2 kiyohara uint64_t result; 241 1.1 cherry __asm __volatile("ttag %0=%1" : "=r" (result) : "r" (va)); 242 1.1 cherry return result; 243 1.1 cherry } 244 1.1 cherry 245 1.1 cherry /* 246 1.1 cherry * Convert virtual address to physical. 247 1.1 cherry */ 248 1.2 kiyohara static __inline uint64_t 249 1.2 kiyohara ia64_tpa(uint64_t va) 250 1.1 cherry { 251 1.2 kiyohara uint64_t result; 252 1.1 cherry __asm __volatile("tpa %0=%1" : "=r" (result) : "r" (va)); 253 1.1 cherry return result; 254 1.1 cherry } 255 1.1 cherry 256 1.1 cherry /* 257 1.1 cherry * Generate a ptc.e instruction. 258 1.1 cherry */ 259 1.1 cherry static __inline void 260 1.2 kiyohara ia64_ptc_e(uint64_t v) 261 1.1 cherry { 262 1.3 scole __asm __volatile("ptc.e %0;; srlz.i;;" :: "r"(v)); 263 1.1 cherry } 264 1.1 cherry 265 1.1 cherry /* 266 1.1 cherry * Generate a ptc.g instruction. 267 1.1 cherry */ 268 1.1 cherry static __inline void 269 1.2 kiyohara ia64_ptc_g(uint64_t va, uint64_t log2size) 270 1.1 cherry { 271 1.3 scole __asm __volatile("ptc.g %0,%1;;" :: "r"(va), "r"(log2size)); 272 1.1 cherry } 273 1.1 cherry 274 1.1 cherry /* 275 1.1 cherry * Generate a ptc.ga instruction. 276 1.1 cherry */ 277 1.1 cherry static __inline void 278 1.2 kiyohara ia64_ptc_ga(uint64_t va, uint64_t log2size) 279 1.1 cherry { 280 1.3 scole __asm __volatile("ptc.ga %0,%1;;" :: "r"(va), "r"(log2size)); 281 1.1 cherry } 282 1.1 cherry 283 1.1 cherry /* 284 1.1 cherry * Generate a ptc.l instruction. 285 1.1 cherry */ 286 1.1 cherry static __inline void 287 1.2 kiyohara ia64_ptc_l(uint64_t va, uint64_t log2size) 288 1.1 cherry { 289 1.3 scole __asm __volatile("ptc.l %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size)); 290 1.3 scole } 291 1.3 scole 292 1.3 scole /* 293 1.3 scole * Invalidate the ALAT on the local processor. 294 1.3 scole */ 295 1.3 scole static __inline void 296 1.3 scole ia64_invala(void) 297 1.3 scole { 298 1.3 scole __asm __volatile("invala;;"); 299 1.3 scole } 300 1.3 scole 301 1.3 scole /* 302 1.3 scole * Unordered memory load. 303 1.3 scole */ 304 1.3 scole 305 1.3 scole static __inline uint8_t 306 1.3 scole ia64_ld1(uint8_t *p) 307 1.3 scole { 308 1.3 scole uint8_t v; 309 1.3 scole 310 1.3 scole __asm __volatile("ld1 %0=[%1];;" : "=r"(v) : "r"(p)); 311 1.3 scole return (v); 312 1.3 scole } 313 1.3 scole 314 1.3 scole static __inline uint16_t 315 1.4 skrll ia64_ld2(uint16_t *p) 316 1.3 scole { 317 1.3 scole uint16_t v; 318 1.3 scole 319 1.3 scole __asm __volatile("ld2 %0=[%1];;" : "=r"(v) : "r"(p)); 320 1.3 scole return (v); 321 1.3 scole } 322 1.3 scole 323 1.3 scole static __inline uint32_t 324 1.4 skrll ia64_ld4(uint32_t *p) 325 1.3 scole { 326 1.3 scole uint32_t v; 327 1.3 scole 328 1.3 scole __asm __volatile("ld4 %0=[%1];;" : "=r"(v) : "r"(p)); 329 1.3 scole return (v); 330 1.3 scole } 331 1.3 scole 332 1.3 scole static __inline uint64_t 333 1.4 skrll ia64_ld8(uint64_t *p) 334 1.3 scole { 335 1.3 scole uint64_t v; 336 1.3 scole 337 1.3 scole __asm __volatile("ld8 %0=[%1];;" : "=r"(v) : "r"(p)); 338 1.3 scole return (v); 339 1.3 scole } 340 1.3 scole 341 1.3 scole /* 342 1.3 scole * Unordered memory store. 343 1.3 scole */ 344 1.3 scole 345 1.3 scole static __inline void 346 1.3 scole ia64_st1(uint8_t *p, uint8_t v) 347 1.3 scole { 348 1.3 scole __asm __volatile("st1 [%0]=%1;;" :: "r"(p), "r"(v)); 349 1.3 scole } 350 1.3 scole 351 1.3 scole static __inline void 352 1.3 scole ia64_st2(uint16_t *p, uint16_t v) 353 1.3 scole { 354 1.3 scole __asm __volatile("st2 [%0]=%1;;" :: "r"(p), "r"(v)); 355 1.3 scole } 356 1.3 scole 357 1.3 scole static __inline void 358 1.3 scole ia64_st4(uint32_t *p, uint32_t v) 359 1.3 scole { 360 1.3 scole __asm __volatile("st4 [%0]=%1;;" :: "r"(p), "r"(v)); 361 1.3 scole } 362 1.3 scole 363 1.3 scole static __inline void 364 1.3 scole ia64_st8(uint64_t *p, uint64_t v) 365 1.3 scole { 366 1.3 scole __asm __volatile("st8 [%0]=%1;;" :: "r"(p), "r"(v)); 367 1.1 cherry } 368 1.1 cherry 369 1.1 cherry /* 370 1.1 cherry * Read the value of psr. 371 1.1 cherry */ 372 1.2 kiyohara static __inline uint64_t 373 1.1 cherry ia64_get_psr(void) 374 1.1 cherry { 375 1.2 kiyohara uint64_t result; 376 1.1 cherry __asm __volatile("mov %0=psr;;" : "=r" (result)); 377 1.1 cherry return result; 378 1.1 cherry } 379 1.1 cherry 380 1.1 cherry /* 381 1.1 cherry * Define accessors for application registers. 382 1.1 cherry */ 383 1.1 cherry 384 1.1 cherry #define IA64_AR(name) \ 385 1.1 cherry \ 386 1.2 kiyohara static __inline uint64_t \ 387 1.1 cherry ia64_get_##name(void) \ 388 1.1 cherry { \ 389 1.2 kiyohara uint64_t result; \ 390 1.1 cherry __asm __volatile("mov %0=ar." #name : "=r" (result)); \ 391 1.1 cherry return result; \ 392 1.1 cherry } \ 393 1.1 cherry \ 394 1.1 cherry static __inline void \ 395 1.2 kiyohara ia64_set_##name(uint64_t v) \ 396 1.1 cherry { \ 397 1.1 cherry __asm __volatile("mov ar." #name "=%0;;" :: "r" (v)); \ 398 1.1 cherry } 399 1.1 cherry 400 1.1 cherry IA64_AR(k0) 401 1.1 cherry IA64_AR(k1) 402 1.1 cherry IA64_AR(k2) 403 1.1 cherry IA64_AR(k3) 404 1.1 cherry IA64_AR(k4) 405 1.1 cherry IA64_AR(k5) 406 1.1 cherry IA64_AR(k6) 407 1.1 cherry IA64_AR(k7) 408 1.1 cherry 409 1.1 cherry IA64_AR(rsc) 410 1.1 cherry IA64_AR(bsp) 411 1.1 cherry IA64_AR(bspstore) 412 1.1 cherry IA64_AR(rnat) 413 1.1 cherry 414 1.1 cherry IA64_AR(fcr) 415 1.1 cherry 416 1.1 cherry IA64_AR(eflag) 417 1.1 cherry IA64_AR(csd) 418 1.1 cherry IA64_AR(ssd) 419 1.1 cherry IA64_AR(cflg) 420 1.1 cherry IA64_AR(fsr) 421 1.1 cherry IA64_AR(fir) 422 1.1 cherry IA64_AR(fdr) 423 1.1 cherry 424 1.1 cherry IA64_AR(ccv) 425 1.1 cherry 426 1.1 cherry IA64_AR(unat) 427 1.1 cherry 428 1.1 cherry IA64_AR(fpsr) 429 1.1 cherry 430 1.1 cherry IA64_AR(itc) 431 1.1 cherry 432 1.1 cherry IA64_AR(pfs) 433 1.1 cherry IA64_AR(lc) 434 1.1 cherry IA64_AR(ec) 435 1.1 cherry 436 1.1 cherry /* 437 1.1 cherry * Define accessors for control registers. 438 1.1 cherry */ 439 1.1 cherry 440 1.1 cherry #define IA64_CR(name) \ 441 1.1 cherry \ 442 1.2 kiyohara static __inline uint64_t \ 443 1.1 cherry ia64_get_##name(void) \ 444 1.1 cherry { \ 445 1.2 kiyohara uint64_t result; \ 446 1.1 cherry __asm __volatile("mov %0=cr." #name : "=r" (result)); \ 447 1.1 cherry return result; \ 448 1.1 cherry } \ 449 1.1 cherry \ 450 1.1 cherry static __inline void \ 451 1.2 kiyohara ia64_set_##name(uint64_t v) \ 452 1.1 cherry { \ 453 1.1 cherry __asm __volatile("mov cr." #name "=%0;;" :: "r" (v)); \ 454 1.1 cherry } 455 1.1 cherry 456 1.1 cherry IA64_CR(dcr) 457 1.1 cherry IA64_CR(itm) 458 1.1 cherry IA64_CR(iva) 459 1.1 cherry 460 1.1 cherry IA64_CR(pta) 461 1.1 cherry 462 1.1 cherry IA64_CR(ipsr) 463 1.1 cherry IA64_CR(isr) 464 1.1 cherry 465 1.1 cherry IA64_CR(iip) 466 1.1 cherry IA64_CR(ifa) 467 1.1 cherry IA64_CR(itir) 468 1.1 cherry IA64_CR(iipa) 469 1.1 cherry IA64_CR(ifs) 470 1.1 cherry IA64_CR(iim) 471 1.1 cherry IA64_CR(iha) 472 1.1 cherry 473 1.1 cherry IA64_CR(lid) 474 1.1 cherry IA64_CR(ivr) 475 1.1 cherry IA64_CR(tpr) 476 1.1 cherry IA64_CR(eoi) 477 1.1 cherry IA64_CR(irr0) 478 1.1 cherry IA64_CR(irr1) 479 1.1 cherry IA64_CR(irr2) 480 1.1 cherry IA64_CR(irr3) 481 1.1 cherry IA64_CR(itv) 482 1.1 cherry IA64_CR(pmv) 483 1.1 cherry IA64_CR(cmcv) 484 1.1 cherry 485 1.1 cherry IA64_CR(lrr0) 486 1.1 cherry IA64_CR(lrr1) 487 1.1 cherry 488 1.1 cherry /* 489 1.1 cherry * Write a region register. 490 1.1 cherry */ 491 1.1 cherry static __inline void 492 1.2 kiyohara ia64_set_rr(uint64_t rrbase, uint64_t v) 493 1.1 cherry { 494 1.3 scole __asm __volatile("mov rr[%0]=%1" 495 1.1 cherry :: "r"(rrbase), "r"(v) : "memory"); 496 1.1 cherry } 497 1.1 cherry 498 1.1 cherry /* 499 1.1 cherry * Read a CPUID register. 500 1.1 cherry */ 501 1.2 kiyohara static __inline uint64_t 502 1.1 cherry ia64_get_cpuid(int i) 503 1.1 cherry { 504 1.2 kiyohara uint64_t result; 505 1.1 cherry __asm __volatile("mov %0=cpuid[%1]" 506 1.1 cherry : "=r" (result) : "r"(i)); 507 1.1 cherry return result; 508 1.1 cherry } 509 1.1 cherry 510 1.1 cherry static __inline void 511 1.1 cherry ia64_disable_highfp(void) 512 1.1 cherry { 513 1.1 cherry __asm __volatile("ssm psr.dfh;; srlz.d"); 514 1.1 cherry } 515 1.1 cherry 516 1.1 cherry static __inline void 517 1.1 cherry ia64_enable_highfp(void) 518 1.1 cherry { 519 1.1 cherry __asm __volatile("rsm psr.dfh;; srlz.d"); 520 1.1 cherry } 521 1.1 cherry 522 1.3 scole /* 523 1.3 scole * Avoid inline functions for the following so that they still work 524 1.3 scole * correctly when inlining is not enabled (e.g. -O0). Function calls 525 1.3 scole * need data serialization after setting psr, which results in a 526 1.3 scole * hazard. 527 1.3 scole */ 528 1.3 scole #define ia64_srlz_d() __asm __volatile("srlz.d") 529 1.3 scole #define ia64_srlz_i() __asm __volatile("srlz.i;;") 530 1.2 kiyohara 531 1.1 cherry #endif /* !_LOCORE */ 532 1.1 cherry 533 1.1 cherry #endif /* _MACHINE_IA64_CPU_H_ */ 534 1.1 cherry 535