mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-03-24 10:35:12 +00:00
tcg: code_bitmap and code_write_count are not used by user-mode emulation
Backports commit 6fad459c91e8a1dedbb6681d3f57ede5222a225c from qemu
This commit is contained in:
parent
ffdc9d6323
commit
66faf3b5df
|
@ -74,11 +74,12 @@
|
||||||
typedef struct PageDesc {
|
typedef struct PageDesc {
|
||||||
/* list of TBs intersecting this ram page */
|
/* list of TBs intersecting this ram page */
|
||||||
TranslationBlock *first_tb;
|
TranslationBlock *first_tb;
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
/* in order to optimize self modifying code, we count the number
|
/* in order to optimize self modifying code, we count the number
|
||||||
of lookups we do to a given page to use a bitmap */
|
of lookups we do to a given page to use a bitmap */
|
||||||
unsigned int code_write_count;
|
unsigned int code_write_count;
|
||||||
uint8_t *code_bitmap;
|
uint8_t *code_bitmap;
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#else
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
#endif
|
#endif
|
||||||
} PageDesc;
|
} PageDesc;
|
||||||
|
@ -854,11 +855,11 @@ void tb_free(struct uc_struct *uc, TranslationBlock *tb)
|
||||||
|
|
||||||
static inline void invalidate_page_bitmap(PageDesc *p)
|
static inline void invalidate_page_bitmap(PageDesc *p)
|
||||||
{
|
{
|
||||||
if (p->code_bitmap) {
|
#ifdef CONFIG_SOFTMMU
|
||||||
g_free(p->code_bitmap);
|
g_free(p->code_bitmap);
|
||||||
p->code_bitmap = NULL;
|
p->code_bitmap = NULL;
|
||||||
}
|
|
||||||
p->code_write_count = 0;
|
p->code_write_count = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set to NULL all the 'first_tb' fields in all PageDescs. */
|
/* Set to NULL all the 'first_tb' fields in all PageDescs. */
|
||||||
|
@ -1133,6 +1134,7 @@ static inline void set_bits(uint8_t *tab, int start, int len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
static void build_page_bitmap(PageDesc *p)
|
static void build_page_bitmap(PageDesc *p)
|
||||||
{
|
{
|
||||||
int n, tb_start, tb_end;
|
int n, tb_start, tb_end;
|
||||||
|
@ -1161,6 +1163,7 @@ static void build_page_bitmap(PageDesc *p)
|
||||||
tb = tb->page_next[n];
|
tb = tb->page_next[n];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* add the tb in the target page and protect it if necessary */
|
/* add the tb in the target page and protect it if necessary */
|
||||||
static inline void tb_alloc_page(struct uc_struct *uc, TranslationBlock *tb,
|
static inline void tb_alloc_page(struct uc_struct *uc, TranslationBlock *tb,
|
||||||
|
@ -1523,7 +1526,45 @@ void tb_invalidate_phys_page_range(struct uc_struct *uc, tb_page_addr_t start, t
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_SOFTMMU)
|
#ifdef CONFIG_SOFTMMU
|
||||||
|
/* len must be <= 8 and start must be a multiple of len */
|
||||||
|
void tb_invalidate_phys_page_fast(struct uc_struct* uc, tb_page_addr_t start, int len)
|
||||||
|
{
|
||||||
|
PageDesc *p;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (1) {
|
||||||
|
qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
|
||||||
|
cpu_single_env->mem_io_vaddr, len,
|
||||||
|
cpu_single_env->eip,
|
||||||
|
cpu_single_env->eip +
|
||||||
|
(intptr_t)cpu_single_env->segs[R_CS].base);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
p = page_find(uc, start >> TARGET_PAGE_BITS);
|
||||||
|
if (!p) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!p->code_bitmap &&
|
||||||
|
++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD) {
|
||||||
|
/* build code bitmap */
|
||||||
|
build_page_bitmap(p);
|
||||||
|
}
|
||||||
|
if (p->code_bitmap) {
|
||||||
|
unsigned int nr;
|
||||||
|
unsigned long b;
|
||||||
|
|
||||||
|
nr = start & ~TARGET_PAGE_MASK;
|
||||||
|
b = p->code_bitmap[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG - 1));
|
||||||
|
if (b & ((1 << len) - 1)) {
|
||||||
|
goto do_invalidate;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_invalidate:
|
||||||
|
tb_invalidate_phys_page_range(uc, start, start + len, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
static void tb_invalidate_phys_page(struct uc_struct *uc, tb_page_addr_t addr,
|
static void tb_invalidate_phys_page(struct uc_struct *uc, tb_page_addr_t addr,
|
||||||
uintptr_t pc, void *puc,
|
uintptr_t pc, void *puc,
|
||||||
bool locked)
|
bool locked)
|
||||||
|
@ -1593,43 +1634,6 @@ static void tb_invalidate_phys_page(struct uc_struct *uc, tb_page_addr_t addr,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void tb_invalidate_phys_page_fast(struct uc_struct* uc, tb_page_addr_t start, int len)
|
|
||||||
{
|
|
||||||
PageDesc *p;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (1) {
|
|
||||||
qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
|
|
||||||
cpu_single_env->mem_io_vaddr, len,
|
|
||||||
cpu_single_env->eip,
|
|
||||||
cpu_single_env->eip +
|
|
||||||
(intptr_t)cpu_single_env->segs[R_CS].base);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
p = page_find(uc, start >> TARGET_PAGE_BITS);
|
|
||||||
if (!p) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!p->code_bitmap &&
|
|
||||||
++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD) {
|
|
||||||
/* build code bitmap */
|
|
||||||
build_page_bitmap(p);
|
|
||||||
}
|
|
||||||
if (p->code_bitmap) {
|
|
||||||
unsigned int nr;
|
|
||||||
unsigned long b;
|
|
||||||
|
|
||||||
nr = start & ~TARGET_PAGE_MASK;
|
|
||||||
b = p->code_bitmap[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG - 1));
|
|
||||||
if (b & ((1 << len) - 1)) {
|
|
||||||
goto do_invalidate;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
do_invalidate:
|
|
||||||
tb_invalidate_phys_page_range(uc, start, start + len, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
|
/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
|
||||||
tb[1].tc_ptr. Return NULL if not found */
|
tb[1].tc_ptr. Return NULL if not found */
|
||||||
static TranslationBlock *tb_find_pc(struct uc_struct *uc, uintptr_t tc_ptr)
|
static TranslationBlock *tb_find_pc(struct uc_struct *uc, uintptr_t tc_ptr)
|
||||||
|
|
Loading…
Reference in a new issue