1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8	"syscall"
9	"unsafe"
10)
11
12var (
13	modkernel32       = syscall.NewLazyDLL("kernel32.dll")
14	procGetSystemInfo = modkernel32.NewProc("GetSystemInfo")
15)
16
17// see https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
18type systeminfo struct {
19	wProcessorArchitecture      uint16
20	wReserved                   uint16
21	dwPageSize                  uint32
22	lpMinimumApplicationAddress uintptr
23	lpMaximumApplicationAddress uintptr
24	dwActiveProcessorMask       uintptr
25	dwNumberOfProcessors        uint32
26	dwProcessorType             uint32
27	dwAllocationGranularity     uint32
28	wProcessorLevel             uint16
29	wProcessorRevision          uint16
30}
31
32// See https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info
33const (
34	PROCESSOR_ARCHITECTURE_AMD64 = 9
35	PROCESSOR_ARCHITECTURE_INTEL = 0
36	PROCESSOR_ARCHITECTURE_ARM   = 5
37	PROCESSOR_ARCHITECTURE_ARM64 = 12
38	PROCESSOR_ARCHITECTURE_IA64  = 6
39)
40
41var sysinfo systeminfo
42
43func sysinit() {
44	syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0)
45	switch sysinfo.wProcessorArchitecture {
46	case PROCESSOR_ARCHITECTURE_AMD64:
47		gohostarch = "amd64"
48	case PROCESSOR_ARCHITECTURE_INTEL:
49		gohostarch = "386"
50	case PROCESSOR_ARCHITECTURE_ARM:
51		gohostarch = "arm"
52	case PROCESSOR_ARCHITECTURE_ARM64:
53		gohostarch = "arm64"
54	default:
55		fatalf("unknown processor architecture")
56	}
57}
58