[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH RFC v4 03/12] target/rx: CPU definition
From: |
Yoshinori Sato |
Subject: |
Re: [Qemu-devel] [PATCH RFC v4 03/12] target/rx: CPU definition |
Date: |
Mon, 25 Mar 2019 18:26:58 +0900 |
User-agent: |
Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (Gojō) APEL/10.8 EasyPG/1.0.0 Emacs/25.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) |
On Fri, 22 Mar 2019 04:28:03 +0900,
Richard Henderson wrote:
>
> On 3/20/19 7:16 AM, Yoshinori Sato wrote:
> > +#define FPSW_MASK 0xfc007cff
> > +#define FPSW_RM_MASK 0x00000003
> > +#define FPSW_DN (1 << 8)
>
> It's slightly confusing to have this as a mask,
>
> > +#define FPSW_CAUSE_MASK 0x000000fc
> > +#define FPSW_CAUSE_SHIFT 2
> > +#define FPSW_CAUSE 2
> > +#define FPSW_CAUSE_V 2
>
> and these as a bit. You might either rename to FPSW_DN_MASK, or define as a
> bit.
>
> Alternately, convert all of these to use "hw/registerfields.h", a la
>
> FIELD(FPSW, RM, 0, 2)
> FIELD(FPSW, CAUSE, 2, 6)
> FIELD(FPSW, CV, 2, 1)
> ...
> FIELD(FPSW, DN, 8, 1)
> FIELD(FPSW, ENABLE, 10, 5)
> FIELD(FPSW, EV, 10, 1)
> ...
> FIELD(FPSW, FLAG, 26, 5)
> FIELD(FPSW, FV, 26, 1)
> ...
> FIELD(FPSW, FS, 31, 1)
OK. PSW and FPSW converted to registerfield.
> > +#define FPSW_CAUSE_O 3
> > +#define FPSW_CAUSE_Z 4
> > +#define FPSW_CAUSE_U 5
> > +#define FPSW_CAUSE_X 6
> > +#define FPSW_CAUSE_E 7
> > +#define FPSW_ENABLE_MASK 0x00007c00
> > +#define FPSW_ENABLE 10
>
> If not using FIELD, perhaps FPSW_ENABLE_SHIFT to match FPSW_CAUSE_SHIFT?
OK. It rewrite register field API.
> > +#define RX_PSW_OP_NONE 0
> > +#define RX_PSW_OP_SUB 1
> > +#define RX_PSW_OP_ADD 2
> > +#define RX_PSW_OP_SHLL 3
>
> Unused.
OK. removed.
>
> > +typedef struct CPURXState {
> > + /* CPU registers */
> > + uint32_t regs[16]; /* general registers */
> > + uint32_t psw; /* processor status */
>
> As discussed in reply to patch 2, remove this.
OK. removed.
> > + /* Flag operation */
> > + uint32_t psw_op;
> > + uint32_t psw_v[3];
>
> Unused.
Likewise.
> > +static inline void cpu_get_tb_cpu_state(CPURXState *env, target_ulong *pc,
> > + target_ulong *cs_base, uint32_t
> > *flags)
> > +{
> > + *pc = env->pc;
> > + *cs_base = 0;
> > + *flags = deposit32(*flags, PSW_PM, 1, env->psw_pm);
>
> It might be worthwhile to include PSW_U. I'll discuss elsewhere
PSW_U is not affected translation now.
If translate switches ISP / USP when it refers to the stack pointer,
it needs to include the U bit here.
But translate now uses the copied value, so there is no need to switch.
> > +static inline uint32_t pack_psw(CPURXState *env)
>
> Why is this missing rx_cpu_ prefix, to match rx_cpu_unpack_psw?
OK. Added prefix.
> > +static bool rx_cpu_has_work(CPUState *cs)
> > +{
> > + return cs->interrupt_request & CPU_INTERRUPT_HARD;
>
> Surely CPU_INTERRUPT_FIR needs to be included here.
Yes. FIR is special hardware interrupt.
> > +static void rx_cpu_reset(CPUState *s)
> > +{
> > + RXCPU *cpu = RXCPU(s);
> > + RXCPUClass *rcc = RXCPU_GET_CLASS(cpu);
> > + CPURXState *env = &cpu->env;
> > + uint32_t *resetvec;
> > +
> > + rcc->parent_reset(s);
> > +
> > + memset(env, 0, offsetof(CPURXState, end_reset_fields));
> > +
> > + resetvec = rom_ptr(0xfffffffc, 4);
> > + if (resetvec) {
> > + /* In the case of kernel, it is ignored because it is not set. */
> > + env->pc = ldl_p(resetvec);
> > + }
> > + env->psw = 0x00000000;
>
> You can't just assign, you need.
>
> rx_cpu_unpack_psw(env, 0, 1);
>
> And, as a reminder from patch 2 review, set fp_status here.
OK.
> > +static uint32_t extable[32];
> > +
> > +void rx_load_image(RXCPU *cpu, const char *filename,
> > + uint32_t start, uint32_t size)
> > +{
> > + long kernel_size;
> > + int i;
> > +
> > + kernel_size = load_image_targphys(filename, start, size);
> > + if (kernel_size < 0) {
> > + fprintf(stderr, "qemu: could not load kernel '%s'\n", filename);
> > + exit(1);
> > + }
> > + cpu->env.pc = start;
> > +
> > + /* setup exception trap trampoline */
> > + for (i = 0; i < 32; i++) {
> > + extable[i] = 0x10 + i * 4;
> > + }
>
> These assignments need to be in target-endianness, not host-endianness.
>
> Since RX is currently little-endian only, perhaps just
>
> extable[i] = cpu_to_le32(0x10 + i * 4);
OK.
This part use only little-endian mode. no problem.
> > + rom_add_blob_fixed("extable", extable, sizeof(extable), 0xffffff80);
> > +}
> >
>
>
>
> r~
>
--
Yosinori Sato
- [Qemu-devel] [PATCH RFC v4 10/12] Add rx-softmmu, (continued)
- [Qemu-devel] [PATCH RFC v4 10/12] Add rx-softmmu, Yoshinori Sato, 2019/03/20
- [Qemu-devel] [PATCH RFC v4 11/12] MAINTAINERS: Add RX, Yoshinori Sato, 2019/03/20
- [Qemu-devel] [PATCH RFC v4 06/12] hw/intc: RX62N interrupt controller (ICUa), Yoshinori Sato, 2019/03/20
- [Qemu-devel] [PATCH RFC v4 12/12] include/hw/regiserfields.h: Add 8bit and 16bit registers, Yoshinori Sato, 2019/03/20
- [Qemu-devel] [PATCH RFC v4 05/12] target/rx: Miscellaneous files, Yoshinori Sato, 2019/03/20
- [Qemu-devel] [PATCH RFC v4 04/12] target/rx: RX disassembler, Yoshinori Sato, 2019/03/20
- [Qemu-devel] [PATCH RFC v4 03/12] target/rx: CPU definition, Yoshinori Sato, 2019/03/20
[Qemu-devel] [PATCH RFC v4 09/12] hw/rx: RX Target hardware definition, Yoshinori Sato, 2019/03/20
[Qemu-devel] [PATCH RFC v4 02/12] target/rx: TCG helper, Yoshinori Sato, 2019/03/20
[Qemu-devel] [PATCH RFC v4 07/12] hw/timer: RX62N internal timer modules, Yoshinori Sato, 2019/03/20
[Qemu-devel] [PATCH RFC v4 08/12] hw/char: RX62N serical communication interface (SCI), Yoshinori Sato, 2019/03/20
[Qemu-devel] [PATCH RFC v4 01/12] target/rx: TCG translation, Yoshinori Sato, 2019/03/20
Re: [Qemu-devel] [PATCH RFC v4 01/12] target/rx: TCG translation, Richard Henderson, 2019/03/21