| 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 |
| } |