OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [or1ksim/] [cpu/] [common/] [abstract.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 cvs
/* abstract.c -- Abstract entities
2 1743 jeremybenn
 
3 2 cvs
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
4 1486 nogj
   Copyright (C) 2005 György `nog' Jeney, nog@sdf.lonestar.org
5 1743 jeremybenn
   Copyright (C) 2008 Embecosm Limited
6
 
7
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
8
 
9
   This file is part of OpenRISC 1000 Architectural Simulator.
10
 
11
   This program is free software; you can redistribute it and/or modify it
12
   under the terms of the GNU General Public License as published by the Free
13
   Software Foundation; either version 3 of the License, or (at your option)
14
   any later version.
15
 
16
   This program is distributed in the hope that it will be useful, but WITHOUT
17
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
19
   more details.
20
 
21
   You should have received a copy of the GNU General Public License along
22
   with this program.  If not, see <http://www.gnu.org/licenses/>. */
23 2 cvs
 
24 1748 jeremybenn
/* This program is commented throughout in a fashion suitable for processing
25
   with Doxygen. */
26
 
27 1743 jeremybenn
/* Abstract memory and routines that go with this. I need to add all sorts of
28
   other abstract entities. Currently we have only memory. */
29 2 cvs
 
30
 
31 1748 jeremybenn
/* Autoconf and/or portability configuration */
32 6 lampret
#include "config.h"
33 1748 jeremybenn
#include "port.h"
34 1350 nogj
 
35 1748 jeremybenn
/* System includes */
36
#include <stdlib.h>
37 1350 nogj
 
38 1748 jeremybenn
/* Package includes */
39 2 cvs
#include "abstract.h"
40 1748 jeremybenn
#include "except.h"
41
#include "support/profile.h"
42
#include "debug-unit.h"
43
#include "icache-model.h"
44
#include "dcache-model.h"
45 261 markom
#include "labels.h"
46 134 markom
#include "opcode/or32.h"
47 1308 phoenix
#include "dmmu.h"
48 1446 nogj
#include "immu.h"
49 2 cvs
 
50 1452 nogj
#if DYNAMIC_EXECUTION
51 1751 jeremybenn
#include "dyn-rec.h"
52 1452 nogj
#endif
53
 
54 2 cvs
 
55 1748 jeremybenn
/*! Global temporary variable to increase speed.  */
56
struct dev_memarea *cur_area;
57
 
58
/* Glboal variables set by MMU if cache inhibit bit is set for current
59
   access.  */
60
int  data_ci;                   /*!< Global var: data cache inhibit bit set */
61
int  insn_ci;                   /*!< Global var: instr cache inhibit bit set */
62
 
63 30 lampret
/* Pointer to memory area descriptions that are assigned to individual
64
   peripheral devices. */
65 1748 jeremybenn
static struct dev_memarea *dev_list;
66 30 lampret
 
67 970 simons
/* Pointer to memory controller device descriptor.  */
68 1748 jeremybenn
static struct dev_memarea *mc_area = NULL;
69 970 simons
 
70 525 simons
/* Virtual address of current access. */
71 1486 nogj
static oraddr_t cur_vadd;
72 525 simons
 
73 1748 jeremybenn
/* Forward declarations */
74
static uint32_t eval_mem_32_inv (oraddr_t, void *);
75
static uint16_t eval_mem_16_inv (oraddr_t, void *);
76
static uint8_t  eval_mem_8_inv (oraddr_t, void *);
77
static uint32_t eval_mem_32_inv_direct (oraddr_t, void *);
78
static uint16_t eval_mem_16_inv_direct (oraddr_t, void *);
79
static uint8_t  eval_mem_8_inv_direct (oraddr_t, void *);
80
static void     set_mem_32_inv (oraddr_t, uint32_t, void *);
81
static void     set_mem_16_inv (oraddr_t, uint16_t, void *);
82
static void     set_mem_8_inv (oraddr_t, uint8_t, void *);
83
static void     set_mem_32_inv_direct (oraddr_t, uint32_t, void *);
84
static void     set_mem_16_inv_direct (oraddr_t, uint16_t, void *);
85
static void     set_mem_8_inv_direct (oraddr_t, uint8_t, void *);
86 1486 nogj
 
87 261 markom
/* Calculates bit mask to fit the data */
88 1748 jeremybenn
static unsigned int
89
bit_mask (uint32_t data)
90
{
91 261 markom
  int i = 0;
92
  data--;
93 382 markom
  while (data >> i)
94 261 markom
    data |= 1 << i++;
95
  return data;
96
}
97
 
98
/* Register read and write function for a memory area.
99
   addr is inside the area, if addr & addr_mask == addr_compare
100
   (used also by peripheral devices like 16450 UART etc.) */
101 1748 jeremybenn
static struct dev_memarea *
102
register_memoryarea_mask (oraddr_t addr_mask,
103
                          oraddr_t addr_compare,
104
                          uint32_t size, unsigned mc_dev)
105 30 lampret
{
106 239 markom
  struct dev_memarea **pptmp;
107 1350 nogj
  unsigned int size_mask = bit_mask (size);
108 261 markom
  int found_error = 0;
109
  addr_compare &= addr_mask;
110 221 markom
 
111 239 markom
  /* Go to the end of the list. */
112 1748 jeremybenn
  for (pptmp = &dev_list; *pptmp; pptmp = &(*pptmp)->next)
113 1557 nogj
    if (((addr_compare >= (*pptmp)->addr_compare) &&
114 1748 jeremybenn
         (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)) ||
115
        ((addr_compare + size > (*pptmp)->addr_compare) &&
116
         (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)))
117
      {
118
        if (!found_error)
119
          {
120
            fprintf (stderr, "ERROR: Overlapping memory area(s):\n");
121
            fprintf (stderr,
122
                     "\taddr & %" PRIxADDR " == %" PRIxADDR " to %" PRIxADDR
123
                     ", size %08" PRIx32 "\n", addr_mask, addr_compare,
124
                     addr_compare | bit_mask (size), size);
125
          }
126
        found_error = 1;
127
        fprintf (stderr,
128
                 "and\taddr & %" PRIxADDR " == %" PRIxADDR " to %" PRIxADDR
129
                 ", size %08" PRIx32 "\n", (*pptmp)->addr_mask,
130
                 (*pptmp)->addr_compare,
131
                 (*pptmp)->addr_compare | (*pptmp)->size_mask,
132
                 (*pptmp)->size);
133 262 markom
      }
134 1748 jeremybenn
 
135 261 markom
  if (found_error)
136
    exit (-1);
137 537 markom
 
138 1748 jeremybenn
  cur_area = *pptmp =
139
    (struct dev_memarea *) malloc (sizeof (struct dev_memarea));
140 970 simons
 
141
  if (mc_dev)
142
    mc_area = *pptmp;
143
 
144 261 markom
  (*pptmp)->addr_mask = addr_mask;
145
  (*pptmp)->addr_compare = addr_compare;
146 239 markom
  (*pptmp)->size = size;
147 261 markom
  (*pptmp)->size_mask = size_mask;
148 1486 nogj
  (*pptmp)->log = NULL;
149
  (*pptmp)->valid = 1;
150 239 markom
  (*pptmp)->next = NULL;
151 1486 nogj
 
152
  return *pptmp;
153 261 markom
}
154 221 markom
 
155 261 markom
/* Register read and write function for a memory area.
156
   Memory areas should be aligned. Memory area is rounded up to
157
   fit the nearest 2^n aligment.
158 970 simons
   (used also by peripheral devices like 16450 UART etc.)
159 1486 nogj
   If mc_dev is 1, this device will be checked first for a match
160
   and will be accessed in case of overlaping memory areas.
161 970 simons
   Only one device can have this set to 1 (used for memory controller) */
162 1748 jeremybenn
struct dev_memarea *
163
reg_mem_area (oraddr_t addr, uint32_t size, unsigned mc_dev,
164
              struct mem_ops *ops)
165 261 markom
{
166 1350 nogj
  unsigned int size_mask = bit_mask (size);
167
  unsigned int addr_mask = ~size_mask;
168 1486 nogj
  struct dev_memarea *mem;
169
 
170 1748 jeremybenn
  mem = register_memoryarea_mask (addr_mask, addr & addr_mask, size_mask + 1,
171
                                  mc_dev);
172 1486 nogj
 
173 1748 jeremybenn
  memcpy (&mem->ops, ops, sizeof (struct mem_ops));
174
  memcpy (&mem->direct_ops, ops, sizeof (struct mem_ops));
175 1486 nogj
 
176 1748 jeremybenn
  if (!ops->readfunc32)
177
    {
178
      mem->ops.readfunc32 = eval_mem_32_inv;
179
      mem->direct_ops.readfunc32 = eval_mem_32_inv_direct;
180
      mem->direct_ops.read_dat32 = mem;
181
    }
182
  if (!ops->readfunc16)
183
    {
184
      mem->ops.readfunc16 = eval_mem_16_inv;
185
      mem->direct_ops.readfunc16 = eval_mem_16_inv_direct;
186
      mem->direct_ops.read_dat16 = mem;
187
    }
188
  if (!ops->readfunc8)
189
    {
190
      mem->ops.readfunc8 = eval_mem_8_inv;
191
      mem->direct_ops.readfunc8 = eval_mem_8_inv_direct;
192
      mem->direct_ops.read_dat8 = mem;
193
    }
194 1486 nogj
 
195 1748 jeremybenn
  if (!ops->writefunc32)
196
    {
197
      mem->ops.writefunc32 = set_mem_32_inv;
198
      mem->direct_ops.writefunc32 = set_mem_32_inv_direct;
199
      mem->direct_ops.write_dat32 = mem;
200
    }
201
  if (!ops->writefunc16)
202
    {
203
      mem->ops.writefunc16 = set_mem_16_inv;
204
      mem->direct_ops.writefunc16 = set_mem_16_inv_direct;
205
      mem->direct_ops.write_dat16 = mem;
206
    }
207
  if (!ops->writefunc8)
208
    {
209
      mem->ops.writefunc8 = set_mem_8_inv;
210
      mem->direct_ops.writefunc8 = set_mem_8_inv_direct;
211
      mem->direct_ops.write_dat8 = mem;
212
    }
213 1486 nogj
 
214 1748 jeremybenn
  if (!ops->writeprog8)
215
    {
216
      mem->ops.writeprog8 = mem->ops.writefunc8;
217
      mem->ops.writeprog8_dat = mem->ops.write_dat8;
218
    }
219 1486 nogj
 
220 1748 jeremybenn
  if (!ops->writeprog32)
221
    {
222
      mem->ops.writeprog32 = mem->ops.writefunc32;
223
      mem->ops.writeprog32_dat = mem->ops.write_dat32;
224
    }
225 1556 nogj
 
226 1748 jeremybenn
  if (ops->log)
227
    {
228
      if (!(mem->log = fopen (ops->log, "w")))
229
        PRINTF ("ERR: Unable to open %s to log memory acesses to\n",
230
                ops->log);
231
    }
232 1486 nogj
 
233
  return mem;
234 30 lampret
}
235
 
236
/* Check if access is to registered area of memory. */
237 1748 jeremybenn
struct dev_memarea *
238
verify_memoryarea (oraddr_t addr)
239 30 lampret
{
240 239 markom
  struct dev_memarea *ptmp;
241 221 markom
 
242 970 simons
  /* Check memory controller space first */
243 1748 jeremybenn
  if (mc_area
244
      && (addr & mc_area->addr_mask) ==
245
      (mc_area->addr_compare & mc_area->addr_mask))
246 970 simons
    return cur_area = mc_area;
247
 
248
  /* Check cached value */
249 1748 jeremybenn
  if (cur_area
250
      && (addr & cur_area->addr_mask) ==
251
      (cur_area->addr_compare & cur_area->addr_mask))
252 560 markom
    return cur_area;
253
 
254 1748 jeremybenn
  /* When mc is enabled, we must check valid also, otherwise we assume it is
255
     nonzero */
256 1375 nogj
  /* Check list of registered devices. */
257 1748 jeremybenn
  for (ptmp = dev_list; ptmp; ptmp = ptmp->next)
258
    if ((addr & ptmp->addr_mask) == (ptmp->addr_compare & ptmp->addr_mask)
259
        && ptmp->valid)
260 1375 nogj
      return cur_area = ptmp;
261 239 markom
  return cur_area = NULL;
262 30 lampret
}
263
 
264 1486 nogj
/* Sets the valid bit (Used only by memory controllers) */
265 1748 jeremybenn
void
266
set_mem_valid (struct dev_memarea *mem, int valid)
267 882 simons
{
268 1486 nogj
  mem->valid = valid;
269 882 simons
}
270
 
271 1486 nogj
/* Adjusts the read and write delays for the memory area pointed to by mem. */
272 1748 jeremybenn
void
273
adjust_rw_delay (struct dev_memarea *mem, int delayr, int delayw)
274 560 markom
{
275 1486 nogj
  mem->ops.delayr = delayr;
276
  mem->ops.delayw = delayw;
277 1319 phoenix
}
278 560 markom
 
279 1748 jeremybenn
static uint8_t
280
eval_mem_8_inv (oraddr_t memaddr, void *dat)
281 1319 phoenix
{
282 1748 jeremybenn
  except_handle (EXCEPT_BUSERR, cur_vadd);
283 1486 nogj
  return 0;
284 1319 phoenix
}
285
 
286 1748 jeremybenn
static uint16_t
287
eval_mem_16_inv (oraddr_t memaddr, void *dat)
288 1319 phoenix
{
289 1748 jeremybenn
  except_handle (EXCEPT_BUSERR, cur_vadd);
290 1486 nogj
  return 0;
291
}
292 1319 phoenix
 
293 1748 jeremybenn
static uint32_t
294
eval_mem_32_inv (oraddr_t memaddr, void *dat)
295 1486 nogj
{
296 1748 jeremybenn
  except_handle (EXCEPT_BUSERR, cur_vadd);
297 1486 nogj
  return 0;
298 560 markom
}
299
 
300 1748 jeremybenn
static void
301
set_mem_8_inv (oraddr_t memaddr, uint8_t val, void *dat)
302 560 markom
{
303 1748 jeremybenn
  except_handle (EXCEPT_BUSERR, cur_vadd);
304 1319 phoenix
}
305 560 markom
 
306 1748 jeremybenn
static void
307
set_mem_16_inv (oraddr_t memaddr, uint16_t val, void *dat)
308 1319 phoenix
{
309 1748 jeremybenn
  except_handle (EXCEPT_BUSERR, cur_vadd);
310 1319 phoenix
}
311
 
312 1748 jeremybenn
static void
313
set_mem_32_inv (oraddr_t memaddr, uint32_t val, void *dat)
314 1319 phoenix
{
315 1748 jeremybenn
  except_handle (EXCEPT_BUSERR, cur_vadd);
316 1486 nogj
}
317 1319 phoenix
 
318 1748 jeremybenn
uint8_t
319
eval_mem_8_inv_direct (oraddr_t memaddr, void *dat)
320 1486 nogj
{
321
  struct dev_memarea *mem = dat;
322
 
323 1748 jeremybenn
  PRINTF ("ERROR: Invalid 8-bit direct read from memory %" PRIxADDR "\n",
324
          mem->addr_compare | memaddr);
325 1486 nogj
  return 0;
326 560 markom
}
327
 
328 1748 jeremybenn
uint16_t
329
eval_mem_16_inv_direct (oraddr_t memaddr, void *dat)
330 560 markom
{
331 1486 nogj
  struct dev_memarea *mem = dat;
332
 
333 1748 jeremybenn
  PRINTF ("ERROR: Invalid 16-bit direct read from memory %" PRIxADDR "\n",
334
          mem->addr_compare | memaddr);
335 1486 nogj
  return 0;
336 1319 phoenix
}
337 560 markom
 
338 1748 jeremybenn
uint32_t
339
eval_mem_32_inv_direct (oraddr_t memaddr, void *dat)
340 1319 phoenix
{
341 1486 nogj
  struct dev_memarea *mem = dat;
342
 
343 1748 jeremybenn
  PRINTF ("ERROR: Invalid 32-bit direct read from memory %" PRIxADDR "\n",
344
          mem->addr_compare | memaddr);
345 1486 nogj
  return 0;
346 1319 phoenix
}
347
 
348 1748 jeremybenn
void
349
set_mem_8_inv_direct (oraddr_t memaddr, uint8_t val, void *dat)
350 1319 phoenix
{
351 1486 nogj
  struct dev_memarea *mem = dat;
352 1319 phoenix
 
353 1748 jeremybenn
  PRINTF ("ERROR: Invalid 32-bit direct write to memory %" PRIxADDR "\n",
354
          mem->addr_compare | memaddr);
355 1486 nogj
}
356
 
357 1748 jeremybenn
void
358
set_mem_16_inv_direct (oraddr_t memaddr, uint16_t val, void *dat)
359 1486 nogj
{
360
  struct dev_memarea *mem = dat;
361
 
362 1748 jeremybenn
  PRINTF ("ERROR: Invalid 16-bit direct write to memory %" PRIxADDR "\n",
363
          mem->addr_compare | memaddr);
364 1486 nogj
}
365
 
366 1748 jeremybenn
void
367
set_mem_32_inv_direct (oraddr_t memaddr, uint32_t val, void *dat)
368 1486 nogj
{
369
  struct dev_memarea *mem = dat;
370
 
371 1748 jeremybenn
  PRINTF ("ERROR: Invalid 32-bit direct write to memory %" PRIxADDR "\n",
372
          mem->addr_compare | memaddr);
373 1486 nogj
}
374
 
375
/* For cpu accesses
376
 *
377
 * NOTE: This function _is_ only called from eval_mem32 below and
378
 * {i,d}c_simulate_read.  _Don't_ call it from anywere else.
379
 */
380 1748 jeremybenn
uint32_t
381
evalsim_mem32 (oraddr_t memaddr, oraddr_t vaddr)
382 1486 nogj
{
383
  struct dev_memarea *mem;
384
 
385 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
386
    {
387
      runtime.sim.mem_cycles += mem->ops.delayr;
388
      return mem->ops.readfunc32 (memaddr & mem->size_mask,
389
                                  mem->ops.read_dat32);
390
    }
391
  else
392
    {
393
      PRINTF ("EXCEPTION: read out of memory (32-bit access to %" PRIxADDR
394
              ")\n", memaddr);
395
      except_handle (EXCEPT_BUSERR, vaddr);
396
    }
397 1486 nogj
 
398
  return 0;
399 560 markom
}
400
 
401 1486 nogj
/* For cpu accesses
402
 *
403
 * NOTE: This function _is_ only called from eval_mem16 below and
404
 * {i,d}c_simulate_read.  _Don't_ call it from anywere else.
405
 */
406 1748 jeremybenn
uint16_t
407
evalsim_mem16 (oraddr_t memaddr, oraddr_t vaddr)
408 1486 nogj
{
409
  struct dev_memarea *mem;
410
 
411 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
412
    {
413
      runtime.sim.mem_cycles += mem->ops.delayr;
414
      return mem->ops.readfunc16 (memaddr & mem->size_mask,
415
                                  mem->ops.read_dat16);
416
    }
417
  else
418
    {
419
      PRINTF ("EXCEPTION: read out of memory (16-bit access to %" PRIxADDR
420
              ")\n", memaddr);
421
      except_handle (EXCEPT_BUSERR, vaddr);
422
    }
423 1486 nogj
 
424
  return 0;
425
}
426
 
427
/* For cpu accesses
428
 *
429
 * NOTE: This function _is_ only called from eval_mem8 below and
430
 * {i,d}c_simulate_read.  _Don't_ call it from anywere else.
431
 */
432 1748 jeremybenn
uint8_t
433
evalsim_mem8 (oraddr_t memaddr, oraddr_t vaddr)
434 1486 nogj
{
435
  struct dev_memarea *mem;
436
 
437 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
438
    {
439
      runtime.sim.mem_cycles += mem->ops.delayr;
440
      return mem->ops.readfunc8 (memaddr & mem->size_mask,
441
                                 mem->ops.read_dat8);
442
    }
443
  else
444
    {
445
      PRINTF ("EXCEPTION: read out of memory (8-bit access to %" PRIxADDR
446
              ")\n", memaddr);
447
      except_handle (EXCEPT_BUSERR, vaddr);
448
    }
449 1486 nogj
 
450
  return 0;
451
}
452
 
453 1319 phoenix
/* Returns 32-bit values from mem array. Big endian version.
454
 *
455
 * STATISTICS OK (only used for cpu_access, that is architectural access)
456
 */
457 1748 jeremybenn
uint32_t
458
eval_mem32 (oraddr_t memaddr, int *breakpoint)
459 2 cvs
{
460 1350 nogj
  uint32_t temp;
461 1486 nogj
  oraddr_t phys_memaddr;
462 123 markom
 
463 547 markom
  if (config.sim.mprofile)
464
    mprofile (memaddr, MPROF_32 | MPROF_READ);
465
 
466 1748 jeremybenn
  if (memaddr & 3)
467
    {
468
      except_handle (EXCEPT_ALIGN, memaddr);
469
      return 0;
470
    }
471 557 markom
 
472 631 simons
  if (config.debug.enabled)
473 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadAddress, memaddr);        /* 28/05/01 CZ */
474 631 simons
 
475 1748 jeremybenn
  phys_memaddr = dmmu_translate (memaddr, 0);
476 1386 nogj
  if (except_pending)
477 574 markom
    return 0;
478
 
479 1748 jeremybenn
  if (config.dc.enabled)
480
    temp = dc_simulate_read (phys_memaddr, memaddr, 4);
481 1486 nogj
  else
482 1748 jeremybenn
    temp = evalsim_mem32 (phys_memaddr, memaddr);
483 611 simons
 
484 550 markom
  if (config.debug.enabled)
485 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadData, temp);      /* MM170901 */
486 1486 nogj
 
487 239 markom
  return temp;
488 66 lampret
}
489
 
490 1319 phoenix
/* for simulator accesses, the ones that cpu wouldn't do
491
 *
492
 * STATISTICS OK
493
 */
494 1748 jeremybenn
uint32_t
495
eval_direct32 (oraddr_t memaddr, int through_mmu, int through_dc)
496 1240 phoenix
{
497 1486 nogj
  oraddr_t phys_memaddr;
498
  struct dev_memarea *mem;
499 1240 phoenix
 
500 1748 jeremybenn
  if (memaddr & 3)
501
    {
502
      PRINTF ("%s:%d %s(): ERR unaligned access\n", __FILE__, __LINE__,
503
              __FUNCTION__);
504
      return 0;
505
    }
506
 
507 1486 nogj
  phys_memaddr = memaddr;
508 1240 phoenix
 
509
  if (through_mmu)
510 1748 jeremybenn
    phys_memaddr = peek_into_dtlb (memaddr, 0, through_dc);
511 1240 phoenix
 
512 1748 jeremybenn
  if (through_dc)
513
    return dc_simulate_read (phys_memaddr, memaddr, 4);
514
  else
515
    {
516
      if ((mem = verify_memoryarea (phys_memaddr)))
517
        return mem->direct_ops.readfunc32 (phys_memaddr & mem->size_mask,
518
                                           mem->direct_ops.read_dat32);
519
      else
520
        PRINTF ("ERR: 32-bit read out of memory area: %" PRIxADDR
521
                " (physical: %" PRIxADDR ")\n", memaddr, phys_memaddr);
522
    }
523
 
524 1486 nogj
  return 0;
525 1240 phoenix
}
526
 
