1*27a4a30eSYoshinori Sato /* 2*27a4a30eSYoshinori Sato * RX emulation definition 3*27a4a30eSYoshinori Sato * 4*27a4a30eSYoshinori Sato * Copyright (c) 2019 Yoshinori Sato 5*27a4a30eSYoshinori Sato * 6*27a4a30eSYoshinori Sato * This program is free software; you can redistribute it and/or modify it 7*27a4a30eSYoshinori Sato * under the terms and conditions of the GNU General Public License, 8*27a4a30eSYoshinori Sato * version 2 or later, as published by the Free Software Foundation. 9*27a4a30eSYoshinori Sato * 10*27a4a30eSYoshinori Sato * This program is distributed in the hope it will be useful, but WITHOUT 11*27a4a30eSYoshinori Sato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*27a4a30eSYoshinori Sato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*27a4a30eSYoshinori Sato * more details. 14*27a4a30eSYoshinori Sato * 15*27a4a30eSYoshinori Sato * You should have received a copy of the GNU General Public License along with 16*27a4a30eSYoshinori Sato * this program. If not, see <http://www.gnu.org/licenses/>. 17*27a4a30eSYoshinori Sato */ 18*27a4a30eSYoshinori Sato 19*27a4a30eSYoshinori Sato #ifndef RX_CPU_H 20*27a4a30eSYoshinori Sato #define RX_CPU_H 21*27a4a30eSYoshinori Sato 22*27a4a30eSYoshinori Sato #include "qemu/bitops.h" 23*27a4a30eSYoshinori Sato #include "qemu-common.h" 24*27a4a30eSYoshinori Sato #include "hw/registerfields.h" 25*27a4a30eSYoshinori Sato #include "cpu-qom.h" 26*27a4a30eSYoshinori Sato 27*27a4a30eSYoshinori Sato #include "exec/cpu-defs.h" 28*27a4a30eSYoshinori Sato 29*27a4a30eSYoshinori Sato /* PSW define */ 30*27a4a30eSYoshinori Sato REG32(PSW, 0) 31*27a4a30eSYoshinori Sato FIELD(PSW, C, 0, 1) 32*27a4a30eSYoshinori Sato FIELD(PSW, Z, 1, 1) 33*27a4a30eSYoshinori Sato FIELD(PSW, S, 2, 1) 34*27a4a30eSYoshinori Sato FIELD(PSW, O, 3, 1) 35*27a4a30eSYoshinori Sato FIELD(PSW, I, 16, 1) 36*27a4a30eSYoshinori Sato FIELD(PSW, U, 17, 1) 37*27a4a30eSYoshinori Sato FIELD(PSW, PM, 20, 1) 38*27a4a30eSYoshinori Sato FIELD(PSW, IPL, 24, 4) 39*27a4a30eSYoshinori Sato 40*27a4a30eSYoshinori Sato /* FPSW define */ 41*27a4a30eSYoshinori Sato REG32(FPSW, 0) 42*27a4a30eSYoshinori Sato FIELD(FPSW, RM, 0, 2) 43*27a4a30eSYoshinori Sato FIELD(FPSW, CV, 2, 1) 44*27a4a30eSYoshinori Sato FIELD(FPSW, CO, 3, 1) 45*27a4a30eSYoshinori Sato FIELD(FPSW, CZ, 4, 1) 46*27a4a30eSYoshinori Sato FIELD(FPSW, CU, 5, 1) 47*27a4a30eSYoshinori Sato FIELD(FPSW, CX, 6, 1) 48*27a4a30eSYoshinori Sato FIELD(FPSW, CE, 7, 1) 49*27a4a30eSYoshinori Sato FIELD(FPSW, CAUSE, 2, 6) 50*27a4a30eSYoshinori Sato FIELD(FPSW, DN, 8, 1) 51*27a4a30eSYoshinori Sato FIELD(FPSW, EV, 10, 1) 52*27a4a30eSYoshinori Sato FIELD(FPSW, EO, 11, 1) 53*27a4a30eSYoshinori Sato FIELD(FPSW, EZ, 12, 1) 54*27a4a30eSYoshinori Sato FIELD(FPSW, EU, 13, 1) 55*27a4a30eSYoshinori Sato FIELD(FPSW, EX, 14, 1) 56*27a4a30eSYoshinori Sato FIELD(FPSW, ENABLE, 10, 5) 57*27a4a30eSYoshinori Sato FIELD(FPSW, FV, 26, 1) 58*27a4a30eSYoshinori Sato FIELD(FPSW, FO, 27, 1) 59*27a4a30eSYoshinori Sato FIELD(FPSW, FZ, 28, 1) 60*27a4a30eSYoshinori Sato FIELD(FPSW, FU, 29, 1) 61*27a4a30eSYoshinori Sato FIELD(FPSW, FX, 30, 1) 62*27a4a30eSYoshinori Sato FIELD(FPSW, FLAGS, 26, 4) 63*27a4a30eSYoshinori Sato FIELD(FPSW, FS, 31, 1) 64*27a4a30eSYoshinori Sato 65*27a4a30eSYoshinori Sato enum { 66*27a4a30eSYoshinori Sato NUM_REGS = 16, 67*27a4a30eSYoshinori Sato }; 68*27a4a30eSYoshinori Sato 69*27a4a30eSYoshinori Sato typedef struct CPURXState { 70*27a4a30eSYoshinori Sato /* CPU registers */ 71*27a4a30eSYoshinori Sato uint32_t regs[NUM_REGS]; /* general registers */ 72*27a4a30eSYoshinori Sato uint32_t psw_o; /* O bit of status register */ 73*27a4a30eSYoshinori Sato uint32_t psw_s; /* S bit of status register */ 74*27a4a30eSYoshinori Sato uint32_t psw_z; /* Z bit of status register */ 75*27a4a30eSYoshinori Sato uint32_t psw_c; /* C bit of status register */ 76*27a4a30eSYoshinori Sato uint32_t psw_u; 77*27a4a30eSYoshinori Sato uint32_t psw_i; 78*27a4a30eSYoshinori Sato uint32_t psw_pm; 79*27a4a30eSYoshinori Sato uint32_t psw_ipl; 80*27a4a30eSYoshinori Sato uint32_t bpsw; /* backup status */ 81*27a4a30eSYoshinori Sato uint32_t bpc; /* backup pc */ 82*27a4a30eSYoshinori Sato uint32_t isp; /* global base register */ 83*27a4a30eSYoshinori Sato uint32_t usp; /* vector base register */ 84*27a4a30eSYoshinori Sato uint32_t pc; /* program counter */ 85*27a4a30eSYoshinori Sato uint32_t intb; /* interrupt vector */ 86*27a4a30eSYoshinori Sato uint32_t fintv; 87*27a4a30eSYoshinori Sato uint32_t fpsw; 88*27a4a30eSYoshinori Sato uint64_t acc; 89*27a4a30eSYoshinori Sato 90*27a4a30eSYoshinori Sato /* Fields up to this point are cleared by a CPU reset */ 91*27a4a30eSYoshinori Sato struct {} end_reset_fields; 92*27a4a30eSYoshinori Sato 93*27a4a30eSYoshinori Sato /* Internal use */ 94*27a4a30eSYoshinori Sato uint32_t in_sleep; 95*27a4a30eSYoshinori Sato uint32_t req_irq; /* Requested interrupt no (hard) */ 96*27a4a30eSYoshinori Sato uint32_t req_ipl; /* Requested interrupt level */ 97*27a4a30eSYoshinori Sato uint32_t ack_irq; /* execute irq */ 98*27a4a30eSYoshinori Sato uint32_t ack_ipl; /* execute ipl */ 99*27a4a30eSYoshinori Sato float_status fp_status; 100*27a4a30eSYoshinori Sato qemu_irq ack; /* Interrupt acknowledge */ 101*27a4a30eSYoshinori Sato } CPURXState; 102*27a4a30eSYoshinori Sato 103*27a4a30eSYoshinori Sato /* 104*27a4a30eSYoshinori Sato * RXCPU: 105*27a4a30eSYoshinori Sato * @env: #CPURXState 106*27a4a30eSYoshinori Sato * 107*27a4a30eSYoshinori Sato * A RX CPU 108*27a4a30eSYoshinori Sato */ 109*27a4a30eSYoshinori Sato struct RXCPU { 110*27a4a30eSYoshinori Sato /*< private >*/ 111*27a4a30eSYoshinori Sato CPUState parent_obj; 112*27a4a30eSYoshinori Sato /*< public >*/ 113*27a4a30eSYoshinori Sato 114*27a4a30eSYoshinori Sato CPUNegativeOffsetState neg; 115*27a4a30eSYoshinori Sato CPURXState env; 116*27a4a30eSYoshinori Sato }; 117*27a4a30eSYoshinori Sato 118*27a4a30eSYoshinori Sato typedef struct RXCPU RXCPU; 119*27a4a30eSYoshinori Sato typedef RXCPU ArchCPU; 120*27a4a30eSYoshinori Sato 121*27a4a30eSYoshinori Sato #define ENV_OFFSET offsetof(RXCPU, env) 122*27a4a30eSYoshinori Sato 123*27a4a30eSYoshinori Sato #define RX_CPU_TYPE_SUFFIX "-" TYPE_RX_CPU 124*27a4a30eSYoshinori Sato #define RX_CPU_TYPE_NAME(model) model RX_CPU_TYPE_SUFFIX 125*27a4a30eSYoshinori Sato #define CPU_RESOLVING_TYPE TYPE_RX_CPU 126*27a4a30eSYoshinori Sato 127*27a4a30eSYoshinori Sato const char *rx_crname(uint8_t cr); 128*27a4a30eSYoshinori Sato void rx_cpu_do_interrupt(CPUState *cpu); 129*27a4a30eSYoshinori Sato bool rx_cpu_exec_interrupt(CPUState *cpu, int int_req); 130*27a4a30eSYoshinori Sato void rx_cpu_dump_state(CPUState *cpu, FILE *f, int flags); 131*27a4a30eSYoshinori Sato int rx_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); 132*27a4a30eSYoshinori Sato int rx_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); 133*27a4a30eSYoshinori Sato hwaddr rx_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); 134*27a4a30eSYoshinori Sato 135*27a4a30eSYoshinori Sato void rx_translate_init(void); 136*27a4a30eSYoshinori Sato int cpu_rx_signal_handler(int host_signum, void *pinfo, 137*27a4a30eSYoshinori Sato void *puc); 138*27a4a30eSYoshinori Sato 139*27a4a30eSYoshinori Sato void rx_cpu_list(void); 140*27a4a30eSYoshinori Sato void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte); 141*27a4a30eSYoshinori Sato 142*27a4a30eSYoshinori Sato #define cpu_signal_handler cpu_rx_signal_handler 143*27a4a30eSYoshinori Sato #define cpu_list rx_cpu_list 144*27a4a30eSYoshinori Sato 145*27a4a30eSYoshinori Sato #include "exec/cpu-all.h" 146*27a4a30eSYoshinori Sato 147*27a4a30eSYoshinori Sato #define CPU_INTERRUPT_SOFT CPU_INTERRUPT_TGT_INT_0 148*27a4a30eSYoshinori Sato #define CPU_INTERRUPT_FIR CPU_INTERRUPT_TGT_INT_1 149*27a4a30eSYoshinori Sato 150*27a4a30eSYoshinori Sato #define RX_CPU_IRQ 0 151*27a4a30eSYoshinori Sato #define RX_CPU_FIR 1 152*27a4a30eSYoshinori Sato 153*27a4a30eSYoshinori Sato static inline void cpu_get_tb_cpu_state(CPURXState *env, target_ulong *pc, 154*27a4a30eSYoshinori Sato target_ulong *cs_base, uint32_t *flags) 155*27a4a30eSYoshinori Sato { 156*27a4a30eSYoshinori Sato *pc = env->pc; 157*27a4a30eSYoshinori Sato *cs_base = 0; 158*27a4a30eSYoshinori Sato *flags = FIELD_DP32(0, PSW, PM, env->psw_pm); 159*27a4a30eSYoshinori Sato } 160*27a4a30eSYoshinori Sato 161*27a4a30eSYoshinori Sato static inline int cpu_mmu_index(CPURXState *env, bool ifetch) 162*27a4a30eSYoshinori Sato { 163*27a4a30eSYoshinori Sato return 0; 164*27a4a30eSYoshinori Sato } 165*27a4a30eSYoshinori Sato 166*27a4a30eSYoshinori Sato static inline uint32_t rx_cpu_pack_psw(CPURXState *env) 167*27a4a30eSYoshinori Sato { 168*27a4a30eSYoshinori Sato uint32_t psw = 0; 169*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, IPL, env->psw_ipl); 170*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, PM, env->psw_pm); 171*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, U, env->psw_u); 172*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, I, env->psw_i); 173*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, O, env->psw_o >> 31); 174*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, S, env->psw_s >> 31); 175*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, Z, env->psw_z == 0); 176*27a4a30eSYoshinori Sato psw = FIELD_DP32(psw, PSW, C, env->psw_c); 177*27a4a30eSYoshinori Sato return psw; 178*27a4a30eSYoshinori Sato } 179*27a4a30eSYoshinori Sato 180*27a4a30eSYoshinori Sato #endif /* RX_CPU_H */ 181