lin
2025-08-14 dae8bad597b6607a449b32bf76c523423f7720ed
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.
 
// 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
}