1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package platform // import "github.com/docker/docker/pkg/platform"
- import (
- "fmt"
- "syscall"
- "unsafe"
- "golang.org/x/sys/windows"
- )
- var (
- modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
- procGetSystemInfo = modkernel32.NewProc("GetSystemInfo")
- )
- // see https://learn.microsoft.com/en-gb/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
- type systeminfo struct {
- wProcessorArchitecture uint16
- wReserved uint16
- dwPageSize uint32
- lpMinimumApplicationAddress uintptr
- lpMaximumApplicationAddress uintptr
- dwActiveProcessorMask uintptr
- dwNumberOfProcessors uint32
- dwProcessorType uint32
- dwAllocationGranularity uint32
- wProcessorLevel uint16
- wProcessorRevision uint16
- }
- // Windows processor architectures.
- //
- // see https://github.com/microsoft/go-winio/blob/v0.6.0/wim/wim.go#L48-L65
- // see https://learn.microsoft.com/en-gb/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
- const (
- processorArchitecture64 = 9 // PROCESSOR_ARCHITECTURE_AMD64
- processorArchitectureIA64 = 6 // PROCESSOR_ARCHITECTURE_IA64
- processorArchitecture32 = 0 // PROCESSOR_ARCHITECTURE_INTEL
- processorArchitectureArm = 5 // PROCESSOR_ARCHITECTURE_ARM
- processorArchitectureArm64 = 12 // PROCESSOR_ARCHITECTURE_ARM64
- )
- // runtimeArchitecture gets the name of the current architecture (x86, x86_64, …)
- func runtimeArchitecture() (string, error) {
- // TODO(thaJeztah): rewrite this to use "GetNativeSystemInfo" instead.
- // See: https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsysteminfo
- // See: https://github.com/shirou/gopsutil/blob/v3.23.3/host/host_windows.go#L267-L297
- // > To retrieve accurate information for an application running on WOW64,
- // > call the GetNativeSystemInfo function.
- var sysinfo systeminfo
- _, _, _ = syscall.SyscallN(procGetSystemInfo.Addr(), uintptr(unsafe.Pointer(&sysinfo)))
- switch sysinfo.wProcessorArchitecture {
- case processorArchitecture64, processorArchitectureIA64:
- return "x86_64", nil
- case processorArchitecture32:
- return "i686", nil
- case processorArchitectureArm:
- return "arm", nil
- case processorArchitectureArm64:
- return "arm64", nil
- default:
- return "", fmt.Errorf("unknown processor architecture %+v", sysinfo.wProcessorArchitecture)
- }
- }
- // NumProcs returns the number of processors on the system
- func NumProcs() uint32 {
- var sysinfo systeminfo
- _, _, _ = syscall.SyscallN(procGetSystemInfo.Addr(), uintptr(unsafe.Pointer(&sysinfo)))
- return sysinfo.dwNumberOfProcessors
- }
|