1*22ce4affSfengbojiang/* $FreeBSD$ */ 2*22ce4affSfengbojiang 3*22ce4affSfengbojiang#include "linux_assym.h" /* system definitions */ 4*22ce4affSfengbojiang#include <machine/asmacros.h> /* miscellaneous asm macros */ 5*22ce4affSfengbojiang 6*22ce4affSfengbojiang#include <amd64/linux/linux_syscall.h> /* system call numbers */ 7*22ce4affSfengbojiang 8*22ce4affSfengbojiang .data 9*22ce4affSfengbojiang 10*22ce4affSfengbojiang .globl linux_platform 11*22ce4affSfengbojianglinux_platform: 12*22ce4affSfengbojiang .asciz "x86_64" 13*22ce4affSfengbojiang 14*22ce4affSfengbojiang 15*22ce4affSfengbojiang .text 16*22ce4affSfengbojiang/* 17*22ce4affSfengbojiang * To avoid excess stack frame the signal trampoline code emulates 18*22ce4affSfengbojiang * the 'call' instruction. 19*22ce4affSfengbojiang */ 20*22ce4affSfengbojiangNON_GPROF_ENTRY(linux_rt_sigcode) 21*22ce4affSfengbojiang movq %rsp, %rbx /* preserve sigframe */ 22*22ce4affSfengbojiang call .getip 23*22ce4affSfengbojiang.getip: 24*22ce4affSfengbojiang popq %rax 25*22ce4affSfengbojiang add $.startrtsigcode-.getip, %rax /* ret address */ 26*22ce4affSfengbojiang pushq %rax 27*22ce4affSfengbojiang jmp *LINUX_RT_SIGF_HANDLER(%rbx) 28*22ce4affSfengbojiang.startrtsigcode: 29*22ce4affSfengbojiang movq $LINUX_SYS_linux_rt_sigreturn,%rax /* linux_rt_sigreturn() */ 30*22ce4affSfengbojiang syscall /* enter kernel with args */ 31*22ce4affSfengbojiang hlt 32*22ce4affSfengbojiang.endrtsigcode: 33*22ce4affSfengbojiang0: jmp 0b 34*22ce4affSfengbojiang 35*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_clock_gettime) 36*22ce4affSfengbojiang movq $LINUX_SYS_linux_clock_gettime,%rax 37*22ce4affSfengbojiang syscall 38*22ce4affSfengbojiang ret 39*22ce4affSfengbojiang.weak clock_gettime 40*22ce4affSfengbojiang.set clock_gettime, __vdso_clock_gettime 41*22ce4affSfengbojiang 42*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_time) 43*22ce4affSfengbojiang movq $LINUX_SYS_linux_time,%rax 44*22ce4affSfengbojiang syscall 45*22ce4affSfengbojiang ret 46*22ce4affSfengbojiang.weak time 47*22ce4affSfengbojiang.set time, __vdso_time 48*22ce4affSfengbojiang 49*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_gettimeofday) 50*22ce4affSfengbojiang movq $LINUX_SYS_gettimeofday,%rax 51*22ce4affSfengbojiang syscall 52*22ce4affSfengbojiang ret 53*22ce4affSfengbojiang.weak gettimeofday 54*22ce4affSfengbojiang.set gettimeofday, __vdso_gettimeofday 55*22ce4affSfengbojiang 56*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_getcpu) 57*22ce4affSfengbojiang movq $-38,%rax /* not implemented */ 58*22ce4affSfengbojiang ret 59*22ce4affSfengbojiang.weak getcpu 60*22ce4affSfengbojiang.set getcpu, __vdso_getcpu 61*22ce4affSfengbojiang 62*22ce4affSfengbojiang#if 0 63*22ce4affSfengbojiang .section .note.Linux, "a",@note 64*22ce4affSfengbojiang .long 2f - 1f /* namesz */ 65*22ce4affSfengbojiang .balign 4 66*22ce4affSfengbojiang .long 4f - 3f /* descsz */ 67*22ce4affSfengbojiang .long 0 68*22ce4affSfengbojiang1: 69*22ce4affSfengbojiang .asciz "Linux" 70*22ce4affSfengbojiang2: 71*22ce4affSfengbojiang .balign 4 72*22ce4affSfengbojiang3: 73*22ce4affSfengbojiang .long LINUX_VERSION_CODE 74*22ce4affSfengbojiang4: 75*22ce4affSfengbojiang .balign 4 76*22ce4affSfengbojiang .previous 77*22ce4affSfengbojiang#endif 78*22ce4affSfengbojiang 79*22ce4affSfengbojiang .section .eh_frame,"a",@progbits 80*22ce4affSfengbojiang.LSTARTFRAMEDLSI0: 81*22ce4affSfengbojiang .long .LENDCIEDLSI0-.LSTARTCIEDLSI0 82*22ce4affSfengbojiang.LSTARTCIEDLSI0: 83*22ce4affSfengbojiang .long 0 /* CIE ID */ 84*22ce4affSfengbojiang .byte 1 /* Version number */ 85*22ce4affSfengbojiang .string "zR" /* NULL-terminated 86*22ce4affSfengbojiang * augmentation string 87*22ce4affSfengbojiang */ 88*22ce4affSfengbojiang .uleb128 1 /* Code alignment factor */ 89*22ce4affSfengbojiang .sleb128 -4 /* Data alignment factor */ 90*22ce4affSfengbojiang .byte 8 /* Return address register column */ 91*22ce4affSfengbojiang .uleb128 1 /* Augmentation value length */ 92*22ce4affSfengbojiang .byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */ 93*22ce4affSfengbojiang .byte 0x0c /* DW_CFA_def_cfa */ 94*22ce4affSfengbojiang .uleb128 4 95*22ce4affSfengbojiang .uleb128 4 96*22ce4affSfengbojiang .byte 0x88 /* DW_CFA_offset, column 0x8 */ 97*22ce4affSfengbojiang .uleb128 1 98*22ce4affSfengbojiang .align 4 99*22ce4affSfengbojiang.LENDCIEDLSI0: 100*22ce4affSfengbojiang .long .LENDFDEDLSI0-.LSTARTFDEDLSI0 /* Length FDE */ 101*22ce4affSfengbojiang.LSTARTFDEDLSI0: 102*22ce4affSfengbojiang .long .LSTARTFDEDLSI0-.LSTARTFRAMEDLSI0 /* CIE pointer */ 103*22ce4affSfengbojiang .long .startrtsigcode-. /* PC-relative start address */ 104*22ce4affSfengbojiang .long .endrtsigcode-.startrtsigcode 105*22ce4affSfengbojiang .uleb128 0 106*22ce4affSfengbojiang .align 4 107*22ce4affSfengbojiang.LENDFDEDLSI0: 108*22ce4affSfengbojiang .previous 109