mirror of https://gitee.com/openkylin/linux.git
powerpc: remove address space overrides using set_fs()
Stop providing the possibility to override the address space using set_fs() now that there is no need for that any more. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
c331652534
commit
5ae4998b5d
|
@ -249,7 +249,6 @@ config PPC
|
||||||
select PCI_SYSCALL if PCI
|
select PCI_SYSCALL if PCI
|
||||||
select PPC_DAWR if PPC64
|
select PPC_DAWR if PPC64
|
||||||
select RTC_LIB
|
select RTC_LIB
|
||||||
select SET_FS
|
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
select SYSCTL_EXCEPTION_TRACE
|
select SYSCTL_EXCEPTION_TRACE
|
||||||
select THREAD_INFO_IN_TASK
|
select THREAD_INFO_IN_TASK
|
||||||
|
|
|
@ -83,10 +83,6 @@ struct task_struct;
|
||||||
void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp);
|
void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp);
|
||||||
void release_thread(struct task_struct *);
|
void release_thread(struct task_struct *);
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned long seg;
|
|
||||||
} mm_segment_t;
|
|
||||||
|
|
||||||
#define TS_FPR(i) fp_state.fpr[i][TS_FPROFFSET]
|
#define TS_FPR(i) fp_state.fpr[i][TS_FPROFFSET]
|
||||||
#define TS_CKFPR(i) ckfp_state.fpr[i][TS_FPROFFSET]
|
#define TS_CKFPR(i) ckfp_state.fpr[i][TS_FPROFFSET]
|
||||||
|
|
||||||
|
@ -148,7 +144,6 @@ struct thread_struct {
|
||||||
unsigned long ksp_vsid;
|
unsigned long ksp_vsid;
|
||||||
#endif
|
#endif
|
||||||
struct pt_regs *regs; /* Pointer to saved register state */
|
struct pt_regs *regs; /* Pointer to saved register state */
|
||||||
mm_segment_t addr_limit; /* for get_fs() validation */
|
|
||||||
#ifdef CONFIG_BOOKE
|
#ifdef CONFIG_BOOKE
|
||||||
/* BookE base exception scratch space; align on cacheline */
|
/* BookE base exception scratch space; align on cacheline */
|
||||||
unsigned long normsave[8] ____cacheline_aligned;
|
unsigned long normsave[8] ____cacheline_aligned;
|
||||||
|
@ -295,7 +290,6 @@ struct thread_struct {
|
||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
.ksp = INIT_SP, \
|
.ksp = INIT_SP, \
|
||||||
.ksp_limit = INIT_SP_LIMIT, \
|
.ksp_limit = INIT_SP_LIMIT, \
|
||||||
.addr_limit = KERNEL_DS, \
|
|
||||||
.pgdir = swapper_pg_dir, \
|
.pgdir = swapper_pg_dir, \
|
||||||
.fpexc_mode = MSR_FE0 | MSR_FE1, \
|
.fpexc_mode = MSR_FE0 | MSR_FE1, \
|
||||||
SPEFSCR_INIT \
|
SPEFSCR_INIT \
|
||||||
|
@ -303,7 +297,6 @@ struct thread_struct {
|
||||||
#else
|
#else
|
||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
.ksp = INIT_SP, \
|
.ksp = INIT_SP, \
|
||||||
.addr_limit = KERNEL_DS, \
|
|
||||||
.fpexc_mode = 0, \
|
.fpexc_mode = 0, \
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -90,7 +90,6 @@ void arch_setup_new_exec(void);
|
||||||
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
|
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
|
||||||
#define TIF_SIGPENDING 1 /* signal pending */
|
#define TIF_SIGPENDING 1 /* signal pending */
|
||||||
#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
|
||||||
#define TIF_FSCHECK 3 /* Check FS is USER_DS on return */
|
|
||||||
#define TIF_SYSCALL_EMU 4 /* syscall emulation active */
|
#define TIF_SYSCALL_EMU 4 /* syscall emulation active */
|
||||||
#define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */
|
#define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */
|
||||||
#define TIF_PATCH_PENDING 6 /* pending live patching update */
|
#define TIF_PATCH_PENDING 6 /* pending live patching update */
|
||||||
|
@ -130,7 +129,6 @@ void arch_setup_new_exec(void);
|
||||||
#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)
|
#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)
|
||||||
#define _TIF_EMULATE_STACK_STORE (1<<TIF_EMULATE_STACK_STORE)
|
#define _TIF_EMULATE_STACK_STORE (1<<TIF_EMULATE_STACK_STORE)
|
||||||
#define _TIF_NOHZ (1<<TIF_NOHZ)
|
#define _TIF_NOHZ (1<<TIF_NOHZ)
|
||||||
#define _TIF_FSCHECK (1<<TIF_FSCHECK)
|
|
||||||
#define _TIF_SYSCALL_EMU (1<<TIF_SYSCALL_EMU)
|
#define _TIF_SYSCALL_EMU (1<<TIF_SYSCALL_EMU)
|
||||||
#define _TIF_SYSCALL_DOTRACE (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
|
#define _TIF_SYSCALL_DOTRACE (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
|
||||||
_TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \
|
_TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \
|
||||||
|
@ -138,8 +136,7 @@ void arch_setup_new_exec(void);
|
||||||
|
|
||||||
#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
|
#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
|
||||||
_TIF_NOTIFY_RESUME | _TIF_UPROBE | \
|
_TIF_NOTIFY_RESUME | _TIF_UPROBE | \
|
||||||
_TIF_RESTORE_TM | _TIF_PATCH_PENDING | \
|
_TIF_RESTORE_TM | _TIF_PATCH_PENDING)
|
||||||
_TIF_FSCHECK)
|
|
||||||
#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR)
|
#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR)
|
||||||
|
|
||||||
/* Bits in local_flags */
|
/* Bits in local_flags */
|
||||||
|
|
|
@ -8,62 +8,21 @@
|
||||||
#include <asm/extable.h>
|
#include <asm/extable.h>
|
||||||
#include <asm/kup.h>
|
#include <asm/kup.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* The fs value determines whether argument validity checking should be
|
|
||||||
* performed or not. If get_fs() == USER_DS, checking is performed, with
|
|
||||||
* get_fs() == KERNEL_DS, checking is bypassed.
|
|
||||||
*
|
|
||||||
* For historical reasons, these macros are grossly misnamed.
|
|
||||||
*
|
|
||||||
* The fs/ds values are now the highest legal address in the "segment".
|
|
||||||
* This simplifies the checking in the routines below.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
|
|
||||||
|
|
||||||
#define KERNEL_DS MAKE_MM_SEG(~0UL)
|
|
||||||
#ifdef __powerpc64__
|
#ifdef __powerpc64__
|
||||||
/* We use TASK_SIZE_USER64 as TASK_SIZE is not constant */
|
/* We use TASK_SIZE_USER64 as TASK_SIZE is not constant */
|
||||||
#define USER_DS MAKE_MM_SEG(TASK_SIZE_USER64 - 1)
|
#define TASK_SIZE_MAX TASK_SIZE_USER64
|
||||||
#else
|
#else
|
||||||
#define USER_DS MAKE_MM_SEG(TASK_SIZE - 1)
|
#define TASK_SIZE_MAX TASK_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define get_fs() (current->thread.addr_limit)
|
static inline bool __access_ok(unsigned long addr, unsigned long size)
|
||||||
|
|
||||||
static inline void set_fs(mm_segment_t fs)
|
|
||||||
{
|
{
|
||||||
current->thread.addr_limit = fs;
|
return addr < TASK_SIZE_MAX && size <= TASK_SIZE_MAX - addr;
|
||||||
/* On user-mode return check addr_limit (fs) is correct */
|
|
||||||
set_thread_flag(TIF_FSCHECK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define uaccess_kernel() (get_fs().seg == KERNEL_DS.seg)
|
|
||||||
#define user_addr_max() (get_fs().seg)
|
|
||||||
|
|
||||||
#ifdef __powerpc64__
|
|
||||||
/*
|
|
||||||
* This check is sufficient because there is a large enough
|
|
||||||
* gap between user addresses and the kernel addresses
|
|
||||||
*/
|
|
||||||
#define __access_ok(addr, size, segment) \
|
|
||||||
(((addr) <= (segment).seg) && ((size) <= (segment).seg))
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static inline int __access_ok(unsigned long addr, unsigned long size,
|
|
||||||
mm_segment_t seg)
|
|
||||||
{
|
|
||||||
if (addr > seg.seg)
|
|
||||||
return 0;
|
|
||||||
return (size == 0 || size - 1 <= seg.seg - addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define access_ok(addr, size) \
|
#define access_ok(addr, size) \
|
||||||
(__chk_user_ptr(addr), \
|
(__chk_user_ptr(addr), \
|
||||||
__access_ok((__force unsigned long)(addr), (size), get_fs()))
|
__access_ok((unsigned long)(addr), (size)))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are the main single-value transfer routines. They automatically
|
* These are the main single-value transfer routines. They automatically
|
||||||
|
|
|
@ -312,9 +312,6 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
|
||||||
{
|
{
|
||||||
user_exit();
|
user_exit();
|
||||||
|
|
||||||
/* Check valid addr_limit, TIF check is done there */
|
|
||||||
addr_limit_user_check();
|
|
||||||
|
|
||||||
if (thread_info_flags & _TIF_UPROBE)
|
if (thread_info_flags & _TIF_UPROBE)
|
||||||
uprobe_notify_resume(regs);
|
uprobe_notify_resume(regs);
|
||||||
|
|
||||||
|
|
|
@ -108,11 +108,11 @@ static nokprobe_inline long address_ok(struct pt_regs *regs,
|
||||||
{
|
{
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
return 1;
|
return 1;
|
||||||
if (__access_ok(ea, nb, USER_DS))
|
if (__access_ok(ea, nb))
|
||||||
return 1;
|
return 1;
|
||||||
if (__access_ok(ea, 1, USER_DS))
|
if (__access_ok(ea, 1))
|
||||||
/* Access overlaps the end of the user region */
|
/* Access overlaps the end of the user region */
|
||||||
regs->dar = USER_DS.seg;
|
regs->dar = TASK_SIZE_MAX - 1;
|
||||||
else
|
else
|
||||||
regs->dar = ea;
|
regs->dar = ea;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue