aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2012-11-28 14:50:28 -0500
committerH. Peter Anvin <hpa@linux.intel.com>2012-11-29 16:23:03 -0500
commita5c2a893dbd4956a72fb261e8790d19f67b52c99 (patch)
tree08ec40c9885f90b67fcf9a272ba675ff815d23ff
parent094ab1db7cb7833cd4c820acd868fc26acf3f08e (diff)
x86, 386 removal: Remove CONFIG_X86_WP_WORKS_OK
All 486+ CPUs support WP in supervisor mode, so remove the fallback 386 support code. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Link: http://lkml.kernel.org/r/1354132230-21854-7-git-send-email-hpa@linux.intel.com
-rw-r--r--arch/x86/Kconfig.cpu3
-rw-r--r--arch/x86/include/asm/uaccess.h42
-rw-r--r--arch/x86/lib/usercopy_32.c57
-rw-r--r--arch/x86/mm/init_32.c5
4 files changed, 1 insertions, 106 deletions
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu
index d3bdc18af1f0..159ee9c824c9 100644
--- a/arch/x86/Kconfig.cpu
+++ b/arch/x86/Kconfig.cpu
@@ -325,9 +325,6 @@ config X86_INVD_BUG
325 def_bool y 325 def_bool y
326 depends on M486 326 depends on M486
327 327
328config X86_WP_WORKS_OK
329 def_bool y
330
331config X86_POPAD_OK 328config X86_POPAD_OK
332 def_bool y 329 def_bool y
333 depends on X86_32 330 depends on X86_32
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index 7ccf8d131535..1709801d18ec 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -237,8 +237,6 @@ extern void __put_user_2(void);
237extern void __put_user_4(void); 237extern void __put_user_4(void);
238extern void __put_user_8(void); 238extern void __put_user_8(void);
239 239
240#ifdef CONFIG_X86_WP_WORKS_OK
241
242/** 240/**
243 * put_user: - Write a simple value into user space. 241 * put_user: - Write a simple value into user space.
244 * @x: Value to copy to user space. 242 * @x: Value to copy to user space.
@@ -326,29 +324,6 @@ do { \
326 } \ 324 } \
327} while (0) 325} while (0)
328 326
329#else
330
331#define __put_user_size(x, ptr, size, retval, errret) \
332do { \
333 __typeof__(*(ptr))__pus_tmp = x; \
334 retval = 0; \
335 \
336 if (unlikely(__copy_to_user_ll(ptr, &__pus_tmp, size) != 0)) \
337 retval = errret; \
338} while (0)
339
340#define put_user(x, ptr) \
341({ \
342 int __ret_pu; \
343 __typeof__(*(ptr))__pus_tmp = x; \
344 __ret_pu = 0; \
345 if (unlikely(__copy_to_user_ll(ptr, &__pus_tmp, \
346 sizeof(*(ptr))) != 0)) \
347 __ret_pu = -EFAULT; \
348 __ret_pu; \
349})
350#endif
351
352#ifdef CONFIG_X86_32 327#ifdef CONFIG_X86_32
353#define __get_user_asm_u64(x, ptr, retval, errret) (x) = __get_user_bad() 328#define __get_user_asm_u64(x, ptr, retval, errret) (x) = __get_user_bad()
354#define __get_user_asm_ex_u64(x, ptr) (x) = __get_user_bad() 329#define __get_user_asm_ex_u64(x, ptr) (x) = __get_user_bad()
@@ -543,29 +518,12 @@ struct __large_struct { unsigned long buf[100]; };
543 (x) = (__force __typeof__(*(ptr)))__gue_val; \ 518 (x) = (__force __typeof__(*(ptr)))__gue_val; \
544} while (0) 519} while (0)
545 520
546#ifdef CONFIG_X86_WP_WORKS_OK
547
548#define put_user_try uaccess_try 521#define put_user_try uaccess_try
549#define put_user_catch(err) uaccess_catch(err) 522#define put_user_catch(err) uaccess_catch(err)
550 523
551#define put_user_ex(x, ptr) \ 524#define put_user_ex(x, ptr) \
552 __put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 525 __put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
553 526
554#else /* !CONFIG_X86_WP_WORKS_OK */
555
556#define put_user_try do { \
557 int __uaccess_err = 0;
558
559#define put_user_catch(err) \
560 (err) |= __uaccess_err; \
561} while (0)
562
563#define put_user_ex(x, ptr) do { \
564 __uaccess_err |= __put_user(x, ptr); \
565} while (0)
566
567#endif /* CONFIG_X86_WP_WORKS_OK */
568
569extern unsigned long 527extern unsigned long
570copy_from_user_nmi(void *to, const void __user *from, unsigned long n); 528copy_from_user_nmi(void *to, const void __user *from, unsigned long n);
571extern __must_check long 529extern __must_check long
diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c
index 98f6d6b68f5a..f0312d746402 100644
--- a/arch/x86/lib/usercopy_32.c
+++ b/arch/x86/lib/usercopy_32.c
@@ -570,63 +570,6 @@ do { \
570unsigned long __copy_to_user_ll(void __user *to, const void *from, 570unsigned long __copy_to_user_ll(void __user *to, const void *from,
571 unsigned long n) 571 unsigned long n)
572{ 572{
573#ifndef CONFIG_X86_WP_WORKS_OK
574 if (unlikely(boot_cpu_data.wp_works_ok == 0) &&
575 ((unsigned long)to) < TASK_SIZE) {
576 /*
577 * When we are in an atomic section (see
578 * mm/filemap.c:file_read_actor), return the full
579 * length to take the slow path.
580 */
581 if (in_atomic())
582 return n;
583
584 /*
585 * CPU does not honor the WP bit when writing
586 * from supervisory mode, and due to preemption or SMP,
587 * the page tables can change at any time.
588 * Do it manually. Manfred <manfred@colorfullife.com>
589 */
590 while (n) {
591 unsigned long offset = ((unsigned long)to)%PAGE_SIZE;
592 unsigned long len = PAGE_SIZE - offset;
593 int retval;
594 struct page *pg;
595 void *maddr;
596
597 if (len > n)
598 len = n;
599
600survive:
601 down_read(&current->mm->mmap_sem);
602 retval = get_user_pages(current, current->mm,
603 (unsigned long)to, 1, 1, 0, &pg, NULL);
604
605 if (retval == -ENOMEM && is_global_init(current)) {
606 up_read(&current->mm->mmap_sem);
607 congestion_wait(BLK_RW_ASYNC, HZ/50);
608 goto survive;
609 }
610
611 if (retval != 1) {
612 up_read(&current->mm->mmap_sem);
613 break;
614 }
615
616 maddr = kmap_atomic(pg);
617 memcpy(maddr + offset, from, len);
618 kunmap_atomic(maddr);
619 set_page_dirty_lock(pg);
620 put_page(pg);
621 up_read(&current->mm->mmap_sem);
622
623 from += len;
624 to += len;
625 n -= len;
626 }
627 return n;
628 }
629#endif
630 stac(); 573 stac();
631 if (movsl_is_ok(to, from, n)) 574 if (movsl_is_ok(to, from, n))
632 __copy_user(to, from, n); 575 __copy_user(to, from, n);
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
index 11a58001b4ce..745d66b843c8 100644
--- a/arch/x86/mm/init_32.c
+++ b/arch/x86/mm/init_32.c
@@ -715,10 +715,7 @@ static void __init test_wp_bit(void)
715 715
716 if (!boot_cpu_data.wp_works_ok) { 716 if (!boot_cpu_data.wp_works_ok) {
717 printk(KERN_CONT "No.\n"); 717 printk(KERN_CONT "No.\n");
718#ifdef CONFIG_X86_WP_WORKS_OK 718 panic("Linux doesn't support CPUs with broken WP.");
719 panic(
720 "This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
721#endif
722 } else { 719 } else {
723 printk(KERN_CONT "Ok.\n"); 720 printk(KERN_CONT "Ok.\n");
724 } 721 }