Diff for /qemu/target-microblaze/mmu.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2018/04/24 17:23:14 version 1.1.1.2, 2018/04/24 17:36:43
Line 127  unsigned int mmu_translate(struct microb Line 127  unsigned int mmu_translate(struct microb
             tlb_zsel = (d >> 4) & 0xf;              tlb_zsel = (d >> 4) & 0xf;
             t0 = mmu->regs[MMU_R_ZPR] >> (30 - (tlb_zsel * 2));              t0 = mmu->regs[MMU_R_ZPR] >> (30 - (tlb_zsel * 2));
             t0 &= 0x3;              t0 &= 0x3;
   
               if (tlb_zsel > mmu->c_mmu_zones) {
                   qemu_log("tlb zone select out of range! %d\n", tlb_zsel);
                   t0 = 1; /* Ignore.  */
               }
   
               if (mmu->c_mmu == 1) {
                   t0 = 1; /* Zones are disabled.  */
               }
   
             switch (t0) {              switch (t0) {
                 case 0:                  case 0:
                     if (mmu_idx == MMU_USER_IDX)                      if (mmu_idx == MMU_USER_IDX)
Line 142  unsigned int mmu_translate(struct microb Line 152  unsigned int mmu_translate(struct microb
                     tlb_ex = 1;                      tlb_ex = 1;
                     tlb_wr = 1;                      tlb_wr = 1;
                     break;                      break;
                   default: break;
             }              }
   
   
             lu->err = ERR_PROT;              lu->err = ERR_PROT;
             lu->prot = PAGE_READ;              lu->prot = PAGE_READ;
             if (tlb_wr)              if (tlb_wr)
Line 180  uint32_t mmu_read(CPUState *env, uint32_ Line 190  uint32_t mmu_read(CPUState *env, uint32_
     unsigned int i;      unsigned int i;
     uint32_t r;      uint32_t r;
   
       if (env->mmu.c_mmu < 2 || !env->mmu.c_mmu_tlb_access) {
           qemu_log("MMU access on MMU-less system\n");
           return 0;
       }
   
     switch (rn) {      switch (rn) {
         /* Reads to HI/LO trig reads from the mmu rams.  */          /* Reads to HI/LO trig reads from the mmu rams.  */
         case MMU_R_TLBLO:          case MMU_R_TLBLO:
         case MMU_R_TLBHI:          case MMU_R_TLBHI:
               if (!(env->mmu.c_mmu_tlb_access & 1)) {
                   qemu_log("Invalid access to MMU reg %d\n", rn);
                   return 0;
               }
   
             i = env->mmu.regs[MMU_R_TLBX] & 0xff;              i = env->mmu.regs[MMU_R_TLBX] & 0xff;
             r = env->mmu.rams[rn & 1][i];              r = env->mmu.rams[rn & 1][i];
             if (rn == MMU_R_TLBHI)              if (rn == MMU_R_TLBHI)
                 env->mmu.regs[MMU_R_PID] = env->mmu.tids[i];                  env->mmu.regs[MMU_R_PID] = env->mmu.tids[i];
             break;              break;
           case MMU_R_PID:
           case MMU_R_ZPR:
               if (!(env->mmu.c_mmu_tlb_access & 1)) {
                   qemu_log("Invalid access to MMU reg %d\n", rn);
                   return 0;
               }
               r = env->mmu.regs[rn];
               break;
         default:          default:
             r = env->mmu.regs[rn];              r = env->mmu.regs[rn];
             break;              break;
Line 202  void mmu_write(CPUState *env, uint32_t r Line 230  void mmu_write(CPUState *env, uint32_t r
     unsigned int i;      unsigned int i;
     D(qemu_log("%s rn=%d=%x old=%x\n", __func__, rn, v, env->mmu.regs[rn]));      D(qemu_log("%s rn=%d=%x old=%x\n", __func__, rn, v, env->mmu.regs[rn]));
   
       if (env->mmu.c_mmu < 2 || !env->mmu.c_mmu_tlb_access) {
           qemu_log("MMU access on MMU-less system\n");
           return;
       }
   
     switch (rn) {      switch (rn) {
         /* Writes to HI/LO trig writes to the mmu rams.  */          /* Writes to HI/LO trig writes to the mmu rams.  */
         case MMU_R_TLBLO:          case MMU_R_TLBLO:
Line 219  void mmu_write(CPUState *env, uint32_t r Line 252  void mmu_write(CPUState *env, uint32_t r
             D(qemu_log("%s ram[%d][%d]=%x\n", __func__, rn & 1, i, v));              D(qemu_log("%s ram[%d][%d]=%x\n", __func__, rn & 1, i, v));
             break;              break;
         case MMU_R_ZPR:          case MMU_R_ZPR:
               if (env->mmu.c_mmu_tlb_access <= 1) {
                   qemu_log("Invalid access to MMU reg %d\n", rn);
                   return;
               }
   
             /* Changes to the zone protection reg flush the QEMU TLB.              /* Changes to the zone protection reg flush the QEMU TLB.
                Fortunately, these are very uncommon.  */                 Fortunately, these are very uncommon.  */
             if (v != env->mmu.regs[rn]) {              if (v != env->mmu.regs[rn]) {
Line 227  void mmu_write(CPUState *env, uint32_t r Line 265  void mmu_write(CPUState *env, uint32_t r
             env->mmu.regs[rn] = v;              env->mmu.regs[rn] = v;
             break;              break;
         case MMU_R_PID:          case MMU_R_PID:
               if (env->mmu.c_mmu_tlb_access <= 1) {
                   qemu_log("Invalid access to MMU reg %d\n", rn);
                   return;
               }
   
             if (v != env->mmu.regs[rn]) {              if (v != env->mmu.regs[rn]) {
                 mmu_change_pid(env, v);                  mmu_change_pid(env, v);
                 env->mmu.regs[rn] = v;                  env->mmu.regs[rn] = v;
Line 236  void mmu_write(CPUState *env, uint32_t r Line 279  void mmu_write(CPUState *env, uint32_t r
         {          {
             struct microblaze_mmu_lookup lu;              struct microblaze_mmu_lookup lu;
             int hit;              int hit;
   
               if (env->mmu.c_mmu_tlb_access <= 1) {
                   qemu_log("Invalid access to MMU reg %d\n", rn);
                   return;
               }
   
             hit = mmu_translate(&env->mmu, &lu,              hit = mmu_translate(&env->mmu, &lu,
                                 v & TLB_EPN_MASK, 0, cpu_mmu_index(env));                                  v & TLB_EPN_MASK, 0, cpu_mmu_index(env));
             if (hit) {              if (hit) {
Line 252  void mmu_write(CPUState *env, uint32_t r Line 301  void mmu_write(CPUState *env, uint32_t r
   
 void mmu_init(struct microblaze_mmu *mmu)  void mmu_init(struct microblaze_mmu *mmu)
 {  {
     memset(mmu, 0, sizeof *mmu);      int i;
       for (i = 0; i < ARRAY_SIZE(mmu->regs); i++) {
           mmu->regs[i] = 0;
       }
 }  }

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


unix.superglobalmegacorp.com