|
|
1.1 ! root 1: #include "hw/hw.h" ! 2: #include "hw/boards.h" ! 3: ! 4: #include "exec-all.h" ! 5: ! 6: void register_machines(void) ! 7: { ! 8: qemu_register_machine(&mips_malta_machine); ! 9: qemu_register_machine(&mips_magnum_machine); ! 10: qemu_register_machine(&mips_pica61_machine); ! 11: qemu_register_machine(&mips_mipssim_machine); ! 12: qemu_register_machine(&mips_machine); ! 13: } ! 14: ! 15: static void save_tc(QEMUFile *f, TCState *tc) ! 16: { ! 17: int i; ! 18: ! 19: /* Save active TC */ ! 20: for(i = 0; i < 32; i++) ! 21: qemu_put_betls(f, &tc->gpr[i]); ! 22: qemu_put_betls(f, &tc->PC); ! 23: for(i = 0; i < MIPS_DSP_ACC; i++) ! 24: qemu_put_betls(f, &tc->HI[i]); ! 25: for(i = 0; i < MIPS_DSP_ACC; i++) ! 26: qemu_put_betls(f, &tc->LO[i]); ! 27: for(i = 0; i < MIPS_DSP_ACC; i++) ! 28: qemu_put_betls(f, &tc->ACX[i]); ! 29: qemu_put_betls(f, &tc->DSPControl); ! 30: qemu_put_sbe32s(f, &tc->CP0_TCStatus); ! 31: qemu_put_sbe32s(f, &tc->CP0_TCBind); ! 32: qemu_put_betls(f, &tc->CP0_TCHalt); ! 33: qemu_put_betls(f, &tc->CP0_TCContext); ! 34: qemu_put_betls(f, &tc->CP0_TCSchedule); ! 35: qemu_put_betls(f, &tc->CP0_TCScheFBack); ! 36: qemu_put_sbe32s(f, &tc->CP0_Debug_tcstatus); ! 37: } ! 38: ! 39: static void save_fpu(QEMUFile *f, CPUMIPSFPUContext *fpu) ! 40: { ! 41: int i; ! 42: ! 43: for(i = 0; i < 32; i++) ! 44: qemu_put_be64s(f, &fpu->fpr[i].d); ! 45: qemu_put_s8s(f, &fpu->fp_status.float_detect_tininess); ! 46: qemu_put_s8s(f, &fpu->fp_status.float_rounding_mode); ! 47: qemu_put_s8s(f, &fpu->fp_status.float_exception_flags); ! 48: qemu_put_be32s(f, &fpu->fcr0); ! 49: qemu_put_be32s(f, &fpu->fcr31); ! 50: } ! 51: ! 52: void cpu_save(QEMUFile *f, void *opaque) ! 53: { ! 54: CPUState *env = opaque; ! 55: int i; ! 56: ! 57: /* Save active TC */ ! 58: save_tc(f, &env->active_tc); ! 59: ! 60: /* Save active FPU */ ! 61: save_fpu(f, &env->active_fpu); ! 62: ! 63: /* Save MVP */ ! 64: qemu_put_sbe32s(f, &env->mvp->CP0_MVPControl); ! 65: qemu_put_sbe32s(f, &env->mvp->CP0_MVPConf0); ! 66: qemu_put_sbe32s(f, &env->mvp->CP0_MVPConf1); ! 67: ! 68: /* Save TLB */ ! 69: qemu_put_be32s(f, &env->tlb->nb_tlb); ! 70: qemu_put_be32s(f, &env->tlb->tlb_in_use); ! 71: for(i = 0; i < MIPS_TLB_MAX; i++) { ! 72: uint16_t flags = ((env->tlb->mmu.r4k.tlb[i].G << 10) | ! 73: (env->tlb->mmu.r4k.tlb[i].C0 << 7) | ! 74: (env->tlb->mmu.r4k.tlb[i].C1 << 4) | ! 75: (env->tlb->mmu.r4k.tlb[i].V0 << 3) | ! 76: (env->tlb->mmu.r4k.tlb[i].V1 << 2) | ! 77: (env->tlb->mmu.r4k.tlb[i].D0 << 1) | ! 78: (env->tlb->mmu.r4k.tlb[i].D1 << 0)); ! 79: ! 80: qemu_put_betls(f, &env->tlb->mmu.r4k.tlb[i].VPN); ! 81: qemu_put_be32s(f, &env->tlb->mmu.r4k.tlb[i].PageMask); ! 82: qemu_put_8s(f, &env->tlb->mmu.r4k.tlb[i].ASID); ! 83: qemu_put_be16s(f, &flags); ! 84: qemu_put_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[0]); ! 85: qemu_put_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[1]); ! 86: } ! 87: ! 88: /* Save CPU metastate */ ! 89: qemu_put_be32s(f, &env->current_tc); ! 90: qemu_put_be32s(f, &env->current_fpu); ! 91: qemu_put_sbe32s(f, &env->error_code); ! 92: qemu_put_be32s(f, &env->hflags); ! 93: qemu_put_betls(f, &env->btarget); ! 94: qemu_put_sbe32s(f, &env->bcond); ! 95: ! 96: /* Save remaining CP1 registers */ ! 97: qemu_put_sbe32s(f, &env->CP0_Index); ! 98: qemu_put_sbe32s(f, &env->CP0_Random); ! 99: qemu_put_sbe32s(f, &env->CP0_VPEControl); ! 100: qemu_put_sbe32s(f, &env->CP0_VPEConf0); ! 101: qemu_put_sbe32s(f, &env->CP0_VPEConf1); ! 102: qemu_put_betls(f, &env->CP0_YQMask); ! 103: qemu_put_betls(f, &env->CP0_VPESchedule); ! 104: qemu_put_betls(f, &env->CP0_VPEScheFBack); ! 105: qemu_put_sbe32s(f, &env->CP0_VPEOpt); ! 106: qemu_put_betls(f, &env->CP0_EntryLo0); ! 107: qemu_put_betls(f, &env->CP0_EntryLo1); ! 108: qemu_put_betls(f, &env->CP0_Context); ! 109: qemu_put_sbe32s(f, &env->CP0_PageMask); ! 110: qemu_put_sbe32s(f, &env->CP0_PageGrain); ! 111: qemu_put_sbe32s(f, &env->CP0_Wired); ! 112: qemu_put_sbe32s(f, &env->CP0_SRSConf0); ! 113: qemu_put_sbe32s(f, &env->CP0_SRSConf1); ! 114: qemu_put_sbe32s(f, &env->CP0_SRSConf2); ! 115: qemu_put_sbe32s(f, &env->CP0_SRSConf3); ! 116: qemu_put_sbe32s(f, &env->CP0_SRSConf4); ! 117: qemu_put_sbe32s(f, &env->CP0_HWREna); ! 118: qemu_put_betls(f, &env->CP0_BadVAddr); ! 119: qemu_put_sbe32s(f, &env->CP0_Count); ! 120: qemu_put_betls(f, &env->CP0_EntryHi); ! 121: qemu_put_sbe32s(f, &env->CP0_Compare); ! 122: qemu_put_sbe32s(f, &env->CP0_Status); ! 123: qemu_put_sbe32s(f, &env->CP0_IntCtl); ! 124: qemu_put_sbe32s(f, &env->CP0_SRSCtl); ! 125: qemu_put_sbe32s(f, &env->CP0_SRSMap); ! 126: qemu_put_sbe32s(f, &env->CP0_Cause); ! 127: qemu_put_betls(f, &env->CP0_EPC); ! 128: qemu_put_sbe32s(f, &env->CP0_PRid); ! 129: qemu_put_sbe32s(f, &env->CP0_EBase); ! 130: qemu_put_sbe32s(f, &env->CP0_Config0); ! 131: qemu_put_sbe32s(f, &env->CP0_Config1); ! 132: qemu_put_sbe32s(f, &env->CP0_Config2); ! 133: qemu_put_sbe32s(f, &env->CP0_Config3); ! 134: qemu_put_sbe32s(f, &env->CP0_Config6); ! 135: qemu_put_sbe32s(f, &env->CP0_Config7); ! 136: qemu_put_betls(f, &env->CP0_LLAddr); ! 137: for(i = 0; i < 8; i++) ! 138: qemu_put_betls(f, &env->CP0_WatchLo[i]); ! 139: for(i = 0; i < 8; i++) ! 140: qemu_put_sbe32s(f, &env->CP0_WatchHi[i]); ! 141: qemu_put_betls(f, &env->CP0_XContext); ! 142: qemu_put_sbe32s(f, &env->CP0_Framemask); ! 143: qemu_put_sbe32s(f, &env->CP0_Debug); ! 144: qemu_put_betls(f, &env->CP0_DEPC); ! 145: qemu_put_sbe32s(f, &env->CP0_Performance0); ! 146: qemu_put_sbe32s(f, &env->CP0_TagLo); ! 147: qemu_put_sbe32s(f, &env->CP0_DataLo); ! 148: qemu_put_sbe32s(f, &env->CP0_TagHi); ! 149: qemu_put_sbe32s(f, &env->CP0_DataHi); ! 150: qemu_put_betls(f, &env->CP0_ErrorEPC); ! 151: qemu_put_sbe32s(f, &env->CP0_DESAVE); ! 152: ! 153: /* Save inactive TC state */ ! 154: for (i = 0; i < MIPS_SHADOW_SET_MAX; i++) ! 155: save_tc(f, &env->tcs[i]); ! 156: for (i = 0; i < MIPS_FPU_MAX; i++) ! 157: save_fpu(f, &env->fpus[i]); ! 158: } ! 159: ! 160: static void load_tc(QEMUFile *f, TCState *tc) ! 161: { ! 162: int i; ! 163: ! 164: /* Save active TC */ ! 165: for(i = 0; i < 32; i++) ! 166: qemu_get_betls(f, &tc->gpr[i]); ! 167: qemu_get_betls(f, &tc->PC); ! 168: for(i = 0; i < MIPS_DSP_ACC; i++) ! 169: qemu_get_betls(f, &tc->HI[i]); ! 170: for(i = 0; i < MIPS_DSP_ACC; i++) ! 171: qemu_get_betls(f, &tc->LO[i]); ! 172: for(i = 0; i < MIPS_DSP_ACC; i++) ! 173: qemu_get_betls(f, &tc->ACX[i]); ! 174: qemu_get_betls(f, &tc->DSPControl); ! 175: qemu_get_sbe32s(f, &tc->CP0_TCStatus); ! 176: qemu_get_sbe32s(f, &tc->CP0_TCBind); ! 177: qemu_get_betls(f, &tc->CP0_TCHalt); ! 178: qemu_get_betls(f, &tc->CP0_TCContext); ! 179: qemu_get_betls(f, &tc->CP0_TCSchedule); ! 180: qemu_get_betls(f, &tc->CP0_TCScheFBack); ! 181: qemu_get_sbe32s(f, &tc->CP0_Debug_tcstatus); ! 182: } ! 183: ! 184: static void load_fpu(QEMUFile *f, CPUMIPSFPUContext *fpu) ! 185: { ! 186: int i; ! 187: ! 188: for(i = 0; i < 32; i++) ! 189: qemu_get_be64s(f, &fpu->fpr[i].d); ! 190: qemu_get_s8s(f, &fpu->fp_status.float_detect_tininess); ! 191: qemu_get_s8s(f, &fpu->fp_status.float_rounding_mode); ! 192: qemu_get_s8s(f, &fpu->fp_status.float_exception_flags); ! 193: qemu_get_be32s(f, &fpu->fcr0); ! 194: qemu_get_be32s(f, &fpu->fcr31); ! 195: } ! 196: ! 197: int cpu_load(QEMUFile *f, void *opaque, int version_id) ! 198: { ! 199: CPUState *env = opaque; ! 200: int i; ! 201: ! 202: if (version_id != 3) ! 203: return -EINVAL; ! 204: ! 205: /* Load active TC */ ! 206: load_tc(f, &env->active_tc); ! 207: ! 208: /* Load active FPU */ ! 209: load_fpu(f, &env->active_fpu); ! 210: ! 211: /* Load MVP */ ! 212: qemu_get_sbe32s(f, &env->mvp->CP0_MVPControl); ! 213: qemu_get_sbe32s(f, &env->mvp->CP0_MVPConf0); ! 214: qemu_get_sbe32s(f, &env->mvp->CP0_MVPConf1); ! 215: ! 216: /* Load TLB */ ! 217: qemu_get_be32s(f, &env->tlb->nb_tlb); ! 218: qemu_get_be32s(f, &env->tlb->tlb_in_use); ! 219: for(i = 0; i < MIPS_TLB_MAX; i++) { ! 220: uint16_t flags; ! 221: ! 222: qemu_get_betls(f, &env->tlb->mmu.r4k.tlb[i].VPN); ! 223: qemu_get_be32s(f, &env->tlb->mmu.r4k.tlb[i].PageMask); ! 224: qemu_get_8s(f, &env->tlb->mmu.r4k.tlb[i].ASID); ! 225: qemu_get_be16s(f, &flags); ! 226: env->tlb->mmu.r4k.tlb[i].G = (flags >> 10) & 1; ! 227: env->tlb->mmu.r4k.tlb[i].C0 = (flags >> 7) & 3; ! 228: env->tlb->mmu.r4k.tlb[i].C1 = (flags >> 4) & 3; ! 229: env->tlb->mmu.r4k.tlb[i].V0 = (flags >> 3) & 1; ! 230: env->tlb->mmu.r4k.tlb[i].V1 = (flags >> 2) & 1; ! 231: env->tlb->mmu.r4k.tlb[i].D0 = (flags >> 1) & 1; ! 232: env->tlb->mmu.r4k.tlb[i].D1 = (flags >> 0) & 1; ! 233: qemu_get_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[0]); ! 234: qemu_get_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[1]); ! 235: } ! 236: ! 237: /* Load CPU metastate */ ! 238: qemu_get_be32s(f, &env->current_tc); ! 239: qemu_get_be32s(f, &env->current_fpu); ! 240: qemu_get_sbe32s(f, &env->error_code); ! 241: qemu_get_be32s(f, &env->hflags); ! 242: qemu_get_betls(f, &env->btarget); ! 243: qemu_get_sbe32s(f, &env->bcond); ! 244: ! 245: /* Load remaining CP1 registers */ ! 246: qemu_get_sbe32s(f, &env->CP0_Index); ! 247: qemu_get_sbe32s(f, &env->CP0_Random); ! 248: qemu_get_sbe32s(f, &env->CP0_VPEControl); ! 249: qemu_get_sbe32s(f, &env->CP0_VPEConf0); ! 250: qemu_get_sbe32s(f, &env->CP0_VPEConf1); ! 251: qemu_get_betls(f, &env->CP0_YQMask); ! 252: qemu_get_betls(f, &env->CP0_VPESchedule); ! 253: qemu_get_betls(f, &env->CP0_VPEScheFBack); ! 254: qemu_get_sbe32s(f, &env->CP0_VPEOpt); ! 255: qemu_get_betls(f, &env->CP0_EntryLo0); ! 256: qemu_get_betls(f, &env->CP0_EntryLo1); ! 257: qemu_get_betls(f, &env->CP0_Context); ! 258: qemu_get_sbe32s(f, &env->CP0_PageMask); ! 259: qemu_get_sbe32s(f, &env->CP0_PageGrain); ! 260: qemu_get_sbe32s(f, &env->CP0_Wired); ! 261: qemu_get_sbe32s(f, &env->CP0_SRSConf0); ! 262: qemu_get_sbe32s(f, &env->CP0_SRSConf1); ! 263: qemu_get_sbe32s(f, &env->CP0_SRSConf2); ! 264: qemu_get_sbe32s(f, &env->CP0_SRSConf3); ! 265: qemu_get_sbe32s(f, &env->CP0_SRSConf4); ! 266: qemu_get_sbe32s(f, &env->CP0_HWREna); ! 267: qemu_get_betls(f, &env->CP0_BadVAddr); ! 268: qemu_get_sbe32s(f, &env->CP0_Count); ! 269: qemu_get_betls(f, &env->CP0_EntryHi); ! 270: qemu_get_sbe32s(f, &env->CP0_Compare); ! 271: qemu_get_sbe32s(f, &env->CP0_Status); ! 272: qemu_get_sbe32s(f, &env->CP0_IntCtl); ! 273: qemu_get_sbe32s(f, &env->CP0_SRSCtl); ! 274: qemu_get_sbe32s(f, &env->CP0_SRSMap); ! 275: qemu_get_sbe32s(f, &env->CP0_Cause); ! 276: qemu_get_betls(f, &env->CP0_EPC); ! 277: qemu_get_sbe32s(f, &env->CP0_PRid); ! 278: qemu_get_sbe32s(f, &env->CP0_EBase); ! 279: qemu_get_sbe32s(f, &env->CP0_Config0); ! 280: qemu_get_sbe32s(f, &env->CP0_Config1); ! 281: qemu_get_sbe32s(f, &env->CP0_Config2); ! 282: qemu_get_sbe32s(f, &env->CP0_Config3); ! 283: qemu_get_sbe32s(f, &env->CP0_Config6); ! 284: qemu_get_sbe32s(f, &env->CP0_Config7); ! 285: qemu_get_betls(f, &env->CP0_LLAddr); ! 286: for(i = 0; i < 8; i++) ! 287: qemu_get_betls(f, &env->CP0_WatchLo[i]); ! 288: for(i = 0; i < 8; i++) ! 289: qemu_get_sbe32s(f, &env->CP0_WatchHi[i]); ! 290: qemu_get_betls(f, &env->CP0_XContext); ! 291: qemu_get_sbe32s(f, &env->CP0_Framemask); ! 292: qemu_get_sbe32s(f, &env->CP0_Debug); ! 293: qemu_get_betls(f, &env->CP0_DEPC); ! 294: qemu_get_sbe32s(f, &env->CP0_Performance0); ! 295: qemu_get_sbe32s(f, &env->CP0_TagLo); ! 296: qemu_get_sbe32s(f, &env->CP0_DataLo); ! 297: qemu_get_sbe32s(f, &env->CP0_TagHi); ! 298: qemu_get_sbe32s(f, &env->CP0_DataHi); ! 299: qemu_get_betls(f, &env->CP0_ErrorEPC); ! 300: qemu_get_sbe32s(f, &env->CP0_DESAVE); ! 301: ! 302: /* Load inactive TC state */ ! 303: for (i = 0; i < MIPS_SHADOW_SET_MAX; i++) ! 304: load_tc(f, &env->tcs[i]); ! 305: for (i = 0; i < MIPS_FPU_MAX; i++) ! 306: load_fpu(f, &env->fpus[i]); ! 307: ! 308: /* XXX: ensure compatiblity for halted bit ? */ ! 309: tlb_flush(env, 1); ! 310: return 0; ! 311: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.