@@ -62,6 +62,7 @@ import (
62
62
"path/filepath"
63
63
"runtime"
64
64
"sort"
65
+ "strconv"
65
66
"strings"
66
67
"text/template"
67
68
)
@@ -542,9 +543,47 @@ func (f *Fn) ParamPrintList() string {
542
543
return join (f .Params , func (p * Param ) string { return fmt .Sprintf (`"%s=", %s, ` , p .Name , p .Name ) }, `", ", ` )
543
544
}
544
545
545
- // SyscallN returns a string representing the SyscallN function.
546
- func (f * Fn ) SyscallN () string {
547
- return syscalldot () + "SyscallN"
546
+ // ParamCount return number of syscall parameters for function f.
547
+ func (f * Fn ) ParamCount () int {
548
+ n := 0
549
+ for _ , p := range f .Params {
550
+ n += len (p .SyscallArgList ())
551
+ }
552
+ return n
553
+ }
554
+
555
+ // SyscallParamCount determines which version of Syscall/Syscall6/Syscall9/...
556
+ // to use. It returns parameter count for correspondent SyscallX function.
557
+ func (f * Fn ) SyscallParamCount () int {
558
+ n := f .ParamCount ()
559
+ switch {
560
+ case n <= 3 :
561
+ return 3
562
+ case n <= 6 :
563
+ return 6
564
+ case n <= 9 :
565
+ return 9
566
+ case n <= 12 :
567
+ return 12
568
+ case n <= 15 :
569
+ return 15
570
+ case n <= 42 : // current SyscallN limit
571
+ return n
572
+ default :
573
+ panic ("too many arguments to system call" )
574
+ }
575
+ }
576
+
577
+ // Syscall determines which SyscallX function to use for function f.
578
+ func (f * Fn ) Syscall () string {
579
+ c := f .SyscallParamCount ()
580
+ if c == 3 {
581
+ return syscalldot () + "Syscall"
582
+ }
583
+ if c > 15 {
584
+ return syscalldot () + "SyscallN"
585
+ }
586
+ return syscalldot () + "Syscall" + strconv .Itoa (c )
548
587
}
549
588
550
589
// SyscallParamList returns source code for SyscallX parameters for function f.
@@ -553,12 +592,9 @@ func (f *Fn) SyscallParamList() string {
553
592
for _ , p := range f .Params {
554
593
a = append (a , p .SyscallArgList ()... )
555
594
}
556
-
557
- // Check if the number exceeds the current SyscallN limit
558
- if len (a ) > 42 {
559
- panic ("too many arguments to system call" )
595
+ for len (a ) < f .SyscallParamCount () {
596
+ a = append (a , "0" )
560
597
}
561
-
562
598
return strings .Join (a , ", " )
563
599
}
564
600
@@ -979,7 +1015,7 @@ func {{.HelperName}}({{.HelperParamList}}) {{template "results" .}}{
979
1015
980
1016
{{define "results"}}{{if .Rets.List}}{{.Rets.List}} {{end}}{{end}}
981
1017
982
- {{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.SyscallN }}(proc{{.DLLFuncName}}.Addr(), {{.SyscallParamList}}){{end}}
1018
+ {{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.Syscall }}(proc{{.DLLFuncName}}.Addr(),{{if le .ParamCount 15}} {{.ParamCount}},{{end}} {{.SyscallParamList}}){{end}}
983
1019
984
1020
{{define "tmpvarsreadback"}}{{range .Params}}{{if .TmpVarReadbackCode}}
985
1021
{{.TmpVarReadbackCode}}{{end}}{{end}}{{end}}
0 commit comments