Support calling EFI functions directly from Forth
authorJonas Hvid <mail@johv.dk>
Mon, 5 Oct 2020 01:33:07 +0000 (03:33 +0200)
committerJonas Hvid <mail@johv.dk>
Mon, 5 Oct 2020 01:33:17 +0000 (03:33 +0200)
Obviously, this doesn't work with the Linux backend. Maybe we'll have to remove
that again, since it would basically require a UEFI emulator.

main.asm
uefi.f [new file with mode: 0644]

index 93e576fe684543b77547aa936a2b74a109e34116..54b2a5dfd8c21cf4e7de8ef30c7470ab5c3ecac0 100644 (file)
--- a/main.asm
+++ b/main.asm
@@ -588,6 +588,27 @@ forth MAIN, 'MAIN'
   dq BRANCH, -8 * 2
   dq TERMINATE
 
+;; EFI:
+
+forth EFI_SYSTEM_TABLE_CONSTANT, 'SystemTable'
+  dq LIT, system_table, GET
+  dq EXIT
+
+forth_asm EFICALL2, 'EFICALL2'
+  pop rax ; function pointer
+  pop rdx ; 2nd argument
+  pop rcx ; 1st argument
+
+  push rsi
+
+  sub rsp, 32
+  call rax
+  add rsp, 32
+
+  pop rsi
+
+  next
+
 ;; Built-in variables:
 
 forth STATE, 'STATE'
@@ -665,6 +686,6 @@ return_stack_top:
 ;; include the file directly in the binary, and then interpret it at startup.
 sysf:
 file 'sys.f'
-file 'example.f'
+file 'uefi.f'
 sysf.len = $ - sysf
 
diff --git a/uefi.f b/uefi.f
new file mode 100644 (file)
index 0000000..bc030d1
--- /dev/null
+++ b/uefi.f
@@ -0,0 +1,7 @@
+: ConOut SystemTable 64 + @ ;
+: ConOut.OutputString ConOut 8 + @ ;
+: ConOut.OutputString() ConOut SWAP ConOut.OutputString EFICALL2 ;
+
+HERE @
+  97 C, 0 C, 98 C, 0 C, 99 C, 0 C, \ "ABC\0"
+ConOut.OutputString()