Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 1 | //===- subzero/runtime/wasm-runtime.cpp - Subzero WASM runtime source -----===// |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 2 | // |
| 3 | // The Subzero Code Generator |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file implements the system calls required by the libc that is included |
| 11 | // in WebAssembly programs. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| 14 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 15 | #include <cmath> |
| 16 | |
| 17 | namespace env { |
| 18 | double floor(double X) { return std::floor(X); } |
| 19 | |
| 20 | float floor(float X) { return std::floor(X); } |
| 21 | } |
| 22 | |
| 23 | // TODO (eholk): move the C parts outside and use C++ name mangling. |
| 24 | extern "C" { |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 25 | #include <errno.h> |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 26 | #include <fcntl.h> |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 27 | #include <math.h> |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 28 | #include <stdio.h> |
| 29 | #include <stdlib.h> |
| 30 | #include <string.h> |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 31 | #include <sys/types.h> |
| 32 | #include <sys/stat.h> |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 33 | #include <unistd.h> |
| 34 | |
| 35 | extern char WASM_MEMORY[]; |
| 36 | |
| 37 | void env$$abort() { |
| 38 | fprintf(stderr, "Aborting...\n"); |
| 39 | abort(); |
| 40 | } |
| 41 | |
| 42 | void env$$_abort() { env$$abort(); } |
| 43 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 44 | double env$$floor_f(float X) { return env::floor(X); } |
| 45 | double env$$floor_d(double X) { return env::floor(X); } |
| 46 | |
John Porto | a4d100a | 2016-04-18 15:32:27 -0700 | [diff] [blame] | 47 | void env$$exit(int Status) { exit(Status); } |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 48 | void env$$_exit(int Status) { env$$exit(Status); } |
| 49 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 50 | #define UNIMPLEMENTED(f) \ |
| 51 | void env$$##f() { \ |
| 52 | fprintf(stderr, "Unimplemented: " #f "\n"); \ |
| 53 | abort(); \ |
| 54 | } |
| 55 | |
| 56 | UNIMPLEMENTED(sbrk) |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 57 | UNIMPLEMENTED(setjmp) |
| 58 | UNIMPLEMENTED(longjmp) |
| 59 | UNIMPLEMENTED(__assert_fail) |
| 60 | UNIMPLEMENTED(__builtin_malloc) |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 61 | UNIMPLEMENTED(__builtin_isinff) |
| 62 | UNIMPLEMENTED(__builtin_isinfl) |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 63 | UNIMPLEMENTED(__builtin_apply) |
| 64 | UNIMPLEMENTED(__builtin_apply_args) |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 65 | UNIMPLEMENTED(pthread_cleanup_push) |
| 66 | UNIMPLEMENTED(pthread_cleanup_pop) |
| 67 | UNIMPLEMENTED(pthread_self) |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 68 | UNIMPLEMENTED(__floatditf) |
| 69 | UNIMPLEMENTED(__floatsitf) |
| 70 | UNIMPLEMENTED(__fixtfdi) |
| 71 | UNIMPLEMENTED(__fixtfsi) |
| 72 | UNIMPLEMENTED(__fixsfti) |
| 73 | UNIMPLEMENTED(__netf2) |
| 74 | UNIMPLEMENTED(__getf2) |
| 75 | UNIMPLEMENTED(__eqtf2) |
| 76 | UNIMPLEMENTED(__lttf2) |
| 77 | UNIMPLEMENTED(__addtf3) |
| 78 | UNIMPLEMENTED(__subtf3) |
| 79 | UNIMPLEMENTED(__divtf3) |
| 80 | UNIMPLEMENTED(__multf3) |
| 81 | UNIMPLEMENTED(__multi3) |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 82 | UNIMPLEMENTED(__lock) |
| 83 | UNIMPLEMENTED(__unlock) |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 84 | UNIMPLEMENTED(__syscall6) // sys_close |
| 85 | UNIMPLEMENTED(__syscall140) // sys_llseek |
| 86 | UNIMPLEMENTED(__syscall192) // sys_mmap? |
| 87 | UNIMPLEMENTED(__unordtf2) |
| 88 | UNIMPLEMENTED(__fixunstfsi) |
| 89 | UNIMPLEMENTED(__floatunsitf) |
| 90 | UNIMPLEMENTED(__extenddftf2) |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 91 | |
| 92 | void *wasmPtr(int Index) { |
| 93 | // TODO (eholk): get the mask from the WASM file. |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 94 | const int MASK = 0xffffff; |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 95 | Index &= MASK; |
| 96 | |
| 97 | return WASM_MEMORY + Index; |
| 98 | } |
| 99 | |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 100 | extern int __szwasm_main(int, const char **); |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 101 | |
| 102 | #define WASM_REF(Type, Index) ((Type *)wasmPtr(Index)) |
| 103 | #define WASM_DEREF(Type, Index) (*WASM_REF(Type, Index)) |
| 104 | |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 105 | int main(int argc, const char **argv) { return __szwasm_main(argc, argv); } |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 106 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 107 | int env$$abs(int a) { return abs(a); } |
| 108 | |
| 109 | double env$$pow(double x, double y) { return pow(x, y); } |
| 110 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 111 | /// sys_write |
| 112 | int env$$__syscall4(int Which, int VarArgs) { |
| 113 | int Fd = WASM_DEREF(int, VarArgs + 0 * sizeof(int)); |
| 114 | int Buffer = WASM_DEREF(int, VarArgs + 1 * sizeof(int)); |
| 115 | int Length = WASM_DEREF(int, VarArgs + 2 * sizeof(int)); |
| 116 | |
| 117 | return write(Fd, WASM_REF(char *, Buffer), Length); |
| 118 | } |
| 119 | |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 120 | /// sys_open |
| 121 | int env$$__syscall5(int Which, int VarArgs) { |
| 122 | int WasmPath = WASM_DEREF(int, VarArgs); |
| 123 | int Flags = WASM_DEREF(int, VarArgs + 4); |
| 124 | int Mode = WASM_DEREF(int, VarArgs + 8); |
| 125 | const char *Path = WASM_REF(char, WasmPath); |
| 126 | |
| 127 | fprintf(stderr, "sys_open(%s, %d, %d)\n", Path, Flags, Mode); |
| 128 | |
| 129 | return open(Path, Flags, Mode); |
| 130 | } |
| 131 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 132 | /// sys_getpid |
| 133 | int env$$__syscall20(int Which, int VarArgs) { |
| 134 | (void)Which; |
| 135 | (void)VarArgs; |
| 136 | |
| 137 | return getpid(); |
| 138 | } |
| 139 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 140 | /// sys_ioctl |
| 141 | int env$$__syscall54(int A, int B) { |
| 142 | int Fd = WASM_DEREF(int, B + 0 * sizeof(int)); |
| 143 | int Op = WASM_DEREF(int, B + 1 * sizeof(int)); |
| 144 | int ArgP = WASM_DEREF(int, B + 2 * sizeof(int)); |
| 145 | // TODO (eholk): implement sys_ioctl |
| 146 | return -ENOTTY; |
| 147 | } |
| 148 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 149 | /// sys_write |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 150 | int env$$__syscall146(int Which, int VarArgs) { |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 151 | |
| 152 | int Fd = WASM_DEREF(int, VarArgs); |
| 153 | int Iov = WASM_DEREF(int, VarArgs + sizeof(int)); |
| 154 | int Iovcnt = WASM_DEREF(int, VarArgs + 2 * sizeof(int)); |
| 155 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 156 | int Count = 0; |
| 157 | |
| 158 | for (int I = 0; I < Iovcnt; ++I) { |
| 159 | void *Ptr = WASM_REF(void, WASM_DEREF(int, Iov + I * 8)); |
| 160 | int Length = WASM_DEREF(int, Iov + I * 8 + 4); |
| 161 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 162 | int Curr = write(Fd, Ptr, Length); |
| 163 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 164 | if (Curr < 0) { |
| 165 | return -1; |
| 166 | } |
| 167 | Count += Curr; |
| 168 | } |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 169 | return Count; |
| 170 | } |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 171 | } // end of extern "C" |