mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08: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
@ -325,9 +325,6 @@ config X86_INVD_BUG
|
|||||||
def_bool y
|
def_bool y
|
||||||
depends on M486
|
depends on M486
|
||||||
|
|
||||||
config X86_WP_WORKS_OK
|
|
||||||
def_bool y
|
|
||||||
|
|
||||||
config X86_POPAD_OK
|
config X86_POPAD_OK
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on X86_32
|
depends on X86_32
|
||||||
|
@ -237,8 +237,6 @@ extern void __put_user_2(void);
|
|||||||
extern void __put_user_4(void);
|
extern void __put_user_4(void);
|
||||||
extern void __put_user_8(void);
|
extern void __put_user_8(void);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_WP_WORKS_OK
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* put_user: - Write a simple value into user space.
|
* put_user: - Write a simple value into user space.
|
||||||
* @x: Value to copy to user space.
|
* @x: Value to copy to user space.
|
||||||
@ -326,29 +324,6 @@ do { \
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} 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
|
#ifdef CONFIG_X86_32
|
||||||
#define __get_user_asm_u64(x, ptr, retval, errret) (x) = __get_user_bad()
|
#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()
|
#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; \
|
(x) = (__force __typeof__(*(ptr)))__gue_val; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef CONFIG_X86_WP_WORKS_OK
|
|
||||||
|
|
||||||
#define put_user_try uaccess_try
|
#define put_user_try uaccess_try
|
||||||
#define put_user_catch(err) uaccess_catch(err)
|
#define put_user_catch(err) uaccess_catch(err)
|
||||||
|
|
||||||
#define put_user_ex(x, ptr) \
|
#define put_user_ex(x, ptr) \
|
||||||
__put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(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
|
extern unsigned long
|
||||||
copy_from_user_nmi(void *to, const void __user *from, unsigned long n);
|
copy_from_user_nmi(void *to, const void __user *from, unsigned long n);
|
||||||
extern __must_check long
|
extern __must_check long
|
||||||
|
@ -570,63 +570,6 @@ do { \
|
|||||||
unsigned long __copy_to_user_ll(void __user *to, const void *from,
|
unsigned long __copy_to_user_ll(void __user *to, const void *from,
|
||||||
unsigned long n)
|
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();
|
stac();
|
||||||
if (movsl_is_ok(to, from, n))
|
if (movsl_is_ok(to, from, n))
|
||||||
__copy_user(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) {
|
if (!boot_cpu_data.wp_works_ok) {
|
||||||
printk(KERN_CONT "No.\n");
|
printk(KERN_CONT "No.\n");
|
||||||
#ifdef CONFIG_X86_WP_WORKS_OK
|
panic("Linux doesn't support CPUs with broken WP.");
|
||||||
panic(
|
|
||||||
"This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_CONT "Ok.\n");
|
printk(KERN_CONT "Ok.\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user