1 //Original:/proj/frio/dv/testcases/seq/se_cc2stat_haz/se_cc2stat_haz.dsp 2 // Description: 3 // Verify CC hazards under the following condition: 4 // 5 // (1a) cc2stat (that modifies CC) followed by that uses CC 6 // (1b) same as (1a) but kill cc2stat instruction in WB 7 // 8 // (2a) cc2stat (that modifies CC) followed by conditional branch (predicted) 9 // (2b) same as (2a) but kill cc2stat instruction in WB 10 // 11 // (3a) cc2stat (that modifies CC) followed by conditional branch (mispredicted) 12 // (3b) same as (3a) but kill cc2stat instruction in WB 13 // 14 // (4a) cc2stat (that modifies CC) followed by testset 15 // (4b) same as (4a) but kill cc2stat instruction in WB 16 // 17 // (5a) cc2stat (that modifies CC) followed by dag instruction that modifies CC 18 // (5b) same as (5a) but kill cc2stat instruction in WB 19 # mach: bfin 20 # sim: --environment operating 21 22 #include "test.h" 23 .include "testutils.inc" 24 start 25 26 // ---------------------------------------------------------------- 27 // Include Files 28 // ---------------------------------------------------------------- 29 30 include(std.inc) 31 include(selfcheck.inc) 32 include(symtable.inc) 33 include(mmrs.inc) 34 35 // ---------------------------------------------------------------- 36 // Defines 37 // ---------------------------------------------------------------- 38 39 #ifndef STACKSIZE 40 #define STACKSIZE 0x00000010 41 #endif 42 #ifndef ITABLE 43 #define ITABLE CODE_ADDR_1 // 44 #endif 45 46 // ---------------------------------------------------------------- 47 // Reset ISR 48 // - set the processor operating modes 49 // - initialize registers 50 // - etc ... 51 // ---------------------------------------------------------------- 52 53 RST_ISR: 54 55 // Initialize data registers 56 //INIT_R_REGS(0); 57 R7 = 0; 58 R6 = 0; 59 R5 = 0; 60 R4 = 0; 61 R3 = 0; 62 R2 = 0; 63 R1 = 0; 64 R0 = 0; 65 66 // Initialize pointer registers 67 INIT_P_REGS(0); 68 69 // Initialize address registers 70 INIT_I_REGS(0); 71 INIT_M_REGS(0); 72 INIT_L_REGS(0); 73 INIT_B_REGS(0); 74 75 // Initialize the address of the checkreg data segment 76 // **** THIS IS NEEDED WHENEVER CHECKREG IS USED **** 77 CHECK_INIT_DEF(p5); //CHECK_INIT(p5, 0x00BFFFFC); 78 79 // Inhibit events during MMR writes 80 CLI R1; 81 82 // Setup user stack 83 LD32_LABEL(sp, USTACK); 84 USP = SP; 85 86 // Setup kernel stack 87 LD32_LABEL(sp, KSTACK); 88 89 // Setup frame pointer 90 FP = SP; 91 92 // Setup event vector table 93 LD32(p0, EVT0); 94 95 LD32_LABEL(r0, EMU_ISR); // Emulation Handler (EVT0) 96 [ P0 ++ ] = R0; 97 LD32_LABEL(r0, RST_ISR); // Reset Handler (EVT1) 98 [ P0 ++ ] = R0; 99 LD32_LABEL(r0, NMI_ISR); // NMI Handler (EVT2) 100 [ P0 ++ ] = R0; 101 LD32_LABEL(r0, EXC_ISR); // Exception Handler (EVT3) 102 [ P0 ++ ] = R0; 103 [ P0 ++ ] = R0; // EVT4 not used 104 LD32_LABEL(r0, HWE_ISR); // HW Error Handler (EVT5) 105 [ P0 ++ ] = R0; 106 LD32_LABEL(r0, TMR_ISR); // Timer Handler (EVT6) 107 [ P0 ++ ] = R0; 108 LD32_LABEL(r0, IGV7_ISR); // IVG7 Handler 109 [ P0 ++ ] = R0; 110 LD32_LABEL(r0, IGV8_ISR); // IVG8 Handler 111 [ P0 ++ ] = R0; 112 LD32_LABEL(r0, IGV9_ISR); // IVG9 Handler 113 [ P0 ++ ] = R0; 114 LD32_LABEL(r0, IGV10_ISR); // IVG10 Handler 115 [ P0 ++ ] = R0; 116 LD32_LABEL(r0, IGV11_ISR); // IVG11 Handler 117 [ P0 ++ ] = R0; 118 LD32_LABEL(r0, IGV12_ISR); // IVG12 Handler 119 [ P0 ++ ] = R0; 120 LD32_LABEL(r0, IGV13_ISR); // IVG13 Handler 121 [ P0 ++ ] = R0; 122 LD32_LABEL(r0, IGV14_ISR); // IVG14 Handler 123 [ P0 ++ ] = R0; 124 LD32_LABEL(r0, IGV15_ISR); // IVG15 Handler 125 [ P0 ++ ] = R0; 126 127 // Set the EVT_OVERRIDE MMR 128 LD32(p0, EVT_OVERRIDE); 129 R0 = 0; 130 [ P0 ++ ] = R0; 131 132 // Disable L1 data cache 133 WR_MMR(DMEM_CONTROL, 0x00000000, p0, r0); 134 135 // Mask interrupts (*) 136 R1 = -1; 137 138 // Wait for MMR writes to finish 139 CSYNC; 140 141 // Re-enable events 142 STI R1; 143 144 // Reset accumulator registers 145 A0 = 0; 146 A1 = 0; 147 148 // Reset loop counters to deterministic values 149 R0 = 0 (Z); 150 151 LT0 = R0; 152 LB0 = R0; 153 LC0 = R0; 154 LT1 = R0; 155 LB1 = R0; 156 LC1 = R0; 157 158 // Reset other internal regs 159 ASTAT = R0; 160 SYSCFG = R0; 161 RETS = R0; 162 163 // Setup the test to run in USER mode 164 LD32_LABEL(r0, USER_CODE); 165 RETI = R0; 166 167 // Setup the test to run in SUPERVISOR mode 168 // Comment the following line for a USER mode test 169 JUMP.S SUPERVISOR_CODE; 170 RTI; 171 172 SUPERVISOR_CODE: 173 // Load IVG15 general handler (Int15) with MAIN_CODE 174 LD32_LABEL(p1, MAIN_CODE); 175 176 LD32(p0, EVT15); 177 178 CLI R1; 179 [ P0 ] = P1; 180 CSYNC; 181 STI R1; 182 183 // Take Int15 which branch to MAIN_CODE after RTI 184 RAISE 15; 185 RTI; 186 187 USER_CODE: 188 // Setup the stack pointer and the frame pointer 189 LD32_LABEL(sp, USTACK); 190 FP = SP; 191 JUMP.S MAIN_CODE; 192 193 .dw 0xFFFF 194 .dw 0xFFFF 195 .dw 0xFFFF 196 .dw 0xFFFF 197 .dw 0xFFFF 198 .dw 0xFFFF 199 .dw 0xFFFF 200 201 // ---------------------------------------------------------------- 202 // ISR Table 203 // ---------------------------------------------------------------- 204 205 206 // ---------------------------------------------------------------- 207 // EMU ISR 208 // ---------------------------------------------------------------- 209 210 EMU_ISR : 211 212 RTE; 213 214 .dw 0xFFFF 215 .dw 0xFFFF 216 .dw 0xFFFF 217 .dw 0xFFFF 218 .dw 0xFFFF 219 .dw 0xFFFF 220 .dw 0xFFFF 221 222 // ---------------------------------------------------------------- 223 // NMI ISR 224 // ---------------------------------------------------------------- 225 226 NMI_ISR : 227 228 RTN; 229 230 .dw 0xFFFF 231 .dw 0xFFFF 232 .dw 0xFFFF 233 .dw 0xFFFF 234 .dw 0xFFFF 235 .dw 0xFFFF 236 .dw 0xFFFF 237 238 // ---------------------------------------------------------------- 239 // EXC ISR 240 // ---------------------------------------------------------------- 241 242 EXC_ISR : 243 244 RTX; 245 246 .dw 0xFFFF 247 .dw 0xFFFF 248 .dw 0xFFFF 249 .dw 0xFFFF 250 .dw 0xFFFF 251 .dw 0xFFFF 252 .dw 0xFFFF 253 254 // ---------------------------------------------------------------- 255 // HWE ISR 256 // ---------------------------------------------------------------- 257 258 HWE_ISR : 259 260 RTI; 261 262 .dw 0xFFFF 263 .dw 0xFFFF 264 .dw 0xFFFF 265 .dw 0xFFFF 266 .dw 0xFFFF 267 .dw 0xFFFF 268 .dw 0xFFFF 269 270 // ---------------------------------------------------------------- 271 // TMR ISR 272 // ---------------------------------------------------------------- 273 274 TMR_ISR : 275 276 RTI; 277 278 .dw 0xFFFF 279 .dw 0xFFFF 280 .dw 0xFFFF 281 .dw 0xFFFF 282 .dw 0xFFFF 283 .dw 0xFFFF 284 .dw 0xFFFF 285 286 // ---------------------------------------------------------------- 287 // IGV7 ISR 288 // ---------------------------------------------------------------- 289 290 IGV7_ISR : 291 292 RTI; 293 294 .dw 0xFFFF 295 .dw 0xFFFF 296 .dw 0xFFFF 297 .dw 0xFFFF 298 .dw 0xFFFF 299 .dw 0xFFFF 300 .dw 0xFFFF 301 302 // ---------------------------------------------------------------- 303 // IGV8 ISR 304 // ---------------------------------------------------------------- 305 306 IGV8_ISR : 307 308 RTI; 309 310 .dw 0xFFFF 311 .dw 0xFFFF 312 .dw 0xFFFF 313 .dw 0xFFFF 314 .dw 0xFFFF 315 .dw 0xFFFF 316 .dw 0xFFFF 317 318 // ---------------------------------------------------------------- 319 // IGV9 ISR 320 // ---------------------------------------------------------------- 321 322 IGV9_ISR : 323 324 RTI; 325 326 .dw 0xFFFF 327 .dw 0xFFFF 328 .dw 0xFFFF 329 .dw 0xFFFF 330 .dw 0xFFFF 331 .dw 0xFFFF 332 .dw 0xFFFF 333 334 // ---------------------------------------------------------------- 335 // IGV10 ISR 336 // ---------------------------------------------------------------- 337 338 IGV10_ISR : 339 340 RTI; 341 342 .dw 0xFFFF 343 .dw 0xFFFF 344 .dw 0xFFFF 345 .dw 0xFFFF 346 .dw 0xFFFF 347 .dw 0xFFFF 348 .dw 0xFFFF 349 350 // ---------------------------------------------------------------- 351 // IGV11 ISR 352 // ---------------------------------------------------------------- 353 354 IGV11_ISR : 355 356 RTI; 357 358 .dw 0xFFFF 359 .dw 0xFFFF 360 .dw 0xFFFF 361 .dw 0xFFFF 362 .dw 0xFFFF 363 .dw 0xFFFF 364 .dw 0xFFFF 365 366 // ---------------------------------------------------------------- 367 // IGV12 ISR 368 // ---------------------------------------------------------------- 369 370 IGV12_ISR : 371 372 RTI; 373 374 .dw 0xFFFF 375 .dw 0xFFFF 376 .dw 0xFFFF 377 .dw 0xFFFF 378 .dw 0xFFFF 379 .dw 0xFFFF 380 .dw 0xFFFF 381 382 // ---------------------------------------------------------------- 383 // IGV13 ISR 384 // ---------------------------------------------------------------- 385 386 IGV13_ISR : 387 388 RTI; 389 390 .dw 0xFFFF 391 .dw 0xFFFF 392 .dw 0xFFFF 393 .dw 0xFFFF 394 .dw 0xFFFF 395 .dw 0xFFFF 396 .dw 0xFFFF 397 398 // ---------------------------------------------------------------- 399 // IGV14 ISR 400 // ---------------------------------------------------------------- 401 402 IGV14_ISR : 403 404 RTI; 405 406 .dw 0xFFFF 407 .dw 0xFFFF 408 .dw 0xFFFF 409 .dw 0xFFFF 410 .dw 0xFFFF 411 .dw 0xFFFF 412 .dw 0xFFFF 413 414 // ---------------------------------------------------------------- 415 // IGV15 ISR 416 // ---------------------------------------------------------------- 417 418 IGV15_ISR : 419 420 RTI; 421 422 .dw 0xFFFF 423 .dw 0xFFFF 424 .dw 0xFFFF 425 .dw 0xFFFF 426 .dw 0xFFFF 427 .dw 0xFFFF 428 .dw 0xFFFF 429 430 // ---------------------------------------------------------------- 431 // Main Code 432 // ---------------------------------------------------------------- 433 434 435 MAIN_CODE: 436 // Enable interrupts in SUPERVISOR mode 437 // Comment the following line for a USER mode test 438 [ -- SP ] = RETI; 439 440 // Start of the program code 441 R0 = 0; 442 R1 = 1; 443 R2 = 2; 444 445 // Verify CC hazards under the following condition: 446 // 447 // (1a) cc2stat (that modifies CC) followed by that uses CC 448 A0 = 0; 449 A1 = R1; 450 CC = R0 < R2; 451 CC = AV0; 452 A0 = BXORSHIFT( A0 , A1, CC ); 453 R7 = CC; CHECKREG(R7, 0); 454 R6 = A0; CHECKREG(R6, 0); 455 R6 = A0.X; CHECKREG(R6, 0); 456 R7 = A1; CHECKREG(R7, 1); 457 R7 = A1.X; CHECKREG(R7, 0); 458 459 // (1b) same as (1a) but kill cc2stat instruction in WB 460 A0 = R1; 461 A1 = R1; 462 CC = R0 < R2; 463 EXCPT 3; 464 CC = AV0; 465 A0 = BXORSHIFT( A0 , A1, CC ); 466 R7 = CC; CHECKREG(R7, 0); 467 R6 = A0; CHECKREG(R6, 3); 468 R6 = A0.X; CHECKREG(R6, 0); 469 R7 = A1; CHECKREG(R7, 1); 470 R7 = A1.X; CHECKREG(R7, 0); 471 472 // (2a) cc2stat (that modifies CC) followed by conditional branch (predicted) 473 R3 = 0; 474 A0 = 0; 475 A1 = R1; 476 CC = R0 < R2; 477 CC = AV0; 478 IF !CC JUMP INC_R3_TO_10 (BP); 479 R3 += 2; 480 R3 += 2; 481 R3 += 2; 482 R3 += 2; 483 R3 += 2; 484 R3 += 2; 485 R3 += 2; 486 R3 += 2; 487 R3 += 2; 488 R3 += 2; 489 INC_R3_TO_10: 490 R3 += 1; 491 R3 += 1; 492 R3 += 1; 493 R3 += 1; 494 R3 += 1; 495 R3 += 1; 496 R3 += 1; 497 R3 += 1; 498 R3 += 1; 499 R3 += 1; 500 501 // (2b) same as (2a) but kill cc2stat instruction in WB 502 A0 = 0; 503 A1 = R1; 504 CC = R0 < R2; 505 EXCPT 3; 506 CC = AV0; 507 IF !CC JUMP INC_R3_TO_20 (BP); 508 R3 += 2; 509 R3 += 2; 510 R3 += 2; 511 R3 += 2; 512 R3 += 2; 513 R3 += 2; 514 R3 += 2; 515 R3 += 2; 516 R3 += 2; 517 R3 += 2; 518 INC_R3_TO_20: 519 R3 += 1; 520 R3 += 1; 521 R3 += 1; 522 R3 += 1; 523 R3 += 1; 524 R3 += 1; 525 R3 += 1; 526 R3 += 1; 527 R3 += 1; 528 R3 += 1; 529 530 // (3a) cc2stat (that modifies CC) followed by conditional branch (mispredicted) 531 A0 = 0; 532 A1 = R1; 533 CC = R0 < R2; 534 CC = AV0; 535 IF CC JUMP INC_R3_TO_20 (BP); 536 R3 += 2; 537 R3 += 2; 538 R3 += 2; 539 R3 += 2; 540 R3 += 2; 541 R3 += 2; 542 R3 += 2; 543 R3 += 2; 544 R3 += 2; 545 R3 += 2; 546 547 // (3b) same as (3a) but kill cc2stat instruction in WB 548 A0 = 0; 549 A1 = R1; 550 CC = R0 < R2; 551 EXCPT 3; 552 CC = AV0; 553 IF CC JUMP INC_R3_TO_20 (BP); 554 R3 += 2; 555 R3 += 2; 556 R3 += 2; 557 R3 += 2; 558 R3 += 2; 559 R3 += 2; 560 R3 += 2; 561 R3 += 2; 562 R3 += 2; 563 R3 += 2; 564 565 CHECKREG(r3, 60); 566 567 dbg_pass; 568 569 // (4a) cc2stat (that modifies CC) followed by testset 570 LD32(p0, DATA_ADDR_3); //LD32(p0, 0xff000000); 571 LD32(p1, DATA_ADDR_2); //LD32(p1, 0xffe00000); 572 [ P0 ] = R0; 573 574 A0 = 0; 575 A1 = R1; 576 CC = R0 < R2; 577 CC = AV0; 578 QUERY_0: 579 TESTSET ( P0 ); 580 IF !CC JUMP QUERY_0; 581 [ P0 ] = R1; 582 CHECKMEM32(DATA_ADDR_3, 1); //CHECKMEM32(0xff000000, 1); 583 [ P0 ] = R0; 584 CHECKMEM32(DATA_ADDR_3, 0); //CHECKMEM32(0xff000000, 0); 585 586 // (4b) same as (4a) but kill cc2stat instruction in WB 587 A0 = 0; 588 A1 = R1; 589 CC = R0 < R2; 590 EXCPT 3; 591 CC = AV0; 592 QUERY_1: 593 TESTSET ( P0 ); 594 IF !CC JUMP QUERY_1; 595 [ P0 ] = R2; 596 CHECKMEM32(DATA_ADDR_3, 2); //CHECKMEM32(0xff000000, 2); 597 [ P0 ] = R0; 598 CHECKMEM32(DATA_ADDR_3, 0); //CHECKMEM32(0xff000000, 0); 599 600 // (5a) cc2stat (that modifies CC) followed by dag instruction that modifies CC 601 A0 = 0; 602 A1 = R1; 603 CC = R0 < R2; 604 CC = AV0; 605 CC = P0 < P1; 606 607 // (5b) same as (5a) but kill cc2stat instruction in WB 608 A0 = 0; 609 A1 = R1; 610 CC = R0 < R2; 611 EXCPT 3; 612 CC = AV0; 613 CC = P0 < P1; 614 615 616 END: 617 dbg_pass; 618 619 // ---------------------------------------------------------------- 620 // Data Segment 621 // - define kernel and user stacks 622 // ---------------------------------------------------------------- 623 624 .data 625 DATA: 626 .space (STACKSIZE); 627 628 .space (STACKSIZE); 629 KSTACK: 630 631 .space (STACKSIZE); 632 USTACK: 633