提交 67d8487b 编写于 作者: A Andy Polyakov

e_padlock.c: last x86_64 commit didn't work with some optimizers.

上级 760d2551
...@@ -453,32 +453,33 @@ padlock_available(void) ...@@ -453,32 +453,33 @@ padlock_available(void)
{ {
char vendor_string[16]; char vendor_string[16];
unsigned int eax, edx; unsigned int eax, edx;
size_t scratch;
/* Are we running on the Centaur (VIA) CPU? */ /* Are we running on the Centaur (VIA) CPU? */
eax = 0x00000000; eax = 0x00000000;
vendor_string[12] = 0; vendor_string[12] = 0;
asm volatile ( asm volatile (
"pushq %%rbx\n" "movq %%rbx,%1\n"
"cpuid\n" "cpuid\n"
"movl %%ebx,(%1)\n" "movl %%ebx,(%2)\n"
"movl %%edx,4(%1)\n" "movl %%edx,4(%2)\n"
"movl %%ecx,8(%1)\n" "movl %%ecx,8(%2)\n"
"popq %%rbx" "movq %1,%%rbx"
: "+a"(eax) : "r"(vendor_string) : "rcx", "rdx"); : "+a"(eax), "=&r"(scratch) : "r"(vendor_string) : "rcx", "rdx");
if (strcmp(vendor_string, "CentaurHauls") != 0) if (strcmp(vendor_string, "CentaurHauls") != 0)
return 0; return 0;
/* Check for Centaur Extended Feature Flags presence */ /* Check for Centaur Extended Feature Flags presence */
eax = 0xC0000000; eax = 0xC0000000;
asm volatile ("pushq %%rbx; cpuid; popq %%rbx" asm volatile ("movq %%rbx,%1; cpuid; movq %1,%%rbx"
: "+a"(eax) : : "rcx", "rdx"); : "+a"(eax), "=&r"(scratch) : : "rcx", "rdx");
if (eax < 0xC0000001) if (eax < 0xC0000001)
return 0; return 0;
/* Read the Centaur Extended Feature Flags */ /* Read the Centaur Extended Feature Flags */
eax = 0xC0000001; eax = 0xC0000001;
asm volatile ("pushq %%rbx; cpuid; popq %%rbx" asm volatile ("movq %%rbx,%2; cpuid; movq %2,%%rbx"
: "+a"(eax), "=d"(edx) : : "rcx"); : "+a"(eax), "=d"(edx), "=&r"(scratch) : : "rcx");
/* Fill up some flags */ /* Fill up some flags */
padlock_use_ace = ((edx & (0x3<<6)) == (0x3<<6)); padlock_use_ace = ((edx & (0x3<<6)) == (0x3<<6));
...@@ -534,12 +535,13 @@ static inline void *name(size_t cnt, \ ...@@ -534,12 +535,13 @@ static inline void *name(size_t cnt, \
struct padlock_cipher_data *cdata, \ struct padlock_cipher_data *cdata, \
void *out, const void *inp) \ void *out, const void *inp) \
{ void *iv; \ { void *iv; \
asm volatile ( "pushq %%rbx\n" \ size_t scratch; \
asm volatile ( "movq %%rbx,%4\n" \
" leaq 16(%0),%%rdx\n" \ " leaq 16(%0),%%rdx\n" \
" leaq 32(%0),%%rbx\n" \ " leaq 32(%0),%%rbx\n" \
rep_xcrypt "\n" \ rep_xcrypt "\n" \
" popq %%rbx" \ " movq %%rbx,%4" \
: "=a"(iv), "=c"(cnt), "=D"(out), "=S"(inp) \ : "=a"(iv), "=c"(cnt), "=D"(out), "=S"(inp), "=&r"(scratch) \
: "0"(cdata), "1"(cnt), "2"(out), "3"(inp) \ : "0"(cdata), "1"(cnt), "2"(out), "3"(inp) \
: "rdx", "cc", "memory"); \ : "rdx", "cc", "memory"); \
return iv; \ return iv; \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册