mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-11 03:25:33 +00:00
translate-all: add DEBUG_LOCKING asserts
This adds asserts to check the locking on the various translation engines structures. There are two sets of structures that are protected by locks. The first the l1map and PageDesc structures used to track which translation blocks are associated with which physical addresses. In user-mode this is covered by the mmap_lock. The second case are TB context related structures which are protected by tb_lock which is also user-mode only. Currently the asserts do nothing in SoftMMU mode but this will change for MTTCG. Backports commit 301e40ed8005306c009978be295ed9a4b725178b from qemu
This commit is contained in:
parent
075aaad106
commit
7aab0bd9a6
|
@ -395,6 +395,7 @@ void tlb_fill(CPUState *cpu, target_ulong addr, MMUAccessType access_type,
|
|||
#if defined(CONFIG_USER_ONLY)
|
||||
void mmap_lock(void);
|
||||
void mmap_unlock(void);
|
||||
bool have_mmap_lock(void);
|
||||
|
||||
static inline tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr)
|
||||
{
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "tcg.h"
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
#include "qemu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#include <sys/param.h>
|
||||
#if __FreeBSD_version >= 700104
|
||||
|
@ -62,6 +63,7 @@
|
|||
|
||||
/* #define DEBUG_TB_INVALIDATE */
|
||||
/* #define DEBUG_TB_FLUSH */
|
||||
/* #define DEBUG_LOCKING */
|
||||
/* make various TB consistency checks */
|
||||
/* #define DEBUG_TB_CHECK */
|
||||
|
||||
|
@ -70,6 +72,28 @@
|
|||
#undef DEBUG_TB_CHECK
|
||||
#endif
|
||||
|
||||
/* Access to the various translations structures need to be serialised via locks
|
||||
* for consistency. This is automatic for SoftMMU based system
|
||||
* emulation due to its single threaded nature. In user-mode emulation
|
||||
* access to the memory related structures are protected with the
|
||||
* mmap_lock.
|
||||
*/
|
||||
#ifdef DEBUG_LOCKING
|
||||
#define DEBUG_MEM_LOCKS 1
|
||||
#else
|
||||
#define DEBUG_MEM_LOCKS 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
#define assert_memory_lock() do { /* nothing */ } while (0)
|
||||
#else
|
||||
#define assert_memory_lock() do { \
|
||||
if (DEBUG_MEM_LOCKS) { \
|
||||
g_assert(have_mmap_lock()); \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define SMC_BITMAP_USE_THRESHOLD 10
|
||||
|
||||
typedef struct PageDesc {
|
||||
|
@ -108,6 +132,22 @@ typedef struct PageDesc {
|
|||
#define V_L1_MAX_BITS (V_L2_BITS + 3)
|
||||
#define V_L1_MAX_SIZE (1 << V_L1_MAX_BITS)
|
||||
|
||||
#ifdef DEBUG_LOCKING
|
||||
#define DEBUG_TB_LOCKS 1
|
||||
#else
|
||||
#define DEBUG_TB_LOCKS 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
#define assert_tb_lock() do { /* nothing */ } while (0)
|
||||
#else
|
||||
#define assert_tb_lock() do { \
|
||||
if (DEBUG_TB_LOCKS) { \
|
||||
g_assert(have_tb_lock); \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
static TranslationBlock *tb_find_pc(struct uc_struct *uc, uintptr_t tc_ptr);
|
||||
|
||||
// Unicorn: for cleaning up memory later.
|
||||
|
|
Loading…
Reference in a new issue