aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/subsystem
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/subsystem')
-rw-r--r--pkg/subsystem/list.go28
-rw-r--r--pkg/subsystem/lists/linux.go2
-rw-r--r--pkg/subsystem/service.go11
-rw-r--r--pkg/subsystem/service_test.go2
4 files changed, 30 insertions, 13 deletions
diff --git a/pkg/subsystem/list.go b/pkg/subsystem/list.go
index d512a3fe1..c3650e7f9 100644
--- a/pkg/subsystem/list.go
+++ b/pkg/subsystem/list.go
@@ -3,6 +3,8 @@
package subsystem
+import "fmt"
+
// In general, it's not correct to assume that subsystems are only determined by target.OS,
// because subsystems are related not to the user interface of the OS kernel, but rather to
// the OS kernel implementation.
@@ -13,20 +15,36 @@ package subsystem
// Therefore, subsystem lists have to be a completely different entity.
var (
- lists = make(map[string][]*Subsystem)
+ lists = make(map[string]registeredSubsystem)
)
-func RegisterList(name string, list []*Subsystem) {
+type registeredSubsystem struct {
+ list []*Subsystem
+ revision int
+}
+
+func RegisterList(name string, list []*Subsystem, revision int) {
if _, ok := lists[name]; ok {
panic(name + " subsystem list already exists!")
}
- lists[name] = list
+ lists[name] = registeredSubsystem{
+ list: list,
+ revision: revision,
+ }
}
func GetList(name string) []*Subsystem {
- return lists[name]
+ info, ok := lists[name]
+ if !ok {
+ panic(fmt.Sprintf("list %q is not registered", name))
+ }
+ return info.list
}
func ListService(name string) *Service {
- return MustMakeService(lists[name])
+ info, ok := lists[name]
+ if !ok {
+ panic(fmt.Sprintf("list %q is not registered", name))
+ }
+ return MustMakeService(info.list, info.revision)
}
diff --git a/pkg/subsystem/lists/linux.go b/pkg/subsystem/lists/linux.go
index e94fdb9fb..274db98c0 100644
--- a/pkg/subsystem/lists/linux.go
+++ b/pkg/subsystem/lists/linux.go
@@ -6,7 +6,7 @@ package lists
import . "github.com/google/syzkaller/pkg/subsystem"
func init() {
- RegisterList("linux", subsystems_linux())
+ RegisterList("linux", subsystems_linux(), 20250720)
}
// The subsystem list:
diff --git a/pkg/subsystem/service.go b/pkg/subsystem/service.go
index 24f86dd54..a921cdfed 100644
--- a/pkg/subsystem/service.go
+++ b/pkg/subsystem/service.go
@@ -9,22 +9,20 @@ import (
type Service struct {
*Extractor
+ Revision int
perName map[string]*Subsystem
perParent map[*Subsystem][]*Subsystem
}
-func MustMakeService(list []*Subsystem) *Service {
- if len(list) == 0 {
- panic("the subsystem list is empty")
- }
- service, err := MakeService(list)
+func MustMakeService(list []*Subsystem, revision int) *Service {
+ service, err := MakeService(list, revision)
if err != nil {
panic(fmt.Sprintf("service creation failed: %s", err))
}
return service
}
-func MakeService(list []*Subsystem) (*Service, error) {
+func MakeService(list []*Subsystem, revision int) (*Service, error) {
extractor := MakeExtractor(list)
perName := map[string]*Subsystem{}
perParent := map[*Subsystem][]*Subsystem{}
@@ -42,6 +40,7 @@ func MakeService(list []*Subsystem) (*Service, error) {
}
return &Service{
Extractor: extractor,
+ Revision: revision,
perName: perName,
perParent: perParent,
}, nil
diff --git a/pkg/subsystem/service_test.go b/pkg/subsystem/service_test.go
index 2a95b9558..d45a62806 100644
--- a/pkg/subsystem/service_test.go
+++ b/pkg/subsystem/service_test.go
@@ -14,6 +14,6 @@ func TestServiceChildren(t *testing.T) {
parent := &Subsystem{Name: "parent"}
childA := &Subsystem{Name: "childA", Parents: []*Subsystem{parent}}
childB := &Subsystem{Name: "childB", Parents: []*Subsystem{parent}}
- service := MustMakeService([]*Subsystem{unrelated, parent, childA, childB})
+ service := MustMakeService([]*Subsystem{unrelated, parent, childA, childB}, 1)
assert.ElementsMatch(t, service.Children(parent), []*Subsystem{childA, childB})
}