2015-06-12 19:49:23 +00:00
|
|
|
package proc
|
2015-04-29 17:07:27 +00:00
|
|
|
|
2015-06-11 20:17:56 +00:00
|
|
|
import "runtime"
|
|
|
|
|
2015-04-29 17:07:27 +00:00
|
|
|
type Arch interface {
|
2015-07-28 05:33:07 +00:00
|
|
|
SetGStructOffset(ver GoVersion, iscgo bool)
|
2015-04-29 17:07:27 +00:00
|
|
|
PtrSize() int
|
|
|
|
BreakpointInstruction() []byte
|
|
|
|
BreakpointSize() int
|
2015-07-28 05:33:07 +00:00
|
|
|
GStructOffset() uint64
|
2015-06-17 18:09:55 +00:00
|
|
|
HardwareBreakpointUsage() []bool
|
|
|
|
SetHardwareBreakpointUsage(int, bool)
|
2015-04-29 17:07:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type AMD64 struct {
|
2015-06-17 18:09:55 +00:00
|
|
|
ptrSize int
|
|
|
|
breakInstruction []byte
|
|
|
|
breakInstructionLen int
|
2015-07-28 05:33:07 +00:00
|
|
|
gStructOffset uint64
|
2015-06-17 18:09:55 +00:00
|
|
|
hardwareBreakpointUsage []bool
|
2015-04-29 17:07:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func AMD64Arch() *AMD64 {
|
2015-07-23 17:08:28 +00:00
|
|
|
var breakInstr = []byte{0xCC}
|
|
|
|
|
|
|
|
return &AMD64{
|
|
|
|
ptrSize: 8,
|
|
|
|
breakInstruction: breakInstr,
|
|
|
|
breakInstructionLen: len(breakInstr),
|
|
|
|
hardwareBreakpointUsage: make([]bool, 4),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-28 05:33:07 +00:00
|
|
|
func (a *AMD64) SetGStructOffset(ver GoVersion, isextld bool) {
|
2015-06-11 20:17:56 +00:00
|
|
|
switch runtime.GOOS {
|
|
|
|
case "darwin":
|
2015-07-28 05:33:07 +00:00
|
|
|
a.gStructOffset = 0x8a0
|
2015-06-11 20:17:56 +00:00
|
|
|
case "linux":
|
2015-07-28 05:33:07 +00:00
|
|
|
a.gStructOffset = 0xfffffffffffffff0
|
2015-06-11 20:17:56 +00:00
|
|
|
}
|
|
|
|
|
2015-07-28 20:42:56 +00:00
|
|
|
if isextld || ver.AfterOrEqual(GoVersion{1, 5, -1, 2}) || ver.IsDevel() {
|
2015-07-28 05:33:07 +00:00
|
|
|
a.gStructOffset += 8
|
|
|
|
}
|
2015-04-29 17:07:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (a *AMD64) PtrSize() int {
|
|
|
|
return a.ptrSize
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *AMD64) BreakpointInstruction() []byte {
|
|
|
|
return a.breakInstruction
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *AMD64) BreakpointSize() int {
|
|
|
|
return a.breakInstructionLen
|
|
|
|
}
|
2015-06-11 20:17:56 +00:00
|
|
|
|
2015-07-28 05:33:07 +00:00
|
|
|
func (a *AMD64) GStructOffset() uint64 {
|
|
|
|
return a.gStructOffset
|
2015-06-11 20:17:56 +00:00
|
|
|
}
|
2015-06-12 19:30:59 +00:00
|
|
|
|
2015-06-17 18:09:55 +00:00
|
|
|
func (a *AMD64) HardwareBreakpointUsage() []bool {
|
|
|
|
return a.hardwareBreakpointUsage
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *AMD64) SetHardwareBreakpointUsage(reg int, set bool) {
|
|
|
|
a.hardwareBreakpointUsage[reg] = set
|
2015-06-12 19:30:59 +00:00
|
|
|
}
|