root/src/pkg/runtime/sys_linux_amd64.s

/* [<][>][^][v][top][bottom][index][help] */
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//
// System calls and other sys.stuff for AMD64, Linux
//

#include "zasm_GOOS_GOARCH.h"
#include "../../cmd/ld/textflag.h"

TEXT runtime·exit(SB),NOSPLIT,$0-8
        MOVL    8(SP), DI
        MOVL    $231, AX        // exitgroup - force all os threads to exit
        SYSCALL
        RET

TEXT runtime·exit1(SB),NOSPLIT,$0-8
        MOVL    8(SP), DI
        MOVL    $60, AX // exit - exit the current os thread
        SYSCALL
        RET

TEXT runtime·open(SB),NOSPLIT,$0-16
        MOVQ    8(SP), DI
        MOVL    16(SP), SI
        MOVL    20(SP), DX
        MOVL    $2, AX                  // syscall entry
        SYSCALL
        RET

TEXT runtime·close(SB),NOSPLIT,$0-16
        MOVL    8(SP), DI
        MOVL    $3, AX                  // syscall entry
        SYSCALL
        RET

TEXT runtime·write(SB),NOSPLIT,$0-24
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVL    24(SP), DX
        MOVL    $1, AX                  // syscall entry
        SYSCALL
        RET

TEXT runtime·read(SB),NOSPLIT,$0-24
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVL    24(SP), DX
        MOVL    $0, AX                  // syscall entry
        SYSCALL
        RET

TEXT runtime·getrlimit(SB),NOSPLIT,$0-24
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVL    $97, AX                 // syscall entry
        SYSCALL
        RET

TEXT runtime·usleep(SB),NOSPLIT,$16
        MOVL    $0, DX
        MOVL    usec+0(FP), AX
        MOVL    $1000000, CX
        DIVL    CX
        MOVQ    AX, 0(SP)
        MOVQ    DX, 8(SP)

        // select(0, 0, 0, 0, &tv)
        MOVL    $0, DI
        MOVL    $0, SI
        MOVL    $0, DX
        MOVL    $0, R10
        MOVQ    SP, R8
        MOVL    $23, AX
        SYSCALL
        RET

TEXT runtime·raise(SB),NOSPLIT,$0
        MOVL    $186, AX        // syscall - gettid
        SYSCALL
        MOVL    AX, DI  // arg 1 tid
        MOVL    sig+0(FP), SI   // arg 2
        MOVL    $200, AX        // syscall - tkill
        SYSCALL
        RET

TEXT runtime·setitimer(SB),NOSPLIT,$0-24
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVQ    24(SP), DX
        MOVL    $38, AX                 // syscall entry
        SYSCALL
        RET

TEXT runtime·mincore(SB),NOSPLIT,$0-24
        MOVQ    8(SP), DI
        MOVQ    16(SP), SI
        MOVQ    24(SP), DX
        MOVL    $27, AX                 // syscall entry
        SYSCALL
        RET

// func now() (sec int64, nsec int32)
TEXT time·now(SB),NOSPLIT,$16
        // Be careful. We're calling a function with gcc calling convention here.
        // We're guaranteed 128 bytes on entry, and we've taken 16, and the
        // call uses another 8.
        // That leaves 104 for the gettime code to use. Hope that's enough!
        MOVQ    runtime·__vdso_clock_gettime_sym(SB), AX
        CMPQ    AX, $0
        JEQ     fallback_gtod
        MOVL    $0, DI // CLOCK_REALTIME
        LEAQ    0(SP), SI
        CALL    AX
        MOVQ    0(SP), AX       // sec
        MOVQ    8(SP), DX       // nsec
        MOVQ    AX, sec+0(FP)
        MOVL    DX, nsec+8(FP)
        RET
fallback_gtod:
        LEAQ    0(SP), DI
        MOVQ    $0, SI
        MOVQ    runtime·__vdso_gettimeofday_sym(SB), AX
        CALL    AX
        MOVQ    0(SP), AX       // sec
        MOVL    8(SP), DX       // usec
        IMULQ   $1000, DX
        MOVQ    AX, sec+0(FP)
        MOVL    DX, nsec+8(FP)
        RET

