GEN32(gen_op_store_DT0_fpr, gen_op_store_DT0_fpr_fprf);
GEN32(gen_op_store_DT1_fpr, gen_op_store_DT1_fpr_fprf);
-#ifdef ALIGN_7_BUGS_FIXED
-#else
-#ifndef CONFIG_USER_ONLY
-#define gen_op_check_align_T0_7()
-#endif
-#endif
-
/* moves */
#ifdef CONFIG_USER_ONLY
#define supervisor(dc) 0
#endif
#define gen_op_ldst(name) gen_op_##name##_raw()
#else
-#define supervisor(dc) (dc->mem_idx == 1)
+#define supervisor(dc) (dc->mem_idx >= 1)
#ifdef TARGET_SPARC64
#define hypervisor(dc) (dc->mem_idx == 2)
-#endif
-#define gen_op_ldst(name) (*gen_op_##name[dc->mem_idx])()
+#define OP_LD_TABLE(width) \
+ static GenOpFunc * const gen_op_##width[] = { \
+ &gen_op_##width##_user, \
+ &gen_op_##width##_kernel, \
+ &gen_op_##width##_hypv, \
+ };
+#else
#define OP_LD_TABLE(width) \
static GenOpFunc * const gen_op_##width[] = { \
&gen_op_##width##_user, \
&gen_op_##width##_kernel, \
};
#endif
+#define gen_op_ldst(name) (*gen_op_##name[dc->mem_idx])()
+#endif
#ifndef CONFIG_USER_ONLY
OP_LD_TABLE(ld);
(xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) {
switch (xop) {
case 0x0: /* load word */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
#ifndef TARGET_SPARC64
gen_op_ldst(ld);
#else
gen_op_ldst(ldub);
break;
case 0x2: /* load unsigned halfword */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_1();
-#endif
gen_op_ldst(lduh);
break;
case 0x3: /* load double word */
- gen_op_check_align_T0_7();
if (rd & 1)
goto illegal_insn;
+ gen_op_check_align_T0_7();
gen_op_ldst(ldd);
gen_movl_T0_reg(rd + 1);
break;
gen_op_ldst(ldsb);
break;
case 0xa: /* load signed halfword */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_1();
-#endif
gen_op_ldst(ldsh);
break;
case 0xd: /* ldstub -- XXX: should be atomically */
gen_op_ldst(ldstub);
break;
case 0x0f: /* swap register with memory. Also atomically */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_movl_reg_T1(rd);
gen_op_ldst(swap);
break;
goto illegal_insn;
if (!supervisor(dc))
goto priv_insn;
-#elif CONFIG_USER_ONLY
- gen_op_check_align_T0_3();
#endif
+ gen_op_check_align_T0_3();
gen_ld_asi(insn, 4, 0);
break;
case 0x11: /* load unsigned byte alternate */
goto illegal_insn;
if (!supervisor(dc))
goto priv_insn;
-#elif CONFIG_USER_ONLY
- gen_op_check_align_T0_1();
#endif
+ gen_op_check_align_T0_1();
gen_ld_asi(insn, 2, 0);
break;
case 0x13: /* load double word alternate */
goto illegal_insn;
if (!supervisor(dc))
goto priv_insn;
-#elif CONFIG_USER_ONLY
- gen_op_check_align_T0_1();
#endif
+ gen_op_check_align_T0_1();
gen_ld_asi(insn, 2, 1);
break;
case 0x1d: /* ldstuba -- XXX: should be atomically */
goto illegal_insn;
if (!supervisor(dc))
goto priv_insn;
-#elif CONFIG_USER_ONLY
- gen_op_check_align_T0_3();
#endif
+ gen_op_check_align_T0_3();
gen_movl_reg_T1(rd);
gen_swap_asi(insn);
break;
#endif
#ifdef TARGET_SPARC64
case 0x08: /* V9 ldsw */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_op_ldst(ldsw);
break;
case 0x0b: /* V9 ldx */
gen_op_ldst(ldx);
break;
case 0x18: /* V9 ldswa */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_ld_asi(insn, 4, 1);
break;
case 0x1b: /* V9 ldxa */
case 0x2d: /* V9 prefetch, no effect */
goto skip_move;
case 0x30: /* V9 ldfa */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_ldf_asi(insn, 4);
goto skip_move;
case 0x33: /* V9 lddfa */
goto jmp_insn;
switch (xop) {
case 0x20: /* load fpreg */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_op_ldst(ldf);
gen_op_store_FT0_fpr(rd);
break;
case 0x21: /* load fsr */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_op_ldst(ldf);
gen_op_ldfsr();
break;
gen_movl_reg_T1(rd);
switch (xop) {
case 0x4:
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_op_ldst(st);
break;
case 0x5:
gen_op_ldst(stb);
break;
case 0x6:
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_1();
-#endif
gen_op_ldst(sth);
break;
case 0x7:
if (!supervisor(dc))
goto priv_insn;
#endif
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_st_asi(insn, 4);
break;
case 0x15:
if (!supervisor(dc))
goto priv_insn;
#endif
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_1();
-#endif
gen_st_asi(insn, 2);
break;
case 0x17:
goto jmp_insn;
switch (xop) {
case 0x24:
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_op_load_fpr_FT0(rd);
gen_op_ldst(stf);
break;
switch (xop) {
#ifdef TARGET_SPARC64
case 0x34: /* V9 stfa */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
gen_op_load_fpr_FT0(rd);
gen_stf_asi(insn, 4);
break;
gen_stf_asi(insn, 8);
break;
case 0x3c: /* V9 casa */
-#ifdef CONFIG_USER_ONLY
gen_op_check_align_T0_3();
-#endif
flush_T2(dc);
gen_movl_reg_T2(rd);
gen_cas_asi(insn);
dc->pc = pc_start;
last_pc = dc->pc;
dc->npc = (target_ulong) tb->cs_base;
-#if defined(CONFIG_USER_ONLY)
- dc->mem_idx = 0;
- dc->fpu_enabled = 1;
-#else
- dc->mem_idx = ((env->psrs) != 0);
-#ifdef TARGET_SPARC64
- dc->fpu_enabled = (((env->pstate & PS_PEF) != 0) && ((env->fprs & FPRS_FEF) != 0));
-#else
- dc->fpu_enabled = ((env->psref) != 0);
-#endif
-#endif
+ dc->mem_idx = cpu_mmu_index(env);
+ dc->fpu_enabled = cpu_fpu_enabled(env);
gen_opc_ptr = gen_opc_buf;
gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
gen_opparam_ptr = gen_opparam_buf;
env->psrps = 1;
#ifdef TARGET_SPARC64
env->pstate = PS_PRIV;
+ env->hpstate = HS_PRIV;
env->pc = 0x1fff0000000ULL;
#else
env->pc = 0;