Move lisp to single-dword value type
diff --git a/src/lisp/plat/linux.c b/src/lisp/plat/linux.c
new file mode 100644
index 0000000..23f7f82
--- /dev/null
+++ b/src/lisp/plat/linux.c
@@ -0,0 +1,29 @@
+#include "plat.h"
+#include <stdlib.h>
+#include <string.h>
+
+void *malloc_aligned (size_t size)
+{
+	void *mem = malloc (size + 8 + sizeof (void *) * 2);
+	void **aligned_ptr = (void **) ((uintptr_t) (mem + 8 + sizeof (void *)) & ~7);
+	aligned_ptr[ -1 ] = mem;
+	aligned_ptr[ -2 ] = (void *) size;
+	return aligned_ptr;
+}
+
+void *realloc_aligned (void *addr, size_t size)
+{
+	void *mem = malloc (size + 8 + sizeof (void *) * 2);
+	void **aligned_ptr = (void **) ((uintptr_t) (mem + 8 + sizeof (void *)) & ~7);
+	aligned_ptr[ -1 ] = mem;
+
+	memcpy (aligned_ptr, addr, (uintptr_t) aligned_ptr[ -2 ]);
+	
+	return aligned_ptr;
+}
+
+void free_aligned (void *addr)
+{
+	void **ptr = (void **)addr;
+	free (ptr[ -1 ]);
+}
diff --git a/src/lisp/plat/plat.h b/src/lisp/plat/plat.h
new file mode 100644
index 0000000..227e0d2
--- /dev/null
+++ b/src/lisp/plat/plat.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include <stdint.h>
+#include <stddef.h>
+
+/* Platform specific definitions */
+
+// Must return an address aligned to 8 bytes
+void *malloc_aligned (size_t size);
+void *realloc_aligned (void *addr, size_t size);
+void free_aligned (void *addr);