diff --git a/src/pkg/runtime/sys_windows_386.s b/src/pkg/runtime/sys_windows_386.s index c62715dbd71..0c5ede4b720 100644 --- a/src/pkg/runtime/sys_windows_386.s +++ b/src/pkg/runtime/sys_windows_386.s @@ -38,33 +38,13 @@ TEXT runtime·asmstdcall(SB),7,$0 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) diff --git a/src/pkg/runtime/sys_windows_amd64.s b/src/pkg/runtime/sys_windows_amd64.s index 73dc542aac7..c6a37c34536 100644 --- a/src/pkg/runtime/sys_windows_amd64.s +++ b/src/pkg/runtime/sys_windows_amd64.s @@ -60,29 +60,8 @@ loadregs: 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 diff --git a/src/pkg/runtime/thread_windows.c b/src/pkg/runtime/thread_windows.c index 49beba5dc14..83d1edc32d4 100644 --- a/src/pkg/runtime/thread_windows.c +++ b/src/pkg/runtime/thread_windows.c @@ -114,6 +114,27 @@ runtime·exit(int32 code) 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) {