From c8fd2da47503efbae27e0c0ac9e6e78643d0c2f1 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Fri, 20 Apr 2012 16:57:35 -0700 Subject: [PATCH] --- yaml --- r: 305457 b: refs/heads/master c: 535c0c34698061544f81a51c65fc51f4eeeebff6 h: refs/heads/master i: 305455: 63ab68eecc4caa37a77b1ea478dbe085a374b1af v: v3 --- [refs] | 2 +- trunk/arch/x86/include/asm/asm.h | 28 ++++++++++++++++++++-------- trunk/arch/x86/include/asm/uaccess.h | 8 ++++---- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index c11004ca21cc..2817154bcfb0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a3e859fed1244b72253718e076a724ffe13a9584 +refs/heads/master: 535c0c34698061544f81a51c65fc51f4eeeebff6 diff --git a/trunk/arch/x86/include/asm/asm.h b/trunk/arch/x86/include/asm/asm.h index 53dce41f2517..0f15e8a4f565 100644 --- a/trunk/arch/x86/include/asm/asm.h +++ b/trunk/arch/x86/include/asm/asm.h @@ -40,16 +40,28 @@ /* Exception table entry */ #ifdef __ASSEMBLY__ -# define _ASM_EXTABLE(from,to) \ - .pushsection "__ex_table","a" ; \ - _ASM_ALIGN ; \ - _ASM_PTR from , to ; \ +# define _ASM_EXTABLE(from,to) \ + .pushsection "__ex_table","a" ; \ + _ASM_ALIGN ; \ + _ASM_PTR from , to ; \ + .popsection + +# define _ASM_EXTABLE_EX(from,to) \ + .pushsection "__ex_table","a" ; \ + _ASM_ALIGN ; \ + _ASM_PTR from , (to) - (from) ; \ .popsection #else -# define _ASM_EXTABLE(from,to) \ - " .pushsection \"__ex_table\",\"a\"\n" \ - _ASM_ALIGN "\n" \ - _ASM_PTR #from "," #to "\n" \ +# define _ASM_EXTABLE(from,to) \ + " .pushsection \"__ex_table\",\"a\"\n" \ + _ASM_ALIGN "\n" \ + _ASM_PTR #from "," #to "\n" \ + " .popsection\n" + +# define _ASM_EXTABLE_EX(from,to) \ + " .pushsection \"__ex_table\",\"a\"\n" \ + _ASM_ALIGN "\n" \ + _ASM_PTR #from ",(" #to ")-(" #from ")\n" \ " .popsection\n" #endif diff --git a/trunk/arch/x86/include/asm/uaccess.h b/trunk/arch/x86/include/asm/uaccess.h index e0544597cfe7..4ee59dd66f5d 100644 --- a/trunk/arch/x86/include/asm/uaccess.h +++ b/trunk/arch/x86/include/asm/uaccess.h @@ -202,8 +202,8 @@ extern int __get_user_bad(void); asm volatile("1: movl %%eax,0(%1)\n" \ "2: movl %%edx,4(%1)\n" \ "3:\n" \ - _ASM_EXTABLE(1b, 2b - 1b) \ - _ASM_EXTABLE(2b, 3b - 2b) \ + _ASM_EXTABLE_EX(1b, 2b) \ + _ASM_EXTABLE_EX(2b, 3b) \ : : "A" (x), "r" (addr)) #define __put_user_x8(x, ptr, __ret_pu) \ @@ -408,7 +408,7 @@ do { \ #define __get_user_asm_ex(x, addr, itype, rtype, ltype) \ asm volatile("1: mov"itype" %1,%"rtype"0\n" \ "2:\n" \ - _ASM_EXTABLE(1b, 2b - 1b) \ + _ASM_EXTABLE_EX(1b, 2b) \ : ltype(x) : "m" (__m(addr))) #define __put_user_nocheck(x, ptr, size) \ @@ -450,7 +450,7 @@ struct __large_struct { unsigned long buf[100]; }; #define __put_user_asm_ex(x, addr, itype, rtype, ltype) \ asm volatile("1: mov"itype" %"rtype"0,%1\n" \ "2:\n" \ - _ASM_EXTABLE(1b, 2b - 1b) \ + _ASM_EXTABLE_EX(1b, 2b) \ : : ltype(x), "m" (__m(addr))) /*