From 77beeccbe014ce49ef54a564d7dc8d116d5216e3 Mon Sep 17 00:00:00 2001 From: Pascal Perez Date: Mon, 20 May 2019 17:31:38 -0400 Subject: sys: Updating Fuchsia extraction scripts Consolidating FIDL library build mappings in one place, so that it can be used from extraction, and script invoking fidlgen. This also makes code clearer, and provides a more natural path for evolutions / dealing with oddities. Minor doc update post fx command changes. --- sys/fuchsia/fidlgen/main.go | 69 ++++++-------------------------- sys/fuchsia/layout/fidl_mappings.go | 78 +++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 58 deletions(-) create mode 100644 sys/fuchsia/layout/fidl_mappings.go (limited to 'sys/fuchsia') diff --git a/sys/fuchsia/fidlgen/main.go b/sys/fuchsia/fidlgen/main.go index 8a88e5007..139d6461d 100644 --- a/sys/fuchsia/fidlgen/main.go +++ b/sys/fuchsia/fidlgen/main.go @@ -13,28 +13,10 @@ import ( "github.com/google/syzkaller/pkg/ast" "github.com/google/syzkaller/pkg/compiler" "github.com/google/syzkaller/pkg/osutil" + "github.com/google/syzkaller/sys/fuchsia/layout" "github.com/google/syzkaller/sys/targets" ) -var layerToLibs = map[string][]string{ - "zircon": { - "fuchsia-mem", - "fuchsia-cobalt", - "fuchsia-ldsvc", - "fuchsia-process", - "fuchsia-io", - "fuchsia-net", - "fuchsia-net-stack", - "fuchsia-hardware-ethernet", - }, - "garnet": { - "fuchsia.devicesettings", - "fuchsia.timezone", - "fuchsia.power", - "fuchsia.scpi", - }, -} - func main() { targetArch := os.Getenv("TARGETARCH") target := targets.Get("fuchsia", targetArch) @@ -60,46 +42,17 @@ func main() { } var newFiles []string + for _, fidlLib := range layout.AllFidlLibraries { + jsonPath := filepath.Join(sourceDir, "out", arch, fidlLib.PathToJSONIr()) + txtPathBase := strings.Replace(strings.Join(fidlLib.FqName, "_"), "^fuchsia", "fidl", 1) - for layer := range layerToLibs { - var jsonPathBase string - if layer == "garnet" { - jsonPathBase = filepath.Join( - sourceDir, - "out", - arch, - "fidling/gen/sdk/fidl", - ) - } else { - jsonPathBase = filepath.Join( - sourceDir, - "out", - arch, - "fidling/gen", - layer, - "public/fidl", - ) - } - - for _, lib := range layerToLibs[layer] { - jsonPath := filepath.Join( - jsonPathBase, - lib, - fmt.Sprintf("%s.fidl.json", lib), - ) + txtPath := fidlgen( + fidlgenPath, + jsonPath, + txtPathBase, + ) - txtPathBase := lib - txtPathBase = strings.Replace(txtPathBase, "fuchsia.", "fidl_", 1) - txtPathBase = strings.Replace(txtPathBase, "fuchsia-", "fidl_", 1) - - txtPath := fidlgen( - fidlgenPath, - jsonPath, - txtPathBase, - ) - - newFiles = append(newFiles, txtPath) - } + newFiles = append(newFiles, txtPath) } var errorPos ast.Pos @@ -157,7 +110,7 @@ func fidlgen(fidlgenPath string, jsonPath string, txtPathBase string) string { failf("fidlgen failed: %v", err) } - return fmt.Sprintf("%s.txt", txtPathBase) + return fmt.Sprintf("%s.syz.txt", txtPathBase) } func failf(msg string, args ...interface{}) { diff --git a/sys/fuchsia/layout/fidl_mappings.go b/sys/fuchsia/layout/fidl_mappings.go new file mode 100644 index 000000000..dd5e3c678 --- /dev/null +++ b/sys/fuchsia/layout/fidl_mappings.go @@ -0,0 +1,78 @@ +// Copyright 2019 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package layout + +import ( + "fmt" + "path/filepath" + "strings" +) + +// layer indicates at which layer a FidlLibrary lives in the Fuchsia build +// system. +type layer int + +const ( + _ layer = iota + zircon + garnet +) + +// FidlLibrary describes a FIDL library. It captures required details such as +// build location, header generation, etc. +type FidlLibrary struct { + layer layer + + // FqName stores the fully-qualified name of the library in parts, e.g. + // the `fuchsia.mem` library is `fuchsia`, `mem`. + FqName []string +} + +// AllFidlLibraries lists all FIDL libraries. +var AllFidlLibraries = []FidlLibrary{ + {zircon, []string{"fuchsia", "mem"}}, + {zircon, []string{"fuchsia", "cobalt"}}, + {zircon, []string{"fuchsia", "ldsvc"}}, + {zircon, []string{"fuchsia", "process"}}, + {zircon, []string{"fuchsia", "io"}}, + {zircon, []string{"fuchsia", "net"}}, + {zircon, []string{"fuchsia", "net", "stack"}}, + {zircon, []string{"fuchsia", "hardware", "ethernet"}}, + {garnet, []string{"fuchsia", "devicesettings"}}, + {garnet, []string{"fuchsia", "timezone"}}, + {garnet, []string{"fuchsia", "power"}}, + {garnet, []string{"fuchsia", "scpi"}}, +} + +func (fidlLib FidlLibrary) dirName() string { + switch fidlLib.layer { + case zircon: + return strings.Join(fidlLib.FqName, "-") + case garnet: + return strings.Join(fidlLib.FqName, ".") + default: + panic(fmt.Sprintf("unknown layer %v", fidlLib.layer)) + } +} + +// PathToJSONIr provides the path to the JSON IR, relative to the out/ +// directory. +func (fidlLib FidlLibrary) PathToJSONIr() string { + return filepath.Join( + fidlLib.PathToCompiledDir(), + fmt.Sprintf("%s.fidl.json", fidlLib.dirName())) +} + +// PathToCompiledDir provides the path to compiled headers, relative to the +// out/ directory. +func (fidlLib FidlLibrary) PathToCompiledDir() string { + switch fidlLib.layer { + case zircon: + return filepath.Join("fidling", "gen", "zircon", "public", "fidl", fidlLib.dirName()) + case garnet: + return filepath.Join("fidling", "gen", "sdk", "fidl", fidlLib.dirName()) + default: + panic(fmt.Sprintf("unknown layer %v", fidlLib.layer)) + } +} -- cgit mrf-deployment