Changeset 7a0359b in mainline for kernel/arch/sparc64
- Timestamp:
- 2010-07-02T15:42:19Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bbfdf62
- Parents:
- e3ee9b9
- Location:
- kernel/arch/sparc64/include
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/include/asm.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 43 43 #include <arch/stack.h> 44 44 #include <arch/barrier.h> 45 46 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) 47 48 { 48 49 *port = v; … … 50 51 } 51 52 52 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) 53 54 { 54 55 *port = v; … … 56 57 } 57 58 58 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) 59 60 { 60 61 *port = v; … … 62 63 } 63 64 64 static inline uint8_t pio_read_8(ioport8_t *port) 65 { 66 uint8_t rv; 67 68 rv = *port; 65 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port) 66 { 67 uint8_t rv = *port; 69 68 memory_barrier(); 70 71 69 return rv; 72 70 } 73 71 74 static inline uint16_t pio_read_16(ioport16_t *port) 75 { 76 uint16_t rv; 77 78 rv = *port; 72 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port) 73 { 74 uint16_t rv = *port; 79 75 memory_barrier(); 80 81 76 return rv; 82 77 } 83 78 84 static inline uint32_t pio_read_32(ioport32_t *port) 85 { 86 uint32_t rv; 87 88 rv = *port; 79 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port) 80 { 81 uint32_t rv = *port; 89 82 memory_barrier(); 90 91 83 return rv; 92 84 } … … 95 87 * 96 88 * @return Value of PSTATE register. 97 */ 98 static inline uint64_t pstate_read(void) 99 { 100 uint64_t v; 101 102 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 ); 103 99 104 100 return v; … … 108 104 * 109 105 * @param v New value of PSTATE register. 110 */ 111 static inline void pstate_write(uint64_t v) 112 { 113 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 ); 114 115 } 115 116 … … 117 118 * 118 119 * @return Value of TICK_comapre register. 119 */ 120 static inline uint64_t tick_compare_read(void) 121 { 122 uint64_t v; 123 124 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 ); 125 130 126 131 return v; … … 130 135 * 131 136 * @param v New value of TICK_comapre register. 132 */ 133 static inline void tick_compare_write(uint64_t v) 134 { 135 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 ); 136 146 } 137 147 … … 139 149 * 140 150 * @return Value of STICK_compare register. 141 */ 142 static inline uint64_t stick_compare_read(void) 143 { 144 uint64_t v; 145 146 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 ); 147 161 148 162 return v; … … 152 166 * 153 167 * @param v New value of STICK_comapre register. 154 */ 155 static inline void stick_compare_write(uint64_t v) 156 { 157 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 ); 158 177 } 159 178 … … 161 180 * 162 181 * @return Value of TICK register. 163 */ 164 static inline uint64_t tick_read(void) 165 { 166 uint64_t v; 167 168 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 ); 169 192 170 193 return v; … … 174 197 * 175 198 * @param v New value of TICK register. 176 */ 177 static inline void tick_write(uint64_t v) 178 { 179 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 ); 180 208 } 181 209 … … 183 211 * 184 212 * @return Value of FPRS register. 185 */ 186 static inline uint64_t fprs_read(void) 187 { 188 uint64_t v; 189 190 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 ); 191 223 192 224 return v; … … 196 228 * 197 229 * @param v New value of FPRS register. 198 */ 199 static inline void fprs_write(uint64_t v) 200 { 201 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 ); 202 239 } 203 240 … … 205 242 * 206 243 * @return Value of SOFTINT register. 207 */ 208 static inline uint64_t softint_read(void) 209 { 210 uint64_t v; 211 212 asm volatile ("rd %%softint, %0\n" : "=r" (v)); 213 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 214 255 return v; 215 256 } … … 218 259 * 219 260 * @param v New value of SOFTINT register. 220 */ 221 static inline void softint_write(uint64_t v) 222 { 223 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 ); 224 270 } 225 271 … … 229 275 * 230 276 * @param v New value of CLEAR_SOFTINT register. 231 */ 232 static inline void clear_softint_write(uint64_t v) 233 { 234 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 ); 235 286 } 236 287 … … 240 291 * 241 292 * @param v New value of SET_SOFTINT register. 242 */ 243 static inline void set_softint_write(uint64_t v) 244 { 245 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 ); 246 302 } 247 303 … … 252 308 * 253 309 * @return Old interrupt priority level. 254 */ 255 static inline ipl_t interrupts_enable(void) { 310 * 311 */ 312 NO_TRACE static inline ipl_t interrupts_enable(void) { 256 313 pstate_reg_t pstate; 257 uint64_t value; 258 259 value = pstate_read(); 314 uint64_t value = pstate_read(); 315 260 316 pstate.value = value; 261 317 pstate.ie = true; … … 271 327 * 272 328 * @return Old interrupt priority level. 273 */ 274 static inline ipl_t interrupts_disable(void) { 329 * 330 */ 331 NO_TRACE static inline ipl_t interrupts_disable(void) { 275 332 pstate_reg_t pstate; 276 uint64_t value; 277 278 value = pstate_read(); 333 uint64_t value = pstate_read(); 334 279 335 pstate.value = value; 280 336 pstate.ie = false; … … 289 345 * 290 346 * @param ipl Saved interrupt priority level. 291 */ 292 static inline void interrupts_restore(ipl_t ipl) { 347 * 348 */ 349 NO_TRACE static inline void interrupts_restore(ipl_t ipl) { 293 350 pstate_reg_t pstate; 294 351 … … 303 360 * 304 361 * @return Current interrupt priority level. 305 */ 306 static inline ipl_t interrupts_read(void) { 362 * 363 */ 364 NO_TRACE static inline ipl_t interrupts_read(void) { 307 365 return (ipl_t) pstate_read(); 308 366 } … … 313 371 * 314 372 */ 315 static inline bool interrupts_disabled(void)373 NO_TRACE static inline bool interrupts_disabled(void) 316 374 { 317 375 pstate_reg_t pstate; 318 376 319 377 pstate.value = pstate_read(); 320 378 return !pstate.ie; … … 326 384 * The stack is assumed to be STACK_SIZE bytes long. 327 385 * The stack must start on page boundary. 328 */ 329 static inline uintptr_t get_stack_base(void) 386 * 387 */ 388 NO_TRACE static inline uintptr_t get_stack_base(void) 330 389 { 331 390 uintptr_t unbiased_sp; 332 391 333 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 ); 334 397 335 398 return ALIGN_DOWN(unbiased_sp, STACK_SIZE); … … 339 402 * 340 403 * @return Value of VER register. 341 */ 342 static inline uint64_t ver_read(void) 343 { 344 uint64_t v; 345 346 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 ); 347 414 348 415 return v; … … 352 419 * 353 420 * @return Current value in TPC. 354 */ 355 static inline uint64_t tpc_read(void) 356 { 357 uint64_t v; 358 359 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 ); 360 431 361 432 return v; … … 365 436 * 366 437 * @return Current value in TL. 367 */ 368 static inline uint64_t tl_read(void) 369 { 370 uint64_t v; 371 372 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 ); 373 448 374 449 return v; … … 378 453 * 379 454 * @return Current value in TBA. 380 */ 381 static inline uint64_t tba_read(void) 382 { 383 uint64_t v; 384 385 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 ); 386 465 387 466 return v; … … 391 470 * 392 471 * @param v New value of TBA. 393 */ 394 static inline void tba_write(uint64_t v) 395 { 396 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 ); 397 481 } 398 482 … … 400 484 * 401 485 * @param asi ASI determining the alternate space. 402 * @param va Virtual address within the ASI. 403 * 404 * @return Value read from the virtual address in the specified address space. 405 */ 406 static inline uint64_t asi_u64_read(asi_t asi, uintptr_t va) 407 { 408 uint64_t v; 409 410 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 ); 411 502 412 503 return v; … … 416 507 * 417 508 * @param asi ASI determining the alternate space. 418 * @param va Virtual address within the ASI. 419 * @param v Value to be written. 420 */ 421 static inline void asi_u64_write(asi_t asi, uintptr_t va, uint64_t v) 422 { 423 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 ); 424 522 } 425 523 426 524 /** Flush all valid register windows to memory. */ 427 static inline void flushw(void)525 NO_TRACE static inline void flushw(void) 428 526 { 429 527 asm volatile ("flushw\n"); … … 431 529 432 530 /** Switch to nucleus by setting TL to 1. */ 433 static inline void nucleus_enter(void)531 NO_TRACE static inline void nucleus_enter(void) 434 532 { 435 533 asm volatile ("wrpr %g0, 1, %tl\n"); … … 437 535 438 536 /** Switch from nucleus by setting TL to 0. */ 439 static inline void nucleus_leave(void)537 NO_TRACE static inline void nucleus_leave(void) 440 538 { 441 539 asm volatile ("wrpr %g0, %g0, %tl\n"); -
kernel/arch/sparc64/include/atomic.h
re3ee9b9 r7a0359b 39 39 #include <typedefs.h> 40 40 #include <preemption.h> 41 #include <trace.h> 41 42 42 43 /** Atomic add operation. … … 50 51 * 51 52 */ 52 static inline atomic_count_t atomic_add(atomic_t *val, atomic_count_t i) 53 NO_TRACE static inline atomic_count_t atomic_add(atomic_t *val, 54 atomic_count_t i) 53 55 { 54 56 atomic_count_t a; … … 72 74 } 73 75 74 static inline atomic_count_t atomic_preinc(atomic_t *val)76 NO_TRACE static inline atomic_count_t atomic_preinc(atomic_t *val) 75 77 { 76 78 return atomic_add(val, 1) + 1; 77 79 } 78 80 79 static inline atomic_count_t atomic_postinc(atomic_t *val)81 NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val) 80 82 { 81 83 return atomic_add(val, 1); 82 84 } 83 85 84 static inline atomic_count_t atomic_predec(atomic_t *val)86 NO_TRACE static inline atomic_count_t atomic_predec(atomic_t *val) 85 87 { 86 88 return atomic_add(val, -1) - 1; 87 89 } 88 90 89 static inline atomic_count_t atomic_postdec(atomic_t *val)91 NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val) 90 92 { 91 93 return atomic_add(val, -1); 92 94 } 93 95 94 static inline void atomic_inc(atomic_t *val)96 NO_TRACE static inline void atomic_inc(atomic_t *val) 95 97 { 96 98 (void) atomic_add(val, 1); 97 99 } 98 100 99 static inline void atomic_dec(atomic_t *val)101 NO_TRACE static inline void atomic_dec(atomic_t *val) 100 102 { 101 103 (void) atomic_add(val, -1); 102 104 } 103 105 104 static inline atomic_count_t test_and_set(atomic_t *val)106 NO_TRACE static inline atomic_count_t test_and_set(atomic_t *val) 105 107 { 106 108 atomic_count_t v = 1; … … 117 119 } 118 120 119 static inline void atomic_lock_arch(atomic_t *val)121 NO_TRACE static inline void atomic_lock_arch(atomic_t *val) 120 122 { 121 123 atomic_count_t tmp1 = 1; -
kernel/arch/sparc64/include/barrier.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 36 36 #define KERN_sparc64_BARRIER_H_ 37 37 38 #include <trace.h> 39 38 40 #ifdef KERNEL 41 39 42 #include <typedefs.h> 43 40 44 #else 45 41 46 #include <stdint.h> 47 42 48 #endif 43 49 … … 45 51 * Our critical section barriers are prepared for the weakest RMO memory model. 46 52 */ 47 #define CS_ENTER_BARRIER() \ 48 asm volatile ( \ 49 "membar #LoadLoad | #LoadStore\n" \ 50 ::: "memory" \ 51 ) 52 #define CS_LEAVE_BARRIER() \ 53 asm volatile ( \ 54 "membar #StoreStore\n" \ 55 "membar #LoadStore\n" \ 56 ::: "memory" \ 53 #define CS_ENTER_BARRIER() \ 54 asm volatile ( \ 55 "membar #LoadLoad | #LoadStore\n" \ 56 ::: "memory" \ 57 57 ) 58 58 59 #define memory_barrier()\60 asm volatile ( "membar #LoadLoad | #StoreStore\n" ::: "memory")61 #define read_barrier()\62 asm volatile ("membar #LoadLoad\n" ::: "memory")63 #define write_barrier()\64 asm volatile ("membar #StoreStore\n" ::: "memory")59 #define CS_LEAVE_BARRIER() \ 60 asm volatile ( \ 61 "membar #StoreStore\n" \ 62 "membar #LoadStore\n" \ 63 ::: "memory" \ 64 ) 65 65 66 #define flush(a) \ 67 asm volatile ("flush %0\n" :: "r" ((a)) : "memory") 66 #define memory_barrier() \ 67 asm volatile ( \ 68 "membar #LoadLoad | #StoreStore\n" \ 69 ::: "memory" \ 70 ) 71 72 #define read_barrier() \ 73 asm volatile ( \ 74 "membar #LoadLoad\n" \ 75 ::: "memory" \ 76 ) 77 78 #define write_barrier() \ 79 asm volatile ( \ 80 "membar #StoreStore\n" \ 81 ::: "memory" \ 82 ) 83 84 #define flush(a) \ 85 asm volatile ( \ 86 "flush %[reg]\n" \ 87 :: [reg] "r" ((a)) \ 88 : "memory" \ 89 ) 68 90 69 91 /** Flush Instruction pipeline. */ 70 static inline void flush_pipeline(void)92 NO_TRACE static inline void flush_pipeline(void) 71 93 { 72 94 uint64_t pc; 73 95 74 96 /* 75 97 * The FLUSH instruction takes address parameter. … … 80 102 * the %pc register will always be in the range mapped by 81 103 * DTLB. 104 * 82 105 */ 83 84 85 "rd %%pc, % 0\n"86 "flush % 0\n"87 : "=&r" (pc)106 107 asm volatile ( 108 "rd %%pc, %[pc]\n" 109 "flush %[pc]\n" 110 : [pc] "=&r" (pc) 88 111 ); 89 112 } 90 113 91 114 /** Memory Barrier instruction. */ 92 static inline void membar(void)115 NO_TRACE static inline void membar(void) 93 116 { 94 asm volatile ("membar #Sync\n"); 117 asm volatile ( 118 "membar #Sync\n" 119 ); 95 120 } 96 121 97 122 #if defined (US) 98 123 99 #define smc_coherence(a) \ 100 { \ 101 write_barrier(); \ 102 flush((a)); \ 103 } 124 #define FLUSH_INVAL_MIN 4 104 125 105 #define FLUSH_INVAL_MIN 4 106 #define smc_coherence_block(a, l) \ 107 { \ 108 unsigned long i; \ 109 write_barrier(); \ 110 for (i = 0; i < (l); i += FLUSH_INVAL_MIN) \ 111 flush((void *)(a) + i); \ 112 } 126 #define smc_coherence(a) \ 127 do { \ 128 write_barrier(); \ 129 flush((a)); \ 130 } while (0) 131 132 #define smc_coherence_block(a, l) \ 133 do { \ 134 unsigned long i; \ 135 write_barrier(); \ 136 \ 137 for (i = 0; i < (l); i += FLUSH_INVAL_MIN) \ 138 flush((void *)(a) + i); \ 139 } while (0) 113 140 114 141 #elif defined (US3) 115 142 116 #define smc_coherence(a) 117 {\118 write_barrier();\119 flush_pipeline();\120 } 143 #define smc_coherence(a) \ 144 do { \ 145 write_barrier(); \ 146 flush_pipeline(); \ 147 } while (0) 121 148 122 #define smc_coherence_block(a, l) 123 {\124 write_barrier();\125 flush_pipeline();\126 } 149 #define smc_coherence_block(a, l) \ 150 do { \ 151 write_barrier(); \ 152 flush_pipeline(); \ 153 } while (0) 127 154 128 #endif 155 #endif /* defined(US3) */ 129 156 130 157 #endif -
kernel/arch/sparc64/include/cycle.h
re3ee9b9 r7a0359b 36 36 #define KERN_sparc64_CYCLE_H_ 37 37 38 #include <arch/asm.h> 38 #include <arch/asm.h> 39 #include <trace.h> 39 40 40 static inline uint64_t get_cycle(void)41 NO_TRACE static inline uint64_t get_cycle(void) 41 42 { 42 43 return tick_read(); -
kernel/arch/sparc64/include/faddr.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 38 38 #include <typedefs.h> 39 39 40 #define FADDR(fptr) 40 #define FADDR(fptr) ((uintptr_t) (fptr)) 41 41 42 42 #endif -
kernel/arch/sparc64/include/interrupt.h
re3ee9b9 r7a0359b 39 39 #include <typedefs.h> 40 40 #include <arch/regdef.h> 41 #include <trace.h> 41 42 42 #define IVT_ITEMS 43 #define IVT_FIRST 43 #define IVT_ITEMS 15 44 #define IVT_FIRST 1 44 45 45 46 /* This needs to be defined for inter-architecture API portability. */ 46 #define VECTOR_TLB_SHOOTDOWN_IPI 47 #define VECTOR_TLB_SHOOTDOWN_IPI 0 47 48 48 49 enum { 49 50 IPI_TLB_SHOOTDOWN = VECTOR_TLB_SHOOTDOWN_IPI 50 }; 51 }; 51 52 52 53 typedef struct istate { 53 uint64_t 54 uint64_t 55 uint64_t 54 uint64_t tnpc; 55 uint64_t tpc; 56 uint64_t tstate; 56 57 } istate_t; 57 58 58 static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) 59 NO_TRACE static inline void istate_set_retaddr(istate_t *istate, 60 uintptr_t retaddr) 59 61 { 60 62 istate->tpc = retaddr; 61 63 } 62 64 63 static inline int istate_from_uspace(istate_t *istate)65 NO_TRACE static inline int istate_from_uspace(istate_t *istate) 64 66 { 65 67 return !(istate->tstate & TSTATE_PRIV_BIT); 66 68 } 67 69 68 static inline unative_t istate_get_pc(istate_t *istate)70 NO_TRACE static inline unative_t istate_get_pc(istate_t *istate) 69 71 { 70 72 return istate->tpc; 71 73 } 72 74 73 static inline unative_t istate_get_fp(istate_t *istate)75 NO_TRACE static inline unative_t istate_get_fp(istate_t *istate) 74 76 { 75 return 0; /* TODO */ 77 /* TODO */ 78 79 return 0; 76 80 } 77 81 -
kernel/arch/sparc64/include/mm/as.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 37 37 38 38 #if defined (SUN4U) 39 39 40 #include <arch/mm/sun4u/as.h> 41 40 42 #elif defined (SUN4V) 43 41 44 #include <arch/mm/sun4v/as.h> 45 42 46 #endif 43 47 -
kernel/arch/sparc64/include/mm/frame.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 37 37 38 38 #if defined (SUN4U) 39 39 40 #include <arch/mm/sun4u/frame.h> 41 40 42 #elif defined (SUN4V) 43 41 44 #include <arch/mm/sun4v/frame.h> 45 42 46 #endif 43 47 -
kernel/arch/sparc64/include/mm/sun4u/tlb.h
re3ee9b9 r7a0359b 100 100 #include <arch/barrier.h> 101 101 #include <typedefs.h> 102 #include <trace.h> 102 103 #include <arch/register.h> 103 104 #include <arch/cpu.h> … … 242 243 * Determine the number of entries in the DMMU's small TLB. 243 244 */ 244 static inline uint16_t tlb_dsmall_size(void)245 NO_TRACE static inline uint16_t tlb_dsmall_size(void) 245 246 { 246 247 return 16; … … 250 251 * Determine the number of entries in each DMMU's big TLB. 251 252 */ 252 static inline uint16_t tlb_dbig_size(void)253 NO_TRACE static inline uint16_t tlb_dbig_size(void) 253 254 { 254 255 return 512; … … 258 259 * Determine the number of entries in the IMMU's small TLB. 259 260 */ 260 static inline uint16_t tlb_ismall_size(void)261 NO_TRACE static inline uint16_t tlb_ismall_size(void) 261 262 { 262 263 return 16; … … 266 267 * Determine the number of entries in the IMMU's big TLB. 267 268 */ 268 static inline uint16_t tlb_ibig_size(void)269 NO_TRACE static inline uint16_t tlb_ibig_size(void) 269 270 { 270 271 if (((ver_reg_t) ver_read()).impl == IMPL_ULTRASPARCIV_PLUS) … … 280 281 * @return Current value of Primary Context Register. 281 282 */ 282 static inline uint64_t mmu_primary_context_read(void)283 NO_TRACE static inline uint64_t mmu_primary_context_read(void) 283 284 { 284 285 return asi_u64_read(ASI_DMMU, VA_PRIMARY_CONTEXT_REG); … … 289 290 * @param v New value of Primary Context Register. 290 291 */ 291 static inline void mmu_primary_context_write(uint64_t v)292 NO_TRACE static inline void mmu_primary_context_write(uint64_t v) 292 293 { 293 294 asi_u64_write(ASI_DMMU, VA_PRIMARY_CONTEXT_REG, v); … … 299 300 * @return Current value of Secondary Context Register. 300 301 */ 301 static inline uint64_t mmu_secondary_context_read(void)302 NO_TRACE static inline uint64_t mmu_secondary_context_read(void) 302 303 { 303 304 return asi_u64_read(ASI_DMMU, VA_SECONDARY_CONTEXT_REG); … … 308 309 * @param v New value of Primary Context Register. 309 310 */ 310 static inline void mmu_secondary_context_write(uint64_t v)311 NO_TRACE static inline void mmu_secondary_context_write(uint64_t v) 311 312 { 312 313 asi_u64_write(ASI_DMMU, VA_SECONDARY_CONTEXT_REG, v); … … 323 324 * Register. 324 325 */ 325 static inline uint64_t itlb_data_access_read(size_t entry)326 NO_TRACE static inline uint64_t itlb_data_access_read(size_t entry) 326 327 { 327 328 itlb_data_access_addr_t reg; … … 337 338 * @param value Value to be written. 338 339 */ 339 static inline void itlb_data_access_write(size_t entry, uint64_t value)340 NO_TRACE static inline void itlb_data_access_write(size_t entry, uint64_t value) 340 341 { 341 342 itlb_data_access_addr_t reg; … … 354 355 * Register. 355 356 */ 356 static inline uint64_t dtlb_data_access_read(size_t entry)357 NO_TRACE static inline uint64_t dtlb_data_access_read(size_t entry) 357 358 { 358 359 dtlb_data_access_addr_t reg; … … 368 369 * @param value Value to be written. 369 370 */ 370 static inline void dtlb_data_access_write(size_t entry, uint64_t value)371 NO_TRACE static inline void dtlb_data_access_write(size_t entry, uint64_t value) 371 372 { 372 373 dtlb_data_access_addr_t reg; … … 384 385 * @return Current value of specified IMMU TLB Tag Read Register. 385 386 */ 386 static inline uint64_t itlb_tag_read_read(size_t entry)387 NO_TRACE static inline uint64_t itlb_tag_read_read(size_t entry) 387 388 { 388 389 itlb_tag_read_addr_t tag; … … 399 400 * @return Current value of specified DMMU TLB Tag Read Register. 400 401 */ 401 static inline uint64_t dtlb_tag_read_read(size_t entry)402 NO_TRACE static inline uint64_t dtlb_tag_read_read(size_t entry) 402 403 { 403 404 dtlb_tag_read_addr_t tag; … … 419 420 * Register. 420 421 */ 421 static inline uint64_t itlb_data_access_read(int tlb, size_t entry)422 NO_TRACE static inline uint64_t itlb_data_access_read(int tlb, size_t entry) 422 423 { 423 424 itlb_data_access_addr_t reg; … … 434 435 * @param value Value to be written. 435 436 */ 436 static inline void itlb_data_access_write(int tlb, size_t entry,437 NO_TRACE static inline void itlb_data_access_write(int tlb, size_t entry, 437 438 uint64_t value) 438 439 { … … 454 455 * Register. 455 456 */ 456 static inline uint64_t dtlb_data_access_read(int tlb, size_t entry)457 NO_TRACE static inline uint64_t dtlb_data_access_read(int tlb, size_t entry) 457 458 { 458 459 dtlb_data_access_addr_t reg; … … 470 471 * @param value Value to be written. 471 472 */ 472 static inline void dtlb_data_access_write(int tlb, size_t entry,473 NO_TRACE static inline void dtlb_data_access_write(int tlb, size_t entry, 473 474 uint64_t value) 474 475 { … … 489 490 * @return Current value of specified IMMU TLB Tag Read Register. 490 491 */ 491 static inline uint64_t itlb_tag_read_read(int tlb, size_t entry)492 NO_TRACE static inline uint64_t itlb_tag_read_read(int tlb, size_t entry) 492 493 { 493 494 itlb_tag_read_addr_t tag; … … 506 507 * @return Current value of specified DMMU TLB Tag Read Register. 507 508 */ 508 static inline uint64_t dtlb_tag_read_read(int tlb, size_t entry)509 NO_TRACE static inline uint64_t dtlb_tag_read_read(int tlb, size_t entry) 509 510 { 510 511 dtlb_tag_read_addr_t tag; … … 523 524 * @param v Value to be written. 524 525 */ 525 static inline void itlb_tag_access_write(uint64_t v)526 NO_TRACE static inline void itlb_tag_access_write(uint64_t v) 526 527 { 527 528 asi_u64_write(ASI_IMMU, VA_IMMU_TAG_ACCESS, v); … … 533 534 * @return Current value of IMMU TLB Tag Access Register. 534 535 */ 535 static inline uint64_t itlb_tag_access_read(void)536 NO_TRACE static inline uint64_t itlb_tag_access_read(void) 536 537 { 537 538 return asi_u64_read(ASI_IMMU, VA_IMMU_TAG_ACCESS); … … 542 543 * @param v Value to be written. 543 544 */ 544 static inline void dtlb_tag_access_write(uint64_t v)545 NO_TRACE static inline void dtlb_tag_access_write(uint64_t v) 545 546 { 546 547 asi_u64_write(ASI_DMMU, VA_DMMU_TAG_ACCESS, v); … … 552 553 * @return Current value of DMMU TLB Tag Access Register. 553 554 */ 554 static inline uint64_t dtlb_tag_access_read(void)555 NO_TRACE static inline uint64_t dtlb_tag_access_read(void) 555 556 { 556 557 return asi_u64_read(ASI_DMMU, VA_DMMU_TAG_ACCESS); … … 562 563 * @param v Value to be written. 563 564 */ 564 static inline void itlb_data_in_write(uint64_t v)565 NO_TRACE static inline void itlb_data_in_write(uint64_t v) 565 566 { 566 567 asi_u64_write(ASI_ITLB_DATA_IN_REG, 0, v); … … 572 573 * @param v Value to be written. 573 574 */ 574 static inline void dtlb_data_in_write(uint64_t v)575 NO_TRACE static inline void dtlb_data_in_write(uint64_t v) 575 576 { 576 577 asi_u64_write(ASI_DTLB_DATA_IN_REG, 0, v); … … 582 583 * @return Current content of I-SFSR register. 583 584 */ 584 static inline uint64_t itlb_sfsr_read(void)585 NO_TRACE static inline uint64_t itlb_sfsr_read(void) 585 586 { 586 587 return asi_u64_read(ASI_IMMU, VA_IMMU_SFSR); … … 591 592 * @param v New value of I-SFSR register. 592 593 */ 593 static inline void itlb_sfsr_write(uint64_t v)594 NO_TRACE static inline void itlb_sfsr_write(uint64_t v) 594 595 { 595 596 asi_u64_write(ASI_IMMU, VA_IMMU_SFSR, v); … … 601 602 * @return Current content of D-SFSR register. 602 603 */ 603 static inline uint64_t dtlb_sfsr_read(void)604 NO_TRACE static inline uint64_t dtlb_sfsr_read(void) 604 605 { 605 606 return asi_u64_read(ASI_DMMU, VA_DMMU_SFSR); … … 610 611 * @param v New value of D-SFSR register. 611 612 */ 612 static inline void dtlb_sfsr_write(uint64_t v)613 NO_TRACE static inline void dtlb_sfsr_write(uint64_t v) 613 614 { 614 615 asi_u64_write(ASI_DMMU, VA_DMMU_SFSR, v); … … 620 621 * @return Current content of D-SFAR register. 621 622 */ 622 static inline uint64_t dtlb_sfar_read(void)623 NO_TRACE static inline uint64_t dtlb_sfar_read(void) 623 624 { 624 625 return asi_u64_read(ASI_DMMU, VA_DMMU_SFAR); … … 633 634 * @param page Address which is on the page to be demapped. 634 635 */ 635 static inline void itlb_demap(int type, int context_encoding, uintptr_t page)636 NO_TRACE static inline void itlb_demap(int type, int context_encoding, uintptr_t page) 636 637 { 637 638 tlb_demap_addr_t da; … … 659 660 * @param page Address which is on the page to be demapped. 660 661 */ 661 static inline void dtlb_demap(int type, int context_encoding, uintptr_t page)662 NO_TRACE static inline void dtlb_demap(int type, int context_encoding, uintptr_t page) 662 663 { 663 664 tlb_demap_addr_t da; -
kernel/arch/sparc64/include/mm/sun4v/tlb.h
re3ee9b9 r7a0359b 43 43 44 44 #include <arch/mm/tte.h> 45 #include < print.h>45 #include <trace.h> 46 46 #include <arch/mm/mmu.h> 47 47 #include <arch/mm/page.h> … … 88 88 * @return Current value of Primary Context Register. 89 89 */ 90 static inline uint64_t mmu_primary_context_read(void)90 NO_TRACE static inline uint64_t mmu_primary_context_read(void) 91 91 { 92 92 return asi_u64_read(ASI_PRIMARY_CONTEXT_REG, VA_PRIMARY_CONTEXT_REG); 93 93 } 94 94 95 95 /** Write MMU Primary Context Register. 96 96 * 97 97 * @param v New value of Primary Context Register. 98 98 */ 99 static inline void mmu_primary_context_write(uint64_t v)99 NO_TRACE static inline void mmu_primary_context_write(uint64_t v) 100 100 { 101 101 asi_u64_write(ASI_PRIMARY_CONTEXT_REG, VA_PRIMARY_CONTEXT_REG, v); 102 102 } 103 103 104 104 /** Read MMU Secondary Context Register. 105 105 * 106 106 * @return Current value of Secondary Context Register. 107 107 */ 108 static inline uint64_t mmu_secondary_context_read(void)108 NO_TRACE static inline uint64_t mmu_secondary_context_read(void) 109 109 { 110 110 return asi_u64_read(ASI_SECONDARY_CONTEXT_REG, VA_SECONDARY_CONTEXT_REG); 111 111 } 112 112 113 113 /** Write MMU Secondary Context Register. 114 114 * 115 115 * @param v New value of Secondary Context Register. 116 116 */ 117 static inline void mmu_secondary_context_write(uint64_t v)117 NO_TRACE static inline void mmu_secondary_context_write(uint64_t v) 118 118 { 119 119 asi_u64_write(ASI_SECONDARY_CONTEXT_REG, VA_SECONDARY_CONTEXT_REG, v); … … 126 126 * @param mmu_flag MMU_FLAG_DTLB, MMU_FLAG_ITLB or a combination of both 127 127 */ 128 static inline void mmu_demap_ctx(int context, int mmu_flag) {128 NO_TRACE static inline void mmu_demap_ctx(int context, int mmu_flag) { 129 129 __hypercall_fast4(MMU_DEMAP_CTX, 0, 0, context, mmu_flag); 130 130 } … … 137 137 * @param mmu_flag MMU_FLAG_DTLB, MMU_FLAG_ITLB or a combination of both 138 138 */ 139 static inline void mmu_demap_page(uintptr_t vaddr, int context, int mmu_flag) {139 NO_TRACE static inline void mmu_demap_page(uintptr_t vaddr, int context, int mmu_flag) { 140 140 __hypercall_fast5(MMU_DEMAP_PAGE, 0, 0, vaddr, context, mmu_flag); 141 141 } -
kernel/arch/sparc64/include/mm/tlb.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 36 36 #define KERN_sparc64_TLB_H_ 37 37 38 #if defined (SUN4U) 38 39 39 #if defined (SUN4U)40 40 #include <arch/mm/sun4u/tlb.h> 41 41 42 #elif defined (SUN4V) 43 42 44 #include <arch/mm/sun4v/tlb.h> 45 43 46 #endif 44 47 -
kernel/arch/sparc64/include/sun4u/asm.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 36 36 #define KERN_sparc64_sun4u_ASM_H_ 37 37 38 extern uint64_t read_from_ag_g7(void); 39 extern void write_to_ag_g6(uint64_t val); 40 extern void write_to_ag_g7(uint64_t val); 41 extern void write_to_ig_g6(uint64_t val); 42 38 #include <trace.h> 43 39 44 40 /** Read Version Register. 45 41 * 46 42 * @return Value of VER register. 43 * 47 44 */ 48 static inline uint64_t ver_read(void)45 NO_TRACE static inline uint64_t ver_read(void) 49 46 { 50 47 uint64_t v; 51 48 52 asm volatile ("rdpr %%ver, %0\n" : "=r" (v)); 49 asm volatile ( 50 "rdpr %%ver, %[v]\n" 51 : [v] "=r" (v) 52 ); 53 53 54 54 return v; 55 55 } 56 57 extern uint64_t read_from_ag_g7(void); 58 extern void write_to_ag_g6(uint64_t); 59 extern void write_to_ag_g7(uint64_t); 60 extern void write_to_ig_g6(uint64_t); 56 61 57 62 #endif -
kernel/arch/sparc64/include/sun4u/cpu.h
re3ee9b9 r7a0359b 36 36 #define KERN_sparc64_sun4u_CPU_H_ 37 37 38 #define MANUF_FUJITSU 39 #define MANUF_ULTRASPARC 0x17/**< UltraSPARC I, UltraSPARC II */40 #define MANUF_SUN 38 #define MANUF_FUJITSU 0x04 39 #define MANUF_ULTRASPARC 0x17 /**< UltraSPARC I, UltraSPARC II */ 40 #define MANUF_SUN 0x3e 41 41 42 #define IMPL_ULTRASPARCI 43 #define IMPL_ULTRASPARCII 44 #define IMPL_ULTRASPARCII_I 45 #define IMPL_ULTRASPARCII_E 46 #define IMPL_ULTRASPARCIII 47 #define IMPL_ULTRASPARCIII_PLUS 48 #define IMPL_ULTRASPARCIII_I 49 #define IMPL_ULTRASPARCIV 50 #define IMPL_ULTRASPARCIV_PLUS 42 #define IMPL_ULTRASPARCI 0x10 43 #define IMPL_ULTRASPARCII 0x11 44 #define IMPL_ULTRASPARCII_I 0x12 45 #define IMPL_ULTRASPARCII_E 0x13 46 #define IMPL_ULTRASPARCIII 0x14 47 #define IMPL_ULTRASPARCIII_PLUS 0x15 48 #define IMPL_ULTRASPARCIII_I 0x16 49 #define IMPL_ULTRASPARCIV 0x18 50 #define IMPL_ULTRASPARCIV_PLUS 0x19 51 51 52 #define IMPL_SPARC64V 52 #define IMPL_SPARC64V 0x5 53 53 54 54 #ifndef __ASM__ … … 58 58 #include <arch/regdef.h> 59 59 #include <arch/asm.h> 60 #include <trace.h> 60 61 61 62 #ifdef CONFIG_SMP … … 64 65 65 66 typedef struct { 66 uint32_t mid; 67 67 uint32_t mid; /**< Processor ID as read from 68 UPA_CONFIG/FIREPLANE_CONFIG. */ 68 69 ver_reg_t ver; 69 uint32_t clock_frequency; 70 uint64_t next_tick_cmpr; 71 72 70 uint32_t clock_frequency; /**< Processor frequency in Hz. */ 71 uint64_t next_tick_cmpr; /**< Next clock interrupt should be 72 generated when the TICK register 73 matches this value. */ 73 74 } cpu_arch_t; 74 75 75 76 /** 77 * Reads the module ID (agent ID/CPUID) of the current CPU. 76 /** Read the module ID (agent ID/CPUID) of the current CPU. 77 * 78 78 */ 79 static inline uint32_t read_mid(void)79 NO_TRACE static inline uint32_t read_mid(void) 80 80 { 81 81 uint64_t icbus_config = asi_u64_read(ASI_ICBUS_CONFIG, 0); 82 82 icbus_config = icbus_config >> ICBUS_CONFIG_MID_SHIFT; 83 83 84 #if defined (US) 84 85 return icbus_config & 0x1f; … … 91 92 } 92 93 93 #endif 94 #endif 94 95 95 96 #endif -
kernel/arch/sparc64/include/sun4v/asm.h
re3ee9b9 r7a0359b 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ -
kernel/arch/sparc64/include/sun4v/cpu.h
re3ee9b9 r7a0359b 37 37 38 38 /** Maximum number of virtual processors. */ 39 #define MAX_NUM_STRANDS 39 #define MAX_NUM_STRANDS 64 40 40 41 41 /** Maximum number of logical processors in a processor core */ 42 #define MAX_CORE_STRANDS 42 #define MAX_CORE_STRANDS 8 43 43 44 44 #ifndef __ASM__ … … 59 59 60 60 typedef struct cpu_arch { 61 uint64_t id; 62 uint32_t clock_frequency; 63 uint64_t next_tick_cmpr; 64 65 66 exec_unit_t *exec_unit; 67 unsigned long proposed_nrdy; 68 61 uint64_t id; /**< virtual processor ID */ 62 uint32_t clock_frequency; /**< Processor frequency in Hz. */ 63 uint64_t next_tick_cmpr; /**< Next clock interrupt should be 64 generated when the TICK register 65 matches this value. */ 66 exec_unit_t *exec_unit; /**< Physical core. */ 67 unsigned long proposed_nrdy; /**< Proposed No. of ready threads 68 so that cores are equally balanced. */ 69 69 } cpu_arch_t; 70 71 #endif72 73 #ifdef __ASM__74 70 75 71 #endif
Note:
See TracChangeset
for help on using the changeset viewer.