From 7469bcb69af0f7f1961cc7c1d995e87452c4a3d6 Mon Sep 17 00:00:00 2001 From: Stanislav Shwartsman Date: Sun, 5 Nov 2023 07:08:36 +0200 Subject: [PATCH] =?UTF-8?q?measure=20host=20stack=20depth=20during=20simul?= =?UTF-8?q?ation=20to=20avoid=20excessive=20chainin=E2=80=A6=20(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …g depth never allow beyong 64K stack --- bochs/cpu/cpu.cc | 20 ++++++++++++++++++-- bochs/cpu/cpu.h | 4 ++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/bochs/cpu/cpu.cc b/bochs/cpu/cpu.cc index 44a62b9ba..c5214e3d8 100644 --- a/bochs/cpu/cpu.cc +++ b/bochs/cpu/cpu.cc @@ -51,6 +51,12 @@ jmp_buf BX_CPU_C::jmp_buf_env; void BX_CPU_C::cpu_loop(void) { +#if BX_SUPPORT_HANDLERS_CHAINING_SPEEDUPS + volatile Bit8u stack_anchor = 0; + + BX_CPU_THIS_PTR cpuloop_stack_anchor = &stack_anchor; +#endif + #if BX_DEBUGGER BX_CPU_THIS_PTR break_point = 0; BX_CPU_THIS_PTR magic_break = 0; @@ -249,18 +255,28 @@ bxICacheEntry_c* BX_CPU_C::getICacheEntry(void) // The function is called after taken branch instructions and tries to link the branch to the next trace void BX_CPP_AttrRegparmN(1) BX_CPU_C::linkTrace(bxInstruction_c *i) { + volatile Bit8u stack_anchor = 0; + #if BX_SUPPORT_SMP if (BX_SMP_PROCESSORS > 1) return; #endif -#define BX_HANDLERS_CHAINING_MAX_DEPTH 1000 +#define BX_HANDLERS_CHAINING_MAX_LINK_DEPTH 1000 // do not allow extreme trace link depth / avoid host stack overflow // (could happen with badly compiled instruction handlers) static Bit32u linkDepth = 0; - if (BX_CPU_THIS_PTR async_event || ++linkDepth > BX_HANDLERS_CHAINING_MAX_DEPTH) { + if (BX_CPU_THIS_PTR async_event || ++linkDepth > BX_HANDLERS_CHAINING_MAX_LINK_DEPTH) { + linkDepth = 0; + return; + } + +#define BX_HANDLERS_CHAINING_MAX_STACK_DEPTH 0x10000 + + size_t stack_depth = BX_CPU_THIS_PTR cpuloop_stack_anchor - &stack_anchor; + if (stack_depth > BX_HANDLERS_CHAINING_MAX_STACK_DEPTH) { linkDepth = 0; return; } diff --git a/bochs/cpu/cpu.h b/bochs/cpu/cpu.h index 2617d5b88..8bd1ae19b 100644 --- a/bochs/cpu/cpu.h +++ b/bochs/cpu/cpu.h @@ -1139,6 +1139,10 @@ public: // for now... static jmp_buf jmp_buf_env; unsigned last_exception_type; +#if BX_SUPPORT_HANDLERS_CHAINING_SPEEDUPS + const volatile Bit8u *cpuloop_stack_anchor = NULL; +#endif + // Boundaries of current code page, based on EIP bx_address eipPageBias; Bit32u eipPageWindowSize;