我使用https://github.com/01org/isa-l_crypto库中的XTS_AES_256_enc_avx
和XTS_AES_256_dec_avx
函数。
使用yasm
汇编程序对它们进行汇编
yasm -f elf64 -o XTS_AES_256_enc_avx.o XTS_AES_256_enc_avx.asm
yasm -f elf64 -o XTS_AES_256_dec_avx.o XTS_AES_256_dec_avx.asm
一旦这些文件被组装,我将使用
将它们链接到我的模块。mymod-y += mymod.c XTS_AES_256_dec_avx.o XTS_AES_256_enc_avx.o
我有一个头文件,将这些函数声明为外部函数,在c
文件中,我称这些函数。但是在调用时会生成GPF
。
[Tue Sep 18 08:17:02 2018] general protection fault: 0000 [#1] SMP
[Tue Sep 18 08:17:02 2018] Modules linked in: .........[removed for readability]
[Tue Sep 18 08:17:02 2018] CPU: 1 PID: 1886 Comm: bash Tainted: G O 4.7.0+ #1
[Tue Sep 18 08:17:02 2018] Hardware name: Advantech SOM-5991/Default string, BIOS 5.11 12/12/2016
[Tue Sep 18 08:17:02 2018] task: ffff880858c8c240 ti: ffff8807ce230000 task.ti: ffff8807ce230000
[Tue Sep 18 08:17:02 2018] RIP: 0010:[<ffffffffa045f3ea>]
[<ffffffffa045f3ea>] XTS_AES_256_enc_avx+0x2a/0x3980 [mymod]
RIP [<ffffffffa045f3ea>] XTS_AES_256_enc_avx+0x2a/0x3980
当我使用RIP寄存器反汇编gdb中的代码时,我能够看到故障发生在
函数XTS_AES_256_enc_avx
的汇编代码转储:
0x0000000000008f30 <+0>: sub $0x178,%rsp -> 8BYTE aligned
0x0000000000008f37 <+7>: mov %rbx,0x170(%rsp)
0x0000000000008f3f <+15>: mov $0x87,%r10
0x0000000000008f46 <+22>: vmovdqu (%rdx),%xmm1
0x0000000000008f4a <+26>: vpxor %xmm4,%xmm4,%xmm4
0x0000000000008f4e <+30>: vmovdqu (%rdi),%xmm0
0x0000000000008f52 <+34>: vpxor %xmm0,%xmm1,%xmm1
0x0000000000008f56 <+38>: vmovdqu (%rsi),%xmm2
**0x0000000000008f5a <+42>: vmovdqa %xmm2,0x80(%rsp)** -->>crash point.
vmovdqa
需要16B
对齐,否则将产生GPF
。
我可以采取什么方法来解决此GPF
?