tmp
authorJack Miller <jack@codezen.org>
Sat, 17 Dec 2016 23:42:10 +0000 (17:42 -0600)
committerJack Miller <jack@codezen.org>
Sat, 17 Dec 2016 23:42:10 +0000 (17:42 -0600)
Makefile
vua/vua.c
vua/vua_parse.c
vua/vua_parse.h
vua/vua_vm.asm [new file with mode: 0644]
vua/vua_vm.h [new file with mode: 0644]

index 521bd5c..711aa79 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ ASFLAGS =
 SRC_C = $(wildcard kernel/*.c kernel/platforms/*.c kernel/platforms/*/*.c mm/*.c vua/*.c)
 OBJ_C = ${SRC_C:.c=.o}
 
-SRC_ASM = $(wildcard asm/*.asm kernel/platforms/efi/*.asm)
+SRC_ASM = $(wildcard asm/*.asm vua/*.asm kernel/platforms/efi/*.asm)
 OBJ_ASM = ${SRC_ASM:.asm=.o}
 
 SRC = ${SRC_C} ${SRC_ASM}
index 94488bc..5d98496 100644 (file)
--- a/vua/vua.c
+++ b/vua/vua.c
@@ -7,15 +7,21 @@
 #include "vua_obj.h"
 #include "vua_hash.h"
 #include "vua_parse.h"
+#include "vua_vm.h"
 #include "vua_test.h"
 
 char *test_prog = "function a() local a = 2; local x = 1; function b() y = 0; x = a; end end\na()";
 
 void vua_init(void)
 {
+    vua_state_t *state = NULL;
+    vua_proto_t *program;
+
     vua_test();
 
-    vua_parse((u8 *) test_prog, strlen(test_prog));
+    vua_parse((u8 *) test_prog, strlen(test_prog), &program);
+
+    vm_entry(state, program);
 }
 
 #ifdef TEST_VUA
index 4f92300..949c2fc 100644 (file)
@@ -967,10 +967,9 @@ static int __parse_body(parser_t *parser, expr_t *expr, int needself)
  * vararg function with no defined params.
  */
 
-int vua_parse(u8 *input_data, u64 len)
+int vua_parse(u8 *input_data, u64 len, vua_proto_t **proto)
 {
     parser_t *state = objcache_get(&parser_cache, sizeof(parser_t));
-    vua_proto_t *proto;
 
     if(!state)
         return -1;
@@ -993,11 +992,11 @@ int vua_parse(u8 *input_data, u64 len)
 
     __parse_chunk(state);
 
-    proto = __prototype(state);
+    *proto = __prototype(state);
 
     printk("\n\n");
 
-    vua_bc_dump(proto);
+    vua_bc_dump(*proto);
 
     return 0;
 }
index 2ec9bde..d850216 100644 (file)
@@ -81,4 +81,4 @@ static const prio_t priority[] = {
 
 u32 vua_parse_expr_binop(parser_t *parser, expr_t *expr, u32 prio);
 int vua_parse_expr(parser_t *parser, expr_t *expr);
-int vua_parse(u8 *input_data, u64 len);
+int vua_parse(u8 *input_data, u64 len, vua_proto_t **proto);
diff --git a/vua/vua_vm.asm b/vua/vua_vm.asm
new file mode 100644 (file)
index 0000000..6795c78
--- /dev/null
@@ -0,0 +1,21 @@
+/* vim: set ts=4 sw=4 sts=4 et : */
+/* VuaVM - basic bytecode interpreter for Vua */
+
+/* Obviously inspired by LuaJIT, but since we can count on never encountering
+ * a C function that isn't under control we have much more freedom about ABI
+ * conventions and can potentially use every register as we please.
+ */
+
+/* Some lessons learned from reading LuaJIT:
+ *
+ * - Branch predictability is paramount, which is why instruction dispatch is
+ * done in place rather than at the top of a big unpredictable loop.
+ */
+
+.macro next_ins
+    
+.endm
+
+.global vm_entry
+vm_entry:
+    jmp .
diff --git a/vua/vua_vm.h b/vua/vua_vm.h
new file mode 100644 (file)
index 0000000..3eee47c
--- /dev/null
@@ -0,0 +1,20 @@
+/* vim: set ts=4 sw=4 sts=4 et : */
+
+#pragma once
+
+#include "vua_obj.h"
+
+/* Encapsulate a stopped interpreter thread */
+
+typedef struct vua_thread {
+    BCIns *pc;
+    void *stack;
+} vua_thread_t;
+
+/* Encapsulate a running interpreter context */
+
+typedef struct vua_state {
+    vua_thread_t thread;
+} vua_state_t;
+
+extern u64 vm_entry(vua_state_t *state, vua_proto_t *proto);