diff mbox series

[v5,30/67] target/mips: Make mips_cpu_tlb_fill sysemu only

Message ID 20211015041053.2769193-31-richard.henderson@linaro.org
State New
Headers show
Series user-only: Cleanup SIGSEGV and SIGBUS handling | expand

Commit Message

Richard Henderson Oct. 15, 2021, 4:10 a.m. UTC
The fallback code in cpu_loop_exit_sigsegv is sufficient
for mips linux-user.

This means we can remove tcg/user/tlb_helper.c entirely.
Remove the code from cpu_loop that raised SIGSEGV.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/mips/tcg/tcg-internal.h    |  7 ++--
 linux-user/mips/cpu_loop.c        | 11 ------
 target/mips/cpu.c                 |  2 +-
 target/mips/tcg/user/tlb_helper.c | 59 -------------------------------
 target/mips/tcg/meson.build       |  3 --
 target/mips/tcg/user/meson.build  |  3 --
 6 files changed, 5 insertions(+), 80 deletions(-)
 delete mode 100644 target/mips/tcg/user/tlb_helper.c
 delete mode 100644 target/mips/tcg/user/meson.build

Comments

Warner Losh Oct. 15, 2021, 6:40 p.m. UTC | #1
On Thu, Oct 14, 2021 at 10:11 PM Richard Henderson <
richard.henderson@linaro.org> wrote:

> The fallback code in cpu_loop_exit_sigsegv is sufficient
> for mips linux-user.
>
> This means we can remove tcg/user/tlb_helper.c entirely.
> Remove the code from cpu_loop that raised SIGSEGV.
>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/mips/tcg/tcg-internal.h    |  7 ++--
>  linux-user/mips/cpu_loop.c        | 11 ------
>  target/mips/cpu.c                 |  2 +-
>  target/mips/tcg/user/tlb_helper.c | 59 -------------------------------
>  target/mips/tcg/meson.build       |  3 --
>  target/mips/tcg/user/meson.build  |  3 --
>  6 files changed, 5 insertions(+), 80 deletions(-)
>  delete mode 100644 target/mips/tcg/user/tlb_helper.c
>  delete mode 100644 target/mips/tcg/user/meson.build
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

We do have mips support in bsd-user fork, but it's unclear how long we'll
continue
that support, though. This seems like it won't present a big problem for us
should
we continue that support, though (at least for FreeBSD). The usual
$(OTHER)BSD
caveats apply.

Warner


