c_mmr_ppop_illegal_adr.S 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. //Original:/proj/frio/dv/testcases/core/c_mmr_ppop_illegal_adr/c_mmr_ppop_illegal_adr.dsp
  2. // Spec Reference: mmr ppop illegal address
  3. # mach: bfin
  4. # sim: --environment operating
  5. #include "test.h"
  6. .include "testutils.inc"
  7. start
  8. include(gen_int.inc)
  9. include(selfcheck.inc)
  10. include(std.inc)
  11. include(mmrs.inc)
  12. #ifndef STACKSIZE
  13. #define STACKSIZE 0x10
  14. #endif
  15. #ifndef ITABLE
  16. #define ITABLE 0xF0000000
  17. #endif
  18. GEN_INT_INIT(ITABLE) // set location for interrupt table
  19. //
  20. // Reset/Bootstrap Code
  21. // (Here we set the processor operating modes, initialize registers
  22. // etc.)
  23. //
  24. BOOT:
  25. INIT_R_REGS(0);
  26. INIT_P_REGS(0);
  27. INIT_I_REGS(0); // initialize the dsp address regs
  28. INIT_M_REGS(0);
  29. INIT_L_REGS(0);
  30. INIT_B_REGS(0);
  31. //CHECK_INIT(p5, 0xe0000000);
  32. include(symtable.inc)
  33. CHECK_INIT_DEF(p5);
  34. CLI R1; // inhibit events during MMR writes
  35. LD32_LABEL(sp, USTACK); // setup the user stack pointer
  36. USP = SP; // and frame pointer
  37. LD32_LABEL(sp, KSTACK); // setup the stack pointer
  38. FP = SP; // and frame pointer
  39. LD32(p0, EVT0); // Setup Event Vectors and Handlers
  40. LD32_LABEL(r0, EHANDLE); // Emulation Handler (Int0)
  41. [ P0 ++ ] = R0;
  42. LD32_LABEL(r0, RHANDLE); // Reset Handler (Int1)
  43. [ P0 ++ ] = R0;
  44. LD32_LABEL(r0, NHANDLE); // NMI Handler (Int2)
  45. [ P0 ++ ] = R0;
  46. LD32_LABEL(r0, XHANDLE); // Exception Handler (Int3)
  47. [ P0 ++ ] = R0;
  48. [ P0 ++ ] = R0; // EVT4 not used global Interr Enable (INT4)
  49. LD32_LABEL(r0, HWHANDLE); // HW Error Handler (Int5)
  50. [ P0 ++ ] = R0;
  51. LD32_LABEL(r0, THANDLE); // Timer Handler (Int6)
  52. [ P0 ++ ] = R0;
  53. LD32_LABEL(r0, I7HANDLE); // IVG7 Handler
  54. [ P0 ++ ] = R0;
  55. LD32_LABEL(r0, I8HANDLE); // IVG8 Handler
  56. [ P0 ++ ] = R0;
  57. LD32_LABEL(r0, I9HANDLE); // IVG9 Handler
  58. [ P0 ++ ] = R0;
  59. LD32_LABEL(r0, I10HANDLE);// IVG10 Handler
  60. [ P0 ++ ] = R0;
  61. LD32_LABEL(r0, I11HANDLE);// IVG11 Handler
  62. [ P0 ++ ] = R0;
  63. LD32_LABEL(r0, I12HANDLE);// IVG12 Handler
  64. [ P0 ++ ] = R0;
  65. LD32_LABEL(r0, I13HANDLE);// IVG13 Handler
  66. [ P0 ++ ] = R0;
  67. LD32_LABEL(r0, I14HANDLE);// IVG14 Handler
  68. [ P0 ++ ] = R0;
  69. LD32_LABEL(r0, I15HANDLE);// IVG15 Handler
  70. [ P0 ++ ] = R0;
  71. LD32(p0, EVT_OVERRIDE);
  72. R0 = 0;
  73. [ P0 ++ ] = R0;
  74. R1 = -1; // Change this to mask interrupts (*)
  75. CSYNC; // wait for MMR writes to finish
  76. STI R1; // sync and reenable events (implicit write to IMASK)
  77. DUMMY:
  78. R0 = 0 (Z);
  79. LT0 = r0; // set loop counters to something deterministic
  80. LB0 = r0;
  81. LC0 = r0;
  82. LT1 = r0;
  83. LB1 = r0;
  84. LC1 = r0;
  85. ASTAT = r0; // reset other internal regs
  86. SYSCFG = r0;
  87. RETS = r0; // prevent X's breaking LINK instruction
  88. // The following code sets up the test for running in USER mode
  89. LD32_LABEL(r0, STARTUSER);// One gets to user mode by doing a
  90. // ReturnFromInterrupt (RTI)
  91. RETI = r0; // We need to load the return address
  92. // Comment the following line for a USER Mode test
  93. JUMP STARTSUP; // jump to code start for SUPERVISOR mode
  94. RTI;
  95. STARTSUP:
  96. LD32_LABEL(p1, BEGIN);
  97. LD32(p0, EVT15);
  98. CLI R1; // inhibit events during write to MMR
  99. [ P0 ] = P1; // IVG15 (General) handler (Int 15) load with start
  100. CSYNC; // wait for it
  101. STI R1; // reenable events with proper imask
  102. RAISE 15; // after we RTI, INT 15 should be taken
  103. RTI;
  104. //
  105. // The Main Program
  106. //
  107. STARTUSER:
  108. LINK 0; // change for how much stack frame space you need.
  109. JUMP BEGIN;
  110. //*********************************************************************
  111. BEGIN:
  112. // COMMENT the following line for USER MODE tests
  113. [ -- SP ] = RETI; // enable interrupts in supervisor mode
  114. // **** YOUR CODE GOES HERE ****
  115. LD32(r0, 0206037020);
  116. LD32(r1, 0x10070030);
  117. LD32(r2, 0xe2000043);
  118. LD32(r3, 0x30305050);
  119. LD32(r4, 0x0f040860);
  120. LD32(r5, 0x0a0050d0);
  121. LD32(r6, 0x00000000);
  122. LD32(r7, 0x0f060071);
  123. // LD32(sp, 0xFFE02104);
  124. // [--sp] = (r7-r6);
  125. [ -- SP ] = R7;
  126. [ -- SP ] = R6;
  127. .dd 0xffff
  128. R1 += 2;
  129. CHECKREG(r1, 0x10070034);
  130. CHECKREG(r2, 0xE2000046);
  131. CHECKREG(r3, 0x30305054);
  132. CHECKREG(r4, 0x0f040865);
  133. CHECKREG(r5, 0x0a0050d6);
  134. CHECKREG(r6, 0x00000007);
  135. CHECKREG(r7, 0x0f060079);
  136. R7 = [ SP ++ ];
  137. CHECKREG(r7, 0x00000000);
  138. dbg_pass; // End the test
  139. //*********************************************************************
  140. //
  141. // Handlers for Events
  142. //
  143. EHANDLE: // Emulation Handler 0
  144. RTE;
  145. RHANDLE: // Reset Handler 1
  146. RTI;
  147. NHANDLE: // NMI Handler 2
  148. R0 = 2;
  149. RTN;
  150. XHANDLE: // Exception Handler 3
  151. R0 = RETX; // error handler:RETX has the address of the same Illegal instr
  152. R1 += 2;
  153. R2 += 3;
  154. R3 += 4;
  155. R4 += 5;
  156. R5 += 6;
  157. R6 += 7;
  158. R7 += 8;
  159. R0 += 2; // we have to add 2 to point to next instr after return (16-bit illegal instr)
  160. RETX = R0;
  161. NOP; NOP; NOP; NOP;
  162. RTX;
  163. HWHANDLE: // HW Error Handler 5
  164. R2 = 5;
  165. RTI;
  166. THANDLE: // Timer Handler 6
  167. R3 = 6;
  168. RTI;
  169. I7HANDLE: // IVG 7 Handler
  170. R4 = 7;
  171. RTI;
  172. I8HANDLE: // IVG 8 Handler
  173. R5 = 8;
  174. RTI;
  175. I9HANDLE: // IVG 9 Handler
  176. R6 = 9;
  177. RTI;
  178. I10HANDLE: // IVG 10 Handler
  179. R7 = 10;
  180. RTI;
  181. I11HANDLE: // IVG 11 Handler
  182. R0 = 11;
  183. RTI;
  184. I12HANDLE: // IVG 12 Handler
  185. R1 = 12;
  186. RTI;
  187. I13HANDLE: // IVG 13 Handler
  188. R2 = 13;
  189. RTI;
  190. I14HANDLE: // IVG 14 Handler
  191. R3 = 14;
  192. RTI;
  193. I15HANDLE: // IVG 15 Handler
  194. R4 = 15;
  195. RTI;
  196. NOP;NOP;NOP;NOP;NOP;NOP;NOP; // needed for icache bug
  197. //
  198. // Data Segment
  199. //
  200. .section MEM_DATA_ADDR_1,"aw"
  201. DATA0:
  202. .dd 0x000a0000
  203. .dd 0x000b0001
  204. .dd 0x000c0002
  205. .dd 0x000d0003
  206. .dd 0x000e0004
  207. .dd 0x000f0005
  208. .dd 0x00100006
  209. .dd 0x00200007
  210. .dd 0x00300008
  211. .dd 0x00400009
  212. .dd 0x0050000a
  213. .dd 0x0060000b
  214. .dd 0x0070000c
  215. .dd 0x0080000d
  216. .dd 0x0090000e
  217. .dd 0x0100000f
  218. .dd 0x02000010
  219. .dd 0x03000011
  220. .dd 0x04000012
  221. .dd 0x05000013
  222. .dd 0x06000014
  223. .dd 0x001a0000
  224. .dd 0x001b0001
  225. .dd 0x001c0002
  226. // Stack Segments (Both Kernel and User)
  227. .space (STACKSIZE);
  228. KSTACK:
  229. .space (STACKSIZE);
  230. USTACK: