tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit a48c7813a3ef97b25731205732d77e20d269f8b3
parent 09f04022c6f22371a4ad9f46f8b919e55330ae4b
Author: Ryan Hunt <rhunt@eqrion.net>
Date:   Thu, 18 Dec 2025 16:45:29 +0000

Bug 2002625 - wasm: Dynamically switch to main stack in import interp exit. r=yury

Use the infrastructure added for builtin thunks for the import
interp exit.

Differential Revision: https://phabricator.services.mozilla.com/D274194

Diffstat:
Mjs/src/wasm/WasmInstance.cpp | 23+++++------------------
Mjs/src/wasm/WasmStubs.cpp | 13+++----------
2 files changed, 8 insertions(+), 28 deletions(-)

diff --git a/js/src/wasm/WasmInstance.cpp b/js/src/wasm/WasmInstance.cpp @@ -250,6 +250,11 @@ bool Instance::callImport(JSContext* cx, uint32_t funcImportIndex, unsigned argc, uint64_t* argv) { AssertRealmUnchanged aru(cx); +#ifdef ENABLE_WASM_JSPI + // We should not be on a suspendable stack. + MOZ_ASSERT(!cx->wasm().onSuspendableStack()); +#endif + FuncImportInstanceData& instanceFuncImport = funcImportInstanceData(funcImportIndex); const FuncType& funcType = codeMeta().getFuncType(funcImportIndex); @@ -408,24 +413,6 @@ bool Instance::callImport(JSContext* cx, uint32_t funcImportIndex, Instance::callImport_general(Instance* instance, int32_t funcImportIndex, int32_t argc, uint64_t* argv) { JSContext* cx = instance->cx(); -#ifdef ENABLE_WASM_JSPI - if (IsSuspendableStackActive(cx)) { - struct ImportCallData { - Instance* instance; - int32_t funcImportIndex; - int32_t argc; - uint64_t* argv; - static bool Call(ImportCallData* data) { - Instance* instance = data->instance; - JSContext* cx = instance->cx(); - return instance->callImport(cx, data->funcImportIndex, data->argc, - data->argv); - } - } data = {instance, funcImportIndex, argc, argv}; - return CallOnMainStack( - cx, reinterpret_cast<CallOnMainStackFn>(ImportCallData::Call), &data); - } -#endif return instance->callImport(cx, funcImportIndex, argc, argv); } diff --git a/js/src/wasm/WasmStubs.cpp b/js/src/wasm/WasmStubs.cpp @@ -338,13 +338,6 @@ static bool FinishOffsets(MacroAssembler& masm, Offsets* offsets) { return !masm.oom(); } -static void AssertStackAlignment(MacroAssembler& masm, uint32_t alignment, - uint32_t addBeforeAssert = 0) { - MOZ_ASSERT( - (sizeof(Frame) + masm.framePushed() + addBeforeAssert) % alignment == 0); - masm.assertStackAlignment(alignment, addBeforeAssert); -} - template <class VectorT> static unsigned StackArgBytesHelper(const VectorT& args, ABIKind kind) { ABIArgIter<VectorT> iter(args, kind); @@ -2003,7 +1996,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi, ComputeByteAlignment(sizeof(Frame), ABIStackAlignment); unsigned framePushed = AlignBytes(argOffset + argBytes, ABIStackAlignment); GenerateExitPrologue(masm, ExitReason::Fixed::ImportInterp, - /*switchToMainStack*/ false, + /*switchToMainStack*/ true, /*framePushedPreSwitch*/ frameAlignment, /*framePushedPostSwitch*/ framePushed, offsets); @@ -2056,7 +2049,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi, MOZ_ASSERT(i.done()); // Make the call, test whether it succeeded, and extract the return value. - AssertStackAlignment(masm, ABIStackAlignment); + masm.assertStackAlignment(ABIStackAlignment); masm.call(SymbolicAddress::CallImport_General); masm.branchTest32(Assembler::Zero, ReturnReg, ReturnReg, throwLabel); @@ -2125,7 +2118,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi, #endif GenerateExitEpilogue(masm, ExitReason::Fixed::ImportInterp, - /*switchToMainStack*/ false, offsets); + /*switchToMainStack*/ true, offsets); return FinishOffsets(masm, offsets); }