# aWsm (awesome) This project is a work-in-progress to build an efficient WASM runtime, **aWsm**, using `silverfish` compiler. ## Setting up the environment To use a Docker container based environment, that makes your life easy by installing all the required dependencies and builds the toolchain for you. Run ``` ./devenv.sh setup ``` **make sure you've docker installed.** To enter the docker environment, ``` ./devenv.sh run ``` **spawns a shell in the container.** To setup toolchain path (within a container, per `run`) ``` source /opt/awsm/bin/devenv_src.sh ``` ## To run applications There are a set of benchmarking applications in `code_benches` directory that should be "loadable", WIP!! (**only tested stringsearch for now**.) **All the remaining steps are in a Docker container environment.** ``` cd /awsm/code_benches/ make clean all ``` This compiles all subfolders (WASM applications) and copies `_wasm.so` to /awsm/runtime/bin. (**Make sure you have that directory in place! (I'll fix the makefiles)**) ``` cd /awsm/runtime make clean all ``` This will copy the awsmrt binary to /awsm/runtime/bin. ``` cd /awsm/runtime/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd` ``` **Create input and test files** Supports module registration using json format now and invocations as well. More importantly, each module runs a udp server and waits for connections. The udpclient tool in `runtime/tools` directory uses a format `$`, connects to and sends the to the IP address it connects at the start. To run `awsm runtime`, ``` ./awsmrt ../tests/test_modules.json ``` To run the udpclient, ``` ./udpclient ../tests/test_sandboxes.jsondata ``` And follow the prompts in udpclient to send requests to the runtime. ## WIP (Work In Progress) * ~~Dynamic loading of multiple modules~~ * ~~Multiple sandboxes (includes multiple modules, multiple instances of a module)~~ * ~~Bookkeeping of multiple modules and multiple sandboxes.~~ * ~~Runtime to "poll"?? on requests to instantiate a module~~ and respond with the result. * ~~Runtime to schedule multiple sandboxes.~~ * Efficient scheduling and performance optimizations. * Runtime to enable event-based I/O (using `libuv`). * To enable WASI interface, perhaps through the use of WASI-SDK ## Silverfish compiler Silverfish compiler uses `llvm` and interposes on loads/stores to enable sandbox isolation necessary in `aWsm` multi-sandboxing runtime. `aWsm` runtime includes the compiler-runtime API required for bounds checking in sandboxes.