628
576
#endif /* TARGET_SPARC64 */
629
577
#endif /* !CONFIG_USER_ONLY */
632
#if defined(CONFIG_USER_ONLY)
633
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
639
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
641
target_phys_addr_t phys_addr;
642
int prot, access_index;
644
if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 2,
645
MMU_KERNEL_IDX) != 0)
646
if (get_physical_address(env, &phys_addr, &prot, &access_index, addr,
647
0, MMU_KERNEL_IDX) != 0)
649
if (cpu_get_physical_page_desc(phys_addr) == IO_MEM_UNASSIGNED)
655
#ifdef TARGET_SPARC64
657
static const char * const excp_names[0x50] = {
658
[TT_TFAULT] = "Instruction Access Fault",
659
[TT_TMISS] = "Instruction Access MMU Miss",
660
[TT_CODE_ACCESS] = "Instruction Access Error",
661
[TT_ILL_INSN] = "Illegal Instruction",
662
[TT_PRIV_INSN] = "Privileged Instruction",
663
[TT_NFPU_INSN] = "FPU Disabled",
664
[TT_FP_EXCP] = "FPU Exception",
665
[TT_TOVF] = "Tag Overflow",
666
[TT_CLRWIN] = "Clean Windows",
667
[TT_DIV_ZERO] = "Division By Zero",
668
[TT_DFAULT] = "Data Access Fault",
669
[TT_DMISS] = "Data Access MMU Miss",
670
[TT_DATA_ACCESS] = "Data Access Error",
671
[TT_DPROT] = "Data Protection Error",
672
[TT_UNALIGNED] = "Unaligned Memory Access",
673
[TT_PRIV_ACT] = "Privileged Action",
674
[TT_EXTINT | 0x1] = "External Interrupt 1",
675
[TT_EXTINT | 0x2] = "External Interrupt 2",
676
[TT_EXTINT | 0x3] = "External Interrupt 3",
677
[TT_EXTINT | 0x4] = "External Interrupt 4",
678
[TT_EXTINT | 0x5] = "External Interrupt 5",
679
[TT_EXTINT | 0x6] = "External Interrupt 6",
680
[TT_EXTINT | 0x7] = "External Interrupt 7",
681
[TT_EXTINT | 0x8] = "External Interrupt 8",
682
[TT_EXTINT | 0x9] = "External Interrupt 9",
683
[TT_EXTINT | 0xa] = "External Interrupt 10",
684
[TT_EXTINT | 0xb] = "External Interrupt 11",
685
[TT_EXTINT | 0xc] = "External Interrupt 12",
686
[TT_EXTINT | 0xd] = "External Interrupt 13",
687
[TT_EXTINT | 0xe] = "External Interrupt 14",
688
[TT_EXTINT | 0xf] = "External Interrupt 15",
692
void do_interrupt(CPUState *env)
694
int intno = env->exception_index;
697
if (loglevel & CPU_LOG_INT) {
701
if (intno < 0 || intno >= 0x180 || (intno > 0x4f && intno < 0x80))
703
else if (intno >= 0x100)
704
name = "Trap Instruction";
705
else if (intno >= 0xc0)
706
name = "Window Fill";
707
else if (intno >= 0x80)
708
name = "Window Spill";
710
name = excp_names[intno];
715
fprintf(logfile, "%6d: %s (v=%04x) pc=%016" PRIx64 " npc=%016" PRIx64
716
" SP=%016" PRIx64 "\n",
719
env->npc, env->regwptr[6]);
720
cpu_dump_state(env, logfile, fprintf, 0);
726
fprintf(logfile, " code=");
727
ptr = (uint8_t *)env->pc;
728
for(i = 0; i < 16; i++) {
729
fprintf(logfile, " %02x", ldub(ptr + i));
731
fprintf(logfile, "\n");
737
#if !defined(CONFIG_USER_ONLY)
738
if (env->tl == MAXTL) {
739
cpu_abort(env, "Trap 0x%04x while trap level is MAXTL, Error state",
740
env->exception_index);
744
env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) |
745
((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) |
747
env->tsptr->tpc = env->pc;
748
env->tsptr->tnpc = env->npc;
749
env->tsptr->tt = intno;
750
change_pstate(PS_PEF | PS_PRIV | PS_AG);
752
if (intno == TT_CLRWIN)
753
cpu_set_cwp(env, (env->cwp - 1) & (NWINDOWS - 1));
754
else if ((intno & 0x1c0) == TT_SPILL)
755
cpu_set_cwp(env, (env->cwp - env->cansave - 2) & (NWINDOWS - 1));
756
else if ((intno & 0x1c0) == TT_FILL)
757
cpu_set_cwp(env, (env->cwp + 1) & (NWINDOWS - 1));
758
env->tbr &= ~0x7fffULL;
759
env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5);
760
if (env->tl < MAXTL - 1) {
763
env->pstate |= PS_RED;
764
if (env->tl != MAXTL)
767
env->tsptr = &env->ts[env->tl];
769
env->npc = env->pc + 4;
770
env->exception_index = 0;
774
static const char * const excp_names[0x80] = {
775
[TT_TFAULT] = "Instruction Access Fault",
776
[TT_ILL_INSN] = "Illegal Instruction",
777
[TT_PRIV_INSN] = "Privileged Instruction",
778
[TT_NFPU_INSN] = "FPU Disabled",
779
[TT_WIN_OVF] = "Window Overflow",
780
[TT_WIN_UNF] = "Window Underflow",
781
[TT_UNALIGNED] = "Unaligned Memory Access",
782
[TT_FP_EXCP] = "FPU Exception",
783
[TT_DFAULT] = "Data Access Fault",
784
[TT_TOVF] = "Tag Overflow",
785
[TT_EXTINT | 0x1] = "External Interrupt 1",
786
[TT_EXTINT | 0x2] = "External Interrupt 2",
787
[TT_EXTINT | 0x3] = "External Interrupt 3",
788
[TT_EXTINT | 0x4] = "External Interrupt 4",
789
[TT_EXTINT | 0x5] = "External Interrupt 5",
790
[TT_EXTINT | 0x6] = "External Interrupt 6",
791
[TT_EXTINT | 0x7] = "External Interrupt 7",
792
[TT_EXTINT | 0x8] = "External Interrupt 8",
793
[TT_EXTINT | 0x9] = "External Interrupt 9",
794
[TT_EXTINT | 0xa] = "External Interrupt 10",
795
[TT_EXTINT | 0xb] = "External Interrupt 11",
796
[TT_EXTINT | 0xc] = "External Interrupt 12",
797
[TT_EXTINT | 0xd] = "External Interrupt 13",
798
[TT_EXTINT | 0xe] = "External Interrupt 14",
799
[TT_EXTINT | 0xf] = "External Interrupt 15",
800
[TT_TOVF] = "Tag Overflow",
801
[TT_CODE_ACCESS] = "Instruction Access Error",
802
[TT_DATA_ACCESS] = "Data Access Error",
803
[TT_DIV_ZERO] = "Division By Zero",
804
[TT_NCP_INSN] = "Coprocessor Disabled",
808
void do_interrupt(CPUState *env)
810
int cwp, intno = env->exception_index;
813
if (loglevel & CPU_LOG_INT) {
817
if (intno < 0 || intno >= 0x100)
819
else if (intno >= 0x80)
820
name = "Trap Instruction";
822
name = excp_names[intno];
827
fprintf(logfile, "%6d: %s (v=%02x) pc=%08x npc=%08x SP=%08x\n",
830
env->npc, env->regwptr[6]);
831
cpu_dump_state(env, logfile, fprintf, 0);
837
fprintf(logfile, " code=");
838
ptr = (uint8_t *)env->pc;
839
for(i = 0; i < 16; i++) {
840
fprintf(logfile, " %02x", ldub(ptr + i));
842
fprintf(logfile, "\n");
848
#if !defined(CONFIG_USER_ONLY)
849
if (env->psret == 0) {
850
cpu_abort(env, "Trap 0x%02x while interrupts disabled, Error state",
851
env->exception_index);
856
cwp = (env->cwp - 1) & (NWINDOWS - 1);
857
cpu_set_cwp(env, cwp);
858
env->regwptr[9] = env->pc;
859
env->regwptr[10] = env->npc;
860
env->psrps = env->psrs;
862
env->tbr = (env->tbr & TBR_BASE_MASK) | (intno << 4);
864
env->npc = env->pc + 4;
865
env->exception_index = 0;
869
579
void memcpy32(target_ulong *dst, const target_ulong *src)
881
void cpu_reset(CPUSPARCState *env)
886
env->regwptr = env->regbase + (env->cwp * 16);
887
#if defined(CONFIG_USER_ONLY)
888
env->user_mode_only = 1;
889
#ifdef TARGET_SPARC64
890
env->cleanwin = NWINDOWS - 2;
891
env->cansave = NWINDOWS - 2;
892
env->pstate = PS_RMO | PS_PEF | PS_IE;
893
env->asi = 0x82; // Primary no-fault
899
#ifdef TARGET_SPARC64
900
env->pstate = PS_PRIV;
901
env->hpstate = HS_PRIV;
902
env->pc = 0x1fff0000000ULL;
903
env->tsptr = &env->ts[env->tl];
906
env->mmuregs[0] &= ~(MMU_E | MMU_NF);
907
env->mmuregs[0] |= env->mmu_bm;
909
env->npc = env->pc + 4;
913
static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model)
915
sparc_def_t def1, *def = &def1;
917
if (cpu_sparc_find_by_name(def, cpu_model) < 0)
920
env->features = def->features;
921
env->cpu_model_str = cpu_model;
922
env->version = def->iu_version;
923
env->fsr = def->fpu_version;
924
#if !defined(TARGET_SPARC64)
925
env->mmu_bm = def->mmu_bm;
926
env->mmu_ctpr_mask = def->mmu_ctpr_mask;
927
env->mmu_cxr_mask = def->mmu_cxr_mask;
928
env->mmu_sfsr_mask = def->mmu_sfsr_mask;
929
env->mmu_trcr_mask = def->mmu_trcr_mask;
930
env->mmuregs[0] |= def->mmu_version;
931
cpu_sparc_set_id(env, 0);
936
static void cpu_sparc_close(CPUSPARCState *env)
941
CPUSPARCState *cpu_sparc_init(const char *cpu_model)
945
env = qemu_mallocz(sizeof(CPUSPARCState));
950
gen_intermediate_code_init(env);
952
if (cpu_sparc_register(env, cpu_model) < 0) {
953
cpu_sparc_close(env);
961
void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
963
#if !defined(TARGET_SPARC64)
964
env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
968
static const sparc_def_t sparc_defs[] = {
969
#ifdef TARGET_SPARC64
971
.name = "Fujitsu Sparc64",
972
.iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)
973
| (MAXTL << 8) | (NWINDOWS - 1)),
974
.fpu_version = 0x00000000,
976
.features = CPU_DEFAULT_FEATURES,
979
.name = "Fujitsu Sparc64 III",
980
.iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)
981
| (MAXTL << 8) | (NWINDOWS - 1)),
982
.fpu_version = 0x00000000,
984
.features = CPU_DEFAULT_FEATURES,
987
.name = "Fujitsu Sparc64 IV",
988
.iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)
989
| (MAXTL << 8) | (NWINDOWS - 1)),
990
.fpu_version = 0x00000000,
992
.features = CPU_DEFAULT_FEATURES,
995
.name = "Fujitsu Sparc64 V",
996
.iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)
997
| (MAXTL << 8) | (NWINDOWS - 1)),
998
.fpu_version = 0x00000000,
1000
.features = CPU_DEFAULT_FEATURES,
1003
.name = "TI UltraSparc I",
1004
.iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)
1005
| (MAXTL << 8) | (NWINDOWS - 1)),
1006
.fpu_version = 0x00000000,
1008
.features = CPU_DEFAULT_FEATURES,
1011
.name = "TI UltraSparc II",
1012
.iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)
1013
| (MAXTL << 8) | (NWINDOWS - 1)),
1014
.fpu_version = 0x00000000,
1016
.features = CPU_DEFAULT_FEATURES,
1019
.name = "TI UltraSparc IIi",
1020
.iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)
1021
| (MAXTL << 8) | (NWINDOWS - 1)),
1022
.fpu_version = 0x00000000,
1024
.features = CPU_DEFAULT_FEATURES,
1027
.name = "TI UltraSparc IIe",
1028
.iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)
1029
| (MAXTL << 8) | (NWINDOWS - 1)),
1030
.fpu_version = 0x00000000,
1032
.features = CPU_DEFAULT_FEATURES,
1035
.name = "Sun UltraSparc III",
1036
.iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)
1037
| (MAXTL << 8) | (NWINDOWS - 1)),
1038
.fpu_version = 0x00000000,
1040
.features = CPU_DEFAULT_FEATURES,
1043
.name = "Sun UltraSparc III Cu",
1044
.iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)
1045
| (MAXTL << 8) | (NWINDOWS - 1)),
1046
.fpu_version = 0x00000000,
1048
.features = CPU_DEFAULT_FEATURES,
1051
.name = "Sun UltraSparc IIIi",
1052
.iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)
1053
| (MAXTL << 8) | (NWINDOWS - 1)),
1054
.fpu_version = 0x00000000,
1056
.features = CPU_DEFAULT_FEATURES,
1059
.name = "Sun UltraSparc IV",
1060
.iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)
1061
| (MAXTL << 8) | (NWINDOWS - 1)),
1062
.fpu_version = 0x00000000,
1064
.features = CPU_DEFAULT_FEATURES,
1067
.name = "Sun UltraSparc IV+",
1068
.iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)
1069
| (MAXTL << 8) | (NWINDOWS - 1)),
1070
.fpu_version = 0x00000000,
1072
.features = CPU_DEFAULT_FEATURES,
1075
.name = "Sun UltraSparc IIIi+",
1076
.iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)
1077
| (MAXTL << 8) | (NWINDOWS - 1)),
1078
.fpu_version = 0x00000000,
1080
.features = CPU_DEFAULT_FEATURES,
1083
.name = "NEC UltraSparc I",
1084
.iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)
1085
| (MAXTL << 8) | (NWINDOWS - 1)),
1086
.fpu_version = 0x00000000,
1088
.features = CPU_DEFAULT_FEATURES,
1092
.name = "Fujitsu MB86900",
1093
.iu_version = 0x00 << 24, /* Impl 0, ver 0 */
1094
.fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1095
.mmu_version = 0x00 << 24, /* Impl 0, ver 0 */
1096
.mmu_bm = 0x00004000,
1097
.mmu_ctpr_mask = 0x007ffff0,
1098
.mmu_cxr_mask = 0x0000003f,
1099
.mmu_sfsr_mask = 0xffffffff,
1100
.mmu_trcr_mask = 0xffffffff,
1101
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_FSMULD,
1104
.name = "Fujitsu MB86904",
1105
.iu_version = 0x04 << 24, /* Impl 0, ver 4 */
1106
.fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1107
.mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
1108
.mmu_bm = 0x00004000,
1109
.mmu_ctpr_mask = 0x00ffffc0,
1110
.mmu_cxr_mask = 0x000000ff,
1111
.mmu_sfsr_mask = 0x00016fff,
1112
.mmu_trcr_mask = 0x00ffffff,
1113
.features = CPU_DEFAULT_FEATURES,
1116
.name = "Fujitsu MB86907",
1117
.iu_version = 0x05 << 24, /* Impl 0, ver 5 */
1118
.fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1119
.mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
1120
.mmu_bm = 0x00004000,
1121
.mmu_ctpr_mask = 0xffffffc0,
1122
.mmu_cxr_mask = 0x000000ff,
1123
.mmu_sfsr_mask = 0x00016fff,
1124
.mmu_trcr_mask = 0xffffffff,
1125
.features = CPU_DEFAULT_FEATURES,
1128
.name = "LSI L64811",
1129
.iu_version = 0x10 << 24, /* Impl 1, ver 0 */
1130
.fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */
1131
.mmu_version = 0x10 << 24,
1132
.mmu_bm = 0x00004000,
1133
.mmu_ctpr_mask = 0x007ffff0,
1134
.mmu_cxr_mask = 0x0000003f,
1135
.mmu_sfsr_mask = 0xffffffff,
1136
.mmu_trcr_mask = 0xffffffff,
1137
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
1141
.name = "Cypress CY7C601",
1142
.iu_version = 0x11 << 24, /* Impl 1, ver 1 */
1143
.fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
1144
.mmu_version = 0x10 << 24,
1145
.mmu_bm = 0x00004000,
1146
.mmu_ctpr_mask = 0x007ffff0,
1147
.mmu_cxr_mask = 0x0000003f,
1148
.mmu_sfsr_mask = 0xffffffff,
1149
.mmu_trcr_mask = 0xffffffff,
1150
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
1154
.name = "Cypress CY7C611",
1155
.iu_version = 0x13 << 24, /* Impl 1, ver 3 */
1156
.fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
1157
.mmu_version = 0x10 << 24,
1158
.mmu_bm = 0x00004000,
1159
.mmu_ctpr_mask = 0x007ffff0,
1160
.mmu_cxr_mask = 0x0000003f,
1161
.mmu_sfsr_mask = 0xffffffff,
1162
.mmu_trcr_mask = 0xffffffff,
1163
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
1167
.name = "TI SuperSparc II",
1168
.iu_version = 0x40000000,
1169
.fpu_version = 0 << 17,
1170
.mmu_version = 0x04000000,
1171
.mmu_bm = 0x00002000,
1172
.mmu_ctpr_mask = 0xffffffc0,
1173
.mmu_cxr_mask = 0x0000ffff,
1174
.mmu_sfsr_mask = 0xffffffff,
1175
.mmu_trcr_mask = 0xffffffff,
1176
.features = CPU_DEFAULT_FEATURES,
1179
.name = "TI MicroSparc I",
1180
.iu_version = 0x41000000,
1181
.fpu_version = 4 << 17,
1182
.mmu_version = 0x41000000,
1183
.mmu_bm = 0x00004000,
1184
.mmu_ctpr_mask = 0x007ffff0,
1185
.mmu_cxr_mask = 0x0000003f,
1186
.mmu_sfsr_mask = 0x00016fff,
1187
.mmu_trcr_mask = 0x0000003f,
1188
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_MUL |
1189
CPU_FEATURE_DIV | CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT |
1193
.name = "TI MicroSparc II",
1194
.iu_version = 0x42000000,
1195
.fpu_version = 4 << 17,
1196
.mmu_version = 0x02000000,
1197
.mmu_bm = 0x00004000,
1198
.mmu_ctpr_mask = 0x00ffffc0,
1199
.mmu_cxr_mask = 0x000000ff,
1200
.mmu_sfsr_mask = 0x00016fff,
1201
.mmu_trcr_mask = 0x00ffffff,
1202
.features = CPU_DEFAULT_FEATURES,
1205
.name = "TI MicroSparc IIep",
1206
.iu_version = 0x42000000,
1207
.fpu_version = 4 << 17,
1208
.mmu_version = 0x04000000,
1209
.mmu_bm = 0x00004000,
1210
.mmu_ctpr_mask = 0x00ffffc0,
1211
.mmu_cxr_mask = 0x000000ff,
1212
.mmu_sfsr_mask = 0x00016bff,
1213
.mmu_trcr_mask = 0x00ffffff,
1214
.features = CPU_DEFAULT_FEATURES,
1217
.name = "TI SuperSparc 40", // STP1020NPGA
1218
.iu_version = 0x41000000,
1219
.fpu_version = 0 << 17,
1220
.mmu_version = 0x00000000,
1221
.mmu_bm = 0x00002000,
1222
.mmu_ctpr_mask = 0xffffffc0,
1223
.mmu_cxr_mask = 0x0000ffff,
1224
.mmu_sfsr_mask = 0xffffffff,
1225
.mmu_trcr_mask = 0xffffffff,
1226
.features = CPU_DEFAULT_FEATURES,
1229
.name = "TI SuperSparc 50", // STP1020PGA
1230
.iu_version = 0x40000000,
1231
.fpu_version = 0 << 17,
1232
.mmu_version = 0x04000000,
1233
.mmu_bm = 0x00002000,
1234
.mmu_ctpr_mask = 0xffffffc0,
1235
.mmu_cxr_mask = 0x0000ffff,
1236
.mmu_sfsr_mask = 0xffffffff,
1237
.mmu_trcr_mask = 0xffffffff,
1238
.features = CPU_DEFAULT_FEATURES,
1241
.name = "TI SuperSparc 51",
1242
.iu_version = 0x43000000,
1243
.fpu_version = 0 << 17,
1244
.mmu_version = 0x04000000,
1245
.mmu_bm = 0x00002000,
1246
.mmu_ctpr_mask = 0xffffffc0,
1247
.mmu_cxr_mask = 0x0000ffff,
1248
.mmu_sfsr_mask = 0xffffffff,
1249
.mmu_trcr_mask = 0xffffffff,
1250
.features = CPU_DEFAULT_FEATURES,
1253
.name = "TI SuperSparc 60", // STP1020APGA
1254
.iu_version = 0x40000000,
1255
.fpu_version = 0 << 17,
1256
.mmu_version = 0x03000000,
1257
.mmu_bm = 0x00002000,
1258
.mmu_ctpr_mask = 0xffffffc0,
1259
.mmu_cxr_mask = 0x0000ffff,
1260
.mmu_sfsr_mask = 0xffffffff,
1261
.mmu_trcr_mask = 0xffffffff,
1262
.features = CPU_DEFAULT_FEATURES,
1265
.name = "TI SuperSparc 61",
1266
.iu_version = 0x44000000,
1267
.fpu_version = 0 << 17,
1268
.mmu_version = 0x04000000,
1269
.mmu_bm = 0x00002000,
1270
.mmu_ctpr_mask = 0xffffffc0,
1271
.mmu_cxr_mask = 0x0000ffff,
1272
.mmu_sfsr_mask = 0xffffffff,
1273
.mmu_trcr_mask = 0xffffffff,
1274
.features = CPU_DEFAULT_FEATURES,
1277
.name = "Ross RT625",
1278
.iu_version = 0x1e000000,
1279
.fpu_version = 1 << 17,
1280
.mmu_version = 0x1e000000,
1281
.mmu_bm = 0x00004000,
1282
.mmu_ctpr_mask = 0x007ffff0,
1283
.mmu_cxr_mask = 0x0000003f,
1284
.mmu_sfsr_mask = 0xffffffff,
1285
.mmu_trcr_mask = 0xffffffff,
1286
.features = CPU_DEFAULT_FEATURES,
1289
.name = "Ross RT620",
1290
.iu_version = 0x1f000000,
1291
.fpu_version = 1 << 17,
1292
.mmu_version = 0x1f000000,
1293
.mmu_bm = 0x00004000,
1294
.mmu_ctpr_mask = 0x007ffff0,
1295
.mmu_cxr_mask = 0x0000003f,
1296
.mmu_sfsr_mask = 0xffffffff,
1297
.mmu_trcr_mask = 0xffffffff,
1298
.features = CPU_DEFAULT_FEATURES,
1301
.name = "BIT B5010",
1302
.iu_version = 0x20000000,
1303
.fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */
1304
.mmu_version = 0x20000000,
1305
.mmu_bm = 0x00004000,
1306
.mmu_ctpr_mask = 0x007ffff0,
1307
.mmu_cxr_mask = 0x0000003f,
1308
.mmu_sfsr_mask = 0xffffffff,
1309
.mmu_trcr_mask = 0xffffffff,
1310
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT |
1314
.name = "Matsushita MN10501",
1315
.iu_version = 0x50000000,
1316
.fpu_version = 0 << 17,
1317
.mmu_version = 0x50000000,
1318
.mmu_bm = 0x00004000,
1319
.mmu_ctpr_mask = 0x007ffff0,
1320
.mmu_cxr_mask = 0x0000003f,
1321
.mmu_sfsr_mask = 0xffffffff,
1322
.mmu_trcr_mask = 0xffffffff,
1323
.features = CPU_FEATURE_FLOAT | CPU_FEATURE_MUL | CPU_FEATURE_FSQRT |
1327
.name = "Weitek W8601",
1328
.iu_version = 0x90 << 24, /* Impl 9, ver 0 */
1329
.fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */
1330
.mmu_version = 0x10 << 24,
1331
.mmu_bm = 0x00004000,
1332
.mmu_ctpr_mask = 0x007ffff0,
1333
.mmu_cxr_mask = 0x0000003f,
1334
.mmu_sfsr_mask = 0xffffffff,
1335
.mmu_trcr_mask = 0xffffffff,
1336
.features = CPU_DEFAULT_FEATURES,
1340
.iu_version = 0xf2000000,
1341
.fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1342
.mmu_version = 0xf2000000,
1343
.mmu_bm = 0x00004000,
1344
.mmu_ctpr_mask = 0x007ffff0,
1345
.mmu_cxr_mask = 0x0000003f,
1346
.mmu_sfsr_mask = 0xffffffff,
1347
.mmu_trcr_mask = 0xffffffff,
1348
.features = CPU_DEFAULT_FEATURES,
1352
.iu_version = 0xf3000000,
1353
.fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
1354
.mmu_version = 0xf3000000,
1355
.mmu_bm = 0x00004000,
1356
.mmu_ctpr_mask = 0x007ffff0,
1357
.mmu_cxr_mask = 0x0000003f,
1358
.mmu_sfsr_mask = 0xffffffff,
1359
.mmu_trcr_mask = 0xffffffff,
1360
.features = CPU_DEFAULT_FEATURES,
1365
static const char * const feature_name[] = {
1379
static void print_features(FILE *f,
1380
int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
1381
uint32_t features, const char *prefix)
1385
for (i = 0; i < ARRAY_SIZE(feature_name); i++)
1386
if (feature_name[i] && (features & (1 << i))) {
1388
(*cpu_fprintf)(f, "%s", prefix);
1389
(*cpu_fprintf)(f, "%s ", feature_name[i]);
1393
static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features)
1397
for (i = 0; i < ARRAY_SIZE(feature_name); i++)
1398
if (feature_name[i] && !strcmp(flagname, feature_name[i])) {
1399
*features |= 1 << i;
1402
fprintf(stderr, "CPU feature %s not found\n", flagname);
1405
static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model)
1408
const sparc_def_t *def = NULL;
1409
char *s = strdup(cpu_model);
1410
char *featurestr, *name = strtok(s, ",");
1411
uint32_t plus_features = 0;
1412
uint32_t minus_features = 0;
1413
long long iu_version;
1414
uint32_t fpu_version, mmu_version;
1416
for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
1417
if (strcasecmp(name, sparc_defs[i].name) == 0) {
1418
def = &sparc_defs[i];
1423
memcpy(cpu_def, def, sizeof(*def));
1425
featurestr = strtok(NULL, ",");
1426
while (featurestr) {
1429
if (featurestr[0] == '+') {
1430
add_flagname_to_bitmaps(featurestr + 1, &plus_features);
1431
} else if (featurestr[0] == '-') {
1432
add_flagname_to_bitmaps(featurestr + 1, &minus_features);
1433
} else if ((val = strchr(featurestr, '='))) {
1435
if (!strcmp(featurestr, "iu_version")) {
1438
iu_version = strtoll(val, &err, 0);
1439
if (!*val || *err) {
1440
fprintf(stderr, "bad numerical value %s\n", val);
1443
cpu_def->iu_version = iu_version;
1444
#ifdef DEBUG_FEATURES
1445
fprintf(stderr, "iu_version %llx\n", iu_version);
1447
} else if (!strcmp(featurestr, "fpu_version")) {
1450
fpu_version = strtol(val, &err, 0);
1451
if (!*val || *err) {
1452
fprintf(stderr, "bad numerical value %s\n", val);
1455
cpu_def->fpu_version = fpu_version;
1456
#ifdef DEBUG_FEATURES
1457
fprintf(stderr, "fpu_version %llx\n", fpu_version);
1459
} else if (!strcmp(featurestr, "mmu_version")) {
1462
mmu_version = strtol(val, &err, 0);
1463
if (!*val || *err) {
1464
fprintf(stderr, "bad numerical value %s\n", val);
1467
cpu_def->mmu_version = mmu_version;
1468
#ifdef DEBUG_FEATURES
1469
fprintf(stderr, "mmu_version %llx\n", mmu_version);
1472
fprintf(stderr, "unrecognized feature %s\n", featurestr);
1476
fprintf(stderr, "feature string `%s' not in format "
1477
"(+feature|-feature|feature=xyz)\n", featurestr);
1480
featurestr = strtok(NULL, ",");
1482
cpu_def->features |= plus_features;
1483
cpu_def->features &= ~minus_features;
1484
#ifdef DEBUG_FEATURES
1485
print_features(stderr, fprintf, cpu_def->features, NULL);
1495
void sparc_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
1499
for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
1500
(*cpu_fprintf)(f, "Sparc %16s IU " TARGET_FMT_lx " FPU %08x MMU %08x ",
1502
sparc_defs[i].iu_version,
1503
sparc_defs[i].fpu_version,
1504
sparc_defs[i].mmu_version);
1505
print_features(f, cpu_fprintf, CPU_DEFAULT_FEATURES &
1506
~sparc_defs[i].features, "-");
1507
print_features(f, cpu_fprintf, ~CPU_DEFAULT_FEATURES &
1508
sparc_defs[i].features, "+");
1509
(*cpu_fprintf)(f, "\n");
1511
(*cpu_fprintf)(f, "CPU feature flags (+/-): ");
1512
print_features(f, cpu_fprintf, -1, NULL);
1513
(*cpu_fprintf)(f, "\n");
1514
(*cpu_fprintf)(f, "Numerical features (=): iu_version fpu_version "
1518
#define GET_FLAG(a,b) ((env->psr & a)?b:'-')
1520
void cpu_dump_state(CPUState *env, FILE *f,
1521
int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
1526
cpu_fprintf(f, "pc: " TARGET_FMT_lx " npc: " TARGET_FMT_lx "\n", env->pc,
1528
cpu_fprintf(f, "General Registers:\n");
1529
for (i = 0; i < 4; i++)
1530
cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
1531
cpu_fprintf(f, "\n");
1533
cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
1534
cpu_fprintf(f, "\nCurrent Register Window:\n");
1535
for (x = 0; x < 3; x++) {
1536
for (i = 0; i < 4; i++)
1537
cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
1538
(x == 0 ? 'o' : (x == 1 ? 'l' : 'i')), i,
1539
env->regwptr[i + x * 8]);
1540
cpu_fprintf(f, "\n");
1542
cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
1543
(x == 0 ? 'o' : x == 1 ? 'l' : 'i'), i,
1544
env->regwptr[i + x * 8]);
1545
cpu_fprintf(f, "\n");
1547
cpu_fprintf(f, "\nFloating Point Registers:\n");
1548
for (i = 0; i < 32; i++) {
1550
cpu_fprintf(f, "%%f%02d:", i);
1551
cpu_fprintf(f, " %016lf", env->fpr[i]);
1553
cpu_fprintf(f, "\n");
1555
#ifdef TARGET_SPARC64
1556
cpu_fprintf(f, "pstate: 0x%08x ccr: 0x%02x asi: 0x%02x tl: %d fprs: %d\n",
1557
env->pstate, GET_CCR(env), env->asi, env->tl, env->fprs);
1558
cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate %d "
1559
"cleanwin %d cwp %d\n",
1560
env->cansave, env->canrestore, env->otherwin, env->wstate,
1561
env->cleanwin, NWINDOWS - 1 - env->cwp);
1563
cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n",
1564
GET_PSR(env), GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'),
1565
GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'),
1566
env->psrs?'S':'-', env->psrps?'P':'-',
1567
env->psret?'E':'-', env->wim);
1569
cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env));
1572
#ifdef TARGET_SPARC64
1573
#if !defined(CONFIG_USER_ONLY)
1574
#include "qemu-common.h"
1576
#include "qemu-timer.h"
1579
void helper_tick_set_count(void *opaque, uint64_t count)
1581
#if !defined(CONFIG_USER_ONLY)
1582
ptimer_set_count(opaque, -count);
1586
uint64_t helper_tick_get_count(void *opaque)
1588
#if !defined(CONFIG_USER_ONLY)
1589
return -ptimer_get_count(opaque);
1595
void helper_tick_set_limit(void *opaque, uint64_t limit)
1597
#if !defined(CONFIG_USER_ONLY)
1598
ptimer_set_limit(opaque, -limit, 0);