| //Original:/proj/frio/dv/testcases/debug/dbg_brprd_ntkn_src_kill/dbg_brprd_ntkn_src_kill.dsp |
| // Description: This test checks that the trace buffer keeps track of a |
| // branch source instruction that is predicted but not taken getting killed |
| // at each stage in the pipe. The test consists of 8 instances of an EXCPT |
| // instruction followed by 0 to 7 NOPs and a BRF instruction (and bp), with |
| // the trace buffer enabled. |
| # mach: bfin |
| # sim: --environment operating |
| |
| #include "test.h" |
| .include "testutils.inc" |
| start |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// Include Files ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| include(std.inc) |
| include(selfcheck.inc) |
| include(symtable.inc) |
| include(mmrs.inc) |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// Defines ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef USER_CODE_SPACE |
| #define USER_CODE_SPACE CODE_ADDR_1 // |
| #endif |
| #ifndef STACKSIZE |
| #define STACKSIZE 0x00000020 |
| #endif |
| #ifndef ITABLE |
| #define ITABLE CODE_ADDR_2 // |
| #endif |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// RESET ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| RST_ISR : |
| |
| // Initialize Dregs |
| INIT_R_REGS(0); |
| |
| // Initialize Pregs |
| INIT_P_REGS(0); |
| |
| // Initialize ILBM Registers |
| INIT_I_REGS(0); |
| INIT_M_REGS(0); |
| INIT_L_REGS(0); |
| INIT_B_REGS(0); |
| |
| // Initialize the Address of the Checkreg data segment |
| // **** THIS IS NEEDED WHENEVER CHECKREG IS USED **** |
| CHECK_INIT_DEF(p5); //CHECK_INIT(p5, 0x00BFFFFC); |
| |
| // Setup User Stack |
| LD32_LABEL(sp, USTACK); |
| USP = SP; |
| |
| // Setup Kernel Stack |
| LD32_LABEL(sp, KSTACK); |
| |
| // Setup Frame Pointer |
| FP = SP; |
| |
| // Setup Event Vector Table |
| LD32(p0, EVT0); |
| |
| LD32_LABEL(r0, EMU_ISR); // Emulation Handler (Int0) |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, RST_ISR); // Reset Handler (Int1) |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, NMI_ISR); // NMI Handler (Int2) |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, EXC_ISR); // Exception Handler (Int3) |
| [ P0 ++ ] = R0; |
| [ P0 ++ ] = R0; // IVT4 not used |
| LD32_LABEL(r0, HWE_ISR); // HW Error Handler (Int5) |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, TMR_ISR); // Timer Handler (Int6) |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV7_ISR); // IVG7 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV8_ISR); // IVG8 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV9_ISR); // IVG9 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV10_ISR); // IVG10 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV11_ISR); // IVG11 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV12_ISR); // IVG12 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV13_ISR); // IVG13 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV14_ISR); // IVG14 Handler |
| [ P0 ++ ] = R0; |
| LD32_LABEL(r0, IGV15_ISR); // IVG15 Handler |
| [ P0 ++ ] = R0; |
| |
| // Setup the EVT_OVERRIDE MMR |
| R0 = 0; |
| LD32(p0, EVT_OVERRIDE); |
| [ P0 ] = R0; |
| |
| // Setup Interrupt Mask |
| R0 = -1; |
| LD32(p0, IMASK); |
| [ P0 ] = R0; |
| |
| // Return to Supervisor Code |
| RAISE 15; |
| NOP; |
| |
| LD32_LABEL(r0, USER_CODE); |
| RETI = R0; |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// EMU ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| EMU_ISR : |
| |
| RTE; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// NMI ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| NMI_ISR : |
| |
| RTN; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// EXC ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| EXC_ISR : |
| |
| // Save all the registers used in the ISR |
| [ -- SP ] = R0; |
| [ -- SP ] = R1; |
| [ -- SP ] = P0; |
| [ -- SP ] = P1; |
| [ -- SP ] = LC0; |
| [ -- SP ] = LB0; |
| [ -- SP ] = LT0; |
| [ -- SP ] = ASTAT; |
| |
| // Get EXCAUSE bits out of SEQSTAT |
| R0 = SEQSTAT; |
| R0 = R0 << 26; |
| R0 = R0 >> 26; |
| |
| // Check for Trace Exception |
| // Load r1 with EXCAUSE for Trace Exception |
| R1 = 0x0011 (Z); |
| // Check for Trace Exception |
| CC = R0 == R1; |
| // Branch to OUT if the EXCAUSE is not TRACE. |
| IF !CC JUMP OUT; |
| |
| // Read out the Trace Buffer. |
| LD32(p0, TBUFSTAT); |
| // Read TBUFSTAT MMR |
| P1 = [ P0 ]; |
| |
| // if p1 is zero skip the loop. |
| CC = P1 == 0; |
| IF CC JUMP OUT; |
| |
| // Read out the Entire Trace Buffer. |
| LD32(p0, TBUF); |
| LSETUP ( l0s , l0e ) LC0 = P1; |
| l0s:R0 = [ P0 ]; |
| l0e:R0 = [ P0 ]; |
| |
| OUT: |
| // Check for other exception, if any. |
| |
| // Restore all saved registers. |
| ASTAT = [ SP ++ ]; |
| LT0 = [ SP ++ ]; |
| LB0 = [ SP ++ ]; |
| LC0 = [ SP ++ ]; |
| P1 = [ SP ++ ]; |
| P0 = [ SP ++ ]; |
| R1 = [ SP ++ ]; |
| R0 = [ SP ++ ]; |
| |
| // Return |
| RTX; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// HWE ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| HWE_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// TMR ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| TMR_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV7 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV7_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV8 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV8_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV9 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV9_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV10 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV10_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV11 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV11_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV12 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV12_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV13 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV13_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV14 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV14_ISR : |
| |
| RTI; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// IGV15 ISR ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| IGV15_ISR : |
| |
| WR_MMR(TBUFCTL, 0x7, p0, r0); // Enable trace buffer & overflow |
| |
| CSYNC; // Wait for MMR write to complete |
| |
| CC = R7 == R6; // Set CC |
| EXCPT 1; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in WB stage |
| NOP; |
| NOP; |
| |
| EXCPT 2; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in EX3 stage |
| NOP; |
| NOP; |
| |
| EXCPT 3; |
| NOP; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in EX2 stage |
| NOP; |
| NOP; |
| |
| EXCPT 4; |
| NOP; |
| NOP; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in EX1 stage |
| NOP; |
| NOP; |
| |
| EXCPT 5; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in AC stage |
| NOP; |
| NOP; |
| |
| EXCPT 6; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in DEC stage |
| NOP; |
| NOP; |
| |
| EXCPT 7; NOP; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in IF2 stage |
| NOP; |
| NOP; |
| |
| EXCPT 8; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| NOP; |
| IF !CC JUMP 4 (BP); // Mispredicted branch gets killed in IF1 stage |
| NOP; |
| NOP; |
| |
| // Read out the Rest of the Trace Buffer. |
| LD32(p0, TBUFSTAT); |
| // Read TBUFSTAT MMR |
| P1 = [ P0 ]; |
| |
| // if p1 is zero skip the loop. |
| CC = P1 == 0; |
| IF CC JUMP OUT1; |
| |
| // Read out the Entire Trace Buffer. |
| LD32(p0, TBUF); |
| LSETUP ( l1s , l1e ) LC0 = P1; |
| l1s:R0 = [ P0 ]; |
| l1e:R0 = [ P0 ]; |
| |
| // Don't RTI if you never wish to go to User Mode |
| // use END_TEST instead. |
| |
| OUT1: |
| dbg_pass; |
| |
| // rti; |
| |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| .dw 0xFFFF |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// USER CODE ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| |
| USER_CODE : |
| |
| // YOUR USER CODE GOES HERE. |
| |
| dbg_pass; // Call Endtest Macro |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// DATA MEMRORY ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| .section MEM_DATA_ADDR_1 //.data 0x00F00100,"aw" |
| .dd 0x01010101; |
| .dd 0x02020202; |
| .dd 0x03030303; |
| .dd 0x04040404; |
| .dd 0x05050505; |
| .dd 0x06060606; |
| .dd 0x07070707; |
| .dd 0x08080808; |
| .dd 0x09090909; |
| .dd 0x0a0a0a0a; |
| .dd 0x0b0b0b0b; |
| .dd 0x0c0c0c0c; |
| .dd 0x0d0d0d0d; |
| .dd 0x0e0e0e0e; |
| .dd 0x0f0f0f0f; |
| |
| // Define Kernal Stack |
| .section MEM_DATA_ADDR_2 //.data 0x00F00210,"aw" |
| .space (STACKSIZE); |
| KSTACK : |
| |
| .space (STACKSIZE); |
| USTACK : |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| ///////////////////////// END OF TEST ///////////////////////////// |
| ///////////////////////////////////////////////////////////////////////////// |