qemu-devel
[Top][All Lists]
Advanced

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

Re: [EXT] Re: [PATCH v2] target/riscv: Fix incorrect PTE merge in walk_p


From: Ralf Ramsauer
Subject: Re: [EXT] Re: [PATCH v2] target/riscv: Fix incorrect PTE merge in walk_pte
Date: Fri, 22 Apr 2022 13:37:11 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1



On 22/04/2022 04:54, Bin Meng wrote:
On Fri, Apr 22, 2022 at 10:53 AM Bin Meng <bmeng.cn@gmail.com> wrote:

On Tue, Apr 5, 2022 at 1:34 AM Ralf Ramsauer
<ralf.ramsauer@oth-regensburg.de> wrote:

Two non-subsequent PTEs can be mapped to subsequent paddrs. In this
case, walk_pte will erroneously merge them.

Enforce the split up, by tracking the virtual base address.

Let's say we have the mapping:
0x81200000 -> 0x89623000 (4K)
0x8120f000 -> 0x89624000 (4K)

Before, walk_pte would have shown:

vaddr            paddr            size             attr
---------------- ---------------- ---------------- -------
0000000081200000 0000000089623000 0000000000002000 rwxu-ad

as it only checks for subsequent paddrs. With this patch, it becomes:

vaddr            paddr            size             attr
---------------- ---------------- ---------------- -------
0000000081200000 0000000089623000 0000000000001000 rwxu-ad
000000008120f000 0000000089624000 0000000000001000 rwxu-ad

Signed-off-by: Ralf Ramsauer <ralf.ramsauer@oth-regensburg.de>
---
  target/riscv/monitor.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/target/riscv/monitor.c b/target/riscv/monitor.c
index 7efb4b62c1..9dc4cb1156 100644
--- a/target/riscv/monitor.c
+++ b/target/riscv/monitor.c
@@ -84,6 +84,7 @@ static void walk_pte(Monitor *mon, hwaddr base, target_ulong 
start,
  {
      hwaddr pte_addr;
      hwaddr paddr;
+    target_ulong last_start = -1;
      target_ulong pgsize;
      target_ulong pte;
      int ptshift;
@@ -116,7 +117,8 @@ static void walk_pte(Monitor *mon, hwaddr base, 
target_ulong start,
                   * contiguous mapped block details.
                   */

Please also update the comments above to mention the new case you added here.

Shall I provide a v3? No problem, if that makes your life easier. Otherwise, you could also squash attached comment on integration.

Thanks
  Ralf

diff --git a/target/riscv/monitor.c b/target/riscv/monitor.c
index 02512ed48f..1cb0932e03 100644
--- a/target/riscv/monitor.c
+++ b/target/riscv/monitor.c
@@ -143,9 +143,9 @@ static void walk_pte(Monitor *mon, hwaddr base, target_ulong start,
                  * A leaf PTE has been found
                  *
* If current PTE's permission bits differ from the last one,
-                 * or current PTE's ppn does not make a contiguous physical
- * address block together with the last one, print out the last
-                 * contiguous mapped block details.
+                * or the current PTE breaks up a contiguous virtual or
+ * physical mapping, address block together with the last one,
+                * print out the last contiguous mapped block details.
                  */
                 if ((*last_attr != attr) ||
                     (*last_paddr + *last_size != paddr) ||



reply via email to

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