Commit 3deaeab717e8632c0c1825b566c92aceaf8c4c75

Authored by blueswir1
1 parent 5228c2d3

Sparc32 MMU register fixes (Robert Reif)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3979 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/cpu.h
@@ -198,6 +198,10 @@ typedef struct CPUSPARCState { @@ -198,6 +198,10 @@ typedef struct CPUSPARCState {
198 int interrupt_request; 198 int interrupt_request;
199 int halted; 199 int halted;
200 uint32_t mmu_bm; 200 uint32_t mmu_bm;
  201 + uint32_t mmu_ctpr_mask;
  202 + uint32_t mmu_cxr_mask;
  203 + uint32_t mmu_sfsr_mask;
  204 + uint32_t mmu_trcr_mask;
201 /* NOTE: we allow 8 more registers to handle wrapping */ 205 /* NOTE: we allow 8 more registers to handle wrapping */
202 target_ulong regbase[NWINDOWS * 16 + 8]; 206 target_ulong regbase[NWINDOWS * 16 + 8];
203 207
target-sparc/helper.c
@@ -129,7 +129,7 @@ int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot @@ -129,7 +129,7 @@ int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot
129 129
130 /* SPARC reference MMU table walk: Context table->L1->L2->PTE */ 130 /* SPARC reference MMU table walk: Context table->L1->L2->PTE */
131 /* Context base + context number */ 131 /* Context base + context number */
132 - pde_ptr = ((env->mmuregs[1] & ~63)<< 4) + (env->mmuregs[2] << 2); 132 + pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2);
133 pde = ldl_phys(pde_ptr); 133 pde = ldl_phys(pde_ptr);
134 134
135 /* Ctx pde */ 135 /* Ctx pde */
target-sparc/op_helper.c
@@ -591,7 +591,7 @@ void helper_st_asi(int asi, int size) @@ -591,7 +591,7 @@ void helper_st_asi(int asi, int size)
591 591
592 oldreg = env->mmuregs[reg]; 592 oldreg = env->mmuregs[reg];
593 switch(reg) { 593 switch(reg) {
594 - case 0: 594 + case 0: // Control Register
595 env->mmuregs[reg] = (env->mmuregs[reg] & 0xff000000) | 595 env->mmuregs[reg] = (env->mmuregs[reg] & 0xff000000) |
596 (T1 & 0x00ffffff); 596 (T1 & 0x00ffffff);
597 // Mappings generated during no-fault mode or MMU 597 // Mappings generated during no-fault mode or MMU
@@ -600,21 +600,27 @@ void helper_st_asi(int asi, int size) @@ -600,21 +600,27 @@ void helper_st_asi(int asi, int size)
600 (env->mmuregs[reg] & (MMU_E | MMU_NF | env->mmu_bm))) 600 (env->mmuregs[reg] & (MMU_E | MMU_NF | env->mmu_bm)))
601 tlb_flush(env, 1); 601 tlb_flush(env, 1);
602 break; 602 break;
603 - case 2:  
604 - env->mmuregs[reg] = T1; 603 + case 1: // Context Table Pointer Register
  604 + env->mmuregs[reg] = T1 & env->mmu_ctpr_mask;
  605 + break;
  606 + case 2: // Context Register
  607 + env->mmuregs[reg] = T1 & env->mmu_cxr_mask;
605 if (oldreg != env->mmuregs[reg]) { 608 if (oldreg != env->mmuregs[reg]) {
606 /* we flush when the MMU context changes because 609 /* we flush when the MMU context changes because
607 QEMU has no MMU context support */ 610 QEMU has no MMU context support */
608 tlb_flush(env, 1); 611 tlb_flush(env, 1);
609 } 612 }
610 break; 613 break;
611 - case 3:  
612 - case 4: 614 + case 3: // Synchronous Fault Status Register with Clear
  615 + case 4: // Synchronous Fault Address Register
  616 + break;
  617 + case 0x10: // TLB Replacement Control Register
  618 + env->mmuregs[reg] = T1 & env->mmu_trcr_mask;
613 break; 619 break;
614 - case 0x13:  
615 - env->mmuregs[3] = T1; 620 + case 0x13: // Synchronous Fault Status Register with Read and Clear
  621 + env->mmuregs[3] = T1 & env->mmu_sfsr_mask;
616 break; 622 break;
617 - case 0x14: 623 + case 0x14: // Synchronous Fault Address Register
618 env->mmuregs[4] = T1; 624 env->mmuregs[4] = T1;
619 break; 625 break;
620 default: 626 default:
target-sparc/translate.c
@@ -62,6 +62,10 @@ struct sparc_def_t { @@ -62,6 +62,10 @@ struct sparc_def_t {
62 uint32_t fpu_version; 62 uint32_t fpu_version;
63 uint32_t mmu_version; 63 uint32_t mmu_version;
64 uint32_t mmu_bm; 64 uint32_t mmu_bm;
  65 + uint32_t mmu_ctpr_mask;
  66 + uint32_t mmu_cxr_mask;
  67 + uint32_t mmu_sfsr_mask;
  68 + uint32_t mmu_trcr_mask;
65 }; 69 };
66 70
67 static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name); 71 static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name);
@@ -3758,6 +3762,10 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model) @@ -3758,6 +3762,10 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model)
3758 env->fsr = def->fpu_version; 3762 env->fsr = def->fpu_version;
3759 #if !defined(TARGET_SPARC64) 3763 #if !defined(TARGET_SPARC64)
3760 env->mmu_bm = def->mmu_bm; 3764 env->mmu_bm = def->mmu_bm;
  3765 + env->mmu_ctpr_mask = def->mmu_ctpr_mask;
  3766 + env->mmu_cxr_mask = def->mmu_cxr_mask;
  3767 + env->mmu_sfsr_mask = def->mmu_sfsr_mask;
  3768 + env->mmu_trcr_mask = def->mmu_trcr_mask;
