qemu-riscv
[Top][All Lists]
Advanced

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

Re: [PATCH V2] target/riscv: Bugfix reserved bits in PTE for RV64


From: Guo Ren
Subject: Re: [PATCH V2] target/riscv: Bugfix reserved bits in PTE for RV64
Date: Wed, 25 Sep 2019 08:13:17 +0800

> 在 2019年9月25日,上午7:33,Alistair Francis <address@hidden> 写道:
> 
> On Tue, Sep 24, 2019 at 12:58 AM <address@hidden> wrote:
>> 
>> From: Guo Ren <address@hidden>
>> 
>> Highest 10 bits of PTE are reserved in riscv-privileged, ref: [1], so we
>> need to ignore them. They can not be a part of ppn.
>> 
>> 1: The RISC-V Instruction Set Manual, Volume II: Privileged Architecture
>>   4.4 Sv39: Page-Based 39-bit Virtual-Memory System
>>   4.5 Sv48: Page-Based 48-bit Virtual-Memory System
> 
> Thanks for the patch!
> 
> The spec says "must be zeroed by software for forward compatibility"
> so I don't think it's correct for QEMU to zero out the bits.
QEMU don’t zero out the bits, QEMU just ignore the bits for ppn.

> 
> Does this fix a bug you are seeing?
Yes, because we try to reuse these bits as attributes.

> 
>> 
>> Changelog V2:
>> - Bugfix pte destroyed cause boot fail
>> - Change to AND with a mask instead of shifting both directions
> 
> The changelog shouldn't be in the commit, it should be kept under the
> line line below.
I just prefer to save them in commit.

> 
>> 
>> Signed-off-by: Guo Ren <address@hidden>
>> Reviewed-by: Liu Zhiwei <address@hidden>
>> ---
> 
> The change log should go here.
OK, but git am we’ll lose them.

> 
>> target/riscv/cpu_bits.h   | 3 +++
>> target/riscv/cpu_helper.c | 3 ++-
>> 2 files changed, 5 insertions(+), 1 deletion(-)
>> 
>> diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
>> index e998348..ae8aa0f 100644
>> --- a/target/riscv/cpu_bits.h
>> +++ b/target/riscv/cpu_bits.h
>> @@ -470,6 +470,9 @@
>> #define PTE_D               0x080 /* Dirty */
>> #define PTE_SOFT            0x300 /* Reserved for Software */
>> 
>> +/* Reserved highest 10 bits in PTE */
>> +#define PTE_RESERVED        ((target_ulong)0x3ff << 54)
> 
> I think it's just easier to define this as 0xFFC0000000000000ULL and
> remove the cast.
OK follow your rule, but I still prefer prior.

> 
>> +
>> /* Page table PPN shift amount */
>> #define PTE_PPN_SHIFT       10
>> 
>> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
>> index 87dd6a6..7a540cc 100644
>> --- a/target/riscv/cpu_helper.c
>> +++ b/target/riscv/cpu_helper.c
>> @@ -258,10 +258,11 @@ restart:
>>         }
>> #if defined(TARGET_RISCV32)
>>         target_ulong pte = ldl_phys(cs->as, pte_addr);
>> +        hwaddr ppn = pte >> PTE_PPN_SHIFT;
>> #elif defined(TARGET_RISCV64)
>>         target_ulong pte = ldq_phys(cs->as, pte_addr);
>> +        hwaddr ppn = (pte & ~PTE_RESERVED) >> PTE_PPN_SHIFT;
>> #endif
>> -        hwaddr ppn = pte >> PTE_PPN_SHIFT;
> 
> You don't have to move this shift
En… Do you want this: ?

#if defined(TARGET_RISCV32)
        target_ulong pte = ldl_phys(cs->as, pte_addr);
+      hwaddr ppn = pte;
#elif defined(TARGET_RISCV64)
         target_ulong pte = ldq_phys(cs->as, pte_addr);
+       hwaddr ppn = (pte & ~PTE_RESERVED);
#endif
+        ppn = ppn >> PTE_PPN_SHIFT;

The pte couldn’t be destroyed, just ppn ignore the RESERVED bits.





reply via email to

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