527
 
528 1319 phoenix
/* Returns 32-bit values from mem array. Big endian version.
529
 *
530
 * STATISTICS OK (only used for cpu_access, that is architectural access)
531
 */
532 1748 jeremybenn
uint32_t
533
eval_insn (oraddr_t memaddr, int *breakpoint)
534 349 simons
{
535 1350 nogj
  uint32_t temp;
536 1486 nogj
  oraddr_t phys_memaddr;
537 349 simons
 
538 547 markom
  if (config.sim.mprofile)
539
    mprofile (memaddr, MPROF_32 | MPROF_FETCH);
540 1244 hpanther
 
541 1486 nogj
  phys_memaddr = memaddr;
542 1452 nogj
#if !(DYNAMIC_EXECUTION)
543 1748 jeremybenn
  phys_memaddr = immu_translate (memaddr);
544 1386 nogj
 
545
  if (except_pending)
546
    return 0;
547 1452 nogj
#endif
548 1386 nogj
 
549
  if (config.debug.enabled)
550 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugInstructionFetch, memaddr);
551 1386 nogj
 
552 1751 jeremybenn
  if ((NULL != ic_state) && ic_state->enabled)
553 1748 jeremybenn
    temp = ic_simulate_fetch (phys_memaddr, memaddr);
554 1486 nogj
  else
555 1748 jeremybenn
    temp = evalsim_mem32 (phys_memaddr, memaddr);
556 611 simons
 
557 1386 nogj
  if (config.debug.enabled)
558 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadData, temp);
559 349 simons
  return temp;
560
}
561
 
562 1319 phoenix
/* Returns 16-bit values from mem array. Big endian version.
563
 *
564
 * STATISTICS OK (only used for cpu_access, that is architectural access)
565
 */
566 1748 jeremybenn
uint16_t
567
eval_mem16 (oraddr_t memaddr, int *breakpoint)
568 2 cvs
{
569 1350 nogj
  uint16_t temp;
570 1486 nogj
  oraddr_t phys_memaddr;
571 1748 jeremybenn
 
572 547 markom
  if (config.sim.mprofile)
573
    mprofile (memaddr, MPROF_16 | MPROF_READ);
574
 
575 1748 jeremybenn
  if (memaddr & 1)
576
    {
577
      except_handle (EXCEPT_ALIGN, memaddr);
578
      return 0;
579
    }
580 574 markom
 
581 631 simons
  if (config.debug.enabled)
582 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadAddress, memaddr);        /* 28/05/01 CZ */
583 631 simons
 
584 1748 jeremybenn
  phys_memaddr = dmmu_translate (memaddr, 0);
585 1386 nogj
  if (except_pending)
586 574 markom
    return 0;
587 66 lampret
 
588 1748 jeremybenn
  if (config.dc.enabled)
589
    temp = dc_simulate_read (phys_memaddr, memaddr, 2);
590 1486 nogj
  else
591 1748 jeremybenn
    temp = evalsim_mem16 (phys_memaddr, memaddr);
592 611 simons
 
593 550 markom
  if (config.debug.enabled)
594 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadData, temp);      /* MM170901 */
595 1486 nogj
 
596 239 markom
  return temp;
597 66 lampret
}
598
 
599 1319 phoenix
/* for simulator accesses, the ones that cpu wouldn't do
600
 *
601
 * STATISTICS OK.
602
 */
603 1748 jeremybenn
uint16_t
604
eval_direct16 (oraddr_t memaddr, int through_mmu, int through_dc)
605 1240 phoenix
{
606 1486 nogj
  oraddr_t phys_memaddr;
607
  struct dev_memarea *mem;
608 1240 phoenix
 
609 1748 jeremybenn
  if (memaddr & 1)
610
    {
611
      PRINTF ("%s:%d %s(): ERR unaligned access\n", __FILE__, __LINE__,
612
              __FUNCTION__);
613
      return 0;
614
    }
615
 
616 1486 nogj
  phys_memaddr = memaddr;
617 1240 phoenix
 
618
  if (through_mmu)
619 1748 jeremybenn
    phys_memaddr = peek_into_dtlb (memaddr, 0, through_dc);
620 1240 phoenix
 
621 1748 jeremybenn
  if (through_dc)
622
    return dc_simulate_read (phys_memaddr, memaddr, 2);
623
  else
624
    {
625
      if ((mem = verify_memoryarea (phys_memaddr)))
626
        return mem->direct_ops.readfunc16 (phys_memaddr & mem->size_mask,
627
                                           mem->direct_ops.read_dat16);
628
      else
629
        PRINTF ("ERR: 16-bit read out of memory area: %" PRIxADDR
630
                " (physical: %" PRIxADDR "\n", memaddr, phys_memaddr);
631
    }
632
 
633 1486 nogj
  return 0;
634 1240 phoenix
}
635
 
636 1319 phoenix
/* Returns 8-bit values from mem array.
637
 *
638
 * STATISTICS OK (only used for cpu_access, that is architectural access)
639
 */
640 1748 jeremybenn
uint8_t
641
eval_mem8 (oraddr_t memaddr, int *breakpoint)
642 221 markom
{
643 1350 nogj
  uint8_t temp;
644 1486 nogj
  oraddr_t phys_memaddr;
645 547 markom
 
646
  if (config.sim.mprofile)
647
    mprofile (memaddr, MPROF_8 | MPROF_READ);
648
 
649 631 simons
  if (config.debug.enabled)
650 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadAddress, memaddr);        /* 28/05/01 CZ */
651 631 simons
 
652 1748 jeremybenn
  phys_memaddr = dmmu_translate (memaddr, 0);
653 1386 nogj
  if (except_pending)
654 458 simons
    return 0;
655 6 lampret
 
656 1748 jeremybenn
  if (config.dc.enabled)
657
    temp = dc_simulate_read (phys_memaddr, memaddr, 1);
658 1486 nogj
  else
659 1748 jeremybenn
    temp = evalsim_mem8 (phys_memaddr, memaddr);
660 611 simons
 
661 550 markom
  if (config.debug.enabled)
662 1748 jeremybenn
    *breakpoint += check_debug_unit (DebugLoadData, temp);      /* MM170901 */
663 239 markom
  return temp;
664 66 lampret
}
665
 
666 1319 phoenix
/* for simulator accesses, the ones that cpu wouldn't do
667
 *
668
 * STATISTICS OK.
669
 */
670 1748 jeremybenn
uint8_t
671
eval_direct8 (oraddr_t memaddr, int through_mmu, int through_dc)
672 1240 phoenix
{
673 1486 nogj
  oraddr_t phys_memaddr;
674
  struct dev_memarea *mem;
675 1240 phoenix
 
676 1486 nogj
  phys_memaddr = memaddr;
677 1748 jeremybenn
 
678 1240 phoenix
  if (through_mmu)
679 1748 jeremybenn
    phys_memaddr = peek_into_dtlb (memaddr, 0, through_dc);
680 1240 phoenix
 
681 1748 jeremybenn
  if (through_dc)
682
    return dc_simulate_read (phys_memaddr, memaddr, 1);
683
  else
684
    {
685
      if ((mem = verify_memoryarea (phys_memaddr)))
686
        return mem->direct_ops.readfunc8 (phys_memaddr & mem->size_mask,
687
                                          mem->direct_ops.read_dat8);
688
      else
689
        PRINTF ("ERR: 8-bit read out of memory area: %" PRIxADDR
690
                " (physical: %" PRIxADDR "\n", memaddr, phys_memaddr);
691
    }
692
 
693 1486 nogj
  return 0;
694 1319 phoenix
}
695 1240 phoenix
 
696 1486 nogj
/* For cpu accesses
697
 *
698
 * NOTE: This function _is_ only called from set_mem32 below and
699
 * dc_simulate_write.  _Don't_ call it from anywere else.
700
 */
701 1748 jeremybenn
void
702
setsim_mem32 (oraddr_t memaddr, oraddr_t vaddr, uint32_t value)
703 66 lampret
{
704 1486 nogj
  struct dev_memarea *mem;
705 1319 phoenix
 
706 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
707
    {
708
      cur_vadd = vaddr;
709
      runtime.sim.mem_cycles += mem->ops.delayw;
710
      mem->ops.writefunc32 (memaddr & mem->size_mask, value,
711
                            mem->ops.write_dat32);
712 1452 nogj
#if DYNAMIC_EXECUTION
713 1748 jeremybenn
      dyn_checkwrite (memaddr);
714 1452 nogj
#endif
715 1748 jeremybenn
    }
716
  else
717
    {
718
      PRINTF ("EXCEPTION: write out of memory (32-bit access to %" PRIxADDR
719
              ")\n", memaddr);
720
      except_handle (EXCEPT_BUSERR, vaddr);
721
    }
722 2 cvs
}
723
 
724 1486 nogj
/* For cpu accesses
725
 *
726
 * NOTE: This function _is_ only called from set_mem16 below and
727
 * dc_simulate_write.  _Don't_ call it from anywere else.
728
 */
729 1748 jeremybenn
void
730
setsim_mem16 (oraddr_t memaddr, oraddr_t vaddr, uint16_t value)
731 66 lampret
{
732 1486 nogj
  struct dev_memarea *mem;
733 1319 phoenix
 
734 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
735
    {
736
      cur_vadd = vaddr;
737
      runtime.sim.mem_cycles += mem->ops.delayw;
738
      mem->ops.writefunc16 (memaddr & mem->size_mask, value,
739
                            mem->ops.write_dat16);
740 1452 nogj
#if DYNAMIC_EXECUTION
741 1748 jeremybenn
      dyn_checkwrite (memaddr);
742 1452 nogj
#endif
743 1748 jeremybenn
    }
744
  else
745
    {
746
      PRINTF ("EXCEPTION: write out of memory (16-bit access to %" PRIxADDR
747
              ")\n", memaddr);
748
      except_handle (EXCEPT_BUSERR, vaddr);
749
    }
750 2 cvs
}
751
 
752 1486 nogj
/* For cpu accesses
753
 *
754
 * NOTE: This function _is_ only called from set_mem8 below and
755
 * dc_simulate_write.  _Don't_ call it from anywere else.
756
 */
757 1748 jeremybenn
void
758
setsim_mem8 (oraddr_t memaddr, oraddr_t vaddr, uint8_t value)
759 66 lampret
{
760 1486 nogj
  struct dev_memarea *mem;
761 1319 phoenix
 
762 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
763
    {
764
      cur_vadd = vaddr;
765
      runtime.sim.mem_cycles += mem->ops.delayw;
766
      mem->ops.writefunc8 (memaddr & mem->size_mask, value,
767
                           mem->ops.write_dat8);
768 1452 nogj
#if DYNAMIC_EXECUTION
769 1748 jeremybenn
      dyn_checkwrite (memaddr);
770 1452 nogj
#endif
771 1748 jeremybenn
    }
772
  else
773
    {
774
      PRINTF ("EXCEPTION: write out of memory (8-bit access to %" PRIxADDR
775
              ")\n", memaddr);
776
      except_handle (EXCEPT_BUSERR, vaddr);
777
    }
778 2 cvs
}
779 30 lampret
 
780 1319 phoenix
/* Set mem, 32-bit. Big endian version.
781
 *
782 1446 nogj
 * STATISTICS OK. (the only suspicious usage is in sim-cmd.c,
783 1319 phoenix
 *                 where this instruction is used for patching memory,
784
 *                 wether this is cpu or architectual access is yet to
785
 *                 be decided)
786
 */
787 1748 jeremybenn
void
788
set_mem32 (oraddr_t memaddr, uint32_t value, int *breakpoint)
789 587 markom
{
790 1486 nogj
  oraddr_t phys_memaddr;
791
 
792 587 markom
  if (config.sim.mprofile)
793
    mprofile (memaddr, MPROF_32 | MPROF_WRITE);
794
 
795 1748 jeremybenn
  if (memaddr & 3)
796
    {
797
      except_handle (EXCEPT_ALIGN, memaddr);
798
      return;
799
    }
800 587 markom
 
801 1748 jeremybenn
  phys_memaddr = dmmu_translate (memaddr, 1);;
802 587 markom
  /* If we produced exception don't set anything */
803 1386 nogj
  if (except_pending)
804 587 markom
    return;
805
 
806 1748 jeremybenn
  if (config.debug.enabled)
807
    {
808
      *breakpoint += check_debug_unit (DebugStoreAddress, memaddr);     /* 28/05/01 CZ */
809
      *breakpoint += check_debug_unit (DebugStoreData, value);
810
    }
811 587 markom
 
812 1748 jeremybenn
  if (config.dc.enabled)
813
    dc_simulate_write (phys_memaddr, memaddr, value, 4);
814 1486 nogj
  else
815 1748 jeremybenn
    setsim_mem32 (phys_memaddr, memaddr, value);
816 992 simons
 
817 1218 phoenix
  if (cur_area && cur_area->log)
818 1748 jeremybenn
    fprintf (cur_area->log, "[%" PRIxADDR "] -> write %08" PRIx32 "\n",
819
             memaddr, value);
820 587 markom
}
821
 
822 1319 phoenix
/*
823
 * STATISTICS NOT OK.
824
 */
825 1748 jeremybenn
void
826
set_direct32 (oraddr_t memaddr, uint32_t value, int through_mmu,
827
              int through_dc)
828 1240 phoenix
{
829 1486 nogj
  oraddr_t phys_memaddr;
830
  struct dev_memarea *mem;
831 1240 phoenix
 
832 1748 jeremybenn
  if (memaddr & 3)
833
    {
834
      PRINTF ("%s:%d %s(): ERR unaligned access\n", __FILE__, __LINE__,
835
              __FUNCTION__);
836
      return;
837
    }
838 1240 phoenix
 
839 1486 nogj
  phys_memaddr = memaddr;
840 1240 phoenix
 
841 1748 jeremybenn
  if (through_mmu)
842
    {
843
      /* 0 - no write access, we do not want a DPF exception do we ;)
844
       */
845
      phys_memaddr = peek_into_dtlb (memaddr, 1, through_dc);
846
    }
847 1240 phoenix
 
848 1748 jeremybenn
  if (through_dc)
849
    dc_simulate_write (memaddr, memaddr, value, 4);
850
  else
851
    {
852
      if ((mem = verify_memoryarea (phys_memaddr)))
853
        mem->direct_ops.writefunc32 (phys_memaddr & mem->size_mask, value,
854
                                     mem->direct_ops.write_dat32);
855
      else
856
        PRINTF ("ERR: 32-bit write out of memory area: %" PRIxADDR
857
                " (physical: %" PRIxADDR ")\n", memaddr, phys_memaddr);
858
    }
859
 
860 1240 phoenix
  if (cur_area && cur_area->log)
861 1748 jeremybenn
    fprintf (cur_area->log, "[%" PRIxADDR "] -> DIRECT write %08" PRIx32 "\n",
862
             memaddr, value);
863 1240 phoenix
}
864
 
865
 
866 587 markom
/* Set mem, 16-bit. Big endian version. */
867
 
868 1748 jeremybenn
void
869
set_mem16 (oraddr_t memaddr, uint16_t value, int *breakpoint)
870 587 markom
{
871 1486 nogj
  oraddr_t phys_memaddr;
872
 
873 587 markom
  if (config.sim.mprofile)
874
    mprofile (memaddr, MPROF_16 | MPROF_WRITE);
875 1748 jeremybenn
 
876
  if (memaddr & 1)
877
    {
878
      except_handle (EXCEPT_ALIGN, memaddr);
879
      return;
880
    }
881
 
882
  phys_memaddr = dmmu_translate (memaddr, 1);;
883 587 markom
  /* If we produced exception don't set anything */
884 1386 nogj
  if (except_pending)
885 587 markom
    return;
886
 
887 1748 jeremybenn
  if (config.debug.enabled)
888
    {
889
      *breakpoint += check_debug_unit (DebugStoreAddress, memaddr);     /* 28/05/01 CZ */
890
      *breakpoint += check_debug_unit (DebugStoreData, value);
891
    }
892
 
893
  if (config.dc.enabled)
894
    dc_simulate_write (phys_memaddr, memaddr, value, 2);
895 1486 nogj
  else
896 1748 jeremybenn
    setsim_mem16 (phys_memaddr, memaddr, value);
897 992 simons
 
898 1218 phoenix
  if (cur_area && cur_area->log)
899 1748 jeremybenn
    fprintf (cur_area->log, "[%" PRIxADDR "] -> write %04" PRIx16 "\n",
900
             memaddr, value);
901 587 markom
}
902
 
903 1319 phoenix
/*
904
 * STATISTICS NOT OK.
905
 */
906 1748 jeremybenn
void
907
set_direct16 (oraddr_t memaddr, uint16_t value, int through_mmu,
908
              int through_dc)
