__copy_user_zeroing

2.6内核和2.4相比,又加入了一个异常修复地址
#define __copy_user_zeroing(to,from,size)               \
do {                                   \
   int __d0, __d1, __d2;                       \
   __asm__ __volatile__(                       \
       "   cmp $7,%0\n"                   \
       "   jbe 1f\n"                   \
       "   movl %1,%0\n"                   \
       "   negl %0\n"                   \
       "   andl $7,%0\n"                   \
       "   subl %0,%3\n"                   \
       "4:   rep; movsb\n"                   \
       "   movl %3,%0\n"                   \
       "   shrl $2,%0\n"                   \
       "   andl $3,%3\n"                   \
       "   .align 2,0x90\n"               \
       "0:   rep; movsl\n"                   \
       "   movl %3,%0\n"                   \
       "1:   rep; movsb\n"                   \也是字节数
       "2:\n"                           \
       ".section .fixup,\"ax\"\n"               \
       "5:   addl %3,%0\n"                   \
       "   jmp 6f\n"                   \
       "3:   lea 0(%3,%0,4),%0\n"               \计算复制失败后剩余的字节数
       "6:   pushl %0\n"                   \
       "   pushl %%eax\n"                   \
       "   xorl %%eax,%%eax\n"               \将eax清零
       "   rep; stosb\n"                   \  将AL的值复制到esx:edi中
       "   popl %%eax\n"                   \
       "   popl %0\n"                   \
       "   jmp 2b\n"                   \
       ".previous\n"                       \
       ".section __ex_table,\"a\"\n"               \
       "   .align 4\n"                   \
       "   .long 4b,5b\n"                   \
       "   .long 0b,3b\n"                   \
       "   .long 1b,6b\n"                   \
       ".previous"                       \
       : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2)   \
       : "3"(size), "0"(size), "1"(to), "2"(from)       \
       : "memory");                       \
} while (0)




评论

此博客中的热门博文

提交了30次才AC ---【附】POJ 2488解题报告

n个进程共享m个资源得死锁问题证明