Commit a566deac authored by Akshat Kumar's avatar Akshat Kumar Committed by Ron Minnich

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
parent 2ac799cf
......@@ -320,6 +320,7 @@ struct M
#endif
#ifdef GOOS_plan9
int8* notesig;
byte* errstr;
#endif
SEH* seh;
uintptr end[];
......
......@@ -170,3 +170,23 @@ TEXT runtime·sigtramp(SB),7,$0
// Only used by the 64-bit runtime.
TEXT runtime·setfpmasks(SB),7,$0
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)
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),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.
mp->gsignal = runtime·malg(32*1024);
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).
......
......@@ -29,7 +29,7 @@ TEXT ·Syscall(SB),7,$0
JNE ok3
SUBL $8, SP
CALL syscall·errstr(SB)
CALL runtime·errstr(SB)
MOVL SP, SI
ADDL $8, SP
JMP copyresult3
......@@ -67,7 +67,7 @@ TEXT ·Syscall6(SB),7,$0
JNE ok4
SUBL $8, SP
CALL syscall·errstr(SB)
CALL runtime·errstr(SB)
MOVL SP, SI
ADDL $8, SP
JMP copyresult4
......
......@@ -32,7 +32,7 @@ TEXT ·Syscall(SB),7,$0
JNE ok3
SUBQ $16, SP
CALL syscall·errstr(SB)
CALL runtime·errstr(SB)
MOVQ SP, SI
ADDQ $16, SP
JMP copyresult3
......@@ -71,7 +71,7 @@ TEXT ·Syscall6(SB),7,$0
JNE ok4
SUBQ $16, SP
CALL syscall·errstr(SB)
CALL runtime·errstr(SB)
MOVQ SP, SI
ADDQ $16, SP
JMP copyresult4
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment