diff mbox series

[OpenWrt-Devel] generic: mips: exclude more dsemul code when fpu-emu is not enabled

Message ID 20200327042801.61504-1-yszhou4tech@gmail.com
State Accepted, archived
Delegated to: Yousong Zhou
Headers show
Series [OpenWrt-Devel] generic: mips: exclude more dsemul code when fpu-emu is not enabled | expand

Commit Message

Yousong Zhou March 27, 2020, 4:28 a.m. UTC
The patch is backported from mips-next.  In addition to minor reduction
of code size and runtime memory use, the more apparent difference is
that the delay slot emulation page will not be present for those targets
with fpu emulation disabled (CONFIG_MIPS_FP_SUPPORT=n)

Memory maps of busybox before and after this change

  root@OpenWrt:/# cat /proc/self/maps
  00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
  00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
  00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
  77dc0000-77de2000 r-xp 00000000 00:02 273        /lib/libgcc_s.so.1
  77de2000-77de3000 r-xp 00012000 00:02 273        /lib/libgcc_s.so.1
  77de3000-77de4000 rwxp 00013000 00:02 273        /lib/libgcc_s.so.1
  77de4000-77e7b000 r-xp 00000000 00:02 271        /lib/libc.so
  77e8a000-77e8c000 rwxp 00096000 00:02 271        /lib/libc.so
  77e8c000-77e8e000 rwxp 00000000 00:00 0
  7fd86000-7fda7000 rw-p 00000000 00:00 0          [stack]
  7fefd000-7fefe000 r-xp 00000000 00:00 0
  7ffe6000-7ffe7000 r--p 00000000 00:00 0          [vvar]
  7ffe7000-7ffe8000 r-xp 00000000 00:00 0          [vdso]

  root@OpenWrt:/# cat /proc/self/maps
  00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
  00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
  00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
  77d55000-77d77000 r-xp 00000000 00:02 274        /lib/libgcc_s.so.1
  77d77000-77d78000 r-xp 00012000 00:02 274        /lib/libgcc_s.so.1
  77d78000-77d79000 rwxp 00013000 00:02 274        /lib/libgcc_s.so.1
  77d79000-77e10000 r-xp 00000000 00:02 272        /lib/libc.so
  77e1f000-77e21000 rwxp 00096000 00:02 272        /lib/libc.so
  77e21000-77e23000 rwxp 00000000 00:00 0
  7fe23000-7fe44000 rw-p 00000000 00:00 0          [stack]
  7ff63000-7ff64000 r--p 00000000 00:00 0          [vvar]
  7ff64000-7ff65000 r-xp 00000000 00:00 0          [vdso]

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
---
 ...e-dsemul-code-when-CONFIG_MIPS_FP_SU.patch | 140 ++++++++++++++++++
 1 file changed, 140 insertions(+)
 create mode 100644 target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch

Comments

