c_seq_wb_cs_lsmmrj_mvp.S 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. //Original:/proj/frio/dv/testcases/core/c_seq_wb_cs_lsmmrj_mvp/c_seq_wb_cs_lsmmrj_mvp.dsp
  2. // Spec Reference: sequencer:wb ( csync ldst mmr jump regmv pushpopmultiple)
  3. # mach: bfin
  4. # sim: --environment operating
  5. #include "test.h"
  6. .include "testutils.inc"
  7. start
  8. include(std.inc)
  9. include(selfcheck.inc)
  10. include(gen_int.inc)
  11. INIT_R_REGS(0);
  12. INIT_P_REGS(0);
  13. INIT_I_REGS(0); // initialize the dsp address regs
  14. INIT_M_REGS(0);
  15. INIT_L_REGS(0);
  16. INIT_B_REGS(0);
  17. //CHECK_INIT(p5, 0xe0000000);
  18. include(symtable.inc)
  19. CHECK_INIT_DEF(p5);
  20. #ifndef STACKSIZE
  21. #define STACKSIZE 0x10
  22. #endif
  23. #ifndef EVT
  24. #define EVT 0xFFE02000
  25. #endif
  26. #ifndef EVT15
  27. #define EVT15 0xFFE0203C
  28. #endif
  29. #ifndef EVT_OVERRIDE
  30. #define EVT_OVERRIDE 0xFFE02100
  31. #endif
  32. #ifndef ITABLE
  33. #define ITABLE DATA_ADDR_1
  34. #endif
  35. GEN_INT_INIT(ITABLE) // set location for interrupt table
  36. //
  37. // Reset/Bootstrap Code
  38. // (Here we should set the processor operating modes, initialize registers,
  39. //
  40. BOOT:
  41. // in reset mode now
  42. LD32_LABEL(sp, KSTACK); // setup the stack pointer
  43. FP = SP; // and frame pointer
  44. LD32(p0, EVT); // Setup Event Vectors and Handlers
  45. LD32_LABEL(r0, EHANDLE); // Emulation Handler (Int0)
  46. [ P0 ++ ] = R0;
  47. LD32_LABEL(r0, RHANDLE); // Reset Handler (Int1)
  48. [ P0 ++ ] = R0;
  49. LD32_LABEL(r0, NHANDLE); // NMI Handler (Int2)
  50. [ P0 ++ ] = R0;
  51. LD32_LABEL(r0, XHANDLE); // Exception Handler (Int3)
  52. [ P0 ++ ] = R0;
  53. [ P0 ++ ] = R0; // IVT4 not used
  54. LD32_LABEL(r0, HWHANDLE); // HW Error Handler (Int5)
  55. [ P0 ++ ] = R0;
  56. LD32_LABEL(r0, THANDLE); // Timer Handler (Int6)
  57. [ P0 ++ ] = R0;
  58. LD32_LABEL(r0, I7HANDLE); // IVG7 Handler
  59. [ P0 ++ ] = R0;
  60. LD32_LABEL(r0, I8HANDLE); // IVG8 Handler
  61. [ P0 ++ ] = R0;
  62. LD32_LABEL(r0, I9HANDLE); // IVG9 Handler
  63. [ P0 ++ ] = R0;
  64. LD32_LABEL(r0, I10HANDLE);// IVG10 Handler
  65. [ P0 ++ ] = R0;
  66. LD32_LABEL(r0, I11HANDLE);// IVG11 Handler
  67. [ P0 ++ ] = R0;
  68. LD32_LABEL(r0, I12HANDLE);// IVG12 Handler
  69. [ P0 ++ ] = R0;
  70. LD32_LABEL(r0, I13HANDLE);// IVG13 Handler
  71. [ P0 ++ ] = R0;
  72. LD32_LABEL(r0, I14HANDLE);// IVG14 Handler
  73. [ P0 ++ ] = R0;
  74. LD32_LABEL(r0, I15HANDLE);// IVG15 Handler
  75. [ P0 ++ ] = R0;
  76. LD32(p0, EVT_OVERRIDE);
  77. R0 = 0;
  78. [ P0 ++ ] = R0;
  79. R0 = -1; // Change this to mask interrupts (*)
  80. [ P0 ] = R0; // IMASK
  81. CSYNC;
  82. DUMMY:
  83. R0 = 0 (Z);
  84. LT0 = r0; // set loop counters to something deterministic
  85. LB0 = r0;
  86. LC0 = r0;
  87. LT1 = r0;
  88. LB1 = r0;
  89. LC1 = r0;
  90. ASTAT = r0; // reset other internal regs
  91. // The following code sets up the test for running in USER mode
  92. LD32_LABEL(r0, STARTUSER);// One gets to user mode by doing a
  93. // ReturnFromInterrupt (RTI)
  94. RETI = r0; // We need to load the return address
  95. // Comment the following line for a USER Mode test
  96. JUMP STARTSUP; // jump to code start for SUPERVISOR mode
  97. RTI;
  98. STARTSUP:
  99. LD32_LABEL(p1, BEGIN);
  100. LD32(p0, EVT15);
  101. [ P0 ] = P1; // IVG15 (General) handler (Int 15) load with start
  102. RAISE 15; // after we RTI, INT 15 should be taken,& return to BEGIN in
  103. // SUPERVISOR MODE & go to different RAISE in supervisor mode
  104. // until the end of the test.
  105. NOP; // Workaround for Bug 217
  106. RTI;
  107. //
  108. // The Main Program
  109. //
  110. STARTUSER:
  111. LD32_LABEL(sp, USTACK); // setup the stack pointer
  112. FP = SP; // set frame pointer
  113. JUMP BEGIN;
  114. //*********************************************************************
  115. BEGIN:
  116. // COMMENT the following line for USER MODE tests
  117. [ -- SP ] = RETI; // enable interrupts in supervisor mode
  118. // **** YOUR CODE GOES HERE ****
  119. // PUT YOUR TEST HERE!
  120. // PUSH
  121. LD32(p1, 0xFFE02034); // wrt-rd EVT13 = 0xFFE02034
  122. //LD32(p2, DATA_ADDR_1);
  123. loadsym P2, DATA;
  124. LD32(p3, 0xab5fd490);
  125. LD32(p4, 0xa581bd94);
  126. LD32(r2, 0x14789232);
  127. [ P1 ] = R2;
  128. R0 = 0x01;
  129. R1 = 0x02;
  130. R2 = 0x03;
  131. R3 = 0x04;
  132. R4 = 0x05;
  133. R5 = 0x06;
  134. R6 = 0x07;
  135. R7 = 0x08;
  136. [ -- SP ] = ( R7:0 );
  137. // RAISE 2; // RTN
  138. CSYNC;
  139. R0 = [ P2 ++ ];
  140. R1 = [ P1 ];
  141. JUMP.S LABEL1;
  142. P3 = R7;
  143. R4 = P3;
  144. [ -- SP ] = ( R7:0 );
  145. R1 = 0x12;
  146. R2 = 0x13;
  147. R3 = 0x14;
  148. R4 = 0x15;
  149. R5 = 0x16;
  150. R6 = 0x17;
  151. R7 = 0x18;
  152. LABEL1:
  153. // RAISE 5; // RTI
  154. CSYNC;
  155. R2 = [ P2 ++ ];
  156. P4 = R6;
  157. R3 = P4;
  158. [ -- SP ] = ( R7:0 );
  159. R2 = 0x23;
  160. R3 = 0x24;
  161. R4 = 0x25;
  162. R5 = 0x26;
  163. R6 = 0x27;
  164. R7 = 0x28;
  165. // wrt-rd EVT5 = 0xFFE02034
  166. LD32(p1, 0xFFE02034); // wrt-rd EVT13 = 0xFFE02034
  167. // RAISE 6; // RTI
  168. CSYNC;
  169. R4 = [ P2 ++ ];
  170. R6 = [ P1 ];
  171. JUMP.S LABEL2;
  172. P3 = R3;
  173. R5 = P3;
  174. [ -- SP ] = ( R7:0 );
  175. // POP
  176. R0 = 0x00;
  177. R1 = 0x00;
  178. R2 = 0x00;
  179. R3 = 0x00;
  180. R4 = 0x00;
  181. R5 = 0x00;
  182. R6 = 0x00;
  183. R7 = 0x00;
  184. LABEL2:
  185. CSYNC;
  186. CHECKREG(r0, 0x00010203);
  187. CHECKREG(r1, 0x14789232);
  188. CHECKREG(r2, 0x00000023);
  189. CHECKREG(r3, 0x00000024);
  190. CHECKREG(r4, 0x08090A0B);
  191. CHECKREG(r5, 0x00000026);
  192. CHECKREG(r6, 0x14789232);
  193. // RAISE 7; // RTI
  194. CSYNC;
  195. R0 = [ P2 ++ ];
  196. R1 = [ P1 ];
  197. P4 = R4;
  198. R2 = P4;
  199. ( R7:0 ) = [ SP ++ ];
  200. CHECKREG(r0, 0x00010203);
  201. CHECKREG(r1, 0x14789232);
  202. CHECKREG(r2, 0x04050607);
  203. CHECKREG(r3, 0x00000007);
  204. CHECKREG(r4, 0x00000005);
  205. CHECKREG(r5, 0x00000006);
  206. CHECKREG(r6, 0x00000007);
  207. CHECKREG(r7, 0x00000008);
  208. // wrt-rd EVT13 = 0xFFE02034
  209. LD32(p1, 0xFFE02034);
  210. // RAISE 8; // RTI
  211. CSYNC;
  212. R0 = [ P2 ++ ];
  213. R1 = [ P1 ];
  214. JUMP.S LABEL3;
  215. P1 = R5;
  216. R6 = P1;
  217. ( R7:0 ) = [ SP ++ ];
  218. //CHECKREG(r0, 0x000000a1); // CHECKREG can not be skipped
  219. //CHECKREG(r1, 0x000000b2); // so they cannot appear here
  220. //CHECKREG(r2, 0x000000c3);
  221. //CHECKREG(r3, 0x000000d4);
  222. //CHECKREG(r4, 0x000000e5);
  223. //CHECKREG(r5, 0x000000f6);
  224. //CHECKREG(r6, 0x00000017);
  225. //CHECKREG(r7, 0x00000028);
  226. R0 = 12;
  227. R1 = 13;
  228. R2 = 14;
  229. R3 = 15;
  230. R4 = 16;
  231. R5 = 17;
  232. R6 = 18;
  233. R7 = 19;
  234. LABEL3:
  235. CSYNC;
  236. CHECKREG(r0, 0x10111213);
  237. CHECKREG(r1, 0x14789232);
  238. // RAISE 9; // RTI
  239. CSYNC;
  240. P3 = R6;
  241. R7 = P3;
  242. ( R7:0 ) = [ SP ++ ];
  243. CHECKREG(r0, 0x00000001);
  244. CHECKREG(r1, 0x00000002);
  245. CHECKREG(r2, 0x00000003);
  246. CHECKREG(r3, 0x00000004);
  247. CHECKREG(r4, 0x00000005);
  248. CHECKREG(r5, 0x00000006);
  249. CHECKREG(r6, 0x00000007);
  250. CHECKREG(r7, 0x00000008);
  251. R0 = I0;
  252. R1 = I1;
  253. R2 = I2;
  254. R3 = I3;
  255. CHECKREG(r0, 0x00000000);
  256. CHECKREG(r1, 0x00000000);
  257. CHECKREG(r2, 0x00000000);
  258. CHECKREG(r3, 0x00000000);
  259. END:
  260. dbg_pass; // End the test
  261. //*********************************************************************
  262. //
  263. // Handlers for Events
  264. //
  265. EHANDLE: // Emulation Handler 0
  266. RTE;
  267. RHANDLE: // Reset Handler 1
  268. RTI;
  269. NHANDLE: // NMI Handler 2
  270. I0 += 2;
  271. RTN;
  272. XHANDLE: // Exception Handler 3
  273. R1 = 3;
  274. RTX;
  275. HWHANDLE: // HW Error Handler 5
  276. I1 += 2;
  277. RTI;
  278. THANDLE: // Timer Handler 6
  279. I2 += 2;
  280. RTI;
  281. I7HANDLE: // IVG 7 Handler
  282. I3 += 2;
  283. RTI;
  284. I8HANDLE: // IVG 8 Handler
  285. I0 += 2;
  286. RTI;
  287. I9HANDLE: // IVG 9 Handler
  288. I0 += 2;
  289. RTI;
  290. I10HANDLE: // IVG 10 Handler
  291. R7 = 10;
  292. RTI;
  293. I11HANDLE: // IVG 11 Handler
  294. I0 = R0;
  295. I1 = R1;
  296. I2 = R2;
  297. I3 = R3;
  298. M0 = R4;
  299. R0 = 11;
  300. RTI;
  301. I12HANDLE: // IVG 12 Handler
  302. R1 = 12;
  303. RTI;
  304. I13HANDLE: // IVG 13 Handler
  305. R2 = 13;
  306. RTI;
  307. I14HANDLE: // IVG 14 Handler
  308. R3 = 14;
  309. RTI;
  310. I15HANDLE: // IVG 15 Handler
  311. R4 = 15;
  312. RTI;
  313. NOP;NOP;NOP;NOP;NOP;NOP;NOP; // needed for icache bug
  314. //
  315. // Data Segment
  316. //
  317. .section MEM_DATA_ADDR_1,"aw"
  318. DATA:
  319. // .space (0x10);
  320. .dd 0x00010203
  321. .dd 0x04050607
  322. .dd 0x08090A0B
  323. .dd 0x0C0D0E0F
  324. .dd 0x10111213
  325. .dd 0x14151617
  326. .dd 0x18191A1B
  327. .dd 0x1C1D1E1F
  328. .dd 0x11223344
  329. .dd 0x55667788
  330. .dd 0x99717273
  331. .dd 0x74757677
  332. .dd 0x82838485
  333. .dd 0x86878889
  334. .dd 0x80818283
  335. .dd 0x84858687
  336. .dd 0x01020304
  337. .dd 0x05060708
  338. .dd 0x09101112
  339. .dd 0x14151617
  340. .dd 0x18192021
  341. // Stack Segments (Both Kernel and User)
  342. .space (STACKSIZE);
  343. KSTACK:
  344. .space (STACKSIZE);
  345. USTACK:
  346. .section MEM_DATA_ADDR_2,"aw"
  347. .dd 0x20212223
  348. .dd 0x24252627
  349. .dd 0x28292A2B
  350. .dd 0x2C2D2E2F
  351. .dd 0x30313233
  352. .dd 0x34353637
  353. .dd 0x38393A3B
  354. .dd 0x3C3D3E3F
  355. .dd 0x91929394
  356. .dd 0x95969798
  357. .dd 0x99A1A2A3
  358. .dd 0xA5A6A7A8
  359. .dd 0xA9B0B1B2
  360. .dd 0xB3B4B5B6
  361. .dd 0xB7B8B9C0