Commit c9e5600f authored by Russ Cox's avatar Russ Cox

runtime: move runtime.write back to C

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
parent 26fa1c82
...@@ -38,28 +38,8 @@ TEXT runtime·asmstdcall(SB),7,$0 ...@@ -38,28 +38,8 @@ TEXT runtime·asmstdcall(SB),7,$0
RET 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 TEXT runtime·badcallback(SB),7,$24
// write only writes to stderr; ignore fd // stderr
MOVL $-12, 0(SP) MOVL $-12, 0(SP)
MOVL SP, BP MOVL SP, BP
CALL *runtime·GetStdHandle(SB) CALL *runtime·GetStdHandle(SB)
......
...@@ -60,29 +60,8 @@ loadregs: ...@@ -60,29 +60,8 @@ loadregs:
RET 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 TEXT runtime·badcallback(SB),7,$48
// stderr
MOVQ $-12, CX // stderr MOVQ $-12, CX // stderr
MOVQ CX, 0(SP) MOVQ CX, 0(SP)
MOVQ runtime·GetStdHandle(SB), AX MOVQ runtime·GetStdHandle(SB), AX
......
...@@ -114,6 +114,27 @@ runtime·exit(int32 code) ...@@ -114,6 +114,27 @@ runtime·exit(int32 code)
runtime·stdcall(runtime·ExitProcess, 1, (uintptr)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 void
runtime·osyield(void) runtime·osyield(void)
{ {
......
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