Hauke Mehrtens March 29, 2020, 3:33 p.m. UTC | #1
On 3/27/20 5:28 AM, Yousong Zhou wrote:
> The patch is backported from mips-next.  In addition to minor reduction
> of code size and runtime memory use, the more apparent difference is
> that the delay slot emulation page will not be present for those targets
> with fpu emulation disabled (CONFIG_MIPS_FP_SUPPORT=n)
> 
> Memory maps of busybox before and after this change
> 
>   root@OpenWrt:/# cat /proc/self/maps
>   00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
>   00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
>   00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
>   77dc0000-77de2000 r-xp 00000000 00:02 273        /lib/libgcc_s.so.1
>   77de2000-77de3000 r-xp 00012000 00:02 273        /lib/libgcc_s.so.1
>   77de3000-77de4000 rwxp 00013000 00:02 273        /lib/libgcc_s.so.1
>   77de4000-77e7b000 r-xp 00000000 00:02 271        /lib/libc.so
>   77e8a000-77e8c000 rwxp 00096000 00:02 271        /lib/libc.so
>   77e8c000-77e8e000 rwxp 00000000 00:00 0
>   7fd86000-7fda7000 rw-p 00000000 00:00 0          [stack]
>   7fefd000-7fefe000 r-xp 00000000 00:00 0
>   7ffe6000-7ffe7000 r--p 00000000 00:00 0          [vvar]
>   7ffe7000-7ffe8000 r-xp 00000000 00:00 0          [vdso]
> 
>   root@OpenWrt:/# cat /proc/self/maps
>   00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
>   00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
>   00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
>   77d55000-77d77000 r-xp 00000000 00:02 274        /lib/libgcc_s.so.1
>   77d77000-77d78000 r-xp 00012000 00:02 274        /lib/libgcc_s.so.1
>   77d78000-77d79000 rwxp 00013000 00:02 274        /lib/libgcc_s.so.1
>   77d79000-77e10000 r-xp 00000000 00:02 272        /lib/libc.so
>   77e1f000-77e21000 rwxp 00096000 00:02 272        /lib/libc.so
>   77e21000-77e23000 rwxp 00000000 00:00 0
>   7fe23000-7fe44000 rw-p 00000000 00:00 0          [stack]
>   7ff63000-7ff64000 r--p 00000000 00:00 0          [vvar]
>   7ff64000-7ff65000 r-xp 00000000 00:00 0          [vdso]
> 
> Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>

Acked-by: Hauke Mehrtens <hauke@hauke-m.de>

