audk/UnixPkg/Sec/X64/MangleGasket.S

785 lines
16 KiB
ArmAsm
Raw Normal View History

#------------------------------------------------------------------------------
#
# This template was generated from GasketEfiTemplate.c Unix x86_64 ABI
#
# The EFI_UNIX_THUNK_PROTOCOL member functions call these these generic assembly
# routines.
#
# Some OS X POSIX calls get name mangled in C code and we need to fill in a C global
# to get the correct binding (does not work from assembly). So we have 4 functions
# that do an indirect call, while the others call POSIX APIs directly
#
# movq _gUnixRmDir@GOTPCREL(%rip), %rax
#
#
# UNIX Arg passing: RCX, RDX, R8, R9
# EFI Arg passing: RDI, RSI, RDX, RCX, R8, R9
# Callee allocates 32 bytes on stack to spill registers
# RSI, RDI calle-save on EFI, scatch on UNIX callign
#
#
# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#------------------------------------------------------------------------------
//
// Gaskets are EFI ABI to UNIX ABI calls
// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.
//
.text
// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,
// 7 or 8 args is 72, and 9 or 10 args is 88
#define EFI_STACK_SHADOW_SPACE 40
#define EFI_STACK_SHADOW_SPACE_5_6 56
#define EFI_STACK_SHADOW_SPACE_7_8 72
#define EFI_STACK_SHADOW_SPACE_9_10 88
.text
.globl _Gasketrmdir
_Gasketrmdir:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq _gUnixRmDir@GOTPCREL(%rip), %rax // Get function name mangled by C
movq (%rax), %rax
call *%rax
pushq %rdi // restore state
pushq %rsi
ret
.globl _Gasketopendir
_Gasketopendir:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq _gUnixOpenDir@GOTPCREL(%rip), %rax // Get function name mangled by C
movq (%rax), %rax
call *%rax
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketstat
_Gasketstat:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq _gUnixStat@GOTPCREL(%rip), %rax // Get function name mangled by C
movq (%rax), %rax
call *%rax
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketstatfs
_Gasketstatfs:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq _gUnixStatFs@GOTPCREL(%rip), %rax // Get function name mangled by C
movq (%rax), %rax
call *%rax
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketrewinddir
_Gasketrewinddir:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq _gUnixRewinddir@GOTPCREL(%rip), %rax // Get function name mangled by C
movq (%rax), %rax
call *%rax
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketreaddir
_Gasketreaddir:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq _gUnixReaddir@GOTPCREL(%rip), %rax // Get function name mangled by C
movq (%rax), %rax
call *%rax
popq %rdi // restore state
popq %rsi
ret
.globl _GasketmsSleep
_GasketmsSleep:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _msSleep
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketexit
_Gasketexit:
movq %rcx, %rdi // Swizzle args
call _exit // Less to do as we will never return to EFI ABI world
LDEAD_LOOP:
jmp LDEAD_LOOP: // _exit should never return
.globl _GasketSetTimer
_GasketSetTimer:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _SetTimer
popq %rdi // restore state
popq %rsi
ret
.globl _GasketGetLocalTime
_GasketGetLocalTime:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _GetLocalTime
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketgmtime
_Gasketgmtime:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _localtime
popq %rdi // restore state
popq %rsi
ret
.globl _GasketGetTimeZone
_GasketGetTimeZone:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
call _GetTimeZone
popq %rdi // restore state
popq %rsi
ret
.globl _GasketGetDayLight
_GasketGetDayLight:
LFB26:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
call _GetDayLight
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketpoll
_Gasketpoll:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _poll
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketread
_Gasketread:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _read
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketwrite
_Gasketwrite:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _write
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketgetenv
_Gasketgetenv:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _getenv
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketopen
_Gasketopen:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _open
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketlseek
_Gasketlseek:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _lseek
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketftruncate
_Gasketftruncate:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _ftruncate
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketclose
_Gasketclose:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _close
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketmkdir
_Gasketmkdir:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _mkdir
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketunlink
_Gasketunlink:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _unlink
popq %rdi // restore state
popq %rsi
ret
.globl _GasketGetErrno
_GasketGetErrno:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
call _GetErrno
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketclosedir
_Gasketclosedir:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _closedir
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketrename
_Gasketrename:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _rename
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketmktime
_Gasketmktime:
LFB42:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _mktime
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketfsync
_Gasketfsync:
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _fsync
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketchmod
_Gasketchmod:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _chmod
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketutime
_Gasketutime:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _utime
popq %rdi // restore state
popq %rsi
ret
.globl _Gaskettcflush
_Gaskettcflush:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _tcflush
popq %rdi // restore state
popq %rsi
ret
call
.globl _GasketUgaCreate
_GasketUgaCreate:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _UgaCreate
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketperror
_Gasketperror:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _perror
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketioctl
_Gasketioctl:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _UnixIoCtl1
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketfcntl
_Gasketfcntl:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _UnixFctl1
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketcfsetispeed
_Gasketcfsetispeed:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _cfsetispeed
popq %rdi // restore state
popq %rsi
ret
.globl _Gasketcfsetospeed
_Gasketcfsetospeed:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _cfsetospeed
popq %rdi // restore state
popq %rsi
ret
.globl _Gaskettcgetattr
_Gaskettcgetattr:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _tcgetattr
popq %rdi // restore state
popq %rsi
ret
.globl _Gaskettcsetattr
_Gaskettcsetattr:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _tcsetattr
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUnixPeCoffGetEntryPoint
_GasketUnixPeCoffGetEntryPoint:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _SecPeCoffGetEntryPoint
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUnixPeCoffRelocateImageExtraAction
_GasketUnixPeCoffRelocateImageExtraAction:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _SecPeCoffRelocateImageExtraAction
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUnixPeCoffUnloadImageExtraAction
_GasketUnixPeCoffUnloadImageExtraAction:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _SecPeCoffLoaderUnloadImageExtraAction
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUgaClose
_GasketUgaClose:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _UgaClose
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUgaSize
_GasketUgaSize:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
call _UgaSize
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUgaCheckKey
_GasketUgaCheckKey:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
call _UgaCheckKey
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUgaGetKey
_GasketUgaGetKey:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
call _UgaGetKey
popq %rdi // restore state
popq %rsi
ret
.globl _GasketUgaBlt
_GasketUgaBlt:
pushq %rsi // %rsi & %rdi are volatie in Unix and callee-save in EFI ABI
pushq %rdi
movq %rcx, %rdi // Swizzle args
movq %rdx, %rsi
movq %r8, %rdx
movq %r9, %rcx
call _UgaBlt
popq %rdi // restore state
popq %rsi
//
// UNIX ABI to EFI ABI call
//
// UINTN
// ReverseGasketUint64 (
// void *Api,
// UINTN Arg1,
// UINTN Arg2,
// UINTN Arg3
// );
.globl _ReverseGasketUint64
_ReverseGasketUint64:
movq %rdi, %rax // Swizzle args
movq %rsi, %r9
// movq %rdx, %rdx
movq %rcx, %r8
movq %r9, %rcx
subq 40, %rsp // 32-byte shadow space plus alignment pad
call *%rax
addq 40, %rsp
ret