Annotation of qemu/target-mips/machine.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.