> ---
>  ...e-dsemul-code-when-CONFIG_MIPS_FP_SU.patch | 140 ++++++++++++++++++
>  1 file changed, 140 insertions(+)
>  create mode 100644 target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
> 
> diff --git a/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
> new file mode 100644
> index 0000000000..1be051e1df
> --- /dev/null
> +++ b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
> @@ -0,0 +1,140 @@
> +From d96c3157f9ca177727fbad960fcf6f52f145f471 Mon Sep 17 00:00:00 2001
> +From: Yousong Zhou <yszhou4tech@gmail.com>
> +Date: Thu, 9 Jan 2020 11:33:19 +0800
> +Subject: [PATCH] MIPS: Exclude more dsemul code when CONFIG_MIPS_FP_SUPPORT=n
> +
> +This furthers what commit 42b10815d559 ("MIPS: Don't compile math-emu
> +when CONFIG_MIPS_FP_SUPPORT=n") has done
> +
> +Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
> +---
> + arch/mips/include/asm/processor.h | 12 ++++++------
> + arch/mips/kernel/process.c        | 10 ++++++++--
> + arch/mips/kernel/vdso.c           | 26 +++++++++++++++-----------
> + 3 files changed, 29 insertions(+), 19 deletions(-)
> +
> +diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h
> +index 7619ad319400..813ba94d87bb 100644
> +--- a/arch/mips/include/asm/processor.h
> ++++ b/arch/mips/include/asm/processor.h
> +@@ -253,13 +253,13 @@ struct thread_struct {
> + #ifdef CONFIG_MIPS_FP_SUPPORT
> + 	/* Saved fpu/fpu emulator stuff. */
> + 	struct mips_fpu_struct fpu FPU_ALIGN;
> +-#endif
> + 	/* Assigned branch delay slot 'emulation' frame */
> + 	atomic_t bd_emu_frame;
> + 	/* PC of the branch from a branch delay slot 'emulation' */
> + 	unsigned long bd_emu_branch_pc;
> + 	/* PC to continue from following a branch delay slot 'emulation' */
> + 	unsigned long bd_emu_cont_pc;
> ++#endif
> + #ifdef CONFIG_MIPS_MT_FPAFF
> + 	/* Emulated instruction count */
> + 	unsigned long emulated_fp;
> +@@ -302,7 +302,11 @@ struct thread_struct {
> + 		.fpr		= {{{0,},},},			\
> + 		.fcr31		= 0,				\
> + 		.msacsr		= 0,				\
> +-	},
> ++	},							\
> ++	/* Delay slot emulation */				\
> ++	.bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE),		\
> ++	.bd_emu_branch_pc = 0,					\
> ++	.bd_emu_cont_pc = 0,
> + #else
> + # define FPU_INIT
> + #endif
> +@@ -334,10 +338,6 @@ struct thread_struct {
> + 	 * FPU affinity state (null if not FPAFF)		\
> + 	 */							\
> + 	FPAFF_INIT						\
> +-	/* Delay slot emulation */				\
> +-	.bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE),		\
> +-	.bd_emu_branch_pc = 0,					\
> +-	.bd_emu_cont_pc = 0,					\
> + 	/*							\
> + 	 * Saved DSP stuff					\
> + 	 */							\
> +diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
> +index 339870ed92f7..b2a797557825 100644
> +--- a/arch/mips/kernel/process.c
> ++++ b/arch/mips/kernel/process.c
> +@@ -75,7 +75,9 @@ void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
> + 	lose_fpu(0);
> + 	clear_thread_flag(TIF_MSA_CTX_LIVE);
> + 	clear_used_math();
> ++#ifdef CONFIG_MIPS_FP_SUPPORT
> + 	atomic_set(&current->thread.bd_emu_frame, BD_EMUFRAME_NONE);
> ++#endif
> + 	init_dsp();
> + 	regs->cp0_epc = pc;
> + 	regs->regs[29] = sp;
> +@@ -176,7 +178,9 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
> + 	clear_tsk_thread_flag(p, TIF_FPUBOUND);
> + #endif /* CONFIG_MIPS_MT_FPAFF */
> + 
> ++#ifdef CONFIG_MIPS_FP_SUPPORT
> + 	atomic_set(&p->thread.bd_emu_frame, BD_EMUFRAME_NONE);
> ++#endif
> + 
> + 	if (clone_flags & CLONE_SETTLS)
> + 		ti->tp_value = tls;
> +@@ -650,8 +654,10 @@ unsigned long mips_stack_top(void)
> + {
> + 	unsigned long top = TASK_SIZE & PAGE_MASK;
> + 
> +-	/* One page for branch delay slot "emulation" */
> +-	top -= PAGE_SIZE;
> ++	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
> ++		/* One page for branch delay slot "emulation" */
> ++		top -= PAGE_SIZE;
> ++	}
> + 
> + 	/* Space for the VDSO, data page & GIC user page */
> + 	top -= PAGE_ALIGN(current->thread.abi->vdso->size);
> +diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
> +index bc35f8499111..3adb7354bc01 100644
> +--- a/arch/mips/kernel/vdso.c
> ++++ b/arch/mips/kernel/vdso.c
> +@@ -71,10 +71,12 @@ subsys_initcall(init_vdso);
> + 
> + static unsigned long vdso_base(void)
> + {
> +-	unsigned long base;
> ++	unsigned long base = STACK_TOP;
> + 
> +-	/* Skip the delay slot emulation page */
> +-	base = STACK_TOP + PAGE_SIZE;
> ++	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
> ++		/* Skip the delay slot emulation page */
> ++		base += PAGE_SIZE;
> ++	}
> + 
> + 	if (current->flags & PF_RANDOMIZE) {
> + 		base += get_random_int() & (VDSO_RANDOMIZE_SIZE - 1);
> +@@ -95,14 +97,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> + 	if (down_write_killable(&mm->mmap_sem))
> + 		return -EINTR;
> + 
> +-	/* Map delay slot emulation page */
> +-	base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
> +-			   VM_READ | VM_EXEC |
> +-			   VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
> +-			   0, NULL);
> +-	if (IS_ERR_VALUE(base)) {
> +-		ret = base;
> +-		goto out;
> ++	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
> ++		/* Map delay slot emulation page */
> ++		base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
> ++				VM_READ | VM_EXEC |
> ++				VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
> ++				0, NULL);
> ++		if (IS_ERR_VALUE(base)) {
> ++			ret = base;
> ++			goto out;
> ++		}
> + 	}
> + 
> + 	/*
>
Rosen Penev March 29, 2020, 11:17 p.m. UTC | #2
On Sun, Mar 29, 2020 at 8:34 AM Hauke Mehrtens <hauke@hauke-m.de> wrote:
>
> On 3/27/20 5:28 AM, Yousong Zhou wrote:
> > The patch is backported from mips-next.  In addition to minor reduction
> > of code size and runtime memory use, the more apparent difference is
> > that the delay slot emulation page will not be present for those targets
> > with fpu emulation disabled (CONFIG_MIPS_FP_SUPPORT=n)
> >
> > Memory maps of busybox before and after this change
> >
> >   root@OpenWrt:/# cat /proc/self/maps
> >   00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
> >   00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
> >   00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
> >   77dc0000-77de2000 r-xp 00000000 00:02 273        /lib/libgcc_s.so.1
> >   77de2000-77de3000 r-xp 00012000 00:02 273        /lib/libgcc_s.so.1
> >   77de3000-77de4000 rwxp 00013000 00:02 273        /lib/libgcc_s.so.1
> >   77de4000-77e7b000 r-xp 00000000 00:02 271        /lib/libc.so
> >   77e8a000-77e8c000 rwxp 00096000 00:02 271        /lib/libc.so
> >   77e8c000-77e8e000 rwxp 00000000 00:00 0
> >   7fd86000-7fda7000 rw-p 00000000 00:00 0          [stack]
> >   7fefd000-7fefe000 r-xp 00000000 00:00 0
> >   7ffe6000-7ffe7000 r--p 00000000 00:00 0          [vvar]
> >   7ffe7000-7ffe8000 r-xp 00000000 00:00 0          [vdso]
> >
> >   root@OpenWrt:/# cat /proc/self/maps
> >   00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
> >   00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
> >   00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
> >   77d55000-77d77000 r-xp 00000000 00:02 274        /lib/libgcc_s.so.1
> >   77d77000-77d78000 r-xp 00012000 00:02 274        /lib/libgcc_s.so.1
> >   77d78000-77d79000 rwxp 00013000 00:02 274        /lib/libgcc_s.so.1
> >   77d79000-77e10000 r-xp 00000000 00:02 272        /lib/libc.so
> >   77e1f000-77e21000 rwxp 00096000 00:02 272        /lib/libc.so
> >   77e21000-77e23000 rwxp 00000000 00:00 0
> >   7fe23000-7fe44000 rw-p 00000000 00:00 0          [stack]
> >   7ff63000-7ff64000 r--p 00000000 00:00 0          [vvar]
> >   7ff64000-7ff65000 r-xp 00000000 00:00 0          [vdso]
> >
> > Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
>
> Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
Acked-by: Rosen Penev <rosenp@gmail.com>

I have the previous version of this patch (taken from ldir's tree) in
my tree. Works great. Have not seen any problems.
>
> > ---
> >  ...e-dsemul-code-when-CONFIG_MIPS_FP_SU.patch | 140 ++++++++++++++++++
> >  1 file changed, 140 insertions(+)
> >  create mode 100644 target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
> >
> > diff --git a/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
> > new file mode 100644
> > index 0000000000..1be051e1df
> > --- /dev/null
> > +++ b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
> > @@ -0,0 +1,140 @@
> > +From d96c3157f9ca177727fbad960fcf6f52f145f471 Mon Sep 17 00:00:00 2001
> > +From: Yousong Zhou <yszhou4tech@gmail.com>
> > +Date: Thu, 9 Jan 2020 11:33:19 +0800
> > +Subject: [PATCH] MIPS: Exclude more dsemul code when CONFIG_MIPS_FP_SUPPORT=n
> > +
> > +This furthers what commit 42b10815d559 ("MIPS: Don't compile math-emu
> > +when CONFIG_MIPS_FP_SUPPORT=n") has done
> > +
> > +Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
> > +---
> > + arch/mips/include/asm/processor.h | 12 ++++++------
> > + arch/mips/kernel/process.c        | 10 ++++++++--
> > + arch/mips/kernel/vdso.c           | 26 +++++++++++++++-----------
> > + 3 files changed, 29 insertions(+), 19 deletions(-)
> > +
> > +diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h
> > +index 7619ad319400..813ba94d87bb 100644
> > +--- a/arch/mips/include/asm/processor.h
> > ++++ b/arch/mips/include/asm/processor.h
> > +@@ -253,13 +253,13 @@ struct thread_struct {
> > + #ifdef CONFIG_MIPS_FP_SUPPORT
> > +     /* Saved fpu/fpu emulator stuff. */
> > +     struct mips_fpu_struct fpu FPU_ALIGN;
> > +-#endif
> > +     /* Assigned branch delay slot 'emulation' frame */
> > +     atomic_t bd_emu_frame;
> > +     /* PC of the branch from a branch delay slot 'emulation' */
> > +     unsigned long bd_emu_branch_pc;
> > +     /* PC to continue from following a branch delay slot 'emulation' */
> > +     unsigned long bd_emu_cont_pc;
> > ++#endif
> > + #ifdef CONFIG_MIPS_MT_FPAFF
> > +     /* Emulated instruction count */
> > +     unsigned long emulated_fp;
> > +@@ -302,7 +302,11 @@ struct thread_struct {
> > +             .fpr            = {{{0,},},},                   \
> > +             .fcr31          = 0,                            \
> > +             .msacsr         = 0,                            \
> > +-    },
> > ++    },                                                      \
> > ++    /* Delay slot emulation */                              \
> > ++    .bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE),          \
> > ++    .bd_emu_branch_pc = 0,                                  \
> > ++    .bd_emu_cont_pc = 0,
> > + #else
> > + # define FPU_INIT
> > + #endif
> > +@@ -334,10 +338,6 @@ struct thread_struct {
> > +      * FPU affinity state (null if not FPAFF)               \
> > +      */                                                     \
> > +     FPAFF_INIT                                              \
> > +-    /* Delay slot emulation */                              \
> > +-    .bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE),          \
> > +-    .bd_emu_branch_pc = 0,                                  \
> > +-    .bd_emu_cont_pc = 0,                                    \
> > +     /*                                                      \
> > +      * Saved DSP stuff                                      \
> > +      */                                                     \
> > +diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
> > +index 339870ed92f7..b2a797557825 100644
> > +--- a/arch/mips/kernel/process.c
> > ++++ b/arch/mips/kernel/process.c
> > +@@ -75,7 +75,9 @@ void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
> > +     lose_fpu(0);
> > +     clear_thread_flag(TIF_MSA_CTX_LIVE);
> > +     clear_used_math();
> > ++#ifdef CONFIG_MIPS_FP_SUPPORT
> > +     atomic_set(&current->thread.bd_emu_frame, BD_EMUFRAME_NONE);
> > ++#endif
> > +     init_dsp();
> > +     regs->cp0_epc = pc;
> > +     regs->regs[29] = sp;
> > +@@ -176,7 +178,9 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
> > +     clear_tsk_thread_flag(p, TIF_FPUBOUND);
> > + #endif /* CONFIG_MIPS_MT_FPAFF */
> > +
> > ++#ifdef CONFIG_MIPS_FP_SUPPORT
> > +     atomic_set(&p->thread.bd_emu_frame, BD_EMUFRAME_NONE);
> > ++#endif
> > +
> > +     if (clone_flags & CLONE_SETTLS)
> > +             ti->tp_value = tls;
> > +@@ -650,8 +654,10 @@ unsigned long mips_stack_top(void)
> > + {
> > +     unsigned long top = TASK_SIZE & PAGE_MASK;
> > +
> > +-    /* One page for branch delay slot "emulation" */
> > +-    top -= PAGE_SIZE;
> > ++    if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
> > ++            /* One page for branch delay slot "emulation" */
> > ++            top -= PAGE_SIZE;
> > ++    }
> > +
> > +     /* Space for the VDSO, data page & GIC user page */
> > +     top -= PAGE_ALIGN(current->thread.abi->vdso->size);
> > +diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
> > +index bc35f8499111..3adb7354bc01 100644
> > +--- a/arch/mips/kernel/vdso.c
> > ++++ b/arch/mips/kernel/vdso.c
> > +@@ -71,10 +71,12 @@ subsys_initcall(init_vdso);
> > +
> > + static unsigned long vdso_base(void)
> > + {
> > +-    unsigned long base;
> > ++    unsigned long base = STACK_TOP;
> > +
> > +-    /* Skip the delay slot emulation page */
> > +-    base = STACK_TOP + PAGE_SIZE;
> > ++    if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
> > ++            /* Skip the delay slot emulation page */
> > ++            base += PAGE_SIZE;
> > ++    }
> > +
> > +     if (current->flags & PF_RANDOMIZE) {
> > +             base += get_random_int() & (VDSO_RANDOMIZE_SIZE - 1);
> > +@@ -95,14 +97,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> > +     if (down_write_killable(&mm->mmap_sem))
> > +             return -EINTR;
> > +
> > +-    /* Map delay slot emulation page */
> > +-    base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
> > +-                       VM_READ | VM_EXEC |
> > +-                       VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
> > +-                       0, NULL);
> > +-    if (IS_ERR_VALUE(base)) {
> > +-            ret = base;
> > +-            goto out;
> > ++    if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
> > ++            /* Map delay slot emulation page */
> > ++            base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
> > ++                            VM_READ | VM_EXEC |
> > ++                            VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
> > ++                            0, NULL);
> > ++            if (IS_ERR_VALUE(base)) {
> > ++                    ret = base;
> > ++                    goto out;
> > ++            }
> > +     }
> > +
> > +     /*
> >
>
>
Yousong Zhou March 30, 2020, 3:32 a.m. UTC | #3
On Mon, 30 Mar 2020 at 07:17, Rosen Penev <rosenp@gmail.com> wrote:
>
> On Sun, Mar 29, 2020 at 8:34 AM Hauke Mehrtens <hauke@hauke-m.de> wrote:
> >
> > On 3/27/20 5:28 AM, Yousong Zhou wrote:
> > > The patch is backported from mips-next.  In addition to minor reduction
> > > of code size and runtime memory use, the more apparent difference is
> > > that the delay slot emulation page will not be present for those targets
> > > with fpu emulation disabled (CONFIG_MIPS_FP_SUPPORT=n)
> > >
> > > Memory maps of busybox before and after this change
> > >
> > >   root@OpenWrt:/# cat /proc/self/maps
> > >   00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
> > >   00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
> > >   00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
> > >   77dc0000-77de2000 r-xp 00000000 00:02 273        /lib/libgcc_s.so.1
> > >   77de2000-77de3000 r-xp 00012000 00:02 273        /lib/libgcc_s.so.1
> > >   77de3000-77de4000 rwxp 00013000 00:02 273        /lib/libgcc_s.so.1
> > >   77de4000-77e7b000 r-xp 00000000 00:02 271        /lib/libc.so
> > >   77e8a000-77e8c000 rwxp 00096000 00:02 271        /lib/libc.so
> > >   77e8c000-77e8e000 rwxp 00000000 00:00 0
> > >   7fd86000-7fda7000 rw-p 00000000 00:00 0          [stack]
> > >   7fefd000-7fefe000 r-xp 00000000 00:00 0
> > >   7ffe6000-7ffe7000 r--p 00000000 00:00 0          [vvar]
> > >   7ffe7000-7ffe8000 r-xp 00000000 00:00 0          [vdso]
> > >
> > >   root@OpenWrt:/# cat /proc/self/maps
> > >   00400000-00449000 r-xp 00000000 00:02 23         /bin/busybox
> > >   00458000-00459000 r-xp 00048000 00:02 23         /bin/busybox
> > >   00459000-0045a000 rwxp 00049000 00:02 23         /bin/busybox
> > >   77d55000-77d77000 r-xp 00000000 00:02 274        /lib/libgcc_s.so.1
> > >   77d77000-77d78000 r-xp 00012000 00:02 274        /lib/libgcc_s.so.1
> > >   77d78000-77d79000 rwxp 00013000 00:02 274        /lib/libgcc_s.so.1
> > >   77d79000-77e10000 r-xp 00000000 00:02 272        /lib/libc.so
> > >   77e1f000-77e21000 rwxp 00096000 00:02 272        /lib/libc.so
> > >   77e21000-77e23000 rwxp 00000000 00:00 0
> > >   7fe23000-7fe44000 rw-p 00000000 00:00 0          [stack]
> > >   7ff63000-7ff64000 r--p 00000000 00:00 0          [vvar]
> > >   7ff64000-7ff65000 r-xp 00000000 00:00 0          [vdso]
> > >
> > > Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
> >
> > Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
> Acked-by: Rosen Penev <rosenp@gmail.com>
>
> I have the previous version of this patch (taken from ldir's tree) in
> my tree. Works great. Have not seen any problems.
> >

Applied to master branch.  Thanks

Regards,
                yousong
diff mbox series

Patch

diff --git a/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
new file mode 100644
index 0000000000..1be051e1df
--- /dev/null
+++ b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
@@ -0,0 +1,140 @@ 
+From d96c3157f9ca177727fbad960fcf6f52f145f471 Mon Sep 17 00:00:00 2001
+From: Yousong Zhou <yszhou4tech@gmail.com>
+Date: Thu, 9 Jan 2020 11:33:19 +0800
+Subject: [PATCH] MIPS: Exclude more dsemul code when CONFIG_MIPS_FP_SUPPORT=n
+
+This furthers what commit 42b10815d559 ("MIPS: Don't compile math-emu
+when CONFIG_MIPS_FP_SUPPORT=n") has done
+
+Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
+---
+ arch/mips/include/asm/processor.h | 12 ++++++------
+ arch/mips/kernel/process.c        | 10 ++++++++--
+ arch/mips/kernel/vdso.c           | 26 +++++++++++++++-----------
+ 3 files changed, 29 insertions(+), 19 deletions(-)
+
+diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h
+index 7619ad319400..813ba94d87bb 100644
+--- a/arch/mips/include/asm/processor.h
++++ b/arch/mips/include/asm/processor.h
+@@ -253,13 +253,13 @@ struct thread_struct {
+ #ifdef CONFIG_MIPS_FP_SUPPORT
+ 	/* Saved fpu/fpu emulator stuff. */
+ 	struct mips_fpu_struct fpu FPU_ALIGN;
+-#endif
+ 	/* Assigned branch delay slot 'emulation' frame */
+ 	atomic_t bd_emu_frame;
+ 	/* PC of the branch from a branch delay slot 'emulation' */
+ 	unsigned long bd_emu_branch_pc;
+ 	/* PC to continue from following a branch delay slot 'emulation' */
+ 	unsigned long bd_emu_cont_pc;
++#endif
+ #ifdef CONFIG_MIPS_MT_FPAFF
+ 	/* Emulated instruction count */
+ 	unsigned long emulated_fp;
+@@ -302,7 +302,11 @@ struct thread_struct {
+ 		.fpr		= {{{0,},},},			\
+ 		.fcr31		= 0,				\
+ 		.msacsr		= 0,				\
+-	},
++	},							\
++	/* Delay slot emulation */				\
++	.bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE),		\
++	.bd_emu_branch_pc = 0,					\
++	.bd_emu_cont_pc = 0,
+ #else
+ # define FPU_INIT
+ #endif
+@@ -334,10 +338,6 @@ struct thread_struct {
+ 	 * FPU affinity state (null if not FPAFF)		\
+ 	 */							\
+ 	FPAFF_INIT						\
+-	/* Delay slot emulation */				\
+-	.bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE),		\
+-	.bd_emu_branch_pc = 0,					\
+-	.bd_emu_cont_pc = 0,					\
+ 	/*							\
+ 	 * Saved DSP stuff					\
+ 	 */							\
+diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
+index 339870ed92f7..b2a797557825 100644
+--- a/arch/mips/kernel/process.c
++++ b/arch/mips/kernel/process.c
+@@ -75,7 +75,9 @@ void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
+ 	lose_fpu(0);
+ 	clear_thread_flag(TIF_MSA_CTX_LIVE);
+ 	clear_used_math();
++#ifdef CONFIG_MIPS_FP_SUPPORT
+ 	atomic_set(&current->thread.bd_emu_frame, BD_EMUFRAME_NONE);
++#endif
+ 	init_dsp();
+ 	regs->cp0_epc = pc;
+ 	regs->regs[29] = sp;
+@@ -176,7 +178,9 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long usp,
+ 	clear_tsk_thread_flag(p, TIF_FPUBOUND);
+ #endif /* CONFIG_MIPS_MT_FPAFF */
+ 
++#ifdef CONFIG_MIPS_FP_SUPPORT
+ 	atomic_set(&p->thread.bd_emu_frame, BD_EMUFRAME_NONE);
++#endif
+ 
+ 	if (clone_flags & CLONE_SETTLS)
+ 		ti->tp_value = tls;
+@@ -650,8 +654,10 @@ unsigned long mips_stack_top(void)
+ {
+ 	unsigned long top = TASK_SIZE & PAGE_MASK;
+ 
+-	/* One page for branch delay slot "emulation" */
+-	top -= PAGE_SIZE;
++	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
++		/* One page for branch delay slot "emulation" */
++		top -= PAGE_SIZE;
++	}
+ 
+ 	/* Space for the VDSO, data page & GIC user page */
+ 	top -= PAGE_ALIGN(current->thread.abi->vdso->size);
+diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
+index bc35f8499111..3adb7354bc01 100644
+--- a/arch/mips/kernel/vdso.c
++++ b/arch/mips/kernel/vdso.c
+@@ -71,10 +71,12 @@ subsys_initcall(init_vdso);
+ 
+ static unsigned long vdso_base(void)
+ {
+-	unsigned long base;
++	unsigned long base = STACK_TOP;
+ 
+-	/* Skip the delay slot emulation page */
+-	base = STACK_TOP + PAGE_SIZE;
++	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
++		/* Skip the delay slot emulation page */
++		base += PAGE_SIZE;
++	}
+ 
+ 	if (current->flags & PF_RANDOMIZE) {
+ 		base += get_random_int() & (VDSO_RANDOMIZE_SIZE - 1);
+@@ -95,14 +97,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
+ 	if (down_write_killable(&mm->mmap_sem))
+ 		return -EINTR;
+ 
+-	/* Map delay slot emulation page */
+-	base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
+-			   VM_READ | VM_EXEC |
+-			   VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
+-			   0, NULL);
+-	if (IS_ERR_VALUE(base)) {
+-		ret = base;
+-		goto out;
++	if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
++		/* Map delay slot emulation page */
++		base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
++				VM_READ | VM_EXEC |
++				VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
++				0, NULL);
++		if (IS_ERR_VALUE(base)) {
++			ret = base;
++			goto out;
++		}
+ 	}
+ 
+ 	/*