public inbox for linux-m68k@lists.linux-m68k.org
 help / color / mirror / Atom feed
From: Michael Schmitz <schmitzmic@gmail.com>
To: geert@linux-m68k.org, linux-m68k@lists.linux-m68k.org
Cc: torvalds@linux-foundation.org, Michael Schmitz <schmitzmic@gmail.com>
Subject: [PATCH RFC] Fixes to Linus' 'remove set_fs patch'
Date: Tue,  6 Jul 2021 11:20:29 +1200	[thread overview]
Message-ID: <1625527229-3224-1-git-send-email-schmitzmic@gmail.com> (raw)

Linus' patch didn't compile out of the box. I'm a little
worried that I had to patch mm/maccess.c, but I didn't
apply Christoph's patches first (plain v5.13). 

This (on top of Linus' patch) compiles and boots for m68k/mmu
(tested on ARAnyM, ramdisk and disk image).

Link: https://lore.kernel.org/r/CAHk-=wgjWebav7K_F7WS7KiwOAYr8KktsZiaV+jYP5LU5RB3Sg@mail.gmail.com
CC: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Michael Schmitz <schmitzmic@gmail.com>
---
 arch/m68k/include/asm/thread_info.h |  2 +-
 arch/m68k/include/asm/tlbflush.h    |  4 ++--
 arch/m68k/include/asm/uaccess.h     |  3 ---
 arch/m68k/kernel/process.c          |  2 +-
 arch/m68k/kernel/traps.c            |  4 ++--
 arch/m68k/mm/cache.c                | 10 +++++-----
 arch/m68k/mm/motorola.c             |  2 +-
 include/linux/uaccess.h             |  3 ---
 mm/maccess.c                        | 15 ++++++---------
 9 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/arch/m68k/include/asm/thread_info.h b/arch/m68k/include/asm/thread_info.h
index d813fed..4753d52 100644
--- a/arch/m68k/include/asm/thread_info.h
+++ b/arch/m68k/include/asm/thread_info.h
@@ -37,7 +37,7 @@ struct thread_info {
 #define INIT_THREAD_INFO(tsk)			\
 {						\
 	.task		= &tsk,			\
-	.addr_limit	= KERNEL_DS,		\
+	.addr_limit	= MAKE_MM_SEG(SUPER_DATA),	\
 	.preempt_count	= INIT_PREEMPT_COUNT,	\
 }
 
diff --git a/arch/m68k/include/asm/tlbflush.h b/arch/m68k/include/asm/tlbflush.h
index 47d4c3b..c6a85d4 100644
--- a/arch/m68k/include/asm/tlbflush.h
+++ b/arch/m68k/include/asm/tlbflush.h
@@ -14,12 +14,12 @@ static inline void flush_tlb_kernel_page(void *addr)
 		mmu_write(MMUOR, MMUOR_CNL);
 	} else if (CPU_IS_040_OR_060) {
 		preempt_disable();
-		set_segment(SUPER_DATA);
+		set_segment(MAKE_MM_SEG(SUPER_DATA));
 		__asm__ __volatile__(".chip 68040\n\t"
 				     "pflush (%0)\n\t"
 				     ".chip 68k"
 				     : : "a" (addr));
-		set_segment(USER_DATA);
+		set_segment(MAKE_MM_SEG(USER_DATA));
 		preempt_enable();
 	} else if (CPU_IS_020_OR_030)
 		__asm__ __volatile__("pflush #4,#4,(%0)" : : "a" (addr));
diff --git a/arch/m68k/include/asm/uaccess.h b/arch/m68k/include/asm/uaccess.h
index f98208c..95f661e 100644
--- a/arch/m68k/include/asm/uaccess.h
+++ b/arch/m68k/include/asm/uaccess.h
@@ -380,9 +380,6 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n)
 #define INLINE_COPY_FROM_USER
 #define INLINE_COPY_TO_USER
 
-#define user_addr_max() \
-	(uaccess_kernel() ? ~0UL : TASK_SIZE)
-
 extern long strncpy_from_user(char *dst, const char __user *src, long count);
 extern __must_check long strnlen_user(const char __user *str, long n);
 
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
index 8298574..f1c3e68 100644
--- a/arch/m68k/kernel/process.c
+++ b/arch/m68k/kernel/process.c
@@ -155,7 +155,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
 	 * Must save the current SFC/DFC value, NOT the value when
 	 * the parent was last descheduled - RGH  10-08-96
 	 */
-	p->thread.fs = USER_DATA.seg;
+	p->thread.fs = USER_DATA;
 
 	if (unlikely(p->flags & (PF_KTHREAD | PF_IO_WORKER))) {
 		/* kernel thread */
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
index 8586318..f74205a 100644
--- a/arch/m68k/kernel/traps.c
+++ b/arch/m68k/kernel/traps.c
@@ -192,7 +192,7 @@ static inline unsigned long probe040(int iswrite, unsigned long addr, int wbs)
 
 	asm volatile (".chip 68040; movec %%mmusr,%0; .chip 68k" : "=r" (mmusr));
 
-	set_segment(USER_DATA);
+	set_segment(MAKE_MM_SEG(USER_DATA));
 	preempt_enable();
 
 	return mmusr;
@@ -218,7 +218,7 @@ static inline int do_040writeback1(unsigned short wbs, unsigned long wba,
 		break;
 	}
 
-	set_segment(USER_DATA);
+	set_segment(MAKE_MM_SEG(USER_DATA));
 	preempt_enable();
 
 
diff --git a/arch/m68k/mm/cache.c b/arch/m68k/mm/cache.c
index 80e311aa..cb513f6 100644
--- a/arch/m68k/mm/cache.c
+++ b/arch/m68k/mm/cache.c
@@ -73,7 +73,7 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr, mm_segment_t seg)
 
 /* Push n pages at kernel virtual address and clear the icache */
 /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
