mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
accel/tcg: Use vaddr in user/page-protection.h
Reviewed-by: Anton Johansson <anjo@rev.ng> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
e1c8eb8cfe
commit
5627d5c00a
2 changed files with 31 additions and 37 deletions
|
@ -161,7 +161,7 @@ typedef struct PageFlagsNode {
|
|||
|
||||
static IntervalTreeRoot pageflags_root;
|
||||
|
||||
static PageFlagsNode *pageflags_find(target_ulong start, target_ulong last)
|
||||
static PageFlagsNode *pageflags_find(vaddr start, vaddr last)
|
||||
{
|
||||
IntervalTreeNode *n;
|
||||
|
||||
|
@ -169,8 +169,7 @@ static PageFlagsNode *pageflags_find(target_ulong start, target_ulong last)
|
|||
return n ? container_of(n, PageFlagsNode, itree) : NULL;
|
||||
}
|
||||
|
||||
static PageFlagsNode *pageflags_next(PageFlagsNode *p, target_ulong start,
|
||||
target_ulong last)
|
||||
static PageFlagsNode *pageflags_next(PageFlagsNode *p, vaddr start, vaddr last)
|
||||
{
|
||||
IntervalTreeNode *n;
|
||||
|
||||
|
@ -215,14 +214,14 @@ static int dump_region(void *opaque, vaddr start, vaddr end, int prot)
|
|||
/* dump memory mappings */
|
||||
void page_dump(FILE *f)
|
||||
{
|
||||
const int length = sizeof(target_ulong) * 2;
|
||||
const int length = sizeof(abi_ptr) * 2;
|
||||
|
||||
fprintf(f, "%-*s %-*s %-*s %s\n",
|
||||
length, "start", length, "end", length, "size", "prot");
|
||||
walk_memory_regions(f, dump_region);
|
||||
}
|
||||
|
||||
int page_get_flags(target_ulong address)
|
||||
int page_get_flags(vaddr address)
|
||||
{
|
||||
PageFlagsNode *p = pageflags_find(address, address);
|
||||
|
||||
|
@ -245,7 +244,7 @@ int page_get_flags(target_ulong address)
|
|||
}
|
||||
|
||||
/* A subroutine of page_set_flags: insert a new node for [start,last]. */
|
||||
static void pageflags_create(target_ulong start, target_ulong last, int flags)
|
||||
static void pageflags_create(vaddr start, vaddr last, int flags)
|
||||
{
|
||||
PageFlagsNode *p = g_new(PageFlagsNode, 1);
|
||||
|
||||
|
@ -256,13 +255,13 @@ static void pageflags_create(target_ulong start, target_ulong last, int flags)
|
|||
}
|
||||
|
||||
/* A subroutine of page_set_flags: remove everything in [start,last]. */
|
||||
static bool pageflags_unset(target_ulong start, target_ulong last)
|
||||
static bool pageflags_unset(vaddr start, vaddr last)
|
||||
{
|
||||
bool inval_tb = false;
|
||||
|
||||
while (true) {
|
||||
PageFlagsNode *p = pageflags_find(start, last);
|
||||
target_ulong p_last;
|
||||
vaddr p_last;
|
||||
|
||||
if (!p) {
|
||||
break;
|
||||
|
@ -301,8 +300,7 @@ static bool pageflags_unset(target_ulong start, target_ulong last)
|
|||
* A subroutine of page_set_flags: nothing overlaps [start,last],
|
||||
* but check adjacent mappings and maybe merge into a single range.
|
||||
*/
|
||||
static void pageflags_create_merge(target_ulong start, target_ulong last,
|
||||
int flags)
|
||||
static void pageflags_create_merge(vaddr start, vaddr last, int flags)
|
||||
{
|
||||
PageFlagsNode *next = NULL, *prev = NULL;
|
||||
|
||||
|
@ -353,11 +351,11 @@ static void pageflags_create_merge(target_ulong start, target_ulong last,
|
|||
#define PAGE_STICKY (PAGE_ANON | PAGE_PASSTHROUGH | PAGE_TARGET_STICKY)
|
||||
|
||||
/* A subroutine of page_set_flags: add flags to [start,last]. */
|
||||
static bool pageflags_set_clear(target_ulong start, target_ulong last,
|
||||
static bool pageflags_set_clear(vaddr start, vaddr last,
|
||||
int set_flags, int clear_flags)
|
||||
{
|
||||
PageFlagsNode *p;
|
||||
target_ulong p_start, p_last;
|
||||
vaddr p_start, p_last;
|
||||
int p_flags, merge_flags;
|
||||
bool inval_tb = false;
|
||||
|
||||
|
@ -492,7 +490,7 @@ static bool pageflags_set_clear(target_ulong start, target_ulong last,
|
|||
return inval_tb;
|
||||
}
|
||||
|
||||
void page_set_flags(target_ulong start, target_ulong last, int flags)
|
||||
void page_set_flags(vaddr start, vaddr last, int flags)
|
||||
{
|
||||
bool reset = false;
|
||||
bool inval_tb = false;
|
||||
|
@ -532,9 +530,9 @@ void page_set_flags(target_ulong start, target_ulong last, int flags)
|
|||
}
|
||||
}
|
||||
|
||||
bool page_check_range(target_ulong start, target_ulong len, int flags)
|
||||
bool page_check_range(vaddr start, vaddr len, int flags)
|
||||
{
|
||||
target_ulong last;
|
||||
vaddr last;
|
||||
int locked; /* tri-state: =0: unlocked, +1: global, -1: local */
|
||||
bool ret;
|
||||
|
||||
|
@ -610,17 +608,16 @@ bool page_check_range(target_ulong start, target_ulong len, int flags)
|
|||
return ret;
|
||||
}
|
||||
|
||||
bool page_check_range_empty(target_ulong start, target_ulong last)
|
||||
bool page_check_range_empty(vaddr start, vaddr last)
|
||||
{
|
||||
assert(last >= start);
|
||||
assert_memory_lock();
|
||||
return pageflags_find(start, last) == NULL;
|
||||
}
|
||||
|
||||
target_ulong page_find_range_empty(target_ulong min, target_ulong max,
|
||||
target_ulong len, target_ulong align)
|
||||
vaddr page_find_range_empty(vaddr min, vaddr max, vaddr len, vaddr align)
|
||||
{
|
||||
target_ulong len_m1, align_m1;
|
||||
vaddr len_m1, align_m1;
|
||||
|
||||
assert(min <= max);
|
||||
assert(max <= GUEST_ADDR_MAX);
|
||||
|
@ -661,7 +658,7 @@ target_ulong page_find_range_empty(target_ulong min, target_ulong max,
|
|||
void tb_lock_page0(tb_page_addr_t address)
|
||||
{
|
||||
PageFlagsNode *p;
|
||||
target_ulong start, last;
|
||||
vaddr start, last;
|
||||
int host_page_size = qemu_real_host_page_size();
|
||||
int prot;
|
||||
|
||||
|
@ -740,7 +737,7 @@ int page_unprotect(CPUState *cpu, tb_page_addr_t address, uintptr_t pc)
|
|||
}
|
||||
} else {
|
||||
int host_page_size = qemu_real_host_page_size();
|
||||
target_ulong start, len, i;
|
||||
vaddr start, len, i;
|
||||
int prot;
|
||||
|
||||
if (host_page_size <= TARGET_PAGE_SIZE) {
|
||||
|
@ -756,7 +753,7 @@ int page_unprotect(CPUState *cpu, tb_page_addr_t address, uintptr_t pc)
|
|||
prot = 0;
|
||||
|
||||
for (i = 0; i < len; i += TARGET_PAGE_SIZE) {
|
||||
target_ulong addr = start + i;
|
||||
vaddr addr = start + i;
|
||||
|
||||
p = pageflags_find(addr, addr);
|
||||
if (p) {
|
||||
|
@ -883,7 +880,7 @@ typedef struct TargetPageDataNode {
|
|||
|
||||
static IntervalTreeRoot targetdata_root;
|
||||
|
||||
void page_reset_target_data(target_ulong start, target_ulong last)
|
||||
void page_reset_target_data(vaddr start, vaddr last)
|
||||
{
|
||||
IntervalTreeNode *n, *next;
|
||||
|
||||
|
@ -897,7 +894,7 @@ void page_reset_target_data(target_ulong start, target_ulong last)
|
|||
n != NULL;
|
||||
n = next,
|
||||
next = next ? interval_tree_iter_next(n, start, last) : NULL) {
|
||||
target_ulong n_start, n_last, p_ofs, p_len;
|
||||
vaddr n_start, n_last, p_ofs, p_len;
|
||||
TargetPageDataNode *t = container_of(n, TargetPageDataNode, itree);
|
||||
|
||||
if (n->start >= start && n->last <= last) {
|
||||
|
@ -921,11 +918,11 @@ void page_reset_target_data(target_ulong start, target_ulong last)
|
|||
}
|
||||
}
|
||||
|
||||
void *page_get_target_data(target_ulong address)
|
||||
void *page_get_target_data(vaddr address)
|
||||
{
|
||||
IntervalTreeNode *n;
|
||||
TargetPageDataNode *t;
|
||||
target_ulong page, region, p_ofs;
|
||||
vaddr page, region, p_ofs;
|
||||
|
||||
page = address & TARGET_PAGE_MASK;
|
||||
region = address & TBD_MASK;
|
||||
|
@ -956,7 +953,7 @@ void *page_get_target_data(target_ulong address)
|
|||
return t->data + p_ofs * TARGET_PAGE_DATA_SIZE;
|
||||
}
|
||||
#else
|
||||
void page_reset_target_data(target_ulong start, target_ulong last) { }
|
||||
void page_reset_target_data(vaddr start, vaddr last) { }
|
||||
#endif /* TARGET_PAGE_DATA_SIZE */
|
||||
|
||||
/* The system-mode versions of these helpers are in cputlb.c. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue