xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/m32c/cpu.h (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
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