> diff --git a/target/mips/tcg/tcg-internal.h
> b/target/mips/tcg/tcg-internal.h
> index bad3deb611..466768aec4 100644
> --- a/target/mips/tcg/tcg-internal.h
> +++ b/target/mips/tcg/tcg-internal.h
> @@ -18,9 +18,6 @@
>  void mips_tcg_init(void);
>
>  void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock
> *tb);
> -bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
> -                       MMUAccessType access_type, int mmu_idx,
> -                       bool probe, uintptr_t retaddr);
>  void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
>                                    MMUAccessType access_type, int mmu_idx,
>                                    uintptr_t retaddr) QEMU_NORETURN;
> @@ -60,6 +57,10 @@ void mips_cpu_do_transaction_failed(CPUState *cs,
> hwaddr physaddr,
>                                      MemTxResult response, uintptr_t
> retaddr);
>  void cpu_mips_tlb_flush(CPUMIPSState *env);
>
> +bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
> +                       MMUAccessType access_type, int mmu_idx,
> +                       bool probe, uintptr_t retaddr);
> +
>  #endif /* !CONFIG_USER_ONLY */
>
>  #endif
> diff --git a/linux-user/mips/cpu_loop.c b/linux-user/mips/cpu_loop.c
> index cb03fb066b..b735c99a24 100644
> --- a/linux-user/mips/cpu_loop.c
> +++ b/linux-user/mips/cpu_loop.c
> @@ -158,17 +158,6 @@ done_syscall:
>              }
>              env->active_tc.gpr[2] = ret;
>              break;
> -        case EXCP_TLBL:
> -        case EXCP_TLBS:
> -        case EXCP_AdEL:
> -        case EXCP_AdES:
> -            info.si_signo = TARGET_SIGSEGV;
> -            info.si_errno = 0;
> -            /* XXX: check env->error_code */
> -            info.si_code = TARGET_SEGV_MAPERR;
> -            info._sifields._sigfault._addr = env->CP0_BadVAddr;
> -            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> -            break;
>          case EXCP_CpU:
>          case EXCP_RI:
>              info.si_signo = TARGET_SIGILL;
> diff --git a/target/mips/cpu.c b/target/mips/cpu.c
> index 00e0c55d0e..4aae23934b 100644
> --- a/target/mips/cpu.c
> +++ b/target/mips/cpu.c
> @@ -539,9 +539,9 @@ static const struct SysemuCPUOps mips_sysemu_ops = {
>  static const struct TCGCPUOps mips_tcg_ops = {
>      .initialize = mips_tcg_init,
>      .synchronize_from_tb = mips_cpu_synchronize_from_tb,
> -    .tlb_fill = mips_cpu_tlb_fill,
>
>  #if !defined(CONFIG_USER_ONLY)
> +    .tlb_fill = mips_cpu_tlb_fill,
>      .cpu_exec_interrupt = mips_cpu_exec_interrupt,
>      .do_interrupt = mips_cpu_do_interrupt,
>      .do_transaction_failed = mips_cpu_do_transaction_failed,
> diff --git a/target/mips/tcg/user/tlb_helper.c
> b/target/mips/tcg/user/tlb_helper.c
> deleted file mode 100644
> index 210c6d529e..0000000000
> --- a/target/mips/tcg/user/tlb_helper.c
> +++ /dev/null
> @@ -1,59 +0,0 @@
> -/*
> - * MIPS TLB (Translation lookaside buffer) helpers.
> - *
> - *  Copyright (c) 2004-2005 Jocelyn Mayer
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library; if not, see <
> http://www.gnu.org/licenses/>.
> - */
> -#include "qemu/osdep.h"
> -
> -#include "cpu.h"
> -#include "exec/exec-all.h"
> -#include "internal.h"
> -
> -static void raise_mmu_exception(CPUMIPSState *env, target_ulong address,
> -                                MMUAccessType access_type)
> -{
> -    CPUState *cs = env_cpu(env);
> -
> -    env->error_code = 0;
> -    if (access_type == MMU_INST_FETCH) {
> -        env->error_code |= EXCP_INST_NOTAVAIL;
> -    }
> -
> -    /* Reference to kernel address from user mode or supervisor mode */
> -    /* Reference to supervisor address from user mode */
> -    if (access_type == MMU_DATA_STORE) {
> -        cs->exception_index = EXCP_AdES;
> -    } else {
> -        cs->exception_index = EXCP_AdEL;
> -    }
> -
> -    /* Raise exception */
> -    if (!(env->hflags & MIPS_HFLAG_DM)) {
> -        env->CP0_BadVAddr = address;
> -    }
> -}
> -
> -bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
> -                       MMUAccessType access_type, int mmu_idx,
> -                       bool probe, uintptr_t retaddr)
> -{
> -    MIPSCPU *cpu = MIPS_CPU(cs);
> -    CPUMIPSState *env = &cpu->env;
> -
> -    /* data access */
> -    raise_mmu_exception(env, address, access_type);
> -    do_raise_exception_err(env, cs->exception_index, env->error_code,
> retaddr);
> -}
> diff --git a/target/mips/tcg/meson.build b/target/mips/tcg/meson.build
> index 8f6f7508b6..98003779ae 100644
> --- a/target/mips/tcg/meson.build
> +++ b/target/mips/tcg/meson.build
> @@ -28,9 +28,6 @@ mips_ss.add(when: 'TARGET_MIPS64', if_true: files(
>    'mxu_translate.c',
>  ))
>
> -if have_user
> -  subdir('user')
> -endif
>  if have_system
>    subdir('sysemu')
>  endif
> diff --git a/target/mips/tcg/user/meson.build
> b/target/mips/tcg/user/meson.build
> deleted file mode 100644
> index 79badcd321..0000000000
> --- a/target/mips/tcg/user/meson.build
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -mips_user_ss.add(files(
> -  'tlb_helper.c',
> -))
> --
> 2.25.1
>
>
diff mbox series

Patch

diff --git a/target/mips/tcg/tcg-internal.h b/target/mips/tcg/tcg-internal.h
index bad3deb611..466768aec4 100644
--- a/target/mips/tcg/tcg-internal.h
+++ b/target/mips/tcg/tcg-internal.h
@@ -18,9 +18,6 @@ 
 void mips_tcg_init(void);
 
 void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
-bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
-                       MMUAccessType access_type, int mmu_idx,
-                       bool probe, uintptr_t retaddr);
 void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
                                   MMUAccessType access_type, int mmu_idx,
                                   uintptr_t retaddr) QEMU_NORETURN;
@@ -60,6 +57,10 @@  void mips_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
                                     MemTxResult response, uintptr_t retaddr);
 void cpu_mips_tlb_flush(CPUMIPSState *env);
 
+bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+                       MMUAccessType access_type, int mmu_idx,
+                       bool probe, uintptr_t retaddr);
+
 #endif /* !CONFIG_USER_ONLY */
 
 #endif
diff --git a/linux-user/mips/cpu_loop.c b/linux-user/mips/cpu_loop.c
index cb03fb066b..b735c99a24 100644
--- a/linux-user/mips/cpu_loop.c
+++ b/linux-user/mips/cpu_loop.c
@@ -158,17 +158,6 @@  done_syscall:
             }
             env->active_tc.gpr[2] = ret;
             break;
-        case EXCP_TLBL:
-        case EXCP_TLBS:
-        case EXCP_AdEL:
-        case EXCP_AdES:
-            info.si_signo = TARGET_SIGSEGV;
-            info.si_errno = 0;
-            /* XXX: check env->error_code */
-            info.si_code = TARGET_SEGV_MAPERR;
-            info._sifields._sigfault._addr = env->CP0_BadVAddr;
-            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
-            break;
         case EXCP_CpU:
         case EXCP_RI:
             info.si_signo = TARGET_SIGILL;
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index 00e0c55d0e..4aae23934b 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -539,9 +539,9 @@  static const struct SysemuCPUOps mips_sysemu_ops = {
 static const struct TCGCPUOps mips_tcg_ops = {
     .initialize = mips_tcg_init,
     .synchronize_from_tb = mips_cpu_synchronize_from_tb,
-    .tlb_fill = mips_cpu_tlb_fill,
 
 #if !defined(CONFIG_USER_ONLY)
+    .tlb_fill = mips_cpu_tlb_fill,
     .cpu_exec_interrupt = mips_cpu_exec_interrupt,
     .do_interrupt = mips_cpu_do_interrupt,
     .do_transaction_failed = mips_cpu_do_transaction_failed,
diff --git a/target/mips/tcg/user/tlb_helper.c b/target/mips/tcg/user/tlb_helper.c
deleted file mode 100644
index 210c6d529e..0000000000
--- a/target/mips/tcg/user/tlb_helper.c
+++ /dev/null
@@ -1,59 +0,0 @@ 
-/*
- * MIPS TLB (Translation lookaside buffer) helpers.
- *
- *  Copyright (c) 2004-2005 Jocelyn Mayer
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-#include "qemu/osdep.h"
-
-#include "cpu.h"
-#include "exec/exec-all.h"
-#include "internal.h"
-
-static void raise_mmu_exception(CPUMIPSState *env, target_ulong address,
-                                MMUAccessType access_type)
-{
-    CPUState *cs = env_cpu(env);
-
-    env->error_code = 0;
-    if (access_type == MMU_INST_FETCH) {
-        env->error_code |= EXCP_INST_NOTAVAIL;
-    }
-
-    /* Reference to kernel address from user mode or supervisor mode */
-    /* Reference to supervisor address from user mode */
-    if (access_type == MMU_DATA_STORE) {
-        cs->exception_index = EXCP_AdES;
-    } else {
-        cs->exception_index = EXCP_AdEL;
-    }
-
-    /* Raise exception */
-    if (!(env->hflags & MIPS_HFLAG_DM)) {
-        env->CP0_BadVAddr = address;
-    }
-}
-
-bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
-                       MMUAccessType access_type, int mmu_idx,
-                       bool probe, uintptr_t retaddr)
-{
-    MIPSCPU *cpu = MIPS_CPU(cs);
-    CPUMIPSState *env = &cpu->env;
-
-    /* data access */
-    raise_mmu_exception(env, address, access_type);
-    do_raise_exception_err(env, cs->exception_index, env->error_code, retaddr);
-}
diff --git a/target/mips/tcg/meson.build b/target/mips/tcg/meson.build
index 8f6f7508b6..98003779ae 100644
--- a/target/mips/tcg/meson.build
+++ b/target/mips/tcg/meson.build
@@ -28,9 +28,6 @@  mips_ss.add(when: 'TARGET_MIPS64', if_true: files(
   'mxu_translate.c',
 ))
 
-if have_user
-  subdir('user')
-endif
 if have_system
   subdir('sysemu')
 endif
diff --git a/target/mips/tcg/user/meson.build b/target/mips/tcg/user/meson.build
deleted file mode 100644
index 79badcd321..0000000000
--- a/target/mips/tcg/user/meson.build
+++ /dev/null
@@ -1,3 +0,0 @@ 
-mips_user_ss.add(files(
-  'tlb_helper.c',
-))