mirror of
https://github.com/golang/go
synced 2024-11-12 08:20:22 -07:00
syscall: Plan 9: use lightweight errstr in entersyscall mode
Change 231af8ac63aa (CL 7314062) made runtime.enteryscall() set m->mcache = nil, which means that we can no longer use syscall.errstr in syscall.Syscall and syscall.Syscall6, since it requires a new buffer to be allocated for holding the error string. Instead, we use pre-allocated per-M storage to hold error strings from syscalls made while in entersyscall mode, and call runtime.findnull to calculate the lengths. Fixes #4994. R=rsc, rminnich, ality, dvyukov, rminnich, r CC=golang-dev https://golang.org/cl/7567043
This commit is contained in:
parent
2ac799cfbc
commit
a566deace1
@ -320,6 +320,7 @@ struct M
|
|||||||
#endif
|
#endif
|
||||||
#ifdef GOOS_plan9
|
#ifdef GOOS_plan9
|
||||||
int8* notesig;
|
int8* notesig;
|
||||||
|
byte* errstr;
|
||||||
#endif
|
#endif
|
||||||
SEH* seh;
|
SEH* seh;
|
||||||
uintptr end[];
|
uintptr end[];
|
||||||
|
@ -170,3 +170,23 @@ TEXT runtime·sigtramp(SB),7,$0
|
|||||||
// Only used by the 64-bit runtime.
|
// Only used by the 64-bit runtime.
|
||||||
TEXT runtime·setfpmasks(SB),7,$0
|
TEXT runtime·setfpmasks(SB),7,$0
|
||||||
RET
|
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),7,$0
|
||||||
|
get_tls(AX)
|
||||||
|
MOVL m(AX), BX
|
||||||
|
MOVL m_errstr(BX), CX
|
||||||
|
MOVL CX, 4(SP)
|
||||||
|
MOVL $ERRMAX, 8(SP)
|
||||||
|
MOVL $41, AX
|
||||||
|
INT $64
|
||||||
|
CALL runtime·findnull(SB)
|
||||||
|
MOVL AX, 8(SP)
|
||||||
|
RET
|
||||||
|
@ -206,3 +206,24 @@ TEXT runtime·setfpmasks(SB),7,$8
|
|||||||
MOVL AX, 0(SP)
|
MOVL AX, 0(SP)
|
||||||
LDMXCSR 0(SP)
|
LDMXCSR 0(SP)
|
||||||
RET
|
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),7,$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
|
||||||
|
CALL runtime·findnull(SB)
|
||||||
|
MOVQ AX, 16(SP)
|
||||||
|
RET
|
||||||
|
@ -19,6 +19,10 @@ runtime·mpreinit(M *mp)
|
|||||||
// Initialize stack and goroutine for note handling.
|
// Initialize stack and goroutine for note handling.
|
||||||
mp->gsignal = runtime·malg(32*1024);
|
mp->gsignal = runtime·malg(32*1024);
|
||||||
mp->notesig = (int8*)runtime·malloc(ERRMAX*sizeof(int8));
|
mp->notesig = (int8*)runtime·malloc(ERRMAX*sizeof(int8));
|
||||||
|
|
||||||
|
// Initialize stack for handling strings from the
|
||||||
|
// errstr system call, as used in package syscall.
|
||||||
|
mp->errstr = (byte*)runtime·malloc(ERRMAX*sizeof(byte));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called to initialize a new m (including the bootstrap m).
|
// Called to initialize a new m (including the bootstrap m).
|
||||||
|
@ -29,7 +29,7 @@ TEXT ·Syscall(SB),7,$0
|
|||||||
JNE ok3
|
JNE ok3
|
||||||
|
|
||||||
SUBL $8, SP
|
SUBL $8, SP
|
||||||
CALL syscall·errstr(SB)
|
CALL runtime·errstr(SB)
|
||||||
MOVL SP, SI
|
MOVL SP, SI
|
||||||
ADDL $8, SP
|
ADDL $8, SP
|
||||||
JMP copyresult3
|
JMP copyresult3
|
||||||
@ -67,7 +67,7 @@ TEXT ·Syscall6(SB),7,$0
|
|||||||
JNE ok4
|
JNE ok4
|
||||||
|
|
||||||
SUBL $8, SP
|
SUBL $8, SP
|
||||||
CALL syscall·errstr(SB)
|
CALL runtime·errstr(SB)
|
||||||
MOVL SP, SI
|
MOVL SP, SI
|
||||||
ADDL $8, SP
|
ADDL $8, SP
|
||||||
JMP copyresult4
|
JMP copyresult4
|
||||||
|
@ -32,7 +32,7 @@ TEXT ·Syscall(SB),7,$0
|
|||||||
JNE ok3
|
JNE ok3
|
||||||
|
|
||||||
SUBQ $16, SP
|
SUBQ $16, SP
|
||||||
CALL syscall·errstr(SB)
|
CALL runtime·errstr(SB)
|
||||||
MOVQ SP, SI
|
MOVQ SP, SI
|
||||||
ADDQ $16, SP
|
ADDQ $16, SP
|
||||||
JMP copyresult3
|
JMP copyresult3
|
||||||
@ -71,7 +71,7 @@ TEXT ·Syscall6(SB),7,$0
|
|||||||
JNE ok4
|
JNE ok4
|
||||||
|
|
||||||
SUBQ $16, SP
|
SUBQ $16, SP
|
||||||
CALL syscall·errstr(SB)
|
CALL runtime·errstr(SB)
|
||||||
MOVQ SP, SI
|
MOVQ SP, SI
|
||||||
ADDQ $16, SP
|
ADDQ $16, SP
|
||||||
JMP copyresult4
|
JMP copyresult4
|
||||||
|
Loading…
Reference in New Issue
Block a user