Dave Voutila <d...@sisu.io> writes:
> di...@santanas.co.za writes: > >> Hi OpenBSD friends, >> >> Just a report, not sure if it's helpful, but @voutilad requested [1] I >> send the details to the mailing list. >> >> I have seen a few reports online[1][2], about some users not being able to >> boot newer alpine linux versions (and other linux OS' in my >> experience). Specifically I've seen the last version that boots is >> 3.5.3. >> >> My system is openbsd 7.2 on my hardware Lenovo ThinkPad E14 Gen 4 >> laptop. >> >> The issue, when the alpine linux VM boots, it kernel panics. >> >> [ 0.052602] local IPI: >> [ 0.052602] invalid opcode: 0000 [#1] SMP PTI >> [ 0.052602] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.15.79-0-virt >> #1-Alpine >> [ 0.052602] Hardware name: OpenBSD VMM, BIOS 1.14.0p0-OpenBSD-vmm >> 01/01/2011 >> [ 0.052602] RIP: 0010:delay_halt_tpause+0xd/0x20 >> [ 0.052602] Code: 75 fb 48 ff c8 31 c0 31 ff c3 cc cc cc cc 66 66 2e > 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 8d 04 37 31 c9 48 89 c2 48 c1 > ea 20 <66> 0f ae f1 31 c0 31 d2 31 c9 31 f6 31 ff c3 cc cc cc cc 53 48 > c7 > > The key issue here is the invalid opcode error coming from the > instruction starting with 66 0f ae, which is a TPAUSE > instruction. Hence the RIP pointing to "delay_halt_tpause" in the Linux > kernel. > > I don't think I have any newer Intel hardware that supports the "User > Wait" instructions (aka WAITPKG). My Intel research says it premiered in > Tremont, Alder Lake, Sapphire Rapids so I can't test locally, but the > docs from Intel (SDM Vol. 2B 4-719) say: > > Prior to executing the TPAUSE instruction, an operating system may > specify the maximum delay it allows the processor to suspend its > operation. It can do so by writing TSC-quanta value to the > following 32-bit MSR (IA32_UMWAIT_CONTROL at MSR index E1H)... > > We probably should be masking the CPUID value for TPAUSE in the values > vmm(4) communicates via vmm_handle_cpuid. > > The below diff defines the cpuid bit for detecting the WAITPKG feature. It adds the value to vmm's cpuid mask and also updates the i386/amd64 cpu identification info. Can someone with a newer Intel system try this out? diff refs/heads/master refs/heads/vmm-tsleep commit - 515b7b0d87d9ff8cd5eae1449555f3d6e625fa49 commit + 6343cff9c1cfbbf9ba2cb06cfeca507caa06fc8c blob - 001a437045be145322be30288c1f47d63fb07634 blob + 0bd908e273a1c0e6324e1bc9f8c8ca921555c86f --- sys/arch/amd64/amd64/identcpu.c +++ sys/arch/amd64/amd64/identcpu.c @@ -208,6 +208,7 @@ const struct { { SEFF0ECX_AVX512VBMI, "AVX512VBMI" }, { SEFF0ECX_UMIP, "UMIP" }, { SEFF0ECX_PKU, "PKU" }, + { SEFF0ECX_WAITPKG, "WAITPKG" }, }, cpu_seff0_edxfeatures[] = { { SEFF0EDX_AVX512_4FNNIW, "AVX512FNNIW" }, { SEFF0EDX_AVX512_4FMAPS, "AVX512FMAPS" }, blob - cbde6cf9b02fc882a8ed17aa6adb5c43249e0302 blob + b26bd32e2d9ea7386b1f58960dea40b787d6a341 --- sys/arch/amd64/include/specialreg.h +++ sys/arch/amd64/include/specialreg.h @@ -201,6 +201,7 @@ #define SEFF0ECX_AVX512VBMI 0x00000002 /* AVX-512 vector bit inst */ #define SEFF0ECX_UMIP 0x00000004 /* UMIP support */ #define SEFF0ECX_PKU 0x00000008 /* Page prot keys for user mode */ +#define SEFF0ECX_WAITPKG 0x00000010 /* UMONITOR/UMWAIT/TPAUSE insns */ /* SEFF EDX bits */ #define SEFF0EDX_AVX512_4FNNIW 0x00000004 /* AVX-512 neural network insns */ #define SEFF0EDX_AVX512_4FMAPS 0x00000008 /* AVX-512 mult accum single prec */ blob - 6b4802abf4b508495cdbc961bd799d3fa83b9c36 blob + bbe10bd4cfd7e778132eca1d97594e10513ac172 --- sys/arch/amd64/include/vmmvar.h +++ sys/arch/amd64/include/vmmvar.h @@ -672,7 +672,12 @@ struct vm_mprotect_ept_params { SEFF0EBX_AVX512IFMA | SEFF0EBX_AVX512PF | \ SEFF0EBX_AVX512ER | SEFF0EBX_AVX512CD | \ SEFF0EBX_AVX512BW | SEFF0EBX_AVX512VL) -#define VMM_SEFF0ECX_MASK ~(SEFF0ECX_AVX512VBMI) +/* + * Copy from host minus: + * AVX-512 vector bit (SEFF0ECX_AVX512VBMI) + * UMONITOR/UMWAIT/TPAUSE (SEFF0ECX_WAITPKG) + */ +#define VMM_SEFF0ECX_MASK ~(SEFF0ECX_AVX512VBMI | SEFF0ECX_WAITPKG) /* EDX mask contains the bits to include */ #define VMM_SEFF0EDX_MASK (SEFF0EDX_MD_CLEAR) blob - 310208ac4cdb262aaedfa9b78d869fd5911607b2 blob + ccf1164fd658a69dc383e1602ae0ce1f269de4e4 --- sys/arch/i386/i386/machdep.c +++ sys/arch/i386/i386/machdep.c @@ -1038,6 +1038,7 @@ const struct cpu_cpuid_feature cpu_seff0_ecxfeatures[] { SEFF0ECX_UMIP, "UMIP" }, { SEFF0ECX_AVX512VBMI, "AVX512VBMI" }, { SEFF0ECX_PKU, "PKU" }, + { SEFF0ECX_WAITPKG, "WAITPKG" }, }; const struct cpu_cpuid_feature cpu_seff0_edxfeatures[] = { blob - 392b4ff412e2dd3c4c48ed6c9c84aa2358721c6a blob + 7ce77ca3fdc6bd1a51571dd0b5dbf5afc311a138 --- sys/arch/i386/include/specialreg.h +++ sys/arch/i386/include/specialreg.h @@ -190,6 +190,7 @@ #define SEFF0ECX_AVX512VBMI 0x00000002 /* AVX-512 vector bit inst */ #define SEFF0ECX_UMIP 0x00000004 /* UMIP support */ #define SEFF0ECX_PKU 0x00000008 /* Page prot keys for user mode */ +#define SEFF0ECX_WAITPKG 0x00000010 /* UMONITOR/UMWAIT/TPAUSE insns */ /* SEFF EDX bits */ #define SEFF0EDX_AVX512_4FNNIW 0x00000004 /* AVX-512 neural network insns */ #define SEFF0EDX_AVX512_4FMAPS 0x00000008 /* AVX-512 mult accum single prec */