xref: /qemu/target/rx/cpu.h (revision 7cef6d686309e2792186504ae17cf4f3eb57ef68)
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 
26*d97c3b06SPierrick Bouvier #include "exec/cpu-common.h"
2727a4a30eSYoshinori Sato #include "exec/cpu-defs.h"
2822a7c2f2SPierrick Bouvier #include "exec/cpu-interrupt.h"
2969242e7eSMarc-André Lureau #include "qemu/cpu-float.h"
3027a4a30eSYoshinori Sato 
31edee3da2SPhilippe Mathieu-Daudé #ifdef CONFIG_USER_ONLY
32edee3da2SPhilippe Mathieu-Daudé #error "RX does not support user mode emulation"
33edee3da2SPhilippe Mathieu-Daudé #endif
34edee3da2SPhilippe Mathieu-Daudé 
3527a4a30eSYoshinori Sato /* PSW define */
3627a4a30eSYoshinori Sato REG32(PSW, 0)
3727a4a30eSYoshinori Sato FIELD(PSW, C, 0, 1)
3827a4a30eSYoshinori Sato FIELD(PSW, Z, 1, 1)
3927a4a30eSYoshinori Sato FIELD(PSW, S, 2, 1)
4027a4a30eSYoshinori Sato FIELD(PSW, O, 3, 1)
4127a4a30eSYoshinori Sato FIELD(PSW, I, 16, 1)
4227a4a30eSYoshinori Sato FIELD(PSW, U, 17, 1)
4327a4a30eSYoshinori Sato FIELD(PSW, PM, 20, 1)
4427a4a30eSYoshinori Sato FIELD(PSW, IPL, 24, 4)
4527a4a30eSYoshinori Sato 
4627a4a30eSYoshinori Sato /* FPSW define */
4727a4a30eSYoshinori Sato REG32(FPSW, 0)
4827a4a30eSYoshinori Sato FIELD(FPSW, RM, 0, 2)
4927a4a30eSYoshinori Sato FIELD(FPSW, CV, 2, 1)
5027a4a30eSYoshinori Sato FIELD(FPSW, CO, 3, 1)
5127a4a30eSYoshinori Sato FIELD(FPSW, CZ, 4, 1)
5227a4a30eSYoshinori Sato FIELD(FPSW, CU, 5, 1)
5327a4a30eSYoshinori Sato FIELD(FPSW, CX, 6, 1)
5427a4a30eSYoshinori Sato FIELD(FPSW, CE, 7, 1)
5527a4a30eSYoshinori Sato FIELD(FPSW, CAUSE, 2, 6)
5627a4a30eSYoshinori Sato FIELD(FPSW, DN, 8, 1)
5727a4a30eSYoshinori Sato FIELD(FPSW, EV, 10, 1)
5827a4a30eSYoshinori Sato FIELD(FPSW, EO, 11, 1)
5927a4a30eSYoshinori Sato FIELD(FPSW, EZ, 12, 1)
6027a4a30eSYoshinori Sato FIELD(FPSW, EU, 13, 1)
6127a4a30eSYoshinori Sato FIELD(FPSW, EX, 14, 1)
6227a4a30eSYoshinori Sato FIELD(FPSW, ENABLE, 10, 5)
6327a4a30eSYoshinori Sato FIELD(FPSW, FV, 26, 1)
6427a4a30eSYoshinori Sato FIELD(FPSW, FO, 27, 1)
6527a4a30eSYoshinori Sato FIELD(FPSW, FZ, 28, 1)
6627a4a30eSYoshinori Sato FIELD(FPSW, FU, 29, 1)
6727a4a30eSYoshinori Sato FIELD(FPSW, FX, 30, 1)
6827a4a30eSYoshinori Sato FIELD(FPSW, FLAGS, 26, 4)
6927a4a30eSYoshinori Sato FIELD(FPSW, FS, 31, 1)
7027a4a30eSYoshinori Sato 
7127a4a30eSYoshinori Sato enum {
7227a4a30eSYoshinori Sato     NUM_REGS = 16,
7327a4a30eSYoshinori Sato };
7427a4a30eSYoshinori Sato 
751ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
7627a4a30eSYoshinori Sato     /* CPU registers */
7727a4a30eSYoshinori Sato     uint32_t regs[NUM_REGS];    /* general registers */
7827a4a30eSYoshinori Sato     uint32_t psw_o;             /* O bit of status register */
7927a4a30eSYoshinori Sato     uint32_t psw_s;             /* S bit of status register */
8027a4a30eSYoshinori Sato     uint32_t psw_z;             /* Z bit of status register */
8127a4a30eSYoshinori Sato     uint32_t psw_c;             /* C bit of status register */
8227a4a30eSYoshinori Sato     uint32_t psw_u;
8327a4a30eSYoshinori Sato     uint32_t psw_i;
8427a4a30eSYoshinori Sato     uint32_t psw_pm;
8527a4a30eSYoshinori Sato     uint32_t psw_ipl;
8627a4a30eSYoshinori Sato     uint32_t bpsw;              /* backup status */
8727a4a30eSYoshinori Sato     uint32_t bpc;               /* backup pc */
8827a4a30eSYoshinori Sato     uint32_t isp;               /* global base register */
8927a4a30eSYoshinori Sato     uint32_t usp;               /* vector base register */
9027a4a30eSYoshinori Sato     uint32_t pc;                /* program counter */
9127a4a30eSYoshinori Sato     uint32_t intb;              /* interrupt vector */
9227a4a30eSYoshinori Sato     uint32_t fintv;
9327a4a30eSYoshinori Sato     uint32_t fpsw;
9427a4a30eSYoshinori Sato     uint64_t acc;
9527a4a30eSYoshinori Sato 
9627a4a30eSYoshinori Sato     /* Fields up to this point are cleared by a CPU reset */
9727a4a30eSYoshinori Sato     struct {} end_reset_fields;
9827a4a30eSYoshinori Sato 
9927a4a30eSYoshinori Sato     /* Internal use */
10027a4a30eSYoshinori Sato     uint32_t in_sleep;
10127a4a30eSYoshinori Sato     uint32_t req_irq;           /* Requested interrupt no (hard) */
10227a4a30eSYoshinori Sato     uint32_t req_ipl;           /* Requested interrupt level */
10327a4a30eSYoshinori Sato     uint32_t ack_irq;           /* execute irq */
10427a4a30eSYoshinori Sato     uint32_t ack_ipl;           /* execute ipl */
10527a4a30eSYoshinori Sato     float_status fp_status;
10627a4a30eSYoshinori Sato     qemu_irq ack;               /* Interrupt acknowledge */
10727a4a30eSYoshinori Sato } CPURXState;
10827a4a30eSYoshinori Sato 
10927a4a30eSYoshinori Sato /*
11027a4a30eSYoshinori Sato  * RXCPU:
11127a4a30eSYoshinori Sato  * @env: #CPURXState
11227a4a30eSYoshinori Sato  *
11327a4a30eSYoshinori Sato  * A RX CPU
11427a4a30eSYoshinori Sato  */
115b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
11627a4a30eSYoshinori Sato     CPUState parent_obj;
11727a4a30eSYoshinori Sato 
11827a4a30eSYoshinori Sato     CPURXState env;
11927a4a30eSYoshinori Sato };
12027a4a30eSYoshinori Sato 
1219348028eSPhilippe Mathieu-Daudé /*
1229348028eSPhilippe Mathieu-Daudé  * RXCPUClass:
1239348028eSPhilippe Mathieu-Daudé  * @parent_realize: The parent class' realize handler.
1249348028eSPhilippe Mathieu-Daudé  * @parent_phases: The parent class' reset phase handlers.
1259348028eSPhilippe Mathieu-Daudé  *
1269348028eSPhilippe Mathieu-Daudé  * A RX CPU model.
1279348028eSPhilippe Mathieu-Daudé  */
1289348028eSPhilippe Mathieu-Daudé struct RXCPUClass {
1299348028eSPhilippe Mathieu-Daudé     CPUClass parent_class;
1309348028eSPhilippe Mathieu-Daudé 
1319348028eSPhilippe Mathieu-Daudé     DeviceRealize parent_realize;
1329348028eSPhilippe Mathieu-Daudé     ResettablePhases parent_phases;
1339348028eSPhilippe Mathieu-Daudé };
1349348028eSPhilippe Mathieu-Daudé 
13527a4a30eSYoshinori Sato #define CPU_RESOLVING_TYPE TYPE_RX_CPU
13627a4a30eSYoshinori Sato 
13727a4a30eSYoshinori Sato const char *rx_crname(uint8_t cr);
13827a4a30eSYoshinori Sato void rx_cpu_do_interrupt(CPUState *cpu);
13927a4a30eSYoshinori Sato bool rx_cpu_exec_interrupt(CPUState *cpu, int int_req);
1406d2d454aSPhilippe Mathieu-Daudé hwaddr rx_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
14127a4a30eSYoshinori Sato void rx_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
14227a4a30eSYoshinori Sato int rx_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
14327a4a30eSYoshinori Sato int rx_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
14427a4a30eSYoshinori Sato 
14527a4a30eSYoshinori Sato void rx_translate_init(void);
146e4a8e093SRichard Henderson void rx_translate_code(CPUState *cs, TranslationBlock *tb,
147e4a8e093SRichard Henderson                        int *max_insns, vaddr pc, void *host_pc);
14827a4a30eSYoshinori Sato void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte);
14927a4a30eSYoshinori Sato 
15027a4a30eSYoshinori Sato #define CPU_INTERRUPT_SOFT CPU_INTERRUPT_TGT_INT_0
15127a4a30eSYoshinori Sato #define CPU_INTERRUPT_FIR  CPU_INTERRUPT_TGT_INT_1
15227a4a30eSYoshinori Sato 
15327a4a30eSYoshinori Sato #define RX_CPU_IRQ 0
15427a4a30eSYoshinori Sato #define RX_CPU_FIR 1
15527a4a30eSYoshinori Sato 
rx_cpu_pack_psw(CPURXState * env)15627a4a30eSYoshinori Sato static inline uint32_t rx_cpu_pack_psw(CPURXState *env)
15727a4a30eSYoshinori Sato {
15827a4a30eSYoshinori Sato     uint32_t psw = 0;
15927a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, IPL, env->psw_ipl);
16027a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, PM,  env->psw_pm);
16127a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, U,   env->psw_u);
16227a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, I,   env->psw_i);
16327a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, O,   env->psw_o >> 31);
16427a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, S,   env->psw_s >> 31);
16527a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, Z,   env->psw_z == 0);
16627a4a30eSYoshinori Sato     psw = FIELD_DP32(psw, PSW, C,   env->psw_c);
16727a4a30eSYoshinori Sato     return psw;
16827a4a30eSYoshinori Sato }
16927a4a30eSYoshinori Sato 
17027a4a30eSYoshinori Sato #endif /* RX_CPU_H */
171