1bb16d227Schristos /* cpu.h --- declarations for the M32C core. 2bb16d227Schristos 3*8b657b07Schristos Copyright (C) 2005-2023 Free Software Foundation, Inc. 4bb16d227Schristos Contributed by Red Hat, Inc. 5bb16d227Schristos 6bb16d227Schristos This file is part of the GNU simulators. 7bb16d227Schristos 8bb16d227Schristos This program is free software; you can redistribute it and/or modify 9bb16d227Schristos it under the terms of the GNU General Public License as published by 10bb16d227Schristos the Free Software Foundation; either version 3 of the License, or 11bb16d227Schristos (at your option) any later version. 12bb16d227Schristos 13bb16d227Schristos This program is distributed in the hope that it will be useful, 14bb16d227Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 15bb16d227Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16bb16d227Schristos GNU General Public License for more details. 17bb16d227Schristos 18bb16d227Schristos You should have received a copy of the GNU General Public License 19bb16d227Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20bb16d227Schristos 21bb16d227Schristos 22bb16d227Schristos extern int verbose; 23bb16d227Schristos extern int trace; 24bb16d227Schristos extern int enable_counting; 25bb16d227Schristos 26bb16d227Schristos extern int in_gdb; 27bb16d227Schristos 28bb16d227Schristos typedef unsigned char QI; 29bb16d227Schristos typedef unsigned short HI; 30bb16d227Schristos typedef unsigned long SI; 31bb16d227Schristos typedef unsigned long long DI; 32bb16d227Schristos 33bb16d227Schristos #define CPU_R8C 0x11 34bb16d227Schristos #define CPU_M16C 0x12 35bb16d227Schristos #define CPU_M32CM 0x23 36bb16d227Schristos #define CPU_M32C 0x24 37bb16d227Schristos extern int m32c_cpu; 38bb16d227Schristos void m32c_set_cpu (int cpu); 39bb16d227Schristos 40bb16d227Schristos #define A16 (m32c_cpu & 0x10) 41bb16d227Schristos #define A24 (m32c_cpu & 0x20) 42bb16d227Schristos 43bb16d227Schristos typedef struct 44bb16d227Schristos { 45bb16d227Schristos HI r_r0; 46bb16d227Schristos HI r_r2; 47bb16d227Schristos HI r_r1; 48bb16d227Schristos HI r_r3; 49bb16d227Schristos SI r_a0; 50bb16d227Schristos SI r_a1; 51bb16d227Schristos SI r_sb; 52bb16d227Schristos SI r_fb; 53bb16d227Schristos } reg_bank_type; 54bb16d227Schristos 55bb16d227Schristos typedef struct 56bb16d227Schristos { 57bb16d227Schristos reg_bank_type r[2]; 58bb16d227Schristos QI r_intbh; 59bb16d227Schristos HI r_intbl; 60bb16d227Schristos SI r_usp; 61bb16d227Schristos SI r_isp; 62bb16d227Schristos SI r_pc; 63bb16d227Schristos HI r_flags; 64bb16d227Schristos } regs_type; 65bb16d227Schristos 66bb16d227Schristos extern regs_type regs; 67bb16d227Schristos extern int addr_mask; 68bb16d227Schristos extern int membus_mask; 69bb16d227Schristos 70bb16d227Schristos #define FLAGBIT_C 0x0001 71bb16d227Schristos #define FLAGBIT_D 0x0002 72bb16d227Schristos #define FLAGBIT_Z 0x0004 73bb16d227Schristos #define FLAGBIT_S 0x0008 74bb16d227Schristos #define FLAGBIT_B 0x0010 75bb16d227Schristos #define FLAGBIT_O 0x0020 76bb16d227Schristos #define FLAGBIT_I 0x0040 77bb16d227Schristos #define FLAGBIT_U 0x0080 78bb16d227Schristos 79bb16d227Schristos #define REG_BANK (regs.r_flags & FLAG_B ? 1 : 0) 80bb16d227Schristos 81bb16d227Schristos typedef enum 82bb16d227Schristos { 83bb16d227Schristos mem, 84bb16d227Schristos r0, r0h, r0l, 85bb16d227Schristos r1, r1h, r1l, 86bb16d227Schristos r2, r2r0, 87bb16d227Schristos r3, r3r1, 88bb16d227Schristos r3r1r2r0, 89bb16d227Schristos r3r2r1r0, 90bb16d227Schristos a0, 91bb16d227Schristos a1, a1a0, 92bb16d227Schristos sb, fb, 93bb16d227Schristos intb, intbl, intbh, 94bb16d227Schristos sp, usp, isp, pc, flags, 95bb16d227Schristos num_regs 96bb16d227Schristos } reg_id; 97bb16d227Schristos 98bb16d227Schristos extern char *reg_names[]; 99bb16d227Schristos extern int reg_bytes[]; 100bb16d227Schristos 101bb16d227Schristos extern unsigned int b2mask[]; 102bb16d227Schristos extern unsigned int b2signbit[]; 103bb16d227Schristos extern int b2maxsigned[]; 104bb16d227Schristos extern int b2minsigned[]; 105bb16d227Schristos 106bb16d227Schristos /* address of the opcode that just decoded, and thus caused the 107bb16d227Schristos exception. */ 108bb16d227Schristos extern int m32c_opcode_pc; 109bb16d227Schristos 110bb16d227Schristos void init_regs (void); 111bb16d227Schristos void stack_heap_stats (void); 112bb16d227Schristos void set_pointer_width (int bytes); 113bb16d227Schristos unsigned int get_reg (reg_id id); 114bb16d227Schristos DI get_reg_ll (reg_id id); 115bb16d227Schristos void put_reg (reg_id id, unsigned int value); 116bb16d227Schristos void put_reg_ll (reg_id id, DI value); 117bb16d227Schristos 118bb16d227Schristos void set_flags (int mask, int newbits); 119bb16d227Schristos void set_oszc (int value, int bytes, int c); 120bb16d227Schristos void set_szc (int value, int bytes, int c); 121bb16d227Schristos void set_osz (int value, int bytes); 122bb16d227Schristos void set_sz (int value, int bytes); 123bb16d227Schristos void set_zc (int z, int c); 124bb16d227Schristos void set_c (int c); 125bb16d227Schristos 126bb16d227Schristos const char *bits (int v, int b); 127bb16d227Schristos 128bb16d227Schristos typedef struct 129bb16d227Schristos { 130bb16d227Schristos QI bytes; 131bb16d227Schristos QI mem; 132bb16d227Schristos HI mask; 133bb16d227Schristos union 134bb16d227Schristos { 135bb16d227Schristos unsigned int addr; 136bb16d227Schristos reg_id reg; 137bb16d227Schristos } u; 138bb16d227Schristos } srcdest; 139bb16d227Schristos 140bb16d227Schristos void decode_indirect (int src_indirect, int dest_indirect); 141bb16d227Schristos void decode_index (int src_addend, int dest_addend); 142bb16d227Schristos 143bb16d227Schristos /* r8c */ 144bb16d227Schristos srcdest decode_srcdest4 (int destcode, int bw); 145bb16d227Schristos srcdest decode_dest3 (int destcode, int bw); 146bb16d227Schristos srcdest decode_src2 (int srccode, int bw, int d); 147bb16d227Schristos srcdest decode_dest1 (int destcode, int bw); 148bb16d227Schristos srcdest decode_jumpdest (int destcode, int w); 149bb16d227Schristos srcdest decode_cr (int crcode); 150bb16d227Schristos srcdest decode_cr_b (int crcode, int bank); 151bb16d227Schristos #define CR_B_DCT0 0 152bb16d227Schristos #define CR_B_INTB 1 153bb16d227Schristos #define CR_B_DMA0 2 154bb16d227Schristos 155bb16d227Schristos /* m32c */ 156bb16d227Schristos srcdest decode_dest23 (int ddd, int dd, int bytes); 157bb16d227Schristos srcdest decode_src23 (int sss, int ss, int bytes); 158bb16d227Schristos srcdest decode_src3 (int sss, int bytes); 159bb16d227Schristos srcdest decode_dest2 (int dd, int bytes); 160bb16d227Schristos 161bb16d227Schristos srcdest widen_sd (srcdest sd); 162bb16d227Schristos srcdest reg_sd (reg_id reg); 163bb16d227Schristos 164bb16d227Schristos /* Mask has the one appropriate bit set. */ 165bb16d227Schristos srcdest decode_bit (int destcode); 166bb16d227Schristos srcdest decode_bit11 (int op0); 167bb16d227Schristos int get_bit (srcdest sd); 168bb16d227Schristos void put_bit (srcdest sd, int val); 169bb16d227Schristos int get_bit2 (srcdest sd, int bit); 170bb16d227Schristos void put_bit2 (srcdest sd, int bit, int val); 171bb16d227Schristos 172bb16d227Schristos int get_src (srcdest sd); 173bb16d227Schristos void put_dest (srcdest sd, int value); 174bb16d227Schristos 175bb16d227Schristos int condition_true (int cond_id); 176bb16d227Schristos 177bb16d227Schristos #define FLAG(f) (regs.r_flags & f ? 1 : 0) 178bb16d227Schristos #define FLAG_C FLAG(FLAGBIT_C) 179bb16d227Schristos #define FLAG_D FLAG(FLAGBIT_D) 180bb16d227Schristos #define FLAG_Z FLAG(FLAGBIT_Z) 181bb16d227Schristos #define FLAG_S FLAG(FLAGBIT_S) 182bb16d227Schristos #define FLAG_B FLAG(FLAGBIT_B) 183bb16d227Schristos #define FLAG_O FLAG(FLAGBIT_O) 184bb16d227Schristos #define FLAG_I FLAG(FLAGBIT_I) 185bb16d227Schristos #define FLAG_U FLAG(FLAGBIT_U) 186bb16d227Schristos 187bb16d227Schristos /* Instruction step return codes. 188bb16d227Schristos Suppose one of the decode_* functions below returns a value R: 189bb16d227Schristos - If M32C_STEPPED (R), then the single-step completed normally. 190bb16d227Schristos - If M32C_HIT_BREAK (R), then the program hit a breakpoint. 191bb16d227Schristos - If M32C_EXITED (R), then the program has done an 'exit' system 192bb16d227Schristos call, and the exit code is M32C_EXIT_STATUS (R). 193bb16d227Schristos - If M32C_STOPPED (R), then a signal (number M32C_STOP_SIG (R)) was 194bb16d227Schristos generated. 195bb16d227Schristos 196bb16d227Schristos For building step return codes: 197bb16d227Schristos - M32C_MAKE_STEPPED is the return code for finishing a normal step. 198bb16d227Schristos - M32C_MAKE_HIT_BREAK is the return code for hitting a breakpoint. 199bb16d227Schristos - M32C_MAKE_EXITED (C) is the return code for exiting with status C. 200bb16d227Schristos - M32C_MAKE_STOPPED (S) is the return code for stopping on signal S. */ 201bb16d227Schristos #define M32C_MAKE_STEPPED() (0) 202bb16d227Schristos #define M32C_MAKE_HIT_BREAK() (1) 203bb16d227Schristos #define M32C_MAKE_EXITED(c) (((int) (c) << 8) + 2) 204bb16d227Schristos #define M32C_MAKE_STOPPED(s) (((int) (s) << 8) + 3) 205bb16d227Schristos 206bb16d227Schristos #define M32C_STEPPED(r) ((r) == M32C_MAKE_STEPPED ()) 207bb16d227Schristos #define M32C_HIT_BREAK(r) ((r) == M32C_MAKE_HIT_BREAK ()) 208bb16d227Schristos #define M32C_EXITED(r) (((r) & 0xff) == 2) 209bb16d227Schristos #define M32C_EXIT_STATUS(r) ((r) >> 8) 210bb16d227Schristos #define M32C_STOPPED(r) (((r) & 0xff) == 3) 211bb16d227Schristos #define M32C_STOP_SIG(r) ((r) >> 8) 212bb16d227Schristos 213bb16d227Schristos /* The step result for the current step. Global to allow 214bb16d227Schristos communication between the stepping function and the system 215bb16d227Schristos calls. */ 216bb16d227Schristos extern int step_result; 217bb16d227Schristos 218bb16d227Schristos /* Used to detect heap/stack collisions */ 219bb16d227Schristos extern unsigned int heaptop; 220bb16d227Schristos extern unsigned int heapbottom; 221bb16d227Schristos 222bb16d227Schristos /* Points to one of the below functions, set by m32c_load(). */ 223bb16d227Schristos extern int (*decode_opcode) (void); 224bb16d227Schristos 225bb16d227Schristos extern int decode_r8c (void); 226bb16d227Schristos extern int decode_m32c (void); 227bb16d227Schristos 228bb16d227Schristos extern void trace_register_changes (void); 229bb16d227Schristos 230bb16d227Schristos extern void m32c_dump_all_registers (void); 231