mirror of
https://github.com/golang/go
synced 2024-11-21 23:14:40 -07:00
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
This commit is contained in:
parent
26fa1c8248
commit
c9e5600f7d
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user