mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-28 22:18:29 +00:00
There's a new program named ape/ape-m1.c which will be used to build an embeddable binary that can load ape and elf executables. The support is mostly working so far, but still chasing down ABI issues.
89 lines
2.1 KiB
C
89 lines
2.1 KiB
C
#ifndef COSMOPOLITAN_LIBC_SYSV_MACROS_H_
|
|
#define COSMOPOLITAN_LIBC_SYSV_MACROS_H_
|
|
#include "libc/macros.internal.h"
|
|
#ifdef __ASSEMBLER__
|
|
/* clang-format off */
|
|
|
|
/**
|
|
* @fileoverview System Five jump slot generator.
|
|
*
|
|
* We need to pass a magic number to the SYSCALL instruction in %rax.
|
|
* That's only possible to do in C using asm() macro wrappers, like in
|
|
* Chromium's "System Call Support" library. This technique is simpler
|
|
* to implement, gains us object-level ABI compatibility, hookability,
|
|
* and the ability to support significantly more functions, without the
|
|
* risk of slowing down builds too much with complicated headers.
|
|
*/
|
|
|
|
.macro .scall name:req amd:req arm_linux:req arm_xnu:req kw1 kw2
|
|
.section .text.syscall,"ax",@progbits
|
|
#ifdef __x86_64__
|
|
.ifnb \kw2
|
|
.balign 16
|
|
\name: movabs $\amd,%rax
|
|
jmp *__systemfive(%rip)
|
|
.else
|
|
\name: push %rbp
|
|
mov %rsp,%rbp
|
|
movabs $\amd,%rax
|
|
.hookable
|
|
call *__systemfive(%rip)
|
|
pop %rbp
|
|
ret
|
|
.endif
|
|
.endfn \name,\kw1,\kw2
|
|
#elif defined(__aarch64__)
|
|
.ifc \arm_linux,4095
|
|
.ifc \arm_xnu,4095
|
|
// return enosys();
|
|
\name: b enosys
|
|
.endfn \name,\kw1,\kw2
|
|
.else
|
|
// return IsXnu() ? syscall(x16, ...) : syscall(x8, ...);
|
|
\name: adrp x9,__hostos
|
|
ldr w9,[x9,#:lo12:__hostos]
|
|
tbz x9,#3,1f // !IsXnu()
|
|
mov x16,#\arm_xnu // apple ordinal
|
|
svc #0 // issue system call
|
|
bcs 1f
|
|
b _sysret
|
|
1: neg x0,x0
|
|
b _sysret
|
|
.hidden _sysret
|
|
.endfn \name,\kw1,\kw2
|
|
.endif
|
|
.else
|
|
.ifc \arm_xnu,4095
|
|
// return IsLinux() ? syscall(x8, ...) : enosys();
|
|
\name: adrp x9,__hostos
|
|
ldr w9,[x9,#:lo12:__hostos]
|
|
tbz x9,#0,1f // !IsLinux()
|
|
mov x8,#\arm_linux // systemd ordinal
|
|
svc #0 // issue system call
|
|
mov x1,#\arm_linux
|
|
b _sysret
|
|
.hidden _sysret
|
|
1: b enosys
|
|
.endfn \name,\kw1,\kw2
|
|
.else
|
|
\name: mov x16,#\arm_xnu // apple ordinal
|
|
mov x8,#\arm_linux // systemd ordinal
|
|
eor x9,x9,x9 // clear carry flag
|
|
svc #0 // issue system call
|
|
bcs 1f
|
|
b _sysret
|
|
1: neg x0,x0
|
|
b _sysret
|
|
.hidden _sysret
|
|
.endfn \name,\kw1,\kw2
|
|
.endif
|
|
.endif
|
|
#else
|
|
#error "architecture unsupported"
|
|
#endif
|
|
.previous
|
|
.endm
|
|
|
|
/* clang-format on */
|
|
#endif /* __ASSEMBLER__ */
|
|
#endif /* COSMOPOLITAN_LIBC_SYSV_MACROS_H_ */
|