909 1240 phoenix
{
910 1486 nogj
  oraddr_t phys_memaddr;
911
  struct dev_memarea *mem;
912 1240 phoenix
 
913 1748 jeremybenn
  if (memaddr & 1)
914
    {
915
      PRINTF ("%s:%d %s(): ERR unaligned access\n", __FILE__, __LINE__,
916
              __FUNCTION__);
917
      return;
918
    }
919 1240 phoenix
 
920 1486 nogj
  phys_memaddr = memaddr;
921 1240 phoenix
 
922 1748 jeremybenn
  if (through_mmu)
923
    {
924
      /* 0 - no write access, we do not want a DPF exception do we ;)
925
       */
926
      phys_memaddr = peek_into_dtlb (memaddr, 0, through_dc);
927
    }
928 1240 phoenix
 
929 1748 jeremybenn
  if (through_dc)
930
    dc_simulate_write (memaddr, memaddr, value, 2);
931
  else
932
    {
933
      if ((mem = verify_memoryarea (phys_memaddr)))
934
        mem->direct_ops.writefunc16 (phys_memaddr & mem->size_mask, value,
935
                                     mem->direct_ops.write_dat16);
936
      else
937
        PRINTF ("ERR: 16-bit write out of memory area: %" PRIxADDR
938
                " (physical: %" PRIxADDR "\n", memaddr, phys_memaddr);
939
    }
940
 
941 1240 phoenix
  if (cur_area && cur_area->log)
942 1748 jeremybenn
    fprintf (cur_area->log, "[%" PRIxADDR "] -> DIRECT write %04" PRIx16 "\n",
943
             memaddr, value);
944 1240 phoenix
}
945
 
946 587 markom
/* Set mem, 8-bit. */
947 1748 jeremybenn
void
948
set_mem8 (oraddr_t memaddr, uint8_t value, int *breakpoint)
949 587 markom
{
950 1486 nogj
  oraddr_t phys_memaddr;
951
 
952 587 markom
  if (config.sim.mprofile)
953
    mprofile (memaddr, MPROF_8 | MPROF_WRITE);
954 1748 jeremybenn
 
955 1486 nogj
  phys_memaddr = memaddr;
956
 
957 1748 jeremybenn
  phys_memaddr = dmmu_translate (memaddr, 1);;
958 587 markom
  /* If we produced exception don't set anything */
959 1748 jeremybenn
  if (except_pending)
960
    return;
961 587 markom
 
962 1748 jeremybenn
  if (config.debug.enabled)
963
    {
964
      *breakpoint += check_debug_unit (DebugStoreAddress, memaddr);     /* 28/05/01 CZ */
965
      *breakpoint += check_debug_unit (DebugStoreData, value);
966
    }
967 587 markom
 
968 1748 jeremybenn
  if (config.dc.enabled)
969
    dc_simulate_write (phys_memaddr, memaddr, value, 1);
970 1486 nogj
  else
971 1748 jeremybenn
    setsim_mem8 (phys_memaddr, memaddr, value);
972 992 simons
 
973 1218 phoenix
  if (cur_area && cur_area->log)
974 1748 jeremybenn
    fprintf (cur_area->log, "[%" PRIxADDR "] -> write %02" PRIx8 "\n",
975
             memaddr, value);
976 587 markom
}
977
 
978 1319 phoenix
/*
979
 * STATISTICS NOT OK.
980
 */
981 1748 jeremybenn
void
982
set_direct8 (oraddr_t memaddr, uint8_t value, int through_mmu, int through_dc)
983 1240 phoenix
{
984 1486 nogj
  oraddr_t phys_memaddr;
985
  struct dev_memarea *mem;
986 1240 phoenix
 
987 1486 nogj
  phys_memaddr = memaddr;
988 1240 phoenix
 
989 1748 jeremybenn
  if (through_mmu)
990
    {
991
      /* 0 - no write access, we do not want a DPF exception do we ;)
992
       */
993
      phys_memaddr = peek_into_dtlb (memaddr, 0, through_dc);
994
    }
995 1240 phoenix
 
996 1748 jeremybenn
  if (through_dc)
997
    dc_simulate_write (phys_memaddr, memaddr, value, 1);
998
  else
999
    {
1000
      if ((mem = verify_memoryarea (phys_memaddr)))
1001
        mem->direct_ops.writefunc8 (phys_memaddr & mem->size_mask, value,
1002
                                    mem->direct_ops.write_dat8);
1003
      else
1004
        PRINTF ("ERR: 8-bit write out of memory area: %" PRIxADDR
1005
                " (physical: %" PRIxADDR "\n", memaddr, phys_memaddr);
1006
    }
1007
 
1008 1240 phoenix
  if (cur_area && cur_area->log)
1009 1748 jeremybenn
    fprintf (cur_area->log, "[%" PRIxADDR "] -> DIRECT write %02" PRIx8 "\n",
1010
             memaddr, value);
1011 1240 phoenix
}
1012
 
1013
 
1014 1486 nogj
/* set_program32 - same as set_direct32, but it also writes to memory that is
1015
 *                 non-writeable to the rest of the sim.  Used to do program
1016
 *                 loading.
1017
 */
1018 1748 jeremybenn
void
1019
set_program32 (oraddr_t memaddr, uint32_t value)
1020 1486 nogj
{
1021
  struct dev_memarea *mem;
1022
 
1023 1748 jeremybenn
  if (memaddr & 3)
1024
    {
1025
      PRINTF ("%s(): ERR unaligned 32-bit program write\n", __FUNCTION__);
1026
      return;
1027
    }
1028 1486 nogj
 
1029 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
1030
    {
1031
      mem->ops.writeprog32 (memaddr & mem->size_mask, value,
1032
                            mem->ops.writeprog32_dat);
1033
    }
1034
  else
1035
    PRINTF ("ERR: 32-bit program load out of memory area: %" PRIxADDR "\n",
1036
            memaddr);
1037 1486 nogj
}
1038
 
1039 1556 nogj
/* set_program8 - same as set_direct8, but it also writes to memory that is
1040
 *                non-writeable to the rest of the sim.  Used to do program
1041
 *                loading.
1042
 */
1043 1748 jeremybenn
void
1044
set_program8 (oraddr_t memaddr, uint8_t value)
1045 1556 nogj
{
1046
  struct dev_memarea *mem;
1047
 
1048 1748 jeremybenn
  if ((mem = verify_memoryarea (memaddr)))
1049
    {
1050
      mem->ops.writeprog8 (memaddr & mem->size_mask, value,
1051
                           mem->ops.writeprog8_dat);
1052
    }
1053
  else
1054
    PRINTF ("ERR: 8-bit program load out of memory area: %" PRIxADDR "\n",
1055
            memaddr);
1056 1556 nogj
}
1057
 
1058 1748 jeremybenn
 
1059
/*---------------------------------------------------------------------------*/
1060
/*!Dump memory to the current output
1061
 
1062
   Output format is hex bytes, 16 bytes per line. Start each line with its
1063
   address and (optionally) its symbolic name. Always end with a newline.
1064
 
1065
   There are all sorts of ways to trip this up, but they are unlikely. The
1066
   validity of a memory area is taken from the address of the start of a line
1067
   to be printed, so assumes the following 15 bytes are present. This could be
1068
   fooled by ridiculous memory declarations.
1069
 
1070
   @param[in] from    Start address of the area of memory
1071
   @param[in] to      End address of the area of memory                      */
