mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-20 00:22:02 -06:00
accel/tcg: Remove qemu_host_page_size from page_protect/page_unprotect
Use qemu_real_host_page_size instead. Except for the final mprotect within page_protect, we already handled host < target page size. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com> Acked-by: Helge Deller <deller@gmx.de> Message-Id: <20240102015808.132373-2-richard.henderson@linaro.org>
This commit is contained in:
parent
6aba908d2b
commit
a372d483f1
1 changed files with 10 additions and 8 deletions
|
@ -651,16 +651,17 @@ void page_protect(tb_page_addr_t address)
|
||||||
{
|
{
|
||||||
PageFlagsNode *p;
|
PageFlagsNode *p;
|
||||||
target_ulong start, last;
|
target_ulong start, last;
|
||||||
|
int host_page_size = qemu_real_host_page_size();
|
||||||
int prot;
|
int prot;
|
||||||
|
|
||||||
assert_memory_lock();
|
assert_memory_lock();
|
||||||
|
|
||||||
if (qemu_host_page_size <= TARGET_PAGE_SIZE) {
|
if (host_page_size <= TARGET_PAGE_SIZE) {
|
||||||
start = address & TARGET_PAGE_MASK;
|
start = address & TARGET_PAGE_MASK;
|
||||||
last = start + TARGET_PAGE_SIZE - 1;
|
last = start + TARGET_PAGE_SIZE - 1;
|
||||||
} else {
|
} else {
|
||||||
start = address & qemu_host_page_mask;
|
start = address & -host_page_size;
|
||||||
last = start + qemu_host_page_size - 1;
|
last = start + host_page_size - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = pageflags_find(start, last);
|
p = pageflags_find(start, last);
|
||||||
|
@ -671,7 +672,7 @@ void page_protect(tb_page_addr_t address)
|
||||||
|
|
||||||
if (unlikely(p->itree.last < last)) {
|
if (unlikely(p->itree.last < last)) {
|
||||||
/* More than one protection region covers the one host page. */
|
/* More than one protection region covers the one host page. */
|
||||||
assert(TARGET_PAGE_SIZE < qemu_host_page_size);
|
assert(TARGET_PAGE_SIZE < host_page_size);
|
||||||
while ((p = pageflags_next(p, start, last)) != NULL) {
|
while ((p = pageflags_next(p, start, last)) != NULL) {
|
||||||
prot |= p->flags;
|
prot |= p->flags;
|
||||||
}
|
}
|
||||||
|
@ -679,7 +680,7 @@ void page_protect(tb_page_addr_t address)
|
||||||
|
|
||||||
if (prot & PAGE_WRITE) {
|
if (prot & PAGE_WRITE) {
|
||||||
pageflags_set_clear(start, last, 0, PAGE_WRITE);
|
pageflags_set_clear(start, last, 0, PAGE_WRITE);
|
||||||
mprotect(g2h_untagged(start), qemu_host_page_size,
|
mprotect(g2h_untagged(start), last - start + 1,
|
||||||
prot & (PAGE_READ | PAGE_EXEC) ? PROT_READ : PROT_NONE);
|
prot & (PAGE_READ | PAGE_EXEC) ? PROT_READ : PROT_NONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -725,18 +726,19 @@ int page_unprotect(target_ulong address, uintptr_t pc)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
int host_page_size = qemu_real_host_page_size();
|
||||||
target_ulong start, len, i;
|
target_ulong start, len, i;
|
||||||
int prot;
|
int prot;
|
||||||
|
|
||||||
if (qemu_host_page_size <= TARGET_PAGE_SIZE) {
|
if (host_page_size <= TARGET_PAGE_SIZE) {
|
||||||
start = address & TARGET_PAGE_MASK;
|
start = address & TARGET_PAGE_MASK;
|
||||||
len = TARGET_PAGE_SIZE;
|
len = TARGET_PAGE_SIZE;
|
||||||
prot = p->flags | PAGE_WRITE;
|
prot = p->flags | PAGE_WRITE;
|
||||||
pageflags_set_clear(start, start + len - 1, PAGE_WRITE, 0);
|
pageflags_set_clear(start, start + len - 1, PAGE_WRITE, 0);
|
||||||
current_tb_invalidated = tb_invalidate_phys_page_unwind(start, pc);
|
current_tb_invalidated = tb_invalidate_phys_page_unwind(start, pc);
|
||||||
} else {
|
} else {
|
||||||
start = address & qemu_host_page_mask;
|
start = address & -host_page_size;
|
||||||
len = qemu_host_page_size;
|
len = host_page_size;
|
||||||
prot = 0;
|
prot = 0;
|
||||||
|
|
||||||
for (i = 0; i < len; i += TARGET_PAGE_SIZE) {
|
for (i = 0; i < len; i += TARGET_PAGE_SIZE) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue