runtime: convert syscall_windows.c to Go

This is necessary because syscall.Syscall blocks, and the
garbage collector needs to be able to scan that frame while
it is blocked, and C frames have no garbage collection
information.

Windows builders are broken now due to this problem:
http://build.golang.org/log/152ca9a4be6783d3a8bf6e2f5b9fc265089728b6

LGTM=alex.brainman
R=alex.brainman
CC=golang-codereviews
https://golang.org/cl/144830043
This commit is contained in:
Russ Cox 2014-09-14 21:25:44 -04:00
parent 8e77a7ef6b
commit 2eccf0d18f
7 changed files with 138 additions and 191 deletions

View file

@ -86,3 +86,85 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) {
return callbackasmAddr(n)
}
func getLoadLibrary() uintptr
//go:nosplit
func syscall_loadlibrary(filename *uint16) (handle, err uintptr) {
var c libcall
c.fn = getLoadLibrary()
c.n = 1
c.args = uintptr(unsafe.Pointer(&filename))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
handle = c.r1
if handle == 0 {
err = c.err
}
return
}
func getGetProcAddress() uintptr
//go:nosplit
func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uintptr) {
var c libcall
c.fn = getGetProcAddress()
c.n = 2
c.args = uintptr(unsafe.Pointer(&handle))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
outhandle = c.r1
if outhandle == 0 {
err = c.err
}
return
}
//go:nosplit
func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
var c libcall
c.fn = fn
c.n = nargs
c.args = uintptr(unsafe.Pointer(&a1))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
return c.r1, c.r2, c.err
}
//go:nosplit
func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
var c libcall
c.fn = fn
c.n = nargs
c.args = uintptr(unsafe.Pointer(&a1))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
return c.r1, c.r2, c.err
}
//go:nosplit
func syscall_Syscall9(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) {
var c libcall
c.fn = fn
c.n = nargs
c.args = uintptr(unsafe.Pointer(&a1))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
return c.r1, c.r2, c.err
}
//go:nosplit
func syscall_Syscall12(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2, err uintptr) {
var c libcall
c.fn = fn
c.n = nargs
c.args = uintptr(unsafe.Pointer(&a1))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
return c.r1, c.r2, c.err
}
//go:nosplit
func syscall_Syscall15(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) {
var c libcall
c.fn = fn
c.n = nargs
c.args = uintptr(unsafe.Pointer(&a1))
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
return c.r1, c.r2, c.err
}