interp.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535
  1. /* Simulator for Motorola's MCore processor
  2. Copyright (C) 1999-2022 Free Software Foundation, Inc.
  3. Contributed by Cygnus Solutions.
  4. This file is part of GDB, the GNU debugger.
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  15. /* This must come before any other includes. */
  16. #include "defs.h"
  17. #include <signal.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <sys/param.h>
  21. #include <unistd.h>
  22. #include "bfd.h"
  23. #include "sim/callback.h"
  24. #include "libiberty.h"
  25. #include "sim/sim.h"
  26. #include "sim-main.h"
  27. #include "sim-base.h"
  28. #include "sim-signal.h"
  29. #include "sim-syscall.h"
  30. #include "sim-options.h"
  31. #include "target-newlib-syscall.h"
  32. #define target_big_endian (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN)
  33. static unsigned long
  34. mcore_extract_unsigned_integer (unsigned char *addr, int len)
  35. {
  36. unsigned long retval;
  37. unsigned char * p;
  38. unsigned char * startaddr = (unsigned char *)addr;
  39. unsigned char * endaddr = startaddr + len;
  40. if (len > (int) sizeof (unsigned long))
  41. printf ("That operation is not available on integers of more than %zu bytes.",
  42. sizeof (unsigned long));
  43. /* Start at the most significant end of the integer, and work towards
  44. the least significant. */
  45. retval = 0;
  46. if (! target_big_endian)
  47. {
  48. for (p = endaddr; p > startaddr;)
  49. retval = (retval << 8) | * -- p;
  50. }
  51. else
  52. {
  53. for (p = startaddr; p < endaddr;)
  54. retval = (retval << 8) | * p ++;
  55. }
  56. return retval;
  57. }
  58. static void
  59. mcore_store_unsigned_integer (unsigned char *addr, int len, unsigned long val)
  60. {
  61. unsigned char * p;
  62. unsigned char * startaddr = (unsigned char *)addr;
  63. unsigned char * endaddr = startaddr + len;
  64. if (! target_big_endian)
  65. {
  66. for (p = startaddr; p < endaddr;)
  67. {
  68. * p ++ = val & 0xff;
  69. val >>= 8;
  70. }
  71. }
  72. else
  73. {
  74. for (p = endaddr; p > startaddr;)
  75. {
  76. * -- p = val & 0xff;
  77. val >>= 8;
  78. }
  79. }
  80. }
  81. static int memcycles = 1;
  82. #define gr cpu->active_gregs
  83. #define cr cpu->regs.cregs
  84. #define sr cr[0]
  85. #define vbr cr[1]
  86. #define esr cr[2]
  87. #define fsr cr[3]
  88. #define epc cr[4]
  89. #define fpc cr[5]
  90. #define ss0 cr[6]
  91. #define ss1 cr[7]
  92. #define ss2 cr[8]
  93. #define ss3 cr[9]
  94. #define ss4 cr[10]
  95. #define gcr cr[11]
  96. #define gsr cr[12]
  97. /* maniuplate the carry bit */
  98. #define C_ON() (sr & 1)
  99. #define C_VALUE() (sr & 1)
  100. #define C_OFF() ((sr & 1) == 0)
  101. #define SET_C() {sr |= 1;}
  102. #define CLR_C() {sr &= 0xfffffffe;}
  103. #define NEW_C(v) {CLR_C(); sr |= ((v) & 1);}
  104. #define SR_AF() ((sr >> 1) & 1)
  105. static void set_active_regs (SIM_CPU *cpu)
  106. {
  107. if (SR_AF())
  108. cpu->active_gregs = cpu->regs.alt_gregs;
  109. else
  110. cpu->active_gregs = cpu->regs.gregs;
  111. }
  112. #define TRAPCODE 1 /* r1 holds which function we want */
  113. #define PARM1 2 /* first parameter */
  114. #define PARM2 3
  115. #define PARM3 4
  116. #define PARM4 5
  117. #define RET1 2 /* register for return values. */
  118. /* Default to a 8 Mbyte (== 2^23) memory space. */
  119. #define DEFAULT_MEMORY_SIZE 0x800000
  120. static void
  121. set_initial_gprs (SIM_CPU *cpu)
  122. {
  123. /* Set up machine just out of reset. */
  124. CPU_PC_SET (cpu, 0);
  125. sr = 0;
  126. /* Clean out the GPRs and alternate GPRs. */
  127. memset (&cpu->regs.gregs, 0, sizeof(cpu->regs.gregs));
  128. memset (&cpu->regs.alt_gregs, 0, sizeof(cpu->regs.alt_gregs));
  129. /* Make our register set point to the right place. */
  130. set_active_regs (cpu);
  131. /* ABI specifies initial values for these registers. */
  132. gr[0] = DEFAULT_MEMORY_SIZE - 4;
  133. /* dac fix, the stack address must be 8-byte aligned! */
  134. gr[0] = gr[0] - gr[0] % 8;
  135. gr[PARM1] = 0;
  136. gr[PARM2] = 0;
  137. gr[PARM3] = 0;
  138. gr[PARM4] = gr[0];
  139. }
  140. /* Simulate a monitor trap. */
  141. static void
  142. handle_trap1 (SIM_DESC sd, SIM_CPU *cpu)
  143. {
  144. /* XXX: We don't pass back the actual errno value. */
  145. gr[RET1] = sim_syscall (cpu, gr[TRAPCODE], gr[PARM1], gr[PARM2], gr[PARM3],
  146. gr[PARM4]);
  147. }
  148. static void
  149. process_stub (SIM_DESC sd, SIM_CPU *cpu, int what)
  150. {
  151. /* These values should match those in libgloss/mcore/syscalls.s. */
  152. switch (what)
  153. {
  154. case 3: /* _read */
  155. case 4: /* _write */
  156. case 5: /* _open */
  157. case 6: /* _close */
  158. case 10: /* _unlink */
  159. case 19: /* _lseek */
  160. case 43: /* _times */
  161. gr[TRAPCODE] = what;
  162. handle_trap1 (sd, cpu);
  163. break;
  164. default:
  165. if (STATE_VERBOSE_P (sd))
  166. fprintf (stderr, "Unhandled stub opcode: %d\n", what);
  167. break;
  168. }
  169. }
  170. static void
  171. util (SIM_DESC sd, SIM_CPU *cpu, unsigned what)
  172. {
  173. switch (what)
  174. {
  175. case 0: /* exit */
  176. sim_engine_halt (sd, cpu, NULL, cpu->regs.pc, sim_exited, gr[PARM1]);
  177. break;
  178. case 1: /* printf */
  179. if (STATE_VERBOSE_P (sd))
  180. fprintf (stderr, "WARNING: printf unimplemented\n");
  181. break;
  182. case 2: /* scanf */
  183. if (STATE_VERBOSE_P (sd))
  184. fprintf (stderr, "WARNING: scanf unimplemented\n");
  185. break;
  186. case 3: /* utime */
  187. gr[RET1] = cpu->insts;
  188. break;
  189. case 0xFF:
  190. process_stub (sd, cpu, gr[1]);
  191. break;
  192. default:
  193. if (STATE_VERBOSE_P (sd))
  194. fprintf (stderr, "Unhandled util code: %x\n", what);
  195. break;
  196. }
  197. }
  198. /* For figuring out whether we carried; addc/subc use this. */
  199. static int
  200. iu_carry (unsigned long a, unsigned long b, int cin)
  201. {
  202. unsigned long x;
  203. x = (a & 0xffff) + (b & 0xffff) + cin;
  204. x = (x >> 16) + (a >> 16) + (b >> 16);
  205. x >>= 16;
  206. return (x != 0);
  207. }
  208. /* TODO: Convert to common watchpoints. */
  209. #undef WATCHFUNCTIONS
  210. #ifdef WATCHFUNCTIONS
  211. #define MAXWL 80
  212. word WL[MAXWL];
  213. char * WLstr[MAXWL];
  214. int ENDWL=0;
  215. int WLincyc;
  216. int WLcyc[MAXWL];
  217. int WLcnts[MAXWL];
  218. int WLmax[MAXWL];
  219. int WLmin[MAXWL];
  220. word WLendpc;
  221. int WLbcyc;
  222. int WLW;
  223. #endif
  224. #define RD (inst & 0xF)
  225. #define RS ((inst >> 4) & 0xF)
  226. #define RX ((inst >> 8) & 0xF)
  227. #define IMM5 ((inst >> 4) & 0x1F)
  228. #define IMM4 ((inst) & 0xF)
  229. #define rbat(X) sim_core_read_1 (cpu, 0, read_map, X)
  230. #define rhat(X) sim_core_read_2 (cpu, 0, read_map, X)
  231. #define rlat(X) sim_core_read_4 (cpu, 0, read_map, X)
  232. #define wbat(X, D) sim_core_write_1 (cpu, 0, write_map, X, D)
  233. #define what(X, D) sim_core_write_2 (cpu, 0, write_map, X, D)
  234. #define wlat(X, D) sim_core_write_4 (cpu, 0, write_map, X, D)
  235. static int tracing = 0;
  236. #define ILLEGAL() \
  237. sim_engine_halt (sd, cpu, NULL, pc, sim_stopped, SIM_SIGILL)
  238. static void
  239. step_once (SIM_DESC sd, SIM_CPU *cpu)
  240. {
  241. int needfetch;
  242. word ibuf;
  243. word pc;
  244. unsigned short inst;
  245. int memops;
  246. int bonus_cycles;
  247. int insts;
  248. int w;
  249. int cycs;
  250. #ifdef WATCHFUNCTIONS
  251. word WLhash;
  252. #endif
  253. pc = CPU_PC_GET (cpu);
  254. /* Fetch the initial instructions that we'll decode. */
  255. ibuf = rlat (pc & 0xFFFFFFFC);
  256. needfetch = 0;
  257. memops = 0;
  258. bonus_cycles = 0;
  259. insts = 0;
  260. /* make our register set point to the right place */
  261. set_active_regs (cpu);
  262. #ifdef WATCHFUNCTIONS
  263. /* make a hash to speed exec loop, hope it's nonzero */
  264. WLhash = 0xFFFFFFFF;
  265. for (w = 1; w <= ENDWL; w++)
  266. WLhash = WLhash & WL[w];
  267. #endif
  268. /* TODO: Unindent this block. */
  269. {
  270. word oldpc;
  271. insts ++;
  272. if (pc & 02)
  273. {
  274. if (! target_big_endian)
  275. inst = ibuf >> 16;
  276. else
  277. inst = ibuf & 0xFFFF;
  278. needfetch = 1;
  279. }
  280. else
  281. {
  282. if (! target_big_endian)
  283. inst = ibuf & 0xFFFF;
  284. else
  285. inst = ibuf >> 16;
  286. }
  287. #ifdef WATCHFUNCTIONS
  288. /* now scan list of watch addresses, if match, count it and
  289. note return address and count cycles until pc=return address */
  290. if ((WLincyc == 1) && (pc == WLendpc))
  291. {
  292. cycs = (cpu->cycles + (insts + bonus_cycles +
  293. (memops * memcycles)) - WLbcyc);
  294. if (WLcnts[WLW] == 1)
  295. {
  296. WLmax[WLW] = cycs;
  297. WLmin[WLW] = cycs;
  298. WLcyc[WLW] = 0;
  299. }
  300. if (cycs > WLmax[WLW])
  301. {
  302. WLmax[WLW] = cycs;
  303. }
  304. if (cycs < WLmin[WLW])
  305. {
  306. WLmin[WLW] = cycs;
  307. }
  308. WLcyc[WLW] += cycs;
  309. WLincyc = 0;
  310. WLendpc = 0;
  311. }
  312. /* Optimize with a hash to speed loop. */
  313. if (WLincyc == 0)
  314. {
  315. if ((WLhash == 0) || ((WLhash & pc) != 0))
  316. {
  317. for (w=1; w <= ENDWL; w++)
  318. {
  319. if (pc == WL[w])
  320. {
  321. WLcnts[w]++;
  322. WLbcyc = cpu->cycles + insts
  323. + bonus_cycles + (memops * memcycles);
  324. WLendpc = gr[15];
  325. WLincyc = 1;
  326. WLW = w;
  327. break;
  328. }
  329. }
  330. }
  331. }
  332. #endif
  333. if (tracing)
  334. fprintf (stderr, "%.4lx: inst = %.4x ", pc, inst);
  335. oldpc = pc;
  336. pc += 2;
  337. switch (inst >> 8)
  338. {
  339. case 0x00:
  340. switch RS
  341. {
  342. case 0x0:
  343. switch RD
  344. {
  345. case 0x0: /* bkpt */
  346. pc -= 2;
  347. sim_engine_halt (sd, cpu, NULL, pc - 2,
  348. sim_stopped, SIM_SIGTRAP);
  349. break;
  350. case 0x1: /* sync */
  351. break;
  352. case 0x2: /* rte */
  353. pc = epc;
  354. sr = esr;
  355. needfetch = 1;
  356. set_active_regs (cpu);
  357. break;
  358. case 0x3: /* rfi */
  359. pc = fpc;
  360. sr = fsr;
  361. needfetch = 1;
  362. set_active_regs (cpu);
  363. break;
  364. case 0x4: /* stop */
  365. if (STATE_VERBOSE_P (sd))
  366. fprintf (stderr, "WARNING: stop unimplemented\n");
  367. break;
  368. case 0x5: /* wait */
  369. if (STATE_VERBOSE_P (sd))
  370. fprintf (stderr, "WARNING: wait unimplemented\n");
  371. break;
  372. case 0x6: /* doze */
  373. if (STATE_VERBOSE_P (sd))
  374. fprintf (stderr, "WARNING: doze unimplemented\n");
  375. break;
  376. case 0x7:
  377. ILLEGAL (); /* illegal */
  378. break;
  379. case 0x8: /* trap 0 */
  380. case 0xA: /* trap 2 */
  381. case 0xB: /* trap 3 */
  382. sim_engine_halt (sd, cpu, NULL, pc,
  383. sim_stopped, SIM_SIGTRAP);
  384. break;
  385. case 0xC: /* trap 4 */
  386. case 0xD: /* trap 5 */
  387. case 0xE: /* trap 6 */
  388. ILLEGAL (); /* illegal */
  389. break;
  390. case 0xF: /* trap 7 */
  391. sim_engine_halt (sd, cpu, NULL, pc, /* integer div-by-0 */
  392. sim_stopped, SIM_SIGTRAP);
  393. break;
  394. case 0x9: /* trap 1 */
  395. handle_trap1 (sd, cpu);
  396. break;
  397. }
  398. break;
  399. case 0x1:
  400. ILLEGAL (); /* illegal */
  401. break;
  402. case 0x2: /* mvc */
  403. gr[RD] = C_VALUE();
  404. break;
  405. case 0x3: /* mvcv */
  406. gr[RD] = C_OFF();
  407. break;
  408. case 0x4: /* ldq */
  409. {
  410. word addr = gr[RD];
  411. int regno = 4; /* always r4-r7 */
  412. bonus_cycles++;
  413. memops += 4;
  414. do
  415. {
  416. gr[regno] = rlat (addr);
  417. addr += 4;
  418. regno++;
  419. }
  420. while ((regno&0x3) != 0);
  421. }
  422. break;
  423. case 0x5: /* stq */
  424. {
  425. word addr = gr[RD];
  426. int regno = 4; /* always r4-r7 */
  427. memops += 4;
  428. bonus_cycles++;
  429. do
  430. {
  431. wlat (addr, gr[regno]);
  432. addr += 4;
  433. regno++;
  434. }
  435. while ((regno & 0x3) != 0);
  436. }
  437. break;
  438. case 0x6: /* ldm */
  439. {
  440. word addr = gr[0];
  441. int regno = RD;
  442. /* bonus cycle is really only needed if
  443. the next insn shifts the last reg loaded.
  444. bonus_cycles++;
  445. */
  446. memops += 16-regno;
  447. while (regno <= 0xF)
  448. {
  449. gr[regno] = rlat (addr);
  450. addr += 4;
  451. regno++;
  452. }
  453. }
  454. break;
  455. case 0x7: /* stm */
  456. {
  457. word addr = gr[0];
  458. int regno = RD;
  459. /* this should be removed! */
  460. /* bonus_cycles ++; */
  461. memops += 16 - regno;
  462. while (regno <= 0xF)
  463. {
  464. wlat (addr, gr[regno]);
  465. addr += 4;
  466. regno++;
  467. }
  468. }
  469. break;
  470. case 0x8: /* dect */
  471. gr[RD] -= C_VALUE();
  472. break;
  473. case 0x9: /* decf */
  474. gr[RD] -= C_OFF();
  475. break;
  476. case 0xA: /* inct */
  477. gr[RD] += C_VALUE();
  478. break;
  479. case 0xB: /* incf */
  480. gr[RD] += C_OFF();
  481. break;
  482. case 0xC: /* jmp */
  483. pc = gr[RD];
  484. if (tracing && RD == 15)
  485. fprintf (stderr, "Func return, r2 = %lxx, r3 = %lx\n",
  486. gr[2], gr[3]);
  487. bonus_cycles++;
  488. needfetch = 1;
  489. break;
  490. case 0xD: /* jsr */
  491. gr[15] = pc;
  492. pc = gr[RD];
  493. bonus_cycles++;
  494. needfetch = 1;
  495. break;
  496. case 0xE: /* ff1 */
  497. {
  498. word tmp, i;
  499. tmp = gr[RD];
  500. for (i = 0; !(tmp & 0x80000000) && i < 32; i++)
  501. tmp <<= 1;
  502. gr[RD] = i;
  503. }
  504. break;
  505. case 0xF: /* brev */
  506. {
  507. word tmp;
  508. tmp = gr[RD];
  509. tmp = ((tmp & 0xaaaaaaaa) >> 1) | ((tmp & 0x55555555) << 1);
  510. tmp = ((tmp & 0xcccccccc) >> 2) | ((tmp & 0x33333333) << 2);
  511. tmp = ((tmp & 0xf0f0f0f0) >> 4) | ((tmp & 0x0f0f0f0f) << 4);
  512. tmp = ((tmp & 0xff00ff00) >> 8) | ((tmp & 0x00ff00ff) << 8);
  513. gr[RD] = ((tmp & 0xffff0000) >> 16) | ((tmp & 0x0000ffff) << 16);
  514. }
  515. break;
  516. }
  517. break;
  518. case 0x01:
  519. switch RS
  520. {
  521. case 0x0: /* xtrb3 */
  522. gr[1] = (gr[RD]) & 0xFF;
  523. NEW_C (gr[RD] != 0);
  524. break;
  525. case 0x1: /* xtrb2 */
  526. gr[1] = (gr[RD]>>8) & 0xFF;
  527. NEW_C (gr[RD] != 0);
  528. break;
  529. case 0x2: /* xtrb1 */
  530. gr[1] = (gr[RD]>>16) & 0xFF;
  531. NEW_C (gr[RD] != 0);
  532. break;
  533. case 0x3: /* xtrb0 */
  534. gr[1] = (gr[RD]>>24) & 0xFF;
  535. NEW_C (gr[RD] != 0);
  536. break;
  537. case 0x4: /* zextb */
  538. gr[RD] &= 0x000000FF;
  539. break;
  540. case 0x5: /* sextb */
  541. {
  542. long tmp;
  543. tmp = gr[RD];
  544. tmp <<= 24;
  545. tmp >>= 24;
  546. gr[RD] = tmp;
  547. }
  548. break;
  549. case 0x6: /* zexth */
  550. gr[RD] &= 0x0000FFFF;
  551. break;
  552. case 0x7: /* sexth */
  553. {
  554. long tmp;
  555. tmp = gr[RD];
  556. tmp <<= 16;
  557. tmp >>= 16;
  558. gr[RD] = tmp;
  559. }
  560. break;
  561. case 0x8: /* declt */
  562. --gr[RD];
  563. NEW_C ((long)gr[RD] < 0);
  564. break;
  565. case 0x9: /* tstnbz */
  566. {
  567. word tmp = gr[RD];
  568. NEW_C ((tmp & 0xFF000000) != 0 &&
  569. (tmp & 0x00FF0000) != 0 && (tmp & 0x0000FF00) != 0 &&
  570. (tmp & 0x000000FF) != 0);
  571. }
  572. break;
  573. case 0xA: /* decgt */
  574. --gr[RD];
  575. NEW_C ((long)gr[RD] > 0);
  576. break;
  577. case 0xB: /* decne */
  578. --gr[RD];
  579. NEW_C ((long)gr[RD] != 0);
  580. break;
  581. case 0xC: /* clrt */
  582. if (C_ON())
  583. gr[RD] = 0;
  584. break;
  585. case 0xD: /* clrf */
  586. if (C_OFF())
  587. gr[RD] = 0;
  588. break;
  589. case 0xE: /* abs */
  590. if (gr[RD] & 0x80000000)
  591. gr[RD] = ~gr[RD] + 1;
  592. break;
  593. case 0xF: /* not */
  594. gr[RD] = ~gr[RD];
  595. break;
  596. }
  597. break;
  598. case 0x02: /* movt */
  599. if (C_ON())
  600. gr[RD] = gr[RS];
  601. break;
  602. case 0x03: /* mult */
  603. /* consume 2 bits per cycle from rs, until rs is 0 */
  604. {
  605. unsigned int t = gr[RS];
  606. int ticks;
  607. for (ticks = 0; t != 0 ; t >>= 2)
  608. ticks++;
  609. bonus_cycles += ticks;
  610. }
  611. bonus_cycles += 2; /* min. is 3, so add 2, plus ticks above */
  612. if (tracing)
  613. fprintf (stderr, " mult %lx by %lx to give %lx",
  614. gr[RD], gr[RS], gr[RD] * gr[RS]);
  615. gr[RD] = gr[RD] * gr[RS];
  616. break;
  617. case 0x04: /* loopt */
  618. if (C_ON())
  619. {
  620. pc += (IMM4 << 1) - 32;
  621. bonus_cycles ++;
  622. needfetch = 1;
  623. }
  624. --gr[RS]; /* not RD! */
  625. NEW_C (((long)gr[RS]) > 0);
  626. break;
  627. case 0x05: /* subu */
  628. gr[RD] -= gr[RS];
  629. break;
  630. case 0x06: /* addc */
  631. {
  632. unsigned long tmp, a, b;
  633. a = gr[RD];
  634. b = gr[RS];
  635. gr[RD] = a + b + C_VALUE ();
  636. tmp = iu_carry (a, b, C_VALUE ());
  637. NEW_C (tmp);
  638. }
  639. break;
  640. case 0x07: /* subc */
  641. {
  642. unsigned long tmp, a, b;
  643. a = gr[RD];
  644. b = gr[RS];
  645. gr[RD] = a - b + C_VALUE () - 1;
  646. tmp = iu_carry (a,~b, C_VALUE ());
  647. NEW_C (tmp);
  648. }
  649. break;
  650. case 0x08: /* illegal */
  651. case 0x09: /* illegal*/
  652. ILLEGAL ();
  653. break;
  654. case 0x0A: /* movf */
  655. if (C_OFF())
  656. gr[RD] = gr[RS];
  657. break;
  658. case 0x0B: /* lsr */
  659. {
  660. unsigned long dst, src;
  661. dst = gr[RD];
  662. src = gr[RS];
  663. /* We must not rely solely upon the native shift operations, since they
  664. may not match the M*Core's behaviour on boundary conditions. */
  665. dst = src > 31 ? 0 : dst >> src;
  666. gr[RD] = dst;
  667. }
  668. break;
  669. case 0x0C: /* cmphs */
  670. NEW_C ((unsigned long )gr[RD] >=
  671. (unsigned long)gr[RS]);
  672. break;
  673. case 0x0D: /* cmplt */
  674. NEW_C ((long)gr[RD] < (long)gr[RS]);
  675. break;
  676. case 0x0E: /* tst */
  677. NEW_C ((gr[RD] & gr[RS]) != 0);
  678. break;
  679. case 0x0F: /* cmpne */
  680. NEW_C (gr[RD] != gr[RS]);
  681. break;
  682. case 0x10: case 0x11: /* mfcr */
  683. {
  684. unsigned r;
  685. r = IMM5;
  686. if (r <= LAST_VALID_CREG)
  687. gr[RD] = cr[r];
  688. else
  689. ILLEGAL ();
  690. }
  691. break;
  692. case 0x12: /* mov */
  693. gr[RD] = gr[RS];
  694. if (tracing)
  695. fprintf (stderr, "MOV %lx into reg %d", gr[RD], RD);
  696. break;
  697. case 0x13: /* bgenr */
  698. if (gr[RS] & 0x20)
  699. gr[RD] = 0;
  700. else
  701. gr[RD] = 1 << (gr[RS] & 0x1F);
  702. break;
  703. case 0x14: /* rsub */
  704. gr[RD] = gr[RS] - gr[RD];
  705. break;
  706. case 0x15: /* ixw */
  707. gr[RD] += gr[RS]<<2;
  708. break;
  709. case 0x16: /* and */
  710. gr[RD] &= gr[RS];
  711. break;
  712. case 0x17: /* xor */
  713. gr[RD] ^= gr[RS];
  714. break;
  715. case 0x18: case 0x19: /* mtcr */
  716. {
  717. unsigned r;
  718. r = IMM5;
  719. if (r <= LAST_VALID_CREG)
  720. cr[r] = gr[RD];
  721. else
  722. ILLEGAL ();
  723. /* we might have changed register sets... */
  724. set_active_regs (cpu);
  725. }
  726. break;
  727. case 0x1A: /* asr */
  728. /* We must not rely solely upon the native shift operations, since they
  729. may not match the M*Core's behaviour on boundary conditions. */
  730. if (gr[RS] > 30)
  731. gr[RD] = ((long) gr[RD]) < 0 ? -1 : 0;
  732. else
  733. gr[RD] = (long) gr[RD] >> gr[RS];
  734. break;
  735. case 0x1B: /* lsl */
  736. /* We must not rely solely upon the native shift operations, since they
  737. may not match the M*Core's behaviour on boundary conditions. */
  738. gr[RD] = gr[RS] > 31 ? 0 : gr[RD] << gr[RS];
  739. break;
  740. case 0x1C: /* addu */
  741. gr[RD] += gr[RS];
  742. break;
  743. case 0x1D: /* ixh */
  744. gr[RD] += gr[RS] << 1;
  745. break;
  746. case 0x1E: /* or */
  747. gr[RD] |= gr[RS];
  748. break;
  749. case 0x1F: /* andn */
  750. gr[RD] &= ~gr[RS];
  751. break;
  752. case 0x20: case 0x21: /* addi */
  753. gr[RD] =
  754. gr[RD] + (IMM5 + 1);
  755. break;
  756. case 0x22: case 0x23: /* cmplti */
  757. {
  758. int tmp = (IMM5 + 1);
  759. if (gr[RD] < tmp)
  760. {
  761. SET_C();
  762. }
  763. else
  764. {
  765. CLR_C();
  766. }
  767. }
  768. break;
  769. case 0x24: case 0x25: /* subi */
  770. gr[RD] =
  771. gr[RD] - (IMM5 + 1);
  772. break;
  773. case 0x26: case 0x27: /* illegal */
  774. ILLEGAL ();
  775. break;
  776. case 0x28: case 0x29: /* rsubi */
  777. gr[RD] =
  778. IMM5 - gr[RD];
  779. break;
  780. case 0x2A: case 0x2B: /* cmpnei */
  781. if (gr[RD] != IMM5)
  782. {
  783. SET_C();
  784. }
  785. else
  786. {
  787. CLR_C();
  788. }
  789. break;
  790. case 0x2C: case 0x2D: /* bmaski, divu */
  791. {
  792. unsigned imm = IMM5;
  793. if (imm == 1)
  794. {
  795. int exe;
  796. int rxnlz, r1nlz;
  797. unsigned int rx, r1;
  798. rx = gr[RD];
  799. r1 = gr[1];
  800. exe = 0;
  801. /* unsigned divide */
  802. gr[RD] = (word) ((unsigned int) gr[RD] / (unsigned int)gr[1] );
  803. /* compute bonus_cycles for divu */
  804. for (r1nlz = 0; ((r1 & 0x80000000) == 0) && (r1nlz < 32); r1nlz ++)
  805. r1 = r1 << 1;
  806. for (rxnlz = 0; ((rx & 0x80000000) == 0) && (rxnlz < 32); rxnlz ++)
  807. rx = rx << 1;
  808. if (r1nlz < rxnlz)
  809. exe += 4;
  810. else
  811. exe += 5 + r1nlz - rxnlz;
  812. if (exe >= (2 * memcycles - 1))
  813. {
  814. bonus_cycles += exe - (2 * memcycles) + 1;
  815. }
  816. }
  817. else if (imm == 0 || imm >= 8)
  818. {
  819. /* bmaski */
  820. if (imm == 0)
  821. gr[RD] = -1;
  822. else
  823. gr[RD] = (1 << imm) - 1;
  824. }
  825. else
  826. {
  827. /* illegal */
  828. ILLEGAL ();
  829. }
  830. }
  831. break;
  832. case 0x2E: case 0x2F: /* andi */
  833. gr[RD] = gr[RD] & IMM5;
  834. break;
  835. case 0x30: case 0x31: /* bclri */
  836. gr[RD] = gr[RD] & ~(1<<IMM5);
  837. break;
  838. case 0x32: case 0x33: /* bgeni, divs */
  839. {
  840. unsigned imm = IMM5;
  841. if (imm == 1)
  842. {
  843. int exe,sc;
  844. int rxnlz, r1nlz;
  845. signed int rx, r1;
  846. /* compute bonus_cycles for divu */
  847. rx = gr[RD];
  848. r1 = gr[1];
  849. exe = 0;
  850. if (((rx < 0) && (r1 > 0)) || ((rx >= 0) && (r1 < 0)))
  851. sc = 1;
  852. else
  853. sc = 0;
  854. rx = abs (rx);
  855. r1 = abs (r1);
  856. /* signed divide, general registers are of type int, so / op is OK */
  857. gr[RD] = gr[RD] / gr[1];
  858. for (r1nlz = 0; ((r1 & 0x80000000) == 0) && (r1nlz < 32) ; r1nlz ++ )
  859. r1 = r1 << 1;
  860. for (rxnlz = 0; ((rx & 0x80000000) == 0) && (rxnlz < 32) ; rxnlz ++ )
  861. rx = rx << 1;
  862. if (r1nlz < rxnlz)
  863. exe += 5;
  864. else
  865. exe += 6 + r1nlz - rxnlz + sc;
  866. if (exe >= (2 * memcycles - 1))
  867. {
  868. bonus_cycles += exe - (2 * memcycles) + 1;
  869. }
  870. }
  871. else if (imm >= 7)
  872. {
  873. /* bgeni */
  874. gr[RD] = (1 << IMM5);
  875. }
  876. else
  877. {
  878. /* illegal */
  879. ILLEGAL ();
  880. }
  881. break;
  882. }
  883. case 0x34: case 0x35: /* bseti */
  884. gr[RD] = gr[RD] | (1 << IMM5);
  885. break;
  886. case 0x36: case 0x37: /* btsti */
  887. NEW_C (gr[RD] >> IMM5);
  888. break;
  889. case 0x38: case 0x39: /* xsr, rotli */
  890. {
  891. unsigned imm = IMM5;
  892. unsigned long tmp = gr[RD];
  893. if (imm == 0)
  894. {
  895. word cbit;
  896. cbit = C_VALUE();
  897. NEW_C (tmp);
  898. gr[RD] = (cbit << 31) | (tmp >> 1);
  899. }
  900. else
  901. gr[RD] = (tmp << imm) | (tmp >> (32 - imm));
  902. }
  903. break;
  904. case 0x3A: case 0x3B: /* asrc, asri */
  905. {
  906. unsigned imm = IMM5;
  907. long tmp = gr[RD];
  908. if (imm == 0)
  909. {
  910. NEW_C (tmp);
  911. gr[RD] = tmp >> 1;
  912. }
  913. else
  914. gr[RD] = tmp >> imm;
  915. }
  916. break;
  917. case 0x3C: case 0x3D: /* lslc, lsli */
  918. {
  919. unsigned imm = IMM5;
  920. unsigned long tmp = gr[RD];
  921. if (imm == 0)
  922. {
  923. NEW_C (tmp >> 31);
  924. gr[RD] = tmp << 1;
  925. }
  926. else
  927. gr[RD] = tmp << imm;
  928. }
  929. break;
  930. case 0x3E: case 0x3F: /* lsrc, lsri */
  931. {
  932. unsigned imm = IMM5;
  933. unsigned long tmp = gr[RD];
  934. if (imm == 0)
  935. {
  936. NEW_C (tmp);
  937. gr[RD] = tmp >> 1;
  938. }
  939. else
  940. gr[RD] = tmp >> imm;
  941. }
  942. break;
  943. case 0x40: case 0x41: case 0x42: case 0x43:
  944. case 0x44: case 0x45: case 0x46: case 0x47:
  945. case 0x48: case 0x49: case 0x4A: case 0x4B:
  946. case 0x4C: case 0x4D: case 0x4E: case 0x4F:
  947. ILLEGAL ();
  948. break;
  949. case 0x50:
  950. util (sd, cpu, inst & 0xFF);
  951. break;
  952. case 0x51: case 0x52: case 0x53:
  953. case 0x54: case 0x55: case 0x56: case 0x57:
  954. case 0x58: case 0x59: case 0x5A: case 0x5B:
  955. case 0x5C: case 0x5D: case 0x5E: case 0x5F:
  956. ILLEGAL ();
  957. break;
  958. case 0x60: case 0x61: case 0x62: case 0x63: /* movi */
  959. case 0x64: case 0x65: case 0x66: case 0x67:
  960. gr[RD] = (inst >> 4) & 0x7F;
  961. break;
  962. case 0x68: case 0x69: case 0x6A: case 0x6B:
  963. case 0x6C: case 0x6D: case 0x6E: case 0x6F: /* illegal */
  964. ILLEGAL ();
  965. break;
  966. case 0x71: case 0x72: case 0x73:
  967. case 0x74: case 0x75: case 0x76: case 0x77:
  968. case 0x78: case 0x79: case 0x7A: case 0x7B:
  969. case 0x7C: case 0x7D: case 0x7E: /* lrw */
  970. gr[RX] = rlat ((pc + ((inst & 0xFF) << 2)) & 0xFFFFFFFC);
  971. if (tracing)
  972. fprintf (stderr, "LRW of 0x%x from 0x%lx to reg %d",
  973. rlat ((pc + ((inst & 0xFF) << 2)) & 0xFFFFFFFC),
  974. (pc + ((inst & 0xFF) << 2)) & 0xFFFFFFFC, RX);
  975. memops++;
  976. break;
  977. case 0x7F: /* jsri */
  978. gr[15] = pc;
  979. if (tracing)
  980. fprintf (stderr,
  981. "func call: r2 = %lx r3 = %lx r4 = %lx r5 = %lx r6 = %lx r7 = %lx\n",
  982. gr[2], gr[3], gr[4], gr[5], gr[6], gr[7]);
  983. case 0x70: /* jmpi */
  984. pc = rlat ((pc + ((inst & 0xFF) << 2)) & 0xFFFFFFFC);
  985. memops++;
  986. bonus_cycles++;
  987. needfetch = 1;
  988. break;
  989. case 0x80: case 0x81: case 0x82: case 0x83:
  990. case 0x84: case 0x85: case 0x86: case 0x87:
  991. case 0x88: case 0x89: case 0x8A: case 0x8B:
  992. case 0x8C: case 0x8D: case 0x8E: case 0x8F: /* ld */
  993. gr[RX] = rlat (gr[RD] + ((inst >> 2) & 0x003C));
  994. if (tracing)
  995. fprintf (stderr, "load reg %d from 0x%lx with 0x%lx",
  996. RX,
  997. gr[RD] + ((inst >> 2) & 0x003C), gr[RX]);
  998. memops++;
  999. break;
  1000. case 0x90: case 0x91: case 0x92: case 0x93:
  1001. case 0x94: case 0x95: case 0x96: case 0x97:
  1002. case 0x98: case 0x99: case 0x9A: case 0x9B:
  1003. case 0x9C: case 0x9D: case 0x9E: case 0x9F: /* st */
  1004. wlat (gr[RD] + ((inst >> 2) & 0x003C), gr[RX]);
  1005. if (tracing)
  1006. fprintf (stderr, "store reg %d (containing 0x%lx) to 0x%lx",
  1007. RX, gr[RX],
  1008. gr[RD] + ((inst >> 2) & 0x003C));
  1009. memops++;
  1010. break;
  1011. case 0xA0: case 0xA1: case 0xA2: case 0xA3:
  1012. case 0xA4: case 0xA5: case 0xA6: case 0xA7:
  1013. case 0xA8: case 0xA9: case 0xAA: case 0xAB:
  1014. case 0xAC: case 0xAD: case 0xAE: case 0xAF: /* ld.b */
  1015. gr[RX] = rbat (gr[RD] + RS);
  1016. memops++;
  1017. break;
  1018. case 0xB0: case 0xB1: case 0xB2: case 0xB3:
  1019. case 0xB4: case 0xB5: case 0xB6: case 0xB7:
  1020. case 0xB8: case 0xB9: case 0xBA: case 0xBB:
  1021. case 0xBC: case 0xBD: case 0xBE: case 0xBF: /* st.b */
  1022. wbat (gr[RD] + RS, gr[RX]);
  1023. memops++;
  1024. break;
  1025. case 0xC0: case 0xC1: case 0xC2: case 0xC3:
  1026. case 0xC4: case 0xC5: case 0xC6: case 0xC7:
  1027. case 0xC8: case 0xC9: case 0xCA: case 0xCB:
  1028. case 0xCC: case 0xCD: case 0xCE: case 0xCF: /* ld.h */
  1029. gr[RX] = rhat (gr[RD] + ((inst >> 3) & 0x001E));
  1030. memops++;
  1031. break;
  1032. case 0xD0: case 0xD1: case 0xD2: case 0xD3:
  1033. case 0xD4: case 0xD5: case 0xD6: case 0xD7:
  1034. case 0xD8: case 0xD9: case 0xDA: case 0xDB:
  1035. case 0xDC: case 0xDD: case 0xDE: case 0xDF: /* st.h */
  1036. what (gr[RD] + ((inst >> 3) & 0x001E), gr[RX]);
  1037. memops++;
  1038. break;
  1039. case 0xE8: case 0xE9: case 0xEA: case 0xEB:
  1040. case 0xEC: case 0xED: case 0xEE: case 0xEF: /* bf */
  1041. if (C_OFF())
  1042. {
  1043. int disp;
  1044. disp = inst & 0x03FF;
  1045. if (inst & 0x0400)
  1046. disp |= 0xFFFFFC00;
  1047. pc += disp<<1;
  1048. bonus_cycles++;
  1049. needfetch = 1;
  1050. }
  1051. break;
  1052. case 0xE0: case 0xE1: case 0xE2: case 0xE3:
  1053. case 0xE4: case 0xE5: case 0xE6: case 0xE7: /* bt */
  1054. if (C_ON())
  1055. {
  1056. int disp;
  1057. disp = inst & 0x03FF;
  1058. if (inst & 0x0400)
  1059. disp |= 0xFFFFFC00;
  1060. pc += disp<<1;
  1061. bonus_cycles++;
  1062. needfetch = 1;
  1063. }
  1064. break;
  1065. case 0xF8: case 0xF9: case 0xFA: case 0xFB:
  1066. case 0xFC: case 0xFD: case 0xFE: case 0xFF: /* bsr */
  1067. gr[15] = pc;
  1068. case 0xF0: case 0xF1: case 0xF2: case 0xF3:
  1069. case 0xF4: case 0xF5: case 0xF6: case 0xF7: /* br */
  1070. {
  1071. int disp;
  1072. disp = inst & 0x03FF;
  1073. if (inst & 0x0400)
  1074. disp |= 0xFFFFFC00;
  1075. pc += disp<<1;
  1076. bonus_cycles++;
  1077. needfetch = 1;
  1078. }
  1079. break;
  1080. }
  1081. if (tracing)
  1082. fprintf (stderr, "\n");
  1083. if (needfetch)
  1084. {
  1085. ibuf = rlat (pc & 0xFFFFFFFC);
  1086. needfetch = 0;
  1087. }
  1088. }
  1089. /* Hide away the things we've cached while executing. */
  1090. CPU_PC_SET (cpu, pc);
  1091. cpu->insts += insts; /* instructions done ... */
  1092. cpu->cycles += insts; /* and each takes a cycle */
  1093. cpu->cycles += bonus_cycles; /* and extra cycles for branches */
  1094. cpu->cycles += memops * memcycles; /* and memop cycle delays */
  1095. }
  1096. void
  1097. sim_engine_run (SIM_DESC sd,
  1098. int next_cpu_nr, /* ignore */
  1099. int nr_cpus, /* ignore */
  1100. int siggnal) /* ignore */
  1101. {
  1102. sim_cpu *cpu;
  1103. SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
  1104. cpu = STATE_CPU (sd, 0);
  1105. while (1)
  1106. {
  1107. step_once (sd, cpu);
  1108. if (sim_events_tick (sd))
  1109. sim_events_process (sd);
  1110. }
  1111. }
  1112. static int
  1113. mcore_reg_store (SIM_CPU *cpu, int rn, unsigned char *memory, int length)
  1114. {
  1115. if (rn < NUM_MCORE_REGS && rn >= 0)
  1116. {
  1117. if (length == 4)
  1118. {
  1119. long ival;
  1120. /* misalignment safe */
  1121. ival = mcore_extract_unsigned_integer (memory, 4);
  1122. cpu->asints[rn] = ival;
  1123. }
  1124. return 4;
  1125. }
  1126. else
  1127. return 0;
  1128. }
  1129. static int
  1130. mcore_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *memory, int length)
  1131. {
  1132. if (rn < NUM_MCORE_REGS && rn >= 0)
  1133. {
  1134. if (length == 4)
  1135. {
  1136. long ival = cpu->asints[rn];
  1137. /* misalignment-safe */
  1138. mcore_store_unsigned_integer (memory, 4, ival);
  1139. }
  1140. return 4;
  1141. }
  1142. else
  1143. return 0;
  1144. }
  1145. void
  1146. sim_info (SIM_DESC sd, int verbose)
  1147. {
  1148. SIM_CPU *cpu = STATE_CPU (sd, 0);
  1149. #ifdef WATCHFUNCTIONS
  1150. int w, wcyc;
  1151. #endif
  1152. double virttime = cpu->cycles / 36.0e6;
  1153. host_callback *callback = STATE_CALLBACK (sd);
  1154. callback->printf_filtered (callback, "\n\n# instructions executed %10d\n",
  1155. cpu->insts);
  1156. callback->printf_filtered (callback, "# cycles %10d\n",
  1157. cpu->cycles);
  1158. callback->printf_filtered (callback, "# pipeline stalls %10d\n",
  1159. cpu->stalls);
  1160. callback->printf_filtered (callback, "# virtual time taken %10.4f\n",
  1161. virttime);
  1162. #ifdef WATCHFUNCTIONS
  1163. callback->printf_filtered (callback, "\nNumber of watched functions: %d\n",
  1164. ENDWL);
  1165. wcyc = 0;
  1166. for (w = 1; w <= ENDWL; w++)
  1167. {
  1168. callback->printf_filtered (callback, "WL = %s %8x\n",WLstr[w],WL[w]);
  1169. callback->printf_filtered (callback, " calls = %d, cycles = %d\n",
  1170. WLcnts[w],WLcyc[w]);
  1171. if (WLcnts[w] != 0)
  1172. callback->printf_filtered (callback,
  1173. " maxcpc = %d, mincpc = %d, avecpc = %d\n",
  1174. WLmax[w],WLmin[w],WLcyc[w]/WLcnts[w]);
  1175. wcyc += WLcyc[w];
  1176. }
  1177. callback->printf_filtered (callback,
  1178. "Total cycles for watched functions: %d\n",wcyc);
  1179. #endif
  1180. }
  1181. static sim_cia
  1182. mcore_pc_get (sim_cpu *cpu)
  1183. {
  1184. return cpu->regs.pc;
  1185. }
  1186. static void
  1187. mcore_pc_set (sim_cpu *cpu, sim_cia pc)
  1188. {
  1189. cpu->regs.pc = pc;
  1190. }
  1191. static void
  1192. free_state (SIM_DESC sd)
  1193. {
  1194. if (STATE_MODULES (sd) != NULL)
  1195. sim_module_uninstall (sd);
  1196. sim_cpu_free_all (sd);
  1197. sim_state_free (sd);
  1198. }
  1199. SIM_DESC
  1200. sim_open (SIM_OPEN_KIND kind, host_callback *cb,
  1201. struct bfd *abfd, char * const *argv)
  1202. {
  1203. int i;
  1204. SIM_DESC sd = sim_state_alloc (kind, cb);
  1205. SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
  1206. /* Set default options before parsing user options. */
  1207. cb->syscall_map = cb_mcore_syscall_map;
  1208. /* The cpu data is kept in a separately allocated chunk of memory. */
  1209. if (sim_cpu_alloc_all (sd, 1) != SIM_RC_OK)
  1210. {
  1211. free_state (sd);
  1212. return 0;
  1213. }
  1214. if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
  1215. {
  1216. free_state (sd);
  1217. return 0;
  1218. }
  1219. /* The parser will print an error message for us, so we silently return. */
  1220. if (sim_parse_args (sd, argv) != SIM_RC_OK)
  1221. {
  1222. free_state (sd);
  1223. return 0;
  1224. }
  1225. /* Check for/establish the a reference program image. */
  1226. if (sim_analyze_program (sd, STATE_PROG_FILE (sd), abfd) != SIM_RC_OK)
  1227. {
  1228. free_state (sd);
  1229. return 0;
  1230. }
  1231. /* Configure/verify the target byte order and other runtime
  1232. configuration options. */
  1233. if (sim_config (sd) != SIM_RC_OK)
  1234. {
  1235. sim_module_uninstall (sd);
  1236. return 0;
  1237. }
  1238. if (sim_post_argv_init (sd) != SIM_RC_OK)
  1239. {
  1240. /* Uninstall the modules to avoid memory leaks,
  1241. file descriptor leaks, etc. */
  1242. sim_module_uninstall (sd);
  1243. return 0;
  1244. }
  1245. /* CPU specific initialization. */
  1246. for (i = 0; i < MAX_NR_PROCESSORS; ++i)
  1247. {
  1248. SIM_CPU *cpu = STATE_CPU (sd, i);
  1249. CPU_REG_FETCH (cpu) = mcore_reg_fetch;
  1250. CPU_REG_STORE (cpu) = mcore_reg_store;
  1251. CPU_PC_FETCH (cpu) = mcore_pc_get;
  1252. CPU_PC_STORE (cpu) = mcore_pc_set;
  1253. set_initial_gprs (cpu); /* Reset the GPR registers. */
  1254. }
  1255. /* Default to a 8 Mbyte (== 2^23) memory space. */
  1256. sim_do_commandf (sd, "memory-size %#x", DEFAULT_MEMORY_SIZE);
  1257. return sd;
  1258. }
  1259. SIM_RC
  1260. sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
  1261. char * const *argv, char * const *env)
  1262. {
  1263. SIM_CPU *cpu = STATE_CPU (sd, 0);
  1264. char * const *avp;
  1265. int nargs = 0;
  1266. int nenv = 0;
  1267. int s_length;
  1268. int l;
  1269. unsigned long strings;
  1270. unsigned long pointers;
  1271. unsigned long hi_stack;
  1272. /* Set the initial register set. */
  1273. set_initial_gprs (cpu);
  1274. hi_stack = DEFAULT_MEMORY_SIZE - 4;
  1275. CPU_PC_SET (cpu, bfd_get_start_address (prog_bfd));
  1276. /* Calculate the argument and environment strings. */
  1277. s_length = 0;
  1278. nargs = 0;
  1279. avp = argv;
  1280. while (avp && *avp)
  1281. {
  1282. l = strlen (*avp) + 1; /* include the null */
  1283. s_length += (l + 3) & ~3; /* make it a 4 byte boundary */
  1284. nargs++; avp++;
  1285. }
  1286. nenv = 0;
  1287. avp = env;
  1288. while (avp && *avp)
  1289. {
  1290. l = strlen (*avp) + 1; /* include the null */
  1291. s_length += (l + 3) & ~ 3;/* make it a 4 byte boundary */
  1292. nenv++; avp++;
  1293. }
  1294. /* Claim some memory for the pointers and strings. */
  1295. pointers = hi_stack - sizeof(word) * (nenv+1+nargs+1);
  1296. pointers &= ~3; /* must be 4-byte aligned */
  1297. gr[0] = pointers;
  1298. strings = gr[0] - s_length;
  1299. strings &= ~3; /* want to make it 4-byte aligned */
  1300. gr[0] = strings;
  1301. /* dac fix, the stack address must be 8-byte aligned! */
  1302. gr[0] = gr[0] - gr[0] % 8;
  1303. /* Loop through the arguments and fill them in. */
  1304. gr[PARM1] = nargs;
  1305. if (nargs == 0)
  1306. {
  1307. /* No strings to fill in. */
  1308. gr[PARM2] = 0;
  1309. }
  1310. else
  1311. {
  1312. gr[PARM2] = pointers;
  1313. avp = argv;
  1314. while (avp && *avp)
  1315. {
  1316. /* Save where we're putting it. */
  1317. wlat (pointers, strings);
  1318. /* Copy the string. */
  1319. l = strlen (* avp) + 1;
  1320. sim_core_write_buffer (sd, cpu, write_map, *avp, strings, l);
  1321. /* Bump the pointers. */
  1322. avp++;
  1323. pointers += 4;
  1324. strings += l+1;
  1325. }
  1326. /* A null to finish the list. */
  1327. wlat (pointers, 0);
  1328. pointers += 4;
  1329. }
  1330. /* Now do the environment pointers. */
  1331. if (nenv == 0)
  1332. {
  1333. /* No strings to fill in. */
  1334. gr[PARM3] = 0;
  1335. }
  1336. else
  1337. {
  1338. gr[PARM3] = pointers;
  1339. avp = env;
  1340. while (avp && *avp)
  1341. {
  1342. /* Save where we're putting it. */
  1343. wlat (pointers, strings);
  1344. /* Copy the string. */
  1345. l = strlen (* avp) + 1;
  1346. sim_core_write_buffer (sd, cpu, write_map, *avp, strings, l);
  1347. /* Bump the pointers. */
  1348. avp++;
  1349. pointers += 4;
  1350. strings += l+1;
  1351. }
  1352. /* A null to finish the list. */
  1353. wlat (pointers, 0);
  1354. pointers += 4;
  1355. }
  1356. return SIM_RC_OK;
  1357. }