uefi64.inc
mxlgv_KolibriDev/src/kernel/bootloader/uefi4kos/uefi64.inc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2020. All rights reserved.      ;;
;; Distributed under terms of the GNU General Public License    ;;
;; Version 2, or (at your option) any later version.            ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Based on UEFI library for fasm by bzt, Public Domain.        ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DN fix dq       ; native

include "uefi.inc"

EFIERR = 0x8000000000000000

struct EFI_SYSTEM_TABLE
  Hdr                   EFI_TABLE_HEADER
  FirmwareVendor        dq ?
  FirmwareRevision      dd ?
                        dd ?
  ConsoleInHandle       dq ?
  ConIn                 dq ?
  ConsoleOutHandle      dq ?
  ConOut                dq ?
  StandardErrorHandle   dq ?
  StdErr                dq ?
  RuntimeServices       dq ?
  BootServices          dq ?
  NumberOfTableEntries  dq ?
  ConfigurationTable    dq ?
ends

struct EFI_LOADED_IMAGE_PROTOCOL
  Revision              dd ?
                        dd ?
  ParentHandle          dq ?
  SystemTable           dq ?
  DeviceHandle          dq ?
  FilePath              dq ?
  Reserved              dq ?
  LoadOptionsSize       dd ?
                        dd ?
  ImageBase             dq ?
  ImageSize             dq ?
  ImageCodeType         dd ?
  ImageDataType         dd ?
  UnLoad                dq ?
ends

macro eficall interface,function,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11
{
numarg = 0

if ~ arg11 eq
  numarg = numarg + 1
  if ~ arg11 eq rdi
        mov     rdi, arg11
  end if
end if

if ~ arg10 eq
  numarg = numarg + 1
  if ~ arg10 eq rsi
        mov     rsi, arg10
  end if
end if

if ~ arg9 eq
  numarg = numarg + 1
  if ~ arg9 eq r14
        mov     r14, arg9
  end if
end if

if ~ arg8 eq
  numarg = numarg + 1
  if ~ arg8 eq r13
        mov     r13, arg8
  end if
end if

if ~ arg7 eq
  numarg = numarg + 1
  if ~ arg7 eq r12
        mov     r12, arg7
  end if
end if

if ~ arg6 eq
  numarg = numarg + 1
  if ~ arg6 eq r11
        mov     r11, arg6
  end if
end if

if ~ arg5 eq
  numarg = numarg + 1
  if ~ arg5 eq r10
        mov     r10, arg5
  end if
end if

if ~ arg4 eq
  numarg = numarg + 1
  if ~ arg4 eq r9
        mov     r9, arg4
  end if
end if

if ~ arg3 eq
  numarg = numarg + 1
  if ~ arg3 eq r8
        mov     r8, arg3
  end if
end if

if ~ arg2 eq
  numarg = numarg + 1
  if ~ arg2 eq rdx
        mov     rdx, arg2
  end if
end if

if ~ arg1 eq
  numarg = numarg + 1
  if ~ arg1 eq rcx
        mov     rcx, arg1
  end if
end if

        xor     eax, eax
        mov     al, numarg

if ~ interface eq rbx
        mov     rbx, interface
end if

        mov     rbx, [rbx + function]
        call    uefifunc
}

section '.text' code executable readable

uefifunc:
        ;save stack pointer
        mov     [uefi_rsptmp], rsp
        ;set up new aligned stack
        and     esp, 0xFFFFFFF0
        ;alignment check on arguments
        bt      eax, 0
        jnc     @f
        push    rax
        ;arguments
@@:
        cmp     al, 11
        jb      @f
        push    rdi
@@:
        cmp     al, 10
        jb      @f
        push    rsi
@@:
        cmp     al, 9
        jb      @f
        push    r14
@@:
        cmp     al, 8
        jb      @f
        push    r13
@@:
        cmp     al, 7
        jb      @f
        push    r12
@@:
        cmp     al, 6
        jb      @f
        push    r11
@@:
        cmp     al, 5
        jb      @f
        push    r10
@@:
        ;space for
        ;r9
        ;r8
        ;rdx
        ;rcx
        sub     rsp, 4*8
        ;call function
        call    rbx
        ;restore old stack
        mov     rsp, [uefi_rsptmp]
        ret
