mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 18:57:18 +08:00 
			
		
		
		
	 24ec1754b2
			
		
	
	24ec1754b2
	
	
	
		
			
			the maximum size of the Xsave area was previously hardcoded but the CPUID instruction can be used to determine its maximum size.
		
			
				
	
	
		
			31 lines
		
	
	
		
			755 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			755 B
		
	
	
	
		
			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
 | |
| }
 |