blob: fd20a5cd119a5afacb1639b8b744ddb2c3485202 [file] [log] [blame]
Russ Cox25f6b022014-08-27 11:32:17 -04001// Copyright 2014 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runtime
6
7import "unsafe"
8
Aram Hăvărneanue088e162014-11-13 16:07:10 +01009type libcFunc uintptr
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020010
11var asmsysvicall6 libcFunc
12
David Crawshawa5b693b2015-04-24 12:47:46 -040013//go:noescape
14func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)
15
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020016//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020017func sysvicall0(fn *libcFunc) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020018 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020019 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020020 libcall.n = 0
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020021 libcall.args = uintptr(unsafe.Pointer(fn)) // it's unused but must be non-nil, otherwise crashes
Alex Brainman9d968cb2015-04-27 17:32:23 +100022 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020023 return libcall.r1
24}
25
26//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020027func sysvicall1(fn *libcFunc, a1 uintptr) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020028 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020029 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020030 libcall.n = 1
Aram Hăvărneanue088e162014-11-13 16:07:10 +010031 // TODO(rsc): Why is noescape necessary here and below?
Russ Coxe8a74dc2014-09-14 22:24:29 -040032 libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
Alex Brainman9d968cb2015-04-27 17:32:23 +100033 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020034 return libcall.r1
35}
36
37//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020038func sysvicall2(fn *libcFunc, a1, a2 uintptr) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020039 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020040 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020041 libcall.n = 2
Russ Coxe8a74dc2014-09-14 22:24:29 -040042 libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
Alex Brainman9d968cb2015-04-27 17:32:23 +100043 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020044 return libcall.r1
45}
46
47//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020048func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020049 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020050 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020051 libcall.n = 3
Russ Coxe8a74dc2014-09-14 22:24:29 -040052 libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
Alex Brainman9d968cb2015-04-27 17:32:23 +100053 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020054 return libcall.r1
55}
56
57//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020058func sysvicall4(fn *libcFunc, a1, a2, a3, a4 uintptr) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020059 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020060 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020061 libcall.n = 4
Russ Coxe8a74dc2014-09-14 22:24:29 -040062 libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
Alex Brainman9d968cb2015-04-27 17:32:23 +100063 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020064 return libcall.r1
65}
66
67//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020068func sysvicall5(fn *libcFunc, a1, a2, a3, a4, a5 uintptr) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020069 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020070 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020071 libcall.n = 5
Russ Coxe8a74dc2014-09-14 22:24:29 -040072 libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
Alex Brainman9d968cb2015-04-27 17:32:23 +100073 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020074 return libcall.r1
75}
76
77//go:nosplit
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020078func sysvicall6(fn *libcFunc, a1, a2, a3, a4, a5, a6 uintptr) uintptr {
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020079 libcall := &getg().m.libcall
Aram Hăvărneanuc94f1f72015-03-30 13:52:07 +020080 libcall.fn = uintptr(unsafe.Pointer(fn))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020081 libcall.n = 6
Russ Coxe8a74dc2014-09-14 22:24:29 -040082 libcall.args = uintptr(noescape(unsafe.Pointer(&a1)))
Alex Brainman9d968cb2015-04-27 17:32:23 +100083 asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall))
Aram Hăvărneanue77c2fe2014-08-29 12:28:09 +020084 return libcall.r1
85}