1 /* mem.c --- memory for M32C simulator.
3 Copyright (C) 2005 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
8 The GNU simulators are free software; you can redistribute them and/or
9 modify them under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2 of the
11 License, or (at your option) any later version.
13 The GNU simulators are distributed in the hope that they will be
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with the GNU simulators; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
37 #define L1_LEN (1 << L1_BITS)
38 #define L2_LEN (1 << L2_BITS)
39 #define OFF_LEN (1 << OFF_BITS)
41 static unsigned char **pt[L1_LEN];
43 /* [ get=0/put=1 ][ byte size ] */
44 static unsigned int mem_counters[2][4];
46 #define COUNT(isput,bytes) \
47 if (verbose && enable_counting) mem_counters[isput][bytes]++
54 for (i = 0; i < L1_LEN; i++)
57 for (j = 0; j < L2_LEN; j++)
62 memset (pt, 0, sizeof (pt));
63 memset (mem_counters, 0, sizeof (mem_counters));
66 static unsigned char *
69 int pt1 = (address >> (L2_BITS + OFF_BITS)) & ((1 << L1_BITS) - 1);
70 int pt2 = (address >> OFF_BITS) & ((1 << L2_BITS) - 1);
71 int pto = address & ((1 << OFF_BITS) - 1);
75 printf ("NULL pointer dereference\n");
80 pt[pt1] = (unsigned char **) calloc (L2_LEN, sizeof (char **));
81 if (pt[pt1][pt2] == 0)
83 pt[pt1][pt2] = (unsigned char *) malloc (OFF_LEN);
84 memset (pt[pt1][pt2], 0, OFF_LEN);
87 return pt[pt1][pt2] + pto;
91 used (int rstart, int i, int j)
93 int rend = i << (L2_BITS + OFF_BITS);
94 rend += j << OFF_BITS;
95 if (rstart == 0xe0000 && rend == 0xe1000)
97 printf ("mem: %08x - %08x (%dk bytes)\n", rstart, rend - 1,
98 (rend - rstart) / 1024);
102 mcs (int isput, int bytes)
104 return comma (mem_counters[isput][bytes]);
114 for (i = 0; i < L1_LEN; i++)
117 for (j = 0; j < L2_LEN; j++)
123 rstart = (i << (L2_BITS + OFF_BITS)) + (j << OFF_BITS);
140 /* mem foo: 123456789012 123456789012 123456789012 123456789012
142 printf (" byte short pointer long"
144 printf ("mem get: %12s %12s %12s %12s %12s\n", mcs (0, 1), mcs (0, 2),
145 mcs (0, 3), mcs (0, 4), mcs (0, 0));
146 printf ("mem put: %12s %12s %12s %12s\n", mcs (1, 1), mcs (1, 2),
147 mcs (1, 3), mcs (1, 4));
152 s (int address, char *dir)
155 printf ("MEM[%0*x] %s", membus_mask == 0xfffff ? 5 : 6, address, dir);
159 #define S(d) if (trace) s(address, d)
170 #define E() if (trace) e()
173 mem_put_byte (int address, unsigned char value)
176 address &= membus_mask;
177 m = mem_ptr (address);
179 printf (" %02x", value);
185 static int old_led = -1;
186 static char *led_on[] =
187 { "\033[31m O ", "\033[32m O ", "\033[34m O " };
188 static char *led_off[] = { "\033[0m · ", "\033[0m · ", "\033[0m · " };
190 if (old_led != value)
193 for (i = 0; i < 3; i++)
194 if (value & (1 << i))
195 fputs (led_off[i], stdout);
197 fputs (led_on[i], stdout);
198 fputs ("\033[0m\r", stdout);
205 case 0x3aa: /* uart1tx */
207 static int pending_exit = 0;
212 step_result = M32C_MAKE_EXITED(value);
223 m32c_syscall (value);
231 printf ("SimTrace: %06lx %02x\n", regs.r_pc, value);
235 printf ("SimTrap: %06lx %02x\n", regs.r_pc, value);
241 mem_put_qi (int address, unsigned char value)
244 mem_put_byte (address, value & 0xff);
250 mem_put_hi (int address, unsigned short value)
252 if (address == 0x402)
254 printf ("SimTrace: %06lx %04x\n", regs.r_pc, value);
258 mem_put_byte (address, value & 0xff);
259 mem_put_byte (address + 1, value >> 8);
265 mem_put_psi (int address, unsigned long value)
268 mem_put_byte (address, value & 0xff);
269 mem_put_byte (address + 1, (value >> 8) & 0xff);
270 mem_put_byte (address + 2, value >> 16);
276 mem_put_si (int address, unsigned long value)
279 mem_put_byte (address, value & 0xff);
280 mem_put_byte (address + 1, (value >> 8) & 0xff);
281 mem_put_byte (address + 2, (value >> 16) & 0xff);
282 mem_put_byte (address + 3, (value >> 24) & 0xff);
288 mem_put_blk (int address, void *bufptr, int nbytes)
292 mem_counters[1][1] += nbytes;
294 mem_put_byte (address++, *(unsigned char *) bufptr++);
301 unsigned char *m = mem_ptr (regs.r_pc & membus_mask);
307 mem_get_byte (int address)
310 address &= membus_mask;
312 m = mem_ptr (address);
315 case 0x3ad: /* uart1c1 */
317 return 2; /* transmitter empty */
321 printf (" %02x", *m);
329 mem_get_qi (int address)
333 rv = mem_get_byte (address);
340 mem_get_hi (int address)
344 rv = mem_get_byte (address);
345 rv |= mem_get_byte (address + 1) * 256;
352 mem_get_psi (int address)
356 rv = mem_get_byte (address);
357 rv |= mem_get_byte (address + 1) * 256;
358 rv |= mem_get_byte (address + 2) * 65536;
365 mem_get_si (int address)
369 rv = mem_get_byte (address);
370 rv |= mem_get_byte (address + 1) << 8;
371 rv |= mem_get_byte (address + 2) << 16;
372 rv |= mem_get_byte (address + 3) << 24;
379 mem_get_blk (int address, void *bufptr, int nbytes)
383 mem_counters[0][1] += nbytes;
385 *(char *) bufptr++ = mem_get_byte (address++);
390 sign_ext (int v, int bits)
394 v &= (1 << bits) - 1;
395 if (v & (1 << (bits - 1)))