aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkshat Kumar <seed@mail.nanosouffle.net>2013-03-08 00:54:44 +0100
committerRon Minnich <rminnich@gmail.com>2013-03-08 00:54:44 +0100
commita566deace1d96cd517e79227937e3036baca7ee2 (patch)
treea5973da40ca4bfcafd0f98a0284ac8c02d740270 /src
parent2ac799cfbcf212675d64ea0df835ca6c2e2aa368 (diff)
downloadgo-a566deace1d96cd517e79227937e3036baca7ee2.tar.xz
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
Diffstat (limited to 'src')
-rw-r--r--src/pkg/runtime/runtime.h1
-rw-r--r--src/pkg/runtime/sys_plan9_386.s20
-rw-r--r--src/pkg/runtime/sys_plan9_amd64.s21
-rw-r--r--src/pkg/runtime/thread_plan9.c4
-rw-r--r--src/pkg/syscall/asm_plan9_386.s4
-rw-r--r--src/pkg/syscall/asm_plan9_amd64.s4
6 files changed, 50 insertions, 4 deletions
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index e44064f1ae..66bcf603bd 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -320,6 +320,7 @@ struct M
#endif
#ifdef GOOS_plan9
int8* notesig;
+ byte* errstr;
#endif
SEH* seh;
uintptr end[];
diff --git a/src/pkg/runtime/sys_plan9_386.s b/src/pkg/runtime/sys_plan9_386.s
index 3385b083a1..09211e8807 100644
--- a/src/pkg/runtime/sys_plan9_386.s
+++ b/src/pkg/runtime/sys_plan9_386.s
@@ -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
diff --git a/src/pkg/runtime/sys_plan9_amd64.s b/src/pkg/runtime/sys_plan9_amd64.s
index b34f98a685..68563f3e3c 100644
--- a/src/pkg/runtime/sys_plan9_amd64.s
+++ b/src/pkg/runtime/sys_plan9_amd64.s
@@ -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
diff --git a/src/pkg/runtime/thread_plan9.c b/src/pkg/runtime/thread_plan9.c
index 7f94623e7b..524dbf6925 100644
--- a/src/pkg/runtime/thread_plan9.c
+++ b/src/pkg/runtime/thread_plan9.c
@@ -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).
diff --git a/src/pkg/syscall/asm_plan9_386.s b/src/pkg/syscall/asm_plan9_386.s
index 2ba1376081..0ae20f5682 100644
--- a/src/pkg/syscall/asm_plan9_386.s
+++ b/src/pkg/syscall/asm_plan9_386.s
@@ -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
diff --git a/src/pkg/syscall/asm_plan9_amd64.s b/src/pkg/syscall/asm_plan9_amd64.s
index e363b743c1..40cc126420 100644
--- a/src/pkg/syscall/asm_plan9_amd64.s
+++ b/src/pkg/syscall/asm_plan9_amd64.s
@@ -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