e_padlock.c: last x86_64 commit didn't work with some optimizers.
This commit is contained in:
parent
760d2551fb
commit
67d8487bb8
@ -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, \
|
|||||||
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; \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user