blob: dc8e80b4d6d601961ba50b61068497b32d2abf02 [file] [log] [blame]
// Copyright 2018 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"
"path/filepath"
"time"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/sys/targets"
)
type fuchsia struct{}
func (fu fuchsia) build(params *Params) error {
sysTarget := targets.Get("fuchsia", params.TargetArch)
if sysTarget == nil {
return fmt.Errorf("unsupported fuchsia arch %v", params.TargetArch)
}
arch := sysTarget.KernelHeaderArch
product := fmt.Sprintf("%s.%s", "core", arch)
if _, err := runSandboxed(time.Hour, params.KernelDir, "scripts/fx", "--dir", "out/"+arch,
"set", product, "--with-base", "//bundles:tools"); err != nil {
return err
}
if _, err := runSandboxed(time.Hour*2, params.KernelDir, "scripts/fx", "clean-build"); err != nil {
return err
}
// Fuchsia images no longer include ssh keys. Manually append the ssh public key to the zbi.
sshZBI := filepath.Join(params.KernelDir, "out", arch, "fuchsia-ssh.zbi")
kernelZBI := filepath.Join(params.KernelDir, "out", arch, "fuchsia.zbi")
authorizedKeys := fmt.Sprintf("data/ssh/authorized_keys=%s",
filepath.Join(params.KernelDir, ".ssh", "authorized_keys"))
if _, err := runSandboxed(time.Minute, params.KernelDir, "out/"+arch+".zircon/tools/zbi",
"-o", sshZBI, kernelZBI, "--entry", authorizedKeys); err != nil {
return err
}
for src, dst := range map[string]string{
"out/" + arch + "/obj/build/images/fvm.blk": "image",
".ssh/pkey": "key",
"out/" + arch + ".zircon/kernel-" + arch + "-clang/obj/kernel/zircon.elf": "obj/zircon.elf",
"out/" + arch + ".zircon/multiboot.bin": "kernel",
"out/" + arch + "/fuchsia-ssh.zbi": "initrd",
} {
fullSrc := filepath.Join(params.KernelDir, filepath.FromSlash(src))
fullDst := filepath.Join(params.OutputDir, filepath.FromSlash(dst))
if err := osutil.CopyFile(fullSrc, fullDst); err != nil {
return fmt.Errorf("failed to copy %v: %v", src, err)
}
}
return nil
}
func (fu fuchsia) clean(kernelDir, targetArch string) error {
// We always do clean build because incremental build is frequently broken.
// So no need to clean separately.
return nil
}
func runSandboxed(timeout time.Duration, dir, command string, arg ...string) ([]byte, error) {
cmd := osutil.Command(command, arg...)
cmd.Dir = dir
if err := osutil.Sandbox(cmd, true, false); err != nil {
return nil, err
}
return osutil.Run(timeout, cmd)
}