
The offset of state component i can be found via CPUID.(EAX=0DH,ECX=i):EBX. The ZMM_Hi256 is state component 6, so we use CPUID to enumerate the offset instead of hardcoding. For core dumps, we guess the ZMM_Hi256 offset based on xcr0 and the length of xsave region. The logic comes from binutils-gdb. Fixes #3827.
56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
package amd64util
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
var xstateMaxSize int
|
|
var loadXstateMaxSizeOnce sync.Once
|
|
|
|
func cpuid(axIn, cxIn uint32) (axOut, bxOut, cxOut, dxOut uint32)
|
|
|
|
func AMD64XstateMaxSize() int {
|
|
loadXstateMaxSizeOnce.Do(func() {
|
|
// See Intel 64 and IA-32 Architecture Software Developer's Manual, Vol. 1
|
|
// chapter 13.2 and Vol. 2A CPUID instruction for a description of all the
|
|
// magic constants.
|
|
|
|
_, _, cx, _ := cpuid(0x01, 0x00)
|
|
|
|
if cx&(1<<26) == 0 { // Vol. 2A, Table 3-10, XSAVE enabled bit check
|
|
// XSAVE not supported by this processor
|
|
xstateMaxSize = _XSTATE_MAX_KNOWN_SIZE
|
|
return
|
|
}
|
|
|
|
_, _, cx, _ = cpuid(0x0d, 0x00) // processor extended state enumeration main leaf
|
|
xstateMaxSize = int(cx)
|
|
})
|
|
return xstateMaxSize
|
|
}
|
|
|
|
var xstateZMMHi256Offset int
|
|
var loadXstateZMMHi256OffsetOnce sync.Once
|
|
|
|
// AMD64XstateZMMHi256Offset probes ZMM_Hi256 offset of the current CPU. Beware
|
|
// that core dumps may be generated from a different CPU.
|
|
func AMD64XstateZMMHi256Offset() int {
|
|
loadXstateZMMHi256OffsetOnce.Do(func() {
|
|
// See Intel 64 and IA-32 Architecture Software Developer's Manual, Vol. 1
|
|
// chapter 13.2 and Vol. 2A CPUID instruction for a description of all the
|
|
// magic constants.
|
|
|
|
_, _, cx, _ := cpuid(0x01, 0x00)
|
|
|
|
if cx&(1<<26) == 0 { // Vol. 2A, Table 3-10, XSAVE enabled bit check
|
|
// XSAVE not supported by this processor
|
|
xstateZMMHi256Offset = 0
|
|
return
|
|
}
|
|
|
|
_, bx, _, _ := cpuid(0x0d, 0x06) // ZMM_Hi256 is component #6
|
|
xstateZMMHi256Offset = int(bx)
|
|
})
|
|
return xstateZMMHi256Offset
|
|
}
|