Message ID | 20210803041443.55452-6-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | Unaligned access for user-only | expand |
+Helge On 8/3/21 6:13 AM, Richard Henderson wrote: > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/hppa/cpu_loop.c | 2 +- > target/hppa/cpu.c | 9 ++++++--- > 2 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/linux-user/hppa/cpu_loop.c b/linux-user/hppa/cpu_loop.c > index 82d8183821..5ce30fec8b 100644 > --- a/linux-user/hppa/cpu_loop.c > +++ b/linux-user/hppa/cpu_loop.c > @@ -161,7 +161,7 @@ void cpu_loop(CPUHPPAState *env) > case EXCP_UNALIGN: > info.si_signo = TARGET_SIGBUS; > info.si_errno = 0; > - info.si_code = 0; > + info.si_code = TARGET_BUS_ADRALN; > info._sifields._sigfault._addr = env->cr[CR_IOR]; > queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); > break; > diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c > index c2c56e7635..91f149ed77 100644 > --- a/target/hppa/cpu.c > +++ b/target/hppa/cpu.c > @@ -71,7 +71,6 @@ static void hppa_cpu_disas_set_info(CPUState *cs, disassemble_info *info) > info->print_insn = print_insn_hppa; > } > > -#ifndef CONFIG_USER_ONLY > static void QEMU_NORETURN > hppa_cpu_do_unaligned_access(CPUState *cs, vaddr addr, > MMUAccessType access_type, int mmu_idx, > @@ -81,15 +80,19 @@ hppa_cpu_do_unaligned_access(CPUState *cs, vaddr addr, > CPUHPPAState *env = &cpu->env; > > cs->exception_index = EXCP_UNALIGN; > +#ifdef CONFIG_USER_ONLY > + /* Recall that user-only always uses address space 0. */ > + env->cr[CR_IOR] = addr; > +#else > if (env->psw & PSW_Q) { > /* ??? Needs tweaking for hppa64. */ > env->cr[CR_IOR] = addr; > env->cr[CR_ISR] = addr >> 32; > } > +#endif > > cpu_loop_exit_restore(cs, retaddr); > } > -#endif /* CONFIG_USER_ONLY */ > > static void hppa_cpu_realizefn(DeviceState *dev, Error **errp) > { > @@ -147,10 +150,10 @@ static const struct TCGCPUOps hppa_tcg_ops = { > .synchronize_from_tb = hppa_cpu_synchronize_from_tb, > .cpu_exec_interrupt = hppa_cpu_exec_interrupt, > .tlb_fill = hppa_cpu_tlb_fill, > + .do_unaligned_access = hppa_cpu_do_unaligned_access, > > #ifndef CONFIG_USER_ONLY > .do_interrupt = hppa_cpu_do_interrupt, > - .do_unaligned_access = hppa_cpu_do_unaligned_access, > #endif /* !CONFIG_USER_ONLY */ > }; > >
diff --git a/linux-user/hppa/cpu_loop.c b/linux-user/hppa/cpu_loop.c index 82d8183821..5ce30fec8b 100644 --- a/linux-user/hppa/cpu_loop.c +++ b/linux-user/hppa/cpu_loop.c @@ -161,7 +161,7 @@ void cpu_loop(CPUHPPAState *env) case EXCP_UNALIGN: info.si_signo = TARGET_SIGBUS; info.si_errno = 0; - info.si_code = 0; + info.si_code = TARGET_BUS_ADRALN; info._sifields._sigfault._addr = env->cr[CR_IOR]; queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); break; diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c index c2c56e7635..91f149ed77 100644 --- a/target/hppa/cpu.c +++ b/target/hppa/cpu.c @@ -71,7 +71,6 @@ static void hppa_cpu_disas_set_info(CPUState *cs, disassemble_info *info) info->print_insn = print_insn_hppa; } -#ifndef CONFIG_USER_ONLY static void QEMU_NORETURN hppa_cpu_do_unaligned_access(CPUState *cs, vaddr addr, MMUAccessType access_type, int mmu_idx, @@ -81,15 +80,19 @@ hppa_cpu_do_unaligned_access(CPUState *cs, vaddr addr, CPUHPPAState *env = &cpu->env; cs->exception_index = EXCP_UNALIGN; +#ifdef CONFIG_USER_ONLY + /* Recall that user-only always uses address space 0. */ + env->cr[CR_IOR] = addr; +#else if (env->psw & PSW_Q) { /* ??? Needs tweaking for hppa64. */ env->cr[CR_IOR] = addr; env->cr[CR_ISR] = addr >> 32; } +#endif cpu_loop_exit_restore(cs, retaddr); } -#endif /* CONFIG_USER_ONLY */ static void hppa_cpu_realizefn(DeviceState *dev, Error **errp) { @@ -147,10 +150,10 @@ static const struct TCGCPUOps hppa_tcg_ops = { .synchronize_from_tb = hppa_cpu_synchronize_from_tb, .cpu_exec_interrupt = hppa_cpu_exec_interrupt, .tlb_fill = hppa_cpu_tlb_fill, + .do_unaligned_access = hppa_cpu_do_unaligned_access, #ifndef CONFIG_USER_ONLY .do_interrupt = hppa_cpu_do_interrupt, - .do_unaligned_access = hppa_cpu_do_unaligned_access, #endif /* !CONFIG_USER_ONLY */ };
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/hppa/cpu_loop.c | 2 +- target/hppa/cpu.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) -- 2.25.1