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 |
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
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
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>
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; > } >
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 --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; }
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