+;; vim: syntax=fasm
+
+include "uefi.asm"
+
+;; "Syscalls" {{{
+
+;; [NOTE] Volatile registers Linux (syscalls) vs UEFI
+;;
+;; Linux syscalls: RAX, RCX, R11
+;; UEFI: RAX, RCX, R11, RDX, R8, R9, R10
+
+;; We are in the process of replacing our dependency on Linux with a dependency
+;; on UEFI. The following macros attempt to isolate what would be syscalls in
+;; Linux; thus, we will be able to replace these with UEFI-based implementations,
+;; and in theory we should expect the program to work.
+
+;; Print a string of a given length.
+;;
+;; Input:
+;; - RCX = Pointer to buffer
+;; - RDX = Buffer length
+;;
+;; Clobbers: RAX, RCX, R11, RDI, RSI
+macro sys_print_string {
+ push r8
+ push r9
+ push r10
+
+ call uefi_print_string
+
+ pop r10
+ pop r9
+ pop r8
+}
+
+;; Read a character from the user into the given buffer.
+;;
+;; Input:
+;; - RSI = Character buffer
+;;
+;; Output:
+;; - BYTE [RSI] = Character
+;;
+;; Clobbers: RAX, RCX, R11, RDI, RSI, RDX
+macro sys_read_char {
+ push rbx
+ push r8
+ push r9
+ push r10
+ push r15
+
+ mov rcx, rsi
+ call uefi_read_char
+
+ pop r15
+ pop r10
+ pop r9
+ pop r8
+ pop rbx
+}
+
+macro sys_terminate code {
+ mov rax, code
+ call uefi_terminate
+}
+
+;; }}}