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
|
// Copyright 2017 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 ifuzzimpl
import (
"math/rand"
)
const (
ArchX86 = "x86"
ArchPowerPC = "powerpc"
)
var Arches = make(map[string]InsnSet)
type (
Mode int
Type int
)
type Insn interface {
GetName() string
GetMode() int
GetPseudo() bool
GetPriv() bool
IsCompatible(cfg *Config) bool
Encode(cfg *Config, r *rand.Rand) []byte
}
type InsnSet interface {
GetInsns(mode Mode, typ Type) []Insn
Decode(mode Mode, text []byte) (int, error)
DecodeExt(mode Mode, text []byte) (int, error) // XED, to keep ifuzz_test happy
}
type Config struct {
Arch string
Len int // number of instructions to generate
Mode Mode // one of ModeXXX
Priv bool // generate CPL=0 instructions (x86), HV/!PR mode (PPC)
Exec bool // generate instructions sequences interesting for execution
MemRegions []MemRegion // generated instructions will reference these regions
}
type MemRegion struct {
Start uint64
Size uint64
}
const (
ModeLong64 Mode = iota
ModeProt32
ModeProt16
ModeReal16
ModeLast
)
const (
TypeExec Type = iota
TypePriv
TypeUser
TypeAll
TypeLast
)
var SpecialNumbers = [...]uint64{0, 1 << 15, 1 << 16, 1 << 31, 1 << 32, 1 << 47, 1 << 47, 1 << 63}
|