From nobody Mon Feb 9 10:57:44 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1769412163; cv=none; d=zohomail.com; s=zohoarc; b=HF9q5yoFminW/dzHqQMl0IcJm8r5X8f2MEIs+EnlDceiyavenSL8Z4QU639VSVqStWW2Ta9dWBAIC9SeQM6ziGzStbOAwOMLyO4OS34tGCdlIb/yzI36e69R4FFUhKLKnJ1E5dZ+5Xy3fUqd0nmLsTgNc87MfvQ1hjh48lZOlRc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769412163; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Oj8vRqVMDeN0JON25L/5cGpcqDkG3XOVfGvUsHWl4zU=; b=OlAmwgSsmVAHncBcZbaIkYxsBkG0p+SP25/PvDy6QVVOuh64GJo36ktp8YP0QrQbbmmJ1ts7VuOOP1l3YoD71gpwHBtmUZDD+KgVTeCZS5zY8jIfZ0LU3Q9cBb3h2Y2vT3z2O0R0E2Ibf/Y3CjsW/69hV0bxYh56xdAy0YG9G3o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1769412163581742.3288848924659; Sun, 25 Jan 2026 23:22:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vkGug-00073i-VA; Mon, 26 Jan 2026 02:21:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vkGgR-0003Qc-MF for qemu-devel@nongnu.org; Mon, 26 Jan 2026 02:06:59 -0500 Received: from mail-pf1-x429.google.com ([2607:f8b0:4864:20::429]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vkGgL-0004le-5P for qemu-devel@nongnu.org; Mon, 26 Jan 2026 02:06:44 -0500 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-81e8b1bdf0cso2223815b3a.3 for ; Sun, 25 Jan 2026 23:06:31 -0800 (PST) Received: from brahms.. (fp93c00990.tkyc601.ap.nuro.jp. [147.192.9.144]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-823187716ebsm8661487b3a.66.2026.01.25.23.06.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Jan 2026 23:06:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769411191; x=1770015991; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Oj8vRqVMDeN0JON25L/5cGpcqDkG3XOVfGvUsHWl4zU=; b=CaxY4BqOdyyH2UYsMdjAIDJ8U/9VZ7tAIvtbOSIBM1uNDCgHZxig9AHy1jwtf7jUwc HbBz7MQDFe9+bYMxd2pZ69wmPU9vCTJUx1uRO6Xkv3L7F5qAUfvHFto7vWIyEqz8/Cal KAcagYEaC0jcyxQDRac3o7yIVMCL2G7AoFQoXj8eN54Ii1N5DCA17gQx00VFqVK16BTw rM8gqQu7GNcCWuVfGsX71Tre4K9K0OveehxkMh7XTyf3JigVA7ZLrk7TN2jWEqaG/6pW /1zYknLhBessgi2+7xovFI+bXPeQVOTTQm22ZKRva4TPYtHfghW4TDVPh8XiPPF0BT7Q LCeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769411191; x=1770015991; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Oj8vRqVMDeN0JON25L/5cGpcqDkG3XOVfGvUsHWl4zU=; b=bFg6LyGHIPblwncyJ+nBmLXwJe1xYw5dAD4U7vs3hMCN/CTXIx08b6zO6Xs1FZ16Wy xwjEl6f+Lc5xemO5UpdPixUrAOM6SmMRx/Wr9DMGdONB+uecftUvP9TvnhY10DGdI5Ct cEomqIZzsSesiedSZOHeBR0TC3IiBWPebiTED74pD2LboEM5XXACIsiN7u9mRPiD+xrn /6YnvFSl6HLXYUdVnQ+XarxmZ/5sVOYZvIoK5eW/qhwUpgmWfimL6hGsstAEcWxAL2mr dgjZoQhmugVYaIhRFCDzMHN5IRqH7DBmZ3qpZ3E4MpPFJK+QyUTxK0vZijpFAIyHICoZ sfXw== X-Gm-Message-State: AOJu0YytkPuQbuvoqsyzyUplxjXru/7l8+C4WLjIeLDuIcno3hygm+qN 0bEbD/1RTLjIs0FSzA/b4PoCIPVR/OCCbyh54Pod5hRAAx0FYSRFFbcFA+isI0On X-Gm-Gg: AZuq6aLKHI9CMocU5t7KxZosqlRbphtsZtEkiccLqOVdOJxNLl2ZIEqWAmOukPu2N+b 6pW1E2BAiiDBFP1J89/Da/DWWLYvcPbQ5LHZ4dOVwnLM/WgMB2So+ozUoo9y04aeJp/51k71bKn 3bMwO/5CjzCYTBG7ANk2AvS1oNF7o69ROurYBimxgvr/+gkIoZd1upsklX+KuaOL/zmsixwJrkj hnQcmS27e/wtJsyNbYY0zONhsSkcWauG4xjCji7UgTp0za91I412etLKl5zuk9OJ5M7RlTeCWM2 1td8onJqhIdmI+4bDYWsyfp3IZ5mG+X+iSulAcSRbSAS53UvPAM9AZ2f6KCyAQZ/LBKHtKjCd7z CGI9DTBLyTko5rqBLu4vrwgZ6/en+TCI6iP74S5lE4YDMknDC3jDT/iz/tJEVzh5wU+bvCHoRYO KFLE0viJoWoN/F2bfkIzBG/qI/5XwedyEViHdAdloi8Q== X-Received: by 2002:a05:6a00:2e27:b0:81c:717b:9d29 with SMTP id d2e1a72fcca58-823412bc9dbmr3045269b3a.51.1769411191033; Sun, 25 Jan 2026 23:06:31 -0800 (PST) From: Kohei Tokunaga To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Thomas Huth , Paolo Bonzini , Richard Henderson , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , WANG Xuerui , Aurelien Jarno , Huacai Chen , Jiaxun Yang , Aleksandar Rikalo , Palmer Dabbelt , Alistair Francis , Stefan Weil , Kohei Tokunaga , qemu-arm@nongnu.org, qemu-riscv@nongnu.org, Stefan Hajnoczi , Pierrick Bouvier Subject: [PATCH v4 32/33] scripts: Add a script to run the wasm-compiled QEMU on node.js Date: Mon, 26 Jan 2026 07:03:45 +0000 Message-ID: <2af460d17a47ec69d691dfb876f834e4685f9d6d.1769407033.git.ktokunaga.mail@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::429; envelope-from=ktokunaga.mail@gmail.com; helo=mail-pf1-x429.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1769412166729154100 Content-Type: text/plain; charset="utf-8" run-emscripten.mjs is a Node.js script to quickly test the Wasm-compiled QEMU. This runs directly from the terminal using the node command so the HTTP server or the browser isn't needed. Node.js 24 or newer is needed to run wasm64 binaries. Also note that QEMU's "quit" monitor command doesn't work as of now because of the Emscripten's atexit issue [1]. Send SIGINT or SIGTERM to the node process to exit QEMU. [1] https://github.com/emscripten-core/emscripten/issues/26040 Signed-off-by: Kohei Tokunaga --- scripts/run-emscripten.mjs | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 scripts/run-emscripten.mjs diff --git a/scripts/run-emscripten.mjs b/scripts/run-emscripten.mjs new file mode 100644 index 0000000000..330e31cfe3 --- /dev/null +++ b/scripts/run-emscripten.mjs @@ -0,0 +1,66 @@ +#!/usr/bin/env node + +import path from 'node:path'; +import { parseArgs } from "node:util"; + +function help() { + console.log(`Usage: run-emscripten.mjs [--preload FILE] [script.js] -- [= arguments] + +Options: + --preload FILE: Load the package created by Emscripten's file_packager.p= y`); +} + +const { values, positionals } =3D parseArgs({ + allowPositionals: true, + options: { + 'preload': { type: 'string' }, + 'help': { type: 'boolean' }, + }, +}) +if (values.help) { + help(); + process.exit(0); +} +const preload =3D values.preload; +const moduleFile =3D positionals[0]; +const moduleArgs =3D positionals.slice(1); +if ((!moduleFile) || (!moduleFile.match(/.*\.m?js$/))) { + console.error("module JS file must be specified as the first argument"); + help(); + process.exit(1); +} + +const targetModule =3D await import(path.resolve(moduleFile)); +let preloadModule; +if (preload) preloadModule =3D await import(path.resolve(preload)); + +var Module =3D { + preRun: [], + arguments: moduleArgs, + mainScriptUrlOrBlob: path.resolve(moduleFile), +}; +Module["preRun"].push((Module) =3D> { + const decoder =3D new TextDecoder('utf-8'); + Module.TTY.default_tty_ops.put_char =3D (tty, val) =3D> { + process.stdout.write(decoder.decode(new Uint8Array([val]))); + } + Module.TTY.default_tty1_ops.put_char =3D (tty, val) =3D> { + process.stderr.write(decoder.decode(new Uint8Array([val]))); + } +}); +if (preloadModule) preloadModule.default(Module); + +if (process.stdin.isTTY) { + process.stdin.setRawMode(true); +} +function restoreTTY() { + if (process.stdin.isTTY) { + process.stdin.setRawMode(false); + } + process.exit(0); +} +process.on('exit', restoreTTY); +process.on('SIGINT', restoreTTY); +process.on('SIGTERM', restoreTTY); + +await targetModule.default(Module); --=20 2.43.0