0,0 → 1,196 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; 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 |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |