generic: mips: exclude more dsemul code when fpu-emu is not enabled
authorYousong Zhou <yszhou4tech@gmail.com>
Tue, 3 Mar 2020 15:09:47 +0000 (23:09 +0800)
committerYousong Zhou <yszhou4tech@gmail.com>
Mon, 30 Mar 2020 03:28:11 +0000 (11:28 +0800)
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]

Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
Acked-by: Rosen Penev <rosenp@gmail.com>
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch [new file with mode: 0644]

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 (file)
index 0000000..1be051e
--- /dev/null
@@ -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;
++              }
+       }
+       /*