Patchwork monitor: Show combined protection bits in "info mem"

login
register
mail settings
Submitter Austin Clements
Date Aug. 15, 2011, 3:22 a.m.
Message ID <1313378548-15742-1-git-send-email-amdragon@mit.edu>
Download mbox | patch
Permalink /patch/109978/
State New
Headers show

Comments

Austin Clements - Aug. 15, 2011, 3:22 a.m.
Previously, "info mem" considered and displayed only the last-level
protection bits for a memory range, which doesn't accurrately
represent the protection of that range.  Now it shows the combined
protection.

Signed-off-by: Austin Clements <amdragon@mit.edu>
---
 monitor.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)
Blue Swirl - Aug. 21, 2011, 6:27 p.m.
Thanks, applied.

On Mon, Aug 15, 2011 at 3:22 AM, Austin Clements <amdragon@mit.edu> wrote:
> Previously, "info mem" considered and displayed only the last-level
> protection bits for a memory range, which doesn't accurrately
> represent the protection of that range.  Now it shows the combined
> protection.
>
> Signed-off-by: Austin Clements <amdragon@mit.edu>
> ---
>  monitor.c |   10 +++++++---
>  1 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/monitor.c b/monitor.c
> index f8ba0ef..cd4e749 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -2246,7 +2246,8 @@ static void mem_info_32(Monitor *mon, CPUState *env)
>                     pte = le32_to_cpu(pte);
>                     end = (l1 << 22) + (l2 << 12);
>                     if (pte & PG_PRESENT_MASK) {
> -                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
> +                        prot = pte & pde &
> +                            (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
>                     } else {
>                         prot = 0;
>                     }
> @@ -2295,8 +2296,8 @@ static void mem_info_pae32(Monitor *mon, CPUState *env)
>                             pte = le64_to_cpu(pte);
>                             end = (l1 << 30) + (l2 << 21) + (l3 << 12);
>                             if (pte & PG_PRESENT_MASK) {
> -                                prot = pte & (PG_USER_MASK | PG_RW_MASK |
> -                                              PG_PRESENT_MASK);
> +                                prot = pte & pde & (PG_USER_MASK | PG_RW_MASK |
> +                                                    PG_PRESENT_MASK);
>                             } else {
>                                 prot = 0;
>                             }
> @@ -2343,6 +2344,7 @@ static void mem_info_64(Monitor *mon, CPUState *env)
>                     if (pdpe & PG_PSE_MASK) {
>                         prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
>                                        PG_PRESENT_MASK);
> +                        prot &= pml4e;
>                         mem_print(mon, &start, &last_prot, end, prot);
>                     } else {
>                         pd_addr = pdpe & 0x3fffffffff000ULL;
> @@ -2354,6 +2356,7 @@ static void mem_info_64(Monitor *mon, CPUState *env)
>                                 if (pde & PG_PSE_MASK) {
>                                     prot = pde & (PG_USER_MASK | PG_RW_MASK |
>                                                   PG_PRESENT_MASK);
> +                                    prot &= pml4e & pdpe;
>                                     mem_print(mon, &start, &last_prot, end, prot);
>                                 } else {
>                                     pt_addr = pde & 0x3fffffffff000ULL;
> @@ -2367,6 +2370,7 @@ static void mem_info_64(Monitor *mon, CPUState *env)
>                                         if (pte & PG_PRESENT_MASK) {
>                                             prot = pte & (PG_USER_MASK | PG_RW_MASK |
>                                                           PG_PRESENT_MASK);
> +                                            prot &= pml4e & pdpe & pde;
>                                         } else {
>                                             prot = 0;
>                                         }
> --
> 1.7.5.4
>
>
>

Patch

diff --git a/monitor.c b/monitor.c
index f8ba0ef..cd4e749 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2246,7 +2246,8 @@  static void mem_info_32(Monitor *mon, CPUState *env)
                     pte = le32_to_cpu(pte);
                     end = (l1 << 22) + (l2 << 12);
                     if (pte & PG_PRESENT_MASK) {
-                        prot = pte & (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
+                        prot = pte & pde &
+                            (PG_USER_MASK | PG_RW_MASK | PG_PRESENT_MASK);
                     } else {
                         prot = 0;
                     }
@@ -2295,8 +2296,8 @@  static void mem_info_pae32(Monitor *mon, CPUState *env)
                             pte = le64_to_cpu(pte);
                             end = (l1 << 30) + (l2 << 21) + (l3 << 12);
                             if (pte & PG_PRESENT_MASK) {
-                                prot = pte & (PG_USER_MASK | PG_RW_MASK |
-                                              PG_PRESENT_MASK);
+                                prot = pte & pde & (PG_USER_MASK | PG_RW_MASK |
+                                                    PG_PRESENT_MASK);
                             } else {
                                 prot = 0;
                             }
@@ -2343,6 +2344,7 @@  static void mem_info_64(Monitor *mon, CPUState *env)
                     if (pdpe & PG_PSE_MASK) {
                         prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
                                        PG_PRESENT_MASK);
+                        prot &= pml4e;
                         mem_print(mon, &start, &last_prot, end, prot);
                     } else {
                         pd_addr = pdpe & 0x3fffffffff000ULL;
@@ -2354,6 +2356,7 @@  static void mem_info_64(Monitor *mon, CPUState *env)
                                 if (pde & PG_PSE_MASK) {
                                     prot = pde & (PG_USER_MASK | PG_RW_MASK |
                                                   PG_PRESENT_MASK);
+                                    prot &= pml4e & pdpe;
                                     mem_print(mon, &start, &last_prot, end, prot);
                                 } else {
                                     pt_addr = pde & 0x3fffffffff000ULL;
@@ -2367,6 +2370,7 @@  static void mem_info_64(Monitor *mon, CPUState *env)
                                         if (pte & PG_PRESENT_MASK) {
                                             prot = pte & (PG_USER_MASK | PG_RW_MASK |
                                                           PG_PRESENT_MASK);
+                                            prot &= pml4e & pdpe & pde;
                                         } else {
                                             prot = 0;
                                         }