about summary refs log tree commit diff stats
path: root/subx
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-06-28 16:12:33 -0700
committerKartik Agaram <vc@akkartik.com>2018-06-28 16:12:33 -0700
commite0d71f95c7943f9c6aeaa5c84970c867b0cd6398 (patch)
tree08d8fb34d7d3ee724f559c38ff26f22ebe305707 /subx
parent508bd3ade51a4975d19a61f2b7ef67cc7137ae20 (diff)
downloadmu-e0d71f95c7943f9c6aeaa5c84970c867b0cd6398.tar.gz
4284 - implement first syscall for subx
Hopefully I won't need much more than exit, read and write.
Diffstat (limited to 'subx')
-rw-r--r--subx/019syscalls.cc19
-rw-r--r--subx/020elf.cc1
2 files changed, 20 insertions, 0 deletions
diff --git a/subx/019syscalls.cc b/subx/019syscalls.cc
new file mode 100644
index 00000000..96c11ee0
--- /dev/null
+++ b/subx/019syscalls.cc
@@ -0,0 +1,19 @@
+:(before "End Single-Byte Opcodes")
+case 0xcd: {  // int imm8 (software interrupt)
+  uint8_t code = next();
+  if (code != 0x80) {
+    raise << "Unimplemented interrupt code " << HEXBYTE << code << '\n' << end();
+    raise << "  Only `int 80h` supported for now.\n" << end();
+    break;
+  }
+  process_int80();
+  break;
+}
+
+:(code)
+void process_int80() {
+  switch (Reg[EAX].u) {
+  case 1:
+    exit(Reg[EBX].u);
+  }
+}
diff --git a/subx/020elf.cc b/subx/020elf.cc
index e217755f..3c9d6262 100644
--- a/subx/020elf.cc
+++ b/subx/020elf.cc
@@ -8,6 +8,7 @@ if (is_equal(argv[1], "run")) {
   load_elf(argv[2]);
   while (EIP < End_of_program)  // weak final-gasp termination check
     run_one_instruction();
+  raise << "executed past end of the world: " << EIP << " vs " << End_of_program << '\n' << end();
 }
 
 :(code)