| // 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 |
| } |