It may have to switch stacks, since we are calling
a DLL instead of a system call.
badcallback says where it is, because it is being called
on a Windows stack already.
R=golang-dev, alex.brainman
CC=golang-dev
https://golang.org/cl/
5782060
RET
-TEXT runtime·write(SB),7,$24
- // write only writes to stderr; ignore fd
- MOVL $-12, 0(SP)
- MOVL SP, BP
- CALL *runtime·GetStdHandle(SB)
- MOVL BP, SP
-
- MOVL AX, 0(SP) // handle
- MOVL buf+4(FP), DX // pointer
- MOVL DX, 4(SP)
- MOVL count+8(FP), DX // count
- MOVL DX, 8(SP)
- LEAL 20(SP), DX // written count
- MOVL $0, 0(DX)
- MOVL DX, 12(SP)
- MOVL $0, 16(SP) // overlapped
- CALL *runtime·WriteFile(SB)
- MOVL BP, SI
- RET
-
TEXT runtime·badcallback(SB),7,$24
- // write only writes to stderr; ignore fd
+ // stderr
MOVL $-12, 0(SP)
MOVL SP, BP
CALL *runtime·GetStdHandle(SB)
MOVL BP, SP
-
+
MOVL AX, 0(SP) // handle
MOVL $runtime·badcallbackmsg(SB), DX // pointer
MOVL DX, 4(SP)
RET
-TEXT runtime·write(SB),7,$48
- // write only ever writes to stderr; ignore fd
- MOVQ $-12, CX // stderr
- MOVQ CX, 0(SP)
- MOVQ runtime·GetStdHandle(SB), AX
- CALL AX
-
- MOVQ AX, CX // handle
- MOVQ CX, 0(SP)
- MOVQ buf+8(FP), DX // pointer
- MOVQ DX, 8(SP)
- MOVL count+16(FP), R8 // count
- MOVQ R8, 16(SP)
- LEAQ 40(SP), R9 // written count
- MOVQ $0, 0(R9)
- MOVQ R9, 24(SP)
- MOVQ $0, 32(SP) // overlapped
- MOVQ runtime·WriteFile(SB), AX
- CALL AX
-
- RET
-
TEXT runtime·badcallback(SB),7,$48
+ // stderr
MOVQ $-12, CX // stderr
MOVQ CX, 0(SP)
MOVQ runtime·GetStdHandle(SB), AX
runtime·stdcall(runtime·ExitProcess, 1, (uintptr)code);
}
+int32
+runtime·write(int32 fd, void *buf, int32 n)
+{
+ void *handle;
+ uint32 written;
+
+ written = 0;
+ switch(fd) {
+ case 1:
+ handle = runtime·stdcall(runtime·GetStdHandle, 1, (uintptr)-11);
+ break;
+ case 2:
+ handle = runtime·stdcall(runtime·GetStdHandle, 1, (uintptr)-12);
+ break;
+ default:
+ return -1;
+ }
+ runtime·stdcall(runtime·WriteFile, 5, handle, buf, (uintptr)n, &written, (uintptr)0);
+ return written;
+}
+
void
runtime·osyield(void)
{