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 | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 15 | #include <cassert> |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 16 | #include <cmath> |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 17 | // TODO (eholk): change to cstdint |
| 18 | #include <stdint.h> |
| 19 | |
| 20 | namespace { |
| 21 | uint32_t HeapBreak; |
| 22 | |
| 23 | // TODO (eholk): make all of these constexpr. |
| 24 | const uint32_t PageSizeLog2 = 16; |
| 25 | const uint32_t PageSize = 1 << PageSizeLog2; // 64KB |
| 26 | const uint32_t StackPtrLoc = 1024; // defined by emscripten |
| 27 | |
| 28 | uint32_t pageNum(uint32_t Index) { return Index >> PageSizeLog2; } |
| 29 | } // end of anonymous namespace |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 30 | |
| 31 | namespace env { |
| 32 | double floor(double X) { return std::floor(X); } |
| 33 | |
| 34 | float floor(float X) { return std::floor(X); } |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 35 | } // end of namespace env |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 36 | |
| 37 | // TODO (eholk): move the C parts outside and use C++ name mangling. |
| 38 | extern "C" { |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 39 | #include <errno.h> |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 40 | #include <fcntl.h> |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 41 | #include <math.h> |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 42 | #include <stdio.h> |
| 43 | #include <stdlib.h> |
| 44 | #include <string.h> |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 45 | #include <sys/types.h> |
| 46 | #include <sys/stat.h> |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 47 | #include <unistd.h> |
| 48 | |
| 49 | extern char WASM_MEMORY[]; |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 50 | extern uint32_t WASM_DATA_SIZE; |
| 51 | extern uint32_t WASM_NUM_PAGES; |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 52 | |
| 53 | void env$$abort() { |
| 54 | fprintf(stderr, "Aborting...\n"); |
| 55 | abort(); |
| 56 | } |
| 57 | |
| 58 | void env$$_abort() { env$$abort(); } |
| 59 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 60 | double env$$floor_f(float X) { return env::floor(X); } |
| 61 | double env$$floor_d(double X) { return env::floor(X); } |
| 62 | |
John Porto | a4d100a | 2016-04-18 15:32:27 -0700 | [diff] [blame] | 63 | void env$$exit(int Status) { exit(Status); } |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 64 | void env$$_exit(int Status) { env$$exit(Status); } |
| 65 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 66 | #define UNIMPLEMENTED(f) \ |
| 67 | void env$$##f() { \ |
| 68 | fprintf(stderr, "Unimplemented: " #f "\n"); \ |
| 69 | abort(); \ |
| 70 | } |
| 71 | |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 72 | int32_t env$$sbrk(int32_t Increment) { |
| 73 | HeapBreak += Increment; |
| 74 | return HeapBreak; |
| 75 | } |
| 76 | |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 77 | UNIMPLEMENTED(setjmp) |
| 78 | UNIMPLEMENTED(longjmp) |
| 79 | UNIMPLEMENTED(__assert_fail) |
| 80 | UNIMPLEMENTED(__builtin_malloc) |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 81 | UNIMPLEMENTED(__builtin_isinff) |
| 82 | UNIMPLEMENTED(__builtin_isinfl) |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 83 | UNIMPLEMENTED(__builtin_apply) |
| 84 | UNIMPLEMENTED(__builtin_apply_args) |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 85 | UNIMPLEMENTED(pthread_cleanup_push) |
| 86 | UNIMPLEMENTED(pthread_cleanup_pop) |
| 87 | UNIMPLEMENTED(pthread_self) |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 88 | UNIMPLEMENTED(__floatditf) |
| 89 | UNIMPLEMENTED(__floatsitf) |
| 90 | UNIMPLEMENTED(__fixtfdi) |
| 91 | UNIMPLEMENTED(__fixtfsi) |
| 92 | UNIMPLEMENTED(__fixsfti) |
| 93 | UNIMPLEMENTED(__netf2) |
| 94 | UNIMPLEMENTED(__getf2) |
| 95 | UNIMPLEMENTED(__eqtf2) |
| 96 | UNIMPLEMENTED(__lttf2) |
| 97 | UNIMPLEMENTED(__addtf3) |
| 98 | UNIMPLEMENTED(__subtf3) |
| 99 | UNIMPLEMENTED(__divtf3) |
| 100 | UNIMPLEMENTED(__multf3) |
| 101 | UNIMPLEMENTED(__multi3) |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 102 | UNIMPLEMENTED(__lock) |
| 103 | UNIMPLEMENTED(__unlock) |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 104 | UNIMPLEMENTED(__syscall6) // sys_close |
| 105 | UNIMPLEMENTED(__syscall140) // sys_llseek |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 106 | UNIMPLEMENTED(__unordtf2) |
| 107 | UNIMPLEMENTED(__fixunstfsi) |
| 108 | UNIMPLEMENTED(__floatunsitf) |
| 109 | UNIMPLEMENTED(__extenddftf2) |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 110 | |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 111 | void *wasmPtr(uint32_t Index) { |
| 112 | if (pageNum(Index) < WASM_NUM_PAGES) { |
| 113 | return WASM_MEMORY + Index; |
| 114 | } |
| 115 | abort(); |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 116 | } |
| 117 | |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 118 | extern int __szwasm_main(int, const char **); |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 119 | |
| 120 | #define WASM_REF(Type, Index) ((Type *)wasmPtr(Index)) |
| 121 | #define WASM_DEREF(Type, Index) (*WASM_REF(Type, Index)) |
| 122 | |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 123 | int main(int argc, const char **argv) { |
| 124 | // Initialize the break to the nearest page boundary after the data segment |
| 125 | HeapBreak = (WASM_DATA_SIZE + PageSize - 1) & ~(PageSize - 1); |
| 126 | |
| 127 | // Initialize the stack pointer. |
| 128 | WASM_DEREF(int32_t, StackPtrLoc) = WASM_NUM_PAGES << PageSizeLog2; |
| 129 | |
| 130 | return __szwasm_main(argc, argv); |
| 131 | } |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 132 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 133 | int env$$abs(int a) { return abs(a); } |
| 134 | |
| 135 | double env$$pow(double x, double y) { return pow(x, y); } |
| 136 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 137 | /// sys_write |
| 138 | int env$$__syscall4(int Which, int VarArgs) { |
| 139 | int Fd = WASM_DEREF(int, VarArgs + 0 * sizeof(int)); |
| 140 | int Buffer = WASM_DEREF(int, VarArgs + 1 * sizeof(int)); |
| 141 | int Length = WASM_DEREF(int, VarArgs + 2 * sizeof(int)); |
| 142 | |
| 143 | return write(Fd, WASM_REF(char *, Buffer), Length); |
| 144 | } |
| 145 | |
Eric Holk | 085bdae | 2016-04-18 15:08:19 -0700 | [diff] [blame] | 146 | /// sys_open |
| 147 | int env$$__syscall5(int Which, int VarArgs) { |
| 148 | int WasmPath = WASM_DEREF(int, VarArgs); |
| 149 | int Flags = WASM_DEREF(int, VarArgs + 4); |
| 150 | int Mode = WASM_DEREF(int, VarArgs + 8); |
| 151 | const char *Path = WASM_REF(char, WasmPath); |
| 152 | |
| 153 | fprintf(stderr, "sys_open(%s, %d, %d)\n", Path, Flags, Mode); |
| 154 | |
| 155 | return open(Path, Flags, Mode); |
| 156 | } |
| 157 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 158 | /// sys_getpid |
| 159 | int env$$__syscall20(int Which, int VarArgs) { |
| 160 | (void)Which; |
| 161 | (void)VarArgs; |
| 162 | |
| 163 | return getpid(); |
| 164 | } |
| 165 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 166 | /// sys_ioctl |
| 167 | int env$$__syscall54(int A, int B) { |
| 168 | int Fd = WASM_DEREF(int, B + 0 * sizeof(int)); |
| 169 | int Op = WASM_DEREF(int, B + 1 * sizeof(int)); |
| 170 | int ArgP = WASM_DEREF(int, B + 2 * sizeof(int)); |
| 171 | // TODO (eholk): implement sys_ioctl |
| 172 | return -ENOTTY; |
| 173 | } |
| 174 | |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 175 | /// sys_write |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 176 | int env$$__syscall146(int Which, int VarArgs) { |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 177 | |
| 178 | int Fd = WASM_DEREF(int, VarArgs); |
| 179 | int Iov = WASM_DEREF(int, VarArgs + sizeof(int)); |
| 180 | int Iovcnt = WASM_DEREF(int, VarArgs + 2 * sizeof(int)); |
| 181 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 182 | int Count = 0; |
| 183 | |
| 184 | for (int I = 0; I < Iovcnt; ++I) { |
| 185 | void *Ptr = WASM_REF(void, WASM_DEREF(int, Iov + I * 8)); |
| 186 | int Length = WASM_DEREF(int, Iov + I * 8 + 4); |
| 187 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 188 | int Curr = write(Fd, Ptr, Length); |
| 189 | |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 190 | if (Curr < 0) { |
| 191 | return -1; |
| 192 | } |
| 193 | Count += Curr; |
| 194 | } |
Eric Holk | 67c7c41 | 2016-04-15 13:05:37 -0700 | [diff] [blame] | 195 | return Count; |
| 196 | } |
Eric Holk | 4aae81a | 2016-04-25 12:52:49 -0700 | [diff] [blame^] | 197 | |
| 198 | /// sys_mmap_pgoff |
| 199 | int env$$__syscall192(int Which, int VarArgs) { |
| 200 | (void)Which; |
| 201 | (void)VarArgs; |
| 202 | |
| 203 | // TODO (eholk): figure out how to implement this. |
| 204 | |
| 205 | return -ENOMEM; |
| 206 | } |
Eric Holk | 29acb57 | 2016-04-22 09:34:41 -0700 | [diff] [blame] | 207 | } // end of extern "C" |