syzkaller/pkg/ifuzz/xed.go
2017-06-03 10:41:09 +02:00

66 lines
1.8 KiB
Go

// 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.
// XedDecode is required for tests, but it requires Intel XED library installed, so it is disabled by default.
// To run full tests, check out and build github.com/intelxed/xed, then run:
// INTELXED=/path/to/intelxed CGO_CFLAGS="-I $INTELXED/xed/include/public -I $INTELXED/build/obj" CGO_LDFLAGS="$INTELXED/build/obj/libxed.a" go test -v -tags xed
// +build xed
package ifuzz
/*
#include "xed-interface.h"
int xedDecode(int mode, int addrsize, void* text, int size, const char** error) {
xed_decoded_inst_t xedd;
xed_decoded_inst_zero(&xedd);
xed_decoded_inst_set_mode(&xedd, mode, addrsize);
xed_error_enum_t err = xed_decode(&xedd, text, size);
if (err != XED_ERROR_NONE) {
if (error)
*error = xed_error_enum_t2str(err);
return 0;
}
return xed_decoded_inst_get_length(&xedd);
}
*/
import "C"
import (
"errors"
"unsafe"
)
func init() {
C.xed_tables_init()
XedDecode = xedDecode
}
func xedDecode(mode int, text []byte) (int, error) {
xedMode := 0
xedAddr := 0
switch mode {
case ModeLong64:
xedMode = C.XED_MACHINE_MODE_LONG_64
xedAddr = C.XED_ADDRESS_WIDTH_64b
case ModeProt32:
xedMode = C.XED_MACHINE_MODE_LONG_COMPAT_32
xedAddr = C.XED_ADDRESS_WIDTH_32b
case ModeProt16:
xedMode = C.XED_MACHINE_MODE_LONG_COMPAT_16
xedAddr = C.XED_ADDRESS_WIDTH_16b
case ModeReal16:
xedMode = C.XED_MACHINE_MODE_REAL_16
xedAddr = C.XED_ADDRESS_WIDTH_16b
default:
panic("bad mode")
}
var errorStr *C.char
res := C.xedDecode(C.int(xedMode), C.int(xedAddr), unsafe.Pointer(&text[0]), C.int(len(text)), &errorStr)
if res == 0 {
return 0, errors.New(C.GoString(errorStr))
}
return int(res), nil
}