machine.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include "hw/hw.h"
  2. #include "hw/boards.h"
  3. #include "qemu-timer.h"
  4. #include "cpu.h"
  5. void cpu_save(QEMUFile *f, void *opaque)
  6. {
  7. CPUSPARCState *env = opaque;
  8. int i;
  9. uint32_t tmp;
  10. // if env->cwp == env->nwindows - 1, this will set the ins of the last
  11. // window as the outs of the first window
  12. cpu_set_cwp(env, env->cwp);
  13. for(i = 0; i < 8; i++)
  14. qemu_put_betls(f, &env->gregs[i]);
  15. qemu_put_be32s(f, &env->nwindows);
  16. for(i = 0; i < env->nwindows * 16; i++)
  17. qemu_put_betls(f, &env->regbase[i]);
  18. /* FPU */
  19. for (i = 0; i < TARGET_DPREGS; i++) {
  20. qemu_put_be32(f, env->fpr[i].l.upper);
  21. qemu_put_be32(f, env->fpr[i].l.lower);
  22. }
  23. qemu_put_betls(f, &env->pc);
  24. qemu_put_betls(f, &env->npc);
  25. qemu_put_betls(f, &env->y);
  26. tmp = cpu_get_psr(env);
  27. qemu_put_be32(f, tmp);
  28. qemu_put_betls(f, &env->fsr);
  29. qemu_put_betls(f, &env->tbr);
  30. tmp = env->interrupt_index;
  31. qemu_put_be32(f, tmp);
  32. qemu_put_be32s(f, &env->pil_in);
  33. #ifndef TARGET_SPARC64
  34. qemu_put_be32s(f, &env->wim);
  35. /* MMU */
  36. for (i = 0; i < 32; i++)
  37. qemu_put_be32s(f, &env->mmuregs[i]);
  38. for (i = 0; i < 4; i++) {
  39. qemu_put_be64s(f, &env->mxccdata[i]);
  40. }
  41. for (i = 0; i < 8; i++) {
  42. qemu_put_be64s(f, &env->mxccregs[i]);
  43. }
  44. qemu_put_be32s(f, &env->mmubpctrv);
  45. qemu_put_be32s(f, &env->mmubpctrc);
  46. qemu_put_be32s(f, &env->mmubpctrs);
  47. qemu_put_be64s(f, &env->mmubpaction);
  48. for (i = 0; i < 4; i++) {
  49. qemu_put_be64s(f, &env->mmubpregs[i]);
  50. }
  51. #else
  52. qemu_put_be64s(f, &env->lsu);
  53. for (i = 0; i < 16; i++) {
  54. qemu_put_be64s(f, &env->immuregs[i]);
  55. qemu_put_be64s(f, &env->dmmuregs[i]);
  56. }
  57. for (i = 0; i < 64; i++) {
  58. qemu_put_be64s(f, &env->itlb[i].tag);
  59. qemu_put_be64s(f, &env->itlb[i].tte);
  60. qemu_put_be64s(f, &env->dtlb[i].tag);
  61. qemu_put_be64s(f, &env->dtlb[i].tte);
  62. }
  63. qemu_put_be32s(f, &env->mmu_version);
  64. for (i = 0; i < MAXTL_MAX; i++) {
  65. qemu_put_be64s(f, &env->ts[i].tpc);
  66. qemu_put_be64s(f, &env->ts[i].tnpc);
  67. qemu_put_be64s(f, &env->ts[i].tstate);
  68. qemu_put_be32s(f, &env->ts[i].tt);
  69. }
  70. qemu_put_be32s(f, &env->xcc);
  71. qemu_put_be32s(f, &env->asi);
  72. qemu_put_be32s(f, &env->pstate);
  73. qemu_put_be32s(f, &env->tl);
  74. qemu_put_be32s(f, &env->cansave);
  75. qemu_put_be32s(f, &env->canrestore);
  76. qemu_put_be32s(f, &env->otherwin);
  77. qemu_put_be32s(f, &env->wstate);
  78. qemu_put_be32s(f, &env->cleanwin);
  79. for (i = 0; i < 8; i++)
  80. qemu_put_be64s(f, &env->agregs[i]);
  81. for (i = 0; i < 8; i++)
  82. qemu_put_be64s(f, &env->bgregs[i]);
  83. for (i = 0; i < 8; i++)
  84. qemu_put_be64s(f, &env->igregs[i]);
  85. for (i = 0; i < 8; i++)
  86. qemu_put_be64s(f, &env->mgregs[i]);
  87. qemu_put_be64s(f, &env->fprs);
  88. qemu_put_be64s(f, &env->tick_cmpr);
  89. qemu_put_be64s(f, &env->stick_cmpr);
  90. cpu_put_timer(f, env->tick);
  91. cpu_put_timer(f, env->stick);
  92. qemu_put_be64s(f, &env->gsr);
  93. qemu_put_be32s(f, &env->gl);
  94. qemu_put_be64s(f, &env->hpstate);
  95. for (i = 0; i < MAXTL_MAX; i++)
  96. qemu_put_be64s(f, &env->htstate[i]);
  97. qemu_put_be64s(f, &env->hintp);
  98. qemu_put_be64s(f, &env->htba);
  99. qemu_put_be64s(f, &env->hver);
  100. qemu_put_be64s(f, &env->hstick_cmpr);
  101. qemu_put_be64s(f, &env->ssr);
  102. cpu_put_timer(f, env->hstick);
  103. #endif
  104. }
  105. int cpu_load(QEMUFile *f, void *opaque, int version_id)
  106. {
  107. CPUSPARCState *env = opaque;
  108. int i;
  109. uint32_t tmp;
  110. if (version_id < 6)
  111. return -EINVAL;
  112. for(i = 0; i < 8; i++)
  113. qemu_get_betls(f, &env->gregs[i]);
  114. qemu_get_be32s(f, &env->nwindows);
  115. for(i = 0; i < env->nwindows * 16; i++)
  116. qemu_get_betls(f, &env->regbase[i]);
  117. /* FPU */
  118. for (i = 0; i < TARGET_DPREGS; i++) {
  119. env->fpr[i].l.upper = qemu_get_be32(f);
  120. env->fpr[i].l.lower = qemu_get_be32(f);
  121. }
  122. qemu_get_betls(f, &env->pc);
  123. qemu_get_betls(f, &env->npc);
  124. qemu_get_betls(f, &env->y);
  125. tmp = qemu_get_be32(f);
  126. env->cwp = 0; /* needed to ensure that the wrapping registers are
  127. correctly updated */
  128. cpu_put_psr(env, tmp);
  129. qemu_get_betls(f, &env->fsr);
  130. qemu_get_betls(f, &env->tbr);
  131. tmp = qemu_get_be32(f);
  132. env->interrupt_index = tmp;
  133. qemu_get_be32s(f, &env->pil_in);
  134. #ifndef TARGET_SPARC64
  135. qemu_get_be32s(f, &env->wim);
  136. /* MMU */
  137. for (i = 0; i < 32; i++)
  138. qemu_get_be32s(f, &env->mmuregs[i]);
  139. for (i = 0; i < 4; i++) {
  140. qemu_get_be64s(f, &env->mxccdata[i]);
  141. }
  142. for (i = 0; i < 8; i++) {
  143. qemu_get_be64s(f, &env->mxccregs[i]);
  144. }
  145. qemu_get_be32s(f, &env->mmubpctrv);
  146. qemu_get_be32s(f, &env->mmubpctrc);
  147. qemu_get_be32s(f, &env->mmubpctrs);
  148. qemu_get_be64s(f, &env->mmubpaction);
  149. for (i = 0; i < 4; i++) {
  150. qemu_get_be64s(f, &env->mmubpregs[i]);
  151. }
  152. #else
  153. qemu_get_be64s(f, &env->lsu);
  154. for (i = 0; i < 16; i++) {
  155. qemu_get_be64s(f, &env->immuregs[i]);
  156. qemu_get_be64s(f, &env->dmmuregs[i]);
  157. }
  158. for (i = 0; i < 64; i++) {
  159. qemu_get_be64s(f, &env->itlb[i].tag);
  160. qemu_get_be64s(f, &env->itlb[i].tte);
  161. qemu_get_be64s(f, &env->dtlb[i].tag);
  162. qemu_get_be64s(f, &env->dtlb[i].tte);
  163. }
  164. qemu_get_be32s(f, &env->mmu_version);
  165. for (i = 0; i < MAXTL_MAX; i++) {
  166. qemu_get_be64s(f, &env->ts[i].tpc);
  167. qemu_get_be64s(f, &env->ts[i].tnpc);
  168. qemu_get_be64s(f, &env->ts[i].tstate);
  169. qemu_get_be32s(f, &env->ts[i].tt);
  170. }
  171. qemu_get_be32s(f, &env->xcc);
  172. qemu_get_be32s(f, &env->asi);
  173. qemu_get_be32s(f, &env->pstate);
  174. qemu_get_be32s(f, &env->tl);
  175. qemu_get_be32s(f, &env->cansave);
  176. qemu_get_be32s(f, &env->canrestore);
  177. qemu_get_be32s(f, &env->otherwin);
  178. qemu_get_be32s(f, &env->wstate);
  179. qemu_get_be32s(f, &env->cleanwin);
  180. for (i = 0; i < 8; i++)
  181. qemu_get_be64s(f, &env->agregs[i]);
  182. for (i = 0; i < 8; i++)
  183. qemu_get_be64s(f, &env->bgregs[i]);
  184. for (i = 0; i < 8; i++)
  185. qemu_get_be64s(f, &env->igregs[i]);
  186. for (i = 0; i < 8; i++)
  187. qemu_get_be64s(f, &env->mgregs[i]);
  188. qemu_get_be64s(f, &env->fprs);
  189. qemu_get_be64s(f, &env->tick_cmpr);
  190. qemu_get_be64s(f, &env->stick_cmpr);
  191. cpu_get_timer(f, env->tick);
  192. cpu_get_timer(f, env->stick);
  193. qemu_get_be64s(f, &env->gsr);
  194. qemu_get_be32s(f, &env->gl);
  195. qemu_get_be64s(f, &env->hpstate);
  196. for (i = 0; i < MAXTL_MAX; i++)
  197. qemu_get_be64s(f, &env->htstate[i]);
  198. qemu_get_be64s(f, &env->hintp);
  199. qemu_get_be64s(f, &env->htba);
  200. qemu_get_be64s(f, &env->hver);
  201. qemu_get_be64s(f, &env->hstick_cmpr);
  202. qemu_get_be64s(f, &env->ssr);
  203. cpu_get_timer(f, env->hstick);
  204. #endif
  205. tlb_flush(env, 1);
  206. return 0;
  207. }