Annotation of qemu/target-mips/machine.c, revision 1.1.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.