github.com/cnboonhan/delve@v0.0.0-20230908061759-363f2388c2fb/pkg/dwarf/regnum/i386.go (about)

     1  package regnum
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  // The mapping between hardware registers and DWARF registers is specified
     9  // in the System V ABI Intel386 Architecture Processor Supplement page 25,
    10  // table 2.14
    11  // https://www.uclibc.org/docs/psABI-i386.pdf
    12  
    13  const (
    14  	I386_Eax    = 0
    15  	I386_Ecx    = 1
    16  	I386_Edx    = 2
    17  	I386_Ebx    = 3
    18  	I386_Esp    = 4
    19  	I386_Ebp    = 5
    20  	I386_Esi    = 6
    21  	I386_Edi    = 7
    22  	I386_Eip    = 8
    23  	I386_Eflags = 9
    24  	I386_ST0    = 11 // ST(1) through ST(7) follow
    25  	I386_XMM0   = 21 // XMM1 through XMM7 follow
    26  	I386_Es     = 40
    27  	I386_Cs     = 41
    28  	I386_Ss     = 42
    29  	I386_Ds     = 43
    30  	I386_Fs     = 44
    31  	I386_Gs     = 45
    32  )
    33  
    34  var i386DwarfToName = map[int]string{
    35  	I386_Eax:      "Eax",
    36  	I386_Ecx:      "Ecx",
    37  	I386_Edx:      "Edx",
    38  	I386_Ebx:      "Ebx",
    39  	I386_Esp:      "Esp",
    40  	I386_Ebp:      "Ebp",
    41  	I386_Esi:      "Esi",
    42  	I386_Edi:      "Edi",
    43  	I386_Eip:      "Eip",
    44  	I386_Eflags:   "Eflags",
    45  	I386_ST0:      "ST(0)",
    46  	I386_ST0 + 1:  "ST(1)",
    47  	I386_ST0 + 2:  "ST(2)",
    48  	I386_ST0 + 3:  "ST(3)",
    49  	I386_ST0 + 4:  "ST(4)",
    50  	I386_ST0 + 5:  "ST(5)",
    51  	I386_ST0 + 6:  "ST(6)",
    52  	I386_ST0 + 7:  "ST(7)",
    53  	I386_XMM0:     "XMM0",
    54  	I386_XMM0 + 1: "XMM1",
    55  	I386_XMM0 + 2: "XMM2",
    56  	I386_XMM0 + 3: "XMM3",
    57  	I386_XMM0 + 4: "XMM4",
    58  	I386_XMM0 + 5: "XMM5",
    59  	I386_XMM0 + 6: "XMM6",
    60  	I386_XMM0 + 7: "XMM7",
    61  	I386_Es:       "Es",
    62  	I386_Cs:       "Cs",
    63  	I386_Ss:       "Ss",
    64  	I386_Ds:       "Ds",
    65  	I386_Fs:       "Fs",
    66  	I386_Gs:       "Gs",
    67  }
    68  
    69  var I386NameToDwarf = func() map[string]int {
    70  	r := make(map[string]int)
    71  	for regNum, regName := range i386DwarfToName {
    72  		r[strings.ToLower(regName)] = regNum
    73  	}
    74  	r["eflags"] = 9
    75  	r["st0"] = 11
    76  	r["st1"] = 12
    77  	r["st2"] = 13
    78  	r["st3"] = 14
    79  	r["st4"] = 15
    80  	r["st5"] = 16
    81  	r["st6"] = 17
    82  	r["st7"] = 18
    83  	return r
    84  }()
    85  
    86  func I386MaxRegNum() int {
    87  	max := int(I386_Eip)
    88  	for i := range i386DwarfToName {
    89  		if i > max {
    90  			max = i
    91  		}
    92  	}
    93  	return max
    94  }
    95  
    96  func I386ToName(num uint64) string {
    97  	name, ok := i386DwarfToName[int(num)]
    98  	if ok {
    99  		return name
   100  	}
   101  	return fmt.Sprintf("unknown%d", num)
   102  }