Commit 3deaeab717e8632c0c1825b566c92aceaf8c4c75
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
Showing
4 changed files
with
103 additions
and
9 deletions
target-sparc/cpu.h
| ... | ... | @@ -198,6 +198,10 @@ typedef struct CPUSPARCState { |
| 198 | 198 | int interrupt_request; |
| 199 | 199 | int halted; |
| 200 | 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 | 205 | /* NOTE: we allow 8 more registers to handle wrapping */ |
| 202 | 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 | 129 | |
| 130 | 130 | /* SPARC reference MMU table walk: Context table->L1->L2->PTE */ |
| 131 | 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 | 133 | pde = ldl_phys(pde_ptr); |
| 134 | 134 | |
| 135 | 135 | /* Ctx pde */ | ... | ... |
target-sparc/op_helper.c
| ... | ... | @@ -591,7 +591,7 @@ void helper_st_asi(int asi, int size) |
| 591 | 591 | |
| 592 | 592 | oldreg = env->mmuregs[reg]; |
| 593 | 593 | switch(reg) { |
| 594 | - case 0: | |
| 594 | + case 0: // Control Register | |
| 595 | 595 | env->mmuregs[reg] = (env->mmuregs[reg] & 0xff000000) | |
| 596 | 596 | (T1 & 0x00ffffff); |
| 597 | 597 | // Mappings generated during no-fault mode or MMU |
| ... | ... | @@ -600,21 +600,27 @@ void helper_st_asi(int asi, int size) |
| 600 | 600 | (env->mmuregs[reg] & (MMU_E | MMU_NF | env->mmu_bm))) |
| 601 | 601 | tlb_flush(env, 1); |
| 602 | 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 | 608 | if (oldreg != env->mmuregs[reg]) { |
| 606 | 609 | /* we flush when the MMU context changes because |
| 607 | 610 | QEMU has no MMU context support */ |
| 608 | 611 | tlb_flush(env, 1); |
| 609 | 612 | } |
| 610 | 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 | 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 | 622 | break; |
| 617 | - case 0x14: | |
| 623 | + case 0x14: // Synchronous Fault Address Register | |
| 618 | 624 | env->mmuregs[4] = T1; |
| 619 | 625 | break; |
| 620 | 626 | default: | ... | ... |
target-sparc/translate.c
| ... | ... | @@ -62,6 +62,10 @@ struct sparc_def_t { |
| 62 | 62 | uint32_t fpu_version; |
| 63 | 63 | uint32_t mmu_version; |
| 64 | 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 | 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 | 3762 | env->fsr = def->fpu_version; |
| 3759 | 3763 | #if !defined(TARGET_SPARC64) |
| 3760 | 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 | 3769 | env->mmuregs[0] |= def->mmu_version; |
| 3762 | 3770 | cpu_sparc_set_id(env, 0); |
| 3763 | 3771 | #endif |
| ... | ... | @@ -3887,6 +3895,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3887 | 3895 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ |
| 3888 | 3896 | .mmu_version = 0x00 << 24, /* Impl 0, ver 0 */ |
| 3889 | 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 | 3904 | .name = "Fujitsu MB86904", |
| ... | ... | @@ -3894,6 +3906,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3894 | 3906 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ |
| 3895 | 3907 | .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */ |
| 3896 | 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 | 3915 | .name = "Fujitsu MB86907", |
| ... | ... | @@ -3901,6 +3917,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3901 | 3917 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ |
| 3902 | 3918 | .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */ |
| 3903 | 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 | 3926 | .name = "LSI L64811", |
| ... | ... | @@ -3908,6 +3928,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3908 | 3928 | .fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */ |
| 3909 | 3929 | .mmu_version = 0x10 << 24, |
| 3910 | 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 | 3937 | .name = "Cypress CY7C601", |
| ... | ... | @@ -3915,6 +3939,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3915 | 3939 | .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */ |
| 3916 | 3940 | .mmu_version = 0x10 << 24, |
| 3917 | 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 | 3948 | .name = "Cypress CY7C611", |
| ... | ... | @@ -3922,6 +3950,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3922 | 3950 | .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */ |
| 3923 | 3951 | .mmu_version = 0x10 << 24, |
| 3924 | 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 | 3959 | .name = "TI SuperSparc II", |
| ... | ... | @@ -3929,6 +3961,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3929 | 3961 | .fpu_version = 0 << 17, |
| 3930 | 3962 | .mmu_version = 0x04000000, |
| 3931 | 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 | 3970 | .name = "TI MicroSparc I", |
| ... | ... | @@ -3936,6 +3972,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3936 | 3972 | .fpu_version = 4 << 17, |
| 3937 | 3973 | .mmu_version = 0x41000000, |
| 3938 | 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 | 3981 | .name = "TI MicroSparc II", |
| ... | ... | @@ -3943,6 +3983,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3943 | 3983 | .fpu_version = 4 << 17, |
| 3944 | 3984 | .mmu_version = 0x02000000, |
| 3945 | 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 | 3992 | .name = "TI MicroSparc IIep", |
| ... | ... | @@ -3950,6 +3994,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3950 | 3994 | .fpu_version = 4 << 17, |
| 3951 | 3995 | .mmu_version = 0x04000000, |
| 3952 | 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 | 4003 | .name = "TI SuperSparc 51", |
| ... | ... | @@ -3957,6 +4005,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3957 | 4005 | .fpu_version = 0 << 17, |
| 3958 | 4006 | .mmu_version = 0x04000000, |
| 3959 | 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 | 4014 | .name = "TI SuperSparc 61", |
| ... | ... | @@ -3964,6 +4016,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3964 | 4016 | .fpu_version = 0 << 17, |
| 3965 | 4017 | .mmu_version = 0x04000000, |
| 3966 | 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 | 4025 | .name = "Ross RT625", |
| ... | ... | @@ -3971,6 +4027,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3971 | 4027 | .fpu_version = 1 << 17, |
| 3972 | 4028 | .mmu_version = 0x1e000000, |
| 3973 | 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 | 4036 | .name = "Ross RT620", |
| ... | ... | @@ -3978,6 +4038,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3978 | 4038 | .fpu_version = 1 << 17, |
| 3979 | 4039 | .mmu_version = 0x1f000000, |
| 3980 | 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 | 4047 | .name = "BIT B5010", |
| ... | ... | @@ -3985,6 +4049,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3985 | 4049 | .fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */ |
| 3986 | 4050 | .mmu_version = 0x20000000, |
| 3987 | 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 | 4058 | .name = "Matsushita MN10501", |
| ... | ... | @@ -3992,6 +4060,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3992 | 4060 | .fpu_version = 0 << 17, |
| 3993 | 4061 | .mmu_version = 0x50000000, |
| 3994 | 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 | 4069 | .name = "Weitek W8601", |
| ... | ... | @@ -3999,6 +4071,10 @@ static const sparc_def_t sparc_defs[] = { |
| 3999 | 4071 | .fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */ |
| 4000 | 4072 | .mmu_version = 0x10 << 24, |
| 4001 | 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 | 4080 | .name = "LEON2", |
| ... | ... | @@ -4006,6 +4082,10 @@ static const sparc_def_t sparc_defs[] = { |
| 4006 | 4082 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ |
| 4007 | 4083 | .mmu_version = 0xf2000000, |
| 4008 | 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 | 4091 | .name = "LEON3", |
| ... | ... | @@ -4013,6 +4093,10 @@ static const sparc_def_t sparc_defs[] = { |
| 4013 | 4093 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ |
| 4014 | 4094 | .mmu_version = 0xf3000000, |
| 4015 | 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 | 4101 | #endif |
| 4018 | 4102 | }; | ... | ... |