tcg/wasm32: add tlbguard and store-PC window probes

This commit is contained in:
2026-07-23 10:37:23 -04:00
parent cd3f083fb0
commit e4a6de07c6
4 changed files with 89 additions and 0 deletions
+6
View File
@@ -6610,6 +6610,12 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
wasm_diff_register_tb(tb->tc.ptr, tcg_splitwx_to_rx(tb->tc.ptr), pc_start,
wasm_tb_had_store,
wasm_tb_had_store && !wasm_tb_had_helper);
if (wasm_tb_had_store && wasm_store_pc_hi && pc_start >= wasm_store_pc_lo &&
pc_start < wasm_store_pc_hi) {
wasm_tci_only_tb = true;
printf("STPC TCI pc=0x%llx\n", (unsigned long long)pc_start);
fflush(stdout);
}
if (wasm_tci_only_tb) {
for (int i = 0; i < get_core_nums(); i++) {
export_vec_base[i] = WASM_TCI_ONLY_ENTRY;
+50
View File
@@ -33,7 +33,9 @@
#include "wasm32.h"
extern int wasm_ramrace_trace;
extern int wasm_tlb_guard_enabled;
__thread uintptr_t tci_tb_ptr;
static __thread int tlbtrace_guard_announced;
__thread bool wasm_tci_only_tb;
static int instantiated_wasm_count;
@@ -200,6 +202,39 @@ EM_JS(void, init_wasm32_js, (int tb_ptr_ptr, int cur_core_num, int to_remove_ins
};
});
static void wasm_update_tlb_guard(CPUArchState *env)
{
uintptr_t lo = UINTPTR_MAX;
uintptr_t hi = 0;
CPUState *cpu = env_cpu(env);
ctx.tlb_guard_on = wasm_tlb_guard_enabled;
if (!ctx.tlb_guard_on) {
return;
}
for (int i = 0; i < NB_MMU_MODES; i++) {
CPUTLBDescFast *fast = &cpu->neg.tlb.f[i];
CPUTLBDesc *desc = &cpu->neg.tlb.d[i];
size_t n = fast->table ? ((fast->mask >> CPU_TLB_ENTRY_BITS) + 1) : 0;
if (n) {
lo = MIN(lo, (uintptr_t)fast->table);
hi = MAX(hi, (uintptr_t)(fast->table + n));
}
if (desc->fulltlb && n) {
lo = MIN(lo, (uintptr_t)desc->fulltlb);
hi = MAX(hi, (uintptr_t)(desc->fulltlb + n));
}
}
ctx.tlb_guard_lo = (uint32_t)lo;
ctx.tlb_guard_hi = (uint32_t)hi;
if (wasm_ramrace_trace && !tlbtrace_guard_announced) {
printf("TLBGUARD range lo=0x%x hi=0x%x\n", ctx.tlb_guard_lo, ctx.tlb_guard_hi);
fflush(stdout);
tlbtrace_guard_announced = 1;
}
}
void init_wasm32()
{
if (!initdone) {
@@ -1329,10 +1364,13 @@ static __thread uint8_t *diff_fulltlb_c[NB_MMU_MODES];
int wasm_diff_mode;
int wasm_stateflush_enabled;
int wasm_tlb_guard_enabled;
int wasm_store_tci_disabled;
int wasm_store_tci_hash;
int wasm_store_bisect_on;
int wasm_store_bisect_width;
uint64_t wasm_store_pc_lo;
uint64_t wasm_store_pc_hi;
int wasm_yield_trace;
uint32_t wasm_yield_reentries;
@@ -1367,6 +1405,12 @@ EMSCRIPTEN_KEEPALIVE void wasm_set_store_bisect(int width, uint32_t mask, uint32
wasm_store_bisect_val = val;
}
EMSCRIPTEN_KEEPALIVE void wasm_set_store_pc_window(uint32_t lo, uint32_t hi)
{
wasm_store_pc_lo = lo;
wasm_store_pc_hi = hi;
}
EMSCRIPTEN_KEEPALIVE void wasm_diff_enable(void)
{
wasm_diff_enabled = 1;
@@ -1384,6 +1428,11 @@ EMSCRIPTEN_KEEPALIVE void wasm_stateflush_enable(void)
wasm_stateflush_enabled = 1;
}
EMSCRIPTEN_KEEPALIVE void wasm_tlb_guard_enable(void)
{
wasm_tlb_guard_enabled = 1;
}
int wasm_diff_on(void)
{
return wasm_diff_enabled;
@@ -1627,6 +1676,7 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
ctx.env = env;
ctx.tb_ptr = (uint32_t*)v_tb_ptr;
ctx.do_init = 1;
wasm_update_tlb_guard(env);
if (wasm_diff_mode == 2) {
if (!diff_started) {
+12
View File
@@ -18,6 +18,12 @@ struct wasmContext {
uint64_t *stack128;
// 28
uint32_t unwinding;
// 32
uint32_t tlb_guard_lo;
// 36
uint32_t tlb_guard_hi;
// 40
uint32_t tlb_guard_on;
};
#define ENV_OFF 0
@@ -28,6 +34,9 @@ struct wasmContext {
#define DONE_FLAG_OFF 20
#define STACK128_OFF 24
#define UNWINDING_OFF 28
#define TLB_GUARD_LO_OFF 32
#define TLB_GUARD_HI_OFF 36
#define TLB_GUARD_ON_OFF 40
void set_done_flag();
@@ -51,11 +60,14 @@ extern int wasm_store_tci_disabled;
extern int wasm_store_tci_hash;
extern int wasm_store_bisect_on;
extern int wasm_store_bisect_width;
extern uint64_t wasm_store_pc_lo;
extern uint64_t wasm_store_pc_hi;
extern uint32_t wasm_store_bisect_mask;
extern uint32_t wasm_store_bisect_val;
void wasm_disable_store_tci(void);
void wasm_set_store_tci_hash(int mode);
void wasm_set_store_bisect(int width, uint32_t mask, uint32_t val);
void wasm_set_store_pc_window(uint32_t lo, uint32_t hi);
void wasm_diff_enable(void);
void wasm_diff_enable2(void);
int wasm_diff_on(void);
+21
View File
@@ -386,6 +386,8 @@ static void tcg_wasm_out_op_end(TCGContext *s)
static void tcg_wasm_out_op_i32_eqz(TCGContext *s){ tcg_wasm_out8(s, 0x45); }
static void tcg_wasm_out_op_i32_eq(TCGContext *s){ tcg_wasm_out8(s, 0x46); }
static void tcg_wasm_out_op_i32_lt_u(TCGContext *s){ tcg_wasm_out8(s, 0x49); }
static void tcg_wasm_out_op_i32_ge_u(TCGContext *s){ tcg_wasm_out8(s, 0x4f); }
static void tcg_wasm_out_op_i32_and(TCGContext *s){ tcg_wasm_out8(s, 0x71); }
static void tcg_wasm_out_op_i32_or(TCGContext *s){ tcg_wasm_out8(s, 0x72); }
//static void tcg_wasm_out_op_i32_xor(TCGContext *s){ tcg_wasm_out8(s, 0x73); }
@@ -2232,6 +2234,25 @@ static uint8_t tcg_wasm_out_tlb_load(TCGContext *s, TCGReg addr, MemOpIdx oi, bo
tcg_wasm_out_op_global_get_r(s, addr);
tcg_wasm_out_op_i64_add(s);
tcg_wasm_out_op_local_set(s, TMP64_0_IDX);
if (!is_ld) {
tcg_wasm_out_ctx_i32_load(s, TLB_GUARD_ON_OFF);
tcg_wasm_out_op_if_noret(s);
tcg_wasm_out_op_local_get(s, TMP64_0_IDX);
tcg_wasm_out_op_i32_wrap_i64(s);
tcg_wasm_out_ctx_i32_load(s, TLB_GUARD_LO_OFF);
tcg_wasm_out_op_i32_ge_u(s);
tcg_wasm_out_op_local_get(s, TMP64_0_IDX);
tcg_wasm_out_op_i32_wrap_i64(s);
tcg_wasm_out_ctx_i32_load(s, TLB_GUARD_HI_OFF);
tcg_wasm_out_op_i32_lt_u(s);
tcg_wasm_out_op_i32_and(s);
tcg_wasm_out_op_if_noret(s);
tcg_wasm_out_op_i64_const(s, 0);
tcg_wasm_out_op_local_set(s, TMP64_0_IDX);
tcg_wasm_out_op_end(s);
tcg_wasm_out_op_end(s);
}
tcg_wasm_out_op_end(s);