root/src/pkg/runtime/sys_plan9_amd64.s

/* [<][>][^][v][top][bottom][index][help] */
// Copyright 2010 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.

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

// setldt(int entry, int address, int limit)
TEXT runtime·setldt(SB),NOSPLIT,$0
        RET

TEXT runtime·open(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $14, BP
        SYSCALL
        RET

TEXT runtime·pread(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $50, BP
        SYSCALL
        RET

TEXT runtime·pwrite(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $51, BP
        SYSCALL
        RET

// int32 _seek(int64*, int32, int64, int32)
TEXT _seek<>(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $39, BP
        SYSCALL
        RET

// int64 seek(int32, int64, int32)
TEXT runtime·seek(SB),NOSPLIT,$56
        LEAQ    new+48(SP), CX
        MOVQ    CX, 0(SP)
        MOVQ    fd+0(FP), CX
        MOVQ    CX, 8(SP)
        MOVQ    off+8(FP), CX
        MOVQ    CX, 16(SP)
        MOVQ    whence+16(FP), CX
        MOVQ    CX, 24(SP)
        CALL    _seek<>(SB)
        CMPL    AX, $0
        JGE     2(PC)
        MOVQ    $-1, new+48(SP)
        MOVQ    new+48(SP), AX
        RET

TEXT runtime·close(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $4, BP
        SYSCALL
        RET

TEXT runtime·exits(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $8, BP
        SYSCALL
        RET

TEXT runtime·brk_(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $24, BP
        SYSCALL
        RET

TEXT runtime·sleep(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $17, BP
        SYSCALL
        RET

TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $37, BP
        SYSCALL
        RET

TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $52, BP
        SYSCALL
        RET

TEXT runtime·notify(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $28, BP
        SYSCALL
        RET

TEXT runtime·noted(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $29, BP
        SYSCALL
        RET
        
TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $38, BP
        SYSCALL
        RET

TEXT runtime·nanotime(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $60, BP
        SYSCALL
        RET

TEXT runtime·rfork(SB),NOSPLIT,$0
        MOVQ    $0x8000, AX
        MOVQ    $19, BP // rfork
        SYSCALL

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

        // In child on forked stack.
        MOVQ    mm+24(SP), BX   // m
        MOVQ    gg+32(SP), DX   // g
        MOVQ    fn+40(SP), SI   // fn

        // set SP to be on the new child stack
        MOVQ    stack+16(SP), CX
        MOVQ    CX, SP

        // Initialize m, g.
        get_tls(AX)
        MOVQ    DX, g(AX)
        MOVQ    BX, m(AX)

        // Initialize AX from pid in TLS.
        MOVQ    0(FS), AX
        MOVQ    AX, m_procid(BX)        // save pid as m->procid
        
        CALL    runtime·stackcheck(SB) // smashes AX, CX
        
        MOVQ    0(DX), DX       // paranoia; check they are not nil
        MOVQ    0(BX), BX
        
        CALL    SI      // fn()
        CALL    runtime·exit(SB)
        RET

// This is needed by asm_amd64.s
TEXT runtime·settls(SB),NOSPLIT,$0
        RET

// void sigtramp(void *ureg, int8 *note)
TEXT runtime·sigtramp(SB),NOSPLIT,$0
        get_tls(AX)

        // check that m exists
        MOVQ    m(AX), BX
        CMPQ    BX, $0
        JNE     3(PC)
        CALL    runtime·badsignal2(SB) // will exit
        RET

        // save args
        MOVQ    ureg+8(SP), CX
        MOVQ    note+16(SP), DX

        // change stack
        MOVQ    m_gsignal(BX), R10
        MOVQ    g_stackbase(R10), BP
        MOVQ    BP, SP

        // make room for args and g
        SUBQ    $32, SP

        // save g
        MOVQ    g(AX), BP
        MOVQ    BP, 24(SP)

        // g = m->gsignal
        MOVQ    R10, g(AX)

        // load args and call sighandler
        MOVQ    CX, 0(SP)
        MOVQ    DX, 8(SP)
        MOVQ    BP, 16(SP)

        CALL    runtime·sighandler(SB)

        // restore g
        get_tls(BX)
        MOVQ    24(SP), R10
        MOVQ    R10, g(BX)

        // call noted(AX)
        MOVQ    AX, 0(SP)
        CALL    runtime·noted(SB)
        RET

TEXT runtime·setfpmasks(SB),NOSPLIT,$8
        STMXCSR 0(SP)
        MOVL    0(SP), AX
        ANDL    $~0x3F, AX
        ORL     $(0x3F<<7), AX
        MOVL    AX, 0(SP)
        LDMXCSR 0(SP)
        RET

#define ERRMAX 128      /* from os_plan9.h */

// func errstr() String
// Only used by package syscall.
// Grab error string due to a syscall made
// in entersyscall mode, without going
// through the allocator (issue 4994).
// See ../syscall/asm_plan9_386.s:/·Syscall/
TEXT runtime·errstr(SB),NOSPLIT,$0
        get_tls(AX)
        MOVQ    m(AX), BX
        MOVQ    m_errstr(BX), CX
        MOVQ    CX, 8(SP)
        MOVQ    $ERRMAX, 16(SP)
        MOVQ    $0x8000, AX
        MOVQ    $41, BP
        SYSCALL

        // syscall requires caller-save
        MOVQ    8(SP), CX

        // push the argument
        PUSHQ   CX
        CALL    runtime·findnull(SB)
        POPQ    CX
        MOVQ    AX, 16(SP)
        RET

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