blob: d867509ea51d1bf88a579f02d02232f3043b27dc [file] [log] [blame]
Eric Holk29acb572016-04-22 09:34:41 -07001//===- subzero/runtime/wasm-runtime.cpp - Subzero WASM runtime source -----===//
Eric Holk67c7c412016-04-15 13:05:37 -07002//
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 Holk4aae81a2016-04-25 12:52:49 -070015#include <cassert>
Eric Holk29acb572016-04-22 09:34:41 -070016#include <cmath>
Eric Holk4aae81a2016-04-25 12:52:49 -070017// TODO (eholk): change to cstdint
18#include <stdint.h>
19
20namespace {
21uint32_t HeapBreak;
22
23// TODO (eholk): make all of these constexpr.
24const uint32_t PageSizeLog2 = 16;
25const uint32_t PageSize = 1 << PageSizeLog2; // 64KB
26const uint32_t StackPtrLoc = 1024; // defined by emscripten
27
28uint32_t pageNum(uint32_t Index) { return Index >> PageSizeLog2; }
29} // end of anonymous namespace
Eric Holk29acb572016-04-22 09:34:41 -070030
31namespace env {
32double floor(double X) { return std::floor(X); }
33
34float floor(float X) { return std::floor(X); }
Eric Holk4aae81a2016-04-25 12:52:49 -070035} // end of namespace env
Eric Holk29acb572016-04-22 09:34:41 -070036
37// TODO (eholk): move the C parts outside and use C++ name mangling.
38extern "C" {
Eric Holk67c7c412016-04-15 13:05:37 -070039#include <errno.h>
Eric Holk085bdae2016-04-18 15:08:19 -070040#include <fcntl.h>
Eric Holk29acb572016-04-22 09:34:41 -070041#include <math.h>
Eric Holk67c7c412016-04-15 13:05:37 -070042#include <stdio.h>
43#include <stdlib.h>
44#include <string.h>
Eric Holk085bdae2016-04-18 15:08:19 -070045#include <sys/types.h>
46#include <sys/stat.h>
Eric Holk67c7c412016-04-15 13:05:37 -070047#include <unistd.h>
48
49extern char WASM_MEMORY[];
Eric Holk4aae81a2016-04-25 12:52:49 -070050extern uint32_t WASM_DATA_SIZE;
51extern uint32_t WASM_NUM_PAGES;
Eric Holk67c7c412016-04-15 13:05:37 -070052
53void env$$abort() {
54 fprintf(stderr, "Aborting...\n");
55 abort();
56}
57
58void env$$_abort() { env$$abort(); }
59
Eric Holk29acb572016-04-22 09:34:41 -070060double env$$floor_f(float X) { return env::floor(X); }
61double env$$floor_d(double X) { return env::floor(X); }
62
John Portoa4d100a2016-04-18 15:32:27 -070063void env$$exit(int Status) { exit(Status); }
Eric Holk085bdae2016-04-18 15:08:19 -070064void env$$_exit(int Status) { env$$exit(Status); }
65
Eric Holk67c7c412016-04-15 13:05:37 -070066#define UNIMPLEMENTED(f) \
67 void env$$##f() { \
68 fprintf(stderr, "Unimplemented: " #f "\n"); \
69 abort(); \
70 }
71
Eric Holk4aae81a2016-04-25 12:52:49 -070072int32_t env$$sbrk(int32_t Increment) {
73 HeapBreak += Increment;
74 return HeapBreak;
75}
76
Eric Holk085bdae2016-04-18 15:08:19 -070077UNIMPLEMENTED(setjmp)
78UNIMPLEMENTED(longjmp)
79UNIMPLEMENTED(__assert_fail)
80UNIMPLEMENTED(__builtin_malloc)
Eric Holk29acb572016-04-22 09:34:41 -070081UNIMPLEMENTED(__builtin_isinff)
82UNIMPLEMENTED(__builtin_isinfl)
Eric Holk085bdae2016-04-18 15:08:19 -070083UNIMPLEMENTED(__builtin_apply)
84UNIMPLEMENTED(__builtin_apply_args)
Eric Holk67c7c412016-04-15 13:05:37 -070085UNIMPLEMENTED(pthread_cleanup_push)
86UNIMPLEMENTED(pthread_cleanup_pop)
87UNIMPLEMENTED(pthread_self)
Eric Holk085bdae2016-04-18 15:08:19 -070088UNIMPLEMENTED(__floatditf)
89UNIMPLEMENTED(__floatsitf)
90UNIMPLEMENTED(__fixtfdi)
91UNIMPLEMENTED(__fixtfsi)
92UNIMPLEMENTED(__fixsfti)
93UNIMPLEMENTED(__netf2)
94UNIMPLEMENTED(__getf2)
95UNIMPLEMENTED(__eqtf2)
96UNIMPLEMENTED(__lttf2)
97UNIMPLEMENTED(__addtf3)
98UNIMPLEMENTED(__subtf3)
99UNIMPLEMENTED(__divtf3)
100UNIMPLEMENTED(__multf3)
101UNIMPLEMENTED(__multi3)
Eric Holk67c7c412016-04-15 13:05:37 -0700102UNIMPLEMENTED(__lock)
103UNIMPLEMENTED(__unlock)
Eric Holk29acb572016-04-22 09:34:41 -0700104UNIMPLEMENTED(__syscall6) // sys_close
105UNIMPLEMENTED(__syscall140) // sys_llseek
Eric Holk29acb572016-04-22 09:34:41 -0700106UNIMPLEMENTED(__unordtf2)
107UNIMPLEMENTED(__fixunstfsi)
108UNIMPLEMENTED(__floatunsitf)
109UNIMPLEMENTED(__extenddftf2)
Eric Holk67c7c412016-04-15 13:05:37 -0700110
Eric Holk4aae81a2016-04-25 12:52:49 -0700111void *wasmPtr(uint32_t Index) {
112 if (pageNum(Index) < WASM_NUM_PAGES) {
113 return WASM_MEMORY + Index;
114 }
115 abort();
Eric Holk67c7c412016-04-15 13:05:37 -0700116}
117
Eric Holk085bdae2016-04-18 15:08:19 -0700118extern int __szwasm_main(int, const char **);
Eric Holk67c7c412016-04-15 13:05:37 -0700119
120#define WASM_REF(Type, Index) ((Type *)wasmPtr(Index))
121#define WASM_DEREF(Type, Index) (*WASM_REF(Type, Index))
122
Eric Holk4aae81a2016-04-25 12:52:49 -0700123int 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 Holk67c7c412016-04-15 13:05:37 -0700132
Eric Holk29acb572016-04-22 09:34:41 -0700133int env$$abs(int a) { return abs(a); }
134
135double env$$pow(double x, double y) { return pow(x, y); }
136
Eric Holk67c7c412016-04-15 13:05:37 -0700137/// sys_write
138int 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 Holk085bdae2016-04-18 15:08:19 -0700146/// sys_open
147int 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 Holk29acb572016-04-22 09:34:41 -0700158/// sys_getpid
159int env$$__syscall20(int Which, int VarArgs) {
160 (void)Which;
161 (void)VarArgs;
162
163 return getpid();
164}
165
Eric Holk67c7c412016-04-15 13:05:37 -0700166/// sys_ioctl
167int 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 Holk29acb572016-04-22 09:34:41 -0700175/// sys_write
Eric Holk67c7c412016-04-15 13:05:37 -0700176int env$$__syscall146(int Which, int VarArgs) {
Eric Holk67c7c412016-04-15 13:05:37 -0700177
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 Holk67c7c412016-04-15 13:05:37 -0700182 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 Holk67c7c412016-04-15 13:05:37 -0700188 int Curr = write(Fd, Ptr, Length);
189
Eric Holk67c7c412016-04-15 13:05:37 -0700190 if (Curr < 0) {
191 return -1;
192 }
193 Count += Curr;
194 }
Eric Holk67c7c412016-04-15 13:05:37 -0700195 return Count;
196}
Eric Holk4aae81a2016-04-25 12:52:49 -0700197
198/// sys_mmap_pgoff
199int 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 Holk29acb572016-04-22 09:34:41 -0700207} // end of extern "C"