aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@linux.ibm.com>2021-06-03 12:28:32 +1000
committerDmitry Vyukov <dvyukov@google.com>2021-07-19 11:29:36 +0200
commit11d1cdb3c63b005fb316970896a583922e42a7f8 (patch)
tree37c6419c9bf3e5031a89d4c0d81d964d3cd36392 /pkg
parent3ed2794f59b7fc73bb819f0fb79ed46f1e204773 (diff)
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 <aik@linux.ibm.com>
Diffstat (limited to 'pkg')
-rw-r--r--pkg/ifuzz/iset/iset.go46
-rw-r--r--pkg/ifuzz/x86/pseudo.go20
-rw-r--r--pkg/ifuzz/x86/x86.go48
3 files changed, 57 insertions, 57 deletions
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
-}