Russ Cox | 25f6b02 | 2014-08-27 11:32:17 -0400 | [diff] [blame] | 1 | // 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 | |
| 5 | package runtime |
| 6 | |
| 7 | import "unsafe" |
| 8 | |
Aram Hăvărneanu | e088e16 | 2014-11-13 16:07:10 +0100 | [diff] [blame] | 9 | type libcFunc uintptr |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 10 | |
| 11 | var asmsysvicall6 libcFunc |
| 12 | |
David Crawshaw | a5b693b | 2015-04-24 12:47:46 -0400 | [diff] [blame] | 13 | //go:noescape |
| 14 | func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) |
| 15 | |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 16 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 17 | func sysvicall0(fn *libcFunc) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 18 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 19 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 20 | libcall.n = 0 |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 21 | libcall.args = uintptr(unsafe.Pointer(fn)) // it's unused but must be non-nil, otherwise crashes |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 22 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 23 | return libcall.r1 |
| 24 | } |
| 25 | |
| 26 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 27 | func sysvicall1(fn *libcFunc, a1 uintptr) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 28 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 29 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 30 | libcall.n = 1 |
Aram Hăvărneanu | e088e16 | 2014-11-13 16:07:10 +0100 | [diff] [blame] | 31 | // TODO(rsc): Why is noescape necessary here and below? |
Russ Cox | e8a74dc | 2014-09-14 22:24:29 -0400 | [diff] [blame] | 32 | libcall.args = uintptr(noescape(unsafe.Pointer(&a1))) |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 33 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 34 | return libcall.r1 |
| 35 | } |
| 36 | |
| 37 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 38 | func sysvicall2(fn *libcFunc, a1, a2 uintptr) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 39 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 40 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 41 | libcall.n = 2 |
Russ Cox | e8a74dc | 2014-09-14 22:24:29 -0400 | [diff] [blame] | 42 | libcall.args = uintptr(noescape(unsafe.Pointer(&a1))) |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 43 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 44 | return libcall.r1 |
| 45 | } |
| 46 | |
| 47 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 48 | func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 49 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 50 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 51 | libcall.n = 3 |
Russ Cox | e8a74dc | 2014-09-14 22:24:29 -0400 | [diff] [blame] | 52 | libcall.args = uintptr(noescape(unsafe.Pointer(&a1))) |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 53 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 54 | return libcall.r1 |
| 55 | } |
| 56 | |
| 57 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 58 | func sysvicall4(fn *libcFunc, a1, a2, a3, a4 uintptr) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 59 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 60 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 61 | libcall.n = 4 |
Russ Cox | e8a74dc | 2014-09-14 22:24:29 -0400 | [diff] [blame] | 62 | libcall.args = uintptr(noescape(unsafe.Pointer(&a1))) |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 63 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 64 | return libcall.r1 |
| 65 | } |
| 66 | |
| 67 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 68 | func sysvicall5(fn *libcFunc, a1, a2, a3, a4, a5 uintptr) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 69 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 70 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 71 | libcall.n = 5 |
Russ Cox | e8a74dc | 2014-09-14 22:24:29 -0400 | [diff] [blame] | 72 | libcall.args = uintptr(noescape(unsafe.Pointer(&a1))) |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 73 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 74 | return libcall.r1 |
| 75 | } |
| 76 | |
| 77 | //go:nosplit |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 78 | func sysvicall6(fn *libcFunc, a1, a2, a3, a4, a5, a6 uintptr) uintptr { |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 79 | libcall := &getg().m.libcall |
Aram Hăvărneanu | c94f1f7 | 2015-03-30 13:52:07 +0200 | [diff] [blame] | 80 | libcall.fn = uintptr(unsafe.Pointer(fn)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 81 | libcall.n = 6 |
Russ Cox | e8a74dc | 2014-09-14 22:24:29 -0400 | [diff] [blame] | 82 | libcall.args = uintptr(noescape(unsafe.Pointer(&a1))) |
Alex Brainman | 9d968cb | 2015-04-27 17:32:23 +1000 | [diff] [blame] | 83 | asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(libcall)) |
Aram Hăvărneanu | e77c2fe | 2014-08-29 12:28:09 +0200 | [diff] [blame] | 84 | return libcall.r1 |
| 85 | } |