c_mmr_loop_user_except.S 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. //Original:/proj/frio/dv/testcases/core/c_mmr_loop_user_except/c_mmr_loop_user_except.dsp
  2. // Spec Reference: c_mmr_loop_user_except
  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. //*****************
  70. // wrt-rd EVT13 = 0xFFE02034
  71. LD32(p0, 0xFFE02034);
  72. LD32(r0, 0xDDDDABC6);
  73. [ P0 ] = R0;
  74. // wrt-rd EVT14 = 0xFFE02038
  75. LD32(p0, 0xFFE02038);
  76. LD32(r0, 0xEEEEABC6);
  77. [ P0 ] = R0;
  78. //*****************
  79. LD32_LABEL(r0, I15HANDLE);// IVG15 Handler
  80. [ P0 ++ ] = R0;
  81. LD32(p0, EVT_OVERRIDE);
  82. R0 = 0;
  83. [ P0 ++ ] = R0;
  84. R1 = -1; // Change this to mask interrupts (*)
  85. CSYNC; // wait for MMR writes to finish
  86. STI R1; // sync and reenable events (implicit write to IMASK)
  87. DUMMY:
  88. R0 = 0 (Z);
  89. LT0 = r0; // set loop counters to something deterministic
  90. LB0 = r0;
  91. LC0 = r0;
  92. LT1 = r0;
  93. LB1 = r0;
  94. LC1 = r0;
  95. ASTAT = r0; // reset other internal regs
  96. SYSCFG = r0;
  97. RETS = r0; // prevent X's breaking LINK instruction
  98. // The following code sets up the test for running in USER mode
  99. LD32_LABEL(r0, STARTUSER);// One gets to user mode by doing a
  100. // ReturnFromInterrupt (RTI)
  101. RETI = r0; // We need to load the return address
  102. // Comment the following line for a USER Mode test
  103. // JUMP STARTSUP; // jump to code start for SUPERVISOR mode
  104. RTI; // execute this instr put us in USER mode
  105. STARTSUP:
  106. LD32_LABEL(p1, BEGIN);
  107. LD32(p0, EVT15);
  108. CLI R1; // inhibit events during write to MMR
  109. [ P0 ] = P1; // IVG15 (General) handler (Int 15) load with start
  110. CSYNC; // wait for it
  111. STI R1; // reenable events with proper imask
  112. RAISE 15; // after we RTI, INT 15 should be taken,& return to BEGIN in
  113. // USER MODE & go to different RAISE in USER mode
  114. // until the end of the test.
  115. RTI;
  116. //
  117. // The Main Program
  118. //
  119. STARTUSER:
  120. LD32_LABEL(sp, USTACK); // setup the stack pointer
  121. FP = SP; // set frame pointer
  122. // LINK 0; // change for how much stack frame space you need.
  123. JUMP BEGIN;
  124. //*********************************************************************
  125. BEGIN:
  126. // COMMENT the following line for USER MODE tests
  127. [ -- SP ] = RETI; // enable interrupts in supervisor mode
  128. // **** YOUR CODE GOES HERE ****
  129. // PUT YOUR TEST HERE!
  130. // Can't Raise 0, 3, or 4
  131. // Raise 1 requires some intelligence so the test
  132. // doesn't loop forever - use SFTRESET bit in SEQSTAT (TBD)
  133. // RAISE 2; // RTN // exception because we execute this in USER mode
  134. R0 = 0;
  135. LD32(p0, 0xFFE02034);
  136. P2 = 2;
  137. LSETUP ( start1 , end1 ) LC0 = P2;
  138. start1:
  139. R0 = [ P0 ++ ]; // 16 bit instr
  140. end1: R1 = R0;
  141. CHECKREG(r0, 0x00000000);
  142. CHECKREG(r1, 0x00000000);
  143. CHECKREG(r2, 0x00000000);
  144. //CHECKREG(r3, 0x00000030);
  145. CHECKREG(r4, 0x0000000F);
  146. CHECKREG(r5, 0x00000012);
  147. CHECKREG(r6, 0x00000015);
  148. CHECKREG(r7, 0x00000018);
  149. END:
  150. dbg_pass; // End the test
  151. //*********************************************************************
  152. //
  153. // Handlers for Events
  154. //
  155. EHANDLE: // Emulation Handler 0
  156. RTE;
  157. RHANDLE: // Reset Handler 1
  158. RTI;
  159. NHANDLE: // NMI Handler 2
  160. R0 = RETN;
  161. R0 += 2;
  162. RETN = r0;
  163. RTN;
  164. XHANDLE: // Exception Handler 3
  165. R3 = RETX;
  166. R4 += 5;
  167. R5 += 6;
  168. R6 += 7;
  169. R7 += 8;
  170. R3 += 2; // for resturn address
  171. RETX = r3;
  172. RTX;
  173. HWHANDLE: // HW Error Handler 5
  174. R2 = RETI;
  175. R2 += 2;
  176. RETI = r2;
  177. RTI;
  178. THANDLE: // Timer Handler 6
  179. R3 = RETI;
  180. R3 += 2;
  181. RETI = r3;
  182. RTI;
  183. I7HANDLE: // IVG 7 Handler
  184. R4 = RETI;
  185. R4 += 2;
  186. RETI = r4;
  187. RTI;
  188. I8HANDLE: // IVG 8 Handler
  189. R5 = RETI;
  190. R5 += 2;
  191. RETI = r5;
  192. RTI;
  193. I9HANDLE: // IVG 9 Handler
  194. R6 = RETI;
  195. R6 += 2;
  196. RETI = r6;
  197. RTI;
  198. I10HANDLE: // IVG 10 Handler
  199. R7 = RETI;
  200. R7 += 2;
  201. RETI = r7;
  202. RTI;
  203. I11HANDLE: // IVG 11 Handler
  204. I0 = R0;
  205. I1 = R1;
  206. I2 = R2;
  207. I3 = R3;
  208. M0 = R4;
  209. R0 = RETI;
  210. R0 += 2;
  211. RETI = r0;
  212. RTI;
  213. I12HANDLE: // IVG 12 Handler
  214. R1 = RETI;
  215. R1 += 2;
  216. RETI = r1;
  217. RTI;
  218. I13HANDLE: // IVG 13 Handler
  219. R2 = RETI;
  220. R2 += 2;
  221. RETI = r2;
  222. RTI;
  223. I14HANDLE: // IVG 14 Handler
  224. R3 = RETI;
  225. R3 += 2;
  226. RETI = r3;
  227. RTI;
  228. I15HANDLE: // IVG 15 Handler
  229. R4 = 15;
  230. RTI;
  231. NOP;NOP;NOP;NOP;NOP;NOP;NOP; // needed for icache bug
  232. //
  233. // Data Segment
  234. //
  235. .data
  236. DATA:
  237. .space (0x10);
  238. // Stack Segments (Both Kernel and User)
  239. .space (STACKSIZE);
  240. KSTACK:
  241. .space (STACKSIZE);
  242. USTACK:
  243. // .space (STACKSIZE); // adding this may solve the problem