qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] target-mips: apply CP0.PageMask before writing


From: Philippe Mathieu-Daudé
Subject: Re: [Qemu-devel] [PATCH] target-mips: apply CP0.PageMask before writing into TLB entry
Date: Wed, 2 Aug 2017 15:56:59 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1

Hi Leon,

On 08/02/2017 10:58 AM, Yongbok Kim wrote:
From: Leon Alrae <address@hidden>

PFN0 and PFN1 have to be masked out with PageMask_Mask.

Signed-off-by: Leon Alrae <address@hidden>
Reviewed-by: Yongbok Kim <address@hidden>
[Yongbok Kim:
   Added commit message]
Signed-off-by: Yongbok Kim <address@hidden>
---
  target/mips/op_helper.c | 5 +++--
  1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/target/mips/op_helper.c b/target/mips/op_helper.c
index 526f8e4..320f2b0 100644
--- a/target/mips/op_helper.c
+++ b/target/mips/op_helper.c
@@ -2008,6 +2008,7 @@ static inline uint64_t get_tlb_pfn_from_entrylo(uint64_t 
entrylo)
  static void r4k_fill_tlb(CPUMIPSState *env, int idx)
  {
      r4k_tlb_t *tlb;
+    uint64_t mask = env->CP0_PageMask >> (TARGET_PAGE_BITS + 1);
/* XXX: detect conflicting TLBs and raise a MCHECK exception when needed */
      tlb = &env->tlb->mmu.r4k.tlb[idx];
@@ -2028,13 +2029,13 @@ static void r4k_fill_tlb(CPUMIPSState *env, int idx)
      tlb->C0 = (env->CP0_EntryLo0 >> 3) & 0x7;
      tlb->XI0 = (env->CP0_EntryLo0 >> CP0EnLo_XI) & 1;
      tlb->RI0 = (env->CP0_EntryLo0 >> CP0EnLo_RI) & 1;
-    tlb->PFN[0] = get_tlb_pfn_from_entrylo(env->CP0_EntryLo0) << 12;
+    tlb->PFN[0] = (get_tlb_pfn_from_entrylo(env->CP0_EntryLo0) & ~mask) << 12;
      tlb->V1 = (env->CP0_EntryLo1 & 2) != 0;
      tlb->D1 = (env->CP0_EntryLo1 & 4) != 0;
      tlb->C1 = (env->CP0_EntryLo1 >> 3) & 0x7;
      tlb->XI1 = (env->CP0_EntryLo1 >> CP0EnLo_XI) & 1;
      tlb->RI1 = (env->CP0_EntryLo1 >> CP0EnLo_RI) & 1;
-    tlb->PFN[1] = get_tlb_pfn_from_entrylo(env->CP0_EntryLo1) << 12;
+    tlb->PFN[1] = (get_tlb_pfn_from_entrylo(env->CP0_EntryLo1) & ~mask) << 12;
  }
void r4k_helper_tlbinv(CPUMIPSState *env)


What about refactoring get_tlb_pfn_from_entrylo(uint64_t entrylo) -> r4k_get_tlb_pfn_from_entrylo(uint64_t entrylo, uint64_t pagemask) to directly masked pfn?

Regards,

Phil.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]