-static void do_flush_icache_user_range(unsigned long address, unsigned long endaddr, mm_segment_t seg)
+static void do_flush_icache_range(unsigned long address, unsigned long endaddr, mm_segment_t seg)
 {
 	if (CPU_IS_COLDFIRE) {
 		unsigned long start, end;
@@ -107,15 +107,15 @@ static void do_flush_icache_user_range(unsigned long address, unsigned long enda
 
 void flush_icache_user_range(unsigned long address, unsigned long endaddr)
 {
-	do_flush_icache_range(address, endaddr, USER_DATA);
+	do_flush_icache_range(address, endaddr, MAKE_MM_SEG(USER_DATA));
 }
 
 void flush_icache_range(unsigned long address, unsigned long endaddr)
 {
 	preempt_disable();
-	set_segment(SUPER_DATA);
-	do_flush_icache_range(address, endaddr, SUPER_DATA);
-	set_segment(USER_DATA);
+	set_segment(MAKE_MM_SEG(SUPER_DATA));
+	do_flush_icache_range(address, endaddr, MAKE_MM_SEG(SUPER_DATA));
+	set_segment(MAKE_MM_SEG(USER_DATA));
 	preempt_enable();
 }
 EXPORT_SYMBOL(flush_icache_range);
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index 7af7d5a..b0063f3 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -467,7 +467,7 @@ void __init paging_init(void)
 	/*
 	 * Set up SFC/DFC registers
 	 */
-	set_segment(USER_DATA);
+	set_segment(MAKE_MM_SEG(USER_DATA));
 
 #ifdef DEBUG
 	printk ("before free_area_init\n");
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
index c05e903..ec43aff 100644
--- a/include/linux/uaccess.h
+++ b/include/linux/uaccess.h
@@ -29,9 +29,6 @@ static inline void force_uaccess_end(mm_segment_t oldfs)
 	set_fs(oldfs);
 }
 #else /* CONFIG_SET_FS */
-typedef struct {
-	/* empty dummy */
-} mm_segment_t;
 
 #ifndef TASK_SIZE_MAX
 #define TASK_SIZE_MAX			TASK_SIZE
diff --git a/mm/maccess.c b/mm/maccess.c
index 3bd7040..690e9bb 100644
--- a/mm/maccess.c
+++ b/mm/maccess.c
@@ -105,17 +105,16 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
 long copy_from_kernel_nofault(void *dst, const void *src, size_t size)
 {
 	long ret;
-	mm_segment_t old_fs = get_fs();
 
 	if (!copy_from_kernel_nofault_allowed(src, size))
 		return -ERANGE;
 
-	set_fs(KERNEL_DS);
+	set_segment(MAKE_MM_SEG(SUPER_DATA));
 	pagefault_disable();
 	ret = __copy_from_user_inatomic(dst, (__force const void __user *)src,
 			size);
 	pagefault_enable();
-	set_fs(old_fs);
+	set_segment(MAKE_MM_SEG(USER_DATA));
 
 	if (ret)
 		return -EFAULT;
@@ -135,13 +134,12 @@ EXPORT_SYMBOL_GPL(copy_from_kernel_nofault);
 long copy_to_kernel_nofault(void *dst, const void *src, size_t size)
 {
 	long ret;
-	mm_segment_t old_fs = get_fs();
 
-	set_fs(KERNEL_DS);
+	set_segment(MAKE_MM_SEG(SUPER_DATA));
 	pagefault_disable();
 	ret = __copy_to_user_inatomic((__force void __user *)dst, src, size);
 	pagefault_enable();
-	set_fs(old_fs);
+	set_segment(MAKE_MM_SEG(USER_DATA));
 
 	if (ret)
 		return -EFAULT;
@@ -169,7 +167,6 @@ long copy_to_kernel_nofault(void *dst, const void *src, size_t size)
  */
 long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
 {
-	mm_segment_t old_fs = get_fs();
 	const void *src = unsafe_addr;
 	long ret;
 
@@ -178,7 +175,7 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
 	if (!copy_from_kernel_nofault_allowed(unsafe_addr, count))
 		return -ERANGE;
 
-	set_fs(KERNEL_DS);
+	set_segment(MAKE_MM_SEG(SUPER_DATA));
 	pagefault_disable();
 
 	do {
@@ -187,7 +184,7 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
 
 	dst[-1] = '\0';
 	pagefault_enable();
-	set_fs(old_fs);
+	set_segment(MAKE_MM_SEG(USER_DATA));
 
 	return ret ? -EFAULT : src - unsafe_addr;
 }
-- 
2.7.4


             reply	other threads:[~2021-07-05 23:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-05 23:20 Michael Schmitz [this message]
2021-07-06 18:47 ` [PATCH RFC] Fixes to Linus' 'remove set_fs patch' Linus Torvalds
2021-07-06 20:47   ` Michael Schmitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1625527229-3224-1-git-send-email-schmitzmic@gmail.com \
    --to=schmitzmic@gmail.com \
    --cc=geert@linux-m68k.org \
    --cc=linux-m68k@lists.linux-m68k.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox