monitor: Show combined protection bits in "info mem"
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> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
8a94b8ca53
commit
c76c8416be
10
monitor.c
10
monitor.c
@ -2248,7 +2248,8 @@ static void mem_info_32(Monitor *mon, CPUState *env)
|
|||||||
pte = le32_to_cpu(pte);
|
pte = le32_to_cpu(pte);
|
||||||
end = (l1 << 22) + (l2 << 12);
|
end = (l1 << 22) + (l2 << 12);
|
||||||
if (pte & PG_PRESENT_MASK) {
|
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 {
|
} else {
|
||||||
prot = 0;
|
prot = 0;
|
||||||
}
|
}
|
||||||
@ -2297,8 +2298,8 @@ static void mem_info_pae32(Monitor *mon, CPUState *env)
|
|||||||
pte = le64_to_cpu(pte);
|
pte = le64_to_cpu(pte);
|
||||||
end = (l1 << 30) + (l2 << 21) + (l3 << 12);
|
end = (l1 << 30) + (l2 << 21) + (l3 << 12);
|
||||||
if (pte & PG_PRESENT_MASK) {
|
if (pte & PG_PRESENT_MASK) {
|
||||||
prot = pte & (PG_USER_MASK | PG_RW_MASK |
|
prot = pte & pde & (PG_USER_MASK | PG_RW_MASK |
|
||||||
PG_PRESENT_MASK);
|
PG_PRESENT_MASK);
|
||||||
} else {
|
} else {
|
||||||
prot = 0;
|
prot = 0;
|
||||||
}
|
}
|
||||||
@ -2345,6 +2346,7 @@ static void mem_info_64(Monitor *mon, CPUState *env)
|
|||||||
if (pdpe & PG_PSE_MASK) {
|
if (pdpe & PG_PSE_MASK) {
|
||||||
prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
|
prot = pdpe & (PG_USER_MASK | PG_RW_MASK |
|
||||||
PG_PRESENT_MASK);
|
PG_PRESENT_MASK);
|
||||||
|
prot &= pml4e;
|
||||||
mem_print(mon, &start, &last_prot, end, prot);
|
mem_print(mon, &start, &last_prot, end, prot);
|
||||||
} else {
|
} else {
|
||||||
pd_addr = pdpe & 0x3fffffffff000ULL;
|
pd_addr = pdpe & 0x3fffffffff000ULL;
|
||||||
@ -2356,6 +2358,7 @@ static void mem_info_64(Monitor *mon, CPUState *env)
|
|||||||
if (pde & PG_PSE_MASK) {
|
if (pde & PG_PSE_MASK) {
|
||||||
prot = pde & (PG_USER_MASK | PG_RW_MASK |
|
prot = pde & (PG_USER_MASK | PG_RW_MASK |
|
||||||
PG_PRESENT_MASK);
|
PG_PRESENT_MASK);
|
||||||
|
prot &= pml4e & pdpe;
|
||||||
mem_print(mon, &start, &last_prot, end, prot);
|
mem_print(mon, &start, &last_prot, end, prot);
|
||||||
} else {
|
} else {
|
||||||
pt_addr = pde & 0x3fffffffff000ULL;
|
pt_addr = pde & 0x3fffffffff000ULL;
|
||||||
@ -2369,6 +2372,7 @@ static void mem_info_64(Monitor *mon, CPUState *env)
|
|||||||
if (pte & PG_PRESENT_MASK) {
|
if (pte & PG_PRESENT_MASK) {
|
||||||
prot = pte & (PG_USER_MASK | PG_RW_MASK |
|
prot = pte & (PG_USER_MASK | PG_RW_MASK |
|
||||||
PG_PRESENT_MASK);
|
PG_PRESENT_MASK);
|
||||||
|
prot &= pml4e & pdpe & pde;
|
||||||
} else {
|
} else {
|
||||||
prot = 0;
|
prot = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user