[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4] m68k: implement movep instruction
From: |
Pavel Dovgalyuk |
Subject: |
Re: [Qemu-devel] [PATCH v4] m68k: implement movep instruction |
Date: |
Tue, 6 Feb 2018 16:30:07 +0300 |
> From: Laurent Vivier [mailto:address@hidden
> Le 06/02/2018 à 13:44, Pavel Dovgalyuk a écrit :
> > This patch implements movep instruction. It moves data between a data
> > register
> > and alternate bytes within the address space starting at the location
> > specified and incrementing by two.
> >
> > It was designed for the original 68000 and used in firmwares for
> > interfacing the 8-bit peripherals through the 16-bit data bus.
>
> Did you test this change with some kind of firmware?
Yes, we implemented this instruction when tried to emulate Macintosh-128k on
Qemu.
> > Without this patch opcode for this instruction is recognized as some bitop.
> >
> > Signed-off-by: Pavel Dovgalyuk <address@hidden>
> > Signed-off-by: Mihail Abakumov <address@hidden>
> >
> > --
> >
> > v4: - fixed offset calculation misprint
> >
> > v3: - simplified movep function code
> > - joined movep masks
> >
> > v2: - disabled movep for Coldfire
> > - fixed gen_store/load usage
> > ---
> > target/m68k/cpu.c | 2 ++
> > target/m68k/cpu.h | 1 +
> > target/m68k/translate.c | 46
> > ++++++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 49 insertions(+)
>
> Tested-by: Laurent Vivier <address@hidden>
>
> I've checked we have the same result on a real 68040
>
> Reviewed-by: Laurent Vivier <address@hidden>
Thanks!
By the way, we also handled reset interrupt, but it is not compatible with
other m68k platforms:
@@ -66,8 +66,9 @@ static void m68k_cpu_reset(CPUState *s)
cpu_m68k_set_fpcr(env, 0);
env->fpsr = 0;
- /* TODO: We should set PC from the interrupt vector. */
- env->pc = 0;
+ env->vbr = 0;
+ /* PC and SP (for m68k) will be initialized by the reset handler */
+ s->exception_index = EXCP_RESET;
}
@@ -378,6 +380,8 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw)
cpu_m68k_set_sr(env, sr &= ~SR_M);
sp = env->aregs[7] & ~1;
do_stack_frame(env, &sp, 1, oldsr, 0, retaddr);
+ } else if (cs->exception_index == EXCP_RESET) {
+ sp = cpu_ldl_kernel(env, env->vbr + vector - 4);
} else {
do_stack_frame(env, &sp, 0, oldsr, 0, retaddr);
}
Pavel Dovgalyuk