2
0

machine.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. SPARCCPU *cpu = sparc_env_get_cpu(env);
  109. int i;
  110. uint32_t tmp;
  111. if (version_id < 6)
  112. return -EINVAL;
  113. for(i = 0; i < 8; i++)
  114. qemu_get_betls(f, &env->gregs[i]);
  115. qemu_get_be32s(f, &env->nwindows);
  116. for(i = 0; i < env->nwindows * 16; i++)
  117. qemu_get_betls(f, &env->regbase[i]);
  118. /* FPU */
  119. for (i = 0; i < TARGET_DPREGS; i++) {
  120. env->fpr[i].l.upper = qemu_get_be32(f);
  121. env->fpr[i].l.lower = qemu_get_be32(f);
  122. }
  123. qemu_get_betls(f, &env->pc);
  124. qemu_get_betls(f, &env->npc);
  125. qemu_get_betls(f, &env->y);
  126. tmp = qemu_get_be32(f);
  127. env->cwp = 0; /* needed to ensure that the wrapping registers are
  128. correctly updated */
  129. cpu_put_psr(env, tmp);
  130. qemu_get_betls(f, &env->fsr);
  131. qemu_get_betls(f, &env->tbr);
  132. tmp = qemu_get_be32(f);
  133. env->interrupt_index = tmp;
  134. qemu_get_be32s(f, &env->pil_in);
  135. #ifndef TARGET_SPARC64
  136. qemu_get_be32s(f, &env->wim);
  137. /* MMU */
  138. for (i = 0; i < 32; i++)
  139. qemu_get_be32s(f, &env->mmuregs[i]);
  140. for (i = 0; i < 4; i++) {
  141. qemu_get_be64s(f, &env->mxccdata[i]);
  142. }
  143. for (i = 0; i < 8; i++) {
  144. qemu_get_be64s(f, &env->mxccregs[i]);
  145. }
  146. qemu_get_be32s(f, &env->mmubpctrv);
  147. qemu_get_be32s(f, &env->mmubpctrc);
  148. qemu_get_be32s(f, &env->mmubpctrs);
  149. qemu_get_be64s(f, &env->mmubpaction);
  150. for (i = 0; i < 4; i++) {
  151. qemu_get_be64s(f, &env->mmubpregs[i]);
  152. }
  153. #else
  154. qemu_get_be64s(f, &env->lsu);
  155. for (i = 0; i < 16; i++) {
  156. qemu_get_be64s(f, &env->immuregs[i]);
  157. qemu_get_be64s(f, &env->dmmuregs[i]);
  158. }
  159. for (i = 0; i < 64; i++) {
  160. qemu_get_be64s(f, &env->itlb[i].tag);
  161. qemu_get_be64s(f, &env->itlb[i].tte);
  162. qemu_get_be64s(f, &env->dtlb[i].tag);
  163. qemu_get_be64s(f, &env->dtlb[i].tte);
  164. }
  165. qemu_get_be32s(f, &env->mmu_version);
  166. for (i = 0; i < MAXTL_MAX; i++) {
  167. qemu_get_be64s(f, &env->ts[i].tpc);
  168. qemu_get_be64s(f, &env->ts[i].tnpc);
  169. qemu_get_be64s(f, &env->ts[i].tstate);
  170. qemu_get_be32s(f, &env->ts[i].tt);
  171. }
  172. qemu_get_be32s(f, &env->xcc);
  173. qemu_get_be32s(f, &env->asi);
  174. qemu_get_be32s(f, &env->pstate);
  175. qemu_get_be32s(f, &env->tl);
  176. qemu_get_be32s(f, &env->cansave);
  177. qemu_get_be32s(f, &env->canrestore);
  178. qemu_get_be32s(f, &env->otherwin);
  179. qemu_get_be32s(f, &env->wstate);
  180. qemu_get_be32s(f, &env->cleanwin);
  181. for (i = 0; i < 8; i++)
  182. qemu_get_be64s(f, &env->agregs[i]);
  183. for (i = 0; i < 8; i++)
  184. qemu_get_be64s(f, &env->bgregs[i]);
  185. for (i = 0; i < 8; i++)
  186. qemu_get_be64s(f, &env->igregs[i]);
  187. for (i = 0; i < 8; i++)
  188. qemu_get_be64s(f, &env->mgregs[i]);
  189. qemu_get_be64s(f, &env->fprs);
  190. qemu_get_be64s(f, &env->tick_cmpr);
  191. qemu_get_be64s(f, &env->stick_cmpr);
  192. cpu_get_timer(f, env->tick);
  193. cpu_get_timer(f, env->stick);
  194. qemu_get_be64s(f, &env->gsr);
  195. qemu_get_be32s(f, &env->gl);
  196. qemu_get_be64s(f, &env->hpstate);
  197. for (i = 0; i < MAXTL_MAX; i++)
  198. qemu_get_be64s(f, &env->htstate[i]);
  199. qemu_get_be64s(f, &env->hintp);
  200. qemu_get_be64s(f, &env->htba);
  201. qemu_get_be64s(f, &env->hver);
  202. qemu_get_be64s(f, &env->hstick_cmpr);
  203. qemu_get_be64s(f, &env->ssr);
  204. cpu_get_timer(f, env->hstick);
  205. #endif
  206. tlb_flush(CPU(cpu), 1);
  207. return 0;
  208. }