mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
This commit is contained in:
		
							parent
							
								
									094ab1db7c
								
							
						
					
					
						commit
						a5c2a893db
					
				
					 4 changed files with 1 additions and 106 deletions
				
			
		| 
						 | 
				
			
			@ -325,9 +325,6 @@ config X86_INVD_BUG
 | 
			
		|||
	def_bool y
 | 
			
		||||
	depends on M486
 | 
			
		||||
 | 
			
		||||
config X86_WP_WORKS_OK
 | 
			
		||||
	def_bool y
 | 
			
		||||
 | 
			
		||||
config X86_POPAD_OK
 | 
			
		||||
	def_bool y
 | 
			
		||||
	depends on X86_32
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -237,8 +237,6 @@ extern void __put_user_2(void);
 | 
			
		|||
extern void __put_user_4(void);
 | 
			
		||||
extern void __put_user_8(void);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_WP_WORKS_OK
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * put_user: - Write a simple value into user space.
 | 
			
		||||
 * @x:   Value to copy to user space.
 | 
			
		||||
| 
						 | 
				
			
			@ -326,29 +324,6 @@ do {									\
 | 
			
		|||
	}								\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define __put_user_size(x, ptr, size, retval, errret)			\
 | 
			
		||||
do {									\
 | 
			
		||||
	__typeof__(*(ptr))__pus_tmp = x;				\
 | 
			
		||||
	retval = 0;							\
 | 
			
		||||
									\
 | 
			
		||||
	if (unlikely(__copy_to_user_ll(ptr, &__pus_tmp, size) != 0))	\
 | 
			
		||||
		retval = errret;					\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define put_user(x, ptr)					\
 | 
			
		||||
({								\
 | 
			
		||||
	int __ret_pu;						\
 | 
			
		||||
	__typeof__(*(ptr))__pus_tmp = x;			\
 | 
			
		||||
	__ret_pu = 0;						\
 | 
			
		||||
	if (unlikely(__copy_to_user_ll(ptr, &__pus_tmp,		\
 | 
			
		||||
				       sizeof(*(ptr))) != 0))	\
 | 
			
		||||
		__ret_pu = -EFAULT;				\
 | 
			
		||||
	__ret_pu;						\
 | 
			
		||||
})
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_32
 | 
			
		||||
#define __get_user_asm_u64(x, ptr, retval, errret)	(x) = __get_user_bad()
 | 
			
		||||
#define __get_user_asm_ex_u64(x, ptr)			(x) = __get_user_bad()
 | 
			
		||||
| 
						 | 
				
			
			@ -543,29 +518,12 @@ struct __large_struct { unsigned long buf[100]; };
 | 
			
		|||
	(x) = (__force __typeof__(*(ptr)))__gue_val;			\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_WP_WORKS_OK
 | 
			
		||||
 | 
			
		||||
#define put_user_try		uaccess_try
 | 
			
		||||
#define put_user_catch(err)	uaccess_catch(err)
 | 
			
		||||
 | 
			
		||||
#define put_user_ex(x, ptr)						\
 | 
			
		||||
	__put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
 | 
			
		||||
 | 
			
		||||
#else /* !CONFIG_X86_WP_WORKS_OK */
 | 
			
		||||
 | 
			
		||||
#define put_user_try		do {		\
 | 
			
		||||
	int __uaccess_err = 0;
 | 
			
		||||
 | 
			
		||||
#define put_user_catch(err)			\
 | 
			
		||||
	(err) |= __uaccess_err;			\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define put_user_ex(x, ptr)	do {		\
 | 
			
		||||
	__uaccess_err |= __put_user(x, ptr);	\
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_X86_WP_WORKS_OK */
 | 
			
		||||
 | 
			
		||||
extern unsigned long
 | 
			
		||||
copy_from_user_nmi(void *to, const void __user *from, unsigned long n);
 | 
			
		||||
extern __must_check long
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -570,63 +570,6 @@ do {									\
 | 
			
		|||
unsigned long __copy_to_user_ll(void __user *to, const void *from,
 | 
			
		||||
				unsigned long n)
 | 
			
		||||
{
 | 
			
		||||
#ifndef CONFIG_X86_WP_WORKS_OK
 | 
			
		||||
	if (unlikely(boot_cpu_data.wp_works_ok == 0) &&
 | 
			
		||||
			((unsigned long)to) < TASK_SIZE) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * When we are in an atomic section (see
 | 
			
		||||
		 * mm/filemap.c:file_read_actor), return the full
 | 
			
		||||
		 * length to take the slow path.
 | 
			
		||||
		 */
 | 
			
		||||
		if (in_atomic())
 | 
			
		||||
			return n;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * CPU does not honor the WP bit when writing
 | 
			
		||||
		 * from supervisory mode, and due to preemption or SMP,
 | 
			
		||||
		 * the page tables can change at any time.
 | 
			
		||||
		 * Do it manually.	Manfred <manfred@colorfullife.com>
 | 
			
		||||
		 */
 | 
			
		||||
		while (n) {
 | 
			
		||||
			unsigned long offset = ((unsigned long)to)%PAGE_SIZE;
 | 
			
		||||
			unsigned long len = PAGE_SIZE - offset;
 | 
			
		||||
			int retval;
 | 
			
		||||
			struct page *pg;
 | 
			
		||||
			void *maddr;
 | 
			
		||||
 | 
			
		||||
			if (len > n)
 | 
			
		||||
				len = n;
 | 
			
		||||
 | 
			
		||||
survive:
 | 
			
		||||
			down_read(¤t->mm->mmap_sem);
 | 
			
		||||
			retval = get_user_pages(current, current->mm,
 | 
			
		||||
					(unsigned long)to, 1, 1, 0, &pg, NULL);
 | 
			
		||||
 | 
			
		||||
			if (retval == -ENOMEM && is_global_init(current)) {
 | 
			
		||||
				up_read(¤t->mm->mmap_sem);
 | 
			
		||||
				congestion_wait(BLK_RW_ASYNC, HZ/50);
 | 
			
		||||
				goto survive;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (retval != 1) {
 | 
			
		||||
				up_read(¤t->mm->mmap_sem);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			maddr = kmap_atomic(pg);
 | 
			
		||||
			memcpy(maddr + offset, from, len);
 | 
			
		||||
			kunmap_atomic(maddr);
 | 
			
		||||
			set_page_dirty_lock(pg);
 | 
			
		||||
			put_page(pg);
 | 
			
		||||
			up_read(¤t->mm->mmap_sem);
 | 
			
		||||
 | 
			
		||||
			from += len;
 | 
			
		||||
			to += len;
 | 
			
		||||
			n -= len;
 | 
			
		||||
		}
 | 
			
		||||
		return n;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	stac();
 | 
			
		||||
	if (movsl_is_ok(to, from, n))
 | 
			
		||||
		__copy_user(to, from, n);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -715,10 +715,7 @@ static void __init test_wp_bit(void)
 | 
			
		|||
 | 
			
		||||
	if (!boot_cpu_data.wp_works_ok) {
 | 
			
		||||
		printk(KERN_CONT "No.\n");
 | 
			
		||||
#ifdef CONFIG_X86_WP_WORKS_OK
 | 
			
		||||
		panic(
 | 
			
		||||
  "This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
 | 
			
		||||
#endif
 | 
			
		||||
		panic("Linux doesn't support CPUs with broken WP.");
 | 
			
		||||
	} else {
 | 
			
		||||
		printk(KERN_CONT "Ok.\n");
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue