Message ID | 26ac4734d2079d5ec782adef3a5a40e82082b51f.1595335112.git.zong.li@sifive.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix some PMP implementation | expand |
On Tue, 21 Jul 2020 at 13:43, Zong Li <zong.li@sifive.com> wrote: > > The real physical address should add the 12 bits page offset. It also > causes the PMP wrong checking due to the minimum granularity of PMP is > 4 byte, but we always get the physical address which is 4KB alignment, > that means, we always use the start address of the page to check PMP for > all addresses which in the same page. > > Signed-off-by: Zong Li <zong.li@sifive.com> > --- > target/riscv/cpu_helper.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c > index 75d2ae3434..08b069f0c9 100644 > --- a/target/riscv/cpu_helper.c > +++ b/target/riscv/cpu_helper.c > @@ -543,7 +543,8 @@ restart: > /* for superpage mappings, make a fake leaf PTE for the TLB's > benefit. */ > target_ulong vpn = addr >> PGSHIFT; > - *physical = (ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT; > + *physical = ((ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT) | > + (addr & ~TARGET_PAGE_MASK); > > /* set permissions on the TLB entry */ > if ((pte & PTE_R) || ((pte & PTE_X) && mxr)) { > -- > 2.27.0 I made the same change for our CHERI fork a few months ago but forgot to send the patch upstream (despite marking the commit as a candidate for upstreaming). Sorry about the duplicated debugging work! (https://github.com/CTSRD-CHERI/qemu/commit/61c8e3f2c0fd4965ec3f316146d1751fae673c12)
On Wed, Jul 22, 2020 at 5:08 PM Alexander Richardson <Alexander.Richardson@cl.cam.ac.uk> wrote: > > On Tue, 21 Jul 2020 at 13:43, Zong Li <zong.li@sifive.com> wrote: > > > > The real physical address should add the 12 bits page offset. It also > > causes the PMP wrong checking due to the minimum granularity of PMP is > > 4 byte, but we always get the physical address which is 4KB alignment, > > that means, we always use the start address of the page to check PMP for > > all addresses which in the same page. > > > > Signed-off-by: Zong Li <zong.li@sifive.com> > > --- > > target/riscv/cpu_helper.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c > > index 75d2ae3434..08b069f0c9 100644 > > --- a/target/riscv/cpu_helper.c > > +++ b/target/riscv/cpu_helper.c > > @@ -543,7 +543,8 @@ restart: > > /* for superpage mappings, make a fake leaf PTE for the TLB's > > benefit. */ > > target_ulong vpn = addr >> PGSHIFT; > > - *physical = (ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT; > > + *physical = ((ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT) | > > + (addr & ~TARGET_PAGE_MASK); > > > > /* set permissions on the TLB entry */ > > if ((pte & PTE_R) || ((pte & PTE_X) && mxr)) { > > -- > > 2.27.0 > > I made the same change for our CHERI fork a few months ago but forgot > to send the patch upstream (despite marking the commit as a candidate > for upstreaming). Sorry about the duplicated debugging work! > (https://github.com/CTSRD-CHERI/qemu/commit/61c8e3f2c0fd4965ec3f316146d1751fae673c12) No, problem.
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 75d2ae3434..08b069f0c9 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -543,7 +543,8 @@ restart: /* for superpage mappings, make a fake leaf PTE for the TLB's benefit. */ target_ulong vpn = addr >> PGSHIFT; - *physical = (ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT; + *physical = ((ppn | (vpn & ((1L << ptshift) - 1))) << PGSHIFT) | + (addr & ~TARGET_PAGE_MASK); /* set permissions on the TLB entry */ if ((pte & PTE_R) || ((pte & PTE_X) && mxr)) {
The real physical address should add the 12 bits page offset. It also causes the PMP wrong checking due to the minimum granularity of PMP is 4 byte, but we always get the physical address which is 4KB alignment, that means, we always use the start address of the page to check PMP for all addresses which in the same page. Signed-off-by: Zong Li <zong.li@sifive.com> --- target/riscv/cpu_helper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)