3761 env->mmuregs[0] |= def->mmu_version; 3769 env->mmuregs[0] |= def->mmu_version;
3762 cpu_sparc_set_id(env, 0); 3770 cpu_sparc_set_id(env, 0);
3763 #endif 3771 #endif
@@ -3887,6 +3895,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3887,6 +3895,10 @@ static const sparc_def_t sparc_defs[] = {
3887 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ 3895 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
3888 .mmu_version = 0x00 << 24, /* Impl 0, ver 0 */ 3896 .mmu_version = 0x00 << 24, /* Impl 0, ver 0 */
3889 .mmu_bm = 0x00004000, 3897 .mmu_bm = 0x00004000,
  3898 + .mmu_ctpr_mask = 0x007ffff0,
  3899 + .mmu_cxr_mask = 0x0000003f,
  3900 + .mmu_sfsr_mask = 0xffffffff,
  3901 + .mmu_trcr_mask = 0xffffffff,
3890 }, 3902 },
3891 { 3903 {
3892 .name = "Fujitsu MB86904", 3904 .name = "Fujitsu MB86904",
@@ -3894,6 +3906,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3894,6 +3906,10 @@ static const sparc_def_t sparc_defs[] = {
3894 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ 3906 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
3895 .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */ 3907 .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
3896 .mmu_bm = 0x00004000, 3908 .mmu_bm = 0x00004000,
  3909 + .mmu_ctpr_mask = 0x00ffffc0,
  3910 + .mmu_cxr_mask = 0x000000ff,
  3911 + .mmu_sfsr_mask = 0x00016fff,
  3912 + .mmu_trcr_mask = 0x00ffffff,
3897 }, 3913 },
3898 { 3914 {
3899 .name = "Fujitsu MB86907", 3915 .name = "Fujitsu MB86907",
@@ -3901,6 +3917,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3901,6 +3917,10 @@ static const sparc_def_t sparc_defs[] = {
3901 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ 3917 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
3902 .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */ 3918 .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
3903 .mmu_bm = 0x00004000, 3919 .mmu_bm = 0x00004000,
  3920 + .mmu_ctpr_mask = 0xffffffc0,
  3921 + .mmu_cxr_mask = 0x000000ff,
  3922 + .mmu_sfsr_mask = 0x00016fff,
  3923 + .mmu_trcr_mask = 0xffffffff,
3904 }, 3924 },
3905 { 3925 {
3906 .name = "LSI L64811", 3926 .name = "LSI L64811",
@@ -3908,6 +3928,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3908,6 +3928,10 @@ static const sparc_def_t sparc_defs[] = {
3908 .fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */ 3928 .fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */
3909 .mmu_version = 0x10 << 24, 3929 .mmu_version = 0x10 << 24,
3910 .mmu_bm = 0x00004000, 3930 .mmu_bm = 0x00004000,
  3931 + .mmu_ctpr_mask = 0x007ffff0,
  3932 + .mmu_cxr_mask = 0x0000003f,
  3933 + .mmu_sfsr_mask = 0xffffffff,
  3934 + .mmu_trcr_mask = 0xffffffff,
3911 }, 3935 },
3912 { 3936 {
3913 .name = "Cypress CY7C601", 3937 .name = "Cypress CY7C601",
@@ -3915,6 +3939,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3915,6 +3939,10 @@ static const sparc_def_t sparc_defs[] = {
3915 .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */ 3939 .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
3916 .mmu_version = 0x10 << 24, 3940 .mmu_version = 0x10 << 24,
3917 .mmu_bm = 0x00004000, 3941 .mmu_bm = 0x00004000,
  3942 + .mmu_ctpr_mask = 0x007ffff0,
  3943 + .mmu_cxr_mask = 0x0000003f,
  3944 + .mmu_sfsr_mask = 0xffffffff,
  3945 + .mmu_trcr_mask = 0xffffffff,
3918 }, 3946 },
3919 { 3947 {
3920 .name = "Cypress CY7C611", 3948 .name = "Cypress CY7C611",
@@ -3922,6 +3950,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3922,6 +3950,10 @@ static const sparc_def_t sparc_defs[] = {
3922 .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */ 3950 .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
3923 .mmu_version = 0x10 << 24, 3951 .mmu_version = 0x10 << 24,
3924 .mmu_bm = 0x00004000, 3952 .mmu_bm = 0x00004000,
  3953 + .mmu_ctpr_mask = 0x007ffff0,
  3954 + .mmu_cxr_mask = 0x0000003f,
  3955 + .mmu_sfsr_mask = 0xffffffff,
  3956 + .mmu_trcr_mask = 0xffffffff,
3925 }, 3957 },
3926 { 3958 {
3927 .name = "TI SuperSparc II", 3959 .name = "TI SuperSparc II",
@@ -3929,6 +3961,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3929,6 +3961,10 @@ static const sparc_def_t sparc_defs[] = {
3929 .fpu_version = 0 << 17, 3961 .fpu_version = 0 << 17,
3930 .mmu_version = 0x04000000, 3962 .mmu_version = 0x04000000,
3931 .mmu_bm = 0x00002000, 3963 .mmu_bm = 0x00002000,
  3964 + .mmu_ctpr_mask = 0xffffffc0,
  3965 + .mmu_cxr_mask = 0x0000ffff,
  3966 + .mmu_sfsr_mask = 0xffffffff,
  3967 + .mmu_trcr_mask = 0xffffffff,
3932 }, 3968 },
3933 { 3969 {
3934 .name = "TI MicroSparc I", 3970 .name = "TI MicroSparc I",
@@ -3936,6 +3972,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3936,6 +3972,10 @@ static const sparc_def_t sparc_defs[] = {
3936 .fpu_version = 4 << 17, 3972 .fpu_version = 4 << 17,
3937 .mmu_version = 0x41000000, 3973 .mmu_version = 0x41000000,
3938 .mmu_bm = 0x00004000, 3974 .mmu_bm = 0x00004000,
  3975 + .mmu_ctpr_mask = 0x007ffff0,
  3976 + .mmu_cxr_mask = 0x0000003f,
  3977 + .mmu_sfsr_mask = 0x00016fff,
  3978 + .mmu_trcr_mask = 0x0000003f,
3939 }, 3979 },
3940 { 3980 {
3941 .name = "TI MicroSparc II", 3981 .name = "TI MicroSparc II",
@@ -3943,6 +3983,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3943,6 +3983,10 @@ static const sparc_def_t sparc_defs[] = {
3943 .fpu_version = 4 << 17, 3983 .fpu_version = 4 << 17,
3944 .mmu_version = 0x02000000, 3984 .mmu_version = 0x02000000,
3945 .mmu_bm = 0x00004000, 3985 .mmu_bm = 0x00004000,
  3986 + .mmu_ctpr_mask = 0x00ffffc0,
  3987 + .mmu_cxr_mask = 0x000000ff,
  3988 + .mmu_sfsr_mask = 0x00016bff,
  3989 + .mmu_trcr_mask = 0x00ffffff,
3946 }, 3990 },
3947 { 3991 {
3948 .name = "TI MicroSparc IIep", 3992 .name = "TI MicroSparc IIep",
@@ -3950,6 +3994,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3950,6 +3994,10 @@ static const sparc_def_t sparc_defs[] = {
3950 .fpu_version = 4 << 17, 3994 .fpu_version = 4 << 17,
3951 .mmu_version = 0x04000000, 3995 .mmu_version = 0x04000000,
3952 .mmu_bm = 0x00004000, 3996 .mmu_bm = 0x00004000,
  3997 + .mmu_ctpr_mask = 0x00ffffc0,
  3998 + .mmu_cxr_mask = 0x000000ff,
  3999 + .mmu_sfsr_mask = 0x00016bff,
  4000 + .mmu_trcr_mask = 0x00ffffff,
3953 }, 4001 },
3954 { 4002 {
3955 .name = "TI SuperSparc 51", 4003 .name = "TI SuperSparc 51",
@@ -3957,6 +4005,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3957,6 +4005,10 @@ static const sparc_def_t sparc_defs[] = {
3957 .fpu_version = 0 << 17, 4005 .fpu_version = 0 << 17,
3958 .mmu_version = 0x04000000, 4006 .mmu_version = 0x04000000,
3959 .mmu_bm = 0x00002000, 4007 .mmu_bm = 0x00002000,
  4008 + .mmu_ctpr_mask = 0xffffffc0,
  4009 + .mmu_cxr_mask = 0x0000ffff,
  4010 + .mmu_sfsr_mask = 0xffffffff,
  4011 + .mmu_trcr_mask = 0xffffffff,
3960 }, 4012 },
3961 { 4013 {
3962 .name = "TI SuperSparc 61", 4014 .name = "TI SuperSparc 61",
@@ -3964,6 +4016,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3964,6 +4016,10 @@ static const sparc_def_t sparc_defs[] = {
3964 .fpu_version = 0 << 17, 4016 .fpu_version = 0 << 17,
3965 .mmu_version = 0x04000000, 4017 .mmu_version = 0x04000000,
3966 .mmu_bm = 0x00002000, 4018 .mmu_bm = 0x00002000,
  4019 + .mmu_ctpr_mask = 0xffffffc0,
  4020 + .mmu_cxr_mask = 0x0000ffff,
  4021 + .mmu_sfsr_mask = 0xffffffff,
  4022 + .mmu_trcr_mask = 0xffffffff,
3967 }, 4023 },
3968 { 4024 {
3969 .name = "Ross RT625", 4025 .name = "Ross RT625",
@@ -3971,6 +4027,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3971,6 +4027,10 @@ static const sparc_def_t sparc_defs[] = {
3971 .fpu_version = 1 << 17, 4027 .fpu_version = 1 << 17,
3972 .mmu_version = 0x1e000000, 4028 .mmu_version = 0x1e000000,
3973 .mmu_bm = 0x00004000, 4029 .mmu_bm = 0x00004000,
  4030 + .mmu_ctpr_mask = 0x007ffff0,
  4031 + .mmu_cxr_mask = 0x0000003f,
  4032 + .mmu_sfsr_mask = 0xffffffff,
  4033 + .mmu_trcr_mask = 0xffffffff,
3974 }, 4034 },
3975 { 4035 {
3976 .name = "Ross RT620", 4036 .name = "Ross RT620",
@@ -3978,6 +4038,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3978,6 +4038,10 @@ static const sparc_def_t sparc_defs[] = {
3978 .fpu_version = 1 << 17, 4038 .fpu_version = 1 << 17,
3979 .mmu_version = 0x1f000000, 4039 .mmu_version = 0x1f000000,
3980 .mmu_bm = 0x00004000, 4040 .mmu_bm = 0x00004000,
  4041 + .mmu_ctpr_mask = 0x007ffff0,
  4042 + .mmu_cxr_mask = 0x0000003f,
  4043 + .mmu_sfsr_mask = 0xffffffff,
  4044 + .mmu_trcr_mask = 0xffffffff,
3981 }, 4045 },
3982 { 4046 {
3983 .name = "BIT B5010", 4047 .name = "BIT B5010",
@@ -3985,6 +4049,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3985,6 +4049,10 @@ static const sparc_def_t sparc_defs[] = {
3985 .fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */ 4049 .fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */
3986 .mmu_version = 0x20000000, 4050 .mmu_version = 0x20000000,
3987 .mmu_bm = 0x00004000, 4051 .mmu_bm = 0x00004000,
  4052 + .mmu_ctpr_mask = 0x007ffff0,
  4053 + .mmu_cxr_mask = 0x0000003f,
  4054 + .mmu_sfsr_mask = 0xffffffff,
  4055 + .mmu_trcr_mask = 0xffffffff,
3988 }, 4056 },
3989 { 4057 {
3990 .name = "Matsushita MN10501", 4058 .name = "Matsushita MN10501",
@@ -3992,6 +4060,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3992,6 +4060,10 @@ static const sparc_def_t sparc_defs[] = {
3992 .fpu_version = 0 << 17, 4060 .fpu_version = 0 << 17,
3993 .mmu_version = 0x50000000, 4061 .mmu_version = 0x50000000,
3994 .mmu_bm = 0x00004000, 4062 .mmu_bm = 0x00004000,
  4063 + .mmu_ctpr_mask = 0x007ffff0,
  4064 + .mmu_cxr_mask = 0x0000003f,
  4065 + .mmu_sfsr_mask = 0xffffffff,
  4066 + .mmu_trcr_mask = 0xffffffff,
3995 }, 4067 },
3996 { 4068 {
3997 .name = "Weitek W8601", 4069 .name = "Weitek W8601",
@@ -3999,6 +4071,10 @@ static const sparc_def_t sparc_defs[] = { @@ -3999,6 +4071,10 @@ static const sparc_def_t sparc_defs[] = {
3999 .fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */ 4071 .fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */
4000 .mmu_version = 0x10 << 24, 4072 .mmu_version = 0x10 << 24,
4001 .mmu_bm = 0x00004000, 4073 .mmu_bm = 0x00004000,
  4074 + .mmu_ctpr_mask = 0x007ffff0,
  4075 + .mmu_cxr_mask = 0x0000003f,
  4076 + .mmu_sfsr_mask = 0xffffffff,
  4077 + .mmu_trcr_mask = 0xffffffff,
4002 }, 4078 },
4003 { 4079 {
4004 .name = "LEON2", 4080 .name = "LEON2",
@@ -4006,6 +4082,10 @@ static const sparc_def_t sparc_defs[] = { @@ -4006,6 +4082,10 @@ static const sparc_def_t sparc_defs[] = {
4006 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ 4082 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
4007 .mmu_version = 0xf2000000, 4083 .mmu_version = 0xf2000000,
4008 .mmu_bm = 0x00004000, 4084 .mmu_bm = 0x00004000,
  4085 + .mmu_ctpr_mask = 0x007ffff0,
  4086 + .mmu_cxr_mask = 0x0000003f,
  4087 + .mmu_sfsr_mask = 0xffffffff,
  4088 + .mmu_trcr_mask = 0xffffffff,
4009 }, 4089 },
4010 { 4090 {
4011 .name = "LEON3", 4091 .name = "LEON3",
@@ -4013,6 +4093,10 @@ static const sparc_def_t sparc_defs[] = { @@ -4013,6 +4093,10 @@ static const sparc_def_t sparc_defs[] = {
4013 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ 4093 .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
4014 .mmu_version = 0xf3000000, 4094 .mmu_version = 0xf3000000,
4015 .mmu_bm = 0x00004000, 4095 .mmu_bm = 0x00004000,
  4096 + .mmu_ctpr_mask = 0x007ffff0,
  4097 + .mmu_cxr_mask = 0x0000003f,
  4098 + .mmu_sfsr_mask = 0xffffffff,
  4099 + .mmu_trcr_mask = 0xffffffff,
4016 }, 4100 },
4017 #endif 4101 #endif
4018 }; 4102 };