aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ifuzz/riscv64_test.go
blob: 9c8ebc443cb1b645106ac6abe8ceb2297afbaa88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright 2026 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 ifuzz

import (
	"encoding/binary"
	"encoding/hex"
	"fmt"
	"strconv"
	"testing"

	"github.com/google/syzkaller/pkg/ifuzz/iset"
	"github.com/google/syzkaller/pkg/ifuzz/riscv64"
)

func PrintInsnRv(insn riscv64.Insn) {
	operands := ""
	for i, op := range insn.Operands {
		field := insn.Fields[i]
		operands += fmt.Sprintf("%s:%d=%x ", field.Name, field.Length, op)
	}
	fmt.Printf("{ \"%s\" [0x%x] %s }\n", insn.Name, insn.AsUInt32, operands)
}

func parseAndPrintRv(from uint32) {
	insn, _ := riscv64.ParseInsn(from)
	PrintInsnRv(insn)
}

func TestSomethingRv(t *testing.T) {
	// add	a0,a0,a1
	parseAndPrintRv(0x00b50533)
	// li	t0,0
	parseAndPrintRv(0x00000293)
	// mul	a0,a0,a1
	parseAndPrintRv(0x02b50533)
	// csrr	a0,sstatus
	parseAndPrintRv(0x10002573)
	// ecall
	parseAndPrintRv(0x00000073)
}

func TestSumRv(t *testing.T) {
	data := [][2]string{
		{"00100073", "ebreak"},
		{"18029073", "csrw	satp,t0"},
		{"c01025f3", "rdtime	a1"},
		{"c0002573", "rdcycle	a0"},
		{"02b56533", "rem	a0,a0,a1"},
		{"02b54533", "div	a0,a0,a1"},
		{"00030513", "mv	a0,t1"},
		{"00c5a023", "sw	a2,0(a1)"},
	}
	for _, pair := range data {
		opcode, err := strconv.ParseUint(pair[0], 16, 32)
		if err != nil {
			t.Fatalf("failed to parse opcode")
		}
		fmt.Printf("%s\n", pair[1])
		parseAndPrintRv(uint32(opcode))
	}
}

func decodeRvText(t *testing.T, insnset iset.InsnSet, text []byte) {
	for len(text) > 0 {
		size, err := insnset.Decode(iset.ModeLong64, text)
		if size == 0 || err != nil {
			t.Errorf("failed to decode text: %v", text)
			return
		}
		parseAndPrintRv(binary.LittleEndian.Uint32(text[:4]))
		text = text[size:]
	}
}

func TestDecodeSamplesRv(t *testing.T) {
	testData := []string{
		"7300100073900918",
		"f32510c0732500c0",
		"3365b5023345b502",
		"1305030023a0c500",
		// 007302b3 -> add t0, t1, t2 -> "add" [0x7302b3] xs2:5=7 xs1:5=6 xd:5=5
		"b3027300",
	}
	insnset := iset.Arches["riscv64"]
	for _, str := range testData {
		text, err := hex.DecodeString(str)
		if err != nil {
			t.Fatalf("invalid hex string")
		}
		fmt.Printf("Decoding % x\n", text)
		decodeRvText(t, insnset, text)
	}
}