aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ifuzz
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@linux.ibm.com>2021-10-11 20:46:33 +1100
committerAleksandr Nogikh <wp32pw@gmail.com>2021-11-12 16:33:30 +0100
commit9c6dddede29015813145b3132cd40fae7c457f11 (patch)
treede2bf2d260eefe5a00a8f164e8b5d1293aa54240 /pkg/ifuzz
parentc6ef28725fa2f779eb9111af486559c6ad1b2f70 (diff)
pkg/ifuzz/powerpc: refactor for adding prefixed instructions
This adds xxxOpcode helpers which produce valid opcodes for Encode() (external ifuzz API) and enc() (pseudo instruction fuzzer) from passed opcode/mask/bits. This is going to be needed for prefixes in prefixed instruction (the following patch adds such support). This should not cause behavioral change. Signed-off-by: Alexey Kardashevskiy <aik@linux.ibm.com>
Diffstat (limited to 'pkg/ifuzz')
-rw-r--r--pkg/ifuzz/powerpc/powerpc.go20
1 files changed, 16 insertions, 4 deletions
diff --git a/pkg/ifuzz/powerpc/powerpc.go b/pkg/ifuzz/powerpc/powerpc.go
index e79f93218..e6f58642b 100644
--- a/pkg/ifuzz/powerpc/powerpc.go
+++ b/pkg/ifuzz/powerpc/powerpc.go
@@ -89,13 +89,19 @@ func (insn Insn) Encode(cfg *iset.Config, r *rand.Rand) []byte {
}
ret := make([]byte, 0)
- insn32 := insn.Opcode
+ ret = append(ret, insn.encodeOpcode(cfg, r, insn.Opcode, insn.Mask, insn.Fields)...)
+ return ret
+}
+
+func (insn Insn) encodeOpcode(cfg *iset.Config, r *rand.Rand, opcode, mask uint32, f []InsnField) []byte {
+ ret := make([]byte, 0)
+ insn32 := opcode
if len(cfg.MemRegions) != 0 {
// The PowerISA pdf parser could have missed some fields,
// randomize them there.
- insn32 |= r.Uint32() & ^insn.Mask
+ insn32 |= r.Uint32() & ^mask
}
- for _, f := range insn.Fields {
+ for _, f := range f {
field := uint(r.Intn(1 << 16))
insn32 |= encodeBits(field, f.Bits)
if len(cfg.MemRegions) != 0 && (f.Name == "RA" || f.Name == "RB" || f.Name == "RS") {
@@ -142,7 +148,13 @@ func uint32toBytes(v uint32) []byte {
}
func (insn *Insn) enc(v map[string]uint) []byte {
- insn32 := insn.Opcode
+ ret := make([]byte, 0)
+ ret = append(ret, insn.encOpcode(v, insn.Opcode, insn.Fields)...)
+ return ret
+}
+
+func (insn *Insn) encOpcode(v map[string]uint, opcode uint32, f []InsnField) []byte {
+ insn32 := opcode
for _, f := range insn.Fields {
if val, ok := v[f.Name]; ok {
insn32 |= encodeBits(val, f.Bits)