[Vm-dev] OSVM on WebAssembly
Eliot Miranda
eliot.miranda at gmail.com
Mon Jun 27 21:31:13 UTC 2022
Hi Manuel,
cool beans!
On Mon, Jun 27, 2022 at 3:54 AM Manuel Leuenberger <maenuleu at gmail.com>
wrote:
>
> Hi,
>
> Ever since WebAssembly became a thing, I was wondering if this could
> become a target for VMs. People are already compiling FFMPEG and other
> complex tools. So I thought I would try as well.
>
> So here I am to report to whom it may concern: OSVM compiles to
> WebAssembly, starts up (nearly), then looping infinitely
> Meaning: The VM mmaps the image file, loads plugins (SecurityPlugin made
> EXTERNAL), starts interpreter loop, but then loops the same bytecode
> sequence forever
>
> Code lives at
> https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm if
> you want to try it out.
>
> Below is the current Readme, including a short list of issues. Maybe some
> of you could give me a hint?
>
> Cheers,
> Manuel
>
> pharo.stack.spur.wasm
>
> Compiles OSVM Stack interpreter to WebAssembly using the Emscripten
> compiler. Emscripten can be used as a drop-in replacement for gcc/clang and
> cmake. Based on MinHeadless Linux 32bit sources, as Emscripten provides
> Linux-like environment (pthreads, nanosleep, dlopen, file system). Check
> the latest few commits of maenu to see changed files.
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#current-issues>Current
> issues
>
> -
>
> Most adjustments are just putting EMSCRIPTEN in a macro or script.
> Should be fine, but should be tested to not interfere with other builds.
> -
>
> Compiles and runs, but seems to be stuck in initial GC and Heartbeat.
> Those could be related to incorrect get/set64() implementation.
> -
>
> Removed mmap address hint, as it caused errors.
> -
>
> Using argv eval '1 + 3' to do a simple eval does not terminate.
> -
>
> Interpreter repeats these bytecodes forever (what is this?):
>
>
Taking these from e.g. src/spur64.stack/interp.c they are
CASE(112)
CASE(332) /*76*/
/* pushReceiverBytecode */
> 332
>
> CASE(208)
CASE(209)
CASE(210)
CASE(211)
CASE(212)
CASE(213)
CASE(214)
CASE(215)
CASE(216)
CASE(217)
CASE(218)
CASE(219)
CASE(220)
CASE(221)
CASE(222)
CASE(223)
CASE(384) /*128*/ i.e. send literal selector 0 with 0 args
CASE(385) /*129*/
CASE(386) /*130*/
CASE(387) /*131*/
CASE(388) /*132*/
CASE(389) /*133*/
CASE(390) /*134*/
CASE(391) /*135*/
CASE(392) /*136*/
CASE(393) /*137*/
CASE(394) /*138*/
CASE(395) /*139*/
CASE(396) /*140*/
CASE(397) /*141*/
CASE(398) /*142*/
CASE(399) /*143*/
/* sendLiteralSelector0ArgsBytecode */
> 384
>
>
hence send literal selector 1 with 0 args
385
>
>
CASE(124)
CASE(348) /*92*/
/* returnTopFromMethod */
> 348
>
>
CASE(501) /*245*/
/* longStoreTemporaryVariableBytecode */
> 501
>
> CASE(136)
CASE(339) /*83*/
/* duplicateTopBytecode */
> 339
>
> CASE(16)
CASE(320) /*64*/
/* pushTemporaryVariableBytecode */
> 320
>
>
CASE(224)
CASE(225)
CASE(226)
CASE(227)
CASE(228)
CASE(229)
CASE(230)
CASE(231)
CASE(232)
CASE(233)
CASE(234)
CASE(235)
CASE(236)
CASE(237)
CASE(238)
CASE(239)
CASE(400) /*144*/
CASE(401) /*145*/ i.e. send literal selector 1 with 1 arg
CASE(402) /*146*/
CASE(403) /*147*/
CASE(404) /*148*/
CASE(405) /*149*/
CASE(406) /*150*/
CASE(407) /*151*/
CASE(408) /*152*/
CASE(409) /*153*/
CASE(410) /*154*/
CASE(411) /*155*/
CASE(412) /*156*/
CASE(413) /*157*/
CASE(414) /*158*/
CASE(415) /*159*/
/* sendLiteralSelector1ArgBytecode */
> 401
>
> CASE(64)
CASE(272) /*16*/
/* pushLiteralVariableBytecode */
> 272
>
> CASE(204)
CASE(380) /*124*/
/* bytecodePrimNew */ i.e. a send of #new from the special
selector bytecode
> 380
>
>
If I had to guess what's going wrong I'd guess that the return bytecode 348
isn't correctly implemented.
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#build--run>Build
> & Run
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#1-install-emscripten>1.
> Install Emscripten
>
> I installed Emscripten SDK
> <https://emscripten.org/docs/getting_started/downloads.html> to get an
> all-in-one package.
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#2-grab-an-image>2.
> Grab an image
>
> Grab a 32bit Smalltalk image and but it in the image folder. I used Pharo
> 9.
>
> cd building/minheadless.cmake/x86/pharo.stack.spur.wasm
> mkdir image
> cd image
> curl https://get.pharo.org/32/90 | bash
>
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#3-build-vm>3.
> Build VM
>
> ./mvm_configure_variant debug Debug && make -C debug install
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#4-run-a-web-server>4.
> Run a web server
>
> emrun --port 9090 --serve_root ../../../../ --no_browser .
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#5-launch-vm>5.
> Launch VM
>
>
> http://localhost:9090/building/minheadless.cmake/x86/pharo.stack.spur.wasm/debug/dist/squeak.html
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#6-inspect-running-vm>6.
> Inspect running VM
>
> The VM is compiled with DWARF debug information, which is understood by
> the Chrome debugger. So we can step through the C sources of the
> WebAssembly, pretty nifty.
>
> <https://github.com/maenu/opensmalltalk-vm/tree/Cog/building/minheadless.cmake/x86/pharo.stack.spur.wasm#resources>
> Resources
>
> - Inspect WebAssembly (at the bottom)
> <https://webassembly.org/getting-started/developers-guide/>
> - Emscripten doc (Porting)
> <https://emscripten.org/docs/porting/index.html>
> - Emscripten settings <https://emsettings.surma.technology/>
>
>
>
--
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20220627/09e1bc2c/attachment-0001.html>
More information about the Vm-dev
mailing list