summaryrefslogtreecommitdiffstats
path: root/libc-bottom-half/sources/sbrk.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc-bottom-half/sources/sbrk.c')
-rw-r--r--libc-bottom-half/sources/sbrk.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/libc-bottom-half/sources/sbrk.c b/libc-bottom-half/sources/sbrk.c
new file mode 100644
index 0000000..a26b75e
--- /dev/null
+++ b/libc-bottom-half/sources/sbrk.c
@@ -0,0 +1,32 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <__macro_PAGESIZE.h>
+
+// Bare-bones implementation of sbrk.
+void *sbrk(intptr_t increment) {
+ // sbrk(0) returns the current memory size.
+ if (increment == 0) {
+ // The wasm spec doesn't guarantee that memory.grow of 0 always succeeds.
+ return (void *)(__builtin_wasm_memory_size(0) * PAGESIZE);
+ }
+
+ // We only support page-size increments.
+ if (increment % PAGESIZE != 0) {
+ abort();
+ }
+
+ // WebAssembly doesn't support shrinking linear memory.
+ if (increment < 0) {
+ abort();
+ }
+
+ uintptr_t old = __builtin_wasm_memory_grow(0, (uintptr_t)increment / PAGESIZE);
+
+ if (old == SIZE_MAX) {
+ errno = ENOMEM;
+ return (void *)-1;
+ }
+
+ return (void *)(old * PAGESIZE);
+}