TEXT runtime·nanotime(SB),NOSPLIT,$16
        // Duplicate time.now here to avoid using up precious stack space.
        // See comment above in time.now.
        MOVQ    runtime·__vdso_clock_gettime_sym(SB), AX
        CMPQ    AX, $0
        JEQ     fallback_gtod_nt
        MOVL    $1, DI // CLOCK_MONOTONIC
        LEAQ    0(SP), SI
        CALL    AX
        MOVQ    0(SP), AX       // sec
        MOVQ    8(SP), DX       // nsec
        // sec is in AX, nsec in DX
        // return nsec in AX
        IMULQ   $1000000000, AX
        ADDQ    DX, AX
        RET
fallback_gtod_nt:
        LEAQ    0(SP), DI
        MOVQ    $0, SI
        MOVQ    runtime·__vdso_gettimeofday_sym(SB), AX
        CALL    AX
        MOVQ    0(SP), AX       // sec
        MOVL    8(SP), DX       // usec
        IMULQ   $1000, DX
        // sec is in AX, nsec in DX
        // return nsec in AX
        IMULQ   $1000000000, AX
        ADDQ    DX, AX
        RET

TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-32
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVQ    24(SP), DX
        MOVL    32(SP), R10
        MOVL    $14, AX                 // syscall entry
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
        JLS     2(PC)
        MOVL    $0xf1, 0xf1  // crash
        RET

TEXT runtime·rt_sigaction(SB),NOSPLIT,$0-32
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVQ    24(SP), DX
        MOVQ    32(SP), R10
        MOVL    $13, AX                 // syscall entry
        SYSCALL
        RET

TEXT runtime·sigtramp(SB),NOSPLIT,$64
        get_tls(BX)

        // check that m exists
        MOVQ    m(BX), BP
        CMPQ    BP, $0
        JNE     5(PC)
        MOVQ    DI, 0(SP)
        MOVQ    $runtime·badsignal(SB), AX
        CALL    AX
        RET

        // save g
        MOVQ    g(BX), R10
        MOVQ    R10, 40(SP)

        // g = m->gsignal
        MOVQ    m_gsignal(BP), BP
        MOVQ    BP, g(BX)

        MOVQ    DI, 0(SP)
        MOVQ    SI, 8(SP)
        MOVQ    DX, 16(SP)
        MOVQ    R10, 24(SP)

        CALL    runtime·sighandler(SB)

        // restore g
        get_tls(BX)
        MOVQ    40(SP), R10
        MOVQ    R10, g(BX)
        RET

TEXT runtime·sigreturn(SB),NOSPLIT,$0
        MOVL    $15, AX // rt_sigreturn
        SYSCALL
        INT $3  // not reached

TEXT runtime·mmap(SB),NOSPLIT,$0
        MOVQ    8(SP), DI
        MOVQ    $0, SI
        MOVQ    16(SP), SI
        MOVL    24(SP), DX
        MOVL    28(SP), R10
        MOVL    32(SP), R8
        MOVL    36(SP), R9

        MOVL    $9, AX                  // mmap
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
        JLS     3(PC)
        NOTQ    AX
        INCQ    AX
        RET

TEXT runtime·munmap(SB),NOSPLIT,$0
        MOVQ    8(SP), DI
        MOVQ    16(SP), SI
        MOVQ    $11, AX // munmap
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
        JLS     2(PC)
        MOVL    $0xf1, 0xf1  // crash
        RET

TEXT runtime·madvise(SB),NOSPLIT,$0
        MOVQ    8(SP), DI
        MOVQ    16(SP), SI
        MOVQ    24(SP), DX
        MOVQ    $28, AX // madvise
        SYSCALL
        // ignore failure - maybe pages are locked
        RET

// int64 futex(int32 *uaddr, int32 op, int32 val,
//      struct timespec *timeout, int32 *uaddr2, int32 val2);
TEXT runtime·futex(SB),NOSPLIT,$0
        MOVQ    8(SP), DI
        MOVL    16(SP), SI
        MOVL    20(SP), DX
        MOVQ    24(SP), R10
        MOVQ    32(SP), R8
        MOVL    40(SP), R9
        MOVL    $202, AX
        SYSCALL
        RET

