You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
6.9 KiB
165 lines
6.9 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
/*
|
|
* This header file consolidate definitions for macOS* and Linux
|
|
* running on both ia32 and intel64 architecture.
|
|
*/
|
|
|
|
/*-------------------------------------------------------------------
|
|
* OS specific macros:
|
|
*-------------------------------------------------------------------
|
|
* NAME(symbol) - Decorate 'symbol' as a global symbol
|
|
* DECLARE_FUNCTION(symbol) - Declare 'symbol' as function type
|
|
* DECLARE_FUNCTION_AS(symbol) - Declare 'symbol' as function type without decorations
|
|
* END_FUNCTION(symbol) - Mark the end of the function 'symbol'
|
|
* PLT_ADDRESS(symbol) - call target for 'symbol' to make a call to external function.
|
|
*-------------------------------------------------------------------
|
|
*/
|
|
#ifdef TARGET_MAC
|
|
# define NAME(x) _##x
|
|
# define DECLARE_FUNCTION(fun) .global NAME(fun);
|
|
# define DECLARE_FUNCTION_AS(fun) .global fun;
|
|
# define END_FUNCTION(fun) .global NAME(fun ## _endfunc); \
|
|
NAME(fun ## _endfunc):
|
|
# define PLT_ADDRESS(fun) NAME(fun)
|
|
#else
|
|
# define NAME(x) x
|
|
# define DECLARE_FUNCTION(fun) .globl NAME(fun); \
|
|
.type NAME(fun), @function
|
|
# define DECLARE_FUNCTION_AS(fun) DECLARE_FUNCTION(fun)
|
|
# define END_FUNCTION(fun) .size NAME(fun),.-NAME(fun)
|
|
# define PLT_ADDRESS(fun) NAME(fun) ## @plt
|
|
#endif
|
|
|
|
/*-------------------------------------------------------------------
|
|
* Architecture specific macros:
|
|
*-------------------------------------------------------------------
|
|
* BEGIN_STACK_FRAME - Expands to the instructions that build a new stack
|
|
* frame for a function
|
|
* END_STACK_FRAME - Expands to the instructions that destroy a stack
|
|
* frame just before calling "ret"
|
|
* PARAM1 - The first argument to a function.
|
|
* Note that this macro is valid only after building a
|
|
* stack frame
|
|
* PARAM2 - The second argument to a function.
|
|
* Note that this macro is valid only after building a
|
|
* stack frame
|
|
* SCRATCH_REG* - Taken from Calling Convention:
|
|
* Scratch register are registers that can be used for temporary storage without
|
|
* restrictions (no need to save before using them and restore after using them)
|
|
* SCRATCH_REG1 - Scratch register eax/rax depending on the architecture
|
|
* SCRATCH_REG2 - Scratch register ecx/rcx depending on the architecture
|
|
* SCRATCH_REG3 - Scratch register edx/rdx depending on the architecture
|
|
* SCRATCH_REG4 - Scratch register rsi (available only in intel64)
|
|
* CALLEE_SAVE_REG1 - Callee-save register ebx/rbx depending on the architecture (need to be pushed
|
|
* before used and popped when not used anymore before ret instruction
|
|
* CALLEE_SAVE_REG2 - Callee-save register esx/r12 depending on the architecture (need to be pushed
|
|
* before used and popped when not used anymore before ret instruction
|
|
* RETURN_REG - The register that holds the return value
|
|
* GAX_REG - eax/rax depending on the architecture
|
|
* GBX_REG - ebx/rbx depending on the architecture
|
|
* GCX_REG - ecx/rcx depending on the architecture
|
|
* GDX_REG - edx/rdx depending on the architecture
|
|
* GSI_REG - esi/rsi depending on the architecture
|
|
* G12_REG - r12 (available only in intel64)
|
|
* STACK_PTR - The stack pointer register
|
|
* PIC_VAR(v) - Reference memory at 'v' in PIC notation (not supported in 32 bit mode)
|
|
* SYSCALL_PARAM1 - The first argument to a system call
|
|
* Note that this macro is valid only after building a
|
|
* stack frame
|
|
* PREPARE_UNIX_SYSCALL(num) - Prepare to run a syscall numbered 'num'
|
|
* Assign the syscall number (plus some required
|
|
* transformation to the register that holds the
|
|
* syscall number).
|
|
* INVOKE_SYSCALL - The instruction sequence that does the actual invocation of a syscall.
|
|
*-------------------------------------------------------------------
|
|
*/
|
|
#if defined(TARGET_IA32)
|
|
# define BEGIN_STACK_FRAME \
|
|
push %ebp; \
|
|
mov %esp, %ebp
|
|
# define END_STACK_FRAME \
|
|
mov %ebp, %esp; \
|
|
pop %ebp
|
|
# define PARAM1 8(%ebp)
|
|
# define PARAM2 0xc(%ebp)
|
|
# define RETURN_REG %eax
|
|
# define GAX_REG %eax
|
|
# define GBX_REG %ebx
|
|
# define GCX_REG %ecx
|
|
# define CL_REG %cl
|
|
# define GDX_REG %edx
|
|
# define GSI_REG %esi
|
|
# define STACK_PTR %esp
|
|
# define PIC_VAR(a) a
|
|
# ifdef TARGET_MAC
|
|
# define SYSCALL_PARAM1 (%esp)
|
|
# define PREPARE_UNIX_SYSCALL(num) mov num, %eax; \
|
|
or $0x40000, %eax
|
|
# define INVOKE_SYSCALL calll LTrap ## __LINE__; \
|
|
jmpl LTrapDone ## __LINE__ ; \
|
|
LTrap ## __LINE__: \
|
|
popl %edx; \
|
|
movl %esp, %ecx; \
|
|
sysenter; \
|
|
LTrapDone ## __LINE__:
|
|
# else
|
|
# define PREPARE_UNIX_SYSCALL(num) mov num, %eax
|
|
# define SYSCALL_PARAM1 %ebx
|
|
# define INVOKE_SYSCALL int $0x80
|
|
# endif
|
|
#elif defined(TARGET_IA32E)
|
|
# define BEGIN_STACK_FRAME \
|
|
push %rbp; \
|
|
mov %rsp, %rbp
|
|
# define END_STACK_FRAME \
|
|
mov %rbp, %rsp; \
|
|
pop %rbp
|
|
# define PARAM1 %rdi
|
|
# define PARAM2 %rsi
|
|
# define RETURN_REG %rax
|
|
# define GAX_REG %rax
|
|
# define GBX_REG %rbx
|
|
# define GCX_REG %rcx
|
|
# define CL_REG %cl
|
|
# define GDX_REG %rdx
|
|
# define GSI_REG %rsi
|
|
# define G12_REG %r12
|
|
# define STACK_PTR %rsp
|
|
# define PIC_VAR(a) a(%rip)
|
|
# define SYSCALL_PARAM1 %rdi
|
|
# define INVOKE_SYSCALL syscall
|
|
# ifdef TARGET_MAC
|
|
# define PREPARE_UNIX_SYSCALL(num) mov num, %rax; \
|
|
or $0x2000000, %rax
|
|
# else
|
|
# define PREPARE_UNIX_SYSCALL(num) mov num, %rax
|
|
# endif
|
|
#endif
|
|
|
|
/*
|
|
* Common
|
|
*/
|
|
#define SCRATCH_REG1 GAX_REG
|
|
#define SCRATCH_REG2 GCX_REG
|
|
#define SCRATCH_REG3 GDX_REG
|
|
#if defined(TARGET_IA32E)
|
|
# define SCRATCH_REG4 GSI_REG
|
|
#endif
|
|
|
|
#define CALLEE_SAVE_REG1 GBX_REG
|
|
# if defined(TARGET_IA32)
|
|
#define CALLEE_SAVE_REG2 GSI_REG
|
|
#elif defined(TARGET_IA32E)
|
|
# define CALLEE_SAVE_REG2 G12_REG
|
|
#endif
|