aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Hogander <jouni.hogander@unikie.com>2019-11-19 13:12:54 +0200
committerDmitry Vyukov <dvyukov@google.com>2019-12-17 11:10:52 +0100
commit07bfd71dacb4775720708ca2fc39fef10c9f37c4 (patch)
tree13d1bb01110aacfefe8999a23ac3cd83b4a5e9fa
parentd13d795888186e87aeec9ce670986d183036c348 (diff)
Implement basic support for MIPS64LE
Add basic stuff to enable MIPS64ELR2 target: - build - make extract - make generate - qemu execution - system call parsing from /proc/kallsyms
-rw-r--r--Makefile10
-rw-r--r--docs/syscall_descriptions.md2
-rw-r--r--executor/common_linux.h2
-rw-r--r--pkg/cover/report.go5
-rw-r--r--pkg/host/syscalls_linux.go2
-rw-r--r--pkg/osutil/osutil_linux.go2
-rw-r--r--sys/linux/init.go1
-rw-r--r--sys/targets/targets.go10
-rw-r--r--vm/qemu/qemu.go10
9 files changed, 39 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index aeb3c4ace..4d1601208 100644
--- a/Makefile
+++ b/Makefile
@@ -97,7 +97,7 @@ endif
arch arch_darwin_amd64_host arch_linux_amd64_host \
arch_freebsd_amd64_host arch_netbsd_amd64_host \
arch_linux_amd64_target arch_linux_386_target \
- arch_linux_arm64_target arch_linux_arm_target arch_linux_ppc64le_target \
+ arch_linux_arm64_target arch_linux_arm_target arch_linux_ppc64le_target arch_linux_mips64le_target \
arch_freebsd_amd64_target arch_freebsd_386_target \
arch_netbsd_amd64_target arch_windows_amd64_target \
arch_test presubmit presubmit_parallel clean
@@ -242,7 +242,7 @@ lint:
arch: arch_darwin_amd64_host arch_linux_amd64_host arch_freebsd_amd64_host \
arch_netbsd_amd64_host arch_openbsd_amd64_host \
arch_linux_amd64_target arch_linux_386_target \
- arch_linux_arm64_target arch_linux_arm_target arch_linux_ppc64le_target \
+ arch_linux_arm64_target arch_linux_arm_target arch_linux_ppc64le_target arch_linux_mips64le_target \
arch_freebsd_amd64_target arch_freebsd_386_target \
arch_netbsd_amd64_target arch_openbsd_amd64_target \
arch_windows_amd64_target arch_test
@@ -265,6 +265,9 @@ arch_linux_arm64_target:
arch_linux_arm_target:
env TARGETOS=linux TARGETARCH=arm $(MAKE) target
+arch_linux_mips64le_target:
+ env TARGETOS=linux TARGETARCH=mips64le $(MAKE) target
+
arch_linux_ppc64le_target:
env TARGETOS=linux TARGETARCH=ppc64le $(MAKE) target
@@ -333,10 +336,11 @@ install_prerequisites:
uname -a
sudo apt-get update
sudo apt-get install -y -q libc6-dev-i386 linux-libc-dev \
- gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi gcc-powerpc64le-linux-gnu || true
+ gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi gcc-powerpc64le-linux-gnu gcc-mips64el-linux-gnuabi64 || true
sudo apt-get install -y -q g++-aarch64-linux-gnu || true
sudo apt-get install -y -q g++-powerpc64le-linux-gnu || true
sudo apt-get install -y -q g++-arm-linux-gnueabi || true
+ sudo apt-get install -y -q g++-mips64el-linux-gnuabi64 || true
sudo apt-get install -y -q ragel clang-format
go get -u golang.org/x/tools/cmd/goyacc \
github.com/golangci/golangci-lint/cmd/golangci-lint \
diff --git a/docs/syscall_descriptions.md b/docs/syscall_descriptions.md
index dd9762823..7cf715250 100644
--- a/docs/syscall_descriptions.md
+++ b/docs/syscall_descriptions.md
@@ -139,7 +139,7 @@ make generate
make
```
-`$ARCH` is one of `amd64`, `386` `arm64`, `arm`, `ppc64le`.
+`$ARCH` is one of `amd64`, `386` `arm64`, `arm`, `ppc64le`, `mips64le`.
If the subsystem is supported on several architectures, then run `syz-extract` for each arch.
`$LINUX` should point to kernel source checkout, which is configured for the
corresponding arch (i.e. you need to run `make ARCH=arch someconfig && make ARCH=arch` there first,
diff --git a/executor/common_linux.h b/executor/common_linux.h
index f333c41f1..23f830a8f 100644
--- a/executor/common_linux.h
+++ b/executor/common_linux.h
@@ -1229,6 +1229,8 @@ struct fs_image_segment {
#define sys_memfd_create 279
#elif GOARCH_ppc64le
#define sys_memfd_create 360
+#elif GOARCH_mips64le
+#define sys_memfd_create 314
#endif
static unsigned long fs_image_segment_check(unsigned long size, unsigned long nsegs, long segments)
diff --git a/pkg/cover/report.go b/pkg/cover/report.go
index 9268f733d..419fd4ba1 100644
--- a/pkg/cover/report.go
+++ b/pkg/cover/report.go
@@ -435,6 +435,8 @@ func PreviousInstructionPC(arch string, pc uint64) uint64 {
return (pc - 3) & ^uint64(1)
case "ppc64le":
return pc - 4
+ case "mips64le":
+ return pc - 4
default:
panic(fmt.Sprintf("unknown arch %q", arch))
}
@@ -458,6 +460,9 @@ func archCallInsn(arch string) (string, string) {
case "ppc64le":
// c00000000006d904: bl c000000000350780 <.__sanitizer_cov_trace_pc>
return "\tbl ", " <.__sanitizer_cov_trace_pc>"
+ case "mips64le":
+ // ffffffff80100420: jal ffffffff80205880 <__sanitizer_cov_trace_pc>
+ return "\tjal\t", callName
default:
panic(fmt.Sprintf("unknown arch %q", arch))
}
diff --git a/pkg/host/syscalls_linux.go b/pkg/host/syscalls_linux.go
index 5e67d05eb..d9c247c88 100644
--- a/pkg/host/syscalls_linux.go
+++ b/pkg/host/syscalls_linux.go
@@ -75,6 +75,8 @@ func parseKallsyms(kallsyms []byte, arch string) map[string]bool {
re = regexp.MustCompile(` T (__arm64_)?sys_([^\n]+)\n`)
case "ppc64le":
re = regexp.MustCompile(` T ()?sys_([^\n]+)\n`)
+ case "mips64le":
+ re = regexp.MustCompile(` T sys_(mips_)?([^\n]+)\n`)
default:
panic("unsupported arch for kallsyms parsing")
}
diff --git a/pkg/osutil/osutil_linux.go b/pkg/osutil/osutil_linux.go
index 8a99a5f84..79df69999 100644
--- a/pkg/osutil/osutil_linux.go
+++ b/pkg/osutil/osutil_linux.go
@@ -58,7 +58,7 @@ func removeImmutable(fname string) error {
cmd = 1074030082
case "amd64", "arm64":
cmd = 1074292226
- case "ppc64le":
+ case "ppc64le", "mips64le":
cmd = 2148034050
default:
panic("unknown arch")
diff --git a/sys/linux/init.go b/sys/linux/init.go
index 64df47a3f..91bf32be8 100644
--- a/sys/linux/init.go
+++ b/sys/linux/init.go
@@ -83,6 +83,7 @@ func InitTarget(target *prog.Target) {
case "arm64":
case "arm":
case "ppc64le":
+ case "mips64le":
default:
panic("unknown arch")
}
diff --git a/sys/targets/targets.go b/sys/targets/targets.go
index 34c06d5c6..e1d5731d8 100644
--- a/sys/targets/targets.go
+++ b/sys/targets/targets.go
@@ -174,6 +174,16 @@ var List = map[string]map[string]*Target{
KernelArch: "arm",
KernelHeaderArch: "arm",
},
+ "mips64le": {
+ VMArch: "mips64le",
+ PtrSize: 8,
+ PageSize: 4 << 10,
+ CFlags: []string{"-D_MIPS_SZLONG=64", "-D__MIPSEL__", "-D__KERNEL__", "-D_MIPS_SIM=_MIPS_SIM_ABI64"},
+ CrossCFlags: []string{"-static", "-march=mips64r2", "-mabi=64", "-EL"},
+ CCompilerPrefix: "mips64el-linux-gnuabi64-",
+ KernelArch: "mips",
+ KernelHeaderArch: "mips",
+ },
"ppc64le": {
PtrSize: 8,
PageSize: 4 << 10,
diff --git a/vm/qemu/qemu.go b/vm/qemu/qemu.go
index dae8f493b..bddace8f6 100644
--- a/vm/qemu/qemu.go
+++ b/vm/qemu/qemu.go
@@ -136,6 +136,16 @@ var archConfigs = map[string]*archConfig{
"console=ttyAMA0",
),
},
+ "linux/mips64le": {
+ Qemu: "qemu-system-mips64el",
+ TargetDir: "/",
+ QemuArgs: "-M malta -cpu MIPS64R2-generic -nodefaults",
+ NicModel: ",model=e1000",
+ CmdLine: append(linuxCmdline,
+ "root=/dev/sda",
+ "console=ttyS0",
+ ),
+ },
"linux/ppc64le": {
Qemu: "qemu-system-ppc64",
TargetDir: "/",