diff mbox series

[3/4] linux-user/sparc: Put address for data faults where linux-user expects it

Message ID 1509993206-26637-4-git-send-email-peter.maydell@linaro.org
State Accepted
Headers show
Series linux-user: fix various SIGSEGV delivery bugs | expand

Commit Message

Peter Maydell Nov. 6, 2017, 6:33 p.m. UTC
In the user-mode-only version of sparc_cpu_handle_mmu_fault(),
we must save the fault address for a data fault into the CPU
state's mmu registers, because the code in linux-user/main.c
expects to find it there in order to populate the si_addr
field of the guest siginfo.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

---
 target/sparc/mmu_helper.c | 8 ++++++++
 1 file changed, 8 insertions(+)

-- 
2.7.4

Comments

Laurent Vivier Nov. 7, 2017, 8:28 a.m. UTC | #1
Le 06/11/2017 à 19:33, Peter Maydell a écrit :
> In the user-mode-only version of sparc_cpu_handle_mmu_fault(),

> we must save the fault address for a data fault into the CPU

> state's mmu registers, because the code in linux-user/main.c

> expects to find it there in order to populate the si_addr

> field of the guest siginfo.

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

> ---

>  target/sparc/mmu_helper.c | 8 ++++++++

>  1 file changed, 8 insertions(+)

> 

> diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c

> index 126ea5e..d5b6c1e 100644

> --- a/target/sparc/mmu_helper.c

> +++ b/target/sparc/mmu_helper.c

> @@ -30,10 +30,18 @@

>  int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw,

>                                 int mmu_idx)

>  {

> +    SPARCCPU *cpu = SPARC_CPU(cs);

> +    CPUSPARCState *env = &cpu->env;

> +

>      if (rw & 2) {

>          cs->exception_index = TT_TFAULT;

>      } else {

>          cs->exception_index = TT_DFAULT;

> +#ifdef TARGET_SPARC64

> +        env->dmmu.mmuregs[4] = address;

> +#else

> +        env->mmuregs[4] = address;

> +#endif

>      }

>      return 1;

>  }

> 


The softmmu version of sparc_cpu_handle_mmu_fault() also updates
mmuregs[3]. Is it needed for this one (for ucontext)?

Thanks,
Laurent
Peter Maydell Nov. 7, 2017, 9:20 a.m. UTC | #2
On 7 November 2017 at 08:28, Laurent Vivier <laurent@vivier.eu> wrote:
> Le 06/11/2017 à 19:33, Peter Maydell a écrit :

>> In the user-mode-only version of sparc_cpu_handle_mmu_fault(),

>> we must save the fault address for a data fault into the CPU

>> state's mmu registers, because the code in linux-user/main.c

>> expects to find it there in order to populate the si_addr

>> field of the guest siginfo.

>>

>> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

>> ---

>>  target/sparc/mmu_helper.c | 8 ++++++++

>>  1 file changed, 8 insertions(+)

>>

>> diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c

>> index 126ea5e..d5b6c1e 100644

>> --- a/target/sparc/mmu_helper.c

>> +++ b/target/sparc/mmu_helper.c

>> @@ -30,10 +30,18 @@

>>  int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw,

>>                                 int mmu_idx)

>>  {

>> +    SPARCCPU *cpu = SPARC_CPU(cs);

>> +    CPUSPARCState *env = &cpu->env;

>> +

>>      if (rw & 2) {

>>          cs->exception_index = TT_TFAULT;

>>      } else {

>>          cs->exception_index = TT_DFAULT;

>> +#ifdef TARGET_SPARC64

>> +        env->dmmu.mmuregs[4] = address;

>> +#else

>> +        env->mmuregs[4] = address;

>> +#endif

>>      }

>>      return 1;

>>  }

>>

>

> The softmmu version of sparc_cpu_handle_mmu_fault() also updates

> mmuregs[3]. Is it needed for this one (for ucontext)?


Nothing in linux-user/ reads mmuregs[3], so I assume not.

thanks
-- PMM
Laurent Vivier Nov. 7, 2017, 9:25 a.m. UTC | #3
Le 06/11/2017 à 19:33, Peter Maydell a écrit :
> In the user-mode-only version of sparc_cpu_handle_mmu_fault(),

> we must save the fault address for a data fault into the CPU

> state's mmu registers, because the code in linux-user/main.c

> expects to find it there in order to populate the si_addr

> field of the guest siginfo.

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

> ---

>  target/sparc/mmu_helper.c | 8 ++++++++

>  1 file changed, 8 insertions(+)

> 

> diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c

> index 126ea5e..d5b6c1e 100644

> --- a/target/sparc/mmu_helper.c

> +++ b/target/sparc/mmu_helper.c

> @@ -30,10 +30,18 @@

>  int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw,

>                                 int mmu_idx)

>  {

> +    SPARCCPU *cpu = SPARC_CPU(cs);

> +    CPUSPARCState *env = &cpu->env;

> +

>      if (rw & 2) {

>          cs->exception_index = TT_TFAULT;

>      } else {

>          cs->exception_index = TT_DFAULT;

> +#ifdef TARGET_SPARC64

> +        env->dmmu.mmuregs[4] = address;

> +#else

> +        env->mmuregs[4] = address;

> +#endif

>      }

>      return 1;

>  }

> 


Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Philippe Mathieu-Daudé Nov. 7, 2017, 3:26 p.m. UTC | #4
On 11/06/2017 03:33 PM, Peter Maydell wrote:
> In the user-mode-only version of sparc_cpu_handle_mmu_fault(),

> we must save the fault address for a data fault into the CPU

> state's mmu registers, because the code in linux-user/main.c

> expects to find it there in order to populate the si_addr

> field of the guest siginfo.

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


> ---

>  target/sparc/mmu_helper.c | 8 ++++++++

>  1 file changed, 8 insertions(+)

> 

> diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c

> index 126ea5e..d5b6c1e 100644

> --- a/target/sparc/mmu_helper.c

> +++ b/target/sparc/mmu_helper.c

> @@ -30,10 +30,18 @@

>  int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw,

>                                 int mmu_idx)

>  {

> +    SPARCCPU *cpu = SPARC_CPU(cs);

> +    CPUSPARCState *env = &cpu->env;

> +

>      if (rw & 2) {

>          cs->exception_index = TT_TFAULT;

>      } else {

>          cs->exception_index = TT_DFAULT;

> +#ifdef TARGET_SPARC64

> +        env->dmmu.mmuregs[4] = address;

> +#else

> +        env->mmuregs[4] = address;

> +#endif

>      }

>      return 1;

>  }

>
Richard Henderson Nov. 8, 2017, 9:21 p.m. UTC | #5
On 11/06/2017 07:33 PM, Peter Maydell wrote:
> In the user-mode-only version of sparc_cpu_handle_mmu_fault(),

> we must save the fault address for a data fault into the CPU

> state's mmu registers, because the code in linux-user/main.c

> expects to find it there in order to populate the si_addr

> field of the guest siginfo.

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

> ---

>  target/sparc/mmu_helper.c | 8 ++++++++

>  1 file changed, 8 insertions(+)


Reviewed-by: Richard Henderson <richard.henderson@linaro.org>



r~
diff mbox series

Patch

diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c
index 126ea5e..d5b6c1e 100644
--- a/target/sparc/mmu_helper.c
+++ b/target/sparc/mmu_helper.c
@@ -30,10 +30,18 @@ 
 int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw,
                                int mmu_idx)
 {
+    SPARCCPU *cpu = SPARC_CPU(cs);
+    CPUSPARCState *env = &cpu->env;
+
     if (rw & 2) {
         cs->exception_index = TT_TFAULT;
     } else {
         cs->exception_index = TT_DFAULT;
+#ifdef TARGET_SPARC64
+        env->dmmu.mmuregs[4] = address;
+#else
+        env->mmuregs[4] = address;
+#endif
     }
     return 1;
 }