symbian-qemu-0.9.1-12/qemu-symbian-svp/target-sparc/machine.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 #include "hw/hw.h"
       
     2 #include "hw/boards.h"
       
     3 #include "qemu-timer.h"
       
     4 
       
     5 #include "exec-all.h"
       
     6 
       
     7 void register_machines(void)
       
     8 {
       
     9 #ifdef TARGET_SPARC64
       
    10     qemu_register_machine(&sun4u_machine);
       
    11     qemu_register_machine(&sun4v_machine);
       
    12     qemu_register_machine(&niagara_machine);
       
    13 #else
       
    14     qemu_register_machine(&ss5_machine);
       
    15     qemu_register_machine(&ss10_machine);
       
    16     qemu_register_machine(&ss600mp_machine);
       
    17     qemu_register_machine(&ss20_machine);
       
    18     qemu_register_machine(&ss2_machine);
       
    19     qemu_register_machine(&voyager_machine);
       
    20     qemu_register_machine(&ss_lx_machine);
       
    21     qemu_register_machine(&ss4_machine);
       
    22     qemu_register_machine(&scls_machine);
       
    23     qemu_register_machine(&sbook_machine);
       
    24     qemu_register_machine(&ss1000_machine);
       
    25     qemu_register_machine(&ss2000_machine);
       
    26 #endif
       
    27 }
       
    28 
       
    29 void cpu_save(QEMUFile *f, void *opaque)
       
    30 {
       
    31     CPUState *env = opaque;
       
    32     int i;
       
    33     uint32_t tmp;
       
    34 
       
    35     // if env->cwp == env->nwindows - 1, this will set the ins of the last
       
    36     // window as the outs of the first window
       
    37     cpu_set_cwp(env, env->cwp);
       
    38 
       
    39     for(i = 0; i < 8; i++)
       
    40         qemu_put_betls(f, &env->gregs[i]);
       
    41     qemu_put_be32s(f, &env->nwindows);
       
    42     for(i = 0; i < env->nwindows * 16; i++)
       
    43         qemu_put_betls(f, &env->regbase[i]);
       
    44 
       
    45     /* FPU */
       
    46     for(i = 0; i < TARGET_FPREGS; i++) {
       
    47         union {
       
    48             float32 f;
       
    49             uint32_t i;
       
    50         } u;
       
    51         u.f = env->fpr[i];
       
    52         qemu_put_be32(f, u.i);
       
    53     }
       
    54 
       
    55     qemu_put_betls(f, &env->pc);
       
    56     qemu_put_betls(f, &env->npc);
       
    57     qemu_put_betls(f, &env->y);
       
    58     tmp = GET_PSR(env);
       
    59     qemu_put_be32(f, tmp);
       
    60     qemu_put_betls(f, &env->fsr);
       
    61     qemu_put_betls(f, &env->tbr);
       
    62     tmp = env->interrupt_index;
       
    63     qemu_put_be32(f, tmp);
       
    64     qemu_put_be32s(f, &env->pil_in);
       
    65 #ifndef TARGET_SPARC64
       
    66     qemu_put_be32s(f, &env->wim);
       
    67     /* MMU */
       
    68     for (i = 0; i < 32; i++)
       
    69         qemu_put_be32s(f, &env->mmuregs[i]);
       
    70 #else
       
    71     qemu_put_be64s(f, &env->lsu);
       
    72     for (i = 0; i < 16; i++) {
       
    73         qemu_put_be64s(f, &env->immuregs[i]);
       
    74         qemu_put_be64s(f, &env->dmmuregs[i]);
       
    75     }
       
    76     for (i = 0; i < 64; i++) {
       
    77         qemu_put_be64s(f, &env->itlb_tag[i]);
       
    78         qemu_put_be64s(f, &env->itlb_tte[i]);
       
    79         qemu_put_be64s(f, &env->dtlb_tag[i]);
       
    80         qemu_put_be64s(f, &env->dtlb_tte[i]);
       
    81     }
       
    82     qemu_put_be32s(f, &env->mmu_version);
       
    83     for (i = 0; i < MAXTL_MAX; i++) {
       
    84         qemu_put_be64s(f, &env->ts[i].tpc);
       
    85         qemu_put_be64s(f, &env->ts[i].tnpc);
       
    86         qemu_put_be64s(f, &env->ts[i].tstate);
       
    87         qemu_put_be32s(f, &env->ts[i].tt);
       
    88     }
       
    89     qemu_put_be32s(f, &env->xcc);
       
    90     qemu_put_be32s(f, &env->asi);
       
    91     qemu_put_be32s(f, &env->pstate);
       
    92     qemu_put_be32s(f, &env->tl);
       
    93     qemu_put_be32s(f, &env->cansave);
       
    94     qemu_put_be32s(f, &env->canrestore);
       
    95     qemu_put_be32s(f, &env->otherwin);
       
    96     qemu_put_be32s(f, &env->wstate);
       
    97     qemu_put_be32s(f, &env->cleanwin);
       
    98     for (i = 0; i < 8; i++)
       
    99         qemu_put_be64s(f, &env->agregs[i]);
       
   100     for (i = 0; i < 8; i++)
       
   101         qemu_put_be64s(f, &env->bgregs[i]);
       
   102     for (i = 0; i < 8; i++)
       
   103         qemu_put_be64s(f, &env->igregs[i]);
       
   104     for (i = 0; i < 8; i++)
       
   105         qemu_put_be64s(f, &env->mgregs[i]);
       
   106     qemu_put_be64s(f, &env->fprs);
       
   107     qemu_put_be64s(f, &env->tick_cmpr);
       
   108     qemu_put_be64s(f, &env->stick_cmpr);
       
   109     qemu_put_ptimer(f, env->tick);
       
   110     qemu_put_ptimer(f, env->stick);
       
   111     qemu_put_be64s(f, &env->gsr);
       
   112     qemu_put_be32s(f, &env->gl);
       
   113     qemu_put_be64s(f, &env->hpstate);
       
   114     for (i = 0; i < MAXTL_MAX; i++)
       
   115         qemu_put_be64s(f, &env->htstate[i]);
       
   116     qemu_put_be64s(f, &env->hintp);
       
   117     qemu_put_be64s(f, &env->htba);
       
   118     qemu_put_be64s(f, &env->hver);
       
   119     qemu_put_be64s(f, &env->hstick_cmpr);
       
   120     qemu_put_be64s(f, &env->ssr);
       
   121     qemu_put_ptimer(f, env->hstick);
       
   122 #endif
       
   123 }
       
   124 
       
   125 int cpu_load(QEMUFile *f, void *opaque, int version_id)
       
   126 {
       
   127     CPUState *env = opaque;
       
   128     int i;
       
   129     uint32_t tmp;
       
   130 
       
   131     if (version_id != 5)
       
   132         return -EINVAL;
       
   133     for(i = 0; i < 8; i++)
       
   134         qemu_get_betls(f, &env->gregs[i]);
       
   135     qemu_get_be32s(f, &env->nwindows);
       
   136     for(i = 0; i < env->nwindows * 16; i++)
       
   137         qemu_get_betls(f, &env->regbase[i]);
       
   138 
       
   139     /* FPU */
       
   140     for(i = 0; i < TARGET_FPREGS; i++) {
       
   141         union {
       
   142             float32 f;
       
   143             uint32_t i;
       
   144         } u;
       
   145         u.i = qemu_get_be32(f);
       
   146         env->fpr[i] = u.f;
       
   147     }
       
   148 
       
   149     qemu_get_betls(f, &env->pc);
       
   150     qemu_get_betls(f, &env->npc);
       
   151     qemu_get_betls(f, &env->y);
       
   152     tmp = qemu_get_be32(f);
       
   153     env->cwp = 0; /* needed to ensure that the wrapping registers are
       
   154                      correctly updated */
       
   155     PUT_PSR(env, tmp);
       
   156     qemu_get_betls(f, &env->fsr);
       
   157     qemu_get_betls(f, &env->tbr);
       
   158     tmp = qemu_get_be32(f);
       
   159     env->interrupt_index = tmp;
       
   160     qemu_get_be32s(f, &env->pil_in);
       
   161 #ifndef TARGET_SPARC64
       
   162     qemu_get_be32s(f, &env->wim);
       
   163     /* MMU */
       
   164     for (i = 0; i < 32; i++)
       
   165         qemu_get_be32s(f, &env->mmuregs[i]);
       
   166 #else
       
   167     qemu_get_be64s(f, &env->lsu);
       
   168     for (i = 0; i < 16; i++) {
       
   169         qemu_get_be64s(f, &env->immuregs[i]);
       
   170         qemu_get_be64s(f, &env->dmmuregs[i]);
       
   171     }
       
   172     for (i = 0; i < 64; i++) {
       
   173         qemu_get_be64s(f, &env->itlb_tag[i]);
       
   174         qemu_get_be64s(f, &env->itlb_tte[i]);
       
   175         qemu_get_be64s(f, &env->dtlb_tag[i]);
       
   176         qemu_get_be64s(f, &env->dtlb_tte[i]);
       
   177     }
       
   178     qemu_get_be32s(f, &env->mmu_version);
       
   179     for (i = 0; i < MAXTL_MAX; i++) {
       
   180         qemu_get_be64s(f, &env->ts[i].tpc);
       
   181         qemu_get_be64s(f, &env->ts[i].tnpc);
       
   182         qemu_get_be64s(f, &env->ts[i].tstate);
       
   183         qemu_get_be32s(f, &env->ts[i].tt);
       
   184     }
       
   185     qemu_get_be32s(f, &env->xcc);
       
   186     qemu_get_be32s(f, &env->asi);
       
   187     qemu_get_be32s(f, &env->pstate);
       
   188     qemu_get_be32s(f, &env->tl);
       
   189     env->tsptr = &env->ts[env->tl & MAXTL_MASK];
       
   190     qemu_get_be32s(f, &env->cansave);
       
   191     qemu_get_be32s(f, &env->canrestore);
       
   192     qemu_get_be32s(f, &env->otherwin);
       
   193     qemu_get_be32s(f, &env->wstate);
       
   194     qemu_get_be32s(f, &env->cleanwin);
       
   195     for (i = 0; i < 8; i++)
       
   196         qemu_get_be64s(f, &env->agregs[i]);
       
   197     for (i = 0; i < 8; i++)
       
   198         qemu_get_be64s(f, &env->bgregs[i]);
       
   199     for (i = 0; i < 8; i++)
       
   200         qemu_get_be64s(f, &env->igregs[i]);
       
   201     for (i = 0; i < 8; i++)
       
   202         qemu_get_be64s(f, &env->mgregs[i]);
       
   203     qemu_get_be64s(f, &env->fprs);
       
   204     qemu_get_be64s(f, &env->tick_cmpr);
       
   205     qemu_get_be64s(f, &env->stick_cmpr);
       
   206     qemu_get_ptimer(f, env->tick);
       
   207     qemu_get_ptimer(f, env->stick);
       
   208     qemu_get_be64s(f, &env->gsr);
       
   209     qemu_get_be32s(f, &env->gl);
       
   210     qemu_get_be64s(f, &env->hpstate);
       
   211     for (i = 0; i < MAXTL_MAX; i++)
       
   212         qemu_get_be64s(f, &env->htstate[i]);
       
   213     qemu_get_be64s(f, &env->hintp);
       
   214     qemu_get_be64s(f, &env->htba);
       
   215     qemu_get_be64s(f, &env->hver);
       
   216     qemu_get_be64s(f, &env->hstick_cmpr);
       
   217     qemu_get_be64s(f, &env->ssr);
       
   218     qemu_get_ptimer(f, env->hstick);
       
   219 #endif
       
   220     tlb_flush(env, 1);
       
   221     return 0;
       
   222 }