From 07bfd71dacb4775720708ca2fc39fef10c9f37c4 Mon Sep 17 00:00:00 2001 From: Jouni Hogander Date: Tue, 19 Nov 2019 13:12:54 +0200 Subject: 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 --- Makefile | 10 +++++++--- docs/syscall_descriptions.md | 2 +- executor/common_linux.h | 2 ++ pkg/cover/report.go | 5 +++++ pkg/host/syscalls_linux.go | 2 ++ pkg/osutil/osutil_linux.go | 2 +- sys/linux/init.go | 1 + sys/targets/targets.go | 10 ++++++++++ vm/qemu/qemu.go | 10 ++++++++++ 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: "/", -- cgit mrf-deployment