// int64 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
TEXT runtime·clone(SB),NOSPLIT,$0
        MOVL    flags+8(SP), DI
        MOVQ    stack+16(SP), SI

        // Copy mp, gp, fn off parent stack for use by child.
        // Careful: Linux system call clobbers CX and R11.
        MOVQ    mm+24(SP), R8
        MOVQ    gg+32(SP), R9
        MOVQ    fn+40(SP), R12

        MOVL    $56, AX
        SYSCALL

        // In parent, return.
        CMPQ    AX, $0
        JEQ     2(PC)
        RET

        // In child, on new stack.
        MOVQ    SI, SP

        // Initialize m->procid to Linux tid
        MOVL    $186, AX        // gettid
        SYSCALL
        MOVQ    AX, m_procid(R8)

        // Set FS to point at m->tls.
        LEAQ    m_tls(R8), DI
        CALL    runtime·settls(SB)

        // In child, set up new stack
        get_tls(CX)
        MOVQ    R8, m(CX)
        MOVQ    R9, g(CX)
        CALL    runtime·stackcheck(SB)

        // Call fn
        CALL    R12

        // It shouldn't return.  If it does, exit
        MOVL    $111, DI
        MOVL    $60, AX
        SYSCALL
        JMP     -3(PC)  // keep exiting

TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
        MOVQ    new+8(SP), DI
        MOVQ    old+16(SP), SI
        MOVQ    $131, AX
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
        JLS     2(PC)
        MOVL    $0xf1, 0xf1  // crash
        RET

// set tls base to DI
TEXT runtime·settls(SB),NOSPLIT,$32
        ADDQ    $16, DI // ELF wants to use -16(FS), -8(FS)

        MOVQ    DI, SI
        MOVQ    $0x1002, DI     // ARCH_SET_FS
        MOVQ    $158, AX        // arch_prctl
        SYSCALL
        CMPQ    AX, $0xfffffffffffff001
        JLS     2(PC)
        MOVL    $0xf1, 0xf1  // crash
        RET

TEXT runtime·osyield(SB),NOSPLIT,$0
        MOVL    $24, AX
        SYSCALL
        RET

TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0
        MOVQ    8(SP), DI
        MOVL    16(SP), SI
        MOVQ    24(SP), DX
        MOVL    $204, AX                        // syscall entry
        SYSCALL
        RET

// int32 runtime·epollcreate(int32 size);
TEXT runtime·epollcreate(SB),NOSPLIT,$0
        MOVL    8(SP), DI
        MOVL    $213, AX                        // syscall entry
        SYSCALL
        RET

// int32 runtime·epollcreate1(int32 flags);
TEXT runtime·epollcreate1(SB),NOSPLIT,$0
        MOVL    8(SP), DI
        MOVL    $291, AX                        // syscall entry
        SYSCALL
        RET

// int32 runtime·epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev);
TEXT runtime·epollctl(SB),NOSPLIT,$0
        MOVL    8(SP), DI
        MOVL    12(SP), SI
        MOVL    16(SP), DX
        MOVQ    24(SP), R10
        MOVL    $233, AX                        // syscall entry
        SYSCALL
        RET

// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
TEXT runtime·epollwait(SB),NOSPLIT,$0
        MOVL    8(SP), DI
        MOVQ    16(SP), SI
        MOVL    24(SP), DX
        MOVL    28(SP), R10
        MOVL    $232, AX                        // syscall entry
        SYSCALL
        RET

// void runtime·closeonexec(int32 fd);
TEXT runtime·closeonexec(SB),NOSPLIT,$0
        MOVL    8(SP), DI  // fd
        MOVQ    $2, SI  // F_SETFD
        MOVQ    $1, DX  // FD_CLOEXEC
        MOVL    $72, AX  // fcntl
        SYSCALL
        RET

/* [<][>][^][v][top][bottom][index][help] */