From 418476ecb925e5d58ba9c22928a4e37dc30909df Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 20 Nov 2020 19:28:53 +0100 Subject: pkg/ifuzz/iset: rename ifuzzimpl to iset ifuzzimpl is too lenghty and too clumsy on my taste (nm/vmimpl worked better b/c it's shorter and used less). I've tried to come up with something shorter and nicer. We could use "insn" as a common name for "instruction" in ifuzz, but it's a commonly used name already so would cause lots of conflicts. "iset" is somewhat descriptive, short and nice. --- pkg/ifuzz/iset/iset.go | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 pkg/ifuzz/iset/iset.go (limited to 'pkg/ifuzz/iset') diff --git a/pkg/ifuzz/iset/iset.go b/pkg/ifuzz/iset/iset.go new file mode 100644 index 000000000..46c42537d --- /dev/null +++ b/pkg/ifuzz/iset/iset.go @@ -0,0 +1,102 @@ +// 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 iset ("instruction set") provides base and helper types for ifuzz arch implementations. +package iset + +import ( + "math/rand" +) + +const ( + ArchX86 = "x86" + ArchPowerPC = "powerpc" +) + +var Arches = make(map[string]InsnSet) + +type ( + Mode int + Type int +) + +type Insn interface { + Info() (name string, mode Mode, pseudo, priv 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} + +type ModeInsns [ModeLast][TypeLast][]Insn + +func (modeInsns *ModeInsns) Add(insn Insn) { + _, mode, pseudo, priv := insn.Info() + for m := Mode(0); m < ModeLast; m++ { + if mode&(1<= ModeLast { + panic("bad mode") + } + if priv && !cfg.Priv { + return false + } + if pseudo && !cfg.Exec { + return false + } + if mode&(1<