1072
/*---------------------------------------------------------------------------*/
1073
void
1074
dump_memory (oraddr_t from, oraddr_t to)
1075 361 markom
{
1076 1748 jeremybenn
  const int ROW_LEN = 16;
1077
  oraddr_t i;                   /* Row counter */
1078 361 markom
 
1079 1748 jeremybenn
  for (i = from; i < to; i += ROW_LEN)
1080
    {
1081
      struct label_entry *entry = get_label (i);
1082
      oraddr_t j;               /* Index in row */
1083 1584 phoenix
 
1084 1748 jeremybenn
      PRINTF ("%" PRIxADDR, i);
1085 1584 phoenix
 
1086 1748 jeremybenn
      if (NULL != entry)
1087
        {
1088
          int padding = 11 - strlen (entry->name);
1089 1584 phoenix
 
1090 1748 jeremybenn
          PRINTF (" <%s>: ", entry->name);
1091
          PRINTF ("%*s ", padding < 0 ? 0 : padding, " ");
1092
        }
1093
      else
1094
        {
1095
          PRINTF (":                ");
1096
        }
1097 361 markom
 
1098 1748 jeremybenn
 
1099
      for (j = 0; j < ROW_LEN; j++)
1100
        {
1101
          if (verify_memoryarea (i + j))
1102
            {
1103
              PRINTF ("%02" PRIx8 " ", eval_direct8 (i + j, 0, 0));
1104
            }
1105
          else
1106
            {
1107
              /* Not a valid memory area. Print Xs as required */
1108
              PRINTF ("XX ");
1109
            }
1110
        }
1111
 
1112
      PRINTF ("\n");
1113 361 markom
    }
1114 1748 jeremybenn
}                               /* dump_memory() */
1115 361 markom
 
1116 1748 jeremybenn
 
1117
/*---------------------------------------------------------------------------*/
1118
/*!Disassemble memory to the current output
1119
 
1120
   Output format is symbolic disassembly, one instruction per line. Start each
1121
   line with its address and (optionally) its symbolic name.
1122
 
1123
   There are all sorts of ways to trip this up, but they are unlikely. The
1124
   validity of a memory area is taken from the address of the start of a line
1125
   to be printed, so assumes the following 3 bytes are present. This could be
1126
   fooled by ridiculous memory declarations.
1127
 
1128
   @param[in] from    Start address of the area of memory
1129
   @param[in] to      End address of the area of memory
1130
   @param[in] nl      If non-zero (true) print a newline at the end of each
1131
                      line                                                   */
1132
/*---------------------------------------------------------------------------*/
1133
void
1134
disassemble_memory (oraddr_t from, oraddr_t to, int nl)
1135
{
1136
  const int INSTR_LEN = 4;
1137
  oraddr_t i;                   /* Row counter */
1138
 
1139
  for (i = from; i < to; i += INSTR_LEN)
1140
    {
1141
      struct label_entry *entry = get_label (i);
1142
 
1143
      PRINTF ("%" PRIxADDR, i);
1144
 
1145
      if (NULL != entry)
1146
        {
1147
          int padding = 11 - strlen (entry->name);
1148
 
1149
          PRINTF (" <%s>: ", entry->name);
1150
          PRINTF ("%*s ", padding < 0 ? 0 : padding, " ");
1151
        }
1152
      else
1153
        {
1154
          PRINTF (":                ");
1155
        }
1156
 
1157
      if (verify_memoryarea (i))
1158
        {
1159
          uint32_t insn = eval_direct32 (i, 0, 0);
1160
          int index = insn_decode (insn);
1161
 
1162
          PRINTF ("%08" PRIx32 " ", insn);
1163
 
1164
          if (index >= 0)
1165
            {
1166
              disassemble_insn (insn);
1167
              PRINTF (" %s", disassembled);
1168
            }
1169
          else
1170
            {
1171
              PRINTF ("<invalid>");
1172
            }
1173
 
1174
        }
1175
      else
1176
        {
1177
          /* Not a valid memory area. Print Xs as required */
1178
          PRINTF ("XXXXXXXX");
1179
        }
1180
 
1181
      if (nl)
1182
        {
1183
          PRINTF ("\n");
1184
        }
1185
    }
1186
}                               /* disassemble_memory() */
1187
 
1188
 
1189 426 markom
/* Closes files, etc. */
1190
 
1191 1748 jeremybenn
void
1192
done_memory_table ()
1193 426 markom
{
1194
  struct dev_memarea *ptmp;
1195
 
1196
  /* Check list of registered devices. */
1197 1748 jeremybenn
  for (ptmp = dev_list; ptmp; ptmp = ptmp->next)
1198
    {
1199
      if (ptmp->log)
1200
        fclose (ptmp->log);
1201
    }
1202 426 markom
}
1203 427 markom
 
1204
/* Displays current memory configuration */
1205
 
1206 1748 jeremybenn
void
1207
memory_table_status (void)
1208 427 markom
{
1209
  struct dev_memarea *ptmp;
1210
 
1211
  /* Check list of registered devices. */
1212 1748 jeremybenn
  for (ptmp = dev_list; ptmp; ptmp = ptmp->next)
1213
    {
1214
      PRINTF ("addr & %" PRIxADDR " == %" PRIxADDR " to %" PRIxADDR ", size %"
1215
              PRIx32 "\n", ptmp->addr_mask, ptmp->addr_compare,
1216
              ptmp->addr_compare | bit_mask (ptmp->size), ptmp->size);
1217
      PRINTF ("\t");
1218
      if (ptmp->ops.delayr >= 0)
1219
        PRINTF ("read delay = %i cycles, ", ptmp->ops.delayr);
1220
      else
1221
        PRINTF ("reads not possible, ");
1222 427 markom
 
1223 1748 jeremybenn
      if (ptmp->ops.delayw >= 0)
1224
        PRINTF ("write delay = %i cycles", ptmp->ops.delayw);
1225
      else
1226
        PRINTF ("writes not possible");
1227
 
1228
      if (ptmp->log)
1229
        PRINTF (", (logged)\n");
1230
      else
1231
        PRINTF ("\n");
1232
    }
1233 427 markom
}
1234 433 markom
 
1235
/* Outputs time in pretty form to dest string */
1236
 
1237 1748 jeremybenn
char *
1238
generate_time_pretty (char *dest, long time_ps)
1239 433 markom
{
1240
  int exp3 = 0;
1241 1748 jeremybenn
  if (time_ps)
1242
    {
1243
      while ((time_ps % 1000) == 0)
1244
        {
1245
          time_ps /= 1000;
1246
          exp3++;
1247
        }
1248 433 markom
    }
1249 1308 phoenix
  sprintf (dest, "%li%cs", time_ps, "pnum"[exp3]);
1250 897 markom
  return dest;
1251 433 markom
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.