mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86: Clean up some files of inline asm, and fix
__copy_{to,from}_user_ll() for gcc 3.4 (asm output constraints all
need to be '=&').
Based on a patch by Jan Beulich.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
This commit is contained in:
1 parent
22e2d08efb
commit
503ddff720
2 files changed
+107
-83
No files matched your search
+13
-3
@@ -13,7 +13,7 @@ void *memcpy(void *dest, const void *src, size_t n)
|
||||
{
|
||||
long d0, d1, d2;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
asm volatile (
|
||||
#ifdef __i386__
|
||||
" rep movsl ; "
|
||||
#else
|
||||
@@ -42,7 +42,7 @@ void *memset(void *s, int c, size_t n)
|
||||
{
|
||||
long d0, d1;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
asm volatile (
|
||||
"rep stosb"
|
||||
: "=&c" (d0), "=&D" (d1)
|
||||
: "a" (c), "1" (s), "0" (n)
|
||||
@@ -59,7 +59,7 @@ void *memmove(void *dest, const void *src, size_t n)
|
||||
if ( dest < src )
|
||||
return memcpy(dest, src, n);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
asm volatile (
|
||||
" std ; "
|
||||
" rep movsb ; "
|
||||
" cld "
|
||||
@@ -69,3 +69,13 @@ void *memmove(void *dest, const void *src, size_t n)
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-set-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
+94
-80
@@ -12,83 +12,87 @@
|
||||
|
||||
unsigned long __copy_to_user_ll(void __user *to, const void *from, unsigned n)
|
||||
{
|
||||
unsigned long __d0, __d1, __d2, __n = n;
|
||||
__asm__ __volatile__(
|
||||
" cmp $"STR(2*BYTES_PER_LONG-1)",%0\n"
|
||||
" jbe 1f\n"
|
||||
" mov %1,%0\n"
|
||||
" neg %0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%0\n"
|
||||
" sub %0,%3\n"
|
||||
"4: rep; movsb\n" /* make 'to' address aligned */
|
||||
" mov %3,%0\n"
|
||||
" shr $"STR(LONG_BYTEORDER)",%0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%3\n"
|
||||
" .align 2,0x90\n"
|
||||
"0: rep; movs"__OS"\n" /* as many words as possible... */
|
||||
" mov %3,%0\n"
|
||||
"1: rep; movsb\n" /* ...remainder copied as bytes */
|
||||
"2:\n"
|
||||
".section .fixup,\"ax\"\n"
|
||||
"5: add %3,%0\n"
|
||||
" jmp 2b\n"
|
||||
"3: lea 0(%3,%0,"STR(BYTES_PER_LONG)"),%0\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
" "__FIXUP_ALIGN"\n"
|
||||
" "__FIXUP_WORD" 4b,5b\n"
|
||||
" "__FIXUP_WORD" 0b,3b\n"
|
||||
" "__FIXUP_WORD" 1b,2b\n"
|
||||
".previous"
|
||||
: "=&c"(__n), "=&D" (__d0), "=&S" (__d1), "=r"(__d2)
|
||||
: "3"(__n), "0"(__n), "1"(to), "2"(from)
|
||||
: "memory");
|
||||
return (unsigned)__n;
|
||||
unsigned long __d0, __d1, __d2, __n = n;
|
||||
|
||||
asm volatile (
|
||||
" cmp $"STR(2*BYTES_PER_LONG-1)",%0\n"
|
||||
" jbe 1f\n"
|
||||
" mov %1,%0\n"
|
||||
" neg %0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%0\n"
|
||||
" sub %0,%3\n"
|
||||
"4: rep movsb\n" /* make 'to' address aligned */
|
||||
" mov %3,%0\n"
|
||||
" shr $"STR(LONG_BYTEORDER)",%0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%3\n"
|
||||
" .align 2,0x90\n"
|
||||
"0: rep movs"__OS"\n" /* as many words as possible... */
|
||||
" mov %3,%0\n"
|
||||
"1: rep movsb\n" /* ...remainder copied as bytes */
|
||||
"2:\n"
|
||||
".section .fixup,\"ax\"\n"
|
||||
"5: add %3,%0\n"
|
||||
" jmp 2b\n"
|
||||
"3: lea 0(%3,%0,"STR(BYTES_PER_LONG)"),%0\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
" "__FIXUP_ALIGN"\n"
|
||||
" "__FIXUP_WORD" 4b,5b\n"
|
||||
" "__FIXUP_WORD" 0b,3b\n"
|
||||
" "__FIXUP_WORD" 1b,2b\n"
|
||||
".previous"
|
||||
: "=&c" (__n), "=&D" (__d0), "=&S" (__d1), "=&r" (__d2)
|
||||
: "0" (__n), "1" (to), "2" (from), "3" (__n)
|
||||
: "memory" );
|
||||
|
||||
return __n;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
__copy_from_user_ll(void *to, const void __user *from, unsigned n)
|
||||
{
|
||||
unsigned long __d0, __d1, __d2, __n = n;
|
||||
__asm__ __volatile__(
|
||||
" cmp $"STR(2*BYTES_PER_LONG-1)",%0\n"
|
||||
" jbe 1f\n"
|
||||
" mov %1,%0\n"
|
||||
" neg %0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%0\n"
|
||||
" sub %0,%3\n"
|
||||
"4: rep; movsb\n" /* make 'to' address aligned */
|
||||
" mov %3,%0\n"
|
||||
" shr $"STR(LONG_BYTEORDER)",%0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%3\n"
|
||||
" .align 2,0x90\n"
|
||||
"0: rep; movs"__OS"\n" /* as many words as possible... */
|
||||
" mov %3,%0\n"
|
||||
"1: rep; movsb\n" /* ...remainder copied as bytes */
|
||||
"2:\n"
|
||||
".section .fixup,\"ax\"\n"
|
||||
"5: add %3,%0\n"
|
||||
" jmp 6f\n"
|
||||
"3: lea 0(%3,%0,"STR(BYTES_PER_LONG)"),%0\n"
|
||||
"6: push %0\n"
|
||||
" push %%"__OP"ax\n"
|
||||
" xor %%eax,%%eax\n"
|
||||
" rep; stosb\n"
|
||||
" pop %%"__OP"ax\n"
|
||||
" pop %0\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
" "__FIXUP_ALIGN"\n"
|
||||
" "__FIXUP_WORD" 4b,5b\n"
|
||||
" "__FIXUP_WORD" 0b,3b\n"
|
||||
" "__FIXUP_WORD" 1b,6b\n"
|
||||
".previous"
|
||||
: "=&c"(__n), "=&D" (__d0), "=&S" (__d1), "=r"(__d2)
|
||||
: "3"(__n), "0"(__n), "1"(to), "2"(from)
|
||||
: "memory");
|
||||
return (unsigned)__n;
|
||||
unsigned long __d0, __d1, __d2, __n = n;
|
||||
|
||||
asm volatile (
|
||||
" cmp $"STR(2*BYTES_PER_LONG-1)",%0\n"
|
||||
" jbe 1f\n"
|
||||
" mov %1,%0\n"
|
||||
" neg %0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%0\n"
|
||||
" sub %0,%3\n"
|
||||
"4: rep; movsb\n" /* make 'to' address aligned */
|
||||
" mov %3,%0\n"
|
||||
" shr $"STR(LONG_BYTEORDER)",%0\n"
|
||||
" and $"STR(BYTES_PER_LONG-1)",%3\n"
|
||||
" .align 2,0x90\n"
|
||||
"0: rep; movs"__OS"\n" /* as many words as possible... */
|
||||
" mov %3,%0\n"
|
||||
"1: rep; movsb\n" /* ...remainder copied as bytes */
|
||||
"2:\n"
|
||||
".section .fixup,\"ax\"\n"
|
||||
"5: add %3,%0\n"
|
||||
" jmp 6f\n"
|
||||
"3: lea 0(%3,%0,"STR(BYTES_PER_LONG)"),%0\n"
|
||||
"6: push %0\n"
|
||||
" push %%"__OP"ax\n"
|
||||
" xor %%eax,%%eax\n"
|
||||
" rep; stosb\n"
|
||||
" pop %%"__OP"ax\n"
|
||||
" pop %0\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
" "__FIXUP_ALIGN"\n"
|
||||
" "__FIXUP_WORD" 4b,5b\n"
|
||||
" "__FIXUP_WORD" 0b,3b\n"
|
||||
" "__FIXUP_WORD" 1b,6b\n"
|
||||
".previous"
|
||||
: "=&c" (__n), "=&D" (__d0), "=&S" (__d1), "=&r" (__d2)
|
||||
: "0" (__n), "1" (to), "2" (from), "3" (__n)
|
||||
: "memory" );
|
||||
|
||||
return __n;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -107,9 +111,9 @@ __copy_from_user_ll(void *to, const void __user *from, unsigned n)
|
||||
unsigned long
|
||||
copy_to_user(void __user *to, const void *from, unsigned n)
|
||||
{
|
||||
if (access_ok(to, n))
|
||||
n = __copy_to_user(to, from, n);
|
||||
return n;
|
||||
if ( access_ok(to, n) )
|
||||
n = __copy_to_user(to, from, n);
|
||||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -131,9 +135,19 @@ copy_to_user(void __user *to, const void *from, unsigned n)
|
||||
unsigned long
|
||||
copy_from_user(void *to, const void __user *from, unsigned n)
|
||||
{
|
||||
if (access_ok(from, n))
|
||||
n = __copy_from_user(to, from, n);
|
||||
else
|
||||
memset(to, 0, n);
|
||||
return n;
|
||||
if ( access_ok(from, n) )
|
||||
n = __copy_from_user(to, from, n);
|
||||
else
|
||||
memset(to, 0, n);
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-set-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||