lkml.org 
[lkml]   [2020]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/10] x86: move PAGE_OFFSET, TASK_SIZE & friends to page_{32,64}_types.h
    Date
    At least for 64-bit this moves them closer to some of the defines
    they are based on, and it prepares for using the TASK_SIZE_MAX
    definition from assembly.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    ---
    arch/x86/include/asm/page_32_types.h | 11 +++++++
    arch/x86/include/asm/page_64_types.h | 38 +++++++++++++++++++++
    arch/x86/include/asm/processor.h | 49 ----------------------------
    3 files changed, 49 insertions(+), 49 deletions(-)

    diff --git a/arch/x86/include/asm/page_32_types.h b/arch/x86/include/asm/page_32_types.h
    index 565ad755c785e2..26236925fb2c36 100644
    --- a/arch/x86/include/asm/page_32_types.h
    +++ b/arch/x86/include/asm/page_32_types.h
    @@ -41,6 +41,17 @@
    #define __VIRTUAL_MASK_SHIFT 32
    #endif /* CONFIG_X86_PAE */

    +/*
    + * User space process size: 3GB (default).
    + */
    +#define IA32_PAGE_OFFSET PAGE_OFFSET
    +#define TASK_SIZE PAGE_OFFSET
    +#define TASK_SIZE_LOW TASK_SIZE
    +#define TASK_SIZE_MAX TASK_SIZE
    +#define DEFAULT_MAP_WINDOW TASK_SIZE
    +#define STACK_TOP TASK_SIZE
    +#define STACK_TOP_MAX STACK_TOP
    +
    /*
    * Kernel image size is limited to 512 MB (see in arch/x86/kernel/head_32.S)
    */
    diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h
    index 288b065955b729..996595c9897e0a 100644
    --- a/arch/x86/include/asm/page_64_types.h
    +++ b/arch/x86/include/asm/page_64_types.h
    @@ -58,6 +58,44 @@
    #define __VIRTUAL_MASK_SHIFT 47
    #endif

    +/*
    + * User space process size. This is the first address outside the user range.
    + * There are a few constraints that determine this:
    + *
    + * On Intel CPUs, if a SYSCALL instruction is at the highest canonical
    + * address, then that syscall will enter the kernel with a
    + * non-canonical return address, and SYSRET will explode dangerously.
    + * We avoid this particular problem by preventing anything executable
    + * from being mapped at the maximum canonical address.
    + *
    + * On AMD CPUs in the Ryzen family, there's a nasty bug in which the
    + * CPUs malfunction if they execute code from the highest canonical page.
    + * They'll speculate right off the end of the canonical space, and
    + * bad things happen. This is worked around in the same way as the
    + * Intel problem.
    + *
    + * With page table isolation enabled, we map the LDT in ... [stay tuned]
    + */
    +#define TASK_SIZE_MAX ((1UL << __VIRTUAL_MASK_SHIFT) - PAGE_SIZE)
    +
    +#define DEFAULT_MAP_WINDOW ((1UL << 47) - PAGE_SIZE)
    +
    +/* This decides where the kernel will search for a free chunk of vm
    + * space during mmap's.
    + */
    +#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \
    + 0xc0000000 : 0xFFFFe000)
    +
    +#define TASK_SIZE_LOW (test_thread_flag(TIF_ADDR32) ? \
    + IA32_PAGE_OFFSET : DEFAULT_MAP_WINDOW)
    +#define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \
    + IA32_PAGE_OFFSET : TASK_SIZE_MAX)
    +#define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_ADDR32)) ? \
    + IA32_PAGE_OFFSET : TASK_SIZE_MAX)
    +
    +#define STACK_TOP TASK_SIZE_LOW
    +#define STACK_TOP_MAX TASK_SIZE_MAX
    +
    /*
    * Maximum kernel image size is limited to 1 GiB, due to the fixmap living
    * in the next 1 GiB (see level2_kernel_pgt in arch/x86/kernel/head_64.S).
    diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
    index 97143d87994c24..1618eeb08361a9 100644
    --- a/arch/x86/include/asm/processor.h
    +++ b/arch/x86/include/asm/processor.h
    @@ -782,17 +782,6 @@ static inline void spin_lock_prefetch(const void *x)
    })

    #ifdef CONFIG_X86_32
    -/*
    - * User space process size: 3GB (default).
    - */
    -#define IA32_PAGE_OFFSET PAGE_OFFSET
    -#define TASK_SIZE PAGE_OFFSET
    -#define TASK_SIZE_LOW TASK_SIZE
    -#define TASK_SIZE_MAX TASK_SIZE
    -#define DEFAULT_MAP_WINDOW TASK_SIZE
    -#define STACK_TOP TASK_SIZE
    -#define STACK_TOP_MAX STACK_TOP
    -
    #define INIT_THREAD { \
    .sp0 = TOP_OF_INIT_STACK, \
    .sysenter_cs = __KERNEL_CS, \
    @@ -802,44 +791,6 @@ static inline void spin_lock_prefetch(const void *x)
    #define KSTK_ESP(task) (task_pt_regs(task)->sp)

    #else
    -/*
    - * User space process size. This is the first address outside the user range.
    - * There are a few constraints that determine this:
    - *
    - * On Intel CPUs, if a SYSCALL instruction is at the highest canonical
    - * address, then that syscall will enter the kernel with a
    - * non-canonical return address, and SYSRET will explode dangerously.
    - * We avoid this particular problem by preventing anything executable
    - * from being mapped at the maximum canonical address.
    - *
    - * On AMD CPUs in the Ryzen family, there's a nasty bug in which the
    - * CPUs malfunction if they execute code from the highest canonical page.
    - * They'll speculate right off the end of the canonical space, and
    - * bad things happen. This is worked around in the same way as the
    - * Intel problem.
    - *
    - * With page table isolation enabled, we map the LDT in ... [stay tuned]
    - */
    -#define TASK_SIZE_MAX ((1UL << __VIRTUAL_MASK_SHIFT) - PAGE_SIZE)
    -
    -#define DEFAULT_MAP_WINDOW ((1UL << 47) - PAGE_SIZE)
    -
    -/* This decides where the kernel will search for a free chunk of vm
    - * space during mmap's.
    - */
    -#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \
    - 0xc0000000 : 0xFFFFe000)
    -
    -#define TASK_SIZE_LOW (test_thread_flag(TIF_ADDR32) ? \
    - IA32_PAGE_OFFSET : DEFAULT_MAP_WINDOW)
    -#define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \
    - IA32_PAGE_OFFSET : TASK_SIZE_MAX)
    -#define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_ADDR32)) ? \
    - IA32_PAGE_OFFSET : TASK_SIZE_MAX)
    -
    -#define STACK_TOP TASK_SIZE_LOW
    -#define STACK_TOP_MAX TASK_SIZE_MAX
    -
    #define INIT_THREAD { \
    .addr_limit = KERNEL_DS, \
    }
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-08-27 17:09    [W:7.878 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site