fpu_xrstor_checking 做什么?额外的评论?

What fpu_xrstor_checking does? extra commentary?

我正在做我自己的 do_fork() 版本(出于多种目的)。所以,基本上,我是将过程从一个地方复制到另一个地方,可能是复制到另一台机器上。复制代码并将其粘贴到此处会很困难。但是我相信这个解释应该足够好了。

我的代码大部分时间都有效,但在其他时候函数 fpu_xrstor_checking() returns 出错(值 = -1)。任何人都可以解释一下这个功能应该做什么和额外的评论吗?

为方便起见,将函数粘贴在这里:

 45 static inline int fpu_xrstor_checking(struct fpu *fpu)
 46 {
 47         struct xsave_struct *fx = &fpu->state->xsave;
 48         int err;
 49 
 50         asm volatile("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n\t"
 51                      "2:\n"
 52                      ".section .fixup,\"ax\"\n"
 53                      "3:  movl $-1,%[err]\n"
 54                      "    jmp  2b\n"
 55                      ".previous\n"
 56                      _ASM_EXTABLE(1b, 3b)
 57                      : [err] "=r" (err)
 58                      : "D" (fx), "m" (*fx), "a" (-1), "d" (-1), "" (0)
 59                      : "memory");
 60 
 61         return err;
 62 }

谢谢!

内联汇编利用 Linux 内核的一项功能,允许开发人员 "catch" CPU 异常。标签 1 处的指令是 XRSTOR(稍后会详细介绍)。
标签 3 处的代码在 .fixup 部分发出,其中包含用于处理异常的代码。
_ASM_EXTABLE 告诉汇编程序生成一个 table 结构,以通知内核 1 处的指令可能会产生异常,其处理程序位于 3.

处理程序刚刚将 err 设置为 -1。
XRSTOR 指令(用操作码编码可能是因为汇编程序还不支持它?)恢复 CPU 架构状态的以下部分:x87 (FPU) , SSE, AVX.
该指令以 EDX:EAX 作为掩码(称为指令掩码)并且非常复杂,它可以出于很多原因生成#GP,在这里列出它们是没有意义的(一个原因是它的操作数未对齐64byte边界).
当此指令使函数 return -1.

出错时

我建议阅读 Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1 Section 13 for a full description of the topic (general understanding of Section 8-12 are required). You can also read the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2b 指令 XRSTOR 参考,其中包含可能产生异常的完整原因列表。