diff options
| -rw-r--r-- | pkg/build/android.go | 48 | ||||
| -rw-r--r-- | pkg/build/build.go | 2 | ||||
| -rw-r--r-- | syz-ci/manager.go | 1 | ||||
| -rw-r--r-- | syz-ci/syz-ci.go | 3 |
4 files changed, 47 insertions, 7 deletions
diff --git a/pkg/build/android.go b/pkg/build/android.go index 3b1f38561..bade7142f 100644 --- a/pkg/build/android.go +++ b/pkg/build/android.go @@ -12,13 +12,46 @@ import ( "regexp" "time" + "github.com/google/syzkaller/pkg/config" "github.com/google/syzkaller/pkg/osutil" ) type android struct{} +type BuildParams struct { + DefconfigFragment string `json:"defconfig_fragment"` + BuildTarget string `json:"build_target"` + BuildScript string `json:"build_script"` + VendorBootImage string `json:"vendor_boot_image"` +} + var ccCompilerRegexp = regexp.MustCompile(`#define\s+CONFIG_CC_VERSION_TEXT\s+"(.*)"`) +func parseConfig(conf []byte) (*BuildParams, error) { + buildCfg := new(BuildParams) + if err := config.LoadData(conf, buildCfg); err != nil { + return nil, fmt.Errorf("failed to parse build config: %w", err) + } + + if buildCfg.DefconfigFragment == "" { + return nil, fmt.Errorf("defconfig fragment not specified for Android build") + } + + if buildCfg.BuildTarget == "" { + return nil, fmt.Errorf("build target not specified for Android build") + } + + if buildCfg.BuildScript == "" { + return nil, fmt.Errorf("build script not specified for Android build") + } + + if buildCfg.VendorBootImage == "" { + return nil, fmt.Errorf("vendor boot image not specified for Android build") + } + + return buildCfg, nil +} + func (a android) readCompiler(kernelDir string) (string, error) { bytes, err := os.ReadFile(filepath.Join(kernelDir, "out", "mixed", "device-kernel", "private", "gs-google", "include", "generated", "autoconf.h")) @@ -41,14 +74,16 @@ func (a android) build(params Params) (ImageDetails, error) { return details, fmt.Errorf("sysctl file is not supported for android images") } + buildCfg, err := parseConfig(params.Build) + if err != nil { + return details, fmt.Errorf("error parsing android configs: %w", err) + } + // Build kernel. - cmd := osutil.Command("./build_cloudripper.sh") + cmd := osutil.Command(fmt.Sprintf("./%v", buildCfg.BuildScript)) cmd.Dir = params.KernelDir - // No cloudripper kasan config; currently only slider has a kasan config. - defconfigFragment := filepath.Join("private", "gs-google", "build.config.slider.kasan") - buildTarget := "cloudripper_gki_kasan" cmd.Env = append(cmd.Env, "OUT_DIR=out", "DIST_DIR=dist", fmt.Sprintf("GKI_DEFCONFIG_FRAGMENT=%v", - defconfigFragment), fmt.Sprintf("BUILD_TARGET=%v", buildTarget)) + buildCfg.DefconfigFragment), fmt.Sprintf("BUILD_TARGET=%v", buildCfg.BuildTarget)) if _, err := osutil.Run(time.Hour, cmd); err != nil { return details, fmt.Errorf("failed to build kernel: %s", err) @@ -59,7 +94,6 @@ func (a android) build(params Params) (ImageDetails, error) { vmlinux := filepath.Join(buildDistDir, "vmlinux") config := filepath.Join(params.KernelDir, "out", "mixed", "device-kernel", "private", "gs-google", ".config") - var err error details.CompilerID, err = a.readCompiler(params.KernelDir) if err != nil { return details, fmt.Errorf("failed to read compiler: %v", err) @@ -78,7 +112,7 @@ func (a android) build(params Params) (ImageDetails, error) { } defer imageFile.Close() - if err := a.embedImages(imageFile, buildDistDir, "boot.img", "dtbo.img", "vendor_kernel_boot.img", + if err := a.embedImages(imageFile, buildDistDir, "boot.img", "dtbo.img", buildCfg.VendorBootImage, "vendor_dlkm.img"); err != nil { return details, fmt.Errorf("failed to embed images: %v", err) } diff --git a/pkg/build/build.go b/pkg/build/build.go index 2ee0d3aa6..f4cee5d88 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -6,6 +6,7 @@ package build import ( "bytes" + "encoding/json" "fmt" "os" "path/filepath" @@ -35,6 +36,7 @@ type Params struct { SysctlFile string Config []byte Tracer debugtracer.DebugTracer + Build json.RawMessage } // Information that is returned from the Image function. diff --git a/syz-ci/manager.go b/syz-ci/manager.go index 2af4e1558..e4c368269 100644 --- a/syz-ci/manager.go +++ b/syz-ci/manager.go @@ -331,6 +331,7 @@ func (mgr *Manager) build(kernelCommit *vcs.Commit) error { CmdlineFile: mgr.mgrcfg.KernelCmdline, SysctlFile: mgr.mgrcfg.KernelSysctl, Config: mgr.configData, + Build: mgr.mgrcfg.Build, } details, err := build.Image(params) info := mgr.createBuildInfo(kernelCommit, details.CompilerID) diff --git a/syz-ci/syz-ci.go b/syz-ci/syz-ci.go index e9b51d267..0e5fe6b6e 100644 --- a/syz-ci/syz-ci.go +++ b/syz-ci/syz-ci.go @@ -165,6 +165,9 @@ type ManagerConfig struct { Ccache string `json:"ccache"` Userspace string `json:"userspace"` KernelConfig string `json:"kernel_config"` + // Build-type-specific parameters. + // Parameters for concrete types are in Config type in pkg/build/TYPE.go, e.g. pkg/build/android.go. + Build json.RawMessage `json:"build"` // Baseline config for bisection, see pkg/bisect.KernelConfig.BaselineConfig. KernelBaselineConfig string `json:"kernel_baseline_config"` // File with kernel cmdline values (optional). |
