Increase max argument to 15 (#182)
- commit
- 33b97fd6a58bb9b0a49975db60adc78b4619047e
- author
- TotallyGamerJet · · 2023-11-29 13:11 UTC
- committer
- GitHub · · 2023-11-29 13:11 UTC
- parent
- 192c5e8
- signature
- GPG Unverified
4AEE18F83AFDEB23The key is unknown
10 files · +184 -130
M callback_test.go +7 -7
| @@ -126,18 +126,18 @@ func TestNewCallbackFloat32(t *testing.T) { | |||
| 126 | 126 | func TestNewCallbackFloat32AndFloat64(t *testing.T) { | |
| 127 | 127 | // This tests that calling a function with a mix of float32 and float64 arguments works | |
| 128 | 128 | const ( | |
| 129 | - | expectedCbTotalF32 = float32(30) | |
| 130 | - | expectedCbTotalF64 = float64(15) | |
| 129 | + | expectedCbTotalF32 = float32(72) | |
| 130 | + | expectedCbTotalF64 = float64(48) | |
| 131 | 131 | ) | |
| 132 | 132 | var cbTotalF32 float32 | |
| 133 | 133 | var cbTotalF64 float64 | |
| 134 | - | imp := purego.NewCallback(func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32) { | |
| 135 | - | cbTotalF32 = f1 + f2 + f3 + f7 + f8 + f9 | |
| 136 | - | cbTotalF64 = f4 + f5 + f6 | |
| 134 | + | imp := purego.NewCallback(func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32, f10, f11, f12 float64, f13, f14, f15 float32) { | |
| 135 | + | cbTotalF32 = f1 + f2 + f3 + f7 + f8 + f9 + f13 + f14 + f15 | |
| 136 | + | cbTotalF64 = f4 + f5 + f6 + f10 + f11 + f12 | |
| 137 | 137 | }) | |
| 138 | - | var fn func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32) | |
| 138 | + | var fn func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32, f10, f11, f12 float64, f13, f14, f15 float32) | |
| 139 | 139 | purego.RegisterFunc(&fn, imp) | |
| 140 | - | fn(1, 2, 3, 4, 5, 6, 7, 8, 9) | |
| 140 | + | fn(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) | |
| 141 | 141 | ||
| 142 | 142 | if cbTotalF32 != expectedCbTotalF32 { | |
| 143 | 143 | t.Errorf("cbTotalF32 not correct got %f but wanted %f", cbTotalF32, expectedCbTotalF32) | |
| @@ -126,18 +126,18 @@ func TestNewCallbackFloat32(t *testing.T) { | |||||
| 126 | func TestNewCallbackFloat32AndFloat64(t *testing.T) { | 126 | func TestNewCallbackFloat32AndFloat64(t *testing.T) { | ||
| 127 | // This tests that calling a function with a mix of float32 and float64 arguments works | 127 | // This tests that calling a function with a mix of float32 and float64 arguments works | ||
| 128 | const ( | 128 | const ( | ||
| 129 | - | expectedCbTotalF32 = float32(30) | 129 | + | expectedCbTotalF32 = float32(72) |
| 130 | - | expectedCbTotalF64 = float64(15) | 130 | + | expectedCbTotalF64 = float64(48) |
| 131 | ) | 131 | ) | ||
| 132 | var cbTotalF32 float32 | 132 | var cbTotalF32 float32 | ||
| 133 | var cbTotalF64 float64 | 133 | var cbTotalF64 float64 | ||
| 134 | - | imp := purego.NewCallback(func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32) { | 134 | + | imp := purego.NewCallback(func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32, f10, f11, f12 float64, f13, f14, f15 float32) { |
| 135 | - | cbTotalF32 = f1 + f2 + f3 + f7 + f8 + f9 | 135 | + | cbTotalF32 = f1 + f2 + f3 + f7 + f8 + f9 + f13 + f14 + f15 |
| 136 | - | cbTotalF64 = f4 + f5 + f6 | 136 | + | cbTotalF64 = f4 + f5 + f6 + f10 + f11 + f12 |
| 137 | }) | 137 | }) | ||
| 138 | - | var fn func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32) | 138 | + | var fn func(f1, f2, f3 float32, f4, f5, f6 float64, f7, f8, f9 float32, f10, f11, f12 float64, f13, f14, f15 float32) |
| 139 | purego.RegisterFunc(&fn, imp) | 139 | purego.RegisterFunc(&fn, imp) | ||
| 140 | - | fn(1, 2, 3, 4, 5, 6, 7, 8, 9) | 140 | + | fn(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) |
| 141 | 141 | ||||
| 142 | if cbTotalF32 != expectedCbTotalF32 { | 142 | if cbTotalF32 != expectedCbTotalF32 { | ||
| 143 | t.Errorf("cbTotalF32 not correct got %f but wanted %f", cbTotalF32, expectedCbTotalF32) | 143 | t.Errorf("cbTotalF32 not correct got %f but wanted %f", cbTotalF32, expectedCbTotalF32) | ||
M func.go +8 -4
| @@ -236,17 +236,21 @@ func RegisterFunc(fptr interface{}, cfn uintptr) { | |||
| 236 | 236 | var r1, r2 uintptr | |
| 237 | 237 | if runtime.GOARCH == "arm64" || runtime.GOOS != "windows" { | |
| 238 | 238 | // Use the normal arm64 calling convention even on Windows | |
| 239 | - | syscall := syscall9Args{ | |
| 239 | + | syscall := syscall15Args{ | |
| 240 | 240 | cfn, | |
| 241 | - | sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], sysargs[5], sysargs[6], sysargs[7], sysargs[8], | |
| 241 | + | sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], sysargs[5], | |
| 242 | + | sysargs[6], sysargs[7], sysargs[8], sysargs[9], sysargs[10], sysargs[11], | |
| 243 | + | sysargs[12], sysargs[13], sysargs[14], | |
| 242 | 244 | floats[0], floats[1], floats[2], floats[3], floats[4], floats[5], floats[6], floats[7], | |
| 243 | 245 | 0, 0, 0, | |
| 244 | 246 | } | |
| 245 | - | runtime_cgocall(syscall9XABI0, unsafe.Pointer(&syscall)) | |
| 247 | + | runtime_cgocall(syscall15XABI0, unsafe.Pointer(&syscall)) | |
| 246 | 248 | r1, r2 = syscall.r1, syscall.r2 | |
| 247 | 249 | } else { | |
| 248 | 250 | // This is a fallback for Windows amd64, 386, and arm. Note this may not support floats | |
| 249 | - | r1, r2, _ = syscall_syscall9X(cfn, sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], sysargs[5], sysargs[6], sysargs[7], sysargs[8]) | |
| 251 | + | r1, r2, _ = syscall_syscall15X(cfn, sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], | |
| 252 | + | sysargs[5], sysargs[6], sysargs[7], sysargs[8], sysargs[9], sysargs[10], sysargs[11], | |
| 253 | + | sysargs[12], sysargs[13], sysargs[14]) | |
| 250 | 254 | } | |
| 251 | 255 | if ty.NumOut() == 0 { | |
| 252 | 256 | return nil | |
| @@ -236,17 +236,21 @@ func RegisterFunc(fptr interface{}, cfn uintptr) { | |||||
| 236 | var r1, r2 uintptr | 236 | var r1, r2 uintptr | ||
| 237 | if runtime.GOARCH == "arm64" || runtime.GOOS != "windows" { | 237 | if runtime.GOARCH == "arm64" || runtime.GOOS != "windows" { | ||
| 238 | // Use the normal arm64 calling convention even on Windows | 238 | // Use the normal arm64 calling convention even on Windows | ||
| 239 | - | syscall := syscall9Args{ | 239 | + | syscall := syscall15Args{ |
| 240 | cfn, | 240 | cfn, | ||
| 241 | - | sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], sysargs[5], sysargs[6], sysargs[7], sysargs[8], | 241 | + | sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], sysargs[5], |
| 242 | + | sysargs[6], sysargs[7], sysargs[8], sysargs[9], sysargs[10], sysargs[11], | |||
| 243 | + | sysargs[12], sysargs[13], sysargs[14], | |||
| 242 | floats[0], floats[1], floats[2], floats[3], floats[4], floats[5], floats[6], floats[7], | 244 | floats[0], floats[1], floats[2], floats[3], floats[4], floats[5], floats[6], floats[7], | ||
| 243 | 0, 0, 0, | 245 | 0, 0, 0, | ||
| 244 | } | 246 | } | ||
| 245 | - | runtime_cgocall(syscall9XABI0, unsafe.Pointer(&syscall)) | 247 | + | runtime_cgocall(syscall15XABI0, unsafe.Pointer(&syscall)) |
| 246 | r1, r2 = syscall.r1, syscall.r2 | 248 | r1, r2 = syscall.r1, syscall.r2 | ||
| 247 | } else { | 249 | } else { | ||
| 248 | // This is a fallback for Windows amd64, 386, and arm. Note this may not support floats | 250 | // This is a fallback for Windows amd64, 386, and arm. Note this may not support floats | ||
| 249 | - | r1, r2, _ = syscall_syscall9X(cfn, sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], sysargs[5], sysargs[6], sysargs[7], sysargs[8]) | 251 | + | r1, r2, _ = syscall_syscall15X(cfn, sysargs[0], sysargs[1], sysargs[2], sysargs[3], sysargs[4], |
| 252 | + | sysargs[5], sysargs[6], sysargs[7], sysargs[8], sysargs[9], sysargs[10], sysargs[11], | |||
| 253 | + | sysargs[12], sysargs[13], sysargs[14]) | |||
| 250 | } | 254 | } | ||
| 251 | if ty.NumOut() == 0 { | 255 | if ty.NumOut() == 0 { | ||
| 252 | return nil | 256 | return nil | ||
M func_test.go +7 -7
| @@ -47,19 +47,19 @@ func TestRegisterFunc(t *testing.T) { | |||
| 47 | 47 | } | |
| 48 | 48 | ||
| 49 | 49 | func ExampleNewCallback() { | |
| 50 | - | cb := purego.NewCallback(func(a1, a2, a3, a4, a5, a6, a7, a8, a9 int) int { | |
| 51 | - | fmt.Println(a1, a2, a3, a4, a5, a6, a7, a8, a9) | |
| 52 | - | return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 | |
| 50 | + | cb := purego.NewCallback(func(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 int) int { | |
| 51 | + | fmt.Println(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) | |
| 52 | + | return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 | |
| 53 | 53 | }) | |
| 54 | 54 | ||
| 55 | - | var fn func(a1, a2, a3, a4, a5, a6, a7, a8, a9 int) int | |
| 55 | + | var fn func(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 int) int | |
| 56 | 56 | purego.RegisterFunc(&fn, cb) | |
| 57 | 57 | ||
| 58 | - | ret := fn(1, 2, 3, 4, 5, 6, 7, 8, 9) | |
| 58 | + | ret := fn(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) | |
| 59 | 59 | fmt.Println(ret) | |
| 60 | 60 | ||
| 61 | - | // Output: 1 2 3 4 5 6 7 8 9 | |
| 62 | - | // 45 | |
| 61 | + | // Output: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
| 62 | + | // 120 | |
| 63 | 63 | } | |
| 64 | 64 | ||
| 65 | 65 | func Test_qsort(t *testing.T) { | |
| @@ -47,19 +47,19 @@ func TestRegisterFunc(t *testing.T) { | |||||
| 47 | } | 47 | } | ||
| 48 | 48 | ||||
| 49 | func ExampleNewCallback() { | 49 | func ExampleNewCallback() { | ||
| 50 | - | cb := purego.NewCallback(func(a1, a2, a3, a4, a5, a6, a7, a8, a9 int) int { | 50 | + | cb := purego.NewCallback(func(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 int) int { |
| 51 | - | fmt.Println(a1, a2, a3, a4, a5, a6, a7, a8, a9) | 51 | + | fmt.Println(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) |
| 52 | - | return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 | 52 | + | return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 |
| 53 | }) | 53 | }) | ||
| 54 | 54 | ||||
| 55 | - | var fn func(a1, a2, a3, a4, a5, a6, a7, a8, a9 int) int | 55 | + | var fn func(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 int) int |
| 56 | purego.RegisterFunc(&fn, cb) | 56 | purego.RegisterFunc(&fn, cb) | ||
| 57 | 57 | ||||
| 58 | - | ret := fn(1, 2, 3, 4, 5, 6, 7, 8, 9) | 58 | + | ret := fn(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) |
| 59 | fmt.Println(ret) | 59 | fmt.Println(ret) | ||
| 60 | 60 | ||||
| 61 | - | // Output: 1 2 3 4 5 6 7 8 9 | 61 | + | // Output: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
| 62 | - | // 45 | 62 | + | // 120 |
| 63 | } | 63 | } | ||
| 64 | 64 | ||||
| 65 | func Test_qsort(t *testing.T) { | 65 | func Test_qsort(t *testing.T) { | ||
M internal/cgo/syscall_cgo_unix.go +18 -12
| @@ -16,18 +16,21 @@ package cgo | |||
| 16 | 16 | #include <errno.h> | |
| 17 | 17 | #include <assert.h> | |
| 18 | 18 | ||
| 19 | - | typedef struct syscall9Args { | |
| 19 | + | typedef struct syscall15Args { | |
| 20 | 20 | uintptr_t fn; | |
| 21 | - | uintptr_t a1, a2, a3, a4, a5, a6, a7, a8, a9; | |
| 21 | + | uintptr_t a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15; | |
| 22 | 22 | uintptr_t f1, f2, f3, f4, f5, f6, f7, f8; | |
| 23 | 23 | uintptr_t r1, r2, err; | |
| 24 | - | } syscall9Args; | |
| 24 | + | } syscall15Args; | |
| 25 | 25 | ||
| 26 | - | void syscall9(struct syscall9Args *args) { | |
| 26 | + | void syscall15(struct syscall15Args *args) { | |
| 27 | 27 | assert((args->f1|args->f2|args->f3|args->f4|args->f5|args->f6|args->f7|args->f8) == 0); | |
| 28 | - | uintptr_t (*func_name)(uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9); | |
| 28 | + | uintptr_t (*func_name)(uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, | |
| 29 | + | uintptr_t a7, uintptr_t a8, uintptr_t a9, uintptr_t a10, uintptr_t a11, uintptr_t a12, | |
| 30 | + | uintptr_t a13, uintptr_t a14, uintptr_t a15); | |
| 29 | 31 | *(void**)(&func_name) = (void*)(args->fn); | |
| 30 | - | uintptr_t r1 = func_name(args->a1,args->a2,args->a3,args->a4,args->a5,args->a6,args->a7,args->a8,args->a9); | |
| 32 | + | uintptr_t r1 = func_name(args->a1,args->a2,args->a3,args->a4,args->a5,args->a6,args->a7,args->a8,args->a9, | |
| 33 | + | args->a10,args->a11,args->a12,args->a13,args->a14,args->a15); | |
| 31 | 34 | args->r1 = r1; | |
| 32 | 35 | args->err = errno; | |
| 33 | 36 | } | |
| @@ -36,8 +39,8 @@ void syscall9(struct syscall9Args *args) { | |||
| 36 | 39 | import "C" | |
| 37 | 40 | import "unsafe" | |
| 38 | 41 | ||
| 39 | - | // assign purego.syscall9XABI0 to the C version of this function. | |
| 40 | - | var Syscall9XABI0 = unsafe.Pointer(C.syscall9) | |
| 42 | + | // assign purego.syscall15XABI0 to the C version of this function. | |
| 43 | + | var Syscall15XABI0 = unsafe.Pointer(C.syscall15) | |
| 41 | 44 | ||
| 42 | 45 | // all that is needed is to assign each dl function because then its | |
| 43 | 46 | // symbol will then be made available to the linker and linked to inside dlfcn.go | |
| @@ -49,10 +52,13 @@ var ( | |||
| 49 | 52 | ) | |
| 50 | 53 | ||
| 51 | 54 | //go:nosplit | |
| 52 | - | func Syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | |
| 53 | - | args := C.syscall9Args{C.uintptr_t(fn), C.uintptr_t(a1), C.uintptr_t(a2), C.uintptr_t(a3), | |
| 55 | + | func Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | |
| 56 | + | args := C.syscall15Args{ | |
| 57 | + | C.uintptr_t(fn), C.uintptr_t(a1), C.uintptr_t(a2), C.uintptr_t(a3), | |
| 54 | 58 | C.uintptr_t(a4), C.uintptr_t(a5), C.uintptr_t(a6), | |
| 55 | - | C.uintptr_t(a7), C.uintptr_t(a8), C.uintptr_t(a9), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
| 56 | - | C.syscall9(&args) | |
| 59 | + | C.uintptr_t(a7), C.uintptr_t(a8), C.uintptr_t(a9), C.uintptr_t(a10), C.uintptr_t(a11), C.uintptr_t(a12), | |
| 60 | + | C.uintptr_t(a13), C.uintptr_t(a14), C.uintptr_t(a15), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 61 | + | } | |
| 62 | + | C.syscall15(&args) | |
| 57 | 63 | return uintptr(args.r1), uintptr(args.r2), uintptr(args.err) | |
| 58 | 64 | } | |
| @@ -16,18 +16,21 @@ package cgo | |||||
| 16 | #include <errno.h> | 16 | #include <errno.h> | ||
| 17 | #include <assert.h> | 17 | #include <assert.h> | ||
| 18 | 18 | ||||
| 19 | - | typedef struct syscall9Args { | 19 | + | typedef struct syscall15Args { |
| 20 | uintptr_t fn; | 20 | uintptr_t fn; | ||
| 21 | - | uintptr_t a1, a2, a3, a4, a5, a6, a7, a8, a9; | 21 | + | uintptr_t a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15; |
| 22 | uintptr_t f1, f2, f3, f4, f5, f6, f7, f8; | 22 | uintptr_t f1, f2, f3, f4, f5, f6, f7, f8; | ||
| 23 | uintptr_t r1, r2, err; | 23 | uintptr_t r1, r2, err; | ||
| 24 | - | } syscall9Args; | 24 | + | } syscall15Args; |
| 25 | 25 | ||||
| 26 | - | void syscall9(struct syscall9Args *args) { | 26 | + | void syscall15(struct syscall15Args *args) { |
| 27 | assert((args->f1|args->f2|args->f3|args->f4|args->f5|args->f6|args->f7|args->f8) == 0); | 27 | assert((args->f1|args->f2|args->f3|args->f4|args->f5|args->f6|args->f7|args->f8) == 0); | ||
| 28 | - | uintptr_t (*func_name)(uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9); | 28 | + | uintptr_t (*func_name)(uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, |
| 29 | + | uintptr_t a7, uintptr_t a8, uintptr_t a9, uintptr_t a10, uintptr_t a11, uintptr_t a12, | |||
| 30 | + | uintptr_t a13, uintptr_t a14, uintptr_t a15); | |||
| 29 | *(void**)(&func_name) = (void*)(args->fn); | 31 | *(void**)(&func_name) = (void*)(args->fn); | ||
| 30 | - | uintptr_t r1 = func_name(args->a1,args->a2,args->a3,args->a4,args->a5,args->a6,args->a7,args->a8,args->a9); | 32 | + | uintptr_t r1 = func_name(args->a1,args->a2,args->a3,args->a4,args->a5,args->a6,args->a7,args->a8,args->a9, |
| 33 | + | args->a10,args->a11,args->a12,args->a13,args->a14,args->a15); | |||
| 31 | args->r1 = r1; | 34 | args->r1 = r1; | ||
| 32 | args->err = errno; | 35 | args->err = errno; | ||
| 33 | } | 36 | } | ||
| @@ -36,8 +39,8 @@ void syscall9(struct syscall9Args *args) { | |||||
| 36 | import "C" | 39 | import "C" | ||
| 37 | import "unsafe" | 40 | import "unsafe" | ||
| 38 | 41 | ||||
| 39 | - | // assign purego.syscall9XABI0 to the C version of this function. | 42 | + | // assign purego.syscall15XABI0 to the C version of this function. |
| 40 | - | var Syscall9XABI0 = unsafe.Pointer(C.syscall9) | 43 | + | var Syscall15XABI0 = unsafe.Pointer(C.syscall15) |
| 41 | 44 | ||||
| 42 | // all that is needed is to assign each dl function because then its | 45 | // all that is needed is to assign each dl function because then its | ||
| 43 | // symbol will then be made available to the linker and linked to inside dlfcn.go | 46 | // symbol will then be made available to the linker and linked to inside dlfcn.go | ||
| @@ -49,10 +52,13 @@ var ( | |||||
| 49 | ) | 52 | ) | ||
| 50 | 53 | ||||
| 51 | //go:nosplit | 54 | //go:nosplit | ||
| 52 | - | func Syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | 55 | + | func Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { |
| 53 | - | args := C.syscall9Args{C.uintptr_t(fn), C.uintptr_t(a1), C.uintptr_t(a2), C.uintptr_t(a3), | 56 | + | args := C.syscall15Args{ |
| 57 | + | C.uintptr_t(fn), C.uintptr_t(a1), C.uintptr_t(a2), C.uintptr_t(a3), | |||
| 54 | C.uintptr_t(a4), C.uintptr_t(a5), C.uintptr_t(a6), | 58 | C.uintptr_t(a4), C.uintptr_t(a5), C.uintptr_t(a6), | ||
| 55 | - | C.uintptr_t(a7), C.uintptr_t(a8), C.uintptr_t(a9), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | 59 | + | C.uintptr_t(a7), C.uintptr_t(a8), C.uintptr_t(a9), C.uintptr_t(a10), C.uintptr_t(a11), C.uintptr_t(a12), |
| 56 | - | C.syscall9(&args) | 60 | + | C.uintptr_t(a13), C.uintptr_t(a14), C.uintptr_t(a15), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 61 | + | } | |||
| 62 | + | C.syscall15(&args) | |||
| 57 | return uintptr(args.r1), uintptr(args.r2), uintptr(args.err) | 63 | return uintptr(args.r1), uintptr(args.r2), uintptr(args.err) | ||
| 58 | } | 64 | } | ||
M sys_amd64.s +60 -38
| @@ -8,8 +8,11 @@ | |||
| 8 | 8 | #include "go_asm.h" | |
| 9 | 9 | #include "funcdata.h" | |
| 10 | 10 | ||
| 11 | - | // syscall9X calls a function in libc on behalf of the syscall package. | |
| 12 | - | // syscall9X takes a pointer to a struct like: | |
| 11 | + | #define STACK_SIZE 80 | |
| 12 | + | #define PTR_ADDRESS (STACK_SIZE - 8) | |
| 13 | + | ||
| 14 | + | // syscall15X calls a function in libc on behalf of the syscall package. | |
| 15 | + | // syscall15X takes a pointer to a struct like: | |
| 13 | 16 | // struct { | |
| 14 | 17 | // fn uintptr | |
| 15 | 18 | // a1 uintptr | |
| @@ -21,54 +24,73 @@ | |||
| 21 | 24 | // a7 uintptr | |
| 22 | 25 | // a8 uintptr | |
| 23 | 26 | // a9 uintptr | |
| 27 | + | // a10 uintptr | |
| 28 | + | // a11 uintptr | |
| 29 | + | // a12 uintptr | |
| 30 | + | // a13 uintptr | |
| 31 | + | // a14 uintptr | |
| 32 | + | // a15 uintptr | |
| 24 | 33 | // r1 uintptr | |
| 25 | 34 | // r2 uintptr | |
| 26 | 35 | // err uintptr | |
| 27 | 36 | // } | |
| 28 | - | // syscall9X must be called on the g0 stack with the | |
| 37 | + | // syscall15X must be called on the g0 stack with the | |
| 29 | 38 | // C calling convention (use libcCall). | |
| 30 | - | GLOBL ·syscall9XABI0(SB), NOPTR|RODATA, $8 | |
| 31 | - | DATA ·syscall9XABI0(SB)/8, $syscall9X(SB) | |
| 32 | - | TEXT syscall9X(SB), NOSPLIT|NOFRAME, $0 | |
| 39 | + | GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8 | |
| 40 | + | DATA ·syscall15XABI0(SB)/8, $syscall15X(SB) | |
| 41 | + | TEXT syscall15X(SB), NOSPLIT|NOFRAME, $0 | |
| 33 | 42 | PUSHQ BP | |
| 34 | 43 | MOVQ SP, BP | |
| 35 | - | SUBQ $32, SP | |
| 36 | - | MOVQ DI, 24(BP) // save the pointer | |
| 37 | - | ||
| 38 | - | MOVQ syscall9Args_f1(DI), X0 // f1 | |
| 39 | - | MOVQ syscall9Args_f2(DI), X1 // f2 | |
| 40 | - | MOVQ syscall9Args_f3(DI), X2 // f3 | |
| 41 | - | MOVQ syscall9Args_f4(DI), X3 // f4 | |
| 42 | - | MOVQ syscall9Args_f5(DI), X4 // f5 | |
| 43 | - | MOVQ syscall9Args_f6(DI), X5 // f6 | |
| 44 | - | MOVQ syscall9Args_f7(DI), X6 // f7 | |
| 45 | - | MOVQ syscall9Args_f8(DI), X7 // f8 | |
| 46 | - | ||
| 47 | - | MOVQ syscall9Args_fn(DI), R10 // fn | |
| 48 | - | MOVQ syscall9Args_a2(DI), SI // a2 | |
| 49 | - | MOVQ syscall9Args_a3(DI), DX // a3 | |
| 50 | - | MOVQ syscall9Args_a4(DI), CX // a4 | |
| 51 | - | MOVQ syscall9Args_a5(DI), R8 // a5 | |
| 52 | - | MOVQ syscall9Args_a6(DI), R9 // a6 | |
| 53 | - | MOVQ syscall9Args_a7(DI), R11 // a7 | |
| 54 | - | MOVQ syscall9Args_a8(DI), R12 // a8 | |
| 55 | - | MOVQ syscall9Args_a9(DI), R13 // a9 | |
| 56 | - | MOVQ syscall9Args_a1(DI), DI // a1 | |
| 44 | + | SUBQ $STACK_SIZE, SP | |
| 45 | + | MOVQ DI, PTR_ADDRESS(BP) // save the pointer | |
| 46 | + | MOVQ DI, R11 | |
| 47 | + | ||
| 48 | + | MOVQ syscall15Args_f1(R11), X0 // f1 | |
| 49 | + | MOVQ syscall15Args_f2(R11), X1 // f2 | |
| 50 | + | MOVQ syscall15Args_f3(R11), X2 // f3 | |
| 51 | + | MOVQ syscall15Args_f4(R11), X3 // f4 | |
| 52 | + | MOVQ syscall15Args_f5(R11), X4 // f5 | |
| 53 | + | MOVQ syscall15Args_f6(R11), X5 // f6 | |
| 54 | + | MOVQ syscall15Args_f7(R11), X6 // f7 | |
| 55 | + | MOVQ syscall15Args_f8(R11), X7 // f8 | |
| 56 | + | ||
| 57 | + | MOVQ syscall15Args_a1(R11), DI // a1 | |
| 58 | + | MOVQ syscall15Args_a2(R11), SI // a2 | |
| 59 | + | MOVQ syscall15Args_a3(R11), DX // a3 | |
| 60 | + | MOVQ syscall15Args_a4(R11), CX // a4 | |
| 61 | + | MOVQ syscall15Args_a5(R11), R8 // a5 | |
| 62 | + | MOVQ syscall15Args_a6(R11), R9 // a6 | |
| 57 | 63 | ||
| 58 | 64 | // push the remaining paramters onto the stack | |
| 59 | - | MOVQ R11, 0(SP) // push a7 | |
| 60 | - | MOVQ R12, 8(SP) // push a8 | |
| 61 | - | MOVQ R13, 16(SP) // push a9 | |
| 62 | - | XORL AX, AX // vararg: say "no float args" | |
| 63 | - | ||
| 65 | + | MOVQ syscall15Args_a7(R11), R12 | |
| 66 | + | MOVQ R12, 0(SP) // push a7 | |
| 67 | + | MOVQ syscall15Args_a8(R11), R12 | |
| 68 | + | MOVQ R12, 8(SP) // push a8 | |
| 69 | + | MOVQ syscall15Args_a9(R11), R12 | |
| 70 | + | MOVQ R12, 16(SP) // push a9 | |
| 71 | + | MOVQ syscall15Args_a10(R11), R12 | |
| 72 | + | MOVQ R12, 24(SP) // push a10 | |
| 73 | + | MOVQ syscall15Args_a11(R11), R12 | |
| 74 | + | MOVQ R12, 32(SP) // push a11 | |
| 75 | + | MOVQ syscall15Args_a12(R11), R12 | |
| 76 | + | MOVQ R12, 40(SP) // push a12 | |
| 77 | + | MOVQ syscall15Args_a13(R11), R12 | |
| 78 | + | MOVQ R12, 48(SP) // push a13 | |
| 79 | + | MOVQ syscall15Args_a14(R11), R12 | |
| 80 | + | MOVQ R12, 56(SP) // push a14 | |
| 81 | + | MOVQ syscall15Args_a15(R11), R12 | |
| 82 | + | MOVQ R12, 64(SP) // push a15 | |
| 83 | + | XORL AX, AX // vararg: say "no float args" | |
| 84 | + | ||
| 85 | + | MOVQ syscall15Args_fn(R11), R10 // fn | |
| 64 | 86 | CALL R10 | |
| 65 | 87 | ||
| 66 | - | MOVQ 24(BP), DI // get the pointer back | |
| 67 | - | MOVQ AX, syscall9Args_r1(DI) // r1 | |
| 68 | - | MOVQ X0, syscall9Args_r2(DI) // r2 | |
| 88 | + | MOVQ PTR_ADDRESS(BP), DI // get the pointer back | |
| 89 | + | MOVQ AX, syscall15Args_r1(DI) // r1 | |
| 90 | + | MOVQ X0, syscall15Args_r2(DI) // r2 | |
| 69 | 91 | ||
| 70 | - | XORL AX, AX // no error (it's ignored anyway) | |
| 71 | - | ADDQ $32, SP | |
| 92 | + | XORL AX, AX // no error (it's ignored anyway) | |
| 93 | + | ADDQ $STACK_SIZE, SP | |
| 72 | 94 | MOVQ BP, SP | |
| 73 | 95 | POPQ BP | |
| 74 | 96 | RET | |
| @@ -8,8 +8,11 @@ | |||||
| 8 | #include "go_asm.h" | 8 | #include "go_asm.h" | ||
| 9 | #include "funcdata.h" | 9 | #include "funcdata.h" | ||
| 10 | 10 | ||||
| 11 | - | // syscall9X calls a function in libc on behalf of the syscall package. | 11 | + | #define STACK_SIZE 80 |
| 12 | - | // syscall9X takes a pointer to a struct like: | 12 | + | #define PTR_ADDRESS (STACK_SIZE - 8) |
| 13 | + | ||||
| 14 | + | // syscall15X calls a function in libc on behalf of the syscall package. | |||
| 15 | + | // syscall15X takes a pointer to a struct like: | |||
| 13 | // struct { | 16 | // struct { | ||
| 14 | // fn uintptr | 17 | // fn uintptr | ||
| 15 | // a1 uintptr | 18 | // a1 uintptr | ||
| @@ -21,54 +24,73 @@ | |||||
| 21 | // a7 uintptr | 24 | // a7 uintptr | ||
| 22 | // a8 uintptr | 25 | // a8 uintptr | ||
| 23 | // a9 uintptr | 26 | // a9 uintptr | ||
| 27 | + | // a10 uintptr | |||
| 28 | + | // a11 uintptr | |||
| 29 | + | // a12 uintptr | |||
| 30 | + | // a13 uintptr | |||
| 31 | + | // a14 uintptr | |||
| 32 | + | // a15 uintptr | |||
| 24 | // r1 uintptr | 33 | // r1 uintptr | ||
| 25 | // r2 uintptr | 34 | // r2 uintptr | ||
| 26 | // err uintptr | 35 | // err uintptr | ||
| 27 | // } | 36 | // } | ||
| 28 | - | // syscall9X must be called on the g0 stack with the | 37 | + | // syscall15X must be called on the g0 stack with the |
| 29 | // C calling convention (use libcCall). | 38 | // C calling convention (use libcCall). | ||
| 30 | - | GLOBL ·syscall9XABI0(SB), NOPTR|RODATA, $8 | 39 | + | GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8 |
| 31 | - | DATA ·syscall9XABI0(SB)/8, $syscall9X(SB) | 40 | + | DATA ·syscall15XABI0(SB)/8, $syscall15X(SB) |
| 32 | - | TEXT syscall9X(SB), NOSPLIT|NOFRAME, $0 | 41 | + | TEXT syscall15X(SB), NOSPLIT|NOFRAME, $0 |
| 33 | PUSHQ BP | 42 | PUSHQ BP | ||
| 34 | MOVQ SP, BP | 43 | MOVQ SP, BP | ||
| 35 | - | SUBQ $32, SP | 44 | + | SUBQ $STACK_SIZE, SP |
| 36 | - | MOVQ DI, 24(BP) // save the pointer | 45 | + | MOVQ DI, PTR_ADDRESS(BP) // save the pointer |
| 37 | - | 46 | + | MOVQ DI, R11 | |
| 38 | - | MOVQ syscall9Args_f1(DI), X0 // f1 | 47 | + | |
| 39 | - | MOVQ syscall9Args_f2(DI), X1 // f2 | 48 | + | MOVQ syscall15Args_f1(R11), X0 // f1 |
| 40 | - | MOVQ syscall9Args_f3(DI), X2 // f3 | 49 | + | MOVQ syscall15Args_f2(R11), X1 // f2 |
| 41 | - | MOVQ syscall9Args_f4(DI), X3 // f4 | 50 | + | MOVQ syscall15Args_f3(R11), X2 // f3 |
| 42 | - | MOVQ syscall9Args_f5(DI), X4 // f5 | 51 | + | MOVQ syscall15Args_f4(R11), X3 // f4 |
| 43 | - | MOVQ syscall9Args_f6(DI), X5 // f6 | 52 | + | MOVQ syscall15Args_f5(R11), X4 // f5 |
| 44 | - | MOVQ syscall9Args_f7(DI), X6 // f7 | 53 | + | MOVQ syscall15Args_f6(R11), X5 // f6 |
| 45 | - | MOVQ syscall9Args_f8(DI), X7 // f8 | 54 | + | MOVQ syscall15Args_f7(R11), X6 // f7 |
| 46 | - | 55 | + | MOVQ syscall15Args_f8(R11), X7 // f8 | |
| 47 | - | MOVQ syscall9Args_fn(DI), R10 // fn | 56 | + | |
| 48 | - | MOVQ syscall9Args_a2(DI), SI // a2 | 57 | + | MOVQ syscall15Args_a1(R11), DI // a1 |
| 49 | - | MOVQ syscall9Args_a3(DI), DX // a3 | 58 | + | MOVQ syscall15Args_a2(R11), SI // a2 |
| 50 | - | MOVQ syscall9Args_a4(DI), CX // a4 | 59 | + | MOVQ syscall15Args_a3(R11), DX // a3 |
| 51 | - | MOVQ syscall9Args_a5(DI), R8 // a5 | 60 | + | MOVQ syscall15Args_a4(R11), CX // a4 |
| 52 | - | MOVQ syscall9Args_a6(DI), R9 // a6 | 61 | + | MOVQ syscall15Args_a5(R11), R8 // a5 |
| 53 | - | MOVQ syscall9Args_a7(DI), R11 // a7 | 62 | + | MOVQ syscall15Args_a6(R11), R9 // a6 |
| 54 | - | MOVQ syscall9Args_a8(DI), R12 // a8 | |||
| 55 | - | MOVQ syscall9Args_a9(DI), R13 // a9 | |||
| 56 | - | MOVQ syscall9Args_a1(DI), DI // a1 | |||
| 57 | 63 | ||||
| 58 | // push the remaining paramters onto the stack | 64 | // push the remaining paramters onto the stack | ||
| 59 | - | MOVQ R11, 0(SP) // push a7 | 65 | + | MOVQ syscall15Args_a7(R11), R12 |
| 60 | - | MOVQ R12, 8(SP) // push a8 | 66 | + | MOVQ R12, 0(SP) // push a7 |
| 61 | - | MOVQ R13, 16(SP) // push a9 | 67 | + | MOVQ syscall15Args_a8(R11), R12 |
| 62 | - | XORL AX, AX // vararg: say "no float args" | 68 | + | MOVQ R12, 8(SP) // push a8 |
| 63 | - | 69 | + | MOVQ syscall15Args_a9(R11), R12 | |
| 70 | + | MOVQ R12, 16(SP) // push a9 | |||
| 71 | + | MOVQ syscall15Args_a10(R11), R12 | |||
| 72 | + | MOVQ R12, 24(SP) // push a10 | |||
| 73 | + | MOVQ syscall15Args_a11(R11), R12 | |||
| 74 | + | MOVQ R12, 32(SP) // push a11 | |||
| 75 | + | MOVQ syscall15Args_a12(R11), R12 | |||
| 76 | + | MOVQ R12, 40(SP) // push a12 | |||
| 77 | + | MOVQ syscall15Args_a13(R11), R12 | |||
| 78 | + | MOVQ R12, 48(SP) // push a13 | |||
| 79 | + | MOVQ syscall15Args_a14(R11), R12 | |||
| 80 | + | MOVQ R12, 56(SP) // push a14 | |||
| 81 | + | MOVQ syscall15Args_a15(R11), R12 | |||
| 82 | + | MOVQ R12, 64(SP) // push a15 | |||
| 83 | + | XORL AX, AX // vararg: say "no float args" | |||
| 84 | + | ||||
| 85 | + | MOVQ syscall15Args_fn(R11), R10 // fn | |||
| 64 | CALL R10 | 86 | CALL R10 | ||
| 65 | 87 | ||||
| 66 | - | MOVQ 24(BP), DI // get the pointer back | 88 | + | MOVQ PTR_ADDRESS(BP), DI // get the pointer back |
| 67 | - | MOVQ AX, syscall9Args_r1(DI) // r1 | 89 | + | MOVQ AX, syscall15Args_r1(DI) // r1 |
| 68 | - | MOVQ X0, syscall9Args_r2(DI) // r2 | 90 | + | MOVQ X0, syscall15Args_r2(DI) // r2 |
| 69 | 91 | ||||
| 70 | - | XORL AX, AX // no error (it's ignored anyway) | 92 | + | XORL AX, AX // no error (it's ignored anyway) |
| 71 | - | ADDQ $32, SP | 93 | + | ADDQ $STACK_SIZE, SP |
| 72 | MOVQ BP, SP | 94 | MOVQ BP, SP | ||
| 73 | POPQ BP | 95 | POPQ BP | ||
| 74 | RET | 96 | RET | ||
M sys_arm64.s +59 -37
| @@ -7,8 +7,11 @@ | |||
| 7 | 7 | #include "go_asm.h" | |
| 8 | 8 | #include "funcdata.h" | |
| 9 | 9 | ||
| 10 | - | // syscall9X calls a function in libc on behalf of the syscall package. | |
| 11 | - | // syscall9X takes a pointer to a struct like: | |
| 10 | + | #define STACK_SIZE 64 | |
| 11 | + | #define PTR_ADDRESS (STACK_SIZE - 8) | |
| 12 | + | ||
| 13 | + | // syscall15X calls a function in libc on behalf of the syscall package. | |
| 14 | + | // syscall15X takes a pointer to a struct like: | |
| 12 | 15 | // struct { | |
| 13 | 16 | // fn uintptr | |
| 14 | 17 | // a1 uintptr | |
| @@ -20,44 +23,63 @@ | |||
| 20 | 23 | // a7 uintptr | |
| 21 | 24 | // a8 uintptr | |
| 22 | 25 | // a9 uintptr | |
| 26 | + | // a10 uintptr | |
| 27 | + | // a11 uintptr | |
| 28 | + | // a12 uintptr | |
| 29 | + | // a13 uintptr | |
| 30 | + | // a14 uintptr | |
| 31 | + | // a15 uintptr | |
| 23 | 32 | // r1 uintptr | |
| 24 | 33 | // r2 uintptr | |
| 25 | 34 | // err uintptr | |
| 26 | 35 | // } | |
| 27 | - | // syscall9X must be called on the g0 stack with the | |
| 36 | + | // syscall15X must be called on the g0 stack with the | |
| 28 | 37 | // C calling convention (use libcCall). | |
| 29 | - | GLOBL ·syscall9XABI0(SB), NOPTR|RODATA, $8 | |
| 30 | - | DATA ·syscall9XABI0(SB)/8, $syscall9X(SB) | |
| 31 | - | TEXT syscall9X(SB), NOSPLIT, $0 | |
| 32 | - | SUB $16, RSP // push structure pointer | |
| 33 | - | MOVD R0, 8(RSP) | |
| 34 | - | ||
| 35 | - | FMOVD syscall9Args_f1(R0), F0 // f1 | |
| 36 | - | FMOVD syscall9Args_f2(R0), F1 // f2 | |
| 37 | - | FMOVD syscall9Args_f3(R0), F2 // f3 | |
| 38 | - | FMOVD syscall9Args_f4(R0), F3 // f4 | |
| 39 | - | FMOVD syscall9Args_f5(R0), F4 // f5 | |
| 40 | - | FMOVD syscall9Args_f6(R0), F5 // f6 | |
| 41 | - | FMOVD syscall9Args_f7(R0), F6 // f7 | |
| 42 | - | FMOVD syscall9Args_f8(R0), F7 // f8 | |
| 43 | - | ||
| 44 | - | MOVD syscall9Args_fn(R0), R12 // fn | |
| 45 | - | MOVD syscall9Args_a2(R0), R1 // a2 | |
| 46 | - | MOVD syscall9Args_a3(R0), R2 // a3 | |
| 47 | - | MOVD syscall9Args_a4(R0), R3 // a4 | |
| 48 | - | MOVD syscall9Args_a5(R0), R4 // a5 | |
| 49 | - | MOVD syscall9Args_a6(R0), R5 // a6 | |
| 50 | - | MOVD syscall9Args_a7(R0), R6 // a7 | |
| 51 | - | MOVD syscall9Args_a8(R0), R7 // a8 | |
| 52 | - | MOVD syscall9Args_a9(R0), R8 // a9 | |
| 53 | - | MOVD syscall9Args_a1(R0), R0 // a1 | |
| 54 | - | ||
| 55 | - | MOVD R8, (RSP) // push a9 onto stack | |
| 56 | - | ||
| 57 | - | BL (R12) | |
| 58 | - | ||
| 59 | - | MOVD 8(RSP), R2 // pop structure pointer | |
| 60 | - | ADD $16, RSP | |
| 61 | - | MOVD R0, syscall9Args_r1(R2) // save r1 | |
| 62 | - | FMOVD F0, syscall9Args_r2(R2) // save r2 | |
| 38 | + | GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8 | |
| 39 | + | DATA ·syscall15XABI0(SB)/8, $syscall15X(SB) | |
| 40 | + | TEXT syscall15X(SB), NOSPLIT, $0 | |
| 41 | + | SUB $STACK_SIZE, RSP // push structure pointer | |
| 42 | + | MOVD R0, PTR_ADDRESS(RSP) | |
| 43 | + | MOVD R0, R9 | |
| 44 | + | ||
| 45 | + | FMOVD syscall15Args_f1(R9), F0 // f1 | |
| 46 | + | FMOVD syscall15Args_f2(R9), F1 // f2 | |
| 47 | + | FMOVD syscall15Args_f3(R9), F2 // f3 | |
| 48 | + | FMOVD syscall15Args_f4(R9), F3 // f4 | |
| 49 | + | FMOVD syscall15Args_f5(R9), F4 // f5 | |
| 50 | + | FMOVD syscall15Args_f6(R9), F5 // f6 | |
| 51 | + | FMOVD syscall15Args_f7(R9), F6 // f7 | |
| 52 | + | FMOVD syscall15Args_f8(R9), F7 // f8 | |
| 53 | + | ||
| 54 | + | MOVD syscall15Args_a1(R9), R0 // a1 | |
| 55 | + | MOVD syscall15Args_a2(R9), R1 // a2 | |
| 56 | + | MOVD syscall15Args_a3(R9), R2 // a3 | |
| 57 | + | MOVD syscall15Args_a4(R9), R3 // a4 | |
| 58 | + | MOVD syscall15Args_a5(R9), R4 // a5 | |
| 59 | + | MOVD syscall15Args_a6(R9), R5 // a6 | |
| 60 | + | MOVD syscall15Args_a7(R9), R6 // a7 | |
| 61 | + | MOVD syscall15Args_a8(R9), R7 // a8 | |
| 62 | + | ||
| 63 | + | MOVD syscall15Args_a9(R9), R10 | |
| 64 | + | MOVD R10, 0(RSP) // push a9 onto stack | |
| 65 | + | MOVD syscall15Args_a10(R9), R10 | |
| 66 | + | MOVD R10, 8(RSP) // push a10 onto stack | |
| 67 | + | MOVD syscall15Args_a11(R9), R10 | |
| 68 | + | MOVD R10, 16(RSP) // push a11 onto stack | |
| 69 | + | MOVD syscall15Args_a12(R9), R10 | |
| 70 | + | MOVD R10, 24(RSP) // push a12 onto stack | |
| 71 | + | MOVD syscall15Args_a13(R9), R10 | |
| 72 | + | MOVD R10, 32(RSP) // push a13 onto stack | |
| 73 | + | MOVD syscall15Args_a14(R9), R10 | |
| 74 | + | MOVD R10, 40(RSP) // push a14 onto stack | |
| 75 | + | MOVD syscall15Args_a15(R9), R10 | |
| 76 | + | MOVD R10, 48(RSP) // push a15 onto stack | |
| 77 | + | ||
| 78 | + | MOVD syscall15Args_fn(R9), R10 // fn | |
| 79 | + | BL (R10) | |
| 80 | + | ||
| 81 | + | MOVD PTR_ADDRESS(RSP), R2 // pop structure pointer | |
| 82 | + | ADD $STACK_SIZE, RSP | |
| 83 | + | MOVD R0, syscall15Args_r1(R2) // save r1 | |
| 84 | + | FMOVD F0, syscall15Args_r2(R2) // save r2 | |
| 63 | 85 | RET | |
| @@ -7,8 +7,11 @@ | |||||
| 7 | #include "go_asm.h" | 7 | #include "go_asm.h" | ||
| 8 | #include "funcdata.h" | 8 | #include "funcdata.h" | ||
| 9 | 9 | ||||
| 10 | - | // syscall9X calls a function in libc on behalf of the syscall package. | 10 | + | #define STACK_SIZE 64 |
| 11 | - | // syscall9X takes a pointer to a struct like: | 11 | + | #define PTR_ADDRESS (STACK_SIZE - 8) |
| 12 | + | ||||
| 13 | + | // syscall15X calls a function in libc on behalf of the syscall package. | |||
| 14 | + | // syscall15X takes a pointer to a struct like: | |||
| 12 | // struct { | 15 | // struct { | ||
| 13 | // fn uintptr | 16 | // fn uintptr | ||
| 14 | // a1 uintptr | 17 | // a1 uintptr | ||
| @@ -20,44 +23,63 @@ | |||||
| 20 | // a7 uintptr | 23 | // a7 uintptr | ||
| 21 | // a8 uintptr | 24 | // a8 uintptr | ||
| 22 | // a9 uintptr | 25 | // a9 uintptr | ||
| 26 | + | // a10 uintptr | |||
| 27 | + | // a11 uintptr | |||
| 28 | + | // a12 uintptr | |||
| 29 | + | // a13 uintptr | |||
| 30 | + | // a14 uintptr | |||
| 31 | + | // a15 uintptr | |||
| 23 | // r1 uintptr | 32 | // r1 uintptr | ||
| 24 | // r2 uintptr | 33 | // r2 uintptr | ||
| 25 | // err uintptr | 34 | // err uintptr | ||
| 26 | // } | 35 | // } | ||
| 27 | - | // syscall9X must be called on the g0 stack with the | 36 | + | // syscall15X must be called on the g0 stack with the |
| 28 | // C calling convention (use libcCall). | 37 | // C calling convention (use libcCall). | ||
| 29 | - | GLOBL ·syscall9XABI0(SB), NOPTR|RODATA, $8 | 38 | + | GLOBL ·syscall15XABI0(SB), NOPTR|RODATA, $8 |
| 30 | - | DATA ·syscall9XABI0(SB)/8, $syscall9X(SB) | 39 | + | DATA ·syscall15XABI0(SB)/8, $syscall15X(SB) |
| 31 | - | TEXT syscall9X(SB), NOSPLIT, $0 | 40 | + | TEXT syscall15X(SB), NOSPLIT, $0 |
| 32 | - | SUB $16, RSP // push structure pointer | 41 | + | SUB $STACK_SIZE, RSP // push structure pointer |
| 33 | - | MOVD R0, 8(RSP) | 42 | + | MOVD R0, PTR_ADDRESS(RSP) |
| 34 | - | 43 | + | MOVD R0, R9 | |
| 35 | - | FMOVD syscall9Args_f1(R0), F0 // f1 | 44 | + | |
| 36 | - | FMOVD syscall9Args_f2(R0), F1 // f2 | 45 | + | FMOVD syscall15Args_f1(R9), F0 // f1 |
| 37 | - | FMOVD syscall9Args_f3(R0), F2 // f3 | 46 | + | FMOVD syscall15Args_f2(R9), F1 // f2 |
| 38 | - | FMOVD syscall9Args_f4(R0), F3 // f4 | 47 | + | FMOVD syscall15Args_f3(R9), F2 // f3 |
| 39 | - | FMOVD syscall9Args_f5(R0), F4 // f5 | 48 | + | FMOVD syscall15Args_f4(R9), F3 // f4 |
| 40 | - | FMOVD syscall9Args_f6(R0), F5 // f6 | 49 | + | FMOVD syscall15Args_f5(R9), F4 // f5 |
| 41 | - | FMOVD syscall9Args_f7(R0), F6 // f7 | 50 | + | FMOVD syscall15Args_f6(R9), F5 // f6 |
| 42 | - | FMOVD syscall9Args_f8(R0), F7 // f8 | 51 | + | FMOVD syscall15Args_f7(R9), F6 // f7 |
| 43 | - | 52 | + | FMOVD syscall15Args_f8(R9), F7 // f8 | |
| 44 | - | MOVD syscall9Args_fn(R0), R12 // fn | 53 | + | |
| 45 | - | MOVD syscall9Args_a2(R0), R1 // a2 | 54 | + | MOVD syscall15Args_a1(R9), R0 // a1 |
| 46 | - | MOVD syscall9Args_a3(R0), R2 // a3 | 55 | + | MOVD syscall15Args_a2(R9), R1 // a2 |
| 47 | - | MOVD syscall9Args_a4(R0), R3 // a4 | 56 | + | MOVD syscall15Args_a3(R9), R2 // a3 |
| 48 | - | MOVD syscall9Args_a5(R0), R4 // a5 | 57 | + | MOVD syscall15Args_a4(R9), R3 // a4 |
| 49 | - | MOVD syscall9Args_a6(R0), R5 // a6 | 58 | + | MOVD syscall15Args_a5(R9), R4 // a5 |
| 50 | - | MOVD syscall9Args_a7(R0), R6 // a7 | 59 | + | MOVD syscall15Args_a6(R9), R5 // a6 |
| 51 | - | MOVD syscall9Args_a8(R0), R7 // a8 | 60 | + | MOVD syscall15Args_a7(R9), R6 // a7 |
| 52 | - | MOVD syscall9Args_a9(R0), R8 // a9 | 61 | + | MOVD syscall15Args_a8(R9), R7 // a8 |
| 53 | - | MOVD syscall9Args_a1(R0), R0 // a1 | 62 | + | |
| 54 | - | 63 | + | MOVD syscall15Args_a9(R9), R10 | |
| 55 | - | MOVD R8, (RSP) // push a9 onto stack | 64 | + | MOVD R10, 0(RSP) // push a9 onto stack |
| 56 | - | 65 | + | MOVD syscall15Args_a10(R9), R10 | |
| 57 | - | BL (R12) | 66 | + | MOVD R10, 8(RSP) // push a10 onto stack |
| 58 | - | 67 | + | MOVD syscall15Args_a11(R9), R10 | |
| 59 | - | MOVD 8(RSP), R2 // pop structure pointer | 68 | + | MOVD R10, 16(RSP) // push a11 onto stack |
| 60 | - | ADD $16, RSP | 69 | + | MOVD syscall15Args_a12(R9), R10 |
| 61 | - | MOVD R0, syscall9Args_r1(R2) // save r1 | 70 | + | MOVD R10, 24(RSP) // push a12 onto stack |
| 62 | - | FMOVD F0, syscall9Args_r2(R2) // save r2 | 71 | + | MOVD syscall15Args_a13(R9), R10 |
| 72 | + | MOVD R10, 32(RSP) // push a13 onto stack | |||
| 73 | + | MOVD syscall15Args_a14(R9), R10 | |||
| 74 | + | MOVD R10, 40(RSP) // push a14 onto stack | |||
| 75 | + | MOVD syscall15Args_a15(R9), R10 | |||
| 76 | + | MOVD R10, 48(RSP) // push a15 onto stack | |||
| 77 | + | ||||
| 78 | + | MOVD syscall15Args_fn(R9), R10 // fn | |||
| 79 | + | BL (R10) | |||
| 80 | + | ||||
| 81 | + | MOVD PTR_ADDRESS(RSP), R2 // pop structure pointer | |||
| 82 | + | ADD $STACK_SIZE, RSP | |||
| 83 | + | MOVD R0, syscall15Args_r1(R2) // save r1 | |||
| 84 | + | FMOVD F0, syscall15Args_r2(R2) // save r2 | |||
| 63 | RET | 85 | RET | ||
M syscall.go +2 -2
| @@ -6,7 +6,7 @@ | |||
| 6 | 6 | package purego | |
| 7 | 7 | ||
| 8 | 8 | const ( | |
| 9 | - | maxArgs = 9 | |
| 9 | + | maxArgs = 15 | |
| 10 | 10 | numOfFloats = 8 // arm64 and amd64 both have 8 float registers | |
| 11 | 11 | ) | |
| 12 | 12 | ||
| @@ -36,5 +36,5 @@ func SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) { | |||
| 36 | 36 | // add padding so there is no out-of-bounds slicing | |
| 37 | 37 | var tmp [maxArgs]uintptr | |
| 38 | 38 | copy(tmp[:], args) | |
| 39 | - | return syscall_syscall9X(fn, tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], tmp[8]) | |
| 39 | + | return syscall_syscall15X(fn, tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14]) | |
| 40 | 40 | } | |
| @@ -6,7 +6,7 @@ | |||||
| 6 | package purego | 6 | package purego | ||
| 7 | 7 | ||||
| 8 | const ( | 8 | const ( | ||
| 9 | - | maxArgs = 9 | 9 | + | maxArgs = 15 |
| 10 | numOfFloats = 8 // arm64 and amd64 both have 8 float registers | 10 | numOfFloats = 8 // arm64 and amd64 both have 8 float registers | ||
| 11 | ) | 11 | ) | ||
| 12 | 12 | ||||
| @@ -36,5 +36,5 @@ func SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) { | |||||
| 36 | // add padding so there is no out-of-bounds slicing | 36 | // add padding so there is no out-of-bounds slicing | ||
| 37 | var tmp [maxArgs]uintptr | 37 | var tmp [maxArgs]uintptr | ||
| 38 | copy(tmp[:], args) | 38 | copy(tmp[:], args) | ||
| 39 | - | return syscall_syscall9X(fn, tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], tmp[8]) | 39 | + | return syscall_syscall15X(fn, tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14]) |
| 40 | } | 40 | } | ||
M syscall_cgo_linux.go +7 -7
| @@ -11,18 +11,18 @@ import ( | |||
| 11 | 11 | "github.com/ebitengine/purego/internal/cgo" | |
| 12 | 12 | ) | |
| 13 | 13 | ||
| 14 | - | var syscall9XABI0 = uintptr(cgo.Syscall9XABI0) | |
| 14 | + | var syscall15XABI0 = uintptr(cgo.Syscall15XABI0) | |
| 15 | 15 | ||
| 16 | 16 | // this is only here to make the assembly files happy :) | |
| 17 | - | type syscall9Args struct { | |
| 18 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr | |
| 19 | - | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | |
| 20 | - | r1, r2, err uintptr | |
| 17 | + | type syscall15Args struct { | |
| 18 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr | |
| 19 | + | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | |
| 20 | + | r1, r2, err uintptr | |
| 21 | 21 | } | |
| 22 | 22 | ||
| 23 | 23 | //go:nosplit | |
| 24 | - | func syscall_syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | |
| 25 | - | return cgo.Syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9) | |
| 24 | + | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | |
| 25 | + | return cgo.Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) | |
| 26 | 26 | } | |
| 27 | 27 | ||
| 28 | 28 | func NewCallback(_ interface{}) uintptr { | |
| @@ -11,18 +11,18 @@ import ( | |||||
| 11 | "github.com/ebitengine/purego/internal/cgo" | 11 | "github.com/ebitengine/purego/internal/cgo" | ||
| 12 | ) | 12 | ) | ||
| 13 | 13 | ||||
| 14 | - | var syscall9XABI0 = uintptr(cgo.Syscall9XABI0) | 14 | + | var syscall15XABI0 = uintptr(cgo.Syscall15XABI0) |
| 15 | 15 | ||||
| 16 | // this is only here to make the assembly files happy :) | 16 | // this is only here to make the assembly files happy :) | ||
| 17 | - | type syscall9Args struct { | 17 | + | type syscall15Args struct { |
| 18 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr | 18 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr |
| 19 | - | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | 19 | + | f1, f2, f3, f4, f5, f6, f7, f8 uintptr |
| 20 | - | r1, r2, err uintptr | 20 | + | r1, r2, err uintptr |
| 21 | } | 21 | } | ||
| 22 | 22 | ||||
| 23 | //go:nosplit | 23 | //go:nosplit | ||
| 24 | - | func syscall_syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | 24 | + | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { |
| 25 | - | return cgo.Syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9) | 25 | + | return cgo.Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) |
| 26 | } | 26 | } | ||
| 27 | 27 | ||||
| 28 | func NewCallback(_ interface{}) uintptr { | 28 | func NewCallback(_ interface{}) uintptr { | ||
M syscall_sysv.go +9 -9
| @@ -12,22 +12,22 @@ import ( | |||
| 12 | 12 | "unsafe" | |
| 13 | 13 | ) | |
| 14 | 14 | ||
| 15 | - | var syscall9XABI0 uintptr | |
| 15 | + | var syscall15XABI0 uintptr | |
| 16 | 16 | ||
| 17 | - | type syscall9Args struct { | |
| 18 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr | |
| 19 | - | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | |
| 20 | - | r1, r2, err uintptr | |
| 17 | + | type syscall15Args struct { | |
| 18 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr | |
| 19 | + | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | |
| 20 | + | r1, r2, err uintptr | |
| 21 | 21 | } | |
| 22 | 22 | ||
| 23 | 23 | //go:nosplit | |
| 24 | - | func syscall_syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | |
| 25 | - | args := syscall9Args{ | |
| 26 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, | |
| 24 | + | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | |
| 25 | + | args := syscall15Args{ | |
| 26 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, | |
| 27 | 27 | a1, a2, a3, a4, a5, a6, a7, a8, | |
| 28 | 28 | r1, r2, err, | |
| 29 | 29 | } | |
| 30 | - | runtime_cgocall(syscall9XABI0, unsafe.Pointer(&args)) | |
| 30 | + | runtime_cgocall(syscall15XABI0, unsafe.Pointer(&args)) | |
| 31 | 31 | return args.r1, args.r2, args.err | |
| 32 | 32 | } | |
| 33 | 33 | ||
| @@ -12,22 +12,22 @@ import ( | |||||
| 12 | "unsafe" | 12 | "unsafe" | ||
| 13 | ) | 13 | ) | ||
| 14 | 14 | ||||
| 15 | - | var syscall9XABI0 uintptr | 15 | + | var syscall15XABI0 uintptr |
| 16 | 16 | ||||
| 17 | - | type syscall9Args struct { | 17 | + | type syscall15Args struct { |
| 18 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr | 18 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr |
| 19 | - | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | 19 | + | f1, f2, f3, f4, f5, f6, f7, f8 uintptr |
| 20 | - | r1, r2, err uintptr | 20 | + | r1, r2, err uintptr |
| 21 | } | 21 | } | ||
| 22 | 22 | ||||
| 23 | //go:nosplit | 23 | //go:nosplit | ||
| 24 | - | func syscall_syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | 24 | + | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { |
| 25 | - | args := syscall9Args{ | 25 | + | args := syscall15Args{ |
| 26 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, | 26 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, |
| 27 | a1, a2, a3, a4, a5, a6, a7, a8, | 27 | a1, a2, a3, a4, a5, a6, a7, a8, | ||
| 28 | r1, r2, err, | 28 | r1, r2, err, | ||
| 29 | } | 29 | } | ||
| 30 | - | runtime_cgocall(syscall9XABI0, unsafe.Pointer(&args)) | 30 | + | runtime_cgocall(syscall15XABI0, unsafe.Pointer(&args)) |
| 31 | return args.r1, args.r2, args.err | 31 | return args.r1, args.r2, args.err | ||
| 32 | } | 32 | } | ||
| 33 | 33 | ||||
M syscall_windows.go +7 -7
| @@ -10,16 +10,16 @@ import ( | |||
| 10 | 10 | "golang.org/x/sys/windows" | |
| 11 | 11 | ) | |
| 12 | 12 | ||
| 13 | - | var syscall9XABI0 uintptr | |
| 13 | + | var syscall15XABI0 uintptr | |
| 14 | 14 | ||
| 15 | - | type syscall9Args struct { | |
| 16 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr | |
| 17 | - | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | |
| 18 | - | r1, r2, err uintptr | |
| 15 | + | type syscall15Args struct { | |
| 16 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr | |
| 17 | + | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | |
| 18 | + | r1, r2, err uintptr | |
| 19 | 19 | } | |
| 20 | 20 | ||
| 21 | - | func syscall_syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | |
| 22 | - | r1, r2, errno := syscall.Syscall9(fn, 9, a1, a2, a3, a4, a5, a6, a7, a8, a9) | |
| 21 | + | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | |
| 22 | + | r1, r2, errno := syscall.Syscall15(fn, 15, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) | |
| 23 | 23 | return r1, r2, uintptr(errno) | |
| 24 | 24 | } | |
| 25 | 25 | ||
| @@ -10,16 +10,16 @@ import ( | |||||
| 10 | "golang.org/x/sys/windows" | 10 | "golang.org/x/sys/windows" | ||
| 11 | ) | 11 | ) | ||
| 12 | 12 | ||||
| 13 | - | var syscall9XABI0 uintptr | 13 | + | var syscall15XABI0 uintptr |
| 14 | 14 | ||||
| 15 | - | type syscall9Args struct { | 15 | + | type syscall15Args struct { |
| 16 | - | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr | 16 | + | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr |
| 17 | - | f1, f2, f3, f4, f5, f6, f7, f8 uintptr | 17 | + | f1, f2, f3, f4, f5, f6, f7, f8 uintptr |
| 18 | - | r1, r2, err uintptr | 18 | + | r1, r2, err uintptr |
| 19 | } | 19 | } | ||
| 20 | 20 | ||||
| 21 | - | func syscall_syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { | 21 | + | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { |
| 22 | - | r1, r2, errno := syscall.Syscall9(fn, 9, a1, a2, a3, a4, a5, a6, a7, a8, a9) | 22 | + | r1, r2, errno := syscall.Syscall15(fn, 15, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) |
| 23 | return r1, r2, uintptr(errno) | 23 | return r1, r2, uintptr(errno) | ||
| 24 | } | 24 | } | ||
| 25 | 25 | ||||