github.com/google/syzkaller@v0.0.0-20240517125934-c0f1611a36d6/pkg/ifuzz/x86/xed.go (about)

     1  // Copyright 2017 syzkaller project authors. All rights reserved.
     2  // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
     3  
     4  // XedDecode is required for tests, but it requires Intel XED library installed, so it is disabled by default.
     5  // To run full tests, check out and build github.com/intelxed/xed, then run:
     6  // INTELXED=/path/to/intelxed CGO_CFLAGS="-I $INTELXED/xed/include/public \
     7  //	-I $INTELXED/build/obj" CGO_LDFLAGS="$INTELXED/build/obj/libxed.a" \
     8  //	go test -v -tags xed
     9  
    10  //go:build xed
    11  
    12  package x86
    13  
    14  /*
    15  #include "xed-interface.h"
    16  
    17  int xedDecode(int mode, int addrsize, void* text, int size, const char** error) {
    18    xed_decoded_inst_t xedd;
    19    xed_decoded_inst_zero(&xedd);
    20    xed_decoded_inst_set_mode(&xedd, mode, addrsize);
    21    xed_error_enum_t err = xed_decode(&xedd, text, size);
    22    if (err != XED_ERROR_NONE) {
    23      if (error)
    24        *error = xed_error_enum_t2str(err);
    25      return 0;
    26    }
    27    return xed_decoded_inst_get_length(&xedd);
    28  }
    29  */
    30  import "C"
    31  
    32  import (
    33  	"errors"
    34  	"unsafe"
    35  )
    36  
    37  func init() {
    38  	C.xed_tables_init()
    39  	XedDecode = xedDecode
    40  }
    41  
    42  func xedDecode(mode int, text []byte) (int, error) {
    43  	xedMode := 0
    44  	xedAddr := 0
    45  	switch mode {
    46  	case ModeLong64:
    47  		xedMode = C.XED_MACHINE_MODE_LONG_64
    48  		xedAddr = C.XED_ADDRESS_WIDTH_64b
    49  	case ModeProt32:
    50  		xedMode = C.XED_MACHINE_MODE_LONG_COMPAT_32
    51  		xedAddr = C.XED_ADDRESS_WIDTH_32b
    52  	case ModeProt16:
    53  		xedMode = C.XED_MACHINE_MODE_LONG_COMPAT_16
    54  		xedAddr = C.XED_ADDRESS_WIDTH_16b
    55  	case ModeReal16:
    56  		xedMode = C.XED_MACHINE_MODE_REAL_16
    57  		xedAddr = C.XED_ADDRESS_WIDTH_16b
    58  	default:
    59  		panic("bad mode")
    60  	}
    61  	var errorStr *C.char
    62  	res := C.xedDecode(C.int(xedMode), C.int(xedAddr), unsafe.Pointer(&text[0]), C.int(len(text)), &errorStr)
    63  	if res == 0 {
    64  		return 0, errors.New(C.GoString(errorStr))
    65  	}
    66  	return int(res), nil
    67  }