提交 6ac3d7e8 编写于 作者: P Pranith Kumar 提交者: Alex Bennée

mttcg: translate-all: Enable locking debug in a debug build

Enable tcg lock debug asserts in a debug build by default instead of
relying on DEBUG_LOCKING. None of the other DEBUG_* macros have
asserts, so this patch removes DEBUG_LOCKING and enable these asserts
in a debug build.

CC: Richard Henderson <rth@twiddle.net>
Signed-off-by: NPranith Kumar <bobby.prani@gmail.com>
[AJB: tweak ifdefs so can be early in series]
Signed-off-by: NAlex Bennée <alex.bennee@linaro.org>
Reviewed-by: NRichard Henderson <rth@twiddle.net>
上级 c6489dd9
...@@ -59,7 +59,6 @@ ...@@ -59,7 +59,6 @@
/* #define DEBUG_TB_INVALIDATE */ /* #define DEBUG_TB_INVALIDATE */
/* #define DEBUG_TB_FLUSH */ /* #define DEBUG_TB_FLUSH */
/* #define DEBUG_LOCKING */
/* make various TB consistency checks */ /* make various TB consistency checks */
/* #define DEBUG_TB_CHECK */ /* #define DEBUG_TB_CHECK */
...@@ -74,20 +73,10 @@ ...@@ -74,20 +73,10 @@
* access to the memory related structures are protected with the * access to the memory related structures are protected with the
* mmap_lock. * mmap_lock.
*/ */
#ifdef DEBUG_LOCKING
#define DEBUG_MEM_LOCKS 1
#else
#define DEBUG_MEM_LOCKS 0
#endif
#ifdef CONFIG_SOFTMMU #ifdef CONFIG_SOFTMMU
#define assert_memory_lock() do { /* nothing */ } while (0) #define assert_memory_lock() do { /* nothing */ } while (0)
#else #else
#define assert_memory_lock() do { \ #define assert_memory_lock() tcg_debug_assert(have_mmap_lock())
if (DEBUG_MEM_LOCKS) { \
g_assert(have_mmap_lock()); \
} \
} while (0)
#endif #endif
#define SMC_BITMAP_USE_THRESHOLD 10 #define SMC_BITMAP_USE_THRESHOLD 10
...@@ -169,10 +158,18 @@ static void page_table_config_init(void) ...@@ -169,10 +158,18 @@ static void page_table_config_init(void)
assert(v_l2_levels >= 0); assert(v_l2_levels >= 0);
} }
#ifdef CONFIG_USER_ONLY
#define assert_tb_locked() tcg_debug_assert(have_tb_lock)
#define assert_tb_unlocked() tcg_debug_assert(!have_tb_lock)
#else
#define assert_tb_locked() do { /* nothing */ } while (0)
#define assert_tb_unlocked() do { /* nothing */ } while (0)
#endif
void tb_lock(void) void tb_lock(void)
{ {
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
assert(!have_tb_lock); assert_tb_unlocked();
qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock); qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
have_tb_lock++; have_tb_lock++;
#endif #endif
...@@ -181,7 +178,7 @@ void tb_lock(void) ...@@ -181,7 +178,7 @@ void tb_lock(void)
void tb_unlock(void) void tb_unlock(void)
{ {
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
assert(have_tb_lock); assert_tb_locked();
have_tb_lock--; have_tb_lock--;
qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock); qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
#endif #endif
...@@ -197,23 +194,6 @@ void tb_lock_reset(void) ...@@ -197,23 +194,6 @@ void tb_lock_reset(void)
#endif #endif
} }
#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(uintptr_t tc_ptr); static TranslationBlock *tb_find_pc(uintptr_t tc_ptr);
void cpu_gen_init(void) void cpu_gen_init(void)
...@@ -847,7 +827,7 @@ static TranslationBlock *tb_alloc(target_ulong pc) ...@@ -847,7 +827,7 @@ static TranslationBlock *tb_alloc(target_ulong pc)
{ {
TranslationBlock *tb; TranslationBlock *tb;
assert_tb_lock(); assert_tb_locked();
if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks) { if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks) {
return NULL; return NULL;
...@@ -862,7 +842,7 @@ static TranslationBlock *tb_alloc(target_ulong pc) ...@@ -862,7 +842,7 @@ static TranslationBlock *tb_alloc(target_ulong pc)
/* Called with tb_lock held. */ /* Called with tb_lock held. */
void tb_free(TranslationBlock *tb) void tb_free(TranslationBlock *tb)
{ {
assert_tb_lock(); assert_tb_locked();
/* In practice this is mostly used for single use temporary TB /* In practice this is mostly used for single use temporary TB
Ignore the hard cases and just back up if this TB happens to Ignore the hard cases and just back up if this TB happens to
...@@ -1104,7 +1084,7 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr) ...@@ -1104,7 +1084,7 @@ void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
uint32_t h; uint32_t h;
tb_page_addr_t phys_pc; tb_page_addr_t phys_pc;
assert_tb_lock(); assert_tb_locked();
atomic_set(&tb->invalid, true); atomic_set(&tb->invalid, true);
...@@ -1421,7 +1401,7 @@ static void tb_invalidate_phys_range_1(tb_page_addr_t start, tb_page_addr_t end) ...@@ -1421,7 +1401,7 @@ static void tb_invalidate_phys_range_1(tb_page_addr_t start, tb_page_addr_t end)
#ifdef CONFIG_SOFTMMU #ifdef CONFIG_SOFTMMU
void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end) void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end)
{ {
assert_tb_lock(); assert_tb_locked();
tb_invalidate_phys_range_1(start, end); tb_invalidate_phys_range_1(start, end);
} }
#else #else
...@@ -1464,7 +1444,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end, ...@@ -1464,7 +1444,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
#endif /* TARGET_HAS_PRECISE_SMC */ #endif /* TARGET_HAS_PRECISE_SMC */
assert_memory_lock(); assert_memory_lock();
assert_tb_lock(); assert_tb_locked();
p = page_find(start >> TARGET_PAGE_BITS); p = page_find(start >> TARGET_PAGE_BITS);
if (!p) { if (!p) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册