xref: /openbmc/qemu/target/rx/cpu.h (revision 9348028e)
127a4a30eSYoshinori Sato /*
227a4a30eSYoshinori Sato  *  RX emulation definition
327a4a30eSYoshinori Sato  *
427a4a30eSYoshinori Sato  *  Copyright (c) 2019 Yoshinori Sato
527a4a30eSYoshinori Sato  *
627a4a30eSYoshinori Sato  * This program is free software; you can redistribute it and/or modify it
727a4a30eSYoshinori Sato  * under the terms and conditions of the GNU General Public License,
827a4a30eSYoshinori Sato  * version 2 or later, as published by the Free Software Foundation.
927a4a30eSYoshinori Sato  *
1027a4a30eSYoshinori Sato  * This program is distributed in the hope it will be useful, but WITHOUT
1127a4a30eSYoshinori Sato  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1227a4a30eSYoshinori Sato  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1327a4a30eSYoshinori Sato  * more details.
1427a4a30eSYoshinori Sato  *
1527a4a30eSYoshinori Sato  * You should have received a copy of the GNU General Public License along with
1627a4a30eSYoshinori Sato  * this program.  If not, see <http://www.gnu.org/licenses/>.
1727a4a30eSYoshinori Sato  */
1827a4a30eSYoshinori Sato 
1927a4a30eSYoshinori Sato #ifndef RX_CPU_H
2027a4a30eSYoshinori Sato #define RX_CPU_H
2127a4a30eSYoshinori Sato 
2227a4a30eSYoshinori Sato #include "qemu/bitops.h"
2327a4a30eSYoshinori Sato #include "hw/registerfields.h"
2427a4a30eSYoshinori Sato #include "cpu-qom.h"
2527a4a30eSYoshinori Sato 
2627a4a30eSYoshinori Sato #include "exec/cpu-defs.h"
2769242e7eSMarc-André Lureau #include "qemu/cpu-float.h"
2827a4a30eSYoshinori Sato 
2927a4a30eSYoshinori Sato /* PSW define */
3027a4a30eSYoshinori Sato REG32(PSW, 0)
3127a4a30eSYoshinori Sato FIELD(PSW, C, 0, 1)
3227a4a30eSYoshinori Sato FIELD(PSW, Z, 1, 1)
3327a4a30eSYoshinori Sato FIELD(PSW, S, 2, 1)
3427a4a30eSYoshinori Sato FIELD(PSW, O, 3, 1)
3527a4a30eSYoshinori Sato FIELD(PSW, I, 16, 1)
3627a4a30eSYoshinori Sato FIELD(PSW, U, 17, 1)
3727a4a30eSYoshinori Sato FIELD(PSW, PM, 20, 1)
3827a4a30eSYoshinori Sato FIELD(PSW, IPL, 24, 4)
3927a4a30eSYoshinori Sato 
4027a4a30eSYoshinori Sato /* FPSW define */
4127a4a30eSYoshinori Sato REG32(FPSW, 0)
4227a4a30eSYoshinori Sato FIELD(FPSW, RM, 0, 2)
4327a4a30eSYoshinori Sato FIELD(FPSW, CV, 2, 1)
4427a4a30eSYoshinori Sato FIELD(FPSW, CO, 3, 1)
4527a4a30eSYoshinori Sato FIELD(FPSW, CZ, 4, 1)
4627a4a30eSYoshinori Sato FIELD(FPSW, CU, 5, 1)
4727a4a30eSYoshinori Sato FIELD(FPSW, CX, 6, 1)
4827a4a30eSYoshinori Sato FIELD(FPSW, CE, 7, 1)
4927a4a30eSYoshinori Sato FIELD(FPSW, CAUSE, 2, 6)
5027a4a30eSYoshinori Sato FIELD(FPSW, DN, 8, 1)
5127a4a30eSYoshinori Sato FIELD(FPSW, EV, 10, 1)
5227a4a30eSYoshinori Sato FIELD(FPSW, EO, 11, 1)
5327a4a30eSYoshinori Sato FIELD(FPSW, EZ, 12, 1)
5427a4a30eSYoshinori Sato FIELD(FPSW, EU, 13, 1)
5527a4a30eSYoshinori Sato FIELD(FPSW, EX, 14, 1)
5627a4a30eSYoshinori Sato FIELD(FPSW, ENABLE, 10, 5)
5727a4a30eSYoshinori Sato FIELD(FPSW, FV, 26, 1)
5827a4a30eSYoshinori Sato FIELD(FPSW, FO, 27, 1)
5927a4a30eSYoshinori Sato FIELD(FPSW, FZ, 28, 1)
6027a4a30eSYoshinori Sato FIELD(FPSW, FU, 29, 1)
6127a4a30eSYoshinori Sato FIELD(FPSW, FX, 30, 1)
6227a4a30eSYoshinori Sato FIELD(FPSW, FLAGS, 26, 4)
6327a4a30eSYoshinori Sato FIELD(FPSW, FS, 31, 1)
6427a4a30eSYoshinori Sato 
6527a4a30eSYoshinori Sato enum {
6627a4a30eSYoshinori Sato     NUM_REGS = 16,
6727a4a30eSYoshinori Sato };
6827a4a30eSYoshinori Sato 
691ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
7027a4a30eSYoshinori Sato     /* CPU registers */
7127a4a30eSYoshinori Sato     uint32_t regs[NUM_REGS];    /* general registers */
7227a4a30eSYoshinori Sato     uint32_t psw_o;             /* O bit of status register */
7327a4a30eSYoshinori Sato     uint32_t psw_s;             /* S bit of status register */
7427a4a30eSYoshinori Sato     uint32_t psw_z;             /* Z bit of status register */
7527a4a30eSYoshinori Sato     uint32_t psw_c;             /* C bit of status register */
7627a4a30eSYoshinori Sato     uint32_t psw_u;
7727a4a30eSYoshinori Sato     uint32_t psw_i;
7827a4a30eSYoshinori Sato     uint32_t psw_pm;
7927a4a30eSYoshinori Sato     uint32_t psw_ipl;
8027a4a30eSYoshinori Sato     uint32_t bpsw;              /* backup status */
8127a4a30eSYoshinori Sato     uint32_t bpc;               /* backup pc */
8227a4a30eSYoshinori Sato     uint32_t isp;               /* global base register */
8327a4a30eSYoshinori Sato     uint32_t usp;               /* vector base register */
8427a4a30eSYoshinori Sato     uint32_t pc;                /* program counter */
8527a4a30eSYoshinori Sato     uint32_t intb;              /* interrupt vector */
8627a4a30eSYoshinori Sato     uint32_t fintv;
8727a4a30eSYoshinori Sato     uint32_t fpsw;
8827a4a30eSYoshinori Sato     uint64_t acc;
8927a4a30eSYoshinori Sato 
9027a4a30eSYoshinori Sato     /* Fields up to this point are cleared by a CPU reset */
9127a4a30eSYoshinori Sato     struct {} end_reset_fields;
9227a4a30eSYoshinori Sato 
9327a4a30eSYoshinori Sato     /* Internal use */
9427a4a30eSYoshinori Sato     uint32_t in_sleep;
9527a4a30eSYoshinori Sato     uint32_t req_irq;           /* Requested interrupt no (hard) */
9627a4a30eSYoshinori Sato     uint32_t req_ipl;           /* Requested interrupt level */
9727a4a30eSYoshinori Sato     uint32_t ack_irq;           /* execute irq */
9827a4a30eSYoshinori Sato     uint32_t ack_ipl;           /* execute ipl */
9927a4a30eSYoshinori Sato     float_status fp_status;
10027a4a30eSYoshinori Sato     qemu_irq ack;               /* Interrupt acknowledge */
10127a4a30eSYoshinori Sato } CPURXState;
10227a4a30eSYoshinori Sato 
10327a4a30eSYoshinori Sato /*
10427a4a30eSYoshinori Sato  * RXCPU:
10527a4a30eSYoshinori Sato  * @env: #CPURXState
10627a4a30eSYoshinori Sato  *
10727a4a30eSYoshinori Sato  * A RX CPU
10827a4a30eSYoshinori Sato  */
109b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
11027a4a30eSYoshinori Sato     CPUState parent_obj;
11127a4a30eSYoshinori Sato 
11227a4a30eSYoshinori Sato     CPURXState env;
11327a4a30eSYoshinori Sato };
11427a4a30eSYoshinori Sato 
115*9348028eSPhilippe Mathieu-Daudé /*
116*9348028eSPhilippe Mathieu-Daudé  * RXCPUClass:
117*9348028eSPhilippe Mathieu-Daudé  * @parent_realize: The parent class' realize handler.
118*9348028eSPhilippe Mathieu-Daudé  * @parent_phases: The parent class' reset phase handlers.
119*9348028eSPhilippe Mathieu-Daudé  *
120*9348028eSPhilippe Mathieu-Daudé  * A RX CPU model.
121*9348028eSPhilippe Mathieu-Daudé  */
122*9348028eSPhilippe Mathieu-Daudé struct RXCPUClass {
123*9348028eSPhilippe Mathieu-Daudé     CPUClass parent_class;
124*9348028eSPhilippe Mathieu-Daudé 
125*9348028eSPhilippe Mathieu-Daudé     DeviceRealize parent_realize;
126*9348028eSPhilippe Mathieu-Daudé     ResettablePhases parent_phases;
127*9348028eSPhilippe Mathieu-Daudé };
128*9348028eSPhilippe Mathieu-Daudé 
12927a4a30eSYoshinori Sato #define CPU_RESOLVING_TYPE TYPE_RX_CPU
13027a4a30eSYoshinori Sato 
13127a4a30eSYoshinori Sato const char *rx_crname(uint8_t cr);
13265c575b6SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
13327a4a30eSYoshinori Sato void rx_cpu_do_interrupt(CPUState *cpu);
13427a4a30eSYoshinori Sato bool rx_cpu_exec_interrupt(CPUState *cpu, int int_req);
1356d2d454aSPhilippe Mathieu-Daudé hwaddr rx_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
13665c575b6SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
13727a4a30eSYoshinori Sato void rx_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
13827a4a30eSYoshinori Sato int rx_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
13927a4a30eSYoshinori Sato int rx_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
14027a4a30eSYoshinori Sato 
14127a4a30eSYoshinori Sato void rx_translate_init(void);
14227a4a30eSYoshinori Sato void rx_cpu_list(void);
14327a4a30eSYoshinori Sato void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte);
14427a4a30eSYoshinori Sato 
14527a4a30eSYoshinori Sato #define cpu_list rx_cpu_list
14627a4a30eSYoshinori Sato 
14727a4a30eSYoshinori Sato #include "exec/cpu-all.h"
14827a4a30eSYoshinori Sato 
14927a4a30eSYoshinori Sato #define CPU_INTERRUPT_SOFT CPU_INTERRUPT_TGT_INT_0
15027a4a30eSYoshinori Sato #define CPU_INTERRUPT_FIR  CPU_INTERRUPT_TGT_INT_1
15127a4a30eSYoshinori Sato 
15227a4a30eSYoshinori Sato #define RX_CPU_IRQ 0
15327a4a30eSYoshinori Sato #define RX_CPU_FIR 1
15427a4a30eSYoshinori Sato 
cpu_get_tb_cpu_state(CPURXState * env,vaddr * pc,uint64_t * cs_base,uint32_t * flags)155bb5de525SAnton Johansson static inline void cpu_get_tb_cpu_state(CPURXState *env, vaddr *pc,
156bb5de525SAnton Johansson                                         uint64_t *cs_base, uint32_t *flags)
15727a4a30eSYoshinori Sato {
15827a4a30eSYoshinori Sato     *pc = env->pc;
15927a4a30eSYoshinori Sato     *cs_base = 0;
16027a4a30eSYoshinori Sato     *flags = FIELD_DP32(0, PSW, PM, env->psw_pm);
1613626a3feSRichard Henderson     *flags = FIELD_DP32(*flags, PSW, U, env->psw_u);
16227a4a30eSYoshinori Sato }
16327a4a30eSYoshinori Sato 
cpu_mmu_index(CPURXState * env,bool ifetch)16427a4a30eSYoshinori Sato static inline int cpu_mmu_index(CPURXState *env, bool ifetch)
16527a4a30eSYoshinori Sato {
16627a4a30eSYoshinori Sato     return 0;
16727a4a30eSYoshinori Sato }
16827a4a30eSYoshinori Sato 
rx_cpu_pack_psw(CPURXState * env)16927a4a30eSYoshinori Sato static inline uint32_t rx_cpu_pack_psw(CPURXState *env)
17027a4a30eSYoshinori Sato {
17127a4a30eSYoshinori Sato     uint32_t psw = 0;
17227a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, IPL, env->psw_ipl);
17327a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, PM,  env->psw_pm);
17427a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, U,   env->psw_u);
17527a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, I,   env->psw_i);
17627a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, O,   env->psw_o >> 31);
17727a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, S,   env->psw_s >> 31);
17827a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, Z,   env->psw_z == 0);
17927a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, C,   env->psw_c);
18027a4a30eSYoshinori Sato     return psw;
18127a4a30eSYoshinori Sato }
18227a4a30eSYoshinori Sato 
18327a4a30eSYoshinori Sato #endif /* RX_CPU_H */
184