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 <[email protected]>

Acked-by: Hauke Mehrtens <[email protected]>

> ---
>  ...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 <[email protected]>
> +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 <[email protected]>
> +---
> + 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;
> ++            }
> +     }
> + 
> +     /*
> 


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to