mirror of
https://github.com/golang/go
synced 2024-11-20 01:54:41 -07:00
58e3ae2fae
Reduces the size of m by ~8% on linux/amd64 (1040 bytes -> 960 bytes). There are also windows-specific fields, but they're currently referenced in OS-independent source files (but only when GOOS=="windows"). Change-Id: I13e1471ff585ccced1271f74209f8ed6df14c202 Reviewed-on: https://go-review.googlesource.com/16173 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
251 lines
4.4 KiB
ArmAsm
251 lines
4.4 KiB
ArmAsm
// 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 "go_asm.h"
|
|
#include "go_tls.h"
|
|
#include "textflag.h"
|
|
|
|
// setldt(int entry, int address, int limit)
|
|
TEXT runtime·setldt(SB),NOSPLIT,$0
|
|
RET
|
|
|
|
TEXT runtime·open(SB),NOSPLIT,$0
|
|
MOVL $14, AX
|
|
INT $64
|
|
MOVL AX, ret+12(FP)
|
|
RET
|
|
|
|
TEXT runtime·pread(SB),NOSPLIT,$0
|
|
MOVL $50, AX
|
|
INT $64
|
|
MOVL AX, ret+20(FP)
|
|
RET
|
|
|
|
TEXT runtime·pwrite(SB),NOSPLIT,$0
|
|
MOVL $51, AX
|
|
INT $64
|
|
MOVL AX, ret+20(FP)
|
|
RET
|
|
|
|
// int32 _seek(int64*, int32, int64, int32)
|
|
TEXT _seek<>(SB),NOSPLIT,$0
|
|
MOVL $39, AX
|
|
INT $64
|
|
RET
|
|
|
|
TEXT runtime·seek(SB),NOSPLIT,$24
|
|
LEAL ret+16(FP), AX
|
|
MOVL fd+0(FP), BX
|
|
MOVL offset_lo+4(FP), CX
|
|
MOVL offset_hi+8(FP), DX
|
|
MOVL whence+12(FP), SI
|
|
MOVL AX, 0(SP)
|
|
MOVL BX, 4(SP)
|
|
MOVL CX, 8(SP)
|
|
MOVL DX, 12(SP)
|
|
MOVL SI, 16(SP)
|
|
CALL _seek<>(SB)
|
|
CMPL AX, $0
|
|
JGE 3(PC)
|
|
MOVL $-1, ret_lo+16(FP)
|
|
MOVL $-1, ret_hi+20(FP)
|
|
RET
|
|
|
|
TEXT runtime·closefd(SB),NOSPLIT,$0
|
|
MOVL $4, AX
|
|
INT $64
|
|
MOVL AX, ret+4(FP)
|
|
RET
|
|
|
|
TEXT runtime·exits(SB),NOSPLIT,$0
|
|
MOVL $8, AX
|
|
INT $64
|
|
RET
|
|
|
|
TEXT runtime·brk_(SB),NOSPLIT,$0
|
|
MOVL $24, AX
|
|
INT $64
|
|
MOVL AX, ret+4(FP)
|
|
RET
|
|
|
|
TEXT runtime·sleep(SB),NOSPLIT,$0
|
|
MOVL $17, AX
|
|
INT $64
|
|
MOVL AX, ret+4(FP)
|
|
RET
|
|
|
|
TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0
|
|
MOVL $37, AX
|
|
INT $64
|
|
MOVL AX, ret+8(FP)
|
|
RET
|
|
|
|
TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0
|
|
MOVL $52, AX
|
|
INT $64
|
|
MOVL AX, ret+8(FP)
|
|
RET
|
|
|
|
TEXT nsec<>(SB),NOSPLIT,$0
|
|
MOVL $53, AX
|
|
INT $64
|
|
RET
|
|
|
|
TEXT runtime·nsec(SB),NOSPLIT,$8
|
|
LEAL ret+4(FP), AX
|
|
MOVL AX, 0(SP)
|
|
CALL nsec<>(SB)
|
|
CMPL AX, $0
|
|
JGE 3(PC)
|
|
MOVL $-1, ret_lo+4(FP)
|
|
MOVL $-1, ret_hi+8(FP)
|
|
RET
|
|
|
|
// func now() (sec int64, nsec int32)
|
|
TEXT time·now(SB),NOSPLIT,$8-12
|
|
CALL runtime·nanotime(SB)
|
|
MOVL 0(SP), AX
|
|
MOVL 4(SP), DX
|
|
|
|
MOVL $1000000000, CX
|
|
DIVL CX
|
|
MOVL AX, sec+0(FP)
|
|
MOVL $0, sec+4(FP)
|
|
MOVL DX, nsec+8(FP)
|
|
RET
|
|
|
|
TEXT runtime·notify(SB),NOSPLIT,$0
|
|
MOVL $28, AX
|
|
INT $64
|
|
MOVL AX, ret+4(FP)
|
|
RET
|
|
|
|
TEXT runtime·noted(SB),NOSPLIT,$0
|
|
MOVL $29, AX
|
|
INT $64
|
|
MOVL AX, ret+4(FP)
|
|
RET
|
|
|
|
TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0
|
|
MOVL $38, AX
|
|
INT $64
|
|
MOVL AX, ret+8(FP)
|
|
RET
|
|
|
|
TEXT runtime·rfork(SB),NOSPLIT,$0
|
|
MOVL $19, AX
|
|
INT $64
|
|
MOVL AX, ret+4(FP)
|
|
RET
|
|
|
|
TEXT runtime·tstart_plan9(SB),NOSPLIT,$0
|
|
MOVL newm+0(FP), CX
|
|
MOVL m_g0(CX), DX
|
|
|
|
// Layout new m scheduler stack on os stack.
|
|
MOVL SP, AX
|
|
MOVL AX, (g_stack+stack_hi)(DX)
|
|
SUBL $(64*1024), AX // stack size
|
|
MOVL AX, (g_stack+stack_lo)(DX)
|
|
MOVL AX, g_stackguard0(DX)
|
|
MOVL AX, g_stackguard1(DX)
|
|
|
|
// Initialize procid from TOS struct.
|
|
MOVL _tos(SB), AX
|
|
MOVL 48(AX), AX
|
|
MOVL AX, m_procid(CX) // save pid as m->procid
|
|
|
|
// Finally, initialize g.
|
|
get_tls(BX)
|
|
MOVL DX, g(BX)
|
|
|
|
CALL runtime·stackcheck(SB) // smashes AX, CX
|
|
CALL runtime·mstart(SB)
|
|
|
|
MOVL $0x1234, 0x1234 // not reached
|
|
RET
|
|
|
|
// void sigtramp(void *ureg, int8 *note)
|
|
TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
|
get_tls(AX)
|
|
|
|
// check that g exists
|
|
MOVL g(AX), BX
|
|
CMPL BX, $0
|
|
JNE 3(PC)
|
|
CALL runtime·badsignal2(SB) // will exit
|
|
RET
|
|
|
|
// save args
|
|
MOVL ureg+4(SP), CX
|
|
MOVL note+8(SP), DX
|
|
|
|
// change stack
|
|
MOVL g_m(BX), BX
|
|
MOVL m_gsignal(BX), BP
|
|
MOVL (g_stack+stack_hi)(BP), BP
|
|
MOVL BP, SP
|
|
|
|
// make room for args and g
|
|
SUBL $24, SP
|
|
|
|
// save g
|
|
MOVL g(AX), BP
|
|
MOVL BP, 20(SP)
|
|
|
|
// g = m->gsignal
|
|
MOVL m_gsignal(BX), DI
|
|
MOVL DI, g(AX)
|
|
|
|
// load args and call sighandler
|
|
MOVL CX, 0(SP)
|
|
MOVL DX, 4(SP)
|
|
MOVL BP, 8(SP)
|
|
|
|
CALL runtime·sighandler(SB)
|
|
MOVL 12(SP), AX
|
|
|
|
// restore g
|
|
get_tls(BX)
|
|
MOVL 20(SP), BP
|
|
MOVL BP, g(BX)
|
|
|
|
// call noted(AX)
|
|
MOVL AX, 0(SP)
|
|
CALL runtime·noted(SB)
|
|
RET
|
|
|
|
// Only used by the 64-bit runtime.
|
|
TEXT runtime·setfpmasks(SB),NOSPLIT,$0
|
|
RET
|
|
|
|
#define ERRMAX 128 /* from os_plan9.h */
|
|
|
|
// void errstr(int8 *buf, int32 len)
|
|
TEXT errstr<>(SB),NOSPLIT,$0
|
|
MOVL $41, AX
|
|
INT $64
|
|
RET
|
|
|
|
// 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,$8-8
|
|
get_tls(AX)
|
|
MOVL g(AX), BX
|
|
MOVL g_m(BX), BX
|
|
MOVL (m_mOS+mOS_errstr)(BX), CX
|
|
MOVL CX, 0(SP)
|
|
MOVL $ERRMAX, 4(SP)
|
|
CALL errstr<>(SB)
|
|
CALL runtime·findnull(SB)
|
|
MOVL 4(SP), AX
|
|
MOVL AX, ret_len+4(FP)
|
|
MOVL 0(SP), AX
|
|
MOVL AX, ret_base+0(FP)
|
|
RET
|