diff mbox

target-arm: correctly UNDEF writes to FPINST/FPINST2 from EL0

Message ID 1412967447-20931-1-git-send-email-peter.maydell@linaro.org
State Superseded
Headers show

Commit Message

Peter Maydell Oct. 10, 2014, 6:57 p.m. UTC
The ARM ARM requires that the FPINST and FPINST2 VFP control
registers are not accessible to code at EL0. We were already
correctly implementing this for reads of these registers; add
the missing check for the write code path.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/translate.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Laurent Desnogues Oct. 11, 2014, 8:51 a.m. UTC | #1
On Fri, Oct 10, 2014 at 8:57 PM, Peter Maydell <peter.maydell@linaro.org> wrote:
> The ARM ARM requires that the FPINST and FPINST2 VFP control
> registers are not accessible to code at EL0. We were already
> correctly implementing this for reads of these registers; add
> the missing check for the write code path.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>

Thanks,

Laurent

> ---
>  target-arm/translate.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/target-arm/translate.c b/target-arm/translate.c
> index 8a2994f..d8ee2e4 100644
> --- a/target-arm/translate.c
> +++ b/target-arm/translate.c
> @@ -3199,6 +3199,9 @@ static int disas_vfp_insn(CPUARMState * env, DisasContext *s, uint32_t insn)
>                              break;
>                          case ARM_VFP_FPINST:
>                          case ARM_VFP_FPINST2:
> +                            if (IS_USER(s)) {
> +                                return 1;
> +                            }
>                              tmp = load_reg(s, rd);
>                              store_cpu_field(tmp, vfp.xregs[rn]);
>                              break;
> --
> 1.9.1
>
diff mbox

Patch

diff --git a/target-arm/translate.c b/target-arm/translate.c
index 8a2994f..d8ee2e4 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -3199,6 +3199,9 @@  static int disas_vfp_insn(CPUARMState * env, DisasContext *s, uint32_t insn)
                             break;
                         case ARM_VFP_FPINST:
                         case ARM_VFP_FPINST2:
+                            if (IS_USER(s)) {
+                                return 1;
+                            }
                             tmp = load_reg(s, rd);
                             store_cpu_field(tmp, vfp.xregs[rn]);
                             break;