From 11d1cdb3c63b005fb316970896a583922e42a7f8 Mon Sep 17 00:00:00 2001 From: Alexey Kardashevskiy Date: Thu, 3 Jun 2021 12:28:32 +1000 Subject: pkg/ifuzz/iset: make generateInt() available for all arches The helper generates random int values including addresses from interesting memory regions. This seems useful for all arches, share it. Signed-off-by: Alexey Kardashevskiy --- pkg/ifuzz/iset/iset.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ pkg/ifuzz/x86/pseudo.go | 20 ++++++++++---------- pkg/ifuzz/x86/x86.go | 48 +----------------------------------------------- 3 files changed, 57 insertions(+), 57 deletions(-) (limited to 'pkg') diff --git a/pkg/ifuzz/iset/iset.go b/pkg/ifuzz/iset/iset.go index d6c3518dc..65c79a500 100644 --- a/pkg/ifuzz/iset/iset.go +++ b/pkg/ifuzz/iset/iset.go @@ -100,3 +100,49 @@ func (cfg *Config) IsCompatible(insn Insn) bool { } return true } + +func GenerateInt(cfg *Config, r *rand.Rand, size int) uint64 { + if size != 1 && size != 2 && size != 4 && size != 8 { + panic("bad arg size") + } + var v uint64 + switch x := r.Intn(60); { + case x < 10: + v = uint64(r.Intn(1 << 4)) + case x < 20: + v = uint64(r.Intn(1 << 16)) + case x < 25: + v = uint64(r.Int63()) % (1 << 32) + case x < 30: + v = uint64(r.Int63()) + case x < 40: + v = SpecialNumbers[r.Intn(len(SpecialNumbers))] + if r.Intn(5) == 0 { + v += uint64(r.Intn(33)) - 16 + } + case x < 50 && len(cfg.MemRegions) != 0: + mem := cfg.MemRegions[r.Intn(len(cfg.MemRegions))] + switch x := r.Intn(100); { + case x < 25: + v = mem.Start + case x < 50: + v = mem.Start + mem.Size + case x < 75: + v = mem.Start + mem.Size/2 + default: + v = mem.Start + uint64(r.Int63())%mem.Size + } + if r.Intn(10) == 0 { + v += uint64(r.Intn(33)) - 16 + } + default: + v = uint64(r.Intn(1 << 8)) + } + if r.Intn(50) == 0 { + v = uint64(-int64(v)) + } + if r.Intn(50) == 0 && size != 1 { + v &^= 1<<12 - 1 + } + return v +} diff --git a/pkg/ifuzz/x86/pseudo.go b/pkg/ifuzz/x86/pseudo.go index 9e6f31204..a6c486be4 100644 --- a/pkg/ifuzz/x86/pseudo.go +++ b/pkg/ifuzz/x86/pseudo.go @@ -31,7 +31,7 @@ var pseudo = []*Insn{ generator: func(cfg *iset.Config, r *rand.Rand) []byte { gen := makeGen(cfg, r) msr := msrs[r.Intn(len(msrs))] - v := generateInt(cfg, r, 8) + v := iset.GenerateInt(cfg, r, 8) gen.mov32(regECX, msr) gen.mov32(regEAX, uint32(v>>0)) gen.mov32(regEDX, uint32(v>>32)) @@ -60,7 +60,7 @@ var pseudo = []*Insn{ generator: func(cfg *iset.Config, r *rand.Rand) []byte { gen := makeGen(cfg, r) addr, port, size := pciAddrPort(r) - val := generateInt(cfg, r, 4) + val := iset.GenerateInt(cfg, r, 4) gen.out32(0xcf8, addr) gen.out(port, uint32(val), size) return gen.text @@ -86,7 +86,7 @@ var pseudo = []*Insn{ generator: func(cfg *iset.Config, r *rand.Rand) []byte { gen := makeGen(cfg, r) port := ports[r.Intn(len(ports))] - val := generateInt(cfg, r, 4) + val := iset.GenerateInt(cfg, r, 4) gen.out(port, uint32(val), r.Intn(3)) return gen.text }, @@ -137,7 +137,7 @@ var pseudo = []*Insn{ br := uint8(r.Intn(4)) loc := uint32(r.Intn(4)) typ := uint32(r.Intn(16)) - addr := generateInt(cfg, r, 8) + addr := iset.GenerateInt(cfg, r, 8) if cfg.Mode == iset.ModeLong64 { gen.mov64(regRAX, addr) } else { @@ -159,7 +159,7 @@ var pseudo = []*Insn{ gen := makeGen(cfg, r) sel := randSelector(r) if cfg.Mode == iset.ModeReal16 { - sel = uint16(generateInt(cfg, r, 8)) >> 4 + sel = uint16(iset.GenerateInt(cfg, r, 8)) >> 4 } reg := uint8(r.Intn(6)) gen.mov16(regAX, sel) @@ -175,7 +175,7 @@ var pseudo = []*Insn{ generator: func(cfg *iset.Config, r *rand.Rand) []byte { gen := makeGen(cfg, r) sel := randSelector(r) - off := generateInt(cfg, r, 4) + off := iset.GenerateInt(cfg, r, 4) if cfg.Mode == iset.ModeLong64 { gen.mov32toSPaddr(uint32(sel), 0) gen.mov32toSPaddr(uint32(off), 2) @@ -224,8 +224,8 @@ var pseudo = []*Insn{ Pseudo: true, generator: func(cfg *iset.Config, r *rand.Rand) []byte { gen := makeGen(cfg, r) - limit := uint32(generateInt(cfg, r, 2)) - base := uint32(generateInt(cfg, r, 4)) + limit := uint32(iset.GenerateInt(cfg, r, 2)) + base := uint32(iset.GenerateInt(cfg, r, 4)) gen.mov32toSPaddr(limit, 0) gen.mov32toSPaddr(base, 2) gen.mov32toSPaddr(0, 6) @@ -249,8 +249,8 @@ var pseudo = []*Insn{ case 0: gen.mov32(regEAX, 1) // KVM_HC_VAPIC_POLL_IRQ case 1: - gen.mov32(regEAX, 5) // KVM_HC_KICK_CPU - gen.mov32(regECX, uint32(generateInt(cfg, r, 4))) // APIC ID + gen.mov32(regEAX, 5) // KVM_HC_KICK_CPU + gen.mov32(regECX, uint32(iset.GenerateInt(cfg, r, 4))) // APIC ID default: panic("bad") } diff --git a/pkg/ifuzz/x86/x86.go b/pkg/ifuzz/x86/x86.go index 25d01fd36..a2825b9e5 100644 --- a/pkg/ifuzz/x86/x86.go +++ b/pkg/ifuzz/x86/x86.go @@ -74,7 +74,7 @@ func (insn *Insn) Info() (string, iset.Mode, bool, bool) { } func generateArg(cfg *iset.Config, r *rand.Rand, size int) []byte { - v := generateInt(cfg, r, size) + v := iset.GenerateInt(cfg, r, size) arg := make([]byte, size) for i := 0; i < size; i++ { arg[i] = byte(v) @@ -82,49 +82,3 @@ func generateArg(cfg *iset.Config, r *rand.Rand, size int) []byte { } return arg } - -func generateInt(cfg *iset.Config, r *rand.Rand, size int) uint64 { - if size != 1 && size != 2 && size != 4 && size != 8 { - panic("bad arg size") - } - var v uint64 - switch x := r.Intn(60); { - case x < 10: - v = uint64(r.Intn(1 << 4)) - case x < 20: - v = uint64(r.Intn(1 << 16)) - case x < 25: - v = uint64(r.Int63()) % (1 << 32) - case x < 30: - v = uint64(r.Int63()) - case x < 40: - v = iset.SpecialNumbers[r.Intn(len(iset.SpecialNumbers))] - if r.Intn(5) == 0 { - v += uint64(r.Intn(33)) - 16 - } - case x < 50 && len(cfg.MemRegions) != 0: - mem := cfg.MemRegions[r.Intn(len(cfg.MemRegions))] - switch x := r.Intn(100); { - case x < 25: - v = mem.Start - case x < 50: - v = mem.Start + mem.Size - case x < 75: - v = mem.Start + mem.Size/2 - default: - v = mem.Start + uint64(r.Int63())%mem.Size - } - if r.Intn(10) == 0 { - v += uint64(r.Intn(33)) - 16 - } - default: - v = uint64(r.Intn(1 << 8)) - } - if r.Intn(50) == 0 { - v = uint64(-int64(v)) - } - if r.Intn(50) == 0 && size != 1 { - v &^= 1<<12 - 1 - } - return v -} -- cgit mrf-deployment