aboutsummaryrefslogtreecommitdiffstats
path: root/prog/prio.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-12-27 12:20:00 +0100
committerDmitry Vyukov <dvyukov@google.com>2015-12-27 12:20:00 +0100
commit4d3db6d4c86f0b3162a39dbef1d1fc8031062b10 (patch)
tree1e6527d63d83bb600cc6a2f6aa009fc28cf679e5 /prog/prio.go
parent524a2ae38f5506c2948faa035d99debaa2d63b52 (diff)
host: detect unsupported syscalls
Also detect transitively unsupported syscalls, that is, syscalls for which all syscalls that can create input arguments are disabled.
Diffstat (limited to 'prog/prio.go')
-rw-r--r--prog/prio.go23
1 files changed, 13 insertions, 10 deletions
diff --git a/prog/prio.go b/prog/prio.go
index 234937037..2e6e46da2 100644
--- a/prog/prio.go
+++ b/prog/prio.go
@@ -227,26 +227,29 @@ func foreachArgType(meta *sys.Call, f func(sys.Type, ArgDir)) {
type ChoiceTable struct {
run [][]int
enabledCalls []*sys.Call
- enabled map[int]bool
+ enabled map[*sys.Call]bool
}
-func BuildChoiceTable(prios [][]float32, enabledCalls []*sys.Call) *ChoiceTable {
- if len(enabledCalls) == 0 {
- enabledCalls = sys.Calls
+func BuildChoiceTable(prios [][]float32, enabled map[*sys.Call]bool) *ChoiceTable {
+ if enabled == nil {
+ enabled = make(map[*sys.Call]bool)
+ for _, c := range sys.Calls {
+ enabled[c] = true
+ }
}
- enabled := make(map[int]bool)
- for _, c := range enabledCalls {
- enabled[c.ID] = true
+ var enabledCalls []*sys.Call
+ for c := range enabled {
+ enabledCalls = append(enabledCalls, c)
}
run := make([][]int, len(sys.Calls))
for i := range run {
- if !enabled[i] {
+ if !enabled[sys.Calls[i]] {
continue
}
run[i] = make([]int, len(sys.Calls))
sum := 0
for j := range run[i] {
- if enabled[j] {
+ if enabled[sys.Calls[j]] {
sum += int(prios[i][j] * 1000)
}
run[i][j] = sum
@@ -269,7 +272,7 @@ func (ct *ChoiceTable) Choose(r *rand.Rand, call int) int {
for {
x := r.Intn(run[len(run)-1])
i := sort.SearchInts(run, x)
- if !ct.enabled[i] {
+ if !ct.enabled[sys.Calls[i]] {
continue
}
return i