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
参考,其中包含可能产生异常的完整原因列表。
我正在做我自己的 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
参考,其中包含可能产生异常的完整原因列表。