| /* |
| * 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" |
| |
| /* |
| * 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 |
| |
| #if defined(CONFIG_SOFTMMU) && defined(CONFIG_DEBUG_TCG) |
| void assert_no_pages_locked(void); |
| #else |
| static inline void assert_no_pages_locked(void) { } |
| #endif |
| |
| #ifdef CONFIG_USER_ONLY |
| static inline void page_table_config_init(void) { } |
| #else |
| void page_table_config_init(void); |
| #endif |
| |
| #ifdef CONFIG_SOFTMMU |
| struct page_collection; |
| void tb_invalidate_phys_page_fast__locked(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); |
| G_NORETURN void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr); |
| #endif /* CONFIG_SOFTMMU */ |
| |
| TranslationBlock *tb_gen_code(CPUState *cpu, target_ulong pc, |
| target_ulong cs_base, uint32_t flags, |
| int cflags); |
| void page_init(void); |
| void tb_htable_init(void); |
| 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); |
| bool tb_invalidate_phys_page_unwind(tb_page_addr_t addr, uintptr_t pc); |
| void cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb, |
| uintptr_t host_pc); |
| |
| /* Return the current PC from CPU, which may be cached in TB. */ |
| static inline target_ulong log_pc(CPUState *cpu, const TranslationBlock *tb) |
| { |
| #if TARGET_TB_PCREL |
| return cpu->cc->get_pc(cpu); |
| #else |
| return tb_pc(tb); |
| #endif |
| } |
| |
| #endif /* ACCEL_TCG_INTERNAL_H */ |