diff options
| author | Alexey Kardashevskiy <aik@linux.ibm.com> | 2021-10-11 20:46:33 +1100 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2021-11-12 16:33:30 +0100 |
| commit | 9c6dddede29015813145b3132cd40fae7c457f11 (patch) | |
| tree | de2bf2d260eefe5a00a8f164e8b5d1293aa54240 /pkg/ifuzz | |
| parent | c6ef28725fa2f779eb9111af486559c6ad1b2f70 (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.go | 20 |
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) |
