1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_PRIVREGS_H 27 #define _SYS_PRIVREGS_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* 34 * This file is kernel isa dependent. 35 */ 36 37 #include <sys/fsr.h> 38 #include <v9/sys/asi.h> 39 40 /* 41 * This file describes the cpu's privileged register set, and 42 * how the machine state is saved on the stack when a trap occurs. 43 */ 44 45 #ifndef _ASM 46 47 struct regs { 48 long long r_tstate; 49 long long r_g1; /* user global regs */ 50 long long r_g2; 51 long long r_g3; 52 long long r_g4; 53 long long r_g5; 54 long long r_g6; 55 long long r_g7; 56 long long r_o0; 57 long long r_o1; 58 long long r_o2; 59 long long r_o3; 60 long long r_o4; 61 long long r_o5; 62 long long r_o6; 63 long long r_o7; 64 /* 65 * These are still 32b in 4u's v8/v9 hybrid 66 */ 67 long r_pc; /* program counter */ 68 long r_npc; /* next program counter */ 69 int r_y; /* the y register */ 70 }; 71 72 #define r_ps r_tstate 73 #define r_sp r_o6 74 75 #endif /* _ASM */ 76 77 #ifdef _KERNEL 78 79 #define lwptoregs(lwp) ((struct regs *)((lwp)->lwp_regs)) 80 #define lwptofpu(lwp) ((kfpu_t *)((lwp)->lwp_fpu)) 81 82 /* 83 * Macros for saving/restoring registers. 84 */ 85 86 #define SAVE_GLOBALS(RP) \ 87 stx %g1, [RP + G1_OFF]; \ 88 stx %g2, [RP + G2_OFF]; \ 89 stx %g3, [RP + G3_OFF]; \ 90 stx %g4, [RP + G4_OFF]; \ 91 stx %g5, [RP + G5_OFF]; \ 92 stx %g6, [RP + G6_OFF]; \ 93 stx %g7, [RP + G7_OFF]; \ 94 mov %y, %g1; \ 95 st %g1, [RP + Y_OFF]; 96 97 #define RESTORE_GLOBALS(RP) \ 98 ld [RP + Y_OFF], %g1; \ 99 mov %g1, %y; \ 100 ldx [RP + G1_OFF], %g1; \ 101 ldx [RP + G2_OFF], %g2; \ 102 ldx [RP + G3_OFF], %g3; \ 103 ldx [RP + G4_OFF], %g4; \ 104 ldx [RP + G5_OFF], %g5; \ 105 ldx [RP + G6_OFF], %g6; \ 106 ldx [RP + G7_OFF], %g7; 107 108 #define SAVE_OUTS(RP) \ 109 stx %i0, [RP + O0_OFF]; \ 110 stx %i1, [RP + O1_OFF]; \ 111 stx %i2, [RP + O2_OFF]; \ 112 stx %i3, [RP + O3_OFF]; \ 113 stx %i4, [RP + O4_OFF]; \ 114 stx %i5, [RP + O5_OFF]; \ 115 stx %i6, [RP + O6_OFF]; \ 116 stx %i7, [RP + O7_OFF]; 117 118 #define RESTORE_OUTS(RP) \ 119 ldx [RP + O0_OFF], %i0; \ 120 ldx [RP + O1_OFF], %i1; \ 121 ldx [RP + O2_OFF], %i2; \ 122 ldx [RP + O3_OFF], %i3; \ 123 ldx [RP + O4_OFF], %i4; \ 124 ldx [RP + O5_OFF], %i5; \ 125 ldx [RP + O6_OFF], %i6; \ 126 ldx [RP + O7_OFF], %i7; 127 128 #define SAVE_V8WINDOW(SBP) \ 129 st %l0, [SBP + (0*4)]; \ 130 st %l1, [SBP + (1*4)]; \ 131 st %l2, [SBP + (2*4)]; \ 132 st %l3, [SBP + (3*4)]; \ 133 st %l4, [SBP + (4*4)]; \ 134 st %l5, [SBP + (5*4)]; \ 135 st %l6, [SBP + (6*4)]; \ 136 st %l7, [SBP + (7*4)]; \ 137 st %i0, [SBP + (8*4)]; \ 138 st %i1, [SBP + (9*4)]; \ 139 st %i2, [SBP + (10*4)]; \ 140 st %i3, [SBP + (11*4)]; \ 141 st %i4, [SBP + (12*4)]; \ 142 st %i5, [SBP + (13*4)]; \ 143 st %i6, [SBP + (14*4)]; \ 144 st %i7, [SBP + (15*4)]; 145 146 #define SAVE_V8WINDOW_ASI(SBP) \ 147 sta %l0, [SBP + (0*4)]%asi; \ 148 sta %l1, [SBP + (1*4)]%asi; \ 149 sta %l2, [SBP + (2*4)]%asi; \ 150 sta %l3, [SBP + (3*4)]%asi; \ 151 sta %l4, [SBP + (4*4)]%asi; \ 152 sta %l5, [SBP + (5*4)]%asi; \ 153 sta %l6, [SBP + (6*4)]%asi; \ 154 sta %l7, [SBP + (7*4)]%asi; \ 155 sta %i0, [SBP + (8*4)]%asi; \ 156 sta %i1, [SBP + (9*4)]%asi; \ 157 sta %i2, [SBP + (10*4)]%asi; \ 158 sta %i3, [SBP + (11*4)]%asi; \ 159 sta %i4, [SBP + (12*4)]%asi; \ 160 sta %i5, [SBP + (13*4)]%asi; \ 161 sta %i6, [SBP + (14*4)]%asi; \ 162 sta %i7, [SBP + (15*4)]%asi; 163 164 #define RESTORE_V8WINDOW(SBP) \ 165 ld [SBP + (0*4)], %l0; \ 166 ld [SBP + (1*4)], %l1; \ 167 ld [SBP + (2*4)], %l2; \ 168 ld [SBP + (3*4)], %l3; \ 169 ld [SBP + (4*4)], %l4; \ 170 ld [SBP + (5*4)], %l5; \ 171 ld [SBP + (6*4)], %l6; \ 172 ld [SBP + (7*4)], %l7; \ 173 ld [SBP + (8*4)], %i0; \ 174 ld [SBP + (9*4)], %i1; \ 175 ld [SBP + (10*4)], %i2; \ 176 ld [SBP + (11*4)], %i3; \ 177 ld [SBP + (12*4)], %i4; \ 178 ld [SBP + (13*4)], %i5; \ 179 ld [SBP + (14*4)], %i6; \ 180 ld [SBP + (15*4)], %i7; 181 182 #define SAVE_V9WINDOW(SBP) \ 183 stx %l0, [SBP + (0*8)]; \ 184 stx %l1, [SBP + (1*8)]; \ 185 stx %l2, [SBP + (2*8)]; \ 186 stx %l3, [SBP + (3*8)]; \ 187 stx %l4, [SBP + (4*8)]; \ 188 stx %l5, [SBP + (5*8)]; \ 189 stx %l6, [SBP + (6*8)]; \ 190 stx %l7, [SBP + (7*8)]; \ 191 stx %i0, [SBP + (8*8)]; \ 192 stx %i1, [SBP + (9*8)]; \ 193 stx %i2, [SBP + (10*8)]; \ 194 stx %i3, [SBP + (11*8)]; \ 195 stx %i4, [SBP + (12*8)]; \ 196 stx %i5, [SBP + (13*8)]; \ 197 stx %i6, [SBP + (14*8)]; \ 198 stx %i7, [SBP + (15*8)]; 199 200 #define SAVE_V9WINDOW_ASI(SBP) \ 201 stxa %l0, [SBP + (0*8)]%asi; \ 202 stxa %l1, [SBP + (1*8)]%asi; \ 203 stxa %l2, [SBP + (2*8)]%asi; \ 204 stxa %l3, [SBP + (3*8)]%asi; \ 205 stxa %l4, [SBP + (4*8)]%asi; \ 206 stxa %l5, [SBP + (5*8)]%asi; \ 207 stxa %l6, [SBP + (6*8)]%asi; \ 208 stxa %l7, [SBP + (7*8)]%asi; \ 209 stxa %i0, [SBP + (8*8)]%asi; \ 210 stxa %i1, [SBP + (9*8)]%asi; \ 211 stxa %i2, [SBP + (10*8)]%asi; \ 212 stxa %i3, [SBP + (11*8)]%asi; \ 213 stxa %i4, [SBP + (12*8)]%asi; \ 214 stxa %i5, [SBP + (13*8)]%asi; \ 215 stxa %i6, [SBP + (14*8)]%asi; \ 216 stxa %i7, [SBP + (15*8)]%asi; 217 218 #define RESTORE_V9WINDOW(SBP) \ 219 ldx [SBP + (0*8)], %l0; \ 220 ldx [SBP + (1*8)], %l1; \ 221 ldx [SBP + (2*8)], %l2; \ 222 ldx [SBP + (3*8)], %l3; \ 223 ldx [SBP + (4*8)], %l4; \ 224 ldx [SBP + (5*8)], %l5; \ 225 ldx [SBP + (6*8)], %l6; \ 226 ldx [SBP + (7*8)], %l7; \ 227 ldx [SBP + (8*8)], %i0; \ 228 ldx [SBP + (9*8)], %i1; \ 229 ldx [SBP + (10*8)], %i2; \ 230 ldx [SBP + (11*8)], %i3; \ 231 ldx [SBP + (12*8)], %i4; \ 232 ldx [SBP + (13*8)], %i5; \ 233 ldx [SBP + (14*8)], %i6; \ 234 ldx [SBP + (15*8)], %i7; 235 236 #define STORE_FPREGS(FP) \ 237 std %f0, [FP]; \ 238 std %f2, [FP + 8]; \ 239 std %f4, [FP + 16]; \ 240 std %f6, [FP + 24]; \ 241 std %f8, [FP + 32]; \ 242 std %f10, [FP + 40]; \ 243 std %f12, [FP + 48]; \ 244 std %f14, [FP + 56]; \ 245 std %f16, [FP + 64]; \ 246 std %f18, [FP + 72]; \ 247 std %f20, [FP + 80]; \ 248 std %f22, [FP + 88]; \ 249 std %f24, [FP + 96]; \ 250 std %f26, [FP + 104]; \ 251 std %f28, [FP + 112]; \ 252 std %f30, [FP + 120]; \ 253 std %d32, [FP + 128]; \ 254 std %d34, [FP + 136]; \ 255 std %d36, [FP + 144]; \ 256 std %d38, [FP + 152]; \ 257 std %d40, [FP + 160]; \ 258 std %d42, [FP + 168]; \ 259 std %d44, [FP + 176]; \ 260 std %d46, [FP + 184]; \ 261 std %d48, [FP + 192]; \ 262 std %d50, [FP + 200]; \ 263 std %d52, [FP + 208]; \ 264 std %d54, [FP + 216]; \ 265 std %d56, [FP + 224]; \ 266 std %d58, [FP + 232]; \ 267 std %d60, [FP + 240]; \ 268 std %d62, [FP + 248]; 269 270 #define LOAD_FPREGS(FP) \ 271 ldd [FP], %f0; \ 272 ldd [FP + 8], %f2; \ 273 ldd [FP + 16], %f4; \ 274 ldd [FP + 24], %f6; \ 275 ldd [FP + 32], %f8; \ 276 ldd [FP + 40], %f10; \ 277 ldd [FP + 48], %f12; \ 278 ldd [FP + 56], %f14; \ 279 ldd [FP + 64], %f16; \ 280 ldd [FP + 72], %f18; \ 281 ldd [FP + 80], %f20; \ 282 ldd [FP + 88], %f22; \ 283 ldd [FP + 96], %f24; \ 284 ldd [FP + 104], %f26; \ 285 ldd [FP + 112], %f28; \ 286 ldd [FP + 120], %f30; \ 287 ldd [FP + 128], %d32; \ 288 ldd [FP + 136], %d34; \ 289 ldd [FP + 144], %d36; \ 290 ldd [FP + 152], %d38; \ 291 ldd [FP + 160], %d40; \ 292 ldd [FP + 168], %d42; \ 293 ldd [FP + 176], %d44; \ 294 ldd [FP + 184], %d46; \ 295 ldd [FP + 192], %d48; \ 296 ldd [FP + 200], %d50; \ 297 ldd [FP + 208], %d52; \ 298 ldd [FP + 216], %d54; \ 299 ldd [FP + 224], %d56; \ 300 ldd [FP + 232], %d58; \ 301 ldd [FP + 240], %d60; \ 302 ldd [FP + 248], %d62; 303 304 #define STORE_DL_FPREGS(FP) \ 305 std %f0, [FP]; \ 306 std %f2, [FP + 8]; \ 307 std %f4, [FP + 16]; \ 308 std %f6, [FP + 24]; \ 309 std %f8, [FP + 32]; \ 310 std %f10, [FP + 40]; \ 311 std %f12, [FP + 48]; \ 312 std %f14, [FP + 56]; \ 313 std %f16, [FP + 64]; \ 314 std %f18, [FP + 72]; \ 315 std %f20, [FP + 80]; \ 316 std %f22, [FP + 88]; \ 317 std %f24, [FP + 96]; \ 318 std %f26, [FP + 104]; \ 319 std %f28, [FP + 112]; \ 320 std %f30, [FP + 120]; 321 322 #define STORE_DU_FPREGS(FP) \ 323 std %d32, [FP + 128]; \ 324 std %d34, [FP + 136]; \ 325 std %d36, [FP + 144]; \ 326 std %d38, [FP + 152]; \ 327 std %d40, [FP + 160]; \ 328 std %d42, [FP + 168]; \ 329 std %d44, [FP + 176]; \ 330 std %d46, [FP + 184]; \ 331 std %d48, [FP + 192]; \ 332 std %d50, [FP + 200]; \ 333 std %d52, [FP + 208]; \ 334 std %d54, [FP + 216]; \ 335 std %d56, [FP + 224]; \ 336 std %d58, [FP + 232]; \ 337 std %d60, [FP + 240]; \ 338 std %d62, [FP + 248]; 339 340 #define LOAD_DL_FPREGS(FP) \ 341 ldd [FP], %f0; \ 342 ldd [FP + 8], %f2; \ 343 ldd [FP + 16], %f4; \ 344 ldd [FP + 24], %f6; \ 345 ldd [FP + 32], %f8; \ 346 ldd [FP + 40], %f10; \ 347 ldd [FP + 48], %f12; \ 348 ldd [FP + 56], %f14; \ 349 ldd [FP + 64], %f16; \ 350 ldd [FP + 72], %f18; \ 351 ldd [FP + 80], %f20; \ 352 ldd [FP + 88], %f22; \ 353 ldd [FP + 96], %f24; \ 354 ldd [FP + 104], %f26; \ 355 ldd [FP + 112], %f28; \ 356 ldd [FP + 120], %f30; 357 358 #define LOAD_DU_FPREGS(FP) \ 359 ldd [FP + 128], %d32; \ 360 ldd [FP + 136], %d34; \ 361 ldd [FP + 144], %d36; \ 362 ldd [FP + 152], %d38; \ 363 ldd [FP + 160], %d40; \ 364 ldd [FP + 168], %d42; \ 365 ldd [FP + 176], %d44; \ 366 ldd [FP + 184], %d46; \ 367 ldd [FP + 192], %d48; \ 368 ldd [FP + 200], %d50; \ 369 ldd [FP + 208], %d52; \ 370 ldd [FP + 216], %d54; \ 371 ldd [FP + 224], %d56; \ 372 ldd [FP + 232], %d58; \ 373 ldd [FP + 240], %d60; \ 374 ldd [FP + 248], %d62; 375 376 #endif /* _KERNEL */ 377 378 /* 379 * V9 privileged registers 380 */ 381 382 /* 383 * Condition Codes Register (CCR) 384 * 385 * |-------------------------------| 386 * | XCC | ICC | 387 * | N | Z | V | C | N | Z | V | C | 388 * |---|---|---|---|---|---|---|---| 389 * 7 6 5 4 3 2 1 0 390 */ 391 #define CCR_IC 0x01 /* 32b carry */ 392 #define CCR_IV 0x02 /* 32b overflow */ 393 #define CCR_IZ 0x04 /* 32b zero */ 394 #define CCR_IN 0x08 /* 32b negative */ 395 #define CCR_XC 0x10 /* 64b carry */ 396 #define CCR_XV 0x20 /* 64b overflow */ 397 #define CCR_XZ 0x40 /* 64b zero */ 398 #define CCR_XN 0x80 /* 64b negative */ 399 #define CCR_ICC 0x0F 400 #define CCR_XCC 0xF0 401 402 403 /* 404 * Processor State Register (PSTATE) 405 * 406 * |-------------------------------------------------------------| 407 * | IG | MG | CLE | TLE | MM | RED | PEF | AM | PRIV | IE | AG | 408 * |-----|----|-----|-----|----|-----|-----|----|------|----|----| 409 * 11 10 9 8 7 6 5 4 3 2 1 0 410 * 411 * Note that the IG, MG, RED and AG fields are not applicable to sun4v 412 * compliant processors. 413 */ 414 #ifndef GLREG 415 #define PSTATE_AG 0x001 /* alternate globals */ 416 #endif /* GLREG */ 417 418 #define PSTATE_IE 0x002 /* interrupt enable */ 419 #define PSTATE_PRIV 0x004 /* privileged mode */ 420 #define PSTATE_AM 0x008 /* use 32b address mask */ 421 #define PSTATE_PEF 0x010 /* fp enable */ 422 423 #ifndef GLREG 424 #define PSTATE_RED 0x020 /* red mode */ 425 #endif /* GLREG */ 426 427 #define PSTATE_MM 0x0C0 /* memory model */ 428 #define PSTATE_TLE 0x100 /* trap little endian */ 429 #define PSTATE_CLE 0x200 /* current little endian */ 430 431 #ifndef GLREG 432 #define PSTATE_MG 0x400 /* MMU globals */ 433 #define PSTATE_IG 0x800 /* interrupt globals */ 434 #endif /* GLREG */ 435 436 #define PSTATE_BITS \ 437 "\020\014IG\013MG\012CLE\011TLE\010MM-RMO\ 438 \07MM-PSO\06RED\05PEF\04AM\03PRIV\02IE\01AG" 439 440 /* 441 * Definition of MM (Memory Mode) bit field of pstate. 442 */ 443 #define PSTATE_MM_TSO 0x00 /* total store odering */ 444 #define PSTATE_MM_PSO 0x40 /* partial store odering */ 445 #define PSTATE_MM_RMO 0x80 /* relaxed memory ordering */ 446 447 448 /* 449 * Trap State Register (TSTATE) 450 * 451 * |------------------------------------------| 452 * | GL | CCR | ASI | --- | PSTATE | -- | CWP | 453 * |----|-----|-----|-----|--------|----|-----| 454 * 42 40 39 32 31 24 23 20 19 8 7 5 4 0 455 * 456 * Note that the GL field is applicable to sun4v compliant processors only. 457 */ 458 #define TSTATE_CWP_MASK 0x01F 459 #define TSTATE_CWP_SHIFT 0 460 #define TSTATE_PSTATE_MASK 0xFFF 461 #define TSTATE_PSTATE_SHIFT 8 462 #define TSTATE_ASI_MASK 0x0FF 463 #define TSTATE_ASI_SHIFT 24 464 #define TSTATE_CCR_MASK 0x0FF 465 #define TSTATE_CCR_SHIFT 32 466 467 #ifdef GLREG 468 #define TSTATE_GL_MASK 0x7 469 #define TSTATE_GL_SHIFT 40 470 #endif /* GLREG */ 471 472 /* 473 * Some handy tstate macros 474 */ 475 #define TSTATE_AG (PSTATE_AG << TSTATE_PSTATE_SHIFT) 476 #define TSTATE_IE (PSTATE_IE << TSTATE_PSTATE_SHIFT) 477 #define TSTATE_PRIV (PSTATE_PRIV << TSTATE_PSTATE_SHIFT) 478 #define TSTATE_AM (PSTATE_AM << TSTATE_PSTATE_SHIFT) 479 #define TSTATE_PEF (PSTATE_PEF << TSTATE_PSTATE_SHIFT) 480 #define TSTATE_MG (PSTATE_MG << TSTATE_PSTATE_SHIFT) 481 #define TSTATE_IG (PSTATE_IG << TSTATE_PSTATE_SHIFT) 482 #define TSTATE_CWP TSTATE_CWP_MASK 483 484 /* 485 * as is 64b, but cc is 32b, so we need this hack. 486 */ 487 #ifndef _ASM 488 #define TSTATE_ICC ((long long)CCR_ICC << TSTATE_CCR_SHIFT) 489 #define TSTATE_XCC ((long long)CCR_XCC << TSTATE_CCR_SHIFT) 490 #define TSTATE_IC ((long long)CCR_IC << TSTATE_CCR_SHIFT) 491 #define TSTATE_IV ((long long)CCR_IV << TSTATE_CCR_SHIFT) 492 #define TSTATE_IN ((long long)CCR_IN << TSTATE_CCR_SHIFT) 493 #define TSTATE_XV ((long long)CCR_XV << TSTATE_CCR_SHIFT) 494 #define TSTATE_XZ ((long long)CCR_XZ << TSTATE_CCR_SHIFT) 495 #else 496 #define TSTATE_ICC (CCR_ICC << TSTATE_CCR_SHIFT) 497 #define TSTATE_XCC (CCR_XCC << TSTATE_CCR_SHIFT) 498 #define TSTATE_IC (CCR_IC << TSTATE_CCR_SHIFT) 499 #define TSTATE_IV (CCR_IV << TSTATE_CCR_SHIFT) 500 #define TSTATE_IN (CCR_IN << TSTATE_CCR_SHIFT) 501 #define TSTATE_XV (CCR_XV << TSTATE_CCR_SHIFT) 502 #define TSTATE_XZ (CCR_XZ << TSTATE_CCR_SHIFT) 503 #endif 504 #define TSTATE_V8_UBITS (TSTATE_ICC | TSTATE_PEF) 505 506 /* 507 * Initial kernel and user %tstate. 508 */ 509 #define PTSTATE_KERN_COMMON \ 510 (PSTATE_PRIV | PSTATE_PEF | PSTATE_MM_TSO) 511 512 #define TSTATE_USER_COMMON \ 513 (PSTATE_IE | PSTATE_PEF | PSTATE_MM_TSO) 514 515 #define TSTATE_KERN \ 516 (PTSTATE_KERN_COMMON << TSTATE_PSTATE_SHIFT) 517 518 #define PSTATE_KERN \ 519 (PTSTATE_KERN_COMMON | PSTATE_PRIV | PSTATE_IE) 520 521 #define TSTATE_USER32 \ 522 (((TSTATE_USER_COMMON | PSTATE_AM) << TSTATE_PSTATE_SHIFT) | \ 523 ((long long)ASI_PNF << TSTATE_ASI_SHIFT)) 524 525 #define TSTATE_USER64 \ 526 ((TSTATE_USER_COMMON << TSTATE_PSTATE_SHIFT) | \ 527 ((long long)ASI_PNF << TSTATE_ASI_SHIFT)) 528 529 #define USERMODE(x) (!((x) & TSTATE_PRIV)) 530 531 /* 532 * Window State Register (WSTATE) 533 * 534 * |------------| 535 * |OTHER|NORMAL| 536 * |-----|------| 537 * 5 3 2 0 538 */ 539 #define WSTATE_BAD 0 /* unused */ 540 #define WSTATE_U32 1 /* 32b stack */ 541 #define WSTATE_U64 2 /* 64b stack */ 542 #define WSTATE_CLEAN32 3 /* cleanwin workaround, 32b stack */ 543 #define WSTATE_CLEAN64 4 /* cleanwin workaround, 64b stack */ 544 #define WSTATE_K32 5 /* priv 32b stack */ 545 #define WSTATE_K64 6 /* priv 64b stack */ 546 #define WSTATE_KMIX 7 /* priv mixed stack */ 547 548 #define WSTATE_CLEAN_OFFSET 2 549 #define WSTATE_SHIFT 3 /* normal-to-other shift */ 550 #define WSTATE_MASK 7 /* mask for each set */ 551 #define WSTATE(o, n) (((o) << WSTATE_SHIFT) | (n)) 552 553 #define WSTATE_USER32 WSTATE(WSTATE_BAD, WSTATE_U32) 554 #define WSTATE_USER64 WSTATE(WSTATE_BAD, WSTATE_U64) 555 #define WSTATE_KERN WSTATE(WSTATE_U32, WSTATE_K64) 556 557 /* 558 * Processor Interrupt Level Register (PIL) 559 * 560 * |-----| 561 * | PIL | 562 * |-----| 563 * 3 0 564 */ 565 566 /* 567 * Version Register (VER) 568 * 569 * |-------------------------------------------------| 570 * | manuf | impl | mask | ---- | maxtl | - | maxwin | 571 * |-------|------|------|------|-------|---|--------| 572 * 63 48 47 32 31 24 23 16 15 8 7 5 4 0 573 */ 574 #define VER_MANUF 0xFFFF000000000000 575 #define VER_IMPL 0x0000FFFF00000000 576 #define VER_MASK 0x00000000FF000000 577 #define VER_MAXTL 0x000000000000FF00 578 #define VER_MAXWIN 0x000000000000001F 579 #define VER_MAXTL_SHIFT 8 580 #define VER_MAXTL_MASK (VER_MAXTL >> VER_MAXTL_SHIFT) 581 582 /* 583 * Tick Register (TICK) 584 * 585 * |---------------| 586 * | npt | counter | 587 * |-----|---------| 588 * 63 62 0 589 * 590 * Note: UltraSparc III Stick register has the same layout. When 591 * present, we clear it too. 592 */ 593 594 #define TICK_NPT 0x8000000000000000 595 #define TICK_COUNTER 0x7FFFFFFFFFFFFFFF 596 597 #ifdef __cplusplus 598 } 599 #endif 600 601 #endif /* _SYS_PRIVREGS_H */ 602