aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/build
diff options
context:
space:
mode:
authorLaura Peskin <pesk@google.com>2024-07-03 14:15:53 -0700
committereepeep <50846949+eepeep@users.noreply.github.com>2024-10-30 22:17:56 +0000
commit96eb609f6eb9558e2fab491a2c63a11bb0556471 (patch)
tree5f0522570f4da8f0261330d8fe6a02d5e0baa6af /pkg/build
parentfb888278a6b21eda7fa63551c83fd17b90305ba1 (diff)
pkg/build: add build command for starnix
Co-authored-by: eep@google.com
Diffstat (limited to 'pkg/build')
-rw-r--r--pkg/build/build.go2
-rw-r--r--pkg/build/starnix.go116
2 files changed, 118 insertions, 0 deletions
diff --git a/pkg/build/build.go b/pkg/build/build.go
index c9a5b038f..86906a0f7 100644
--- a/pkg/build/build.go
+++ b/pkg/build/build.go
@@ -162,6 +162,8 @@ func getBuilder(targetOS, targetArch, vmType string) (builder, error) {
return cuttlefish{}, nil
} else if vmType == "proxyapp:android" {
return android{}, nil
+ } else if vmType == targets.Starnix {
+ return starnix{}, nil
}
}
builders := map[string]builder{
diff --git a/pkg/build/starnix.go b/pkg/build/starnix.go
new file mode 100644
index 000000000..e629c004e
--- /dev/null
+++ b/pkg/build/starnix.go
@@ -0,0 +1,116 @@
+// Copyright 2024 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 build
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/google/syzkaller/pkg/osutil"
+ "github.com/google/syzkaller/sys/targets"
+ starnixVM "github.com/google/syzkaller/vm/starnix"
+)
+
+type starnix struct{}
+
+// The name of the Fuchsia assembly override defined in `overrideRule`.
+const overrideName = "syzkaller_starnix"
+
+// A Fuchsia assembly override definition adding a package containing fuzzing dependencies.
+var overrideRule = fmt.Sprintf(`import("//build/assembly/developer_overrides.gni")
+
+assembly_developer_overrides("%s") {
+ testonly = true
+ base_packages = [
+ "//src/testing/fuzzing/syzkaller/starnix:syzkaller_starnix",
+ ]
+}
+`, overrideName)
+
+func (st starnix) build(params Params) (ImageDetails, error) {
+ sysTarget := targets.Get(targets.Linux, params.TargetArch)
+ arch := sysTarget.KernelArch
+ if arch != "x86_64" {
+ return ImageDetails{}, fmt.Errorf("unsupported starnix arch %v", arch)
+ }
+ arch = "x64"
+ product := fmt.Sprintf("%s.%s", "workbench_eng", arch)
+
+ localDir := filepath.Join(params.KernelDir, "local")
+ if err := os.MkdirAll(filepath.Join(params.KernelDir, "local"), 0755); err != nil {
+ return ImageDetails{}, err
+ }
+ overridePath := filepath.Join(localDir, "BUILD.gn")
+ if err := os.WriteFile(overridePath, []byte(overrideRule), 0660); err != nil {
+ return ImageDetails{}, err
+ }
+ if err := osutil.SandboxChown(overridePath); err != nil {
+ return ImageDetails{}, err
+ }
+ if err := osutil.SandboxChown(localDir); err != nil {
+ return ImageDetails{}, err
+ }
+ if _, err := runSandboxed(
+ time.Hour,
+ params.KernelDir,
+ "scripts/fx", "--dir", "out/"+arch,
+ "set", product,
+ "--assembly-override", fmt.Sprintf("//products/workbench/*=//local:%s", overrideName),
+ ); err != nil {
+ return ImageDetails{}, err
+ }
+
+ if _, err := runSandboxed(time.Hour*2, params.KernelDir, "scripts/fx", "build"); err != nil {
+ return ImageDetails{}, err
+ }
+ ffxBinary, err := starnixVM.GetToolPath(params.KernelDir, "ffx")
+ if err != nil {
+ return ImageDetails{}, err
+ }
+ productBundlePathRaw, err := runSandboxed(
+ 30*time.Second,
+ params.KernelDir,
+ ffxBinary,
+ "-c", "log.enabled=false,ffx.analytics.disabled=true,daemon.autostart=false",
+ "config", "get", "product.path",
+ )
+ if err != nil {
+ return ImageDetails{}, err
+ }
+ productBundlePath := strings.Trim(string(productBundlePathRaw), "\"\n")
+ fxfsPathRaw, err := runSandboxed(
+ 30*time.Second,
+ params.KernelDir,
+ ffxBinary,
+ "-c", "log.enabled=false,ffx.analytics.disabled=true,daemon.autostart=false",
+ "product", "get-image-path", productBundlePath,
+ "--slot", "a",
+ "--image-type", "fxfs",
+ )
+ if err != nil {
+ return ImageDetails{}, err
+ }
+ fxfsPath := strings.Trim(string(fxfsPathRaw), "\"\n")
+ if err := osutil.CopyFile(fxfsPath, filepath.Join(params.OutputDir, "image")); err != nil {
+ return ImageDetails{}, err
+ }
+ kernelObjPath := filepath.Join(params.KernelDir, "out", arch, "exe.unstripped", "starnix_kernel")
+ if err := osutil.CopyFile(kernelObjPath, filepath.Join(params.OutputDir, "obj", "vmlinux")); err != nil {
+ return ImageDetails{}, err
+ }
+ return ImageDetails{}, nil
+}
+
+func (st starnix) clean(params Params) error {
+ _, err := runSandboxed(
+ time.Hour,
+ params.KernelDir,
+ "scripts/fx", "--dir", "out/"+params.TargetArch,
+ "clean",
+ )
+ return err
+}