在Virtualbox中,vmovdqa无法工作?

4

我使用支持 AVX 和 AVX2 的晚期 i7 处理器,而据说 VirtualBox 支持 AVX 和 AVX2,既然如此,为什么以下代码会卡顿?

vmovdqa    ymm0, qqword[testmem]

testmem在其他地方已经定义为

align 32
testmem:   rb   128

如果我使用

movdqa    xmm0, dqword[testmem]

它运行良好。

FASM 1.72,Windows 10,i7-7700hq,VirtualBox 5.2.6

编辑: 这是一个UEFI应用程序(显然在64位模式下运行),除非出现上述指令,否则它可以正常工作。

编辑

尝试添加

  mov     rcx, 0
  xgetbv
  or      rax, 0007h
  xsetbv  

代码开头插入该行,但并没有起到帮助作用。

1
请定义您所说的“挂起”。此外,您运行它的上下文是什么? - Jester
在VirtualBox中是否已启用AVX2? - harold
“hang”的意思是程序在那一点运行,然后不显示后续的打印到屏幕上或完成。这是一个UEFI应用程序,除非我尝试使用上述AVX指令,否则它可以正常工作。 - poby
3
不清楚您在UEFI下有什么可用的资源。特别要确保正确启用了AVX,尤其是XCR0寄存器,因为如果_XCR0[2:1]!= 11b或CR4.OSXSAVE [位18]= 0_,它将引发#UD异常。 - Jester
@LưuVĩnhPhúc 这不是操作系统,而是UEFI应用程序,在任何操作系统启动之前运行。SSE已经启用,否则movdqa将无法工作。我尝试启用了AVX(请参见上面的编辑),但仍然无法工作。 - poby
显示剩余2条评论
1个回答

4

好的,找到答案了。我知道这是一个比较深奥的问题,但如果有人需要帮助,以下是启用AVX的方法。

mov rax, cr4
or eax, 0x40000              ; bit 18 for oxsave bit
mov cr4, rax

xor     rcx, rcx
xgetbv
or      rax, 6
xsetbv    

我所遗漏的是设置CR4寄存器的第18位,该位启用了OSXSAVE,在启用AVX之前需要满足该要求。

2
请参见 https://dev59.com/MY3da4cB1Zd3GeqPxkeB 以获取到 wiki.osdev.org 的链接。 - Peter Cordes
1
这是一个相当深奥的问题。对于低级黑客的外部人来说,关于汇编语言的所有问题都有些深奥。然而,这种特定行为在Intel SDM中有记录。基本上,你看到的是一个异常,因为AVX的选择性过程没有被遵循。 - Grigory Rechistov
请使用xor ecx, ecx代替xor rcx, rcx(参见https://dev59.com/9VwX5IYBdhLWcg3wjwFZ)。 - phuclv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接