diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index e44064f1ae8..66bcf603bd5 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 3385b083a12..09211e8807f 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 b34f98a6855..68563f3e3ca 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 7f94623e7bb..524dbf69254 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 2ba13760812..0ae20f56825 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 e363b743c1e..40cc1264206 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