2021-01-21 09:15:06 +03:00
|
|
|
/*
|
|
|
|
* Internal execution defines for qemu
|
|
|
|
*
|
|
|
|
* Copyright (c) 2003 Fabrice Bellard
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef ACCEL_TCG_INTERNAL_H
|
|
|
|
#define ACCEL_TCG_INTERNAL_H
|
|
|
|
|
|
|
|
#include "exec/exec-all.h"
|
|
|
|
|
2022-09-19 13:28:15 +03:00
|
|
|
/*
|
|
|
|
* Access to the various translations structures need to be serialised
|
|
|
|
* via locks for consistency. In user-mode emulation access to the
|
|
|
|
* memory related structures are protected with mmap_lock.
|
|
|
|
* In !user-mode we use per-page locks.
|
|
|
|
*/
|
|
|
|
#ifdef CONFIG_SOFTMMU
|
|
|
|
#define assert_memory_lock()
|
|
|
|
#else
|
|
|
|
#define assert_memory_lock() tcg_debug_assert(have_mmap_lock())
|
|
|
|
#endif
|
|
|
|
|
2022-10-06 04:06:29 +03:00
|
|
|
#if defined(CONFIG_SOFTMMU) && defined(CONFIG_DEBUG_TCG)
|
|
|
|
void assert_no_pages_locked(void);
|
2022-10-06 03:22:42 +03:00
|
|
|
#else
|
2022-10-06 04:06:29 +03:00
|
|
|
static inline void assert_no_pages_locked(void) { }
|
2022-10-06 03:22:42 +03:00
|
|
|
#endif
|
|
|
|
|
2022-09-20 08:17:44 +03:00
|
|
|
#ifdef CONFIG_USER_ONLY
|
2022-10-06 04:06:29 +03:00
|
|
|
static inline void page_table_config_init(void) { }
|
2022-09-20 08:17:44 +03:00
|
|
|
#else
|
2022-10-06 04:06:29 +03:00
|
|
|
void page_table_config_init(void);
|
2022-09-20 08:17:44 +03:00
|
|
|
#endif
|
2022-10-01 23:36:33 +03:00
|
|
|
|
2022-10-06 04:06:29 +03:00
|
|
|
#ifdef CONFIG_SOFTMMU
|
|
|
|
struct page_collection;
|
|
|
|
void tb_invalidate_phys_page_fast(struct page_collection *pages,
|
|
|
|
tb_page_addr_t start, int len,
|
|
|
|
uintptr_t retaddr);
|
|
|
|
struct page_collection *page_collection_lock(tb_page_addr_t start,
|
|
|
|
tb_page_addr_t end);
|
|
|
|
void page_collection_unlock(struct page_collection *set);
|
2022-12-09 12:36:45 +03:00
|
|
|
G_NORETURN void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr);
|
2022-10-06 04:06:29 +03:00
|
|
|
#endif /* CONFIG_SOFTMMU */
|
2022-09-20 08:17:44 +03:00
|
|
|
|
2021-01-21 09:15:06 +03:00
|
|
|
TranslationBlock *tb_gen_code(CPUState *cpu, target_ulong pc,
|
|
|
|
target_ulong cs_base, uint32_t flags,
|
|
|
|
int cflags);
|
2021-03-10 02:42:16 +03:00
|
|
|
void page_init(void);
|
|
|
|
void tb_htable_init(void);
|
2022-09-20 08:17:44 +03:00
|
|
|
void tb_reset_jump(TranslationBlock *tb, int n);
|
|
|
|
TranslationBlock *tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
|
|
|
|
tb_page_addr_t phys_page2);
|
2022-10-05 19:18:39 +03:00
|
|
|
bool tb_invalidate_phys_page_unwind(tb_page_addr_t addr, uintptr_t pc);
|
2022-10-24 15:15:04 +03:00
|
|
|
void cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
|
2022-10-24 16:12:56 +03:00
|
|
|
uintptr_t host_pc);
|
2021-01-17 19:48:12 +03:00
|
|
|
|
2022-08-15 23:16:06 +03:00
|
|
|
/* Return the current PC from CPU, which may be cached in TB. */
|
|
|
|
static inline target_ulong log_pc(CPUState *cpu, const TranslationBlock *tb)
|
|
|
|
{
|
2022-08-12 19:53:53 +03:00
|
|
|
#if TARGET_TB_PCREL
|
|
|
|
return cpu->cc->get_pc(cpu);
|
|
|
|
#else
|
2022-08-15 23:16:06 +03:00
|
|
|
return tb_pc(tb);
|
2022-08-12 19:53:53 +03:00
|
|
|
#endif
|
2022-08-15 23:16:06 +03:00
|
|
|
}
|
|
|
|
|
2021-01-21 09:15:06 +03:00
|
|
|
#endif /* ACCEL_TCG_INTERNAL_H */
|