aboutsummaryrefslogtreecommitdiffstats
path: root/sysgen
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-08-26 12:51:25 +0200
committerDmitry Vyukov <dvyukov@google.com>2016-08-26 12:51:25 +0200
commitd78bc6e66c108ea0169259520de8f8b9deeadeaa (patch)
tree9103076d1d068c16931c3d57bc1df51031f449a6 /sysgen
parent04fb414b499c660ade7fe8eb427f432c7c7d8b86 (diff)
sys: fix skipping of syscalls with unknown constants
Still need to generate description for such syscalls so that they at least can be parsed, and so that Go and C entries match.
Diffstat (limited to 'sysgen')
-rw-r--r--sysgen/sysgen.go63
1 files changed, 31 insertions, 32 deletions
diff --git a/sysgen/sysgen.go b/sysgen/sysgen.go
index ddd2a1513..a0db59750 100644
--- a/sysgen/sysgen.go
+++ b/sysgen/sysgen.go
@@ -124,6 +124,14 @@ func readConsts(arch string) map[string]uint64 {
return consts
}
+var skipCurrentSyscall string
+
+func skipSyscall(why string) {
+ if skipCurrentSyscall != "" {
+ skipCurrentSyscall = why
+ }
+}
+
func generate(arch string, syscalls []Syscall, structs map[string]Struct, unnamed map[string][]string, flags map[string][]string, consts map[string]uint64, out io.Writer) {
unsupported := make(map[string]bool)
@@ -132,8 +140,9 @@ func generate(arch string, syscalls []Syscall, structs map[string]Struct, unname
fmt.Fprintf(out, "var Calls []*Call\n")
fmt.Fprintf(out, "func initCalls() {\n")
- for i, s := range syscalls {
+ for _, s := range syscalls {
logf(4, " generate population code for %v", s.Name)
+ skipCurrentSyscall = ""
syscallNR := -1
if nr, ok := consts["__NR_"+s.CallName]; ok {
syscallNR = int(nr)
@@ -143,35 +152,24 @@ func generate(arch string, syscalls []Syscall, structs map[string]Struct, unname
logf(0, "unsupported syscall: %v", s.CallName)
}
}
- func() {
- defer func() {
- err := recover()
- if err == nil {
- return
- }
- if skip, ok := err.(skipSyscallError); ok {
- logf(0, "unsupported syscall: %v due to %v", s.Name, skip)
- return
- }
- panic(err)
- }()
- callBuffer := new(bytes.Buffer)
- fmt.Fprintf(callBuffer, "func() { Calls = append(Calls, &Call{ID: %v, Name: \"%v\", CallName: \"%v\", NR: %v", i, s.Name, s.CallName, syscallNR)
- if len(s.Ret) != 0 {
- fmt.Fprintf(callBuffer, ", Ret: ")
- generateArg("ret", s.Ret[0], s.Ret[1:], structs, unnamed, flags, consts, false, callBuffer)
- }
- fmt.Fprintf(callBuffer, ", Args: []Type{")
- for i, a := range s.Args {
- if i != 0 {
- fmt.Fprintf(callBuffer, ", ")
- }
- logf(5, " generate description for arg %v", i)
- generateArg(a[0], a[1], a[2:], structs, unnamed, flags, consts, false, callBuffer)
+ fmt.Fprintf(out, "func() { Calls = append(Calls, &Call{Name: \"%v\", CallName: \"%v\"", s.Name, s.CallName)
+ if len(s.Ret) != 0 {
+ fmt.Fprintf(out, ", Ret: ")
+ generateArg("ret", s.Ret[0], s.Ret[1:], structs, unnamed, flags, consts, false, out)
+ }
+ fmt.Fprintf(out, ", Args: []Type{")
+ for i, a := range s.Args {
+ if i != 0 {
+ fmt.Fprintf(out, ", ")
}
- fmt.Fprintf(callBuffer, "}})}()\n")
- out.Write(callBuffer.Bytes())
- }()
+ logf(5, " generate description for arg %v", i)
+ generateArg(a[0], a[1], a[2:], structs, unnamed, flags, consts, false, out)
+ }
+ if skipCurrentSyscall != "" {
+ logf(0, "unsupported syscall: %v due to %v", s.Name, skipCurrentSyscall)
+ syscallNR = -1
+ }
+ fmt.Fprintf(out, "}, NR: %v})}()\n", syscallNR)
}
fmt.Fprintf(out, "}\n\n")
@@ -188,8 +186,6 @@ func generate(arch string, syscalls []Syscall, structs map[string]Struct, unname
fmt.Fprintf(out, ")\n")
}
-type skipSyscallError string
-
func generateArg(
name, typ string,
a []string,
@@ -366,7 +362,10 @@ func generateArg(
if v, ok := consts[a[0]]; ok {
val = fmt.Sprint(v)
} else if isIdentifier(a[0]) {
- panic(skipSyscallError(fmt.Sprintf("missing const %v", a[0])))
+ // This is an identifier for which we don't have a value for this arch.
+ // Skip this syscall on this arch.
+ val = "0"
+ skipSyscall(fmt.Sprintf("missing const %v", a[0]))
}
fmt.Fprintf(out, "ConstType{%v, TypeSize: %v, Val: uintptr(%v)}", common(), size, val)
case "strconst":