Changes in kernel/arch/sparc64/include/asm.h [7d60cf5:7a0359b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/include/asm.h
r7d60cf5 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 37 37 38 38 #include <arch/arch.h> 39 #include <arch/types.h>40 39 #include <typedefs.h> 41 40 #include <align.h> … … 44 43 #include <arch/stack.h> 45 44 #include <arch/barrier.h> 46 47 static inline void pio_write_8(ioport8_t *port, uint8_t v) 45 #include <trace.h> 46 47 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v) 48 48 { 49 49 *port = v; … … 51 51 } 52 52 53 static inline void pio_write_16(ioport16_t *port, uint16_t v)53 NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v) 54 54 { 55 55 *port = v; … … 57 57 } 58 58 59 static inline void pio_write_32(ioport32_t *port, uint32_t v)59 NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v) 60 60 { 61 61 *port = v; … … 63 63 } 64 64 65 static inline uint8_t pio_read_8(ioport8_t *port) 66 { 67 uint8_t rv; 68 69 rv = *port; 65 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port) 66 { 67 uint8_t rv = *port; 70 68 memory_barrier(); 71 72 69 return rv; 73 70 } 74 71 75 static inline uint16_t pio_read_16(ioport16_t *port) 76 { 77 uint16_t rv; 78 79 rv = *port; 72 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port) 73 { 74 uint16_t rv = *port; 80 75 memory_barrier(); 81 82 76 return rv; 83 77 } 84 78 85 static inline uint32_t pio_read_32(ioport32_t *port) 86 { 87 uint32_t rv; 88 89 rv = *port; 79 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port) 80 { 81 uint32_t rv = *port; 90 82 memory_barrier(); 91 92 83 return rv; 93 84 } … … 96 87 * 97 88 * @return Value of PSTATE register. 98 */ 99 static inline uint64_t pstate_read(void) 100 { 101 uint64_t v; 102 103 asm volatile ("rdpr %%pstate, %0\n" : "=r" (v)); 89 * 90 */ 91 NO_TRACE static inline uint64_t pstate_read(void) 92 { 93 uint64_t v; 94 95 asm volatile ( 96 "rdpr %%pstate, %[v]\n" 97 : [v] "=r" (v) 98 ); 104 99 105 100 return v; … … 109 104 * 110 105 * @param v New value of PSTATE register. 111 */ 112 static inline void pstate_write(uint64_t v) 113 { 114 asm volatile ("wrpr %0, %1, %%pstate\n" : : "r" (v), "i" (0)); 106 * 107 */ 108 NO_TRACE static inline void pstate_write(uint64_t v) 109 { 110 asm volatile ( 111 "wrpr %[v], %[zero], %%pstate\n" 112 :: [v] "r" (v), 113 [zero] "i" (0) 114 ); 115 115 } 116 116 … … 118 118 * 119 119 * @return Value of TICK_comapre register. 120 */ 121 static inline uint64_t tick_compare_read(void) 122 { 123 uint64_t v; 124 125 asm volatile ("rd %%tick_cmpr, %0\n" : "=r" (v)); 120 * 121 */ 122 NO_TRACE static inline uint64_t tick_compare_read(void) 123 { 124 uint64_t v; 125 126 asm volatile ( 127 "rd %%tick_cmpr, %[v]\n" 128 : [v] "=r" (v) 129 ); 126 130 127 131 return v; … … 131 135 * 132 136 * @param v New value of TICK_comapre register. 133 */ 134 static inline void tick_compare_write(uint64_t v) 135 { 136 asm volatile ("wr %0, %1, %%tick_cmpr\n" : : "r" (v), "i" (0)); 137 * 138 */ 139 NO_TRACE static inline void tick_compare_write(uint64_t v) 140 { 141 asm volatile ( 142 "wr %[v], %[zero], %%tick_cmpr\n" 143 :: [v] "r" (v), 144 [zero] "i" (0) 145 ); 137 146 } 138 147 … … 140 149 * 141 150 * @return Value of STICK_compare register. 142 */ 143 static inline uint64_t stick_compare_read(void) 144 { 145 uint64_t v; 146 147 asm volatile ("rd %%asr25, %0\n" : "=r" (v)); 151 * 152 */ 153 NO_TRACE static inline uint64_t stick_compare_read(void) 154 { 155 uint64_t v; 156 157 asm volatile ( 158 "rd %%asr25, %[v]\n" 159 : [v] "=r" (v) 160 ); 148 161 149 162 return v; … … 153 166 * 154 167 * @param v New value of STICK_comapre register. 155 */ 156 static inline void stick_compare_write(uint64_t v) 157 { 158 asm volatile ("wr %0, %1, %%asr25\n" : : "r" (v), "i" (0)); 168 * 169 */ 170 NO_TRACE static inline void stick_compare_write(uint64_t v) 171 { 172 asm volatile ( 173 "wr %[v], %[zero], %%asr25\n" 174 :: [v] "r" (v), 175 [zero] "i" (0) 176 ); 159 177 } 160 178 … … 162 180 * 163 181 * @return Value of TICK register. 164 */ 165 static inline uint64_t tick_read(void) 166 { 167 uint64_t v; 168 169 asm volatile ("rdpr %%tick, %0\n" : "=r" (v)); 182 * 183 */ 184 NO_TRACE static inline uint64_t tick_read(void) 185 { 186 uint64_t v; 187 188 asm volatile ( 189 "rdpr %%tick, %[v]\n" 190 : [v] "=r" (v) 191 ); 170 192 171 193 return v; … … 175 197 * 176 198 * @param v New value of TICK register. 177 */ 178 static inline void tick_write(uint64_t v) 179 { 180 asm volatile ("wrpr %0, %1, %%tick\n" : : "r" (v), "i" (0)); 199 * 200 */ 201 NO_TRACE static inline void tick_write(uint64_t v) 202 { 203 asm volatile ( 204 "wrpr %[v], %[zero], %%tick\n" 205 :: [v] "r" (v), 206 [zero] "i" (0) 207 ); 181 208 } 182 209 … … 184 211 * 185 212 * @return Value of FPRS register. 186 */ 187 static inline uint64_t fprs_read(void) 188 { 189 uint64_t v; 190 191 asm volatile ("rd %%fprs, %0\n" : "=r" (v)); 213 * 214 */ 215 NO_TRACE static inline uint64_t fprs_read(void) 216 { 217 uint64_t v; 218 219 asm volatile ( 220 "rd %%fprs, %[v]\n" 221 : [v] "=r" (v) 222 ); 192 223 193 224 return v; … … 197 228 * 198 229 * @param v New value of FPRS register. 199 */ 200 static inline void fprs_write(uint64_t v) 201 { 202 asm volatile ("wr %0, %1, %%fprs\n" : : "r" (v), "i" (0)); 230 * 231 */ 232 NO_TRACE static inline void fprs_write(uint64_t v) 233 { 234 asm volatile ( 235 "wr %[v], %[zero], %%fprs\n" 236 :: [v] "r" (v), 237 [zero] "i" (0) 238 ); 203 239 } 204 240 … … 206 242 * 207 243 * @return Value of SOFTINT register. 208 */ 209 static inline uint64_t softint_read(void) 210 { 211 uint64_t v; 212 213 asm volatile ("rd %%softint, %0\n" : "=r" (v)); 214 244 * 245 */ 246 NO_TRACE static inline uint64_t softint_read(void) 247 { 248 uint64_t v; 249 250 asm volatile ( 251 "rd %%softint, %[v]\n" 252 : [v] "=r" (v) 253 ); 254 215 255 return v; 216 256 } … … 219 259 * 220 260 * @param v New value of SOFTINT register. 221 */ 222 static inline void softint_write(uint64_t v) 223 { 224 asm volatile ("wr %0, %1, %%softint\n" : : "r" (v), "i" (0)); 261 * 262 */ 263 NO_TRACE static inline void softint_write(uint64_t v) 264 { 265 asm volatile ( 266 "wr %[v], %[zero], %%softint\n" 267 :: [v] "r" (v), 268 [zero] "i" (0) 269 ); 225 270 } 226 271 … … 230 275 * 231 276 * @param v New value of CLEAR_SOFTINT register. 232 */ 233 static inline void clear_softint_write(uint64_t v) 234 { 235 asm volatile ("wr %0, %1, %%clear_softint\n" : : "r" (v), "i" (0)); 277 * 278 */ 279 NO_TRACE static inline void clear_softint_write(uint64_t v) 280 { 281 asm volatile ( 282 "wr %[v], %[zero], %%clear_softint\n" 283 :: [v] "r" (v), 284 [zero] "i" (0) 285 ); 236 286 } 237 287 … … 241 291 * 242 292 * @param v New value of SET_SOFTINT register. 243 */ 244 static inline void set_softint_write(uint64_t v) 245 { 246 asm volatile ("wr %0, %1, %%set_softint\n" : : "r" (v), "i" (0)); 293 * 294 */ 295 NO_TRACE static inline void set_softint_write(uint64_t v) 296 { 297 asm volatile ( 298 "wr %[v], %[zero], %%set_softint\n" 299 :: [v] "r" (v), 300 [zero] "i" (0) 301 ); 247 302 } 248 303 … … 253 308 * 254 309 * @return Old interrupt priority level. 255 */ 256 static inline ipl_t interrupts_enable(void) { 310 * 311 */ 312 NO_TRACE static inline ipl_t interrupts_enable(void) { 257 313 pstate_reg_t pstate; 258 uint64_t value; 259 260 value = pstate_read(); 314 uint64_t value = pstate_read(); 315 261 316 pstate.value = value; 262 317 pstate.ie = true; … … 272 327 * 273 328 * @return Old interrupt priority level. 274 */ 275 static inline ipl_t interrupts_disable(void) { 329 * 330 */ 331 NO_TRACE static inline ipl_t interrupts_disable(void) { 276 332 pstate_reg_t pstate; 277 uint64_t value; 278 279 value = pstate_read(); 333 uint64_t value = pstate_read(); 334 280 335 pstate.value = value; 281 336 pstate.ie = false; … … 290 345 * 291 346 * @param ipl Saved interrupt priority level. 292 */ 293 static inline void interrupts_restore(ipl_t ipl) { 347 * 348 */ 349 NO_TRACE static inline void interrupts_restore(ipl_t ipl) { 294 350 pstate_reg_t pstate; 295 351 … … 304 360 * 305 361 * @return Current interrupt priority level. 306 */ 307 static inline ipl_t interrupts_read(void) { 362 * 363 */ 364 NO_TRACE static inline ipl_t interrupts_read(void) { 308 365 return (ipl_t) pstate_read(); 366 } 367 368 /** Check interrupts state. 369 * 370 * @return True if interrupts are disabled. 371 * 372 */ 373 NO_TRACE static inline bool interrupts_disabled(void) 374 { 375 pstate_reg_t pstate; 376 377 pstate.value = pstate_read(); 378 return !pstate.ie; 309 379 } 310 380 … … 314 384 * The stack is assumed to be STACK_SIZE bytes long. 315 385 * The stack must start on page boundary. 316 */ 317 static inline uintptr_t get_stack_base(void) 386 * 387 */ 388 NO_TRACE static inline uintptr_t get_stack_base(void) 318 389 { 319 390 uintptr_t unbiased_sp; 320 391 321 asm volatile ("add %%sp, %1, %0\n" : "=r" (unbiased_sp) : "i" (STACK_BIAS)); 392 asm volatile ( 393 "add %%sp, %[stack_bias], %[unbiased_sp]\n" 394 : [unbiased_sp] "=r" (unbiased_sp) 395 : [stack_bias] "i" (STACK_BIAS) 396 ); 322 397 323 398 return ALIGN_DOWN(unbiased_sp, STACK_SIZE); … … 327 402 * 328 403 * @return Value of VER register. 329 */ 330 static inline uint64_t ver_read(void) 331 { 332 uint64_t v; 333 334 asm volatile ("rdpr %%ver, %0\n" : "=r" (v)); 404 * 405 */ 406 NO_TRACE static inline uint64_t ver_read(void) 407 { 408 uint64_t v; 409 410 asm volatile ( 411 "rdpr %%ver, %[v]\n" 412 : [v] "=r" (v) 413 ); 335 414 336 415 return v; … … 340 419 * 341 420 * @return Current value in TPC. 342 */ 343 static inline uint64_t tpc_read(void) 344 { 345 uint64_t v; 346 347 asm volatile ("rdpr %%tpc, %0\n" : "=r" (v)); 421 * 422 */ 423 NO_TRACE static inline uint64_t tpc_read(void) 424 { 425 uint64_t v; 426 427 asm volatile ( 428 "rdpr %%tpc, %[v]\n" 429 : [v] "=r" (v) 430 ); 348 431 349 432 return v; … … 353 436 * 354 437 * @return Current value in TL. 355 */ 356 static inline uint64_t tl_read(void) 357 { 358 uint64_t v; 359 360 asm volatile ("rdpr %%tl, %0\n" : "=r" (v)); 438 * 439 */ 440 NO_TRACE static inline uint64_t tl_read(void) 441 { 442 uint64_t v; 443 444 asm volatile ( 445 "rdpr %%tl, %[v]\n" 446 : [v] "=r" (v) 447 ); 361 448 362 449 return v; … … 366 453 * 367 454 * @return Current value in TBA. 368 */ 369 static inline uint64_t tba_read(void) 370 { 371 uint64_t v; 372 373 asm volatile ("rdpr %%tba, %0\n" : "=r" (v)); 455 * 456 */ 457 NO_TRACE static inline uint64_t tba_read(void) 458 { 459 uint64_t v; 460 461 asm volatile ( 462 "rdpr %%tba, %[v]\n" 463 : [v] "=r" (v) 464 ); 374 465 375 466 return v; … … 379 470 * 380 471 * @param v New value of TBA. 381 */ 382 static inline void tba_write(uint64_t v) 383 { 384 asm volatile ("wrpr %0, %1, %%tba\n" : : "r" (v), "i" (0)); 472 * 473 */ 474 NO_TRACE static inline void tba_write(uint64_t v) 475 { 476 asm volatile ( 477 "wrpr %[v], %[zero], %%tba\n" 478 :: [v] "r" (v), 479 [zero] "i" (0) 480 ); 385 481 } 386 482 … … 388 484 * 389 485 * @param asi ASI determining the alternate space. 390 * @param va Virtual address within the ASI. 391 * 392 * @return Value read from the virtual address in the specified address space. 393 */ 394 static inline uint64_t asi_u64_read(asi_t asi, uintptr_t va) 395 { 396 uint64_t v; 397 398 asm volatile ("ldxa [%1] %2, %0\n" : "=r" (v) : "r" (va), "i" ((unsigned) asi)); 486 * @param va Virtual address within the ASI. 487 * 488 * @return Value read from the virtual address in 489 * the specified address space. 490 * 491 */ 492 NO_TRACE static inline uint64_t asi_u64_read(asi_t asi, uintptr_t va) 493 { 494 uint64_t v; 495 496 asm volatile ( 497 "ldxa [%[va]] %[asi], %[v]\n" 498 : [v] "=r" (v) 499 : [va] "r" (va), 500 [asi] "i" ((unsigned int) asi) 501 ); 399 502 400 503 return v; … … 404 507 * 405 508 * @param asi ASI determining the alternate space. 406 * @param va Virtual address within the ASI. 407 * @param v Value to be written. 408 */ 409 static inline void asi_u64_write(asi_t asi, uintptr_t va, uint64_t v) 410 { 411 asm volatile ("stxa %0, [%1] %2\n" : : "r" (v), "r" (va), "i" ((unsigned) asi) : "memory"); 509 * @param va Virtual address within the ASI. 510 * @param v Value to be written. 511 * 512 */ 513 NO_TRACE static inline void asi_u64_write(asi_t asi, uintptr_t va, uint64_t v) 514 { 515 asm volatile ( 516 "stxa %[v], [%[va]] %[asi]\n" 517 :: [v] "r" (v), 518 [va] "r" (va), 519 [asi] "i" ((unsigned int) asi) 520 : "memory" 521 ); 412 522 } 413 523 414 524 /** Flush all valid register windows to memory. */ 415 static inline void flushw(void)525 NO_TRACE static inline void flushw(void) 416 526 { 417 527 asm volatile ("flushw\n"); … … 419 529 420 530 /** Switch to nucleus by setting TL to 1. */ 421 static inline void nucleus_enter(void)531 NO_TRACE static inline void nucleus_enter(void) 422 532 { 423 533 asm volatile ("wrpr %g0, 1, %tl\n"); … … 425 535 426 536 /** Switch from nucleus by setting TL to 0. */ 427 static inline void nucleus_leave(void)537 NO_TRACE static inline void nucleus_leave(void) 428 538 { 429 539 asm volatile ("wrpr %g0, %g0, %tl\n"); 430 540 } 431 541 432 extern void cpu_halt(void) ;542 extern void cpu_halt(void) __attribute__((noreturn)); 433 543 extern void cpu_sleep(void); 434 544 extern void asm_delay_loop(const uint32_t usec); 435 545 546 extern uint64_t read_from_ag_g6(void); 436 547 extern uint64_t read_from_ag_g7(void); 437 548 extern void write_to_ag_g6(uint64_t val);
Note:
See TracChangeset
for help on using the changeset viewer.