aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-07-05 13:03:10 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-07-05 13:03:10 +0200
commit1c9d3058949b33a8714b7f8034eee566cfc526bd (patch)
treec17aa42abaa6f1c98e99df3560d3d5be867121a7 /pkg
parent8ebdf5923da437622f476063c058d1e3122d9225 (diff)
pkg/build: add akaros support
Diffstat (limited to 'pkg')
-rw-r--r--pkg/build/akaros.go133
-rw-r--r--pkg/build/build.go2
2 files changed, 135 insertions, 0 deletions
diff --git a/pkg/build/akaros.go b/pkg/build/akaros.go
new file mode 100644
index 000000000..3ef10414d
--- /dev/null
+++ b/pkg/build/akaros.go
@@ -0,0 +1,133 @@
+// 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"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strconv"
+ "time"
+
+ "github.com/google/syzkaller/pkg/osutil"
+)
+
+type akaros struct{}
+
+func (ctx akaros) build(targetArch, vmType, kernelDir, outputDir, compiler, userspaceDir,
+ cmdlineFile, sysctlFile string, config []byte) error {
+ configFile := filepath.Join(kernelDir, ".config")
+ if err := osutil.WriteFile(configFile, config); err != nil {
+ return fmt.Errorf("failed to write config file: %v", err)
+ }
+ if err := osutil.SandboxChown(configFile); err != nil {
+ return err
+ }
+ sshkey := filepath.Join(kernelDir, "key")
+ sshkeyPub := sshkey + ".pub"
+ os.Remove(sshkey)
+ os.Remove(sshkeyPub)
+ if _, err := osutil.RunCmd(10*time.Minute, "", "ssh-keygen", "-t", "rsa", "-b", "2048",
+ "-N", "", "-C", "", "-f", sshkey); err != nil {
+ return err
+ }
+ if err := osutil.SandboxChown(sshkeyPub); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "", "olddefconfig", "ARCH=x86"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "", "xcc"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "tools/dev-libs/elfutils", "install"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "", "apps-install"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "", "fill-kfs"); err != nil {
+ return err
+ }
+ targetKey := filepath.Join(kernelDir, "kern", "kfs", ".ssh", "authorized_keys")
+ if err := os.Rename(sshkeyPub, targetKey); err != nil {
+ return err
+ }
+ const init = `#!/bin/bash
+/ifconfig
+dropbear -F 2>db_out &
+bash
+`
+ initFile := filepath.Join(kernelDir, "kern", "kfs", "init.sh")
+ if err := osutil.WriteFile(initFile, []byte(init)); err != nil {
+ return fmt.Errorf("failed to write init script: %v", err)
+ }
+ if err := osutil.SandboxChown(initFile); err != nil {
+ return err
+ }
+ if err := os.Chmod(initFile, 0770); err != nil {
+ return err
+ }
+ if err := ctx.cmd(kernelDir, "dropbear", "./CONFIGURE_AKAROS"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "dropbear/build"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, "dropbear/build", "install"); err != nil {
+ return err
+ }
+ if err := ctx.make(kernelDir, ""); err != nil {
+ return err
+ }
+ if err := osutil.WriteFile(filepath.Join(outputDir, "image"), nil); err != nil {
+ return fmt.Errorf("failed to write image file: %v", err)
+ }
+ for src, dst := range map[string]string{
+ ".config": "kernel.config",
+ "key": "key",
+ "obj/kern/akaros-kernel": "kernel",
+ "obj/kern/akaros-kernel-64b": "obj/akaros-kernel-64b",
+ } {
+ fullSrc := filepath.Join(kernelDir, filepath.FromSlash(src))
+ fullDst := filepath.Join(outputDir, filepath.FromSlash(dst))
+ if err := osutil.CopyFile(fullSrc, fullDst); err != nil {
+ return fmt.Errorf("faied to copy %v: %v", src, err)
+ }
+ }
+ return nil
+}
+
+func (ctx akaros) clean(kernelDir string) error {
+ // Note: this does not clean toolchain and elfutils.
+ return ctx.make(kernelDir, "", "realclean")
+}
+
+func (ctx akaros) make(kernelDir, runDir string, args ...string) error {
+ args = append([]string{"-j", strconv.Itoa(runtime.NumCPU())}, args...)
+ return ctx.cmd(kernelDir, runDir, "make", args...)
+}
+
+func (ctx akaros) cmd(kernelDir, runDir string, bin string, args ...string) error {
+ cmd := osutil.Command(bin, args...)
+ if err := osutil.Sandbox(cmd, true, false); err != nil {
+ return err
+ }
+ cmd.Dir = kernelDir
+ if runDir != "" {
+ cmd.Dir = filepath.Join(kernelDir, filepath.FromSlash(runDir))
+ }
+ cmd.Env = append([]string{}, os.Environ()...)
+ cmd.Env = append(cmd.Env, []string{
+ "MAKE_JOBS=" + strconv.Itoa(runtime.NumCPU()),
+ "AKAROS_ROOT=" + kernelDir,
+ "AKAROS_XCC_ROOT=" + filepath.Join(kernelDir, "toolchain", "x86_64-ucb-akaros-gcc"),
+ "X86_64_INSTDIR=" + filepath.Join(kernelDir, "toolchain", "x86_64-ucb-akaros-gcc"),
+ "PATH=" + filepath.Join(kernelDir, "toolchain", "x86_64-ucb-akaros-gcc", "bin") +
+ string(filepath.ListSeparator) + os.Getenv("PATH"),
+ }...)
+ _, err := osutil.Run(time.Hour, cmd)
+ return err
+}
diff --git a/pkg/build/build.go b/pkg/build/build.go
index 56be57c65..4d0489a63 100644
--- a/pkg/build/build.go
+++ b/pkg/build/build.go
@@ -62,6 +62,8 @@ func getBuilder(targetOS, targetArch, vmType string) (builder, error) {
return linux{}, nil
case targetOS == "fuchsia" && (targetArch == "amd64" || targetArch == "arm64") && vmType == "qemu":
return fuchsia{}, nil
+ case targetOS == "akaros" && targetArch == "amd64" && vmType == "qemu":
+ return akaros{}, nil
default:
return nil, fmt.Errorf("unsupported image type %v/%v/%v", targetOS, targetArch, vmType)
}