aboutsummaryrefslogtreecommitdiffstats
path: root/sys/akaros/init.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-10-14 19:57:48 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-10-16 14:21:54 +0200
commit2647772874bf02bb2fb0cb237ba9aaae1e2a14ec (patch)
treebdea3eabf45ef29cb6035453d0249db1a77c7d2f /sys/akaros/init.go
parentaa2533b98d21ebcad5777310215159127bfe3573 (diff)
sys/akaros: add akaros support
Diffstat (limited to 'sys/akaros/init.go')
-rw-r--r--sys/akaros/init.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/sys/akaros/init.go b/sys/akaros/init.go
new file mode 100644
index 000000000..02b9f09a6
--- /dev/null
+++ b/sys/akaros/init.go
@@ -0,0 +1,74 @@
+// Copyright 2017 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 akaros
+
+import (
+ "github.com/google/syzkaller/prog"
+)
+
+func initTarget(target *prog.Target) {
+ arch := &arch{
+ mmapSyscall: target.SyscallMap["mmap"],
+ PROT_READ: target.ConstMap["PROT_READ"],
+ PROT_WRITE: target.ConstMap["PROT_WRITE"],
+ MAP_ANONYMOUS: target.ConstMap["MAP_ANONYMOUS"],
+ MAP_PRIVATE: target.ConstMap["MAP_PRIVATE"],
+ MAP_FIXED: target.ConstMap["MAP_FIXED"],
+ }
+
+ target.PageSize = pageSize
+ target.DataOffset = dataOffset
+ target.MmapSyscall = arch.mmapSyscall
+ target.MakeMmap = arch.makeMmap
+ target.AnalyzeMmap = arch.analyzeMmap
+}
+
+const (
+ pageSize = 4 << 10
+ dataOffset = 512 << 20
+ invalidFD = ^uint64(0)
+)
+
+type arch struct {
+ mmapSyscall *prog.Syscall
+
+ PROT_READ uint64
+ PROT_WRITE uint64
+ MAP_ANONYMOUS uint64
+ MAP_PRIVATE uint64
+ MAP_FIXED uint64
+}
+
+// createMmapCall creates a "normal" mmap call that maps [start, start+npages) page range.
+func (arch *arch) makeMmap(start, npages uint64) *prog.Call {
+ meta := arch.mmapSyscall
+ return &prog.Call{
+ Meta: meta,
+ Args: []prog.Arg{
+ prog.MakePointerArg(meta.Args[0], start, 0, npages, nil),
+ prog.MakeConstArg(meta.Args[1], npages*pageSize),
+ prog.MakeConstArg(meta.Args[2], arch.PROT_READ|arch.PROT_WRITE),
+ prog.MakeConstArg(meta.Args[3], arch.MAP_ANONYMOUS|arch.MAP_PRIVATE|arch.MAP_FIXED),
+ prog.MakeResultArg(meta.Args[4], nil, invalidFD),
+ prog.MakeConstArg(meta.Args[5], 0),
+ },
+ Ret: prog.MakeReturnArg(meta.Ret),
+ }
+}
+
+func (arch *arch) analyzeMmap(c *prog.Call) (start, npages uint64, mapped bool) {
+ switch c.Meta.Name {
+ case "mmap":
+ start = c.Args[0].(*prog.PointerArg).PageIndex
+ mapped = true
+ return
+ case "munmap":
+ start = c.Args[0].(*prog.PointerArg).PageIndex
+ npages = c.Args[1].(*prog.ConstArg).Val / pageSize
+ mapped = false
+ return
+ default:
+ return
+ }
+}