github.com/undoio/delve@v1.9.0/pkg/proc/amd64util/xsave_amd64.go (about)

     1  package amd64util
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  var xstateMaxSize int
     8  var loadXstateMaxSizeOnce sync.Once
     9  
    10  func cpuid(axIn, cxIn uint32) (axOut, bxOut, cxOut, dxOut uint32)
    11  
    12  func AMD64XstateMaxSize() int {
    13  	loadXstateMaxSizeOnce.Do(func() {
    14  		// See Intel 64 and IA-32 Architecture Software Developer's Manual, Vol. 1
    15  		// chapter 13.2 and Vol. 2A CPUID instruction for a description of all the
    16  		// magic constants.
    17  
    18  		_, _, cx, _ := cpuid(0x01, 0x00)
    19  
    20  		if cx&(1<<26) == 0 { // Vol. 2A, Table 3-10, XSAVE enabled bit check
    21  			// XSAVE not supported by this processor
    22  			xstateMaxSize = _XSTATE_MAX_KNOWN_SIZE
    23  			return
    24  		}
    25  
    26  		_, _, cx, _ = cpuid(0x0d, 0x00) // processor extended state enumeration main leaf
    27  		xstateMaxSize = int(cx)
    28  	})
    29  	return xstateMaxSize
    30  }